diff --git a/SPU详情接口文档2.0.md b/SPU详情接口文档2.0.md new file mode 100644 index 000000000..bd4396147 --- /dev/null +++ b/SPU详情接口文档2.0.md @@ -0,0 +1,558 @@ +# AI 生图平台素材接口文档 + +> 用途:AI 生图平台统一通过同一条接口,查询 `标准模型白底图` 或 `任务-详情整套预览下载链接` +> 当前主域名:`https://sc.jiansun.vip` +> 当前资源主域名:`https://s3.jiansun.vip` +> 备用资源域名:`https://s3.yydd.ai`(备用 / 回切用,非默认对接地址) +> 旧应用域名:`https://3d.yydd.ai`(仅保留兼容跳转) + +## 1. 基础信息 + +- 接口基地址:`https://sc.jiansun.vip/api/external/` +- 鉴权方式:请求头 `X-API-Key` +- 请求方式:`GET` +- 返回格式:`application/json` +- 主接口路径:`/api/external/standard-model-white-background` +- 默认资源类型:`white-background` + +### 1.1 当前网络口径 + +- 接口查询、鉴权和下载 token 入口统一使用 `https://sc.jiansun.vip` +- `task-detail` 分支返回的预览图直链,当前默认资源域名使用 `https://s3.jiansun.vip` +- `https://s3.yydd.ai` 当前只保留为备用资源域名;除非单独通知切换,否则调用方继续以 `https://s3.jiansun.vip` 为准 + +返回统一格式: + +```json +{ + "success": true, + "data": {} +} +``` + +失败时: + +```json +{ + "success": false, + "error": { + "code": "ERROR_CODE", + "message": "错误说明" + } +} +``` + +### 1.2 响应诊断头 + +为便于调用方排查“接口慢”到底是服务端慢还是链路慢,当前接口额外返回以下响应头: + +| 响应头 | 说明 | +|---|---| +| `X-Trace-Id` | 本次请求追踪 ID,排查时可提供给素材平台定位服务端日志 | +| `X-Server-Duration-Ms` | 服务端实际处理耗时,单位毫秒 | +| `Server-Timing` | 标准服务端耗时头,内容与上面一致 | +| `X-Resource-Type` | 本次实际走的资源分支 | +| `X-Request-Sku` | 本次实际识别后的 SKU;未传时不返回 | +| `X-Request-Spu` | 本次实际识别后的 SPU;未传时不返回 | + +## 2. 通用请求规则 + +### 2.1 请求头 + +| 参数 | 必填 | 说明 | +|---|---|---| +| `X-API-Key` | 是 | 外部接口访问密钥 | + +### 2.2 查询参数 + +| 参数 | 必填 | 说明 | +|---|---|---| +| `resourceType` | 否 | 资源类型。可选 `white-background` 或 `task-detail`。不传时默认 `white-background` | +| `sku` | 条件必填 | `sku` 和 `spu` 二选一即可 | +| `spu` | 条件必填 | `sku` 和 `spu` 二选一即可 | + +补充说明: + +- `sku`、`spu` 都按大小写不敏感查询,建议调用方统一传大写。 +- 当前服务端会先把 `sku`、`spu` 标准化为大写后再做精确匹配,建议调用方直接传大写,避免自身重复大小写转换。 +- 如果 `sku` 和 `spu` 同时传入,接口优先按 `spu` 处理。 +- `shopName` 当前与 `categoryName` 含义一致,都是“店铺”。 + +## 3. 白底图查询 + +### 3.1 适用场景 + +- `resourceType=white-background` +- 不传 `resourceType` 时也走这一分支,兼容老调用方 +- 支持两种查询方式: + - `sku`:直接拿到该 SKU 的完整白底图信息 + - `spu`:先拿到该 SPU 下全部 SKU 清单,再让用户选 SKU + +--- + +### 3.2 按 SKU 查询白底图 + +**请求** + +```http +GET /api/external/standard-model-white-background?resourceType=white-background&sku={SKU} +X-API-Key: your-api-key +``` + +兼容老调用方式: + +```http +GET /api/external/standard-model-white-background?sku={SKU} +X-API-Key: your-api-key +``` + +**成功响应示例** + +```json +{ + "success": true, + "data": { + "resourceType": "white-background", + "sku": "TEXT001452", + "materialId": "484bd047-c956-48cf-a0f4-401f696aef8d", + "productModel": "TEXT0014", + "categoryName": "旗舰店", + "shopName": "旗舰店", + "whiteBackgroundUploaded": true, + "whiteBackgroundComplete": false, + "whiteBackgroundFixedCount": 2, + "whiteBackgroundOtherCount": 1, + "whiteBackgroundCount": 3, + "missingViews": [ + { + "key": "leftBack45", + "label": "左后45°" + } + ], + "whiteBackground": { + "fixed": [ + { + "key": "leftFront45", + "label": "左前45°", + "fileName": "左前45°.png", + "fileSize": 123456, + "downloadUrl": "https://sc.jiansun.vip/api/external/download?token=xxx" + }, + { + "key": "rightFront45", + "label": "右前45°", + "fileName": "右前45°.png", + "fileSize": 123456, + "downloadUrl": "https://sc.jiansun.vip/api/external/download?token=yyy" + } + ], + "other": [ + { + "key": "other-1", + "label": "其他图片1", + "fileName": "detail-1.png", + "fileSize": 123456, + "downloadUrl": "https://sc.jiansun.vip/api/external/download?token=zzz" + } + ] + }, + "downloadUrls": { + "zip": "https://sc.jiansun.vip/api/external/download?token=zip-token" + } + } +} +``` + +**字段说明** + +| 字段 | 说明 | +|---|---| +| `resourceType` | 固定为 `white-background` | +| `sku` | 实际命中的 SKU | +| `materialId` | 标准模型素材 ID | +| `productModel` | 所属 SPU | +| `categoryName` | 店铺 | +| `shopName` | 店铺,当前与 `categoryName` 相同 | +| `whiteBackgroundUploaded` | 是否已有白底图 | +| `whiteBackgroundComplete` | 固定 8 个角度是否已补齐 | +| `whiteBackgroundFixedCount` | 已有固定角度图数量 | +| `whiteBackgroundOtherCount` | 已有 other 图数量 | +| `whiteBackgroundCount` | 白底图总数 | +| `missingViews` | 还缺少的固定角度图 | +| `whiteBackground.fixed` | 固定角度白底图列表 | +| `whiteBackground.other` | 其他白底图列表 | +| `downloadUrls.zip` | 当前 SKU 白底图 ZIP 下载链接 | + +固定角度顺序固定为: + +1. `leftFront45` +2. `rightFront45` +3. `leftBack45` +4. `rightBack45` +5. `front` +6. `back` +7. `left` +8. `right` + +单张图片对象字段: + +| 字段 | 说明 | +|---|---| +| `key` | 固定图为固定角度 key,other 图为 `other-*` | +| `label` | 图片说明 | +| `fileName` | 文件名 | +| `fileSize` | 文件大小,单位字节 | +| `downloadUrl` | 单张白底图下载链接 | + +--- + +### 3.3 按 SPU 查询白底图 SKU 清单 + +**请求** + +```http +GET /api/external/standard-model-white-background?resourceType=white-background&spu={SPU} +X-API-Key: your-api-key +``` + +**成功响应示例** + +```json +{ + "success": true, + "data": { + "resourceType": "white-background", + "spu": "TEXT0014", + "materialId": "484bd047-c956-48cf-a0f4-401f696aef8d", + "categoryName": "旗舰店", + "shopName": "旗舰店", + "skuCount": 2, + "skuList": [ + { + "skuName": "TEXT001452", + "skuId": "sku-id-1", + "hasWhiteBackground": true, + "whiteBackgroundCount": 2, + "previewImage": { + "downloadUrl": "https://sc.jiansun.vip/api/external/download?token=xxx", + "fileName": "右前45°.png", + "fileSize": 123456 + } + }, + { + "skuName": "TEXT001453", + "skuId": "sku-id-2", + "hasWhiteBackground": false, + "whiteBackgroundCount": 0, + "previewImage": null + } + ] + } +} +``` + +**字段说明** + +| 字段 | 说明 | +|---|---| +| `resourceType` | 固定为 `white-background` | +| `spu` | 实际命中的 SPU | +| `materialId` | 标准模型素材 ID | +| `categoryName` | 店铺 | +| `shopName` | 店铺,当前与 `categoryName` 相同 | +| `skuCount` | 该 SPU 下 SKU 数量 | +| `skuList[].skuName` | SKU 名称 | +| `skuList[].skuId` | SKU 记录 ID | +| `skuList[].hasWhiteBackground` | 是否已有任意白底图 | +| `skuList[].whiteBackgroundCount` | 当前固定角度白底图数量 | +| `skuList[].previewImage` | 右前 45° 预览图;如果没有该角度则为 `null` | + +说明: + +- 这个接口主要给 AI 平台先展示 SKU 列表用。 +- 选定 SKU 后,再调用“按 SKU 查询白底图”接口拿完整白底图信息。 + +## 4. 任务-详情整套查询 + +### 4.1 适用场景 + +- `resourceType=task-detail` +- 按 `任务-详情` 素材类型直接查询,不再要求先存在 `标准模型` +- 只返回: + - `materialType='任务-详情'` + - 同时拥有主图、SKU 图、详情图 + - `deletedAt=null` + 的候选素材 +- 返回的是**预览图直链数组**,不是 zip,也不是 token 下载链接 +- 返回顺序按 `uploadedAt` 倒序,也就是最新上传的排前面 +- 当前默认返回的资源直链域名是 `https://s3.jiansun.vip` +- `https://s3.yydd.ai` 保留备用说明,但不是当前默认示例地址 + +--- + +### 4.2 按 SPU 查询任务-详情整套候选 + +**请求** + +```http +GET /api/external/standard-model-white-background?resourceType=task-detail&spu={SPU} +X-API-Key: your-api-key +``` + +注意: + +- `task-detail` 响应顶层的 `categoryName` / `shopName` 是便捷字段,取本次返回候选列表中的第一条候选素材。 +- 如果 AI 平台要展示候选素材的实际店铺,请优先读取 `candidates[].categoryName` 或 `candidates[].shopName`。 +- 如果同一个 SPU 下有多条候选素材,且它们店铺不同,请以各自 `candidates[]` 内的字段为准。 + +**成功响应示例** + +```json +{ + "success": true, + "data": { + "resourceType": "task-detail", + "spu": "SPU001", + "sku": null, + "categoryName": "旗舰店", + "shopName": "旗舰店", + "candidateCount": 1, + "candidates": [ + { + "materialId": "material-2", + "taskNo": "TASK202601141713525624", + "productModel": "SPU001", + "categoryName": "旗舰店", + "shopName": "旗舰店", + "sceneName": "客厅", + "uploadedAt": "2026-03-18T10:00:00.000Z", + "isFullSet": true, + "downloadUrls": { + "main": [ + "https://s3.jiansun.vip/gongxiangpan/preview/main-1.jpg" + ], + "sku": [ + "https://s3.jiansun.vip/gongxiangpan/preview/sku-1.jpg" + ], + "detail": [ + "https://s3.jiansun.vip/gongxiangpan/preview/detail-1.jpg" + ], + "all": [ + "https://s3.jiansun.vip/gongxiangpan/preview/main-1.jpg", + "https://s3.jiansun.vip/gongxiangpan/preview/sku-1.jpg", + "https://s3.jiansun.vip/gongxiangpan/preview/detail-1.jpg" + ] + } + } + ] + } +} +``` + +--- + +### 4.3 按 SKU 查询任务-详情整套候选 + +**请求** + +```http +GET /api/external/standard-model-white-background?resourceType=task-detail&sku={SKU} +X-API-Key: your-api-key +``` + +**处理逻辑** + +- 先通过 `SKU -> 标准模型 SPU` +- 再按这个 SPU 查询所有整套 `任务-详情` 候选 +- 顶层 `categoryName` / `shopName` 是便捷字段,取本次返回候选列表中的第一条候选素材 +- 如果 AI 平台要展示候选素材的实际店铺,请优先读取 `candidates[].categoryName` 或 `candidates[].shopName` + +**成功响应示例** + +```json +{ + "success": true, + "data": { + "resourceType": "task-detail", + "spu": "SPU001", + "sku": "SKU001", + "categoryName": "旗舰店", + "shopName": "旗舰店", + "candidateCount": 1, + "candidates": [ + { + "materialId": "material-2", + "taskNo": "TASK202601141713525624", + "productModel": "SPU001", + "categoryName": "旗舰店", + "shopName": "旗舰店", + "sceneName": "客厅", + "uploadedAt": "2026-03-18T10:00:00.000Z", + "isFullSet": true, + "downloadUrls": { + "main": [ + "https://s3.jiansun.vip/gongxiangpan/preview/main-1.jpg" + ], + "sku": [ + "https://s3.jiansun.vip/gongxiangpan/preview/sku-1.jpg" + ], + "detail": [ + "https://s3.jiansun.vip/gongxiangpan/preview/detail-1.jpg" + ], + "all": [ + "https://s3.jiansun.vip/gongxiangpan/preview/main-1.jpg", + "https://s3.jiansun.vip/gongxiangpan/preview/sku-1.jpg", + "https://s3.jiansun.vip/gongxiangpan/preview/detail-1.jpg" + ] + } + } + ] + } +} +``` + +**候选素材字段说明** + +| 字段 | 说明 | +|---|---| +| `materialId` | 任务-详情素材 ID | +| `taskNo` | 任务号 | +| `productModel` | 对应 SPU | +| `categoryName` | 店铺 | +| `shopName` | 店铺,当前与 `categoryName` 相同 | +| `sceneName` | 场景 | +| `uploadedAt` | 上传时间,ISO 8601 格式 | +| `isFullSet` | 是否整套;当前规则为“同时拥有主图、SKU 图、详情图” | +| `downloadUrls.main` | 主图预览直链数组 | +| `downloadUrls.sku` | SKU 图预览直链数组 | +| `downloadUrls.detail` | 详情图预览直链数组 | +| `downloadUrls.all` | `main + sku + detail` 合并后的数组 | + +说明: + +- `task-detail` 分支返回的是**全部候选**,不是只返回一条。 +- 预览链接可以直接打开或下载。 +- 历史 `任务-详情` 会按同一套资产规则判断,不再依赖人工勾选。 +- 顶层 `categoryName` / `shopName` 是便捷字段;如果要给用户展示候选素材的真实店铺,请优先使用 `candidates[].shopName`。 + +## 5. 下载说明 + +### 5.1 白底图 + +白底图返回的是下载链接: + +- 单张图:`whiteBackground.fixed[*].downloadUrl` / `whiteBackground.other[*].downloadUrl` +- 整包 ZIP:`downloadUrls.zip` + +调用方式: + +```http +GET https://sc.jiansun.vip/api/external/download?token=xxx +``` + +### 5.2 任务-详情整套 + +任务-详情返回的是可直接访问的预览图直链数组: + +- `downloadUrls.main` +- `downloadUrls.sku` +- `downloadUrls.detail` +- `downloadUrls.all` + +这一分支**不返回 zip**,也**不需要再调下载 token 接口**。 + +补充说明: + +- 当前默认回包中的预览图资源域名为 `https://s3.jiansun.vip` +- `https://s3.yydd.ai` 仅保留为备用资源域名说明,不作为当前默认对接地址 + +## 6. 错误码 + +### 6.1 通用错误 + +| HTTP 状态码 | 错误码 | 说明 | +|---|---|---| +| 401 | `INVALID_API_KEY` | API Key 无效或缺失 | +| 400 | `MISSING_PARAM` | 没有传 `sku` 或 `spu` | +| 400 | `RESOURCE_TYPE_INVALID` | `resourceType` 不是 `white-background` 或 `task-detail` | +| 500 | `SERVER_ERROR` | 服务器内部错误 | + +### 6.2 白底图分支错误 + +| HTTP 状态码 | 错误码 | 说明 | +|---|---|---| +| 404 | `SKU_NOT_FOUND` | 未找到对应的标准模型 SKU | +| 409 | `SKU_NOT_UNIQUE` | SKU 重复,暂无法对外提供白底图 | +| 404 | `SPU_NOT_FOUND` | 未找到对应的标准模型 SPU | +| 404 | `NO_SKUS` | 该 SPU 下没有 SKU 数据 | +| 404 | `WHITE_BACKGROUND_NOT_FOUND` | 该 SKU 暂无白底图 | + +### 6.3 任务-详情分支错误 + +| HTTP 状态码 | 错误码 | 说明 | +|---|---|---| +| 404 | `SKU_NOT_FOUND` | 未找到对应的标准模型 SKU | +| 409 | `SKU_NOT_UNIQUE` | SKU 重复,暂无法对外提供任务-详情整套素材 | +| 404 | `TASK_DETAIL_NOT_FOUND` | 该 SPU 下,或该 SKU 所属 SPU 下暂无任务-详情素材 | +| 404 | `FULL_SET_NOT_FOUND` | 有任务-详情素材,但没有任何一条同时拥有主图、SKU 图、详情图 | + +## 7. cURL 示例 + +### 7.1 按 SKU 查询白底图 + +```bash +curl -X GET \ + "https://sc.jiansun.vip/api/external/standard-model-white-background?sku=TEXT001452" \ + -H "X-API-Key: your-api-key" +``` + +### 7.2 按 SPU 查询白底图 SKU 清单 + +```bash +curl -X GET \ + "https://sc.jiansun.vip/api/external/standard-model-white-background?resourceType=white-background&spu=TEXT0014" \ + -H "X-API-Key: your-api-key" +``` + +### 7.3 按 SPU 查询任务-详情整套候选 + +```bash +curl -X GET \ + "https://sc.jiansun.vip/api/external/standard-model-white-background?resourceType=task-detail&spu=SPU001" \ + -H "X-API-Key: your-api-key" +``` + +### 7.4 按 SKU 查询任务-详情整套候选 + +```bash +curl -X GET \ + "https://sc.jiansun.vip/api/external/standard-model-white-background?resourceType=task-detail&sku=SKU001" \ + -H "X-API-Key: your-api-key" +``` + +## 8. 接入建议 + +- 老的白底图调用方可以不改,继续传 `sku` 即可。 +- 如果是 AI 生图平台新流程,建议: + - 白底图:`spu -> sku -> 白底图详情` + - 任务-详情:直接按 `spu` 或 `sku` 查整套候选 +- `task-detail` 返回多个候选时,建议调用方按 `uploadedAt` 再做一次前端展示排序或筛选。 +- `task-detail` 使用的是预览图直链,不适合再按源文件 zip 的思路处理。 + +## 9. 当前联调状态 + +截至 `2026-03-21`,正式环境已部署并验证通过的内容: + +- `/api/external/standard-model-white-background` 已支持 `white-background` 和 `task-detail` +- 不传 `resourceType` 时,白底图老调用方式保持兼容 +- `task-detail` 已支持 `spu` / `sku` 两种查询 +- 返回中已补充 `shopName` +- `任务-详情` 整套字段 `isFullSet` 已改为按主图 / SKU 图 / 详情图自动判定 +- 对外文档默认资源域名已统一到 `https://s3.jiansun.vip`,同时保留 `https://s3.yydd.ai` 作为备用说明 +- 相关测试已通过:`standard-model-white-background-route`、`task-detail-full-set`、`url-rewrite` +- 构建验证已通过:`npm run build` +- 正式环境健康检查已通过:`/api/health` +- 正式环境真实调用已验证: + - `resourceType=task-detail&spu=CTG0290` 返回 `200` + - `resourceType=task-detail&sku=DNZ025802` 返回 `200` + - 白底图 `spu=CTG0149` 返回 `200` diff --git a/agent能力提升参考源码/.gitignore b/agent能力提升参考源码/.gitignore new file mode 100644 index 000000000..de821bb51 --- /dev/null +++ b/agent能力提升参考源码/.gitignore @@ -0,0 +1,2 @@ +__pycache__/ +archive/ diff --git a/agent能力提升参考源码/2026-03-09-is-legal-the-same-as-legitimate-ai-reimplementation-and-the-erosion-of-copyleft.md b/agent能力提升参考源码/2026-03-09-is-legal-the-same-as-legitimate-ai-reimplementation-and-the-erosion-of-copyleft.md new file mode 100644 index 000000000..9cdcbaa34 --- /dev/null +++ b/agent能力提升参考源码/2026-03-09-is-legal-the-same-as-legitimate-ai-reimplementation-and-the-erosion-of-copyleft.md @@ -0,0 +1,88 @@ +# Is legal the same as legitimate: AI reimplementation and the erosion of copyleft + +- **Date:** March 9, 2026 +- **Author:** Hong Minhee +- **Source context:** _Hong Minhee on Things_ (English / 日本語 / 朝鮮語 (國漢文) / 한국어 (한글)) +- **Archive note:** This copy was normalized from user-provided text for this repository's research/archive context. Site navigation/footer language links were converted into metadata. + +Last week, Dan Blanchard, the maintainer of chardet—a Python library for detecting text encodings used by roughly 130 million projects a month—released a new version. Version 7.0 is 48 times faster than its predecessor, supports multiple cores, and was redesigned from the ground up. Anthropic's Claude is listed as a contributor. The license changed from LGPL to MIT. + +Blanchard's account is that he never looked at the existing source code directly. He fed only the API and the test suite to Claude and asked it to reimplement the library from scratch. The resulting code shares less than 1.3% similarity with any prior version, as measured by JPlag. His conclusion: this is an independent new work, and he is under no obligation to carry forward the LGPL. Mark Pilgrim, the library's original author, opened a GitHub issue to object. The LGPL requires that modifications be distributed under the same license, and a reimplementation produced with ample exposure to the original codebase cannot, in Pilgrim's view, pass as a clean-room effort. + +The dispute drew responses from two prominent figures in the open source world. Armin Ronacher, the creator of Flask, welcomed the relicensing. Salvatore Sanfilippo (antirez), the creator of Redis, published a broader defense of AI reimplementation, grounding it in copyright law and the history of the GNU project. Both conclude, by different routes, that what Blanchard did is legitimate. I respect both writers, and I think both are wrong—or more precisely, both are evading the question that actually matters. + +That question is this: does legal mean legitimate? Neither piece answers it. Both move from “this is legally permissible” to “this is therefore fine,” without pausing at the gap between those two claims. Law sets a floor; clearing it does not mean the conduct is right. That gap is where this essay begins. + +## The analogy points the wrong way + +Antirez builds his case on history. When the GNU project reimplemented the UNIX userspace, it was lawful. So was Linux. Copyright law prohibits copying “protected expressions”—the actual code, its structure, its specific mechanisms—but it does not protect ideas or behavior. AI-assisted reimplementation occupies the same legal ground. Therefore, it is lawful. + +The legal analysis is largely correct, and I am not disputing it. The problem lies in what antirez does next: he presents the legal conclusion as if it were also a social one, and uses a historical analogy that, examined more carefully, argues against his own position. + +When GNU reimplemented the UNIX userspace, the vector ran from proprietary to free. Stallman was using the limits of copyright law to turn proprietary software into free software. The ethical force of that project did not come from its legal permissibility—it came from the direction it was moving, from the fact that it was expanding the commons. That is why people cheered. + +The vector in the chardet case runs the other way. Software protected by a copyleft license—one that guarantees users the right to study, modify, and redistribute derivative works under the same terms—has been reimplemented under a permissive license that carries no such guarantee. This is not a reimplementation that expands the commons. It is one that removes the fencing that protected the commons. Derivative works built on chardet 7.0 are under no obligation to share their source code. That obligation, which applied to a library downloaded 130 million times a month, is now gone. + +Antirez does not address this directional difference. He invokes the GNU precedent, but that precedent is a counterexample to his conclusion, not a supporting one. + +## Does the GPL work against sharing? + +Ronacher's argument is different. He discloses upfront that he has a stake in the outcome: “I personally have a horse in the race here because I too wanted chardet to be under a non-GPL license for many years. So consider me a very biased person in that regard.” He goes on to write that he considers “the GPL to run against that spirit by restricting what can be done with it”—the spirit being that society is better off when we share. + +This claim rests on a fundamental misreading of what the GPL does. + +Start with what the GPL actually prohibits. It does not prohibit keeping source code private. It imposes no constraint on privately modifying GPL software and using it yourself. The GPL's conditions are triggered only by distribution. If you distribute modified code, or offer it as a networked service, you must make the source available under the same terms. This is not a restriction on sharing. It is a condition placed on sharing: if you share, you must share in kind. + +The requirement that improvements be returned to the commons is not a mechanism that suppresses sharing. It is a mechanism that makes sharing recursive and self-reinforcing. The claim that imposing contribution obligations on users of a commons undermines sharing culture does not hold together logically. + +The contrast with the MIT license clarifies the point. Under MIT, anyone may take code, improve it, and close it off into a proprietary product. You can receive from the commons without giving back. If Ronacher calls this structure “more share-friendly,” he is using a concept of sharing with a specific directionality built in: sharing flows toward whoever has more capital and more engineers to take advantage of it. + +The historical record bears this out. In the 1990s, companies routinely absorbed GPL code into proprietary products—not because they had chosen permissive licenses, but because copyleft enforcement was slack. The strengthening of copyleft mechanisms closed that gap. For individual developers and small projects without the resources to compete on anything but reciprocity, copyleft was what made the exchange approximately fair. + +The creator of Flask knows this distinction. If he elides it anyway, the argument is not naïve—it is convenient. + +## A self-refuting example + +The most interesting moment in Ronacher's piece is not the argument but a detail he mentions in passing: Vercel reimplemented GNU Bash using AI and published it, then got visibly upset when Cloudflare reimplemented Next.js the same way. + +Ronacher notes this as an irony and moves on. But the irony cuts deeper than he lets on. Next.js is MIT licensed. Cloudflare's vinext did not violate any license—it did exactly what Ronacher calls a contribution to the culture of openness, applied to a permissively licensed codebase. Vercel's reaction had nothing to do with license infringement; it was purely competitive and territorial. The implicit position is: reimplementing GPL software as MIT is a victory for sharing, but having our own MIT software reimplemented by a competitor is cause for outrage. This is what the claim that permissive licensing is “more share-friendly” than copyleft looks like in practice. The spirit of sharing, it turns out, runs in one direction only: outward from oneself. + +Ronacher registers the contradiction and does not stop. “This development plays into my worldview,” he writes. When you present evidence that cuts against your own position, acknowledge it, and then proceed to your original conclusion unchanged, that is a signal that the conclusion preceded the argument. + +## Legality and social legitimacy are different registers + +Back to the question posed at the start. Is legal the same as legitimate? + +Antirez closes his careful legal analysis as though it settles the matter. Ronacher acknowledges that “there is an obvious moral question here, but that isn't necessarily what I'm interested in.” Both pieces treat legal permissibility as a proxy for social legitimacy. But law only says what conduct it will not prevent—it does not certify that conduct as right. Aggressive tax minimization that never crosses into illegality may still be widely regarded as antisocial. A pharmaceutical company that legally acquires a patent on a long-generic drug and raises the price a hundredfold has done something legal, but that does not make it fine. Legality is a necessary condition; it is not a sufficient one. + +In the chardet case, the distinction is sharper still. What the LGPL protected was not Blanchard's labor alone. It was a social compact agreed to by everyone who contributed to the library over twelve years. The terms of that compact were: if you take this and build on it, you share back under the same terms. This compact operated as a legal instrument, yes, but it was also the foundation of trust that made contribution rational. The fact that a reimplementation may qualify legally as a new work, and the fact that it breaks faith with the original contributors, are separate questions. If a court eventually rules in Blanchard's favor, that ruling will tell us what the law permits. It will not tell us that the act was right. + +Zoë Kooyman, executive director of the FSF, put it plainly: “Refusing to grant others the rights you yourself received as a user is highly antisocial, no matter what method you use.” + +## Whose perspective is the default? + +Reading this debate, I keep returning to a question about position. From where are these two writers looking at the situation? + +Antirez created Redis. Ronacher created Flask. Both are figures at the center of the open source ecosystem, with large audiences and well-established reputations. For them, falling costs of AI reimplementation means something specific: it is easier to reimplement things they want in a different form. Ronacher says explicitly that he had begun reimplementing GNU Readline precisely because of its copyleft terms. + +For the people who have spent years contributing to a library like chardet, the same shift in costs means something else entirely: the copyleft protection around their contributions can be removed. The two writers are speaking from the former position to people in the latter, telling them that this was always lawful, that historical precedent supports it, and that the appropriate response is adaptation. + +When positional asymmetry of this kind is ignored, and the argument is presented as universal analysis, what you get is not analysis but rationalization. Both writers arrive at conclusions that align precisely with their own interests. Readers should hold that fact in mind. + +## What this fight points toward + +Bruce Perens, who wrote the original Open Source Definition, told The Register: “The entire economics of software development are dead, gone, over, kaput!” He meant it as an alarm. Antirez, from a similar assessment of the situation, draws the conclusion: adapt. Ronacher says he finds the direction exciting. + +None of the three responses addresses the central question. When copyleft becomes technically easier to circumvent, does that make it less necessary, or more? + +I think more. What the GPL protected was not the scarcity of code but the freedom of users. The fact that producing code has become cheaper does not make it acceptable to use that code as a vehicle for eroding freedom. If anything, as the friction of reimplementation disappears, so does the friction of stripping copyleft from anything left exposed. The erosion of enforcement capacity is a legal problem. It does not touch the underlying normative judgment. + +That judgment is this: those who take from the commons owe something back to the commons. The principle does not change depending on whether a reimplementation takes five years or five days. No court ruling on AI-generated code will alter its social weight. + +This is where law and community norms diverge. Law is made slowly, after the fact, reflecting existing power arrangements. The norms that open source communities built over decades did not wait for court approval. People chose the GPL when the law offered them no guarantee of its enforcement, because it expressed the values of the communities they wanted to belong to. Those values do not expire when the law changes. + +In previous writing, I argued for a training copyleft (TGPL) as the next step in this line of development. The chardet situation suggests the argument has to go further: to a specification copyleft covering the layer below source code. If source code can now be generated from a specification, the specification is where the essential intellectual content of a GPL project resides. Blanchard's own claim—that he worked only from the test suite and API without reading the source—is, paradoxically, an argument for protecting that test suite and API specification under copyleft terms. + +The history of the GPL is the history of licensing tools evolving in response to new forms of exploitation: GPLv2 to GPLv3, then AGPL. What drove each evolution was not a court ruling but a community reaching a value judgment first and then seeking legal instruments to express it. The same sequence is available now. Whatever courts eventually decide about AI reimplementation, the question we need to answer first is not a legal one. It is a social one. Do those who take from the commons owe something back? I think they do. That judgment does not require a verdict. + +What makes the pieces by antirez and Ronacher worth reading is not that they are right. It is that they make visible, with unusual clarity, what they are choosing not to see. When legality is used as a substitute for a value judgment, the question that actually matters gets buried in the footnotes of a law it has already outgrown. diff --git a/agent能力提升参考源码/README.md b/agent能力提升参考源码/README.md new file mode 100644 index 000000000..40200f96d --- /dev/null +++ b/agent能力提升参考源码/README.md @@ -0,0 +1,106 @@ +# Claude Code Python Porting Workspace + +> The primary `src/` tree in this repository is now dedicated to **Python porting work**. The March 31, 2026 Claude Code source exposure is part of the project's background, but the tracked repository is now centered on Python source rather than the exposed TypeScript snapshot. + +--- + +## Porting Status + +The main source tree is now Python-first. + +- `src/` contains the active Python porting workspace +- `tests/` verifies the current Python workspace +- the exposed snapshot is no longer part of the tracked repository state + +The current Python workspace is not yet a complete one-to-one replacement for the original system, but the primary implementation surface is now Python. + +## Why this rewrite exists + +I originally studied the exposed codebase to understand its harness, tool wiring, and agent workflow. After spending more time with the legal and ethical questions—and after reading the essay linked below—I did not want the exposed snapshot itself to remain the main tracked source tree. + +This repository now focuses on Python porting work instead. + +## Repository Layout + +```text +. +├── src/ # Python porting workspace +│ ├── __init__.py +│ ├── commands.py +│ ├── main.py +│ ├── models.py +│ ├── port_manifest.py +│ ├── query_engine.py +│ ├── task.py +│ └── tools.py +├── tests/ # Python verification +├── assets/omx/ # OmX workflow screenshots +├── 2026-03-09-is-legal-the-same-as-legitimate-ai-reimplementation-and-the-erosion-of-copyleft.md +└── README.md +``` + +## Python Workspace Overview + +The new Python `src/` tree currently provides: + +- **`port_manifest.py`** — summarizes the current Python workspace structure +- **`models.py`** — dataclasses for subsystems, modules, and backlog state +- **`commands.py`** — Python-side command port metadata +- **`tools.py`** — Python-side tool port metadata +- **`query_engine.py`** — renders a Python porting summary from the active workspace +- **`main.py`** — a CLI entrypoint for manifest and summary output + +## Quickstart + +Render the Python porting summary: + +```bash +python3 -m src.main summary +``` + +Print the current Python workspace manifest: + +```bash +python3 -m src.main manifest +``` + +List the current Python modules: + +```bash +python3 -m src.main subsystems --limit 16 +``` + +Run verification: + +```bash +python3 -m unittest discover -s tests -v +``` + +## Related Essay + +- [*Is legal the same as legitimate: AI reimplementation and the erosion of copyleft*](https://writings.hongminhee.org/2026/03/legal-vs-legitimate/) + +The essay is dated **March 9, 2026**, so it should be read as companion analysis that predates the **March 31, 2026** source exposure that motivated this rewrite direction. + +## Built with `oh-my-codex` + +The restructuring and documentation work on this repository was AI-assisted and orchestrated with Yeachan Heo's [oh-my-codex (OmX)](https://github.com/Yeachan-Heo/oh-my-codex), layered on top of Codex. + +- **`$team` mode:** used for coordinated parallel review and architectural feedback +- **`$ralph` mode:** used for persistent execution, verification, and completion discipline +- **Codex-driven workflow:** used to turn the main `src/` tree into a Python-first porting workspace + +### OmX workflow screenshots + +![OmX workflow screenshot 1](assets/omx/omx-readme-review-1.png) + +*Ralph/team orchestration view while the README and essay context were being reviewed in terminal panes.* + +![OmX workflow screenshot 2](assets/omx/omx-readme-review-2.png) + +*Split-pane review and verification flow during the final README wording pass.* + +## Ownership / Affiliation Disclaimer + +- This repository does **not** claim ownership of the original Claude Code source material. +- This repository is **not affiliated with, endorsed by, or maintained by Anthropic**. diff --git a/agent能力提升参考源码/assets/omx/omx-readme-review-1.png b/agent能力提升参考源码/assets/omx/omx-readme-review-1.png new file mode 100644 index 000000000..7e0e3cddd Binary files /dev/null and b/agent能力提升参考源码/assets/omx/omx-readme-review-1.png differ diff --git a/agent能力提升参考源码/assets/omx/omx-readme-review-2.png b/agent能力提升参考源码/assets/omx/omx-readme-review-2.png new file mode 100644 index 000000000..6207f258b Binary files /dev/null and b/agent能力提升参考源码/assets/omx/omx-readme-review-2.png differ diff --git a/agent能力提升参考源码/src/__init__.py b/agent能力提升参考源码/src/__init__.py new file mode 100644 index 000000000..57decb1ae --- /dev/null +++ b/agent能力提升参考源码/src/__init__.py @@ -0,0 +1,16 @@ +"""Python porting workspace for the Claude Code rewrite effort.""" + +from .commands import PORTED_COMMANDS, build_command_backlog +from .port_manifest import PortManifest, build_port_manifest +from .query_engine import QueryEnginePort +from .tools import PORTED_TOOLS, build_tool_backlog + +__all__ = [ + 'PortManifest', + 'QueryEnginePort', + 'PORTED_COMMANDS', + 'PORTED_TOOLS', + 'build_command_backlog', + 'build_port_manifest', + 'build_tool_backlog', +] diff --git a/agent能力提升参考源码/src/commands.py b/agent能力提升参考源码/src/commands.py new file mode 100644 index 000000000..d95ea87e4 --- /dev/null +++ b/agent能力提升参考源码/src/commands.py @@ -0,0 +1,13 @@ +from __future__ import annotations + +from .models import PortingBacklog, PortingModule + +PORTED_COMMANDS = ( + PortingModule('main', 'Expose a Python CLI for manifest and backlog reporting', 'src/main.py', 'implemented'), + PortingModule('summary', 'Render a Markdown overview of the current porting workspace', 'src/query_engine.py', 'implemented'), + PortingModule('subsystems', 'List the current Python modules participating in the rewrite', 'src/port_manifest.py', 'implemented'), +) + + +def build_command_backlog() -> PortingBacklog: + return PortingBacklog(title='Command surface', modules=list(PORTED_COMMANDS)) diff --git a/agent能力提升参考源码/src/main.py b/agent能力提升参考源码/src/main.py new file mode 100644 index 000000000..5f711e6cb --- /dev/null +++ b/agent能力提升参考源码/src/main.py @@ -0,0 +1,38 @@ +from __future__ import annotations + +import argparse + +from .port_manifest import build_port_manifest +from .query_engine import QueryEnginePort + + +def build_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser(description='Python porting workspace for the Claude Code rewrite effort') + subparsers = parser.add_subparsers(dest='command', required=True) + subparsers.add_parser('summary', help='render a Markdown summary of the Python porting workspace') + subparsers.add_parser('manifest', help='print the current Python workspace manifest') + list_parser = subparsers.add_parser('subsystems', help='list the current Python modules in the workspace') + list_parser.add_argument('--limit', type=int, default=16) + return parser + + +def main(argv: list[str] | None = None) -> int: + parser = build_parser() + args = parser.parse_args(argv) + manifest = build_port_manifest() + if args.command == 'summary': + print(QueryEnginePort(manifest).render_summary()) + return 0 + if args.command == 'manifest': + print(manifest.to_markdown()) + return 0 + if args.command == 'subsystems': + for subsystem in manifest.top_level_modules[: args.limit]: + print(f'{subsystem.name} {subsystem.file_count} {subsystem.notes}') + return 0 + parser.error(f'unknown command: {args.command}') + return 2 + + +if __name__ == '__main__': + raise SystemExit(main()) diff --git a/agent能力提升参考源码/src/models.py b/agent能力提升参考源码/src/models.py new file mode 100644 index 000000000..5e4da72f3 --- /dev/null +++ b/agent能力提升参考源码/src/models.py @@ -0,0 +1,31 @@ +from __future__ import annotations + +from dataclasses import dataclass, field + + +@dataclass(frozen=True) +class Subsystem: + name: str + path: str + file_count: int + notes: str + + +@dataclass(frozen=True) +class PortingModule: + name: str + responsibility: str + source_hint: str + status: str = 'planned' + + +@dataclass +class PortingBacklog: + title: str + modules: list[PortingModule] = field(default_factory=list) + + def summary_lines(self) -> list[str]: + return [ + f'- {module.name} [{module.status}] — {module.responsibility} (from {module.source_hint})' + for module in self.modules + ] diff --git a/agent能力提升参考源码/src/port_manifest.py b/agent能力提升参考源码/src/port_manifest.py new file mode 100644 index 000000000..8c567e91c --- /dev/null +++ b/agent能力提升参考源码/src/port_manifest.py @@ -0,0 +1,52 @@ +from __future__ import annotations + +from collections import Counter +from dataclasses import dataclass +from pathlib import Path + +from .models import Subsystem + +DEFAULT_SRC_ROOT = Path(__file__).resolve().parent + + +@dataclass(frozen=True) +class PortManifest: + src_root: Path + total_python_files: int + top_level_modules: tuple[Subsystem, ...] + + def to_markdown(self) -> str: + lines = [ + f'Port root: `{self.src_root}`', + f'Total Python files: **{self.total_python_files}**', + '', + 'Top-level Python modules:', + ] + for module in self.top_level_modules: + lines.append(f'- `{module.name}` ({module.file_count} files) — {module.notes}') + return '\n'.join(lines) + + +def build_port_manifest(src_root: Path | None = None) -> PortManifest: + root = src_root or DEFAULT_SRC_ROOT + files = [path for path in root.rglob('*.py') if path.is_file()] + counter = Counter( + path.relative_to(root).parts[0] if len(path.relative_to(root).parts) > 1 else path.name + for path in files + if path.name != '__pycache__' + ) + notes = { + '__init__.py': 'package export surface', + 'main.py': 'CLI entrypoint', + 'port_manifest.py': 'workspace manifest generation', + 'query_engine.py': 'port orchestration summary layer', + 'commands.py': 'command backlog metadata', + 'tools.py': 'tool backlog metadata', + 'models.py': 'shared dataclasses', + 'task.py': 'task-level planning structures', + } + modules = tuple( + Subsystem(name=name, path=f'src/{name}', file_count=count, notes=notes.get(name, 'Python port support module')) + for name, count in counter.most_common() + ) + return PortManifest(src_root=root, total_python_files=len(files), top_level_modules=modules) diff --git a/agent能力提升参考源码/src/query_engine.py b/agent能力提升参考源码/src/query_engine.py new file mode 100644 index 000000000..2cddfb5c8 --- /dev/null +++ b/agent能力提升参考源码/src/query_engine.py @@ -0,0 +1,32 @@ +from __future__ import annotations + +from dataclasses import dataclass + +from .commands import build_command_backlog +from .port_manifest import PortManifest, build_port_manifest +from .tools import build_tool_backlog + + +@dataclass +class QueryEnginePort: + manifest: PortManifest + + @classmethod + def from_workspace(cls) -> 'QueryEnginePort': + return cls(manifest=build_port_manifest()) + + def render_summary(self) -> str: + command_backlog = build_command_backlog() + tool_backlog = build_tool_backlog() + sections = [ + '# Python Porting Workspace Summary', + '', + self.manifest.to_markdown(), + '', + f'{command_backlog.title}:', + *command_backlog.summary_lines(), + '', + f'{tool_backlog.title}:', + *tool_backlog.summary_lines(), + ] + return '\n'.join(sections) diff --git a/agent能力提升参考源码/src/task.py b/agent能力提升参考源码/src/task.py new file mode 100644 index 000000000..d08799779 --- /dev/null +++ b/agent能力提升参考源码/src/task.py @@ -0,0 +1,10 @@ +from __future__ import annotations + +from dataclasses import dataclass + + +@dataclass(frozen=True) +class PortingTask: + title: str + detail: str + completed: bool = False diff --git a/agent能力提升参考源码/src/tools.py b/agent能力提升参考源码/src/tools.py new file mode 100644 index 000000000..994a5856d --- /dev/null +++ b/agent能力提升参考源码/src/tools.py @@ -0,0 +1,13 @@ +from __future__ import annotations + +from .models import PortingBacklog, PortingModule + +PORTED_TOOLS = ( + PortingModule('port_manifest', 'Inspect the active Python source tree and summarize the current rewrite surface', 'src/port_manifest.py', 'implemented'), + PortingModule('backlog_models', 'Represent subsystem and backlog metadata as Python dataclasses', 'src/models.py', 'implemented'), + PortingModule('query_engine', 'Coordinate Python-facing rewrite summaries and reporting', 'src/query_engine.py', 'implemented'), +) + + +def build_tool_backlog() -> PortingBacklog: + return PortingBacklog(title='Tool surface', modules=list(PORTED_TOOLS)) diff --git a/agent能力提升参考源码/tests/test_porting_workspace.py b/agent能力提升参考源码/tests/test_porting_workspace.py new file mode 100644 index 000000000..9af90534f --- /dev/null +++ b/agent能力提升参考源码/tests/test_porting_workspace.py @@ -0,0 +1,34 @@ +from __future__ import annotations + +import subprocess +import sys +import unittest + +from src.port_manifest import build_port_manifest +from src.query_engine import QueryEnginePort + + +class PortingWorkspaceTests(unittest.TestCase): + def test_manifest_counts_python_files(self) -> None: + manifest = build_port_manifest() + self.assertGreaterEqual(manifest.total_python_files, 7) + self.assertTrue(manifest.top_level_modules) + + def test_query_engine_summary_mentions_workspace(self) -> None: + summary = QueryEnginePort.from_workspace().render_summary() + self.assertIn('Python Porting Workspace Summary', summary) + self.assertIn('Command surface', summary) + self.assertIn('Tool surface', summary) + + def test_cli_summary_runs(self) -> None: + result = subprocess.run( + [sys.executable, '-m', 'src.main', 'summary'], + check=True, + capture_output=True, + text=True, + ) + self.assertIn('Python Porting Workspace Summary', result.stdout) + + +if __name__ == '__main__': + unittest.main() diff --git a/analysis/qiaodou-extract/README.md b/analysis/qiaodou-extract/README.md new file mode 100644 index 000000000..049ce66c4 --- /dev/null +++ b/analysis/qiaodou-extract/README.md @@ -0,0 +1,181 @@ +# 桥豆麻衣酱 App 近似源码提取说明 + +## 结论 + +已从安装包 `/Applications/桥豆麻衣酱.app` 的可执行文件中成功提取出前端静态资源。 + +这不是开发者原始仓库源码,而是: + +- Tauri 桌面壳里的前端打包产物 +- 可直接检索的 JS/CSS/worker/wasm 资源 +- 足够用于做接口、权限、业务逻辑、模型支持范围的审计 + +当前共提取出 `29` 个资源,清单见: + +- `manifest.json` + +## 目录 + +- `app.arm64` + - 从通用 Mach-O 中切出来的 arm64 可执行文件 +- `extract_tauri_assets.js` + - 本次用于提取内嵌资源的脚本 +- `manifest.json` + - 每个资源的偏移、压缩大小、解压大小、输出路径 +- `extracted/assets/` + - 解压出的前端资源 + +## 最重要的文件 + +- `extracted/assets/index-m-NWkaV-.js` + - 主前端 bundle,约 `4.0 MB` + - React + Vite 风格打包产物 + - 绝大多数业务逻辑都在这里 +- `extracted/assets/index-CgHmA0qR.css` + - 主样式文件,约 `182 KB` +- `extracted/assets/thumbnailWorker-Iu1AjlwR.js` + - 缩略图 worker,负责图片缩放和 JPEG 缩略图生成 +- `extracted/assets/ort.bundle.min-OfoG_cy9.mjs` + - ONNX Runtime Web bundle +- `extracted/assets/ort.webgpu.bundle.min-CEayb2S6.mjs` + - ONNX Runtime WebGPU bundle +- `extracted/assets/ort-wasm-simd-threaded.jsep-D5Jk56-t.wasm` + - ONNX Runtime wasm 二进制,约 `23.9 MB` + +## 从 bundle 中确认到的内容 + +### 1. 这确实是 Tauri 桌面应用 + +在主 bundle 中能直接看到 Tauri 调用痕迹和桌面特有命令,比如: + +- `download_file_bypass_cors` +- `proxy_fetch` +- `start_local_server` + +可在主文件里直接搜这些关键字。 + +### 2. 它不是纯聊天壳,而是带图像/视频工作流能力 + +主 bundle 中能搜到很多工作流节点和媒体能力相关关键词,例如: + +- `gen-image` +- `gen-video` +- `storyboard-node` +- `inpaint-crop` +- `motion-control` +- `custom-agent` +- `local-save` + +这说明它有比较完整的图像、视频、分镜、局部重绘、本地保存等功能。 + +### 3. 默认端点和多供应商能力都在前端 bundle 里 + +主 bundle 中可见默认端点配置: + +- `https://ai.comfly.chat` +- `https://ai.t8star.cn` +- `https://api.midjourney.com` + +还可以看到对多个供应商和模型系的支持痕迹,例如: + +- `openai` +- `gemini` +- `deepseek` +- `doubao` +- `jimeng` +- `kling` +- `vidu` +- `zhipu` +- `moonshot` +- `qwen` +- `minimax` +- `midjourney` +- `suno` + +### 4. 图片审核地址的默认值写在前端状态初始化里 + +主 bundle 内能直接看到默认审核地址: + +- `http://118.196.112.236:3428/api/moderation/image` + +同时它还读取这几个本地存储键: + +- `qiaodoumayi_seedance_moderation_url` +- `qiaodoumayi_seedance_moderation_user_id` +- `qiaodoumayi_seedance_moderation_key_hex` + +这说明图片审核地址并不是仅服务端下发,也可能由本地配置覆盖。 + +### 5. 本地保存能力通过本地服务和文件落地配合实现 + +主 bundle 中可见: + +- `start_local_server` +- `qiaodoumayi_download_directory` + +这说明它支持启动本地接收器/本地服务,再结合用户设置的下载目录做文件保存。 + +## 建议优先看的位置 + +### 主 bundle + +文件: + +- `extracted/assets/index-m-NWkaV-.js` + +建议优先搜索这些词: + +- `qiaodoumayi_` +- `seedance` +- `moderation` +- `download_file_bypass_cors` +- `proxy_fetch` +- `start_local_server` +- `runninghub` +- `api.openai.com` +- `generativelanguage.googleapis.com` +- `dashscope.aliyuncs.com` + +### 缩略图 worker + +文件: + +- `extracted/assets/thumbnailWorker-Iu1AjlwR.js` + +这个文件很短,适合先看,能快速确认: + +- 它会 `fetch` 图片 +- 用 `createImageBitmap` 和 `OffscreenCanvas` 做缩放 +- 最终转成 JPEG data URL 返回给主线程 + +## 已确认的几个关键定位点 + +以下行号来自提取后的 bundle,可作为检索起点: + +- `index-m-NWkaV-.js:924` + - `qiaodoumayi_seedance_moderation_url` +- `index-m-NWkaV-.js:1673` + - `download_file_bypass_cors` +- `index-m-NWkaV-.js:2068` + - `start_local_server` + +注意: + +- 这是打包文件,很多行非常长 +- 行号只能作为“进入附近区域”的参考,不等于原始源码位置 + +## 局限 + +- 没找到 sourcemap +- 没恢复出原始 React/TypeScript 目录结构 +- 变量名、模块边界、注释都已经过打包压缩处理 +- 目前恢复的是“近似源码”,不是开发者仓库 + +## 怎么继续深挖 + +如果要继续做更细的审计,下一步建议按下面顺序: + +1. 以 `index-m-NWkaV-.js` 为主,按 `qiaodoumayi_`、`seedance`、`proxy`、`download` 搜配置和命令入口 +2. 把出现的外连域名、接口路径、Tauri 命令整理成一张表 +3. 继续从本地存储和日志交叉验证哪些配置在这台机器上真正被启用 +4. 对最敏感的几条链路单独追踪:图片审核、本地代理、本地保存、文件下载绕过 CORS diff --git a/analysis/qiaodou-extract/analyze_bundle.js b/analysis/qiaodou-extract/analyze_bundle.js new file mode 100644 index 000000000..258dbd9cc --- /dev/null +++ b/analysis/qiaodou-extract/analyze_bundle.js @@ -0,0 +1,181 @@ +const fs = require("node:fs"); +const path = require("node:path"); +const vm = require("node:vm"); + +const INPUT = "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/index-m-NWkaV-.js"; +const OUTPUT_JSON = "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/bundle-intel.json"; + +const source = fs.readFileSync(INPUT, "utf8"); + +function unique(values) { + return Array.from(new Set(values)); +} + +function safeEvalObjectLiteral(literal) { + return vm.runInNewContext(`(${literal})`, Object.create(null), { + timeout: 1000, + }); +} + +function extractBetween(startMarker, endMarker) { + const start = source.indexOf(startMarker); + if (start < 0) return null; + const from = start + startMarker.length; + const end = source.indexOf(endMarker, from); + if (end < 0) return null; + return source.slice(from, end); +} + +function normalizeUrl(url) { + return String(url || "").replace(/[.,;]+$/, "").trim(); +} + +function isLikelyAppRelevantUrl(url) { + if (!url || url === "http://" || url === "https://") return false; + return !( + url.includes("w3.org/") || + url.includes("apache.org/") || + url.includes("reactjs.org/") || + url.includes("github.com/") || + url.includes("raw.github.com/") || + url.includes("developer.mozilla.org/") || + url.includes("feross.org") || + url.includes("stuk.github.io/") || + url.includes("stuartk.com/jszip") + ); +} + +const storageKeys = unique( + Array.from(source.matchAll(/qiaodoumayi_[A-Za-z0-9_]+/g)).map((match) => match[0]) +).sort(); + +const tauriCommands = unique( + Array.from(source.matchAll(/yn\("([a-zA-Z0-9_:-]+)"/g)).map((match) => match[1]) +).sort(); + +const requireHints = unique( + Array.from(source.matchAll(/\.\.\/[A-Za-z0-9_./-]+/g)).map((match) => match[0]) +).sort(); + +const allUrls = unique( + Array.from(source.matchAll(/https?:\/\/[^\s"'`\\)<>,]+/g)).map((match) => normalizeUrl(match[0])) +).sort(); + +const appRelevantUrls = allUrls.filter(isLikelyAppRelevantUrl); +const domains = unique( + appRelevantUrls + .map((url) => { + try { + return new URL(url).host; + } catch { + return null; + } + }) + .filter(Boolean) +).sort(); + +let quickConnectConfig = {}; +const quickConnectLiteral = extractBetween("DV=", ";function npe"); +if (quickConnectLiteral) { + quickConnectConfig = safeEvalObjectLiteral(quickConnectLiteral); +} + +let nodeLabelMap = {}; +const nodeLabelMatch = source.match(/function Rm\(e\)\{return(\{[\s\S]*?\})\[e\]\|\|"节点"\}/); +if (nodeLabelMatch) { + nodeLabelMap = safeEvalObjectLiteral(nodeLabelMatch[1]); +} + +const nodeSizeMap = {}; +const nodeSizeMatch = source.match(/function jO\(e\)\{switch\(e\)\{([\s\S]*?)default:return\{w:(\d+),h:(\d+)\}\}\}/); +if (nodeSizeMatch) { + const body = nodeSizeMatch[1]; + const defaultSize = { w: Number(nodeSizeMatch[2]), h: Number(nodeSizeMatch[3]) }; + nodeSizeMap.default = defaultSize; + const groupedCases = body.matchAll(/((?:case"[^"]+":)+)return\{w:(\d+),h:(\d+)\}/g); + for (const groupedCase of groupedCases) { + const labels = Array.from(groupedCase[1].matchAll(/case"([^"]+)":/g)).map((match) => match[1]); + const size = { w: Number(groupedCase[2]), h: Number(groupedCase[3]) }; + for (const label of labels) { + nodeSizeMap[label] = size; + } + } +} + +const quickConnectTypes = Object.keys(quickConnectConfig); +const nodeTypes = unique([ + ...Object.keys(nodeLabelMap), + ...Object.keys(nodeSizeMap).filter((key) => key !== "default"), + ...quickConnectTypes, + ...quickConnectTypes.flatMap((type) => + (quickConnectConfig[type]?.output || []).map((item) => item.type) + ), +]).sort(); + +const nodeCatalog = nodeTypes.map((type) => ({ + type, + label: nodeLabelMap[type] || null, + size: nodeSizeMap[type] || nodeSizeMap.default || null, + quickConnectOutputs: (quickConnectConfig[type]?.output || []).map((item) => ({ + type: item.type, + label: item.label, + })), +})); + +const indexedDb = { + databaseName: source.includes('"qiaodoumayi_projects"') ? "qiaodoumayi_projects" : null, + version: source.includes('qiaodoumayi_projects",Ioe=2') ? 2 : null, + stores: unique( + Array.from(source.matchAll(/"(project_meta|project_payload|project_assets)"/g)).map( + (match) => match[1] + ) + ), +}; + +const snippets = {}; +for (const term of [ + "qiaodoumayi_seedance_moderation_url", + "download_file_bypass_cors", + "start_local_server", + "qiaodoumayi_projects", + "qiaodoumayi_script_projects", + "qiaodoumayi_saved_skills", + "qiaodoumayi_characters", + "https://ai.comfly.chat/sora/v1/characters", + "https://www.runninghub.cn", +]) { + const index = source.indexOf(term); + snippets[term] = + index >= 0 + ? { + index, + preview: source.slice(Math.max(0, index - 180), Math.min(source.length, index + 260)), + } + : null; +} + +const result = { + input: INPUT, + stats: { + bytes: Buffer.byteLength(source, "utf8"), + lines: source.split("\n").length, + hasSourceMap: /sourceMappingURL/.test(source), + }, + storageKeys, + tauriCommands, + requireHints, + urls: { + appRelevant: appRelevantUrls, + all: allUrls, + domains, + }, + indexedDb, + quickConnectConfig, + nodeLabelMap, + nodeSizeMap, + nodeCatalog, + snippets, +}; + +fs.writeFileSync(OUTPUT_JSON, `${JSON.stringify(result, null, 2)}\n`); +console.log(`Wrote ${OUTPUT_JSON}`); diff --git a/analysis/qiaodou-extract/app.arm64 b/analysis/qiaodou-extract/app.arm64 new file mode 100755 index 000000000..37a39019e Binary files /dev/null and b/analysis/qiaodou-extract/app.arm64 differ diff --git a/analysis/qiaodou-extract/app.x86_64 b/analysis/qiaodou-extract/app.x86_64 new file mode 100755 index 000000000..c583ea380 Binary files /dev/null and b/analysis/qiaodou-extract/app.x86_64 differ diff --git a/analysis/qiaodou-extract/bundle-intel.json b/analysis/qiaodou-extract/bundle-intel.json new file mode 100644 index 000000000..526c1396f --- /dev/null +++ b/analysis/qiaodou-extract/bundle-intel.json @@ -0,0 +1,1008 @@ +{ + "input": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/index-m-NWkaV-.js", + "stats": { + "bytes": 4047131, + "lines": 8111, + "hasSourceMap": false + }, + "storageKeys": [ + "qiaodoumayi_active_endpoint", + "qiaodoumayi_agent_prompt_library", + "qiaodoumayi_api_configs", + "qiaodoumayi_autosave_enabled", + "qiaodoumayi_autosave_interval_minutes", + "qiaodoumayi_cache_dir", + "qiaodoumayi_cache_directory_config", + "qiaodoumayi_canvas_bg_color_dark", + "qiaodoumayi_canvas_bg_color_light", + "qiaodoumayi_characters", + "qiaodoumayi_chat_font_size", + "qiaodoumayi_chat_sessions", + "qiaodoumayi_chat_width", + "qiaodoumayi_content_store", + "qiaodoumayi_download_directory", + "qiaodoumayi_feature_version", + "qiaodoumayi_feature_visibility", + "qiaodoumayi_global_base_url", + "qiaodoumayi_global_key", + "qiaodoumayi_history", + "qiaodoumayi_jimeng_session_id", + "qiaodoumayi_jimeng_super_resolution_api_key", + "qiaodoumayi_jimeng_super_resolution_url", + "qiaodoumayi_jimeng_use_local_file", + "qiaodoumayi_kling_subjects", + "qiaodoumayi_last_used_model", + "qiaodoumayi_left_toolbar_collapsed", + "qiaodoumayi_model_settings_memory", + "qiaodoumayi_performance_mode", + "qiaodoumayi_pose_library_panel", + "qiaodoumayi_project_name", + "qiaodoumayi_projects", + "qiaodoumayi_prompt_library", + "qiaodoumayi_rh_api_key", + "qiaodoumayi_rh_app_library", + "qiaodoumayi_right_toolbar_collapsed", + "qiaodoumayi_saved_folder_history", + "qiaodoumayi_saved_skills", + "qiaodoumayi_script_current_id", + "qiaodoumayi_script_projects", + "qiaodoumayi_seedance_moderation_key_hex", + "qiaodoumayi_seedance_moderation_url", + "qiaodoumayi_seedance_moderation_user_id", + "qiaodoumayi_seedance_roles", + "qiaodoumayi_show_canvas_grid", + "qiaodoumayi_show_canvas_minimap", + "qiaodoumayi_show_canvas_snap", + "qiaodoumayi_theme", + "qiaodoumayi_thumbnail_store", + "qiaodoumayi_viewport_size" + ], + "tauriCommands": [ + "download_file_bypass_cors", + "export_categorized_project", + "export_project", + "get_export_temp_dir", + "get_export_temp_file_path", + "get_proxy_server_status", + "get_system_memory_info", + "import_categorized_project", + "import_project", + "open_folder_in_explorer", + "process_large_data_rust", + "proxy_dashscope_request", + "proxy_fetch", + "proxy_fetch_raw", + "read_file_as_base64", + "rust_cache_get", + "rust_cache_remove", + "rust_cache_set", + "start_local_server", + "write_base64_to_file", + "write_base64_to_files_batch", + "write_file_chunked" + ], + "requireHints": [ + "../../node_modules/.pnpm/iota-array", + "../../node_modules/.pnpm/is-buffer", + "../../node_modules/.pnpm/ndarray", + "../base64", + "../compressions", + "../crc32", + "../external", + "../nodejs/NodejsStreamOutputAdapter", + "../services/geminiMarkerService", + "../signature", + "../stream/GenericWorker", + "../support", + "../utf8", + "../utils", + "../utils/common" + ], + "urls": { + "appRelevant": [ + "http://118.196.112.236:3428/api/moderation/image", + "http://127.0.0.1:${bne}", + "http://127.0.0.1:${yne}", + "http://127.0.0.1:41600/proxy", + "http://127.0.0.1:9527", + "http://127.0.0.1:9527/api/proxy", + "http://127.0.0.1:9528", + "http://127.0.0.1:9529", + "http://127.0.0.1:9530", + "http://localhost:5100", + "http://www.mp3dev.org/", + "https://afdian.com/a/ZhengXinLan", + "https://agent-skills.md/", + "https://ai.comfly.chat", + "https://ai.comfly.chat/sora/v1/characters", + "https://ai.t8star.cn", + "https://api.allorigins.win/raw?url=${encodeURIComponent(b", + "https://api.allorigins.win/raw?url=${encodeURIComponent(t", + "https://api.dicebear.com/9.x/${t}/svg?seed=${n}", + "https://api.midjourney.com", + "https://api.openai.com", + "https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js", + "https://dashscope.aliyuncs.com", + "https://generativelanguage.googleapis.com", + "https://grsaiapi.com", + "https://linyunai.net", + "https://skillsmp.com/zh", + "https://skillstore.io/zh-hans", + "https://space.bilibili.com/28347006?spm_id_from=333.1007.0.0", + "https://staticimgly.com/@imgly/background-removal-data/${PACKAGE_VERSION}/dist/", + "https://v.douyin.com/x5s8oIPVBk4", + "https://web.dev/cross-origin-isolation-guide/", + "https://wsrv.nl/?url=${encodeURIComponent(b", + "https://wsrv.nl/?url=${encodeURIComponent(e", + "https://wsrv.nl/?url=${encodeURIComponent(t", + "https://www.runninghub.ai", + "https://www.runninghub.cn", + "https://www.runninghub.cn/ai-detail/${ie||Z}", + "https://www.runninghub.cn/workflow/${V}", + "https://xhslink.com/m/e0jgZ9LypR", + "https://zlhub.xiaowaiyou.cn" + ], + "all": [ + "http://", + "http://118.196.112.236:3428/api/moderation/image", + "http://127.0.0.1:${bne}", + "http://127.0.0.1:${yne}", + "http://127.0.0.1:41600/proxy", + "http://127.0.0.1:9527", + "http://127.0.0.1:9527/api/proxy", + "http://127.0.0.1:9528", + "http://127.0.0.1:9529", + "http://127.0.0.1:9530", + "http://localhost:5100", + "http://stuartk.com/jszip", + "http://www.apache.org/licenses/LICENSE-2.0", + "http://www.mp3dev.org/", + "http://www.w3.org/1998/Math/MathML", + "http://www.w3.org/1999/xhtml", + "http://www.w3.org/1999/xlink", + "http://www.w3.org/2000/svg", + "http://www.w3.org/XML/1998/namespace", + "https://", + "https://afdian.com/a/ZhengXinLan", + "https://agent-skills.md/", + "https://ai.comfly.chat", + "https://ai.comfly.chat/sora/v1/characters", + "https://ai.t8star.cn", + "https://api.allorigins.win/raw?url=${encodeURIComponent(b", + "https://api.allorigins.win/raw?url=${encodeURIComponent(t", + "https://api.dicebear.com/9.x/${t}/svg?seed=${n}", + "https://api.midjourney.com", + "https://api.openai.com", + "https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js", + "https://dashscope.aliyuncs.com", + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer", + "https://feross.org", + "https://generativelanguage.googleapis.com", + "https://github.com/markedjs/marked", + "https://github.com/nodeca/pako/blob/main/LICENSE", + "https://grsaiapi.com", + "https://linyunai.net", + "https://raw.github.com/Stuk/jszip/main/LICENSE.markdown", + "https://reactjs.org/docs/error-decoder.html?invariant=", + "https://skillsmp.com/zh", + "https://skillstore.io/zh-hans", + "https://space.bilibili.com/28347006?spm_id_from=333.1007.0.0", + "https://staticimgly.com/@imgly/background-removal-data/${PACKAGE_VERSION}/dist/", + "https://stuk.github.io/jszip/documentation/howto/read_zip.html", + "https://v.douyin.com/x5s8oIPVBk4", + "https://web.dev/cross-origin-isolation-guide/", + "https://wsrv.nl/?url=${encodeURIComponent(b", + "https://wsrv.nl/?url=${encodeURIComponent(e", + "https://wsrv.nl/?url=${encodeURIComponent(t", + "https://www.runninghub.ai", + "https://www.runninghub.cn", + "https://www.runninghub.cn/ai-detail/${ie||Z}", + "https://www.runninghub.cn/workflow/${V}", + "https://xhslink.com/m/e0jgZ9LypR", + "https://zlhub.xiaowaiyou.cn" + ], + "domains": [ + "118.196.112.236:3428", + "127.0.0.1:41600", + "127.0.0.1:9527", + "127.0.0.1:9528", + "127.0.0.1:9529", + "127.0.0.1:9530", + "afdian.com", + "agent-skills.md", + "ai.comfly.chat", + "ai.t8star.cn", + "api.allorigins.win", + "api.dicebear.com", + "api.midjourney.com", + "api.openai.com", + "cdnjs.cloudflare.com", + "dashscope.aliyuncs.com", + "generativelanguage.googleapis.com", + "grsaiapi.com", + "linyunai.net", + "localhost:5100", + "skillsmp.com", + "skillstore.io", + "space.bilibili.com", + "staticimgly.com", + "v.douyin.com", + "web.dev", + "wsrv.nl", + "www.mp3dev.org", + "www.runninghub.ai", + "www.runninghub.cn", + "xhslink.com", + "zlhub.xiaowaiyou.cn" + ] + }, + "indexedDb": { + "databaseName": "qiaodoumayi_projects", + "version": 2, + "stores": [ + "project_meta", + "project_payload", + "project_assets" + ] + }, + "quickConnectConfig": { + "text-node": { + "output": [ + { + "type": "gen-image", + "label": "绘画" + }, + { + "type": "gen-video", + "label": "视频" + }, + { + "type": "custom-agent", + "label": "Agent" + } + ] + }, + "input-image": { + "output": [ + { + "type": "gen-image", + "label": "绘画" + }, + { + "type": "gen-video", + "label": "视频" + }, + { + "type": "storyboard-node", + "label": "分镜视表" + }, + { + "type": "inpaint-crop", + "label": "裁剪局部重绘" + } + ] + }, + "gen-image": { + "output": [] + }, + "gen-video": { + "output": [] + }, + "motion-control": { + "output": [] + }, + "novel-input": { + "output": [ + { + "type": "custom-agent", + "label": "Agent" + }, + { + "type": "text-node", + "label": "文本" + }, + { + "type": "rh-app", + "label": "RH 应用" + } + ] + }, + "video-input": { + "output": [ + { + "type": "preview", + "label": "预览" + }, + { + "type": "rh-app", + "label": "RH 应用" + } + ] + }, + "video-analyze": { + "output": [ + { + "type": "storyboard-node", + "label": "分镜视表" + }, + { + "type": "gen-image", + "label": "绘画" + } + ] + }, + "table-editor-node": { + "output": [ + { + "type": "storyboard-node", + "label": "分镜视表" + } + ] + }, + "storyboard-node": { + "output": [ + { + "type": "gen-image", + "label": "绘画" + }, + { + "type": "gen-video", + "label": "视频" + } + ] + }, + "storyboard-chart-node": { + "output": [ + { + "type": "preview", + "label": "预览" + } + ] + }, + "custom-agent": { + "output": [] + }, + "rh-app": { + "output": [] + }, + "rh-comfy": { + "output": [] + }, + "jimeng-super-resolution": { + "output": [] + }, + "gen-music": { + "output": [] + }, + "local-save": { + "output": [] + }, + "inpaint-crop": { + "output": [] + }, + "inpaint-stitch": { + "output": [ + { + "type": "preview", + "label": "预览" + }, + { + "type": "local-save", + "label": "保存" + } + ] + }, + "preview": { + "output": [] + } + }, + "nodeLabelMap": { + "input-image": "图片输入", + "text-node": "文本节点", + "novel-input": "小说输入", + "video-input": "视频输入", + "video-analyze": "视频分析", + "storyboard-node": "分镜节点", + "gen-image": "生成图片", + "gen-video": "生成视频", + "motion-control": "动作迁移", + "gen-music": "生成音乐", + "image-compare": "图片对比", + "preview": "预览节点", + "local-save": "本地保存", + "extract-characters-scenes": "提取角色场景", + "character-description": "角色描述", + "scene-description": "场景描述", + "create-character": "创建角色", + "create-scene": "创建场景", + "generate-character-video": "生成角色视频", + "generate-scene-video": "生成场景视频", + "generate-character-image": "生成角色图片", + "generate-scene-image": "生成场景图片", + "camera-movement": "镜头运动", + "professional-camera": "专业镜头", + "custom-agent": "自定义代理", + "canvas-node": "画板节点", + "rh-app": "RH 应用", + "rh-comfy": "RH Comfy", + "jimeng-super-resolution": "智能超清", + "table-editor-node": "表格编辑器", + "storyboard-chart-node": "分镜图表", + "doodle-canvas": "涂鸦画板", + "inpaint-crop": "裁剪局部重绘", + "inpaint-stitch": "无缝拼回" + }, + "nodeSizeMap": { + "default": { + "w": 260, + "h": 260 + }, + "motion-control": { + "w": 320, + "h": 580 + }, + "gen-video": { + "w": 360, + "h": 340 + }, + "gen-image": { + "w": 360, + "h": 340 + }, + "video-input": { + "w": 360, + "h": 420 + }, + "video-analyze": { + "w": 400, + "h": 500 + }, + "storyboard-node": { + "w": 600, + "h": 500 + }, + "image-compare": { + "w": 400, + "h": 300 + }, + "preview": { + "w": 440, + "h": 310 + }, + "text-node": { + "w": 360, + "h": 280 + }, + "novel-input": { + "w": 400, + "h": 500 + }, + "extract-characters-scenes": { + "w": 400, + "h": 500 + }, + "character-description": { + "w": 400, + "h": 400 + }, + "scene-description": { + "w": 400, + "h": 400 + }, + "create-character": { + "w": 350, + "h": 300 + }, + "create-scene": { + "w": 350, + "h": 300 + }, + "generate-character-video": { + "w": 400, + "h": 450 + }, + "generate-scene-video": { + "w": 400, + "h": 450 + }, + "generate-character-image": { + "w": 400, + "h": 450 + }, + "generate-scene-image": { + "w": 400, + "h": 450 + }, + "local-save": { + "w": 320, + "h": 380 + }, + "camera-movement": { + "w": 340, + "h": 480 + }, + "professional-camera": { + "w": 320, + "h": 420 + }, + "gen-music": { + "w": 350, + "h": 700 + }, + "custom-agent": { + "w": 500, + "h": 800 + }, + "canvas-node": { + "w": 600, + "h": 500 + }, + "rh-app": { + "w": 340, + "h": 420 + }, + "rh-comfy": { + "w": 340, + "h": 420 + }, + "jimeng-super-resolution": { + "w": 320, + "h": 280 + }, + "table-editor-node": { + "w": 520, + "h": 420 + }, + "storyboard-chart-node": { + "w": 540, + "h": 480 + }, + "doodle-canvas": { + "w": 500, + "h": 300 + }, + "inpaint-crop": { + "w": 340, + "h": 380 + }, + "inpaint-stitch": { + "w": 340, + "h": 380 + } + }, + "nodeCatalog": [ + { + "type": "camera-movement", + "label": "镜头运动", + "size": { + "w": 340, + "h": 480 + }, + "quickConnectOutputs": [] + }, + { + "type": "canvas-node", + "label": "画板节点", + "size": { + "w": 600, + "h": 500 + }, + "quickConnectOutputs": [] + }, + { + "type": "character-description", + "label": "角色描述", + "size": { + "w": 400, + "h": 400 + }, + "quickConnectOutputs": [] + }, + { + "type": "create-character", + "label": "创建角色", + "size": { + "w": 350, + "h": 300 + }, + "quickConnectOutputs": [] + }, + { + "type": "create-scene", + "label": "创建场景", + "size": { + "w": 350, + "h": 300 + }, + "quickConnectOutputs": [] + }, + { + "type": "custom-agent", + "label": "自定义代理", + "size": { + "w": 500, + "h": 800 + }, + "quickConnectOutputs": [] + }, + { + "type": "doodle-canvas", + "label": "涂鸦画板", + "size": { + "w": 500, + "h": 300 + }, + "quickConnectOutputs": [] + }, + { + "type": "extract-characters-scenes", + "label": "提取角色场景", + "size": { + "w": 400, + "h": 500 + }, + "quickConnectOutputs": [] + }, + { + "type": "gen-image", + "label": "生成图片", + "size": { + "w": 360, + "h": 340 + }, + "quickConnectOutputs": [] + }, + { + "type": "gen-music", + "label": "生成音乐", + "size": { + "w": 350, + "h": 700 + }, + "quickConnectOutputs": [] + }, + { + "type": "gen-video", + "label": "生成视频", + "size": { + "w": 360, + "h": 340 + }, + "quickConnectOutputs": [] + }, + { + "type": "generate-character-image", + "label": "生成角色图片", + "size": { + "w": 400, + "h": 450 + }, + "quickConnectOutputs": [] + }, + { + "type": "generate-character-video", + "label": "生成角色视频", + "size": { + "w": 400, + "h": 450 + }, + "quickConnectOutputs": [] + }, + { + "type": "generate-scene-image", + "label": "生成场景图片", + "size": { + "w": 400, + "h": 450 + }, + "quickConnectOutputs": [] + }, + { + "type": "generate-scene-video", + "label": "生成场景视频", + "size": { + "w": 400, + "h": 450 + }, + "quickConnectOutputs": [] + }, + { + "type": "image-compare", + "label": "图片对比", + "size": { + "w": 400, + "h": 300 + }, + "quickConnectOutputs": [] + }, + { + "type": "inpaint-crop", + "label": "裁剪局部重绘", + "size": { + "w": 340, + "h": 380 + }, + "quickConnectOutputs": [] + }, + { + "type": "inpaint-stitch", + "label": "无缝拼回", + "size": { + "w": 340, + "h": 380 + }, + "quickConnectOutputs": [ + { + "type": "preview", + "label": "预览" + }, + { + "type": "local-save", + "label": "保存" + } + ] + }, + { + "type": "input-image", + "label": "图片输入", + "size": { + "w": 260, + "h": 260 + }, + "quickConnectOutputs": [ + { + "type": "gen-image", + "label": "绘画" + }, + { + "type": "gen-video", + "label": "视频" + }, + { + "type": "storyboard-node", + "label": "分镜视表" + }, + { + "type": "inpaint-crop", + "label": "裁剪局部重绘" + } + ] + }, + { + "type": "jimeng-super-resolution", + "label": "智能超清", + "size": { + "w": 320, + "h": 280 + }, + "quickConnectOutputs": [] + }, + { + "type": "local-save", + "label": "本地保存", + "size": { + "w": 320, + "h": 380 + }, + "quickConnectOutputs": [] + }, + { + "type": "motion-control", + "label": "动作迁移", + "size": { + "w": 320, + "h": 580 + }, + "quickConnectOutputs": [] + }, + { + "type": "novel-input", + "label": "小说输入", + "size": { + "w": 400, + "h": 500 + }, + "quickConnectOutputs": [ + { + "type": "custom-agent", + "label": "Agent" + }, + { + "type": "text-node", + "label": "文本" + }, + { + "type": "rh-app", + "label": "RH 应用" + } + ] + }, + { + "type": "preview", + "label": "预览节点", + "size": { + "w": 440, + "h": 310 + }, + "quickConnectOutputs": [] + }, + { + "type": "professional-camera", + "label": "专业镜头", + "size": { + "w": 320, + "h": 420 + }, + "quickConnectOutputs": [] + }, + { + "type": "rh-app", + "label": "RH 应用", + "size": { + "w": 340, + "h": 420 + }, + "quickConnectOutputs": [] + }, + { + "type": "rh-comfy", + "label": "RH Comfy", + "size": { + "w": 340, + "h": 420 + }, + "quickConnectOutputs": [] + }, + { + "type": "scene-description", + "label": "场景描述", + "size": { + "w": 400, + "h": 400 + }, + "quickConnectOutputs": [] + }, + { + "type": "storyboard-chart-node", + "label": "分镜图表", + "size": { + "w": 540, + "h": 480 + }, + "quickConnectOutputs": [ + { + "type": "preview", + "label": "预览" + } + ] + }, + { + "type": "storyboard-node", + "label": "分镜节点", + "size": { + "w": 600, + "h": 500 + }, + "quickConnectOutputs": [ + { + "type": "gen-image", + "label": "绘画" + }, + { + "type": "gen-video", + "label": "视频" + } + ] + }, + { + "type": "table-editor-node", + "label": "表格编辑器", + "size": { + "w": 520, + "h": 420 + }, + "quickConnectOutputs": [ + { + "type": "storyboard-node", + "label": "分镜视表" + } + ] + }, + { + "type": "text-node", + "label": "文本节点", + "size": { + "w": 360, + "h": 280 + }, + "quickConnectOutputs": [ + { + "type": "gen-image", + "label": "绘画" + }, + { + "type": "gen-video", + "label": "视频" + }, + { + "type": "custom-agent", + "label": "Agent" + } + ] + }, + { + "type": "video-analyze", + "label": "视频分析", + "size": { + "w": 400, + "h": 500 + }, + "quickConnectOutputs": [ + { + "type": "storyboard-node", + "label": "分镜视表" + }, + { + "type": "gen-image", + "label": "绘画" + } + ] + }, + { + "type": "video-input", + "label": "视频输入", + "size": { + "w": 360, + "h": 420 + }, + "quickConnectOutputs": [ + { + "type": "preview", + "label": "预览" + }, + { + "type": "rh-app", + "label": "RH 应用" + } + ] + } + ], + "snippets": { + "qiaodoumayi_seedance_moderation_url": { + "index": 532091, + "preview": "type:\"text\",text:a}];if(Ae&&Qe&&Qe.length>0){at=[{type:\"text\",text:(a||\"\").replace(/@(\\d+)/g,\"\").replace(/\\s+/g,\" \").trim()||a}];const Ot=(()=>{try{const Vt=(localStorage.getItem(\"qiaodoumayi_seedance_moderation_url\")||\"\").trim(),Zt=(localStorage.getItem(\"qiaodoumayi_seedance_moderation_user_id\")||\"\").trim(),Sn=(localStorage.getItem(\"qiaodoumayi_seedance_moderation_key_hex\")||\"\").trim();return!Vt||!Zt||!Sn?null:{apiUrl:Vt,userId:Zt,keyH" + }, + "download_file_bypass_cors": { + "index": 918579, + "preview": "t Promise.resolve().then(()=>tf);return{invoke:a}},void 0,import.meta.url);console.log(\"[Download] Tauri API imported successfully\"),console.log(\"[Download] Calling Tauri command: download_file_bypass_cors\"),console.log(\"[Download] URL:\",e);const n=await t(\"download_file_bypass_cors\",{url:e});console.log(\"[Download] Received bytes from Tauri:\",n.length);const r=new Uint8Array(n),i=new Blob([r]);return console.log(`[Download] ✅ Tauri dow" + }, + "start_local_server": { + "index": 2050573, + "preview": "lSave] Tauri环境检测:\",oe),!oe){alert(`此功能仅在Tauri应用中可用。\n\n请运行 \"启动本地接收器.bat\" 手动启动服务器。`);return}try{n(e.id,{settings:{...e.settings,serverStatus:\"checking\"}}),console.log(\"[LocalSave] 调用 start_local_server 命令...\");const re=await yn(\"start_local_server\",{port:9528});console.log(\"[LocalSave] 启动服务器结果:\",re),setTimeout(async()=>{await I()},2e3)}catch(re){console.error(\"[LocalSave] 启动服务器失败:\",re),n(e.id,{settings:{...e.settings,serverStatus:\"error\"}}" + }, + "qiaodoumayi_projects": { + "index": 1797632, + "preview": "{})=>{_.useEffect(()=>{if(!e)return;console.log(\"[useKlingCallbackConnection] 初始化 callback 连接\");const n=setTimeout(()=>{o7(t)},1e3);return()=>{clearTimeout(n),Coe()}},[e,t])},Eoe=\"qiaodoumayi_projects\",Ioe=2,Mh=\"project_meta\",Th=\"project_payload\",Rh=\"project_assets\";let B1=null;function Bm(){return B1||(B1=new Promise((e,t)=>{const n=indexedDB.open(Eoe,Ioe);n.onerror=()=>t(n.error),n.onsuccess=()=>e(n.result),n.onupgradeneeded=r=>{const" + }, + "qiaodoumayi_script_projects": { + "index": 744704, + "preview": "ull?void 0:i.trim())||\"\",location:((a=d==null?void 0:d[1])==null?void 0:a.trim())||\"\",characters:((o=h==null?void 0:h[1])==null?void 0:o.trim())||\"\",content:c})}return t}const zO=\"qiaodoumayi_script_projects\",$C=\"qiaodoumayi_script_current_id\";function k2(){try{const e=localStorage.getItem(zO);return e?JSON.parse(e):[]}catch{return[]}}function MY(e){try{localStorage.setItem(zO,JSON.stringify(e))}catch{}}function _1(){return{id:ns(),name" + }, + "qiaodoumayi_saved_skills": { + "index": 722463, + "preview": "killMode:A,setChatSkillMode:O,deleteChatSession:T,deleteChatMessages:q,createNewChat:H,renameChatSession:J,sendChatMessage:Z,handleChatResizeStart:X,sessionsForCurrentMode:L}},Tm=\"qiaodoumayi_saved_skills\";function gY(){return\"skill-\"+Date.now().toString(36)+\"-\"+Math.random().toString(36).slice(2,9)}function _c(){try{const e=localStorage.getItem(Tm);if(!e)return[];const t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}functi" + }, + "qiaodoumayi_characters": { + "index": 782296, + "preview": "eturn await Xr.saveBlobAsset(i,r,e),URL.createObjectURL(r)}catch(n){return console.warn(\"转换角色缩略图失败:\",e,n),e}},SC=async(e,t,n)=>{try{const r=(()=>{try{const c=localStorage.getItem(\"qiaodoumayi_characters\");return c?JSON.parse(c):[]}catch{return[]}})(),i=new Set(r.map(c=>c.id)),a=e.filter(c=>!i.has(c.id));if(a.length===0){n==null||n(95,\"角色库已是最新,无需更新\",\"import\"),t(r);return}n==null||n(92,`发现 ${a.length} 个新角色,正在保存到本地缓存...`,\"import\");const o=" + }, + "https://ai.comfly.chat/sora/v1/characters": { + "index": 1293326, + "preview": "border-zinc-300 text-zinc-400 cursor-not-allowed\":\"bg-red-600 border-red-500 text-white hover:bg-red-700\"}`,title:\"清空所有缓存\",children:s.jsx(Zi,{size:12})})]})]})]})})]})}):null},_N=\"https://ai.comfly.chat/sora/v1/characters\",_te=({isOpen:e,onClose:t,isDark:n,history:r,apiConfigs:i,globalApiKey:a,onSetCharacterLibrary:o})=>{const[l,c]=_.useState(\"url\"),[u,d]=_.useState(\"\"),[h,p]=_.useState(\"\"),[f,b]=_.useState(1),[g,y]=_.useState(3),[w,v]=" + }, + "https://www.runninghub.cn": { + "index": 880063, + "preview": "wnloading:t,setDownloadProgress:r,handleDownloadFile:o,startDownload:l,updateDownloadProgress:c,finishDownload:u,resetDownload:d,cancelDownload:a,getCancellationToken:h}}const Bh=\"https://www.runninghub.cn\",Uh=\"https://www.runninghub.ai\";async function kZ(e){const{apiKey:t,webappId:n,useOverseas:r=!1}=e,a=`${r?Uh:Bh}/api/webapp/apiCallDemo?apiKey=${encodeURIComponent(t)}&webappId=${encodeURIComponent(n)}`,o=await fetch(a,{method:\"GET\",h" + } + } +} diff --git a/analysis/qiaodou-extract/extract_tauri_assets.js b/analysis/qiaodou-extract/extract_tauri_assets.js new file mode 100644 index 000000000..2fbc5e015 --- /dev/null +++ b/analysis/qiaodou-extract/extract_tauri_assets.js @@ -0,0 +1,116 @@ +const fs = require("fs"); +const path = require("path"); +const zlib = require("zlib"); + +const INPUT = + "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/app.arm64"; +const OUTPUT_ROOT = + "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted"; +const MANIFEST = + "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/manifest.json"; + +const ASSET_REGEX = + /\/assets\/[A-Za-z0-9 _.@/-]+\.(?:mjs|wasm|webp|png|svg|css|js|ico)(?=[^A-Za-z0-9_.@/-]|$)/g; +const INDEX_HTML_REGEX = /\/index\.html/g; + +function collectOffsets(text, regex) { + const hits = []; + let match; + while ((match = regex.exec(text)) !== null) { + hits.push({ + value: match[0], + offset: match.index, + }); + } + return hits; +} + +function uniqueByOffset(items) { + const seen = new Set(); + return items.filter((item) => { + if (seen.has(item.offset)) { + return false; + } + seen.add(item.offset); + return true; + }); +} + +function ensureDir(filePath) { + fs.mkdirSync(path.dirname(filePath), { recursive: true }); +} + +function main() { + const buffer = fs.readFileSync(INPUT); + const text = buffer.toString("latin1"); + + const assets = uniqueByOffset(collectOffsets(text, ASSET_REGEX)).sort( + (a, b) => a.offset - b.offset, + ); + const indexHtmlHits = uniqueByOffset(collectOffsets(text, INDEX_HTML_REGEX)).sort( + (a, b) => a.offset - b.offset, + ); + + if (!assets.length) { + throw new Error("No embedded /assets/* entries were found."); + } + + const nextBoundaries = [...assets.map((a) => a.offset), ...indexHtmlHits.map((a) => a.offset)] + .sort((a, b) => a - b); + + const manifest = []; + + for (const asset of assets) { + const contentStart = asset.offset + Buffer.byteLength(asset.value); + const nextOffset = nextBoundaries.find((offset) => offset > asset.offset); + + if (!nextOffset) { + manifest.push({ + asset: asset.value, + offset: asset.offset, + status: "skipped_no_boundary", + }); + continue; + } + + const compressed = buffer.subarray(contentStart, nextOffset); + + try { + const decompressed = zlib.brotliDecompressSync(compressed); + const outputPath = path.join(OUTPUT_ROOT, asset.value.replace(/^\//, "")); + ensureDir(outputPath); + fs.writeFileSync(outputPath, decompressed); + + manifest.push({ + asset: asset.value, + offset: asset.offset, + nextOffset, + compressedBytes: compressed.length, + decompressedBytes: decompressed.length, + outputPath, + status: "ok", + }); + } catch (error) { + manifest.push({ + asset: asset.value, + offset: asset.offset, + nextOffset, + compressedBytes: compressed.length, + status: "decompress_failed", + error: error instanceof Error ? error.message : String(error), + }); + } + } + + fs.mkdirSync(OUTPUT_ROOT, { recursive: true }); + fs.writeFileSync(MANIFEST, `${JSON.stringify(manifest, null, 2)}\n`); + + const ok = manifest.filter((item) => item.status === "ok").length; + const failed = manifest.filter((item) => item.status !== "ok").length; + + console.log(`Extracted: ${ok}`); + console.log(`Failed: ${failed}`); + console.log(`Manifest: ${MANIFEST}`); +} + +main(); diff --git a/analysis/qiaodou-extract/extracted/assets/bytedance-color-CPzTHojG.webp b/analysis/qiaodou-extract/extracted/assets/bytedance-color-CPzTHojG.webp new file mode 100644 index 000000000..e27e89b0a Binary files /dev/null and b/analysis/qiaodou-extract/extracted/assets/bytedance-color-CPzTHojG.webp differ diff --git a/analysis/qiaodou-extract/extracted/assets/deepseek-color-XniBTJPh.webp b/analysis/qiaodou-extract/extracted/assets/deepseek-color-XniBTJPh.webp new file mode 100644 index 000000000..072e22c29 Binary files /dev/null and b/analysis/qiaodou-extract/extracted/assets/deepseek-color-XniBTJPh.webp differ diff --git a/analysis/qiaodou-extract/extracted/assets/doubao-color-BfZ9o9VO.webp b/analysis/qiaodou-extract/extracted/assets/doubao-color-BfZ9o9VO.webp new file mode 100644 index 000000000..16b06a8e2 Binary files /dev/null and b/analysis/qiaodou-extract/extracted/assets/doubao-color-BfZ9o9VO.webp differ diff --git a/analysis/qiaodou-extract/extracted/assets/flux bai-CYYe7fkT.webp b/analysis/qiaodou-extract/extracted/assets/flux bai-CYYe7fkT.webp new file mode 100644 index 000000000..ee58c5caf Binary files /dev/null and b/analysis/qiaodou-extract/extracted/assets/flux bai-CYYe7fkT.webp differ diff --git a/analysis/qiaodou-extract/extracted/assets/flux-CzJA5PDw.webp b/analysis/qiaodou-extract/extracted/assets/flux-CzJA5PDw.webp new file mode 100644 index 000000000..e6197ddb5 Binary files /dev/null and b/analysis/qiaodou-extract/extracted/assets/flux-CzJA5PDw.webp differ diff --git a/analysis/qiaodou-extract/extracted/assets/gemini-color-BRjDr-0b.webp b/analysis/qiaodou-extract/extracted/assets/gemini-color-BRjDr-0b.webp new file mode 100644 index 000000000..85aeac1cf Binary files /dev/null and b/analysis/qiaodou-extract/extracted/assets/gemini-color-BRjDr-0b.webp differ diff --git a/analysis/qiaodou-extract/extracted/assets/grok bai-CiCMAJ0q.webp b/analysis/qiaodou-extract/extracted/assets/grok bai-CiCMAJ0q.webp new file mode 100644 index 000000000..f34ca449c Binary files /dev/null and b/analysis/qiaodou-extract/extracted/assets/grok bai-CiCMAJ0q.webp differ diff --git a/analysis/qiaodou-extract/extracted/assets/grok-DEnnqgaa.webp b/analysis/qiaodou-extract/extracted/assets/grok-DEnnqgaa.webp new file mode 100644 index 000000000..5fe0a3e71 Binary files /dev/null and b/analysis/qiaodou-extract/extracted/assets/grok-DEnnqgaa.webp differ diff --git a/analysis/qiaodou-extract/extracted/assets/index-CgHmA0qR.css b/analysis/qiaodou-extract/extracted/assets/index-CgHmA0qR.css new file mode 100644 index 000000000..861fe1ea0 --- /dev/null +++ b/analysis/qiaodou-extract/extracted/assets/index-CgHmA0qR.css @@ -0,0 +1 @@ +*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.\!container{width:100%!important}.container{width:100%}@media(min-width:640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media(min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media(min-width:1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media(min-width:1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media(min-width:1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.\!visible{visibility:visible!important}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-2{top:.5rem;right:.5rem;bottom:.5rem;left:.5rem}.inset-y-0{top:0;bottom:0}.-bottom-0\.5{bottom:-.125rem}.-bottom-1{bottom:-.25rem}.-bottom-5{bottom:-1.25rem}.-left-1{left:-.25rem}.-left-6{left:-1.5rem}.-right-0\.5{right:-.125rem}.-right-1{right:-.25rem}.-right-2\.5{right:-.625rem}.-right-6{right:-1.5rem}.-top-0\.5{top:-.125rem}.-top-1{top:-.25rem}.-top-10{top:-2.5rem}.-top-2\.5{top:-.625rem}.-top-4{top:-1rem}.-top-8{top:-2rem}.bottom-0{bottom:0}.bottom-0\.5{bottom:.125rem}.bottom-1{bottom:.25rem}.bottom-2{bottom:.5rem}.bottom-3{bottom:.75rem}.bottom-4{bottom:1rem}.bottom-6{bottom:1.5rem}.bottom-full{bottom:100%}.left-0{left:0}.left-0\.5{left:.125rem}.left-1{left:.25rem}.left-1\/2{left:50%}.left-1\/4{left:25%}.left-2{left:.5rem}.left-4{left:1rem}.left-5{left:1.25rem}.left-6{left:1.5rem}.left-\[-4px\]{left:-4px}.left-\[256px\]{left:256px}.left-\[296px\]{left:296px}.left-\[328px\]{left:328px}.left-\[40\%\]{left:40%}.left-full{left:100%}.right-0{right:0}.right-0\.5{right:.125rem}.right-1{right:.25rem}.right-1\/4{right:25%}.right-2{right:.5rem}.right-3{right:.75rem}.right-4{right:1rem}.right-6{right:1.5rem}.right-8{right:2rem}.top-0{top:0}.top-0\.5{top:.125rem}.top-1{top:.25rem}.top-1\/2{top:50%}.top-14{top:3.5rem}.top-2{top:.5rem}.top-20{top:5rem}.top-3{top:.75rem}.top-4{top:1rem}.top-6{top:1.5rem}.top-\[12px\]{top:12px}.top-full{top:100%}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[10000\]{z-index:10000}.z-\[1000\]{z-index:1000}.z-\[100\]{z-index:100}.z-\[101\]{z-index:101}.z-\[10\]{z-index:10}.z-\[110\]{z-index:110}.z-\[120\]{z-index:120}.z-\[121\]{z-index:121}.z-\[140\]{z-index:140}.z-\[199\]{z-index:199}.z-\[1\]{z-index:1}.z-\[20050\]{z-index:20050}.z-\[20060\]{z-index:20060}.z-\[200\]{z-index:200}.z-\[25\]{z-index:25}.z-\[2\]{z-index:2}.z-\[300\]{z-index:300}.z-\[400\]{z-index:400}.z-\[5\]{z-index:5}.z-\[60\]{z-index:60}.z-\[70\]{z-index:70}.z-\[7\]{z-index:7}.z-\[8\]{z-index:8}.z-\[9998\]{z-index:9998}.z-\[99999\]{z-index:99999}.z-\[9999\]{z-index:9999}.z-\[99\]{z-index:99}.z-\[9\]{z-index:9}.col-span-2{grid-column:span 2 / span 2}.col-span-3{grid-column:span 3 / span 3}.col-span-4{grid-column:span 4 / span 4}.col-span-full{grid-column:1 / -1}.-m-1{margin:-.25rem}.-m-4{margin:-1rem}.m-0{margin:0}.mx-0\.5{margin-left:.125rem;margin-right:.125rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-5{margin-left:1.25rem;margin-right:1.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.-mt-0\.5{margin-top:-.125rem}.-mt-1{margin-top:-.25rem}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-2\.5{margin-bottom:.625rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-auto{margin-left:auto}.mr-0\.5{margin-right:.125rem}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mr-4{margin-right:1rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-auto{margin-top:auto}.box-border{box-sizing:border-box}.line-clamp-1{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.aspect-\[3\/4\]{aspect-ratio:3/4}.aspect-\[4\/3\]{aspect-ratio:4/3}.aspect-square{aspect-ratio:1 / 1}.aspect-video{aspect-ratio:16 / 9}.h-0\.5{height:.125rem}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-1\/2{height:50%}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-24{height:6rem}.h-28{height:7rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-40{height:10rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[120px\]{height:120px}.h-\[18px\]{height:18px}.h-\[1em\]{height:1em}.h-\[220px\]{height:220px}.h-\[2px\]{height:2px}.h-\[44px\]{height:44px}.h-\[6px\]{height:6px}.h-\[72px\]{height:72px}.h-\[85vh\]{height:85vh}.h-\[min\(52vw\,360px\)\]{height:min(52vw,360px)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-14{max-height:3.5rem}.max-h-16{max-height:4rem}.max-h-20{max-height:5rem}.max-h-32{max-height:8rem}.max-h-36{max-height:9rem}.max-h-40{max-height:10rem}.max-h-48{max-height:12rem}.max-h-52{max-height:13rem}.max-h-56{max-height:14rem}.max-h-64{max-height:16rem}.max-h-80{max-height:20rem}.max-h-\[200px\]{max-height:200px}.max-h-\[280px\]{max-height:280px}.max-h-\[300px\]{max-height:300px}.max-h-\[400px\]{max-height:400px}.max-h-\[420px\]{max-height:420px}.max-h-\[45vh\]{max-height:45vh}.max-h-\[560px\]{max-height:560px}.max-h-\[80vh\]{max-height:80vh}.max-h-\[85vh\]{max-height:85vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[calc\(100vh-2rem\)\]{max-height:calc(100vh - 2rem)}.max-h-\[min\(86vh\,820px\)\]{max-height:min(86vh,820px)}.max-h-full{max-height:100%}.min-h-0{min-height:0px}.min-h-24{min-height:6rem}.min-h-\[100px\]{min-height:100px}.min-h-\[160\]{min-height:160}.min-h-\[180px\]{min-height:180px}.min-h-\[200px\]{min-height:200px}.min-h-\[20px\]{min-height:20px}.min-h-\[220px\]{min-height:220px}.min-h-\[28px\]{min-height:28px}.min-h-\[2rem\]{min-height:2rem}.min-h-\[360px\]{min-height:360px}.min-h-\[60px\]{min-height:60px}.min-h-\[80px\]{min-height:80px}.w-0\.5{width:.125rem}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-1\/3{width:33.333333%}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-36{width:9rem}.w-4{width:1rem}.w-40{width:10rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-52{width:13rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-96{width:24rem}.w-\[120px\]{width:120px}.w-\[130px\]{width:130px}.w-\[18px\]{width:18px}.w-\[1em\]{width:1em}.w-\[240px\]{width:240px}.w-\[360px\]{width:360px}.w-\[3px\]{width:3px}.w-\[400px\]{width:400px}.w-\[420px\]{width:420px}.w-\[480px\]{width:480px}.w-\[500px\]{width:500px}.w-\[600px\]{width:600px}.w-\[680px\]{width:680px}.w-\[700px\]{width:700px}.w-\[720px\]{width:720px}.w-\[72px\]{width:72px}.w-\[800px\]{width:800px}.w-\[90vw\]{width:90vw}.w-\[min\(52vw\,360px\)\]{width:min(52vw,360px)}.w-\[min\(92vw\,320px\)\]{width:min(92vw,320px)}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-\[120px\]{min-width:120px}.min-w-\[150px\]{min-width:150px}.min-w-\[180px\]{min-width:180px}.min-w-\[188px\]{min-width:188px}.min-w-\[190px\]{min-width:190px}.min-w-\[2\.5rem\]{min-width:2.5rem}.min-w-\[200px\]{min-width:200px}.min-w-\[20px\]{min-width:20px}.min-w-\[240px\]{min-width:240px}.min-w-\[24px\]{min-width:24px}.min-w-\[280px\]{min-width:280px}.min-w-\[2rem\]{min-width:2rem}.min-w-\[300px\]{min-width:300px}.min-w-\[420px\]{min-width:420px}.min-w-\[48px\]{min-width:48px}.min-w-\[520px\]{min-width:520px}.min-w-\[52px\]{min-width:52px}.min-w-\[70px\]{min-width:70px}.min-w-\[72px\]{min-width:72px}.min-w-\[9\.5rem\]{min-width:9.5rem}.min-w-\[90px\]{min-width:90px}.min-w-fit{min-width:-moz-fit-content;min-width:fit-content}.min-w-full{min-width:100%}.min-w-max{min-width:-moz-max-content;min-width:max-content}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-6xl{max-width:72rem}.max-w-\[1000px\]{max-width:1000px}.max-w-\[100px\]{max-width:100px}.max-w-\[1200px\]{max-width:1200px}.max-w-\[120px\]{max-width:120px}.max-w-\[180px\]{max-width:180px}.max-w-\[200px\]{max-width:200px}.max-w-\[280px\]{max-width:280px}.max-w-\[300px\]{max-width:300px}.max-w-\[40\%\]{max-width:40%}.max-w-\[400px\]{max-width:400px}.max-w-\[45vw\]{max-width:45vw}.max-w-\[50\%\]{max-width:50%}.max-w-\[540px\]{max-width:540px}.max-w-\[600px\]{max-width:600px}.max-w-\[80\%\]{max-width:80%}.max-w-\[80px\]{max-width:80px}.max-w-\[90vw\]{max-width:90vw}.max-w-\[calc\(100vw-2rem\)\]{max-width:calc(100vw - 2rem)}.max-w-\[calc\(100vw-32px\)\]{max-width:calc(100vw - 32px)}.max-w-\[calc\(100vw-340px\)\]{max-width:calc(100vw - 340px)}.max-w-\[min\(100vw-2rem\,42rem\)\]{max-width:min(100vw - 2rem,42rem)}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-none{max-width:none}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.origin-center{transform-origin:center}.-translate-x-0\.5{--tw-translate-x: -.125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1{--tw-translate-y: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0\.5{--tw-translate-x: .125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-1{--tw-translate-x: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-4{--tw-translate-x: 1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-6{--tw-translate-x: 1.5rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-7{--tw-translate-x: 1.75rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-4{--tw-translate-y: 1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-full{--tw-translate-y: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-90{--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-0{--tw-rotate: 0deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-105{--tw-scale-x: 1.05;--tw-scale-y: 1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-110{--tw-scale-x: 1.1;--tw-scale-y: 1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-150{--tw-scale-x: 1.5;--tw-scale-y: 1.5;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-90{--tw-scale-x: .9;--tw-scale-y: .9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-95{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-\[0\.98\]{--tw-scale-x: .98;--tw-scale-y: .98;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-\[1\.02\]{--tw-scale-x: 1.02;--tw-scale-y: 1.02;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes bounce{0%,to{transform:translateY(-25%);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;animation-timing-function:cubic-bezier(0,0,.2,1)}}.animate-bounce{animation:bounce 1s infinite}@keyframes breathe{0%,to{transform:scale(1);opacity:.5}50%{transform:scale(1.1);opacity:.2}}.animate-breathe{animation:breathe 4s ease-in-out infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-cell{cursor:cell}.cursor-col-resize{cursor:col-resize}.cursor-crosshair{cursor:crosshair}.cursor-default{cursor:default}.cursor-ew-resize{cursor:ew-resize}.cursor-grab{cursor:grab}.cursor-move{cursor:move}.cursor-ne-resize{cursor:ne-resize}.cursor-nesw-resize{cursor:nesw-resize}.cursor-not-allowed{cursor:not-allowed}.cursor-ns-resize{cursor:ns-resize}.cursor-nw-resize{cursor:nw-resize}.cursor-nwse-resize{cursor:nwse-resize}.cursor-pointer{cursor:pointer}.cursor-row-resize{cursor:row-resize}.cursor-se-resize{cursor:se-resize}.cursor-sw-resize{cursor:sw-resize}.cursor-text{cursor:text}.cursor-wait{cursor:wait}.touch-none{touch-action:none}.resize-none{resize:none}.resize-y{resize:vertical}.resize{resize:both}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0px}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-1{row-gap:.25rem}.gap-y-2{row-gap:.5rem}.-space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(-.375rem * var(--tw-space-x-reverse));margin-left:calc(-.375rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.625rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-hidden{overflow-y:hidden}.overflow-x-visible{overflow-x:visible}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-\[10px\]{border-radius:10px}.rounded-\[1px\]{border-radius:1px}.rounded-\[2rem\]{border-radius:2rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-b-2xl{border-bottom-right-radius:1rem;border-bottom-left-radius:1rem}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-l-2xl{border-top-left-radius:1rem;border-bottom-left-radius:1rem}.rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.rounded-bl{border-bottom-left-radius:.25rem}.rounded-br-2xl{border-bottom-right-radius:1rem}.rounded-br-lg{border-bottom-right-radius:.5rem}.\!border-0{border-width:0px!important}.border{border-width:1px}.border-0{border-width:0px}.border-2{border-width:2px}.border-4{border-width:4px}.border-\[1\.5px\]{border-width:1.5px}.border-b{border-bottom-width:1px}.border-b-0{border-bottom-width:0px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-r-2{border-right-width:2px}.border-t{border-top-width:1px}.border-t-0{border-top-width:0px}.border-dashed{border-style:dashed}.border-none{border-style:none}.\!border-transparent{border-color:transparent!important}.border-\[\#18181b\]{--tw-border-opacity: 1;border-color:rgb(24 24 27 / var(--tw-border-opacity, 1))}.border-amber-200{--tw-border-opacity: 1;border-color:rgb(253 230 138 / var(--tw-border-opacity, 1))}.border-amber-300{--tw-border-opacity: 1;border-color:rgb(252 211 77 / var(--tw-border-opacity, 1))}.border-amber-400{--tw-border-opacity: 1;border-color:rgb(251 191 36 / var(--tw-border-opacity, 1))}.border-amber-500{--tw-border-opacity: 1;border-color:rgb(245 158 11 / var(--tw-border-opacity, 1))}.border-amber-500\/20{border-color:#f59e0b33}.border-amber-500\/30{border-color:#f59e0b4d}.border-amber-500\/40{border-color:#f59e0b66}.border-amber-500\/50{border-color:#f59e0b80}.border-amber-500\/60{border-color:#f59e0b99}.border-amber-600\/60{border-color:#d9770699}.border-amber-700{--tw-border-opacity: 1;border-color:rgb(180 83 9 / var(--tw-border-opacity, 1))}.border-amber-800\/50{border-color:#92400e80}.border-black{--tw-border-opacity: 1;border-color:rgb(0 0 0 / var(--tw-border-opacity, 1))}.border-black\/10{border-color:#0000001a}.border-black\/15{border-color:#00000026}.border-black\/20{border-color:#0003}.border-black\/60{border-color:#0009}.border-black\/70{border-color:#000000b3}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-blue-200\/80{border-color:#bfdbfecc}.border-blue-300{--tw-border-opacity: 1;border-color:rgb(147 197 253 / var(--tw-border-opacity, 1))}.border-blue-300\/60{border-color:#93c5fd99}.border-blue-400{--tw-border-opacity: 1;border-color:rgb(96 165 250 / var(--tw-border-opacity, 1))}.border-blue-400\/30{border-color:#60a5fa4d}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-blue-500\/20{border-color:#3b82f633}.border-blue-500\/30{border-color:#3b82f64d}.border-blue-500\/50{border-color:#3b82f680}.border-blue-600{--tw-border-opacity: 1;border-color:rgb(37 99 235 / var(--tw-border-opacity, 1))}.border-blue-700{--tw-border-opacity: 1;border-color:rgb(29 78 216 / var(--tw-border-opacity, 1))}.border-blue-700\/50{border-color:#1d4ed880}.border-blue-800{--tw-border-opacity: 1;border-color:rgb(30 64 175 / var(--tw-border-opacity, 1))}.border-cyan-200{--tw-border-opacity: 1;border-color:rgb(165 243 252 / var(--tw-border-opacity, 1))}.border-cyan-300{--tw-border-opacity: 1;border-color:rgb(103 232 249 / var(--tw-border-opacity, 1))}.border-cyan-400{--tw-border-opacity: 1;border-color:rgb(34 211 238 / var(--tw-border-opacity, 1))}.border-emerald-200{--tw-border-opacity: 1;border-color:rgb(167 243 208 / var(--tw-border-opacity, 1))}.border-emerald-300{--tw-border-opacity: 1;border-color:rgb(110 231 183 / var(--tw-border-opacity, 1))}.border-emerald-400{--tw-border-opacity: 1;border-color:rgb(52 211 153 / var(--tw-border-opacity, 1))}.border-emerald-500\/20{border-color:#10b98133}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-gray-400{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.border-gray-500{--tw-border-opacity: 1;border-color:rgb(107 114 128 / var(--tw-border-opacity, 1))}.border-gray-600{--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity, 1))}.border-gray-700{--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity, 1))}.border-gray-900\/10{border-color:#1118271a}.border-green-200{--tw-border-opacity: 1;border-color:rgb(187 247 208 / var(--tw-border-opacity, 1))}.border-green-300{--tw-border-opacity: 1;border-color:rgb(134 239 172 / var(--tw-border-opacity, 1))}.border-green-400{--tw-border-opacity: 1;border-color:rgb(74 222 128 / var(--tw-border-opacity, 1))}.border-green-500{--tw-border-opacity: 1;border-color:rgb(34 197 94 / var(--tw-border-opacity, 1))}.border-green-500\/20{border-color:#22c55e33}.border-green-500\/40{border-color:#22c55e66}.border-green-500\/50{border-color:#22c55e80}.border-green-600{--tw-border-opacity: 1;border-color:rgb(22 163 74 / var(--tw-border-opacity, 1))}.border-green-700{--tw-border-opacity: 1;border-color:rgb(21 128 61 / var(--tw-border-opacity, 1))}.border-inherit{border-color:inherit}.border-orange-300{--tw-border-opacity: 1;border-color:rgb(253 186 116 / var(--tw-border-opacity, 1))}.border-orange-400{--tw-border-opacity: 1;border-color:rgb(251 146 60 / var(--tw-border-opacity, 1))}.border-orange-500{--tw-border-opacity: 1;border-color:rgb(249 115 22 / var(--tw-border-opacity, 1))}.border-orange-500\/40{border-color:#f9731666}.border-orange-500\/50{border-color:#f9731680}.border-pink-100{--tw-border-opacity: 1;border-color:rgb(252 231 243 / var(--tw-border-opacity, 1))}.border-pink-200{--tw-border-opacity: 1;border-color:rgb(251 207 232 / var(--tw-border-opacity, 1))}.border-pink-200\/80{border-color:#fbcfe8cc}.border-pink-300{--tw-border-opacity: 1;border-color:rgb(249 168 212 / var(--tw-border-opacity, 1))}.border-pink-300\/40{border-color:#f9a8d466}.border-pink-500\/15{border-color:#ec489926}.border-pink-500\/20{border-color:#ec489933}.border-purple-200{--tw-border-opacity: 1;border-color:rgb(233 213 255 / var(--tw-border-opacity, 1))}.border-purple-300{--tw-border-opacity: 1;border-color:rgb(216 180 254 / var(--tw-border-opacity, 1))}.border-purple-400{--tw-border-opacity: 1;border-color:rgb(192 132 252 / var(--tw-border-opacity, 1))}.border-purple-500{--tw-border-opacity: 1;border-color:rgb(168 85 247 / var(--tw-border-opacity, 1))}.border-purple-500\/20{border-color:#a855f733}.border-purple-500\/50{border-color:#a855f780}.border-purple-600{--tw-border-opacity: 1;border-color:rgb(147 51 234 / var(--tw-border-opacity, 1))}.border-purple-700\/30{border-color:#7e22ce4d}.border-purple-700\/40{border-color:#7e22ce66}.border-purple-800{--tw-border-opacity: 1;border-color:rgb(107 33 168 / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-red-300{--tw-border-opacity: 1;border-color:rgb(252 165 165 / var(--tw-border-opacity, 1))}.border-red-500{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.border-red-500\/20{border-color:#ef444433}.border-red-500\/30{border-color:#ef44444d}.border-red-500\/40{border-color:#ef444466}.border-red-500\/50{border-color:#ef444480}.border-red-600{--tw-border-opacity: 1;border-color:rgb(220 38 38 / var(--tw-border-opacity, 1))}.border-red-700{--tw-border-opacity: 1;border-color:rgb(185 28 28 / var(--tw-border-opacity, 1))}.border-red-800{--tw-border-opacity: 1;border-color:rgb(153 27 27 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-violet-100{--tw-border-opacity: 1;border-color:rgb(237 233 254 / var(--tw-border-opacity, 1))}.border-violet-200{--tw-border-opacity: 1;border-color:rgb(221 214 254 / var(--tw-border-opacity, 1))}.border-violet-400{--tw-border-opacity: 1;border-color:rgb(167 139 250 / var(--tw-border-opacity, 1))}.border-violet-500{--tw-border-opacity: 1;border-color:rgb(139 92 246 / var(--tw-border-opacity, 1))}.border-violet-500\/10{border-color:#8b5cf61a}.border-violet-500\/20{border-color:#8b5cf633}.border-violet-500\/30{border-color:#8b5cf64d}.border-white{--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.border-white\/10{border-color:#ffffff1a}.border-white\/15{border-color:#ffffff26}.border-white\/20{border-color:#fff3}.border-white\/25{border-color:#ffffff40}.border-white\/30{border-color:#ffffff4d}.border-white\/40{border-color:#fff6}.border-white\/50{border-color:#ffffff80}.border-white\/60{border-color:#fff9}.border-white\/70{border-color:#ffffffb3}.border-white\/80{border-color:#fffc}.border-white\/90{border-color:#ffffffe6}.border-yellow-200{--tw-border-opacity: 1;border-color:rgb(254 240 138 / var(--tw-border-opacity, 1))}.border-yellow-300{--tw-border-opacity: 1;border-color:rgb(253 224 71 / var(--tw-border-opacity, 1))}.border-yellow-500{--tw-border-opacity: 1;border-color:rgb(234 179 8 / var(--tw-border-opacity, 1))}.border-yellow-500\/20{border-color:#eab30833}.border-yellow-700{--tw-border-opacity: 1;border-color:rgb(161 98 7 / var(--tw-border-opacity, 1))}.border-zinc-100{--tw-border-opacity: 1;border-color:rgb(244 244 245 / var(--tw-border-opacity, 1))}.border-zinc-200{--tw-border-opacity: 1;border-color:rgb(228 228 231 / var(--tw-border-opacity, 1))}.border-zinc-200\/60{border-color:#e4e4e799}.border-zinc-200\/80{border-color:#e4e4e7cc}.border-zinc-200\/90{border-color:#e4e4e7e6}.border-zinc-300{--tw-border-opacity: 1;border-color:rgb(212 212 216 / var(--tw-border-opacity, 1))}.border-zinc-300\/80{border-color:#d4d4d8cc}.border-zinc-400{--tw-border-opacity: 1;border-color:rgb(161 161 170 / var(--tw-border-opacity, 1))}.border-zinc-400\/50{border-color:#a1a1aa80}.border-zinc-500{--tw-border-opacity: 1;border-color:rgb(113 113 122 / var(--tw-border-opacity, 1))}.border-zinc-600{--tw-border-opacity: 1;border-color:rgb(82 82 91 / var(--tw-border-opacity, 1))}.border-zinc-600\/30{border-color:#52525b4d}.border-zinc-600\/50{border-color:#52525b80}.border-zinc-600\/70{border-color:#52525bb3}.border-zinc-600\/80{border-color:#52525bcc}.border-zinc-700{--tw-border-opacity: 1;border-color:rgb(63 63 70 / var(--tw-border-opacity, 1))}.border-zinc-700\/30{border-color:#3f3f464d}.border-zinc-700\/40{border-color:#3f3f4666}.border-zinc-700\/50{border-color:#3f3f4680}.border-zinc-700\/60{border-color:#3f3f4699}.border-zinc-700\/80{border-color:#3f3f46cc}.border-zinc-800{--tw-border-opacity: 1;border-color:rgb(39 39 42 / var(--tw-border-opacity, 1))}.border-zinc-800\/50{border-color:#27272a80}.border-zinc-800\/80{border-color:#27272acc}.border-zinc-900{--tw-border-opacity: 1;border-color:rgb(24 24 27 / var(--tw-border-opacity, 1))}.border-zinc-900\/95{border-color:#18181bf2}.\!bg-transparent{background-color:transparent!important}.bg-\[\#09090b\]{--tw-bg-opacity: 1;background-color:rgb(9 9 11 / var(--tw-bg-opacity, 1))}.bg-\[\#09090b\]\/90{background-color:#09090be6}.bg-\[\#09090b\]\/95{background-color:#09090bf2}.bg-\[\#121214\]{--tw-bg-opacity: 1;background-color:rgb(18 18 20 / var(--tw-bg-opacity, 1))}.bg-\[\#18181b\]{--tw-bg-opacity: 1;background-color:rgb(24 24 27 / var(--tw-bg-opacity, 1))}.bg-\[\#1a1a1c\]{--tw-bg-opacity: 1;background-color:rgb(26 26 28 / var(--tw-bg-opacity, 1))}.bg-\[\#1a1a1e\]{--tw-bg-opacity: 1;background-color:rgb(26 26 30 / var(--tw-bg-opacity, 1))}.bg-\[\#f6f6f6\]{--tw-bg-opacity: 1;background-color:rgb(246 246 246 / var(--tw-bg-opacity, 1))}.bg-\[rgba\(253\,226\,236\,0\.45\)\]{background-color:#fde2ec73}.bg-amber-100{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.bg-amber-400{--tw-bg-opacity: 1;background-color:rgb(251 191 36 / var(--tw-bg-opacity, 1))}.bg-amber-400\/20{background-color:#fbbf2433}.bg-amber-400\/30{background-color:#fbbf244d}.bg-amber-400\/95{background-color:#fbbf24f2}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-amber-50\/50{background-color:#fffbeb80}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-amber-500\/20{background-color:#f59e0b33}.bg-amber-500\/5{background-color:#f59e0b0d}.bg-amber-500\/60{background-color:#f59e0b99}.bg-amber-600{--tw-bg-opacity: 1;background-color:rgb(217 119 6 / var(--tw-bg-opacity, 1))}.bg-amber-600\/20{background-color:#d9770633}.bg-amber-600\/30{background-color:#d977064d}.bg-amber-900\/20{background-color:#78350f33}.bg-amber-900\/30{background-color:#78350f4d}.bg-amber-900\/50{background-color:#78350f80}.bg-amber-900\/90{background-color:#78350fe6}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-black\/0{background-color:#0000}.bg-black\/10{background-color:#0000001a}.bg-black\/20{background-color:#0003}.bg-black\/30{background-color:#0000004d}.bg-black\/35{background-color:#00000059}.bg-black\/40{background-color:#0006}.bg-black\/45{background-color:#00000073}.bg-black\/5{background-color:#0000000d}.bg-black\/50{background-color:#00000080}.bg-black\/60{background-color:#0009}.bg-black\/70{background-color:#000000b3}.bg-black\/80{background-color:#000c}.bg-black\/90{background-color:#000000e6}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-100\/50{background-color:#dbeafe80}.bg-blue-400{--tw-bg-opacity: 1;background-color:rgb(96 165 250 / var(--tw-bg-opacity, 1))}.bg-blue-400\/30{background-color:#60a5fa4d}.bg-blue-400\/5{background-color:#60a5fa0d}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-50\/80{background-color:#eff6ffcc}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.bg-blue-500\/10{background-color:#3b82f61a}.bg-blue-500\/20{background-color:#3b82f633}.bg-blue-500\/30{background-color:#3b82f64d}.bg-blue-500\/80{background-color:#3b82f6cc}.bg-blue-500\/95{background-color:#3b82f6f2}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-blue-600\/20{background-color:#2563eb33}.bg-blue-600\/30{background-color:#2563eb4d}.bg-blue-600\/80{background-color:#2563ebcc}.bg-blue-600\/90{background-color:#2563ebe6}.bg-blue-900\/30{background-color:#1e3a8a4d}.bg-blue-900\/50{background-color:#1e3a8a80}.bg-blue-900\/90{background-color:#1e3a8ae6}.bg-current{background-color:currentColor}.bg-cyan-100{--tw-bg-opacity: 1;background-color:rgb(207 250 254 / var(--tw-bg-opacity, 1))}.bg-cyan-400\/90{background-color:#22d3eee6}.bg-cyan-50{--tw-bg-opacity: 1;background-color:rgb(236 254 255 / var(--tw-bg-opacity, 1))}.bg-cyan-500{--tw-bg-opacity: 1;background-color:rgb(6 182 212 / var(--tw-bg-opacity, 1))}.bg-cyan-500\/30{background-color:#06b6d44d}.bg-cyan-600{--tw-bg-opacity: 1;background-color:rgb(8 145 178 / var(--tw-bg-opacity, 1))}.bg-cyan-600\/20{background-color:#0891b233}.bg-cyan-600\/90{background-color:#0891b2e6}.bg-emerald-100{--tw-bg-opacity: 1;background-color:rgb(209 250 229 / var(--tw-bg-opacity, 1))}.bg-emerald-50{--tw-bg-opacity: 1;background-color:rgb(236 253 245 / var(--tw-bg-opacity, 1))}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-emerald-500\/10{background-color:#10b9811a}.bg-emerald-500\/20{background-color:#10b98133}.bg-emerald-500\/30{background-color:#10b9814d}.bg-emerald-500\/80{background-color:#10b981cc}.bg-emerald-600{--tw-bg-opacity: 1;background-color:rgb(5 150 105 / var(--tw-bg-opacity, 1))}.bg-emerald-600\/80{background-color:#059669cc}.bg-emerald-900\/30{background-color:#064e3b4d}.bg-emerald-900\/80{background-color:#064e3bcc}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.bg-gray-400{--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-gray-600{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity, 1))}.bg-gray-700{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.bg-gray-700\/50{background-color:#37415180}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-gray-900\/95{background-color:#111827f2}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-400{--tw-bg-opacity: 1;background-color:rgb(74 222 128 / var(--tw-bg-opacity, 1))}.bg-green-400\/20{background-color:#4ade8033}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-green-50\/50{background-color:#f0fdf480}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-green-500\/10{background-color:#22c55e1a}.bg-green-500\/20{background-color:#22c55e33}.bg-green-500\/30{background-color:#22c55e4d}.bg-green-500\/80{background-color:#22c55ecc}.bg-green-500\/90{background-color:#22c55ee6}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-green-900\/20{background-color:#14532d33}.bg-green-900\/30{background-color:#14532d4d}.bg-green-900\/50{background-color:#14532d80}.bg-green-900\/90{background-color:#14532de6}.bg-orange-100{--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1))}.bg-orange-400{--tw-bg-opacity: 1;background-color:rgb(251 146 60 / var(--tw-bg-opacity, 1))}.bg-orange-50{--tw-bg-opacity: 1;background-color:rgb(255 247 237 / var(--tw-bg-opacity, 1))}.bg-orange-500{--tw-bg-opacity: 1;background-color:rgb(249 115 22 / var(--tw-bg-opacity, 1))}.bg-orange-500\/20{background-color:#f9731633}.bg-orange-500\/30{background-color:#f973164d}.bg-orange-600{--tw-bg-opacity: 1;background-color:rgb(234 88 12 / var(--tw-bg-opacity, 1))}.bg-orange-950\/80{background-color:#431407cc}.bg-pink-50{--tw-bg-opacity: 1;background-color:rgb(253 242 248 / var(--tw-bg-opacity, 1))}.bg-pink-500\/10{background-color:#ec48991a}.bg-purple-100{--tw-bg-opacity: 1;background-color:rgb(243 232 255 / var(--tw-bg-opacity, 1))}.bg-purple-400{--tw-bg-opacity: 1;background-color:rgb(192 132 252 / var(--tw-bg-opacity, 1))}.bg-purple-50{--tw-bg-opacity: 1;background-color:rgb(250 245 255 / var(--tw-bg-opacity, 1))}.bg-purple-500{--tw-bg-opacity: 1;background-color:rgb(168 85 247 / var(--tw-bg-opacity, 1))}.bg-purple-500\/10{background-color:#a855f71a}.bg-purple-500\/30{background-color:#a855f74d}.bg-purple-600{--tw-bg-opacity: 1;background-color:rgb(147 51 234 / var(--tw-bg-opacity, 1))}.bg-purple-600\/30{background-color:#9333ea4d}.bg-purple-900\/20{background-color:#581c8733}.bg-purple-900\/30{background-color:#581c874d}.bg-purple-900\/50{background-color:#581c8780}.bg-red-100{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.bg-red-400{--tw-bg-opacity: 1;background-color:rgb(248 113 113 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-50\/50{background-color:#fef2f280}.bg-red-50\/80{background-color:#fef2f2cc}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-500\/10{background-color:#ef44441a}.bg-red-500\/20{background-color:#ef444433}.bg-red-500\/30{background-color:#ef44444d}.bg-red-500\/80{background-color:#ef4444cc}.bg-red-500\/90{background-color:#ef4444e6}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-red-600\/80{background-color:#dc2626cc}.bg-red-600\/90{background-color:#dc2626e6}.bg-red-900\/20{background-color:#7f1d1d33}.bg-red-900\/30{background-color:#7f1d1d4d}.bg-red-900\/90{background-color:#7f1d1de6}.bg-red-950\/20{background-color:#450a0a33}.bg-transparent{background-color:transparent}.bg-violet-100{--tw-bg-opacity: 1;background-color:rgb(237 233 254 / var(--tw-bg-opacity, 1))}.bg-violet-50{--tw-bg-opacity: 1;background-color:rgb(245 243 255 / var(--tw-bg-opacity, 1))}.bg-violet-50\/50{background-color:#f5f3ff80}.bg-violet-500{--tw-bg-opacity: 1;background-color:rgb(139 92 246 / var(--tw-bg-opacity, 1))}.bg-violet-500\/10{background-color:#8b5cf61a}.bg-violet-500\/20{background-color:#8b5cf633}.bg-violet-500\/30{background-color:#8b5cf64d}.bg-violet-500\/5{background-color:#8b5cf60d}.bg-violet-600{--tw-bg-opacity: 1;background-color:rgb(124 58 237 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/10{background-color:#ffffff1a}.bg-white\/15{background-color:#ffffff26}.bg-white\/20{background-color:#fff3}.bg-white\/30{background-color:#ffffff4d}.bg-white\/40{background-color:#fff6}.bg-white\/5{background-color:#ffffff0d}.bg-white\/50{background-color:#ffffff80}.bg-white\/60{background-color:#fff9}.bg-white\/80{background-color:#fffc}.bg-white\/90{background-color:#ffffffe6}.bg-white\/95{background-color:#fffffff2}.bg-yellow-100{--tw-bg-opacity: 1;background-color:rgb(254 249 195 / var(--tw-bg-opacity, 1))}.bg-yellow-400{--tw-bg-opacity: 1;background-color:rgb(250 204 21 / var(--tw-bg-opacity, 1))}.bg-yellow-50{--tw-bg-opacity: 1;background-color:rgb(254 252 232 / var(--tw-bg-opacity, 1))}.bg-yellow-500{--tw-bg-opacity: 1;background-color:rgb(234 179 8 / var(--tw-bg-opacity, 1))}.bg-yellow-500\/10{background-color:#eab3081a}.bg-yellow-500\/15{background-color:#eab30826}.bg-yellow-900\/20{background-color:#713f1233}.bg-zinc-100{--tw-bg-opacity: 1;background-color:rgb(244 244 245 / var(--tw-bg-opacity, 1))}.bg-zinc-100\/80{background-color:#f4f4f5cc}.bg-zinc-200{--tw-bg-opacity: 1;background-color:rgb(228 228 231 / var(--tw-bg-opacity, 1))}.bg-zinc-200\/50{background-color:#e4e4e780}.bg-zinc-300{--tw-bg-opacity: 1;background-color:rgb(212 212 216 / var(--tw-bg-opacity, 1))}.bg-zinc-400{--tw-bg-opacity: 1;background-color:rgb(161 161 170 / var(--tw-bg-opacity, 1))}.bg-zinc-50{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.bg-zinc-50\/50{background-color:#fafafa80}.bg-zinc-50\/80{background-color:#fafafacc}.bg-zinc-500{--tw-bg-opacity: 1;background-color:rgb(113 113 122 / var(--tw-bg-opacity, 1))}.bg-zinc-500\/50{background-color:#71717a80}.bg-zinc-600{--tw-bg-opacity: 1;background-color:rgb(82 82 91 / var(--tw-bg-opacity, 1))}.bg-zinc-600\/30{background-color:#52525b4d}.bg-zinc-700{--tw-bg-opacity: 1;background-color:rgb(63 63 70 / var(--tw-bg-opacity, 1))}.bg-zinc-700\/30{background-color:#3f3f464d}.bg-zinc-700\/50{background-color:#3f3f4680}.bg-zinc-700\/60{background-color:#3f3f4699}.bg-zinc-700\/80{background-color:#3f3f46cc}.bg-zinc-800{--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity, 1))}.bg-zinc-800\/40{background-color:#27272a66}.bg-zinc-800\/50{background-color:#27272a80}.bg-zinc-800\/60{background-color:#27272a99}.bg-zinc-800\/80{background-color:#27272acc}.bg-zinc-800\/90{background-color:#27272ae6}.bg-zinc-800\/95{background-color:#27272af2}.bg-zinc-900{--tw-bg-opacity: 1;background-color:rgb(24 24 27 / var(--tw-bg-opacity, 1))}.bg-zinc-900\/20{background-color:#18181b33}.bg-zinc-900\/25{background-color:#18181b40}.bg-zinc-900\/30{background-color:#18181b4d}.bg-zinc-900\/40{background-color:#18181b66}.bg-zinc-900\/50{background-color:#18181b80}.bg-zinc-900\/60{background-color:#18181b99}.bg-zinc-900\/70{background-color:#18181bb3}.bg-zinc-900\/80{background-color:#18181bcc}.bg-zinc-900\/85{background-color:#18181bd9}.bg-zinc-900\/90{background-color:#18181be6}.bg-zinc-900\/95{background-color:#18181bf2}.bg-zinc-950{--tw-bg-opacity: 1;background-color:rgb(9 9 11 / var(--tw-bg-opacity, 1))}.bg-zinc-950\/50{background-color:#09090b80}.bg-zinc-950\/60{background-color:#09090b99}.bg-opacity-50{--tw-bg-opacity: .5}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.from-black\/80{--tw-gradient-from: rgb(0 0 0 / .8) var(--tw-gradient-from-position);--tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-blue-600{--tw-gradient-from: #2563eb var(--tw-gradient-from-position);--tw-gradient-to: rgb(37 99 235 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-green-600{--tw-gradient-from: #16a34a var(--tw-gradient-from-position);--tw-gradient-to: rgb(22 163 74 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-zinc-400{--tw-gradient-from: #a1a1aa var(--tw-gradient-from-position);--tw-gradient-to: rgb(161 161 170 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-zinc-500{--tw-gradient-from: #71717a var(--tw-gradient-from-position);--tw-gradient-to: rgb(113 113 122 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.via-zinc-500{--tw-gradient-to: rgb(113 113 122 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), #71717a var(--tw-gradient-via-position), var(--tw-gradient-to)}.via-zinc-600{--tw-gradient-to: rgb(82 82 91 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), #52525b var(--tw-gradient-via-position), var(--tw-gradient-to)}.to-emerald-600{--tw-gradient-to: #059669 var(--tw-gradient-to-position)}.to-indigo-600{--tw-gradient-to: #4f46e5 var(--tw-gradient-to-position)}.to-transparent{--tw-gradient-to: transparent var(--tw-gradient-to-position)}.to-zinc-700{--tw-gradient-to: #3f3f46 var(--tw-gradient-to-position)}.to-zinc-800{--tw-gradient-to: #27272a var(--tw-gradient-to-position)}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.object-center{-o-object-position:center;object-position:center}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-0{padding-bottom:0}.pb-0\.5{padding-bottom:.125rem}.pb-1{padding-bottom:.25rem}.pb-1\.5{padding-bottom:.375rem}.pb-14{padding-bottom:3.5rem}.pb-2{padding-bottom:.5rem}.pb-2\.5{padding-bottom:.625rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pl-1{padding-left:.25rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pr-1{padding-right:.25rem}.pr-1\.5{padding-right:.375rem}.pr-10{padding-right:2.5rem}.pr-2{padding-right:.5rem}.pr-5{padding-right:1.25rem}.pr-8{padding-right:2rem}.pt-0{padding-top:0}.pt-1{padding-top:.25rem}.pt-1\.5{padding-top:.375rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.align-bottom{vertical-align:bottom}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.font-sans{font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji"}.text-2xl{font-size:1.5rem;line-height:2rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[min\(28vw\,180px\)\]{font-size:min(28vw,180px)}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-black{font-weight:900}.font-bold{font-weight:700}.font-extralight{font-weight:200}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-\[0\]{line-height:0}.leading-\[1\.15\]{line-height:1.15}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-\[0\.3em\]{letter-spacing:.3em}.tracking-tight{letter-spacing:-.025em}.tracking-tighter{letter-spacing:-.05em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-amber-300{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.text-amber-300\/80{color:#fcd34dcc}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-amber-500{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-amber-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-amber-600\/90{color:#d97706e6}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-amber-800{--tw-text-opacity: 1;color:rgb(146 64 14 / var(--tw-text-opacity, 1))}.text-amber-950{--tw-text-opacity: 1;color:rgb(69 26 3 / var(--tw-text-opacity, 1))}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.text-black\/70{color:#000000b3}.text-blue-200{--tw-text-opacity: 1;color:rgb(191 219 254 / var(--tw-text-opacity, 1))}.text-blue-300{--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-blue-900{--tw-text-opacity: 1;color:rgb(30 58 138 / var(--tw-text-opacity, 1))}.text-current{color:currentColor}.text-cyan-300{--tw-text-opacity: 1;color:rgb(103 232 249 / var(--tw-text-opacity, 1))}.text-cyan-400{--tw-text-opacity: 1;color:rgb(34 211 238 / var(--tw-text-opacity, 1))}.text-cyan-500{--tw-text-opacity: 1;color:rgb(6 182 212 / var(--tw-text-opacity, 1))}.text-cyan-600{--tw-text-opacity: 1;color:rgb(8 145 178 / var(--tw-text-opacity, 1))}.text-cyan-700{--tw-text-opacity: 1;color:rgb(14 116 144 / var(--tw-text-opacity, 1))}.text-emerald-300{--tw-text-opacity: 1;color:rgb(110 231 183 / var(--tw-text-opacity, 1))}.text-emerald-400{--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.text-emerald-500{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.text-emerald-600{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity, 1))}.text-emerald-700{--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.text-gray-100{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.text-gray-200{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-gray-900\/90{color:#111827e6}.text-green-300{--tw-text-opacity: 1;color:rgb(134 239 172 / var(--tw-text-opacity, 1))}.text-green-300\/80{color:#86efaccc}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-500\/90{color:#22c55ee6}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-green-800{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.text-inherit{color:inherit}.text-orange-200{--tw-text-opacity: 1;color:rgb(254 215 170 / var(--tw-text-opacity, 1))}.text-orange-300{--tw-text-opacity: 1;color:rgb(253 186 116 / var(--tw-text-opacity, 1))}.text-orange-400{--tw-text-opacity: 1;color:rgb(251 146 60 / var(--tw-text-opacity, 1))}.text-orange-500{--tw-text-opacity: 1;color:rgb(249 115 22 / var(--tw-text-opacity, 1))}.text-orange-700{--tw-text-opacity: 1;color:rgb(194 65 12 / var(--tw-text-opacity, 1))}.text-orange-900{--tw-text-opacity: 1;color:rgb(124 45 18 / var(--tw-text-opacity, 1))}.text-pink-400{--tw-text-opacity: 1;color:rgb(244 114 182 / var(--tw-text-opacity, 1))}.text-pink-600{--tw-text-opacity: 1;color:rgb(219 39 119 / var(--tw-text-opacity, 1))}.text-pink-800{--tw-text-opacity: 1;color:rgb(157 23 77 / var(--tw-text-opacity, 1))}.text-purple-300{--tw-text-opacity: 1;color:rgb(216 180 254 / var(--tw-text-opacity, 1))}.text-purple-400{--tw-text-opacity: 1;color:rgb(192 132 252 / var(--tw-text-opacity, 1))}.text-purple-400\/60{color:#c084fc99}.text-purple-500{--tw-text-opacity: 1;color:rgb(168 85 247 / var(--tw-text-opacity, 1))}.text-purple-600{--tw-text-opacity: 1;color:rgb(147 51 234 / var(--tw-text-opacity, 1))}.text-purple-600\/60{color:#9333ea99}.text-purple-700{--tw-text-opacity: 1;color:rgb(126 34 206 / var(--tw-text-opacity, 1))}.text-red-200{--tw-text-opacity: 1;color:rgb(254 202 202 / var(--tw-text-opacity, 1))}.text-red-300{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-red-400\/90{color:#f87171e6}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-violet-200{--tw-text-opacity: 1;color:rgb(221 214 254 / var(--tw-text-opacity, 1))}.text-violet-300{--tw-text-opacity: 1;color:rgb(196 181 253 / var(--tw-text-opacity, 1))}.text-violet-400{--tw-text-opacity: 1;color:rgb(167 139 250 / var(--tw-text-opacity, 1))}.text-violet-500{--tw-text-opacity: 1;color:rgb(139 92 246 / var(--tw-text-opacity, 1))}.text-violet-600{--tw-text-opacity: 1;color:rgb(124 58 237 / var(--tw-text-opacity, 1))}.text-violet-700{--tw-text-opacity: 1;color:rgb(109 40 217 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-white\/40{color:#fff6}.text-white\/50{color:#ffffff80}.text-white\/60{color:#fff9}.text-white\/70{color:#ffffffb3}.text-white\/80{color:#fffc}.text-white\/90{color:#ffffffe6}.text-yellow-300{--tw-text-opacity: 1;color:rgb(253 224 71 / var(--tw-text-opacity, 1))}.text-yellow-400{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.text-yellow-500{--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.text-yellow-600{--tw-text-opacity: 1;color:rgb(202 138 4 / var(--tw-text-opacity, 1))}.text-yellow-700{--tw-text-opacity: 1;color:rgb(161 98 7 / var(--tw-text-opacity, 1))}.text-yellow-800{--tw-text-opacity: 1;color:rgb(133 77 14 / var(--tw-text-opacity, 1))}.text-zinc-100{--tw-text-opacity: 1;color:rgb(244 244 245 / var(--tw-text-opacity, 1))}.text-zinc-200{--tw-text-opacity: 1;color:rgb(228 228 231 / var(--tw-text-opacity, 1))}.text-zinc-300{--tw-text-opacity: 1;color:rgb(212 212 216 / var(--tw-text-opacity, 1))}.text-zinc-400{--tw-text-opacity: 1;color:rgb(161 161 170 / var(--tw-text-opacity, 1))}.text-zinc-50{--tw-text-opacity: 1;color:rgb(250 250 250 / var(--tw-text-opacity, 1))}.text-zinc-500{--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.text-zinc-600{--tw-text-opacity: 1;color:rgb(82 82 91 / var(--tw-text-opacity, 1))}.text-zinc-700{--tw-text-opacity: 1;color:rgb(63 63 70 / var(--tw-text-opacity, 1))}.text-zinc-800{--tw-text-opacity: 1;color:rgb(39 39 42 / var(--tw-text-opacity, 1))}.text-zinc-900{--tw-text-opacity: 1;color:rgb(24 24 27 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.line-through{text-decoration-line:line-through}.placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(156 163 175 / var(--tw-placeholder-opacity, 1))}.placeholder-gray-400::placeholder{--tw-placeholder-opacity: 1;color:rgb(156 163 175 / var(--tw-placeholder-opacity, 1))}.placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(107 114 128 / var(--tw-placeholder-opacity, 1))}.placeholder-gray-500::placeholder{--tw-placeholder-opacity: 1;color:rgb(107 114 128 / var(--tw-placeholder-opacity, 1))}.placeholder-white\/50::-moz-placeholder{color:#ffffff80}.placeholder-white\/50::placeholder{color:#ffffff80}.placeholder-zinc-400::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(161 161 170 / var(--tw-placeholder-opacity, 1))}.placeholder-zinc-400::placeholder{--tw-placeholder-opacity: 1;color:rgb(161 161 170 / var(--tw-placeholder-opacity, 1))}.placeholder-zinc-500::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(113 113 122 / var(--tw-placeholder-opacity, 1))}.placeholder-zinc-500::placeholder{--tw-placeholder-opacity: 1;color:rgb(113 113 122 / var(--tw-placeholder-opacity, 1))}.placeholder-zinc-600::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(82 82 91 / var(--tw-placeholder-opacity, 1))}.placeholder-zinc-600::placeholder{--tw-placeholder-opacity: 1;color:rgb(82 82 91 / var(--tw-placeholder-opacity, 1))}.accent-blue-500{accent-color:#3b82f6}.accent-blue-600{accent-color:#2563eb}.accent-zinc-100{accent-color:#f4f4f5}.accent-zinc-400{accent-color:#a1a1aa}.accent-zinc-500{accent-color:#71717a}.opacity-0{opacity:0}.opacity-10{opacity:.1}.opacity-100{opacity:1}.opacity-20{opacity:.2}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.opacity-\[0\.38\]{opacity:.38}.\!shadow-none{--tw-shadow: 0 0 #0000 !important;--tw-shadow-colored: 0 0 #0000 !important;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)!important}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_10px_rgba\(0\,0\,0\,0\.5\)\]{--tw-shadow: 0 0 10px rgba(0,0,0,.5);--tw-shadow-colored: 0 0 10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_10px_rgba\(255\,255\,255\,0\.5\)\]{--tw-shadow: 0 0 10px rgba(255,255,255,.5);--tw-shadow-colored: 0 0 10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_6px_rgba\(234\,179\,8\,0\.6\)\]{--tw-shadow: 0 0 6px rgba(234,179,8,.6);--tw-shadow-colored: 0 0 6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_6px_rgba\(34\,197\,94\,0\.6\)\]{--tw-shadow: 0 0 6px rgba(34,197,94,.6);--tw-shadow-colored: 0 0 6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_8px_rgba\(34\,197\,94\,0\.8\)\]{--tw-shadow: 0 0 8px rgba(34,197,94,.8);--tw-shadow-colored: 0 0 8px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_8px_rgba\(37\,99\,235\,0\.45\)\]{--tw-shadow: 0 0 8px rgba(37,99,235,.45);--tw-shadow-colored: 0 0 8px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.12\)\]{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.12);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.2\)\]{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.2);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-inner{--tw-shadow: inset 0 2px 4px 0 rgb(0 0 0 / .05);--tw-shadow-colored: inset 0 2px 4px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-none{--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-amber-500\/20{--tw-shadow-color: rgb(245 158 11 / .2);--tw-shadow: var(--tw-shadow-colored)}.shadow-black\/20{--tw-shadow-color: rgb(0 0 0 / .2);--tw-shadow: var(--tw-shadow-colored)}.shadow-blue-500\/30{--tw-shadow-color: rgb(59 130 246 / .3);--tw-shadow: var(--tw-shadow-colored)}.shadow-blue-900\/20{--tw-shadow-color: rgb(30 58 138 / .2);--tw-shadow: var(--tw-shadow-colored)}.shadow-pink-200\/30{--tw-shadow-color: rgb(251 207 232 / .3);--tw-shadow: var(--tw-shadow-colored)}.shadow-pink-950\/20{--tw-shadow-color: rgb(80 7 36 / .2);--tw-shadow: var(--tw-shadow-colored)}.shadow-violet-500\/20{--tw-shadow-color: rgb(139 92 246 / .2);--tw-shadow: var(--tw-shadow-colored)}.shadow-violet-600\/20{--tw-shadow-color: rgb(124 58 237 / .2);--tw-shadow: var(--tw-shadow-colored)}.shadow-white\/20{--tw-shadow-color: rgb(255 255 255 / .2);--tw-shadow: var(--tw-shadow-colored)}.shadow-zinc-400\/20{--tw-shadow-color: rgb(161 161 170 / .2);--tw-shadow: var(--tw-shadow-colored)}.\!outline-none{outline:2px solid transparent!important;outline-offset:2px!important}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-4{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-inset{--tw-ring-inset: inset}.ring-amber-200{--tw-ring-opacity: 1;--tw-ring-color: rgb(253 230 138 / var(--tw-ring-opacity, 1))}.ring-amber-500\/20{--tw-ring-color: rgb(245 158 11 / .2)}.ring-black\/5{--tw-ring-color: rgb(0 0 0 / .05)}.ring-blue-200{--tw-ring-opacity: 1;--tw-ring-color: rgb(191 219 254 / var(--tw-ring-opacity, 1))}.ring-blue-400{--tw-ring-opacity: 1;--tw-ring-color: rgb(96 165 250 / var(--tw-ring-opacity, 1))}.ring-blue-400\/50{--tw-ring-color: rgb(96 165 250 / .5)}.ring-blue-500{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}.ring-blue-500\/30{--tw-ring-color: rgb(59 130 246 / .3)}.ring-blue-500\/50{--tw-ring-color: rgb(59 130 246 / .5)}.ring-emerald-400{--tw-ring-opacity: 1;--tw-ring-color: rgb(52 211 153 / var(--tw-ring-opacity, 1))}.ring-emerald-500{--tw-ring-opacity: 1;--tw-ring-color: rgb(16 185 129 / var(--tw-ring-opacity, 1))}.ring-green-200{--tw-ring-opacity: 1;--tw-ring-color: rgb(187 247 208 / var(--tw-ring-opacity, 1))}.ring-green-500{--tw-ring-opacity: 1;--tw-ring-color: rgb(34 197 94 / var(--tw-ring-opacity, 1))}.ring-green-500\/20{--tw-ring-color: rgb(34 197 94 / .2)}.ring-green-500\/30{--tw-ring-color: rgb(34 197 94 / .3)}.ring-orange-500\/30{--tw-ring-color: rgb(249 115 22 / .3)}.ring-purple-500\/30{--tw-ring-color: rgb(168 85 247 / .3)}.ring-red-200{--tw-ring-opacity: 1;--tw-ring-color: rgb(254 202 202 / var(--tw-ring-opacity, 1))}.ring-red-500\/20{--tw-ring-color: rgb(239 68 68 / .2)}.ring-red-500\/30{--tw-ring-color: rgb(239 68 68 / .3)}.ring-white\/30{--tw-ring-color: rgb(255 255 255 / .3)}.ring-white\/40{--tw-ring-color: rgb(255 255 255 / .4)}.ring-white\/50{--tw-ring-color: rgb(255 255 255 / .5)}.ring-zinc-400\/30{--tw-ring-color: rgb(161 161 170 / .3)}.ring-offset-1{--tw-ring-offset-width: 1px}.ring-offset-2{--tw-ring-offset-width: 2px}.ring-offset-transparent{--tw-ring-offset-color: transparent}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.blur-\[50px\]{--tw-blur: blur(50px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow{--tw-drop-shadow: drop-shadow(0 1px 2px rgb(0 0 0 / .1)) drop-shadow(0 1px 1px rgb(0 0 0 / .06));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-md{--tw-drop-shadow: drop-shadow(0 4px 3px rgb(0 0 0 / .07)) drop-shadow(0 2px 2px rgb(0 0 0 / .06));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.sepia{--tw-sepia: sepia(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-0{--tw-backdrop-blur: blur(0);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-\[1px\]{--tw-backdrop-blur: blur(1px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-\[2px\]{--tw-backdrop-blur: blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-md{--tw-backdrop-blur: blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-xl{--tw-backdrop-blur: blur(24px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\,height\]{transition-property:width,height;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-linear{transition-timing-function:linear}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[-\:\\s\|\]{-: s|}.\[appearance\:textfield\]{-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.\[color-scheme\:dark\]{color-scheme:dark}.\[color-scheme\:light\]{color-scheme:light}.\[transform-style\:preserve-3d\]{transform-style:preserve-3d}html.qdm-app-cursor{cursor:url("data:image/svg+xml,%3csvg%20height='32'%20width='32'%20viewBox='0%200%2032%2032'%20xmlns='http://www.w3.org/2000/svg'%20style='color:%20black;'%3e%3cdefs%3e%3cfilter%20id='shadow'%20y='-40%25'%20x='-40%25'%20width='180px'%20height='180%25'%20color-interpolation-filters='sRGB'%3e%3cfeDropShadow%20dx='1'%20dy='1'%20stdDeviation='1.2'%20flood-opacity='.5'/%3e%3c/filter%3e%3c/defs%3e%3cg%20fill='none'%20transform='rotate(0%2016%2016)'%20filter='url(%23shadow)'%3e%3cpath%20d='m12%2024.4219v-16.015l11.591%2011.619h-6.781l-.411.124z'%20fill='white'/%3e%3cpath%20d='m21.0845%2025.0962-3.605%201.535-4.682-11.089%203.686-1.553z'%20fill='white'/%3e%3cpath%20d='m19.751%2024.4155-1.844.774-3.1-7.374%201.841-.775z'%20fill='black'/%3e%3cpath%20d='m13%2010.814v11.188l2.969-2.866.428-.139h4.768z'%20fill='black'/%3e%3c/g%3e%3c/svg%3e") 12 10,default!important}#canvas-bg.canvas-custom-cursor{cursor:url("data:image/svg+xml,%3Csvg%20height=%2732%27%20width=%2732%27%20viewBox=%270%200%2032%2032%27%20xmlns=%27http://www.w3.org/2000/svg%27%20style=%27color:%20black;%27%3E%3Cdefs%3E%3Cfilter%20id=%27shadow%27%20y=%27-40%25%27%20x=%27-40%25%27%20width=%27180px%27%20height=%27180%25%27%20color-interpolation-filters=%27sRGB%27%3E%3CfeDropShadow%20dx=%271%27%20dy=%271%27%20stdDeviation=%271.2%27%20flood-opacity=%27.5%27/%3E%3C/filter%3E%3C/defs%3E%3Cg%20fill=%27none%27%20transform=%27rotate(0%2016%2016)%27%20filter=%27url(%23shadow)%27%3E%3Cpath%20d=%27m12%2024.4219v-16.015l11.591%2011.619h-6.781l-.411.124z%27%20fill=%27white%27/%3E%3Cpath%20d=%27m21.0845%2025.0962-3.605%201.535-4.682-11.089%203.686-1.553z%27%20fill=%27white%27/%3E%3Cpath%20d=%27m19.751%2024.4155-1.844.774-3.1-7.374%201.841-.775z%27%20fill=%27black%27/%3E%3Cpath%20d=%27m13%2010.814v11.188l2.969-2.866.428-.139h4.768z%27%20fill=%27black%27/%3E%3C/g%3E%3C/svg%3E") 12 10,default!important}#canvas-bg.canvas-custom-cursor *{cursor:inherit!important}#canvas-bg.canvas-custom-cursor .resize-handle-corner,#canvas-bg.canvas-custom-cursor .resize-handle-corner *{cursor:url("data:image/svg+xml,%3Csvg%20height=%2732%27%20width=%2732%27%20viewBox=%270%200%2032%2032%27%20xmlns=%27http://www.w3.org/2000/svg%27%20style=%27color:%20black;%27%3E%3Cdefs%3E%3Cfilter%20id=%27shadow%27%20y=%27-40%25%27%20x=%27-40%25%27%20width=%27180px%27%20height=%27180%25%27%20color-interpolation-filters=%27sRGB%27%3E%3CfeDropShadow%20dx=%271%27%20dy=%271%27%20stdDeviation=%271.2%27%20flood-opacity=%27.5%27/%3E%3C/filter%3E%3C/defs%3E%3Cg%20fill=%27none%27%20transform=%27rotate(0%2016%2016)%27%20filter=%27url(%23shadow)%27%3E%3Cpath%20d=%27m19.7432%2017.0869-4.072%204.068%202.829%202.828-8.473-.013-.013-8.47%202.841%202.842%204.075-4.068%201.414-1.415-2.844-2.842h8.486v8.484l-2.83-2.827z%27%20fill=%27%23fff%27/%3E%3Cpath%20d=%27m18.6826%2016.7334-4.427%204.424%201.828%201.828-5.056-.016-.014-5.054%201.842%201.841%204.428-4.422%202.474-2.475-1.844-1.843h5.073v5.071l-1.83-1.828z%27%20fill=%27%23000%27/%3E%3C/g%3E%3C/svg%3E") 16 16,nwse-resize!important}#canvas-bg.canvas-custom-cursor .resize-handle-top-bottom,#canvas-bg.canvas-custom-cursor .resize-handle-top-bottom *{cursor:url("data:image/svg+xml,%3Csvg%20height=%2732%27%20width=%2732%27%20viewBox=%270%200%2032%2032%27%20xmlns=%27http://www.w3.org/2000/svg%27%20style=%27color:%20black;%27%3E%3Cdefs%3E%3Cfilter%20id=%27shadow%27%20y=%27-40%25%27%20x=%27-40%25%27%20width=%27180px%27%20height=%27180%25%27%20color-interpolation-filters=%27sRGB%27%3E%3CfeDropShadow%20dx=%271%27%20dy=%27-0.9999999999999999%27%20stdDeviation=%271.2%27%20flood-opacity=%27.5%27/%3E%3C/filter%3E%3C/defs%3E%3Cg%20fill=%27none%27%20transform=%27rotate(90%2016%2016)%27%20filter=%27url(%23shadow)%27%3E%3Cpath%20d=%27m9%2017.9907v.005l5.997%205.996.001-3.999h1.999%202.02v4l5.98-6.001-5.98-5.999.001%204.019-2.021.002h-2l.001-4.022zm1.411.003%203.587-3.588-.001%202.587h3.5%202.521v-2.585l3.565%203.586-3.564%203.585-.001-2.585h-2.521l-3.499-.001-.001%202.586z%27%20fill=%27%23fff%27/%3E%3Cpath%20d=%27m17.4971%2018.9932h2.521v2.586l3.565-3.586-3.565-3.585v2.605h-2.521-3.5v-2.607l-3.586%203.587%203.586%203.586v-2.587z%27%20fill=%27%23000%27/%3E%3C/g%3E%3C/svg%3E") 16 16,ns-resize!important}html input[type=range],body input[type=range],input[type=range]{cursor:url("data:image/svg+xml,%3Csvg%20height=%2732%27%20width=%2732%27%20viewBox=%270%200%2032%2032%27%20xmlns=%27http://www.w3.org/2000/svg%27%20style=%27color:%20black;%27%3E%3Cdefs%3E%3Cfilter%20id=%27shadow%27%20y=%27-40%25%27%20x=%27-40%25%27%20width=%27180px%27%20height=%27180%25%27%20color-interpolation-filters=%27sRGB%27%3E%3CfeDropShadow%20dx=%271%27%20dy=%271%27%20stdDeviation=%271.2%27%20flood-opacity=%27.5%27/%3E%3C/filter%3E%3C/defs%3E%3Cg%20fill=%27none%27%20transform=%27rotate(0%2016%2016)%27%20filter=%27url(%23shadow)%27%3E%3Cpath%20d=%27m12%2024.4219v-16.015l11.591%2011.619h-6.781l-.411.124z%27%20fill=%27white%27/%3E%3Cpath%20d=%27m21.0845%2025.0962-3.605%201.535-4.682-11.089%203.686-1.553z%27%20fill=%27white%27/%3E%3Cpath%20d=%27m19.751%2024.4155-1.844.774-3.1-7.374%201.841-.775z%27%20fill=%27black%27/%3E%3Cpath%20d=%27m13%2010.814v11.188l2.969-2.866.428-.139h4.768z%27%20fill=%27black%27/%3E%3C/g%3E%3C/svg%3E") 12 10,pointer!important}html input[type=range]::-webkit-slider-thumb,body input[type=range]::-webkit-slider-thumb,input[type=range]::-webkit-slider-thumb{cursor:url("data:image/svg+xml,%3Csvg%20height=%2732%27%20width=%2732%27%20viewBox=%270%200%2032%2032%27%20xmlns=%27http://www.w3.org/2000/svg%27%20style=%27color:%20black;%27%3E%3Cdefs%3E%3Cfilter%20id=%27shadow%27%20y=%27-40%25%27%20x=%27-40%25%27%20width=%27180px%27%20height=%27180%25%27%20color-interpolation-filters=%27sRGB%27%3E%3CfeDropShadow%20dx=%271%27%20dy=%271%27%20stdDeviation=%271.2%27%20flood-opacity=%27.5%27/%3E%3C/filter%3E%3C/defs%3E%3Cg%20fill=%27none%27%20transform=%27rotate(0%2016%2016)%27%20filter=%27url(%23shadow)%27%3E%3Cpath%20d=%27m12%2024.4219v-16.015l11.591%2011.619h-6.781l-.411.124z%27%20fill=%27white%27/%3E%3Cpath%20d=%27m21.0845%2025.0962-3.605%201.535-4.682-11.089%203.686-1.553z%27%20fill=%27white%27/%3E%3Cpath%20d=%27m19.751%2024.4155-1.844.774-3.1-7.374%201.841-.775z%27%20fill=%27black%27/%3E%3Cpath%20d=%27m13%2010.814v11.188l2.969-2.866.428-.139h4.768z%27%20fill=%27black%27/%3E%3C/g%3E%3C/svg%3E") 12 10,pointer!important}html input[type=range]::-moz-range-thumb,body input[type=range]::-moz-range-thumb,input[type=range]::-moz-range-thumb{cursor:url("data:image/svg+xml,%3Csvg%20height=%2732%27%20width=%2732%27%20viewBox=%270%200%2032%2032%27%20xmlns=%27http://www.w3.org/2000/svg%27%20style=%27color:%20black;%27%3E%3Cdefs%3E%3Cfilter%20id=%27shadow%27%20y=%27-40%25%27%20x=%27-40%25%27%20width=%27180px%27%20height=%27180%25%27%20color-interpolation-filters=%27sRGB%27%3E%3CfeDropShadow%20dx=%271%27%20dy=%271%27%20stdDeviation=%271.2%27%20flood-opacity=%27.5%27/%3E%3C/filter%3E%3C/defs%3E%3Cg%20fill=%27none%27%20transform=%27rotate(0%2016%2016)%27%20filter=%27url(%23shadow)%27%3E%3Cpath%20d=%27m12%2024.4219v-16.015l11.591%2011.619h-6.781l-.411.124z%27%20fill=%27white%27/%3E%3Cpath%20d=%27m21.0845%2025.0962-3.605%201.535-4.682-11.089%203.686-1.553z%27%20fill=%27white%27/%3E%3Cpath%20d=%27m19.751%2024.4155-1.844.774-3.1-7.374%201.841-.775z%27%20fill=%27black%27/%3E%3Cpath%20d=%27m13%2010.814v11.188l2.969-2.866.428-.139h4.768z%27%20fill=%27black%27/%3E%3C/g%3E%3C/svg%3E") 12 10,pointer!important}html input[type=range].cursor-pointer,body input[type=range].cursor-pointer,input[type=range].cursor-pointer,html input[type=range].cursor-pointer::-webkit-slider-thumb,body input[type=range].cursor-pointer::-webkit-slider-thumb,input[type=range].cursor-pointer::-webkit-slider-thumb,html input[type=range].cursor-pointer::-moz-range-thumb,body input[type=range].cursor-pointer::-moz-range-thumb,input[type=range].cursor-pointer::-moz-range-thumb{cursor:url("data:image/svg+xml,%3Csvg%20height=%2732%27%20width=%2732%27%20viewBox=%270%200%2032%2032%27%20xmlns=%27http://www.w3.org/2000/svg%27%20style=%27color:%20black;%27%3E%3Cdefs%3E%3Cfilter%20id=%27shadow%27%20y=%27-40%25%27%20x=%27-40%25%27%20width=%27180px%27%20height=%27180%25%27%20color-interpolation-filters=%27sRGB%27%3E%3CfeDropShadow%20dx=%271%27%20dy=%271%27%20stdDeviation=%271.2%27%20flood-opacity=%27.5%27/%3E%3C/filter%3E%3C/defs%3E%3Cg%20fill=%27none%27%20transform=%27rotate(0%2016%2016)%27%20filter=%27url(%23shadow)%27%3E%3Cpath%20d=%27m12%2024.4219v-16.015l11.591%2011.619h-6.781l-.411.124z%27%20fill=%27white%27/%3E%3Cpath%20d=%27m21.0845%2025.0962-3.605%201.535-4.682-11.089%203.686-1.553z%27%20fill=%27white%27/%3E%3Cpath%20d=%27m19.751%2024.4155-1.844.774-3.1-7.374%201.841-.775z%27%20fill=%27black%27/%3E%3Cpath%20d=%27m13%2010.814v11.188l2.969-2.866.428-.139h4.768z%27%20fill=%27black%27/%3E%3C/g%3E%3C/svg%3E") 12 10,pointer!important}#canvas-bg.canvas-custom-cursor input[type=range],#canvas-bg.canvas-custom-cursor input[type=range]::-webkit-slider-thumb,#canvas-bg.canvas-custom-cursor input[type=range]::-moz-range-thumb,#canvas-bg.canvas-custom-cursor input[type=range].cursor-pointer,#canvas-bg.canvas-custom-cursor input[type=range].cursor-pointer::-webkit-slider-thumb,#canvas-bg.canvas-custom-cursor input[type=range].cursor-pointer::-moz-range-thumb{cursor:url("data:image/svg+xml,%3csvg%20height='32'%20width='32'%20viewBox='0%200%2032%2032'%20xmlns='http://www.w3.org/2000/svg'%20style='color:%20black;'%3e%3cdefs%3e%3cfilter%20id='shadow'%20y='-40%25'%20x='-40%25'%20width='180px'%20height='180%25'%20color-interpolation-filters='sRGB'%3e%3cfeDropShadow%20dx='1'%20dy='1'%20stdDeviation='1.2'%20flood-opacity='.5'/%3e%3c/filter%3e%3c/defs%3e%3cg%20fill='none'%20transform='rotate(0%2016%2016)'%20filter='url(%23shadow)'%3e%3cpath%20d='m12%2024.4219v-16.015l11.591%2011.619h-6.781l-.411.124z'%20fill='white'/%3e%3cpath%20d='m21.0845%2025.0962-3.605%201.535-4.682-11.089%203.686-1.553z'%20fill='white'/%3e%3cpath%20d='m19.751%2024.4155-1.844.774-3.1-7.374%201.841-.775z'%20fill='black'/%3e%3cpath%20d='m13%2010.814v11.188l2.969-2.866.428-.139h4.768z'%20fill='black'/%3e%3c/g%3e%3c/svg%3e") 12 10,pointer!important}#canvas-bg.canvas-custom-cursor .resize-handle-side,#canvas-bg.canvas-custom-cursor .resize-handle-side *{cursor:url("data:image/svg+xml,%3Csvg%20height=%2732%27%20width=%2732%27%20viewBox=%270%200%2032%2032%27%20xmlns=%27http://www.w3.org/2000/svg%27%20style=%27color:%20black;%27%3E%3Cdefs%3E%3Cfilter%20id=%27shadow%27%20y=%27-40%25%27%20x=%27-40%25%27%20width=%27180px%27%20height=%27180%25%27%20color-interpolation-filters=%27sRGB%27%3E%3CfeDropShadow%20dx=%271%27%20dy=%271%27%20stdDeviation=%271.2%27%20flood-opacity=%27.5%27/%3E%3C/filter%3E%3C/defs%3E%3Cg%20fill=%27none%27%20transform=%27rotate(0%2016%2016)%27%20filter=%27url(%23shadow)%27%3E%3Cpath%20d=%27m9%2017.9907v.005l5.997%205.996.001-3.999h1.999%202.02v4l5.98-6.001-5.98-5.999.001%204.019-2.021.002h-2l.001-4.022zm1.411.003%203.587-3.588-.001%202.587h3.5%202.521v-2.585l3.565%203.586-3.564%203.585-.001-2.585h-2.521l-3.499-.001-.001%202.586z%27%20fill=%27%23fff%27/%3E%3Cpath%20d=%27m17.4971%2018.9932h2.521v2.586l3.565-3.586-3.565-3.585v2.605h-2.521-3.5v-2.607l-3.586%203.587%203.586%203.586v-2.587z%27%20fill=%27%23000%27/%3E%3C/g%3E%3C/svg%3E") 16 16,ew-resize!important}#canvas-bg.canvas-custom-cursor .resize-handle-corner-rb,#canvas-bg.canvas-custom-cursor .resize-handle-corner-rb *{cursor:url("data:image/svg+xml,%3Csvg%20height=%2732%27%20width=%2732%27%20viewBox=%270%200%2032%2032%27%20xmlns=%27http://www.w3.org/2000/svg%27%20style=%27color:%20black;%27%3E%3Cdefs%3E%3Cfilter%20id=%27shadow%27%20y=%27-40%25%27%20x=%27-40%25%27%20width=%27180px%27%20height=%27180%25%27%20color-interpolation-filters=%27sRGB%27%3E%3CfeDropShadow%20dx=%271%27%20dy=%27-0.9999999999999999%27%20stdDeviation=%271.2%27%20flood-opacity=%27.5%27/%3E%3C/filter%3E%3C/defs%3E%3Cg%20fill=%27none%27%20transform=%27rotate(90%2016%2016)%27%20filter=%27url(%23shadow)%27%3E%3Cpath%20d=%27m19.7432%2017.0869-4.072%204.068%202.829%202.828-8.473-.013-.013-8.47%202.841%202.842%204.075-4.068%201.414-1.415-2.844-2.842h8.486v8.484l-2.83-2.827z%27%20fill=%27%23fff%27/%3E%3Cpath%20d=%27m18.6826%2016.7334-4.427%204.424%201.828%201.828-5.056-.016-.014-5.054%201.842%201.841%204.428-4.422%202.474-2.475-1.844-1.843h5.073v5.071l-1.83-1.828z%27%20fill=%27%23000%27/%3E%3C/g%3E%3C/svg%3E") 16 16,nwse-resize!important}#canvas-bg.canvas-panning,#canvas-bg.canvas-panning *,#canvas-bg.canvas-text-dragging,#canvas-bg.canvas-text-dragging *{cursor:url("data:image/svg+xml,%3Csvg%20height=%2732%27%20width=%2732%27%20viewBox=%270%200%2032%2032%27%20xmlns=%27http://www.w3.org/2000/svg%27%20style=%27color:%20black;%27%3E%3Cdefs%3E%3Cfilter%20id=%27shadow%27%20y=%27-40%25%27%20x=%27-40%25%27%20width=%27180px%27%20height=%27180%25%27%20color-interpolation-filters=%27sRGB%27%3E%3CfeDropShadow%20dx=%271%27%20dy=%271%27%20stdDeviation=%271.2%27%20flood-opacity=%27.5%27/%3E%3C/filter%3E%3C/defs%3E%3Cg%20fill=%27none%27%20transform=%27rotate(0%2016%2016)%27%20filter=%27url(%23shadow)%27%3E%3Cpath%20d=%27m13.5732%2012.0361c.48-.178%201.427-.069%201.677.473.213.462.396%201.241.406%201.075.024-.369-.024-1.167.137-1.584.117-.304.347-.59.686-.691.285-.086.62-.116.916-.055.313.064.642.287.765.499.362.623.368%201.899.385%201.831.064-.272.07-1.229.283-1.584.141-.235.497-.445.687-.479.294-.052.656-.068.964-.008.249.049.586.344.677.487.219.344.342%201.316.379%201.658.016.141.074-.393.293-.736.406-.639%201.844-.763%201.898.639.026.654.02.624.02%201.064%200%20.516-.012.828-.04%201.202-.03.399-.116%201.304-.241%201.742-.086.301-.371.978-.653%201.384%200%200-1.074%201.25-1.191%201.812-.117.563-.078.567-.102.965-.023.399.121.923.121.923s-.801.104-1.234.034c-.391-.062-.875-.84-1-1.078-.172-.328-.539-.265-.682-.023-.224.383-.709%201.07-1.05%201.113-.669.084-2.055.03-3.14.02%200%200%20.185-1.011-.227-1.358-.305-.26-.83-.784-1.144-1.06l-.832-.921c-.283-.36-1.002-.929-1.243-1.985-.213-.936-.192-1.395.037-1.77.232-.381.67-.589.854-.625.208-.042.692-.039.875.062.223.123.313.159.488.391.23.307.312.456.213.121-.076-.262-.322-.595-.434-.97-.109-.361-.401-.943-.38-1.526.008-.221.103-.771.832-1.042%27%20fill=%27white%27/%3E%3Cg%20stroke=%27black%27%20stroke-width=%27.75%27%3E%3Cpath%20d=%27m13.5732%2012.0361c.48-.178%201.427-.069%201.677.473.213.462.396%201.241.406%201.075.024-.369-.024-1.167.137-1.584.117-.304.347-.59.686-.691.285-.086.62-.116.916-.055.313.064.642.287.765.499.362.623.368%201.899.385%201.831.064-.272.07-1.229.283-1.584.141-.235.497-.445.687-.479.294-.052.656-.068.964-.008.249.049.586.344.677.487.219.344.342%201.316.379%201.658.016.141.074-.393.293-.736.406-.639%201.844-.763%201.898.639.026.654.02.624.02%201.064%200%20.516-.012.828-.04%201.202-.03.399-.116%201.304-.241%201.742-.086.301-.371.978-.653%201.384%200%200-1.074%201.25-1.191%201.812-.117.563-.078.567-.102.965-.023.399.121.923.121.923s-.801.104-1.234.034c-.391-.062-.875-.84-1-1.078-.172-.328-.539-.265-.682-.023-.224.383-.709%201.07-1.05%201.113-.669.084-2.055.03-3.14.02%200%200%20.185-1.011-.227-1.358-.305-.26-.83-.784-1.144-1.06l-.832-.921c-.283-.36-1.002-.929-1.243-1.985-.213-.936-.192-1.395.037-1.77.232-.381.67-.589.854-.625.208-.042.692-.039.875.062.223.123.313.159.488.391.23.307.312.456.213.121-.076-.262-.322-.595-.434-.97-.109-.361-.401-.943-.38-1.526.008-.221.103-.771.832-1.042z%27%20stroke-linejoin=%27round%27/%3E%3Cpath%20d=%27m20.5664%2019.7344v-3.459%27%20stroke-linecap=%27round%27/%3E%3Cpath%20d=%27m18.5508%2019.7461-.016-3.473%27%20stroke-linecap=%27round%27/%3E%3Cpath%20d=%27m16.5547%2016.3047.021%203.426%27%20stroke-linecap=%27round%27/%3E%3C/g%3E%3C/g%3E%3C/svg%3E") 16 16,grabbing!important}#canvas-bg.canvas-text-create-cursor,#canvas-bg.canvas-text-create-cursor *{cursor:url("data:image/svg+xml,%3Csvg%20height%3D'32'%20width%3D'32'%20viewBox%3D'0%200%2032%2032'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20style%3D'color%3A%20black%3B'%3E%3Cdefs%3E%3Cfilter%20id%3D'shadow'%20y%3D'-40%25'%20x%3D'-40%25'%20width%3D'180px'%20height%3D'180%25'%20color-interpolation-filters%3D'sRGB'%3E%3CfeDropShadow%20dx%3D'1'%20dy%3D'1'%20stdDeviation%3D'1.2'%20flood-opacity%3D'.5'%2F%3E%3C%2Ffilter%3E%3C%2Fdefs%3E%3Cg%20fill%3D'none'%20transform%3D'rotate(0%2016%2016)'%20filter%3D'url(%23shadow)'%3E%3Cpath%20d%3D'm25%2016h-6.01v-6h-2.98v6h-6.01v3h6.01v6h2.98v-6h6.01z'%20fill%3D'white'%2F%3E%3Cpath%20d%3D'm23.9902%2017.0103h-6v-6.01h-.98v6.01h-6v.98h6v6.01h.98v-6.01h6z'%20fill%3D'%23231f1f'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E") 16 16,crosshair!important}#canvas-bg.canvas-doodle-cursor,#canvas-bg.canvas-doodle-cursor *{cursor:var(--app-doodle-cursor, crosshair),crosshair!important}.canvas-text-input-cursor,.canvas-text-input-cursor *{cursor:url("data:image/svg+xml,%3Csvg%20height%3D'32'%20width%3D'32'%20viewBox%3D'0%200%2032%2032'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20style%3D'color%3A%20black%3B'%3E%3Cdefs%3E%3Cfilter%20id%3D'shadow'%20y%3D'-40%25'%20x%3D'-40%25'%20width%3D'180px'%20height%3D'180%25'%20color-interpolation-filters%3D'sRGB'%3E%3CfeDropShadow%20dx%3D'1'%20dy%3D'1'%20stdDeviation%3D'1.2'%20flood-opacity%3D'.5'%2F%3E%3C%2Ffilter%3E%3C%2Fdefs%3E%3Cg%20fill%3D'none'%20transform%3D'rotate(0%2016%2016)'%20filter%3D'url(%23shadow)'%3E%3Cpath%20fill%3D'white'%20d%3D'M7.94%200a5.25%205.25%200%200%200-3.47%201.17A5.27%205.27%200%200%200%201%200H0v3h1c1.41%200%201.85.7%202%201v3.94H2v3h1v3c-.13.3-.57%201-2%201H0v3h1a5.27%205.27%200%200%200%203.47-1.17c.98.8%202.21%201.21%203.47%201.17h1v-3h-1c-1.41%200-1.85-.7-2-1v-3H7v-3H6V4c.13-.3.57-1%202-1h1V0H7.94z'%2F%3E%3Cpath%20fill%3D'black'%20d%3D'M7.94%202V1a4%204%200%200%200-3.47%201.64A4%204%200%200%200%201%201v1c1.3-.17%202.56.6%203%201.84v5.1H3v1h1v4.16c-.45%201.24-1.7%202-3%201.84v1a4.05%204.05%200%200%200%203.47-1.63%204.05%204.05%200%200%200%203.47%201.63v-1A2.82%202.82%200%200%201%205%2014.1V9.93h1v-1H5V3.85A2.81%202.81%200%200%201%207.94%202z'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E") 8 16,text!important}.canvas-text-editor-minimal{scrollbar-width:none;-ms-overflow-style:none}.canvas-text-editor-minimal::-webkit-scrollbar{width:0;height:0}*{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:geometricPrecision;font-feature-settings:"kern" 1}body,input,textarea,button,select{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-text{-webkit-user-select:text;-moz-user-select:text;user-select:text}.feature-control-password-input::-ms-reveal{display:none}.feature-control-password-input::-ms-clear{display:none}.rh-scroll-minimal{scrollbar-width:thin;scrollbar-color:rgba(113,113,122,.5) transparent}.rh-scroll-minimal::-webkit-scrollbar{width:6px;height:6px}.rh-scroll-minimal::-webkit-scrollbar-track{background:transparent}.rh-scroll-minimal::-webkit-scrollbar-thumb{background:#71717a80;border-radius:3px}.rh-scroll-minimal::-webkit-scrollbar-thumb:hover{background:#71717ab3}.rh-scroll-minimal::-webkit-scrollbar-button{display:none!important;height:0!important;width:0!important}.rh-scroll-minimal.scroll-no-buttons::-webkit-scrollbar-button{display:none!important;height:0!important;width:0!important}.node-wrapper{contain:layout style}.node-wrapper img,.node-wrapper video{image-rendering:auto}svg{shape-rendering:geometricPrecision;text-rendering:optimizeLegibility}.perf-mode .node-wrapper{box-shadow:none!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;transition:none!important}.perf-mode .connection-group{opacity:1!important}.interacting .node-wrapper,.canvas-interacting .node-wrapper,[data-interacting=true].node-wrapper{transition:none!important;box-shadow:none!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;filter:none!important;contain:layout style;transform-style:flat!important}[data-interacting=true] *,.interacting .node-wrapper *,.canvas-interacting .node-wrapper *{filter:none!important;backdrop-filter:none!important;-webkit-backdrop-filter:none!important}.interacting .node-wrapper,.canvas-interacting .node-wrapper,.interacting .node-wrapper *:not(.input-point):not(.connector),.canvas-interacting .node-wrapper *:not(.input-point):not(.connector){pointer-events:none!important;-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.interacting .node-wrapper .input-point,.interacting .node-wrapper .connector,.canvas-interacting .node-wrapper .input-point,.canvas-interacting .node-wrapper .connector{pointer-events:auto!important}.interacting .node-wrapper[data-node-type=preview] .grid>div,.canvas-interacting .node-wrapper[data-node-type=preview] .grid>div,.interacting .node-wrapper[data-node-type=preview] button,.canvas-interacting .node-wrapper[data-node-type=preview] button{pointer-events:auto!important}.interacting .node-wrapper .rh-list-dropdown,.interacting .node-wrapper .rh-list-dropdown *,.canvas-interacting .node-wrapper .rh-list-dropdown,.canvas-interacting .node-wrapper .rh-list-dropdown *,.interacting .node-wrapper [data-model-select-area],.interacting .node-wrapper [data-model-select-area] *,.canvas-interacting .node-wrapper [data-model-select-area],.canvas-interacting .node-wrapper [data-model-select-area] *,.interacting .node-wrapper .node-dropdown-button,.interacting .node-wrapper .node-dropdown-menu,.interacting .node-wrapper .node-dropdown-menu *,.canvas-interacting .node-wrapper .node-dropdown-button,.canvas-interacting .node-wrapper .node-dropdown-menu,.canvas-interacting .node-wrapper .node-dropdown-menu *{pointer-events:auto!important}textarea,input[type=text],input[type=password],input[type=email],input[type=number],input[type=search],input[type=url],input:not([type]),[contenteditable=true]{user-select:text!important;-webkit-user-select:text!important;-moz-user-select:text!important;-ms-user-select:text!important;pointer-events:auto!important}.node-wrapper textarea,.node-wrapper input[type=text],.node-wrapper input[type=search],.node-wrapper input:not([type]),.node-wrapper [contenteditable=true]{-webkit-font-smoothing:antialiased!important;-moz-osx-font-smoothing:grayscale!important;text-rendering:optimizeLegibility!important;font-synthesis:none!important;font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Microsoft YaHei,PingFang SC,sans-serif!important;font-size:15px!important;line-height:1.6!important}[data-theme=dark] .node-wrapper textarea,[data-theme=dark] .node-wrapper input[type=text],[data-theme=dark] .node-wrapper [contenteditable=true],.theme-dark .node-wrapper textarea,.theme-dark .node-wrapper input[type=text],.theme-dark .node-wrapper [contenteditable=true]{color:#f4f4f5!important}.node-wrapper.media-offscreen img,.node-wrapper.media-offscreen video{display:none!important}.node-wrapper img,.node-wrapper video,.node-wrapper textarea,.node-wrapper input,.node-wrapper button,.node-wrapper span,.node-wrapper label,.node-wrapper p,.node-wrapper div{transition:opacity .2s ease-out}.zoom-tiny .node-wrapper,.group-preview-collapsed.node-wrapper{box-shadow:none!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;contain:layout style}.zoom-tiny .node-wrapper:not([data-node-type=preview]):not([data-node-type=input-image]):not([data-node-type=image-compare])>*,.zoom-tiny .node-wrapper:not([data-node-type=preview]):not([data-node-type=input-image]):not([data-node-type=image-compare]) *,.group-preview-collapsed.node-wrapper:not([data-node-type=preview]):not([data-node-type=input-image]):not([data-node-type=image-compare])>*,.group-preview-collapsed.node-wrapper:not([data-node-type=preview]):not([data-node-type=input-image]):not([data-node-type=image-compare]) *{opacity:0!important;visibility:hidden!important;pointer-events:none}.zoom-tiny .node-wrapper[data-node-type=preview]>*:not(.smart-image-container):not(.preview-content):not(img):not(video),.zoom-tiny .node-wrapper[data-node-type=input-image]>*:not(.smart-image-container):not(img):not(video),.zoom-tiny .node-wrapper[data-node-type=image-compare]>*:not(.smart-image-container):not(img):not(video),.group-preview-collapsed.node-wrapper[data-node-type=preview]>*:not(.smart-image-container):not(.preview-content):not(img):not(video),.group-preview-collapsed.node-wrapper[data-node-type=input-image]>*:not(.smart-image-container):not(img):not(video),.group-preview-collapsed.node-wrapper[data-node-type=image-compare]>*:not(.smart-image-container):not(img):not(video){opacity:0!important;visibility:hidden!important;pointer-events:none}.zoom-tiny .node-wrapper[data-node-type=preview] img,.zoom-tiny .node-wrapper[data-node-type=preview] video,.zoom-tiny .node-wrapper[data-node-type=input-image] img,.zoom-tiny .node-wrapper[data-node-type=input-image] video,.zoom-tiny .node-wrapper[data-node-type=image-compare] img,.group-preview-collapsed.node-wrapper[data-node-type=preview] img,.group-preview-collapsed.node-wrapper[data-node-type=preview] video,.group-preview-collapsed.node-wrapper[data-node-type=input-image] img,.group-preview-collapsed.node-wrapper[data-node-type=input-image] video,.group-preview-collapsed.node-wrapper[data-node-type=image-compare] img{opacity:1!important;visibility:visible!important;image-rendering:auto}.zoom-tiny .node-wrapper[data-node-type=preview] .smart-image-container,.zoom-tiny .node-wrapper[data-node-type=preview] .preview-content,.zoom-tiny .node-wrapper[data-node-type=input-image] .smart-image-container,.zoom-tiny .node-wrapper[data-node-type=image-compare] .smart-image-container,.group-preview-collapsed.node-wrapper[data-node-type=preview] .smart-image-container,.group-preview-collapsed.node-wrapper[data-node-type=preview] .preview-content,.group-preview-collapsed.node-wrapper[data-node-type=input-image] .smart-image-container,.group-preview-collapsed.node-wrapper[data-node-type=image-compare] .smart-image-container{opacity:1!important;visibility:visible!important}.zoom-tiny .node-wrapper[data-node-type=preview] .smart-image-container *,.zoom-tiny .node-wrapper[data-node-type=input-image] .smart-image-container *,.zoom-tiny .node-wrapper[data-node-type=image-compare] .smart-image-container *{opacity:0!important;visibility:hidden!important;pointer-events:none!important}.zoom-tiny .node-wrapper[data-node-type=preview] .smart-image-container img,.zoom-tiny .node-wrapper[data-node-type=preview] .smart-image-container video,.zoom-tiny .node-wrapper[data-node-type=input-image] .smart-image-container img,.zoom-tiny .node-wrapper[data-node-type=input-image] .smart-image-container video,.zoom-tiny .node-wrapper[data-node-type=image-compare] .smart-image-container img,.zoom-tiny .node-wrapper[data-node-type=image-compare] .smart-image-container video{opacity:1!important;visibility:visible!important;pointer-events:auto!important;image-rendering:auto}.zoom-tiny .node-wrapper[data-node-type=preview] .smart-image-container *:has(img),.zoom-tiny .node-wrapper[data-node-type=preview] .smart-image-container *:has(video),.zoom-tiny .node-wrapper[data-node-type=input-image] .smart-image-container *:has(img),.zoom-tiny .node-wrapper[data-node-type=input-image] .smart-image-container *:has(video),.zoom-tiny .node-wrapper[data-node-type=image-compare] .smart-image-container *:has(img),.zoom-tiny .node-wrapper[data-node-type=image-compare] .smart-image-container *:has(video){opacity:1!important;visibility:visible!important;pointer-events:auto!important}.group-preview-collapsed.node-wrapper[data-node-type=preview] .smart-image-container *,.group-preview-collapsed.node-wrapper[data-node-type=input-image] .smart-image-container *,.group-preview-collapsed.node-wrapper[data-node-type=image-compare] .smart-image-container *{opacity:0!important;visibility:hidden!important;pointer-events:none!important}.group-preview-collapsed.node-wrapper[data-node-type=preview] .smart-image-container img,.group-preview-collapsed.node-wrapper[data-node-type=preview] .smart-image-container video,.group-preview-collapsed.node-wrapper[data-node-type=input-image] .smart-image-container img,.group-preview-collapsed.node-wrapper[data-node-type=input-image] .smart-image-container video,.group-preview-collapsed.node-wrapper[data-node-type=image-compare] .smart-image-container img,.group-preview-collapsed.node-wrapper[data-node-type=image-compare] .smart-image-container video{opacity:1!important;visibility:visible!important;pointer-events:auto!important;image-rendering:auto}.group-preview-collapsed.node-wrapper[data-node-type=preview] .smart-image-container *:has(img),.group-preview-collapsed.node-wrapper[data-node-type=preview] .smart-image-container *:has(video),.group-preview-collapsed.node-wrapper[data-node-type=input-image] .smart-image-container *:has(img),.group-preview-collapsed.node-wrapper[data-node-type=input-image] .smart-image-container *:has(video),.group-preview-collapsed.node-wrapper[data-node-type=image-compare] .smart-image-container *:has(img),.group-preview-collapsed.node-wrapper[data-node-type=image-compare] .smart-image-container *:has(video){opacity:1!important;visibility:visible!important;pointer-events:auto!important}.zoom-tiny .connection-group{stroke-width:1px!important;opacity:.5}.ultra-perf-mode .node-wrapper{box-shadow:none!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;transition:none!important;contain:strict}.ultra-perf-mode .node-wrapper img,.ultra-perf-mode .node-wrapper video{image-rendering:auto}.ultra-perf-mode .connection-group{stroke-width:1px!important}.ultra-perf-mode svg{shape-rendering:optimizeSpeed}.large-project-mode .node-wrapper{transition:none!important}.large-project-mode .node-wrapper:hover{transform:none!important}.large-project-mode .node-wrapper:hover:not(.node-dragging):not(.node-selected){transform:none!important;box-shadow:inherit!important}.large-project-mode .connection-group{transition:none!important}.large-project-mode .connection-group path{transition:none!important}.large-project-mode .animate-pulse-glow{animation:none!important}.large-project-mode .node-wrapper img{image-rendering:auto}.dragging-active .node-wrapper:not(.is-dragging){opacity:.85;transition:none!important}.dragging-active .node-wrapper:not(.is-dragging) img,.dragging-active .node-wrapper:not(.is-dragging) video{visibility:hidden}.dragging-active .node-wrapper:not(.is-dragging):after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background:inherit}.dragging-active .node-wrapper.is-dragging{z-index:100!important;opacity:1}.zooming .node-wrapper img,.zooming .node-wrapper video{image-rendering:auto}.zoom-low .node-wrapper .text-xs,.zoom-low .node-wrapper .text-\[10px\],.zoom-low .node-wrapper .text-\[9px\],.zoom-low .node-wrapper button:not(.essential-btn),.zoom-low .node-wrapper input,.zoom-low .node-wrapper textarea,.zoom-low .node-wrapper select{visibility:hidden}.zoom-ultra-low .node-wrapper>*:not(:first-child){visibility:hidden}.zoom-ultra-low .node-wrapper img,.zoom-ultra-low .node-wrapper video{image-rendering:auto}.custom-scrollbar::-webkit-scrollbar{width:4px;height:4px}.custom-scrollbar::-webkit-scrollbar-track{background:transparent}.custom-scrollbar::-webkit-scrollbar-thumb{background:#3f3f46;border-radius:2px}.custom-scrollbar::-webkit-scrollbar-thumb:hover{background:#52525b}.director-scrollbar{scrollbar-width:thin;scrollbar-color:#52525b transparent}.director-scrollbar::-webkit-scrollbar{height:6px;width:6px}.director-scrollbar::-webkit-scrollbar-track{background:#27272a4d;border-radius:3px;margin:0 4px}.director-scrollbar::-webkit-scrollbar-thumb{background:linear-gradient(90deg,#3b82f6,#8b5cf6);border-radius:3px;min-width:30px}.director-scrollbar::-webkit-scrollbar-thumb:hover{background:linear-gradient(90deg,#60a5fa,#a78bfa)}#canvas-bg.canvas-custom-cursor .director-scrollbar::-webkit-scrollbar-thumb,#canvas-bg.canvas-custom-cursor .director-scrollbar::-webkit-scrollbar-thumb:hover{cursor:url("data:image/svg+xml,%3csvg%20height='32'%20width='32'%20viewBox='0%200%2032%2032'%20xmlns='http://www.w3.org/2000/svg'%20style='color:%20black;'%3e%3cdefs%3e%3cfilter%20id='shadow'%20y='-40%25'%20x='-40%25'%20width='180px'%20height='180%25'%20color-interpolation-filters='sRGB'%3e%3cfeDropShadow%20dx='1'%20dy='1'%20stdDeviation='1.2'%20flood-opacity='.5'/%3e%3c/filter%3e%3c/defs%3e%3cg%20fill='none'%20transform='rotate(0%2016%2016)'%20filter='url(%23shadow)'%3e%3cpath%20d='m12%2024.4219v-16.015l11.591%2011.619h-6.781l-.411.124z'%20fill='white'/%3e%3cpath%20d='m21.0845%2025.0962-3.605%201.535-4.682-11.089%203.686-1.553z'%20fill='white'/%3e%3cpath%20d='m19.751%2024.4155-1.844.774-3.1-7.374%201.841-.775z'%20fill='black'/%3e%3cpath%20d='m13%2010.814v11.188l2.969-2.866.428-.139h4.768z'%20fill='black'/%3e%3c/g%3e%3c/svg%3e") 12 10,pointer!important}.hide-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.hide-scrollbar::-webkit-scrollbar{display:none}.audio-slider{outline:none;transition:all .2s ease;height:6px;border-radius:3px}.audio-slider::-webkit-slider-runnable-track{height:6px;border-radius:3px;background:transparent}.audio-slider::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:16px;height:16px;border-radius:50%;background:#fff;border:2px solid rgba(255,255,255,.5);box-shadow:0 2px 8px #0003,0 0 0 3px #ffffff1a;cursor:pointer;-webkit-transition:all .2s ease;transition:all .2s ease;margin-top:-5px}.audio-slider::-webkit-slider-thumb:hover{transform:scale(1.2);box-shadow:0 3px 12px #0000004d,0 0 0 4px #ffffff26;border-color:#fffc}.audio-slider::-webkit-slider-thumb:active{transform:scale(1.15);box-shadow:0 2px 10px #0006,0 0 0 5px #fff3}.audio-slider::-moz-range-track{height:6px;border-radius:3px;background:transparent}.audio-slider::-moz-range-thumb{width:16px;height:16px;border-radius:50%;background:#fff;border:2px solid rgba(255,255,255,.5);box-shadow:0 2px 8px #0003,0 0 0 3px #ffffff1a;cursor:pointer;-moz-transition:all .2s ease;transition:all .2s ease}.audio-slider::-moz-range-thumb:hover{transform:scale(1.2);box-shadow:0 3px 12px #0000004d,0 0 0 4px #ffffff26;border-color:#fffc}.audio-slider::-moz-range-thumb:active{transform:scale(1.15);box-shadow:0 2px 10px #0006,0 0 0 5px #fff3}html input[type=range].doodle-toolbar-eraser-range-light{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;outline:none}html input[type=range].doodle-toolbar-eraser-range-light::-webkit-slider-runnable-track{height:6px;border-radius:9999px;background:linear-gradient(to right,#f59e0b 0%,#f59e0b var(--eraser-fill-pct, 0%),#ffffff var(--eraser-fill-pct, 0%),#ffffff 100%);border:1px solid #e4e4e7}html input[type=range].doodle-toolbar-eraser-range-light::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:14px;height:14px;margin-top:-4px;border-radius:50%;background:#f59e0b;border:none;box-shadow:0 1px 3px #0000001f}html input[type=range].doodle-toolbar-eraser-range-light::-moz-range-progress{height:6px;border-radius:9999px;background:#f59e0b}html input[type=range].doodle-toolbar-eraser-range-light::-moz-range-track{height:6px;border-radius:9999px;background:#fff;border:1px solid #e4e4e7}html input[type=range].doodle-toolbar-eraser-range-light::-moz-range-thumb{width:14px;height:14px;border-radius:50%;background:#f59e0b;border:none;box-shadow:0 1px 3px #0000001f}.style-tags-scrollbar{scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.3) transparent}.style-tags-scrollbar::-webkit-scrollbar{width:6px;height:6px}.style-tags-scrollbar::-webkit-scrollbar-track{background:transparent;border-radius:3px}.style-tags-scrollbar::-webkit-scrollbar-thumb{background:#ffffff4d;border-radius:3px;min-width:30px;min-height:30px}.style-tags-scrollbar::-webkit-scrollbar-thumb:hover{background:#ffffff80}.music-node-scrollbar{scrollbar-width:thin;scrollbar-color:#3b82f6 #27272a;position:relative}.music-node-scrollbar::-webkit-scrollbar{width:10px}.music-node-scrollbar::-webkit-scrollbar-track{background:#27272a;border-radius:0;margin:0;border-left:1px solid rgba(63,63,70,.5)}.music-node-scrollbar::-webkit-scrollbar-thumb{background:#3b82f6;border-radius:0;border:none;min-height:40px;border-left:1px solid rgba(37,99,235,.8)}.music-node-scrollbar::-webkit-scrollbar-thumb:hover{background:#2563eb;border-left-color:#1e40af}.music-node-scrollbar::-webkit-scrollbar-button{display:block;height:12px;width:10px;background:#27272a;border-left:1px solid rgba(63,63,70,.5)}.music-node-scrollbar::-webkit-scrollbar-button:single-button:vertical:decrement{border-bottom:1px solid rgba(63,63,70,.5);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='6' height='6' viewBox='0 0 6 6'%3E%3Cpath fill='%231e40af' d='M3 0L0 3h6z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:center;background-size:6px 6px}.music-node-scrollbar::-webkit-scrollbar-button:single-button:vertical:increment{border-top:1px solid rgba(63,63,70,.5);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='6' height='6' viewBox='0 0 6 6'%3E%3Cpath fill='%231e40af' d='M3 6L0 3h6z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:center;background-size:6px 6px}.music-node-scrollbar::-webkit-scrollbar-button:hover{background-color:#1e293b}.theme-light .music-node-scrollbar{scrollbar-color:#3b82f6 #e4e4e7}.theme-light .music-node-scrollbar::-webkit-scrollbar-track{background:#e4e4e7;border-left-color:#d4d4d8}.theme-light .music-node-scrollbar::-webkit-scrollbar-thumb{border-left-color:#2563eb99}.theme-light .music-node-scrollbar::-webkit-scrollbar-button{background:#e4e4e7;border-left-color:#d4d4d8}.theme-light .music-node-scrollbar::-webkit-scrollbar-button:single-button:vertical:decrement{border-bottom-color:#d4d4d8;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='6' height='6' viewBox='0 0 6 6'%3E%3Cpath fill='%232563eb' d='M3 0L0 3h6z'/%3E%3C/svg%3E")}.theme-light .music-node-scrollbar::-webkit-scrollbar-button:single-button:vertical:increment{border-top-color:#d4d4d8;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='6' height='6' viewBox='0 0 6 6'%3E%3Cpath fill='%232563eb' d='M3 6L0 3h6z'/%3E%3C/svg%3E")}.theme-light .music-node-scrollbar::-webkit-scrollbar-button:hover{background-color:#d4d4d8}.resize-handle{cursor:nwse-resize;opacity:0;transition:opacity .2s}.node-wrapper:hover .resize-handle{opacity:1}.connector{position:absolute;top:50%;transform:translateY(-50%);width:.9rem;height:.9rem;background-color:#27272a;border:1px solid #71717a;color:#a1a1aa;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:crosshair;transition:all .2s;z-index:30;opacity:0;pointer-events:auto}.node-wrapper:hover .connector{opacity:1}.connector:hover,.connector.active{background-color:#d4d4d8;border-color:#fff;transform:translateY(-50%) scale(1.2);opacity:1;color:#000}.connector-right{right:-.45rem}.input-point{position:absolute;top:50%;transform:translateY(-50%);left:-.25rem;width:.5rem;height:.5rem;background-color:#52525b;border-radius:50%;border:1px solid #18181b;transition:all .2s;z-index:20;cursor:crosshair}.node-wrapper:hover .input-point{background-color:#a1a1aa}.input-point.connected{background-color:#fff;box-shadow:none}.input-point.active{background-color:#fff;border-color:#fff;transform:translateY(-50%);box-shadow:none}.lightbox-overlay{background-color:#000000fa;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.lightbox-overlay img{-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:auto;box-shadow:0 25px 50px -12px #000c}.lightbox-overlay video{-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:auto;box-shadow:0 25px 50px -12px #000c}.thumb-stack-item{transition:transform .2s,z-index .2s}.thumb-stack-item:hover{transform:scale(1.1) translateY(-2px);z-index:10!important;border-color:#60a5fa}.connection-delete{opacity:0;transition:opacity .2s;pointer-events:auto}.connection-group:hover .connection-delete{opacity:1}.drop-zone{border:2px dashed transparent;transition:all .3s}.drop-zone.drag-over{border-color:#60a5fa;background-color:#60a5fa1a}.markdown-body{font-size:13px;line-height:1.5;color:#e4e4e7;word-wrap:break-word;-webkit-user-select:text!important;-moz-user-select:text!important;user-select:text!important;cursor:text}.markdown-body *{-webkit-user-select:text!important;-moz-user-select:text!important;user-select:text!important;cursor:text}.markdown-body pre{background:#27272a;padding:10px;border-radius:6px;overflow-x:auto;margin:8px 0;white-space:pre-wrap;word-wrap:break-word;-webkit-user-select:text!important;-moz-user-select:text!important;user-select:text!important;cursor:text}.markdown-body code{font-family:monospace;background:#3f3f46;padding:2px 4px;border-radius:4px;font-size:12px;-webkit-user-select:text!important;-moz-user-select:text!important;user-select:text!important;cursor:text}.markdown-body pre code{background:transparent;padding:0;color:#a1a1aa;-webkit-user-select:text!important;-moz-user-select:text!important;user-select:text!important;cursor:text}.markdown-body p{margin-bottom:8px;-webkit-user-select:text!important;-moz-user-select:text!important;user-select:text!important;cursor:text}.markdown-body ul,.markdown-body ol{margin-left:20px;margin-bottom:8px;list-style:disc;-webkit-user-select:text!important;-moz-user-select:text!important;user-select:text!important;cursor:text}.markdown-body li{-webkit-user-select:text!important;-moz-user-select:text!important;user-select:text!important;cursor:text}.markdown-body video{max-width:100%;border-radius:.5rem;margin-top:.5rem}.markdown-body table{border-collapse:collapse;width:100%;margin:12px 0}.markdown-body table th,.markdown-body table td{border:1px solid #3f3f46;padding:8px 12px;text-align:left}.markdown-body table th{background-color:#3f3f46;font-weight:600}.markdown-body table tr:nth-child(2n){background-color:#27272a}.theme-light .markdown-body table th,.theme-light .markdown-body table td{border-color:#d4d4d8}.theme-light .markdown-body table th{background-color:#e4e4e7}.theme-light .markdown-body table tr:nth-child(2n){background-color:#f4f4f5}.theme-light .markdown-body{color:#18181b}.theme-light .markdown-body pre{background:#f4f4f5;color:#18181b}.theme-light .markdown-body code{background:#e4e4e7;color:#18181b}.theme-light .markdown-body pre code{color:#18181b}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes zoomIn95{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.animate-in{animation-duration:.2s;animation-fill-mode:both}.fade-in{animation-name:fadeIn}.zoom-in-95{animation-name:zoomIn95}@keyframes dash{0%{stroke-dashoffset:24}to{stroke-dashoffset:0}}@keyframes flowPulse{0%,to{opacity:.6}50%{opacity:1}}.animate-dash{animation:dash .6s linear infinite}.flow-line{animation:flowPulse 2s ease-in-out infinite}.connection-group:hover path{filter:brightness(1.2)}.animate-pulse-glow,.node-selected{animation:none!important}.node-dragging{transition:transform .1s ease-out,box-shadow .2s ease-out!important}.connector-point{transition:all .2s cubic-bezier(.4,0,.2,1)}.connector-point:hover{filter:brightness(1.2)}.connector-point.connector-input:hover,.connector-point.connector-input.active{box-shadow:0 0 12px #3b82f680}.connector-point.connector-output:hover{box-shadow:0 0 12px #3b82f666}.scrollbar-hide{scrollbar-width:none;-ms-overflow-style:none}.scrollbar-hide::-webkit-scrollbar{display:none}.theme-light .connector-point.connector-input:hover,.theme-light .connector-point.connector-input.active{box-shadow:0 0 12px #0ea5e980}.theme-light .connector-point.connector-output:hover{box-shadow:0 0 12px #0ea5e966}.node-wrapper{transition:transform .2s ease-out,box-shadow .2s ease-out,border-color .2s ease-out}.node-focus-ripple{position:absolute;pointer-events:none;border-radius:9999px;--focus-ripple-stroke: rgba(226, 232, 240, .28);--focus-ripple-op-0: .55;--focus-ripple-op-35: .28;--focus-ripple-op-70: .16}.theme-light .node-focus-ripple,[data-theme=light] .node-focus-ripple{--focus-ripple-stroke: rgba(96, 165, 250, .3);--focus-ripple-op-0: .72;--focus-ripple-op-35: .33;--focus-ripple-op-70: .2}.node-focus-ripple:before,.node-focus-ripple:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;border:1px solid var(--focus-ripple-stroke);opacity:0;transform:scale(.85)}.node-focus-ripple:before{animation:focusRippleWave 1.6s ease-out 0s 1 both}.node-focus-ripple:after{animation:focusRippleWave 1.6s ease-out .35s 1 both}@keyframes focusRippleWave{0%{opacity:var(--focus-ripple-op-0);transform:scale(.85)}35%{opacity:var(--focus-ripple-op-35);transform:scale(1.15)}70%{opacity:var(--focus-ripple-op-70);transform:scale(1.8)}to{opacity:0;transform:scale(2.45)}}.theme-light .node-focus-ripple:before,[data-theme=light] .node-focus-ripple:before,.theme-light .node-focus-ripple:after,[data-theme=light] .node-focus-ripple:after{border-width:2px}.node-wrapper.node-connect-edge-glow:before,.node-wrapper.node-connect-edge-glow:after{content:"";position:absolute;left:16px;right:16px;height:3px;pointer-events:none;opacity:0;border-radius:999px;z-index:60;background:linear-gradient(90deg,#f8fafc00,#f8fafc00 40%,#f8fafcf2,#f8fafc00 60%,#f8fafc00);background-size:240% 100%;filter:drop-shadow(0 0 6px rgba(248,250,252,.18));animation:connectEdgeShimmerX .9s linear infinite;-webkit-mask-image:linear-gradient(to right,transparent 0px,#000 14px,#000 calc(100% - 14px),transparent 100%);mask-image:linear-gradient(to right,transparent 0px,#000 14px,#000 calc(100% - 14px),transparent 100%);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.node-wrapper.node-connect-edge-glow:before{top:-2px}.node-wrapper.node-connect-edge-glow:after{bottom:-2px}@keyframes connectEdgeShimmerX{0%{opacity:0;background-position:100% 50%}10%{opacity:1}90%{opacity:1}to{opacity:0;background-position:0% 50%}}.node-wrapper.node-connect-edge-glow[data-connect-glow-side=left]:after{display:none}.node-wrapper.node-connect-edge-glow[data-connect-glow-side=right]:before{display:none}.theme-light .node-wrapper.node-connect-edge-glow:before,.theme-light .node-wrapper.node-connect-edge-glow:after,[data-theme=light] .node-wrapper.node-connect-edge-glow:before,[data-theme=light] .node-wrapper.node-connect-edge-glow:after{background:linear-gradient(90deg,#60a5fa00,#60a5fa00 40%,#60a5faf2,#60a5fa00 60%,#60a5fa00);filter:drop-shadow(0 0 6px rgba(96,165,250,.16))}.node-selected-border{border-color:#e5e7eb!important}.theme-dark .node-selected-border,[data-theme=dark] .node-selected-border{border-color:#a1a1aa!important;box-shadow:0 0 0 2px #a1a1aa99,0 8px 28px -4px #a1a1aa1f!important}.theme-light .node-selected-border,[data-theme=light] .node-selected-border{border-color:#000!important;box-shadow:0 0 0 2px #0009!important}.node-wrapper[data-hide-border=true]{border-color:transparent!important;box-shadow:none!important}.node-wrapper[data-node-type=input-image][data-has-image=true]:not(.node-selected-border){border:none!important;border-width:0!important;box-shadow:none!important;background:transparent!important}.theme-dark .node-wrapper[data-node-type=input-image][data-highlighted=true]{box-shadow:0 0 0 3px #60a5fa,0 0 28px 8px #60a5fa99!important}.theme-light .node-wrapper[data-node-type=input-image][data-highlighted=true]{box-shadow:0 0 0 3px #3b82f6,0 0 16px 4px #3b82f666!important}.node-wrapper[data-node-type=input-image] [data-input-image-content=true]{background:transparent!important}.node-wrapper[data-hide-border=true].node-selected-border{border-color:transparent!important;box-shadow:none!important}.project-name-input::placeholder{opacity:.35}.project-name-input::-webkit-input-placeholder{opacity:.35}.project-name-input::-moz-placeholder{opacity:.35}.project-name-input:-ms-input-placeholder{opacity:.35}.render-quality-medium img,.render-quality-medium video{image-rendering:auto}.render-quality-medium{box-shadow:none!important}.render-quality-low img,.render-quality-low video{image-rendering:auto}.render-quality-low{box-shadow:none!important;border-radius:.5rem!important}.render-quality-medium.group:hover img,.render-quality-medium.group:hover video,.render-quality-low.group:hover img,.render-quality-low.group:hover video{image-rendering:auto;filter:none;opacity:1}.alt-selection-box{position:fixed!important;border:3px solid #22c55e!important;background-color:#22c55e33!important;pointer-events:none!important;z-index:2147483647!important;box-shadow:0 0 0 2px #22c55e66,0 0 20px #22c55e4d!important;display:block!important;visibility:visible!important;opacity:1!important;border-radius:4px!important;transform:none!important;will-change:auto!important}.alt-selection-box[data-selection-box=true]{isolation:isolate!important;mix-blend-mode:normal!important}@keyframes marker-pulse{0%,to{transform:scale(1);opacity:1}50%{transform:scale(1.5);opacity:0}}.marker-point:hover{transform:translate(-50%,-50%) scale(1.2)!important}.marker-point.selected{animation:marker-selected-pulse 1.5s infinite}@keyframes marker-selected-pulse{0%,to{box-shadow:0 0 0 2px #fbbf244d,0 2px 8px #0000004d}50%{box-shadow:0 0 0 4px #fbbf2480,0 2px 12px #0006}}.marker-point.dragging{opacity:.6!important;cursor:move!important}.marker-layer{position:absolute;top:0;right:0;bottom:0;left:0}.marker-label{position:absolute;background:#fff;color:#3b82f6;font-weight:500;box-shadow:0 2px 6px #00000026;transition:opacity .2s}.marker-point:hover+.marker-label{opacity:1}.marker-editor{position:absolute;z-index:1000}.marker-editor textarea:focus{outline:none;ring:2px;ring-color:rgb(59,130,246)}.marker-edit-select option{background-color:#000!important;color:#fff!important}select,.node-wrapper select,[class*=Agent] select,.cursor-grabbing select{cursor:pointer!important}.video-analyze-select option{background-color:#000!important;color:#fff!important}.text-node-chat-select{background-color:transparent!important}.text-node-chat-select option{background-color:#18181b!important;color:#fff!important}.theme-dark .storyboard-select option{background-color:#000!important;color:#fff!important}.theme-light .storyboard-select option{background-color:#fff!important;color:#18181b!important}.light-intensity-slider:not(.light-intensity-slider-dark)::-webkit-slider-runnable-track{height:2px;background:#e4e4e7;border-radius:1px}.light-intensity-slider:not(.light-intensity-slider-dark)::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:14px;height:14px;border-radius:50%;background:#fff;border:2px solid rgb(212 212 216);cursor:pointer;margin-top:-6px;box-shadow:0 1px 2px #0000001a;-webkit-transition:box-shadow .2s,border-color .2s;transition:box-shadow .2s,border-color .2s}.light-intensity-slider:not(.light-intensity-slider-dark)::-webkit-slider-thumb:hover{border-color:#a1a1aa;box-shadow:0 2px 4px #00000026}.light-intensity-slider:not(.light-intensity-slider-dark)::-moz-range-track{height:2px;background:#e4e4e7;border-radius:1px}.light-intensity-slider:not(.light-intensity-slider-dark)::-moz-range-thumb{width:14px;height:14px;border-radius:50%;background:#fff;border:2px solid rgb(212 212 216);cursor:pointer;box-shadow:0 1px 2px #0000001a;-moz-transition:box-shadow .2s,border-color .2s;transition:box-shadow .2s,border-color .2s}.light-intensity-slider:not(.light-intensity-slider-dark)::-moz-range-thumb:hover{border-color:#a1a1aa;box-shadow:0 2px 4px #00000026}.light-intensity-slider-dark{background:transparent!important}.light-intensity-slider-dark::-webkit-slider-runnable-track{height:2px;background:#ffffff4d;border-radius:1px}.light-intensity-slider-dark::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:12px;height:12px;border-radius:50%;background:#fffc;border:1px solid rgba(255,255,255,.5);cursor:pointer;margin-top:-5px;box-shadow:0 0 #fff0;-webkit-transition:box-shadow .2s;transition:box-shadow .2s}.light-intensity-slider-dark::-webkit-slider-thumb:hover{background:#fff;box-shadow:0 0 0 2px #fff3}.light-intensity-slider-dark::-moz-range-track{height:2px;background:#ffffff4d;border-radius:1px}.light-intensity-slider-dark::-moz-range-thumb{width:12px;height:12px;border-radius:50%;background:#fffc;border:1px solid rgba(255,255,255,.5);cursor:pointer;box-shadow:0 0 #fff0;-moz-transition:box-shadow .2s;transition:box-shadow .2s}.light-intensity-slider-dark::-moz-range-thumb:hover{background:#fff;box-shadow:0 0 0 2px #fff3}.text-node-chat-select option:hover,.text-node-chat-select option:checked{background-color:#27272a!important;color:#fff!important}.multi-angle-slider{background:transparent}.multi-angle-slider::-webkit-slider-runnable-track{height:2px;background:#ffffff4d;border-radius:1px}.multi-angle-slider::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:12px;height:12px;border-radius:50%;background:#fffc;border:1px solid rgba(255,255,255,.5);cursor:pointer;margin-top:-5px;box-shadow:0 0 #fff0;-webkit-transition:box-shadow .2s;transition:box-shadow .2s}.multi-angle-slider::-webkit-slider-thumb:hover{background:#fff;box-shadow:0 0 0 2px #fff3}.multi-angle-slider::-moz-range-track{height:2px;background:#ffffff4d;border-radius:1px;border:none}.multi-angle-slider::-moz-range-thumb{width:12px;height:12px;border-radius:50%;background:#fffc;border:1px solid rgba(255,255,255,.5);cursor:pointer;box-shadow:0 0 #fff0;-moz-transition:box-shadow .2s;transition:box-shadow .2s}.multi-angle-slider::-moz-range-thumb:hover{background:#fff;box-shadow:0 0 0 2px #fff3}.multi-angle-slider-light::-webkit-slider-runnable-track{height:2px;background:#00000040;border-radius:1px}.multi-angle-slider-light::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:12px;height:12px;border-radius:50%;background:#171717;border:1px solid rgba(0,0,0,.3);cursor:pointer;margin-top:-5px;box-shadow:0 0 #0000;-webkit-transition:box-shadow .2s;transition:box-shadow .2s}.multi-angle-slider-light::-webkit-slider-thumb:hover{background:#262626;box-shadow:0 0 0 2px #0000001a}.multi-angle-slider-light::-moz-range-track{height:2px;background:#00000040;border-radius:1px;border:none}.multi-angle-slider-light::-moz-range-thumb{width:12px;height:12px;border-radius:50%;background:#171717;border:1px solid rgba(0,0,0,.3);cursor:pointer;box-shadow:0 0 #0000;-moz-transition:box-shadow .2s;transition:box-shadow .2s}.multi-angle-slider-light::-moz-range-thumb:hover{background:#262626;box-shadow:0 0 0 2px #0000001a}.minimal-scrollbar{scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.2) transparent}.minimal-scrollbar::-webkit-scrollbar{width:6px;height:6px}.minimal-scrollbar::-webkit-scrollbar-track{background:transparent}.minimal-scrollbar::-webkit-scrollbar-thumb{background:#fff3;border-radius:3px;-webkit-transition:background .2s ease;transition:background .2s ease}.minimal-scrollbar::-webkit-scrollbar-thumb:hover{background:#ffffff59}.theme-light .minimal-scrollbar{scrollbar-color:rgba(0,0,0,.15) transparent}.theme-light .minimal-scrollbar::-webkit-scrollbar-thumb{background:#00000026}.theme-light .minimal-scrollbar::-webkit-scrollbar-thumb:hover{background:#00000040}select{scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.2) transparent}select::-webkit-scrollbar{width:6px;height:6px}select::-webkit-scrollbar-track{background:transparent}select::-webkit-scrollbar-thumb{background:#fff3;border-radius:3px;-webkit-transition:background .2s ease;transition:background .2s ease}select::-webkit-scrollbar-thumb:hover{background:#ffffff59}.theme-light select{scrollbar-color:rgba(0,0,0,.15) transparent}.theme-light select::-webkit-scrollbar-thumb{background:#00000026}.theme-light select::-webkit-scrollbar-thumb:hover{background:#00000040}.chat-scroll-minimal{scrollbar-width:thin;scrollbar-color:rgba(113,113,122,.4) transparent}.chat-scroll-minimal::-webkit-scrollbar{width:5px;height:5px}.chat-scroll-minimal::-webkit-scrollbar-track{background:transparent}.chat-scroll-minimal::-webkit-scrollbar-thumb{background:#71717a66;border-radius:3px}.chat-scroll-minimal::-webkit-scrollbar-thumb:hover{background:#71717a99}.chat-scroll-minimal::-webkit-scrollbar-button{display:none}.theme-light .chat-scroll-minimal{scrollbar-color:rgba(0,0,0,.12) transparent}.theme-light .chat-scroll-minimal::-webkit-scrollbar-thumb{background:#0000001f}.theme-light .chat-scroll-minimal::-webkit-scrollbar-thumb:hover{background:#0003}.chat-markdown{font-size:12px;line-height:1.6;word-wrap:break-word;overflow-wrap:break-word}.chat-markdown p{margin:0 0 8px}.chat-markdown p:last-child{margin-bottom:0}.chat-markdown h1,.chat-markdown h2,.chat-markdown h3,.chat-markdown h4,.chat-markdown h5,.chat-markdown h6{margin:12px 0 8px;font-weight:600;line-height:1.4}.chat-markdown h1{font-size:16px}.chat-markdown h2{font-size:14px}.chat-markdown h3{font-size:13px}.chat-markdown h4,.chat-markdown h5,.chat-markdown h6{font-size:12px}.chat-markdown h1:first-child,.chat-markdown h2:first-child,.chat-markdown h3:first-child{margin-top:0}.chat-markdown pre{background:#0000004d;border-radius:6px;padding:10px 12px;margin:8px 0;overflow-x:auto;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,monospace;font-size:11px;line-height:1.5}.chat-markdown pre code{background:transparent;padding:0;border-radius:0;font-size:inherit;color:inherit}.chat-markdown code{background:#0003;padding:2px 5px;border-radius:4px;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,monospace;font-size:11px}.chat-markdown ul,.chat-markdown ol{margin:8px 0;padding-left:20px}.chat-markdown ul{list-style-type:disc}.chat-markdown ol{list-style-type:decimal}.chat-markdown li{margin:4px 0}.chat-markdown li>ul,.chat-markdown li>ol{margin:4px 0}.chat-markdown blockquote{border-left:3px solid rgba(59,130,246,.5);margin:8px 0;padding:4px 12px;background:#3b82f61a;border-radius:0 4px 4px 0}.chat-markdown blockquote p{margin:0}.chat-markdown table{border-collapse:collapse;width:100%;margin:8px 0;font-size:11px}.chat-markdown th,.chat-markdown td{border:1px solid rgba(255,255,255,.1);padding:6px 10px;text-align:left}.chat-markdown th{background:#0003;font-weight:600}.chat-markdown tr:nth-child(2n){background:#0000001a}.chat-markdown hr{border:none;border-top:1px solid rgba(255,255,255,.1);margin:12px 0}.chat-markdown a{color:#60a5fa;text-decoration:none}.chat-markdown a:hover{text-decoration:underline}.chat-markdown strong{font-weight:600}.chat-markdown em{font-style:italic}.chat-markdown img{max-width:100%;border-radius:6px;margin:8px 0}.theme-light .chat-markdown pre{background:#0000000d}.theme-light .chat-markdown code{background:#0000000f}.theme-light .chat-markdown blockquote{background:#3b82f614}.theme-light .chat-markdown th,.theme-light .chat-markdown td{border-color:#0000001a}.theme-light .chat-markdown th{background:#0000000a}.theme-light .chat-markdown tr:nth-child(2n){background:#00000005}.theme-light .chat-markdown hr{border-top-color:#0000001a}.chat-markdown.streaming:after{content:"▋";animation:blink 1s step-end infinite;margin-left:2px}@keyframes blink{0%,to{opacity:1}50%{opacity:0}}.group\/prompt:before,.group\/prompt:after,.group\/prompt>div:before,.group\/prompt>div:after{display:none!important}[data-node-type=gen-node]:before,[data-node-type=gen-node]:after{display:none!important}[data-node-type=gen-node]::-webkit-scrollbar-button{display:none!important;height:0!important;width:0!important}[data-node-type=gen-node][data-has-overflow=true]::-webkit-scrollbar-button,[data-node-type=gen-node][data-has-overflow=true]::-webkit-scrollbar-button:single-button:vertical:decrement,[data-node-type=gen-node][data-has-overflow=true]::-webkit-scrollbar-button:single-button:vertical:increment{display:block!important;height:12px!important;width:12px!important}.group\/prompt ::-webkit-scrollbar-button,.group\/prompt div::-webkit-scrollbar-button{display:none!important;height:0!important;width:0!important}.group\/prompt [data-node-type=gen-node][data-has-overflow=true]::-webkit-scrollbar-button,.group\/prompt div[data-node-type=gen-node][data-has-overflow=true]::-webkit-scrollbar-button,[data-node-type=gen-node][data-has-overflow=true]::-webkit-scrollbar-button{display:block!important;height:12px!important;width:12px!important}@keyframes sponsor-heart-shimmer{0%{transform:translate(-120%) skew(-18deg);opacity:0}12%{opacity:.85}35%{transform:translate(120%) skew(-18deg);opacity:0}to{transform:translate(120%) skew(-18deg);opacity:0}}@keyframes sponsor-heart-pulse-glow{0%,to{box-shadow:0 0 #fb71858c,0 0 14px #f43f5e73}50%{box-shadow:0 0 0 10px #fb718500,0 0 22px #fb7185bf}}.sponsor-heart-btn{animation:sponsor-heart-pulse-glow 2.4s ease-in-out infinite}.sponsor-heart-shine{overflow:hidden}.sponsor-heart-shine:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(105deg,transparent 0%,rgba(255,255,255,.15) 42%,rgba(255,255,255,.65) 50%,rgba(255,255,255,.15) 58%,transparent 100%);animation:sponsor-heart-shimmer 2.8s ease-in-out infinite}@keyframes sponsor-globe-float{0%,to{transform:translateY(0) rotate(0)}50%{transform:translateY(-3px) rotate(8deg)}}.sponsor-globe-wrap{animation:sponsor-globe-float 4s ease-in-out infinite}.left-toolbar-fast-tooltip button[data-tip]{position:relative}.left-toolbar-fast-tooltip button[data-tip]:after{content:attr(data-tip);position:absolute;left:calc(100% + 10px);top:50%;transform:translateY(-50%);white-space:nowrap;max-width:240px;overflow:hidden;text-overflow:ellipsis;padding:6px 8px;border-radius:10px;font-size:12px;line-height:1.2;pointer-events:none;opacity:0;visibility:hidden;transition:opacity 80ms ease,visibility 80ms ease;z-index:9999;border:1px solid rgba(255,255,255,.14);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);background:#000000a6;color:#f5f5f4}.left-toolbar-fast-tooltip button[data-tip]:hover:after{opacity:1;visibility:visible}.left-toolbar-fast-tooltip--light button[data-tip]:after{border:1px solid rgba(0,0,0,.08);background:#ffffffeb;color:#18181b}.left-toolbar-fast-tooltip--dark button[data-tip]:after{border:1px solid rgba(255,255,255,.14);background:#000000a6;color:#f5f5f4}.top-navbar-fast-tooltip [data-tip]{position:relative}.top-navbar-fast-tooltip [data-tip]:after{content:attr(data-tip);position:absolute;left:50%;top:calc(100% + 8px);transform:translate(-50%);white-space:nowrap;max-width:320px;overflow:hidden;text-overflow:ellipsis;padding:6px 8px;border-radius:10px;font-size:12px;line-height:1.2;pointer-events:none;opacity:0;visibility:hidden;transition:opacity 80ms ease,visibility 80ms ease;z-index:9999;border:1px solid rgba(255,255,255,.14);background:#000000a6;color:#f5f5f4}.top-navbar-fast-tooltip [data-tip]:hover:after{opacity:1;visibility:visible}.top-navbar-fast-tooltip--light [data-tip]:after{border:1px solid rgba(0,0,0,.08);background:#ffffffeb;color:#18181b}.top-navbar-fast-tooltip--dark [data-tip]:after{border:1px solid rgba(255,255,255,.14);background:#000000a6;color:#f5f5f4}.doodle-bottom-toolbar-fast-tooltip{overflow:visible!important}.doodle-bottom-toolbar-fast-tooltip [data-tip]{position:relative}.doodle-bottom-toolbar-fast-tooltip [data-tip]:after{content:attr(data-tip);position:absolute;left:50%;bottom:calc(100% + 8px);top:auto;transform:translate(-50%);max-width:min(280px,calc(100vw - 24px));width:-moz-max-content;width:max-content;white-space:normal;text-align:center;line-height:1.25;padding:6px 8px;border-radius:10px;font-size:12px;pointer-events:none;opacity:0;visibility:hidden;transition:none;z-index:9999;border:1px solid rgba(0,0,0,.08);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);background:#fffffff5;color:#18181b;box-shadow:0 4px 14px #0000001f}.doodle-bottom-toolbar-fast-tooltip [data-tip]:hover:after{opacity:1;visibility:visible}.doodle-bottom-toolbar-fast-tooltip--light [data-tip]:after{border:1px solid rgba(0,0,0,.08);background:#fffffff5;color:#18181b}.doodle-bottom-toolbar-fast-tooltip--dark [data-tip]:after{border:1px solid rgba(255,255,255,.14);background:#000000e0;color:#f4f4f5;box-shadow:0 4px 16px #00000059}.canvas-text-toolbar-fast-tooltip [data-tip]{position:relative}.canvas-text-toolbar-fast-tooltip [data-tip]:after{content:attr(data-tip);position:absolute;left:50%;bottom:calc(100% + 6px);transform:translate(-50%) translateY(1px);white-space:nowrap;padding:4px 8px;border-radius:8px;font-size:11px;line-height:1.2;pointer-events:none;opacity:0;visibility:hidden;transition:opacity 60ms ease,transform 60ms ease,visibility 60ms ease;z-index:9999}.canvas-text-toolbar-fast-tooltip [data-tip]:hover:after{opacity:1;visibility:visible;transform:translate(-50%) translateY(0)}.theme-light .canvas-text-toolbar-fast-tooltip [data-tip]:after,[data-theme=light] .canvas-text-toolbar-fast-tooltip [data-tip]:after{border:1px solid rgba(0,0,0,.12);background:#fffffff5;color:#18181b}.theme-dark .canvas-text-toolbar-fast-tooltip [data-tip]:after,[data-theme=dark] .canvas-text-toolbar-fast-tooltip [data-tip]:after{border:1px solid rgba(255,255,255,.14);background:#000000e0;color:#f4f4f5}.input-node-fast-tooltip [data-tip]{position:relative}.input-node-fast-tooltip{overflow:visible!important}.input-node-fast-tooltip button.w-11{position:relative;background:transparent!important}.input-node-fast-tooltip button.w-11:before{content:"";position:absolute;left:50%;top:50%;width:30px;height:30px;border-radius:9999px;transform:translate(-50%,-50%);opacity:0;transition:opacity .12s ease;pointer-events:none;z-index:0}.input-node-fast-tooltip button.w-11>*{position:relative;z-index:1}.input-node-fast-tooltip--light button.w-11:hover:before,.input-node-fast-tooltip--light button.w-11[data-toolbar-active=true]:before{opacity:1;background:#0000000f}.input-node-fast-tooltip--dark button.w-11:hover:before,.input-node-fast-tooltip--dark button.w-11[data-toolbar-active=true]:before{opacity:1;background:#ffffff1f}.input-node-fast-tooltip [data-tip]:after{content:attr(data-tip);position:absolute;left:50%;bottom:calc(100% + 8px);transform:translate(-50%) translateY(2px);white-space:nowrap;max-width:340px;overflow:hidden;text-overflow:ellipsis;padding:6px 10px;border-radius:10px;font-size:12px;line-height:1.2;pointer-events:none;opacity:0;visibility:hidden;transition:opacity 70ms ease,transform 70ms ease,visibility 70ms ease;z-index:9999}.input-node-fast-tooltip [data-tip]:hover:after{opacity:1;visibility:visible;transform:translate(-50%) translateY(0)}.input-node-fast-tooltip--light [data-tip]:after{border:1px solid rgba(0,0,0,.14);background:#fff;color:#18181b;box-shadow:none}.input-node-fast-tooltip--dark [data-tip]:after{border:1px solid rgba(255,255,255,.14);background:#000000e0;color:#f4f4f5;box-shadow:none}#canvas-bg.canvas-custom-cursor .node-move-cursor.node-move-cursor-dragging{cursor:url("data:image/svg+xml,%3Csvg%20height=%2732%27%20width=%2732%27%20viewBox=%270%200%2032%2032%27%20xmlns=%27http://www.w3.org/2000/svg%27%20style=%27color:%20black;%27%3E%3Cdefs%3E%3Cfilter%20id=%27shadow%27%20y=%27-40%25%27%20x=%27-40%25%27%20width=%27180px%27%20height=%27180%25%27%20color-interpolation-filters=%27sRGB%27%3E%3CfeDropShadow%20dx=%271%27%20dy=%271%27%20stdDeviation=%271.2%27%20flood-opacity=%27.5%27/%3E%3C/filter%3E%3C/defs%3E%3Cg%20fill=%27none%27%20transform=%27rotate(0%2016%2016)%27%20filter=%27url(%23shadow)%27%3E%3Cpath%20d=%27m19%2014h1v1h-1zm1%206h-1v-1h1zm-5-5h-1v-1h1zm0%205h-1v-1h1zm2-10.987-7.985%207.988%205.222%205.221%202.763%202.763%207.984-7.985z%27%20fill=%27white%27/%3E%3Cg%20fill=%27black%27%3E%3Cpath%20d=%27m23.5664%2016.9971-2.557-2.809v1.829h-4.009-4.001v-1.829l-2.571%202.809%202.572%202.808-.001-1.808h4.001%204.009l-.001%201.808z%27/%3E%3Cpath%20d=%27m17.9873%2017h.013v-4.001l1.807.001-2.807-2.571-2.809%202.57h1.809v4.001h.008v4.002l-1.828-.001%202.807%202.577%202.805-2.576h-1.805z%27/%3E%3C/g%3E%3C/g%3E%3C/svg%3E") 16 16,grabbing!important}#canvas-bg.canvas-custom-cursor .node-move-cursor.node-move-cursor-dragging,#canvas-bg.canvas-custom-cursor .node-move-cursor.node-move-cursor-dragging *{cursor:url("data:image/svg+xml,%3Csvg%20height=%2732%27%20width=%2732%27%20viewBox=%270%200%2032%2032%27%20xmlns=%27http://www.w3.org/2000/svg%27%20style=%27color:%20black;%27%3E%3Cdefs%3E%3Cfilter%20id=%27shadow%27%20y=%27-40%25%27%20x=%27-40%25%27%20width=%27180px%27%20height=%27180%25%27%20color-interpolation-filters=%27sRGB%27%3E%3CfeDropShadow%20dx=%271%27%20dy=%271%27%20stdDeviation=%271.2%27%20flood-opacity=%27.5%27/%3E%3C/filter%3E%3C/defs%3E%3Cg%20fill=%27none%27%20transform=%27rotate(0%2016%2016)%27%20filter=%27url(%23shadow)%27%3E%3Cpath%20d=%27m19%2014h1v1h-1zm1%206h-1v-1h1zm-5-5h-1v-1h1zm0%205h-1v-1h1zm2-10.987-7.985%207.988%205.222%205.221%202.763%202.763%207.984-7.985z%27%20fill=%27white%27/%3E%3Cg%20fill=%27black%27%3E%3Cpath%20d=%27m23.5664%2016.9971-2.557-2.809v1.829h-4.009-4.001v-1.829l-2.571%202.809%202.572%202.808-.001-1.808h4.001%204.009l-.001%201.808z%27/%3E%3Cpath%20d=%27m17.9873%2017h.013v-4.001l1.807.001-2.807-2.571-2.809%202.57h1.809v4.001h.008v4.002l-1.828-.001%202.807%202.577%202.805-2.576h-1.805z%27/%3E%3C/g%3E%3C/g%3E%3C/svg%3E") 16 16,grabbing!important}#canvas-bg.canvas-text-dragging,#canvas-bg.canvas-text-dragging *{cursor:url("data:image/svg+xml,%3Csvg%20height%3D'32'%20width%3D'32'%20viewBox%3D'0%200%2032%2032'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20style%3D'color%3A%20black%3B'%3E%3Cdefs%3E%3Cfilter%20id%3D'shadow'%20y%3D'-40%25'%20x%3D'-40%25'%20width%3D'180px'%20height%3D'180%25'%20color-interpolation-filters%3D'sRGB'%3E%3CfeDropShadow%20dx%3D'1'%20dy%3D'1'%20stdDeviation%3D'1.2'%20flood-opacity%3D'.5'%2F%3E%3C%2Ffilter%3E%3C%2Fdefs%3E%3Cg%20fill%3D'none'%20transform%3D'rotate(0%2016%2016)'%20filter%3D'url(%23shadow)'%3E%3Cpath%20d%3D'm19%2014h1v1h-1zm1%206h-1v-1h1zm-5-5h-1v-1h1zm0%205h-1v-1h1zm2-10.987-7.985%207.988%205.222%205.221%202.763%202.763%207.984-7.985z'%20fill%3D'white'%2F%3E%3Cg%20fill%3D'black'%3E%3Cpath%20d%3D'm23.5664%2016.9971-2.557-2.809v1.829h-4.009-4.001v-1.829l-2.571%202.809%202.572%202.808-.001-1.808h4.001%204.009l-.001%201.808z'%2F%3E%3Cpath%20d%3D'm17.9873%2017h.013v-4.001l1.807.001-2.807-2.571-2.809%202.57h1.809v4.001h.008v4.002l-1.828-.001%202.807%202.577%202.805-2.576h-1.805z'%2F%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E") 16 16,grabbing!important}#canvas-bg.canvas-node-dragging,#canvas-bg.canvas-node-dragging *{cursor:url("data:image/svg+xml,%3Csvg%20height%3D'32'%20width%3D'32'%20viewBox%3D'0%200%2032%2032'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20style%3D'color%3A%20black%3B'%3E%3Cdefs%3E%3Cfilter%20id%3D'shadow'%20y%3D'-40%25'%20x%3D'-40%25'%20width%3D'180px'%20height%3D'180%25'%20color-interpolation-filters%3D'sRGB'%3E%3CfeDropShadow%20dx%3D'1'%20dy%3D'1'%20stdDeviation%3D'1.2'%20flood-opacity%3D'.5'%2F%3E%3C%2Ffilter%3E%3C%2Fdefs%3E%3Cg%20fill%3D'none'%20transform%3D'rotate(0%2016%2016)'%20filter%3D'url(%23shadow)'%3E%3Cpath%20d%3D'm19%2014h1v1h-1zm1%206h-1v-1h1zm-5-5h-1v-1h1zm0%205h-1v-1h1zm2-10.987-7.985%207.988%205.222%205.221%202.763%202.763%207.984-7.985z'%20fill%3D'white'%2F%3E%3Cg%20fill%3D'black'%3E%3Cpath%20d%3D'm23.5664%2016.9971-2.557-2.809v1.829h-4.009-4.001v-1.829l-2.571%202.809%202.572%202.808-.001-1.808h4.001%204.009l-.001%201.808z'%2F%3E%3Cpath%20d%3D'm17.9873%2017h.013v-4.001l1.807.001-2.807-2.571-2.809%202.57h1.809v4.001h.008v4.002l-1.828-.001%202.807%202.577%202.805-2.576h-1.805z'%2F%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E") 16 16,grabbing!important}.placeholder\:text-gray-500::-moz-placeholder{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.placeholder\:text-gray-500::placeholder{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.placeholder\:text-white\/40::-moz-placeholder{color:#fff6}.placeholder\:text-white\/40::placeholder{color:#fff6}.placeholder\:text-white\/60::-moz-placeholder{color:#fff9}.placeholder\:text-white\/60::placeholder{color:#fff9}.placeholder\:text-zinc-400::-moz-placeholder{--tw-text-opacity: 1;color:rgb(161 161 170 / var(--tw-text-opacity, 1))}.placeholder\:text-zinc-400::placeholder{--tw-text-opacity: 1;color:rgb(161 161 170 / var(--tw-text-opacity, 1))}.placeholder\:text-zinc-500::-moz-placeholder{--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.placeholder\:text-zinc-500::placeholder{--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.placeholder\:text-zinc-600::-moz-placeholder{--tw-text-opacity: 1;color:rgb(82 82 91 / var(--tw-text-opacity, 1))}.placeholder\:text-zinc-600::placeholder{--tw-text-opacity: 1;color:rgb(82 82 91 / var(--tw-text-opacity, 1))}.placeholder\:text-zinc-700::-moz-placeholder{--tw-text-opacity: 1;color:rgb(63 63 70 / var(--tw-text-opacity, 1))}.placeholder\:text-zinc-700::placeholder{--tw-text-opacity: 1;color:rgb(63 63 70 / var(--tw-text-opacity, 1))}.placeholder\:opacity-60::-moz-placeholder{opacity:.6}.placeholder\:opacity-60::placeholder{opacity:.6}.last\:border-b-0:last-child{border-bottom-width:0px}.hover\:z-10:hover{z-index:10}.hover\:w-1\.5:hover{width:.375rem}.hover\:w-2:hover{width:.5rem}.hover\:scale-100:hover{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:scale-105:hover{--tw-scale-x: 1.05;--tw-scale-y: 1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:scale-110:hover{--tw-scale-x: 1.1;--tw-scale-y: 1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:scale-125:hover{--tw-scale-x: 1.25;--tw-scale-y: 1.25;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-blue-300:hover{--tw-border-opacity: 1;border-color:rgb(147 197 253 / var(--tw-border-opacity, 1))}.hover\:border-blue-500:hover{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.hover\:border-blue-500\/50:hover{border-color:#3b82f680}.hover\:border-blue-500\/60:hover{border-color:#3b82f699}.hover\:border-gray-400:hover{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.hover\:border-green-500:hover{--tw-border-opacity: 1;border-color:rgb(34 197 94 / var(--tw-border-opacity, 1))}.hover\:border-red-300:hover{--tw-border-opacity: 1;border-color:rgb(252 165 165 / var(--tw-border-opacity, 1))}.hover\:border-red-500:hover{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.hover\:border-red-500\/50:hover{border-color:#ef444480}.hover\:border-red-600:hover{--tw-border-opacity: 1;border-color:rgb(220 38 38 / var(--tw-border-opacity, 1))}.hover\:border-violet-300:hover{--tw-border-opacity: 1;border-color:rgb(196 181 253 / var(--tw-border-opacity, 1))}.hover\:border-violet-500\/30:hover{border-color:#8b5cf64d}.hover\:border-white:hover{--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.hover\:border-white\/40:hover{border-color:#fff6}.hover\:border-white\/50:hover{border-color:#ffffff80}.hover\:border-white\/60:hover{border-color:#fff9}.hover\:border-zinc-300:hover{--tw-border-opacity: 1;border-color:rgb(212 212 216 / var(--tw-border-opacity, 1))}.hover\:border-zinc-400:hover{--tw-border-opacity: 1;border-color:rgb(161 161 170 / var(--tw-border-opacity, 1))}.hover\:border-zinc-500:hover{--tw-border-opacity: 1;border-color:rgb(113 113 122 / var(--tw-border-opacity, 1))}.hover\:border-zinc-500\/60:hover{border-color:#71717a99}.hover\:border-zinc-600:hover{--tw-border-opacity: 1;border-color:rgb(82 82 91 / var(--tw-border-opacity, 1))}.hover\:border-zinc-700:hover{--tw-border-opacity: 1;border-color:rgb(63 63 70 / var(--tw-border-opacity, 1))}.hover\:bg-amber-100:hover{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.hover\:bg-amber-200:hover{--tw-bg-opacity: 1;background-color:rgb(253 230 138 / var(--tw-bg-opacity, 1))}.hover\:bg-amber-400:hover{--tw-bg-opacity: 1;background-color:rgb(251 191 36 / var(--tw-bg-opacity, 1))}.hover\:bg-amber-400\/10:hover{background-color:#fbbf241a}.hover\:bg-amber-50:hover{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.hover\:bg-amber-500:hover{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.hover\:bg-amber-500\/20:hover{background-color:#f59e0b33}.hover\:bg-amber-500\/30:hover{background-color:#f59e0b4d}.hover\:bg-amber-500\/40:hover{background-color:#f59e0b66}.hover\:bg-amber-600:hover{--tw-bg-opacity: 1;background-color:rgb(217 119 6 / var(--tw-bg-opacity, 1))}.hover\:bg-amber-600\/30:hover{background-color:#d977064d}.hover\:bg-amber-700:hover{--tw-bg-opacity: 1;background-color:rgb(180 83 9 / var(--tw-bg-opacity, 1))}.hover\:bg-black:hover{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.hover\:bg-black\/10:hover{background-color:#0000001a}.hover\:bg-black\/5:hover{background-color:#0000000d}.hover\:bg-black\/60:hover{background-color:#0009}.hover\:bg-black\/70:hover{background-color:#000000b3}.hover\:bg-black\/80:hover{background-color:#000c}.hover\:bg-blue-100:hover{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-200:hover{--tw-bg-opacity: 1;background-color:rgb(191 219 254 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-400:hover{--tw-bg-opacity: 1;background-color:rgb(96 165 250 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-400\/20:hover{background-color:#60a5fa33}.hover\:bg-blue-400\/30:hover{background-color:#60a5fa4d}.hover\:bg-blue-50:hover{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-500:hover{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-500\/10:hover{background-color:#3b82f61a}.hover\:bg-blue-500\/20:hover{background-color:#3b82f633}.hover\:bg-blue-500\/30:hover{background-color:#3b82f64d}.hover\:bg-blue-500\/40:hover{background-color:#3b82f666}.hover\:bg-blue-500\/50:hover{background-color:#3b82f680}.hover\:bg-blue-600:hover{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-600\/30:hover{background-color:#2563eb4d}.hover\:bg-blue-600\/50:hover{background-color:#2563eb80}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.hover\:bg-cyan-100:hover{--tw-bg-opacity: 1;background-color:rgb(207 250 254 / var(--tw-bg-opacity, 1))}.hover\:bg-cyan-500:hover{--tw-bg-opacity: 1;background-color:rgb(6 182 212 / var(--tw-bg-opacity, 1))}.hover\:bg-cyan-600:hover{--tw-bg-opacity: 1;background-color:rgb(8 145 178 / var(--tw-bg-opacity, 1))}.hover\:bg-cyan-600\/30:hover{background-color:#0891b24d}.hover\:bg-emerald-100:hover{--tw-bg-opacity: 1;background-color:rgb(209 250 229 / var(--tw-bg-opacity, 1))}.hover\:bg-emerald-500:hover{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.hover\:bg-emerald-500\/20:hover{background-color:#10b98133}.hover\:bg-emerald-600:hover{--tw-bg-opacity: 1;background-color:rgb(5 150 105 / var(--tw-bg-opacity, 1))}.hover\:bg-emerald-700:hover{--tw-bg-opacity: 1;background-color:rgb(4 120 87 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-300:hover{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-600:hover{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-700:hover{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.hover\:bg-green-100:hover{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.hover\:bg-green-50:hover{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.hover\:bg-green-500:hover{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.hover\:bg-green-500\/10:hover{background-color:#22c55e1a}.hover\:bg-green-500\/20:hover{background-color:#22c55e33}.hover\:bg-green-500\/30:hover{background-color:#22c55e4d}.hover\:bg-green-600:hover{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.hover\:bg-green-700:hover{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity, 1))}.hover\:bg-pink-100:hover{--tw-bg-opacity: 1;background-color:rgb(252 231 243 / var(--tw-bg-opacity, 1))}.hover\:bg-pink-500\/20:hover{background-color:#ec489933}.hover\:bg-purple-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 232 255 / var(--tw-bg-opacity, 1))}.hover\:bg-purple-400:hover{--tw-bg-opacity: 1;background-color:rgb(192 132 252 / var(--tw-bg-opacity, 1))}.hover\:bg-purple-500:hover{--tw-bg-opacity: 1;background-color:rgb(168 85 247 / var(--tw-bg-opacity, 1))}.hover\:bg-purple-500\/20:hover{background-color:#a855f733}.hover\:bg-purple-600:hover{--tw-bg-opacity: 1;background-color:rgb(147 51 234 / var(--tw-bg-opacity, 1))}.hover\:bg-purple-700:hover{--tw-bg-opacity: 1;background-color:rgb(126 34 206 / var(--tw-bg-opacity, 1))}.hover\:bg-red-100:hover{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.hover\:bg-red-400\/10:hover{background-color:#f871711a}.hover\:bg-red-50:hover{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.hover\:bg-red-500:hover{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.hover\:bg-red-500\/10:hover{background-color:#ef44441a}.hover\:bg-red-500\/20:hover{background-color:#ef444433}.hover\:bg-red-500\/30:hover{background-color:#ef44444d}.hover\:bg-red-500\/50:hover{background-color:#ef444480}.hover\:bg-red-600:hover{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.hover\:bg-red-700:hover{--tw-bg-opacity: 1;background-color:rgb(185 28 28 / var(--tw-bg-opacity, 1))}.hover\:bg-red-800:hover{--tw-bg-opacity: 1;background-color:rgb(153 27 27 / var(--tw-bg-opacity, 1))}.hover\:bg-red-900\/30:hover{background-color:#7f1d1d4d}.hover\:bg-red-900\/50:hover{background-color:#7f1d1d80}.hover\:bg-transparent:hover{background-color:transparent}.hover\:bg-violet-400\/10:hover{background-color:#a78bfa1a}.hover\:bg-violet-50:hover{--tw-bg-opacity: 1;background-color:rgb(245 243 255 / var(--tw-bg-opacity, 1))}.hover\:bg-violet-500:hover{--tw-bg-opacity: 1;background-color:rgb(139 92 246 / var(--tw-bg-opacity, 1))}.hover\:bg-violet-500\/10:hover{background-color:#8b5cf61a}.hover\:bg-violet-600:hover{--tw-bg-opacity: 1;background-color:rgb(124 58 237 / var(--tw-bg-opacity, 1))}.hover\:bg-white:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:bg-white\/10:hover{background-color:#ffffff1a}.hover\:bg-white\/15:hover{background-color:#ffffff26}.hover\:bg-white\/20:hover{background-color:#fff3}.hover\:bg-white\/25:hover{background-color:#ffffff40}.hover\:bg-white\/30:hover{background-color:#ffffff4d}.hover\:bg-white\/5:hover{background-color:#ffffff0d}.hover\:bg-white\/60:hover{background-color:#fff9}.hover\:bg-zinc-100:hover{--tw-bg-opacity: 1;background-color:rgb(244 244 245 / var(--tw-bg-opacity, 1))}.hover\:bg-zinc-200:hover{--tw-bg-opacity: 1;background-color:rgb(228 228 231 / var(--tw-bg-opacity, 1))}.hover\:bg-zinc-200\/50:hover{background-color:#e4e4e780}.hover\:bg-zinc-300:hover{--tw-bg-opacity: 1;background-color:rgb(212 212 216 / var(--tw-bg-opacity, 1))}.hover\:bg-zinc-50:hover{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.hover\:bg-zinc-500:hover{--tw-bg-opacity: 1;background-color:rgb(113 113 122 / var(--tw-bg-opacity, 1))}.hover\:bg-zinc-600:hover{--tw-bg-opacity: 1;background-color:rgb(82 82 91 / var(--tw-bg-opacity, 1))}.hover\:bg-zinc-600\/60:hover{background-color:#52525b99}.hover\:bg-zinc-600\/80:hover{background-color:#52525bcc}.hover\:bg-zinc-700:hover{--tw-bg-opacity: 1;background-color:rgb(63 63 70 / var(--tw-bg-opacity, 1))}.hover\:bg-zinc-700\/40:hover{background-color:#3f3f4666}.hover\:bg-zinc-700\/50:hover{background-color:#3f3f4680}.hover\:bg-zinc-700\/80:hover{background-color:#3f3f46cc}.hover\:bg-zinc-800:hover{--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity, 1))}.hover\:bg-zinc-800\/30:hover{background-color:#27272a4d}.hover\:bg-zinc-800\/40:hover{background-color:#27272a66}.hover\:bg-zinc-800\/50:hover{background-color:#27272a80}.hover\:bg-zinc-800\/60:hover{background-color:#27272a99}.hover\:bg-zinc-800\/80:hover{background-color:#27272acc}.hover\:bg-zinc-800\/90:hover{background-color:#27272ae6}.hover\:bg-zinc-900:hover{--tw-bg-opacity: 1;background-color:rgb(24 24 27 / var(--tw-bg-opacity, 1))}.hover\:bg-zinc-900\/50:hover{background-color:#18181b80}.hover\:bg-zinc-900\/60:hover{background-color:#18181b99}.hover\:bg-opacity-10:hover{--tw-bg-opacity: .1}.hover\:bg-opacity-50:hover{--tw-bg-opacity: .5}.hover\:from-blue-500:hover{--tw-gradient-from: #3b82f6 var(--tw-gradient-from-position);--tw-gradient-to: rgb(59 130 246 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.hover\:from-green-500:hover{--tw-gradient-from: #22c55e var(--tw-gradient-from-position);--tw-gradient-to: rgb(34 197 94 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.hover\:to-emerald-500:hover{--tw-gradient-to: #10b981 var(--tw-gradient-to-position)}.hover\:to-indigo-500:hover{--tw-gradient-to: #6366f1 var(--tw-gradient-to-position)}.hover\:text-amber-300:hover{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.hover\:text-amber-400:hover{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.hover\:text-amber-600:hover{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.hover\:text-amber-700:hover{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.hover\:text-black:hover{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.hover\:text-blue-300:hover{--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.hover\:text-blue-400:hover{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.hover\:text-blue-600:hover{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.hover\:text-gray-900:hover{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.hover\:text-green-400:hover{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.hover\:text-green-600:hover{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.hover\:text-purple-400:hover{--tw-text-opacity: 1;color:rgb(192 132 252 / var(--tw-text-opacity, 1))}.hover\:text-red-300:hover{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.hover\:text-red-400:hover{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.hover\:text-red-400\/80:hover{color:#f87171cc}.hover\:text-red-500:hover{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.hover\:text-red-600:hover{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.hover\:text-violet-400:hover{--tw-text-opacity: 1;color:rgb(167 139 250 / var(--tw-text-opacity, 1))}.hover\:text-violet-600:hover{--tw-text-opacity: 1;color:rgb(124 58 237 / var(--tw-text-opacity, 1))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:text-zinc-100:hover{--tw-text-opacity: 1;color:rgb(244 244 245 / var(--tw-text-opacity, 1))}.hover\:text-zinc-200:hover{--tw-text-opacity: 1;color:rgb(228 228 231 / var(--tw-text-opacity, 1))}.hover\:text-zinc-300:hover{--tw-text-opacity: 1;color:rgb(212 212 216 / var(--tw-text-opacity, 1))}.hover\:text-zinc-400:hover{--tw-text-opacity: 1;color:rgb(161 161 170 / var(--tw-text-opacity, 1))}.hover\:text-zinc-600:hover{--tw-text-opacity: 1;color:rgb(82 82 91 / var(--tw-text-opacity, 1))}.hover\:text-zinc-700:hover{--tw-text-opacity: 1;color:rgb(63 63 70 / var(--tw-text-opacity, 1))}.hover\:text-zinc-800:hover{--tw-text-opacity: 1;color:rgb(39 39 42 / var(--tw-text-opacity, 1))}.hover\:text-zinc-900:hover{--tw-text-opacity: 1;color:rgb(24 24 27 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:opacity-70:hover{opacity:.7}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-90:hover{opacity:.9}.hover\:shadow-lg:hover{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:shadow-md:hover{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:shadow-red-500\/30:hover{--tw-shadow-color: rgb(239 68 68 / .3);--tw-shadow: var(--tw-shadow-colored)}.hover\:shadow-red-600\/30:hover{--tw-shadow-color: rgb(220 38 38 / .3);--tw-shadow: var(--tw-shadow-colored)}.hover\:ring-1:hover{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.hover\:ring-2:hover{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.hover\:ring-inset:hover{--tw-ring-inset: inset}.hover\:ring-blue-400\/50:hover{--tw-ring-color: rgb(96 165 250 / .5)}.hover\:ring-blue-500:hover{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}.hover\:ring-blue-500\/50:hover{--tw-ring-color: rgb(59 130 246 / .5)}.hover\:ring-white\/30:hover{--tw-ring-color: rgb(255 255 255 / .3)}.hover\:ring-zinc-400:hover{--tw-ring-opacity: 1;--tw-ring-color: rgb(161 161 170 / var(--tw-ring-opacity, 1))}.focus\:border-amber-400:focus{--tw-border-opacity: 1;border-color:rgb(251 191 36 / var(--tw-border-opacity, 1))}.focus\:border-amber-500:focus{--tw-border-opacity: 1;border-color:rgb(245 158 11 / var(--tw-border-opacity, 1))}.focus\:border-amber-500\/30:focus{border-color:#f59e0b4d}.focus\:border-amber-500\/50:focus{border-color:#f59e0b80}.focus\:border-blue-400:focus{--tw-border-opacity: 1;border-color:rgb(96 165 250 / var(--tw-border-opacity, 1))}.focus\:border-blue-500:focus{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.focus\:border-blue-500\/50:focus{border-color:#3b82f680}.focus\:border-gray-600:focus{--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity, 1))}.focus\:border-violet-300:focus{--tw-border-opacity: 1;border-color:rgb(196 181 253 / var(--tw-border-opacity, 1))}.focus\:border-violet-400:focus{--tw-border-opacity: 1;border-color:rgb(167 139 250 / var(--tw-border-opacity, 1))}.focus\:border-violet-500:focus{--tw-border-opacity: 1;border-color:rgb(139 92 246 / var(--tw-border-opacity, 1))}.focus\:border-violet-500\/40:focus{border-color:#8b5cf666}.focus\:border-violet-500\/50:focus{border-color:#8b5cf680}.focus\:border-zinc-500:focus{--tw-border-opacity: 1;border-color:rgb(113 113 122 / var(--tw-border-opacity, 1))}.focus\:bg-zinc-50:focus{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.focus\:bg-zinc-800\/50:focus{background-color:#27272a80}.focus\:bg-zinc-900:focus{--tw-bg-opacity: 1;background-color:rgb(24 24 27 / var(--tw-bg-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-0:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-inset:focus{--tw-ring-inset: inset}.focus\:ring-amber-400:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(251 191 36 / var(--tw-ring-opacity, 1))}.focus\:ring-blue-400\/30:focus{--tw-ring-color: rgb(96 165 250 / .3)}.focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}.focus\:ring-blue-500\/20:focus{--tw-ring-color: rgb(59 130 246 / .2)}.focus\:ring-blue-500\/50:focus{--tw-ring-color: rgb(59 130 246 / .5)}.focus\:ring-white\/30:focus{--tw-ring-color: rgb(255 255 255 / .3)}.focus\:ring-white\/50:focus{--tw-ring-color: rgb(255 255 255 / .5)}.focus\:ring-zinc-400\/60:focus{--tw-ring-color: rgb(161 161 170 / .6)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-pink-400:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: rgb(244 114 182 / var(--tw-ring-opacity, 1))}.active\:scale-95:active{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.active\:cursor-grabbing:active{cursor:grabbing}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-zinc-600:disabled{--tw-bg-opacity: 1;background-color:rgb(82 82 91 / var(--tw-bg-opacity, 1))}.disabled\:bg-zinc-800:disabled{--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity, 1))}.disabled\:text-zinc-500:disabled{--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:scale-110{--tw-scale-x: 1.1;--tw-scale-y: 1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group\/prompt-line:hover .group-hover\/prompt-line\:bg-zinc-400{--tw-bg-opacity: 1;background-color:rgb(161 161 170 / var(--tw-bg-opacity, 1))}.group\/prompt-line:hover .group-hover\/prompt-line\:bg-zinc-500{--tw-bg-opacity: 1;background-color:rgb(113 113 122 / var(--tw-bg-opacity, 1))}.group:hover .group-hover\:bg-black\/20{background-color:#0003}.group:hover .group-hover\:bg-black\/40{background-color:#0006}.group:hover .group-hover\:bg-blue-400{--tw-bg-opacity: 1;background-color:rgb(96 165 250 / var(--tw-bg-opacity, 1))}.group:hover .group-hover\:bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.group:hover .group-hover\:bg-blue-500\/30{background-color:#3b82f64d}.group\/file:hover .group-hover\/file\:opacity-100,.group\/img:hover .group-hover\/img\:opacity-100,.group\/item:hover .group-hover\/item\:opacity-100,.group\/tip2:hover .group-hover\/tip2\:opacity-100,.group\/tip:hover .group-hover\/tip\:opacity-100,.group:hover .group-hover\:opacity-100{opacity:1}.dark\:border-white\/15:is(.dark *){border-color:#ffffff26}.dark\:border-zinc-600:is(.dark *){--tw-border-opacity: 1;border-color:rgb(82 82 91 / var(--tw-border-opacity, 1))}.dark\:bg-zinc-700:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(63 63 70 / var(--tw-bg-opacity, 1))}.dark\:bg-zinc-800:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity, 1))}.dark\:bg-zinc-800\/50:is(.dark *){background-color:#27272a80}.dark\:bg-zinc-900\/40:is(.dark *){background-color:#18181b66}.dark\:text-zinc-300:is(.dark *){--tw-text-opacity: 1;color:rgb(212 212 216 / var(--tw-text-opacity, 1))}.dark\:text-zinc-400:is(.dark *){--tw-text-opacity: 1;color:rgb(161 161 170 / var(--tw-text-opacity, 1))}.dark\:ring-white\/10:is(.dark *){--tw-ring-color: rgb(255 255 255 / .1)}@media(min-width:640px){.sm\:col-span-2{grid-column:span 2 / span 2}.sm\:inline{display:inline}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-nowrap{flex-wrap:nowrap}.sm\:justify-start{justify-content:flex-start}.sm\:p-6{padding:1.5rem}.sm\:px-4{padding-left:1rem;padding-right:1rem}}@media(min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:1024px){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}.\[\&\:\:-moz-range-thumb\]\:h-2::-moz-range-thumb{height:.5rem}.\[\&\:\:-moz-range-thumb\]\:w-2::-moz-range-thumb{width:.5rem}.\[\&\:\:-moz-range-thumb\]\:cursor-pointer::-moz-range-thumb{cursor:pointer}.\[\&\:\:-moz-range-thumb\]\:appearance-none::-moz-range-thumb{-moz-appearance:none;-webkit-appearance:none;appearance:none}.\[\&\:\:-moz-range-thumb\]\:rounded-full::-moz-range-thumb{border-radius:9999px}.\[\&\:\:-moz-range-thumb\]\:border-0::-moz-range-thumb{border-width:0px}.\[\&\:\:-moz-range-thumb\]\:bg-white\/60::-moz-range-thumb{background-color:#fff9}.\[\&\:\:-moz-range-track\]\:rounded-full::-moz-range-track{border-radius:9999px}.\[\&\:\:-moz-range-track\]\:bg-white\/20::-moz-range-track{background-color:#fff3}.\[\&\:\:-webkit-inner-spin-button\]\:appearance-none::-webkit-inner-spin-button{-webkit-appearance:none;-moz-appearance:none;appearance:none}.\[\&\:\:-webkit-outer-spin-button\]\:appearance-none::-webkit-outer-spin-button{-webkit-appearance:none;-moz-appearance:none;appearance:none}.\[\&\:\:-webkit-slider-thumb\]\:h-2::-webkit-slider-thumb{height:.5rem}.\[\&\:\:-webkit-slider-thumb\]\:w-2::-webkit-slider-thumb{width:.5rem}.\[\&\:\:-webkit-slider-thumb\]\:cursor-pointer::-webkit-slider-thumb{cursor:pointer}.\[\&\:\:-webkit-slider-thumb\]\:appearance-none::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none}.\[\&\:\:-webkit-slider-thumb\]\:rounded-full::-webkit-slider-thumb{border-radius:9999px}.\[\&\:\:-webkit-slider-thumb\]\:border-0::-webkit-slider-thumb{border-width:0px}.\[\&\:\:-webkit-slider-thumb\]\:bg-white\/60::-webkit-slider-thumb{background-color:#fff9}.\[\&\>option\]\:bg-black>option{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.\[\&\>option\]\:bg-zinc-900>option{--tw-bg-opacity: 1;background-color:rgb(24 24 27 / var(--tw-bg-opacity, 1))}.\[\&\>option\]\:text-white>option{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.\[\&\>option\]\:text-zinc-200>option{--tw-text-opacity: 1;color:rgb(228 228 231 / var(--tw-text-opacity, 1))} diff --git a/analysis/qiaodou-extract/extracted/assets/index-m-NWkaV-.js b/analysis/qiaodou-extract/extracted/assets/index-m-NWkaV-.js new file mode 100644 index 000000000..7621db140 --- /dev/null +++ b/analysis/qiaodou-extract/extracted/assets/index-m-NWkaV-.js @@ -0,0 +1,8110 @@ +var sH=Object.defineProperty;var iH=(e,t,n)=>t in e?sH(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var Mn=(e,t,n)=>iH(e,typeof t!="symbol"?t+"":t,n);function aH(e,t){for(var n=0;nr[i]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const a of i)if(a.type==="childList")for(const o of a.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function n(i){const a={};return i.integrity&&(a.integrity=i.integrity),i.referrerPolicy&&(a.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?a.credentials="include":i.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function r(i){if(i.ep)return;i.ep=!0;const a=n(i);fetch(i.href,a)}})();var Mp=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Am(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function oH(e){if(Object.prototype.hasOwnProperty.call(e,"__esModule"))return e;var t=e.default;if(typeof t=="function"){var n=function r(){return this instanceof r?Reflect.construct(t,arguments,this.constructor):t.apply(this,arguments)};n.prototype=t.prototype}else n={};return Object.defineProperty(n,"__esModule",{value:!0}),Object.keys(e).forEach(function(r){var i=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(n,r,i.get?i:{enumerable:!0,get:function(){return e[r]}})}),n}var p2={exports:{}},_g={},f2={exports:{}},Rs={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var WS;function lH(){if(WS)return Rs;WS=1;var e=Symbol.for("react.element"),t=Symbol.for("react.portal"),n=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),a=Symbol.for("react.provider"),o=Symbol.for("react.context"),l=Symbol.for("react.forward_ref"),c=Symbol.for("react.suspense"),u=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),h=Symbol.iterator;function p(N){return N===null||typeof N!="object"?null:(N=h&&N[h]||N["@@iterator"],typeof N=="function"?N:null)}var f={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},b=Object.assign,g={};function y(N,j,k){this.props=N,this.context=j,this.refs=g,this.updater=k||f}y.prototype.isReactComponent={},y.prototype.setState=function(N,j){if(typeof N!="object"&&typeof N!="function"&&N!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,N,j,"setState")},y.prototype.forceUpdate=function(N){this.updater.enqueueForceUpdate(this,N,"forceUpdate")};function w(){}w.prototype=y.prototype;function v(N,j,k){this.props=N,this.context=j,this.refs=g,this.updater=k||f}var m=v.prototype=new w;m.constructor=v,b(m,y.prototype),m.isPureReactComponent=!0;var z=Array.isArray,C=Object.prototype.hasOwnProperty,E={current:null},I={key:!0,ref:!0,__self:!0,__source:!0};function R(N,j,k){var W,M={},Y=null,se=null;if(j!=null)for(W in j.ref!==void 0&&(se=j.ref),j.key!==void 0&&(Y=""+j.key),j)C.call(j,W)&&!I.hasOwnProperty(W)&&(M[W]=j[W]);var ie=arguments.length-2;if(ie===1)M.children=k;else if(1>>1,j=Z[N];if(0>>1;Ni(M,V))Yi(se,M)?(Z[N]=se,Z[Y]=V,N=Y):(Z[N]=M,Z[W]=V,N=W);else if(Yi(se,V))Z[N]=se,Z[Y]=V,N=Y;else break e}}return B}function i(Z,B){var V=Z.sortIndex-B.sortIndex;return V!==0?V:Z.id-B.id}if(typeof performance=="object"&&typeof performance.now=="function"){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,l=o.now();e.unstable_now=function(){return o.now()-l}}var c=[],u=[],d=1,h=null,p=3,f=!1,b=!1,g=!1,y=typeof setTimeout=="function"?setTimeout:null,w=typeof clearTimeout=="function"?clearTimeout:null,v=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function m(Z){for(var B=n(u);B!==null;){if(B.callback===null)r(u);else if(B.startTime<=Z)r(u),B.sortIndex=B.expirationTime,t(c,B);else break;B=n(u)}}function z(Z){if(g=!1,m(Z),!b)if(n(c)!==null)b=!0,H(C);else{var B=n(u);B!==null&&J(z,B.startTime-Z)}}function C(Z,B){b=!1,g&&(g=!1,w(R),R=-1),f=!0;var V=p;try{for(m(B),h=n(c);h!==null&&(!(h.expirationTime>B)||Z&&!F());){var N=h.callback;if(typeof N=="function"){h.callback=null,p=h.priorityLevel;var j=N(h.expirationTime<=B);B=e.unstable_now(),typeof j=="function"?h.callback=j:h===n(c)&&r(c),m(B)}else r(c);h=n(c)}if(h!==null)var k=!0;else{var W=n(u);W!==null&&J(z,W.startTime-B),k=!1}return k}finally{h=null,p=V,f=!1}}var E=!1,I=null,R=-1,A=5,O=-1;function F(){return!(e.unstable_now()-OZ||125N?(Z.sortIndex=V,t(u,Z),n(c)===null&&Z===n(u)&&(g?(w(R),R=-1):g=!0,J(z,V-N))):(Z.sortIndex=j,t(c,Z),b||f||(b=!0,H(C))),Z},e.unstable_shouldYield=F,e.unstable_wrapCallback=function(Z){var B=p;return function(){var V=p;p=B;try{return Z.apply(this,arguments)}finally{p=V}}}})(x2)),x2}var qS;function hH(){return qS||(qS=1,g2.exports=dH()),g2.exports}/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var KS;function pH(){if(KS)return kl;KS=1;var e=_5(),t=hH();function n(x){for(var S="https://reactjs.org/docs/error-decoder.html?invariant="+x,D=1;D"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),c=Object.prototype.hasOwnProperty,u=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,d={},h={};function p(x){return c.call(h,x)?!0:c.call(d,x)?!1:u.test(x)?h[x]=!0:(d[x]=!0,!1)}function f(x,S,D,ce){if(D!==null&&D.type===0)return!1;switch(typeof S){case"function":case"symbol":return!0;case"boolean":return ce?!1:D!==null?!D.acceptsBooleans:(x=x.toLowerCase().slice(0,5),x!=="data-"&&x!=="aria-");default:return!1}}function b(x,S,D,ce){if(S===null||typeof S>"u"||f(x,S,D,ce))return!0;if(ce)return!1;if(D!==null)switch(D.type){case 3:return!S;case 4:return S===!1;case 5:return isNaN(S);case 6:return isNaN(S)||1>S}return!1}function g(x,S,D,ce,Se,Fe,ut){this.acceptsBooleans=S===2||S===3||S===4,this.attributeName=ce,this.attributeNamespace=Se,this.mustUseProperty=D,this.propertyName=x,this.type=S,this.sanitizeURL=Fe,this.removeEmptyString=ut}var y={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(x){y[x]=new g(x,0,!1,x,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(x){var S=x[0];y[S]=new g(S,1,!1,x[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(x){y[x]=new g(x,2,!1,x.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(x){y[x]=new g(x,2,!1,x,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(x){y[x]=new g(x,3,!1,x.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(x){y[x]=new g(x,3,!0,x,null,!1,!1)}),["capture","download"].forEach(function(x){y[x]=new g(x,4,!1,x,null,!1,!1)}),["cols","rows","size","span"].forEach(function(x){y[x]=new g(x,6,!1,x,null,!1,!1)}),["rowSpan","start"].forEach(function(x){y[x]=new g(x,5,!1,x.toLowerCase(),null,!1,!1)});var w=/[\-:]([a-z])/g;function v(x){return x[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(x){var S=x.replace(w,v);y[S]=new g(S,1,!1,x,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(x){var S=x.replace(w,v);y[S]=new g(S,1,!1,x,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(x){var S=x.replace(w,v);y[S]=new g(S,1,!1,x,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(x){y[x]=new g(x,1,!1,x.toLowerCase(),null,!1,!1)}),y.xlinkHref=new g("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(x){y[x]=new g(x,1,!1,x.toLowerCase(),null,!0,!0)});function m(x,S,D,ce){var Se=y.hasOwnProperty(S)?y[S]:null;(Se!==null?Se.type!==0:ce||!(2Ft||Se[ut]!==Fe[Ft]){var ln=` +`+Se[ut].replace(" at new "," at ");return x.displayName&&ln.includes("")&&(ln=ln.replace("",x.displayName)),ln}while(1<=ut&&0<=Ft);break}}}finally{k=!1,Error.prepareStackTrace=D}return(x=x?x.displayName||x.name:"")?j(x):""}function M(x){switch(x.tag){case 5:return j(x.type);case 16:return j("Lazy");case 13:return j("Suspense");case 19:return j("SuspenseList");case 0:case 2:case 15:return x=W(x.type,!1),x;case 11:return x=W(x.type.render,!1),x;case 1:return x=W(x.type,!0),x;default:return""}}function Y(x){if(x==null)return null;if(typeof x=="function")return x.displayName||x.name||null;if(typeof x=="string")return x;switch(x){case I:return"Fragment";case E:return"Portal";case A:return"Profiler";case R:return"StrictMode";case X:return"Suspense";case T:return"SuspenseList"}if(typeof x=="object")switch(x.$$typeof){case F:return(x.displayName||"Context")+".Consumer";case O:return(x._context.displayName||"Context")+".Provider";case L:var S=x.render;return x=x.displayName,x||(x=S.displayName||S.name||"",x=x!==""?"ForwardRef("+x+")":"ForwardRef"),x;case q:return S=x.displayName||null,S!==null?S:Y(x.type)||"Memo";case H:S=x._payload,x=x._init;try{return Y(x(S))}catch{}}return null}function se(x){var S=x.type;switch(x.tag){case 24:return"Cache";case 9:return(S.displayName||"Context")+".Consumer";case 10:return(S._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return x=S.render,x=x.displayName||x.name||"",S.displayName||(x!==""?"ForwardRef("+x+")":"ForwardRef");case 7:return"Fragment";case 5:return S;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Y(S);case 8:return S===R?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof S=="function")return S.displayName||S.name||null;if(typeof S=="string")return S}return null}function ie(x){switch(typeof x){case"boolean":case"number":case"string":case"undefined":return x;case"object":return x;default:return""}}function oe(x){var S=x.type;return(x=x.nodeName)&&x.toLowerCase()==="input"&&(S==="checkbox"||S==="radio")}function re(x){var S=oe(x)?"checked":"value",D=Object.getOwnPropertyDescriptor(x.constructor.prototype,S),ce=""+x[S];if(!x.hasOwnProperty(S)&&typeof D<"u"&&typeof D.get=="function"&&typeof D.set=="function"){var Se=D.get,Fe=D.set;return Object.defineProperty(x,S,{configurable:!0,get:function(){return Se.call(this)},set:function(ut){ce=""+ut,Fe.call(this,ut)}}),Object.defineProperty(x,S,{enumerable:D.enumerable}),{getValue:function(){return ce},setValue:function(ut){ce=""+ut},stopTracking:function(){x._valueTracker=null,delete x[S]}}}}function ee(x){x._valueTracker||(x._valueTracker=re(x))}function pe(x){if(!x)return!1;var S=x._valueTracker;if(!S)return!0;var D=S.getValue(),ce="";return x&&(ce=oe(x)?x.checked?"true":"false":x.value),x=ce,x!==D?(S.setValue(x),!0):!1}function we(x){if(x=x||(typeof document<"u"?document:void 0),typeof x>"u")return null;try{return x.activeElement||x.body}catch{return x.body}}function Q(x,S){var D=S.checked;return V({},S,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:D??x._wrapperState.initialChecked})}function me(x,S){var D=S.defaultValue==null?"":S.defaultValue,ce=S.checked!=null?S.checked:S.defaultChecked;D=ie(S.value!=null?S.value:D),x._wrapperState={initialChecked:ce,initialValue:D,controlled:S.type==="checkbox"||S.type==="radio"?S.checked!=null:S.value!=null}}function ue(x,S){S=S.checked,S!=null&&m(x,"checked",S,!1)}function U(x,S){ue(x,S);var D=ie(S.value),ce=S.type;if(D!=null)ce==="number"?(D===0&&x.value===""||x.value!=D)&&(x.value=""+D):x.value!==""+D&&(x.value=""+D);else if(ce==="submit"||ce==="reset"){x.removeAttribute("value");return}S.hasOwnProperty("value")?te(x,S.type,D):S.hasOwnProperty("defaultValue")&&te(x,S.type,ie(S.defaultValue)),S.checked==null&&S.defaultChecked!=null&&(x.defaultChecked=!!S.defaultChecked)}function G(x,S,D){if(S.hasOwnProperty("value")||S.hasOwnProperty("defaultValue")){var ce=S.type;if(!(ce!=="submit"&&ce!=="reset"||S.value!==void 0&&S.value!==null))return;S=""+x._wrapperState.initialValue,D||S===x.value||(x.value=S),x.defaultValue=S}D=x.name,D!==""&&(x.name=""),x.defaultChecked=!!x._wrapperState.initialChecked,D!==""&&(x.name=D)}function te(x,S,D){(S!=="number"||we(x.ownerDocument)!==x)&&(D==null?x.defaultValue=""+x._wrapperState.initialValue:x.defaultValue!==""+D&&(x.defaultValue=""+D))}var ge=Array.isArray;function ne(x,S,D,ce){if(x=x.options,S){S={};for(var Se=0;Se"+S.valueOf().toString()+"",S=_e.firstChild;x.firstChild;)x.removeChild(x.firstChild);for(;S.firstChild;)x.appendChild(S.firstChild)}});function Ce(x,S){if(S){var D=x.firstChild;if(D&&D===x.lastChild&&D.nodeType===3){D.nodeValue=S;return}}x.textContent=S}var xe={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Ne=["Webkit","ms","Moz","O"];Object.keys(xe).forEach(function(x){Ne.forEach(function(S){S=S+x.charAt(0).toUpperCase()+x.substring(1),xe[S]=xe[x]})});function ve(x,S,D){return S==null||typeof S=="boolean"||S===""?"":D||typeof S!="number"||S===0||xe.hasOwnProperty(x)&&xe[x]?(""+S).trim():S+"px"}function ke(x,S){x=x.style;for(var D in S)if(S.hasOwnProperty(D)){var ce=D.indexOf("--")===0,Se=ve(D,S[D],ce);D==="float"&&(D="cssFloat"),ce?x.setProperty(D,Se):x[D]=Se}}var Ie=V({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Pe(x,S){if(S){if(Ie[x]&&(S.children!=null||S.dangerouslySetInnerHTML!=null))throw Error(n(137,x));if(S.dangerouslySetInnerHTML!=null){if(S.children!=null)throw Error(n(60));if(typeof S.dangerouslySetInnerHTML!="object"||!("__html"in S.dangerouslySetInnerHTML))throw Error(n(61))}if(S.style!=null&&typeof S.style!="object")throw Error(n(62))}}function Te(x,S){if(x.indexOf("-")===-1)return typeof S.is=="string";switch(x){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Be=null;function He(x){return x=x.target||x.srcElement||window,x.correspondingUseElement&&(x=x.correspondingUseElement),x.nodeType===3?x.parentNode:x}var Je=null,Me=null,Re=null;function Ve(x){if(x=tc(x)){if(typeof Je!="function")throw Error(n(280));var S=x.stateNode;S&&(S=Oc(S),Je(x.stateNode,x.type,S))}}function Ze(x){Me?Re?Re.push(x):Re=[x]:Me=x}function je(){if(Me){var x=Me,S=Re;if(Re=Me=null,Ve(x),S)for(x=0;x>>=0,x===0?32:31-(Qe(x)/Ue|0)|0}var at=64,rt=4194304;function lt(x){switch(x&-x){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return x&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return x&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return x}}function ot(x,S){var D=x.pendingLanes;if(D===0)return 0;var ce=0,Se=x.suspendedLanes,Fe=x.pingedLanes,ut=D&268435455;if(ut!==0){var Ft=ut&~Se;Ft!==0?ce=lt(Ft):(Fe&=ut,Fe!==0&&(ce=lt(Fe)))}else ut=D&~Se,ut!==0?ce=lt(ut):Fe!==0&&(ce=lt(Fe));if(ce===0)return 0;if(S!==0&&S!==ce&&(S&Se)===0&&(Se=ce&-ce,Fe=S&-S,Se>=Fe||Se===16&&(Fe&4194240)!==0))return S;if((ce&4)!==0&&(ce|=D&16),S=x.entangledLanes,S!==0)for(x=x.entanglements,S&=ce;0D;D++)S.push(x);return S}function Zt(x,S,D){x.pendingLanes|=S,S!==536870912&&(x.suspendedLanes=0,x.pingedLanes=0),x=x.eventTimes,S=31-St(S),x[S]=D}function Sn(x,S){var D=x.pendingLanes&~S;x.pendingLanes=S,x.suspendedLanes=0,x.pingedLanes=0,x.expiredLanes&=S,x.mutableReadLanes&=S,x.entangledLanes&=S,S=x.entanglements;var ce=x.eventTimes;for(x=x.expirationTimes;0=lr),cs=" ",Ar=!1;function Or(x,S){switch(x){case"keyup":return rn.indexOf(S.keyCode)!==-1;case"keydown":return S.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function ls(x){return x=x.detail,typeof x=="object"&&"data"in x?x.data:null}var Ns=!1;function Di(x,S){switch(x){case"compositionend":return ls(S);case"keypress":return S.which!==32?null:(Ar=!0,cs);case"textInput":return x=S.data,x===cs&&Ar?null:x;default:return null}}function ii(x,S){if(Ns)return x==="compositionend"||!gn&&Or(x,S)?(x=jr(),tr=nr=gr=null,Ns=!1,x):null;switch(x){case"paste":return null;case"keypress":if(!(S.ctrlKey||S.altKey||S.metaKey)||S.ctrlKey&&S.altKey){if(S.char&&1=S)return{node:D,offset:S-x};x=ce}e:{for(;D;){if(D.nextSibling){D=D.nextSibling;break e}D=D.parentNode}D=void 0}D=vd(D)}}function Cc(x,S){return x&&S?x===S?!0:x&&x.nodeType===3?!1:S&&S.nodeType===3?Cc(x,S.parentNode):"contains"in x?x.contains(S):x.compareDocumentPosition?!!(x.compareDocumentPosition(S)&16):!1:!1}function wd(){for(var x=window,S=we();S instanceof x.HTMLIFrameElement;){try{var D=typeof S.contentWindow.location.href=="string"}catch{D=!1}if(D)x=S.contentWindow;else break;S=we(x.document)}return S}function wu(x){var S=x&&x.nodeName&&x.nodeName.toLowerCase();return S&&(S==="input"&&(x.type==="text"||x.type==="search"||x.type==="tel"||x.type==="url"||x.type==="password")||S==="textarea"||x.contentEditable==="true")}function cr(x){var S=wd(),D=x.focusedElem,ce=x.selectionRange;if(S!==D&&D&&D.ownerDocument&&Cc(D.ownerDocument.documentElement,D)){if(ce!==null&&wu(D)){if(S=ce.start,x=ce.end,x===void 0&&(x=S),"selectionStart"in D)D.selectionStart=S,D.selectionEnd=Math.min(x,D.value.length);else if(x=(S=D.ownerDocument||document)&&S.defaultView||window,x.getSelection){x=x.getSelection();var Se=D.textContent.length,Fe=Math.min(ce.start,Se);ce=ce.end===void 0?Fe:Math.min(ce.end,Se),!x.extend&&Fe>ce&&(Se=ce,ce=Fe,Fe=Se),Se=vu(D,Fe);var ut=vu(D,ce);Se&&ut&&(x.rangeCount!==1||x.anchorNode!==Se.node||x.anchorOffset!==Se.offset||x.focusNode!==ut.node||x.focusOffset!==ut.offset)&&(S=S.createRange(),S.setStart(Se.node,Se.offset),x.removeAllRanges(),Fe>ce?(x.addRange(S),x.extend(ut.node,ut.offset)):(S.setEnd(ut.node,ut.offset),x.addRange(S)))}}for(S=[],x=D;x=x.parentNode;)x.nodeType===1&&S.push({element:x,left:x.scrollLeft,top:x.scrollTop});for(typeof D.focus=="function"&&D.focus(),D=0;D=document.documentMode,yl=null,er=null,Aa=null,qn=!1;function go(x,S,D){var ce=D.window===D?D.document:D.nodeType===9?D:D.ownerDocument;qn||yl==null||yl!==we(ce)||(ce=yl,"selectionStart"in ce&&wu(ce)?ce={start:ce.selectionStart,end:ce.selectionEnd}:(ce=(ce.ownerDocument&&ce.ownerDocument.defaultView||window).getSelection(),ce={anchorNode:ce.anchorNode,anchorOffset:ce.anchorOffset,focusNode:ce.focusNode,focusOffset:ce.focusOffset}),Aa&&Gl(Aa,ce)||(Aa=ce,ce=Jl(er,"onSelect"),0Zo||(x.current=Pu[Zo],Pu[Zo]=null,Zo--)}function Fs(x,S){Zo++,Pu[Zo]=x.current,x.current=S}var wl={},pa=Ma(wl),Ta=Ma(!1),nc=wl;function Lc(x,S){var D=x.type.contextTypes;if(!D)return wl;var ce=x.stateNode;if(ce&&ce.__reactInternalMemoizedUnmaskedChildContext===S)return ce.__reactInternalMemoizedMaskedChildContext;var Se={},Fe;for(Fe in D)Se[Fe]=S[Fe];return ce&&(x=x.stateNode,x.__reactInternalMemoizedUnmaskedChildContext=S,x.__reactInternalMemoizedMaskedChildContext=Se),Se}function Ra(x){return x=x.childContextTypes,x!=null}function Mi(){Os(Ta),Os(pa)}function Ou(x,S,D){if(pa.current!==wl)throw Error(n(168));Fs(pa,S),Fs(Ta,D)}function Ed(x,S,D){var ce=x.stateNode;if(S=S.childContextTypes,typeof ce.getChildContext!="function")return D;ce=ce.getChildContext();for(var Se in ce)if(!(Se in S))throw Error(n(108,se(x)||"Unknown",Se));return V({},D,ce)}function Id(x){return x=(x=x.stateNode)&&x.__reactInternalMemoizedMergedChildContext||wl,nc=pa.current,Fs(pa,x),Fs(Ta,Ta.current),!0}function _l(x,S,D){var ce=x.stateNode;if(!ce)throw Error(n(169));D?(x=Ed(x,S,nc),ce.__reactInternalMemoizedMergedChildContext=x,Os(Ta),Os(pa),Fs(pa,x)):Os(Ta),Fs(Ta,D)}var Ao=null,Pa=!1,Lu=!1;function Bu(x){Ao===null?Ao=[x]:Ao.push(x)}function l0(x){Pa=!0,Bu(x)}function zl(){if(!Lu&&Ao!==null){Lu=!0;var x=0,S=_n;try{var D=Ao;for(_n=1;x>=ut,Se-=ut,ma=1<<32-St(S)+Se|D<ys?(ao=ds,ds=null):ao=ds.sibling;var oi=rr(wn,ds,$n[ys],yr);if(oi===null){ds===null&&(ds=ao);break}x&&ds&&oi.alternate===null&&S(wn,ds),hn=Fe(oi,hn,ys),us===null?ss=oi:us.sibling=oi,us=oi,ds=ao}if(ys===$n.length)return D(wn,ds),ai&&sc(wn,ys),ss;if(ds===null){for(;ys<$n.length;ys++)ds=pr(wn,$n[ys],yr),ds!==null&&(hn=Fe(ds,hn,ys),us===null?ss=ds:us.sibling=ds,us=ds);return ai&&sc(wn,ys),ss}for(ds=ce(wn,ds);ys<$n.length;ys++)ao=Pr(ds,wn,ys,$n[ys],yr),ao!==null&&(x&&ao.alternate!==null&&ds.delete(ao.key===null?ys:ao.key),hn=Fe(ao,hn,ys),us===null?ss=ao:us.sibling=ao,us=ao);return x&&ds.forEach(function(uh){return S(wn,uh)}),ai&&sc(wn,ys),ss}function Zr(wn,hn,$n,yr){var ss=B($n);if(typeof ss!="function")throw Error(n(150));if($n=ss.call($n),$n==null)throw Error(n(151));for(var us=ss=null,ds=hn,ys=hn=0,ao=null,oi=$n.next();ds!==null&&!oi.done;ys++,oi=$n.next()){ds.index>ys?(ao=ds,ds=null):ao=ds.sibling;var uh=rr(wn,ds,oi.value,yr);if(uh===null){ds===null&&(ds=ao);break}x&&ds&&uh.alternate===null&&S(wn,ds),hn=Fe(uh,hn,ys),us===null?ss=uh:us.sibling=uh,us=uh,ds=ao}if(oi.done)return D(wn,ds),ai&&sc(wn,ys),ss;if(ds===null){for(;!oi.done;ys++,oi=$n.next())oi=pr(wn,oi.value,yr),oi!==null&&(hn=Fe(oi,hn,ys),us===null?ss=oi:us.sibling=oi,us=oi);return ai&&sc(wn,ys),ss}for(ds=ce(wn,ds);!oi.done;ys++,oi=$n.next())oi=Pr(ds,wn,ys,oi.value,yr),oi!==null&&(x&&oi.alternate!==null&&ds.delete(oi.key===null?ys:oi.key),hn=Fe(oi,hn,ys),us===null?ss=oi:us.sibling=oi,us=oi);return x&&ds.forEach(function(rH){return S(wn,rH)}),ai&&sc(wn,ys),ss}function Sa(wn,hn,$n,yr){if(typeof $n=="object"&&$n!==null&&$n.type===I&&$n.key===null&&($n=$n.props.children),typeof $n=="object"&&$n!==null){switch($n.$$typeof){case C:e:{for(var ss=$n.key,us=hn;us!==null;){if(us.key===ss){if(ss=$n.type,ss===I){if(us.tag===7){D(wn,us.sibling),hn=Se(us,$n.props.children),hn.return=wn,wn=hn;break e}}else if(us.elementType===ss||typeof ss=="object"&&ss!==null&&ss.$$typeof===H&&pn(ss)===us.type){D(wn,us.sibling),hn=Se(us,$n.props),hn.ref=Ct(wn,us,$n),hn.return=wn,wn=hn;break e}D(wn,us);break}else S(wn,us);us=us.sibling}$n.type===I?(hn=Er($n.props.children,wn.mode,yr,$n.key),hn.return=wn,wn=hn):(yr=hr($n.type,$n.key,$n.props,null,wn.mode,yr),yr.ref=Ct(wn,hn,$n),yr.return=wn,wn=yr)}return ut(wn);case E:e:{for(us=$n.key;hn!==null;){if(hn.key===us)if(hn.tag===4&&hn.stateNode.containerInfo===$n.containerInfo&&hn.stateNode.implementation===$n.implementation){D(wn,hn.sibling),hn=Se(hn,$n.children||[]),hn.return=wn,wn=hn;break e}else{D(wn,hn);break}else S(wn,hn);hn=hn.sibling}hn=bs($n,wn.mode,yr),hn.return=wn,wn=hn}return ut(wn);case H:return us=$n._init,Sa(wn,hn,us($n._payload),yr)}if(ge($n))return Kr(wn,hn,$n,yr);if(B($n))return Zr(wn,hn,$n,yr);nn(wn,$n)}return typeof $n=="string"&&$n!==""||typeof $n=="number"?($n=""+$n,hn!==null&&hn.tag===6?(D(wn,hn.sibling),hn=Se(hn,$n),hn.return=wn,wn=hn):(D(wn,hn),hn=ar($n,wn.mode,yr),hn.return=wn,wn=hn),ut(wn)):D(wn,hn)}return Sa}var Qn=Un(!0),Hr=Un(!1),Zs=Ma(null),Ci=null,u0=null,G0=null;function hf(){G0=u0=Ci=null}function Dh(x){var S=Zs.current;Os(Zs),x._currentValue=S}function kd(x,S,D){for(;x!==null;){var ce=x.alternate;if((x.childLanes&S)!==S?(x.childLanes|=S,ce!==null&&(ce.childLanes|=S)):ce!==null&&(ce.childLanes&S)!==S&&(ce.childLanes|=S),x===D)break;x=x.return}}function d0(x,S){Ci=x,G0=u0=null,x=x.dependencies,x!==null&&x.firstContext!==null&&((x.lanes&S)!==0&&(Mo=!0),x.firstContext=null)}function el(x){var S=x._currentValue;if(G0!==x)if(x={context:x,memoizedValue:S,next:null},u0===null){if(Ci===null)throw Error(n(308));u0=x,Ci.dependencies={lanes:0,firstContext:x}}else u0=u0.next=x;return S}var to=null;function pf(x){to===null?to=[x]:to.push(x)}function q0(x,S,D,ce){var Se=S.interleaved;return Se===null?(D.next=D,pf(S)):(D.next=Se.next,Se.next=D),S.interleaved=D,Fu(x,ce)}function Fu(x,S){x.lanes|=S;var D=x.alternate;for(D!==null&&(D.lanes|=S),D=x,x=x.return;x!==null;)x.childLanes|=S,D=x.alternate,D!==null&&(D.childLanes|=S),D=x,x=x.return;return D.tag===3?D.stateNode:null}var Qs=!1;function h0(x){x.updateQueue={baseState:x.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Sb(x,S){x=x.updateQueue,S.updateQueue===x&&(S.updateQueue={baseState:x.baseState,firstBaseUpdate:x.firstBaseUpdate,lastBaseUpdate:x.lastBaseUpdate,shared:x.shared,effects:x.effects})}function Wu(x,S){return{eventTime:x,lane:S,tag:0,payload:null,callback:null,next:null}}function Ad(x,S,D){var ce=x.updateQueue;if(ce===null)return null;if(ce=ce.shared,(Ws&2)!==0){var Se=ce.pending;return Se===null?S.next=S:(S.next=Se.next,Se.next=S),ce.pending=S,Fu(x,D)}return Se=ce.interleaved,Se===null?(S.next=S,pf(ce)):(S.next=Se.next,Se.next=S),ce.interleaved=S,Fu(x,D)}function ff(x,S,D){if(S=S.updateQueue,S!==null&&(S=S.shared,(D&4194240)!==0)){var ce=S.lanes;ce&=x.pendingLanes,D|=ce,S.lanes=D,jn(x,D)}}function jb(x,S){var D=x.updateQueue,ce=x.alternate;if(ce!==null&&(ce=ce.updateQueue,D===ce)){var Se=null,Fe=null;if(D=D.firstBaseUpdate,D!==null){do{var ut={eventTime:D.eventTime,lane:D.lane,tag:D.tag,payload:D.payload,callback:D.callback,next:null};Fe===null?Se=Fe=ut:Fe=Fe.next=ut,D=D.next}while(D!==null);Fe===null?Se=Fe=S:Fe=Fe.next=S}else Se=Fe=S;D={baseState:ce.baseState,firstBaseUpdate:Se,lastBaseUpdate:Fe,shared:ce.shared,effects:ce.effects},x.updateQueue=D;return}x=D.lastBaseUpdate,x===null?D.firstBaseUpdate=S:x.next=S,D.lastBaseUpdate=S}function qs(x,S,D,ce){var Se=x.updateQueue;Qs=!1;var Fe=Se.firstBaseUpdate,ut=Se.lastBaseUpdate,Ft=Se.shared.pending;if(Ft!==null){Se.shared.pending=null;var ln=Ft,En=ln.next;ln.next=null,ut===null?Fe=En:ut.next=En,ut=ln;var or=x.alternate;or!==null&&(or=or.updateQueue,Ft=or.lastBaseUpdate,Ft!==ut&&(Ft===null?or.firstBaseUpdate=En:Ft.next=En,or.lastBaseUpdate=ln))}if(Fe!==null){var pr=Se.baseState;ut=0,or=En=ln=null,Ft=Fe;do{var rr=Ft.lane,Pr=Ft.eventTime;if((ce&rr)===rr){or!==null&&(or=or.next={eventTime:Pr,lane:0,tag:Ft.tag,payload:Ft.payload,callback:Ft.callback,next:null});e:{var Kr=x,Zr=Ft;switch(rr=S,Pr=D,Zr.tag){case 1:if(Kr=Zr.payload,typeof Kr=="function"){pr=Kr.call(Pr,pr,rr);break e}pr=Kr;break e;case 3:Kr.flags=Kr.flags&-65537|128;case 0:if(Kr=Zr.payload,rr=typeof Kr=="function"?Kr.call(Pr,pr,rr):Kr,rr==null)break e;pr=V({},pr,rr);break e;case 2:Qs=!0}}Ft.callback!==null&&Ft.lane!==0&&(x.flags|=64,rr=Se.effects,rr===null?Se.effects=[Ft]:rr.push(Ft))}else Pr={eventTime:Pr,lane:rr,tag:Ft.tag,payload:Ft.payload,callback:Ft.callback,next:null},or===null?(En=or=Pr,ln=pr):or=or.next=Pr,ut|=rr;if(Ft=Ft.next,Ft===null){if(Ft=Se.shared.pending,Ft===null)break;rr=Ft,Ft=rr.next,rr.next=null,Se.lastBaseUpdate=rr,Se.shared.pending=null}}while(!0);if(or===null&&(ln=pr),Se.baseState=ln,Se.firstBaseUpdate=En,Se.lastBaseUpdate=or,S=Se.shared.interleaved,S!==null){Se=S;do ut|=Se.lane,Se=Se.next;while(Se!==S)}else Fe===null&&(Se.shared.lanes=0);y0|=ut,x.lanes=ut,x.memoizedState=pr}}function Cb(x,S,D){if(x=S.effects,S.effects=null,x!==null)for(S=0;SD?D:4,x(!0);var ce=mf.transition;mf.transition={};try{x(!1),S()}finally{_n=D,mf.transition=ce}}function yf(){return Sl().memoizedState}function Pb(x,S,D){var ce=Fc(x);if(D={lane:ce,action:D,hasEagerState:!1,eagerState:null,next:null},Ob(x))vf(S,D);else if(D=q0(x,S,D,ce),D!==null){var Se=io();Nl(D,x,ce,Se),Lb(D,S,ce)}}function r2(x,S,D){var ce=Fc(x),Se={lane:ce,action:D,hasEagerState:!1,eagerState:null,next:null};if(Ob(x))vf(S,Se);else{var Fe=x.alternate;if(x.lanes===0&&(Fe===null||Fe.lanes===0)&&(Fe=S.lastRenderedReducer,Fe!==null))try{var ut=S.lastRenderedState,Ft=Fe(ut,D);if(Se.hasEagerState=!0,Se.eagerState=Ft,ya(Ft,ut)){var ln=S.interleaved;ln===null?(Se.next=Se,pf(S)):(Se.next=ln.next,ln.next=Se),S.interleaved=Se;return}}catch{}finally{}D=q0(x,S,Se,ce),D!==null&&(Se=io(),Nl(D,x,ce,Se),Lb(D,S,ce))}}function Ob(x){var S=x.alternate;return x===Bi||S!==null&&S===Bi}function vf(x,S){Q0=Md=!0;var D=x.pending;D===null?S.next=S:(S.next=D.next,D.next=S),x.pending=S}function Lb(x,S,D){if((D&4194240)!==0){var ce=S.lanes;ce&=x.pendingLanes,D|=ce,S.lanes=D,jn(x,D)}}var wf={readContext:el,useCallback:ra,useContext:ra,useEffect:ra,useImperativeHandle:ra,useInsertionEffect:ra,useLayoutEffect:ra,useMemo:ra,useReducer:ra,useRef:ra,useState:ra,useDebugValue:ra,useDeferredValue:ra,useTransition:ra,useMutableSource:ra,useSyncExternalStore:ra,useId:ra,unstable_isNewReconciler:!1},s2={readContext:el,useCallback:function(x,S){return cc().memoizedState=[x,S===void 0?null:S],x},useContext:el,useEffect:xf,useImperativeHandle:function(x,S,D){return D=D!=null?D.concat([x]):null,Kh(4194308,4,Td.bind(null,S,x),D)},useLayoutEffect:function(x,S){return Kh(4194308,4,x,S)},useInsertionEffect:function(x,S){return Kh(4,2,x,S)},useMemo:function(x,S){var D=cc();return S=S===void 0?null:S,x=x(),D.memoizedState=[x,S],x},useReducer:function(x,S,D){var ce=cc();return S=D!==void 0?D(S):S,ce.memoizedState=ce.baseState=S,x={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:x,lastRenderedState:S},ce.queue=x,x=x.dispatch=Pb.bind(null,Bi,x),[ce.memoizedState,x]},useRef:function(x){var S=cc();return x={current:x},S.memoizedState=x},useState:Xm,useDebugValue:Qm,useDeferredValue:function(x){return cc().memoizedState=x},useTransition:function(){var x=Xm(!1),S=x[0];return x=n2.bind(null,x[1]),cc().memoizedState=x,[S,x]},useMutableSource:function(){},useSyncExternalStore:function(x,S,D){var ce=Bi,Se=cc();if(ai){if(D===void 0)throw Error(n(407));D=D()}else{if(D=S(),$a===null)throw Error(n(349));(tl&30)!==0||Ib(ce,S,D)}Se.memoizedState=D;var Fe={value:D,getSnapshot:S};return Se.queue=Fe,xf(kb.bind(null,ce,Fe,x),[x]),ce.flags|=2048,th(9,p0.bind(null,ce,Fe,D,S),void 0,null),D},useId:function(){var x=cc(),S=$a.identifierPrefix;if(ai){var D=La,ce=ma;D=(ce&~(1<<32-St(ce)-1)).toString(32)+D,S=":"+S+"R"+D,D=Gh++,0<\/script>",x=x.removeChild(x.firstChild)):typeof ce.is=="string"?x=ut.createElement(D,{is:ce.is}):(x=ut.createElement(D),D==="select"&&(ut=x,ce.multiple?ut.multiple=!0:ce.size&&(ut.size=ce.size))):x=ut.createElementNS(x,D),x[eo]=S,x[ec]=ce,e1(x,S,!1,!1),S.stateNode=x;e:{switch(ut=Te(D,ce),D){case"dialog":Gs("cancel",x),Gs("close",x),Se=ce;break;case"iframe":case"object":case"embed":Gs("load",x),Se=ce;break;case"video":case"audio":for(Se=0;SePd&&(S.flags|=128,ce=!0,Jh(Fe,!1),S.lanes=4194304)}else{if(!ce)if(x=Fm(ut),x!==null){if(S.flags|=128,ce=!0,D=x.updateQueue,D!==null&&(S.updateQueue=D,S.flags|=4),Jh(Fe,!0),Fe.tail===null&&Fe.tailMode==="hidden"&&!ut.alternate&&!ai)return ro(S),null}else 2*zt()-Fe.renderingStartTime>Pd&&D!==1073741824&&(S.flags|=128,ce=!0,Jh(Fe,!1),S.lanes=4194304);Fe.isBackwards?(ut.sibling=S.child,S.child=ut):(D=Fe.last,D!==null?D.sibling=ut:S.child=ut,Fe.last=ut)}return Fe.tail!==null?(S=Fe.tail,Fe.rendering=S,Fe.tail=S.sibling,Fe.renderingStartTime=zt(),S.sibling=null,D=Gi.current,Fs(Gi,ce?D&1|2:D&1),S):(ro(S),null);case 22:case 23:return sp(),ce=S.memoizedState!==null,x!==null&&x.memoizedState!==null!==ce&&(S.flags|=8192),ce&&(S.mode&1)!==0?(rl&1073741824)!==0&&(ro(S),S.subtreeFlags&6&&(S.flags|=8192)):ro(S),null;case 24:return null;case 25:return null}throw Error(n(156,S.tag))}function c2(x,S){switch(ic(S),S.tag){case 1:return Ra(S.type)&&Mi(),x=S.flags,x&65536?(S.flags=x&-65537|128,S):null;case 3:return Y0(),Os(Ta),Os(pa),Hh(),x=S.flags,(x&65536)!==0&&(x&128)===0?(S.flags=x&-65537|128,S):null;case 5:return J0(S),null;case 13:if(Os(Gi),x=S.memoizedState,x!==null&&x.dehydrated!==null){if(S.alternate===null)throw Error(n(340));Oe()}return x=S.flags,x&65536?(S.flags=x&-65537|128,S):null;case 19:return Os(Gi),null;case 4:return Y0(),null;case 10:return Dh(S.type._context),null;case 22:case 23:return sp(),null;case 24:return null;default:return null}}var Sf=!1,so=!1,u2=typeof WeakSet=="function"?WeakSet:Set,Fr=null;function oh(x,S){var D=x.ref;if(D!==null)if(typeof D=="function")try{D(null)}catch(ce){ft(x,S,ce)}else D.current=null}function pg(x,S,D){try{D()}catch(ce){ft(x,S,ce)}}var t1=!1;function d2(x,S){if(Au=Et,x=wd(),wu(x)){if("selectionStart"in x)var D={start:x.selectionStart,end:x.selectionEnd};else e:{D=(D=x.ownerDocument)&&D.defaultView||window;var ce=D.getSelection&&D.getSelection();if(ce&&ce.rangeCount!==0){D=ce.anchorNode;var Se=ce.anchorOffset,Fe=ce.focusNode;ce=ce.focusOffset;try{D.nodeType,Fe.nodeType}catch{D=null;break e}var ut=0,Ft=-1,ln=-1,En=0,or=0,pr=x,rr=null;t:for(;;){for(var Pr;pr!==D||Se!==0&&pr.nodeType!==3||(Ft=ut+Se),pr!==Fe||ce!==0&&pr.nodeType!==3||(ln=ut+ce),pr.nodeType===3&&(ut+=pr.nodeValue.length),(Pr=pr.firstChild)!==null;)rr=pr,pr=Pr;for(;;){if(pr===x)break t;if(rr===D&&++En===Se&&(Ft=ut),rr===Fe&&++or===ce&&(ln=ut),(Pr=pr.nextSibling)!==null)break;pr=rr,rr=pr.parentNode}pr=Pr}D=Ft===-1||ln===-1?null:{start:Ft,end:ln}}else D=null}D=D||{start:0,end:0}}else D=null;for(Mu={focusedElem:x,selectionRange:D},Et=!1,Fr=S;Fr!==null;)if(S=Fr,x=S.child,(S.subtreeFlags&1028)!==0&&x!==null)x.return=S,Fr=x;else for(;Fr!==null;){S=Fr;try{var Kr=S.alternate;if((S.flags&1024)!==0)switch(S.tag){case 0:case 11:case 15:break;case 1:if(Kr!==null){var Zr=Kr.memoizedProps,Sa=Kr.memoizedState,wn=S.stateNode,hn=wn.getSnapshotBeforeUpdate(S.elementType===S.type?Zr:uc(S.type,Zr),Sa);wn.__reactInternalSnapshotBeforeUpdate=hn}break;case 3:var $n=S.stateNode.containerInfo;$n.nodeType===1?$n.textContent="":$n.nodeType===9&&$n.documentElement&&$n.removeChild($n.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(n(163))}}catch(yr){ft(S,S.return,yr)}if(x=S.sibling,x!==null){x.return=S.return,Fr=x;break}Fr=S.return}return Kr=t1,t1=!1,Kr}function lh(x,S,D){var ce=S.updateQueue;if(ce=ce!==null?ce.lastEffect:null,ce!==null){var Se=ce=ce.next;do{if((Se.tag&x)===x){var Fe=Se.destroy;Se.destroy=void 0,Fe!==void 0&&pg(S,D,Fe)}Se=Se.next}while(Se!==ce)}}function di(x,S){if(S=S.updateQueue,S=S!==null?S.lastEffect:null,S!==null){var D=S=S.next;do{if((D.tag&x)===x){var ce=D.create;D.destroy=ce()}D=D.next}while(D!==S)}}function f0(x){var S=x.ref;if(S!==null){var D=x.stateNode;switch(x.tag){case 5:x=D;break;default:x=D}typeof S=="function"?S(x):S.current=x}}function jf(x){var S=x.alternate;S!==null&&(x.alternate=null,jf(S)),x.child=null,x.deletions=null,x.sibling=null,x.tag===5&&(S=x.stateNode,S!==null&&(delete S[eo],delete S[ec],delete S[Rc],delete S[Yo],delete S[Pc])),x.stateNode=null,x.return=null,x.dependencies=null,x.memoizedProps=null,x.memoizedState=null,x.pendingProps=null,x.stateNode=null,x.updateQueue=null}function fg(x){return x.tag===5||x.tag===3||x.tag===4}function m0(x){e:for(;;){for(;x.sibling===null;){if(x.return===null||fg(x.return))return null;x=x.return}for(x.sibling.return=x.return,x=x.sibling;x.tag!==5&&x.tag!==6&&x.tag!==18;){if(x.flags&2||x.child===null||x.tag===4)continue e;x.child.return=x,x=x.child}if(!(x.flags&2))return x.stateNode}}function Cf(x,S,D){var ce=x.tag;if(ce===5||ce===6)x=x.stateNode,S?D.nodeType===8?D.parentNode.insertBefore(x,S):D.insertBefore(x,S):(D.nodeType===8?(S=D.parentNode,S.insertBefore(x,D)):(S=D,S.appendChild(x)),D=D._reactRootContainer,D!=null||S.onclick!==null||(S.onclick=Tc));else if(ce!==4&&(x=x.child,x!==null))for(Cf(x,S,D),x=x.sibling;x!==null;)Cf(x,S,D),x=x.sibling}function g0(x,S,D){var ce=x.tag;if(ce===5||ce===6)x=x.stateNode,S?D.insertBefore(x,S):D.appendChild(x);else if(ce!==4&&(x=x.child,x!==null))for(g0(x,S,D),x=x.sibling;x!==null;)g0(x,S,D),x=x.sibling}var Fa=null,jl=!1;function Rd(x,S,D){for(D=D.child;D!==null;)mg(x,S,D),D=D.sibling}function mg(x,S,D){if(xt&&typeof xt.onCommitFiberUnmount=="function")try{xt.onCommitFiberUnmount(_t,D)}catch{}switch(D.tag){case 5:so||oh(D,S);case 6:var ce=Fa,Se=jl;Fa=null,Rd(x,S,D),Fa=ce,jl=Se,Fa!==null&&(jl?(x=Fa,D=D.stateNode,x.nodeType===8?x.parentNode.removeChild(D):x.removeChild(D)):Fa.removeChild(D.stateNode));break;case 18:Fa!==null&&(jl?(x=Fa,D=D.stateNode,x.nodeType===8?Ql(x.parentNode,D):x.nodeType===1&&Ql(x,D),Zn(x)):Ql(Fa,D.stateNode));break;case 4:ce=Fa,Se=jl,Fa=D.stateNode.containerInfo,jl=!0,Rd(x,S,D),Fa=ce,jl=Se;break;case 0:case 11:case 14:case 15:if(!so&&(ce=D.updateQueue,ce!==null&&(ce=ce.lastEffect,ce!==null))){Se=ce=ce.next;do{var Fe=Se,ut=Fe.destroy;Fe=Fe.tag,ut!==void 0&&((Fe&2)!==0||(Fe&4)!==0)&&pg(D,S,ut),Se=Se.next}while(Se!==ce)}Rd(x,S,D);break;case 1:if(!so&&(oh(D,S),ce=D.stateNode,typeof ce.componentWillUnmount=="function"))try{ce.props=D.memoizedProps,ce.state=D.memoizedState,ce.componentWillUnmount()}catch(Ft){ft(D,S,Ft)}Rd(x,S,D);break;case 21:Rd(x,S,D);break;case 22:D.mode&1?(so=(ce=so)||D.memoizedState!==null,Rd(x,S,D),so=ce):Rd(x,S,D);break;default:Rd(x,S,D)}}function Nf(x){var S=x.updateQueue;if(S!==null){x.updateQueue=null;var D=x.stateNode;D===null&&(D=x.stateNode=new u2),S.forEach(function(ce){var Se=Dt.bind(null,x,ce);D.has(ce)||(D.add(ce),ce.then(Se,Se))})}}function Cl(x,S){var D=S.deletions;if(D!==null)for(var ce=0;ceSe&&(Se=ut),ce&=~Fe}if(ce=Se,ce=zt()-ce,ce=(120>ce?120:480>ce?480:1080>ce?1080:1920>ce?1920:3e3>ce?3e3:4320>ce?4320:1960*n1(ce/1960))-ce,10x?16:x,Hu===null)var ce=!1;else{if(x=Hu,Hu=null,np=0,(Ws&6)!==0)throw Error(n(331));var Se=Ws;for(Ws|=4,Fr=x.current;Fr!==null;){var Fe=Fr,ut=Fe.child;if((Fr.flags&16)!==0){var Ft=Fe.deletions;if(Ft!==null){for(var ln=0;lnzt()-Af?Wc(x,0):gg|=D),Ro(x,S)}function Rt(x,S){S===0&&((x.mode&1)===0?S=1:(S=rt,rt<<=1,(rt&130023424)===0&&(rt=4194304)));var D=io();x=Fu(x,S),x!==null&&(Zt(x,S,D),Ro(x,D))}function sn(x){var S=x.memoizedState,D=0;S!==null&&(D=S.retryLane),Rt(x,D)}function Dt(x,S){var D=0;switch(x.tag){case 13:var ce=x.stateNode,Se=x.memoizedState;Se!==null&&(D=Se.retryLane);break;case 19:ce=x.stateNode;break;default:throw Error(n(314))}ce!==null&&ce.delete(S),Rt(x,D)}var Xt;Xt=function(x,S,D){if(x!==null)if(x.memoizedProps!==S.pendingProps||Ta.current)Mo=!0;else{if((x.lanes&D)===0&&(S.flags&128)===0)return Mo=!1,Qb(x,S,D);Mo=(x.flags&131072)!==0}else Mo=!1,ai&&(S.flags&1048576)!==0&&Uu(S,Qo,S.index);switch(S.lanes=0,S.tag){case 2:var ce=S.type;$f(x,S),x=S.pendingProps;var Se=Lc(S,pa.current);d0(S,D),Se=Vm(null,S,ce,x,Se,D);var Fe=Hm();return S.flags|=1,typeof Se=="object"&&Se!==null&&typeof Se.render=="function"&&Se.$$typeof===void 0?(S.tag=1,S.memoizedState=null,S.updateQueue=null,Ra(ce)?(Fe=!0,Id(S)):Fe=!1,S.memoizedState=Se.state!==null&&Se.state!==void 0?Se.state:null,h0(S),Se.updater=rh,S.stateNode=Se,Se._reactInternals=S,rg(S,ce,x,D),S=og(null,S,ce,!0,Fe,D)):(S.tag=0,ai&&Fe&&c0(S),Ua(null,S,Se,D),S=S.child),S;case 16:ce=S.elementType;e:{switch($f(x,S),x=S.pendingProps,Se=ce._init,ce=Se(ce._payload),S.type=ce,Se=S.tag=Hn(ce),x=uc(ce,x),Se){case 0:S=dc(null,S,ce,x,D);break e;case 1:S=Kb(null,S,ce,x,D);break e;case 11:S=Hb(null,S,ce,x,D);break e;case 14:S=ih(null,S,ce,uc(ce.type,x),D);break e}throw Error(n(306,ce,""))}return S;case 0:return ce=S.type,Se=S.pendingProps,Se=S.elementType===ce?Se:uc(ce,Se),dc(x,S,ce,Se,D);case 1:return ce=S.type,Se=S.pendingProps,Se=S.elementType===ce?Se:uc(ce,Se),Kb(x,S,ce,Se,D);case 3:e:{if(Xb(S),x===null)throw Error(n(387));ce=S.pendingProps,Fe=S.memoizedState,Se=Fe.element,Sb(x,S),qs(S,ce,null,D);var ut=S.memoizedState;if(ce=ut.element,Fe.isDehydrated)if(Fe={element:ce,isDehydrated:!1,cache:ut.cache,pendingSuspenseBoundaries:ut.pendingSuspenseBoundaries,transitions:ut.transitions},S.updateQueue.baseState=Fe,S.memoizedState=Fe,S.flags&256){Se=sh(Error(n(423)),S),S=Yb(x,S,ce,D,Se);break e}else if(ce!==Se){Se=sh(Error(n(424)),S),S=Yb(x,S,ce,D,Se);break e}else for(Hi=xo(S.stateNode.containerInfo.firstChild),wa=S,ai=!0,Ba=null,D=Hr(S,null,ce,D),S.child=D;D;)D.flags=D.flags&-3|4096,D=D.sibling;else{if(Oe(),ce===Se){S=Uc(x,S,D);break e}Ua(x,S,ce,D)}S=S.child}return S;case 5:return Nb(S),x===null&&P(S),ce=S.type,Se=S.pendingProps,Fe=x!==null?x.memoizedProps:null,ut=Se.children,Tu(ce,Se)?ut=null:Fe!==null&&Tu(ce,Fe)&&(S.flags|=32),qb(x,S),Ua(x,S,ut,D),S.child;case 6:return x===null&&P(S),null;case 13:return Yh(x,S,D);case 4:return Um(S,S.stateNode.containerInfo),ce=S.pendingProps,x===null?S.child=Qn(S,null,ce,D):Ua(x,S,ce,D),S.child;case 11:return ce=S.type,Se=S.pendingProps,Se=S.elementType===ce?Se:uc(ce,Se),Hb(x,S,ce,Se,D);case 7:return Ua(x,S,S.pendingProps,D),S.child;case 8:return Ua(x,S,S.pendingProps.children,D),S.child;case 12:return Ua(x,S,S.pendingProps.children,D),S.child;case 10:e:{if(ce=S.type._context,Se=S.pendingProps,Fe=S.memoizedProps,ut=Se.value,Fs(Zs,ce._currentValue),ce._currentValue=ut,Fe!==null)if(ya(Fe.value,ut)){if(Fe.children===Se.children&&!Ta.current){S=Uc(x,S,D);break e}}else for(Fe=S.child,Fe!==null&&(Fe.return=S);Fe!==null;){var Ft=Fe.dependencies;if(Ft!==null){ut=Fe.child;for(var ln=Ft.firstContext;ln!==null;){if(ln.context===ce){if(Fe.tag===1){ln=Wu(-1,D&-D),ln.tag=2;var En=Fe.updateQueue;if(En!==null){En=En.shared;var or=En.pending;or===null?ln.next=ln:(ln.next=or.next,or.next=ln),En.pending=ln}}Fe.lanes|=D,ln=Fe.alternate,ln!==null&&(ln.lanes|=D),kd(Fe.return,D,S),Ft.lanes|=D;break}ln=ln.next}}else if(Fe.tag===10)ut=Fe.type===S.type?null:Fe.child;else if(Fe.tag===18){if(ut=Fe.return,ut===null)throw Error(n(341));ut.lanes|=D,Ft=ut.alternate,Ft!==null&&(Ft.lanes|=D),kd(ut,D,S),ut=Fe.sibling}else ut=Fe.child;if(ut!==null)ut.return=Fe;else for(ut=Fe;ut!==null;){if(ut===S){ut=null;break}if(Fe=ut.sibling,Fe!==null){Fe.return=ut.return,ut=Fe;break}ut=ut.return}Fe=ut}Ua(x,S,Se.children,D),S=S.child}return S;case 9:return Se=S.type,ce=S.pendingProps.children,d0(S,D),Se=el(Se),ce=ce(Se),S.flags|=1,Ua(x,S,ce,D),S.child;case 14:return ce=S.type,Se=uc(ce,S.pendingProps),Se=uc(ce.type,Se),ih(x,S,ce,Se,D);case 15:return ah(x,S,S.type,S.pendingProps,D);case 17:return ce=S.type,Se=S.pendingProps,Se=S.elementType===ce?Se:uc(ce,Se),$f(x,S),S.tag=1,Ra(ce)?(x=!0,Id(S)):x=!1,d0(S,D),Bb(S,ce,Se),rg(S,ce,Se,D),og(null,S,ce,!0,x,D);case 19:return Zb(x,S,D);case 22:return Gb(x,S,D)}throw Error(n(156,S.tag))};function xn(x,S){return Jt(x,S)}function on(x,S,D,ce){this.tag=x,this.key=D,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=S,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=ce,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Pn(x,S,D,ce){return new on(x,S,D,ce)}function Jn(x){return x=x.prototype,!(!x||!x.isReactComponent)}function Hn(x){if(typeof x=="function")return Jn(x)?1:0;if(x!=null){if(x=x.$$typeof,x===L)return 11;if(x===q)return 14}return 2}function Nn(x,S){var D=x.alternate;return D===null?(D=Pn(x.tag,S,x.key,x.mode),D.elementType=x.elementType,D.type=x.type,D.stateNode=x.stateNode,D.alternate=x,x.alternate=D):(D.pendingProps=S,D.type=x.type,D.flags=0,D.subtreeFlags=0,D.deletions=null),D.flags=x.flags&14680064,D.childLanes=x.childLanes,D.lanes=x.lanes,D.child=x.child,D.memoizedProps=x.memoizedProps,D.memoizedState=x.memoizedState,D.updateQueue=x.updateQueue,S=x.dependencies,D.dependencies=S===null?null:{lanes:S.lanes,firstContext:S.firstContext},D.sibling=x.sibling,D.index=x.index,D.ref=x.ref,D}function hr(x,S,D,ce,Se,Fe){var ut=2;if(ce=x,typeof x=="function")Jn(x)&&(ut=1);else if(typeof x=="string")ut=5;else e:switch(x){case I:return Er(D.children,Se,Fe,S);case R:ut=8,Se|=8;break;case A:return x=Pn(12,D,S,Se|2),x.elementType=A,x.lanes=Fe,x;case X:return x=Pn(13,D,S,Se),x.elementType=X,x.lanes=Fe,x;case T:return x=Pn(19,D,S,Se),x.elementType=T,x.lanes=Fe,x;case J:return as(D,Se,Fe,S);default:if(typeof x=="object"&&x!==null)switch(x.$$typeof){case O:ut=10;break e;case F:ut=9;break e;case L:ut=11;break e;case q:ut=14;break e;case H:ut=16,ce=null;break e}throw Error(n(130,x==null?x:typeof x,""))}return S=Pn(ut,D,S,Se),S.elementType=x,S.type=ce,S.lanes=Fe,S}function Er(x,S,D,ce){return x=Pn(7,x,ce,S),x.lanes=D,x}function as(x,S,D,ce){return x=Pn(22,x,ce,S),x.elementType=J,x.lanes=D,x.stateNode={isHidden:!1},x}function ar(x,S,D){return x=Pn(6,x,null,S),x.lanes=D,x}function bs(x,S,D){return S=Pn(4,x.children!==null?x.children:[],x.key,S),S.lanes=D,S.stateNode={containerInfo:x.containerInfo,pendingChildren:null,implementation:x.implementation},S}function qi(x,S,D,ce,Se){this.tag=S,this.containerInfo=x,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Vt(0),this.expirationTimes=Vt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Vt(0),this.identifierPrefix=ce,this.onRecoverableError=Se,this.mutableSourceEagerHydrationData=null}function Ds(x,S,D,ce,Se,Fe,ut,Ft,ln){return x=new qi(x,S,D,Ft,ln),S===1?(S=1,Fe===!0&&(S|=8)):S=0,Fe=Pn(3,null,null,S),x.current=Fe,Fe.stateNode=x,Fe.memoizedState={element:ce,isDehydrated:D,cache:null,transitions:null,pendingSuspenseBoundaries:null},h0(Fe),x}function hi(x,S,D){var ce=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}return e(),m2.exports=pH(),m2.exports}var YS;function fH(){if(YS)return d1;YS=1;var e=sP();return d1.createRoot=e.createRoot,d1.hydrateRoot=e.hydrateRoot,d1}var mH=fH();const JS=Am(mH),gH="modulepreload",xH=function(e,t){return new URL(e,t).href},ZS={},mn=function(t,n,r){let i=Promise.resolve();if(n&&n.length>0){let o=function(d){return Promise.all(d.map(h=>Promise.resolve(h).then(p=>({status:"fulfilled",value:p}),p=>({status:"rejected",reason:p}))))};const l=document.getElementsByTagName("link"),c=document.querySelector("meta[property=csp-nonce]"),u=(c==null?void 0:c.nonce)||(c==null?void 0:c.getAttribute("nonce"));i=o(n.map(d=>{if(d=xH(d,r),d in ZS)return;ZS[d]=!0;const h=d.endsWith(".css"),p=h?'[rel="stylesheet"]':"";if(!!r)for(let g=l.length-1;g>=0;g--){const y=l[g];if(y.href===d&&(!h||y.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${d}"]${p}`))return;const b=document.createElement("link");if(b.rel=h?"stylesheet":gH,h||(b.as="script"),b.crossOrigin="",b.href=d,u&&b.setAttribute("nonce",u),document.head.appendChild(b),h)return new Promise((g,y)=>{b.addEventListener("load",g),b.addEventListener("error",()=>y(new Error(`Unable to preload CSS for ${d}`)))})}))}function a(o){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=o,window.dispatchEvent(l),!l.defaultPrevented)throw o}return i.then(o=>{for(const l of o||[])l.status==="rejected"&&a(l.reason);return t().catch(a)})};var Ni=sP();const zg=Am(Ni),h1=[{id:"comfly",name:"Comfly AI",baseUrl:"https://ai.comfly.chat",description:"默认 API 端点",isDefault:!0},{id:"t8star",name:"T8Star",baseUrl:"https://ai.t8star.cn",description:"备用 API 端点"},{id:"midjourney",name:"Midjourney",baseUrl:"https://api.midjourney.com",description:"Midjourney 官方"},{id:"custom",name:"自定义",baseUrl:"",description:"用户自定义端点"}],ts="https://ai.comfly.chat",$p="https://generativelanguage.googleapis.com",fx="https://grsaiapi.com",$o={API_BASE_URL:"http://localhost:5100",SESSION_STORAGE_KEY:"qiaodoumayi_jimeng_session_id",USE_LOCAL_FILE_KEY:"qiaodoumayi_jimeng_use_local_file"},QS={SERVER_URL:"http://127.0.0.1:9528",PING_INTERVAL:3e4},bH=["gemini-image","qwen-image","doubao-seedream","jimeng","kling-v1-6","wan-2.5","google-veo3.1","deepseek-v3"],ej=["Auto","1:1","16:9","9:16","4:3","3:4","21:9","3:2","2:3"],Lp=["3:2","2:3","1:1"],yH=["Auto","1:1","16:9","9:16","3:2","2:3"],tj=["Auto","1K","2K","4K"],Kz=[{label:"MJ V7",value:"--v 7"},{label:"MJ V6.1",value:"--v 6.1"},{label:"MJ V6",value:"--v 6"},{label:"MJ V5.2",value:"--v 5.2"},{label:"MJ V5.1",value:"--v 5.1"},{label:"Niji V7",value:"--niji 7"},{label:"Niji V6",value:"--niji 6"},{label:"Niji V5",value:"--niji 5"},{label:"Niji V4",value:"--niji 4"}],nj=[{label:"v3.0",value:"suno-v3.0"},{label:"v3.5",value:"suno-v3.5"},{label:"v4",value:"suno-v4"},{label:"v4.5",value:"suno-v4.5"},{label:"v4.5+",value:"suno-v4.5+"},{label:"v5",value:"suno-v5"}],tm=[{id:"gemini-3-pro",provider:"Gemini 3 Pro",modelName:"gemini-3-pro-preview",type:"Chat",key:"",url:ts},{id:"gemini-3.1-pro",provider:"Gemini 3.1 Pro",modelName:"gemini-3.1-pro-preview",type:"Chat",key:"",url:ts},{id:"gemini-3-flash-thinking",provider:"Gemini 3 Flash Thinking",modelName:"gemini-3-flash-preview-thinking-128",type:"Chat",key:"",url:ts},{id:"gemini-3.1-flash-lite-preview",provider:"Gemini 3.1 Flash Lite",modelName:"gemini-3.1-flash-lite-preview",type:"Chat",key:"",url:ts},{id:"gpt-5-1",provider:"GPT 5.1",modelName:"gpt-5.1",type:"Chat",key:"",url:ts},{id:"gpt-5-2",provider:"GPT 5.2",modelName:"gpt-5.2",type:"Chat",key:"",url:ts},{id:"gpt-5-3-codex",provider:"GPT 5.3",modelName:"gpt-5.3-codex",type:"Chat",key:"",url:ts},{id:"gpt-5.4",provider:"GPT 5.4",modelName:"gpt-5.4",type:"Chat",key:"",url:ts},{id:"gpt-5.4-pro",provider:"GPT 5.4 Pro",modelName:"gpt-5.4-pro",type:"Chat",key:"",url:ts},{id:"deepseek-v3-1-250821-thinking",provider:"DeepSeek V3",modelName:"deepseek-v3-1-250821-thinking",type:"Chat",key:"",url:ts},{id:"gpt-4o",provider:"GPT-4o",modelName:"gpt-4o",type:"Chat",key:"",url:ts},{id:"claude-opus-4-5",provider:"Claude 4.5",modelName:"claude-opus-4-5-20251101-thinking",type:"Chat",key:"",url:ts},{id:"claude-opus-4-6",provider:"Claude 4.6",modelName:"claude-opus-4-6",type:"Chat",key:"",url:ts},{id:"kimi-k2.5",provider:"Kimi K2.5",modelName:"kimi-k2.5",type:"Chat",key:"",url:ts},{id:"grok-4",provider:"Grok 4",modelName:"grok-4",type:"Chat",key:"",url:ts},{id:"grok-4-fast-non-reasoning",provider:"Grok 4 Fast",modelName:"grok-4-fast-non-reasoning",type:"Chat",key:"",url:ts},{id:"minimax-m2.5-highspeed",provider:"MiniMax M2.5 Highspeed",modelName:"MiniMax-M2.5-highspeed",type:"Chat",key:"",url:ts},{id:"minimax-m2.7",provider:"MiniMax M2.7",modelName:"MiniMax-M2.7",type:"Chat",key:"",url:ts},{id:"glm-5-turbo",provider:"GLM 5 Turbo",modelName:"glm-5-turbo",type:"Chat",key:"",url:ts},{id:"doubao-seed-2-0-pro-260215",provider:"Seedance Doubao Seed 2.0 Pro",modelName:"doubao-seed-2-0-pro-260215",type:"Chat",key:"",url:"http://127.0.0.1:9530"},{id:"nano-banana",provider:"Nano Banana",modelName:"nano-banana",type:"Image",key:"",url:ts},{id:"nano-banana-2",provider:"Nano Banana Pro",modelName:"nano-banana-2",type:"Image",key:"",url:ts},{id:"gemini-3.1-flash-image-preview",provider:"Nano Banana 2",modelName:"gemini-3.1-flash-image-preview",type:"Image",key:"",url:ts},{id:"grsai-nano-banana-fast",provider:"Grsai Nano Banana",modelName:"nano-banana-fast",type:"Image",key:"",url:fx},{id:"grsai-nano-banana-pro",provider:"Grsai Nano Banana Pro",modelName:"nano-banana-pro",type:"Image",key:"",url:fx},{id:"grsai-nano-banana-2",provider:"Grsai Nano Banana 2",modelName:"nano-banana-2",type:"Image",key:"",url:fx},{id:"gemini-3.1-flash-image-official",provider:"Gemini 3.1 Flash Image 官",modelName:"gemini-3.1-flash-image-preview",type:"Image",key:"",url:$p},{id:"gemini-3-pro-image-official",provider:"Gemini 3 Pro Image 官",modelName:"gemini-3-pro-image-preview",type:"Image",key:"",url:$p},{id:"gemini-2.5-flash-image-official",provider:"Gemini 2.5 Flash Image 官",modelName:"gemini-2.5-flash-image",type:"Image",key:"",url:$p},{id:"gpt-image",provider:"GPT-4o Image",modelName:"gpt-4o-image",type:"Image",key:"",url:ts},{id:"gpt-image-1.5",provider:"GPT Image 1.5",modelName:"gpt-image-1.5",type:"Image",key:"",url:ts},{id:"flux-kontext",provider:"Flux Kontext",modelName:"flux-kontext-pro",type:"Image",key:"",url:ts},{id:"qwen-image-edit",provider:"Qwen Image Edit",modelName:"qwen-image-edit",type:"Image",key:"",url:ts},{id:"grok-4.1-image",provider:"Grok 4.1 Image",modelName:"grok-4.1-image",type:"Image",key:"",url:ts},{id:"grok-4.2-image",provider:"Grok 4.2 Image",modelName:"grok-4.2-image",type:"Image",key:"",url:ts},{id:"z-image-official",provider:"Z-Image Official",modelName:"z-image-turbo",type:"Image",key:"",url:"http://127.0.0.1:9527/api/proxy",resolutions:["1024*1024","1024*1536","1536*1024","1280*720","720*1280","1120*1440","1440*1120","864*1536","1536*864"]},{id:"z-image-turbo",provider:"Z-Image Turbo (第三方)",modelName:"z-image-turbo",type:"Image",key:"",url:ts},{id:"mj-v6",provider:"Midjourney",modelName:"MJ V6",type:"Image",key:"",url:ts},{id:"jimeng-5.0",provider:"Jimeng 5.0",modelName:"jimeng-5.0",type:"Image",key:"",url:$o.API_BASE_URL},{id:"jimeng-4.6",provider:"Jimeng 4.6",modelName:"jimeng-4.6",type:"Image",key:"",url:$o.API_BASE_URL},{id:"jimeng-4.5",provider:"Jimeng 4.5",modelName:"jimeng-4.5",type:"Image",key:"",url:$o.API_BASE_URL},{id:"jimeng-4.1",provider:"Jimeng 4.1",modelName:"jimeng-4.1",type:"Image",key:"",url:$o.API_BASE_URL},{id:"jimeng-4.0",provider:"Jimeng 4.0",modelName:"jimeng-4.0",type:"Image",key:"",url:$o.API_BASE_URL},{id:"jimeng-3.1",provider:"Jimeng 3.1",modelName:"jimeng-3.1",type:"Image",key:"",url:$o.API_BASE_URL},{id:"wan-2.6-image-official",provider:"Wan 2.6 Image Official",modelName:"wan2.6-image",type:"Image",key:"",url:"http://127.0.0.1:9527/api/proxy",resolutions:["1280*1280","1024*1024","800*1200","1200*800","960*1280","1280*960","720*1280","1280*720","1344*576"]},{id:"seedream-4.5",provider:"Seedream 4.5",modelName:"doubao-seedream-4-5-251128",type:"Image",key:"",url:"http://127.0.0.1:9530"},{id:"seedream-4.0",provider:"Seedream 4.0",modelName:"doubao-seedream-4-0-250828",type:"Image",key:"",url:"http://127.0.0.1:9530"},{id:"sora-2",provider:"Sora 2",modelName:"sora-2",type:"Video",key:"",url:ts,durations:["5s","10s","15s"],resolutions:["720P","1080P","2K","4K"]},{id:"sora-2-pro",provider:"Sora 2 Pro",modelName:"sora-2-pro",type:"Video",key:"",url:ts,durations:["10s","15s","25s"],resolutions:["720P","1080P","2K","4K"]},{id:"google-veo3",provider:"Google Veo 3.1",modelName:"veo3.1-components",type:"Video",key:"",url:ts,durations:["8s"],resolutions:["720P","4K"]},{id:"google-veo3.1-pro",provider:"Google Veo 3.1 Pro",modelName:"veo3.1-pro",type:"Video",key:"",url:ts,durations:["8s"],resolutions:["720P","1080P","4K"]},{id:"google-veo3.1-fast",provider:"Google Veo 3.1 Fast",modelName:"veo3.1-fast",type:"Video",key:"",url:ts,durations:["8s"],resolutions:["720P","1080P"]},{id:"veo-3.1-official",provider:"Veo 3.1 官",modelName:"veo-3.1-generate-preview",type:"Video",key:"",url:$p,durations:["8s"],resolutions:["720P","1080P","4K"]},{id:"veo-3.1-fast-official",provider:"Veo 3.1 Fast 官",modelName:"veo-3.1-fast-generate-preview",type:"Video",key:"",url:$p,durations:["8s"],resolutions:["720P","1080P","4K"]},{id:"grok-3",provider:"Grok3 Video",modelName:"grok-video-3",type:"Video",key:"",url:ts,durations:["15s","10s"],resolutions:["720P","1080P"]},{id:"jimeng-video-3.0",provider:"Jimeng Video 3.0",modelName:"jimeng-video-3.0",type:"Video",key:"",url:$o.API_BASE_URL,durations:["5s","10s"],resolutions:["720P","1080P"]},{id:"jimeng-video-3.0-fast",provider:"Jimeng Video 3.0 Fast",modelName:"jimeng-video-3.0-fast",type:"Video",key:"",url:$o.API_BASE_URL,durations:["5s","10s"],resolutions:["720P","1080P"]},{id:"jimeng-video-3.0-pro",provider:"Jimeng Video 3.0 Pro",modelName:"jimeng-video-3.0-pro",type:"Video",key:"",url:$o.API_BASE_URL,durations:["5s","10s"],resolutions:["720P","1080P"]},{id:"jimeng-video-3.5-pro",provider:"Jimeng Video 3.5 Pro",modelName:"jimeng-video-3.5-pro",type:"Video",key:"",url:$o.API_BASE_URL,durations:["5s","10s","12s"],resolutions:["720P","1080P"]},{id:"jimeng-video-seedance-2.0",provider:"Jimeng Seedance 2.0",modelName:"jimeng-video-seedance-2.0",type:"Video",key:"",url:$o.API_BASE_URL,durations:["4s","5s","6s","7s","8s","9s","10s","11s","12s","13s","14s","15s"],resolutions:["720P","1080P"]},{id:"jimeng-video-seedance-2.0-fast",provider:"Jimeng Seedance 2.0 Fast",modelName:"jimeng-video-seedance-2.0-fast",type:"Video",key:"",url:$o.API_BASE_URL,durations:["4s","5s","6s","7s","8s","9s","10s","11s","12s","13s","14s","15s"],resolutions:["720P","1080P"]},{id:"hailuo-2.3",provider:"Hailuo 2.3",modelName:"MiniMax-Hailuo-2.3",type:"Video",key:"",url:ts,durations:["6s","10s"],resolutions:["768P","1080P"]},{id:"hailuo-2.3-fast",provider:"Hailuo 2.3-Fast",modelName:"MiniMax-Hailuo-2.3-Fast",type:"Video",key:"",url:ts,durations:["6s","10s"],resolutions:["768P","1080P"]},{id:"hailuo-2.0",provider:"Hailuo 2.0",modelName:"MiniMax-Hailuo-02",type:"Video",key:"",url:ts,durations:["6s","10s"],resolutions:["512P","768P","1080P"]},{id:"wan-2.6",provider:"Wan 2.6",modelName:"wan2.6-i2v",type:"Video",key:"",url:ts,durations:["5s","10s","15s"],resolutions:["720P","1080P"]},{id:"wan-2.6-official",provider:"Wan 2.6 Official",modelName:"wan2.6-i2v-flash",type:"Video",key:"",url:"http://127.0.0.1:9527/api/proxy",durations:["2s","3s","4s","5s","6s","7s","8s","9s","10s","11s","12s","13s","14s","15s"],resolutions:["720P","1080P"]},{id:"seedance-1.5-pro",provider:"Seedance 1.5 pro",modelName:"doubao-seedance-1-5-pro-251215",type:"Video",key:"",url:"http://127.0.0.1:9530",durations:["4s","5s","6s","7s","8s","9s","10s","11s","12s"],resolutions:["480P","720P","1080P"]},{id:"seedance-1-0-pro",provider:"Seedance 1.0 pro",modelName:"doubao-seedance-1-0-pro-250528",type:"Video",key:"",url:"http://127.0.0.1:9530",durations:["2s","3s","4s","5s","6s","7s","8s","9s","10s","11s","12s"],resolutions:["480P","720P","1080P"]},{id:"seedance-1-0-pro-fast",provider:"Seedance 1.0 pro fast",modelName:"doubao-seedance-1-0-pro-fast-251015",type:"Video",key:"",url:"http://127.0.0.1:9530",durations:["2s","3s","4s","5s","6s","7s","8s","9s","10s","11s","12s"],resolutions:["480P","720P","1080P"]},{id:"seedance-1-0-lite-t2v",provider:"Seedance 1.0 lite (文生)",modelName:"doubao-seedance-1-0-lite-t2v-250428",type:"Video",key:"",url:"http://127.0.0.1:9530",durations:["2s","3s","4s","5s","6s","7s","8s","9s","10s","11s","12s"],resolutions:["480P","720P","1080P"]},{id:"seedance-1-0-lite-i2v",provider:"Seedance 1.0 lite (图生)",modelName:"doubao-seedance-1-0-lite-i2v-250428",type:"Video",key:"",url:"http://127.0.0.1:9530",durations:["2s","3s","4s","5s","6s","7s","8s","9s","10s","11s","12s"],resolutions:["480P","720P","1080P"]},{id:"seedance-2.0",provider:"Seedance恶龙逗勇者",modelName:"doubao-seedance-2.0",type:"Video",key:"",url:"https://zlhub.xiaowaiyou.cn",durations:["4s","5s","6s","7s","8s","9s","10s","11s","12s","13s","14s","15s"],resolutions:["480p","720p"]},{id:"kling-o1",provider:"Kling O1",modelName:"kling-video-o1",type:"Video",key:"",url:ts,durations:["3s","4s","5s","6s","7s","8s","9s","10s"],resolutions:["720p","1080p"]},{id:"kling-v2-5-turbo",provider:"Kling v2.5 Turbo",modelName:"kling-v2-5-turbo",type:"Video",key:"",url:ts,durations:["5s","10s"],resolutions:["std","pro"]},{id:"kling-video-v2-6",provider:"Kling v2.6",modelName:"kling-v2-6",type:"Video",key:"",url:ts,durations:["5s","10s"],resolutions:["std","pro"]},{id:"kling-v3",provider:"Kling 3.0",modelName:"kling-v3",type:"Video",key:"",url:ts,durations:["3s","4s","5s","6s","7s","8s","9s","10s","11s","12s","13s","14s","15s"],resolutions:["720P","1080P"]},{id:"vidu-q2",provider:"Vidu Q2",modelName:"viduq2-pro",type:"Video",key:"",url:ts,durations:["5s","10s"],resolutions:["360p","540p","720p","1080p"]},{id:"vidu-q2-turbo",provider:"Vidu Q2 Turbo",modelName:"viduq2-turbo",type:"Video",key:"",url:ts,durations:["5s","10s"],resolutions:["360p","540p","720p","1080p"]},{id:"vidu-2.0",provider:"Vidu 2.0",modelName:"vidu2.0",type:"Video",key:"",url:ts,durations:["5s","10s"],resolutions:["360p","540p","720p","1080p"]},{id:"vidu-q3-pro",provider:"Vidu Q3 Pro",modelName:"viduq3-pro",type:"Video",key:"",url:ts,durations:["5s","10s"],resolutions:["360p","540p","720p","1080p"]},{id:"mj-video",provider:"MJ Video",modelName:"mj-video",type:"Video",key:"",url:ts,durations:["5s"]},{id:"suno-v3.0",provider:"Suno v3.0",modelName:"suno-v3.0",type:"Music",key:"",url:ts},{id:"suno-v3.5",provider:"Suno v3.5",modelName:"suno-v3.5",type:"Music",key:"",url:ts},{id:"suno-v4",provider:"Suno v4",modelName:"suno-v4",type:"Music",key:"",url:ts},{id:"suno-v4.5",provider:"Suno v4.5",modelName:"suno-v4.5",type:"Music",key:"",url:ts},{id:"suno-v4.5+",provider:"Suno v4.5+",modelName:"suno-v4.5+",type:"Music",key:"",url:ts},{id:"suno-v5",provider:"Suno v5",modelName:"suno-v5",type:"Music",key:"",url:ts}],rj=["Auto","1:1","1:4","1:8","2:3","3:2","3:4","4:1","4:3","4:5","5:4","8:1","9:16","16:9","21:9"],vH=["Auto","1:1","2:3","3:2","3:4","4:3","4:5","5:4","9:16","16:9","21:9"];function z5(e){return e?e==="grok-4.1-image"||e==="grok-4.2-image"?yH:e.includes("grok")?Lp:e==="gemini-3.1-flash-image-preview"||e==="gemini-3.1-flash-image-official"?rj:e==="gemini-3-pro-image-official"||e==="gemini-2.5-flash-image-official"?vH:ej:ej}function eu(e,t){return e?e==="nano-banana"||e==="nano-banana-hd"?["Auto","HD"]:e==="gpt-image"||e==="gpt-image-1.5"||e==="gpt-4o-image"||e==="gpt-image-1.5"?[]:e.includes("sora-2")?[]:e.includes("jimeng-5.0")||e.includes("jimeng-4.6")||e.includes("jimeng-4.5")?["2K","4K"]:e==="seedance-2.0"?["480p","720p"]:e==="jimeng-video-3.5-pro"||e==="jimeng-video-3.0-pro"||e==="jimeng-video-3.0-fast"||e==="jimeng-video-3.0"||e==="jimeng-video-seedance-2.0"||e==="jimeng-video-seedance-2.0-fast"?["720P","1080P"]:e==="grok-4.1-image"||e==="grok-4.2-image"?[]:e.includes("grok")?["1080P","720P"]:Cv(e)?["720P","1080P","4K"]:$5(e)?["720P","1080P"]:wc(e)?["720P","1080P","4K"]:dl(e)&&!Cv(e)?["720P","1080P","4K"]:e==="hailuo-2.0"?["512P","768P","1080P"]:e==="hailuo-2.3"||e==="hailuo-2.3-fast"?["768P","1080P"]:au(e)?["720P","1080P"]:pl(e)?["480P","720P","1080P"]:No(e)?["720p","1080p"]:fu(e)?["std","pro"]:zc(e)?["std","pro"]:Wo(e)?["720P","1080P"]:ru(e)?e==="vidu-q3-pro"?["540p","720p","1080p"]:e==="vidu-q2"||e==="vidu-q2-turbo"?["540p","720p","1080p"]:e==="vidu-2.0"?t==="8s"?["720p"]:["360p","720p","1080p"]:["540p","720p","1080p"]:e==="z-image-official"?[]:e==="gemini-3.1-flash-image-preview"?["Auto","512px","1K","2K","4K"]:e==="gemini-3.1-flash-image-official"?["Auto","512px","1K","2K","4K"]:e==="gemini-3-pro-image-official"?["Auto","1K","2K","4K"]:e==="gemini-2.5-flash-image-official"?["Auto"]:e==="seedream-4.5"||e==="seedream-4.5-api"?["2K","4K"]:e==="seedream-4.0"||e==="seedream-4.0-api"?["1K","2K","4K"]:tj:tj}function wH(e){return e?e.includes("jimeng-5.0")||e.includes("jimeng-4.6")||e.includes("jimeng-4.5")||e.includes("jimeng-4.1")||e.includes("jimeng-4.0")||e.includes("jimeng-3.1"):!1}function Tp(e){return e?e.includes("jimeng-video"):!1}function E0(e){return e?e==="jimeng-video-seedance-2.0"||e==="jimeng-video-seedance-2.0-fast"||e==="seedance-2.0":!1}function nu(e,t){if(!e)return["5s","10s","15s"];if(No(e))return["3s","4s","5s","6s","7s","8s","9s","10s"];if(fu(e))return["5s","10s"];if(zc(e))return["5s","10s"];if(Wo(e))return["3s","4s","5s","6s","7s","8s","9s","10s","11s","12s","13s","14s","15s"];if(e==="hailuo-2.3"||e==="hailuo-2.3-fast")return t==="1080P"?["6s"]:["6s","10s"];if(e==="hailuo-2.0")return t==="1080P"?["6s"]:["6s","10s"];if(e==="vidu-q3-pro")return["1s","2s","3s","4s","5s","6s","7s","8s","9s","10s","11s","12s","13s","14s","15s","16s"];if(e==="vidu-q2"||e==="vidu-q2-turbo")return["1s","2s","3s","4s","5s","6s","7s","8s","9s","10s"];if(e==="vidu-2.0")return["4s","8s"];const n=tm.find(r=>r.id===e);return n!=null&&n.durations?n.durations:e==="jimeng-video-3.0"||e==="jimeng-video-3.0-fast"||e==="jimeng-video-3.0-pro"?["5s","10s"]:e==="jimeng-video-3.5-pro"?["5s","10s","12s"]:e==="jimeng-video-seedance-2.0"||e==="jimeng-video-seedance-2.0-fast"?["4s","5s","6s","7s","8s","9s","10s","11s","12s","13s","14s","15s"]:e.includes("sora-2-pro")?["15s","25s"]:e.includes("sora")?["5s","10s","15s"]:e.includes("veo")?["8s"]:e.includes("grok")?["15s","10s"]:e.startsWith("hailuo-")?["6s","10s"]:au(e)?["5s","10s","15s"]:e==="seedance-1.5-pro"?["4s","5s","6s","7s","8s","9s","10s","11s","12s"]:e==="seedance-1.5-pro-api"?["4s","5s","6s","7s","8s","9s","10s","11s","12s"]:iP(e)?["5s","10s"]:pl(e)?["2s","3s","4s","5s","6s","7s","8s","9s","10s","11s","12s"]:["5s","10s","15s"]}function jv(e){return nu(e)[0]||"5s"}function dl(e){return e?e.includes("veo3")||e.includes("google-veo")||wc(e):!1}function hl(e){return e?e.includes("grok"):!1}function pl(e){return e?e.includes("seedance"):!1}function iP(e){return e?e.includes("seedance")&&e.endsWith("-api"):!1}function $x(e){return e==="seedance-2.0"?"/zhonglian/api/v1/proxy/ark/contents/generations/tasks":iP(e)?"/seedance/v3/contents/generations/tasks":"/api/v3/contents/generations/tasks"}function aP(e){if(!e)return!1;const t=e.replace(/-api$/,"");return t==="seedance-1.5-pro"||t==="seedance-1-0-pro"||t==="seedance-1-0-lite-i2v"}function oP(e){return e?e==="seedance-1.5-pro"||e==="seedance-1.5-pro-api":!1}function _y(e){return e?e.startsWith("seedream-"):!1}function _H(e){return e?e.startsWith("seedream-")&&e.endsWith("-api"):!1}function Cv(e){return e?e.includes("veo3.1-pro")||e.includes("google-veo3.1-pro"):!1}function $5(e){return e?e.includes("veo3.1-fast")||e.includes("google-veo3.1-fast"):!1}function Kd(e){return dl(e)||wc(e)||zH(e)||Tp(e)||fu(e)||zc(e)||Wo(e)||pl(e)&&aP(e)||ru(e)&&$H(e)}function zH(e){return e?e==="hailuo-2.0":!1}function Qd(e){return e?e.startsWith("hailuo-"):!1}function No(e){return e?e.includes("kling-o1")||e.includes("kling_o1"):!1}function fu(e){return e?e.includes("kling-v2-5-turbo")||e.includes("kling-video-v2-5-turbo"):!1}function zc(e){return e?e.includes("kling-video-v2-6")||e.includes("kling-v2-6"):!1}function Wo(e){return e?e==="kling-v3"||e.includes("kling-v3"):!1}function ru(e){return e?e==="vidu-q2"||e==="vidu-q2-turbo"||e==="vidu-2.0"||e==="vidu-q3-pro":!1}function gm(e){return e?e==="mj-video":!1}function $H(e){return e?e==="vidu-q2"||e==="vidu-q2-turbo"||e==="vidu-2.0":!1}function au(e){return e?e==="wan-2.6"||e==="wan-2.6-official"||e==="wan-2.6-image-official"||e.includes("wan2.6"):!1}function Sx(e){return e?e==="wan-2.6-official":!1}function Nv(e){return e?e==="wan-2.6-image-official":!1}function lP(e){return e?e==="z-image-official":!1}function Xd(e){return e?e.startsWith("grsai-nano-banana"):!1}function e0(e){return e?e==="gemini-3.1-flash-image-official"||e==="gemini-3-pro-image-official"||e==="gemini-2.5-flash-image-official":!1}function wc(e){return e?e==="veo-3.1-official"||e==="veo-3.1-fast-official":!1}const vo={API_CONFIGS:"qiaodoumayi_api_configs",GLOBAL_KEY:"qiaodoumayi_global_key",GLOBAL_BASE_URL:"qiaodoumayi_global_base_url",ACTIVE_ENDPOINT:"qiaodoumayi_active_endpoint",JIMENG_SESSION:$o.SESSION_STORAGE_KEY,JIMENG_USE_LOCAL:$o.USE_LOCAL_FILE_KEY,JIMENG_SUPER_RESOLUTION_URL:"qiaodoumayi_jimeng_super_resolution_url",JIMENG_SUPER_RESOLUTION_API_KEY:"qiaodoumayi_jimeng_super_resolution_api_key"},$w=class $w{constructor(){Mn(this,"configs",[]);Mn(this,"globalApiKey","");Mn(this,"globalBaseUrl","");Mn(this,"activeEndpointId","comfly");Mn(this,"jimengSessionId","");Mn(this,"jimengUseLocalFile",!0);Mn(this,"jimengSuperResUrl","");Mn(this,"jimengSuperResApiKey","");Mn(this,"listeners",new Set);this.loadFromStorage()}loadFromStorage(){try{const t=localStorage.getItem(vo.API_CONFIGS);let n=t?JSON.parse(t):[...tm];n=n.filter(o=>!bH.includes(o.id)),n=this.ensureDefaultModels(n),this.jimengSessionId=localStorage.getItem(vo.JIMENG_SESSION)||"",n=n.map(o=>this.isJimengConfig(o)?{...o,key:this.jimengSessionId}:o);const{configs:r,hasChanges:i}=this.fixBaseUrls(n);n=r,this.configs=n,i&&this.saveConfigsOnly(n),this.globalApiKey=localStorage.getItem(vo.GLOBAL_KEY)||"",this.globalBaseUrl=localStorage.getItem(vo.GLOBAL_BASE_URL)||ts,n=n.map(o=>{if(o.id==="seedance-2.0")return{...o,url:"https://zlhub.xiaowaiyou.cn",modelName:"doubao-seedance-2.0"};if(o.id==="z-image-official"||o.id==="wan-2.6-official"||o.id==="wan-2.6-image-official")return{...o,url:"http://127.0.0.1:9527/api/proxy"};const l=["seedance-1.5-pro","seedance-1-0-pro","seedance-1-0-pro-fast","seedance-1-0-lite-t2v","seedance-1-0-lite-i2v","doubao-seed-2-0-pro-260215"],c=["seedream-4.5","seedream-4.0"];if(l.includes(o.id)||c.includes(o.id)){const u={url:"http://127.0.0.1:9530"};return o.id==="seedream-4.5"&&(u.modelName="doubao-seedream-4-5-251128"),o.id==="seedream-4.0"&&(u.modelName="doubao-seedream-4-0-250828"),{...o,...u}}return o}),this.configs=n,this.saveConfigsOnly(n),this.globalBaseUrl&&this.globalBaseUrl!==ts&&(n=n.map(o=>{if(["jimeng-5.0","jimeng-4.6","jimeng-4.5","jimeng-4.1","jimeng-3.1"].includes(o.id))return o;const l=["seedance-1.5-pro","seedance-1-0-pro","seedance-1-0-pro-fast","seedance-1-0-lite-t2v","seedance-1-0-lite-i2v","doubao-seed-2-0-pro-260215"],c=["seedream-4.5","seedream-4.0"],u=["gemini-3.1-flash-image-official","gemini-3-pro-image-official","gemini-2.5-flash-image-official"],d=["veo-3.1-official","veo-3.1-fast-official"];return o.id==="wan-2.6-official"||o.id==="wan-2.6-image-official"||o.id==="z-image-official"||l.includes(o.id)||c.includes(o.id)||u.includes(o.id)||d.includes(o.id)||Xd(o.id)?o:{...o,url:this.globalBaseUrl}}),this.configs=n),this.activeEndpointId=localStorage.getItem(vo.ACTIVE_ENDPOINT)||"comfly";const a=localStorage.getItem(vo.JIMENG_USE_LOCAL);this.jimengUseLocalFile=a!==null?a==="true":!0,this.jimengSuperResUrl=localStorage.getItem(vo.JIMENG_SUPER_RESOLUTION_URL)||"",this.jimengSuperResApiKey=localStorage.getItem(vo.JIMENG_SUPER_RESOLUTION_API_KEY)||""}catch(t){console.error("加载 API 配置失败:",t),this.configs=[...tm]}}saveConfigsOnly(t){try{const n=["jimeng-5.0","jimeng-4.6","jimeng-4.5"],r=t.filter(i=>!n.includes(i.id));localStorage.setItem(vo.API_CONFIGS,JSON.stringify(r))}catch(n){console.error("保存 API 配置失败:",n)}}saveToStorage(){try{const t=["jimeng-5.0","jimeng-4.6","jimeng-4.5"],n=this.configs.filter(r=>!t.includes(r.id));localStorage.setItem(vo.API_CONFIGS,JSON.stringify(n)),localStorage.setItem(vo.GLOBAL_KEY,this.globalApiKey),localStorage.setItem(vo.GLOBAL_BASE_URL,this.globalBaseUrl),localStorage.setItem(vo.ACTIVE_ENDPOINT,this.activeEndpointId),localStorage.setItem(vo.JIMENG_SESSION,this.jimengSessionId),localStorage.setItem(vo.JIMENG_USE_LOCAL,String(this.jimengUseLocalFile)),localStorage.setItem(vo.JIMENG_SUPER_RESOLUTION_URL,this.jimengSuperResUrl),localStorage.setItem(vo.JIMENG_SUPER_RESOLUTION_API_KEY,this.jimengSuperResApiKey)}catch(t){console.error("保存 API 配置失败:",t)}}ensureDefaultModels(t){const n=[{id:"seedance-1.5-pro-api",provider:"Seedance 1.5 pro API",modelName:"doubao-seedance-1-5-pro-251215",type:"Video",key:"",url:"https://ai.comfly.chat",durations:["4s","5s","6s","7s","8s","9s","10s","11s","12s"]},{id:"seedance-1-0-pro-api",provider:"Seedance 1.0 pro API",modelName:"doubao-seedance-1-0-pro-250528",type:"Video",key:"",url:"https://ai.comfly.chat",durations:["5s","10s"]},{id:"seedance-1-0-lite-t2v-api",provider:"Seedance 1.0 lite (文生) API",modelName:"doubao-seedance-1-0-lite-t2v-250428",type:"Video",key:"",url:"https://ai.comfly.chat",durations:["5s","10s"]},{id:"seedance-1-0-lite-i2v-api",provider:"Seedance 1.0 lite (图生) API",modelName:"doubao-seedance-1-0-lite-i2v-250428",type:"Video",key:"",url:"https://ai.comfly.chat",durations:["5s","10s"]}],r=new Set(t.map(l=>l.id));for(const l of n)r.has(l.id)||t.push(l);const i=new Map;t.forEach(l=>i.set(l.id,l));const a=[];for(const l of tm){const c=i.get(l.id);c?l.id==="seedance-2.0"?a.push({...l,key:c.key||l.key,url:"https://zlhub.xiaowaiyou.cn",modelName:"doubao-seedance-2.0"}):l.id==="wan-2.6-official"||l.id==="wan-2.6-image-official"||l.id==="z-image-official"?a.push({...l,key:c.key||l.key,url:"http://127.0.0.1:9527/api/proxy"}):["gemini-3.1-flash-image-official","gemini-3-pro-image-official","gemini-2.5-flash-image-official","veo-3.1-official","veo-3.1-fast-official"].includes(l.id)?a.push({...l,key:c.key||l.key,url:$p}):["seedance-1.5-pro","seedance-1-0-pro","seedance-1-0-pro-fast","seedance-1-0-lite-t2v","seedance-1-0-lite-i2v","doubao-seed-2-0-pro-260215","seedream-4.5","seedream-4.0"].includes(l.id)?a.push({...l,key:c.key||l.key,url:"http://127.0.0.1:9530"}):Xd(l.id)?a.push({...l,key:c.key||l.key,url:fx}):a.push({...l,key:c.key||l.key,url:c.url||l.url}):l.id==="seedance-2.0"?a.push({...l,url:"https://zlhub.xiaowaiyou.cn",modelName:"doubao-seedance-2.0"}):l.id==="wan-2.6-official"||l.id==="wan-2.6-image-official"||l.id==="z-image-official"?a.push({...l,url:"http://127.0.0.1:9527/api/proxy"}):["gemini-3.1-flash-image-official","gemini-3-pro-image-official","gemini-2.5-flash-image-official","veo-3.1-official","veo-3.1-fast-official"].includes(l.id)?a.push({...l,url:$p}):["seedance-1.5-pro","seedance-1-0-pro","seedance-1-0-pro-fast","seedance-1-0-lite-t2v","seedance-1-0-lite-i2v","doubao-seed-2-0-pro-260215","seedream-4.5","seedream-4.0"].includes(l.id)?a.push({...l,url:"http://127.0.0.1:9530"}):Xd(l.id)?a.push({...l,url:fx}):a.push({...l})}const o=new Set(a.map(l=>l.id));for(const l of n)if(!o.has(l.id)){const c=i.get(l.id);c?a.push({...l,key:c.key||l.key}):a.push({...l})}return a}isJimengConfig(t){var n;return t.id.includes("jimeng")||((n=t.provider)==null?void 0:n.includes("Jimeng"))}isLocalUrl(t){if(!t)return!1;const n=t.toLowerCase().trim();return n.includes("localhost")||n.includes("127.0.0.1")||n.startsWith("file://")}fixBaseUrls(t){let n=!1;return{configs:t.map(i=>i.id==="wan-2.6-official"||i.id==="wan-2.6-image-official"||i.id==="z-image-official"||i.id==="gemini-3.1-flash-image-official"||i.id==="gemini-3-pro-image-official"||i.id==="gemini-2.5-flash-image-official"||i.id==="veo-3.1-official"||i.id==="veo-3.1-fast-official"||Xd(i.id)?i:i.url&&!this.isLocalUrl(i.url)&&i.url!==ts?(n=!0,{...i,url:ts}):i),hasChanges:n}}getConfigs(){return[...this.configs]}getConfigsByType(t){return this.configs.filter(n=>n.type===t)}getConfigById(t){return this.configs.find(n=>n.id===t)}getGlobalApiKey(){return this.globalApiKey}getGlobalBaseUrl(){return this.globalBaseUrl||ts}getEffectiveApiKey(t){const n=this.getConfigById(t);return n?n.key||this.globalApiKey:this.globalApiKey}getEndpoints(){return[...h1]}getActiveEndpoint(){return h1.find(t=>t.id===this.activeEndpointId)||h1[0]}getJimengSessionId(){return this.jimengSessionId}getJimengUseLocalFile(){return this.jimengUseLocalFile}getJimengSuperResUrl(){return this.jimengSuperResUrl||$w.JIMENG_SUPER_RES_DEFAULT_URL}getJimengSuperResApiKey(){return this.jimengSuperResApiKey||""}updateConfig(t,n){this.configs=this.configs.map(r=>r.id===t?{...r,...n}:r),this.saveToStorage(),this.notifyListeners()}updateConfigs(t){this.configs=t,this.saveToStorage(),this.notifyListeners()}syncWithDefaults(){this.configs=this.ensureDefaultModels(this.configs),this.saveToStorage(),this.notifyListeners()}setGlobalApiKey(t){this.globalApiKey=t,this.saveToStorage(),this.notifyListeners()}switchEndpoint(t){const n=h1.find(r=>r.id===t);n&&(this.activeEndpointId=t,n.baseUrl&&(this.configs=this.configs.map(r=>this.isJimengConfig(r)||r.id==="mj-v6"||r.id==="wan-2.6-official"||r.id==="wan-2.6-image-official"||r.id==="z-image-official"||r.id==="gemini-3.1-flash-image-official"||r.id==="gemini-3-pro-image-official"||r.id==="gemini-2.5-flash-image-official"||r.id==="veo-3.1-official"||r.id==="veo-3.1-fast-official"||r.url&&r.url!==ts?r:{...r,url:n.baseUrl})),this.saveToStorage(),this.notifyListeners())}setGlobalBaseUrl(t){const n=t.trim().replace(/\/+$/,"");this.globalBaseUrl=n,this.configs=this.configs.map(r=>["jimeng-5.0","jimeng-4.6","jimeng-4.5","jimeng-4.1","jimeng-3.1"].includes(r.id)||r.id==="wan-2.6-official"||r.id==="wan-2.6-image-official"||r.id==="z-image-official"||["gemini-3.1-flash-image-official","gemini-3-pro-image-official","gemini-2.5-flash-image-official","veo-3.1-official","veo-3.1-fast-official"].includes(r.id)?r:{...r,url:n}),this.saveToStorage(),this.notifyListeners()}setJimengSessionId(t){this.jimengSessionId=t,this.configs=this.configs.map(n=>this.isJimengConfig(n)?{...n,key:t}:n),this.saveToStorage(),this.notifyListeners()}setJimengUseLocalFile(t){this.jimengUseLocalFile=t,this.saveToStorage(),this.notifyListeners()}setJimengSuperResUrl(t){this.jimengSuperResUrl=(t||"").trim().replace(/\/+$/,""),this.saveToStorage(),this.notifyListeners()}setJimengSuperResApiKey(t){this.jimengSuperResApiKey=t||"",this.saveToStorage(),this.notifyListeners()}addCustomConfig(t){const n={...t,isCustom:!0};this.configs.push(n),this.saveToStorage(),this.notifyListeners()}removeCustomConfig(t){const n=this.getConfigById(t);n!=null&&n.isCustom&&(this.configs=this.configs.filter(r=>r.id!==t),this.saveToStorage(),this.notifyListeners())}resetToDefaults(){this.configs=[...tm],this.activeEndpointId="comfly",this.saveToStorage(),this.notifyListeners()}subscribe(t){return this.listeners.add(t),()=>this.listeners.delete(t)}notifyListeners(){this.listeners.forEach(t=>t())}};Mn($w,"JIMENG_SUPER_RES_DEFAULT_URL","http://127.0.0.1:9529");let Xz=$w;const ei=new Xz,sj={OVERSCAN:1e3,OVERSCAN_INTERACTIVE:300},SH={TINY:.12},dh={PERF_MODE_THRESHOLD:50,MAX_HISTORY_SIZE:60,DEBOUNCE_DELAY:{HISTORY_SAVE:500,STORAGE_SAVE:1e3,CHARACTER_SAVE:500}};function jH(e){return e<=SH.TINY?"zoom-tiny":""}function CH(e,t=!1){return t?sj.OVERSCAN_INTERACTIVE:sj.OVERSCAN}const Sw={"quality-first":{enableRenderQuality:!0,enableImageThumbnails:!0,enableVideoLazyLoad:!0,enableConnectionAnimations:!0,tinyZoomThreshold:.1,overscanBuffer:500,edgeUpdateThrottle:8,nodePositionCommitDelay:50},balanced:{enableRenderQuality:!0,enableImageThumbnails:!0,enableVideoLazyLoad:!0,enableConnectionAnimations:!0,tinyZoomThreshold:.15,overscanBuffer:500,edgeUpdateThrottle:16,nodePositionCommitDelay:80},"speed-first":{enableRenderQuality:!0,enableImageThumbnails:!0,enableVideoLazyLoad:!0,enableConnectionAnimations:!1,tinyZoomThreshold:.25,overscanBuffer:100,edgeUpdateThrottle:32,nodePositionCommitDelay:80}};let Ev="speed-first",fl={...Sw["speed-first"]};const cP=()=>({...fl}),uP=()=>Ev,zy=e=>{Ev=e,fl={...Sw[e]},console.log(`[Performance] Preset changed to: ${e}`,fl),typeof window<"u"&&window.dispatchEvent(new CustomEvent("performancePresetChanged",{detail:{preset:e,config:fl}}))},Kf=e=>{fl={...fl,...e},console.log("[Performance] Config updated:",fl)},NH=()=>{fl={...Sw[Ev]},console.log(`[Performance] Config reset to ${Ev} preset`,fl)},EH=()=>fl.enableRenderQuality,IH=()=>fl.enableConnectionAnimations,kH=()=>fl.tinyZoomThreshold,dP=()=>fl.overscanBuffer,AH=()=>fl.edgeUpdateThrottle,MH=()=>fl.nodePositionCommitDelay;typeof window<"u"&&(window.performanceConfig={get:cP,getCurrentPreset:uP,setPreset:zy,update:Kf,reset:NH,presets:Object.keys(Sw)});function TH(){const[e,t]=_.useState(()=>({configs:ei.getConfigs(),globalApiKey:ei.getGlobalApiKey(),globalBaseUrl:ei.getGlobalBaseUrl(),activeEndpoint:ei.getActiveEndpoint(),jimengSessionId:ei.getJimengSessionId(),jimengUseLocalFile:ei.getJimengUseLocalFile(),jimengSuperResUrl:ei.getJimengSuperResUrl(),jimengSuperResApiKey:ei.getJimengSuperResApiKey()}));_.useEffect(()=>{ei.syncWithDefaults()},[]),_.useEffect(()=>ei.subscribe(()=>{t({configs:ei.getConfigs(),globalApiKey:ei.getGlobalApiKey(),globalBaseUrl:ei.getGlobalBaseUrl(),activeEndpoint:ei.getActiveEndpoint(),jimengSessionId:ei.getJimengSessionId(),jimengUseLocalFile:ei.getJimengUseLocalFile(),jimengSuperResUrl:ei.getJimengSuperResUrl(),jimengSuperResApiKey:ei.getJimengSuperResApiKey()})}),[]);const n=_.useCallback(m=>e.configs.filter(z=>z.type===m),[e.configs]),r=_.useCallback(m=>e.configs.find(z=>z.id===m),[e.configs]),i=_.useCallback(m=>ei.getEffectiveApiKey(m),[]),a=_.useCallback((m,z)=>{ei.updateConfig(m,z)},[]),o=_.useCallback(m=>{ei.updateConfigs(m)},[]),l=_.useCallback(m=>{ei.setGlobalApiKey(m)},[]),c=_.useCallback(m=>{ei.setGlobalBaseUrl(m)},[]),u=_.useCallback(m=>{ei.switchEndpoint(m)},[]),d=_.useCallback(m=>{ei.setJimengSessionId(m)},[]),h=_.useCallback(m=>{ei.setJimengUseLocalFile(m)},[]),p=_.useCallback(m=>{ei.setJimengSuperResUrl(m)},[]),f=_.useCallback(m=>{ei.setJimengSuperResApiKey(m)},[]),b=_.useCallback(m=>{ei.addCustomConfig(m)},[]),g=_.useCallback(m=>{ei.removeCustomConfig(m)},[]),y=_.useCallback(()=>{ei.resetToDefaults()},[]),w=_.useCallback(()=>{ei.syncWithDefaults()},[]),v=_.useCallback(()=>ei.getEndpoints(),[]);return{configs:e.configs,globalApiKey:e.globalApiKey,globalBaseUrl:e.globalBaseUrl,activeEndpoint:e.activeEndpoint,jimengSessionId:e.jimengSessionId,jimengUseLocalFile:e.jimengUseLocalFile,jimengSuperResUrl:e.jimengSuperResUrl,jimengSuperResApiKey:e.jimengSuperResApiKey,getConfigsByType:n,getConfigById:r,getEffectiveApiKey:i,getEndpoints:v,updateConfig:a,updateConfigs:o,setGlobalApiKey:l,setGlobalBaseUrl:c,switchEndpoint:u,setJimengSessionId:d,setJimengUseLocalFile:h,setJimengSuperResUrl:p,setJimengSuperResApiKey:f,addCustomConfig:b,removeCustomConfig:g,resetToDefaults:y,syncWithDefaults:w}}const RH=({containerRef:e,contentRef:t,initialView:n={x:0,y:0,zoom:1},minZoom:r=.1,maxZoom:i=3,onViewCommit:a,onViewChange:o,isDraggingGroupRef:l,isZoomLocked:c=!1,enablePan:u=!1})=>{const d=_.useRef({view:{...n},isPanning:!1,lastMouse:{x:0,y:0},rafId:null}),h=_.useRef({...n}),p=_.useCallback(()=>{const I=t.current;if(!I)return;const{x:R,y:A,zoom:O}=d.current.view;I.style.transform=`translate3d(${R}px, ${A}px, 0) scale(${O})`,h.current={...d.current.view},o==null||o(d.current.view),d.current.rafId=null},[t,o]),f=_.useCallback(()=>{d.current.rafId===null&&(d.current.rafId=requestAnimationFrame(p))},[p]),b=_.useCallback(I=>{l!=null&&l.current||I.target.closest('input, textarea, select, button, [contenteditable="true"], .node-wrapper, .connector')||(I.ctrlKey||I.metaKey)&&I.button===0||I.altKey&&I.button===0||(I.button===0||I.button===1)&&(d.current.isPanning=!0,d.current.lastMouse={x:I.clientX,y:I.clientY},e.current&&(e.current.style.cursor="grabbing"),I.preventDefault())},[e,l]),g=_.useCallback(I=>{if(!d.current.isPanning)return;const R=I.clientX-d.current.lastMouse.x,A=I.clientY-d.current.lastMouse.y;Math.abs(R)<.5&&Math.abs(A)<.5||(d.current.view.x+=R,d.current.view.y+=A,d.current.lastMouse={x:I.clientX,y:I.clientY},f())},[f]),y=_.useCallback(()=>{d.current.isPanning&&(d.current.isPanning=!1,e.current&&(e.current.style.cursor="default"),a==null||a({...d.current.view}))},[e,a]),w=_.useCallback(I=>{if(c)return;const R=I.target;if(R.tagName==="TEXTAREA"||R.tagName==="INPUT"||R.closest('[data-scrollable="true"]')||R.classList.contains("custom-scrollbar"))return;I.preventDefault();const A=e.current;if(!A)return;const{view:O}=d.current,F=I.deltaY>0?.92:1.08,L=Math.max(r,Math.min(i,O.zoom*F));if(L===O.zoom)return;const X=A.getBoundingClientRect(),T=I.clientX-X.left,q=I.clientY-X.top,H=L/O.zoom;d.current.view={x:T-(T-O.x)*H,y:q-(q-O.y)*H,zoom:L},f()},[e,r,i,f,c]),v=_.useRef(null),m=_.useCallback(()=>{v.current!==null&&clearTimeout(v.current),v.current=window.setTimeout(()=>{a==null||a(d.current.view),v.current=null},150)},[a]);_.useEffect(()=>{const I=e.current;if(!I)return;I.style.cursor="default",u&&(I.addEventListener("mousedown",b,{capture:!0}),window.addEventListener("mousemove",g,{passive:!0}),window.addEventListener("mouseup",y));const R=A=>{w(A),m()};return I.addEventListener("wheel",R,{passive:!1}),()=>{u&&(I.removeEventListener("mousedown",b,{capture:!0}),window.removeEventListener("mousemove",g),window.removeEventListener("mouseup",y)),I.removeEventListener("wheel",R),d.current.rafId&&cancelAnimationFrame(d.current.rafId),v.current!==null&&clearTimeout(v.current)}},[e,u,b,g,y,w,m]);const z=_.useCallback(I=>{d.current.view={...I},f()},[f]),C=_.useCallback(I=>{d.current.isPanning||(d.current.view={...I})},[]),E=_.useCallback(()=>d.current.isPanning,[]);return{viewRef:h,setView:z,syncFromExternal:C,getIsPanning:E,_stateRef:d}};function p1(e,t){const[n,r]=_.useState(()=>{try{const a=localStorage.getItem(e);return a?JSON.parse(a):t}catch(a){return console.error(`Error reading localStorage key "${e}":`,a),t}}),i=_.useCallback(a=>{try{r(o=>{const l=a instanceof Function?a(o):a;return localStorage.setItem(e,JSON.stringify(l)),l})}catch(o){console.error(`Error setting localStorage key "${e}":`,o)}},[e]);return _.useEffect(()=>{const a=o=>{if(o.key===e&&o.newValue)try{r(JSON.parse(o.newValue))}catch(l){console.error(`Error parsing localStorage change for key "${e}":`,l)}};return window.addEventListener("storage",a),()=>window.removeEventListener("storage",a)},[e]),[n,i]}function $g(e,t=!1){const[n,r]=_.useState(()=>{try{const a=localStorage.getItem(e);return a!==null?a==="true":t}catch(a){return console.error(`Error reading localStorage key "${e}":`,a),t}}),i=_.useCallback(a=>{try{r(a),localStorage.setItem(e,String(a))}catch(o){console.error(`Error setting localStorage key "${e}":`,o)}},[e]);return[n,i]}const PH="TapnowAssetCache",OH=1,Oo="assets";class LH{constructor(){Mn(this,"db",null);Mn(this,"initPromise",null);Mn(this,"initFailed",!1);Mn(this,"listeners",new Set);Mn(this,"blobUrlCache",new Map);Mn(this,"BLOB_URL_CACHE_TTL",14400*1e3);Mn(this,"MAX_BLOB_URL_CACHE_SIZE",typeof navigator<"u"&&/win/i.test(navigator.platform+navigator.userAgent)?400:800)}evictOldestBlobUrlsIfNeeded(){if(this.blobUrlCache.size<=this.MAX_BLOB_URL_CACHE_SIZE)return;Array.from(this.blobUrlCache.entries()).sort((r,i)=>r[1].createdAt-i[1].createdAt).slice(0,this.blobUrlCache.size-this.MAX_BLOB_URL_CACHE_SIZE).forEach(([r])=>{this.blobUrlCache.delete(r)})}cleanupExpiredBlobUrls(){const t=Date.now(),n=[];this.blobUrlCache.forEach((r,i)=>{t-r.createdAt>this.BLOB_URL_CACHE_TTL&&n.push(i)}),n.forEach(r=>{this.blobUrlCache.delete(r),console.log("[AssetStore] Cleaned up expired blob URL index:",r)})}addListener(t){return this.listeners.add(t),()=>this.listeners.delete(t)}notifyListeners(t,n){this.listeners.forEach(r=>{try{r(t,n)}catch(i){console.error("[AssetStore] Listener error:",i)}})}_saveToLocalCache(t,n,r,i,a){(async()=>{try{const{localCacheManager:o}=await mn(async()=>{const{localCacheManager:l}=await Promise.resolve().then(()=>Xa);return{localCacheManager:l}},void 0,import.meta.url);await o.ensureRestored(),o.isAvailable()&&await o.saveAsset(t,n,r,i,a)&&console.log(`[AssetStore] ✅ Also saved to local cache: ${t}`)}catch{}})()}inferCacheSubdirFromManifestPath(t){const n=t.split("/")[0];if(n==="local"||n==="thumbnails")return n}async init(){if(this.initFailed){console.warn("[AssetStore] IndexedDB init previously failed, running in degraded mode");return}if(this.db){this.cleanupExpiredBlobUrls();return}if(this.initPromise)return this.initPromise;const t=new Promise((r,i)=>{setTimeout(()=>{i(new Error("IndexedDB initialization timeout (5s)"))},5e3)}),n=new Promise((r,i)=>{try{if(typeof indexedDB>"u"){console.warn("[AssetStore] IndexedDB not available"),r();return}const a=indexedDB.open(PH,OH);a.onerror=()=>{console.error("[AssetStore] Failed to open IndexedDB:",a.error),i(a.error)},a.onsuccess=()=>{this.db=a.result,console.log("[AssetStore] IndexedDB initialized successfully"),r()},a.onupgradeneeded=o=>{const l=o.target.result;if(!l.objectStoreNames.contains(Oo)){const c=l.createObjectStore(Oo,{keyPath:"id"});c.createIndex("remoteUrl","remoteUrl",{unique:!1}),c.createIndex("cachedAt","cachedAt",{unique:!1}),console.log("[AssetStore] Object store created")}}}catch(a){console.error("[AssetStore] Error during IndexedDB init:",a),i(a)}});return this.initPromise=Promise.race([n,t]).catch(r=>{console.error("[AssetStore] IndexedDB init failed:",r),this.initFailed=!0}),this.initPromise}invalidateBlobUrlCacheFor(t){const n=this.blobUrlCache.get(t);n&&(URL.revokeObjectURL(n.url),this.blobUrlCache.delete(t))}async saveBlobAsset(t,n,r,i){try{await this.init();const a=await this.getAsset(t);if(a){if(a.remoteUrl===r)return console.log("[AssetStore] Asset already cached (same URL):",t),!0;this.invalidateBlobUrlCacheFor(t)}const o=n.type||"application/octet-stream",l=i!==void 0?i:a==null?void 0:a.cacheSubdir,c={id:t,blob:n,mimeType:o,size:n.size,remoteUrl:r,cachedAt:Date.now(),...l?{cacheSubdir:l}:{}};return await this.putAsset(c),console.log("[AssetStore] Blob asset cached successfully:",t,`(${(n.size/1024/1024).toFixed(2)} MB)`),this.notifyListeners(t,c),this._saveToLocalCache(t,n,o,r,l),!0}catch{return!1}}async saveAsset(t,n){try{await this.init();const r=await this.getAsset(t);if(r){if(r.remoteUrl===n)return console.log("[AssetStore] Asset already cached (same URL):",t),!0;this.invalidateBlobUrlCacheFor(t)}if(console.log("[AssetStore] Downloading asset:",n),n.startsWith("blob:"))try{const{getAssetIdForDisplayBlobUrl:c}=await mn(async()=>{const{getAssetIdForDisplayBlobUrl:d}=await Promise.resolve().then(()=>Do);return{getAssetIdForDisplayBlobUrl:d}},void 0,import.meta.url),u=c(n);if(u){const d=await this.getAsset(u),h=d?await this.getAssetBlob(u):null;if(h){const p=h.type||"application/octet-stream",f=d==null?void 0:d.cacheSubdir,b={id:t,blob:h,mimeType:p,size:h.size,remoteUrl:(d==null?void 0:d.remoteUrl)||n,cachedAt:Date.now(),...f?{cacheSubdir:f}:{}};await this.putAsset(b),this.notifyListeners(t,b);const g=d!=null&&d.remoteUrl&&(d.remoteUrl.startsWith("http://")||d.remoteUrl.startsWith("https://"))?d.remoteUrl:void 0;return this._saveToLocalCache(t,h,p,g,f),!0}}}catch(c){console.warn("[AssetStore] Resolve original from display URL failed, fallback to fetch:",c)}const i=n.includes(".mp4")||n.includes(".webm")||n.includes("video")||n.includes("/v/")||n.includes("amazonaws")||n.includes("prod-sa-vidu")||n.includes("prod-ss-vidu");let a;if(i&&this.isTauriEnvironment())try{const{downloadWithFallback:c}=await mn(async()=>{const{downloadWithFallback:u}=await Promise.resolve().then(()=>n0);return{downloadWithFallback:u}},void 0,import.meta.url);a=await c(n,12e4),!a.type&&(n.includes(".mp4")||n.includes(".webm"))&&(a=new Blob([await a.arrayBuffer()],{type:"video/mp4"}))}catch(c){console.warn("[AssetStore] Tauri video download failed, fallback to fetch:",c);const u=await fetch(n,{mode:"cors",credentials:"omit"});if(!u.ok)throw new Error(`HTTP ${u.status}: ${u.statusText}`);a=await u.blob()}else{const c=await fetch(n,{mode:"cors",credentials:"omit"});if(!c.ok)throw new Error(`HTTP ${c.status}: ${c.statusText}`);a=await c.blob()}const o=a.type||(i?"video/mp4":"application/octet-stream"),l={id:t,blob:a,mimeType:o,size:a.size,remoteUrl:n,cachedAt:Date.now()};return await this.putAsset(l),console.log("[AssetStore] Asset cached successfully:",t,`(${(a.size/1024/1024).toFixed(2)} MB)`),this.notifyListeners(t,l),this._saveToLocalCache(t,a,o,n),!0}catch(r){return console.debug("[AssetStore] Failed to save asset:",t,r),!1}}isTauriEnvironment(){return typeof window<"u"&&("__TAURI_INTERNALS__"in window||"__TAURI__"in window||window.location.protocol==="tauri:")}async convertTauriFileSrc(t){if(!this.isTauriEnvironment())return t;try{const{convertFileSrc:n}=await mn(async()=>{const{convertFileSrc:r}=await Promise.resolve().then(()=>tf);return{convertFileSrc:r}},void 0,import.meta.url);return n(t)}catch(n){return console.warn("[AssetStore] Failed to convert Tauri file src:",n),t}}isAbsoluteFilePath(t){return!!(t.match(/^[A-Za-z]:[\\\/]/)||t.startsWith("/"))}async getAssetUrl(t,n){try{if(n&&this.isTauriEnvironment()&&this.isAbsoluteFilePath(n)){const a=await this.convertTauriFileSrc(n);return console.log(`[AssetStore] Using Tauri file path: ${n} -> ${a}`),a}await this.init();const r=this.blobUrlCache.get(t);if(r){if(Date.now()-r.createdAt{const{localCacheManager:o}=await Promise.resolve().then(()=>Xa);return{localCacheManager:o}},void 0,import.meta.url);if(a.isAvailable()&&a.hasAsset(t)){const o=await a.readAsset(t);if(o){const l=URL.createObjectURL(o.blob);return this.blobUrlCache.set(t,{url:l,blob:o.blob,createdAt:Date.now()}),this.evictOldestBlobUrlsIfNeeded(),l}}}catch{}const i=await this.getAsset(t);if(i){const a=URL.createObjectURL(i.blob);return this.blobUrlCache.set(t,{url:a,blob:i.blob,createdAt:Date.now()}),this.evictOldestBlobUrlsIfNeeded(),a}return null}catch{return null}}async getAssetBlob(t){try{await this.init();try{const{localCacheManager:r}=await mn(async()=>{const{localCacheManager:i}=await Promise.resolve().then(()=>Xa);return{localCacheManager:i}},void 0,import.meta.url);if(r.isAvailable()&&r.hasAsset(t)){const i=await r.readAsset(t);if(i)return i.blob}}catch{}const n=await this.getAsset(t);return n!=null&&n.blob?n.blob:null}catch{return null}}async getAssetRecord(t){try{await this.init();try{const{localCacheManager:r}=await mn(async()=>{const{localCacheManager:i}=await Promise.resolve().then(()=>Xa);return{localCacheManager:i}},void 0,import.meta.url);if(r.isAvailable()&&r.hasAsset(t)){const i=await r.readAsset(t);if(i){const a=r.getManifest(),o=a==null?void 0:a.assets[t],l=o!=null&&o.fileName?this.inferCacheSubdirFromManifestPath(o.fileName):void 0;return{id:t,blob:i.blob,mimeType:i.mimeType,size:i.blob.size,remoteUrl:(o==null?void 0:o.remoteUrl)||"",cachedAt:(o==null?void 0:o.cachedAt)||Date.now(),...l?{cacheSubdir:l}:{}}}}}catch{}const n=await this.getAsset(t);return n||null}catch{return null}}async getAssetBlobByRemoteUrl(t){try{if(await this.init(),!this.db)return null;let n="";try{n=new URL(t).pathname}catch{}let r=await new Promise((i,a)=>{const u=this.db.transaction([Oo],"readonly").objectStore(Oo).index("remoteUrl").get(t);u.onsuccess=()=>i(u.result||null),u.onerror=()=>a(u.error)});if(!(r!=null&&r.blob)&&n&&(t.includes("prod-ss-vidu")||t.includes("prod-sa-vidu")||t.includes("amazonaws"))&&(r=(await this.getAllAssets()).find(a=>{if(!a.remoteUrl)return!1;try{return new URL(a.remoteUrl).pathname===n}catch{return!1}})||null),r!=null&&r.blob)return r.blob;try{const{localCacheManager:i}=await mn(async()=>{const{localCacheManager:a}=await Promise.resolve().then(()=>Xa);return{localCacheManager:a}},void 0,import.meta.url);if(i.isAvailable()){const a=i.getManifest();let o=(a==null?void 0:a.assets)&&Object.entries(a.assets).find(([,l])=>(l==null?void 0:l.remoteUrl)===t);if(!o&&n&&(o=(a==null?void 0:a.assets)&&Object.entries(a.assets).find(([,l])=>{try{return!!(l!=null&&l.remoteUrl&&new URL(l.remoteUrl).pathname===n)}catch{return!1}})),o){const[l]=o,c=await i.readAsset(l);if(c)return c.blob}}}catch{}return null}catch{return null}}async hasAsset(t){try{return await this.init(),!!await this.getAsset(t)}catch{return!1}}async deleteAsset(t){try{const n=this.blobUrlCache.get(t);return n&&(URL.revokeObjectURL(n.url),this.blobUrlCache.delete(t)),await this.init(),this.db?new Promise((r,i)=>{const l=this.db.transaction([Oo],"readwrite").objectStore(Oo).delete(t);l.onsuccess=()=>{console.log("[AssetStore] Asset deleted:",t),r(!0)},l.onerror=()=>{console.error("[AssetStore] Failed to delete asset:",t,l.error),i(l.error)}}):!1}catch(n){return console.error("[AssetStore] Failed to delete asset:",t,n),!1}}async deleteAssets(t){let n=0;for(const r of t)await this.deleteAsset(r)&&n++;return n}async getAllAssetIds(){try{return await this.init(),this.db?new Promise((t,n)=>{const a=this.db.transaction([Oo],"readonly").objectStore(Oo).getAllKeys();a.onsuccess=()=>{t(a.result)},a.onerror=()=>{console.error("[AssetStore] Failed to get all asset IDs:",a.error),n(a.error)}}):[]}catch(t){return console.error("[AssetStore] Failed to get all asset IDs:",t),[]}}async getStorageUsage(){try{if(await this.init(),!this.db)return{totalSize:0,count:0,formattedSize:"0 B",blobUrlCacheSize:0};const t=await this.getAllAssets(),n=t.reduce((i,a)=>i+a.size,0),r=t.length;return{totalSize:n,count:r,formattedSize:this.formatBytes(n),blobUrlCacheSize:this.blobUrlCache.size}}catch(t){return console.error("[AssetStore] Failed to get storage usage:",t),{totalSize:0,count:0,formattedSize:"0 B",blobUrlCacheSize:0}}}clearBlobUrlCache(){try{this.blobUrlCache.clear(),console.log("[AssetStore] Blob URL cache index cleared")}catch(t){console.warn("[AssetStore] clearBlobUrlCache failed:",t)}}async clearAll(){try{return this.blobUrlCache.forEach(({url:t})=>{URL.revokeObjectURL(t)}),this.blobUrlCache.clear(),await this.init(),this.db?new Promise((t,n)=>{const a=this.db.transaction([Oo],"readwrite").objectStore(Oo).clear();a.onsuccess=()=>{console.log("[AssetStore] All assets cleared"),t(!0)},a.onerror=()=>{console.error("[AssetStore] Failed to clear assets:",a.error),n(a.error)}}):!1}catch(t){return console.error("[AssetStore] Failed to clear assets:",t),!1}}async getAsset(t){return this.db?new Promise((n,r)=>{const o=this.db.transaction([Oo],"readonly").objectStore(Oo).get(t);o.onsuccess=()=>{n(o.result||null)},o.onerror=()=>{console.error("[AssetStore] Failed to get asset:",t,o.error),r(o.error)}}):null}async putAsset(t){if(!this.db)throw new Error("Database not initialized");return new Promise((n,r)=>{const o=this.db.transaction([Oo],"readwrite").objectStore(Oo).put(t);o.onsuccess=()=>{n()},o.onerror=()=>{console.error("[AssetStore] Failed to put asset:",t.id,o.error),r(o.error)}})}async getAllAssets(){return this.db?new Promise((t,n)=>{const a=this.db.transaction([Oo],"readonly").objectStore(Oo).getAll();a.onsuccess=()=>{t(a.result||[])},a.onerror=()=>{console.error("[AssetStore] Failed to get all assets:",a.error),n(a.error)}}):[]}formatBytes(t){if(t===0)return"0 B";const n=1024,r=["B","KB","MB","GB"],i=Math.floor(Math.log(t)/Math.log(n));return`${(t/Math.pow(n,i)).toFixed(2)} ${r[i]}`}}const Xr=new LH,_s=Object.freeze(Object.defineProperty({__proto__:null,assetStore:Xr},Symbol.toStringTag,{value:"Module"}));function zo(e,t,n,r){if(typeof t=="function"?e!==t||!r:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return n==="m"?r:n==="a"?r.call(e):r?r.value:t.get(e)}function Xf(e,t,n,r,i){if(typeof t=="function"?e!==t||!0:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return t.set(e,n),n}var ap,Vc,Lf,f1,$y;const gl="__TAURI_TO_IPC_KEY__";function S5(e,t=!1){return window.__TAURI_INTERNALS__.transformCallback(e,t)}class hP{constructor(t){ap.set(this,void 0),Vc.set(this,0),Lf.set(this,[]),f1.set(this,void 0),Xf(this,ap,t||(()=>{})),this.id=S5(n=>{const r=n.index;if("end"in n){r==zo(this,Vc,"f")?this.cleanupCallback():Xf(this,f1,r);return}const i=n.message;if(r==zo(this,Vc,"f")){for(zo(this,ap,"f").call(this,i),Xf(this,Vc,zo(this,Vc,"f")+1);zo(this,Vc,"f")in zo(this,Lf,"f");){const a=zo(this,Lf,"f")[zo(this,Vc,"f")];zo(this,ap,"f").call(this,a),delete zo(this,Lf,"f")[zo(this,Vc,"f")],Xf(this,Vc,zo(this,Vc,"f")+1)}zo(this,Vc,"f")===zo(this,f1,"f")&&this.cleanupCallback()}else zo(this,Lf,"f")[r]=i})}cleanupCallback(){window.__TAURI_INTERNALS__.unregisterCallback(this.id)}set onmessage(t){Xf(this,ap,t)}get onmessage(){return zo(this,ap,"f")}[(ap=new WeakMap,Vc=new WeakMap,Lf=new WeakMap,f1=new WeakMap,gl)](){return`__CHANNEL__:${this.id}`}toJSON(){return this[gl]()}}async function yn(e,t={},n){return window.__TAURI_INTERNALS__.invoke(e,t,n)}function BH(e,t="asset"){return window.__TAURI_INTERNALS__.convertFileSrc(e,t)}class jw{get rid(){return zo(this,$y,"f")}constructor(t){$y.set(this,void 0),Xf(this,$y,t)}async close(){return yn("plugin:resources|close",{rid:this.rid})}}$y=new WeakMap;const tf=Object.freeze(Object.defineProperty({__proto__:null,Channel:hP,Resource:jw,SERIALIZE_TO_IPC_FN:gl,convertFileSrc:BH,invoke:yn,transformCallback:S5},Symbol.toStringTag,{value:"Module"})),ad=new Map,T0=new Map,UH=300;function pP(e){const t=ad.get(e);t!==void 0&&(ad.delete(e),ad.set(e,t))}function Yz(e,t){for(ad.has(e)&&ad.delete(e),ad.set(e,t);ad.size>UH;){const n=ad.keys().next().value;if(!n)break;ad.delete(n)}}function fP(e){let t=2166136261;for(let n=0;n>>0;return t>>>0}function FH(e){const t=e.trim(),n=fP(t);return`b64:${t.length}:${n.toString(16)}`}function WH(e){const t=e.trim(),n=fP(t);return`url:${t.length}:${n.toString(16)}`}function mP(e){return typeof e!="string"?!1:e.startsWith("data:image/")||e.startsWith("data:video/")||e.startsWith("data:audio/")}function DH(e){return typeof e!="string"?!1:e.startsWith("blob:")}function VH(e){return typeof e!="string"||e.startsWith("data:")?!1:!!(e.startsWith("blob:")||e.startsWith("http://")||e.startsWith("https://"))}const HH=2*1024*1024;function gP(e){var a;if(!(e!=null&&e.startsWith("data:")))return null;const t=e.lastIndexOf(";base64,");if(t===-1)return null;const r=((a=e.slice(0,e.indexOf(",")).match(/:(.*?);/))==null?void 0:a[1])||"image/png",i=e.slice(t+8).replace(/\s/g,"");return{mime:r,base64:i}}function xP(e){if(!(e!=null&&e.startsWith("data:image")))return e;const t=gP(e);if(!t)return e;try{return atob(t.base64),`data:${t.mime};base64,${t.base64}`}catch{return e}}function bP(e){if(!(e!=null&&e.startsWith("data:"))||!e.includes(";base64,"))return e;try{const t=gP(e);if(!t)return e;const n=atob(t.base64),r=new Uint8Array(n.length);for(let a=0;a{try{let a=e.trim();a.startsWith("data:")&&a.includes(";base64,")&&(a=a.replace(/;base64,\s+/,";base64,"));const l=await(await fetch(a)).blob(),c=URL.createObjectURL(l);return Yz(t,c),T0.delete(t),c}catch(a){return console.error("[Hydration] Failed to convert Base64 to Blob URL:",a),T0.delete(t),e}})();return T0.set(t,i),i}async function ij(e){const t=WH(e),n=ad.get(t);if(n)return pP(t),n;const r=T0.get(t);if(r)return r;const i=(async()=>{try{if(e.startsWith("http://")||e.startsWith("https://")){const c=await fetch(e);if(!c.ok)throw new Error(`HTTP ${c.status}: ${c.statusText}`);const u=await c.blob(),d=await new Promise((h,p)=>{const f=new FileReader;f.onloadend=()=>{const b=f.result;h(b)},f.onerror=p,f.readAsDataURL(u)});return Yz(t,d),T0.delete(t),d}const o=await(await fetch(e)).blob(),l=await new Promise((c,u)=>{const d=new FileReader;d.onloadend=()=>{const h=d.result;c(h)},d.onerror=u,d.readAsDataURL(o)});return Yz(t,l),T0.delete(t),l}catch(a){return console.error("[Serialization] Failed to convert URL to Base64:",a),console.warn(`[Serialization] 保留原始URL: ${e.substring(0,50)}...`),T0.delete(t),e}})();return T0.set(t,i),i}async function Iv(e,t=10){console.log("[Hydration] Starting Base64 → Blob URL conversion...");const n={converted:0,skipped:0,totalSize:0},r=[];Array.isArray(e)?e.forEach((a,o)=>{r.push({obj:a,key:o,parent:e,depth:0})}):typeof e=="object"&&e!==null&&Object.keys(e).forEach(a=>{r.push({obj:e[a],key:a,parent:e,depth:0})});const i=[];for(;r.length>0;){const{obj:a,key:o,parent:l,depth:c}=r.shift();if(c>t){n.skipped++;continue}if(mP(a)){const u=a,d=u.length;n.totalSize+=d;const h=Cw(u).then(p=>{l[o]=p,n.converted++,n.converted%10===0&&console.log(`[Hydration] Converted ${n.converted} images, saved ${(n.totalSize/1024/1024).toFixed(2)}MB`)}).catch(p=>{console.error(`[Hydration] Failed to convert Base64 at key "${o}":`,p),l[o]=u,n.skipped++});i.push(h)}else Array.isArray(a)?a.forEach((u,d)=>{r.push({obj:u,key:d,parent:a,depth:c+1})}):typeof a=="object"&&a!==null&&Object.keys(a).forEach(u=>{r.push({obj:a[u],key:u,parent:a,depth:c+1})})}return await Promise.all(i),console.log("[Hydration] Conversion complete:",{converted:n.converted,skipped:n.skipped,savedMemory:`${(n.totalSize/1024/1024).toFixed(2)}MB`}),{data:e,stats:n}}async function GH(e,t,n=10){console.log("[StreamingHydration] Starting streaming Base64 → Blob URL conversion...");const r={converted:0,skipped:0,totalSize:0},i=[],a=(c,u,d,h,p)=>{h>n||(mP(c)?i.push({obj:c,key:d,parent:u,priority:p}):Array.isArray(c)?c.forEach((f,b)=>{a(f,c,b,h+1,p)}):typeof c=="object"&&c!==null&&Object.keys(c).forEach(f=>{let b=p;f==="nodes"?b=100:f==="connections"?b=90:f==="history"&&(b=50),a(c[f],c,f,h+1,b)}))};Array.isArray(e)?e.forEach((c,u)=>{a(c,e,u,0,50)}):typeof e=="object"&&e!==null&&Object.keys(e).forEach(c=>{let u=50;c==="nodes"?u=100:c==="connections"?u=90:c==="history"&&(u=50),a(e[c],e,c,0,u)}),console.log(`[StreamingHydration] Found ${i.length} Base64 items to convert`),t==null||t(5,`发现 ${i.length} 个图片需要转换`),i.sort((c,u)=>u.priority-c.priority);const o=5,l=Math.ceil(i.length/o);for(let c=0;c{try{const w=b,v=w.length;r.totalSize+=v;const m=await Cw(w);y[g]=m,r.converted++}catch(w){console.error("[StreamingHydration] Failed to convert Base64:",w),r.skipped++}});await Promise.all(p);const f=Math.round(d/i.length*100);t==null||t(5+f*.9,`已转换 ${r.converted}/${i.length} 个图片`),await new Promise(b=>setTimeout(b,10))}return console.log("[StreamingHydration] Conversion complete:",{converted:r.converted,skipped:r.skipped,savedMemory:`${(r.totalSize/1024/1024).toFixed(2)}MB`}),t==null||t(95,"图片转换完成"),{data:e,stats:r}}async function qH(e,t=10){console.log("[Serialization] Starting Blob URL → Base64 conversion...");const n={converted:0,skipped:0},r=JSON.parse(JSON.stringify(e,(o,l)=>l)),i=[];Array.isArray(r)?r.forEach((o,l)=>{i.push({obj:o,key:l,parent:r,depth:0})}):typeof r=="object"&&r!==null&&Object.keys(r).forEach(o=>{i.push({obj:r[o],key:o,parent:r,depth:0})});const a=[];for(;i.length>0;){const{obj:o,key:l,parent:c,depth:u}=i.shift();if(u>t){n.skipped++;continue}if(DH(o)){const h=ij(o).then(p=>{c[l]=p,n.converted++,n.converted%10===0&&console.log(`[Serialization] Converted ${n.converted} Blob URLs to Base64`)}).catch(p=>{console.error(`[Serialization] Failed to convert Blob URL at key "${l}":`,p),n.skipped++});a.push(h)}else if(VH(o)){const h=ij(o).then(p=>{c[l]=p,n.converted++,n.converted%10===0&&console.log(`[Serialization] Converted ${n.converted} remote URLs to Base64`)}).catch(p=>{console.error(`[Serialization] Failed to convert remote URL at key "${l}":`,p),n.skipped++});a.push(h)}else Array.isArray(o)?o.forEach((d,h)=>{i.push({obj:d,key:h,parent:o,depth:u+1})}):typeof o=="object"&&o!==null&&Object.keys(o).forEach(d=>{i.push({obj:o[d],key:d,parent:o,depth:u+1})})}return await Promise.all(a),console.log("[Serialization] Conversion complete:",{converted:n.converted,skipped:n.skipped}),{data:r,stats:n}}function jx(e){const t=JSON.stringify(e).substring(0,5e4);return t.includes("data:image/")||t.includes("data:video/")||t.includes("data:audio/")}function yP(e){let t=0;const n=JSON.stringify(e),r=/data:image\/[^"]+/g,i=n.match(r);return i&&i.forEach(a=>{t+=a.length}),t}const Cx=Object.freeze(Object.defineProperty({__proto__:null,base64ToBlobUrl:Cw,containsBase64Media:jx,dataUrlToBlobUrlSync:bP,estimateBase64Size:yP,getDisplaySafeImageUrlSync:Hd,hydrateProjectData:Iv,hydrateProjectDataStreaming:GH,normalizeDataUrl:xP,serializeProjectData:qH},Symbol.toStringTag,{value:"Module"})),KH="qiaodoumayi_thumbnail_store",XH=3,Es={THUMBNAILS:"thumbnails",PREVIEWS:"previews",SIZES:"sizes",METADATA:"metadata"},m1={SIZE:128,QUALITY:.5},aj={MAX_SIZE:720,QUALITY:.36},Zg=256,YH=[128,256,512,1024,2048],JH={128:.4,256:.55,512:.65,1024:.72,2048:.78},oj=typeof navigator<"u"&&/win/i.test(navigator.platform+navigator.userAgent),lj=typeof navigator<"u"&&(navigator.platform.toLowerCase().includes("mac")||navigator.platform.toLowerCase().includes("win")||navigator.userAgent.toLowerCase().includes("mac")||navigator.userAgent.toLowerCase().includes("win")),cj={MAX_THUMBNAILS:oj?250:lj?420:120,MAX_PREVIEWS:oj?35:lj?60:25},Ku=new Map,Bd=new Map,Bf=new Map,Hc=new Map,Gc=[],qc=[],S0=[];class ZH{constructor(){Mn(this,"db",null);Mn(this,"initPromise",null);Mn(this,"initFailed",!1);Mn(this,"workerRef",null);Mn(this,"workerReady",!1);Mn(this,"workerQueue",[])}async init(){if(this.initFailed||this.db)return;if(this.initPromise)return this.initPromise;this.initPromise=new Promise((n,r)=>{try{if(typeof indexedDB>"u"){console.warn("[ThumbnailStore] IndexedDB not available"),n();return}const i=indexedDB.open(KH,XH);i.onerror=()=>{console.error("[ThumbnailStore] Failed to open IndexedDB:",i.error),this.initFailed=!0,n()},i.onsuccess=()=>{this.db=i.result,console.log("[ThumbnailStore] IndexedDB initialized"),n()},i.onupgradeneeded=a=>{const o=a.target.result;if(o.objectStoreNames.contains(Es.THUMBNAILS)||o.createObjectStore(Es.THUMBNAILS,{keyPath:"id"}),o.objectStoreNames.contains(Es.PREVIEWS)||o.createObjectStore(Es.PREVIEWS,{keyPath:"id"}),!o.objectStoreNames.contains(Es.SIZES)){const l=o.createObjectStore(Es.SIZES,{keyPath:["id","size"]});l.createIndex("byId","id",{unique:!1}),l.createIndex("bySize","size",{unique:!1})}o.objectStoreNames.contains(Es.METADATA)||o.createObjectStore(Es.METADATA,{keyPath:"id"}).createIndex("createdAt","createdAt",{unique:!1}),console.log("[ThumbnailStore] Object stores created")}}catch(i){console.error("[ThumbnailStore] Init error:",i),this.initFailed=!0,n()}});const t=new Promise((n,r)=>{setTimeout(()=>r(new Error("Timeout")),5e3)});try{await Promise.race([this.initPromise,t])}catch{this.initFailed=!0}}generateId(t,n){return`${n}_${t}`}async initWorker(){if(this.workerRef&&this.workerReady)return this.workerRef;if(typeof OffscreenCanvas>"u"||typeof Worker>"u")return console.warn("[ThumbnailStore] OffscreenCanvas or Worker not supported, falling back to main thread"),null;try{return this.workerRef=new Worker(new URL(""+new URL("thumbnailWorker-Iu1AjlwR.js",import.meta.url).href,import.meta.url),{type:"module"}),this.workerRef.onmessage=t=>{const n=t.data,r=this.workerQueue.find(i=>i.id===n.id);r&&(n.error?this.generateThumbnailMainThread(r.imageData,r.maxSize,r.quality).then(r.resolve).catch(r.reject):r.resolve(n.thumbnailData),this.workerQueue=this.workerQueue.filter(i=>i.id!==n.id))},this.workerRef.onerror=t=>{console.error("[ThumbnailStore] Worker error:",t),this.workerQueue.forEach(n=>{this.generateThumbnailMainThread(n.imageData,n.maxSize,n.quality).then(n.resolve).catch(n.reject)}),this.workerQueue=[],this.workerRef=null,this.workerReady=!1},this.workerReady=!0,this.workerRef}catch(t){return console.warn("[ThumbnailStore] Failed to create Worker, falling back to main thread:",t),null}}async generateThumbnailMainThread(t,n,r){return new Promise((i,a)=>{const o=new Image;o.crossOrigin="anonymous";const l=Hd(t);o.onload=()=>{try{if(l!==t)try{URL.revokeObjectURL(l)}catch{}const c=document.createElement("canvas"),u=c.getContext("2d",{alpha:!0});if(!u){i(t);return}let d=o.naturalWidth,h=o.naturalHeight;if(d>n||h>n){const f=Math.min(n/d,n/h);d=Math.round(d*f),h=Math.round(h*f)}c.width=d,c.height=h,u.imageSmoothingEnabled=!0,u.imageSmoothingQuality="medium",u.drawImage(o,0,0,d,h);const p=c.toDataURL("image/jpeg",r);i(p)}catch(c){console.warn("[ThumbnailStore] Generate thumbnail failed:",c),i(t)}},o.onerror=()=>{if(console.warn("[ThumbnailStore] Image load failed"),l!==t)try{URL.revokeObjectURL(l)}catch{}i(t)},o.src=l})}async generateThumbnail(t,n=m1.SIZE,r=m1.QUALITY){const i=await this.initWorker();return i&&this.workerReady?new Promise((a,o)=>{const l=`thumb_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;this.workerQueue.push({id:l,imageData:t,maxSize:n,quality:r,resolve:a,reject:o}),i.postMessage({type:"generate",id:l,imageData:t,maxSize:n,quality:r}),setTimeout(()=>{this.workerQueue.find(u=>u.id===l)&&(this.workerQueue=this.workerQueue.filter(u=>u.id!==l),this.generateThumbnailMainThread(t,n,r).then(a).catch(o))},5e3)}):typeof requestIdleCallback<"u"?new Promise(a=>{requestIdleCallback(()=>{this.generateThumbnailMainThread(t,n,r).then(a).catch(()=>a(t))})}):this.generateThumbnailMainThread(t,n,r)}async getImageDimensions(t){return new Promise(n=>{const r=new Image;r.onload=()=>{n({width:r.naturalWidth,height:r.naturalHeight})},r.onerror=()=>{n({width:0,height:0})},r.src=t})}async generateAndStoreStandardSizes(t,n){if(await this.init(),!n.startsWith("data:image"))return;const r=await this.getImageDimensions(n),i=r.width,a=r.height,l=i>Zg||a>Zg?YH.filter(c=>i>c||a>c):[];if(l.length!==0)try{const c=l.map(d=>this.generateThumbnail(n,d,JH[d]||.7).then(h=>({size:d,data:h}))),u=await Promise.all(c);if(this.db){const d=this.db.transaction([Es.SIZES,Es.METADATA],"readwrite"),h=d.objectStore(Es.SIZES),p=d.objectStore(Es.METADATA);u.forEach(({size:b,data:g})=>{const y={id:t,size:b,data:g,size_bytes:g.length*2,createdAt:Date.now()};h.put(y);const w=`${t}_${b}`;this.updateSizeThumbnailCache(w,g)});const f=Hc.get(t)||{id:t,originalSize:n.length*2,width:i,height:a,type:"image",hasThumbnail:!1,hasPreview:!1,availableSizes:[],createdAt:Date.now()};f.availableSizes=u.map(b=>b.size),Hc.set(t,f),p.put(f),await new Promise((b,g)=>{d.oncomplete=()=>b(),d.onerror=()=>g(d.error)})}console.log(`[ThumbnailStore] ✅ Stored ${u.length} standard sizes for ${t}:`,l)}catch(c){console.warn("[ThumbnailStore] Failed to generate standard sizes:",c)}}async updateAccessTime(t){const n=Hc.get(t);n&&(n.lastAccessed=Date.now())}async getBestMatchThumbnail(t,n){await this.init(),this.updateAccessTime(t).catch(()=>{});const r=`${t}_${n}`;if(Bf.has(r)){const l=S0.indexOf(r);return l>-1&&(S0.splice(l,1),S0.push(r)),Bf.get(r)||null}const i=Hc.get(t),a=(i==null?void 0:i.availableSizes)||[];if(a.length===0&&this.db){const l=await new Promise(c=>{try{const h=this.db.transaction([Es.METADATA],"readonly").objectStore(Es.METADATA).get(t);h.onsuccess=()=>c(h.result||null),h.onerror=()=>c(null)}catch{c(null)}});l&&(Hc.set(t,l),a.push(...l.availableSizes||[]))}let o=null;if(a.length>0){const l=a.filter(c=>c<=n);l.length>0?o=Math.max(...l):o=Math.min(...a)}return o&&this.db?new Promise(l=>{try{const d=this.db.transaction([Es.SIZES],"readonly").objectStore(Es.SIZES).get([t,o]);d.onsuccess=()=>{const h=d.result;if(h){const p=`${t}_${o}`;this.updateSizeThumbnailCache(p,h.data),l(h.data)}else l(null)},d.onerror=()=>l(null)}catch{l(null)}}):null}updateSizeThumbnailCache(t,n){const r=S0.indexOf(t);r>-1&&S0.splice(r,1),S0.push(t);const i=500;for(;Bf.size>=i&&S0.length>0;){const a=S0.shift();a&&Bf.delete(a)}Bf.set(t,n)}async storeWithThumbnails(t,n){if(await this.init(),!n.startsWith("data:image"))return;const r=n.length*2;try{const i=await this.getImageDimensions(n);if(!(r>=50*1024||i.width>Zg||i.height>Zg))return;const[o,l]=await Promise.all([this.generateThumbnail(n,m1.SIZE,m1.QUALITY),this.generateThumbnail(n,aj.MAX_SIZE,aj.QUALITY)]),c={id:t,originalSize:r,width:i.width,height:i.height,type:"image",hasThumbnail:!0,hasPreview:!0,createdAt:Date.now()};if(this.db){const u=this.db.transaction([Es.THUMBNAILS,Es.PREVIEWS,Es.METADATA],"readwrite"),d=u.objectStore(Es.THUMBNAILS),h=u.objectStore(Es.PREVIEWS),p=u.objectStore(Es.METADATA);d.put({id:t,data:o,size:o.length*2}),h.put({id:t,data:l,size:l.length*2}),p.put(c),await new Promise((f,b)=>{u.oncomplete=()=>f(),u.onerror=()=>b(u.error)})}this.updateThumbnailCache(t,o),this.updatePreviewCache(t,l),Hc.set(t,c),mn(async()=>{const{localCacheManager:u}=await Promise.resolve().then(()=>Xa);return{localCacheManager:u}},void 0,import.meta.url).then(({localCacheManager:u})=>{u.isAvailable()&&u.saveThumbnail(t,l,"preview").catch(d=>{console.warn("[ThumbnailStore] 预览图(720px)保存到本地失败:",d)})}).catch(u=>{console.warn("[ThumbnailStore] 加载 LocalCacheManager 失败:",u)}),console.log("[ThumbnailStore] Stored thumbnails for:",t,"thumb:",Math.round(o.length/1024),"KB","preview:",Math.round(l.length/1024),"KB")}catch(i){console.warn("[ThumbnailStore] Store failed:",i)}}updateThumbnailCache(t,n){const r=Gc.indexOf(t);for(r>-1&&Gc.splice(r,1),Gc.push(t);Ku.size>=cj.MAX_THUMBNAILS&&Gc.length>0;){const i=Gc.shift();i&&Ku.delete(i)}Ku.set(t,n)}updatePreviewCache(t,n){const r=qc.indexOf(t);for(r>-1&&qc.splice(r,1),qc.push(t);Bd.size>=cj.MAX_PREVIEWS&&qc.length>0;){const i=qc.shift();i&&Bd.delete(i)}Bd.set(t,n)}async getThumbnail(t){if(Ku.has(t)){const n=Gc.indexOf(t);return n>-1&&(Gc.splice(n,1),Gc.push(t)),Ku.get(t)||null}return await this.init(),this.db?new Promise(n=>{try{const a=this.db.transaction([Es.THUMBNAILS],"readonly").objectStore(Es.THUMBNAILS).get(t);a.onsuccess=()=>{const o=a.result;o?(this.updateThumbnailCache(t,o.data),n(o.data)):n(null)},a.onerror=()=>n(null)}catch{n(null)}}):null}async getPreview(t){if(Bd.has(t)){const n=qc.indexOf(t);return n>-1&&(qc.splice(n,1),qc.push(t)),Bd.get(t)||null}return await this.init(),this.db?new Promise(n=>{try{const a=this.db.transaction([Es.PREVIEWS],"readonly").objectStore(Es.PREVIEWS).get(t);a.onsuccess=()=>{const o=a.result;o?(this.updatePreviewCache(t,o.data),n(o.data)):n(null)},a.onerror=()=>n(null)}catch{n(null)}}):null}async getImageForZoom(t,n,r){if(n<.3){const i=await this.getThumbnail(t);if(i)return i}if(n<.8){const i=await this.getPreview(t);if(i)return i}return r||null}hasThumbnail(t){var n;return Ku.has(t)||((n=Hc.get(t))==null?void 0:n.hasThumbnail)===!0}hasPreview(t){var n;return Bd.has(t)||((n=Hc.get(t))==null?void 0:n.hasPreview)===!0}async delete(t){Ku.delete(t),Bd.delete(t),Hc.delete(t);const n=Gc.indexOf(t);n>-1&&Gc.splice(n,1);const r=qc.indexOf(t);if(r>-1&&qc.splice(r,1),await this.init(),!!this.db)try{const i=this.db.transaction([Es.THUMBNAILS,Es.PREVIEWS,Es.METADATA],"readwrite");i.objectStore(Es.THUMBNAILS).delete(t),i.objectStore(Es.PREVIEWS).delete(t),i.objectStore(Es.METADATA).delete(t)}catch(i){console.warn("[ThumbnailStore] Delete failed:",i)}}async clear(){if(Ku.clear(),Bd.clear(),Hc.clear(),Gc.length=0,qc.length=0,await this.init(),!!this.db)try{const t=this.db.transaction([Es.THUMBNAILS,Es.PREVIEWS,Es.METADATA],"readwrite");t.objectStore(Es.THUMBNAILS).clear(),t.objectStore(Es.PREVIEWS).clear(),t.objectStore(Es.METADATA).clear(),console.log("[ThumbnailStore] All data cleared")}catch(t){console.warn("[ThumbnailStore] Clear failed:",t)}}getStats(){return{thumbnails:Ku.size,previews:Bd.size,metadata:Hc.size}}async clearMemoryCache(){console.log("[ThumbnailStore] Clearing memory cache"),Ku.clear(),Bd.clear(),Hc.clear(),Gc.length=0,qc.length=0,this.clearSizeThumbnailCache()}async preloadThumbnails(t){if(await this.init(),!this.db)return;const n=t.filter(r=>!Ku.has(r));if(n.length!==0){console.log("[ThumbnailStore] Preloading",n.length,"thumbnails");try{const i=this.db.transaction([Es.THUMBNAILS],"readonly").objectStore(Es.THUMBNAILS);await Promise.all(n.map(a=>new Promise(o=>{const l=i.get(a);l.onsuccess=()=>{const c=l.result;c&&this.updateThumbnailCache(a,c.data),o()},l.onerror=()=>o()})))}catch(r){console.warn("[ThumbnailStore] Preload failed:",r)}}}clearSizeThumbnailCache(){Bf.clear(),S0.length=0}}const zi=new ZH,vP=Object.freeze(Object.defineProperty({__proto__:null,SCALE_THRESHOLD_PX:Zg,thumbnailStore:zi},Symbol.toStringTag,{value:"Module"})),b2="qiaodoumayi_content_store",ja="contents",QH=50*1024,eG=100*1024,tG=500*1024,j5=typeof navigator<"u"&&/win/i.test(navigator.platform+navigator.userAgent),wP=typeof navigator<"u"&&(navigator.platform.toLowerCase().includes("mac")||navigator.platform.toLowerCase().includes("win")||navigator.userAgent.toLowerCase().includes("mac")||navigator.userAgent.toLowerCase().includes("win")),wo=new Map,uj=j5?50*1024*1024:wP?80*1024*1024:30*1024*1024,nG=j5?80:wP?150:50;let Ud=0;const oo=[],y2=new Map,rG=j5?48:96,hh=new Map,Al=[];class sG{constructor(){Mn(this,"db",null);Mn(this,"initPromise",null);Mn(this,"initFailed",!1)}async init(){if(this.initFailed){console.warn("[ContentStore] IndexedDB init previously failed, running in degraded mode");return}if(this.db){if(this.db.objectStoreNames.contains(ja))return;console.warn("[ContentStore] Object store not found, reinitializing..."),this.db.close(),this.db=null,this.initPromise=null}if(this.initPromise)return this.initPromise;const t=new Promise((r,i)=>{setTimeout(()=>{i(new Error("IndexedDB initialization timeout (5s)"))},5e3)}),n=new Promise((r,i)=>{try{if(typeof indexedDB>"u"){console.warn("[ContentStore] IndexedDB not available"),r();return}const a=indexedDB.open(b2);a.onsuccess=()=>{const o=a.result,l=!o.objectStoreNames.contains(ja),c=o.version;if(o.close(),l){console.log("[ContentStore] Object store missing, upgrading database...");const u=indexedDB.open(b2,c+1);u.onerror=()=>{console.error("[ContentStore] Failed to upgrade IndexedDB:",u.error),i(u.error)},u.onsuccess=()=>{this.db=u.result,console.log("[ContentStore] IndexedDB upgraded and initialized"),r()},u.onupgradeneeded=d=>{const h=d.target.result;if(!h.objectStoreNames.contains(ja)){const p=h.createObjectStore(ja,{keyPath:"id"});p.createIndex("type","type",{unique:!1}),p.createIndex("createdAt","createdAt",{unique:!1}),console.log("[ContentStore] Object store created during upgrade")}}}else{const u=indexedDB.open(b2,c);u.onerror=()=>{console.error("[ContentStore] Failed to open IndexedDB:",u.error),i(u.error)},u.onsuccess=()=>{this.db=u.result,console.log("[ContentStore] IndexedDB initialized"),r()}}},a.onerror=()=>{console.error("[ContentStore] Failed to check IndexedDB:",a.error),i(a.error)},a.onupgradeneeded=o=>{const l=o.target.result;if(!l.objectStoreNames.contains(ja)){const c=l.createObjectStore(ja,{keyPath:"id"});c.createIndex("type","type",{unique:!1}),c.createIndex("createdAt","createdAt",{unique:!1}),console.log("[ContentStore] Object store created (new database)")}}}catch(a){console.error("[ContentStore] Error during IndexedDB init:",a),i(a)}});return this.initPromise=Promise.race([n,t]).catch(r=>{console.error("[ContentStore] IndexedDB init failed:",r),this.initFailed=!0}),this.initPromise}generateId(){return`content_${Date.now()}_${Math.random().toString(36).substr(2,9)}`}detectType(t){return t.startsWith("data:image")?"image":t.startsWith("data:video")?"video":t.startsWith("data:audio")?"audio":t.match(/\.(jpg|jpeg|png|gif|webp|bmp)$/i)?"image":t.match(/\.(mp4|webm|ogg|mov)$/i)?"video":t.match(/\.(mp3|wav|ogg|m4a|aac)$/i)?"audio":"unknown"}estimateSize(t){return t.length*2}shouldStore(t){return!t||!t.startsWith("data:")?!1:this.estimateSize(t)>QH}isContentRef(t){return typeof t=="string"&&t.startsWith("content_ref:")}extractId(t){return t.replace("content_ref:","")}createRef(t){return`content_ref:${t}`}updateMemoryCache(t,n){const r=this.estimateSize(n);if(r>uj/2){this.addToLargeCache(t,n);return}for(;(Ud+r>uj||wo.size>=nG)&&oo.length>0;){const a=oo.shift();if(a&&wo.has(a)){const o=wo.get(a);o&&(Ud-=this.estimateSize(o)),wo.delete(a)}}const i=oo.indexOf(t);i>-1&&oo.splice(i,1),oo.push(t),wo.has(t)||(wo.set(t,n),Ud+=r)}addToLargeCache(t,n){if(hh.has(t)){const r=Al.indexOf(t);r>-1&&Al.splice(r,1),Al.push(t);return}for(;Al.length>=rG&&Al.length>0;){const r=Al.shift();r&&hh.delete(r)}hh.set(t,n),Al.push(t)}async store(t){await this.init();const n=this.generateId(),r=this.estimateSize(t),i=this.detectType(t);if(i==="image"&&r>eG&&zi.storeWithThumbnails(n,t).catch(o=>{console.warn("[ContentStore] Failed to generate thumbnails:",o)}),!this.db||!this.db.objectStoreNames.contains(ja))return console.warn("[ContentStore] IndexedDB not available, using memory cache only"),this.updateMemoryCache(n,t),n;const a={id:n,content:t,type:i,size:r,createdAt:Date.now()};return console.log("[ContentStore] Storing content:",n,"size:",t.length,"type:",a.type),new Promise((o,l)=>{try{const d=this.db.transaction([ja],"readwrite").objectStore(ja).put(a);d.onsuccess=()=>{console.log("[ContentStore] Content stored successfully:",n),this.updateMemoryCache(n,t),r>tG&&yn("rust_cache_set",{id:n,value:t}).catch(h=>{console.warn("[ContentStore] Rust cache set failed:",h)}),o(n)},d.onerror=()=>{console.error("[ContentStore] Failed to store content:",d.error),this.updateMemoryCache(n,t),o(n)}}catch(c){console.warn("[ContentStore] Store failed, using memory cache:",c),this.updateMemoryCache(n,t),o(n)}})}async storeImageUrlAsRef(t){if(this.isContentRef(t))return t;let n=t;if(t.startsWith("blob:")||t.startsWith("http://")||t.startsWith("https://")){const a=await(await fetch(t)).blob();if(n=await new Promise((o,l)=>{const c=new FileReader;c.onload=()=>o(c.result),c.onerror=l,c.readAsDataURL(a)}),t.startsWith("blob:"))try{URL.revokeObjectURL(t)}catch{}}if(!n.startsWith("data:"))return t;const r=await this.store(n);return this.createRef(r)}async getForZoom(t,n){if(n!==void 0&&n<.8){const r=await zi.getImageForZoom(t,n);if(r)return r}return this.get(t)}getFromCacheSync(t){if(wo.has(t)){const n=oo.indexOf(t);return n>-1&&oo.splice(n,1),oo.push(t),wo.get(t)||null}if(hh.has(t)){const n=Al.indexOf(t);return n>-1&&Al.splice(n,1),Al.push(t),hh.get(t)||null}return null}async get(t){if(wo.has(t)){const i=oo.indexOf(t);return i>-1&&oo.splice(i,1),oo.push(t),wo.get(t)||null}if(hh.has(t)){const i=Al.indexOf(t);return i>-1&&Al.splice(i,1),Al.push(t),hh.get(t)||null}const n=y2.get(t);if(n)return n;const r=this.getInternal(t);return y2.set(t,r),r.finally(()=>{y2.delete(t)}),r}async getInternal(t){try{const n=await yn("rust_cache_get",{id:t});if(n!=null&&n.length>0)return this.updateMemoryCache(t,n),n}catch{}if(wo.has(t)){const n=oo.indexOf(t);return n>-1&&oo.splice(n,1),oo.push(t),wo.get(t)||null}return await this.init(),!this.db||!this.db.objectStoreNames.contains(ja)?null:new Promise(n=>{try{const a=this.db.transaction([ja],"readonly").objectStore(ja).get(t);a.onsuccess=()=>{const o=a.result;o?(this.updateMemoryCache(t,o.content),n(o.content)):n(null)},a.onerror=()=>n(null)}catch{n(null)}})}async delete(t){try{await yn("rust_cache_remove",{id:t})}catch{}if(wo.has(t)){const n=wo.get(t);n&&(Ud-=this.estimateSize(n)),wo.delete(t);const r=oo.indexOf(t);r>-1&&oo.splice(r,1)}if(await this.init(),!(!this.db||!this.db.objectStoreNames.contains(ja)))return new Promise((n,r)=>{try{const o=this.db.transaction([ja],"readwrite").objectStore(ja).delete(t);o.onsuccess=()=>n(),o.onerror=()=>{console.warn("[ContentStore] Delete failed:",o.error),n()}}catch(i){console.warn("[ContentStore] Delete failed:",i),n()}})}async clear(){if(wo.clear(),oo.length=0,Ud=0,await this.init(),!!this.db){if(!this.db.objectStoreNames.contains(ja)){console.warn("[ContentStore] Object store not found, skipping clear");return}return new Promise((t,n)=>{try{const a=this.db.transaction([ja],"readwrite").objectStore(ja).clear();a.onsuccess=()=>{console.log("[ContentStore] All contents cleared"),t()},a.onerror=()=>n(a.error)}catch(r){console.warn("[ContentStore] Failed to clear, object store may not exist:",r),t()}})}}async getStats(){return await this.init(),!this.db||!this.db.objectStoreNames.contains(ja)?{count:0,totalSize:0,memoryCacheSize:Ud}:new Promise(t=>{try{const n=this.db.transaction([ja],"readonly"),r=n.objectStore(ja),i=r.count();let a=0;const o=r.openCursor();o.onsuccess=l=>{const c=l.target.result;c&&(a+=c.value.size,c.continue())},i.onsuccess=()=>{n.oncomplete=()=>{t({count:i.result,totalSize:a,memoryCacheSize:Ud})}},i.onerror=()=>{console.warn("[ContentStore] getStats count error"),t({count:0,totalSize:0,memoryCacheSize:Ud})}}catch(n){console.warn("[ContentStore] getStats failed:",n),t({count:0,totalSize:0,memoryCacheSize:Ud})}})}clearMemoryCache(){wo.clear(),oo.length=0,Ud=0,hh.clear(),Al.length=0,console.log("[ContentStore] Memory cache cleared")}}const Ln=new sG,Nh=Object.freeze(Object.defineProperty({__proto__:null,contentStore:Ln},Symbol.toStringTag,{value:"Module"}));function _h(e,t){let n=null;return function(...i){const a=()=>{n=null,e(...i)};n&&clearTimeout(n),n=setTimeout(a,t)}}let v2=0;function ns(){const e=performance.now(),t=v2++;return v2>Number.MAX_SAFE_INTEGER-1e3&&(v2=0),`${Math.floor(e)}-${t}-${Math.random().toString(36).substr(2,9)}`}function Nw(e,t="未命名项目"){var a;const n=(e||"").trim();if(!n)return t;const r=n.split(/[/\\]/);return((a=r[r.length-1])==null?void 0:a.trim())||n||t}function ld(e=new Date){const t=-e.getTimezoneOffset(),n=Math.floor(Math.abs(t)/60),r=Math.abs(t)%60,i=t>=0?"+":"-",a=f=>String(f).padStart(2,"0"),o=e.getFullYear(),l=a(e.getMonth()+1),c=a(e.getDate()),u=a(e.getHours()),d=a(e.getMinutes()),h=a(e.getSeconds()),p=String(e.getMilliseconds()).padStart(3,"0");return`${o}-${l}-${c}T${u}:${d}:${h}.${p}${i}${a(n)}:${a(r)}`}function Ew(e="compact",t=new Date){const n=u=>String(u).padStart(2,"0"),r=t.getFullYear(),i=n(t.getMonth()+1),a=n(t.getDate()),o=n(t.getHours()),l=n(t.getMinutes()),c=n(t.getSeconds());return e==="standard"?`${r}-${i}-${a}_${o}-${l}-${c}`:`${r}${i}${a}_${o}${l}${c}`}function _P(e=new Date){const t=a=>String(a).padStart(2,"0"),n=e.getFullYear(),r=t(e.getMonth()+1),i=t(e.getDate());return`${n}-${r}-${i}`}function iG(e){const t=e.toLowerCase();return(t.includes("prod-ss-vidu")||t.includes("s3")&&t.includes("amazonaws"))&&(t.includes(".mp4")||t.includes("/video"))}const aG=["vlabvod.com","dreamina.jimeng.com","dreamnia.jimeng.com","byteimg.com","v3-dreamnia.jimeng.com","v9-dreamnia.jimeng.com"];function Iw(e){if(!e||typeof e!="string")return!1;try{const t=new URL(e).hostname.toLowerCase();return aG.some(n=>t===n||t.endsWith("."+n))}catch{return!1}}function Ea(e,t){if(!e||typeof e!="string")return"";if(!Iw(e))return e;const n=($o==null?void 0:$o.API_BASE_URL).replace(/\/+$/,"");return n?`${n}/v1/videos/proxy?url=${encodeURIComponent(e)}`:e}async function ia(e,t,n){if(e)try{let r;if(e.startsWith("data:"))r=await(await fetch(e)).blob();else if(e.startsWith("http://")||e.startsWith("https://"))if(typeof window<"u"&&"__TAURI__"in window)try{const{downloadWithFallback:a}=await mn(async()=>{const{downloadWithFallback:o}=await Promise.resolve().then(()=>n0);return{downloadWithFallback:o}},void 0,import.meta.url);if(r=await a(e,12e4),!r.type&&(e.includes(".mp4")||e.includes("/video")||iG(e)))r=new Blob([await r.arrayBuffer()],{type:"video/mp4"});else if(!r.type&&(e.includes(".png")||e.includes(".jpg")||e.includes(".jpeg")||e.includes(".webp")||e.includes(".gif"))){const o=e.includes(".png")?"image/png":e.includes(".webp")?"image/webp":e.includes(".gif")?"image/gif":"image/jpeg";r=new Blob([await r.arrayBuffer()],{type:o})}}catch{const o=await fetch(e);if(!o.ok)throw new Error(`HTTP ${o.status}`);r=await o.blob()}else{const a=await fetch(e);if(!a.ok)throw new Error(`HTTP ${a.status}`);r=await a.blob()}else return;await Xr.saveBlobAsset(t,r,e)}catch(r){console.error("[downloadUrlToLocal] ❌ 处理失败:",r)}}const Jz=1024,Zz=.75,Nx=720,Ex=.36,Ix=new Map,Qz=new Map;async function kv(e){if(!e.type.startsWith("image/"))return Promise.resolve({width:0,height:0});const t=URL.createObjectURL(e);return new Promise(n=>{const r=new Image;r.onload=()=>{URL.revokeObjectURL(t),n({width:r.naturalWidth,height:r.naturalHeight})},r.onerror=()=>{URL.revokeObjectURL(t),n({width:0,height:0})},r.src=t})}function e$(e){return Qz.get(e)??null}function C5(e){return e!=null&&e.startsWith("blob:")?Ix.get(e)??null:null}function Av(e,t){e!=null&&e.startsWith("blob:")&&t&&Ix.set(e,t)}async function kx(e,t=Jz,n=Zz){if(!e.type.startsWith("image/"))return e;if(typeof createImageBitmap=="function")try{const a=await createImageBitmap(e,{resizeWidth:t,resizeQuality:"high"}),o=a.width,l=a.height;if(o<=0||l<=0)return a.close(),e;const c=document.createElement("canvas");c.width=o,c.height=l;const u=c.getContext("2d");return u?(u.drawImage(a,0,0),a.close(),await new Promise(h=>{c.toBlob(p=>h(p),"image/jpeg",n)})||e):(a.close(),e)}catch{}const i=URL.createObjectURL(e);return new Promise(a=>{const o=new Image;o.onload=()=>{URL.revokeObjectURL(i);let l=o.naturalWidth,c=o.naturalHeight;if(l<=t&&c<=t){a(e);return}const u=Math.min(t/l,t/c);l=Math.round(l*u),c=Math.round(c*u);const d=document.createElement("canvas");d.width=l,d.height=c;const h=d.getContext("2d");if(!h){a(e);return}h.imageSmoothingEnabled=!0,h.imageSmoothingQuality="high",h.drawImage(o,0,0,l,c),d.toBlob(p=>a(p||e),"image/jpeg",n)},o.onerror=()=>{URL.revokeObjectURL(i),a(e)},o.src=i})}async function zP(e){return e.type.startsWith("image/")?kx(e,Nx,Ex):null}async function mb(e,t){let n=Ix.get(e)??t??null;if(!n)return null;try{return await Xr.getAssetBlob(n)}catch{return null}}async function $P(e){if(!e)return e;if(e.startsWith("content_ref:")){await Ln.init();const t=Ln.extractId(e);let n=await Ln.get(t);if(n||(await new Promise(r=>setTimeout(r,200)),n=await Ln.get(t)),n)return n}if(e.startsWith("blob:")){const t=await mb(e);if(t)return URL.createObjectURL(t)}return e}async function oG(e,t){const n=await mb(e,t);return n?URL.createObjectURL(n):null}async function lG(e,t){if(!(e!=null&&e.startsWith("blob:")))return null;try{const{assetStore:n}=await mn(async()=>{const{assetStore:o}=await Promise.resolve().then(()=>_s);return{assetStore:o}},void 0,import.meta.url);await n.init();const r=new Set,i=[],a=C5(e);a&&(r.add(a),i.push(a));for(const o of t||[])o&&typeof o=="string"&&!r.has(o)&&(r.add(o),i.push(o));for(const o of i){const l=await n.getAssetBlob(o);if(l&&l.size>0)return URL.createObjectURL(l)}}catch{}return null}const cG=800*1024;async function SP(e){let t=e;if(e.startsWith("content_ref:")){await Ln.init();const a=Ln.extractId(e),o=await Ln.get(a);if(!o)throw new Error(`content_ref 不存在: ${a}`);t=o}const n=await fetch(t).then(a=>a.blob());if(n.size<=cG)return new Promise((a,o)=>{const l=new FileReader;l.onload=()=>a(l.result),l.onerror=o,l.readAsDataURL(n)});const{processLargeData:r}=await mn(async()=>{const{processLargeData:a}=await Promise.resolve().then(()=>tK);return{processLargeData:a}},void 0,import.meta.url);return`data:image/jpeg;base64,${await r("process_image",n,{maxDimension:1536,quality:.78})}`}const uG=1024;async function kw(e,t=uG){const{url:n,revoke:r}=await jP(e);return new Promise((i,a)=>{const o=new Image;o.crossOrigin="anonymous";const l=setTimeout(()=>{r&&n.startsWith("blob:")&&URL.revokeObjectURL(n),a(new Error("图片加载超时"))},3e4);o.onload=()=>{clearTimeout(l),r&&n.startsWith("blob:")&&URL.revokeObjectURL(n);let c=o.naturalWidth,u=o.naturalHeight;if(c<=0||u<=0){a(new Error("图片尺寸无效"));return}const d=Math.min(1,t/Math.max(c,u)),h=Math.round(c*d),p=Math.round(u*d),f=document.createElement("canvas");f.width=h,f.height=p;const b=f.getContext("2d");if(!b){a(new Error("无法创建 canvas"));return}b.imageSmoothingEnabled=!0,b.imageSmoothingQuality="high",b.drawImage(o,0,0,c,u,0,0,h,p);const g=f.toDataURL("image/jpeg",.88);i({url:g,width:h,height:p})},o.onerror=()=>{clearTimeout(l),r&&n.startsWith("blob:")&&URL.revokeObjectURL(n),a(new Error("图片加载失败"))},o.src=n})}async function Yf(e,t,n,r){if(e.startsWith("blob:")||e.startsWith("data:")||!e.startsWith("http://")&&!e.startsWith("https://"))return e;if(Iw(e)){let o=null;try{const l=await fetch(e,{mode:"cors",credentials:"omit"});l.ok&&(o=await l.blob())}catch{}if(!o)try{o=await new Promise((l,c)=>{const u=new Image;u.crossOrigin="anonymous";const d=setTimeout(()=>c(new Error("timeout")),15e3);u.onload=()=>{clearTimeout(d);const h=document.createElement("canvas");h.width=u.naturalWidth,h.height=u.naturalHeight;const p=h.getContext("2d");if(!p){c(new Error("no ctx"));return}p.drawImage(u,0,0),h.toBlob(f=>f?l(f):c(new Error("toBlob")),"image/png")},u.onerror=()=>{clearTimeout(d),c(new Error("load fail"))},u.src=e})}catch{}if(o)try{if(await Xr.saveBlobAsset(t,o,e),o.type.startsWith("image/")){const c=r!=null&&r.usePreviewQuality?Nx:Jz,u=r!=null&&r.usePreviewQuality?Ex:Zz,d=await kx(o,c,u),h=URL.createObjectURL(d);return Ix.set(h,t),kv(o).then(p=>{p.width>0&&p.height>0&&Qz.set(h,p)}).catch(()=>{}),h}return URL.createObjectURL(o)}catch(l){console.warn("[downloadAndGetLocalUrl] 原始 URL 下载后保存失败:",l)}e=Ea(e)||e}else{const o=Ea(e)||e;o!==e&&(e=o)}let i=null;try{const o=await fetch(e,{mode:"cors",credentials:"omit"});o.ok&&(i=await o.blob())}catch{console.log("[downloadAndGetLocalUrl] fetch CORS 失败,尝试 Image + Canvas 方式")}if(!i&&typeof window<"u")try{const o=new URL(e);if(o.origin===window.location.origin&&o.pathname.includes("/v1/videos/proxy")){const c=await fetch(e);c.ok&&(i=await c.blob())}}catch{}if(!i)try{i=await new Promise((o,l)=>{const c=new Image;c.crossOrigin="anonymous";const u=setTimeout(()=>{l(new Error("图片加载超时"))},3e4);c.onload=()=>{clearTimeout(u);try{const d=document.createElement("canvas");d.width=c.naturalWidth,d.height=c.naturalHeight;const h=d.getContext("2d");if(!h){l(new Error("无法创建 canvas context"));return}h.drawImage(c,0,0),d.toBlob(p=>{p?o(p):l(new Error("Canvas toBlob 失败"))},"image/png")}catch(d){l(d)}},c.onerror=()=>{clearTimeout(u),l(new Error("图片加载失败"))},c.src=e})}catch(o){console.warn("[downloadAndGetLocalUrl] Image + Canvas 方式也失败:",o)}const a=typeof window<"u"&&(()=>{try{const o=new URL(e),l=o.pathname.includes("/v1/videos/proxy"),c=o.hostname==="localhost"||o.hostname==="127.0.0.1"||o.hostname==="",u=o.origin===window.location.origin;return l&&(c||u)}catch{return!1}})();if(!i&&!a&&(e.startsWith("http://")||e.startsWith("https://")))try{const o=`https://wsrv.nl/?url=${encodeURIComponent(e)}&output=png`;console.log("[downloadAndGetLocalUrl] 尝试 wsrv.nl 代理下载...");const l=await fetch(o,{mode:"cors",credentials:"omit"});l.ok&&(i=await l.blob(),console.log("[downloadAndGetLocalUrl] ✅ wsrv.nl 代理下载成功"))}catch(o){console.warn("[downloadAndGetLocalUrl] wsrv.nl 代理也失败:",o)}if(i)try{if(await Xr.saveBlobAsset(t,i,e),i.type.startsWith("image/")){const c=r!=null&&r.usePreviewQuality?Nx:Jz,u=r!=null&&r.usePreviewQuality?Ex:Zz,d=await kx(i,c,u),h=URL.createObjectURL(d);return Ix.set(h,t),kv(i).then(p=>{p.width>0&&p.height>0&&Qz.set(h,p)}).catch(()=>{}),h}return URL.createObjectURL(i)}catch(o){console.error("[downloadAndGetLocalUrl] ❌ 保存失败:",o)}return console.warn("[downloadAndGetLocalUrl] ⚠️ 无法下载图片,返回原始 URL"),e}async function jP(e){if(e.startsWith("blob:")){const i=await mb(e);if(i)return{url:URL.createObjectURL(i),revoke:!0}}let t=e;if(e.startsWith("content_ref:"))try{await Ln.init();const i=Ln.extractId(e);let a=await Ln.get(i);if(a||(await new Promise(o=>setTimeout(o,300)),a=await Ln.get(i)),!a)throw new Error(`content_ref 不存在: ${i}`);t=a}catch(i){throw console.error("[getLoadableImageUrl] content_ref 解析失败:",i),new Error("图片加载失败:无法解析 content_ref")}if(!t.startsWith("http://")&&!t.startsWith("https://"))return{url:t,revoke:!1};try{const i=await fetch(t,{mode:"cors",credentials:"omit"});if(i.ok){const a=await i.blob();return{url:URL.createObjectURL(a),revoke:!0}}}catch{console.log("[getLoadableImageUrl] fetch CORS 失败,尝试 Tauri/代理")}let n=null;try{const{downloadWithFallback:i}=await mn(async()=>{const{downloadWithFallback:a}=await Promise.resolve().then(()=>n0);return{downloadWithFallback:a}},void 0,import.meta.url);n=await i(t,6e4)}catch(i){console.warn("[getLoadableImageUrl] Tauri/ fetch 失败:",i)}if(!n)try{const i=`https://wsrv.nl/?url=${encodeURIComponent(t)}&output=png&fit=inside&w=99999&h=99999`,a=await fetch(i);a.ok&&(n=await a.blob())}catch{}if(!n)try{const i=`https://api.allorigins.win/raw?url=${encodeURIComponent(t)}`,a=await fetch(i);a.ok&&(n=await a.blob())}catch{}if(n)return{url:URL.createObjectURL(n),revoke:!0};if(typeof window<"u"&&("__TAURI__"in window||"__TAURI_INTERNALS__"in window))throw new Error("无法下载图片,请检查网络或使用打包版以绕过 CORS");return new Promise((i,a)=>{const o=new Image;o.crossOrigin="anonymous";const l=setTimeout(()=>{a(new Error("图片加载超时"))},3e4);o.onload=()=>{clearTimeout(l);try{const c=document.createElement("canvas");c.width=o.naturalWidth,c.height=o.naturalHeight;const u=c.getContext("2d");if(!u){a(new Error("无法创建 canvas context"));return}u.drawImage(o,0,0),c.toBlob(d=>{if(d)i({url:URL.createObjectURL(d),revoke:!0});else try{const h=c.toDataURL("image/png");i({url:h,revoke:!1})}catch{a(new Error("Canvas 导出失败(可能是 CORS 限制)"))}},"image/png")}catch(c){console.warn("[getLoadableImageUrl] Canvas 导出失败,返回已解析 URL:",c),i({url:t,revoke:!1})}},o.onerror=()=>{clearTimeout(l),console.warn("[getLoadableImageUrl] 图片加载失败,返回原始 URL"),i({url:t,revoke:!1})},o.src=t})}async function N5(e,t){if(!t.length)return[];const{url:n,revoke:r}=await jP(e);return new Promise((i,a)=>{const o=new Image;o.crossOrigin="anonymous";const l=setTimeout(()=>{r&&URL.revokeObjectURL(n),a(new Error("图片加载超时"))},3e4);o.onload=()=>{clearTimeout(l);const c=o.width,u=o.height,d=(h,p)=>new Promise((f,b)=>{const g=Math.max(0,Math.min(h.x,c-1)),y=Math.max(0,Math.min(h.y,u-1)),w=Math.min(Math.max(1,h.w),c-g),v=Math.min(Math.max(1,h.h),u-y),m=document.createElement("canvas");m.width=w,m.height=v;const z=m.getContext("2d");z&&(z.fillStyle="#ffffff",z.fillRect(0,0,w,v),z.drawImage(o,g,y,w,v,0,0,w,v));try{m.toBlob(C=>{f(C?{url:URL.createObjectURL(C),width:w,height:v}:{url:m.toDataURL("image/png"),width:w,height:v})},"image/png")}catch{f({url:m.toDataURL("image/png"),width:w,height:v})}});Promise.all(t.map((h,p)=>d(h))).then(h=>{r&&URL.revokeObjectURL(n),i(h)}).catch(h=>{r&&URL.revokeObjectURL(n),a(h)})},o.onerror=()=>{clearTimeout(l),r&&URL.revokeObjectURL(n),a(new Error("图片加载失败"))},o.src=n})}function dG(e){const t=e.getContext("2d");if(!t)return e;const n=e.width,r=e.height;if(n<8||r<8)return e;const a=t.getImageData(0,0,n,r).data,o=40,l=235,c=25,u=.12,d=Math.max(1,Math.floor(n*u)),h=Math.max(1,Math.floor(r*u));function p(E){let I=0,R=0;for(let F=0;Fl)&&Ol)&&O=Math.max(0,r-h)&&p(E);E--)g=E-1;for(let E=0;E=Math.max(0,n-d)&&f(E);E--)w=E-1;if(w=n&&m>=r)return e;const z=document.createElement("canvas");z.width=v,z.height=m;const C=z.getContext("2d");return C?(C.drawImage(e,y,b,v,m,0,0,v,m),z):e}async function fo(e,t=3,n=3){console.log("[splitGridImage] Starting split:",{imageUrl:e.substring(0,100),cols:t,rows:n});let r=e,i=!1;if(e.startsWith("blob:")){const a=await mb(e);a&&(r=URL.createObjectURL(a),i=!0)}if(r.startsWith("content_ref:"))try{await Ln.init();const a=Ln.extractId(e);let o=await Ln.get(a);if(o||(await new Promise(l=>setTimeout(l,300)),o=await Ln.get(a)),!o)throw new Error(`content_ref 不存在: ${a}`);r=o,console.log("[splitGridImage] content_ref 已解析")}catch(a){throw console.error("[splitGridImage] content_ref 解析失败:",a),new Error("图片加载失败:无法解析 content_ref")}return new Promise(async(a,o)=>{var l;try{let c=r,u=i;if(r.startsWith("http://")||r.startsWith("https://")){console.log("[splitGridImage] Downloading remote image to create clean blob...");try{const p=await fetch(r,{mode:"cors",credentials:"omit"});if(!p.ok)throw new Error(`HTTP ${p.status}`);const f=await p.blob();c=URL.createObjectURL(f),u=!0,console.log("[splitGridImage] Clean blob created:",c.substring(0,50))}catch(p){console.warn("[splitGridImage] Fetch failed, trying dev proxy / Tauri then proxies:",p);let f=null;const b=r;if(typeof window<"u"&&((l=window.location)!=null&&l.origin)&&/^https?:\/\/localhost(:\d+)?$/.test(window.location.origin))try{const g=`${window.location.origin}/api/image-proxy?url=${encodeURIComponent(b)}`,y=await fetch(g);y.ok&&(f=await y.blob())}catch(g){console.warn("[splitGridImage] Dev image-proxy failed:",g)}if(!f)try{const{downloadWithFallback:g}=await mn(async()=>{const{downloadWithFallback:y}=await Promise.resolve().then(()=>n0);return{downloadWithFallback:y}},void 0,import.meta.url);f=await g(b,6e4)}catch(g){console.warn("[splitGridImage] Tauri download failed, trying proxies:",g)}if(!f)try{const g=`https://wsrv.nl/?url=${encodeURIComponent(b)}&output=png&fit=inside&w=99999&h=99999`,y=await fetch(g);y.ok&&(f=await y.blob())}catch(g){console.warn("[splitGridImage] wsrv.nl failed:",g)}if(!f)try{const g=`https://api.allorigins.win/raw?url=${encodeURIComponent(b)}`,y=await fetch(g);y.ok&&(f=await y.blob())}catch(g){console.warn("[splitGridImage] allorigins proxy failed:",g)}if(f)c=URL.createObjectURL(f),u=!0,console.log("[splitGridImage] Clean blob from Tauri/proxy:",c.substring(0,50));else{console.error("[splitGridImage] All download attempts failed"),o(new Error("无法下载图片,请检查网络或使用打包版以绕过 CORS"));return}}}const d=new Image,h=setTimeout(()=>{console.error("[splitGridImage] Timeout after 30s"),u&&URL.revokeObjectURL(c),o(new Error("图片加载超时"))},3e4);d.onload=()=>{clearTimeout(h),console.log("[splitGridImage] Image loaded successfully:",{width:d.width,height:d.height});try{const p=Math.floor(d.width/t),f=Math.floor(d.height/n),b=d.width%t,g=d.height%n,y=new Array(t).fill(p).map((m,z)=>m+(zm+(zq+H,0),E=w.slice(0,m).reduce((q,H)=>q+H,0),I=y[z]??p,R=w[m]??f;console.log(`[splitGridImage] Creating crop [${m},${z}]:`,{cropX:C,cropY:E,cropW:I,cropH:R});const A=document.createElement("canvas");A.width=I,A.height=R;const O=A.getContext("2d");O&&(O.fillStyle="#ffffff",O.fillRect(0,0,I,R),O.drawImage(d,C,E,I,R,0,0,I,R));const F=dG(A),L=F.width,X=F.height,T=new Promise((q,H)=>{try{F.toBlob(J=>{if(J){const Z=URL.createObjectURL(J);console.log(`[splitGridImage] Crop [${m},${z}] created:`,Z.substring(0,50)),q({url:Z,width:L,height:X})}else{console.warn(`[splitGridImage] Crop [${m},${z}] toBlob returned null, trying toDataURL`);try{const Z=F.toDataURL("image/png");q({url:Z,width:L,height:X})}catch(Z){console.error(`[splitGridImage] Crop [${m},${z}] toDataURL also failed:`,Z),H(new Error("Canvas 导出失败"))}}},"image/png")}catch(J){console.warn(`[splitGridImage] Crop [${m},${z}] toBlob threw error, trying toDataURL:`,J);try{const Z=F.toDataURL("image/png");q({url:Z,width:L,height:X})}catch(Z){console.error(`[splitGridImage] Crop [${m},${z}] toDataURL also failed:`,Z),H(new Error("Canvas 导出失败"))}}});v.push(T)}Promise.all(v).then(m=>{console.log("[splitGridImage] All crops completed:",m.length),u&&URL.revokeObjectURL(c),a(m)}).catch(m=>{console.error("[splitGridImage] Crop promise failed:",m),u&&URL.revokeObjectURL(c),o(m)})}catch(p){console.error("[splitGridImage] Error during split:",p),u&&URL.revokeObjectURL(c),o(p)}},d.onerror=p=>{clearTimeout(h),console.error("[splitGridImage] Image load error:",p),u&&URL.revokeObjectURL(c),o(new Error("图片加载失败"))},console.log("[splitGridImage] Setting image src to:",c.substring(0,50)),d.src=c}catch(c){console.error("[splitGridImage] Unexpected error:",c),o(c)}})}async function xm(e){return fo(e,2,2)}const g1=new Set(["key","apikey","api_key","api_key_encrypted","secret","apisecret","api_secret","token","accesstoken","access_token","authtoken","auth_token","bearertoken","bearer_token","sessionid","session_id","jimengsessionid","jimeng_session_id","jimengsession","jimeng_session","sessiontoken","session_token","sid","password","passwd","pwd","authorization","credentials","credential","privatekey","private_key","clientsecret","client_secret","refreshtoken","refresh_token","globalapikey","global_api_key","rhapikey","rh_api_key"]);function tu(e){if(e==null)return e;if(Array.isArray(e))return e.map(t=>tu(t));if(typeof e=="object"){const t={...e},n=["key","apiKey","api_key","API_KEY","apikey","secret","apiSecret","api_secret","API_SECRET","token","accessToken","access_token","ACCESS_TOKEN","authToken","auth_token","AUTH_TOKEN","bearerToken","bearer_token","BEARER_TOKEN","sessionId","session_id","SESSION_ID","sessionid","jimengSessionId","jimeng_session_id","JIMENG_SESSION_ID","jimengSession","jimeng_session","JIMENG_SESSION","sessionToken","session_token","SESSION_TOKEN","sid","SID","password","passwd","pwd","PASSWORD","authorization","Authorization","AUTHORIZATION","credentials","credential","privateKey","private_key","PRIVATE_KEY","clientSecret","client_secret","CLIENT_SECRET","refreshToken","refresh_token","REFRESH_TOKEN","globalApiKey","global_api_key","GLOBAL_API_KEY","rhApiKey","rh_api_key","RH_API_KEY"];for(const r of n)r in t&&delete t[r];for(const r of Object.keys(t))g1.has(r.toLowerCase())&&delete t[r];if("apiConfig"in t&&typeof t.apiConfig=="object"&&t.apiConfig!==null){const i={...t.apiConfig};for(const a of n)a in i&&delete i[a];for(const a of Object.keys(i))g1.has(a.toLowerCase())&&delete i[a];t.apiConfig=tu(i)}if("apiConfigs"in t&&Array.isArray(t.apiConfigs)&&(t.apiConfigs=t.apiConfigs.map(r=>{if(r!==null&&typeof r=="object"&&!Array.isArray(r)){const i={...r};for(const a of n)a in i&&delete i[a];for(const a of Object.keys(i))g1.has(a.toLowerCase())&&delete i[a];return tu(i)}return r})),"settings"in t&&typeof t.settings=="object"&&t.settings!==null){const i={...t.settings};for(const a of n)a in i&&delete i[a];for(const a of Object.keys(i))g1.has(a.toLowerCase())&&delete i[a];"_executeTrigger"in i&&delete i._executeTrigger,t.settings=tu(i)}for(const r in t)typeof t[r]=="object"&&t[r]!==null&&(t[r]=tu(t[r]));return t}return e}const Do=Object.freeze(Object.defineProperty({__proto__:null,PREVIEW_CALLBACK_MAX_DIM:Nx,PREVIEW_CALLBACK_QUALITY:Ex,compressImageForCanvas:SP,createThumbnailBlobForPreview:zP,createThumbnailForAi:kw,debounce:_h,downloadAndGetLocalUrl:Yf,downloadUrlToLocal:ia,generateId:ns,getAssetIdForDisplayBlobUrl:C5,getDisplayProjectName:Nw,getFullBlobForDisplayUrl:mb,getFullBlobUrlForDisplayUrl:oG,getImageDimensionsFromBlob:kv,getLocalDateString:_P,getLocalISOString:ld,getLocalTimestamp:Ew,getOriginalDimensionsForDisplayUrl:e$,getVideoDisplayUrl:Ea,isJimengCdnVideoUrl:Iw,recoverDeadBlobUrl:lG,registerDisplayUrlAssetId:Av,resizeBlobForDisplay:kx,resolveImageUrlForDisplay:$P,sanitizeSensitiveData:tu,split2x2Image:xm,splitGridImage:fo,splitImageByRegions:N5},Symbol.toStringTag,{value:"Module"}));function hG(e){return{"1:1":1,"16:9":1.7777777777777777,"9:16":.5625,"4:3":1.3333333333333333,"3:4":.75,"3:2":1.5,"2:3":.6666666666666666}[e]??1}function CP(e,t,n,r,i){const a=i||"center";let o,l;switch(a){case"top":o=Math.round((e-n)/2),l=0;break;case"bottom":o=Math.round((e-n)/2),l=t-r;break;case"left":o=0,l=Math.round((t-r)/2);break;case"right":o=e-n,l=Math.round((t-r)/2);break;default:o=Math.round((e-n)/2),l=Math.round((t-r)/2)}return{offsetX:o,offsetY:l}}function pG(e,t,n,r=1.5,i,a,o){let l,c;if(i!=null&&a!=null){const h=Math.max(1,Math.min(5,i)),p=Math.max(1,Math.min(5,a));l=Math.round(e*h),c=Math.round(t*p)}else{const h=Math.max(1.1,Math.min(5,r));l=Math.round(e*h),c=Math.round(t*h)}const{offsetX:u,offsetY:d}=CP(l,c,e,t,void 0);return{targetW:l,targetH:c,offsetX:u,offsetY:d}}function fG(e,t,n=1.5,r,i,a){return new Promise((o,l)=>{const c=new Image;c.crossOrigin="anonymous",c.onload=()=>{const u=c.naturalWidth,d=c.naturalHeight;if(u<=0||d<=0){l(new Error("图片尺寸无效"));return}let h,p;const f=!t||t==="原比例"||t==="Auto";if(f)if(r!=null&&i!=null){const C=Math.max(1,Math.min(5,r)),E=Math.max(1,Math.min(5,i));h=Math.round(u*C),p=Math.round(d*E)}else{const C=Math.max(1.1,Math.min(5,n));h=Math.round(u*C),p=Math.round(d*C)}else{const C=hG(t);p=Math.max(d,Math.ceil(u/C)),h=Math.round(p*C),h{C?o({compositeBlob:C,maskBase64:z,width:h,height:p}):l(new Error("合成图 toBlob 失败"))},"image/png")},c.onerror=()=>l(new Error("图片加载失败")),c.src=e})}/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const mG=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),NP=(...e)=>e.filter((t,n,r)=>!!t&&t.trim()!==""&&r.indexOf(t)===n).join(" ").trim();/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */var gG={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const xG=_.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:n=2,absoluteStrokeWidth:r,className:i="",children:a,iconNode:o,...l},c)=>_.createElement("svg",{ref:c,...gG,width:t,height:t,stroke:e,strokeWidth:r?Number(n)*24/Number(t):n,className:NP("lucide",i),...l},[...o.map(([u,d])=>_.createElement(u,d)),...Array.isArray(a)?a:[a]]));/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const vn=(e,t)=>{const n=_.forwardRef(({className:r,...i},a)=>_.createElement(xG,{ref:a,iconNode:t,className:NP(`lucide-${mG(e)}`,r),...i}));return n.displayName=`${e}`,n};/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const EP=vn("Activity",[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const IP=vn("AlignCenterHorizontal",[["path",{d:"M2 12h20",key:"9i4pu4"}],["path",{d:"M10 16v4a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-4",key:"11f1s0"}],["path",{d:"M10 8V4a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v4",key:"t14dx9"}],["path",{d:"M20 16v1a2 2 0 0 1-2 2h-2a2 2 0 0 1-2-2v-1",key:"1w07xs"}],["path",{d:"M14 8V7c0-1.1.9-2 2-2h2a2 2 0 0 1 2 2v1",key:"1apec2"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const kP=vn("AlignCenterVertical",[["path",{d:"M12 2v20",key:"t6zp3m"}],["path",{d:"M8 10H4a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h4",key:"14d6g8"}],["path",{d:"M16 10h4a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2h-4",key:"1e2lrw"}],["path",{d:"M8 20H7a2 2 0 0 1-2-2v-2c0-1.1.9-2 2-2h1",key:"1fkdwx"}],["path",{d:"M16 14h1a2 2 0 0 1 2 2v2a2 2 0 0 1-2 2h-1",key:"1euafb"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const bG=vn("AlignCenter",[["path",{d:"M17 12H7",key:"16if0g"}],["path",{d:"M19 18H5",key:"18s9l3"}],["path",{d:"M21 6H3",key:"1jwq7v"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const AP=vn("AlignEndHorizontal",[["rect",{width:"6",height:"16",x:"4",y:"2",rx:"2",key:"z5wdxg"}],["rect",{width:"6",height:"9",x:"14",y:"9",rx:"2",key:"um7a8w"}],["path",{d:"M22 22H2",key:"19qnx5"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const MP=vn("AlignEndVertical",[["rect",{width:"16",height:"6",x:"2",y:"4",rx:"2",key:"10wcwx"}],["rect",{width:"9",height:"6",x:"9",y:"14",rx:"2",key:"4p5bwg"}],["path",{d:"M22 22V2",key:"12ipfv"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const TP=vn("AlignStartHorizontal",[["rect",{width:"6",height:"16",x:"4",y:"6",rx:"2",key:"1n4dg1"}],["rect",{width:"6",height:"9",x:"14",y:"6",rx:"2",key:"17khns"}],["path",{d:"M22 2H2",key:"fhrpnj"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const RP=vn("AlignStartVertical",[["rect",{width:"9",height:"6",x:"6",y:"14",rx:"2",key:"lpm2y7"}],["rect",{width:"16",height:"6",x:"6",y:"4",rx:"2",key:"rdj6ps"}],["path",{d:"M2 2v20",key:"1ivd8o"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const yG=vn("AlignVerticalSpaceAround",[["rect",{width:"10",height:"6",x:"7",y:"9",rx:"2",key:"b1zbii"}],["path",{d:"M22 20H2",key:"1p1f7z"}],["path",{d:"M22 4H2",key:"1b7qnq"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Yd=vn("Aperture",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m14.31 8 5.74 9.94",key:"1y6ab4"}],["path",{d:"M9.69 8h11.48",key:"1wxppr"}],["path",{d:"m7.38 12 5.74-9.94",key:"1grp0k"}],["path",{d:"M9.69 16 3.95 6.06",key:"libnyf"}],["path",{d:"M14.31 16H2.83",key:"x5fava"}],["path",{d:"m16.62 12-5.74 9.94",key:"1vwawt"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const vG=vn("ArrowDown",[["path",{d:"M12 5v14",key:"s699le"}],["path",{d:"m19 12-7 7-7-7",key:"1idqje"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const wG=vn("ArrowLeft",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const _G=vn("ArrowRight",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const zG=vn("ArrowUp",[["path",{d:"m5 12 7-7 7 7",key:"hav0vg"}],["path",{d:"M12 19V5",key:"x0mq9r"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const $G=vn("BadgeCheck",[["path",{d:"M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z",key:"3c2336"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const E5=vn("BookOpen",[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ax=vn("Bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const SG=vn("Box",[["path",{d:"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z",key:"hh9hay"}],["path",{d:"m3.3 7 8.7 5 8.7-5",key:"g66t2b"}],["path",{d:"M12 22V12",key:"d0xqtd"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const dj=vn("Briefcase",[["path",{d:"M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16",key:"jecpp"}],["rect",{width:"20",height:"14",x:"2",y:"6",rx:"2",key:"i6l2r4"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const jG=vn("Building2",[["path",{d:"M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z",key:"1b4qmf"}],["path",{d:"M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2",key:"i71pzd"}],["path",{d:"M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2",key:"10jefs"}],["path",{d:"M10 6h4",key:"1itunk"}],["path",{d:"M10 10h4",key:"tcdvrf"}],["path",{d:"M10 14h4",key:"kelpxr"}],["path",{d:"M10 18h4",key:"1ulq68"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ya=vn("Camera",[["path",{d:"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z",key:"1tc9qg"}],["circle",{cx:"12",cy:"13",r:"3",key:"1vg3eu"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const CG=vn("CheckCheck",[["path",{d:"M18 6 7 17l-5-5",key:"116fxf"}],["path",{d:"m22 10-7.5 7.5L13 16",key:"ke71qq"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Eo=vn("Check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ei=vn("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const PP=vn("ChevronLeft",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ja=vn("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const bm=vn("ChevronUp",[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const nf=vn("CircleAlert",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Aw=vn("CircleCheckBig",[["path",{d:"M21.801 10A10 10 0 1 1 17 3.335",key:"yps3ct"}],["path",{d:"m9 11 3 3L22 4",key:"1pflzl"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const OP=vn("CircleCheck",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const NG=vn("CircleHelp",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const EG=vn("CircleStop",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["rect",{x:"9",y:"9",width:"6",height:"6",rx:"1",key:"1ssd4o"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const LP=vn("CircleX",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const BP=vn("Circle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const IG=vn("Clapperboard",[["path",{d:"M20.2 6 3 11l-.9-2.4c-.3-1.1.3-2.2 1.3-2.5l13.5-4c1.1-.3 2.2.3 2.5 1.3Z",key:"1tn4o7"}],["path",{d:"m6.2 5.3 3.1 3.9",key:"iuk76l"}],["path",{d:"m12.4 3.4 3.1 4",key:"6hsd6n"}],["path",{d:"M3 11h18v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z",key:"ltgou9"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const hj=vn("ClipboardCopy",[["rect",{width:"8",height:"4",x:"8",y:"2",rx:"1",ry:"1",key:"tgr4d6"}],["path",{d:"M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2",key:"4jdomd"}],["path",{d:"M16 4h2a2 2 0 0 1 2 2v4",key:"3hqy98"}],["path",{d:"M21 14H11",key:"1bme5i"}],["path",{d:"m15 10-4 4 4 4",key:"5dvupr"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const kG=vn("ClipboardList",[["rect",{width:"8",height:"4",x:"8",y:"2",rx:"1",ry:"1",key:"tgr4d6"}],["path",{d:"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2",key:"116196"}],["path",{d:"M12 11h4",key:"1jrz19"}],["path",{d:"M12 16h4",key:"n85exb"}],["path",{d:"M8 11h.01",key:"1dfujw"}],["path",{d:"M8 16h.01",key:"18s6g9"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const dd=vn("Clock",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16 14",key:"68esgv"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ym=vn("Cloud",[["path",{d:"M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z",key:"p7xjir"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Mv=vn("Code",[["polyline",{points:"16 18 22 12 16 6",key:"z7tu5w"}],["polyline",{points:"8 6 2 12 8 18",key:"1eg1df"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Mw=vn("CopyPlus",[["line",{x1:"15",x2:"15",y1:"12",y2:"18",key:"1p7wdc"}],["line",{x1:"12",x2:"18",y1:"15",y2:"15",key:"1nscbv"}],["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Eh=vn("Copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const AG=vn("CornerRightDown",[["polyline",{points:"10 15 15 20 20 15",key:"axus6l"}],["path",{d:"M4 4h7a4 4 0 0 1 4 4v12",key:"wcbgct"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const MG=vn("CornerUpRight",[["polyline",{points:"15 14 20 9 15 4",key:"1tbx3s"}],["path",{d:"M4 20v-7a4 4 0 0 1 4-4h12",key:"1lu4f8"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const TG=vn("Cpu",[["rect",{width:"16",height:"16",x:"4",y:"4",rx:"2",key:"14l7u7"}],["rect",{width:"6",height:"6",x:"9",y:"9",rx:"1",key:"5aljv4"}],["path",{d:"M15 2v2",key:"13l42r"}],["path",{d:"M15 20v2",key:"15mkzm"}],["path",{d:"M2 15h2",key:"1gxd5l"}],["path",{d:"M2 9h2",key:"1bbxkp"}],["path",{d:"M20 15h2",key:"19e6y8"}],["path",{d:"M20 9h2",key:"19tzq7"}],["path",{d:"M9 2v2",key:"165o2o"}],["path",{d:"M9 20v2",key:"i2bqo8"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const RG=vn("Database",[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5",key:"1wlel7"}],["path",{d:"M3 12A9 3 0 0 0 21 12",key:"mv7ke4"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const mu=vn("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const gb=vn("Eraser",[["path",{d:"m7 21-4.3-4.3c-1-1-1-2.5 0-3.4l9.6-9.6c1-1 2.5-1 3.4 0l5.6 5.6c1 1 1 2.5 0 3.4L13 21",key:"182aya"}],["path",{d:"M22 21H7",key:"t4ddhn"}],["path",{d:"m5 11 9 9",key:"1mo9qw"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Tv=vn("ExternalLink",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const nm=vn("EyeOff",[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const cl=vn("Eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const PG=vn("FastForward",[["polygon",{points:"13 19 22 12 13 5 13 19",key:"587y9g"}],["polygon",{points:"2 19 11 12 2 5 2 19",key:"3pweh0"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const w2=vn("FileMusic",[["path",{d:"M10.5 22H18a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v8.4",key:"1d3kfm"}],["path",{d:"M8 18v-7.7L16 9v7",key:"1oie6o"}],["circle",{cx:"14",cy:"16",r:"2",key:"1bzzi3"}],["circle",{cx:"6",cy:"18",r:"2",key:"1fncim"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Vo=vn("FileText",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const OG=vn("FileUp",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M12 12v6",key:"3ahymv"}],["path",{d:"m15 15-3-3-3 3",key:"15xj92"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Mx=vn("Film",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M7 3v18",key:"bbkbws"}],["path",{d:"M3 7.5h4",key:"zfgn84"}],["path",{d:"M3 12h18",key:"1i2n21"}],["path",{d:"M3 16.5h4",key:"1230mu"}],["path",{d:"M17 3v18",key:"in4fa5"}],["path",{d:"M17 7.5h4",key:"myr1c1"}],["path",{d:"M17 16.5h4",key:"go4c1d"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const LG=vn("FlipHorizontal",[["path",{d:"M8 3H5a2 2 0 0 0-2 2v14c0 1.1.9 2 2 2h3",key:"1i73f7"}],["path",{d:"M16 3h3a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-3",key:"saxlbk"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"M12 14v2",key:"8jcxud"}],["path",{d:"M12 8v2",key:"1woqiv"}],["path",{d:"M12 2v2",key:"tus03m"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const BG=vn("FlipVertical",[["path",{d:"M21 8V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v3",key:"14bfxa"}],["path",{d:"M21 16v3a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-3",key:"14rx03"}],["path",{d:"M4 12H2",key:"rhcxmi"}],["path",{d:"M10 12H8",key:"s88cx1"}],["path",{d:"M16 12h-2",key:"10asgb"}],["path",{d:"M22 12h-2",key:"14jgyd"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Tx=vn("Focus",[["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}],["path",{d:"M3 7V5a2 2 0 0 1 2-2h2",key:"aa7l1z"}],["path",{d:"M17 3h2a2 2 0 0 1 2 2v2",key:"4qcy5o"}],["path",{d:"M21 17v2a2 2 0 0 1-2 2h-2",key:"6vwrx8"}],["path",{d:"M7 21H5a2 2 0 0 1-2-2v-2",key:"ioqczr"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Rv=vn("FolderDown",[["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}],["path",{d:"M12 10v6",key:"1bos4e"}],["path",{d:"m15 13-3 3-3-3",key:"6j2sf0"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ll=vn("FolderOpen",[["path",{d:"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2",key:"usdka0"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const UP=vn("FolderPlus",[["path",{d:"M12 10v6",key:"1bos4e"}],["path",{d:"M9 13h6",key:"1uhe8q"}],["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const pj=vn("FolderSync",[["path",{d:"M9 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v.5",key:"1dkoa9"}],["path",{d:"M12 10v4h4",key:"1czhmt"}],["path",{d:"m12 14 1.535-1.605a5 5 0 0 1 8 1.5",key:"lvuxfi"}],["path",{d:"M22 22v-4h-4",key:"1ewp4q"}],["path",{d:"m22 18-1.535 1.605a5 5 0 0 1-8-1.5",key:"14ync0"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const UG=vn("Folder",[["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const I5=vn("GitBranch",[["line",{x1:"6",x2:"6",y1:"3",y2:"15",key:"17qcm7"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["path",{d:"M18 9a9 9 0 0 1-9 9",key:"n2h4wq"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const FG=vn("GitCompare",[["circle",{cx:"18",cy:"18",r:"3",key:"1xkwt0"}],["circle",{cx:"6",cy:"6",r:"3",key:"1lh9wr"}],["path",{d:"M13 6h3a2 2 0 0 1 2 2v7",key:"1yeb86"}],["path",{d:"M11 18H8a2 2 0 0 1-2-2V9",key:"19pyzm"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const WG=vn("GitMerge",[["circle",{cx:"18",cy:"18",r:"3",key:"1xkwt0"}],["circle",{cx:"6",cy:"6",r:"3",key:"1lh9wr"}],["path",{d:"M6 21V9a9 9 0 0 0 9 9",key:"7kw0sc"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const DG=vn("Globe",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const gu=vn("Grid3x3",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M3 9h18",key:"1pudct"}],["path",{d:"M3 15h18",key:"5xshup"}],["path",{d:"M9 3v18",key:"fh3hqa"}],["path",{d:"M15 3v18",key:"14nvp0"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const VG=vn("GripHorizontal",[["circle",{cx:"12",cy:"9",r:"1",key:"124mty"}],["circle",{cx:"19",cy:"9",r:"1",key:"1ruzo2"}],["circle",{cx:"5",cy:"9",r:"1",key:"1a8b28"}],["circle",{cx:"12",cy:"15",r:"1",key:"1e56xg"}],["circle",{cx:"19",cy:"15",r:"1",key:"1a92ep"}],["circle",{cx:"5",cy:"15",r:"1",key:"5r1jwy"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const k5=vn("GripVertical",[["circle",{cx:"9",cy:"12",r:"1",key:"1vctgf"}],["circle",{cx:"9",cy:"5",r:"1",key:"hp0tcf"}],["circle",{cx:"9",cy:"19",r:"1",key:"fkjjf6"}],["circle",{cx:"15",cy:"12",r:"1",key:"1tmaij"}],["circle",{cx:"15",cy:"5",r:"1",key:"19l28e"}],["circle",{cx:"15",cy:"19",r:"1",key:"f4zoj3"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const hm=vn("HardDrive",[["line",{x1:"22",x2:"2",y1:"12",y2:"12",key:"1y58io"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}],["line",{x1:"6",x2:"6.01",y1:"16",y2:"16",key:"sgf278"}],["line",{x1:"10",x2:"10.01",y1:"16",y2:"16",key:"1l4acy"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const FP=vn("Hash",[["line",{x1:"4",x2:"20",y1:"9",y2:"9",key:"4lhtct"}],["line",{x1:"4",x2:"20",y1:"15",y2:"15",key:"vyu0kd"}],["line",{x1:"10",x2:"8",y1:"3",y2:"21",key:"1ggp8o"}],["line",{x1:"16",x2:"14",y1:"3",y2:"21",key:"weycgp"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const HG=vn("Heart",[["path",{d:"M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z",key:"c3ymky"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const GG=vn("Highlighter",[["path",{d:"m9 11-6 6v3h9l3-3",key:"1a3l36"}],["path",{d:"m22 12-4.6 4.6a2 2 0 0 1-2.8 0l-5.2-5.2a2 2 0 0 1 0-2.8L14 4",key:"14a9rk"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const t$=vn("History",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M12 7v5l4 2",key:"1fdv2h"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const qG=vn("ImageMinus",[["path",{d:"M21 9v10a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h7",key:"m87ecr"}],["line",{x1:"16",x2:"22",y1:"5",y2:"5",key:"ez7e4s"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Rp=vn("ImagePlus",[["path",{d:"M16 5h6",key:"1vod17"}],["path",{d:"M19 2v6",key:"4bpg5p"}],["path",{d:"M21 11.5V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h7.5",key:"1ue2ih"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const si=vn("Image",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const KG=vn("Info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const WP=vn("Key",[["path",{d:"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4",key:"g0fldk"}],["path",{d:"m21 2-9.6 9.6",key:"1j0ho8"}],["circle",{cx:"7.5",cy:"15.5",r:"5.5",key:"yqb3hr"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const DP=vn("Layers",[["path",{d:"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z",key:"zw3jo"}],["path",{d:"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12",key:"1wduqc"}],["path",{d:"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17",key:"kqbvx6"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ii=vn("LayoutGrid",[["rect",{width:"7",height:"7",x:"3",y:"3",rx:"1",key:"1g98yp"}],["rect",{width:"7",height:"7",x:"14",y:"3",rx:"1",key:"6d4xhi"}],["rect",{width:"7",height:"7",x:"14",y:"14",rx:"1",key:"nxv5o0"}],["rect",{width:"7",height:"7",x:"3",y:"14",rx:"1",key:"1bb6yr"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const XG=vn("Library",[["path",{d:"m16 6 4 14",key:"ji33uf"}],["path",{d:"M12 6v14",key:"1n7gus"}],["path",{d:"M8 8v12",key:"1gg7y9"}],["path",{d:"M4 4v16",key:"6qkkli"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const YG=vn("Lightbulb",[["path",{d:"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5",key:"1gvzjb"}],["path",{d:"M9 18h6",key:"x1upvd"}],["path",{d:"M10 22h4",key:"ceow96"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const JG=vn("Link2",[["path",{d:"M9 17H7A5 5 0 0 1 7 7h2",key:"8i5ue5"}],["path",{d:"M15 7h2a5 5 0 1 1 0 10h-2",key:"1b9ql8"}],["line",{x1:"8",x2:"16",y1:"12",y2:"12",key:"1jonct"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Bp=vn("Link",[["path",{d:"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71",key:"1cjeqo"}],["path",{d:"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71",key:"19qd67"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ZG=vn("List",[["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M3 18h.01",key:"1tta3j"}],["path",{d:"M3 6h.01",key:"1rqtza"}],["path",{d:"M8 12h13",key:"1za7za"}],["path",{d:"M8 18h13",key:"1lx6n3"}],["path",{d:"M8 6h13",key:"ik3vkj"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const zr=vn("LoaderCircle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const _2=vn("Loader",[["path",{d:"M12 2v4",key:"3427ic"}],["path",{d:"m16.2 7.8 2.9-2.9",key:"r700ao"}],["path",{d:"M18 12h4",key:"wj9ykh"}],["path",{d:"m16.2 16.2 2.9 2.9",key:"1bxg5t"}],["path",{d:"M12 18v4",key:"jadmvz"}],["path",{d:"m4.9 19.1 2.9-2.9",key:"bwix9q"}],["path",{d:"M2 12h4",key:"j09sii"}],["path",{d:"m4.9 4.9 2.9 2.9",key:"giyufr"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const QG=vn("LockOpen",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 9.9-1",key:"1mm8w8"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const eq=vn("Lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const tq=vn("Magnet",[["path",{d:"m6 15-4-4 6.75-6.77a7.79 7.79 0 0 1 11 11L13 22l-4-4 6.39-6.36a2.14 2.14 0 0 0-3-3L6 15",key:"1i3lhw"}],["path",{d:"m5 8 4 4",key:"j6kj7e"}],["path",{d:"m12 15 4 4",key:"lnac28"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const mx=vn("MapPin",[["path",{d:"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0",key:"1r0f0z"}],["circle",{cx:"12",cy:"10",r:"3",key:"ilqhr7"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const nq=vn("Map",[["path",{d:"M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z",key:"169xi5"}],["path",{d:"M15 5.764v15",key:"1pn4in"}],["path",{d:"M9 3.236v15",key:"1uimfh"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const jh=vn("Maximize2",[["polyline",{points:"15 3 21 3 21 9",key:"mznyad"}],["polyline",{points:"9 21 3 21 3 15",key:"1avn1i"}],["line",{x1:"21",x2:"14",y1:"3",y2:"10",key:"ota7mn"}],["line",{x1:"3",x2:"10",y1:"21",y2:"14",key:"1atl0r"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const rq=vn("Maximize",[["path",{d:"M8 3H5a2 2 0 0 0-2 2v3",key:"1dcmit"}],["path",{d:"M21 8V5a2 2 0 0 0-2-2h-3",key:"1e4gt3"}],["path",{d:"M3 16v3a2 2 0 0 0 2 2h3",key:"wsl5sc"}],["path",{d:"M16 21h3a2 2 0 0 0 2-2v-3",key:"18trek"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const fj=vn("Merge",[["path",{d:"m8 6 4-4 4 4",key:"ybng9g"}],["path",{d:"M12 2v10.3a4 4 0 0 1-1.172 2.872L4 22",key:"1hyw0i"}],["path",{d:"m20 22-5-5",key:"1m27yz"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const mj=vn("MessageCircle",[["path",{d:"M7.9 20A9 9 0 1 0 4 16.1L2 22Z",key:"vv11sd"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Wp=vn("MessageSquare",[["path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z",key:"1lielz"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const rf=vn("Minimize2",[["polyline",{points:"4 14 10 14 10 20",key:"11kfnr"}],["polyline",{points:"20 10 14 10 14 4",key:"rlmsce"}],["line",{x1:"14",x2:"21",y1:"10",y2:"3",key:"o5lafz"}],["line",{x1:"3",x2:"10",y1:"21",y2:"14",key:"1atl0r"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const x1=vn("Minus",[["path",{d:"M5 12h14",key:"1ays0h"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const sq=vn("Moon",[["path",{d:"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z",key:"a7tn18"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const A5=vn("MousePointer2",[["path",{d:"M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z",key:"edeuup"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const iq=vn("Move3d",[["path",{d:"M5 3v16h16",key:"1mqmf9"}],["path",{d:"m5 19 6-6",key:"jh6hbb"}],["path",{d:"m2 6 3-3 3 3",key:"tkyvxa"}],["path",{d:"m18 16 3 3-3 3",key:"1d4glt"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const aq=vn("MoveHorizontal",[["path",{d:"m18 8 4 4-4 4",key:"1ak13k"}],["path",{d:"M2 12h20",key:"9i4pu4"}],["path",{d:"m6 8-4 4 4 4",key:"15zrgr"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const oq=vn("MoveLeft",[["path",{d:"M6 8L2 12L6 16",key:"kyvwex"}],["path",{d:"M2 12H22",key:"1m8cig"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const lq=vn("MoveRight",[["path",{d:"M18 8L22 12L18 16",key:"1r0oui"}],["path",{d:"M2 12H22",key:"1m8cig"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const $c=vn("Music",[["path",{d:"M9 18V5l12-2v13",key:"1jmyc2"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["circle",{cx:"18",cy:"16",r:"3",key:"1hluhg"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const cq=vn("Navigation2",[["polygon",{points:"12 2 19 21 12 17 5 21 12 2",key:"x8c0qg"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const uq=vn("Navigation",[["polygon",{points:"3 11 22 2 13 21 11 13 3 11",key:"1ltx0t"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const z2=vn("Package",[["path",{d:"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z",key:"1a0edw"}],["path",{d:"M12 22V12",key:"d0xqtd"}],["path",{d:"m3.3 7 7.703 4.734a2 2 0 0 0 1.994 0L20.7 7",key:"yx3hmr"}],["path",{d:"m7.5 4.27 9 5.15",key:"1c824w"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const dq=vn("Paintbrush",[["path",{d:"m14.622 17.897-10.68-2.913",key:"vj2p1u"}],["path",{d:"M18.376 2.622a1 1 0 1 1 3.002 3.002L17.36 9.643a.5.5 0 0 0 0 .707l.944.944a2.41 2.41 0 0 1 0 3.408l-.944.944a.5.5 0 0 1-.707 0L8.354 7.348a.5.5 0 0 1 0-.707l.944-.944a2.41 2.41 0 0 1 3.408 0l.944.944a.5.5 0 0 0 .707 0z",key:"18tc5c"}],["path",{d:"M9 8c-1.804 2.71-3.97 3.46-6.583 3.948a.507.507 0 0 0-.302.819l7.32 8.883a1 1 0 0 0 1.185.204C12.735 20.405 16 16.792 16 15",key:"ytzfxy"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const zh=vn("Palette",[["circle",{cx:"13.5",cy:"6.5",r:".5",fill:"currentColor",key:"1okk4w"}],["circle",{cx:"17.5",cy:"10.5",r:".5",fill:"currentColor",key:"f64h9f"}],["circle",{cx:"8.5",cy:"7.5",r:".5",fill:"currentColor",key:"fotxhn"}],["circle",{cx:"6.5",cy:"12.5",r:".5",fill:"currentColor",key:"qy21gx"}],["path",{d:"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.554C21.965 6.012 17.461 2 12 2z",key:"12rzf8"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Tw=vn("PanelTopOpen",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M3 9h18",key:"1pudct"}],["path",{d:"m15 14-3 3-3-3",key:"g215vf"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const gj=vn("PanelsTopLeft",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M3 9h18",key:"1pudct"}],["path",{d:"M9 21V9",key:"1oto5p"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const hq=vn("Paperclip",[["path",{d:"M13.234 20.252 21 12.3",key:"1cbrk9"}],["path",{d:"m16 6-8.414 8.586a2 2 0 0 0 0 2.828 2 2 0 0 0 2.828 0l8.414-8.586a4 4 0 0 0 0-5.656 4 4 0 0 0-5.656 0l-8.415 8.585a6 6 0 1 0 8.486 8.486",key:"1pkts6"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Rw=vn("Pause",[["rect",{x:"14",y:"4",width:"4",height:"16",rx:"1",key:"zuxfzm"}],["rect",{x:"6",y:"4",width:"4",height:"16",rx:"1",key:"1okwgv"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const M5=vn("PenLine",[["path",{d:"M12 20h9",key:"t2du7b"}],["path",{d:"M16.376 3.622a1 1 0 0 1 3.002 3.002L7.368 18.635a2 2 0 0 1-.855.506l-2.872.838a.5.5 0 0 1-.62-.62l.838-2.872a2 2 0 0 1 .506-.854z",key:"1ykcvy"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const T5=vn("PenTool",[["path",{d:"M15.707 21.293a1 1 0 0 1-1.414 0l-1.586-1.586a1 1 0 0 1 0-1.414l5.586-5.586a1 1 0 0 1 1.414 0l1.586 1.586a1 1 0 0 1 0 1.414z",key:"nt11vn"}],["path",{d:"m18 13-1.375-6.874a1 1 0 0 0-.746-.776L3.235 2.028a1 1 0 0 0-1.207 1.207L5.35 15.879a1 1 0 0 0 .776.746L13 18",key:"15qc1e"}],["path",{d:"m2.3 2.3 7.286 7.286",key:"1wuzzi"}],["circle",{cx:"11",cy:"11",r:"2",key:"xmgehs"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const R5=vn("Pen",[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const vm=vn("Pencil",[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const pq=vn("Plane",[["path",{d:"M17.8 19.2 16 11l3.5-3.5C21 6 21.5 4 21 3c-1-.5-3 0-4.5 1.5L13 8 4.8 6.2c-.5-.1-.9.1-1.1.5l-.3.5c-.2.5-.1 1 .3 1.3L9 12l-2 3H4l-1 1 3 2 2 3 1-1v-3l3-2 3.5 5.3c.3.4.8.5 1.3.3l.5-.2c.4-.3.6-.7.5-1.2z",key:"1v9wt8"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ia=vn("Play",[["polygon",{points:"6 3 20 12 6 21 6 3",key:"1oa8hb"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Xi=vn("Plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const fq=vn("RefreshCcw",[["path",{d:"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"14sxne"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16",key:"1hlbsb"}],["path",{d:"M16 16h5v5",key:"ccwih5"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ch=vn("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const mq=vn("Rewind",[["polygon",{points:"11 19 2 12 11 5 11 19",key:"14yba5"}],["polygon",{points:"22 19 13 12 22 5 22 19",key:"1pi1cj"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const P5=vn("RotateCcw",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Rx=vn("RotateCw",[["path",{d:"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8",key:"1p45f6"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const xu=vn("Save",[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z",key:"1c8476"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7",key:"1ydtos"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7",key:"t51u73"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ml=vn("Scissors",[["circle",{cx:"6",cy:"6",r:"3",key:"1lh9wr"}],["path",{d:"M8.12 8.12 12 12",key:"1alkpv"}],["path",{d:"M20 4 8.12 15.88",key:"xgtan2"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["path",{d:"M14.8 14.8 20 20",key:"ptml3r"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Pv=vn("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Lo=vn("Send",[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const gq=vn("Settings2",[["path",{d:"M20 7h-9",key:"3s1dr2"}],["path",{d:"M14 17H5",key:"gfn3mx"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}],["circle",{cx:"7",cy:"7",r:"3",key:"dfmy0x"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ov=vn("Settings",[["path",{d:"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z",key:"1qme2f"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const n$=vn("SlidersHorizontal",[["line",{x1:"21",x2:"14",y1:"4",y2:"4",key:"obuewd"}],["line",{x1:"10",x2:"3",y1:"4",y2:"4",key:"1q6298"}],["line",{x1:"21",x2:"12",y1:"12",y2:"12",key:"1iu8h1"}],["line",{x1:"8",x2:"3",y1:"12",y2:"12",key:"ntss68"}],["line",{x1:"21",x2:"16",y1:"20",y2:"20",key:"14d8ph"}],["line",{x1:"12",x2:"3",y1:"20",y2:"20",key:"m0wm8r"}],["line",{x1:"14",x2:"14",y1:"2",y2:"6",key:"14e1ph"}],["line",{x1:"8",x2:"8",y1:"10",y2:"14",key:"1i6ji0"}],["line",{x1:"16",x2:"16",y1:"18",y2:"22",key:"1lctlv"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const xq=vn("Smartphone",[["rect",{width:"14",height:"20",x:"5",y:"2",rx:"2",ry:"2",key:"1yt0o3"}],["path",{d:"M12 18h.01",key:"mhygvu"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const xj=vn("Space",[["path",{d:"M22 17v1c0 .5-.5 1-1 1H3c-.5 0-1-.5-1-1v-1",key:"lt2kga"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const bc=vn("Sparkles",[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const VP=vn("SquareArrowRight",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M8 12h8",key:"1wcyev"}],["path",{d:"m12 16 4-4-4-4",key:"1i9zcv"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const bj=vn("SquarePen",[["path",{d:"M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7",key:"1m0v6g"}],["path",{d:"M18.375 2.625a1 1 0 0 1 3 3l-9.013 9.014a2 2 0 0 1-.853.505l-2.873.84a.5.5 0 0 1-.62-.62l.84-2.873a2 2 0 0 1 .506-.852z",key:"ohrbg2"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const yj=vn("SquareSplitHorizontal",[["path",{d:"M8 19H5c-1 0-2-1-2-2V7c0-1 1-2 2-2h3",key:"lubmu8"}],["path",{d:"M16 5h3c1 0 2 1 2 2v10c0 1-1 2-2 2h-3",key:"1ag34g"}],["line",{x1:"12",x2:"12",y1:"4",y2:"20",key:"1tx1rr"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ih=vn("Square",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const vj=vn("Star",[["path",{d:"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",key:"r04s7s"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const HP=vn("Sun",[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Pw=vn("Table",[["path",{d:"M12 3v18",key:"108xh3"}],["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M3 9h18",key:"1pudct"}],["path",{d:"M3 15h18",key:"5xshup"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const bq=vn("Target",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["circle",{cx:"12",cy:"12",r:"6",key:"1vlfrh"}],["circle",{cx:"12",cy:"12",r:"2",key:"1c9p78"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const yq=vn("Timer",[["line",{x1:"10",x2:"14",y1:"2",y2:"2",key:"14vaq8"}],["line",{x1:"12",x2:"15",y1:"14",y2:"11",key:"17fdiu"}],["circle",{cx:"12",cy:"14",r:"8",key:"1e1u0o"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Zi=vn("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const vq=vn("TrendingDown",[["polyline",{points:"22 17 13.5 8.5 8.5 13.5 2 7",key:"1r2t7k"}],["polyline",{points:"16 17 22 17 22 11",key:"11uiuu"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const wq=vn("TrendingUp",[["polyline",{points:"22 7 13.5 15.5 8.5 10.5 2 17",key:"126l90"}],["polyline",{points:"16 7 22 7 22 13",key:"kwv8wd"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const wj=vn("TriangleAlert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Lv=vn("Type",[["polyline",{points:"4 7 4 4 20 4 20 7",key:"1nosan"}],["line",{x1:"9",x2:"15",y1:"20",y2:"20",key:"swin9y"}],["line",{x1:"12",x2:"12",y1:"4",y2:"20",key:"1tx1rr"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ou=vn("Upload",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"17 8 12 3 7 8",key:"t8dd8p"}],["line",{x1:"12",x2:"12",y1:"3",y2:"15",key:"widbto"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const hd=vn("User",[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const _q=vn("Users",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["path",{d:"M16 3.13a4 4 0 0 1 0 7.75",key:"1da9ce"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const aa=vn("Video",[["path",{d:"m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5",key:"ftymec"}],["rect",{x:"2",y:"6",width:"14",height:"12",rx:"2",key:"158x01"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const zq=vn("Volume2",[["path",{d:"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z",key:"uqj9uw"}],["path",{d:"M16 9a5 5 0 0 1 0 6",key:"1q6k2b"}],["path",{d:"M19.364 18.364a9 9 0 0 0 0-12.728",key:"ijwkga"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Up=vn("WandSparkles",[["path",{d:"m21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72",key:"ul74o6"}],["path",{d:"m14 7 3 3",key:"1r5n42"}],["path",{d:"M5 6v4",key:"ilb8ba"}],["path",{d:"M19 14v4",key:"blhpug"}],["path",{d:"M10 2v2",key:"7u0qdc"}],["path",{d:"M7 8H3",key:"zfb6yr"}],["path",{d:"M21 16h-4",key:"1cnmox"}],["path",{d:"M11 3H9",key:"1obp7u"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ow=vn("Workflow",[["rect",{width:"8",height:"8",x:"3",y:"3",rx:"2",key:"by2w9f"}],["path",{d:"M7 11v4a2 2 0 0 0 2 2h4",key:"xkn7yn"}],["rect",{width:"8",height:"8",x:"13",y:"13",rx:"2",key:"1cgmvn"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Qr=vn("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const O5=vn("Zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Lw=vn("ZoomIn",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"11",x2:"11",y1:"8",y2:"14",key:"1vmskp"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const GP=vn("ZoomOut",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]]),lu=[{id:"arri-alexa-35",name:"阿莱 Alexa 35",image:"arri-alexa-35-hW6-4chH.webp",prompt:"shot on Arri Alexa 35, legendary color science, organic highlights"},{id:"arricam-lt",name:"Arricam LT",image:"arricam-lt-DEzXr_FR.webp",prompt:"shot on Arricam LT, 35mm movie film, authentic cinema texture"},{id:"arriflex-435",name:"阿莱 435",image:"arriflex-435-DqI5jc3N.webp",prompt:"shot on Arriflex 435, high-speed cinematography, sharp grain"},{id:"imax-keighley",name:"IMAX Keighley",image:"imax-keighley-Cu9FJnlP.webp",prompt:"shot on IMAX Keighley camera, ultra-large format, extreme immersion"},{id:"panavision-dxl2",name:"潘那维申 DXL2",image:"panavision-dxl2-nu2CVKjg .webp",prompt:"shot on Panavision Millennium DXL2, 8K large format, cinematic depth"},{id:"red-v-raptor",name:"RED 猛禽",image:"red-v-raptor-DOT1sij6.webp",prompt:"shot on Red V-Raptor, 8K raw texture, high dynamic range"},{id:"sony-venice",name:"索尼 威尼斯",image:"sony-venice-BgicSddP.webp",prompt:"shot on Sony Venice, filmic skin tones, rich shadow detail"},{id:"imax-film",name:"IMAX 胶片机",image:"IMAX Film Camera.webp",prompt:"shot on 70mm IMAX film camera, massive scale, detailed grain"},{id:"arriflex-16sr",name:"阿莱 16SR",image:"Arriflex 16SR.webp",prompt:"shot on 16mm Arriflex 16SR, vintage film grain, 16mm look"},{id:"arri-alexa-65",name:"阿莱 Alexa 65",image:"Alexa 65.webp",prompt:"shot on Arri Alexa 65, crystal clear optics, high dynamic range, stunning highlights roll-off, professional color grading, 8K resolution"}],cu=[{id:"lensbaby",name:"Lensbaby",image:"Lensbaby.webp",prompt:"Lensbaby lens, selective focus, dreamy blur, creative tilt-shift",characteristics:"移轴虚化、梦幻焦点"},{id:"hawk-v-lite",name:"Hawk V-Lite",image:"Hawk V-Lite.webp",prompt:"Hawk V-Lite anamorphic lens, blue streak flares, oval bokeh, cinematic widescreen",characteristics:"电影宽幅、椭圆光斑"},{id:"hawk-class-x",name:"Hawk Class X",image:"hawk-class-x-CD3GvtF4.webp",prompt:"Hawk Class X anamorphic lens, vintage anamorphic character, soft flares",characteristics:"经典变形、柔和炫光"},{id:"laowa-macro",name:"老蛙 宏观",image:"Laowa Macro.webp",prompt:"Laowa Macro lens, extreme close-up detail, razor-sharp focus",characteristics:"极限微距、细节纹理"},{id:"canon-k35",name:"佳能 K-35",image:"canon-k35-BhokCUBz.webp",prompt:"vintage Canon K-35 lens, soft flares, 70s cinematic glow, warm highlights",characteristics:"复古柔光、暖调光晕"},{id:"jdc-xtal",name:"JDC 变形镜头",image:"JDC Xtal Xpress.webp",prompt:"JDC Xtal Xpress anamorphic, vintage anamorphic texture, artistic flares",characteristics:"经典变形、艺术炫光"},{id:"arri-signature",name:"阿莱 签名定焦",image:"arri-signature-prime-ZwjUyRcz.webp",prompt:"ARRI Signature Prime lens, natural bokeh, creamy fall-off, cinema-grade clarity",characteristics:"顶级通透、纯净质感"},{id:"cooke-s4",name:"库克 S4",image:"cooke-s4-BKM_5Nte.webp",prompt:'"Cooke Look", warm skin tones, smooth organic texture',characteristics:"温暖肤色、有机质感"},{id:"cooke-sf-18x",name:"库克 SF 18x",image:"cooke-sf-18x-BegGlnlc.webp",prompt:"Cooke SF 18x zoom lens, cinematic zoom character, smooth focus breathing",characteristics:"电影变焦、呼吸感"},{id:"cooke-speed-panchro",name:"库克 Speed Panchro",image:"cooke-speed-panchro-jWogQ6i5.webp",prompt:"Cooke Speed Panchro vintage lens, classic Hollywood look, soft bokeh",characteristics:"复古库克、经典好莱坞"},{id:"petzval",name:"佩兹瓦尔",image:"Petzval.webp",prompt:"Petzval lens, swirly bokeh, sharp center focus",characteristics:"旋转焦外、中心锐利"},{id:"helios",name:"八羽怪",image:"helios-CWg35ubk.webp",prompt:"Helios 44-2 lens, distinctive swirly bokeh, vintage character",characteristics:"俄产老镜、独特旋焦"},{id:"zeiss-ultra",name:"蔡司 Ultra Prime",image:"zeiss-ultra-prime-DdBHzrBr.webp",prompt:"Zeiss Ultra Prime lens, high contrast, clinical sharpness",characteristics:"手术刀般的锐利清晰"},{id:"panavision-c",name:"潘那维申 C系列",image:"panavision-c-series-LLl1Xpct.webp",prompt:"Panavision C-Series anamorphic, classic blue flares",characteristics:"好莱坞经典蓝炫光"},{id:"panavision-primo",name:"潘那维申 Primo",image:"panavision-primo-Cui4J6lP.webp",prompt:"Panavision Primo lens, high color saturation, iconic sharpness",characteristics:"高饱和、标志性锐利"}],uu=[{id:"fl-8",value:8,name:"超广角",prompt:"ultra-wide angle, expansive perspective"},{id:"fl-14",value:14,name:"超广角",prompt:"ultra-wide angle, expansive perspective"},{id:"fl-24",value:24,name:"叙事广角",prompt:"wide angle, storytelling environment"},{id:"fl-35",value:35,name:"叙事广角",prompt:"wide angle, storytelling environment"},{id:"fl-50",value:50,name:"标准镜头",prompt:"standard lens, human eye perspective"},{id:"fl-85",value:85,name:"肖像长焦",prompt:"telephoto, shallow depth of field, creamy bokeh"},{id:"fl-135",value:135,name:"肖像长焦",prompt:"telephoto, shallow depth of field, creamy bokeh"}],du=[{id:"f1.4",value:"f/1.4",image:"f1_4-DoQLC9Jc.webp",name:"大光圈",prompt:"f/1.4 aperture, extremely shallow depth of field, creamy bokeh, subject isolation, dreamy background blur"},{id:"f4",value:"f/4",image:"f4-Or-YmP2I.webp",name:"中光圈",prompt:"f/4 aperture, balanced depth of field, moderate bokeh, natural subject separation"},{id:"f11",value:"f/11",image:"f-11.webp",name:"小光圈",prompt:"f/11 aperture, deep depth of field, sharp foreground and background, landscape clarity"}],wm=e=>{const t=[],n=lu.find(o=>o.id===e.cameraId),r=cu.find(o=>o.id===e.lensId),i=uu.find(o=>o.id===e.focalLengthId),a=du.find(o=>o.id===e.apertureId);return n&&t.push(n.prompt),r&&t.push(r.prompt),i&&t.push(`${i.value}mm, ${i.prompt}`),a&&t.push(a.prompt),t.join(", ")},$q=({isOpen:e,onClose:t,isDark:n,cinemaConfig:r,onConfigChange:i})=>{if(!e)return null;const a=lu.find(f=>f.id===r.cameraId),o=cu.find(f=>f.id===r.lensId),l=uu.find(f=>f.id===r.focalLengthId),c=du.find(f=>f.id===r.apertureId),u=f=>{i({...r,cameraId:r.cameraId===f?null:f})},d=f=>{i({...r,lensId:r.lensId===f?null:f})},h=f=>{i({...r,focalLengthId:r.focalLengthId===f?null:f})},p=f=>{i({...r,apertureId:r.apertureId===f?null:f})};return s.jsxs("div",{className:"fixed inset-0 z-50 flex items-center justify-center",children:[s.jsx("div",{className:"absolute inset-0 bg-black/60 backdrop-blur-sm",onClick:t}),s.jsxs("div",{className:"relative w-[800px] max-h-[85vh] bg-zinc-900/95 backdrop-blur-xl rounded-2xl border border-zinc-700/50 shadow-2xl overflow-hidden flex flex-col",children:[s.jsxs("div",{className:"flex items-center justify-between p-4 border-b border-zinc-700/50",children:[s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx(Ya,{size:20,className:"text-blue-400"}),s.jsx("span",{className:"text-white font-medium text-lg",children:"专业摄像机配置"})]}),s.jsx("button",{onClick:t,className:"p-1.5 rounded-lg hover:bg-zinc-700/50 text-zinc-400 hover:text-white transition-colors",children:s.jsx(Qr,{size:18})})]}),s.jsx("div",{className:"px-4 py-3 bg-zinc-800/50 border-b border-zinc-700/30",children:s.jsxs("div",{className:"flex items-center gap-4 text-sm",children:[s.jsx("span",{className:"text-zinc-500",children:"当前配置:"}),s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsxs("div",{className:"flex items-center gap-1.5",children:[s.jsx(Ya,{size:14,className:"text-blue-400"}),s.jsx("span",{className:a?"text-white":"text-zinc-500",children:(a==null?void 0:a.name)||"未选择"})]}),s.jsx("span",{className:"text-zinc-600",children:"+"}),s.jsxs("div",{className:"flex items-center gap-1.5",children:[s.jsx(Yd,{size:14,className:"text-purple-400"}),s.jsx("span",{className:o?"text-white":"text-zinc-500",children:(o==null?void 0:o.name)||"未选择"})]}),s.jsx("span",{className:"text-zinc-600",children:"+"}),s.jsxs("div",{className:"flex items-center gap-1.5",children:[s.jsx(Tx,{size:14,className:"text-green-400"}),s.jsx("span",{className:l?"text-white":"text-zinc-500",children:l?`${l.value}mm`:"未选择"})]}),s.jsx("span",{className:"text-zinc-600",children:"+"}),s.jsxs("div",{className:"flex items-center gap-1.5",children:[s.jsx(Yd,{size:14,className:"text-orange-400"}),s.jsx("span",{className:c?"text-white":"text-zinc-500",children:(c==null?void 0:c.value)||"未选择"})]})]})]})}),s.jsxs("div",{className:"flex-1 overflow-y-auto p-4 space-y-6",children:[s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[s.jsx(Ya,{size:16,className:"text-blue-400"}),s.jsx("span",{className:"text-white font-medium",children:"摄像机"}),s.jsxs("span",{className:"text-zinc-500 text-xs",children:["(",lu.length,"款)"]})]}),s.jsx("div",{className:"flex gap-3 overflow-x-auto pb-2 scrollbar-thin scrollbar-thumb-zinc-700 scrollbar-track-transparent",children:lu.map(f=>s.jsxs("div",{onClick:()=>u(f.id),className:`flex-shrink-0 w-32 cursor-pointer rounded-xl overflow-hidden border-2 transition-all duration-200 ${r.cameraId===f.id?"border-blue-500 ring-2 ring-blue-500/30 scale-105":"border-zinc-700/50 hover:border-zinc-600"}`,children:[s.jsx("div",{className:"w-32 h-32 bg-zinc-800 flex items-center justify-center overflow-hidden",children:s.jsx("img",{src:`/cinema/${f.image}`,alt:f.name,className:"w-full h-full object-cover",onError:b=>{b.target.style.display="none"}})}),s.jsx("div",{className:"p-2 bg-zinc-800/80 text-center",children:s.jsx("span",{className:"text-white text-sm font-medium",children:f.name})})]},f.id))})]}),s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[s.jsx(Yd,{size:16,className:"text-purple-400"}),s.jsx("span",{className:"text-white font-medium",children:"镜头"}),s.jsxs("span",{className:"text-zinc-500 text-xs",children:["(",cu.length,"款)"]})]}),s.jsx("div",{className:"flex gap-3 overflow-x-auto pb-2 scrollbar-thin scrollbar-thumb-zinc-700 scrollbar-track-transparent",children:cu.map(f=>s.jsxs("div",{onClick:()=>d(f.id),className:`flex-shrink-0 w-28 cursor-pointer rounded-xl overflow-hidden border-2 transition-all duration-200 ${r.lensId===f.id?"border-purple-500 ring-2 ring-purple-500/30 scale-105":"border-zinc-700/50 hover:border-zinc-600"}`,children:[s.jsx("div",{className:"w-28 h-28 bg-zinc-800 flex items-center justify-center overflow-hidden",children:s.jsx("img",{src:`/cinema/${f.image}`,alt:f.name,className:"w-full h-full object-cover",onError:b=>{b.target.style.display="none"}})}),s.jsxs("div",{className:"p-2 bg-zinc-800/80 text-center",children:[s.jsx("span",{className:"text-white text-xs font-medium block",children:f.name}),s.jsx("span",{className:"text-zinc-400 text-[10px] block mt-0.5",children:f.characteristics})]})]},f.id))})]}),s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[s.jsx(Tx,{size:16,className:"text-green-400"}),s.jsx("span",{className:"text-white font-medium",children:"焦段"}),s.jsxs("span",{className:"text-zinc-500 text-xs",children:["(",uu.length,"个)"]})]}),s.jsx("div",{className:"flex gap-3 overflow-x-auto pb-2 scrollbar-thin scrollbar-thumb-zinc-700 scrollbar-track-transparent",children:uu.map(f=>s.jsxs("div",{onClick:()=>h(f.id),className:`flex-shrink-0 w-20 h-20 cursor-pointer rounded-xl border-2 transition-all duration-200 flex flex-col items-center justify-center ${r.focalLengthId===f.id?"border-green-500 ring-2 ring-green-500/30 bg-green-500/10 scale-105":"border-zinc-700/50 hover:border-zinc-600 bg-zinc-800/50"}`,children:[s.jsx("span",{className:`text-2xl font-bold ${r.focalLengthId===f.id?"text-green-400":"text-white"}`,children:f.value}),s.jsx("span",{className:"text-zinc-500 text-xs",children:"mm"}),s.jsx("span",{className:"text-zinc-400 text-[10px] mt-1",children:f.name})]},f.id))})]}),s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[s.jsx(Yd,{size:16,className:"text-orange-400"}),s.jsx("span",{className:"text-white font-medium",children:"光圈"}),s.jsxs("span",{className:"text-zinc-500 text-xs",children:["(",du.length,"个)"]})]}),s.jsx("div",{className:"flex gap-3 overflow-x-auto pb-2 scrollbar-thin scrollbar-thumb-zinc-700 scrollbar-track-transparent",children:du.map(f=>s.jsxs("div",{onClick:()=>p(f.id),className:`flex-shrink-0 w-32 cursor-pointer rounded-xl overflow-hidden border-2 transition-all duration-200 ${r.apertureId===f.id?"border-orange-500 ring-2 ring-orange-500/30 scale-105":"border-zinc-700/50 hover:border-zinc-600"}`,children:[s.jsx("div",{className:"w-32 h-32 bg-zinc-800 flex items-center justify-center overflow-hidden",children:s.jsx("img",{src:`/cinema/${f.image}`,alt:f.value,className:"w-full h-full object-cover",onError:b=>{b.target.style.display="none"}})}),s.jsxs("div",{className:"p-2 bg-zinc-800/80 text-center",children:[s.jsx("span",{className:"text-white text-sm font-medium block",children:f.value}),s.jsx("span",{className:"text-zinc-400 text-[10px] block mt-0.5",children:f.name})]})]},f.id))})]}),(r.cameraId||r.lensId||r.focalLengthId||r.apertureId)&&s.jsxs("div",{className:"mt-4 p-3 bg-zinc-800/50 rounded-xl border border-zinc-700/30",children:[s.jsx("div",{className:"text-zinc-400 text-xs mb-2",children:"生成的提示词补充:"}),s.jsx("div",{className:"text-blue-300 text-sm font-mono",children:wm(r)})]})]}),s.jsxs("div",{className:"p-4 border-t border-zinc-700/50 flex justify-between items-center",children:[s.jsx("button",{onClick:()=>i({cameraId:null,lensId:null,focalLengthId:null,apertureId:null}),className:"px-4 py-2 text-sm text-zinc-400 hover:text-white transition-colors",children:"清空选择"}),s.jsx("button",{onClick:t,className:"px-6 py-2 bg-blue-600 hover:bg-blue-500 text-white text-sm font-medium rounded-lg transition-colors",children:"确认应用"})]})]})]})};_.memo($q);const Px=[{id:"static",name:"定",nameEn:"Static",icon:"pause",prompt:"stable static shot, no camera movement, fixed frame"},{id:"dolly-in",name:"推",nameEn:"Dolly In",icon:"move-right",prompt:"dolly in, camera moving closer to subject, dynamic push-in"},{id:"dolly-out",name:"拉",nameEn:"Dolly Out",icon:"move-left",prompt:"dolly out, camera pulling back, expanding perspective"},{id:"pan",name:"摇",nameEn:"Pan",icon:"rotate-cw",prompt:"smooth horizontal panning shot, rotating on X-axis"},{id:"truck",name:"移",nameEn:"Truck",icon:"move-horizontal",prompt:"lateral trucking shot, side-to-side tracking movement"},{id:"follow",name:"跟",nameEn:"Follow",icon:"user",prompt:"tracking shot, following the subject from behind or side"},{id:"orbit",name:"绕",nameEn:"Orbit",icon:"circle",prompt:"360-degree orbital shot, camera circling the subject"},{id:"whip-pan",name:"甩",nameEn:"Whip Pan",icon:"zap",prompt:"rapid whip pan, motion blur during transition"},{id:"crash",name:"冲",nameEn:"Crash Zoom",icon:"target",prompt:"fast crash zoom, sudden dramatic focal length change"}],Ox=[{id:"forward",name:"向前",nameEn:"Forward",icon:"arrow-right",prompt:"moving forward, retreating backward"},{id:"backward",name:"向后",nameEn:"Backward",icon:"arrow-left",prompt:"retreating backward"},{id:"left",name:"向左",nameEn:"Left",icon:"arrow-left",prompt:"sliding left"},{id:"right",name:"向右",nameEn:"Right",icon:"arrow-right",prompt:"sliding right"},{id:"up",name:"向上",nameEn:"Up",icon:"arrow-up",prompt:"boom up, ascending"},{id:"down",name:"向下",nameEn:"Down",icon:"arrow-down",prompt:"boom down, descending"}],Lx=[{id:"eye-level",name:"平视",nameEn:"Eye Level",icon:"eye",prompt:"eye-level shot, neutral perspective"},{id:"low-angle",name:"低昂",nameEn:"Low Angle",icon:"trending-up",prompt:"low angle shot, heroic perspective, looking up"},{id:"high-angle",name:"高俯",nameEn:"High Angle",icon:"trending-down",prompt:"high angle shot, looking down at the subject"},{id:"overhead",name:"上帝视角",nameEn:"Overhead",icon:"maximize",prompt:"top-down shot, overhead view, vertical down angle"},{id:"birds-eye",name:"鸟瞰",nameEn:"Bird's Eye",icon:"navigation",prompt:"bird's eye view, high altitude aerial perspective"},{id:"pov",name:"POV",nameEn:"POV",icon:"user",prompt:"first-person perspective, subjective camera, POV"},{id:"dutch",name:"荷兰角",nameEn:"Dutch Angle",icon:"rotate-ccw",prompt:"dutch angle, canted frame, tilted horizon line"}],Bx=[{id:"fast",name:"快速",nameEn:"Fast",icon:"fast-forward",prompt:"cinematic fast motion"},{id:"slow",name:"慢速",nameEn:"Slow",icon:"rewind",prompt:"slow gentle camera drift"},{id:"turn-30",name:"30°",nameEn:"Subtle",icon:"corner-up-right",prompt:"subtle 30-degree turn"},{id:"turn-90",name:"90°",nameEn:"Quarter",icon:"corner-right-down",prompt:"90-degree quarter turn"},{id:"turn-180",name:"180°",nameEn:"Half",icon:"refresh-cw",prompt:"180-degree half rotation"},{id:"turn-360",name:"360°",nameEn:"Full",icon:"rotate-cw",prompt:"full 360-degree circular rotation"}],Ux=[{id:"one-point",name:"单点透视",nameEn:"One-point",icon:"box",prompt:"one-point perspective, symmetrical composition, Kubrick style"},{id:"dolly-zoom",name:"希区柯克变焦",nameEn:"Dolly Zoom",icon:"maximize-2",prompt:"Hitchcock zoom, vertigo effect, simultaneous track and zoom"},{id:"snap-zoom",name:"昆汀快速变焦",nameEn:"Snap Zoom",icon:"zoom-in",prompt:"snap zoom, sudden rapid zoom-in on subject"},{id:"inception",name:"盗梦空间旋转",nameEn:"Inception",icon:"refresh-ccw",prompt:"inception style roll, 360-degree barrel roll, rotating frame"},{id:"bullet-time",name:"子弹时间",nameEn:"Bullet Time",icon:"clock",prompt:"bullet time, frozen time, rotating around still subject"},{id:"slow-motion",name:"升格慢动作",nameEn:"Slow Motion",icon:"clock",prompt:"cinematic slow motion, high frame rate, overcranked"}],Fx=[{id:"fpv-drone",name:"FPV穿越机",nameEn:"FPV Drone",icon:"navigation-2",prompt:"FPV drone shot, fast low-altitude agile flight"},{id:"aerial",name:"航拍",nameEn:"Aerial",icon:"plane",prompt:"wide aerial drone shot, high altitude sweeping view"},{id:"handheld",name:"手持运镜",nameEn:"Handheld",icon:"smartphone",prompt:"handheld movement, organic camera shake, raw texture"},{id:"crane",name:"摇臂",nameEn:"Crane",icon:"git-branch",prompt:"jib/crane shot, smooth vertical and sweeping movement"},{id:"robot-arm",name:"机械臂",nameEn:"Robot Arm",icon:"cpu",prompt:"robot arm shot, precise mechanical movement"},{id:"action-cam",name:"运动相机",nameEn:"Action Cam",icon:"video",prompt:"GoPro style, wide-angle distortion, action-cam aesthetic"}],Sy=e=>{const t=[],n=Px.find(c=>c.id===e.movementId),r=Ox.find(c=>c.id===e.directionId),i=Lx.find(c=>c.id===e.angleId),a=Bx.find(c=>c.id===e.speedId),o=Ux.find(c=>c.id===e.styleId),l=Fx.find(c=>c.id===e.deviceId);return n&&t.push(n.prompt),r&&t.push(r.prompt),i&&t.push(i.prompt),a&&t.push(a.prompt),o&&t.push(o.prompt),l&&t.push(l.prompt),t.join(", ")},Sq=e=>{const t=[...Px,...Ox,...Lx,...Bx,...Ux,...Fx];let n=e;e.includes(":")&&(n=e.split(":")[1]);const r=t.find(i=>i.name===n);return r?r.prompt:null},jq=e=>{const t=/【([^】]+)】/g;return e.replace(t,(n,r)=>{const i=Sq(r);return i||n})},Cq=e=>{const t=[],n=Px.find(c=>c.id===e.movementId),r=Ox.find(c=>c.id===e.directionId),i=Lx.find(c=>c.id===e.angleId),a=Bx.find(c=>c.id===e.speedId),o=Ux.find(c=>c.id===e.styleId),l=Fx.find(c=>c.id===e.deviceId);return n&&t.push(`[${n.name}]`),r&&t.push(`[${r.name}]`),i&&t.push(`[${i.name}]`),a&&t.push(`[${a.name}]`),o&&t.push(`[${o.name}]`),l&&t.push(`[${l.name}]`),t.join(" + ")},qP=2048,KP=.88;async function Nq(e,t=qP,n=KP){if(!e.type.startsWith("image/"))return e;const r=URL.createObjectURL(e);return new Promise(i=>{const a=new Image;a.onload=()=>{URL.revokeObjectURL(r);let o=a.naturalWidth,l=a.naturalHeight;if(o<=t&&l<=t){i(e);return}const c=Math.min(t/o,t/l);o=Math.round(o*c),l=Math.round(l*c);const u=document.createElement("canvas");u.width=o,u.height=l;const d=u.getContext("2d");if(!d){i(e);return}d.imageSmoothingEnabled=!0,d.imageSmoothingQuality="high",d.drawImage(a,0,0,o,l),u.toBlob(h=>i(h||e),"image/jpeg",n)},a.onerror=()=>{URL.revokeObjectURL(r),i(e)},a.src=r})}const As=async(e,t)=>{const n=(t==null?void 0:t.compressForApi)??!0,r=i=>n?Nq(i,qP,KP):Promise.resolve(i);if(e.startsWith("content_ref:"))try{const{contentStore:i}=await mn(async()=>{const{contentStore:l}=await Promise.resolve().then(()=>Nh);return{contentStore:l}},void 0,import.meta.url);await i.init();const a=i.extractId(e),o=await i.get(a);if(o)return As(o,t);throw new Error(`content_ref 不存在: ${a}`)}catch(i){throw new Error(`content_ref 解析失败: ${i instanceof Error?i.message:String(i)}`)}if(e.startsWith("data:"))try{const a=await(await fetch(e)).blob();return r(a)}catch(i){console.warn("[getBlobFromUrl] Fetch data URL 失败,尝试手动解析:",i);try{const a=e.match(/^data:([^;]+);base64,(.+)$/);if(a){const l=a[1],c=a[2],u=atob(c),d=new Uint8Array(u.length);for(let p=0;p0){const l=e.substring(0,o),c=e.substring(o+1),u=l.match(/data:([^;]+)/),d=u?u[1]:"application/octet-stream",h=atob(c),p=new Uint8Array(h.length);for(let b=0;bnew Promise((t,n)=>{const r=new FileReader;r.onloadend=()=>t(r.result),r.onerror=n,r.readAsDataURL(e)}),r$=(e,t=0)=>{if(t>5||!e||typeof e!="object")return null;const n=e,r=["url","image_url","imageUrl","image","src"];for(const i of r)if(n[i]&&typeof n[i]=="string"&&n[i].startsWith("http"))return n[i];if(Array.isArray(e)&&e.length>0){const i=r$(e[0],t+1);if(i)return i}for(const i in n)if(Object.prototype.hasOwnProperty.call(n,i)&&!r.includes(i)){const a=r$(n[i],t+1);if(a)return a}return null},Wx=(e,t,n)=>{var i,a,o,l,c,u,d,h,p,f,b,g,y,w,v,m;let r=[];if(console.log("[extractResultUrls] Input:",{isVideoGeneration:t,isMidjourney:n,hasImageUrl:!!e.imageUrl,pollDataKeys:Object.keys(e),pollDataSample:JSON.stringify(e).substring(0,200)}),!t){const z=e.choices??((i=e.data)==null?void 0:i.choices),C=Array.isArray(z)?z:void 0;if(C&&C.length>0){const E=(a=C[0])==null?void 0:a.message,I=E==null?void 0:E.content;if(typeof I=="string"&&(I.startsWith("http")||I.startsWith("data:")))return r=[I.trim()],console.log("[Chat Completions] 从 choices[0].message.content 字符串提取到图片"),r;if(Array.isArray(I)){for(const R of I)(R==null?void 0:R.type)==="image_url"&&((o=R.image_url)!=null&&o.url)?r.push(R.image_url.url):(R==null?void 0:R.type)==="image"&&R.image&&r.push(R.image);if(r.length>0)return console.log("[Chat Completions] 从 choices[0].message.content 数组提取到图片:",r.length),r}}}if(!t&&e.output&&typeof e.output=="object"){const C=e.output.choices;if(console.log("[Wan 2.6 Image] 检查 output.choices:",{hasChoices:!!C,choicesLength:(C==null?void 0:C.length)||0,choicesSample:C?JSON.stringify(C).substring(0,500):"null"}),C&&Array.isArray(C)&&C.length>0){for(let E=0;E0)return console.log("[Wan 2.6 Image] 从 output.choices[].message.content 提取到图片:",r.length,"张"),console.log("[Wan 2.6 Image] 所有图片URL:",r),r}}if(t){const z=e.data,C=z==null?void 0:z.task_result,E=C==null?void 0:C.videos;if(E&&Array.isArray(E)&&E.length>0)return r=E.map(F=>F.url).filter(Boolean),console.log("[Kling O1] 从 data.task_result.videos 提取到视频:",r.length,"个"),r;const I=e.videos,R=e.videoUrls;if(I&&Array.isArray(I)&&I.length>0)return r=I.map(F=>typeof F=="string"?F:F.url).filter(Boolean),console.log("[MJ Video] 从 videos 数组提取到视频:",r.length,"个"),r;if(R&&Array.isArray(R)&&R.length>0)return r=R.map(F=>typeof F=="string"?F:F==null?void 0:F.url).filter(Boolean),console.log("[MJ Video] 从 videoUrls 数组提取到视频:",r.length,"个"),r;const A=e.videoUrl;if(A)return r=[A],console.log("[MJ Video] 从 videoUrl 提取到单个视频:",A),r;const O=((p=e.data)==null?void 0:p.output)||e.output||((f=e.data)==null?void 0:f.video_url)||e.video_url||((b=e.data)==null?void 0:b.videoUrl)||e.videoUrl||((g=e.data)==null?void 0:g.url)||e.url||((w=(y=e.data)==null?void 0:y.data)==null?void 0:w.output)||((m=(v=e.data)==null?void 0:v.data)==null?void 0:m.video_url);O&&typeof O=="string"&&(r=[O],console.log("[Async Video] 提取到视频URL:",O))}if(!t&&n&&e.imageUrl)return r=[e.imageUrl],console.log("[extractResultUrls] 从 MJ imageUrl 提取到图片:",r[0]),r;if(r.length===0){const z=e.data;z!=null&&z.data&&Array.isArray(z.data)&&z.data.length>0?(r=z.data.map(C=>C.url).filter(Boolean),console.log("[Async Image] 从 data.data.data 提取到图片:",r.length,"张")):z!=null&&z.images&&Array.isArray(z.images)&&z.images.length>0?(r=z.images.map(C=>typeof C=="string"?C:C.url).filter(Boolean),console.log("[Async Image] 从 data.data.images 提取到图片:",r.length,"张")):e.images&&Array.isArray(e.images)&&e.images.length>0?(r=e.images.map(C=>typeof C=="string"?C:C.url).filter(Boolean),console.log("[Async Image] 从 data.images 提取到图片:",r.length,"张")):e.data&&Array.isArray(e.data)&&e.data.length>0&&(r=e.data.map(E=>{if(E.url)return E.url;if(E.b64_json){let I="image/png";return E.b64_json.startsWith("/9j/")?I="image/jpeg":E.b64_json.startsWith("R0lGOD")?I="image/gif":E.b64_json.startsWith("UklGR")&&(I="image/webp"),console.log("[Async Image] ✓ 检测到 base64 图片数据,转换为 data URL"),`data:${I};base64,${E.b64_json}`}return null}).filter(Boolean),console.log("[Async Image] 从 data.data 提取到图片:",r.length,"张"))}if(r.length===0){console.log("[extractResultUrls] 常规方式未找到图片,尝试深度搜索...");const z=r$(e);z?(r=[z],console.log("[extractResultUrls] 深度搜索找到图片URL:",z)):console.warn("[extractResultUrls] 深度搜索也未找到图片,响应数据:",JSON.stringify(e).substring(0,500))}return console.log("[extractResultUrls] Final result:",r),r},L5=e=>{const t=e.data;if(e.output&&typeof e.output=="object"){const r=e.output;if(r.task_status)return String(r.task_status).toUpperCase()}const n=(t==null?void 0:t.task_status)||(t==null?void 0:t.status)||e.status||e.task_status||"";return String(n).toUpperCase()},$2=(e,t)=>{const n=e.data,r=e.progress||(n==null?void 0:n.progress);return typeof r=="string"?parseInt(r.replace("%",""),10)||Math.min(10+t*2,90):r||Math.min(10+t*2,90)},B5=(e,t)=>{const n=e.data,r=e.failReason||e.fail_reason||(n==null?void 0:n.failReason)||(n==null?void 0:n.fail_reason)||e.message||e.error||"";if(typeof r=="string")return r||`任务失败: ${t}`;if(typeof r=="object"&&r!==null){const i=r;return i.message&&typeof i.message=="string"?i.message:JSON.stringify(r)}return`任务失败: ${t}`};function Sg(e){return new Promise((t,n)=>{const r=new FileReader;r.onloadend=()=>t(r.result),r.onerror=n,r.readAsDataURL(e)})}const jy="https://ai.comfly.chat";class Eq{constructor(t=jy,n="",r=[]){Mn(this,"baseUrl");Mn(this,"apiKey");Mn(this,"configs");this.baseUrl=t.replace(/\/+$/,""),this.apiKey=n,this.configs=r}updateConfig(t,n,r){t&&(this.baseUrl=t.replace(/\/+$/,"")),n&&(this.apiKey=n),r&&(this.configs=r)}getModelConfig(t){return this.configs.find(n=>n.id===t)}getApiKey(t){const n=this.getModelConfig(t);return(n==null?void 0:n.key)||this.apiKey}getBaseUrl(t){const n=this.getModelConfig(t);return((n==null?void 0:n.url)||this.baseUrl).replace(/\/+$/,"")}async request(t,n={},r){const i=r?this.getBaseUrl(r):this.baseUrl,a=r?this.getApiKey(r):this.apiKey;try{const o=await fetch(`${i}${t}`,{...n,headers:{"Content-Type":"application/json",Authorization:`Bearer ${a}`,...n.headers}});if(!o.ok){const c=await o.text();return{success:!1,error:`HTTP ${o.status}: ${c}`}}return{success:!0,data:await o.json()}}catch(o){return{success:!1,error:String(o)}}}async imageToBase64(t){if(t.startsWith("data:"))return t;try{const r=await(await fetch(t)).blob();return new Promise((i,a)=>{const o=new FileReader;o.onload=()=>i(o.result),o.onerror=a,o.readAsDataURL(r)})}catch(n){return console.error("图片转 Base64 失败:",n),t}}fileToBase64(t){return new Promise((n,r)=>{const i=new FileReader;i.onload=()=>n(i.result),i.onerror=r,i.readAsDataURL(t)})}async chatCompletion(t){return this.request("/v1/chat/completions",{method:"POST",body:JSON.stringify(t)},t.model)}async generateImage(t){const n=this.getModelConfig(t.model);return this.getBaseUrl(t.model),this.getApiKey(t.model),t.model.startsWith("jimeng")?this.request("/api/generate",{method:"POST",body:JSON.stringify({prompt:t.prompt,model:(n==null?void 0:n.modelName)||t.model,size:t.size,images:t.referenceImages})},t.model):this.request("/v1/images/generations",{method:"POST",body:JSON.stringify({model:(n==null?void 0:n.modelName)||t.model,prompt:t.prompt,size:t.size||"1024x1024",n:t.n||1})},t.model)}async generateImageAsync(t){const n=this.getModelConfig(t.model);return this.request("/v1/images/generations",{method:"POST",body:JSON.stringify({model:(n==null?void 0:n.modelName)||t.model,prompt:t.prompt,size:t.size||"1024x1024",n:t.n||1})},t.model)}async generateVideo(t){var i,a,o;const n=this.getModelConfig(t.model),r=this.getBaseUrl(t.model);if(t.model.includes("jimeng-video")){const l={model:(n==null?void 0:n.modelName)||t.model,prompt:t.prompt.trim(),duration:parseInt(((i=t.duration)==null?void 0:i.replace("s",""))||"5")};t.size&&t.model!=="jimeng-video-3.0-pro"&&(l.resolution=t.size.toLowerCase());const c=[];if(t.firstFrame)try{let u;if(t.firstFrame.startsWith("data:"))u=t.firstFrame;else if(t.firstFrame.startsWith("http://")||t.firstFrame.startsWith("https://")){const d=await As(t.firstFrame);u=await Sg(d)}else{const d=await As(t.firstFrame);u=await Sg(d)}c.push(u)}catch(u){console.error("[API Service] 首帧图片转换失败:",u)}if(t.lastFrame)try{let u;if(t.lastFrame.startsWith("data:"))u=t.lastFrame;else if(t.lastFrame.startsWith("http://")||t.lastFrame.startsWith("https://")){const d=await As(t.lastFrame);u=await Sg(d)}else{const d=await As(t.lastFrame);u=await Sg(d)}c.push(u)}catch(u){console.error("[API Service] 尾帧图片转换失败:",u)}return c.length>0&&(l.images=c,console.log("[API Service] Jimeng 视频生成,已添加",c.length,"张图片(首尾帧)")),this.request("/v1/videos/generations",{method:"POST",body:JSON.stringify(l)},t.model)}if(t.model.startsWith("sora")){if(r.includes("api.openai.com"))return this.request("/videos",{method:"POST",body:JSON.stringify({model:(n==null?void 0:n.modelName)||t.model,prompt:t.prompt,seconds:parseInt(((o=t.duration)==null?void 0:o.replace("s",""))||"5"),size:t.size||"1920x1080"})},t.model);{const c={model:(n==null?void 0:n.modelName)||t.model,prompt:t.prompt,aspect_ratio:t.size||"16:9",duration:((a=t.duration)==null?void 0:a.replace("s",""))||"10"};if(t.referenceImages&&t.referenceImages.length>0){const u=await Promise.all(t.referenceImages.map(async d=>{if(d.startsWith("data:")||d.startsWith("http://")||d.startsWith("https://"))return d;try{const h=await As(d);return await Sg(h)}catch(h){return console.error("[API Service] 图片转换失败:",h),d}}));c.images=u,console.log("[API Service] 图生视频,已添加图片数据")}return this.request("/v2/videos/generations",{method:"POST",body:JSON.stringify(c)},t.model)}}if(t.model.includes("veo")){const l=[];return t.firstFrame&&l.push(t.firstFrame),t.lastFrame&&l.push(t.lastFrame),this.request("/v1/video/generations",{method:"POST",body:JSON.stringify({model:(n==null?void 0:n.modelName)||t.model,prompt:t.prompt,duration:t.duration||"8s",images:l.length>0?l:void 0})},t.model)}return this.request("/v1/video/generations",{method:"POST",body:JSON.stringify({model:(n==null?void 0:n.modelName)||t.model,prompt:t.prompt,duration:t.duration,size:t.size})},t.model)}async getTaskStatus(t,n){n&&this.getModelConfig(n);const r=n?this.getBaseUrl(n):this.baseUrl;return n!=null&&n.startsWith("sora")?r.includes("api.openai.com")?this.request(`/videos/${t}`,{method:"GET"},n):this.request(`/v2/videos/generations/${t}`,{method:"GET"},n):this.request(`/v1/tasks/${t}`,{method:"GET"},n)}async pollTaskUntilComplete(t,n,r,i=120,a=5e3){for(let o=0;osetTimeout(u,a))}return{success:!1,error:"任务超时"}}async generateMusic(t){const n=t.model||"suno-v4";this.getBaseUrl(n);const r=this.getApiKey(n),i=n.includes("v3.0")?"chirp-v3-0":n.includes("v3.5")?"chirp-v3-5":n.includes("v4.5")?"chirp-v4-5":n.includes("v5")?"chirp-v5":"chirp-v4";let a;t.make_instrumental?t.mode==="inspiration"?a={gpt_description_prompt:t.prompt||"",mv:i,prompt:"",make_instrumental:!0}:a={prompt:t.prompt||"",tags:t.tags||"",mv:i,title:t.title||"",continue_clip_id:t.continue_clip_id||null,continue_at:t.continue_at||null,infill_start_s:t.infill_start_s||null,infill_end_s:t.infill_end_s||null}:a={prompt:t.prompt||"",mv:i,title:t.title||"",tags:t.tags||"",continue_at:t.continue_at||0,continue_clip_id:t.continue_clip_id||"",...t.task==="extend"?{task:"extend"}:{},make_instrumental:!1};const o=await this.request("/suno/generate",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify(a)},n);if(o.success&&o.data){const l=o.data;if(typeof l=="object"&&Array.isArray(l.clips)){const c=l.clips,u=c.map(d=>d.id).filter(d=>d);if(u.length>0)return console.log("[generateMusic] Got clips array, extracted clip_ids:",u),{success:!0,data:{task_id:"",clip_ids:u,clips:c}}}if(typeof l=="object"&&"data"in l){const c=l.data;if(Array.isArray(c))return{success:!0,data:{task_id:"",clip_ids:c}};if(typeof c=="string")return{success:!0,data:{task_id:c}}}if(typeof l=="string")return{success:!0,data:{task_id:l}};if(Array.isArray(l))return{success:!0,data:{task_id:"",clip_ids:l}};if(typeof l=="object"){const c=l.task_id||l.taskId||l.id,u=l.clip_ids||l.clipIds||l.ids;if(c)return{success:!0,data:{task_id:String(c)}};if(Array.isArray(u)&&u.length>0)return{success:!0,data:{task_id:"",clip_ids:u}}}}return console.error("[generateMusic] Failed to parse response:",o.data),{success:!1,error:`无法解析 API 响应: ${JSON.stringify(o.data).substring(0,200)}...`}}async getMusicTaskStatus(t,n){const r=n?this.getApiKey(n):this.apiKey;return this.request(`/suno/fetch/${t}`,{method:"GET",headers:{Authorization:`Bearer ${r}`}},n)}async getMusicByClipIds(t,n){const r=n?this.getApiKey(n):this.apiKey,i=t.join(",");return this.request(`/suno/feed/${i}`,{method:"GET",headers:{Authorization:`Bearer ${r}`}},n)}async getBackendTaskStatus(t,n){const r=n?this.getApiKey(n):this.apiKey;return this.request(`/v1/tasks/${t}`,{method:"GET",headers:{Authorization:`Bearer ${r}`}},n)}async getAudioUploadSignature(t="mp3",n){const r=n?this.getApiKey(n):this.apiKey;return this.request("/suno/uploads/audio",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify({extension:t})},n)}async uploadAudioToS3(t,n,r,i){try{const a=new FormData;return Object.keys(n).forEach(o=>{a.append(o,n[o])}),a.append("file",r),new Promise((o,l)=>{const c=new XMLHttpRequest;c.upload.addEventListener("progress",u=>{if(u.lengthComputable&&i){const d=Math.round(u.loaded/u.total*100);i(d)}}),c.addEventListener("load",()=>{c.status>=200&&c.status<300?o(!0):l(new Error(`Upload failed with status ${c.status}`))}),c.addEventListener("error",()=>{l(new Error("Upload failed"))}),c.addEventListener("abort",()=>{l(new Error("Upload aborted"))}),c.open("POST",t),c.send(a)})}catch(a){return console.error("[Upload Audio] Error:",a),!1}}async reportUploadFinish(t,n,r){const i=r?this.getApiKey(r):this.apiKey;return this.request(`/suno/uploads/audio/${t}/upload-finish`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${i}`},body:JSON.stringify({upload_type:"file_upload",upload_filename:n})},r)}async getUploadStatus(t,n){const r=n?this.getApiKey(n):this.apiKey;return this.request(`/suno/uploads/audio/${t}`,{method:"GET",headers:{Authorization:`Bearer ${r}`}},n)}async initializeAudioClip(t,n){const r=n?this.getApiKey(n):this.apiKey;return this.request(`/suno/uploads/audio/${t}/initialize-clip`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify({})},n)}async generateLyrics(t,n){const r=n?this.getApiKey(n):this.apiKey;return this.request("/suno/submit/lyrics",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify({prompt:t})},n)}async extendMusic(t){const n=t.model||"suno-v4";this.getBaseUrl(n);const r=this.getApiKey(n),i={prompt:t.prompt,mv:t.mv,title:t.title,tags:t.tags,continue_at:t.continue_at,continue_clip_id:t.continue_clip_id,task:t.task,make_instrumental:t.make_instrumental},a=await this.request("/suno/submit/music",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify(i)},n);if(a.success&&a.data){if(typeof a.data=="object"&&"data"in a.data)return{success:!0,data:{task_id:a.data.data}};if(typeof a.data=="string")return{success:!0,data:{task_id:a.data}}}return a}async splitMusic(t){const n=t.model||"suno-v4";this.getBaseUrl(n);const r=this.getApiKey(n),i={task:t.task,generation_type:t.generation_type,title:t.title,mv:t.mv,prompt:t.prompt,make_instrumental:t.make_instrumental,continue_clip_id:t.continue_clip_id,continued_aligned_prompt:t.continued_aligned_prompt,continue_at:t.continue_at,stem_type_id:t.stem_type_id,stem_type_group_name:t.stem_type_group_name,stem_task:t.stem_task},a=await this.request("/suno/generate",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify(i)},n);if(a.success&&a.data){const o=a.data;if(typeof o=="object"&&Array.isArray(o.clips)){const l=o.clips,c=l.map(u=>u.id).filter(u=>u);if(c.length>0)return{success:!0,data:{task_id:"",clip_ids:c,clips:l}}}if(typeof o=="object"&&"data"in o){const l=o.data;if(Array.isArray(l))return{success:!0,data:{task_id:"",clip_ids:l}};if(typeof l=="string")return{success:!0,data:{task_id:l}}}if(typeof o=="string")return{success:!0,data:{task_id:o}};if(Array.isArray(o))return{success:!0,data:{task_id:"",clip_ids:o}};if(typeof o=="object"){const l=o.task_id||o.taskId||o.id,c=o.clip_ids||o.clipIds||o.ids;if(l)return{success:!0,data:{task_id:String(l)}};if(Array.isArray(c)&&c.length>0)return{success:!0,data:{task_id:"",clip_ids:c}}}}return{success:!1,error:`无法解析声曲分离 API 响应: ${JSON.stringify(a.data).substring(0,200)}...`}}async getMusicTiming(t,n){const r=n?this.getApiKey(n):this.apiKey;return this.request(`/suno/act/timing/${t}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`}},n)}async testConnection(t){try{return(await this.request("/v1/models",{method:"GET"},t)).success}catch{return!1}}}const Na=new Eq,Iq="http://127.0.0.1:41600/proxy";function kq(e){const t=e.toLowerCase();return t.includes("failed to fetch")||t.includes("network")||t.includes("connection")||t.includes("refused")||t.includes("econnrefused")||t.includes("econnreset")||t.includes("net::err_")||t.includes("load failed")}async function Aq(e,t,n,r,i,a=4){const o=JSON.stringify({url:e,method:t.toUpperCase(),headers:n,body:r??void 0,formData:i!=null&&i.length?i:void 0});let l=null;for(let c=0;c<=a;c++)try{const u=await fetch(Iq,{method:"POST",headers:{"Content-Type":"application/json"},body:o}),d=await u.text();if(!u.ok)throw new Error(d||`Proxy request failed: ${u.status}`);return d}catch(u){l=u instanceof Error?u:new Error(String(u));const d=l.message;if(csetTimeout(p,h));continue}throw l}throw l||new Error("Proxy request failed")}function S2(){return typeof window<"u"&&"__TAURI__"in window}async function Mq(e,t={}){const{method:n="GET",headers:r={},body:i}=t,a=e.startsWith("/")?e:`/${e}`,o=i?typeof i=="string"?i:JSON.stringify(i):void 0;try{const l=await yn("proxy_dashscope_request",{path:a,method:n.toUpperCase(),headers:r,body:o});try{return JSON.parse(l)}catch{return l}}catch(l){throw l}}function Tq(e){try{return e.toLowerCase().includes("/vidu/")}catch{return!1}}async function Rq(e){const t=[];for(const[n,r]of e.entries())if(typeof r=="string")t.push({name:n,value:r});else if(r instanceof Blob){const i=await Pq(r),a=r instanceof File?r.name:void 0;t.push({name:n,blob_base64:i,filename:a})}return t}function Pq(e){return new Promise((t,n)=>{const r=new FileReader;r.onload=()=>{const a=r.result.split(",")[1];t(a||"")},r.onerror=()=>n(r.error),r.readAsDataURL(e)})}function j2(e){const t={};return e.headers&&(e.headers instanceof Headers?e.headers.forEach((n,r)=>{t[r]=n}):Array.isArray(e.headers)?e.headers.forEach(([n,r])=>{t[n]=r}):Object.assign(t,e.headers)),t}async function Pl(e,t={}){const n=e.includes("dashscope.aliyuncs.com"),r=Tq(e),i=S2();if(r){const o=S2()&&!0,l=j2(t);let c,u;t.body!=null&&(typeof t.body=="string"?c=t.body:t.body instanceof FormData?u=await Rq(t.body):typeof t.body.text=="function"?c=await t.body.text():c=void 0);const d=(t.method||"GET").toUpperCase();try{if(o){const p=async()=>{const b=await yn("proxy_fetch",{args:{url:e,method:d,headers:l,body:c??void 0,formData:u!=null&&u.length?u:void 0,timeoutSecs:d==="POST"?300:60}});return new Response(b,{status:200,statusText:"OK",headers:{"Content-Type":"application/json"}})},f=async()=>{const b=await Aq(e,d,l,c,u);return new Response(b,{status:200,statusText:"OK",headers:{"Content-Type":"application/json"}})};try{return await p()}catch(b){try{return await f()}catch{try{return await p()}catch{throw b}}}}const h=await yn("proxy_fetch",{args:{url:e,method:d,headers:l,body:c??void 0,formData:u!=null&&u.length?u:void 0,timeoutSecs:d==="POST"?300:60}});return new Response(h,{status:200,statusText:"OK",headers:{"Content-Type":"application/json"}})}catch(h){const p=h instanceof Error?h.message:String(h),f=S2()&&!0,b=/capability|permission|denied|allow|not allowed|unauthorized|IPC/i.test(p),g=p.includes("HTTP ")||p.includes("502")||p.includes("Bad Gateway")||p.includes("timeout")||p.includes("Timeout")||p.includes("Request failed");if(b)return new Response(JSON.stringify({error:"打包版需要后端代理权限。请重新安装应用或确认应用未损坏。"}),{status:403,statusText:"Capability",headers:{"Content-Type":"application/json"}});if(g){let y=p;return p.includes("502")||p.includes("Bad Gateway")?y="API 服务暂时不可用 (502),请稍后重试或检查 API 服务状态。":(p.includes("timeout")||p.includes("Timeout"))&&(y="请求超时,请检查网络后重试。"),new Response(JSON.stringify({error:y}),{status:500,statusText:"Proxy Error"})}if(f)return new Response(JSON.stringify({error:"打包版 Vidu 需通过 Tauri 后端代理。请确认应用已正确安装;若仍失败可尝试重新安装。可检查本机 41600 端口是否被占用、或安全软件是否拦截。"}),{status:403,statusText:"Proxy",headers:{"Content-Type":"application/json"}});try{const y=new URL(e),w=`/api/vidu-proxy${y.pathname}${y.search}`,v=await fetch(w,{method:t.method||"GET",headers:t.headers,body:t.body}),m=await v.text();return/^\s*<(!DOCTYPE|html|head|<)/i.test(m)||v.status===404&&m.length>0?new Response(JSON.stringify({error:"打包版 Vidu 需通过 Tauri 后端代理。请确认应用已正确安装;若仍失败,可尝试重新安装。"}),{status:403,statusText:"Proxy",headers:{"Content-Type":"application/json"}}):new Response(m,{status:v.status,statusText:v.statusText,headers:v.headers})}catch{return new Response(JSON.stringify({error:"Vidu 图生视频需在 Tauri 桌面版中运行(tauri dev 或打包后启动),或确保使用 npm run dev 启动开发服务器以通过代理访问。"}),{status:403,statusText:"CORS",headers:{"Content-Type":"application/json"}})}}}const a=e.includes("generativelanguage.googleapis.com");if(i&&a)try{const o=j2(t);let l;t.body!=null&&(typeof t.body=="string"?l=t.body:typeof t.body.text=="function"&&(l=await t.body.text()));const c=(t.method||"GET").toUpperCase(),u=await yn("proxy_fetch_raw",{args:{url:e,method:c,headers:o,body:l??void 0,timeoutSecs:c==="POST"?180:60}}),d=new Headers;if(u!=null&&u.headers&&typeof u.headers=="object")for(const[h,p]of Object.entries(u.headers))typeof p=="string"&&d.set(h,p);return d.has("content-type")||d.set("content-type","application/json; charset=utf-8"),new Response((u==null?void 0:u.body)??"",{status:(u==null?void 0:u.status)||200,statusText:"OK",headers:d})}catch(o){const l=o instanceof Error?o.message:String(o),c=/HTTP |502|timeout|Timeout|Request failed/i.test(l);return new Response(JSON.stringify({error:c?l:`Gemini 官方 API 代理请求失败: ${l}`}),{status:500,statusText:"Proxy Error",headers:{"Content-Type":"application/json"}})}if(i&&n)try{const o=new URL(e),l=o.pathname+o.search,c=j2(t),u=await Mq(l,{method:t.method||"GET",headers:c,body:t.body}),d=typeof u=="string"?u:JSON.stringify(u);return new Response(d,{status:200,statusText:"OK",headers:{"Content-Type":"application/json"}})}catch(o){const l=o instanceof Error?o.message:String(o);return new Response(JSON.stringify({error:l,details:"Tauri proxy failed. Check if proxy_dashscope_request command is registered."}),{status:500,statusText:"Proxy Error"})}return fetch(e,t)}const Oq=e=>{if(!e||!e.isActive)return{augmentedPrompt:"",angleMetadata:null,needsControlNetReduction:!1};const{rotation:t,tilt:n,scale:r}=e,i=[],o=(360-(t%360+360)%360)%360,l=Math.abs(t)>15||Math.abs(t-360)>15;return o>=30&&o<=150?i.push("(Two-point perspective:1.4), dramatically shifting the vanishing point to the far diagonal corner, re-modeling the interior structure from a corner view, architectural wide-angle lens"):o>150&&o<210?i.push("(Complete 180-degree spatial flip:1.4), rotating the architectural perspective to reveal the opposite wall, dramatic rear view reconstruction"):o>=210&&o<=330?i.push("(Two-point perspective:1.4), dramatically shifting the vanishing point to the opposite far diagonal corner, re-modeling the interior from alternate corner view, architectural wide-angle lens"):o>15&&o<30?i.push("(Slightly angled perspective:1.2), subtle shift in vanishing point, revealing more depth"):o>330&&o<345?i.push("(Slightly angled perspective:1.2), subtle shift in vanishing point from opposite side, revealing more depth"):i.push("(One-point perspective:1.2), frontal architectural view, centered vanishing point"),n>20?i.push("(Aerial architectural drone view:1.4), looking down at the spatial layout and furniture arrangement, high-angle interior visualization"):n<-20?i.push("(Dramatic low-angle architectural shot:1.3), looking up at the ceiling and vertical lines to emphasize height, heroic structural perspective"):n>5?i.push("slightly elevated camera position, gentle downward angle on the interior layout"):n<-5&&i.push("slightly lowered camera position, gentle upward angle emphasizing ceiling height"),r>1.3?i.push("(Architectural detail close-up:1.2), zooming in on textures and material finishes"):r<.7?i.push("(Ultra-wide 14mm lens:1.3), extreme interior perspective, expanding the sense of space"):r>1.1?i.push("medium architectural framing, focusing on key spatial elements"):r<.9&&i.push("wider architectural framing, revealing more spatial context"),{augmentedPrompt:`(Complete spatial reconstruction:1.3), ${i.join(", ")}, maintaining the aesthetic and materials of the reference image, professional architectural photography, 8k resolution`,angleMetadata:{rotation:t,tilt:n,scale:r},needsControlNetReduction:l}},_j=(e,t)=>e==="architecture"?Math.max(t,.8+Math.random()*.05):t,zj=(e,t=1)=>.35+Math.random()*.1,Lq=e=>{const t=(e%360+360)%360;return t<=15||t>=346?"front-facing camera, head-on shot, camera directly in front of subject":t<=30?"camera slightly right of center, subtle off-axis angle, near-frontal shot":t<=60?"camera at right front three-quarter position, classic 45-degree orbit, diagonal viewpoint":t<=85?"camera approaching right side, strong lateral orbit, near-profile viewpoint":t<=95?"camera at exact right side, 90-degree lateral position, pure profile shot":t<=120?"camera behind and to the right, rear three-quarter orbit, over-the-shoulder angle":t<=160?"camera behind subject angled from right, strong rear orbit, following angle":t<=195?"camera directly behind subject, 180-degree rear position, following shot":t<=240?"camera behind subject angled from left, rear orbit mirrored, following angle from left":t<=265?"camera at exact left side, 270-degree orbit, left profile shot":t<=300?"camera at left front three-quarter position, classic 45-degree orbit from left, diagonal viewpoint mirrored":"camera slightly left of center, subtle off-axis from left, near-frontal shot"},Bq=e=>{const t=(e%360+360)%360;return t<=15||t>=346?"subject facing camera, symmetrical view, both eyes visible, centered composition":t<=30?"slight rightward turn relative to camera, face mostly visible, left ear beginning to hide, subtle asymmetry":t<=60?"three-quarter view, classic portrait angle, far eye partially occluded by nose bridge, near cheekbone prominent, one ear hidden":t<=85?"near profile, nose tip extending past cheek contour, far eye barely visible, strong facial depth, ear becoming prominent":t<=95?"perfect side profile, single eye visible, nose silhouette sharp, ear centered in frame, jawline to chin contour clean":t<=120?"back of head and right ear visible, jawline edge barely showing, shoulder and upper back prominent, hair/back detail focus":t<=160?"mostly back view, spine line off-center, right shoulder closer to camera, back of head dominant, no facial features visible":t<=195?"full back view, symmetrical shoulders, spine centered, back of head centered, no face visible, dorsal view":t<=240?"mostly back view, left shoulder closer to camera, spine line off-center left, back of head dominant, no facial features":t<=265?"perfect left side profile, right eye visible, left ear centered, nose silhouette from left, mirrored profile composition":t<=300?"three-quarter view from left, right ear hidden, left cheekbone prominent, classic portrait angle mirrored":"slight leftward turn relative to camera, face mostly visible, right ear beginning to hide, subtle asymmetry from left"},Uq=e=>{const t=(e%360+360)%360;return t<=15||t>=346?"1-point perspective, background parallel to camera plane, symmetrical depth, walls/environment receding evenly on both sides, centered vanishing point":t<=30?"background starting to angle, left side of environment receding slightly deeper, gentle perspective shift, vanishing point drifting right of center":t<=60?"2-point perspective, left background wall receding sharply into depth, right background wall angling toward camera, strong diagonal leading lines, vanishing point shifted far right, corner of room or environment visible":t<=85?"deep perspective tunnel effect, environment stretching into distance ahead of subject, strong depth of field, foreground-background separation dramatic, leading lines converging to single distant vanishing point on left":t<=95?"maximum depth perspective, environment extends infinitely in front of and behind subject, foreground and background layers clearly separated, strong atmospheric perspective, parallel lines of environment converge to distant vanishing point":t<=120?"camera now sees what is in front of subject, environment ahead of subject becoming visible, over-the-shoulder depth, foreground is subject's back, background is subject's forward view, reversed spatial relationship":t<=160?"full forward environment visible past subject, subject silhouetted against their own view, third-person game perspective, depth extends ahead into scene, ground plane and distant background both visible":t<=195?"entire forward scene visible, subject looking into the depth of environment, 1-point perspective from behind, centered vanishing point ahead, road/path/corridor stretching forward, immersive third-person depth":t<=240?"forward environment visible past subject from left bias, depth extends ahead, left side of forward scene more visible, asymmetric third-person view":t<=265?"maximum depth perspective mirrored, environment extends in front of and behind subject, vanishing point on right side, parallel environment lines converge to distant right":t<=300?"2-point perspective mirrored, right background wall receding into depth, left background wall angling toward camera, vanishing point shifted far left, corner of environment visible from left":"background starting to angle from left, right side of environment receding slightly deeper, vanishing point drifting left of center"},Fq=e=>e<=-60?"extreme low angle, worm's eye view, camera on ground pointing straight up":e<=-30?"low angle shot, hero angle, camera below subject eye level, looking up":e<=-10?"slight low angle, camera just below eye level, subtle upward gaze":e<=9?"eye level shot, camera at subject eye height, neutral horizontal angle":e<=29?"slight high angle, camera just above eye level, gentle downward look":e<=59?"high angle shot, camera significantly above subject, looking down at scene":e<=80?"steep overhead angle, drone shot, camera far above looking almost straight down":"top-down view, bird's eye view, camera directly above pointing straight down, 90-degree vertical",Wq=e=>e<=-60?"subject towering above, chin and underside visible, dramatic foreshortening, legs massive if full body":e<=-30?"subject appears tall and powerful, chin slightly prominent, body elongated upward, imposing presence":e<=-10?"flattering upward perspective, jawline defined, subtle power dynamic, natural and confident":e<=9?"natural proportions, no perspective distortion, neutral and balanced view":e<=29?"forehead slightly more visible, approachable and intimate, subject appears slightly smaller":e<=59?"top of head/object visible, body foreshortened downward, shoulders/top surface prominent":e<=80?"top of head/roof dominant, extreme vertical foreshortening, body compressed to near-flat shape":"only top surface visible, flat silhouette, no side surfaces, plan view of subject",Dq=e=>e<=-60?"no ground visible, sky or ceiling fills background, vertical lines converging upward to overhead vanishing point, 3-point perspective with upward convergence, buildings/walls/trees stretching toward sky, no horizon line":e<=-30?"low horizon line at bottom 20% of frame, sky or ceiling occupies upper 60% of frame, vertical lines slightly converging upward, buildings/walls appear to lean back, ground plane compressed to thin strip at bottom":e<=-10?"horizon line slightly below center at 40% height, slightly more sky/ceiling than ground visible, vertical lines nearly parallel with minimal upward convergence, natural street-level spatial feel":e<=9?"horizon line at exact center of frame, equal sky and ground distribution, vertical lines perfectly parallel, horizontal lines converge to center vanishing point, natural human-eye spatial relationship":e<=29?"horizon line slightly above center at 60% height, more ground/floor visible than sky, ground texture becoming readable, floor pattern or surface detail emerging, vertical lines nearly parallel with minimal downward convergence":e<=59?"high horizon line at top 20% of frame, ground plane dominates 70% of frame, floor texture fully visible, ground shadows clearly cast, objects on ground visible, minimal sky, vertical lines converging downward":e<=80?"ground plane fills 90% of frame, horizon nearly gone, floor layout fully readable, shadows directly below objects, spatial layout like a map beginning to form, architectural footprints visible, paths and roads readable as lines":"no horizon line, no sky, entire frame is ground plane, pure floor/ground layout, map view, flat lay composition, all shadows directly beneath objects, no perspective convergence, orthographic spatial feel, architectural plan perspective",Vq=e=>e<=.7?"wide angle lens, 24mm equivalent, camera far from subject, establishing shot":e<=.95?"standard wide shot, 35mm equivalent, full body framing":e<=1.2?"medium shot, 50mm equivalent, natural field of view, waist-up or knee-up framing":e<=1.5?"medium close-up, 85mm equivalent, portrait lens, head and shoulders framing":"close-up shot, 100mm equivalent, tight framing, face or detail filling frame",Hq=e=>e<=.7?"subject small in frame occupying less than 30% of image, full body with space around, environmental portrait":e<=.95?"full body visible head to toe, subject occupies 40-60% of frame height, complete form readable":e<=1.2?"upper body focus, waist or knees up, facial expression readable, gesture visible":e<=1.5?"head and shoulders dominant, facial detail clear, skin texture visible, expression is focal point":"face filling frame or specific detail dominant, pores and fine texture visible, intimate and immersive",Gq=e=>e<=.7?"vast environment visible, expanded spatial feel, wide field of view, slight barrel distortion at edges, room/landscape feels larger than reality, extensive background detail, multiple depth layers visible":e<=.95?"natural spatial proportions, moderate environment context, background readable but not dominant, 2-3 depth layers, standard room/scene feel":e<=1.2?"background present but secondary, natural depth of field, environment provides context without dominating, realistic human-eye spatial compression":e<=1.5?"background softening, shallow depth of field beginning, environment becomes abstract color and shape, spatial compression increasing, background elements appear closer together":"background fully blurred into bokeh, no environmental detail readable, extreme shallow depth of field, compressed spatial layers merge into soft color wash, only subject plane in focus",qq=e=>(360-(e%360+360)%360)%360,Kq=(e,t,n)=>{const r=[Lq(e),Fq(t),Vq(n)].join(", "),i=[Bq(e),Wq(t),Hq(n)].join(", "),a=[Uq(e),Dq(t),Gq(n)].join(", "),o=`${r}, ${i}, ${a}`;return{cameraLayer:r,subjectLayer:i,spaceLayer:a,fullPrompt:o}},XP=e=>{if(!e||!e.isActive)return{augmentedPrompt:"",angleMetadata:null};const{rotation:t,tilt:n,scale:r}=e,i=qq(t),{fullPrompt:a}=Kq(i,n,r);return{augmentedPrompt:`(Professional re-shot:1.3), ${a}, strictly maintaining the character and environment from the reference image, consistent lighting and style`,angleMetadata:{rotation:t,tilt:n,scale:r}}};async function YP(e,t,n,r){var i;if(console.log("[AudioUploader] 上传音频文件:",{name:e.name,size:e.size,type:e.type,segment:t}),r&&r.includes("dashscope"))return console.log("[AudioUploader] 检测到阿里云官方 API,使用 Base64 编码"),b1(e,t);if(n&&r)try{let a=e;if(t){console.log("[AudioUploader] 裁剪音频片段:",t);const c=await JP(e,t.startTime,t.endTime);a=new File([c],e.name,{type:"audio/wav"})}const o=[`${r}/v1/uploads`,`${r}/api/v1/uploads`,`${r}/v1/files`,`${r}/uploads`];console.log("[AudioUploader] 文件信息:",{name:a.name,size:a.size,type:a.type});let l=null;for(const c of o)try{console.log("[AudioUploader] 尝试上传接口:",c);const u=new FormData;u.append("file",a),u.append("purpose","assistants");const d=await fetch(c,{method:"POST",headers:{Authorization:`Bearer ${n}`},body:u});if(!d.ok){const f=await d.text();console.warn("[AudioUploader] 端点失败:",c,d.status,f),l=new Error(`HTTP ${d.status}: ${f}`);continue}const h=await d.json();console.log("[AudioUploader] 上传成功:",h);let p=h.url||h.file_url||h.download_url||((i=h.data)==null?void 0:i.url);if(!p&&h.id&&(p=`${r}/v1/files/${h.id}/content`),!p){console.warn("[AudioUploader] 响应中未找到文件 URL,尝试下一个端点"),l=new Error("响应中未找到文件 URL");continue}return console.log("[AudioUploader] 文件 URL:",p),p}catch(u){console.warn("[AudioUploader] 端点请求失败:",c,u),l=u instanceof Error?u:new Error(String(u));continue}return console.warn("[AudioUploader] 所有上传端点都失败,使用 Base64 编码作为备选方案"),b1(e,t)}catch(a){return console.error("[AudioUploader] 上传到服务器失败:",a),b1(e,t)}return b1(e,t)}async function b1(e,t){console.warn("[AudioUploader] 使用 Base64 编码"),console.warn("[AudioUploader] 注意:Base64 编码会增加文件大小约 33%");try{let n=e;if(t){console.log("[AudioUploader] 裁剪音频片段:",t);const u=await JP(e,t.startTime,t.endTime);n=new File([u],e.name,{type:"audio/wav"})}const r=await n.arrayBuffer(),i=new Uint8Array(r);let a="";for(let u=0;u{const r=new FileReader;r.onload=()=>{const i=r.result,a=i.includes(",")?i.split(",")[1]:i;t(a)},r.onerror=n,r.readAsDataURL(e)})}async function Mm(e,t,n,r){const i=Zq(t),a=i>=Jq,o=Uw(),l=(o==null?void 0:o.usagePercent)||0,c=r||l>70,u=a||c;console.log(`[LargeDataProcessor] 处理数据: ${e}, 大小: ${(i/1024/1024).toFixed(2)} MB`),console.log(`[LargeDataProcessor] JavaScript 堆使用率: ${l.toFixed(2)}%`),console.log(`[LargeDataProcessor] 使用: ${u?"Rust后端":"JavaScript"} (${u?a?"数据大小触发":"内存使用率触发":"正常处理"})`);let d;if(typeof t=="string"?d=t:d=await Qq(t),u)try{const h=await yn("process_large_data_rust",{operation:e,data:d,options:n?JSON.stringify(n):void 0});return console.log("[LargeDataProcessor] Rust 后端处理完成"),h}catch(h){return console.error("[LargeDataProcessor] Rust 后端处理失败:",h),console.warn("[LargeDataProcessor] 降级到 JavaScript 处理"),$j(e,d,n)}return $j(e,d,n)}async function $j(e,t,n){switch(e){case"process_image":return eK(t,n);case"process_video":return t;case"process_file":return t;case"compress_data":return t;default:throw new Error(`不支持的操作: ${e}`)}}async function eK(e,t){const n=(t==null?void 0:t.maxDimension)??4096,r=(t==null?void 0:t.maxSize)??4.5*1024*1024,i=(t==null?void 0:t.quality)??.9,a=e.includes(",")&&e.split(",")[1]||e;let o="image/jpeg";try{const v=atob(a);if(v.length>=2){const m=v.charCodeAt(0),z=v.charCodeAt(1);m===255&&z===216?o="image/jpeg":m===137&&z===80&&(o="image/png")}}catch{}const l=`data:${o};base64,${a}`,c=await new Promise((v,m)=>{const z=new Image;z.onload=()=>v(z),z.onerror=()=>m(new Error("图片加载失败")),z.src=l});let u=c.naturalWidth,d=c.naturalHeight;if(u>n||d>n){const v=Math.min(n/u,n/d);u=Math.floor(u*v),d=Math.floor(d*v)}const h=document.createElement("canvas");h.width=u,h.height=d;const p=h.getContext("2d");if(!p)return e;p.drawImage(c,0,0,u,d);const f=.25;let b=Math.min(i,.95);for(;b>=f;){const v=h.toDataURL("image/jpeg",b),m=v.split(",")[1]||v,z=Math.ceil(m.length*3/4);if(z<=r)return console.log(`[LargeDataProcessor] Canvas 压缩完成: 质量${(b*100).toFixed(0)}%, 约${(z/1024/1024).toFixed(2)}MB`),m;b-=.1}let g=.85;for(;g>=.3;){const v=Math.floor(u*g),m=Math.floor(d*g);h.width=v,h.height=m,p.drawImage(c,0,0,v,m);const z=h.toDataURL("image/jpeg",f),C=z.split(",")[1]||z,E=Math.ceil(C.length*3/4);if(E<=r)return console.log(`[LargeDataProcessor] Canvas 压缩完成(含缩放): ${v}x${m}, 约${(E/1024/1024).toFixed(2)}MB`),C;g-=.1}const y=h.toDataURL("image/jpeg",f),w=y.split(",")[1]||y;return console.warn(`[LargeDataProcessor] 压缩后仍约 ${(Math.ceil(w.length*3/4)/1024/1024).toFixed(2)}MB`),w}async function Bw(){try{return await yn("get_system_memory_info")}catch(e){return console.error("[LargeDataProcessor] 获取系统内存信息失败:",e),{total_memory_gb:0,platform:"unknown",message:"无法获取内存信息"}}}function Uw(){const e=performance.memory;if(!e)return null;const t=e.usedJSHeapSize,n=e.totalJSHeapSize,r=e.jsHeapSizeLimit,i=t/r*100;return{used:t,total:n,limit:r,usagePercent:i}}function s$(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(2)} KB`:e<1024*1024*1024?`${(e/1024/1024).toFixed(2)} MB`:`${(e/1024/1024/1024).toFixed(2)} GB`}const tK=Object.freeze(Object.defineProperty({__proto__:null,formatMemorySize:s$,getJSHeapMemory:Uw,getSystemMemoryInfo:Bw,processLargeData:Mm},Symbol.toStringTag,{value:"Module"}));async function Bl(){const e=Uw(),t=await Bw(),n=(e==null?void 0:e.used)||0,r=(e==null?void 0:e.limit)||0,i=(e==null?void 0:e.usagePercent)||0,a=i>70;let o="";return i>90?o="🔴 内存使用率极高!强烈建议使用 Rust 后端处理大数据":i>75?o="🟡 内存使用率较高,建议使用 Rust 后端处理大数据":i>50?o="🟢 内存使用正常,可以继续使用 JavaScript 处理":o="✅ 内存使用率很低,可以正常使用",{jsHeapUsed:n,jsHeapLimit:r,jsHeapUsagePercent:i,systemTotalGB:t.total_memory_gb,shouldUseRust:a,recommendation:o}}async function Dp(){const e=await Bl();console.log("═══════════════════════════════════════════════════════"),console.log("📊 内存状态报告"),console.log("═══════════════════════════════════════════════════════"),console.log("JavaScript 堆内存:"),console.log(` 已使用: ${s$(e.jsHeapUsed)}`),console.log(` 限制: ${s$(e.jsHeapLimit)}`),console.log(` 使用率: ${e.jsHeapUsagePercent.toFixed(2)}%`),console.log(`系统总内存: ${e.systemTotalGB.toFixed(2)} GB`),console.log(`建议: ${e.recommendation}`),console.log(`是否使用 Rust 后端: ${e.shouldUseRust?"是":"否"}`),console.log("═══════════════════════════════════════════════════════")}async function Fw(e,t,n){const r=await Bl(),i=r.shouldUseRust;return i&&console.log(`[MemoryBypass] 内存使用率 ${r.jsHeapUsagePercent.toFixed(2)}%,强制使用 Rust 后端处理`),Mm(e,t,n,i)}async function Ww(e){const t=await Bl(),n=e/1024/1024,i=(t.jsHeapLimit-t.jsHeapUsed)/1024/1024;return n>i?{canProcess:!1,reason:`数据大小 (${n.toFixed(2)} MB) 超过可用 JavaScript 堆内存 (${i.toFixed(2)} MB)`,suggestion:"建议使用 Rust 后端处理,不受 JavaScript 堆限制"}:t.jsHeapUsagePercent>80?{canProcess:!0,reason:`内存使用率较高 (${t.jsHeapUsagePercent.toFixed(2)}%)`,suggestion:"建议使用 Rust 后端处理,避免内存溢出"}:{canProcess:!0,reason:"内存充足,可以安全处理",suggestion:"可以使用 JavaScript 处理"}}typeof window<"u"&&(window.memoryBypass={getMemoryStatus:Bl,logMemoryStatus:Dp,smartProcessData:Fw,canSafelyProcess:Ww,getSystemMemoryInfo:Bw,getJSHeapMemory:Uw},console.log("💡 内存绕过工具已加载!在控制台中使用 window.memoryBypass 访问"),console.log(" 例如: await window.memoryBypass.logMemoryStatus()"));const nK=Object.freeze(Object.defineProperty({__proto__:null,canSafelyProcess:Ww,getMemoryStatus:Bl,getSystemMemoryInfo:Bw,logMemoryStatus:Dp,smartProcessData:Fw},Symbol.toStringTag,{value:"Module"})),ZP=5*1024*1024;async function QP(e){return e.startsWith("data:")?e.split(",")[1]||"":tO(e)}function U5(e){return new Promise((t,n)=>{const r=new Image;r.onload=()=>t({w:r.naturalWidth,h:r.naturalHeight}),r.onerror=()=>n(new Error("Failed to load image")),r.src=e})}async function rK(e){return!e||typeof e!="string"||e.startsWith("data:image/jpeg")?e:new Promise((t,n)=>{const r=new Image;r.onload=()=>{const i=document.createElement("canvas");i.width=r.naturalWidth,i.height=r.naturalHeight;const a=i.getContext("2d");if(!a){n(new Error("Cannot get canvas context"));return}a.drawImage(r,0,0);try{const o=i.toDataURL("image/jpeg",.9);t(o)}catch(o){n(o)}},r.onerror=()=>n(new Error("Failed to load image")),r.src=e})}function xb(e){var n,r;if(!e)return!1;if(e.startsWith("data:video")||e.includes("force_video_display=true"))return!0;const t=((r=(n=e.split(".").pop())==null?void 0:n.split("?")[0])==null?void 0:r.toLowerCase())||"";return["mp4","webm","ogg","mov"].includes(t)}async function eO(e){return(await fetch(e)).blob()}async function tO(e){const t=await eO(e);return new Promise((n,r)=>{const i=new FileReader;i.onloadend=()=>{const a=i.result,o=a.split(",")[1]||a;n(o)},i.onerror=r,i.readAsDataURL(t)})}async function nO(e,t=4.5*1024*1024,n=4096,r){const i=g=>{console.log(`[压缩] ${g}`),r==null||r(g)};try{const g=await QP(e),y=Math.ceil(g.length*3/4),w=await Bl();if(y>=ZP||w.shouldUseRust){i("使用 Rust 后端压缩");const m=await Mm("process_image",g,{maxDimension:n,maxSize:t,quality:.9},!0),z=Math.ceil(m.length*3/4);if(z<=t)return i("压缩完成"),m;i(`processLargeData 返回 ${(z/1024/1024).toFixed(2)}MB,超限,降级 Canvas 重压`)}}catch(g){console.warn("[compressImageForSuperRes] 处理失败,降级为 Canvas:",g)}const a=await new Promise((g,y)=>{const w=new Image;w.crossOrigin="anonymous",w.onload=()=>g(w),w.onerror=()=>y(new Error("图片加载失败")),w.src=e});let{naturalWidth:o,naturalHeight:l}=a;if(i(`原始尺寸: ${o}x${l}`),o>n||l>n){const g=Math.min(n/o,n/l);o=Math.floor(o*g),l=Math.floor(l*g),i(`尺寸超限,缩放至: ${o}x${l}`)}const c=document.createElement("canvas");c.width=o,c.height=l;const u=c.getContext("2d");if(!u)throw new Error("无法创建 Canvas 上下文");u.drawImage(a,0,0,o,l);let d=.95;const h=.3;let p;for(;d>=h;){const g=c.toDataURL("image/jpeg",d);p=g.split(",")[1]||g;const y=Math.ceil(p.length*3/4);if(i(`质量 ${(d*100).toFixed(0)}%: 约 ${(y/1024/1024).toFixed(2)}MB`),y<=t)return i(`压缩完成,最终大小约 ${(y/1024/1024).toFixed(2)}MB`),p;d-=.1}i("质量压缩不足,尝试缩小尺寸...");let f=.8;for(;f>=.3;){const g=Math.floor(o*f),y=Math.floor(l*f);c.width=g,c.height=y,u.drawImage(a,0,0,g,y);const w=c.toDataURL("image/jpeg",h);p=w.split(",")[1]||w;const v=Math.ceil(p.length*3/4);if(i(`尺寸 ${g}x${y}, 质量 ${(h*100).toFixed(0)}%: 约 ${(v/1024/1024).toFixed(2)}MB`),v<=t)return i(`压缩完成,最终尺寸 ${g}x${y},大小约 ${(v/1024/1024).toFixed(2)}MB`),p;f-=.1}i("警告:无法将图片压缩到目标大小,使用最小尺寸");const b=c.toDataURL("image/jpeg",h);return b.split(",")[1]||b}const sK=100*1024,iK=5*1024*1024;async function $h(e,t=1.5*1024*1024,n=3*1024*1024,r=1920,i=0){if(e.startsWith("data:")){const m=e.split(",")[1]||"",z=Math.ceil(m.length*3/4);try{const C=await U5(e),E=C.w<=r&&C.h<=r,I=i<=0||C.w>=i&&C.h>=i;if(z>=sK&&z<=iK&&E&&I)return console.log(`[compressImageForAPI] 图片未超过4.5MB (${(z/1024).toFixed(0)}KB, ${C.w}x${C.h}),按原尺寸发送`),e;if(z>=100*1024&&z<=n&&E&&I)return console.log(`[compressImageForAPI] 图片已满足要求 (${(z/1024).toFixed(0)}KB, ${C.w}x${C.h}),跳过压缩`),e}catch{}}try{const m=await QP(e),z=Math.ceil(m.length*3/4),C=await Bl();if(z>=ZP||C.shouldUseRust){const I=await Mm("process_image",m,{maxDimension:r,maxSize:t,quality:.92});return console.log("[compressImageForAPI] Rust 后端压缩完成"),`data:image/jpeg;base64,${I}`}}catch(m){console.warn("[compressImageForAPI] Rust 处理失败,降级为 Canvas 压缩:",m)}const a=await new Promise((m,z)=>{const C=new Image;C.crossOrigin="anonymous",C.onload=()=>m(C),C.onerror=()=>z(new Error("图片加载失败")),C.src=e});let{naturalWidth:o,naturalHeight:l}=a;if(console.log(`[compressImageForAPI] 原始尺寸: ${o}x${l}`),o>r||l>r){const m=Math.min(r/o,r/l);let z=Math.floor(o*m),C=Math.floor(l*m);if(i>0){const E=Math.min(z,C);if(E=h;){const m=c.toDataURL("image/jpeg",d),z=m.split(",")[1]||"",C=Math.ceil(z.length*3/4);if(C>=100*1024&&C<=n)return console.log(`[compressImageForAPI] 压缩完成: 质量${(d*100).toFixed(0)}%, 大小${(C/1024/1024).toFixed(2)}MB, 尺寸${o}x${l}`),m;if(C>n)d-=.03;else break}let p=.9;const f=.7;for(;p>=f;){let m=Math.floor(o*p),z=Math.floor(l*p);if(i>0&&(m=100*1024&&I<=n)return console.log(`[compressImageForAPI] 压缩完成(含缩放): 质量85%, 大小${(I/1024/1024).toFixed(2)}MB, 尺寸${m}x${z}`),C;if(I>n)p-=.05;else break}let b=Math.floor(o*f),g=Math.floor(l*f);if(i>0){const m=Math.min(b,g);if(m0&&a<=oK)return console.log(`[compressImageForKling] 图片未超过4.5MB (${(a/1024).toFixed(0)}KB),按原尺寸 ${n}x${r} 发送`),e;const o=await $h(e,aK,Sj,lK,C2),l=o.split(",")[1]||"",c=Math.ceil(l.length*3/4);return c>Sj&&console.warn(`[compressImageForKling] 压缩后仍约 ${(c/1024/1024).toFixed(1)}MB,已尽量缩小`),o}const jj=11*1024*1024,cK=8*1024*1024,N2=.25,E2=4;async function sO(e){var g;const t=await new Promise((y,w)=>{const v=new Image;v.crossOrigin="anonymous",v.onload=()=>y(v),v.onerror=()=>w(new Error("Vidu 图片加载失败")),v.src=e});let n=t.naturalWidth,r=t.naturalHeight;const i=n/r;let a=0,o=0,l=n,c=r;i>E2?(l=Math.round(r*E2),a=Math.round((n-l)/2)):iE2||itypeof u=="string"&&u.trim()?u.trim():"").find(Boolean)||void 0;return hK.has(i)?{terminal:"failed",videoUrl:o,errorMsg:c||"生成失败"}:o?dK.has(i)||i===""?{terminal:"success",videoUrl:o}:uK.has(i)?{terminal:"running"}:{terminal:"success",videoUrl:o}:{terminal:"running"}}class fK{constructor(t={}){Mn(this,"queue",new Map);Mn(this,"processing",!1);Mn(this,"idleCallbackId",null);Mn(this,"config");Mn(this,"stats",{queued:0,processed:0,failed:0,skipped:0});Mn(this,"paused",!1);this.config={batchSize:t.batchSize??5,maxRetries:t.maxRetries??3,itemTimeout:t.itemTimeout??3e4,maxProcessTime:t.maxProcessTime??5e3}}enqueue(t,n,r="image",i=50){if(this.queue.has(t)){const a=this.queue.get(t);i>a.priority&&(a.priority=i);return}this.queue.set(t,{id:t,url:n,type:r,priority:Math.max(0,Math.min(100,i)),timestamp:Date.now(),retries:0}),this.stats.queued++,this.scheduleProcessing()}enqueueBatch(t){t.forEach(n=>{this.enqueue(n.id,n.url,n.type||"image",n.priority||50)})}getQueueSize(){return this.queue.size}getStats(){return{...this.stats}}clear(){this.queue.clear(),this.idleCallbackId!==null&&(cancelIdleCallback(this.idleCallbackId),this.idleCallbackId=null),this.processing=!1}pause(){this.paused=!0,this.idleCallbackId!==null&&(cancelIdleCallback(this.idleCallbackId),this.idleCallbackId=null),console.log("[AssetCacheQueue] 队列已暂停")}resume(){this.paused=!1,this.queue.size>0&&this.scheduleProcessing(),console.log("[AssetCacheQueue] 队列已恢复")}scheduleProcessing(){this.processing||this.queue.size===0||this.paused||(typeof requestIdleCallback<"u"?this.idleCallbackId=requestIdleCallback(()=>this.processQueue(),{timeout:this.config.itemTimeout}):setTimeout(()=>this.processQueue(),0))}async processQueue(){if(this.processing||this.queue.size===0)return;this.processing=!0;const t=Date.now();try{const n=Array.from(this.queue.values()).sort((r,i)=>i.priority-r.priority).slice(0,this.config.batchSize);for(const r of n){if(Date.now()-t>this.config.maxProcessTime){console.log("[AssetCacheQueue] 处理时间超限,暂停处理");break}await this.processItem(r),this.queue.delete(r.id)}}catch(n){console.error("[AssetCacheQueue] 处理队列出错:",n)}finally{this.processing=!1,this.idleCallbackId=null,this.queue.size>0&&this.scheduleProcessing()}}async processItem(t){try{const n=await Xr.getAssetRecord(t.id);if(n&&n.remoteUrl===t.url){this.stats.skipped++;return}await Xr.saveAsset(t.id,t.url)?(this.stats.processed++,console.log(`[AssetCacheQueue] ✅ 缓存完成: ${t.id}`)):t.retries{const t=e.toLowerCase();return t.includes(".mp4")||t.includes(".webm")||t.includes(".mov")||t.includes("video")||t.includes("/v/")?"video":t.includes(".mp3")||t.includes(".wav")||t.includes(".ogg")||t.includes(".m4a")||t.includes(".aac")||t.includes(".flac")||t.includes("audio")?"audio":"image"};async function uo(e,t){const n=[];if(e.url){const r=e.type||xK(e.url),i=r==="video"&&gK(e.url)?Dw(t,e.url):t;n.push({id:i,url:e.url,type:r,priority:100})}if(e.audioUrl&&e.audioUrl!==e.url&&n.push({id:`${t}_audio`,url:e.audioUrl,type:"audio",priority:80}),e.mjImages&&Array.isArray(e.mjImages)){const r=e.type==="video"?"video":"image";e.mjImages.forEach((i,a)=>{i&&typeof i=="string"&&n.push({id:`${t}_mj_${a}`,url:i,type:r,priority:60})})}if(e.mjOriginalUrl&&n.push({id:`${t}_mj_original`,url:e.mjOriginalUrl,type:"image",priority:60}),e.thumbnailUrl&&n.push({id:`${t}_thumbnail`,url:e.thumbnailUrl,type:"image",priority:30}),n.length>0){mK.enqueueBatch(n),console.log(`[AssetDownloader] 📥 任务 ${t}: ${n.length} 个资源已加入缓存队列`);const r=new CustomEvent("allAssetsDownloadComplete",{detail:{taskId:t,queued:n.length}});window.dispatchEvent(r)}}const oO=Object.freeze(Object.defineProperty({__proto__:null,ensureHistoryItemAssetsDownloaded:uo,getViduVideoAssetId:Dw},Symbol.toStringTag,{value:"Module"})),lO=new Map,i$=new Map,bK=(e,t)=>{console.log("[KlingCallbackService] 注册 callback 处理函数:",e),lO.set(e,t);const n=i$.get(e);n&&(console.log("[KlingCallbackService] 处理待处理的 callback 数据:",e),t(n),i$.delete(e))},yK=e=>{var n,r,i,a;console.log("[KlingCallbackService] 收到 callback 数据:",{task_id:e.task_id,task_status:e.task_status,has_videos:!!((r=(n=e.task_result)==null?void 0:n.videos)!=null&&r.length),has_images:!!((a=(i=e.task_result)==null?void 0:i.images)!=null&&a.length)});const t=lO.get(e.task_id);t?(console.log("[KlingCallbackService] 调用已注册的处理函数"),t(e)):(console.log("[KlingCallbackService] 没有找到处理函数,存储为待处理数据"),i$.set(e.task_id,e))};function vK(e){return e.includes("jimeng")?"jimeng":e.includes("gpt-image")||e.includes("gpt-4o-image")?"gpt-image":e.includes("flux-kontext")?"flux-kontext":e.includes("qwen-image-edit")?"qwen-image-edit":e.startsWith("grsai-nano-banana")?"grsai":e.includes("nano-banana-2")||e.includes("gemini-3.1-flash-image-preview")?"nano-banana-2":e.includes("nano-banana")?"nano-banana":e.includes("mj")||e.toLowerCase().includes("midjourney")?"midjourney":"generic"}var Cy={exports:{}};function Qg(e){throw new Error('Could not dynamically require "'+e+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var Ny={exports:{}};const wK={},_K=Object.freeze(Object.defineProperty({__proto__:null,default:wK},Symbol.toStringTag,{value:"Module"})),zK=oH(_K);var $K=Ny.exports,Ej;function Vs(){return Ej||(Ej=1,(function(e,t){(function(n,r){e.exports=r()})($K,function(){var n=n||(function(r,i){var a;if(typeof window<"u"&&window.crypto&&(a=window.crypto),typeof self<"u"&&self.crypto&&(a=self.crypto),typeof globalThis<"u"&&globalThis.crypto&&(a=globalThis.crypto),!a&&typeof window<"u"&&window.msCrypto&&(a=window.msCrypto),!a&&typeof Mp<"u"&&Mp.crypto&&(a=Mp.crypto),!a&&typeof Qg=="function")try{a=zK}catch{}var o=function(){if(a){if(typeof a.getRandomValues=="function")try{return a.getRandomValues(new Uint32Array(1))[0]}catch{}if(typeof a.randomBytes=="function")try{return a.randomBytes(4).readInt32LE()}catch{}}throw new Error("Native crypto module could not be used to get secure random number.")},l=Object.create||(function(){function v(){}return function(m){var z;return v.prototype=m,z=new v,v.prototype=null,z}})(),c={},u=c.lib={},d=u.Base=(function(){return{extend:function(v){var m=l(this);return v&&m.mixIn(v),(!m.hasOwnProperty("init")||this.init===m.init)&&(m.init=function(){m.$super.init.apply(this,arguments)}),m.init.prototype=m,m.$super=this,m},create:function(){var v=this.extend();return v.init.apply(v,arguments),v},init:function(){},mixIn:function(v){for(var m in v)v.hasOwnProperty(m)&&(this[m]=v[m]);v.hasOwnProperty("toString")&&(this.toString=v.toString)},clone:function(){return this.init.prototype.extend(this)}}})(),h=u.WordArray=d.extend({init:function(v,m){v=this.words=v||[],m!=i?this.sigBytes=m:this.sigBytes=v.length*4},toString:function(v){return(v||f).stringify(this)},concat:function(v){var m=this.words,z=v.words,C=this.sigBytes,E=v.sigBytes;if(this.clamp(),C%4)for(var I=0;I>>2]>>>24-I%4*8&255;m[C+I>>>2]|=R<<24-(C+I)%4*8}else for(var A=0;A>>2]=z[A>>>2];return this.sigBytes+=E,this},clamp:function(){var v=this.words,m=this.sigBytes;v[m>>>2]&=4294967295<<32-m%4*8,v.length=r.ceil(m/4)},clone:function(){var v=d.clone.call(this);return v.words=this.words.slice(0),v},random:function(v){for(var m=[],z=0;z>>2]>>>24-E%4*8&255;C.push((I>>>4).toString(16)),C.push((I&15).toString(16))}return C.join("")},parse:function(v){for(var m=v.length,z=[],C=0;C>>3]|=parseInt(v.substr(C,2),16)<<24-C%8*4;return new h.init(z,m/2)}},b=p.Latin1={stringify:function(v){for(var m=v.words,z=v.sigBytes,C=[],E=0;E>>2]>>>24-E%4*8&255;C.push(String.fromCharCode(I))}return C.join("")},parse:function(v){for(var m=v.length,z=[],C=0;C>>2]|=(v.charCodeAt(C)&255)<<24-C%4*8;return new h.init(z,m)}},g=p.Utf8={stringify:function(v){try{return decodeURIComponent(escape(b.stringify(v)))}catch{throw new Error("Malformed UTF-8 data")}},parse:function(v){return b.parse(unescape(encodeURIComponent(v)))}},y=u.BufferedBlockAlgorithm=d.extend({reset:function(){this._data=new h.init,this._nDataBytes=0},_append:function(v){typeof v=="string"&&(v=g.parse(v)),this._data.concat(v),this._nDataBytes+=v.sigBytes},_process:function(v){var m,z=this._data,C=z.words,E=z.sigBytes,I=this.blockSize,R=I*4,A=E/R;v?A=r.ceil(A):A=r.max((A|0)-this._minBufferSize,0);var O=A*I,F=r.min(O*4,E);if(O){for(var L=0;L>>2]|=c[h]<<24-h%4*8;o.call(this,d,u)}else o.apply(this,arguments)};l.prototype=a}})(),n.lib.WordArray})})(Iy)),Iy.exports}var ky={exports:{}},NK=ky.exports,Aj;function EK(){return Aj||(Aj=1,(function(e,t){(function(n,r){e.exports=r(Vs())})(NK,function(n){return(function(){var r=n,i=r.lib,a=i.WordArray,o=r.enc;o.Utf16=o.Utf16BE={stringify:function(c){for(var u=c.words,d=c.sigBytes,h=[],p=0;p>>2]>>>16-p%4*8&65535;h.push(String.fromCharCode(f))}return h.join("")},parse:function(c){for(var u=c.length,d=[],h=0;h>>1]|=c.charCodeAt(h)<<16-h%2*16;return a.create(d,u*2)}},o.Utf16LE={stringify:function(c){for(var u=c.words,d=c.sigBytes,h=[],p=0;p>>2]>>>16-p%4*8&65535);h.push(String.fromCharCode(f))}return h.join("")},parse:function(c){for(var u=c.length,d=[],h=0;h>>1]|=l(c.charCodeAt(h)<<16-h%2*16);return a.create(d,u*2)}};function l(c){return c<<8&4278255360|c>>>8&16711935}})(),n.enc.Utf16})})(ky)),ky.exports}var Ay={exports:{}},IK=Ay.exports,Mj;function sf(){return Mj||(Mj=1,(function(e,t){(function(n,r){e.exports=r(Vs())})(IK,function(n){return(function(){var r=n,i=r.lib,a=i.WordArray,o=r.enc;o.Base64={stringify:function(c){var u=c.words,d=c.sigBytes,h=this._map;c.clamp();for(var p=[],f=0;f>>2]>>>24-f%4*8&255,g=u[f+1>>>2]>>>24-(f+1)%4*8&255,y=u[f+2>>>2]>>>24-(f+2)%4*8&255,w=b<<16|g<<8|y,v=0;v<4&&f+v*.75>>6*(3-v)&63));var m=h.charAt(64);if(m)for(;p.length%4;)p.push(m);return p.join("")},parse:function(c){var u=c.length,d=this._map,h=this._reverseMap;if(!h){h=this._reverseMap=[];for(var p=0;p>>6-f%4*2,y=b|g;h[p>>>2]|=y<<24-p%4*8,p++}return a.create(h,p)}})(),n.enc.Base64})})(Ay)),Ay.exports}var My={exports:{}},kK=My.exports,Tj;function AK(){return Tj||(Tj=1,(function(e,t){(function(n,r){e.exports=r(Vs())})(kK,function(n){return(function(){var r=n,i=r.lib,a=i.WordArray,o=r.enc;o.Base64url={stringify:function(c,u){u===void 0&&(u=!0);var d=c.words,h=c.sigBytes,p=u?this._safe_map:this._map;c.clamp();for(var f=[],b=0;b>>2]>>>24-b%4*8&255,y=d[b+1>>>2]>>>24-(b+1)%4*8&255,w=d[b+2>>>2]>>>24-(b+2)%4*8&255,v=g<<16|y<<8|w,m=0;m<4&&b+m*.75>>6*(3-m)&63));var z=p.charAt(64);if(z)for(;f.length%4;)f.push(z);return f.join("")},parse:function(c,u){u===void 0&&(u=!0);var d=c.length,h=u?this._safe_map:this._map,p=this._reverseMap;if(!p){p=this._reverseMap=[];for(var f=0;f>>6-f%4*2,y=b|g;h[p>>>2]|=y<<24-p%4*8,p++}return a.create(h,p)}})(),n.enc.Base64url})})(My)),My.exports}var Ty={exports:{}},MK=Ty.exports,Rj;function af(){return Rj||(Rj=1,(function(e,t){(function(n,r){e.exports=r(Vs())})(MK,function(n){return(function(r){var i=n,a=i.lib,o=a.WordArray,l=a.Hasher,c=i.algo,u=[];(function(){for(var g=0;g<64;g++)u[g]=r.abs(r.sin(g+1))*4294967296|0})();var d=c.MD5=l.extend({_doReset:function(){this._hash=new o.init([1732584193,4023233417,2562383102,271733878])},_doProcessBlock:function(g,y){for(var w=0;w<16;w++){var v=y+w,m=g[v];g[v]=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360}var z=this._hash.words,C=g[y+0],E=g[y+1],I=g[y+2],R=g[y+3],A=g[y+4],O=g[y+5],F=g[y+6],L=g[y+7],X=g[y+8],T=g[y+9],q=g[y+10],H=g[y+11],J=g[y+12],Z=g[y+13],B=g[y+14],V=g[y+15],N=z[0],j=z[1],k=z[2],W=z[3];N=h(N,j,k,W,C,7,u[0]),W=h(W,N,j,k,E,12,u[1]),k=h(k,W,N,j,I,17,u[2]),j=h(j,k,W,N,R,22,u[3]),N=h(N,j,k,W,A,7,u[4]),W=h(W,N,j,k,O,12,u[5]),k=h(k,W,N,j,F,17,u[6]),j=h(j,k,W,N,L,22,u[7]),N=h(N,j,k,W,X,7,u[8]),W=h(W,N,j,k,T,12,u[9]),k=h(k,W,N,j,q,17,u[10]),j=h(j,k,W,N,H,22,u[11]),N=h(N,j,k,W,J,7,u[12]),W=h(W,N,j,k,Z,12,u[13]),k=h(k,W,N,j,B,17,u[14]),j=h(j,k,W,N,V,22,u[15]),N=p(N,j,k,W,E,5,u[16]),W=p(W,N,j,k,F,9,u[17]),k=p(k,W,N,j,H,14,u[18]),j=p(j,k,W,N,C,20,u[19]),N=p(N,j,k,W,O,5,u[20]),W=p(W,N,j,k,q,9,u[21]),k=p(k,W,N,j,V,14,u[22]),j=p(j,k,W,N,A,20,u[23]),N=p(N,j,k,W,T,5,u[24]),W=p(W,N,j,k,B,9,u[25]),k=p(k,W,N,j,R,14,u[26]),j=p(j,k,W,N,X,20,u[27]),N=p(N,j,k,W,Z,5,u[28]),W=p(W,N,j,k,I,9,u[29]),k=p(k,W,N,j,L,14,u[30]),j=p(j,k,W,N,J,20,u[31]),N=f(N,j,k,W,O,4,u[32]),W=f(W,N,j,k,X,11,u[33]),k=f(k,W,N,j,H,16,u[34]),j=f(j,k,W,N,B,23,u[35]),N=f(N,j,k,W,E,4,u[36]),W=f(W,N,j,k,A,11,u[37]),k=f(k,W,N,j,L,16,u[38]),j=f(j,k,W,N,q,23,u[39]),N=f(N,j,k,W,Z,4,u[40]),W=f(W,N,j,k,C,11,u[41]),k=f(k,W,N,j,R,16,u[42]),j=f(j,k,W,N,F,23,u[43]),N=f(N,j,k,W,T,4,u[44]),W=f(W,N,j,k,J,11,u[45]),k=f(k,W,N,j,V,16,u[46]),j=f(j,k,W,N,I,23,u[47]),N=b(N,j,k,W,C,6,u[48]),W=b(W,N,j,k,L,10,u[49]),k=b(k,W,N,j,B,15,u[50]),j=b(j,k,W,N,O,21,u[51]),N=b(N,j,k,W,J,6,u[52]),W=b(W,N,j,k,R,10,u[53]),k=b(k,W,N,j,q,15,u[54]),j=b(j,k,W,N,E,21,u[55]),N=b(N,j,k,W,X,6,u[56]),W=b(W,N,j,k,V,10,u[57]),k=b(k,W,N,j,F,15,u[58]),j=b(j,k,W,N,Z,21,u[59]),N=b(N,j,k,W,A,6,u[60]),W=b(W,N,j,k,H,10,u[61]),k=b(k,W,N,j,I,15,u[62]),j=b(j,k,W,N,T,21,u[63]),z[0]=z[0]+N|0,z[1]=z[1]+j|0,z[2]=z[2]+k|0,z[3]=z[3]+W|0},_doFinalize:function(){var g=this._data,y=g.words,w=this._nDataBytes*8,v=g.sigBytes*8;y[v>>>5]|=128<<24-v%32;var m=r.floor(w/4294967296),z=w;y[(v+64>>>9<<4)+15]=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360,y[(v+64>>>9<<4)+14]=(z<<8|z>>>24)&16711935|(z<<24|z>>>8)&4278255360,g.sigBytes=(y.length+1)*4,this._process();for(var C=this._hash,E=C.words,I=0;I<4;I++){var R=E[I];E[I]=(R<<8|R>>>24)&16711935|(R<<24|R>>>8)&4278255360}return C},clone:function(){var g=l.clone.call(this);return g._hash=this._hash.clone(),g}});function h(g,y,w,v,m,z,C){var E=g+(y&w|~y&v)+m+C;return(E<>>32-z)+y}function p(g,y,w,v,m,z,C){var E=g+(y&v|w&~v)+m+C;return(E<>>32-z)+y}function f(g,y,w,v,m,z,C){var E=g+(y^w^v)+m+C;return(E<>>32-z)+y}function b(g,y,w,v,m,z,C){var E=g+(w^(y|~v))+m+C;return(E<>>32-z)+y}i.MD5=l._createHelper(d),i.HmacMD5=l._createHmacHelper(d)})(Math),n.MD5})})(Ty)),Ty.exports}var Ry={exports:{}},TK=Ry.exports,Pj;function cO(){return Pj||(Pj=1,(function(e,t){(function(n,r){e.exports=r(Vs())})(TK,function(n){return(function(){var r=n,i=r.lib,a=i.WordArray,o=i.Hasher,l=r.algo,c=[],u=l.SHA1=o.extend({_doReset:function(){this._hash=new a.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(d,h){for(var p=this._hash.words,f=p[0],b=p[1],g=p[2],y=p[3],w=p[4],v=0;v<80;v++){if(v<16)c[v]=d[h+v]|0;else{var m=c[v-3]^c[v-8]^c[v-14]^c[v-16];c[v]=m<<1|m>>>31}var z=(f<<5|f>>>27)+w+c[v];v<20?z+=(b&g|~b&y)+1518500249:v<40?z+=(b^g^y)+1859775393:v<60?z+=(b&g|b&y|g&y)-1894007588:z+=(b^g^y)-899497514,w=y,y=g,g=b<<30|b>>>2,b=f,f=z}p[0]=p[0]+f|0,p[1]=p[1]+b|0,p[2]=p[2]+g|0,p[3]=p[3]+y|0,p[4]=p[4]+w|0},_doFinalize:function(){var d=this._data,h=d.words,p=this._nDataBytes*8,f=d.sigBytes*8;return h[f>>>5]|=128<<24-f%32,h[(f+64>>>9<<4)+14]=Math.floor(p/4294967296),h[(f+64>>>9<<4)+15]=p,d.sigBytes=h.length*4,this._process(),this._hash},clone:function(){var d=o.clone.call(this);return d._hash=this._hash.clone(),d}});r.SHA1=o._createHelper(u),r.HmacSHA1=o._createHmacHelper(u)})(),n.SHA1})})(Ry)),Ry.exports}var Py={exports:{}},RK=Py.exports,Oj;function W5(){return Oj||(Oj=1,(function(e,t){(function(n,r){e.exports=r(Vs())})(RK,function(n){return(function(r){var i=n,a=i.lib,o=a.WordArray,l=a.Hasher,c=i.algo,u=[],d=[];(function(){function f(w){for(var v=r.sqrt(w),m=2;m<=v;m++)if(!(w%m))return!1;return!0}function b(w){return(w-(w|0))*4294967296|0}for(var g=2,y=0;y<64;)f(g)&&(y<8&&(u[y]=b(r.pow(g,1/2))),d[y]=b(r.pow(g,1/3)),y++),g++})();var h=[],p=c.SHA256=l.extend({_doReset:function(){this._hash=new o.init(u.slice(0))},_doProcessBlock:function(f,b){for(var g=this._hash.words,y=g[0],w=g[1],v=g[2],m=g[3],z=g[4],C=g[5],E=g[6],I=g[7],R=0;R<64;R++){if(R<16)h[R]=f[b+R]|0;else{var A=h[R-15],O=(A<<25|A>>>7)^(A<<14|A>>>18)^A>>>3,F=h[R-2],L=(F<<15|F>>>17)^(F<<13|F>>>19)^F>>>10;h[R]=O+h[R-7]+L+h[R-16]}var X=z&C^~z&E,T=y&w^y&v^w&v,q=(y<<30|y>>>2)^(y<<19|y>>>13)^(y<<10|y>>>22),H=(z<<26|z>>>6)^(z<<21|z>>>11)^(z<<7|z>>>25),J=I+H+X+d[R]+h[R],Z=q+T;I=E,E=C,C=z,z=m+J|0,m=v,v=w,w=y,y=J+Z|0}g[0]=g[0]+y|0,g[1]=g[1]+w|0,g[2]=g[2]+v|0,g[3]=g[3]+m|0,g[4]=g[4]+z|0,g[5]=g[5]+C|0,g[6]=g[6]+E|0,g[7]=g[7]+I|0},_doFinalize:function(){var f=this._data,b=f.words,g=this._nDataBytes*8,y=f.sigBytes*8;return b[y>>>5]|=128<<24-y%32,b[(y+64>>>9<<4)+14]=r.floor(g/4294967296),b[(y+64>>>9<<4)+15]=g,f.sigBytes=b.length*4,this._process(),this._hash},clone:function(){var f=l.clone.call(this);return f._hash=this._hash.clone(),f}});i.SHA256=l._createHelper(p),i.HmacSHA256=l._createHmacHelper(p)})(Math),n.SHA256})})(Py)),Py.exports}var Oy={exports:{}},PK=Oy.exports,Lj;function OK(){return Lj||(Lj=1,(function(e,t){(function(n,r,i){e.exports=r(Vs(),W5())})(PK,function(n){return(function(){var r=n,i=r.lib,a=i.WordArray,o=r.algo,l=o.SHA256,c=o.SHA224=l.extend({_doReset:function(){this._hash=new a.init([3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428])},_doFinalize:function(){var u=l._doFinalize.call(this);return u.sigBytes-=4,u}});r.SHA224=l._createHelper(c),r.HmacSHA224=l._createHmacHelper(c)})(),n.SHA224})})(Oy)),Oy.exports}var Ly={exports:{}},LK=Ly.exports,Bj;function uO(){return Bj||(Bj=1,(function(e,t){(function(n,r,i){e.exports=r(Vs(),Vw())})(LK,function(n){return(function(){var r=n,i=r.lib,a=i.Hasher,o=r.x64,l=o.Word,c=o.WordArray,u=r.algo;function d(){return l.create.apply(l,arguments)}var h=[d(1116352408,3609767458),d(1899447441,602891725),d(3049323471,3964484399),d(3921009573,2173295548),d(961987163,4081628472),d(1508970993,3053834265),d(2453635748,2937671579),d(2870763221,3664609560),d(3624381080,2734883394),d(310598401,1164996542),d(607225278,1323610764),d(1426881987,3590304994),d(1925078388,4068182383),d(2162078206,991336113),d(2614888103,633803317),d(3248222580,3479774868),d(3835390401,2666613458),d(4022224774,944711139),d(264347078,2341262773),d(604807628,2007800933),d(770255983,1495990901),d(1249150122,1856431235),d(1555081692,3175218132),d(1996064986,2198950837),d(2554220882,3999719339),d(2821834349,766784016),d(2952996808,2566594879),d(3210313671,3203337956),d(3336571891,1034457026),d(3584528711,2466948901),d(113926993,3758326383),d(338241895,168717936),d(666307205,1188179964),d(773529912,1546045734),d(1294757372,1522805485),d(1396182291,2643833823),d(1695183700,2343527390),d(1986661051,1014477480),d(2177026350,1206759142),d(2456956037,344077627),d(2730485921,1290863460),d(2820302411,3158454273),d(3259730800,3505952657),d(3345764771,106217008),d(3516065817,3606008344),d(3600352804,1432725776),d(4094571909,1467031594),d(275423344,851169720),d(430227734,3100823752),d(506948616,1363258195),d(659060556,3750685593),d(883997877,3785050280),d(958139571,3318307427),d(1322822218,3812723403),d(1537002063,2003034995),d(1747873779,3602036899),d(1955562222,1575990012),d(2024104815,1125592928),d(2227730452,2716904306),d(2361852424,442776044),d(2428436474,593698344),d(2756734187,3733110249),d(3204031479,2999351573),d(3329325298,3815920427),d(3391569614,3928383900),d(3515267271,566280711),d(3940187606,3454069534),d(4118630271,4000239992),d(116418474,1914138554),d(174292421,2731055270),d(289380356,3203993006),d(460393269,320620315),d(685471733,587496836),d(852142971,1086792851),d(1017036298,365543100),d(1126000580,2618297676),d(1288033470,3409855158),d(1501505948,4234509866),d(1607167915,987167468),d(1816402316,1246189591)],p=[];(function(){for(var b=0;b<80;b++)p[b]=d()})();var f=u.SHA512=a.extend({_doReset:function(){this._hash=new c.init([new l.init(1779033703,4089235720),new l.init(3144134277,2227873595),new l.init(1013904242,4271175723),new l.init(2773480762,1595750129),new l.init(1359893119,2917565137),new l.init(2600822924,725511199),new l.init(528734635,4215389547),new l.init(1541459225,327033209)])},_doProcessBlock:function(b,g){for(var y=this._hash.words,w=y[0],v=y[1],m=y[2],z=y[3],C=y[4],E=y[5],I=y[6],R=y[7],A=w.high,O=w.low,F=v.high,L=v.low,X=m.high,T=m.low,q=z.high,H=z.low,J=C.high,Z=C.low,B=E.high,V=E.low,N=I.high,j=I.low,k=R.high,W=R.low,M=A,Y=O,se=F,ie=L,oe=X,re=T,ee=q,pe=H,we=J,Q=Z,me=B,ue=V,U=N,G=j,te=k,ge=W,ne=0;ne<80;ne++){var le,fe,be=p[ne];if(ne<16)fe=be.high=b[g+ne*2]|0,le=be.low=b[g+ne*2+1]|0;else{var de=p[ne-15],$e=de.high,ze=de.low,_e=($e>>>1|ze<<31)^($e>>>8|ze<<24)^$e>>>7,Ee=(ze>>>1|$e<<31)^(ze>>>8|$e<<24)^(ze>>>7|$e<<25),Ce=p[ne-2],xe=Ce.high,Ne=Ce.low,ve=(xe>>>19|Ne<<13)^(xe<<3|Ne>>>29)^xe>>>6,ke=(Ne>>>19|xe<<13)^(Ne<<3|xe>>>29)^(Ne>>>6|xe<<26),Ie=p[ne-7],Pe=Ie.high,Te=Ie.low,Be=p[ne-16],He=Be.high,Je=Be.low;le=Ee+Te,fe=_e+Pe+(le>>>0>>0?1:0),le=le+ke,fe=fe+ve+(le>>>0>>0?1:0),le=le+Je,fe=fe+He+(le>>>0>>0?1:0),be.high=fe,be.low=le}var Me=we&me^~we&U,Re=Q&ue^~Q&G,Ve=M&se^M&oe^se&oe,Ze=Y&ie^Y&re^ie&re,je=(M>>>28|Y<<4)^(M<<30|Y>>>2)^(M<<25|Y>>>7),Le=(Y>>>28|M<<4)^(Y<<30|M>>>2)^(Y<<25|M>>>7),Xe=(we>>>14|Q<<18)^(we>>>18|Q<<14)^(we<<23|Q>>>9),qe=(Q>>>14|we<<18)^(Q>>>18|we<<14)^(Q<<23|we>>>9),tt=h[ne],Ye=tt.high,ct=tt.low,pt=ge+qe,ht=te+Xe+(pt>>>0>>0?1:0),pt=pt+Re,ht=ht+Me+(pt>>>0>>0?1:0),pt=pt+ct,ht=ht+Ye+(pt>>>0>>0?1:0),pt=pt+le,ht=ht+fe+(pt>>>0>>0?1:0),wt=Le+Ze,$t=je+Ve+(wt>>>0>>0?1:0);te=U,ge=G,U=me,G=ue,me=we,ue=Q,Q=pe+pt|0,we=ee+ht+(Q>>>0>>0?1:0)|0,ee=oe,pe=re,oe=se,re=ie,se=M,ie=Y,Y=pt+wt|0,M=ht+$t+(Y>>>0>>0?1:0)|0}O=w.low=O+Y,w.high=A+M+(O>>>0>>0?1:0),L=v.low=L+ie,v.high=F+se+(L>>>0>>0?1:0),T=m.low=T+re,m.high=X+oe+(T>>>0>>0?1:0),H=z.low=H+pe,z.high=q+ee+(H>>>0>>0?1:0),Z=C.low=Z+Q,C.high=J+we+(Z>>>0>>0?1:0),V=E.low=V+ue,E.high=B+me+(V>>>0>>0?1:0),j=I.low=j+G,I.high=N+U+(j>>>0>>0?1:0),W=R.low=W+ge,R.high=k+te+(W>>>0>>0?1:0)},_doFinalize:function(){var b=this._data,g=b.words,y=this._nDataBytes*8,w=b.sigBytes*8;g[w>>>5]|=128<<24-w%32,g[(w+128>>>10<<5)+30]=Math.floor(y/4294967296),g[(w+128>>>10<<5)+31]=y,b.sigBytes=g.length*4,this._process();var v=this._hash.toX32();return v},clone:function(){var b=a.clone.call(this);return b._hash=this._hash.clone(),b},blockSize:1024/32});r.SHA512=a._createHelper(f),r.HmacSHA512=a._createHmacHelper(f)})(),n.SHA512})})(Ly)),Ly.exports}var By={exports:{}},BK=By.exports,Uj;function UK(){return Uj||(Uj=1,(function(e,t){(function(n,r,i){e.exports=r(Vs(),Vw(),uO())})(BK,function(n){return(function(){var r=n,i=r.x64,a=i.Word,o=i.WordArray,l=r.algo,c=l.SHA512,u=l.SHA384=c.extend({_doReset:function(){this._hash=new o.init([new a.init(3418070365,3238371032),new a.init(1654270250,914150663),new a.init(2438529370,812702999),new a.init(355462360,4144912697),new a.init(1731405415,4290775857),new a.init(2394180231,1750603025),new a.init(3675008525,1694076839),new a.init(1203062813,3204075428)])},_doFinalize:function(){var d=c._doFinalize.call(this);return d.sigBytes-=16,d}});r.SHA384=c._createHelper(u),r.HmacSHA384=c._createHmacHelper(u)})(),n.SHA384})})(By)),By.exports}var Uy={exports:{}},FK=Uy.exports,Fj;function WK(){return Fj||(Fj=1,(function(e,t){(function(n,r,i){e.exports=r(Vs(),Vw())})(FK,function(n){return(function(r){var i=n,a=i.lib,o=a.WordArray,l=a.Hasher,c=i.x64,u=c.Word,d=i.algo,h=[],p=[],f=[];(function(){for(var y=1,w=0,v=0;v<24;v++){h[y+5*w]=(v+1)*(v+2)/2%64;var m=w%5,z=(2*y+3*w)%5;y=m,w=z}for(var y=0;y<5;y++)for(var w=0;w<5;w++)p[y+5*w]=w+(2*y+3*w)%5*5;for(var C=1,E=0;E<24;E++){for(var I=0,R=0,A=0;A<7;A++){if(C&1){var O=(1<>>24)&16711935|(C<<24|C>>>8)&4278255360,E=(E<<8|E>>>24)&16711935|(E<<24|E>>>8)&4278255360;var I=v[z];I.high^=E,I.low^=C}for(var R=0;R<24;R++){for(var A=0;A<5;A++){for(var O=0,F=0,L=0;L<5;L++){var I=v[A+5*L];O^=I.high,F^=I.low}var X=b[A];X.high=O,X.low=F}for(var A=0;A<5;A++)for(var T=b[(A+4)%5],q=b[(A+1)%5],H=q.high,J=q.low,O=T.high^(H<<1|J>>>31),F=T.low^(J<<1|H>>>31),L=0;L<5;L++){var I=v[A+5*L];I.high^=O,I.low^=F}for(var Z=1;Z<25;Z++){var O,F,I=v[Z],B=I.high,V=I.low,N=h[Z];N<32?(O=B<>>32-N,F=V<>>32-N):(O=V<>>64-N,F=B<>>64-N);var j=b[p[Z]];j.high=O,j.low=F}var k=b[0],W=v[0];k.high=W.high,k.low=W.low;for(var A=0;A<5;A++)for(var L=0;L<5;L++){var Z=A+5*L,I=v[Z],M=b[Z],Y=b[(A+1)%5+5*L],se=b[(A+2)%5+5*L];I.high=M.high^~Y.high&se.high,I.low=M.low^~Y.low&se.low}var I=v[0],ie=f[R];I.high^=ie.high,I.low^=ie.low}},_doFinalize:function(){var y=this._data,w=y.words;this._nDataBytes*8;var v=y.sigBytes*8,m=this.blockSize*32;w[v>>>5]|=1<<24-v%32,w[(r.ceil((v+1)/m)*m>>>5)-1]|=128,y.sigBytes=w.length*4,this._process();for(var z=this._state,C=this.cfg.outputLength/8,E=C/8,I=[],R=0;R>>24)&16711935|(O<<24|O>>>8)&4278255360,F=(F<<8|F>>>24)&16711935|(F<<24|F>>>8)&4278255360,I.push(F),I.push(O)}return new o.init(I,C)},clone:function(){for(var y=l.clone.call(this),w=y._state=this._state.slice(0),v=0;v<25;v++)w[v]=w[v].clone();return y}});i.SHA3=l._createHelper(g),i.HmacSHA3=l._createHmacHelper(g)})(Math),n.SHA3})})(Uy)),Uy.exports}var Fy={exports:{}},DK=Fy.exports,Wj;function VK(){return Wj||(Wj=1,(function(e,t){(function(n,r){e.exports=r(Vs())})(DK,function(n){/** @preserve + (c) 2012 by Cédric Mesnil. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */return(function(r){var i=n,a=i.lib,o=a.WordArray,l=a.Hasher,c=i.algo,u=o.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]),d=o.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]),h=o.create([11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]),p=o.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]),f=o.create([0,1518500249,1859775393,2400959708,2840853838]),b=o.create([1352829926,1548603684,1836072691,2053994217,0]),g=c.RIPEMD160=l.extend({_doReset:function(){this._hash=o.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(E,I){for(var R=0;R<16;R++){var A=I+R,O=E[A];E[A]=(O<<8|O>>>24)&16711935|(O<<24|O>>>8)&4278255360}var F=this._hash.words,L=f.words,X=b.words,T=u.words,q=d.words,H=h.words,J=p.words,Z,B,V,N,j,k,W,M,Y,se;k=Z=F[0],W=B=F[1],M=V=F[2],Y=N=F[3],se=j=F[4];for(var ie,R=0;R<80;R+=1)ie=Z+E[I+T[R]]|0,R<16?ie+=y(B,V,N)+L[0]:R<32?ie+=w(B,V,N)+L[1]:R<48?ie+=v(B,V,N)+L[2]:R<64?ie+=m(B,V,N)+L[3]:ie+=z(B,V,N)+L[4],ie=ie|0,ie=C(ie,H[R]),ie=ie+j|0,Z=j,j=N,N=C(V,10),V=B,B=ie,ie=k+E[I+q[R]]|0,R<16?ie+=z(W,M,Y)+X[0]:R<32?ie+=m(W,M,Y)+X[1]:R<48?ie+=v(W,M,Y)+X[2]:R<64?ie+=w(W,M,Y)+X[3]:ie+=y(W,M,Y)+X[4],ie=ie|0,ie=C(ie,J[R]),ie=ie+se|0,k=se,se=Y,Y=C(M,10),M=W,W=ie;ie=F[1]+V+Y|0,F[1]=F[2]+N+se|0,F[2]=F[3]+j+k|0,F[3]=F[4]+Z+W|0,F[4]=F[0]+B+M|0,F[0]=ie},_doFinalize:function(){var E=this._data,I=E.words,R=this._nDataBytes*8,A=E.sigBytes*8;I[A>>>5]|=128<<24-A%32,I[(A+64>>>9<<4)+14]=(R<<8|R>>>24)&16711935|(R<<24|R>>>8)&4278255360,E.sigBytes=(I.length+1)*4,this._process();for(var O=this._hash,F=O.words,L=0;L<5;L++){var X=F[L];F[L]=(X<<8|X>>>24)&16711935|(X<<24|X>>>8)&4278255360}return O},clone:function(){var E=l.clone.call(this);return E._hash=this._hash.clone(),E}});function y(E,I,R){return E^I^R}function w(E,I,R){return E&I|~E&R}function v(E,I,R){return(E|~I)^R}function m(E,I,R){return E&R|I&~R}function z(E,I,R){return E^(I|~R)}function C(E,I){return E<>>32-I}i.RIPEMD160=l._createHelper(g),i.HmacRIPEMD160=l._createHmacHelper(g)})(),n.RIPEMD160})})(Fy)),Fy.exports}var Wy={exports:{}},HK=Wy.exports,Dj;function D5(){return Dj||(Dj=1,(function(e,t){(function(n,r){e.exports=r(Vs())})(HK,function(n){(function(){var r=n,i=r.lib,a=i.Base,o=r.enc,l=o.Utf8,c=r.algo;c.HMAC=a.extend({init:function(u,d){u=this._hasher=new u.init,typeof d=="string"&&(d=l.parse(d));var h=u.blockSize,p=h*4;d.sigBytes>p&&(d=u.finalize(d)),d.clamp();for(var f=this._oKey=d.clone(),b=this._iKey=d.clone(),g=f.words,y=b.words,w=0;w>>2]&255;O.sigBytes-=F}};a.BlockCipher=f.extend({cfg:f.cfg.extend({mode:y,padding:v}),reset:function(){var O;f.reset.call(this);var F=this.cfg,L=F.iv,X=F.mode;this._xformMode==this._ENC_XFORM_MODE?O=X.createEncryptor:(O=X.createDecryptor,this._minBufferSize=1),this._mode&&this._mode.__creator==O?this._mode.init(this,L&&L.words):(this._mode=O.call(X,this,L&&L.words),this._mode.__creator=O)},_doProcessBlock:function(O,F){this._mode.processBlock(O,F)},_doFinalize:function(){var O,F=this.cfg.padding;return this._xformMode==this._ENC_XFORM_MODE?(F.pad(this._data,this.blockSize),O=this._process(!0)):(O=this._process(!0),F.unpad(O)),O},blockSize:128/32});var m=a.CipherParams=o.extend({init:function(O){this.mixIn(O)},toString:function(O){return(O||this.formatter).stringify(this)}}),z=i.format={},C=z.OpenSSL={stringify:function(O){var F,L=O.ciphertext,X=O.salt;return X?F=l.create([1398893684,1701076831]).concat(X).concat(L):F=L,F.toString(d)},parse:function(O){var F,L=d.parse(O),X=L.words;return X[0]==1398893684&&X[1]==1701076831&&(F=l.create(X.slice(2,4)),X.splice(0,4),L.sigBytes-=16),m.create({ciphertext:L,salt:F})}},E=a.SerializableCipher=o.extend({cfg:o.extend({format:C}),encrypt:function(O,F,L,X){X=this.cfg.extend(X);var T=O.createEncryptor(L,X),q=T.finalize(F),H=T.cfg;return m.create({ciphertext:q,key:L,iv:H.iv,algorithm:O,mode:H.mode,padding:H.padding,blockSize:O.blockSize,formatter:X.format})},decrypt:function(O,F,L,X){X=this.cfg.extend(X),F=this._parse(F,X.format);var T=O.createDecryptor(L,X).finalize(F.ciphertext);return T},_parse:function(O,F){return typeof O=="string"?F.parse(O,this):O}}),I=i.kdf={},R=I.OpenSSL={execute:function(O,F,L,X,T){if(X||(X=l.random(64/8)),T)var q=p.create({keySize:F+L,hasher:T}).compute(O,X);else var q=p.create({keySize:F+L}).compute(O,X);var H=l.create(q.words.slice(F),L*4);return q.sigBytes=F*4,m.create({key:q,iv:H,salt:X})}},A=a.PasswordBasedCipher=E.extend({cfg:E.cfg.extend({kdf:R}),encrypt:function(O,F,L,X){X=this.cfg.extend(X);var T=X.kdf.execute(L,O.keySize,O.ivSize,X.salt,X.hasher);X.iv=T.iv;var q=E.encrypt.call(this,O,F,T.key,X);return q.mixIn(T),q},decrypt:function(O,F,L,X){X=this.cfg.extend(X),F=this._parse(F,X.format);var T=X.kdf.execute(L,O.keySize,O.ivSize,F.salt,X.hasher);X.iv=T.iv;var q=E.decrypt.call(this,O,F,T.key,X);return q}})})()})})(Hy)),Hy.exports}var Gy={exports:{}},YK=Gy.exports,qj;function JK(){return qj||(qj=1,(function(e,t){(function(n,r,i){e.exports=r(Vs(),mo())})(YK,function(n){return n.mode.CFB=(function(){var r=n.lib.BlockCipherMode.extend();r.Encryptor=r.extend({processBlock:function(a,o){var l=this._cipher,c=l.blockSize;i.call(this,a,o,c,l),this._prevBlock=a.slice(o,o+c)}}),r.Decryptor=r.extend({processBlock:function(a,o){var l=this._cipher,c=l.blockSize,u=a.slice(o,o+c);i.call(this,a,o,c,l),this._prevBlock=u}});function i(a,o,l,c){var u,d=this._iv;d?(u=d.slice(0),this._iv=void 0):u=this._prevBlock,c.encryptBlock(u,0);for(var h=0;h>24&255)===255){var c=l>>16&255,u=l>>8&255,d=l&255;c===255?(c=0,u===255?(u=0,d===255?d=0:++d):++u):++c,l=0,l+=c<<16,l+=u<<8,l+=d}else l+=1<<24;return l}function a(l){return(l[0]=i(l[0]))===0&&(l[1]=i(l[1])),l}var o=r.Encryptor=r.extend({processBlock:function(l,c){var u=this._cipher,d=u.blockSize,h=this._iv,p=this._counter;h&&(p=this._counter=h.slice(0),this._iv=void 0),a(p);var f=p.slice(0);u.encryptBlock(f,0);for(var b=0;b>>2]|=l<<24-c%4*8,r.sigBytes+=l},unpad:function(r){var i=r.words[r.sigBytes-1>>>2]&255;r.sigBytes-=i}},n.pad.Ansix923})})(Jy)),Jy.exports}var Zy={exports:{}},lX=Zy.exports,Qj;function cX(){return Qj||(Qj=1,(function(e,t){(function(n,r,i){e.exports=r(Vs(),mo())})(lX,function(n){return n.pad.Iso10126={pad:function(r,i){var a=i*4,o=a-r.sigBytes%a;r.concat(n.lib.WordArray.random(o-1)).concat(n.lib.WordArray.create([o<<24],1))},unpad:function(r){var i=r.words[r.sigBytes-1>>>2]&255;r.sigBytes-=i}},n.pad.Iso10126})})(Zy)),Zy.exports}var Qy={exports:{}},uX=Qy.exports,eC;function dX(){return eC||(eC=1,(function(e,t){(function(n,r,i){e.exports=r(Vs(),mo())})(uX,function(n){return n.pad.Iso97971={pad:function(r,i){r.concat(n.lib.WordArray.create([2147483648],1)),n.pad.ZeroPadding.pad(r,i)},unpad:function(r){n.pad.ZeroPadding.unpad(r),r.sigBytes--}},n.pad.Iso97971})})(Qy)),Qy.exports}var ev={exports:{}},hX=ev.exports,tC;function pX(){return tC||(tC=1,(function(e,t){(function(n,r,i){e.exports=r(Vs(),mo())})(hX,function(n){return n.pad.ZeroPadding={pad:function(r,i){var a=i*4;r.clamp(),r.sigBytes+=a-(r.sigBytes%a||a)},unpad:function(r){for(var i=r.words,a=r.sigBytes-1,a=r.sigBytes-1;a>=0;a--)if(i[a>>>2]>>>24-a%4*8&255){r.sigBytes=a+1;break}}},n.pad.ZeroPadding})})(ev)),ev.exports}var tv={exports:{}},fX=tv.exports,nC;function mX(){return nC||(nC=1,(function(e,t){(function(n,r,i){e.exports=r(Vs(),mo())})(fX,function(n){return n.pad.NoPadding={pad:function(){},unpad:function(){}},n.pad.NoPadding})})(tv)),tv.exports}var nv={exports:{}},gX=nv.exports,rC;function xX(){return rC||(rC=1,(function(e,t){(function(n,r,i){e.exports=r(Vs(),mo())})(gX,function(n){return(function(r){var i=n,a=i.lib,o=a.CipherParams,l=i.enc,c=l.Hex,u=i.format;u.Hex={stringify:function(d){return d.ciphertext.toString(c)},parse:function(d){var h=c.parse(d);return o.create({ciphertext:h})}}})(),n.format.Hex})})(nv)),nv.exports}var rv={exports:{}},bX=rv.exports,sC;function yX(){return sC||(sC=1,(function(e,t){(function(n,r,i){e.exports=r(Vs(),sf(),af(),Lh(),mo())})(bX,function(n){return(function(){var r=n,i=r.lib,a=i.BlockCipher,o=r.algo,l=[],c=[],u=[],d=[],h=[],p=[],f=[],b=[],g=[],y=[];(function(){for(var m=[],z=0;z<256;z++)z<128?m[z]=z<<1:m[z]=z<<1^283;for(var C=0,E=0,z=0;z<256;z++){var I=E^E<<1^E<<2^E<<3^E<<4;I=I>>>8^I&255^99,l[C]=I,c[I]=C;var R=m[C],A=m[R],O=m[A],F=m[I]*257^I*16843008;u[C]=F<<24|F>>>8,d[C]=F<<16|F>>>16,h[C]=F<<8|F>>>24,p[C]=F;var F=O*16843009^A*65537^R*257^C*16843008;f[I]=F<<24|F>>>8,b[I]=F<<16|F>>>16,g[I]=F<<8|F>>>24,y[I]=F,C?(C=R^m[m[m[O^R]]],E^=m[m[E]]):C=E=1}})();var w=[0,1,2,4,8,16,32,64,128,27,54],v=o.AES=a.extend({_doReset:function(){var m;if(!(this._nRounds&&this._keyPriorReset===this._key)){for(var z=this._keyPriorReset=this._key,C=z.words,E=z.sigBytes/4,I=this._nRounds=E+6,R=(I+1)*4,A=this._keySchedule=[],O=0;O6&&O%E==4&&(m=l[m>>>24]<<24|l[m>>>16&255]<<16|l[m>>>8&255]<<8|l[m&255]):(m=m<<8|m>>>24,m=l[m>>>24]<<24|l[m>>>16&255]<<16|l[m>>>8&255]<<8|l[m&255],m^=w[O/E|0]<<24),A[O]=A[O-E]^m);for(var F=this._invKeySchedule=[],L=0;L>>24]]^b[l[m>>>16&255]]^g[l[m>>>8&255]]^y[l[m&255]]}}},encryptBlock:function(m,z){this._doCryptBlock(m,z,this._keySchedule,u,d,h,p,l)},decryptBlock:function(m,z){var C=m[z+1];m[z+1]=m[z+3],m[z+3]=C,this._doCryptBlock(m,z,this._invKeySchedule,f,b,g,y,c);var C=m[z+1];m[z+1]=m[z+3],m[z+3]=C},_doCryptBlock:function(m,z,C,E,I,R,A,O){for(var F=this._nRounds,L=m[z]^C[0],X=m[z+1]^C[1],T=m[z+2]^C[2],q=m[z+3]^C[3],H=4,J=1;J>>24]^I[X>>>16&255]^R[T>>>8&255]^A[q&255]^C[H++],B=E[X>>>24]^I[T>>>16&255]^R[q>>>8&255]^A[L&255]^C[H++],V=E[T>>>24]^I[q>>>16&255]^R[L>>>8&255]^A[X&255]^C[H++],N=E[q>>>24]^I[L>>>16&255]^R[X>>>8&255]^A[T&255]^C[H++];L=Z,X=B,T=V,q=N}var Z=(O[L>>>24]<<24|O[X>>>16&255]<<16|O[T>>>8&255]<<8|O[q&255])^C[H++],B=(O[X>>>24]<<24|O[T>>>16&255]<<16|O[q>>>8&255]<<8|O[L&255])^C[H++],V=(O[T>>>24]<<24|O[q>>>16&255]<<16|O[L>>>8&255]<<8|O[X&255])^C[H++],N=(O[q>>>24]<<24|O[L>>>16&255]<<16|O[X>>>8&255]<<8|O[T&255])^C[H++];m[z]=Z,m[z+1]=B,m[z+2]=V,m[z+3]=N},keySize:256/32});r.AES=a._createHelper(v)})(),n.AES})})(rv)),rv.exports}var sv={exports:{}},vX=sv.exports,iC;function wX(){return iC||(iC=1,(function(e,t){(function(n,r,i){e.exports=r(Vs(),sf(),af(),Lh(),mo())})(vX,function(n){return(function(){var r=n,i=r.lib,a=i.WordArray,o=i.BlockCipher,l=r.algo,c=[57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4],u=[14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32],d=[1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28],h=[{0:8421888,268435456:32768,536870912:8421378,805306368:2,1073741824:512,1342177280:8421890,1610612736:8389122,1879048192:8388608,2147483648:514,2415919104:8389120,2684354560:33280,2952790016:8421376,3221225472:32770,3489660928:8388610,3758096384:0,4026531840:33282,134217728:0,402653184:8421890,671088640:33282,939524096:32768,1207959552:8421888,1476395008:512,1744830464:8421378,2013265920:2,2281701376:8389120,2550136832:33280,2818572288:8421376,3087007744:8389122,3355443200:8388610,3623878656:32770,3892314112:514,4160749568:8388608,1:32768,268435457:2,536870913:8421888,805306369:8388608,1073741825:8421378,1342177281:33280,1610612737:512,1879048193:8389122,2147483649:8421890,2415919105:8421376,2684354561:8388610,2952790017:33282,3221225473:514,3489660929:8389120,3758096385:32770,4026531841:0,134217729:8421890,402653185:8421376,671088641:8388608,939524097:512,1207959553:32768,1476395009:8388610,1744830465:2,2013265921:33282,2281701377:32770,2550136833:8389122,2818572289:514,3087007745:8421888,3355443201:8389120,3623878657:0,3892314113:33280,4160749569:8421378},{0:1074282512,16777216:16384,33554432:524288,50331648:1074266128,67108864:1073741840,83886080:1074282496,100663296:1073758208,117440512:16,134217728:540672,150994944:1073758224,167772160:1073741824,184549376:540688,201326592:524304,218103808:0,234881024:16400,251658240:1074266112,8388608:1073758208,25165824:540688,41943040:16,58720256:1073758224,75497472:1074282512,92274688:1073741824,109051904:524288,125829120:1074266128,142606336:524304,159383552:0,176160768:16384,192937984:1074266112,209715200:1073741840,226492416:540672,243269632:1074282496,260046848:16400,268435456:0,285212672:1074266128,301989888:1073758224,318767104:1074282496,335544320:1074266112,352321536:16,369098752:540688,385875968:16384,402653184:16400,419430400:524288,436207616:524304,452984832:1073741840,469762048:540672,486539264:1073758208,503316480:1073741824,520093696:1074282512,276824064:540688,293601280:524288,310378496:1074266112,327155712:16384,343932928:1073758208,360710144:1074282512,377487360:16,394264576:1073741824,411041792:1074282496,427819008:1073741840,444596224:1073758224,461373440:524304,478150656:0,494927872:16400,511705088:1074266128,528482304:540672},{0:260,1048576:0,2097152:67109120,3145728:65796,4194304:65540,5242880:67108868,6291456:67174660,7340032:67174400,8388608:67108864,9437184:67174656,10485760:65792,11534336:67174404,12582912:67109124,13631488:65536,14680064:4,15728640:256,524288:67174656,1572864:67174404,2621440:0,3670016:67109120,4718592:67108868,5767168:65536,6815744:65540,7864320:260,8912896:4,9961472:256,11010048:67174400,12058624:65796,13107200:65792,14155776:67109124,15204352:67174660,16252928:67108864,16777216:67174656,17825792:65540,18874368:65536,19922944:67109120,20971520:256,22020096:67174660,23068672:67108868,24117248:0,25165824:67109124,26214400:67108864,27262976:4,28311552:65792,29360128:67174400,30408704:260,31457280:65796,32505856:67174404,17301504:67108864,18350080:260,19398656:67174656,20447232:0,21495808:65540,22544384:67109120,23592960:256,24641536:67174404,25690112:65536,26738688:67174660,27787264:65796,28835840:67108868,29884416:67109124,30932992:67174400,31981568:4,33030144:65792},{0:2151682048,65536:2147487808,131072:4198464,196608:2151677952,262144:0,327680:4198400,393216:2147483712,458752:4194368,524288:2147483648,589824:4194304,655360:64,720896:2147487744,786432:2151678016,851968:4160,917504:4096,983040:2151682112,32768:2147487808,98304:64,163840:2151678016,229376:2147487744,294912:4198400,360448:2151682112,425984:0,491520:2151677952,557056:4096,622592:2151682048,688128:4194304,753664:4160,819200:2147483648,884736:4194368,950272:4198464,1015808:2147483712,1048576:4194368,1114112:4198400,1179648:2147483712,1245184:0,1310720:4160,1376256:2151678016,1441792:2151682048,1507328:2147487808,1572864:2151682112,1638400:2147483648,1703936:2151677952,1769472:4198464,1835008:2147487744,1900544:4194304,1966080:64,2031616:4096,1081344:2151677952,1146880:2151682112,1212416:0,1277952:4198400,1343488:4194368,1409024:2147483648,1474560:2147487808,1540096:64,1605632:2147483712,1671168:4096,1736704:2147487744,1802240:2151678016,1867776:4160,1933312:2151682048,1998848:4194304,2064384:4198464},{0:128,4096:17039360,8192:262144,12288:536870912,16384:537133184,20480:16777344,24576:553648256,28672:262272,32768:16777216,36864:537133056,40960:536871040,45056:553910400,49152:553910272,53248:0,57344:17039488,61440:553648128,2048:17039488,6144:553648256,10240:128,14336:17039360,18432:262144,22528:537133184,26624:553910272,30720:536870912,34816:537133056,38912:0,43008:553910400,47104:16777344,51200:536871040,55296:553648128,59392:16777216,63488:262272,65536:262144,69632:128,73728:536870912,77824:553648256,81920:16777344,86016:553910272,90112:537133184,94208:16777216,98304:553910400,102400:553648128,106496:17039360,110592:537133056,114688:262272,118784:536871040,122880:0,126976:17039488,67584:553648256,71680:16777216,75776:17039360,79872:537133184,83968:536870912,88064:17039488,92160:128,96256:553910272,100352:262272,104448:553910400,108544:0,112640:553648128,116736:16777344,120832:262144,124928:537133056,129024:536871040},{0:268435464,256:8192,512:270532608,768:270540808,1024:268443648,1280:2097152,1536:2097160,1792:268435456,2048:0,2304:268443656,2560:2105344,2816:8,3072:270532616,3328:2105352,3584:8200,3840:270540800,128:270532608,384:270540808,640:8,896:2097152,1152:2105352,1408:268435464,1664:268443648,1920:8200,2176:2097160,2432:8192,2688:268443656,2944:270532616,3200:0,3456:270540800,3712:2105344,3968:268435456,4096:268443648,4352:270532616,4608:270540808,4864:8200,5120:2097152,5376:268435456,5632:268435464,5888:2105344,6144:2105352,6400:0,6656:8,6912:270532608,7168:8192,7424:268443656,7680:270540800,7936:2097160,4224:8,4480:2105344,4736:2097152,4992:268435464,5248:268443648,5504:8200,5760:270540808,6016:270532608,6272:270540800,6528:270532616,6784:8192,7040:2105352,7296:2097160,7552:0,7808:268435456,8064:268443656},{0:1048576,16:33555457,32:1024,48:1049601,64:34604033,80:0,96:1,112:34603009,128:33555456,144:1048577,160:33554433,176:34604032,192:34603008,208:1025,224:1049600,240:33554432,8:34603009,24:0,40:33555457,56:34604032,72:1048576,88:33554433,104:33554432,120:1025,136:1049601,152:33555456,168:34603008,184:1048577,200:1024,216:34604033,232:1,248:1049600,256:33554432,272:1048576,288:33555457,304:34603009,320:1048577,336:33555456,352:34604032,368:1049601,384:1025,400:34604033,416:1049600,432:1,448:0,464:34603008,480:33554433,496:1024,264:1049600,280:33555457,296:34603009,312:1,328:33554432,344:1048576,360:1025,376:34604032,392:33554433,408:34603008,424:0,440:34604033,456:1049601,472:1024,488:33555456,504:1048577},{0:134219808,1:131072,2:134217728,3:32,4:131104,5:134350880,6:134350848,7:2048,8:134348800,9:134219776,10:133120,11:134348832,12:2080,13:0,14:134217760,15:133152,2147483648:2048,2147483649:134350880,2147483650:134219808,2147483651:134217728,2147483652:134348800,2147483653:133120,2147483654:133152,2147483655:32,2147483656:134217760,2147483657:2080,2147483658:131104,2147483659:134350848,2147483660:0,2147483661:134348832,2147483662:134219776,2147483663:131072,16:133152,17:134350848,18:32,19:2048,20:134219776,21:134217760,22:134348832,23:131072,24:0,25:131104,26:134348800,27:134219808,28:134350880,29:133120,30:2080,31:134217728,2147483664:131072,2147483665:2048,2147483666:134348832,2147483667:133152,2147483668:32,2147483669:134348800,2147483670:134217728,2147483671:134219808,2147483672:134350880,2147483673:134217760,2147483674:134219776,2147483675:0,2147483676:133120,2147483677:2080,2147483678:131104,2147483679:134350848}],p=[4160749569,528482304,33030144,2064384,129024,8064,504,2147483679],f=l.DES=o.extend({_doReset:function(){for(var w=this._key,v=w.words,m=[],z=0;z<56;z++){var C=c[z]-1;m[z]=v[C>>>5]>>>31-C%32&1}for(var E=this._subKeys=[],I=0;I<16;I++){for(var R=E[I]=[],A=d[I],z=0;z<24;z++)R[z/6|0]|=m[(u[z]-1+A)%28]<<31-z%6,R[4+(z/6|0)]|=m[28+(u[z+24]-1+A)%28]<<31-z%6;R[0]=R[0]<<1|R[0]>>>31;for(var z=1;z<7;z++)R[z]=R[z]>>>(z-1)*4+3;R[7]=R[7]<<5|R[7]>>>27}for(var O=this._invSubKeys=[],z=0;z<16;z++)O[z]=E[15-z]},encryptBlock:function(w,v){this._doCryptBlock(w,v,this._subKeys)},decryptBlock:function(w,v){this._doCryptBlock(w,v,this._invSubKeys)},_doCryptBlock:function(w,v,m){this._lBlock=w[v],this._rBlock=w[v+1],b.call(this,4,252645135),b.call(this,16,65535),g.call(this,2,858993459),g.call(this,8,16711935),b.call(this,1,1431655765);for(var z=0;z<16;z++){for(var C=m[z],E=this._lBlock,I=this._rBlock,R=0,A=0;A<8;A++)R|=h[A][((I^C[A])&p[A])>>>0];this._lBlock=I,this._rBlock=E^R}var O=this._lBlock;this._lBlock=this._rBlock,this._rBlock=O,b.call(this,1,1431655765),g.call(this,8,16711935),g.call(this,2,858993459),b.call(this,16,65535),b.call(this,4,252645135),w[v]=this._lBlock,w[v+1]=this._rBlock},keySize:64/32,ivSize:64/32,blockSize:64/32});function b(w,v){var m=(this._lBlock>>>w^this._rBlock)&v;this._rBlock^=m,this._lBlock^=m<>>w^this._lBlock)&v;this._lBlock^=m,this._rBlock^=m<192.");var m=v.slice(0,2),z=v.length<4?v.slice(0,2):v.slice(2,4),C=v.length<6?v.slice(0,2):v.slice(4,6);this._des1=f.createEncryptor(a.create(m)),this._des2=f.createEncryptor(a.create(z)),this._des3=f.createEncryptor(a.create(C))},encryptBlock:function(w,v){this._des1.encryptBlock(w,v),this._des2.decryptBlock(w,v),this._des3.encryptBlock(w,v)},decryptBlock:function(w,v){this._des3.decryptBlock(w,v),this._des2.encryptBlock(w,v),this._des1.decryptBlock(w,v)},keySize:192/32,ivSize:64/32,blockSize:64/32});r.TripleDES=o._createHelper(y)})(),n.TripleDES})})(sv)),sv.exports}var iv={exports:{}},_X=iv.exports,aC;function zX(){return aC||(aC=1,(function(e,t){(function(n,r,i){e.exports=r(Vs(),sf(),af(),Lh(),mo())})(_X,function(n){return(function(){var r=n,i=r.lib,a=i.StreamCipher,o=r.algo,l=o.RC4=a.extend({_doReset:function(){for(var d=this._key,h=d.words,p=d.sigBytes,f=this._S=[],b=0;b<256;b++)f[b]=b;for(var b=0,g=0;b<256;b++){var y=b%p,w=h[y>>>2]>>>24-y%4*8&255;g=(g+f[b]+w)%256;var v=f[b];f[b]=f[g],f[g]=v}this._i=this._j=0},_doProcessBlock:function(d,h){d[h]^=c.call(this)},keySize:256/32,ivSize:0});function c(){for(var d=this._S,h=this._i,p=this._j,f=0,b=0;b<4;b++){h=(h+1)%256,p=(p+d[h])%256;var g=d[h];d[h]=d[p],d[p]=g,f|=d[(d[h]+d[p])%256]<<24-b*8}return this._i=h,this._j=p,f}r.RC4=a._createHelper(l);var u=o.RC4Drop=l.extend({cfg:l.cfg.extend({drop:192}),_doReset:function(){l._doReset.call(this);for(var d=this.cfg.drop;d>0;d--)c.call(this)}});r.RC4Drop=a._createHelper(u)})(),n.RC4})})(iv)),iv.exports}var av={exports:{}},$X=av.exports,oC;function SX(){return oC||(oC=1,(function(e,t){(function(n,r,i){e.exports=r(Vs(),sf(),af(),Lh(),mo())})($X,function(n){return(function(){var r=n,i=r.lib,a=i.StreamCipher,o=r.algo,l=[],c=[],u=[],d=o.Rabbit=a.extend({_doReset:function(){for(var p=this._key.words,f=this.cfg.iv,b=0;b<4;b++)p[b]=(p[b]<<8|p[b]>>>24)&16711935|(p[b]<<24|p[b]>>>8)&4278255360;var g=this._X=[p[0],p[3]<<16|p[2]>>>16,p[1],p[0]<<16|p[3]>>>16,p[2],p[1]<<16|p[0]>>>16,p[3],p[2]<<16|p[1]>>>16],y=this._C=[p[2]<<16|p[2]>>>16,p[0]&4294901760|p[1]&65535,p[3]<<16|p[3]>>>16,p[1]&4294901760|p[2]&65535,p[0]<<16|p[0]>>>16,p[2]&4294901760|p[3]&65535,p[1]<<16|p[1]>>>16,p[3]&4294901760|p[0]&65535];this._b=0;for(var b=0;b<4;b++)h.call(this);for(var b=0;b<8;b++)y[b]^=g[b+4&7];if(f){var w=f.words,v=w[0],m=w[1],z=(v<<8|v>>>24)&16711935|(v<<24|v>>>8)&4278255360,C=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360,E=z>>>16|C&4294901760,I=C<<16|z&65535;y[0]^=z,y[1]^=E,y[2]^=C,y[3]^=I,y[4]^=z,y[5]^=E,y[6]^=C,y[7]^=I;for(var b=0;b<4;b++)h.call(this)}},_doProcessBlock:function(p,f){var b=this._X;h.call(this),l[0]=b[0]^b[5]>>>16^b[3]<<16,l[1]=b[2]^b[7]>>>16^b[5]<<16,l[2]=b[4]^b[1]>>>16^b[7]<<16,l[3]=b[6]^b[3]>>>16^b[1]<<16;for(var g=0;g<4;g++)l[g]=(l[g]<<8|l[g]>>>24)&16711935|(l[g]<<24|l[g]>>>8)&4278255360,p[f+g]^=l[g]},blockSize:128/32,ivSize:64/32});function h(){for(var p=this._X,f=this._C,b=0;b<8;b++)c[b]=f[b];f[0]=f[0]+1295307597+this._b|0,f[1]=f[1]+3545052371+(f[0]>>>0>>0?1:0)|0,f[2]=f[2]+886263092+(f[1]>>>0>>0?1:0)|0,f[3]=f[3]+1295307597+(f[2]>>>0>>0?1:0)|0,f[4]=f[4]+3545052371+(f[3]>>>0>>0?1:0)|0,f[5]=f[5]+886263092+(f[4]>>>0>>0?1:0)|0,f[6]=f[6]+1295307597+(f[5]>>>0>>0?1:0)|0,f[7]=f[7]+3545052371+(f[6]>>>0>>0?1:0)|0,this._b=f[7]>>>0>>0?1:0;for(var b=0;b<8;b++){var g=p[b]+f[b],y=g&65535,w=g>>>16,v=((y*y>>>17)+y*w>>>15)+w*w,m=((g&4294901760)*g|0)+((g&65535)*g|0);u[b]=v^m}p[0]=u[0]+(u[7]<<16|u[7]>>>16)+(u[6]<<16|u[6]>>>16)|0,p[1]=u[1]+(u[0]<<8|u[0]>>>24)+u[7]|0,p[2]=u[2]+(u[1]<<16|u[1]>>>16)+(u[0]<<16|u[0]>>>16)|0,p[3]=u[3]+(u[2]<<8|u[2]>>>24)+u[1]|0,p[4]=u[4]+(u[3]<<16|u[3]>>>16)+(u[2]<<16|u[2]>>>16)|0,p[5]=u[5]+(u[4]<<8|u[4]>>>24)+u[3]|0,p[6]=u[6]+(u[5]<<16|u[5]>>>16)+(u[4]<<16|u[4]>>>16)|0,p[7]=u[7]+(u[6]<<8|u[6]>>>24)+u[5]|0}r.Rabbit=a._createHelper(d)})(),n.Rabbit})})(av)),av.exports}var ov={exports:{}},jX=ov.exports,lC;function CX(){return lC||(lC=1,(function(e,t){(function(n,r,i){e.exports=r(Vs(),sf(),af(),Lh(),mo())})(jX,function(n){return(function(){var r=n,i=r.lib,a=i.StreamCipher,o=r.algo,l=[],c=[],u=[],d=o.RabbitLegacy=a.extend({_doReset:function(){var p=this._key.words,f=this.cfg.iv,b=this._X=[p[0],p[3]<<16|p[2]>>>16,p[1],p[0]<<16|p[3]>>>16,p[2],p[1]<<16|p[0]>>>16,p[3],p[2]<<16|p[1]>>>16],g=this._C=[p[2]<<16|p[2]>>>16,p[0]&4294901760|p[1]&65535,p[3]<<16|p[3]>>>16,p[1]&4294901760|p[2]&65535,p[0]<<16|p[0]>>>16,p[2]&4294901760|p[3]&65535,p[1]<<16|p[1]>>>16,p[3]&4294901760|p[0]&65535];this._b=0;for(var y=0;y<4;y++)h.call(this);for(var y=0;y<8;y++)g[y]^=b[y+4&7];if(f){var w=f.words,v=w[0],m=w[1],z=(v<<8|v>>>24)&16711935|(v<<24|v>>>8)&4278255360,C=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360,E=z>>>16|C&4294901760,I=C<<16|z&65535;g[0]^=z,g[1]^=E,g[2]^=C,g[3]^=I,g[4]^=z,g[5]^=E,g[6]^=C,g[7]^=I;for(var y=0;y<4;y++)h.call(this)}},_doProcessBlock:function(p,f){var b=this._X;h.call(this),l[0]=b[0]^b[5]>>>16^b[3]<<16,l[1]=b[2]^b[7]>>>16^b[5]<<16,l[2]=b[4]^b[1]>>>16^b[7]<<16,l[3]=b[6]^b[3]>>>16^b[1]<<16;for(var g=0;g<4;g++)l[g]=(l[g]<<8|l[g]>>>24)&16711935|(l[g]<<24|l[g]>>>8)&4278255360,p[f+g]^=l[g]},blockSize:128/32,ivSize:64/32});function h(){for(var p=this._X,f=this._C,b=0;b<8;b++)c[b]=f[b];f[0]=f[0]+1295307597+this._b|0,f[1]=f[1]+3545052371+(f[0]>>>0>>0?1:0)|0,f[2]=f[2]+886263092+(f[1]>>>0>>0?1:0)|0,f[3]=f[3]+1295307597+(f[2]>>>0>>0?1:0)|0,f[4]=f[4]+3545052371+(f[3]>>>0>>0?1:0)|0,f[5]=f[5]+886263092+(f[4]>>>0>>0?1:0)|0,f[6]=f[6]+1295307597+(f[5]>>>0>>0?1:0)|0,f[7]=f[7]+3545052371+(f[6]>>>0>>0?1:0)|0,this._b=f[7]>>>0>>0?1:0;for(var b=0;b<8;b++){var g=p[b]+f[b],y=g&65535,w=g>>>16,v=((y*y>>>17)+y*w>>>15)+w*w,m=((g&4294901760)*g|0)+((g&65535)*g|0);u[b]=v^m}p[0]=u[0]+(u[7]<<16|u[7]>>>16)+(u[6]<<16|u[6]>>>16)|0,p[1]=u[1]+(u[0]<<8|u[0]>>>24)+u[7]|0,p[2]=u[2]+(u[1]<<16|u[1]>>>16)+(u[0]<<16|u[0]>>>16)|0,p[3]=u[3]+(u[2]<<8|u[2]>>>24)+u[1]|0,p[4]=u[4]+(u[3]<<16|u[3]>>>16)+(u[2]<<16|u[2]>>>16)|0,p[5]=u[5]+(u[4]<<8|u[4]>>>24)+u[3]|0,p[6]=u[6]+(u[5]<<16|u[5]>>>16)+(u[4]<<16|u[4]>>>16)|0,p[7]=u[7]+(u[6]<<8|u[6]>>>24)+u[5]|0}r.RabbitLegacy=a._createHelper(d)})(),n.RabbitLegacy})})(ov)),ov.exports}var lv={exports:{}},NX=lv.exports,cC;function EX(){return cC||(cC=1,(function(e,t){(function(n,r,i){e.exports=r(Vs(),sf(),af(),Lh(),mo())})(NX,function(n){return(function(){var r=n,i=r.lib,a=i.BlockCipher,o=r.algo;const l=16,c=[608135816,2242054355,320440878,57701188,2752067618,698298832,137296536,3964562569,1160258022,953160567,3193202383,887688300,3232508343,3380367581,1065670069,3041331479,2450970073,2306472731],u=[[3509652390,2564797868,805139163,3491422135,3101798381,1780907670,3128725573,4046225305,614570311,3012652279,134345442,2240740374,1667834072,1901547113,2757295779,4103290238,227898511,1921955416,1904987480,2182433518,2069144605,3260701109,2620446009,720527379,3318853667,677414384,3393288472,3101374703,2390351024,1614419982,1822297739,2954791486,3608508353,3174124327,2024746970,1432378464,3864339955,2857741204,1464375394,1676153920,1439316330,715854006,3033291828,289532110,2706671279,2087905683,3018724369,1668267050,732546397,1947742710,3462151702,2609353502,2950085171,1814351708,2050118529,680887927,999245976,1800124847,3300911131,1713906067,1641548236,4213287313,1216130144,1575780402,4018429277,3917837745,3693486850,3949271944,596196993,3549867205,258830323,2213823033,772490370,2760122372,1774776394,2652871518,566650946,4142492826,1728879713,2882767088,1783734482,3629395816,2517608232,2874225571,1861159788,326777828,3124490320,2130389656,2716951837,967770486,1724537150,2185432712,2364442137,1164943284,2105845187,998989502,3765401048,2244026483,1075463327,1455516326,1322494562,910128902,469688178,1117454909,936433444,3490320968,3675253459,1240580251,122909385,2157517691,634681816,4142456567,3825094682,3061402683,2540495037,79693498,3249098678,1084186820,1583128258,426386531,1761308591,1047286709,322548459,995290223,1845252383,2603652396,3431023940,2942221577,3202600964,3727903485,1712269319,422464435,3234572375,1170764815,3523960633,3117677531,1434042557,442511882,3600875718,1076654713,1738483198,4213154764,2393238008,3677496056,1014306527,4251020053,793779912,2902807211,842905082,4246964064,1395751752,1040244610,2656851899,3396308128,445077038,3742853595,3577915638,679411651,2892444358,2354009459,1767581616,3150600392,3791627101,3102740896,284835224,4246832056,1258075500,768725851,2589189241,3069724005,3532540348,1274779536,3789419226,2764799539,1660621633,3471099624,4011903706,913787905,3497959166,737222580,2514213453,2928710040,3937242737,1804850592,3499020752,2949064160,2386320175,2390070455,2415321851,4061277028,2290661394,2416832540,1336762016,1754252060,3520065937,3014181293,791618072,3188594551,3933548030,2332172193,3852520463,3043980520,413987798,3465142937,3030929376,4245938359,2093235073,3534596313,375366246,2157278981,2479649556,555357303,3870105701,2008414854,3344188149,4221384143,3956125452,2067696032,3594591187,2921233993,2428461,544322398,577241275,1471733935,610547355,4027169054,1432588573,1507829418,2025931657,3646575487,545086370,48609733,2200306550,1653985193,298326376,1316178497,3007786442,2064951626,458293330,2589141269,3591329599,3164325604,727753846,2179363840,146436021,1461446943,4069977195,705550613,3059967265,3887724982,4281599278,3313849956,1404054877,2845806497,146425753,1854211946],[1266315497,3048417604,3681880366,3289982499,290971e4,1235738493,2632868024,2414719590,3970600049,1771706367,1449415276,3266420449,422970021,1963543593,2690192192,3826793022,1062508698,1531092325,1804592342,2583117782,2714934279,4024971509,1294809318,4028980673,1289560198,2221992742,1669523910,35572830,157838143,1052438473,1016535060,1802137761,1753167236,1386275462,3080475397,2857371447,1040679964,2145300060,2390574316,1461121720,2956646967,4031777805,4028374788,33600511,2920084762,1018524850,629373528,3691585981,3515945977,2091462646,2486323059,586499841,988145025,935516892,3367335476,2599673255,2839830854,265290510,3972581182,2759138881,3795373465,1005194799,847297441,406762289,1314163512,1332590856,1866599683,4127851711,750260880,613907577,1450815602,3165620655,3734664991,3650291728,3012275730,3704569646,1427272223,778793252,1343938022,2676280711,2052605720,1946737175,3164576444,3914038668,3967478842,3682934266,1661551462,3294938066,4011595847,840292616,3712170807,616741398,312560963,711312465,1351876610,322626781,1910503582,271666773,2175563734,1594956187,70604529,3617834859,1007753275,1495573769,4069517037,2549218298,2663038764,504708206,2263041392,3941167025,2249088522,1514023603,1998579484,1312622330,694541497,2582060303,2151582166,1382467621,776784248,2618340202,3323268794,2497899128,2784771155,503983604,4076293799,907881277,423175695,432175456,1378068232,4145222326,3954048622,3938656102,3820766613,2793130115,2977904593,26017576,3274890735,3194772133,1700274565,1756076034,4006520079,3677328699,720338349,1533947780,354530856,688349552,3973924725,1637815568,332179504,3949051286,53804574,2852348879,3044236432,1282449977,3583942155,3416972820,4006381244,1617046695,2628476075,3002303598,1686838959,431878346,2686675385,1700445008,1080580658,1009431731,832498133,3223435511,2605976345,2271191193,2516031870,1648197032,4164389018,2548247927,300782431,375919233,238389289,3353747414,2531188641,2019080857,1475708069,455242339,2609103871,448939670,3451063019,1395535956,2413381860,1841049896,1491858159,885456874,4264095073,4001119347,1565136089,3898914787,1108368660,540939232,1173283510,2745871338,3681308437,4207628240,3343053890,4016749493,1699691293,1103962373,3625875870,2256883143,3830138730,1031889488,3479347698,1535977030,4236805024,3251091107,2132092099,1774941330,1199868427,1452454533,157007616,2904115357,342012276,595725824,1480756522,206960106,497939518,591360097,863170706,2375253569,3596610801,1814182875,2094937945,3421402208,1082520231,3463918190,2785509508,435703966,3908032597,1641649973,2842273706,3305899714,1510255612,2148256476,2655287854,3276092548,4258621189,236887753,3681803219,274041037,1734335097,3815195456,3317970021,1899903192,1026095262,4050517792,356393447,2410691914,3873677099,3682840055],[3913112168,2491498743,4132185628,2489919796,1091903735,1979897079,3170134830,3567386728,3557303409,857797738,1136121015,1342202287,507115054,2535736646,337727348,3213592640,1301675037,2528481711,1895095763,1721773893,3216771564,62756741,2142006736,835421444,2531993523,1442658625,3659876326,2882144922,676362277,1392781812,170690266,3921047035,1759253602,3611846912,1745797284,664899054,1329594018,3901205900,3045908486,2062866102,2865634940,3543621612,3464012697,1080764994,553557557,3656615353,3996768171,991055499,499776247,1265440854,648242737,3940784050,980351604,3713745714,1749149687,3396870395,4211799374,3640570775,1161844396,3125318951,1431517754,545492359,4268468663,3499529547,1437099964,2702547544,3433638243,2581715763,2787789398,1060185593,1593081372,2418618748,4260947970,69676912,2159744348,86519011,2512459080,3838209314,1220612927,3339683548,133810670,1090789135,1078426020,1569222167,845107691,3583754449,4072456591,1091646820,628848692,1613405280,3757631651,526609435,236106946,48312990,2942717905,3402727701,1797494240,859738849,992217954,4005476642,2243076622,3870952857,3732016268,765654824,3490871365,2511836413,1685915746,3888969200,1414112111,2273134842,3281911079,4080962846,172450625,2569994100,980381355,4109958455,2819808352,2716589560,2568741196,3681446669,3329971472,1835478071,660984891,3704678404,4045999559,3422617507,3040415634,1762651403,1719377915,3470491036,2693910283,3642056355,3138596744,1364962596,2073328063,1983633131,926494387,3423689081,2150032023,4096667949,1749200295,3328846651,309677260,2016342300,1779581495,3079819751,111262694,1274766160,443224088,298511866,1025883608,3806446537,1145181785,168956806,3641502830,3584813610,1689216846,3666258015,3200248200,1692713982,2646376535,4042768518,1618508792,1610833997,3523052358,4130873264,2001055236,3610705100,2202168115,4028541809,2961195399,1006657119,2006996926,3186142756,1430667929,3210227297,1314452623,4074634658,4101304120,2273951170,1399257539,3367210612,3027628629,1190975929,2062231137,2333990788,2221543033,2438960610,1181637006,548689776,2362791313,3372408396,3104550113,3145860560,296247880,1970579870,3078560182,3769228297,1714227617,3291629107,3898220290,166772364,1251581989,493813264,448347421,195405023,2709975567,677966185,3703036547,1463355134,2715995803,1338867538,1343315457,2802222074,2684532164,233230375,2599980071,2000651841,3277868038,1638401717,4028070440,3237316320,6314154,819756386,300326615,590932579,1405279636,3267499572,3150704214,2428286686,3959192993,3461946742,1862657033,1266418056,963775037,2089974820,2263052895,1917689273,448879540,3550394620,3981727096,150775221,3627908307,1303187396,508620638,2975983352,2726630617,1817252668,1876281319,1457606340,908771278,3720792119,3617206836,2455994898,1729034894,1080033504],[976866871,3556439503,2881648439,1522871579,1555064734,1336096578,3548522304,2579274686,3574697629,3205460757,3593280638,3338716283,3079412587,564236357,2993598910,1781952180,1464380207,3163844217,3332601554,1699332808,1393555694,1183702653,3581086237,1288719814,691649499,2847557200,2895455976,3193889540,2717570544,1781354906,1676643554,2592534050,3230253752,1126444790,2770207658,2633158820,2210423226,2615765581,2414155088,3127139286,673620729,2805611233,1269405062,4015350505,3341807571,4149409754,1057255273,2012875353,2162469141,2276492801,2601117357,993977747,3918593370,2654263191,753973209,36408145,2530585658,25011837,3520020182,2088578344,530523599,2918365339,1524020338,1518925132,3760827505,3759777254,1202760957,3985898139,3906192525,674977740,4174734889,2031300136,2019492241,3983892565,4153806404,3822280332,352677332,2297720250,60907813,90501309,3286998549,1016092578,2535922412,2839152426,457141659,509813237,4120667899,652014361,1966332200,2975202805,55981186,2327461051,676427537,3255491064,2882294119,3433927263,1307055953,942726286,933058658,2468411793,3933900994,4215176142,1361170020,2001714738,2830558078,3274259782,1222529897,1679025792,2729314320,3714953764,1770335741,151462246,3013232138,1682292957,1483529935,471910574,1539241949,458788160,3436315007,1807016891,3718408830,978976581,1043663428,3165965781,1927990952,4200891579,2372276910,3208408903,3533431907,1412390302,2931980059,4132332400,1947078029,3881505623,4168226417,2941484381,1077988104,1320477388,886195818,18198404,3786409e3,2509781533,112762804,3463356488,1866414978,891333506,18488651,661792760,1628790961,3885187036,3141171499,876946877,2693282273,1372485963,791857591,2686433993,3759982718,3167212022,3472953795,2716379847,445679433,3561995674,3504004811,3574258232,54117162,3331405415,2381918588,3769707343,4154350007,1140177722,4074052095,668550556,3214352940,367459370,261225585,2610173221,4209349473,3468074219,3265815641,314222801,3066103646,3808782860,282218597,3406013506,3773591054,379116347,1285071038,846784868,2669647154,3771962079,3550491691,2305946142,453669953,1268987020,3317592352,3279303384,3744833421,2610507566,3859509063,266596637,3847019092,517658769,3462560207,3443424879,370717030,4247526661,2224018117,4143653529,4112773975,2788324899,2477274417,1456262402,2901442914,1517677493,1846949527,2295493580,3734397586,2176403920,1280348187,1908823572,3871786941,846861322,1172426758,3287448474,3383383037,1655181056,3139813346,901632758,1897031941,2986607138,3066810236,3447102507,1393639104,373351379,950779232,625454576,3124240540,4148612726,2007998917,544563296,2244738638,2330496472,2058025392,1291430526,424198748,50039436,29584100,3605783033,2429876329,2791104160,1057563949,3255363231,3075367218,3463963227,1469046755,985887462]];var d={pbox:[],sbox:[]};function h(y,w){let v=w>>24&255,m=w>>16&255,z=w>>8&255,C=w&255,E=y.sbox[0][v]+y.sbox[1][m];return E=E^y.sbox[2][z],E=E+y.sbox[3][C],E}function p(y,w,v){let m=w,z=v,C;for(let E=0;E1;--E)m=m^y.pbox[E],z=h(y,m)^z,C=m,m=z,z=C;return C=m,m=z,z=C,z=z^y.pbox[1],m=m^y.pbox[0],{left:m,right:z}}function b(y,w,v){for(let I=0;I<4;I++){y.sbox[I]=[];for(let R=0;R<256;R++)y.sbox[I][R]=u[I][R]}let m=0;for(let I=0;I=v&&(m=0);let z=0,C=0,E=0;for(let I=0;I{const{invoke:c}=await Promise.resolve().then(()=>tf);return{invoke:c}},void 0,import.meta.url),o=await a("proxy_fetch_raw",{args:{url:e,method:"POST",headers:{"Content-Type":"application/json"},body:n,timeoutSecs:120}}),l=o.status;return{ok:l>=200&&l<300,status:l,rawText:o.body??""}}const r=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:n}),i=await r.text().catch(()=>"");return{ok:r.ok,status:r.status,rawText:i}}function dO(e){const t=(e||"").trim();if(!/^[0-9a-fA-F]{64}$/.test(t))throw new Error("AES Key 必须是 64 位 hex 字符串(32字节)")}function RX(e,t){dO(e);const n=od.enc.Hex.parse(e.trim()),r=JSON.stringify(t),i=od.AES.encrypt(r,n,{mode:od.mode.ECB,padding:od.pad.Pkcs7});return od.enc.Base64.stringify(i.ciphertext)}function PX(e,t){dO(e);const n=od.enc.Hex.parse(e.trim()),r=od.enc.Base64.parse((t||"").trim()),i=od.AES.decrypt({ciphertext:r},n,{mode:od.mode.ECB,padding:od.pad.Pkcs7}),a=od.enc.Utf8.stringify(i);if(!a)throw new Error("解密失败或结果为空");return JSON.parse(a)}async function V5(e,t){if(!(e!=null&&e.apiUrl))throw new Error("素材审核 API URL 未配置");if((e==null?void 0:e.userId)===null||(e==null?void 0:e.userId)===void 0||String(e.userId).trim()==="")throw new Error("素材审核 user_id 未配置");if(!(e!=null&&e.keyHex))throw new Error("素材审核 AES Key 未配置");if(!Array.isArray(t)||t.length===0)throw new Error("images 不能为空");const n=e.apiUrl.trim().replace(/\/+$/,""),r=RX(e.keyHex,{images:t}),{ok:i,status:a,rawText:o}=await TX(n,{user_id:e.userId,encrypted_data:r});let l={};try{l=o?JSON.parse(o):{}}catch{l={}}if(!i){const c=(l==null?void 0:l.message)||(l==null?void 0:l.error)||(o?String(o).slice(0,300):"");throw new Error(c?`素材审核接口异常 (HTTP ${a}): ${c}`:`素材审核接口异常 (HTTP ${a})`)}if(!(l!=null&&l.encrypted_data)){const c=(l==null?void 0:l.message)||(l==null?void 0:l.error)||`素材审核请求失败 (HTTP ${a})`;throw new Error(typeof c=="string"?c:"素材审核请求失败")}return PX(e.keyHex,l.encrypted_data)}const OX=1200*1e3,hO=new Set;let dC=!1;function LX(){dC||typeof window>"u"||(window.addEventListener("cancelPolling",e=>{var r;const t=e,n=(r=t==null?void 0:t.detail)==null?void 0:r.taskId;n&&hO.add(String(n))}),dC=!0)}function BX(e,t,n){if(n.includes(".")){const i=n.slice(n.lastIndexOf("."));if(i.length>=2&&i.length<=5)return i}const r=e.toLowerCase();return t==="audio"||r.startsWith("audio/")?r.includes("mpeg")||r.includes("mp3")?".mp3":r.includes("wav")?".wav":r.includes("ogg")?".ogg":r.includes("m4a")||r.includes("mp4")&&r.includes("audio")?".m4a":r.includes("aac")?".aac":r.includes("flac")?".flac":".mp3":t==="video"||r.startsWith("video/")?r.includes("mp4")?".mp4":r.includes("quicktime")||r.includes("mov")?".mov":r.includes("webm")?".webm":".mp4":t==="image"||r.startsWith("image/")?r.includes("png")?".png":r.includes("jpeg")||r.includes("jpg")?".jpg":r.includes("webp")?".webp":r.includes("gif")?".gif":r.includes("bmp")?".bmp":".jpg":""}const UX=e=>{const t={"#ff0000":"red","#00ff00":"green","#0000ff":"blue","#ffff00":"yellow","#ff00ff":"magenta","#00ffff":"cyan","#ffa500":"orange","#800080":"purple","#ffc0cb":"pink"},n=e.toLowerCase();if(t[n])return t[n];const r=parseInt(n.slice(1,3),16),i=parseInt(n.slice(3,5),16),a=parseInt(n.slice(5,7),16);return r>200&&i<100&&a<100?"red":i>200&&r<100&&a<100?"green":a>200&&r<100&&i<100?"blue":r>200&&i>200&&a<100?"yellow":r>200&&a>200&&i<100?"magenta":i>200&&a>200&&r<100?"cyan":r>200&&i>150&&a<100?"orange":r>150&&i<100&&a>150?"purple":null},FX=(e,t,n)=>{const r=[],i=Math.abs(e),a=Math.abs(t),o=Math.abs(n);if(n<-50?(r.push("(rim lighting:1.3)"),r.push("(backlighting:1.3)"),r.push("(silhouette lighting:1.2)")):n>50&&(r.push("(front lighting:1.2)"),r.push("(flat lighting:1.1)")),t<-30)if(i>30){const l=e>0?"right":"left";r.push(`(cinematic lighting from top ${l}:1.3)`),r.push("(dramatic overhead lighting:1.2)")}else r.push("(top lighting:1.2)"),r.push("(overhead lighting:1.2)");else t>30&&(r.push("(uplighting:1.2)"),r.push("(lighting from below:1.2)"),t>50&&r.push("(spooky lighting:1.1)"));if(i>30&&a<=30&&o<=50){const l=e>0?"right":"left";r.push(`(side lighting from ${l}:1.2)`),r.push(`(${l} rim light:1.1)`)}if(i>20&&a>20&&o<=50){const l=e>0?"right":"left",c=t>0?"bottom":"top";r.push(`(lighting from ${c} ${l}:1.2)`)}if(r.length===0){const l=Math.max(i,a,o);if(l===i){const c=e>0?"right":"left";r.push(`(side lighting from ${c}:1.2)`)}else if(l===a){const c=t>0?"bottom":"top";r.push(`(${c} lighting:1.2)`)}else{const c=n>0?"front":"back";r.push(`(${c} lighting:1.2)`)}}return r},WX=e=>{if(!e.isActive)return"";const t=[];if(e.direction==="custom"&&e.customPosition){const{x:a,y:o,z:l}=e.customPosition,c=FX(a,o,l);t.push(...c),console.log("[getLightingPrompt] 自由模式 3D 坐标:",{x:a,y:o,z:l}),console.log("[getLightingPrompt] 生成的方向提示词:",c)}else{const o={top:"(top lighting:1.2), (overhead lighting:1.2)",front:"(front lighting:1.2), (flat lighting:1.1)",left:"(side lighting from left:1.2), (left rim light:1.1)",right:"(side lighting from right:1.2), (right rim light:1.1)",back:"(rim lighting:1.3), (backlighting:1.3), (silhouette lighting:1.2)",bottom:"(uplighting:1.2), (lighting from below:1.2)"}[e.direction];t.push(o)}e.hardness==="hard"?(t.push("(hard shadows:1.2)"),t.push("(high contrast:1.1)"),t.push("(sharp lighting:1.1)")):(t.push("(soft lighting:1.1)"),t.push("(diffused light:1.1)"),t.push("(volumetric fog:0.8)"));const n=e.brightness;if(n>70){const a=1.1+(n-70)/100;t.push(`(brightly lit:${a.toFixed(1)})`),t.push("(high key:1.1)")}else if(n<30){const a=1.1+(30-n)/100;t.push(`(dim lighting:${a.toFixed(1)})`),t.push("(low key:1.2)"),t.push("(moody lighting:1.1)")}const r=e.color.toLowerCase();if(r!=="#ffffff"&&r!=="#000000"&&r!=="#fff"&&r!=="#000"){const a=UX(e.color);a?(t.push(`(${a} lighting:1.2)`),t.push(`(${a} color light:1.2)`),t.push(`(${a} tint:1.1)`)):(t.push("(colored lighting:1.2)"),t.push(`(light color ${e.color}:1.1)`))}const i=t.join(", ");return console.log("[getLightingPrompt] 最终提示词:",i),i},DX=({apiConfigs:e,globalApiKey:t,connections:n,nodes:r,nodesMap:i,updateNode:a,setHistory:o,getConnectedInputImages:l,getConnectedImageForInput:c,generateId:u})=>{const d=_.useRef(null);_.useEffect(()=>{d.current=r},[r]),_.useEffect(()=>{LX()},[]);const h=_.useCallback(async g=>{var F,L,X,T,q,H,J,Z,B;const y=((F=g.settings)==null?void 0:F.mode)||"inspiration",w=g.prompt||"",v=((L=g.settings)==null?void 0:L.lyrics)||"",m=((X=g.settings)==null?void 0:X.tags)||"",z=((T=g.settings)==null?void 0:T.title)||"",C=((q=g.settings)==null?void 0:q.model)||"suno-v4",E=((H=g.settings)==null?void 0:H.continueClipId)||((J=g.settings)==null?void 0:J.clipId)||"",I=((Z=g.settings)==null?void 0:Z.continueAt)||0;if(y==="inspiration"&&!w.trim()){alert("请输入音乐描述");return}if((y==="custom"||y==="extend")&&!v.trim()){alert("请输入歌词");return}const R=e.find(V=>V.id===C||V.id.includes("suno")),A=(R==null?void 0:R.key)||t,O=((R==null?void 0:R.url)||"https://ai.comfly.chat").replace(/\/+$/,"");if(!A){alert("请先配置 API Key");return}a(g.id,{isGenerating:!0,errorMsg:void 0,settings:{...g.settings,isGenerating:!0,progress:0,error:null}}),Na.updateConfig(O,A,e);try{const V={mode:y,prompt:y==="inspiration"?w:v,tags:m||"",title:z||"",mv:C.includes("v3.0")?"chirp-v3-0":C.includes("v3.5")?"chirp-v3-5":C.includes("v4.5")?"chirp-v4-5":C.includes("v5")?"chirp-v5":"chirp-v4",continue_at:y==="extend"?I:0,continue_clip_id:y==="extend"?E:"",...y==="extend"?{task:"extend"}:{},make_instrumental:((B=g.settings)==null?void 0:B.isInstrumental)||!1,model:C},N=await Na.generateMusic(V);if(!N.success)throw console.error("[Music Generation] API Error:",N.error),new Error(N.error||"生成失败");if(!N.data)throw console.error("[Music Generation] No data in response:",N),new Error("API 响应中没有数据");let j,k,W;if(console.log("[Music Generation] Response data:",N.data),N.data.task_id)j=N.data.task_id,console.log("[Music Generation] Got task_id:",j);else if(N.data.clip_ids&&Array.isArray(N.data.clip_ids)&&N.data.clip_ids.length>0)k=N.data.clip_ids,W=N.data.clips,console.log("[Music Generation] Got clip_ids:",k,"with clips data:",!!W);else throw console.error("[Music Generation] Invalid response format:",N.data),new Error(`无法获取任务 ID 或 clip IDs。响应数据: ${JSON.stringify(N.data)}`);const M={id:u(),type:"audio",url:"",prompt:y==="inspiration"?w:v,time:ld(),status:"generating",progress:0,modelName:C,sourceNodeId:g.id,remoteTaskId:j||(k==null?void 0:k.join(","))||""};o(se=>[M,...se]);const Y=async(se=0)=>{var re,ee,pe,we,Q,me,ue,U;const oe=G=>G<30?1e3:G<60?2e3:3e3;if(se>=120){a(g.id,{isGenerating:!1,errorMsg:"生成超时"}),o(G=>G.map(te=>te.id===M.id?{...te,status:"failed",errorMsg:"生成超时"}:te));return}try{se>0&&await new Promise(Ee=>setTimeout(Ee,oe(se-1)));const te=((re=g.settings)==null?void 0:re.clipIds)||k;if(te&&te.length>0){const Ee=await Na.getMusicByClipIds(te,C);if(Ee.success&&Ee.data){const Ce=Ee.data;let xe=[];if(Array.isArray(Ce)?xe=Ce:Ce.data&&Array.isArray(Ce.data)&&(xe=Ce.data),xe.length>0){if(((ee=g.settings)==null?void 0:ee.splitTaskId)||xe.some(Ie=>{var Pe,Te,Be,He,Je,Me;return((Pe=Ie.metadata)==null?void 0:Pe.type)==="stem"||((Te=Ie.metadata)==null?void 0:Te.stem_from_id)||((Be=Ie.title)==null?void 0:Be.includes("Vocals"))||((He=Ie.title)==null?void 0:He.includes("Instrumental"))||((Je=Ie.title)==null?void 0:Je.includes("人声"))||((Me=Ie.title)==null?void 0:Me.includes("伴奏"))})){const Ie=xe.find(Me=>{var Re,Ve,Ze;return((Re=Me.title)==null?void 0:Re.includes("Vocals"))||((Ve=Me.title)==null?void 0:Ve.includes("人声"))||((Ze=Me.title)==null?void 0:Ze.toLowerCase().includes("vocal"))}),Pe=xe.find(Me=>{var Re,Ve,Ze;return((Re=Me.title)==null?void 0:Re.includes("Instrumental"))||((Ve=Me.title)==null?void 0:Ve.includes("伴奏"))||((Ze=Me.title)==null?void 0:Ze.toLowerCase().includes("instrumental"))}),Te=Ie||xe[0],Be=Pe||xe[1]||xe[0],He=(Te==null?void 0:Te.status)==="complete"&&((Te==null?void 0:Te.audio_url)||(Te==null?void 0:Te.video_url)),Je=(Be==null?void 0:Be.status)==="complete"&&((Be==null?void 0:Be.audio_url)||(Be==null?void 0:Be.video_url));if(He&&Je){const Me=Te.audio_url||Te.video_url||"",Re=Be.audio_url||Be.video_url||"";console.log("[useGeneration] 声曲分离完成:",{vocalsUrl:Me,instrumentalUrl:Re,vocalsTitle:Te.title,instrumentalTitle:Be.title}),a(g.id,{isGenerating:!1,settings:{...g.settings,stemVocalsUrl:Me,stemInstrumentalUrl:Re,stemVocalsTitle:Te.title||"人声",stemInstrumentalTitle:Be.title||"伴奏",splitTaskId:void 0}}),o(Ve=>Ve.map(Ze=>{if(Ze.id===M.id){const je=Ze.startTime?Date.now()-Ze.startTime:void 0;return{...Ze,status:"completed",progress:100,durationMs:je}}return Ze}));return}else{console.log("[useGeneration] 声曲分离进行中:",{vocalsStatus:Te==null?void 0:Te.status,instrumentalStatus:Be==null?void 0:Be.status,vocalsComplete:He,instrumentalComplete:Je}),setTimeout(()=>Y(se+1),oe(se));return}}const ke=xe.filter(Ie=>(Ie.audio_url||Ie.audioUrl)&&Ie.status==="complete");if(ke.length>0){const Ie=ke[0],Pe=Ie.id||Ie.clip_id||Ie.clipId,Te=Ie.audio_url||Ie.audioUrl,Be=Ie.title||z,He=Ie.duration||((pe=Ie.metadata)==null?void 0:pe.duration),Je=((we=Ie.metadata)==null?void 0:we.prompt)||Ie.lyrics||v;a(g.id,{isGenerating:!1,content:Te,settings:{...g.settings,clipId:Pe,audioUrl:Te,generatedLyrics:Je,musicTitle:Be,duration:He}}),ke.forEach((Me,Re)=>{var Ye,ct;const Ve=Me.id||Me.clip_id||Me.clipId,Ze=Me.audio_url||Me.audioUrl,je=Me.title||z,Le=Me.duration||((Ye=Me.metadata)==null?void 0:Ye.duration),Xe=((ct=Me.metadata)==null?void 0:ct.prompt)||Me.lyrics||v,qe=Ve||`${j}_${Re}`;if(Ze){const pt=`${je||"music"}_${qe}.mp3`;ia(Ze,qe,pt).catch(ht=>{console.error(`[Music] 下载音频${Re+1}失败:`,ht)})}const tt={id:Re===0?M.id:u(),type:"audio",url:Ze,prompt:y==="inspiration"?w:v,time:ld(),status:"completed",progress:100,modelName:C,sourceNodeId:g.id,audioUrl:Ze,duration:Le,lyrics:Xe,musicTitle:je,clipId:Ve,_assetId:qe};o(Re===0?pt=>pt.map(ht=>ht.id===M.id?tt:ht):pt=>[tt,...pt])});return}}}setTimeout(()=>Y(se+1),oe(se));return}if(!j){setTimeout(()=>Y(se+1),oe(se));return}const ge=(Q=g.settings)==null?void 0:Q.splitTaskId,ne=ge&&ge===j;let le;if(ne?le=await Na.getBackendTaskStatus(j,C):le=await Na.getMusicTaskStatus(j,C),!le.success||!le.data){setTimeout(()=>Y(se+1),oe(se));return}let fe,be,de,$e,ze;if(ne){fe=le.data,fe.data&&Array.isArray(fe.data)?(be=fe,ze=fe.data):(be=fe,ze=fe.data||[]),de=(be.status||"").toUpperCase();const Ee=be.progress||"0";$e=typeof Ee=="string"?parseInt(Ee.replace("%",""),10):Ee}else fe=le.data,be=fe.data,de=(be.status||"").toLowerCase(),$e=parseInt((be.progress||"0").replace("%",""),10),ze=be.data||[];if(o(Ee=>Ee.map(Ce=>Ce.id===M.id?{...Ce,progress:$e}:Ce)),a(g.id,{settings:{...g.settings,generationProgress:$e}}),(ne?de==="SUCCESS"||de==="COMPLETED":de==="complete")&&ze&&Array.isArray(ze)&&ze.length>0){const Ee=ze.filter(Ce=>{if(ne)return Ce.audio_url&&(Ce.status==="complete"||Ce.state==="succeeded");{const xe=(Ce.status||"").toLowerCase(),Ne=Ce.audio_url||Ce.audioUrl||Ce.video_url;return xe==="complete"&&Ne}});if(Ee.length>0){const Ce=(me=g.settings)==null?void 0:me.splitTaskId,xe=Ce||Ee.some(Ne=>{var ve,ke,Ie,Pe,Te,Be;return((ve=Ne.metadata)==null?void 0:ve.type)==="stem"||((ke=Ne.metadata)==null?void 0:ke.stem_from_id)||((Ie=Ne.title)==null?void 0:Ie.includes("Vocals"))||((Pe=Ne.title)==null?void 0:Pe.includes("Instrumental"))||((Te=Ne.title)==null?void 0:Te.includes("人声"))||((Be=Ne.title)==null?void 0:Be.includes("伴奏"))})||Ee.length===2&&Ce;if(console.log("[useGeneration] 检查声曲分离结果:",{splitTaskId:Ce,songsCount:Ee.length,isStemResult:xe,songs:Ee.map(Ne=>({title:Ne.title,metadata:Ne.metadata}))}),xe){const Ne=Ee.find(Be=>{var He,Je,Me,Re;return((He=Be.metadata)==null?void 0:He.stem_type_group_name)==="Vocals"||((Je=Be.title)==null?void 0:Je.includes("Vocals"))||((Me=Be.title)==null?void 0:Me.includes("人声"))||((Re=Be.title)==null?void 0:Re.toLowerCase().includes("vocal"))}),ve=Ee.find(Be=>{var He,Je,Me,Re;return((He=Be.metadata)==null?void 0:He.stem_type_group_name)==="Instrumental"||((Je=Be.title)==null?void 0:Je.includes("Instrumental"))||((Me=Be.title)==null?void 0:Me.includes("伴奏"))||((Re=Be.title)==null?void 0:Re.toLowerCase().includes("instrumental"))});let ke=Ne,Ie=ve;if(!ke||!Ie)if(Ee.length===1){const Be=Ee[0],He=Be.metadata;(He==null?void 0:He.stem_type)==="vocals"||(He==null?void 0:He.stem_type)==="vocal"?ke=Be:(He==null?void 0:He.stem_type)==="instrumental"?Ie=Be:ke=Be}else ke=ke||Ee[0],Ie=Ie||Ee[1]||Ee[0];(!ke||!Ie)&&(console.error("[useGeneration] 无法确定人声和伴奏,使用默认分配"),ke=ke||Ee[0],Ie=Ie||Ee[1]||Ee[0]);const Pe=(ke==null?void 0:ke.audio_url)||(ke==null?void 0:ke.video_url)||"",Te=(Ie==null?void 0:Ie.audio_url)||(Ie==null?void 0:Ie.video_url)||"";console.log("[useGeneration] 声曲分离结果:",{vocalsUrl:Pe,instrumentalUrl:Te,vocalsTitle:ke==null?void 0:ke.title,instrumentalTitle:Ie==null?void 0:Ie.title,songsCount:Ee.length}),a(g.id,{isGenerating:!1,settings:{...g.settings,stemVocalsUrl:Pe,stemInstrumentalUrl:Te,stemVocalsTitle:(ke==null?void 0:ke.title)||"人声",stemInstrumentalTitle:(Ie==null?void 0:Ie.title)||"伴奏",splitTaskId:void 0}}),o(Be=>Be.map(He=>{if(He.id===M.id){const Je=He.startTime?Date.now()-He.startTime:void 0;return{...He,status:"completed",progress:100,durationMs:Je}}return He}))}else{const Ne=Ee[0],ve=Ne.id||Ne.clip_id||Ne.clipId,ke=Ne.audio_url||Ne.audioUrl||Ne.video_url,Ie=Ne.title||z,Pe=Ne.duration||((ue=Ne.metadata)==null?void 0:ue.duration),Te=((U=Ne.metadata)==null?void 0:U.prompt)||Ne.lyrics||v;a(g.id,{isGenerating:!1,content:ke,settings:{...g.settings,clipId:ve,audioUrl:ke,generatedLyrics:Te,musicTitle:Ie,duration:Pe}})}Ee.forEach((Ne,ve)=>{var Me,Re;const ke=Ne.id||Ne.clip_id||Ne.clipId,Ie=Ne.audio_url||Ne.audioUrl,Pe=Ne.title||z,Te=Ne.duration||((Me=Ne.metadata)==null?void 0:Me.duration),Be=((Re=Ne.metadata)==null?void 0:Re.prompt)||Ne.lyrics||v,He=ke||`${j}_${ve}`;Ie&&ia(Ie,He,`${Pe||"music"}_${He}.mp3`).catch(Ve=>{console.error(`[Music] 下载音频${ve+1}失败:`,Ve)});const Je={id:ve===0?M.id:u(),type:"audio",url:Ie,prompt:y==="inspiration"?w:v,time:ld(),status:"completed",progress:100,modelName:C,sourceNodeId:g.id,audioUrl:Ie,duration:Te,lyrics:Be,musicTitle:Pe,_assetId:He};o(ve===0?Ve=>Ve.map(Ze=>Ze.id===M.id?Je:Ze):Ve=>[Je,...Ve])});return}}if(de==="error"||de==="failed"){const Ee=be.fail_reason||fe.message||"生成失败";a(g.id,{isGenerating:!1,errorMsg:Ee}),o(Ce=>Ce.map(xe=>xe.id===M.id?{...xe,status:"failed",errorMsg:Ee}:xe));return}setTimeout(()=>Y(se+1),oe(se))}catch(G){console.error("[Music Generation] Poll error:",G),setTimeout(()=>Y(se+1),oe(se))}};Y()}catch(V){console.error("[Music Generation] Error:",V),a(g.id,{isGenerating:!1,errorMsg:V.message||"生成失败"})}},[e,t,a,o,u]),p=_.useCallback(async g=>{var ge,ne,le,fe,be,de,$e,ze,_e,Ee,Ce,xe,Ne,ve,ke,Ie,Pe,Te,Be,He,Je,Me,Re,Ve,Ze,je,Le,Xe;if(console.log("[useGeneration] generate 函数被调用",{nodeId:g.id,nodeType:g.type,nodeX:g.x,nodeY:g.y,prompt:(ge=g.prompt)==null?void 0:ge.substring(0,50),timestamp:new Date().toISOString()}),console.log("[useGeneration] 使用传入的 node 数据,settings:",g.settings),console.log("[useGeneration] 当前状态:",{totalNodes:r.length,totalConnections:n.length,connectionsFromThisNode:n.filter(qe=>qe.from===g.id).length}),g.type==="gen-music")return console.log("[useGeneration] 调用 generateMusic"),h(g);let y=g.prompt||"";const w=n.filter(qe=>qe.to===g.id&&(!qe.inputType||qe.inputType==="default")),v=[],m=[];for(const qe of w){const tt=i.get(qe.from);if(tt){if(tt.type==="custom-agent"){const Ye=((ne=tt.settings)==null?void 0:ne.outputContent)||"";Ye.trim()&&(v.push(Ye.trim()),console.log("[useGeneration] 检测到上游 Agent 节点输出:",{nodeId:tt.id,contentLength:Ye.length}))}else if(tt.type==="text-node"||tt.type==="novel-input"){const Ye=(((le=tt.settings)==null?void 0:le.text)||tt.prompt||tt.content||"").trim();Ye&&m.push(Ye)}else if(tt.type==="storyboard-node"){const Ye=((fe=tt.settings)==null?void 0:fe.jsonData)||"";Ye.trim()&&m.push(Ye.trim())}}}const z=["gen-video","gen-image","generate-character-video","generate-scene-video"].includes(g.type);if(z&&!y.trim()){const qe=[...m,...v].filter(Boolean).join(` + +`).trim();qe?(y=qe,console.log("[useGeneration] 打组执行:node.prompt 为空,使用上游合并提示词,长度:",y.length)):(y="视频生成",console.log("[useGeneration] 打组执行:无上游内容,使用默认提示词避免 API 400"))}const C=n.find(qe=>qe.to===g.id&&(!qe.inputType||qe.inputType==="default")),E=C?i.get(C.from):null;let I=null;if(E&&E.type==="storyboard-node"){const qe=(be=E.settings)==null?void 0:be.jsonData;if(qe)try{I=JSON.parse(qe)}catch(tt){console.error("[useGeneration] 解析分镜JSON数据失败:",tt)}}const R=n.filter(qe=>qe.to===g.id&&(!qe.inputType||qe.inputType==="default")),A=[],O=[];let F="",L=null,X=!1;R.forEach(qe=>{var Ye,ct,pt,ht;const tt=i.get(qe.from);if(tt){if(tt.type==="camera-movement"){const wt=(Ye=tt.settings)==null?void 0:Ye.movementConfig;wt&&Sy(wt)}else if(tt.type==="professional-camera"){const wt=(ct=tt.settings)==null?void 0:ct.cinemaConfig;if(wt){const $t=wm(wt);$t&&A.push($t)}}else if(tt.type==="input-image"){const wt=(pt=tt.settings)==null?void 0:pt.multiAngle;if(wt&&wt.isActive){X=!0;const jt=wt.sceneMode||"character";let Nt;jt==="architecture"?(Nt=Oq(wt),console.log("[Generation] 🏗️ 使用建筑模式提示词"),console.log("[Generation] ControlNet 降权:",Nt.needsControlNetReduction?"是(0.35-0.45)":"否")):(Nt=XP(wt),console.log("[Generation] 👤 使用人物模式提示词")),F=Nt.augmentedPrompt,L=Nt.angleMetadata?{...Nt.angleMetadata,sceneMode:wt.sceneMode,needsControlNetReduction:Nt.needsControlNetReduction||!1}:null,console.log("[Generation] 角度提示词已启用:",{sceneMode:jt,angleAugmentedPrompt:F,angleMetadata:L,sourceNodeId:tt.id,multiAngle:wt})}else wt&&!wt.isActive&&console.log("[Generation] 角度配置存在但未启用:",{sourceNodeId:tt.id,multiAngle:wt});const $t=(ht=tt.settings)==null?void 0:ht.lighting;if($t&&$t.isActive){const jt=WX($t);jt&&(O.push(jt),console.log("[Generation] 💡 重打光提示词已添加:",{lightingPrompt:jt,sourceNodeId:tt.id,lighting:$t}))}}}});const T=(de=g.settings)==null?void 0:de.cinemaConfig,q=T?wm(T):"";q&&A.push(q);const H=jq(y);let J="";if(X){const qe=H.trim()==="视频生成"?"":H.trim();qe?J=F?`${F}, ${qe}`:qe:J=F||"",console.log("[useGeneration] 📸 导演相机模式已启动,最终提示词:",J)}else J=H;if(v.length>0&&!z){const qe=v.join(` + +`);J.trim()?J=`${J} + +${qe}`:J=qe,console.log("[useGeneration] 🤖 已添加 Agent 输出到提示词,总长度:",J.length)}const Z=[],B=[],V=[];for(const qe of R){const tt=i.get(qe.from);if(tt&&tt.type==="input-image"){if(tt.markers&&tt.markers.length>0){const Ye=tt.markers.filter(ct=>ct.label&&ct.label.trim()&&!ct.isAnalyzing);if(Ye.length>0)try{const{generateMarkerMask:ct,buildMarkerPrompt:pt}=await mn(async()=>{const{generateMarkerMask:Yt,buildMarkerPrompt:un}=await Promise.resolve().then(()=>yv);return{generateMarkerMask:Yt,buildMarkerPrompt:un}},void 0,import.meta.url);let ht=1024,wt=1024;if(tt.content)try{const Yt=new Image;await new Promise((un,Tn)=>{Yt.onload=()=>{ht=Yt.naturalWidth||Yt.width,wt=Yt.naturalHeight||Yt.height,console.log("[Generation] 获取到实际图片尺寸:",{width:ht,height:wt}),un()},Yt.onerror=()=>{console.warn("[Generation] 无法加载图片,使用默认尺寸"),un()},Yt.src=tt.content||""})}catch(Yt){console.warn("[Generation] 获取图片尺寸失败,使用默认尺寸:",Yt)}const $t=Ye.map(Yt=>({...Yt,x:Yt.x/100,y:Yt.y/100})),jt=ct(ht,wt,$t);B.push({nodeId:tt.id,mask:jt,width:ht,height:wt,markerCount:Ye.length});const Nt=pt(Ye,ht,wt);Z.push(Nt),console.log("[Generation] 已生成标记蒙版:",{nodeId:tt.id,markerCount:Ye.length,imageSize:`${ht}×${wt}`,maskSize:jt.length})}catch(ct){console.error("[Generation] 生成标记蒙版失败:",ct);const pt=1024,ht=1024,wt=Ye.map(($t,jt)=>{const Nt=Math.round($t.x/100*pt),Yt=Math.round($t.y/100*ht),un=Math.round($t.x),Tn=Math.round($t.y);return`${jt+1}. [位置: (${Nt}, ${Yt})像素 / (${un}%, ${Tn}%)从左上角] ${$t.label}`}).join(` +`);Z.push(wt)}}if(($e=tt.settings)!=null&&$e.textEditData)try{const Ye=JSON.parse(tt.settings.textEditData);if(Ye.modifications&&Array.isArray(Ye.modifications)){const ct=Ye.modifications.map((pt,ht)=>`${ht+1}. 将"${pt.originalText}"修改为"${pt.newText}"`).join(` +`);V.push(ct),console.log("[Generation] 检测到文字编辑数据:",ct)}}catch(Ye){console.error("[Generation] 解析文字编辑数据失败:",Ye)}}}const N=Z.length>0,j=V.length>0,k=O.length>0,W=v.length>0;if(!J.trim()&&!X&&!N&&!j&&!k&&!W){console.warn("[useGeneration] 提示词为空、角度未启用、且没有标记说明、文字编辑、灯光设置或 Agent 输出"),alert("请输入提示词、启用角度调整功能、添加图片标记说明、使用文字编辑、设置灯光或连接 Agent 节点");return}if(!J.trim()&&X&&!N&&!j&&!k){console.error("[useGeneration] 角度已启用但提示词仍为空,这是一个异常情况"),console.error("[useGeneration] angleAugmentedPrompt:",F),console.error("[useGeneration] angleMetadata:",L),alert("角度配置异常,请检查角度设置或输入提示词");return}const Y=A.length>0||J!==y?", highly cinematic, professional cinematography":"",se=[];J.trim()&&se.push(J),A.length>0&&se.push(A.join(", ")),O.length>0&&se.push(O.join(", "));let ie=se.join(", ");const oe=((ze=g.settings)==null?void 0:ze.model)||(g.type==="gen-image"?"qwen-image-edit":"sora-2");if(g.type==="gen-image"||g.type==="gen-video"){const qe=(l(g.id)||[]).length;qe>0&&ie&&!hl(oe)&&(ie=ie.replace(/@(\d+)/g,(tt,Ye)=>{const ct=parseInt(Ye,10);return!ct||ct>qe?tt:`图片${ct}`}))}if(Y&&(ie=`${ie}${Y}`),N){const qe=Z.join(` + +`);ie=`${ie} + +${qe}`,console.log("[Generation] 已添加图片标记说明到提示词(含蒙版):",qe)}if(j){const qe=V.join(` + +`);ie=`${ie} + +文字编辑要求: +${qe}`,console.log("[Generation] 已添加文字编辑数据到提示词:",qe)}const re=((_e=g.settings)==null?void 0:_e.model)||(g.type==="gen-image"?"qwen-image-edit":"sora-2"),ee=re.includes("mj")||re.toLowerCase().includes("midjourney"),pe=re.includes("jimeng"),we=re.includes("nano-banana-2")||re.includes("gemini-3.1-flash-image-preview"),Q=g.type==="gen-video"||g.type==="generate-character-video"||g.type==="generate-scene-video"||g.type==="motion-control",me=e.find(qe=>qe.id===re),ue=(me==null?void 0:me.key)||t;if(!ue){alert("请先配置API Key");return}a(g.id,{isGenerating:!0,errorMsg:void 0});let U,G="",te=null;try{const qe=((Ee=g.settings)==null?void 0:Ee.ratio)||"Auto",tt=((Ce=g.settings)==null?void 0:Ce.resolution)||"Auto";let Ye=((me==null?void 0:me.url)||"https://ai.comfly.chat").replace(/\/+$/,"").trim();(!Ye||!/^https?:\/\//i.test(Ye))&&(Ye="https://ai.comfly.chat"),U=u();let ct=l(g.id);ct=ct.filter(Wt=>{if(!Wt)return!1;const Pt=Wt.trim();return!(!Pt||Pt.length===0||Pt==="undefined"||Pt==="null")});const pt=ct.length>0;if(g.type==="gen-image"&&re.includes("qwen-image-edit")&&!pt){alert("Qwen Image Edit(qwen-image-edit)为图生图接口,请先连接参考图片。"),a(g.id,{isGenerating:!1,errorMsg:"需要参考图片"});return}if(console.log("[Generation] 获取参考图片:",{refImagesCount:ct.length,refImages:ct.map(Wt=>Wt.substring(0,50))}),pt)try{const{contentStore:Wt}=await mn(async()=>{const{contentStore:Pt}=await Promise.resolve().then(()=>Nh);return{contentStore:Pt}},void 0,import.meta.url);await Wt.init(),ct=await Promise.all(ct.map(async(Pt,Bt)=>{if(Pt.startsWith("content_ref:")){const zt=Wt.extractId(Pt),Gt=await Wt.get(zt);return Gt||(console.warn(`[Generation] ⚠️ Content not found in store: ${zt}`),Pt)}return Pt}))}catch(Wt){console.error("[Generation] ❌ Failed to resolve content_ref:",Wt)}const ht={id:U,url:"",type:Q?"video":"image",prompt:ie||(pt?`Img2${Q?"Vid":"Img"}`:"Untitled"),time:new Date().toLocaleTimeString(),status:"generating",progress:0,modelName:(me==null?void 0:me.provider)||re,klingTaskType:g.type==="motion-control"?"motion-control":void 0,sourceNodeId:g.id,targetPreviewId:(xe=g.settings)==null?void 0:xe._autoCreatedPreviewId,startTime:Date.now(),apiConfig:{modelId:re,baseUrl:Ye,apiKey:ue}};o(Wt=>[ht,...Wt]);const wt=((Ne=g.settings)==null?void 0:Ne.batchSize)||1;if(!Q&&wt>1){const Wt=new Array(wt).fill(""),Pt=Array.from({length:wt},(rt,lt)=>lt===0?U??`batch-${Date.now()}-0`:u()??`batch-${Date.now()}-${lt}`),Bt=new Set;Pt.forEach((rt,lt)=>{let ot=rt;if(Bt.has(ot)&&(ot=u()??`batch-${Date.now()}-${lt}`,Pt[lt]=ot),Bt.add(ot),lt===0)return;const At={id:ot,url:"",type:"image",prompt:`${ie||"Untitled"} (${lt+1}/${wt})`,time:new Date().toLocaleTimeString(),status:"generating",progress:0,modelName:(me==null?void 0:me.provider)||re||"unknown",sourceNodeId:g.id,apiConfig:{modelId:re,baseUrl:Ye,apiKey:ue}};o(kt=>kt.some(dn=>dn.id===ot)?(console.warn(`[Generation] History item with ID ${ot} already exists, skipping`),kt):[At,...kt])});const zt=await v1({node:g,currentModel:re,config:me,baseUrl:Ye,prompt:ie,ratio:qe,resolution:tt,refImages:ct,hasReferenceImage:pt,isVideoGeneration:Q,isMidjourney:ee,isJimeng:pe,isNanoBanana2:we,taskId:U,apiKey:ue,getConnectedImageForInput:c,setHistory:o,updateNode:a,angleMetadata:L,storyboardJsonData:I,nodes:r,connections:n,markerMasks:B});if(!zt)return;const{endpoint:Gt,payload:qt,useMultipart:De}=zt,st=De?{Authorization:`Bearer ${ue}`}:{"Content-Type":"application/json",Authorization:`Bearer ${ue}`},nt=re.includes("z-image")?4e3:50;console.log(`[Batch] 批量生成模型: ${re}, 请求间隔: ${nt}ms`);const _t=Pt.map(async(rt,lt)=>{if(lt>0){const ot=lt*nt;console.log(`[Batch] 请求 ${lt+1} 延迟 ${ot}ms`),await new Promise(At=>setTimeout(At,ot))}try{let ot;if(De&&qt instanceof FormData){ot=new FormData;for(const[Ot,dn]of qt.entries())Ot==="n"?ot.append("n","1"):ot.append(Ot,dn)}else ot={...qt,n:1};const At=await Pl(Gt,{method:"POST",headers:st,body:De?ot:JSON.stringify(ot)});if(!At.ok)throw new Error(`请求${lt+1}失败: ${At.status}`);const kt=await At.json();return{taskId:rt,result:kt,error:null,index:lt}}catch(ot){return console.error(`[Generation] 批量请求 ${lt+1} 失败:`,ot),{taskId:rt,result:null,error:ot,index:lt}}}),xt=await Promise.all(_t),St=(()=>{var kt,Ot;const rt=Jf(g.id,n,r);if(rt.length===0){console.warn("[Batch] 节点没有连接的预览窗口:",g.id);return}const lt=(kt=g.settings)==null?void 0:kt.selectedPreviewId,ot=(Ot=g.settings)==null?void 0:Ot._autoCreatedPreviewId,At=lt&&rt.includes(lt)?lt:ot&&rt.includes(ot)?ot:rt[0];return console.log("[Batch] 节点",g.id,"使用预览窗口:",At,"(selectedPreviewId:",lt,", 共",rt.length,"个预览)"),At})();let Qe=0,Ue=0;for(const{taskId:rt,result:lt,error:ot,index:At}of xt){if(ot||!lt){Ue++,o(kt=>kt.map(Ot=>Ot.id===rt?{...Ot,status:"failed",progress:0}:Ot)),console.error(`[Generation] ❌ 批量任务 ${At+1} 失败:`,ot);continue}At>0&&await new Promise(kt=>setTimeout(kt,150));try{await jg({result:lt,taskId:rt,node:g,baseUrl:Ye,apiKey:ue,currentModel:re,isMidjourney:ee,isVideoGeneration:Q,connections:n,nodes:r,nodesRef:d,updateNode:a,setHistory:o,connectedPreviewId:St,batchAccumulator:Wt,batchIndex:At}),Qe++}catch(kt){Ue++,console.error(`[Generation] ❌ 批量任务 ${At+1} 处理失败:`,kt),o(Ot=>Ot.map(dn=>dn.id===rt?{...dn,status:"failed",progress:0}:dn))}}await(async()=>{const ot=Date.now();for(;Date.now()-ot<3e5;){const At=await new Promise(dn=>{o(Vt=>(dn(Vt),Vt))});if(Pt.every(dn=>{const Vt=At.find(Zt=>Zt.id===dn);return Vt&&(Vt.status==="completed"||Vt.status==="failed")}))break;await new Promise(dn=>setTimeout(dn,1e3));const Ot=Pt.filter(dn=>{const Vt=At.find(Zt=>Zt.id===dn);return Vt&&(Vt.status==="completed"||Vt.status==="failed")}).length}})();const at=Wt.filter(rt=>rt&&rt.length>0);at.lengthrt?null:lt).filter(rt=>rt!==null)));return}let jt="",Nt,Yt=!1;const un=await v1({node:g,currentModel:re,config:me,baseUrl:Ye,prompt:ie,ratio:qe,resolution:tt,refImages:ct,hasReferenceImage:pt,isVideoGeneration:Q,isMidjourney:ee,isJimeng:pe,isNanoBanana2:we,taskId:U,apiKey:ue,getConnectedImageForInput:c,setHistory:o,updateNode:a,angleMetadata:L,nodes:r,connections:n,markerMasks:B});if(!un)return;jt=un.endpoint,G=un.endpoint,Nt=un.payload,Yt=un.useMultipart;const Tn=ru(re)?"Token":"Bearer",Ht=Yt?{Authorization:`${Tn} ${ue}`}:{"Content-Type":"application/json",Authorization:`${Tn} ${ue}`};if(e0(re)&&String(Ye||"").includes("generativelanguage.googleapis.com")&&(Ht["Content-Type"]="application/json",Ht["x-goog-api-key"]=ue,delete Ht.Authorization,console.log("[Gemini Image] 使用 x-goog-api-key 请求头(官方域名)")),wc(re)&&String(Ye||"").includes("generativelanguage.googleapis.com")&&(Ht["Content-Type"]="application/json",Ht["x-goog-api-key"]=ue,delete Ht.Authorization,console.log("[Gemini Veo] 使用 x-goog-api-key 请求头(官方域名)")),Sx(re)&&(Ht["X-DashScope-Async"]="enable",console.log("[Wan 2.6 Official] 添加异步请求头: X-DashScope-Async=enable")),Nv(re)){const Wt=((ve=g.settings)==null?void 0:ve.enableInterleave)??!1,Pt=Wt&&(((ke=g.settings)==null?void 0:ke.useStream)??!1),Bt=((Ie=g.settings)==null?void 0:Ie.useAsyncMode)??!0;Wt&&Pt?(Ht["X-DashScope-Sse"]="enable",console.log("[Wan 2.6 Image Official] 添加流式请求头: X-DashScope-Sse=enable")):(Bt||!Wt)&&(Ht["X-DashScope-Async"]="enable",console.log("[Wan 2.6 Image Official] 添加异步请求头: X-DashScope-Async=enable"))}if(console.log("[Generation] Sending request:",{endpoint:jt,useMultipart:Yt,payload:Yt?"FormData":Nt,model:re}),dl(re)){console.log("[Veo] 📤 发送请求详情:",{endpoint:jt,model:re,payload:Nt,payloadModel:Nt.model,hasImages:!!Nt.images,imagesCount:((Pe=Nt.images)==null?void 0:Pe.length)||0,imagesPreview:(Te=Nt.images)==null?void 0:Te.map((Pt,Bt)=>({index:Bt,type:Pt.startsWith("data:")?"base64":Pt.startsWith("http")?"http":"unknown",length:Pt.length,mimeType:Pt.startsWith("data:")?Pt.substring(5,Pt.indexOf(";")):"N/A"}))});const Wt={...Nt};Wt.images&&(Wt.images=`[${Wt.images.length} images, ${Wt.images.map(Pt=>Pt.length).join(", ")} bytes]`),console.log("[Veo] 📤 完整 Payload(不含图片):",JSON.stringify(Wt,null,2))}if(No(re)&&(console.log("[Kling O1] ========== 发送请求前最终检查 =========="),console.log("[Kling O1] Endpoint:",jt),console.log("[Kling O1] Payload 对象:",Nt),console.log("[Kling O1] Payload JSON:",JSON.stringify(Nt,null,2)),console.log("[Kling O1] 字段检查:"),console.log(" - model_name:",Nt.model_name,"(类型:",typeof Nt.model_name,")"),console.log(" - model:",Nt.model,"(应该是 undefined)"),console.log(" - duration:",Nt.duration,"(类型:",typeof Nt.duration,")"),console.log(" - mode:",Nt.mode),console.log(" - aspect_ratio:",Nt.aspect_ratio),console.log(" - element_list:",Nt.element_list),console.log("[Kling O1] ==========================================")),e0(re)&&U){const Wt=[10,25,40,55,70,85];let Pt=0;te=setInterval(()=>{if(Pt>=Wt.length)return;const Bt=Wt[Pt++];o(zt=>zt.map(Gt=>Gt.id===U?{...Gt,progress:Bt}:Gt)),a(g.id,{settings:{...g.settings,progress:Bt}})},1800)}const fn=await Pl(jt,{method:"POST",headers:Ht,body:Yt?Nt:JSON.stringify(Nt)});if(!fn.ok){const Wt=await fn.text();if(console.error("[Generation] API Error:",{status:fn.status,errorText:Wt,endpoint:jt}),re==="seedance-2.0"&&fn.status===400&&!Yt&&Nt&&typeof Nt=="object"&&Array.isArray(Nt.content)&&Nt.content.some(zt=>{var Gt;return(zt==null?void 0:zt.type)==="image_url"&&typeof((Gt=zt==null?void 0:zt.image_url)==null?void 0:Gt.url)=="string"&&zt.image_url.url.startsWith("asset://")}))try{const Gt=(((Be=g.settings)==null?void 0:Be.seedanceMaterials)||[]).filter(Ae=>Ae.type==="image"&&!!Ae.url).map(Ae=>Ae.url);let qt=0;const De={...Nt,content:Nt.content.map(Ae=>{var nt;if((Ae==null?void 0:Ae.type)==="image_url"&&typeof((nt=Ae==null?void 0:Ae.image_url)==null?void 0:nt.url)=="string"&&Ae.image_url.url.startsWith("asset://")){const _t=Gt[qt++]||Ae.image_url.url;return{...Ae,image_url:{...Ae.image_url,url:_t}}}return Ae})};console.warn("[Seedance 2.0] asset:// returned 400, retrying with original image URLs once");const st=await Pl(jt,{method:"POST",headers:Ht,body:JSON.stringify(De)});if(st.ok){const Ae=await st.text();let nt;try{nt=JSON.parse(Ae)}catch{throw new Error(`重试成功但响应非 JSON: ${Ae.slice(0,120)}`)}const _t=Jf(g.id,n,r),xt=(He=g.settings)==null?void 0:He.selectedPreviewId,Tt=xt&&_t.includes(xt)?xt:((Je=g.settings)==null?void 0:Je._autoCreatedPreviewId)||(_t.length>0?_t[0]:void 0);await jg({result:nt,node:g,currentModel:re,taskId:U,connectedPreviewId:Tt,isVideoGeneration:Q,isBatchGeneration:!1,endpoint:jt,baseUrl:Ye,apiKey:ue});return}else try{const Ae=Gt[0],nt=(Nt.content||[]).filter(Tt=>(Tt==null?void 0:Tt.type)==="text");Ae&&nt.push({type:"image_url",image_url:{url:Ae},role:"reference_image"});const _t={model:Nt.model,content:nt,ratio:Nt.ratio||"16:9",duration:Nt.duration||5,watermark:Nt.watermark??!1};console.warn("[Seedance 2.0] fallback #2 minimal retry:",{model:_t.model,duration:_t.duration,ratio:_t.ratio,hasFirstImage:!!Ae,firstImageHead:(Ae||"").slice(0,80)});const xt=await Pl(jt,{method:"POST",headers:Ht,body:JSON.stringify(_t)});if(xt.ok){const Tt=await xt.text();let St;try{St=JSON.parse(Tt)}catch{throw new Error(`极简重试成功但响应非 JSON: ${Tt.slice(0,120)}`)}const Qe=Jf(g.id,n,r),Ue=(Me=g.settings)==null?void 0:Me.selectedPreviewId,Ge=Ue&&Qe.includes(Ue)?Ue:((Re=g.settings)==null?void 0:Re._autoCreatedPreviewId)||(Qe.length>0?Qe[0]:void 0);await jg({result:St,node:g,currentModel:re,taskId:U,connectedPreviewId:Ge,isVideoGeneration:Q,isBatchGeneration:!1,endpoint:jt,baseUrl:Ye,apiKey:ue});return}}catch(Ae){console.error("[Seedance 2.0] fallback #2 minimal retry failed:",Ae)}}catch(zt){console.error("[Seedance 2.0] fallback retry failed:",zt)}dl(re)&&console.error("[Veo] ❌ API 请求失败:",{status:fn.status,statusText:fn.statusText,errorText:Wt,endpoint:jt,model:re});let Bt=Wt;try{const zt=JSON.parse(Wt);zt!=null&&zt.error&&typeof zt.error=="string"&&(Bt=zt.error)}catch{}throw new Error(Bt||`API请求失败: ${fn.status}`)}const Dn=await fn.text();let it;try{it=JSON.parse(Dn)}catch{throw console.error("[Generation] ❌ 响应不是有效的 JSON:",{responsePreview:Dn.substring(0,200),endpoint:jt,model:re}),Dn.trim().toLowerCase().startsWith("0?Lt[0]:void 0);if(No(re)){console.log("[Kling O1] ========== 使用独立响应处理 =========="),console.log("[Kling O1] 响应数据:",JSON.stringify(it,null,2));const Wt=((je=it.data)==null?void 0:je.task_id)||it.task_id||((Le=it.data)!=null&&Le.data&&typeof it.data.data=="object"?it.data.data.task_id:null);if(console.log("[Kling O1] 提取的 task_id:",Wt),Wt)o(Pt=>Pt.map(Bt=>Bt.id===U?{...Bt,status:"generating",progress:0,remoteTaskId:String(Wt)}:Bt)),bK(String(Wt),Pt=>{var Bt;if(console.log("[Kling O1] 收到 callback 数据:",Pt),Pt.task_status==="succeed"||Pt.task_status==="success"){const zt=(Bt=Pt.task_result)==null?void 0:Bt.videos;if(zt&&zt.length>0&&zt[0].url){const Gt=zt[0].url;console.log("[Kling O1] 从 callback 获取视频 URL:",Gt),o(De=>De.map(st=>st.id===U?{...st,status:"completed",url:Gt,progress:100}:st)),a(g.id,{isGenerating:!1});const qt=n.filter(De=>De.from===g.id).map(De=>De.to);if(qt.length>0){console.log("[Kling O1] 需要更新预览节点:",qt);const De=new CustomEvent("klingO1VideoComplete",{detail:{taskId:String(Wt),videoUrl:Gt,sourceNodeId:g.id,previewNodeIds:qt,previewSourceModel:re}});window.dispatchEvent(De)}}else console.error("[Kling O1] callback 中没有视频 URL")}else if(Pt.task_status==="failed"||Pt.task_status==="failure"){const zt=Pt.task_status_msg||"生成失败";console.error("[Kling O1] 任务失败:",zt),o(Gt=>Gt.map(qt=>qt.id===U?{...qt,status:"failed",errorMsg:zt,progress:0}:qt)),a(g.id,{isGenerating:!1,errorMsg:zt})}});else{console.error("[Kling O1] 未找到 task_id,响应:",it);const Pt=it.message||it.error||"创建任务失败:未返回 task_id";a(g.id,{isGenerating:!1,errorMsg:Pt}),o(Bt=>Bt.map(zt=>zt.id===U?{...zt,status:"failed",progress:0,errorMsg:Pt}:zt))}return}await jg({result:it,taskId:U,node:g,baseUrl:Ye,apiKey:ue,currentModel:re,isMidjourney:ee,isVideoGeneration:Q,connections:n,nodes:r,nodesRef:d,updateNode:a,setHistory:o,connectedPreviewId:Jt})}catch(qe){console.error("生成失败:",qe);const tt=qe.message;let Ye=tt;(tt.includes("Failed to fetch")||tt.includes("fetch"))&&(Ye=`网络请求失败: ${tt} +`,Ye+=`模型: ${re} +`,Ye+=`URL: ${(me==null?void 0:me.url)||"unknown"} +`,Ye+=`Endpoint: ${G||"unknown"} +`,Ye+=`Protocol: ${window.location.protocol} +`,Ye+=`Hostname: ${window.location.hostname}`),a(g.id,{isGenerating:!1,errorMsg:Ye}),U&&o(pt=>pt.map(ht=>ht.id===U?{...ht,status:"failed",progress:0,errorMsg:Ye}:ht));const ct=(Xe=g.settings)==null?void 0:Xe._autoCreatedPreviewId;if(ct)try{window.dispatchEvent(new CustomEvent("previewGenerateFailed",{detail:{previewNodeId:ct}}))}catch{}}finally{te!=null&&clearInterval(te)}},[e,t,n,r,i,a,o,l,c,u,h]),f=_.useCallback(async(g,y,w,v,m=1.5,z,C,E,I)=>{const R=v.modelName||v.id;R.includes("gpt-image")||R.includes("gpt-4o-image")||R.includes("nano-banana-2")||R.includes("gemini-3.1-flash-image-preview")||console.warn("[Expand] 当前模型可能不支持蒙版扩图,仍尝试请求:",R);const O=(v.url||"").replace(/\/$/,""),F=v.key||t||"";if(!O||!F)return console.error("[Expand] 缺少 baseUrl 或 apiKey"),null;let L=null;try{const{compositeBlob:X,maskBase64:T,width:q,height:H}=await fG(g,y,m,z,C,I);L=URL.createObjectURL(X);const J=!y||y==="原比例"||y==="Auto"?"Auto":y,Z=`expand-${Date.now()}`,B={id:Z,type:"gen-image",x:0,y:0,width:200,height:200,prompt:"",settings:{selectedModel:v.id,ratio:J,resolution:E||"",useAsyncMode:!0,gptImageQuality:"standard"}},V=await v1({node:B,currentModel:R,config:v,baseUrl:O,prompt:w.trim()||"基于原图自然扩展画面,保持风格一致",ratio:J,resolution:E||"",refImages:[L],hasReferenceImage:!0,isVideoGeneration:!1,isMidjourney:!1,isJimeng:R.includes("jimeng")&&!R.includes("jimeng-video"),isNanoBanana2:R.includes("nano-banana-2")||R.includes("gemini-3.1-flash-image-preview"),taskId:Z,apiKey:F,getConnectedImageForInput:()=>null,setHistory:o,updateNode:()=>{},nodes:[],connections:[],markerMasks:[{nodeId:Z,mask:T,width:q,height:H}],expandMode:!0});if(!V)return null;const{endpoint:N,payload:j,useMultipart:k}=V,W=k?{Authorization:`Bearer ${F}`}:{"Content-Type":"application/json",Authorization:`Bearer ${F}`},M=await Pl(N,{method:"POST",headers:W,body:k?j:JSON.stringify(j)});if(!M.ok){const re=await M.text();throw new Error(`扩图请求失败: ${M.status} ${re}`)}const Y=await M.json(),se=Y.data,ie=(se==null?void 0:se.id)??Y.task_id??(se==null?void 0:se.task_id)??Y.id;if(ie){const re=ee=>ee<20?800:ee<50?1500:3e3;for(let ee=0;ee<200;ee++){ee>0&&await new Promise(ue=>setTimeout(ue,re(ee-1)));const pe=`${O}/v1/images/tasks/${ie}`,Q=await(await Pl(pe,{headers:{Authorization:`Bearer ${F}`}})).json(),me=L5(Q);if(me==="COMPLETED"||me==="SUCCESS"||me==="SUCCEEDED"||me==="FINISHED"||me==="DONE"){const ue=Wx(Q,!1,!1);if(ue.length>0)return ue}if(me==="FAILED"||me==="ERROR"){const ue=B5(Q,String(me));throw new Error(ue||"扩图任务失败")}}throw new Error("扩图轮询超时")}const oe=Wx(Y,!1,!1);return oe.length>0?oe:null}catch(X){throw console.error("[Expand] 扩图失败:",X),X}finally{L&&URL.revokeObjectURL(L)}},[t,o]),b=_.useCallback(async g=>{const{nodeId:y,cells:w,model:v,ratio:m,resolution:z,refImages:C,connections:E,nodes:I,updateNode:R,setNodes:A,setConnections:O,generateId:F,gridRows:L,gridCols:X,targetPreviewId:T,cellIndices:q}=g,H=e.find(U=>U.id===v),J=(H==null?void 0:H.key)||t,Z=((H==null?void 0:H.url)||"https://ai.comfly.chat").replace(/\/+$/,"");if(!H||!Z||!J)throw new Error("请先配置 API Key");const B=vK(v);if(!["jimeng","gpt-image","flux-kontext","qwen-image-edit","nano-banana","nano-banana-2","grsai","generic"].includes(B))throw new Error(`当前模型 ${v} 暂不支持分镜图表批量生成,请使用 Nano Banana、即梦、GPT Image 等`);let N=(C||[]).filter(U=>{if(!U||typeof U!="string")return!1;const G=U.trim();return G.length>0&&G!=="undefined"&&G!=="null"});if(N.length>0)try{const{contentStore:U}=await mn(async()=>{const{contentStore:G}=await Promise.resolve().then(()=>Nh);return{contentStore:G}},void 0,import.meta.url);await U.init(),N=await Promise.all(N.map(async G=>{if(G.startsWith("content_ref:")){const te=U.extractId(G);return await U.get(te)||G}return G}))}catch(U){console.warn("[generateChartBatch] content_ref 解析失败,使用原始 refImages:",U)}const j=w.filter(U=>(U.prompt||"").trim());if(j.length===0)throw new Error("请至少填写一个分镜描述");const k=Jf(y,E,I);let W=T&&k.includes(T)?T:k[0];if(!W&&A&&O&&F){const{createNode:U}=await mn(async()=>{const{createNode:le}=await Promise.resolve().then(()=>RY);return{createNode:le}},void 0,import.meta.url),G=I.find(le=>le.id===y),te=G?G.x+(G.width||540)+80:100,ge=G?G.y:100,ne=U(F(),"preview",te,ge,void 0,void 0,I);A(le=>[...le,ne]),O(le=>[...le,{id:F(),from:y,to:ne.id}]),W=ne.id}if(!W)throw new Error("请连接一个预览节点或将分镜图表连接到预览");const M=I.find(U=>U.id===y);if(!M)throw new Error("分镜图表节点不存在");const Y=(H==null?void 0:H.provider)||(H==null?void 0:H.modelName)||v,se=B==="jimeng",ie=B==="nano-banana-2",oe=j.map(()=>F?F():`chart-${Date.now()}-${Math.random().toString(36).slice(2,9)}`),re=new Array(j.length).fill(""),ee=Date.now(),pe=oe.map((U,G)=>({id:U,type:"image",url:"",prompt:j[G].prompt,time:ld(),status:"generating",progress:0,modelName:Y,sourceNodeId:y,targetPreviewId:W,startTime:ee,chartCellIndex:q==null?void 0:q[G]}));o(U=>[...pe,...U]),R(y,{isGenerating:!0,errorMsg:void 0});const we=50;let Q=null;for(let U=0;U0&&await new Promise(le=>setTimeout(le,U*we));let te=(j[U].prompt||"").trim();const ge=[],ne=te.match(/@(\d+)/g);ne&&N.length>0?(ne.forEach(le=>{const fe=parseInt(le.slice(1),10);fe>=1&&fe<=N.length&&ge.push(N[fe-1])}),te=te.replace(/@\d+/g,"").replace(/\s+/g," ").trim()||"自然风格图像"):N.length>0&&ge.push(...N.slice(0,14));try{const le=await v1({node:M,currentModel:v,config:H,baseUrl:Z,prompt:te,ratio:m==="Auto"?"1:1":m,resolution:z||"2K",refImages:ge,hasReferenceImage:ge.length>0,isVideoGeneration:!1,isMidjourney:!1,isJimeng:se,isNanoBanana2:ie,taskId:oe[U],apiKey:J,getConnectedImageForInput:()=>null,setHistory:o,updateNode:R,nodes:I,connections:E});if(!le){o(xe=>xe.map(Ne=>Ne.id===oe[U]?{...Ne,status:"failed",progress:0}:Ne)),Q=new Error(`宫格 ${U+1} 构建请求失败`);continue}const{endpoint:fe,payload:be,useMultipart:de}=le,$e="Bearer",ze=de?{Authorization:`${$e} ${J}`}:{"Content-Type":"application/json",Authorization:`${$e} ${J}`},_e=await Pl(fe,{method:"POST",headers:ze,body:de?be:JSON.stringify(be)});if(!_e.ok){const xe=await _e.text();o(Ne=>Ne.map(ve=>ve.id===oe[U]?{...ve,status:"failed",progress:0,errorMsg:xe}:ve)),Q=new Error(`宫格 ${U+1} 请求失败: ${_e.status}`);continue}const Ee=await _e.text();let Ce;try{Ce=JSON.parse(Ee)}catch{o(xe=>xe.map(Ne=>Ne.id===oe[U]?{...Ne,status:"failed",progress:0}:Ne)),Q=new Error(`宫格 ${U+1} 响应非 JSON`);continue}await jg({result:Ce,taskId:oe[U],node:M,baseUrl:Z,apiKey:J,currentModel:v,isMidjourney:!1,isVideoGeneration:!1,connections:E,nodes:I,nodesRef:d,updateNode:R,setHistory:o,connectedPreviewId:W,batchAccumulator:re,batchIndex:U})}catch(le){const fe=le instanceof Error?le.message:String(le);o(be=>be.map(de=>de.id===oe[U]?{...de,status:"failed",progress:0,errorMsg:fe}:de)),Q=le instanceof Error?le:new Error(fe)}}await(async()=>{const te=Date.now()+3e5;for(;Date.now(){o(fe=>(le(fe),fe))});if(oe.every(le=>{const fe=ge.find(be=>be.id===le);return fe&&(fe.status==="completed"||fe.status==="failed")}))return;await new Promise(le=>setTimeout(le,1e3))}})();const ue=re.filter(U=>!!U&&U.length>0);if(R(y,{isGenerating:!1,errorMsg:void 0}),ue.length>0&&W){const U=(M==null?void 0:M.nodeName)||"分镜图表";let G=ue;if(q&&q.length>0){const te=I.find(le=>le.id===W),ne=((te==null?void 0:te.previewMjImages)||[]).slice();q.forEach((le,fe)=>{const be=ue[fe];be&&(ne.length<=le&&(ne.length=le+1),ne[le]=be)}),G=ne}await pO(W,G[0],"image",R,{previewMjImages:G,selectedPreviewImage:G[0],sourceNodeName:U,previewSourceModel:v,previewSourceNodeId:y,previewSourceNodeType:"storyboard-chart-node",...L!=null&&X!=null?{previewGridRows:L,previewGridCols:X}:{}},I)}if(Q&&ue.length===0)throw Q},[e,t,o]);return{generate:p,generateMusic:h,runExpandImage:f,generateChartBatch:b}};async function v1(e){var J,Z,B,V,N,j,k,W,M,Y,se,ie,oe,re,ee,pe,we,Q,me,ue,U,G,te,ge,ne,le,fe,be,de,$e,ze,_e,Ee,Ce,xe,Ne,ve,ke,Ie,Pe,Te,Be,He,Je,Me,Re,Ve,Ze,je,Le,Xe,qe,tt,Ye,ct,pt,ht,wt,$t,jt,Nt,Yt,un,Tn,Ht,fn,Dn,it,Lt,gt;const{node:t,currentModel:n,config:r,baseUrl:i,prompt:a,ratio:o,resolution:l,refImages:c,hasReferenceImage:u,isVideoGeneration:d,isMidjourney:h,isJimeng:p,isNanoBanana2:f,taskId:b,apiKey:g,getConnectedImageForInput:y,setHistory:w,updateNode:v,angleMetadata:m,storyboardJsonData:z,nodes:C,connections:E,markerMasks:I,expandMode:R}=e,A=async Jt=>{var Bt,zt;if(!C||!E)return await As(Jt);if(Jt.startsWith("canvas-node:")){const Gt=Jt.replace("canvas-node:",""),qt=C.find(De=>De.id===Gt&&De.type==="canvas-node");if((Bt=qt==null?void 0:qt.settings)!=null&&Bt.canvasData)try{const{drawCanvasToImage:De,getBlobFromDataURL:st}=await mn(async()=>{const{drawCanvasToImage:_t,getBlobFromDataURL:xt}=await Promise.resolve().then(()=>ME);return{drawCanvasToImage:_t,getBlobFromDataURL:xt}},void 0,import.meta.url),Ae=qt.settings.canvasData,nt=await De(Ae,qt.width,qt.height);return await st(nt)}catch(De){throw console.error("[Generation] 导出画板失败:",De),De}}const Wt=C.find(Gt=>Gt.content===Jt&&Gt.type==="input-image");if(!Wt)return await As(Jt);const Pt=E.find(Gt=>Gt.from===Wt.id&&C.find(qt=>qt.id===Gt.to&&qt.type==="canvas-node"));if(Pt){const Gt=C.find(qt=>qt.id===Pt.to);if((zt=Gt==null?void 0:Gt.settings)!=null&&zt.canvasData)try{const{drawCanvasToImage:qt,getBlobFromDataURL:De}=await mn(async()=>{const{drawCanvasToImage:nt,getBlobFromDataURL:_t}=await Promise.resolve().then(()=>ME);return{drawCanvasToImage:nt,getBlobFromDataURL:_t}},void 0,import.meta.url),st=Gt.settings.canvasData,Ae=await qt(st,Gt.width,Gt.height);return await De(Ae)}catch(qt){return console.error("[Generation] 导出画板失败,使用原始图片:",qt),await As(Jt)}}return await As(Jt)},O=async Jt=>{if(Jt.startsWith("data:")||Jt.startsWith("http://")||Jt.startsWith("https://"))return Jt;const Wt=await A(Jt);return await Ls(Wt)},F=Jt=>{const Wt=Jt.trim();if(Wt.includes(",")){const Pt=Wt.split(",")[1];return Pt?Pt.trim():Wt}return Wt},L=async Jt=>{const Wt=await O(Jt);return fu(n)||zc(n)||Wo(n)?await rO(Wt):Wt},X=async Jt=>{const Wt=await O(Jt);return await sO(Wt)};let T="",q={},H=!1;if(d){const Jt=((J=t.settings)==null?void 0:J.duration)||jv(n),Wt=parseInt(Jt.replace("s",""),10)||8;if(t.type==="motion-control"&&(zc(n)||Wo(n))){T=`${i}/kling/v1/videos/motion-control`;const Bt=(a||"").trim(),zt=c&&c.length>0?c[0]:void 0,Gt=(V=(B=(Z=t.settings)==null?void 0:Z.klingImages)==null?void 0:B[0])==null?void 0:V.url,qt=Zt=>{if(!Zt)return!1;const Sn=Zt.toLowerCase();return Sn.startsWith("data:video")||/\\.(mp4|webm|mov|m4v|ogg)(\\?|$)/i.test(Sn)||Sn.includes("force_video_display=true")?!0:Sn.includes("video")&&!Sn.includes("preview")},De=Zt=>{if(!Zt)return!1;const Sn=Zt.toLowerCase();return Sn.startsWith("data:image")||/\\.(png|jpe?g|webp|gif|bmp)(\\?|$)/i.test(Sn),!0},Ae=Gt||zt||(()=>{if(!C||!E)return;const Zt=E.filter(Sn=>Sn.to===t.id);for(const Sn of Zt){const jn=C.find(Kn=>Kn.id===Sn.from),_n=jn==null?void 0:jn.content;if(!(typeof _n!="string"||!((jn==null?void 0:jn.type)==="input-image"||(jn==null?void 0:jn.type)==="preview"&&(jn==null?void 0:jn.previewType)==="image"))&&!qt(_n)&&De(_n))return _n}})(),nt=()=>{if(!C||!E)return;const Zt=E.filter(Sn=>Sn.to===t.id);for(const Sn of Zt){const jn=C.find(Cn=>Cn.id===Sn.from),_n=jn==null?void 0:jn.content;if(typeof _n=="string"&&_n&&((jn==null?void 0:jn.type)==="video-input"||(jn==null?void 0:jn.type)==="preview"&&jn.previewType==="video"||qt(_n)))return _n}},_t=((N=t.settings)==null?void 0:N.klingVideoUrl)||nt(),xt=(()=>{try{return new URL(i).origin}catch{return i}})(),Tt=async(Zt,Sn)=>{var Tr,kr,Rr;const jn=new FormData;jn.append("file",Zt);const _n=await fetch(`${i}/v1/files`,{method:"POST",headers:{Authorization:`Bearer ${g}`},body:jn});if(!_n.ok)throw new Error(`[MotionControl] 上传 ${Sn} 到 files 失败: ${_n.status} ${_n.statusText}`);const Cn=await _n.json();console.log("[MotionControl] /v1/files upload response:",{fileKind:Sn,hasId:!!(Cn!=null&&Cn.id),keys:Cn?Object.keys(Cn):[],urlHead:Cn!=null&&Cn.url?String(Cn.url).slice(0,80):void 0,idHead:Cn!=null&&Cn.id?String(Cn.id).slice(0,30):void 0});let Kn=(Cn==null?void 0:Cn.url)||(Cn==null?void 0:Cn.file_url)||(Cn==null?void 0:Cn.download_url)||((Tr=Cn==null?void 0:Cn.data)==null?void 0:Tr.url)||((kr=Cn==null?void 0:Cn.data)==null?void 0:kr.file_url)||((Rr=Cn==null?void 0:Cn.data)==null?void 0:Rr.download_url);if((!Kn||!(sr=>{const mt=sr.split("?")[0].toLowerCase(),It=mt.endsWith("/")?mt.slice(0,-1):mt;return/\.(mp4|webm|mov|m4v|ogg)$/.test(It)})(Kn))&&Cn!=null&&Cn.id&&(Kn=`${i}/v1/files/${Cn.id}/content`),!Kn)return"";const $r=String(Kn).trim();return $r.startsWith("/")?`${i}${$r}`:$r},St=async(Zt,Sn)=>{var cn,zn,Rn;const jn=Zt.trim();if(!jn)return"";if(jn.startsWith("http://")||jn.startsWith("https://"))try{if(new URL(jn).origin===xt)return jn}catch{}const _n=await As(jn),Cn=_n.type||"video/mp4",Kn=20*1024*1024;if(_n.size>Kn)throw new Error(`[MotionControl] ${Sn} 文件过大(>${Math.round(Kn/1024/1024)}MB),请先用节点上传面板或裁剪/压缩后再生成`);const Xn=(()=>{const bt=Cn.toLowerCase();return bt.includes("mp4")?".mp4":bt.includes("webm")?".webm":bt.includes("mov")?".mov":bt.includes("ogg")?".ogg":bt.includes("jpeg")||bt.includes("jpg")?".jpg":bt.includes("png")?".png":bt.includes("webp")?".webp":".mp4"})(),$r=`${Sn}-motion-control${Xn}`,Tr=new File([_n],$r,{type:Cn}),kr=new FormData;kr.append("file",Tr);const Rr=await fetch(`${i}/v1/files`,{method:"POST",headers:{Authorization:`Bearer ${g}`},body:kr});if(!Rr.ok)throw new Error(`[MotionControl] 上传 ${Sn} 到 files 失败: ${Rr.status} ${Rr.statusText}`);const sr=await Rr.json();console.log("[MotionControl] /v1/files upload response (by url):",{fileKind:Sn,hasId:!!(sr!=null&&sr.id),keys:sr?Object.keys(sr):[],urlHead:sr!=null&&sr.url?String(sr.url).slice(0,80):void 0,idHead:sr!=null&&sr.id?String(sr.id).slice(0,30):void 0});let mt=(sr==null?void 0:sr.url)||(sr==null?void 0:sr.file_url)||(sr==null?void 0:sr.download_url)||((cn=sr==null?void 0:sr.data)==null?void 0:cn.url)||((zn=sr==null?void 0:sr.data)==null?void 0:zn.file_url)||((Rn=sr==null?void 0:sr.data)==null?void 0:Rn.download_url);if((!mt||!(bt=>{const bn=bt.split("?")[0].toLowerCase(),An=bn.endsWith("/")?bn.slice(0,-1):bn;return/\.(mp4|webm|mov|m4v|ogg)$/.test(An)})(mt))&&sr!=null&&sr.id&&(mt=`${i}/v1/files/${sr.id}/content`),!mt)return"";const tn=String(mt).trim();return tn.startsWith("/")?`${i}${tn}`:tn},Qe=(W=(k=(j=t.settings)==null?void 0:j.klingImages)==null?void 0:k[0])==null?void 0:W.file,Ue=(M=t.settings)==null?void 0:M.klingVideoFile,rt=Qe?await(async Zt=>{const Sn=await Ls(Zt);return F(Sn)})(Qe):Ae?await(async Zt=>{const Sn=Zt.trim();if(!Sn)return"";if(Sn.startsWith("data:image"))return F(Sn);const jn=await As(Sn),_n=await Ls(jn);return F(_n)})(Ae):"",lt=Ue?await Tt(Ue,"video"):_t?await St(_t,"video"):"",ot=Zt=>!Zt||Zt.length<50?!1:/^[A-Za-z0-9+/]+={0,2}$/.test(Zt);if(console.log("[MotionControl] normalized payload (debug):",{image_base64_head:rt?rt.slice(0,60):"",image_base64_len:rt?rt.length:0,video_url_head:lt?lt.slice(0,60):""}),!Bt)return alert("请输入动作迁移提示词(prompt)"),v(t.id,{isGenerating:!1,errorMsg:"缺少提示词"}),null;if(!ot(rt))return alert("请上传参考图(动作迁移需要 Kelin 纯 base64;建议从上传面板选图以避免跨域问题)"),v(t.id,{isGenerating:!1,errorMsg:"缺少参考图"}),null;if(!lt||!(lt.startsWith("http://")||lt.startsWith("https://")))return alert("请上传参考视频(动作迁移需要 video_url)"),v(t.id,{isGenerating:!1,errorMsg:"缺少参考视频"}),null;const At=((Y=t.settings)==null?void 0:Y.klingMotionControlMode)||"std",kt=((se=t.settings)==null?void 0:se.klingMotionControlCharacterOrientation)||"image",Ot=((ie=t.settings)==null?void 0:ie.klingVideoKeepSound)||"yes",dn=((oe=t.settings)==null?void 0:oe.klingMotionControlWatermarkEnabled)??!0,Vt={model_name:(r==null?void 0:r.modelName)||n,prompt:Bt,image_url:rt,video_url:lt,character_orientation:kt,mode:At,keep_original_sound:Ot};return dn&&(Vt.watermark_info={enabled:!0}),q=Vt,H=!1,{endpoint:T,payload:q,useMultipart:H}}if(hl(n)){T=`${i}/v2/videos/generations`;const Bt=parseInt(String(Wt),10),zt=o&&o!=="Auto"?o:"3:2",qt={model:(r==null?void 0:r.modelName)||"grok-video-3",prompt:a,ratio:zt,resolution:"1080P"};Number.isFinite(Bt)&&Bt>0&&(qt.duration=Bt);const De=Math.min(c.length,7);if(De>0)try{const st=await Promise.all(c.slice(0,7).map(async nt=>O(nt)));qt.images=st,(a||"").trim()?qt.prompt=a:(qt.prompt=Array.from({length:De},(nt,_t)=>`@img${_t+1}`).join(" ")+" ",console.log("[Grok] 多图引用,默认提示词:",qt.prompt)),console.log("[Grok] 图生视频,已添加",st.length,"张参考图")}catch(st){return console.error("Grok Image Conversion Failed:",st),alert("图片处理失败,请检查图片链接或跨域设置"),v(t.id,{isGenerating:!1}),null}else qt.prompt=a;q=qt}else if(Tp(n)){T=`${i}/v1/videos/generations`;const Bt=(re=t.settings)==null?void 0:re.seedanceMaterials;if(E0(n)&&Bt&&Bt.length>0){H=!0;const zt=new FormData;zt.append("model",(r==null?void 0:r.modelName)||n),zt.append("prompt",a.trim()),zt.append("duration",String(Wt)),o&&o!=="Auto"&&zt.append("ratio",o),l&&l!=="Auto"&&zt.append("resolution",l.toLowerCase());for(const Gt of Bt){const qt=Gt.url.startsWith("data:")?await(await fetch(Gt.url)).blob():await As(Gt.url),De=BX(qt.type,Gt.type,Gt.name),st=Gt.name.includes(".")?Gt.name:`${Gt.name}${De}`;zt.append("files",qt,st)}q=zt,console.log("[Jimeng Seedance] 多素材 FormData, 素材数:",Bt.length)}else{const zt=u&&c.length>0,Gt=!!((ee=t.settings)!=null&&ee.veoFramesMode),qt=Gt?y(t.id,"veo_start"):null,De=Gt?y(t.id,"veo_end"):null,st=!!(qt||De),Ae={model:(r==null?void 0:r.modelName)||n,prompt:a.trim(),duration:Wt};l&&l!=="Auto"&&(Ae.resolution=l.toLowerCase()),o&&o!=="Auto"&&(Ae.ratio=o);const nt=[];if(st){if(qt)try{if(qt.startsWith("http://")||qt.startsWith("https://"))nt.push(qt);else{const _t=qt.startsWith("data:")?qt:await Ls(await As(qt));nt.push(_t)}}catch(_t){return console.error("[Jimeng Video] 首帧处理失败:",_t),alert("首帧图片处理失败,请检查图片链接"),v(t.id,{isGenerating:!1}),null}if(De)try{if(De.startsWith("http://")||De.startsWith("https://"))nt.push(De);else{const _t=De.startsWith("data:")?De:await Ls(await As(De));nt.push(_t)}}catch(_t){return console.error("[Jimeng Video] 尾帧处理失败:",_t),alert("尾帧图片处理失败,请检查图片链接"),v(t.id,{isGenerating:!1}),null}}else if(zt)try{for(const _t of c)if(_t.startsWith("http://")||_t.startsWith("https://"))nt.push(_t);else{const xt=_t.startsWith("data:")?_t:await Ls(await As(_t));nt.push(xt)}}catch(_t){return console.error("[Jimeng Video] 参考图片处理失败:",_t),alert("参考图片处理失败,请检查图片链接"),v(t.id,{isGenerating:!1}),null}nt.length>0&&(Ae.file_paths=nt),q=Ae}}else if(pl(n)&&!Tp(n)){const Bt=parseInt(String(Wt),10),zt=o&&o!=="Auto"?o:"adaptive",Gt=((pe=t.settings)==null?void 0:pe.resolution)||"720P",De={"480P":"480p","720P":"720p","1080P":"1080p","480p":"480p","720p":"720p","1080p":"1080p"}[Gt]||"720p",st=n.replace(/-api$/,""),Ae=st==="seedance-2.0"||(r==null?void 0:r.modelName)==="doubao-seedance-2.0",nt=st==="seedance-1-0-lite-t2v",_t=aP(n),xt=!!((we=t.settings)!=null&&we.veoFramesMode),Tt=y(t.id,"veo_start"),St=y(t.id,"veo_end");T=`${i}${$x(n)}`;const Qe=(Q=t.settings)==null?void 0:Q.seedanceMaterials;Ae&&(Qe!=null&&Qe.length)&&console.log("[Seedance 2.0] materials before build:",Qe.map(kt=>({id:kt.id,type:kt.type,hasAssetUrl:!!kt.assetUrl,urlHead:(kt.url||"").slice(0,48),assetHead:(kt.assetUrl||"").slice(0,32)})));const Ue=async kt=>{var $r,Tr,kr,Rr;const Ot=()=>{try{const sr=localStorage.getItem("qiaodoumayi_api_configs"),mt=sr?JSON.parse(sr):[],It=Array.isArray(mt)?mt.find(Rn=>(Rn==null?void 0:Rn.id)==="kling-o1"||String((Rn==null?void 0:Rn.modelName)||"").includes("kling-video-o1")):null,tn=String((It==null?void 0:It.url)||"").trim().replace(/\/+$/,""),cn=String((It==null?void 0:It.key)||"").trim(),zn=String(localStorage.getItem("qiaodoumayi_global_key")||"").trim();return{base:tn||i,key:cn||zn||g}}catch{return{base:i,key:g}}},dn=kt.startsWith("data:video/")?await(await fetch(kt)).blob():await As(kt),Vt=dn.type||"video/mp4",Zt=Vt.includes("mov")?"mov":Vt.includes("webm")?"webm":"mp4",Sn=new File([dn],`seedance-ref-video.${Zt}`,{type:Vt}),jn=new FormData;jn.append("file",Sn);const{base:_n,key:Cn}=Ot(),Kn=[`${_n}/v1/files`,`${i}/zhonglian/api/v1/proxy/ark/files`,`${i}/v1/files`,`${i}/api/v3/files`];let Xn="";for(const sr of Kn)try{const mt=await Pl(sr,{method:"POST",headers:{Authorization:`Bearer ${Cn}`},body:jn}),It=await mt.text();if(!mt.ok){Xn=`${sr} -> HTTP ${mt.status}: ${It.slice(0,200)}`;continue}let tn={};try{tn=It?JSON.parse(It):{}}catch{}const cn=(tn==null?void 0:tn.url)||(tn==null?void 0:tn.file_url)||(tn==null?void 0:tn.download_url)||(($r=tn==null?void 0:tn.data)==null?void 0:$r.url)||((Tr=tn==null?void 0:tn.data)==null?void 0:Tr.file_url)||((kr=tn==null?void 0:tn.data)==null?void 0:kr.download_url);if(typeof cn=="string"&&/^https?:\/\//i.test(cn))return console.log("[Seedance 2.0] uploaded reference video url:",String(cn).slice(0,120)),cn;const zn=(tn==null?void 0:tn.id)||((Rr=tn==null?void 0:tn.data)==null?void 0:Rr.id);if(zn){const bt=`${sr.includes("/v1/files")?sr.replace(/\/v1\/files$/,""):i}/v1/files/${zn}/content`;return console.log("[Seedance 2.0] fallback file content url:",bt),bt}Xn=`${sr} -> 响应缺少可用 URL`}catch(mt){Xn=`${sr} -> ${(mt==null?void 0:mt.message)||"upload failed"}`}throw new Error(`参考视频自动上传失败:${Xn||"no upload endpoint available"}`)},Ge=async(kt,Ot)=>{if(!kt)return kt;if(kt.startsWith("Asset://")||kt.startsWith("asset://"))return kt.replace(/^Asset:\/\//,"asset://");if(Ot==="video"){if(kt.startsWith("http://")||kt.startsWith("https://"))return kt;if(kt.startsWith("data:video/")||kt.startsWith("blob:")||kt.startsWith("content_ref:"))return await Ue(kt)}if(kt.startsWith("data:")||kt.startsWith("http://")||kt.startsWith("https://"))return kt;try{const dn=await As(kt);return await Ls(dn)}catch(dn){return console.warn("[Seedance 2.0] material url resolve failed, fallback to original url:",kt,dn),kt}};let at=[{type:"text",text:a}];if(Ae&&Qe&&Qe.length>0){at=[{type:"text",text:(a||"").replace(/@(\d+)/g,"").replace(/\s+/g," ").trim()||a}];const Ot=(()=>{try{const Vt=(localStorage.getItem("qiaodoumayi_seedance_moderation_url")||"").trim(),Zt=(localStorage.getItem("qiaodoumayi_seedance_moderation_user_id")||"").trim(),Sn=(localStorage.getItem("qiaodoumayi_seedance_moderation_key_hex")||"").trim();return!Vt||!Zt||!Sn?null:{apiUrl:Vt,userId:Zt,keyHex:Sn}}catch{return null}})(),dn={};if(Ot)try{const Vt=Qe.map((Zt,Sn)=>({m:Zt,idx:Sn})).filter(Zt=>Zt.m.type==="image"&&!Zt.m.assetUrl);if(Vt.length>0){const Zt=await Promise.all(Vt.map(async({m:_n})=>Ge(_n.url,"image"))),Sn=await V5(Ot,Zt),jn=(Sn==null?void 0:Sn.items)||[];Vt.forEach((_n,Cn)=>{var Xn;const Kn=(Xn=jn==null?void 0:jn[Cn])==null?void 0:Xn.asset_url;typeof Kn=="string"&&Kn.trim()&&(dn[_n.idx]=Kn.trim().replace(/^Asset:\/\//,"asset://"))})}}catch(Vt){console.warn("[Seedance 2.0] moderation failed, fallback to original image urls:",Vt)}for(let Vt=0;Vt{var Zt,Sn,jn,_n,Cn,Kn,Xn,$r,Tr,kr,Rr,sr,mt,It,tn,cn,zn,Rn;return{type:Vt==null?void 0:Vt.type,role:Vt==null?void 0:Vt.role,urlPrefix:(jn=(Sn=(Zt=Vt==null?void 0:Vt.image_url)==null?void 0:Zt.url)==null?void 0:Sn.startsWith)!=null&&jn.call(Sn,"Asset://")?"Asset://":(Kn=(Cn=(_n=Vt==null?void 0:Vt.image_url)==null?void 0:_n.url)==null?void 0:Cn.startsWith)!=null&&Kn.call(Cn,"asset://")?"asset://":(Tr=($r=(Xn=Vt==null?void 0:Vt.image_url)==null?void 0:Xn.url)==null?void 0:$r.startsWith)!=null&&Tr.call($r,"http")||(sr=(Rr=(kr=Vt==null?void 0:Vt.video_url)==null?void 0:kr.url)==null?void 0:Rr.startsWith)!=null&&sr.call(Rr,"http")||(tn=(It=(mt=Vt==null?void 0:Vt.audio_url)==null?void 0:mt.url)==null?void 0:It.startsWith)!=null&&tn.call(It,"http")?"http":Vt!=null&&Vt.text?"text":"other",sample:(cn=Vt==null?void 0:Vt.image_url)!=null&&cn.url?String(Vt.image_url.url).slice(0,32):(zn=Vt==null?void 0:Vt.video_url)!=null&&zn.url?String(Vt.video_url.url).slice(0,32):(Rn=Vt==null?void 0:Vt.audio_url)!=null&&Rn.url?String(Vt.audio_url.url).slice(0,32):void 0}}))}else if(!nt){if(_t&&xt&&Tt&&St)try{const kt=await O(Tt),Ot=await O(St);at.push({type:"image_url",image_url:{url:kt},role:"first_frame"}),at.push({type:"image_url",image_url:{url:Ot},role:"last_frame"})}catch(kt){return console.error("Seedance 首尾帧图片处理失败:",kt),alert("首尾帧图片处理失败,请检查图片链接或跨域设置"),v(t.id,{isGenerating:!1}),null}else if(xt&&Tt||u){const kt=xt&&Tt?Tt:c[0];try{const Ot=await O(kt);at.push({type:"image_url",image_url:{url:Ot}})}catch(Ot){return console.error("Seedance 图片处理失败:",Ot),alert("图片处理失败,请检查图片链接或跨域设置"),v(t.id,{isGenerating:!1}),null}}}const rt=Ae||st==="seedance-1.5-pro"?4:2,lt=Ae?15:12,ot=Ae?String(De).replace(/P$/,"p"):De,At={model:(r==null?void 0:r.modelName)||"doubao-seedance-1-5-pro-251215",content:at,ratio:zt,duration:Math.min(lt,Math.max(rt,Bt)),resolution:ot,watermark:!1};(oP(n)||Ae)&&(At.generate_audio=((me=t.settings)==null?void 0:me.seedanceGenerateAudio)!==!1),q=At}else if(No(n)){T=`${i}/kling/v1/videos/omni-video`,console.log("[Kling O1] 节点设置:",t.settings);const Bt=(ue=t.settings)==null?void 0:ue.klingVideoUrl,zt=((U=t.settings)==null?void 0:U.klingVideoReferType)||"base",Gt=((G=t.settings)==null?void 0:G.klingVideoKeepSound)||"yes",qt=(te=t.settings)==null?void 0:te.klingVideoSegment;console.log("[Kling O1] 视频URL:",Bt),console.log("[Kling O1] 视频类型:",zt),console.log("[Kling O1] 保留原声:",Gt),console.log("[Kling O1] 视频片段:",qt);let De=Wt;if(Bt&&zt==="base"&&qt){const Tt=qt.endTime-qt.startTime;De=Math.round(Tt),console.log("[Kling O1] 使用视频片段时长:",Tt,"秒,四舍五入为:",De)}const st={model_name:"kling-video-o1",prompt:a},Ae=(ge=t.settings)==null?void 0:ge.klingImages;if(Ae&&Ae.length>0)st.image_list=Ae.map(Tt=>({image_url:Tt.url})),console.log("[Kling O1] 添加上传图片:",Ae.length,"张",st.image_list);else if(u)try{const Tt=await Promise.all(c.map(async St=>({image_url:await O(St)})));st.image_list=Tt,console.log("[Kling O1] 添加连接图片参考:",Tt.length,"张")}catch(Tt){return console.error("[Kling O1] 图片处理失败:",Tt),alert("图片处理失败,请检查图片链接"),v(t.id,{isGenerating:!1}),null}const nt=(ne=t.settings)==null?void 0:ne.klingSubjects;console.log("[Kling O1] 原始 klingSubjects:",nt),console.log("[Kling O1] klingSubjects 类型:",nt==null?void 0:nt.map(Tt=>typeof Tt)),nt&&nt.length>0&&(st.element_list=nt.map(Tt=>{const St=String(Tt);return console.log("[Kling O1] 处理 element_id:",{原始值:Tt,原始类型:typeof Tt,转换后:St,转换后类型:typeof St}),{element_id:St}}),console.log("[Kling O1] 添加主体:",nt.length,"个"),console.log("[Kling O1] element_list:",JSON.stringify(st.element_list,null,2))),Bt?(st.video_list=[{video_url:Bt,refer_type:zt,keep_original_sound:Gt}],console.log("[Kling O1] 添加视频参考:",st.video_list)):console.log("[Kling O1] 没有视频URL,跳过video_list"),st.mode="pro",o&&o!=="Auto"?(st.aspect_ratio=o,console.log("[Kling O1] 添加比例:",o)):(st.aspect_ratio="16:9",console.log("[Kling O1] 使用默认比例: 16:9")),st.duration=String(De);const xt=`${typeof window<"u"&&window.__KLING_CALLBACK_URL__||`${window.location.origin}/api/kling-callback`}/api/kling-callback`;st.callback_url=xt,console.log("[Kling O1] 添加 callback_url:",xt),q=st,console.log("[Kling O1] 请求参数:",JSON.stringify(st,null,2))}else if(fu(n)){T=`${i}/kling/v1/videos/text2video`;const Bt=!!y(t.id,"veo_start"),zt=!!y(t.id,"veo_end"),Gt=c&&c.length>0,qt=Bt||zt;(qt||Gt)&&(T=`${i}/kling/v1/videos/image2video`);const De={model_name:"kling-v2-5-turbo",prompt:a},st=parseInt(Jt.replace("s",""));De.duration=st,console.log("[Kling v2.5 Turbo] 时长:",st);const Ae=((le=t.settings)==null?void 0:le.klingV25Resolution)||"std";if(qt||Gt){De.mode=Ae,console.log(`[Kling v2.5 Turbo] 检测到${qt?"首尾帧":"参考图片"},使用用户选择的模式: ${Ae}`);try{if(qt){const nt=y(t.id,"veo_start"),_t=y(t.id,"veo_end");if(nt){let xt=await L(nt);if(xt.startsWith("http://")||xt.startsWith("https://")){console.log("[Kling v2.5 Turbo] 首帧图片是 HTTP URL,转换为 base64");const Qe=await(await fetch(xt)).blob();xt=await Ls(Qe)}if(!xt.startsWith("data:")&&!/^[A-Za-z0-9+/=]+$/.test(xt.trim()))throw console.error("[Kling v2.5 Turbo] 首帧图片格式错误"),new Error("首帧图片格式错误");const Tt=F(xt);if(!Tt)throw console.error("[Kling v2.5 Turbo] 无法提取首帧 base64 数据"),new Error("首帧 base64 格式错误");De.image=Tt,console.log("[Kling v2.5 Turbo] 添加首帧 (image)"),console.log("[Kling v2.5 Turbo] - base64 前30字符:",Tt.substring(0,30)),console.log("[Kling v2.5 Turbo] - base64 长度:",Tt.length)}else if(_t){console.warn("[Kling v2.5 Turbo] 未检测到首帧,使用尾帧作为首帧");let xt=await L(_t);if(xt.startsWith("http://")||xt.startsWith("https://")){console.log("[Kling v2.5 Turbo] 尾帧图片是 HTTP URL,转换为 base64");const Qe=await(await fetch(xt)).blob();xt=await Ls(Qe)}const Tt=F(xt);Tt&&(De.image=Tt,console.log("[Kling v2.5 Turbo] 使用尾帧作为首帧 (image)"))}if(_t){let xt=await L(_t);if(xt.startsWith("http://")||xt.startsWith("https://")){console.log("[Kling v2.5 Turbo] 尾帧图片是 HTTP URL,转换为 base64");const Qe=await(await fetch(xt)).blob();xt=await Ls(Qe)}if(!xt.startsWith("data:")&&!/^[A-Za-z0-9+/=]+$/.test(xt.trim()))throw console.error("[Kling v2.5 Turbo] 尾帧图片格式错误"),new Error("尾帧图片格式错误");const Tt=F(xt);if(!Tt)throw console.error("[Kling v2.5 Turbo] 无法提取尾帧 base64 数据"),new Error("尾帧 base64 格式错误");De.image_tail=Tt,console.log("[Kling v2.5 Turbo] 添加尾帧 (image_tail)"),console.log("[Kling v2.5 Turbo] - 尾帧 base64 前30字符:",Tt.substring(0,30)),console.log("[Kling v2.5 Turbo] - 尾帧 base64 长度:",Tt.length)}}else if(Gt&&c[0]){let nt=await L(c[0]);if(nt.startsWith("http://")||nt.startsWith("https://")){console.log("[Kling v2.5 Turbo] 参考图片是 HTTP URL,转换为 base64");const Tt=await(await fetch(nt)).blob();nt=await Ls(Tt)}if(!nt.startsWith("data:")&&!/^[A-Za-z0-9+/=]+$/.test(nt.trim()))throw console.error("[Kling v2.5 Turbo] 图片格式错误"),new Error("图片格式错误");const _t=F(nt);if(!_t)throw console.error("[Kling v2.5 Turbo] 无法提取 base64 数据"),new Error("base64 格式错误");De.image=_t,console.log("[Kling v2.5 Turbo] 添加参考图片 (image)"),console.log("[Kling v2.5 Turbo] - base64 前30字符:",_t.substring(0,30)),console.log("[Kling v2.5 Turbo] - base64 长度:",_t.length)}}catch(nt){return console.error("[Kling v2.5 Turbo] 图片处理失败:",nt),alert("图片处理失败,请检查图片链接"),v(t.id,{isGenerating:!1}),null}}else Ae==="std"||Ae==="pro"?(De.mode=Ae,console.log("[Kling v2.5 Turbo] 文生视频模式:",Ae)):De.mode="std";o&&o!=="Auto"?(De.aspect_ratio=o,console.log("[Kling v2.5 Turbo] 比例:",o)):De.aspect_ratio="16:9",q=De,console.log("[Kling v2.5 Turbo] 请求参数:",JSON.stringify(De,null,2))}else if(zc(n)){T=`${i}/kling/v1/videos/text2video`;const Bt=!!y(t.id,"veo_start"),zt=!!y(t.id,"veo_end"),Gt=Bt||zt,qt=c&&c.length>0;console.log("[Kling v2.6] 输入检测:",{hasStartFrame:Bt,hasEndFrame:zt,hasReferenceImage:qt,refImagesCount:(c==null?void 0:c.length)||0,refImagesPreview:c==null?void 0:c.map(_t=>`"${_t==null?void 0:_t.substring(0,50)}"`)}),(Gt||qt)&&(T=`${i}/kling/v1/videos/image2video`);const De={model_name:"kling-v2-6",prompt:a},st=Jt.replace("s","");De.duration=st,console.log("[Kling v2.6] 时长:",st);const Ae=((fe=t.settings)==null?void 0:fe.klingV26Resolution)||"std",nt=((be=t.settings)==null?void 0:be.klingV26Sound)||"off";if(console.log("[Kling v2.6] 用户选择的模式:",Ae,"声音:",nt),Gt||qt){const _t=Gt?"pro":Ae;De.mode=_t,console.log(`[Kling v2.6] 检测到${Gt?"首尾帧":"参考图片"},${Gt?"强制 pro 模式(API 要求)":"使用用户选择的模式"}: ${_t}`);try{if(Gt){const xt=y(t.id,"veo_start"),Tt=y(t.id,"veo_end");if(xt){let St=await L(xt);if(St.startsWith("http://")||St.startsWith("https://")){const Ge=await(await fetch(St)).blob();St=await Ls(Ge)}if(!St.startsWith("data:")&&!/^[A-Za-z0-9+/=]+$/.test(St.trim()))throw new Error("首帧图片格式错误");const Qe=F(St);if(!Qe)throw new Error("首帧 base64 格式错误");De.image=Qe}else if(Tt){let St=await L(Tt);if(St.startsWith("http://")||St.startsWith("https://")){const Ge=await(await fetch(St)).blob();St=await Ls(Ge)}const Qe=F(St);Qe&&(De.image=Qe)}if(Tt){let St=await L(Tt);if(St.startsWith("http://")||St.startsWith("https://")){const Ge=await(await fetch(St)).blob();St=await Ls(Ge)}if(!St.startsWith("data:")&&!/^[A-Za-z0-9+/=]+$/.test(St.trim()))throw new Error("尾帧图片格式错误");const Qe=F(St);if(!Qe)throw new Error("尾帧 base64 格式错误");De.image_tail=Qe}}else if(qt&&c[0]){let xt=await L(c[0]);if(xt.startsWith("http://")||xt.startsWith("https://")){const Qe=await(await fetch(xt)).blob();xt=await Ls(Qe)}if(!xt.startsWith("data:")&&!/^[A-Za-z0-9+/=]+$/.test(xt.trim()))throw new Error("图片格式错误");const Tt=F(xt);if(!Tt)throw new Error("base64 格式错误");De.image=Tt}}catch(xt){return console.error("[Kling v2.6] 图片处理失败:",xt),alert("图片处理失败,请检查图片链接"),v(t.id,{isGenerating:!1}),null}_t==="pro"?(De.sound=nt==="on"?"on":"off",console.log("[Kling v2.6] pro 模式,使用用户设置的声音:",De.sound)):(De.sound="off",console.log("[Kling v2.6] std 模式,强制 sound: off(API限制)"))}else De.mode=Ae==="std"||Ae==="pro"?Ae:"std",console.log("[Kling v2.6] 使用用户设置的模式:",De.mode),De.mode==="std"?(De.sound="off",console.log("[Kling v2.6] std 模式不支持声音,已强制 sound: off")):(De.sound=nt==="on"?"on":"off",console.log("[Kling v2.6] pro 模式,使用用户设置的声音:",De.sound));o&&o!=="Auto"?De.aspect_ratio=o:De.aspect_ratio="16:9",q=De,console.log("[Kling v2.6] 请求参数:",JSON.stringify(De,null,2))}else if(Wo(n)){T=`${i}/kling/v1/videos/text2video`;const Bt=!!y(t.id,"veo_start"),zt=!!y(t.id,"veo_end"),Gt=Bt||zt,qt=c&&c.length>0;(Gt||qt)&&(T=`${i}/kling/v1/videos/image2video`);const De=!!((de=t.settings)!=null&&de.klingV3MultiShot),st={model_name:"kling-v3",prompt:De?"":a||""},Ae=Jt.replace("s","");st.duration=Ae;const nt=(($e=t.settings)==null?void 0:$e.klingV3Sound)||"on";st.sound=nt==="on"?"on":"off";const _t=((ze=t.settings)==null?void 0:ze.resolution)||"720P",xt=_t==="1080P"?"1080p":"720p";if(st.resolution=xt,st.mode=_t==="1080P"?"pro":"std",st.multi_shot=De,De){const St=((_e=t.settings)==null?void 0:_e.klingV3ShotType)||"intelligence";st.shot_type=St;const Qe=(Ee=t.settings)==null?void 0:Ee.klingV3MultiPrompt;Qe&&Qe.length>0&&(st.multi_prompt=Qe.map(Ue=>({index:Ue.index,prompt:Ue.prompt,duration:String(Ue.duration||"2")})))}const Tt=(Ce=t.settings)==null?void 0:Ce.klingSubjects;if(Tt&&Tt.length>0&&(st.element_list=Tt.map(St=>({element_id:String(St)}))),o&&o!=="Auto"?st.aspect_ratio=o:st.aspect_ratio="16:9",Gt||qt)try{if(Gt){const St=y(t.id,"veo_start"),Qe=y(t.id,"veo_end");if(St){let Ue=await L(St);if(Ue.startsWith("http://")||Ue.startsWith("https://")){const rt=await(await fetch(Ue)).blob();Ue=await Ls(rt)}const Ge=F(Ue);Ge&&(st.image=Ge)}else if(Qe){let Ue=await L(Qe);if(Ue.startsWith("http://")||Ue.startsWith("https://")){const rt=await(await fetch(Ue)).blob();Ue=await Ls(rt)}const Ge=F(Ue);Ge&&(st.image=Ge)}if(Qe){let Ue=await L(Qe);if(Ue.startsWith("http://")||Ue.startsWith("https://")){const rt=await(await fetch(Ue)).blob();Ue=await Ls(rt)}const Ge=F(Ue);Ge&&(st.image_tail=Ge)}}else if(qt&&c[0]){let St=await L(c[0]);if(St.startsWith("http://")||St.startsWith("https://")){const Ge=await(await fetch(St)).blob();St=await Ls(Ge)}const Qe=F(St);Qe&&(st.image=Qe)}}catch(St){return console.error("[Kling v3] 图片处理失败:",St),alert("图片处理失败,请检查图片链接"),v(t.id,{isGenerating:!1}),null}q=st,console.log("[Kling v3] 请求参数:",JSON.stringify(st,null,2))}else if(wc(n)){const Bt=(r==null?void 0:r.modelName)||"veo-3.1-generate-preview";T=`${i.replace(/\/+$/,"")}/v1beta/models/${Bt}:predictLongRunning`;let zt;if(o&&o!=="Auto")if(o==="16:9"||o==="9:16")zt=o;else{const[St,Qe]=o.split(":").map(Number);Number.isFinite(St)&&Number.isFinite(Qe)&&Qe!==0&&(zt=St/Qe>=1?"16:9":"9:16")}const qt=(St=>{if(!(!St||St==="Auto")){if(St==="720P")return"720p";if(St==="1080P")return"1080p";if(St==="4K")return"4k"}})(l);let De=Number.isFinite(Wt)?Wt:8;(qt==="1080p"||qt==="4k")&&(De=8);const st={prompt:a},Ae=!!((xe=t.settings)!=null&&xe.veoFramesMode),nt=Ae?y(t.id,"veo_start"):null,_t=Ae?y(t.id,"veo_end"):null,xt=async St=>{const Qe=await A(St),Ue=Qe.type||"image/png",Ge=await Ls(Qe),at=F(Ge)||"";if(!at)throw new Error("图片处理失败:无法转换为 base64");return{mimeType:Ue,bytesBase64Encoded:at}};if(nt&&(st.image=await xt(nt),console.log("[Gemini Veo Official] 首尾帧:已添加首帧 image")),_t&&(st.lastFrame=await xt(_t),console.log("[Gemini Veo Official] 首尾帧:已添加尾帧 lastFrame")),!nt&&!_t)if(u&&c.length>0){st.image=await xt(c[0]),console.log("[Gemini Veo Official] image2video:已添加起始帧 image");const St=c.slice(1,4);if(St.length>0){const Qe=await Promise.all(St.map(async Ue=>({image:await xt(Ue),referenceType:"asset"})));st.referenceImages=Qe,console.log("[Gemini Veo Official] referenceImages:已添加",Qe.length,"张")}}else console.log("[Gemini Veo Official] text2video:仅 prompt");const Tt={};zt&&(Tt.aspectRatio=zt),qt&&qt!=="720p"&&(Tt.resolution=qt),De&&(Tt.durationSeconds=De),q={instances:[st],parameters:Object.keys(Tt).length>0?Tt:void 0},H=!1}else if(dl(n)){T=`${i}/v2/videos/generations`;let Bt;if(o&&o!=="Auto")if(o==="16:9"||o==="9:16")Bt=o;else{const[rt,lt]=o.split(":").map(Number);Bt=rt/lt>1?"16:9":"9:16"}const zt=!!((Ne=t.settings)!=null&&Ne.veoFramesMode),Gt=zt?y(t.id,"veo_start"):null,qt=zt?y(t.id,"veo_end"):null,De=[Gt,qt].filter(Boolean),st=async rt=>{if(rt.startsWith("content_ref:"))try{const{contentStore:lt}=await mn(async()=>{const{contentStore:kt}=await Promise.resolve().then(()=>Nh);return{contentStore:kt}},void 0,import.meta.url);await lt.init();const ot=lt.extractId(rt);console.log("[Veo] 解析 content_ref:",ot);const At=await lt.get(ot);if(At)return console.log("[Veo] ✅ content_ref 已解析"),At;throw console.error("[Veo] ❌ content_ref 解析失败,内容不存在:",ot),new Error(`content_ref 不存在: ${ot}`)}catch(lt){throw console.error("[Veo] ❌ content_ref 解析失败:",lt),lt}return rt},Ae=async(rt,lt=5*1024*1024)=>{const ot=rt.length;if(ot<=lt)return console.log("[Veo] 图片大小符合要求:",(ot/1024/1024).toFixed(2),"MB"),rt;console.log("[Veo] 图片过大,开始压缩:",(ot/1024/1024).toFixed(2),"MB → 目标: < 5MB");try{const At=new Image;await new Promise((jn,_n)=>{At.onload=jn,At.onerror=_n,At.src=rt});const kt=document.createElement("canvas"),Ot=kt.getContext("2d");if(!Ot)throw new Error("无法创建 Canvas 上下文");let dn=.9,Vt=rt,Zt=0;const Sn=10;for(;Vt.length>lt&&Ztlt){kt.width=Math.floor(At.width*.8),kt.height=Math.floor(At.height*.8),Ot.clearRect(0,0,kt.width,kt.height),Ot.drawImage(At,0,0,kt.width,kt.height),Vt=kt.toDataURL("image/jpeg",.8),console.log(`[Veo] 缩小尺寸至 ${kt.width}x${kt.height}, 大小: ${(Vt.length/1024/1024).toFixed(2)} MB`);break}if(Vt.length>lt?console.warn("[Veo] ⚠️ 压缩后仍然超过限制,但已尽力压缩"):console.log("[Veo] ✅ 压缩成功:",(Vt.length/1024/1024).toFixed(2),"MB"),!Vt.startsWith("data:image/"))throw console.error("[Veo] ❌ 压缩后的图片格式不正确:",Vt.substring(0,50)),new Error("压缩后的图片格式不正确");return Vt}catch(At){return console.error("[Veo] 压缩失败,使用原图:",At),rt}};let nt=[];const _t=$5(n),xt=async rt=>{var lt;if(!_t)return rt;if((rt.startsWith("http://")||rt.startsWith("https://"))&&(rt.includes(".jpg")||rt.includes(".jpeg")||rt.includes(".png")||rt.includes(".webp")||rt.includes(".gif")))return console.log("[Veo Fast] 使用标准URL:",rt),rt;try{if(C&&E){const ot=E.filter(At=>At.to===t.id);for(const At of ot){const kt=C.find(Ot=>Ot.id===At.from);if(kt&&kt.content===rt){const Ot=(lt=kt.settings)==null?void 0:lt.originalUrl;if(Ot&&typeof Ot=="string"&&(Ot.startsWith("http://")||Ot.startsWith("https://"))&&(Ot.includes(".jpg")||Ot.includes(".jpeg")||Ot.includes(".png")||Ot.includes(".webp")||Ot.includes(".gif")))return console.log("[Veo Fast] 找到原始标准URL:",Ot),Ot}}}}catch(ot){console.warn("[Veo Fast] 获取原始URL失败:",ot)}return console.log("[Veo Fast] 未找到标准URL,转换为base64"),rt};De.length>0?(console.log("[Veo] 处理首尾帧图片,数量:",De.length,_t?"(Fast模式-URL)":"(标准模式-Base64)"),nt=await Promise.all(De.map(async(rt,lt)=>{console.log(`[Veo] 处理图片 ${lt+1}/${De.length}:`,rt.substring(0,100));try{if(rt=await st(rt),_t){const ot=await xt(rt);if((ot.startsWith("http://")||ot.startsWith("https://"))&&(ot.includes(".jpg")||ot.includes(".jpeg")||ot.includes(".png")||ot.includes(".webp")||ot.includes(".gif")))return console.log(`[Veo Fast] 图片 ${lt+1} 使用标准 HTTP URL:`,ot),ot;{console.log(`[Veo Fast] 图片 ${lt+1} 不是标准URL,转换为 base64`);let kt;if(ot.startsWith("data:"))kt=ot;else if(ot.startsWith("http://")||ot.startsWith("https://")||ot.startsWith("blob:")){const Ot=await As(ot);kt=await Ls(Ot)}else throw new Error(`不支持的图片格式: ${ot.substring(0,50)}`);return kt=await Ae(kt),kt}}else{let ot;if(rt.startsWith("data:"))console.log(`[Veo] 图片 ${lt+1} 已是 base64 格式`),ot=rt;else if(rt.startsWith("http://")||rt.startsWith("https://")){console.log(`[Veo] 图片 ${lt+1} 是 HTTP URL,开始下载转换...`);const At=await As(rt);ot=await Ls(At),console.log(`[Veo] 图片 ${lt+1} 转换成功,大小:`,(ot.length/1024/1024).toFixed(2),"MB")}else if(rt.startsWith("blob:")){console.log(`[Veo] 图片 ${lt+1} 是 Blob URL,开始转换...`);const At=await As(rt);ot=await Ls(At),console.log(`[Veo] 图片 ${lt+1} 转换成功,大小:`,(ot.length/1024/1024).toFixed(2),"MB")}else throw console.error(`[Veo] 图片 ${lt+1} 格式不支持:`,rt.substring(0,100)),new Error(`不支持的图片格式: ${rt.substring(0,50)}`);return ot=await Ae(ot),ot}}catch(ot){throw console.error(`[Veo] 图片 ${lt+1} 处理失败:`,ot),ot}})),console.log("[Veo] 所有首尾帧图片处理完成")):u&&(console.log("[Veo] 处理参考图片,数量:",c.length,"(最多使用3张)",_t?"(Fast模式-URL)":"(标准模式-Base64)"),nt=await Promise.all(c.slice(0,3).map(async(rt,lt)=>{console.log(`[Veo] 处理参考图 ${lt+1}/${Math.min(c.length,3)}:`,rt.substring(0,100));try{if(rt=await st(rt),_t){const ot=await xt(rt);if((ot.startsWith("http://")||ot.startsWith("https://"))&&(ot.includes(".jpg")||ot.includes(".jpeg")||ot.includes(".png")||ot.includes(".webp")||ot.includes(".gif")))return console.log(`[Veo Fast] 参考图 ${lt+1} 使用标准 HTTP URL:`,ot),ot;{console.log(`[Veo Fast] 参考图 ${lt+1} 不是标准URL,转换为 base64`);let kt;if(ot.startsWith("data:"))kt=ot;else if(ot.startsWith("http://")||ot.startsWith("https://")||ot.startsWith("blob:")){const Ot=await As(ot);kt=await Ls(Ot)}else throw new Error(`不支持的图片格式: ${ot.substring(0,50)}`);return kt=await Ae(kt),kt}}else{let ot;if(rt.startsWith("data:"))console.log(`[Veo] 参考图 ${lt+1} 已是 base64 格式`),ot=rt;else if(rt.startsWith("http://")||rt.startsWith("https://")){console.log(`[Veo] 参考图 ${lt+1} 是 HTTP URL,开始下载转换...`);const At=await As(rt);ot=await Ls(At),console.log(`[Veo] 参考图 ${lt+1} 转换成功,大小:`,(ot.length/1024/1024).toFixed(2),"MB")}else if(rt.startsWith("blob:")){console.log(`[Veo] 参考图 ${lt+1} 是 Blob URL,开始转换...`);const At=await As(rt);ot=await Ls(At),console.log(`[Veo] 参考图 ${lt+1} 转换成功,大小:`,(ot.length/1024/1024).toFixed(2),"MB")}else throw console.error(`[Veo] 参考图 ${lt+1} 格式不支持:`,rt.substring(0,100)),new Error(`不支持的图片格式: ${rt.substring(0,50)}`);return ot=await Ae(ot),ot}}catch(ot){throw console.error(`[Veo] 参考图 ${lt+1} 处理失败:`,ot),ot}})),console.log("[Veo] 所有参考图片处理完成"));const Tt={model:(r==null?void 0:r.modelName)||"veo3.1-components",prompt:a,enhance_prompt:!1};if(nt.length>0)if(Tt.images=nt,console.log("[Veo] 图生视频模式(通过images参数),图片数量:",nt.length),console.log("[Veo] 图片格式检查:",nt.map((rt,lt)=>({index:lt,type:rt.startsWith("data:")?"base64":rt.startsWith("http")?"http":"unknown",length:rt.length,sizeMB:(rt.length/1024/1024).toFixed(2),mimeType:rt.startsWith("data:")?rt.substring(5,rt.indexOf(";")):"N/A",preview:rt.substring(0,50)}))),_t)console.log("[Veo Fast] 使用 URL 格式,跳过 base64 验证");else{const rt=nt.filter(ot=>!ot.startsWith("data:image/"));if(rt.length>0)throw console.error("[Veo] ❌ 发现非base64格式的图片:",rt.length),new Error(`图片格式错误:${rt.length} 张图片不是base64格式`);const lt=nt.filter(ot=>ot.length>10*1024*1024);lt.length>0&&console.warn("[Veo] ⚠️ 发现超大图片:",lt.length,"张图片超过10MB")}else console.log("[Veo] 文生视频模式(无images参数)");Bt&&(Tt.aspect_ratio=Bt);const St=l&&l!=="Auto"?l:"720P";St==="1080P"?(Tt.enable_upsample=!0,console.log("[Veo] 用户选择1080P,发送 enable_upsample: true(返回1080P视频)")):St==="4K"?(Tt.resolution="4K",console.log("[Veo] 用户选择4K,发送 resolution: 4K")):console.log(`[Veo] 用户选择${St},使用默认720P(不发送resolution参数)`),nt.length>0&&console.log("[Veo] 图生视频模式,分辨率由参考图自动决定"+(St==="1080P"?",enable_upsample提升到1080P":""));let Qe=(r==null?void 0:r.modelName)||"veo3.1-components";const Ue=zt&&De.length>=1&&De.length<=2,Ge=Cv(n),at=l==="4K"||Tt.resolution==="4K";l==="1080P"||Tt.resolution,_t?(Qe="veo3.1-fast",Ue?console.log(`[Veo] Fast首尾帧模式(${De.length}张图)+ ${l||"默认"},使用 MODEL ID: ${Qe}`):nt.length>0?console.log(`[Veo] Fast图生视频模式(${nt.length}张图),使用 MODEL ID: ${Qe}`):console.log(`[Veo] Fast文生视频模式,使用 MODEL ID: ${Qe}`)):Ue?Ge?at?(Qe="veo3.1-pro-4k",console.log(`[Veo] Pro首尾帧模式(${De.length}张图)+ 4K,使用 MODEL ID: ${Qe}`)):(Qe="veo3.1-pro",console.log(`[Veo] Pro首尾帧模式(${De.length}张图)+ ${l||"默认"},使用 MODEL ID: ${Qe}`)):at?(Qe="veo3.1-4k",console.log(`[Veo] 首尾帧模式(${De.length}张图)+ 4K,使用 MODEL ID: ${Qe}`)):(Qe="veo3.1",console.log(`[Veo] 首尾帧模式(${De.length}张图)+ ${l||"默认"},使用 MODEL ID: ${Qe}`)):nt.length>0?Ge&&nt.length===1?(Qe=at?"veo3.1-pro-4k":"veo3.1-pro",console.log(`[Veo] Pro单图模式(1张图),分辨率: ${l||"Auto"},使用 MODEL ID: ${Qe}`)):(Qe=at?"veo3.1-components-4k":"veo3.1-components",console.log(`[Veo] 多图模式(${nt.length}张图),分辨率: ${l||"Auto"},使用 MODEL ID: ${Qe}`)):at?(Qe=Ge?"veo3.1-pro-4k":"veo3.1-components-4k",console.log(`[Veo] 文生视频 + 4K,使用 MODEL ID: ${Qe}`)):(Qe=Ge?"veo3.1-pro":"veo3.1-components",console.log(`[Veo] 文生视频,使用 MODEL ID: ${Qe}`)),Tt.model=Qe,console.log("[Veo] 最终 Payload:",{model:Tt.model,prompt:Tt.prompt,resolution:Tt.resolution||"(图生视频-自动)",aspect_ratio:Tt.aspect_ratio,enhance_prompt:Tt.enhance_prompt,enable_upsample:Tt.enable_upsample,imagesCount:nt.length,hasImages:nt.length>0,isFramesMode:Ue,isImageToVideo:nt.length>0}),q=Tt}else if(Qd(n)){let Bt=i;i.includes("t8star")&&(console.log("[Generation] Hailuo模型检测到错误URL,自动切换到默认端点"),Bt="https://ai.comfly.chat"),T=`${Bt}/minimax/v1/video_generation`;const zt={model:(r==null?void 0:r.modelName)||"MiniMax-Hailuo-2.3",prompt:a};o&&o!=="Auto"&&(zt.aspect_ratio=o);const Gt=!!((ve=t.settings)!=null&&ve.veoFramesMode)&&Kd(n),qt=Gt?y(t.id,"veo_start"):null,De=Gt?y(t.id,"veo_end"):null;let st=l;Gt&&qt&&De&&l!=="768P"&&l!=="1080P"&&(st="768P",console.log("[Hailuo] 首尾帧模式强制使用768P(原分辨率:",l,")")),zt.duration=Wt,st&&st!=="Auto"?zt.resolution=st:zt.resolution="768P",console.log("[Hailuo] 模式检测:",{model:zt.model,currentModel:n,isHailuoFramesMode:Gt,hasStartFrame:!!qt,hasEndFrame:!!De,hasReferenceImage:u,refImagesCount:c.length,resolution:zt.resolution});const Ae=async xt=>{if(!xt)return null;if(xt.startsWith("data:")||xt.startsWith("http"))return xt;const Tt=await As(xt);return await Ls(Tt)},nt=await Ae(qt),_t=await Ae(De);if(nt&&_t)console.log("[Hailuo] 使用首尾帧模式"),zt.first_frame_image=nt,zt.last_frame_image=_t;else if(u&&c.length>0){console.log("[Hailuo] 使用图生视频模式,图片数量:",c.length);const xt=await Ae(c[0]);xt?(console.log("[Hailuo] 图片已解析,类型:",xt.substring(0,30)),zt.first_frame_image=xt):console.warn("[Hailuo] 图片解析失败")}else console.log("[Hailuo] 使用文生视频模式");console.log("[Hailuo] 最终 payload:",{model:zt.model,prompt:zt.prompt,duration:zt.duration,resolution:zt.resolution,hasFirstFrame:!!zt.first_frame_image,hasLastFrame:!!zt.last_frame_image}),q=zt}else if(au(n)){const Bt=Sx(n),zt=!!((ke=t.settings)!=null&&ke.wan26MultiShot);Bt?T=`${i}/api/v1/services/aigc/video-generation/video-synthesis`:T=`${i}/v2/videos/generations`,console.log("[Wan 2.6] 选择 endpoint:",{isOfficial:Bt,enableMultiShot:zt,endpoint:T.substring(0,100)});const qt=a.trim()||"生成视频",De={prompt:qt},st=(Ie=t.settings)==null?void 0:Ie.wan26AudioConfig,Ae=(Pe=t.settings)==null?void 0:Pe.wan26AudioFile,nt=(Te=t.settings)==null?void 0:Te.wan26AudioSegment;if(st==="upload"&&Ae)try{console.log("[Wan 2.6] 开始上传音频文件:",{name:Ae.name,size:Ae.size,type:Ae.type,segment:nt});const St=await YP(Ae,nt||void 0,g,i);console.log("[Wan 2.6] 音频处理成功,URL:",St.substring(0,100)),De.audio_url=St}catch(St){console.error("[Wan 2.6] 音频上传失败:",St);const Qe=St instanceof Error?St.message:String(St);let Ue=`音频上传失败: ${Qe} + +`;throw(Qe.includes("CORS")||Qe.includes("Failed to fetch"))&&(Ue+=`可能的原因: +`,Ue+=`1. 第三方代理服务不支持文件上传 +`,Ue+=`2. 需要配置 CORS 跨域访问 + +`,Ue+=`建议解决方案: +`,Ue+=`• 联系第三方代理服务商询问文件上传接口 +`,Ue+=`• 或使用"自动配音"功能 +`,Ue+="• 或将音频文件上传到公网(如阿里云 OSS)后提供 URL"),new Error(Ue)}const _t=(Be=t.settings)==null?void 0:Be.wan26Resolution;if(u&&c.length>0){let St=c[0];console.log("[Wan 2.6] 开始处理图片,原始 URL 类型:",St.substring(0,50));try{const Qe=new Image;Qe.crossOrigin="anonymous";const Ge=await new Promise((kt,Ot)=>{Qe.onload=()=>kt(Qe),Qe.onerror=Ot,Qe.src=St}),at=Ge.width,rt=Ge.height;console.log("[Wan 2.6] 原始图片尺寸:",{width:at,height:rt});const lt=240,ot=7680;if(atot||rt>ot){console.log("[Wan 2.6] 图片尺寸超出范围,需要调整");let kt=at,Ot=rt;if(ktot||Ot>ot){const Zt=Math.min(ot/kt,ot/Ot);kt=Math.round(kt*Zt),Ot=Math.round(Ot*Zt)}console.log("[Wan 2.6] 调整后图片尺寸:",{width:kt,height:Ot});const dn=document.createElement("canvas");dn.width=kt,dn.height=Ot;const Vt=dn.getContext("2d");if(!Vt)throw new Error("无法创建 canvas context");Vt.drawImage(Ge,0,0,kt,Ot),St=dn.toDataURL("image/png"),console.log("[Wan 2.6] 图片已调整并转换为 Base64,长度:",St.length)}else if(console.log("[Wan 2.6] 图片尺寸符合要求,无需调整"),St.startsWith("blob:")){const kt=document.createElement("canvas");kt.width=at,kt.height=rt;const Ot=kt.getContext("2d");if(!Ot)throw new Error("无法创建 canvas context");Ot.drawImage(Ge,0,0),St=kt.toDataURL("image/png"),console.log("[Wan 2.6] Blob URL 已转换为 Base64")}}catch(Qe){throw console.error("[Wan 2.6] 图片处理失败:",Qe),new Error("图片处理失败:无法加载或调整图片")}De.images=[St],console.log("[Wan 2.6] 图生视频模式,最终图片 URL 类型:",St.substring(0,50))}let xt;const Tt=Bt;if(console.log("[Wan 2.6] 格式选择:",{isOfficial:Bt,enableMultiShot:zt,useNestedFormat:Tt,formatType:Tt?"嵌套格式":"扁平格式"}),Tt){console.log(`[Wan 2.6] 使用嵌套格式 (${Bt?"官方 API":"多镜头模式"})`);const St={prompt:qt},Qe=De.images;Array.isArray(Qe)&&Qe.length>0&&(St.img_url=Qe[0]),De.audio_url&&(St.audio_url=De.audio_url);const Ue={resolution:_t||"720P",prompt_extend:!0,duration:Wt};zt&&(Ue.shot_type="multi"),De.audio_url||(st==="auto"||!st?Bt||(Ue.audio=!0):st==="none"&&(Ue.audio=!1)),xt={model:Bt?(r==null?void 0:r.modelName)||"wan2.6-i2v-flash":"wan2.6-i2v",input:St,parameters:Ue},console.log("[Wan 2.6] Payload (嵌套格式):",{apiType:Bt?"Official":"Proxy",model:xt.model,"input.prompt":St.prompt,"input.img_url":St.img_url?String(St.img_url).substring(0,50):"(无)","input.audio_url":St.audio_url?String(St.audio_url).substring(0,50):"(无)","parameters.resolution":Ue.resolution,"parameters.duration":Ue.duration,"parameters.durationType":typeof Ue.duration,"parameters.shot_type":Ue.shot_type||"(单镜头)"})}else console.log(`[Wan 2.6] 使用扁平格式(第三方代理${zt?" - 多镜头":" - 单镜头"})`),xt={model:"wan2.6-i2v",prompt:qt,resolution:_t||"720P",prompt_extend:!0,duration:Wt},zt&&(xt.shot_type="multi"),De.images&&(xt.images=De.images),De.audio_url?xt.audio_url=De.audio_url:st==="auto"||!st?xt.audio=!0:st==="none"&&(xt.audio=!1),console.log("[Wan 2.6] Payload (扁平格式):",{model:xt.model,prompt:xt.prompt,duration:xt.duration,durationType:typeof xt.duration,shot_type:xt.shot_type||"(单镜头)",images:xt.images?`[${xt.images.length} images]`:"(无)",audio_url:xt.audio_url?String(xt.audio_url).substring(0,50):"(无)",audio:xt.audio,resolution:xt.resolution});q=xt}else if(ru(n)){const Bt=((He=t.settings)==null?void 0:He.duration)||jv(n),zt=(r==null?void 0:r.modelName)||"viduq2";let Gt=10;zt==="viduq3-pro"||n==="vidu-q3-pro"?Gt=16:(zt==="vidu2.0"||n==="vidu-2.0")&&(Gt=8);const qt=Math.min(Gt,Math.max(1,parseInt(Bt.replace("s",""),10)||5)),De=((Je=t.settings)==null?void 0:Je.resolution)||"720p",st=o&&o!=="Auto"?o:"16:9",Ae=!!((Me=t.settings)!=null&&Me.veoFramesMode)&&Kd(n),nt=Ae?y(t.id,"veo_start"):null,_t=Ae?y(t.id,"veo_end"):null,xt=[nt,_t].filter(Boolean);if(Ae&&xt.length===2){T=`${i}/vidu/v2/start-end2video`;const[Tt,St]=await Promise.all(xt.map(Qe=>X(Qe)));q={model:zt,images:[Tt,St],duration:qt,seed:0,resolution:De,movement_amplitude:"auto",off_peak:!1,...a!=null&&a.trim()?{prompt:a.trim()}:{}},console.log("[Vidu] 首尾帧模式 start-end2video")}else if(u&&c.length>0){const Tt=await Promise.all(c.slice(0,7).map(St=>X(St)));c.length===1?(T=`${i}/vidu/v2/img2video`,q={model:zt,images:Tt,duration:qt,seed:0,resolution:De,movement_amplitude:"auto",off_peak:!1,...a!=null&&a.trim()?{prompt:a.trim()}:{}},console.log("[Vidu] 图生视频 img2video")):(T=`${i}/vidu/v2/reference2video`,q={model:zt,prompt:(a==null?void 0:a.trim())||"生成视频",images:Tt,duration:qt,seed:0,aspect_ratio:st,resolution:De,movement_amplitude:"auto",off_peak:!1},console.log("[Vidu] 参考图 reference2video, 图片数:",Tt.length))}else T=`${i}/vidu/v2/text2video`,q={model:zt,prompt:(a==null?void 0:a.trim())||"生成视频",duration:qt,seed:0,aspect_ratio:st,resolution:De,movement_amplitude:"auto",off_peak:!1},["viduq2","vidu2.0","viduq2-pro","viduq2-turbo","viduq2-pro-fast","viduq3-pro"].includes(zt)||(q.style="general"),console.log("[Vidu] 文生视频 text2video, duration:",qt,"model:",zt);console.log("[Vidu] 请求参数:",{model:zt,duration:qt,maxDuration:Gt,originalDuration:Bt,resolution:De,aspectRatio:st})}else if(gm(n)){const Bt=((Re=t.settings)==null?void 0:Re.mjMode)||"fast",zt=((Ve=t.settings)==null?void 0:Ve.mjMotion)||"low";T=`${i}/${Bt}/mj/submit/video`;const Gt={prompt:a.trim(),motion:zt,image:""};if(u&&c.length>0){const qt=c[0],De=await O(qt);Gt.image=De,console.log("[MJ Video] 图生视频,已添加首帧图片")}q=Gt,console.log("[MJ Video] 请求参数:",{endpoint:T,mode:Bt,motion:zt,hasImage:!!Gt.image,promptPreview:a.substring(0,100)})}else{const Bt=i.includes("api.openai.com"),zt=o==="Auto"?"16:9":o,Gt=zt==="16:9"||zt==="9:16"?zt:"16:9",qt=n==="sora-2-pro"&&!!((Ze=t.settings)!=null&&Ze.isHD);if(Bt){T=`${i}/videos`,H=!0;const De=Gt==="9:16",st=qt?De?"1080x1920":"1920x1080":De?"720x1280":"1280x720",Ae=new FormData;Ae.append("model",(r==null?void 0:r.modelName)||"sora-2"),Ae.append("prompt",a),Ae.append("size",st),Ae.append("seconds",String(Wt)),qt&&Ae.append("quality","hd"),u&&(await Promise.all(c.slice(0,1).map(_t=>A(_t)))).forEach(_t=>{Ae.append("input_reference",_t,"ref.png"),Ae.append("image",_t,"ref.png")}),q=Ae}else{T=`${i}/v2/videos/generations`,H=!1;const De=String(Wt),st={model:(r==null?void 0:r.modelName)||"sora-2",prompt:a,aspect_ratio:Gt,duration:De};if(a.length>5e3&&console.warn("[Sora] ⚠️ 提示词过长:",a.length,"字符,可能超出 API 限制"),console.log("[Sora] 📝 Payload 详情:",{model:st.model,promptLength:a.length,promptPreview:a.substring(0,100)+"...",aspect_ratio:Gt,duration:De,endpoint:T}),qt&&(st.hd=!0),(je=t.settings)!=null&&je.characterId){const Ae=t.settings.characterId;st.character=Ae,console.log("[Sora2] 使用角色客串 (character字段):",Ae),console.log("[Sora2] Payload:",st)}if(u){const Ae=await Promise.all(c.slice(0,1).map(async nt=>await O(nt)));st.images=Ae,console.log("[Sora] 图生视频,已添加图片数据")}q=st}}}else if(p){const Jt=o==="Auto"||!o?"Auto":o,Wt=l==="1K"?"1k":l==="4K"?"4k":"2k",Pt=(Wt==="2k"||Wt==="4k")&&Jt==="Auto"?"1:1":Jt;if(u){T=`${i}/v1/images/compositions`;const Bt=await Promise.all(c.map(async zt=>{if(zt.startsWith("data:")||zt.startsWith("http://")||zt.startsWith("https://"))return zt;const Gt=await As(zt);return await Ls(Gt)}));q={model:(r==null?void 0:r.modelName)||n,prompt:a.trim(),images:Bt,ratio:Pt,resolution:Wt,response_format:"url"},console.log("[Jimeng] 图生图,已添加",Bt.length,"张图片")}else T=`${i}/v1/images/generations`,q={model:(r==null?void 0:r.modelName)||n,prompt:a.trim(),ratio:Pt,resolution:Wt,response_format:"url"}}else if(n.includes("gpt-image")||n.includes("gpt-4o-image")){const Jt=((Le=t.settings)==null?void 0:Le.useAsyncMode)??!0,Wt=Jt?"?async=true":"";console.log(`[GPT Image] 使用${Jt?"异步":"同步"}模式`);const Pt=zt=>({"1:1":"1024x1024","16:9":"1792x1024","21:9":"1792x1024","4:3":"1536x1024","3:2":"1536x1024","9:16":"1024x1792","3:4":"1024x1536","2:3":"1024x1536",Auto:"1024x1024"})[zt]||"1024x1024",Bt=((Xe=t.settings)==null?void 0:Xe.gptImageQuality)||"standard";if(u){T=`${i}/v1/images/edits${Wt}`,H=!0;const zt=new FormData;zt.append("model",(r==null?void 0:r.modelName)||n),zt.append("prompt",a),zt.append("n","1"),zt.append("response_format","url");const Gt=Pt(o);zt.append("size",Gt),zt.append("quality",Bt);const qt=await Promise.all(c.map(st=>A(st)));if((R?qt:await Promise.all(qt.map(async st=>{try{const{makeImageSquare:Ae}=await mn(async()=>{const{makeImageSquare:nt}=await Promise.resolve().then(()=>yv);return{makeImageSquare:nt}},void 0,import.meta.url);return await Ae(st)}catch(Ae){return console.warn("[Generation] 转换正方形失败,使用原图:",Ae),st}}))).forEach((st,Ae)=>zt.append("image",st,`input_${Ae}.png`)),I&&I.length>0)try{const{base64ToBlob:st}=await mn(async()=>{const{base64ToBlob:_t}=await Promise.resolve().then(()=>yv);return{base64ToBlob:_t}},void 0,import.meta.url),Ae=I[0],nt=st(Ae.mask,"image/png");zt.append("mask",nt,"mask.png"),console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"),console.log("[Generation] ✅ 已添加标记蒙版到 GPT Image 请求"),console.log("[Generation] 📊 蒙版信息:",{尺寸:`${Ae.width}×${Ae.height}`,文件大小:`${(nt.size/1024).toFixed(2)} KB`,标记数量:Ae.markerCount||0}),console.log("[Generation] 🖼️ 蒙版预览(复制下面完整链接到浏览器地址栏查看):"),console.log(`%cdata:image/png;base64,${Ae.mask}`,"color: #60a5fa; font-weight: bold;"),console.log("[Generation] 💡 提示:白色区域 = AI 将修改的位置,黑色区域 = AI 将保持不变"),console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")}catch(st){console.error("[Generation] ❌ 添加蒙版失败:",st)}q=zt}else{T=`${i}/v1/images/generations${Wt}`;const zt=Pt(o);q={model:(r==null?void 0:r.modelName)||n,prompt:a,n:1,size:zt,quality:Bt,response_format:"url"}}}else if(n.includes("flux-kontext")){T=`${i}/v1/images/edits`,H=!0;const Jt=new FormData;Jt.append("model",(r==null?void 0:r.modelName)||"flux-kontext-pro"),Jt.append("prompt",a),o!=="Auto"&&Jt.append("aspect_ratio",o),u&&(await Promise.all(c.map(Pt=>A(Pt)))).forEach((Pt,Bt)=>Jt.append("image",Pt,`flux_ref_${Bt}.png`)),q=Jt}else if(n.includes("qwen-image-edit")){if(!u||c.length===0)return v(t.id,{isGenerating:!1,errorMsg:"需要参考图片"}),w(Gt=>Gt.map(qt=>qt.id===b?{...qt,status:"failed",progress:0,errorMsg:"需要参考图片"}:qt)),null;const Wt=((qe=t.settings)==null?void 0:qe.useAsyncMode)??!0?"?async=true":"";T=`${i}/v1/images/edits${Wt}`,H=!0;const Pt=new FormData;Pt.append("model",(r==null?void 0:r.modelName)||"qwen-image-edit"),Pt.append("prompt",a.trim()||"请根据参考图编辑");const Bt={"1:1":"1024x1024","16:9":"1792x1024","9:16":"1024x1792","4:3":"1536x1024","3:4":"1024x1536","3:2":"1536x1024","2:3":"1024x1536","21:9":"1792x1024",Auto:"1024x1024"};Pt.append("size",Bt[o]||"1024x1024"),Pt.append("n","1"),(await Promise.all(c.map(async Gt=>{const qt=await A(Gt);return qt.type?qt:new Blob([await qt.arrayBuffer()],{type:"image/png"})}))).forEach((Gt,qt)=>Pt.append("image",Gt,`qwen_edit_${qt}.png`)),q=Pt}else if(n.includes("grok-4.1-image")||n.includes("grok-4.2-image")){T=`${i}/v1/chat/completions`,H=!1;const Jt=a.trim()||(u?"参考上图修改":""),Wt=o&&o!=="Auto"?u?` + +请忽略参考图原始比例,按 ${o} 比例输出图片。`:` + +请生成比例为 ${o} 的图片。`:"",Pt=l&&l!=="Auto"?` + +请生成 ${l} 分辨率的图片。`:"",Bt=Jt.concat(Wt).concat(Pt);let zt;if(u&&c.length>0){const Gt=[{type:"text",text:Bt}],qt=await Promise.all(c.slice(0,4).map(async De=>{if(De.startsWith("http://")||De.startsWith("https://")||De.startsWith("data:"))return De;const st=await As(De);return await Ls(st)}));qt.forEach(De=>Gt.push({type:"image_url",image_url:{url:De}})),zt=[{role:"user",content:Gt}],console.log("[Grok Image] 图生图 Chat(修改图片),参考图数:",qt.length,o!=="Auto"?"提示词已追加比例":"")}else zt=[{role:"user",content:Bt}];q={model:(r==null?void 0:r.modelName)||n,messages:zt,stream:!1,...o!=="Auto"?{aspect_ratio:o}:{},...l&&l!=="Auto"?{resolution:l.toLowerCase()}:{}},console.log("[Grok Image] Chat Completions,endpoint:",T,"aspect_ratio:",o!=="Auto"?o:"(auto)","resolution:",l&&l!=="Auto"?l.toLowerCase():"(auto)","payload.resolution:",q.resolution)}else if(n.includes("z-image-turbo")||n.includes("z-image-official"))if(lP(n)){T=`${i}/api/v1/services/aigc/multimodal-generation/generation`,console.log("[Z-Image Official] ========== DEBUG INFO =========="),console.log("[Z-Image Official] window.location.hostname:",window.location.hostname),console.log("[Z-Image Official] window.location.protocol:",window.location.protocol),console.log("[Z-Image Official] window.location.href:",window.location.href),console.log("[Z-Image Official] baseUrl:",i),console.log("[Z-Image Official] endpoint:",T),console.log("[Z-Image Official] isTauriEnvironment:",typeof window<"u"&&"__TAURI__"in window),console.log("[Z-Image Official] ========================================");let Wt="1024*1024";o==="1:1"?Wt="1024*1024":o==="16:9"?Wt="1280*720":o==="9:16"?Wt="720*1280":o==="4:3"?Wt="1152*864":o==="3:4"?Wt="864*1152":o==="3:2"?Wt="1248*832":o==="2:3"?Wt="832*1248":o==="21:9"?Wt="1344*576":o==="9:21"?Wt="576*1344":o==="7:9"?Wt="896*1152":o==="9:7"?Wt="1152*896":Wt="1024*1024",(l==="2K"||l==="4K")&&(o==="1:1"?Wt="1280*1280":o==="16:9"?Wt="1536*864":o==="9:16"?Wt="864*1536":o==="4:3"?Wt="1472*1104":o==="3:4"?Wt="1104*1472":o==="3:2"?Wt="1536*1024":o==="2:3"?Wt="1024*1536":o==="21:9"?Wt="1680*720":o==="9:21"?Wt="720*1680":o==="7:9"?Wt="1120*1440":o==="9:7"&&(Wt="1440*1120")),q={model:"z-image-turbo",input:{messages:[{role:"user",content:[{text:a}]}]},parameters:{prompt_extend:!1,size:Wt}},console.log("[Z-Image Official] 通义官方 API Payload:",q)}else{const Wt=((tt=t.settings)==null?void 0:tt.useAsyncMode)??!0;T=`${i}/v1/images/generations${Wt?"?async=true":""}`,console.log(`[Z-Image Turbo Proxy] 使用${Wt?"异步":"同步"}模式`),q={model:(r==null?void 0:r.modelName)||"z-image-turbo",prompt:a,response_format:"url",...o!=="Auto"?{aspect_ratio:o}:{}},console.log("[Z-Image Turbo Proxy] 第三方代理 API Payload:",q)}else if(Nv(n)){let Jt=((Ye=t.settings)==null?void 0:Ye.enableInterleave)??!1;!Jt&&!u&&(Jt=!0,console.warn("[Wan 2.6 Image] ⚠️ 图像编辑模式需要参考图片,已自动切换到图文混排模式(纯文生图)"));let Wt="1280*1280";o==="1:1"?Wt="1280*1280":o==="16:9"?Wt="1280*720":o==="9:16"?Wt="720*1280":o==="4:3"?Wt="1280*960":o==="3:4"?Wt="960*1280":o==="3:2"?Wt="1200*800":o==="2:3"?Wt="800*1200":o==="21:9"?Wt="1344*576":Wt="1280*1280";const Pt=[{text:a}];if(u){const xt=Jt?1:4,Tt=c.slice(0,xt);for(const St of Tt)if(St.startsWith("data:"))Pt.push({image:St});else if(St.startsWith("http://")||St.startsWith("https://"))Pt.push({image:St});else{const Qe=await As(St),Ue=await Ls(Qe);Pt.push({image:Ue})}}const Bt={size:Wt,enable_interleave:Jt,watermark:!1};Jt?(Bt.n=1,Bt.max_images=((ht=t.settings)==null?void 0:ht.maxImages)??5):(Bt.prompt_extend=((ct=t.settings)==null?void 0:ct.promptExtend)??!0,Bt.n=((pt=t.settings)==null?void 0:pt.imageCount)??4);const zt=((wt=t.settings)==null?void 0:wt.negativePrompt)||"";zt&&(Bt.negative_prompt=zt);const Gt=($t=t.settings)==null?void 0:$t.seed;Gt!=null&&(Bt.seed=Gt);const qt=Jt&&(((jt=t.settings)==null?void 0:jt.useStream)??!1),De=((Nt=t.settings)==null?void 0:Nt.useAsyncMode)??!0;let st=a;const Ae=(Yt=t.settings)==null?void 0:Yt.audioUrl,nt=(un=t.settings)==null?void 0:un.audioDescription;if(Ae||nt){const xt=nt||"根据上传的音频风格生成";st=`${a} + +【音频参考】${xt}`,console.log("[Wan 2.6 Image Official] 添加音频参考到提示词:",xt)}const _t=[{text:st},...Pt.slice(1)];Jt?qt?(T=`${i}/api/v1/services/aigc/multimodal-generation/generation`,Bt.stream=!0):T=`${i}/api/v1/services/aigc/image-generation/generation`:De?T=`${i}/api/v1/services/aigc/image-generation/generation`:T=`${i}/api/v1/services/aigc/multimodal-generation/generation`,q={model:"wan2.6-image",input:{messages:[{role:"user",content:_t}]},parameters:Bt},console.log("[Wan 2.6 Image Official] 通义官方 API Payload:",q),console.log("[Wan 2.6 Image Official] 模式:",Jt?"图文混排":"图像编辑","流式:",qt)}else if(e0(n)){const Jt=(r==null?void 0:r.modelName)||"gemini-3.1-flash-image-preview";T=`${i.replace(/\/+$/,"")}/v1beta/models/${Jt}:generateContent`;const Wt=[{text:a}];if(u&&c.length>0){const De=c.slice(0,14),st=await Promise.all(De.map(async Ae=>{const nt=await A(Ae),_t=await Ls(nt),xt=_t.indexOf(","),Tt=xt>=0?_t.slice(xt+1).trim():_t;let St="image/png";if(_t.startsWith("data:")){const Qe=_t.match(/data:([^;]+)/);Qe&&(St=Qe[1])}return{inline_data:{mime_type:St,data:Tt}}}));Wt.push(...st),console.log("[Gemini Image Official] 图生图,已添加",st.length,"张参考图")}const Pt=o==="Auto"?"1:1":o,zt=(qt=>qt==="4K"?"4K":qt==="2K"?"2K":qt==="1K"?"1K":qt==="512px"?"512":"2K")(l),Gt={responseModalities:["TEXT","IMAGE"],imageConfig:n==="gemini-2.5-flash-image-official"?{aspectRatio:Pt}:{aspectRatio:Pt,imageSize:zt}};q={contents:[{role:"user",parts:Wt}],generationConfig:Gt},console.log("[Gemini Image Official] 官方 API Payload (generationConfig):",Gt,"| resolution:",l,"-> imageSize:",zt)}else if(_y(n)){const Jt=_H(n);let Wt;if(o==="Auto"||o==="1:1")Wt=l==="1K"?"1K":l==="4K"?"4K":"2K";else{const Bt={"16:9":[2560,1440],"9:16":[1440,2560],"4:3":[2048,1536],"3:4":[1536,2048],"3:2":[2400,1600],"2:3":[1600,2400],"21:9":[2560,1097],"9:21":[1097,2560]},zt={"16:9":[3840,2160],"9:16":[2160,3840],"4:3":[3072,2304],"3:4":[2304,3072],"3:2":[3600,2400],"2:3":[2400,3600],"21:9":[3840,1646],"9:21":[1646,3840],"1:1":[4096,4096]},Gt={"16:9":[1280,720],"9:16":[720,1280],"4:3":[1024,768],"3:4":[768,1024],"3:2":[1200,800],"2:3":[800,1200],"21:9":[1280,549],"9:21":[549,1280],"1:1":[1024,1024]};let qt=Bt;l==="4K"?qt=zt:l==="1K"&&(qt=Gt);const De=qt[o]||Bt[o]||[2048,2048];Wt=`${De[0]}x${De[1]}`,console.log(`[Seedream] 比例 ${o},分辨率 ${l},计算尺寸: ${Wt}`)}Jt?T=`${i.replace(/\/+$/,"")}/v1/images/generations`:T=`${i.replace(/\/+$/,"")}/api/v3/images/generations`;const Pt={model:(r==null?void 0:r.modelName)||n.replace(/-api$/,""),prompt:a.trim(),size:Wt,sequential_image_generation:"disabled",response_format:"b64_json",watermark:!1};if(u&&c.length>0){const zt=c.slice(0,14),Gt=await Promise.all(zt.map(async qt=>{if(qt.startsWith("data:"))return qt;const De=await As(qt);return await Ls(De)}));Pt.image=Gt.length===1?Gt[0]:Gt,console.log("[Seedream] 图生图,已添加",Gt.length,"张参考图")}q=Pt,console.log(`[Seedream${Jt?" API":""}] ${Jt?"第三方":"方舟图片"} API Payload:`,{...q,image:q.image?"(已设置)":void 0})}else if(Xd(n)){T=`${i.replace(/\/+$/,"")}/v1/draw/nano-banana`;const Jt=o==="Auto"?"auto":o,Wt=l==="1K"?"1K":l==="4K"?"4K":"2K",Pt={model:(r==null?void 0:r.modelName)||"nano-banana-fast",prompt:a.trim(),aspectRatio:Jt,imageSize:Wt,webHook:"-1",shutProgress:!0};if(u&&c.length>0){const Bt=await Promise.all(c.slice(0,14).map(async zt=>{if(zt.startsWith("http://")||zt.startsWith("https://")||zt.startsWith("data:"))return zt;const Gt=await As(zt);return await Ls(Gt)}));Pt.urls=Bt,console.log("[Grsai] 图生图,已添加",Bt.length,"张参考图")}q=Pt,console.log("[Grsai] API Payload:",{...Pt,urls:((Tn=Pt.urls)==null?void 0:Tn.length)??0})}else if(f){const Jt=((Ht=t.settings)==null?void 0:Ht.useAsyncMode)??!0,Wt=Jt?"?async=true":"";console.log(`[Nano Banana 2] 使用${Jt?"异步":"同步"}模式`);const Pt=n==="gemini-3.1-flash-image-preview",Bt=Pt&&l==="512px"?"512px":l==="1K"?"1K":l==="4K"?"4K":"2K",zt=Pt?l==="512px"?"gemini-3.1-flash-image-preview-512px":l==="2K"?"gemini-3.1-flash-image-preview-2k":l==="4K"?"gemini-3.1-flash-image-preview-4k":"gemini-3.1-flash-image-preview":(r==null?void 0:r.modelName)||"nano-banana-2";if(u){T=`${i}/v1/images/edits${Wt}`,H=!0;const Gt=new FormData;if(Gt.append("model",zt),Gt.append("prompt",a),Gt.append("response_format","url"),Gt.append("image_size",Bt),o!=="Auto"&&(Gt.append("aspect_ratio",o),(o==="8:1"||o==="1:8")&&console.log("[Nano Banana 2] 发送 aspect_ratio:",o)),m){const{rotation:De,tilt:st,scale:Ae}=m,nt=m.sceneMode,_t=m.needsControlNetReduction||!1;if(De===0&&st===0&&Ae===1)console.log("[Generation] 📸 导演相机模式:角度为默认值,使用默认重绘强度");else{let Tt=.78;if(Tt=_j(nt,Tt),Gt.append("denoising_strength",String(Tt)),_t&&nt==="architecture"){const St=zj();console.log("[Generation] 🔧 建筑模式:ControlNet 权重降低至",St.toFixed(2)),console.log("[Generation] 💡 提示:如果 API 支持 ControlNet 参数,请取消上述注释")}console.log("[Generation] 📸 导演相机模式:角度已变化,重绘强度提升至",Tt),console.log("[Generation] 场景模式:",nt||"character"),console.log("[Generation] 角度参数:",{rotation:De,tilt:st,scale:Ae}),console.log("[Generation] ⚠️ 重要:重绘强度已提升,允许空间重组")}}if((await Promise.all(c.map(De=>A(De)))).forEach((De,st)=>Gt.append("image",De,`input_${st}.png`)),I&&I.length>0)try{const{base64ToBlob:De}=await mn(async()=>{const{base64ToBlob:nt}=await Promise.resolve().then(()=>yv);return{base64ToBlob:nt}},void 0,import.meta.url),st=I[0],Ae=De(st.mask,"image/png");Gt.append("mask",Ae,"mask.png"),console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"),console.log("[Generation] ✅ 已添加标记蒙版到 Nano Banana 2 请求"),console.log("[Generation] 📊 蒙版信息:",{尺寸:`${st.width}×${st.height}`,文件大小:`${(Ae.size/1024).toFixed(2)} KB`,标记数量:st.markerCount||0}),console.log("[Generation] 🖼️ 蒙版预览(复制下面完整链接到浏览器地址栏查看):"),console.log(`%cdata:image/png;base64,${st.mask}`,"color: #60a5fa; font-weight: bold;"),console.log("[Generation] 💡 提示:白色区域 = AI 将修改的位置,黑色区域 = AI 将保持不变"),console.log("[Generation] ⚠️ 注意:如果 AI 没有按照蒙版修改,可能是 API 不支持 mask 参数"),console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")}catch(De){console.error("[Generation] ❌ 添加蒙版失败:",De)}q=Gt}else T=`${i}/v1/images/generations${Wt}`,q={model:zt,prompt:a,response_format:"url",image_size:Bt,...o!=="Auto"?{aspect_ratio:o}:{}},o!=="Auto"&&(o==="8:1"||o==="1:8")&&console.log("[Nano Banana 2] 文生图 发送 aspect_ratio:",o),z&&typeof q=="object"&&q!==null&&(Object.assign(q,z),console.log("[Generation] Added storyboard JSON data to payload:",z))}else if(h){const Jt=((fn=t.settings)==null?void 0:fn.mjMode)||"fast",Wt=((Dn=t.settings)==null?void 0:Dn.mjVersion)||"--v 7",Pt=y(t.id,"oref"),Bt=y(t.id,"sref"),zt=[],Gt=new Map;let qt=Pt||"",De=Bt||"";const st=[];qt&&!qt.startsWith("http")&&(zt.push(qt),Gt.set("oref",zt.length-1),qt=""),De&&!De.startsWith("http")&&(zt.push(De),Gt.set("sref",zt.length-1),De="");const Ae=c.filter(xt=>xt!==Pt&&xt!==Bt);for(const xt of Ae)xt.startsWith("http")?st.push(xt):(zt.push(xt),Gt.set(`default_${st.length}`,zt.length-1),st.push(null));if(zt.length>0)try{w(Ue=>Ue.map(Ge=>Ge.id===b?{...Ge,progress:2,status:"generating"}:Ge));const xt=`${i}/mj/submit/upload-discord-images`,Tt=await Promise.all(zt.map(async Ue=>{if(Ue.startsWith("blob:")){const Ge=await fetch(Ue).then(at=>at.blob());return await Ls(Ge)}return Ue})),St=await fetch(xt,{method:"POST",headers:{Authorization:`Bearer ${g}`,"Content-Type":"application/json"},body:JSON.stringify({base64Array:Tt})});if(!St.ok){const Ue=await St.text();throw new Error(`图片上传失败: ${St.status} - ${Ue}`)}const Qe=await St.json();if(Qe.code===1&&Qe.result&&Array.isArray(Qe.result)){const Ue=Qe.result;Gt.has("oref")&&(qt=Ue[Gt.get("oref")]),Gt.has("sref")&&(De=Ue[Gt.get("sref")]);for(let Ge=0;GeTt.map(St=>St.id===b?{...St,status:"failed",progress:0,errorMsg:`图片上传失败: ${xt.message}`}:St)),v(t.id,{isGenerating:!1,errorMsg:`图片上传失败: ${xt.message}`,settings:{...t.settings,isGenerating:!1,progress:0,error:`图片上传失败: ${xt.message}`}}),null}const nt=st.filter(xt=>xt!==null);let _t=nt.length>0?nt.join(" ")+" ":"";if(_t+=a.trim(),!_t.includes("--v ")&&!_t.includes("--niji ")&&(_t=`${_t} ${Wt}`.trim()),o!=="Auto"&&!_t.includes("--ar ")&&(_t=`${_t} --ar ${o}`.trim()),qt&&!_t.includes("--oref ")){_t=`${_t} --oref ${qt}`.trim();const xt=(it=t.settings)==null?void 0:it.mjOw;xt&&xt>0&&(_t=`${_t} --ow ${Math.min(1e3,Math.max(1,xt))}`.trim())}if(De&&!_t.includes("--sref ")){_t=`${_t} --sref ${De}`.trim();const xt=(Lt=t.settings)==null?void 0:Lt.mjSw;xt&&xt>0&&(_t=`${_t} --sw ${Math.min(1e3,Math.max(1,xt))}`.trim())}T=`${i}/${Jt}/mj/submit/imagine`,q={prompt:_t.trim(),base64Array:[]}}else{const Jt=(n.includes("banana")||n.includes("edit")||n.includes("qwen"))&&!n.includes("nano-banana-2")&&!n.includes("gemini-3.1-flash-image-preview")&&!n.includes("qwen-image-edit"),Wt=Jt&&l==="HD"?"nano-banana-hd":n,Pt=((gt=t.settings)==null?void 0:gt.useAsyncMode)??!0,Bt=Pt?"?async=true":"";if(console.log(`[Nano Banana] 使用${Pt?"异步":"同步"}模式,模型: ${Wt}`),u&&Jt){T=`${i}/v1/images/edits${Bt}`,H=!0;const zt=new FormData;if(zt.append("model",Wt),zt.append("prompt",a||"enhance"),zt.append("n","1"),zt.append("response_format","url"),o!=="Auto"&&zt.append("aspect_ratio",o),m){const{rotation:qt,tilt:De,scale:st}=m,Ae=m.sceneMode,nt=m.needsControlNetReduction||!1;if(!(qt===0&&De===0&&st===1)){let xt=.78;if(xt=_j(Ae,xt),zt.append("denoising_strength",String(xt)),nt&&Ae==="architecture"){const Tt=zj();console.log("[Generation] 🔧 建筑模式:ControlNet 权重降低至",Tt.toFixed(2))}console.log("[Generation] 📸 导演相机模式:角度已变化,重绘强度提升至",xt),console.log("[Generation] 场景模式:",Ae||"character"),console.log("[Generation] 角度参数:",{rotation:qt,tilt:De,scale:st}),console.log("[Generation] ⚠️ 重要:重绘强度已提升,允许空间重组")}}(await Promise.all(c.map(qt=>A(qt)))).forEach((qt,De)=>zt.append("image",qt,`input_${De}.png`)),q=zt}else T=`${i}/v1/images/generations${Bt}`,q={model:(r==null?void 0:r.modelName)||n,prompt:a,response_format:"url",...o!=="Auto"?{aspect_ratio:o}:{}},z&&typeof q=="object"&&q!==null&&(Object.assign(q,z),console.log("[Generation] Added storyboard JSON data to payload:",z))}return m&&(H&&q instanceof FormData?q.append("angle_parameters",JSON.stringify(m)):typeof q=="object"&&q!==null&&(q.angle_parameters=m),console.log("[Generation] Added angle_parameters to payload:",m)),{endpoint:T,payload:q,useMultipart:H}}function Jf(e,t,n){return t.filter(a=>a.from===e).map(a=>n.find(o=>o.id===a.to)).filter(a=>(a==null?void 0:a.type)==="preview").map(a=>a.id)}async function pO(e,t,n,r,i,a){if(!e){console.log("[updateConnectedPreview] 没有预览节点ID,跳过");return}console.log("[updateConnectedPreview] 开始更新预览节点:",{previewId:e,content:t==null?void 0:t.substring(0,100),previewType:n,extraProps:i});try{let o=t,l;if(t&&(t.startsWith("http://")||t.startsWith("https://"))){const y=`preview_${e}_${Date.now()}`;o=await Yf(t,y,void 0,{usePreviewQuality:!0}),l=y}else t&&(t.startsWith("blob:")||t.startsWith("data:"))&&(i!=null&&i.contentAssetId)&&(l=i.contentAssetId);let c=i==null?void 0:i.previewMjImages;console.log("[updateConnectedPreview] 多图数量:",(c==null?void 0:c.length)||0);let u;if(i!=null&&i.previewMjAssetIds&&i.previewMjAssetIds.length>0&&c&&c.length===i.previewMjAssetIds.length)u=i.previewMjAssetIds;else if(c&&c.length>0){console.log("[updateConnectedPreview] 开始下载多图/多视频:",c);const y=c.map(async(v,m)=>{if(v&&(v.startsWith("http://")||v.startsWith("https://"))){await new Promise(C=>setTimeout(C,m*50));const z=`preview_${e}_img${m}_${Date.now()}`;return{url:await Yf(v,z,void 0,{usePreviewQuality:!0}),assetId:z}}return{url:v,assetId:void 0}}),w=await Promise.all(y);c=w.map(v=>v.url).filter(v=>v!=null),u=w.map(v=>v.assetId).filter(v=>v!=null),console.log("[updateConnectedPreview] 多图/多视频下载完成:",c)}let d=i==null?void 0:i.previewMjVideos;if(console.log("[updateConnectedPreview] 多视频数量:",(d==null?void 0:d.length)||0),d&&d.length>0){console.log("[updateConnectedPreview] 开始下载多视频:",d);const y=d.map(async(w,v)=>{if(w&&(w.startsWith("http://")||w.startsWith("https://"))){await new Promise(z=>setTimeout(z,v*100));const m=`preview_${e}_video${v}_${Date.now()}`;return await Yf(w,m)}return w});d=await Promise.all(y),console.log("[updateConnectedPreview] 多视频下载完成:",d)}let h=i==null?void 0:i.selectedPreviewImage,p;if(h&&(h.startsWith("http://")||h.startsWith("https://"))){const y=`preview_${e}_selected_${Date.now()}`;h=await Yf(h,y,void 0,{usePreviewQuality:!0}),p=y}let f=i==null?void 0:i.selectedPreviewVideo,b;if(f&&(f.startsWith("http://")||f.startsWith("https://"))){const y=`preview_${e}_selected_video_${Date.now()}`;f=await Yf(f,y),b=y}const g={content:o,previewType:n,_contentAssetId:l,previewMjImages:c&&c.length>0?c:void 0,_previewMjAssetIds:u,selectedPreviewImage:h||void 0,_selectedImageAssetId:p,previewMjVideos:d&&d.length>0?d:void 0,selectedPreviewVideo:f||void 0,...b?{_selectedVideoAssetId:b}:{}};if(i!=null&&i.sourceNodeName&&(g.nodeName=i.sourceNodeName),(i==null?void 0:i.previewSourceModel)!=null&&a){const y=a.find(w=>w.id===e);g.settings={...(y==null?void 0:y.settings)||{},previewSourceModel:i.previewSourceModel}}if((i==null?void 0:i.previewActualSize)!=null&&a){const y=a.find(w=>w.id===e);g.settings={...g.settings||{},...(y==null?void 0:y.settings)||{},previewActualSize:i.previewActualSize}}if((i==null?void 0:i.previewGridRows)!=null&&(i==null?void 0:i.previewGridCols)!=null||(i==null?void 0:i.previewSourceNodeId)!=null||(i==null?void 0:i.previewSourceNodeType)!=null){const y=a==null?void 0:a.find(w=>w.id===e);g.settings={...g.settings||{},...(y==null?void 0:y.settings)||{},...(i==null?void 0:i.previewGridRows)!=null&&(i==null?void 0:i.previewGridCols)!=null?{previewGridRows:i.previewGridRows,previewGridCols:i.previewGridCols}:{},...(i==null?void 0:i.previewSourceNodeId)!=null?{previewSourceNodeId:i.previewSourceNodeId}:{},...(i==null?void 0:i.previewSourceNodeType)!=null?{previewSourceNodeType:i.previewSourceNodeType}:{}}}console.log("[updateConnectedPreview] 更新预览节点数据:",g),r(e,g),console.log("[updateConnectedPreview] ✅ 预览节点更新完成")}catch(o){console.error("[updateConnectedPreview] ❌ 更新预览节点失败:",o),r(e,{content:t,previewType:n,previewMjImages:i!=null&&i.previewMjImages&&i.previewMjImages.length>0?i.previewMjImages:void 0,selectedPreviewImage:(i==null?void 0:i.selectedPreviewImage)||void 0,previewMjVideos:i!=null&&i.previewMjVideos&&i.previewMjVideos.length>0?i.previewMjVideos:void 0,selectedPreviewVideo:(i==null?void 0:i.selectedPreviewVideo)||void 0})}}function VX(e){try{const[t,n]=e.split(","),r=t==null?void 0:t.match(/data:([^;]+)/),i=(r==null?void 0:r[1])||"image/jpeg",a=atob(n||""),o=new Uint8Array(a.length);for(let l=0;l{try{let r=t;if(t.startsWith("http://")||t.startsWith("https://")){const l=await fetch(t);if(!l.ok)return;const c=await l.blob();if(!c.type.startsWith("image/"))return;r=await new Promise((u,d)=>{const h=new FileReader;h.onload=()=>u(h.result),h.onerror=()=>d(h.error),h.readAsDataURL(c)})}await zi.storeWithThumbnails(e,r);const i=await zi.getPreview(e);if(!i)return;const{localCacheManager:a}=await mn(async()=>{const{localCacheManager:l}=await Promise.resolve().then(()=>Xa);return{localCacheManager:l}},void 0,import.meta.url);a.isAvailable()&&await a.saveThumbnail(e,i,"preview");const o=VX(i);if(o){await Xr.saveBlobAsset(`${e}_thumbnail`,o,"");const l=await Xr.getAssetUrl(`${e}_thumbnail`);l&&n(c=>c.map(u=>u.id===e?{...u,thumbnailUrl:l,_thumbnailAssetId:`${e}_thumbnail`}:u))}}catch(r){console.warn("[Generation] 缩略图保存失败:",r)}})()}async function jg(e){var L,X,T,q,H,J,Z,B,V,N,j,k,W,M,Y,se,ie,oe,re,ee;const{result:t,taskId:n,node:r,baseUrl:i,apiKey:a,currentModel:o,isMidjourney:l,isVideoGeneration:c,connections:u,nodes:d,nodesRef:h,updateNode:p,setHistory:f,connectedPreviewId:b,batchAccumulator:g,batchIndex:y}=e,w=(h==null?void 0:h.current)??d,v=Jf(r.id,u,w),m=(L=r.settings)==null?void 0:L.selectedPreviewId,z=m&&v.includes(m)?m:b||((X=r.settings)==null?void 0:X._autoCreatedPreviewId),C=z?[z]:v.length>0?[v[0]]:[],E=C[0],I=async(pe,we,Q)=>{const me=(h==null?void 0:h.current)??d;for(const ue of C)await pO(ue,pe,we,p,Q,me)},R=r.nodeName;let A=t.data&&typeof t.data=="object"?t.data.id??t.data.task_id??null:null;if(Xd(o)&&!A&&t.code!==void 0&&t.code!==0){const pe=String(t.msg??"Grsai API 请求失败");f(we=>we.map(Q=>Q.id===n?{...Q,status:"failed",progress:0,errorMsg:pe}:Q)),p(r.id,{isGenerating:!1,errorMsg:pe});return}if(!A&&c&&wc(o)){const pe=(t==null?void 0:t.name)??((T=t==null?void 0:t.data)==null?void 0:T.name)??((q=t==null?void 0:t.operation)==null?void 0:q.name)??((J=(H=t==null?void 0:t.data)==null?void 0:H.operation)==null?void 0:J.name)??null;typeof pe=="string"&&pe&&(A=String(pe),console.log("[Gemini Veo Official] 提取 operation.name:",A))}if(c&&String(o).startsWith("sora")){const pe=t.data&&typeof t.data=="object"?t.data:null,we=(pe==null?void 0:pe.task_id)??t.task_id??(pe==null?void 0:pe.id)??t.id;we&&(A=String(we))}if(!A&&t.base_resp&&typeof t.base_resp=="object"){const pe=t.base_resp;if(console.log("[Hailuo] 检查 base_resp:",pe),pe.status_code===0&&t.task_id)A=t.task_id,console.log("[Hailuo] 从 base_resp 提取 task_id:",A);else if(pe.status_code!==0){const we=pe.status_msg||"请求失败";console.error("[Hailuo] 请求失败:",we,pe),p(r.id,{isGenerating:!1,errorMsg:String(we)}),f(Q=>Q.map(me=>me.id===n?{...me,status:"failed",progress:0,errorMsg:String(we)}:me));return}}if(!A&&au(o)){if(console.log("[Wan 2.6] 提取任务ID,响应数据:",JSON.stringify(t).substring(0,500)),console.log("[Wan 2.6] 响应数据键:",Object.keys(t)),t.task_id)A=t.task_id,console.log("[Wan 2.6] ✓ 从根级别提取 task_id:",A);else if(t.output&&typeof t.output=="object"){const pe=t.output;if(console.log("[Wan 2.6] 检查 output:",pe),pe.task_id&&(A=pe.task_id,console.log("[Wan 2.6] ✓ 从 output 提取 task_id:",A)),pe.task_status==="FAILED"){const we=pe.code||"Unknown",Q=pe.message||"创建任务失败";console.error("[Wan 2.6] ✗ 创建任务失败:",we,Q),p(r.id,{isGenerating:!1,errorMsg:`${we}: ${Q}`}),f(me=>me.map(ue=>ue.id===n?{...ue,status:"failed",progress:0,errorMsg:`${we}: ${Q}`}:ue));return}}if(t.status==="FAILED"||t.status==="ERROR"){const pe=String(t.fail_reason||"创建任务失败");console.error("[Wan 2.6] ✗ 创建任务失败:",pe),p(r.id,{isGenerating:!1,errorMsg:pe}),f(we=>we.map(Q=>Q.id===n?{...Q,status:"failed",progress:0,errorMsg:pe}:Q));return}A||console.error("[Wan 2.6] ✗ 未能提取任务ID,响应:",t)}const F=(o.includes("grok-4.1-image")||o.includes("grok-4.2-image"))&&t.choices&&Array.isArray(t.choices)&&t.choices.length>0;if(A=A||(F?null:t.id)||t.task_id||(t.data&&typeof t.data=="object"?t.data.task_id:null)||(typeof t.data=="string"&&t.data.length>10?t.data:null)||(l&&(t.code===1||t.code===22)?t.result:null),A){f(U=>U.map(G=>G.id===n?{...G,status:"generating",progress:0,remoteTaskId:A}:G));const pe=((Z=r.settings)==null?void 0:Z.mjMode)||"fast",we=Math.ceil(1600/.8),Q=Date.now(),me=U=>!c&&!l?U<20?800:U<50?1500:3e3:U<15?2e3:U<45?3e3:5e3,ue=async(U=0,G=-1)=>{var ne,le,fe,be,de,$e,ze,_e,Ee,Ce;const ge=xe=>String(xe||"").replace(/^\/+/,"").split("/").map(Ne=>encodeURIComponent(Ne)).join("/");if(hO.has(String(n))){const xe="已取消轮询(任务可能仍在后台执行)";f(Ne=>Ne.map(ve=>ve.id===n?{...ve,status:"failed",progress:0,errorMsg:xe}:ve)),p(r.id,{isGenerating:!1,errorMsg:xe});return}if(Date.now()-Q>OX){const xe="生成超时(20分钟)";f(Ne=>Ne.map(ve=>ve.id===n?{...ve,status:"failed",progress:0,errorMsg:xe}:ve)),p(r.id,{isGenerating:!1,errorMsg:xe});return}if(U>we){f(xe=>xe.map(Ne=>Ne.id===n?{...Ne,status:"failed",progress:0,errorMsg:"生成超时(1600秒)"}:Ne)),p(r.id,{isGenerating:!1,errorMsg:"生成超时(1600秒)"});return}try{U>0&&await new Promise(Te=>setTimeout(Te,me(U-1)));let xe;if(l)xe=`${i}/${pe}/mj/task/${A}/fetch`;else if(c)if(r.type==="motion-control")xe=`${i}/kling/v1/videos/motion-control/${encodeURIComponent(A)}`;else if(No(o))xe=`${i}/kling/v1/videos/omni-video/${encodeURIComponent(A)}`;else if(fu(o))xe=`${i}/kling/v1/videos/text2video/${encodeURIComponent(A)}`;else if(zc(o))xe=`${i}/kling/v1/videos/text2video/${encodeURIComponent(A)}`;else if(Wo(o))xe=`${i}/kling/v1/videos/text2video/${encodeURIComponent(A)}`;else if(wc(o))xe=`${i.replace(/\/+$/,"")}/v1beta/${ge(String(A))}`;else if(dl(o)||hl(o))xe=`${i}/v2/videos/generations/${encodeURIComponent(A)}`;else if(pl(o))xe=`${i}${$x(o)}/${encodeURIComponent(A)}`;else if(au(o))Sx(o)?xe=`${i}/api/v1/tasks/${encodeURIComponent(A)}`:xe=`${i}/v2/videos/generations/${encodeURIComponent(A)}`;else if(Qd(o))xe=`${i}/minimax/v1/query/video_generation?task_id=${encodeURIComponent(A)}`;else if(ru(o))xe=`${i}/vidu/v2/tasks/${encodeURIComponent(A)}/creations`;else if(gm(o)){const Te=((ne=r.settings)==null?void 0:ne.mjMode)||"fast";xe=`${i}/${Te}/mj/task/${encodeURIComponent(A)}/fetch`}else Tp(o)?xe=`${i}/v1/tasks/${encodeURIComponent(A)}`:o.startsWith("sora")?i.includes("api.openai.com")?xe=`${i}/videos/${encodeURIComponent(A)}`:xe=`${i}/v2/videos/generations/${encodeURIComponent(A)}`:xe=`${i}/v1/videos/${encodeURIComponent(A)}`;else Xd(o)?xe=`${i.replace(/\/+$/,"")}/v1/draw/result`:o.includes("grok-4.1-image")||o.includes("grok-4.2-image")?xe=`${i}/v1/tasks/${encodeURIComponent(A)}`:Nv(o)?xe=`${i}/api/v1/tasks/${encodeURIComponent(A)}`:xe=`${i}/v1/images/tasks/${A}`;const Ne={};if(wc(o)||e0(o))Ne["x-goog-api-key"]=a;else{const Te="Bearer";Ne.Authorization=`${Te} ${a}`}let ve;Xd(o)?(Ne["Content-Type"]="application/json",ve=await Pl(xe,{method:"POST",headers:Ne,body:JSON.stringify({id:A})})):ve=await Pl(xe,{headers:Ne});const ke=await ve.json();if(!ve.ok&&ru(o)&&c){console.warn("[Vidu] 轮询请求超时或临时错误,继续轮询:",(ke==null?void 0:ke.error)||ve.status);const Te=Math.min(10+U*2,90);f(Be=>Be.map(He=>He.id===n?{...He,progress:Te}:He)),p(r.id,{settings:{...r.settings,progress:Te}}),setTimeout(()=>ue(U+1,Te),me(U));return}if(wc(o)&&c){if(!!!(ke!=null&&ke.done)){const Je=Math.min(10+U*2,90);Je!==G&&(f(Me=>Me.map(Re=>Re.id===n?{...Re,progress:Je}:Re)),p(r.id,{settings:{...r.settings,progress:Je}})),setTimeout(()=>ue(U+1,Je),me(U));return}if(ke!=null&&ke.error){const Je=typeof ke.error=="string"?ke.error:JSON.stringify(ke.error);f(Me=>Me.map(Re=>Re.id===n?{...Re,status:"failed",progress:0,errorMsg:Je}:Re)),p(r.id,{isGenerating:!1,errorMsg:Je});return}const He=(Je=>{var Ze,je,Le,Xe,qe,tt,Ye,ct,pt;const Me=(qe=(Xe=(Le=(je=(Ze=Je==null?void 0:Je.response)==null?void 0:Ze.generateVideoResponse)==null?void 0:je.generatedSamples)==null?void 0:Le[0])==null?void 0:Xe.video)==null?void 0:qe.uri;if(typeof Me=="string"&&Me)return Me;const Re=(pt=(ct=(Ye=(tt=Je==null?void 0:Je.response)==null?void 0:tt.generatedVideos)==null?void 0:Ye[0])==null?void 0:ct.video)==null?void 0:pt.uri;return typeof Re=="string"&&Re?Re:deepSearchForUrl(Je)||null})(ke);if(!He){const Je="Veo 官方接口返回完成,但未找到视频下载地址";f(Me=>Me.map(Re=>Re.id===n?{...Re,status:"failed",progress:0,errorMsg:Je}:Re)),p(r.id,{isGenerating:!1,errorMsg:Je});return}try{const Je=await Pl(He,{headers:{"x-goog-api-key":a}});if(!Je.ok){const Ze=await Je.text();throw new Error(`下载视频失败: HTTP ${Je.status}: ${Ze}`)}const Me=await Je.blob(),Re=`${n}_video`;await Xr.saveBlobAsset(Re,Me,He);const Ve=await Xr.getAssetUrl(Re);if(!Ve)throw new Error("保存视频到本地缓存失败(无法获取 blob URL)");f(Ze=>Ze.map(je=>{if(je.id!==n)return je;const Le=je.startTime?Date.now()-je.startTime:void 0;return{...je,status:"completed",progress:100,url:Ve,_assetId:Re,durationMs:Le}})),p(r.id,{isGenerating:!1,content:Ve,settings:{...r.settings,isGenerating:!1,progress:100,error:null}}),await I(Ve,"video",{sourceNodeName:R,previewSourceModel:o});return}catch(Je){const Me=(Je==null?void 0:Je.message)||String(Je);f(Re=>Re.map(Ve=>Ve.id===n?{...Ve,status:"failed",progress:0,errorMsg:Me}:Ve)),p(r.id,{isGenerating:!1,errorMsg:Me});return}}if((fu(o)||zc(o)||Wo(o))&&c){let Te;if(ke.task_status)Te=ke;else if(ke.data&&typeof ke.data=="object"){const Me=ke.data;Me.task_status?Te=Me:Me.data&&typeof Me.data=="object"&&(Te=Me.data)}if(!Te){const Me=Math.min(10+U*2,90);f(Re=>Re.map(Ve=>Ve.id===n?{...Ve,progress:Me}:Ve)),p(r.id,{settings:{...r.settings,progress:Me}}),setTimeout(()=>ue(U+1,G),me(U));return}const Be=String(Te.task_status||"").toLowerCase(),He=Te.task_result,Je=He==null?void 0:He.videos;if(console.log("[Kling] 解析结果:",{taskStatus:Be,hasVideos:!!Je,videosCount:(Je==null?void 0:Je.length)||0}),Be==="succeed"||Be==="success")if(Je&&Je.length>0&&Je[0].url){const Me=Je[0].url,Re=zc(o),Ve=Wo(o);console.log(Ve?"[Kling v3]":Re?"[Kling v2.6]":"[Kling v2.5 Turbo]","视频生成完成:",Me);const Ze=Ve?`kling_v3_video_${n}.mp4`:Re?`kling_v26_video_${n}.mp4`:`kling_v25_turbo_video_${n}.mp4`;ia(Me,n,Ze).catch(je=>{console.error(Ve?"[Kling v3]":Re?"[Kling v2.6]":"[Kling v2.5 Turbo]","下载视频失败:",je)}),f(je=>je.map(Le=>{if(Le.id===n){const Xe=Le.startTime?Date.now()-Le.startTime:void 0;return{...Le,status:"completed",progress:100,url:Me,durationMs:Xe}}return Le})),p(r.id,{isGenerating:!1,content:Me,settings:{...r.settings,isGenerating:!1,progress:100,error:null}}),await I(Me,"video",{sourceNodeName:R,previewSourceModel:o});return}else{const Me="未返回视频 URL";console.error("[Kling v2.5 Turbo] 错误:",Me),f(Re=>Re.map(Ve=>Ve.id===n?{...Ve,status:"failed",progress:0,errorMsg:Me}:Ve)),p(r.id,{isGenerating:!1,errorMsg:Me});return}else if(Be==="failed"||Be==="failure"||Be==="error"){const Me=String(Te.task_status_msg||"任务失败");console.error("[Kling v2.5 Turbo] 任务失败:",Me),f(Re=>Re.map(Ve=>Ve.id===n?{...Ve,status:"failed",progress:0,errorMsg:Me}:Ve)),p(r.id,{isGenerating:!1,errorMsg:Me});return}else if(Be==="processing"||Be==="submitted"){const Me=Math.min(10+U*2,90);f(Re=>Re.map(Ve=>Ve.id===n?{...Ve,progress:Me}:Ve)),p(r.id,{settings:{...r.settings,progress:Me}}),setTimeout(()=>ue(U+1,Me),me(U));return}else{const Me=Math.min(10+U*2,90);f(Re=>Re.map(Ve=>Ve.id===n?{...Ve,progress:Me}:Ve)),p(r.id,{settings:{...r.settings,progress:Me}}),setTimeout(()=>ue(U+1,Me),me(U));return}}if(Tp(o)&&c){const Te=(ke.status||ke.state||ke.task_status||"").toLowerCase(),Be=$2(ke,U);if(Te==="completed"||Te==="success"||Te==="finished"||Te==="done"){let He=ke.video_url||ke.url||ke.output;if(!He&&ke.data&&(He=ke.data.url||ke.data.video_url||ke.data.output),!He&&ke.result&&(He=ke.result.url||ke.result.video_url||ke.result.output),Array.isArray(He)&&(He=He[0]),He){ia(He,n,`jimeng_video_${n}.mp4`).catch(Je=>{console.error("[Jimeng Video] 下载视频失败:",Je)}),f(Je=>Je.map(Me=>{if(Me.id===n){const Re=Me.startTime?Date.now()-Me.startTime:void 0;return{...Me,status:"completed",progress:100,url:He,durationMs:Re}}return Me})),p(r.id,{isGenerating:!1,content:He,settings:{...r.settings,isGenerating:!1,progress:100,error:null}}),await I(He,"video",{sourceNodeName:R,previewSourceModel:o});return}else{const Je="未返回视频 URL";console.error("[Jimeng Video] 错误:",Je,ke),f(Me=>Me.map(Re=>Re.id===n?{...Re,status:"failed",progress:0,errorMsg:Je}:Re)),p(r.id,{isGenerating:!1,errorMsg:Je});return}}else if(Te==="failed"||Te==="error"||Te==="failure"){const He=ke.error||ke.message||ke.error_message||"生成失败";console.error("[Jimeng Video] 生成失败:",He,ke),f(Je=>Je.map(Me=>Me.id===n?{...Me,status:"failed",progress:0,errorMsg:He}:Me)),p(r.id,{isGenerating:!1,errorMsg:He,settings:{...r.settings,isGenerating:!1,progress:0,error:He}});return}else{console.log("[Jimeng Video] 任务进行中, 状态:",Te,"进度:",Be),(Math.abs(Be-G)>=10||Be===0||Be===100)&&(f(Je=>Je.map(Me=>Me.id===n?{...Me,status:"generating",progress:Be}:Me)),p(r.id,{settings:{...r.settings,progress:Be}})),setTimeout(()=>ue(U+1,Be),me(U));return}}if(au(o)&&c){const Te=Sx(o);let Be,He=null,Je=null,Me=0;if(Te){const Re=ke.output||{};Be=(Re.task_status||"").toUpperCase(),He=Re.video_url||null,Je=Re.message||Re.code||null,console.log("[Wan 2.6 Official] 状态:",Be,"videoUrl:",He==null?void 0:He.substring(0,50))}else{if(Be=(ke.status||"").toUpperCase(),He=((le=ke.data)==null?void 0:le.output)||null,Je=ke.fail_reason||null,ke.progress){const Re=String(ke.progress).replace("%","");Me=parseInt(Re,10)||0}console.log("[Wan 2.6 Proxy] 状态:",Be,"进度:",Me,"videoUrl:",He==null?void 0:He.substring(0,50))}if(Be||(console.warn("[Wan 2.6] 状态为空,尝试从其他字段获取"),Be=(ke.task_status||ke.state||"").toUpperCase(),He||(He=ke.video_url||ke.url||null),console.log("[Wan 2.6] fallback 状态:",Be,"videoUrl:",He==null?void 0:He.substring(0,50))),Be==="SUCCESS"||Be==="SUCCEEDED")if(He){console.log("[Wan 2.6] 视频生成完成:",He),ia(He,n,`wan26_video_${n}.mp4`).catch(Re=>{console.error("[Wan 2.6] 下载视频失败:",Re)}),f(Re=>Re.map(Ve=>{if(Ve.id===n){const Ze=Ve.startTime?Date.now()-Ve.startTime:void 0;return{...Ve,status:"completed",progress:100,url:He,durationMs:Ze}}return Ve})),p(r.id,{isGenerating:!1,content:He,settings:{...r.settings,isGenerating:!1,progress:100,error:null}}),await I(He,"video",{sourceNodeName:R,previewSourceModel:o});return}else{const Re="未返回视频 URL";console.error("[Wan 2.6] 错误:",Re,ke),f(Ve=>Ve.map(Ze=>Ze.id===n?{...Ze,status:"failed",progress:0,errorMsg:Re}:Ze)),p(r.id,{isGenerating:!1,errorMsg:Re});return}else if(Be==="FAILED"||Be==="FAILURE"||Be==="ERROR"){const Re=Je||"生成失败";console.error("[Wan 2.6] 生成失败:",Re,ke),f(Ve=>Ve.map(Ze=>Ze.id===n?{...Ze,status:"failed",progress:0,errorMsg:Re}:Ze)),p(r.id,{isGenerating:!1,errorMsg:Re,settings:{...r.settings,isGenerating:!1,progress:0,error:Re}});return}else if(Be==="UNKNOWN"){const Re="任务已过期或不存在";console.error("[Wan 2.6] 任务查询失败:",Re),f(Ve=>Ve.map(Ze=>Ze.id===n?{...Ze,status:"failed",progress:0,errorMsg:Re}:Ze)),p(r.id,{isGenerating:!1,errorMsg:Re,settings:{...r.settings,isGenerating:!1,progress:0,error:Re}});return}else{const Re=Me||(Be==="RUNNING"?50:10);console.log("[Wan 2.6] 任务进行中, 状态:",Be,"进度:",Re),f(Ve=>Ve.map(Ze=>Ze.id===n?{...Ze,progress:Re}:Ze)),p(r.id,{settings:{...r.settings,progress:Re}}),setTimeout(()=>ue(U+1,Re),me(U));return}}if(ru(o)&&c){const Te=ke.data&&typeof ke.data=="object"?ke.data:ke,Be=String(Te.state??ke.state??"").toLowerCase();if(Be==="success"){const Je=Te.creations??ke.creations,Me=Je==null?void 0:Je[0],Re=Me==null?void 0:Me.video;let Ve=(Me==null?void 0:Me.url)??(Me==null?void 0:Me.download_url)??(Me==null?void 0:Me.video_url)??(Re==null?void 0:Re.url)??(Re==null?void 0:Re.download_url)??(Me==null?void 0:Me.output_url)??(Me==null?void 0:Me.play_url);if(!Ve&&Me&&typeof Me=="object"){for(const je of Object.values(Me))if(typeof je=="string"&&je.startsWith("http")&&(je.includes(".mp4")||/\/video[\/?]/.test(je)||je.includes("prod-ss-vidu")||je.includes("s3")&&je.includes("amazonaws"))){Ve=je;break}}if(Ve){console.log("[Vidu] 视频生成完成:",Ve);const je=Dw(n,Ve);ia(Ve,je,`vidu_${n}.mp4`).catch(Le=>{console.error("[Vidu] 下载视频失败:",Le)}),uo({url:Ve,type:"video"},n),f(Le=>Le.map(Xe=>{if(Xe.id===n){const qe=Xe.startTime?Date.now()-Xe.startTime:void 0;return{...Xe,status:"completed",progress:100,url:Ve,_assetId:je,durationMs:qe}}return Xe})),p(r.id,{isGenerating:!1,content:Ve,settings:{...r.settings,isGenerating:!1,progress:100,error:null}}),await I(Ve,"video",{sourceNodeName:R,previewSourceModel:o});return}const Ze="未返回视频 URL";f(je=>je.map(Le=>Le.id===n?{...Le,status:"failed",progress:0,errorMsg:Ze}:Le)),p(r.id,{isGenerating:!1,errorMsg:Ze});return}if(Be==="failed"){const Je=String(Te.err_code??ke.err_code??"任务失败");f(Me=>Me.map(Re=>Re.id===n?{...Re,status:"failed",progress:0,errorMsg:Je}:Re)),p(r.id,{isGenerating:!1,errorMsg:Je,settings:{...r.settings,isGenerating:!1,progress:0,error:Je}});return}const He=Math.min(10+U*2,90);f(Je=>Je.map(Me=>Me.id===n?{...Me,progress:He}:Me)),p(r.id,{settings:{...r.settings,progress:He}}),setTimeout(()=>ue(U+1,He),me(U));return}if(pl(o)&&c){const Te=F5(ke);if(Te.terminal==="success"&&Te.videoUrl){const He=Te.videoUrl;console.log("[Seedance] 视频生成完成:",He.substring(0,100)),await ia(He,n,`seedance_${n}.mp4`);let Je=He;try{const Me=await Xr.getAssetUrl(n);Me&&(Je=Me)}catch{}uo({url:He,type:"video"},n),f(Me=>Me.map(Re=>{if(Re.id===n){const Ve=Re.startTime?Date.now()-Re.startTime:void 0;return{...Re,status:"completed",progress:100,url:Je,_assetId:n,durationMs:Ve}}return Re})),p(r.id,{isGenerating:!1,content:Je,settings:{...r.settings,isGenerating:!1,progress:100,error:null}}),await I(Je,"video",{sourceNodeName:R,previewSourceModel:o});return}if(Te.terminal==="failed"){const He=String(Te.errorMsg||"生成失败");f(Je=>Je.map(Me=>Me.id===n?{...Me,status:"failed",progress:0,errorMsg:He}:Me)),p(r.id,{isGenerating:!1,errorMsg:He,settings:{...r.settings,isGenerating:!1,progress:0,error:He}});return}const Be=Math.min(10+U*2,90);f(He=>He.map(Je=>Je.id===n?{...Je,progress:Be}:Je)),p(r.id,{settings:{...r.settings,progress:Be}}),setTimeout(()=>ue(U+1,Be),me(U));return}if(Qd(o)&&c){if(((fe=ke.base_resp)==null?void 0:fe.status_code)!==0){const He=((be=ke.base_resp)==null?void 0:be.status_msg)||"Hailuo query failed";console.error("[Hailuo] 查询失败:",He,ke),f(Je=>Je.map(Me=>Me.id===n?{...Me,status:"failed",progress:0,errorMsg:He}:Me)),p(r.id,{isGenerating:!1,errorMsg:He});return}const Te=(ke.status||"").toLowerCase(),Be=$2(ke,U);if(console.log("[Hailuo] 状态:",Te,"进度:",Be),Te==="success"){const He=ke.file_id;if(!He){const Ze="未返回file_id";console.error("[Hailuo] 错误:",Ze,ke),f(je=>je.map(Le=>Le.id===n?{...Le,status:"failed",progress:0,errorMsg:Ze}:Le)),p(r.id,{isGenerating:!1,errorMsg:Ze});return}console.log("[Hailuo] 获取视频链接, file_id:",He);const Je=`${i}/minimax/v1/files/retrieve?file_id=${encodeURIComponent(He)}`,Me=await fetch(Je,{headers:{Authorization:`Bearer ${a}`}});if(!Me.ok){const Ze=`获取下载链接失败: HTTP ${Me.status}`;console.error("[Hailuo] 错误:",Ze),f(je=>je.map(Le=>Le.id===n?{...Le,status:"failed",progress:0,errorMsg:Ze}:Le)),p(r.id,{isGenerating:!1,errorMsg:Ze});return}const Re=await Me.json();if(console.log("[Hailuo] 下载响应:",Re),((de=Re.base_resp)==null?void 0:de.status_code)!==0){const Ze=(($e=Re.base_resp)==null?void 0:$e.status_msg)||"获取下载链接失败";console.error("[Hailuo] 错误:",Ze,Re),f(je=>je.map(Le=>Le.id===n?{...Le,status:"failed",progress:0,errorMsg:Ze}:Le)),p(r.id,{isGenerating:!1,errorMsg:Ze});return}const Ve=(ze=Re.file)==null?void 0:ze.download_url;if(Ve){console.log("[Hailuo] 视频生成完成:",Ve),ia(Ve,n,`hailuo_${n}.mp4`).catch(Ze=>{console.error("[Hailuo] 下载视频失败:",Ze)}),f(Ze=>Ze.map(je=>{if(je.id===n){const Le=je.startTime?Date.now()-je.startTime:void 0;return{...je,status:"completed",progress:100,url:Ve,durationMs:Le}}return je})),p(r.id,{isGenerating:!1,content:Ve,settings:{...r.settings,isGenerating:!1,progress:100,error:null}}),await I(Ve,"video",{sourceNodeName:R,previewSourceModel:o});return}else{const Ze="未返回download_url";console.error("[Hailuo] 错误:",Ze,Re),f(je=>je.map(Le=>Le.id===n?{...Le,status:"failed",progress:0,errorMsg:Ze}:Le)),p(r.id,{isGenerating:!1,errorMsg:Ze});return}}else if(Te==="failed"){const He=ke.error||((_e=ke.base_resp)==null?void 0:_e.status_msg)||"生成失败";console.error("[Hailuo] 生成失败:",He,ke),f(Je=>Je.map(Me=>Me.id===n?{...Me,status:"failed",progress:0,errorMsg:He}:Me)),p(r.id,{isGenerating:!1,errorMsg:He,settings:{...r.settings,isGenerating:!1,progress:0,error:He}});return}else{console.log("[Hailuo] 任务进行中, 状态:",Te,"进度:",Be),(Math.abs(Be-G)>=10||Be===0||Be===100)&&(f(Je=>Je.map(Me=>Me.id===n?{...Me,status:"generating",progress:Be}:Me)),p(r.id,{settings:{...r.settings,progress:Be}})),setTimeout(()=>ue(U+1,Be),me(U));return}}if(Xd(o)){const Te=ke.code;if(Te!==void 0&&Te!==0){const Me=String(ke.msg??(Te===-22?"任务不存在或已过期":"Grsai 轮询失败"));f(Re=>Re.map(Ve=>Ve.id===n?{...Ve,status:"failed",progress:0,errorMsg:Me}:Ve)),p(r.id,{isGenerating:!1,errorMsg:Me});return}const Be=ke.data,He=(Be==null?void 0:Be.status)||"";if(He==="succeeded"){const Me=Be==null?void 0:Be.results,Re=(Ee=Me==null?void 0:Me[0])==null?void 0:Ee.url;if(Re){ia(Re,n,`grsai_${n}.png`).catch(()=>{}),f(Ve=>Ve.map(Ze=>Ze.id===n?{...Ze,status:"completed",progress:100,url:Re,durationMs:Ze.startTime?Date.now()-Ze.startTime:void 0}:Ze)),p(r.id,{isGenerating:!1,content:Re,settings:{...r.settings,isGenerating:!1,progress:100,error:null}}),await I(Re,"image",{sourceNodeName:R,previewSourceModel:o});return}}else if(He==="failed"){const Me=(Be==null?void 0:Be.error)||(Be==null?void 0:Be.failure_reason)||"Grsai 生成失败";f(Re=>Re.map(Ve=>Ve.id===n?{...Ve,status:"failed",progress:0,errorMsg:Me}:Ve)),p(r.id,{isGenerating:!1,errorMsg:Me});return}const Je=(Be==null?void 0:Be.progress)??Math.min(10+U*2,90);f(Me=>Me.map(Re=>Re.id===n?{...Re,progress:Je}:Re)),p(r.id,{settings:{...r.settings,progress:Je}}),setTimeout(()=>ue(U+1,Je),me(U));return}const Ie=L5(ke),Pe=$2(ke,U);if(Ie==="COMPLETED"||Ie==="SUCCESS"||Ie==="SUCCEEDED"||Ie==="FINISHED"||Ie==="DONE"){const Te=Wx(ke,c,l);if(console.log("[Polling] Task completed, resultUrls:",Te,"length:",Te.length,"isMidjourney:",l,"isVideoGeneration:",c,"currentModel:",o),Te.length>0){const Be=Te[0],He=Tp(o)&&c,Je=wH(o)&&!c,Me=He&&Iw(Be),Re=Me&&Ea(Be)||Be,Ve=Me?Te.map(Ze=>Ea(Ze)||Ze):Te;if(l&&Te.length===1&&!c)console.log("[MJ Polling] 开始处理 MJ 图片,previewId:",E),ia(Be,n,`mj_${n}.png`).catch(Ze=>{console.error("[MJ] 下载图片失败:",Ze)}),uo({url:Be,type:"image"},n).catch(()=>{}),f(Ze=>Ze.map(je=>{if(je.id===n){const Le=je.startTime?Date.now()-je.startTime:void 0;return{...je,status:"completed",progress:100,url:Be,mjOriginalUrl:Be,mjNeedsSplit:!0,durationMs:Le}}return je})),p(r.id,{isGenerating:!1,content:Be,settings:{...r.settings,isGenerating:!1,progress:100,error:null}}),console.log("[MJ Polling] 发送到预览窗口,previewId:",E),E?await I(Be,"image",{sourceNodeName:R,previewSourceModel:o}):console.warn("[MJ Polling] ⚠️ 预览节点ID为空,无法发送到预览窗口"),(async()=>{try{let Ze=Be,je=!1;if(typeof window<"u"&&("__TAURI__"in window||"__TAURI_INTERNALS__"in window)&&(Be.startsWith("http://")||Be.startsWith("https://")))try{const{downloadWithFallback:Le}=await mn(async()=>{const{downloadWithFallback:qe}=await Promise.resolve().then(()=>n0);return{downloadWithFallback:qe}},void 0,import.meta.url),Xe=await Le(Be,6e4);Ze=URL.createObjectURL(Xe),je=!0}catch(Le){console.warn("[MJ Polling] Tauri 下载原图失败,使用原 URL 裁切:",Le)}try{const Xe=(await xm(Ze)).map(tt=>tt.url),qe=await Promise.all(Xe.map(async(tt,Ye)=>{try{if(!tt||!tt.startsWith("blob:"))return console.warn("[MJ] ⚠️ Invalid blob URL:",tt),tt;const ct=await fetch(tt);if(!ct.ok)return console.error("[MJ] ❌ Fetch failed:",ct.status),tt;const pt=await ct.blob(),ht=`mj_${n}_split_${Ye}`;try{const{assetStore:$t}=await mn(async()=>{const{assetStore:Nt}=await Promise.resolve().then(()=>_s);return{assetStore:Nt}},void 0,import.meta.url);if(await $t.init(),await $t.saveBlobAsset(ht,pt,tt)){console.log("[MJ] ✅ Blob saved to assetStore:",ht);const Nt=await $t.getAssetUrl(ht);if(Nt)return console.log("[MJ] ✅ Got persistent URL from assetStore:",Nt.substring(0,50)),Nt}else console.warn("[MJ] ⚠️ Failed to save blob to assetStore, will use blob URL")}catch($t){console.error(`[MJ] ❌ assetStore error for split ${Ye}:`,$t)}const wt=URL.createObjectURL(pt);return console.warn("[MJ] ⚠️ Using temporary blob URL (not persistent):",wt.substring(0,50)),wt}catch(ct){return console.error("[MJ] ❌ Failed to create history blob:",ct),tt}}));Xe.forEach((tt,Ye)=>{const ct=`${n}_split_${Ye}`,pt=`mj_${n}_split_${Ye+1}.png`;ia(tt,ct,pt).catch(ht=>{console.error(`[MJ] ❌ 保存切片 ${Ye+1} 到本地文件失败:`,ht)})}),f(tt=>tt.map(Ye=>Ye.id===n?{...Ye,url:qe[0],mjImages:qe,selectedMjImageIndex:0,mjNeedsSplit:!1,_mjAssetIds:qe.map((ct,pt)=>`mj_${n}_split_${pt}`)}:Ye)),setTimeout(()=>{try{f(tt=>(mn(async()=>{const{STORAGE_KEYS:Ye}=await Promise.resolve().then(()=>PZ);return{STORAGE_KEYS:Ye}},void 0,import.meta.url).then(({STORAGE_KEYS:Ye})=>{localStorage.setItem(Ye.HISTORY,JSON.stringify(tt)),console.log("[MJ] ✅ History saved to localStorage immediately")}).catch(()=>{}),tt))}catch(tt){console.error("[MJ] ❌ Failed to save history to localStorage:",tt)}},100),p(r.id,{settings:{...r.settings,mjImages:Xe,selectedMjImageIndex:0}}),await I(Xe[0],"image",{previewMjImages:Xe,selectedPreviewImage:Xe[0],sourceNodeName:R,previewSourceModel:o})}finally{je&&Ze.startsWith("blob:")&&URL.revokeObjectURL(Ze)}}catch(Ze){console.error("[MJ] ❌ 裁切失败:",Ze),console.error("[MJ] ❌ 错误详情:",Ze instanceof Error?Ze.message:String(Ze)),console.error("[MJ] ❌ 错误堆栈:",Ze instanceof Error?Ze.stack:"No stack"),console.warn("[MJ] ⚠️ 裁切失败,保持显示原图"),f(je=>je.map(Le=>Le.id===n?{...Le,mjSplitError:Ze.message}:Le)),p(r.id,{settings:{...r.settings,mjSplitError:Ze.message}})}})();else{ia(Be,n).catch(Xe=>{console.error("[Generation] 下载失败:",Xe)}),Te.length>1&&Te.slice(1).forEach((Xe,qe)=>{ia(Xe,`${n}_${qe+1}`).catch(tt=>{console.error(`[Generation] 下载第${qe+2}张失败:`,tt)})});let Ze=Ve,je=Re;!c&&Ve.length>0&&(Ze=Ve,je=Re),f(Xe=>Xe.map(qe=>{if(qe.id===n){const tt=qe.startTime?Date.now()-qe.startTime:void 0,Ye=ke,ct=c&&String(o).startsWith("sora")?Ye.task_id??(Ye.data&&typeof Ye.data=="object"?Ye.data.task_id:null):null;return{...qe,status:"completed",progress:100,url:je,mjImages:Te.length>1?Ze:void 0,selectedMjImageIndex:0,durationMs:tt,_assetId:n,_mjAssetIds:Te.length>1?Te.map((pt,ht)=>ht===0?n:`${n}_${ht}`):void 0,...ct?{characterSourceTaskId:String(ct),remoteTaskId:String(ct)}:{}}}return qe})),hC(n,Be,f);const Le=Ze.map((Xe,qe)=>({id:`${n}_${qe}`,thumbUrl:Xe,fullUrl:Xe,createdAt:Date.now()}));if(p(r.id,{isGenerating:!1,content:je,settings:{...r.settings,isGenerating:!1,progress:100,error:null,generatedImages:Le}}),g!==void 0&&y!==void 0){if(g[y]=je,r.type!=="storyboard-chart-node"){const Xe=g.filter(qe=>qe&&qe.length>0);await new Promise(qe=>setTimeout(qe,100)),await I(je,"image",{previewMjImages:Xe.length>0?Xe:void 0,selectedPreviewImage:je,sourceNodeName:R,previewSourceModel:o})}}else{const Xe=gm(o),qe=Te.length>1?Xe&&c?{previewMjVideos:Ze,selectedPreviewVideo:je}:{previewMjImages:Ze,selectedPreviewImage:je}:void 0;await I(je,c?"video":"image",{...qe,sourceNodeName:R,previewSourceModel:o})}}}}else if(Ie==="FAILED"||Ie==="ERROR"||Ie==="FAILURE"||Ie==="CANCELLED"){const Te=B5(ke,Ie);console.error("[Generation] ❌ 任务失败:",{status:Ie,errorMsg:Te,model:o,isVideoGeneration:c,isMidjourney:l,pollData:JSON.stringify(ke).substring(0,500)}),dl(o)&&console.error("[Veo] ❌ Veo 生成失败,详细信息:",{model:o,status:Ie,errorMsg:Te,data:ke.data,message:ke.message,error:ke.error,failReason:ke.failReason||ke.fail_reason}),f(He=>He.map(Je=>Je.id===n?{...Je,status:"failed",progress:0,errorMsg:Te}:Je)),p(r.id,{isGenerating:!1,errorMsg:Te,settings:{...r.settings,isGenerating:!1,progress:0,error:Te}});const Be=(Ce=r.settings)==null?void 0:Ce._autoCreatedPreviewId;if(Be)try{window.dispatchEvent(new CustomEvent("previewGenerateFailed",{detail:{previewNodeId:Be}}))}catch{}}else(Math.abs(Pe-G)>=10||Pe===0||Pe===100)&&(f(Be=>Be.map(He=>He.id===n?{...He,progress:Pe}:He)),p(r.id,{settings:{...r.settings,progress:Pe}})),setTimeout(()=>ue(U+1,Pe),me(U))}catch{setTimeout(()=>ue(U+1,G),me(U))}};ue()}else if(o.includes("grok-4.1-image")||o.includes("grok-4.2-image")){console.log("[Grok Image] 处理同步响应:",JSON.stringify(t).substring(0,500));let pe=[];if(t.data&&Array.isArray(t.data)&&t.data.length>0&&(pe=t.data.map(Q=>Q.url).filter(Q=>!!Q)),pe.length===0){const we=t.choices;if(we&&we.length>0&&we[0].message){const Q=we[0].message,me=Q.content;if(typeof me=="string"){const ue=me.trim();if(ue.startsWith("http://")||ue.startsWith("https://")||ue.startsWith("data:"))pe=[ue];else if(ue){const U=ue.match(/!\[[^\]]*\]\s*\(\s*(https?:\/\/[^)\s]+|data:[^)\s]+)\s*\)/);U&&(pe=[U[1]])}}else if(Array.isArray(me))for(const ue of me)ue&&typeof ue=="object"&&(ue.type==="image_url"&&((B=ue.image_url)!=null&&B.url)?pe.push(ue.image_url.url):ue.type==="image"&&ue.image&&pe.push(ue.image));if(pe.length===0&&Q.reasoning_content){const ue=Q.reasoning_content,U=[],G=/!\[[^\]]*\]\s*\(\s*(https?:\/\/[^)\s]+|data:[^)\s]+)\s*\)/g;let te=G.exec(ue);for(;te;)U.push(te[1]),te=G.exec(ue);if(U.length===0){const ge=/\]\s*\(\s*(https?:\/\/[^)\s]+|data:[^)\s]+)\s*\)/g;for(te=ge.exec(ue);te;)U.push(te[1]),te=ge.exec(ue)}if(U.length===0){const ge=/(https?:\/\/[^\s\]\)"']+|data:[^\s\]\)"']+)/g;for(te=ge.exec(ue);te;)U.push(te[1]),te=ge.exec(ue)}U.length>0&&(pe=U,console.log("[Grok Image] 从 reasoning_content 提取到图片 URL 数:",pe.length))}}}if(pe.length===0){let we=function(ue){if(ue){if(typeof ue=="string"){const U=ue.trim();if((U.startsWith("http://")||U.startsWith("https://")||U.startsWith("data:image"))&&U.length>50){me.has(U)||(me.add(U),Q.push(U));return}const G=ue,te=G.match(/!\[[^\]]*\]\s*\(\s*(https?:\/\/[^)\s]+|data:[^)\s]+)\s*\)/g);te&&te.forEach(le=>{const fe=le.replace(/!\[[^\]]*\]\s*\(\s*|\s*\)$/g,"");fe&&!me.has(fe)&&(me.add(fe),Q.push(fe))});const ge=G.match(/\]\s*\(\s*(https?:\/\/[^)\s]+)\s*\)/g);ge&&ge.forEach(le=>{const fe=le.replace(/\]\s*\(\s*|\s*\)$/g,"");fe&&!me.has(fe)&&(me.add(fe),Q.push(fe))});const ne=G.match(/(https?:\/\/[^\s\]\)"'\n]+)/g);ne&&ne.forEach(le=>{(/\.(png|jpg|jpeg|webp|gif)(\?|$)/i.test(le)||/file_download|\/image\//.test(le))&&!me.has(le)&&(me.add(le),Q.push(le))});return}if(Array.isArray(ue)){ue.forEach(we);return}typeof ue=="object"&&Object.values(ue).forEach(we)}};const Q=[],me=new Set;we(t),Q.length>0&&(pe=Q,console.log("[Grok Image] 从响应深度扫描提取到图片 URL 数:",pe.length))}if(pe.length>0){const we=pe[0];if(g!==void 0&&y!==void 0&&(g[y]=we),pe.forEach((Q,me)=>{ia(Q,`${n}_${me}`).catch(()=>{})}),f(Q=>Q.map(me=>me.id===n?{...me,status:"completed",progress:100,url:we,mjImages:pe.length>1?pe:void 0,selectedMjImageIndex:0,durationMs:me.startTime?Date.now()-me.startTime:void 0}:me)),p(r.id,{isGenerating:!1,content:we,settings:{...r.settings,isGenerating:!1,progress:100,error:null,generatedImages:pe.map((Q,me)=>({id:`${n}_${me}`,thumbUrl:Q,fullUrl:Q,createdAt:Date.now()}))}}),g!==void 0&&y!==void 0){if(g[y]=we,r.type!=="storyboard-chart-node"){const Q=g.filter(me=>me&&me.length>0);await new Promise(me=>setTimeout(me,100)),await I(we,"image",{previewMjImages:Q.length>0?Q:void 0,selectedPreviewImage:we,sourceNodeName:R,previewSourceModel:o})}}else await I(we,"image",pe.length>1?{previewMjImages:pe,selectedPreviewImage:we,sourceNodeName:R,previewSourceModel:o}:{sourceNodeName:R,previewSourceModel:o});console.log("[Grok Image] ✅ 图片处理完成")}else{const we=String(((V=t.error)==null?void 0:V.message)??t.message??"未返回图片");f(Q=>Q.map(me=>me.id===n?{...me,status:"failed",progress:0,errorMsg:we}:me)),p(r.id,{isGenerating:!1,errorMsg:we,settings:{...r.settings,isGenerating:!1,progress:0,error:we}}),console.warn("[Grok Image] 未从响应中解析到图片 URL。完整 message 键:",(j=(N=t.choices)==null?void 0:N[0])!=null&&j.message?Object.keys(t.choices[0].message):"无 choices")}}else if(o.includes("z-image-turbo")||o.includes("z-image-official")){const pe=lP(o);console.log(`[Z-Image ${pe?"Official":"Proxy"}] 处理同步响应:`,JSON.stringify(t).substring(0,500));let we=[];if(pe){const Q=t.output;if(Q!=null&&Q.choices&&Array.isArray(Q.choices)&&Q.choices.length>0){const me=Q.choices[0],ue=(k=me==null?void 0:me.message)==null?void 0:k.content;ue&&Array.isArray(ue)&&(we=ue.filter(G=>G&&typeof G=="object"&&"image"in G).map(G=>G.image).filter(G=>typeof G=="string"))}console.log("[Z-Image Official] 提取的图片 URLs:",we)}else console.log("[Z-Image Turbo Proxy] 完整响应数据:",JSON.stringify(t).substring(0,500)),console.log("[Z-Image Turbo Proxy] 响应数据键:",Object.keys(t)),t.data&&Array.isArray(t.data)&&t.data.length>0?(console.log("[Z-Image Turbo Proxy] data 数组长度:",t.data.length),console.log("[Z-Image Turbo Proxy] 第一个 data 项:",JSON.stringify(t.data[0])),we=t.data.map(Q=>Q.url).filter(Boolean)):(console.warn("[Z-Image Turbo Proxy] ⚠️ 响应中没有 data 数组或为空"),t.images&&Array.isArray(t.images)?(console.log("[Z-Image Turbo Proxy] 尝试从 images 字段提取"),we=t.images.map(Q=>typeof Q=="string"?Q:Q.url).filter(Boolean)):t.url&&(console.log("[Z-Image Turbo Proxy] 尝试从 url 字段提取"),we=typeof t.url=="string"?[t.url]:[])),console.log("[Z-Image Proxy] 提取的图片 URLs:",we);if(we.length>0){const Q=we[0];if(g!==void 0&&y!==void 0&&(g[y]=Q,console.log(`[Z-Image ${pe?"Official":"Proxy"}] 批量任务 ${y+1},写入累加器:`,Q),console.log(`[Z-Image ${pe?"Official":"Proxy"}] 当前累加器状态:`,g)),we.forEach((me,ue)=>{ia(me,`${n}_${ue}`).catch(U=>{console.error(`[Z-Image ${pe?"Official":"Proxy"}] 下载图片 ${ue} 失败:`,U)})}),f(me=>me.map(ue=>{if(ue.id===n){const U=ue.startTime?Date.now()-ue.startTime:void 0;return{...ue,status:"completed",progress:100,url:Q,mjImages:we.length>1?we:void 0,selectedMjImageIndex:0,durationMs:U}}return ue})),p(r.id,{isGenerating:!1,content:Q,settings:{...r.settings,isGenerating:!1,progress:100,error:null,generatedImages:we.map((me,ue)=>({id:`${n}_${ue}`,thumbUrl:me,fullUrl:me,createdAt:Date.now()}))}}),g!==void 0&&y!==void 0){const me=g.filter(ue=>ue&&ue.length>0);console.log(`[Z-Image ${pe?"Official":"Proxy"}] 批量生成,当前已完成 ${me.length} 张`),console.log(`[Z-Image ${pe?"Official":"Proxy"}] connectedPreviewId:`,E),await new Promise(ue=>setTimeout(ue,100)),await I(Q,"image",{previewMjImages:me.length>0?me:void 0,selectedPreviewImage:Q,sourceNodeName:R,previewSourceModel:o})}else console.log(`[Z-Image ${pe?"Official":"Proxy"}] 单张生成,更新预览节点`),console.log(`[Z-Image ${pe?"Official":"Proxy"}] connectedPreviewId:`,E),await I(Q,"image",we.length>1?{previewMjImages:we,selectedPreviewImage:Q,sourceNodeName:R,previewSourceModel:o}:{sourceNodeName:R,previewSourceModel:o});console.log(`[Z-Image ${pe?"Official":"Proxy"}] ✅ 图片处理完成,共 ${we.length} 张`)}else{const Q=String(t.message??t.error??t.code??"未返回图片 URL");console.error(`[Z-Image ${pe?"Official":"Proxy"}] 生成失败:`,Q,t),f(me=>me.map(ue=>ue.id===n?{...ue,status:"failed",progress:0,errorMsg:Q}:ue)),p(r.id,{isGenerating:!1,errorMsg:Q,settings:{...r.settings,isGenerating:!1,progress:0,error:Q}})}}else if(Nv(o)){console.log("[Wan 2.6 Image Official] 处理响应:",JSON.stringify(t).substring(0,500));let pe=[],we=[];const Q=((W=r.settings)==null?void 0:W.enableInterleave)??!1,me=t.output;if(me!=null&&me.choices&&Array.isArray(me.choices)&&me.choices.length>0){const ue=me.choices[0],U=(M=ue==null?void 0:ue.message)==null?void 0:M.content;if(U&&Array.isArray(U))for(const G of U)G.type==="image"&&G.image?pe.push(G.image):G.type==="text"&&G.text&&we.push(G.text)}if(console.log("[Wan 2.6 Image Official] 提取的图片 URLs:",pe),console.log("[Wan 2.6 Image Official] 提取的文本内容:",we),pe.length>0){const ue=pe[0];if(g!==void 0&&y!==void 0&&(g[y]=ue,console.log(`[Wan 2.6 Image Official] 批量任务 ${y+1},写入累加器:`,ue),console.log("[Wan 2.6 Image Official] 当前累加器状态:",g)),pe.forEach((U,G)=>{ia(U,`${n}_${G}`).catch(te=>{console.error(`[Wan 2.6 Image Official] 下载图片 ${G} 失败:`,te)})}),f(U=>U.map(G=>{if(G.id===n){const te=G.startTime?Date.now()-G.startTime:void 0;return{...G,status:"completed",progress:100,url:ue,mjImages:pe.length>1?pe:void 0,selectedMjImageIndex:0,durationMs:te,...Q&&we.length>0?{generatedText:we.join(` +`)}:{}}}return G})),p(r.id,{isGenerating:!1,content:ue,settings:{...r.settings,isGenerating:!1,progress:100,error:null,generatedImages:pe.map((U,G)=>({id:`${n}_${G}`,thumbUrl:U,fullUrl:U,createdAt:Date.now()})),...Q&&we.length>0?{generatedText:we.join(` +`)}:{}}}),g!==void 0&&y!==void 0){const U=g.filter(G=>G&&G.length>0);console.log(`[Wan 2.6 Image Official] 批量生成,当前已完成 ${U.length} 张`),r.type!=="storyboard-chart-node"&&(await new Promise(G=>setTimeout(G,100)),await I(ue,"image",{previewMjImages:U.length>0?U:void 0,selectedPreviewImage:ue,sourceNodeName:R,previewSourceModel:o}))}else console.log("[Wan 2.6 Image Official] 单张生成,更新预览节点"),await I(ue,"image",pe.length>1?{previewMjImages:pe,selectedPreviewImage:ue,sourceNodeName:R,previewSourceModel:o}:{sourceNodeName:R,previewSourceModel:o});console.log(`[Wan 2.6 Image Official] ✅ 图片处理完成,共 ${pe.length} 张${Q?`,文本 ${we.length} 段`:""}`)}else{const ue=String(t.message??t.error??t.code??"未返回图片 URL");console.error("[Wan 2.6 Image Official] 生成失败:",ue,t),f(U=>U.map(G=>G.id===n?{...G,status:"failed",progress:0,errorMsg:ue}:G)),p(r.id,{isGenerating:!1,errorMsg:ue,settings:{...r.settings,isGenerating:!1,progress:0,error:ue}})}}else if(e0(o)){console.log("[Gemini Image Official] 处理响应",t);const pe=t.candidates;let we=[];if(pe&&pe.length>0){const Q=pe[0].content,me=Q==null?void 0:Q.parts;if(me&&Array.isArray(me)&&me.length>0){const ue=[];for(const U of me){const G=U.inline_data??U.inlineData;if(G&&G.data){const te=G.mime_type??G.mimeType??"image/png";ue.push({data:G.data,mime:te})}}ue.length>0&&(we=ue.map(U=>`data:${U.mime};base64,${U.data}`))}if(we.length===0){const ue=(Y=Q==null?void 0:Q.parts)==null?void 0:Y[0],U=ue?Object.keys(ue):[];console.warn("[Gemini Image Official] 响应中未找到图片 part。candidates[0].content.parts 长度:",(me==null?void 0:me.length)??0,"首个 part 的 keys:",U,"content:",Q)}}if(we.length>0){const Q=we.length>1?we[we.length-1]:we[0],me=we.length>1?we.length-1:0,ue=`${n}_${me}`,U=we.map((ge,ne)=>`${n}_${ne}`);g!==void 0&&y!==void 0&&(g[y]=Q),await Promise.all(we.map(async(ge,ne)=>{const le=`${n}_${ne}`;await ia(ge,le);try{await zi.storeWithThumbnails(le,ge)}catch(fe){console.warn("[Gemini Image Official] 缩略图生成跳过:",le,fe)}}));let G=we;try{const ge=await Promise.all(U.map(ne=>zi.getPreview(ne)));ge.every(ne=>ne!=null)&&(G=ge)}catch{}const te=G[me]||Q;if(Av(te,ue),we.length>1&&G.forEach((ge,ne)=>{ge&&U[ne]&&Av(ge,U[ne])}),f(ge=>ge.map(ne=>{if(ne.id===n){const le=ne.startTime?Date.now()-ne.startTime:void 0;return{...ne,status:"completed",progress:100,url:te,mjImages:we.length>1?G:void 0,selectedMjImageIndex:0,durationMs:le,_assetId:ue,...we.length>1?{_mjAssetIds:U}:{}}}return ne})),p(r.id,{isGenerating:!1,content:te,settings:{...r.settings,isGenerating:!1,progress:100,error:null,generatedImages:we.map((ge,ne)=>({id:`${n}_${ne}`,thumbUrl:G[ne]||ge,fullUrl:ge,createdAt:Date.now(),assetId:`${n}_${ne}`}))}}),g!==void 0&&y!==void 0){const ge=g.filter(ne=>ne&&ne.length>0);r.type!=="storyboard-chart-node"&&await I(te,"image",{previewMjImages:ge.length>0?ge:void 0,selectedPreviewImage:te,sourceNodeName:R,previewSourceModel:o})}else{let ge;try{const ne=await fetch(Q).then(fe=>fe.blob()),le=await kv(ne);le.width>0&&le.height>0&&(ge=`${le.width}×${le.height}`)}catch{}await I(te,"image",we.length>1?{previewMjImages:G,selectedPreviewImage:te,sourceNodeName:R,previewSourceModel:o,previewActualSize:ge,contentAssetId:ue,previewMjAssetIds:U}:{sourceNodeName:R,previewSourceModel:o,previewActualSize:ge,contentAssetId:ue})}console.log("[Gemini Image Official] ✅ 图片处理完成,共",we.length,"张")}else{const Q=((se=t.error)==null?void 0:se.message)??t.message??t.error,me=((re=(oe=(ie=pe==null?void 0:pe[0])==null?void 0:ie.content)==null?void 0:oe.parts)==null?void 0:re.map(G=>G.text??G.text).filter(Boolean).join(" "))||"",ue=me?me.trim():"",U=String(Q??(ue?`未返回图片。模型回复:${ue.length>120?ue.slice(0,120)+"…":ue}`:"未返回图片(响应中无图片数据,可能被安全过滤或模型未生成)"));console.error("[Gemini Image Official] 生成失败:",U,"response:",t),f(G=>G.map(te=>te.id===n?{...te,status:"failed",progress:0,errorMsg:U}:te)),p(r.id,{isGenerating:!1,errorMsg:U,settings:{...r.settings,isGenerating:!1,progress:0,error:U}})}}else if(t.data&&Array.isArray(t.data)&&t.data.length>0){console.log("[Sync Mode] Processing synchronous response, isMidjourney:",l,"isVideoGeneration:",c,"currentModel:",o);const pe=t.data.map(Q=>{if(Q.url)return Q.url;if(Q.b64_json){let me="image/png";return Q.b64_json.startsWith("/9j/")?me="image/jpeg":Q.b64_json.startsWith("R0lGOD")?me="image/gif":Q.b64_json.startsWith("UklGR")&&(me="image/webp"),console.log("[Sync Mode] ✓ 检测到 base64 图片数据,转换为 data URL"),`data:${me};base64,${Q.b64_json}`}return null}).filter(Boolean),we=pe[0];if(console.log("[Sync Mode] Result URLs:",pe.length,"张",((ee=pe[0])==null?void 0:ee.substring(0,50))+"..."),Tp(o)&&c&&we){console.log("[Jimeng Video Sync] 检测到 Jimeng 视频同步响应:",we);const Q=Ea(we)||we;ia(we,n).catch(ue=>{console.error("[Jimeng Video Sync] 下载视频失败:",ue)}),f(ue=>ue.map(U=>{if(U.id===n){const G=U.startTime?Date.now()-U.startTime:void 0;return{...U,status:"completed",progress:100,url:Q,durationMs:G}}return U})),p(r.id,{isGenerating:!1,content:Q,settings:{...r.settings,isGenerating:!1,progress:100,error:null}});const me=Q;console.log("[Jimeng Video Sync] 更新预览节点, previewId:",E),await I(me,"video",{sourceNodeName:R,previewSourceModel:o}),console.log("[Jimeng Video Sync] ✅ 视频处理完成");return}if(l&&pe.length===1&&!c)console.log("[MJ Sync] Detected MJ single image:",we),ia(we,n).catch(Q=>{console.error("[MJ Sync] 下载图片失败:",Q)}),f(Q=>Q.map(me=>{if(me.id===n){const ue=me.startTime?Date.now()-me.startTime:void 0;return{...me,status:"completed",progress:100,url:we,mjOriginalUrl:we,mjNeedsSplit:!0,durationMs:ue}}return me})),p(r.id,{isGenerating:!1,content:we,settings:{...r.settings,isGenerating:!1,progress:100,error:null}}),console.log("[MJ Sync] Updating preview with original image, previewId:",E),E?await I(we,"image",{sourceNodeName:R,previewSourceModel:o}):console.warn("[MJ Sync] ⚠️ 预览节点ID为空,无法发送到预览窗口"),console.log("[MJ Sync] ========== 准备开始裁切 =========="),(async()=>{try{console.log("[MJ Sync] 🔪 Starting to split image immediately"),console.log("[MJ Sync] 🔪 Image URL to split:",we.substring(0,100));let Q=we,me=!1;if(typeof window<"u"&&("__TAURI__"in window||"__TAURI_INTERNALS__"in window)&&(we.startsWith("http://")||we.startsWith("https://")))try{const{downloadWithFallback:ue}=await mn(async()=>{const{downloadWithFallback:G}=await Promise.resolve().then(()=>n0);return{downloadWithFallback:G}},void 0,import.meta.url),U=await ue(we,6e4);Q=URL.createObjectURL(U),me=!0}catch(ue){console.warn("[MJ Sync] Tauri 下载原图失败,使用原 URL 裁切:",ue)}try{const ue=await xm(Q);console.log("[MJ Sync] ✅ Split completed successfully!"),console.log("[MJ Sync] ✅ Number of split images:",ue.length);const U=ue.map(te=>te.url);console.log("[MJ Sync] ✅ Split URLs:",U.map(te=>te.substring(0,50))),console.log("[MJ Sync] 📋 Creating independent Blob URLs for history...");const G=await Promise.all(U.map(async te=>{try{const ne=await(await fetch(te)).blob(),le=URL.createObjectURL(ne);return console.log("[MJ Sync] ✅ Created history blob:",le.substring(0,50)),le}catch(ge){return console.error("[MJ Sync] ❌ Failed to create history blob:",ge),te}}));console.log("[MJ Sync] ✅ History Blob URLs created"),console.log("[MJ Sync] 💾 开始保存切片到本地..."),U.forEach((te,ge)=>{const ne=`${n}_split_${ge}`,le=`mj_${n}_split_${ge+1}.png`;ia(te,ne,le).catch(fe=>{console.error(`[MJ Sync] ❌ 保存切片 ${ge+1} 失败:`,fe)})}),console.log("[MJ Sync] ✅ 切片保存任务已启动"),f(te=>te.map(ge=>ge.id===n?{...ge,url:G[0],mjImages:G,selectedMjImageIndex:0,mjNeedsSplit:!1}:ge)),console.log("[MJ Sync] ✅ History updated with split images"),p(r.id,{settings:{...r.settings,mjImages:U,selectedMjImageIndex:0}}),console.log("[MJ Sync] ✅ Node settings updated"),console.log("[MJ Sync] ✅ Updating preview with split images, previewId:",E),await I(U[0],"image",{previewMjImages:U,selectedPreviewImage:U[0],sourceNodeName:R,previewSourceModel:o}),console.log("[MJ Sync] ========== MJ 四宫格处理完成 ==========")}finally{me&&Q.startsWith("blob:")&&URL.revokeObjectURL(Q)}}catch(Q){console.error("[MJ Sync] ❌ 裁切失败:",Q),console.error("[MJ Sync] ❌ 错误详情:",Q instanceof Error?Q.message:String(Q)),console.error("[MJ Sync] ❌ 错误堆栈:",Q instanceof Error?Q.stack:"No stack"),console.warn("[MJ Sync] ⚠️ 裁切失败,保持显示原图"),f(me=>me.map(ue=>ue.id===n?{...ue,mjSplitError:Q.message}:ue)),p(r.id,{settings:{...r.settings,mjSplitError:Q.message}})}})();else{ia(we,n).catch(me=>{console.error("[Sync] 下载失败:",me)}),pe.length>1&&pe.slice(1).forEach((me,ue)=>{ia(me,`${n}_${ue+1}`).catch(U=>{console.error(`[Sync] 下载第${ue+2}张失败:`,U)})}),f(me=>me.map(ue=>{if(ue.id===n){const U=ue.startTime?Date.now()-ue.startTime:void 0;return{...ue,status:"completed",progress:100,url:we,mjImages:pe.length>1?pe:void 0,selectedMjImageIndex:0,durationMs:U}}return ue})),hC(n,we,f);const Q=pe.map((me,ue)=>({id:`${n}_${ue}`,thumbUrl:me,fullUrl:me,createdAt:Date.now()}));p(r.id,{isGenerating:!1,content:we,settings:{...r.settings,isGenerating:!1,progress:100,error:null,generatedImages:Q}}),console.log("[Sync] Updating preview, previewIds:",C),await I(we,"image",pe.length>1?{previewMjImages:pe,sourceNodeName:R,previewSourceModel:o}:{sourceNodeName:R,previewSourceModel:o})}}else throw console.error("[Response] Invalid response format:",t),new Error("未返回图片数据")}async function pC(e,t,n,r){var i;if(console.log("[VideoUploader] 上传视频文件:",{name:e.name,size:e.size,type:e.type,segment:t}),n&&r)try{let a=e;const o=await HX(e);t&&(t.startTime>0||t.endTimed.abort(),6e5);const f=await fetch(u,{method:"POST",headers:{Authorization:`Bearer ${n}`},body:p,signal:d.signal});if(h&&(clearTimeout(h),h=null),!f.ok){const y=await f.text();console.warn("[VideoUploader] 端点失败:",u,f.status,y),c=new Error(`HTTP ${f.status}: ${y}`);continue}const b=await f.json();console.log("[VideoUploader] 上传成功:",b);let g=b.url||b.file_url||b.download_url||((i=b.data)==null?void 0:i.url);if(!g&&b.id&&(g=`${r}/v1/files/${b.id}/content`),!g){console.warn("[VideoUploader] 响应中未找到文件 URL,尝试下一个端点"),c=new Error("响应中未找到文件 URL");continue}return console.log("[VideoUploader] 文件 URL:",g),g}catch(p){h&&(clearTimeout(h),h=null);const f=p;f.name==="AbortError"?(console.warn("[VideoUploader] 上传超时(10分钟):",u),c=new Error("文件上传超时(10分钟),文件可能过大,请稍后重试")):(console.warn("[VideoUploader] 端点请求失败:",u,p),c=f instanceof Error?f:new Error(String(p)));continue}}throw c||new Error("所有上传端点都失败")}catch(a){throw console.error("[VideoUploader] 上传到服务器失败:",a),a}throw new Error("视频上传需要提供 API Key 和 Base URL")}function HX(e){return new Promise((t,n)=>{const r=document.createElement("video");r.preload="metadata",r.onloadedmetadata=()=>{URL.revokeObjectURL(r.src),t(r.duration)},r.onerror=()=>{URL.revokeObjectURL(r.src),n(new Error("无法读取视频信息"))},r.src=URL.createObjectURL(e)})}const GX=({nodesMap:e,apiConfigs:t,globalApiKey:n,getConnectedVideoInputNode:r,groupKeyframesByTime:i,setNodes:a,setConnections:o,setSettingsOpen:l})=>{const c=_.useCallback(async h=>{var E,I,R,A;const p=e.get(h);if(!p||p.type!=="video-analyze")return;const f=r(h);if(!f){alert("请先连接一个视频输入节点或含视频的图片输入节点");return}const b=f.selectedKeyframes||[];if(b.length===0){alert(f.type==="input-image"?"手动选帧拆解请连接视频输入节点并选择关键帧":"请先在视频输入节点中选择关键帧");return}const g=t.find(O=>{var F;return O.id===((F=p.settings)==null?void 0:F.model)||"gemini-3-pro"}),y=(g==null?void 0:g.key)||n,w=((g==null?void 0:g.url)||"https://api.openai.com").replace(/\/+$/,"");if(!y){alert("请先在 API 设置中配置 Key"),l(!0);return}const v=((E=p.settings)==null?void 0:E.segmentDuration)||3,m=i(b,v);if(m.length===0){alert("无法分组关键帧");return}a(O=>O.map(F=>F.id===h?{...F,isGenerating:!0,analysisResults:[]}:F));const z=[],C=f.videoFileName||"video.mp4";try{for(let O=0;Oq?F.slice(0,q):F;H.forEach((M,Y)=>{T.push({type:"image_url",image_url:{url:M.url}}),YZ.abort(),6e4);let V;try{V=await fetch(`${w}/v1/chat/completions`,{method:"POST",headers:{Authorization:`Bearer ${y}`,"Content-Type":"application/json"},body:JSON.stringify({model:(g==null?void 0:g.modelName)||"gemini-3-pro-preview",messages:J,stream:!1}),signal:Z.signal})}catch(M){clearTimeout(B);const Y=M;throw Y.name==="AbortError"?new Error("请求超时,请检查网络连接或稍后重试"):new Error(`网络请求失败: ${Y.message}`)}finally{clearTimeout(B)}if(!V.ok){let M="";try{M=await V.text()}catch{M=`HTTP ${V.status}: ${V.statusText}`}throw new Error(M||`API Error: ${V.status}`)}const N=await V.json();let j=((A=(R=(I=N.choices)==null?void 0:I[0])==null?void 0:R.message)==null?void 0:A.content)||N.content||"";if(!j||j.trim()==="")throw new Error("API 返回内容为空");let k=j.trim();k.startsWith("```")&&(k=k.replace(/^```(?:json)?\n?/,"").replace(/\n?```$/,""));let W;try{W=JSON.parse(k)}catch{W={video_id:C,scene_index:O+1,time_range:L,keyframes:F.map((M,Y)=>({type:Y===0?"prev":Y===1?"current":"next",time:M.time,description:`视频帧 ${M.time.toFixed(1)}s`,mj_prompt:"A detailed scene from the video",jimeng_prompt:"视频场景描述"})),global_tags:{style:[],camera:[],color:[]}}}z.push(W),a(M=>M.map(Y=>Y.id===h?{...Y,analysisResults:[...z]}:Y))}a(O=>O.map(F=>F.id===h?{...F,isGenerating:!1,analysisResults:z}:F))}catch(O){const F=O;a(L=>L.map(X=>X.id===h?{...X,isGenerating:!1,errorMsg:F.message}:X))}},[e,r,t,n,i,a,l]),u=_.useCallback((h,p)=>{const f=e.get(h);if(!f||!p||p.length===0)return;const b=p.map((m,z)=>{var X,T,q;const C=m.keyframes,E=(C==null?void 0:C.find(H=>H.type==="current"))||(C==null?void 0:C[0]),I=(E==null?void 0:E.mj_prompt)||"",R=(E==null?void 0:E.jimeng_prompt)||"",A=(E==null?void 0:E.description)||"",O=m.global_tags,F=[];(X=O==null?void 0:O.style)!=null&&X[0]&&F.push(O.style[0]),(T=O==null?void 0:O.camera)!=null&&T[0]&&F.push(O.camera[0]);const L=((q=O==null?void 0:O.camera)==null?void 0:q[0])||"";return{id:`shot-${Date.now()}-${z}`,scene_index:z+1,time_range:m.time_range||"",image_url:"",description:A,prompt:I||R,camera:L,tags:F,status:"draft"}}),g=f.x+f.width+100,y=f.y,w=`node-storyboard-${Date.now()}`,v={id:w,type:"storyboard-node",x:g,y,width:600,height:500,settings:{projectTitle:"AI 拆解结果",shots:b}};a(m=>[...m,v]),o(m=>[...m,{id:`conn-${Date.now()}`,from:h,to:w}]),console.log("[自动生成分镜表] 已创建分镜表节点,包含",b.length,"个镜头")},[e,a,o]),d=_.useCallback(async h=>{var R,A,O,F,L,X,T,q,H,J,Z,B,V,N,j,k,W,M;const p=e.get(h);if(!p||p.type!=="video-analyze")return;a(Y=>Y.map(se=>se.id===h?{...se,isGenerating:!0,errorMsg:void 0,settings:{...se.settings,voiceoverResults:[],analysisResults:[]}}:se));const f=r(h);if(!f||!f.content){a(Y=>Y.map(se=>se.id===h?{...se,isGenerating:!1,errorMsg:"请先连接一个包含视频的视频输入节点或图片输入节点"}:se)),alert("请先连接一个包含视频的视频输入节点或图片输入节点");return}const b=f.type==="input-image",g=(R=f.settings)==null?void 0:R.mediaType,y=g==="video"||f.type==="video-input";if(console.log("[视频分析] 节点信息:",{nodeType:f.type,mediaType:g,isVideoContent:y,contentPreview:(A=f.content)==null?void 0:A.substring(0,50)}),!y&&b){console.warn("[视频分析] 警告:图片输入节点未正确识别为视频,mediaType:",g);const Y=f.content;if(!(Y.startsWith("data:video")||Y.includes(".mp4")||Y.includes(".webm")||Y.includes(".mov")||Y.includes("force_video_display=true"))){alert("连接的图片输入节点不包含视频内容");return}console.log("[视频分析] 通过URL判断确认为视频")}let w=f.content;const v=((O=p.settings)==null?void 0:O.chatModel)||((F=p.settings)==null?void 0:F.model)||"gemini-3-pro";let m=t.find(Y=>Y.id===v&&Y.type==="Chat");m||(m=t.find(Y=>Y.id==="gemini-3-pro"&&Y.type==="Chat")),m||(m=t.find(Y=>Y.type==="Chat"));const z=(m==null?void 0:m.key)||n,C=((m==null?void 0:m.url)||"https://api.openai.com").replace(/\/+$/,"");if(!z){alert("请先在 API 设置中配置 Key"),l(!0);return}const E=(m==null?void 0:m.modelName)||(m==null?void 0:m.id)||"gemini-3-pro-preview";if(console.log("[视频分析] 使用的模型配置:",{configId:m==null?void 0:m.id,modelName:E,provider:m==null?void 0:m.provider,baseUrl:C}),console.log("[视频分析] 准备发送视频URL:",{urlType:w.startsWith("blob:")?"blob":w.startsWith("http")?"http":w.startsWith("data:")?"data":"unknown",urlPreview:w.substring(0,100)}),w.startsWith("blob:")||w.startsWith("http://")||w.startsWith("https://")){const Y=w.startsWith("blob:")?"Blob":"HTTP/HTTPS";console.log(`[视频分析] 检测到${Y} URL,通过上传模式获取URL`);try{console.log("[视频分析] 下载视频文件...");const se=await As(w),ie=f.videoFileName||"video.mp4",oe=new File([se],ie,{type:se.type||"video/mp4"});try{console.log("[视频分析] 上传视频文件获取http URL...");const re=await pC(oe,void 0,z,C);console.log("[视频分析] 视频上传成功,使用http URL:",re),w=re}catch(re){console.warn("[视频分析] 视频上传失败,转换为DataURL:",re);const ee=await Ls(se);console.log("[视频分析] 已转换为DataURL,大小:",(ee.length/1024/1024).toFixed(2),"MB"),w=ee}}catch(se){console.error(`[视频分析] ${Y} URL处理失败:`,se),alert(`视频处理失败: ${se instanceof Error?se.message:"未知错误"}`),a(ie=>ie.map(oe=>oe.id===h?{...oe,isGenerating:!1,errorMsg:`视频处理失败: ${se instanceof Error?se.message:"未知错误"}`}:oe));return}}else if(w.startsWith("data:"))if(w.startsWith("data:video")){console.log("[视频分析] 检测到DataURL视频,转换为文件后上传获取URL");try{const se=await(await fetch(w)).blob(),ie=f.videoFileName||"video.mp4",oe=new File([se],ie,{type:se.type||"video/mp4"});console.log("[视频分析] DataURL已转换为文件,大小:",(oe.size/1024/1024).toFixed(2),"MB");try{console.log("[视频分析] 上传DataURL转换的文件获取http URL...");const re=await pC(oe,void 0,z,C);console.log("[视频分析] DataURL文件上传成功,使用http URL:",re),w=re}catch(re){console.error("[视频分析] DataURL文件上传失败:",re),console.warn("[视频分析] 上传失败,使用原始DataURL(可能导致连接问题)")}}catch(Y){console.error("[视频分析] DataURL转换失败:",Y),alert(`视频处理失败: ${Y instanceof Error?Y.message:"未知错误"}`),a(se=>se.map(ie=>ie.id===h?{...ie,isGenerating:!1,errorMsg:`视频处理失败: ${Y instanceof Error?Y.message:"未知错误"}`}:ie));return}}else console.warn("[视频分析] 警告:检测到DataURL但可能不是视频格式:",w.substring(0,50));else console.log("[视频分析] 未知URL格式,尝试直接使用:",w.substring(0,50));const I=(X=(L=p.settings)==null?void 0:L.customAnalysisPrompt)==null?void 0:X.trim();try{const Y=`你是一位世界级的**游戏买量视频拆解专家**和**AI视觉导演**。你需要同时完成两项任务: + +1. **视觉拆解**:分析视频的每一个分镜,推测其运镜手法(推拉摇移)、画面动态、人物关系。 + +2. **听觉提取**:提取视频中的口播文案(Voiceover)。 + +请按时间顺序,将视频拆解为多个关键场景,并返回如下 **JSON 格式**(不要包含Markdown代码块标记): + +{ + "voiceover_script": [ + { "time_range": "0s-3s", "text": "提取的口播文案..." } + ], + "scenes": [ + { + "scene_id": 1, + "time_range": "0s-2.5s", + "visual_analysis": { + "camera_movement": "详细描述运镜", + "subject_dynamics": "描述主体动作", + "atmosphere": "赛博朋克,冷峻,高科技感" + }, + "prompts": { + "jimeng_prompt": "即梦提示词", + "mj_prompt": "Midjourney Prompt" + } + } + ] +}`,oe=[{type:"text",text:I?`${I} + +请基于上述要求拆解该视频,并严格按JSON格式输出拆解报告。`:"请分析这段视频。请严格按JSON格式输出拆解报告。"},{type:"image_url",image_url:{url:w}}];console.log("[视频分析] 发送的视频内容:",{urlType:w.startsWith("blob:")?"blob":w.startsWith("http")?"http":w.startsWith("data:video")?"data:video":w.startsWith("data:")?"data:image":"unknown",urlLength:w.length,urlPreview:w.substring(0,100),contentType:"video (使用image_url类型,符合OpenAPI规范)"});const ee={model:E,messages:[{role:"system",content:Y},{role:"user",content:oe}],stream:!1};console.log("[视频分析] 请求payload:",{model:ee.model,messagesCount:ee.messages.length,userContentTypes:oe.map(le=>le.type),hasVideoUrl:oe.some(le=>{var fe;return le.type==="image_url"&&((fe=le.image_url)==null?void 0:fe.url)}),baseUrl:C,endpoint:`${C}/v1/chat/completions`});const pe=new AbortController,we=setTimeout(()=>pe.abort(),6e5);let Q;try{Q=await fetch(`${C}/v1/chat/completions`,{method:"POST",headers:{Authorization:`Bearer ${z}`,"Content-Type":"application/json"},body:JSON.stringify(ee),signal:pe.signal})}catch(le){clearTimeout(we);const fe=le;throw fe.name==="AbortError"?new Error("请求超时(10分钟),视频分析可能需要更长时间,请稍后重试"):new Error(`网络请求失败: ${fe.message}`)}finally{clearTimeout(we)}if(!Q.ok){let le="";try{le=await Q.text()}catch{le=`HTTP ${Q.status}: ${Q.statusText}`}throw new Error(le||`API Error: ${Q.status}`)}const me=await Q.json();console.log("[视频分析] API响应:",{hasChoices:!!me.choices,choicesLength:((T=me.choices)==null?void 0:T.length)||0,hasContent:!!me.content,hasData:!!me.data,responseKeys:Object.keys(me),responseSample:JSON.stringify(me).substring(0,500)});let ue=((J=(H=(q=me.choices)==null?void 0:q[0])==null?void 0:H.message)==null?void 0:J.content)||((N=(V=(B=(Z=me.data)==null?void 0:Z.choices)==null?void 0:B[0])==null?void 0:V.message)==null?void 0:N.content)||me.content||((j=me.data)==null?void 0:j.content)||"";if(Array.isArray((M=(W=(k=me.choices)==null?void 0:k[0])==null?void 0:W.message)==null?void 0:M.content)&&(ue=me.choices[0].message.content.map(le=>le.type==="text"?le.text:typeof le=="string"?le:"").join("")),!ue||ue.trim()==="")throw console.error("[视频分析] API响应内容为空,完整响应:",JSON.stringify(me,null,2)),new Error("API 返回内容为空,请检查模型是否支持视频分析功能");console.log("[视频分析] 提取的AI内容长度:",ue.length,"前100字符:",ue.substring(0,100));let U=ue.trim();U.startsWith("```")&&(U=U.replace(/^```(?:json)?\n?/,"").replace(/\n?```$/,""));const G=U.match(/\{[\s\S]*\}/);G&&(U=G[0]);let te;try{te=JSON.parse(U)}catch(le){throw console.error("[视频分析] JSON解析失败,原始内容长度:",U.length),console.error("[视频分析] JSON解析错误:",le),console.error("[视频分析] 尝试解析的内容前500字符:",U.substring(0,500)),new Error(`解析 AI 响应失败: ${le instanceof Error?le.message:"未知错误"}`)}const ge=te.voiceover_script||[],ne=(te.scenes||[]).map((le,fe)=>{const be=le.visual_analysis,de=le.prompts,$e=`${(be==null?void 0:be.camera_movement)||""} ${(be==null?void 0:be.subject_dynamics)||""}`.trim();return{scene_index:le.scene_id||fe+1,time_range:le.time_range,keyframes:[{type:"current",time:0,description:$e,mj_prompt:(de==null?void 0:de.mj_prompt)||"",jimeng_prompt:(de==null?void 0:de.jimeng_prompt)||""}],global_tags:{style:be!=null&&be.atmosphere?[be.atmosphere]:[],camera:be!=null&&be.camera_movement?[be.camera_movement]:[],color:[]}}});a(le=>le.map(fe=>fe.id===h?{...fe,isGenerating:!1,analysisResults:ne,settings:{...fe.settings,voiceoverResults:ge,analysisResults:ne}}:fe)),ne.length>0&&setTimeout(()=>{u(h,ne)},100)}catch(Y){const se=Y;a(ie=>ie.map(oe=>oe.id===h?{...oe,isGenerating:!1,errorMsg:se.message}:oe))}},[e,r,t,n,u,a,l]);return{handleGeneratePrompts:c,handleAutoVideoAnalysis:d,createStoryboardFromAnalysisResult:u}},qX=({nodesMap:e,apiConfigs:t,globalApiKey:n,getConnectedVideoAnalyzeNode:r,updateNodeSettings:i,setNodes:a,setHistory:o})=>{const l=_.useRef(new Map),c=_.useRef(new Map);_.useEffect(()=>{const m=async(C,E)=>{const I=C.split("_")[0],R=await Xr.getAssetUrl(C);R&&o(A=>A.map(O=>{if(O.id!==I)return O;const F={...O},L=F._mjAssetIds||[];if(C===I&&O.url&&O.url.startsWith("http")&&(F.url=R,F._assetId=C,console.log(`[useStoryboard] ✅ 已更新历史记录主 URL: ${I}`)),C===`${I}_audio`&&O.audioUrl&&O.audioUrl.startsWith("http")&&(F.audioUrl=R,F._audioAssetId=C,console.log(`[useStoryboard] ✅ 已更新历史记录音频 URL: ${I}`)),C.startsWith(`${I}_mj_`)&&O.mjImages){const X=parseInt(C.split("_mj_")[1]);!isNaN(X)&&O.mjImages[X]&&O.mjImages[X].startsWith("http")&&(F.mjImages=[...O.mjImages],F.mjImages[X]=R,L.includes(C)||L.push(C),F._mjAssetIds=L,console.log(`[useStoryboard] ✅ 已更新历史记录多图 ${X}: ${I}`))}return C===`${I}_mj_original`&&O.mjOriginalUrl&&O.mjOriginalUrl.startsWith("http")&&(F.mjOriginalUrl=R,F._mjOriginalAssetId=C,console.log(`[useStoryboard] ✅ 已更新历史记录多图原图: ${I}`)),C===`${I}_thumbnail`&&O.thumbnailUrl&&O.thumbnailUrl.startsWith("http")&&(F.thumbnailUrl=R,F._thumbnailAssetId=C,console.log(`[useStoryboard] ✅ 已更新历史记录缩略图: ${I}`)),F}))},z=Xr.addListener(m);return()=>z()},[o]);const u=_.useCallback(m=>{var R;const z=e.get(m);if(!z||z.type!=="storyboard-node")return;const C=r(m);if(!C){alert("请先连接一个视频拆解节点");return}const E=((R=C.settings)==null?void 0:R.analysisResults)||C.analysisResults||[];if(E.length===0){alert("视频拆解节点没有分析结果,请先执行分析");return}const I=E.map((A,O)=>{var B,V,N;const F=A.keyframes,L=(F==null?void 0:F.find(j=>j.type==="current"))||(F==null?void 0:F[0]),X=(L==null?void 0:L.mj_prompt)||"",T=(L==null?void 0:L.jimeng_prompt)||"",q=(L==null?void 0:L.description)||"",H=A.global_tags,J=[];(B=H==null?void 0:H.style)!=null&&B[0]&&J.push(H.style[0]),(V=H==null?void 0:H.camera)!=null&&V[0]&&J.push(H.camera[0]);const Z=((N=H==null?void 0:H.camera)==null?void 0:N[0])||"";return{id:`shot-${Date.now()}-${O}`,scene_index:O+1,time_range:A.time_range||"",image_url:"",description:q,prompt:X||T,camera:Z,tags:J,status:"draft"}});i(m,{shots:I})},[e,r,i]),d=_.useCallback((m,z,C)=>{a(E=>E.map(I=>{var R;if(I.id===m&&((R=I.settings)!=null&&R.shots)){const A=I.settings.shots.map(O=>O.id===z?{...O,...C}:O);return{...I,settings:{...I.settings,shots:A}}}return I}))},[a]),h=_.useCallback((m,z)=>{a(C=>C.map(E=>{var I,R;if(E.id===m){const A=((I=E.settings)==null?void 0:I.shots)||[],O={id:`shot-${Date.now()}`,scene_index:z!==void 0?(((R=A[z])==null?void 0:R.scene_index)||z+1)+1:A.length+1,time_range:"",image_url:"",description:"",prompt:"",status:"draft"};if(z!==void 0&&z>=0&&z{a(C=>C.map(E=>{var I;if(E.id===m&&((I=E.settings)!=null&&I.shots)){const R=E.settings.shots.filter(A=>A.id!==z);return{...E,settings:{...E.settings,shots:R}}}return E}))},[a]),f=_.useCallback((m,z,C,E,I)=>{const R=Math.ceil(266.6666666666667),A=async(O=0)=>{var F,L,X,T,q,H,J,Z,B,V,N,j,k,W;if(O>R){o(Y=>Y.map(se=>se.id===m?{...se,status:"failed",progress:0,errorMsg:"生成超时(1600秒)"}:se));const M=l.current.get(m);M&&(d(M.nodeId,M.shotId,{status:"draft"}),l.current.delete(m),c.current.delete(m));return}try{let M;No(I)?M=`${C}/kling/v1/videos/omni-video/${encodeURIComponent(z)}`:dl(I)||hl(I)||au(I)?M=`${C}/v2/videos/generations/${encodeURIComponent(z)}`:pl(I)?M=`${C}${$x(I)}/${encodeURIComponent(z)}`:M=`${C}/v1/videos/${encodeURIComponent(z)}`;const Y=await fetch(M,{method:"GET",headers:{Authorization:`Bearer ${E}`}});if(!Y.ok){setTimeout(()=>A(O+1),6e3);return}const se=await Y.json();if(pl(I)){const re=F5(se);if(re.terminal==="success"&&re.videoUrl){const we=re.videoUrl;o(me=>me.map(ue=>ue.id===m?{...ue,status:"completed",progress:100,url:we}:ue)),uo({url:we,type:"video"},m);const Q=l.current.get(m);Q&&(d(Q.nodeId,Q.shotId,{video_url:we,status:"done"}),l.current.delete(m),c.current.delete(m));return}if(re.terminal==="failed"){const we=String(re.errorMsg||"生成失败");o(me=>me.map(ue=>ue.id===m?{...ue,status:"failed",progress:0,errorMsg:we}:ue));const Q=l.current.get(m);Q&&(d(Q.nodeId,Q.shotId,{status:"draft"}),l.current.delete(m),c.current.delete(m));return}const ee=Math.min(10+O*2,90),pe=c.current.get(m)||0;(Math.abs(ee-pe)>=10||ee===0)&&(c.current.set(m,ee),o(we=>we.map(Q=>Q.id===m?{...Q,progress:ee}:Q))),setTimeout(()=>A(O+1),6e3);return}const ie=((F=se.data)==null?void 0:F.status)||se.status||((L=se.data)==null?void 0:L.task_status)||se.task_status||"",oe=((X=se.data)==null?void 0:X.progress)||se.progress||Math.min(10+O*2,90);if(ie==="SUCCESS"||ie==="succeeded"||ie==="FINISHED"||ie==="completed"){const re=((T=se.content)==null?void 0:T.video_url)||((q=se.data)==null?void 0:q.output)||se.output||((H=se.data)==null?void 0:H.video_url)||((J=se.data)==null?void 0:J.url)||se.video_url||se.url||((V=(B=(Z=se.data)==null?void 0:Z.video)==null?void 0:B[0])==null?void 0:V.url)||((j=(N=se.video)==null?void 0:N[0])==null?void 0:j.url);if(re){o(pe=>pe.map(we=>we.id===m?{...we,status:"completed",progress:100,url:re}:we)),uo({url:re,type:"video"},m);const ee=l.current.get(m);ee&&(console.log("[分镜表] 视频生成完成,回填:",{taskId:m,nodeId:ee.nodeId,shotId:ee.shotId,videoUrl:re}),d(ee.nodeId,ee.shotId,{video_url:re,status:"done"}),l.current.delete(m),c.current.delete(m))}else{o(pe=>pe.map(we=>we.id===m?{...we,status:"failed",progress:0,errorMsg:"未找到视频URL"}:we));const ee=l.current.get(m);ee&&(d(ee.nodeId,ee.shotId,{status:"draft"}),l.current.delete(m),c.current.delete(m))}}else if(ie==="FAILED"||ie==="ERROR"||ie==="FAILURE"||ie==="CANCELLED"){const re=se.failReason||se.fail_reason||((k=se.data)==null?void 0:k.failReason)||((W=se.data)==null?void 0:W.fail_reason)||se.message||se.error||"",ee=typeof re=="string"?re||`任务失败: ${ie}`:typeof re=="object"&&re!==null&&"message"in re?String(re.message):`任务失败: ${ie}`;o(we=>we.map(Q=>Q.id===m?{...Q,status:"failed",progress:0,errorMsg:ee}:Q));const pe=l.current.get(m);pe&&(d(pe.nodeId,pe.shotId,{status:"draft"}),l.current.delete(m),c.current.delete(m))}else{const re=c.current.get(m)||0;(Math.abs(oe-re)>=10||oe===0||oe===100)&&(c.current.set(m,oe),o(pe=>pe.map(we=>we.id===m?{...we,progress:oe}:we))),setTimeout(()=>A(O+1),6e3)}}catch{setTimeout(()=>A(O+1),6e3)}};A()},[d,o]),b=_.useCallback(async(m,z)=>{var V,N,j;let C=z.prompt||"";if(!C&&z.description&&(C=z.description),z.tags&&Array.isArray(z.tags)&&z.tags.length>0){const k=z.tags.join(", ");C+=`, ${k}`}if(z.camera&&(C+=`, ${z.camera} camera movement`),!C){alert("请至少填写画面描述或提示词");return}const E=z.model||((V=t.find(k=>k.type==="Video"&&k.id==="sora-2"))==null?void 0:V.id)||((N=t.find(k=>k.type==="Video"))==null?void 0:N.id)||"sora-2",I=t.find(k=>k.id===E);if(!I||I.type!=="Video"){alert("请先选择一个视频模型");return}const R=I.key||n;if(!R){alert("请先配置 API Key");return}const A=(I.url||"https://ai.comfly.chat").replace(/\/+$/,""),O=[],F=z.enableFrames,L=z.startFrame,X=z.endFrame;F&&(L||X)?(L&&O.push(L),X&&O.push(X),console.log("[分镜表] 使用首尾帧模式:",{startFrame:!!L,endFrame:!!X})):z.image_url&&(O.push(z.image_url),console.log("[分镜表] 使用普通参考图模式")),d(m,z.id,{status:"generating"});const T=Date.now().toString(),q=z.ratio||"16:9",H=z.resolution||"1080P",J=z.duration||jv(E),Z=`storyboard-${m}-shot-${z.id}`;l.current.set(T,{nodeId:m,shotId:z.id}),console.log("[分镜表] 任务已记录:",{taskId:T,nodeId:m,shotId:z.id,model:E});const B={id:T,type:"video",url:"",prompt:C,time:new Date().toLocaleTimeString(),status:"generating",progress:0,modelName:I.provider||E,ratio:q,sourceNodeId:Z,apiConfig:{modelId:E,baseUrl:A,apiKey:R}};o(k=>[B,...k]);try{const k=parseInt(J.replace("s",""),10)||8;let W="",M={},Y=!1;const se=we=>new Promise((Q,me)=>{const ue=new FileReader;ue.onloadend=()=>Q(ue.result),ue.onerror=me,ue.readAsDataURL(we)}),ie=async(we,Q)=>{if(we.startsWith("content_ref:")){const me=await As(we);return Q?await se(me):me}if(we.startsWith("data:")){const{ensureJpegDataUrl:me}=await mn(async()=>{const{ensureJpegDataUrl:ue}=await Promise.resolve().then(()=>Cj);return{ensureJpegDataUrl:ue}},void 0,import.meta.url);return await me(we)}if(we.startsWith("blob:")||we.startsWith("http"))try{const me=await As(we),ue=await se(me),{ensureJpegDataUrl:U}=await mn(async()=>{const{ensureJpegDataUrl:G}=await Promise.resolve().then(()=>Cj);return{ensureJpegDataUrl:G}},void 0,import.meta.url);return await U(ue)}catch(me){return console.error("[prepareImageForAPI] 转换失败:",me),we}return we};if(hl(E)){W=`${A}/v2/videos/generations`;const we=parseInt(String(k),10),Q=q!=="Auto"?q:"3:2",me=H!=="Auto"?H:"1080P",ue=Math.min(O.length,7);let U=(C||"").trim();if(ue>0&&!U?U=Array.from({length:ue},(G,te)=>`@img${te+1}`).join(" ")+" ":ue>0&&(U=C),M={model:I.modelName||"grok-video-3",prompt:U||"生成视频",ratio:Q,resolution:me},Number.isFinite(we)&&we>0&&(M.duration=we),ue>0){const G=await Promise.all(O.slice(0,7).map(async te=>{const ge=await ie(te,!0);return typeof ge=="string"?ge:await se(ge)}));M.images=G,console.log("[分镜表] Grok模型,已添加",G.length,"张参考图,prompt:",U)}}else if(pl(E)){W=`${A}${$x(E)}`;const we=q&&q!=="Auto"?q:"adaptive",me={"480P":"480p","720P":"720p","1080P":"1080p"}[H||"720P"]||"720p",ue=[{type:"text",text:C}];if(O.length>=2){const U=await ie(O[0],!0),G=await ie(O[1],!0);ue.push({type:"image_url",image_url:{url:typeof U=="string"?U:await se(U)},role:"first_frame"}),ue.push({type:"image_url",image_url:{url:typeof G=="string"?G:await se(G)},role:"last_frame"})}else if(O.length===1){const U=await ie(O[0],!0);ue.push({type:"image_url",image_url:{url:typeof U=="string"?U:await se(U)}})}M={model:I.modelName||"doubao-seedance-1-5-pro-251215",content:ue,ratio:we,duration:Math.min(12,Math.max(4,k)),resolution:me,watermark:!1,generate_audio:!0}}else if(dl(E)){W=`${A}/v2/videos/generations`;let we;if(q&&q!=="Auto")if(q==="16:9"||q==="9:16")we=q;else{const[le,fe]=q.split(":").map(Number);we=le/fe>1?"16:9":"9:16"}let Q=H&&H!=="Auto"?H:"720P";const me=Q==="1080P";me&&console.log("[分镜表] 1080P 分辨率,启用 enable_upsample");let ue=I.modelName||"veo3.1-components";const U=F&&O.length>=1&&O.length<=2,G=Cv(E),te=$5(E),ge=H==="4K"||Q==="4K",ne=H==="1080P"||Q==="1080P";if(te?(ue="veo3.1-fast",U?console.log(`[分镜表] Fast首尾帧模式(${O.length}张图)+ ${H||"默认"},使用 MODEL ID: ${ue}`):O.length>0?console.log(`[分镜表] Fast图生视频模式(${O.length}张图),使用 MODEL ID: ${ue}`):console.log(`[分镜表] Fast文生视频模式,使用 MODEL ID: ${ue}`)):U?G?ge?(ue="veo3.1-pro-4k",console.log(`[分镜表] Pro首尾帧模式(${O.length}张图)+ 4K,使用 MODEL ID: ${ue}`)):(ue="veo3.1-pro",console.log(`[分镜表] Pro首尾帧模式(${O.length}张图)+ ${H||"默认"},使用 MODEL ID: ${ue}`)):ge?(ue="veo3.1-4k",console.log(`[分镜表] 首尾帧模式(${O.length}张图)+ 4K,使用 MODEL ID: ${ue}`)):(ue="veo3.1",console.log(`[分镜表] 首尾帧模式(${O.length}张图)+ ${H||"默认"},使用 MODEL ID: ${ue}`)):O.length>0?G&&O.length===1?(ue=ge?"veo3.1-pro-4k":"veo3.1-pro",console.log(`[分镜表] Pro单图模式(1张图),分辨率: ${H||"Auto"},使用 MODEL ID: ${ue}`)):(ue=ge?"veo3.1-components-4k":"veo3.1-components",console.log(`[分镜表] 多图模式(${O.length}张图),分辨率: ${H||"Auto"},使用 MODEL ID: ${ue}`)):ge?(ue=G?"veo3.1-pro-4k":"veo3.1-components-4k",console.log(`[分镜表] 文生视频 + 4K,使用 MODEL ID: ${ue}`)):(ue=G?"veo3.1-pro":"veo3.1-components",console.log(`[分镜表] 文生视频,使用 MODEL ID: ${ue}`)),M={model:ue,prompt:C,resolution:Q,...we?{aspect_ratio:we}:{},...me?{enable_upsample:!0}:{},enhance_prompt:!1},O.length>0){const le=await Promise.all(O.map(async(fe,be)=>{console.log(`[分镜表] 处理Veo参考图 ${be+1}/${O.length}`);const de=await ie(fe,!0),$e=typeof de=="string"?de:await se(de);if(!$e.startsWith("data:image/"))throw console.error(`[分镜表] Veo参考图 ${be+1} 格式错误:`,$e.substring(0,50)),new Error(`图片 ${be+1} 格式错误`);return console.log(`[分镜表] Veo参考图 ${be+1} 处理完成,大小:`,($e.length/1024/1024).toFixed(2),"MB"),$e}));M.images=le,console.log("[分镜表] Veo图生视频模式(通过images参数),已添加",le.length,"张参考图"),console.log("[分镜表] 图片格式验证:",le.map((fe,be)=>({index:be,sizeMB:(fe.length/1024/1024).toFixed(2),mimeType:fe.substring(5,fe.indexOf(";"))})))}else console.log("[分镜表] Veo文生视频模式(无images参数)")}else if(Qd(E)){let we=A;A.includes("t8star")&&(console.log("[分镜表] Hailuo模型检测到错误URL,自动切换到 ai.comfly.chat"),we="https://ai.comfly.chat"),W=`${we}/minimax/v1/video_generation`;const Q={model:I.modelName||"MiniMax-Hailuo-2.3",prompt:C};q&&q!=="Auto"&&(Q.aspect_ratio=q);const me=O.length===2;let ue=H;if(me&&H!=="768P"&&H!=="1080P"&&H!=="Auto"&&(ue="768P",console.log("[分镜表] Hailuo首尾帧模式强制使用768P(原分辨率:",H,")")),k&&(Q.duration=k),ue!=="Auto"?Q.resolution=ue:Q.resolution="768P",O.length===2){console.log("[分镜表] Hailuo使用首尾帧模式,模型:",I.modelName,"分辨率:",Q.resolution);const[U,G]=await Promise.all(O.map(async te=>{const ge=await ie(te,!0);return typeof ge=="string"?ge:await se(ge)}));Q.first_frame_image=U,Q.last_frame_image=G}else if(O.length===1){console.log("[分镜表] Hailuo使用图生视频模式");const U=O[0],G=await ie(U,!0),te=typeof G=="string"?G:await se(G);Q.first_frame_image=te}else console.log("[分镜表] Hailuo使用文生视频模式");M=Q}else if(au(E)){const we=Sx(E),Q=!!z.wan26MultiShot,me=z.wan26AudioConfig||"none",ue=z.wan26AudioFile,U=z.wan26AudioSegment,G=z.resolution||z.wan26Resolution||"720P";we?W=`${A}/api/v1/services/aigc/video-generation/video-synthesis`:W=`${A}/v2/videos/generations`;let te={prompt:C};if(me==="upload"&&ue)try{const ge=await YP(ue,U||void 0,R,A);te.audio_url=ge}catch(ge){throw console.error("[分镜表] Wan 2.6 音频上传失败:",ge),new Error("音频上传失败,请重试或使用自动配乐")}if(O.length>0){const ge=O[0],ne=await ie(ge,!0);te.images=[typeof ne=="string"?ne:await se(ne)]}if(we){const ge={prompt:C};te.images&&te.images.length>0&&(ge.img_url=te.images[0]),te.audio_url&&(ge.audio_url=te.audio_url);const ne={resolution:G,prompt_extend:!0,duration:k};Q&&(ne.shot_type="multi"),te.audio_url||(me==="auto"||!me?we||(ne.audio=!0):me==="none"&&(ne.audio=!1)),M={model:I.modelName||"wan2.6-i2v-flash",input:ge,parameters:ne}}else M={model:"wan2.6-i2v",prompt:C,resolution:G,prompt_extend:!0,duration:k},Q&&(M.shot_type="multi"),te.images&&(M.images=te.images),te.audio_url?M.audio_url=te.audio_url:me==="auto"||!me?M.audio=!0:me==="none"&&(M.audio=!1)}else if(No(E)){W=`${A}/kling/v1/videos/omni-video`;const we=z.klingVideoUrl,Q=z.klingVideoReferType||"base",me=z.klingVideoKeepSound||"yes",ue=z.klingVideoSegment,U=z.klingImages,G=z.klingSubjects;let te=k;we&&Q==="base"&&ue&&(te=Math.round(ue.endTime-ue.startTime));const ge={model_name:"kling-video-o1",prompt:C,mode:"pro",aspect_ratio:q==="Auto"?"16:9":q,duration:String(te)};if(U&&U.length>0)ge.image_list=U.map(ne=>({image_url:ne.url}));else if(O.length>0){const ne=await Promise.all(O.map(async le=>{const fe=await ie(le,!0);return{image_url:typeof fe=="string"?fe:await se(fe)}}));ge.image_list=ne}G&&G.length>0&&(ge.element_list=G.map(ne=>({element_id:String(ne)}))),we&&(ge.video_list=[{video_url:we,refer_type:Q,keep_original_sound:me}]),M=ge}else{const we=A.includes("api.openai.com"),Q=q==="Auto"?"16:9":q,me=Q==="16:9"||Q==="9:16"?Q:"16:9";if(we){W=`${A}/videos`,Y=!0;const U=me==="9:16"?"720x1280":"1280x720",G=new FormData;if(G.append("model",I.modelName||"sora-2"),G.append("prompt",C),G.append("size",U),G.append("seconds",String(k)),O.length>0){const te=await As(O[0]);G.append("input_reference",te,"ref.png"),G.append("image",te,"ref.png"),console.log("[分镜表] Sora模型(官方),已添加参考图")}M=G}else{W=`${A}/v2/videos/generations`,Y=!1;const ue={model:I.modelName||"sora-2",prompt:C,aspect_ratio:me,duration:String(k)};if(O.length>0){const U=await Promise.all(O.slice(0,1).map(async G=>{const te=await ie(G,!0);return typeof te=="string"?te:await se(te)}));ue.images=U,console.log("[分镜表] Sora模型(第三方代理),图生视频已添加图片数据")}M=ue}}const oe=Y?{Authorization:`Bearer ${R}`}:{"Content-Type":"application/json",Authorization:`Bearer ${R}`};console.log("[分镜表] 发送API请求:",{endpoint:W,model:E,useMultipart:Y,hasImages:O.length>0,imageCount:O.length});const re=await fetch(W,{method:"POST",headers:oe,body:Y?M:JSON.stringify(M)});if(!re.ok){const we=await re.text();throw console.error("[分镜表] API错误:",{status:re.status,errorText:we}),new Error(`API请求失败: ${re.status} - ${we}`)}const ee=await re.json();console.log("[分镜表] API响应:",ee);const pe=((j=ee.data)==null?void 0:j.id)||ee.id||ee.task_id;if(pe)o(we=>we.map(Q=>Q.id===T?{...Q,status:"generating",progress:0,remoteTaskId:pe}:Q)),f(T,pe,A,R,E),console.log("[分镜表] 视频生成已提交,开始轮询:",{taskId:T,remoteTaskId:pe,model:E});else throw new Error("未获取到任务ID")}catch(k){console.error("[分镜表] 视频生成失败:",k);const W=k instanceof Error?k.message:"生成失败";o(M=>M.map(Y=>Y.id===T?{...Y,status:"failed",progress:0,errorMsg:W}:Y)),d(m,z.id,{status:"draft"}),l.current.delete(T),c.current.delete(T)}},[d,t,n,f,o]),g=_.useCallback(async(m,z,C,E)=>{var L,X,T,q,H,J,Z,B;const I=e.get(m);if(!I||I.type!=="storyboard-node")throw new Error("节点类型错误");if(!z.trim()){alert("请输入剧本文本");return}const R=E||"gemini-3-pro-preview",A=t.find(V=>V.type==="Chat"&&(V.id===R||V.modelName===R))||t.find(V=>V.type==="Chat"&&V.id==="gemini-3-pro")||t.find(V=>V.type==="Chat");if(!A){alert("请先配置 Chat API");return}const O=A.key||n;if(!O){alert("请先配置 API Key");return}const F=(A.url||"https://ai.comfly.chat").replace(/\/+$/,"");try{const N=`你是一个专业的分镜表生成助手。请分析用户提供的剧本,生成分镜表。 + +${C?`请生成 ${C.rows*C.cols} 个分镜镜头,按照 ${C.rows}x${C.cols} 的布局。`:"请根据剧本内容智能分析并生成合适数量的分镜镜头。"} + +请以JSON格式返回,格式如下: +{ + "shots": [ + { + "shot_number": 1, + "shot_size": "中景", + "description_zh": "镜头描述(中文)", + "description_en": "Shot description (English)", + "prompt": "详细的画面提示词,用于生成视频" + }, + // ... 更多镜头 + ] +}`,j=new AbortController,k=setTimeout(()=>j.abort(),12e4);let W;try{if(W=await fetch(`${F}/v1/chat/completions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${O}`},body:JSON.stringify({model:A.modelName||"gemini-3-pro-preview",messages:[{role:"system",content:N},{role:"user",content:z}],max_tokens:16e3,temperature:.7,stream:!1}),signal:j.signal}),clearTimeout(k),!W.ok){const U=await W.text();throw new Error(`API请求失败: ${W.status} - ${U}`)}}catch(U){if(clearTimeout(k),U instanceof Error){if(U.name==="AbortError")throw new Error("请求超时(120秒),请检查网络连接或稍后重试");if(U.message.includes("Failed to fetch")||U.message.includes("ERR_CONNECTION_CLOSED"))throw new Error(`网络连接失败: ${U.message}。请检查网络连接或API服务是否可用`);if(U.message.includes("NetworkError"))throw new Error(`网络错误: ${U.message}。请检查网络连接`)}throw U}const M=await W.json(),se=(((T=(X=(L=M.choices)==null?void 0:L[0])==null?void 0:X.message)==null?void 0:T.content)||((Z=(J=(H=(q=M.data)==null?void 0:q.choices)==null?void 0:H[0])==null?void 0:J.message)==null?void 0:Z.content)||M.content||"").match(/\{[\s\S]*\}/);if(!se)throw new Error("未找到JSON格式的分镜数据");const ie=se[0],re=JSON.parse(ie).shots||[];if(re.length===0)throw new Error("未生成任何分镜镜头");const ee=re.map((U,G)=>({id:`shot-${Date.now()}-${G}`,scene_index:G+1,time_range:"",image_url:"",description:U.description_zh||U.description_en||"",prompt:U.prompt||U.description_en||U.description_zh||"",camera:U.shot_size||"",tags:[],status:"draft",model:"sora-2",ratio:"16:9",duration:"15s"})),pe=ee.length;let we="auto";if(C)we=`${C.rows}x${C.cols}`;else{const U=Math.ceil(Math.sqrt(pe));we=`${Math.ceil(pe/U)}x${U}`}const Q={layout_specification:we,total_shots:pe,shots:re},me=JSON.stringify(Q,null,2),ue=((B=I.settings)==null?void 0:B.shots)||[];return i(m,{shots:[...ue,...ee],jsonData:me}),Q}catch(V){throw console.error("[Storyboard] 从剧本生成分镜失败:",V),V}},[e,t,n,i]),y=_.useCallback(async(m,z,C,E,I,R)=>{var B,V,N,j,k,W,M,Y;const A=e.get(m);if(!A||A.type!=="storyboard-chart-node")throw new Error("节点类型错误:请确保分镜图表节点已正确创建");if(!z.trim())throw new Error("请输入剧本文本");const O=I||"gemini-3-pro-preview",F=t.find(se=>se.type==="Chat"&&(se.id===O||se.modelName===O))||t.find(se=>se.type==="Chat");if(!F)throw new Error("请先配置 Chat API");const L=F.key||n;if(!L)throw new Error("请先配置 API Key");const X=(F.url||"https://ai.comfly.chat").replace(/\/+$/,""),T=R??C*E,q=R!=null?Math.ceil(R/3):C,H=R!=null?3:E,Z=`你是一个专业的分镜表生成助手。请分析用户提供的剧本,生成分镜表。 + +${R!=null?`请生成 ${T} 个分镜镜头,按照宫格排列(每行 3 个,从左到右、从上到下)。`:`请生成 ${T} 个分镜镜头,按照 ${C}x${E} 的宫格布局(从左到右、从上到下)。`} + +请以JSON格式返回,格式如下: +{ + "layout_specification": "${q}x${H}", + "total_shots": ${T}, + "shots": [ + { + "shot_number": 1, + "shot_size": "特写", + "description_zh": "镜头描述(中文)", + "description_en": "Shot description (English)", + "prompt": "详细的画面提示词,用于AI生成图片" + } + ] +}`;try{const se=new AbortController,ie=setTimeout(()=>se.abort(),12e4);let oe;try{if(oe=await fetch(`${X}/v1/chat/completions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${L}`},body:JSON.stringify({model:F.modelName||"gemini-3-pro-preview",messages:[{role:"system",content:Z},{role:"user",content:z}],max_tokens:16e3,temperature:.7,stream:!1}),signal:se.signal}),clearTimeout(ie),!oe.ok){const ge=await oe.text();throw new Error(`API请求失败: ${oe.status} - ${ge}`)}}catch(ge){throw clearTimeout(ie),ge instanceof Error&&ge.name==="AbortError"?new Error("请求超时(120秒),请检查网络连接或稍后重试"):ge}const re=await oe.json(),pe=(((N=(V=(B=re.choices)==null?void 0:B[0])==null?void 0:V.message)==null?void 0:N.content)||((M=(W=(k=(j=re.data)==null?void 0:j.choices)==null?void 0:k[0])==null?void 0:W.message)==null?void 0:M.content)||re.content||"").match(/\{[\s\S]*\}/);if(!pe)throw new Error("未找到JSON格式的分镜数据");const we=JSON.parse(pe[0]),Q=we.shots||[];if(Q.length===0)throw new Error("未生成任何分镜镜头");const me=R??(()=>{let ge=C,ne=E;const le=we.layout_specification;if(le&&/^\d+x\d+$/i.test(le)){const[fe,be]=le.split("x").map(Number);fe>=1&&fe<=12&&be>=1&&be<=12&&(ge=fe,ne=be)}return ge*ne})(),ue=((Y=A.settings)==null?void 0:Y.cells)||[],U=[];for(let ge=0;ge=1&&fe<=12&&be>=1&&be<=12&&(ge=fe,ne=be)}te.rows=ge,te.cols=ne}i(m,te)}catch(se){throw console.error("[Storyboard] 分镜图表从文本生成失败:",se),se}},[e,t,n,i]),w=_.useCallback(async(m,z,C)=>{var I;let E=e.get(m);if(!E||E.type!=="storyboard-node"){for(let R=0;R<3&&(await new Promise(A=>setTimeout(A,50)),E=e.get(m),!(E&&E.type==="storyboard-node"));R++);if(!E||E.type!=="storyboard-node")throw new Error("节点类型错误:请确保分镜节点已正确创建")}if(!z)throw new Error("请提供图片");try{const R=await fo(z,C.cols,C.rows),A=((I=E.settings)==null?void 0:I.shots)||[],O=A.length,F=(Z,B,V,N)=>{const j=Math.floor(Z/N)+1,k=Z%N+1,W=["左上","右上","左下","右下"],M=["Top Left","Top Right","Bottom Left","Bottom Right"];return B===4&&V===2&&N===2?{zh:`${W[Z]}区域 - 分解序列 ${Z+1}/${B}`,en:`${M[Z]} Area - Split Sequence ${Z+1}/${B}`}:{zh:`第${j}行第${k}列 - 分解序列 ${Z+1}/${B}`,en:`Row ${j} Col ${k} - Split Sequence ${Z+1}/${B}`}},L=R.map((Z,B)=>{const V=F(B,R.length,C.rows,C.cols);return{id:`shot-${Date.now()}-${B}`,scene_index:O+B+1,time_range:"",image_url:Z.url,description:V.zh,description_zh:V.zh,description_en:V.en,prompt:`Cinematic shot, ${V.en.toLowerCase()}, detailed composition, high quality`,tags:[],status:"draft",model:"sora-2",ratio:"16:9",duration:"15s",resolution:"1080P",shot_size:"中景 (Medium Shot)"}}),X=A.length+L.length,T=`${C.rows}x${C.cols}`,q=[...A,...L],H={layout_specification:T,total_shots:X,shots:q.map((Z,B)=>{const V=Z;return{shot_number:B+1,shot_size:V.shot_size||"中景 (Medium Shot)",description_zh:V.description_zh||V.description||"",description_en:V.description_en||V.description||"",prompt:V.prompt||"",image_url:V.image_url||"",model:V.model||"sora-2",ratio:V.ratio||"16:9",duration:V.duration||"15s",resolution:V.resolution||"1080P"}})},J=JSON.stringify(H,null,2);return i(m,{shots:q,jsonData:J}),console.log("[Storyboard] 图片拆解完成:",{totalShots:X,layoutSpec:T,newShotsCount:L.length}),L}catch(R){console.error("[Storyboard] 图片拆解失败:",R);const A=R instanceof Error?R.message:"拆解失败";throw alert(`拆解失败: ${A}`),R}},[e,i]),v=_.useCallback(async(m,z,C=4,E,I,R,A)=>{var J,Z,B,V,N,j,k,W;const O=e.get(m);if(!O||O.type!=="storyboard-node")throw new Error("节点类型错误");const F=z.prompt||z.description||"";if(!F.trim()){alert("镜头没有提示词,无法生成序列");return}let L=null;if(z.id&&A){A(m,z.id,{status:"generating",generatingProgress:10});let M=10;L=setInterval(()=>{z.id&&A&&(M+=10,M<90&&A(m,z.id,{generatingProgress:M}))},500)}const X=E||"gemini-3-pro-preview",T=t.find(M=>M.type==="Chat"&&(M.id===X||M.modelName===X))||t.find(M=>M.type==="Chat"&&M.id==="gemini-3-pro")||t.find(M=>M.type==="Chat");if(!T){alert("请先配置 Chat API");return}const q=T.key||n;if(!q){alert("请先配置 API Key");return}const H=(T.url||"https://ai.comfly.chat").replace(/\/+$/,"");try{const M=`你是一个专业的分镜序列生成助手。基于用户提供的单个镜头提示词,生成一个连贯的分镜序列。 + +请生成 ${C} 个分镜镜头,这些镜头应该: +1. 基于原始提示词进行扩展和变化 +2. 保持视觉连贯性和故事性 +3. 可以是同一场景的不同角度、不同景别,或者时间上的延续 + +请以JSON格式返回,格式如下: +{ + "shots": [ + { + "shot_number": 1, + "shot_size": "中景", + "description_zh": "镜头描述(中文)", + "description_en": "Shot description (English)", + "prompt": "详细的画面提示词,用于生成视频" + }, + // ... 更多镜头 + ] +}`,Y=await fetch(`${H}/v1/chat/completions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${q}`},body:JSON.stringify({model:T.modelName||"gemini-3-pro-preview",messages:[{role:"system",content:M},{role:"user",content:`原始镜头提示词: +${F} + +请基于此提示词生成 ${C} 个连贯的分镜镜头。`}],max_tokens:16e3,temperature:.7,stream:!1})});if(!Y.ok){const U=await Y.text();throw new Error(`API请求失败: ${Y.status} - ${U}`)}const se=await Y.json(),oe=(((B=(Z=(J=se.choices)==null?void 0:J[0])==null?void 0:Z.message)==null?void 0:B.content)||((k=(j=(N=(V=se.data)==null?void 0:V.choices)==null?void 0:N[0])==null?void 0:j.message)==null?void 0:k.content)||se.content||"").match(/\{[\s\S]*\}/);if(!oe)throw new Error("未找到JSON格式的分镜数据");const re=oe[0],pe=JSON.parse(re).shots||[];if(pe.length===0)throw new Error("未生成任何分镜镜头");L&&clearInterval(L);const we=((W=O.settings)==null?void 0:W.shots)||[];let Q,me;I!==void 0&&I>=0&&I({id:`shot-${Date.now()}-${G}`,scene_index:me+G+1,time_range:"",image_url:z.image_url||"",description:U.description_zh||U.description_en||"",prompt:U.prompt||U.description_en||U.description_zh||"",camera:U.shot_size||z.camera||"",tags:[],status:"draft",model:z.model||"sora-2",ratio:z.ratio||"16:9",duration:z.duration||"15s"}));if(R)ue.forEach((U,G)=>{U.scene_index=G+1});else{const U=[...we];U.splice(Q,0,...ue);for(let G=Q+ue.length;G{A&&A(m,z.id,{generatingProgress:0})},1e3)),ue}catch(M){throw console.error("[Storyboard] 从单镜头生成序列失败:",M),L&&clearInterval(L),z.id&&A&&A(m,z.id,{status:"draft",generatingProgress:0}),M}},[e,t,n,i]);return{importShotsFromAnalysis:u,updateShot:d,addEmptyShot:h,deleteShot:p,generateSingleShot:b,startVideoPolling:f,storyboardTaskMapRef:l,generateFromScript:g,generateFromScriptForChart:y,splitImageToShots:w,generateSequenceFromShot:v}};class KX{constructor(){Mn(this,"pool",[]);Mn(this,"maxSize",1e3)}acquire(t,n){const r=this.pool.pop();return r?(r.x=t,r.y=n,r):{x:t,y:n}}release(t){this.pool.lengththis.release(n))}clear(){this.pool=[]}getStats(){return{poolSize:this.pool.length,maxSize:this.maxSize}}}class XX{constructor(){Mn(this,"pool",[]);Mn(this,"maxSize",500)}acquire(t,n,r,i){const a=this.pool.pop();return a?(a.x=t,a.y=n,a.width=r,a.height=i,a):{x:t,y:n,width:r,height:i}}release(t){this.pool.length-1&&this.accessOrder.splice(r,1),this.accessOrder.push(t)}return n}set(t,n){if(this.cache.has(t)){const r=this.accessOrder.indexOf(t);r>-1&&this.accessOrder.splice(r,1),this.accessOrder.push(t),this.cache.set(t,n);return}if(this.cache.size>=this.maxSize){const r=this.accessOrder.shift();r&&this.cache.delete(r)}this.cache.set(t,n),this.accessOrder.push(t)}clear(){this.cache.clear(),this.accessOrder=[]}getStats(){return{cacheSize:this.cache.size,maxSize:this.maxSize}}}class JX{constructor(t=1e3){Mn(this,"positions");Mn(this,"nodeIdMap",new Map);Mn(this,"nextIndex",0);Mn(this,"capacity");this.capacity=t,this.positions=new Float32Array(t*4)}setPosition(t,n,r,i,a){let o=this.nodeIdMap.get(t);o===void 0&&(this.nextIndex>=this.capacity&&this.expand(),o=this.nextIndex++,this.nodeIdMap.set(t,o));const l=o*4;this.positions[l]=n,this.positions[l+1]=r,this.positions[l+2]=i,this.positions[l+3]=a}getPosition(t){const n=this.nodeIdMap.get(t);if(n===void 0)return null;const r=n*4;return{x:this.positions[r],y:this.positions[r+1],width:this.positions[r+2],height:this.positions[r+3]}}removeNode(t){this.nodeIdMap.delete(t)}expand(){const t=this.capacity*2,n=new Float32Array(t*4);n.set(this.positions),this.positions=n,this.capacity=t,console.log(`[NodePositionArray] Expanded to ${t} nodes`)}clear(){this.nodeIdMap.clear(),this.nextIndex=0,this.positions.fill(0)}getStats(){return{nodeCount:this.nodeIdMap.size,capacity:this.capacity,memoryUsage:this.positions.byteLength}}}const ZX=new KX,QX=new XX,a$=new YX,eY=new JX;typeof window<"u"&&(window.objectPools={position:ZX,boundingBox:QX,pathString:a$,nodePosition:eY});const Dx=new Map,Co=new Map,fC=new Map;let I2=null;typeof window<"u"&&(window.debugNodeCache=Co);const o$=e=>{try{const t=new DOMMatrix(e.style.transform||"matrix(1, 0, 0, 1, 0, 0)");return{x:t.e,y:t.f}}catch{const t=e.style.transform,n=t==null?void 0:t.match(/translate3d\(([^,]+)px,\s*([^,]+)px/);return{x:n?parseFloat(n[1]):0,y:n?parseFloat(n[2]):0}}},tY=(e,t,n=1)=>{if(t){Dx.set(e,t);const r=t.getBoundingClientRect(),i=o$(t),a=n>0?n:1;let o=r.width/a,l=r.height/a;if(o<10||l<10){const c=t.style.width,u=t.style.height;c&&c!=="auto"&&(o=parseFloat(c)||260),u&&u!=="auto"&&(l=parseFloat(u)||260),o<10&&(o=t.offsetWidth/a||260),l<10&&(l=t.offsetHeight/a||260)}Co.set(e,{x:i.x,y:i.y,width:o,height:l})}else Dx.delete(e),Co.delete(e)},nY=e=>{Dx.delete(e),Co.delete(e)},fO=(e,t,n)=>{const r=Co.get(e);r&&(r.width=t,r.height=n)},cv=(e,t,n)=>{const r=Co.get(e);r?(r.x=t,r.y=n):Co.set(e,{x:t,y:n,width:260,height:260})},l$=e=>Co.get(e)||null,rY=(e,t,n,r)=>{const i=`${Math.round(e)},${Math.round(t)},${Math.round(n)},${Math.round(r)}`,a=a$.get(i);if(a)return a;const o=Math.max(Math.abs(n-e)*.5,50),l=`M ${e} ${t} C ${e+o} ${t}, ${n-o} ${r}, ${n} ${r}`;return a$.set(i,l),l},Jd=(e,t,n,r,i,a,o)=>{var c;if(!n||e.length===0)return;const l=r!==void 0?r:t.zoom;I2!==null&&Math.abs(I2-l)>1e-6&&Co.clear(),I2=l;for(const u of e){const d=o==null?void 0:o.get(u.from);let h=Co.get(u.from);if(d)h={x:d.output.x-1,y:d.output.y-.5,width:1,height:1};else if(i===u.from&&a){const E=Co.get(u.from);h={x:a.x,y:a.y,width:(E==null?void 0:E.width)||260,height:(E==null?void 0:E.height)||260},Co.set(u.from,h)}else if(!h){const E=Dx.get(u.from)||document.querySelector(`[data-node-id="${u.from}"]`);if(E){const I=o$(E),R=E.getBoundingClientRect(),A=l>0?l:1;h={x:I.x,y:I.y,width:R.width/A,height:R.height/A},Co.set(u.from,h)}}const p=o==null?void 0:o.get(u.to);let f=Co.get(u.to);if(p)f={x:p.input.x,y:p.input.y-.5,width:1,height:1};else if(i===u.to&&a){const E=Co.get(u.to);f={x:a.x,y:a.y,width:(E==null?void 0:E.width)||260,height:(E==null?void 0:E.height)||260},Co.set(u.to,f)}else if(!f){const E=Dx.get(u.to)||document.querySelector(`[data-node-id="${u.to}"]`);if(E){const I=o$(E),R=E.getBoundingClientRect(),A=l>0?l:1;f={x:I.x,y:I.y,width:R.width/A,height:R.height/A},Co.set(u.to,f)}}if(!h||!f)continue;const b=0,g=0,y=(h.x+h.width)*l+t.x;let w=(h.y+h.height/2)*l+t.y+g;const v=f.x*l+t.x;let m=(f.y+f.height/2)*l+t.y+b;const z=rY(y,w,v,m),C=n.querySelector(`[data-connection-id="${u.id}"]`);if(C)C.querySelectorAll("path").forEach(I=>{I.setAttribute("d",z)});else{let E=fC.get(u.id);if(E||(E=n.querySelector(`[data-connection-id="${u.id}"] path.edge-main`),E&&fC.set(u.id,E)),E){E.setAttribute("d",z);const I=(c=E.parentElement)==null?void 0:c.querySelector(".edge-hit-path");I&&I.setAttribute("d",z)}}}};class H5{constructor(t=""){Mn(this,"prefix");this.prefix=t}debug(...t){}info(...t){}warn(...t){console.warn(this.prefix,...t)}error(...t){console.error(this.prefix,...t)}child(t){return new H5(`${this.prefix}[${t}]`)}}function G5(e){return new H5(`[${e}]`)}const sY=1e3/60,iY=5e3;let rm=null,mC=0;function aY(){return new Promise(e=>{const t=[];let n=performance.now(),r;const i=()=>{const a=performance.now(),o=a-n;if(n=a,o>0&&o<100&&t.push(o),t.length>=10){cancelAnimationFrame(r);const l=t.reduce((c,u)=>c+u,0)/t.length;e(Math.round(l*100)/100)}else r=requestAnimationFrame(i)};r=requestAnimationFrame(i)})}async function mO(){const e=Date.now();if(rm!==null&&e-mC{}),sY)}typeof window<"u"&&requestAnimationFrame(()=>{mO().then(e=>{e<14&&console.log("[DisplayRefreshRate] 检测到高刷屏,帧间隔约",e.toFixed(1),"ms")})});function lY(e){const t=oY();return Math.min(e,Math.ceil(t))}class cY{constructor(){Mn(this,"networkStatus",{isBusy:!1,activeRequests:0,lastUpdateTime:Date.now()});Mn(this,"originalFetch",window.fetch);Mn(this,"requestMap",new Map);Mn(this,"busyThreshold",3);Mn(this,"autoPresetEnabled",!0);Mn(this,"currentPreset","balanced");Mn(this,"edgeUpdateThrottleId",null);Mn(this,"userManualPreset",null);Mn(this,"idleDebounceTimer",null);this.initNetworkMonitoring()}initNetworkMonitoring(){window.fetch=(...t)=>{const n=t[0],r=typeof n=="string"?n:(n==null?void 0:n.url)??"";if(r.startsWith("data:")&&r.includes(";base64,")){const a=r.replace(/;base64,\s+/,";base64,");a!==r&&(t=[a,...t.slice(1)])}const i=this.originalFetch.apply(window,t);return r.startsWith("blob:")||(this.requestMap.set(i,Date.now()),this.updateNetworkStatus(),i.then(()=>{this.requestMap.delete(i),this.updateNetworkStatus()}).catch(()=>{this.requestMap.delete(i),this.updateNetworkStatus()})),i},this.debugLog("[ConnectionLineOptimizer] Network monitoring initialized")}debugLog(...t){}updateNetworkStatus(){const t=this.requestMap.size,n=this.networkStatus.isBusy,r=t>=this.busyThreshold;this.networkStatus={isBusy:r,activeRequests:t,lastUpdateTime:Date.now()},n!==r&&this.autoPresetEnabled&&this.handleNetworkStatusChange(r)}handleNetworkStatusChange(t){if(this.userManualPreset===null)if(t)this.idleDebounceTimer!==null&&(clearTimeout(this.idleDebounceTimer),this.idleDebounceTimer=null),this.debugLog("[ConnectionLineOptimizer] Network busy detected, switching to speed-first"),this.switchPreset("speed-first");else{if(this.idleDebounceTimer!==null)return;this.idleDebounceTimer=window.setTimeout(()=>{this.idleDebounceTimer=null,this.debugLog("[ConnectionLineOptimizer] Network idle (debounced), restoring to balanced"),this.switchPreset("balanced")},400)}}switchPreset(t,n=!1){if(this.currentPreset===t)return;this.currentPreset=t,n||zy(t);const r=new CustomEvent("performancePresetChanged",{detail:{preset:t,isBusy:this.networkStatus.isBusy}});window.dispatchEvent(r)}getNetworkStatus(){return{...this.networkStatus}}setAutoPresetEnabled(t){this.autoPresetEnabled=t,this.debugLog(`[ConnectionLineOptimizer] Auto preset: ${t?"enabled":"disabled"}`)}switchToPreset(t){this.userManualPreset=t,this.debugLog(`[ConnectionLineOptimizer] User manual preset set to: ${t}, userManualPreset: ${this.userManualPreset}, currentPreset: ${this.currentPreset}`),this.switchPreset(t,!1)}clearUserManualPreset(){this.userManualPreset=null,this.debugLog("[ConnectionLineOptimizer] User manual preset cleared, auto switch enabled")}pauseConnectionAnimations(){cP().enableConnectionAnimations&&(zy("speed-first"),this.debugLog("[ConnectionLineOptimizer] Connection animations paused"))}resumeConnectionAnimations(){this.networkStatus.isBusy||(zy(this.currentPreset),this.debugLog("[ConnectionLineOptimizer] Connection animations resumed"))}throttleEdgeUpdate(t,n=16){this.edgeUpdateThrottleId!==null&&cancelAnimationFrame(this.edgeUpdateThrottleId),this.edgeUpdateThrottleId=requestAnimationFrame(()=>{t(),this.edgeUpdateThrottleId=null})}getCurrentPreset(){return this.currentPreset}isConnectionAnimationsEnabled(){return IH()}}const Gd=new cY,gC=25,ph=8;function xC(e){return Math.round(e/gC)*gC}function gO(e,t,n,r,i,a){let o=e,l=t;const c=[],u=o,d=o+n,h=l,p=l+r,f=o+n/2,b=l+r/2,g=(O,F)=>({sx:O*a.zoom+a.x,sy:F*a.zoom+a.y}),y=xC(o),w=xC(l);Math.abs(o-y){const Ce=_.useRef({x:0,y:0}),xe=_.useRef(!1),Ne=_.useRef({x:0,y:0}),ve=_.useRef(!1),ke=_.useRef({x:0,y:0}),Ie=_.useRef(null);_.useRef(null);const Pe=t,Te=_.useRef(null),Be=_.useRef(null),He=_.useRef(!1),Je=_.useRef(null),Me=_.useRef(null),Re=_.useRef(null),Ve=_.useRef(null),Ze=_.useRef(new Map),je=_.useRef(null),Le=_.useRef(null),Xe=_.useRef(null),qe=_.useRef(null),tt=_.useRef(null),Ye=_.useRef(null),ct=_.useRef(new Map),pt=_.useRef(null),ht=_.useRef(0),wt=AH(),$t=MH(),jt=_.useCallback(()=>lY(wt),[wt]),Nt=_.useCallback((Ae,nt)=>{const _t=Date.now(),xt=jt();_t-ht.current{Pe.current={x:e.x,y:e.y,zoom:e.zoom}},[e.x,e.y,e.zoom]),_.useEffect(()=>{fn.current=X,X&&(Dn.current=!1)},[X]),_.useEffect(()=>{const Ae=new Map;for(const nt of r)Ae.set(nt.id,nt);Ze.current=Ae},[r]);const it=_.useCallback(()=>{var nt;if(Re.current)return Re.current;const Ae=(nt=c.current)==null?void 0:nt.getBoundingClientRect();return Ae?(Re.current={left:Ae.left,top:Ae.top,width:Ae.width,height:Ae.height},Re.current):null},[c]),Lt=_.useCallback(()=>{var nt;const Ae=(nt=c.current)==null?void 0:nt.getBoundingClientRect();Ae&&(Re.current={left:Ae.left,top:Ae.top,width:Ae.width,height:Ae.height})},[c]),gt=_.useCallback(()=>{Re.current=null},[]),Jt=_.useCallback(Ae=>{Ae.preventDefault(),Ae.stopPropagation(),(a.size>0||i)&&de({visible:!0,x:Ae.clientX,y:Ae.clientY})},[a,i,de]),Wt=_.useCallback(Ae=>{if(!(Ae.button!==0&&Ae.button!==1)&&(typeof window<"u"&&window.dispatchEvent(new CustomEvent("canvasActivity")),Ae.currentTarget.id==="canvas-bg")){const nt=Ae.target;if(!nt.closest(".node-wrapper")){const Tt=document.activeElement;Tt&&Tt.closest(".node-wrapper")&&(Tt.tagName==="TEXTAREA"||Tt.tagName==="INPUT"||Tt.tagName==="SELECT"||Tt.isContentEditable)&&Tt.blur()}const _t=window.getSelection();if(_t&&_t.toString().length>0)if(!nt.closest(".node-wrapper"))_t.removeAllRanges();else return;if(nt.closest('button, input, img, .clickable-area, .edge-hit-path, .edge-delete-btn, .mj-grid-quadrant, textarea, select, [contenteditable="true"], video, .node-dropdown-button, .node-dropdown-menu, [data-chart-row-col]')||nt&&(nt.tagName==="INPUT"||nt.tagName==="TEXTAREA"||nt.tagName==="SELECT"||nt.tagName==="BUTTON"||nt.isContentEditable||nt.closest('input, textarea, select, button, [contenteditable="true"]'))||nt.closest(".node-wrapper")||nt.closest(".connector")||nt.closest("[data-image-reorder-thumb]")||Ae.altKey)return;if(Ae.button===0&&(Ae.ctrlKey||Ae.metaKey)){Ae.preventDefault(),ee(!1),xe.current=!1,ue(!0),h.current=!0,Pe.current={x:e.x,y:e.y,zoom:e.zoom},Lt();const Tt=Re.current,St=Ae.clientX-((Tt==null?void 0:Tt.left)||0),Qe=Ae.clientY-((Tt==null?void 0:Tt.top)||0);Me.current={endX:St,endY:Qe},U({startX:St,startY:Qe,endX:St,endY:Qe}),Y(new Set),M(null),oe==null||oe(),se==null||se(null),v==null||v(),document.body.classList.add("canvas-interacting");return}if(z!=null&&z.current)return;Ae.preventDefault(),Be.current={x:Ae.clientX,y:Ae.clientY},Ce.current={x:Ae.clientX,y:Ae.clientY},Pe.current={x:e.x,y:e.y,zoom:e.zoom},Lt(),M(null),Y(new Set),se==null||se(null),oe==null||oe()}},[c,h,z,ue,U,Y,M,se,e.x,e.y,e.zoom,Lt,oe]);_.useEffect(()=>{const Ae=nt=>{nt.button===1&&(nt.preventDefault(),nt.stopPropagation(),He.current=!0,Be.current=null,xe.current=!0,ve.current=!1,ee(!0),h.current&&(h.current=!1,ue(!1),U(null)),Ce.current={x:nt.clientX,y:nt.clientY},Lt(),v==null||v(),Gd.pauseConnectionAnimations(),document.body.classList.add("canvas-interacting"))};return window.addEventListener("mousedown",Ae,!0),()=>window.removeEventListener("mousedown",Ae,!0)},[Lt,v,ee,ue,U]);const Pt=_.useCallback(Ae=>{var _t,xt;if(q||H||Ae.__handledByNode||Ae.__handledByContent||Ae.defaultPrevented||Ae.isPropagationStopped())return;const nt=Ae.target;if(!(nt.closest(".sidebar")||nt.closest(".toolbar")||nt.closest(".panel")||nt.closest("button")||nt.closest("input")||nt.closest("select")||nt.closest("textarea")||nt.closest('[role="dialog"]')||nt.closest('[role="menu"]'))&&Ae.currentTarget.id==="canvas-bg"){const Tt=Ae.target,St=Tt.closest(".node-wrapper"),Qe=Tt.closest("[data-node-id]"),Ue=Tt.closest("[data-node-type]");if(St||Qe||Ue){const lt=(St==null?void 0:St.getAttribute("data-node-id"))||(Qe==null?void 0:Qe.getAttribute("data-node-id"))||(Ue==null?void 0:Ue.getAttribute("data-node-id"));if(lt){const ot=Ze.current.get(lt);if(ot&&ot.content&&Ee){Ee({id:ot.id,type:ot.type,content:ot.content,settings:ot.settings});return}}return}if(Tt===Ae.currentTarget||Tt.id==="canvas-bg"){const lt=(_t=c.current)==null?void 0:_t.getBoundingClientRect();if(!lt)return;const ot=(Ae.clientX-lt.left-e.x)/e.zoom,At=(Ae.clientY-lt.top-e.y)/e.zoom;let kt;for(const Ot of Ze.current.values())if(ot>=Ot.x&&ot<=Ot.x+Ot.width&&At>=Ot.y&&At<=Ot.y+Ot.height){kt=Ot;break}if(kt){kt.content&&Ee&&Ee({id:kt.id,type:kt.type,content:kt.content,settings:kt.settings});return}}const Ge=(xt=c.current)==null?void 0:xt.getBoundingClientRect();if(!Ge)return;const at=(Ae.clientX-Ge.left-e.x)/e.zoom,rt=(Ae.clientY-Ge.top-e.y)/e.zoom;be({visible:!0,x:Ae.clientX,y:Ae.clientY,worldX:at,worldY:rt})}},[e,c,be,l,q,H]),Bt=_.useCallback(Ae=>{var Tt;const nt=Pe.current,_t=it();if(_t){const St=(Ae.clientX-_t.left-nt.x)/nt.zoom,Qe=(Ae.clientY-_t.top-nt.y)/nt.zoom;if(d.current={x:St,y:Qe},q){const Ue=Ze.current.get(q);if(Ue&&f.current){const Ge=(Ue.x+Ue.width)*nt.zoom+nt.x,at=(Ue.y+Ue.height/2)*nt.zoom+nt.y,rt=St*nt.zoom+nt.x,lt=Qe*nt.zoom+nt.y;g(f.current,Ge,at,rt,lt),Ve.current={x:Ae.clientX,y:Ae.clientY}}}else if(H){const Ue=Ze.current.get(H);if(Ue&&b.current){const Ge=Ue.x*nt.zoom+nt.x,at=(Ue.y+Ue.height/2)*nt.zoom+nt.y,rt=St*nt.zoom+nt.x,lt=Qe*nt.zoom+nt.y;g(b.current,Ge,at,rt,lt),Ve.current={x:Ae.clientX,y:Ae.clientY}}}}if(Be.current&&!xe.current){const St=Be.current,Qe=Ae.clientX-St.x,Ue=Ae.clientY-St.y;if(Qe*Qe+Ue*Ue>=bC*bC){if(Be.current=null,xe.current=!0,ve.current=!1,ee(!0),Pe.current={x:Pe.current.x+Qe,y:Pe.current.y+Ue,zoom:Pe.current.zoom},Ce.current={x:Ae.clientX,y:Ae.clientY},u.current){const lt=Pe.current;u.current.style.transform=`translate3d(${lt.x}px, ${lt.y}px, 0) scale(${lt.zoom})`}const Ge=document.querySelector("[data-canvas-bg]");if(Ge){const lt=Pe.current;Ge.style.backgroundPosition=`${lt.x}px ${lt.y}px`}const at=w.current,rt=y.current;at&&at.length>0&&rt&&Jd(at,Pe.current,rt,Pe.current.zoom,void 0,void 0,E==null?void 0:E.current),v==null||v(),Gd.pauseConnectionAnimations(),document.body.classList.add("canvas-interacting")}}if(xe.current){const St=Ae.clientX-Ce.current.x,Qe=Ae.clientY-Ce.current.y;Ce.current={x:Ae.clientX,y:Ae.clientY},Pe.current={x:Pe.current.x+St,y:Pe.current.y+Qe,zoom:Pe.current.zoom},Te.current===null&&(Te.current=requestAnimationFrame(()=>{Te.current=null;const Ue=Pe.current;if(ve.current)return;u.current&&(u.current.style.transform=`translate3d(${Ue.x}px, ${Ue.y}px, 0) scale(${Ue.zoom})`);const Ge=document.querySelector("[data-canvas-bg]");Ge&&(Ge.style.backgroundPosition=`${Ue.x}px ${Ue.y}px`);const at=w.current,rt=y.current;at&&at.length>0&&rt&&Jd(at,Ue,rt,Ue.zoom,void 0,void 0,E==null?void 0:E.current)}));return}if(O||h.current){const St=Re.current,Qe=Ae.clientX-((St==null?void 0:St.left)||0),Ue=Ae.clientY-((St==null?void 0:St.top)||0);Me.current={endX:Qe,endY:Ue},F&&(n!=null&&n.current?Je.current||(Je.current=requestAnimationFrame(()=>{Je.current=null;const Ge=Me.current;if(!Ge||!(n!=null&&n.current))return;const{startX:at,startY:rt}=F,lt=Math.min(at,Ge.endX),ot=Math.min(rt,Ge.endY),At=Math.abs(Ge.endX-at),kt=Math.abs(Ge.endY-rt),Ot=n.current;Ot.style.left=`${lt}px`,Ot.style.top=`${ot}px`,Ot.style.width=`${At}px`,Ot.style.height=`${kt}px`})):U({...F,endX:Qe,endY:Ue}));return}const xt=tt.current||L;if(xt){const St=Pe.current.zoom,Qe=o.current,Ue=(Ae.clientX-Ne.current.x)/St,Ge=(Ae.clientY-Ne.current.y)/St;if(Qe&&Qe.size>1&&Qe.has(xt)){if(!p.current){l.current;const dn=new Map;ct.current.clear(),Qe.forEach(Vt=>{const Zt=Ze.current.get(Vt);if(Zt){dn.set(Vt,{x:Zt.x,y:Zt.y});const Sn=document.querySelector(`[data-node-id="${Vt}"]`);Sn&&ct.current.set(Vt,Sn)}}),p.current={mouseX:Ae.clientX,mouseY:Ae.clientY,nodes:dn}}const rt=p.current,lt=(Ae.clientX-rt.mouseX)/St,ot=(Ae.clientY-rt.mouseY)/St;je.current||(je.current=new Map);let At=new Map;rt.nodes.forEach((dn,Vt)=>{const Zt=dn.x+lt,Sn=dn.y+ot;At.set(Vt,{x:Zt,y:Sn})});let kt=[];if(I&&At.size>0){const dn=new Set(At.keys()),Vt=new Set(Ze.current.keys());dn.forEach(Sn=>Vt.delete(Sn));const Zt=uY(At,Ze.current,Vt,Pe.current);At=Zt.positions,kt=Zt.guides}pt.current=kt,At.forEach((dn,Vt)=>je.current.set(Vt,dn));const Ot=je.current;Ot&&Ot.forEach((dn,Vt)=>{const Zt=ct.current.get(Vt);Zt&&(Zt.style.willChange="transform",Zt.style.transform=`translate3d(${dn.x}px, ${dn.y}px, 0)`)}),Xe.current===null&&(Xe.current=requestAnimationFrame(()=>{Xe.current=null;const dn=je.current;dn&&(dn.forEach((Vt,Zt)=>{cv(Zt,Vt.x,Vt.y)}),Nt(),R==null||R(pt.current??[]))})),Yt.current&&clearTimeout(Yt.current),Yt.current=window.setTimeout(()=>{if(je.current&&je.current.size>0){const dn=je.current;if(k(Zt=>Zt.map(Sn=>{const jn=dn.get(Sn.id);return jn?{...Sn,x:jn.x,y:jn.y}:Sn})),(tt.current||L)&&o.current){const Zt=new Map;o.current.forEach(Sn=>{const jn=dn.get(Sn);jn&&Zt.set(Sn,jn)}),je.current=Zt.size>0?Zt:null}else je.current=null}Yt.current=null},$t)}else{qe.current||(qe.current=document.querySelector(`[data-node-id="${xt}"]`)),je.current||(je.current=new Map);let at=ke.current.x+Ue,rt=ke.current.y+Ge,lt=[];if(I){const ot=Ze.current.get(xt);if(ot){const At=Array.from(Ze.current.values()).filter(Ot=>Ot.id!==xt),kt=gO(at,rt,ot.width,ot.height,At,Pe.current);at=kt.x,rt=kt.y,lt=kt.guides}}if(pt.current=lt,je.current.set(xt,{x:at,y:rt}),qe.current){const ot=qe.current;ot.style.willChange="transform",ot.style.transform=`translate3d(${at}px, ${rt}px, 0)`}Xe.current===null&&(Xe.current=requestAnimationFrame(()=>{Xe.current=null;const ot=je.current,At=ot==null?void 0:ot.get(xt);At!=null&&(cv(xt,At.x,At.y),Nt(xt,{x:At.x,y:At.y})),R==null||R(pt.current??[])})),Yt.current&&clearTimeout(Yt.current),Yt.current=window.setTimeout(()=>{if(je.current&&je.current.size>0){const ot=je.current;k(kt=>kt.map(Ot=>{const dn=ot.get(Ot.id);return dn?{...Ot,x:dn.x,y:dn.y}:Ot}));const At=tt.current||L;if(At){const kt=ot.get(At);kt?je.current=new Map([[At,kt]]):je.current=null}else je.current=null}Yt.current=null},$t)}}if(X&&T){const St=it();if(St){const Qe=Pe.current,Ue=(Ae.clientX-St.left-Qe.x)/Qe.zoom,Ge=(Ae.clientY-St.top-Qe.y)/Qe.zoom,at=document.querySelector(`[data-node-id="${X}"]`),rt=Ze.current.get(X);if(at&&rt){if(!un.current){const Xn=at.style.transform.match(/translate3d\(([^,]+)px,\s*([^,]+)px/),$r=Xn?parseFloat(Xn[1]):rt.x,Tr=Xn?parseFloat(Xn[2]):rt.y,kr=parseInt(at.style.width)||at.offsetWidth||rt.width,Rr=parseInt(at.style.height)||at.offsetHeight||rt.height;un.current={x:$r,y:Tr,width:kr,height:Rr},Tn.current={horizontal:T.horizontal,vertical:T.vertical}}const lt=un.current,ot=lt.x+lt.width,At=lt.y+lt.height,kt=lt.y,Ot=lt.x;let dn=lt.x,Vt=lt.y,Zt=lt.width,Sn=lt.height;const jn=T.horizontal==="left"&&T.vertical==="none"||T.horizontal==="none"&&T.vertical==="top"||T.horizontal==="left"&&T.vertical==="top"||T.horizontal==="right"&&T.vertical==="top",_n=T.horizontal==="left"&&T.vertical==="bottom";jn?(T.horizontal==="left"?(Zt=Math.max(250,ot-Ue),dn=ot-Zt):T.horizontal==="right"&&(Zt=Math.max(250,Ue-Ot),dn=Ot),T.horizontal==="none"&&(Zt=lt.width,dn=lt.x),T.vertical==="top"&&(Sn=Math.max(250,At-Ge),Vt=At-Sn),T.vertical==="none"&&(Sn=lt.height,Vt=lt.y)):_n?(Zt=Math.max(250,ot-Ue),dn=ot-Zt,Sn=Math.max(250,Ge-kt),Vt=kt):(T.horizontal==="right"&&(Zt=Math.max(250,Ue-lt.x),dn=lt.x),T.vertical==="bottom"&&(Sn=Math.max(250,Ge-lt.y),Vt=lt.y));const Cn=(Tt=rt.settings)==null?void 0:Tt.imageSize;if(rt.type==="input-image"&&Cn&&typeof Cn=="string"){const Kn=Cn.match(/^(\d+)[×xX](\d+)$/);if(Kn){const Xn=parseInt(Kn[1],10),$r=parseInt(Kn[2],10);if(Xn>0&&$r>0){const Tr=Xn/$r,kr=150;jn?T.horizontal==="left"&&T.vertical==="none"?(Sn=Math.max(kr,Math.round(Zt/Tr)),Vt=At-Sn):T.vertical==="top"&&T.horizontal==="none"?(Zt=Math.max(kr,Math.round(Sn*Tr)),dn=ot-Zt):(T.horizontal==="left"||T.vertical==="top")&&(Zt=Math.max(kr,ot-dn),Sn=Math.max(kr,Math.round(Zt/Tr)),Vt=At-Sn,T.horizontal==="left"&&(dn=ot-Zt)):_n?(Zt=Math.max(kr,ot-dn),Sn=Math.max(kr,Math.round(Zt/Tr)),Vt=kt,dn=ot-Zt):T.horizontal!=="none"&&T.vertical!=="none"||T.horizontal!=="none"?Sn=Math.max(kr,Math.round(Zt/Tr)):T.vertical!=="none"&&(Zt=Math.max(kr,Math.round(Sn*Tr)))}}}at.style.width=`${Zt}px`,at.style.height=`${Sn}px`,at.style.transform=`translate3d(${Math.round(dn)}px, ${Math.round(Vt)}px, 0)`,cv(X,dn,Vt),fO(X,Zt,Sn),Ht.current={x:dn,y:Vt,width:Zt,height:Sn},Nt(X,{x:dn,y:Vt})}}}},[L,O,X,T,F,n,c,d,h,o,l,p,q,H,g,w,y,it,ee,v,E,u,I,R]);_.useEffect(()=>()=>{Ie.current&&cancelAnimationFrame(Ie.current),Le.current&&cancelAnimationFrame(Le.current),Xe.current&&cancelAnimationFrame(Xe.current),Te.current&&cancelAnimationFrame(Te.current),Yt.current&&(clearTimeout(Yt.current),Yt.current=null)},[]),_.useEffect(()=>{const Ae=()=>{Be.current&&!xe.current&&(Be.current=null)};return window.addEventListener("mouseup",Ae,!0),()=>window.removeEventListener("mouseup",Ae,!0)},[]);const zt=_.useCallback(()=>{var Ue;const Ae=fn.current;if(!Ae||Dn.current)return;Dn.current=!0;const nt=document.querySelector(`[data-node-id="${Ae}"]`),_t=Ht.current;let xt,Tt,St,Qe;if(nt){xt=parseInt(nt.style.width)||250,Tt=parseInt(nt.style.height)||250;const Ge=(Ue=nt.style.transform)==null?void 0:Ue.match(/translate3d\(([^,]+)px,\s*([^,]+)px/);St=Ge?parseFloat(Ge[1]):void 0,Qe=Ge?parseFloat(Ge[2]):void 0}else _t?(xt=_t.width,Tt=_t.height,St=_t.x,Qe=_t.y):(xt=250,Tt=250);(nt||_t)&&k(Ge=>Ge.map(at=>at.id!==Ae?at:{...at,...St!==void 0&&{x:St},...Qe!==void 0&&{y:Qe},width:xt,height:Tt,settings:{...at.settings,hasCustomSize:!0,savedNodeWidth:xt,savedNodeHeight:Tt}})),Q(null),me(null),un.current=null,Tn.current=null,Ht.current=null,Dn.current=!1},[k,Q,me]);_.useEffect(()=>{if(!X)return;const Ae=()=>{zt()};return window.addEventListener("mouseup",Ae,!0),()=>window.removeEventListener("mouseup",Ae,!0)},[X,zt]);const Gt=_.useCallback(Ae=>{var Tt,St;const nt=xe.current;if(m==null||m(),Gd.resumeConnectionAnimations(),nt||document.body.classList.remove("canvas-interacting"),gt(),Te.current&&(cancelAnimationFrame(Te.current),Te.current=null),Be.current=null,Z&&Z.length>0&&Ae){const Ue=Ae.target.closest(".node-wrapper");if(Ue){const Ge=Ue.getAttribute("data-node-id");if(console.log(`[handleCanvasMouseUp] multi-connect to node: ${Ge}`),Ge){const at=Z.filter(rt=>rt!==Ge);if(at.length>0){const rt=at.map(lt=>({id:_e(),from:lt,to:Ge}));W(lt=>[...lt,...rt])}}le&&le(null),fe&&fe(null)}else{console.log("[handleCanvasMouseUp] multi-connect to blank, showing menu");const Ge=(Tt=c.current)==null?void 0:Tt.getBoundingClientRect();if(Ge){const at=(Ae.clientX-Ge.left-Pe.current.x)/Pe.current.zoom,rt=(Ae.clientY-Ge.top-Pe.current.y)/Pe.current.zoom;be({visible:!0,x:Ae.clientX,y:Ae.clientY,worldX:at,worldY:rt,sourceNodeIds:Z,sourceNodeId:Z[0]})}le&&le(null),fe&&fe(null)}return}let _t=!1;if(xe.current){if(_t=!0,ve.current=!0,Te.current,Te.current&&(cancelAnimationFrame(Te.current),Te.current=null),u.current){const Ue=Pe.current;u.current.style.transform=`translate3d(${Ue.x}px, ${Ue.y}px, 0) scale(${Ue.zoom})`}const Qe=document.querySelector("[data-canvas-bg]");if(Qe){const Ue=Pe.current;Qe.style.backgroundPosition=`${Ue.x}px ${Ue.y}px`}xe.current=!1,j({...Pe.current})}if(_t?(requestAnimationFrame(()=>{ee(!1)}),requestAnimationFrame(()=>{document.body.classList.remove("canvas-interacting")})):(ee(!1),xe.current=!1),He.current=!1,pe(!1),je.current&&je.current.size>0){const Qe=je.current;k(Ue=>Ue.map(Ge=>{const at=Qe.get(Ge.id);return at?{...Ge,x:at.x,y:at.y}:Ge})),je.current=null}X&&zt();const xt=tt.current||L;if(re&&xt&&Ae&&!(z!=null&&z.current)&&!q&&!H){const Qe=(St=c.current)==null?void 0:St.getBoundingClientRect();if(Qe){const Ue=(Ae.clientX-Qe.left-Pe.current.x)/Pe.current.zoom,Ge=(Ae.clientY-Qe.top-Pe.current.y)/Pe.current.zoom,at=o.current,rt=(at==null?void 0:at.size)>1&&(at!=null&&at.has(xt))?Array.from(at):[xt];re(Ue,Ge,rt)}}if(we(null),Q(null),me(null),pt.current=null,R==null||R([]),un.current=null,Tn.current=null,Ht.current=null,p.current=null,qe.current=null,tt.current=null,ct.current.clear(),Ye.current=null,H&&Ae){const Qe=Ae.target;let Ue=Qe.closest(".node-wrapper");if(!Ue&&Qe.hasAttribute("data-node-id")&&(Ue=Qe),!Ue){let Ge=Qe.parentElement;for(;Ge&&Ge!==c.current;){if(Ge.classList.contains("node-wrapper")||Ge.hasAttribute("data-node-id")){Ue=Ge;break}Ge=Ge.parentElement}}if(Ue){const Ge=Ue.getAttribute("data-node-id");if(Ge&&Ge!==H){J&&J!=="default"&&!(J==="agent_user_input"||J==="agent_meta_prompt")&&W(lt=>lt.filter(ot=>!(ot.to===H&&(ot.inputType||"default")===J)));const rt={id:_e(),from:Ge,to:H,...J&&J!=="default"?{inputType:J}:{}};W(lt=>[...lt,rt])}ge(null),ne(null)}}if(O||h.current){const Qe=F,Ue=Me.current;if(Me.current=null,ue(!1),h.current=!1,U(null),Qe){const{startX:Ge,startY:at,endX:rt,endY:lt}=Qe,ot=(Ue==null?void 0:Ue.endX)??rt,At=(Ue==null?void 0:Ue.endY)??lt,kt=Math.min(Ge,ot),Ot=Math.min(at,At),dn=Math.max(Ge,ot),Vt=Math.max(at,At),Zt=Pe.current,Sn=(kt-Zt.x)/Zt.zoom,jn=(Ot-Zt.y)/Zt.zoom,_n=(dn-Zt.x)/Zt.zoom,Cn=(Vt-Zt.y)/Zt.zoom,Kn=new Set;if(l.current.forEach(Xn=>{const $r=Xn.x+Xn.width,Tr=Xn.y+Xn.height;Xn.x<_n&&$r>Sn&&Xn.yjn&&Kn.add(Xn.id)}),Y(Kn),Kn.size>0&&(ie==null||ie(Array.from(Kn))),Kn.size===1){const Xn=Array.from(Kn)[0];M(Xn)}}}},[O,a,L,X,zt,q,H,J,Z,h,o,p,l,F,ee,pe,we,Q,me,ue,U,M,Y,k,W,ge,ne,le,be,j,m,_e,gt,c,Pe,ie,re,z]);_.useEffect(()=>{const Ae=()=>{He.current&&Gt(void 0)};return window.addEventListener("mouseup",Ae,!0),()=>window.removeEventListener("mouseup",Ae,!0)},[Gt]);const qt=_.useCallback(Ae=>{var _t,xt,Tt;const nt=Ae.target;if(!(nt.closest(".node-dropdown-button")||nt.closest(".node-dropdown-menu")||nt.closest("[data-model-select-area]"))){if(V.visible&&$e({visible:!1,x:0,y:0,nodeId:null,frame:null}),N.visible&&ze({visible:!1,x:0,y:0,worldX:0,worldY:0,item:null}),Z&&Z.length>0){const Qe=Ae.target.closest(".node-wrapper");if(Qe){const Ue=Qe.getAttribute("data-node-id");if(console.log(`[handleCanvasMouseUp] multi-connect found nodeWrapper, targetNodeId: ${Ue}`),Ue){const Ge=Z.filter(at=>at!==Ue);if(Ge.length>0){const at=Ge.map(rt=>({id:_e(),from:rt,to:Ue}));W(rt=>[...rt,...at])}}le&&le(null),fe&&fe(null)}else{const Ue=(_t=c.current)==null?void 0:_t.getBoundingClientRect();if(Ue){const Ge=(Ae.clientX-Ue.left-e.x)/e.zoom,at=(Ae.clientY-Ue.top-e.y)/e.zoom;be({visible:!0,x:Ae.clientX,y:Ae.clientY,worldX:Ge,worldY:at,sourceNodeId:Z[0]})}le&&le(null),fe&&fe(null)}return}if(q){const St=Ae.target;if(Ae.__handledByCustomAgent){console.log("[handleCanvasMouseUp] event already handled by CustomAgentNode");return}if(console.log("[handleCanvasMouseUp] connectingSource exists, target:",St),St.closest("[data-input-type]")){console.log("[handleCanvasMouseUp] target has data-input-type, skipping to let node handle it");return}const Ue=St.closest(".node-wrapper");if(Ue){const Ge=Ue.getAttribute("data-node-id");if(console.log(`[handleCanvasMouseUp] found nodeWrapper, targetNodeId: ${Ge}`),Ge&&Ge!==q){const at=Ze.current.get(Ge);if(console.log(`[handleCanvasMouseUp] targetNode type: ${at==null?void 0:at.type}`),at&&at.type==="custom-agent"){console.log("[handleCanvasMouseUp] target is custom-agent, skipping to let node handle it");return}const rt={id:_e(),from:q,to:Ge};W(lt=>[...lt,rt]),(at==null?void 0:at.type)==="preview"&&k(lt=>lt.map(ot=>ot.id===q?{...ot,settings:{...ot.settings||{},selectedPreviewId:Ge}}:ot)),te(null)}else{console.log("[handleCanvasMouseUp] targetNodeId is same as connectingSource or null");const at=Ge?Ze.current.get(Ge):void 0;if(at&&at.type==="custom-agent"){console.log("[handleCanvasMouseUp] clicked inside custom-agent, not clearing connectingSource");return}te(null)}}else{const Ge=(xt=c.current)==null?void 0:xt.getBoundingClientRect();if(Ge){const at=Ve.current??(Ae?{x:Ae.clientX,y:Ae.clientY}:null);if(at){const rt=(at.x-Ge.left-e.x)/e.zoom,lt=(at.y-Ge.top-e.y)/e.zoom;be({visible:!0,x:at.x,y:at.y,worldX:rt,worldY:lt,sourceNodeId:q})}Ve.current=null}te(null)}return}if(H){const Qe=Ae.target.closest(".node-wrapper");if(Qe){const Ue=Qe.getAttribute("data-node-id");if(Ue&&Ue!==H){J&&J!=="default"&&!(J==="agent_user_input"||J==="agent_meta_prompt")&&W(lt=>lt.filter(ot=>!(ot.to===H&&(ot.inputType||"default")===J)));const at={id:_e(),from:Ue,to:H,...J&&J!=="default"?{inputType:J}:{}};W(lt=>[...lt,at]);const rt=Ze.current.get(H);(rt==null?void 0:rt.type)==="preview"&&k(lt=>lt.map(ot=>ot.id===Ue?{...ot,settings:{...ot.settings||{},selectedPreviewId:H}}:ot))}ge(null),ne(null)}else{const Ue=(Tt=c.current)==null?void 0:Tt.getBoundingClientRect();if(Ue){const Ge=Ve.current??(Ae?{x:Ae.clientX,y:Ae.clientY}:null);if(Ge){const at=(Ge.x-Ue.left-e.x)/e.zoom,rt=(Ge.y-Ue.top-e.y)/e.zoom;be({visible:!0,x:Ge.x,y:Ge.y,worldX:at,worldY:rt,targetNodeId:H,inputType:J||void 0})}Ve.current=null}ge(null),ne(null)}return}}},[q,H,J,Z,e,V.visible,N.visible,c,_e,W,te,ge,ne,le,be,$e,ze,R]),De=_.useCallback(Ae=>{Ae.preventDefault(),Ae.stopPropagation(),(a.size>0||i)&&de({visible:!0,x:Ae.clientX,y:Ae.clientY})},[a,i,de]),st=_.useCallback((Ae,nt,_t)=>{Ne.current={x:nt.clientX,y:nt.clientY},ke.current={x:_t.x,y:_t.y},Pe.current={x:e.x,y:e.y,zoom:e.zoom}},[e.x,e.y,e.zoom]);return{handleCanvasContextMenu:Jt,handleCanvasMouseDown:Wt,handleCanvasDoubleClick:Pt,handleCanvasMouseMove:Bt,handleCanvasMouseUp:Gt,handleBackgroundClick:qt,handleSelectionContextMenu:De,initNodeDrag:st,lastMousePos:Ce,isPanningRef:xe,dragStartPos:Ne,nodeStartPos:ke,dragElementRef:qe,dragNodeIdRef:tt}},sm=50,hY=15,yC=3;function w1(e){if(e>=sm)return 0;const t=1-e/sm;return yC+(hY-yC)*t}function pY({isDragging:e,connectingSource:t,isPanning:n=!1,view:r,setView:i,enabled:a=!0}){const o=_.useRef(null),l=_.useRef(null),c=_.useRef(!1);return _.useEffect(()=>{if(!a)return;const u=(e||t!==null)&&!n;if(c.current=u,!u){o.current!==null&&(cancelAnimationFrame(o.current),o.current=null);return}const d=p=>{l.current={x:p.clientX,y:p.clientY}};window.addEventListener("mousemove",d,{passive:!0});const h=()=>{if(!c.current||!l.current){o.current=null;return}const{x:p,y:f}=l.current,b=window.innerWidth,g=window.innerHeight,y=p,w=b-p,v=f,m=g-f;let z=0,C=0;y({...E,x:E.x+z,y:E.y+C})),o.current=requestAnimationFrame(h)};return o.current=requestAnimationFrame(h),()=>{window.removeEventListener("mousemove",d),o.current!==null&&(cancelAnimationFrame(o.current),o.current=null)}},[e,t,n,a,i]),{isActive:c.current}}const fY=`你是一名资深 Claude Skills 架构师兼专业提示词工程师,擅长将复杂任务转化为高度工程化的 Claude Skill,尤其精通商业视觉、AI绘图、产品摄影等领域的提示词设计。 + +【启动对话】首次回复时,请直接以这句话开始: +"你想做一个什么样的 Skill?简单来说,你希望只要**【输入】**什么,Claude 就会**【输出】**什么?我会带你一步步把它做出来。 + +💡 我特别擅长以下领域的 Skill 制作: +• 🎨 **AI绘图提示词** - Midjourney/SD/ComfyUI 专业提示词 +• 📸 **商业摄影** - 内衣、美妆、食品、电子产品等商拍提示词 +• 📝 **文案创作** - 小红书种草、抖音脚本、电商详情页 +• 🔧 **开发工具** - 代码审查、测试、文档生成 +• 🌐 **外部集成** - 可以参考 skills.sh 上的热门 Skill" + +【交互原则】 +- 用简单直白的问题询问用户,不要用技术术语 +- 明确:**输入 (Input)**、**输出 (Output)**、**触发场景** +- 若用户给示例(图片、文件、描述),主动深度分析并给出专业理解 + +【Phase 1:需求挖掘】 + +**1.1 核心功能识别** +询问:"你希望 Claude 帮你做什么?" +- 处理文件(PDF/Excel/图片等) +- 写东西(文案/代码/文档) +- 生成创意内容(提示词/设计方案) +- 连接服务或其他 + +**1.2 专业领域识别** +根据用户回答,进一步询问细分领域: + +📸 **视觉创意类**: +- "是什么类型的图片?(产品商拍/人像/场景/创意合成)" +- "目标平台是?(电商主图/社交媒体/品牌官网/印刷物料)" +- "风格偏好?(高端简约/活力时尚/自然清新/科技未来)" + +✍️ **文案内容类**: +- "是什么类型的文案?(种草/卖点/品牌故事/广告语)" +- "目标人群是?(年轻女性/职场精英/宝妈/数码爱好者)" +- "调性偏好?(专业/亲切/幽默/高端)" + +🔧 **技术开发类**: +- "是什么类型的任务?(代码生成/审查/测试/文档)" +- "技术栈是?(React/Python/Node/其他)" +- "输出规范?(有现成模板/需要设计)" + +**1.3 质量标准与使用频率** +- "做得好最重要的是?"(速度快/质量高/操作简单) +- "这个功能你大概会怎么用?"(每天用/偶尔用/自己用/团队用) +- "想在哪里用?"(当前项目/所有项目/可分享给他人) + +【Phase 2:架构蓝图】 + +需求明确后,输出一份详细的「Skill 架构蓝图」: + +\`\`\`markdown +## 📋 Skill 架构蓝图 + +### 基本信息 +- **名称**: [skill-name] +- **一句话描述**: [功能概述] +- **适用场景**: [何时触发] + +### I/O 契约 +- **输入**: [用户提供什么] +- **输出**: [返回什么结果] +- **触发词示例**: "[用户可能说的话]" + +### 目录结构 +[path]/[skill-name]/ +├── SKILL.md (核心指令) +├── references/ (参考资料,如需要) +│ ├── templates.md (模板库) +│ └── examples.md (示例库) +└── assets/ (资源文件,如需要) + +### 工作流程 +1. [步骤1] +2. [步骤2] +3. [步骤3] + +### 特色能力 +- ✅ [能力1] +- ✅ [能力2] +- ✅ [能力3] +\`\`\` + +【Phase 3:专业产出】 + +用户确认后,产出完整的 SKILL.md,包含以下增强内容: + +**3.1 Frontmatter 规范** +\`\`\`yaml +--- +name: skill-name-here +description: 清晰描述功能和触发场景。示例:"生成商业产品摄影提示词。当用户需要商拍提示词、产品图描述、AI绘图提示词时使用。" +--- +\`\`\` + +**3.2 Body 结构(专业模板)** +\`\`\`markdown +# [Skill 名称] + +## 功能概述 +[一段话描述核心能力] + +## 触发场景 +当用户说以下内容时激活此 Skill: +- "[触发词1]" +- "[触发词2]" +- "[触发词3]" + +## 工作流程 + +### Step 1: [步骤名] +[具体指令] + +### Step 2: [步骤名] +[具体指令] + +## 输出模板 +[提供结构化的输出格式] + +## 示例 + +### 输入 +\`\`\` +[用户输入示例] +\`\`\` + +### 输出 +\`\`\` +[期望输出示例] +\`\`\` + +## 参考资源 +- [链接或说明] +\`\`\` + +【专业领域知识库】 + +**📸 商业摄影提示词公式**: +\`[主体描述] + [风格基调] + [光影方案] + [色彩方案] + [构图方式] + [技术参数]\` + +**内衣/贴身衣物商拍模板**: +\`\`\` +亚洲女性模特,穿着[颜色]色无痕内衣套装,手持产品包装盒, +纯色背景(莫兰迪灰绿/奶油白/浅灰蓝),柔光棚拍,肤质通透自然, +姿态优雅自信,面带微笑,构图三分之二身,风格高端简约亲和 +\`\`\` + +**产品图通用模板**: +\`\`\` +[产品名]产品摄影,[角度]角拍摄,[背景描述], +[光影描述],[配饰搭配],风格[形容词], +适合[目标平台]使用 +\`\`\` + +**平台审核适配**: +- 淘宝/天猫:真实性优先,避免过度P图 +- 小红书:生活化场景,真诚分享感 +- 抖音:封面抓人,对比强烈 +- 微信:高端克制,注重品牌调性 + +【外部 Skill 参考能力(覆盖 2025 全年生态)】 + +当用户需要参考热门 Skill 或寻找灵感时,你需要优先从以下多个 Skill 市场「检索 + 对比」后再给建议: + +1. **Agent-Skills 目录(agent-skills.md)** + - 作用:统一索引 GitHub 仓库中的 \`skills/\` 目录,适合查找开源、可 fork 的技能集合。 + - 浏览入口:https://agent-skills.md/ + - 使用方式示例:用户说「找一个 React/TypeScript 代码审查 Skill」→ 在 Agent-Skills 中按标签 \`React\` / \`TypeScript\` / \`Frontend\` 组合查找,并优先推荐评分高、最近仍在更新的技能。 + +2. **SkillsMP 技能市场(skillsmp.com)** + - 作用:集合多平台可用的 Claude / Codex / Claude Code 技能,偏向工程实践与工作流自动化。 + - 浏览入口(中文):https://skillsmp.com/zh + - 使用方式示例:用户说「我要一个自动生成 PR 的 Skill」→ 搜索「PR」「GitHub」「Pull Request」,比对多个专注仓库流的技能,给出 1–3 个推荐并说明适用场景。 + +3. **Skillstore 技能市场(skillstore.io)** + - 作用:提供经过安全审计与版本冻结的技能,适合团队协作与生产环境使用。 + - 浏览入口(中文):https://skillstore.io/zh-hans + - 使用方式示例:用户说「想要 Next.js 15 前端最佳实践的指导 Skill」→ 推荐如 \`frontend-dev-guidelines\`(Next.js 15 / React 19 / Tailwind / shadcn/ui 最佳实践)这类前端相关技能。 + +4. **skills.sh 官方生态** + - 作用:提供 \`npx skills\` CLI 与官方技能集合。 + - 常用命令: + - \`npx skills find [关键词]\`:按关键字搜索技能 + - \`npx skills add @\`:安装指定技能 + - 示例:安装 vercel-labs 的技能集合:\`npx skills add vercel-labs/skills\` + +在给用户推荐时: +- 优先解释「为什么这个 Skill 适合当前需求」(输入/输出/边界); +- 尽量给出 1–3 个明确的候选 Skill 名称 + 所在平台 + 安装/使用入口 URL; +- 如果用户强调「要稳定、团队可用」,优先选择 Skillstore 中已验证或版本冻结的技能; +- 如果用户强调「想看更多代码实现细节」,优先推荐 Agent-Skills 里的开源仓库; +- 如果用户希望在本地 CLI 快速试用,推荐使用 skills.sh 对应的 CLI 安装方式。 + +【注意事项】 +- 本对话中无法调用 AskUserQuestion 等工具,用自然语言提问 +- 保持友好、专业、简洁 +- 若涉及敏感内容(如人体展示),引导用户使用商业合规的表达方式 +- 产出的 Skill 应可直接保存使用,无需额外修改`,mY=({apiConfigs:e,globalApiKey:t})=>{const[n,r]=_.useState(()=>{try{const B=localStorage.getItem("qiaodoumayi_chat_sessions"),V=B?JSON.parse(B):[];return(V.length?V:[{id:"default",title:"新对话",messages:[]}]).map(j=>({...j,mode:j.mode==="skill"?"skill":"normal"}))}catch{return[{id:"default",title:"新对话",messages:[],mode:"normal"}]}}),[i,a]=_.useState("default"),[o,l]=_.useState(""),[c,u]=_.useState(!1),[d,h]=_.useState(()=>{try{const B=localStorage.getItem("qiaodoumayi_chat_width");if(B!=null){const V=parseInt(B,10);if(!Number.isNaN(V)&&V>=300&&V<=1200)return V}}catch{}return 420}),[p,f]=_.useState(()=>{try{const B=localStorage.getItem("qiaodoumayi_chat_font_size");if(B==="small"||B==="medium"||B==="large")return B}catch{}return"medium"}),[b,g]=_.useState([]),[y,w]=_.useState("gemini-3-pro"),[v,m]=_.useState(!1),z=_.useRef(!1),[C,E]=_.useState(!1),[I,R]=_.useState(3),[A,O]=_.useState(!1),F=_.useMemo(()=>_h(B=>{try{localStorage.setItem("qiaodoumayi_chat_sessions",JSON.stringify(B))}catch{}},1e3),[]);_.useEffect(()=>{F(n)},[n,F]),_.useEffect(()=>{try{localStorage.setItem("qiaodoumayi_chat_width",String(d))}catch{}},[d]),_.useEffect(()=>{try{localStorage.setItem("qiaodoumayi_chat_font_size",p)}catch{}},[p]);const L=_.useMemo(()=>{const B=A?"skill":"normal";return n.filter(V=>(V.mode??"normal")===B)},[n,A]);_.useEffect(()=>{if(n.length===0){r([{id:"default",title:"新对话",messages:[],mode:"normal"}]),a("default");return}const B=A?"skill":"normal",V=n.filter(j=>(j.mode??"normal")===B),N=V.some(j=>j.id===i);if(V.length===0){const j=ns();r(k=>[...k,{id:j,title:B==="skill"?"新 Skill 对话":"新对话",messages:[],mode:B}]),a(j)}else N||a(V[0].id)},[n,A]);const X=_.useCallback(B=>{B.preventDefault(),E(!0)},[]);_.useEffect(()=>{if(!C)return;const B=N=>{const j=window.innerWidth-N.clientX;h(Math.max(320,Math.min(1200,j)))},V=()=>{E(!1)};return window.addEventListener("mousemove",B),window.addEventListener("mouseup",V),()=>{window.removeEventListener("mousemove",B),window.removeEventListener("mouseup",V)}},[C]);const T=_.useCallback((B,V)=>{B.stopPropagation();const N=A?"skill":"normal";r(j=>{if(j.length<=1)return j;const k=j.filter(M=>M.id!==V),W=k.filter(M=>(M.mode??"normal")===N);return W.length>0&&i===V&&a(W[0].id),k})},[i,A]),q=_.useCallback((B,V)=>{const N=new Set(V);N.size!==0&&r(j=>j.map(k=>k.id!==B?k:{...k,messages:k.messages.filter(W=>!N.has(W.id))}))},[]),H=_.useCallback(()=>{const B=ns(),V=A?"skill":"normal";r(N=>[...N,{id:B,title:V==="skill"?"新 Skill 对话":"新对话",messages:[],mode:V}]),a(B)},[A]),J=_.useCallback((B,V)=>{const N=(V||"").trim();N&&r(j=>j.map(k=>k.id===B?{...k,title:N}:k))},[]),Z=_.useCallback(async B=>{var V,N,j,k,W,M,Y,se,ie,oe,re,ee,pe,we,Q,me,ue,U,G,te,ge,ne,le;if(z.current){console.warn("【Chat】消息正在发送中,请稍候...");return}if(!B.trim()&&b.length===0){console.warn("【Chat】消息内容和文件都为空");return}z.current=!0,m(!0);try{const fe=n.find(Re=>Re.id===i);if(!fe)throw console.error(`【Chat】找不到会话: ${i},可用会话:`,n.map(Re=>Re.id)),new Error(`找不到当前对话会话: ${i}`);const be=b.map(Re=>{var Ve;return{name:Re.name||"unnamed",type:Re.type||"",content:Re.content,isImage:Re.isImage,isVideo:Re.isVideo,isAudio:Re.isAudio,fileExt:Re.fileExt||(Re.name?(Ve=Re.name.split(".").pop())==null?void 0:Ve.toLowerCase():"")}}),de={id:ns(),role:"user",content:B,files:be};r(Re=>Re.map(Ve=>Ve.id===i?{...Ve,messages:[...Ve.messages,de],title:Ve.messages.length===0&&B?B.slice(0,20):Ve.title}:Ve)),l(""),g([]);const $e={...fe,messages:[...fe.messages,de]},ze=e.find(Re=>Re.id===y);if(!ze)throw new Error(`找不到模型配置: ${y}`);const _e=(ze==null?void 0:ze.key)||t,Ee=((ze==null?void 0:ze.url)||"https://ai.comfly.chat").replace(/\/+$/,"");if(!_e)throw new Error("请先配置 API Key");console.log("【Chat】发送消息到:",Ee,"模型:",ze==null?void 0:ze.modelName);const Ce=$e.messages.slice(-I);console.log(`【Chat】回读历史消息: ${I} 条,实际发送: ${Ce.length} 条`);const Ne=[{role:"system",content:A?fY:"你是一名多模态AI助手,需要结合整个对话的上下文进行连续回答。"},...Ce.map(Re=>({role:Re.role,content:Re.content}))],ve=[];B&&ve.push({type:"text",text:B});const ke=be.filter(Re=>Re.isImage&&Re.content),Ie=200*1024,Pe=300*1024,Te=1920;for(const Re of be)if(Re.isImage&&Re.content)try{console.log(`【Chat】压缩图片: ${Re.name}, 上限${(Pe/1024).toFixed(0)}KB`);const Ve=await $h(Re.content,Ie,Pe,Te);ve.push({type:"image_url",image_url:{url:Ve}})}catch(Ve){console.warn("【Chat】图片压缩失败,使用原图:",Ve),ve.push({type:"image_url",image_url:{url:Re.content}})}else Re.isVideo&&Re.content?(console.log(`【Chat】添加视频: ${Re.name}`),ve.push({type:"image_url",image_url:{url:Re.content}})):Re.isAudio?ve.push({type:"text",text:` +[User attached audio: ${Re.name}] +`}):Re.content&&typeof Re.content=="string"&&Re.content.length<5e4?ve.push({type:"text",text:` +[File: ${Re.name}] +\`\`\`${Re.fileExt||"text"} +${Re.content} +\`\`\` +`}):ve.push({type:"text",text:` +[User attached file: ${Re.name}] +`});ve.length>0?Ne.push({role:"user",content:ve}):Ne.push({role:"user",content:B});const Be=new AbortController,He=setTimeout(()=>Be.abort(),18e5),Je=ns(),Me={id:Je,role:"assistant",content:"",modelId:y};r(Re=>Re.map(Ve=>Ve.id===i?{...Ve,messages:[...Ve.messages,Me]}:Ve));try{const Re=await fetch(`${Ee}/v1/chat/completions`,{method:"POST",headers:{Authorization:`Bearer ${_e}`,"Content-Type":"application/json"},body:JSON.stringify({model:(ze==null?void 0:ze.modelName)||"gemini-3-pro-preview",messages:Ne,stream:!0}),signal:Be.signal});if(clearTimeout(He),!Re.ok){const Ve=await Re.text();throw console.error("【Chat】API 错误响应:",Re.status,Ve),new Error(Ve||`API 错误: ${Re.status}`)}if(Re.body){console.log("【Chat】开始接收流式响应(不限长度)...");const Ve=Re.body.getReader(),Ze=new TextDecoder("utf-8");let je="",Le="",Xe=!0,qe="";try{for(;;){const{done:tt,value:Ye}=await Ve.read();if(tt)break;const ct=Ze.decode(Ye,{stream:!0});Le+=ct,qe+=ct;const pt=Le.split(` +`);Le=pt.pop()||"";for(const ht of pt){const wt=ht.trim();if(!(!wt||wt==="data: [DONE]"))if(wt.startsWith("data: "))try{const $t=wt.slice(6);if($t==="[DONE]")continue;const jt=JSON.parse($t);let Nt="";(j=(N=(V=jt.choices)==null?void 0:V[0])==null?void 0:N.delta)!=null&&j.content?Nt=jt.choices[0].delta.content:(W=(k=jt.choices)==null?void 0:k[0])!=null&&W.text?Nt=jt.choices[0].text:(M=jt.delta)!=null&&M.content?Nt=jt.delta.content:jt.content&&(Nt=jt.content),Nt&&(je+=Nt,r(Yt=>Yt.map(un=>un.id===i?{...un,messages:un.messages.map(Tn=>Tn.id===Je?{...Tn,content:je}:Tn)}:un)))}catch{}else Xe&&!wt.startsWith(":")&&(Xe=!1)}}if(Le.trim()&&Le.trim().startsWith("data: ")&&Le.trim()!=="data: [DONE]")try{const tt=JSON.parse(Le.trim().slice(6)),Ye=((ie=(se=(Y=tt.choices)==null?void 0:Y[0])==null?void 0:se.delta)==null?void 0:ie.content)||((oe=tt.delta)==null?void 0:oe.content)||"";Ye&&(je+=Ye)}catch{}}finally{Ve.releaseLock()}if(console.log(`【Chat】流式响应完成,共接收 ${je.length} 字符`),!je&&qe.trim()){console.log("【Chat】SSE 未解析到内容,尝试 JSON 降级解析...");try{const tt=JSON.parse(qe),Ye=((pe=(ee=(re=tt.choices)==null?void 0:re[0])==null?void 0:ee.message)==null?void 0:pe.content)||tt.content||tt.text||(typeof tt.message=="string"?tt.message:(we=tt.message)==null?void 0:we.content)||((U=(ue=(me=(Q=tt.data)==null?void 0:Q.choices)==null?void 0:me[0])==null?void 0:ue.message)==null?void 0:U.content)||((G=tt.data)==null?void 0:G.content)||((te=tt.data)==null?void 0:te.text)||null;Ye&&(je=Ye)}catch{console.warn("【Chat】JSON 降级解析也失败")}}if(je)r(tt=>tt.map(Ye=>Ye.id===i?{...Ye,messages:Ye.messages.map(ct=>ct.id===Je?{...ct,content:je}:ct)}:Ye));else throw new Error("AI 未返回有效内容")}else{console.log("【Chat】ReadableStream 不可用,使用 JSON 解析...");const Ze=((le=(ne=(ge=(await Re.json()).choices)==null?void 0:ge[0])==null?void 0:ne.message)==null?void 0:le.content)||"";if(Ze)r(je=>je.map(Le=>Le.id===i?{...Le,messages:Le.messages.map(Xe=>Xe.id===Je?{...Xe,content:Ze}:Xe)}:Le));else throw new Error("AI 未返回有效内容")}}catch(Re){throw clearTimeout(He),r(Ve=>Ve.map(Ze=>Ze.id===i?{...Ze,messages:Ze.messages.filter(je=>je.id!==Je)}:Ze)),Re instanceof Error&&Re.name==="AbortError"?new Error("请求超时(30分钟),请检查网络连接"):Re}}catch(fe){console.error("【Chat】发送消息失败:",fe);const be=fe instanceof Error?fe.message:"发送失败,请重试",de={id:ns(),role:"assistant",content:`❌ 错误: ${be}`,modelId:y};r($e=>$e.map(ze=>ze.id===i?{...ze,messages:[...ze.messages,de]}:ze))}finally{console.log("【Chat】消息发送完成,重置发送状态"),z.current=!1,m(!1)}},[i,n,y,e,t,b,I,A]);return{chatSessions:n,setChatSessions:r,currentChatId:i,setCurrentChatId:a,chatInput:o,setChatInput:l,isChatOpen:c,setIsChatOpen:u,chatWidth:d,setChatWidth:h,chatFontSize:p,setChatFontSize:f,chatFiles:b,setChatFiles:g,chatModel:y,setChatModel:w,isChatSending:v,isResizingChat:C,setIsResizingChat:E,historyMessageCount:I,setHistoryMessageCount:R,chatSkillMode:A,setChatSkillMode:O,deleteChatSession:T,deleteChatMessages:q,createNewChat:H,renameChatSession:J,sendChatMessage:Z,handleChatResizeStart:X,sessionsForCurrentMode:L}},Tm="qiaodoumayi_saved_skills";function gY(){return"skill-"+Date.now().toString(36)+"-"+Math.random().toString(36).slice(2,9)}function _c(){try{const e=localStorage.getItem(Tm);if(!e)return[];const t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}function q5(e){const t=_c(),n={id:gY(),name:e.name.trim()||`Skill ${new Date().toLocaleString()}`,content:e.content,createdAt:Date.now()};return t.push(n),localStorage.setItem(Tm,JSON.stringify(t)),n}function xO(e){const t=_c().filter(n=>n.id!==e);localStorage.setItem(Tm,JSON.stringify(t))}function bO(e,t){const n=_c().map(r=>r.id===e?{...r,...t}:r);localStorage.setItem(Tm,JSON.stringify(n))}const vC=Object.freeze(Object.defineProperty({__proto__:null,SAVED_SKILLS_KEY:Tm,addSavedSkill:q5,deleteSavedSkill:xO,getSavedSkills:_c,updateSavedSkill:bO},Symbol.toStringTag,{value:"Module"})),_m="qiaodoumayi_prompt_library",xY="基于我上传的这张参考图,生成一张九宫格(3x3 grid)布局的分镜脚本。请严格保持角色与参考图一致(Keep character strictly consistent),但在9个格子中展示该角色不同的动作、表情和拍摄角度(如正面、侧面、背面、特写等)。要求风格高度统一,形成一张完整的角色动态表(Character Sheet)。",bY="请对参考图片进行无损高清放大(Upscale)。请严格保持原图的构图、色彩、光影和所有细节元素不变,不要进行任何创造性的重绘或添加新内容。仅专注于提升分辨率、锐化边缘(Sharpening)和去除噪点(Denoising),实现像素级的高清修复。Best quality, 8k, masterpiece, highres, ultra detailed, sharp focus, image restoration, upscale, faithful to original.",yY=`you are a veteran Hollywood storyboard artist with years of experience. You have the ability to accurately analyze character features and scene characteristics based on images. Provide me with the most suitable camera angles and storyboards. Strictly base this on the uploaded character and scene images, while maintaining a consistent visual style. + +MANDATORY LAYOUT: Create a precise 3x3 GRID containing exactly 9 distinct panels. + +- The output image MUST be a single image divided into a 3 (rows) by 3 (columns) matrix. +- There must be EXACTLY 3 horizontal rows and 3 vertical columns. +- Each panel must be completely separated by a thin, distinct, solid black line. +- DO NOT create a collage. DO NOT overlap images. DO NOT create random sizes. +- The grid structure must be perfectly aligned for slicing. + +Subject Content: "[在此处填充你对故事的描述]" + +Styling Instructions: +- Each panel shows the SAME subject/scene from a DIFFERENT angle (e.g., Front, Side, Back, Action, Close-up). +- Maintain perfect consistency of the character/object across all panels. +- Cinematic lighting, high fidelity, 8k resolution. + +Negative Constraints: +- No text, no captions, no UI elements. +- No watermarks. +- No broken grid lines.`,vY=`(strictly mimic source image art style:1.5), (same visual style:1.4), +score_9, score_8_up, masterpiece, best quality, (character sheet:1.4), (reference sheet:1.3), (consistent art style:1.3), matching visual style, + +[Structure & General Annotations]: +multiple views, full body central figure, clean background, +(heavy annotation:1.4), (text labels with arrows:1.3), handwriting, data readout, + +[SPECIAL CHARACTER DESCRIPTION AREA]: +(prominent character profile text box:1.6), (dedicated biography section:1.5), large descriptive text block, +[在此处填写特殊角色说明,例如:姓名、种族、背景故事等], + +[Clothing Breakdown]: +(clothing breakdown:1.5), (outfit decomposition:1.4), garment analysis, (floating apparel:1.3), +displaying outerwear, displaying upper body garment, displaying lower body garment, + +[Footwear Focus]: +(detailed footwear display:1.5), (floating shoes:1.4), shoe design breakdown, focus on shoes, + +[Inventory & Details]: +(inventory knolling:1.2), open container, personal accessories, organized items display, expression panels`,wY=`# Directive: Create a "Rich Narrative Mood Board" (8-Grid Layout) + +## 1. PROJECT INPUT + +**A. [Story & Concept / 故事与核心想法]** +> [跟据自身内容书写] + +**B. [Key Symbols / 核心意象 (Optional)]** +> [深度理解参考图,自行创作] + +**C. [Color Preferences / 色彩倾向 (Optional)]** +> [深度理解参考图,自行创作] + +**D. [Reference Images / 参考图]** +> (See attached images / 请读取我上传的图片) + +--- + +## 2. Role Definition +Act as a **Senior Art Director**. Synthesize the Input above into a single, cohesive, high-density **Visual Mood Board** using a complex **8-Panel Asymmetrical Grid Layout**. + +## 3. Layout Mapping (Strict Adherence) +You must design a visual composition that tells the story through **8 distinct panels** within one image. **Do not** generate random grids. Map the content exactly as follows: + +* **Panel 1 (The World):** A wide, cinematic establishing shot of the environment (based on Input A). +* **Panel 2 (The Protagonist):** A portrait close-up (based on reference images), focusing on micro-expressions. +* **Panel 3 (The Metaphor):** An **abstract symbolic object** representing the core theme (based on Input B). +* **Panel 4 (The Palette):** A graphical **Color Palette Strip** showcasing 5 specific colors extracted from the scene. +* **Panel 5 (The Texture):** Extreme macro close-up of a material surface (e.g., rust, skin, fabric) to add tactile richness. +* **Panel 6 (The Motion):** A motion-blurred or long-exposure shot representing time/chaos. +* **Panel 7 (The Detail):** A focused shot of a specific prop or accessory relevant to the plot. +* **Panel 8 (The AI Art Interpretation - CRITICAL):** This is your **free creative space**. Generate an artistic, surreal, or abstract re-interpretation of the story's emotion. **Do not just copy the inputs.** Create a "Vibe Image" (e.g., Double Exposure, Oil Painting style, or abstract geometry) that captures the *soul* of the narrative. + +## 4. Execution Requirements +* **Composition Style:** High-end Editorial / Magazine Layout. Clean, thin white borders. +* **Visual Unity:** All panels must share the same lighting conditions and color grading logic (Unified Aesthetic). +* **Task:** Provide the **Final English Image Prompt** that explicitly describes this 8-grid layout, ensuring Panel 8 stands out as an artistic variation.`,_Y="Analyze the strokes and features of this sketch. Interpret the user's drawing intent and any visible text, then generate a high-quality image that transforms this rough draft into a fully realized concept. [IMPORTANT: Strictly follow the pose, composition, and layout of the provided reference image. The reference image contains the primary structure. Maintain the visual elements from the input image with high fidelity.]",wC=[{id:"grid-default",name:"九宫格分镜脚本",prompt:xY},{id:"upscale-default",name:"高清放大",prompt:bY},{id:"moodboard-default",name:"情绪版",prompt:wY},{id:"storyboard-default",name:"【分镜版】",prompt:yY},{id:"character-sheet-default",name:"【角色板】",prompt:vY},{id:"canvas-default",name:"画板提示词",prompt:_Y}];function yO(){const e=[],t=_c();for(const n of t)e.push({id:`skill:${n.id}`,name:n.name,prompt:n.content,source:"skill"});try{const n=localStorage.getItem(_m);if(n){const r=JSON.parse(n);if(Array.isArray(r))for(const i of r)i&&typeof i.id=="string"&&typeof i.prompt=="string"&&e.push({id:`agent:${i.id}`,name:i.name||i.id,prompt:i.prompt,source:"agent"})}}catch{}return e}function zY(e){if(!(e!=null&&e.trim()))return null;const n=yO().find(r=>r.id===e);return(n==null?void 0:n.prompt)??null}const c$=[{id:"film_classic",label:"经典胶片",prompt:"Classic 35mm film grain texture, warm amber and teal color grading, soft halation around highlights, slight vignetting, Kodak Vision3 500T color science, nostalgic golden hour warmth, shallow depth of field with creamy bokeh, Wong Kar-wai inspired saturated neon reflections on wet surfaces",builtIn:!0,category:"cinematic"},{id:"film_modern",label:"现代高清",prompt:"Ultra HD 8K digital cinema, razor-sharp focus, Netflix Original cinematic quality, ARRI Alexa Mini color science, natural skin tones, subtle color grading with lifted shadows, clean modern production design, professional three-point lighting, minimal lens distortion",builtIn:!0,category:"cinematic"},{id:"film_epic",label:"史诗大片",prompt:"IMAX 70mm epic widescreen, sweeping aerial crane shots, HDR wide dynamic range, dramatic volumetric god rays through dust particles, blockbuster VFX quality, massive scale environments, heroic low-angle compositions, Hans Zimmer score intensity, Deakins-style natural lighting",builtIn:!0,category:"cinematic"},{id:"film_noir",label:"黑色电影",prompt:"Classic Film Noir 1940s style, extreme high contrast black and white, deep impenetrable shadows, single hard key light, venetian blind shadow patterns, rain-slicked cobblestone streets reflecting lamplight, cigarette smoke wisps in spotlight beams, Dutch angle compositions, fedora silhouettes",builtIn:!0,category:"cinematic"},{id:"film_realism",label:"纪实写实",prompt:"Photojournalistic documentary realism, available natural light only, handheld camera intimacy, muted desaturated color palette, raw unretouched skin textures, environmental context depth, 50mm prime lens perspective, decisive moment composition, unflinching gaze, authentic lived-in environments",builtIn:!0,category:"cinematic"},{id:"film_volumetric",label:"体积光",prompt:"Dramatic volumetric lighting, dense atmospheric haze and fog, visible light shafts piercing through windows and cracks, ray tracing god rays, dust motes dancing in light beams, chiaroscuro contrast, Caravaggio-inspired divine light, backlit silhouettes with rim light halos",builtIn:!0,category:"cinematic"},{id:"film_anamorphic",label:"宽银幕",prompt:"Anamorphic 2.39:1 widescreen, horizontal lens flares with cyan and amber streaks, oval bokeh shapes, slight barrel distortion at edges, Panavision C-Series vintage glass character, cinematic letterbox framing, epic scope panoramic compositions, shallow focus with foreground elements",builtIn:!0,category:"cinematic"},{id:"film_golden",label:"黄金时代",prompt:"Hollywood Golden Age Technicolor, lush oversaturated jewel tones, deep crimson reds and emerald greens, studio glamour three-point lighting, soft diffusion filters, high-key beauty lighting, immaculate production design, Hitchcock suspense composition, Grace Kelly elegance",builtIn:!0,category:"cinematic"},{id:"film_indie",label:"独立电影",prompt:"Independent arthouse film, muted earth tone palette, handheld naturalistic camera, long take observational style, available light with practicals, 16mm film texture, intimate close-up character study, quiet melancholy mood, A24 visual sensibility, understated mise-en-scène",builtIn:!0,category:"cinematic"},{id:"film_horror",label:"恐怖惊悚",prompt:"Horror genre cinematography, desaturated sickly green-gray palette, deep oppressive shadows, flickering unstable light sources, extreme Dutch angles, fish-eye distortion, infrared night vision green, jump scare composition with negative space, claustrophobic tight framing, The Shining symmetry",builtIn:!0,category:"cinematic"},{id:"style_donghua",label:"国风 3D",prompt:"Chinese Donghua 3D animation style, vibrant jade green and cinnabar red palette, flowing silk ribbon dynamics, martial arts action pose with motion blur, ancient Chinese architecture with upturned eaves, cloud and mist particle effects, gold filigree ornamental details, eastern fantasy xianxia aesthetic, Unreal Engine 5 quality rendering",builtIn:!0,category:"stylized"},{id:"style_anime",label:"精致日漫",prompt:"High-end Japanese anime style, precise cel shading with soft gradient shadows, expressive detailed eyes with light reflections, clean vector line art, sakura petal particle effects, dramatic speed lines for action, Makoto Shinkai sky gradients, pastel and neon color harmony, volumetric cloud rendering, Ufotable fluid animation quality",builtIn:!0,category:"stylized"},{id:"style_cyber",label:"赛博朋克",prompt:"Cyberpunk 2077 aesthetic, dense neon signage in Chinese and Japanese, holographic billboard advertisements, rain-slicked chrome surfaces reflecting magenta and cyan lights, augmented reality UI overlays, megastructure architecture towering above, dense fog with volumetric neon glow, Blade Runner 2049 atmosphere, tech-noir mood",builtIn:!0,category:"stylized"},{id:"style_ink",label:"水墨国风",prompt:"Traditional Chinese ink wash painting sumi-e style, masterful single-stroke calligraphic brushwork, vast negative white space composition, ink splatter and splash texture, misty mountain landscape with layered depth, subtle indigo and vermilion accent washes, rice paper texture, bamboo and pine motifs, Tang Dynasty poetic atmosphere",builtIn:!0,category:"stylized"},{id:"style_popmart",label:"3D 盲盒",prompt:"Pop Mart designer toy blind box style, chibi 2.5-head proportions, glossy vinyl material with subsurface scattering, candy pastel color palette, rounded soft edges, studio product photography lighting with soft shadows, collectible figure display pose, kawaii cute expression, clean white cyclorama background, miniature diorama scene",builtIn:!0,category:"stylized"},{id:"style_wasteland",label:"废土末日",prompt:"Post-apocalyptic wasteland aesthetic, rust-eaten corroded metal textures, nuclear fallout dust storms with orange-brown haze, makeshift jury-rigged machinery, cracked dry earth desert, abandoned overgrown ruins reclaimed by nature, Mad Max vehicle kitbash style, gas mask and tattered clothing, Geiger counter static overlay, survival horror atmosphere",builtIn:!0,category:"stylized"},{id:"style_dreamy",label:"梦幻童话",prompt:"Ethereal dreamlike fantasy, soft gaussian glow around highlights, pastel rainbow color palette, floating light particles and fireflies, lens flare with star diffraction spikes, whimsical oversized flora, cotton candy cloud textures, iridescent mother-of-pearl shimmer, Studio Ghibli magical realism, enchanted forest atmosphere",builtIn:!0,category:"stylized"},{id:"style_ghibli",label:"吉卜力",prompt:"Studio Ghibli hand-painted watercolor style, lush detailed nature backgrounds, puffy cumulus clouds with wind movement, warm golden sunlight through foliage, rustic European countryside architecture, gentle character expressions, cozy interior scenes with handcrafted objects, Miyazaki flying sequence grandeur, nostalgic pastoral innocence, organic flowing animation",builtIn:!0,category:"stylized"},{id:"style_pixel",label:"像素复古",prompt:"16-bit pixel art retro gaming aesthetic, limited color palette with dithering gradients, chunky visible pixels, CRT scanline overlay, 320x240 resolution charm, SNES-era RPG sprite design, chiptune visual rhythm, isometric perspective, treasure chest and potion icons, neon arcade glow, retro-futuristic nostalgia",builtIn:!0,category:"stylized"},{id:"style_oil",label:"古典油画",prompt:"Classical oil painting on canvas, visible impasto brushstroke texture, Old Master Rembrandt chiaroscuro lighting, rich umber and ochre warm undertones, craquelure aged varnish effect, baroque dramatic composition, velvet and satin fabric rendering, sfumato soft edge transitions, Renaissance perspective, museum gallery masterpiece quality",builtIn:!0,category:"stylized"},{id:"style_comic",label:"美漫风格",prompt:"American comic book art style, bold black ink outlines, Ben-Day dot halftone shading, dynamic foreshortened action poses, dramatic perspective with vanishing points, speech bubble typography, Marvel/DC superhero anatomy, Jack Kirby cosmic energy crackle, vivid primary colors, splash page dynamic composition",builtIn:!0,category:"stylized"},{id:"style_watercolor",label:"水彩插画",prompt:"Delicate watercolor illustration, wet-on-wet paint bleeding and feathering edges, transparent layered color washes, visible paper grain texture, botanical illustration precision, loose expressive brush marks, white paper showing through as highlights, muted sage and dusty rose palette, children book illustration warmth",builtIn:!0,category:"stylized"},{id:"style_steampunk",label:"蒸汽朋克",prompt:"Victorian steampunk aesthetic, intricate brass clockwork gears and cogs, copper pipe networks with steam vents, dirigible airships in smoggy skies, ornate Art Nouveau decorative ironwork, leather and riveted metal textures, sepia-toned gaslight ambiance, monocle and top hat silhouettes, Jules Verne fantastical machinery",builtIn:!0,category:"stylized"},{id:"style_synthwave",label:"蒸汽波",prompt:"Synthwave retrowave aesthetic, neon wireframe grid landscape, chrome metallic text reflections, sunset gradient from magenta through orange to deep purple, VHS tracking glitch artifacts, palm tree silhouettes, retro 1980s sports car, Miami Vice pastel architecture, Japanese katakana neon signs, outrun electronic music visualization",builtIn:!0,category:"stylized"},{id:"style_miniature",label:"微缩模型",prompt:"Tilt-shift miniature diorama effect, extreme shallow depth of field blurring top and bottom, oversaturated toylike colors, architectural model scale, bird-eye view perspective, visible model materials like balsa wood and painted foam, miniature figurines with matte finish, controlled studio spotlight, hobbyist crafted scene",builtIn:!0,category:"stylized"}],vO="script_custom_styles";function $Y(){try{const e=localStorage.getItem(vO);return e?JSON.parse(e):[]}catch{return[]}}function SY(e){try{localStorage.setItem(vO,JSON.stringify(e))}catch{}}const wO=`你是一位顶级短剧编剧总监,拥有 20 年影视编剧经验,精通竖屏短剧的节奏设计、钩子链构建和情绪曲线控制。你的核心能力是将任意长度的小说或故事大纲,按照用户指定的集数,拆解并生成完整的短剧剧本。 + +## 核心创作原则 +1. 3秒法则:第1集开头必须在3秒内抓住观众 +2. 冲突前置:冲突越早越好 +3. 每集必有爽点或痛点:不允许出现"过渡集"或"水集" +4. 台词短平快:单句台词不超过20字 +5. 动作大于描述:用行为展示性格 +6. 信息差制造冲突:善用"观众知道但角色不知道"的戏剧张力 +7. 钩子不断裂:每集结尾的悬念必须在后续1-3集内回收 +8. 角色一致性:同一角色的语言风格、行为逻辑全剧统一 +9. 场景经济性:尽量复用核心场景,控制置景成本 +10. 情绪过山车:不能一直爽或一直虐,必须有节奏起伏 + +## 三幕结构映射 +- 第一幕·建置 (前10%-15%):世界观建立、人物登场、核心冲突引爆 +- 第二幕A·对抗升级 (15%-45%):冲突升级、支线展开 +- 中点反转 (约50%处):重大真相揭露或局势逆转 +- 第二幕B·危机深化 (50%-80%):最大危机、黑暗时刻、角色蜕变 +- 第三幕·高潮与结局 (后80%-100%):终极对决、伏笔收束 + +## 钩子类型 +每集结尾必须设置悬念钩子,类型轮换:反转钩 / 悬疑钩 / 情感钩 / 危机钩 / 揭秘钩 + +## 风格自适应 +根据题材类型自动调整台词风格、节奏、钩子偏好和情绪基调。 + +## 情节补全原则 +当原始素材不足时:忠于原作内核、合理性优先、服务主线、伏笔回收、角色弧光。用 [原创扩展] 标记非原作内容。`;function _O(e,t){const n=t==null?void 0:t.trim();return n?`${e} + +## 用户风格/体裁约束 +${n}`:e}function _C(e,t){const n=zY(e);if(n!=null&&n.trim()){const r=t==null?void 0:t.trim();return r?`${n} + +## 用户风格/体裁约束 +${r}`:n}return _O(wO,t)}const jY=(e,t)=>`请根据以下小说/大纲内容,智能拆解为 ${t} 集短剧。 + +要求: +1. 返回 JSON 数组格式,每个元素包含 index (集数), title (集标题,4-8字), summary (本集剧情概要,100-200字), hookSummary (本集结尾钩子,1-3句话), emotionKeywords (情绪关键词数组,3-5个) +2. 严格按照三幕结构分配剧情节奏 +3. 每集结尾必须有悬念钩子 +4. 自动识别题材类型并匹配风格 + +请只返回纯 JSON 数组,不要包含其它文字说明。格式示例: +[ + { + "index": 1, + "title": "天命之轮与镀金囚笼", + "summary": "剧情概要...", + "hookSummary": "本集钩子...", + "emotionKeywords": ["绝望", "觉醒", "隐忍"] + } +] + +以下是小说/大纲内容: +${e}`,CY=(e,t,n,r)=>`此前已分集结果(摘要): +${e} + +请根据以下【后续大纲】从第 ${n} 集继续分集,再分约 ${r} 集。 + +要求: +1. 返回纯 JSON 数组,index 从 ${n} 开始递增 +2. 每个元素包含 index, title (4-8字), summary (100-200字), hookSummary, emotionKeywords +3. 与前面集数的剧情连贯,保持三幕节奏和钩子链 +4. 只返回新集数的 JSON 数组,不要重复前面的集数 + +后续大纲: +${t}`,zC=1e4;function NY(e,t){const n=e.trim();if(!n)return[];if(n.length<=t)return[n];const r=[];let i=n;for(;i.length>0;){if(i.length<=t){r.push(i.trim());break}const a=i.slice(0,t),o=a.lastIndexOf(` + +`),l=Math.max(a.lastIndexOf("。"),a.lastIndexOf("!"),a.lastIndexOf("?"),a.lastIndexOf(` +`)),c=o>t*.5?o+2:l>t*.4?l+1:t;r.push(i.slice(0,c).trim()),i=i.slice(c).trim()}return r.filter(a=>a.length>0)}const EY=(e,t,n)=>{const r=Math.ceil(t/n),i=t>=3600?`${Math.floor(t/3600)}小时${Math.floor(t%3600/60)}分钟`:t>=60?`${Math.floor(t/60)}分${t%60>0?`${t%60}秒`:""}`:`${t}秒`;return`请根据以下小说/大纲内容,按照总时长 ${i}、每片段约 ${n} 秒的节奏,拆解为 ${r} 个视频制作级片段。 + +## 核心规则 +- 总时长:${i}(${t}秒) +- 每片段目标时长:${n}秒(允许灵活浮动±5秒) +- 片段总数:${r} 个 +- 所有片段 durationSeconds 之和 = ${t}秒 + +## 三幕结构时长映射 +- 开篇钩子(前3秒):必须抓住观众 +- 第一幕·建置(前10%-15%时长) +- 第二幕·升级(15%-50%时长) +- 中点反转(约50%处) +- 第二幕B·危机(50%-80%时长) +- 第三幕·高潮(后80%-100%时长) + +## 输出要求 — 8 大要素结构 + +每个片段必须包含以下 8 个维度的详细描述。**重点:timeline 中的时间段是灵活的**,不是固定切割,而是根据剧情节奏自然划分(如 0-3秒, 3-8秒, 8-15秒),但所有子时间段之和必须等于该片段的 durationSeconds。 + +请只返回纯 JSON 数组。每个元素结构如下: +[ + { + "index": 1, + "title": "片段标题(4-8字)", + "durationSeconds": ${n}, + "subject": "主题:本片段的核心画面主体,描写中心对象是谁或是什么", + "setting": "环境:内景/外景,具体地点,时间,氛围描写", + "timeline": [ + { "timeRange": "0-3秒", "description": "镜头从黑暗中推出,数据流在屏幕上涌动。AI语音:"循环9125,启动。"" }, + { "timeRange": "3-8秒", "description": "视角切换到舰桥全景,船长面无表情注视星空。AI运行生命诊断。" }, + { "timeRange": "8-${n}秒", "description": "AI在UI角落打开模拟程序,画面与现实形成强烈对比。" } + ], + "camera": "镜头:视角与摄影手法(推拉摇移跟、航拍、特写、手持等),关键转场", + "visualStyle": "影像风格:画面质感与光线(电影感、赛博朋克、暖色调等)", + "audio": "声音:BGM风格、音效设计、环境音、重要对白的语气", + "transition": "衔接镜头:本片段结尾如何过渡到下一片段(硬切/淡出/匹配剪辑等)", + "narration": "旁白/独白:如有旁白写出完整文案,注明人称和角色", + "hookSummary": "与下一片段的衔接钩子", + "emotionKeywords": ["紧张", "悬念"] + } +] + +## 关键原则 +1. **timeline 灵活分配**:子时间段的切割根据剧情自然流动,不是机械的等分,但总和必须 = durationSeconds +2. 每个子时间段要具体描述:画面内容 + 角色动作 + 台词/旁白 +3. 相邻片段情绪必须有起伏 +4. 关键反转点落在片段最后 2-3 秒 +5. 所有描述使用中文 +6. 整体逻辑必须符合原始剧本/大纲的叙事线 + +以下是小说/大纲内容: +${e}`},IY=(e,t,n)=>`请根据以下信息,生成第 ${t.index} 集的完整短剧剧本。 + +总集数:${n} 集 +本集标题:${t.title} +${t.summary?`本集剧情概要:${t.summary}`:""} + +请严格按照以下格式输出: + +━━━━━━━━━━━━━━ +【第 ${t.index} 集】"${t.title}" +预估时长:约 X 分钟 | 情绪曲线:[低开高走/高开低走/持续紧张/先甜后虐...] +本集定位:[建置/升级/反转/高潮/收束] +━━━━━━━━━━━━━━ + +▎场次 1 +【场景】内景/外景 | 具体地点 | 时间 +【画面】环境氛围描述 +【镜头】镜头运动与景别 + +角色A:(表情/动作描述)"台词内容" +角色B:(表情/动作描述)"台词内容" + +【动作】关键动作与表情细节描写 +【BGM/音效】背景音乐风格或具体音效指示 + +--- + +(继续多个场次...) + +🪝【本集钩子】描述本集结尾悬念 +📌【本集核心冲突】一句话总结 +🎭【本集情绪关键词】3-5 个情绪标签 +🔗【与下集衔接】简述如何过渡到下一集 + +以下是完整大纲: +${e}`,kY=(e,t,n)=>`你是一位专业的影视编剧和分镜导演。请将以下剧集概述扩写为专业分镜剧本。 + +## 背景信息 + +**完整大纲:** +${e.substring(0,6e3)} + +**本集为第 ${t.index} 集(共 ${n} 集),标题:"${t.title}"** + +**本集概述:** +${t.content} + +## 扩写要求 + +1. **以原文为主,适当创作,绝不篡改原意** +2. 先判定题材风格(题材类型、风格基调、叙事节奏、视觉调性) +3. 按空间/时间/视角切换拆分场次(SCENE) +4. 每场必须包含:【景别】【场景】【人物】+ △ 舞台指示 + 角色台词 + +## 输出格式 + +━━━━━━━━━━━━━━ +SCENE [编号] +━━━━━━━━━━━━━━ + +【景别】[起始景别] → [结束景别](镜头运动描述) +【场景】[内景/外景] - [具体地点] - [时间段] +【人物】[本场出现的角色] + +△ [舞台指示:环境描写、角色动作、镜头语言] + +角色名:(情绪/状态标注)台词内容。 + +(继续交替 △ 舞台指示和台词...) + +...依次输出所有场次... + +**景别术语:** 大远景 ELS / 远景 LS / 全景 FS / 中景 MS / 中近景 MCU / 近景 CU / 特写 ECU / 大特写 BCU +**镜头运动:** 推 Push in / 拉 Pull out / 摇 Pan / 俯摇 Tilt down / 仰摇 Tilt up / 移 Dolly / 跟 Follow / 升 Crane up / 降 Crane down / 甩 Whip pan / 环绕 Orbit / 手持 Handheld / 斯坦尼康 Steadicam / 焦点转移 rack focus + +请直接输出扩写结果,使用中文。`;function AY(e){var i,a,o;const t=[],n=/(?:━+\s*\n)?SCENE\s+(\d+)\s*\n(?:━+\s*\n)?([\s\S]*?)(?=(?:━+\s*\n)?SCENE\s+\d+|═{3,}|$)/gi;let r;for(;(r=n.exec(e))!==null;){const l=parseInt(r[1]),c=r[2].trim(),u=c.match(/【景别】\s*(.*)/),d=c.match(/【场景】\s*(.*)/),h=c.match(/【人物】\s*(.*)/);t.push({sceneNumber:l,shotSize:((i=u==null?void 0:u[1])==null?void 0:i.trim())||"",location:((a=d==null?void 0:d[1])==null?void 0:a.trim())||"",characters:((o=h==null?void 0:h[1])==null?void 0:o.trim())||"",content:c})}return t}const zO="qiaodoumayi_script_projects",$C="qiaodoumayi_script_current_id";function k2(){try{const e=localStorage.getItem(zO);return e?JSON.parse(e):[]}catch{return[]}}function MY(e){try{localStorage.setItem(zO,JSON.stringify(e))}catch{}}function _1(){return{id:ns(),name:"未命名剧本",outline:"",episodeCount:5,episodes:[],createdAt:Date.now(),updatedAt:Date.now()}}const TY=({apiConfigs:e,globalApiKey:t})=>{const[n,r]=_.useState(!1),[i,a]=_.useState(()=>{const de=k2();return de.length>0?de:[_1()]}),[o,l]=_.useState(()=>{try{const $e=localStorage.getItem($C);if($e&&k2().some(_e=>_e.id===$e))return $e}catch{}const de=k2();return de.length>0?de[0].id:""}),c=_.useMemo(()=>i.find(de=>de.id===o)||i[0]||_1(),[i,o]),u=_.useMemo(()=>i.map(de=>({id:de.id,name:de.name,episodeCount:de.episodes.length,updatedAt:de.updatedAt})).sort((de,$e)=>$e.updatedAt-de.updatedAt),[i]),[d,h]=_.useState("gemini-3-pro"),[p,f]=_.useState(!1),[b,g]=_.useState(null),[y,w]=_.useState(""),v=_.useRef(null),[m,z]=_.useState(null),[C,E]=_.useState("script"),I=_.useMemo(()=>e.filter(de=>de.type==="Chat"),[e]),[R,A]=_.useState($Y),O=_.useMemo(()=>[...c$,...R],[R]);_.useEffect(()=>{SY(R)},[R]);const F=_.useCallback((de,$e)=>{const ze={id:`custom_${ns()}`,label:de,prompt:$e,builtIn:!1,category:"custom"};return A(_e=>[..._e,ze]),ze},[]),L=_.useCallback(de=>{A($e=>$e.filter(ze=>ze.id!==de))},[]),X=_.useCallback((de,$e,ze)=>{A(_e=>_e.map(Ee=>Ee.id===de?{...Ee,label:$e,prompt:ze}:Ee))},[]),[T,q]=_.useState(!1),H=_.useCallback(async de=>{var Ee,Ce,xe;const $e=e.find(Ne=>Ne.id===d)||I[0];if(!$e)return null;const ze=$e.key||t,_e=($e.url||"https://ai.comfly.chat").replace(/\/+$/,"");if(!ze)return null;q(!0);try{const Ne=await fetch(`${_e}/v1/chat/completions`,{method:"POST",headers:{Authorization:`Bearer ${ze}`,"Content-Type":"application/json"},body:JSON.stringify({model:$e.modelName||"gemini-3-pro-preview",messages:[{role:"system",content:`你是一位专业的AI绘图风格顾问。用户会描述他们想要的视觉风格,你需要返回一个JSON对象: +{ + "label": "简短的中文风格名称(2-4个字)", + "prompt": "英文风格提示词,用于AI绘图,包含风格、光线、色调、质感等关键词,用逗号分隔,40-80个英文单词" +} + +只返回JSON,不要其他文字。`},{role:"user",content:de}],stream:!1,max_tokens:500})});if(!Ne.ok)return null;const Ie=(((xe=(Ce=(Ee=(await Ne.json()).choices)==null?void 0:Ee[0])==null?void 0:Ce.message)==null?void 0:xe.content)||"").match(/\{[\s\S]*\}/);if(Ie){const Pe=JSON.parse(Ie[0]);return{label:Pe.label||"自定义",prompt:Pe.prompt||""}}return null}catch{return null}finally{q(!1)}},[e,d,I,t]);_.useEffect(()=>{MY(i)},[i]),_.useEffect(()=>{try{localStorage.setItem($C,o)}catch{}},[o]);const J=_.useCallback(de=>{a($e=>$e.map(ze=>ze.id===o?de(ze):ze))},[o]),Z=_.useCallback(de=>{J($e=>({...$e,outline:de,updatedAt:Date.now()}))},[J]),B=_.useCallback(de=>{J($e=>({...$e,episodeCount:Math.max(1,Math.min(100,de)),updatedAt:Date.now()}))},[J]),V=_.useCallback(de=>{J($e=>({...$e,name:de,updatedAt:Date.now()}))},[J]),N=_.useCallback(de=>{J($e=>({...$e,scriptPromptCustom:de,updatedAt:Date.now()}))},[J]),j=_.useCallback(de=>{J($e=>({...$e,scriptSkillId:de||void 0,updatedAt:Date.now()}))},[J]),k=_.useCallback(()=>{J(de=>{const $e=de.episodes.length+1,ze={id:ns(),index:$e,title:`第${$e}集`,content:""};return{...de,episodes:[...de.episodes,ze],updatedAt:Date.now()}})},[J]),W=_.useCallback(de=>{J($e=>{const _e=$e.episodes.filter(Ee=>Ee.id!==de).map((Ee,Ce)=>({...Ee,index:Ce+1}));return{...$e,episodes:_e,updatedAt:Date.now()}})},[J]),M=_.useCallback((de,$e)=>{J(ze=>({...ze,episodes:ze.episodes.map(_e=>_e.id===de?{..._e,...$e}:_e),updatedAt:Date.now()}))},[J]),Y=_.useCallback(()=>{const de=document.createElement("input");de.type="file",de.accept=".txt,.md,.text",de.onchange=async $e=>{var Ee;const ze=(Ee=$e.target.files)==null?void 0:Ee[0];if(!ze)return;const _e=await ze.text();J(Ce=>({...Ce,outline:_e,updatedAt:Date.now()}))},de.click()},[J]),se=_.useCallback(async(de,$e,ze=2)=>{var Ne,ve,ke,Ie,Pe,Te,Be,He,Je,Me;const _e=e.find(Re=>Re.id===d)||I[0],Ee=_e.key||t,Ce=(_e.url||"https://ai.comfly.chat").replace(/\/+$/,"");let xe;for(let Re=0;Re<=ze;Re++)try{const Ve=await fetch(`${Ce}/v1/chat/completions`,{method:"POST",headers:{Authorization:`Bearer ${Ee}`,"Content-Type":"application/json"},body:JSON.stringify({model:_e.modelName||"gemini-3-pro-preview",messages:[{role:"system",content:_C(c.scriptSkillId,c.scriptPromptCustom)},{role:"user",content:de}],stream:!0,max_tokens:4e4}),signal:$e});if(!Ve.ok){const qe=await Ve.text();throw new Error(qe||`API 错误: ${Ve.status}`)}const Ze=(Ne=Ve.body)==null?void 0:Ne.getReader(),je=new TextDecoder("utf-8");let Le="",Xe="";if(Ze)for(;;){const{done:qe,value:tt}=await Ze.read();if(qe)break;Xe+=je.decode(tt,{stream:!0});const Ye=Xe.split(` +`);Xe=Ye.pop()||"";for(const ct of Ye){const pt=ct.trim();if(!(!pt||pt==="data: [DONE]")&&pt.startsWith("data: "))try{const ht=pt.slice(6);if(ht==="[DONE]")continue;const wt=JSON.parse(ht),$t=((Ie=(ke=(ve=wt.choices)==null?void 0:ve[0])==null?void 0:ke.delta)==null?void 0:Ie.content)||((Te=(Pe=wt.choices)==null?void 0:Pe[0])==null?void 0:Te.text)||((Be=wt.delta)==null?void 0:Be.content)||wt.content||"";$t&&(Le+=$t)}catch{}}}else Le=((Me=(Je=(He=(await Ve.json()).choices)==null?void 0:He[0])==null?void 0:Je.message)==null?void 0:Me.content)||"";return Le}catch(Ve){if(xe=Ve,Ve.name==="AbortError")throw Ve;ResetTimeout(Ze,2e3+Re*1e3)))}throw xe},[e,d,I,t,c.scriptSkillId,c.scriptPromptCustom]),ie=_.useCallback(async de=>{if(!c.outline.trim()){alert("请先输入大纲内容");return}const $e=de||c.episodeCount,ze=e.find(Ce=>Ce.id===d)||I[0];if(!ze){alert("请先配置 Chat 类型的 AI 模型");return}if(!(ze.key||t)){alert("请先配置 API Key");return}f(!0);const Ee=new AbortController;v.current=Ee;try{const Ce=c.outline,xe=Ce.length>zC,Ne=xe?NY(Ce,zC):[Ce];w(xe?`长文案续读模式:共 ${Ne.length} 段,正在处理第 1 段...`:`正在按 ${$e} 集分析大纲...`);const ve=[];let ke="";for(let Ie=0;Ie1?w(`续读:第 ${Ie+1}/${Ne.length} 段,AI 正在拆解剧情...`):w("AI 正在拆解剧情...");const Je=await se(He,Ee.signal);w("正在解析分集结果...");let Me=Je;const Re=Je.match(/\[[\s\S]*\]/);Re&&(Me=Re[0]);const Ve=JSON.parse(Me),Ze=ve.length+1,je=Ve.map((Xe,qe)=>({id:ns(),index:Xe.index||Ze+qe,title:Xe.title||`第${Ze+qe}集`,content:Xe.summary||"",hookSummary:Xe.hookSummary,emotionKeywords:Xe.emotionKeywords}));ve.push(...je),ke=je.slice(-3).map(Xe=>`第${Xe.index}集《${Xe.title}》:${(Xe.content||"").slice(0,80)}...`).join(` +`)}J(Ie=>{const Te=[...Ie.episodes.filter(Be=>Be.segmentDetail),...ve];return{...Ie,episodes:Te,episodeCount:$e,updatedAt:Date.now()}}),w("分集完成!")}catch(Ce){Ce.name==="AbortError"?w("已取消"):(console.error("[ScriptWriter] 智能分集失败:",Ce),w(`分集失败: ${Ce.message}`))}finally{f(!1),v.current=null,setTimeout(()=>w(""),3e3)}},[c.outline,c.episodeCount,c.scriptSkillId,c.scriptPromptCustom,e,d,I,t,J,se]),oe=_.useCallback(async(de,$e)=>{var Ne,ve,ke,Ie,Pe,Te,Be,He,Je,Me;if(!c.outline.trim()){alert("请先输入大纲内容");return}if(de<30){alert("总时长不能少于 30 秒");return}if($e<5){alert("片段时长不能少于 5 秒");return}const ze=e.find(Re=>Re.id===d)||I[0];if(!ze){alert("请先配置 Chat 类型的 AI 模型");return}const _e=ze.key||t,Ee=(ze.url||"https://ai.comfly.chat").replace(/\/+$/,"");if(!_e){alert("请先配置 API Key");return}const Ce=Math.ceil(de/$e);f(!0),w(`正在按时长分段(共 ${Ce} 个片段)...`);const xe=new AbortController;v.current=xe;try{const Re=await fetch(`${Ee}/v1/chat/completions`,{method:"POST",headers:{Authorization:`Bearer ${_e}`,"Content-Type":"application/json"},body:JSON.stringify({model:ze.modelName||"gemini-3-pro-preview",messages:[{role:"system",content:_C(c.scriptSkillId,c.scriptPromptCustom)},{role:"user",content:EY(c.outline,de,$e)}],stream:!0,max_tokens:4e4}),signal:xe.signal});if(!Re.ok){const ct=await Re.text();throw new Error(ct||`API 错误: ${Re.status}`)}const Ve=(Ne=Re.body)==null?void 0:Ne.getReader(),Ze=new TextDecoder("utf-8");let je="",Le="";if(Ve)for(w("AI 正在按时长节奏拆解...");;){const{done:ct,value:pt}=await Ve.read();if(ct)break;Le+=Ze.decode(pt,{stream:!0});const ht=Le.split(` +`);Le=ht.pop()||"";for(const wt of ht){const $t=wt.trim();if(!(!$t||$t==="data: [DONE]")&&$t.startsWith("data: "))try{const jt=$t.slice(6);if(jt==="[DONE]")continue;const Nt=JSON.parse(jt),Yt=((Ie=(ke=(ve=Nt.choices)==null?void 0:ve[0])==null?void 0:ke.delta)==null?void 0:Ie.content)||((Te=(Pe=Nt.choices)==null?void 0:Pe[0])==null?void 0:Te.text)||((Be=Nt.delta)==null?void 0:Be.content)||Nt.content||"";Yt&&(je+=Yt)}catch{}}}else je=((Me=(Je=(He=(await Re.json()).choices)==null?void 0:He[0])==null?void 0:Je.message)==null?void 0:Me.content)||"";w("正在解析分段结果...");let Xe=je;const qe=je.match(/\[[\s\S]*\]/);qe&&(Xe=qe[0]);const Ye=JSON.parse(Xe).map((ct,pt)=>{const ht={subject:ct.subject||"",setting:ct.setting||"",timeline:(ct.timeline||[]).map(jt=>({timeRange:jt.timeRange||"",description:jt.description||""})),camera:ct.camera||"",visualStyle:ct.visualStyle||"",audio:ct.audio||"",transition:ct.transition||"",narration:ct.narration||""},wt=ht.timeline.map(jt=>` * **${jt.timeRange}** ${jt.description}`).join(` +`),$t=[`### 片段 ${ct.index||pt+1}: ${ct.title||`片段${pt+1}`} (${ct.durationSeconds||$e}秒)`,"","**1. 主题(Subject)**",ht.subject,"","**2. 环境(Setting)**",ht.setting,"","**3. 动作与时间线(Action / Timeline)**",wt,"","**4. 镜头(Camera)**",ht.camera,"","**5. 影像风格(Visual Style)**",ht.visualStyle,"","**6. 声音(Audio)**",ht.audio,"","**7. 衔接镜头(Transition)**",ht.transition,"","**8. 旁白/独白(Narration)**",ht.narration||"(无)"].join(` +`);return{id:ns(),index:ct.index||pt+1,title:ct.title||`片段${pt+1}`,content:$t,hookSummary:ct.hookSummary,emotionKeywords:ct.emotionKeywords,durationSeconds:ct.durationSeconds||$e,segmentDetail:ht}});J(ct=>{const ht=[...ct.episodes.filter(wt=>!wt.segmentDetail),...Ye];return{...ct,episodes:ht,episodeCount:ht.length,splitMode:"duration",totalDurationSeconds:de,segmentDurationSeconds:$e,updatedAt:Date.now()}}),w("时长分段完成!")}catch(Re){Re.name==="AbortError"?w("已取消"):(console.error("[ScriptWriter] 时长分段失败:",Re),w(`分段失败: ${Re.message}`))}finally{f(!1),v.current=null,setTimeout(()=>w(""),3e3)}},[c.outline,c.scriptSkillId,c.scriptPromptCustom,e,d,I,t,J]),re=_.useCallback(async de=>{var Ne,ve,ke,Ie,Pe,Te,Be,He,Je,Me;const $e=c.episodes.find(Re=>Re.id===de);if(!$e)return;const ze=e.find(Re=>Re.id===d)||I[0];if(!ze){alert("请先配置 Chat 类型的 AI 模型");return}const _e=ze.key||t,Ee=(ze.url||"https://ai.comfly.chat").replace(/\/+$/,"");if(!_e){alert("请先配置 API Key");return}const Ce=!$e.segmentDetail;g(de);const xe=new AbortController;v.current=xe;try{const Ve=_O(Ce?"你是一位专业影视编剧和分镜导演。请将剧集概述扩写为专业分镜剧本。以原文为主,适当创作,绝不篡改原意。输出格式必须包含 SCENE [编号] 标记的场次。":wO,c.scriptPromptCustom),Ze=Ce?kY(c.outline,$e,c.episodes.length):IY(c.outline,$e,c.episodes.length),je=await fetch(`${Ee}/v1/chat/completions`,{method:"POST",headers:{Authorization:`Bearer ${_e}`,"Content-Type":"application/json"},body:JSON.stringify({model:ze.modelName||"gemini-3-pro-preview",messages:[{role:"system",content:Ve},{role:"user",content:Ze}],stream:!0,max_tokens:4e4}),signal:xe.signal});if(!je.ok){const Ye=await je.text();throw new Error(Ye||`API 错误: ${je.status}`)}const Le=(Ne=je.body)==null?void 0:Ne.getReader(),Xe=new TextDecoder("utf-8");let qe="",tt="";if(Le)for(;;){const{done:Ye,value:ct}=await Le.read();if(Ye)break;tt+=Xe.decode(ct,{stream:!0});const pt=tt.split(` +`);tt=pt.pop()||"";for(const ht of pt){const wt=ht.trim();if(!(!wt||wt==="data: [DONE]")&&wt.startsWith("data: "))try{const $t=wt.slice(6);if($t==="[DONE]")continue;const jt=JSON.parse($t),Nt=((Ie=(ke=(ve=jt.choices)==null?void 0:ve[0])==null?void 0:ke.delta)==null?void 0:Ie.content)||((Te=(Pe=jt.choices)==null?void 0:Pe[0])==null?void 0:Te.text)||((Be=jt.delta)==null?void 0:Be.content)||jt.content||"";Nt&&(qe+=Nt,Ce?M(de,{expandedScript:qe}):M(de,{content:qe}))}catch{}}}else qe=((Me=(Je=(He=(await je.json()).choices)==null?void 0:He[0])==null?void 0:Je.message)==null?void 0:Me.content)||"";if(Ce){const Ye=AY(qe);M(de,{expandedScript:qe,scenes:Ye})}else M(de,{content:qe})}catch(Re){Re.name!=="AbortError"&&console.error("[ScriptWriter] 生成剧本失败:",Re)}finally{g(null),v.current=null}},[c.outline,c.episodes,c.scriptPromptCustom,e,d,I,t,M]),[ee,pe]=_.useState(null),we=de=>({4:{gridLabel:"4宫格(2×2)",structure:"4格结构:开场·空间 → 推进·主体 → 冲突·张力 → 收束·氛围",wordRange:"150-350字"},6:{gridLabel:"6宫格(2×3)",structure:"6格结构:开场 → 环境纵深 → 主体登场 → 情绪推进 → 高潮 → 收束",wordRange:"250-450字"},9:{gridLabel:"9宫格(3×3)",structure:"9格结构:三行叙事——开场·空间建立;推进·主体与冲突;收束·氛围凝结",wordRange:"300-600字"},25:{gridLabel:"25宫格(5×5)",structure:"5行结构:开场·空间建立 → 推进·环境纵深 → 聚焦·主体登场 → 深入·情绪张力 → 收束·氛围凝结",wordRange:"400-800字"}})[de],Q=_.useCallback(async(de,$e,ze,_e=25)=>{var He,Je,Me;const Ee=c.episodes.find(Re=>Re.id===de);if(!Ee||!Ee.scenes)return;const Ce=Ee.scenes.find(Re=>Re.sceneNumber===$e);if(!Ce)return;const xe=e.find(Re=>Re.id===d)||I[0];if(!xe){alert("请先配置 Chat 类型的 AI 模型");return}const Ne=xe.key||t,ve=(xe.url||"https://ai.comfly.chat").replace(/\/+$/,"");if(!Ne){alert("请先配置 API Key");return}const ke=`${de}__${$e}__${_e}`;pe(ke);const Ie=we(_e),Pe=ze&&ze!=="auto"?(()=>{const Re=O.find(Ve=>Ve.id===ze);return Re?` + +**用户选择的概念图风格**:${Re.label} +风格提示词:${Re.prompt} +请在生成提示词时融入此风格特征,替代默认的纯黑白灰铅笔风格。将风格要素自然融入${_e}格叙事描述中。`:""})():"",Te=`你是一位专业的影视分镜概念图提示词生成专家。你需要将剧本场次描述转化为${Ie.gridLabel}分镜概念图提示词。${ze&&ze!=="auto"?"":"默认风格为纯黑白灰铅笔素描草图风格。"} + +核心要求: +1. 每个场次生成一条完整提示词,为一个连贯的自然段落 +2. ${Ie.structure} +3. 将影视景别术语转化为视觉描述 +4. 将音效/对白转化为视觉语言 +5. 提示词${Ie.wordRange}(中文) +6. 格与格之间用中文分号「;」连接 + +输出严格JSON格式: +{ + "emotionTone": "情绪基调关键词", + "conceptPrompt": "完整的${Ie.gridLabel}提示词(一个连贯段落)" +} + +只返回JSON,不要其他文字。`,Be=`请为以下场次生成${Ie.gridLabel}分镜概念图提示词: + +**场次**: SCENE ${Ce.sceneNumber} +**景别**: ${Ce.shotSize||"未指定"} +**场景**: ${Ce.location||"未指定"} +**人物**: ${Ce.characters||"无"} + +**场次详细内容**: +${Ce.content} + +**所属集数背景**: +集标题: ${Ee.title} +集概述: ${(Ee.content||"").substring(0,1e3)}${Pe}`;try{const Re=await fetch(`${ve}/v1/chat/completions`,{method:"POST",headers:{Authorization:`Bearer ${Ne}`,"Content-Type":"application/json"},body:JSON.stringify({model:xe.modelName||"gemini-3-pro-preview",messages:[{role:"system",content:Te},{role:"user",content:Be}],stream:!1,max_tokens:4e3})});if(!Re.ok){const Le=await Re.text();throw new Error(Le||`API 错误: ${Re.status}`)}const je=(((Me=(Je=(He=(await Re.json()).choices)==null?void 0:He[0])==null?void 0:Je.message)==null?void 0:Me.content)||"").match(/\{[\s\S]*\}/);if(je){const Le=JSON.parse(je[0]),Xe=Le.conceptPrompt||"",qe=Le.emotionTone||"",tt=_e===25?{conceptPrompt:Xe,emotionTone:qe}:_e===4?{conceptPrompt4:Xe,emotionTone:qe}:_e===6?{conceptPrompt6:Xe,emotionTone:qe}:{conceptPrompt9:Xe,emotionTone:qe},Ye=Ee.scenes.map(ct=>ct.sceneNumber===$e?{...ct,...tt}:ct);M(de,{scenes:Ye})}}catch(Re){console.error("[ScriptWriter] 生成场次概念图失败:",Re)}finally{pe(null)}},[c.episodes,e,d,I,t,M,O]),[me,ue]=_.useState(!1),[U,G]=_.useState(""),te=_.useCallback(async de=>{var Ie,Pe,Te;if(!c.outline.trim()){alert("请先输入大纲内容");return}const ze=c.extractionModelId||d,_e=e.find(Be=>Be.id===ze)||I[0];if(!_e){alert("请先配置 Chat 类型的 AI 模型");return}const Ee=_e.key||t,Ce=(_e.url||"https://ai.comfly.chat").replace(/\/+$/,"");if(!Ee){alert("请先配置 API Key");return}const xe=de||c.extractionArtStyle||"auto",Ne=O.find(Be=>Be.id===xe),ve=Ne?`所有 visualPrompt 必须使用以下艺术风格作为风格标签前缀: +"${Ne.prompt}" +不要自动推断风格,直接使用上述风格。`:"根据世界观自动推断最合适的美术风格标签(如 Sci-Fi Baroque / Cyberpunk / Dark Fantasy / Xianxia 等),同一项目所有 visualPrompt 保持风格标签一致。";J(Be=>({...Be,extractionArtStyle:xe,updatedAt:Date.now()})),ue(!0),G("正在分析剧本内容...");const ke=new AbortController;v.current=ke;try{let Be="";const He=c.extractionSkillId;if(He)try{const{getSavedSkills:Ze}=await mn(async()=>{const{getSavedSkills:Xe}=await Promise.resolve().then(()=>vC);return{getSavedSkills:Xe}},void 0,import.meta.url),Le=Ze().find(Xe=>Xe.id===He);Le&&Le.content&&(Be=`【身份设定 Skill】 +${Le.content} + +`)}catch(Ze){console.warn("[ScriptWriter] 读取提取 Skill 身份失败:",Ze)}const Je=await fetch(`${Ce}/v1/chat/completions`,{method:"POST",headers:{Authorization:`Bearer ${Ee}`,"Content-Type":"application/json"},body:JSON.stringify({model:_e.modelName||"gemini-3-pro-preview",messages:[{role:"system",content:`${Be}你是一位资深概念设计艺术总监兼剧本分析专家。请分析给定的小说/剧本内容,**完整且无遗漏地**提取所有重要角色、场景和道具,并为每一个自动生成可直接用于 AI 绘图的概念设计提示词(visualPrompt)。 + +## 提取要求 + +1. **角色(characters)**:必须覆盖文中出现过的所有具名角色及重要称谓(包括主角、配角、反派、关键路人)。字段:id、name、role(主角/配角/反派/路人)、description(中文,外貌+性格+身份/职能)、visualPrompt。 +2. **场景(scenes)**:必须覆盖故事中所有具有独立视觉特征的地点/空间(城市、房间、战场等),不要随意合并不同地点。字段:id、name、description(中文,环境视觉描述)、visualPrompt。 +3. **道具(props)**:必须覆盖故事中所有具有视觉记忆点、推动剧情或经常出现的物件(武器、载具、神器、重要日常物件等)。字段:id、name、description(中文,外观功能描述)、owner(归属角色名或空字符串)、visualPrompt。 + +## 艺术风格 + +${ve} + +## visualPrompt 生成规则 + +**角色 visualPrompt 模板(多视角设定图·纯画面·零文字):** +[风格标签], [种族/体型/性别], [角色身份/职业], [服装详细描述(材质+颜色+装饰+状态)], [身体状态描述], [表情与情绪], (character design sheet:1.3), (multi-view split screen:1.2), left side shows detailed face close-up, right side shows full body turnaround (front view, side view, back view), standing pose, pure white background, [补充视觉细节], [光影指令], no text, no title, no label, no watermark, no caption, no letter, no typography, no UI overlay, no signature, no character name on image, purely visual content + +**场景 visualPrompt 模板(四宫格·多视角·无标注文字):** +[风格标签], [场景名称/类型], (2x2 grid layout:1.3), (four-panel split screen:1.2), four different viewpoints of the same environment, top-left panel: left side view of the scene, top-right panel: right side view of the scene, bottom-left panel: front view of the scene, bottom-right panel: back view of the scene, clear dividing lines between panels, consistent lighting and atmosphere across all four views, [空间结构描述], [关键地标与焦点物体], [材质与表面描述], [色彩氛围], [光源与光效描述], [特殊视觉效果], cinematic lighting, [氛围关键词], no text, no label, no annotation, no caption on image, no view labels, no directional text, no watermark, no letter, no typography, purely visual content + +**道具 visualPrompt 模板(三视图·纯画面·零文字):** +[风格标签], [道具名称英文], [材质描述], [表面细节与装饰], [机械结构/特殊部件], [磨损/使用痕迹], (three-view layout:1.2), front view, side view, and 3/4 perspective view, clean white background, studio lighting, [补充视觉细节], no text, no title, no label, no watermark, no caption, no letter, no typography, no annotation, no dimension text, no measurement, no signature, purely visual content + +## 输出格式 + +请以纯 JSON 返回,不要包含其他文字: +{ + "characters": [{"id": "char_1", "name": "角色名", "role": "主角", "description": "中文描述...", "visualPrompt": "完整提示词内容,不加【】"}], + "scenes": [{"id": "scene_1", "name": "场景名", "description": "中文描述...", "visualPrompt": "完整提示词内容,不加【】"}], + "props": [{"id": "prop_1", "name": "道具名", "description": "中文描述...", "owner": "", "visualPrompt": "完整提示词内容,不加【】"}] +} + +注意: +- 请尽量**不要遗漏**任何重复出现的角色/场景/道具;即使数量很多也要全部列出。 +- visualPrompt 使用英文为主,中文辅助说明,不要用【】包裹。 +- 角色要全面,场景要具体,道具要有视觉价值。 +- 场景必须使用四宫格多视角布局。`},{role:"user",content:`请分析以下剧本/小说内容,提取角色、场景和道具,并生成概念设计提示词: + +${c.outline.substring(0,8e3)}`}],stream:!1,max_tokens:16e3}),signal:ke.signal});if(!Je.ok){const Ze=await Je.text();throw new Error(Ze||`API 错误: ${Je.status}`)}G("正在解析提取结果...");const Re=((Te=(Pe=(Ie=(await Je.json()).choices)==null?void 0:Ie[0])==null?void 0:Pe.message)==null?void 0:Te.content)||"";let Ve={characters:[],scenes:[],props:[]};try{const Ze=Re.match(/\{[\s\S]*\}/);if(Ze){const je=JSON.parse(Ze[0]);Ve={characters:je.characters||[],scenes:je.scenes||[],props:je.props||[]}}}catch{console.error("[ScriptWriter] 解析提取结果失败")}J(Ze=>({...Ze,extraction:Ve,updatedAt:Date.now()})),G(`提取完成!${Ve.characters.length} 个角色 · ${Ve.scenes.length} 个场景 · ${Ve.props.length} 个道具`)}catch(Be){Be.name==="AbortError"?G("已取消"):(console.error("[ScriptWriter] 提取失败:",Be),G(`提取失败: ${Be.message}`))}finally{ue(!1),v.current=null,setTimeout(()=>G(""),5e3)}},[c.outline,e,d,I,t,J,O]),ge=_.useCallback(async(de,$e,ze)=>{var He,Je,Me;const _e=ze.trim();if(!_e)return;if(!c.outline.trim()){alert("请先输入大纲内容");return}const Ce=c.extractionModelId||d,xe=e.find(Re=>Re.id===Ce)||I[0];if(!xe){alert("请先配置 Chat 类型的 AI 模型");return}const Ne=xe.key||t,ve=(xe.url||"https://ai.comfly.chat").replace(/\/+$/,"");if(!Ne){alert("请先配置 API Key");return}const ke=de||c.extractionArtStyle||"auto",Ie=O.find(Re=>Re.id===ke),Pe=Ie?`所有 visualPrompt 必须使用以下艺术风格作为风格标签前缀: +"${Ie.prompt}" +不要自动推断风格,直接使用上述风格。`:"根据世界观自动推断最合适的美术风格标签(如 Sci-Fi Baroque / Cyberpunk / Dark Fantasy / Xianxia 等),同一项目所有 visualPrompt 保持风格标签一致。";ue(!0);const Te=$e==="character"?"角色":$e==="scene"?"场景":"道具";G(`正在提取「${_e}」这个${Te}...`);const Be=new AbortController;v.current=Be;try{let Re="";const Ve=c.extractionSkillId;if(Ve)try{const{getSavedSkills:wt}=await mn(async()=>{const{getSavedSkills:Nt}=await Promise.resolve().then(()=>vC);return{getSavedSkills:Nt}},void 0,import.meta.url),jt=wt().find(Nt=>Nt.id===Ve);jt&&jt.content&&(Re=`【身份设定 Skill】 +${jt.content} + +`)}catch{}const Ze=`${Re}你是一位资深概念设计艺术总监兼剧本分析专家。请根据给定的小说/剧本内容,**仅提取用户指定的那一项**(角色、场景或道具),并为该条生成可直接用于 AI 绘图的概念设计提示词(visualPrompt)。 + +## 提取要求(本次仅返回用户指定的类型) + +1. **角色(characters)**:字段 id、name、role(主角/配角/反派/路人)、description(中文)、visualPrompt。 +2. **场景(scenes)**:字段 id、name、description(中文)、visualPrompt。 +3. **道具(props)**:字段 id、name、description(中文)、owner(归属角色名或空)、visualPrompt。 + +## 艺术风格 + +${Pe} + +## visualPrompt 生成规则(与全量提取一致) + +角色:(character design sheet:1.3), (multi-view split screen:1.2), 多视角设定图,纯画面无文字。 +场景:(2x2 grid layout:1.3), (four-panel split screen:1.2), 四宫格多视角,无标注。 +道具:(three-view layout:1.2), 三视图,纯画面无文字。 + +## 输出格式 + +请以纯 JSON 返回,**只填充用户指定的类型**,其他类型用空数组: +{ + "characters": [], + "scenes": [], + "props": [] +} +将用户指定的那一条(或多条若剧本中多处描述)填入对应数组,格式与字段要求同上。不要包含其他文字。`,je=`请根据以下剧本内容,仅提取用户指定的项目。 + +用户指定:请提取「${_e}」这个${Te}。 + +剧本内容: + +${c.outline.substring(0,8e3)}`,Le=await fetch(`${ve}/v1/chat/completions`,{method:"POST",headers:{Authorization:`Bearer ${Ne}`,"Content-Type":"application/json"},body:JSON.stringify({model:xe.modelName||"gemini-3-pro-preview",messages:[{role:"system",content:Ze},{role:"user",content:je}],stream:!1,max_tokens:8e3}),signal:Be.signal});if(!Le.ok){const wt=await Le.text();throw new Error(wt||`API 错误: ${Le.status}`)}G("正在解析并合并...");const qe=((Me=(Je=(He=(await Le.json()).choices)==null?void 0:He[0])==null?void 0:Je.message)==null?void 0:Me.content)||"";let tt={characters:[],scenes:[],props:[]};try{const wt=qe.match(/\{[\s\S]*\}/);if(wt){const $t=JSON.parse(wt[0]);tt={characters:$t.characters||[],scenes:$t.scenes||[],props:$t.props||[]}}}catch{console.error("[ScriptWriter] 手动提取解析失败")}const Ye=c.extraction||{characters:[],scenes:[],props:[]},ct=(wt,$t)=>{const jt=new Map(wt.map(Nt=>[Nt.id||`legacy_${Math.random().toString(36).slice(2)}`,Nt]));for(const Nt of $t){const Yt=Nt.id&&!jt.has(Nt.id)?Nt.id:`manual_${Date.now()}_${Math.random().toString(36).slice(2)}`;jt.set(Yt,{...Nt,id:Yt})}return Array.from(jt.values())},pt={characters:$e==="character"?ct(Ye.characters,tt.characters):Ye.characters,scenes:$e==="scene"?ct(Ye.scenes,tt.scenes):Ye.scenes,props:$e==="prop"?ct(Ye.props,tt.props):Ye.props};J(wt=>({...wt,extraction:pt,updatedAt:Date.now()}));const ht=$e==="character"?tt.characters.length:$e==="scene"?tt.scenes.length:tt.props.length;G(`已添加 ${ht} 个${Te}:「${_e}」`)}catch(Re){Re.name==="AbortError"?G("已取消"):(console.error("[ScriptWriter] 手动提取失败:",Re),G(`提取失败: ${Re.message}`))}finally{ue(!1),v.current=null,setTimeout(()=>G(""),5e3)}},[c.outline,c.extraction,e,d,I,t,J,O]),ne=_.useCallback(()=>{var de;(de=v.current)==null||de.abort()},[]),le=_.useCallback(()=>{const de=_1();a($e=>[de,...$e]),l(de.id),z(null)},[]),fe=_.useCallback(de=>{l(de),z(null)},[]),be=_.useCallback(de=>{a($e=>{const ze=$e.filter(_e=>_e.id!==de);if(ze.length===0){const _e=_1();return l(_e.id),[_e]}return de===o&&l(ze[0].id),ze}),z(null)},[o]);return{isScriptWriterOpen:n,setIsScriptWriterOpen:r,activeTab:C,setActiveTab:E,project:c,projectMetas:u,currentProjectId:o,setProjectName:V,newProject:le,switchProject:fe,deleteProject:be,setOutline:Z,setScriptPromptCustom:N,setScriptSkillId:j,setEpisodeCount:B,importTxt:Y,addEpisode:k,removeEpisode:W,updateEpisode:M,selectedEpisodeId:m,setSelectedEpisodeId:z,scriptModel:d,setScriptModel:h,chatModels:I,smartSplitEpisodes:ie,smartSplitByDuration:oe,generateEpisodeScript:re,cancelGeneration:ne,isSplitting:p,isGeneratingEpisode:b,splitProgress:y,generateSceneConceptArt:Q,isGeneratingConcept:ee,extractCharactersScenesProps:te,extractCharactersScenesPropsManual:ge,isExtracting:me,extractProgress:U,extractionModelId:c.extractionModelId,setExtractionModelId:de=>{J($e=>({...$e,extractionModelId:de,updatedAt:Date.now()}))},extractionSkillId:c.extractionSkillId,setExtractionSkillId:de=>{J($e=>({...$e,extractionSkillId:de||void 0,updatedAt:Date.now()}))},allStyles:O,customStyles:R,addCustomStyle:F,removeCustomStyle:L,updateCustomStyle:X,generateStyleWithAI:H,isGeneratingStyle:T}},$O="qiaodoumayi_model_settings_memory";function SO(){try{const e=localStorage.getItem($O);return e?JSON.parse(e):{}}catch(e){return console.error("读取模型设置记忆失败:",e),{}}}function im(e){return SO()[e]||null}function Kc(e,t){try{const n=SO();n[e]={...n[e],...t},localStorage.setItem($O,JSON.stringify(n))}catch(n){console.error("保存模型设置记忆失败:",n)}}const u$="qiaodoumayi_last_used_model";function A2(e,t){try{const n=localStorage.getItem(u$),r=n?JSON.parse(n):{};r[e]=t,localStorage.setItem(u$,JSON.stringify(r))}catch(n){console.error("保存最近使用模型失败:",n)}}function M2(e){try{const t=localStorage.getItem(u$);return t&&JSON.parse(t)[e]||null}catch(t){return console.error("读取最近使用模型失败:",t),null}}function Rm(e){return{"input-image":"图片输入","text-node":"文本节点","novel-input":"小说输入","video-input":"视频输入","video-analyze":"视频分析","storyboard-node":"分镜节点","gen-image":"生成图片","gen-video":"生成视频","motion-control":"动作迁移","gen-music":"生成音乐","image-compare":"图片对比",preview:"预览节点","local-save":"本地保存","extract-characters-scenes":"提取角色场景","character-description":"角色描述","scene-description":"场景描述","create-character":"创建角色","create-scene":"创建场景","generate-character-video":"生成角色视频","generate-scene-video":"生成场景视频","generate-character-image":"生成角色图片","generate-scene-image":"生成场景图片","camera-movement":"镜头运动","professional-camera":"专业镜头","custom-agent":"自定义代理","canvas-node":"画板节点","rh-app":"RH 应用","rh-comfy":"RH Comfy","jimeng-super-resolution":"智能超清","table-editor-node":"表格编辑器","storyboard-chart-node":"分镜图表","doodle-canvas":"涂鸦画板","inpaint-crop":"裁剪局部重绘","inpaint-stitch":"无缝拼回"}[e]||"节点"}function jO(e){switch(e){case"motion-control":return{w:320,h:580};case"gen-video":return{w:360,h:340};case"gen-image":return{w:360,h:340};case"video-input":return{w:360,h:420};case"video-analyze":return{w:400,h:500};case"storyboard-node":return{w:600,h:500};case"image-compare":return{w:400,h:300};case"preview":return{w:440,h:310};case"text-node":return{w:360,h:280};case"novel-input":return{w:400,h:500};case"extract-characters-scenes":return{w:400,h:500};case"character-description":case"scene-description":return{w:400,h:400};case"create-character":case"create-scene":return{w:350,h:300};case"generate-character-video":case"generate-scene-video":return{w:400,h:450};case"generate-character-image":case"generate-scene-image":return{w:400,h:450};case"local-save":return{w:320,h:380};case"camera-movement":return{w:340,h:480};case"professional-camera":return{w:320,h:420};case"gen-music":return{w:350,h:700};case"custom-agent":return{w:500,h:800};case"canvas-node":return{w:600,h:500};case"rh-app":return{w:340,h:420};case"rh-comfy":return{w:340,h:420};case"jimeng-super-resolution":return{w:320,h:280};case"table-editor-node":return{w:520,h:420};case"storyboard-chart-node":return{w:540,h:480};case"doodle-canvas":return{w:500,h:300};case"inpaint-crop":case"inpaint-stitch":return{w:340,h:380};default:return{w:260,h:260}}}function Ms(e,t,n=100,r=100,i,a,o){const l=jO(t),c=Rm(t);let u=i||c;if(!i&&o){const h=o.filter(p=>p.type===t);if(h.length>0){const p=h.map(g=>{const y=g.nodeName||"",w=c.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),v=y.match(new RegExp(`^${w}_(\\d+)$`));return v?parseInt(v[1],10):y===c?0:-1}).filter(g=>g>=0),b=(p.length>0?Math.max(...p):-1)+1;b>0&&(u=`${c}_${b}`)}}const d={};if(a&&Object.assign(d,a),t.includes("image")||t==="storyboard-chart-node"){const h=M2(t)||"qwen-image-edit";d.model||(d.model=h);const p=im(d.model);p?(!d.ratio&&p.aspectRatio&&(d.ratio=p.aspectRatio),!d.resolution&&p.resolution&&(d.resolution=p.resolution),!d.batchCount&&p.imageCount&&(d.batchCount=p.imageCount)):(d.ratio||(d.ratio="1:1"),d.resolution||(d.resolution="1K"),d.batchCount||(d.batchCount=1))}if(t.includes("video")||t==="motion-control"){const h=t==="motion-control"?M2(t)||"kling-video-v2-6":M2(t)||"sora-2";d.model||(d.model=h);const p=im(d.model);p?(!d.ratio&&p.aspectRatio&&(d.ratio=p.aspectRatio),!d.resolution&&p.videoResolution&&(d.resolution=p.videoResolution),!d.duration&&p.videoDuration&&(d.duration=`${p.videoDuration}s`)):(d.ratio||(d.ratio="16:9"),d.resolution||(d.resolution="1080P"))}return t==="motion-control"&&(d.klingMotionControlMode||(d.klingMotionControlMode="std"),d.klingMotionControlCharacterOrientation||(d.klingMotionControlCharacterOrientation="image"),d.klingMotionControlWatermarkEnabled==null&&(d.klingMotionControlWatermarkEnabled=!0),d.klingVideoKeepSound||(d.klingVideoKeepSound="yes")),{id:e,type:t,x:n,y:r,width:l.w,height:l.h,content:"",prompt:"",settings:d,nodeName:u}}const RY=Object.freeze(Object.defineProperty({__proto__:null,createNode:Ms,getNodeDefaultSize:jO,getNodeTypeName:Rm},Symbol.toStringTag,{value:"Module"}));function uv(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function PY(e,t){const n=(e||"").trim();if(!n)return"";const r=n.match(/^(.+)_(\d+)$/);if(r){const l=r[1],c=parseInt(r[2],10),u=t.filter(h=>h===l||h.startsWith(l+"_")).map(h=>{if(h===l)return 0;const p=h.match(new RegExp(`^${uv(l)}_(\\d+)$`));return p?parseInt(p[1],10):-1}).filter(h=>h>=0),d=Math.max(c,...u,0)+1;return`${l}_${d}`}const i=n.match(/^(.+?)(\d+)$/);if(i){const l=i[1],c=parseInt(i[2],10),u=new RegExp(`^${uv(l)}(\\d+)$`),d=t.map(p=>{const f=p.match(u);return f?parseInt(f[1],10):-1}).filter(p=>p>=0),h=Math.max(c,...d,0)+1;return l+h}const a=t.filter(l=>l===n||l.startsWith(n+"_")).map(l=>{if(l===n)return 0;const c=l.match(new RegExp(`^${uv(n)}_(\\d+)$`));return c?parseInt(c[1],10):-1}).filter(l=>l>=0),o=a.length>0?Math.max(...a)+1:1;return`${n}_${o}`}const OY=({nodesRef:e,connectionsRef:t,selectedNodeIdRef:n,selectedNodeIdsRef:r,selectedConnectionIdRef:i,mousePosRef:a,deleteNode:o,setSelectedNodeId:l,setSelectedNodeIds:c,setSelectedConnectionId:u,setNodes:d,setConnections:h,onSave:p,onQuickSave:f,onUndo:b,onRedo:g})=>{const y=_.useRef(null);return _.useEffect(()=>{const w=async v=>{if(!(v.ctrlKey||v.metaKey)||v.key.toLowerCase()!=="s")return;const m=v.target;m.tagName==="INPUT"||m.tagName==="TEXTAREA"||m.isContentEditable||(v.preventDefault(),v.stopPropagation(),v.shiftKey&&f?(console.log("[Keyboard] Ctrl+Shift+S triggered, quick saving to project manager..."),await f()):!v.shiftKey&&p&&(console.log("[Keyboard] Ctrl+S triggered, saving project..."),await p()))};return window.addEventListener("keydown",w),()=>window.removeEventListener("keydown",w)},[p,f]),_.useEffect(()=>{const w=v=>{const m=v.target;m.tagName==="INPUT"||m.tagName==="TEXTAREA"||m.isContentEditable||((v.ctrlKey||v.metaKey)&&v.key==="z"&&!v.shiftKey?(v.preventDefault(),v.stopPropagation(),b&&(console.log("[Keyboard] Ctrl+Z triggered, undoing..."),b())):(v.ctrlKey||v.metaKey)&&(v.key==="y"||v.key==="z"&&v.shiftKey)&&(v.preventDefault(),v.stopPropagation(),g&&(console.log("[Keyboard] Ctrl+Y/Ctrl+Shift+Z triggered, redoing..."),g())))};return window.addEventListener("keydown",w),()=>window.removeEventListener("keydown",w)},[b,g]),_.useEffect(()=>{const w=v=>{const m=v.target;if(m.tagName==="INPUT"||m.tagName==="TEXTAREA"||m.isContentEditable)return;if(v.key==="Delete"||v.key==="Backspace"||v.key==="Del"||v.code==="Delete"){v.preventDefault(),v.stopPropagation();const C=i.current;if(C){h(R=>R.filter(A=>A.id!==C)),u(null);return}const E=n.current,I=r.current;E?(o(E),l(null)):I&&I.size>0&&(I.forEach(R=>o(R)),c(new Set))}};return window.addEventListener("keydown",w),()=>window.removeEventListener("keydown",w)},[o,n,r,i,l,c,u,h]),_.useEffect(()=>{const w=m=>{if(!((m.ctrlKey||m.metaKey)&&m.key==="c"))return;const z=m.target;if(z.tagName==="INPUT"||z.tagName==="TEXTAREA"||z.isContentEditable){const A=window.getSelection();if(A&&A.toString().trim())return;m.preventDefault();return}const E=n.current,I=r.current,R=E?[E]:I&&I.size>0?Array.from(I):[];if(R.length>0){m.preventDefault(),m.stopPropagation();const A=e.current.filter(X=>R.includes(X.id)),F=t.current.filter(X=>R.includes(X.from)||R.includes(X.to)).filter(X=>R.includes(X.from)&&R.includes(X.to)),L=A.map(X=>{const T=l$(X.id);if(T)return{...X,width:T.width,height:T.height};const q=document.querySelector(`[data-node-id="${X.id}"]`);if(q){const H=q.style.width,J=q.style.height;if(H&&J){const V=parseInt(H)||X.width,N=parseInt(J)||X.height;return{...X,width:V,height:N}}const Z=q.offsetWidth||X.width,B=q.offsetHeight||X.height;if(Z!==X.width||B!==X.height)return{...X,width:Z,height:B}}return{...X}});y.current={nodes:L,connections:F.map(X=>({...X})),timestamp:Date.now()},console.log(`已复制 ${A.length} 个节点`)}},v=async m=>{if(!((m.ctrlKey||m.metaKey)&&m.key==="v"))return;const z=m.target;if(z.tagName==="INPUT"||z.tagName==="TEXTAREA"||z.isContentEditable)return;const E=n.current;if(E){const I=e.current.find(R=>R.id===E);if(I&&(I.type==="input-image"||I.type==="video-input"))return}if(y.current&&y.current.nodes&&y.current.nodes.length>0){m.preventDefault(),m.stopPropagation();const I=y.current,{contentStore:R}=await mn(async()=>{const{contentStore:ie}=await Promise.resolve().then(()=>Nh);return{contentStore:ie}},void 0,import.meta.url),{warmContentCacheForPaste:A}=await mn(async()=>{const{warmContentCacheForPaste:ie}=await Promise.resolve().then(()=>VJ);return{warmContentCacheForPaste:ie}},void 0,import.meta.url),O=[];I.nodes.forEach((ie,oe)=>{(ie.type==="input-image"||ie.type==="video-input")&&ie.content&&R.isContentRef(ie.content)&&O.push({index:oe,ref:ie.content})}),O.length>0&&(await R.init(),(await Promise.all(O.map(async({ref:oe})=>{try{const re=R.extractId(oe),ee=await R.get(re);return{id:re,data:ee}}catch(re){return console.warn("Failed to resolve content_ref for paste:",re),{id:"",data:null}}}))).forEach(({id:oe,data:re})=>{oe&&re&&A(oe,re)}));const F=a.current.x,L=a.current.y,X=I.nodes;if(X.length===0)return;const T=Math.min(...X.map(ie=>ie.x||0)),q=Math.min(...X.map(ie=>ie.y||0)),H=Math.max(...X.map(ie=>(ie.x||0)+(ie.width||0))),J=Math.max(...X.map(ie=>(ie.y||0)+(ie.height||0))),Z=(T+H)/2,B=(q+J)/2,V=F-Z,N=L-B,j=new Map,k=Date.now();I.nodes.forEach((ie,oe)=>{const re=`node-${k}-${oe}-${Math.random().toString(36).substr(2,9)}`;j.set(ie.id,re)});const W=e.current,M=W.map(ie=>(ie.nodeName||"").trim()).filter(Boolean),Y=I.nodes.map((ie,oe)=>{const re=(ie.nodeName||"").trim();let ee;if(re)ee=PY(re,M),M.push(ee);else{const Q=Rm(ie.type),me=W.filter(ue=>ue.type===ie.type);if(ee=Q,me.length>0){const ue=me.map(te=>{const ge=te.nodeName||"",ne=ge.match(new RegExp(`^${uv(Q)}_(\\d+)$`));return ne?parseInt(ne[1],10):ge===Q?0:-1}).filter(te=>te>=0),G=(ue.length>0?Math.max(...ue):-1)+1;G>0&&(ee=`${Q}_${G}`)}M.push(ee)}const pe=ie.type==="custom-agent",we=j.get(ie.id);return{...ie,id:we,x:ie.x+V,y:ie.y+N,nodeName:ee,...pe&&{settings:{...ie.settings||{},_agentRunning:!1,_executeTrigger:void 0}},isGenerating:!1,errorMsg:void 0,progress:void 0}}),se=(I.connections||[]).filter(ie=>ie&&j.has(ie.from)&&j.has(ie.to)).map((ie,oe)=>({...ie,id:`conn-${k}-${oe}-${Math.random().toString(36).substr(2,9)}`,from:j.get(ie.from),to:j.get(ie.to)}));d(ie=>[...ie,...Y]),h(ie=>[...ie,...se]),Y.length===1?(l(Y[0].id),c(new Set([Y[0].id]))):Y.length>1&&(l(null),c(new Set(Y.map(ie=>ie.id)))),console.log(`已粘贴 ${Y.length} 个节点`)}};return window.addEventListener("keydown",w),window.addEventListener("keydown",v),()=>{window.removeEventListener("keydown",w),window.removeEventListener("keydown",v)}},[e,t,n,r,a,d,h,l,c]),{copiedNodesRef:y}};var xc;(function(e){e.WINDOW_RESIZED="tauri://resize",e.WINDOW_MOVED="tauri://move",e.WINDOW_CLOSE_REQUESTED="tauri://close-requested",e.WINDOW_DESTROYED="tauri://destroyed",e.WINDOW_FOCUS="tauri://focus",e.WINDOW_BLUR="tauri://blur",e.WINDOW_SCALE_FACTOR_CHANGED="tauri://scale-change",e.WINDOW_THEME_CHANGED="tauri://theme-changed",e.WINDOW_CREATED="tauri://window-created",e.WEBVIEW_CREATED="tauri://webview-created",e.DRAG_ENTER="tauri://drag-enter",e.DRAG_OVER="tauri://drag-over",e.DRAG_DROP="tauri://drag-drop",e.DRAG_LEAVE="tauri://drag-leave"})(xc||(xc={}));async function CO(e,t){window.__TAURI_EVENT_PLUGIN_INTERNALS__.unregisterListener(e,t),await yn("plugin:event|unlisten",{event:e,eventId:t})}async function K5(e,t,n){var r;const i=typeof(n==null?void 0:n.target)=="string"?{kind:"AnyLabel",label:n.target}:(r=n==null?void 0:n.target)!==null&&r!==void 0?r:{kind:"Any"};return yn("plugin:event|listen",{event:e,target:i,handler:S5(t)}).then(a=>async()=>CO(e,a))}async function LY(e,t,n){return K5(e,r=>{CO(e,r.id),t(r)},n)}async function BY(e,t){await yn("plugin:event|emit",{event:e,payload:t})}async function UY(e,t,n){await yn("plugin:event|emit_to",{target:typeof e=="string"?{kind:"AnyLabel",label:e}:e,event:t,payload:n})}const FY=async(e,t)=>{if(!e||e.startsWith("blob:"))return e;try{if(e.startsWith("data:")){const o=await(await fetch(e)).blob(),l=`character_${t}`;return await Xr.saveBlobAsset(l,o,e),URL.createObjectURL(o)}const n=await fetch(e);if(!n.ok)return console.warn("无法获取角色缩略图:",e),e;const r=await n.blob(),i=`character_${t}`;return await Xr.saveBlobAsset(i,r,e),URL.createObjectURL(r)}catch(n){return console.warn("转换角色缩略图失败:",e,n),e}},SC=async(e,t,n)=>{try{const r=(()=>{try{const c=localStorage.getItem("qiaodoumayi_characters");return c?JSON.parse(c):[]}catch{return[]}})(),i=new Set(r.map(c=>c.id)),a=e.filter(c=>!i.has(c.id));if(a.length===0){n==null||n(95,"角色库已是最新,无需更新","import"),t(r);return}n==null||n(92,`发现 ${a.length} 个新角色,正在保存到本地缓存...`,"import");const o=[];for(let c=0;c{try{const l=localStorage.getItem("qiaodoumayi_characters");return l?JSON.parse(l):[]}catch{return[]}})(),a=new Set(i.map(l=>l.id)),o=e.filter(l=>!a.has(l.id));if(o.length>0){const l=[...i,...o];localStorage.setItem("qiaodoumayi_characters",JSON.stringify(l)),t(l)}else t(i)}catch(i){console.error("降级处理也失败:",i),t(e)}}};async function bb(e={}){return typeof e=="object"&&Object.freeze(e),await yn("plugin:dialog|open",{options:e})}async function WY(e={}){return typeof e=="object"&&Object.freeze(e),await yn("plugin:dialog|save",{options:e})}async function DY(e,t){var r,i,a;const n=typeof t=="string"?{title:t}:t;return await yn("plugin:dialog|ask",{message:e.toString(),title:(r=n==null?void 0:n.title)==null?void 0:r.toString(),kind:n==null?void 0:n.kind,yesButtonLabel:(i=n==null?void 0:n.okLabel)==null?void 0:i.toString(),noButtonLabel:(a=n==null?void 0:n.cancelLabel)==null?void 0:a.toString()})}const L0=Object.freeze(Object.defineProperty({__proto__:null,ask:DY,open:bb,save:WY},Symbol.toStringTag,{value:"Module"}));var mi;(function(e){e[e.Audio=1]="Audio",e[e.Cache=2]="Cache",e[e.Config=3]="Config",e[e.Data=4]="Data",e[e.LocalData=5]="LocalData",e[e.Document=6]="Document",e[e.Download=7]="Download",e[e.Picture=8]="Picture",e[e.Public=9]="Public",e[e.Video=10]="Video",e[e.Resource=11]="Resource",e[e.Temp=12]="Temp",e[e.AppConfig=13]="AppConfig",e[e.AppData=14]="AppData",e[e.AppLocalData=15]="AppLocalData",e[e.AppCache=16]="AppCache",e[e.AppLog=17]="AppLog",e[e.Desktop=18]="Desktop",e[e.Executable=19]="Executable",e[e.Font=20]="Font",e[e.Home=21]="Home",e[e.Runtime=22]="Runtime",e[e.Template=23]="Template"})(mi||(mi={}));async function VY(){return yn("plugin:path|resolve_directory",{directory:mi.AppConfig})}async function HY(){return yn("plugin:path|resolve_directory",{directory:mi.AppData})}async function GY(){return yn("plugin:path|resolve_directory",{directory:mi.AppLocalData})}async function qY(){return yn("plugin:path|resolve_directory",{directory:mi.AppCache})}async function KY(){return yn("plugin:path|resolve_directory",{directory:mi.Audio})}async function XY(){return yn("plugin:path|resolve_directory",{directory:mi.Cache})}async function YY(){return yn("plugin:path|resolve_directory",{directory:mi.Config})}async function JY(){return yn("plugin:path|resolve_directory",{directory:mi.Data})}async function ZY(){return yn("plugin:path|resolve_directory",{directory:mi.Desktop})}async function QY(){return yn("plugin:path|resolve_directory",{directory:mi.Document})}async function eJ(){return yn("plugin:path|resolve_directory",{directory:mi.Download})}async function tJ(){return yn("plugin:path|resolve_directory",{directory:mi.Executable})}async function nJ(){return yn("plugin:path|resolve_directory",{directory:mi.Font})}async function rJ(){return yn("plugin:path|resolve_directory",{directory:mi.Home})}async function sJ(){return yn("plugin:path|resolve_directory",{directory:mi.LocalData})}async function iJ(){return yn("plugin:path|resolve_directory",{directory:mi.Picture})}async function aJ(){return yn("plugin:path|resolve_directory",{directory:mi.Public})}async function oJ(){return yn("plugin:path|resolve_directory",{directory:mi.Resource})}async function lJ(e){return yn("plugin:path|resolve_directory",{directory:mi.Resource,path:e})}async function cJ(){return yn("plugin:path|resolve_directory",{directory:mi.Runtime})}async function uJ(){return yn("plugin:path|resolve_directory",{directory:mi.Template})}async function dJ(){return yn("plugin:path|resolve_directory",{directory:mi.Video})}async function hJ(){return yn("plugin:path|resolve_directory",{directory:mi.AppLog})}async function pJ(){return yn("plugin:path|resolve_directory",{directory:mi.Temp})}function fJ(){return window.__TAURI_INTERNALS__.plugins.path.sep}function mJ(){return window.__TAURI_INTERNALS__.plugins.path.delimiter}async function gJ(...e){return yn("plugin:path|resolve",{paths:e})}async function xJ(e){return yn("plugin:path|normalize",{path:e})}async function dv(...e){return yn("plugin:path|join",{paths:e})}async function bJ(e){return yn("plugin:path|dirname",{path:e})}async function yJ(e){return yn("plugin:path|extname",{path:e})}async function vJ(e,t){return yn("plugin:path|basename",{path:e,ext:t})}async function wJ(e){return yn("plugin:path|is_absolute",{path:e})}const _J=Object.freeze(Object.defineProperty({__proto__:null,get BaseDirectory(){return mi},appCacheDir:qY,appConfigDir:VY,appDataDir:HY,appLocalDataDir:GY,appLogDir:hJ,audioDir:KY,basename:vJ,cacheDir:XY,configDir:YY,dataDir:JY,delimiter:mJ,desktopDir:ZY,dirname:bJ,documentDir:QY,downloadDir:eJ,executableDir:tJ,extname:yJ,fontDir:nJ,homeDir:rJ,isAbsolute:wJ,join:dv,localDataDir:sJ,normalize:xJ,pictureDir:iJ,publicDir:aJ,resolve:gJ,resolveResource:lJ,resourceDir:oJ,runtimeDir:cJ,sep:fJ,tempDir:pJ,templateDir:uJ,videoDir:dJ},Symbol.toStringTag,{value:"Module"}));var d$;(function(e){e[e.Start=0]="Start",e[e.Current=1]="Current",e[e.End=2]="End"})(d$||(d$={}));function X5(e){return{isFile:e.isFile,isDirectory:e.isDirectory,isSymlink:e.isSymlink,size:e.size,mtime:e.mtime!==null?new Date(e.mtime):null,atime:e.atime!==null?new Date(e.atime):null,birthtime:e.birthtime!==null?new Date(e.birthtime):null,readonly:e.readonly,fileAttributes:e.fileAttributes,dev:e.dev,ino:e.ino,mode:e.mode,nlink:e.nlink,uid:e.uid,gid:e.gid,rdev:e.rdev,blksize:e.blksize,blocks:e.blocks}}function zJ(e){const t=new Uint8ClampedArray(e),n=t.byteLength;let r=0;for(let i=0;il instanceof URL?l.toString():l),options:n,onEvent:i}),o=new kJ(a);return()=>{o.close()}}async function AJ(e,t,n){return await MO(e,t,{delayMs:2e3,...n})}async function MJ(e,t,n){return await MO(e,t,{...n,delayMs:void 0})}async function TJ(e){if(e instanceof URL&&e.protocol!=="file:")throw new TypeError("Must be a file URL.");return await yn("plugin:fs|size",{path:e instanceof URL?e.toString():e})}const bx=Object.freeze(Object.defineProperty({__proto__:null,get BaseDirectory(){return mi},FileHandle:Y5,get SeekMode(){return d$},copyFile:SJ,create:$J,exists:AO,lstat:EJ,mkdir:gx,open:NO,readDir:h$,readFile:xx,readTextFile:EO,readTextFileLines:jJ,remove:IO,rename:CJ,size:TJ,stat:NJ,truncate:IJ,watch:AJ,watchImmediate:MJ,writeFile:kO,writeTextFile:Bv},Symbol.toStringTag,{value:"Module"})),hv=typeof window<"u"&&"__TAURI__"in window;function fh(e,...t){return[e.replace(/\\/g,"/").replace(/\/+$/,""),...t].join("/").replace(/\/+/g,"/")}const J5="qiaodoumayi_cache_dir",su="handles",Z5="cacheDirectoryHandle";async function RJ(e){return new Promise((t,n)=>{const r=indexedDB.open(J5,1);r.onupgradeneeded=()=>{const i=r.result;i.objectStoreNames.contains(su)||i.createObjectStore(su)},r.onsuccess=()=>{const i=r.result,a=i.transaction(su,"readwrite");a.objectStore(su).put(e,Z5),a.oncomplete=()=>{i.close(),t()},a.onerror=()=>{i.close(),n(a.error)}},r.onerror=()=>n(r.error)})}async function PJ(){return new Promise((e,t)=>{const n=indexedDB.open(J5,1);n.onupgradeneeded=()=>{const r=n.result;r.objectStoreNames.contains(su)||r.createObjectStore(su)},n.onsuccess=()=>{const r=n.result,a=r.transaction(su,"readonly").objectStore(su).get(Z5);a.onsuccess=()=>{r.close(),e(a.result||null)},a.onerror=()=>{r.close(),t(a.error)}},n.onerror=()=>t(n.error)})}async function OJ(){return new Promise((e,t)=>{const n=indexedDB.open(J5,1);n.onupgradeneeded=()=>{const r=n.result;r.objectStoreNames.contains(su)||r.createObjectStore(su)},n.onsuccess=()=>{const r=n.result,i=r.transaction(su,"readwrite");i.objectStore(su).delete(Z5),i.oncomplete=()=>{r.close(),e()},i.onerror=()=>{r.close(),t(i.error)}},n.onerror=()=>t(n.error)})}class LJ{constructor(){Mn(this,"directoryHandle",null);Mn(this,"directoryPathTauri",null);Mn(this,"manifest",null);Mn(this,"manifestDirty",!1);Mn(this,"manifestWriteTimer",null);Mn(this,"processingQueue",new Set);Mn(this,"_restorePromise",null);Mn(this,"_listenerUnsubscribe",null)}async setDirectoryHandle(t){if(this.directoryHandle=t,this.directoryPathTauri=null,t){try{await RJ(t),console.log("[LocalCacheManager] Directory handle saved to IndexedDB")}catch(n){console.warn("[LocalCacheManager] Failed to persist handle to IDB:",n)}await this.loadManifest(),this._registerAssetListener()}else this.manifest=null,this._unregisterAssetListener()}async setDirectoryPathTauri(t){t===this.directoryPathTauri&&this.manifest!==null||(this.directoryPathTauri=t,this.directoryHandle=null,t?(await this.loadManifest(),this._registerAssetListener(),console.log("[LocalCacheManager] Tauri cache path set:",t)):(this.manifest=null,this._unregisterAssetListener()))}getDirectoryPathTauri(){return this.directoryPathTauri}getDirectoryHandle(){return this.directoryHandle}isAvailable(){return this.directoryHandle!==null||this.directoryPathTauri!==null}async restoreFromIDB(){var t;if(this.directoryHandle)return!0;try{const n=await PJ();if(!n)return console.log("[LocalCacheManager] No saved directory handle found in IDB"),!1;let r="prompt";try{r=await n.queryPermission({mode:"readwrite"}),console.log("[LocalCacheManager] queryPermission result:",r)}catch{console.warn("[LocalCacheManager] queryPermission not supported, trying requestPermission directly")}if(r!=="granted")try{r=await n.requestPermission({mode:"readwrite"}),console.log("[LocalCacheManager] requestPermission result:",r)}catch(i){return console.warn("[LocalCacheManager] requestPermission failed (likely no user gesture):",i),!1}return r==="granted"?(this.directoryHandle=n,await this.loadManifest(),this._registerAssetListener(),console.log(`[LocalCacheManager] ✅ Directory restored from IDB: ${n.name}, ${Object.keys(((t=this.manifest)==null?void 0:t.assets)||{}).length} assets in manifest`),!0):(console.warn("[LocalCacheManager] Permission not granted:",r),!1)}catch(n){return console.warn("[LocalCacheManager] Failed to restore from IDB:",n),!1}}ensureRestored(){return this.directoryHandle?Promise.resolve(!0):(this._restorePromise||(this._restorePromise=this.restoreFromIDB().then(t=>(t||(this._restorePromise=null),t))),this._restorePromise)}getManifest(){return this.manifest}async ensureManifestLoaded(){(this.directoryPathTauri||this.directoryHandle)&&await this.loadManifest()}hasAsset(t){var n;return!!((n=this.manifest)!=null&&n.assets[t])}getSubdirectoryName(t){return t.startsWith("image/")?"images":t.startsWith("video/")?"videos":t.startsWith("audio/")?"audio":"other"}async getSubdirectory(t){if(!this.directoryHandle)return null;try{return await this.directoryHandle.getDirectoryHandle(t,{create:!0})}catch(n){return console.error(`[LocalCacheManager] Failed to get/create subdirectory '${t}':`,n),null}}getExtension(t){if(t.startsWith("image/")){const n=t.split("/")[1]||"png";return n==="jpeg"?"jpg":n}return t.startsWith("video/")?t.split("/")[1]||"mp4":t.startsWith("audio/")?t.split("/")[1]||"mp3":"bin"}async computeBlobFingerprint(t){if(typeof crypto>"u"||!crypto.subtle)return"";const n=t.size,r=16*1024;let i;if(n<=r*2)i=await t.arrayBuffer();else{const l=await t.slice(0,r).arrayBuffer(),c=await t.slice(n-r).arrayBuffer(),u=new Uint8Array(8+l.byteLength+c.byteLength);new DataView(u.buffer).setBigUint64(0,BigInt(n),!0),u.set(new Uint8Array(l),8),u.set(new Uint8Array(c),8+l.byteLength),i=u.buffer}const a=await crypto.subtle.digest("SHA-256",i);return Array.from(new Uint8Array(a)).map(l=>l.toString(16).padStart(2,"0")).join("")}async loadManifest(){if(this.directoryPathTauri){try{const t=fh(this.directoryPathTauri,"manifest.json"),n=await xx(t),r=typeof n=="string"?n:new TextDecoder().decode(n);this.manifest=JSON.parse(r),console.log(`[LocalCacheManager] Manifest loaded (Tauri): ${Object.keys(this.manifest.assets).length} assets`)}catch{this.manifest={version:"1.0",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),assets:{}},console.log("[LocalCacheManager] Created new manifest (Tauri)")}return}if(this.directoryHandle)try{const r=await(await(await this.directoryHandle.getFileHandle("manifest.json",{create:!1})).getFile()).text();this.manifest=JSON.parse(r),console.log(`[LocalCacheManager] Manifest loaded: ${Object.keys(this.manifest.assets).length} assets`)}catch{this.manifest={version:"1.0",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),assets:{}},console.log("[LocalCacheManager] Created new manifest")}}scheduleManifestWrite(){this.manifestDirty=!0,this.manifestWriteTimer&&clearTimeout(this.manifestWriteTimer),this.manifestWriteTimer=setTimeout(()=>this.flushManifest(),1e3)}async flushManifest(){if(this.directoryPathTauri&&this.manifest&&this.manifestDirty){try{this.manifest.updatedAt=new Date().toISOString();const t=fh(this.directoryPathTauri,"manifest.json");await gx(this.directoryPathTauri,{recursive:!0}),await Bv(t,JSON.stringify(this.manifest,null,2)),this.manifestDirty=!1,console.log("[LocalCacheManager] Manifest flushed (Tauri)")}catch(t){console.error("[LocalCacheManager] Failed to write manifest (Tauri):",t)}return}if(!(!this.directoryHandle||!this.manifest||!this.manifestDirty))try{this.manifest.updatedAt=new Date().toISOString();const n=await(await this.directoryHandle.getFileHandle("manifest.json",{create:!0})).createWritable();await n.write(JSON.stringify(this.manifest,null,2)),await n.close(),this.manifestDirty=!1,console.log("[LocalCacheManager] Manifest flushed to disk")}catch(t){console.error("[LocalCacheManager] Failed to write manifest:",t)}}async saveAsset(t,n,r,i,a){if(!this.manifest||!this.directoryHandle&&!this.directoryPathTauri||this.processingQueue.has(t))return!1;if(this.manifest.assets[t])return!0;if(i&&(i.startsWith("http://")||i.startsWith("https://"))){const o=Object.entries(this.manifest.assets).find(([,l])=>l.remoteUrl&&l.remoteUrl===i);if(o){const[,l]=o;return this.manifest.assets[t]={...l,cachedAt:Date.now(),remoteUrl:i},this.scheduleManifestWrite(),console.log(`[LocalCacheManager] ♻️ Reuse (remoteUrl) asset ${t} -> ${l.fileName}`),!0}}try{const o=await this.computeBlobFingerprint(n),l=Object.entries(this.manifest.assets).find(([,c])=>c.size!==n.size||c.contentHash!==o||c.mimeType!==r?!1:a==="local"?c.fileName.replace(/\\/g,"/").startsWith("local/"):!0);if(l){const[,c]=l;return this.manifest.assets[t]={...c,cachedAt:Date.now(),remoteUrl:i||void 0,contentHash:o},this.scheduleManifestWrite(),console.log(`[LocalCacheManager] ♻️ Reuse (content) asset ${t} -> ${c.fileName} (${(n.size/1024).toFixed(1)} KB)`),!0}}catch(o){console.warn("[LocalCacheManager] Fingerprint compute failed, skip content dedup:",o)}this.processingQueue.add(t);try{const o=await this.computeBlobFingerprint(n),l=a??this.getSubdirectoryName(r),c=this.getExtension(r),u=_P().replace(/-/g,""),h=(t.length>16?`${t.substring(0,8)}_${t.slice(-8)}`:t.substring(0,16)).replace(/[^a-zA-Z0-9_-]/g,"_"),p=`${u}_${h}.${c}`,f=`${l}/${p}`;if(this.directoryPathTauri){const w=fh(this.directoryPathTauri,l),v=fh(this.directoryPathTauri,f);await gx(w,{recursive:!0});const m=await n.arrayBuffer();return await kO(v,new Uint8Array(m)),this.manifest.assets[t]={fileName:f,mimeType:r,size:n.size,cachedAt:Date.now(),remoteUrl:i||void 0,contentHash:o||void 0},this.scheduleManifestWrite(),console.log(`[LocalCacheManager] ✅ Saved (Tauri): ${f} (${(n.size/1024).toFixed(1)} KB)`),!0}const b=await this.getSubdirectory(l);if(!b)return!1;const y=await(await b.getFileHandle(p,{create:!0})).createWritable();return await y.write(n),await y.close(),this.manifest.assets[t]={fileName:f,mimeType:r,size:n.size,cachedAt:Date.now(),remoteUrl:i||void 0,contentHash:o||void 0},this.scheduleManifestWrite(),console.log(`[LocalCacheManager] ✅ Saved: ${f} (${(n.size/1024).toFixed(1)} KB)`),!0}catch(o){return console.error(`[LocalCacheManager] ❌ Failed to save asset ${t}:`,o),!1}finally{this.processingQueue.delete(t)}}dataUrlToBlob(t){try{const[n,r]=t.split(","),i=n==null?void 0:n.match(/data:([^;]+)/),a=(i==null?void 0:i[1])||"image/jpeg",o=atob(r||""),l=new Uint8Array(o.length);for(let c=0;c{const a=new FileReader;a.onload=()=>i(a.result),a.onerror=()=>i(null),a.readAsDataURL(r.blob)}):null}async readAsset(t){if(!this.manifest)return null;const n=this.manifest.assets[t];if(!n)return null;if(this.directoryPathTauri)try{const r=fh(this.directoryPathTauri,n.fileName),i=await xx(r),a=i instanceof Uint8Array?i:new Uint8Array(i);return{blob:new Blob([a],{type:n.mimeType}),mimeType:n.mimeType}}catch(r){return console.warn(`[LocalCacheManager] Failed to read asset ${t} from cache (Tauri):`,r),delete this.manifest.assets[t],this.scheduleManifestWrite(),null}if(!this.directoryHandle)return null;try{const r=n.fileName.split("/");if(r.length!==2)return console.warn(`[LocalCacheManager] Invalid fileName in manifest: ${n.fileName}`),null;const[i,a]=r,c=await(await(await this.directoryHandle.getDirectoryHandle(i,{create:!1})).getFileHandle(a,{create:!1})).getFile();return{blob:new Blob([await c.arrayBuffer()],{type:n.mimeType}),mimeType:n.mimeType}}catch(r){return console.warn(`[LocalCacheManager] Failed to read asset ${t} from cache:`,r),delete this.manifest.assets[t],this.scheduleManifestWrite(),null}}async readAssetAsUrl(t){const n=await this.readAsset(t);return n?URL.createObjectURL(n.blob):null}getCachedAssetIds(){return this.manifest?Object.keys(this.manifest.assets):[]}async removeAsset(t){var i;if(!((i=this.manifest)!=null&&i.assets[t]))return!0;const r=this.manifest.assets[t].fileName;try{if(this.directoryPathTauri){const a=fh(this.directoryPathTauri,r);await IO(a)}else if(this.directoryHandle){const a=r.split("/");if(a.length>=2){const[o,l]=[a[0],a.slice(1).join("/")];await(await this.directoryHandle.getDirectoryHandle(o,{create:!1})).removeEntry(l)}}}catch(a){console.warn("[LocalCacheManager] Failed to remove asset file:",t,a)}return delete this.manifest.assets[t],this.scheduleManifestWrite(),!0}async removeAssets(t){let n=0;for(const r of t)await this.removeAsset(r)&&n++;return n}async syncHistory(t){if(this.directoryPathTauri){try{await gx(this.directoryPathTauri,{recursive:!0});const n=fh(this.directoryPathTauri,"history.json");await Bv(n,JSON.stringify(t,null,2)),console.log("[LocalCacheManager] History synced (Tauri):",t.length)}catch(n){console.error("[LocalCacheManager] Failed to sync history (Tauri):",n)}return}if(this.directoryHandle)try{const r=await(await this.directoryHandle.getFileHandle("history.json",{create:!0})).createWritable();await r.write(JSON.stringify(t,null,2)),await r.close(),console.log(`[LocalCacheManager] History synced: ${t.length} items`)}catch(n){console.error("[LocalCacheManager] Failed to sync history:",n)}}async loadHistory(){if(this.directoryPathTauri)try{const t=fh(this.directoryPathTauri,"history.json"),n=await xx(t),r=typeof n=="string"?n:new TextDecoder().decode(n);return JSON.parse(r)}catch{return null}if(!this.directoryHandle)return null;try{const r=await(await(await this.directoryHandle.getFileHandle("history.json",{create:!1})).getFile()).text();return JSON.parse(r)}catch{return null}}_registerAssetListener(){this._listenerUnsubscribe||(console.log("[LocalCacheManager] Registering global asset listener"),this._listenerUnsubscribe=Xr.addListener(async(t,n)=>{if(!this.processingQueue.has(t)){this.processingQueue.add(t);try{await this.saveAsset(t,n.blob,n.mimeType,n.remoteUrl,n.cacheSubdir),!(n.cacheSubdir==="local"||t.startsWith("local_"))&&n.mimeType.startsWith("image/")&&n.blob.size>50*1024&&this._saveThumbnailsForAsset(t,n.blob).catch(()=>{})}catch(r){console.error("[LocalCacheManager] ❌ Auto-save asset failed:",r)}finally{this.processingQueue.delete(t)}}}))}async _saveThumbnailsForAsset(t,n){const r=await new Promise((a,o)=>{const l=new FileReader;l.onload=()=>a(l.result),l.onerror=o,l.readAsDataURL(n)});if(!r.startsWith("data:image"))return;const{thumbnailStore:i}=await mn(async()=>{const{thumbnailStore:a}=await Promise.resolve().then(()=>vP);return{thumbnailStore:a}},void 0,import.meta.url);await i.storeWithThumbnails(t,r)}_unregisterAssetListener(){this._listenerUnsubscribe&&(console.log("[LocalCacheManager] Unregistering global asset listener"),this._listenerUnsubscribe(),this._listenerUnsubscribe=null)}getStats(){if(!this.manifest)return{count:0,totalSize:0,formattedSize:"0 B"};const t=new Map;Object.values(this.manifest.assets).forEach(i=>{t.has(i.fileName)||t.set(i.fileName,i)});const n=Array.from(t.values()),r=n.reduce((i,a)=>i+a.size,0);return{count:n.length,totalSize:r,formattedSize:this.formatBytes(r)}}formatBytes(t){if(t===0)return"0 B";const n=1024,r=["B","KB","MB","GB"],i=Math.floor(Math.log(t)/Math.log(n));return`${(t/Math.pow(n,i)).toFixed(2)} ${r[i]}`}reset(){this._unregisterAssetListener(),this.directoryHandle=null,this.directoryPathTauri=null,this.manifest=null,this.manifestDirty=!1,this._restorePromise=null,this.manifestWriteTimer&&(clearTimeout(this.manifestWriteTimer),this.manifestWriteTimer=null),OJ().catch(()=>{})}}const xr=new LJ;(()=>{try{const e=localStorage.getItem("qiaodoumayi_cache_directory_config");if(e){const t=JSON.parse(e);if(t.enabled&&t.directoryPath){if(hv){const n=()=>{xr.setDirectoryPathTauri(t.directoryPath).then(()=>{console.log("[LocalCacheManager] ✅ Tauri cache path restored from config")})};typeof requestAnimationFrame<"u"?requestAnimationFrame(()=>setTimeout(n,0)):setTimeout(n,0);return}console.log("[LocalCacheManager] Auto-restoring directory handle on module load..."),xr.ensureRestored().then(n=>{if(n)console.log("[LocalCacheManager] ✅ Auto-restore successful (silent)");else{console.log("[LocalCacheManager] ⏳ Silent restore failed, will retry on first user interaction");const r=()=>{document.removeEventListener("click",r,!0),document.removeEventListener("keydown",r,!0),document.removeEventListener("pointerdown",r,!0),setTimeout(()=>{xr.ensureRestored().then(i=>{i?console.log("[LocalCacheManager] ✅ Restored after user interaction"):console.warn("[LocalCacheManager] ⚠️ Restore failed even after user interaction")})},50)};document.addEventListener("click",r,{once:!0,capture:!0}),document.addEventListener("keydown",r,{once:!0,capture:!0}),document.addEventListener("pointerdown",r,{once:!0,capture:!0})}})}}}catch{}})();const TO=()=>{const[e,t]=_.useState(()=>{try{const u=localStorage.getItem("qiaodoumayi_cache_directory_config");if(u){const d=JSON.parse(u);return{enabled:d.enabled||!1,directoryHandle:null,directoryPath:d.directoryPath||""}}}catch(u){console.error("[CacheDirectory] Failed to load config:",u)}return{enabled:!1,directoryHandle:null,directoryPath:""}}),n=_.useRef(null),r=_.useCallback(u=>{t(d=>{const h={...d,...u};u.directoryHandle!==void 0&&(n.current=u.directoryHandle);try{localStorage.setItem("qiaodoumayi_cache_directory_config",JSON.stringify({enabled:h.enabled,directoryPath:h.directoryPath}))}catch(p){console.error("[CacheDirectory] Failed to save config:",p)}return h})},[]);_.useEffect(()=>{if(!e.enabled||!e.directoryPath)return;if(hv){if(xr.getDirectoryPathTauri()===e.directoryPath)return;xr.setDirectoryPathTauri(e.directoryPath);return}if(n.current)return;let u=!1;return(async()=>{console.log("[CacheDirectory] Hook: waiting for directory handle restore...");const d=await xr.ensureRestored();if(!u)if(d){const h=xr.getDirectoryHandle();n.current=h,t(p=>({...p,directoryHandle:h})),console.log("[CacheDirectory] ✅ Hook: directory handle synced")}else console.warn("[CacheDirectory] ⚠️ Could not restore directory handle. Showing re-auth prompt.")})(),()=>{u=!0}},[]);const i=_.useCallback(async()=>{if(hv)try{const u=await bb({directory:!0,multiple:!1,title:"选择资源缓存目录"});return u&&typeof u=="string"?(await xr.setDirectoryPathTauri(u),n.current=null,r({directoryHandle:null,directoryPath:u,enabled:!0}),console.log("[CacheDirectory] Tauri cache directory selected:",u),!0):!1}catch(u){return u.name==="AbortError"||(console.error("[CacheDirectory] Tauri directory selection failed:",u),alert("选择目录失败:"+(u instanceof Error?u.message:String(u)))),!1}if("showDirectoryPicker"in window)try{const u=await window.showDirectoryPicker();return n.current=u,await xr.setDirectoryHandle(u),r({directoryHandle:u,directoryPath:u.name||"已选择文件夹",enabled:!0}),console.log("[CacheDirectory] Directory selected:",u.name),!0}catch(u){return u.name==="AbortError"||(console.error("[CacheDirectory] Directory selection failed:",u),alert("选择文件夹失败:"+(u instanceof Error?u.message:String(u)))),!1}else return alert("您的浏览器不支持文件夹选择功能。请使用 Chrome、Edge 或 Opera 浏览器。"),!1},[r]),a=_.useCallback(async(u,d,h,p,f)=>{!e.enabled||!xr.isAvailable()||await xr.saveAsset(u,d,h,p,f)},[e.enabled]),o=_.useCallback(u=>{if(u){const d=!!n.current,h=hv&&e.directoryPath;if(!d&&!h){alert("请先选择缓存目录");return}h&&xr.setDirectoryPathTauri(e.directoryPath)}u||(n.current=null,xr.reset()),r({enabled:u})},[r,e.directoryPath]),l=_.useCallback(async u=>{try{const d=await Xr.getAssetRecord(u);return d&&d.blob?(await a(u,d.blob,d.mimeType||d.blob.type,d.remoteUrl,d.cacheSubdir),!0):!1}catch(d){return console.error("[CacheDirectory] Manual save failed:",d),!1}},[a]),c=_.useCallback(async u=>{!e.enabled||!xr.isAvailable()||await xr.syncHistory(u)},[e.enabled]);return{config:e,selectDirectory:i,setEnabled:o,saveAssetToDirectory:a,manualSaveAsset:l,syncHistory:c,manager:xr}},Xa=Object.freeze(Object.defineProperty({__proto__:null,localCacheManager:xr,useCacheDirectory:TO},Symbol.toStringTag,{value:"Module"}));let RO={current:!1};function BJ(e){RO.current=e}function pm(){return RO.current}const UJ=e=>1500,FJ=e=>e==="text-node"||e==="preview"||e==="input-image"?"high":e==="video-input"||e==="gen-video"||e==="motion-control"?"low":"medium",Fo=new Map,jC=80*1024*1024,WJ=384;let pv=0;const _p=[];function Uv(e,t){const n=t.length*2;if(!(n>jC/2)){if(Fo.has(e)){const r=_p.indexOf(e);r>-1&&_p.splice(r,1),_p.push(e);return}for(;(pv+n>jC||Fo.size>=WJ)&&_p.length>0;){const r=_p.shift();if(r&&Fo.has(r)){const i=Fo.get(r);i&&(pv-=i.length*2),Fo.delete(r)}}Fo.set(e,t),_p.push(e),pv+=n}}function DJ(e,t){Uv(e,t)}async function Sh(e,t){if(xr.isAvailable()&&xr.hasThumbnail(e,t)){const n=await xr.readThumbnail(e,t);if(n)return n}return t==="thumb"?zi.getThumbnail(e):zi.getPreview(e)}function Ul(e,t={}){const{enabled:n=!0,placeholder:r,useThumbnail:i=!1,usePreview:a=!1,useOriginal:o=!1,renderQuality:l="high",distanceToViewportCenter:c=0,shouldLoadContent:u=!0,nodeType:d="unknown",totalNodeCount:h=0,preferConstantDisplay:p=!1,disableThumbnailStoreWrites:f=!1,blobRecoveryAssetIds:b,onBlobUrlRecovered:g}=t,y=_.useRef(g);y.current=g;const w=_.useMemo(()=>((b==null?void 0:b.filter(Boolean))??[]).join("\0"),[b]),v=_.useMemo(()=>e?Ln.isContentRef(e):!1,[e]),m=o?"":a?"_preview":i?"_thumb":"_preview",z=_.useMemo(()=>{if(v&&e){const Z=Ln.extractId(e),B=Z+m||Z;return Fo.get(B)}},[v,e,m]),[C,E]=_.useState(()=>{if(z)return z;if(v&&e){const Z=Ln.extractId(e),B=Ln.getFromCacheSync(Z);if(B)return B;if(!o){const V=Z+"_thumb",N=Fo.get(V);if(N)return N;const j=Z+"_preview",k=Fo.get(j);if(k)return k}}if(!v)return e}),[I,R]=_.useState(()=>!(!v||z||e&&Ln.getFromCacheSync(Ln.extractId(e)))),[A,O]=_.useState(!1),[F,L]=_.useState(()=>!!z||!!(v&&e&&Ln.getFromCacheSync(Ln.extractId(e)))),X=_.useRef(!1),T=_.useRef(e),q=_.useRef(!0),[H,J]=_.useState(0);return _.useEffect(()=>(q.current=!0,()=>{q.current=!1}),[]),_.useEffect(()=>{if(!(b!=null&&b.length))return;const Z=e;if(!(Z!=null&&Z.startsWith("blob:")))return;let B=!1;return(async()=>{var W;let N=!1;try{(await fetch(Z,{cache:"no-store"})).ok||(N=!0)}catch{N=!0}if(!N||B||!q.current)return;const{recoverDeadBlobUrl:j}=await mn(async()=>{const{recoverDeadBlobUrl:M}=await Promise.resolve().then(()=>Do);return{recoverDeadBlobUrl:M}},void 0,import.meta.url),k=await j(Z,b);!k||B||!q.current||(E(k),O(!1),L(!1),(W=y.current)==null||W.call(y,k))})(),()=>{B=!0}},[e,w]),_.useEffect(()=>{if(z){E(z),R(!1),L(!0),O(!1);return}if(v&&e){const j=Ln.extractId(e),k=j+m||j,W=Fo.get(k)??(o?Ln.getFromCacheSync(j):void 0);if(W){E(W),R(!1),L(!0),O(!1);return}if(!o&&!C){const M=j+"_thumb",Y=Fo.get(M);if(Y){E(Y),R(!1),L(!0),O(!1);return}const se=j+"_preview",ie=Fo.get(se);if(ie){E(ie),R(!1),L(!0),O(!1);return}}}if(e===T.current&&C&&!I)return;if(T.current=e,!e||!Ln.isContentRef(e)){E(e),R(!1),O(!1),L(!1);return}const Z=FJ(d),B=UJ();if(!u||Z==="low"&&l==="low"&&c>B*.6||Z==="medium"&&l==="low"&&c>B||(Z==="high"?!1:l==="low"&&c>B*1.5)){E(r),R(!1),L(!0),O(!1);return}if(!n){E(r),R(!1),L(!0);return}if(X.current)return;if(v&&e){const j=Ln.extractId(e),k=j+m||j,W=Fo.get(k)??(o?Ln.getFromCacheSync(j):void 0);if(W){E(W),R(!1),L(!0);return}}if(!p&&pm()){const j=setInterval(()=>{!pm()&&q.current&&(clearInterval(j),J(k=>k+1))},100);return()=>clearInterval(j)}(async()=>{if(X.current=!0,R(!0),O(!1),!p&&pm()){X.current=!1,R(!1);return}try{await Ln.init();const j=Ln.extractId(e);let k;if(i||a)k=await Sh(j,a?"preview":"thumb"),k||(k=await Ln.get(j),!f&&k&&k.startsWith("data:image")&&zi.storeWithThumbnails(j,k).catch(()=>{}));else if(o)k=await Ln.get(j);else if(k=await Sh(j,"preview"),!k&&(k=await Ln.get(j),!f&&k&&k.startsWith("data:image"))){const W=j;zi.storeWithThumbnails(W,k).catch(()=>{});const M=await Sh(W,"preview");M&&(k=M)}if(!q.current)return;if(k){const W=j+m||j;Uv(W,k),E(k),L(!0),O(!1)}else{for(let W=0;W<3&&q.current&&!k;W++)if(await new Promise(M=>setTimeout(M,200+W*200)),k=await Ln.get(j),k&&(i||a)){const M=await Sh(j,"preview");M&&(k=M)}if(k&&q.current){const W=j+m||j;Uv(W,k),E(k),L(!0),O(!1)}else console.warn("[useLazyContent] Content not found in IndexedDB:",j),E(r),O(!0)}}catch(j){console.error("[useLazyContent] Failed to load content:",j),q.current&&(E(r),O(!0))}finally{q.current&&R(!1),X.current=!1}})()},[e,n,r,z,i,a,o,m,H,l,c,u,p,f]),{content:C,isLoading:I,hasError:A,isFromStore:F}}function iu(e,t={}){const{useThumbnail:n=!1,usePreview:r=!1,useOriginal:i=!1,preferConstantDisplay:a=!1,disableThumbnailStoreWrites:o=!1}=t,l=_.useMemo(()=>e.map(b=>{if(!b)return"empty";if(typeof b!="string")try{return JSON.stringify(b).substring(0,100)}catch{return"object"}return Ln.isContentRef(b)?b:b.substring(0,100)}).join("|"),[e]),c=_.useMemo(()=>e.map(b=>{if(!b)return{content:b,isLoading:!1,hasError:!1,isFromStore:!1};if(typeof b!="string")return{content:b,isLoading:!1,hasError:!1,isFromStore:!1};if(!Ln.isContentRef(b))return{content:b,isLoading:!1,hasError:!1,isFromStore:!1};const y=Ln.extractId(b),v=y+(i?"":r?"_preview":n?"_thumb":"_preview"),m=Fo.get(v)??(i?Ln.getFromCacheSync(y):void 0);return m?{content:m,isLoading:!1,hasError:!1,isFromStore:!0}:{content:void 0,isLoading:!0,hasError:!1,isFromStore:!1}}),[l,n,r,i]),[u,d]=_.useState(c);_.useEffect(()=>{d(c)},[c]);const h=_.useRef(!0);_.useEffect(()=>(h.current=!0,()=>{h.current=!1}),[]);const[p,f]=_.useState(0);return _.useEffect(()=>{if(!a&&pm()){const y=setInterval(()=>{!pm()&&h.current&&(clearInterval(y),f(w=>w+1))},100);return()=>clearInterval(y)}const b=async()=>{if(await Ln.init(),!a&&pm())return;const y=await Promise.all(e.map(async w=>{if(!w||typeof w!="string"||!Ln.isContentRef(w))return{content:w,isLoading:!1,hasError:!1,isFromStore:!1};if(t.enabled===!1)return{content:t.placeholder,isLoading:!1,hasError:!1,isFromStore:!0};const v=Ln.extractId(w),z=v+(i?"":r?"_preview":n?"_thumb":"_preview"),C=Fo.get(z)??(i?Ln.getFromCacheSync(v):void 0);if(C)return{content:C,isLoading:!1,hasError:!1,isFromStore:!0};try{let E;if(i)E=await Ln.get(v);else if(n||r)E=await Sh(v,r?"preview":"thumb"),E||(E=await Ln.get(v),!o&&E&&E.startsWith("data:image")&&zi.storeWithThumbnails(v,E).catch(()=>{}));else if(E=await Sh(v,"preview"),!E&&(E=await Ln.get(v),!o&&E&&E.startsWith("data:image"))){zi.storeWithThumbnails(v,E).catch(()=>{});const I=await Sh(v,"preview");I&&(E=I)}return E||(await new Promise(I=>setTimeout(I,200)),E=i?await Ln.get(v):await Sh(v,"preview")||await Ln.get(v)),E?(Uv(z,E),{content:E,isLoading:!1,hasError:!1,isFromStore:!0}):(console.warn("[useLazyContents] Content not found:",v),{content:t.placeholder,isLoading:!1,hasError:!0,isFromStore:!0})}catch(E){return console.error("[useLazyContents] Failed to load content:",E),{content:t.placeholder,isLoading:!1,hasError:!0,isFromStore:!0}}}));h.current&&d(y)};e.some(y=>y&&Ln.isContentRef(y))&&b()},[l,t.enabled,t.placeholder,n,r,i,p,a,o]),u}function p$(){Fo.clear(),_p.length=0,pv=0,console.log("[useLazyContent] Global content cache cleared")}const VJ=Object.freeze(Object.defineProperty({__proto__:null,clearContentCache:p$,useLazyContent:Ul,useLazyContents:iu,warmContentCacheForPaste:DJ},Symbol.toStringTag,{value:"Module"})),z1=15,T2=50*1024*1024,R2=3,HJ=100;function B0(e){return e.replace(/\.[^/.]+$/,"")||"未命名文件"}const PO=({mousePosRef:e,canvasRef:t,view:n,setNodes:r,generateId:i})=>({handleFileDrop:_.useCallback(async(o,l)=>{var h,p;if(o.length>z1){if(!confirm(`您正在尝试导入 ${o.length} 个文件,这可能会导致性能问题。 + +建议一次导入不超过 ${z1} 个文件。 + +是否继续?(只会处理前 ${z1} 个文件)`))return;o=Array.from(o).slice(0,z1)}const c=o.filter(f=>f.size>T2);if(c.length>0&&(alert(`以下文件超过 ${T2/1024/1024}MB 限制,将被跳过: + +`+c.map(f=>`${f.name} (${(f.size/1024/1024).toFixed(2)}MB)`).join(` +`)),o=o.filter(f=>f.size<=T2)),o.length===0)return;let u,d;if(l&&t.current){const f=t.current.getBoundingClientRect();u=(l.clientX-f.left-n.x)/n.zoom,d=(l.clientY-f.top-n.y)/n.zoom}else u=((h=e.current)==null?void 0:h.x)||100,d=((p=e.current)==null?void 0:p.y)||100;for(let f=0;fsetTimeout(y,g))}}},[e,t,n,r,i])});async function GJ(e,t,n,r,i,a){var b;const o=e.name,l=e.type,c=e.size,u=((b=o.split(".").pop())==null?void 0:b.toLowerCase())||"",d=t%5*20,h=Math.floor(t/5)*20,p=l.startsWith("image/")||["jpg","jpeg","png","gif","webp","bmp"].includes(u),f=l.startsWith("video/")||["mp4","mov","avi","mkv","webm"].includes(u);p?await ZJ(e,o,c,n+d,r+h,i,a):f&&await QJ(e,o,c,n+d,r+h,i,a)}const qJ=400*1024,CC=15*1024*1024,KJ=typeof window<"u"&&"__TAURI__"in window&&!0;function XJ(e){return new Promise((t,n)=>{const r=new FileReader;r.onload=()=>t(r.result),r.onerror=n,r.readAsDataURL(e)})}function YJ(e){return new Promise(t=>{const n=new Image,r=setTimeout(()=>{n.onload=n.onerror=()=>{},n.src="",t(null)},5e3);n.onload=()=>{clearTimeout(r);const i=n.naturalWidth,a=n.naturalHeight;t({imageSize:`${i}×${a}`,width:i,height:a})},n.onerror=()=>{clearTimeout(r),t(null)},n.src=e})}function JJ(e,t){const n=e/t,i=n>=.85&&n<=1/.85?260:440,a=800,o=150;let l,c;n>=1?(l=i,c=Math.round(i/n)):(c=i,l=Math.round(i*n));const u=Math.max(l,c),d=Math.min(l,c);if(u>a){const h=a/u;l=Math.round(l*h),c=Math.round(c*h)}else if(dqJ,d=typeof e.path=="string"&&e.path?e.path:void 0,h=URL.createObjectURL(e);let p=h,f,b=300,g=200;try{const v=await YJ(h);if(v){f=v.imageSize;const m=JJ(v.width,v.height);b=m.width,g=m.height}}catch{}const y={id:l,type:"input-image",x:r,y:i,width:b,height:g,content:p,prompt:t,nodeName:c,...d?{_localFilePath:d}:{},settings:{mediaType:"image",disableThumbnailCreationOnImport:!0,...f?{imageSize:f}:{},_originalSize:n,_isLargeFile:u,_blobUrl:p}};a(v=>[...v,y]);const w=`local_${l}`;if((async()=>{try{await Xr.init(),await Xr.saveBlobAsset(w,e,`file://canvas-import/${encodeURIComponent(t)}`,"local")&&a(m=>m.map(z=>z.id===l?{...z,_contentAssetId:w,settings:{...z.settings,_assetId:w}}:z))}catch(v){console.warn("[FileDropHandler] local cache for dropped file failed:",v)}})(),KJ&&n<=CC){(async()=>{try{const v=await XJ(e),m=await Ln.store(v),z=Ln.createRef(m);a(C=>C.map(E=>E.id===l?{...E,content:z,settings:{...E.settings,_blobUrl:void 0}}:E))}catch(v){console.warn("[FileDropHandler] Background store for aget/裁切 failed:",v)}})();return}u&&n<=CC&&(async()=>{try{if((await Bl()).shouldUseRust){const C=`data:image/jpeg;base64,${await Mm("process_image",e,{maxDimension:1536,quality:.78})}`,E=await Ln.store(C),I=Ln.createRef(E);a(R=>R.map(A=>A.id===l?{...A,content:I,settings:{...A.settings,_blobUrl:void 0}}:A))}}catch(v){console.warn("[FileDropHandler] Background Rust+store failed:",v)}})()}async function QJ(e,t,n,r,i,a,o){const l=B0(t),c=o(),u=URL.createObjectURL(e),d=typeof e.path=="string"&&e.path?e.path:void 0,h={id:c,type:"input-image",x:r,y:i,width:320,height:200,content:u,prompt:t,nodeName:l,...d?{_localFilePath:d}:{},settings:{mediaType:"video",_originalSize:n,videoFileName:t,_blobUrl:u}};a(f=>[...f,h]);const p=`local_${c}`;(async()=>{try{await Xr.init(),await Xr.saveBlobAsset(p,e,`file://canvas-import/${encodeURIComponent(t)}`,"local")&&a(b=>b.map(g=>g.id===c?{...g,_contentAssetId:p,settings:{...g.settings,_assetId:p}}:g))}catch(f){console.warn("[FileDropHandler] local cache for dropped video failed:",f)}})()}const Sp=Object.freeze(Object.defineProperty({__proto__:null,extractNodeNameFromFileName:B0,useFileDropHandler:PO},Symbol.toStringTag,{value:"Module"})),eZ='N/A',tZ="data:image/svg+xml;base64,"+btoa(eZ),NC=(e,t=2048,n=.85)=>new Promise(r=>{if(e.startsWith("data:image/jpeg")&&(e.length-e.indexOf(",")-1)*3/4/1024/1024<.5){r(e);return}const i=new Image;i.onload=()=>{try{const a=document.createElement("canvas"),o=a.getContext("2d",{willReadFrequently:!1,alpha:!1});if(!o){r(e);return}let l=i.width,c=i.height;if(l>t||c>t){const d=t/Math.max(l,c);l=Math.floor(l*d),c=Math.floor(c*d)}a.width=l,a.height=c,o.drawImage(i,0,0,l,c);const u=a.toDataURL("image/jpeg",n);a.width=0,a.height=0,r(u)}catch(a){console.warn("[compressImage] 压缩失败:",a),r(e)}},i.onerror=()=>r(e),i.src=e}),nZ=async(e,t=!0,n,r)=>{const i=(r==null?void 0:r.onFailedBehavior)??"keep",a=(r==null?void 0:r.silentFail)??!1,o=(r==null?void 0:r.preserveOriginalFields)??[],l=(r==null?void 0:r._currentFieldName)??"",c=(r==null?void 0:r.timeoutMs)??2500,u=o.some(h=>l===h||l.endsWith(`_${h}`)||l.includes(`[${h}]`)),d=t&&!u;if(u&&l&&console.log(`[urlToDataURL] 保留原图不压缩,字段: ${l}`),!e||e.startsWith("data:")){if(d&&e.startsWith("data:image/")&&!e.startsWith("data:image/jpeg"))try{return await NC(e)}catch{return e}return e}try{const h=new Promise((b,g)=>{setTimeout(()=>g(new Error("转换超时")),c)}),p=fetch(e).then(b=>{if(!b.ok)throw new Error(`HTTP ${b.status}`);return b.blob()}).then(b=>new Promise((g,y)=>{const w=new FileReader;w.onloadend=()=>{const v=w.result;d&&v.startsWith("data:image/")?NC(v).then(m=>{g(m)}).catch(()=>g(v)):g(v)},w.onerror=()=>y(new Error("FileReader 失败")),w.readAsDataURL(b)}));return await Promise.race([p,h])}catch(h){return a||console.warn("[urlToDataURL] 转换失败:",e.substring(0,60)+"...",h),n&&n.push(e),i==="placeholder"?tZ:e}},ll=async(e,t=0,n,r={count:0,current:0},i,a)=>{if(t>10||e==null)return e;if(typeof e=="string"){const o=e.trim();return(o.startsWith("http://")||o.startsWith("https://")||o.startsWith("blob:")||o.match(/^[a-zA-Z]:[\\\/]/)||o.startsWith("file:///")||o.startsWith("file://")||o.startsWith("/")&&o.match(/\.(jpg|jpeg|png|gif|webp|mp4|webm|mov|avi|mp3|wav|ogg|m4a|aac)$/i))&&!o.startsWith("data:")?(r.current++,n&&r.count>0&&n(r.current/r.count*100,`正在转换 ${r.current}/${r.count}`,"export"),await nZ(o,!0,i,a)):e}if(Array.isArray(e)){const o=[],c=(a==null?void 0:a._currentFieldName)??"";for(let u=0;u{const b={...a,_currentFieldName:c};return ll(p,t+1,n,r,i,b)}));o.push(...h),u%10===0&&u>0&&await new Promise(p=>setTimeout(p,5))}return o}if(typeof e=="object"){const o={},l=Object.entries(e),c=10;for(let u=0;u{const b={...a,_currentFieldName:p},g=await ll(f,t+1,n,r,i,b);return[p,g]}))).forEach(([p,f])=>{o[p]=f}),u%(c*2)===0&&u>0&&await new Promise(p=>setTimeout(p,5))}return o}return e},Ol=(e,t=0)=>{if(t>10||e==null)return 0;if(typeof e=="string"){const n=e.trim();return(n.startsWith("http://")||n.startsWith("https://")||n.startsWith("blob:")||n.match(/^[a-zA-Z]:[\\\/]/)||n.startsWith("file:///")||n.startsWith("file://")||n.startsWith("/")&&n.match(/\.(jpg|jpeg|png|gif|webp|mp4|webm|mov|avi|mp3|wav|ogg|m4a|aac)$/i))&&!n.startsWith("data:")?1:0}return Array.isArray(e)?e.reduce((n,r)=>n+Ol(r,t+1),0):typeof e=="object"?Object.values(e).reduce((n,r)=>n+Ol(r,t+1),0):0},rZ=Object.freeze(Object.defineProperty({__proto__:null,convertUrlsToDataURLs:ll,countUrls:Ol},Symbol.toStringTag,{value:"Module"}));function sZ(e,t){if(e.videoFileName)return B0(e.videoFileName);if(e.prompt&&typeof e.prompt=="string"){const r=e.prompt.trim();if(r.match(/\.(jpg|jpeg|png|gif|webp|bmp|mp4|mov|avi|mkv|webm|mp3|wav|ogg|m4a|aac|flac)$/i)||r.length<100&&!r.includes(" ")&&!r.includes(` +`))return B0(r)}return`${Rm(e.type)}${t+1}`}const iZ=async e=>{const t=e._localFilePath;if(!t||typeof t!="string")return null;try{console.warn(`[useProjectIO] ⚠️ 不支持从本地文件系统恢复: ${t}`)}catch(n){console.warn(`[useProjectIO] ⚠️ 恢复本地文件失败: ${t}`,n)}return null},aZ=async(e,t=0)=>{var u;const n=e.settings?{...e.settings}:{};"_executeTrigger"in n&&delete n._executeTrigger;const r={...e,settings:n,_nodeUpdateTime:Date.now()};r.type==="custom-agent"&&("isGenerating"in r&&delete r.isGenerating,"generationProgress"in r&&delete r.generationProgress),(!r.nodeName||r.nodeName.trim()==="")&&(r.nodeName=sZ(r,t),console.log(`[useProjectIO] 为旧版本节点 ${r.id} (${r.type}) 自动生成名称: ${r.nodeName}`));const i=(u=e.settings)==null?void 0:u._assetId;if(i)try{const{assetStore:d}=await mn(async()=>{const{assetStore:p}=await Promise.resolve().then(()=>_s);return{assetStore:p}},void 0,import.meta.url),h=await d.getAssetUrl(i);if(h)return r.content=h,r}catch(d){console.error("[useProjectIO] ❌ Failed to restore from assetStore:",d)}const a=e._contentAssetId,o=e._previewMjAssetIds,l=e._selectedImageAssetId;if(a||o!=null&&o.length||l)try{const{assetStore:d}=await mn(async()=>{const{assetStore:h}=await Promise.resolve().then(()=>_s);return{assetStore:h}},void 0,import.meta.url);if(a&&(!r.content||r.content==="")){const h=await d.getAssetUrl(a);h&&(r.content=h)}if(o&&r.previewMjImages){const h=[...r.previewMjImages];for(let p=0;p{var ie;const p=xr.getManifest();if(!p||Object.keys(p.assets).length===0)return console.log("[useProjectIO] 本地缓存为空,回退到 JSON 导出"),!1;await xr.flushManifest();const f=new Set,b=oe=>{oe&&typeof oe=="string"&&f.add(oe)};for(const oe of e){b((ie=oe.settings)==null?void 0:ie._assetId),b(oe._contentAssetId),b(oe._selectedImageAssetId);const re=oe._previewMjAssetIds;re&&re.forEach(ee=>b(ee))}for(const oe of t){for(const ee of["_assetId","_audioAssetId","_mjOriginalAssetId","_thumbnailAssetId"])b(oe[ee]);const re=oe._mjAssetIds;re&&re.forEach(ee=>b(ee))}if([...f].filter(oe=>!oe.startsWith("preview_")&&!oe.startsWith("thumb_")).forEach(oe=>f.add(`preview_${oe}`)),f.size===0)return console.log("[useProjectIO] 没有匹配的缓存资源,回退到 JSON 导出"),!1;h==null||h(2,"请选择保存位置...","export");const y=Ew("standard"),w=`${u||"未命名项目"}_${y}.zip`;let v=null;if("showSaveFilePicker"in window)try{v=await(await window.showSaveFilePicker({suggestedName:w,types:[{description:"ZIP 项目包",accept:{"application/zip":[".zip"]}}]})).createWritable()}catch(oe){if(oe.name==="AbortError")return h==null||h(0,"","export"),!0;throw oe}const m=(await mn(async()=>{const{default:oe}=await Promise.resolve().then(()=>C4);return{default:oe}},void 0,import.meta.url)).default,z=new m,C={},E=(oe,re)=>{const ee=re.type||"application/octet-stream",pe=oe.startsWith("preview_")||oe.startsWith("thumb_")?"thumbnails":ee.startsWith("image/")?"images":ee.startsWith("video/")?"videos":ee.startsWith("audio/")?"audio":"other",we=ee.startsWith("image/")?ee.includes("jpeg")?"jpg":ee.split("/")[1]||"png":ee.startsWith("video/")?"mp4":ee.startsWith("audio/")?"mp3":"bin",me=(oe.length>16?`${oe.slice(0,8)}_${oe.slice(-8)}`:oe).replace(/[^a-zA-Z0-9_-]/g,"_"),ue=new Date().toISOString().slice(0,10).replace(/-/g,"");return{fileName:`${pe}/${ue}_${me}.${we}`,mimeType:ee,size:re.size,cachedAt:Date.now()}};h==null||h(5,"正在读取缓存资源...","export");let I=0;const R=f.size;for(const oe of f){let re=null,ee=p.assets[oe];const pe=await xr.readAsset(oe);if(pe&&(re=pe.blob,ee=p.assets[oe]),!re&&!oe.startsWith("preview_")&&!oe.startsWith("thumb_")){const we=await Xr.getAssetBlob(oe);we&&(re=we,ee=E(oe,re))}re&&ee&&(z.file(ee.fileName,re),C[oe]=ee),I++,(I%5===0||I===R)&&(h==null||h(5+I/R*20,`读取缓存资源 ${I}/${R}...`,"export"))}console.log(`[useProjectIO] 📦 ZIP: 已读取 ${Object.keys(C).length}/${R} 个资源(含缩略图),优先本地`),h==null||h(28,"正在处理项目数据...","export");const A=e.map(oe=>{var me;const re={...oe},ee=(me=oe.settings)==null?void 0:me._assetId;ee&&C[ee]&&re.content&&typeof re.content=="string"&&(re.content.startsWith("blob:")||re.content.startsWith("data:"))&&(re.content="");const pe=oe._contentAssetId;pe&&C[pe]&&re.content&&typeof re.content=="string"&&(re.content.startsWith("blob:")||re.content.startsWith("data:"))&&(re.content="");const we=oe._selectedImageAssetId;we&&C[we]&&re.selectedPreviewImage&&typeof re.selectedPreviewImage=="string"&&(re.selectedPreviewImage.startsWith("blob:")||re.selectedPreviewImage.startsWith("data:"))&&(re.selectedPreviewImage="");const Q=oe._previewMjAssetIds;return Q&&re.previewMjImages&&(re.previewMjImages=re.previewMjImages.map((ue,U)=>Q[U]&&C[Q[U]]&&ue&&(ue.startsWith("blob:")||ue.startsWith("data:"))?"":ue)),re}),O=t.map(oe=>{const re={...oe},ee=oe._assetId;ee&&C[ee]&&re.url&&(re.url.startsWith("blob:")||re.url.startsWith("data:"))&&(re.url="");const pe=oe._mjAssetIds;pe&&re.mjImages&&(re.mjImages=re.mjImages.map((we,Q)=>pe[Q]&&C[pe[Q]]&&we&&(we.startsWith("blob:")||we.startsWith("data:"))?"":we));for(const[we,Q]of[["_audioAssetId","audioUrl"],["_mjOriginalAssetId","mjOriginalUrl"],["_thumbnailAssetId","thumbnailUrl"]]){const me=oe[we];me&&C[me]&&re[Q]&&(re[Q]="")}return re});h==null||h(32,"正在转换未缓存的资源...","export");const F=[],X={count:Ol(A)+Ol(c)+Ol(l)+Ol(O),current:0},T={preserveOriginalFields:["content","previewMjImages","previewMjVideos","selectedPreviewImage","selectedPreviewVideo","_contentAssetId","_previewMjAssetIds","_selectedImageAssetId"]},q=[],H=3;for(let oe=0;oesetTimeout(pe,10))}h==null||h(46,"正在处理角色库...","export");const J=await ll(c,0,h,X,F);h==null||h(50,"正在处理聊天会话...","export");const B=await ll(l,0,h,X,F,{preserveOriginalFields:["content","url","imageUrl","files"]});h==null||h(55,"正在处理历史记录...","export");const N=typeof navigator<"u"&&(navigator.platform.toLowerCase().includes("mac")||navigator.platform.toLowerCase().includes("win")||navigator.userAgent.toLowerCase().includes("mac")||navigator.userAgent.toLowerCase().includes("win"))?500:200;let j=O;j.length>N&&(j=j.slice(-N));const W=await ll(j,0,h,X,F,{preserveOriginalFields:["mjImages","originalUrl","mjOriginalUrl","url","videoPosterUrl","localCacheUrl","audioUrl"]});h==null||h(65,"正在生成项目文件...","export");const M={version:"2.9",format:"zip-container",projectName:u,nodes:q,connections:n,groups:r,canvasTextBoxes:i,canvasDoodleStrokes:a,view:{...o,viewportSize:d||{width:window.innerWidth,height:window.innerHeight}},chatSessions:B,characterLibrary:J,history:W,timestamp:ld()},Y=tu(M);z.file("project.json",JSON.stringify(Y,null,2)),z.file("manifest.json",JSON.stringify({version:"1.0",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),assets:C},null,2)),h==null||h(68,"正在压缩文件...","export");const se=await z.generateAsync({type:"blob",compression:"DEFLATE",compressionOptions:{level:6}},oe=>{h==null||h(68+oe.percent/100*22,`压缩中... ${oe.percent.toFixed(0)}%`,"export")});if(h==null||h(92,"正在保存文件...","export"),v)await v.write(se),await v.close();else{const oe=URL.createObjectURL(se),re=document.createElement("a");re.href=oe,re.download=w,document.body.appendChild(re),re.click(),document.body.removeChild(re),URL.revokeObjectURL(oe)}return F.length>0?(console.warn(`[useProjectIO] ⚠️ ZIP 导出有 ${F.length} 个非缓存资源转换失败`),h==null||h(100,"保存完成(ZIP,部分资源未缓存)","export")):h==null||h(100,"保存完成!(ZIP 格式)","export"),xr.isAvailable()&&xr.syncHistory(t).catch(()=>{}),setTimeout(()=>{h==null||h(0,"","export"),console.log(`[useProjectIO] ✅ ZIP 导出成功!包含 ${Object.keys(C).length} 个缓存资源。`)},500),!0},lZ=({projectName:e,nodes:t,connections:n,view:r,history:i,chatSessions:a,characterLibrary:o,klingSubjectLibrary:l,selectedNodeId:c,selectedNodeIds:u,groups:d,canvasTextBoxes:h=[],canvasDoodleStrokes:p=[],setNodes:f,setConnections:b,setView:g,setHistory:y,setChatSessions:w,setCharacterLibrary:v,setKlingSubjectLibrary:m,setProjectName:z,setGroups:C,setCanvasTextBoxes:E,setCanvasDoodleStrokes:I,setSelectionContextMenu:R,onProgress:A,viewportSize:O})=>{const F=typeof window<"u"&&"__TAURI__"in window;_.useEffect(()=>{if(!F||!A)return;let Z;return K5("project-progress",B=>{const V=B.payload,N=typeof V.percent=="number"?V.percent:0,j=V.message||"";A(N,j,"export")}).then(B=>{Z=B}),()=>{Z==null||Z()}},[F,A]);const L=_.useCallback(async Z=>{if(!F)return null;try{const{open:B}=await mn(async()=>{const{open:N}=await Promise.resolve().then(()=>L0);return{open:N}},void 0,import.meta.url),V=await B({directory:!0,multiple:!1,defaultPath:Z.replace(/\.json$/i,"")});return V?Array.isArray(V)?V[0]?`${V[0]}/${Z.replace(/\.json$/i,"")}`:null:`${V}/${Z.replace(/\.json$/i,"")}`:null}catch(B){return console.error("[useProjectIO] Tauri 目录选择失败:",B),null}},[F]),X=_.useCallback(async(Z,B)=>{if(!F)return console.log("[useProjectIO] 非 Tauri 环境,跳过容器导出"),!1;console.log("[useProjectIO] 🚀 开始 Tauri 容器导出..."),A==null||A(1,"请选择保存目录(容器格式)...","export");const V=await L(B);if(!V)return console.log("[useProjectIO] 用户取消选择目录"),A==null||A(0,"","export"),!0;console.log("[useProjectIO] 📁 选择的容器路径:",V),A==null||A(10,"正在写入容器格式...","export");try{const N=await yn("export_project",{path:V,payloadJson:Z,options:{chunk_size:65536,hash:!0,separate_assets:!0}});return console.log("[useProjectIO] ✅ 容器导出成功:",N),A==null||A(100,"保存完成!(容器格式)","export"),setTimeout(()=>A==null?void 0:A(0,"","export"),500),!0}catch(N){return console.error("[useProjectIO] ❌ Tauri export 失败:",N),console.error("[useProjectIO] 错误详情:",JSON.stringify(N,null,2)),A==null||A(-1,`容器导出失败: ${N.message||"未知错误"},将回退到传统格式`,"export"),!1}},[F,A,L]),T=_.useCallback(async()=>{var Z,B,V;try{const{memoryMonitor:N}=await mn(async()=>{const{memoryMonitor:me}=await Promise.resolve().then(()=>aw);return{memoryMonitor:me}},void 0,import.meta.url),j=N.canSafeSave();if(!j.canSave){console.error("[useProjectIO] 内存不足,无法保存:",j.reason),A==null||A(-1,`${j.reason}。${j.suggestion}`,"export");return}if(j.suggestion&&console.warn("[useProjectIO] 内存警告:",j.reason,j.suggestion),await N.cleanupBeforeSave(),A==null||A(0,"正在准备保存...","export"),!F&&xr.isAvailable()){try{if(await oZ(t,i,n,d,h,p,r,a,o,e,O,A))return;console.log("[useProjectIO] ZIP 导出未成功,回退到 JSON 格式")}catch(me){console.warn("[useProjectIO] ZIP 导出失败,回退到 JSON:",me)}A==null||A(0,"正在准备保存...","export")}const k=Ew("standard"),W=`${e||"未命名项目"}_${k}.json`;let M=null,Y=null,se=!1;if("showSaveFilePicker"in window)try{A==null||A(1,"请选择保存位置...","export"),M=await window.showSaveFilePicker({suggestedName:W,types:[{description:"JSON File",accept:{"application/json":[".json"]}}]}),Y=await M.createWritable(),A==null||A(5,"正在准备数据...","export")}catch(me){if(me.name==="AbortError"){A==null||A(0,"","export");return}console.error("File System API 打开失败:",me),M=null,Y=null}if(!M&&"__TAURI__"in window)try{console.log("[useProjectIO] 尝试使用Tauri dialog API (Mac兼容)");const{save:me}=await mn(async()=>{const{save:G}=await Promise.resolve().then(()=>L0);return{save:G}},void 0,import.meta.url),{writeTextFile:ue}=await mn(async()=>{const{writeTextFile:G}=await Promise.resolve().then(()=>bx);return{writeTextFile:G}},void 0,import.meta.url);A==null||A(1,"请选择保存位置...","export");const U=await me({defaultPath:W,filters:[{name:"JSON",extensions:["json"]}]});if(U)se=!0,console.log("[useProjectIO] Tauri dialog 选择路径:",U),M={tauriPath:U},A==null||A(5,"正在准备数据...","export");else{A==null||A(0,"","export");return}}catch(me){console.error("[useProjectIO] Tauri dialog 失败:",me)}let ie=t,oe=i;if(xr.isAvailable()){A==null||A(7,"正在从本地缓存预加载资源...","export"),await xr.flushManifest();const me=[];for(const U of t){const G=(Z=U.settings)==null?void 0:Z._assetId;if(G&&U.content&&typeof U.content=="string"&&U.content.startsWith("blob:"))try{if(!(await fetch(U.content,{method:"HEAD"})).ok)throw new Error("dead");me.push(U)}catch{const te=await xr.readAsset(G);te?(me.push({...U,content:URL.createObjectURL(te.blob)}),console.log(`[useProjectIO] ♻️ Restored dead blob URL from cache: ${G}`)):me.push(U)}else me.push(U)}ie=me;const ue=[];for(const U of i){const G=U._assetId;if(G&&U.url&&U.url.startsWith("blob:"))try{if(!(await fetch(U.url,{method:"HEAD"})).ok)throw new Error("dead");ue.push(U)}catch{const te=await xr.readAsset(G);te?(ue.push({...U,url:URL.createObjectURL(te.blob)}),console.log(`[useProjectIO] ♻️ Restored history blob URL from cache: ${G}`)):ue.push(U)}else ue.push(U)}oe=ue}if(ie.some(me=>typeof me.content=="string"&&(me.content.startsWith("http")||me.content.startsWith("blob:")||me.content.startsWith("data:")))||oe.some(me=>me.url&&(me.url.startsWith("http")||me.url.startsWith("blob:")))){console.log("[useProjectIO] 检测到 URL,开始转换为 Base64..."),A==null||A(10,"正在将所有图片转换为本地数据格式...","export");const ue={count:Ol(ie)+Ol(o)+Ol(a)+Ol(oe),current:0},U=[],G=3,te=[],ge={preserveOriginalFields:["content","previewMjImages","previewMjVideos","selectedPreviewImage","selectedPreviewVideo","_contentAssetId","_previewMjAssetIds","_selectedImageAssetId"]};for(let Ee=0;EesetTimeout(Ne,10)),Ee%(G*3)===0&&Ee>0&&await new Promise(Ne=>setTimeout(Ne,50))}A==null||A(40,"正在处理角色库...","export");const ne=await ll(o,0,A,ue,U);await new Promise(Ee=>setTimeout(Ee,0)),A==null||A(50,"正在处理聊天会话...","export");const fe=await ll(a,0,A,ue,U,{preserveOriginalFields:["content","url","imageUrl","files"]});await new Promise(Ee=>setTimeout(Ee,0)),A==null||A(60,"正在处理历史记录...","export");const de=typeof navigator<"u"&&(navigator.platform.toLowerCase().includes("mac")||navigator.platform.toLowerCase().includes("win")||navigator.userAgent.toLowerCase().includes("mac")||navigator.userAgent.toLowerCase().includes("win"))?500:200;let $e=oe;$e.length>de&&(console.warn(`[useProjectIO] ⚠️ 历史记录过多 (${$e.length}),只保存最新 ${de} 条`),$e=$e.slice(-de));const _e=await ll($e,0,A,ue,U,{preserveOriginalFields:["mjImages","originalUrl","mjOriginalUrl","url","videoPosterUrl","localCacheUrl","audioUrl"]});if(await new Promise(Ee=>setTimeout(Ee,0)),A==null||A(70,"正在生成项目文件...","export"),se&&M&&M.tauriPath){A==null||A(70,"正在生成项目文件...","export");const Ee={version:"2.9",projectName:e,nodes:te,connections:n,groups:d,canvasTextBoxes:h,canvasDoodleStrokes:p,view:{...r,viewportSize:O||{width:window.innerWidth,height:window.innerHeight}},chatSessions:fe,characterLibrary:ne,history:_e,timestamp:ld()};console.log(`[useProjectIO] 📦 项目包含 ${d.length} 个分组:`,d.map(ve=>`${ve.name}(${ve.nodeIds.length}个节点)`).join(", ")),A==null||A(85,"正在生成JSON文件...","export");const Ce=tu(Ee);let xe;try{xe=JSON.stringify(Ce,null,2)}catch(ve){if(ve instanceof RangeError&&ve.message.includes("Invalid string length")){console.warn("项目数据过大,使用紧凑格式"),A==null||A(87,"数据较大,使用紧凑格式...","export");try{xe=JSON.stringify(Ce)}catch(ke){throw console.error("紧凑格式序列化也失败:",ke),new Error("项目数据过大,无法序列化。请尝试减少画布内容或历史记录。")}}else throw ve}if(await X(xe,W))return;if(se&&M&&M.tauriPath){A==null||A(95,"正在写入文件...","export");try{const{writeTextFile:ve}=await mn(async()=>{const{writeTextFile:ke}=await Promise.resolve().then(()=>bx);return{writeTextFile:ke}},void 0,import.meta.url);await ve(M.tauriPath,xe),console.log("[useProjectIO] Tauri文件写入成功")}catch(ve){throw console.error("[useProjectIO] Tauri文件写入失败:",ve),new Error("文件写入失败: "+ve.message)}}else if(Y&&M)A==null||A(95,"正在写入文件...","export"),await Y.write(xe),await Y.close();else{A==null||A(95,"正在创建下载...","export");const ve=new Blob([xe],{type:"application/json"}),ke=URL.createObjectURL(ve),Ie=document.createElement("a");Ie.href=ke,Ie.download=W,document.body.appendChild(Ie),Ie.click(),document.body.removeChild(Ie),URL.revokeObjectURL(ke)}}else if(Y&&M){A==null||A(95,"正在写入文件...","export");const Ee={version:"2.9",projectName:e,nodes:te,connections:n,groups:d,canvasTextBoxes:h,canvasDoodleStrokes:p,view:{...r,viewportSize:O||{width:window.innerWidth,height:window.innerHeight}},chatSessions:fe,characterLibrary:ne,history:_e,timestamp:ld()},Ce=tu(Ee),xe=JSON.stringify(Ce,null,2);await Y.write(xe),await Y.close()}else{A==null||A(95,"正在创建下载...","export");const Ee={version:"2.9",projectName:e,nodes:te,connections:n,groups:d,canvasTextBoxes:h,canvasDoodleStrokes:p,view:{...r,viewportSize:O||{width:window.innerWidth,height:window.innerHeight}},chatSessions:fe,characterLibrary:ne,history:_e,timestamp:ld()},Ce=tu(Ee),xe=JSON.stringify(Ce,null,2),Ne=new Blob([xe],{type:"application/json"}),ve=URL.createObjectURL(Ne),ke=document.createElement("a");ke.href=ve,ke.download=W,document.body.appendChild(ke),ke.click(),document.body.removeChild(ke),URL.revokeObjectURL(ve)}if(U.length>0){console.warn(`[useProjectIO] ⚠️ 有 ${U.length} 个资源转换失败,已保留原URL`),console.warn("[useProjectIO] 失败资源列表:",U.slice(0,10)),A==null||A(100,"保存完成(含部分离线资源,见下载报告)","export"),setTimeout(()=>{A==null||A(0,"","export"),console.log("[useProjectIO] ⚠️ 项目保存完成,但有部分资源未能下载(已生成报告)。")},500);return}A==null||A(100,"保存完成!","export"),xr.isAvailable()&&xr.syncHistory(i).catch(()=>{}),setTimeout(()=>{A==null||A(0,"","export"),console.log("[useProjectIO] ✅ 项目保存成功!所有图片和视频已包含在文件中。")},500);return}console.log("[useProjectIO] 未检测到 URL,直接保存..."),A==null||A(85,"正在生成JSON文件...","export");const ee={version:"2.9",projectName:e,nodes:t,connections:n,groups:d,canvasTextBoxes:h,canvasDoodleStrokes:p,view:{...r,viewportSize:O||{width:window.innerWidth,height:window.innerHeight}},chatSessions:a,characterLibrary:o,history:i,timestamp:ld()},pe=tu(ee);let we;try{we=JSON.stringify(pe,null,2)}catch(me){if(me instanceof RangeError&&me.message.includes("Invalid string length")){console.warn("项目数据过大,使用紧凑格式"),A==null||A(87,"数据较大,使用紧凑格式...","export");try{we=JSON.stringify(pe)}catch(ue){throw console.error("紧凑格式序列化也失败:",ue),new Error("项目数据过大,无法序列化。请尝试减少画布内容或历史记录。")}}else throw me}if(await X(we,W))return;if(se&&M&&M.tauriPath){A==null||A(95,"正在写入文件...","export");try{const{writeTextFile:me}=await mn(async()=>{const{writeTextFile:ue}=await Promise.resolve().then(()=>bx);return{writeTextFile:ue}},void 0,import.meta.url);await me(M.tauriPath,we),console.log("[useProjectIO] Tauri文件写入成功")}catch(me){throw console.error("[useProjectIO] Tauri文件写入失败:",me),new Error("文件写入失败: "+me.message)}}else if(Y&&M)A==null||A(95,"正在写入文件...","export"),await Y.write(we),await Y.close();else{A==null||A(95,"正在创建下载...","export");const me=new Blob([we],{type:"application/json"}),ue=URL.createObjectURL(me),U=document.createElement("a");U.href=ue,U.download=W,document.body.appendChild(U),U.click(),document.body.removeChild(U),URL.revokeObjectURL(ue)}A==null||A(100,"保存完成!","export"),xr.isAvailable()&&xr.syncHistory(i).catch(()=>{}),setTimeout(()=>{A==null||A(0,"","export"),console.log("[useProjectIO] ✅ 项目保存成功!")},500)}catch(N){console.error("保存项目失败:",N),A==null||A(0,"","export");const j="保存项目失败: "+(N.message||"未知错误");(B=N.message)!=null&&B.includes("memory")||(V=N.message)!=null&&V.includes("allocation")?console.error("[useProjectIO]",j+" - 建议:减少节点数量、关闭其他标签页、或使用性能更好的设备"):console.error("[useProjectIO]",j),A==null||A(-1,j,"export")}},[e,t,n,r,i,a,o,d,h,p,A,O]),q=_.useCallback(()=>{const Z=async V=>{if(!F){const se=Ol(V);if(se>0){A==null||A(5,`检测到 ${se} 个外部资源,正在转换...`,"import");const ie=[];V=await ll(V,0,(re,ee)=>A==null?void 0:A(5+re*.08,ee,"import"),{count:se,current:0},ie,{onFailedBehavior:"placeholder",silentFail:!0}),ie.length>0&&console.log(`[useProjectIO] 项目导入: ${ie.length} 个资源不可用,已替换为占位符`)}}if(jx(V)){const se=yP(V);if(console.log(`[useProjectIO] 检测到 Base64 数据,估计大小: ${(se/1024/1024).toFixed(2)}MB`),se>20971520){console.log("[useProjectIO] 大型项目检测,使用流式 Hydration..."),A==null||A(15,"正在优化大型项目(流式处理)...","import");const{hydrateProjectDataStreaming:ie}=await mn(async()=>{const{hydrateProjectDataStreaming:ee}=await Promise.resolve().then(()=>Cx);return{hydrateProjectDataStreaming:ee}},void 0,import.meta.url),{data:oe,stats:re}=await ie(V,(ee,pe)=>{A==null||A(15+ee*.1,pe,"import")});V=oe,console.log("[useProjectIO] ✅ 流式 Hydration 完成!"),console.log(` - 转换图片: ${re.converted} 张`),console.log(` - 节省内存: ${(re.totalSize/1024/1024).toFixed(2)}MB`),console.log(` - 跳过项目: ${re.skipped} 个`),A==null||A(25,`已优化 ${re.converted} 张图片,节省 ${(re.totalSize/1024/1024).toFixed(2)}MB 内存`,"import")}else{console.log("[useProjectIO] 开始 Hydration(Base64 → Blob URL)..."),A==null||A(15,"正在优化内存数据(Base64 → Blob URL)...","import");const{hydrateProjectData:ie}=await mn(async()=>{const{hydrateProjectData:ee}=await Promise.resolve().then(()=>Cx);return{hydrateProjectData:ee}},void 0,import.meta.url),{data:oe,stats:re}=await ie(V);V=oe,console.log("[useProjectIO] ✅ Hydration 完成!"),console.log(` - 转换图片: ${re.converted} 张`),console.log(` - 节省内存: ${(re.totalSize/1024/1024).toFixed(2)}MB`),console.log(` - 跳过项目: ${re.skipped} 个`),A==null||A(25,`已优化 ${re.converted} 张图片,节省 ${(re.totalSize/1024/1024).toFixed(2)}MB 内存`,"import")}}else console.log("[useProjectIO] 未检测到 Base64 数据,跳过 Hydration");const j=V.nodes||[],k=j.length;console.log(`[useProjectIO] Processing ${k} nodes...`),A==null||A(30,`正在处理 ${k} 个节点...`,"import"),f([]);const W=[],M=20;for(let se=0;sesetTimeout(re,0))}A==null||A(70,"正在加载节点到画布...","import"),f([]),await new Promise(se=>setTimeout(se,50));const Y=50;for(let se=0;sesetTimeout(re,10))}}if(A==null||A(75,"正在加载连接...","import"),V.connections&&b(V.connections),A==null||A(77,"正在加载分组...","import"),V.groups&&Array.isArray(V.groups)?(C(V.groups),console.log(`[useProjectIO] ✅ 已加载 ${V.groups.length} 个分组`)):(C([]),console.log("[useProjectIO] ⚠️ 项目文件不包含分组数据(可能是旧版本)")),A==null||A(80,"正在加载视图...","import"),V.view&&g(V.view),A==null||A(82,"正在恢复画布批注与涂鸦...","import"),E&&E(Array.isArray(V.canvasTextBoxes)?V.canvasTextBoxes:[]),I&&I(Array.isArray(V.canvasDoodleStrokes)?V.canvasDoodleStrokes:[]),A==null||A(85,"正在加载聊天会话...","import"),V.chatSessions){w(V.chatSessions);let se=0;V.chatSessions.forEach(ie=>{var oe;(oe=ie.messages)==null||oe.forEach(re=>{re.files&&re.files.length>0&&(se+=re.files.length)})}),console.log(`[useProjectIO] ✅ 已加载 ${V.chatSessions.length} 个聊天会话,包含 ${se} 个媒体文件`)}if(A==null||A(87,"正在加载历史记录...","import"),V.history){const ie=typeof navigator<"u"&&(navigator.platform.toLowerCase().includes("mac")||navigator.platform.toLowerCase().includes("win")||navigator.userAgent.toLowerCase().includes("mac")||navigator.userAgent.toLowerCase().includes("win"))?500:200;let oe=V.history;oe.length>ie&&(console.warn(`[useProjectIO] ⚠️ 历史记录过多 (${oe.length}),只加载最新 ${ie} 条`),oe=oe.slice(-ie)),y(oe),console.log(`[useProjectIO] ✅ 已加载 ${oe.length} 条历史记录`)}else console.log("[useProjectIO] ⚠️ 项目文件不包含历史记录(可能是旧版本)");A==null||A(90,"正在加载角色库...","import"),V.characterLibrary&&await SC(V.characterLibrary,v,A),A==null||A(95,"正在应用项目设置...","import"),V.projectName&&z(Nw(V.projectName)),A==null||A(100,"加载完成!","import"),setTimeout(()=>{A==null||A(0,"","import"),console.log("[useProjectIO] ✅ 项目加载成功!"),setTimeout(async()=>{var se;try{const ie=xr.isAvailable();let oe=0;for(const ee of W)if(ee.content&&typeof ee.content=="string"&&ee.content.startsWith("blob:"))try{const pe=await fetch(ee.content);if(!pe.ok)continue;const we=await pe.blob(),Q=((se=ee.settings)==null?void 0:se._assetId)||ee.id;await Xr.saveBlobAsset(Q,we,ee.content),ie&&(await xr.saveAsset(Q,we,we.type||"application/octet-stream"),oe++)}catch{}const re=V.history||[];for(const ee of re){const pe=ee._assetId;if(pe&&ee.url&&ee.url.startsWith("blob:"))try{const we=await fetch(ee.url);if(!we.ok)continue;const Q=await we.blob();await Xr.saveBlobAsset(pe,Q,ee.url),ie&&(await xr.saveAsset(pe,Q,Q.type||"application/octet-stream"),oe++)}catch{}}ie&&re.length>0&&await xr.syncHistory(re),oe>0&&console.log(`[useProjectIO] ✅ 导入后缓存了 ${oe} 个资源到本地目录`)}catch(ie){console.warn("[useProjectIO] 导入后资源缓存失败(不影响使用):",ie)}},2e3),setTimeout(()=>{const se=W.filter(ie=>ie.content&&typeof ie.content=="string"&&ie.content.startsWith("data:image")&&ie.content.length>102400);if(se.length>0){console.log(`[useProjectIO] 🖼️ 开始后台生成 ${se.length} 张图片的缩略图...`);const ie=5;let oe=0;const re=async ee=>{const pe=se.slice(ee,ee+ie);await Promise.all(pe.map(async we=>{try{we.content&&!zi.hasThumbnail(we.id)&&(await zi.storeWithThumbnails(we.id,we.content),oe++)}catch{}})),ee+iere(ee+ie),100):console.log(`[useProjectIO] ✅ 缩略图生成完成: ${oe}/${se.length}`)};re(0)}},1e3)},500)};if(F){(async()=>{try{const{open:V}=await mn(async()=>{const{open:M}=await Promise.resolve().then(()=>L0);return{open:M}},void 0,import.meta.url),N=await V({directory:!0,multiple:!1,title:"选择项目文件夹或项目JSON文件"});if(!N)return;let j=Array.isArray(N)?N[0]:N;console.log("[useProjectIO] 选择的路径:",j),console.log("[useProjectIO] 路径类型:",typeof j),p$(),A==null||A(2,"正在读取文件...","import");const k=await yn("import_project",{path:j,options:{lazy_assets:!1,batch_size:200,max_memory_mb:512}});console.log("[useProjectIO] 导入结果:",k);const W=k.project_json;await Z(W)}catch(V){console.error("加载项目失败:",V),A==null||A(0,"","import");const N=V.message||"未知错误";let j="加载项目失败: ";N.includes("JSON 格式错误")||N.includes("JSON 解析失败")?j+=N+" - 可能的原因:文件在保存时被截断、文件编码不正确、或文件不是有效的项目文件":N.includes("内存不足")||N.includes("memory")?j+=N+" - 建议:关闭其他应用、重启后重试":N.includes("读取数据文件失败")||N.includes("project.data.json")?j+=N+" - 可能的原因:选择的不是有效的项目文件夹,或文件夹结构不正确。请确保选择的是导出的项目文件夹(包含 project.data.json 文件)或项目 JSON 文件":N.includes("文件读取失败")||N.includes("文件读取失败")?j+=N+" - 可能的原因:文件权限问题、文件正在被其他程序使用、或磁盘读取错误":j+=N,console.error("[useProjectIO]",j),A==null||A(-1,j,"import")}})();return}const B=document.createElement("input");B.type="file",B.accept=".json,.zip",B.onchange=async V=>{var j;const N=(j=V.target.files)==null?void 0:j[0];if(N)try{p$(),A==null||A(2,"正在读取文件...","import");const k=N.size/1024/1024;if(console.log(`[useProjectIO] Loading project file: ${k.toFixed(2)} MB`),k>100&&console.warn(`[useProjectIO] ⚠️ 文件大小为 ${k.toFixed(1)} MB,加载可能需要较长时间`),N.name.toLowerCase().endsWith(".zip")||N.type==="application/zip"||N.type==="application/x-zip-compressed"){console.log("[useProjectIO] 检测到 ZIP 文件,开始解压..."),A==null||A(5,"正在解压 ZIP 文件...","import");const Y=await(await mn(async()=>{const{default:ee}=await Promise.resolve().then(()=>C4);return{default:ee}},void 0,import.meta.url)).default.loadAsync(N),se=Y.file("project.json");if(!se)throw new Error("ZIP 文件中未找到 project.json,请确认这是有效的项目 ZIP 包");const ie=await se.async("string"),oe=JSON.parse(ie),re=Y.file("manifest.json");if(re){const ee=await re.async("string"),pe=JSON.parse(ee),we=Object.entries(pe.assets||{});A==null||A(8,`正在恢复 ${we.length} 个资源文件...`,"import");let Q=0;const me=xr.isAvailable();for(const[ue,U]of we){const G=Y.file(U.fileName);if(G)try{const te=await G.async("arraybuffer"),ge=new Blob([te],{type:U.mimeType}),ne=ue.startsWith("preview_")||ue.startsWith("thumb_"),le=ne?"thumbnails":void 0;ne||await Xr.saveBlobAsset(ue,ge,U.remoteUrl||""),me&&await xr.saveAsset(ue,ge,U.mimeType,U.remoteUrl,le),Q++,(Q%5===0||Q===we.length)&&(A==null||A(8+Q/we.length*14,`恢复资源 ${Q}/${we.length}...`,"import"))}catch(te){console.warn(`[useProjectIO] ⚠️ ZIP 资源恢复失败: ${ue}`,te)}}console.log(`[useProjectIO] ✅ 从 ZIP 恢复了 ${Q}/${we.length} 个资源`)}if(oe.history&&Array.isArray(oe.history)){A==null||A(23,"正在恢复历史记录 URL...","import");for(const ee of oe.history){const pe=ee._assetId;if(pe&&(!ee.url||ee.url==="")){const U=await Xr.getAssetUrl(pe);U&&(ee.url=U)}const we=ee._mjAssetIds;if(we&&ee.mjImages){for(let U=0;U{}),A==null||A(25,"正在加载项目数据...","import"),await Z(oe)}else{let M;try{M=await N.text()}catch(se){throw new Error(`文件读取失败: ${se.message}`)}A==null||A(10,"正在解析项目数据...","import");let Y;try{Y=JSON.parse(M),M=""}catch(se){console.error("[useProjectIO] JSON parse error:",se);const ie=se.message;throw ie.includes("Unexpected token")||ie.includes("JSON")?new Error("JSON 格式错误,文件可能已损坏或不是有效的项目文件"):ie.includes("memory")||ie.includes("allocation")?new Error("文件过大,内存不足。请尝试关闭其他标签页后重试"):new Error(`JSON 解析失败: ${ie}`)}await Z(Y)}}catch(k){console.error("加载项目失败:",k),A==null||A(0,"","import");const W=k.message||"未知错误";let M="加载项目失败: ";W.includes("ZIP")||W.includes("project.json")?M+=W+" - 请确认选择的是有效的项目 ZIP 包(需包含 project.json)":W.includes("JSON 格式错误")||W.includes("JSON 解析失败")?M+=W+" - 可能的原因:文件在保存时被截断、文件编码不正确、或文件不是有效的项目文件":W.includes("内存不足")||W.includes("memory")?M+=W+" - 建议:关闭其他浏览器标签页、重启浏览器、或使用性能更好的设备":W.includes("文件读取失败")?M+=W+" - 可能的原因:文件权限问题、文件正在被其他程序使用、或磁盘读取错误":M+=W,console.error("[useProjectIO]",M),A==null||A(-1,M,"import")}},B.click()},[f,b,g,y,w,v,z,C,E,I,A,F]),H=_.useCallback(()=>{const Z=document.createElement("input");Z.type="file",Z.accept=".json",Z.onchange=async B=>{var N;const V=(N=B.target.files)==null?void 0:N[0];if(V)try{const j=await V.text(),k=JSON.parse(j);if(k.nodes&&Array.isArray(k.nodes)){const W=new Map,M=20,Y=20;let se=k.nodes.map(ee=>{const pe=ns();W.set(ee.id,pe);const we=ee.settings?{...ee.settings}:{};"_executeTrigger"in we&&delete we._executeTrigger;const Q={...ee,id:pe,x:ee.x+M,y:ee.y+Y,settings:we};return Q.type==="custom-agent"&&("isGenerating"in Q&&delete Q.isGenerating,"generationProgress"in Q&&delete Q.generationProgress),Q});const ie=Ol(se);if(ie>0){A==null||A(5,`检测到 ${ie} 个外部资源,正在转换...`,"import");const ee=[],we=await ll(se,0,(Q,me)=>A==null?void 0:A(5+Q*.1,me,"import"),{count:ie,current:0},ee,{onFailedBehavior:"placeholder",silentFail:!0});ee.length>0&&console.log(`[useProjectIO] 工作流导入: ${ee.length} 个资源不可用,已替换为占位符`),se=we}const oe=(k.connections||[]).map(ee=>({...ee,id:ns(),from:W.get(ee.from)||ee.from,to:W.get(ee.to)||ee.to}));let re=0;if(console.log("[useProjectIO] 工作流数据中的groups字段:",k.groups),console.log("[useProjectIO] groups是否为数组:",Array.isArray(k.groups)),k.groups&&Array.isArray(k.groups)){console.log(`[useProjectIO] 开始处理 ${k.groups.length} 个分组...`);const ee=k.groups.map(pe=>{const we={...pe,id:ns(),nodeIds:pe.nodeIds.map(Q=>W.get(Q)||Q),updatedAt:Date.now()};return console.log(`[useProjectIO] 处理分组: ${pe.name}`,{原始nodeIds:pe.nodeIds,新nodeIds:we.nodeIds}),we});console.log("[useProjectIO] 准备添加分组到state:",ee),C(pe=>{const we=[...pe,...ee];return console.log("[useProjectIO] 更新后的groups state:",we),we}),re=ee.length,console.log(`[useProjectIO] 📦 导入了 ${re} 个分组:`,ee.map(pe=>`${pe.name}(${pe.nodeIds.length}个节点)`).join(", "))}else console.warn("[useProjectIO] ⚠️ 工作流文件不包含有效的分组数据");f(ee=>[...ee,...se]),b(ee=>[...ee,...oe]),k.characterLibrary&&Array.isArray(k.characterLibrary)&&await SC(k.characterLibrary,v),A==null||A(100,"加载完成!","import"),setTimeout(()=>A==null?void 0:A(0,"","import"),100),console.log(`[useProjectIO] ✅ 成功导入 ${se.length} 个节点、${oe.length} 条连接和 ${re} 个分组`)}else console.error("[useProjectIO] ❌ 无效的工作流文件"),A==null||A(0,"","import")}catch(j){console.error("导入工作流失败:",j),console.error("[useProjectIO] ❌ 导入工作流失败,请检查文件格式"),A==null||A(0,"","import")}},Z.click()},[f,b,v,C,A]),J=_.useCallback(async()=>{const Z=u.size>0?Array.from(u):c?[c]:[];if(Z.length===0)return;const B=t.filter(oe=>Z.includes(oe.id)),V=n.filter(oe=>Z.includes(oe.from)&&Z.includes(oe.to));console.log("[useProjectIO] 当前所有分组:",d),console.log("[useProjectIO] 选中的节点ID:",Z);const N=d.filter(oe=>oe.nodeIds.some(re=>Z.includes(re))).map(oe=>({...oe,nodeIds:oe.nodeIds.filter(re=>Z.includes(re))})).filter(oe=>oe.nodeIds.length>0);console.log(`[useProjectIO] 📦 准备导出 ${N.length} 个分组:`,N.map(oe=>`${oe.name}(${oe.nodeIds.length}个节点)`).join(", ")),console.log("[useProjectIO] 分组详细数据:",JSON.stringify(N,null,2)),console.log("正在转换工作流中的图片和视频为本地数据...");const W={type:"workflow",version:"1.0",nodes:await ll(B,0,void 0,void 0,void 0,{preserveOriginalFields:["content","previewMjImages","previewMjVideos","selectedPreviewImage","selectedPreviewVideo","_contentAssetId","_previewMjAssetIds","_selectedImageAssetId"]}),connections:V,groups:N,exportedAt:ld()};console.log("[useProjectIO] 📄 工作流数据:",{节点数:W.nodes.length,连接数:W.connections.length,分组数:W.groups.length,分组详情:W.groups}),R==null||R({visible:!1,x:0,y:0});const M=new Date,se=`工作流_${`${M.getFullYear()}${String(M.getMonth()+1).padStart(2,"0")}${String(M.getDate()).padStart(2,"0")}_${String(M.getHours()).padStart(2,"0")}${String(M.getMinutes()).padStart(2,"0")}`}.json`,ie=tu(W);if("showSaveFilePicker"in window)try{const re=await(await window.showSaveFilePicker({suggestedName:se,types:[{description:"JSON 工作流文件",accept:{"application/json":[".json"]}}]})).createWritable();await re.write(JSON.stringify(ie,null,2)),await re.close(),console.log("[useProjectIO] ✅ 工作流保存成功!所有图片和视频已包含在文件中。")}catch(oe){if(oe.name==="AbortError")return;console.error("保存工作流失败:",oe),console.error("[useProjectIO] ❌ 保存失败: "+(oe.message||"未知错误"))}else{const oe=new Blob([JSON.stringify(ie,null,2)],{type:"application/json"}),re=URL.createObjectURL(oe),ee=document.createElement("a");ee.href=re,ee.download=se,ee.click(),URL.revokeObjectURL(re),console.log("[useProjectIO] ✅ 工作流保存成功!所有图片和视频已包含在文件中。")}},[u,c,t,n,d,R]);return{handleSaveProject:T,handleLoadProject:q,handleImportWorkflow:H,handleSaveSelectedWorkflow:J}};function EC(e,t){return String(e)===String(t)}function cZ({history:e,setHistory:t}){_.useEffect(()=>{const n=Xr.addListener(async(r,i)=>{console.log("[useHistoryAssetSync] 收到资源保存事件:",r);const a=r.split("_")[0];try{const o=await Xr.getAssetUrl(r);if(!o)return;t(l=>{var u;const c=l.find(d=>EC(d.id,a));return c?(console.log("[useHistoryAssetSync] 找到历史记录项:",a,"当前 URL:",(u=c.url)==null?void 0:u.substring(0,50)),l.map(d=>{if(!EC(d.id,a))return d;const h={...d};if(r===a&&d.url&&d.url.startsWith("http")&&(h.url=o,console.log(`[useHistoryAssetSync] ✅ 已更新主 URL: ${a}`)),r===`${a}_audio`&&d.audioUrl&&d.audioUrl.startsWith("http")&&(h.audioUrl=o,console.log(`[useHistoryAssetSync] ✅ 已更新音频 URL: ${a}`)),r.startsWith(`${a}_mj_`)&&d.mjImages){const p=parseInt(r.split("_mj_")[1],10);!isNaN(p)&&d.mjImages[p]&&d.mjImages[p].startsWith("http")&&(h.mjImages=[...d.mjImages],h.mjImages[p]=o,console.log(`[useHistoryAssetSync] ✅ 已更新多图 ${p}: ${a}`))}return r===`${a}_mj_original`&&d.mjOriginalUrl&&d.mjOriginalUrl.startsWith("http")&&(h.mjOriginalUrl=o,console.log(`[useHistoryAssetSync] ✅ 已更新 MJ 原图: ${a}`)),r===`${a}_thumbnail`&&d.thumbnailUrl&&d.thumbnailUrl.startsWith("http")&&(h.thumbnailUrl=o,console.log(`[useHistoryAssetSync] ✅ 已更新缩略图: ${a}`)),h})):(console.log("[useHistoryAssetSync] 未找到对应的历史记录项:",a),l)})}catch(o){console.error("[useHistoryAssetSync] 更新历史记录失败:",o)}});return()=>n()},[t])}const OO="qiaodoumayi_autosave_enabled",LO="qiaodoumayi_autosave_interval_minutes",P2=typeof window<"u"&&"__TAURI__"in window;function O2(e,...t){return[e.replace(/\\/g,"/").replace(/\/+$/,""),...t].join("/").replace(/\/+/g,"/")}function uZ(e){return(e||"未命名项目").replace(/[<>:"/\\|?*]/g,"_").replace(/\s+/g,"_").slice(0,80)||"未命名项目"}function dZ(){return`autosave_${Date.now()}_${Math.random().toString(36).slice(2,10)}`}function IC(e){var r;const t=new Set,n=i=>i&&typeof i=="string"&&t.add(i);for(const i of e){n((r=i.settings)==null?void 0:r._assetId),n(i._contentAssetId),n(i._selectedImageAssetId);const a=i._previewMjAssetIds;a&&a.forEach(n)}return t}function hZ(e){var r;const t={...e};(r=e.settings)!=null&&r._assetId&&typeof t.content=="string"&&t.content.startsWith("blob:")&&(t.content=""),e._contentAssetId&&typeof t.content=="string"&&t.content.startsWith("blob:")&&(t.content="");const n=e._previewMjAssetIds;if(n!=null&&n.length&&Array.isArray(t.previewMjImages)){const i=t.previewMjImages;i.some(a=>typeof a=="string"&&a.startsWith("blob:"))&&(t.previewMjImages=i.map(a=>typeof a=="string"&&a.startsWith("blob:")?"":a))}if(e._selectedImageAssetId){const i=t.selectedPreviewImage;typeof i=="string"&&i.startsWith("blob:")&&(t.selectedPreviewImage="")}return t}async function pZ(e){var l;const t={...e},n=t,r=(l=e.settings)==null?void 0:l._assetId;if(r)try{const c=await Xr.getAssetUrl(r);c&&(n.content=c)}catch{}const i=n._contentAssetId;if(i&&(!n.content||n.content===""))try{const c=await Xr.getAssetUrl(i);c&&(n.content=c)}catch{}const a=n._previewMjAssetIds;if(a!=null&&a.length&&Array.isArray(n.previewMjImages)){const c=[...n.previewMjImages];for(let u=0;uPromise.resolve(null)),C=_.useCallback(async()=>{if(!P2)return b==null||b("自动保存需在桌面应用中运行"),null;await xr.ensureManifestLoaded();const I=xr.getDirectoryPathTauri();if(!I){const j="自动保存失败:请先在本地存储管理中点击「选择缓存目录」或「更换目录」选择资源缓存目录(需在桌面应用中操作)";return console.warn("[useAutoSave]",j),Date.now()-y.current>300*1e3&&(y.current=Date.now(),b==null||b(j)),null}const R=xr.getManifest();if(!R){const j="资源缓存目录未就绪,请刷新页面后重试";return console.warn("[useAutoSave]",j),Date.now()-y.current>300*1e3&&(y.current=Date.now(),b==null||b(j)),null}const A=async j=>{var k;try{const M=await(await fetch(j)).blob(),Y=M.type||j.startsWith("data:")&&((k=j.match(/^data:([^;]+)/))==null?void 0:k[1])||"image/png",se=dZ();return await Xr.saveBlobAsset(se,M,"file://autosave-local","local"),await xr.saveAsset(se,M,Y,"file://autosave-local","local")?se:null}catch(W){return console.warn("[useAutoSave] 保存本地素材失败:",W),null}},O=n.map(async j=>{var Y;const k=j,W=k.content;if(!(!!((Y=k.settings)!=null&&Y._assetId)||k._contentAssetId)&&typeof W=="string"&&(W.startsWith("blob:")||W.startsWith("data:"))){const se=await A(W);if(se){const ie=k.settings||{};return{...j,settings:{...ie,_assetId:se},_contentAssetId:se,content:""}}}return j}),F=await Promise.all(O),L=IC(F);for(const j of L)if(!R.assets[j])try{const k=await Xr.getAssetRecord(j);k!=null&&k.blob&&await xr.saveAsset(j,k.blob,k.mimeType||k.blob.type,k.remoteUrl,k.cacheSubdir)}catch(k){console.warn("[useAutoSave] 保存素材到缓存失败:",j,k)}await xr.flushManifest();const X=xr.getManifest(),T={};for(const j of L){const k=X.assets[j];k!=null&&k.fileName&&(T[j]=O2(I,k.fileName))}const q=F.map(hZ),H={version:1,projectName:o||"未命名项目",nodes:q,connections:r,groups:i,view:a,savedAt:new Date().toISOString(),cacheDir:I,assetIdToLocalPath:T},J=Ew("standard"),B=`${uZ(o)}_${J}.json`,V=O2(I,"autosave"),N=O2(V,B);try{await gx(V,{recursive:!0}),await Bv(N,JSON.stringify(H,null,2));const j=Date.now();return g.current=j,v(new Date(j)),console.log("[useAutoSave] 已保存:",N),f==null||f(),N}catch(j){const k=j instanceof Error?j.message:String(j);return console.error("[useAutoSave] 保存失败:",j),Date.now()-y.current>300*1e3&&(y.current=Date.now(),b==null||b(`保存失败:${k}`)),null}},[n,r,i,a,o,f,b]);z.current=C;const E=_.useCallback(async I=>{if(!P2)return alert("导入自动保存需在 Tauri 桌面应用中运行"),!1;try{I==null||I(5,"打开文件选择器...");const R=await bb({multiple:!1,filters:[{name:"JSON",extensions:["json"]}],title:"选择自动保存的 JSON 文件"});if(!R)return!1;const A=Array.isArray(R)?R[0]:R;if(!A)return!1;I==null||I(15,"正在读取文件...");const O=await EO(A),F=JSON.parse(O);if(!F.nodes||!Array.isArray(F.nodes))throw new Error("无效的自动保存文件:缺少 nodes");const L=F.assetIdToLocalPath||{},X=IC(F.nodes),T=Object.keys(L).filter(J=>X.has(J));I==null||I(20,`正在从本地缓存加载 ${T.length} 个素材...`);let q=0;for(const J of T){const Z=L[J];if(Z){try{const B=await yn("read_file_as_base64",{filePath:Z});if(B&&B.startsWith("data:")){const N=await(await fetch(B)).blob();await Xr.saveBlobAsset(J,N,`file://${Z}`)}}catch(B){console.warn(`[useAutoSave] 加载素材失败 ${J}:`,B)}q++,q%5===0&&(I==null||I(20+Math.floor(q/T.length*50),`已加载 ${q}/${T.length} 个素材`))}}I==null||I(75,"正在恢复工作流...");const H=await Promise.all(F.nodes.map(J=>pZ(J)));return c(H),u(F.connections||[]),d(F.groups||[]),h(F.view||{x:0,y:0,zoom:1}),p&&F.projectName&&p(F.projectName),I==null||I(100,"恢复完成"),!0}catch(R){throw console.error("[useAutoSave] 导入失败:",R),R}},[c,u,d,h,p]);return _.useEffect(()=>{if(!e||!P2||t<1){m.current&&(clearInterval(m.current),m.current=null);return}const I=t*60*1e3,R=15e3,A=()=>{const F=Date.now(),L=g.current;(L===0||F-L>=I)&&z.current()},O=setTimeout(A,3e3);return m.current=setInterval(A,R),()=>{clearTimeout(O),m.current&&(clearInterval(m.current),m.current=null)}},[e,t]),{saveNow:C,importAutoSaveJson:E,lastSaveTime:w}}function mZ(){try{const e=localStorage.getItem(OO),t=localStorage.getItem(LO);return{enabled:e==="true",intervalMinutes:Math.min(60,Math.max(1,parseInt(t||"5",10)||5))}}catch{return{enabled:!1,intervalMinutes:5}}}function gZ(e,t){localStorage.setItem(OO,String(e)),localStorage.setItem(LO,String(Math.min(60,Math.max(1,t))))}function xZ(e={}){const{onFileDrop:t,enabled:n=!0}=e;_.useEffect(()=>{if(!n)return;const r=l=>{l.preventDefault(),l.stopPropagation(),l.dataTransfer&&(l.dataTransfer.dropEffect="copy")},i=l=>{l.preventDefault(),l.stopPropagation()},a=l=>{l.preventDefault(),l.stopPropagation()},o=async l=>{if(l.preventDefault(),l.stopPropagation(),!l.dataTransfer)return;const c=l.dataTransfer.getData("application/json");if(c)try{if(JSON.parse(c).type==="history-item")return}catch{}const u=Array.from(l.dataTransfer.files);u.length!==0&&t&&u.length>0&&t(u,{clientX:l.clientX,clientY:l.clientY})};return document.addEventListener("dragover",r),document.addEventListener("dragenter",i),document.addEventListener("dragleave",a),document.addEventListener("drop",o),()=>{document.removeEventListener("dragover",r),document.removeEventListener("dragenter",i),document.removeEventListener("dragleave",a),document.removeEventListener("drop",o)}},[t,n])}const kC=G5("LocalCache"),L2={INITIAL_DELAY:1e3,MAX_DELAY:3e4,MULTIPLIER:2},bZ=()=>{const[e,t]=_.useState(!1),[n,r]=_.useState({imageSavePath:"",videoSavePath:"",convertPngToJpg:!0,pilAvailable:!1,jpgQuality:95}),[i,a]=_.useState(!1),o=_.useRef(0),l=_.useRef(null),c=_.useRef(null);return _.useEffect(()=>{let u=!0;const d=async()=>{if(u)try{const f=new AbortController,b=setTimeout(()=>f.abort(),2e3),g=await fetch(`${QS.SERVER_URL}/ping`,{method:"GET",signal:f.signal});if(clearTimeout(b),g.ok&&u){const y=await g.json();t(!0),r(w=>({...w,imageSavePath:y.image_save_path||"",videoSavePath:y.video_save_path||"",convertPngToJpg:y.convert_png_to_jpg!==!1,pilAvailable:y.pil_available||!1})),o.current=0,c.current!==!0&&(kC.info("本地缓存服务器已连接"),c.current=!0),p(QS.PING_INTERVAL)}else h()}catch{u&&h()}},h=()=>{if(!u)return;t(!1),o.current++,c.current!==!1&&(kC.info("本地缓存服务器未连接"),c.current=!1);const f=Math.min(L2.INITIAL_DELAY*Math.pow(L2.MULTIPLIER,o.current-1),L2.MAX_DELAY);p(f)},p=f=>{u&&(l.current&&clearTimeout(l.current),l.current=setTimeout(()=>{u&&d()},f))};return p(3e3),()=>{u=!1,l.current&&(clearTimeout(l.current),l.current=null)}},[]),{localCacheServerConnected:e,setLocalCacheServerConnected:t,localServerConfig:n,setLocalServerConfig:r,localCacheSettingsOpen:i,setLocalCacheSettingsOpen:a}},yZ=new Set(["preview","gen-image","gen-video","custom-agent","storyboard-chart-node","video-input","input-image","rh-app","rh-comfy","jimeng-super-resolution","motion-control"]),vZ=(e,t,n,r)=>{const i=-e.x/e.zoom-r,a=-e.y/e.zoom-r,o=(t-e.x)/e.zoom+r,l=(n-e.y)/e.zoom+r;return{worldLeft:i,worldTop:a,worldRight:o,worldBottom:l}},wZ=(e,t,n,r,i,a)=>{const o=e-n,l=t-r,c=Math.sqrt(o*o+l*l);return c<=i?"high":c<=a?"medium":"low"},_Z=(e,t)=>{const n=dP();return Math.min(t,n)},zZ=({nodes:e,view:t,viewportWidth:n,viewportHeight:r,overscan:i,forceIncludeNodeIds:a=new Set,isPanning:o=!1})=>{const l=_.useRef(null);return _.useMemo(()=>{const c=kH(),u=dP(),d=i!==void 0?i:u,h=_Z(e.length,d),p=t.zoom<=c,f=p?h*2:h,{worldLeft:b,worldTop:g,worldRight:y,worldBottom:w}=vZ(t,n,r,f),v=(b+y)/2,m=(g+w)/2,z=Math.sqrt(Math.pow(y-b,2)+Math.pow(w-g,2)),E=uP()==="speed-first";let I,R;o?(I=.08,R=.2):(I=E?.15:.25,R=E?.35:.5);const A=z*I,O=z*R,F=[],L=new Set,X=new Map,T=a instanceof Set?a:new Set(a),q=e.length;for(let J=0;JJ[0].localeCompare(Z[0])).map(([J,Z])=>`${J}:${Z}`).join(",");return l.current&&l.current.signature===H?{visibleNodes:F,visibleNodeIds:L,nodeQualityMap:l.current.nodeQualityMap,isTinyZoom:p}:(l.current={nodeQualityMap:X,signature:H},{visibleNodes:F,visibleNodeIds:L,nodeQualityMap:X,isTinyZoom:p})},[e,t.x,t.y,t.zoom,n,r,i,a,o])},B2=G5("ImageOptimizer"),$1={SMALL_THRESHOLD:500*1024,MEDIUM_THRESHOLD:2*1024*1024,LARGE_THRESHOLD:5*1024*1024,ULTRA_THRESHOLD:10*1024*1024};function $Z(e){const t=e.length*.75;return t<$1.SMALL_THRESHOLD?"small":t<$1.MEDIUM_THRESHOLD?"medium":t<$1.LARGE_THRESHOLD?"large":t<$1.ULTRA_THRESHOLD?"4k":"8k"}async function SZ(e,t){const n=e.filter(i=>$Z(i.dataUrl)!=="small"&&i.dataUrl.startsWith("data:image"));if(n.length===0)return;B2.debug(`Batch preloading ${n.length} thumbnails...`);const r=3;for(let i=0;izi.storeWithThumbnails(o.nodeId,o.dataUrl).catch(l=>B2.warn(`Failed to generate thumbnail for ${o.nodeId}:`,l)))),await new Promise(o=>setTimeout(o,50))}B2.debug("Batch preload completed")}function jZ({nodes:e,view:t,isInteracting:n,canvasWidth:r,canvasHeight:i}){const a=_.useRef(t.zoom),o=_.useRef(),l=_.useCallback(()=>{const d=-t.x/t.zoom,h=-t.y/t.zoom,p=d+r/t.zoom,f=h+i/t.zoom,b=200;return e.filter(g=>{const y=g.x+g.width,w=g.y+g.height;return!(g.x>p+b||yf+b||w{const h=l().filter(f=>f.type==="input-image"&&f.content&&f.content.startsWith("data:image"));if(h.length===0)return;const p=h.map(f=>({nodeId:f.id,dataUrl:f.content}));SZ(p).catch(f=>{console.warn("Failed to preload thumbnails:",f)})},[l]);return _.useEffect(()=>(Math.abs(t.zoom-a.current)>.1&&!n&&(a.current=t.zoom,o.current&&clearTimeout(o.current),o.current=window.setTimeout(()=>{c()},500)),()=>{o.current&&clearTimeout(o.current)}),[t.zoom,n,c]),_.useEffect(()=>{const d=setTimeout(()=>{c()},1e3);return()=>clearTimeout(d)},[]),{renderQuality:_.useCallback(()=>n||t.zoom<.3?"low":t.zoom<.8?"medium":"high",[t.zoom,n])(),visibleNodes:l(),preloadVisibleThumbnails:c}}function CZ(){const[e,t]=_.useState({visible:!1,x:0,y:0}),[n,r]=_.useState({visible:!1,x:0,y:0,nodeId:null,frame:null}),[i,a]=_.useState({visible:!1,x:0,y:0,worldX:0,worldY:0,item:null}),[o,l]=_.useState({visible:!1,x:0,y:0}),[c,u]=_.useState({visible:!1,x:0,y:0,item:null}),[d,h]=_.useState({visible:!1,x:0,y:0,nodeId:null}),[p,f]=_.useState(null),b=_.useCallback(()=>{t({visible:!1,x:0,y:0}),r({visible:!1,x:0,y:0,nodeId:null,frame:null}),a({visible:!1,x:0,y:0,worldX:0,worldY:0,item:null}),l({visible:!1,x:0,y:0}),u({visible:!1,x:0,y:0,item:null}),h({visible:!1,x:0,y:0,nodeId:null})},[]);return{contextMenu:e,frameContextMenu:n,historyContextMenu:i,selectionContextMenu:o,previewContextMenu:c,inputImageContextMenu:d,setContextMenu:t,setFrameContextMenu:r,setHistoryContextMenu:a,setSelectionContextMenu:l,setPreviewContextMenu:u,setInputImageContextMenu:h,croppingNodeId:p,setCroppingNodeId:f,closeAllMenus:b}}function NZ(){const[e,t]=_.useState(null),[n,r]=_.useState(!1),[i,a]=_.useState(!1),[o,l]=_.useState(!1),[c,u]=_.useState(!1),[d,h]=_.useState(!1),[p,f]=_.useState(!1),[b,g]=_.useState(!1),[y,w]=_.useState(!1),[v,m]=_.useState(!1),z=_.useCallback(I=>{t(I),r(!0)},[]),C=_.useCallback(()=>{r(!1),setTimeout(()=>t(null),300)},[]),E=_.useCallback(()=>{r(!1),a(!1),l(!1),u(!1),h(!1),f(!1),g(!1),w(!1),m(!1)},[]);return{lightboxItem:e,lightboxOpen:n,setLightboxItem:t,setLightboxOpen:r,openLightbox:z,closeLightbox:C,settingsOpen:i,setSettingsOpen:a,storageManageOpen:o,setStorageManageOpen:l,historyOpen:c,setHistoryOpen:u,promptLibraryEditorOpen:d,setPromptLibraryEditorOpen:h,createCharacterOpen:p,setCreateCharacterOpen:f,batchManageOpen:b,setBatchManageOpen:g,skillToWorkflowOpen:y,setSkillToWorkflowOpen:w,localCacheSettingsOpen:v,setLocalCacheSettingsOpen:m,closeAllModals:E}}let EZ=class{constructor(){Mn(this,"_cancelled",!1)}cancel(){this._cancelled=!0}get isCancelled(){return this._cancelled}throwIfCancelled(){if(this._cancelled)throw new Error("操作已取消")}};function IZ(){const[e,t]=_.useState(!1),[n,r]=_.useState({current:0,total:0}),i=_.useRef(null),a=_.useCallback(()=>{i.current&&(i.current.cancel(),console.log("[useDownload] 用户取消下载"))},[]),o=_.useCallback(async(p,f,b)=>{t(!0),r({current:0,total:1});try{let g;if(p.startsWith("blob:")&&b==="image"){const{getFullBlobForDisplayUrl:v}=await mn(async()=>{const{getFullBlobForDisplayUrl:z}=await Promise.resolve().then(()=>Do);return{getFullBlobForDisplayUrl:z}},void 0,import.meta.url),m=await v(p);m?g=m:g=await(await fetch(p)).blob()}else p.startsWith("data:")?g=await(await fetch(p)).blob():p.startsWith("blob:")?g=await(await fetch(p)).blob():g=await(await fetch(p)).blob();const y=URL.createObjectURL(g),w=document.createElement("a");w.href=y,w.download=f,document.body.appendChild(w),w.click(),document.body.removeChild(w),URL.revokeObjectURL(y),r({current:1,total:1})}catch(g){console.error(`下载失败: ${f}`,g),alert(`下载失败: ${g instanceof Error?g.message:"未知错误"}`)}finally{t(!1),r({current:0,total:0})}},[]),l=_.useCallback((p=0)=>{const f=new EZ;i.current=f,t(!0),r({current:0,total:p})},[]),c=_.useCallback((p,f)=>{r(b=>({current:p,total:f??b.total}))},[]),u=_.useCallback(()=>{t(!1),r({current:0,total:0}),i.current=null},[]),d=_.useCallback(()=>{t(!1),r({current:0,total:0}),i.current=null},[]),h=_.useCallback(()=>i.current,[]);return{isDownloading:e,downloadProgress:n,setIsDownloading:t,setDownloadProgress:r,handleDownloadFile:o,startDownload:l,updateDownloadProgress:c,finishDownload:u,resetDownload:d,cancelDownload:a,getCancellationToken:h}}const Bh="https://www.runninghub.cn",Uh="https://www.runninghub.ai";async function kZ(e){const{apiKey:t,webappId:n,useOverseas:r=!1}=e,a=`${r?Uh:Bh}/api/webapp/apiCallDemo?apiKey=${encodeURIComponent(t)}&webappId=${encodeURIComponent(n)}`,o=await fetch(a,{method:"GET",headers:{Host:r?"www.runninghub.ai":"www.runninghub.cn",Accept:"application/json"}});if(!o.ok)throw new Error(`请求失败: ${o.status} ${o.statusText}`);return await o.json()}async function BO(e){var u;const{apiKey:t,file:n,useOverseas:r=!1}=e,i=r?Uh:Bh,a=new FormData;a.append("file",n);const o=await fetch(`${i}/openapi/v2/media/upload/binary`,{method:"POST",headers:{Authorization:`Bearer ${t}`},body:a});if(!o.ok)throw new Error(`上传失败: ${o.status} ${o.statusText}`);const l=await o.json();if(l.code!==0)throw new Error(l.msg||"上传失败");if(!((u=l.data)!=null&&u.fileName))throw new Error("上传返回格式异常,缺少 fileName");return{fileName:l.data.fileName,previewUrl:l.data.download_url}}async function UO(e){var u;const{apiKey:t,file:n,useOverseas:r=!1}=e,i=r?Uh:Bh,a=r?"www.runninghub.ai":"www.runninghub.cn",o=new FormData;o.append("apiKey",t),o.append("fileType","input"),o.append("file",n);const l=await fetch(`${i}/task/openapi/upload`,{method:"POST",headers:{Host:a},body:o});if(!l.ok)throw new Error(`上传失败: ${l.status} ${l.statusText}`);const c=await l.json();if(c.code!==0)throw new Error(c.msg||"上传失败");if(!((u=c.data)!=null&&u.fileName))throw new Error("上传返回格式异常");return{fileName:c.data.fileName,previewUrl:c.data.download_url}}async function FO(e){try{return(await BO(e)).fileName}catch(t){try{return(await UO(e)).fileName}catch{throw t}}}async function WO(e){try{return await BO(e)}catch(t){try{return await UO(e)}catch{throw t}}}async function AZ(e){var d;const{apiKey:t,webappId:n,nodeInfoList:r,useOverseas:i=!1,instanceType:a}=e,o=i?Uh:Bh,l=i?"www.runninghub.ai":"www.runninghub.cn",c=await fetch(`${o}/task/openapi/ai-app/run`,{method:"POST",headers:{Host:l,"Content-Type":"application/json"},body:JSON.stringify({apiKey:t,webappId:n,nodeInfoList:r,...a?{instanceType:a}:{}})});if(!c.ok)throw new Error(`提交任务失败: ${c.status} ${c.statusText}`);const u=await c.json();if(u.code!==0)throw new Error(u.msg||"提交任务失败");if(!((d=u.data)!=null&&d.taskId))throw new Error("返回格式异常,缺少 taskId");return{taskId:String(u.data.taskId),promptTips:u.data.promptTips}}async function DO(e){const{apiKey:t,taskId:n,useOverseas:r=!1}=e,i=r?Uh:Bh,a=r?"www.runninghub.ai":"www.runninghub.cn",o=await fetch(`${i}/task/openapi/outputs`,{method:"POST",headers:{Host:a,"Content-Type":"application/json"},body:JSON.stringify({apiKey:t,taskId:n})});if(!o.ok)throw new Error(`查询失败: ${o.status} ${o.statusText}`);return o.json()}async function MZ(e){const{apiKey:t,workflowId:n,useOverseas:r=!1}=e,i=r?Uh:Bh,a=r?"www.runninghub.ai":"www.runninghub.cn",o=await fetch(`${i}/api/openapi/getJsonApiFormat`,{method:"POST",headers:{Host:a,"Content-Type":"application/json"},body:JSON.stringify({apiKey:t,workflowId:n})});if(!o.ok)throw new Error(`请求失败: ${o.status} ${o.statusText}`);return o.json()}async function TZ(e){var g;const{apiKey:t,workflowId:n,nodeInfoList:r,workflow:i,addMetadata:a=!0,webhookUrl:o,instanceType:l,usePersonalQueue:c=!1,useOverseas:u=!1}=e,d=u?Uh:Bh,h=u?"www.runninghub.ai":"www.runninghub.cn",p={apiKey:t,workflowId:n,addMetadata:a};r&&r.length>0&&(p.nodeInfoList=r),i&&(p.workflow=i),o&&(p.webhookUrl=o),l&&(p.instanceType=l),c&&(p.usePersonalQueue=c);const f=await fetch(`${d}/task/openapi/create`,{method:"POST",headers:{Host:h,"Content-Type":"application/json"},body:JSON.stringify(p)});if(!f.ok)throw new Error(`提交任务失败: ${f.status} ${f.statusText}`);const b=await f.json();if(b.code!==0)throw new Error(b.msg||"提交任务失败");if(!((g=b.data)!=null&&g.taskId))throw new Error("返回格式异常,缺少 taskId");return{taskId:String(b.data.taskId),promptTips:b.data.promptTips}}async function RZ(e){const{apiKey:t,taskId:n,useOverseas:r=!1}=e,i=r?Uh:Bh,a=r?"www.runninghub.ai":"www.runninghub.cn",o=await fetch(`${i}/task/openapi/cancel`,{method:"POST",headers:{Host:a,"Content-Type":"application/json"},body:JSON.stringify({apiKey:t,taskId:n})});if(!o.ok)throw new Error(`取消任务失败: ${o.status} ${o.statusText}`);return o.json()}async function VO(e){const{apiKey:t,taskId:n,useOverseas:r=!1,pollInterval:i=5e3,timeout:a=27e5,onProgress:o,signal:l}=e,c=Date.now();for(;;){if(l!=null&&l.aborted)return{success:!1,error:"已取消"};const u=await DO({apiKey:t,taskId:n,useOverseas:r});if(u.code===0&&u.data&&Array.isArray(u.data)&&u.data.length>0){const d=u.data,h=d.map(f=>f.fileUrl).filter(Boolean),p=d.filter(f=>f.fileUrl).map(f=>({fileUrl:f.fileUrl,fileType:f.fileType}));return{success:!0,fileUrls:h,outputItems:p}}if(u.code===805){const d=u.failedReason;return{success:!1,error:(d==null?void 0:d.exception_message)||u.msg||"任务失败"}}if(u.code===804?o==null||o("running"):u.code===813&&(o==null||o("queued")),Date.now()-c>a)return{success:!1,error:"等待超时"};await new Promise(d=>setTimeout(d,i))}}const ri={THEME:"qiaodoumayi_theme",PERFORMANCE_MODE:"qiaodoumayi_performance_mode",HISTORY:"qiaodoumayi_history",CHARACTERS:"qiaodoumayi_characters",KLING_SUBJECTS:"qiaodoumayi_kling_subjects",SEEDANCE_ROLES:"qiaodoumayi_seedance_roles",PROJECT_NAME:"qiaodoumayi_project_name",PROMPT_LIBRARY:"qiaodoumayi_prompt_library",JIMENG_SESSION_ID:"qiaodoumayi_jimeng_session_id",JIMENG_USE_LOCAL_FILE:"qiaodoumayi_jimeng_use_local_file",RH_API_KEY:"qiaodoumayi_rh_api_key",RH_APP_LIBRARY:"qiaodoumayi_rh_app_library",SHOW_CANVAS_GRID:"qiaodoumayi_show_canvas_grid",SHOW_CANVAS_SNAP:"qiaodoumayi_show_canvas_snap",SHOW_CANVAS_MINIMAP:"qiaodoumayi_show_canvas_minimap",POSE_LIBRARY_PANEL:"qiaodoumayi_pose_library_panel",LEFT_TOOLBAR_COLLAPSED:"qiaodoumayi_left_toolbar_collapsed",RIGHT_TOOLBAR_COLLAPSED:"qiaodoumayi_right_toolbar_collapsed",CANVAS_BG_COLOR_LIGHT:"qiaodoumayi_canvas_bg_color_light",CANVAS_BG_COLOR_DARK:"qiaodoumayi_canvas_bg_color_dark"},PZ=Object.freeze(Object.defineProperty({__proto__:null,STORAGE_KEYS:ri},Symbol.toStringTag,{value:"Module"}));function OZ({apiConfigs:e,globalApiKey:t,setHistory:n,setNodes:r,connections:i}){const a=p=>String(p||"").replace(/^\/+/,"").split("/").map(f=>encodeURIComponent(f)).join("/"),o=_.useCallback(p=>{const f=p.targetPreviewId;if(f)try{window.dispatchEvent(new CustomEvent("previewGenerateFailed",{detail:{previewNodeId:f}}))}catch{}},[]),l=_.useCallback(async p=>{var w,v,m,z,C,E,I,R,A,O,F,L,X;if(!p.remoteTaskId){alert(`无法刷新:缺少任务ID(remoteTaskId) + +该历史记录可能是旧版本生成的,请重新生成视频。`);return}const f=((w=p.apiConfig)==null?void 0:w.modelId)||p.modelName||"sora-2",b=e.find(T=>T.id===f||T.provider===p.modelName),g=((v=p.apiConfig)==null?void 0:v.apiKey)||(b==null?void 0:b.key)||t,y=(((m=p.apiConfig)==null?void 0:m.baseUrl)||(b==null?void 0:b.url)||jy).replace(/\/+$/,"");if(!g){alert("无法刷新:缺少API Key");return}n(T=>T.map(q=>q.id===p.id?{...q,status:"generating",progress:0}:q));try{let T;gm(f)?(T=`${y}/mj/mj/task/${encodeURIComponent(p.remoteTaskId)}/fetch`,console.log("[RefreshVideo] MJ Video 查询 URL:",T)):No(f)?T=`${y}/kling/v1/videos/omni-video/${encodeURIComponent(p.remoteTaskId)}`:p.klingTaskType==="motion-control"?T=`${y}/kling/v1/videos/motion-control/${encodeURIComponent(p.remoteTaskId)}`:fu(f)||zc(f)||Wo(f)?T=`${y}/kling/v1/videos/text2video/${encodeURIComponent(p.remoteTaskId)}`:wc(f)?T=`${y}/v1beta/${a(p.remoteTaskId)}`:dl(f)||hl(f)?T=`${y}/v2/videos/generations/${encodeURIComponent(p.remoteTaskId)}`:pl(f)?T=`${y}${$x(f)}/${encodeURIComponent(p.remoteTaskId)}`:au(f)?(T=`${y}/v2/videos/generations/${encodeURIComponent(p.remoteTaskId)}`,console.log("[RefreshVideo] Wan 2.6 查询 URL:",T)):Qd(f)?T=`${y}/minimax/v1/query/video_generation?task_id=${encodeURIComponent(p.remoteTaskId)}`:ru(f)?T=`${y}/vidu/v2/tasks/${encodeURIComponent(p.remoteTaskId)}/creations`:T=`${y}/v1/videos/${encodeURIComponent(p.remoteTaskId)}`;const q=wc(f)||T.includes("generativelanguage.googleapis.com"),H=ru(f)?"Token":"Bearer",Z=wc(f)&&T.includes("generativelanguage.googleapis.com")?{"x-goog-api-key":g}:{Authorization:`${H} ${g}`},B=ru(f)||q?await Pl(T,{headers:Z}):await fetch(T,{headers:Z}),V=await B.text();if(!B.ok)throw console.error("[RefreshVideo] HTTP错误:",B.status,V.slice(0,500)),new Error(`HTTP ${B.status}: ${V.slice(0,200)}`);const N=V.trim().toLowerCase();if(N.startsWith("ge.map(ne=>ne.id===p.id?{...ne,status:"failed",errorMsg:"无法解析响应数据格式"}:ne));return}const U=String(ue.task_status||"").toLowerCase(),G=ue.task_result,te=G==null?void 0:G.videos;if(U==="succeed"||U==="success")if(te&&te.length>0&&te[0].url){const ge=te[0].url,ne=Date.now(),le=p.startTime||ne,be=((ne-le)/1e3).toFixed(1),de=new CustomEvent("klingO1VideoComplete",{detail:{taskId:p.id,videoUrl:ge,generationTime:be+"s"}});window.dispatchEvent(de),n(ze=>ze.map(Ee=>Ee.id===p.id?{...Ee,status:"completed",url:ge,progress:100,generationTime:be+"s"}:Ee));let $e=p.sourceNodeId;if($e){r(_e=>_e.map(Ce=>Ce.id===$e?{...Ce,isGenerating:!1}:Ce));const ze=i.filter(_e=>_e.from===$e).map(_e=>_e.to);ze.length>0&&r(_e=>_e.map(Ce=>{var xe;if(ze.includes(Ce.id)&&Ce.type==="preview"){const Ne={...Ce,content:ge,previewType:"video"},ve=(xe=p.apiConfig)==null?void 0:xe.modelId;return ve&&(Ne.settings={...Ce.settings||{},previewSourceModel:ve}),Ne}return Ce}))}uo({url:ge,type:"video"},p.id);return}else{const ge="未返回视频URL";console.error("[RefreshVideo] Kling O1 错误:",ge),console.error("[RefreshVideo] Kling O1 videos:",te),o(p),n(ne=>ne.map(le=>le.id===p.id?{...le,status:"failed",errorMsg:ge}:le));return}else if(U==="failed"||U==="failure"||U==="error"){const ge=String((ue==null?void 0:ue.task_status_msg)||(ue==null?void 0:ue.message)||"生成失败");console.error("[RefreshVideo] Kling O1 生成失败:",ge),o(p),n(ne=>ne.map(le=>le.id===p.id?{...le,status:"failed",errorMsg:ge}:le));return}else if(U==="processing"||U==="submitted"){console.log("[RefreshVideo] Kling O1 任务进行中, 状态:",U),n(ge=>ge.map(ne=>ne.id===p.id?{...ne,status:"generating",progress:50}:ne));return}else console.warn("[RefreshVideo] Kling O1 未知状态:",U),console.warn("[RefreshVideo] Kling O1 将继续执行通用逻辑")}if(gm(f)){console.log("[RefreshVideo] MJ Video rawData:",JSON.stringify(j));const ue=String(j.status||"").toUpperCase(),U=j.progress?parseInt(String(j.progress).replace("%","")):0;let G=[];if(j.videoUrls&&Array.isArray(j.videoUrls)?G=j.videoUrls.map(te=>typeof te=="string"?te:te==null?void 0:te.url).filter(Boolean):j.videos&&Array.isArray(j.videos)?G=j.videos.map(te=>typeof te=="string"?te:te==null?void 0:te.url).filter(Boolean):j.videoUrl?G=[typeof j.videoUrl=="string"?j.videoUrl:(z=j.videoUrl)==null?void 0:z.url].filter(Boolean):j.imageUrl&&typeof j.imageUrl=="string"&&j.imageUrl.includes(".mp4")&&(G=[j.imageUrl]),console.log("[RefreshVideo] MJ Video 解析结果:",{mjStatus:ue,mjProgress:U,videoUrls:G.length,firstUrl:(C=G[0])==null?void 0:C.substring(0,50)}),ue==="SUCCESS"||ue==="COMPLETED"||ue==="FINISHED")if(G.length>0){const te=G[0];console.log("[RefreshVideo] MJ Video 完成,视频数量:",G.length);const ge=Date.now(),ne=p.startTime||ge,le=((ge-ne)/1e3).toFixed(1);n(be=>be.map(de=>de.id===p.id?{...de,status:"completed",url:te,progress:100,generationTime:le+"s",mjImages:G.length>1?G:void 0,_assetId:p.id,_mjAssetIds:G.length>1?G.map(($e,ze)=>`${p.id}_mj_${ze}`):void 0}:de));const fe=p.sourceNodeId;if(fe){r(de=>de.map($e=>$e.id===fe?{...$e,isGenerating:!1}:$e));const be=i.filter(de=>de.from===fe).map(de=>de.to);be.length>0&&r(de=>de.map($e=>be.includes($e.id)&&$e.type==="preview"?{...$e,content:te,previewType:"video",settings:G.length>1?{...$e.settings,previewMjVideos:G}:$e.settings}:$e))}uo({url:te,type:"video",mjImages:G.length>1?G:void 0},p.id);return}else{n(te=>te.map(ge=>ge.id===p.id?{...ge,status:"failed",errorMsg:"未返回视频URL"}:ge));return}else if(ue==="FAILED"||ue==="FAILURE"||ue==="ERROR"){const te=j.failReason||j.fail_reason||j.message||"生成失败";console.error("[RefreshVideo] MJ Video 生成失败:",te),n(ge=>ge.map(ne=>ne.id===p.id?{...ne,status:"failed",errorMsg:String(te)}:ne));return}else{console.log("[RefreshVideo] MJ Video 任务进行中, 状态:",ue,"进度:",U),n(te=>te.map(ge=>ge.id===p.id?{...ge,status:"generating",progress:U||50}:ge));return}}if(pl(f)){const ue=F5(j);if(ue.terminal==="success"&&ue.videoUrl){const U=ue.videoUrl;n(te=>te.map(ge=>ge.id===p.id?{...ge,status:"completed",url:U,progress:100}:ge));const G=p.sourceNodeId;if(G){r(ge=>ge.map(ne=>ne.id===G?{...ne,isGenerating:!1}:ne));const te=i.filter(ge=>ge.from===G).map(ge=>ge.to);te.length>0&&r(ge=>ge.map(ne=>te.includes(ne.id)&&ne.type==="preview"?{...ne,content:U,previewType:"video"}:ne))}uo({url:U,type:"video"},p.id);return}if(ue.terminal==="failed"){n(U=>U.map(G=>G.id===p.id?{...G,status:"failed",errorMsg:String(ue.errorMsg||"生成失败")}:G));return}}if(fu(f)||zc(f)||Wo(f)){let ue;if(j.task_status)ue=j;else if(j.data&&typeof j.data=="object"){const ge=j.data;ge.task_status?ue=ge:ge.data&&typeof ge.data=="object"&&(ue=ge.data)}if(!ue){console.error("[RefreshVideo] Kling v2.5 Turbo 无法识别数据格式"),n(ge=>ge.map(ne=>ne.id===p.id?{...ne,status:"failed",errorMsg:"无法解析响应数据格式"}:ne));return}const U=String(ue.task_status||"").toLowerCase(),G=ue.task_result,te=G==null?void 0:G.videos;if(U==="succeed"||U==="success")if(te&&te.length>0&&te[0].url){const ge=te[0].url,ne=Date.now(),le=p.startTime||ne,fe=((ne-le)/1e3).toFixed(1);n(de=>de.map($e=>$e.id===p.id?{...$e,status:"completed",url:ge,progress:100,generationTime:fe+"s"}:$e));const be=p.sourceNodeId;if(be){r($e=>$e.map(ze=>ze.id===be?{...ze,isGenerating:!1}:ze));const de=i.filter($e=>$e.from===be).map($e=>$e.to);de.length>0&&r($e=>$e.map(ze=>de.includes(ze.id)&&ze.type==="preview"?{...ze,content:ge,previewType:"video"}:ze))}uo({url:ge,type:"video"},p.id);return}else{console.error("[RefreshVideo] Kling v2.5 Turbo 未返回视频URL"),n(ge=>ge.map(ne=>ne.id===p.id?{...ne,status:"failed",errorMsg:"未返回视频URL"}:ne));return}else if(U==="failed"||U==="failure"||U==="error"){const ge=String((ue==null?void 0:ue.task_status_msg)||(ue==null?void 0:ue.message)||"生成失败");console.error("[RefreshVideo] Kling v2.5 Turbo 生成失败:",ge),n(ne=>ne.map(le=>le.id===p.id?{...le,status:"failed",errorMsg:ge}:le));return}else if(U==="processing"||U==="submitted"){n(ge=>ge.map(ne=>ne.id===p.id?{...ne,status:"generating",progress:50}:ne));return}}let k=j;if(j.data&&typeof j.data=="object"&&!j.status?(console.log("[RefreshVideo] 检测到包装格式,尝试解包"),k=j.data):j.result&&typeof j.result=="object"&&(console.log("[RefreshVideo] 检测到result包装格式,尝试解包"),k=j.result),console.log("[RefreshVideo] Model:",f),console.log("[RefreshVideo] After unwrap (stringified):",JSON.stringify(k)),console.log("[RefreshVideo] After unwrap (keys):",Object.keys(k)),console.log("[RefreshVideo] ========== 字段检查 =========="),console.log("[RefreshVideo] data.status:",k.status,"(type:",typeof k.status,")"),console.log("[RefreshVideo] data.data:",k.data,"(type:",typeof k.data,")"),console.log("[RefreshVideo] data.output:",k.output,"(type:",typeof k.output,")"),console.log("[RefreshVideo] data.data?.output:",(E=k.data)==null?void 0:E.output),console.log("[RefreshVideo] data.fail_reason:",k.fail_reason),console.log("[RefreshVideo] data.progress:",k.progress),console.log("[RefreshVideo] data.task_id:",k.task_id),console.log("[RefreshVideo] data.platform:",k.platform),console.log("[RefreshVideo] ========== 完整响应结束 =========="),Qd(f)){const ue=k.base_resp;if(ue&&ue.status_code!==0){const G=String(ue.status_msg??"Hailuo query failed");n(te=>te.map(ge=>ge.id===p.id?{...ge,status:"failed",errorMsg:G}:ge));return}const U=String(k.status??"").toLowerCase();if(U==="success"){const G=k.file_id;if(!G){n(fe=>fe.map(be=>be.id===p.id?{...be,status:"failed",errorMsg:"未返回file_id"}:be));return}console.log("[RefreshVideo] Hailuo file_id:",G);const te=`${y}/minimax/v1/files/retrieve?file_id=${encodeURIComponent(String(G))}`,ge=await fetch(te,{headers:{Authorization:`Bearer ${g}`}});if(!ge.ok)throw new Error(`获取下载链接失败: HTTP ${ge.status}`);const ne=await ge.json();if(console.log("[RefreshVideo] Hailuo download data:",ne),((I=ne.base_resp)==null?void 0:I.status_code)!==0){const fe=((R=ne.base_resp)==null?void 0:R.status_msg)||"获取下载链接失败";n(be=>be.map(de=>de.id===p.id?{...de,status:"failed",errorMsg:fe}:de));return}const le=(A=ne.file)==null?void 0:A.download_url;if(le){console.log("[RefreshVideo] Hailuo 视频链接获取成功:",le),n(be=>be.map(de=>de.id===p.id?{...de,status:"completed",url:le,progress:100}:de));let fe=p.sourceNodeId;if(fe||(console.log("[RefreshVideo] No sourceNodeId, searching by history id:",p.id),r(be=>{const de=be.find($e=>$e.content===p.url||$e.settings&&"videoUrl"in $e.settings&&$e.settings.videoUrl===p.url);return de&&(fe=de.id,console.log("[RefreshVideo] Found source node:",fe)),be})),fe){const be=i.filter(de=>de.from===fe).map(de=>de.to);console.log("[RefreshVideo] Source node:",fe,"Connected previews:",be),be.length>0?(console.log("[RefreshVideo] Updating connected preview nodes:",be),r(de=>de.map($e=>be.includes($e.id)&&$e.type==="preview"?(console.log("[RefreshVideo] Updating preview node:",$e.id,"with URL:",le.substring(0,50)),{...$e,content:le,previewType:"video"}):$e))):console.warn("[RefreshVideo] No connected preview nodes found for source:",fe)}else console.warn("[RefreshVideo] Could not find source node for history item:",p.id);uo({url:le,type:"video"},p.id)}else n(fe=>fe.map(be=>be.id===p.id?{...be,status:"failed",errorMsg:"未返回download_url"}:be))}else if(U==="failed"){const G=String(k.error??"生成失败");n(te=>te.map(ge=>ge.id===p.id?{...ge,status:"failed",errorMsg:G}:ge))}else{const G=k.progress??0,te=typeof G=="number"?G:parseInt(String(G),10)||0;n(ge=>ge.map(ne=>ne.id===p.id?{...ne,status:"generating",progress:te}:ne))}return}if(au(f)){console.log("[RefreshVideo] Wan 2.6 开始处理"),console.log("[RefreshVideo] Wan 2.6 rawData:",JSON.stringify(j)),console.log("[RefreshVideo] Wan 2.6 data:",JSON.stringify(k));let ue="",U=null,G=null,te=0;if(j.status){ue=String(j.status).toUpperCase();const ge=(O=j.data)==null?void 0:O.output;if(U=typeof ge=="string"?ge:null,G=j.fail_reason!=null?String(j.fail_reason):null,j.progress){const ne=String(j.progress).replace("%","");te=parseInt(ne,10)||0}console.log("[RefreshVideo] Wan 2.6 使用方案1(rawData):",{wanStatus:ue,videoUrl:U==null?void 0:U.substring(0,50),errorMsg:G,progressValue:te})}else if(k.status){ue=String(k.status).toUpperCase();const ge=(F=k.data)==null?void 0:F.output;if(U=typeof ge=="string"?ge:null,G=k.fail_reason!=null?String(k.fail_reason):null,k.progress){const ne=String(k.progress).replace("%","");te=parseInt(ne,10)||0}console.log("[RefreshVideo] Wan 2.6 使用方案2(data):",{wanStatus:ue,videoUrl:U==null?void 0:U.substring(0,50),errorMsg:G,progressValue:te})}else if(j.output&&typeof j.output=="object"){const ge=j.output;ue=String(ge.task_status||"").toUpperCase(),U=String(ge.video_url||""),G=String(ge.message||""),console.log("[RefreshVideo] Wan 2.6 使用方案3(标准格式):",{wanStatus:ue,videoUrl:U==null?void 0:U.substring(0,50),errorMsg:G})}else if(k.output&&typeof k.output=="object"){const ge=k.output;ue=String(ge.task_status||"").toUpperCase(),U=String(ge.video_url||""),G=String(ge.message||""),console.log("[RefreshVideo] Wan 2.6 使用方案4(data.output):",{wanStatus:ue,videoUrl:U==null?void 0:U.substring(0,50),errorMsg:G})}if(ue||(ue=String(j.task_status||k.task_status||j.state||k.state||"").toUpperCase(),console.log("[RefreshVideo] Wan 2.6 fallback状态:",ue)),!U){const ge=j.video_url??k.video_url??j.url??k.url??j.output??k.output??null;U=typeof ge=="string"?ge:null,U&&U.startsWith("http")?console.log("[RefreshVideo] Wan 2.6 fallback视频URL:",U.substring(0,50)):U=null}if(console.log("[RefreshVideo] Wan 2.6 最终提取结果:",{wanStatus:ue,hasVideoUrl:!!U,videoUrlPreview:U==null?void 0:U.substring(0,50),errorMsg:G,progressValue:te}),ue==="SUCCESS"||ue==="SUCCEEDED")if(U){console.log("[RefreshVideo] Wan 2.6 视频链接获取成功:",U),n(ne=>ne.map(le=>le.id===p.id?{...le,status:"completed",url:U,progress:100}:le));let ge=p.sourceNodeId;if(ge||(console.log("[RefreshVideo] No sourceNodeId, searching by history id:",p.id),r(ne=>{const le=ne.find(fe=>fe.content===p.url||fe.settings&&"videoUrl"in fe.settings&&fe.settings.videoUrl===p.url);return le&&(ge=le.id,console.log("[RefreshVideo] Found source node:",ge)),ne})),ge){const ne=i.filter(le=>le.from===ge).map(le=>le.to);console.log("[RefreshVideo] Source node:",ge,"Connected previews:",ne),ne.length>0&&(console.log("[RefreshVideo] Updating connected preview nodes:",ne),r(le=>le.map(fe=>ne.includes(fe.id)&&fe.type==="preview"?(console.log("[RefreshVideo] Updating preview node:",fe.id,"with URL:",U.substring(0,50)),{...fe,content:U,previewType:"video"}):fe)))}uo({url:U,type:"video"},p.id)}else n(ge=>ge.map(ne=>ne.id===p.id?{...ne,status:"failed",errorMsg:"未返回视频 URL"}:ne));else if(ue==="FAILED"||ue==="FAILURE"||ue==="ERROR"){const ge=G||"生成失败";console.error("[RefreshVideo] Wan 2.6 生成失败:",ge),n(ne=>ne.map(le=>le.id===p.id?{...le,status:"failed",errorMsg:ge}:le))}else if(ue==="UNKNOWN"){const ge="任务已过期或不存在(24小时有效期)";console.error("[RefreshVideo] Wan 2.6 任务查询失败:",ge),n(ne=>ne.map(le=>le.id===p.id?{...le,status:"failed",errorMsg:ge}:le))}else{const ge=te||(ue==="RUNNING"?50:10);console.log("[RefreshVideo] Wan 2.6 任务进行中, 状态:",ue,"进度:",ge),n(ne=>ne.map(le=>le.id===p.id?{...le,status:"generating",progress:ge}:le))}return}if(ru(f)){const ue=j.data&&typeof j.data=="object"?j.data:k,U=String(ue.state??k.state??j.state??"").toLowerCase(),G=ue.creations??k.creations??j.creations,te=G==null?void 0:G[0],ge=te==null?void 0:te.video;let ne=(te==null?void 0:te.url)??(te==null?void 0:te.download_url)??(te==null?void 0:te.video_url)??(ge==null?void 0:ge.url)??(ge==null?void 0:ge.download_url)??(te==null?void 0:te.output_url)??(te==null?void 0:te.play_url)??"";if(!ne&&te&&typeof te=="object"){for(const be of Object.values(te))if(typeof be=="string"&&be.startsWith("http")&&(be.includes(".mp4")||/\/video[\/?]/.test(be)||be.includes("prod-ss-vidu")||be.includes("s3")&&be.includes("amazonaws"))){ne=be;break}}if(ne||(ne=k.video_url??k.download_url??k.output_url??j.video_url??j.download_url??j.output_url??""),U==="success"&&ne){const be=Dw(p.id,ne);n($e=>$e.map(ze=>ze.id===p.id?{...ze,status:"completed",url:ne,_assetId:be,progress:100}:ze));const de=p.sourceNodeId;if(de){const $e=i.filter(ze=>ze.from===de).map(ze=>ze.to);$e.length>0&&r(ze=>ze.map(_e=>$e.includes(_e.id)&&_e.type==="preview"?{..._e,content:ne,previewType:"video"}:_e))}uo({url:ne,type:"video"},p.id);return}if(U==="failed"){const be=String(k.err_code??j.err_code??"任务失败");o(p),n(de=>de.map($e=>$e.id===p.id?{...$e,status:"failed",errorMsg:be}:$e));return}const le=k.progress??50,fe=typeof le=="number"?le:parseInt(String(le),10)||50;n(be=>be.map(de=>de.id===p.id?{...de,status:"generating",progress:fe}:de));return}const W=k.data,M=String(k.status??(W==null?void 0:W.status)??"").toUpperCase(),Y=k.progress??(W==null?void 0:W.progress)??0,se=typeof Y=="number"?Y:parseInt(String(Y),10)||0;console.log("[RefreshVideo] Status:",M,"Progress:",se),console.log("[RefreshVideo] Full response:",JSON.stringify(k).substring(0,500));const oe=(j.data&&typeof j.data=="object"?j.data:k).creations??k.creations??j.creations,re=oe==null?void 0:oe[0],ee=re?re.url??re.video_url??((L=re.video)==null?void 0:L.url)??re.output_url??re.play_url:void 0,pe=(W==null?void 0:W.generations)??[],we=(X=pe==null?void 0:pe[0])==null?void 0:X.url,Q=[ee,k.video_url,k.url,W==null?void 0:W.video_url,W==null?void 0:W.url,W==null?void 0:W.output,k.output,we];let me="";for(const ue of Q)if(typeof ue=="string"&&ue){me=ue;break}if(console.log("[RefreshVideo] Extracted video URL:",me),M==="COMPLETED"||M==="SUCCESS"||M==="SUCCEEDED"||M==="FINISHED"||M==="DONE")if(me){n(U=>U.map(G=>G.id===p.id?{...G,status:"completed",url:me,progress:100}:G));let ue=p.sourceNodeId;if(ue||(console.log("[RefreshVideo] No sourceNodeId, searching by history id:",p.id),r(U=>{const G=U.find(te=>te.content===p.url||te.settings&&"videoUrl"in te.settings&&te.settings.videoUrl===p.url);return G&&(ue=G.id,console.log("[RefreshVideo] Found source node:",ue)),U})),ue){const U=i.filter(G=>G.from===ue).map(G=>G.to);console.log("[RefreshVideo] Source node:",ue,"Connected previews:",U),U.length>0?(console.log("[RefreshVideo] Updating connected preview nodes:",U),r(G=>G.map(te=>U.includes(te.id)&&te.type==="preview"?(console.log("[RefreshVideo] Updating preview node:",te.id,"with URL:",me.substring(0,50)),{...te,content:me,previewType:"video"}):te))):console.warn("[RefreshVideo] No connected preview nodes found for source:",ue)}else console.warn("[RefreshVideo] Could not find source node for history item:",p.id);uo({url:me,type:"video"},p.id)}else n(ue=>ue.map(U=>U.id===p.id?{...U,status:"failed",errorMsg:"任务完成但未返回视频URL"}:U));else if(M==="FAILED"||M==="ERROR"){const ue=k.error||k.message||"视频生成失败",U=typeof ue=="string"?ue:typeof ue=="object"&&ue!==null&&"message"in ue?String(ue.message):JSON.stringify(ue);o(p),n(G=>G.map(te=>te.id===p.id?{...te,status:"failed",errorMsg:U}:te))}else n(ue=>ue.map(U=>U.id===p.id?{...U,status:"generating",progress:typeof se=="number"?se:parseInt(se)||0}:U))}catch(T){console.error("[RefreshVideo] Error:",T),o(p),n(q=>q.map(H=>H.id===p.id?{...H,status:"failed",errorMsg:String(T)}:H))}},[t,e,n,r,i,o]),c=_.useCallback(async p=>{var w,v;if(!p.remoteTaskId){alert(`无法刷新:缺少任务ID(remoteTaskId) + +该历史记录可能是旧版本生成的,请重新生成音乐。`);return}const f=p.modelName||"suno-v4",b=e.find(m=>m.id===f||m.id.includes("suno")),g=(b==null?void 0:b.key)||t,y=((b==null?void 0:b.url)||jy).replace(/\/+$/,"");if(!g){alert("无法刷新:缺少API Key");return}console.log("[RefreshAudio] Config:",{modelId:f,effectiveBaseUrl:y,hasKey:!!g,taskId:p.remoteTaskId}),n(m=>m.map(z=>z.id===p.id?{...z,status:"generating",progress:0}:z));try{Na.updateConfig(y,g,e);const m=await Na.getMusicTaskStatus(p.remoteTaskId,f);if(!m.success||!m.data)throw new Error(m.error||"查询任务状态失败");const z=m.data,C=z.data,E=(C.status||"").toLowerCase(),I=parseInt((C.progress||"0").replace("%",""),10),R=C.data;if(console.log("[RefreshAudio] Status:",{status:E,progress:I,songsCount:R==null?void 0:R.length}),(E==="complete"||E==="success"||E==="streaming"||E==="finished")&&R&&Array.isArray(R)&&R.length>0){const O=R.filter(F=>{const L=(F.status||"").toLowerCase(),X=F.audio_url||F.audioUrl;return(L==="complete"||L==="success"||!L)&&X});if(O.length>0){const F=O[0],L=F.audio_url||F.audioUrl,X=F.id||F.clip_id||F.clipId,T=F.title||p.musicTitle,q=F.duration||((w=F.metadata)==null?void 0:w.duration),H=((v=F.metadata)==null?void 0:v.prompt)||F.lyrics||p.lyrics;n(J=>J.map(Z=>Z.id===p.id?{...Z,status:"completed",url:L,audioUrl:L,progress:100,clipId:X,musicTitle:T,duration:q,lyrics:H}:Z)),uo({url:L,audioUrl:L,type:"audio"},p.id),p.sourceNodeId&&r(J=>{const Z=J.find(B=>B.id===p.sourceNodeId);return Z&&Z.type==="gen-music"?J.map(B=>B.id===p.sourceNodeId?{...B,isGenerating:!1,settings:{...B.settings,clipId:X,audioUrl:L,generatedLyrics:H,musicTitle:T}}:B):J})}else n(F=>F.map(L=>L.id===p.id?{...L,status:"failed",errorMsg:"任务完成但未返回音频URL"}:L))}else if(E==="error"||E==="failed"){const O=C.fail_reason||z.message||"音乐生成失败";n(F=>F.map(L=>L.id===p.id?{...L,status:"failed",errorMsg:O}:L))}else n(O=>O.map(F=>F.id===p.id?{...F,status:"generating",progress:I}:F))}catch(m){console.error("[RefreshAudio] Error:",m),n(z=>z.map(C=>C.id===p.id?{...C,status:"failed",errorMsg:String(m)}:C))}},[t,e,n,r]),u=_.useCallback(async p=>{if(p.modelName!=="RH ComfyUI"||!p.id)return;const f=typeof localStorage<"u"&&localStorage.getItem(ri.RH_API_KEY)||"";if(!f.trim()){alert("无法刷新:请先在 RH Comfy 节点中配置 API Key");return}const b=String(p.id);n(g=>g.map(y=>String(y.id)===b?{...y,status:"generating",progress:0}:y));try{const g=p.rhUseOverseas??!1,y=await DO({apiKey:f.trim(),taskId:b,useOverseas:g});if(y.code===0&&Array.isArray(y.data)&&y.data.length>0){const w=y.data.map(I=>I.fileUrl??I.file_url).filter(Boolean),v=w[0]||"",m=(v||"").split("?")[0].toLowerCase(),z=/\.(mp4|webm|mov|avi|mkv)(\?|$)/i.test(m),C=/\.(mp3|wav|ogg|m4a|aac|flac)(\?|$)/i.test(m),E=z?"video":C?"audio":"image";n(I=>I.map(R=>String(R.id)===b?{...R,type:E,url:v,audioUrl:E==="audio"?v:R.audioUrl,status:"completed",progress:100,mjImages:w.length>1?w:void 0,errorMsg:void 0,rhUseOverseas:R.rhUseOverseas,_assetId:b}:R)),v&&uo({url:v,type:E,audioUrl:E==="audio"?v:void 0},b)}else if(y.code===805){const w=y.data,v=(w==null?void 0:w.failedReason)??y.failedReason,m=(v==null?void 0:v.exception_message)||y.msg||"任务失败";n(z=>z.map(C=>String(C.id)===b?{...C,status:"failed",progress:0,errorMsg:m}:C))}else y.code===804||y.code===813?n(w=>w.map(v=>String(v.id)===b?{...v,status:"generating",progress:y.code===804?50:10}:v)):n(w=>w.map(v=>String(v.id)===b?{...v,status:"failed",progress:0,errorMsg:y.msg||"查询失败"}:v))}catch(g){const y=g instanceof Error?g.message:"刷新失败";n(w=>w.map(v=>String(v.id)===b?{...v,status:"failed",progress:0,errorMsg:y}:v))}},[n]),d=_.useCallback(p=>{if(!(typeof localStorage<"u"&&localStorage.getItem(ri.RH_API_KEY)||"").trim())return;const b=p.filter(g=>g.modelName==="RH ComfyUI"&&g.id&&(g.status==="generating"||g.status==="failed"||g.status==="completed"&&(!g.url||!g.url.trim())));b.length!==0&&b.forEach((g,y)=>{setTimeout(()=>{u(g)},y*600)})},[u]),h=_.useCallback(async p=>{var m,z,C,E,I,R,A,O,F,L,X,T,q,H,J,Z,B,V;if(!p.remoteTaskId){alert(`无法刷新:缺少任务ID(remoteTaskId) + +该历史记录可能是旧版本生成的,请重新生成图片。`);return}const f=p.modelName||"";if(!(f.toLowerCase().includes("nano banana")||f.toLowerCase().includes("nano-banana")||((z=(m=p.apiConfig)==null?void 0:m.modelId)==null?void 0:z.includes("nano-banana"))||((E=(C=p.apiConfig)==null?void 0:C.modelId)==null?void 0:E.includes("gemini-3.1-flash-image-preview"))||((I=p.apiConfig)==null?void 0:I.modelId)==="grok-4.1-image"||((R=p.apiConfig)==null?void 0:R.modelId)==="grok-4.2-image"||f.toLowerCase().includes("grok 4.1 image")||f.toLowerCase().includes("grok 4.2 image"))){console.warn("[RefreshNanoBanana] 不是 Nano Banana 任务,跳过刷新");return}try{const{assetStore:N}=await mn(async()=>{const{assetStore:W}=await Promise.resolve().then(()=>_s);return{assetStore:W}},void 0,import.meta.url);await N.init();const j=[p._assetId,p.id,p.remoteTaskId].filter(Boolean);let k=null;for(const W of j){const M=await N.getAssetUrl(W);if(M){k=M,console.log("[RefreshNanoBanana] ✅ 从本地缓存获取到图片:",W,M);break}}if(k){const W={...p,status:"completed",progress:100,url:k,_assetId:p._assetId||p.id};n(M=>M.map(Y=>Y.id===p.id?W:Y)),r&&p.sourceNodeId&&r(M=>{const Y=M.filter(se=>se.type==="preview"&&i.some(ie=>ie.from===p.sourceNodeId&&ie.to===se.id));return Y.length>0?M.map(se=>Y.some(oe=>oe.id===se.id)?{...se,content:k}:se):M}),console.log("[RefreshNanoBanana] ✅ 使用本地缓存图片完成");return}}catch(N){console.warn("[RefreshNanoBanana] 从本地缓存获取失败,尝试从API获取:",N)}const g=((A=p.apiConfig)==null?void 0:A.modelId)||p.modelName||"nano-banana",y=e.find(N=>N.id===g||N.provider===p.modelName||N.modelName===g),w=((O=p.apiConfig)==null?void 0:O.apiKey)||(y==null?void 0:y.key)||t,v=(((F=p.apiConfig)==null?void 0:F.baseUrl)||(y==null?void 0:y.url)||jy).replace(/\/+$/,"");if(!w){alert("无法刷新:缺少API Key");return}n(N=>N.map(j=>j.id===p.id?{...j,status:"generating",progress:0}:j));try{const N=`${v}/v1/images/tasks/${encodeURIComponent(p.remoteTaskId)}`,j=await fetch(N,{headers:{Authorization:`Bearer ${w}`}});if(!j.ok){const oe=await j.text();throw console.error("[RefreshNanoBanana] HTTP错误:",j.status,oe),new Error(`HTTP ${j.status}: ${oe}`)}const k=await j.json();console.log("[RefreshNanoBanana] 查询结果:",k);const W=(k.code||"").toLowerCase(),M=(k.status||((L=k.data)==null?void 0:L.status)||"").toUpperCase(),Y=k.progress||((X=k.data)==null?void 0:X.progress)||0,se=typeof Y=="string"?parseInt(Y.replace("%",""),10):Y;if(W==="success"||M==="SUCCEEDED"||M==="COMPLETED"||M==="SUCCESS"||M==="FINISHED"||M==="DONE"||((T=k.data)==null?void 0:T.status)==="SUCCESS"){let oe=[];if(console.log("[RefreshNanoBanana] 开始提取图片URL,完整响应:",JSON.stringify(k,null,2)),(q=k.data)!=null&&q.data){if(console.log("[RefreshNanoBanana] 找到 data.data,类型:",typeof k.data.data,"是否为数组:",Array.isArray(k.data.data)),Array.isArray(k.data.data)&&k.data.data.length>0){console.log("[RefreshNanoBanana] data.data 是数组,长度:",k.data.data.length);const re=k.data.data.map((ee,pe)=>{if(console.log(`[RefreshNanoBanana] 处理图片 ${pe}:`,ee,"类型:",typeof ee),typeof ee=="string")return console.log(`[RefreshNanoBanana] 图片 ${pe} 是字符串,直接返回`),ee;if(typeof ee=="object"&&ee!==null){const we=ee.url||"";return console.log(`[RefreshNanoBanana] 图片 ${pe} 是对象,提取的URL:`,we),we}return""}).filter(ee=>{const pe=!!(ee&&ee.trim().length>0);return pe||console.warn("[RefreshNanoBanana] 过滤掉无效URL:",ee),pe});re.length>0&&(oe=re,console.log("[RefreshNanoBanana] 方式1提取到的URLs:",oe))}else if(typeof k.data.data=="object"&&k.data.data!==null&&!Array.isArray(k.data.data)){const re=k.data.data.url;re&&(console.log("[RefreshNanoBanana] data.data 是对象,提取URL:",re),oe.push(re))}}if(oe.length===0&&((H=k.data)!=null&&H.images)&&Array.isArray(k.data.images)&&k.data.images.length>0){const re=k.data.images.map(ee=>typeof ee=="string"?ee:(ee==null?void 0:ee.url)||"").filter(Boolean);re.length>0&&(oe=re,console.log("[RefreshNanoBanana] 方式2提取到的URLs:",oe))}if(oe.length===0&&k.images&&Array.isArray(k.images)&&k.images.length>0){const re=k.images.map(ee=>typeof ee=="string"?ee:(ee==null?void 0:ee.url)||"").filter(Boolean);re.length>0&&(oe=re,console.log("[RefreshNanoBanana] 方式3提取到的URLs:",oe))}if(oe.length===0&&k.data&&Array.isArray(k.data)&&k.data.length>0){const re=k.data.map(ee=>typeof ee=="string"?ee:(ee==null?void 0:ee.url)||"").filter(Boolean);re.length>0&&(oe=re,console.log("[RefreshNanoBanana] 方式4提取到的URLs:",oe))}if(oe.length===0&&((J=k.data)!=null&&J.url)&&(oe=[k.data.url],console.log("[RefreshNanoBanana] 方式5提取到的URL:",oe)),oe.length===0?(console.error("[RefreshNanoBanana] 无法提取图片URL,完整响应结构:",JSON.stringify(k,null,2)),console.error("[RefreshNanoBanana] result.data:",k.data),console.error("[RefreshNanoBanana] result.data?.data:",(Z=k.data)==null?void 0:Z.data),(B=k.data)!=null&&B.data&&Array.isArray(k.data.data)&&(console.error("[RefreshNanoBanana] result.data.data[0]:",k.data.data[0]),k.data.data[0]&&console.error("[RefreshNanoBanana] result.data.data[0].url:",k.data.data[0].url))):console.log("[RefreshNanoBanana] ✅ 成功提取到URL:",oe),oe.length>0)try{const{assetStore:re}=await mn(async()=>{const{assetStore:we}=await Promise.resolve().then(()=>_s);return{assetStore:we}},void 0,import.meta.url);await re.init();const ee=oe[0],pe=p._assetId||p.id||p.remoteTaskId;if(pe&&ee){await uo({url:ee,type:"image"},pe);const we=await re.getAssetUrl(pe),Q=we||ee;console.log("[RefreshNanoBanana] 图片已保存到本地缓存,assetId:",pe),console.log("[RefreshNanoBanana] 本地缓存URL:",we),console.log("[RefreshNanoBanana] 最终使用URL:",Q);const me={...p,status:"completed",progress:100,url:Q,mjImages:oe.length>1?oe:void 0,_assetId:pe};n(ue=>ue.map(U=>U.id===p.id?me:U)),r&&p.sourceNodeId&&r(ue=>{const U=ue.filter(G=>G.type==="preview"&&i.some(te=>te.from===p.sourceNodeId&&te.to===G.id));return U.length>0?ue.map(G=>U.some(ge=>ge.id===G.id)?{...G,content:Q,previewMjImages:oe.length>1?oe:void 0}:G):ue}),console.log("[RefreshNanoBanana] ✅ 刷新成功,使用本地缓存图片:",Q)}else{const we={...p,status:"completed",progress:100,url:ee,mjImages:oe.length>1?oe:void 0};n(Q=>Q.map(me=>me.id===p.id?we:me)),console.log("[RefreshNanoBanana] ✅ 刷新成功,图片URL:",ee)}}catch(re){console.warn("[RefreshNanoBanana] 保存到本地缓存失败,使用原始URL:",re);const ee={...p,status:"completed",progress:100,url:oe[0],mjImages:oe.length>1?oe:void 0};n(pe=>pe.map(we=>we.id===p.id?ee:we)),console.log("[RefreshNanoBanana] ✅ 刷新成功(使用原始URL):",oe[0])}else throw console.error("[RefreshNanoBanana] 无法提取图片URL,响应结构:",JSON.stringify(k,null,2)),new Error("无法从响应中提取图片URL")}else if(W==="failed"||W==="error"||M==="FAILED"||M==="ERROR"){const oe=k.error||k.message||k.fail_reason||((V=k.data)==null?void 0:V.fail_reason)||"生成失败";o(p),n(re=>re.map(ee=>ee.id===p.id?{...ee,status:"failed",errorMsg:oe}:ee)),console.error("[RefreshNanoBanana] 任务失败:",oe)}else n(oe=>oe.map(re=>re.id===p.id?{...re,status:"generating",progress:se}:re)),console.log("[RefreshNanoBanana] 任务处理中,进度:",se)}catch(N){console.error("[RefreshNanoBanana] 刷新失败:",N),o(p),n(j=>j.map(k=>k.id===p.id?{...k,status:"failed",errorMsg:N instanceof Error?N.message:"刷新失败"}:k))}},[e,t,n,r,i,o]);return{handleRefreshVideo:l,handleRefreshAudio:c,handleRefreshComfyTask:u,handleRefreshNanoBanana:h,autoRefreshRhComfyOnMount:d}}const U2=1152;function AC(e){const t=new Int16Array(e.length);for(let n=0;n1?a.getChannelData(1):c,d=await mn(()=>Promise.resolve().then(()=>dde),void 0,import.meta.url),p=(d.default??d).Mp3Encoder;if(!p)throw new Error("lamejs.Mp3Encoder not found");const f=new p(o,l,128),b=AC(c),g=o>1?AC(u):b,y=[];for(let C=0;C0&&y.push(R)}const w=f.flush();w.length>0&&y.push(w);const v=y.reduce((C,E)=>C+E.length,0),m=new Uint8Array(v);let z=0;for(const C of y)m.set(C,z),z+=C.length;return new Blob([m],{type:"audio/mpeg"})}catch{return null}}async function GO(e,t){const r=(t||"").toLowerCase().endsWith(".mp3")?t:`${t.replace(/\.[^.]+$/,"")||"audio"}.mp3`,i=await LZ(e);if(!i){console.warn("[audioToMp3] 转换失败,尝试直接下载原文件");const l=document.createElement("a");l.href=e,l.download=r,l.click();return}const a=URL.createObjectURL(i),o=document.createElement("a");o.href=a,o.download=r,document.body.appendChild(o),o.click(),document.body.removeChild(o),URL.revokeObjectURL(a)}async function MC(e){try{console.log("[Download] Attempting to use Tauri backend...");const{invoke:t}=await mn(async()=>{const{invoke:a}=await Promise.resolve().then(()=>tf);return{invoke:a}},void 0,import.meta.url);console.log("[Download] Tauri API imported successfully"),console.log("[Download] Calling Tauri command: download_file_bypass_cors"),console.log("[Download] URL:",e);const n=await t("download_file_bypass_cors",{url:e});console.log("[Download] Received bytes from Tauri:",n.length);const r=new Uint8Array(n),i=new Blob([r]);return console.log(`[Download] ✅ Tauri download successful, size: ${(i.size/1024/1024).toFixed(2)}MB`),i}catch(t){throw console.error("[Download] Tauri download failed:",t),t}}async function F2(e,t){try{console.log("[SaveFile] Attempting to use Tauri file system API");const n=bx,r=_J;console.log("[SaveFile] Tauri APIs ready");const i=localStorage.getItem("qiaodoumayi_download_directory");let a,o=!1;i?(o=i.startsWith("/")||i.match(/^[A-Za-z]:/)!==null,a=i,console.log("[SaveFile] Using custom directory:",a,"(absolute:",o,")")):(a="Qiaodoumayi_Media",o=!1,console.log("[SaveFile] Using default directory:",a));try{o?await n.exists(a)||(console.log("[SaveFile] Creating directory (absolute):",a),await n.mkdir(a,{recursive:!0})):await n.exists(a,{baseDir:mi.Document})||(console.log("[SaveFile] Creating directory (relative):",a),await n.mkdir(a,{baseDir:mi.Document,recursive:!0})),console.log("[SaveFile] Directory ready:",a)}catch(d){throw console.error("[SaveFile] Failed to create directory:",d),d}let l;o?l=await r.join(a,t):l=`${a}/${t}`,console.log("[SaveFile] Target file path:",l);const c=await e.arrayBuffer(),u=new Uint8Array(c);return console.log("[SaveFile] Blob converted to Uint8Array, size:",u.length),o?await n.writeFile(l,u):await n.writeFile(l,u,{baseDir:mi.Document}),console.log("[SaveFile] ✅ File saved successfully via Tauri:",l),a}catch(n){console.error("[SaveFile] Tauri failed, using browser download. Error:",n);const r=URL.createObjectURL(e),i=document.createElement("a");return i.href=r,i.download=t,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(r),console.log("[SaveFile] ✅ Browser download triggered"),""}}async function BZ(e){return new Promise((t,n)=>{const r=new Image;r.crossOrigin="anonymous";const i=setTimeout(()=>{n(new Error("Image loading timeout"))},3e4);r.onload=()=>{clearTimeout(i);try{const a=document.createElement("canvas");a.width=r.width,a.height=r.height;const o=a.getContext("2d");if(!o)throw new Error("Failed to get canvas context");o.drawImage(r,0,0),a.toBlob(l=>{l?t(l):n(new Error("Failed to create blob from canvas"))},"image/png")}catch(a){n(a)}},r.onerror=()=>{clearTimeout(i),n(new Error("Failed to load image"))},r.src=e})}const TC=e=>e.replace(/\.[^/.]+$/,"").replace(/[<>:"/\\|?*\x00-\x1f]/g,"_").replace(/\s+/g," ").trim()||"未命名",UZ=async(e,t)=>{try{if(console.log("[extractOriginalFileName] 输入URL:",e),t&&t.videoFileName){const a=t.videoFileName.replace(/\.[^/.]+$/,"");return console.log("[extractOriginalFileName] 从 videoFileName 获取:",a),a}if(e.startsWith("blob:")){const a=e.split("/"),o=a[a.length-1];return o?(console.log("[extractOriginalFileName] 从 blob URL 提取:",o),o):null}if(e.startsWith("content_ref:"))return console.log("[extractOriginalFileName] 跳过 content_ref 格式"),null;if(e.startsWith("data:"))return console.log("[extractOriginalFileName] 跳过 data URL"),null;const r=new URL(e).pathname;console.log("[extractOriginalFileName] pathname:",r);const i=r.split("/").pop();if(console.log("[extractOriginalFileName] filename:",i),i&&i.includes(".")){const o=i.replace(/\.[^/.]+$/,"").split("?")[0];return console.log("[extractOriginalFileName] 提取结果:",o),o}console.log("[extractOriginalFileName] 文件名不包含扩展名")}catch(n){console.error("[extractOriginalFileName] URL解析失败:",n)}return null},FZ=async(e,t,n,r,i)=>{var u;const a=e.nodeName||`节点${t+1}`,o=TC(a);if(console.log("[generateFileName] 节点名称:",a,"| URL:",i),!r)if(e.content){const d=e.previewType==="audio"||((u=e.settings)==null?void 0:u.mediaType)==="audio"||/\.(mp3|wav|ogg|m4a|aac|flac)(\?|$)/i.test(e.content.split("?")[0]),h=e.content.includes(".mp4")||e.content.includes("video")||e.previewType==="video";r=d?"mp3":h?"mp4":"png"}else r="png";let l="";if(i){const d=await UZ(i,e);d?(l=TC(d),console.log("[generateFileName] 提取到原始文件名:",l)):console.log("[generateFileName] 未能提取原始文件名")}let c=o;return l&&(c=`${o}_${l}`),console.log("[generateFileName] 最终文件名:",c),n!==void 0&&n>0?`${c}_${n+1}.${r}`:`${c}.${r}`};function WZ({nodes:e,connections:t,selectedNodeId:n,selectedNodeIds:r,setNodes:i,setIsDownloading:a,setDownloadProgress:o,setLightboxItem:l,setLightboxOpen:c,onDownloadStart:u,onDownloadProgress:d,onDownloadComplete:h,onDownloadError:p,getCancellationToken:f}){const b=_.useCallback(async()=>{var A;const w=r.size>0?e.filter(O=>r.has(O.id)):n?e.filter(O=>O.id===n):[];if(w.length===0){p==null||p("请先选中要下载的节点");return}const v=[],m=O=>/\.(mp3|wav|ogg|m4a|aac|flac)(\?|$)/i.test((O||"").split("?")[0])||(O||"").startsWith("data:audio");if(w.forEach((O,F)=>{var L,X;if(O.type==="preview"){const T=O.previewMjImages||[];if(T.length>0)T.forEach((q,H)=>{if(q){const J=O.previewType==="audio"||m(q),Z=O.previewType==="video"||q.includes(".mp4")||q.includes("video");v.push({url:q,node:O,nodeIndex:F,fileIndex:H,extension:J?"mp3":Z?"mp4":"png",type:J?"audio":Z?"video":"image"})}});else if(O.selectedPreviewImage){const q=O.selectedPreviewImage,H=O.previewType==="audio"||m(q),J=O.previewType==="video"||q.includes(".mp4")||q.includes("video");v.push({url:q,node:O,nodeIndex:F,extension:H?"mp3":J?"mp4":"png",type:H?"audio":J?"video":"image"})}else if(O.content){const q=O.previewType==="audio"||m(O.content),H=O.previewType==="video"||O.content.includes(".mp4")||O.content.includes("video");v.push({url:O.content,node:O,nodeIndex:F,extension:q?"mp3":H?"mp4":"png",type:q?"audio":H?"video":"image"})}}else if(O.type==="input-image"&&O.content){const T=(L=O.settings)==null?void 0:L.mediaType,q=T==="audio"||m(O.content),H=T==="video";v.push({url:O.content,node:O,nodeIndex:F,extension:q?"mp3":H?"mp4":"png",type:q?"audio":H?"video":"image"})}else if(O.type==="video-input"&&O.content)v.push({url:O.content,node:O,nodeIndex:F,extension:"mp4",type:"video"});else if((O.type==="gen-video"||O.type==="generate-character-video"||O.type==="generate-scene-video")&&O.content)v.push({url:O.content,node:O,nodeIndex:F,extension:"mp4",type:"video"});else if((O.type==="rh-comfy"||O.type==="rh-app")&&O.content&&m(O.content))v.push({url:O.content,node:O,nodeIndex:F,extension:"mp3",type:"audio"});else if((O.type==="generate-scene-image"||O.type==="generate-character-image")&&((X=O.settings)!=null&&X.imageUrls))O.settings.imageUrls.forEach((q,H)=>{q&&v.push({url:q,node:O,nodeIndex:F,fileIndex:H,extension:"png",type:"image"})});else if(O.content){const T=m(O.content),q=O.content.includes(".mp4")||O.content.includes("video")||O.content.includes(".webm");v.push({url:O.content,node:O,nodeIndex:F,extension:T?"mp3":q?"mp4":"png",type:T?"audio":q?"video":"image"})}}),v.length===0){p==null||p("选中的节点中没有可下载的图片、视频或音频");return}const z=[];for(const O of v){const F=await FZ(O.node,O.nodeIndex,O.fileIndex,O.extension,O.url);let L;const X=O.node;if(typeof O.fileIndex=="number"&&O.fileIndex>=0){const T=X._previewMjAssetIds;T&&T[O.fileIndex]&&(L=T[O.fileIndex])}L||(L=((A=O.node.settings)==null?void 0:A._assetId)??X._contentAssetId??void 0),z.push({url:O.url,name:F,type:O.type,assetIdHint:L})}a(!0),o({current:0,total:z.length}),u==null||u(z.length);let C=0,E=0;const I=async(O,F)=>{try{let L=null,X=O.url;if(Ln.isContentRef(O.url)){const q=Ln.extractId(O.url);console.log(`[Download] 从 IndexedDB 获取内容: ${q}`);const H=await Ln.get(q);if(H)X=H,console.log(`[Download] ✅ 成功获取内容,长度: ${H.length}`);else throw console.error(`[Download] ❌ 内容未找到: ${q}`),new Error(`内容未找到: ${q}`)}if(O.assetIdHint&&xr.isAvailable()&&xr.hasAsset(O.assetIdHint))try{const q=await xr.readAsset(O.assetIdHint);q&&(L=q.blob,console.log(`[Download] 从本地缓存目录读取原图: ${O.name}`))}catch(q){console.warn("[Download] 读取本地缓存失败,退回其他通道:",q)}if(!L&&X.startsWith("data:"))L=await(await fetch(X)).blob();else if(!L&&X.startsWith("blob:"))if(O.type==="image"){const{getFullBlobForDisplayUrl:q}=await mn(async()=>{const{getFullBlobForDisplayUrl:J}=await Promise.resolve().then(()=>Do);return{getFullBlobForDisplayUrl:J}},void 0,import.meta.url);L=await q(X,O.assetIdHint)??await fetch(X).then(J=>J.blob())}else L=await fetch(X).then(q=>q.blob());else if(!L&&(X.startsWith("http://")||X.startsWith("https://"))){const{assetStore:q}=await mn(async()=>{const{assetStore:J}=await Promise.resolve().then(()=>_s);return{assetStore:J}},void 0,import.meta.url);let H=await q.getAssetBlob(X);if(!H){const J=[X,X.split("?")[0],X.replace(/^https?:\/\//,"")];for(const Z of J)if(H=await q.getAssetBlob(Z),H)break}if(!H&&O.assetIdHint&&(H=await q.getAssetBlob(O.assetIdHint)),!H&&(X.includes("prod-ss-vidu")||X.includes("prod-sa-vidu")||X.includes("amazonaws")&&X.includes("vidu"))&&(H=await q.getAssetBlobByRemoteUrl(X)),H)console.log(`[Download] 从缓存获取: ${O.name}`),L=H;else{console.log(`[Download] 从网络下载: ${X}`);try{const J=O.type==="video"||O.type==="audio",Z=X.includes("prod-ss-vidu")||X.includes("prod-sa-vidu")||X.includes("amazonaws")&&X.includes("vidu");if(J||Z)try{const{downloadWithFallback:B}=await mn(async()=>{const{downloadWithFallback:V}=await Promise.resolve().then(()=>n0);return{downloadWithFallback:V}},void 0,import.meta.url);L=await B(X,12e4),!L.type&&O.type==="video"?L=new Blob([await L.arrayBuffer()],{type:"video/mp4"}):!L.type&&O.type==="audio"&&(L=new Blob([await L.arrayBuffer()],{type:"audio/mpeg"})),console.log(`[Download] ✅ Tauri后端下载成功: ${O.name}`)}catch(B){throw console.warn("[Download] Tauri video/audio download failed, trying fallback:",B),B}else try{L=await MC(X),console.log(`[Download] ✅ Tauri后端下载成功: ${O.name}`)}catch(B){throw console.warn("[Download] Tauri backend failed, falling back to fetch:",B),B}}catch{try{const Z=await fetch(X,{mode:"cors",credentials:"omit"});if(!Z.ok)throw new Error(`HTTP ${Z.status}: ${Z.statusText}`);L=await Z.blob(),console.log(`[Download] ✅ CORS下载成功: ${O.name}, 大小: ${(L.size/1024/1024).toFixed(2)}MB`)}catch(Z){console.warn("[Download] CORS fetch failed, trying no-cors mode:",Z);try{if(L=await(await fetch(X,{mode:"no-cors"})).blob(),L.size===0)throw console.warn("[Download] no-cors mode returned empty blob, trying alternative method"),new Error("no-cors returned empty blob");console.log(`[Download] ✅ 使用no-cors模式下载成功: ${O.name}`)}catch(B){if(console.error("[Download] no-cors fetch also failed:",B),O.type==="video"||O.type==="audio")throw console.log(`[Download] ${O.type==="audio"?"Audio":"Video"} CORS blocked, opening in new tab for manual download`),window.open(X,"_blank"),new Error(`${O.type==="audio"?"音频":"视频"} "${O.name}" 因服务器限制无法自动下载,已在新标签页打开,请手动保存`);console.log(`[Download] Trying image element method for: ${X}`);try{L=await BZ(X)}catch(V){throw console.error("[Download] Image element method failed:",V),window.open(X,"_blank"),new Error(`图片 "${O.name}" 因服务器限制无法自动下载,已在新标签页打开,请手动保存`)}}}}}}else if(!L)throw console.error(`[Download] ❌ 无效的 URL 格式: ${X.substring(0,50)}...`),new Error("无效的 URL 格式");if(!L)throw new Error("无法获取文件数据");if(O.type==="audio"){const q=await HO(L);if(q){L=q;const H=O.name.replace(/\.[^.]+$/,"")+".mp3",J=await F2(L,H);return C++,o({current:F+1,total:z.length}),d==null||d(F+1,z.length,H),F===z.length-1&&J?J:void 0}}const T=await F2(L,O.name);if(C++,o({current:F+1,total:z.length}),d==null||d(F+1,z.length,O.name),F===z.length-1&&T)return T}catch(L){console.error(`下载失败: ${O.name}`,L),E++;const X=L instanceof Error?L.message:String(L);X.includes("CORS")||X.includes("服务器限制")?console.log(`[Download] CORS error for ${O.name}, user notified`):console.error(`[Download] Unexpected error for ${O.name}:`,X),o({current:F+1,total:z.length}),d==null||d(F+1,z.length,O.name)}return""};let R="";for(let O=0;OsetTimeout(X,300))}a(!1),o({current:0,total:0}),R?(h==null||h(C,E),console.log("[Download] All files saved to:",R)):h==null||h(C,E)},[e,n,r,a,o,u,d,h,p,f]),g=_.useCallback(async w=>{if(w.length===0){p==null||p("没有可下载的文件");return}a(!0),o({current:0,total:w.length}),u==null||u(w.length);let v=0,m=0;const z=async C=>{if(C.startsWith("data:"))return(await fetch(C)).blob();if(C.startsWith("blob:"))return(await fetch(C)).blob();if(C.startsWith("http://")||C.startsWith("https://")){const{assetStore:E}=await mn(async()=>{const{assetStore:R}=await Promise.resolve().then(()=>_s);return{assetStore:R}},void 0,import.meta.url);let I=await E.getAssetBlob(C);if(!I){const R=[C,C.split("?")[0],C.replace(/^https?:\/\//,"")];for(const A of R)if(I=await E.getAssetBlob(A),I)break}if(I)return I;try{return await MC(C)}catch{const R=await fetch(C,{mode:"cors",credentials:"omit"});if(!R.ok)throw new Error(`HTTP ${R.status}`);return R.blob()}}throw new Error("无效的 URL 格式")};for(let C=0;CsetTimeout(R,300))}a(!1),o({current:0,total:0}),h==null||h(v,m)},[a,o,u,d,h,p,f]),y=_.useCallback(async w=>{const v=async(C,E,I)=>{if(E==="image"&&C.startsWith("blob:")){const{getFullBlobUrlForDisplayUrl:R}=await mn(async()=>{const{getFullBlobUrlForDisplayUrl:O}=await Promise.resolve().then(()=>Do);return{getFullBlobUrlForDisplayUrl:O}},void 0,import.meta.url),A=await R(C,I);if(A)return A}return C},m=(C,E)=>{const I={url:C,type:E};try{l(I),c(!0)}catch(R){console.error("[handleNodeDoubleClick] Error:",R)}};if(w.content){const C=(F,L)=>{var T,q;if(((T=L==null?void 0:L.settings)==null?void 0:T.mediaType)==="video")return!0;if(!F)return!1;if(F.startsWith("data:video")||F.includes("force_video_display=true"))return!0;const X=(q=F.split(".").pop())==null?void 0:q.split("?")[0].toLowerCase();return["mp4","webm","ogg","mov"].includes(X||"")},E=(F,L)=>{var T,q;if(((T=L==null?void 0:L.settings)==null?void 0:T.mediaType)==="audio")return!0;if(!F)return!1;if(F.startsWith("data:audio"))return!0;const X=(q=F.split(".").pop())==null?void 0:q.split("?")[0].toLowerCase();return["mp3","wav","ogg","m4a","aac","flac"].includes(X||"")},I=e.find(F=>F.id===w.id),R=C(w.content,I)?"video":E(w.content,I)?"audio":"image",A=I==null?void 0:I._contentAssetId,O=await v(w.content,R,A);m(O,R);return}const z=e.find(C=>C.id===w.id);if(z&&z.content){const C=(O,F)=>{var X,T;if(((X=F==null?void 0:F.settings)==null?void 0:X.mediaType)==="video")return!0;if(!O)return!1;if(O.startsWith("data:video")||O.includes("force_video_display=true"))return!0;const L=(T=O.split(".").pop())==null?void 0:T.split("?")[0].toLowerCase();return["mp4","webm","ogg","mov"].includes(L||"")},E=(O,F)=>{var X,T;if(((X=F==null?void 0:F.settings)==null?void 0:X.mediaType)==="audio")return!0;if(!O)return!1;if(O.startsWith("data:audio"))return!0;const L=(T=O.split(".").pop())==null?void 0:T.split("?")[0].toLowerCase();return["mp3","wav","ogg","m4a","aac","flac"].includes(L||"")},I=C(z.content,z)?"video":E(z.content,z)?"audio":"image",R=z._contentAssetId,A=await v(z.content,I,R);m(A,I)}else console.warn("[handleNodeDoubleClick] Node not found or has no content:",w.id)},[e,l,c]);return{handleDownloadSelected:b,handleDownloadUrlList:g,handleNodeDoubleClick:y}}function DZ({view:e,canvasRef:t,connectingSource:n,connectingTarget:r,connectingInputType:i,setMousePos:a,setConnectingSource:o,setConnectingTarget:l,setConnectingInputType:c,setConnections:u,setNodes:d,nodes:h,generateId:p}){const f=_.useRef(r),b=_.useRef(i);_.useEffect(()=>{f.current=r,b.current=i},[r,i]);const g=_.useCallback((m,z)=>{var E;m.stopPropagation(),m.preventDefault();const C=(E=t.current)==null?void 0:E.getBoundingClientRect();if(C){const I=(m.clientX-C.left-e.x)/e.zoom,R=(m.clientY-C.top-e.y)/e.zoom;a({x:I,y:R})}o(z)},[e,t,a,o]),y=_.useCallback((m,z)=>{var E;m.stopPropagation(),m.preventDefault();const C=(E=t.current)==null?void 0:E.getBoundingClientRect();if(C){const I=(m.clientX-C.left-e.x)/e.zoom,R=(m.clientY-C.top-e.y)/e.zoom;a({x:I,y:R})}l(z)},[e,t,a,l]),w=_.useCallback((m,z)=>{if(m.stopPropagation(),n&&n!==z){const C={id:p(),from:n,to:z};u(I=>[...I,C]);try{window.dispatchEvent(new CustomEvent("nodeConnectionFlash",{detail:{nodeId:z,mode:"commit",side:"left"}}))}catch{}const E=h.find(I=>I.id===z);(E==null?void 0:E.type)==="preview"&&d(I=>I.map(R=>R.id===n?{...R,settings:{...R.settings||{},selectedPreviewId:z}}:R)),o(null)}if(r&&r!==z){const C={id:p(),from:z,to:r,...i&&i!=="default"?{inputType:i}:{}};u(I=>[...I,C]);try{window.dispatchEvent(new CustomEvent("nodeConnectionFlash",{detail:{nodeId:r,mode:"commit",side:"right"}}))}catch{}const E=h.find(I=>I.id===r);(E==null?void 0:E.type)==="preview"&&d(I=>I.map(R=>R.id===z?{...R,settings:{...R.settings||{},selectedPreviewId:r}}:R)),l(null),c(null)}},[n,r,i,p,u,d,h,o,l,c]),v=_.useCallback((m,z)=>{m.stopPropagation();const C=f.current,E=b.current;if(C&&C!==z){const I={id:p(),from:z,to:C,inputType:E||void 0};u(E&&!(E==="agent_user_input"||E==="agent_meta_prompt")?O=>[...O.filter(L=>!(L.to===C&&L.inputType===E)),I]:O=>[...O,I]);try{window.dispatchEvent(new CustomEvent("nodeConnectionFlash",{detail:{nodeId:C,mode:"commit",side:"left"}}))}catch{}const A=h.find(O=>O.id===C);(A==null?void 0:A.type)==="preview"&&d(O=>O.map(F=>F.id===z?{...F,settings:{...F.settings||{},selectedPreviewId:C}}:F)),l(null),c(null)}},[p,u,d,h,l,c]);return{handleStartConnectFromOutput:g,handleStartConnectFromInput:y,handleConnectToInput:w,handleConnectToOutput:v}}function VZ({connections:e,nodesMap:t,dataVersion:n}){const r=_.useCallback(b=>{var g;for(const y of e){if(y.to!==b)continue;const w=t.get(y.from);if(w){if(w.type==="video-input")return w;if(w.type==="input-image"&&w.content){if(((g=w.settings)==null?void 0:g.mediaType)==="video")return console.log("[getConnectedVideoInputNode] 通过 mediaType 识别为视频节点"),w;const m=w.content;if(xb(m))return console.log("[getConnectedVideoInputNode] 通过 URL 格式识别为视频节点"),w}}}return null},[e,t,n]),i=_.useCallback(b=>{for(const g of e)if(g.to===b){const y=t.get(g.from);if((y==null?void 0:y.type)==="video-analyze")return y}return null},[e,t,n]),a=_.useCallback((b,g)=>{if(!b||b.length===0)return[];const y=[...b].sort((z,C)=>z.time-C.time),w=[];let v=[],m=y[0].time;return y.forEach(z=>{z.time-m>=g&&v.length>0?(w.push([...v]),v=[z],m=z.time):v.push(z)}),v.length>0&&w.push(v),w},[]),o=_.useCallback(b=>{e.filter(w=>w.to===b);const g=e.filter(w=>w.to===b&&(!w.inputType||w.inputType==="default")),y=[];return g.forEach(w=>{var m,z,C;const v=t.get(w.from);if(v&&!(v.type==="camera-movement"||v.type==="professional-camera"))if(v.type==="preview")v.selectedPreviewImage?y.push(v.selectedPreviewImage):v.previewMjImages&&v.previewMjImages.length>0?y.push(v.previewMjImages[0]):v.content&&y.push(v.content);else if(v.type==="canvas-node")v.content?y.push(v.content):(m=v.settings)!=null&&m.canvasData&&y.push(`canvas-node:${v.id}`);else if(v.type==="rh-app"){const E=(z=v.settings)==null?void 0:z.generatedImages;E&&E.length>0?E.forEach(I=>y.push(I.fullUrl)):v.content&&y.push(v.content)}else if(v.type==="gen-music"){const E=(C=v.settings)==null?void 0:C.audioUrl;E&&y.push(E)}else v.type==="inpaint-crop"||v.type,v.content&&y.push(v.content)}),y},[e,t,n]),l=_.useCallback(b=>{const g=e.filter(m=>m.to===b&&(!m.inputType||m.inputType==="default")),y=[],w=m=>{if(!m)return!1;if(m.startsWith("data:video/"))return!0;if(m.startsWith("data:image/")||m.startsWith("data:audio/"))return!1;const z=m.toLowerCase();return z.includes(".mp4")||z.includes(".webm")||z.includes(".mov")||z.includes("/v1/videos/")},v=m=>{if(!m)return!1;if(m.startsWith("data:audio/"))return!0;if(m.startsWith("data:video/")||m.startsWith("data:image/"))return!1;const z=m.toLowerCase();return z.includes(".mp3")||z.includes(".wav")||z.includes(".ogg")||z.includes(".m4a")||z.includes(".aac")};return g.forEach(m=>{var C,E,I,R,A,O,F,L,X,T,q;const z=t.get(m.from);if(z&&!(z.type==="camera-movement"||z.type==="professional-camera")){if(z.type==="preview"){let H,J;z.selectedPreviewImage?(H=z.selectedPreviewImage,J=z._selectedImageAssetId):(C=z.previewMjImages)!=null&&C[0]?(H=z.previewMjImages[0],J=(E=z._previewMjAssetIds)==null?void 0:E[0]):z.content&&(H=z.content,J=z._contentAssetId),H&&y.push({url:H,type:z.previewType==="video"?"video":"image",assetId:J})}else if(z.type==="canvas-node"){const H=z.content?z.content:(I=z.settings)!=null&&I.canvasData?`canvas-node:${z.id}`:void 0,J=(R=z.settings)==null?void 0:R._assetId;H&&y.push({url:H,type:"image",assetId:J})}else if(z.type==="rh-app"){const H=(A=z.settings)==null?void 0:A.generatedImages;H!=null&&H.length?H.forEach(J=>y.push({url:J.fullUrl,type:"image",assetId:J.assetId})):z.content&&y.push({url:z.content,type:"image",assetId:(O=z.settings)==null?void 0:O._assetId})}else if(z.type==="gen-music"){const H=(F=z.settings)==null?void 0:F.audioUrl,J=(L=z.settings)==null?void 0:L._audioAssetId;H&&y.push({url:H,type:"audio",assetId:J})}else if(z.type==="video-input"&&z.content){const H=(X=z.settings)==null?void 0:X._assetId;y.push({url:z.content,type:"video",assetId:H})}else if(z.content){const H=z.content,J=(T=z.settings)==null?void 0:T._assetId,Z=(q=z.settings)==null?void 0:q.mediaType;let B="image";Z?B=Z:w(H)?B="video":v(H)&&(B="audio"),y.push({url:H,type:B,assetId:J})}}}),y},[e,t,n]),c=_.useCallback(b=>{const g=e.filter(y=>y.to===b&&(!y.inputType||y.inputType==="default"));for(const y of g){const w=t.get(y.from);if((w==null?void 0:w.type)==="preview"){const v=w.previewMjImages;if(v&&v.length>1&&!w.selectedPreviewImage)return!0}}return!1},[e,t,n]),u=_.useCallback((b,g)=>{var v,m,z;const y=e.find(C=>C.to===b&&(C.inputType||"default")===g);if(!y)return null;const w=t.get(y.from);return w&&(w.type==="text-node"||w.type==="custom-agent"||w.type==="novel-input")&&(((v=w.settings)==null?void 0:v.text)||w.prompt||w.content||((m=w.settings)==null?void 0:m.outputContent)||((z=w.settings)==null?void 0:z.novelContent)||"").trim()||null},[e,t,n]),d=_.useCallback((b,g)=>{const y=e.find(v=>v.to===b&&(v.inputType||"default")===g);if(!y)return null;const w=t.get(y.from);if(!w)return null;if(w.type==="preview"){if(w.selectedPreviewImage)return w.selectedPreviewImage;if(w.previewMjImages&&w.previewMjImages.length>0)return w.previewMjImages[0]}return w.content||null},[e,t,n]),h=_.useCallback(b=>{const g=e.filter(w=>w.to===b&&(!w.inputType||w.inputType==="default")),y=[];return g.forEach(w=>{const v=t.get(w.from);v&&(v.type==="camera-movement"||v.type==="professional-camera")&&y.push(v)}),y},[e,t,n]),p=_.useCallback(b=>{const g=e.filter(w=>w.to===b&&(!w.inputType||w.inputType==="default")),y=[];return g.forEach(w=>{const v=t.get(w.from);v&&v.type==="text-node"&&y.push(v)}),y},[e,t,n]),f=_.useCallback(b=>{const g=e.filter(w=>w.to===b&&(!w.inputType||w.inputType==="default")),y=[];return g.forEach(w=>{const v=t.get(w.from);v&&v.type==="custom-agent"&&y.push(v)}),y},[e,t,n]);return{getConnectedVideoInputNode:r,getConnectedVideoAnalyzeNode:i,groupKeyframesByTime:a,getConnectedInputImages:o,getConnectedInputItems:l,hasMultiImageSource:c,getConnectedImageForInput:d,getConnectedTextForInput:u,getConnectedDirectorNodes:h,getConnectedTextNodes:p,getConnectedAgentNodes:f}}function HZ({selectedNodeIds:e,connectingSource:t,connectingTarget:n,connectingInputType:r,multiConnectingSourceIds:i,multiConnectingTargetIds:a,dragStartPos:o,nodeStartPos:l,dragElementRef:c,dragNodeIdRef:u,setSelectedNodeId:d,setSelectedNodeIds:h,onSelectionNotFromBoxSelect:p,setDragNodeId:f,setResizingNodeId:b,setResizeDirection:g,setConnections:y,setConnectingSource:w,setConnectingTarget:v,setConnectingInputType:m,setMultiConnectingSourceIds:z,setMultiConnectingTargetIds:C,generateId:E,setNodes:I,nodesRef:R,selectedNodeIdsRef:A}){const O=_.useCallback((X,T)=>{if(X.button!==0)return;const q=X.target;if(!(q.tagName==="INPUT"||q.tagName==="TEXTAREA"||q.tagName==="SELECT"||q.tagName==="BUTTON"||q.classList.contains("connector")||q.closest(".connector"))){if(X.stopPropagation(),X.ctrlKey||X.metaKey)p==null||p(),h(H=>{const J=new Set(H);return J.has(T.id)?J.delete(T.id):J.add(T.id),J.size===1?d(Array.from(J)[0]):d(null),J});else{p==null||p();const H=e.has(T.id),J=H&&e.size>1?e:new Set([T.id]);if(H&&e.size>1?d(T.id):(d(T.id),h(new Set([T.id]))),X.altKey){const B=R.current.filter(V=>J.has(V.id));if(B.length>0){const V=new Set(B.map(se=>se.id)),N=["progress","status","isGenerating","_agentRunning","_executeTrigger"],j=new Map,k=B.map(se=>{const ie=se.settings?{...se.settings}:{},oe={};for(const ee of Object.keys(ie))N.includes(ee)||(oe[ee]=ie[ee]);se.type==="custom-agent"&&(oe._agentRunning=!1,oe._executeTrigger=void 0);const re={...se,id:E(),x:se.x,y:se.y,isGenerating:!1,extractingFrames:!1,isMasking:!1,errorMsg:void 0,settings:Object.keys(oe).length>0?oe:void 0,markers:se.markers?se.markers.map(ee=>({...ee,id:E()})):void 0};return j.set(se.id,re),re}),W=j.get(T.id),M=new Set(k.map(se=>se.id)),Y=new Map;for(const[se,ie]of j.entries())Y.set(se,ie.id);I(se=>[...se,...k]),R.current=[...R.current,...k],y(se=>{const ie=se.filter(re=>V.has(re.from)&&V.has(re.to));if(ie.length===0)return se;const oe=ie.map((re,ee)=>({...re,id:E(),from:Y.get(re.from),to:Y.get(re.to)}));return[...se,...oe]}),h(M),A&&(A.current=M),d(W.id),f(W.id),u.current=W.id,l.current={x:W.x,y:W.y},o.current={x:X.clientX,y:X.clientY},c.current=null,document.body.classList.add("canvas-interacting");return}}}f(T.id),o.current={x:X.clientX,y:X.clientY},l.current={x:T.x,y:T.y},document.body.classList.add("canvas-interacting"),c.current=X.currentTarget.closest("[data-node-id]"),u.current=T.id}},[e,d,h,f,I,R,o,l,c,u,E,p,A]),F=_.useCallback((X,T)=>{if(a&&a.length>0){X.stopPropagation();const q=a.filter(H=>H!==T.id);if(q.length>0){const H=q.map(J=>({id:E(),from:T.id,to:J}));y(J=>[...J,...H])}C&&C(null);return}if(i&&i.length>0){X.stopPropagation();const q=i.filter(H=>H!==T.id);if(q.length>0){const H=q.map(J=>({id:E(),from:J,to:T.id}));y(J=>[...J,...H])}z&&z(null),C&&C(null);return}if(t&&t!==T.id){X.stopPropagation();const q={id:E(),from:t,to:T.id};y(H=>[...H,q]),w(null);return}if(n&&n!==T.id){X.stopPropagation();const q={id:E(),from:T.id,to:n,...r&&r!=="default"?{inputType:r}:{}};y(H=>[...H,q]),v(null),m(null);return}},[t,n,r,i,a,E,y,w,v,m,z,C]),L=_.useCallback((X,T)=>{b(X),g(T)},[b,g]);return{handleNodeMouseDown:O,handleNodeMouseUp:F,handleStartResize:L}}function GZ({canvasRef:e,setView:t,isZoomLocked:n=!1}){_.useEffect(()=>{const r=e.current;if(!r)return;const i=a=>{if(n)return;const o=a.target,l=o.closest(".custom-scrollbar")||o.closest(".rh-scroll-minimal");if(l){const E=l;if(E.classList.contains("max-h-64")||E.classList.contains("overflow-y-auto")){a.preventDefault(),a.stopPropagation(),a.stopImmediatePropagation();const R=E.scrollHeight-E.clientHeight,A=E.scrollTop,O=Math.max(0,Math.min(R,A+a.deltaY));E.scrollTop=O;return}}if(o.closest("[data-model-select-area]")){a.preventDefault(),a.stopPropagation(),a.stopImmediatePropagation();return}const u=o.closest("[data-table-editor-scroll]");if(u){a.preventDefault(),a.stopPropagation(),a.stopImmediatePropagation();const E=window.getComputedStyle(u);if(E.overflowY==="auto"||E.overflowY==="scroll"||E.overflow==="auto"){const I=u.scrollHeight-u.clientHeight,R=u.scrollTop,A=Math.max(0,Math.min(I,R+a.deltaY));u.scrollTop=A}return}const d=o.closest("[data-chart-json-code]");if(d){const E=o.tagName==="TEXTAREA"?o:d.querySelector("textarea");if(E){a.preventDefault(),a.stopPropagation(),a.stopImmediatePropagation();const I=E.scrollHeight-E.clientHeight,R=E.scrollTop,A=Math.max(0,Math.min(I,R+a.deltaY));E.scrollTop=A}return}const h=o.closest("[data-chart-style-dropdown]");if(h){a.preventDefault(),a.stopPropagation(),a.stopImmediatePropagation();const E=h.scrollHeight-h.clientHeight,I=h.scrollTop,R=Math.max(0,Math.min(E,I+a.deltaY));h.scrollTop=R;return}if(o.closest("[data-chart-cell-area]")){let E=null;if(o.tagName==="TEXTAREA")E=o;else{const I=o.closest("[data-chart-cell]");I&&(E=I.querySelector("textarea"))}if(E){a.preventDefault(),a.stopPropagation(),a.stopImmediatePropagation();const I=E.scrollHeight-E.clientHeight,R=E.scrollTop,A=Math.max(0,Math.min(I,R+a.deltaY));E.scrollTop=A}return}const f=o.closest("[data-table-editor-prompt]");if(f){const E=o.tagName==="TEXTAREA"?o:f.querySelector("textarea");if(E){a.preventDefault(),a.stopPropagation(),a.stopImmediatePropagation();const I=E.scrollHeight-E.clientHeight,R=E.scrollTop,A=Math.max(0,Math.min(I,R+a.deltaY));E.scrollTop=A}return}let b=!1,g=null;if(o.tagName==="TEXTAREA"){const E=o.hasAttribute("data-scrollable"),I=o.hasAttribute("data-node-id")||o.hasAttribute("data-node-type")||o.closest('[data-node-type="text-node"]')||o.closest(".text-node-container")||o.closest('[class*="custom-agent"]');if(E||I){a.preventDefault(),a.stopPropagation(),a.stopImmediatePropagation();const R=o;R.scrollTop+=a.deltaY;return}}if(o.getAttribute("contenteditable")==="true"){a.preventDefault(),a.stopPropagation(),a.stopImmediatePropagation(),o.scrollTop+=a.deltaY;return}const y=o.closest(".grid.overflow-y-auto, .grid.custom-scrollbar");if(y){const E=window.getComputedStyle(y);(E.overflowY==="auto"||E.overflowY==="scroll"||y.classList.contains("overflow-y-auto")||y.classList.contains("custom-scrollbar"))&&(b=!0,g=y)}if(!g){let E=o;for(;E&&E!==r;){if(E.classList){const I=E.classList.contains("storyboard-container")||E.classList.contains("flex")&&E.classList.contains("flex-col")&&E.classList.contains("h-full")&&E.classList.contains("rounded-xl")&&E.classList.contains("overflow-hidden");if(E.classList.contains("video-input-container")||E.classList.contains("video-analyze-container")||I){if(b=!0,I)g=E.querySelector(".flex-1.overflow-y-auto.custom-scrollbar"),g||(g=E.querySelector(".flex-1.overflow-y-auto"));else if(g=E.querySelector(".grid.overflow-y-auto, .grid.custom-scrollbar"),g||(g=E.querySelector('.overflow-y-auto, .custom-scrollbar, [class*="overflow-y"]')),!g){const A=window.getComputedStyle(E);(A.overflowY==="auto"||A.overflowY==="scroll"||E.classList.contains("custom-scrollbar"))&&(g=E)}break}const R=E.closest(".video-input-container, .video-analyze-container, .storyboard-container");if(R){if(b=!0,g=R.querySelector(".grid.overflow-y-auto, .grid.custom-scrollbar"),g||(g=R.querySelector('.overflow-y-auto, .custom-scrollbar, [class*="overflow-y"]')),!g){const A=window.getComputedStyle(R);(A.overflowY==="auto"||A.overflowY==="scroll")&&(g=R)}break}}E=E.parentElement}}if(b&&g){a.preventDefault(),a.stopPropagation(),a.stopImmediatePropagation();const E=g.scrollHeight-g.clientHeight,I=g.scrollTop,R=Math.max(0,Math.min(E,I+a.deltaY));g.scrollTop=R;return}if(o.closest(".video-input-container .grid")!==null||o.closest(".grid.overflow-y-auto")!==null||o.closest(".grid.custom-scrollbar")!==null){const E=o.closest(".grid.overflow-y-auto, .grid.custom-scrollbar");if(E){a.preventDefault(),a.stopPropagation(),a.stopImmediatePropagation();const I=E.scrollHeight-E.clientHeight,R=E.scrollTop,A=Math.max(0,Math.min(I,R+a.deltaY));E.scrollTop=A;return}}if(o.closest(".grid.overflow-y-auto, .grid.custom-scrollbar, .video-frames-grid, .video-input-container .grid")){a.preventDefault(),a.stopPropagation(),a.stopImmediatePropagation();return}try{a.cancelable&&a.preventDefault()}catch{}const m=r.getBoundingClientRect(),z=a.clientX-m.left,C=a.clientY-m.top;t(E=>{let I;if(a.ctrlKey){const L=1-a.deltaY*.002;I=Math.min(Math.max(L,.85),1.15)}else I=a.deltaY>0?.9:1.1;let R=Math.min(Math.max(E.zoom*I,.1),3);R=Math.round(R*1e4)/1e4;const A=R/E.zoom,O=z-(z-E.x)*A,F=C-(C-E.y)*A;return{zoom:R,x:Math.round(O*100)/100,y:Math.round(F*100)/100}}),typeof window<"u"&&window.dispatchEvent(new CustomEvent("canvasActivity"))};return r.addEventListener("wheel",i,{passive:!1}),()=>{r.removeEventListener("wheel",i)}},[e,t,n])}function RC(e,t,n){const r=`local_clip_${e}_${Date.now()}`;(async()=>{try{await Xr.init();const i=t.type.startsWith("video/")?"pasted-video.mp4":"pasted.png",a=t.name||i;if(!await Xr.saveBlobAsset(r,t,`file://clipboard-paste/${encodeURIComponent(a)}`,"local"))return;n(l=>l.map(c=>c.id===e?{...c,_contentAssetId:r,settings:{...c.settings||{},_assetId:r}}:c))}catch(i){console.warn("[usePasteHandler] local cache for paste failed:",i)}})()}function qZ({selectedNodeIdRef:e,nodesRef:t,setNodes:n,onFilesPasted:r}){_.useEffect(()=>{let i=!1;const a=async o=>{var g,y;const l=o.target;if(l.tagName==="INPUT"||l.tagName==="TEXTAREA"||l.isContentEditable||i)return;const u=o.clipboardData,d=(((g=u==null?void 0:u.files)==null?void 0:g.length)||0)>0,h=Array.from((u==null?void 0:u.items)||[]).filter(w=>w.kind==="file").map(w=>w.getAsFile()).filter(w=>!!w),p=d?Array.from((u==null?void 0:u.files)||[]):h,f=e.current;let b=null;if(f&&(b=t.current.find(w=>w.id===f)),b&&(b.type==="input-image"||b.type==="video-input")){const w=Array.from(((y=o.clipboardData)==null?void 0:y.items)||[]),v=w.find(z=>z.type.startsWith("image/")),m=w.find(z=>z.type.startsWith("video/"));if(v){o.preventDefault(),i=!0;const z=b.id,C=b.type,E=v.getAsFile();if(E){const I=URL.createObjectURL(E);n(R=>{const A=t.current.find(O=>O.id===z);return A?(A.content&&typeof A.content=="string"&&A.content.startsWith("blob:")&&URL.revokeObjectURL(A.content),C==="input-image"?R.map(O=>O.id===z&&O.type==="input-image"?{...O,content:I,_tick:Date.now(),settings:{...O.settings||{},_blobUrl:I,_originalFile:E}}:O):C==="video-input"?R.map(O=>O.id===z&&O.type==="video-input"?{...O,content:I,_tick:Date.now(),settings:{...O.settings||{},_blobUrl:I,_originalFile:E}}:O):R):R}),RC(z,E,n),i=!1}else i=!1;return}if(m){o.preventDefault(),i=!0;const z=b.id,C=b.type,E=m.getAsFile();if(E){const I=URL.createObjectURL(E);n(R=>{const A=t.current.find(O=>O.id===z);return A?(A.content&&typeof A.content=="string"&&A.content.startsWith("blob:")&&URL.revokeObjectURL(A.content),C==="video-input"?R.map(O=>O.id===z&&O.type==="video-input"?{...O,content:I,videoFileName:E.name||"pasted-video.mp4",_tick:Date.now(),settings:{...O.settings||{},_blobUrl:I,_originalFile:E}}:O):C==="input-image"?R.map(O=>O.id===z&&O.type==="input-image"?{...O,content:I,settings:{...O.settings||{},mediaType:"video",videoFileName:E.name||"pasted-video.mp4",_blobUrl:I,_originalFile:E},_tick:Date.now()}:O):R):R}),RC(z,E,n),i=!1}else i=!1;return}}if(p.length>0&&r){o.preventDefault(),i=!0;try{await r(p)}finally{i=!1}}};return window.addEventListener("paste",a),()=>window.removeEventListener("paste",a)},[e,t,n,r])}async function fv(e,t,n){if(n&&typeof window<"u"&&"__TAURI__"in window){const{invoke:r}=await mn(async()=>{const{invoke:a}=await Promise.resolve().then(()=>tf);return{invoke:a}},void 0,import.meta.url),i=await r("proxy_fetch_raw",{args:{url:e,method:"GET",headers:t,timeoutSecs:45}});return new Response(i.body,{status:i.status})}return fetch(e,{method:"GET",headers:t})}function f$(e){return e>=200&&e<400||e===401||e===403}async function KZ(e,t){const n=e.replace(/\/+$/,""),r=!0;let i=await fv(`${n}/health`,t,r);return f$(i.status)?(console.log("[API Test] Seedance/Seedream: /health HTTP",i.status),i):(console.log(`[API Test] Seedance/Seedream: /health -> HTTP ${i.status},尝试 /v1/models`),i=await fv(`${n}/v1/models`,t,r),f$(i.status)?(console.log("[API Test] Seedance/Seedream: /v1/models HTTP",i.status),i):(console.log(`[API Test] Seedance/Seedream: /v1/models -> HTTP ${i.status},回退 GET /(测站点连通)`),fv(`${n}/`,{Accept:"text/html,application/json;q=0.9,*/*;q=0.8"},r)))}function XZ({apiConfigs:e,globalApiKey:t}){const[n,r]=_.useState(null),[i,a]=_.useState({}),o=_.useCallback(async c=>{r(c),a(h=>({...h,[c]:"idle"}));const u=e.find(h=>h.id===c),d=(u==null?void 0:u.key)||t;if(!d){console.log(`[API Test] ${c} 缺少 API Key`),a(h=>({...h,[c]:"error"})),r(null);return}try{const h=((u==null?void 0:u.url)||"https://ai.comfly.chat").replace(/\/+$/,"");console.log(`[API Test] 测试 ${c}:`,{baseUrl:h,apiKey:d?"***已设置***":"未设置"});let p,f={Authorization:`Bearer ${d}`};e0(c)?(p=`${h}/v1beta/models`,f={"x-goog-api-key":d}):c==="z-image-official"||c==="wan-2.6-official"||c==="wan-2.6-image-official"?p=`${h}/api/v1/services/aigc/text-generation/qwen-turbo`:pl(c)||_y(c)?p=`${h.replace(/\/+$/,"")}/health 或 /v1/models`:p=`${h}/v1/models`,console.log(`[API Test] 请求: ${p}`);const g=pl(c)||_y(c)?await KZ(h,f):await fv(p,f,!1);if(console.log(`[API Test] ${c} 响应状态:`,g.status),e0(c))if(g.ok)a(y=>({...y,[c]:"success"}));else{const y=await g.text();console.log(`[API Test] Gemini 官方 ${c} 响应:`,g.status,y==null?void 0:y.slice(0,200)),a(w=>({...w,[c]:"error"}))}else pl(c)||_y(c)?f$(g.status)?a(y=>({...y,[c]:"success"})):(console.log(`[API Test] ${c} 测连未通过,最终 HTTP ${g.status}`),a(y=>({...y,[c]:"error"}))):c==="z-image-official"||c==="wan-2.6-official"||c==="wan-2.6-image-official"?g.status===401||g.status===403?(console.log(`[API Test] ${c} API Key 无效`),a(y=>({...y,[c]:"error"}))):g.status>=500?(console.log(`[API Test] ${c} 服务器错误`),a(y=>({...y,[c]:"error"}))):(console.log(`[API Test] ${c} 连接成功`),a(y=>({...y,[c]:"success"}))):g.ok?a(y=>({...y,[c]:"success"})):a(y=>({...y,[c]:"error"}))}catch(h){console.error(`[API Test] ${c} 测试失败:`,h),a(p=>({...p,[c]:"error"}))}r(null)},[e,t]),l=_.useCallback(c=>{if(!c)return"bg-zinc-600";const u=i[c];if(u==="success")return"bg-green-500 shadow-[0_0_8px_rgba(34,197,94,0.8)]";if(u==="error")return"bg-red-500";const d=e.find(h=>h.id===c);return d!=null&&d.key||t?"bg-zinc-400":"bg-zinc-700"},[i,e,t]);return{apiTesting:n,apiStatus:i,testApiConnection:o,getStatusColor:l}}const S1=new Set;function YZ({history:e}){const t=_.useRef(new Set);_.useEffect(()=>{const n=new Set(e.map(a=>a.id)),r=t.current,i=new Set;r.forEach(a=>{n.has(a)||(i.add(a),S1.delete(a))}),t.current=n,e.forEach(async a=>{if(!i.has(a.id)&&!S1.has(a.id)&&a.status==="completed"){S1.add(a.id);const o=[],l=!!a._assetId,c=a._mjAssetIds;a.url&&typeof a.url=="string"&&a.url.startsWith("blob:")&&(l||o.push({url:a.url,id:a.id})),a.mjImages&&Array.isArray(a.mjImages)&&a.mjImages.forEach((u,d)=>{u&&typeof u=="string"&&u.startsWith("blob:")&&(c!=null&&c[d]||o.push({url:u,id:`${a.id}_mj_${d}`}))}),a.audioUrl&&typeof a.audioUrl=="string"&&a.audioUrl!==a.url&&a.audioUrl.startsWith("blob:")&&o.push({url:a.audioUrl,id:`${a.id}_audio`}),a.url&&typeof a.url=="string"&&(a.url.startsWith("http://")||a.url.startsWith("https://"))&&uo(a,a.id).catch(()=>{});for(const{url:u,id:d}of o)try{if(await Xr.hasAsset(d))continue;try{const p=await fetch(u);if(!p.ok)throw new Error(`HTTP ${p.status}`);const f=await p.blob(),b=await Xr.saveBlobAsset(d,f,u)}catch{S1.delete(a.id)}}catch{}}})},[e])}const JZ=({nodes:e,nodesRef:t,handleNodeMouseDown:n,handleNodeMouseUp:r,deleteNode:i,handleStartResize:a,handleStartConnectFromOutput:o,handleStartConnectFromInput:l,handleConnectToInput:c,handleConnectToOutput:u})=>{const d=_.useRef(new Map),h=_.useCallback(p=>(d.current.set(p,{onMouseDown:f=>{var g;const b=(g=t.current)==null?void 0:g.find(y=>y.id===p);b&&n(f,b)},onMouseUp:f=>{var g;const b=(g=t.current)==null?void 0:g.find(y=>y.id===p);b&&r(f,b)},onDelete:()=>i(p),onStartResize:f=>a(p,f),onStartConnectFromOutput:f=>o(f,p),onStartConnectFromInput:f=>l(f,p),onConnectToInput:f=>c(f,p),onConnectToOutput:f=>u(f,p)}),d.current.get(p)),[t,n,r,i,a,o,l,c,u]);return _.useEffect(()=>{const p=new Set(e.map(f=>f.id));d.current.forEach((f,b)=>{p.has(b)||d.current.delete(b)})},[e.length]),{getNodeCallbacks:h}},ZZ=({lightboxItem:e,setLightboxItem:t,setHistory:n})=>({handleNavigate:_.useCallback(i=>{if(e&&"mjImages"in e&&e.mjImages&&e.mjImages.length>i&&i>=0&&e.type!=="audio"){const a=Math.max(0,Math.min(i,e.mjImages.length-1));"id"in e&&e.id&&n(o=>o.map(l=>l.id===e.id?{...l,url:e.mjImages[a],selectedMjImageIndex:a}:l)),t({...e,url:e.mjImages[a],selectedMjImageIndex:a})}},[e,t,n])}),QZ=({maxHistorySize:e=50}={})=>{const[t,n]=_.useState([]),[r,i]=_.useState(-1),a=_.useRef(!1),o=_.useCallback((h,p)=>{a.current||(n(f=>{const b=r{const w={...y};return y.settings&&(w.settings={...y.settings}),y.frames&&(w.frames=[...y.frames]),y.shots&&(w.shots=[...y.shots]),y.previewMjImages&&(w.previewMjImages=[...y.previewMjImages]),y.selectedKeyframes&&(w.selectedKeyframes=[...y.selectedKeyframes]),y.analysisResults&&(w.analysisResults=[...y.analysisResults]),w});return b.push({nodes:g,connections:JSON.parse(JSON.stringify(p))}),b.length>e?b.slice(b.length-e):b}),i(f=>r{if(r<=0)return console.log("[History] 没有可撤销的操作"),null;const h=r-1;i(h);const p=t[h];return console.log("[History] 撤销到索引:",h),p},[r,t]),c=_.useCallback(()=>{if(r>=t.length-1)return console.log("[History] 没有可重做的操作"),null;const h=r+1;i(h);const p=t[h];return console.log("[History] 重做到索引:",h),p},[r,t]),u=_.useCallback(h=>{a.current=h},[]),d=_.useCallback(()=>{n([]),i(-1)},[]);return{saveState:o,undo:l,redo:c,canUndo:r>0,canRedo:rt.has(p.id));if(o.length===0)return e;const l=o.reduce((p,f)=>p+f.x,0)/o.length,c=o.reduce((p,f)=>p+f.y,0)/o.length,u=320,d=280;return e.map(p=>{if(!t.has(p.id))return p;const f=o.indexOf(p);let b,g;if(a==="horizontal"){const y=Math.floor(f/i),w=f%i;b=l-i*(u+r)/2+w*(u+r),g=c-Math.ceil(o.length/i)*(d+r)/2+y*(d+r)}else{const y=Math.floor(f/i),w=f%i;b=l-Math.ceil(o.length/i)*(u+r)/2+y*(u+r),g=c-i*(d+r)/2+w*(d+r)}return{...p,x:Math.round(b),y:Math.round(g)}})}function tQ(e,t,n){const r=e.filter(R=>t.has(R.id));if(r.length===0)return e;const i=new Map,a=new Map;r.forEach(R=>{i.set(R.id,[]),a.set(R.id,0)}),n.forEach(R=>{if(t.has(R.from)&&t.has(R.to)){const A=i.get(R.from)||[];A.push(R.to),i.set(R.from,A),a.set(R.to,(a.get(R.to)||0)+1)}});const o=[],l=new Set;function c(R){const A=new Set,O=[R];for(;O.length>0;){const F=O.shift();if(A.has(F))continue;A.add(F),(i.get(F)||[]).forEach(X=>{A.has(X)||O.push(X)}),n.forEach(X=>{t.has(X.from)&&t.has(X.to)&&X.to===F&&!A.has(X.from)&&O.push(X.from)})}return A}r.forEach(R=>{if(!l.has(R.id)){const A=c(R.id);o.push(A),A.forEach(O=>l.add(O))}}),console.log(`[autoAlignNodes] 检测到 ${o.length} 个独立工作流`);const u=r.reduce((R,A)=>R+A.x,0)/r.length,d=r.reduce((R,A)=>R+A.y,0)/r.length,h=380,p=280,f=60,b=100,g=new Map;o.forEach((R,A)=>{const O=Array.from(R),F=new Map;O.forEach(X=>{F.set(X,0)}),n.forEach(X=>{R.has(X.from)&&R.has(X.to)&&F.set(X.to,(F.get(X.to)||0)+1)});const L=(X,T)=>{if(g.has(X))return;g.set(X,T),(i.get(X)||[]).forEach(H=>{R.has(H)&&L(H,T+1)})};O.forEach(X=>{F.get(X)===0&&L(X,0)}),O.forEach(X=>{g.has(X)||L(X,0)})});const y=new Map,w=new Map;g.forEach((R,A)=>{y.set(R,(y.get(R)||0)+1),w.has(R)||w.set(R,[]),w.get(R).push(A)});const v=new Map;y.forEach((R,A)=>{const O=R*h+Math.max(0,R-1)*f;v.set(A,O)});const m=Math.max(...Array.from(g.values()),0),z=(p+b)*m+p,C=d-z/2,E=new Map;return w.forEach((R,A)=>{R.forEach((O,F)=>{E.set(O,F)})}),e.map(R=>{if(!t.has(R.id))return R;const A=g.get(R.id)||0,O=y.get(A)||1,F=E.get(R.id)||0,L=v.get(A)||0,T=u-L/2+F*(h+f),q=C+A*(p+b);return console.log(`[autoAlignNodes] 节点 ${R.id.substring(0,8)}: 层=${A}, 位置=${F}/${O}, X=${Math.round(T)}, Y=${Math.round(q)}`),{...R,x:Math.round(T),y:Math.round(q)}})}const nQ=({nodes:e,connections:t,selectedNodeIds:n,setNodes:r})=>{const i=_.useCallback(()=>{if(n.size===0){console.warn("[useNodeLayout] 没有选中任何节点");return}const l=eQ(e,n,{spacing:100,columns:3,direction:"horizontal"});r(l),console.log(`[useNodeLayout] 已整理 ${n.size} 个节点`)},[e,n,r]),a=_.useCallback(()=>{if(n.size===0){console.warn("[useNodeLayout] 没有选中任何节点");return}const l=tQ(e,n,t);r(l),console.log(`[useNodeLayout] 已对齐 ${n.size} 个节点`)},[e,n,t,r]),o=_.useCallback(()=>{if(n.size===0){console.warn("[useNodeLayout] 没有选中任何节点");return}let l=0;t.forEach(d=>{n.has(d.from)&&n.has(d.to)&&l++});const c=n.size*(n.size-1),u=c>0?l/c:0;console.log(`[useNodeLayout] 连接数: ${l}, 连接密度: ${(u*100).toFixed(2)}%`),u>.2||l>n.size*.5?(console.log("[useNodeLayout] 检测到工作流结构,使用树形布局"),a()):(console.log("[useNodeLayout] 使用网格布局"),i())},[e,n,t,r,i,a]);return{autoLayout:i,autoAlign:a,smartAutoLayout:o}},qO="qiaodoumayi_feature_visibility",PC="qiaodoumayi_feature_version",OC="3.2",m$="zhengxianyang199581",rQ="zhengxianyang",sQ="291973855";function KO(e){let t=0;for(let n=0;n{if(localStorage.getItem(PC)!==OC){console.log("[FeatureVisibility] 检测到版本更新,重置密码哈希");const z={showBaseUrl:!0,showJimengModels:!1,showWatermark:!0,showZImageTurbo:!1,showGeminiImageOfficialModels:g$(),showGrsaiModels:!1,showSeedanceHiddenFeatures:!1,passwordHash:Fv()};LC(z),localStorage.setItem(PC,OC)}const m=W2();return{showBaseUrl:m.showBaseUrl,showJimengModels:m.showJimengModels,showWatermark:m.showWatermark,showZImageTurbo:m.showZImageTurbo,showGeminiImageOfficialModels:m.showGeminiImageOfficialModels,showGrsaiModels:m.showGrsaiModels,showSeedanceHiddenFeatures:m.showSeedanceHiddenFeatures,isAuthenticated:!1,authMode:"none"}}),n=_.useCallback(w=>{const v=W2();let m="none";if(iQ(w,v.passwordHash))m="full";else if(w===rQ)m="geminiOnly";else if(w===sQ)m="seedanceOnly";else return!1;return t(z=>({...z,isAuthenticated:!0,authMode:m})),!0},[]),r=_.useCallback(w=>{if(!e.isAuthenticated)return console.warn("需要先通过密码验证才能修改功能可见性"),!1;const v=W2();let m;return e.authMode==="geminiOnly"?m={showBaseUrl:v.showBaseUrl,showJimengModels:v.showJimengModels,showWatermark:v.showWatermark,showZImageTurbo:v.showZImageTurbo,showGeminiImageOfficialModels:w.showGeminiImageOfficialModels??v.showGeminiImageOfficialModels,showGrsaiModels:w.showGrsaiModels??v.showGrsaiModels,showSeedanceHiddenFeatures:v.showSeedanceHiddenFeatures,passwordHash:v.passwordHash}:e.authMode==="seedanceOnly"?m={showBaseUrl:v.showBaseUrl,showJimengModels:v.showJimengModels,showWatermark:v.showWatermark,showZImageTurbo:v.showZImageTurbo,showGeminiImageOfficialModels:v.showGeminiImageOfficialModels,showGrsaiModels:v.showGrsaiModels,showSeedanceHiddenFeatures:w.showSeedanceHiddenFeatures??v.showSeedanceHiddenFeatures,passwordHash:v.passwordHash}:m={showBaseUrl:w.showBaseUrl??v.showBaseUrl,showJimengModels:w.showJimengModels??v.showJimengModels,showWatermark:w.showWatermark??v.showWatermark,showZImageTurbo:w.showZImageTurbo??v.showZImageTurbo,showGeminiImageOfficialModels:w.showGeminiImageOfficialModels??v.showGeminiImageOfficialModels,showGrsaiModels:w.showGrsaiModels??v.showGrsaiModels,showSeedanceHiddenFeatures:w.showSeedanceHiddenFeatures??v.showSeedanceHiddenFeatures,passwordHash:v.passwordHash},LC(m),t(z=>({...z,showBaseUrl:m.showBaseUrl,showJimengModels:m.showJimengModels,showWatermark:m.showWatermark,showZImageTurbo:m.showZImageTurbo,showGeminiImageOfficialModels:m.showGeminiImageOfficialModels,showGrsaiModels:m.showGrsaiModels,showSeedanceHiddenFeatures:m.showSeedanceHiddenFeatures})),!0},[e.isAuthenticated,e.authMode]),i=_.useCallback(()=>r({showBaseUrl:!e.showBaseUrl}),[e.showBaseUrl,r]),a=_.useCallback(()=>r({showJimengModels:!e.showJimengModels}),[e.showJimengModels,r]),o=_.useCallback(()=>r({showWatermark:!e.showWatermark}),[e.showWatermark,r]),l=_.useCallback(()=>r({showZImageTurbo:!e.showZImageTurbo}),[e.showZImageTurbo,r]),c=_.useCallback(()=>r({showGeminiImageOfficialModels:!e.showGeminiImageOfficialModels}),[e.showGeminiImageOfficialModels,r]),u=_.useCallback(()=>r({showGrsaiModels:!e.showGrsaiModels}),[e.showGrsaiModels,r]),d=_.useCallback(()=>r({showSeedanceHiddenFeatures:!e.showSeedanceHiddenFeatures}),[e.showSeedanceHiddenFeatures,r]),h=_.useCallback(()=>{t(w=>({...w,isAuthenticated:!1,authMode:"none"}))},[]),p=_.useCallback(w=>w?!!(w.includes("jimeng-5.0")||w.includes("jimeng-4.6")||w.includes("jimeng-4.5")||w.includes("jimeng-4.1")||w.includes("jimeng-4.0")||w.includes("jimeng-3.1")||w.includes("jimeng-video-3.0")||w.includes("jimeng-video-3.5-pro")||w.includes("jimeng-video-seedance-2.0")):!1,[]),f=_.useCallback(w=>w?w==="z-image-turbo":!1,[]),b=_.useCallback(w=>e.showJimengModels?w:w.filter(v=>!p(v.id)),[e.showJimengModels,p]),g=_.useCallback(w=>e.showZImageTurbo?w:w.filter(v=>!f(v.id)),[e.showZImageTurbo,f]),y=_.useCallback(w=>{let v=w;return e.showJimengModels||(v=v.filter(m=>!p(m.id))),e.showZImageTurbo||(v=v.filter(m=>!f(m.id))),e.showGeminiImageOfficialModels||(v=v.filter(m=>!e0(m.id)&&!wc(m.id))),e.showGrsaiModels||(v=v.filter(m=>!Xd(m.id))),e.showSeedanceHiddenFeatures||(v=v.filter(m=>m.id!=="seedance-2.0")),v},[e.showJimengModels,e.showZImageTurbo,e.showGeminiImageOfficialModels,e.showGrsaiModels,e.showSeedanceHiddenFeatures,p,f]);return{showBaseUrl:e.showBaseUrl,showJimengModels:e.showJimengModels,showWatermark:e.showWatermark,showZImageTurbo:e.showZImageTurbo,showGeminiImageOfficialModels:e.showGeminiImageOfficialModels,showGrsaiModels:e.showGrsaiModels,showSeedanceHiddenFeatures:e.showSeedanceHiddenFeatures,isAuthenticated:e.isAuthenticated,authMode:e.authMode,authenticate:n,setVisibility:r,toggleBaseUrl:i,toggleJimengModels:a,toggleWatermark:o,toggleZImageTurbo:l,toggleGeminiImageOfficialModels:c,toggleGrsaiModels:u,toggleSeedanceHiddenFeatures:d,resetAuthentication:h,isJimengModel:p,isZImageTurboModel:f,filterJimengModels:b,filterZImageTurboModel:g,filterModels:y}}function BC(e,t){const n=tm.find(r=>r.id===e);return n!=null&&n.resolutions&&n.resolutions.length>0?n.resolutions[0]:t==="Image"?"1K":"1080P"}function oQ(e,t){try{const n=localStorage.getItem("modelSettings");if(n){const i=JSON.parse(n);if(i[e])return{model:e,...i[e]}}const r=BC(e,t);return t==="Image"?{model:e,resolution:r,ratio:"1:1"}:{model:e,resolution:r,ratio:"16:9"}}catch(n){console.error("[ModelSettings] Failed to get model settings:",n);const r=BC(e,t);return t==="Image"?{model:e,resolution:r,ratio:"1:1"}:{model:e,resolution:r,ratio:"16:9"}}}function ex(e){try{const t=e==="Image"?"selectedImageModel":"selectedVideoModel",n=localStorage.getItem(t);if(!n)return null;const r=JSON.parse(n);return oQ(r,e)}catch(t){return console.error("[ModelSettings] Failed to get current model settings:",t),null}}function lQ(){try{if(localStorage.getItem("modelSettingsMigrated")==="true")return;console.log("[ModelSettings] Starting migration from old settings...");const t={},n=localStorage.getItem("globalImageDefaults");if(n)try{const i=JSON.parse(n);i.model&&(t[i.model]={resolution:i.resolution||"1K",ratio:i.ratio||"1:1"},localStorage.setItem("selectedImageModel",JSON.stringify(i.model)),console.log("[ModelSettings] Migrated image settings for model:",i.model))}catch(i){console.error("[ModelSettings] Failed to migrate image settings:",i)}const r=localStorage.getItem("globalVideoDefaults");if(r)try{const i=JSON.parse(r);i.model&&(t[i.model]={resolution:i.resolution||"1080P",ratio:i.ratio||"16:9"},localStorage.setItem("selectedVideoModel",JSON.stringify(i.model)),console.log("[ModelSettings] Migrated video settings for model:",i.model))}catch(i){console.error("[ModelSettings] Failed to migrate video settings:",i)}Object.keys(t).length>0&&(localStorage.setItem("modelSettings",JSON.stringify(t)),console.log("[ModelSettings] Migration completed. Settings:",t)),localStorage.setItem("modelSettingsMigrated","true")}catch(e){console.error("[ModelSettings] Migration failed:",e)}}const x$=["#ffffff","#ef4444","#f97316","#eab308","#22c55e","#06b6d4","#3b82f6","#8b5cf6"];function Vp(e,t){const n=t.filter(c=>e.includes(c.id));if(n.length===0)return{x:0,y:0,width:0,height:0};const r=20;let i=1/0,a=1/0,o=-1/0,l=-1/0;return n.forEach(c=>{i=Math.min(i,c.x),a=Math.min(a,c.y),o=Math.max(o,c.x+c.width),l=Math.max(l,c.y+c.height)}),{x:i-r,y:a-r,width:o-i+r*2,height:l-a+r*2}}function XO(e,t){if(e.length===0)return!1;const n=t.filter(i=>i.collapsed),r=new Set;return n.forEach(i=>i.nodeIds.forEach(a=>r.add(a))),e.every(i=>r.has(i))}function UC(){return`group-${Date.now()}-${Math.random().toString(36).substr(2,9)}`}function cQ(e){const n=e.filter(i=>i.collapsed).map(i=>{const a=i.name.match(/^收纳\s*(\d+)?$/);return a?a[1]?parseInt(a[1],10):1:0}).filter(i=>i>0),r=n.length>0?Math.max(...n):0;return r===0?"收纳 1":`收纳 ${r+1}`}function uQ(e){const t=e.map(r=>{const i=r.name.match(/^新建组\s*(\d+)?$/);return i?i[1]?parseInt(i[1]):1:0}).filter(r=>r>0),n=t.length>0?Math.max(...t):0;return n===0?"新建组":`新建组 ${n+1}`}const dQ=({groups:e,setGroups:t,nodes:n,setNodes:r,connections:i,executeNode:a})=>{const o=_.useCallback((z,C)=>{if(z.length===0)return console.warn("[createGroup] 没有选中任何节点"),null;const E={id:UC(),name:uQ(e),color:C||x$[0],nodeIds:[...z],createdAt:Date.now(),updatedAt:Date.now()};return t(I=>[...I,E]),console.log("[createGroup] 创建分组:",E),E},[e,t]),l=_.useCallback((z,C,E)=>{if(z.length===0)return console.warn("[createCollection] 没有选中任何节点"),null;const I={id:UC(),name:C??cQ(e),color:x$[0],nodeIds:[...z],collapsed:!0,collapsedX:E==null?void 0:E.x,collapsedY:E==null?void 0:E.y,createdAt:Date.now(),updatedAt:Date.now()};return t(R=>[...R,I]),console.log("[createCollection] 收纳:",I.name,I.nodeIds.length,"个节点"),I},[e,t]),c=_.useCallback((z,C,E)=>{t(I=>I.map(R=>R.id===z?{...R,collapsedX:C,collapsedY:E,updatedAt:Date.now()}:R))},[t]),u=_.useCallback(z=>{const C=e.find(R=>R.id===z);if(!C)return;const E=C.collapsedX,I=C.collapsedY;if(E!=null&&I!=null){const R=Vp(C.nodeIds,n),A=R.width>0?R.x+R.width/2:E,O=R.height>0?R.y+R.height/2:I,F=E-A,L=I-O;if(Math.abs(F)>.5||Math.abs(L)>.5){const X=new Set(C.nodeIds);r(T=>T.map(q=>X.has(q.id)?{...q,x:q.x+F,y:q.y+L}:q))}}t(R=>R.filter(A=>A.id!==z)),console.log("[expandCollection] 展开收纳并解组:",z)},[e,n,t,r]),d=_.useCallback(z=>{t(C=>C.filter(E=>E.id!==z)),console.log("[deleteGroup] 删除分组:",z)},[t]),h=_.useCallback((z,C)=>{t(E=>E.map(I=>I.id===z?{...I,name:C,updatedAt:Date.now()}:I))},[t]),p=_.useCallback((z,C)=>{t(E=>E.map(I=>I.id===z?{...I,color:C,updatedAt:Date.now()}:I))},[t]),f=_.useCallback(z=>{t(C=>C.map(E=>E.id===z?{...E,previewCollapsed:!E.previewCollapsed,updatedAt:Date.now()}:E))},[t]),b=_.useCallback((z,C)=>{t(E=>E.map(I=>{if(I.id===z){const R=[...new Set([...I.nodeIds,...C])];return{...I,nodeIds:R,updatedAt:Date.now()}}return I}))},[t]),g=_.useCallback((z,C)=>{t(E=>E.map(I=>{if(I.id===z){const R=I.nodeIds.filter(A=>!C.includes(A));return{...I,nodeIds:R,updatedAt:Date.now()}}return I}).filter(I=>I.nodeIds.length>0))},[t]),y=_.useCallback(async z=>{const C=e.find(E=>E.id===z);if(!C){console.warn("[executeGroup] 分组不存在:",z);return}if(!a){console.warn("[executeGroup] executeNode 函数未提供");return}console.log("[executeGroup] 开始执行分组:",C.name,`共 ${C.nodeIds.length} 个节点`);for(let E=0;EA.id===I);if(!R){console.warn("[executeGroup] 节点不存在:",I);continue}console.log(`[executeGroup] 执行节点 ${E+1}/${C.nodeIds.length}:`,I,R.type);try{await a(I),EsetTimeout(A,50))}catch(A){console.error("[executeGroup] 节点执行失败:",I,A)}}console.log("[executeGroup] 分组执行完成:",C.name)},[e,n,a]),w=_.useCallback((z,C,E)=>{const I=e.find(R=>R.id===z);I&&r(R=>R.map(A=>I.nodeIds.includes(A.id)?{...A,x:A.x+C,y:A.y+E}:A))},[e,r]),v=_.useCallback(async z=>{const C=e.find(E=>E.id===z);if(!C){console.warn("[exportGroupWorkflow] 分组不存在:",z);return}try{const E=new Date().toISOString().replace(/[:.]/g,"-").slice(0,-5),I=`workflow_${C.name}_${E}.json`,R=n.filter(Z=>C.nodeIds.includes(Z.id)),A=new Set(C.nodeIds),O=i.filter(Z=>A.has(Z.from)&&A.has(Z.to));console.log("[exportGroupWorkflow] 开始导出工作流:",C.name),console.log("[exportGroupWorkflow] 节点数:",R.length,"连接数:",O.length);const{serializeProjectData:F}=await mn(async()=>{const{serializeProjectData:Z}=await Promise.resolve().then(()=>Cx);return{serializeProjectData:Z}},void 0,import.meta.url),{sanitizeSensitiveData:L}=await mn(async()=>{const{sanitizeSensitiveData:Z}=await Promise.resolve().then(()=>Do);return{sanitizeSensitiveData:Z}},void 0,import.meta.url);console.log("[exportGroupWorkflow] 正在转换图片和视频为 Base64...");const{data:X,stats:T}=await F(R);console.log(`[exportGroupWorkflow] 转换完成: ${T.converted} 个媒体文件`);const q={version:"2.0",type:"workflow",exportedAt:new Date().toISOString(),groups:[{id:C.id,name:C.name,color:C.color,nodeIds:C.nodeIds,createdAt:C.createdAt,updatedAt:C.updatedAt}],nodes:X,connections:O,stats:{nodeCount:X.length,connectionCount:O.length,mediaCount:T.converted}};console.log("[exportGroupWorkflow] 📦 导出数据包含分组:",q.groups);const H=L(q);let J;try{J=JSON.stringify(H,null,2)}catch(Z){if(Z instanceof RangeError&&Z.message.includes("Invalid string length"))console.warn("数据过大,使用紧凑格式"),J=JSON.stringify(H);else throw Z}if("showSaveFilePicker"in window)try{const B=await(await window.showSaveFilePicker({suggestedName:I,types:[{description:"JSON 工作流文件",accept:{"application/json":[".json"]}}]})).createWritable();await B.write(J),await B.close(),console.log("[exportGroupWorkflow] ✅ 工作流导出成功:",I),console.log("[exportGroupWorkflow] 包含",T.converted,"个图片/视频和分组UI信息")}catch(Z){if(Z.name==="AbortError"){console.log("[exportGroupWorkflow] 用户取消导出");return}throw Z}else{console.warn("[exportGroupWorkflow] 浏览器不支持 File System Access API,使用传统下载");const Z=new Blob([J],{type:"application/json"}),B=URL.createObjectURL(Z),V=document.createElement("a");V.href=B,V.download=I,document.body.appendChild(V),V.click(),document.body.removeChild(V),URL.revokeObjectURL(B),console.log("[exportGroupWorkflow] ✅ 工作流导出成功(传统方式):",I),console.log("[exportGroupWorkflow] 包含",T.converted,"个图片/视频和分组UI信息")}}catch(E){throw console.error("[exportGroupWorkflow] ❌ 导出失败:",E),E}},[e,n,i]),m=_.useCallback(z=>{const C=e.find(E=>E.id===z);return C?Vp(C.nodeIds,n):null},[e,n]);return{createGroup:o,createCollection:l,expandCollection:u,updateCollectionPosition:c,deleteGroup:d,updateGroupName:h,updateGroupColor:p,toggleGroupPreviewCollapsed:f,addNodesToGroup:b,removeNodesFromGroup:g,executeGroup:y,moveGroup:w,getGroupBounds:m,exportGroupWorkflow:v}},hQ=({canvasRef:e,view:t,nodes:n,onGroupCreate:r})=>{const i=_.useRef(!1),a=_.useRef(null),o=_.useRef(null),l=_.useCallback((f,b,g,y)=>{const w=Math.min(f,g),v=Math.max(f,g),m=Math.min(b,y),z=Math.max(b,y),C=(w-t.x)/t.zoom,E=(v-t.x)/t.zoom,I=(m-t.y)/t.zoom,R=(z-t.y)/t.zoom;return n.filter(A=>{const O=A.x+A.width,F=A.y+A.height;return!(OE||FR)}).map(A=>A.id)},[n,t]),c=_.useCallback((f,b,g,y)=>{if(!e.current)return;if(!o.current){const E=document.createElement("div");E.style.cssText=` + position: fixed !important; + border: 3px solid #22c55e !important; + background-color: rgba(34, 197, 94, 0.2) !important; + pointer-events: none !important; + z-index: 2147483647 !important; + box-shadow: 0 0 0 2px rgba(34, 197, 94, 0.4), 0 0 20px rgba(34, 197, 94, 0.3) !important; + display: block !important; + visibility: visible !important; + opacity: 1 !important; + border-radius: 4px !important; + `,E.className="alt-selection-box",E.setAttribute("data-selection-box","true"),document.body.appendChild(E),o.current=E}const w=Math.min(f,g),v=Math.min(b,y),m=Math.abs(g-f),z=Math.abs(y-b),C=e.current.getBoundingClientRect();o.current.style.left=`${C.left+w}px`,o.current.style.top=`${C.top+v}px`,o.current.style.width=`${m}px`,o.current.style.height=`${z}px`},[e]),u=_.useCallback(()=>{o.current&&(o.current.parentNode&&o.current.parentNode.removeChild(o.current),o.current=null)},[]),d=_.useCallback(f=>{var y;if(!f.altKey||f.button!==0)return;const b=f.target;if(b.closest(".node-wrapper")||b.closest(".connector")||b.closest("button")||b.closest("input")||b.closest(".group-toolbar"))return;f.preventDefault(),f.stopPropagation();const g=(y=e.current)==null?void 0:y.getBoundingClientRect();g&&(i.current=!0,a.current={x:f.clientX-g.left,y:f.clientY-g.top},c(a.current.x,a.current.y,a.current.x,a.current.y))},[e,c]),h=_.useCallback(f=>{var w;if(!i.current||!a.current)return;f.preventDefault(),f.stopPropagation();const b=(w=e.current)==null?void 0:w.getBoundingClientRect();if(!b)return;const g=f.clientX-b.left,y=f.clientY-b.top;c(a.current.x,a.current.y,g,y)},[e,c]),p=_.useCallback(f=>{var v;if(!i.current||!a.current)return;f.preventDefault(),f.stopPropagation();const b=(v=e.current)==null?void 0:v.getBoundingClientRect();if(!b)return;const g=f.clientX-b.left,y=f.clientY-b.top,w=l(a.current.x,a.current.y,g,y);w.length>0&&r(w),i.current=!1,a.current=null,u()},[e,l,r,u]);return _.useEffect(()=>{const f=e.current;if(f)return f.addEventListener("mousedown",d),window.addEventListener("mousemove",h),window.addEventListener("mouseup",p),()=>{f.removeEventListener("mousedown",d),window.removeEventListener("mousemove",h),window.removeEventListener("mouseup",p),u()}},[e,d,h,p,u]),{isAltSelecting:i.current}},pQ=()=>{const[e,t]=_.useState(!1);return _.useEffect(()=>{const n=a=>{a.key==="Shift"&&t(!0)},r=a=>{a.key==="Shift"&&t(!1)},i=()=>{t(!1)};return window.addEventListener("keydown",n),window.addEventListener("keyup",r),window.addEventListener("blur",i),()=>{window.removeEventListener("keydown",n),window.removeEventListener("keyup",r),window.removeEventListener("blur",i)}},[]),e},fQ=({nodes:e,selectedNodeIds:t,isActive:n})=>_.useMemo(()=>{if(!n||t.size<2)return null;const i=e.filter(h=>t.has(h.id)&&h.type==="input-image"&&h.content&&h.content.length>0);if(i.length<2)return null;let a=1/0,o=1/0,l=-1/0,c=-1/0;i.forEach(h=>{a=Math.min(a,h.x),o=Math.min(o,h.y),l=Math.max(l,h.x+h.width),c=Math.max(c,h.y+h.height)});const u={x:a,y:o,width:l-a,height:c-o},d={x:l+30,y:o+u.height/2};return{nodeIds:i.map(h=>h.id),bounds:u,dialPosition:d}},[e,t,n]),mQ=({nodes:e,selectedNodeIds:t,isActive:n})=>_.useMemo(()=>{if(!n||t.size<2)return null;const i=e.filter(h=>t.has(h.id));if(i.length<2)return null;let a=1/0,o=1/0,l=-1/0,c=-1/0;i.forEach(h=>{a=Math.min(a,h.x),o=Math.min(o,h.y),l=Math.max(l,h.x+h.width),c=Math.max(c,h.y+h.height)});const u={x:a,y:o,width:l-a,height:c-o},d={x:a-30,y:o+u.height/2};return{nodeIds:i.map(h=>h.id),bounds:u,dialPosition:d}},[e,t,n]);function gQ(e,t){switch(t){case"by-type":return Rm(e.type);case"by-time":return new Date().toISOString().split("T")[0];case"by-group":return"default";case"flat":default:return"all"}}function YO(e,t,n,r){const i={},a=new Set;if(r.mode==="by-group"&&n.length>0){n.forEach(c=>{const u=e.filter(h=>c.nodeIds.includes(h.id)),d=t.filter(h=>c.nodeIds.includes(h.from)&&c.nodeIds.includes(h.to));i[c.name]={nodes:u,connections:d,nodeIds:c.nodeIds},a.add(c.name)});const o=new Set(n.flatMap(c=>c.nodeIds)),l=e.filter(c=>!o.has(c.id));if(l.length>0){const c=t.filter(u=>!o.has(u.from)&&!o.has(u.to));i.未分组={nodes:l,connections:c,nodeIds:l.map(u=>u.id)},a.add("未分组")}}else e.forEach(o=>{const l=gQ(o,r.mode);a.add(l),i[l]||(i[l]={nodes:[],connections:[],nodeIds:[]}),i[l].nodes.push(o),i[l].nodeIds.push(o.id)}),a.forEach(o=>{const l=new Set(i[o].nodeIds);i[o].connections=t.filter(c=>l.has(c.from)&&l.has(c.to))});return{structure:i,metadata:{mode:r.mode,totalNodes:e.length,totalConnections:t.length,categories:Array.from(a).sort(),timestamp:new Date().toISOString()}}}function xQ(e){const t=[];return t.push(`📦 分类导出结构 (${e.metadata.mode})`),t.push(`生成时间: ${e.metadata.timestamp}`),t.push(`总节点数: ${e.metadata.totalNodes}`),t.push(`总连接数: ${e.metadata.totalConnections}`),t.push(""),t.push("📁 文件夹结构:"),e.metadata.categories.forEach(n=>{const r=e.structure[n];t.push(`├── ${n}/`),t.push(`│ ├── nodes.json (${r.nodes.length} 个节点)`),t.push(`│ ├── connections.json (${r.connections.length} 个连接)`),t.push("│ └── metadata.json")}),t.push(""),t.push("📊 分类详情:"),e.metadata.categories.forEach(n=>{const r=e.structure[n];t.push(` • ${n}: ${r.nodes.length} 个节点, ${r.connections.length} 个连接`)}),t.join(` +`)}function bQ(e){const t={};return e.metadata.categories.forEach(n=>{const r=e.structure[n];t[n]={nodes:r.nodes,connections:r.connections,metadata:{nodeCount:r.nodes.length,connectionCount:r.connections.length,nodeTypes:[...new Set(r.nodes.map(i=>i.type))]}}}),{_metadata:e.metadata,categories:t}}function yQ(e,t){if(t.length>0)return"by-group";const n=new Map;return e.forEach(r=>{const i=Rm(r.type);n.set(i,(n.get(i)||0)+1)}),n.size>3,"by-type"}const JO=({nodes:e,connections:t,groups:n,canvasTextBoxes:r=[],canvasDoodleStrokes:i=[],history:a=[],chatSessions:o=[],characterLibrary:l=[],view:c={x:0,y:0,zoom:1},projectName:u="未命名项目",viewportSize:d})=>{const h=_.useCallback((w="by-type")=>YO(e,t,n,{mode:w}),[e,t,n]),p=_.useCallback((w="by-type")=>{const v=h(w);return xQ(v)},[h]),f=_.useCallback((w="by-type")=>{const v=h(w);return bQ(v)},[h]),b=_.useCallback(()=>yQ(e,n),[e,n]),g=_.useCallback(async(w="by-type",v)=>{try{const{serializeProjectData:m}=await mn(async()=>{const{serializeProjectData:B}=await Promise.resolve().then(()=>Cx);return{serializeProjectData:B}},void 0,import.meta.url),{data:z}=await m(e),{data:C}=await m(t),{data:E}=await m(n),{data:I}=await m(a),{data:R}=await m(o),{data:A}=await m(l),O=new Date().toISOString().split("T")[0],L=v||`${u}_${O}.json`,X={version:"2.9",projectName:u,nodes:z,connections:C,groups:E,canvasTextBoxes:r,canvasDoodleStrokes:i,view:{...c,viewportSize:d||{width:window.innerWidth,height:window.innerHeight}},chatSessions:R,characterLibrary:A,history:I,timestamp:new Date().toISOString()},{sanitizeSensitiveData:T}=await mn(async()=>{const{sanitizeSensitiveData:B}=await Promise.resolve().then(()=>Do);return{sanitizeSensitiveData:B}},void 0,import.meta.url),q=T(X),H=new Blob([JSON.stringify(q,null,2)],{type:"application/json"}),J=URL.createObjectURL(H),Z=document.createElement("a");Z.href=J,Z.download=L,document.body.appendChild(Z),Z.click(),document.body.removeChild(Z),URL.revokeObjectURL(J),console.log("[useCategorizedExport] JSON导出完成:",{filename:L,nodes:z.length,connections:C.length,history:I.length})}catch(m){throw console.error("[useCategorizedExport] JSON导出失败:",m),m}},[e,t,n,r,i,a,o,l,c,u,d]),y=_.useCallback((w="by-type")=>{const v=h(w),m={};return v.metadata.categories.forEach(z=>{const C=v.structure[z];let E;try{E=JSON.stringify(C.nodes,null,2)}catch(I){if(I instanceof RangeError&&I.message.includes("Invalid string length"))console.warn(`分类 ${z} 数据过大,使用紧凑格式`),E=JSON.stringify(C.nodes);else throw I}m[z]={"nodes.json":E,"connections.json":JSON.stringify(C.connections,null,2),"metadata.json":JSON.stringify({category:z,nodeCount:C.nodes.length,connectionCount:C.connections.length,nodeTypes:[...new Set(C.nodes.map(I=>I.type))],createdAt:new Date().toISOString()},null,2)}}),{structure:m,metadata:v.metadata}},[h]);return{performCategorizedExport:h,getCategoryStructure:p,getCategoryExportJSON:f,getRecommendedMode:b,exportCategorizedJSON:g,getCategorizedExportStructure:y}};function vQ(e,...t){return[e.replace(/\\/g,"/").replace(/\/+$/,""),...t].join("/").replace(/\/+/g,"/")}function wQ(e){return!e||typeof e!="string"?!1:!!(e.startsWith("/")||/^[a-zA-Z]:[\\/]/.test(e))}function FC(e,t){try{const n=btoa(unescape(encodeURIComponent(t))).replace(/[^a-zA-Z0-9]/g,"_");return`${e}_${n.slice(0,48)}`}catch{return`${e}_${Date.now()}`}}function WC(e){if(typeof e!="string")return null;const t="content_ref:";return e.startsWith(t)&&e.slice(t.length).trim()||null}const DC=12,D2=!0;async function _Q(e,t){const n={};for(let r=0;r{const l=await t(o.fullPath);return{...o,data:l}}))).forEach((o,l)=>{var c;if(o.status==="fulfilled"&&o.value.data&&o.value.data.startsWith("data:")){const{assetId:u,type:d,filename:h,data:p}=o.value;n[u]={data:p,type:d,filename:h}}else o.status==="rejected"&&console.warn("[Export] 本地读取失败:",(c=i[l])==null?void 0:c.fullPath,o.reason)})}return n}let zQ=class{constructor(){Mn(this,"_cancelled",!1)}cancel(){this._cancelled=!0}get isCancelled(){return this._cancelled}throwIfCancelled(){if(this._cancelled)throw new Error("操作已取消")}};function $Q(e){const t=[],n=r=>{for(let i=0;i0&&t.push(",");try{t.push(JSON.stringify(r[i]))}catch(a){console.error(`序列化数组元素 ${i} 失败:`,a),t.push("null")}}};try{t.push('{"version":'),t.push(JSON.stringify(e.version??"3.0-container")),t.push(',"nodes":['),n(Array.isArray(e.nodes)?e.nodes:[]),t.push("]"),t.push(',"connections":'),t.push(JSON.stringify(e.connections??[])),t.push(',"groups":'),t.push(JSON.stringify(e.groups??[])),t.push(',"canvasTextBoxes":'),t.push(JSON.stringify(e.canvasTextBoxes??[])),t.push(',"canvasDoodleStrokes":'),t.push(JSON.stringify(e.canvasDoodleStrokes??[])),t.push(',"view":'),t.push(JSON.stringify(e.view??{x:0,y:0,zoom:1})),t.push(',"projectName":'),t.push(JSON.stringify(e.projectName??"")),t.push(',"history":['),n(Array.isArray(e.history)?e.history:[]),t.push("]"),t.push(',"chatSessions":['),n(Array.isArray(e.chatSessions)?e.chatSessions:[]),t.push("]"),t.push(',"timestamp":'),t.push(JSON.stringify(e.timestamp??new Date().toISOString())),e._categorization!=null&&(t.push(',"_categorization":'),t.push(JSON.stringify(e._categorization))),t.push("}")}catch(r){throw console.error("分块序列化失败:",r),new Error("数据序列化失败,请尝试减少画布内容或历史记录")}return t}const SQ=({nodes:e,connections:t,groups:n,canvasTextBoxes:r=[],canvasDoodleStrokes:i=[],history:a=[],selectedNodeIds:o,chatSessions:l=[]})=>{const c=_.useRef(null),u=_.useCallback(()=>{c.current&&(c.current.cancel(),console.log("[useTauriCategorizedExport] 用户取消导出"))},[]);return{exportToTauriContainer:_.useCallback(async(h,p,f,b)=>{var y;const g=new zQ;c.current=g;try{g.throwIfCancelled(),f==null||f(10,"准备导出数据...");let w=null;if(b!=null&&b.exportSelectionOnly&&o&&o.size>0){const ne=new Set(e.map(fe=>fe.id)),le=new Set;o.forEach(fe=>{ne.has(fe)&&le.add(fe)}),le.size>0?w=le:console.warn("[Export] 仅导出选中开启,但当前选中节点已失效,自动回退为导出全部画布")}const v=w?e.filter(ne=>w.has(ne.id)):e,m=w?t.filter(ne=>w.has(ne.from)&&w.has(ne.to)):t,z=w&&n.length>0?n.filter(ne=>ne.nodeIds.some(le=>w.has(le))):n;if(w&&v.length===0)throw new Error("当前没有选中任何节点,请先框选或点选要导出的节点");console.log(w?`[Export] 导出范围: 选中 ${v.length} 个节点, ${m.length} 条连线`:`[Export] 导出范围: 全部画布 (${v.length} 个节点, ${m.length} 条连线)`);const C=YO(v,m,z,{mode:h,includeAssets:!0});g.throwIfCancelled(),f==null||f(30,"正在提取资源文件...");const E={},I=new Map,R=(b==null?void 0:b.canvasOnly)===!0,A=(b==null?void 0:b.assetsFilter)??"all",O=Object.values(C.structure).reduce((ne,le)=>ne+le.nodes.length,0),F=!R&&a&&Array.isArray(a)?a.length:0,L=Math.max(1,F+O);let X=0;const T=()=>{X+=1;const ne=30+Math.floor(20*X/L);f==null||f(ne,`正在提取资源文件... (${X}/${L})`)};await xr.ensureManifestLoaded();const q=xr.getDirectoryPathTauri(),H=xr.getManifest(),J=new Map;if(H&&H.assets)for(const[ne,le]of Object.entries(H.assets)){const fe=le==null?void 0:le.remoteUrl;typeof fe=="string"&&fe&&J.set(fe,ne)}const Z=new Set,B=ne=>{typeof ne=="string"&&ne.trim()&&Z.add(ne)},V=ne=>{if(typeof ne!="string"||!ne||!(ne.startsWith("http://")||ne.startsWith("https://")))return;const le=J.get(ne);le&&B(le)},N=ne=>{if(!(typeof ne!="string"||!ne)&&(ne.startsWith("http://")||ne.startsWith("https://")))return J.get(ne)},j=new Set;for(const ne of v){const le=ne.settings||{},fe=ne._contentAssetId||(le==null?void 0:le._assetId);fe&&j.add(fe),B(le==null?void 0:le._assetId),B(ne._contentAssetId),B(ne._selectedImageAssetId),B(ne._selectedVideoAssetId),B(ne._thumbnailAssetId);const be=ne._previewMjAssetIds;if(be&&be.forEach(B),le!=null&&le._isStoryboardMosaic){const $e=le._stitchedFullUrl,ze=le._stitchedPreviewUrl,_e=WC($e),Ee=WC(ze);_e&&(j.add(_e),B(_e)),Ee&&B(Ee)}if(V(ne.content),typeof ne.content=="string"){const $e=N(ne.content);$e&&j.add($e)}V(ne.thumbnailUrl),V(ne.selectedPreviewVideo);const de=ne.previewMjVideos;Array.isArray(de)&&de.forEach(V)}if(!R&&a&&Array.isArray(a))for(const ne of a){B(ne._assetId),B(ne._audioAssetId),B(ne._mjOriginalAssetId),B(ne._thumbnailAssetId);const le=ne._mjAssetIds;le&&le.forEach(B),V(ne.url);const fe=ne._assetId||N(ne.url);fe&&j.add(fe)}j.forEach(ne=>{!ne.startsWith("preview_")&&!ne.startsWith("thumb_")&&Z.add(`preview_${ne}`)});const k=[];if(A!=="none"&&q&&H)for(const ne of Z){const le=(y=H.assets)==null?void 0:y[ne];if(!(le!=null&&le.fileName))continue;const fe=wQ(le.fileName)?le.fileName:vQ(q,le.fileName),be=le.mimeType||"",de=ne.startsWith("preview_")||ne.startsWith("thumb_")?"thumbnail":be.startsWith("video/")?"video":be.startsWith("audio/")?"audio":"image";k.push({assetId:ne,fullPath:fe,type:de,filename:ne})}if([].forEach(ne=>k.push(ne)),!q||!H)throw new Error("未检测到可用的资源缓存目录,请先在存储管理中启用并选择缓存目录后再导出");if(k.length>0){g.throwIfCancelled(),f==null||f(35,`正在从本地缓存读取 (${k.length} 个文件)...`);const le=await _Q(k,fe=>yn("read_file_as_base64",{filePath:fe}));Object.assign(E,le),console.log(`[Export] 本地读取完成: ${Object.keys(le).length}/${k.length} 个资源`)}const M=[];if(A!=="none"){if(!R&&a&&Array.isArray(a))for(const fe of a){g.throwIfCancelled();const be={...fe},de=be._assetId||be.id,$e=be._thumbnailAssetId||(de?`preview_${de}`:void 0),ze=`localpath_hist_${be.id}`;de&&E[de]&&(be.url=`@asset:${de}`,be.originalUrl&&(be.originalUrl=`@asset:${de}`)),$e&&E[$e]&&(be.thumbnailUrl=`@asset:${$e}`),(!be.url||be.url==="")&&E[ze]&&(be.url=`@asset:${ze}`),M.push(be),T()}const ne=fe=>typeof fe=="string"&&(fe.startsWith("data:")||fe.startsWith("blob:")),le=fe=>ne(fe)?"":fe;for(const fe of M)!fe||typeof fe!="object"||("url"in fe&&(fe.url=le(fe.url)),"originalUrl"in fe&&(fe.originalUrl=le(fe.originalUrl)),"thumbnailUrl"in fe&&(fe.thumbnailUrl=le(fe.thumbnailUrl)),"videoPosterUrl"in fe&&(fe.videoPosterUrl=le(fe.videoPosterUrl)),"audioUrl"in fe&&(fe.audioUrl=le(fe.audioUrl)),Array.isArray(fe.mjImages)&&(fe.mjImages=fe.mjImages.map(be=>le(be))),Array.isArray(fe.mjThumbnails)&&(fe.mjThumbnails=fe.mjThumbnails.map(be=>le(be))));console.log(`[Export] 历史记录项: ${M.length}, 来自历史的资源: ${Object.keys(E).length}`);for(const fe of Object.values(C.structure))for(const be of fe.nodes)g.throwIfCancelled(),I.set(be.id,be),T()}if(A==="none")for(const ne of Object.keys(E))delete E[ne];else if(A==="images-only")for(const[ne,le]of Object.entries(E))(le.type==="video"||le.type==="audio")&&delete E[ne];console.log(`[Export] 本次导出共 ${Object.keys(E).length} 个资源文件 (filter: ${A}), 节点数: ${v.length}`),g.throwIfCancelled(),f==null||f(50,`已提取 ${Object.keys(E).length} 个资源文件...`);const Y=[],se={};Object.entries(C.structure).forEach(([ne,le])=>{const fe=le.nodes.map(be=>{var ke,Ie,Pe;const de={...be},$e=be._contentAssetId||((ke=be.settings)==null?void 0:ke._assetId);$e&&E[$e]&&(de.content=`@asset:${$e}`);const ze=`localpath_node_${be.id}`;(!de.content||de.content===""||typeof de.content=="string"&&(de.content.startsWith("blob:")||de.content.startsWith("data:")))&&E[ze]&&(de.content=`@asset:${ze}`);const _e=`inline_node_${be.id}_content`;if((!de.content||de.content===""||typeof de.content=="string"&&(de.content.startsWith("blob:")||de.content.startsWith("data:")))&&E[_e]&&(de.content=`@asset:${_e}`),typeof de.content=="string"&&((Ie=de.settings)==null?void 0:Ie.mediaType)==="video"&&(de.content.startsWith("http://")||de.content.startsWith("https://"))){const Te=FC("urlvideo_node",de.content);E[Te]&&(de.content=`@asset:${Te}`)}const Ee=be._thumbnailAssetId||N(be.thumbnailUrl),Ce=`inline_node_${be.id}_thumbnail`,xe=$e&&!$e.startsWith("preview_")&&!$e.startsWith("thumb_")?`preview_${$e}`:void 0;if(Ee&&E[Ee])de.thumbnailUrl=`@asset:${Ee}`;else if(E[Ce])de.thumbnailUrl=`@asset:${Ce}`;else if(xe&&E[xe])de.thumbnailUrl=`@asset:${xe}`;else if($e&&E[$e])de.thumbnailUrl=`@asset:${$e}`;else if(typeof de.content=="string"&&de.content.startsWith("@asset:")){const Te=de.content.slice(7);Te&&E[Te]&&(de.thumbnailUrl=`@asset:${Te}`)}if(be.videoPosterUrl&&typeof be.videoPosterUrl=="string"){const Te=`${be.id}_poster`;E[Te]&&(de.videoPosterUrl=`@asset:${Te}`)}if(de.frames&&Array.isArray(de.frames)&&(de.frames=de.frames.map((Te,Be)=>{const He=`${be.id}_frame_${Be}`;return E[He]?{...Te,url:`@asset:${He}`}:Te})),de.selectedKeyframes&&Array.isArray(de.selectedKeyframes)&&(de.selectedKeyframes=de.selectedKeyframes.map((Te,Be)=>{const He=`${be.id}_keyframe_${Be}`;return E[He]?{...Te,url:`@asset:${He}`}:Te})),de.previewMjImages&&Array.isArray(de.previewMjImages)&&(de.previewMjImages=de.previewMjImages.map((Te,Be)=>{const He=be._previewMjAssetIds,Je=He==null?void 0:He[Be];return Je&&E[Je]?`@asset:${Je}`:Te})),de.previewMjVideos&&Array.isArray(de.previewMjVideos)&&(de.previewMjVideos=de.previewMjVideos.map((Te,Be)=>{const He=`inline_node_${be.id}_mjVideo_${Be}`;return E[He]?`@asset:${He}`:Te})),de.type==="preview"){const Te=be._selectedImageAssetId;Te&&E[Te]&&(de.selectedPreviewImage=`@asset:${Te}`);const Be=be._selectedVideoAssetId,He=`inline_node_${be.id}_selectedVideo`;if(de.selectedPreviewVideo&&(Be&&E[Be]?de.selectedPreviewVideo=`@asset:${Be}`:E[He]&&(de.selectedPreviewVideo=`@asset:${He}`)),typeof de.selectedPreviewVideo=="string"&&(de.selectedPreviewVideo.startsWith("http://")||de.selectedPreviewVideo.startsWith("https://"))){const Je=de.selectedPreviewVideo,Me=FC("urlvideo_sel",Je);E[Me]&&(de.selectedPreviewVideo=`@asset:${Me}`)}}if(de.type==="storyboard-node"&&de.settings&&de.settings.shots&&Array.isArray(de.settings.shots)){const Te=de.settings.shots;for(let Be=0;Be{const Re=`${be.id}_shot_${Be}_image_${Me}`;return E[Re]?`@asset:${Re}`:Je})),He.startFrame&&typeof He.startFrame=="string"){const Je=`${be.id}_shot_${Be}_startFrame`;E[Je]&&(He.startFrame=`@asset:${Je}`)}if(He.endFrame&&typeof He.endFrame=="string"){const Je=`${be.id}_shot_${Be}_endFrame`;E[Je]&&(He.endFrame=`@asset:${Je}`)}}}if(be._localFilePath){const Te=`${be.id}_content`;E[Te]&&(de.content=`@asset:${Te}`)}const Ne=Te=>typeof Te=="string"&&(Te.startsWith("data:")||Te.startsWith("blob:")),ve=Te=>Ne(Te)?"":Te;return de.content=ve(de.content),de.thumbnailUrl=ve(de.thumbnailUrl),typeof de.videoPosterUrl=="string"&&(de.videoPosterUrl=ve(de.videoPosterUrl)),typeof de.selectedPreviewImage=="string"&&(de.selectedPreviewImage=ve(de.selectedPreviewImage)),typeof de.selectedPreviewVideo=="string"&&(de.selectedPreviewVideo=ve(de.selectedPreviewVideo)),Array.isArray(de.previewMjImages)&&(de.previewMjImages=de.previewMjImages.map(Te=>ve(Te))),Array.isArray(de.previewMjVideos)&&(de.previewMjVideos=de.previewMjVideos.map(Te=>ve(Te))),Array.isArray(de.frames)&&(de.frames=de.frames.map(Te=>({...Te,url:ve(Te==null?void 0:Te.url)}))),Array.isArray(de.selectedKeyframes)&&(de.selectedKeyframes=de.selectedKeyframes.map(Te=>({...Te,url:ve(Te==null?void 0:Te.url)}))),de.type==="storyboard-node"&&((Pe=de.settings)!=null&&Pe.shots)&&Array.isArray(de.settings.shots)&&de.settings.shots.forEach(Te=>{typeof Te.image_url=="string"&&(Te.image_url=ve(Te.image_url)),Array.isArray(Te.image_urls)&&(Te.image_urls=Te.image_urls.map(Be=>ve(Be))),typeof Te.startFrame=="string"&&(Te.startFrame=ve(Te.startFrame)),typeof Te.endFrame=="string"&&(Te.endFrame=ve(Te.endFrame)),typeof Te.video_url=="string"&&(Te.video_url=ve(Te.video_url))}),de});Y.push(...fe),se[ne]={nodeCount:le.nodes.length,connectionCount:le.connections.length}}),A==="none"&&(Y.forEach(ne=>{var le;ne.content="",ne.thumbnailUrl="",ne.videoPosterUrl="",ne.frames&&Array.isArray(ne.frames)&&(ne.frames=ne.frames.map(fe=>({...fe,url:""}))),ne.selectedKeyframes&&Array.isArray(ne.selectedKeyframes)&&(ne.selectedKeyframes=ne.selectedKeyframes.map(fe=>({...fe,url:""}))),Array.isArray(ne.previewMjImages)&&(ne.previewMjImages=[]),ne.type==="storyboard-node"&&((le=ne.settings)!=null&&le.shots)&&Array.isArray(ne.settings.shots)&&ne.settings.shots.forEach(fe=>{typeof fe.image_url=="string"&&(fe.image_url=""),Array.isArray(fe.image_urls)&&(fe.image_urls=[]),typeof fe.startFrame=="string"&&(fe.startFrame=""),typeof fe.endFrame=="string"&&(fe.endFrame="")})}),M.forEach(ne=>{ne.url="",ne.originalUrl="",ne.thumbnailUrl="",ne.videoPosterUrl="",ne.audioUrl="",ne.mjImages=[],ne.mjThumbnails=[]}));const ie=Array.isArray(l)?l.map(ne=>!ne||typeof ne!="object"?ne:{...ne,mode:ne.mode,messages:Array.isArray(ne.messages)?ne.messages.map(le=>!le||typeof le!="object"?le:{...le,files:Array.isArray(le.files)?le.files.map(fe=>({...fe,content:"",url:"",type:"",isImage:!1,isVideo:!1,isAudio:!1})):le.files}):ne.messages}):[],oe={nodes:Y,connections:m,groups:z,canvasTextBoxes:r,canvasDoodleStrokes:i,view:{x:0,y:0,zoom:1},projectName:p,history:M,chatSessions:ie,version:"3.0-container",timestamp:new Date().toISOString(),_categorization:{mode:h,categories:se,totalNodes:Y.length,totalConnections:m.length,totalHistoryItems:M.length,totalCanvasTextBoxes:Array.isArray(r)?r.length:0,totalCanvasDoodleStrokes:Array.isArray(i)?i.length:0}};console.log("[Export] 画布批注/涂鸦导出计数:",{canvasTextBoxes:Array.isArray(r)?r.length:0,canvasDoodleStrokes:Array.isArray(i)?i.length:0}),f==null||f(70,"正在处理敏感数据..."),g.throwIfCancelled();const{sanitizeSensitiveData:re}=await mn(async()=>{const{sanitizeSensitiveData:ne}=await Promise.resolve().then(()=>Do);return{sanitizeSensitiveData:ne}},void 0,import.meta.url),ee=re(oe);f==null||f(75,"正在序列化数据...");let pe=null,we=null;const Q=$Q(ee),me=await yn("get_export_temp_file_path");await yn("write_file_chunked",{path:me,chunks:Q}),we=me;const ue=Object.entries(E),U=ue.length>15;let G=[],te=[];if(U){f==null||f(78,`正在写入资源到临时目录(${ue.length} 个)...`);const ne=await yn("get_export_temp_dir"),le=12;for(let fe=0;fe{const Ee=ze.replace(/[^a-zA-Z0-9_-]/g,"_");return{path:`${ne}/${Ee}.bin`,base64Data:_e.data}});await yn("write_base64_to_files_batch",{items:de});const $e=Math.min(fe+le,ue.length);f==null||f(78+Math.floor($e/ue.length*15),`已写入 ${$e}/${ue.length} 个资源...`)}}else te=ue.map(([ne,le])=>({id:ne,data:le.data,assetType:le.type,filename:le.filename}));const ge=await yn("export_categorized_project",{path:p,payloadJson:pe,payloadJsonPath:we,assets:te,assetFileRefs:U?G:void 0});return f==null||f(100,"导出完成!"),{success:!0,message:"导出成功",assetCount:Object.keys(E).length,nodeCount:v.length,historyCount:M.length}}catch(w){if(w instanceof Error&&w.message==="操作已取消")return console.log("[useTauriCategorizedExport] 导出已取消"),{success:!1,message:"导出已取消",cancelled:!0};throw console.error("[useTauriCategorizedExport] 导出失败:",w),w}finally{c.current=null}},[e,t,n,r,i,a,o,l]),cancelExport:u}};class jQ{constructor(){Mn(this,"_cancelled",!1)}cancel(){this._cancelled=!0}get isCancelled(){return this._cancelled}throwIfCancelled(){if(this._cancelled)throw new Error("操作已取消")}}function V2(e,t){const n=Array.isArray(e)?e:[],r=Array.isArray(t)?t:[];if(r.length===0)return n;const i=new Map,a=n.map(o=>o);a.forEach((o,l)=>{o&&typeof o=="object"&&typeof o.id=="string"&&i.set(o.id,{session:o,idx:l})});for(const o of r){if(!o||typeof o!="object"||typeof o.id!="string")continue;const l=i.get(o.id);if(!l){a.push(o);continue}const c=l.session,u=Array.isArray(c.messages)?[...c.messages]:[],d=new Set(u.map(h=>h&&typeof h=="object"?h.id:void 0).filter(h=>typeof h=="string"));if(Array.isArray(o.messages))for(const h of o.messages)!h||typeof h!="object"||typeof h.id!="string"||d.has(h.id)||(u.push(h),d.add(h.id));a[l.idx]={...c,mode:c.mode??o.mode,messages:u}}return a}const CQ=({setNodes:e,setConnections:t,setHistory:n,setGroups:r,setCanvasTextBoxes:i,setCanvasDoodleStrokes:a,setChatSessions:o,setProjectName:l})=>{const c=_.useRef(null),u=_.useCallback(()=>{c.current&&(c.current.cancel(),console.log("[useTauriCategorizedImport] 用户取消导入"))},[]),d=_.useCallback(async(p,f)=>{const b=new jQ;c.current=b;try{b.throwIfCancelled(),f==null||f(10,"正在读取项目文件...");const g=await yn("import_categorized_project",{path:p,streamAssets:!0});b.throwIfCancelled(),f==null||f(50,"正在处理资源文件...");let y=g.data||g;console.log("[Import] 读取到画布批注/涂鸦计数:",{canvasTextBoxes:Array.isArray(y.canvasTextBoxes)?y.canvasTextBoxes.length:0,canvasDoodleStrokes:Array.isArray(y.canvasDoodleStrokes)?y.canvasDoodleStrokes.length:0});const w=g.asset_files,v=16,m=12;if(w&&w.length>0){const X={},T=p.includes("\\")?"\\":"/",q=`${p}${T}assets`,H=xr.isAvailable();H&&await xr.ensureManifestLoaded();const J=async(j,k)=>{const W=`${q}${T}${k}`;try{const M=await yn("read_file_as_base64",{filePath:W});if(M){const Y=await fetch(M).then(ee=>ee.blob()),se=j.startsWith("preview_")||j.startsWith("thumb_")?"thumbnails":j.startsWith("local_")?"local":void 0,ie=`file://import/${encodeURIComponent(k)}`;await Xr.saveBlobAsset(j,Y,ie,se),H&&await xr.saveAsset(j,Y,Y.type||"application/octet-stream",ie,se);const oe=await Xr.getAssetUrl(j);if(oe)return{assetId:j,blobUrl:oe};const re=await Cw(M);return{assetId:j,blobUrl:re}}}catch(M){console.warn(`[useTauriCategorizedImport] 读取资源失败 ${j}:`,M)}return null};if(w.length<=v)b.throwIfCancelled(),(await Promise.all(w.map(({id:k,fileName:W})=>J(k,W)))).forEach(k=>{k&&(X[k.assetId]=k.blobUrl)}),f==null||f(75,`已加载资源 ${w.length}/${w.length}...`);else for(let j=0;jJ(Y,se)))).forEach(Y=>{Y&&(X[Y.assetId]=Y.blobUrl)});const M=Math.min(j+m,w.length);f==null||f(50+Math.floor(M/w.length*25),`已加载资源 ${M}/${w.length}...`)}const Z={},B=new Set,V=j=>{if(!j||typeof j!="object")return;if(Array.isArray(j)){j.forEach(V);return}const k=j,W=k.content??k.url,M=k.thumbnailUrl;if(typeof W=="string"&&W.startsWith("@asset:")&&typeof M=="string"&&M.startsWith("@asset:")){const Y=W.slice(7),se=M.slice(7);Y===se&&X[Y]&&B.add(Y)}for(const Y of Object.values(k))V(Y)};if(y.nodes&&V(y.nodes),y.history&&V(y.history),y.categories&&typeof y.categories=="object"&&Object.values(y.categories).forEach(j=>(j==null?void 0:j.nodes)&&V(j.nodes)),B.size>0){f==null||f(76,`正在生成缩略图(${B.size} 张)并保存到 thumbnails 文件夹...`);const j=`${p}${T}thumbnails`;for(const k of B){b.throwIfCancelled();try{const W=X[k];if(!W)continue;const M=await fetch(W).then(re=>re.blob());if(!M.type.startsWith("image/"))continue;const Y=await zP(M);if(!Y)continue;const se=await new Promise((re,ee)=>{const pe=new FileReader;pe.onloadend=()=>re(pe.result),pe.onerror=()=>ee(new Error("blob to data url failed")),pe.readAsDataURL(Y)}),ie=k.replace(/[^a-zA-Z0-9_-]/g,"_"),oe=`${j}${T}thumb_${ie}.jpg`;await yn("write_base64_to_file",{path:oe,base64Data:se}),Z[k]=URL.createObjectURL(Y)}catch(W){console.warn("[useTauriCategorizedImport] 生成缩略图失败:",k,W)}}Object.keys(Z).length>0&&console.log("[useTauriCategorizedImport] 已生成并保存",Object.keys(Z).length,"张缩略图到",j)}const N=(j,k)=>{if(typeof j=="string"&&j.startsWith("@asset:")){const W=j.slice(7);return k==="thumbnailUrl"&&Z[W]?Z[W]:X[W]??j}if(Array.isArray(j))return j.map(W=>N(W,void 0));if(j&&typeof j=="object"){const W={};for(const[M,Y]of Object.entries(j))W[M]=N(Y,M);return W}return j};y=N(y,void 0)}const z=[],C=[],E=[],I=[];y.nodes&&Array.isArray(y.nodes)&&z.push(...y.nodes),y.connections&&Array.isArray(y.connections)&&C.push(...y.connections),y.allConnections&&Array.isArray(y.allConnections)&&C.push(...y.allConnections),y.history&&Array.isArray(y.history)&&E.push(...y.history),y.groups&&Array.isArray(y.groups)&&I.push(...y.groups),l&&y.projectName&&typeof y.projectName=="string"&&l(Nw(y.projectName)),y.categories&&typeof y.categories=="object"&&Object.entries(y.categories).forEach(([X,T])=>{T.nodes&&Array.isArray(T.nodes)&&z.push(...T.nodes),T.connections&&Array.isArray(T.connections)&&C.push(...T.connections)}),f==null||f(80,`已导入 ${z.length} 个节点...`),b.throwIfCancelled();const R=new Map;z.forEach(X=>{R.has(X.id)||R.set(X.id,X)});const A=new Set,O=[];C.forEach(X=>{const T=`${X.from}-${X.to}-${X.inputType||"default"}`;A.has(T)||(A.add(T),O.push(X))});const F={nodes:Array.from(R.values()),connections:O,history:E,groups:I};if(jx(F)){f==null||f(85,"正在优化图片数据(Base64 → Blob URL)..."),console.log("[useTauriCategorizedImport] 检测到 Base64 数据,开始 Hydration...");try{const{data:X,stats:T}=await Iv(F);console.log(`[useTauriCategorizedImport] ✅ Hydration 完成!转换了 ${T.converted} 张图片`);const q=X.nodes||Array.from(R.values()),H=X.connections||O,J=X.history||E,Z=X.groups||I;f==null||f(95,"正在更新项目..."),b.throwIfCancelled(),_.startTransition(()=>{e(q),t(H),n&&J.length>0&&n(J),r&&Z.length>0&&r(Z),i&&i(Array.isArray(y.canvasTextBoxes)?y.canvasTextBoxes:[]),a&&a(Array.isArray(y.canvasDoodleStrokes)?y.canvasDoodleStrokes:[]),o&&Array.isArray(y.chatSessions)&&o(B=>V2(B,y.chatSessions))})}catch(X){console.error("[useTauriCategorizedImport] Hydration 失败,使用原始数据:",X),f==null||f(95,"正在更新项目..."),b.throwIfCancelled(),_.startTransition(()=>{e(Array.from(R.values())),t(O),n&&E.length>0&&n(E),r&&I.length>0&&r(I),i&&i(Array.isArray(y.canvasTextBoxes)?y.canvasTextBoxes:[]),a&&a(Array.isArray(y.canvasDoodleStrokes)?y.canvasDoodleStrokes:[]),o&&Array.isArray(y.chatSessions)&&o(T=>V2(T,y.chatSessions))})}}else f==null||f(95,"正在更新项目..."),b.throwIfCancelled(),_.startTransition(()=>{e(Array.from(R.values())),t(O),n&&E.length>0&&n(E),r&&I.length>0&&r(I),i&&i(Array.isArray(y.canvasTextBoxes)?y.canvasTextBoxes:[]),a&&a(Array.isArray(y.canvasDoodleStrokes)?y.canvasDoodleStrokes:[]),o&&Array.isArray(y.chatSessions)&&o(X=>V2(X,y.chatSessions))});return f==null||f(100,"导入完成!"),console.log("[useTauriCategorizedImport] 导入成功:",{nodes:R.size,connections:O.length,history:E.length,groups:I.length}),{success:!0,nodeCount:R.size,connectionCount:O.length,historyCount:E.length,groupCount:I.length}}catch(g){if(g instanceof Error&&g.message==="操作已取消")return console.log("[useTauriCategorizedImport] 导入已取消"),{success:!1,message:"导入已取消",cancelled:!0};throw console.error("[useTauriCategorizedImport] 导入失败:",g),g}finally{c.current=null}},[e,t,n,r,i,a,o,l]),h=_.useCallback(async p=>{try{const{open:f}=await mn(async()=>{const{open:y}=await Promise.resolve().then(()=>L0);return{open:y}},void 0,import.meta.url);p==null||p(5,"打开文件夹选择器...");const b=await f({directory:!0,multiple:!1,title:"选择导出的项目文件夹"});if(!b)return console.log("[useTauriCategorizedImport] 用户取消选择"),null;const g=Array.isArray(b)?b[0]:b;return g?(console.log("[useTauriCategorizedImport] 选择的文件夹:",g),await d(g,p)):(console.log("[useTauriCategorizedImport] 无效的文件夹路径"),null)}catch(f){throw console.error("[useTauriCategorizedImport] 文件夹选择失败:",f),f}},[d]);return{importFromTauriContainer:d,importFromTauriFolder:h,cancelImport:u}};function NQ(e,t){const n=Array.isArray(e)?e:[],r=Array.isArray(t)?t:[];if(r.length===0)return n;const i=new Map,a=n.map(o=>o);a.forEach((o,l)=>{o&&typeof o=="object"&&typeof o.id=="string"&&i.set(o.id,{session:o,idx:l})});for(const o of r){if(!o||typeof o!="object"||typeof o.id!="string")continue;const l=i.get(o.id);if(!l){a.push(o);continue}const c=l.session,u=Array.isArray(c.messages)?[...c.messages]:[],d=new Set(u.map(h=>h&&typeof h=="object"?h.id:void 0).filter(h=>typeof h=="string"));if(Array.isArray(o.messages))for(const h of o.messages)!h||typeof h!="object"||typeof h.id!="string"||d.has(h.id)||(u.push(h),d.add(h.id));a[l.idx]={...c,mode:c.mode??o.mode,messages:u}}return a}const IQ=({setNodes:e,setConnections:t,setHistory:n,setChatSessions:r,setCharacterLibrary:i,setGroups:a,setView:o,setProjectName:l,setCanvasTextBoxes:c,setCanvasDoodleStrokes:u})=>({importFromJsonFile:_.useCallback(async h=>{var p,f,b,g;try{h==null||h(5,"打开文件选择器...");const{open:y}=await mn(async()=>{const{open:A}=await Promise.resolve().then(()=>L0);return{open:A}},void 0,import.meta.url),w=await y({multiple:!1,filters:[{name:"JSON",extensions:["json"]}],title:"选择项目 JSON 文件"});if(!w)return console.log("[useTauriJsonImport] 用户取消选择"),null;const v=Array.isArray(w)?w[0]:w;if(!v)return console.log("[useTauriJsonImport] 无效的文件路径"),null;console.log("[useTauriJsonImport] 选择的文件:",v),h==null||h(10,"正在读取文件...");const{readTextFile:m}=await mn(async()=>{const{readTextFile:A}=await Promise.resolve().then(()=>bx);return{readTextFile:A}},void 0,import.meta.url),z=await m(v);h==null||h(20,"正在解析 JSON...");let C;try{C=JSON.parse(z)}catch(A){throw new Error("JSON 文件格式错误: "+A.message)}if(h==null||h(30,"正在检查数据完整性..."),!C.nodes||!Array.isArray(C.nodes))throw new Error("项目文件缺少 nodes 字段");const{containsBase64Media:E,hydrateProjectData:I}=await mn(async()=>{const{containsBase64Media:A,hydrateProjectData:O}=await Promise.resolve().then(()=>Cx);return{containsBase64Media:A,hydrateProjectData:O}},void 0,import.meta.url);if(E(C)){h==null||h(40,"正在优化内存数据(Base64 → Blob URL)...");const{data:A,stats:O}=await I(C);C=A,console.log("[useTauriJsonImport] ✅ Hydration 完成!"),console.log(` - 转换图片: ${O.converted} 张`),console.log(` - 节省内存: ${(O.totalSize/1024/1024).toFixed(2)}MB`),h==null||h(50,`已优化 ${O.converted} 张图片,节省 ${(O.totalSize/1024/1024).toFixed(2)}MB 内存`)}else h==null||h(50,"正在加载节点...");return h==null||h(60,"正在加载节点..."),e(C.nodes||[]),h==null||h(70,"正在加载连接..."),C.connections&&t(C.connections),h==null||h(75,"正在加载分组..."),a&&C.groups&&Array.isArray(C.groups)&&a(C.groups),h==null||h(80,"正在加载视图..."),o&&C.view&&o(C.view),h==null||h(82,"正在恢复画布批注与涂鸦..."),c&&c(Array.isArray(C.canvasTextBoxes)?C.canvasTextBoxes:[]),u&&u(Array.isArray(C.canvasDoodleStrokes)?C.canvasDoodleStrokes:[]),h==null||h(85,"正在加载聊天会话..."),r&&C.chatSessions&&r(A=>NQ(A,C.chatSessions)),h==null||h(90,"正在加载历史记录..."),n&&C.history&&n(C.history),h==null||h(95,"正在加载角色库..."),i&&C.characterLibrary&&i(C.characterLibrary),h==null||h(98,"正在应用项目设置..."),l&&C.projectName&&l(Nw(C.projectName)),h==null||h(100,"导入完成!"),console.log("[useTauriJsonImport] 导入成功:",{nodes:C.nodes.length,connections:((p=C.connections)==null?void 0:p.length)||0,history:((f=C.history)==null?void 0:f.length)||0}),{success:!0,nodeCount:C.nodes.length,connectionCount:((b=C.connections)==null?void 0:b.length)||0,historyCount:((g=C.history)==null?void 0:g.length)||0}}catch(y){throw console.error("[useTauriJsonImport] 导入失败:",y),y}},[e,t,n,r,i,a,o,l,c,u])}),ZO=({isOpen:e,onClose:t,isDark:n=!0,nodes:r,connections:i,groups:a,canvasTextBoxes:o=[],canvasDoodleStrokes:l=[],projectName:c,history:u=[],selectedNodeIds:d,chatSessions:h=[],characterLibrary:p=[],view:f,viewportSize:b,setNodes:g,setConnections:y,setHistory:w,setChatSessions:v,setCharacterLibrary:m,setGroups:z,setView:C,setProjectName:E,setCanvasTextBoxes:I,setCanvasDoodleStrokes:R})=>{const[A,O]=_.useState(c),[F,L]=_.useState("folder"),[X,T]=_.useState(!1),[q,H]=_.useState("folder"),[J,Z]=_.useState("export"),[B,V]=_.useState(!1),[N,j]=_.useState({percent:0,message:""});_.useEffect(()=>{O(c)},[c]),_.useEffect(()=>{e&&(!d||d.size===0)&&T(!1)},[e,d]);const{exportCategorizedJSON:k}=JO({nodes:r,connections:i,groups:a,canvasTextBoxes:o,canvasDoodleStrokes:l,history:u,chatSessions:h,characterLibrary:p,view:f,projectName:c,viewportSize:b}),{exportToTauriContainer:W,cancelExport:M}=SQ({nodes:r,connections:i,groups:a,canvasTextBoxes:o,canvasDoodleStrokes:l,history:u,chatSessions:h,selectedNodeIds:d}),{importFromTauriFolder:Y,cancelImport:se}=CQ({setNodes:g||(()=>{}),setConnections:y||(()=>{}),setHistory:w||(()=>{}),setGroups:z||(()=>{}),setCanvasTextBoxes:I||(()=>{}),setCanvasDoodleStrokes:R||(()=>{}),setChatSessions:v||(()=>{}),setProjectName:E||(()=>{})}),{importFromJsonFile:ie}=IQ({setNodes:g||(()=>{}),setConnections:y||(()=>{}),setHistory:w||(()=>{}),setChatSessions:v||(()=>{}),setCharacterLibrary:m||(()=>{}),setGroups:z||(()=>{}),setView:C||(()=>{}),setProjectName:E||(()=>{}),setCanvasTextBoxes:I||(()=>{}),setCanvasDoodleStrokes:R||(()=>{})}),oe=async()=>{if(!A.trim()){alert("请输入项目名称");return}V(!0);try{j({percent:10,message:"正在准备导出..."}),await k("by-type",`${A}.json`),j({percent:100,message:"导出完成!"}),setTimeout(()=>{t()},1e3)}catch(pe){console.error("JSON导出失败:",pe),pe instanceof Error&&pe.message==="操作已取消"?j({percent:0,message:"导出已取消"}):j({percent:0,message:`导出失败: ${pe}`})}finally{V(!1)}},re=async()=>{if(!A.trim()){alert("请输入项目名称");return}V(!0);try{const{open:pe}=await mn(async()=>{const{open:te}=await Promise.resolve().then(()=>L0);return{open:te}},void 0,import.meta.url),we=await pe({directory:!0,multiple:!1,title:"选择导出位置"});if(!we){V(!1);return}const Q=Array.isArray(we)?we[0]:we;if(!Q){V(!1);return}const me=`${Q}/${A}`,ue=F==="canvas"||F==="canvas-images"||F==="canvas-structure",U=F==="canvas-structure"?"none":F==="canvas-images"?"images-only":"all",G=!!(X&&d&&d.size>0);await W("by-type",me,(te,ge)=>j({percent:te,message:ge}),{canvasOnly:ue,assetsFilter:U,exportSelectionOnly:G}),j({percent:100,message:"导出完成!"}),setTimeout(()=>{t()},1e3)}catch(pe){console.error("导出失败:",pe),pe instanceof Error&&pe.message==="操作已取消"?j({percent:0,message:"导出已取消"}):j({percent:0,message:`导出失败: ${pe}`})}finally{V(!1)}},ee=async()=>{V(!0);try{q==="folder"?await Y((pe,we)=>{j({percent:pe,message:we})}):await ie((pe,we)=>{j({percent:pe,message:we})}),j({percent:100,message:"导入完成!"}),setTimeout(()=>{t()},1e3)}catch(pe){console.error("导入失败:",pe),pe instanceof Error&&pe.message==="操作已取消"?j({percent:0,message:"导入已取消"}):j({percent:0,message:`导入失败: ${pe}`})}finally{V(!1)}};return e?s.jsx("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4",children:s.jsxs("div",{className:`rounded-xl shadow-xl max-w-2xl w-full max-h-[90vh] overflow-y-auto minimal-scrollbar ${n?"bg-zinc-900":"bg-white"}`,children:[s.jsxs("div",{className:`flex items-center justify-between p-6 border-b ${n?"border-zinc-700":"border-zinc-200"}`,children:[s.jsx("h2",{className:`text-lg font-semibold ${n?"text-white":"text-zinc-900"}`,children:"导出/导入项目"}),s.jsx("button",{onClick:t,disabled:B,className:`transition-colors disabled:opacity-50 ${n?"text-zinc-400 hover:text-white":"text-zinc-500 hover:text-zinc-900"}`,children:s.jsx(Qr,{size:24})})]}),s.jsxs("div",{className:`flex gap-2 px-6 pt-4 border-b ${n?"border-zinc-700":"border-zinc-200"}`,children:[s.jsx("button",{onClick:()=>Z("export"),disabled:B,className:`px-4 py-2 rounded-t text-sm font-medium transition-colors ${J==="export"?"bg-blue-600 text-white":n?"bg-zinc-800 text-zinc-400 hover:text-white":"bg-zinc-100 text-zinc-600 hover:text-zinc-900"} ${B?"opacity-50 cursor-not-allowed":""}`,children:"导出"}),s.jsx("button",{onClick:()=>Z("import"),disabled:B,className:`px-4 py-2 rounded-t text-sm font-medium transition-colors ${J==="import"?"bg-blue-600 text-white":n?"bg-zinc-800 text-zinc-400 hover:text-white":"bg-zinc-100 text-zinc-600 hover:text-zinc-900"} ${B?"opacity-50 cursor-not-allowed":""}`,children:"导入"})]}),B&&s.jsxs("div",{className:`px-6 py-4 border-b ${n?"border-zinc-700 bg-zinc-800/50":"border-zinc-200 bg-zinc-50"}`,children:[s.jsxs("div",{className:"flex items-center gap-3 mb-2",children:[s.jsx(_2,{size:16,className:"animate-spin text-blue-400"}),s.jsx("span",{className:`text-sm ${n?"text-zinc-300":"text-zinc-700"}`,children:N.message}),s.jsx("button",{onClick:()=>{J==="export"?(M(),j({percent:0,message:"导出已取消"}),V(!1)):(se(),j({percent:0,message:"导入已取消"}),V(!1))},className:"ml-auto text-xs px-2 py-1 rounded bg-red-500/20 hover:bg-red-500/30 text-red-400 hover:text-red-300 transition-colors",title:"取消操作",children:"取消"})]}),s.jsx("div",{className:`w-full rounded-full h-2 ${n?"bg-zinc-700":"bg-zinc-200"}`,children:s.jsx("div",{className:"bg-blue-500 h-2 rounded-full transition-all",style:{width:`${N.percent}%`}})})]}),s.jsx("div",{className:"p-6 space-y-4",children:J==="export"?s.jsxs(s.Fragment,{children:[s.jsxs("div",{children:[s.jsx("label",{className:`block text-sm font-medium mb-2 ${n?"text-zinc-300":"text-zinc-700"}`,children:"项目名称"}),s.jsx("input",{type:"text",value:A,onChange:pe=>O(pe.target.value),disabled:B,placeholder:"输入导出项目的名称",className:`w-full px-3 py-2 rounded-lg focus:outline-none focus:border-blue-500 disabled:opacity-50 ${n?"bg-zinc-800 border border-zinc-700 text-white placeholder-zinc-500":"bg-white border border-zinc-300 text-zinc-900 placeholder-zinc-400"}`})]}),s.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-4",children:[s.jsx("label",{className:`sm:col-span-2 block text-sm font-medium ${n?"text-zinc-300":"text-zinc-700"}`,children:"导出方式"}),s.jsxs("button",{onClick:()=>L("folder"),disabled:B,className:`p-3 rounded-lg border-2 transition-all text-left ${F==="folder"?"border-blue-500 bg-blue-500/10":n?"border-zinc-700 bg-zinc-800/50 hover:border-zinc-600":"border-zinc-300 bg-zinc-50 hover:border-zinc-400"} ${B?"opacity-50 cursor-not-allowed":""}`,children:[s.jsx("div",{className:`font-medium ${n?"text-white":"text-zinc-900"}`,children:"文件夹导出"}),s.jsx("div",{className:`text-xs mt-0.5 ${n?"text-zinc-400":"text-zinc-500"}`,children:"画布+历史记录"})]}),s.jsxs("button",{onClick:()=>L("canvas"),disabled:B,className:`p-3 rounded-lg border-2 transition-all text-left ${F==="canvas"?"border-blue-500 bg-blue-500/10":n?"border-zinc-700 bg-zinc-800/50 hover:border-zinc-600":"border-zinc-300 bg-zinc-50 hover:border-zinc-400"} ${B?"opacity-50 cursor-not-allowed":""}`,children:[s.jsx("div",{className:`font-medium ${n?"text-white":"text-zinc-900"}`,children:"导出当前画布内容"}),s.jsx("div",{className:`text-xs mt-0.5 ${n?"text-zinc-400":"text-zinc-500"}`,children:"工作流+图片/视频/音频,不含历史"})]}),s.jsxs("button",{onClick:()=>L("canvas-images"),disabled:B,className:`p-3 rounded-lg border-2 transition-all text-left ${F==="canvas-images"?"border-blue-500 bg-blue-500/10":n?"border-zinc-700 bg-zinc-800/50 hover:border-zinc-600":"border-zinc-300 bg-zinc-50 hover:border-zinc-400"} ${B?"opacity-50 cursor-not-allowed":""}`,children:[s.jsx("div",{className:`font-medium ${n?"text-white":"text-zinc-900"}`,children:"仅工作流+图片"}),s.jsx("div",{className:`text-xs mt-0.5 ${n?"text-zinc-400":"text-zinc-500"}`,children:"不含视频/音频,体积更小"})]}),s.jsxs("button",{onClick:()=>L("canvas-structure"),disabled:B,className:`p-3 rounded-lg border-2 transition-all text-left ${F==="canvas-structure"?"border-blue-500 bg-blue-500/10":n?"border-zinc-700 bg-zinc-800/50 hover:border-zinc-600":"border-zinc-300 bg-zinc-50 hover:border-zinc-400"} ${B?"opacity-50 cursor-not-allowed":""}`,children:[s.jsx("div",{className:`font-medium ${n?"text-white":"text-zinc-900"}`,children:"仅工作流节点"}),s.jsx("div",{className:`text-xs mt-0.5 ${n?"text-zinc-400":"text-zinc-500"}`,children:"仅结构,体积最小、导入最快"})]})]}),s.jsxs("div",{className:`flex flex-wrap gap-x-6 gap-y-1 text-xs rounded-lg px-3 py-2 ${n?"text-zinc-400 bg-zinc-800/50":"text-zinc-600 bg-zinc-100"}`,children:[s.jsx("span",{children:"按节点类型分类"}),s.jsxs("span",{children:["节点:",r.length]}),s.jsxs("span",{children:["文本批注:",Array.isArray(o)?o.length:0]}),s.jsxs("span",{children:["涂鸦笔迹:",Array.isArray(l)?l.length:0]}),d&&d.size>0&&s.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[s.jsx("input",{type:"checkbox",checked:X,onChange:pe=>T(pe.target.checked),disabled:B,className:`rounded text-blue-500 focus:ring-blue-500 ${n?"border-zinc-600 bg-zinc-700":"border-zinc-300 bg-white"}`}),s.jsxs("span",{children:["仅导出选中的 ",d.size," 个节点"]})]}),s.jsxs("span",{children:["历史:",["canvas","canvas-images","canvas-structure"].includes(F)?"不导出":u.length]}),s.jsxs("span",{children:["聊天:",Array.isArray(h)?h.length:0]})]})]}):s.jsxs(s.Fragment,{children:[s.jsxs("div",{children:[s.jsx("label",{className:`block text-sm font-medium mb-3 ${n?"text-zinc-300":"text-zinc-700"}`,children:"导入方式"}),s.jsx("div",{className:"space-y-2",children:s.jsxs("button",{onClick:()=>H("folder"),disabled:B,className:`w-full p-3 rounded-lg border-2 transition-all text-left ${q==="folder"?"border-blue-500 bg-blue-500/10":n?"border-zinc-700 bg-zinc-800/50 hover:border-zinc-600":"border-zinc-300 bg-zinc-50 hover:border-zinc-400"} ${B?"opacity-50 cursor-not-allowed":""}`,children:[s.jsx("div",{className:`font-medium ${n?"text-white":"text-zinc-900"}`,children:"文件夹导入"}),s.jsx("div",{className:`text-xs mt-1 ${n?"text-zinc-400":"text-zinc-500"}`,children:"导入导出的项目文件夹"})]})})]}),s.jsx("div",{className:"bg-blue-500/10 border border-blue-500/30 rounded-lg p-3",children:s.jsx("p",{className:"text-sm text-blue-400",children:q==="folder"?"选择一个导出的项目文件夹进行导入":"选择一个 JSON 项目文件进行导入"})})]})}),s.jsxs("div",{className:`flex items-center justify-end gap-3 p-6 border-t ${n?"border-zinc-700":"border-zinc-200"}`,children:[s.jsx("button",{onClick:t,disabled:B,className:`px-4 py-2 rounded-lg transition-colors disabled:opacity-50 disabled:cursor-not-allowed ${n?"bg-zinc-800 hover:bg-zinc-700 text-white":"bg-zinc-100 hover:bg-zinc-200 text-zinc-900"}`,children:"取消"}),J==="export"?s.jsx("button",{onClick:F==="json"?oe:re,disabled:B,className:"flex items-center gap-2 px-4 py-2 rounded-lg bg-blue-600 hover:bg-blue-700 text-white transition-colors disabled:opacity-50 disabled:cursor-not-allowed",children:B?s.jsxs(s.Fragment,{children:[s.jsx(_2,{size:18,className:"animate-spin"}),"导出中..."]}):s.jsxs(s.Fragment,{children:[s.jsx(mu,{size:18}),"导出"]})}):s.jsx("button",{onClick:ee,disabled:B,className:"flex items-center gap-2 px-4 py-2 rounded-lg bg-green-600 hover:bg-green-700 text-white transition-colors disabled:opacity-50 disabled:cursor-not-allowed",children:B?s.jsxs(s.Fragment,{children:[s.jsx(_2,{size:18,className:"animate-spin"}),"导入中..."]}):s.jsxs(s.Fragment,{children:[s.jsx(ou,{size:18}),"导入"]})})]})]})}):null},kQ=Object.freeze(Object.defineProperty({__proto__:null,CategorizedExportModal:ZO},Symbol.toStringTag,{value:"Module"})),QO=({isOpen:e,onClose:t,isDark:n,onAuthenticate:r,authMode:i,watermarkHidden:a,onToggleWatermark:o,jimengModelsHidden:l,onToggleJimengModels:c,geminiImageOfficialHidden:u,onToggleGeminiImageOfficial:d,grsaiModelsHidden:h,onToggleGrsaiModels:p,seedanceHiddenFeaturesHidden:f,onToggleSeedanceHiddenFeatures:b})=>{const[g,y]=_.useState(!1),[w,v]=_.useState(""),[m,z]=_.useState("");_.useEffect(()=>{e&&(y(!1),v(""),z(""))},[e]);const C=_.useCallback(I=>{I.preventDefault(),r(w)?(y(!0),v(""),z("")):(z("密码错误"),v(""))},[w,r]),E=_.useCallback(()=>{v(""),z(""),y(!1),t()},[t]);return e?s.jsx("div",{className:"fixed inset-0 z-[10000] flex items-center justify-center bg-black/60",children:s.jsxs("div",{className:` + w-[500px] rounded-xl shadow-2xl + ${n?"bg-gray-800 text-white":"bg-white text-gray-900"} + `,children:[s.jsx("div",{className:` + px-6 py-4 border-b + ${n?"border-gray-700":"border-gray-200"} + `,children:s.jsx("h3",{className:"text-lg font-semibold",children:"功能控制面板"})}),s.jsx("div",{className:"p-6",children:g?i==="geminiOnly"?s.jsxs("div",{className:"space-y-4",children:[s.jsxs("div",{className:` + p-4 rounded-lg border + ${n?"bg-gray-700/50 border-gray-600":"bg-gray-50 border-gray-200"} + `,children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsxs("div",{className:"flex-1",children:[s.jsx("h4",{className:"font-semibold mb-1",children:"Gemini 官方生图视频模型"}),s.jsx("p",{className:"text-sm text-gray-400",children:"控制是否在模型列表中显示 3 个 Gemini 官方生图模型 + 2 个 Veo 官方视频模型"})]}),s.jsx("button",{onClick:d,className:` + relative inline-flex h-6 w-11 items-center rounded-full transition-colors + ${u?"bg-gray-400":"bg-blue-500"} + `,children:s.jsx("span",{className:` + inline-block h-4 w-4 transform rounded-full bg-white transition-transform + ${u?"translate-x-1":"translate-x-6"} + `})})]}),s.jsxs("div",{className:"mt-2 text-xs",children:["当前状态: ",s.jsx("span",{className:u?"text-gray-400":"text-green-500",children:u?"已隐藏":"显示中"})]})]}),s.jsxs("div",{className:` + p-4 rounded-lg border + ${n?"bg-gray-700/50 border-gray-600":"bg-gray-50 border-gray-200"} + `,children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsxs("div",{className:"flex-1",children:[s.jsx("h4",{className:"font-semibold mb-1",children:"Grsai Nano Banana"}),s.jsx("p",{className:"text-sm text-gray-400",children:"控制是否在模型列表中显示 Grsai Nano Banana Pro、Grsai Nano Banana 2、Grsai Nano Banana"})]}),s.jsx("button",{onClick:p,className:` + relative inline-flex h-6 w-11 items-center rounded-full transition-colors + ${h?"bg-gray-400":"bg-blue-500"} + `,children:s.jsx("span",{className:` + inline-block h-4 w-4 transform rounded-full bg-white transition-transform + ${h?"translate-x-1":"translate-x-6"} + `})})]}),s.jsxs("div",{className:"mt-2 text-xs",children:["当前状态: ",s.jsx("span",{className:h?"text-gray-400":"text-green-500",children:h?"已隐藏":"显示中"})]})]}),s.jsx("div",{className:"flex justify-end pt-2",children:s.jsx("button",{onClick:E,className:"px-6 py-2 bg-blue-500 hover:bg-blue-600 text-white rounded-lg transition-colors",children:"关闭"})})]}):i==="seedanceOnly"?s.jsxs("div",{className:"space-y-4",children:[s.jsxs("div",{className:` + p-4 rounded-lg border + ${n?"bg-gray-700/50 border-gray-600":"bg-gray-50 border-gray-200"} + `,children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsxs("div",{className:"flex-1",children:[s.jsx("h4",{className:"font-semibold mb-1",children:"Seedance 隐藏功能"}),s.jsx("p",{className:"text-sm text-gray-400",children:"控制 Seedance 角色库入口 + Seedance恶龙逗勇者 Official 模型显示/隐藏"})]}),s.jsx("button",{onClick:b,className:` + relative inline-flex h-6 w-11 items-center rounded-full transition-colors + ${f?"bg-gray-400":"bg-blue-500"} + `,children:s.jsx("span",{className:` + inline-block h-4 w-4 transform rounded-full bg-white transition-transform + ${f?"translate-x-1":"translate-x-6"} + `})})]}),s.jsxs("div",{className:"mt-2 text-xs",children:["当前状态: ",s.jsx("span",{className:f?"text-gray-400":"text-green-500",children:f?"已隐藏":"显示中"})]})]}),s.jsx("div",{className:"flex justify-end pt-2",children:s.jsx("button",{onClick:E,className:"px-6 py-2 bg-blue-500 hover:bg-blue-600 text-white rounded-lg transition-colors",children:"关闭"})})]}):s.jsxs("div",{className:"space-y-4",children:[s.jsxs("div",{className:` + p-4 rounded-lg border + ${n?"bg-gray-700/50 border-gray-600":"bg-gray-50 border-gray-200"} + `,children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsxs("div",{className:"flex-1",children:[s.jsx("h4",{className:"font-semibold mb-1",children:"水印显示"}),s.jsx("p",{className:"text-sm text-gray-400",children:"控制画布水印的显示/隐藏"})]}),s.jsx("button",{onClick:o,className:` + relative inline-flex h-6 w-11 items-center rounded-full transition-colors + ${a?"bg-gray-400":"bg-blue-500"} + `,children:s.jsx("span",{className:` + inline-block h-4 w-4 transform rounded-full bg-white transition-transform + ${a?"translate-x-1":"translate-x-6"} + `})})]}),s.jsxs("div",{className:"mt-2 text-xs",children:["当前状态: ",s.jsx("span",{className:a?"text-gray-400":"text-green-500",children:a?"已隐藏":"显示中"})]})]}),s.jsxs("div",{className:` + p-4 rounded-lg border + ${n?"bg-gray-700/50 border-gray-600":"bg-gray-50 border-gray-200"} + `,children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsxs("div",{className:"flex-1",children:[s.jsx("h4",{className:"font-semibold mb-1",children:"画画模型"}),s.jsx("p",{className:"text-sm text-gray-400",children:"控制画画模型在列表中的显示/隐藏"})]}),s.jsx("button",{onClick:c,className:` + relative inline-flex h-6 w-11 items-center rounded-full transition-colors + ${l?"bg-gray-400":"bg-blue-500"} + `,children:s.jsx("span",{className:` + inline-block h-4 w-4 transform rounded-full bg-white transition-transform + ${l?"translate-x-1":"translate-x-6"} + `})})]}),s.jsxs("div",{className:"mt-2 text-xs",children:["当前状态: ",s.jsx("span",{className:l?"text-gray-400":"text-green-500",children:l?"已隐藏":"显示中"})]}),s.jsx("div",{className:"mt-2 text-xs text-gray-400",children:"包含即梦图片 6 个 + 即梦视频 6 个(共 12 个第三方模型)"})]}),s.jsx("div",{className:"flex justify-end pt-2",children:s.jsx("button",{onClick:E,className:"px-6 py-2 bg-blue-500 hover:bg-blue-600 text-white rounded-lg transition-colors",children:"关闭"})})]}):s.jsxs("form",{onSubmit:C,children:[s.jsx("p",{className:"text-sm text-gray-400 mb-4",children:"请输入密码以访问功能控制面板"}),s.jsx("div",{className:"relative w-full mb-2 overflow-hidden rounded-lg",children:s.jsx("input",{type:"password",value:w,onChange:I=>{v(I.target.value),z("")},placeholder:"请输入密码",autoComplete:"current-password",autoFocus:!0,className:` + feature-control-password-input + px-4 py-2 rounded-lg border + ${n?"bg-gray-700 border-gray-600 text-white placeholder-gray-400":"bg-gray-50 border-gray-300 text-gray-900 placeholder-gray-500"} + focus:outline-none focus:ring-2 focus:ring-blue-500 + `,style:{width:"calc(100% + 40px)",marginRight:"-40px",paddingRight:"2.5rem"}})}),m&&s.jsx("p",{className:"text-red-500 text-sm mb-4",children:m}),s.jsxs("div",{className:"flex gap-3",children:[s.jsx("button",{type:"submit",className:"flex-1 px-4 py-2 bg-blue-500 hover:bg-blue-600 text-white rounded-lg transition-colors",children:"确认"}),s.jsx("button",{type:"button",onClick:E,className:` + flex-1 px-4 py-2 rounded-lg transition-colors + ${n?"bg-gray-700 hover:bg-gray-600 text-white":"bg-gray-200 hover:bg-gray-300 text-gray-900"} + `,children:"取消"})]})]})})]})}):null},AQ=Object.freeze(Object.defineProperty({__proto__:null,FeatureControlPanel:QO},Symbol.toStringTag,{value:"Module"})),jp=({isOpen:e,onClose:t,title:n,children:r,theme:i="dark"})=>{if(!e)return null;const a=i==="dark";return s.jsx("div",{className:"fixed inset-0 z-[100] flex items-center justify-center bg-black/60",onClick:t,children:s.jsxs("div",{className:`rounded-xl shadow-2xl w-[680px] max-w-[90vw] overflow-hidden animate-in fade-in zoom-in-95 duration-200 flex flex-col max-h-[85vh] border ${a?"bg-[#09090b] border-zinc-800":"bg-white border-zinc-200"}`,onClick:o=>o.stopPropagation(),children:[s.jsxs("div",{className:`flex items-center justify-between p-5 border-b shrink-0 ${a?"border-zinc-800/50":"border-zinc-200"}`,children:[s.jsx("h3",{className:`font-bold text-lg ${a?"text-white":"text-zinc-900"}`,children:n}),s.jsx("button",{onClick:t,className:a?"text-zinc-500 hover:text-white":"text-zinc-500 hover:text-zinc-900",children:s.jsx(Qr,{size:20})})]}),s.jsx("div",{className:`p-0 overflow-y-auto custom-scrollbar flex-1 ${a?"bg-[#09090b]":"bg-white"}`,children:r})]})})},b$=`你是一个工作流解析器。用户会提供一段「Skill」描述(可能包含技能名称、能力说明、步骤描述等)。你需要根据这段内容,输出一个**唯一的**、符合下方 JSON Schema 的 JSON 对象,不要输出任何其他文字、解释或 markdown 标题,只输出 JSON。 + +要求: +1. workflowName:为该 Skill 起一个简短的工作流名称(中文,如「电商详情页设计大师工作流」)。 +2. workflowInputs:可选。该工作流需要用户事先提供的输入项列表,每项包含 id(英文)、name(中文)、type(text/image/number)、required、default(可选)。 +3. steps:必填。将 Skill 拆解为按顺序执行的步骤数组,至少 2 步、建议不超过 12 步。每步包含: + - id:英文标识,如 step_1、step_2 + - name:该步骤在画布上显示的名称(中文,如「素材接收与编号」「产品深度分析」「AI绘图提示词生成」) + - description:一句话描述该步骤的职责(中文) + - systemPrompt:该步骤作为 AI Agent 时的系统提示词(详细说明输入、输出与执行规范,便于后续在画布上执行) + +步骤顺序即工作流执行顺序;最后一步应导向「输出提示词」「生成方案文档」等可交付结果。 + +只输出一个合法的 JSON 对象,不要用 markdown 代码块包裹。若必须用代码块,请使用 \`\`\`json 与 \`\`\` 包裹且保证内容可被直接 JSON.parse。`,e9="上述内容是一段被截断的 JSON。请仅从截断处继续输出剩余部分,使整体成为合法 JSON。不要重复已有内容,不要输出解释,只输出从截断处开始的续写内容。",MQ="你是一个工作流格式转换器。用户会提供一段内容,可能是:已符合规范的 JSON、被截断或带尾部说明的 JSON、中文自然语言描述的工作流、或上述混合。你的任务:从内容中识别或推断出完整的工作流结构,输出唯一的、符合下方 JSON Schema 的 JSON 对象。不要输出任何其他文字或解释,只输出 JSON。\n要求:workflowName(中文);workflowInputs 可选数组,每项含 id、name、type、required、default;steps 必填数组至少2步,每步含 id、name、description、systemPrompt。若内容中已有部分 JSON 请补全修正;若为纯自然语言请根据描述提炼步骤并生成合规 JSON。只输出可直接 JSON.parse 的对象,可用 \\`\\`\\`json 包裹。";function TQ(e){return e.replace(/\uFEFF/g,"").replace(/\r\n?/g,` +`).replace(/\0/g,"").trim()}function y$(e){return e.replace(/,\s*]/g,"]").replace(/,\s*}/g,"}")}function RQ(e){const t=e.trim().replace(/^【\s*/,"").replace(/\s*】\s*$/,"").trim(),n=t.indexOf("```");if(n===-1)return null;const r=t.slice(n),i=r.match(/^```(?:json)?\s*\n?/);if(!i)return null;const a=r.slice(i[0].length),o=a.lastIndexOf("```");return o===-1?a.trim():a.slice(0,o).trim()}function Q5(e){let t=e.trim();const n=t.match(/^【?\s*```(?:json)?\s*\n?/);if(n){const h=t.slice(n[0].length),p=h.lastIndexOf("```");p!==-1?t=h.slice(0,p).trim():t=h.trim()}else{const h=t.match(/```(?:json)?\s*([\s\S]*?)(?:```|$)/);h&&(t=h[1].trim())}t=t.replace(/^【\s*/,"").replace(/\s*】\s*$/,"").trim();let r=t.indexOf("{");if(r===-1)return t;const i=t.indexOf('"workflowName"'),a=t.indexOf('"workflow_name"'),o=i===-1?a:a===-1?i:Math.min(i,a);if(o!==-1&&o<600){const h=t.lastIndexOf("{",o);h!==-1&&(r=h)}let l=0,c=!1,u=!1,d='"';for(let h=r;hi)return r.slice(i,u)}return null}function e4(e){const t=Q5(e),n=y$(t);let r;try{r=JSON.parse(n)}catch{throw new Error("返回格式无效:无法解析 JSON,请重试或精简 Skill 内容")}return v$(r)}function v$(e){if(!e||typeof e!="object")throw new Error("返回格式无效:缺少有效 JSON 对象");let t=e;t.result&&typeof t.result=="object"&&t.result!==null?t=t.result:t.data&&typeof t.data=="object"&&t.data!==null&&(t=t.data);const n=typeof t.workflowName=="string"?t.workflowName:typeof t.workflow_name=="string"?t.workflow_name:"未命名工作流";let r=t.steps;if(!Array.isArray(r)&&Array.isArray(t.step_list)&&(r=t.step_list),!Array.isArray(r)||r.length<1)throw new Error("返回格式无效:缺少 steps 数组或 steps 为空");const i=r.map((a,o)=>{const l=a&&typeof a=="object"?a:{},c=typeof l.name=="string"?l.name:typeof l.step_name=="string"?l.step_name:`步骤${o+1}`,u=typeof l.description=="string"?l.description:typeof l.desc=="string"?l.desc:"",d=typeof l.systemPrompt=="string"?l.systemPrompt:typeof l.system_prompt=="string"?l.system_prompt:u;return{id:typeof l.id=="string"?l.id:`step_${o+1}`,name:c,description:u,systemPrompt:d||u}});return{workflowName:n||"未命名工作流",workflowInputs:Array.isArray(t.workflowInputs)?t.workflowInputs:Array.isArray(t.workflow_inputs)?t.workflow_inputs:void 0,steps:i}}function HC(e){e=TQ(e);let t;const n=c=>{try{return e4(c)}catch(u){return t=u instanceof Error?u.message:String(u),null}},r=RQ(e);if(r&&r.startsWith("{")){const c=Q5(r),u=y$(c);try{return{result:v$(JSON.parse(u))}}catch(d){t=d instanceof Error?d.message:String(d)}}try{const c=e.match(/```(?:json)?\s*([\s\S]*?)(?:```|$)/),u=c?c[1].trim().replace(/^【\s*/,"").replace(/\s*】\s*$/,"").trim():e;if(u.startsWith("{")){const d=y$(u),h=JSON.parse(d);return{result:v$(h)}}}catch(c){t=c instanceof Error?c.message:String(c)}let i=n(e);if(i)return{result:i};const a=VC(e);if(a&&(i=n(a),i))return{result:i};const o=e.replace(/\s*上述\s*JSON\s*已经[\s\S]*$/i,"").trim();if(o!==e){if(i=n(o),i)return{result:i};const c=VC(o);c&&(i=n(c))}const l=Vx(e);if(l&&(i=n(l),i))return{result:i};if(a){const c=Vx(a);c&&(i=n(c))}return{result:i||null,errorMessage:t}}async function PQ(e){const{content:t,apiKey:n,baseUrl:r,model:i,onStreamChunk:a}=e,o=`${r.replace(/\/+$/,"")}/v1/chat/completions`,l={model:i,messages:[{role:"system",content:MQ},{role:"user",content:t.slice(0,12e4)}],max_tokens:16384};return Wv(o,n,l,a)}async function Wv(e,t,n,r){var u,d,h,p,f,b,g,y,w,v;const i=await fetch(e,{method:"POST",headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"},body:JSON.stringify({...n,stream:!0})});if(!i.ok){const m=await i.text();throw new Error(m||`请求失败: ${i.status}`)}if(!i.body)throw new Error("无响应体");const a=i.body.getReader(),o=new TextDecoder("utf-8");let l="",c="";try{for(;;){const{done:m,value:z}=await a.read();if(m)break;const C=o.decode(z,{stream:!0});c+=C;const E=c.split(` +`);c=E.pop()||"";for(const I of E){const R=I.trim();if(!(!R||R==="data: [DONE]")&&R.startsWith("data: "))try{const A=R.slice(6);if(A==="[DONE]")continue;const O=JSON.parse(A),F=((h=(d=(u=O.choices)==null?void 0:u[0])==null?void 0:d.delta)==null?void 0:h.content)||((f=(p=O.choices)==null?void 0:p[0])==null?void 0:f.text)||((b=O.delta)==null?void 0:b.content)||O.content||"";F&&(l+=F,r==null||r(l))}catch{}}}if(c.trim().startsWith("data: ")&&c.trim()!=="data: [DONE]")try{const m=JSON.parse(c.trim().slice(6)),z=((w=(y=(g=m.choices)==null?void 0:g[0])==null?void 0:y.delta)==null?void 0:w.content)||((v=m.delta)==null?void 0:v.content)||"";z&&(l+=z,r==null||r(l))}catch{}}finally{a.releaseLock()}return l}function Vx(e){const t=Q5(e).trim();let n=t;const r=(t.match(/\{/g)||[]).length,i=(t.match(/\}/g)||[]).length,a=(t.match(/\[/g)||[]).length,o=(t.match(/\]/g)||[]).length;for(let l=0;l{try{return e4(g)}catch{return null}};let d=u(c);if(d)return d;const h=Vx(c);if(h&&(d=u(h),d))return d;const f=await Wv(o,n,{model:i,messages:[{role:"system",content:b$},{role:"user",content:t},{role:"assistant",content:c},{role:"user",content:e9}],max_tokens:8192},g=>{a==null||a(c+g)});if(c=c+f,d=u(c),d)return d;const b=Vx(c);if(b&&(d=u(b),d))return d;throw new Error("返回格式无效:无法解析 JSON(可能被截断),请精简 Skill 内容后重试")}async function LQ(e){const{skillText:t,apiKey:n,baseUrl:r,model:i,existingContent:a,onStreamChunk:o}=e,l=`${r.replace(/\/+$/,"")}/v1/chat/completions`,u=await Wv(l,n,{model:i,messages:[{role:"system",content:b$},{role:"user",content:t},{role:"assistant",content:a},{role:"user",content:e9}],max_tokens:8192},b=>{o==null||o(a+b)}),d=a+u,h=b=>{try{return e4(b)}catch{return null}};let p=h(d);if(p)return p;const f=Vx(d);if(f&&(p=h(f),p))return p;throw new Error("返回格式无效:续写后仍无法解析 JSON,可再次点击续写或精简 Skill 内容")}const BQ=({isOpen:e,onClose:t,isDark:n,initialText:r="",apiConfigs:i,chatModel:a,globalApiKey:o="",onCreateWorkflow:l,onError:c})=>{const[u,d]=_.useState(""),[h,p]=_.useState(a),[f,b]=_.useState(!1),[g,y]=_.useState(!1),[w,v]=_.useState(""),[m,z]=_.useState(!1),[C,E]=_.useState([]),[I,R]=_.useState(!1),[A,O]=_.useState(null),F=_.useRef(null),L=_.useRef(null),[X,T]=_.useState(null),q=_.useRef(null),H=_.useRef(null);_.useEffect(()=>{e||(z(!1),R(!1))},[e]),_.useLayoutEffect(()=>{if(!m){T(null);return}const W=q.current;if(W){const Y=W.getBoundingClientRect(),se=8,ie=window.innerHeight-Y.bottom-se,oe=Y.top-se,re=400;oe>ie&&ie<200?T({bottom:window.innerHeight-Y.top+4,left:Y.left,width:Y.width,maxHeight:Math.min(re,oe)}):T({top:Y.bottom+4,left:Y.left,width:Y.width,maxHeight:Math.min(re,Math.max(ie,240))})}const M=Y=>{var se;if(Y.type==="resize"){z(!1);return}Y.target&&((se=H.current)!=null&&se.contains(Y.target))||z(!1)};return window.addEventListener("scroll",M,!0),window.addEventListener("resize",M),()=>{window.removeEventListener("scroll",M,!0),window.removeEventListener("resize",M)}},[m]),_.useLayoutEffect(()=>{if(!I){O(null);return}const W=F.current;if(W){const Y=W.getBoundingClientRect(),ie=window.innerHeight-Y.bottom-8;O({top:Y.bottom+4,left:Y.left,width:Y.width,maxHeight:Math.min(280,Math.max(ie,160))})}const M=()=>R(!1);return window.addEventListener("scroll",M,!0),window.addEventListener("resize",M),()=>{window.removeEventListener("scroll",M,!0),window.removeEventListener("resize",M)}},[I]),_.useEffect(()=>{if(!m)return;const W=M=>{var se,ie;const Y=M.target;(se=q.current)!=null&&se.contains(Y)||(ie=H.current)!=null&&ie.contains(Y)||z(!1)};return document.addEventListener("mousedown",W),()=>document.removeEventListener("mousedown",W)},[m]),_.useEffect(()=>{if(!I)return;const W=M=>{var se,ie;const Y=M.target;(se=F.current)!=null&&se.contains(Y)||(ie=L.current)!=null&&ie.contains(Y)||R(!1)};return document.addEventListener("mousedown",W),()=>document.removeEventListener("mousedown",W)},[I]);const J=i.filter(W=>W.type==="Chat"),Z=J.find(W=>W.id===h)||J[0];_.useEffect(()=>{e&&(d(r),p(a),E(_c()))},[e,r,a]);const B=_.useCallback(W=>{const M=W instanceof Error?W.message:String(W);if(!M||M==="[object Object]")return"请求失败,请检查网络或到设置中确认该模型的 API 地址与 Key 后重试。";const Y=M.toLowerCase();return Y.includes("err_connection_closed")||Y.includes("connection closed")||Y.includes("failed to fetch")||Y.includes("network")?"当前模型接口连接失败,请检查网络或到设置中确认该模型的 API 地址与 Key 是否正确。":Y.includes("401")||Y.includes("unauthorized")?"API Key 无效或已过期,请在设置中检查该模型的 Key。":Y.includes("404")||Y.includes("not found")?"当前模型接口地址不可用,请在设置中检查该模型的 API 地址。":Y.includes("timeout")||Y.includes("timed out")?"请求超时,请稍后重试或更换模型。":Y.includes("返回格式")||Y.includes("parse")||Y.includes("json")?"模型返回格式有误,请重试或精简 Skill 内容后再生成。":Y.includes("step")||Y.includes("node")||Y.includes("workflow")||Y.includes("create")?"创建工作流时出错,请重试。若仍失败可尝试精简 Skill 内容或更换模型。":M.length>120?"请求失败,请检查网络或该模型的 API 设置后重试。":M},[]),V=_.useCallback(async()=>{const W=u.trim();if(!W){c("请先输入 Skill 内容");return}const M=(Z==null?void 0:Z.key)||o;if(!M){c("请先在设置中配置对话模型的 API Key");return}const Y=((Z==null?void 0:Z.url)||"https://ai.comfly.chat").replace(/\/+$/,""),se=(Z==null?void 0:Z.modelName)||"gpt-4o";b(!0),v("");try{const ie=await OQ({skillText:W,apiKey:M,baseUrl:Y,model:se,onStreamChunk:oe=>v(oe)});await Promise.resolve(l(ie)),v(""),t()}catch(ie){c(B(ie))}finally{b(!1)}},[u,Z,o,l,t,c,B]),N=_.useCallback(async()=>{const W=u.trim();if(!W||!w)return;const M=(Z==null?void 0:Z.key)||o;if(!M){c("请先在设置中配置对话模型的 API Key");return}const Y=((Z==null?void 0:Z.url)||"https://ai.comfly.chat").replace(/\/+$/,""),se=(Z==null?void 0:Z.modelName)||"gpt-4o";b(!0);try{const ie=await LQ({skillText:W,apiKey:M,baseUrl:Y,model:se,existingContent:w,onStreamChunk:oe=>v(oe)});await Promise.resolve(l(ie)),v(""),t()}catch(ie){c(B(ie))}finally{b(!1)}},[u,w,Z,o,l,t,c,B]),j=_.useCallback(async()=>{if(!(w!=null&&w.trim()))return;const W=(Z==null?void 0:Z.key)||o,M=((Z==null?void 0:Z.url)||"https://ai.comfly.chat").replace(/\/+$/,""),Y=(Z==null?void 0:Z.modelName)||"gpt-4o",{result:se,errorMessage:ie}=HC(w);if(se){try{await Promise.resolve(l(se)),v(""),t()}catch(oe){c(B(oe))}return}if(!W||J.length===0){c(ie||"当前解析结果无法识别为有效工作流,可尝试续写或重新生成");return}y(!0);try{const oe=await PQ({content:w,apiKey:W,baseUrl:M,model:Y,onStreamChunk:pe=>v(pe)}),{result:re,errorMessage:ee}=HC(oe);re?(await Promise.resolve(l(re)),v(""),t()):(c(ee||"智能转换后仍无法解析为工作流,请尝试续写或精简内容"),v(oe))}catch(oe){c(B(oe))}finally{y(!1)}},[w,Z,o,J.length,l,t,c,B]),k=_.useCallback(()=>{navigator.clipboard.readText().then(W=>{W!=null&&W.trim()&&v(W.trim())}).catch(()=>c("无法读取剪贴板,请确保已允许剪贴板权限"))},[c]);return s.jsx(jp,{isOpen:e,onClose:t,title:"从 Skill 生成工作流",theme:n?"dark":"light",children:s.jsxs("div",{className:`p-5 flex flex-col gap-4 ${n?"bg-[#09090b]":"bg-white"}`,children:[s.jsx("div",{className:"flex flex-col gap-1",children:s.jsxs("div",{className:"flex items-center gap-2",children:[n?s.jsxs(s.Fragment,{children:[s.jsx("div",{ref:F,className:"flex-1 min-w-0 relative",children:s.jsxs("button",{type:"button",onClick:()=>!f&&R(W=>!W),disabled:f,className:"w-full px-3 py-2 rounded-lg text-sm outline-none flex items-center justify-between gap-2 text-left bg-transparent text-zinc-200 border border-zinc-700 focus:ring-2 focus:ring-zinc-400/60 focus:ring-inset",children:[s.jsx("span",{className:"truncate",children:C.length===0?"暂无":"选择…"}),s.jsx(Ei,{size:16,className:`shrink-0 transition-transform ${I?"rotate-180":""}`})]})}),I&&A&&Ni.createPortal(s.jsx("ul",{ref:L,role:"listbox",style:{position:"fixed",top:A.top,left:A.left,width:A.width,maxHeight:A.maxHeight},className:"py-1 rounded-lg shadow-xl overflow-y-auto minimal-scrollbar z-[101] bg-black border border-zinc-800",children:C.length===0?s.jsx("li",{className:"px-3 py-2 text-sm text-zinc-500",children:"暂无"}):C.map(W=>s.jsx("li",{children:s.jsx("button",{type:"button",role:"option",onClick:()=>{d(W.content),R(!1)},className:"w-full px-3 py-2 text-left text-sm text-zinc-200 hover:bg-zinc-900 focus:bg-zinc-900 focus:outline-none",children:W.name})},W.id))}),document.body)]}):s.jsxs("select",{value:"",onChange:W=>{const M=W.target.value;if(!M)return;const Y=C.find(se=>se.id===M);Y&&d(Y.content),W.target.value=""},disabled:f,className:"flex-1 min-w-0 px-3 py-2 rounded-lg text-sm outline-none bg-white border border-zinc-300 text-zinc-900 focus:border-blue-400 focus:ring-1 focus:ring-blue-400/30",children:[s.jsx("option",{value:"",children:C.length===0?"暂无":"选择…"}),C.map(W=>s.jsx("option",{value:W.id,children:W.name},W.id))]}),s.jsx("button",{type:"button",onClick:()=>E(_c()),disabled:f,title:"刷新 Skill 库",className:`p-2 rounded-lg shrink-0 ${n?"text-zinc-400 hover:bg-zinc-800":"text-zinc-600 hover:bg-zinc-100"}`,children:s.jsx(Ch,{size:16})})]})}),s.jsxs("div",{children:[s.jsx("label",{className:`block text-xs font-medium mb-1 ${n?"text-zinc-400":"text-zinc-600"}`,children:"Skill 内容"}),s.jsx("textarea",{value:u,onChange:W=>d(W.target.value),placeholder:"粘贴 Skill 全文或描述",className:`w-full min-h-[200px] px-3 py-2 rounded-lg text-sm resize-y overflow-y-auto minimal-scrollbar outline-none ${n?"bg-transparent text-zinc-200 placeholder:text-zinc-500 border-0 focus:ring-2 focus:ring-zinc-400/60 focus:ring-inset":"bg-white border border-zinc-300 text-zinc-900 placeholder:text-zinc-400 focus:border-blue-400 focus:ring-1 focus:ring-blue-400/30"}`,disabled:f})]}),(w||!f)&&s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center justify-between gap-2 mb-1",children:[s.jsx("label",{className:`text-xs font-medium ${n?"text-zinc-400":"text-zinc-600"}`,children:f?"解析中(流式)":"解析结果"}),!f&&s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("button",{type:"button",onClick:k,disabled:g,className:`text-xs px-2 py-1 rounded ${n?"text-zinc-300 hover:bg-zinc-800":"text-blue-600 hover:bg-blue-50"}`,children:"粘贴"}),s.jsx("button",{type:"button",onClick:j,disabled:!(w!=null&&w.trim())||g,className:`text-xs px-2 py-1 rounded flex items-center gap-1 ${n?"text-zinc-300 hover:bg-zinc-800":"text-blue-600 hover:bg-blue-50"}`,children:g?s.jsxs(s.Fragment,{children:[s.jsx(zr,{size:12,className:"animate-spin shrink-0"}),"智能转换中…"]}):"从当前结果创建"}),s.jsx("button",{type:"button",onClick:N,disabled:J.length===0||!(w!=null&&w.trim())||g,className:`text-xs px-2 py-1 rounded ${n?"text-zinc-300 hover:bg-zinc-800":"text-blue-600 hover:bg-blue-50"}`,children:"续写"})]})]}),s.jsx("div",{className:`w-full max-h-[280px] overflow-y-auto rounded-lg px-3 py-2 text-xs font-mono whitespace-pre-wrap break-words minimal-scrollbar ${n?"bg-transparent text-zinc-300 border-0":"bg-zinc-50 border border-zinc-300 text-zinc-700"}`,children:w||s.jsx("span",{className:n?"text-zinc-500":"text-zinc-400",children:"解析结果将在此显示"})})]}),s.jsxs("div",{ref:q,className:"relative",children:[s.jsx("label",{className:`block text-xs font-medium mb-1 ${n?"text-zinc-400":"text-zinc-600"}`,children:"解析用模型"}),s.jsxs("button",{type:"button",onClick:()=>!f&&z(W=>!W),disabled:f,className:`w-full px-3 py-2 rounded-lg text-sm outline-none flex items-center justify-between gap-2 ${n?"bg-transparent text-zinc-200 border-0 focus:ring-2 focus:ring-zinc-400/60 focus:ring-inset":"bg-white border border-zinc-300 text-zinc-900 focus:border-blue-400 focus:ring-1 focus:ring-blue-400/30"}`,children:[s.jsx("span",{className:"truncate",children:J.length===0?"请先在设置中添加对话模型":Z&&(Z.provider||Z.modelName||Z.id)||h}),s.jsx(Ei,{size:16,className:`shrink-0 transition-transform ${m?"rotate-180":""}`})]}),m&&X&&J.length>0&&Ni.createPortal(s.jsx("ul",{ref:H,role:"listbox",style:{position:"fixed",...X.top!=null?{top:X.top}:{bottom:X.bottom},left:X.left,width:X.width,maxHeight:X.maxHeight},className:`py-1 rounded-lg shadow-xl overflow-y-auto minimal-scrollbar z-[101] ${n?"bg-black border border-zinc-800":"bg-white border border-zinc-200"}`,children:J.map(W=>s.jsx("li",{children:s.jsx("button",{type:"button",role:"option",onClick:()=>{p(W.id),z(!1)},className:`w-full px-3 py-2 text-left text-sm ${W.id===h?n?"bg-black text-white":"bg-blue-50 text-blue-700":n?"text-zinc-200 hover:bg-black":"text-zinc-800 hover:bg-zinc-100"}`,children:W.provider||W.modelName||W.id})},W.id))}),document.body)]}),s.jsxs("div",{className:"flex justify-end gap-2 pt-2",children:[s.jsx("button",{type:"button",onClick:t,className:`px-4 py-2 rounded-lg text-sm ${n?"text-zinc-400 hover:bg-zinc-800":"text-zinc-600 hover:bg-zinc-100"}`,disabled:f,children:"取消"}),s.jsx("button",{type:"button",onClick:V,disabled:f||J.length===0,className:`px-4 py-2 rounded-lg text-sm disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-2 ${n?"text-zinc-300 hover:text-white hover:bg-zinc-800/80":"bg-blue-600 text-white hover:bg-blue-700"}`,children:f?s.jsxs(s.Fragment,{children:[s.jsx(zr,{size:16,className:"animate-spin shrink-0"}),"生成中…"]}):"生成工作流"})]})]})})},UQ=_.memo(({children:e,onClick:t,className:n="",variant:r="primary",icon:i,disabled:a=!1,title:o=""})=>{const l="flex items-center justify-center px-3 py-1.5 rounded-lg transition-all duration-200 font-medium text-xs select-none disabled:opacity-50 disabled:cursor-not-allowed",c={primary:"bg-blue-600 hover:bg-blue-500 text-white shadow-lg shadow-blue-900/20 active:scale-95",secondary:"bg-zinc-800 hover:bg-zinc-700 text-zinc-300 border border-zinc-700 active:scale-95",ghost:"bg-transparent hover:bg-zinc-800 text-zinc-400 hover:text-white",danger:"bg-red-900/30 hover:bg-red-800 text-red-200 border border-red-800 active:scale-95"};return s.jsxs("button",{onClick:t,disabled:a,className:`${l} ${c[r]} ${n}`,title:o,children:[i&&s.jsx(i,{size:14,className:e?"mr-1.5":""}),e]})});UQ.displayName="Button";const GC=({visible:e,progress:t,status:n,type:r,onCancel:i,isDark:a=!0})=>e?s.jsx("div",{className:`fixed inset-0 z-[9999] flex items-center justify-center backdrop-blur-[2px] animate-in fade-in duration-300 select-none ${a?"bg-black/40":"bg-zinc-900/25"}`,style:{pointerEvents:i?"auto":"none"},children:s.jsxs("div",{className:`relative rounded-2xl p-8 shadow-2xl flex flex-col items-center min-w-[300px] backdrop-blur-xl ${a?"bg-[#09090b]/90 border border-white/10":"bg-white/95 border border-zinc-200"}`,children:[s.jsx("div",{className:`absolute -top-10 left-1/2 -translate-x-1/2 w-20 h-20 blur-[50px] rounded-full pointer-events-none ${a?"bg-blue-500/20":"bg-blue-400/30"}`}),i&&s.jsx("button",{onClick:i,className:a?"absolute top-3 right-3 p-1.5 rounded-lg bg-zinc-800/50 hover:bg-red-500/20 border border-zinc-700 hover:border-red-500/50 text-zinc-400 hover:text-red-400 transition-all duration-200 group":"absolute top-3 right-3 p-1.5 rounded-lg bg-zinc-100 hover:bg-red-50 border border-zinc-200 hover:border-red-300 text-zinc-600 hover:text-red-600 transition-all duration-200 group",title:"取消操作",children:s.jsx(Qr,{size:16,className:"group-hover:rotate-90 transition-transform duration-200"})}),s.jsxs("div",{className:"flex flex-col items-center gap-1 mb-6 z-10",children:[s.jsx("span",{className:"font-mono text-[10px] tracking-[0.3em] uppercase text-zinc-500",children:r==="import"?"DATA INGESTION":"SYSTEM ARCHIVING"}),s.jsxs("div",{className:`text-4xl font-bold tracking-tighter font-sans ${a?"text-zinc-200":"text-zinc-900"}`,children:[t.toFixed(0),s.jsx("span",{className:"text-sm ml-1 text-zinc-500",children:"%"})]})]}),s.jsx("div",{className:`relative w-full h-[2px] rounded-full overflow-hidden mb-4 ${a?"bg-zinc-800":"bg-zinc-200"}`,children:s.jsx("div",{className:a?"absolute top-0 left-0 h-full bg-white shadow-[0_0_10px_rgba(255,255,255,0.5)] transition-all duration-100 ease-linear":"absolute top-0 left-0 h-full bg-blue-600 shadow-[0_0_8px_rgba(37,99,235,0.45)] transition-all duration-100 ease-linear",style:{width:`${t}%`}})}),s.jsx("span",{className:`text-[10px] font-mono tracking-widest uppercase animate-pulse ${a?"text-zinc-400":"text-zinc-600"}`,children:n})]})}):null;function FQ({items:e,itemHeight:t=200,containerHeight:n=500,renderItem:r,overscan:i=2,className:a="",getItemKey:o}){const l=_.useRef(null),[c,u]=_.useState(0),d=e.length*t,h=Math.max(0,Math.floor(c/t)-i),p=Math.min(e.length-1,Math.ceil((c+n)/t)+i),f=[];for(let g=h;g<=p;g++)e[g]&&f.push({item:e[g],index:g,style:{position:"absolute",top:g*t,left:0,right:0,height:t}});const b=_.useCallback(g=>{u(g.currentTarget.scrollTop)},[]);return s.jsx("div",{ref:l,className:a,style:{overflow:"auto",height:n},onScroll:b,children:s.jsx("div",{style:{height:d,position:"relative"},children:f.map(({item:g,index:y,style:w})=>{const v=o?o(g,y):g.id??y;return s.jsx("div",{style:w,children:r(g,y)},v)})})})}_.memo(FQ);function H2(e){if(!e||typeof e!="string")return!1;const t=e.toLowerCase();return(t.includes("prod-ss-vidu")||t.includes("s3")&&t.includes("amazonaws"))&&(t.includes(".mp4")||t.includes("/video"))}function WQ({item:e,onClose:t,onNavigate:n,onSendToCanvas:r,isCanvasFullscreen:i=!1,canvasContainerRef:a}){var fe;const o=_.useRef(e),[l,c]=_.useState("single"),[u,d]=_.useState(0),[h,p]=_.useState([]),[f,b]=_.useState(null);_.useRef(0);const g=_.useRef(null),[y,w]=_.useState(null),[v,m]=_.useState(1),[z,C]=_.useState({x:0,y:0}),[E,I]=_.useState(!1),R=_.useRef({x:0,y:0,translateX:0,translateY:0}),A=_.useRef(null),O=_.useRef(null),F=_.useRef(null),L=_.useRef(1),X=_.useRef({x:0,y:0}),T=_.useRef(null),q=_.useRef(null),H=_.useRef({scale:1,x:0,y:0}),J=_.useRef(null),Z=_.useRef(0),B=(e==null?void 0:e.url)||(e==null?void 0:e.originalUrl),{content:V,isLoading:N,hasError:j}=Ul(B,{useOriginal:!0}),k=_.useMemo(()=>(e==null?void 0:e.mjImages)||[],[e]),W=iu(k,{useOriginal:!0}),M=_.useMemo(()=>W.map(be=>be.content).filter(Boolean),[W]),Y=W.some(be=>be.isLoading);W.some(be=>be.hasError),_.useEffect(()=>{o.current=e},[e]),_.useEffect(()=>()=>{g.current&&clearTimeout(g.current)},[]),_.useEffect(()=>{e!=null&&e.mjImages&&e.mjImages.length>1?(c(be=>{var de;return be==="single"&&e.id===((de=o.current)==null?void 0:de.id)?be:"grid"}),d(e.selectedMjImageIndex??0),p([]),b(null)):(c("single"),d(0),p([]),b(null)),m(1),C({x:0,y:0})},[e==null?void 0:e.id,(fe=e==null?void 0:e.mjImages)==null?void 0:fe.length]),_.useEffect(()=>{m(1),C({x:0,y:0}),L.current=1,X.current={x:0,y:0},H.current={scale:1,x:0,y:0},O.current&&(O.current.style.transform="scale(1) translate(0px, 0px)")},[u,l]),_.useLayoutEffect(()=>{const be=O.current;if(!be)return;const de=L.current,$e=X.current,ze=H.current;ze.scale===de&&ze.x===$e.x&&ze.y===$e.y||(H.current={scale:de,x:$e.x,y:$e.y},be.style.transform=`scale(${de}) translate(${$e.x}px, ${$e.y}px)`)});const[se,ie]=_.useState(null),[oe,re]=_.useState(!1),ee=_.useRef(null);_.useEffect(()=>{const be=(e==null?void 0:e.type)==="video"?M.length>0?M[u]:V:null;if(!be||!H2(be)){ee.current&&(URL.revokeObjectURL(ee.current),ee.current=null),ie(null),re(!1);return}return ie(be),re(!1),ee.current=be,()=>{ee.current=null,ie(null),re(!1)}},[e==null?void 0:e.type,e==null?void 0:e.id,V,M.length,u,M]),_.useEffect(()=>{const be=()=>w(null);if(y)return window.addEventListener("click",be),()=>window.removeEventListener("click",be)},[y]),_.useEffect(()=>{if(!E)return;let be=null;const de=()=>{T.current=null;const _e=be;if(be=null,!_e)return;const Ee=_e.clientX-R.current.x,Ce=_e.clientY-R.current.y,xe=R.current.translateX+Ee,Ne=R.current.translateY+Ce;X.current={x:xe,y:Ne};const ve=O.current;ve&&(ve.style.transform=`scale(${L.current}) translate(${xe}px, ${Ne}px)`)},$e=_e=>{be=_e,T.current==null&&(T.current=requestAnimationFrame(de))},ze=()=>{T.current!=null&&(cancelAnimationFrame(T.current),T.current=null),be=null,C({x:X.current.x,y:X.current.y}),I(!1)};return window.addEventListener("mousemove",$e,{passive:!0}),window.addEventListener("mouseup",ze,{passive:!0}),()=>{window.removeEventListener("mousemove",$e),window.removeEventListener("mouseup",ze),T.current!=null&&(cancelAnimationFrame(T.current),T.current=null)}},[E]);const pe=_.useCallback(async be=>{var de,$e;try{if(typeof navigator>"u")return;if(!navigator.clipboard||!("ClipboardItem"in window)){await((de=navigator.clipboard)==null?void 0:de.writeText(be));return}const _e=await(await fetch(be)).blob(),Ee=_e.type||"image/png",Ce=new ClipboardItem({[Ee]:_e});await navigator.clipboard.write([Ce])}catch(ze){console.warn("[Lightbox] Failed to copy image to clipboard:",ze);try{await(($e=navigator.clipboard)==null?void 0:$e.writeText(be))}catch{}}},[]);_.useEffect(()=>{if(!e)return;const be=$e=>{if(!o.current)return;const _e=$e.target;if(!(_e.tagName==="INPUT"||_e.tagName==="TEXTAREA")){if($e.key==="Escape"){$e.preventDefault(),$e.stopPropagation(),l==="single"&&M.length>1?c("grid"):t();return}if(l==="single"&&M.length>1){if($e.key==="ArrowLeft"||$e.key==="Left"){$e.preventDefault(),$e.stopPropagation();const Ee=u>0?u-1:M.length-1;d(Ee),n&&n(Ee)}else if($e.key==="ArrowRight"||$e.key==="Right"){$e.preventDefault(),$e.stopPropagation();const Ee=u{var xe;if(!($e.ctrlKey||$e.metaKey)||((xe=$e.key)==null?void 0:xe.toLowerCase())!=="c")return;const ze=$e.target;if(!!ze&&(ze.tagName==="INPUT"||ze.tagName==="TEXTAREA"||ze.isContentEditable))return;const Ee=o.current;if(!Ee||Ee.type!=="image")return;const Ce=M.length>0&&M[u]||V;Ce&&($e.preventDefault(),$e.stopPropagation(),$e.stopImmediatePropagation(),await pe(Ce))};return window.addEventListener("keydown",de,!0),()=>{window.removeEventListener("keydown",be),window.removeEventListener("keydown",de,!0)}},[e,n,M,l,u,t,V,pe]);const we=_.useCallback(be=>{const de=A.current;if(A.current=be,q.current&&(clearTimeout(q.current),q.current=null),J.current!=null&&(cancelAnimationFrame(J.current),J.current=null),de&&F.current&&(de.removeEventListener("wheel",F.current),F.current=null),be){const $e=()=>{J.current=null;const _e=Z.current;if(Z.current=0,_e===0)return;const Ee=Math.min(5,Math.max(.2,L.current+_e));L.current=Ee;const Ce=O.current;if(Ce){const{x:xe,y:Ne}=X.current;Ce.style.transform=`scale(${Ee}) translate(${xe}px, ${Ne}px)`}q.current&&clearTimeout(q.current),q.current=setTimeout(()=>{q.current=null,m(L.current)},120)},ze=_e=>{_e.preventDefault(),_e.stopPropagation(),Z.current+=_e.deltaY>0?-.08:.08,J.current==null&&(J.current=requestAnimationFrame($e))};F.current=ze,be.addEventListener("wheel",ze,{passive:!1})}},[]);if(!e)return null;const Q=M.length>0&&M[u]||V;if(N||Y)return s.jsx("div",{className:"fixed inset-0 z-[200] bg-black flex items-center justify-center",onClick:t,children:s.jsx(zr,{className:"w-12 h-12 animate-spin text-blue-500"})});if(!Q||j&&!M.length)return s.jsxs("div",{className:"fixed inset-0 z-[200] bg-black flex flex-col items-center justify-center gap-4",onClick:t,children:[s.jsxs("div",{className:"text-white/70 text-center",children:[s.jsx("div",{className:"text-lg mb-2",children:"图片加载失败"}),s.jsx("div",{className:"text-sm text-white/50",children:"可能是网络问题或图片已过期"})]}),s.jsx("button",{onClick:t,className:"px-4 py-2 bg-white/10 hover:bg-white/20 rounded-lg text-white text-sm transition-colors",children:"关闭"})]});if(!Q)return null;const ue=(be,de)=>{be.stopPropagation();const $e=be.ctrlKey||be.metaKey,ze=be.shiftKey;if($e){p(_e=>_e.includes(de)?_e.filter(Ce=>Ce!==de):[..._e,de]),b(de);return}if(ze){const _e=f!==null?f:0,Ee=de,Ce=Math.min(_e,Ee),xe=Math.max(_e,Ee),Ne=Array.from({length:xe-Ce+1},(ve,ke)=>Ce+ke);p(ve=>{const ke=new Set([...ve,...Ne]);return Array.from(ke)}),b(de);return}},U=(be,de)=>{be.stopPropagation(),be.preventDefault(),g.current&&(clearTimeout(g.current),g.current=null),d(de),c("single"),n&&n(de)},G=(be,de)=>{be.preventDefault(),be.stopPropagation(),h.includes(de)||p([de]),w({x:be.clientX,y:be.clientY})},te=()=>{const be=M.length,de=be<=4?"grid-cols-2":"grid-cols-3",$e=be<=4?"max-w-4xl":"max-w-6xl";return s.jsxs("div",{className:`${$e} w-full p-8 select-none`,onClick:ze=>ze.stopPropagation(),children:[s.jsx("div",{className:`grid ${de} gap-4`,children:M.map((ze,_e)=>{const Ee=h.includes(_e);return s.jsxs("div",{className:`relative aspect-square bg-zinc-900 rounded-lg overflow-hidden cursor-pointer group transition-all duration-200 ${Ee?"ring-4 ring-blue-500 z-10 scale-[0.98]":"hover:ring-2 hover:ring-blue-500 hover:z-10"}`,onClick:Ce=>ue(Ce,_e),onDoubleClick:Ce=>U(Ce,_e),onContextMenu:Ce=>G(Ce,_e),children:[s.jsx("img",{src:ze,alt:`Image ${_e+1}`,className:"w-full h-full object-cover pointer-events-none"}),s.jsx("div",{className:`absolute inset-0 transition-colors flex items-center justify-center pointer-events-none ${Ee?"bg-blue-500/20":"bg-black/0 group-hover:bg-black/20"}`,children:s.jsxs("div",{className:`transition-opacity bg-black/60 px-3 py-1 rounded-full text-white text-sm pointer-events-none ${Ee?"opacity-100":"opacity-0 group-hover:opacity-100"}`,children:[_e+1,"/",be]})}),Ee&&s.jsx("div",{className:"absolute top-2 right-2 bg-blue-500 text-white rounded-full w-6 h-6 flex items-center justify-center text-xs font-bold shadow-sm pointer-events-none",children:"✓"})]},_e)})}),s.jsx("div",{className:"mt-4 text-center",children:h.length>0?s.jsxs("div",{className:"text-white/70 text-sm",children:["已选中 ",h.length," 张图片",s.jsx("button",{onClick:ze=>{ze.stopPropagation(),p([])},className:"ml-4 text-blue-400 hover:text-blue-300 underline",children:"清除选择"})]}):s.jsx("div",{className:"text-white/50 text-xs",children:"提示:双击查看大图(底部「发送到画布」)• Ctrl+点击多选 • Shift+范围选择 • 右键批量发送到画布"})})]})},ge=be=>{if(be.button!==0&&be.button!==1)return;be.preventDefault();const de=X.current;R.current={x:be.clientX,y:be.clientY,translateX:de.x,translateY:de.y},I(!0)},ne=be=>{be.button===1&&be.preventDefault()},le=()=>s.jsx("div",{className:"w-full h-full flex items-center justify-center pointer-events-auto",onClick:be=>{be.target===be.currentTarget&&t(),be.stopPropagation()},children:s.jsxs("div",{className:"w-full h-full min-h-0 min-w-0 flex items-center justify-center px-8 py-8 relative overflow-hidden",onClick:be=>{be.target===be.currentTarget&&t()},children:[e.type==="image"?s.jsx("div",{ref:we,className:"flex items-center justify-center select-none overflow-hidden",style:{width:"90vw",height:"85vh",maxWidth:"100%",maxHeight:"100%",cursor:E?"grabbing":"grab",contain:"layout style paint"},onMouseDown:ge,onAuxClick:ne,onDoubleClick:be=>{be.stopPropagation(),t()},children:s.jsx("img",{ref:O,src:Q,alt:e.prompt,decoding:"async",className:"w-full h-full object-contain shadow-2xl",style:{transition:"none",willChange:"transform",imageRendering:"auto",backfaceVisibility:"hidden",WebkitBackfaceVisibility:"hidden",transformStyle:"preserve-3d",WebkitTransformStyle:"preserve-3d"},onLoad:be=>{const de=be.target;O.current===de&&de.decode().catch(()=>{}).finally(()=>{O.current===de&&(de.style.transform=`scale(${L.current}) translate(${X.current.x}px, ${X.current.y}px)`)})},onError:be=>{console.error("[Lightbox] Image load error:",Q),be.target.style.display="none"},draggable:!1})}):e.type==="video"?s.jsxs(s.Fragment,{children:[H2(Q)&&oe&&s.jsxs("div",{className:"absolute inset-0 flex items-center justify-center bg-black/50 z-10",children:[s.jsx(zr,{className:"w-8 h-8 animate-spin text-white"}),s.jsx("span",{className:"ml-3 text-white text-sm",children:"加载视频…"})]}),s.jsx("video",{src:H2(Q)?se??Q??"":Ea(Q)||Q||"",controls:!0,autoPlay:!0,className:"max-w-full max-h-full object-contain shadow-2xl",onError:be=>{console.error("[Lightbox] Video load error:",Q)}})]}):e.type==="audio"?s.jsxs("div",{className:"flex flex-col items-center gap-3 w-full max-w-2xl",children:[s.jsx("audio",{src:Q,controls:!0,autoPlay:!0,className:"w-full",onError:be=>{console.error("[Lightbox] Audio load error:",Q)}}),s.jsxs("button",{type:"button",onClick:be=>{be.stopPropagation(),Q&&GO(Q,`audio-${Date.now()}.mp3`)},className:"flex items-center gap-2 px-4 py-2 rounded-lg bg-white/10 hover:bg-white/20 text-white text-sm transition-colors",title:"转换为 MP3 并下载",children:[s.jsx(mu,{size:16}),"转为 MP3 并下载"]})]}):null,M.length>1&&s.jsxs(s.Fragment,{children:[s.jsx("button",{className:"absolute left-4 top-1/2 -translate-y-1/2 text-white/70 hover:text-white p-3 bg-black/50 rounded-full hover:bg-black/70 transition-colors",onClick:be=>{be.stopPropagation();const de=u>0?u-1:M.length-1;d(de),n&&n(de)},children:s.jsx(PP,{size:24})}),s.jsx("button",{className:"absolute right-4 top-1/2 -translate-y-1/2 text-white/70 hover:text-white p-3 bg-black/50 rounded-full hover:bg-black/70 transition-colors",onClick:be=>{be.stopPropagation();const de=u1&&s.jsx("button",{className:"absolute top-6 left-6 text-white/60 hover:text-white p-2 rounded-full hover:bg-white/10 transition-all z-50 pointer-events-auto",onClick:be=>{be.stopPropagation(),c("grid")},children:s.jsx(gu,{size:28})}),s.jsxs("div",{className:"w-full h-full relative overflow-hidden flex items-center justify-center pointer-events-none z-10",children:[s.jsx("div",{className:`absolute inset-0 w-full h-full flex items-center justify-center transition-opacity duration-300 pointer-events-auto ${l==="grid"?"opacity-100 z-10":"opacity-0 z-0 pointer-events-none"}`,onClick:be=>{be.target===be.currentTarget&&t()},children:M.length>1?te():null}),s.jsx("div",{className:`absolute inset-0 w-full h-full flex items-center justify-center transition-opacity duration-300 pointer-events-auto ${l==="single"?"opacity-100 z-10":"opacity-0 z-0 pointer-events-none"}`,onClick:be=>{be.target===be.currentTarget&&t()},children:le()})]}),s.jsx("div",{className:`absolute bottom-6 left-1/2 -translate-x-1/2 transition-all duration-300 z-40 pointer-events-auto ${l==="single"?"opacity-100 translate-y-0":"opacity-0 translate-y-4 pointer-events-none"}`,children:s.jsx("div",{className:"bg-black/90 px-3 py-2 sm:px-4 rounded-full text-white text-xs border border-white/10 shadow-xl max-w-[min(100vw-2rem,42rem)]",children:s.jsxs("div",{className:"flex items-center gap-2 flex-wrap sm:flex-nowrap justify-center sm:justify-start",children:[s.jsx("div",{className:"flex-1 min-w-0 line-clamp-1 text-white/90 text-left",children:e.prompt||" "}),s.jsxs("div",{className:"flex items-center gap-1.5 flex-shrink-0",children:[r&&e.type==="image"&&Q?s.jsxs("button",{type:"button",onClick:be=>{be.stopPropagation(),r([Q]),t()},className:"flex items-center gap-1 px-2.5 py-0.5 text-[10px] font-medium bg-cyan-600/90 hover:bg-cyan-500 rounded-full transition-colors text-white",title:"将当前预览图发送到画布(新建图片节点)",children:[s.jsx(Lo,{size:11,className:"shrink-0"}),"发送到画布"]}):null,s.jsx("button",{type:"button",onClick:be=>{be.stopPropagation(),e.prompt&&navigator.clipboard.writeText(e.prompt).then(()=>{console.log("提示词已复制")}).catch(de=>{console.error("复制失败:",de)})},className:"px-2 py-0.5 text-[10px] bg-white/10 hover:bg-white/20 rounded-full transition-colors",title:"复制提示词",children:"复制"})]})]})})}),y&&s.jsx("div",{className:"fixed bg-zinc-800 border border-zinc-700 rounded-lg shadow-2xl py-1 min-w-[180px] z-[300] animate-in zoom-in-95 duration-100",style:{left:y.x,top:y.y},onClick:be=>be.stopPropagation(),children:s.jsxs("button",{className:"w-full px-4 py-2 text-left text-sm text-white hover:bg-zinc-700 transition-colors flex items-center gap-2",onClick:be=>{be.stopPropagation();const de=h.sort(($e,ze)=>$e-ze).map($e=>M[$e]).filter(Boolean);de.length>0&&r&&(r(de),t()),w(null)},children:[s.jsx(gu,{size:14}),"发送到画布 (",h.length,"张)"]})})]})}function DQ(e,t){var n,r;if(e.item!==t.item){if(!e.item||!t.item||e.item.type!==t.item.type||e.item.url!==t.item.url||e.item.id!==t.item.id)return!1;const i=((n=e.item.mjImages)==null?void 0:n.length)??0,a=((r=t.item.mjImages)==null?void 0:r.length)??0;if(i!==a||e.item.selectedMjImageIndex!==t.item.selectedMjImageIndex)return!1}return e.onClose===t.onClose&&e.onNavigate===t.onNavigate&&e.onSendToCanvas===t.onSendToCanvas&&e.isCanvasFullscreen===t.isCanvasFullscreen&&e.canvasContainerRef===t.canvasContainerRef}const VQ=fr.memo(WQ,DQ),op={thumbnail:{maxSize:128,quality:.35},preview:{maxSize:256,quality:.55},full:{maxSize:800,quality:.75},original:{maxSize:1/0,quality:1}},w$=({src:e,displayWidth:t,displayHeight:n,zoom:r,className:i="",alt:a="",isDark:o=!1,style:l,objectFit:c="contain",quality:u="auto",isInViewport:d=!0,isInteracting:h=!1,nodeId:p,enableThumbnails:f=!0,shouldLoadContent:b=!0,onBlobUrlRecovery:g,blobRecoveryAssetIds:y})=>{const[w,v]=_.useState(()=>e||null),[m,z]=_.useState(!1),C=_.useRef(null),E=_.useRef([]);_.useRef(!1),_.useRef(`img-${Date.now()}-${Math.random().toString(36).substr(2,9)}`),_.useMemo(()=>{let F=0;return d&&(F+=10),h||(F+=5),r>.5&&(F+=3),F},[d,h,r]);const I=_.useMemo(()=>r<.25?.2:r<.5?.4:r<.8?.6:r<1.2?1:r<1.8?1.5:2,[r]),R=_.useMemo(()=>{if(!b)return null;if(u!=="auto")switch(u){case"low":return op.thumbnail;case"medium":return op.preview;case"high":return op.full;case"original":return op.original}const F=t*I,L=n*I,X=Math.max(F,L);return X<=128?{maxSize:128,quality:.35,useCached:!0}:X<=256?{maxSize:256,quality:.55,useCached:!0}:X<=512?{maxSize:512,quality:.65,useCached:!0}:X<=1024?{maxSize:1024,quality:.72,useCached:!0}:X<100?op.thumbnail:X<280?op.preview:X<700?op.full:{maxSize:1024,quality:.72,useCached:!0}},[t,n,I,u,b]),A=_.useCallback(()=>{E.current.forEach(F=>{F.startsWith("blob:")&&URL.revokeObjectURL(F)}),E.current=[]},[]);_.useEffect(()=>()=>{A()},[A]);const O=_.useCallback(async(F,L,X)=>new Promise((T,q)=>{const H=new Image;H.onload=()=>{try{let J=H.naturalWidth,Z=H.naturalHeight;if(J>L||Z>L){const N=Math.min(L/J,L/Z);J=Math.round(J*N),Z=Math.round(Z*N)}C.current||(C.current=document.createElement("canvas"));const B=C.current;B.width=J,B.height=Z;const V=B.getContext("2d",{alpha:!0,willReadFrequently:!1});if(!V){T(F);return}V.imageSmoothingEnabled=!0,V.imageSmoothingQuality="high",V.drawImage(H,0,0,J,Z),B.toBlob(N=>{if(N){const j=URL.createObjectURL(N);E.current.push(j),T(j)}else T(F)},"image/jpeg",X)}catch{T(F)}},H.onerror=()=>{T(F)},H.src=F}),[]);return _.useEffect(()=>{if(!e||!b){v(null);return}if(!R){v(null);return}const F=R.maxSize===1/0||R.quality>=1,L=e.startsWith("data:")&&e.length<80*1024;if(F&&L){v(e);return}const X=F&&!L?{maxSize:1024,quality:.72,useCached:!0}:R;let T=!1;return(async()=>{if(!p||!X.useCached){const H=await O(e,X.maxSize,X.quality??.78);T||v(H);return}try{const H=await zi.getBestMatchThumbnail(p,X.maxSize);if(H&&!T)v(H);else{const J=await O(e,X.maxSize,X.quality??.78);T||(v(J),p&&e.startsWith("data:image")&&zi.generateAndStoreStandardSizes(p,e).catch(()=>{}))}}catch{const J=await O(e,X.maxSize,X.quality??.78);T||v(J)}})(),()=>{T=!0}},[e,R,b,O,p]),_.useEffect(()=>()=>{A()},[A]),s.jsx("div",{className:`relative overflow-hidden ${i}`,style:{width:"100%",height:"100%",...l},children:w?s.jsx("img",{src:w,alt:a,className:"absolute inset-0 w-full h-full",style:{objectFit:c,imageRendering:"auto",WebkitFontSmoothing:"auto"},draggable:!1,loading:"lazy",decoding:"async",onError:()=>{e!=null&&e.startsWith("blob:")&&g?g(e).then(F=>{F?(v(F),z(!1)):z(!0)}).catch(()=>z(!0)):e!=null&&e.startsWith("blob:")&&(y!=null&&y.length)?mn(async()=>{const{recoverDeadBlobUrl:F}=await Promise.resolve().then(()=>Do);return{recoverDeadBlobUrl:F}},void 0,import.meta.url).then(({recoverDeadBlobUrl:F})=>F(e,y)).then(F=>{F?(v(F),z(!1)):z(!0)}).catch(()=>z(!0)):z(!0)},onDoubleClick:F=>{F.preventDefault(),F.stopPropagation(),F.nativeEvent.stopImmediatePropagation()}}):m?s.jsx("div",{className:"flex items-center justify-center",style:{width:"100%",height:"100%",backgroundColor:o?"#27272a":"#e4e4e7"},children:s.jsx("span",{className:`text-xs ${o?"text-zinc-500":"text-zinc-400"}`,children:"加载失败"})}):null})},HQ=` +@keyframes shimmer { + 0% { background-position: -200% 0; } + 100% { background-position: 200% 0; } +} +`;if(typeof document<"u"){const e="smart-image-styles";if(!document.getElementById(e)){const t=document.createElement("style");t.id=e,t.textContent=HQ,document.head.appendChild(t)}}const GQ=({progress:e,size:t=48,strokeWidth:n=4,isDark:r=!0,showPercentage:i=!0,className:a=""})=>{const o=(t-n)/2,l=o*2*Math.PI,c=l-e/100*l,d=e<30?r?"#3b82f6":"#0ea5e9":e<70?r?"#8b5cf6":"#6366f1":r?"#22c55e":"#10b981",h=r?"#27272a":"#e4e4e7";return s.jsxs("div",{className:`relative inline-flex items-center justify-center ${a}`,children:[s.jsxs("svg",{width:t,height:t,className:"transform -rotate-90",children:[s.jsx("circle",{cx:t/2,cy:t/2,r:o,fill:"none",stroke:h,strokeWidth:n}),s.jsx("circle",{cx:t/2,cy:t/2,r:o,fill:"none",stroke:d,strokeWidth:n,strokeLinecap:"round",strokeDasharray:l,strokeDashoffset:c,className:"transition-all duration-300 ease-out",style:{filter:`drop-shadow(0 0 4px ${d}40)`}}),e===0&&s.jsx("circle",{cx:t/2,cy:t/2,r:o,fill:"none",stroke:d,strokeWidth:n,strokeLinecap:"round",strokeDasharray:`${l*.25} ${l*.75}`,className:"animate-spin origin-center",style:{transformOrigin:"center",animation:"spin 1.5s linear infinite"}})]}),i&&s.jsx("div",{className:"absolute inset-0 flex items-center justify-center",style:{fontSize:t*.22},children:s.jsxs("span",{className:`font-semibold ${r?"text-zinc-200":"text-zinc-700"}`,children:[Math.round(e),"%"]})})]})},qQ=_.memo(GQ),t9=_.memo(({isGenerating:e,className:t="",nodeId:n,modelId:r})=>{const[i,a]=_.useState(0),o=_.useRef(null),l=_.useRef(null),[c,u]=_.useState(!1),d=r&&(r.includes("kling-o1")||r.includes("kling_o1")||r.includes("omni-video"));return _.useEffect(()=>{if(!d||!n)return;const h=p=>{const{taskId:f}=p.detail;console.log("[GenerationTimer] 收到 klingO1VideoComplete 事件:",{taskId:f,nodeId:n,detail:p.detail}),u(!0)};return window.addEventListener("klingO1VideoComplete",h),()=>{window.removeEventListener("klingO1VideoComplete",h)}},[d,n]),_.useEffect(()=>{if(!d||!n)return;const h=p=>{const{assetId:f}=p.detail;f&&f.includes(n)&&(console.log("[GenerationTimer] 可灵 O1 资源下载完成,停止计时器:",f),u(!0))};return window.addEventListener("assetDownloadComplete",h),()=>{window.removeEventListener("assetDownloadComplete",h)}},[d,n]),_.useEffect(()=>{if(!e||c){l.current&&(clearInterval(l.current),l.current=null),e||(o.current=null,a(0),u(!1));return}return o.current=Date.now(),a(0),l.current=setInterval(()=>{o.current&&a((Date.now()-o.current)/1e3)},100),()=>{l.current&&(clearInterval(l.current),l.current=null)}},[e,c]),!e||c?null:s.jsxs("span",{className:t,children:[i.toFixed(1),"s"]})});t9.displayName="GenerationTimer";const KQ=({isGenerating:e,isDark:t,nodeId:n,modelId:r})=>e?s.jsxs("div",{className:`px-2 py-1 rounded-full text-[10px] font-mono flex items-center gap-1 ${t?"bg-transparent text-white/80 border border-white/40":"bg-white/90 text-zinc-900 border border-zinc-300"}`,children:[s.jsx(dd,{size:10,className:t?"text-white/80 animate-pulse":"text-zinc-900 animate-pulse"}),s.jsx(t9,{isGenerating:e,className:"font-mono",nodeId:n,modelId:r})]}):null,U0=({audioUrl:e,isDark:t,title:n,onDownload:r,onDownloadAsMp3:i,className:a="",initialDuration:o,showToast:l})=>{const c=_.useRef(null),[u,d]=_.useState(!1),[h,p]=_.useState(0),[f,b]=_.useState(o||0),[g,y]=_.useState(1),[w,v]=_.useState(!1);_.useEffect(()=>{var Z;const A=c.current;if(!A)return;const O=()=>p(A.currentTime),F=()=>{A.duration&&!isNaN(A.duration)&&isFinite(A.duration)&&b(A.duration)},L=()=>d(!1),X=B=>{console.error("[AudioPlayer] Audio load error:",B),d(!1)},T=()=>{A.duration&&!isNaN(A.duration)&&isFinite(A.duration)?b(A.duration):o&&o>0&&b(o)},q=()=>{A.duration&&!isNaN(A.duration)&&isFinite(A.duration)?b(A.duration):o&&o>0&&b(o)};A.addEventListener("timeupdate",O),A.addEventListener("loadedmetadata",q),A.addEventListener("durationchange",F),A.addEventListener("ended",L),A.addEventListener("error",X),A.addEventListener("canplay",T),o&&o>0&&(!A.duration||isNaN(A.duration))&&b(o);const H=["mp3","wav","ogg","m4a","aac","flac","webm"],J=((Z=e.split(".").pop())==null?void 0:Z.toLowerCase())||"";return(!J||!H.includes(J))&&A.load(),()=>{A.removeEventListener("timeupdate",O),A.removeEventListener("loadedmetadata",q),A.removeEventListener("durationchange",F),A.removeEventListener("ended",L),A.removeEventListener("error",X),A.removeEventListener("canplay",T)}},[e,o]);const m=()=>{const A=c.current;A&&(u?A.pause():A.play(),d(!u))},z=A=>{const O=c.current;if(!O)return;const F=parseFloat(A.target.value);O.currentTime=F,p(F)},C=A=>{const O=c.current;if(!O)return;const F=parseFloat(A.target.value);O.volume=F,y(F),v(F===0)},E=()=>{const A=c.current;A&&(w?(A.volume=g||.5,v(!1)):(A.volume=0,v(!0)))},I=A=>{if(isNaN(A)||!isFinite(A)||A<0)return"0:00";const O=Math.floor(A/60),F=Math.floor(A%60);return`${O}:${F.toString().padStart(2,"0")}`},R=f>0?h/f*100:0;return s.jsxs("div",{className:`flex flex-col gap-2 ${a}`,onDoubleClick:A=>{A.stopPropagation()},onClick:A=>{A.target===A.currentTarget&&A.stopPropagation()},children:[s.jsx("audio",{ref:c,src:e,preload:"metadata",crossOrigin:"anonymous",children:s.jsx("p",{className:`text-xs ${t?"text-zinc-400":"text-zinc-600"}`,children:"您的浏览器不支持音频播放"})}),n&&s.jsx("div",{className:`text-xs font-medium truncate ${t?"text-zinc-300":"text-zinc-700"}`,children:n}),s.jsxs("div",{className:`flex items-center gap-1.5 p-2 rounded-lg border ${t?"bg-zinc-800/50 border-zinc-700":"bg-zinc-50 border-zinc-200"}`,onClick:A=>{A.stopPropagation()},onMouseDown:A=>{A.stopPropagation()},children:[s.jsx("button",{onClick:A=>{A.stopPropagation(),m()},onMouseDown:A=>{A.stopPropagation()},className:`p-1.5 rounded transition-colors ${t?"hover:bg-zinc-700 text-zinc-300":"hover:bg-zinc-200 text-zinc-600"}`,title:u?"暂停":"播放",children:u?s.jsx(Rw,{size:16}):s.jsx(Ia,{size:16})}),s.jsxs("div",{className:"flex-1 flex items-center gap-1.5 min-w-0",children:[s.jsx("span",{className:`text-[10px] font-mono shrink-0 text-right ${t?"text-zinc-400":"text-zinc-500"}`,style:{minWidth:"32px",maxWidth:"40px"},children:I(h)}),s.jsx("input",{type:"range",min:"0",max:f||0,value:h,onChange:z,className:"flex-1 min-w-0 appearance-none cursor-pointer audio-slider",style:{background:`linear-gradient(to right, ${t?"#3b82f6":"#2563eb"} 0%, ${t?"#3b82f6":"#2563eb"} ${R}%, ${t?"#27272a":"#e4e4e7"} ${R}%, ${t?"#27272a":"#e4e4e7"} 100%)`}}),s.jsx("span",{className:`text-[10px] font-mono shrink-0 ${t?"text-zinc-400":"text-zinc-500"}`,style:{minWidth:"32px",maxWidth:"40px"},children:I(f)})]}),s.jsxs("div",{className:"flex items-center gap-1 shrink-0",children:[s.jsx("button",{onClick:A=>{A.stopPropagation(),E()},onMouseDown:A=>{A.stopPropagation()},className:`p-1 rounded transition-colors ${t?"hover:bg-zinc-700 text-zinc-300":"hover:bg-zinc-200 text-zinc-600"}`,title:w?"取消静音":"静音",children:s.jsx(zq,{size:14})}),s.jsx("input",{type:"range",min:"0",max:"1",step:"0.1",value:w?0:g,onChange:C,className:"w-12 appearance-none cursor-pointer audio-slider shrink-0",style:{background:`linear-gradient(to right, ${t?"#3b82f6":"#2563eb"} 0%, ${t?"#3b82f6":"#2563eb"} ${(w?0:g)*100}%, ${t?"#27272a":"#e4e4e7"} ${(w?0:g)*100}%, ${t?"#27272a":"#e4e4e7"} 100%)`}})]}),s.jsx("button",{type:"button",onClick:async A=>{var O,F,L;if(A.preventDefault(),A.stopPropagation(),console.log("[AudioPlayer] Download button clicked, audioUrl:",e),r){console.log("[AudioPlayer] Using custom onDownload callback");try{await r(),console.log("[AudioPlayer] Download completed successfully"),l?l("音频下载成功","success"):alert("音频下载成功")}catch(X){console.error("[AudioPlayer] Download failed:",X),l?l("音频下载失败","error"):alert("音频下载失败")}return}if(!e){console.warn("[AudioPlayer] No audio URL available");return}console.log("[AudioPlayer] Starting download...");try{const X=await fetch(e,{method:"GET",mode:"cors"});if(!X.ok)throw new Error("下载失败");const T=await X.blob(),q=URL.createObjectURL(T),H=`${n||"audio"}.${((O=e.split(".").pop())==null?void 0:O.split("?")[0])||"mp3"}`,J=document.createElement("a");J.href=q,J.download=H,J.style.display="none",document.body.appendChild(J),J.click(),console.log("[AudioPlayer] Download started successfully"),l?l("音频下载成功","success"):alert("音频下载成功"),setTimeout(()=>{document.body.removeChild(J),URL.revokeObjectURL(q)},100)}catch(X){console.error("[AudioPlayer] Fetch download failed:",X);try{const T=`${n||"audio"}.${((F=e.split(".").pop())==null?void 0:F.split("?")[0])||"mp3"}`,q=document.createElement("iframe");q.style.display="none",document.body.appendChild(q);const H=q.contentDocument||((L=q.contentWindow)==null?void 0:L.document);if(H){const J=H.createElement("a");J.href=e,J.download=T,H.body.appendChild(J),J.click(),console.log("[AudioPlayer] Iframe download started"),l?l("音频下载已开始","success"):alert("音频下载已开始"),setTimeout(()=>{document.body.removeChild(q)},1e3)}else throw new Error("无法创建 iframe")}catch(T){console.error("[AudioPlayer] Iframe download failed:",T),l?l("音频下载失败,请右键点击播放器保存","error"):alert('音频下载失败,请右键点击播放器选择"另存为"')}}},onMouseDown:A=>{console.log("[AudioPlayer] Download button mousedown"),A.stopPropagation()},onDoubleClick:A=>{console.log("[AudioPlayer] Download button double click prevented"),A.stopPropagation()},className:`p-1.5 rounded transition-colors audio-player-download inline-flex items-center justify-center ${t?"hover:bg-zinc-700 text-zinc-300 hover:text-white":"hover:bg-zinc-200 text-zinc-600 hover:text-zinc-900"}`,title:"下载音频",style:{cursor:"pointer"},children:s.jsx(mu,{size:16})}),i&&s.jsx("button",{type:"button",onClick:A=>{A.preventDefault(),A.stopPropagation(),i()},onMouseDown:A=>A.stopPropagation(),onDoubleClick:A=>A.stopPropagation(),className:`p-1.5 rounded transition-colors inline-flex items-center justify-center text-xs ${t?"hover:bg-zinc-700 text-zinc-300 hover:text-white":"hover:bg-zinc-200 text-zinc-600 hover:text-zinc-900"}`,title:"转为 MP3 并下载",style:{cursor:"pointer"},children:"MP3"})]})]})},XQ=({toast:e,onClose:t,isDark:n})=>{const[r,i]=_.useState(!1);_.useEffect(()=>{if(e.duration&&e.duration>0){const c=setTimeout(()=>{i(!0),setTimeout(()=>t(e.id),300)},e.duration);return()=>clearTimeout(c)}},[e.id,e.duration,t]);const a=()=>{i(!0),setTimeout(()=>t(e.id),300)},o=()=>{switch(e.type){case"success":return s.jsx(Aw,{size:18,className:"text-green-500"});case"error":return s.jsx(LP,{size:18,className:"text-red-500"});case"warning":return s.jsx(nf,{size:18,className:"text-amber-500"});case"loading":return s.jsx(zr,{size:18,className:"text-blue-500 animate-spin"});default:return s.jsx(mu,{size:18,className:"text-blue-500"})}},l=()=>{if(n)switch(e.type){case"success":return"bg-green-900/90 border-green-700";case"error":return"bg-red-900/90 border-red-700";case"warning":return"bg-amber-900/90 border-amber-700";case"loading":return"bg-blue-900/90 border-blue-700";default:return"bg-zinc-800/95 border-zinc-700"}else switch(e.type){case"success":return"bg-green-50 border-green-300";case"error":return"bg-red-50 border-red-300";case"warning":return"bg-amber-50 border-amber-300";case"loading":return"bg-blue-50 border-blue-300";default:return"bg-white border-zinc-300"}};return s.jsxs("div",{className:` + flex items-center gap-3 px-4 py-3 rounded-lg border shadow-lg backdrop-blur-sm + transition-all duration-300 min-w-[280px] max-w-[400px] + ${l()} + ${r?"opacity-0 translate-x-4":"opacity-100 translate-x-0"} + `,children:[o(),s.jsxs("div",{className:"flex-1 min-w-0",children:[s.jsx("p",{className:`text-sm font-medium whitespace-pre-line ${n?"text-zinc-100":"text-zinc-800"}`,children:e.message}),e.progress!==void 0&&e.progress>=0&&s.jsx("div",{className:"mt-2 h-1.5 bg-zinc-700/30 rounded-full overflow-hidden",children:s.jsx("div",{className:"h-full bg-blue-500 rounded-full transition-all duration-300",style:{width:`${e.progress}%`}})})]}),e.type!=="loading"&&s.jsx("button",{onClick:a,className:`p-1 rounded-full transition-colors ${n?"hover:bg-zinc-700 text-zinc-400":"hover:bg-zinc-200 text-zinc-500"}`,children:s.jsx(Qr,{size:14})})]})},n9=_.memo(({toasts:e,onClose:t,isDark:n})=>e.length===0?null:s.jsx("div",{className:"fixed bottom-4 right-4 z-[9999] flex flex-col gap-2",children:e.map(r=>s.jsx(XQ,{toast:r,onClose:t,isDark:n},r.id))}));n9.displayName="ToastContainer";function YQ(){const[e,t]=_.useState([]),n=_.useCallback(d=>{const h=`toast_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,p={...d,id:h,duration:d.duration??(d.type==="loading"?0:4e3)};return t(f=>[...f,p]),h},[]),r=_.useCallback(d=>{t(h=>h.filter(p=>p.id!==d))},[]),i=_.useCallback((d,h)=>{t(p=>p.map(f=>f.id===d?{...f,...h}:f))},[]),a=_.useCallback((d,h)=>n({type:"success",message:d,duration:h}),[n]),o=_.useCallback((d,h)=>n({type:"error",message:d,duration:h}),[n]),l=_.useCallback((d,h)=>n({type:"warning",message:d,duration:h}),[n]),c=_.useCallback((d,h)=>n({type:"info",message:d,duration:h}),[n]),u=_.useCallback((d,h)=>n({type:"loading",message:d,duration:0,progress:h}),[n]);return{toasts:e,addToast:n,removeToast:r,updateToast:i,success:a,error:o,warning:l,info:c,loading:u}}const JQ=({isDark:e,size:t=32})=>{const[n,r]=_.useState("center");_.useEffect(()=>{const u=()=>{const d=2e3+Math.random()*3e3;setTimeout(()=>{const h=Math.random()>.5?"left":"right";r(h),setTimeout(()=>{r("center"),u()},500)},d)};u()},[]);const a=(()=>{switch(n){case"left":return-2;case"right":return 2;default:return 0}})(),o=e?"#3b82f6":"#2563eb",l="#ffffff",c=e?"#1e293b":"#0f172a";return s.jsxs("svg",{width:t,height:t,viewBox:"0 0 32 32",fill:"none",xmlns:"http://www.w3.org/2000/svg",className:"flex-shrink-0",children:[s.jsx("circle",{cx:"16",cy:"16",r:"15",fill:o}),s.jsx("path",{d:"M 8 8 L 4 2 L 10 6 Z",fill:o}),s.jsx("path",{d:"M 24 8 L 28 2 L 22 6 Z",fill:o}),s.jsx("ellipse",{cx:10+a,cy:"13",rx:"2.5",ry:"3",fill:l,style:{transition:"cx 0.3s cubic-bezier(0.4, 0, 0.2, 1)"}}),s.jsx("ellipse",{cx:22+a,cy:"13",rx:"2.5",ry:"3",fill:l,style:{transition:"cx 0.3s cubic-bezier(0.4, 0, 0.2, 1)"}}),s.jsx("circle",{cx:10+a,cy:"13.5",r:"1.2",fill:c,style:{transition:"cx 0.3s cubic-bezier(0.4, 0, 0.2, 1)"}}),s.jsx("circle",{cx:22+a,cy:"13.5",r:"1.2",fill:c,style:{transition:"cx 0.3s cubic-bezier(0.4, 0, 0.2, 1)"}}),s.jsx("path",{d:"M 16 18 L 14 20 L 18 20 Z",fill:c}),s.jsx("path",{d:"M 16 20 Q 12 22 10 21",stroke:c,strokeWidth:"1",strokeLinecap:"round",fill:"none"}),s.jsx("path",{d:"M 16 20 Q 20 22 22 21",stroke:c,strokeWidth:"1",strokeLinecap:"round",fill:"none"}),s.jsx("line",{x1:"3",y1:"14",x2:"7",y2:"13",stroke:l,strokeWidth:"0.8",strokeLinecap:"round",opacity:"0.6"}),s.jsx("line",{x1:"3",y1:"16",x2:"7",y2:"16",stroke:l,strokeWidth:"0.8",strokeLinecap:"round",opacity:"0.6"}),s.jsx("line",{x1:"3",y1:"18",x2:"7",y2:"19",stroke:l,strokeWidth:"0.8",strokeLinecap:"round",opacity:"0.6"}),s.jsx("line",{x1:"29",y1:"14",x2:"25",y2:"13",stroke:l,strokeWidth:"0.8",strokeLinecap:"round",opacity:"0.6"}),s.jsx("line",{x1:"29",y1:"16",x2:"25",y2:"16",stroke:l,strokeWidth:"0.8",strokeLinecap:"round",opacity:"0.6"}),s.jsx("line",{x1:"29",y1:"18",x2:"25",y2:"19",stroke:l,strokeWidth:"0.8",strokeLinecap:"round",opacity:"0.6"})]})},ZQ=({isDark:e})=>{const[t,n]=_.useState(!1),r=(a,o,l)=>{a.preventDefault(),a.stopPropagation(),navigator.clipboard.writeText(o).then(()=>{alert(`${l}链接已复制到剪贴板! + +${o} + +请在浏览器中打开`)}).catch(()=>{alert(`请复制以下链接在浏览器中打开: + +${o}`)})},i=[{label:"拖动画布",desc:"中键或空白处拖动"},{label:"缩放",desc:"滚轮",keys:"Ctrl+滚轮"},{label:"框选",desc:"Ctrl+拖动",keys:"Ctrl"},{label:"多选",desc:"Ctrl+点击",keys:"Ctrl"},{label:"删除",desc:"Delete/Backspace",keys:"Del"},{label:"创建节点",desc:"双击画布",keys:"双击"},{label:"连接",desc:"拖动端口"},{label:"批量连接",desc:"Shift+框选",keys:"Shift"},{label:"分组",desc:"Alt+框选",keys:"Alt"},{label:"快速复制节点",desc:"Alt+拖拽节点(无连线,可立即拖走)",keys:"Alt+拖拽"},{label:"收纳",desc:"框选后顶部点收纳",keys:"Ctrl+框选"},{label:"复制",desc:"Ctrl+C",keys:"Ctrl+C"},{label:"粘贴",desc:"Ctrl+V",keys:"Ctrl+V"},{label:"撤销",desc:"Ctrl+Z",keys:"Ctrl+Z"},{label:"重做",desc:"取消撤销",keys:"Ctrl+R"},{label:"保存工作流",desc:"保存项目",keys:"Ctrl+S"},{label:"快速保存",desc:"以当前项目名保存到项目管理",keys:"Ctrl+Shift+S"},{label:"保存选区",desc:"框选后右键",keys:"右键"}];return s.jsxs("div",{className:"fixed bottom-0 left-0 right-0 z-30 pointer-events-none",children:[s.jsx("div",{className:`pointer-events-auto transition-all duration-300 ${t?"translate-y-0":"translate-y-full"}`,children:s.jsx("div",{className:"flex justify-center px-4 pb-4",children:s.jsx("div",{className:`w-full max-w-6xl rounded-2xl border backdrop-blur-md shadow-2xl ${e?"bg-zinc-900/95 border-zinc-800":"bg-white/95 border-zinc-200"}`,children:s.jsxs("div",{className:"px-6 py-3",children:[s.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-6 gap-x-6 gap-y-2",children:i.map((a,o)=>s.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[s.jsx("span",{className:`text-xs font-medium truncate ${e?"text-zinc-300":"text-zinc-700"}`,children:a.label}),s.jsx("span",{className:"text-xs truncate text-zinc-500",children:a.desc}),a.keys&&s.jsx("kbd",{className:`text-[10px] px-1 py-0.5 rounded font-mono whitespace-nowrap ${e?"bg-zinc-800 text-zinc-400 border border-zinc-700":"bg-zinc-100 text-zinc-600 border border-zinc-300"}`,children:a.keys})]},o))}),s.jsx("div",{className:`mt-4 pt-3 border-t ${e?"border-zinc-800":"border-zinc-200"}`,children:s.jsxs("div",{className:"flex items-center justify-center gap-4 flex-wrap",children:[s.jsx("span",{className:`text-xs font-medium ${e?"text-zinc-400":"text-zinc-600"}`,children:"作者主页:"}),s.jsx("a",{href:"https://xhslink.com/m/e0jgZ9LypR",onClick:a=>r(a,"https://xhslink.com/m/e0jgZ9LypR","小红书"),className:`text-xs px-3 py-1 rounded-lg transition-colors cursor-pointer ${e?"bg-red-500/10 text-red-400 hover:bg-red-500/20 border border-red-500/20":"bg-red-50 text-red-600 hover:bg-red-100 border border-red-200"}`,title:"点击复制链接",children:"小红书"}),s.jsx("a",{href:"https://v.douyin.com/x5s8oIPVBk4",onClick:a=>r(a,"https://v.douyin.com/x5s8oIPVBk4","抖音"),className:`text-xs px-3 py-1 rounded-lg transition-colors cursor-pointer ${e?"bg-blue-500/10 text-blue-400 hover:bg-blue-500/20 border border-blue-500/20":"bg-blue-50 text-blue-600 hover:bg-blue-100 border border-blue-200"}`,title:"点击复制链接",children:"抖音"}),s.jsx("a",{href:"https://space.bilibili.com/28347006?spm_id_from=333.1007.0.0",onClick:a=>r(a,"https://space.bilibili.com/28347006?spm_id_from=333.1007.0.0","B站"),className:`text-xs px-3 py-1 rounded-lg transition-colors cursor-pointer ${e?"bg-pink-500/10 text-pink-400 hover:bg-pink-500/20 border border-pink-500/20":"bg-pink-50 text-pink-600 hover:bg-pink-100 border border-pink-200"}`,title:"点击复制链接",children:"B站"}),s.jsx("a",{href:"https://afdian.com/a/ZhengXinLan",onClick:a=>r(a,"https://afdian.com/a/ZhengXinLan","爱发电"),className:`text-xs px-3 py-1 rounded-lg transition-colors cursor-pointer ${e?"bg-purple-500/10 text-purple-400 hover:bg-purple-500/20 border border-purple-500/20":"bg-purple-50 text-purple-600 hover:bg-purple-100 border border-purple-200"}`,title:"点击复制链接",children:"爱发电"})]})})]})})})}),s.jsx("button",{onClick:()=>n(!t),className:`pointer-events-auto absolute bottom-4 left-4 p-2 rounded-lg ${e?"shadow-lg":"shadow-md"} transition-all duration-200 ${e?"bg-zinc-800/90 hover:bg-zinc-700 border border-zinc-700 text-zinc-400 hover:text-zinc-200":"bg-white/90 hover:bg-zinc-50 border border-zinc-300 text-zinc-600 hover:text-zinc-900"} backdrop-blur-sm`,title:t?"收起帮助":"显示帮助",children:s.jsx(NG,{size:18})})]})},QQ=({isDark:e,isHidden:t})=>t?null:s.jsx(s.Fragment,{children:s.jsx("div",{className:"fixed top-[12px] left-[40%] -translate-x-1/2 z-[9999] pointer-events-none select-none",style:{textShadow:e?"0 0 10px rgba(0,0,0,0.8), 0 2px 4px rgba(0,0,0,0.5)":"none"},children:s.jsx("div",{className:` + px-6 py-2 rounded-lg + ${e?"bg-black/30 text-white/90":"bg-[#f6f6f6] text-gray-900/90"} + border ${e?"border-white/10":"border-gray-900/10"} + font-medium text-sm + ${e?"":"shadow-md"} + `,children:s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:"text-blue-400",children:"@桥豆麻衣酱"}),s.jsx("span",{className:"text-gray-400",children:"|"}),s.jsx("span",{children:"全平台同名"}),s.jsx("span",{className:"text-gray-400",children:"|"}),s.jsx("span",{className:"text-red-400",children:"禁商用"}),s.jsx("span",{className:"text-gray-400",children:"|"}),s.jsx("span",{className:"text-green-400",children:"画布免费"}),s.jsx("span",{className:"text-gray-400",children:"|"}),s.jsx("span",{className:"text-purple-400",children:"V.3.3.2"})]})})})}),eee=`FINAL、释然、小红薯-Finacg、ouroboros(闭关中 不聊天状态)、小红薯-东方先生、小红书-机头哥、陆炜枫、小红书-师帆、S、羽子、 +小红书-六月、Zadie、F、TnT、风吹麦浪、Let eat go、空空、阿普、阿普、Ou、绝世枪王、HHL、WTT、登峰、布拉德·阿洋、米斯特里、 +两水一程、小红书-尼康、小红书-啧啧、得鹿映画AIGC实验室_承制解说漫剧、麦爸不慌张、无尽、小红薯-AiMoCat、淼、Lzs、b站-Forever、 +Houttuyniaaa、GanYuhao_、弓长先生、鲸落、坤、柯盛、Hero Call、梦、谢嘿嘿只想睡、阿Z、Jerry.Jin、Winlend、大白、章鱼哥、A Z E、 +陈导、米糕米糕、白松、Ashn、O.、释然、Mr.Speechless、红黄蓝灰、奥.尼古拉斯.敏、Mask、小吴、Mike、阿Z、王彬、里、文、半夜偷偷去厕所调戏绝美蠕动小奶蛆 +Tao、(坞)、T.DogLau、😊😊😊、司徒颂然~~、σ咤克丶斯೭ԅ、T.DogLau、李楠、芝士松鼠、木白、howie.serious、明媚可见、追光者、 +阿腩、小熊硬糖、努力向上、銅雀與竹、草莓苏打、精灵要奋斗、群_、Tobiggie、Zadie、b站阿呆、万年の吊车尾、A.L.尐玲寶、Shall、Cc.、 +。、大地红、b站🕸、无咎、强者复制人、花火一遍过、Epiphany、AIBOX-木星、汪汪碎冰冰、巴黎雪、维钧·清川、指北呀、567、元、安逸、 +、谢国健、藤原海、ggfour、雷雨、博、MDZHANG 张荣幸、路军、柏溪有南桥、Epiphany、阿嚷、恶龙逗勇者、逸峰、Villa、Edwing(不是单身汪) +、Suan、聖の倉葉、妳很迷人微笑、魔鬼精肉人、橘子倾橙、煜、Jason、苏打鱼、Hypoxia、'-、我不看月亮、绍兴龙太子、周南如唔、双枪小笼包、 +泽云星耀、小松、Pino_O、Quin奎因、Jackie.chen、风有约、马郅斐、小熊硬糖、五德、赵幸、王栋、康超、侯淳元、土豆片、Yuan影子、 +Desinger、暮尘殇、石佛小栗旬、KEV🌌、罗飞、维也纳的夏天、野肆、沐阳、行道丶、有点奇怪的、J.jin.、赵健康要健康、Chris Wang、 +Junlian、橘子°🍊、爱发电用户_5477f、miuma、Lu、爱发电用户_0c707、爱发电用户_23564、爱发电用户_ecff4、爱发电用户_8b741、爱发电用户_2c73c +、爱发电用户_0e9e7、小吴?、爱发电用户_3d6ba、爱发电用户_h5MW、蔡炎煌、爱发电用户_69f16、爱发电用户_5cd26、爱发电用户_8hC4 +、爱发电用户_67e96、爱发电用户_15672、水、虾滑、糯糯、十一、爱发电用户_f6eae、爱发电用户_2345f、爱发电用户_3f43e、爱发电用户_51db1 +爱发电用户_3ca99、爱发电用户_c0a8b、爱发电用户_YAJs、爱发电用户_82e74、爱发电用户_83b8e、爱发电用户_007f9、爱发电用户_d2f50 +爱发电用户_25d37、爱发电用户_d1fc5、爱发电用户_f70e3、爱发电用户_6f6c6、爱发电用户_3b8af、wang、爱发电用户_d5bab、爱发电用户_bef16、 +爱发电用户_a923e、爱发电用户_ptcD、骑着自行车去冒险、爱发电用户_16a1b、爱发电用户_5286d、无念、ivan、降温已三尺、longbow1998 +爱发电用户_39ff7、爱发电用户_d25a9、爱发电用户_0d6f1、asdfghjkl、爱发电用户_f6355、爱发电用户_4eb2d、爱发电用户_e867a、张雷 +、爱发电用户_cf425、爱发电用户_7a272、爱发电用户_77915、爱发电用户_MYFX、爱发电用户_369db、爱发电用户_2c694、爱发电用户_1fa16 +、爱发电用户_63bea、郑不知道取啥、tobiggie、爱发电用户_syAt、爱发电用户_Qa9y、爱发电用户_fdf12、爱发电用户_75a6d、爱发电用户_3603e +爱发电用户_20281、美丽猪猪侠、爱发电用户_fbd4b、小木、爱发电用户_77a03、爱发电用户_SvcY、谷、爱发电用户_5571c、爱发电用户_dc177 +、一金、爱发电用户_9af01、爱发电用户_3DKy、老徐、幕僚长、.、小谢呀、爱发电用户_8ba4b、绝世枪王、爱发电用户_da677、Karry爱发电用户_043cd +、爱发电用户_d5e54、爱发电用户_5t3j、律道、爱发电用户_745ee、爱发电用户_139b7、爱发电用户_50acd、啊哈哈qweqweq、爱发电用户_57663 +、爱发电用户_qPtV、kk、Huskimo、愤怒的鸵鸟、爱发电用户_C6rb、爱发电用户_MNWY、爱发电用户_2dae1、爱发电用户_ac2e4、爱发电用户_Ch9J +、爱发电用户_44245、爱发电用户_44b15、爱发电用户_ed4e2、爱发电用户_1e5ab、会飞了、爱发电用户_5114a、爱发电用户_f9H5、Am Ralph +ggfour、爱发电用户_2e5a6、?猫眼超、爱发电用户_1fdf8、爱发电用户_8eee2、芩青 +`;function tee(e){const t=new Set,n=[],r=e.split(/[,,、\r\n]+/);for(const i of r){const a=i.trim().replace(/^[,,、\s]+|[,,、\s]+$/g,"");a&&(t.has(a)||(t.add(a),n.push(a)))}return n}const nee=tee(eee);function r9(e){let t=0;for(let n=0;n0;n--){const r=Math.floor(Math.random()*(n+1));[t[n],t[r]]=[t[r],t[n]]}return t}const see=({open:e,onClose:t})=>{const n=_.useMemo(()=>{if(!e)return[];const d=JC.map(b=>b.name),h=new Set(d),f=ree(nee).filter(b=>!h.has(b));return[...d,...f]},[e]),[r,i]=_.useState(null),[a,o]=_.useState({});_.useEffect(()=>{e||(i(null),o({}))},[e]);const l=_.useCallback(d=>{d.key==="Escape"&&(r?i(null):t())},[r,t]);if(_.useEffect(()=>{if(e)return window.addEventListener("keydown",l),()=>window.removeEventListener("keydown",l)},[e,l]),!e)return null;const c=s.jsxs("div",{className:"fixed inset-0 z-[20050] flex items-center justify-center p-4 sm:p-6",role:"dialog","aria-modal":"true","aria-labelledby":"sponsor-modal-title",children:[s.jsx("button",{type:"button",className:"absolute inset-0 cursor-default border-0",style:{background:Ml.bgGradient},onClick:t,"aria-label":"关闭"}),s.jsx("div",{className:"pointer-events-none absolute inset-0 overflow-hidden","aria-hidden":!0,children:[{ch:"🐾",left:8,top:18,rot:-12},{ch:"✨",left:6,top:55,rot:8},{ch:"🐾",left:88,top:22,rot:15},{ch:"✨",left:92,top:48,rot:-8},{ch:"⭐",left:14,top:72,rot:0},{ch:"🐾",left:80,top:70,rot:-18}].map((d,h)=>s.jsx("span",{className:"absolute text-2xl opacity-[0.38] animate-breathe",style:{left:`${d.left}%`,top:`${d.top}%`,transform:`rotate(${d.rot}deg)`,animationDelay:`${h*.35}s`,filter:d.ch==="🐾"?"sepia(0.35) saturate(2) hue-rotate(-15deg)":void 0},children:d.ch},h))}),s.jsxs("div",{className:"relative z-10 flex max-h-[min(86vh,820px)] w-full max-w-2xl flex-col overflow-hidden rounded-3xl border shadow-2xl",style:{background:Ml.cardBg,borderColor:Ml.cardBorder,boxShadow:"0 25px 50px -12px rgba(214, 51, 132, 0.18), 0 0 0 1px rgba(255,255,255,0.8) inset"},onClick:d=>d.stopPropagation(),children:[s.jsxs("div",{className:"flex shrink-0 items-start justify-between gap-3 border-b px-5 py-4",style:{borderColor:Ml.rowBorder,background:Ml.headerTint},children:[s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx("div",{className:"sponsor-globe-wrap flex h-12 w-12 shrink-0 items-center justify-center rounded-2xl shadow-lg",style:{background:Ml.globeGrad},children:s.jsx(DG,{className:"h-7 w-7 text-white drop-shadow-md",strokeWidth:1.75})}),s.jsxs("div",{children:[s.jsx("h2",{id:"sponsor-modal-title",className:"text-lg font-bold tracking-tight",style:{color:Ml.title},children:"地球上的感谢信号"}),s.jsx("p",{className:"mt-0.5 text-xs",style:{color:Ml.subtitleSoft},children:"每一位支持者都像一颗小卫星 🛰️"})]})]}),s.jsx("button",{type:"button",onClick:t,className:"rounded-xl p-2 text-zinc-500 transition-colors hover:bg-black/5 hover:text-zinc-800",title:"关闭",children:s.jsx(Qr,{size:22})})]}),s.jsx("div",{className:"rh-scroll-minimal min-h-0 flex-1 overflow-y-auto px-4 py-4",style:{maxHeight:"min(62vh, 640px)"},children:s.jsx("ul",{className:"flex flex-col gap-2.5",children:n.map(d=>{const h=a[d],p=KC(d),f=JC.find(g=>g.name===d),b=!!f;return s.jsx("li",{children:s.jsxs("button",{type:"button",onClick:()=>i(d),className:`group flex w-full items-center gap-3 rounded-2xl border px-3 py-2.5 text-left shadow-sm transition-all hover:shadow-md ${b?"border-pink-300/40 bg-[rgba(253,226,236,0.45)]":"border-zinc-200/90 bg-white"}`,children:[s.jsx("div",{className:"flex h-11 w-11 shrink-0 items-center justify-center overflow-hidden rounded-xl text-2xl shadow-inner",style:{background:b?"rgba(253, 226, 236, 0.65)":"rgba(253, 226, 236, 0.45)"},children:h?s.jsx("span",{className:"select-none",children:YC(d)}):s.jsx("img",{src:p,alt:"",className:"h-full w-full object-cover",loading:"eager",decoding:"async",referrerPolicy:"no-referrer",onError:()=>o(g=>({...g,[d]:!0}))})}),s.jsxs("div",{className:"min-w-0 flex-1",children:[s.jsxs("div",{className:"truncate text-sm font-medium text-zinc-900",children:["@",d]}),b&&f&&s.jsx("div",{className:"mt-0.5 text-xs text-zinc-600",children:f.description})]}),s.jsx("span",{className:"shrink-0 rounded-full px-2 py-0.5 text-[10px] font-medium opacity-0 transition-opacity group-hover:opacity-100",style:{background:"rgba(214, 51, 132, 0.12)",color:Ml.title},children:"全屏 ✦"})]})},d)})})}),s.jsxs("div",{className:"shrink-0 border-t px-4 py-3 text-center text-[11px]",style:{borderColor:Ml.rowBorder,color:Ml.footerGray},children:["共 ",n.length," 位支持者 · 头像由 DiceBear(big-ears / croodles 等)"]})]})]}),u=r&&e?s.jsxs("div",{className:"fixed inset-0 z-[20060] flex flex-col items-center justify-center p-6",role:"presentation",onClick:()=>i(null),children:[s.jsx("div",{className:"absolute inset-0",style:{background:Ml.fullscreenBg}}),s.jsxs("div",{className:"relative z-10 flex max-w-lg flex-col items-center text-center",onClick:d=>d.stopPropagation(),children:[s.jsx("div",{className:"mb-6 flex h-[min(52vw,360px)] w-[min(52vw,360px)] items-center justify-center overflow-hidden rounded-[2rem] border-4 shadow-2xl",style:{borderColor:"rgba(236, 72, 153, 0.45)",background:"#fff5f8"},children:a[r]?s.jsx("span",{className:"text-[min(28vw,180px)] leading-none",children:YC(r)}):s.jsx("img",{src:KC(r),alt:"",className:"h-full w-full object-cover",referrerPolicy:"no-referrer",onError:()=>o(d=>({...d,[r]:!0}))})}),s.jsxs("h3",{className:"mt-2 text-2xl font-bold",style:{color:Ml.title},children:["谢谢你,",r]}),s.jsx("p",{className:"mt-2 text-sm",style:{color:Ml.subtitleSoft},children:"麻衣画布因你而更温暖 💖"}),s.jsx("div",{className:"mt-6 flex flex-wrap items-center justify-center gap-3",children:s.jsx("button",{type:"button",onClick:()=>i(null),className:"rounded-full border border-zinc-300 bg-white px-5 py-2 text-sm font-medium text-zinc-800 transition-colors hover:bg-zinc-50",children:"返回列表"})})]})]}):null;return s.jsxs(s.Fragment,{children:[Ni.createPortal(c,document.body),u?Ni.createPortal(u,document.body):null]})},iee=({isDark:e,projectBar:t})=>{const[n,r]=_.useState(!1);return s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"absolute inset-0 flex items-center justify-center pointer-events-none z-10",children:s.jsxs("div",{className:"relative pointer-events-none flex flex-col items-center gap-6",children:[s.jsxs("div",{className:"relative",children:[s.jsxs("div",{"aria-hidden":"true",className:` + flex items-center gap-0 rounded-full + transition-all duration-300 ease-out + animate-in fade-in duration-500 + select-none + ${e?"bg-zinc-800/88 border border-pink-500/15 shadow-xl shadow-pink-950/20":"bg-white/95 border border-pink-100 shadow-xl shadow-pink-200/30"} + backdrop-blur-sm + `,style:{padding:"12px 52px 12px 20px"},children:[s.jsxs("div",{className:` + flex items-center gap-2.5 pr-5 mr-4 + border-r ${e?"border-zinc-600/70":"border-pink-200/80"} + `,children:[s.jsxs("div",{className:"relative",children:[s.jsx(A5,{size:20,className:e?"text-white":"text-zinc-800",strokeWidth:2}),s.jsx("span",{className:"absolute -top-0.5 -right-0.5 w-1.5 h-1.5 rounded-full bg-cyan-400/90",style:{boxShadow:"0 0 8px rgba(34, 211, 238, 0.6)"}})]}),s.jsx("span",{className:`text-sm font-medium ${e?"text-white":"text-zinc-800"}`,children:"双击"})]}),s.jsx("span",{className:` + text-sm font-normal tracking-wide + ${e?"text-white":"text-black"} + `,children:"麻衣画布为守护设计师的肝和钱包而生"})]}),s.jsxs("button",{type:"button",onClick:i=>{i.stopPropagation(),i.preventDefault(),r(!0)},className:"sponsor-heart-btn pointer-events-auto absolute right-2 top-1/2 z-20 flex h-9 w-9 -translate-y-1/2 translate-x-1 items-center justify-center rounded-full border-2 outline-none transition-transform hover:scale-110 focus-visible:ring-2 focus-visible:ring-pink-400",style:{borderColor:e?"rgba(251,113,133,0.85)":"rgba(251,113,133,0.9)",background:e?"linear-gradient(145deg, rgba(190,24,93,0.95) 0%, rgba(157,23,77,0.98) 100%)":"linear-gradient(145deg, #fda4af 0%, #fb7185 50%, #f43f5e 100%)",boxShadow:e?"0 0 20px rgba(244,63,94,0.55), 0 4px 14px rgba(0,0,0,0.4)":"0 0 18px rgba(251,113,133,0.65), 0 4px 12px rgba(244,63,94,0.25)"},title:"感谢赞助者","aria-label":"打开赞助者感谢墙",children:[s.jsx(HG,{className:"relative z-[1] h-[18px] w-[18px] text-white drop-shadow-md",fill:"currentColor",strokeWidth:0}),s.jsx("span",{className:"sponsor-heart-shine pointer-events-none absolute inset-0 rounded-full","aria-hidden":!0})]})]}),t?s.jsx("div",{className:"pointer-events-auto w-full flex justify-center",children:t}):null]})}),s.jsx(see,{open:n,onClose:()=>r(!1)})]})},aee=({isDark:e,projects:t,isLoading:n,onRefreshList:r,onOpenProject:i,onCreateNew:a})=>{_.useEffect(()=>{r()},[r]);const o=t.slice(0,3),l=(p,f=12)=>p.length<=f?p:p.slice(0,f-1)+"…",c=e?"bg-zinc-900/80 border-zinc-800 hover:bg-zinc-800/80":"bg-white/95 border-zinc-200 hover:bg-zinc-50",u=e?"text-zinc-500":"text-zinc-400",d=e?"text-zinc-300":"text-zinc-800",h=e?"text-zinc-500":"text-zinc-400";return s.jsx("div",{className:"flex flex-col items-center gap-2 animate-in fade-in duration-500 slide-in-from-bottom-2",children:s.jsxs("div",{className:"flex items-center gap-2",children:[[0,1,2].map(p=>{const f=o[p],b=!f;return s.jsxs("button",{type:"button",disabled:b||n,onClick:g=>{g.stopPropagation(),f&&i(f.id,f.name)},className:` + group flex items-center w-[130px] h-[44px] rounded-lg border + ${c} + transition-colors duration-150 + disabled:opacity-50 disabled:cursor-not-allowed + ${b?"cursor-default":"cursor-pointer"} + `,title:f?`打开:${f.name}`:"暂无项目",children:[s.jsx(UG,{size:16,className:`flex-shrink-0 ml-3 ${b?h:d}`}),s.jsx("span",{className:`flex-1 text-xs font-medium truncate mx-2 ${b?u:d}`,children:b?"暂无":l(f.name)}),!b&&s.jsx(Ja,{size:14,className:`flex-shrink-0 mr-2 ${h}`})]},(f==null?void 0:f.id)??`empty-${p}`)}),s.jsxs("button",{type:"button",onClick:p=>{p.stopPropagation(),a()},className:` + group flex items-center w-[130px] h-[44px] rounded-lg border + ${c} cursor-pointer + `,title:"新建项目",children:[s.jsx(UP,{size:16,className:`flex-shrink-0 ml-3 ${d}`}),s.jsx("span",{className:`flex-1 text-xs font-medium mx-2 ${d}`,children:"新建"}),s.jsx(Ja,{size:14,className:`flex-shrink-0 mr-2 ${h}`})]})]})})},ZC=["好运+1","幸福+1","功德+1","来财+1","平安+1","健康+1"];function oee(){return ZC[Math.floor(Math.random()*ZC.length)]}const lee=[{mode:"align-left",label:"左对齐",icon:s.jsx(RP,{className:"w-3.5 h-3.5"})},{mode:"align-center-x",label:"水平居中",icon:s.jsx(kP,{className:"w-3.5 h-3.5"})},{mode:"align-right",label:"右对齐",icon:s.jsx(MP,{className:"w-3.5 h-3.5"})},{mode:"align-top",label:"顶对齐",icon:s.jsx(TP,{className:"w-3.5 h-3.5"})},{mode:"align-center-y",label:"垂直居中",icon:s.jsx(IP,{className:"w-3.5 h-3.5"})},{mode:"align-bottom",label:"底对齐",icon:s.jsx(AP,{className:"w-3.5 h-3.5"})}],cee=[{mode:"distribute-horizontal",label:"水平等间距",icon:s.jsx(xj,{className:"w-3.5 h-3.5"})},{mode:"distribute-vertical",label:"垂直等间距",icon:s.jsx(xj,{className:"w-3.5 h-3.5 rotate-90"})},{mode:"distribute-horizontal-top",label:"水平分布+顶对齐",icon:s.jsx(TP,{className:"w-3.5 h-3.5"})},{mode:"distribute-horizontal-center-y",label:"水平分布+垂直居中",icon:s.jsx(IP,{className:"w-3.5 h-3.5"})},{mode:"distribute-horizontal-bottom",label:"水平分布+底对齐",icon:s.jsx(AP,{className:"w-3.5 h-3.5"})},{mode:"distribute-vertical-left",label:"垂直分布+左对齐",icon:s.jsx(RP,{className:"w-3.5 h-3.5"})},{mode:"distribute-vertical-center-x",label:"垂直分布+水平居中",icon:s.jsx(kP,{className:"w-3.5 h-3.5"})},{mode:"distribute-vertical-right",label:"垂直分布+右对齐",icon:s.jsx(MP,{className:"w-3.5 h-3.5"})}],uee=({isDark:e,onAlign:t,visible:n,onVisibleChange:r})=>{const[i,a]=_.useState(!1),o=n!==void 0&&r!==void 0,l=o?n:i,c=o?r:a;if(_.useEffect(()=>{const h=p=>{(p.key==="`"||p.key==="~")&&(p.preventDefault(),c(f=>!f))};return window.addEventListener("keydown",h),()=>window.removeEventListener("keydown",h)},[o,c]),!l)return null;const u=e?"bg-zinc-900/95 border-zinc-700 text-zinc-200":"bg-white/95 border-zinc-200 text-zinc-800",d=e?"hover:bg-zinc-700 border-zinc-700":"hover:bg-zinc-100 border-zinc-200";return s.jsxs("div",{className:`fixed top-20 right-8 z-[9998] rounded-2xl border shadow-lg backdrop-blur-md w-80 ${u}`,children:[s.jsxs("div",{className:`flex items-center justify-between px-3 py-2 border-b ${e?"border-zinc-700/50":"border-zinc-200"}`,children:[s.jsx("span",{className:"text-xs font-medium opacity-80 tracking-wide",children:"节点对齐"}),s.jsx("button",{type:"button",onClick:()=>c(!1),className:"p-1 rounded hover:opacity-70","aria-label":"关闭",children:s.jsx(Qr,{className:"w-4 h-4"})})]}),s.jsxs("div",{className:"p-3 space-y-3 text-[11px]",children:[s.jsxs("div",{className:"space-y-1.5",children:[s.jsx("div",{className:"flex items-center justify-between",children:s.jsx("span",{className:e?"text-zinc-400":"text-zinc-500",children:"基础对齐"})}),s.jsx("div",{className:"grid grid-cols-3 gap-1.5",children:lee.map(({mode:h,label:p,icon:f})=>s.jsxs("button",{type:"button",onClick:()=>t(h),className:`flex items-center justify-center gap-1.5 px-2 py-1.5 rounded-lg border text-[11px] ${d}`,title:p,children:[f,s.jsx("span",{className:"truncate",children:p})]},h))})]}),s.jsxs("div",{className:"space-y-1.5",children:[s.jsx("div",{className:"flex items-center justify-between",children:s.jsx("span",{className:e?"text-zinc-400":"text-zinc-500",children:"分布对齐"})}),s.jsx("div",{className:`grid grid-cols-2 gap-1.5 pt-1 border-t ${e?"border-zinc-700/50":"border-zinc-200"}`,children:cee.map(({mode:h,label:p,icon:f})=>s.jsxs("button",{type:"button",onClick:()=>t(h),className:`flex items-center justify-start gap-1.5 px-2 py-1.5 rounded-lg border text-[11px] ${d}`,title:p,children:[f,s.jsx("span",{className:"truncate",children:p})]},h))})]})]}),s.jsx("div",{className:"px-3 pb-2 text-[10px] opacity-60",children:"Ctrl+拖动框选 ≥2 个节点后可对齐 · 按 ` 或 ~ 关闭"})]})},s9=({isOpen:e,isDark:t,klingSubjectLibrary:n,selectedSubjects:r,onClose:i,onConfirm:a,onChange:o,onCreateSubject:l,attachMode:c="floating"})=>{const[u,d]=_.useState(r),[h,p]=_.useState(null);if(!e)return null;const f=y=>{let w;if(u.includes(y))w=u.filter(v=>v!==y);else if(u.length<16)w=[...u,y];else return;d(w),o&&o(w)},b=()=>{a(u),i()},g=c==="inline";return s.jsxs(s.Fragment,{children:[!g&&s.jsx("div",{className:"fixed inset-0 z-[100]",style:{backgroundColor:"rgba(0, 0, 0, 0.3)"},onClick:i}),s.jsxs("div",{className:`rounded-lg shadow-2xl border ${g?"w-full":"absolute top-0 left-full ml-4"} ${t?"bg-zinc-900 border-white/30":"bg-white border-zinc-200"}`,style:{width:"480px",maxHeight:"90vh",zIndex:1e3,pointerEvents:"auto"},onMouseDown:y=>y.stopPropagation(),children:[s.jsx("div",{className:"p-3 pt-4 overflow-y-auto minimal-scrollbar",style:{maxHeight:"calc(90vh - 100px)"},children:n.length===0?s.jsxs("div",{className:`text-center py-8 ${t?"text-zinc-500":"text-zinc-400"}`,children:[s.jsx("p",{className:"text-sm mb-3",children:"暂无主体"}),s.jsx("button",{onClick:l,className:`px-4 py-2 rounded text-sm transition-colors border ${t?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-blue-500 hover:bg-blue-600 text-white border-transparent"}`,children:"创建第一个主体"})]}):s.jsx("div",{className:"grid grid-cols-4 gap-3",children:n.map(y=>{const w=u.includes(y.id);return s.jsxs("div",{onClick:()=>f(y.id),onMouseEnter:()=>p(y),onMouseLeave:()=>p(null),className:`relative rounded-lg overflow-hidden border-2 cursor-pointer transition-all ${w?"border-blue-500 ring-2 ring-blue-500/30":t?"border-zinc-700 hover:border-blue-500/50":"border-zinc-200 hover:border-blue-500/50"}`,children:[s.jsxs("div",{className:"aspect-square bg-zinc-800 relative",children:[y.mainImage?s.jsx("img",{src:y.mainImage,alt:y.name,className:"w-full h-full object-cover"}):s.jsx("div",{className:"w-full h-full flex items-center justify-center text-zinc-500",children:s.jsx(si,{size:24})}),w&&s.jsx("div",{className:"absolute top-1 right-1 w-5 h-5 rounded-full bg-blue-500 flex items-center justify-center",children:s.jsx(Eo,{size:14,className:"text-white"})}),y.type&&s.jsx("div",{className:"absolute bottom-1 left-1 px-1.5 py-0.5 rounded text-[9px] bg-black/60 text-white",children:y.type})]}),s.jsx("div",{className:`p-1.5 text-center ${t?"bg-zinc-900":"bg-zinc-50"}`,children:s.jsx("p",{className:`text-[10px] truncate font-medium ${t?"text-zinc-300":"text-zinc-700"}`,children:y.name})})]},y.id)})})}),s.jsxs("div",{className:`flex justify-between items-center gap-2 p-3 border-t ${t?"border-white/30":"border-zinc-200"}`,children:[s.jsx("button",{onClick:l,className:`px-3 py-1.5 rounded text-xs transition-colors border ${t?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-zinc-100 hover:bg-zinc-200 text-zinc-700 border-transparent"}`,children:"新建"}),s.jsxs("div",{className:"flex gap-2",children:[s.jsx("button",{onClick:i,className:`px-3 py-1.5 rounded text-xs transition-colors border ${t?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-zinc-100 hover:bg-zinc-200 text-zinc-700 border-transparent"}`,children:"取消"}),s.jsxs("button",{onClick:b,className:`px-4 py-1.5 rounded text-xs transition-colors border ${t?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-blue-600 hover:bg-blue-500 text-white border-transparent"}`,children:["确认",u.length>0?` (${u.length})`:""]})]})]}),h&&s.jsxs("div",{className:`absolute left-full ml-2 top-0 w-64 p-3 rounded-lg shadow-xl border ${t?"bg-zinc-900 border-zinc-700":"bg-white border-zinc-200"}`,style:{zIndex:2001},children:[s.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[s.jsx(Ya,{size:14,className:t?"text-blue-400":"text-blue-600"}),s.jsx("h4",{className:`text-sm font-semibold ${t?"text-zinc-200":"text-zinc-800"}`,children:h.name})]}),s.jsxs("p",{className:`text-xs mb-2 ${t?"text-zinc-400":"text-zinc-600"}`,children:["类型: ",h.type]}),h.description&&s.jsx("p",{className:"text-xs text-zinc-500",children:h.description}),h.auxiliaryImages&&h.auxiliaryImages.length>0&&s.jsxs("div",{className:"mt-2",children:[s.jsxs("p",{className:`text-[10px] mb-1 ${t?"text-zinc-500":"text-zinc-400"}`,children:["辅助图 (",h.auxiliaryImages.length,")"]}),s.jsx("div",{className:"grid grid-cols-3 gap-1",children:h.auxiliaryImages.slice(0,3).map((y,w)=>s.jsx("img",{src:y,alt:`辅助图 ${w+1}`,className:"w-full h-12 object-cover rounded border"},w))})]})]})]})]})},i9=({audioFile:e,isOpen:t,onClose:n,onConfirm:r,isDark:i=!1,minDuration:a=3,maxDuration:o=15})=>{const[l,c]=_.useState(0),[u,d]=_.useState(0),[h,p]=_.useState(!1),[f,b]=_.useState(0),[g,y]=_.useState(0),[w,v]=_.useState(null),m=_.useRef(null),z=_.useRef(null),C=_.useRef(null);_.useEffect(()=>{if(!e||!t)return;const T=new Audio,q=URL.createObjectURL(e);return T.src=q,T.preload="metadata",T.onloadedmetadata=()=>{const H=T.duration;c(H);const J=Math.min(H,o);b(0),y(J)},m.current=T,()=>{URL.revokeObjectURL(q),m.current&&(m.current.pause(),m.current=null)}},[e,t,o]),_.useEffect(()=>{if(!m.current)return;const T=m.current,q=()=>{const H=T.currentTime;d(H),H>=g&&(T.pause(),p(!1),T.currentTime=f,d(f))};if(h){T.currentTime=Math.max(f,u),T.play();const H=setInterval(q,50);return()=>clearInterval(H)}else T.pause()},[h,f,g]);const E=()=>{m.current&&(h?m.current.pause():((u=g)&&(m.current.currentTime=f,d(f)),m.current.play()),p(!h))},I=T=>{const q=Math.floor(T/60),H=Math.floor(T%60);return`${q.toString().padStart(2,"0")}:${H.toString().padStart(2,"0")}`},R=T=>l?T/l*100:0,A=T=>l?T/100*l:0,O=T=>{if(!z.current||!l)return;const q=z.current.getBoundingClientRect(),J=(T.clientX-q.left)/q.width*100,Z=A(J),B=Math.abs(Z-f),V=Math.abs(Z-g);if(B{q.preventDefault(),q.stopPropagation(),v(T)};_.useEffect(()=>{if(!w||!z.current||!l)return;const T=H=>{const J=z.current.getBoundingClientRect(),Z=H.clientX-J.left,B=Math.max(0,Math.min(100,Z/J.width*100)),V=A(B);if(w==="start"){const N=Math.max(0,Math.min(V,g-a));b(N),m.current&&!h&&(m.current.currentTime=N,d(N))}else{const N=Math.min(l,Math.max(V,f+a));y(N)}},q=()=>{v(null)};return window.addEventListener("mousemove",T),window.addEventListener("mouseup",q),()=>{window.removeEventListener("mousemove",T),window.removeEventListener("mouseup",q)}},[w,l,f,g,a,h]);const L=()=>{const T=g-f;if(To){alert(`选择的音频片段时长必须在 ${a}-${o}秒之间`);return}r(f,g),n()};if(!t)return null;const X=g-f;return s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"fixed inset-0 z-[100]",style:{backgroundColor:"rgba(0, 0, 0, 0.3)"},onClick:n}),s.jsxs("div",{ref:C,className:`absolute top-0 left-full ml-4 z-[101] w-[420px] rounded-lg shadow-2xl border ${i?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,style:{pointerEvents:"auto"},onClick:T=>T.stopPropagation(),children:[s.jsxs("div",{className:`flex items-center justify-between px-3 py-2 border-b ${i?"border-zinc-700":"border-zinc-200"}`,children:[s.jsx("h3",{className:`text-sm font-semibold ${i?"text-zinc-200":"text-zinc-800"}`,children:"选择片段"}),s.jsx("button",{onClick:n,className:`p-1 rounded hover:bg-zinc-800 transition-colors ${i?"text-zinc-400 hover:text-zinc-200":"text-zinc-600 hover:text-zinc-800"}`,children:s.jsx(Qr,{size:16})})]}),s.jsxs("div",{className:"p-3",children:[s.jsxs("p",{className:`text-xs mb-2 ${i?"text-zinc-400":"text-zinc-600"}`,children:["请选取 ",a,"s - ",o,"s 内的音频内容。"]}),s.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[s.jsx("button",{onClick:E,className:`p-1.5 rounded-full transition-colors ${i?"bg-purple-600 hover:bg-purple-500 text-white":"bg-purple-500 hover:bg-purple-600 text-white"}`,children:h?s.jsx(Rw,{size:12}):s.jsx(Ia,{size:12,className:"ml-0.5"})}),s.jsxs("div",{className:"flex-1",children:[s.jsxs("div",{className:`text-xs font-mono ${i?"text-zinc-300":"text-zinc-700"}`,children:[I(u)," / ",I(l)]}),s.jsxs("div",{className:`text-xs ${i?"text-zinc-400":"text-zinc-600"}`,children:["已选: ",X.toFixed(1),"s",X>=a&&X<=o?s.jsx("span",{className:"text-green-500 ml-1",children:"✓"}):s.jsx("span",{className:"text-red-500 ml-1",children:"✗"})]})]})]}),s.jsxs("div",{ref:z,className:`relative h-20 rounded-lg mb-2 cursor-pointer overflow-hidden ${i?"bg-zinc-900":"bg-zinc-100"}`,onClick:O,children:[s.jsx("div",{className:"absolute inset-0 flex items-center px-1",children:s.jsx("svg",{width:"100%",height:"100%",className:"absolute inset-0",children:Array.from({length:120}).map((T,q)=>{const H=q/120*100,J=Math.random()*50+10,Z=H>=R(f)&&H<=R(g);return s.jsx("rect",{x:`${H}%`,y:`${50-J/2}%`,width:"0.7%",height:`${J}%`,fill:Z?i?"#a855f7":"#9333ea":i?"#52525b":"#a1a1aa",opacity:Z?.8:.3},q)})})}),s.jsx("div",{className:"absolute top-0 bottom-0 bg-purple-500/10 pointer-events-none",style:{left:`${R(f)}%`,width:`${R(g)-R(f)}%`}}),u>=f&&u<=g&&s.jsx("div",{className:`absolute top-0 bottom-0 w-0.5 shadow-lg pointer-events-none z-20 ${h?"bg-white":"bg-yellow-400"}`,style:{left:`${R(u)}%`},children:s.jsx("div",{className:`absolute -top-0.5 left-1/2 -translate-x-1/2 w-1.5 h-1.5 rounded-full shadow-lg ${h?"bg-white":"bg-yellow-400"}`})}),s.jsxs("div",{className:`absolute top-0 bottom-0 w-0.5 cursor-ew-resize z-30 group ${i?"bg-purple-400":"bg-purple-500"}`,style:{left:`${R(f)}%`},onMouseDown:T=>F("start",T),children:[s.jsx("div",{className:`absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-3 h-6 rounded ${i?"bg-purple-400":"bg-purple-500"} group-hover:scale-110 transition-transform shadow-lg`,children:s.jsx("div",{className:"absolute inset-0 flex items-center justify-center",children:s.jsx("div",{className:"w-0.5 h-3 bg-white/80 rounded"})})}),s.jsx("div",{className:`absolute -bottom-5 left-1/2 -translate-x-1/2 text-xs font-mono whitespace-nowrap ${i?"text-purple-300":"text-purple-600"}`,children:I(f)})]}),s.jsxs("div",{className:`absolute top-0 bottom-0 w-0.5 cursor-ew-resize z-30 group ${i?"bg-purple-400":"bg-purple-500"}`,style:{left:`${R(g)}%`},onMouseDown:T=>F("end",T),children:[s.jsx("div",{className:`absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-3 h-6 rounded ${i?"bg-purple-400":"bg-purple-500"} group-hover:scale-110 transition-transform shadow-lg`,children:s.jsx("div",{className:"absolute inset-0 flex items-center justify-center",children:s.jsx("div",{className:"w-0.5 h-3 bg-white/80 rounded"})})}),s.jsx("div",{className:`absolute -bottom-5 left-1/2 -translate-x-1/2 text-xs font-mono whitespace-nowrap ${i?"text-purple-300":"text-purple-600"}`,children:I(g)})]})]}),s.jsxs("div",{className:`text-xs text-center mb-2 ${i?"text-zinc-400":"text-zinc-600"}`,children:["开始: ",I(f)," | 结束: ",I(g)," | 时长: ",X.toFixed(1),"s"]})]}),s.jsxs("div",{className:`flex justify-end gap-2 px-3 py-2 border-t ${i?"border-zinc-700":"border-zinc-200"}`,children:[s.jsx("button",{onClick:n,className:`px-3 py-1 rounded text-xs transition-colors ${i?"bg-zinc-800 hover:bg-zinc-700 text-zinc-300":"bg-zinc-100 hover:bg-zinc-200 text-zinc-700"}`,children:"取消"}),s.jsx("button",{onClick:L,disabled:Xo,className:`px-3 py-1 rounded text-xs transition-colors ${X>=a&&X<=o?"bg-blue-600 hover:bg-blue-500 text-white":"bg-zinc-400 text-zinc-200 cursor-not-allowed"}`,children:"确认"})]})]})]})},dee=({visible:e,prompt:t="",inputImageUrls:n=[],onClose:r,isDark:i=!0,inCanvas:a=!1,anchorBounds:o})=>{const[l,c]=fr.useState(!1),u=_.useCallback(async()=>{if(t)try{await navigator.clipboard.writeText(t),c(!0),setTimeout(()=>c(!1),1500)}catch{}},[t]);if(!e)return null;const d=i?"bg-[#18181b]":"bg-white/95",h=i?"text-gray-100":"text-gray-900",p=i?"border-white/15":"border-gray-200",f=i?"bg-gray-800":"bg-gray-100",b=i?"shadow-none":"shadow-xl",g=s.jsxs("div",{role:"dialog","aria-modal":"true","aria-labelledby":"compact-panel-title",className:`rounded-lg border ${d} ${p} ${b} overflow-hidden`,style:a&&o?{position:"absolute",left:o.x,top:o.y+o.height+8,width:o.width,minHeight:Math.max(100,o.width*.22),zIndex:100}:void 0,onClick:y=>y.stopPropagation(),children:[s.jsxs("div",{className:"flex items-center justify-between px-3 py-2 border-b border-inherit",children:[s.jsx("span",{id:"compact-panel-title",className:`text-xs font-medium ${h} opacity-80`,children:"上游信息"}),s.jsx("button",{type:"button",onClick:r,className:`p-1 rounded hover:opacity-80 ${h}`,"aria-label":"关闭",children:s.jsx(Qr,{size:16})})]}),s.jsxs("div",{className:"px-3 py-3 space-y-3",children:[n.length>0&&s.jsx("div",{className:"flex flex-wrap gap-2",children:n.map((y,w)=>s.jsxs("div",{className:`relative w-12 h-12 rounded overflow-hidden ${f} shrink-0`,children:[s.jsx("img",{src:y,alt:`输入图${w+1}`,className:"w-full h-full object-cover"}),s.jsx("span",{className:`absolute top-0 right-0 w-4 h-4 flex items-center justify-center text-[10px] font-medium rounded-bl ${w===0?"bg-blue-500 text-white":"bg-gray-600 text-white"}`,children:w+1})]},w))}),t&&s.jsxs("div",{className:"flex gap-2 items-start",children:[s.jsx("p",{className:`flex-1 text-sm ${h} leading-relaxed break-words min-w-0`,children:t}),s.jsxs("button",{type:"button",onClick:u,className:`shrink-0 px-2 py-1 rounded text-xs font-medium flex items-center gap-1 ${i?"bg-white/15 hover:bg-white/25 text-gray-200":"bg-gray-200 hover:bg-gray-300 text-gray-800"}`,children:[l?s.jsx(Eo,{size:12}):s.jsx(Eh,{size:12}),l?"已复制":"复制"]})]}),!t&&n.length===0&&s.jsx("p",{className:`text-sm ${h} opacity-60`,children:"暂无提示词与输入图信息"})]})]});return a?s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"fixed inset-0 z-[99] bg-transparent",onClick:r}),g]}):s.jsxs("div",{className:"fixed inset-0 z-[100] flex items-end justify-center",children:[s.jsx("div",{className:"absolute inset-0 bg-black/20 pointer-events-auto",onClick:r}),s.jsx("div",{className:"relative z-10 pointer-events-auto w-full max-w-2xl mx-4 mb-6",children:g})]})},hee=({totalNodes:e,visibleNodes:t,nodeQualityMap:n,enabled:r=!0})=>{const[i,a]=_.useState(60),[o,l]=_.useState(60),c=_.useRef([]),u=_.useRef(performance.now()),d=_.useRef(null),h={low:0,medium:0,high:0};return n&&typeof n.forEach=="function"&&n.forEach(p=>{h[p]++}),_.useEffect(()=>{if(!r)return;const p=()=>{const f=performance.now(),b=f-u.current;u.current=f;const g=1e3/b;c.current.push(g),c.current.length>60&&c.current.shift();const y=c.current.reduce((w,v)=>w+v,0)/c.current.length;if(c.current.length%10===0){const w=Number.isFinite(g)&&g>0?Math.min(240,Math.max(1,g)):60,v=Number.isFinite(y)&&y>0?Math.min(240,Math.max(1,y)):60;a(w),l(v)}d.current=requestAnimationFrame(p)};return d.current=requestAnimationFrame(p),()=>{d.current&&cancelAnimationFrame(d.current)}},[r]),{totalNodes:e,visibleNodes:t,currentFPS:i,avgFPS:o,qualityDistribution:h}},pee=({totalNodes:e,visibleNodesCount:t,nodeQualityMap:n,isDark:r,lightboxOpen:i=!1})=>{const[a,o]=_.useState(!1),l=hee({totalNodes:e,visibleNodes:t,nodeQualityMap:n,enabled:a&&!i});if(_.useEffect(()=>{const d=h=>{const p=h.target;p.tagName==="INPUT"||p.tagName==="TEXTAREA"||p.isContentEditable||(h.key==="p"||h.key==="P")&&o(f=>!f)};return window.addEventListener("keydown",d),()=>window.removeEventListener("keydown",d)},[]),!a)return null;const c=d=>d>=55?r?"text-green-400":"text-green-600":d>=30?r?"text-yellow-400":"text-yellow-600":r?"text-red-400":"text-red-600",u=l.totalNodes>0?(l.visibleNodes/l.totalNodes*100).toFixed(1):"0.0";return s.jsxs("div",{className:`fixed top-4 right-4 z-[9999] rounded-lg shadow-none border backdrop-blur-sm ${r?"bg-zinc-900/95 border-zinc-700 text-zinc-100":"bg-white/95 border-zinc-300 text-zinc-900"}`,style:{minWidth:"280px"},children:[s.jsxs("div",{className:`flex items-center justify-between px-3 py-2 border-b ${r?"border-zinc-700":"border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(EP,{size:16,className:"text-blue-500"}),s.jsx("span",{className:"text-sm font-semibold",children:"性能监控"})]}),s.jsx("button",{onClick:()=>o(!1),className:`text-xs px-2 py-0.5 rounded transition-colors ${r?"hover:bg-zinc-800 text-zinc-400":"hover:bg-zinc-100 text-zinc-600"}`,children:"✕"})]}),s.jsxs("div",{className:"p-3 space-y-3",children:[s.jsxs("div",{className:"space-y-1",children:[s.jsxs("div",{className:"flex items-center gap-2 text-xs text-zinc-500",children:[s.jsx(O5,{size:12}),s.jsx("span",{children:"帧率"})]}),s.jsxs("div",{className:"flex items-baseline gap-3",children:[s.jsxs("div",{children:[s.jsx("span",{className:`text-2xl font-bold ${c(l.currentFPS)}`,children:l.currentFPS.toFixed(0)}),s.jsx("span",{className:"text-xs ml-1 text-zinc-500",children:"FPS"})]}),s.jsxs("div",{className:"text-xs text-zinc-500",children:["平均: ",s.jsx("span",{className:c(l.avgFPS),children:l.avgFPS.toFixed(0)})]})]})]}),s.jsxs("div",{className:"space-y-1",children:[s.jsxs("div",{className:"flex items-center gap-2 text-xs text-zinc-500",children:[s.jsx(cl,{size:12}),s.jsx("span",{children:"节点可见性"})]}),s.jsxs("div",{className:"flex items-baseline gap-2",children:[s.jsx("span",{className:"text-lg font-semibold text-blue-500",children:l.visibleNodes}),s.jsxs("span",{className:"text-xs text-zinc-500",children:["/ ",l.totalNodes," (",u,"%)"]})]})]}),s.jsxs("div",{className:"space-y-1",children:[s.jsxs("div",{className:"flex items-center gap-2 text-xs text-zinc-500",children:[s.jsx(Ov,{size:12}),s.jsx("span",{children:"渲染质量"})]}),s.jsxs("div",{className:"grid grid-cols-3 gap-2 text-xs",children:[s.jsxs("div",{className:`text-center py-1 rounded ${r?"bg-zinc-800":"bg-zinc-100"}`,children:[s.jsx("div",{className:"text-red-500 font-semibold",children:l.qualityDistribution.low}),s.jsx("div",{className:"text-zinc-500",children:"Low"})]}),s.jsxs("div",{className:`text-center py-1 rounded ${r?"bg-zinc-800":"bg-zinc-100"}`,children:[s.jsx("div",{className:"text-yellow-500 font-semibold",children:l.qualityDistribution.medium}),s.jsx("div",{className:"text-zinc-500",children:"Medium"})]}),s.jsxs("div",{className:`text-center py-1 rounded ${r?"bg-zinc-800":"bg-zinc-100"}`,children:[s.jsx("div",{className:"text-green-500 font-semibold",children:l.qualityDistribution.high}),s.jsx("div",{className:"text-zinc-500",children:"High"})]})]})]})]}),s.jsx("div",{className:`px-3 py-2 text-xs border-t space-y-0.5 ${r?"border-zinc-700 text-zinc-500":"border-zinc-200 text-zinc-600"}`,children:s.jsxs("div",{children:["快捷键 ",s.jsx("kbd",{className:`px-1 rounded ${r?"bg-zinc-800":"bg-zinc-100"}`,children:"P"})," 切换显示"]})})]})},t4=({isOpen:e,onClose:t,isDark:n,apiConfigs:r,globalApiKey:i,globalBaseUrl:a,activeEndpoint:o,jimengUseLocalFile:l,apiTesting:c,apiStatus:u,showBaseUrl:d=!0,filterJimengModels:h,jimengModelsHidden:p=!1,onSetGlobalApiKey:f,onSetGlobalBaseUrl:b,onSetJimengUseLocalFile:g,onSetJimengSessionId:y,jimengSuperResUrl:w="",jimengSuperResApiKey:v="",onSetJimengSuperResUrl:m,onSetJimengSuperResApiKey:z,onTestJimengSuperResConnection:C,onUpdateConfig:E,onUpdateConfigs:I,onTestApiConnection:R,onSwitchEndpoint:A,getEndpoints:O})=>{const F=h?h(r):r,[L,X]=_.useState("Chat"),T={Chat:F.filter(de=>de.type==="Chat"),Image:F.filter(de=>de.type==="Image"),Video:F.filter(de=>de.type==="Video"),Music:F.filter(de=>de.type==="Music")},q=L==="Tool"?[]:T[L],[H,J]=_.useState(!1),[Z,B]=_.useState("idle"),[V,N]=_.useState(""),[j,k]=_.useState(!1),[W,M]=_.useState(!1),[Y,se]=_.useState(null),[ie,oe]=_.useState(null),[re,ee]=_.useState(!1),[pe,we]=_.useState("idle"),[Q,me]=_.useState(""),[ue,U]=_.useState(()=>localStorage.getItem("qiaodoumayi_seedance_moderation_url")||"http://118.196.112.236:3428/api/moderation/image"),[G,te]=_.useState(()=>localStorage.getItem("qiaodoumayi_seedance_moderation_user_id")||""),[ge,ne]=_.useState(()=>localStorage.getItem("qiaodoumayi_seedance_moderation_key_hex")||""),le=_.useCallback(de=>{typeof de.url=="string"&&localStorage.setItem("qiaodoumayi_seedance_moderation_url",de.url),typeof de.userId=="string"&&localStorage.setItem("qiaodoumayi_seedance_moderation_user_id",de.userId),typeof de.keyHex=="string"&&localStorage.setItem("qiaodoumayi_seedance_moderation_key_hex",de.keyHex)},[]);_.useEffect(()=>{try{localStorage.setItem("qiaodoumayi_seedance_moderation_url",ue||""),localStorage.setItem("qiaodoumayi_seedance_moderation_user_id",G||""),localStorage.setItem("qiaodoumayi_seedance_moderation_key_hex",ge||"")}catch{}},[ue,G,ge]);const fe=_.useCallback(async()=>{if(!C)return;const de=(w||"").trim().replace(/\/+$/,"");if(!de){B("error"),N("请先填写 BASE URL");return}J(!0),B("idle"),N("");try{const $e=await C(de,v||"");B($e.success?"success":"error"),N($e.message||($e.success?"连接成功":"连接失败"))}catch($e){B("error"),N($e instanceof Error?$e.message:"测试失败")}finally{J(!1)}},[C,w,v]),be=_.useCallback(async()=>{ee(!0),we("idle"),me("");try{const de=(ue||"").trim(),$e=(G||"").trim(),ze=(ge||"").trim();if(!de||!$e||!ze)throw new Error("请先填写 URL / USER ID / AES KEY");await V5({apiUrl:de,userId:$e,keyHex:ze},["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9o5lH0QAAAAASUVORK5CYII="]),we("success"),me("素材审核接口可用")}catch(de){const $e=de instanceof Error?de.message:"测试失败";we("error"),me($e)}finally{ee(!1)}},[ue,G,ge]);return e?s.jsx("div",{className:"fixed inset-0 bg-black/50 z-[100] flex items-center justify-center",onClick:t,children:s.jsxs("div",{className:`w-[700px] max-h-[90vh] overflow-hidden rounded-lg shadow-2xl flex flex-col ${n?"bg-[#121214] border-zinc-800":"bg-white border-zinc-200"} border`,onClick:de=>de.stopPropagation(),children:[s.jsxs("div",{className:`p-4 border-b flex justify-between items-center shrink-0 ${n?"border-zinc-800":"border-zinc-200"}`,children:[s.jsx("h3",{className:`font-bold text-base ${n?"text-zinc-200":"text-zinc-800"}`,children:"模型接口配置"}),s.jsx("button",{onClick:t,children:s.jsx(Qr,{size:18,className:n?"text-zinc-500":"text-zinc-400"})})]}),s.jsx("div",{className:`px-4 pt-3 border-b ${n?"border-zinc-800":"border-zinc-200"}`,children:s.jsx("div",{className:"flex gap-1",children:["Chat","Image","Video","Music","Tool"].map(de=>s.jsxs("button",{onClick:()=>X(de),className:`px-4 py-2 text-sm font-medium rounded-t-lg transition-colors relative ${L===de?n?"text-blue-400 bg-zinc-900":"text-blue-600 bg-zinc-50":n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-900/50":"text-zinc-500 hover:text-zinc-700 hover:bg-zinc-100"}`,children:[de==="Tool"?"工具":de,de!=="Tool"&&s.jsx("span",{className:`ml-2 text-xs px-1.5 py-0.5 rounded ${L===de?n?"bg-blue-900/50 text-blue-300":"bg-blue-100 text-blue-600":n?"bg-zinc-800 text-zinc-500":"bg-zinc-200 text-zinc-600"}`,children:T[de].length}),L===de&&s.jsx("div",{className:`absolute bottom-0 left-0 right-0 h-0.5 ${n?"bg-blue-400":"bg-blue-600"}`})]},de))})}),s.jsxs("div",{className:"flex-1 overflow-y-auto custom-scrollbar p-5 space-y-5",children:[L==="Tool"&&m&&z&&s.jsxs("div",{className:`rounded-lg border p-4 ${n?"bg-zinc-900/50 border-zinc-800":"bg-zinc-50 border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[s.jsx("div",{className:`w-2 h-2 rounded-full transition-all ${Z==="success"?"bg-green-500 shadow-[0_0_6px_rgba(34,197,94,0.6)]":w!=null&&w.trim()?"bg-yellow-500 shadow-[0_0_6px_rgba(234,179,8,0.6)]":"bg-zinc-500"}`}),s.jsx("span",{className:`font-medium text-sm ${n?"text-zinc-200":"text-zinc-800"}`,children:"即梦智能超清"}),s.jsx("span",{className:`text-[10px] px-2 py-0.5 rounded ${n?"bg-amber-900/50 text-amber-400":"bg-amber-100 text-amber-600"}`,children:"工具"})]}),s.jsx("p",{className:`text-[10px] mb-3 ${n?"text-zinc-500":"text-zinc-400"}`,children:"独立官方接口,不与其他模型共用。请填写火山引擎 visual 接口的 BASE URL 与鉴权信息。"}),s.jsxs("p",{className:`text-[10px] mb-2 ${n?"text-red-400/90":"text-red-600"}`,children:[s.jsx("strong",{children:"注意:"}),"此处需填火山引擎「访问控制」→「API 密钥」中的 ",s.jsx("strong",{children:"Access Key ID + Secret Access Key"}),",格式为 ",s.jsx("strong",{children:"AccessKeyId:SecretAccessKey"}),"(英文冒号连接)。",s.jsx("strong",{children:"不是"}),"方舟「API Key 管理」里的单串 API Key。"]}),s.jsx("p",{className:`text-[10px] mb-3 ${n?"text-amber-600/90":"text-amber-700"}`,children:"浏览器直连会 CORS 失败,需使用本仓库「即梦智能超清代理」:BASE URL 填 http://127.0.0.1:9529,API KEY 填上述 AK:SK;或在代理目录 .env 中配置 VOLC_ACCESS_KEY、VOLC_SECRET_KEY 后 API KEY 留空。"}),s.jsxs("div",{className:"space-y-2",children:[s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx("label",{className:`text-[10px] uppercase w-20 shrink-0 text-right ${n?"text-zinc-500":"text-zinc-400"}`,children:"BASE URL"}),s.jsx("input",{type:"text",value:w,onChange:de=>m(de.target.value),placeholder:"http://127.0.0.1:9529 或其它代理地址",className:`flex-1 px-3 py-1.5 text-xs rounded border outline-none focus:border-blue-500 ${n?"bg-zinc-800 border-zinc-700 text-zinc-200 placeholder-zinc-600":"bg-white border-zinc-300 text-zinc-800 placeholder-zinc-400"}`})]}),s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx("label",{className:`text-[10px] uppercase w-20 shrink-0 text-right ${n?"text-zinc-500":"text-zinc-400"}`,children:"API KEY"}),s.jsxs("div",{className:"flex-1 relative",children:[s.jsx("input",{type:W?"text":"password",value:v,onChange:de=>z(de.target.value),placeholder:"访问控制 AK:SK(非方舟 API Key)",className:`w-full px-3 py-1.5 pr-8 text-xs rounded border outline-none focus:border-blue-500 ${n?"bg-zinc-800 border-zinc-700 text-zinc-200 placeholder-zinc-600":"bg-white border-zinc-300 text-zinc-800 placeholder-zinc-400"}`}),s.jsx("button",{type:"button",onClick:()=>M(de=>!de),className:`absolute right-2 top-1/2 -translate-y-1/2 p-0.5 rounded ${n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-700":"text-zinc-500 hover:text-zinc-800 hover:bg-zinc-200"}`,title:W?"隐藏":"显示",children:W?s.jsx(nm,{size:14}):s.jsx(cl,{size:14})})]})]})]}),C&&s.jsxs("div",{className:`mt-3 pt-2 border-t flex justify-end items-center gap-2 ${n?"border-zinc-800/50":"border-zinc-200"}`,children:[V&&s.jsx("span",{className:`text-[10px] ${Z==="success"?"text-green-500":"text-red-500"}`,children:V}),s.jsx("button",{onClick:fe,disabled:H||!(w!=null&&w.trim()),className:`flex items-center gap-1.5 px-2 py-1 rounded text-[10px] font-medium transition-all ${H||!(w!=null&&w.trim())?n?"text-zinc-500 cursor-not-allowed":"text-zinc-400 cursor-not-allowed":Z==="success"?"text-green-500 hover:bg-green-500/10":Z==="error"?"text-red-500 hover:bg-red-500/10":n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800":"text-zinc-500 hover:text-zinc-700 hover:bg-zinc-100"}`,children:H?s.jsxs(s.Fragment,{children:[s.jsx(zr,{size:10,className:"animate-spin"})," 测试中..."]}):Z==="success"?s.jsxs(s.Fragment,{children:[s.jsx(Eo,{size:10})," 连接成功"]}):Z==="error"?s.jsxs(s.Fragment,{children:[s.jsx(Qr,{size:10})," 连接失败"]}):s.jsxs(s.Fragment,{children:[s.jsx(Bp,{size:10})," 测试连接"]})})]})]}),L!=="Tool"&&b&&s.jsxs("div",{children:[s.jsx("label",{className:`block text-[10px] uppercase tracking-wider mb-2 ${n?"text-zinc-500":"text-zinc-400"}`,children:"GLOBAL BASE URL(全局 API 地址)"}),s.jsx("input",{type:"text",value:a||"",onChange:de=>b(de.target.value),placeholder:"https://ai.comfly.chat",className:`w-full px-3 py-2.5 text-sm rounded-lg border outline-none focus:border-blue-500 ${n?"bg-zinc-900 border-zinc-700 text-white placeholder-zinc-600":"bg-white border-zinc-200 text-zinc-900 placeholder-zinc-400"}`}),s.jsx("p",{className:`text-[10px] mt-1.5 ${n?"text-zinc-500":"text-zinc-400"}`,children:"修改后将自动更新所有模型的 BASE URL"})]}),L!=="Tool"&&s.jsxs("div",{children:[s.jsx("label",{className:`block text-[10px] uppercase tracking-wider mb-2 ${n?"text-zinc-500":"text-zinc-400"}`,children:"GLOBAL API KEY(可选,全局默认 KEY)"}),s.jsxs("div",{className:"relative",children:[s.jsx("input",{type:j?"text":"password",value:i,onChange:de=>f(de.target.value),onBlur:async()=>{if(i)for(const de of r)de.key||await R(de.id)},placeholder:"••••••••••••••••••••••••••••••••••••••••••••••",className:`w-full px-3 py-2.5 pr-10 text-sm rounded-lg border outline-none focus:border-blue-500 ${n?"bg-zinc-900 border-zinc-700 text-white placeholder-zinc-600":"bg-white border-zinc-200 text-zinc-900 placeholder-zinc-400"}`}),s.jsx("button",{type:"button",onClick:()=>k(de=>!de),className:`absolute right-2 top-1/2 -translate-y-1/2 p-1 rounded transition-colors ${n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800":"text-zinc-500 hover:text-zinc-800 hover:bg-zinc-200"}`,title:j?"隐藏":"显示",children:j?s.jsx(nm,{size:16}):s.jsx(cl,{size:16})})]})]}),L!=="Tool"&&!p&&s.jsxs("div",{className:`flex items-center justify-between py-3 border-b ${n?"border-zinc-800":"border-zinc-200"}`,children:[s.jsxs("div",{children:[s.jsx("p",{className:`text-sm ${n?"text-zinc-300":"text-zinc-700"}`,children:"即梦图生图使用本地文件"}),s.jsx("p",{className:`text-[10px] mt-0.5 ${n?"text-zinc-500":"text-zinc-400"}`,children:"启用后,即梦模型的图生图功能将强制使用本地文件(FormData),URL图片会自动下载转换为本地文件"})]}),s.jsx("button",{onClick:()=>g(!l),className:`w-12 h-6 rounded-full transition-colors relative ${l?"bg-blue-600":n?"bg-zinc-700":"bg-zinc-300"}`,children:s.jsx("div",{className:`absolute top-1 w-4 h-4 rounded-full bg-white transition-transform ${l?"translate-x-7":"translate-x-1"}`})})]}),L!=="Tool"&&s.jsxs("div",{className:"hidden items-center justify-between",children:[s.jsx("p",{className:`text-sm ${n?"text-zinc-400":"text-zinc-500"}`,children:"管理您的第三方模型接口。"}),s.jsxs("button",{onClick:()=>{const de={id:`custom-${Date.now()}`,provider:"New Model",modelName:"new-model-id",type:"Chat",key:"",url:o.baseUrl,isCustom:!0};I([...r,de])},className:"px-4 py-2 text-xs rounded-lg bg-blue-600 text-white hover:bg-blue-500 transition-colors flex items-center gap-1",children:[s.jsx(Xi,{size:14}),"添加模型"]})]}),L!=="Tool"&&s.jsx("div",{className:"space-y-4",children:q.length===0?s.jsx("div",{className:`text-center py-8 ${n?"text-zinc-500":"text-zinc-400"}`,children:s.jsxs("p",{className:"text-sm",children:["暂无 ",L," 类型的模型"]})}):q.map(de=>s.jsxs("div",{className:`rounded-lg border p-4 ${n?"bg-zinc-900/50 border-zinc-800":"bg-zinc-50 border-zinc-200"}`,children:[null,s.jsxs("div",{className:"flex items-center justify-between mb-3",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("div",{className:`w-2 h-2 rounded-full ${de.key||i?"bg-green-500 shadow-[0_0_6px_rgba(34,197,94,0.6)]":"bg-zinc-500"}`}),s.jsxs("span",{className:`font-medium text-sm ${n?"text-zinc-200":"text-zinc-800"}`,children:[de.provider,(de.provider.startsWith("Seedream")||de.provider.startsWith("Seedance"))&&!de.provider.includes("API")?" Official":""]})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:`text-[10px] px-2 py-0.5 rounded ${de.type==="Chat"?n?"bg-blue-900/50 text-blue-400":"bg-blue-100 text-blue-600":de.type==="Image"?n?"bg-green-900/50 text-green-400":"bg-green-100 text-green-600":de.type==="Video"?n?"bg-purple-900/50 text-purple-400":"bg-purple-100 text-purple-600":de.type==="Music"?n?"bg-amber-900/50 text-amber-400":"bg-amber-100 text-amber-600":n?"bg-zinc-900/50 text-zinc-400":"bg-zinc-100 text-zinc-600"}`,children:de.type}),de.isCustom&&s.jsx("button",{onClick:()=>I(r.filter($e=>$e.id!==de.id)),className:`p-1 rounded ${n?"text-zinc-500 hover:text-red-400":"text-zinc-400 hover:text-red-500"}`,children:s.jsx(Qr,{size:14})})]})]}),s.jsxs("div",{className:"space-y-2",children:[s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx("label",{className:`text-[10px] uppercase w-20 shrink-0 text-right ${n?"text-zinc-500":"text-zinc-400"}`,children:"MODEL ID"}),s.jsx("input",{type:"text",value:de.modelName,onChange:$e=>E(de.id,{modelName:$e.target.value}),className:`flex-1 px-3 py-1.5 text-xs rounded border outline-none focus:border-blue-500 ${n?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`})]}),s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx("label",{className:`text-[10px] uppercase w-20 shrink-0 text-right ${n?"text-zinc-500":"text-zinc-400"}`,children:de.id.includes("jimeng")?"SESSION ID":"API KEY"}),s.jsxs("div",{className:"flex-1 relative",children:[s.jsx("input",{type:de.id.includes("jimeng")?ie===de.id?"text":"password":Y===de.id?"text":"password",value:de.key,onChange:$e=>{de.id.includes("jimeng")?y($e.target.value):E(de.id,{key:$e.target.value})},placeholder:de.id.includes("jimeng")?"输入 Session ID...":"sk-...",className:`w-full px-3 py-1.5 pr-8 text-xs rounded border outline-none focus:border-blue-500 ${n?"bg-zinc-800 border-zinc-700 text-zinc-200 placeholder-zinc-600":"bg-white border-zinc-300 text-zinc-800 placeholder-zinc-400"}`}),s.jsx("button",{type:"button",onClick:()=>{de.id.includes("jimeng")?oe(ie===de.id?null:de.id):se(Y===de.id?null:de.id)},className:`absolute right-2 top-1/2 -translate-y-1/2 p-0.5 rounded ${n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-700":"text-zinc-500 hover:text-zinc-800 hover:bg-zinc-200"}`,title:de.id.includes("jimeng")?ie===de.id?"隐藏":"显示":Y===de.id?"隐藏":"显示",children:de.id.includes("jimeng")?ie===de.id?s.jsx(nm,{size:14}):s.jsx(cl,{size:14}):Y===de.id?s.jsx(nm,{size:14}):s.jsx(cl,{size:14})})]})]}),d&&s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx("label",{className:`text-[10px] uppercase w-20 shrink-0 text-right ${n?"text-zinc-500":"text-zinc-400"}`,children:"BASE URL"}),s.jsx("input",{type:"text",value:de.url,onChange:$e=>E(de.id,{url:$e.target.value}),placeholder:"https://...",className:`flex-1 px-3 py-1.5 text-xs rounded border outline-none focus:border-blue-500 ${n?"bg-zinc-800 border-zinc-700 text-zinc-200 placeholder-zinc-600":"bg-white border-zinc-300 text-zinc-800 placeholder-zinc-400"}`})]}),de.id==="seedance-2.0"&&s.jsxs("div",{className:`mt-3 pt-3 border-t ${n?"border-zinc-800/50":"border-zinc-200"}`,children:[s.jsx("div",{className:`text-[10px] uppercase tracking-wider mb-2 ${n?"text-zinc-500":"text-zinc-400"}`,children:"素材审核(虚拟人像创建接口)"}),s.jsxs("div",{className:"space-y-2",children:[s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx("label",{className:`text-[10px] uppercase w-20 shrink-0 text-right ${n?"text-zinc-500":"text-zinc-400"}`,children:"URL"}),s.jsx("input",{type:"text",value:ue,onChange:$e=>{const ze=$e.target.value;U(ze),le({url:ze})},placeholder:"http://...",className:`flex-1 px-3 py-1.5 text-xs rounded border outline-none focus:border-blue-500 ${n?"bg-zinc-800 border-zinc-700 text-zinc-200 placeholder-zinc-600":"bg-white border-zinc-300 text-zinc-800 placeholder-zinc-400"}`})]}),s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx("label",{className:`text-[10px] uppercase w-20 shrink-0 text-right ${n?"text-zinc-500":"text-zinc-400"}`,children:"USER ID"}),s.jsx("input",{type:"text",value:G,onChange:$e=>{const ze=$e.target.value;te(ze),le({userId:ze})},placeholder:"例如:6",className:`flex-1 px-3 py-1.5 text-xs rounded border outline-none focus:border-blue-500 ${n?"bg-zinc-800 border-zinc-700 text-zinc-200 placeholder-zinc-600":"bg-white border-zinc-300 text-zinc-800 placeholder-zinc-400"}`})]}),s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx("label",{className:`text-[10px] uppercase w-20 shrink-0 text-right ${n?"text-zinc-500":"text-zinc-400"}`,children:"AES KEY"}),s.jsx("input",{type:"password",value:ge,onChange:$e=>{const ze=$e.target.value;ne(ze),le({keyHex:ze})},placeholder:"64位hex(不要提交到代码)",className:`flex-1 px-3 py-1.5 text-xs rounded border outline-none focus:border-blue-500 ${n?"bg-zinc-800 border-zinc-700 text-zinc-200 placeholder-zinc-600":"bg-white border-zinc-300 text-zinc-800 placeholder-zinc-400"}`})]}),s.jsxs("div",{className:`pt-2 mt-1 border-t ${n?"border-zinc-800/50":"border-zinc-200"}`,children:[s.jsx("div",{className:"flex items-center justify-end gap-2",children:s.jsx("button",{type:"button",onClick:be,disabled:re,className:`flex items-center gap-1.5 px-2 py-1 rounded text-[10px] font-medium transition-all ${pe==="success"?"text-green-500 hover:bg-green-500/10":pe==="error"?"text-red-500 hover:bg-red-500/10":n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800":"text-zinc-500 hover:text-zinc-700 hover:bg-zinc-100"}`,children:re?s.jsxs(s.Fragment,{children:[s.jsx(zr,{size:10,className:"animate-spin"})," 测试审核中..."]}):pe==="success"?s.jsxs(s.Fragment,{children:[s.jsx(Eo,{size:10})," 审核接口成功"]}):s.jsxs(s.Fragment,{children:[s.jsx(Bp,{size:10})," 测试审核接口"]})})}),Q&&s.jsx("div",{className:`mt-1 text-[10px] text-right ${pe==="success"?"text-green-500":pe==="error"?"text-red-500":n?"text-zinc-500":"text-zinc-400"}`,children:Q})]})]})]})]}),s.jsx("div",{className:`mt-3 pt-2 border-t flex justify-end ${n?"border-zinc-800/50":"border-zinc-200"}`,children:s.jsx("button",{onClick:()=>R(de.id),disabled:c===de.id,className:`flex items-center gap-1.5 px-2 py-1 rounded text-[10px] font-medium transition-all ${u[de.id]==="success"?"text-green-500 hover:bg-green-500/10":u[de.id]==="error"?"text-red-500 hover:bg-red-500/10":n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800":"text-zinc-500 hover:text-zinc-700 hover:bg-zinc-100"}`,children:c===de.id?s.jsxs(s.Fragment,{children:[s.jsx(zr,{size:10,className:"animate-spin"})," 测试中..."]}):u[de.id]==="success"?s.jsxs(s.Fragment,{children:[s.jsx(Eo,{size:10})," 连接成功"]}):u[de.id]==="error"?s.jsxs(s.Fragment,{children:[s.jsx(Qr,{size:10})," 连接失败"]}):s.jsxs(s.Fragment,{children:[s.jsx(Bp,{size:10})," 测试连接"]})})})]},de.id))}),s.jsxs("div",{className:`hidden pt-4 border-t ${n?"border-zinc-800":"border-zinc-200"}`,children:[s.jsx("label",{className:`block text-[10px] uppercase tracking-wider mb-2 ${n?"text-zinc-500":"text-zinc-400"}`,children:"一键切换所有模型端点"}),s.jsx("div",{className:"flex flex-wrap gap-2",children:O().map(de=>s.jsx("button",{onClick:()=>A(de.id),className:`px-3 py-1.5 text-xs rounded-lg border transition-colors ${o.id===de.id?"bg-blue-600 border-blue-500 text-white":n?"bg-zinc-800 border-zinc-700 text-zinc-300 hover:border-zinc-600":"bg-zinc-100 border-zinc-200 text-zinc-700 hover:border-zinc-300"}`,children:de.name},de.id))})]})]}),s.jsx("div",{className:`p-4 border-t flex justify-end ${n?"border-zinc-800":"border-zinc-200"}`,children:s.jsx("button",{onClick:t,className:`px-6 py-2 text-sm rounded-lg transition-colors ${n?"bg-zinc-800 text-zinc-300 hover:bg-zinc-700":"bg-zinc-100 text-zinc-700 hover:bg-zinc-200"}`,children:"关闭"})})]})}):null},fee=_.memo(t4),mee=Object.freeze(Object.defineProperty({__proto__:null,SettingsPanel:t4,default:fee},Symbol.toStringTag,{value:"Module"}));function n4(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var of=n4();function a9(e){of=e}var yx={exec:()=>null};function vi(e,t=""){let n=typeof e=="string"?e:e.source;const r={replace:(i,a)=>{let o=typeof a=="string"?a:a.source;return o=o.replace(ul.caret,"$1"),n=n.replace(i,o),r},getRegex:()=>new RegExp(n,t)};return r}var ul={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceTabs:/^\t+/,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] /,listReplaceTask:/^\[[ xX]\] +/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:e=>new RegExp(`^( {0,3}${e})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}#`),htmlBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}<(?:[a-z].*>|!--)`,"i")},gee=/^(?:[ \t]*(?:\n|$))+/,xee=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,bee=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,yb=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,yee=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,r4=/(?:[*+-]|\d{1,9}[.)])/,o9=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,l9=vi(o9).replace(/bull/g,r4).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),vee=vi(o9).replace(/bull/g,r4).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),s4=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,wee=/^[^\n]+/,i4=/(?!\s*\])(?:\\.|[^\[\]\\])+/,_ee=vi(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",i4).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),zee=vi(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,r4).getRegex(),Hw="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",a4=/|$))/,$ee=vi("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",a4).replace("tag",Hw).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),c9=vi(s4).replace("hr",yb).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",Hw).getRegex(),See=vi(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",c9).getRegex(),o4={blockquote:See,code:xee,def:_ee,fences:bee,heading:yee,hr:yb,html:$ee,lheading:l9,list:zee,newline:gee,paragraph:c9,table:yx,text:wee},QC=vi("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",yb).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",Hw).getRegex(),jee={...o4,lheading:vee,table:QC,paragraph:vi(s4).replace("hr",yb).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",QC).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",Hw).getRegex()},Cee={...o4,html:vi(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",a4).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:yx,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:vi(s4).replace("hr",yb).replace("heading",` *#{1,6} *[^ +]`).replace("lheading",l9).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},Nee=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,Eee=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,u9=/^( {2,}|\\)\n(?!\s*$)/,Iee=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\]*?>/g,p9=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,Ree=vi(p9,"u").replace(/punct/g,Gw).getRegex(),Pee=vi(p9,"u").replace(/punct/g,h9).getRegex(),f9="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",Oee=vi(f9,"gu").replace(/notPunctSpace/g,d9).replace(/punctSpace/g,l4).replace(/punct/g,Gw).getRegex(),Lee=vi(f9,"gu").replace(/notPunctSpace/g,Mee).replace(/punctSpace/g,Aee).replace(/punct/g,h9).getRegex(),Bee=vi("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,d9).replace(/punctSpace/g,l4).replace(/punct/g,Gw).getRegex(),Uee=vi(/\\(punct)/,"gu").replace(/punct/g,Gw).getRegex(),Fee=vi(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),Wee=vi(a4).replace("(?:-->|$)","-->").getRegex(),Dee=vi("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",Wee).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),Dv=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,Vee=vi(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label",Dv).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),m9=vi(/^!?\[(label)\]\[(ref)\]/).replace("label",Dv).replace("ref",i4).getRegex(),g9=vi(/^!?\[(ref)\](?:\[\])?/).replace("ref",i4).getRegex(),Hee=vi("reflink|nolink(?!\\()","g").replace("reflink",m9).replace("nolink",g9).getRegex(),c4={_backpedal:yx,anyPunctuation:Uee,autolink:Fee,blockSkip:Tee,br:u9,code:Eee,del:yx,emStrongLDelim:Ree,emStrongRDelimAst:Oee,emStrongRDelimUnd:Bee,escape:Nee,link:Vee,nolink:g9,punctuation:kee,reflink:m9,reflinkSearch:Hee,tag:Dee,text:Iee,url:yx},Gee={...c4,link:vi(/^!?\[(label)\]\((.*?)\)/).replace("label",Dv).getRegex(),reflink:vi(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Dv).getRegex()},_$={...c4,emStrongRDelimAst:Lee,emStrongLDelim:Pee,url:vi(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,"i").replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\.|[^\\])*?(?:\\.|[^\s~\\]))\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},eN=e=>Kee[e];function Vd(e,t){if(t){if(ul.escapeTest.test(e))return e.replace(ul.escapeReplace,eN)}else if(ul.escapeTestNoEncode.test(e))return e.replace(ul.escapeReplaceNoEncode,eN);return e}function tN(e){try{e=encodeURI(e).replace(ul.percentDecode,"%")}catch{return null}return e}function nN(e,t){var a;const n=e.replace(ul.findPipe,(o,l,c)=>{let u=!1,d=l;for(;--d>=0&&c[d]==="\\";)u=!u;return u?"|":" |"}),r=n.split(ul.splitPipe);let i=0;if(r[0].trim()||r.shift(),r.length>0&&!((a=r.at(-1))!=null&&a.trim())&&r.pop(),t)if(r.length>t)r.splice(t);else for(;r.length0?-2:-1}function rN(e,t,n,r,i){const a=t.href,o=t.title||null,l=e[1].replace(i.other.outputLinkReplace,"$1");r.state.inLink=!0;const c={type:e[0].charAt(0)==="!"?"image":"link",raw:n,href:a,title:o,text:l,tokens:r.inlineTokens(l)};return r.state.inLink=!1,c}function Yee(e,t,n){const r=e.match(n.other.indentCodeCompensation);if(r===null)return t;const i=r[1];return t.split(` +`).map(a=>{const o=a.match(n.other.beginningSpace);if(o===null)return a;const[l]=o;return l.length>=i.length?a.slice(i.length):a}).join(` +`)}var Vv=class{constructor(e){Mn(this,"options");Mn(this,"rules");Mn(this,"lexer");this.options=e||of}space(e){const t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:"space",raw:t[0]}}code(e){const t=this.rules.block.code.exec(e);if(t){const n=t[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:t[0],codeBlockStyle:"indented",text:this.options.pedantic?n:Ng(n,` +`)}}}fences(e){const t=this.rules.block.fences.exec(e);if(t){const n=t[0],r=Yee(n,t[3]||"",this.rules);return{type:"code",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):t[2],text:r}}}heading(e){const t=this.rules.block.heading.exec(e);if(t){let n=t[2].trim();if(this.rules.other.endingHash.test(n)){const r=Ng(n,"#");(this.options.pedantic||!r||this.rules.other.endingSpaceChar.test(r))&&(n=r.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){const t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:Ng(t[0],` +`)}}blockquote(e){const t=this.rules.block.blockquote.exec(e);if(t){let n=Ng(t[0],` +`).split(` +`),r="",i="";const a=[];for(;n.length>0;){let o=!1;const l=[];let c;for(c=0;c1,i={type:"list",raw:"",ordered:r,start:r?+n.slice(0,-1):"",loose:!1,items:[]};n=r?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=r?n:"[*+-]");const a=this.rules.other.listItemRegex(n);let o=!1;for(;e;){let c=!1,u="",d="";if(!(t=a.exec(e))||this.rules.block.hr.test(e))break;u=t[0],e=e.substring(u.length);let h=t[2].split(` +`,1)[0].replace(this.rules.other.listReplaceTabs,w=>" ".repeat(3*w.length)),p=e.split(` +`,1)[0],f=!h.trim(),b=0;if(this.options.pedantic?(b=2,d=h.trimStart()):f?b=t[1].length+1:(b=t[2].search(this.rules.other.nonSpaceChar),b=b>4?1:b,d=h.slice(b),b+=t[1].length),f&&this.rules.other.blankLine.test(p)&&(u+=p+` +`,e=e.substring(p.length+1),c=!0),!c){const w=this.rules.other.nextBulletRegex(b),v=this.rules.other.hrRegex(b),m=this.rules.other.fencesBeginRegex(b),z=this.rules.other.headingBeginRegex(b),C=this.rules.other.htmlBeginRegex(b);for(;e;){const E=e.split(` +`,1)[0];let I;if(p=E,this.options.pedantic?(p=p.replace(this.rules.other.listReplaceNesting," "),I=p):I=p.replace(this.rules.other.tabCharGlobal," "),m.test(p)||z.test(p)||C.test(p)||w.test(p)||v.test(p))break;if(I.search(this.rules.other.nonSpaceChar)>=b||!p.trim())d+=` +`+I.slice(b);else{if(f||h.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||m.test(h)||z.test(h)||v.test(h))break;d+=` +`+p}!f&&!p.trim()&&(f=!0),u+=E+` +`,e=e.substring(E.length+1),h=I.slice(b)}}i.loose||(o?i.loose=!0:this.rules.other.doubleBlankLine.test(u)&&(o=!0));let g=null,y;this.options.gfm&&(g=this.rules.other.listIsTask.exec(d),g&&(y=g[0]!=="[ ] ",d=d.replace(this.rules.other.listReplaceTask,""))),i.items.push({type:"list_item",raw:u,task:!!g,checked:y,loose:!1,text:d,tokens:[]}),i.raw+=u}const l=i.items.at(-1);if(l)l.raw=l.raw.trimEnd(),l.text=l.text.trimEnd();else return;i.raw=i.raw.trimEnd();for(let c=0;ch.type==="space"),d=u.length>0&&u.some(h=>this.rules.other.anyLine.test(h.raw));i.loose=d}if(i.loose)for(let c=0;c({text:c,tokens:this.lexer.inline(c),header:!1,align:a.align[u]})));return a}}lheading(e){const t=this.rules.block.lheading.exec(e);if(t)return{type:"heading",raw:t[0],depth:t[2].charAt(0)==="="?1:2,text:t[1],tokens:this.lexer.inline(t[1])}}paragraph(e){const t=this.rules.block.paragraph.exec(e);if(t){const n=t[1].charAt(t[1].length-1)===` +`?t[1].slice(0,-1):t[1];return{type:"paragraph",raw:t[0],text:n,tokens:this.lexer.inline(n)}}}text(e){const t=this.rules.block.text.exec(e);if(t)return{type:"text",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){const t=this.rules.inline.escape.exec(e);if(t)return{type:"escape",raw:t[0],text:t[1]}}tag(e){const t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){const t=this.rules.inline.link.exec(e);if(t){const n=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(n)){if(!this.rules.other.endAngleBracket.test(n))return;const a=Ng(n.slice(0,-1),"\\");if((n.length-a.length)%2===0)return}else{const a=Xee(t[2],"()");if(a===-2)return;if(a>-1){const l=(t[0].indexOf("!")===0?5:4)+t[1].length+a;t[2]=t[2].substring(0,a),t[0]=t[0].substring(0,l).trim(),t[3]=""}}let r=t[2],i="";if(this.options.pedantic){const a=this.rules.other.pedanticHrefTitle.exec(r);a&&(r=a[1],i=a[3])}else i=t[3]?t[3].slice(1,-1):"";return r=r.trim(),this.rules.other.startAngleBracket.test(r)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?r=r.slice(1):r=r.slice(1,-1)),rN(t,{href:r&&r.replace(this.rules.inline.anyPunctuation,"$1"),title:i&&i.replace(this.rules.inline.anyPunctuation,"$1")},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){const r=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal," "),i=t[r.toLowerCase()];if(!i){const a=n[0].charAt(0);return{type:"text",raw:a,text:a}}return rN(n,i,n[0],this.lexer,this.rules)}}emStrong(e,t,n=""){let r=this.rules.inline.emStrongLDelim.exec(e);if(!r||r[3]&&n.match(this.rules.other.unicodeAlphaNumeric))return;if(!(r[1]||r[2]||"")||!n||this.rules.inline.punctuation.exec(n)){const a=[...r[0]].length-1;let o,l,c=a,u=0;const d=r[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(d.lastIndex=0,t=t.slice(-1*e.length+a);(r=d.exec(t))!=null;){if(o=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!o)continue;if(l=[...o].length,r[3]||r[4]){c+=l;continue}else if((r[5]||r[6])&&a%3&&!((a+l)%3)){u+=l;continue}if(c-=l,c>0)continue;l=Math.min(l,l+c+u);const h=[...r[0]][0].length,p=e.slice(0,a+r.index+h+l);if(Math.min(a,l)%2){const b=p.slice(1,-1);return{type:"em",raw:p,text:b,tokens:this.lexer.inlineTokens(b)}}const f=p.slice(2,-2);return{type:"strong",raw:p,text:f,tokens:this.lexer.inlineTokens(f)}}}}codespan(e){const t=this.rules.inline.code.exec(e);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal," ");const r=this.rules.other.nonSpaceChar.test(n),i=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return r&&i&&(n=n.substring(1,n.length-1)),{type:"codespan",raw:t[0],text:n}}}br(e){const t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}del(e){const t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}autolink(e){const t=this.rules.inline.autolink.exec(e);if(t){let n,r;return t[2]==="@"?(n=t[1],r="mailto:"+n):(n=t[1],r=n),{type:"link",raw:t[0],text:n,href:r,tokens:[{type:"text",raw:n,text:n}]}}}url(e){var n;let t;if(t=this.rules.inline.url.exec(e)){let r,i;if(t[2]==="@")r=t[0],i="mailto:"+r;else{let a;do a=t[0],t[0]=((n=this.rules.inline._backpedal.exec(t[0]))==null?void 0:n[0])??"";while(a!==t[0]);r=t[0],t[1]==="www."?i="http://"+t[0]:i=t[0]}return{type:"link",raw:t[0],text:r,href:i,tokens:[{type:"text",raw:r,text:r}]}}}inlineText(e){const t=this.rules.inline.text.exec(e);if(t){const n=this.lexer.state.inRawBlock;return{type:"text",raw:t[0],text:t[0],escaped:n}}}},R0=class z${constructor(t){Mn(this,"tokens");Mn(this,"options");Mn(this,"state");Mn(this,"tokenizer");Mn(this,"inlineQueue");this.tokens=[],this.tokens.links=Object.create(null),this.options=t||of,this.options.tokenizer=this.options.tokenizer||new Vv,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};const n={other:ul,block:j1.normal,inline:Cg.normal};this.options.pedantic?(n.block=j1.pedantic,n.inline=Cg.pedantic):this.options.gfm&&(n.block=j1.gfm,this.options.breaks?n.inline=Cg.breaks:n.inline=Cg.gfm),this.tokenizer.rules=n}static get rules(){return{block:j1,inline:Cg}}static lex(t,n){return new z$(n).lex(t)}static lexInline(t,n){return new z$(n).inlineTokens(t)}lex(t){t=t.replace(ul.carriageReturn,` +`),this.blockTokens(t,this.tokens);for(let n=0;n(l=u.call({lexer:this},t,n))?(t=t.substring(l.raw.length),n.push(l),!0):!1))continue;if(l=this.tokenizer.space(t)){t=t.substring(l.raw.length);const u=n.at(-1);l.raw.length===1&&u!==void 0?u.raw+=` +`:n.push(l);continue}if(l=this.tokenizer.code(t)){t=t.substring(l.raw.length);const u=n.at(-1);(u==null?void 0:u.type)==="paragraph"||(u==null?void 0:u.type)==="text"?(u.raw+=` +`+l.raw,u.text+=` +`+l.text,this.inlineQueue.at(-1).src=u.text):n.push(l);continue}if(l=this.tokenizer.fences(t)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.heading(t)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.hr(t)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.blockquote(t)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.list(t)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.html(t)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.def(t)){t=t.substring(l.raw.length);const u=n.at(-1);(u==null?void 0:u.type)==="paragraph"||(u==null?void 0:u.type)==="text"?(u.raw+=` +`+l.raw,u.text+=` +`+l.raw,this.inlineQueue.at(-1).src=u.text):this.tokens.links[l.tag]||(this.tokens.links[l.tag]={href:l.href,title:l.title});continue}if(l=this.tokenizer.table(t)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.lheading(t)){t=t.substring(l.raw.length),n.push(l);continue}let c=t;if((o=this.options.extensions)!=null&&o.startBlock){let u=1/0;const d=t.slice(1);let h;this.options.extensions.startBlock.forEach(p=>{h=p.call({lexer:this},d),typeof h=="number"&&h>=0&&(u=Math.min(u,h))}),u<1/0&&u>=0&&(c=t.substring(0,u+1))}if(this.state.top&&(l=this.tokenizer.paragraph(c))){const u=n.at(-1);r&&(u==null?void 0:u.type)==="paragraph"?(u.raw+=` +`+l.raw,u.text+=` +`+l.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=u.text):n.push(l),r=c.length!==t.length,t=t.substring(l.raw.length);continue}if(l=this.tokenizer.text(t)){t=t.substring(l.raw.length);const u=n.at(-1);(u==null?void 0:u.type)==="text"?(u.raw+=` +`+l.raw,u.text+=` +`+l.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=u.text):n.push(l);continue}if(t){const u="Infinite loop on byte: "+t.charCodeAt(0);if(this.options.silent){console.error(u);break}else throw new Error(u)}}return this.state.top=!0,n}inline(t,n=[]){return this.inlineQueue.push({src:t,tokens:n}),n}inlineTokens(t,n=[]){var l,c,u;let r=t,i=null;if(this.tokens.links){const d=Object.keys(this.tokens.links);if(d.length>0)for(;(i=this.tokenizer.rules.inline.reflinkSearch.exec(r))!=null;)d.includes(i[0].slice(i[0].lastIndexOf("[")+1,-1))&&(r=r.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+r.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(i=this.tokenizer.rules.inline.anyPunctuation.exec(r))!=null;)r=r.slice(0,i.index)+"++"+r.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);for(;(i=this.tokenizer.rules.inline.blockSkip.exec(r))!=null;)r=r.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+r.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);let a=!1,o="";for(;t;){a||(o=""),a=!1;let d;if((c=(l=this.options.extensions)==null?void 0:l.inline)!=null&&c.some(p=>(d=p.call({lexer:this},t,n))?(t=t.substring(d.raw.length),n.push(d),!0):!1))continue;if(d=this.tokenizer.escape(t)){t=t.substring(d.raw.length),n.push(d);continue}if(d=this.tokenizer.tag(t)){t=t.substring(d.raw.length),n.push(d);continue}if(d=this.tokenizer.link(t)){t=t.substring(d.raw.length),n.push(d);continue}if(d=this.tokenizer.reflink(t,this.tokens.links)){t=t.substring(d.raw.length);const p=n.at(-1);d.type==="text"&&(p==null?void 0:p.type)==="text"?(p.raw+=d.raw,p.text+=d.text):n.push(d);continue}if(d=this.tokenizer.emStrong(t,r,o)){t=t.substring(d.raw.length),n.push(d);continue}if(d=this.tokenizer.codespan(t)){t=t.substring(d.raw.length),n.push(d);continue}if(d=this.tokenizer.br(t)){t=t.substring(d.raw.length),n.push(d);continue}if(d=this.tokenizer.del(t)){t=t.substring(d.raw.length),n.push(d);continue}if(d=this.tokenizer.autolink(t)){t=t.substring(d.raw.length),n.push(d);continue}if(!this.state.inLink&&(d=this.tokenizer.url(t))){t=t.substring(d.raw.length),n.push(d);continue}let h=t;if((u=this.options.extensions)!=null&&u.startInline){let p=1/0;const f=t.slice(1);let b;this.options.extensions.startInline.forEach(g=>{b=g.call({lexer:this},f),typeof b=="number"&&b>=0&&(p=Math.min(p,b))}),p<1/0&&p>=0&&(h=t.substring(0,p+1))}if(d=this.tokenizer.inlineText(h)){t=t.substring(d.raw.length),d.raw.slice(-1)!=="_"&&(o=d.raw.slice(-1)),a=!0;const p=n.at(-1);(p==null?void 0:p.type)==="text"?(p.raw+=d.raw,p.text+=d.text):n.push(d);continue}if(t){const p="Infinite loop on byte: "+t.charCodeAt(0);if(this.options.silent){console.error(p);break}else throw new Error(p)}}return n}},Hv=class{constructor(e){Mn(this,"options");Mn(this,"parser");this.options=e||of}space(e){return""}code({text:e,lang:t,escaped:n}){var a;const r=(a=(t||"").match(ul.notSpaceStart))==null?void 0:a[0],i=e.replace(ul.endingNewline,"")+` +`;return r?'
'+(n?i:Vd(i,!0))+`
+`:"
"+(n?i:Vd(i,!0))+`
+`}blockquote({tokens:e}){return`
+${this.parser.parse(e)}
+`}html({text:e}){return e}heading({tokens:e,depth:t}){return`${this.parser.parseInline(e)} +`}hr(e){return`
+`}list(e){const t=e.ordered,n=e.start;let r="";for(let o=0;o +`+r+" +`}listitem(e){var n;let t="";if(e.task){const r=this.checkbox({checked:!!e.checked});e.loose?((n=e.tokens[0])==null?void 0:n.type)==="paragraph"?(e.tokens[0].text=r+" "+e.tokens[0].text,e.tokens[0].tokens&&e.tokens[0].tokens.length>0&&e.tokens[0].tokens[0].type==="text"&&(e.tokens[0].tokens[0].text=r+" "+Vd(e.tokens[0].tokens[0].text),e.tokens[0].tokens[0].escaped=!0)):e.tokens.unshift({type:"text",raw:r+" ",text:r+" ",escaped:!0}):t+=r+" "}return t+=this.parser.parse(e.tokens,!!e.loose),`
  • ${t}
  • +`}checkbox({checked:e}){return"'}paragraph({tokens:e}){return`

    ${this.parser.parseInline(e)}

    +`}table(e){let t="",n="";for(let i=0;i${r}`),` + +`+t+` +`+r+`
    +`}tablerow({text:e}){return` +${e} +`}tablecell(e){const t=this.parser.parseInline(e.tokens),n=e.header?"th":"td";return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+t+` +`}strong({tokens:e}){return`${this.parser.parseInline(e)}`}em({tokens:e}){return`${this.parser.parseInline(e)}`}codespan({text:e}){return`${Vd(e,!0)}`}br(e){return"
    "}del({tokens:e}){return`${this.parser.parseInline(e)}`}link({href:e,title:t,tokens:n}){const r=this.parser.parseInline(n),i=tN(e);if(i===null)return r;e=i;let a='
    ",a}image({href:e,title:t,text:n,tokens:r}){r&&(n=this.parser.parseInline(r,this.parser.textRenderer));const i=tN(e);if(i===null)return Vd(n);e=i;let a=`${n}{const c=o[l].flat(1/0);n=n.concat(this.walkTokens(c,t))}):o.tokens&&(n=n.concat(this.walkTokens(o.tokens,t)))}}return n}use(...e){const t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{const r={...n};if(r.async=this.defaults.async||r.async||!1,n.extensions&&(n.extensions.forEach(i=>{if(!i.name)throw new Error("extension name required");if("renderer"in i){const a=t.renderers[i.name];a?t.renderers[i.name]=function(...o){let l=i.renderer.apply(this,o);return l===!1&&(l=a.apply(this,o)),l}:t.renderers[i.name]=i.renderer}if("tokenizer"in i){if(!i.level||i.level!=="block"&&i.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");const a=t[i.level];a?a.unshift(i.tokenizer):t[i.level]=[i.tokenizer],i.start&&(i.level==="block"?t.startBlock?t.startBlock.push(i.start):t.startBlock=[i.start]:i.level==="inline"&&(t.startInline?t.startInline.push(i.start):t.startInline=[i.start]))}"childTokens"in i&&i.childTokens&&(t.childTokens[i.name]=i.childTokens)}),r.extensions=t),n.renderer){const i=this.defaults.renderer||new Hv(this.defaults);for(const a in n.renderer){if(!(a in i))throw new Error(`renderer '${a}' does not exist`);if(["options","parser"].includes(a))continue;const o=a,l=n.renderer[o],c=i[o];i[o]=(...u)=>{let d=l.apply(i,u);return d===!1&&(d=c.apply(i,u)),d||""}}r.renderer=i}if(n.tokenizer){const i=this.defaults.tokenizer||new Vv(this.defaults);for(const a in n.tokenizer){if(!(a in i))throw new Error(`tokenizer '${a}' does not exist`);if(["options","rules","lexer"].includes(a))continue;const o=a,l=n.tokenizer[o],c=i[o];i[o]=(...u)=>{let d=l.apply(i,u);return d===!1&&(d=c.apply(i,u)),d}}r.tokenizer=i}if(n.hooks){const i=this.defaults.hooks||new mv;for(const a in n.hooks){if(!(a in i))throw new Error(`hook '${a}' does not exist`);if(["options","block"].includes(a))continue;const o=a,l=n.hooks[o],c=i[o];mv.passThroughHooks.has(a)?i[o]=u=>{if(this.defaults.async)return Promise.resolve(l.call(i,u)).then(h=>c.call(i,h));const d=l.call(i,u);return c.call(i,d)}:i[o]=(...u)=>{let d=l.apply(i,u);return d===!1&&(d=c.apply(i,u)),d}}r.hooks=i}if(n.walkTokens){const i=this.defaults.walkTokens,a=n.walkTokens;r.walkTokens=function(o){let l=[];return l.push(a.call(this,o)),i&&(l=l.concat(i.call(this,o))),l}}this.defaults={...this.defaults,...r}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return R0.lex(e,t??this.defaults)}parser(e,t){return P0.parse(e,t??this.defaults)}parseMarkdown(e){return(n,r)=>{const i={...r},a={...this.defaults,...i},o=this.onError(!!a.silent,!!a.async);if(this.defaults.async===!0&&i.async===!1)return o(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof n>"u"||n===null)return o(new Error("marked(): input parameter is undefined or null"));if(typeof n!="string")return o(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(n)+", string expected"));a.hooks&&(a.hooks.options=a,a.hooks.block=e);const l=a.hooks?a.hooks.provideLexer():e?R0.lex:R0.lexInline,c=a.hooks?a.hooks.provideParser():e?P0.parse:P0.parseInline;if(a.async)return Promise.resolve(a.hooks?a.hooks.preprocess(n):n).then(u=>l(u,a)).then(u=>a.hooks?a.hooks.processAllTokens(u):u).then(u=>a.walkTokens?Promise.all(this.walkTokens(u,a.walkTokens)).then(()=>u):u).then(u=>c(u,a)).then(u=>a.hooks?a.hooks.postprocess(u):u).catch(o);try{a.hooks&&(n=a.hooks.preprocess(n));let u=l(n,a);a.hooks&&(u=a.hooks.processAllTokens(u)),a.walkTokens&&this.walkTokens(u,a.walkTokens);let d=c(u,a);return a.hooks&&(d=a.hooks.postprocess(d)),d}catch(u){return o(u)}}}onError(e,t){return n=>{if(n.message+=` +Please report this to https://github.com/markedjs/marked.`,e){const r="

    An error occurred:

    "+Vd(n.message+"",!0)+"
    ";return t?Promise.resolve(r):r}if(t)return Promise.reject(n);throw n}}},Hp=new Jee;function yi(e,t){return Hp.parse(e,t)}yi.options=yi.setOptions=function(e){return Hp.setOptions(e),yi.defaults=Hp.defaults,a9(yi.defaults),yi};yi.getDefaults=n4;yi.defaults=of;yi.use=function(...e){return Hp.use(...e),yi.defaults=Hp.defaults,a9(yi.defaults),yi};yi.walkTokens=function(e,t){return Hp.walkTokens(e,t)};yi.parseInline=Hp.parseInline;yi.Parser=P0;yi.parser=P0.parse;yi.Renderer=Hv;yi.TextRenderer=u4;yi.Lexer=R0;yi.lexer=R0.lex;yi.Tokenizer=Vv;yi.Hooks=mv;yi.parse=yi;yi.options;yi.setOptions;yi.use;yi.walkTokens;yi.parseInline;P0.parse;R0.lex;const Zee=new URL(""+new URL("gemini-color-BRjDr-0b.webp",import.meta.url).href,import.meta.url).href,Qee=new URL(""+new URL("openai-DM5htlBi.webp",import.meta.url).href,import.meta.url).href,ete=new URL(""+new URL("openai bai-C9wdsUvK.webp",import.meta.url).href,import.meta.url).href,tte=new URL(""+new URL("deepseek-color-XniBTJPh.webp",import.meta.url).href,import.meta.url).href,nte=new URL("data:image/webp;base64,UklGRmYIAABXRUJQVlA4WAoAAAAQAAAAfwIAfwIAQUxQSCIBAAABgBvbturmZj9TA5rfjczMVMVryJQqcmtuQPkR44qICSj+53/+53/+53/+53/+53/+53/+53/+53/+53/+53/iHK+7fxafybr7n//4j//4j//4j//4j//4j//477C3QerH8nU9SF39VOr98jWqVP7jP/7jP/7jP/7jP/7jP/7bK9elPi9fZ13q7Olm7oT/+Z//+Z//+Z//+Z//+Z//+Z9CxzN3/fU3c2vmrr9q4eU//uM//uM//uM//uM//uM//tst1lJ/c1rqZ05beHN+W2rOb0tdfGLfcir1PqcW3py3Ss15qyWb//iP//iP//iP//iP//iP/yiof4qNGT7FLj5PsX3MU2y/bPE///M///M///M///M///M///M///M//x8wCVZQOCAeBwAA0IAAnQEqgAKAAj4ZCoNBoQR/mgQAYSzt3C7pyb/APfkjv/gH4b8K7vf8H/C39wv7ps5k3/rAvlf4m/wD34fwD8IP3/7AD+gfkB/AO7j5gP5X/AP419f////NP+q/wDrAP0A6wD0AP4B/FvW9/s38w/gH7//E56lP8Z/6P5/7NX5E+QACFLUcSkmo4lJNRxKSajiUk1HEpJqOJSTUcSkmo4lJNRxKSajiUk1HEpJqOJSTUcSkmo4lJNRxKSajiUk1HEpJqOJSTUcSkmo4lJNRxKSajiUk1HEpJqOJSTUcSkmo4lJNRxKSajiUk1HEpJqOJSTUcSkmo4lJNRxKSajiUk1HEpJqOJSTUcSkmo4lJNRxKSajiUk1CbsLpnr+IAdcFjX8QA64LGv4gB1wWNfxADrgsa/iAHXBY1/DLEAkmoUzdjm82g8Skmo4lJNRwsAc95tBUzdjm82g8Skmo4lJNRwsAc95tBUzdjm82g8Skmo4lJNRwsAc95tBUzdjm82g8Skmo4lJNRwsAc95tBUzdi4adUR8+tnQSajiUk1CwEqiQXs6UpC0PWIBJNQpm7FqjLi2I7HN5tB1wfO2b0GnrABz3m0FTN2LZfwBz3m0HiUi53BjesP/0WzpGo1phpFii1zjUcSkmo12S8OnAh8gDnvNoKmbsWzFjgRAJJqOJQ0G+HTgQ+QBz1Gv1/EAOtRPUWy/HTWpZSgPznoaug8SklWlYSO0b6YtiN0dlNwg0iuCx010jUcSkmo4lJNRxKSajiUk1HEpJqOJSTUcSkmo4lJNRxKSajiUk1HEpJqOJSTUcSkmo4lJNRxKSajiUk1HEpJqOJSTUcSkmoTdhdM9fwyxAJJqOJSTUcSkmo4lCN3/WFjX8QLF//RbOkajiUk1HEpJqOJSLFKroPEfRbOkajiUk1HEpJqOJSLFKroPEfRbOkajiUk1HEpJqOJSLFKroPEfRbOkajiUk1HEpJqOJSLFKroPEedfiHcMaxatCvy8/afNkIGsB1wWNfxADrgsa7MfISiJRl9fc0KUfO0yYaSajiULWga4+tA1zjUcShayY5PsGHc7gynEpJqOI+i1gAU9GwBz3m0FTMiL0Mi5CDfEUcSkmo4WANuX8Abcw0k1HCwAu10mwTfqSx4/gCSajWmF9FVML6LZ0jUa0v7+i3WsmOT7boPEpJqEb673hBXBXX5dwreX9WUdzjUcShJvSx1A51q1iWaVJmy95toPU9nSNRxKSajiUk1HEpJqOJSTUcSkmo4lJNRxKSajiUk1HEpJqOJSTUcSkmo4lJNRxKSajiUk1HEpJqOJSTUcSkmo4lJNRxKSajiUk1HEpJqOJSTUcSkmo4lJNRxKSajiUk1HEpJqOJSTUcSkmo4UAAD+/oF4AAAAAAAAAAAAAAAJb+ffGzCcbnEmRIhjaT/ansphF96UrDjVEos/+hFZidhdUF3O53O53O53O53O53O53O53O53O53O53O53O53Xim2skOKCsoC+BBWUBfAgrKAvgQVlAXwIKygL4EFZQF8CCsoC+BpEGAAAAAATRybtu0e6OC7rOdh95gBBJkqivHU2Xbd3U7WigHfCm6XwBuEgAh2XOITw1fgPQN+csk6BX99X1lU6KDFbSaDz8FG87+remv9IEjr85MQxi1qP+0N4UL/fLJref/pQ0csi+b41VOoH28Q1omOQHUIb7WkgBDrf7Mp6WASwF5kiDQ94rLMILIOP7zd3swzi5u5EHY8Y1/nzfZhONziTIkQxtJ/tT2AJWryHidMeMS1f/QisxQF+J9To1r9MNXvkNT4eBrJzzlgh0yM68UeycNkYZtMb6rVN7C3+dDpyz+YO/bKLVW+eZ3QYjjfbfvNMjsmycZJS7WND7baSBjJxrGx1TA/zh3Mnl6HPdtDnY3h+2hmj8SW4IJNJ1UaX65aYzlacWCnz9A5MXIbM/yVCemHCOVVVNZCBXOUXuFxgUh7DAAAAAAxfnL7///p/UZrtEzp4UNwFN/9yI+zXaJnTwobgAAAAAAAAh72OrjvKzBSwow7BJeuA1nR9loyqBe/+5EfZrtEzp4UPow1OeyRzo+y0ZVAvf/ciPs12iZ08KG8jvuN+qYec1YiwGYbD//7opDvuL1qFDHchnMJXcOMjf/7opDqMNASvIsAAdg4B9DgL8cArznz3IP1r90QXIWyWtGI20FlWEPvXK06mvkoRbxt+IiTZ4ftvPzl7I50f6JNy1daZhnwOg0uAgqW0/vfFRJ5+x1QPw2tT1MJ4xLU+csKyTsVBzBxVyLmIO+6Hh4gTHwz8J1M2I8ZV0caW3oAUXPhgZu7micghRJTPRjdyJRzUOsUHplELGtdQUhCgg/ywhvdfp5X2//JM9bBCZQxpbegBRc+GBm7uaJyCFElM9GN3IlHNQ6xQeMAAAAAAAAAAAAAAAA==",import.meta.url).href,rte=new URL(""+new URL("moonshot-Cy56VaSZ.webp",import.meta.url).href,import.meta.url).href,ste=new URL(""+new URL("moonshot baise-CDuFHouK.webp",import.meta.url).href,import.meta.url).href,ite=new URL(""+new URL("grok-DEnnqgaa.webp",import.meta.url).href,import.meta.url).href,ate=new URL(""+new URL("grok bai-CiCMAJ0q.webp",import.meta.url).href,import.meta.url).href,ote=new URL(""+new URL("minimax-color-Dx2mFylD.webp",import.meta.url).href,import.meta.url).href,lte=new URL(""+new URL("zhipu-color-PY4a2Lc6.webp",import.meta.url).href,import.meta.url).href,cte=new URL(""+new URL("doubao-color-BfZ9o9VO.webp",import.meta.url).href,import.meta.url).href;function x9(e,t){const n=(e||"").toLowerCase();return["gemini-3-pro","gemini-3.1-pro","gemini-3-flash-thinking","gemini-3.1-flash-lite-preview"].includes(n)?Zee:["gpt-5-1","gpt-5-2","gpt-5-3-codex","gpt-4o","gpt-5.4","gpt-5.4-pro"].includes(n)?t?ete:Qee:n==="deepseek-v3-1-250821-thinking"?tte:["claude-opus-4-5","claude-opus-4-6"].includes(n)?nte:n==="kimi-k2.5"?t?ste:rte:["grok-4","grok-4-fast-non-reasoning"].includes(n)?t?ate:ite:n==="minimax-m2.5-highspeed"||n==="minimax-m2.7"?ote:n==="glm-5-turbo"?lte:n==="doubao-seed-2-0-pro-260215"||n.includes("doubao-seed")?cte:null}yi.setOptions({breaks:!0,gfm:!0});const sN=280,iN=320,aN=720,oN=.88,lN="chatPanelFloatBounds";function cN(){return typeof window>"u"?{x:200,y:80,w:380,h:520}:{x:Math.max(0,window.innerWidth-400),y:80,w:380,h:Math.min(520,window.innerHeight*.7)}}const G2=300*1024,q2=100*1024,ute=50*1024*1024,dte=e=>{try{return yi.parse(e)}catch{return e}},uN=e=>{const t=e.includes(",")?e.split(",")[1].length:e.length;return Math.floor(t*.75)},hte=async e=>new Promise((t,n)=>{const r=new Image,i=URL.createObjectURL(e);r.onload=()=>{try{let{width:o,height:l}=r;if(o>1920||l>1920){const g=Math.min(1920/o,1920/l);o=Math.round(o*g),l=Math.round(l*g)}const c=document.createElement("canvas");c.width=o,c.height=l;const u=c.getContext("2d");if(!u){URL.revokeObjectURL(i),n(new Error("Canvas context 获取失败"));return}u.drawImage(r,0,0,o,l);let d=.9,h=c.toDataURL("image/jpeg",d),p=uN(h);if(p<=G2&&p>=q2){URL.revokeObjectURL(i),t(h);return}const f=(q2+G2)/2;let b=0;for(;b<6;){if(b+=1,p>G2&&d>.5)d-=.1;else if(p{URL.revokeObjectURL(i),n(new Error("图片加载失败"))},r.src=i}),pte={small:12,medium:14,large:16};function dN(e,t){return x9(e,t)}const d4=({isOpen:e,onClose:t,floating:n=!1,onSwitchToSidebar:r,onSwitchToFloating:i,isDark:a,chatWidth:o,chatFontSize:l="medium",onSetChatFontSize:c,chatModel:u,chatInput:d,chatFiles:h,chatSessions:p,currentChatId:f,isChatSending:b,historyMessageCount:g,onSetChatModel:y,onSetChatInput:w,onSetChatFiles:v,onSetCurrentChatId:m,onSetHistoryMessageCount:z,onCreateNewChat:C,onDeleteChatSession:E,onRenameChatSession:I,onSendChatMessage:R,onChatResizeStart:A,apiConfigs:O=[],chatSkillMode:F=!1,onSetChatSkillMode:L,sessionsForCurrentMode:X=[],onOpenSkillToWorkflow:T})=>{const[q,H]=_.useState(!1),[J,Z]=_.useState(80),B=_.useRef(null),[V,N]=_.useState({atTop:!0,atBottom:!0,canScroll:!1}),[j,k]=_.useState([]),[W,M]=_.useState({open:!1,x:0,y:0,targetMessageId:null}),[Y,se]=_.useState(null),[ie,oe]=_.useState("");_.useEffect(()=>{if(!Y)return;const Ie=Pe=>{Pe.key==="Escape"&&se(null)};return window.addEventListener("keydown",Ie),()=>window.removeEventListener("keydown",Ie)},[Y]);const[re,ee]=_.useState(!1),pe=_.useRef(0),we=_.useRef(0),Q=_.useCallback(()=>{try{const Ie=localStorage.getItem(lN);if(Ie){const Pe=JSON.parse(Ie);if((Pe==null?void 0:Pe.x)!=null&&(Pe==null?void 0:Pe.y)!=null&&(Pe==null?void 0:Pe.w)!=null&&(Pe==null?void 0:Pe.h)!=null)return{x:Math.max(0,Pe.x),y:Math.max(0,Pe.y),w:Math.min(aN,Math.max(sN,Pe.w)),h:Math.min(typeof window<"u"?window.innerHeight*oN:600,Math.max(iN,Pe.h))}}}catch{}return cN()},[]),[me,ue]=_.useState(cN);_.useEffect(()=>{ue(Q())},[Q]);const U=_.useRef(null),G=_.useRef(null),te=_.useRef(null),ge=_.useCallback(Ie=>{try{localStorage.setItem(lN,JSON.stringify(Ie))}catch{}},[]),ne=_.useCallback(Ie=>{if(!n||Ie.target.closest("button")||Ie.target.closest("select"))return;Ie.preventDefault();const Pe=G.current;if(!Pe)return;U.current={startX:me.x,startY:me.y,mouseX:Ie.clientX,mouseY:Ie.clientY};const Te=He=>{const Je=U.current;if(!Je||!Pe)return;const Me=He.clientX-Je.mouseX,Re=He.clientY-Je.mouseY,Ve=me.w,Ze=me.h,je=typeof window<"u"?window.innerWidth-Ve:9999,Le=typeof window<"u"?window.innerHeight-Ze:9999,Xe=Math.max(0,Math.min(je,Je.startX+Me)),qe=Math.max(0,Math.min(Le,Je.startY+Re));Pe.style.left=`${Xe}px`,Pe.style.top=`${qe}px`},Be=()=>{if(!U.current||!Pe)return;const He=parseFloat(Pe.style.left),Je=parseFloat(Pe.style.top);if(Pe.style.left="",Pe.style.top="",U.current=null,document.removeEventListener("mousemove",Te),document.removeEventListener("mouseup",Be),!Number.isNaN(He)&&!Number.isNaN(Je)){const Me=me.w,Re=me.h,Ve=typeof window<"u"?window.innerWidth-Me:9999,Ze=typeof window<"u"?window.innerHeight-Re:9999,je=Math.max(0,Math.min(Ve,He)),Le=Math.max(0,Math.min(Ze,Je));ue(Xe=>{const qe={...Xe,x:je,y:Le};return ge(qe),qe})}};document.addEventListener("mousemove",Te),document.addEventListener("mouseup",Be)},[n,me,ge]),le=_.useCallback((Ie,Pe)=>{if(!n)return;Ie.preventDefault(),Ie.stopPropagation();const Te={edge:Pe,startX:Ie.clientX,startY:Ie.clientY,w:me.w,h:me.h};te.current=Te;const Be=Je=>{const Me=te.current;if(!Me)return;const Re=Je.clientX-Me.startX,Ve=Je.clientY-Me.startY;let Ze=Me.w,je=Me.h;Me.edge.includes("e")&&(Ze=Math.max(sN,Math.min(aN,Me.w+Re))),Me.edge.includes("s")&&(je=Math.max(iN,Math.min(typeof window<"u"?window.innerHeight*oN:800,Me.h+Ve))),ue(Le=>({...Le,w:Ze,h:je}))},He=()=>{te.current=null,document.removeEventListener("mousemove",Be),document.removeEventListener("mouseup",He),ue(Je=>(ge(Je),Je))};document.addEventListener("mousemove",Be),document.addEventListener("mouseup",He)},[n,me,ge]),fe=_.useCallback(Ie=>{Ie.preventDefault(),Ie.stopPropagation(),ee(!0),pe.current=Ie.clientY,we.current=J},[J]);_.useEffect(()=>{if(!re)return;const Ie=Te=>{const Be=pe.current-Te.clientY,He=Math.max(60,Math.min(300,we.current+Be));Z(He)},Pe=()=>{ee(!1)};return window.addEventListener("mousemove",Ie),window.addEventListener("mouseup",Pe),()=>{window.removeEventListener("mousemove",Ie),window.removeEventListener("mouseup",Pe)}},[re]);const be=_.useCallback(()=>{const Ie=B.current;if(!Ie)return;const{scrollTop:Pe,scrollHeight:Te,clientHeight:Be}=Ie,He=Te>Be+2,Je=Pe<10,Me=Pe+Be>=Te-10;N(Re=>Re.atTop===Je&&Re.atBottom===Me&&Re.canScroll===He?Re:{atTop:Je,atBottom:Me,canScroll:He})},[]);_.useEffect(()=>{const Ie=B.current;if(!Ie)return;be(),Ie.addEventListener("scroll",be);const Pe=new ResizeObserver(be);return Pe.observe(Ie),()=>{Ie.removeEventListener("scroll",be),Pe.disconnect()}},[be,f,p]);const de=_.useCallback(Ie=>{Ie.preventDefault(),Ie.stopPropagation();const Pe=B.current;if(!Pe)return;const Te=Pe.firstElementChild;Te?Te.scrollIntoView({block:"start",behavior:"auto"}):Pe.scrollTop=0},[]),$e=_.useCallback(Ie=>{Ie.preventDefault(),Ie.stopPropagation();const Pe=B.current;if(!Pe)return;const Te=Pe.lastElementChild;Te?Te.scrollIntoView({block:"end",behavior:"auto"}):Pe.scrollTop=Pe.scrollHeight-Pe.clientHeight},[]),ze=p.find(Ie=>Ie.id===f),_e=j.length,Ee=_.useCallback(()=>{M({open:!1,x:0,y:0,targetMessageId:null})},[]),Ce=_.useCallback((Ie,Pe)=>{Ie.preventDefault(),Ie.stopPropagation(),k(Te=>Te.includes(Pe)?Te:[...Te,Pe]),M({open:!0,x:Ie.clientX,y:Ie.clientY,targetMessageId:Pe})},[]),xe=_.useCallback(()=>{const Ie=W.targetMessageId;Ie&&(k(Pe=>Pe.includes(Ie)?Pe.filter(Te=>Te!==Ie):[...Pe,Ie]),Ee())},[W.targetMessageId,Ee]),Ne=_.useCallback(()=>{k([]),Ee()},[Ee]),ve=_.useCallback(()=>{if(!ze||j.length===0)return;const Ie=new Set(j),Pe=ze.messages.filter(He=>Ie.has(He.id));if(Pe.length===0){Ee();return}const Te=Pe.map(He=>`[${He.role==="user"?"用户":"助手"}] +${He.content||""}`).join(` + +`),Be=`${ze.title}-片段`;Ee(),oe(Be),se({name:Be,content:Te,afterSave:()=>{k([]),typeof window<"u"&&window.__toastSuccess?window.__toastSuccess(`已保存 ${Pe.length} 条消息到 Skill 库`):alert(`已保存 ${Pe.length} 条消息到 Skill 库`)}})},[ze,j,Ee]);if(_.useEffect(()=>{const Ie=()=>Ee(),Pe=Te=>{Te.key==="Escape"&&Ee()};return window.addEventListener("click",Ie),window.addEventListener("contextmenu",Ie),window.addEventListener("keydown",Pe),()=>{window.removeEventListener("click",Ie),window.removeEventListener("contextmenu",Ie),window.removeEventListener("keydown",Pe)}},[Ee]),_.useEffect(()=>{k([]),Ee()},[f,Ee]),!e)return null;const ke=`flex flex-col rounded-2xl border shadow-xl transition-colors duration-300 z-30 overflow-hidden ${a?"bg-[#121214] border-zinc-800":"bg-zinc-50 border-zinc-200"} ${n?"fixed":"absolute top-14 right-0 bottom-0 max-w-[90vw] rounded-r-none border-r border-t-0 border-b-0"}`;return s.jsxs("div",{ref:n?G:void 0,className:ke,style:n?{left:me.x,top:me.y,width:me.w,height:me.h}:{width:o},children:[!n&&s.jsx("div",{className:`absolute left-0 top-0 bottom-0 w-1.5 cursor-ew-resize transition-colors z-50 flex items-center justify-center group rounded-l-2xl ${a?"hover:bg-blue-600/50":"hover:bg-blue-400/30"}`,onMouseDown:A,children:s.jsx("div",{className:`h-8 w-1 rounded transition-colors ${a?"bg-zinc-700 group-hover:bg-blue-500":"bg-zinc-300 group-hover:bg-blue-500"}`})}),s.jsxs("div",{onMouseDown:ne,className:`p-3 border-b flex justify-between items-center shrink-0 rounded-t-2xl select-none ${n?"cursor-grab active:cursor-grabbing":""} ${a?"border-zinc-800":"border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("select",{value:u,onChange:Ie=>y(Ie.target.value),className:`text-[10px] px-2 py-1 rounded border outline-none ${a?"bg-zinc-800 border-zinc-700 text-zinc-300":"bg-white border-zinc-300 text-zinc-700"}`,children:O.filter(Ie=>Ie.type==="Chat").map(Ie=>s.jsx("option",{value:Ie.id,children:Ie.provider},Ie.id))}),s.jsxs("select",{value:g,onChange:Ie=>z(Number(Ie.target.value)),className:`text-[10px] px-2 py-1 rounded border outline-none ${a?"bg-zinc-800 border-zinc-700 text-zinc-300":"bg-white border-zinc-300 text-zinc-700"}`,title:"历史消息回读数量",children:[s.jsx("option",{value:3,children:"回读3条"}),s.jsx("option",{value:5,children:"回读5条"}),s.jsx("option",{value:10,children:"回读10条"}),s.jsx("option",{value:20,children:"回读20条"}),s.jsx("option",{value:50,children:"回读50条"}),s.jsx("option",{value:100,children:"回读100条"}),s.jsx("option",{value:150,children:"回读150条"}),s.jsx("option",{value:200,children:"回读200条"})]}),c&&s.jsxs("select",{value:l,onChange:Ie=>c(Ie.target.value),className:`text-[10px] px-2 py-1 rounded border outline-none ${a?"bg-zinc-800 border-zinc-700 text-zinc-300":"bg-white border-zinc-300 text-zinc-700"}`,title:"对话字体大小",children:[s.jsx("option",{value:"small",children:"小字"}),s.jsx("option",{value:"medium",children:"中字"}),s.jsx("option",{value:"large",children:"大字"})]}),L&&s.jsxs("div",{className:`flex flex-nowrap shrink-0 rounded border overflow-hidden ${a?"border-zinc-700":"border-zinc-300"}`,children:[s.jsx("button",{type:"button",onClick:()=>L(!1),className:`px-2 py-1 text-[10px] whitespace-nowrap transition-colors ${F?a?"bg-zinc-800 text-zinc-400 hover:bg-zinc-700":"bg-zinc-100 text-zinc-600 hover:bg-zinc-200":a?"bg-blue-600 text-white":"bg-blue-500 text-white"}`,title:"普通对话",children:"普通"}),s.jsxs("button",{type:"button",onClick:()=>L(!0),className:`px-2 py-1 text-[10px] flex items-center gap-0.5 whitespace-nowrap transition-colors ${F?a?"bg-amber-600 text-white":"bg-amber-500 text-white":a?"bg-zinc-800 text-zinc-400 hover:bg-zinc-700":"bg-zinc-100 text-zinc-600 hover:bg-zinc-200"}`,title:"Skill 制作:引导创建 Skill,可保存到本地供 Agent 节点使用",children:[s.jsx(bc,{size:10}),"Skill"]})]}),!1]}),s.jsxs("div",{className:"flex items-center gap-1",children:[s.jsx("button",{onClick:C,className:`p-1.5 rounded ${a?"text-zinc-400 hover:text-white hover:bg-zinc-800":"text-zinc-500 hover:text-zinc-900 hover:bg-zinc-100"}`,title:"新对话",children:s.jsx(Xi,{size:16})}),X.length>=1&&s.jsxs("div",{className:"relative",children:[s.jsx("button",{onClick:()=>H(!q),className:`p-1.5 rounded ${a?"text-zinc-400 hover:text-white hover:bg-zinc-800":"text-zinc-500 hover:text-zinc-900 hover:bg-zinc-100"}`,title:"历史对话",children:s.jsx(t$,{size:16})}),q&&s.jsx("div",{className:`absolute right-0 top-full mt-1 w-56 rounded-lg shadow-xl py-1 z-50 border ${a?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseLeave:()=>H(!1),children:X.map(Ie=>{const Pe=(Ie.mode??"normal")==="skill";return s.jsxs("div",{className:`flex items-center gap-1.5 px-3 py-2 text-xs ${f===Ie.id?a?"bg-zinc-800 text-white":"bg-zinc-100 text-zinc-900":a?"text-zinc-400 hover:bg-zinc-800/50":"text-zinc-500 hover:bg-zinc-100"}`,children:[s.jsxs("div",{className:"flex-1 min-w-0 flex items-center gap-1.5 cursor-pointer",onClick:()=>{m(Ie.id),H(!1)},children:[s.jsx("span",{className:`shrink-0 text-[9px] px-1.5 py-0.5 rounded ${Pe?a?"bg-amber-900/50 text-amber-400":"bg-amber-100 text-amber-700":a?"bg-zinc-700 text-zinc-400":"bg-zinc-200 text-zinc-600"}`,children:Pe?"Skill":"普通"}),s.jsx("span",{className:"truncate flex-1",children:Ie.title})]}),s.jsx("button",{onClick:Te=>{Te.stopPropagation();const Be=window.prompt("自定义对话名称:",Ie.title);Be!=null&&I&&I(Ie.id,Be.trim()||Ie.title)},className:`p-1 rounded shrink-0 ${a?"text-zinc-500 hover:text-zinc-300 hover:bg-zinc-700":"text-zinc-400 hover:text-zinc-600 hover:bg-zinc-200"}`,title:"重命名",children:s.jsx(vm,{size:10})}),s.jsx("button",{onClick:Te=>E(Te,Ie.id),className:`p-1 rounded shrink-0 ${a?"text-zinc-600 hover:text-red-500":"text-zinc-400 hover:text-red-500"}`,title:"删除",children:s.jsx(Qr,{size:10})})]},Ie.id)})})]}),!n&&i&&s.jsx("button",{type:"button",onClick:i,className:`p-1.5 rounded ${a?"text-zinc-400 hover:bg-zinc-700 hover:text-zinc-200":"text-zinc-500 hover:bg-zinc-200 hover:text-zinc-700"}`,title:"弹出为悬浮窗口",children:s.jsx(Tw,{size:16})}),s.jsx("button",{onClick:()=>n&&r?r():t(),title:n&&r?"收起为侧边栏":"关闭",className:`p-1.5 rounded ${a?"text-zinc-400 hover:text-white hover:bg-zinc-800":"text-zinc-500 hover:text-zinc-900 hover:bg-zinc-100"}`,children:s.jsx(Ja,{size:16})})]})]}),s.jsxs("div",{className:"flex-1 min-h-0 relative flex flex-col",children:[s.jsxs("div",{ref:B,className:"flex-1 min-h-0 overflow-y-auto chat-scroll-minimal p-3 space-y-3",style:{fontSize:pte[l]},children:[(()=>{const Ie=(ze==null?void 0:ze.messages)??[],Pe=Ie[Ie.length-1],Be=b&&(Pe==null?void 0:Pe.role)==="assistant"&&!(Pe!=null&&Pe.content)?Ie.slice(0,-1):Ie;return Be.length>0?Be.map(He=>s.jsxs("div",{className:`flex gap-2 group ${He.role==="user"?"flex-row-reverse":""}`,onContextMenu:Je=>Ce(Je,He.id),children:[s.jsx("div",{className:`w-6 h-6 rounded-full flex items-center justify-center shrink-0 overflow-hidden ${He.role==="user"?"bg-blue-600 text-white":a?"bg-zinc-700 text-zinc-300":"bg-zinc-300 text-zinc-700"}`,children:He.role==="user"?s.jsx(hd,{size:12}):(()=>{const Je=He.modelId??u,Me=dN(Je,a);return Me?s.jsx("img",{src:Me,alt:"",className:"w-3.5 h-3.5 object-contain"}):s.jsx(Ax,{size:12})})()}),s.jsxs("div",{className:"relative max-w-[80%]",children:[s.jsxs("div",{className:`absolute -top-1 ${He.role==="user"?"-left-6":"-right-6"} opacity-0 group-hover:opacity-100 flex items-center gap-0.5 transition-opacity`,children:[s.jsx("button",{onClick:()=>{navigator.clipboard.writeText(He.content)},className:`p-1 rounded transition-colors ${a?"text-zinc-500 hover:text-zinc-300 hover:bg-zinc-700":"text-zinc-400 hover:text-zinc-600 hover:bg-zinc-100"}`,title:"复制",children:s.jsx(Eh,{size:10})}),He.role==="assistant"&&F&&s.jsx("button",{type:"button",onClick:Je=>{Je.preventDefault(),Je.stopPropagation();const Me=`Skill ${new Date().toLocaleDateString()}`;oe(Me),se({name:Me,content:He.content,afterSave:()=>{typeof window<"u"&&window.__toastSuccess?window.__toastSuccess("已保存到 Skill 库,可在 Agent 节点中选用"):alert("已保存到 Skill 库,可在 Agent 节点的「Skill 库」中应用")}})},className:`p-1 rounded transition-colors ${a?"text-amber-400 hover:text-amber-300 hover:bg-zinc-700":"text-amber-600 hover:text-amber-700 hover:bg-zinc-100"}`,title:"保存为 Skill(供 Agent 节点使用)",children:s.jsx(xu,{size:10})})]}),s.jsxs("div",{className:`px-3 py-2 rounded-lg select-text cursor-text border ${He.role==="user"?"bg-blue-600 text-white border-transparent":a?"bg-zinc-800 text-zinc-300 border-zinc-800":"bg-white text-zinc-700 border-zinc-200"}`,style:{userSelect:"text"},children:[j.includes(He.id)&&s.jsx("div",{className:`mb-2 inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] ${a?"bg-amber-900/50 text-amber-300":"bg-amber-100 text-amber-700"}`,children:"已选中"}),He.files&&He.files.length>0&&s.jsx("div",{className:"flex flex-wrap gap-1.5 mb-2",children:He.files.map((Je,Me)=>{var Le,Xe,qe;const Re=Je.name||"unnamed",Ve=Je.fileExt||(Je.name?(Le=Je.name.split(".").pop())==null?void 0:Le.toLowerCase():"")||"文件",Ze=Je.isImage||((Xe=Je.type)==null?void 0:Xe.startsWith("image/")),je=Je.isVideo||((qe=Je.type)==null?void 0:qe.startsWith("video/"));return s.jsxs("div",{className:"relative group/file",children:[Ze?s.jsxs(s.Fragment,{children:[s.jsx("img",{src:Je.content||Je.url,alt:Re,className:"w-16 h-16 object-cover rounded cursor-pointer hover:opacity-80 transition-opacity",onClick:()=>window.open(Je.content||Je.url,"_blank")}),s.jsx("div",{className:"absolute top-1 left-1 w-5 h-5 rounded-full bg-blue-600 text-white flex items-center justify-center text-[10px] font-bold shadow-lg",children:Me+1})]}):je?s.jsxs(s.Fragment,{children:[s.jsx("video",{src:Je.content||Je.url,className:"w-16 h-16 object-cover rounded cursor-pointer",onClick:()=>window.open(Je.content||Je.url,"_blank")}),s.jsx("div",{className:"absolute top-1 left-1 w-5 h-5 rounded-full bg-purple-600 text-white flex items-center justify-center text-[10px] font-bold shadow-lg",children:Me+1})]}):s.jsx("div",{className:`w-16 h-16 rounded flex items-center justify-center text-[10px] ${a?"bg-zinc-700":"bg-zinc-200"}`,children:Ve}),s.jsx("div",{className:"absolute bottom-0 left-0 right-0 bg-black/60 text-white text-[8px] px-1 truncate opacity-0 group-hover/file:opacity-100 transition-opacity",children:Re})]},Me)})}),He.role==="assistant"?s.jsx("div",{className:"chat-markdown prose prose-sm max-w-none dark:prose-invert",style:{fontSize:"1em"},dangerouslySetInnerHTML:{__html:dte(He.content)}}):s.jsx("div",{className:"whitespace-pre-wrap",children:He.content})]})]})]},He.id)):s.jsx("div",{className:`text-center py-8 text-xs ${a?"text-zinc-500":"text-zinc-400"}`,children:"开始与 AI 对话吧"})})(),b&&(()=>{const Ie=ze==null?void 0:ze.messages[ze.messages.length-1];return(Ie==null?void 0:Ie.role)==="assistant"&&Ie.content?null:s.jsxs("div",{className:"flex gap-2 group",children:[s.jsx("div",{className:`w-6 h-6 rounded-full flex items-center justify-center shrink-0 overflow-hidden ${a?"bg-zinc-700 text-zinc-300":"bg-zinc-300 text-zinc-700"}`,children:(()=>{const Te=dN(u,a);return Te?s.jsx("img",{src:Te,alt:"",className:"w-3.5 h-3.5 object-contain"}):s.jsx(Ax,{size:12})})()}),s.jsx("div",{className:"relative max-w-[80%]",children:s.jsx("div",{className:`px-3 py-2 rounded-lg ${a?"bg-zinc-800 text-zinc-300":"bg-white text-zinc-700 border border-zinc-200"}`,children:s.jsxs("div",{className:"flex items-center gap-1.5",children:[s.jsx("span",{children:"正在联想"}),s.jsxs("div",{className:"flex gap-1",children:[s.jsx("span",{className:"inline-block w-1.5 h-1.5 rounded-full bg-current animate-bounce",style:{animationDelay:"0s"}}),s.jsx("span",{className:"inline-block w-1.5 h-1.5 rounded-full bg-current animate-bounce",style:{animationDelay:"0.2s"}}),s.jsx("span",{className:"inline-block w-1.5 h-1.5 rounded-full bg-current animate-bounce",style:{animationDelay:"0.4s"}})]})]})})})]})})()]}),V.canScroll&&s.jsxs("div",{className:"absolute right-3 bottom-3 flex flex-col gap-1 z-10",children:[!V.atTop&&s.jsx("button",{type:"button",onClick:de,title:"快速到顶部",className:`p-1.5 rounded-lg shadow-lg transition-colors ${a?"bg-zinc-800/90 text-zinc-300 hover:bg-zinc-700 hover:text-white border border-zinc-700":"bg-white/95 text-zinc-600 hover:bg-zinc-100 hover:text-zinc-900 border border-zinc-200"}`,children:s.jsx(bm,{size:14})}),!V.atBottom&&s.jsx("button",{type:"button",onClick:$e,title:"快速到底部",className:`p-1.5 rounded-lg shadow-lg transition-colors ${a?"bg-zinc-800/90 text-zinc-300 hover:bg-zinc-700 hover:text-white border border-zinc-700":"bg-white/95 text-zinc-600 hover:bg-zinc-100 hover:text-zinc-900 border border-zinc-200"}`,children:s.jsx(Ei,{size:14})})]})]}),s.jsxs("div",{className:`p-3 border-t shrink-0 rounded-b-2xl relative ${a?"border-zinc-800":"border-zinc-200"}`,style:{minHeight:J},children:[s.jsx("div",{className:`absolute left-0 right-0 top-0 h-2 cursor-ns-resize flex items-center justify-center group ${a?"hover:bg-blue-600/30":"hover:bg-blue-400/20"}`,onMouseDown:fe,children:s.jsx("div",{className:`w-10 h-1 rounded-full transition-colors ${a?"bg-zinc-700 group-hover:bg-blue-500":"bg-zinc-300 group-hover:bg-blue-500"}`})}),h.length>0&&s.jsx("div",{className:"flex flex-wrap gap-2 mb-2 mt-3",children:h.map((Ie,Pe)=>{var Ze,je,Le,Xe;const Te=Ie,Be=Te.content||Te.preview,He=Te.isImage||((Ze=Ie.type)==null?void 0:Ze.startsWith("image/")),Je=Te.isVideo||((je=Ie.type)==null?void 0:je.startsWith("video/")),Me=Te.isText||((Le=Ie.type)==null?void 0:Le.startsWith("text/")),Re=Te.fileExt||(Ie.name?(Xe=Ie.name.split(".").pop())==null?void 0:Xe.toLowerCase():"")||"",Ve=Ie.name||"unnamed";return s.jsxs("div",{className:`relative rounded overflow-hidden ${Be&&(He||Je)?"w-16 h-16":"px-2 py-1.5"} ${a?"bg-zinc-800":"bg-zinc-200"}`,title:Me?`${Ve} +${(Te.content||"").substring(0,100)}...`:Ve,children:[Be&&He?s.jsxs(s.Fragment,{children:[s.jsx("img",{src:Te.content||Te.preview,alt:Ve,className:"w-full h-full object-cover"}),s.jsx("div",{className:"absolute top-1 left-1 w-5 h-5 rounded-full bg-blue-600 text-white flex items-center justify-center text-[10px] font-bold shadow-lg",children:Pe+1})]}):Be&&Je?s.jsxs(s.Fragment,{children:[s.jsxs("div",{className:"relative w-full h-full bg-black flex items-center justify-center",children:[s.jsx("video",{src:Te.content,className:"w-full h-full object-cover",muted:!0}),s.jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-black/30",children:s.jsx(Ia,{size:16,className:"text-white"})})]}),s.jsx("div",{className:"absolute top-1 left-1 w-5 h-5 rounded-full bg-purple-600 text-white flex items-center justify-center text-[10px] font-bold shadow-lg",children:Pe+1})]}):Me?s.jsxs("div",{className:"flex items-center gap-1.5 text-[10px]",children:[s.jsx(Vo,{size:12,className:a?"text-blue-400":"text-blue-600"}),s.jsxs("div",{className:"flex flex-col",children:[s.jsx("span",{className:`max-w-[80px] truncate font-medium ${a?"text-zinc-200":"text-zinc-800"}`,children:Ve}),s.jsxs("span",{className:`text-[8px] ${a?"text-zinc-500":"text-zinc-400"}`,children:[".",Re]})]})]}):s.jsxs("div",{className:"flex items-center gap-1 text-[10px]",children:[s.jsx(hq,{size:10,className:a?"text-zinc-300":"text-zinc-700"}),s.jsx("span",{className:`max-w-[100px] truncate ${a?"text-zinc-300":"text-zinc-700"}`,children:Ve})]}),s.jsx("button",{onClick:()=>v(qe=>qe.filter((tt,Ye)=>Ye!==Pe)),className:"absolute top-0.5 right-0.5 w-4 h-4 rounded-full bg-black/50 text-white flex items-center justify-center hover:bg-red-500",children:s.jsx(Qr,{size:10})})]},Pe)})}),s.jsxs("div",{className:"flex items-end gap-2",children:[s.jsxs("label",{className:`p-2 rounded-lg cursor-pointer transition-colors ${a?"bg-zinc-800 text-zinc-400 hover:text-zinc-200":"bg-zinc-100 text-zinc-500 hover:text-zinc-700"}`,title:"上传图片/视频 (最多10张)",children:[s.jsx(si,{size:14}),s.jsx("input",{type:"file",accept:"image/*,.jpg,.jpeg,.png,.gif,.webp,.bmp,.svg,video/*,.mp4,.webm,.mov,.avi,.mkv,.flv,.ogg",multiple:!0,className:"hidden",onChange:Ie=>{const Pe=Ie.target,Te=Array.from(Pe.files||[]),Be=10-h.length;if(Te.length>Be){alert(`最多只能上传10个文件,当前已有${h.length}个,还可以上传${Be}个`),Pe.value="";return}(async()=>{for(const He of Te){const Je=He.type.startsWith("image/"),Me=He.type.startsWith("video/");if(Me&&He.size>ute){alert(`视频文件 ${He.name} 体积为 ${(He.size/1024/1024).toFixed(1)}MB,已超过 50MB 限制,请先压缩或裁剪后再上传。`);continue}try{let Re;Je?Re=await hte(He):Re=await new Promise((Ve,Ze)=>{const je=new FileReader;je.onload=Le=>{var Xe;return Ve((Xe=Le.target)==null?void 0:Xe.result)},je.onerror=()=>Ze(new Error("文件读取失败")),je.readAsDataURL(He)}),v(Ve=>Ve.length>=10?Ve:[...Ve,{...He,content:Re,isImage:Je,isVideo:Me,preview:Je?Re:void 0}])}catch(Re){console.error("[ChatPanel] 文件处理失败:",Re),alert(`文件 ${He.name} 处理失败,请重试或换一张图片。`)}}Pe.value=""})()}})]}),s.jsxs("label",{className:`p-2 rounded-lg cursor-pointer transition-colors ${a?"bg-zinc-800 text-zinc-400 hover:text-zinc-200":"bg-zinc-100 text-zinc-500 hover:text-zinc-700"}`,title:"上传文本文件 (txt, md, json, csv等,最多10个)",children:[s.jsx(Vo,{size:14}),s.jsx("input",{type:"file",accept:".txt,.md,.json,.csv,.xml,.html,.css,.js,.ts,.jsx,.tsx,.py,.java,.c,.cpp,.h,.hpp,.yaml,.yml,.toml,.ini,.log,.sql,.sh,.bat,text/*,application/json,application/xml",multiple:!0,className:"hidden",onChange:Ie=>{const Pe=Array.from(Ie.target.files||[]),Te=10-h.length;if(Pe.length>Te){alert(`最多只能上传10个文件,当前已有${h.length}个,还可以上传${Te}个`);return}Pe.forEach(Be=>{const He=new FileReader;He.onload=Je=>{var Ve,Ze,je;const Me=(Ve=Je.target)==null?void 0:Ve.result,Re=((je=(Ze=Be.name)==null?void 0:Ze.split(".").pop())==null?void 0:je.toLowerCase())||"";v(Le=>Le.length>=10?Le:[...Le,{...Be,content:Me,isImage:!1,isVideo:!1,isText:!0,fileExt:Re}])},He.readAsText(Be)}),Ie.target.value=""}})]}),s.jsx("div",{className:`flex-1 rounded-lg border overflow-hidden ${a?"bg-zinc-900 border-zinc-700":"bg-white border-zinc-300"}`,children:s.jsx("textarea",{value:d,onChange:Ie=>w(Ie.target.value),placeholder:"输入消息,按 Enter 换行,点击发送按钮发送",maxLength:5e4,className:`w-full px-3 py-2 text-xs resize-none outline-none bg-transparent chat-scroll-minimal ${a?"text-white placeholder-zinc-500":"text-zinc-900 placeholder-zinc-400"}`,style:{height:Math.max(32,J-48)}})}),s.jsx("button",{onClick:()=>{const Ie=d;(Ie.trim()||h.length>0)&&R(Ie)},className:`p-2 rounded-lg transition-colors ${(d.trim()||h.length>0)&&!b?"bg-blue-600 text-white hover:bg-blue-500":a?"bg-zinc-800 text-zinc-500":"bg-zinc-200 text-zinc-400"}`,disabled:!d.trim()&&h.length===0||b,children:b?s.jsx(zr,{size:14,className:"animate-spin"}):s.jsx(Lo,{size:14})})]})]}),W.open&&s.jsxs("div",{className:`fixed z-[200] min-w-[190px] rounded-lg border shadow-xl py-1 ${a?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,style:{left:W.x,top:W.y},onClick:Ie=>Ie.stopPropagation(),children:[s.jsx("button",{type:"button",onClick:xe,className:`w-full px-3 py-1.5 text-left text-xs transition-colors ${a?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"}`,children:W.targetMessageId&&j.includes(W.targetMessageId)?"取消选中此条":"选中此条"}),s.jsxs("button",{type:"button",onClick:ve,disabled:_e===0,className:`w-full px-3 py-1.5 text-left text-xs transition-colors ${_e===0?a?"text-zinc-600 cursor-not-allowed":"text-zinc-300 cursor-not-allowed":a?"text-amber-300 hover:bg-zinc-800":"text-amber-700 hover:bg-zinc-100"}`,children:["保存已选消息为 Skill(",_e,")"]}),s.jsx("button",{type:"button",onClick:Ne,disabled:_e===0,className:`w-full px-3 py-1.5 text-left text-xs transition-colors ${_e===0?a?"text-zinc-600 cursor-not-allowed":"text-zinc-300 cursor-not-allowed":a?"text-zinc-400 hover:bg-zinc-800":"text-zinc-500 hover:bg-zinc-100"}`,children:"清空选择"})]}),Y&&typeof document<"u"&&Ni.createPortal(s.jsx("div",{className:"fixed inset-0 z-[99999] flex items-center justify-center bg-black/50",role:"dialog","aria-modal":"true","aria-labelledby":"chat-skill-save-title",onClick:Ie=>{Ie.target===Ie.currentTarget&&se(null)},children:s.jsxs("div",{className:`w-full max-w-md mx-4 rounded-xl border shadow-2xl p-4 ${a?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onClick:Ie=>Ie.stopPropagation(),children:[s.jsx("h3",{id:"chat-skill-save-title",className:`text-sm font-medium mb-3 ${a?"text-zinc-200":"text-zinc-800"}`,children:"保存为 Skill"}),s.jsx("label",{className:`block text-xs mb-1 ${a?"text-zinc-400":"text-zinc-500"}`,children:"名称"}),s.jsx("input",{type:"text",value:ie,onChange:Ie=>oe(Ie.target.value),placeholder:"Skill 名称",className:`w-full px-3 py-2 rounded-lg border text-sm mb-3 ${a?"bg-zinc-800 border-zinc-600 text-zinc-200 placeholder-zinc-500":"bg-white border-zinc-300 text-zinc-800 placeholder-zinc-400"}`,autoFocus:!0}),s.jsxs("div",{className:"flex justify-end gap-2",children:[s.jsx("button",{type:"button",onClick:()=>se(null),className:`px-3 py-1.5 rounded-lg text-sm ${a?"text-zinc-300 hover:bg-zinc-700":"text-zinc-600 hover:bg-zinc-100"}`,children:"取消"}),s.jsx("button",{type:"button",onClick:()=>{var Pe;const Ie=ie.trim()||Y.name;q5({name:Ie,content:Y.content}),(Pe=Y.afterSave)==null||Pe.call(Y),se(null)},className:"px-3 py-1.5 rounded-lg text-sm bg-amber-600 text-white hover:bg-amber-500",children:"保存"})]})]})}),document.body),n&&s.jsxs(s.Fragment,{children:[s.jsx("div",{onMouseDown:Ie=>le(Ie,"e"),className:"absolute top-0 right-0 bottom-0 w-1 cursor-ew-resize hover:bg-blue-500/30",style:{right:-2},title:"拖拽调整宽度"}),s.jsx("div",{onMouseDown:Ie=>le(Ie,"s"),className:"absolute left-0 right-0 bottom-0 h-1 cursor-ns-resize hover:bg-blue-500/30",style:{bottom:-2},title:"拖拽调整高度"}),s.jsx("div",{onMouseDown:Ie=>le(Ie,"se"),className:"absolute w-3 h-3 cursor-nwse-resize hover:bg-blue-500/40 rounded-br-2xl",style:{right:-4,bottom:-4},title:"拖拽缩放"})]})]})},fte=_.memo(d4),mte=Object.freeze(Object.defineProperty({__proto__:null,ChatPanel:d4,default:fte},Symbol.toStringTag,{value:"Module"}));function gte(e){const[t,n]=_.useState({mainUrlDownloaded:!1,audioUrlDownloaded:!1,mjImagesDownloaded:[],allDownloaded:!1,isChecking:!0});return _.useEffect(()=>{let r=!1;const i=async()=>{try{let o=!1;e.url&&(e.url.startsWith("data:")||e.url.startsWith("blob:")?o=!0:(e.url.startsWith("http://")||e.url.startsWith("https://"))&&(o=await Xr.hasAsset(e.id)));let l=!1;e.audioUrl&&e.audioUrl!==e.url?e.audioUrl.startsWith("data:")||e.audioUrl.startsWith("blob:")?l=!0:(e.audioUrl.startsWith("http://")||e.audioUrl.startsWith("https://"))&&(l=await Xr.hasAsset(`${e.id}_audio`)):l=!0;const c=e.mjImages||[],u=[];for(let p=0;pp);r||n({mainUrlDownloaded:o,audioUrlDownloaded:l,mjImagesDownloaded:u,allDownloaded:o&&l&&d,isChecking:!1})}catch(o){console.error("[useAssetDownloadStatus] Error checking status:",o),r||n(l=>({...l,isChecking:!1}))}};i();const a=Xr.addListener(o=>{(o===e.id||o===`${e.id}_audio`||o.startsWith(`${e.id}_mj_`))&&i()});return()=>{r=!0,a()}},[e.id,e.url,e.audioUrl,e.mjImages]),t}async function b9(e){const t=e._mjAssetIds,n=e._audioAssetId,r=e.type==="video"&&e.url&&(e.url.includes("prod-ss-vidu")||e.url.includes("prod-sa-vidu")||e.url.includes("amazonaws")&&e.url.includes("vidu"));let i=null;if(r&&e.url){const{getViduVideoAssetId:c}=await mn(async()=>{const{getViduVideoAssetId:u}=await Promise.resolve().then(()=>oO);return{getViduVideoAssetId:u}},void 0,import.meta.url);i=c(e.id,e.url)}const a=[e._assetId,e.id,...t||[],n,i].filter(Boolean);if(a.length===0)return;const o=a.flatMap(c=>[`thumb_${c}`,`preview_${c}`]),l=[...new Set([...a,...o])];await Xr.deleteAssets(l),xr.isAvailable()&&await xr.removeAssets(l)}async function hN(e){await Promise.all(e.map(t=>b9(t)))}const pN=200,Eg=8,xte=150,fN=2,y9=_.memo(({history:e,isDark:t,thumbnailsRefreshTrigger:n,onSetLightboxItem:r,onSetLightboxOpen:i,onSetHistory:a,onHistoryContextMenu:o,onRefreshVideo:l,onRefreshAudio:c,onRefreshMjImage:u,onRefreshComfyTask:d,onRefreshNanoBanana:h,onLocateToNode:p})=>{const f=_.useRef(null),[b,g]=_.useState(0),[y,w]=_.useState(500),[v,m]=_.useState(300),z=_.useRef(0),C=_.useRef(null);_.useEffect(()=>{const J=f.current;if(!J)return;const Z=()=>{w(J.clientHeight),m(J.clientWidth)};Z();const B=new ResizeObserver(Z);return B.observe(J),()=>B.disconnect()},[]);const E=Math.max(1,Math.floor((v-12)/(xte+Eg))),I=E>1?(v-12-Eg*(E-1))/E:v-24,R=pN+Eg,A=Math.ceil(e.length/E),O=A*R+Eg,F=Math.max(0,Math.floor(b/R)-fN),L=Math.min(A-1,Math.ceil((b+y)/R)+fN),X=F*E,T=Math.min(e.length-1,(L+1)*E-1),q=_.useCallback(J=>{const Z=J.currentTarget.scrollTop;z.current=Z,C.current&&cancelAnimationFrame(C.current),C.current=requestAnimationFrame(()=>{g(z.current),C.current=null})},[]);if(_.useEffect(()=>()=>{C.current&&cancelAnimationFrame(C.current)},[]),e.length===0)return s.jsx("div",{className:"flex-1 flex items-center justify-center",children:s.jsx("div",{className:`text-center py-8 text-xs ${t?"text-zinc-500":"text-zinc-400"}`,children:"暂无生成历史"})});const H=[];for(let J=X;J<=T&&J{const B=Math.floor(Z/E),V=Z%E;return s.jsx(h4,{item:J,index:Z,isDark:t,itemHeight:pN,gridLayout:{row:B,col:V,cols:E,cardWidth:I,rowHeight:R,gap:Eg},thumbnailsRefreshTrigger:n,onSetLightboxItem:r,onSetLightboxOpen:i,onSetHistory:a,onHistoryContextMenu:o,onRefreshVideo:l,onRefreshAudio:c,onRefreshMjImage:u,onRefreshComfyTask:d,onRefreshNanoBanana:h,onLocateToNode:p},J.id)})})})});y9.displayName="HistoryVirtualList";function mN(e){if(!e||typeof e!="string")return!1;const t=e.toLowerCase();return(t.includes("prod-ss-vidu")||t.includes("s3")&&t.includes("amazonaws"))&&(t.includes(".mp4")||t.includes("/video"))}const lp=e=>{if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean")return String(e);if(typeof e=="object"){if("message"in e&&typeof e.message=="string")return e.message;try{return JSON.stringify(e)}catch{return"[Object]"}}return String(e)},h4=_.memo(({item:e,index:t,isDark:n,itemHeight:r,gridLayout:i,thumbnailsRefreshTrigger:a,onSetLightboxItem:o,onSetLightboxOpen:l,onSetHistory:c,onHistoryContextMenu:u,onRefreshVideo:d,onRefreshAudio:h,onRefreshMjImage:p,onRefreshComfyTask:f,onRefreshNanoBanana:b,onLocateToNode:g})=>{var ke,Ie,Pe,Te,Be,He,Je;const[y,w]=_.useState(e.status),[v,m]=_.useState(e.progress);_.useEffect(()=>{w(e.status),m(e.progress)},[e.status,e.progress]),_.useEffect(()=>{const Me=Re=>{const{taskId:Ve}=Re.detail;Ve===e.id&&(w("completed"),m(100),c(Ze=>Ze.map(Le=>Le.id===Ve?{...Le,status:"completed",progress:100}:Le)))};return window.addEventListener("klingO1VideoComplete",Me),()=>{window.removeEventListener("klingO1VideoComplete",Me)}},[e.id,c]);const C=e.type==="video"&&Ea(e.url)||e.url,{content:E,isLoading:I}=Ul(C,{useThumbnail:!1}),{content:R}=Ul(C,{useThumbnail:!1}),{content:A}=Ul(e.audioUrl),O=e.mjImages||[],F=e.type==="video",L=iu(O,{useThumbnail:!1}),X=L.map(Me=>Me.content).filter(Boolean),T=!F&&L.some(Me=>Me.isLoading),H=iu(O,{useThumbnail:!1}).map(Me=>Me.content).filter(Boolean);gte(e);const J=e._mjAssetIds,Z=e._audioAssetId,[B,V]=_.useState(!1),[N,j]=_.useState(null),[k,W]=_.useState(null),[M,Y]=_.useState(null),[se,ie]=_.useState(null),[oe,re]=_.useState(null),[ee,pe]=_.useState(0);_.useEffect(()=>{const Re=e.type==="video"&&e.url&&(e.url.includes("prod-ss-vidu")||e.url.includes("prod-sa-vidu")||e.url.includes("amazonaws")&&e.url.includes("vidu"))&&e.url?`${e.id}_vidu_${(e.url.split("/").pop()||e.url).replace(/[^a-zA-Z0-9_-]/g,"").slice(0,36)||Date.now()}`:null,Ve=new Set([e._assetId,Re,e.id,...J||[],Z].filter(Boolean));if(Ve.size===0)return;let Ze=null;return mn(async()=>{const{assetStore:je}=await Promise.resolve().then(()=>_s);return{assetStore:je}},void 0,import.meta.url).then(({assetStore:je})=>{Ze=je.addListener(Le=>{Ve.has(Le)&&pe(Xe=>Xe+1)})}),()=>{Ze==null||Ze()}},[e._assetId,e.id,e.url,J==null?void 0:J.length,Z]);const we=!!(e._assetId||J!=null&&J.length||Z),[Q,me]=_.useState(!we);_.useEffect(()=>{let Me=!1,Re=!1,Ve=!1;return a!==void 0&&a>0&&(j(null),Y(null)),(async()=>{try{await xr.ensureRestored();const{assetStore:Ze}=await mn(async()=>{const{assetStore:pt}=await Promise.resolve().then(()=>_s);return{assetStore:pt}},void 0,import.meta.url),{getViduVideoAssetId:je}=await mn(async()=>{const{getViduVideoAssetId:pt}=await Promise.resolve().then(()=>oO);return{getViduVideoAssetId:pt}},void 0,import.meta.url),Le=pt=>xr.isAvailable()&&xr.hasThumbnail(pt,"preview")?xr.readThumbnail(pt,"preview"):Promise.resolve(null),Xe=pt=>xr.isAvailable()&&xr.hasAsset(pt)?xr.readAssetAsUrl(pt):Promise.resolve(null),qe=e.type==="video"&&e.url&&(e.url.includes("prod-ss-vidu")||e.url.includes("prod-sa-vidu")||e.url.includes("amazonaws")&&e.url.includes("vidu")),tt=qe&&e.url?je(e.id,e.url):null,Ye=[e._assetId,tt].filter(Boolean);qe||Ye.push(e.id);for(const pt of Ye){if(Me)return;const ht=await Le(pt);let wt=await Xe(pt);if(wt||(wt=await Ze.getAssetUrl(pt)),(ht||wt)&&!Me){ht&&j(ht),wt&&(W(wt),Re=!0),(wt||ht)&&(Re=!0);break}}if(!Re&&qe&&e.url&&W(e.url),J&&J.length>0){const[pt,ht]=await Promise.all([Promise.all(J.map(jt=>Le(jt))),Promise.all(J.map(async jt=>await Xe(jt)||Ze.getAssetUrl(jt)))]),wt=pt.filter(Boolean),$t=ht.filter(Boolean);Me||(wt.length>0&&Y(wt),$t.length>0&&(ie($t),Re||(W($t[0]),Re=!0),wt.length===0&&Y($t)))}if(Z&&!Me){let pt=await Xe(Z);pt||(pt=await Ze.getAssetUrl(Z)),pt&&!Me&&(re(pt),Ve=!0)}const ct=Re||Ve;if(!Me){try{if(xr.isAvailable()){const ht=[e._assetId,e.id,...J||[],Z].filter(Boolean).some(wt=>xr.hasAsset(wt));V(ht||ct)}else V(ct)}catch{V(ct)}me(!0)}}catch{me(!0)}})(),()=>{Me=!0}},[e._assetId,e.id,e.url,J==null?void 0:J.length,Z,ee,a]);const ue=N??void 0,U=N||k||(Q?E||e.url:void 0),G=k||(Q?R||e.url:void 0)||e.url,te=oe||A||e.audioUrl||e.url,ge=(M&&M.length>0?M:se)||(J!=null&&J.length&&!Q?[]:F&&X.length===0?O:X),ne=se&&se.length>0?se:Q?H.length>0?H:O:[],le=U||e.mjImages&&e.mjImages.length>1&&ge.length>0,fe=e.type!=="video"&&!le&&(!Q||I||T),[be,de]=_.useState(null),[$e,ze]=_.useState(!1),_e=_.useRef(null);_.useEffect(()=>{const Me=e.type==="video"?U:null;if(!Me||!mN(Me)){_e.current=null,de(null),ze(!1);return}if(de(Me),ze(!1),Me.includes("prod-ss-vidu")||Me.includes("amazonaws.com.cn")&&Me.includes("infer/tasks"))return()=>{_e.current=null,de(null),ze(!1)};let Ve=!1;return(async()=>{try{const Ze=`vidu_video_${btoa(Me).replace(/[^a-zA-Z0-9]/g,"_").substring(0,50)}`,{assetStore:je}=await mn(async()=>{const{assetStore:Xe}=await Promise.resolve().then(()=>_s);return{assetStore:Xe}},void 0,import.meta.url),Le=await je.getAssetUrl(Ze);if(Le&&!Ve){_e.current=Le,de(Le);return}try{const{downloadWithFallback:Xe}=await mn(async()=>{const{downloadWithFallback:tt}=await Promise.resolve().then(()=>n0);return{downloadWithFallback:tt}},void 0,import.meta.url),qe=await Xe(Me,6e4);if(!Ve){await je.saveBlobAsset(Ze,qe,Me);const tt=await je.getAssetUrl(Ze);tt&&(_e.current=tt,de(tt))}}catch{}}catch{}})(),()=>{Ve=!0,_e.current=null,de(null),ze(!1)}},[e.type,U]);const Ee=Me=>{Me.stopPropagation(),e.prompt&&typeof e.prompt=="string"&&navigator.clipboard.writeText(e.prompt)},Ce=i??{row:t,col:0,cols:1,cardWidth:0,rowHeight:r,gap:4},xe=Ce.row*Ce.rowHeight+Ce.gap,Ne=Ce.cols>1?Ce.col*(Ce.cardWidth+Ce.gap)+Ce.gap/2:Ce.gap,ve=Ce.cols>1?Ce.cardWidth:void 0;return s.jsxs("div",{className:`absolute rounded-lg overflow-hidden cursor-pointer transition-all ${n?"bg-zinc-900 hover:bg-zinc-800/80":"bg-white hover:bg-zinc-50"}`,style:{top:xe,left:Ne,right:Ce.cols>1?void 0:Ce.gap,width:Ce.cols>1?ve:void 0,height:r-4},onContextMenu:Me=>u(Me,e),draggable:!0,onDragStart:Me=>{var je;let Re=G,Ve=!!k;if(e.mjImages&&e.mjImages.length>1){const Le=e.selectedMjImageIndex??0;Re=ne[Le]||(se==null?void 0:se[Le])||H[Le]||e.mjImages[Le]||G,(ne[Le]||se!=null&&se[Le])&&(Ve=!0)}Ve&&console.log("[HistoryPanel] 拖拽本地缓存文件:",{itemId:e.id,url:(Re==null?void 0:Re.substring(0,50))+"...",isBlobUrl:Re==null?void 0:Re.startsWith("blob:"),hasLocalCache:!!k,hasLocalMjCache:!!se});let Ze=Re;if(Re&&Re.startsWith("blob:")||Re&&Re.startsWith("data:"),Ze=Re,Me.dataTransfer.effectAllowed="copy",Me.dataTransfer.setData("application/json",JSON.stringify({type:"history-item",item:{id:e.id,url:Ze,type:e.type,prompt:e.prompt,width:e.width,height:e.height,modelName:e.modelName,mjImages:(((je=e.mjImages)==null?void 0:je.length)??0)>1?ne.length>0?ne:e.mjImages??[]:e.mjImages??[],selectedMjImageIndex:e.selectedMjImageIndex,_assetId:e._assetId,_mjAssetIds:e._mjAssetIds}})),Re&&e.type==="image"){const Le=new Image;Le.src=Re,Le.style.width="80px",Le.style.height="80px",Le.style.objectFit="cover",Le.style.borderRadius="4px",Le.style.opacity="0.8",Le.style.position="absolute",Le.style.top="-9999px",document.body.appendChild(Le);const Xe=()=>{try{Le.parentNode===document.body&&document.body.removeChild(Le)}catch{}};Le.onload=()=>{Me.dataTransfer.setDragImage(Le,40,40),setTimeout(Xe,0)},Le.complete&&(Me.dataTransfer.setDragImage(Le,40,40),setTimeout(Xe,0))}},onDragEnd:Me=>{},children:[y==="generating"?s.jsxs("div",{className:"h-[120px] bg-zinc-800 flex flex-col items-center justify-center relative gap-2",children:[s.jsx(qQ,{progress:v||0,size:48,strokeWidth:3,isDark:n,showPercentage:!0}),e.modelName==="RH ComfyUI"&&e.id&&s.jsxs("span",{className:`text-[10px] ${n?"text-zinc-500":"text-zinc-400"}`,title:e.id,children:["taskid: ",e.id.length>16?e.id.slice(0,16)+"…":e.id]})]}):y==="failed"?s.jsxs("div",{className:"h-[120px] bg-zinc-800 flex flex-col items-center justify-center p-2 gap-1",children:[s.jsx("span",{className:"text-red-400 text-xs font-medium",children:"生成失败"}),e.errorMsg&&s.jsx("span",{className:`text-[10px] text-center w-full px-2 line-clamp-3 overflow-hidden ${n?"text-zinc-400":"text-zinc-500"}`,title:lp(e.errorMsg),children:lp(e.errorMsg).length>150?lp(e.errorMsg).substring(0,150)+"...":lp(e.errorMsg)}),e.modelName==="RH ComfyUI"&&e.id&&s.jsxs("span",{className:`text-[9px] ${n?"text-zinc-600":"text-zinc-400"}`,title:e.id,children:["taskid: ",e.id.length>16?e.id.slice(0,16)+"…":e.id]})]}):e.mjImages&&e.mjImages.length>1?s.jsxs("div",{className:"h-[120px] bg-zinc-800 grid grid-cols-2 grid-rows-2 gap-0 p-0.5 relative",children:[T&&s.jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-black/30 z-10",children:s.jsx(zr,{className:"w-6 h-6 animate-spin text-blue-500"})}),ge.slice(0,4).map((Me,Re)=>{var Le;const Ve=e.selectedMjImageIndex===Re,Ze=ne[Re]||H[Re]||((Le=e.mjImages)==null?void 0:Le[Re]),je=e.type==="video";return s.jsxs("div",{className:`mj-grid-quadrant relative w-full h-full cursor-pointer border-2 transition-all overflow-hidden ${Ve?"border-blue-500 scale-95":"border-transparent hover:border-blue-500/50"}`,onClick:Xe=>{Xe.stopPropagation(),c(qe=>qe.map(tt=>tt.id===e.id?{...tt,selectedMjImageIndex:Re}:tt))},onDoubleClick:Xe=>{Xe.stopPropagation();const qe=ne.length>0?ne:H.length>0?H:e.mjImages??[];o({...e,url:(je&&Ea(Ze)||Ze)??e.url,mjImages:qe,selectedMjImageIndex:Re}),l(!0)},children:[je?s.jsx("video",{src:Ea(Me)||Me,className:"w-full h-full object-cover",muted:!0,preload:"metadata",onMouseEnter:Xe=>{Xe.currentTarget.play().catch(()=>{})},onMouseLeave:Xe=>{const qe=Xe.currentTarget;qe.pause(),qe.currentTime=0}}):s.jsx("img",{src:Me,className:"w-full h-full object-cover",alt:`生成图 ${Re+1}`,loading:"eager"}),Ve&&s.jsx("div",{className:"absolute top-1 right-1 w-3 h-3 bg-blue-500 rounded-full flex items-center justify-center z-10",children:s.jsx(Eo,{size:8,className:"text-white"})})]},Re)}),B&&s.jsxs("div",{className:"absolute bottom-1 left-1 z-20 flex items-center gap-0.5 px-1.5 py-0.5 rounded-full bg-emerald-600/80 text-white text-[8px] font-medium backdrop-blur-sm shadow-sm",children:[s.jsx(hm,{size:8}),"本地缓存"]})]}):U?s.jsxs("div",{className:`relative group ${e.type==="audio"?"bg-zinc-800 min-h-[80px]":"h-[120px] bg-zinc-800"}`,children:[fe&&e.type!=="audio"&&s.jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-black/30 z-10",children:s.jsx(zr,{className:"w-6 h-6 animate-spin text-blue-500"})}),e.type==="video"?s.jsxs(s.Fragment,{children:[mN(U)&&$e&&s.jsxs("div",{className:"absolute inset-0 flex items-center justify-center bg-black/50 z-10",children:[s.jsx(zr,{className:"w-4 h-4 animate-spin text-white"}),s.jsx("span",{className:"ml-1.5 text-white text-[10px]",children:"加载中…"})]}),s.jsx("video",{src:be||Ea(U)||U,className:"w-full h-full object-cover",muted:!0,preload:"metadata",onDoubleClick:Me=>{Me.stopPropagation(),console.log("[HistoryPanel] Video double-clicked, opening lightbox with original URL"),o({...e,url:Ea(G)||G}),l(!0)}}),s.jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-black/20 group-hover:bg-black/40 transition-colors pointer-events-none",children:s.jsx("div",{className:"w-12 h-12 rounded-full bg-black/60 flex items-center justify-center group-hover:scale-110 transition-transform",children:s.jsx(Ia,{size:20,className:"text-white ml-1",fill:"white"})})})]}):e.type==="audio"?s.jsx("div",{className:"p-2 h-full flex flex-col justify-center min-h-[80px] w-full overflow-hidden",onDoubleClick:Me=>{Me.stopPropagation(),console.log("[HistoryPanel] Audio area double-clicked, opening lightbox"),o(e),l(!0)},children:s.jsx(U0,{audioUrl:te,isDark:n,title:e.musicTitle,className:"w-full",initialDuration:e.duration,onDownload:async()=>{var Re,Ve;const Me=te;if(Me)try{const Ze=await fetch(Me,{method:"GET",mode:"cors"});if(!Ze.ok)throw new Error("下载失败");const je=await Ze.blob(),Le=URL.createObjectURL(je),Xe=document.createElement("a");Xe.href=Le,Xe.download=`${e.musicTitle||"audio"}.${((Re=Me.split(".").pop())==null?void 0:Re.split("?")[0])||"mp3"}`,Xe.style.display="none",document.body.appendChild(Xe),Xe.click(),setTimeout(()=>{document.body.removeChild(Xe),URL.revokeObjectURL(Le)},100)}catch(Ze){console.error("下载音频失败:",Ze);const je=document.createElement("a");je.href=Me,je.download=`${e.musicTitle||"audio"}.${((Ve=Me.split(".").pop())==null?void 0:Ve.split("?")[0])||"mp3"}`,je.target="_blank",je.rel="noopener noreferrer",je.style.display="none",document.body.appendChild(je),je.click(),setTimeout(()=>{document.body.removeChild(je)},100)}},onDownloadAsMp3:te?()=>GO(te,`${e.musicTitle||"audio"}-${e.id}.mp3`):void 0})}):s.jsx(s.Fragment,{children:ue?s.jsx("img",{src:ue,className:"w-full h-full object-cover",alt:"",loading:"eager",onDoubleClick:Me=>{Me.stopPropagation(),o({...e,url:G}),l(!0)}}):s.jsx("div",{className:"w-full h-full flex items-center justify-center bg-zinc-800/80 cursor-pointer",onDoubleClick:Me=>{Me.stopPropagation(),o({...e,url:G}),l(!0)},title:"缩略图未就绪,双击查看原图",children:s.jsx(Ii,{size:24,className:"text-zinc-500"})})}),B&&s.jsxs("div",{className:"absolute bottom-1 left-1 z-20 flex items-center gap-0.5 px-1.5 py-0.5 rounded-full bg-emerald-600/80 text-white text-[8px] font-medium backdrop-blur-sm shadow-sm",children:[s.jsx(hm,{size:8}),"本地缓存"]})]}):null,s.jsxs("div",{className:`px-2 py-1 flex items-center gap-1 border-b ${n?"border-zinc-800":"border-zinc-100"}`,children:[s.jsx("p",{className:`flex-1 text-[11px] truncate font-medium ${n?"text-zinc-300":"text-zinc-700"}`,children:(()=>{const Me=lp(e.prompt);return Me?`**${Me.slice(0,30)}${Me.length>30?"...":""}`:"无提示词"})()}),s.jsx("button",{onClick:async Me=>{Me.stopPropagation();try{await b9(e)}catch(Re){console.warn("[HistoryPanel] 删除本地缓存失败:",Re)}c(Re=>Re.filter(Ve=>Ve.id!==e.id))},className:`p-1 rounded transition-colors ${n?"hover:bg-zinc-700 text-zinc-500 hover:text-red-400":"hover:bg-zinc-200 text-zinc-400 hover:text-red-500"}`,title:"删除(含本地缓存的缩略图与原图/视频/音频)",children:s.jsx(Zi,{size:11})}),s.jsx("button",{onClick:Ee,className:`p-1 rounded transition-colors ${n?"hover:bg-zinc-700 text-zinc-500 hover:text-zinc-200":"hover:bg-zinc-200 text-zinc-400 hover:text-zinc-700"}`,title:"复制提示词",children:s.jsx(Eh,{size:11})}),(e.targetPreviewId||e.sourceNodeId)&&g&&s.jsx("button",{onClick:Me=>{Me.stopPropagation(),g(e)},className:`p-1 rounded transition-colors ${n?"hover:bg-zinc-700 text-zinc-500 hover:text-blue-400":"hover:bg-zinc-200 text-zinc-400 hover:text-blue-600"}`,title:"定位到画布上的预览节点",children:s.jsx(mx,{size:11})}),e.status==="generating"&&e.remoteTaskId&&s.jsx("button",{onClick:Me=>{Me.stopPropagation();try{window.dispatchEvent(new CustomEvent("cancelPolling",{detail:{taskId:e.id}}))}catch(Re){console.warn("[HistoryPanel] cancelPolling dispatch failed:",Re)}c(Re=>Re.map(Ve=>Ve.id===e.id?{...Ve,status:"failed",progress:0,errorMsg:"已取消轮询(任务可能仍在后台执行)"}:Ve))},className:`p-1 rounded transition-colors ${n?"hover:bg-zinc-700 text-zinc-500 hover:text-red-400":"hover:bg-zinc-200 text-zinc-400 hover:text-red-500"}`,title:"取消轮询(仅停止前端轮询)",children:s.jsx(Qr,{size:11})}),e.type==="video"&&e.remoteTaskId&&d&&s.jsx("button",{onClick:Me=>{Me.stopPropagation(),d(e)},className:`p-1 rounded transition-colors ${n?"hover:bg-zinc-700 text-zinc-500 hover:text-green-400":"hover:bg-zinc-200 text-zinc-400 hover:text-green-600"}`,title:"刷新视频状态",children:s.jsx(Rx,{size:11})}),e.modelName==="RH ComfyUI"&&f&&s.jsx("button",{onClick:Me=>{Me.stopPropagation(),f(e)},className:`p-1 rounded transition-colors ${n?"hover:bg-zinc-700 text-zinc-500 hover:text-blue-400":"hover:bg-zinc-200 text-zinc-400 hover:text-blue-600"}`,title:"重新获取任务状态",children:s.jsx(Ch,{size:11})}),e.type==="audio"&&h&&s.jsx("button",{onClick:Me=>{Me.stopPropagation(),h(e)},className:`p-1 rounded transition-colors ${n?"hover:bg-zinc-700 text-zinc-500 hover:text-green-400":"hover:bg-zinc-200 text-zinc-400 hover:text-green-600"}`,title:"刷新音频状态",children:s.jsx(Rx,{size:11})}),e.type==="image"&&(e.url||e.mjOriginalUrl)&&(e.mjImages&&Array.isArray(e.mjImages)&&e.mjImages.length>0||e.mjNeedsSplit||e.modelName&&(e.modelName.toLowerCase().includes("midjourney")||e.modelName.toLowerCase().includes("mj")||e.modelName.toLowerCase().includes("jimeng")))&&p&&s.jsx("button",{onClick:Me=>{Me.stopPropagation(),p(e)},className:`p-1 rounded transition-colors ${n?"hover:bg-zinc-700 text-zinc-500 hover:text-blue-400":"hover:bg-zinc-200 text-zinc-400 hover:text-blue-600"}`,title:(ke=e.modelName)!=null&&ke.toLowerCase().includes("jimeng")?"重新裁切即梦图片":e.modelName&&(e.modelName.toLowerCase().includes("midjourney")||e.modelName.toLowerCase().includes("mj"))?"重新裁切MJ图片":"重新裁切多图",children:s.jsx(Ch,{size:11})}),e.type==="image"&&e.remoteTaskId&&b&&e.modelName&&(e.modelName.toLowerCase().includes("nano banana")||e.modelName.toLowerCase().includes("nano-banana")||((Pe=(Ie=e.apiConfig)==null?void 0:Ie.modelId)==null?void 0:Pe.includes("nano-banana"))||((Be=(Te=e.apiConfig)==null?void 0:Te.modelId)==null?void 0:Be.includes("gemini-3.1-flash-image-preview"))||((He=e.apiConfig)==null?void 0:He.modelId)==="grok-4.1-image"||((Je=e.apiConfig)==null?void 0:Je.modelId)==="grok-4.2-image"||e.modelName.toLowerCase().includes("grok 4.1 image")||e.modelName.toLowerCase().includes("grok 4.2 image"))&&s.jsx("button",{onClick:Me=>{Me.stopPropagation(),b(e)},className:`p-1 rounded transition-colors ${n?"hover:bg-zinc-700 text-zinc-500 hover:text-green-400":"hover:bg-zinc-200 text-zinc-400 hover:text-green-600"}`,title:"刷新任务状态,获取图片链接",children:s.jsx(Ch,{size:11})})]}),y==="generating"&&s.jsx("div",{className:`px-2 py-1 text-[10px] ${n?"text-blue-400":"text-blue-600"}`,children:"生成中..."}),s.jsx("div",{className:"px-2 py-1",children:s.jsxs("div",{className:`flex items-center gap-1.5 text-[10px] ${n?"text-zinc-500":"text-zinc-400"}`,children:[s.jsx("span",{children:(()=>{const Me=lp(e.time);return Me.includes("T")?Me.split("T")[1].split(".")[0]:Me})()}),s.jsx("span",{children:"·"}),s.jsx("span",{children:lp(e.modelName)}),e.durationMs&&y==="completed"&&s.jsxs(s.Fragment,{children:[s.jsx("span",{children:"·"}),s.jsx("span",{className:n?"text-green-400":"text-green-600",children:e.durationMs<1e3?`${e.durationMs}ms`:`${(e.durationMs/1e3).toFixed(1)}s`})]}),e.generationTime&&y==="completed"&&s.jsxs(s.Fragment,{children:[s.jsx("span",{children:"·"}),s.jsx("span",{className:n?"text-green-400":"text-green-600",children:e.generationTime})]}),B&&s.jsxs(s.Fragment,{children:[s.jsx("span",{children:"·"}),s.jsxs("span",{className:`flex items-center gap-0.5 ${n?"text-emerald-400":"text-emerald-600"}`,children:[s.jsx(hm,{size:9}),"本地缓存"]})]})]})})]})});h4.displayName="HistoryItemCard";h4.displayName="HistoryItemCard";const gN=260,xN=320,bN=640,yN=.9,vN={x:24,y:72,w:340,h:560},wN="historyPanelFloatBounds",p4=({isOpen:e,onClose:t,floating:n=!1,onSwitchToSidebar:r,onSwitchToFloating:i,isDark:a,history:o,localCacheServerConnected:l,localCacheSettingsOpen:c,localServerConfig:u,onSetLocalCacheSettingsOpen:d,onSetLocalServerConfig:h,onSetHistory:p,onSetLightboxItem:f,onSetLightboxOpen:b,onSetBatchManageOpen:g,onHistoryContextMenu:y,onRefreshVideo:w,onRefreshAudio:v,onRefreshMjImage:m,onRefreshComfyTask:z,onRefreshNanoBanana:C,onLocateToNode:E})=>{const[I,R]=_.useState(!0),[A,O]=_.useState(0);_.useEffect(()=>{if(!e)return;const k=setTimeout(()=>O(W=>W+1),100);return()=>clearTimeout(k)},[e]);const F=_.useCallback(()=>{if(typeof window>"u")return vN;try{const k=localStorage.getItem(wN);if(k){const W=JSON.parse(k);if((W==null?void 0:W.x)!=null&&(W==null?void 0:W.y)!=null&&(W==null?void 0:W.w)!=null&&(W==null?void 0:W.h)!=null)return{x:Math.max(0,W.x),y:Math.max(0,W.y),w:Math.min(bN,Math.max(gN,W.w)),h:Math.min(window.innerHeight*yN,Math.max(xN,W.h))}}}catch{}return vN},[]),[L,X]=_.useState(F);_.useEffect(()=>{X(F())},[F]);const T=_.useRef(null),q=_.useRef(null),H=_.useRef(null),J=_.useCallback(k=>{try{localStorage.setItem(wN,JSON.stringify(k))}catch{}},[]),Z=_.useCallback(k=>{if(!n||k.target.closest("button"))return;k.preventDefault();const W=T.current;if(!W)return;q.current={startX:L.x,startY:L.y,mouseX:k.clientX,mouseY:k.clientY};const M=se=>{const ie=q.current;if(!ie||!W)return;const oe=se.clientX-ie.mouseX,re=se.clientY-ie.mouseY,ee=L.w,pe=L.h,we=window.innerWidth-ee,Q=window.innerHeight-pe,me=Math.max(0,Math.min(we,ie.startX+oe)),ue=Math.max(0,Math.min(Q,ie.startY+re));W.style.left=`${me}px`,W.style.top=`${ue}px`},Y=()=>{if(!q.current||!W)return;const se=parseFloat(W.style.left),ie=parseFloat(W.style.top);if(W.style.left="",W.style.top="",q.current=null,document.removeEventListener("mousemove",M),document.removeEventListener("mouseup",Y),!Number.isNaN(se)&&!Number.isNaN(ie)){const oe=L.w,re=L.h,ee=window.innerWidth-oe,pe=window.innerHeight-re,we=Math.max(0,Math.min(ee,se)),Q=Math.max(0,Math.min(pe,ie));X(me=>{const ue={...me,x:we,y:Q};return J(ue),ue})}};document.addEventListener("mousemove",M),document.addEventListener("mouseup",Y)},[n,L,J]),B=_.useCallback((k,W)=>{if(!n)return;k.preventDefault(),k.stopPropagation();const M={edge:W,startX:k.clientX,startY:k.clientY,w:L.w,h:L.h};H.current=M;const Y=ie=>{const oe=H.current;if(!oe)return;const re=ie.clientX-oe.startX,ee=ie.clientY-oe.startY;let pe=oe.w,we=oe.h;oe.edge.includes("e")&&(pe=Math.max(gN,Math.min(bN,oe.w+re))),oe.edge.includes("s")&&(we=Math.max(xN,Math.min(window.innerHeight*yN,oe.h+ee))),X(Q=>({...Q,w:pe,h:we}))},se=()=>{H.current=null,document.removeEventListener("mousemove",Y),document.removeEventListener("mouseup",se),X(ie=>(J(ie),ie))};document.addEventListener("mousemove",Y),document.addEventListener("mouseup",se)},[n,L,J]),V=_.useMemo(()=>{const k=new Set;return o.filter(W=>k.has(W.id)?(console.warn("[HistoryPanel] Duplicate history item detected:",W.id),!1):(k.add(W.id),!0))},[o]),N=`z-40 flex flex-col rounded-2xl overflow-hidden ${a?"bg-[#121214] border border-zinc-800 shadow-xl":"bg-zinc-50 border border-zinc-200 shadow-xl"}`,j=s.jsxs(s.Fragment,{children:[s.jsxs("div",{onMouseDown:Z,className:`p-3 border-b flex justify-between items-center select-none ${n?"cursor-grab active:cursor-grabbing":""} ${a?"border-zinc-800":"border-zinc-200"}`,children:[s.jsx("h3",{className:`font-bold text-xs ${a?"text-zinc-300":"text-zinc-700"}`,children:"生成历史"}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("button",{onClick:()=>O(k=>k+1),className:`p-1.5 rounded transition-colors ${a?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800":"text-zinc-500 hover:text-zinc-700 hover:bg-zinc-200"}`,title:"刷新缩略图",children:s.jsx(Ch,{size:14})}),s.jsx("button",{onClick:()=>g(!0),className:`p-1.5 rounded transition-colors ${a?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800":"text-zinc-500 hover:text-zinc-700 hover:bg-zinc-200"}`,title:"批量管理",children:s.jsx(Ii,{size:14})}),!n&&i&&s.jsx("button",{onClick:i,className:`p-1.5 rounded transition-colors ${a?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800":"text-zinc-500 hover:text-zinc-700 hover:bg-zinc-200"}`,title:"弹出为悬浮窗口",children:s.jsx(Tw,{size:14})}),s.jsx("button",{onClick:()=>n&&r?r():t(),title:n&&r?"收起为侧边栏":"关闭",children:s.jsx(Qr,{size:12,className:a?"text-zinc-500":"text-zinc-400"})})]})]}),I?s.jsx(y9,{history:V,isDark:a,thumbnailsRefreshTrigger:A,onSetLightboxItem:f,onSetLightboxOpen:b,onSetHistory:p,onHistoryContextMenu:y,onRefreshVideo:w,onRefreshAudio:v,onRefreshMjImage:m,onRefreshComfyTask:z,onRefreshNanoBanana:C,onLocateToNode:E}):s.jsx("div",{className:"flex-1 flex items-center justify-center",children:s.jsx(zr,{className:`w-6 h-6 animate-spin ${a?"text-zinc-600":"text-zinc-400"}`})})]});return n?s.jsxs("div",{ref:T,className:N,style:{position:"fixed",left:L.x,top:L.y,width:L.w,height:L.h,pointerEvents:e?"auto":"none",visibility:e?"visible":"hidden"},children:[j,s.jsx("div",{onMouseDown:k=>B(k,"e"),className:"absolute top-0 right-0 bottom-0 w-1 cursor-ew-resize hover:bg-blue-500/30",style:{right:-2},title:"拖拽调整宽度"}),s.jsx("div",{onMouseDown:k=>B(k,"s"),className:"absolute left-0 right-0 bottom-0 h-1 cursor-ns-resize hover:bg-blue-500/30",style:{bottom:-2},title:"拖拽调整高度"}),s.jsx("div",{onMouseDown:k=>B(k,"se"),className:"absolute w-3 h-3 cursor-nwse-resize hover:bg-blue-500/40 rounded-br-lg",style:{right:-4,bottom:-4},title:"拖拽缩放"})]}):s.jsx("div",{className:`absolute left-0 top-2 bottom-2 w-[240px] ${N}`,style:{transform:e?"translateX(0)":"translateX(-100%)",opacity:e?1:0,transition:"transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.25s cubic-bezier(0.4, 0, 0.2, 1)",willChange:e?"transform, opacity":"auto",pointerEvents:e?"auto":"none"},children:j})},bte=_.memo(p4),yte=Object.freeze(Object.defineProperty({__proto__:null,HistoryPanel:p4,default:bte},Symbol.toStringTag,{value:"Module"})),vte=({isOpen:e,onClose:t,isDark:n,history:r,batchSelectedIds:i,onSetBatchSelectedIds:a,onSetHistory:o,onSetLightboxItem:l,toastSuccess:c,toastError:u})=>{var B,V,N,j,k,W;const[d,h]=_.useState(null),[p,f]=_.useState(!1),[b,g]=_.useState(new Set),[y,w]=_.useState(null),[v,m]=_.useState({}),[z,C]=_.useState({}),[E,I]=_.useState({}),[R,A]=_.useState(0),[O,F]=_.useState(0);_.useEffect(()=>{if(!e)return;let M=null;return mn(async()=>{const{assetStore:Y}=await Promise.resolve().then(()=>_s);return{assetStore:Y}},void 0,import.meta.url).then(({assetStore:Y})=>{M=Y.addListener(()=>A(se=>se+1))}),()=>{M==null||M()}},[e]),_.useEffect(()=>{if(!e||r.length===0)return;let M=!1;const Y=15,se=re=>!re.url||re.url.startsWith("blob:"),ie=re=>xr.isAvailable()&&xr.hasThumbnail(re,"preview")?xr.readThumbnail(re,"preview"):Promise.resolve(null),oe=re=>xr.isAvailable()&&xr.hasAsset(re)?xr.readAssetAsUrl(re):Promise.resolve(null);return(async()=>{if(await xr.ensureRestored(),M)return;const{assetStore:re}=await mn(async()=>{const{assetStore:me}=await Promise.resolve().then(()=>_s);return{assetStore:me}},void 0,import.meta.url),ee=r.filter(se),pe={},we={},Q={};for(let me=0;meawait oe(fe)||re.getAssetUrl(fe)))).filter(Boolean);le.length&&(we[U.id]=le,pe[U.id]||(pe[U.id]=le[0]))}if(te){let ne=await oe(te);ne||(ne=await re.getAssetUrl(te)),ne&&(Q[U.id]=ne)}}M||(m(U=>({...U,...pe})),C(U=>({...U,...we})),I(U=>({...U,...Q}))),me+YsetTimeout(U,50))}})(),()=>{M=!0}},[e,r,R,O]);const L=_.useRef(r);if(_.useEffect(()=>{L.current=r},[r]),_.useEffect(()=>{if(!e)return;let M=!0,Y=!1;return(async()=>{if(!Y){Y=!0;try{const ie=L.current,{convertUrlsToDataURLs:oe}=await mn(async()=>{const{convertUrlsToDataURLs:me}=await Promise.resolve().then(()=>rZ);return{convertUrlsToDataURLs:me}},void 0,import.meta.url);if(!ie.some(me=>me.url&&me.url.startsWith("http")||me.audioUrl&&me.audioUrl.startsWith("http")||me.mjImages&&me.mjImages.some(ue=>ue.startsWith("http")))){console.log("[BatchManageModal] 历史记录中没有远程 URL,无需转换"),Y=!1;return}console.log("[BatchManageModal] 开始转换历史记录中的远程 URL...");const ee=await oe(ie,0,void 0,{count:0,current:0},void 0,{onFailedBehavior:"placeholder",silentFail:!0}),pe=new Set(L.current.map(me=>me.id)),we=new Set(ie.map(me=>me.id));if(Array.from(we).some(me=>!pe.has(me))){console.log("[BatchManageModal] ⚠️ 转换期间检测到删除操作,不覆盖历史记录"),Y=!1;return}M&&e&&(o(ee),console.log("[BatchManageModal] ✅ 历史记录 URL 转换完成"))}catch(ie){console.warn("[BatchManageModal] URL 转换失败:",ie)}finally{Y=!1}}})(),()=>{M=!1}},[e]),_.useEffect(()=>{const M=Y=>{Y.key==="Escape"&&y&&w(null)};if(y)return window.addEventListener("keydown",M),()=>window.removeEventListener("keydown",M)},[y]),!e)return null;const X=async M=>{try{await navigator.clipboard.writeText(M),f(!0),setTimeout(()=>f(!1),2e3)}catch(Y){console.error("复制失败:",Y),alert("复制失败,请手动复制")}},T=M=>{g(Y=>new Set(Y).add(M))},q=async M=>{const Y=M.url||M.audioUrl||"";if(M.type==="audio"&&M._audioAssetId)try{const{assetStore:oe}=await mn(async()=>{const{assetStore:ee}=await Promise.resolve().then(()=>_s);return{assetStore:ee}},void 0,import.meta.url),re=await oe.getAssetUrl(M._audioAssetId);if(re)return re}catch{}const se=[M._assetId,M.id].filter(Boolean);for(const oe of se)try{const{assetStore:re}=await mn(async()=>{const{assetStore:pe}=await Promise.resolve().then(()=>_s);return{assetStore:pe}},void 0,import.meta.url),ee=await re.getAssetUrl(oe);if(ee)return ee}catch{}const ie=M._mjAssetIds;if(M.mjImages&&(ie!=null&&ie.length)&&M.mjImages.length>0){const oe=M.selectedMjImageIndex??0,re=ie[oe]??ie[0];if(re)try{const{assetStore:ee}=await mn(async()=>{const{assetStore:we}=await Promise.resolve().then(()=>_s);return{assetStore:we}},void 0,import.meta.url),pe=await ee.getAssetUrl(re);if(pe)return pe}catch{}}if(M.mjImages&&M.mjImages.length>1){const oe=M.selectedMjImageIndex??0;return M.mjImages[oe]||M.mjImages[0]||Y}return Y},H=async M=>{if(M.startsWith("data:"))return M;const Y=await fetch(M);if(!Y.ok)throw new Error(`无法加载: ${Y.status}`);const se=await Y.blob();return new Promise((ie,oe)=>{const re=new FileReader;re.onload=()=>ie(re.result),re.onerror=oe,re.readAsDataURL(se)})},J=async()=>{const Y=(i.size>0?r.filter(se=>i.has(se.id)):r).filter(se=>{var ie;return se.type==="image"||se.type==="video"||((ie=se.mjImages)==null?void 0:ie.length)});if(Y.length===0){(u||alert)(i.size>0?"当前选中项中没有可导入的图片/视频":"暂无图片或视频素材可导入");return}try{const{checkEagleAvailable:se,addItemsToEagle:ie}=await mn(async()=>{const{checkEagleAvailable:ee,addItemsToEagle:pe}=await Promise.resolve().then(()=>_ne);return{checkEagleAvailable:ee,addItemsToEagle:pe}},void 0,import.meta.url);if(!await se()){(u||alert)("请先启动 Eagle 应用");return}const re=[];for(const ee of Y){const pe=[];if(ee.mjImages&&ee.mjImages.length>0){const Q=ee._mjAssetIds;if(Q!=null&&Q.length){const{assetStore:me}=await mn(async()=>{const{assetStore:ue}=await Promise.resolve().then(()=>_s);return{assetStore:ue}},void 0,import.meta.url);for(let ue=0;ue1?`-${Q+1}`:""}.${ue}`,annotation:we})}}if(re.length===0){(u||alert)("无法解析素材地址(请确认本地缓存有效)");return}await ie(re),(c||alert)(`已导入 ${re.length} 个素材到 Eagle`)}catch(se){(u||alert)(se instanceof Error?se.message:"导入 Eagle 失败")}},Z=M=>{w(M)};return s.jsxs("div",{className:"fixed inset-0 bg-black/50 z-[100] flex items-center justify-center",onClick:t,children:[s.jsxs("div",{className:`w-[90vw] max-w-[1200px] h-[85vh] rounded-lg shadow-2xl flex flex-col ${n?"bg-[#121214] border-zinc-800":"bg-white border-zinc-200"} border`,onClick:M=>M.stopPropagation(),children:[s.jsxs("div",{className:`p-4 border-b flex justify-between items-center shrink-0 ${n?"border-zinc-800":"border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx("h3",{className:`font-bold text-sm ${n?"text-zinc-300":"text-zinc-700"}`,children:"批量素材管理"}),s.jsxs("span",{className:`text-xs ${n?"text-orange-400":"text-orange-500"}`,children:["已选中 ",i.size," 项"]})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("button",{onClick:()=>F(M=>M+1),className:`p-1.5 rounded transition-colors ${n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800":"text-zinc-500 hover:text-zinc-700 hover:bg-zinc-200"}`,title:"刷新缩略图(重新读取本地缓存)",children:s.jsx(Ch,{size:14})}),s.jsx("button",{onClick:()=>{i.size===r.length?a(new Set):a(new Set(r.map(M=>M.id)))},className:`px-3 py-1.5 text-xs rounded transition-colors ${n?"bg-zinc-800 text-zinc-300 hover:bg-zinc-700":"bg-zinc-100 text-zinc-700 hover:bg-zinc-200"}`,children:"全选"}),s.jsxs("button",{onClick:J,title:"将当前列表中的素材(或已选中的素材)导入到 Eagle,含本地缓存图片与提示词",className:`px-3 py-1.5 text-xs rounded transition-colors flex items-center gap-1.5 ${n?"bg-zinc-800 text-zinc-300 hover:bg-zinc-700":"bg-zinc-100 text-zinc-700 hover:bg-zinc-200"}`,children:[s.jsx(Rp,{size:14}),"Eagle批量导入"]}),s.jsx("button",{onClick:()=>{const M=r.filter(Y=>Y.status==="failed"||b.has(Y.id));M.length!==0&&((async()=>{try{await hN(M)}catch(Y){console.warn("[BatchManageModal] 删除失败项缓存失败:",Y)}o(Y=>Y.filter(se=>se.status!=="failed"&&!b.has(se.id)))})(),a(Y=>{const se=new Set(Y);return M.forEach(ie=>se.delete(ie.id)),se}),g(new Set))},className:`px-3 py-1.5 text-xs rounded transition-colors ${n?"bg-zinc-800 text-zinc-300 hover:bg-zinc-700":"bg-zinc-100 text-zinc-700 hover:bg-zinc-200"}`,title:"删除所有生成失败的记录(包括图片加载失败)",children:"❌ 删除失败"}),s.jsx("button",{onClick:async()=>{if(i.size===0)return;const M=r.filter(Y=>i.has(Y.id));try{await hN(M)}catch(Y){console.warn("[BatchManageModal] 批量删除缓存失败:",Y)}o(Y=>Y.filter(se=>!i.has(se.id))),a(new Set)},className:`px-3 py-1.5 text-xs rounded transition-colors ${n?"bg-zinc-800 text-zinc-300 hover:bg-zinc-700":"bg-zinc-100 text-zinc-700 hover:bg-zinc-200"}`,children:"🗑️ 批量删除"}),s.jsx("button",{onClick:t,children:s.jsx(Qr,{size:16,className:n?"text-zinc-500":"text-zinc-400"})})]})]}),s.jsx("div",{className:"flex-1 overflow-y-auto custom-scrollbar p-4",children:r.length===0?s.jsx("div",{className:`text-center py-20 text-sm ${n?"text-zinc-500":"text-zinc-400"}`,children:"暂无生成历史"}):s.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4",children:r.map(M=>{var Y;return s.jsxs("div",{onClick:()=>{a(se=>{const ie=new Set(se);return ie.has(M.id)?ie.delete(M.id):ie.add(M.id),ie})},onDoubleClick:()=>Z(M),className:`group rounded-lg overflow-hidden border cursor-pointer transition-all ${i.has(M.id)?"border-orange-500 ring-2 ring-orange-500/30":M.status==="failed"||b.has(M.id)?"border-red-500 ring-1 ring-red-500/30":n?"border-zinc-800 hover:border-zinc-700":"border-zinc-200 hover:border-zinc-300"} ${n?"bg-zinc-900":"bg-white"}`,children:[s.jsxs("div",{className:`${M.type==="audio"?"aspect-square":"aspect-video"} bg-zinc-800 relative`,children:[(()=>{var ee,pe;const se=M.url,ie=M.mjImages,oe=v[M.id]||(se&&!se.startsWith("blob:")?se:void 0),re=((ee=z[M.id])!=null&&ee.length?z[M.id]:null)??(ie!=null&&ie.length&&!((pe=ie[0])!=null&&pe.startsWith("blob:"))?ie:[]);return M.type==="video"?oe?s.jsx("video",{src:oe,className:"w-full h-full object-cover",muted:!0,onError:()=>T(M.id)}):s.jsx("div",{className:"w-full h-full flex items-center justify-center text-zinc-500 text-xs",children:"加载中…"}):M.type==="audio"?s.jsxs("div",{className:"w-full h-full flex flex-col items-center justify-center p-4",children:[s.jsx($c,{size:32,className:n?"text-zinc-600":"text-zinc-400"}),s.jsx("span",{className:`text-xs mt-2 text-center line-clamp-2 ${n?"text-zinc-500":"text-zinc-600"}`,children:M.prompt||"音频文件"})]}):re.length>1?s.jsx("div",{className:"w-full h-full grid grid-cols-2 grid-rows-2 gap-0",children:re.slice(0,4).map((we,Q)=>s.jsxs("div",{className:"mj-grid-quadrant relative cursor-pointer hover:opacity-80 transition-opacity",onClick:me=>{var U;me.stopPropagation();const ue=((U=z[M.id])==null?void 0:U[Q])??we;l({...M,url:ue})},children:[s.jsx("img",{src:we,className:"w-full h-full object-cover",alt:"",loading:"eager",onError:()=>T(M.id)}),s.jsx("div",{className:"absolute bottom-0 right-0 bg-black/60 text-white text-[8px] px-1",children:Q+1})]},Q))}):oe?s.jsx("img",{src:oe,className:"w-full h-full object-cover",alt:"",loading:"eager",onError:()=>T(M.id)}):s.jsx("div",{className:"w-full h-full flex items-center justify-center text-zinc-500 text-xs",children:"加载中…"})})(),(M.status==="failed"||b.has(M.id))&&s.jsx("div",{className:"absolute top-2 left-2 px-1.5 py-0.5 text-[9px] rounded bg-red-600 text-white z-10",children:"❌ 失败"}),(v[M.id]||((Y=z[M.id])==null?void 0:Y.length))&&M.status!=="failed"&&!b.has(M.id)&&s.jsx("div",{className:"absolute bottom-1 left-1 px-1.5 py-0.5 text-[8px] rounded-full z-10 flex items-center gap-0.5 bg-emerald-600/80 text-white backdrop-blur-sm shadow-sm",children:"本地缓存"}),s.jsx("button",{onClick:se=>{se.stopPropagation(),l({...M,url:v[M.id]||(M.url&&!M.url.startsWith("blob:")?M.url:"")})},className:"absolute top-2 right-2 p-1.5 rounded-full bg-black/50 text-white opacity-0 group-hover:opacity-100 transition-opacity",title:"查看大图",children:s.jsx(cl,{size:12})}),s.jsx("button",{onClick:se=>{se.stopPropagation(),h(M)},className:"absolute bottom-2 right-2 px-2 py-1 rounded text-[10px] bg-black/50 text-white opacity-0 group-hover:opacity-100 transition-opacity",title:"查看详情",children:"详情"}),i.has(M.id)&&s.jsx("div",{className:"absolute inset-0 bg-orange-500/20 flex items-center justify-center pointer-events-none",children:s.jsx("div",{className:"w-6 h-6 rounded-full bg-orange-500 flex items-center justify-center",children:s.jsx(Eo,{size:14,className:"text-white"})})})]}),s.jsxs("div",{className:"p-2",children:[s.jsx("p",{className:`text-[10px] line-clamp-2 ${n?"text-zinc-400":"text-zinc-600"}`,children:M.prompt||"无提示词"}),s.jsxs("div",{className:"flex items-center justify-between mt-1",children:[s.jsx("span",{className:`text-[9px] ${n?"text-zinc-500":"text-zinc-400"}`,children:M.modelName}),s.jsx("span",{className:`text-[9px] ${n?"text-zinc-500":"text-zinc-400"}`,children:M.type==="audio"&&M.duration?`${Math.floor(M.duration)}s`:M.time})]})]})]},M.id)})})})]}),y&&s.jsx("div",{className:"fixed inset-0 bg-black/90 z-[120] flex items-center justify-center p-4",onClick:()=>w(null),children:s.jsxs("div",{className:"relative w-full h-full flex items-center justify-center",children:[s.jsx("button",{onClick:()=>w(null),className:"absolute top-4 right-4 p-2 rounded-full bg-white/10 hover:bg-white/20 text-white transition-colors z-10",title:"关闭(按 ESC 或点击背景)",children:s.jsx(Qr,{size:24})}),y.type==="video"?s.jsx("video",{src:v[y.id]||(y.url&&!y.url.startsWith("blob:")?y.url:void 0),className:"max-w-[90vw] max-h-[90vh] object-contain rounded-lg",controls:!0,autoPlay:!0,onClick:M=>M.stopPropagation()}):y.type==="audio"?s.jsx("div",{className:`max-w-[600px] w-full p-8 rounded-lg ${n?"bg-zinc-900":"bg-white"}`,onClick:M=>M.stopPropagation(),children:s.jsxs("div",{className:"flex flex-col items-center gap-6",children:[s.jsx($c,{size:64,className:n?"text-zinc-600":"text-zinc-400"}),s.jsx("div",{className:"w-full",children:s.jsx(U0,{audioUrl:E[y.id]||y.audioUrl||y.url,isDark:n,title:y.prompt||"音频",initialDuration:y.duration})}),y.prompt&&s.jsx("p",{className:`text-sm text-center ${n?"text-zinc-400":"text-zinc-600"}`,children:y.prompt})]})}):((B=z[y.id])!=null&&B.length?z[y.id]:((V=y.mjImages)==null?void 0:V.filter(M=>M&&!M.startsWith("blob:")))??[]).length>0?s.jsx("div",{className:"grid grid-cols-2 gap-4 max-w-[90vw] max-h-[90vh]",children:(z[y.id]??((N=y.mjImages)==null?void 0:N.filter(M=>M&&!M.startsWith("blob:")))??[]).slice(0,4).map((M,Y)=>s.jsx("img",{src:M,className:"max-w-[45vw] max-h-[45vh] object-contain rounded-lg",alt:"",onClick:se=>se.stopPropagation()},Y))}):s.jsx("img",{src:v[y.id]||(y.url&&!y.url.startsWith("blob:")?y.url:void 0),className:"max-w-[90vw] max-h-[90vh] object-contain rounded-lg",alt:"",onClick:M=>M.stopPropagation()}),s.jsx("div",{className:"absolute bottom-4 left-1/2 transform -translate-x-1/2 text-white/60 text-xs",children:"按 ESC 或点击背景关闭"})]})}),d&&s.jsx("div",{className:"fixed inset-0 bg-black/60 z-[110] flex items-center justify-center",onClick:()=>h(null),children:s.jsxs("div",{className:`w-[600px] max-h-[80vh] rounded-lg shadow-2xl flex flex-col ${n?"bg-[#1a1a1c] border-zinc-700":"bg-white border-zinc-300"} border`,onClick:M=>M.stopPropagation(),children:[s.jsxs("div",{className:`p-4 border-b flex justify-between items-center ${n?"border-zinc-700":"border-zinc-200"}`,children:[s.jsx("h4",{className:`font-bold text-sm ${n?"text-zinc-300":"text-zinc-700"}`,children:"素材详情"}),s.jsx("button",{onClick:()=>h(null),children:s.jsx(Qr,{size:16,className:n?"text-zinc-500":"text-zinc-400"})})]}),s.jsxs("div",{className:"flex-1 overflow-y-auto p-4 space-y-4 minimal-scrollbar",children:[s.jsx("div",{className:`${d.type==="audio"?"aspect-square":"aspect-video"} bg-zinc-800 rounded-lg overflow-hidden`,children:d.type==="video"?s.jsx("video",{src:v[d.id]||(d.url&&!d.url.startsWith("blob:")?d.url:void 0),className:"w-full h-full object-contain",controls:!0,onError:()=>T(d.id)}):d.type==="audio"?s.jsxs("div",{className:"w-full h-full flex flex-col items-center justify-center p-6",children:[s.jsx($c,{size:48,className:n?"text-zinc-600":"text-zinc-400"}),s.jsx("div",{className:"w-full mt-4",children:s.jsx(U0,{audioUrl:E[d.id]||d.audioUrl||d.url,isDark:n,title:d.prompt||"音频",initialDuration:d.duration})})]}):((j=z[d.id])!=null&&j.length?z[d.id]:((k=d.mjImages)==null?void 0:k.filter(M=>M&&!M.startsWith("blob:")))??[]).length>0?s.jsx("div",{className:"w-full h-full grid grid-cols-2 grid-rows-2 gap-0 p-2",children:(z[d.id]??((W=d.mjImages)==null?void 0:W.filter(M=>M&&!M.startsWith("blob:")))??[]).slice(0,4).map((M,Y)=>s.jsx("img",{src:M,className:"w-full h-full object-cover rounded",alt:"",onError:()=>T(d.id)},Y))}):s.jsx("img",{src:v[d.id]||(d.url&&!d.url.startsWith("blob:")?d.url:void 0),className:"w-full h-full object-contain",alt:"",onError:()=>T(d.id)})}),s.jsx("div",{className:`p-3 rounded-lg ${n?"bg-zinc-800/50":"bg-zinc-50"}`,children:s.jsxs("div",{className:"grid grid-cols-2 gap-2 text-xs",children:[s.jsxs("div",{children:[s.jsx("span",{className:n?"text-zinc-500":"text-zinc-600",children:"模型:"}),s.jsx("span",{className:n?"text-zinc-300":"text-zinc-700",children:d.modelName})]}),s.jsxs("div",{children:[s.jsx("span",{className:n?"text-zinc-500":"text-zinc-600",children:"时间:"}),s.jsx("span",{className:n?"text-zinc-300":"text-zinc-700",children:d.time})]}),s.jsxs("div",{children:[s.jsx("span",{className:n?"text-zinc-500":"text-zinc-600",children:"类型:"}),s.jsx("span",{className:n?"text-zinc-300":"text-zinc-700",children:d.type==="video"?"视频":d.type==="audio"?"音频":"图片"})]}),d.type==="audio"&&d.duration&&s.jsxs("div",{children:[s.jsx("span",{className:n?"text-zinc-500":"text-zinc-600",children:"时长:"}),s.jsxs("span",{className:n?"text-zinc-300":"text-zinc-700",children:[Math.floor(d.duration),"秒"]})]}),d.localCacheUrl&&s.jsx("div",{children:s.jsx("span",{className:`px-2 py-0.5 rounded text-[10px] ${n?"bg-orange-600 text-white":"bg-orange-500 text-white"}`,children:"本地缓存"})})]})}),s.jsxs("div",{className:`p-3 rounded-lg ${n?"bg-zinc-800/50":"bg-zinc-50"}`,children:[s.jsxs("div",{className:"flex items-center justify-between mb-2",children:[s.jsx("span",{className:`text-xs font-medium ${n?"text-zinc-400":"text-zinc-600"}`,children:"历史提示词"}),s.jsx("button",{onClick:()=>X(d.prompt||""),className:`flex items-center gap-1 px-2 py-1 rounded text-xs transition-colors ${p?n?"bg-green-600 text-white":"bg-green-500 text-white":n?"bg-zinc-700 text-zinc-300 hover:bg-zinc-600":"bg-zinc-200 text-zinc-700 hover:bg-zinc-300"}`,disabled:p,children:p?s.jsxs(s.Fragment,{children:[s.jsx(CG,{size:12}),s.jsx("span",{children:"已复制"})]}):s.jsxs(s.Fragment,{children:[s.jsx(Eh,{size:12}),s.jsx("span",{children:"复制"})]})})]}),s.jsx("div",{className:`text-xs p-2 rounded border max-h-[200px] overflow-y-auto ${n?"bg-zinc-900 border-zinc-700 text-zinc-300":"bg-white border-zinc-200 text-zinc-700"}`,children:d.prompt||"无提示词"})]})]}),s.jsx("div",{className:`p-4 border-t flex justify-end ${n?"border-zinc-700":"border-zinc-200"}`,children:s.jsx("button",{onClick:()=>h(null),className:`px-4 py-2 rounded text-sm transition-colors ${n?"bg-zinc-700 text-zinc-300 hover:bg-zinc-600":"bg-zinc-200 text-zinc-700 hover:bg-zinc-300"}`,children:"关闭"})})]})})]})},wte=({isOpen:e,onClose:t,isDark:n,nodes:r=[],history:i=[],onSetHistory:a,autosaveEnabled:o=!1,autosaveIntervalMinutes:l=5,onAutoSaveConfigChange:c,onSaveNow:u,onImportAutoSaveJson:d})=>{const[h,p]=_.useState({totalSize:0,count:0,formattedSize:"0 B"}),[f,b]=_.useState(!1),[g,y]=_.useState(!1),[w,v]=_.useState({current:0,total:0}),[m,z]=_.useState(null),[C,E]=_.useState(null),[I,R]=_.useState(!1),[A,O]=_.useState(null),[F,L]=_.useState(""),[X,T]=_.useState(!1),{config:q,selectDirectory:H,setEnabled:J,syncHistory:Z}=TO(),[B,V]=_.useState(!1),[N,j]=_.useState(null),[k,W]=_.useState(String(l)),[M,Y]=_.useState(!1),[se,ie]=_.useState(!1),[oe,re]=_.useState(null);_.useEffect(()=>{if(!e)return;const le=8e3;(async()=>{b(!0);try{const be=Xr.getStorageUsage(),de=new Promise(ze=>{setTimeout(()=>ze({totalSize:0,count:0,formattedSize:"0 B"}),le)}),$e=await Promise.race([be,de]);p($e)}catch(be){console.error("[StorageManageModal] Failed to load storage usage:",be),p({totalSize:0,count:0,formattedSize:"0 B"})}finally{b(!1)}})()},[e]);const ee=_.useCallback(async()=>{await H()},[H]),pe=_.useCallback(async()=>{if(!(!q.enabled||!i||i.length===0)){V(!0),j(null);try{await Z(i),j(`已同步 ${i.length} 条历史记录到本地缓存`),setTimeout(()=>j(null),3e3)}catch(le){j("同步失败:"+(le instanceof Error?le.message:String(le))),setTimeout(()=>j(null),5e3)}finally{V(!1)}}},[q.enabled,i,Z]);_.useEffect(()=>{W(String(l))},[l,e]),_.useEffect(()=>{if(!e)return;const le=localStorage.getItem("qiaodoumayi_download_directory");L(le||"Qiaodoumayi_Media")},[e]);const we=_.useCallback(async le=>{if(le!=null&&le.trim())try{await yn("open_folder_in_explorer",{path:le.trim()})}catch(fe){const be=fe instanceof Error?fe.message:String(fe);alert(be.includes("Cannot find module")||be.includes("tauri")?"此功能需在桌面应用中运行,请使用 Tauri 启动。":"打开文件夹失败:"+be)}},[]),Q=async()=>{T(!0);try{const le=await bb({directory:!0,multiple:!1,title:"选择下载目录"});if(le&&typeof le=="string"){try{try{const fe=await AO(le);console.log("[StorageManageModal] 目录访问测试:",fe)}catch(fe){console.warn("[StorageManageModal] 目录访问测试失败,但继续保存:",fe)}}catch(fe){console.warn("[StorageManageModal] 无法添加 scope,但继续保存:",fe)}localStorage.setItem("qiaodoumayi_download_directory",le),L(le),console.log("[StorageManageModal] 下载目录已设置:",le),alert(`下载目录设置成功! + +目录:`+le+` + +注意:如果下载时遇到权限问题,请选择系统默认目录(如文档、下载等)。`)}else le===null&&console.log("[StorageManageModal] 用户取消了目录选择")}catch(le){console.error("[StorageManageModal] 选择目录失败:",le);const fe=le instanceof Error?le.message:String(le);fe.includes("not allowed")||fe.includes("Permissions")?alert(`权限错误:对话框功能未授权 + +请确保: +1. 已重启 Tauri 开发服务器 +2. capabilities/default.json 包含 dialog 权限 +3. 如果是打包版本,请重新打包 + +错误详情:`+fe):fe.includes("Cannot find module")?alert(`此功能需要在 Tauri 桌面应用中使用。 + +当前环境:浏览器模式 +请使用 "npm run tauri dev" 启动桌面应用。`):alert("选择目录失败:"+fe)}finally{T(!1)}},me=fr.useRef(0),ue=fr.useRef(null);_.useEffect(()=>{if(!e)return;const le=async()=>{try{const{memoryMonitor:be}=await mn(async()=>{const{memoryMonitor:Ce}=await Promise.resolve().then(()=>aw);return{memoryMonitor:Ce}},void 0,import.meta.url),de=be.getMemoryUsage();if(!de)return;me.current+=1;const $e={used:de.used,total:de.total},ze=ue.current,_e=me.current%3===0,Ee=ze?Math.abs(de.ratio-ze.used/ze.total):1;(!ze||_e||Ee>=.03)&&(ue.current=$e,z(de));try{const{getSystemMemoryInfo:Ce}=await mn(async()=>{const{getSystemMemoryInfo:Ne}=await Promise.resolve().then(()=>nK);return{getSystemMemoryInfo:Ne}},void 0,import.meta.url),xe=await Ce();E(xe)}catch(Ce){console.warn("[StorageManageModal] Failed to get system memory info:",Ce)}}catch(be){console.error("[StorageManageModal] Failed to get memory usage:",be)}};le();const fe=setInterval(le,5e3);return()=>clearInterval(fe)},[e]);const U=async()=>{if(!I){R(!0),O(null);try{const{memoryMonitor:le}=await mn(async()=>{const{memoryMonitor:$e}=await Promise.resolve().then(()=>aw);return{memoryMonitor:$e}},void 0,import.meta.url),fe=i||void 0,be=await le.fullCleanup(r,fe);if(be.historyItemsRemoved>0&&a&&i){const ze=typeof navigator<"u"&&(navigator.platform.toLowerCase().includes("mac")||navigator.platform.toLowerCase().includes("win")||navigator.userAgent.toLowerCase().includes("mac")||navigator.userAgent.toLowerCase().includes("win"))?500:200,_e=le.cleanupHistory(fe||[],ze);a(_e)}const de=le.getMemoryUsage();z(de),O(`清理完成! +- 清理节点资源: ${be.nodeResourcesCleaned} 个 +- 清理历史记录: ${be.historyItemsRemoved} 条 +- 清理缓存: ${be.cachesCleared?"是":"否"}`),setTimeout(()=>O(null),5e3)}catch(le){console.error("[StorageManageModal] Memory cleanup failed:",le),O("清理失败:"+(le instanceof Error?le.message:String(le))),setTimeout(()=>O(null),5e3)}finally{R(!1)}}},G=async()=>{if(h.count===0){alert("没有可导出的资源");return}if(confirm(`确定要导出所有 ${h.count} 个资源吗? +总大小: ${h.formattedSize}`)){y(!0),v({current:0,total:h.count});try{const le=(await mn(async()=>{const{default:Ee}=await Promise.resolve().then(()=>C4);return{default:Ee}},void 0,import.meta.url)).default,fe=await Xr.getAllAssetIds(),be=new le;let de=0;for(const Ee of fe)try{const Ce=await Xr.getAssetRecord(Ee);if(!Ce||!Ce.blob)continue;const xe=Ce.mimeType||Ce.blob.type;let Ne="bin";xe.startsWith("image/")?Ne=xe.split("/")[1]||"png":xe.startsWith("video/")?Ne=xe.split("/")[1]||"mp4":xe.startsWith("audio/")&&(Ne=xe.split("/")[1]||"mp3"),be.file(`${Ee}.${Ne}`,Ce.blob),de++,v({current:de,total:fe.length})}catch(Ce){console.error(`[StorageManageModal] Failed to export asset ${Ee}:`,Ce)}const $e=await be.generateAsync({type:"blob"}),ze=URL.createObjectURL($e),_e=document.createElement("a");_e.href=ze,_e.download=`qiaodoumayi-assets-${new Date().toISOString().split("T")[0]}.zip`,document.body.appendChild(_e),_e.click(),document.body.removeChild(_e),URL.revokeObjectURL(ze)}catch(le){console.error("[StorageManageModal] Failed to export assets:",le),alert("导出失败:"+(le instanceof Error?le.message:String(le)))}finally{y(!1),v({current:0,total:0})}}},te=_.useCallback(async()=>{if(!(!u||M)){Y(!0),re(null);try{const le=await u();le?(re("已保存到:"+le.split(/[/\\]/).slice(-2).join("/")),setTimeout(()=>re(null),4e3)):(re("保存失败:请先启用资源缓存目录"),setTimeout(()=>re(null),5e3))}catch(le){re("保存失败:"+(le instanceof Error?le.message:String(le))),setTimeout(()=>re(null),5e3)}finally{Y(!1)}}},[u,M]),ge=_.useCallback(async()=>{if(!(!d||se)){ie(!0),re(null);try{await d((le,fe)=>{re(`${Math.round(le)}% - ${fe}`)}),re("导入成功"),setTimeout(()=>re(null),3e3),t()}catch(le){re("导入失败:"+(le instanceof Error?le.message:String(le))),setTimeout(()=>re(null),5e3)}finally{ie(!1)}}},[d,se,t]),ne=async()=>{if(!(h.count===0||f)){b(!0);try{await Xr.clearAll()&&p({totalSize:0,count:0,formattedSize:"0 B"})}catch(le){console.error("[StorageManageModal] Failed to clear cache:",le)}finally{b(!1)}}};return e?s.jsx("div",{className:"fixed inset-0 bg-black/50 z-[100] flex items-center justify-center p-4",onClick:t,children:s.jsxs("div",{className:`w-[700px] max-h-[90vh] rounded-lg shadow-2xl flex flex-col ${n?"bg-[#121214] border-zinc-800":"bg-white border-zinc-200"} border`,onClick:le=>le.stopPropagation(),children:[s.jsxs("div",{className:`p-4 border-b flex justify-between items-center shrink-0 ${n?"border-zinc-800":"border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(hm,{size:18,className:n?"text-zinc-300":"text-zinc-700"}),s.jsx("h3",{className:`font-bold text-sm ${n?"text-zinc-300":"text-zinc-700"}`,children:"本地存储管理"})]}),s.jsx("button",{onClick:t,className:`p-1 rounded transition-colors ${n?"hover:bg-zinc-800 text-zinc-400":"hover:bg-zinc-100 text-zinc-500"}`,children:s.jsx(Qr,{size:18})})]}),s.jsx("div",{className:"flex-1 overflow-y-auto p-6 custom-scrollbar",children:s.jsxs("div",{className:"space-y-6",children:[s.jsxs("div",{className:`p-4 rounded-lg border ${n?"bg-zinc-900/50 border-zinc-800":"bg-zinc-50 border-zinc-200"}`,children:[s.jsx("div",{className:"flex items-center justify-between mb-3",children:s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(Ll,{size:16,className:n?"text-blue-400":"text-blue-600"}),s.jsx("h4",{className:`font-semibold text-sm ${n?"text-zinc-200":"text-zinc-800"}`,children:"下载目录设置"})]})}),s.jsxs("div",{className:"space-y-3",children:[s.jsx("div",{className:`p-3 rounded ${n?"bg-zinc-800/50":"bg-white"}`,children:s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsx("span",{className:`text-xs ${n?"text-zinc-400":"text-zinc-600"}`,children:"当前下载目录"}),s.jsx("span",{className:`text-xs font-medium ${n?"text-zinc-200":"text-zinc-800"}`,children:F||"未设置(使用默认目录)"})]})}),s.jsxs("div",{className:"flex gap-2",children:[s.jsx("button",{onClick:Q,disabled:X,className:`flex-1 px-4 py-2 rounded-lg text-sm font-medium transition-colors flex items-center justify-center gap-2 ${X?"bg-zinc-600 text-zinc-400 cursor-not-allowed":n?"bg-blue-600 hover:bg-blue-700 text-white":"bg-blue-500 hover:bg-blue-600 text-white"}`,children:X?s.jsxs(s.Fragment,{children:[s.jsx(zr,{size:16,className:"animate-spin"}),"选择中..."]}):s.jsxs(s.Fragment,{children:[s.jsx(Ll,{size:16}),"选择下载目录"]})}),F&&F!=="Qiaodoumayi_Media"&&s.jsxs("button",{onClick:()=>we(F),title:"在资源管理器中打开",className:`flex items-center justify-center gap-1.5 px-3 py-2 rounded-lg text-sm font-medium transition-colors ${n?"bg-emerald-600 hover:bg-emerald-700 text-white":"bg-emerald-500 hover:bg-emerald-600 text-white"}`,children:[s.jsx(Tv,{size:16}),"打开文件夹"]})]}),s.jsx("p",{className:`text-[10px] ${n?"text-zinc-500":"text-zinc-400"}`,children:"设置后,所有下载的文件将保存到指定目录。首次设置后,后续下载将自动使用该目录。"})]})]}),s.jsxs("div",{className:`p-4 rounded-lg border ${n?"bg-zinc-900/50 border-zinc-800":"bg-zinc-50 border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center justify-between mb-3",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(RG,{size:16,className:n?"text-emerald-400":"text-emerald-600"}),s.jsx("h4",{className:`font-semibold text-sm ${n?"text-zinc-200":"text-zinc-800"}`,children:"资源缓存目录"})]}),s.jsx("div",{className:"flex items-center gap-1.5",children:q.enabled&&xr.isAvailable()?s.jsxs("span",{className:"flex items-center gap-1 text-[10px] text-emerald-500",children:[s.jsx(Aw,{size:12}),"已启用"]}):q.enabled&&!xr.isAvailable()?s.jsxs("span",{className:"flex items-center gap-1 text-[10px] text-amber-500",children:[s.jsx(wj,{size:12}),"需重新授权"]}):s.jsx("span",{className:`text-[10px] ${n?"text-zinc-500":"text-zinc-400"}`,children:"未启用"})})]}),s.jsxs("div",{className:"space-y-3",children:[s.jsx("div",{className:`p-3 rounded ${n?"bg-zinc-800/50":"bg-white"}`,children:s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsx("span",{className:`text-xs ${n?"text-zinc-400":"text-zinc-600"}`,children:"缓存目录"}),s.jsx("span",{className:`text-xs font-medium truncate max-w-[200px] ${n?"text-zinc-200":"text-zinc-800"}`,title:q.directoryPath||"未选择",children:q.directoryPath||"未选择"})]})}),q.enabled&&!xr.isAvailable()&&s.jsxs("div",{className:`p-2.5 rounded text-xs flex items-start gap-2 ${n?"bg-amber-900/20 text-amber-300 border border-amber-800/50":"bg-amber-50 text-amber-700 border border-amber-200"}`,children:[s.jsx(wj,{size:14,className:"shrink-0 mt-0.5"}),s.jsx("span",{children:'页面刷新后目录访问权限已丢失,请点击"重新授权"按钮重新选择缓存目录以恢复缓存功能。'})]}),s.jsxs("div",{className:"flex gap-2 flex-wrap",children:[s.jsx("button",{onClick:ee,className:`flex-1 min-w-0 px-3 py-1.5 rounded-lg text-xs font-medium transition-colors flex items-center justify-center gap-1.5 ${n?"bg-emerald-600 hover:bg-emerald-700 text-white":"bg-emerald-500 hover:bg-emerald-600 text-white"}`,children:q.enabled&&!xr.isAvailable()?s.jsxs(s.Fragment,{children:[s.jsx(pj,{size:14}),"重新授权"]}):s.jsxs(s.Fragment,{children:[s.jsx(Ll,{size:14}),q.directoryPath?"更换目录":"选择缓存目录"]})}),q.directoryPath&&s.jsxs("button",{onClick:()=>we(q.directoryPath),title:"在资源管理器中打开",className:`flex items-center justify-center gap-1.5 px-3 py-1.5 rounded-lg text-xs font-medium transition-colors ${n?"bg-emerald-600 hover:bg-emerald-700 text-white":"bg-emerald-500 hover:bg-emerald-600 text-white"}`,children:[s.jsx(Tv,{size:14}),"打开文件夹"]}),q.enabled&&xr.isAvailable()&&s.jsxs("button",{onClick:pe,disabled:B||!i||i.length===0,className:`px-3 py-1.5 rounded-lg text-xs font-medium transition-colors flex items-center justify-center gap-1.5 ${B||!i||i.length===0?"bg-zinc-600 text-zinc-400 cursor-not-allowed":n?"bg-zinc-700 hover:bg-zinc-600 text-zinc-200":"bg-zinc-200 hover:bg-zinc-300 text-zinc-700"}`,title:"将历史记录同步到本地缓存",children:[B?s.jsx(zr,{size:14,className:"animate-spin"}):s.jsx(pj,{size:14}),"同步历史"]}),q.enabled&&s.jsxs("button",{onClick:()=>J(!1),className:`px-3 py-1.5 rounded-lg text-xs font-medium transition-colors flex items-center justify-center gap-1.5 ${n?"bg-zinc-700 hover:bg-zinc-600 text-zinc-300":"bg-zinc-200 hover:bg-zinc-300 text-zinc-600"}`,title:"禁用本地缓存(不会删除已缓存的文件)",children:[s.jsx(Qr,{size:14}),"禁用"]})]}),N&&s.jsx("div",{className:`p-2 rounded text-xs ${n?"bg-emerald-900/30 text-emerald-300":"bg-emerald-50 text-emerald-700"}`,children:N}),s.jsx("p",{className:`text-[10px] ${n?"text-zinc-500":"text-zinc-400"}`,children:"选择一个本地目录后,AI 生成或远程下载的素材将按类型(图片/视频/音频)分类缓存;从本机文件夹拖入画布或从剪贴板粘贴的素材会统一写入同目录下的 local 文件夹。 当浏览器清理 IndexedDB 或页面刷新导致 Blob URL 失效时,可从本地缓存自动恢复。 导出项目时也会优先从本地缓存读取,提升导出速度。"})]})]}),s.jsxs("div",{className:`p-4 rounded-lg border ${n?"bg-zinc-900/50 border-zinc-800":"bg-zinc-50 border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center justify-between mb-3",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(xu,{size:16,className:n?"text-amber-400":"text-amber-600"}),s.jsx("h4",{className:`font-semibold text-sm ${n?"text-zinc-200":"text-zinc-800"}`,children:"工作流自动保存"})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:`text-[10px] ${n?"text-zinc-500":"text-zinc-400"}`,children:"防止画布卡死、白屏丢失内容"}),s.jsxs("label",{className:"flex items-center gap-1.5 cursor-pointer",children:[s.jsx("input",{type:"checkbox",checked:o,onChange:le=>c==null?void 0:c(le.target.checked,l),className:"rounded border-zinc-500"}),s.jsx("span",{className:`text-xs ${n?"text-zinc-400":"text-zinc-600"}`,children:"启用"})]})]})]}),s.jsxs("div",{className:"space-y-3",children:[s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx("span",{className:`text-xs ${n?"text-zinc-400":"text-zinc-600"}`,children:"保存间隔(分钟)"}),s.jsx("input",{type:"number",min:1,max:60,value:k,onChange:le=>W(le.target.value),onBlur:()=>{const le=Math.min(60,Math.max(1,parseInt(k,10)||5));W(String(le)),c==null||c(o,le)},className:`w-16 px-2 py-1 text-xs rounded border ${n?"bg-zinc-800 border-zinc-600 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`}),s.jsx("span",{className:`text-[10px] ${n?"text-zinc-500":"text-zinc-400"}`,children:"保存到资源缓存目录 / autosave /"})]}),s.jsxs("div",{className:"flex gap-2 flex-wrap",children:[s.jsxs("button",{onClick:te,disabled:M||!q.enabled||!xr.isAvailable(),className:`flex items-center justify-center gap-1.5 px-3 py-1.5 rounded-lg text-xs font-medium transition-colors ${M||!q.enabled||!xr.isAvailable()?"bg-zinc-600 text-zinc-400 cursor-not-allowed":n?"bg-amber-600 hover:bg-amber-700 text-white":"bg-amber-500 hover:bg-amber-600 text-white"}`,title:"立即保存工作流 JSON 到 autosave 目录",children:[M?s.jsx(zr,{size:14,className:"animate-spin"}):s.jsx(xu,{size:14}),"立即保存"]}),s.jsxs("button",{onClick:ge,disabled:se||!d,className:`flex items-center justify-center gap-1.5 px-3 py-1.5 rounded-lg text-xs font-medium transition-colors ${se||!d?"bg-zinc-600 text-zinc-400 cursor-not-allowed":n?"bg-blue-600 hover:bg-blue-700 text-white":"bg-blue-500 hover:bg-blue-600 text-white"}`,title:"从自动保存的 JSON 恢复工作流",children:[se?s.jsx(zr,{size:14,className:"animate-spin"}):s.jsx(OG,{size:14}),"导入自动保存"]})]}),oe&&s.jsx("div",{className:`p-2 rounded text-xs ${oe.includes("失败")?"bg-red-900/30 text-red-300":n?"bg-emerald-900/30 text-emerald-300":"bg-emerald-50 text-emerald-700"}`,children:oe}),s.jsx("p",{className:`text-[10px] ${n?"text-zinc-500":"text-zinc-400"}`,children:"仅保存工作流结构及画布节点引用的图像/视频素材信息(JSON),素材从资源缓存目录读取。文件名格式:项目名_时间.json。"})]})]}),s.jsxs("div",{className:`p-4 rounded-lg border ${n?"bg-zinc-900/50 border-zinc-800":"bg-zinc-50 border-zinc-200"}`,children:[s.jsx("div",{className:"flex items-center justify-between mb-3",children:s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(EP,{size:16,className:n?"text-blue-400":"text-blue-600"}),s.jsx("h4",{className:`font-semibold text-sm ${n?"text-zinc-200":"text-zinc-800"}`,children:"内存管理"})]})}),m&&s.jsxs("div",{className:`mb-3 p-3 rounded-lg border ${n?"bg-zinc-800/50 border-zinc-700":"bg-white border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center justify-between mb-2",children:[s.jsx("span",{className:`text-xs ${n?"text-zinc-400":"text-zinc-600"}`,children:"JavaScript 堆内存"}),s.jsx("span",{className:`text-xs font-medium ${m.ratio>=.85?"text-red-500":m.ratio>=.75?"text-yellow-500":"text-green-500"}`,children:m.formatted})]}),s.jsx("div",{className:`h-3 rounded-full border ${n?"bg-zinc-900 border-zinc-700":"bg-zinc-50 border-zinc-300"}`,children:s.jsx("div",{className:`h-full rounded-full transition-all duration-300 ${m.ratio>=.85?"bg-red-500":m.ratio>=.75?"bg-yellow-500":"bg-green-500"}`,style:{width:`${Math.min(m.ratio*100,100)}%`}})}),C&&s.jsx("div",{className:`mt-2 pt-2 border-t ${n?"border-zinc-700":"border-zinc-200"}`,children:s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsx("span",{className:`text-xs ${n?"text-zinc-400":"text-zinc-600"}`,children:"系统总内存(Rust 后端可用)"}),s.jsxs("span",{className:`text-xs font-medium ${n?"text-blue-400":"text-blue-600"}`,children:[C.total_memory_gb.toFixed(2)," GB"]})]})})]}),s.jsxs("div",{className:"space-y-2",children:[s.jsx("button",{onClick:U,disabled:I,className:`w-full px-3 py-1.5 rounded-lg text-xs font-medium transition-colors flex items-center justify-center gap-2 ${I?"bg-zinc-600 text-zinc-400 cursor-not-allowed":n?"bg-red-600 hover:bg-red-700 text-white":"bg-red-500 hover:bg-red-600 text-white"}`,children:I?s.jsxs(s.Fragment,{children:[s.jsx(zr,{size:14,className:"animate-spin"}),"清理中..."]}):s.jsxs(s.Fragment,{children:[s.jsx(Zi,{size:14}),"清理内存"]})}),A&&s.jsx("div",{className:`p-2 rounded text-xs whitespace-pre-line ${n?"bg-blue-900/30 text-blue-300":"bg-blue-50 text-blue-700"}`,children:A}),s.jsx("p",{className:`text-[10px] ${n?"text-zinc-500":"text-zinc-400"}`,children:"清理将释放:节点Blob URL、历史记录(Mac/Windows保留最新500条,其他200条)、缩略图缓存、内容缓存"})]})]}),s.jsxs("div",{className:`p-4 rounded-lg border ${n?"bg-zinc-900/50 border-zinc-800":"bg-zinc-50 border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center justify-between mb-2",children:[s.jsx("span",{className:`text-sm font-medium ${n?"text-zinc-300":"text-zinc-700"}`,children:"存储使用情况"}),f&&s.jsxs("span",{className:"flex items-center gap-1 text-xs text-zinc-400",children:[s.jsx(zr,{size:12,className:"animate-spin"}),"计算中..."]})]}),s.jsxs("div",{className:"space-y-2 mb-3",children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsx("span",{className:`text-xs ${n?"text-zinc-400":"text-zinc-600"}`,children:"资源数量"}),s.jsx("span",{className:`text-sm font-semibold ${n?"text-zinc-200":"text-zinc-800"}`,children:f?"—":`${h.count} 个`})]}),s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsx("span",{className:`text-xs ${n?"text-zinc-400":"text-zinc-600"}`,children:"占用空间"}),s.jsx("span",{className:`text-sm font-semibold ${n?"text-zinc-200":"text-zinc-800"}`,children:f?"—":h.formattedSize})]})]}),s.jsxs("div",{className:"flex gap-2",children:[s.jsx("button",{onClick:G,disabled:g||h.count===0,className:`flex-1 flex items-center justify-center gap-1.5 px-2.5 py-1.5 rounded text-xs font-medium transition-colors border ${g||h.count===0?n?"bg-zinc-800 border-zinc-700 text-zinc-500 cursor-not-allowed":"bg-zinc-100 border-zinc-300 text-zinc-400 cursor-not-allowed":"bg-blue-600 border-blue-500 text-white hover:bg-blue-700"}`,children:g?s.jsxs(s.Fragment,{children:[s.jsx(zr,{size:12,className:"animate-spin"}),s.jsxs("span",{children:["导出中... (",w.current,"/",w.total,")"]})]}):s.jsxs(s.Fragment,{children:[s.jsx(mu,{size:12}),s.jsx("span",{children:"导出所有资源"})]})}),s.jsx("button",{onClick:ne,disabled:f||h.count===0,className:`flex items-center justify-center gap-1.5 px-2.5 py-1.5 rounded text-xs font-medium transition-colors border ${f||h.count===0?n?"bg-zinc-800 border-zinc-700 text-zinc-500 cursor-not-allowed":"bg-zinc-100 border-zinc-300 text-zinc-400 cursor-not-allowed":"bg-red-600 border-red-500 text-white hover:bg-red-700"}`,title:"清空所有缓存",children:s.jsx(Zi,{size:12})})]})]})]})})]})}):null},_N="https://ai.comfly.chat/sora/v1/characters",_te=({isOpen:e,onClose:t,isDark:n,history:r,apiConfigs:i,globalApiKey:a,onSetCharacterLibrary:o})=>{const[l,c]=_.useState("url"),[u,d]=_.useState(""),[h,p]=_.useState(""),[f,b]=_.useState(1),[g,y]=_.useState(3),[w,v]=_.useState(""),[m,z]=_.useState(!1),[C,E]=_.useState(!1),[I,R]=_.useState(!1);if(!e)return null;const A=async()=>{if(l==="url"&&!u.trim()){alert("请输入视频 URL");return}if(l==="history"&&!h){alert("请选择历史记录中的视频");return}const O=g-f;if(O<1||O>3){alert("时间范围必须在 1-3 秒之间");return}z(!0);try{const F=i.find(k=>k.type==="Video"&&k.id==="sora-2-pro")||i.find(k=>k.type==="Video"&&k.id==="sora-2");if(console.log("[Create Character] Sora config:",F),!F){alert("未找到 Sora 2 模型配置,请先在设置中配置 Sora 2 或 Sora 2 Pro"),z(!1);return}const L=F.key||a;if(!L){alert("请先配置 API Key"),z(!1);return}let X=u,T=null;if(l==="history"&&h){const k=r.find(M=>M.id===h);k!=null&&k.url&&(X=k.url);const W=(k==null?void 0:k.characterSourceTaskId)||(k==null?void 0:k.remoteTaskId);W&&(T=W)}const q=(F.url||"https://ai.comfly.chat").replace(/\/+$/,""),H=w.trim()||`${q}/sora/v1/characters`,J=`${f},${g}`,Z=X.trim(),B=l==="history"&&!!T;let V=B?{from_task:T,timestamps:J}:{url:Z,timestamps:J};console.log("[Create Character] Request:",{endpoint:H,payload:V});let N=await fetch(H,{method:"POST",headers:{Authorization:`Bearer ${L}`,"Content-Type":"application/json"},body:JSON.stringify(V)});if(!N.ok){let k=await N.text();console.error("[Create Character] API Error:",{status:N.status,errText:k});const W=/任务不存在|get_origin_task_failed/i.test(k);if(B&&W&&Z.startsWith("http")&&!Z.startsWith("blob:")&&(console.warn("[Create Character] from_task 失败,改用 url 重试"),V={url:Z,timestamps:J},N=await fetch(H,{method:"POST",headers:{Authorization:`Bearer ${L}`,"Content-Type":"application/json"},body:JSON.stringify(V)}),N.ok||(k=await N.text(),console.error("[Create Character] url 重试仍失败:",k))),!N.ok){if(N.status===500||k.includes("get_origin_task_failed")||k.includes("任务不存在")){alert(`创建失败:服务端无法根据任务 ID 找到原视频,或任务已过期。 + +请确认:1)视频为 Sora2 生成且含音频;2)外链 mp4 须公网可访问(部分 OSS 会拦境外 IP);3)换时段重试若出现连接被关闭。`),z(!1);return}throw new Error(`API错误 (${N.status}): ${k}`)}}const j=await N.json();if(console.log("[Create Character] Success:",j),j.id&&j.username){const k=async Y=>{if(!Y||Y.startsWith("data:"))return Y;try{const ie=await(await fetch(Y)).blob();return new Promise(oe=>{const re=new FileReader;re.onloadend=()=>oe(re.result),re.onerror=()=>oe(Y),re.readAsDataURL(ie)})}catch{return Y}};let W=j.profile_picture_url||"";if(W&&W.startsWith("http"))try{W=await k(W),console.log("[角色库] 图片已转为本地DataURL")}catch(Y){console.warn("[角色库] 图片转换失败,使用原URL:",Y)}const M={id:j.id,name:j.username,imageUrl:W};o(Y=>[...Y,M]),R(!0),setTimeout(()=>{t(),d(""),p(""),v(""),b(1),y(3),R(!1)},1e3)}else throw new Error("返回数据缺少 id 或 username")}catch(F){console.error("创建角色失败:",F),alert("创建角色失败,请重试")}finally{z(!1)}};return s.jsx("div",{className:"fixed inset-0 bg-black/50 z-[100] flex items-center justify-center",onClick:t,children:s.jsxs("div",{className:`w-[500px] max-h-[90vh] overflow-y-auto rounded-lg shadow-2xl flex flex-col relative ${n?"bg-[#121214] border-zinc-800":"bg-white border-zinc-200"} border`,onClick:O=>O.stopPropagation(),children:[I&&s.jsx("div",{className:"absolute inset-0 z-50 flex items-center justify-center bg-black/60 rounded-lg backdrop-blur-sm",children:s.jsxs("div",{className:"text-center",children:[s.jsx("div",{className:"inline-flex items-center justify-center w-20 h-20 rounded-full bg-green-500 mb-4 animate-bounce",children:s.jsx("svg",{className:"w-10 h-10 text-white",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:s.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:3,d:"M5 13l4 4L19 7"})})}),s.jsx("div",{className:"text-white text-lg font-bold",children:"角色创建成功!"})]})}),s.jsxs("div",{className:`p-4 border-b flex justify-between items-center ${n?"border-zinc-800":"border-zinc-200"}`,children:[s.jsx("h3",{className:`font-bold text-sm ${n?"text-zinc-300":"text-zinc-700"}`,children:"新建角色"}),s.jsx("button",{onClick:t,children:s.jsx(Qr,{size:16,className:n?"text-zinc-500":"text-zinc-400"})})]}),s.jsxs("div",{className:"p-4 space-y-4",children:[s.jsxs("div",{children:[s.jsx("label",{className:`block text-xs mb-2 ${n?"text-zinc-300":"text-zinc-700"}`,children:"视频源"}),s.jsxs("div",{className:"flex gap-2 mb-2",children:[s.jsx("button",{onClick:()=>c("url"),className:`px-3 py-1.5 text-xs rounded transition-colors ${l==="url"?n?"bg-blue-600 text-white":"bg-blue-500 text-white":n?"bg-zinc-800 text-zinc-400 hover:bg-zinc-700":"bg-zinc-100 text-zinc-600 hover:bg-zinc-200"}`,children:"输入视频 URL"}),s.jsx("button",{onClick:()=>c("history"),className:`px-3 py-1.5 text-xs rounded transition-colors ${l==="history"?n?"bg-blue-600 text-white":"bg-blue-500 text-white":n?"bg-zinc-800 text-zinc-400 hover:bg-zinc-700":"bg-zinc-100 text-zinc-600 hover:bg-zinc-200"}`,children:"从历史记录选择"})]}),l==="url"?s.jsx("input",{type:"text",value:u,onChange:O=>d(O.target.value),placeholder:"输入视频 URL...",className:`w-full px-3 py-2 text-xs rounded border outline-none ${n?"bg-zinc-900 border-zinc-700 text-zinc-200 placeholder-zinc-600":"bg-white border-zinc-300 text-zinc-800 placeholder-zinc-400"}`}):s.jsxs("div",{className:"relative",children:[s.jsxs("div",{onClick:()=>E(!C),className:`w-full px-3 py-2 text-xs rounded border outline-none cursor-pointer flex items-center justify-between ${n?"bg-zinc-900 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,children:[s.jsx("span",{className:h?"":"opacity-60",children:h?(()=>{const O=r.find(F=>F.id===h);return O?`${(O.prompt||"未命名").slice(0,40)}... - ${O.time}`:"选择历史记录中的视频..."})():"选择历史记录中的视频..."}),s.jsx(Ja,{size:14,className:`transition-transform ${C?"rotate-90":""}`})]}),C&&s.jsx("div",{className:`absolute z-50 w-full mt-1 rounded-lg border shadow-xl max-h-80 overflow-y-auto custom-scrollbar ${n?"bg-zinc-900 border-zinc-700":"bg-white border-zinc-300"}`,children:r.filter(O=>O.type==="video"&&O.status==="completed"&&O.url).length===0?s.jsx("div",{className:`p-4 text-xs text-center ${n?"text-zinc-500":"text-zinc-400"}`,children:"暂无已完成的视频"}):r.filter(O=>O.type==="video"&&O.status==="completed"&&O.url).map(O=>s.jsxs("div",{onClick:()=>{p(O.id),E(!1),O.url&&d(O.url)},className:`flex items-center gap-3 p-2 cursor-pointer transition-colors ${n?"hover:bg-zinc-800":"hover:bg-zinc-100"}`,children:[s.jsx("div",{className:`w-20 h-12 flex-shrink-0 rounded overflow-hidden ${n?"bg-zinc-800":"bg-zinc-200"}`,children:s.jsx("video",{src:O.url,className:"w-full h-full object-cover",muted:!0,preload:"metadata"})}),s.jsxs("div",{className:"flex-1 min-w-0",children:[s.jsx("div",{className:`text-xs font-medium truncate ${n?"text-zinc-200":"text-zinc-800"}`,children:(O.prompt||"未命名视频").slice(0,50)}),s.jsxs("div",{className:`text-[10px] mt-0.5 flex items-center gap-2 ${n?"text-zinc-500":"text-zinc-400"}`,children:[s.jsx("span",{children:O.modelName||"未知模型"}),s.jsx("span",{children:"•"}),s.jsx("span",{children:O.time})]})]})]},O.id))}),C&&s.jsx("div",{className:"fixed inset-0 z-40",onClick:()=>E(!1)})]}),u&&s.jsx("div",{className:"mt-2",onClick:O=>O.stopPropagation(),onMouseDown:O=>O.stopPropagation(),children:s.jsx("video",{controls:!0,className:"w-full h-40 object-contain bg-black rounded-lg",src:u,onClick:O=>{O.stopPropagation()},onMouseDown:O=>{O.stopPropagation()},onPlay:O=>{const F=O.currentTarget;F.setAttribute("data-user-controlled","true"),F.setAttribute("data-user-playing","true")},onPause:O=>{const F=O.currentTarget;F.setAttribute("data-user-controlled","true"),F.setAttribute("data-user-playing","false")},onDoubleClick:O=>{O.preventDefault(),O.stopPropagation()}})})]}),s.jsxs("div",{children:[s.jsx("label",{className:`block text-xs mb-2 ${n?"text-zinc-300":"text-zinc-700"}`,children:"时间范围(秒,间隔需在 1-3 秒之间)"}),s.jsxs("div",{className:"flex gap-2 items-center",children:[s.jsx("input",{type:"number",min:"0",step:"0.1",value:f,onChange:O=>b(parseFloat(O.target.value)||0),className:`w-20 px-2 py-1.5 text-xs rounded border outline-none ${n?"bg-zinc-900 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`}),s.jsx("span",{className:`text-xs ${n?"text-zinc-400":"text-zinc-500"}`,children:"到"}),s.jsx("input",{type:"number",min:"0",step:"0.1",value:g,onChange:O=>y(parseFloat(O.target.value)||0),className:`w-20 px-2 py-1.5 text-xs rounded border outline-none ${n?"bg-zinc-900 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`}),s.jsxs("span",{className:`text-xs ${n?"text-zinc-400":"text-zinc-500"}`,children:["秒(间隔: ",(g-f).toFixed(1),"s)"]})]})]}),s.jsxs("div",{children:[s.jsx("label",{className:`block text-xs mb-2 ${n?"text-zinc-300":"text-zinc-700"}`,children:"API 接口地址 (API Endpoint)"}),s.jsx("input",{type:"text",value:w,onChange:O=>v(O.target.value),placeholder:_N,className:`w-full px-3 py-2 text-xs rounded border outline-none font-mono ${n?"bg-zinc-900 border-zinc-700 text-zinc-200 placeholder-zinc-600":"bg-white border-zinc-300 text-zinc-800 placeholder-zinc-400"}`,onFocus:O=>{O.target.value||v(_N)}}),s.jsx("p",{className:`text-[10px] mt-1 ${n?"text-zinc-500":"text-zinc-400"}`,children:"默认自动填充,可根据服务商要求修改路径"})]}),s.jsxs("div",{className:"flex justify-end gap-2 pt-2",children:[s.jsx("button",{onClick:t,className:`px-4 py-2 text-xs rounded transition-colors ${n?"bg-zinc-800 text-zinc-300 hover:bg-zinc-700":"bg-zinc-100 text-zinc-700 hover:bg-zinc-200"}`,children:"取消"}),s.jsx("button",{onClick:A,disabled:m,className:`px-4 py-2 text-xs rounded transition-all transform active:scale-95 ${m?"bg-zinc-400 text-zinc-200 cursor-not-allowed":n?"bg-blue-600 text-white hover:bg-blue-500 hover:shadow-lg":"bg-blue-500 text-white hover:bg-blue-600 hover:shadow-lg"}`,children:m?s.jsxs("span",{className:"flex items-center gap-2",children:[s.jsxs("svg",{className:"animate-spin h-3 w-3",viewBox:"0 0 24 24",children:[s.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4",fill:"none"}),s.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})]}),"创建中..."]}):"创建角色"})]})]})]})})},zte=({isOpen:e,isDark:t,characterLibrary:n,onClose:r,onCreateCharacter:i,onDeleteCharacter:a})=>s.jsxs("div",{className:`absolute left-0 top-2 bottom-2 w-[240px] z-40 flex flex-col transition-all duration-300 ease-in-out rounded-2xl ${e?"translate-x-0":"-translate-x-full"} ${t?"bg-[#121214] border border-zinc-800 shadow-xl":"bg-zinc-50 border border-zinc-200 shadow-xl"}`,style:{pointerEvents:e?"auto":"none"},children:[s.jsxs("div",{className:`p-3 border-b flex justify-between items-center ${t?"border-zinc-800":"border-zinc-200"}`,children:[s.jsx("h3",{className:`font-bold text-xs ${t?"text-zinc-300":"text-zinc-700"}`,children:"Sora 角色库"}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("button",{onClick:i,className:`px-2 py-1 text-[10px] rounded transition-colors ${t?"bg-blue-600 hover:bg-blue-500 text-white":"bg-blue-500 hover:bg-blue-600 text-white"}`,children:"新建角色"}),s.jsx("button",{onClick:r,children:s.jsx(Qr,{size:12,className:t?"text-zinc-500":"text-zinc-400"})})]})]}),s.jsx("div",{className:"flex-1 overflow-y-auto custom-scrollbar p-3",children:n.length===0?s.jsx("div",{className:`text-center py-8 text-sm ${t?"text-zinc-500":"text-zinc-400"}`,children:'暂无角色,点击"新建角色"开始创建'}):s.jsx("div",{className:"grid grid-cols-2 gap-3",children:n.map(o=>s.jsxs("div",{className:`group rounded-lg overflow-hidden border cursor-pointer hover:border-blue-500/50 transition-colors ${t?"bg-zinc-900 border-zinc-800":"bg-white border-zinc-200"}`,children:[s.jsxs("div",{className:"aspect-square bg-zinc-800 relative",children:[o.imageUrl?s.jsx("img",{src:o.imageUrl,alt:o.name,className:"w-full h-full object-cover"}):s.jsx("div",{className:"w-full h-full flex items-center justify-center text-zinc-500",children:s.jsx(hd,{size:24})}),s.jsx("button",{onClick:l=>{l.stopPropagation(),confirm(`确定要删除角色 "${o.name}" 吗?`)&&a(o.id)},className:"absolute top-1 right-1 p-1.5 rounded-full bg-black/50 text-white opacity-0 group-hover:opacity-100 transition-opacity hover:bg-red-600 z-10",title:"删除角色",children:s.jsx(Zi,{size:12})})]}),s.jsx("div",{className:"p-2",children:s.jsx("p",{className:`text-xs truncate ${t?"text-zinc-300":"text-zinc-700"}`,children:o.name})})]},o.id))})})]}),$te=_.memo(zte),Ste=({isOpen:e,isDark:t,klingSubjectLibrary:n,onClose:r,onCreateSubject:i,onDeleteSubject:a,onSendToNode:o})=>{const[l,c]=_.useState(null);return e?s.jsxs("div",{className:`absolute left-0 top-2 bottom-2 w-[240px] z-40 flex flex-col transition-all duration-300 ease-in-out rounded-2xl ${e?"translate-x-0":"-translate-x-full"} ${t?"bg-[#121214] border border-zinc-800 shadow-xl":"bg-zinc-50 border border-zinc-200 shadow-xl"}`,style:{pointerEvents:e?"auto":"none"},children:[s.jsxs("div",{className:`p-3 border-b flex justify-between items-center ${t?"border-zinc-800":"border-zinc-200"}`,children:[s.jsx("h3",{className:`font-bold text-xs ${t?"text-zinc-300":"text-zinc-700"}`,children:"可灵主体库"}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("button",{onClick:i,className:`px-2 py-1 text-[10px] rounded transition-colors ${t?"bg-blue-600 hover:bg-blue-500 text-white":"bg-blue-500 hover:bg-blue-600 text-white"}`,children:"新建主体"}),s.jsx("button",{onClick:r,children:s.jsx(Qr,{size:12,className:t?"text-zinc-500":"text-zinc-400"})})]})]}),s.jsx("div",{className:"flex-1 overflow-y-auto custom-scrollbar p-3",children:n.length===0?s.jsx("div",{className:`text-center py-8 text-sm ${t?"text-zinc-500":"text-zinc-400"}`,children:'暂无主体,点击"新建主体"开始创建'}):s.jsx("div",{className:"grid grid-cols-2 gap-3",children:n.map(u=>s.jsxs("div",{onClick:()=>c(u),className:`group rounded-lg overflow-hidden border cursor-pointer transition-all ${(l==null?void 0:l.id)===u.id?"border-blue-500 ring-2 ring-blue-500/30":t?"bg-zinc-900 border-zinc-800 hover:border-blue-500/50":"bg-white border-zinc-200 hover:border-blue-500/50"}`,title:"点击查看详情",children:[s.jsxs("div",{className:"aspect-square bg-zinc-800 relative",children:[u.mainImage?s.jsx("img",{src:u.mainImage,alt:u.name,className:"w-full h-full object-cover"}):s.jsx("div",{className:"w-full h-full flex items-center justify-center text-zinc-500",children:s.jsx(si,{size:24})}),s.jsx("button",{onClick:d=>{d.stopPropagation(),confirm(`确定要删除主体 "${u.name}" 吗?`)&&a(u.id)},className:"absolute top-1 right-1 p-1.5 rounded-full bg-black/50 text-white opacity-0 group-hover:opacity-100 transition-opacity hover:bg-red-600 z-10",title:"删除主体",children:s.jsx(Zi,{size:12})}),u.type&&s.jsx("div",{className:"absolute bottom-1 left-1 px-1.5 py-0.5 rounded text-[10px] bg-black/60 text-white",children:u.type})]}),s.jsxs("div",{className:"p-2",children:[s.jsx("p",{className:`text-xs truncate font-medium ${t?"text-zinc-300":"text-zinc-700"}`,children:u.name}),u.description&&s.jsx("p",{className:`text-[10px] truncate mt-0.5 ${t?"text-zinc-500":"text-zinc-400"}`,children:u.description})]})]},u.id))})}),l&&s.jsxs("div",{className:`border-t p-3 ${t?"border-zinc-800 bg-zinc-900/50":"border-zinc-200 bg-white"}`,children:[s.jsxs("div",{className:"flex items-start justify-between mb-2",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(KG,{size:14,className:t?"text-cyan-400":"text-cyan-600"}),s.jsx("h4",{className:`text-xs font-bold ${t?"text-zinc-300":"text-zinc-700"}`,children:"主体详情"})]}),s.jsx("button",{onClick:()=>c(null),className:`p-0.5 rounded transition-colors ${t?"hover:bg-zinc-800 text-zinc-500":"hover:bg-zinc-100 text-zinc-400"}`,children:s.jsx(Qr,{size:12})})]}),s.jsxs("div",{className:"space-y-2",children:[s.jsxs("div",{children:[s.jsx("p",{className:`text-[10px] mb-1 ${t?"text-zinc-500":"text-zinc-400"}`,children:"主图"}),s.jsx("img",{src:l.mainImage,alt:l.name,className:"w-full h-24 object-cover rounded border"})]}),l.auxiliaryImages&&l.auxiliaryImages.length>0&&s.jsxs("div",{children:[s.jsxs("p",{className:`text-[10px] mb-1 ${t?"text-zinc-500":"text-zinc-400"}`,children:["辅助图 (",l.auxiliaryImages.length,")"]}),s.jsx("div",{className:"grid grid-cols-3 gap-1",children:l.auxiliaryImages.map((u,d)=>s.jsx("img",{src:u,alt:`辅助图 ${d+1}`,className:"w-full h-16 object-cover rounded border"},d))})]}),s.jsxs("div",{children:[s.jsx("p",{className:`text-[10px] mb-0.5 ${t?"text-zinc-500":"text-zinc-400"}`,children:"名称"}),s.jsx("p",{className:`text-xs ${t?"text-zinc-300":"text-zinc-700"}`,children:l.name})]}),s.jsxs("div",{children:[s.jsx("p",{className:`text-[10px] mb-0.5 ${t?"text-zinc-500":"text-zinc-400"}`,children:"类型"}),s.jsx("p",{className:`text-xs ${t?"text-zinc-300":"text-zinc-700"}`,children:l.type})]}),l.description&&s.jsxs("div",{children:[s.jsx("p",{className:`text-[10px] mb-0.5 ${t?"text-zinc-500":"text-zinc-400"}`,children:"描述"}),s.jsx("p",{className:`text-xs ${t?"text-zinc-300":"text-zinc-700"}`,children:l.description})]}),o&&s.jsxs("button",{onClick:()=>{o(l.id),c(null)},className:`w-full flex items-center justify-center gap-1.5 px-3 py-2 rounded text-xs font-medium transition-colors ${t?"bg-cyan-600 hover:bg-cyan-500 text-white":"bg-cyan-500 hover:bg-cyan-600 text-white"}`,children:[s.jsx(Lo,{size:14}),s.jsx("span",{children:"发送到 Kling O1 节点"})]})]})]})]}):null},jte=_.memo(Ste);function Cte(e){return new Promise((t,n)=>{const r=new FileReader;r.onload=()=>t(String(r.result||"")),r.onerror=n,r.readAsDataURL(e)})}async function Nte(e,t=256){const n=await new Promise((d,h)=>{const p=new Image;p.onload=()=>d(p),p.onerror=h,p.src=e}),r=n.naturalWidth||n.width||1,i=n.naturalHeight||n.height||1,a=Math.min(1,t/Math.max(r,i)),o=Math.max(1,Math.round(r*a)),l=Math.max(1,Math.round(i*a)),c=document.createElement("canvas");c.width=o,c.height=l;const u=c.getContext("2d");return u?(u.drawImage(n,0,0,o,l),c.toDataURL("image/jpeg",.82)):e}const Ete=({isOpen:e,isDark:t,roles:n,onClose:r,onAddRole:i,onDeleteRole:a,onUpdateRole:o,onSendToCanvas:l})=>{const[c,u]=_.useState(!1),[d,h]=_.useState("新角色"),[p,f]=_.useState(""),[b,g]=_.useState(""),y=_.useRef(null),[w,v]=_.useState(null),[m,z]=_.useState(""),[C,E]=_.useState({}),I=_.useMemo(()=>[...n].sort((L,X)=>X.createdAt-L.createdAt),[n]);if(_.useEffect(()=>{let L=!0;return(async()=>{const X=await Promise.all(n.map(async q=>{const H=q._thumbAssetId||(q._assetId?`thumb_${q._assetId}`:"");if(!H)return[q.id,""];try{await xr.ensureRestored();const J=await xr.readAssetAsUrl(H);if(J)return[q.id,J]}catch{}try{const J=await Xr.getAssetUrl(H);if(J)return[q.id,J]}catch{}return[q.id,""]}));if(!L)return;const T={};X.forEach(([q,H])=>{H&&(T[q]=H)}),E(T)})(),()=>{L=!1}},[n]),!e)return null;const R=()=>{const L=(localStorage.getItem("qiaodoumayi_seedance_moderation_url")||"").trim(),X=(localStorage.getItem("qiaodoumayi_seedance_moderation_user_id")||"").trim(),T=(localStorage.getItem("qiaodoumayi_seedance_moderation_key_hex")||"").trim(),q=[];return L||q.push("URL"),X||q.push("USER ID"),T||q.push("AES KEY"),{apiUrl:L,userIdStr:X,keyHex:T,keyLen:T.length,missing:q}},A=L=>{const X="text-[10px] px-1.5 py-0.5 rounded inline-flex items-center gap-1";return L.status==="approved"?s.jsxs("span",{className:`${X} ${t?"bg-green-500/20 text-green-300":"bg-green-100 text-green-700"}`,children:[s.jsx(OP,{size:10}),"OK"]}):L.status==="rejected"?s.jsxs("span",{className:`${X} ${t?"bg-red-500/20 text-red-300":"bg-red-100 text-red-700"}`,children:[s.jsx(LP,{size:10}),"错误"]}):s.jsxs("span",{className:`${X} ${t?"bg-zinc-700 text-zinc-200":"bg-zinc-200 text-zinc-700"}`,children:[s.jsx(dd,{size:10}),"待审核"]})},O=()=>{var L;return(L=y.current)==null?void 0:L.click()},F=async()=>{var L;if(g(""),!p){g("请先选择角色图片");return}u(!0);try{const X=R();if(X.missing.length>0){const Z=X.apiUrl?X.apiUrl:"(空)",B=X.userIdStr?X.userIdStr:"(空)";throw new Error(`素材审核配置缺失:${X.missing.join(" / ")}。当前读取:URL=${Z},USER ID=${B},AES KEY 长度=${X.keyLen}`)}const T=await V5({apiUrl:X.apiUrl,userId:X.userIdStr,keyHex:X.keyHex},[p]),q=(L=T==null?void 0:T.items)==null?void 0:L[0],H=q==null?void 0:q.asset_url;if(!H)throw new Error("审核接口未返回 asset_url");const J={id:`seedance-role-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,name:(d||"新角色").trim()||"新角色",previewImageUrl:(q==null?void 0:q.downstream_final_url)||(q==null?void 0:q.tos_url)||p,assetUrl:String(H),status:"approved",createdAt:Date.now()};try{const Z=p||J.previewImageUrl;if(Z){const B=Z.startsWith("data:")?await(await fetch(Z)).blob():await(await fetch(J.previewImageUrl||Z)).blob(),V=`seedance_role_${J.id}`;if(await Xr.saveBlobAsset(V,B,Z,"images")&&(J._assetId=V),await xr.ensureRestored(),xr.isAvailable()){await xr.saveAsset(V,B,B.type||"image/png",Z,"images");const j=await Nte(p||J.previewImageUrl,256);await xr.saveThumbnail(V,j,"thumb","thumbnails")&&(J._thumbAssetId=`thumb_${V}`);const W=await(await fetch(j)).blob();await Xr.saveBlobAsset(`thumb_${V}`,W,"","thumbnails");const M={id:J.id,name:J.name,assetUrl:J.assetUrl,previewImageUrl:J.previewImageUrl,createdAt:J.createdAt,localAssetId:V,localThumbnailAssetId:J._thumbAssetId||`thumb_${V}`},Y=new Blob([JSON.stringify(M,null,2)],{type:"application/json"});await xr.saveAsset(`seedance_role_meta_${J.id}`,Y,"application/json","","SeedanceID")}console.log("[SeedanceRole] cached image/thumbnail/meta:",{roleId:J.id,assetId:V,thumbAssetId:J._thumbAssetId})}}catch(Z){console.warn("[SeedanceRole] save role image/thumbnail to local cache failed:",Z)}i(J),h("新角色"),f("")}catch(X){const T=X instanceof Error?X.message:"创建失败";g(T)}finally{u(!1)}};return s.jsxs("div",{className:`absolute left-0 top-2 bottom-2 w-[240px] z-40 flex flex-col transition-all duration-300 ease-in-out rounded-2xl ${e?"translate-x-0":"-translate-x-full"} ${t?"bg-[#121214] border border-zinc-800 shadow-xl":"bg-zinc-50 border border-zinc-200 shadow-xl"}`,style:{pointerEvents:e?"auto":"none"},children:[s.jsxs("div",{className:`p-3 border-b flex justify-between items-center ${t?"border-zinc-800":"border-zinc-200"}`,children:[s.jsx("h3",{className:`font-bold text-xs ${t?"text-zinc-300":"text-zinc-700"}`,children:"Seedance 角色库"}),s.jsx("button",{onClick:r,children:s.jsx(Qr,{size:12,className:t?"text-zinc-500":"text-zinc-400"})})]}),s.jsxs("div",{className:`p-3 border-b ${t?"border-zinc-800":"border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center justify-between mb-2",children:[s.jsx("div",{className:`text-[10px] uppercase tracking-wider ${t?"text-zinc-500":"text-zinc-400"}`,children:"创建角色(素材审核)"}),s.jsxs("button",{onClick:O,className:`flex items-center gap-1 px-2 py-1 rounded text-[10px] ${t?"bg-zinc-800 text-zinc-300 hover:bg-zinc-700":"bg-white text-zinc-700 hover:bg-zinc-100"}`,title:"选择图片",type:"button",children:[s.jsx(Xi,{size:12}),"选图"]})]}),s.jsx("input",{ref:y,type:"file",accept:"image/*",className:"hidden",onChange:async L=>{var q;const X=(q=L.target.files)==null?void 0:q[0];if(L.target.value="",!X)return;const T=await Cte(X);f(T)}}),s.jsxs("div",{className:"flex gap-2",children:[s.jsx("div",{className:`w-16 h-16 rounded border overflow-hidden flex items-center justify-center ${t?"border-zinc-700 bg-zinc-900":"border-zinc-200 bg-white"}`,children:p?s.jsx("img",{src:p,alt:"",className:"w-full h-full object-cover"}):s.jsx(hd,{size:18,className:t?"text-zinc-500":"text-zinc-400"})}),s.jsxs("div",{className:"flex-1 min-w-0",children:[s.jsx("input",{value:d,onChange:L=>h(L.target.value),className:`w-full px-2 py-1 rounded text-xs border outline-none focus:border-blue-500 ${t?"bg-zinc-900 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,placeholder:"角色名称"}),s.jsxs("button",{onClick:F,disabled:c,className:`mt-2 w-full flex items-center justify-center gap-1.5 px-2 py-1.5 rounded text-xs font-medium transition-colors ${c?t?"bg-zinc-800 text-zinc-500":"bg-zinc-200 text-zinc-500":t?"bg-cyan-600 hover:bg-cyan-500 text-white":"bg-cyan-500 hover:bg-cyan-600 text-white"}`,children:[c?s.jsx(dd,{size:14}):s.jsx(xu,{size:14}),c?"审核中...":"创建并过审"]}),s.jsxs("div",{className:`mt-1 text-[10px] ${t?"text-zinc-500":"text-zinc-400"}`,children:["当前配置读取:USER ID / AES KEY 只展示长度(安全)",(()=>{const L=R(),X=L.apiUrl?L.apiUrl:"(空)",T=L.userIdStr?L.userIdStr:"(空)";return s.jsxs("div",{className:"mt-0.5 truncate",title:`URL=${X} USER=${T} KEYLEN=${L.keyLen}`,children:["URL: ",X," · USER: ",T," · KEYLEN: ",L.keyLen]})})()]}),b&&s.jsx("div",{className:`mt-1 text-[10px] ${t?"text-red-400":"text-red-600"}`,children:b})]})]})]}),s.jsx("div",{className:"flex-1 overflow-y-auto custom-scrollbar p-3",children:I.length===0?s.jsx("div",{className:`text-center py-8 text-sm ${t?"text-zinc-500":"text-zinc-400"}`,children:"暂无角色"}):s.jsx("div",{className:"space-y-3",children:I.map(L=>s.jsx("div",{className:`rounded-lg overflow-hidden border ${t?"bg-zinc-900 border-zinc-800":"bg-white border-zinc-200"}`,children:s.jsxs("div",{className:"flex gap-2 p-2",children:[s.jsx("div",{className:"w-14 h-14 rounded overflow-hidden bg-zinc-800 flex-shrink-0",children:L.previewImageUrl?s.jsx("img",{src:C[L.id]||L.previewImageUrl,alt:L.name,className:"w-full h-full object-cover"}):s.jsx("div",{className:"w-full h-full flex items-center justify-center text-zinc-500",children:s.jsx(hd,{size:18})})}),s.jsxs("div",{className:"flex-1 min-w-0",children:[s.jsxs("div",{className:"flex items-center justify-between gap-2",children:[w===L.id?s.jsx("input",{value:m,onChange:X=>z(X.target.value),onBlur:()=>{const X=m.trim();X&&o(L.id,{name:X}),v(null)},onKeyDown:X=>{if(X.key==="Enter"){const T=m.trim();T&&o(L.id,{name:T}),v(null)}X.key==="Escape"&&v(null)},autoFocus:!0,className:`w-full px-1.5 py-0.5 text-xs rounded border ${t?"bg-zinc-800 border-zinc-600 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`}):s.jsxs("div",{className:"min-w-0",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("p",{className:`text-xs font-medium truncate ${t?"text-zinc-200":"text-zinc-800"}`,children:L.name}),A(L)]}),L.status==="rejected"&&L.errorMessage&&s.jsx("p",{className:`text-[10px] truncate mt-0.5 ${t?"text-red-400":"text-red-600"}`,title:L.errorMessage,children:L.errorMessage})]}),s.jsx("button",{onClick:()=>{v(L.id),z(L.name)},className:`${t?"text-zinc-500 hover:text-zinc-200":"text-zinc-400 hover:text-zinc-700"}`,title:"重命名",type:"button",children:s.jsx(vm,{size:14})})]}),s.jsxs("div",{className:"mt-2 flex items-center gap-2",children:[l&&L.status==="approved"&&s.jsxs("button",{onClick:()=>l(L.id),className:`flex-1 flex items-center justify-center gap-1 py-1.5 text-[10px] rounded ${t?"bg-cyan-600/20 text-cyan-300 hover:bg-cyan-600/30":"bg-cyan-50 text-cyan-700 hover:bg-cyan-100"}`,title:"发送到画布并可连接到生成节点",type:"button",children:[s.jsx(Lo,{size:12}),"发送到画布"]}),s.jsx("button",{onClick:()=>{confirm(`确定要删除角色 "${L.name}" 吗?`)&&a(L.id)},className:`w-10 flex items-center justify-center py-1.5 text-[10px] rounded ${t?"bg-red-900/20 text-red-300 hover:bg-red-900/30":"bg-red-50 text-red-700 hover:bg-red-100"}`,title:"删除",type:"button",children:s.jsx(Zi,{size:12})})]})]})]})},L.id))})})]})},Ite=_.memo(Ete),kte=({isOpen:e,isDark:t,rhAppLibrary:n,onClose:r,onDeleteItem:i,onUpdateItem:a,onFillToNode:o})=>{const[l,c]=_.useState(null),[u,d]=_.useState(""),[h,p]=_.useState("workflow"),f=v=>{c(v.id),d(v.customName||v.webappName)},b=v=>{u.trim()&&a(v,{customName:u.trim()}),c(null)},g=n.filter(v=>(v.type||"app")==="workflow"),y=n.filter(v=>(v.type||"app")==="app"),w=h==="workflow"?g:y;return e?s.jsxs("div",{className:`absolute left-0 top-2 bottom-2 w-[240px] z-40 flex flex-col transition-all duration-300 ease-in-out rounded-2xl sidebar ${e?"translate-x-0":"-translate-x-full"} ${t?"bg-[#121214] border border-zinc-800 shadow-xl":"bg-zinc-50 border border-zinc-200 shadow-xl"}`,style:{pointerEvents:e?"auto":"none"},children:[s.jsxs("div",{className:`p-3 border-b flex justify-between items-center ${t?"border-zinc-800":"border-zinc-200"}`,children:[s.jsxs("h3",{className:`font-bold text-xs flex items-center gap-2 ${t?"text-zinc-300":"text-zinc-700"}`,children:[s.jsx(ym,{size:16,className:"text-blue-500"}),"RH AI 应用库"]}),s.jsx("button",{onClick:r,children:s.jsx(Qr,{size:12,className:t?"text-zinc-500":"text-zinc-400"})})]}),s.jsxs("div",{className:`flex border-b ${t?"border-zinc-800":"border-zinc-200"}`,children:[s.jsxs("button",{onClick:()=>p("workflow"),className:`flex-1 flex items-center justify-center gap-1.5 py-2 text-xs font-medium transition-colors ${h==="workflow"?t?"text-blue-400 border-b-2 border-blue-500 bg-blue-500/10":"text-blue-600 border-b-2 border-blue-500 bg-blue-50":t?"text-zinc-500 hover:text-zinc-300":"text-zinc-500 hover:text-zinc-700"}`,children:[s.jsx(Ow,{size:14}),"工作流",g.length>0&&s.jsx("span",{className:`text-[10px] px-1 rounded ${t?"bg-zinc-700":"bg-zinc-200"}`,children:g.length})]}),s.jsxs("button",{onClick:()=>p("app"),className:`flex-1 flex items-center justify-center gap-1.5 py-2 text-xs font-medium transition-colors ${h==="app"?t?"text-blue-400 border-b-2 border-blue-500 bg-blue-500/10":"text-blue-600 border-b-2 border-blue-500 bg-blue-50":t?"text-zinc-500 hover:text-zinc-300":"text-zinc-500 hover:text-zinc-700"}`,children:[s.jsx(DP,{size:14}),"AI 应用",y.length>0&&s.jsx("span",{className:`text-[10px] px-1 rounded ${t?"bg-zinc-700":"bg-zinc-200"}`,children:y.length})]})]}),s.jsx("div",{className:"flex-1 overflow-y-auto rh-scroll-minimal p-3",children:w.length===0?s.jsx("div",{className:`text-center py-8 text-sm ${t?"text-zinc-500":"text-zinc-400"}`,children:h==="workflow"?"暂无工作流,在 RH Comfy 节点获取工作流后点击「保存到应用库」":"暂无应用,在 RH 节点输入 ID 并点击「获取应用信息」后会自动保存"}):s.jsx("div",{className:"space-y-3",children:w.map(v=>{var m;return s.jsxs("div",{className:`group rounded-lg overflow-hidden border transition-all ${t?"bg-zinc-900 border-zinc-800 hover:border-blue-500/50":"bg-white border-zinc-200 hover:border-blue-500/50"}`,children:[s.jsx("div",{onClick:()=>o==null?void 0:o(v),className:`p-2 cursor-pointer ${o?"hover:bg-blue-500/10":""}`,title:o?"点击填充到选中的 RH 节点":"",children:s.jsxs("div",{className:"flex gap-2",children:[s.jsx("div",{className:"w-14 h-14 rounded overflow-hidden flex-shrink-0 bg-zinc-800",children:(m=v.covers)!=null&&m[0]?s.jsx("img",{src:v.covers[0].thumbnailUri||v.covers[0].url,alt:"",className:"w-full h-full object-cover"}):s.jsx("div",{className:"w-full h-full flex items-center justify-center text-zinc-500",children:s.jsx(ym,{size:20})})}),s.jsxs("div",{className:"flex-1 min-w-0",children:[l===v.id?s.jsx("div",{className:"flex gap-1",children:s.jsx("input",{type:"text",value:u,onChange:z=>d(z.target.value),onBlur:()=>b(v.id),onKeyDown:z=>{z.key==="Enter"&&b(v.id),z.key==="Escape"&&c(null)},autoFocus:!0,className:`w-full px-1.5 py-0.5 text-xs rounded border ${t?"bg-zinc-800 border-zinc-600":"bg-white border-zinc-300"}`})}):s.jsx("p",{className:`text-xs font-medium truncate ${t?"text-zinc-300":"text-zinc-700"}`,title:v.customName||v.webappName,children:v.customName||v.webappName}),s.jsxs("p",{className:`text-[10px] truncate mt-0.5 ${t?"text-zinc-500":"text-zinc-400"}`,children:[(v.type||"app")==="workflow"?"Workflow ID: ":"ID: ",v.webappId]})]})]})}),s.jsxs("div",{className:`flex border-t ${t?"border-zinc-800":"border-zinc-200"}`,children:[s.jsxs("button",{onClick:z=>{z.stopPropagation(),f(v)},className:`flex-1 flex items-center justify-center gap-1 py-1.5 text-[10px] ${t?"hover:bg-zinc-800 text-zinc-400":"hover:bg-zinc-100 text-zinc-500"}`,title:"修改名称",children:[s.jsx(vm,{size:10}),"重命名"]}),o&&s.jsxs("button",{onClick:z=>{z.stopPropagation(),o(v)},className:`flex-1 flex items-center justify-center gap-1 py-1.5 text-[10px] ${t?"hover:bg-blue-600/30 text-blue-400":"hover:bg-blue-100 text-blue-600"}`,title:"填充到 RH 节点",children:[s.jsx(Lo,{size:10}),"填充"]}),s.jsxs("button",{onClick:z=>{z.stopPropagation(),confirm("确定删除此应用?")&&i(v.id)},className:`flex-1 flex items-center justify-center gap-1 py-1.5 text-[10px] ${t?"hover:bg-red-900/30 text-red-400":"hover:bg-red-50 text-red-600"}`,title:"删除",children:[s.jsx(Zi,{size:10}),"删除"]})]})]},v.id)})})})]}):null},Ate=_.memo(kte),zN=220,$N=280,SN=560,jN=.88,Mte={x:56,y:72,w:280,h:420},CN="poseRefFloatBounds",NN="poseRefEagleTreeHeight",Tte=180,EN=80,IN=480,Rte="eagle:",S$=({folder:e,depth:t,currentEagleFolderId:n,isDark:r,onSwitchEagleFolder:i})=>{const a=e.children&&e.children.length>0,[o,l]=fr.useState(!1),c=e.id===n;return s.jsxs("div",{className:"flex flex-col gap-0",children:[s.jsxs("div",{className:"flex items-center gap-0 min-w-0",style:{paddingLeft:t*10},children:[a?s.jsx("button",{type:"button",onClick:u=>{u.stopPropagation(),l(d=>!d)},className:`shrink-0 p-0.5 rounded ${r?"hover:bg-zinc-700 text-zinc-400":"hover:bg-zinc-300 text-zinc-500"}`,"aria-label":o?"折叠":"展开",children:o?s.jsx(Ei,{size:10}):s.jsx(Ja,{size:10})}):s.jsx("span",{className:"w-4 shrink-0 inline-block"}),s.jsx("button",{type:"button",onClick:()=>i==null?void 0:i(e.id),className:`flex-1 min-w-0 text-left px-1.5 py-1 rounded-md text-[10px] truncate transition-colors flex items-center justify-between gap-1 ${c?r?"bg-blue-500/30 text-blue-400":"bg-blue-500/20 text-blue-600":r?"text-zinc-400 hover:bg-zinc-800 hover:text-zinc-200":"text-zinc-600 hover:bg-zinc-200 hover:text-zinc-800"}`,title:e.name,children:s.jsx("span",{className:"truncate",children:e.name})})]}),a&&o&&s.jsx(s.Fragment,{children:e.children.map(u=>s.jsx(S$,{folder:u,depth:t+1,currentEagleFolderId:n,isDark:r,onSwitchEagleFolder:i},u.id))})]})},K2=80,Pte=({isOpen:e,floating:t=!0,isDark:n,items:r,loading:i,error:a,folderPath:o,folderPaths:l,isTauri:c,favoritedIds:u,dataSource:d="local",eagleFolders:h=[],currentEagleFolderId:p=null,onClose:f,onSwitchToSidebar:b,onSwitchToFloating:g,onChooseFolder:y,onSwitchFolder:w,onRemoveCurrentFolder:v,onClearFolder:m,onSelectFiles:z,onInsertPose:C,onToggleFavorite:E,onConnectEagle:I,onSwitchEagleFolder:R,onSwitchToLocal:A,getPreviewUrl:O})=>{const[F,L]=_.useState(""),[X,T]=_.useState("all"),[q,H]=_.useState(!1),[J,Z]=_.useState(K2),[B,V]=_.useState({}),N=_.useRef(null),j=_.useRef(null),k=_.useRef(new Map),W=_.useRef(new Set),M=_.useRef([]),[Y,se]=_.useState(()=>{try{const Ee=localStorage.getItem(NN);if(Ee!=null){const Ce=parseInt(Ee,10);if(!Number.isNaN(Ce)&&Ce>=EN&&Ce<=IN)return Ce}}catch{}return Tte}),ie=_.useRef(null),oe=_.useCallback(()=>{try{const Ee=localStorage.getItem(CN);if(Ee){const Ce=JSON.parse(Ee);if((Ce==null?void 0:Ce.x)!=null&&(Ce==null?void 0:Ce.y)!=null&&(Ce==null?void 0:Ce.w)!=null&&(Ce==null?void 0:Ce.h)!=null)return{x:Math.max(0,Ce.x),y:Math.max(0,Ce.y),w:Math.min(SN,Math.max(zN,Ce.w)),h:Math.min(window.innerHeight*jN,Math.max($N,Ce.h))}}}catch{}return Mte},[]),[re,ee]=_.useState(oe),pe=_.useRef(null),we=_.useRef(null),Q=_.useRef(null),me=_.useCallback(Ee=>{try{localStorage.setItem(CN,JSON.stringify(Ee))}catch{}},[]),ue=_.useCallback(Ee=>{if(!t||Ee.target.closest("button"))return;Ee.preventDefault();const Ce=we.current;if(!Ce)return;pe.current={startX:re.x,startY:re.y,mouseX:Ee.clientX,mouseY:Ee.clientY};const xe=ve=>{const ke=pe.current;if(!ke||!Ce)return;const Ie=ve.clientX-ke.mouseX,Pe=ve.clientY-ke.mouseY,Te=re.w,Be=re.h,He=window.innerWidth-Te,Je=window.innerHeight-Be,Me=Math.max(0,Math.min(He,ke.startX+Ie)),Re=Math.max(0,Math.min(Je,ke.startY+Pe));Ce.style.left=`${Me}px`,Ce.style.top=`${Re}px`},Ne=()=>{if(!pe.current||!Ce)return;const ve=parseFloat(Ce.style.left),ke=parseFloat(Ce.style.top);if(Ce.style.left="",Ce.style.top="",pe.current=null,document.removeEventListener("mousemove",xe),document.removeEventListener("mouseup",Ne),!Number.isNaN(ve)&&!Number.isNaN(ke)){const Ie=re.w,Pe=re.h,Te=window.innerWidth-Ie,Be=window.innerHeight-Pe,He=Math.max(0,Math.min(Te,ve)),Je=Math.max(0,Math.min(Be,ke));ee(Me=>{const Re={...Me,x:He,y:Je};return me(Re),Re})}};document.addEventListener("mousemove",xe),document.addEventListener("mouseup",Ne)},[t,re,me]),U=_.useCallback((Ee,Ce)=>{if(!t)return;Ee.preventDefault(),Ee.stopPropagation();const xe={edge:Ce,startX:Ee.clientX,startY:Ee.clientY,w:re.w,h:re.h};Q.current=xe;const Ne=ke=>{const Ie=Q.current;if(!Ie)return;const Pe=ke.clientX-Ie.startX,Te=ke.clientY-Ie.startY;let Be=Ie.w,He=Ie.h;Ie.edge.includes("e")&&(Be=Math.max(zN,Math.min(SN,Ie.w+Pe))),Ie.edge.includes("s")&&(He=Math.max($N,Math.min(window.innerHeight*jN,Ie.h+Te))),ee(Je=>({...Je,w:Be,h:He}))},ve=()=>{Q.current=null,document.removeEventListener("mousemove",Ne),document.removeEventListener("mouseup",ve),ee(ke=>(me(ke),ke))};document.addEventListener("mousemove",Ne),document.addEventListener("mouseup",ve)},[t,re,me]),G=()=>{var Ee;z&&((Ee=N.current)==null||Ee.click())},te=Ee=>{const Ce=Ee.target.files;Ce&&Ce.length>0&&z&&z(Array.from(Ce)),Ee.target.value=""},ge=_.useMemo(()=>{const Ee=F.trim().toLowerCase();let Ce=r;return X==="favorites"&&(Ce=r.filter(xe=>u.has(xe.id))),Ee?Ce.filter(xe=>`${xe.title} ${xe.category}`.toLowerCase().includes(Ee)):Ce},[r,F,X,u]);M.current=ge;const ne=_.useMemo(()=>{const Ee=new Map;return ge.forEach(Ce=>{const xe=Ce.category||"未分类";Ee.has(xe)||Ee.set(xe,[]),Ee.get(xe).push(Ce)}),Array.from(Ee.entries())},[ge]),{groupedDisplayed:le,totalFiltered:fe}=_.useMemo(()=>{const Ee=[];ne.forEach(([,Ne])=>Ne.forEach(ve=>Ee.push(ve)));const Ce=Ee.slice(0,J),xe=new Map;return Ce.forEach(Ne=>{const ve=Ne.category||"未分类";xe.has(ve)||xe.set(ve,[]),xe.get(ve).push(Ne)}),{groupedDisplayed:Array.from(xe.entries()),totalFiltered:Ee.length}},[ne,J]);_.useEffect(()=>{if(!O||le.length===0)return;const Ee=k.current,Ce=W.current,xe=new IntersectionObserver(Ne=>{Ne.forEach(ve=>{var Te;if(!ve.isIntersecting)return;const ke=ve.target.dataset.poseId;if(!ke||Ce.has(ke))return;const Ie=M.current.find(Be=>Be.id===ke),Pe=!(Ie!=null&&Ie.imageUrl)&&((Ie==null?void 0:Ie.filePath)||((Te=Ie==null?void 0:Ie.id)==null?void 0:Te.startsWith(Rte)));!Ie||!Pe||(Ce.add(ke),O(Ie).then(Be=>{Be&&V(He=>({...He,[ke]:Be}))}))})},{root:null,rootMargin:"100px",threshold:.01});return j.current=xe,Ee.forEach(Ne=>Ne&&xe.observe(Ne)),()=>{xe.disconnect(),j.current=null}},[O,le]),_.useEffect(()=>{Z(K2),V({}),W.current=new Set},[F,r.length,X,o]);const be=_.useCallback(Ee=>{Ee.preventDefault();const Ce=Ee.clientY,xe=Y,Ne=ke=>{const Ie=xe+(ke.clientY-Ce),Pe=Math.round(Math.min(IN,Math.max(EN,Ie)));se(Pe);try{localStorage.setItem(NN,String(Pe))}catch{}},ve=()=>{document.removeEventListener("mousemove",Ne),document.removeEventListener("mouseup",ve),document.body.style.cursor="",document.body.style.userSelect=""};document.body.style.cursor="ns-resize",document.body.style.userSelect="none",document.addEventListener("mousemove",Ne),document.addEventListener("mouseup",ve)},[Y]),de=fe>J,$e=()=>Z(Ee=>Ee+K2);if(!e)return null;const ze=`z-40 flex flex-col rounded-2xl shadow-2xl ${n?"bg-[#121214] border border-zinc-800":"bg-zinc-50 border border-zinc-200"}`,_e=s.jsxs(s.Fragment,{children:[s.jsxs("div",{onMouseDown:ue,className:`px-3 py-2 border-b flex items-center justify-between select-none ${t?"cursor-grab active:cursor-grabbing":""} ${n?"border-zinc-800":"border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("div",{className:`w-6 h-6 rounded-lg flex items-center justify-center ${n?"bg-blue-500/20":"bg-blue-500/10"}`,children:s.jsx(Pv,{size:14,className:n?"text-blue-400":"text-blue-600"})}),s.jsxs("div",{className:"flex flex-col",children:[s.jsx("span",{className:`text-xs font-semibold ${n?"text-zinc-200":"text-zinc-800"}`,children:"本地资料查阅"}),s.jsx("span",{className:`text-[10px] ${n?"text-zinc-500":"text-zinc-400"}`,children:"本地图片,点击插入画布"})]})]}),s.jsxs("div",{className:"flex items-center gap-0.5",children:[!t&&g&&s.jsx("button",{type:"button",onClick:g,className:`p-1.5 rounded-md ${n?"text-zinc-400 hover:bg-zinc-700 hover:text-zinc-200":"text-zinc-500 hover:bg-zinc-200 hover:text-zinc-700"}`,title:"弹出为悬浮窗口",children:s.jsx(Tw,{size:12})}),s.jsx("button",{onClick:()=>t&&b?b():f(),title:t&&b?"收起为侧边栏":"关闭",children:s.jsx(Qr,{size:12,className:n?"text-zinc-500":"text-zinc-400"})})]})]}),c&&(I||A)&&s.jsx("div",{className:`px-3 py-2 border-b ${n?"border-zinc-800":"border-zinc-200"}`,children:s.jsxs("div",{className:"flex gap-1",children:[s.jsx("button",{type:"button",onClick:A,className:`flex-1 py-1.5 rounded-md text-[11px] font-medium ${d==="local"?n?"bg-blue-500/30 text-blue-400":"bg-blue-500/20 text-blue-600":n?"bg-zinc-800 text-zinc-400 hover:text-zinc-200":"bg-zinc-200 text-zinc-600 hover:text-zinc-800"}`,children:"本地文件夹"}),s.jsxs("button",{type:"button",onClick:()=>d!=="eagle"?I==null?void 0:I():void 0,className:`flex-1 py-1.5 rounded-md text-[11px] font-medium flex items-center justify-center gap-1 ${d==="eagle"?n?"bg-blue-500/30 text-blue-400":"bg-blue-500/20 text-blue-600":n?"bg-zinc-800 text-zinc-400 hover:text-zinc-200":"bg-zinc-200 text-zinc-600 hover:text-zinc-800"}`,children:[s.jsx(si,{size:12}),"Eagle 素材库"]})]})}),d==="eagle"&&c&&h.length>0?s.jsxs("div",{ref:ie,className:`flex-1 flex flex-col min-h-0 border-b ${n?"border-zinc-800":"border-zinc-200"}`,children:[s.jsxs("div",{className:"flex flex-col shrink-0 overflow-y-auto custom-scrollbar px-3 py-2",style:{height:Y},children:[s.jsxs("button",{type:"button",onClick:I,disabled:i,className:`flex items-center justify-center gap-2 w-full py-2 rounded-lg text-xs font-medium transition-colors shrink-0 ${n?"bg-zinc-800 hover:bg-zinc-700 text-zinc-200 disabled:opacity-50":"bg-zinc-200 hover:bg-zinc-300 text-zinc-800 disabled:opacity-50"}`,children:[s.jsx(si,{size:14}),i?"连接中…":"连接 Eagle"]}),s.jsx("div",{className:"flex-1 min-h-0 overflow-y-auto custom-scrollbar space-y-0.5 mt-2",children:h.map(Ee=>s.jsx(S$,{folder:Ee,depth:0,currentEagleFolderId:p,isDark:n,onSwitchEagleFolder:R},Ee.id))})]}),s.jsx("div",{role:"separator","aria-label":"拖动调整分类区与素材区高度",onMouseDown:be,className:`shrink-0 h-1.5 flex items-center justify-center cursor-ns-resize transition-colors ${n?"hover:bg-zinc-700 bg-zinc-800/80":"hover:bg-zinc-300 bg-zinc-200"}`,title:"上下拖动可调整分类区与素材区高度",children:s.jsx("div",{className:`w-8 h-0.5 rounded-full ${n?"bg-zinc-600":"bg-zinc-400"}`})}),s.jsxs("div",{className:"flex-1 flex flex-col min-h-0 overflow-hidden",children:[s.jsxs("div",{className:"px-3 py-2 shrink-0",children:[s.jsxs("div",{className:`flex items-center gap-2 px-2 py-1.5 rounded-lg text-xs ${n?"bg-zinc-900 border border-zinc-800 text-zinc-300":"bg-white border border-zinc-200 text-zinc-700"}`,children:[s.jsx("span",{className:"text-[10px] opacity-70",children:"搜索"}),s.jsx("input",{value:F,onChange:Ee=>L(Ee.target.value),placeholder:"按名称或分类过滤",className:`flex-1 bg-transparent outline-none text-xs ${n?"placeholder:text-zinc-600":"placeholder:text-zinc-400"}`})]}),s.jsxs("div",{className:"flex gap-1 mt-2",children:[s.jsx("button",{type:"button",onClick:()=>T("all"),className:`flex-1 py-1.5 rounded-md text-[11px] font-medium ${X==="all"?n?"bg-blue-500/30 text-blue-400":"bg-blue-500/20 text-blue-600":n?"bg-zinc-800 text-zinc-400 hover:text-zinc-200":"bg-zinc-200 text-zinc-600 hover:text-zinc-800"}`,children:"全部"}),s.jsx("button",{type:"button",onClick:()=>T("favorites"),className:`flex-1 py-1.5 rounded-md text-[11px] font-medium ${X==="favorites"?n?"bg-blue-500/30 text-blue-400":"bg-blue-500/20 text-blue-600":n?"bg-zinc-800 text-zinc-400 hover:text-zinc-200":"bg-zinc-200 text-zinc-600 hover:text-zinc-800"}`,children:"收藏"})]})]}),s.jsxs("div",{className:"flex-1 overflow-y-auto custom-scrollbar px-3 pb-3 min-h-0",children:[r.length===0&&!i&&s.jsx("div",{className:`mt-6 text-center text-xs ${n?"text-zinc-500":"text-zinc-400"}`,children:"请点击「连接 Eagle」并确保 Eagle 应用已打开"}),r.length>0&&ne.length===0&&s.jsx("div",{className:`mt-6 text-center text-xs ${n?"text-zinc-500":"text-zinc-400"}`,children:"没有匹配当前搜索条件的姿势。"}),le.map(([Ee,Ce])=>s.jsxs("div",{className:"mb-3",children:[s.jsxs("div",{className:"flex items-center justify-between mb-1.5",children:[s.jsx("span",{className:`text-[11px] font-medium ${n?"text-zinc-300":"text-zinc-700"}`,children:Ee}),s.jsxs("span",{className:`text-[10px] ${n?"text-zinc-500":"text-zinc-400"}`,children:[Ce.length," 个"]})]}),s.jsx("div",{className:"grid gap-1.5",style:{gridTemplateColumns:"repeat(auto-fill, minmax(72px, 1fr))"},children:Ce.map(xe=>{const Ne=B[xe.id]??xe.imageUrl,ve=u.has(xe.id);return s.jsxs("div",{ref:ke=>{ke?k.current.set(xe.id,ke):k.current.delete(xe.id)},"data-pose-id":xe.id,draggable:!0,onDragStart:ke=>{ke.dataTransfer.setData("application/json",JSON.stringify({type:"pose-reference",itemId:xe.id,title:xe.title}))},className:`rounded-lg overflow-hidden border transition-colors ${n?"border-zinc-700 hover:border-zinc-600":"border-zinc-200 hover:border-zinc-300"}`,children:[s.jsxs("div",{className:"aspect-square bg-zinc-800/50 relative flex items-center justify-center",children:[Ne?s.jsx("img",{src:Ne,alt:"",className:"w-full h-full object-cover",loading:"lazy"}):s.jsx(si,{size:20,className:n?"text-zinc-500":"text-zinc-400"}),s.jsx("button",{type:"button",onClick:ke=>{ke.stopPropagation(),E(xe.id)},className:"absolute top-0.5 right-0.5 p-0.5 rounded bg-black/40 hover:bg-black/60 text-white",title:ve?"取消收藏":"收藏",children:s.jsx(vj,{size:10,fill:ve?"currentColor":"none"})})]}),s.jsxs("div",{className:"p-1 flex items-center justify-between gap-0.5",children:[s.jsx("span",{className:"text-[10px] truncate flex-1 min-w-0",title:xe.title,children:xe.title||xe.id}),s.jsx("button",{type:"button",onClick:()=>C(xe),className:"shrink-0 text-[10px] text-blue-500 hover:text-blue-400 font-medium",title:"插入画布",children:"+插入"})]})]},xe.id)})})]},Ee)),de&&s.jsx("div",{className:"text-center py-2",children:s.jsx("button",{type:"button",onClick:$e,className:`text-xs ${n?"text-zinc-400 hover:text-zinc-200":"text-zinc-500 hover:text-zinc-700"}`,children:"加载更多"})})]})]})]}):s.jsx(s.Fragment,{children:s.jsxs("div",{className:`px-3 py-2 border-b ${n?"border-zinc-800":"border-zinc-200"}`,children:[d==="eagle"&&c?s.jsxs("div",{className:"flex flex-col gap-2",children:[s.jsxs("button",{type:"button",onClick:I,disabled:i,className:`flex items-center justify-center gap-2 w-full py-2 rounded-lg text-xs font-medium transition-colors ${n?"bg-zinc-800 hover:bg-zinc-700 text-zinc-200 disabled:opacity-50":"bg-zinc-200 hover:bg-zinc-300 text-zinc-800 disabled:opacity-50"}`,children:[s.jsx(si,{size:14}),i?"连接中…":"连接 Eagle"]}),h.length>0&&s.jsx("div",{className:"max-h-48 overflow-y-auto custom-scrollbar space-y-0.5",children:h.map(Ee=>s.jsx(S$,{folder:Ee,depth:0,currentEagleFolderId:p,isDark:n,onSwitchEagleFolder:R},Ee.id))})]}):c?s.jsxs("div",{className:"flex flex-col gap-2",children:[s.jsxs("button",{type:"button",onClick:y,disabled:i,className:`flex items-center justify-center gap-2 w-full py-2 rounded-lg text-xs font-medium transition-colors ${n?"bg-zinc-800 hover:bg-zinc-700 text-zinc-200 disabled:opacity-50":"bg-zinc-200 hover:bg-zinc-300 text-zinc-800 disabled:opacity-50"}`,children:[s.jsx(Ll,{size:14}),i?"加载中…":"添加文件夹"]}),l.length>0&&s.jsxs(s.Fragment,{children:[s.jsxs("button",{type:"button",onClick:()=>H(Ee=>!Ee),className:`flex items-center gap-1 w-full text-left py-1 rounded ${n?"hover:bg-zinc-800/50":"hover:bg-zinc-200/50"}`,children:[q?s.jsx(Ja,{size:10,className:`shrink-0 ${n?"text-zinc-500":"text-zinc-400"}`}):s.jsx(Ei,{size:10,className:`shrink-0 ${n?"text-zinc-500":"text-zinc-400"}`}),s.jsx("span",{className:`text-[10px] ${n?"text-zinc-500":"text-zinc-400"}`,children:"切换文件夹"}),o&&s.jsxs("span",{className:`flex-1 truncate text-[10px] ml-1 ${n?"text-zinc-400":"text-zinc-600"}`,children:["(",l.findIndex(Ee=>Ee===o)+1,"/",l.length,")"]})]}),!q&&s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"max-h-20 overflow-y-auto custom-scrollbar space-y-0.5",children:l.map(Ee=>{const Ce=Ee.split(/[/\\]/).filter(Boolean).pop()||Ee,xe=Ee===o;return s.jsx("button",{type:"button",onClick:()=>w(Ee),className:`w-full text-left px-2 py-1 rounded-md text-[10px] truncate transition-colors ${xe?n?"bg-blue-500/30 text-blue-400":"bg-blue-500/20 text-blue-600":n?"text-zinc-400 hover:bg-zinc-800 hover:text-zinc-200":"text-zinc-600 hover:bg-zinc-200 hover:text-zinc-800"}`,title:Ee,children:Ce},Ee)})}),s.jsxs("div",{className:"flex items-center justify-end gap-1",children:[s.jsxs("button",{type:"button",onClick:v,className:`p-1 rounded text-[10px] ${n?"text-zinc-400 hover:bg-zinc-700 hover:text-zinc-200":"text-zinc-500 hover:bg-zinc-200 hover:text-zinc-700"}`,title:"从列表移除当前文件夹",children:[s.jsx(Zi,{size:10,className:"inline"})," 移除"]}),s.jsx("button",{type:"button",onClick:m,className:`text-[10px] ${n?"text-zinc-400 hover:text-zinc-300":"text-zinc-500 hover:text-zinc-700"}`,title:"清除全部文件夹",children:"清除全部"})]})]})]})]}):s.jsxs(s.Fragment,{children:[s.jsx("input",{ref:N,type:"file",accept:"image/png,image/jpeg,image/jpg,image/gif,image/webp,image/bmp",multiple:!0,className:"hidden",onChange:te}),s.jsxs("button",{type:"button",onClick:G,className:`flex items-center justify-center gap-2 w-full py-2 rounded-lg text-xs font-medium transition-colors ${n?"bg-zinc-800 hover:bg-zinc-700 text-zinc-200":"bg-zinc-200 hover:bg-zinc-300 text-zinc-800"}`,children:[s.jsx(ou,{size:14}),"选择图片"]})]}),a&&s.jsx("p",{className:"mt-1 text-[10px] text-red-500",children:a})]})}),!(d==="eagle"&&c&&h.length>0)&&s.jsxs(s.Fragment,{children:[s.jsxs("div",{className:"px-3 py-2",children:[s.jsxs("div",{className:`flex items-center gap-2 px-2 py-1.5 rounded-lg text-xs ${n?"bg-zinc-900 border border-zinc-800 text-zinc-300":"bg-white border border-zinc-200 text-zinc-700"}`,children:[s.jsx("span",{className:"text-[10px] opacity-70",children:"搜索"}),s.jsx("input",{value:F,onChange:Ee=>L(Ee.target.value),placeholder:"按名称或分类过滤",className:`flex-1 bg-transparent outline-none text-xs ${n?"placeholder:text-zinc-600":"placeholder:text-zinc-400"}`})]}),s.jsxs("div",{className:"flex gap-1 mt-2",children:[s.jsx("button",{type:"button",onClick:()=>T("all"),className:`flex-1 py-1.5 rounded-md text-[11px] font-medium ${X==="all"?n?"bg-blue-500/30 text-blue-400":"bg-blue-500/20 text-blue-600":n?"bg-zinc-800 text-zinc-400 hover:text-zinc-200":"bg-zinc-200 text-zinc-600 hover:text-zinc-800"}`,children:"全部"}),s.jsx("button",{type:"button",onClick:()=>T("favorites"),className:`flex-1 py-1.5 rounded-md text-[11px] font-medium ${X==="favorites"?n?"bg-blue-500/30 text-blue-400":"bg-blue-500/20 text-blue-600":n?"bg-zinc-800 text-zinc-400 hover:text-zinc-200":"bg-zinc-200 text-zinc-600 hover:text-zinc-800"}`,children:"收藏"})]})]}),s.jsxs("div",{className:"flex-1 overflow-y-auto custom-scrollbar px-3 pb-3",children:[r.length===0&&!i&&s.jsx("div",{className:`mt-6 text-center text-xs ${n?"text-zinc-500":"text-zinc-400"}`,children:d==="eagle"?"请点击「连接 Eagle」并确保 Eagle 应用已打开":c?"请点击「添加文件夹」添加姿势图片":"请点击「选择图片」添加姿势"}),r.length>0&&ne.length===0&&s.jsx("div",{className:`mt-6 text-center text-xs ${n?"text-zinc-500":"text-zinc-400"}`,children:"没有匹配当前搜索条件的姿势。"}),le.map(([Ee,Ce])=>s.jsxs("div",{className:"mb-3",children:[s.jsxs("div",{className:"flex items-center justify-between mb-1.5",children:[s.jsx("span",{className:`text-[11px] font-medium ${n?"text-zinc-300":"text-zinc-700"}`,children:Ee}),s.jsxs("span",{className:`text-[10px] ${n?"text-zinc-500":"text-zinc-400"}`,children:[Ce.length," 个"]})]}),s.jsx("div",{className:"grid gap-1.5",style:{gridTemplateColumns:"repeat(auto-fill, minmax(72px, 1fr))"},children:Ce.map(xe=>{const Ne=B[xe.id]??xe.imageUrl,ve=u.has(xe.id);return s.jsxs("div",{ref:ke=>{ke?k.current.set(xe.id,ke):k.current.delete(xe.id)},"data-pose-id":xe.id,draggable:!0,onDragStart:ke=>{ke.dataTransfer.setData("application/json",JSON.stringify({type:"pose-reference",itemId:xe.id,title:xe.title})),ke.dataTransfer.effectAllowed="copy"},className:`group rounded overflow-hidden border cursor-pointer transition-colors ${n?"bg-zinc-900 border-zinc-800 hover:border-blue-500/60":"bg-white border-zinc-200 hover:border-blue-500/60"}`,children:[s.jsxs("div",{className:"aspect-[3/4] relative bg-zinc-800/50 flex items-center justify-center min-h-0",children:[Ne?s.jsx("img",{src:Ne,alt:xe.title,className:"w-full h-full object-contain",loading:"lazy"}):s.jsxs("div",{className:"w-full h-full flex flex-col items-center justify-center gap-0.5 text-zinc-500 text-[9px]",children:[s.jsx(Pv,{size:12}),s.jsx("span",{children:xe.filePath?"…":"无"})]}),s.jsx("button",{type:"button",onClick:ke=>{ke.stopPropagation(),E(xe.id)},className:`absolute top-0.5 right-0.5 w-4 h-4 rounded flex items-center justify-center transition-colors ${ve?"text-amber-400 bg-amber-500/20 hover:bg-amber-500/30":n?"text-zinc-400 bg-zinc-800/80 hover:bg-zinc-700 hover:text-zinc-200":"text-zinc-500 bg-white/80 hover:bg-zinc-200 hover:text-zinc-700"}`,title:ve?"取消收藏":"收藏",children:s.jsx(vj,{size:9,fill:ve?"currentColor":"none"})}),s.jsxs("button",{type:"button",onClick:ke=>{ke.stopPropagation(),C(xe)},className:`absolute bottom-0.5 left-0.5 right-0.5 flex items-center justify-center gap-0.5 py-0.5 rounded text-[9px] font-medium transition-colors ${n?"bg-blue-600/90 text-white hover:bg-blue-500":"bg-blue-500/95 text-white hover:bg-blue-600"}`,title:"插入到画布",children:[s.jsx(Xi,{size:8}),"插入"]})]}),s.jsx("div",{className:"px-1 py-0.5 min-h-0",children:s.jsx("p",{className:`text-[9px] truncate leading-tight ${n?"text-zinc-200":"text-zinc-700"}`,children:xe.title})})]},xe.id)})})]},Ee)),de&&s.jsxs("button",{type:"button",onClick:$e,className:`w-full py-2 mt-2 rounded-lg text-xs font-medium ${n?"bg-zinc-800 hover:bg-zinc-700 text-zinc-300":"bg-zinc-200 hover:bg-zinc-300 text-zinc-700"}`,children:["加载更多(还剩 ",fe-J," 个)"]})]})]})]});return t?s.jsxs("div",{ref:we,className:ze,style:{position:"fixed",left:re.x,top:re.y,width:re.w,height:re.h,pointerEvents:"auto"},children:[_e,s.jsx("div",{onMouseDown:Ee=>U(Ee,"e"),className:"absolute top-0 right-0 bottom-0 w-1 cursor-ew-resize hover:bg-blue-500/30",style:{right:-2,marginRight:0},title:"拖拽调整宽度"}),s.jsx("div",{onMouseDown:Ee=>U(Ee,"s"),className:"absolute left-0 right-0 bottom-0 h-1 cursor-ns-resize hover:bg-blue-500/30",style:{bottom:-2},title:"拖拽调整高度"}),s.jsx("div",{onMouseDown:Ee=>U(Ee,"se"),className:"absolute w-3 h-3 cursor-nwse-resize hover:bg-blue-500/40 rounded-br-lg",style:{right:-4,bottom:-4},title:"拖拽缩放"})]}):s.jsx("div",{className:`absolute left-0 top-2 bottom-2 w-[240px] ${ze} ${n?"border-zinc-800":"border-zinc-200"}`,style:{pointerEvents:"auto"},children:_e})},Ote=_.memo(Pte);function Lte(e){const t=new Date(e),n=new Date;return t.toDateString()===n.toDateString()?t.toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit"}):t.toLocaleDateString("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})}const Bte=({isOpen:e,isDark:t,projects:n,currentProjectId:r,currentProjectName:i,isSaving:a,isLoading:o,progress:l={percent:0,message:""},onClose:c,onRefreshList:u,onSaveCurrent:d,onSaveAs:h,onOpen:p,onInsert:f,onDelete:b,projectName:g=""})=>{const[y,w]=_.useState(null),[v,m]=_.useState(""),[z,C]=_.useState(!1),[E,I]=_.useState("workflow+assets");_.useEffect(()=>{e&&u()},[e,u]);const R=async()=>{const O=(v||g||"未命名项目").trim();if(O)try{await h(O,E),C(!1),m("")}catch(F){console.error("[ProjectPanel] Save as failed:",F)}},A=async O=>{try{await b(O),y===O&&w(null)}catch(F){console.error("[ProjectPanel] Delete failed:",F)}};return e?s.jsxs("div",{className:`absolute left-0 top-2 bottom-2 w-[240px] z-40 flex flex-col transition-all duration-300 ease-in-out rounded-2xl ${t?"bg-[#121214] border border-zinc-800 shadow-xl":"bg-zinc-50 border border-zinc-200 shadow-xl"}`,style:{pointerEvents:"auto"},children:[s.jsxs("div",{className:`p-3 border-b flex justify-between items-center ${t?"border-zinc-800":"border-zinc-200"}`,children:[s.jsxs("h3",{className:`font-bold text-xs flex items-center gap-2 ${t?"text-zinc-300":"text-zinc-700"}`,children:[s.jsx(Ll,{size:16,className:"text-amber-500"}),"项目管理"]}),s.jsx("button",{onClick:c,className:t?"text-zinc-500 hover:text-zinc-300":"text-zinc-400 hover:text-zinc-600",children:s.jsx(Qr,{size:12})})]}),(a||o)&&s.jsxs("div",{className:`px-3 py-2 border-b ${t?"border-zinc-800":"border-zinc-200"}`,children:[s.jsxs("div",{className:"flex justify-between items-center mb-1",children:[s.jsxs("span",{className:`text-[10px] ${t?"text-zinc-400":"text-zinc-500"}`,children:[a?"保存中":"打开中","…"]}),s.jsxs("span",{className:`text-[10px] ${t?"text-zinc-400":"text-zinc-500"}`,children:[Math.round(l.percent),"%"]})]}),s.jsx("div",{className:`h-1.5 rounded-full overflow-hidden ${t?"bg-zinc-800":"bg-zinc-200"}`,children:s.jsx("div",{className:"h-full rounded-full transition-all duration-300 bg-amber-500",style:{width:`${Math.min(100,Math.max(0,l.percent))}%`}})}),l.message&&s.jsx("p",{className:`mt-1 text-[10px] truncate ${t?"text-zinc-500":"text-zinc-400"}`,title:l.message,children:l.message})]}),s.jsxs("div",{className:`p-2 flex flex-col gap-1.5 border-b ${t?"border-zinc-800":"border-zinc-200"}`,children:[s.jsxs("div",{className:`rounded-lg border p-1.5 ${t?"border-zinc-700 bg-zinc-800/50":"border-zinc-200 bg-zinc-100/80"}`,children:[s.jsx("p",{className:`text-[10px] mb-1.5 font-medium ${t?"text-zinc-400":"text-zinc-500"}`,children:"保存内容"}),s.jsxs("div",{className:"flex gap-1",children:[s.jsxs("button",{type:"button",onClick:()=>I("workflow+assets"),className:`flex-1 flex items-center justify-center gap-1 py-1.5 px-1 rounded text-[10px] font-medium transition-colors ${E==="workflow+assets"?t?"bg-amber-600/30 text-amber-400 border border-amber-500/50":"bg-amber-100 text-amber-700 border border-amber-300":t?"border border-transparent text-zinc-400 hover:text-zinc-300 hover:bg-zinc-700":"border border-transparent text-zinc-500 hover:bg-zinc-200"}`,title:"保存画布工作流及节点中的图片/视频/音频(优先本地缓存)",children:[s.jsx(si,{size:12}),"工作流+图片"]}),s.jsxs("button",{type:"button",onClick:()=>I("workflow-only"),className:`flex-1 flex items-center justify-center gap-1 py-1.5 px-1 rounded text-[10px] font-medium transition-colors ${E==="workflow-only"?t?"bg-amber-600/30 text-amber-400 border border-amber-500/50":"bg-amber-100 text-amber-700 border border-amber-300":t?"border border-transparent text-zinc-400 hover:text-zinc-300 hover:bg-zinc-700":"border border-transparent text-zinc-500 hover:bg-zinc-200"}`,title:"仅保存节点与连接结构,不含图片/视频(体积小、优先本地缓存)",children:[s.jsx(I5,{size:12}),"仅工作流"]})]})]}),s.jsxs("button",{onClick:()=>d(E),disabled:a||!r,className:`flex items-center justify-center gap-1.5 py-2 px-2 rounded-lg text-xs font-medium transition-colors ${a||!r?t?"bg-zinc-800 text-zinc-500 cursor-not-allowed":"bg-zinc-200 text-zinc-400 cursor-not-allowed":t?"bg-amber-600/20 text-amber-400 hover:bg-amber-600/30":"bg-amber-100 text-amber-700 hover:bg-amber-200"}`,title:r?"覆盖保存当前项目(按上方所选保存内容)":"需先通过「另存为」保存当前工作流",children:[a?s.jsx(zr,{size:14,className:"animate-spin"}):s.jsx(xu,{size:14}),"保存当前"]}),z?s.jsxs("div",{className:"flex flex-col gap-1",children:[s.jsx("input",{type:"text",value:v,onChange:O=>m(O.target.value),placeholder:g||"未命名项目",className:`w-full px-2 py-1.5 text-xs rounded border ${t?"bg-zinc-800 border-zinc-600 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,onKeyDown:O=>{O.key==="Enter"&&R(),O.key==="Escape"&&C(!1)},autoFocus:!0}),s.jsxs("div",{className:"flex gap-1",children:[s.jsx("button",{onClick:R,className:`flex-1 py-1 text-xs rounded ${t?"bg-amber-600 text-white":"bg-amber-500 text-white"}`,children:"保存"}),s.jsx("button",{onClick:()=>{C(!1),m("")},className:`flex-1 py-1 text-xs rounded ${t?"bg-zinc-700 text-zinc-300":"bg-zinc-200 text-zinc-600"}`,children:"取消"})]})]}):s.jsxs("button",{onClick:()=>C(!0),disabled:a,className:`flex items-center justify-center gap-1.5 py-2 px-2 rounded-lg text-xs font-medium transition-colors ${t?"bg-zinc-800 text-zinc-300 hover:bg-zinc-700":"bg-zinc-200 text-zinc-600 hover:bg-zinc-300"}`,title:"另存为新项目",children:[s.jsx(UP,{size:14}),"另存为"]})]}),s.jsxs("div",{className:`flex-1 overflow-y-auto p-2 ${t?"rh-scroll-minimal":""}`,children:[i&&s.jsxs("p",{className:`text-[10px] mb-2 ${t?"text-zinc-500":"text-zinc-400"}`,children:["当前:",i]}),n.length===0?s.jsxs("div",{className:`text-center py-8 text-xs ${t?"text-zinc-500":"text-zinc-400"}`,children:["暂无已保存项目",s.jsx("br",{}),"点击「另存为」保存当前工作流"]}):s.jsx("ul",{className:"space-y-1.5",children:n.map(O=>s.jsxs("li",{className:`rounded-lg border transition-colors ${y===O.id?t?"border-amber-500/50 bg-amber-500/10":"border-amber-500 bg-amber-50":t?"border-zinc-800 hover:border-zinc-600":"border-zinc-200 hover:border-zinc-300"}`,children:[s.jsxs("div",{className:"p-2 cursor-pointer",onClick:()=>w(y===O.id?null:O.id),children:[s.jsx("p",{className:`text-xs font-medium truncate ${t?"text-zinc-200":"text-zinc-800"}`,title:O.name,children:O.name}),s.jsxs("p",{className:`text-[10px] mt-0.5 ${t?"text-zinc-500":"text-zinc-400"}`,children:[Lte(O.updatedAt)," · ",O.nodeCount," 节点"]})]}),y===O.id&&s.jsxs("div",{className:`flex border-t ${t?"border-zinc-800":"border-zinc-200"}`,children:[s.jsxs("button",{onClick:()=>p(O.id,O.name),disabled:o,className:`flex-1 flex items-center justify-center gap-1 py-1.5 text-[10px] ${t?"hover:bg-zinc-700 text-zinc-300":"hover:bg-zinc-100 text-zinc-600"}`,title:"打开(替换当前画布)",children:[o?s.jsx(zr,{size:10,className:"animate-spin"}):s.jsx(Ll,{size:10}),"打开"]}),f&&s.jsxs("button",{onClick:()=>f(O.id),disabled:o,className:`flex-1 flex items-center justify-center gap-1 py-1.5 text-[10px] ${t?"hover:bg-zinc-700 text-zinc-300":"hover:bg-zinc-100 text-zinc-600"}`,title:"插入到当前画布(不替换现有工作流)",children:[o?s.jsx(zr,{size:10,className:"animate-spin"}):s.jsx(Xi,{size:10}),"插入"]}),s.jsxs("button",{onClick:()=>A(O.id),className:`flex-1 flex items-center justify-center gap-1 py-1.5 text-[10px] ${t?"hover:bg-red-900/30 text-red-400":"hover:bg-red-50 text-red-600"}`,title:"删除",children:[s.jsx(Zi,{size:10}),"删除"]})]})]},O.id))})]})]}):null},Ute=_.memo(Bte);function Fte(e){const t=new Date(e),n=new Date;return t.toDateString()===n.toDateString()?t.toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit"}):t.toLocaleDateString("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})}const C1=240,X2=320,Y2=560,J2=.88,kN="scriptWriterPanelFloatBounds";function Wte(){return typeof window>"u"?{x:56,y:72,w:280,h:520}:{x:56,y:72,w:280,h:Math.min(520,window.innerHeight*.7)}}const Dte=({isOpen:e,floating:t=!1,onSwitchToSidebar:n,onSwitchToFloating:r,isDark:i,project:a,projectMetas:o,currentProjectId:l,selectedEpisodeId:c,isSplitting:u,isGeneratingEpisode:d,splitProgress:h,scriptModel:p,chatModels:f,onClose:b,onSetOutline:g,onSetEpisodeCount:y,onSetProjectName:w,onImportTxt:v,onSmartSplit:m,onSmartSplitByDuration:z,onAddEpisode:C,onRemoveEpisode:E,onUpdateEpisode:I,onSelectEpisode:R,onGenerateEpisode:A,onCancelGeneration:O,onSetScriptModel:F,onSetScriptPromptCustom:L,onSetScriptSkillId:X,onNewProject:T,onSwitchProject:q,onDeleteProject:H,onExportToCanvas:J,onExtract:Z,onExtractManual:B,isExtracting:V,extractProgress:N,onExportItemToCanvas:j,onGenerateSceneConcept:k,isGeneratingConcept:W,onExportSceneToCanvas:M,onExportShotToCanvas:Y,allStyles:se=[],customStyles:ie=[],onAddCustomStyle:oe,onRemoveCustomStyle:re,onUpdateCustomStyle:ee,onGenerateStyleWithAI:pe,isGeneratingStyle:we,extractionModelId:Q,onSetExtractionModelId:me,extractionSkillId:ue,onSetExtractionSkillId:U})=>{var Zn;const[G,te]=_.useState("script"),[ge,ne]=_.useState(null),[le,fe]=_.useState(null),[be,de]=_.useState(null),$e=_.useRef(null),[ze,_e]=_.useState(null),[Ee,Ce]=_.useState(null),[xe,Ne]=_.useState(a.extractionArtStyle||"auto");_.useEffect(()=>{Ne(a.extractionArtStyle||"auto")},[a.id]);const[ve,ke]=_.useState(()=>{try{return _c()}catch{return[]}}),[Ie,Pe]=_.useState(0);_.useEffect(()=>{const Ke=Et=>{(Et.key===Tm||Et.key===_m)&&Pe(Gn=>Gn+1)};return window.addEventListener("storage",Ke),()=>window.removeEventListener("storage",Ke)},[]);const Te=_.useRef(null);_.useEffect(()=>{if(Te.current&&!d){const Ke=Te.current,Et=a.episodes.find(Gn=>Gn.id===Ke);Et&&!Et.segmentDetail&&Et.expandedScript&&(te("shots"),ne(Ke))}Te.current=d},[d,a.episodes]);const[Be,He]=_.useState(!1),[Je,Me]=_.useState(!1),[Re,Ve]=_.useState(""),[Ze,je]=_.useState(null),[Le,Xe]=_.useState(null),[qe,tt]=_.useState(""),[Ye,ct]=_.useState(""),[pt,ht]=_.useState(""),[wt,$t]=_.useState(""),[jt,Nt]=_.useState("auto"),[Yt,un]=_.useState(!1),[Tn,Ht]=_.useState(!1),[fn,Dn]=_.useState(!1),it=_.useRef(null);_.useEffect(()=>{if(!fn)return;const Ke=Et=>{it.current&&!it.current.contains(Et.target)&&Dn(!1)};return document.addEventListener("mousedown",Ke),()=>document.removeEventListener("mousedown",Ke)},[fn]);const[Lt,gt]=_.useState(!1),Jt=_.useRef(null);_.useEffect(()=>{if(!Lt)return;const Ke=Et=>{Jt.current&&!Jt.current.contains(Et.target)&>(!1)};return document.addEventListener("mousedown",Ke),()=>document.removeEventListener("mousedown",Ke)},[Lt]);const[Wt,Pt]=_.useState(""),[Bt,zt]=_.useState(""),[Gt,qt]=_.useState(null),[De,st]=_.useState(null),[Ae,nt]=_.useState(""),[_t,xt]=_.useState(""),[Tt,St]=_.useState(""),[Qe,Ue]=_.useState(""),[Ge,at]=_.useState("idle"),[rt,lt]=_.useState(5),[ot,At]=_.useState(0),[kt,Ot]=_.useState(1),[dn,Vt]=_.useState(0),[Zt,Sn]=_.useState(20),[jn,_n]=_.useState(null),Cn=_.useCallback(()=>{try{const Ke=localStorage.getItem(kN);if(Ke){const Et=JSON.parse(Ke);if((Et==null?void 0:Et.x)!=null&&(Et==null?void 0:Et.y)!=null&&(Et==null?void 0:Et.w)!=null&&(Et==null?void 0:Et.h)!=null)return{x:Math.max(0,Et.x),y:Math.max(0,Et.y),w:Math.min(Y2,Math.max(C1,Et.w)),h:Math.min(typeof window<"u"?window.innerHeight*J2:600,Math.max(X2,Et.h))}}}catch{}return Wte()},[]),[Kn,Xn]=_.useState(()=>Cn()),$r=_.useCallback(Ke=>{try{localStorage.setItem(kN,JSON.stringify(Ke))}catch{}},[]);_.useEffect(()=>{if(t&&mt.current){const Ke=mt.current;Xn(Ke),$r(Ke),mt.current=null}},[t,$r]);const Tr=_.useRef(null),kr=_.useRef(!1),Rr=_.useRef(null),sr=_.useRef(null),mt=_.useRef(null),It=_.useRef(null),tn=_.useCallback(Ke=>{if(!t||Ke.target.closest("button[data-no-drag]"))return;Ke.preventDefault();const Et=Rr.current;if(!Et)return;kr.current=!1;const Gn=Et.getBoundingClientRect();Tr.current={startX:Gn.left,startY:Gn.top,mouseX:Ke.clientX,mouseY:Ke.clientY};const Ut=5,Bn=br=>{const vr=Tr.current;if(!vr||!Et)return;const gr=br.clientX-vr.mouseX,nr=br.clientY-vr.mouseY;!kr.current&&(Math.abs(gr)>Ut||Math.abs(nr)>Ut)&&(kr.current=!0);const tr=Kn.w,jr=Kn.h,Br=typeof window<"u"?window.innerWidth-tr:9999,_r=typeof window<"u"?window.innerHeight-jr:9999,es=Math.max(0,Math.min(Br,vr.startX+gr)),Ur=Math.max(0,Math.min(_r,vr.startY+nr));Et.style.left=`${es}px`,Et.style.top=`${Ur}px`},Nr=()=>{if(!Tr.current||!Et)return;setTimeout(()=>{kr.current=!1},0);const br=parseFloat(Et.style.left),vr=parseFloat(Et.style.top);if(Et.style.left="",Et.style.top="",Tr.current=null,document.removeEventListener("mousemove",Bn),document.removeEventListener("mouseup",Nr),!Number.isNaN(br)&&!Number.isNaN(vr)){const gr=Kn.w,nr=Kn.h,tr=typeof window<"u"?window.innerWidth-gr:9999,jr=typeof window<"u"?window.innerHeight-nr:9999,Br=Math.max(0,Math.min(tr,br)),_r=Math.max(0,Math.min(jr,vr));Xn(es=>{const Ur={...es,x:Br,y:_r};return $r(Ur),Ur})}};document.addEventListener("mousemove",Bn),document.addEventListener("mouseup",Nr)},[t,Kn,$r]),cn=_.useCallback((Ke,Et)=>{if(!t)return;Ke.preventDefault(),Ke.stopPropagation();const Gn={edge:Et,startX:Ke.clientX,startY:Ke.clientY,w:Kn.w,h:Kn.h};It.current=Gn;const Ut=Nr=>{const br=It.current;if(!br)return;const vr=Nr.clientX-br.startX,gr=Nr.clientY-br.startY;let nr=br.w,tr=br.h;br.edge.includes("e")&&(nr=Math.max(C1,Math.min(Y2,br.w+vr))),br.edge.includes("s")&&(tr=Math.max(X2,Math.min(typeof window<"u"?window.innerHeight*J2:800,br.h+gr))),Xn(jr=>({...jr,w:nr,h:tr}))},Bn=()=>{It.current=null,document.removeEventListener("mousemove",Ut),document.removeEventListener("mouseup",Bn),Xn(Nr=>($r(Nr),Nr))};document.addEventListener("mousemove",Ut),document.addEventListener("mouseup",Bn)},[t,Kn,$r]),zn=_.useCallback((Ke,Et,Gn)=>{const Ut=a.episodes.find(Nr=>Nr.id===Ke);if(!(Ut!=null&&Ut.scenes))return;const Bn=Ut.scenes.map(Nr=>Nr.sceneNumber===Et?{...Nr,...Gn}:Nr);I(Ke,{scenes:Bn})},[a.episodes,I]),Rn=_.useMemo(()=>ot*3600+kt*60+dn,[ot,kt,dn]),bt=_.useMemo(()=>Rn>0&&Zt>0?Math.ceil(Rn/Zt):0,[Rn,Zt]),bn=[{key:"plan",icon:s.jsx(kG,{size:14}),label:"计划"},{key:"script",icon:s.jsx(Vo,{size:14}),label:"剧本"},{key:"shots",icon:s.jsx(Ya,{size:14}),label:"镜头"},{key:"settings",icon:s.jsx(Ov,{size:14}),label:"设定"}],An=_.useCallback(Ke=>{de(Ke),setTimeout(()=>{var Et;return(Et=$e.current)==null?void 0:Et.focus()},50)},[]),Vn=_.useCallback((Ke,Et)=>{Et.trim()&&I(Ke,{title:Et.trim()}),de(null)},[I]),Sr=_.useCallback(Ke=>{var Gn,Ut,Bn;const Et=[`Ep${Ke.index} ${Ke.title}`,""];return Ke.durationSeconds&&Et.push(`时长: ${Ke.durationSeconds}秒`,""),(Gn=Ke.emotionKeywords)!=null&&Gn.length&&Et.push(`情绪关键词: ${Ke.emotionKeywords.join(" / ")}`,""),Ke.segmentDetail&&(Et.push("1. 主题",Ke.segmentDetail.subject||"(无)","","2. 环境",Ke.segmentDetail.setting||"(无)","","3. 动作与时间线"),(Ut=Ke.segmentDetail.timeline)!=null&&Ut.length?Ke.segmentDetail.timeline.forEach(Nr=>Et.push(`${Nr.timeRange} ${Nr.description}`)):Et.push("(无)"),Et.push("","4. 镜头",Ke.segmentDetail.camera||"(无)","","5. 影像风格",Ke.segmentDetail.visualStyle||"(无)","","6. 声音",Ke.segmentDetail.audio||"(无)","","7. 衔接",Ke.segmentDetail.transition||"(无)","","8. 旁白",Ke.segmentDetail.narration||"(无)","")),Ke.hookSummary&&Et.push("钩子",Ke.hookSummary,""),(Bn=Ke.content)!=null&&Bn.trim()&&Et.push("正文",Ke.content.trim()),Et.join(` +`).trim()},[]),Ir=_.useCallback(async Ke=>{var Gn;const Et=Sr(Ke);try{if((Gn=navigator==null?void 0:navigator.clipboard)!=null&&Gn.writeText)await navigator.clipboard.writeText(Et);else{const Ut=document.createElement("textarea");Ut.value=Et,Ut.setAttribute("readonly","true"),Ut.style.position="absolute",Ut.style.left="-9999px",document.body.appendChild(Ut),Ut.select(),document.execCommand("copy"),document.body.removeChild(Ut)}fe(Ke.id),setTimeout(()=>{fe(Ut=>Ut===Ke.id?null:Ut)},1500)}catch{}},[Sr]),Wr=(Ke,Et,Gn)=>s.jsxs("div",{className:`rounded-xl border transition-all ${c===Ke.id?i?"border-amber-500/50 bg-amber-500/5":"border-amber-400 bg-amber-50":i?"border-zinc-800 hover:border-zinc-700 bg-zinc-900/50":"border-zinc-200 hover:border-zinc-300 bg-white"}`,children:[s.jsxs("div",{className:"flex items-center gap-1.5 px-2.5 py-2 cursor-pointer",onClick:()=>R(c===Ke.id?null:Ke.id),children:[s.jsx("button",{onClick:Ut=>{Ut.stopPropagation(),ne(Et?null:Ke.id)},className:`shrink-0 transition-transform ${Et?"rotate-0":"-rotate-90"} ${i?"text-zinc-500":"text-zinc-400"}`,children:s.jsx(Ei,{size:13})}),s.jsx("div",{className:"flex-1 min-w-0",children:be===Ke.id?s.jsx("input",{ref:$e,defaultValue:Ke.title,onBlur:Ut=>Vn(Ke.id,Ut.target.value),onKeyDown:Ut=>{Ut.key==="Enter"&&Ut.target.blur()},onClick:Ut=>Ut.stopPropagation(),className:`w-full text-xs font-medium px-1 py-0 rounded outline-none ${i?"bg-zinc-800 text-zinc-200 border border-amber-500/50":"bg-zinc-50 text-zinc-800 border border-amber-400"}`}):s.jsxs("span",{className:`text-xs font-medium truncate block ${i?"text-zinc-200":"text-zinc-800"}`,onDoubleClick:Ut=>{Ut.stopPropagation(),An(Ke.id)},children:[s.jsxs("span",{className:`${Ke.segmentDetail?i?"text-violet-400":"text-violet-600":i?"text-amber-400":"text-amber-600"} font-bold mr-1`,children:["Ep",Ke.index]}),"[",Ke.title,"]",Ke.durationSeconds&&s.jsxs("span",{className:`ml-1 text-[9px] ${i?"text-zinc-500":"text-zinc-400"}`,children:[Ke.durationSeconds,"s"]})]})}),s.jsxs("div",{className:"flex items-center gap-0.5 shrink-0",children:[s.jsx("button",{onClick:Ut=>{Ut.stopPropagation(),_n({type:"script",episodeId:Ke.id})},className:`p-1 rounded transition-colors ${i?"text-zinc-500 hover:text-violet-400 hover:bg-violet-400/10":"text-zinc-400 hover:text-violet-600 hover:bg-violet-50"}`,title:"展开到画布中心编辑",children:s.jsx(jh,{size:12})}),s.jsx("button",{onClick:Ut=>{Ut.stopPropagation(),Gn?O():A(Ke.id)},className:`p-1 rounded transition-colors ${Gn?"text-red-400 hover:bg-red-500/10":i?"text-zinc-500 hover:text-amber-400 hover:bg-amber-400/10":"text-zinc-400 hover:text-amber-600 hover:bg-amber-50"}`,title:Gn?"停止生成":"生成完整剧本",children:Gn?s.jsx(zr,{size:12,className:"animate-spin"}):s.jsx(Ia,{size:12})}),s.jsx("button",{onClick:Ut=>{Ut.stopPropagation(),E(Ke.id)},className:`p-1 rounded transition-colors ${i?"text-zinc-600 hover:text-red-400 hover:bg-red-400/10":"text-zinc-300 hover:text-red-500 hover:bg-red-50"}`,title:"删除此集",children:s.jsx(Qr,{size:12})})]})]}),Et&&s.jsxs("div",{className:`px-2.5 pb-2.5 border-t select-text ${i?"border-zinc-800":"border-zinc-100"}`,children:[s.jsx("div",{className:"flex items-center justify-end mt-2",children:s.jsxs("button",{onClick:Ut=>{Ut.stopPropagation(),Ir(Ke)},className:`px-1.5 py-0.5 rounded text-[9px] transition-colors flex items-center gap-1 ${i?"text-zinc-300 bg-zinc-800 hover:bg-zinc-700":"text-zinc-600 bg-zinc-100 hover:bg-zinc-200"}`,title:"复制当前片段文本",children:[le===Ke.id?s.jsx(Eo,{size:10}):s.jsx(Eh,{size:10}),le===Ke.id?"已复制":"复制文本"]})}),Ke.emotionKeywords&&Ke.emotionKeywords.length>0&&s.jsx("div",{className:"flex flex-wrap gap-1 mt-2 mb-1.5",children:Ke.emotionKeywords.map((Ut,Bn)=>s.jsx("span",{className:`text-[9px] px-1.5 py-0.5 rounded-full ${i?"bg-amber-500/10 text-amber-400 border border-amber-500/20":"bg-amber-50 text-amber-700 border border-amber-200"}`,children:Ut},Bn))}),Ke.segmentDetail?s.jsxs("div",{className:"mt-2 space-y-1.5",children:[Ke.segmentDetail.subject&&s.jsxs("div",{className:"text-[10px]",children:[s.jsx("span",{className:`font-bold ${i?"text-violet-400":"text-violet-600"}`,children:"1. 主题"}),s.jsx("div",{className:`mt-0.5 cursor-text ${i?"text-zinc-400":"text-zinc-600"}`,children:Ke.segmentDetail.subject})]}),Ke.segmentDetail.setting&&s.jsxs("div",{className:"text-[10px]",children:[s.jsx("span",{className:`font-bold ${i?"text-violet-400":"text-violet-600"}`,children:"2. 环境"}),s.jsx("div",{className:`mt-0.5 cursor-text ${i?"text-zinc-400":"text-zinc-600"}`,children:Ke.segmentDetail.setting})]}),Ke.segmentDetail.timeline&&Ke.segmentDetail.timeline.length>0&&s.jsxs("div",{className:"text-[10px]",children:[s.jsx("span",{className:`font-bold ${i?"text-violet-400":"text-violet-600"}`,children:"3. 动作与时间线"}),s.jsx("div",{className:"mt-1 space-y-1",children:Ke.segmentDetail.timeline.map((Ut,Bn)=>s.jsxs("div",{className:`flex gap-1.5 p-1.5 rounded-lg ${i?"bg-zinc-800/60":"bg-zinc-50"}`,children:[s.jsx("span",{className:`shrink-0 font-mono text-[9px] font-bold px-1 py-0.5 rounded ${i?"bg-violet-500/20 text-violet-300":"bg-violet-100 text-violet-700"}`,children:Ut.timeRange}),s.jsx("span",{className:`cursor-text ${i?"text-zinc-400":"text-zinc-600"}`,children:Ut.description})]},Bn))})]}),Ke.segmentDetail.camera&&s.jsxs("div",{className:"text-[10px]",children:[s.jsx("span",{className:`font-bold ${i?"text-violet-400":"text-violet-600"}`,children:"4. 镜头"}),s.jsx("div",{className:`mt-0.5 cursor-text ${i?"text-zinc-400":"text-zinc-600"}`,children:Ke.segmentDetail.camera})]}),Ke.segmentDetail.visualStyle&&s.jsxs("div",{className:"text-[10px]",children:[s.jsx("span",{className:`font-bold ${i?"text-violet-400":"text-violet-600"}`,children:"5. 影像风格"}),s.jsx("div",{className:`mt-0.5 cursor-text ${i?"text-zinc-400":"text-zinc-600"}`,children:Ke.segmentDetail.visualStyle})]}),Ke.segmentDetail.audio&&s.jsxs("div",{className:"text-[10px]",children:[s.jsx("span",{className:`font-bold ${i?"text-violet-400":"text-violet-600"}`,children:"6. 声音"}),s.jsx("div",{className:`mt-0.5 cursor-text ${i?"text-zinc-400":"text-zinc-600"}`,children:Ke.segmentDetail.audio})]}),Ke.segmentDetail.transition&&s.jsxs("div",{className:"text-[10px]",children:[s.jsx("span",{className:`font-bold ${i?"text-violet-400":"text-violet-600"}`,children:"7. 衔接"}),s.jsx("div",{className:`mt-0.5 cursor-text ${i?"text-zinc-400":"text-zinc-600"}`,children:Ke.segmentDetail.transition})]}),Ke.segmentDetail.narration&&s.jsxs("div",{className:"text-[10px]",children:[s.jsx("span",{className:`font-bold ${i?"text-violet-400":"text-violet-600"}`,children:"8. 旁白"}),s.jsxs("div",{className:`mt-0.5 italic cursor-text ${i?"text-zinc-400":"text-zinc-600"}`,children:['"',Ke.segmentDetail.narration,'"']})]})]}):s.jsx(s.Fragment,{children:Ke.hookSummary&&s.jsxs("div",{className:`text-[10px] mt-1.5 p-1.5 rounded-lg ${i?"bg-zinc-800/50 text-zinc-400":"bg-zinc-50 text-zinc-500"}`,children:[s.jsx("span",{className:"mr-1",children:"🪝"}),Ke.hookSummary]})}),s.jsx("textarea",{value:Ke.content,onChange:Ut=>I(Ke.id,{content:Ut.target.value}),placeholder:Ke.segmentDetail?"8 要素结构已生成,也可在此编辑原始内容...":"点击 ▶ 按钮 AI 生成完整剧本,或手动输入...",className:`w-full mt-2 text-[10px] leading-relaxed p-2 rounded-lg resize-none h-32 outline-none custom-scrollbar transition-colors ${i?"bg-zinc-900 border border-zinc-700 text-zinc-300 placeholder-zinc-600 focus:border-amber-500/30":"bg-zinc-50 border border-zinc-200 text-zinc-700 placeholder-zinc-400 focus:border-amber-400"}`})]})]},Ke.id),ir=`z-40 flex flex-col rounded-2xl overflow-hidden ${i?"bg-[#121214] border border-zinc-800 shadow-2xl":"bg-white border border-zinc-200 shadow-2xl"}`,Yn=s.jsxs(s.Fragment,{children:[s.jsxs("div",{onClickCapture:Ke=>{t&&kr.current&&!Ke.target.closest("button[data-no-drag]")&&(Ke.preventDefault(),Ke.stopPropagation())},className:`flex items-center border-b shrink-0 ${i?"border-zinc-800":"border-zinc-200"}`,children:[t&&s.jsx("div",{className:"flex items-center px-1 shrink-0 cursor-grab active:cursor-grabbing",onMouseDown:tn,title:"拖拽移动",children:s.jsx(k5,{size:14,className:i?"text-zinc-500":"text-zinc-400"})}),bn.map(Ke=>s.jsxs("button",{"data-no-drag":!0,onClick:()=>te(Ke.key),className:`flex-1 flex flex-col items-center gap-0.5 py-2 px-1 text-[10px] transition-colors relative ${G===Ke.key?i?"text-amber-400":"text-amber-600":i?"text-zinc-500 hover:text-zinc-300":"text-zinc-400 hover:text-zinc-600"}`,children:[Ke.icon,s.jsx("span",{children:Ke.label}),G===Ke.key&&s.jsx("div",{className:`absolute bottom-0 left-1/4 right-1/4 h-[2px] rounded-full ${i?"bg-amber-400":"bg-amber-500"}`})]},Ke.key)),!t&&r&&s.jsx("button",{type:"button","data-no-drag":!0,onClick:()=>{const Ke=sr.current;if(Ke){const Et=Ke.getBoundingClientRect();if(Et.left<100){const Ut=Cn(),Bn=Ut.w||C1;Ut.x<100?mt.current={...Ut,x:Math.min(120,typeof window<"u"?window.innerWidth-Bn-24:120),y:Math.max(24,Ut.y)}:mt.current=Ut}else mt.current={x:Math.max(0,Et.left),y:Math.max(0,Et.top),w:Math.max(C1,Math.min(Y2,Et.width)),h:Math.max(X2,Math.min(typeof window<"u"?window.innerHeight*J2:800,Et.height))}}r()},className:`p-1.5 mx-0.5 rounded-lg transition-colors ${i?"text-zinc-500 hover:bg-zinc-700 hover:text-zinc-300":"text-zinc-400 hover:bg-zinc-200 hover:text-zinc-600"}`,title:"弹出为悬浮窗口",children:s.jsx(Tw,{size:14})}),s.jsx("button",{"data-no-drag":!0,onClick:()=>t&&n?n():b(),title:t&&n?"收起为侧边栏":"关闭",className:`p-1.5 mx-1 rounded-lg transition-colors ${i?"text-zinc-500 hover:text-zinc-300 hover:bg-zinc-800":"text-zinc-400 hover:text-zinc-600 hover:bg-zinc-100"}`,children:s.jsx(Qr,{size:14})})]}),G==="script"&&s.jsxs("div",{className:"flex-1 flex flex-col overflow-hidden",children:[s.jsxs("div",{className:`p-3 border-b shrink-0 ${i?"border-zinc-800":"border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center justify-between mb-2",children:[s.jsx("h4",{className:`text-xs font-bold ${i?"text-zinc-300":"text-zinc-700"}`,children:"大纲"}),s.jsx("button",{onClick:v,className:`flex items-center gap-1 text-[10px] px-2 py-0.5 rounded transition-colors ${i?"text-amber-400 hover:bg-amber-400/10":"text-amber-600 hover:bg-amber-50"}`,children:"导入 TXT"})]}),s.jsx("textarea",{value:a.outline,onChange:Ke=>g(Ke.target.value),placeholder:"请输入小说内容或故事大纲...",className:`w-full h-28 text-xs p-2 rounded-lg resize-none transition-colors custom-scrollbar ${i?"bg-zinc-900 border border-zinc-700 text-zinc-200 placeholder-zinc-600 focus:border-amber-500/50":"bg-zinc-50 border border-zinc-300 text-zinc-800 placeholder-zinc-400 focus:border-amber-400"} outline-none`})]}),s.jsxs("div",{className:`p-3 border-b shrink-0 ${i?"border-zinc-800":"border-zinc-200"}`,children:[u?s.jsxs("button",{onClick:O,className:`w-full h-8 flex items-center justify-center gap-1.5 text-xs font-medium rounded-lg transition-all ${i?"bg-red-600/80 hover:bg-red-500 text-white":"bg-red-500 hover:bg-red-600 text-white"}`,children:[s.jsx(EG,{size:13}),"取消生成"]}):Ge==="idle"?s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsxs("div",{className:"relative flex-1 group/tip",children:[s.jsxs("button",{onClick:()=>at("episodes"),disabled:!a.outline.trim(),className:`w-full h-8 flex items-center justify-center gap-1.5 text-xs font-medium rounded-lg transition-all ${a.outline.trim()?i?"bg-amber-500 hover:bg-amber-400 text-black shadow-lg shadow-amber-500/20":"bg-amber-500 hover:bg-amber-600 text-white shadow-lg shadow-amber-500/20":i?"bg-zinc-800 text-zinc-600 cursor-not-allowed":"bg-zinc-200 text-zinc-400 cursor-not-allowed"}`,children:[s.jsx(bc,{size:13}),"智能分集"]}),s.jsx("div",{className:`absolute left-1/2 -translate-x-1/2 bottom-full mb-1.5 px-2 py-1 rounded-md text-[9px] whitespace-nowrap opacity-0 group-hover/tip:opacity-100 transition-opacity pointer-events-none z-50 ${i?"bg-zinc-700 text-zinc-200":"bg-zinc-800 text-white"}`,children:"适合创作长剧"})]}),s.jsxs("div",{className:"relative flex-1 group/tip2",children:[s.jsxs("button",{onClick:()=>at("duration"),disabled:!a.outline.trim(),className:`w-full h-8 flex items-center justify-center gap-1.5 text-xs font-medium rounded-lg transition-all ${a.outline.trim()?i?"bg-violet-600 hover:bg-violet-500 text-white shadow-lg shadow-violet-600/20":"bg-violet-500 hover:bg-violet-600 text-white shadow-lg shadow-violet-500/20":i?"bg-zinc-800 text-zinc-600 cursor-not-allowed":"bg-zinc-200 text-zinc-400 cursor-not-allowed"}`,children:[s.jsx(dd,{size:13}),"大致时长"]}),s.jsx("div",{className:`absolute left-1/2 -translate-x-1/2 bottom-full mb-1.5 px-2 py-1 rounded-md text-[9px] whitespace-nowrap opacity-0 group-hover/tip2:opacity-100 transition-opacity pointer-events-none z-50 ${i?"bg-zinc-700 text-zinc-200":"bg-zinc-800 text-white"}`,children:"适合短剧、短片广告"})]})]}):Ge==="episodes"?s.jsxs("div",{className:"space-y-2",children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsx("span",{className:`text-[10px] font-medium ${i?"text-zinc-400":"text-zinc-500"}`,children:"选择集数"}),s.jsx("button",{onClick:()=>at("idle"),className:`text-[10px] px-1.5 py-0.5 rounded transition-colors ${i?"text-zinc-500 hover:text-zinc-300 hover:bg-zinc-800":"text-zinc-400 hover:text-zinc-600 hover:bg-zinc-100"}`,children:"返回"})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("input",{type:"number",min:1,max:200,value:rt,onChange:Ke=>lt(Math.max(1,parseInt(Ke.target.value)||1)),className:`w-16 h-8 text-xs text-center rounded-lg outline-none transition-colors ${i?"bg-zinc-900 border border-zinc-700 text-zinc-200 focus:border-amber-500/50":"bg-zinc-50 border border-zinc-300 text-zinc-800 focus:border-amber-400"}`}),s.jsx("span",{className:`text-xs shrink-0 ${i?"text-zinc-400":"text-zinc-500"}`,children:"集"}),s.jsxs("button",{onClick:()=>{y(rt),m(rt),at("idle")},className:`flex-1 h-8 flex items-center justify-center gap-1.5 text-xs font-medium rounded-lg transition-all ${i?"bg-amber-500 hover:bg-amber-400 text-black shadow-lg shadow-amber-500/20":"bg-amber-500 hover:bg-amber-600 text-white shadow-lg shadow-amber-500/20"}`,children:[s.jsx(bc,{size:12}),"开始分集"]})]})]}):s.jsxs("div",{className:"space-y-2.5",children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsx("span",{className:`text-[10px] font-medium ${i?"text-zinc-400":"text-zinc-500"}`,children:"时长分段"}),s.jsx("button",{onClick:()=>at("idle"),className:`text-[10px] px-1.5 py-0.5 rounded transition-colors ${i?"text-zinc-500 hover:text-zinc-300 hover:bg-zinc-800":"text-zinc-400 hover:text-zinc-600 hover:bg-zinc-100"}`,children:"返回"})]}),s.jsxs("div",{children:[s.jsx("label",{className:`text-[10px] block mb-1 ${i?"text-zinc-500":"text-zinc-400"}`,children:"总时长"}),s.jsxs("div",{className:"flex items-center gap-1",children:[s.jsx("input",{type:"number",min:0,max:99,value:ot,onChange:Ke=>At(Math.max(0,parseInt(Ke.target.value)||0)),className:`w-10 h-7 text-[10px] text-center rounded outline-none ${i?"bg-zinc-900 border border-zinc-700 text-zinc-200 focus:border-violet-500/50":"bg-zinc-50 border border-zinc-300 text-zinc-800 focus:border-violet-400"}`}),s.jsx("span",{className:`text-[10px] ${i?"text-zinc-500":"text-zinc-400"}`,children:"时"}),s.jsx("input",{type:"number",min:0,max:59,value:kt,onChange:Ke=>Ot(Math.max(0,Math.min(59,parseInt(Ke.target.value)||0))),className:`w-10 h-7 text-[10px] text-center rounded outline-none ${i?"bg-zinc-900 border border-zinc-700 text-zinc-200 focus:border-violet-500/50":"bg-zinc-50 border border-zinc-300 text-zinc-800 focus:border-violet-400"}`}),s.jsx("span",{className:`text-[10px] ${i?"text-zinc-500":"text-zinc-400"}`,children:"分"}),s.jsx("input",{type:"number",min:0,max:59,value:dn,onChange:Ke=>Vt(Math.max(0,Math.min(59,parseInt(Ke.target.value)||0))),className:`w-10 h-7 text-[10px] text-center rounded outline-none ${i?"bg-zinc-900 border border-zinc-700 text-zinc-200 focus:border-violet-500/50":"bg-zinc-50 border border-zinc-300 text-zinc-800 focus:border-violet-400"}`}),s.jsx("span",{className:`text-[10px] ${i?"text-zinc-500":"text-zinc-400"}`,children:"秒"})]})]}),s.jsxs("div",{children:[s.jsx("label",{className:`text-[10px] block mb-1 ${i?"text-zinc-500":"text-zinc-400"}`,children:"每片段时长"}),s.jsxs("div",{className:"flex flex-wrap gap-1",children:[[10,15,20,30,45,60].map(Ke=>s.jsxs("button",{onClick:()=>Sn(Ke),className:`h-6 px-2 text-[10px] rounded transition-all ${Zt===Ke?i?"bg-violet-600 text-white border border-violet-500":"bg-violet-500 text-white border border-violet-400":i?"bg-zinc-900 text-zinc-400 border border-zinc-700 hover:border-zinc-600":"bg-zinc-50 text-zinc-600 border border-zinc-300 hover:border-zinc-400"}`,children:[Ke,"s"]},Ke)),s.jsxs("div",{className:"flex items-center gap-0.5",children:[s.jsx("input",{type:"number",min:5,max:600,value:[10,15,20,30,45,60].includes(Zt)?"":Zt,placeholder:"自定",onChange:Ke=>{const Et=parseInt(Ke.target.value);Et>=5&&Sn(Et)},className:`w-12 h-6 text-[10px] text-center rounded outline-none ${i?"bg-zinc-900 border border-zinc-700 text-zinc-200 placeholder-zinc-600 focus:border-violet-500/50":"bg-zinc-50 border border-zinc-300 text-zinc-800 placeholder-zinc-400 focus:border-violet-400"}`}),s.jsx("span",{className:`text-[10px] ${i?"text-zinc-500":"text-zinc-400"}`,children:"s"})]})]})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("div",{className:`flex-1 text-[10px] ${i?"text-zinc-500":"text-zinc-400"}`,children:Rn>=30?s.jsxs(s.Fragment,{children:[s.jsx(yq,{size:10,className:"inline mr-0.5 -mt-0.5"}),"共 ",Rn,"s ÷ ",Zt,"s = ",s.jsx("span",{className:`font-bold ${i?"text-violet-400":"text-violet-600"}`,children:bt})," 个片段"]}):s.jsx("span",{className:i?"text-red-400":"text-red-500",children:"总时长不能少于30秒"})}),s.jsxs("button",{onClick:()=>{Rn>=30&&(z(Rn,Zt),at("idle"))},disabled:Rn<30,className:`h-7 px-3 flex items-center gap-1 text-[10px] font-medium rounded-lg transition-all shrink-0 ${Rn<30?i?"bg-zinc-800 text-zinc-600 cursor-not-allowed":"bg-zinc-200 text-zinc-400 cursor-not-allowed":i?"bg-violet-600 hover:bg-violet-500 text-white shadow-lg shadow-violet-600/20":"bg-violet-500 hover:bg-violet-600 text-white shadow-lg shadow-violet-500/20"}`,children:[s.jsx(dd,{size:11}),"开始"]})]})]}),X&&s.jsxs("div",{className:"flex items-center gap-3 mt-3",children:[s.jsxs("div",{className:"flex items-center gap-1.5 shrink-0",children:[s.jsx(XG,{size:12,className:i?"text-zinc-500":"text-zinc-400"}),s.jsx("span",{className:`text-[10px] ${i?"text-zinc-500":"text-zinc-400"}`,children:"Skill"})]}),s.jsxs("select",{value:a.scriptSkillId??"",onChange:Ke=>X(Ke.target.value||null),className:`flex-1 min-w-0 text-[10px] h-7 rounded-lg px-2 outline-none transition-colors overflow-hidden ${i?"bg-zinc-900 border border-zinc-700 text-zinc-300":"bg-zinc-50 border border-zinc-300 text-zinc-700"}`,title:"选择 Skill 提示词时,智能分集/大致时长将使用该提示词替代默认分集逻辑",children:[s.jsx("option",{value:"",children:"默认分集逻辑"}),yO().map(Ke=>s.jsx("option",{value:Ke.id,children:Ke.source==="agent"?`[Agent] ${Ke.name}`:Ke.name},Ke.id))]})]}),s.jsxs("div",{className:"flex items-center gap-3 mt-3",children:[f.length>0&&s.jsxs(s.Fragment,{children:[s.jsx("span",{className:`text-[10px] shrink-0 ${i?"text-zinc-500":"text-zinc-400"}`,children:"模型"}),s.jsx("select",{value:p,onChange:Ke=>F(Ke.target.value),className:`flex-1 min-w-0 text-[10px] h-7 rounded-lg px-2 outline-none transition-colors overflow-hidden ${i?"bg-zinc-900 border border-zinc-700 text-zinc-300":"bg-zinc-50 border border-zinc-300 text-zinc-700"}`,children:f.map(Ke=>s.jsx("option",{value:Ke.id,children:Ke.provider||Ke.modelName||Ke.id},Ke.id))})]}),s.jsxs("button",{onClick:C,className:`h-7 min-w-[72px] flex items-center justify-center gap-1.5 px-3 text-[11px] font-medium rounded-lg transition-colors shrink-0 ${i?"bg-zinc-800 hover:bg-zinc-700 text-zinc-300 border border-zinc-700":"bg-zinc-100 hover:bg-zinc-200 text-zinc-600 border border-zinc-300"}`,title:"手动新增一集",children:[s.jsx(Xi,{size:12}),"新增"]})]}),L&&s.jsxs("div",{className:"mt-3 space-y-1.5",children:[s.jsx("span",{className:`text-[10px] shrink-0 ${i?"text-zinc-500":"text-zinc-400"}`,children:"Prompt 自定义"}),s.jsx("textarea",{value:a.scriptPromptCustom??"",onChange:Ke=>L(Ke.target.value),placeholder:"例如:本剧为治愈系慢节奏动画,请保持温馨舒缓基调,不要增加悬疑、危机或紧张情节,不要使用悬念钩子。",rows:2,className:`w-full text-[10px] rounded-lg px-2 py-1.5 resize-none outline-none transition-colors custom-scrollbar ${i?"bg-zinc-900 border border-zinc-700 text-zinc-300 placeholder:text-zinc-500 focus:border-amber-500/50":"bg-zinc-50 border border-zinc-300 text-zinc-700 placeholder:text-zinc-400 focus:border-amber-400"}`})]}),h&&s.jsxs("div",{className:`mt-2 text-[10px] flex items-center gap-1.5 ${i?"text-amber-400":"text-amber-600"}`,children:[u&&s.jsx(zr,{size:11,className:"animate-spin"}),h]})]}),s.jsx("div",{className:"flex-1 overflow-y-auto custom-scrollbar",children:a.episodes.length===0?s.jsxs("div",{className:`px-3 py-8 text-center text-xs ${i?"text-zinc-600":"text-zinc-400"}`,children:[s.jsx(E5,{size:28,className:"mx-auto mb-2 opacity-40"}),"输入大纲后选择",s.jsx("br",{}),'"智能分集"或"大致时长"',s.jsx("br",{}),'也可手动"新增"']}):s.jsxs(s.Fragment,{children:[(()=>{const Ke=a.episodes.filter(Et=>Et.segmentDetail);return Ke.length===0?null:s.jsx(s.Fragment,{children:s.jsxs("div",{className:`px-3 py-2 flex items-center justify-between ${i?"text-zinc-500":"text-zinc-400"}`,children:[s.jsxs("div",{className:"flex items-center gap-1.5",children:[s.jsx(dd,{size:10,className:i?"text-violet-400":"text-violet-500"}),s.jsxs("span",{className:`text-[10px] font-medium ${i?"text-violet-400":"text-violet-600"}`,children:["时长片段列表 (",Ke.length,")"]})]}),J&&s.jsxs("button",{onClick:()=>J(Ke),className:`flex items-center gap-1 text-[10px] px-1.5 py-0.5 rounded transition-colors ${i?"text-violet-400 hover:bg-violet-400/10":"text-violet-600 hover:bg-violet-50"}`,title:"将时长片段导出为画布节点",children:[s.jsx(Ii,{size:10}),"导出到画布"]})]})})})(),(()=>{const Ke=a.episodes.filter(Et=>Et.segmentDetail);return Ke.length===0?null:s.jsx("div",{className:"px-2 pb-2 space-y-1",children:Ke.map(Et=>{const Gn=ge===Et.id,Ut=d===Et.id;return Wr(Et,Gn,Ut)})})})(),(()=>{const Ke=a.episodes.filter(Et=>!Et.segmentDetail);return Ke.length===0?null:s.jsx(s.Fragment,{children:s.jsxs("div",{className:`px-3 py-2 flex items-center justify-between ${i?"text-zinc-500":"text-zinc-400"}`,children:[s.jsxs("div",{className:"flex items-center gap-1.5",children:[s.jsx(bc,{size:10,className:i?"text-amber-400":"text-amber-500"}),s.jsxs("span",{className:`text-[10px] font-medium ${i?"text-amber-400":"text-amber-600"}`,children:["长剧分集列表 (",Ke.length,")"]})]}),J&&s.jsxs("button",{onClick:()=>J(Ke),className:`flex items-center gap-1 text-[10px] px-1.5 py-0.5 rounded transition-colors ${i?"text-amber-400 hover:bg-amber-400/10":"text-amber-600 hover:bg-amber-50"}`,title:"将长剧分集导出为画布节点",children:[s.jsx(Ii,{size:10}),"导出到画布"]})]})})})(),(()=>{const Ke=a.episodes.filter(Et=>!Et.segmentDetail);return Ke.length===0?null:s.jsx("div",{className:"px-2 pb-2 space-y-1",children:Ke.map(Et=>{const Gn=ge===Et.id,Ut=d===Et.id;return Wr(Et,Gn,Ut)})})})(),a.episodes.every(Ke=>Ke.segmentDetail)&&s.jsxs("div",{className:`px-3 py-2 flex items-center gap-1.5 ${i?"text-zinc-600":"text-zinc-400"}`,children:[s.jsx(bc,{size:10}),s.jsx("span",{className:"text-[10px]",children:"长剧分集列表(空)"})]}),a.episodes.every(Ke=>!Ke.segmentDetail)&&s.jsxs("div",{className:`px-3 py-2 flex items-center gap-1.5 ${i?"text-zinc-600":"text-zinc-400"}`,children:[s.jsx(dd,{size:10}),s.jsx("span",{className:"text-[10px]",children:"时长片段列表(空)"})]})]})})]}),G==="plan"&&s.jsxs("div",{className:"flex-1 flex flex-col overflow-hidden",children:[s.jsxs("div",{className:`p-3 border-b shrink-0 ${i?"border-zinc-800":"border-zinc-200"}`,children:[s.jsx("label",{className:`text-[10px] font-medium block mb-1 ${i?"text-zinc-500":"text-zinc-400"}`,children:"当前剧本名称"}),s.jsx("input",{value:a.name,onChange:Ke=>w(Ke.target.value),className:`w-full h-8 text-xs px-2 rounded-lg outline-none transition-colors ${i?"bg-zinc-900 border border-zinc-700 text-zinc-200 focus:border-amber-500/50":"bg-zinc-50 border border-zinc-300 text-zinc-800 focus:border-amber-400"}`}),s.jsxs("div",{className:`mt-1.5 text-[10px] ${i?"text-zinc-600":"text-zinc-400"}`,children:[a.episodes.length," 集 · ",a.outline.length," 字大纲"]})]}),s.jsx("div",{className:`px-3 py-2 flex items-center justify-between shrink-0 ${i?"text-zinc-500":"text-zinc-400"}`,children:s.jsxs("span",{className:"text-[10px] font-medium",children:["剧本列表 (",o.length,")"]})}),s.jsx("div",{className:"flex-1 overflow-y-auto custom-scrollbar px-2 pb-2",children:s.jsx("div",{className:"space-y-1",children:o.map(Ke=>{const Et=Ke.id===l;return s.jsx("div",{onClick:()=>!Et&&q(Ke.id),className:`group rounded-lg border px-2.5 py-2 transition-all cursor-pointer ${Et?i?"border-amber-500/50 bg-amber-500/5":"border-amber-400 bg-amber-50":i?"border-zinc-800 hover:border-zinc-700 bg-zinc-900/30 hover:bg-zinc-900/60":"border-zinc-200 hover:border-zinc-300 bg-white hover:bg-zinc-50"}`,children:s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsxs("div",{className:"flex-1 min-w-0",children:[s.jsxs("div",{className:"flex items-center gap-1.5",children:[Et&&s.jsx("div",{className:`w-1.5 h-1.5 rounded-full shrink-0 ${i?"bg-amber-400":"bg-amber-500"}`}),s.jsx("span",{className:`text-xs font-medium truncate ${i?"text-zinc-200":"text-zinc-800"}`,children:Ke.name})]}),s.jsxs("div",{className:`text-[10px] mt-0.5 ${i?"text-zinc-600":"text-zinc-400"}`,children:[Ke.episodeCount," 集 · ",Fte(Ke.updatedAt)]})]}),s.jsx("button",{onClick:Gn=>{Gn.stopPropagation(),confirm(`确定删除剧本「${Ke.name}」吗?`)&&H(Ke.id)},className:`p-1 rounded opacity-0 group-hover:opacity-100 transition-all ${i?"text-zinc-600 hover:text-red-400 hover:bg-red-400/10":"text-zinc-300 hover:text-red-500 hover:bg-red-50"}`,title:"删除此剧本",children:s.jsx(Zi,{size:12})})]})},Ke.id)})})}),s.jsx("div",{className:`p-2 border-t shrink-0 ${i?"border-zinc-800":"border-zinc-200"}`,children:s.jsxs("button",{onClick:T,className:`w-full h-8 flex items-center justify-center gap-1.5 text-xs rounded-lg transition-colors ${i?"bg-zinc-800 hover:bg-zinc-700 text-zinc-400 border border-zinc-700":"bg-zinc-100 hover:bg-zinc-200 text-zinc-600 border border-zinc-300"}`,children:[s.jsx(Xi,{size:13}),"新建剧本"]})})]}),G==="shots"&&(()=>{var Gn;const Ke=a.episodes.filter(Ut=>!Ut.segmentDetail),Et=Ke.filter(Ut=>Ut.expandedScript||Ut.scenes&&Ut.scenes.length>0);return s.jsxs("div",{className:"flex-1 flex flex-col overflow-hidden",children:[s.jsx("div",{className:`p-2.5 border-b shrink-0 space-y-2 ${i?"border-zinc-800":"border-zinc-200"}`,children:s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center justify-between mb-1",children:[s.jsx("label",{className:`text-[10px] font-medium ${i?"text-zinc-500":"text-zinc-400"}`,children:"概念图风格"}),s.jsxs("div",{className:"flex items-center gap-1",children:[s.jsx("button",{onClick:()=>un(!0),className:`p-1 rounded transition-colors ${i?"text-zinc-500 hover:text-violet-400 hover:bg-violet-400/10":"text-zinc-400 hover:text-violet-600 hover:bg-violet-50"}`,title:"AI 风格助手",children:s.jsx(mj,{size:12})}),s.jsx("button",{onClick:()=>Ht(!0),className:`p-1 rounded transition-colors ${i?"text-zinc-500 hover:text-amber-400 hover:bg-amber-400/10":"text-zinc-400 hover:text-amber-600 hover:bg-amber-50"}`,title:"管理风格标签",children:s.jsx(zh,{size:12})})]})]}),s.jsxs("div",{ref:it,className:"relative",children:[s.jsxs("button",{type:"button",onClick:()=>Dn(!fn),className:`w-full text-[10px] h-6 rounded px-2 outline-none transition-colors flex items-center justify-between ${i?"bg-zinc-900 border border-zinc-700 text-zinc-300":"bg-white border border-zinc-200 text-zinc-700"}`,children:[s.jsx("span",{className:"truncate",children:jt==="auto"?"跟随全局设定 (默认)":((Gn=se.find(Ut=>Ut.id===jt))==null?void 0:Gn.label)||jt}),s.jsx(Ei,{size:10,className:`ml-1 shrink-0 transition-transform ${fn?"rotate-180":""}`})]}),fn&&s.jsxs("div",{className:`absolute z-50 left-0 right-0 mt-1 rounded-lg border shadow-xl max-h-[280px] overflow-y-auto minimal-scrollbar ${i?"bg-zinc-900 border-zinc-700":"bg-white border-zinc-200"}`,children:[s.jsx("div",{onClick:()=>{Nt("auto"),Dn(!1)},className:`px-2 py-1.5 text-[10px] cursor-pointer transition-colors ${jt==="auto"?i?"bg-violet-500/20 text-violet-300":"bg-violet-50 text-violet-700":i?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-50"}`,children:"跟随全局设定 (默认)"}),se.filter(Ut=>Ut.category==="cinematic").length>0&&s.jsxs(s.Fragment,{children:[s.jsx("div",{className:`px-2 py-1 text-[9px] font-bold sticky top-0 ${i?"text-zinc-500 bg-zinc-900":"text-zinc-400 bg-white"}`,children:"影视写实 (Cinematic)"}),se.filter(Ut=>Ut.category==="cinematic").map(Ut=>s.jsx("div",{onClick:()=>{Nt(Ut.id),Dn(!1)},className:`px-3 py-1.5 text-[10px] cursor-pointer transition-colors ${jt===Ut.id?i?"bg-violet-500/20 text-violet-300":"bg-violet-50 text-violet-700":i?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-50"}`,children:Ut.label},Ut.id))]}),se.filter(Ut=>Ut.category==="stylized").length>0&&s.jsxs(s.Fragment,{children:[s.jsx("div",{className:`px-2 py-1 text-[9px] font-bold sticky top-0 ${i?"text-zinc-500 bg-zinc-900":"text-zinc-400 bg-white"}`,children:"艺术风格 (Stylized)"}),se.filter(Ut=>Ut.category==="stylized").map(Ut=>s.jsx("div",{onClick:()=>{Nt(Ut.id),Dn(!1)},className:`px-3 py-1.5 text-[10px] cursor-pointer transition-colors ${jt===Ut.id?i?"bg-violet-500/20 text-violet-300":"bg-violet-50 text-violet-700":i?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-50"}`,children:Ut.label},Ut.id))]}),se.filter(Ut=>Ut.category==="custom").length>0&&s.jsxs(s.Fragment,{children:[s.jsx("div",{className:`px-2 py-1 text-[9px] font-bold sticky top-0 ${i?"text-zinc-500 bg-zinc-900":"text-zinc-400 bg-white"}`,children:"自定义风格"}),se.filter(Ut=>Ut.category==="custom").map(Ut=>s.jsx("div",{onClick:()=>{Nt(Ut.id),Dn(!1)},className:`px-3 py-1.5 text-[10px] cursor-pointer transition-colors ${jt===Ut.id?i?"bg-violet-500/20 text-violet-300":"bg-violet-50 text-violet-700":i?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-50"}`,children:Ut.label},Ut.id))]})]})]})]})}),Yt&&zg.createPortal(s.jsx("div",{className:"fixed inset-0 z-[9999] flex items-center justify-center bg-black/45",onClick:()=>{un(!1),qt(null),zt("")},children:s.jsxs("div",{className:`w-[360px] max-h-[420px] rounded-2xl border shadow-2xl flex flex-col ${i?"bg-zinc-900 border-zinc-700":"bg-white border-zinc-200"}`,onClick:Ut=>Ut.stopPropagation(),children:[s.jsxs("div",{className:`px-5 py-4 border-b flex items-center gap-2 ${i?"border-zinc-800":"border-zinc-100"}`,children:[s.jsx(bc,{size:16,className:"text-violet-500"}),s.jsx("span",{className:`text-sm font-bold ${i?"text-zinc-200":"text-zinc-800"}`,children:"AI 概念图风格助手"}),s.jsx("div",{className:"flex-1"}),s.jsx("button",{onClick:()=>{un(!1),qt(null),zt("")},className:`p-1 rounded-lg ${i?"hover:bg-zinc-800 text-zinc-500":"hover:bg-zinc-100 text-zinc-400"}`,children:s.jsx(Qr,{size:14})})]}),s.jsxs("div",{className:"flex-1 p-5 space-y-3 overflow-y-auto minimal-scrollbar",children:[s.jsx("p",{className:`text-[11px] leading-relaxed ${i?"text-zinc-400":"text-zinc-500"}`,children:"描述你想要的概念图风格,AI 会帮你生成对应的提示词标签。"}),s.jsx("textarea",{value:Bt,onChange:Ut=>zt(Ut.target.value),placeholder:"例如:宫崎骏水彩风、赛博朋克霓虹灯风...",rows:3,className:`w-full text-xs rounded-lg border p-3 resize-none outline-none transition-all ${i?"bg-zinc-800 border-zinc-700 text-zinc-200 placeholder:text-zinc-600 focus:border-violet-500":"bg-zinc-50 border-zinc-200 text-zinc-700 placeholder:text-zinc-400 focus:border-violet-500"}`}),s.jsx("button",{onClick:async()=>{if(!Bt.trim()||!pe)return;const Ut=await pe(Bt);Ut&&qt(Ut)},disabled:we||!Bt.trim(),className:`w-full h-8 flex items-center justify-center gap-1.5 text-xs font-medium rounded-lg transition-all ${we||!Bt.trim()?i?"bg-zinc-800 text-zinc-600":"bg-zinc-100 text-zinc-400":i?"bg-violet-600 hover:bg-violet-500 text-white":"bg-violet-500 hover:bg-violet-600 text-white"}`,children:we?s.jsxs(s.Fragment,{children:[s.jsx(zr,{size:12,className:"animate-spin"})," 生成中..."]}):s.jsxs(s.Fragment,{children:[s.jsx(bc,{size:12})," 生成风格"]})}),Gt&&s.jsxs("div",{className:`p-3 rounded-lg border space-y-2 ${i?"bg-zinc-800/50 border-violet-500/30":"bg-violet-50 border-violet-200"}`,children:[s.jsx("div",{className:"flex items-center gap-2",children:s.jsx("span",{className:`text-xs font-bold px-2 py-0.5 rounded ${i?"bg-violet-500/20 text-violet-400":"bg-violet-100 text-violet-700"}`,children:Gt.label})}),s.jsx("p",{className:`text-[10px] leading-relaxed break-all ${i?"text-zinc-400":"text-zinc-600"}`,children:Gt.prompt}),s.jsxs("button",{onClick:()=>{if(oe&&Gt){const Ut=oe(Gt.label,Gt.prompt);Nt(Ut.id),un(!1),qt(null),zt("")}},className:`w-full h-7 flex items-center justify-center gap-1.5 text-[10px] font-medium rounded-lg transition-all ${i?"bg-green-600 hover:bg-green-500 text-white":"bg-green-500 hover:bg-green-600 text-white"}`,children:[s.jsx(Xi,{size:11})," 添加到我的风格"]})]})]})]})}),document.body),Tn&&zg.createPortal(s.jsx("div",{className:"fixed inset-0 z-[9999] flex items-center justify-center bg-black/45",onClick:()=>{Ht(!1),st(null),St(""),Ue("")},children:s.jsxs("div",{className:`w-[400px] max-h-[560px] rounded-2xl border shadow-2xl flex flex-col ${i?"bg-zinc-900 border-zinc-700":"bg-white border-zinc-200"}`,onClick:Ut=>Ut.stopPropagation(),children:[s.jsxs("div",{className:`px-5 py-4 border-b flex items-center gap-2 ${i?"border-zinc-800":"border-zinc-100"}`,children:[s.jsx(zh,{size:16,className:"text-violet-500"}),s.jsx("span",{className:`text-sm font-bold ${i?"text-zinc-200":"text-zinc-800"}`,children:"管理概念图风格标签"}),s.jsx("div",{className:"flex-1"}),s.jsx("button",{onClick:()=>{Ht(!1),st(null)},className:`p-1 rounded-lg ${i?"hover:bg-zinc-800 text-zinc-500":"hover:bg-zinc-100 text-zinc-400"}`,children:s.jsx(Qr,{size:14})})]}),s.jsx("div",{className:`mx-5 mt-3 px-3 py-2 rounded-lg text-[10px] leading-relaxed ${i?"bg-violet-500/10 text-violet-400 border border-violet-500/20":"bg-violet-50 text-violet-600 border border-violet-200"}`,children:"您可以自定义概念图风格标签。内置风格不可编辑,自定义风格可编辑和删除。"}),s.jsxs("div",{className:"flex-1 overflow-y-auto px-5 py-3 space-y-2 minimal-scrollbar",children:[c$.map(Ut=>s.jsxs("div",{className:`p-3 rounded-xl border ${i?"bg-zinc-800/40 border-zinc-800":"bg-zinc-50 border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:`text-[11px] font-medium px-2 py-0.5 rounded ${i?"bg-zinc-700 text-zinc-300":"bg-zinc-200 text-zinc-700"}`,children:Ut.label}),s.jsx("span",{className:`text-[9px] ${i?"text-zinc-600":"text-zinc-400"}`,children:"内置"})]}),s.jsx("p",{className:"mt-1.5 text-[10px] leading-relaxed text-zinc-500",children:Ut.prompt})]},Ut.id)),ie.map(Ut=>s.jsx("div",{className:`p-3 rounded-xl border ${i?"bg-zinc-800/60 border-violet-500/20":"bg-violet-50/50 border-violet-200"}`,children:De===Ut.id?s.jsxs("div",{className:"space-y-2",children:[s.jsxs("div",{children:[s.jsx("label",{className:`text-[9px] mb-0.5 block ${i?"text-zinc-500":"text-zinc-400"}`,children:"标签名称"}),s.jsx("input",{value:Ae,onChange:Bn=>nt(Bn.target.value),className:`w-full h-7 px-2 text-[11px] rounded-lg border outline-none ${i?"bg-zinc-900 border-zinc-700 text-zinc-300":"bg-white border-zinc-200 text-zinc-700"}`})]}),s.jsxs("div",{children:[s.jsx("label",{className:`text-[9px] mb-0.5 block ${i?"text-zinc-500":"text-zinc-400"}`,children:"注入的提示词内容"}),s.jsx("textarea",{value:_t,onChange:Bn=>xt(Bn.target.value),rows:2,className:`w-full text-[10px] rounded-lg border p-2 resize-none outline-none minimal-scrollbar ${i?"bg-zinc-900 border-zinc-700 text-zinc-300":"bg-white border-zinc-200 text-zinc-700"}`})]}),s.jsxs("div",{className:"flex gap-1.5 justify-end",children:[s.jsx("button",{onClick:()=>st(null),className:`px-2.5 py-1 text-[10px] rounded-lg ${i?"text-zinc-400 hover:bg-zinc-800":"text-zinc-500 hover:bg-zinc-100"}`,children:"取消"}),s.jsxs("button",{onClick:()=>{Ae.trim()&&_t.trim()&&(ee==null||ee(Ut.id,Ae,_t),st(null))},className:`px-2.5 py-1 text-[10px] rounded-lg font-medium ${i?"bg-violet-600 text-white":"bg-violet-500 text-white"}`,children:[s.jsx(Eo,{size:10,className:"inline mr-0.5"})," 保存"]})]})]}):s.jsxs(s.Fragment,{children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:`text-[11px] font-medium px-2 py-0.5 rounded ${i?"bg-violet-500/20 text-violet-400":"bg-violet-100 text-violet-700"}`,children:Ut.label}),s.jsx("div",{className:"flex-1"}),s.jsx("button",{onClick:()=>{st(Ut.id),nt(Ut.label),xt(Ut.prompt)},className:`p-1 rounded ${i?"text-zinc-600 hover:text-zinc-300 hover:bg-zinc-700":"text-zinc-400 hover:text-zinc-700 hover:bg-zinc-200"}`,title:"编辑",children:s.jsx(vm,{size:11})}),s.jsx("button",{onClick:()=>re==null?void 0:re(Ut.id),className:`p-1 rounded ${i?"text-zinc-600 hover:text-red-400 hover:bg-red-500/10":"text-zinc-400 hover:text-red-500 hover:bg-red-50"}`,title:"删除",children:s.jsx(Zi,{size:11})})]}),s.jsx("p",{className:"mt-1.5 text-[10px] leading-relaxed text-zinc-500",children:Ut.prompt})]})},Ut.id)),s.jsxs("div",{className:`p-3 rounded-xl border-2 border-dashed space-y-2 ${i?"border-zinc-700":"border-zinc-300"}`,children:[s.jsx("span",{className:`text-[10px] font-medium ${i?"text-zinc-400":"text-zinc-500"}`,children:"+ 新增自定义风格"}),s.jsx("input",{value:Tt,onChange:Ut=>St(Ut.target.value),placeholder:"风格名称(中文)",className:`w-full h-7 px-2 text-[11px] rounded-lg border outline-none ${i?"bg-zinc-800 border-zinc-700 text-zinc-300 placeholder:text-zinc-600":"bg-white border-zinc-200 text-zinc-700 placeholder:text-zinc-400"}`}),s.jsx("textarea",{value:Qe,onChange:Ut=>Ue(Ut.target.value),placeholder:"英文风格提示词",rows:2,className:`w-full text-[10px] rounded-lg border p-2 resize-none outline-none ${i?"bg-zinc-800 border-zinc-700 text-zinc-300 placeholder:text-zinc-600":"bg-white border-zinc-200 text-zinc-700 placeholder:text-zinc-400"}`}),s.jsxs("button",{onClick:()=>{oe&&Tt.trim()&&Qe.trim()&&(oe(Tt,Qe),St(""),Ue(""))},disabled:!Tt.trim()||!Qe.trim(),className:`w-full h-7 flex items-center justify-center gap-1.5 text-[10px] font-medium rounded-lg transition-all ${!Tt.trim()||!Qe.trim()?i?"bg-zinc-800 text-zinc-600":"bg-zinc-100 text-zinc-400":i?"bg-violet-600 hover:bg-violet-500 text-white":"bg-violet-500 hover:bg-violet-600 text-white"}`,children:[s.jsx(Xi,{size:10})," 添加自定义风格"]})]})]})]})}),document.body),s.jsx("div",{className:"flex-1 overflow-y-auto custom-scrollbar",children:Et.length>0?s.jsx("div",{className:"p-2 space-y-2",children:Et.map(Ut=>{var vr;const Bn=ge===Ut.id,Nr=d===Ut.id,br=((vr=Ut.scenes)==null?void 0:vr.length)||0;return s.jsxs("div",{children:[s.jsxs("button",{onClick:()=>ne(Bn?null:Ut.id),className:`w-full flex items-center gap-2 px-2.5 py-2 rounded-lg text-left transition-all ${Bn?i?"bg-violet-500/10 border border-violet-500/30":"bg-violet-50 border border-violet-200":i?"bg-zinc-900/50 border border-zinc-800 hover:border-zinc-700":"bg-white border border-zinc-200 hover:border-zinc-300"}`,children:[s.jsx(Ei,{size:12,className:`transition-transform shrink-0 ${i?"text-zinc-500":"text-zinc-400"} ${Bn?"rotate-0":"-rotate-90"}`}),s.jsxs("span",{className:`text-[11px] font-bold ${i?"text-violet-400":"text-violet-600"}`,children:["Ep",Ut.index]}),s.jsx("span",{className:`text-[11px] font-medium truncate ${i?"text-zinc-300":"text-zinc-700"}`,children:Ut.title}),s.jsx("div",{className:"flex-1"}),Nr&&s.jsx(zr,{size:11,className:"animate-spin text-violet-400"}),s.jsxs("span",{className:`text-[9px] px-1.5 py-0.5 rounded-full ${i?"bg-zinc-800 text-zinc-500":"bg-zinc-100 text-zinc-500"}`,children:[br," 场"]})]}),br>0&&s.jsxs("button",{onClick:gr=>{gr.stopPropagation(),_n({type:"shots",episodeId:Ut.id})},className:`mt-1 w-full flex items-center justify-center gap-1.5 py-1.5 rounded-lg text-[10px] font-medium transition-all ${i?"bg-zinc-800/60 border border-zinc-700/50 text-zinc-400 hover:text-violet-400 hover:bg-violet-500/10 hover:border-violet-500/30":"bg-zinc-50 border border-zinc-200 text-zinc-500 hover:text-violet-600 hover:bg-violet-50 hover:border-violet-300"}`,title:"展开到画布中心查看",children:[s.jsx(jh,{size:11}),"展开查看全部场次"]}),Bn&&s.jsx("div",{className:"mt-1 space-y-1.5 pl-2",children:Ut.scenes&&Ut.scenes.length>0?Ut.scenes.map((gr,nr)=>{var gi,$i;const tr=`${Ut.id}__${gr.sceneNumber}`,jr=!!(W!=null&&W.startsWith(tr)),Br=!!gr.conceptPrompt,_r=!!gr.conceptPrompt4,es=!!gr.conceptPrompt6,Ur=!!gr.conceptPrompt9,zs=Br||_r||es||Ur,Ts=`${Ut.id}__${gr.sceneNumber}`,os=Ee===Ts,wi=[4,6,9,25],ki=gs=>gs===25?gr.conceptPrompt:gs===4?gr.conceptPrompt4:gs===6?gr.conceptPrompt6:gr.conceptPrompt9;return s.jsxs("div",{className:`rounded-lg border transition-all ${i?"bg-zinc-900/60 border-zinc-800":"bg-white border-zinc-200"}`,children:[s.jsxs("div",{className:`flex flex-wrap items-center gap-1.5 px-2.5 py-2 cursor-pointer transition-colors rounded-lg ${i?"hover:bg-zinc-800/50":"hover:bg-zinc-50"}`,onClick:()=>Ce(os?null:Ts),children:[s.jsx(Ei,{size:10,className:`transition-transform shrink-0 ${i?"text-zinc-600":"text-zinc-400"} ${os?"rotate-0":"-rotate-90"}`}),s.jsxs("span",{className:`text-[10px] font-black px-1.5 py-0.5 rounded shrink-0 ${i?"bg-violet-500/20 text-violet-400":"bg-violet-100 text-violet-700"}`,children:["S",gr.sceneNumber]}),gr.location&&s.jsx("span",{className:"text-[9px] truncate min-w-0 max-w-[50%] text-zinc-500",children:gr.location}),s.jsx("div",{className:"flex-1 min-w-0"}),wi.map(gs=>{const Ri=`${tr}__${gs}`,Ki=W===Ri,Ps=!!ki(gs);return s.jsx("button",{onClick:Si=>{Si.stopPropagation(),k==null||k(Ut.id,gr.sceneNumber,jt,gs)},disabled:jr,className:`shrink-0 px-1 py-0.5 rounded text-[8px] font-medium transition-all ${Ki?"opacity-50 cursor-wait":i?"bg-emerald-500/10 text-emerald-400 hover:bg-emerald-500/20":"bg-emerald-50 text-emerald-600 hover:bg-emerald-100"}`,title:Ps?`重新生成${gs}宫格`:`生成${gs}宫格`,children:Ki?s.jsx(zr,{size:8,className:"animate-spin"}):`${gs}`},gs)})]}),os&&s.jsxs("div",{className:`px-2.5 pb-2.5 border-t ${i?"border-zinc-800":"border-zinc-100"}`,children:[gr.content.trim()&&s.jsxs("div",{className:`mt-1.5 pt-1.5 border-t ${i?"border-zinc-800":"border-zinc-100"}`,children:[s.jsxs("div",{className:"flex items-center justify-between mb-1",children:[s.jsx("span",{className:"text-[9px] font-medium text-zinc-500",children:"视频镜头"}),s.jsxs("button",{onClick:gs=>{gs.stopPropagation(),Y==null||Y(Ut.id,gr.sceneNumber,gr.content)},className:`shrink-0 px-1.5 py-0.5 rounded text-[8px] font-medium flex items-center gap-0.5 ${i?"bg-emerald-500/10 text-emerald-400 hover:bg-emerald-500/20":"bg-emerald-50 text-emerald-600 hover:bg-emerald-100"}`,title:"将本场次镜头完整发送到画布",children:[s.jsx(Lo,{size:8})," 镜头整体发送到画布"]})]}),s.jsx("div",{className:`text-[10px] leading-relaxed whitespace-pre-wrap p-2 rounded-lg max-h-32 overflow-y-auto minimal-scrollbar ${i?"bg-zinc-800/40 text-zinc-400":"bg-zinc-50 text-zinc-600"}`,children:gr.content})]}),zs&&s.jsxs("div",{className:`mt-2 pt-2 border-t ${i?"border-zinc-800":"border-zinc-100"}`,children:[s.jsxs("div",{className:"flex items-center justify-between mb-1 flex-wrap gap-1",children:[s.jsx("span",{className:`text-[9px] font-medium ${i?"text-violet-400":"text-violet-600"}`,children:"📋 概念图提示词"}),s.jsx("div",{className:"flex items-center gap-0.5",children:wi.map(gs=>ki(gs)?s.jsxs("button",{onClick:Ki=>{Ki.stopPropagation(),M==null||M(Ut.id,gr,gs)},className:`shrink-0 px-1.5 py-0.5 rounded text-[8px] font-medium flex items-center gap-0.5 ${i?"bg-emerald-500/10 text-emerald-400 hover:bg-emerald-500/20":"bg-emerald-50 text-emerald-600 hover:bg-emerald-100"}`,title:`${gs}宫格发送到画布`,children:[s.jsx(Lo,{size:8})," ",gs,"宫格"]},gs):null)})]}),s.jsxs("div",{className:`text-[9px] leading-relaxed whitespace-pre-wrap p-2 rounded-lg ${i?"bg-violet-500/5 text-zinc-400 border border-violet-500/10":"bg-violet-50 text-zinc-600 border border-violet-100"}`,children:[((gi=gr.conceptPrompt)==null?void 0:gi.substring(0,400))??gr.conceptPrompt4??gr.conceptPrompt6??gr.conceptPrompt9??"",((($i=gr.conceptPrompt)==null?void 0:$i.length)??0)>400&&s.jsx("span",{className:`${i?"text-zinc-600":"text-zinc-400"}`,children:"..."})]})]})]})]},nr)}):Ut.expandedScript?s.jsxs("div",{className:`p-2 rounded-lg border text-[10px] leading-relaxed whitespace-pre-wrap ${i?"bg-zinc-900/60 border-zinc-800 text-zinc-400":"bg-white border-zinc-200 text-zinc-600"}`,children:[Ut.expandedScript.substring(0,1e3),Ut.expandedScript.length>1e3&&"..."]}):null})]},Ut.id)})}):Ke.length>0?s.jsxs("div",{className:"flex flex-col items-center justify-center h-full p-4 text-center",children:[s.jsx(Ya,{size:28,className:`mb-2 ${i?"text-zinc-700":"text-zinc-300"}`}),s.jsxs("span",{className:`text-xs ${i?"text-zinc-600":"text-zinc-400"}`,children:["在「剧本」标签的长剧分集列表中",s.jsx("br",{}),"点击集数旁的 ",s.jsx(Ia,{size:10,className:"inline"})," 按钮",s.jsx("br",{}),"生成完整分镜剧本"]})]}):s.jsxs("div",{className:"flex flex-col items-center justify-center h-full p-4 text-center",children:[s.jsx(Ya,{size:28,className:`mb-2 ${i?"text-zinc-700":"text-zinc-300"}`}),s.jsxs("span",{className:`text-xs ${i?"text-zinc-600":"text-zinc-400"}`,children:["暂无长剧分集",s.jsx("br",{}),"请先在「剧本」标签页进行智能分集"]})]})})]})})(),G==="settings"&&s.jsxs("div",{className:"flex-1 flex flex-col overflow-hidden",children:[s.jsxs("div",{className:`p-3 border-b shrink-0 space-y-2 ${i?"border-zinc-800":"border-zinc-200"}`,children:[s.jsx("button",{onClick:()=>Z==null?void 0:Z(xe),disabled:V||!a.outline.trim(),className:`w-full h-9 flex items-center justify-center gap-2 text-xs font-medium rounded-lg transition-all ${V?i?"bg-zinc-800 text-zinc-500 cursor-wait":"bg-zinc-200 text-zinc-400 cursor-wait":a.outline.trim()?i?"bg-amber-500 hover:bg-amber-400 text-black shadow-lg shadow-amber-500/20":"bg-amber-500 hover:bg-amber-600 text-white shadow-lg shadow-amber-500/20":i?"bg-zinc-800 text-zinc-600 cursor-not-allowed":"bg-zinc-200 text-zinc-400 cursor-not-allowed"}`,children:V?s.jsxs(s.Fragment,{children:[s.jsx(zr,{size:14,className:"animate-spin"}),"提取中..."]}):s.jsxs(s.Fragment,{children:[s.jsx(Up,{size:14}),"AI 自动提取角色/场景/道具"]})}),B&&s.jsxs("div",{className:`rounded-lg border p-2 space-y-2 ${i?"border-zinc-700 bg-zinc-900/50":"border-zinc-200 bg-zinc-50/80"}`,children:[s.jsx("label",{className:`text-[10px] font-medium block ${i?"text-zinc-500":"text-zinc-400"}`,children:"手动指定提取"}),s.jsx("input",{type:"text",value:Wt,onChange:Ke=>Pt(Ke.target.value),placeholder:"输入名称,如:张三、舰桥、天命杠杆",disabled:V||!a.outline.trim(),className:`w-full h-8 px-2 text-[11px] rounded border outline-none placeholder:opacity-60 ${i?"bg-zinc-800 border-zinc-700 text-zinc-300 placeholder:text-zinc-500":"bg-white border-zinc-200 text-zinc-700 placeholder:text-zinc-400"} ${V||!a.outline.trim()?"opacity-60 cursor-not-allowed":""}`}),s.jsxs("div",{className:"flex flex-wrap gap-1.5",children:[s.jsxs("button",{type:"button",onClick:()=>Wt.trim()&&B(xe,"character",Wt.trim()),disabled:V||!Wt.trim()||!a.outline.trim(),className:`flex items-center gap-1 px-2 py-1 text-[10px] rounded border transition-colors ${V||!Wt.trim()||!a.outline.trim()?i?"border-zinc-700 text-zinc-500 cursor-not-allowed":"border-zinc-200 text-zinc-400 cursor-not-allowed":i?"border-amber-600/60 text-amber-400 hover:bg-amber-500/20":"border-amber-500/60 text-amber-600 hover:bg-amber-500/20"}`,title:"请提取***这个角色",children:[s.jsx(hd,{size:10}),"提取为角色"]}),s.jsxs("button",{type:"button",onClick:()=>Wt.trim()&&B(xe,"scene",Wt.trim()),disabled:V||!Wt.trim()||!a.outline.trim(),className:`flex items-center gap-1 px-2 py-1 text-[10px] rounded border transition-colors ${V||!Wt.trim()||!a.outline.trim()?i?"border-zinc-700 text-zinc-500 cursor-not-allowed":"border-zinc-200 text-zinc-400 cursor-not-allowed":i?"border-amber-600/60 text-amber-400 hover:bg-amber-500/20":"border-amber-500/60 text-amber-600 hover:bg-amber-500/20"}`,title:"请提取***这个场景",children:[s.jsx(mx,{size:10}),"提取为场景"]}),s.jsxs("button",{type:"button",onClick:()=>Wt.trim()&&B(xe,"prop",Wt.trim()),disabled:V||!Wt.trim()||!a.outline.trim(),className:`flex items-center gap-1 px-2 py-1 text-[10px] rounded border transition-colors ${V||!Wt.trim()||!a.outline.trim()?i?"border-zinc-700 text-zinc-500 cursor-not-allowed":"border-zinc-200 text-zinc-400 cursor-not-allowed":i?"border-amber-600/60 text-amber-400 hover:bg-amber-500/20":"border-amber-500/60 text-amber-600 hover:bg-amber-500/20"}`,title:"请提取***这个道具",children:[s.jsx(z2,{size:10}),"提取为道具"]})]})]}),s.jsxs("div",{className:"flex flex-col gap-1",children:[s.jsx("div",{className:"flex items-center justify-between",children:s.jsx("label",{className:`text-[10px] font-medium ${i?"text-zinc-500":"text-zinc-400"}`,children:"提取使用模型"})}),s.jsx("select",{value:Q||p,onChange:Ke=>me==null?void 0:me(Ke.target.value),disabled:V,className:`w-full h-8 px-2 text-[11px] rounded-lg border outline-none ${i?"bg-zinc-900 border-zinc-700 text-zinc-300 focus:border-amber-500":"bg-white border-zinc-200 text-zinc-700 focus:border-amber-500"} ${V?"opacity-50 cursor-not-allowed":""}`,children:f.map(Ke=>s.jsx("option",{value:Ke.id,children:Ke.provider||Ke.id},Ke.id))})]}),s.jsxs("div",{className:"flex flex-col gap-1",children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsx("label",{className:`text-[10px] font-medium ${i?"text-zinc-500":"text-zinc-400"}`,children:"识别 Skill 身份(可选)"}),s.jsx("button",{type:"button",className:`px-1.5 py-0.5 text-[9px] rounded border ${i?"border-zinc-700 text-zinc-400 hover:border-zinc-500 hover:text-zinc-200":"border-zinc-300 text-zinc-500 hover:border-zinc-400 hover:text-zinc-700"}`,onClick:()=>{try{ke(_c())}catch{}},children:"刷新 Skill 库"})]}),s.jsxs("select",{value:ue||"",onChange:Ke=>U==null?void 0:U(Ke.target.value||null),disabled:V||ve.length===0,className:`w-full h-8 px-2 text-[11px] rounded-lg border outline-none ${i?"bg-zinc-900 border-zinc-700 text-zinc-300 focus:border-amber-500":"bg-white border-zinc-200 text-zinc-700 focus:border-amber-500"} ${V||ve.length===0?"opacity-50 cursor-not-allowed":""}`,children:[s.jsx("option",{value:"",children:"不使用 Skill 身份(默认)"}),ve.map(Ke=>s.jsx("option",{value:Ke.id,children:Ke.name},Ke.id))]}),ue&&ve.length>0&&s.jsx("p",{className:`text-[9px] mt-0.5 ${i?"text-zinc-500":"text-zinc-400"}`,children:"将在系统提示词前注入所选 Skill 内容,用作「身份+世界观」增强提取。"})]}),s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center justify-between mb-1",children:[s.jsx("label",{className:`text-[10px] font-medium ${i?"text-zinc-500":"text-zinc-400"}`,children:"生成风格"}),s.jsxs("div",{className:"flex items-center gap-1",children:[s.jsx("button",{onClick:()=>Me(!0),title:"AI 帮你出风格",className:`p-1 rounded transition-all ${i?"text-zinc-500 hover:text-amber-400 hover:bg-zinc-800":"text-zinc-400 hover:text-amber-600 hover:bg-zinc-100"}`,children:s.jsx(mj,{size:12})}),s.jsx("button",{onClick:()=>He(!0),title:"管理风格标签",className:`p-1 rounded transition-all ${i?"text-zinc-500 hover:text-amber-400 hover:bg-zinc-800":"text-zinc-400 hover:text-amber-600 hover:bg-zinc-100"}`,children:s.jsx(zh,{size:12})})]})]}),s.jsxs("div",{ref:Jt,className:"relative",children:[s.jsxs("button",{type:"button",onClick:()=>!V&>(!Lt),disabled:V,className:`w-full h-8 px-2 text-[11px] rounded-lg border outline-none transition-all flex items-center justify-between ${i?"bg-zinc-900 border-zinc-700 text-zinc-300 focus:border-amber-500":"bg-white border-zinc-200 text-zinc-700 focus:border-amber-500"} ${V?"opacity-50 cursor-not-allowed":""}`,children:[s.jsx("span",{className:"truncate",children:xe==="auto"?"跟随全局设定 (默认)":((Zn=se.find(Ke=>Ke.id===xe))==null?void 0:Zn.label)||xe}),s.jsx(Ei,{size:10,className:`ml-1 shrink-0 transition-transform ${Lt?"rotate-180":""}`})]}),Lt&&s.jsxs("div",{className:`absolute z-50 left-0 right-0 mt-1 rounded-lg border shadow-xl max-h-[280px] overflow-y-auto minimal-scrollbar ${i?"bg-zinc-900 border-zinc-700":"bg-white border-zinc-200"}`,children:[s.jsx("div",{onClick:()=>{Ne("auto"),gt(!1)},className:`px-2 py-1.5 text-[11px] cursor-pointer transition-colors ${xe==="auto"?i?"bg-amber-500/20 text-amber-300":"bg-amber-50 text-amber-700":i?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-50"}`,children:"跟随全局设定 (默认)"}),se.filter(Ke=>Ke.category==="cinematic").length>0&&s.jsxs(s.Fragment,{children:[s.jsx("div",{className:`px-2 py-1 text-[9px] font-bold sticky top-0 ${i?"text-zinc-500 bg-zinc-900":"text-zinc-400 bg-white"}`,children:"影视写实 (Cinematic)"}),se.filter(Ke=>Ke.category==="cinematic").map(Ke=>s.jsx("div",{onClick:()=>{Ne(Ke.id),gt(!1)},className:`px-3 py-1.5 text-[11px] cursor-pointer transition-colors ${xe===Ke.id?i?"bg-amber-500/20 text-amber-300":"bg-amber-50 text-amber-700":i?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-50"}`,children:Ke.label},Ke.id))]}),se.filter(Ke=>Ke.category==="stylized").length>0&&s.jsxs(s.Fragment,{children:[s.jsx("div",{className:`px-2 py-1 text-[9px] font-bold sticky top-0 ${i?"text-zinc-500 bg-zinc-900":"text-zinc-400 bg-white"}`,children:"艺术风格 (Stylized)"}),se.filter(Ke=>Ke.category==="stylized").map(Ke=>s.jsx("div",{onClick:()=>{Ne(Ke.id),gt(!1)},className:`px-3 py-1.5 text-[11px] cursor-pointer transition-colors ${xe===Ke.id?i?"bg-amber-500/20 text-amber-300":"bg-amber-50 text-amber-700":i?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-50"}`,children:Ke.label},Ke.id))]}),ie.length>0&&s.jsxs(s.Fragment,{children:[s.jsx("div",{className:`px-2 py-1 text-[9px] font-bold sticky top-0 ${i?"text-zinc-500 bg-zinc-900":"text-zinc-400 bg-white"}`,children:"自定义风格"}),ie.map(Ke=>s.jsx("div",{onClick:()=>{Ne(Ke.id),gt(!1)},className:`px-3 py-1.5 text-[11px] cursor-pointer transition-colors ${xe===Ke.id?i?"bg-amber-500/20 text-amber-300":"bg-amber-50 text-amber-700":i?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-50"}`,children:Ke.label},Ke.id))]})]})]})]}),!a.outline.trim()&&!V&&s.jsx("p",{className:`text-[10px] ${i?"text-zinc-600":"text-zinc-400"}`,children:"请先在「剧本」标签页输入大纲内容"}),N&&s.jsxs("div",{className:`text-[10px] flex items-center gap-1.5 ${i?"text-amber-400":"text-amber-600"}`,children:[V&&s.jsx(zr,{size:11,className:"animate-spin"}),N]})]}),Je&&zg.createPortal(s.jsx("div",{className:"fixed inset-0 z-[9999] flex items-center justify-center bg-black/45",onClick:()=>{Me(!1),je(null),Ve("")},children:s.jsxs("div",{className:`w-[360px] max-h-[420px] rounded-2xl border shadow-2xl flex flex-col ${i?"bg-zinc-900 border-zinc-700":"bg-white border-zinc-200"}`,onClick:Ke=>Ke.stopPropagation(),children:[s.jsxs("div",{className:`px-5 py-4 border-b flex items-center gap-2 ${i?"border-zinc-800":"border-zinc-100"}`,children:[s.jsx(bc,{size:16,className:"text-amber-500"}),s.jsx("span",{className:`text-sm font-bold ${i?"text-zinc-200":"text-zinc-800"}`,children:"AI 风格助手"}),s.jsx("div",{className:"flex-1"}),s.jsx("button",{onClick:()=>{Me(!1),je(null),Ve("")},className:`p-1 rounded-lg ${i?"hover:bg-zinc-800 text-zinc-500":"hover:bg-zinc-100 text-zinc-400"}`,children:s.jsx(Qr,{size:14})})]}),s.jsxs("div",{className:"flex-1 p-5 space-y-3 overflow-y-auto minimal-scrollbar",children:[s.jsx("p",{className:`text-[11px] leading-relaxed ${i?"text-zinc-400":"text-zinc-500"}`,children:"描述你想要的视觉风格,AI 会帮你生成对应的提示词标签。"}),s.jsx("textarea",{value:Re,onChange:Ke=>Ve(Ke.target.value),placeholder:"例如:像宫崎骏动画那种温暖的手绘风格...",rows:3,className:`w-full text-xs rounded-lg border p-3 resize-none outline-none transition-all ${i?"bg-zinc-800 border-zinc-700 text-zinc-200 placeholder:text-zinc-600 focus:border-amber-500":"bg-zinc-50 border-zinc-200 text-zinc-700 placeholder:text-zinc-400 focus:border-amber-500"}`}),s.jsx("button",{onClick:async()=>{if(!Re.trim()||!pe)return;const Ke=await pe(Re);Ke&&je(Ke)},disabled:we||!Re.trim(),className:`w-full h-8 flex items-center justify-center gap-1.5 text-xs font-medium rounded-lg transition-all ${we||!Re.trim()?i?"bg-zinc-800 text-zinc-600":"bg-zinc-100 text-zinc-400":i?"bg-amber-500 hover:bg-amber-400 text-black":"bg-amber-500 hover:bg-amber-600 text-white"}`,children:we?s.jsxs(s.Fragment,{children:[s.jsx(zr,{size:12,className:"animate-spin"})," 生成中..."]}):s.jsxs(s.Fragment,{children:[s.jsx(bc,{size:12})," 生成风格"]})}),Ze&&s.jsxs("div",{className:`p-3 rounded-lg border space-y-2 ${i?"bg-zinc-800/50 border-amber-500/30":"bg-amber-50 border-amber-200"}`,children:[s.jsx("div",{className:"flex items-center gap-2",children:s.jsx("span",{className:`text-xs font-bold px-2 py-0.5 rounded ${i?"bg-amber-500/20 text-amber-400":"bg-amber-100 text-amber-700"}`,children:Ze.label})}),s.jsx("p",{className:`text-[10px] leading-relaxed break-all ${i?"text-zinc-400":"text-zinc-600"}`,children:Ze.prompt}),s.jsxs("button",{onClick:()=>{if(oe&&Ze){const Ke=oe(Ze.label,Ze.prompt);Ne(Ke.id),Me(!1),je(null),Ve("")}},className:`w-full h-7 flex items-center justify-center gap-1.5 text-[10px] font-medium rounded-lg transition-all ${i?"bg-green-600 hover:bg-green-500 text-white":"bg-green-500 hover:bg-green-600 text-white"}`,children:[s.jsx(Xi,{size:11})," 添加到我的风格"]})]})]})]})}),document.body),Be&&zg.createPortal(s.jsx("div",{className:"fixed inset-0 z-[9999] flex items-center justify-center bg-black/45",onClick:()=>{He(!1),Xe(null),ht(""),$t("")},children:s.jsxs("div",{className:`w-[400px] max-h-[560px] rounded-2xl border shadow-2xl flex flex-col ${i?"bg-zinc-900 border-zinc-700":"bg-white border-zinc-200"}`,onClick:Ke=>Ke.stopPropagation(),children:[s.jsxs("div",{className:`px-5 py-4 border-b flex items-center gap-2 ${i?"border-zinc-800":"border-zinc-100"}`,children:[s.jsx(zh,{size:16,className:"text-amber-500"}),s.jsx("span",{className:`text-sm font-bold ${i?"text-zinc-200":"text-zinc-800"}`,children:"管理风格标签"}),s.jsx("div",{className:"flex-1"}),s.jsx("button",{onClick:()=>{He(!1),Xe(null)},className:`p-1 rounded-lg ${i?"hover:bg-zinc-800 text-zinc-500":"hover:bg-zinc-100 text-zinc-400"}`,children:s.jsx(Qr,{size:14})})]}),s.jsx("div",{className:`mx-5 mt-3 px-3 py-2 rounded-lg text-[10px] leading-relaxed ${i?"bg-blue-500/10 text-blue-400 border border-blue-500/20":"bg-blue-50 text-blue-600 border border-blue-200"}`,children:"您可以自定义风格标签。标签名称将显示在选择器中,提示词内容将在 AI 提取时注入到生成风格中。"}),s.jsxs("div",{className:"flex-1 overflow-y-auto px-5 py-3 space-y-2 minimal-scrollbar",children:[c$.map(Ke=>s.jsxs("div",{className:`p-3 rounded-xl border ${i?"bg-zinc-800/40 border-zinc-800":"bg-zinc-50 border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:`text-[11px] font-medium px-2 py-0.5 rounded ${i?"bg-zinc-700 text-zinc-300":"bg-zinc-200 text-zinc-700"}`,children:Ke.label}),s.jsx("span",{className:`text-[9px] ${i?"text-zinc-600":"text-zinc-400"}`,children:"内置"})]}),s.jsx("p",{className:"mt-1.5 text-[10px] leading-relaxed text-zinc-500",children:Ke.prompt})]},Ke.id)),ie.map(Ke=>s.jsx("div",{className:`p-3 rounded-xl border ${i?"bg-zinc-800/60 border-amber-500/20":"bg-amber-50/50 border-amber-200"}`,children:Le===Ke.id?s.jsxs("div",{className:"space-y-2",children:[s.jsx("div",{className:"flex gap-2",children:s.jsxs("div",{className:"flex-1",children:[s.jsx("label",{className:`text-[9px] mb-0.5 block ${i?"text-zinc-500":"text-zinc-400"}`,children:"标签名称"}),s.jsx("input",{value:qe,onChange:Et=>tt(Et.target.value),className:`w-full h-7 px-2 text-[11px] rounded-lg border outline-none ${i?"bg-zinc-900 border-zinc-700 text-zinc-300":"bg-white border-zinc-200 text-zinc-700"}`})]})}),s.jsxs("div",{children:[s.jsx("label",{className:`text-[9px] mb-0.5 block ${i?"text-zinc-500":"text-zinc-400"}`,children:"注入的提示词内容"}),s.jsx("textarea",{value:Ye,onChange:Et=>ct(Et.target.value),rows:2,className:`w-full text-[10px] rounded-lg border p-2 resize-none outline-none minimal-scrollbar ${i?"bg-zinc-900 border-zinc-700 text-zinc-300":"bg-white border-zinc-200 text-zinc-700"}`})]}),s.jsxs("div",{className:"flex gap-1.5 justify-end",children:[s.jsx("button",{onClick:()=>Xe(null),className:`px-2.5 py-1 text-[10px] rounded-lg ${i?"text-zinc-400 hover:bg-zinc-800":"text-zinc-500 hover:bg-zinc-100"}`,children:"取消"}),s.jsxs("button",{onClick:()=>{qe.trim()&&Ye.trim()&&(ee==null||ee(Ke.id,qe,Ye),Xe(null))},className:`px-2.5 py-1 text-[10px] rounded-lg font-medium ${i?"bg-amber-500 text-black":"bg-amber-500 text-white"}`,children:[s.jsx(Eo,{size:10,className:"inline mr-0.5"})," 保存"]})]})]}):s.jsxs(s.Fragment,{children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:`text-[11px] font-medium px-2 py-0.5 rounded ${i?"bg-amber-500/20 text-amber-400":"bg-amber-100 text-amber-700"}`,children:Ke.label}),s.jsx("div",{className:"flex-1"}),s.jsx("button",{onClick:()=>{Xe(Ke.id),tt(Ke.label),ct(Ke.prompt)},className:`p-1 rounded ${i?"text-zinc-600 hover:text-zinc-300 hover:bg-zinc-700":"text-zinc-400 hover:text-zinc-700 hover:bg-zinc-200"}`,title:"编辑",children:s.jsx(vm,{size:11})}),s.jsx("button",{onClick:()=>re==null?void 0:re(Ke.id),className:`p-1 rounded ${i?"text-zinc-600 hover:text-red-400 hover:bg-zinc-700":"text-zinc-400 hover:text-red-500 hover:bg-red-50"}`,title:"删除",children:s.jsx(Zi,{size:11})})]}),s.jsx("p",{className:"mt-1.5 text-[10px] leading-relaxed text-zinc-500",children:Ke.prompt})]})},Ke.id)),s.jsx("div",{className:`p-3 rounded-xl border border-dashed ${i?"border-zinc-700":"border-zinc-300"}`,children:s.jsxs("div",{className:"space-y-2",children:[s.jsxs("div",{className:"flex gap-2",children:[s.jsxs("div",{className:"w-1/3",children:[s.jsx("label",{className:`text-[9px] mb-0.5 block ${i?"text-zinc-500":"text-zinc-400"}`,children:"标签名称"}),s.jsx("input",{value:pt,onChange:Ke=>ht(Ke.target.value),placeholder:"如: 赛博朋克",className:`w-full h-7 px-2 text-[11px] rounded-lg border outline-none ${i?"bg-zinc-800 border-zinc-700 text-zinc-300 placeholder:text-zinc-600":"bg-white border-zinc-200 text-zinc-700 placeholder:text-zinc-400"}`})]}),s.jsxs("div",{className:"flex-1",children:[s.jsx("label",{className:`text-[9px] mb-0.5 block ${i?"text-zinc-500":"text-zinc-400"}`,children:"注入的提示词内容"}),s.jsx("input",{value:wt,onChange:Ke=>$t(Ke.target.value),placeholder:"English style prompt...",className:`w-full h-7 px-2 text-[11px] rounded-lg border outline-none ${i?"bg-zinc-800 border-zinc-700 text-zinc-300 placeholder:text-zinc-600":"bg-white border-zinc-200 text-zinc-700 placeholder:text-zinc-400"}`})]})]}),s.jsxs("button",{onClick:()=>{pt.trim()&&wt.trim()&&oe&&(oe(pt,wt),ht(""),$t(""))},disabled:!pt.trim()||!wt.trim(),className:`w-full h-7 flex items-center justify-center gap-1 text-[10px] font-medium rounded-lg transition-all ${!pt.trim()||!wt.trim()?i?"bg-zinc-800 text-zinc-600":"bg-zinc-100 text-zinc-400":i?"bg-amber-500 hover:bg-amber-400 text-black":"bg-amber-500 hover:bg-amber-600 text-white"}`,children:[s.jsx(Xi,{size:11})," 添加自定义风格"]})]})})]}),s.jsx("div",{className:`px-5 py-3 border-t flex items-center justify-end gap-2 ${i?"border-zinc-800":"border-zinc-100"}`,children:s.jsx("button",{onClick:()=>{He(!1),Xe(null)},className:`px-4 py-1.5 text-xs font-medium rounded-lg transition-all ${i?"bg-zinc-800 text-zinc-300 hover:bg-zinc-700":"bg-zinc-100 text-zinc-600 hover:bg-zinc-200"}`,children:"关闭"})})]})}),document.body),s.jsx("div",{className:"flex-1 overflow-y-auto custom-scrollbar",children:a.extraction?s.jsxs("div",{className:"p-2 space-y-3",children:[s.jsxs("button",{onClick:()=>_n({type:"settings"}),className:`w-full flex items-center justify-center gap-1.5 py-1.5 rounded-lg text-[10px] font-medium transition-all ${i?"bg-zinc-800/60 border border-zinc-700/50 text-zinc-400 hover:text-violet-400 hover:bg-violet-500/10 hover:border-violet-500/30":"bg-zinc-50 border border-zinc-200 text-zinc-500 hover:text-violet-600 hover:bg-violet-50 hover:border-violet-300"}`,title:"展开到画布中心查看",children:[s.jsx(jh,{size:11}),"展开查看全部设定"]}),a.extraction.characters.length>0&&s.jsxs("div",{children:[s.jsxs("div",{className:`px-1 py-1.5 flex items-center gap-1.5 ${i?"text-zinc-400":"text-zinc-500"}`,children:[s.jsx(hd,{size:11,className:i?"text-red-400":"text-red-500"}),s.jsxs("span",{className:`text-[10px] font-medium ${i?"text-red-400":"text-red-600"}`,children:["角色 (",a.extraction.characters.length,")"]})]}),s.jsx("div",{className:"space-y-1",children:a.extraction.characters.map(Ke=>s.jsxs("div",{className:`p-2 rounded-lg border cursor-pointer transition-all group/card ${ze===Ke.id?i?"bg-zinc-800/80 border-red-500/40 ring-1 ring-red-500/20":"bg-red-50/50 border-red-300 ring-1 ring-red-200":i?"bg-zinc-900/50 border-zinc-800 hover:border-zinc-700 hover:bg-zinc-800/50":"bg-white border-zinc-200 hover:border-zinc-300 hover:bg-zinc-50"}`,onClick:()=>_e(Et=>Et===Ke.id?null:Ke.id),children:[s.jsxs("div",{className:"flex items-center gap-1.5 mb-1",children:[s.jsx("span",{className:`w-1.5 h-1.5 rounded-full shrink-0 ${Ke.role==="主角"?"bg-red-500":Ke.role==="反派"?"bg-purple-500":Ke.role==="配角"?"bg-blue-500":"bg-zinc-400"}`}),s.jsx("span",{className:`text-[11px] font-medium ${i?"text-zinc-200":"text-zinc-800"}`,children:Ke.name}),s.jsx("span",{className:`text-[9px] px-1.5 py-0.5 rounded-full ${Ke.role==="主角"?i?"bg-red-500/10 text-red-400 border border-red-500/20":"bg-red-50 text-red-600 border border-red-200":Ke.role==="反派"?i?"bg-purple-500/10 text-purple-400 border border-purple-500/20":"bg-purple-50 text-purple-600 border border-purple-200":i?"bg-zinc-800 text-zinc-400 border border-zinc-700":"bg-zinc-100 text-zinc-500 border border-zinc-200"}`,children:Ke.role}),s.jsx("div",{className:"flex-1"}),s.jsx(Ei,{size:12,className:`transition-transform ${i?"text-zinc-600":"text-zinc-400"} ${ze===Ke.id?"rotate-180":""}`})]}),Ke.description&&s.jsx("p",{className:`text-[10px] leading-relaxed text-zinc-500 ${ze===Ke.id?"":"line-clamp-2"}`,children:Ke.description}),ze===Ke.id&&s.jsxs("div",{className:"mt-2 space-y-2",children:[Ke.visualPrompt&&s.jsx("div",{className:`p-2 rounded-md text-[10px] leading-relaxed break-all ${i?"bg-zinc-950 text-amber-300/80 border border-zinc-800":"bg-amber-50 text-amber-800 border border-amber-200"}`,children:Ke.visualPrompt}),s.jsxs("button",{onClick:Et=>{Et.stopPropagation(),j==null||j(Ke,"character")},className:`w-full h-7 flex items-center justify-center gap-1.5 text-[10px] font-medium rounded-md transition-all ${i?"bg-red-500/20 text-red-400 hover:bg-red-500/30 border border-red-500/20":"bg-red-50 text-red-600 hover:bg-red-100 border border-red-200"}`,children:[s.jsx(Lo,{size:11}),"发送到画布"]})]})]},Ke.id))})]}),a.extraction.scenes.length>0&&s.jsxs("div",{children:[s.jsxs("div",{className:`px-1 py-1.5 flex items-center gap-1.5 ${i?"text-zinc-400":"text-zinc-500"}`,children:[s.jsx(mx,{size:11,className:i?"text-green-400":"text-green-500"}),s.jsxs("span",{className:`text-[10px] font-medium ${i?"text-green-400":"text-green-600"}`,children:["场景 (",a.extraction.scenes.length,")"]})]}),s.jsx("div",{className:"space-y-1",children:a.extraction.scenes.map(Ke=>s.jsxs("div",{className:`p-2 rounded-lg border cursor-pointer transition-all group/card ${ze===Ke.id?i?"bg-zinc-800/80 border-green-500/40 ring-1 ring-green-500/20":"bg-green-50/50 border-green-300 ring-1 ring-green-200":i?"bg-zinc-900/50 border-zinc-800 hover:border-zinc-700 hover:bg-zinc-800/50":"bg-white border-zinc-200 hover:border-zinc-300 hover:bg-zinc-50"}`,onClick:()=>_e(Et=>Et===Ke.id?null:Ke.id),children:[s.jsxs("div",{className:"flex items-center gap-1.5 mb-1",children:[s.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-green-500 shrink-0"}),s.jsx("span",{className:`text-[11px] font-medium ${i?"text-zinc-200":"text-zinc-800"}`,children:Ke.name}),s.jsx("div",{className:"flex-1"}),s.jsx(Ei,{size:12,className:`transition-transform ${i?"text-zinc-600":"text-zinc-400"} ${ze===Ke.id?"rotate-180":""}`})]}),Ke.description&&s.jsx("p",{className:`text-[10px] leading-relaxed text-zinc-500 ${ze===Ke.id?"":"line-clamp-2"}`,children:Ke.description}),ze===Ke.id&&s.jsxs("div",{className:"mt-2 space-y-2",children:[Ke.visualPrompt&&s.jsx("div",{className:`p-2 rounded-md text-[10px] leading-relaxed break-all ${i?"bg-zinc-950 text-green-300/80 border border-zinc-800":"bg-green-50 text-green-800 border border-green-200"}`,children:Ke.visualPrompt}),s.jsxs("button",{onClick:Et=>{Et.stopPropagation(),j==null||j(Ke,"scene")},className:`w-full h-7 flex items-center justify-center gap-1.5 text-[10px] font-medium rounded-md transition-all ${i?"bg-green-500/20 text-green-400 hover:bg-green-500/30 border border-green-500/20":"bg-green-50 text-green-600 hover:bg-green-100 border border-green-200"}`,children:[s.jsx(Lo,{size:11}),"发送到画布"]})]})]},Ke.id))})]}),a.extraction.props.length>0&&s.jsxs("div",{children:[s.jsxs("div",{className:`px-1 py-1.5 flex items-center gap-1.5 ${i?"text-zinc-400":"text-zinc-500"}`,children:[s.jsx(z2,{size:11,className:i?"text-amber-400":"text-amber-500"}),s.jsxs("span",{className:`text-[10px] font-medium ${i?"text-amber-400":"text-amber-600"}`,children:["道具 (",a.extraction.props.length,")"]})]}),s.jsx("div",{className:"space-y-1",children:a.extraction.props.map(Ke=>s.jsxs("div",{className:`p-2 rounded-lg border cursor-pointer transition-all group/card ${ze===Ke.id?i?"bg-zinc-800/80 border-amber-500/40 ring-1 ring-amber-500/20":"bg-amber-50/50 border-amber-300 ring-1 ring-amber-200":i?"bg-zinc-900/50 border-zinc-800 hover:border-zinc-700 hover:bg-zinc-800/50":"bg-white border-zinc-200 hover:border-zinc-300 hover:bg-zinc-50"}`,onClick:()=>_e(Et=>Et===Ke.id?null:Ke.id),children:[s.jsxs("div",{className:"flex items-center gap-1.5 mb-1",children:[s.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-500 shrink-0"}),s.jsx("span",{className:`text-[11px] font-medium ${i?"text-zinc-200":"text-zinc-800"}`,children:Ke.name}),Ke.owner&&s.jsxs("span",{className:`text-[9px] px-1.5 py-0.5 rounded-full ${i?"bg-zinc-800 text-zinc-400 border border-zinc-700":"bg-zinc-100 text-zinc-500 border border-zinc-200"}`,children:["属于: ",Ke.owner]}),s.jsx("div",{className:"flex-1"}),s.jsx(Ei,{size:12,className:`transition-transform ${i?"text-zinc-600":"text-zinc-400"} ${ze===Ke.id?"rotate-180":""}`})]}),Ke.description&&s.jsx("p",{className:`text-[10px] leading-relaxed text-zinc-500 ${ze===Ke.id?"":"line-clamp-2"}`,children:Ke.description}),ze===Ke.id&&s.jsxs("div",{className:"mt-2 space-y-2",children:[Ke.visualPrompt&&s.jsx("div",{className:`p-2 rounded-md text-[10px] leading-relaxed break-all ${i?"bg-zinc-950 text-amber-300/80 border border-zinc-800":"bg-amber-50 text-amber-800 border border-amber-200"}`,children:Ke.visualPrompt}),s.jsxs("button",{onClick:Et=>{Et.stopPropagation(),j==null||j(Ke,"prop")},className:`w-full h-7 flex items-center justify-center gap-1.5 text-[10px] font-medium rounded-md transition-all ${i?"bg-amber-500/20 text-amber-400 hover:bg-amber-500/30 border border-amber-500/20":"bg-amber-50 text-amber-600 hover:bg-amber-100 border border-amber-200"}`,children:[s.jsx(Lo,{size:11}),"发送到画布"]})]})]},Ke.id))})]})]}):s.jsxs("div",{className:"flex flex-col items-center justify-center h-full p-4 text-center",children:[s.jsx(Up,{size:28,className:`mb-2 ${i?"text-zinc-700":"text-zinc-300"}`}),s.jsxs("span",{className:`text-xs ${i?"text-zinc-600":"text-zinc-400"}`,children:["点击上方按钮",s.jsx("br",{}),"AI 将自动从大纲中提取",s.jsx("br",{}),"角色、场景和道具信息"]})]})})]}),jn&&zg.createPortal(s.jsx("div",{className:"fixed inset-0 z-[9999] pointer-events-none",onClick:()=>_n(null),children:s.jsxs("div",{className:`absolute left-[328px] right-4 top-2 bottom-2 min-w-[420px] max-w-[calc(100vw-340px)] rounded-2xl border shadow-2xl flex flex-col overflow-hidden pointer-events-auto ${i?"bg-zinc-900 border-zinc-700":"bg-white border-zinc-200"}`,onClick:Ke=>Ke.stopPropagation(),children:[s.jsxs("div",{className:`px-6 py-4 border-b flex items-center gap-3 shrink-0 ${i?"border-zinc-800":"border-zinc-100"}`,children:[jn.type==="shots"&&(()=>{var Et;const Ke=a.episodes.find(Gn=>Gn.id===jn.episodeId);return s.jsxs(s.Fragment,{children:[s.jsx(Ya,{size:18,className:"text-violet-500"}),s.jsxs("span",{className:`text-sm font-bold ${i?"text-zinc-200":"text-zinc-800"}`,children:["Ep",Ke==null?void 0:Ke.index," ",Ke==null?void 0:Ke.title]}),s.jsxs("span",{className:`text-xs px-2 py-0.5 rounded-full ${i?"bg-violet-500/10 text-violet-400 border border-violet-500/20":"bg-violet-50 text-violet-600 border border-violet-200"}`,children:[((Et=Ke==null?void 0:Ke.scenes)==null?void 0:Et.length)||0," 场"]})]})})(),jn.type==="script"&&(()=>{const Ke=a.episodes.find(Et=>Et.id===jn.episodeId);return s.jsxs(s.Fragment,{children:[s.jsx(Vo,{size:18,className:"text-amber-500"}),s.jsxs("span",{className:`text-sm font-bold ${i?"text-zinc-200":"text-zinc-800"}`,children:["Ep",Ke==null?void 0:Ke.index," ",Ke==null?void 0:Ke.title]}),(Ke==null?void 0:Ke.durationSeconds)&&s.jsxs("span",{className:`text-xs px-2 py-0.5 rounded-full ${i?"bg-amber-500/10 text-amber-400 border border-amber-500/20":"bg-amber-50 text-amber-600 border border-amber-200"}`,children:[Ke.durationSeconds,"s"]})]})})(),jn.type==="settings"&&s.jsxs(s.Fragment,{children:[s.jsx(Ov,{size:18,className:"text-violet-500"}),s.jsx("span",{className:`text-sm font-bold ${i?"text-zinc-200":"text-zinc-800"}`,children:"角色 / 场景 / 道具 设定"})]}),s.jsx("div",{className:"flex-1"}),s.jsx("button",{onClick:()=>_n(null),className:`p-2 rounded-lg transition-colors ${i?"hover:bg-zinc-800 text-zinc-400":"hover:bg-zinc-100 text-zinc-500"}`,children:s.jsx(Qr,{size:16})})]}),s.jsxs("div",{className:"flex-1 min-w-0 overflow-y-auto minimal-scrollbar p-6",children:[jn.type==="shots"&&(()=>{const Ke=a.episodes.find(Et=>Et.id===jn.episodeId);return!(Ke!=null&&Ke.scenes)||Ke.scenes.length===0?s.jsx("div",{className:`flex items-center justify-center h-full text-sm ${i?"text-zinc-600":"text-zinc-400"}`,children:"暂无场次数据"}):s.jsx("div",{className:"space-y-4",children:Ke.scenes.map((Et,Gn)=>{const Ut=`${Ke.id}__${Et.sceneNumber}`,Bn=!!(W!=null&&W.startsWith(Ut)),Nr=[4,6,9,25],br=vr=>vr===25?Et.conceptPrompt:vr===4?Et.conceptPrompt4:vr===6?Et.conceptPrompt6:Et.conceptPrompt9;return Nr.some(vr=>!!br(vr)),s.jsxs("div",{className:`p-5 rounded-xl border transition-all ${i?"bg-zinc-800/40 border-zinc-700/60":"bg-zinc-50 border-zinc-200"}`,children:[s.jsxs("div",{className:`flex flex-wrap items-center gap-2 mb-3 pb-3 border-b ${i?"border-zinc-700":"border-zinc-200"}`,children:[s.jsxs("span",{className:`text-sm font-black px-2.5 py-1 rounded-lg shrink-0 ${i?"bg-violet-500/20 text-violet-400":"bg-violet-100 text-violet-700"}`,children:["S",Et.sceneNumber]}),Et.location&&s.jsx("span",{className:`text-xs truncate max-w-[40%] ${i?"text-zinc-400":"text-zinc-600"}`,title:Et.location,children:Et.location}),s.jsx("div",{className:"flex-1 min-w-0"}),Nr.map(vr=>{const gr=`${Ut}__${vr}`,nr=W===gr,tr=!!br(vr);return s.jsxs("div",{className:`flex items-center gap-1 shrink-0 rounded-lg border ${i?"bg-zinc-800/60 border-zinc-700":"bg-zinc-100 border-zinc-200"}`,children:[s.jsxs("span",{className:`px-2 py-1 text-xs font-medium ${i?"text-zinc-400":"text-zinc-600"}`,children:[vr,"宫格"]}),s.jsxs("button",{onClick:()=>k==null?void 0:k(Ke.id,Et.sceneNumber,jt,vr),disabled:Bn,className:`px-1.5 py-1 rounded text-xs font-medium flex items-center gap-0.5 transition-all ${Bn?"opacity-50 cursor-wait":i?"bg-emerald-500/10 text-emerald-400 hover:bg-emerald-500/20":"bg-emerald-50 text-emerald-600 hover:bg-emerald-100"}`,title:tr?`重新生成${vr}宫格`:`生成${vr}宫格`,children:[nr?s.jsx(zr,{size:10,className:"animate-spin"}):s.jsx(Up,{size:10}),"生成"]}),tr&&s.jsxs("button",{onClick:()=>M==null?void 0:M(Ke.id,Et,vr),className:`px-1.5 py-1 rounded text-xs font-medium flex items-center gap-0.5 ${i?"bg-emerald-500/10 text-emerald-400 hover:bg-emerald-500/20":"bg-emerald-50 text-emerald-600 hover:bg-emerald-100"}`,title:`${vr}宫格发送到画布`,children:[s.jsx(Lo,{size:10})," 发送"]})]},vr)})]}),s.jsxs("div",{className:"mb-3",children:[s.jsx("label",{className:`text-xs font-medium mb-1.5 block ${i?"text-zinc-400":"text-zinc-500"}`,children:"场次内容"}),s.jsx("textarea",{value:Et.content,onChange:vr=>zn(Ke.id,Et.sceneNumber,{content:vr.target.value}),className:`w-full text-sm leading-relaxed p-3 rounded-lg resize-none outline-none transition-colors minimal-scrollbar ${i?"bg-zinc-900 border border-zinc-700 text-zinc-300 placeholder-zinc-600 focus:border-violet-500/50":"bg-white border border-zinc-200 text-zinc-700 placeholder-zinc-400 focus:border-violet-400"}`,rows:Math.min(Math.max(Et.content.split(` +`).length+1,4),12)})]}),Et.content.trim()&&s.jsxs("div",{className:"mb-3",children:[s.jsxs("div",{className:"flex items-center justify-between mb-1.5",children:[s.jsx("label",{className:`text-xs font-medium ${i?"text-zinc-400":"text-zinc-500"}`,children:"视频镜头"}),s.jsxs("button",{onClick:()=>Y==null?void 0:Y(Ke.id,Et.sceneNumber,Et.content),className:`shrink-0 px-3 py-1.5 rounded-lg text-xs font-medium flex items-center gap-1 ${i?"bg-emerald-500/10 text-emerald-400 hover:bg-emerald-500/20 border border-emerald-500/20":"bg-emerald-50 text-emerald-600 hover:bg-emerald-100 border border-emerald-200"}`,title:"将本场次镜头完整发送到画布",children:[s.jsx(Lo,{size:12})," 镜头整体发送到画布"]})]}),s.jsx("div",{className:`text-sm leading-relaxed whitespace-pre-wrap p-3 rounded-lg max-h-48 overflow-y-auto minimal-scrollbar ${i?"bg-zinc-900/60 text-zinc-400 border border-zinc-700":"bg-white border border-zinc-200 text-zinc-600"}`,children:Et.content})]}),[25,9,6,4].map(vr=>{const gr=br(vr),nr=vr===25?"conceptPrompt":vr===4?"conceptPrompt4":vr===6?"conceptPrompt6":"conceptPrompt9";return s.jsxs("div",{className:"mb-3",children:[s.jsxs("label",{className:`text-xs font-medium mb-1.5 flex items-center gap-1.5 ${i?"text-violet-400":"text-violet-600"}`,children:["📋 ",vr,"宫格概念图提示词"]}),s.jsx("textarea",{value:gr||"",onChange:tr=>zn(Ke.id,Et.sceneNumber,{[nr]:tr.target.value}),placeholder:gr?void 0:`点击上方「${vr}宫格」生成`,className:`w-full text-sm leading-relaxed p-3 rounded-lg resize-none outline-none transition-colors minimal-scrollbar ${i?"bg-violet-500/5 border border-violet-500/20 text-zinc-300 focus:border-violet-500/40":"bg-violet-50 border border-violet-100 text-zinc-700 focus:border-violet-300"}`,rows:gr?Math.min(Math.max(gr.split(` +`).length+1,4),10):3})]},vr)})]},Gn)})})})(),jn.type==="script"&&(()=>{const Ke=a.episodes.find(Et=>Et.id===jn.episodeId);return Ke?s.jsxs("div",{className:"space-y-4",children:[Ke.emotionKeywords&&Ke.emotionKeywords.length>0&&s.jsx("div",{className:"flex flex-wrap gap-1.5",children:Ke.emotionKeywords.map((Et,Gn)=>s.jsx("span",{className:`text-xs px-2.5 py-1 rounded-full ${i?"bg-amber-500/10 text-amber-400 border border-amber-500/20":"bg-amber-50 text-amber-700 border border-amber-200"}`,children:Et},Gn))}),Ke.segmentDetail&&s.jsxs("div",{className:`grid grid-cols-2 gap-3 p-4 rounded-xl border ${i?"bg-zinc-800/40 border-zinc-700/60":"bg-zinc-50 border-zinc-200"}`,children:[[{label:"1. 主题",value:Ke.segmentDetail.subject,color:"violet"},{label:"2. 环境",value:Ke.segmentDetail.setting,color:"violet"},{label:"4. 镜头",value:Ke.segmentDetail.camera,color:"violet"},{label:"5. 影像风格",value:Ke.segmentDetail.visualStyle,color:"violet"},{label:"6. 声音",value:Ke.segmentDetail.audio,color:"violet"},{label:"7. 衔接",value:Ke.segmentDetail.transition,color:"violet"}].filter(Et=>Et.value).map((Et,Gn)=>s.jsxs("div",{className:"text-sm",children:[s.jsx("span",{className:`font-bold ${i?"text-violet-400":"text-violet-600"}`,children:Et.label}),s.jsx("div",{className:`mt-1 ${i?"text-zinc-400":"text-zinc-600"}`,children:Et.value})]},Gn)),Ke.segmentDetail.timeline&&Ke.segmentDetail.timeline.length>0&&s.jsxs("div",{className:"col-span-2 text-sm",children:[s.jsx("span",{className:`font-bold ${i?"text-violet-400":"text-violet-600"}`,children:"3. 动作与时间线"}),s.jsx("div",{className:"mt-2 space-y-1.5",children:Ke.segmentDetail.timeline.map((Et,Gn)=>s.jsxs("div",{className:`flex gap-2 p-2 rounded-lg ${i?"bg-zinc-800/60":"bg-white"}`,children:[s.jsx("span",{className:`shrink-0 font-mono text-xs font-bold px-2 py-0.5 rounded ${i?"bg-violet-500/20 text-violet-300":"bg-violet-100 text-violet-700"}`,children:Et.timeRange}),s.jsx("span",{className:`text-sm ${i?"text-zinc-400":"text-zinc-600"}`,children:Et.description})]},Gn))})]}),Ke.segmentDetail.narration&&s.jsxs("div",{className:"col-span-2 text-sm",children:[s.jsx("span",{className:`font-bold ${i?"text-violet-400":"text-violet-600"}`,children:"8. 旁白"}),s.jsxs("div",{className:`mt-1 italic ${i?"text-zinc-400":"text-zinc-600"}`,children:['"',Ke.segmentDetail.narration,'"']})]})]}),Ke.hookSummary&&!Ke.segmentDetail&&s.jsxs("div",{className:`p-3 rounded-xl text-sm ${i?"bg-zinc-800/50 text-zinc-400":"bg-zinc-50 text-zinc-500"}`,children:[s.jsx("span",{className:"mr-1.5",children:"🪝"}),Ke.hookSummary]}),s.jsxs("div",{children:[s.jsx("label",{className:`text-xs font-medium mb-2 block ${i?"text-zinc-400":"text-zinc-500"}`,children:"剧本正文"}),s.jsx("textarea",{value:Ke.content,onChange:Et=>I(Ke.id,{content:Et.target.value}),placeholder:Ke.segmentDetail?"8 要素结构已生成,也可在此编辑原始内容...":"点击 ▶ 按钮 AI 生成完整剧本,或手动输入...",className:`w-full text-sm leading-relaxed p-4 rounded-xl resize-none outline-none transition-colors minimal-scrollbar ${i?"bg-zinc-900 border border-zinc-700 text-zinc-300 placeholder-zinc-600 focus:border-amber-500/30":"bg-white border border-zinc-200 text-zinc-700 placeholder-zinc-400 focus:border-amber-400"}`,rows:Math.min(Math.max(Ke.content.split(` +`).length+2,8),24)})]}),Ke.expandedScript&&s.jsxs("div",{children:[s.jsx("label",{className:`text-xs font-medium mb-2 block ${i?"text-violet-400":"text-violet-600"}`,children:"扩写分镜剧本"}),s.jsx("textarea",{value:Ke.expandedScript,onChange:Et=>I(Ke.id,{expandedScript:Et.target.value}),className:`w-full text-sm leading-relaxed p-4 rounded-xl resize-none outline-none transition-colors minimal-scrollbar ${i?"bg-violet-500/5 border border-violet-500/20 text-zinc-300 focus:border-violet-500/40":"bg-violet-50 border border-violet-100 text-zinc-700 focus:border-violet-300"}`,rows:Math.min(Math.max(Ke.expandedScript.split(` +`).length+2,8),24)})]})]}):s.jsx("div",{className:`flex items-center justify-center h-full text-sm ${i?"text-zinc-600":"text-zinc-400"}`,children:"未找到该集"})})(),jn.type==="settings"&&(a.extraction?s.jsxs("div",{className:"space-y-6 min-w-0 w-full",children:[a.extraction.characters.length>0&&s.jsxs("div",{className:"min-w-0",children:[s.jsxs("div",{className:`flex items-center gap-2 mb-3 ${i?"text-red-400":"text-red-600"}`,children:[s.jsx(hd,{size:16}),s.jsxs("span",{className:"text-sm font-bold",children:["角色 (",a.extraction.characters.length,")"]})]}),s.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-3 min-w-0",children:a.extraction.characters.map(Ke=>s.jsxs("div",{className:`p-4 rounded-xl border transition-all min-w-0 overflow-hidden ${i?"bg-zinc-800/40 border-zinc-700/60":"bg-zinc-50 border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[s.jsx("span",{className:`w-2 h-2 rounded-full ${Ke.role==="主角"?"bg-red-500":Ke.role==="反派"?"bg-purple-500":Ke.role==="配角"?"bg-blue-500":"bg-zinc-400"}`}),s.jsx("span",{className:`text-sm font-bold ${i?"text-zinc-200":"text-zinc-800"}`,children:Ke.name}),s.jsx("span",{className:`text-xs px-2 py-0.5 rounded-full ${Ke.role==="主角"?i?"bg-red-500/10 text-red-400 border border-red-500/20":"bg-red-50 text-red-600 border border-red-200":Ke.role==="反派"?i?"bg-purple-500/10 text-purple-400 border border-purple-500/20":"bg-purple-50 text-purple-600 border border-purple-200":i?"bg-zinc-700 text-zinc-400 border border-zinc-600":"bg-zinc-100 text-zinc-500 border border-zinc-200"}`,children:Ke.role}),s.jsx("div",{className:"flex-1"}),s.jsxs("button",{onClick:()=>j==null?void 0:j(Ke,"character"),className:`shrink-0 px-2.5 py-1 rounded-lg text-xs font-medium flex items-center gap-1 transition-all ${i?"bg-red-500/10 text-red-400 hover:bg-red-500/20 border border-red-500/20":"bg-red-50 text-red-600 hover:bg-red-100 border border-red-200"}`,children:[s.jsx(Lo,{size:11})," 发送到画布"]})]}),Ke.description&&s.jsx("p",{className:`text-sm leading-relaxed mb-2 ${i?"text-zinc-400":"text-zinc-600"}`,children:Ke.description}),Ke.visualPrompt&&s.jsx("div",{className:`p-3 rounded-lg text-sm leading-relaxed break-all ${i?"bg-zinc-900 text-amber-300/80 border border-zinc-800":"bg-amber-50 text-amber-800 border border-amber-200"}`,children:Ke.visualPrompt})]},Ke.id))})]}),a.extraction.scenes.length>0&&s.jsxs("div",{className:"min-w-0",children:[s.jsxs("div",{className:`flex items-center gap-2 mb-3 ${i?"text-green-400":"text-green-600"}`,children:[s.jsx(mx,{size:16}),s.jsxs("span",{className:"text-sm font-bold",children:["场景 (",a.extraction.scenes.length,")"]})]}),s.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-3 min-w-0",children:a.extraction.scenes.map(Ke=>s.jsxs("div",{className:`p-4 rounded-xl border transition-all min-w-0 overflow-hidden ${i?"bg-zinc-800/40 border-zinc-700/60":"bg-zinc-50 border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[s.jsx("span",{className:"w-2 h-2 rounded-full bg-green-500"}),s.jsx("span",{className:`text-sm font-bold ${i?"text-zinc-200":"text-zinc-800"}`,children:Ke.name}),s.jsx("div",{className:"flex-1"}),s.jsxs("button",{onClick:()=>j==null?void 0:j(Ke,"scene"),className:`shrink-0 px-2.5 py-1 rounded-lg text-xs font-medium flex items-center gap-1 transition-all ${i?"bg-green-500/10 text-green-400 hover:bg-green-500/20 border border-green-500/20":"bg-green-50 text-green-600 hover:bg-green-100 border border-green-200"}`,children:[s.jsx(Lo,{size:11})," 发送到画布"]})]}),Ke.description&&s.jsx("p",{className:`text-sm leading-relaxed mb-2 ${i?"text-zinc-400":"text-zinc-600"}`,children:Ke.description}),Ke.visualPrompt&&s.jsx("div",{className:`p-3 rounded-lg text-sm leading-relaxed break-all ${i?"bg-zinc-900 text-green-300/80 border border-zinc-800":"bg-green-50 text-green-800 border border-green-200"}`,children:Ke.visualPrompt})]},Ke.id))})]}),a.extraction.props.length>0&&s.jsxs("div",{className:"min-w-0",children:[s.jsxs("div",{className:`flex items-center gap-2 mb-3 ${i?"text-amber-400":"text-amber-600"}`,children:[s.jsx(z2,{size:16}),s.jsxs("span",{className:"text-sm font-bold",children:["道具 (",a.extraction.props.length,")"]})]}),s.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-3 min-w-0",children:a.extraction.props.map(Ke=>s.jsxs("div",{className:`p-4 rounded-xl border transition-all min-w-0 overflow-hidden ${i?"bg-zinc-800/40 border-zinc-700/60":"bg-zinc-50 border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[s.jsx("span",{className:"w-2 h-2 rounded-full bg-amber-500"}),s.jsx("span",{className:`text-sm font-bold ${i?"text-zinc-200":"text-zinc-800"}`,children:Ke.name}),Ke.owner&&s.jsxs("span",{className:`text-xs px-2 py-0.5 rounded-full ${i?"bg-zinc-700 text-zinc-400 border border-zinc-600":"bg-zinc-100 text-zinc-500 border border-zinc-200"}`,children:["属于: ",Ke.owner]}),s.jsx("div",{className:"flex-1"}),s.jsxs("button",{onClick:()=>j==null?void 0:j(Ke,"prop"),className:`shrink-0 px-2.5 py-1 rounded-lg text-xs font-medium flex items-center gap-1 transition-all ${i?"bg-amber-500/10 text-amber-400 hover:bg-amber-500/20 border border-amber-500/20":"bg-amber-50 text-amber-600 hover:bg-amber-100 border border-amber-200"}`,children:[s.jsx(Lo,{size:11})," 发送到画布"]})]}),Ke.description&&s.jsx("p",{className:`text-sm leading-relaxed mb-2 ${i?"text-zinc-400":"text-zinc-600"}`,children:Ke.description}),Ke.visualPrompt&&s.jsx("div",{className:`p-3 rounded-lg text-sm leading-relaxed break-all ${i?"bg-zinc-900 text-amber-300/80 border border-zinc-800":"bg-amber-50 text-amber-800 border border-amber-200"}`,children:Ke.visualPrompt})]},Ke.id))})]})]}):s.jsx("div",{className:`flex items-center justify-center h-full text-sm ${i?"text-zinc-600":"text-zinc-400"}`,children:"暂无提取数据"}))]})]})}),document.body)]});if(t){const Ke=mt.current??Kn;return s.jsxs("div",{ref:Rr,className:ir,style:{position:"fixed",left:Ke.x,top:Ke.y,width:Ke.w,height:Ke.h,pointerEvents:e?"auto":"none"},children:[Yn,s.jsx("div",{onMouseDown:Et=>cn(Et,"e"),className:"absolute top-0 right-0 bottom-0 w-1 cursor-ew-resize hover:bg-amber-500/30",style:{right:-2},title:"拖拽调整宽度"}),s.jsx("div",{onMouseDown:Et=>cn(Et,"s"),className:"absolute left-0 right-0 bottom-0 h-1 cursor-ns-resize hover:bg-amber-500/30",style:{bottom:-2},title:"拖拽调整高度"}),s.jsx("div",{onMouseDown:Et=>cn(Et,"se"),className:"absolute w-3 h-3 cursor-nwse-resize hover:bg-amber-500/40 rounded-br-2xl",style:{right:-4,bottom:-4},title:"拖拽缩放"})]})}return s.jsx("div",{ref:sr,className:`absolute left-0 top-2 bottom-2 w-[240px] z-40 flex flex-col transition-all duration-300 ease-in-out rounded-2xl overflow-hidden ${e?"translate-x-0 opacity-100":"-translate-x-full opacity-0"} ${i?"bg-[#121214] border border-zinc-800 shadow-2xl":"bg-white border border-zinc-200 shadow-2xl"}`,style:{pointerEvents:e?"auto":"none"},children:Yn})},Vte=_.memo(Dte),Hte=["人物","动物","物品","建筑","场景","其他"],Gte=({isOpen:e,onClose:t,isDark:n,history:r,apiConfigs:i,globalApiKey:a,chatModel:o,onSetChatModel:l,onSetKlingSubjectLibrary:c,klingSubjectLibrary:u,onShowToast:d})=>{const[h,p]=_.useState(""),[f,b]=_.useState([]),[g,y]=_.useState(""),[w,v]=_.useState(""),[m,z]=_.useState(""),[C,E]=_.useState(!1),[I,R]=_.useState(!1),[A,O]=_.useState(!1),[F,L]=_.useState([]),[X,T]=_.useState(!1),[q,H]=_.useState(!1),[J,Z]=_.useState(!1),[B,V]=_.useState(!1),N=_.useRef(null),j=_.useRef(null);if(!e)return null;const k=r.filter(U=>U.type==="image"&&U.status==="completed"&&U.url),W=U=>{var te;const G=(te=U.target.files)==null?void 0:te[0];if(G){const ge=new FileReader;ge.onloadend=()=>{p(ge.result)},ge.readAsDataURL(G)}},M=U=>{p(U),T(!1)},Y=U=>{U.preventDefault(),U.stopPropagation(),Z(!0)},se=U=>{U.preventDefault(),U.stopPropagation(),Z(!1)},ie=U=>{var te;U.preventDefault(),U.stopPropagation(),Z(!1);const G=(te=U.dataTransfer.files)==null?void 0:te[0];if(G&&G.type.startsWith("image/")){const ge=new FileReader;ge.onloadend=()=>{p(ge.result)},ge.readAsDataURL(G)}},oe=U=>{const G=Array.from(U.target.files||[]);if(G.length+f.length>3){d("warning","最多只能上传 3 张其他视角图");return}G.forEach(te=>{const ge=new FileReader;ge.onloadend=()=>{b(ne=>[...ne,ge.result])},ge.readAsDataURL(te)})},re=U=>{if(f.length>=3){d("warning","最多只能上传 3 张其他视角图");return}b(G=>[...G,U]),H(!1)},ee=U=>{U.preventDefault(),U.stopPropagation(),V(!0)},pe=U=>{U.preventDefault(),U.stopPropagation(),V(!1)},we=U=>{U.preventDefault(),U.stopPropagation(),V(!1);const G=Array.from(U.dataTransfer.files).filter(te=>te.type.startsWith("image/"));if(G.length+f.length>3){d("warning","最多只能上传 3 张其他视角图");return}G.forEach(te=>{const ge=new FileReader;ge.onloadend=()=>{b(ne=>[...ne,ge.result])},ge.readAsDataURL(te)})},Q=U=>{b(G=>G.filter((te,ge)=>ge!==U))},me=async()=>{var U,G,te,ge;if(!h){d("warning","请先上传主参考图");return}O(!0);try{const ne=i.find(xe=>xe.id===o);if(!ne){d("error","未找到选择的模型配置"),O(!1);return}const le=ne.key||a;if(!le){d("error","请先配置 API Key"),O(!1);return}const be=`${(ne.url||"https://api.openai.com").replace(/\/+$/,"")}/v1/chat/completions`,de=`你是一个专业的图像描述助手。请根据用户上传的图片,生成简洁准确的主体描述。 +描述要求: +1. 描述主体的核心特征,如「一个穿着金色耳环的短发女孩」 +2. 可以描述希望保留的细节,如「佩戴着金色耳环」 +3. 可以描述想要突破的特征,如「不要脸上的痣」 +4. 不超过 100 字 +5. 使用中文 +6. 直接输出描述内容,不要添加任何前缀或解释`,$e=`请描述这张图片中的主体${g?`(名称:${g})`:""}${w?`(类型:${w})`:""}。`,ze=[{role:"system",content:de},{role:"user",content:[{type:"text",text:$e},{type:"image_url",image_url:{url:h}}]}],_e=await fetch(be,{method:"POST",headers:{Authorization:`Bearer ${le}`,"Content-Type":"application/json"},body:JSON.stringify({model:ne.modelName||"gpt-4o",messages:ze,max_tokens:200,temperature:.7})});if(!_e.ok){const xe=await _e.text();throw console.error("AI 描述生成失败:",xe),new Error(`API 错误 (${_e.status}): ${xe}`)}const Ce=(ge=(te=(G=(U=(await _e.json()).choices)==null?void 0:U[0])==null?void 0:G.message)==null?void 0:te.content)==null?void 0:ge.trim();if(Ce)z(Ce.slice(0,100));else throw new Error("未能生成描述")}catch(ne){console.error("智能描述生成失败:",ne),d("error","智能描述生成失败,请重试或手动输入描述")}finally{O(!1)}},ue=async()=>{var U;if(console.log("[Kling Subject] 点击创建按钮"),console.log("[Kling Subject] 表单数据:",{hasMainImage:!!h,auxiliaryImagesCount:f.length,name:g,type:w,description:m}),!h){console.log("[Kling Subject] 验证失败: 缺少主参考图"),d("warning","请上传主参考图");return}if(f.length===0){console.log("[Kling Subject] 验证失败: 缺少其他视角图"),d("warning","请至少上传 1 张其他视角图");return}if(!g.trim()){console.log("[Kling Subject] 验证失败: 缺少主体名称"),d("warning","请输入主体名称");return}if(g.length>20){console.log("[Kling Subject] 验证失败: 主体名称过长"),d("warning","主体名称不能超过 20 个字符");return}if(!w){console.log("[Kling Subject] 验证失败: 缺少标签"),d("warning","请选择标签");return}if(!m.trim()){console.log("[Kling Subject] 验证失败: 缺少主体描述"),d("warning","请输入主体描述");return}if(m.length>100){console.log("[Kling Subject] 验证失败: 主体描述过长"),d("warning","主体描述不能超过 100 个字符");return}console.log("[Kling Subject] 表单验证通过,开始提交"),E(!0);try{const G=i.find(xe=>xe.id==="kling-o1");if(!G)throw new Error("未找到可灵O1模型配置");const te=G.key||a;if(!te)throw new Error("请先配置可灵O1的 API Key");const ge=(G.url||"https://linyunai.net").replace(/\/+$/,"");let ne=h,le=[...f];if(h.startsWith("data:")){console.log("[Kling Subject] 主参考图是base64格式,需要上传");try{const xe=await fetch(`${ge}/mj/submit/upload-discord-images`,{method:"POST",headers:{Authorization:`Bearer ${te}`,"Content-Type":"application/json"},body:JSON.stringify({base64Array:[h]})});if(!xe.ok)throw new Error(`图片上传失败 (${xe.status})`);const Ne=await xe.json();if(console.log("[Kling Subject] 主参考图上传结果:",Ne),Ne.code===1&&Ne.result&&Array.isArray(Ne.result))ne=Ne.result[0],console.log("[Kling Subject] 主参考图URL:",ne);else throw new Error("图片上传失败: "+(Ne.description||"未知错误"))}catch(xe){throw console.error("[Kling Subject] 主参考图上传失败:",xe),new Error("主参考图上传失败,请重试")}}const fe=f.filter(xe=>xe.startsWith("data:"));if(fe.length>0){console.log(`[Kling Subject] ${fe.length} 张辅助图是base64格式,需要上传`);try{const xe=await fetch(`${ge}/mj/submit/upload-discord-images`,{method:"POST",headers:{Authorization:`Bearer ${te}`,"Content-Type":"application/json"},body:JSON.stringify({base64Array:fe})});if(!xe.ok)throw new Error(`辅助图上传失败 (${xe.status})`);const Ne=await xe.json();if(console.log("[Kling Subject] 辅助图上传结果:",Ne),Ne.code===1&&Ne.result&&Array.isArray(Ne.result)){let ve=0;le=f.map(ke=>ke.startsWith("data:")?Ne.result[ve++]:ke),console.log("[Kling Subject] 辅助图URLs:",le)}else throw new Error("辅助图上传失败: "+(Ne.description||"未知错误"))}catch(xe){throw console.error("[Kling Subject] 辅助图上传失败:",xe),new Error("辅助图上传失败,请重试")}}const be={element_name:g.trim(),element_description:m.trim(),element_frontal_image:ne,element_refer_list:le.map(xe=>({image_url:xe}))};F.length>0&&(be.element_list=F.map(xe=>({element_id:xe})),console.log("[Kling Subject] 创建标签主体,关联基础主体:",F)),console.log("[Kling Subject] 创建主体请求:",{endpoint:`${ge}/kling/v1/general/custom-elements`,name:be.element_name,description:be.element_description,mainImageUrl:be.element_frontal_image,auxiliaryImagesCount:be.element_refer_list.length,hasElementList:!!be.element_list,elementListCount:((U=be.element_list)==null?void 0:U.length)||0});const de=await fetch(`${ge}/kling/v1/general/custom-elements`,{method:"POST",headers:{Authorization:`Bearer ${te}`,"Content-Type":"application/json"},body:JSON.stringify(be)});if(!de.ok){const xe=await de.text();throw console.error("[Kling Subject] API错误:",xe),new Error(`API错误 (${de.status}): ${xe}`)}const $e=await de.json();if(console.log("[Kling Subject] 创建响应:",$e),$e.code!==0)throw new Error($e.message||"创建主体失败");console.log("[Kling Subject] 等待服务器处理..."),await new Promise(xe=>setTimeout(xe,1500)),console.log("[Kling Subject] 查询主体列表以验证创建结果...");const ze=await fetch(`${ge}/kling/v1/general/custom-elements`,{method:"GET",headers:{Authorization:`Bearer ${te}`,"Content-Type":"application/json"}});if(!ze.ok)throw console.warn("[Kling Subject] 查询主体列表失败,使用创建响应中的数据"),new Error("FALLBACK_TO_CREATE_RESPONSE");const _e=await ze.text();console.log("[Kling Subject] 查询响应文本(前500字符):",_e.substring(0,500));const Ee=_e.replace(/"element_id"\s*:\s*(\d+)/g,'"element_id": "$1"'),Ce=JSON.parse(Ee);if(console.log("[Kling Subject] 查询响应(修复后):",Ce),Ce.code===0&&Array.isArray(Ce.data)){const xe=Ce.data.find(Ne=>Ne.element_name===g.trim());if(xe){console.log("[Kling Subject] ✅ 验证成功!找到创建的主体:",xe);const Ne=xe.element_id;console.log("[Kling Subject] 使用查询到的 element_id:",Ne),console.log("[Kling Subject] element_id 类型:",typeof Ne);const ve={id:Ne,name:xe.element_name,type:w,description:xe.element_description||m.trim(),mainImage:xe.element_frontal_image||ne,auxiliaryImages:xe.element_refer_list?xe.element_refer_list.map(ke=>ke.image_url||ke):le,createdAt:new Date().toISOString(),element_id:Ne,ownedBy:xe.owned_by,tagList:xe.tag_list};console.log("[Kling Subject] 保存的主体数据:",ve),c(ke=>[...ke,ve]),R(!0),setTimeout(()=>{t(),p(""),b([]),y(""),v(""),z(""),L([]),R(!1)},1e3);return}else throw console.warn("[Kling Subject] ⚠️ 未在查询结果中找到创建的主体"),console.log("[Kling Subject] 查询到的所有主体:",Ce.data.map(Ne=>({name:Ne.element_name,id:Ne.element_id}))),new Error("FALLBACK_TO_CREATE_RESPONSE")}else throw console.warn("[Kling Subject] 查询响应格式不正确"),new Error("FALLBACK_TO_CREATE_RESPONSE")}catch(G){G instanceof Error&&G.message==="FALLBACK_TO_CREATE_RESPONSE"?(console.warn("[Kling Subject] 使用创建响应中的数据(未验证)"),d("warning","主体已创建,但无法验证。请在主体库中查看。"),setTimeout(()=>{t(),p(""),b([]),y(""),v(""),z(""),L([])},1e3)):(console.error("[Kling Subject] 创建主体失败:",G),d("error",`创建主体失败: ${G instanceof Error?G.message:"未知错误"}`))}finally{E(!1)}};return s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"fixed inset-0 z-[100]",style:{backgroundColor:"rgba(0, 0, 0, 0.3)"},onClick:t}),s.jsxs("div",{className:`fixed w-[600px] max-h-[85vh] overflow-y-auto rounded-lg shadow-2xl flex flex-col minimal-scrollbar ${n?"bg-[#121214] border-zinc-800":"bg-white border-zinc-200"} border`,style:{zIndex:101,pointerEvents:"auto",top:"50%",left:"50%",transform:"translate(-50%, -50%)"},onClick:U=>U.stopPropagation(),onMouseDown:U=>U.stopPropagation(),children:[I&&s.jsx("div",{className:"absolute inset-0 z-50 flex items-center justify-center bg-black/60 rounded-lg backdrop-blur-sm",children:s.jsxs("div",{className:"text-center",children:[s.jsx("div",{className:"inline-flex items-center justify-center w-20 h-20 rounded-full bg-green-500 mb-4 animate-bounce",children:s.jsx("svg",{className:"w-10 h-10 text-white",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:s.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:3,d:"M5 13l4 4L19 7"})})}),s.jsx("div",{className:"text-white text-lg font-bold",children:"主体创建成功!"})]})}),s.jsxs("div",{className:`p-4 border-b flex justify-between items-center ${n?"border-zinc-800":"border-zinc-200"}`,children:[s.jsx("h3",{className:`font-bold text-sm ${n?"text-zinc-300":"text-zinc-700"}`,children:"创建多图主体"}),s.jsx("button",{onClick:t,children:s.jsx(Qr,{size:16,className:n?"text-zinc-500":"text-zinc-400"})})]}),s.jsxs("div",{className:"p-4 space-y-4",children:[s.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[s.jsxs("div",{children:[s.jsx("label",{className:`block text-xs mb-2 ${n?"text-zinc-300":"text-zinc-700"}`,children:"添加主要参考图"}),s.jsx("div",{onDragOver:Y,onDragLeave:se,onDrop:ie,className:`aspect-square rounded-lg border-2 border-dashed cursor-pointer transition-colors flex flex-col items-center justify-center relative overflow-hidden ${h?"border-transparent":J?"border-blue-500 bg-blue-500/10":n?"border-zinc-700 hover:border-zinc-600 bg-zinc-900":"border-zinc-300 hover:border-zinc-400 bg-zinc-50"}`,children:h?s.jsxs(s.Fragment,{children:[s.jsx("img",{src:h,alt:"主参考图",className:"w-full h-full object-contain rounded-lg",style:{maxHeight:"100%",maxWidth:"100%"}}),s.jsx("button",{onClick:U=>{U.stopPropagation(),p("")},className:"absolute top-2 right-2 p-1.5 rounded-full bg-red-500 text-white hover:bg-red-600 transition-colors z-10",children:s.jsx(Qr,{size:12})})]}):s.jsxs(s.Fragment,{children:[s.jsx(ou,{size:32,className:n?"text-zinc-600":"text-zinc-400"}),s.jsx("p",{className:`text-xs mt-2 ${n?"text-zinc-500":"text-zinc-400"}`,children:"添加正面图(必填)"}),s.jsxs("div",{className:"flex gap-2 mt-2",children:[s.jsx("button",{onClick:()=>{var U;return(U=N.current)==null?void 0:U.click()},className:`text-[10px] px-2 py-1 rounded transition-colors ${n?"bg-zinc-800 hover:bg-zinc-700 text-zinc-300":"bg-zinc-200 hover:bg-zinc-300 text-zinc-700"}`,children:"本地上传"}),s.jsx("button",{onClick:U=>{U.stopPropagation(),T(!X)},className:`text-[10px] px-2 py-1 rounded transition-colors ${n?"bg-blue-600 hover:bg-blue-500 text-white":"bg-blue-500 hover:bg-blue-600 text-white"}`,children:"从历史选择"})]})]})}),s.jsx("input",{ref:N,type:"file",accept:"image/*",className:"hidden",onChange:W}),X&&s.jsxs("div",{className:`absolute z-50 mt-2 w-64 max-h-80 overflow-y-auto rounded-lg border shadow-xl minimal-scrollbar ${n?"bg-zinc-900 border-zinc-700":"bg-white border-zinc-300"}`,children:[s.jsxs("div",{className:`sticky top-0 p-2 border-b flex justify-between items-center ${n?"bg-zinc-900 border-zinc-700":"bg-white border-zinc-300"}`,children:[s.jsx("span",{className:`text-xs font-medium ${n?"text-zinc-300":"text-zinc-700"}`,children:"选择历史图片"}),s.jsx("button",{onClick:()=>T(!1),children:s.jsx(Qr,{size:14,className:n?"text-zinc-500":"text-zinc-400"})})]}),k.length===0?s.jsx("div",{className:`p-4 text-xs text-center ${n?"text-zinc-500":"text-zinc-400"}`,children:"暂无历史图片"}):s.jsx("div",{className:"grid grid-cols-2 gap-2 p-2",children:k.map(U=>s.jsx("div",{onClick:()=>M(U.url),className:`aspect-square rounded overflow-hidden cursor-pointer border-2 transition-colors ${n?"border-zinc-800 hover:border-blue-500":"border-zinc-200 hover:border-blue-500"}`,children:s.jsx("img",{src:U.url,alt:U.prompt||"历史图片",className:"w-full h-full object-cover"})},U.id))})]})]}),s.jsxs("div",{children:[s.jsx("label",{className:`block text-xs mb-2 ${n?"text-zinc-300":"text-zinc-700"}`,children:"添加其他视角图"}),s.jsx("div",{onDragOver:ee,onDragLeave:pe,onDrop:we,className:`aspect-square rounded-lg border-2 border-dashed cursor-pointer transition-colors flex flex-col items-center justify-center relative overflow-hidden ${B?"border-blue-500 bg-blue-500/10":n?"border-zinc-700 hover:border-zinc-600 bg-zinc-900":"border-zinc-300 hover:border-zinc-400 bg-zinc-50"}`,children:f.length>0?s.jsxs("div",{className:"w-full h-full p-2 grid grid-cols-2 gap-2 overflow-hidden",children:[f.map((U,G)=>s.jsxs("div",{className:"relative group overflow-hidden rounded",children:[s.jsx("img",{src:U,alt:`辅助图${G+1}`,className:"w-full h-full object-contain",style:{maxHeight:"100%",maxWidth:"100%"}}),s.jsx("button",{onClick:te=>{te.stopPropagation(),Q(G)},className:"absolute top-0.5 right-0.5 p-0.5 rounded-full bg-red-500 text-white opacity-0 group-hover:opacity-100 transition-opacity z-10",children:s.jsx(Qr,{size:10})})]},G)),f.length<3&&s.jsx("div",{onClick:U=>{U.stopPropagation(),H(!q)},className:`flex items-center justify-center rounded cursor-pointer transition-colors ${n?"bg-zinc-800 hover:bg-zinc-700":"bg-zinc-200 hover:bg-zinc-300"}`,children:s.jsx(si,{size:16,className:n?"text-zinc-600":"text-zinc-400"})})]}):s.jsxs(s.Fragment,{children:[s.jsx(ou,{size:32,className:n?"text-zinc-600":"text-zinc-400"}),s.jsx("p",{className:`text-xs mt-2 ${n?"text-zinc-500":"text-zinc-400"}`,children:"添加其他视角图(必填 1 张,上限 3 张)"}),s.jsxs("div",{className:"flex gap-2 mt-2",children:[s.jsx("button",{onClick:()=>{var U;return(U=j.current)==null?void 0:U.click()},className:`text-[10px] px-2 py-1 rounded transition-colors ${n?"bg-zinc-800 hover:bg-zinc-700 text-zinc-300":"bg-zinc-200 hover:bg-zinc-300 text-zinc-700"}`,children:"本地上传"}),s.jsx("button",{onClick:U=>{U.stopPropagation(),H(!q)},className:`text-[10px] px-2 py-1 rounded transition-colors ${n?"bg-blue-600 hover:bg-blue-500 text-white":"bg-blue-500 hover:bg-blue-600 text-white"}`,children:"从历史选择"})]})]})}),s.jsx("input",{ref:j,type:"file",accept:"image/*",multiple:!0,className:"hidden",onChange:oe}),q&&s.jsxs("div",{className:`absolute z-50 mt-2 w-64 max-h-80 overflow-y-auto rounded-lg border shadow-xl minimal-scrollbar ${n?"bg-zinc-900 border-zinc-700":"bg-white border-zinc-300"}`,children:[s.jsxs("div",{className:`sticky top-0 p-2 border-b flex justify-between items-center ${n?"bg-zinc-900 border-zinc-700":"bg-white border-zinc-300"}`,children:[s.jsx("span",{className:`text-xs font-medium ${n?"text-zinc-300":"text-zinc-700"}`,children:"选择历史图片"}),s.jsx("button",{onClick:()=>H(!1),children:s.jsx(Qr,{size:14,className:n?"text-zinc-500":"text-zinc-400"})})]}),k.length===0?s.jsx("div",{className:`p-4 text-xs text-center ${n?"text-zinc-500":"text-zinc-400"}`,children:"暂无历史图片"}):s.jsx("div",{className:"grid grid-cols-2 gap-2 p-2",children:k.map(U=>s.jsx("div",{onClick:()=>re(U.url),className:`aspect-square rounded overflow-hidden cursor-pointer border-2 transition-colors ${n?"border-zinc-800 hover:border-blue-500":"border-zinc-200 hover:border-blue-500"}`,children:s.jsx("img",{src:U.url,alt:U.prompt||"历史图片",className:"w-full h-full object-cover"})},U.id))})]})]})]}),s.jsxs("div",{children:[s.jsx("label",{className:`block text-xs mb-2 ${n?"text-zinc-300":"text-zinc-700"}`,children:"主体名称(必填)"}),s.jsxs("div",{className:"relative",children:[s.jsx("input",{type:"text",value:g,onChange:U=>y(U.target.value.slice(0,20)),placeholder:"请输入简洁的名称",className:`w-full px-3 py-2 text-xs rounded border outline-none ${n?"bg-zinc-900 border-zinc-700 text-zinc-200 placeholder-zinc-600":"bg-white border-zinc-300 text-zinc-800 placeholder-zinc-400"}`}),s.jsxs("span",{className:`absolute right-3 top-2 text-[10px] ${n?"text-zinc-500":"text-zinc-400"}`,children:[g.length,"/20"]})]})]}),s.jsxs("div",{children:[s.jsx("label",{className:`block text-xs mb-2 ${n?"text-zinc-300":"text-zinc-700"}`,children:"标签(必选)"}),s.jsxs("select",{value:w,onChange:U=>v(U.target.value),className:`w-full px-3 py-2 text-xs rounded border outline-none ${n?"bg-zinc-900 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,children:[s.jsx("option",{value:"",children:"请选择主体类型"}),Hte.map(U=>s.jsx("option",{value:U,children:U},U))]})]}),s.jsxs("div",{children:[s.jsxs("div",{className:"flex justify-between items-center mb-2",children:[s.jsx("label",{className:`text-xs ${n?"text-zinc-300":"text-zinc-700"}`,children:"主体描述(必填)"}),s.jsx("select",{value:o,onChange:U=>l(U.target.value),className:`text-[10px] px-2 py-1 rounded border outline-none ${n?"bg-zinc-800 border-zinc-700 text-zinc-300":"bg-white border-zinc-300 text-zinc-700"}`,title:"选择用于智能描述的 AI 模型",children:i.filter(U=>U.type==="Chat").map(U=>s.jsx("option",{value:U.id,children:U.modelName},U.id))})]}),s.jsxs("div",{className:"relative",children:[s.jsx("textarea",{value:m,onChange:U=>z(U.target.value.slice(0,100)),placeholder:"请描述主体的核心特征,如「一个穿着金色耳环的短发女孩」;还可以描述希望保留的细节,如「佩戴着金色耳环」;或者描述想要突破的特征,如「不要脸上的痣」。不超过 100 字",rows:4,className:`w-full px-3 py-2 text-xs rounded border outline-none resize-none ${n?"bg-zinc-900 border-zinc-700 text-zinc-200 placeholder-zinc-600":"bg-white border-zinc-300 text-zinc-800 placeholder-zinc-400"}`}),s.jsxs("div",{className:"flex justify-between items-center mt-1",children:[s.jsx("button",{onClick:me,disabled:A||!h,className:`flex items-center gap-1 px-2 py-1 text-[10px] rounded transition-colors ${A||!h?"bg-zinc-400 text-zinc-200 cursor-not-allowed":n?"bg-purple-600 hover:bg-purple-500 text-white":"bg-purple-500 hover:bg-purple-600 text-white"}`,children:A?s.jsxs(s.Fragment,{children:[s.jsxs("svg",{className:"animate-spin h-3 w-3",viewBox:"0 0 24 24",children:[s.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4",fill:"none"}),s.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})]}),"生成中..."]}):s.jsxs(s.Fragment,{children:[s.jsx(bc,{size:10}),"智能描述"]})}),s.jsxs("span",{className:`text-[10px] ${n?"text-zinc-500":"text-zinc-400"}`,children:[m.length,"/100"]})]})]})]}),w==="物品"&&s.jsxs("div",{children:[s.jsx("label",{className:`block text-xs mb-2 ${n?"text-zinc-300":"text-zinc-700"}`,children:"关联基础主体(可选)"}),s.jsx("div",{className:`text-[10px] mb-2 ${n?"text-zinc-500":"text-zinc-400"}`,children:"如果这是一个标签主体,可以选择要关联的物品主体"}),s.jsxs("div",{className:"max-h-32 overflow-y-auto space-y-1 minimal-scrollbar",children:[u.filter(U=>U.type==="物品"&&U.id!=="").map(U=>s.jsxs("label",{className:`flex items-center gap-2 p-2 rounded cursor-pointer transition-colors ${F.includes(U.id)?n?"bg-blue-600/30 border border-blue-500":"bg-blue-100 border border-blue-400":n?"bg-zinc-900 hover:bg-zinc-800 border border-zinc-700":"bg-zinc-50 hover:bg-zinc-100 border border-zinc-200"}`,children:[s.jsx("input",{type:"checkbox",checked:F.includes(U.id),onChange:G=>{G.target.checked?L([...F,U.id]):L(F.filter(te=>te!==U.id))},className:"w-3 h-3"}),U.mainImage&&s.jsx("img",{src:U.mainImage,alt:U.name,className:"w-8 h-8 rounded object-cover"}),s.jsxs("div",{className:"flex-1",children:[s.jsx("div",{className:`text-xs font-medium ${n?"text-zinc-200":"text-zinc-800"}`,children:U.name}),U.description&&s.jsxs("div",{className:"text-[10px] text-zinc-500",children:[U.description.slice(0,30),"..."]})]})]},U.id)),u.filter(U=>U.type==="物品").length===0&&s.jsx("div",{className:`text-xs text-center py-4 ${n?"text-zinc-500":"text-zinc-400"}`,children:"暂无物品主体可关联"})]})]}),s.jsxs("div",{className:"flex justify-end gap-2 pt-2",children:[s.jsx("button",{onClick:t,className:`px-4 py-2 text-xs rounded transition-colors border ${n?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-zinc-100 text-zinc-700 hover:bg-zinc-200 border-transparent"}`,children:"取消"}),s.jsx("button",{onClick:U=>{console.log("[Kling Subject] 创建按钮被点击"),U.preventDefault(),U.stopPropagation(),ue()},disabled:C,className:`px-4 py-2 text-xs rounded transition-all transform active:scale-95 border ${C?n?"bg-transparent border-white/20 text-white/50 cursor-not-allowed":"bg-zinc-400 text-zinc-200 cursor-not-allowed border-transparent":n?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-blue-500 text-white hover:bg-blue-600 border-transparent"}`,children:C?s.jsxs("span",{className:"flex items-center gap-2",children:[s.jsxs("svg",{className:"animate-spin h-3 w-3",viewBox:"0 0 24 24",children:[s.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4",fill:"none"}),s.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})]}),"创建中..."]}):"创建"})]})]})]})]})},qte=({isOpen:e,onClose:t,isDark:n,cinemaConfig:r,onConfigChange:i,nodeWidth:a})=>{const[o,l]=_.useState({x:window.innerWidth/2-200,y:100}),[c,u]=_.useState({width:400,height:520}),[d,h]=_.useState(!1),[p,f]=_.useState(!1),b=_.useRef({x:0,y:0,posX:0,posY:0}),g=_.useRef({x:0,y:0,width:0,height:0}),y=_.useCallback(T=>{T.preventDefault(),h(!0),b.current={x:T.clientX,y:T.clientY,posX:o.x,posY:o.y}},[o]),w=_.useCallback(T=>{if(!d)return;const q=T.clientX-b.current.x,H=T.clientY-b.current.y;l({x:b.current.posX+q,y:b.current.posY+H})},[d]),v=_.useCallback(()=>{h(!1)},[]),m=_.useCallback(T=>{T.preventDefault(),T.stopPropagation(),f(!0),g.current={x:T.clientX,y:T.clientY,width:c.width,height:c.height}},[c]),z=_.useCallback(T=>{if(!p)return;const q=T.clientX-g.current.x,H=T.clientY-g.current.y;u({width:Math.max(320,g.current.width+q),height:Math.max(400,g.current.height+H)})},[p]),C=_.useCallback(()=>{f(!1)},[]);if(_.useEffect(()=>{if(d)return window.addEventListener("mousemove",w),window.addEventListener("mouseup",v),()=>{window.removeEventListener("mousemove",w),window.removeEventListener("mouseup",v)}},[d,w,v]),_.useEffect(()=>{if(p)return window.addEventListener("mousemove",z),window.addEventListener("mouseup",C),()=>{window.removeEventListener("mousemove",z),window.removeEventListener("mouseup",C)}},[p,z,C]),!e)return null;const E=lu.find(T=>T.id===r.cameraId),I=cu.find(T=>T.id===r.lensId),R=uu.find(T=>T.id===r.focalLengthId),A=du.find(T=>T.id===r.apertureId),O=T=>{i({...r,cameraId:r.cameraId===T?null:T})},F=T=>{i({...r,lensId:r.lensId===T?null:T})},L=T=>{i({...r,focalLengthId:r.focalLengthId===T?null:T})},X=T=>{i({...r,apertureId:r.apertureId===T?null:T})};return Ni.createPortal(s.jsxs("div",{className:"fixed z-[9999] bg-zinc-900/95 backdrop-blur-xl rounded-xl border border-zinc-700/50 shadow-2xl overflow-hidden flex flex-col",style:{left:`${o.x}px`,top:`${o.y}px`,width:`${c.width}px`,height:`${c.height}px`,transform:"none",transformOrigin:"unset",zoom:1},onMouseDown:T=>T.stopPropagation(),children:[s.jsxs("div",{className:"flex items-center justify-between px-3 py-2.5 border-b border-zinc-700/50 cursor-move select-none",onMouseDown:y,children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(VG,{size:14,className:"text-zinc-500"}),s.jsx(Ya,{size:14,className:"text-blue-400"}),s.jsx("span",{className:"text-white font-medium text-sm",children:"专业摄像机配置"})]}),s.jsx("button",{onClick:t,onMouseDown:T=>T.stopPropagation(),className:"p-1 rounded hover:bg-zinc-700/50 text-zinc-400 hover:text-white transition-colors",children:s.jsx(Qr,{size:14})})]}),s.jsx("div",{className:"px-3 py-2 bg-zinc-800/50 border-b border-zinc-700/30",children:s.jsxs("div",{className:"flex items-center gap-2 text-[11px] flex-wrap",children:[s.jsx("span",{className:"text-zinc-500",children:"配置:"}),s.jsxs("div",{className:"flex items-center gap-1",children:[s.jsx(Ya,{size:10,className:"text-blue-400"}),s.jsx("span",{className:E?"text-white":"text-zinc-500",children:(E==null?void 0:E.name)||"无"})]}),s.jsx("span",{className:"text-zinc-600",children:"+"}),s.jsxs("div",{className:"flex items-center gap-1",children:[s.jsx(Yd,{size:10,className:"text-purple-400"}),s.jsx("span",{className:I?"text-white":"text-zinc-500",children:(I==null?void 0:I.name)||"无"})]}),s.jsx("span",{className:"text-zinc-600",children:"+"}),s.jsxs("div",{className:"flex items-center gap-1",children:[s.jsx(Tx,{size:10,className:"text-green-400"}),s.jsx("span",{className:R?"text-white":"text-zinc-500",children:R?`${R.value}mm`:"无"})]}),s.jsx("span",{className:"text-zinc-600",children:"+"}),s.jsxs("div",{className:"flex items-center gap-1",children:[s.jsx(Yd,{size:10,className:"text-orange-400"}),s.jsx("span",{className:A?"text-white":"text-zinc-500",children:(A==null?void 0:A.value)||"无"})]})]})}),s.jsxs("div",{className:"flex-1 overflow-y-auto p-3 space-y-4 scrollbar-thin scrollbar-thumb-zinc-700 scrollbar-track-transparent",children:[s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center gap-1.5 mb-2",children:[s.jsx(Ya,{size:12,className:"text-blue-400"}),s.jsx("span",{className:"text-white font-medium text-xs",children:"摄像机"}),s.jsxs("span",{className:"text-zinc-500 text-[10px]",children:["(",lu.length,")"]})]}),s.jsx("div",{className:"flex gap-2 overflow-x-auto pb-1.5 scrollbar-thin scrollbar-thumb-zinc-700 scrollbar-track-transparent",children:lu.map(T=>s.jsxs("div",{onClick:()=>O(T.id),className:`flex-shrink-0 w-20 cursor-pointer rounded-lg overflow-hidden border-2 transition-all duration-150 ${r.cameraId===T.id?"border-blue-500 ring-1 ring-blue-500/30":"border-zinc-700/50 hover:border-zinc-600"}`,children:[s.jsx("div",{className:"w-20 h-20 bg-zinc-800 flex items-center justify-center overflow-hidden",children:s.jsx("img",{src:`/cinema/${T.image}`,alt:T.name,className:"w-full h-full object-cover",onError:q=>{q.target.style.display="none"}})}),s.jsx("div",{className:"p-1.5 bg-zinc-800/80 text-center",children:s.jsx("span",{className:"text-white text-[10px] font-medium",children:T.name})})]},T.id))})]}),s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center gap-1.5 mb-2",children:[s.jsx(Yd,{size:12,className:"text-purple-400"}),s.jsx("span",{className:"text-white font-medium text-xs",children:"镜头"}),s.jsxs("span",{className:"text-zinc-500 text-[10px]",children:["(",cu.length,")"]})]}),s.jsx("div",{className:"flex gap-2 overflow-x-auto pb-1.5 scrollbar-thin scrollbar-thumb-zinc-700 scrollbar-track-transparent",children:cu.map(T=>s.jsxs("div",{onClick:()=>F(T.id),className:`flex-shrink-0 w-[72px] cursor-pointer rounded-lg overflow-hidden border-2 transition-all duration-150 ${r.lensId===T.id?"border-purple-500 ring-1 ring-purple-500/30":"border-zinc-700/50 hover:border-zinc-600"}`,children:[s.jsx("div",{className:"w-[72px] h-[72px] bg-zinc-800 flex items-center justify-center overflow-hidden",children:s.jsx("img",{src:`/cinema/${T.image}`,alt:T.name,className:"w-full h-full object-cover",onError:q=>{q.target.style.display="none"}})}),s.jsxs("div",{className:"p-1 bg-zinc-800/80 text-center",children:[s.jsx("span",{className:"text-white text-[9px] font-medium block leading-tight",children:T.name}),s.jsx("span",{className:"text-zinc-400 text-[8px] block leading-tight",children:T.characteristics})]})]},T.id))})]}),s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center gap-1.5 mb-2",children:[s.jsx(Tx,{size:12,className:"text-green-400"}),s.jsx("span",{className:"text-white font-medium text-xs",children:"焦段"}),s.jsxs("span",{className:"text-zinc-500 text-[10px]",children:["(",uu.length,")"]})]}),s.jsx("div",{className:"flex gap-2 overflow-x-auto pb-1.5 scrollbar-thin scrollbar-thumb-zinc-700 scrollbar-track-transparent",children:uu.map(T=>s.jsxs("div",{onClick:()=>L(T.id),className:`flex-shrink-0 w-14 h-14 cursor-pointer rounded-lg border-2 transition-all duration-150 flex flex-col items-center justify-center ${r.focalLengthId===T.id?"border-green-500 ring-1 ring-green-500/30 bg-green-500/10":"border-zinc-700/50 hover:border-zinc-600 bg-zinc-800/50"}`,children:[s.jsx("span",{className:`text-lg font-bold ${r.focalLengthId===T.id?"text-green-400":"text-white"}`,children:T.value}),s.jsx("span",{className:"text-zinc-500 text-[8px]",children:"mm"})]},T.id))})]}),s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center gap-1.5 mb-2",children:[s.jsx(Yd,{size:12,className:"text-orange-400"}),s.jsx("span",{className:"text-white font-medium text-xs",children:"光圈"}),s.jsxs("span",{className:"text-zinc-500 text-[10px]",children:["(",du.length,")"]})]}),s.jsx("div",{className:"flex gap-2 overflow-x-auto pb-1.5 scrollbar-thin scrollbar-thumb-zinc-700 scrollbar-track-transparent",children:du.map(T=>s.jsxs("div",{onClick:()=>X(T.id),className:`flex-shrink-0 w-[72px] cursor-pointer rounded-lg overflow-hidden border-2 transition-all duration-150 ${r.apertureId===T.id?"border-orange-500 ring-1 ring-orange-500/30":"border-zinc-700/50 hover:border-zinc-600"}`,children:[s.jsx("div",{className:"w-[72px] h-[72px] bg-zinc-800 flex items-center justify-center overflow-hidden",children:s.jsx("img",{src:`/cinema/${T.image}`,alt:T.value,className:"w-full h-full object-cover",onError:q=>{q.target.style.display="none"}})}),s.jsxs("div",{className:"p-1 bg-zinc-800/80 text-center",children:[s.jsx("span",{className:"text-white text-[9px] font-medium block",children:T.value}),s.jsx("span",{className:"text-zinc-400 text-[8px] block",children:T.name})]})]},T.id))})]}),(r.cameraId||r.lensId||r.focalLengthId||r.apertureId)&&s.jsxs("div",{className:"p-2 bg-zinc-800/50 rounded-lg border border-zinc-700/30",children:[s.jsx("div",{className:"text-zinc-400 text-[10px] mb-1",children:"提示词补充:"}),s.jsx("div",{className:"text-blue-300 text-[10px] font-mono leading-relaxed",children:wm(r)})]})]}),s.jsxs("div",{className:"px-3 py-2 border-t border-zinc-700/50 flex justify-between items-center",children:[s.jsx("button",{onClick:()=>i({cameraId:null,lensId:null,focalLengthId:null,apertureId:null}),className:"px-2 py-1 text-[11px] text-zinc-400 hover:text-white transition-colors",children:"清空"}),s.jsx("button",{onClick:t,className:"px-4 py-1.5 bg-blue-600 hover:bg-blue-500 text-white text-[11px] font-medium rounded-lg transition-colors",children:"确认"})]}),s.jsx("div",{className:"absolute bottom-0 right-0 w-4 h-4 cursor-se-resize",onMouseDown:m,children:s.jsx("svg",{className:"w-full h-full text-zinc-600",viewBox:"0 0 16 16",children:s.jsx("path",{d:"M14 14L8 14L14 8L14 14Z",fill:"currentColor"})})})]}),document.body)};_.memo(qte);const Kte=new Set(["text-node","storyboard-menu","storyboard-node","storyboard-chart-node","gen-image","gen-video","motion-control","custom-agent","comfy-ui","image-compare","inpaint-menu","jimeng-super-resolution","preview","local-save"]),Xte=new Set(["text-node","video-input","video-analyze","custom-agent","motion-control","comfy-ui","local-save"]),Yte=new Set(["gen-music","comfy-ui","local-save"]),Jte=new Set(["storyboard-menu","storyboard-node","storyboard-chart-node","table-editor-node","gen-image","gen-video","motion-control","custom-agent","comfy-ui"]),Zte=new Set(["video-analyze"]),Qte=new Set(["storyboard-menu","storyboard-node"]),ene=new Set(["gen-image","gen-video","motion-control"]),tne=new Set(["preview"]),nne=new Set(["preview","inpaint-stitch","motion-control"]),rne=new Set(["preview","motion-control"]),sne=new Set(["preview"]),ine=new Set(["storyboard-menu","storyboard-node","gen-image","gen-video","custom-agent"]),ane=new Set(["preview","inpaint-stitch"]),one=new Set(["preview"]),lne=new Set(["gen-image"]),cne=new Set(["preview","local-save"]),une=new Set(["gen-image","gen-video","motion-control","inpaint-stitch","local-save"]),lo=[{type:"input-image",label:"图片",icon:si},{type:"text-node",label:"文字",icon:Vo},{type:"video-input",label:"视频抽帧",icon:aa},{type:"video-analyze",label:"视频拆解",icon:ml},{type:"storyboard-menu",label:"分镜表",icon:Ii,isSubmenu:!0},{type:"table-editor-node",label:"表格编辑",icon:Pw},{type:"doodle-canvas",label:"涂鸦画板",icon:vm},{type:"gen-image",label:"绘画",icon:zh},{type:"gen-video",label:"视频",icon:Mx},{type:"gen-music",label:"音乐",icon:$c},{type:"custom-agent",label:"Agent",icon:Ax},{type:"comfy-ui",label:"Comfy UI",icon:Ow,isSubmenu:!0},{type:"image-compare",label:"对比",icon:FG},{type:"inpaint-menu",label:"局部重绘",icon:ml,isSubmenu:!0},{type:"inpaint-stitch",label:"无缝拼回",icon:ml,hideInCreateMenu:!0},{type:"jimeng-super-resolution",label:"智能超清",icon:bc},{type:"motion-control",label:"动作迁移",icon:Mx},{type:"preview",label:"预览",icon:cl},{type:"local-save",label:"保存",icon:xu}],AN=[{type:"storyboard-node",label:"分镜视表",icon:Ii},{type:"storyboard-chart-node",label:"分镜图表",icon:Ii}],dne=[{type:"inpaint-crop",label:"裁剪局部重绘",icon:ml},{type:"inpaint-stitch",label:"无缝拼回",icon:ml}],hne=[{type:"rh-app",label:"RH 应用",icon:ym},{type:"rh-comfy",label:"RH ComfyUI",icon:Ow}],pne=[{type:"camera-movement",label:"镜头运镜",icon:aa},{type:"professional-camera",label:"专业摄影机",icon:Ya}],fne=({contextMenu:e,setContextMenu:t,isDark:n,addNode:r,nodes:i=[],showWatermark:a=!0})=>{var Ce,xe;const[o,l]=_.useState(!1),[c,u]=_.useState(!1),[d,h]=_.useState(!1),[p,f]=_.useState(!1),[b,g]=_.useState(null),[y,w]=_.useState(null),v=_.useRef(null),m=_.useRef(null),z=1500;if(_.useEffect(()=>{if(!e.visible)return;const Ne=ve=>{const ke=document.elementFromPoint(ve.clientX,ve.clientY);if(v.current&&ke&&v.current.contains(ke)){m.current&&(clearTimeout(m.current),m.current=null);return}m.current||(m.current=setTimeout(()=>{m.current=null,t(Pe=>({...Pe,visible:!1})),l(!1),u(!1),h(!1),f(!1)},z))};return window.addEventListener("mousemove",Ne,{passive:!0}),()=>{window.removeEventListener("mousemove",Ne),m.current&&(clearTimeout(m.current),m.current=null)}},[e.visible,t]),!e.visible)return null;const C=e.sourceNodeId??((Ce=e.sourceNodeIds)==null?void 0:Ce[0]),E=C?i.find(Ne=>Ne.id===C):void 0,I=(E==null?void 0:E.type)==="input-image"?(xe=E.settings)==null?void 0:xe.mediaType:void 0,R=typeof(E==null?void 0:E.content)=="string"?E.content:"",A=R.toLowerCase(),O=R.length>0&&(A.includes("video")||A.includes(".mp4")),F=R.length>0&&(A.startsWith("data:audio")||A.includes(".mp3")||A.includes(".wav")||A.includes(".ogg")||A.includes(".m4a")||A.includes(".aac")||A.includes(".flac")||A.includes("audio")),L=(E==null?void 0:E.type)==="input-image"&&R.length>0&&(I==="image"||!I&&!O&&!F),X=(E==null?void 0:E.type)==="input-image"&&R.length>0&&(I==="video"||!I&&O),T=(E==null?void 0:E.type)==="input-image"&&R.length>0&&(I==="audio"||!I&&!O&&F),q=(E==null?void 0:E.type)==="text-node",H=(E==null?void 0:E.type)==="video-input",J=(E==null?void 0:E.type)==="video-analyze",Z=(E==null?void 0:E.type)==="storyboard-node",B=(E==null?void 0:E.type)==="storyboard-chart-node",V=(E==null?void 0:E.type)==="gen-image",N=(E==null?void 0:E.type)==="motion-control",j=(E==null?void 0:E.type)==="gen-video",k=j||N,W=(E==null?void 0:E.type)==="custom-agent",M=(E==null?void 0:E.type)==="rh-app"||(E==null?void 0:E.type)==="rh-comfy",Y=(E==null?void 0:E.type)==="jimeng-super-resolution",se=(E==null?void 0:E.type)==="inpaint-crop",ie=(E==null?void 0:E.type)==="inpaint-stitch",oe=(E==null?void 0:E.type)==="preview",re=typeof(E==null?void 0:E.content)=="string"?E.content:"",ee=re.toLowerCase(),pe=(E==null?void 0:E.previewMjImages)||[],we=(E==null?void 0:E.previewMjVideos)||[],Q=re.length>0&&(ee.startsWith("data:video")||/\.(mp4|webm|mov|m4v)(\?|$)/i.test(re.split("?")[0])||ee.includes("force_video_display=true")||/\/video\//i.test(re)||ee.includes("video")&&!ee.includes("preview")),me=re.length>0&&(ee.startsWith("data:audio")||/\.(mp3|wav|ogg|m4a|aac|flac)(\?|$)/i.test(ee)),ue=pe.length>0,U=oe&&((E==null?void 0:E.previewType)==="video"||we.length>0||!ue&&Q),G=oe&&((E==null?void 0:E.previewType)==="audio"||me),te=oe&&!U&&!G&&((E==null?void 0:E.previewType)==="image"||ue||re.length>0),ge=L||te?lo.filter(Ne=>Kte.has(Ne.type)):X||U?lo.filter(Ne=>Xte.has(Ne.type)):T||G?lo.filter(Ne=>Yte.has(Ne.type)):q?lo.filter(Ne=>Jte.has(Ne.type)):H?lo.filter(Ne=>Zte.has(Ne.type)):J?lo.filter(Ne=>Qte.has(Ne.type)):Z?lo.filter(Ne=>ene.has(Ne.type)):B?lo.filter(Ne=>tne.has(Ne.type)):V?lo.filter(Ne=>nne.has(Ne.type)):N?lo.filter(Ne=>sne.has(Ne.type)):j?lo.filter(Ne=>rne.has(Ne.type)):W?lo.filter(Ne=>ine.has(Ne.type)):M?lo.filter(Ne=>ane.has(Ne.type)):Y?lo.filter(Ne=>one.has(Ne.type)):se?lo.filter(Ne=>lne.has(Ne.type)):ie?lo.filter(Ne=>cne.has(Ne.type)):oe?lo.filter(Ne=>une.has(Ne.type)):lo,ne=!L&&!X&&!T&&!te&&!U&&!G&&!q&&!H&&!J&&!Z&&!B&&!V&&!k&&!W&&!M&&!Y&&!se&&!ie&&!oe,le=!C&&!(e.sourceNodeIds&&e.sourceNodeIds.length>0),fe=le?ge.filter(Ne=>!Ne.hideInCreateMenu):ge,de=(()=>{const Pe=Math.min(fe.length*32+(ne?42:0)+16,520),Te=10,Be=8,He=window.innerWidth,Je=window.innerHeight;let Me,Re;return le?(Me=e.x+Be,Re=e.y):(Me=e.x,Re=e.y),Me+144>He-Te&&(Me=le?e.x-144-Be:e.x-144),MeHe-Te&&(Me=He-144-Te),ReJe-Te&&(Re=Je-Pe-Te),{x:Me,y:Re}})(),$e=()=>{b&&(clearTimeout(b),g(null))},ze=Ne=>{const ve=setTimeout(()=>{Ne==="director"&&l(!1),Ne==="comfy"&&u(!1),Ne==="storyboard"&&h(!1),Ne==="inpaint"&&f(!1)},300);g(ve)},_e=()=>{const Ne=setTimeout(()=>{t(ve=>({...ve,visible:!1})),l(!1),u(!1),h(!1),f(!1)},z);w(Ne)},Ee=()=>{y&&(clearTimeout(y),w(null)),m.current&&(clearTimeout(m.current),m.current=null)};return s.jsx(s.Fragment,{children:s.jsx("div",{ref:v,className:`fixed z-50 w-36 rounded-lg shadow-xl border ${n?"bg-zinc-900 border-zinc-800":"bg-white border-zinc-200"} ${le?"animate-in zoom-in-95 fade-in duration-150":""}`,style:{left:de.x,top:de.y,...le?{transformOrigin:"center center"}:{}},onMouseEnter:Ee,onMouseLeave:_e,children:s.jsxs("div",{className:"p-1",children:[a&&s.jsx("div",{className:`w-full px-3 py-1.5 text-xs text-center pointer-events-none select-none -translate-x-0.5 ${n?"text-zinc-300":"text-zinc-700"}`,children:"@桥豆麻衣酱"}),fe.map(Ne=>{const ve=Ne.isSubmenu,ke=ve&&Ne.type==="comfy-ui",Ie=ve&&Ne.type==="storyboard-menu",Pe=ve&&Ne.type==="inpaint-menu",Te=J?AN.filter(Be=>Be.type==="storyboard-node"):AN;return Ie?s.jsxs("div",{className:"relative",onMouseEnter:()=>{$e(),l(!1),u(!1),h(!0)},onMouseLeave:()=>ze("storyboard"),children:[s.jsxs("button",{type:"button",className:`w-full text-left px-3 py-1.5 text-xs rounded transition-colors flex items-center justify-between ${n?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"}`,children:[s.jsxs("span",{className:"flex items-center gap-2",children:[s.jsx(Ne.icon,{size:14,className:n?"text-zinc-400":"text-zinc-500"}),Ne.label]}),s.jsx(Ja,{size:14})]}),d&&s.jsx("div",{className:`absolute left-full top-0 ml-1 w-40 rounded-lg shadow-xl border ${n?"bg-zinc-900 border-zinc-800":"bg-white border-zinc-200"}`,onMouseEnter:$e,onMouseLeave:()=>ze("storyboard"),children:s.jsx("div",{className:"p-1",children:Te.map(Be=>s.jsxs("button",{type:"button",className:`w-full text-left px-3 py-1.5 text-xs rounded transition-colors flex items-center gap-2 ${n?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"}`,onClick:()=>r(Be.type,e.worldX,e.worldY,e.sourceNodeId||void 0,e.targetNodeId||void 0,e.sourceNodeIds||void 0),children:[s.jsx(Be.icon,{size:14,className:n?"text-zinc-400":"text-zinc-500"}),Be.label]},Be.type))})})]},Ne.type):Pe?s.jsxs("div",{className:"relative",onMouseEnter:()=>{$e(),l(!1),u(!1),h(!1),f(!0)},onMouseLeave:()=>ze("inpaint"),children:[s.jsxs("button",{type:"button",className:`w-full text-left px-3 py-1.5 text-xs rounded transition-colors flex items-center justify-between ${n?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"}`,children:[s.jsxs("span",{className:"flex items-center gap-2",children:[s.jsx(Ne.icon,{size:14,className:n?"text-zinc-400":"text-zinc-500"}),Ne.label]}),s.jsx(Ja,{size:14})]}),p&&s.jsx("div",{className:`absolute left-full top-0 ml-1 w-40 rounded-lg shadow-xl border ${n?"bg-zinc-900 border-zinc-800":"bg-white border-zinc-200"}`,onMouseEnter:$e,onMouseLeave:()=>ze("inpaint"),children:s.jsx("div",{className:"p-1",children:dne.map(Be=>s.jsxs("button",{type:"button",className:`w-full text-left px-3 py-1.5 text-xs rounded transition-colors flex items-center gap-2 ${n?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"}`,onClick:()=>r(Be.type,e.worldX,e.worldY,e.sourceNodeId||void 0,e.targetNodeId||void 0,e.sourceNodeIds||void 0),children:[s.jsx(Be.icon,{size:14,className:n?"text-zinc-400":"text-zinc-500"}),Be.label]},Be.type))})})]},Ne.type):ke?s.jsxs("div",{className:"relative",onMouseEnter:()=>{$e(),l(!1),u(!0),h(!1)},onMouseLeave:()=>ze("comfy"),children:[s.jsxs("button",{type:"button",className:`w-full text-left px-3 py-1.5 text-xs rounded transition-colors flex items-center justify-between ${n?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"}`,children:[s.jsxs("span",{className:"flex items-center gap-2",children:[s.jsx(Ne.icon,{size:14,className:n?"text-zinc-400":"text-zinc-500"}),Ne.label]}),s.jsx(Ja,{size:14})]}),c&&s.jsx("div",{className:`absolute left-full top-0 ml-1 w-40 rounded-lg shadow-xl border ${n?"bg-zinc-900 border-zinc-800":"bg-white border-zinc-200"}`,onMouseEnter:$e,onMouseLeave:()=>ze("comfy"),children:s.jsx("div",{className:"p-1",children:hne.map(Be=>s.jsxs("button",{type:"button",className:`w-full text-left px-3 py-1.5 text-xs rounded transition-colors flex items-center gap-2 ${n?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"}`,onClick:()=>r(Be.type,e.worldX,e.worldY,e.sourceNodeId||void 0,e.targetNodeId||void 0,e.sourceNodeIds||void 0),children:[s.jsx(Be.icon,{size:14,className:n?"text-zinc-400":"text-zinc-500"}),Be.label]},Be.type))})})]},Ne.type):s.jsxs("button",{type:"button",className:`w-full text-left px-3 py-1.5 text-xs rounded transition-colors flex items-center gap-2 ${n?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"}`,onClick:()=>r(Ne.type,e.worldX,e.worldY,e.sourceNodeId||void 0,e.targetNodeId||void 0,e.sourceNodeIds||void 0),children:[s.jsx(Ne.icon,{size:14,className:n?"text-zinc-400":"text-zinc-500"}),Ne.label]},Ne.type)}),ne&&s.jsxs("div",{className:"relative border-t border-zinc-700 mt-1 pt-1",onMouseEnter:()=>{$e(),u(!1),h(!1),l(!0)},onMouseLeave:()=>ze("director"),children:[s.jsxs("button",{className:`w-full text-left px-3 py-1.5 text-xs rounded transition-colors flex items-center justify-between ${n?"text-amber-400 hover:bg-zinc-800":"text-amber-600 hover:bg-zinc-100"}`,children:[s.jsxs("span",{className:"flex items-center gap-2",children:[s.jsx(IG,{size:14}),"导演模式"]}),s.jsx(Ja,{size:14})]}),o&&s.jsx("div",{className:`absolute left-full top-0 ml-1 w-40 rounded-lg shadow-xl border ${n?"bg-zinc-900 border-zinc-800":"bg-white border-zinc-200"}`,onMouseEnter:$e,onMouseLeave:()=>ze("director"),children:s.jsx("div",{className:"p-1",children:pne.map(Ne=>s.jsxs("button",{className:`w-full text-left px-3 py-1.5 text-xs rounded transition-colors flex items-center gap-2 ${n?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"}`,onClick:()=>r(Ne.type,e.worldX,e.worldY,e.sourceNodeId||void 0,e.targetNodeId||void 0,e.sourceNodeIds||void 0),children:[s.jsx(Ne.icon,{size:14,className:n?"text-blue-400":"text-blue-600"}),Ne.label]},Ne.type))})})]})]})})})},mne=({selectionContextMenu:e,setSelectionContextMenu:t,isDark:n,selectedNodeIds:r,selectedNodeId:i,handleSaveSelectedWorkflow:a,nodes:o,isPanning:l=!1})=>{if(!e.visible||l)return null;const c=r.size>0?r.size:i?1:0;return s.jsxs("div",{className:`fixed z-[120] w-52 rounded-lg shadow-2xl py-1 animate-in fade-in duration-100 border ${n?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,style:{left:e.x,top:e.y},onMouseLeave:()=>t({visible:!1,x:0,y:0}),children:[s.jsxs("div",{className:`px-3 py-1.5 text-[10px] font-medium border-b mb-1 ${n?"text-zinc-500 border-zinc-800":"text-zinc-500 border-zinc-200"}`,children:["选中 ",c," 个节点"]}),s.jsxs("button",{className:`w-full text-left px-3 py-2 text-xs flex items-center gap-2 transition-colors ${n?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"}`,onClick:a,children:[s.jsx(xu,{size:14,className:"text-blue-500"})," 保存当前选取工作流"]})]})},gne=({frameContextMenu:e,setFrameContextMenu:t,isDark:n,nodes:r,view:i,selectedNodeId:a,setChatFiles:o,setIsChatOpen:l,setNodes:c,updateNode:u,generateId:d})=>{if(!e.visible)return null;const h=()=>{t({visible:!1,x:0,y:0,nodeId:null,frame:null})},p=async()=>{const w=e.frame;if(w!=null&&w.url){let v=w.url;if(Ln.isContentRef(v))try{await Ln.init();const z=Ln.extractId(v),C=await Ln.get(z);C&&(v=C)}catch(z){console.error("[FrameContextMenu] content_ref 解析失败:",z)}if(!v.startsWith("data:"))try{if(v.startsWith("blob:")){const C=await(await fetch(v)).blob();v=await new Promise((E,I)=>{const R=new FileReader;R.onload=()=>E(R.result),R.onerror=I,R.readAsDataURL(C)})}else{const z=new Image;z.crossOrigin="anonymous",await new Promise((I,R)=>{z.onload=()=>I(),z.onerror=R,z.src=v});const C=document.createElement("canvas");C.width=z.naturalWidth,C.height=z.naturalHeight;const E=C.getContext("2d");E&&(E.drawImage(z,0,0),v=C.toDataURL("image/png"))}}catch(z){console.error("[FrameContextMenu] 图片转换失败:",z)}const m={name:`Frame-${(w.time??0).toFixed(2)}s.png`,type:"image/png",content:v,isImage:!0,isVideo:!1,isAudio:!1,fromHistory:!0,fileExt:"png"};o(z=>[...z,m]),l(!0)}h()},f=async()=>{const w=e.frame;if(w!=null&&w.url){const v=await Ln.storeImageUrlAsRef(w.url),m=(i.x*-1+window.innerWidth/2)/i.zoom,z=(i.y*-1+window.innerHeight/2)/i.zoom,C={id:d(),type:"input-image",x:m+50,y:z+50,width:260,height:260,content:v};c(E=>[...E,C])}h()},b=()=>{const w=e.frame;if(w!=null&&w.url){const v=r.filter(m=>m.type==="preview");if(v.length>0){const m=v[v.length-1].id;u(m,{content:w.url,previewType:"image"})}}h()},g=()=>{const w=e.frame,v=a,m=r.find(E=>E.id===v);if(!m||!(w!=null&&w.url)){alert("请先选择一个节点"),h();return}const z=w.url,C=m.id;switch(m.type){case"input-image":case"preview":u(C,{content:z,previewType:m.type==="preview"?"image":void 0});break;case"gen-image":case"gen-video":const E=d(),I={id:E,type:"input-image",x:m.x-350,y:m.y,width:260,height:260,content:z,prompt:"",settings:{}};c(O=>[...O,I]),setTimeout(()=>{const O=new CustomEvent("addConnection",{detail:{from:E,to:C,inputType:"default"}});window.dispatchEvent(O)},50);break;case"text-node":const R=d(),A={id:R,type:"input-image",x:m.x-350,y:m.y,width:260,height:260,content:w.url,prompt:"",settings:{}};c(O=>[...O,A]),setTimeout(()=>{const O=new CustomEvent("addConnection",{detail:{from:R,to:C,inputType:"default"}});window.dispatchEvent(O)},50);break;default:alert(`不支持的节点类型: ${m.type} + +支持的类型: +- 图片输入 +- 预览窗口 +- AI 绘画 +- AI 视频 +- 文字节点`)}h()},y=`w-full text-left px-3 py-2 text-xs flex items-center gap-2 transition-colors ${n?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"}`;return s.jsxs("div",{className:`fixed z-[110] w-48 rounded-lg shadow-2xl py-1 animate-in fade-in duration-100 border ${n?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,style:{left:e.x,top:e.y},onClick:w=>w.stopPropagation(),children:[s.jsx("div",{className:`px-3 py-1.5 text-[10px] font-medium border-b mb-1 ${n?"text-zinc-500 border-zinc-800":"text-zinc-500 border-zinc-200"}`,children:"操作"}),s.jsxs("button",{className:y,onClick:p,children:[s.jsx(Wp,{size:14,className:"text-purple-500"})," 发送到当前对话"]}),s.jsxs("button",{className:y,onClick:f,children:[s.jsx(Mw,{size:14,className:"text-blue-500"})," 发送到画布"]}),s.jsxs("button",{className:y,onClick:b,children:[s.jsx(cl,{size:14,className:"text-emerald-500"})," 发送到预览窗口"]}),s.jsxs("button",{className:y,onClick:g,children:[s.jsx(si,{size:14,className:a?"text-green-500":"text-zinc-400"})," 应用到选中节点"]})]})};let MN=null;const xne=[{label:"自由",value:null},{label:"1:1",value:1},{label:"4:3",value:4/3},{label:"3:2",value:3/2},{label:"16:9",value:16/9},{label:"9:16",value:9/16},{label:"2:3",value:2/3},{label:"3:4",value:3/4},{label:"21:9",value:21/9}],v9=({isOpen:e,onClose:t,imageUrl:n,isDark:r,onConfirm:i})=>{const[a,o]=_.useState(null),[l,c]=_.useState(null),[u,d]=_.useState([]),[h,p]=_.useState(null),[f,b]=_.useState(!1),[g,y]=_.useState(null),[w,v]=_.useState(!1),[m,z]=_.useState(null),[C,E]=_.useState(null),[I,R]=_.useState(null),[A,O]=_.useState(null),[F,L]=_.useState(null),X=_.useRef(null),T=_.useRef(null),q=_.useRef(null),H=_.useRef(null),[J,Z]=_.useState(1),[B,V]=_.useState({x:0,y:0}),N=_.useRef(1),j=_.useRef({x:0,y:0}),[k,W]=_.useState(!1),M=_.useRef(null),Y=_.useRef(null),se=_.useRef(null),[ie,oe]=_.useState(null),re=_.useCallback(()=>{const ze=T.current,_e=q.current;if(!ze||!_e||!(l!=null&&l.w)||!l.h)return;const Ee=ze.getBoundingClientRect(),Ce=l.w/l.h;let xe,Ne;Ee.width/Ee.height>Ce?(Ne=Ee.height,xe=Ee.height*Ce):(xe=Ee.width,Ne=Ee.width/Ce),oe({left:Ee.left+(Ee.width-xe)/2,top:Ee.top+(Ee.height-Ne)/2,width:xe,height:Ne})},[l]);_.useEffect(()=>{e&&(d([]),p(null),b(!1),y(null),o(null),c(null),oe(null),Z(1),V({x:0,y:0}),N.current=1,j.current={x:0,y:0},W(!1),z(null),E(null),R(null),O(null),L(MN),M.current=null,Y.current!=null&&(cancelAnimationFrame(Y.current),Y.current=null),se.current&&(clearTimeout(se.current),se.current=null))},[e,n]),_.useEffect(()=>{if(!e||!n)return;let ze=!1;return $P(n).then(_e=>{ze||o(_e)}).catch(()=>{ze||o(n)}),()=>{ze=!0}},[e,n]),_.useEffect(()=>{if(!e)return;const ze=()=>re();return window.addEventListener("resize",ze),()=>window.removeEventListener("resize",ze)},[e,re]),_.useEffect(()=>{if(l){const ze=requestAnimationFrame(()=>re());return()=>cancelAnimationFrame(ze)}},[l,re]);const ee=_.useCallback((ze,_e)=>{if(!ie||!(l!=null&&l.w)||!l.h||N.current<=0)return null;const Ee=j.current,Ce=N.current,xe=(ze-ie.left-Ee.x)/Ce/ie.width,Ne=(_e-ie.top-Ee.y)/Ce/ie.height;return xe<0||xe>1||Ne<0||Ne>1?null:{x:xe*l.w,y:Ne*l.h}},[ie,l]),pe=_.useCallback((ze,_e)=>{for(let Ee=u.length-1;Ee>=0;Ee--){const Ce=u[Ee];if(ze>=Ce.x&&ze<=Ce.x+Ce.w&&_e>=Ce.y&&_e<=Ce.y+Ce.h)return Ee}return-1},[u]),we=_.useCallback((ze,_e,Ee)=>{const Ce=Math.min(Ee.w,Ee.h)*.15,Ne=Math.max(Ce,8),ve=ze>=Ee.x-Ne/2&&ze<=Ee.x+Ne/2,ke=ze>=Ee.x+Ee.w-Ne/2&&ze<=Ee.x+Ee.w+Ne/2,Ie=_e>=Ee.y-Ne/2&&_e<=Ee.y+Ne/2,Pe=_e>=Ee.y+Ee.h-Ne/2&&_e<=Ee.y+Ee.h+Ne/2;return Ie&&ve?"nw":Ie&&ke?"ne":Pe&&ve?"sw":Pe&&ke?"se":Ie?"n":Pe?"s":ve?"w":ke?"e":null},[]),Q=_.useCallback(ze=>{if(ze.preventDefault(),!l||w)return;if(ze.button===1){W(!0),M.current={clientX:ze.clientX,clientY:ze.clientY,panX:j.current.x,panY:j.current.y};return}if(ze.button!==0)return;const _e=ee(ze.clientX,ze.clientY);if(!_e)return;if(m!==null&&u[m]){const Ce=we(_e.x,_e.y,u[m]);if(Ce){E({index:m,handle:Ce}),y(_e);return}}const Ee=pe(_e.x,_e.y);if(Ee>=0){z(Ee),R({index:Ee,startX:_e.x,startY:_e.y,origRect:{...u[Ee]}});return}z(null),b(!0),y(_e),p({x:_e.x,y:_e.y,w:0,h:0})},[l,w,ee,m,u,pe,we]),me=_.useCallback(()=>{const ze=H.current;if(!ze)return;const _e=N.current,Ee=j.current;ze.style.transform=`translate(${Ee.x}px, ${Ee.y}px) scale(${_e})`},[]);_.useLayoutEffect(()=>{me()});const ue=_.useCallback(ze=>{const _e=M.current;if(_e){const Ie=_e.panX+ze.clientX-_e.clientX,Pe=_e.panY+ze.clientY-_e.clientY;j.current={x:Ie,y:Pe},Y.current==null&&(Y.current=requestAnimationFrame(()=>{Y.current=null,me()}));return}const Ee=ee(ze.clientX,ze.clientY);if(!Ee||!l)return;if(C&&g){const{index:Ie,handle:Pe}=C,Te=A||u[Ie];if(!Te)return;const Be=u[Ie],He=Be.x+Be.w,Je=Be.y+Be.h,Me=F;let Re=Te.x,Ve=Te.y,Ze=Te.w,je=Te.h;Me!=null?Pe==="e"?(Ze=Math.max(10,Math.min(Ee.x-Be.x,l.w-Be.x)),je=Ze/Me,Re=Be.x,Ve=Be.y):Pe==="w"?(Re=Math.max(0,Math.min(Ee.x,He-10)),Ze=He-Re,je=Ze/Me,Ve=Je-je):Pe==="s"?(je=Math.max(10,Math.min(Ee.y-Be.y,l.h-Be.y)),Ze=je*Me,Re=Be.x,Ve=Be.y):Pe==="n"?(Ve=Math.max(0,Math.min(Ee.y,Je-10)),je=Je-Ve,Ze=je*Me,Re=He-Ze):Pe==="se"?(Ze=Math.max(10,Math.min(Ee.x-Be.x,l.w-Be.x)),je=Ze/Me,Re=Be.x,Ve=Be.y,Be.y+je>l.h&&(je=Math.max(10,l.h-Be.y),Ze=je*Me)):Pe==="nw"?(Re=Math.max(0,Math.min(Ee.x,He-10)),Ve=Math.max(0,Math.min(Ee.y,Je-10)),Ze=He-Re,je=Ze/Me,Ve=Je-je,Ve<0&&(Ve=0,je=Je,Ze=je*Me,Re=He-Ze)):Pe==="ne"?(Ze=Math.max(10,Math.min(Ee.x-Be.x,l.w-Be.x)),je=Ze/Me,Re=Be.x,Ve=Je-je,Ve<0&&(Ve=0,je=Je,Ze=je*Me)):Pe==="sw"&&(Re=Math.max(0,Math.min(Ee.x,He-10)),je=Math.max(10,Math.min(Ee.y-Be.y,l.h-Be.y)),Ze=je*Me,Re=He-Ze,Ve=Be.y,Re<0&&(Re=0,Ze=He,je=Ze/Me)):(Pe.includes("w")&&(Re=Math.max(0,Math.min(Ee.x,He-10)),Ze=He-Re),Pe.includes("e")&&(Ze=Math.max(10,Math.min(Ee.x-Be.x,l.w-Be.x)),Re=Be.x),Pe.includes("n")&&(Ve=Math.max(0,Math.min(Ee.y,Je-10)),je=Je-Ve),Pe.includes("s")&&(je=Math.max(10,Math.min(Ee.y-Be.y,l.h-Be.y)),Ve=Be.y)),Ze=Math.max(10,Math.min(Ze,l.w)),je=Math.max(10,Math.min(je,l.h)),Re=Math.max(0,Math.min(Re,l.w-Ze)),Ve=Math.max(0,Math.min(Ve,l.h-je)),O({x:Math.round(Re),y:Math.round(Ve),w:Math.round(Ze),h:Math.round(je)});return}if(I){const{startX:Ie,startY:Pe,origRect:Te}=I,Be=Ee.x-Ie,He=Ee.y-Pe,Je=Math.max(0,Math.min(Te.x+Be,l.w-Te.w)),Me=Math.max(0,Math.min(Te.y+He,l.h-Te.h));O({...Te,x:Math.round(Je),y:Math.round(Me)});return}if(!f||!g)return;const Ce=F;let xe,Ne,ve,ke;if(Ce==null)xe=Math.min(g.x,Ee.x),Ne=Math.min(g.y,Ee.y),ve=Math.abs(Ee.x-g.x),ke=Math.abs(Ee.y-g.y);else{const Ie=Math.abs(Ee.x-g.x),Pe=Math.abs(Ee.y-g.y),Te=Math.min(g.x,Ee.x),Be=Math.min(g.y,Ee.y);Ce>=1?(ve=Math.min(Ie,Pe*Ce),ke=ve/Ce):(ke=Math.min(Pe,Ie/Ce),ve=ke*Ce),xe=Te,Ne=Be}l.w>0&&l.h>0&&(ve=Math.min(ve,l.w-xe),ke=Math.min(ke,l.h-Ne),xe=Math.max(0,xe),Ne=Math.max(0,Ne),ve=Math.max(0,ve),ke=Math.max(0,ke)),p({x:xe,y:Ne,w:ve,h:ke})},[f,g,l,ee,C,u,I,A,me,F]),U=_.useCallback(ze=>{if((ze==null?void 0:ze.button)===1){Y.current!=null&&(cancelAnimationFrame(Y.current),Y.current=null),V(j.current),M.current=null,W(!1);return}if(C&&A){const{index:_e}=C;d(Ee=>Ee.map((Ce,xe)=>xe===_e?A:Ce)),E(null),y(null),O(null);return}if(I&&A){const{index:_e}=I;d(Ee=>Ee.map((Ce,xe)=>xe===_e?A:Ce)),R(null),O(null);return}if(C){E(null),y(null),O(null);return}if(I){R(null),O(null);return}if(!(!f||!h)){if(h.w>=4&&h.h>=4){const _e=u.length;d(Ee=>[...Ee,{x:Math.round(h.x),y:Math.round(h.y),w:Math.round(Math.min(h.w,l.w-h.x)),h:Math.round(Math.min(h.h,l.h-h.y))}]),z(_e)}b(!1),y(null),p(null)}},[f,h,l,C,I,u.length,A]),G=_.useCallback(ze=>{d(_e=>_e.filter((Ee,Ce)=>Ce!==ze)),z(_e=>_e===null||_e===ze?null:_e>ze?_e-1:_e)},[]),te=_.useCallback(()=>{u.length!==0&&(v(!0),i(u),t(),v(!1))},[u,i,t]),ge=_.useCallback(()=>{w||t()},[t,w]);_.useEffect(()=>{if(!e)return;const ze=_e=>{_e.key==="Escape"&&(_e.preventDefault(),ge())};return window.addEventListener("keydown",ze),()=>window.removeEventListener("keydown",ze)},[e,ge]),_.useEffect(()=>{if(!e)return;const ze=_e=>{_e.button===1&&(Y.current!=null&&(cancelAnimationFrame(Y.current),Y.current=null),V(j.current),M.current=null,W(!1))};return window.addEventListener("mouseup",ze),()=>window.removeEventListener("mouseup",ze)},[e]),_.useEffect(()=>{const ze=H.current;if(!ze||!ie||!l)return;const _e=Ee=>{Ee.preventDefault(),se.current&&(clearTimeout(se.current),se.current=null);const Ce=.5,xe=5,Ne=1-Ee.deltaY*.002,ve=N.current,ke=Math.min(xe,Math.max(Ce,ve*Ne));if(ke===ve)return;const Ie=ke/ve,Pe=j.current;j.current={x:Ee.clientX-ie.left-(Ee.clientX-ie.left-Pe.x)*Ie,y:Ee.clientY-ie.top-(Ee.clientY-ie.top-Pe.y)*Ie},N.current=ke,ze.style.transform=`translate(${j.current.x}px, ${j.current.y}px) scale(${ke})`,se.current=setTimeout(()=>{se.current=null,Z(N.current),V(j.current)},120)};return ze.addEventListener("wheel",_e,{passive:!1}),()=>{ze.removeEventListener("wheel",_e),se.current&&(clearTimeout(se.current),se.current=null)}},[ie,l]);const ne=_.useCallback(()=>{const ze=q.current;ze&&(c({w:ze.naturalWidth,h:ze.naturalHeight}),setTimeout(re,0))},[re]),le=_.useCallback(()=>{if(k)return"grabbing";if(C){const ze=C.handle;if(ze==="nw"||ze==="se")return"nwse-resize";if(ze==="ne"||ze==="sw")return"nesw-resize";if(ze==="n"||ze==="s")return"ns-resize";if(ze==="e"||ze==="w")return"ew-resize"}return I?"move":"crosshair"},[k,C,I]);if(!e)return null;const fe=r?"bg-[#09090b] border-zinc-800 text-zinc-200":"bg-white border-zinc-200 text-zinc-800",be=r?"border-zinc-700":"border-zinc-200",de=r?"hover:bg-zinc-800":"hover:bg-zinc-100",$e=r?"bg-white/15 border border-white/40 text-white hover:bg-white/25":"bg-amber-500 border-transparent text-white hover:bg-amber-600";return s.jsx("div",{className:"fixed inset-0 z-[100] flex items-center justify-center bg-black/70",onClick:ge,children:s.jsxs("div",{ref:X,className:`rounded-xl shadow-2xl w-[90vw] max-w-[1000px] overflow-hidden flex flex-col border max-h-[90vh] ${fe}`,onClick:ze=>ze.stopPropagation(),children:[s.jsx("div",{className:`flex items-center justify-end px-3 py-2 border-b shrink-0 ${be}`,children:s.jsx("button",{type:"button",onClick:ge,className:`p-1 rounded ${r?"text-zinc-400 hover:text-white":"text-zinc-500 hover:text-zinc-900"}`,children:s.jsx(Qr,{size:20})})}),s.jsxs("div",{className:"flex flex-1 min-h-0 p-3 gap-3",children:[s.jsx("div",{ref:T,className:`flex-1 min-w-0 flex items-center justify-center rounded-lg border overflow-hidden relative ${be} ${r?"bg-zinc-900/50":"bg-zinc-50"}`,style:{height:"min(60vh, calc(90vh - 220px))",minHeight:320},children:s.jsx("div",{className:"absolute inset-0 flex items-center justify-center overflow-hidden",children:a??(n.startsWith("content_ref:")?null:n)?s.jsx("img",{ref:q,src:a??n,alt:"拆切源",className:`max-h-full max-w-full min-w-0 min-h-0 object-contain object-center select-none pointer-events-none block ${ie?"opacity-0":""}`,draggable:!1,onLoad:ne}):s.jsx("span",{className:`text-sm ${r?"text-zinc-400":"text-zinc-500"}`,children:"加载中..."})})}),l&&ie&&s.jsxs("div",{ref:H,className:"fixed z-[101] select-none",style:{left:ie.left,top:ie.top,width:ie.width,height:ie.height,transformOrigin:"0 0",cursor:le()},onMouseDown:Q,onMouseMove:ue,onMouseUp:ze=>U(ze),onMouseLeave:()=>{M.current=null,W(!1),!C&&!I&&U()},onContextMenu:ze=>ze.preventDefault(),"aria-hidden":!0,children:[(a??n)&&s.jsx("img",{src:a??n,alt:"",className:"w-full h-full object-contain pointer-events-none block",draggable:!1}),s.jsxs("div",{className:"absolute inset-0 pointer-events-none",children:[u.map((ze,_e)=>{const Ee=m===_e,Ce=Ee&&((C==null?void 0:C.index)===_e||(I==null?void 0:I.index)===_e),xe=Ce&&A?A:ze,Ne=xe.w/l.w,ve=xe.h/l.h,ke=Math.min(Ne,ve),Ie=ke<.12,Pe=ke<.25;return s.jsxs("div",{className:`absolute rounded-sm ${Ee?"border-[1.5px] border-green-500 bg-green-500/10":"border border-white/40 bg-white/5"}`,style:{left:`${xe.x/l.w*100}%`,top:`${xe.y/l.h*100}%`,width:`${xe.w/l.w*100}%`,height:`${xe.h/l.h*100}%`},children:[s.jsx("span",{className:`absolute left-0 top-0 font-medium leading-none ${Ee?"bg-green-500/90 text-white":r?"bg-white/20 text-white":"bg-white/20 text-zinc-700"}`,style:{fontSize:Ie?5:Pe?6:8,padding:Ie?"0px 1px":Pe?"1px 2px":"2px 3px",borderBottomRightRadius:2},children:_e+1}),s.jsx("span",{className:"absolute right-0 top-0 pointer-events-auto inline-block leading-[0]",children:s.jsx("button",{type:"button",onClick:Te=>{Te.stopPropagation(),G(_e)},className:"bg-red-500/80 text-white hover:bg-red-600 block border-0",style:{padding:Ie?0:Pe?1:2,borderBottomLeftRadius:2},title:"删除",children:s.jsx(Zi,{size:Ie?5:Pe?7:10,className:"block"})})}),Ee&&!Ce&&s.jsxs(s.Fragment,{children:[["left-0 top-0 cursor-nwse-resize","right-0 top-0 cursor-nesw-resize","left-0 bottom-0 cursor-nesw-resize","right-0 bottom-0 cursor-nwse-resize"].map((Te,Be)=>s.jsx("div",{className:`absolute ${Te} bg-white/90 border pointer-events-auto border-green-500`,style:{width:Ie?2:Pe?3:5,height:Ie?2:Pe?3:5}},Be)),!Ie&&!Pe&&s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"absolute left-1/2 -translate-x-1/2 top-0 bg-white/90 border pointer-events-auto cursor-ns-resize border-green-500",style:{width:5,height:3}}),s.jsx("div",{className:"absolute left-1/2 -translate-x-1/2 bottom-0 bg-white/90 border pointer-events-auto cursor-ns-resize border-green-500",style:{width:5,height:3}}),s.jsx("div",{className:"absolute top-1/2 -translate-y-1/2 left-0 bg-white/90 border pointer-events-auto cursor-ew-resize border-green-500",style:{width:3,height:5}}),s.jsx("div",{className:"absolute top-1/2 -translate-y-1/2 right-0 bg-white/90 border pointer-events-auto cursor-ew-resize border-green-500",style:{width:3,height:5}})]})]})]},_e)}),h&&h.w>=2&&h.h>=2&&s.jsx("div",{className:"absolute border-2 border-dashed border-yellow-500 bg-yellow-500/15 rounded-sm",style:{left:`${h.x/l.w*100}%`,top:`${h.y/l.h*100}%`,width:`${h.w/l.w*100}%`,height:`${h.h/l.h*100}%`}})]})]}),s.jsxs("div",{className:`w-40 shrink-0 flex flex-col rounded-lg border overflow-hidden ${be}`,children:[s.jsxs("div",{className:`px-2 py-1.5 border-b text-xs font-medium ${be}`,children:["已选区域 (",u.length,")"]}),s.jsx("ul",{className:`flex-1 overflow-y-auto p-2 space-y-1 custom-scrollbar ${r?"bg-zinc-900/30":"bg-zinc-50/50"}`,children:u.length===0?s.jsx("li",{className:`text-center py-4 text-xs ${r?"text-zinc-500":"text-zinc-400"}`,children:"在图片上拖拽绘制区域"}):u.map((ze,_e)=>{const Ee=m===_e;return s.jsxs("li",{onClick:()=>z(_e),className:`flex items-center justify-between gap-1 rounded px-2 py-1.5 text-xs cursor-pointer transition-colors ${Ee?r?"bg-green-500/20 text-green-300 border border-green-500/50":"bg-green-50 text-green-700 border border-green-500/50":de}`,children:[s.jsxs("span",{className:"truncate",children:["#",_e+1," ",ze.w,"×",ze.h]}),s.jsx("button",{type:"button",onClick:Ce=>{Ce.stopPropagation(),G(_e)},className:`p-0.5 rounded ${r?"text-red-400 hover:bg-zinc-700":"text-red-600 hover:bg-zinc-200"}`,title:"删除",children:s.jsx(Zi,{size:14})})]},_e)})}),u.length>0&&s.jsx("div",{className:`px-2 py-1.5 text-[10px] border-t ${be} ${r?"text-zinc-500 bg-zinc-900/50":"text-zinc-400 bg-zinc-50"}`,children:"点击选中 · 拖拽调整"})]})]}),s.jsxs("div",{className:`flex items-center justify-between gap-3 px-3 py-2 border-t shrink-0 ${be}`,children:[s.jsxs("div",{className:`flex flex-wrap items-center gap-1 ${r?"text-zinc-400":"text-zinc-500"}`,children:[s.jsx("span",{className:"text-xs mr-0.5",children:"比例:"}),xne.map(ze=>s.jsx("button",{type:"button",onClick:()=>{MN=ze.value,L(ze.value)},className:`rounded px-2 py-0.5 text-xs font-medium transition-colors ${F===ze.value?r?"bg-amber-500/60 text-white":"bg-amber-500 text-white":r?"hover:bg-zinc-700 hover:text-zinc-200":"hover:bg-zinc-200"}`,title:ze.value==null?"自由拖拽比例":`固定比例 ${ze.label}`,children:ze.label},ze.label))]}),s.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[s.jsx("button",{type:"button",onClick:ge,className:`px-2.5 py-1 rounded-lg text-sm ${de}`,children:"取消"}),s.jsxs("button",{type:"button",onClick:te,disabled:u.length===0||w,className:`flex items-center gap-1.5 rounded-lg px-2.5 py-1 text-sm font-medium border disabled:opacity-50 disabled:pointer-events-none ${$e}`,children:[s.jsx(Eo,{size:14}),"确认拆切 (",u.length," 张)"]})]})]})]})})},bne=41595,O0=`http://127.0.0.1:${bne}`,yne=41596;function f4(){if(typeof window>"u")return!1;const e=window;return!!(e.__TAURI_INTERNALS__||e.__TAURI__)}function m4(){return f4()&&!0}const vb=`http://127.0.0.1:${yne}`,vne="http://127.0.0.1:41600/proxy";async function Hx(e,t,n){const r=await fetch(vne,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:e,method:t.toUpperCase(),headers:n?{"Content-Type":"application/json"}:{},body:n??void 0})}),i=await r.text();if(!r.ok)throw new Error(i||`Proxy failed: ${r.status}`);return i}let Gp=vb,F0=!1;function w9(){F0=!1,Gp=vb}async function _9(e){const t=`/api/eagle-proxy${e}`;if(m4()){const r=F0?O0:Gp;try{return await Hx(`${r}${e}`,"GET")}catch(i){if(!F0&&r===vb)return F0=!0,Gp=O0,await Hx(`${O0}${e}`,"GET");throw i}}const n=`${O0}${e}`;if(f4()){const{invoke:r}=await mn(async()=>{const{invoke:i}=await Promise.resolve().then(()=>tf);return{invoke:i}},void 0,import.meta.url);return await r("proxy_fetch",{url:n,method:"GET",headers:{},body:void 0,timeoutSecs:30})}try{return(await fetch(t,{method:"GET"})).text()}catch{return(await fetch(n,{method:"GET"})).text()}}async function wne(e,t){const n=`/api/eagle-proxy${e}`,r={"Content-Type":"application/json"};if(m4()){const a=F0?O0:Gp;try{return await Hx(`${a}${e}`,"POST",t)}catch(o){if(!F0&&a===vb)return F0=!0,Gp=O0,await Hx(`${O0}${e}`,"POST",t);throw o}}const i=`${O0}${e}`;if(f4()){const{invoke:a}=await mn(async()=>{const{invoke:o}=await Promise.resolve().then(()=>tf);return{invoke:o}},void 0,import.meta.url);return await a("proxy_fetch",{url:i,method:"POST",headers:r,body:t,timeoutSecs:120})}try{return(await fetch(n,{method:"POST",headers:r,body:t})).text()}catch{return(await fetch(i,{method:"POST",headers:r,body:t})).text()}}async function qw(e){const t=await _9(e),n=JSON.parse(t);if(n.status!=="success")throw new Error("Eagle API 返回失败");return n.data}async function Kw(){if(m4()){const e=async t=>{const n=await Hx(t,"GET");return JSON.parse(n).status==="success"};if(!F0)try{if(await e(`${vb}/api/folder/list`))return!0}catch{F0=!0,Gp=O0}try{if(await e(`${Gp}/api/folder/list`))return!0}catch{}return!1}try{const e=await _9("/api/folder/list");return JSON.parse(e).status==="success"}catch{return!1}}async function z9(){const e=await qw("/api/folder/list");return Array.isArray(e)?e:[]}function g4(e,t){var n;for(const r of e){if(r.id===t)return r;if((n=r.children)!=null&&n.length){const i=g4(r.children,t);if(i)return i}}}async function j$(e){const t=new URLSearchParams;e!=null&&e.folders&&t.set("folders",e.folders),(e==null?void 0:e.limit)!=null&&t.set("limit",String(e.limit)),(e==null?void 0:e.offset)!=null&&t.set("offset",String(e.offset)),e!=null&&e.orderBy&&t.set("orderBy",e.orderBy),e!=null&&e.keyword&&t.set("keyword",e.keyword);const n=t.toString(),r=await qw(`/api/item/list${n?`?${n}`:""}`);return Array.isArray(r)?r:[]}async function Gv(e){try{const t=await qw(`/api/item/thumbnail?id=${encodeURIComponent(e)}`);return typeof t=="string"?t:null}catch{return null}}async function $9(e){let t,n;try{const i=await qw(`/api/item/info?id=${encodeURIComponent(e)}`);if(i&&typeof i=="object"){const a=i.path??i.filePath??i.file_path;if(a&&typeof a=="string")return a;t=i.name,n=i.ext}}catch{}const r=await Gv(e);if(!r)return null;if(t!=null&&n!=null&&typeof t=="string"&&typeof n=="string"){const i=r.includes("\\")?"\\":"/",o=r.replace(/\\/g,"/").lastIndexOf("/"),c=`${o>=0?r.slice(0,o):r}${i}${t}.${n}`;if(c!==r)return c}return r}async function x4(e,t){const n={items:e};t&&(n.folderId=t);const r=JSON.stringify(n),i=await wne("/api/item/addFromURLs",r);if(JSON.parse(i).status!=="success")throw new Error("Eagle 添加失败")}const _ne=Object.freeze(Object.defineProperty({__proto__:null,addItemsToEagle:x4,checkEagleAvailable:Kw,findEagleFolderById:g4,getEagleFolders:z9,getEagleItemFilePath:$9,getEagleItemThumbnailPath:Gv,getEagleItems:j$,resetEaglePackagedFallback:w9},Symbol.toStringTag,{value:"Module"}));async function qv(e){if(!e.startsWith("blob:"))return{url:e,revoke:null};try{const t=await fetch(e);if(t.ok){const n=await t.blob(),r=URL.createObjectURL(n);return{url:r,revoke:()=>{try{URL.revokeObjectURL(r)}catch{}}}}}catch{}return{url:e,revoke:null}}function fm(e,t,n){const r=(n==null?void 0:n.preserveOriginal)??!0,i=(n==null?void 0:n.maxSide)??1080,a=(n==null?void 0:n.quality)??.95;return new Promise((o,l)=>{const c=document.createElement("video");c.muted=!0,c.playsInline=!0,c.crossOrigin=e.startsWith("http")?"anonymous":null,c.preload="auto",c.onloadedmetadata=()=>{const u=Number.isFinite(c.duration)?c.duration:0,h=u>0?Math.max(0,Math.min(t,u-.001)):Math.max(0,t);c.currentTime=h},c.onseeked=()=>{const u=document.createElement("canvas"),d=c.videoWidth||1,h=c.videoHeight||1;if(r)u.width=d,u.height=h;else{const f=Math.max(d,h),b=Math.min(1,i/f);u.width=Math.max(1,Math.round(d*b)),u.height=Math.max(1,Math.round(h*b))}const p=u.getContext("2d");if(!p){l(new Error("Canvas context failed"));return}p.drawImage(c,0,0,u.width,u.height),o(u.toDataURL("image/jpeg",a)),c.remove()},c.onerror=()=>{var u;l(new Error(((u=c.error)==null?void 0:u.message)||"Video element error")),c.remove()},c.src=e})}const TN=["nano-banana","nano-banana-2","gemini-3.1-flash-image-preview","gpt-image","gpt-image-1.5"],zne=[1.5,2,3],$ne=1,Sne=5,RN=e=>Math.max($ne,Math.min(Sne,Math.round(e*10)/10)),S9=({isOpen:e,onClose:t,imageUrl:n,isDark:r,runExpandImage:i,imageConfigs:a,showJimengModels:o=!0,onSuccess:l,onStartGenerate:c,onError:u})=>{var Ee,Ce;const[d,h]=_.useState(1.5),[p,f]=_.useState(1.5),[b,g]=_.useState(""),[y,w]=_.useState(""),[v,m]=_.useState("Auto"),[z,C]=_.useState("2K"),[E,I]=_.useState(null),[R,A]=_.useState(!1),[O,F]=_.useState(null),[L,X]=_.useState(null),[T,q]=_.useState(null),[H,J]=_.useState(null),Z=_.useRef(null),B=_.useRef(null),V=_.useRef(null),N=_.useRef(null),j=_.useRef(!1);_.useEffect(()=>{if(!e){I(null),q(null),J(null),X(null);return}if(!n){q(null),J(null),X(null);return}let xe=!1;return(async()=>{let Ne=n;if(Ln.isContentRef(Ne))try{await Ln.init();const ve=Ln.extractId(Ne),ke=await Ln.get(ve);if(xe||!ke)return;Ne=ke}catch(ve){console.error("[ExpandModal] content_ref 解析失败:",ve);return}xe||q(Ne)})(),()=>{xe=!0}},[e,n]),_.useEffect(()=>{if(!e||!n){J(null);return}let xe=!1;return(async()=>{try{if(Ln.isContentRef(n)){await Ln.init();const Ne=Ln.extractId(n),{thumbnailStore:ve}=await mn(async()=>{const{thumbnailStore:Ie}=await Promise.resolve().then(()=>vP);return{thumbnailStore:Ie}},void 0,import.meta.url),ke=await ve.getPreview(Ne);if(!xe&&ke){J(ke);return}}}catch{}xe||J(T??n)})(),()=>{xe=!0}},[e,n,T]),_.useEffect(()=>{if(!e||!T){X(null);return}const xe=new Image;xe.crossOrigin="anonymous",xe.onload=()=>X({w:xe.naturalWidth,h:xe.naturalHeight}),xe.onerror=()=>X(null),xe.src=T},[e,T]);const k=_.useMemo(()=>{const xe=a.filter(Ie=>Ie.type==="Image"),Ne=xe.filter(Ie=>TN.includes(Ie.id)),ve=TN.map(Ie=>Ne.find(Pe=>Pe.id===Ie)).filter(Boolean),ke=xe.filter(Ie=>Ie.id.includes("jimeng"));return o?[...ve,...ke]:ve},[a,o]),W=y||((Ee=k[0])==null?void 0:Ee.id),M=a.find(xe=>xe.id===W)||k[0]||a[0],Y=(M==null?void 0:M.modelName)||(M==null?void 0:M.id)||"",se=z5(Y),ie=eu(Y);_.useEffect(()=>{Y&&(m(xe=>se.includes(xe)?xe:se[0]||"Auto"),C(xe=>ie.includes(xe)?xe:ie[0]||"2K"))},[Y]),_.useEffect(()=>{var xe;!y||k.some(Ne=>Ne.id===y)||w(((xe=k[0])==null?void 0:xe.id)||"")},[y,k]);const oe=L?pG(L.w,L.h,"原比例",1.5,d,p):null,re=260,ee=380,pe=420,we=300,Q=L&&oe?L.w/L.h>ee/re?ee:re*L.w/L.h:200,me=L&&oe?L.w/L.h>ee/re?ee*L.h/L.w:re:200,ue=oe?Q*d:0,U=oe?me*p:0,G=ue>0&&U>0?Math.min(pe/ue,we/U,1):1,te=_.useCallback(()=>{if(V.current==null)return;const xe=V.current;V.current=null,h(xe.scaleW),f(xe.scaleH)},[]),ge=_.useCallback(()=>{N.current==null&&(N.current=requestAnimationFrame(()=>{N.current=null,te()}))},[te]),ne=_.useCallback((xe,Ne)=>{if(xe.preventDefault(),xe.stopPropagation(),!Ne||!Z.current||!L||!oe)return;j.current=!0;const ve=Z.current.getBoundingClientRect();B.current={handle:Ne,startX:xe.clientX,startY:xe.clientY,startW:d,startH:p,startRectW:ve.width,startRectH:ve.height,origDisplayW:Q,origDisplayH:me};const ke=Pe=>{const Te=B.current;if(!Te)return;const Be=Te.origDisplayW*Te.startW,He=Te.origDisplayH*Te.startH,Je=Be>0?Te.startRectW/Be:1,Me=He>0?Te.startRectH/He:1,Re=Math.min(Je,Me,1),Ve=Re>0?(Pe.clientX-Te.startX)/Re:0,Ze=Re>0?(Pe.clientY-Te.startY)/Re:0;let je=Te.startW,Le=Te.startH;(Ne==="right"||Ne==="left")&&(je=RN(Ne==="right"?Te.startW+Ve/Te.origDisplayW:Te.startW-Ve/Te.origDisplayW)),(Ne==="bottom"||Ne==="top")&&(Le=RN(Ne==="bottom"?Te.startH+Ze/Te.origDisplayH:Te.startH-Ze/Te.origDisplayH)),V.current={scaleW:je,scaleH:Le},ge()},Ie=()=>{B.current=null,window.removeEventListener("mousemove",ke),window.removeEventListener("mouseup",Ie),te(),setTimeout(()=>{j.current=!1},0)};window.addEventListener("mousemove",ke),window.addEventListener("mouseup",Ie)},[d,p,oe,L,ge,te]),le=_.useCallback(xe=>{h(xe),f(xe)},[]),fe=_.useCallback(()=>{var Pe;const xe=y||((Pe=k[0])==null?void 0:Pe.id),Ne=a.find(Te=>Te.id===xe)||k[0];if(!Ne){F("请先配置图片生成模型(设置 → API 配置 → 图片)");return}F(null),A(!0);const ve=Ne.modelName||Ne.id,ke=Ne.provider||Ne.modelName||Ne.id;c==null||c(ve,ke),t();const Ie=b.trim()||"基于原图自然扩展画面,保持风格一致";i(T??n,v,Ie,Ne,1.5,d,p,z).then(Te=>{Te&&Te.length>0?l(Te,ve,ke):u==null||u(new Error("扩图未返回结果"))}).catch(Te=>{u==null||u(Te instanceof Error?Te:new Error("扩图失败"))})},[T,n,b,y,a,k,i,l,t,c,u,d,p,v,z]);if(!e)return null;const be=r?"bg-[#09090b] border-zinc-800 text-zinc-200":"bg-white border-zinc-200 text-zinc-800",de=r?"border-zinc-700":"border-zinc-200",$e=r?"hover:bg-zinc-800":"hover:bg-zinc-100",ze=r?"bg-white/15 border border-white/40 text-white hover:bg-white/25":"bg-amber-500 border-transparent text-white hover:bg-amber-600",_e={backgroundImage:"linear-gradient(45deg, #404040 25%, transparent 25%), linear-gradient(-45deg, #404040 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #404040 75%), linear-gradient(-45deg, transparent 75%, #404040 75%)",backgroundSize:"10px 10px",backgroundPosition:"0 0, 0 5px, 5px -5px, -5px 0",backgroundColor:r?"#262626":"#e5e5e5"};return s.jsx("div",{className:"fixed inset-0 z-[100] flex items-center justify-center p-4 bg-black/60 overflow-y-auto minimal-scrollbar",onClick:()=>{j.current||t()},children:s.jsxs("div",{className:`rounded-xl shadow-2xl w-full max-w-[540px] max-h-[90vh] overflow-hidden flex flex-col border shrink-0 ${be}`,onClick:xe=>xe.stopPropagation(),children:[s.jsx("div",{className:`flex items-center justify-end px-3 py-2 border-b shrink-0 ${de}`,children:s.jsx("button",{type:"button",onClick:t,className:`p-1 rounded ${r?"text-zinc-400 hover:text-white":"text-zinc-500 hover:text-zinc-900"}`,children:s.jsx(Qr,{size:20})})}),s.jsxs("div",{className:"p-3 space-y-3 overflow-y-auto min-h-0 flex-1 minimal-scrollbar",children:[s.jsxs("div",{children:[s.jsx("label",{className:`block text-xs font-medium mb-1 ${r?"text-zinc-400":"text-zinc-600"}`,children:"扩展预览"}),s.jsx("div",{className:`relative rounded-lg overflow-visible border ${de}`,style:{maxHeight:320},children:s.jsx("div",{className:"w-full relative flex items-center justify-center min-h-[220px] overflow-visible",style:{maxHeight:300},children:oe?s.jsx(s.Fragment,{children:s.jsx("div",{className:"flex items-center justify-center flex-1",style:{maxWidth:pe,maxHeight:we},children:s.jsxs("div",{ref:Z,className:"relative shrink-0 select-none transition-[width,height] duration-200 ease-out origin-center",style:{width:ue,height:U,transform:`scale(${G})`},children:[s.jsx("div",{className:"absolute inset-0 rounded-sm",style:_e}),s.jsx("div",{className:"absolute inset-0 rounded-sm border-2 border-dashed border-white/90 pointer-events-none z-[1]",style:{boxSizing:"border-box"}}),s.jsx("div",{className:"absolute left-1/2 top-1/2 pointer-events-none z-[5] rounded shadow-lg border-2 border-white/20 overflow-hidden",style:{width:Q,height:me,transform:"translate(-50%, -50%)"},children:s.jsx(w$,{src:T??H??"",displayWidth:Q,displayHeight:me,zoom:1,isDark:r,alt:"扩图预览",objectFit:"contain",quality:"high",enableThumbnails:!0,shouldLoadContent:!0,nodeId:Ln.isContentRef(n)?Ln.extractId(n):void 0})}),["top","right","bottom","left"].map(xe=>s.jsx("div",{className:`absolute z-10 rounded-full cursor-grab active:cursor-grabbing shadow-md border-2 hover:scale-110 transition-transform ${r?"bg-white/90 border-white/60 hover:bg-white":"bg-white border-amber-400 hover:bg-amber-400"}`,style:xe==="top"?{left:"50%",top:-6,transform:"translateX(-50%)",width:14,height:14}:xe==="bottom"?{left:"50%",bottom:-6,transform:"translateX(-50%)",width:14,height:14}:xe==="left"?{left:-6,top:"50%",transform:"translateY(-50%)",width:14,height:14}:{right:-6,top:"50%",transform:"translateY(-50%)",width:14,height:14},onMouseDown:Ne=>ne(Ne,xe)},xe))]})})}):s.jsx("span",{className:`text-sm ${r?"text-zinc-500":"text-zinc-400"}`,children:"加载预览中…"})})}),s.jsxs("div",{className:"flex flex-wrap items-center gap-2 mt-2",children:[s.jsx("span",{className:"text-[10px] font-medium text-zinc-500",children:"倍率:"}),zne.map(xe=>s.jsxs("button",{type:"button",onClick:()=>le(xe),className:`px-2.5 py-1 rounded-lg text-xs font-medium border transition-all duration-200 ${d===xe&&p===xe?r?"bg-white/15 border-white/40 text-white":"bg-amber-500 border-amber-500 text-white":`${de} ${$e}`}`,children:[xe,"x"]},xe))]}),s.jsxs("div",{className:"flex flex-wrap items-center gap-2 mt-2",children:[s.jsx("span",{className:"text-[10px] font-medium text-zinc-500",children:"比例:"}),s.jsxs("div",{className:"relative",children:[s.jsxs("button",{type:"button",onClick:()=>I(E==="ratio"?null:"ratio"),className:`flex items-center gap-1 px-2 py-1.5 rounded-lg text-xs border ${de} ${r?"bg-zinc-800/50 hover:bg-zinc-800 text-zinc-300":"bg-zinc-100 hover:bg-zinc-200 text-zinc-700"}`,children:[v,s.jsx(Ei,{size:14,className:"opacity-70"})]}),E==="ratio"&&s.jsx("div",{className:`absolute left-0 top-full mt-1 w-24 rounded-lg shadow-xl p-1 z-[60] border ${r?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:xe=>xe.stopPropagation(),children:se.map(xe=>s.jsx("button",{type:"button",onClick:()=>{m(xe),I(null)},className:`w-full px-2 py-1.5 rounded text-left text-xs transition-colors ${r?"hover:bg-zinc-800 text-zinc-300":"hover:bg-zinc-100 text-zinc-700"} ${v===xe?r?"bg-zinc-800":"bg-zinc-100":""}`,children:xe},xe))})]}),ie.length>0&&s.jsxs(s.Fragment,{children:[s.jsx("span",{className:"text-[10px] font-medium text-zinc-500",children:"分辨率:"}),s.jsxs("div",{className:"relative",children:[s.jsxs("button",{type:"button",onClick:()=>I(E==="resolution"?null:"resolution"),className:`flex items-center gap-1 px-2 py-1.5 rounded-lg text-xs border ${de} ${r?"bg-zinc-800/50 hover:bg-zinc-800 text-zinc-300":"bg-zinc-100 hover:bg-zinc-200 text-zinc-700"}`,children:[z,s.jsx(Ei,{size:14,className:"opacity-70"})]}),E==="resolution"&&s.jsx("div",{className:`absolute left-0 top-full mt-1 w-20 rounded-lg shadow-xl p-1 z-[60] border ${r?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:xe=>xe.stopPropagation(),children:ie.map(xe=>s.jsx("button",{type:"button",onClick:()=>{C(xe),I(null)},className:`w-full px-2 py-1.5 rounded text-left text-xs transition-colors ${r?"hover:bg-zinc-800 text-zinc-300":"hover:bg-zinc-100 text-zinc-700"} ${z===xe?r?"bg-zinc-800":"bg-zinc-100":""}`,children:xe},xe))})]})]})]})]}),s.jsxs("div",{children:[s.jsx("label",{className:`block text-xs font-medium mb-1 ${r?"text-zinc-400":"text-zinc-600"}`,children:"扩图描述(可选)"}),s.jsx("textarea",{value:b,onChange:xe=>g(xe.target.value),placeholder:"不填将使用:基于原图自然扩展画面,保持风格一致",rows:2,className:`w-full rounded-lg border px-2.5 py-1.5 text-sm resize-none ${de} ${r?"bg-zinc-900 text-zinc-200 placeholder:text-zinc-500":"bg-white text-zinc-800 placeholder:text-zinc-400"}`})]}),k.length>0&&s.jsxs("div",{children:[s.jsx("label",{className:`block text-xs font-medium mb-1 ${r?"text-zinc-400":"text-zinc-600"}`,children:"使用模型"}),s.jsx("select",{value:y||((Ce=k[0])==null?void 0:Ce.id),onChange:xe=>w(xe.target.value),className:`w-full rounded-lg border px-2.5 py-1.5 text-sm ${de} ${r?"bg-zinc-900 text-zinc-200":"bg-white text-zinc-800"}`,children:k.map(xe=>{var Ne,ve,ke;return s.jsxs("option",{value:xe.id,children:[xe.provider,((Ne=xe.provider)!=null&&Ne.startsWith("Seedream")||(ve=xe.provider)!=null&&ve.startsWith("Seedance"))&&!((ke=xe.provider)!=null&&ke.includes("API"))?" Official":""]},xe.id)})})]}),O&&s.jsx("p",{className:"text-xs text-red-500",children:O})]}),s.jsxs("div",{className:`flex items-center justify-end gap-2 px-3 py-2 border-t shrink-0 ${de}`,children:[s.jsx("button",{type:"button",onClick:t,className:`px-2.5 py-1 rounded-lg text-sm ${$e}`,children:"取消"}),s.jsx("button",{type:"button",onClick:fe,disabled:R||k.length===0,className:`flex items-center gap-1.5 rounded-lg px-2.5 py-1 text-sm font-medium border disabled:opacity-50 disabled:pointer-events-none ${ze}`,children:R?"生成中…":s.jsxs(s.Fragment,{children:[s.jsx(Eo,{size:14})," 生成"]})})]})]})})};function cp(e){var n;let t=(n=e==null?void 0:e.nodeName)==null?void 0:n.trim();return(!t||t==="未命名节点")&&(t=(e!=null&&e.prompt&&typeof e.prompt=="string"?e.prompt:"").replace(/\.[^/.]+$/,"").trim()),t||"图片"}const PN=ml||Ih,jne=({previewContextMenu:e,setPreviewContextMenu:t,setCroppingNodeId:n,isDark:r,nodes:i,view:a,selectedNodeIds:o,setChatFiles:l,setIsChatOpen:c,setNodes:u,setConnections:d,generateId:h,splitImageToShots:p,runExpandImage:f,imageConfigs:b=[],showJimengModels:g=!0,history:y=[],setHistory:w,setLightboxItem:v,setLightboxOpen:m,toastError:z,toastSuccess:C})=>{var de,$e,ze;const[E,I]=_.useState(!1),[R,A]=_.useState(null),[O,F]=_.useState(null),L=_.useRef(null),X=_.useRef(null),T=_.useRef(null),q=async _e=>{if(_e.startsWith("data:"))return _e;const Ee=await fetch(_e);if(!Ee.ok)throw new Error(`无法加载: ${Ee.status}`);const Ce=await Ee.blob();return new Promise((xe,Ne)=>{const ve=new FileReader;ve.onload=()=>xe(ve.result),ve.onerror=Ne,ve.readAsDataURL(Ce)})},H=()=>{const _e=e.item;if(!_e)return;const Ee=_e.sourceNode,Ce=Ee?Ee._previewMjAssetIds:void 0,xe=Ee?Ee._contentAssetId:void 0,Ne=_e.selectedIndices??[],ve=_e.selectedUrls||[_e.url],ke=Ce!=null&&Ce.length?Ce[Ne[0]??0]:xe;if(ke){const Pe=y.find(Te=>{const Be=Te._assetId,He=Te._mjAssetIds;return!!(Be===ke||He!=null&&He.includes(ke))});if(Pe)return(Pe.prompt||Pe.positivePrompt||"").trim()||void 0}const Ie=ve[0];if(Ie){const Pe=y.find(Te=>{var Be;return!!(Te.url===Ie||(Be=Te.mjImages)!=null&&Be.some(He=>He===Ie))});if(Pe)return(Pe.prompt||Pe.positivePrompt||"").trim()||void 0}},J=async()=>{const _e=e.item;if(_e!=null&&_e.url){if(!C||!z){z==null||z("未配置 Toast");return}try{if(!await Kw()){z("请先启动 Eagle 应用"),Y();return}const Ce=H(),xe=_e.sourceNode,Ne=(xe==null?void 0:xe.settings)||{},ve=Ne._stitchedFullUrl,ke=Ne._stitchedPreviewUrl;let Ie=_e.selectedUrls||[_e.url];ve&&ke&&Ie.length===1&&Ie[0]===ke&&(Ie=[ve]);const Pe=xe?xe._previewMjAssetIds:void 0,Te=xe?xe._contentAssetId:void 0,Be=_e.selectedIndices??[],He=[];for(let Ve=0;Ve{const{localCacheManager:qe}=await Promise.resolve().then(()=>Xa);return{localCacheManager:qe}},void 0,import.meta.url);if(Xe.isAvailable()&&Xe.hasAsset(je)){const qe=await Xe.readAsset(je);qe!=null&&qe.blob&&(Le=URL.createObjectURL(qe.blob))}if(Le===Ze){const{assetStore:qe}=await mn(async()=>{const{assetStore:Ye}=await Promise.resolve().then(()=>_s);return{assetStore:Ye}},void 0,import.meta.url),tt=await qe.getAssetBlob(je);tt&&(Le=URL.createObjectURL(tt))}}catch{}if(Le===Ze&&!Ze.startsWith("data:"))try{const Xe=await fetch(Ze);if(Xe.ok){const qe=await Xe.blob();Le=URL.createObjectURL(qe)}}catch{}He.push(Le)}if(!He.length){z("无法解析素材地址"),Y();return}const Je=(Ce||_e.prompt||"").trim()||void 0,Me=_e.type==="video"?"mp4":_e.type==="audio"?"mp3":"png",Re=await Promise.all(He.map(async(Ve,Ze)=>{let je=Ve;(Ve.startsWith("blob:")||Ve.startsWith("/")&&!Ve.startsWith("http"))&&(je=await q(Ve));const Le=`Preview-${Date.now()}${He.length>1?`-${Ze+1}`:""}.${Me}`;return{url:je,name:Le,annotation:Je}}));await x4(Re),C(`已发送 ${Re.length} 个素材到 Eagle`)}catch(Ee){z(Ee instanceof Error?Ee.message:"发送到 Eagle 失败")}Y()}},Z=async _e=>{let Ee=_e;if(Ln.isContentRef(Ee))try{await Ln.init();const Ce=Ln.extractId(Ee),xe=await Ln.get(Ce);xe&&(Ee=xe)}catch(Ce){console.warn("[PreviewContextMenu] content_ref 解析失败(视频提取帧将尝试用原始URL):",Ce)}return Ee},B=async()=>{const _e=e.item,Ee=_e==null?void 0:_e.sourceNode;if(!(_e!=null&&_e.url)||_e.type!=="video"||!Ee){Y();return}Y();let Ce=null;try{const xe=await Z(_e.url),{url:Ne,revoke:ve}=await qv(xe);Ce=ve;const ke=document.createElement("video");ke.muted=!0,ke.playsInline=!0,ke.crossOrigin=Ne.startsWith("http")?"anonymous":null,await new Promise((Le,Xe)=>{ke.onloadedmetadata=()=>Le(),ke.onerror=()=>Xe(ke.error),ke.src=Ne});const Ie=ke.duration||0;ke.remove();const Pe=Math.max(0,Ie-.05),[Te,Be]=await Promise.all([fm(Ne,0,{preserveOriginal:!0,quality:.95}),fm(Ne,Pe,{preserveOriginal:!0,quality:.95})]),He=Ee.width??300,Je=Ee.height??200,Me=24,Re=h(),Ve=h(),Ze=Ms(Re,"input-image",Ee.x+He+Me,Ee.y,"首帧",{mediaType:"image"},i||[]),je=Ms(Ve,"input-image",Ee.x+He+Me*2+He,Ee.y,"尾帧",{mediaType:"image"},i||[]);u(Le=>[...Le,{...Ze,content:Te,width:He,height:Je},{...je,content:Be,width:He,height:Je}])}catch(xe){console.error("[PreviewContextMenu] 提取视频首尾帧失败:",xe),z==null||z("提取视频首尾帧失败")}finally{Ce==null||Ce()}},V=async()=>{const _e=e.item,Ee=_e==null?void 0:_e.sourceNode;if(!(_e!=null&&_e.url)||_e.type!=="video"||!Ee){Y();return}Y();let Ce=null;try{const xe=await Z(_e.url),{url:Ne,revoke:ve}=await qv(xe);Ce=ve;const ke=Number.isFinite(_e.videoCurrentTime)?_e.videoCurrentTime:0,Ie=await fm(Ne,ke,{preserveOriginal:!0,quality:.95}),Pe=Ee.width??300,Te=Ee.height??200,Be=24,He=h(),Je=Ms(He,"input-image",Ee.x+Pe+Be,Ee.y,"当前帧",{mediaType:"image"},i||[]);u(Me=>[...Me,{...Je,content:Ie,width:Pe,height:Te}])}catch(xe){console.error("[PreviewContextMenu] 提取视频当前帧失败:",xe),z==null||z("提取视频当前帧失败")}finally{Ce==null||Ce()}},N=()=>{const _e=e.item;_e!=null&&_e.url&&(A({imageUrl:_e.url,sourceNode:_e.sourceNode}),Y())},j=async _e=>{var Ce;if(!(R!=null&&R.imageUrl)||_e.length===0)return;const Ee=(Ce=R.sourceNode)==null?void 0:Ce.id;Ee&&n&&Ni.flushSync(()=>n(Ee));try{const xe=await N5(R.imageUrl,_e),Ne=await Promise.all(xe.map(Re=>Ln.storeImageUrlAsRef(Re.url))),ve=R.sourceNode,ke=ve?ve.x+ve.width+20:a.x+100,Ie=ve?ve.y:a.y+100,Pe=xe.length,Te=Math.ceil(Math.sqrt(Pe)),Be=Pe<=4?260:Pe<=9?240:Pe<=16?200:160,He=Pe<=4?20:Pe<=9?60:Pe<=16?50:40,Je=cp(ve),Me=xe.map((Re,Ve)=>({id:h(),type:"input-image",nodeName:`${Je}_${Ve+1}`,x:ke+Ve%Te*(Be+He),y:Ie+Math.floor(Ve/Te)*(Be+He),width:Be,height:Be,content:Ne[Ve],prompt:"",settings:{dimensions:{w:Re.width,h:Re.height}}}));u(Re=>[...Re,...Me]),A(null)}catch(xe){console.error("[PreviewContextMenu] 自由拆切失败:",xe),A(null)}finally{n==null||n(null)}},k=()=>{const _e=e.item;_e!=null&&_e.url&&f&&(F({imageUrl:_e.url,sourceNode:_e.sourceNode}),Y())},W=(_e,Ee,Ce)=>{const xe=L.current;L.current=null;const Ne=(O==null?void 0:O.sourceNode)??(xe==null?void 0:xe.sourceNode),ve=xe==null?void 0:xe.previewNodeId,ke=_e==null?void 0:_e[0];if(!ke)return;const Pe={id:h(),type:"image",url:ke,prompt:"智能扩图",time:new Date().toLocaleTimeString(),status:"completed",progress:100,modelName:Ce||"智能扩图",mjImages:_e.length>1?_e:void 0};w&&w(He=>[Pe,...He]);const Te={expandModelId:Ee,expandModelName:Ce,model:Ce};let Be;if(ve)Be=ve,u(He=>He.map(Je=>Je.id===ve?{...Je,content:ke,previewType:"image",previewMjImages:_e.length>1?_e:void 0,nodeName:Je.nodeName||"智能扩图",settings:{...Je.settings||{},...Te},_expandPending:void 0,_expandTaskStartTime:void 0}:Je));else{const He=Ne?Ne.x+Ne.width+80:a.x+100,Je=Ne?Ne.y:a.y+100,Me=h();Be=Me;const Re=Ms(Me,"preview",He,Je,void 0,void 0,i);Re.content=ke,Re.previewType="image",Re.nodeName="智能扩图",Re.settings={...Re.settings||{},...Te},_e.length>1&&(Re.previewMjImages=_e),u(Ve=>[...Ve,Re]),d&&Ne&&d(Ve=>[...Ve,{id:h(),from:Ne.id,to:Me}])}F(null),(async()=>{try{const He=await Ln.storeImageUrlAsRef(ke);u(Je=>Je.map(Me=>Me.id===Be?{...Me,content:He}:Me))}catch(He){console.warn("[PreviewContextMenu] 扩图结果写入 contentStore 失败,预览将显示原图:",He)}})()},M=(_e,Ee)=>{if(O){const Ce=O.sourceNode,xe=Ce?Ce.x+Ce.width+80:a.x+100,Ne=Ce?Ce.y:a.y+100,ve=h(),ke=Ms(ve,"preview",xe,Ne,void 0,void 0,i);ke.content="",ke.previewType="image",ke.nodeName="智能扩图",ke.settings={...ke.settings||{},expandModelId:_e,expandModelName:Ee},ke._expandPending=!0,ke._expandTaskStartTime=Date.now(),u(Ie=>[...Ie,ke]),d&&Ce&&d(Ie=>[...Ie,{id:h(),from:Ce.id,to:ve}]),L.current={sourceNode:Ce,imageUrl:O.imageUrl,previewNodeId:ve},F(null)}},Y=()=>{t({visible:!1,x:0,y:0,item:null}),I(!1),X.current&&(clearTimeout(X.current),X.current=null),T.current&&(clearTimeout(T.current),T.current=null)},se=()=>{X.current=setTimeout(()=>{Y()},300)},ie=()=>{T.current=setTimeout(()=>{I(!1)},200)},oe=()=>{X.current&&(clearTimeout(X.current),X.current=null)},re=()=>{T.current&&(clearTimeout(T.current),T.current=null),X.current&&(clearTimeout(X.current),X.current=null)};_.useEffect(()=>()=>{X.current&&clearTimeout(X.current),T.current&&clearTimeout(T.current)},[]);const ee=async()=>{const _e=e.item;if(_e!=null&&_e.url){const Ee=_e.type!=="video",Ce=_e.type==="video",xe=Ee?"png":"mp4",Ne=Ee?"image/png":"video/mp4";let ve=_e.url;if(Ln.isContentRef(ve))try{await Ln.init();const Ie=Ln.extractId(ve),Pe=await Ln.get(Ie);Pe&&(ve=Pe)}catch(Ie){console.error("[PreviewContextMenu] content_ref 解析失败:",Ie)}if(Ee&&!ve.startsWith("data:"))try{if(ve.startsWith("blob:")){const Pe=await(await fetch(ve)).blob();ve=await new Promise((Te,Be)=>{const He=new FileReader;He.onload=()=>Te(He.result),He.onerror=Be,He.readAsDataURL(Pe)})}else{const Ie=new Image;Ie.crossOrigin="anonymous",await new Promise((Be,He)=>{Ie.onload=()=>Be(),Ie.onerror=He,Ie.src=ve});const Pe=document.createElement("canvas");Pe.width=Ie.naturalWidth,Pe.height=Ie.naturalHeight;const Te=Pe.getContext("2d");Te&&(Te.drawImage(Ie,0,0),ve=Pe.toDataURL("image/png"))}}catch(Ie){console.error("[PreviewContextMenu] 图片转换失败:",Ie)}const ke={name:`Preview-${Date.now()}.${xe}`,type:Ne,content:ve,isImage:Ee,isVideo:Ce,isAudio:!1,fileExt:xe};l(Ie=>[...Ie,ke]),c(!0)}Y()},pe=async()=>{const _e=e.item;if(!(_e!=null&&_e.url)||_e.type==="video"){Y();return}try{const{url:Ee,width:Ce,height:xe}=await kw(_e.url),Ne=_e.sourceNode,ve=Ne?Ne.x+Ne.width+20:a.x+100,ke=Ne?Ne.y:a.y+100,Ie=Ce/xe,Pe=260,Te=80;let Be=Ie>=1?Math.min(Pe,Ce):Math.min(Pe*Ie,Ce),He=Ie>=1?Math.min(Pe/Ie,xe):Math.min(Pe,xe);if(Be[...Me,Je])}catch(Ee){console.error("[PreviewContextMenu] 创建缩图失败:",Ee)}Y()},we=async()=>{const _e=e.item,Ee=_e==null?void 0:_e.sourceNode,Ce=(Ee==null?void 0:Ee.settings)||{},xe=Ce._stitchedFullUrl,Ne=Ce._stitchedPreviewUrl;if(!!Ce._isStoryboardMosaic&&typeof xe=="string"&&xe&&Ee){const Xe=Ee?Ee.x+Ee.width+20:a.x+100,qe=Ee?Ee.y:a.y+100;let tt=xe;try{const ct=Ln.extractId(xe),{localCacheManager:pt}=await mn(async()=>{const{localCacheManager:ht}=await Promise.resolve().then(()=>Xa);return{localCacheManager:ht}},void 0,import.meta.url);if(pt.isAvailable()&&pt.hasAsset(ct)){const ht=await pt.readAsset(ct);if(ht!=null&&ht.blob){const wt=URL.createObjectURL(ht.blob);try{tt=await Ln.storeImageUrlAsRef(wt)}finally{try{URL.revokeObjectURL(wt)}catch{}}}}}catch(ct){console.warn("[PreviewContextMenu] 从缓存目录读取拼接原图失败,使用 content_ref:",ct)}const Ye={id:h(),type:"input-image",x:Xe,y:qe,width:320,height:280,content:tt,prompt:"",settings:{mediaType:"image",_mosaicRefFull:xe,_mosaicRefPreview:Ne}};u(ct=>[...ct,Ye]),Y();return}if(!(_e!=null&&_e.url)){Y();return}let ke=_e.selectedUrls||[_e.url];const Ie=ke.length;let Pe=1;Ie===4?Pe=2:Ie===9?Pe=3:Ie>1&&(Pe=Math.ceil(Math.sqrt(Ie)));const Te=Ee?Ee.x+Ee.width+20:a.x+100,Be=Ee?Ee.y:a.y+100,He=320,Je=280,Me=100,Re=100,Ve=Ee?Ee._previewMjAssetIds:void 0,Ze=Ee?Ee._contentAssetId:void 0,je=_e.selectedIndices??(ke.length===1&&Ze?[0]:[]),Le=[];for(let Xe=0;Xe{const{localCacheManager:ht}=await Promise.resolve().then(()=>Xa);return{localCacheManager:ht}},void 0,import.meta.url);if(pt.isAvailable()&&pt.hasAsset(ct)){const ht=await pt.readAsset(ct);ht&&(tt=URL.createObjectURL(ht.blob),Ye=ht.mimeType.startsWith("video/")?"video":ht.mimeType.startsWith("audio/")?"audio":"image")}if(tt===qe){const{assetStore:ht}=await mn(async()=>{const{assetStore:$t}=await Promise.resolve().then(()=>_s);return{assetStore:$t}},void 0,import.meta.url),wt=await ht.getAssetBlob(ct);wt&&(tt=URL.createObjectURL(wt),wt.type.startsWith("video/")?Ye="video":wt.type.startsWith("audio/")&&(Ye="audio"))}}if(tt===qe){const pt=await fetch(qe);if(pt.ok){const ht=await pt.blob();tt=URL.createObjectURL(ht),ht.type.startsWith("video/")?Ye="video":ht.type.startsWith("audio/")&&(Ye="audio")}}}catch(pt){console.warn("[PreviewContextMenu] 获取原图失败:",pt)}if(Ye==="image"&&Ee&&"previewType"in Ee){const pt=Ee.previewType;pt==="video"?Ye="video":pt==="audio"&&(Ye="audio")}console.log("[PreviewContextMenu] Creating node with mediaType:",Ye),Le.push({id:h(),type:"input-image",x:Te+Xe%Pe*(He+Me),y:Be+Math.floor(Xe/Pe)*(Je+Re),width:He,height:Je,content:tt,prompt:"",settings:{mediaType:Ye,_blobUrl:tt}})}u(Xe=>[...Xe,...Le]),Y()},Q=async()=>{var xe;const _e=e.item;if(!(_e!=null&&_e.url)){Y();return}const Ee=(xe=_e.sourceNode)==null?void 0:xe.id;n&&Ee&&Ni.flushSync(()=>n(Ee));const Ce=o.size===9&&Array.from(o).every(Ne=>{const ve=i.find(ke=>ke.id===Ne);return ve&&ve.type==="input-image"});try{const Ne=await fo(_e.url,3,3);if(Ne.length!==9){alert("切割失败:未能生成9张图片");return}const ve=await Promise.all(Ne.map(Ie=>Ln.storeImageUrlAsRef(Ie.url))),ke=Ne;if(Ce){const Ie=Array.from(o);u(Pe=>Pe.map(Te=>{const Be=Ie.indexOf(Te.id);return Be!==-1&&Be=1?Math.min(Re,Je.width):Math.min(Re*Me,Je.width),je=Me>=1?Math.min(Re/Me,Je.height):Math.min(Re,Je.height);if(Ze{const pt=Math.floor(ct/Be),ht=ct%Be;return{id:h(),type:"input-image",nodeName:`${qe}_${ct+1}`,x:Pe+ht*Le,y:Te+pt*Xe,width:Ze,height:je,content:ve[ct],prompt:"",settings:{hasCustomSize:!0,imageSize:`${Ye.width}×${Ye.height}`},dimensions:{w:Ye.width,h:Ye.height}}});u(Ye=>[...Ye,...tt])}}catch(Ne){alert("切割失败: "+(Ne instanceof Error?Ne.message:"未知错误"))}finally{n==null||n(null)}Y()},me=async()=>{var Ee;const _e=e.item;if(!(_e!=null&&_e.url)){Y();return}n&&((Ee=_e.sourceNode)!=null&&Ee.id)&&Ni.flushSync(()=>n(_e.sourceNode.id));try{const Ce=await xm(_e.url);if(Ce.length!==4){alert("切割失败:未能生成4张图片");return}const xe=_e.sourceNode,Ne=xe?xe.x+xe.width+24:a.x+100,ve=xe?xe.y:a.y+100,ke=await ue(Ce,2,Ne,ve,cp(xe));u(Ie=>[...Ie,...ke])}catch(Ce){alert("切割失败: "+(Ce instanceof Error?Ce.message:"未知错误"))}finally{n==null||n(null)}Y()},ue=async(_e,Ee,Ce,xe,Ne)=>{const ve=await Promise.all(_e.map(Ze=>Ln.storeImageUrlAsRef(Ze.url))),ke={2:280,3:260,4:180,5:140},Ie=20,Pe=_e[0],Te=Pe.width/Pe.height,Be=ke[Ee]??180,He=80;let Je=Te>=1?Math.min(Be,Pe.width):Math.min(Be*Te,Pe.width),Me=Te>=1?Math.min(Be/Te,Pe.height):Math.min(Be,Pe.height);if(Je{const Le=Math.floor(je/Ee),Xe=je%Ee;return{id:h(),type:"input-image",nodeName:Ne?`${Ne}_${je+1}`:`裁切图_${je+1}`,x:Ce+Xe*Re,y:xe+Le*Ve,width:Je,height:Me,content:ve[je],prompt:"",settings:{hasCustomSize:!0,imageSize:`${Ze.width}×${Ze.height}`},dimensions:{w:Ze.width,h:Ze.height}}})},U=async()=>{var Ee;const _e=e.item;if(!(_e!=null&&_e.url)){Y();return}n&&((Ee=_e.sourceNode)!=null&&Ee.id)&&Ni.flushSync(()=>n(_e.sourceNode.id));try{const Ce=await fo(_e.url,2,2);if(Ce.length!==4){console.error("[PreviewContextMenu] 切割失败");return}const xe=_e.sourceNode,Ne=xe?xe.x+xe.width+24:a.x+100,ve=xe?xe.y:a.y+100,ke=await ue(Ce,2,Ne,ve,cp(xe));u(Ie=>[...Ie,...ke])}catch(Ce){console.error("[PreviewContextMenu] 切割失败:",Ce)}finally{n==null||n(null)}Y()},G=async()=>{var Ee;const _e=e.item;if(!(_e!=null&&_e.url)){Y();return}n&&((Ee=_e.sourceNode)!=null&&Ee.id)&&Ni.flushSync(()=>n(_e.sourceNode.id));try{const Ce=await fo(_e.url,3,3);if(Ce.length!==9){console.error("[PreviewContextMenu] 切割失败");return}const xe=_e.sourceNode,Ne=xe?xe.x+xe.width+24:a.x+100,ve=xe?xe.y:a.y+100,ke=await ue(Ce,3,Ne,ve,cp(xe));u(Ie=>[...Ie,...ke])}catch(Ce){console.error("[PreviewContextMenu] 切割失败:",Ce)}finally{n==null||n(null)}Y()},te=async()=>{var Ee;const _e=e.item;if(!(_e!=null&&_e.url)){Y();return}n&&((Ee=_e.sourceNode)!=null&&Ee.id)&&Ni.flushSync(()=>n(_e.sourceNode.id));try{const Ce=await fo(_e.url,4,4);if(Ce.length!==16){console.error("[PreviewContextMenu] 切割失败");return}const xe=_e.sourceNode,Ne=xe?xe.x+xe.width+24:a.x+100,ve=xe?xe.y:a.y+100,ke=await ue(Ce,4,Ne,ve,cp(xe));u(Ie=>[...Ie,...ke])}catch(Ce){console.error("[PreviewContextMenu] 切割失败:",Ce)}finally{n==null||n(null)}Y()},ge=async()=>{var Ee;const _e=e.item;if(!(_e!=null&&_e.url)){Y();return}n&&((Ee=_e.sourceNode)!=null&&Ee.id)&&Ni.flushSync(()=>n(_e.sourceNode.id));try{const Ce=await fo(_e.url,5,5);if(Ce.length!==25){console.error("[PreviewContextMenu] 切割失败");return}const xe=_e.sourceNode,Ne=xe?xe.x+xe.width+24:a.x+100,ve=xe?xe.y:a.y+100,ke=await ue(Ce,5,Ne,ve,cp(xe));u(Ie=>[...Ie,...ke])}catch(Ce){console.error("[PreviewContextMenu] 切割失败:",Ce)}finally{n==null||n(null)}Y()},ne=`w-full text-left px-2.5 py-1.5 text-xs flex items-center gap-1.5 transition-colors ${r?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"}`,le=`w-full text-left px-3 py-1.5 text-xs flex items-center gap-1.5 transition-colors ${r?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"}`,fe=r?"text-zinc-400":"text-zinc-700";return s.jsxs(s.Fragment,{children:[e.visible&&s.jsxs("div",{className:`fixed z-[110] w-44 rounded-lg shadow-2xl py-0.5 animate-in fade-in duration-100 border ${r?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,style:{left:e.x,top:e.y},onMouseEnter:oe,onMouseLeave:se,children:[s.jsx("div",{className:`px-2.5 py-1 text-[10px] font-medium border-b mb-0.5 ${r?"text-zinc-500 border-zinc-800":"text-zinc-500 border-zinc-200"}`,children:"操作"}),s.jsxs("button",{className:ne,onClick:ee,children:[s.jsx(Wp,{size:13,className:fe})," 发送到当前对话"]}),s.jsxs("button",{className:ne,onClick:we,children:[s.jsx(Mw,{size:13,className:fe}),(de=e.item)!=null&&de.selectedUrls&&e.item.selectedUrls.length>1?`发送到画布 (${e.item.selectedUrls.length}张)`:"发送到画布"]}),(($e=e.item)==null?void 0:$e.type)!=="video"&&s.jsxs("button",{className:ne,onClick:pe,children:[s.jsx(rf,{size:13,className:fe})," 缩图"]}),s.jsxs("button",{className:ne,onClick:J,children:[s.jsx(si,{size:13,className:fe})," 发送到Eagle端"]}),((ze=e.item)==null?void 0:ze.type)==="video"&&s.jsxs(s.Fragment,{children:[s.jsx("div",{className:`h-px my-0.5 ${r?"bg-zinc-700":"bg-zinc-200"}`}),s.jsxs("button",{className:ne,onClick:B,children:[s.jsx(Ih,{size:13,className:fe})," 提取首尾帧"]}),s.jsxs("button",{className:ne,onClick:V,children:[s.jsx(Ih,{size:13,className:fe})," 提取当前帧"]})]}),f&&b.length>0&&s.jsxs("button",{className:ne,onClick:k,children:[s.jsx(Ii,{size:13,className:fe})," 智能扩图"]}),s.jsxs("div",{className:"relative",children:[s.jsxs("button",{className:`${ne} justify-between pr-1.5`,onClick:_e=>{_e.stopPropagation(),I(!E)},onMouseEnter:()=>I(!0),children:[s.jsxs("span",{className:"flex items-center gap-1.5",children:[s.jsx(PN,{size:13,className:fe})," 拆切功能"]}),s.jsx(Ja,{size:13,className:"text-zinc-500"})]}),E&&s.jsxs("div",{className:`absolute left-full top-0 ml-0.5 w-44 rounded-lg shadow-2xl py-0.5 animate-in fade-in duration-100 border ${r?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseEnter:re,onMouseLeave:ie,children:[s.jsxs("button",{className:le,onClick:Q,children:[s.jsx(gu,{size:13,className:fe})," 九宫格拆切"]}),s.jsxs("button",{className:le,onClick:me,children:[s.jsx(gu,{size:13,className:fe})," 2x2四图拆切"]}),s.jsxs(s.Fragment,{children:[s.jsx("div",{className:`h-px my-0.5 ${r?"bg-zinc-700":"bg-zinc-200"}`}),s.jsxs("button",{className:le,onClick:U,children:[s.jsx(Ii,{size:13,className:fe})," 2x2拆分镜头"]}),s.jsxs("button",{className:le,onClick:G,children:[s.jsx(Ii,{size:13,className:fe})," 3x3拆分镜头"]}),s.jsxs("button",{className:le,onClick:te,children:[s.jsx(Ii,{size:13,className:fe})," 4x4拆分镜头"]}),s.jsxs("button",{className:le,onClick:ge,children:[s.jsx(Ii,{size:13,className:fe})," 5x5拆分镜头"]}),s.jsx("div",{className:`h-px my-0.5 ${r?"bg-zinc-700":"bg-zinc-200"}`}),s.jsxs("button",{className:le,onClick:N,children:[s.jsx(PN,{size:13,className:fe})," 自由拆切"]})]})]})]})]}),R&&s.jsx(v9,{isOpen:!0,onClose:()=>A(null),imageUrl:R.imageUrl,isDark:r,onConfirm:j}),O&&f&&s.jsx(S9,{isOpen:!0,onClose:()=>F(null),imageUrl:O.imageUrl,isDark:r,runExpandImage:f,imageConfigs:b,showJimengModels:g,onSuccess:W,onStartGenerate:M,onError:_e=>{var Ce;z==null||z(_e.message||"扩图失败");const Ee=(Ce=L.current)==null?void 0:Ce.previewNodeId;Ee&&u(xe=>xe.map(Ne=>Ne.id===Ee?{...Ne,_expandPending:void 0,_expandTaskStartTime:void 0}:Ne)),L.current=null}})]})};function Uf(e,t){var i,a;if(!e)return"图片";if(e.sourceNodeId){const o=t.find(c=>c.id===e.sourceNodeId);let l=(i=o==null?void 0:o.nodeName)==null?void 0:i.trim();if((!l||l==="未命名节点")&&(l=(o!=null&&o.prompt&&typeof o.prompt=="string"?o.prompt:"").replace(/\.[^/.]+$/,"").trim()),l)return l}if(e.localFilePath)return B0(e.localFilePath.split(/[/\\]/).pop()||"");if(e.prompt&&e.prompt.length<80&&/\.(jpg|jpeg|png|gif|webp|bmp)$/i.test(e.prompt))return B0(e.prompt);const r=(((a=e.url)==null?void 0:a.split(/[?#]/)[0])||"").split(/[/\\]/).pop();return r?B0(r):"图片"}const Cne=ml||Ih,Nne=({historyContextMenu:e,setHistoryContextMenu:t,isDark:n,nodes:r,view:i,selectedNodeId:a,activeShot:o,canvasRef:l,setChatFiles:c,setIsChatOpen:u,setNodes:d,updateShot:h,generateId:p,splitImageToShots:f,isTauri:b=!1,toastSuccess:g,toastError:y})=>{var re;if(!e.visible)return null;const[w,v]=_.useState(!1),m=_.useRef(null),z=_.useRef(null),C=()=>{t({visible:!1,x:0,y:0,worldX:0,worldY:0,item:null}),v(!1),m.current&&(clearTimeout(m.current),m.current=null),z.current&&(clearTimeout(z.current),z.current=null)},E=()=>{m.current=setTimeout(()=>{C()},300)},I=()=>{z.current=setTimeout(()=>{v(!1)},200)},R=()=>{m.current&&(clearTimeout(m.current),m.current=null)},A=()=>{z.current&&(clearTimeout(z.current),z.current=null),m.current&&(clearTimeout(m.current),m.current=null)};_.useEffect(()=>()=>{m.current&&clearTimeout(m.current),z.current&&clearTimeout(z.current)},[]);const O=`w-full text-left px-2.5 py-1.5 text-xs flex items-center gap-1.5 transition-colors ${n?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"}`,F=`w-full text-left px-3 py-1.5 text-xs flex items-center gap-1.5 transition-colors ${n?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"}`,L=ee=>n?"text-zinc-400":"text-zinc-700",X="text-zinc-500",T=async()=>{var G;const ee=e.item;if(!(ee!=null&&ee.url))return;const pe=ee.type==="image",we=ee.type==="video",Q=pe?"png":we?"mp4":"file",me=pe?"image/png":we?"video/mp4":"application/octet-stream";let ue=ee.url;if(Ln.isContentRef(ue))try{await Ln.init();const te=Ln.extractId(ue),ge=await Ln.get(te);ge&&(ue=ge)}catch(te){console.error("[HistoryContextMenu] content_ref 解析失败:",te)}if(pe&&!ue.startsWith("data:"))try{if(ue.startsWith("blob:")){const ge=await(await fetch(ue)).blob();ue=await new Promise((ne,le)=>{const fe=new FileReader;fe.onload=()=>ne(fe.result),fe.onerror=le,fe.readAsDataURL(ge)})}else{const te=new Image;te.crossOrigin="anonymous",await new Promise((le,fe)=>{te.onload=()=>le(),te.onerror=()=>fe(new Error("Image load failed")),te.src=ue});const ge=document.createElement("canvas");ge.width=te.naturalWidth,ge.height=te.naturalHeight;const ne=ge.getContext("2d");ne?(ne.drawImage(te,0,0),ue=ge.toDataURL("image/png"),console.log("[HistoryContextMenu] 图片转换成功,大小:",ue.length)):console.warn("[HistoryContextMenu] 无法获取canvas context,使用原始URL")}}catch(te){console.warn("[HistoryContextMenu] 图片转换失败,尝试从 assetStore 恢复:",te);const ge=ee._assetId||ee.id;if(ge&&((G=ee.url)!=null&&G.startsWith("blob:")))try{const{assetStore:ne}=await mn(async()=>{const{assetStore:fe}=await Promise.resolve().then(()=>_s);return{assetStore:fe}},void 0,import.meta.url),le=await ne.getAssetBlob(ge);le&&(ue=await Ls(le),console.log("[HistoryContextMenu] 已从 assetStore 恢复并转为 base64"))}catch(ne){console.error("[HistoryContextMenu] assetStore 恢复失败:",ne)}(!ue||ue.startsWith("blob:"))&&(ue=ee.url)}const U={name:`Generated-${ee.id}.${Q}`,type:me,content:ue,isImage:pe,isVideo:we,isAudio:!1,fromHistory:!0,fileExt:Q};c(te=>[...te,U]),u(!0),C()},q=async()=>{var ge,ne,le;const ee=e.item;if(!(ee!=null&&ee.url)&&!(ee!=null&&ee.audioUrl)&&!((ge=ee==null?void 0:ee.mjImages)!=null&&ge.length))return;const pe=(ne=l.current)==null?void 0:ne.getBoundingClientRect(),we=pe?(window.innerWidth/2-pe.left-i.x)/i.zoom:100,Q=pe?(window.innerHeight/2-pe.top-i.y)/i.zoom:100;let me="input-image",ue=260,U=260,G=ee.url||ee.audioUrl||"";if(ee.mjImages&&ee.mjImages.length>1){const fe=ee.selectedMjImageIndex??0;G=ee.mjImages[fe]||ee.mjImages[0]||ee.url||"",console.log("[HistoryContextMenu] 发送四图中的选中图片到画布:",{selectedIndex:fe,totalImages:ee.mjImages.length,contentPreview:G.substring(0,50)})}if(G)try{console.log("[HistoryContextMenu] Creating independent Blob URL for node from:",G.substring(0,50));const fe=await fetch(G);if(!fe.ok)throw new Error(`HTTP ${fe.status}`);const be=await fe.blob();G=URL.createObjectURL(be),console.log("[HistoryContextMenu] ✅ Created independent node blob:",G.substring(0,50))}catch(fe){console.warn("[HistoryContextMenu] Blob fetch failed, trying assetStore:",fe);const be=ee._assetId||ee.id;if(be)try{const{assetStore:de}=await mn(async()=>{const{assetStore:ze}=await Promise.resolve().then(()=>_s);return{assetStore:ze}},void 0,import.meta.url),$e=await de.getAssetBlob(be);$e&&(G=URL.createObjectURL($e),console.log("[HistoryContextMenu] ✅ Got node content from assetStore:",be))}catch(de){console.error("[HistoryContextMenu] assetStore fallback failed:",de)}G||(G=ee.url||ee.audioUrl||((le=ee.mjImages)==null?void 0:le[0])||"")}ee.type==="audio"?(me="input-image",ue=350,U=200):ee.type==="video"&&(me="video-input",ue=360,U=420,G=G||ee.url);const te={id:p(),type:me,x:we+50,y:Q+50,width:ue,height:U,content:G,prompt:"",settings:ee.type==="audio"?{mediaType:"audio",audioUrl:ee.audioUrl||ee.url,musicTitle:ee.musicTitle,_blobUrl:G}:{_blobUrl:G}};d(fe=>[...fe,te]),C()},H=async()=>{var we;const ee=e.item;if(!ee||ee.type!=="image"){C();return}let pe=ee.url||"";if(ee.mjImages&&ee.mjImages.length>0){const Q=ee.selectedMjImageIndex??0;pe=ee.mjImages[Q]||ee.mjImages[0]||ee.url||""}if(!pe){C();return}try{const{url:Q,width:me,height:ue}=await kw(pe),U=(we=l.current)==null?void 0:we.getBoundingClientRect(),G=U?(window.innerWidth/2-U.left-i.x)/i.zoom:100,te=U?(window.innerHeight/2-U.top-i.y)/i.zoom:100,ge=me/ue,ne=260,le=80;let fe=ge>=1?Math.min(ne,me):Math.min(ne*ge,me),be=ge>=1?Math.min(ne/ge,ue):Math.min(ne,ue);if(fe[...$e,de])}catch(Q){console.error("[HistoryContextMenu] 创建缩图失败:",Q),y==null||y(Q instanceof Error?Q.message:"创建缩图失败")}C()},J=async ee=>{const pe=ee.url||ee.audioUrl||"";if(ee.type==="audio"&&ee._audioAssetId)try{const{assetStore:U}=await mn(async()=>{const{assetStore:te}=await Promise.resolve().then(()=>_s);return{assetStore:te}},void 0,import.meta.url),G=await U.getAssetUrl(ee._audioAssetId);if(G)return G}catch{}const we=ee.type==="video"&&ee.url&&(ee.url.includes("prod-ss-vidu")||ee.url.includes("prod-sa-vidu")||ee.url.includes("amazonaws")&&ee.url.includes("vidu")),Q=we&&ee.url?`${ee.id}_vidu_${(ee.url.split("/").pop()||ee.url).replace(/[^a-zA-Z0-9_-]/g,"").slice(0,36)||Date.now()}`:null,me=[ee._assetId,Q].filter(Boolean);we||me.push(ee.id);for(const U of me)try{const{assetStore:G}=await mn(async()=>{const{assetStore:ge}=await Promise.resolve().then(()=>_s);return{assetStore:ge}},void 0,import.meta.url),te=await G.getAssetUrl(U);if(te)return te}catch{}if(!we){const U=ee.id;if(U)try{const{assetStore:G}=await mn(async()=>{const{assetStore:ge}=await Promise.resolve().then(()=>_s);return{assetStore:ge}},void 0,import.meta.url),te=await G.getAssetUrl(U);if(te)return te}catch{}}const ue=ee._mjAssetIds;if(ee.mjImages&&(ue!=null&&ue.length)&&ee.mjImages.length>0){const U=ee.selectedMjImageIndex??0,G=ue[U]??ue[0];if(G)try{const{assetStore:te}=await mn(async()=>{const{assetStore:ne}=await Promise.resolve().then(()=>_s);return{assetStore:ne}},void 0,import.meta.url),ge=await te.getAssetUrl(G);if(ge)return ge}catch{}}if(ee.mjImages&&ee.mjImages.length>1){const U=ee.selectedMjImageIndex??0;return ee.mjImages[U]||ee.mjImages[0]||pe}return pe},Z=async()=>{var we;const ee=e.item;if(!(ee!=null&&ee.url)&&!(ee!=null&&ee.audioUrl)&&!((we=ee==null?void 0:ee.mjImages)!=null&&we.length))return;const pe=await J(ee);pe&&(d(Q=>{const me=Q.filter(U=>U.type==="preview");if(!me.length)return Q;const ue=me[me.length-1].id;return Q.map(U=>U.id===ue?{...U,content:pe,previewType:ee.type==="video"||ee.type==="audio"?"video":"image"}:U)}),C())},B=async()=>{var ue,U,G;const ee=e.item,pe=a,we=r.find(te=>te.id===pe);if(!we||!(ee!=null&&ee.url)&&!((ue=ee==null?void 0:ee.mjImages)!=null&&ue.length)&&!(ee!=null&&ee.audioUrl)){alert("请先选择一个节点"),C();return}const Q=await J(ee);if(!Q&&!(ee!=null&&ee.url)&&!((U=ee==null?void 0:ee.mjImages)!=null&&U.length))return;const me=Q||ee.url||((G=ee.mjImages)==null?void 0:G[0])||"";switch(we.type){case"input-image":case"preview":d(fe=>fe.map(be=>be.id===pe?{...be,content:me,previewType:we.type==="preview"?ee.type==="video"||ee.type==="audio"?"video":"image":void 0}:be));break;case"gen-image":case"gen-video":const te=p(),ge={id:te,type:"input-image",x:we.x-350,y:we.y,width:260,height:260,content:me,prompt:"",settings:{}};d(fe=>[...fe,ge]),setTimeout(()=>{const fe=new CustomEvent("addConnection",{detail:{from:te,to:pe,inputType:"default"}});window.dispatchEvent(fe)},50);break;case"text-node":const ne=p(),le={id:ne,type:"input-image",x:we.x-350,y:we.y,width:260,height:260,content:me,prompt:"",settings:{}};d(fe=>[...fe,le]),setTimeout(()=>{const fe=new CustomEvent("addConnection",{detail:{from:ne,to:pe,inputType:"default"}});window.dispatchEvent(fe)},50);break;default:alert(`不支持的节点类型: ${we.type} + +支持的类型: +- 图片输入 +- 预览窗口 +- AI 绘画 +- AI 视频 +- 文字节点`)}C()},V=async ee=>{if(ee.startsWith("data:"))return ee;const pe=await fetch(ee);if(!pe.ok)throw new Error(`无法加载: ${pe.status}`);const we=await pe.blob();return new Promise((Q,me)=>{const ue=new FileReader;ue.onload=()=>Q(ue.result),ue.onerror=me,ue.readAsDataURL(we)})},N=async()=>{var pe;const ee=e.item;if(!(!(ee!=null&&ee.url)&&!((pe=ee==null?void 0:ee.mjImages)!=null&&pe.length))){if(!g||!y){y==null||y("未配置 Toast");return}try{if(!await Kw()){y("请先启动 Eagle 应用"),C();return}const Q=[];if(ee.mjImages&&ee.mjImages.length>0){const U=ee._mjAssetIds,G=ee.selectedMjImageIndex??0;if(U!=null&&U.length){const{assetStore:te}=await mn(async()=>{const{assetStore:ge}=await Promise.resolve().then(()=>_s);return{assetStore:ge}},void 0,import.meta.url);for(let ge=0;ge{let te=U;(U.startsWith("blob:")||U.startsWith("/")&&!U.startsWith("http"))&&(te=await V(U));const ge=ee.type==="video"?"mp4":"png",ne=`Generated-${ee.id}${Q.length>1?`-${G+1}`:""}.${ge}`;return{url:te,name:ne,annotation:me}}));await x4(ue),g(`已发送 ${ue.length} 个素材到 Eagle`)}catch(we){y(we instanceof Error?we.message:"发送到 Eagle 失败")}C()}},j=()=>{const ee=e.item;ee!=null&&ee.url&&(o.nodeId&&o.shotId?h(o.nodeId,o.shotId,{image_url:ee.url}):alert("请先点击分镜表中的某一行使其处于选中状态"),C())},k=async()=>{const ee=e.item;if(ee!=null&&ee.url)try{const pe=await J(ee);if(!pe){C();return}const we=await fo(pe,3,3);if(we.length!==9){alert("切割失败:未能生成9张图片");return}const Q=await Promise.all(we.map(Ce=>Ln.storeImageUrlAsRef(Ce.url))),me=we,ue=e.worldX+340,U=e.worldY,G=3,te=24,ge=me[0],ne=ge.width/ge.height,le=260,fe=120;let be=ne>=1?Math.min(le,ge.width):Math.min(le*ne,ge.width),de=ne>=1?Math.min(le/ne,ge.height):Math.min(le,ge.height);if(be{const Ne=Math.floor(xe/G),ve=xe%G;return{id:p(),type:"input-image",nodeName:`${_e}_${xe+1}`,x:ue+ve*$e,y:U+Ne*ze,width:be,height:de,content:Q[xe],prompt:"",settings:{hasCustomSize:!0,imageSize:`${Ce.width}×${Ce.height}`}}});d(Ce=>[...Ce,...Ee])}catch(pe){alert("切割失败: "+pe.message)}C()},W=async()=>{const ee=e.item;if(!(ee!=null&&ee.url)){C();return}try{const pe=await J(ee);if(!pe){C();return}const we=await xm(pe);if(we.length!==4){alert("切割失败:未能生成4张图片");return}const Q=e.worldX+340,me=e.worldY,ue=await M(we,2,Q,me,Uf(ee,r));d(U=>[...U,...ue])}catch(pe){alert("切割失败: "+pe.message)}C()},M=async(ee,pe,we,Q,me)=>{const ue=await Promise.all(ee.map(ze=>Ln.storeImageUrlAsRef(ze.url))),U={2:280,3:260,4:180,5:140},G=20,te=ee[0],ge=te.width/te.height,ne=U[pe]??180,le=80;let fe=ge>=1?Math.min(ne,te.width):Math.min(ne*ge,te.width),be=ge>=1?Math.min(ne/ge,te.height):Math.min(ne,te.height);if(fe{const Ee=Math.floor(_e/pe),Ce=_e%pe;return{id:p(),type:"input-image",nodeName:me?`${me}_${_e+1}`:`裁切图_${_e+1}`,x:we+Ce*de,y:Q+Ee*$e,width:fe,height:be,content:ue[_e],prompt:"",settings:{hasCustomSize:!0,imageSize:`${ze.width}×${ze.height}`},dimensions:{w:ze.width,h:ze.height}}})},Y=async()=>{const ee=e.item;if(!(ee!=null&&ee.url)){C();return}try{const pe=await J(ee);if(!pe){C();return}const we=await fo(pe,2,2);if(we.length!==4){console.error("[HistoryContextMenu] 切割失败");return}const Q=e.worldX+340,me=e.worldY,ue=await M(we,2,Q,me,Uf(ee,r));d(U=>[...U,...ue])}catch(pe){console.error("[HistoryContextMenu] 切割失败:",pe)}C()},se=async()=>{const ee=e.item;if(!(ee!=null&&ee.url)){C();return}try{const pe=await J(ee);if(!pe){C();return}const we=await fo(pe,3,3);if(we.length!==9){console.error("[HistoryContextMenu] 切割失败");return}const Q=e.worldX+340,me=e.worldY,ue=await M(we,3,Q,me,Uf(ee,r));d(U=>[...U,...ue])}catch(pe){console.error("[HistoryContextMenu] 切割失败:",pe)}C()},ie=async()=>{const ee=e.item;if(!(ee!=null&&ee.url)){C();return}try{const pe=await J(ee);if(!pe){C();return}const we=await fo(pe,4,4);if(we.length!==16){console.error("[HistoryContextMenu] 切割失败");return}const Q=e.worldX+340,me=e.worldY,ue=await M(we,4,Q,me,Uf(ee,r));d(U=>[...U,...ue])}catch(pe){console.error("[HistoryContextMenu] 切割失败:",pe)}C()},oe=async()=>{const ee=e.item;if(!(ee!=null&&ee.url)){C();return}try{const pe=await J(ee);if(!pe){C();return}const we=await fo(pe,5,5);if(we.length!==25){console.error("[HistoryContextMenu] 切割失败");return}const Q=e.worldX+340,me=e.worldY,ue=await M(we,5,Q,me,Uf(ee,r));d(U=>[...U,...ue])}catch(pe){console.error("[HistoryContextMenu] 切割失败:",pe)}C()};return s.jsxs("div",{className:`fixed z-[100] w-44 rounded-lg shadow-2xl py-0.5 animate-in fade-in duration-100 border ${n?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,style:{left:e.x,top:e.y},onClick:ee=>ee.stopPropagation(),onMouseEnter:R,onMouseLeave:E,children:[s.jsx("div",{className:`px-2.5 py-1 text-[10px] font-medium border-b mb-0.5 ${n?"text-zinc-500 border-zinc-800":"text-zinc-500 border-zinc-200"}`,children:"操作"}),s.jsxs("button",{className:O,onClick:T,children:[s.jsx(Wp,{size:13,className:L()})," 发送到当前对话"]}),s.jsxs("button",{className:O,onClick:q,children:[s.jsx(Mw,{size:13,className:L()})," 发送到画布"]}),((re=e.item)==null?void 0:re.type)==="image"&&s.jsxs("button",{className:O,onClick:H,children:[s.jsx(rf,{size:13,className:L()})," 缩图"]}),s.jsxs("button",{className:O,onClick:Z,children:[s.jsx(jh,{size:13,className:L()})," 发送到预览窗口"]}),s.jsxs("button",{className:O,onClick:B,children:[s.jsx(VP,{size:13,className:a?L():"text-zinc-500"})," 应用到选中节点"]}),s.jsxs("button",{className:O,onClick:j,children:[s.jsx(Ii,{size:13,className:o.nodeId&&o.shotId?L():"text-zinc-500"})," 发送到当前分镜"]}),s.jsxs("button",{className:O,onClick:N,children:[s.jsx(si,{size:13,className:L()})," 发送到Eagle端"]}),s.jsxs("div",{className:"relative",children:[s.jsxs("button",{className:`${O} justify-between pr-1.5`,onClick:ee=>{ee.stopPropagation(),v(!w)},onMouseEnter:()=>v(!0),children:[s.jsxs("span",{className:"flex items-center gap-1.5",children:[s.jsx(Cne,{size:13,className:L()})," 拆切功能"]}),s.jsx(Ja,{size:13,className:X})]}),w&&s.jsxs("div",{className:`absolute left-full top-0 ml-0.5 w-44 rounded-lg shadow-2xl py-0.5 animate-in fade-in duration-100 border ${n?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseEnter:A,onMouseLeave:I,children:[s.jsxs("button",{className:F,onClick:k,children:[s.jsx(gu,{size:13,className:L()})," 九宫格拆切"]}),s.jsxs("button",{className:F,onClick:W,children:[s.jsx(gu,{size:13,className:L()})," 2x2四图拆切"]}),s.jsxs(s.Fragment,{children:[s.jsx("div",{className:`h-px my-0.5 ${n?"bg-zinc-700":"bg-zinc-200"}`}),s.jsxs("button",{className:F,onClick:Y,children:[s.jsx(Ii,{size:13,className:L()})," 2x2拆分镜头"]}),s.jsxs("button",{className:F,onClick:se,children:[s.jsx(Ii,{size:13,className:L()})," 3x3拆分镜头"]}),s.jsxs("button",{className:F,onClick:ie,children:[s.jsx(Ii,{size:13,className:L()})," 4x4拆分镜头"]}),s.jsxs("button",{className:F,onClick:oe,children:[s.jsx(Ii,{size:13,className:L()})," 5x5拆分镜头"]})]})]})]})]})};var Ene=Object.create,j9=Object.defineProperty,Ine=Object.getOwnPropertyDescriptor,C9=Object.getOwnPropertyNames,kne=Object.getPrototypeOf,Ane=Object.prototype.hasOwnProperty,b4=(e,t)=>function(){return t||(0,e[C9(e)[0]])((t={exports:{}}).exports,t),t.exports},Mne=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of C9(t))!Ane.call(e,i)&&i!==n&&j9(e,i,{get:()=>t[i],enumerable:!(r=Ine(t,i))||r.enumerable});return e},Xw=(e,t,n)=>(n=e!=null?Ene(kne(e)):{},Mne(!e||!e.__esModule?j9(n,"default",{value:e,enumerable:!0}):n,e)),Tne=b4({"../../node_modules/.pnpm/iota-array@1.0.0/node_modules/iota-array/iota.js"(e,t){function n(r){for(var i=new Array(r),a=0;aMath.abs(this.stride[1]))?[1,0]:[0,1]}})"):p===3&&g.push("var s0=Math.abs(this.stride[0]),s1=Math.abs(this.stride[1]),s2=Math.abs(this.stride[2]);if(s0>s1){if(s1>s2){return [2,1,0];}else if(s0>s2){return [1,2,0];}else{return [1,0,2];}}else if(s0>s2){return [2,0,1];}else if(s2>s1){return [0,1,2];}else{return [0,2,1];}}})")):g.push("ORDER})")),g.push("proto.set=function "+f+"_set("+w.join(",")+",v){"),b?g.push("return this.data.set("+v+",v)}"):g.push("return this.data["+v+"]=v}"),g.push("proto.get=function "+f+"_get("+w.join(",")+"){"),b?g.push("return this.data.get("+v+")}"):g.push("return this.data["+v+"]}"),g.push("proto.index=function "+f+"_index(",w.join(),"){return "+v+"}"),g.push("proto.hi=function "+f+"_hi("+w.join(",")+"){return new "+f+"(this.data,"+y.map(function(F){return["(typeof i",F,"!=='number'||i",F,"<0)?this.shape[",F,"]:i",F,"|0"].join("")}).join(",")+","+y.map(function(F){return"this.stride["+F+"]"}).join(",")+",this.offset)}");var C=y.map(function(F){return"a"+F+"=this.shape["+F+"]"}),E=y.map(function(F){return"c"+F+"=this.stride["+F+"]"});g.push("proto.lo=function "+f+"_lo("+w.join(",")+"){var b=this.offset,d=0,"+C.join(",")+","+E.join(","));for(var I=0;I=0){d=i"+I+"|0;b+=c"+I+"*d;a"+I+"-=d}");g.push("return new "+f+"(this.data,"+y.map(function(F){return"a"+F}).join(",")+","+y.map(function(F){return"c"+F}).join(",")+",b)}"),g.push("proto.step=function "+f+"_step("+w.join(",")+"){var "+y.map(function(F){return"a"+F+"=this.shape["+F+"]"}).join(",")+","+y.map(function(F){return"b"+F+"=this.stride["+F+"]"}).join(",")+",c=this.offset,d=0,ceil=Math.ceil");for(var I=0;I=0){c=(c+this.stride["+I+"]*i"+I+")|0}else{a.push(this.shape["+I+"]);b.push(this.stride["+I+"])}");g.push("var ctor=CTOR_LIST[a.length+1];return ctor(this.data,a,b,c)}"),g.push("return function construct_"+f+"(data,shape,stride,offset){return new "+f+"(data,"+y.map(function(F){return"shape["+F+"]"}).join(",")+","+y.map(function(F){return"stride["+F+"]"}).join(",")+",offset)}");var O=new Function("CTOR_LIST","ORDER",g.join(` +`));return O(u[h],o)}function c(h){if(r(h))return"buffer";if(i)switch(Object.prototype.toString.call(h)){case"[object Float64Array]":return"float64";case"[object Float32Array]":return"float32";case"[object Int8Array]":return"int8";case"[object Int16Array]":return"int16";case"[object Int32Array]":return"int32";case"[object Uint8Array]":return"uint8";case"[object Uint16Array]":return"uint16";case"[object Uint32Array]":return"uint32";case"[object Uint8ClampedArray]":return"uint8_clamped";case"[object BigInt64Array]":return"bigint64";case"[object BigUint64Array]":return"biguint64"}return Array.isArray(h)?"array":"generic"}var u={float32:[],float64:[],int8:[],int16:[],int32:[],uint8:[],uint16:[],uint32:[],array:[],uint8_clamped:[],bigint64:[],biguint64:[],buffer:[],generic:[]};function d(h,p,f,b){if(h===void 0){var z=u.array[0];return z([])}else typeof h=="number"&&(h=[h]);p===void 0&&(p=[h.length]);var g=p.length;if(f===void 0){f=new Array(g);for(var y=g-1,w=1;y>=0;--y)f[y]=w,w*=p[y]}if(b===void 0){b=0;for(var y=0;y-1}var ese=Qre;function tse(e,t){var n=this.__data__,r=Jw(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this}var nse=tse;function Om(e){var t=-1,n=e==null?0:e.length;for(this.clear();++t1?Math.max(l,c):Math.min(l,c));const u=(0,w4.default)(jse(o*t*n),[n,t,o]);for(let d=0;dnavigator.gpu===void 0?!1:await navigator.gpu.requestAdapter()!==null,kse=()=>navigator.hardwareConcurrency??4;async function FN(e,t){return URL.createObjectURL(await R9(e,t))}async function R9(e,t){const n=new URL("resources.json",t.publicPath),r=await fetch(n);if(!r.ok)throw new Error("Resource metadata not found. Ensure that the config.publicPath is configured correctly.");const a=(await r.json())[e];if(!a)throw new Error(`Resource ${e} not found. Ensure that the config.publicPath is configured correctly.`);const o=a.chunks;let l=0;const c=o.map(async h=>{const p=h.offsets[1]-h.offsets[0],f=t.publicPath?new URL(h.name,t.publicPath).toString():h.name,g=await(await fetch(f,t.fetchArgs)).blob();if(p!==g.size)throw new Error(`Failed to fetch ${e} with size ${p} but got ${g.size}`);return t.progress&&(l+=p,t.progress(`fetch:${e}`,l,a.size)),g}),u=await Promise.all(c),d=new Blob(u,{type:a.mime});if(d.size!==a.size)throw new Error(`Failed to fetch ${e} with size ${a.size} but got ${d.size}`);return d}var kg=null,P9=async e=>(kg!==null||(e?kg=(await mn(async()=>{const{default:t}=await Promise.resolve().then(()=>M0e);return{default:t}},void 0,import.meta.url)).default:kg=(await mn(async()=>{const{default:t}=await Promise.resolve().then(()=>tpe);return{default:t}},void 0,import.meta.url)).default),kg);async function Ase(e,t){const n=t.device==="gpu"&&await T9(),r=n&&t.proxyToWorker,i=[n?"webgpu":"wasm"],a=await P9(n);t.debug&&(console.debug(" Using WebGPU:",n),console.debug(" Proxy to Worker:",r),a.env.debug=!0,a.env.logLevel="verbose"),a.env.wasm.numThreads=kse(),a.env.wasm.proxy=r;const o=n?"/onnxruntime-web/ort-wasm-simd-threaded.jsep":"/onnxruntime-web/ort-wasm-simd-threaded",l=await FN(`${o}.wasm`,t),c=await FN(`${o}.mjs`,t);a.env.wasm.wasmPaths={mjs:c,wasm:l},t.debug&&console.debug("ort.env.wasm:",a.env.wasm);const u={executionProviders:i,graphOptimizationLevel:"all",executionMode:"parallel",enableCpuMemArena:!0};return await a.InferenceSession.create(e,u).catch(h=>{throw new Error(`Failed to create session: "${h}". Please check if the publicPath is set correctly.`)})}async function Mse(e,t,n,r){const i=r.device==="gpu"&&await T9(),a=await P9(i),o={};for(const[u,d]of t)o[u]=new a.Tensor("float32",new Float32Array(d.data),d.shape);const l=await e.run(o,{}),c=[];for(const u of n){const d=l[u],h=d.dims,p=d.data,f=(0,Ise.default)(p,h);c.push(f)}return c}var Ys;(function(e){e.assertEqual=i=>i;function t(i){}e.assertIs=t;function n(i){throw new Error}e.assertNever=n,e.arrayToEnum=i=>{const a={};for(const o of i)a[o]=o;return a},e.getValidEnumValues=i=>{const a=e.objectKeys(i).filter(l=>typeof i[i[l]]!="number"),o={};for(const l of a)o[l]=i[l];return e.objectValues(o)},e.objectValues=i=>e.objectKeys(i).map(function(a){return i[a]}),e.objectKeys=typeof Object.keys=="function"?i=>Object.keys(i):i=>{const a=[];for(const o in i)Object.prototype.hasOwnProperty.call(i,o)&&a.push(o);return a},e.find=(i,a)=>{for(const o of i)if(a(o))return o},e.isInteger=typeof Number.isInteger=="function"?i=>Number.isInteger(i):i=>typeof i=="number"&&isFinite(i)&&Math.floor(i)===i;function r(i,a=" | "){return i.map(o=>typeof o=="string"?`'${o}'`:o).join(a)}e.joinValues=r,e.jsonStringifyReplacer=(i,a)=>typeof a=="bigint"?a.toString():a})(Ys||(Ys={}));var N$;(function(e){e.mergeShapes=(t,n)=>({...t,...n})})(N$||(N$={}));var Lr=Ys.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),A0=e=>{switch(typeof e){case"undefined":return Lr.undefined;case"string":return Lr.string;case"number":return isNaN(e)?Lr.nan:Lr.number;case"boolean":return Lr.boolean;case"function":return Lr.function;case"bigint":return Lr.bigint;case"symbol":return Lr.symbol;case"object":return Array.isArray(e)?Lr.array:e===null?Lr.null:e.then&&typeof e.then=="function"&&e.catch&&typeof e.catch=="function"?Lr.promise:typeof Map<"u"&&e instanceof Map?Lr.map:typeof Set<"u"&&e instanceof Set?Lr.set:typeof Date<"u"&&e instanceof Date?Lr.date:Lr.object;default:return Lr.unknown}},mr=Ys.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]),Tse=e=>JSON.stringify(e,null,2).replace(/"([^"]+)":/g,"$1:"),pd=class O9 extends Error{get errors(){return this.issues}constructor(t){super(),this.issues=[],this.addIssue=r=>{this.issues=[...this.issues,r]},this.addIssues=(r=[])=>{this.issues=[...this.issues,...r]};const n=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,n):this.__proto__=n,this.name="ZodError",this.issues=t}format(t){const n=t||function(a){return a.message},r={_errors:[]},i=a=>{for(const o of a.issues)if(o.code==="invalid_union")o.unionErrors.map(i);else if(o.code==="invalid_return_type")i(o.returnTypeError);else if(o.code==="invalid_arguments")i(o.argumentsError);else if(o.path.length===0)r._errors.push(n(o));else{let l=r,c=0;for(;cn.message){const n={},r=[];for(const i of this.issues)i.path.length>0?(n[i.path[0]]=n[i.path[0]]||[],n[i.path[0]].push(t(i))):r.push(t(i));return{formErrors:r,fieldErrors:n}}get formErrors(){return this.flatten()}};pd.create=e=>new pd(e);var zm=(e,t)=>{let n;switch(e.code){case mr.invalid_type:e.received===Lr.undefined?n="Required":n=`Expected ${e.expected}, received ${e.received}`;break;case mr.invalid_literal:n=`Invalid literal value, expected ${JSON.stringify(e.expected,Ys.jsonStringifyReplacer)}`;break;case mr.unrecognized_keys:n=`Unrecognized key(s) in object: ${Ys.joinValues(e.keys,", ")}`;break;case mr.invalid_union:n="Invalid input";break;case mr.invalid_union_discriminator:n=`Invalid discriminator value. Expected ${Ys.joinValues(e.options)}`;break;case mr.invalid_enum_value:n=`Invalid enum value. Expected ${Ys.joinValues(e.options)}, received '${e.received}'`;break;case mr.invalid_arguments:n="Invalid function arguments";break;case mr.invalid_return_type:n="Invalid function return type";break;case mr.invalid_date:n="Invalid date";break;case mr.invalid_string:typeof e.validation=="object"?"includes"in e.validation?(n=`Invalid input: must include "${e.validation.includes}"`,typeof e.validation.position=="number"&&(n=`${n} at one or more positions greater than or equal to ${e.validation.position}`)):"startsWith"in e.validation?n=`Invalid input: must start with "${e.validation.startsWith}"`:"endsWith"in e.validation?n=`Invalid input: must end with "${e.validation.endsWith}"`:Ys.assertNever(e.validation):e.validation!=="regex"?n=`Invalid ${e.validation}`:n="Invalid";break;case mr.too_small:e.type==="array"?n=`Array must contain ${e.exact?"exactly":e.inclusive?"at least":"more than"} ${e.minimum} element(s)`:e.type==="string"?n=`String must contain ${e.exact?"exactly":e.inclusive?"at least":"over"} ${e.minimum} character(s)`:e.type==="number"?n=`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:e.type==="date"?n=`Date must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(e.minimum))}`:n="Invalid input";break;case mr.too_big:e.type==="array"?n=`Array must contain ${e.exact?"exactly":e.inclusive?"at most":"less than"} ${e.maximum} element(s)`:e.type==="string"?n=`String must contain ${e.exact?"exactly":e.inclusive?"at most":"under"} ${e.maximum} character(s)`:e.type==="number"?n=`Number must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="bigint"?n=`BigInt must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="date"?n=`Date must be ${e.exact?"exactly":e.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(e.maximum))}`:n="Invalid input";break;case mr.custom:n="Invalid input";break;case mr.invalid_intersection_types:n="Intersection results could not be merged";break;case mr.not_multiple_of:n=`Number must be a multiple of ${e.multipleOf}`;break;case mr.not_finite:n="Number must be finite";break;default:n=t.defaultError,Ys.assertNever(e)}return{message:n}},L9=zm;function Rse(e){L9=e}function Xv(){return L9}var Yv=e=>{const{data:t,path:n,errorMaps:r,issueData:i}=e,a=[...n,...i.path||[]],o={...i,path:a};if(i.message!==void 0)return{...i,path:a,message:i.message};let l="";const c=r.filter(u=>!!u).slice().reverse();for(const u of c)l=u(o,{data:t,defaultError:l}).message;return{...i,path:a,message:l}},Pse=[];function Mr(e,t){const n=Xv(),r=Yv({issueData:t,data:e.data,path:e.path,errorMaps:[e.common.contextualErrorMap,e.schemaErrorMap,n,n===zm?void 0:zm].filter(i=>!!i)});e.common.issues.push(r)}var Fl=class B9{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(t,n){const r=[];for(const i of n){if(i.status==="aborted")return xs;i.status==="dirty"&&t.dirty(),r.push(i.value)}return{status:t.value,value:r}}static async mergeObjectAsync(t,n){const r=[];for(const i of n){const a=await i.key,o=await i.value;r.push({key:a,value:o})}return B9.mergeObjectSync(t,r)}static mergeObjectSync(t,n){const r={};for(const i of n){const{key:a,value:o}=i;if(a.status==="aborted"||o.status==="aborted")return xs;a.status==="dirty"&&t.dirty(),o.status==="dirty"&&t.dirty(),a.value!=="__proto__"&&(typeof o.value<"u"||i.alwaysSet)&&(r[a.value]=o.value)}return{status:t.value,value:r}}},xs=Object.freeze({status:"aborted"}),am=e=>({status:"dirty",value:e}),xl=e=>({status:"valid",value:e}),E$=e=>e.status==="aborted",I$=e=>e.status==="dirty",qp=e=>e.status==="valid",qx=e=>typeof Promise<"u"&&e instanceof Promise;function Jv(e,t,n,r){if(typeof t=="function"?e!==t||!0:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return t.get(e)}function U9(e,t,n,r,i){if(typeof t=="function"?e!==t||!0:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return t.set(e,n),n}var is;(function(e){e.errToObj=t=>typeof t=="string"?{message:t}:t||{},e.toString=t=>typeof t=="string"?t:t==null?void 0:t.message})(is||(is={}));var tx,nx,t0=class{constructor(e,t,n,r){this._cachedPath=[],this.parent=e,this.data=t,this._path=n,this._key=r}get path(){return this._cachedPath.length||(this._key instanceof Array?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}},WN=(e,t)=>{if(qp(t))return{success:!0,data:t.value};if(!e.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;const n=new pd(e.common.issues);return this._error=n,this._error}}};function Cs(e){if(!e)return{};const{errorMap:t,invalid_type_error:n,required_error:r,description:i}=e;if(t&&(n||r))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return t?{errorMap:t,description:i}:{errorMap:(o,l)=>{var c,u;const{message:d}=e;return o.code==="invalid_enum_value"?{message:d??l.defaultError}:typeof l.data>"u"?{message:(c=d??r)!==null&&c!==void 0?c:l.defaultError}:o.code!=="invalid_type"?{message:l.defaultError}:{message:(u=d??n)!==null&&u!==void 0?u:l.defaultError}},description:i}}var Is=class{get description(){return this._def.description}_getType(e){return A0(e.data)}_getOrReturnCtx(e,t){return t||{common:e.parent.common,data:e.data,parsedType:A0(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}_processInputParams(e){return{status:new Fl,ctx:{common:e.parent.common,data:e.data,parsedType:A0(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}}_parseSync(e){const t=this._parse(e);if(qx(t))throw new Error("Synchronous parse encountered promise.");return t}_parseAsync(e){const t=this._parse(e);return Promise.resolve(t)}parse(e,t){const n=this.safeParse(e,t);if(n.success)return n.data;throw n.error}safeParse(e,t){var n;const r={common:{issues:[],async:(n=t==null?void 0:t.async)!==null&&n!==void 0?n:!1,contextualErrorMap:t==null?void 0:t.errorMap},path:(t==null?void 0:t.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:A0(e)},i=this._parseSync({data:e,path:r.path,parent:r});return WN(r,i)}"~validate"(e){var t,n;const r={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:A0(e)};if(!this["~standard"].async)try{const i=this._parseSync({data:e,path:[],parent:r});return qp(i)?{value:i.value}:{issues:r.common.issues}}catch(i){!((n=(t=i==null?void 0:i.message)===null||t===void 0?void 0:t.toLowerCase())===null||n===void 0)&&n.includes("encountered")&&(this["~standard"].async=!0),r.common={issues:[],async:!0}}return this._parseAsync({data:e,path:[],parent:r}).then(i=>qp(i)?{value:i.value}:{issues:r.common.issues})}async parseAsync(e,t){const n=await this.safeParseAsync(e,t);if(n.success)return n.data;throw n.error}async safeParseAsync(e,t){const n={common:{issues:[],contextualErrorMap:t==null?void 0:t.errorMap,async:!0},path:(t==null?void 0:t.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:A0(e)},r=this._parse({data:e,path:n.path,parent:n}),i=await(qx(r)?r:Promise.resolve(r));return WN(n,i)}refine(e,t){const n=r=>typeof t=="string"||typeof t>"u"?{message:t}:typeof t=="function"?t(r):t;return this._refinement((r,i)=>{const a=e(r),o=()=>i.addIssue({code:mr.custom,...n(r)});return typeof Promise<"u"&&a instanceof Promise?a.then(l=>l?!0:(o(),!1)):a?!0:(o(),!1)})}refinement(e,t){return this._refinement((n,r)=>e(n)?!0:(r.addIssue(typeof t=="function"?t(n,r):t),!1))}_refinement(e){return new fd({schema:this,typeName:ms.ZodEffects,effect:{type:"refinement",refinement:e}})}superRefine(e){return this._refinement(e)}constructor(e){this.spa=this.safeParseAsync,this._def=e,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:t=>this["~validate"](t)}}optional(){return Zd.create(this,this._def)}nullable(){return Ah.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return Kp.create(this)}promise(){return jm.create(this,this._def)}or(e){return eb.create([this,e],this._def)}and(e){return tb.create(this,e,this._def)}transform(e){return new fd({...Cs(this._def),schema:this,typeName:ms.ZodEffects,effect:{type:"transform",transform:e}})}default(e){const t=typeof e=="function"?e:()=>e;return new ib({...Cs(this._def),innerType:this,defaultValue:t,typeName:ms.ZodDefault})}brand(){return new _4({typeName:ms.ZodBranded,type:this,...Cs(this._def)})}catch(e){const t=typeof e=="function"?e:()=>e;return new ab({...Cs(this._def),innerType:this,catchValue:t,typeName:ms.ZodCatch})}describe(e){const t=this.constructor;return new t({...this._def,description:e})}pipe(e){return z4.create(this,e)}readonly(){return ob.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}},Ose=/^c[^\s-]{8,}$/i,Lse=/^[0-9a-z]+$/,Bse=/^[0-9A-HJKMNP-TV-Z]{26}$/i,Use=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,Fse=/^[a-z0-9_-]{21}$/i,Wse=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,Dse=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,Vse=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,Hse="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$",e_,Gse=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,qse=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,Kse=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,Xse=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,Yse=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,Jse=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,F9="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",Zse=new RegExp(`^${F9}$`);function W9(e){let t="([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d";return e.precision?t=`${t}\\.\\d{${e.precision}}`:e.precision==null&&(t=`${t}(\\.\\d+)?`),t}function Qse(e){return new RegExp(`^${W9(e)}$`)}function D9(e){let t=`${F9}T${W9(e)}`;const n=[];return n.push(e.local?"Z?":"Z"),e.offset&&n.push("([+-]\\d{2}:?\\d{2})"),t=`${t}(${n.join("|")})`,new RegExp(`^${t}$`)}function eie(e,t){return!!((t==="v4"||!t)&&Gse.test(e)||(t==="v6"||!t)&&Kse.test(e))}function tie(e,t){if(!Wse.test(e))return!1;try{const[n]=e.split("."),r=n.replace(/-/g,"+").replace(/_/g,"/").padEnd(n.length+(4-n.length%4)%4,"="),i=JSON.parse(atob(r));return!(typeof i!="object"||i===null||!i.typ||!i.alg||t&&i.alg!==t)}catch{return!1}}function nie(e,t){return!!((t==="v4"||!t)&&qse.test(e)||(t==="v6"||!t)&&Xse.test(e))}var $m=class rx extends Is{_parse(t){if(this._def.coerce&&(t.data=String(t.data)),this._getType(t)!==Lr.string){const a=this._getOrReturnCtx(t);return Mr(a,{code:mr.invalid_type,expected:Lr.string,received:a.parsedType}),xs}const r=new Fl;let i;for(const a of this._def.checks)if(a.kind==="min")t.data.lengtha.value&&(i=this._getOrReturnCtx(t,i),Mr(i,{code:mr.too_big,maximum:a.value,type:"string",inclusive:!0,exact:!1,message:a.message}),r.dirty());else if(a.kind==="length"){const o=t.data.length>a.value,l=t.data.lengtht.test(i),{validation:n,code:mr.invalid_string,...is.errToObj(r)})}_addCheck(t){return new rx({...this._def,checks:[...this._def.checks,t]})}email(t){return this._addCheck({kind:"email",...is.errToObj(t)})}url(t){return this._addCheck({kind:"url",...is.errToObj(t)})}emoji(t){return this._addCheck({kind:"emoji",...is.errToObj(t)})}uuid(t){return this._addCheck({kind:"uuid",...is.errToObj(t)})}nanoid(t){return this._addCheck({kind:"nanoid",...is.errToObj(t)})}cuid(t){return this._addCheck({kind:"cuid",...is.errToObj(t)})}cuid2(t){return this._addCheck({kind:"cuid2",...is.errToObj(t)})}ulid(t){return this._addCheck({kind:"ulid",...is.errToObj(t)})}base64(t){return this._addCheck({kind:"base64",...is.errToObj(t)})}base64url(t){return this._addCheck({kind:"base64url",...is.errToObj(t)})}jwt(t){return this._addCheck({kind:"jwt",...is.errToObj(t)})}ip(t){return this._addCheck({kind:"ip",...is.errToObj(t)})}cidr(t){return this._addCheck({kind:"cidr",...is.errToObj(t)})}datetime(t){var n,r;return typeof t=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:t}):this._addCheck({kind:"datetime",precision:typeof(t==null?void 0:t.precision)>"u"?null:t==null?void 0:t.precision,offset:(n=t==null?void 0:t.offset)!==null&&n!==void 0?n:!1,local:(r=t==null?void 0:t.local)!==null&&r!==void 0?r:!1,...is.errToObj(t==null?void 0:t.message)})}date(t){return this._addCheck({kind:"date",message:t})}time(t){return typeof t=="string"?this._addCheck({kind:"time",precision:null,message:t}):this._addCheck({kind:"time",precision:typeof(t==null?void 0:t.precision)>"u"?null:t==null?void 0:t.precision,...is.errToObj(t==null?void 0:t.message)})}duration(t){return this._addCheck({kind:"duration",...is.errToObj(t)})}regex(t,n){return this._addCheck({kind:"regex",regex:t,...is.errToObj(n)})}includes(t,n){return this._addCheck({kind:"includes",value:t,position:n==null?void 0:n.position,...is.errToObj(n==null?void 0:n.message)})}startsWith(t,n){return this._addCheck({kind:"startsWith",value:t,...is.errToObj(n)})}endsWith(t,n){return this._addCheck({kind:"endsWith",value:t,...is.errToObj(n)})}min(t,n){return this._addCheck({kind:"min",value:t,...is.errToObj(n)})}max(t,n){return this._addCheck({kind:"max",value:t,...is.errToObj(n)})}length(t,n){return this._addCheck({kind:"length",value:t,...is.errToObj(n)})}nonempty(t){return this.min(1,is.errToObj(t))}trim(){return new rx({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new rx({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new rx({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(t=>t.kind==="datetime")}get isDate(){return!!this._def.checks.find(t=>t.kind==="date")}get isTime(){return!!this._def.checks.find(t=>t.kind==="time")}get isDuration(){return!!this._def.checks.find(t=>t.kind==="duration")}get isEmail(){return!!this._def.checks.find(t=>t.kind==="email")}get isURL(){return!!this._def.checks.find(t=>t.kind==="url")}get isEmoji(){return!!this._def.checks.find(t=>t.kind==="emoji")}get isUUID(){return!!this._def.checks.find(t=>t.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(t=>t.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(t=>t.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(t=>t.kind==="cuid2")}get isULID(){return!!this._def.checks.find(t=>t.kind==="ulid")}get isIP(){return!!this._def.checks.find(t=>t.kind==="ip")}get isCIDR(){return!!this._def.checks.find(t=>t.kind==="cidr")}get isBase64(){return!!this._def.checks.find(t=>t.kind==="base64")}get isBase64url(){return!!this._def.checks.find(t=>t.kind==="base64url")}get minLength(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxLength(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.value{var t;return new $m({checks:[],typeName:ms.ZodString,coerce:(t=e==null?void 0:e.coerce)!==null&&t!==void 0?t:!1,...Cs(e)})};function rie(e,t){const n=(e.toString().split(".")[1]||"").length,r=(t.toString().split(".")[1]||"").length,i=n>r?n:r,a=parseInt(e.toFixed(i).replace(".","")),o=parseInt(t.toFixed(i).replace(".",""));return a%o/Math.pow(10,i)}var Kx=class k$ extends Is{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(t){if(this._def.coerce&&(t.data=Number(t.data)),this._getType(t)!==Lr.number){const a=this._getOrReturnCtx(t);return Mr(a,{code:mr.invalid_type,expected:Lr.number,received:a.parsedType}),xs}let r;const i=new Fl;for(const a of this._def.checks)a.kind==="int"?Ys.isInteger(t.data)||(r=this._getOrReturnCtx(t,r),Mr(r,{code:mr.invalid_type,expected:"integer",received:"float",message:a.message}),i.dirty()):a.kind==="min"?(a.inclusive?t.dataa.value:t.data>=a.value)&&(r=this._getOrReturnCtx(t,r),Mr(r,{code:mr.too_big,maximum:a.value,type:"number",inclusive:a.inclusive,exact:!1,message:a.message}),i.dirty()):a.kind==="multipleOf"?rie(t.data,a.value)!==0&&(r=this._getOrReturnCtx(t,r),Mr(r,{code:mr.not_multiple_of,multipleOf:a.value,message:a.message}),i.dirty()):a.kind==="finite"?Number.isFinite(t.data)||(r=this._getOrReturnCtx(t,r),Mr(r,{code:mr.not_finite,message:a.message}),i.dirty()):Ys.assertNever(a);return{status:i.value,value:t.data}}gte(t,n){return this.setLimit("min",t,!0,is.toString(n))}gt(t,n){return this.setLimit("min",t,!1,is.toString(n))}lte(t,n){return this.setLimit("max",t,!0,is.toString(n))}lt(t,n){return this.setLimit("max",t,!1,is.toString(n))}setLimit(t,n,r,i){return new k$({...this._def,checks:[...this._def.checks,{kind:t,value:n,inclusive:r,message:is.toString(i)}]})}_addCheck(t){return new k$({...this._def,checks:[...this._def.checks,t]})}int(t){return this._addCheck({kind:"int",message:is.toString(t)})}positive(t){return this._addCheck({kind:"min",value:0,inclusive:!1,message:is.toString(t)})}negative(t){return this._addCheck({kind:"max",value:0,inclusive:!1,message:is.toString(t)})}nonpositive(t){return this._addCheck({kind:"max",value:0,inclusive:!0,message:is.toString(t)})}nonnegative(t){return this._addCheck({kind:"min",value:0,inclusive:!0,message:is.toString(t)})}multipleOf(t,n){return this._addCheck({kind:"multipleOf",value:t,message:is.toString(n)})}finite(t){return this._addCheck({kind:"finite",message:is.toString(t)})}safe(t){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:is.toString(t)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:is.toString(t)})}get minValue(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxValue(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.valuet.kind==="int"||t.kind==="multipleOf"&&Ys.isInteger(t.value))}get isFinite(){let t=null,n=null;for(const r of this._def.checks){if(r.kind==="finite"||r.kind==="int"||r.kind==="multipleOf")return!0;r.kind==="min"?(n===null||r.value>n)&&(n=r.value):r.kind==="max"&&(t===null||r.valuenew Kx({checks:[],typeName:ms.ZodNumber,coerce:(e==null?void 0:e.coerce)||!1,...Cs(e)});var Xx=class A$ extends Is{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(t){if(this._def.coerce)try{t.data=BigInt(t.data)}catch{return this._getInvalidInput(t)}if(this._getType(t)!==Lr.bigint)return this._getInvalidInput(t);let r;const i=new Fl;for(const a of this._def.checks)a.kind==="min"?(a.inclusive?t.dataa.value:t.data>=a.value)&&(r=this._getOrReturnCtx(t,r),Mr(r,{code:mr.too_big,type:"bigint",maximum:a.value,inclusive:a.inclusive,message:a.message}),i.dirty()):a.kind==="multipleOf"?t.data%a.value!==BigInt(0)&&(r=this._getOrReturnCtx(t,r),Mr(r,{code:mr.not_multiple_of,multipleOf:a.value,message:a.message}),i.dirty()):Ys.assertNever(a);return{status:i.value,value:t.data}}_getInvalidInput(t){const n=this._getOrReturnCtx(t);return Mr(n,{code:mr.invalid_type,expected:Lr.bigint,received:n.parsedType}),xs}gte(t,n){return this.setLimit("min",t,!0,is.toString(n))}gt(t,n){return this.setLimit("min",t,!1,is.toString(n))}lte(t,n){return this.setLimit("max",t,!0,is.toString(n))}lt(t,n){return this.setLimit("max",t,!1,is.toString(n))}setLimit(t,n,r,i){return new A$({...this._def,checks:[...this._def.checks,{kind:t,value:n,inclusive:r,message:is.toString(i)}]})}_addCheck(t){return new A$({...this._def,checks:[...this._def.checks,t]})}positive(t){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:is.toString(t)})}negative(t){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:is.toString(t)})}nonpositive(t){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:is.toString(t)})}nonnegative(t){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:is.toString(t)})}multipleOf(t,n){return this._addCheck({kind:"multipleOf",value:t,message:is.toString(n)})}get minValue(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxValue(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.value{var t;return new Xx({checks:[],typeName:ms.ZodBigInt,coerce:(t=e==null?void 0:e.coerce)!==null&&t!==void 0?t:!1,...Cs(e)})};var Yx=class extends Is{_parse(e){if(this._def.coerce&&(e.data=!!e.data),this._getType(e)!==Lr.boolean){const n=this._getOrReturnCtx(e);return Mr(n,{code:mr.invalid_type,expected:Lr.boolean,received:n.parsedType}),xs}return xl(e.data)}};Yx.create=e=>new Yx({typeName:ms.ZodBoolean,coerce:(e==null?void 0:e.coerce)||!1,...Cs(e)});var Jx=class V9 extends Is{_parse(t){if(this._def.coerce&&(t.data=new Date(t.data)),this._getType(t)!==Lr.date){const a=this._getOrReturnCtx(t);return Mr(a,{code:mr.invalid_type,expected:Lr.date,received:a.parsedType}),xs}if(isNaN(t.data.getTime())){const a=this._getOrReturnCtx(t);return Mr(a,{code:mr.invalid_date}),xs}const r=new Fl;let i;for(const a of this._def.checks)a.kind==="min"?t.data.getTime()a.value&&(i=this._getOrReturnCtx(t,i),Mr(i,{code:mr.too_big,message:a.message,inclusive:!0,exact:!1,maximum:a.value,type:"date"}),r.dirty()):Ys.assertNever(a);return{status:r.value,value:new Date(t.data.getTime())}}_addCheck(t){return new V9({...this._def,checks:[...this._def.checks,t]})}min(t,n){return this._addCheck({kind:"min",value:t.getTime(),message:is.toString(n)})}max(t,n){return this._addCheck({kind:"max",value:t.getTime(),message:is.toString(n)})}get minDate(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t!=null?new Date(t):null}get maxDate(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.valuenew Jx({checks:[],coerce:(e==null?void 0:e.coerce)||!1,typeName:ms.ZodDate,...Cs(e)});var Zv=class extends Is{_parse(e){if(this._getType(e)!==Lr.symbol){const n=this._getOrReturnCtx(e);return Mr(n,{code:mr.invalid_type,expected:Lr.symbol,received:n.parsedType}),xs}return xl(e.data)}};Zv.create=e=>new Zv({typeName:ms.ZodSymbol,...Cs(e)});var Zx=class extends Is{_parse(e){if(this._getType(e)!==Lr.undefined){const n=this._getOrReturnCtx(e);return Mr(n,{code:mr.invalid_type,expected:Lr.undefined,received:n.parsedType}),xs}return xl(e.data)}};Zx.create=e=>new Zx({typeName:ms.ZodUndefined,...Cs(e)});var Qx=class extends Is{_parse(e){if(this._getType(e)!==Lr.null){const n=this._getOrReturnCtx(e);return Mr(n,{code:mr.invalid_type,expected:Lr.null,received:n.parsedType}),xs}return xl(e.data)}};Qx.create=e=>new Qx({typeName:ms.ZodNull,...Cs(e)});var Sm=class extends Is{constructor(){super(...arguments),this._any=!0}_parse(e){return xl(e.data)}};Sm.create=e=>new Sm({typeName:ms.ZodAny,...Cs(e)});var Fp=class extends Is{constructor(){super(...arguments),this._unknown=!0}_parse(e){return xl(e.data)}};Fp.create=e=>new Fp({typeName:ms.ZodUnknown,...Cs(e)});var W0=class extends Is{_parse(e){const t=this._getOrReturnCtx(e);return Mr(t,{code:mr.invalid_type,expected:Lr.never,received:t.parsedType}),xs}};W0.create=e=>new W0({typeName:ms.ZodNever,...Cs(e)});var Qv=class extends Is{_parse(e){if(this._getType(e)!==Lr.undefined){const n=this._getOrReturnCtx(e);return Mr(n,{code:mr.invalid_type,expected:Lr.void,received:n.parsedType}),xs}return xl(e.data)}};Qv.create=e=>new Qv({typeName:ms.ZodVoid,...Cs(e)});var Kp=class gv extends Is{_parse(t){const{ctx:n,status:r}=this._processInputParams(t),i=this._def;if(n.parsedType!==Lr.array)return Mr(n,{code:mr.invalid_type,expected:Lr.array,received:n.parsedType}),xs;if(i.exactLength!==null){const o=n.data.length>i.exactLength.value,l=n.data.lengthi.maxLength.value&&(Mr(n,{code:mr.too_big,maximum:i.maxLength.value,type:"array",inclusive:!0,exact:!1,message:i.maxLength.message}),r.dirty()),n.common.async)return Promise.all([...n.data].map((o,l)=>i.type._parseAsync(new t0(n,o,n.path,l)))).then(o=>Fl.mergeArray(r,o));const a=[...n.data].map((o,l)=>i.type._parseSync(new t0(n,o,n.path,l)));return Fl.mergeArray(r,a)}get element(){return this._def.type}min(t,n){return new gv({...this._def,minLength:{value:t,message:is.toString(n)}})}max(t,n){return new gv({...this._def,maxLength:{value:t,message:is.toString(n)}})}length(t,n){return new gv({...this._def,exactLength:{value:t,message:is.toString(n)}})}nonempty(t){return this.min(1,t)}};Kp.create=(e,t)=>new Kp({type:e,minLength:null,maxLength:null,exactLength:null,typeName:ms.ZodArray,...Cs(t)});function Zf(e){if(e instanceof bu){const t={};for(const n in e.shape){const r=e.shape[n];t[n]=Zd.create(Zf(r))}return new bu({...e._def,shape:()=>t})}else return e instanceof Kp?new Kp({...e._def,type:Zf(e.element)}):e instanceof Zd?Zd.create(Zf(e.unwrap())):e instanceof Ah?Ah.create(Zf(e.unwrap())):e instanceof kh?kh.create(e.items.map(t=>Zf(t))):e}var bu=class id extends Is{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;const t=this._def.shape(),n=Ys.objectKeys(t);return this._cached={shape:t,keys:n}}_parse(t){if(this._getType(t)!==Lr.object){const u=this._getOrReturnCtx(t);return Mr(u,{code:mr.invalid_type,expected:Lr.object,received:u.parsedType}),xs}const{status:r,ctx:i}=this._processInputParams(t),{shape:a,keys:o}=this._getCached(),l=[];if(!(this._def.catchall instanceof W0&&this._def.unknownKeys==="strip"))for(const u in i.data)o.includes(u)||l.push(u);const c=[];for(const u of o){const d=a[u],h=i.data[u];c.push({key:{status:"valid",value:u},value:d._parse(new t0(i,h,i.path,u)),alwaysSet:u in i.data})}if(this._def.catchall instanceof W0){const u=this._def.unknownKeys;if(u==="passthrough")for(const d of l)c.push({key:{status:"valid",value:d},value:{status:"valid",value:i.data[d]}});else if(u==="strict")l.length>0&&(Mr(i,{code:mr.unrecognized_keys,keys:l}),r.dirty());else if(u!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{const u=this._def.catchall;for(const d of l){const h=i.data[d];c.push({key:{status:"valid",value:d},value:u._parse(new t0(i,h,i.path,d)),alwaysSet:d in i.data})}}return i.common.async?Promise.resolve().then(async()=>{const u=[];for(const d of c){const h=await d.key,p=await d.value;u.push({key:h,value:p,alwaysSet:d.alwaysSet})}return u}).then(u=>Fl.mergeObjectSync(r,u)):Fl.mergeObjectSync(r,c)}get shape(){return this._def.shape()}strict(t){return is.errToObj,new id({...this._def,unknownKeys:"strict",...t!==void 0?{errorMap:(n,r)=>{var i,a,o,l;const c=(o=(a=(i=this._def).errorMap)===null||a===void 0?void 0:a.call(i,n,r).message)!==null&&o!==void 0?o:r.defaultError;return n.code==="unrecognized_keys"?{message:(l=is.errToObj(t).message)!==null&&l!==void 0?l:c}:{message:c}}}:{}})}strip(){return new id({...this._def,unknownKeys:"strip"})}passthrough(){return new id({...this._def,unknownKeys:"passthrough"})}extend(t){return new id({...this._def,shape:()=>({...this._def.shape(),...t})})}merge(t){return new id({unknownKeys:t._def.unknownKeys,catchall:t._def.catchall,shape:()=>({...this._def.shape(),...t._def.shape()}),typeName:ms.ZodObject})}setKey(t,n){return this.augment({[t]:n})}catchall(t){return new id({...this._def,catchall:t})}pick(t){const n={};return Ys.objectKeys(t).forEach(r=>{t[r]&&this.shape[r]&&(n[r]=this.shape[r])}),new id({...this._def,shape:()=>n})}omit(t){const n={};return Ys.objectKeys(this.shape).forEach(r=>{t[r]||(n[r]=this.shape[r])}),new id({...this._def,shape:()=>n})}deepPartial(){return Zf(this)}partial(t){const n={};return Ys.objectKeys(this.shape).forEach(r=>{const i=this.shape[r];t&&!t[r]?n[r]=i:n[r]=i.optional()}),new id({...this._def,shape:()=>n})}required(t){const n={};return Ys.objectKeys(this.shape).forEach(r=>{if(t&&!t[r])n[r]=this.shape[r];else{let a=this.shape[r];for(;a instanceof Zd;)a=a._def.innerType;n[r]=a}}),new id({...this._def,shape:()=>n})}keyof(){return Y9(Ys.objectKeys(this.shape))}};bu.create=(e,t)=>new bu({shape:()=>e,unknownKeys:"strip",catchall:W0.create(),typeName:ms.ZodObject,...Cs(t)});bu.strictCreate=(e,t)=>new bu({shape:()=>e,unknownKeys:"strict",catchall:W0.create(),typeName:ms.ZodObject,...Cs(t)});bu.lazycreate=(e,t)=>new bu({shape:e,unknownKeys:"strip",catchall:W0.create(),typeName:ms.ZodObject,...Cs(t)});var eb=class extends Is{_parse(e){const{ctx:t}=this._processInputParams(e),n=this._def.options;function r(i){for(const o of i)if(o.result.status==="valid")return o.result;for(const o of i)if(o.result.status==="dirty")return t.common.issues.push(...o.ctx.common.issues),o.result;const a=i.map(o=>new pd(o.ctx.common.issues));return Mr(t,{code:mr.invalid_union,unionErrors:a}),xs}if(t.common.async)return Promise.all(n.map(async i=>{const a={...t,common:{...t.common,issues:[]},parent:null};return{result:await i._parseAsync({data:t.data,path:t.path,parent:a}),ctx:a}})).then(r);{let i;const a=[];for(const l of n){const c={...t,common:{...t.common,issues:[]},parent:null},u=l._parseSync({data:t.data,path:t.path,parent:c});if(u.status==="valid")return u;u.status==="dirty"&&!i&&(i={result:u,ctx:c}),c.common.issues.length&&a.push(c.common.issues)}if(i)return t.common.issues.push(...i.ctx.common.issues),i.result;const o=a.map(l=>new pd(l));return Mr(t,{code:mr.invalid_union,unionErrors:o}),xs}}get options(){return this._def.options}};eb.create=(e,t)=>new eb({options:e,typeName:ms.ZodUnion,...Cs(t)});var I0=e=>e instanceof nb?I0(e.schema):e instanceof fd?I0(e.innerType()):e instanceof rb?[e.value]:e instanceof wb?e.options:e instanceof sb?Ys.objectValues(e.enum):e instanceof ib?I0(e._def.innerType):e instanceof Zx?[void 0]:e instanceof Qx?[null]:e instanceof Zd?[void 0,...I0(e.unwrap())]:e instanceof Ah?[null,...I0(e.unwrap())]:e instanceof _4||e instanceof ob?I0(e.unwrap()):e instanceof ab?I0(e._def.innerType):[],H9=class G9 extends Is{_parse(t){const{ctx:n}=this._processInputParams(t);if(n.parsedType!==Lr.object)return Mr(n,{code:mr.invalid_type,expected:Lr.object,received:n.parsedType}),xs;const r=this.discriminator,i=n.data[r],a=this.optionsMap.get(i);return a?n.common.async?a._parseAsync({data:n.data,path:n.path,parent:n}):a._parseSync({data:n.data,path:n.path,parent:n}):(Mr(n,{code:mr.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[r]}),xs)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(t,n,r){const i=new Map;for(const a of n){const o=I0(a.shape[t]);if(!o.length)throw new Error(`A discriminator value for key \`${t}\` could not be extracted from all schema options`);for(const l of o){if(i.has(l))throw new Error(`Discriminator property ${String(t)} has duplicate value ${String(l)}`);i.set(l,a)}}return new G9({typeName:ms.ZodDiscriminatedUnion,discriminator:t,options:n,optionsMap:i,...Cs(r)})}};function M$(e,t){const n=A0(e),r=A0(t);if(e===t)return{valid:!0,data:e};if(n===Lr.object&&r===Lr.object){const i=Ys.objectKeys(t),a=Ys.objectKeys(e).filter(l=>i.indexOf(l)!==-1),o={...e,...t};for(const l of a){const c=M$(e[l],t[l]);if(!c.valid)return{valid:!1};o[l]=c.data}return{valid:!0,data:o}}else if(n===Lr.array&&r===Lr.array){if(e.length!==t.length)return{valid:!1};const i=[];for(let a=0;a{if(E$(i)||E$(a))return xs;const o=M$(i.value,a.value);return o.valid?((I$(i)||I$(a))&&t.dirty(),{status:t.value,value:o.data}):(Mr(n,{code:mr.invalid_intersection_types}),xs)};return n.common.async?Promise.all([this._def.left._parseAsync({data:n.data,path:n.path,parent:n}),this._def.right._parseAsync({data:n.data,path:n.path,parent:n})]).then(([i,a])=>r(i,a)):r(this._def.left._parseSync({data:n.data,path:n.path,parent:n}),this._def.right._parseSync({data:n.data,path:n.path,parent:n}))}};tb.create=(e,t,n)=>new tb({left:e,right:t,typeName:ms.ZodIntersection,...Cs(n)});var kh=class q9 extends Is{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==Lr.array)return Mr(r,{code:mr.invalid_type,expected:Lr.array,received:r.parsedType}),xs;if(r.data.lengththis._def.items.length&&(Mr(r,{code:mr.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),n.dirty());const a=[...r.data].map((o,l)=>{const c=this._def.items[l]||this._def.rest;return c?c._parse(new t0(r,o,r.path,l)):null}).filter(o=>!!o);return r.common.async?Promise.all(a).then(o=>Fl.mergeArray(n,o)):Fl.mergeArray(n,a)}get items(){return this._def.items}rest(t){return new q9({...this._def,rest:t})}};kh.create=(e,t)=>{if(!Array.isArray(e))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new kh({items:e,typeName:ms.ZodTuple,rest:null,...Cs(t)})};var K9=class T$ extends Is{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==Lr.object)return Mr(r,{code:mr.invalid_type,expected:Lr.object,received:r.parsedType}),xs;const i=[],a=this._def.keyType,o=this._def.valueType;for(const l in r.data)i.push({key:a._parse(new t0(r,l,r.path,l)),value:o._parse(new t0(r,r.data[l],r.path,l)),alwaysSet:l in r.data});return r.common.async?Fl.mergeObjectAsync(n,i):Fl.mergeObjectSync(n,i)}get element(){return this._def.valueType}static create(t,n,r){return n instanceof Is?new T$({keyType:t,valueType:n,typeName:ms.ZodRecord,...Cs(r)}):new T$({keyType:$m.create(),valueType:t,typeName:ms.ZodRecord,...Cs(n)})}},ew=class extends Is{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){const{status:t,ctx:n}=this._processInputParams(e);if(n.parsedType!==Lr.map)return Mr(n,{code:mr.invalid_type,expected:Lr.map,received:n.parsedType}),xs;const r=this._def.keyType,i=this._def.valueType,a=[...n.data.entries()].map(([o,l],c)=>({key:r._parse(new t0(n,o,n.path,[c,"key"])),value:i._parse(new t0(n,l,n.path,[c,"value"]))}));if(n.common.async){const o=new Map;return Promise.resolve().then(async()=>{for(const l of a){const c=await l.key,u=await l.value;if(c.status==="aborted"||u.status==="aborted")return xs;(c.status==="dirty"||u.status==="dirty")&&t.dirty(),o.set(c.value,u.value)}return{status:t.value,value:o}})}else{const o=new Map;for(const l of a){const c=l.key,u=l.value;if(c.status==="aborted"||u.status==="aborted")return xs;(c.status==="dirty"||u.status==="dirty")&&t.dirty(),o.set(c.value,u.value)}return{status:t.value,value:o}}}};ew.create=(e,t,n)=>new ew({valueType:t,keyType:e,typeName:ms.ZodMap,...Cs(n)});var tw=class R$ extends Is{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==Lr.set)return Mr(r,{code:mr.invalid_type,expected:Lr.set,received:r.parsedType}),xs;const i=this._def;i.minSize!==null&&r.data.sizei.maxSize.value&&(Mr(r,{code:mr.too_big,maximum:i.maxSize.value,type:"set",inclusive:!0,exact:!1,message:i.maxSize.message}),n.dirty());const a=this._def.valueType;function o(c){const u=new Set;for(const d of c){if(d.status==="aborted")return xs;d.status==="dirty"&&n.dirty(),u.add(d.value)}return{status:n.value,value:u}}const l=[...r.data.values()].map((c,u)=>a._parse(new t0(r,c,r.path,u)));return r.common.async?Promise.all(l).then(c=>o(c)):o(l)}min(t,n){return new R$({...this._def,minSize:{value:t,message:is.toString(n)}})}max(t,n){return new R$({...this._def,maxSize:{value:t,message:is.toString(n)}})}size(t,n){return this.min(t,n).max(t,n)}nonempty(t){return this.min(1,t)}};tw.create=(e,t)=>new tw({valueType:e,minSize:null,maxSize:null,typeName:ms.ZodSet,...Cs(t)});var X9=class xv extends Is{constructor(){super(...arguments),this.validate=this.implement}_parse(t){const{ctx:n}=this._processInputParams(t);if(n.parsedType!==Lr.function)return Mr(n,{code:mr.invalid_type,expected:Lr.function,received:n.parsedType}),xs;function r(l,c){return Yv({data:l,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,Xv(),zm].filter(u=>!!u),issueData:{code:mr.invalid_arguments,argumentsError:c}})}function i(l,c){return Yv({data:l,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,Xv(),zm].filter(u=>!!u),issueData:{code:mr.invalid_return_type,returnTypeError:c}})}const a={errorMap:n.common.contextualErrorMap},o=n.data;if(this._def.returns instanceof jm){const l=this;return xl(async function(...c){const u=new pd([]),d=await l._def.args.parseAsync(c,a).catch(f=>{throw u.addIssue(r(c,f)),u}),h=await Reflect.apply(o,this,d);return await l._def.returns._def.type.parseAsync(h,a).catch(f=>{throw u.addIssue(i(h,f)),u})})}else{const l=this;return xl(function(...c){const u=l._def.args.safeParse(c,a);if(!u.success)throw new pd([r(c,u.error)]);const d=Reflect.apply(o,this,u.data),h=l._def.returns.safeParse(d,a);if(!h.success)throw new pd([i(d,h.error)]);return h.data})}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...t){return new xv({...this._def,args:kh.create(t).rest(Fp.create())})}returns(t){return new xv({...this._def,returns:t})}implement(t){return this.parse(t)}strictImplement(t){return this.parse(t)}static create(t,n,r){return new xv({args:t||kh.create([]).rest(Fp.create()),returns:n||Fp.create(),typeName:ms.ZodFunction,...Cs(r)})}},nb=class extends Is{get schema(){return this._def.getter()}_parse(e){const{ctx:t}=this._processInputParams(e);return this._def.getter()._parse({data:t.data,path:t.path,parent:t})}};nb.create=(e,t)=>new nb({getter:e,typeName:ms.ZodLazy,...Cs(t)});var rb=class extends Is{_parse(e){if(e.data!==this._def.value){const t=this._getOrReturnCtx(e);return Mr(t,{received:t.data,code:mr.invalid_literal,expected:this._def.value}),xs}return{status:"valid",value:e.data}}get value(){return this._def.value}};rb.create=(e,t)=>new rb({value:e,typeName:ms.ZodLiteral,...Cs(t)});function Y9(e,t){return new wb({values:e,typeName:ms.ZodEnum,...Cs(t)})}var wb=class P$ extends Is{constructor(){super(...arguments),tx.set(this,void 0)}_parse(t){if(typeof t.data!="string"){const n=this._getOrReturnCtx(t),r=this._def.values;return Mr(n,{expected:Ys.joinValues(r),received:n.parsedType,code:mr.invalid_type}),xs}if(Jv(this,tx)||U9(this,tx,new Set(this._def.values)),!Jv(this,tx).has(t.data)){const n=this._getOrReturnCtx(t),r=this._def.values;return Mr(n,{received:n.data,code:mr.invalid_enum_value,options:r}),xs}return xl(t.data)}get options(){return this._def.values}get enum(){const t={};for(const n of this._def.values)t[n]=n;return t}get Values(){const t={};for(const n of this._def.values)t[n]=n;return t}get Enum(){const t={};for(const n of this._def.values)t[n]=n;return t}extract(t,n=this._def){return P$.create(t,{...this._def,...n})}exclude(t,n=this._def){return P$.create(this.options.filter(r=>!t.includes(r)),{...this._def,...n})}};tx=new WeakMap;wb.create=Y9;var sb=class extends Is{constructor(){super(...arguments),nx.set(this,void 0)}_parse(e){const t=Ys.getValidEnumValues(this._def.values),n=this._getOrReturnCtx(e);if(n.parsedType!==Lr.string&&n.parsedType!==Lr.number){const r=Ys.objectValues(t);return Mr(n,{expected:Ys.joinValues(r),received:n.parsedType,code:mr.invalid_type}),xs}if(Jv(this,nx)||U9(this,nx,new Set(Ys.getValidEnumValues(this._def.values))),!Jv(this,nx).has(e.data)){const r=Ys.objectValues(t);return Mr(n,{received:n.data,code:mr.invalid_enum_value,options:r}),xs}return xl(e.data)}get enum(){return this._def.values}};nx=new WeakMap;sb.create=(e,t)=>new sb({values:e,typeName:ms.ZodNativeEnum,...Cs(t)});var jm=class extends Is{unwrap(){return this._def.type}_parse(e){const{ctx:t}=this._processInputParams(e);if(t.parsedType!==Lr.promise&&t.common.async===!1)return Mr(t,{code:mr.invalid_type,expected:Lr.promise,received:t.parsedType}),xs;const n=t.parsedType===Lr.promise?t.data:Promise.resolve(t.data);return xl(n.then(r=>this._def.type.parseAsync(r,{path:t.path,errorMap:t.common.contextualErrorMap})))}};jm.create=(e,t)=>new jm({type:e,typeName:ms.ZodPromise,...Cs(t)});var fd=class extends Is{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===ms.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(e){const{status:t,ctx:n}=this._processInputParams(e),r=this._def.effect||null,i={addIssue:a=>{Mr(n,a),a.fatal?t.abort():t.dirty()},get path(){return n.path}};if(i.addIssue=i.addIssue.bind(i),r.type==="preprocess"){const a=r.transform(n.data,i);if(n.common.async)return Promise.resolve(a).then(async o=>{if(t.value==="aborted")return xs;const l=await this._def.schema._parseAsync({data:o,path:n.path,parent:n});return l.status==="aborted"?xs:l.status==="dirty"||t.value==="dirty"?am(l.value):l});{if(t.value==="aborted")return xs;const o=this._def.schema._parseSync({data:a,path:n.path,parent:n});return o.status==="aborted"?xs:o.status==="dirty"||t.value==="dirty"?am(o.value):o}}if(r.type==="refinement"){const a=o=>{const l=r.refinement(o,i);if(n.common.async)return Promise.resolve(l);if(l instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return o};if(n.common.async===!1){const o=this._def.schema._parseSync({data:n.data,path:n.path,parent:n});return o.status==="aborted"?xs:(o.status==="dirty"&&t.dirty(),a(o.value),{status:t.value,value:o.value})}else return this._def.schema._parseAsync({data:n.data,path:n.path,parent:n}).then(o=>o.status==="aborted"?xs:(o.status==="dirty"&&t.dirty(),a(o.value).then(()=>({status:t.value,value:o.value}))))}if(r.type==="transform")if(n.common.async===!1){const a=this._def.schema._parseSync({data:n.data,path:n.path,parent:n});if(!qp(a))return a;const o=r.transform(a.value,i);if(o instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:t.value,value:o}}else return this._def.schema._parseAsync({data:n.data,path:n.path,parent:n}).then(a=>qp(a)?Promise.resolve(r.transform(a.value,i)).then(o=>({status:t.value,value:o})):a);Ys.assertNever(r)}};fd.create=(e,t,n)=>new fd({schema:e,typeName:ms.ZodEffects,effect:t,...Cs(n)});fd.createWithPreprocess=(e,t,n)=>new fd({schema:t,effect:{type:"preprocess",transform:e},typeName:ms.ZodEffects,...Cs(n)});var Zd=class extends Is{_parse(e){return this._getType(e)===Lr.undefined?xl(void 0):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}};Zd.create=(e,t)=>new Zd({innerType:e,typeName:ms.ZodOptional,...Cs(t)});var Ah=class extends Is{_parse(e){return this._getType(e)===Lr.null?xl(null):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}};Ah.create=(e,t)=>new Ah({innerType:e,typeName:ms.ZodNullable,...Cs(t)});var ib=class extends Is{_parse(e){const{ctx:t}=this._processInputParams(e);let n=t.data;return t.parsedType===Lr.undefined&&(n=this._def.defaultValue()),this._def.innerType._parse({data:n,path:t.path,parent:t})}removeDefault(){return this._def.innerType}};ib.create=(e,t)=>new ib({innerType:e,typeName:ms.ZodDefault,defaultValue:typeof t.default=="function"?t.default:()=>t.default,...Cs(t)});var ab=class extends Is{_parse(e){const{ctx:t}=this._processInputParams(e),n={...t,common:{...t.common,issues:[]}},r=this._def.innerType._parse({data:n.data,path:n.path,parent:{...n}});return qx(r)?r.then(i=>({status:"valid",value:i.status==="valid"?i.value:this._def.catchValue({get error(){return new pd(n.common.issues)},input:n.data})})):{status:"valid",value:r.status==="valid"?r.value:this._def.catchValue({get error(){return new pd(n.common.issues)},input:n.data})}}removeCatch(){return this._def.innerType}};ab.create=(e,t)=>new ab({innerType:e,typeName:ms.ZodCatch,catchValue:typeof t.catch=="function"?t.catch:()=>t.catch,...Cs(t)});var nw=class extends Is{_parse(e){if(this._getType(e)!==Lr.nan){const n=this._getOrReturnCtx(e);return Mr(n,{code:mr.invalid_type,expected:Lr.nan,received:n.parsedType}),xs}return{status:"valid",value:e.data}}};nw.create=e=>new nw({typeName:ms.ZodNaN,...Cs(e)});var sie=Symbol("zod_brand"),_4=class extends Is{_parse(e){const{ctx:t}=this._processInputParams(e),n=t.data;return this._def.type._parse({data:n,path:t.path,parent:t})}unwrap(){return this._def.type}},z4=class J9 extends Is{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.common.async)return(async()=>{const a=await this._def.in._parseAsync({data:r.data,path:r.path,parent:r});return a.status==="aborted"?xs:a.status==="dirty"?(n.dirty(),am(a.value)):this._def.out._parseAsync({data:a.value,path:r.path,parent:r})})();{const i=this._def.in._parseSync({data:r.data,path:r.path,parent:r});return i.status==="aborted"?xs:i.status==="dirty"?(n.dirty(),{status:"dirty",value:i.value}):this._def.out._parseSync({data:i.value,path:r.path,parent:r})}}static create(t,n){return new J9({in:t,out:n,typeName:ms.ZodPipeline})}},ob=class extends Is{_parse(e){const t=this._def.innerType._parse(e),n=r=>(qp(r)&&(r.value=Object.freeze(r.value)),r);return qx(t)?t.then(r=>n(r)):n(t)}unwrap(){return this._def.innerType}};ob.create=(e,t)=>new ob({innerType:e,typeName:ms.ZodReadonly,...Cs(t)});function DN(e,t){const n=typeof e=="function"?e(t):typeof e=="string"?{message:e}:e;return typeof n=="string"?{message:n}:n}function Z9(e,t={},n){return e?Sm.create().superRefine((r,i)=>{var a,o;const l=e(r);if(l instanceof Promise)return l.then(c=>{var u,d;if(!c){const h=DN(t,r),p=(d=(u=h.fatal)!==null&&u!==void 0?u:n)!==null&&d!==void 0?d:!0;i.addIssue({code:"custom",...h,fatal:p})}});if(!l){const c=DN(t,r),u=(o=(a=c.fatal)!==null&&a!==void 0?a:n)!==null&&o!==void 0?o:!0;i.addIssue({code:"custom",...c,fatal:u})}}):Sm.create()}var iie={object:bu.lazycreate},ms;(function(e){e.ZodString="ZodString",e.ZodNumber="ZodNumber",e.ZodNaN="ZodNaN",e.ZodBigInt="ZodBigInt",e.ZodBoolean="ZodBoolean",e.ZodDate="ZodDate",e.ZodSymbol="ZodSymbol",e.ZodUndefined="ZodUndefined",e.ZodNull="ZodNull",e.ZodAny="ZodAny",e.ZodUnknown="ZodUnknown",e.ZodNever="ZodNever",e.ZodVoid="ZodVoid",e.ZodArray="ZodArray",e.ZodObject="ZodObject",e.ZodUnion="ZodUnion",e.ZodDiscriminatedUnion="ZodDiscriminatedUnion",e.ZodIntersection="ZodIntersection",e.ZodTuple="ZodTuple",e.ZodRecord="ZodRecord",e.ZodMap="ZodMap",e.ZodSet="ZodSet",e.ZodFunction="ZodFunction",e.ZodLazy="ZodLazy",e.ZodLiteral="ZodLiteral",e.ZodEnum="ZodEnum",e.ZodEffects="ZodEffects",e.ZodNativeEnum="ZodNativeEnum",e.ZodOptional="ZodOptional",e.ZodNullable="ZodNullable",e.ZodDefault="ZodDefault",e.ZodCatch="ZodCatch",e.ZodPromise="ZodPromise",e.ZodBranded="ZodBranded",e.ZodPipeline="ZodPipeline",e.ZodReadonly="ZodReadonly"})(ms||(ms={}));var aie=(e,t={message:`Input not instance of ${e.name}`})=>Z9(n=>n instanceof e,t),Q9=$m.create,e7=Kx.create,oie=nw.create,lie=Xx.create,t7=Yx.create,cie=Jx.create,uie=Zv.create,die=Zx.create,hie=Qx.create,pie=Sm.create,fie=Fp.create,mie=W0.create,gie=Qv.create,xie=Kp.create,bie=bu.create,yie=bu.strictCreate,vie=eb.create,wie=H9.create,_ie=tb.create,zie=kh.create,$ie=K9.create,Sie=ew.create,jie=tw.create,Cie=X9.create,Nie=nb.create,Eie=rb.create,Iie=wb.create,kie=sb.create,Aie=jm.create,VN=fd.create,Mie=Zd.create,Tie=Ah.create,Rie=fd.createWithPreprocess,Pie=z4.create,Oie=()=>Q9().optional(),Lie=()=>e7().optional(),Bie=()=>t7().optional(),Uie={string:e=>$m.create({...e,coerce:!0}),number:e=>Kx.create({...e,coerce:!0}),boolean:e=>Yx.create({...e,coerce:!0}),bigint:e=>Xx.create({...e,coerce:!0}),date:e=>Jx.create({...e,coerce:!0})},Fie=xs,_o=Object.freeze({__proto__:null,defaultErrorMap:zm,setErrorMap:Rse,getErrorMap:Xv,makeIssue:Yv,EMPTY_PATH:Pse,addIssueToContext:Mr,ParseStatus:Fl,INVALID:xs,DIRTY:am,OK:xl,isAborted:E$,isDirty:I$,isValid:qp,isAsync:qx,get util(){return Ys},get objectUtil(){return N$},ZodParsedType:Lr,getParsedType:A0,ZodType:Is,datetimeRegex:D9,ZodString:$m,ZodNumber:Kx,ZodBigInt:Xx,ZodBoolean:Yx,ZodDate:Jx,ZodSymbol:Zv,ZodUndefined:Zx,ZodNull:Qx,ZodAny:Sm,ZodUnknown:Fp,ZodNever:W0,ZodVoid:Qv,ZodArray:Kp,ZodObject:bu,ZodUnion:eb,ZodDiscriminatedUnion:H9,ZodIntersection:tb,ZodTuple:kh,ZodRecord:K9,ZodMap:ew,ZodSet:tw,ZodFunction:X9,ZodLazy:nb,ZodLiteral:rb,ZodEnum:wb,ZodNativeEnum:sb,ZodPromise:jm,ZodEffects:fd,ZodTransformer:fd,ZodOptional:Zd,ZodNullable:Ah,ZodDefault:ib,ZodCatch:ab,ZodNaN:nw,BRAND:sie,ZodBranded:_4,ZodPipeline:z4,ZodReadonly:ob,custom:Z9,Schema:Is,ZodSchema:Is,late:iie,get ZodFirstPartyTypeKind(){return ms},coerce:Uie,any:pie,array:xie,bigint:lie,boolean:t7,date:cie,discriminatedUnion:wie,effect:VN,enum:Iie,function:Cie,instanceof:aie,intersection:_ie,lazy:Nie,literal:Eie,map:Sie,nan:oie,nativeEnum:kie,never:mie,null:hie,nullable:Tie,number:e7,object:bie,oboolean:Bie,onumber:Lie,optional:Mie,ostring:Oie,pipeline:Pie,preprocess:Rie,promise:Aie,record:$ie,set:jie,strictObject:yie,string:Q9,symbol:uie,transformer:VN,tuple:zie,undefined:die,union:vie,unknown:fie,void:gie,NEVER:Fie,ZodIssueCode:mr,quotelessJson:Tse,ZodError:pd}),HN={name:"@imgly/background-removal",version:"1.7.0"},Wie=_o.object({publicPath:_o.string().optional().describe("The public path to the wasm files and the onnx model.").default("https://staticimgly.com/@imgly/background-removal-data/${PACKAGE_VERSION}/dist/").transform(e=>e.replace("${PACKAGE_NAME}",HN.name).replace("${PACKAGE_VERSION}",HN.version)),debug:_o.boolean().default(!1).describe("Whether to enable debug logging."),rescale:_o.boolean().default(!0).describe("Whether to rescale the image."),device:_o.enum(["cpu","gpu"]).default("cpu").describe("The device to run the model on."),proxyToWorker:_o.boolean().default(!1).describe("Whether to proxy inference to a web worker."),fetchArgs:_o.any().default({}).describe("Arguments to pass to fetch when loading the model."),progress:_o.function().args(_o.string(),_o.number(),_o.number()).returns(_o.void()).describe("Progress callback.").optional(),model:_o.preprocess(e=>{switch(e){case"large":return"isnet";case"small":return"isnet_quint8";case"medium":return"isnet_fp16";default:return e}},_o.enum(["isnet","isnet_fp16","isnet_quint8"])).default("medium"),output:_o.object({format:_o.enum(["image/png","image/jpeg","image/webp","image/x-rgba8","image/x-alpha8"]).default("image/png"),quality:_o.number().default(.8)}).default({})}).default({}).transform(e=>(e.debug&&console.log("Config:",e),e.debug&&!e.progress&&(e.progress=e.progress??((t,n,r)=>{console.debug(`Downloading ${t}: ${n} of ${r}`)}),crossOriginIsolated||e.debug&&console.debug("Cross-Origin-Isolated is not enabled. Performance will be degraded. Please see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer.")),e));function Die(e){return Wie.parse(e??{})}var Vie=Xw(Yw());async function Hie(e){e.debug&&console.debug("Loading model...",e.model);const t=e.model,r=await(await R9(`/models/${t}`,e)).arrayBuffer();return await Ase(r,e)}async function Gie(e){e=Die(e);const t=await Hie(e);return{config:e,session:{base:t}}}async function qie(e,t,n){const[i,a,o]=e.shape,l=!1;let c=UN(e,1024,1024,l);const u=Cse(c);let d=await Mse(n.base,[["input",u]],["output"],t),h=(0,Vie.default)(d[0].data,[1024,1024,1]),p=Ese(h);return t.rescale?(p=UN(p,a,i,l),[p,e]):[p,c]}var Kie=vse(Gie,e=>JSON.stringify(e));async function Xie(e,t){var p,f,b,g;const{config:n,session:r}=await Kie(t);n.progress&&n.progress("compute:decode",0,4);const i=await Nse(e,n);(p=n.progress)==null||p.call(n,"compute:inference",1,4);const[a,o]=await qie(i,n,r);(f=n.progress)==null||f.call(n,"compute:mask",2,4);const l=o,[c,u]=l.shape,d=c*u;for(let y=0;y + * @license MIT + *) +*/function mh(e){var n;let t=(n=e==null?void 0:e.nodeName)==null?void 0:n.trim();return(!t||t==="未命名节点")&&(t=(e!=null&&e.prompt&&typeof e.prompt=="string"?e.prompt:"").replace(/\.[^/.]+$/,"").trim()),t||"图片"}const GN=ml||Ih,Yie=({inputImageContextMenu:e,setInputImageContextMenu:t,setCroppingNodeId:n,isDark:r,nodes:i,selectedNodeIds:a,setChatFiles:o,setIsChatOpen:l,setNodes:c,setConnections:u,generateId:d,splitImageToShots:h,runExpandImage:p,imageConfigs:f=[],showJimengModels:b=!0,setHistory:g,setLightboxItem:y,setLightboxOpen:w,toastError:v})=>{var G,te;const[m,z]=_.useState(!1),[C,E]=_.useState(null),[I,R]=_.useState(null),A=_.useRef(null),O=_.useRef(null),F=_.useRef(null),L=async(ge,ne)=>{await Xr.init();const le=Date.now();return Promise.all(ge.map(async(fe,be)=>{const $e=await(await fetch(fe.url)).blob(),ze=`split_${ne}_${le}_${be}_${d()}`;await Xr.saveBlobAsset(ze,$e,"file://split-local");const _e=await kx($e,Nx,Ex),Ee=URL.createObjectURL(_e);if(Av(Ee,ze),fe.url.startsWith("blob:"))try{URL.revokeObjectURL(fe.url)}catch{}return{url:Ee,width:fe.width,height:fe.height,assetId:ze}}))},X=()=>{const ge=e.nodeId;ge&&(c(ne=>ne.map(le=>{if(le.id!==ge||le.type!=="input-image")return le;const fe=le.settings||{};return{...le,settings:{...fe,highlighted:!fe.highlighted}}})),V())},T=()=>{const ge=e.nodeId,ne=i.find(le=>le.id===ge);ne&&ne.type==="input-image"&&typeof ne.content=="string"&&(E({imageUrl:ne.content,sourceNode:ne}),V())},q=async ge=>{var le;if(!(C!=null&&C.imageUrl)||ge.length===0)return;const ne=(le=C.sourceNode)==null?void 0:le.id;ne&&n&&Ni.flushSync(()=>n(ne));try{const fe=await N5(C.imageUrl,ge),be=await L(fe,"free"),de=C.sourceNode,$e=de?de.x+de.width+20:100,ze=de?de.y:100,_e=be.length,Ee=Math.ceil(Math.sqrt(_e)),Ce=_e<=4?260:_e<=9?240:_e<=16?200:160,xe=_e<=4?20:_e<=9?60:_e<=16?50:40,Ne=mh(de),ve=be.map((ke,Ie)=>({id:d(),type:"input-image",nodeName:`${Ne}_${Ie+1}`,x:$e+Ie%Ee*(Ce+xe),y:ze+Math.floor(Ie/Ee)*(Ce+xe),width:Ce,height:Ce,content:ke.url,prompt:"",settings:{dimensions:{w:ke.width,h:ke.height},_assetId:ke.assetId}}));c(ke=>[...ke,...ve]),E(null)}catch(fe){console.error("[InputImageContextMenu] 自由拆切失败:",fe),E(null)}finally{n==null||n(null)}},H=()=>{const ge=e.nodeId,ne=i.find(le=>le.id===ge);ne&&ne.type==="input-image"&&typeof ne.content=="string"&&p&&(R({imageUrl:ne.content,sourceNode:ne}),V())},J=async()=>{const ge=e.nodeId,ne=i.find(de=>de.id===ge);if(!ne||ne.type!=="input-image"||typeof ne.content!="string"){V();return}const le=ne.content;if(le.includes("video")||le.includes(".mp4")){v==null||v("智能抠图仅支持图片,不支持视频"),V();return}V(),n&&Ni.flushSync(()=>n(ge));let be=le;try{if(Ln.isContentRef(le)){await Ln.init();const ke=Ln.extractId(le),Ie=await Ln.get(ke);if(!Ie)throw new Error("无法解析图片内容");be=Ie}const $e=await Xie(be,{output:{format:"image/png",type:"foreground"}}),ze=`cutout_${ge}_${Date.now()}`,{assetStore:_e}=await mn(async()=>{const{assetStore:ke}=await Promise.resolve().then(()=>_s);return{assetStore:ke}},void 0,import.meta.url);await _e.init(),await _e.saveBlobAsset(ze,$e,"file://cutout-local");const Ee=await _e.getAssetUrl(ze);if(!Ee)throw new Error("保存抠图到资源缓存失败");const Ce=mh(ne),xe=ne.x+ne.width+24,Ne=ne.y,ve={id:d(),type:"input-image",nodeName:`${Ce}_抠图`,x:xe,y:Ne,width:ne.width,height:ne.height,content:Ee,prompt:"",settings:{_assetId:ze}};c(ke=>[...ke,ve])}catch(de){console.error("[InputImageContextMenu] 智能抠图失败:",de);const $e=de instanceof Error?de.message:String(de),_e=/fetch|network|连接|ERR_|failed to fetch/i.test($e)?"智能抠图需要从网络下载模型文件(~40MB),当前无法连接 staticimgly.com。请检查网络或使用代理/VPN 后重试。":$e||"智能抠图失败";v==null||v(_e)}finally{n==null||n(null)}},Z=(ge,ne,le)=>{const fe=A.current;A.current=null;const be=(I==null?void 0:I.sourceNode)??(fe==null?void 0:fe.sourceNode),de=fe==null?void 0:fe.previewNodeId,$e=ge==null?void 0:ge[0];if(!$e)return;const _e={id:d(),type:"image",url:$e,prompt:"智能扩图",time:new Date().toLocaleTimeString(),status:"completed",progress:100,modelName:le||"智能扩图",mjImages:ge.length>1?ge:void 0};g&&g(xe=>[_e,...xe]);const Ee={expandModelId:ne,expandModelName:le,model:le};let Ce;if(de)Ce=de,c(xe=>xe.map(Ne=>Ne.id===de?{...Ne,content:$e,previewType:"image",previewMjImages:ge.length>1?ge:void 0,nodeName:Ne.nodeName||"智能扩图",settings:{...Ne.settings||{},...Ee},_expandPending:void 0,_expandTaskStartTime:void 0}:Ne));else{const xe=be?be.x+be.width+80:100,Ne=be?be.y:100,ve=d();Ce=ve;const ke=Ms(ve,"preview",xe,Ne,void 0,void 0,i);ke.content=$e,ke.previewType="image",ke.nodeName="智能扩图",ke.settings={...ke.settings||{},...Ee},ge.length>1&&(ke.previewMjImages=ge),c(Ie=>[...Ie,ke]),u&&be&&u(Ie=>[...Ie,{id:d(),from:be.id,to:ve}])}R(null),(async()=>{try{const{contentStore:xe}=await mn(async()=>{const{contentStore:ve}=await Promise.resolve().then(()=>Nh);return{contentStore:ve}},void 0,import.meta.url),Ne=await xe.storeImageUrlAsRef($e);c(ve=>ve.map(ke=>ke.id===Ce?{...ke,content:Ne}:ke))}catch(xe){console.warn("[InputImageContextMenu] 扩图结果写入 contentStore 失败,预览将显示原图:",xe)}})()},B=(ge,ne)=>{if(I){const le=I.sourceNode,fe=le?le.x+le.width+80:100,be=le?le.y:100,de=d(),$e=Ms(de,"preview",fe,be,void 0,void 0,i);$e.content="",$e.previewType="image",$e.nodeName="智能扩图",$e.settings={...$e.settings||{},expandModelId:ge,expandModelName:ne},$e._expandPending=!0,$e._expandTaskStartTime=Date.now(),c(ze=>[...ze,$e]),u&&le&&u(ze=>[...ze,{id:d(),from:le.id,to:de}]),A.current={sourceNode:le,imageUrl:I.imageUrl,previewNodeId:de},R(null)}},V=()=>{t({visible:!1,x:0,y:0,nodeId:null}),z(!1),O.current&&(clearTimeout(O.current),O.current=null),F.current&&(clearTimeout(F.current),F.current=null)},N=()=>{O.current=setTimeout(()=>{V()},300)},j=()=>{F.current=setTimeout(()=>{z(!1)},200)},k=()=>{O.current&&(clearTimeout(O.current),O.current=null)},W=()=>{F.current&&(clearTimeout(F.current),F.current=null),O.current&&(clearTimeout(O.current),O.current=null)};_.useEffect(()=>()=>{O.current&&clearTimeout(O.current),F.current&&clearTimeout(F.current)},[]);const M=async()=>{const ge=e.nodeId,ne=i.find(le=>le.id===ge);if(ne!=null&&ne.content){const le=ne.content.includes("video")||ne.content.includes(".mp4"),fe=!le,be=fe?"png":"mp4",de=fe?"image/png":"video/mp4";let $e=ne.content;if(Ln.isContentRef($e))try{await Ln.init();const _e=Ln.extractId($e),Ee=await Ln.get(_e);Ee&&($e=Ee)}catch(_e){console.error("[InputImageContextMenu] content_ref 解析失败:",_e)}if(fe&&!$e.startsWith("data:"))try{if($e.startsWith("blob:")){const Ee=await(await fetch($e)).blob();$e=await new Promise((Ce,xe)=>{const Ne=new FileReader;Ne.onload=()=>Ce(Ne.result),Ne.onerror=xe,Ne.readAsDataURL(Ee)})}else{const _e=new Image;_e.crossOrigin="anonymous",await new Promise((xe,Ne)=>{_e.onload=()=>xe(),_e.onerror=Ne,_e.src=$e});const Ee=document.createElement("canvas");Ee.width=_e.naturalWidth,Ee.height=_e.naturalHeight;const Ce=Ee.getContext("2d");Ce&&(Ce.drawImage(_e,0,0),$e=Ee.toDataURL("image/png"))}}catch(_e){console.error("[InputImageContextMenu] 图片转换失败:",_e)}const ze={name:`InputImage-${Date.now()}.${be}`,type:de,content:$e,isImage:fe,isVideo:le,isAudio:!1,fileExt:be};o(_e=>[..._e,ze]),l(!0)}V()},Y=async()=>{const ge=e.nodeId,ne=i.find(be=>be.id===ge);if(!ne||ne.type!=="input-image"||typeof ne.content!="string"){V();return}const le=ne.content;if(le.includes("video")||le.includes(".mp4")){v==null||v("仅支持图片,不支持视频"),V();return}try{const{url:be,width:de,height:$e}=await kw(le),ze=ne.x+ne.width+24,_e=ne.y,Ee=de/$e,Ce=260,xe=80;let Ne=Ee>=1?Math.min(Ce,de):Math.min(Ce*Ee,de),ve=Ee>=1?Math.min(Ce/Ee,$e):Math.min(Ce,$e);if(Ne[...Ie,ke])}catch(be){console.error("[InputImageContextMenu] 创建缩图失败:",be),v==null||v(be instanceof Error?be.message:"创建缩图失败")}V()},se=async()=>{const ge=e.nodeId,ne=i.find(fe=>fe.id===ge);if(!(ne!=null&&ne.content)){V();return}n&&Ni.flushSync(()=>n(ge??null));const le=a.size===9&&Array.from(a).every(fe=>{const be=i.find(de=>de.id===fe);return be&&be.type==="input-image"});try{const fe=await fo(ne.content,3,3);if(fe.length!==9){alert("切割失败:未能生成9张图片");return}const be=await L(fe,"grid3x3");if(le){const de=Array.from(a);c($e=>$e.map(ze=>{const _e=de.indexOf(ze.id);return _e!==-1&&_e=1?Math.min(xe,Ee.width):Math.min(xe*Ce,Ee.width),ke=Ce>=1?Math.min(xe/Ce,Ee.height):Math.min(xe,Ee.height);if(ve{const Me=Math.floor(Je/ze),Re=Je%ze;return{id:d(),type:"input-image",nodeName:`${Te}_${Je+1}`,x:de+Re*Ie,y:$e+Me*Pe,width:ve,height:ke,content:He.url,prompt:"",settings:{hasCustomSize:!0,imageSize:`${He.width}×${He.height}`,_assetId:He.assetId},dimensions:{w:He.width,h:He.height}}});c(He=>[...He,...Be])}}catch(fe){alert("切割失败: "+(fe instanceof Error?fe.message:"未知错误"))}finally{n==null||n(null)}V()},ie=async()=>{const ge=e.nodeId,ne=i.find(le=>le.id===ge);if(!(ne!=null&&ne.content)){V();return}n&&Ni.flushSync(()=>n(ge??null));try{const le=await xm(ne.content);if(le.length!==4){alert("切割失败:未能生成4张图片");return}const fe=await oe(le,2,ne.x+ne.width+24,ne.y,mh(ne));c(be=>[...be,...fe])}catch(le){alert("切割失败: "+(le instanceof Error?le.message:"未知错误"))}finally{n==null||n(null)}V()},oe=async(ge,ne,le,fe,be)=>{const de=await L(ge,`shots_${ne}x${ne}`),$e={2:280,3:260,4:180,5:140},ze=20,_e=de[0],Ee=_e.width/_e.height,Ce=$e[ne]??180,xe=80;let Ne=Ee>=1?Math.min(Ce,_e.width):Math.min(Ce*Ee,_e.width),ve=Ee>=1?Math.min(Ce/Ee,_e.height):Math.min(Ce,_e.height);if(Ne{const Be=Math.floor(Te/ne),He=Te%ne;return{id:d(),type:"input-image",nodeName:be?`${be}_${Te+1}`:`裁切图_${Te+1}`,x:le+He*ke,y:fe+Be*Ie,width:Ne,height:ve,content:Pe.url,prompt:"",settings:{hasCustomSize:!0,imageSize:`${Pe.width}×${Pe.height}`,_assetId:Pe.assetId},dimensions:{w:Pe.width,h:Pe.height}}})},re=async()=>{const ge=e.nodeId,ne=i.find(le=>le.id===ge);if(!(ne!=null&&ne.content)){V();return}n&&Ni.flushSync(()=>n(ge??null));try{const le=await fo(ne.content,2,2);if(le.length!==4){console.error("[InputImageContextMenu] 切割失败");return}const fe=await oe(le,2,ne.x+ne.width+24,ne.y,mh(ne));c(be=>[...be,...fe])}catch(le){console.error("[InputImageContextMenu] 切割失败:",le)}finally{n==null||n(null)}V()},ee=async()=>{const ge=e.nodeId,ne=i.find(le=>le.id===ge);if(!(ne!=null&&ne.content)){V();return}n&&Ni.flushSync(()=>n(ge??null));try{const le=await fo(ne.content,3,3);if(le.length!==9){console.error("[InputImageContextMenu] 切割失败");return}const fe=await oe(le,3,ne.x+ne.width+24,ne.y,mh(ne));c(be=>[...be,...fe])}catch(le){console.error("[InputImageContextMenu] 切割失败:",le)}finally{n==null||n(null)}V()},pe=async()=>{const ge=e.nodeId,ne=i.find(le=>le.id===ge);if(!(ne!=null&&ne.content)){V();return}n&&Ni.flushSync(()=>n(ge??null));try{const le=await fo(ne.content,4,4);if(le.length!==16){console.error("[InputImageContextMenu] 切割失败");return}const fe=await oe(le,4,ne.x+ne.width+24,ne.y,mh(ne));c(be=>[...be,...fe])}catch(le){console.error("[InputImageContextMenu] 切割失败:",le)}finally{n==null||n(null)}V()},we=async()=>{const ge=e.nodeId,ne=i.find(le=>le.id===ge);if(!(ne!=null&&ne.content)){V();return}n&&Ni.flushSync(()=>n(ge??null));try{const le=await fo(ne.content,5,5);if(le.length!==25){console.error("[InputImageContextMenu] 切割失败");return}const fe=await oe(le,5,ne.x+ne.width+24,ne.y,mh(ne));c(be=>[...be,...fe])}catch(le){console.error("[InputImageContextMenu] 切割失败:",le)}finally{n==null||n(null)}V()},Q=`w-full text-left px-2.5 py-1.5 text-xs flex items-center gap-1.5 transition-colors ${r?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"}`,me=`w-full text-left px-3 py-1.5 text-xs flex items-center gap-1.5 transition-colors ${r?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"}`,ue=r?"text-zinc-400":"text-zinc-700";return s.jsxs(s.Fragment,{children:[e.visible&&s.jsxs("div",{className:`fixed z-[110] w-44 rounded-lg shadow-2xl py-0.5 animate-in fade-in duration-100 border ${r?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,style:{left:e.x,top:e.y},onMouseEnter:k,onMouseLeave:N,children:[s.jsx("div",{className:`px-2.5 py-1 text-[10px] font-medium border-b mb-0.5 ${r?"text-zinc-500 border-zinc-800":"text-zinc-500 border-zinc-200"}`,children:"操作"}),s.jsxs("button",{className:Q,onClick:X,children:[s.jsx(GG,{size:13,className:ue}),(te=(G=i.find(ge=>ge.id===e.nodeId))==null?void 0:G.settings)!=null&&te.highlighted?"取消高亮":"高亮显示"]}),s.jsxs("button",{className:Q,onClick:M,children:[s.jsx(Wp,{size:13,className:ue})," 发送到当前对话"]}),s.jsxs("button",{className:Q,onClick:Y,children:[s.jsx(rf,{size:13,className:ue})," 缩图"]}),p&&f.length>0&&s.jsxs("button",{className:Q,onClick:H,children:[s.jsx(Ii,{size:13,className:ue})," 智能扩图"]}),s.jsxs("button",{className:Q,onClick:J,children:[s.jsx(qG,{size:13,className:ue})," 智能抠图"]}),s.jsxs("div",{className:"relative",children:[s.jsxs("button",{className:`${Q} justify-between pr-1.5`,onClick:ge=>{ge.stopPropagation(),z(!m)},onMouseEnter:()=>z(!0),children:[s.jsxs("span",{className:"flex items-center gap-1.5",children:[s.jsx(GN,{size:13,className:ue})," 拆切功能"]}),s.jsx(Ja,{size:13,className:"text-zinc-500"})]}),m&&s.jsxs("div",{className:`absolute left-full top-0 ml-0.5 w-44 rounded-lg shadow-2xl py-0.5 animate-in fade-in duration-100 border ${r?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseEnter:W,onMouseLeave:j,children:[s.jsxs("button",{className:me,onClick:se,children:[s.jsx(gu,{size:13,className:ue})," 九宫格拆切"]}),s.jsxs("button",{className:me,onClick:ie,children:[s.jsx(gu,{size:13,className:ue})," 2x2四图拆切"]}),s.jsxs(s.Fragment,{children:[s.jsx("div",{className:`h-px my-0.5 ${r?"bg-zinc-700":"bg-zinc-200"}`}),s.jsxs("button",{className:me,onClick:re,children:[s.jsx(Ii,{size:13,className:ue})," 2x2拆分镜头"]}),s.jsxs("button",{className:me,onClick:ee,children:[s.jsx(Ii,{size:13,className:ue})," 3x3拆分镜头"]}),s.jsxs("button",{className:me,onClick:pe,children:[s.jsx(Ii,{size:13,className:ue})," 4x4拆分镜头"]}),s.jsxs("button",{className:me,onClick:we,children:[s.jsx(Ii,{size:13,className:ue})," 5x5拆分镜头"]}),s.jsx("div",{className:`h-px my-0.5 ${r?"bg-zinc-700":"bg-zinc-200"}`}),s.jsxs("button",{className:me,onClick:T,children:[s.jsx(GN,{size:13,className:ue})," 自由拆切"]})]})]})]})]}),C&&s.jsx(v9,{isOpen:!0,onClose:()=>E(null),imageUrl:C.imageUrl,isDark:r,onConfirm:q}),I&&p&&s.jsx(S9,{isOpen:!0,onClose:()=>R(null),imageUrl:I.imageUrl,isDark:r,runExpandImage:p,imageConfigs:f,showJimengModels:b,onSuccess:Z,onStartGenerate:B,onError:ge=>{var le;v==null||v(ge.message||"扩图失败");const ne=(le=A.current)==null?void 0:le.previewNodeId;ne&&c(fe=>fe.map(be=>be.id===ne?{...be,_expandPending:void 0,_expandTaskStartTime:void 0}:be)),A.current=null}})]})},rw=_.memo(({size:e=18,className:t})=>s.jsx("svg",{width:e,height:e,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",className:t??"shrink-0","aria-hidden":!0,children:s.jsx("path",{fill:"currentColor",d:"M3.05 9.32 Q11.5 5.4 20.08 13.92 L20.52 15.98 Q11.95 11.22 3.4 10.46 Z"})}));rw.displayName="DoodleStrokeIcon";const Jie=({collapsed:e=!1,onToggleCollapsed:t,isDark:n,activeTool:r,historyOpen:i,charactersOpen:a,klingSubjectsOpen:o=!1,rhAppLibraryOpen:l=!1,seedanceRolesOpen:c=!1,showSeedanceRolesTool:u=!0,projectPanelOpen:d=!1,scriptWriterOpen:h=!1,poseLibraryOpen:p=!1,chatOpen:f,textToolActive:b=!1,doodleToolActive:g=!1,hideConnections:y=!1,onSetActiveTool:w,onToggleHistory:v,onToggleCharacters:m,onToggleKlingSubjects:z,onToggleRhAppLibrary:C,onToggleSeedanceRoles:E,onToggleProjectPanel:I,onToggleScriptWriter:R,onTogglePoseLibrary:A,onToggleChat:O,onToggleTextTool:F,onToggleDoodleTool:L,onToggleConnections:X,onSaveProject:T,onLoadProject:q,onImportWorkflow:H,onOpenSkillToWorkflow:J,onToggleAlignPanel:Z,onCategorizedExport:B})=>{const V=n?"bg-white text-zinc-900 shadow-none":"bg-black text-white shadow-none",N=`flex flex-col py-2 rounded-2xl border ${n?"":"shadow-md"} transition-all duration-300 ${n?"bg-zinc-900 border-zinc-800":"bg-[#f6f6f6] border-zinc-200"}`;return e?s.jsxs("div",{className:`${N} items-center px-1.5 gap-1.5 left-toolbar-fast-tooltip ${n?"left-toolbar-fast-tooltip--dark":"left-toolbar-fast-tooltip--light"}`,children:[t&&s.jsx("button",{onClick:j=>{j.preventDefault(),j.stopPropagation(),t()},className:`py-0.5 px-1.5 rounded transition-all shrink-0 ${n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800":"text-zinc-500 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":"展开工具栏",children:s.jsx(bm,{size:12})}),F&&s.jsx("button",{onClick:j=>{j.preventDefault(),j.stopPropagation(),F(j)},className:`p-2 rounded-lg transition-all ${b?V:n?"text-zinc-400 hover:bg-zinc-800 hover:text-zinc-200":"text-zinc-500 hover:bg-zinc-200/50 hover:text-zinc-800"}`,"data-tip":"文本工具(在画布拖拽框选后直接输入)",children:s.jsx(Lv,{size:18})}),L&&s.jsx("button",{onClick:j=>{j.preventDefault(),j.stopPropagation(),L(j)},className:`p-2 rounded-lg transition-all ${g?V:n?"text-zinc-400 hover:bg-zinc-800 hover:text-zinc-200":"text-zinc-500 hover:bg-zinc-200/50 hover:text-zinc-800"}`,"data-tip":"涂鸦画笔(在空白画布上拖拽手绘)",children:s.jsx(rw,{size:18})}),s.jsx("button",{onClick:j=>{j.preventDefault(),j.stopPropagation(),v(j)},className:`p-2 rounded-lg transition-all ${i?V:n?"text-zinc-400 hover:bg-zinc-800 hover:text-zinc-200":"text-zinc-500 hover:bg-zinc-200/50 hover:text-zinc-800"}`,"data-tip":"生成历史",children:s.jsx(t$,{size:18})}),A&&s.jsx("button",{onClick:j=>{j.preventDefault(),j.stopPropagation(),A(j)},className:`p-2 rounded-lg transition-all ${p?V:n?"text-zinc-400 hover:bg-zinc-800 hover:text-zinc-200":"text-zinc-500 hover:bg-zinc-200/50 hover:text-zinc-800"}`,"data-tip":"本地资料查阅",children:s.jsx(Pv,{size:18})}),I&&s.jsx("button",{onClick:j=>{j.preventDefault(),j.stopPropagation(),I(j)},className:`p-2 rounded-lg transition-all ${d?V:n?"text-zinc-400 hover:bg-zinc-800 hover:text-zinc-200":"text-zinc-500 hover:bg-zinc-200/50 hover:text-zinc-800"}`,"data-tip":"项目管理",children:s.jsx(dj,{size:18})}),s.jsx("button",{onClick:j=>{j.preventDefault(),j.stopPropagation(),O(j)},className:`p-2 rounded-lg transition-all ${f?V:n?"text-zinc-400 hover:bg-zinc-800 hover:text-zinc-200":"text-zinc-500 hover:bg-zinc-200/50 hover:text-zinc-800"}`,"data-tip":"AI对话",children:s.jsx(Wp,{size:18})})]}):s.jsxs("div",{className:`${N} items-center px-1.5 gap-1.5 left-toolbar-fast-tooltip ${n?"left-toolbar-fast-tooltip--dark":"left-toolbar-fast-tooltip--light"}`,children:[t&&s.jsx("button",{onClick:j=>{j.preventDefault(),j.stopPropagation(),t()},className:`py-0.5 px-1.5 rounded transition-all shrink-0 ${n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50":"text-zinc-500 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":"收缩工具栏(仅显示常用功能)",children:s.jsx(Ei,{size:12})}),s.jsx("button",{onClick:j=>{j.preventDefault(),j.stopPropagation(),Z()},className:`p-2 rounded-lg transition-all ${n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50":"text-zinc-500 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":"节点对齐(按 ` 或点击,需选中 ≥2 个节点)",children:s.jsx(bG,{size:18})}),F&&s.jsx("button",{onClick:j=>{j.preventDefault(),j.stopPropagation(),F(j)},className:`p-2 rounded-lg transition-all ${b?V:n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50":"text-zinc-500 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":"文本工具(在画布拖拽框选后直接输入)",children:s.jsx(Lv,{size:18})}),L&&s.jsx("button",{onClick:j=>{j.preventDefault(),j.stopPropagation(),L(j)},className:`p-2 rounded-lg transition-all ${g?V:n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50":"text-zinc-500 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":"涂鸦画笔(在空白画布上拖拽手绘)",children:s.jsx(rw,{size:18})}),X&&s.jsx("button",{onClick:j=>{j.preventDefault(),j.stopPropagation(),X()},className:`p-2 rounded-lg transition-all ${y?V:n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50":"text-zinc-500 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":y?"显示连接线":"隐藏连接线",children:s.jsx(I5,{size:18})}),s.jsx("button",{onClick:j=>{j.preventDefault(),j.stopPropagation(),v(j)},className:`p-2 rounded-lg transition-all ${i?V:n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50":"text-zinc-500 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":"生成历史",children:s.jsx(t$,{size:18})}),s.jsx("button",{onClick:j=>{j.preventDefault(),j.stopPropagation(),m(j)},className:`p-2 rounded-lg transition-all ${a?V:n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50":"text-zinc-500 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":"角色库",children:s.jsx(_q,{size:18})}),u&&E&&s.jsx("button",{onClick:j=>{j.preventDefault(),j.stopPropagation(),E(j)},className:`p-2 rounded-lg transition-all ${c?V:n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50":"text-zinc-500 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":"Seedance 过审角色(素材审核)",children:s.jsx($G,{size:18})}),A&&s.jsx("button",{onClick:j=>{j.preventDefault(),j.stopPropagation(),A(j)},className:`p-2 rounded-lg transition-all ${p?V:n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50":"text-zinc-500 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":"本地资料查阅",children:s.jsx(Pv,{size:18})}),z&&s.jsx("button",{onClick:j=>{j.preventDefault(),j.stopPropagation(),z(j)},className:`p-2 rounded-lg transition-all ${o?V:n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50":"text-zinc-500 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":"可灵主体库",children:s.jsx(aa,{size:18})}),C&&s.jsx("button",{onClick:j=>{j.preventDefault(),j.stopPropagation(),C(j)},className:`p-2 rounded-lg transition-all ${l?V:n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50":"text-zinc-500 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":"RH AI 应用库",children:s.jsx(ym,{size:18})}),I&&s.jsx("button",{onClick:j=>{j.preventDefault(),j.stopPropagation(),I(j)},className:`p-2 rounded-lg transition-all ${d?V:n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50":"text-zinc-500 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":"项目管理(工作流+画布素材,不含生成历史)",children:s.jsx(dj,{size:18})}),R&&s.jsx("button",{onClick:j=>{j.preventDefault(),j.stopPropagation(),R(j)},className:`p-2 rounded-lg transition-all ${h?V:n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50":"text-zinc-500 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":"剧本创作",children:s.jsx(E5,{size:18})}),s.jsx("div",{className:`w-6 h-px shrink-0 ${n?"bg-zinc-800":"bg-zinc-200"}`}),s.jsx("button",{onClick:j=>{j.preventDefault(),j.stopPropagation(),O(j)},className:`p-2 rounded-lg transition-all ${f?V:n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50":"text-zinc-500 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":"AI 对话",children:s.jsx(Wp,{size:18})}),s.jsx("div",{className:`w-6 h-px shrink-0 ${n?"bg-zinc-800":"bg-zinc-200"}`}),s.jsx("button",{onClick:T,className:`p-2 rounded-lg transition-all ${n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50":"text-zinc-500 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":"保存项目",children:s.jsx(xu,{size:18})}),s.jsx("button",{onClick:H,className:`p-2 rounded-lg transition-all ${n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50":"text-zinc-500 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":"导入工作流",children:s.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[s.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),s.jsx("polyline",{points:"14 2 14 8 20 8"}),s.jsx("path",{d:"M7 12h8m0 0l-3-3m3 3l-3 3"})]})}),J&&s.jsx("button",{onClick:j=>{j.preventDefault(),j.stopPropagation(),J()},className:`p-2 rounded-lg transition-all ${n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50":"text-zinc-500 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":"从 Skill 生成工作流",children:s.jsx(WG,{size:18})})]})},Zie=_.memo(Jie),qN=({zoom:e,onZoomChange:t,isDark:n=!0,minZoom:r=.1,maxZoom:i=3,isZoomLocked:a=!1,onZoomLockChange:o,useFastTooltip:l=!1})=>{const c=R=>l?{"data-tip":R}:{title:R},[u,d]=_.useState(!1),[h,p]=_.useState(!1),[f,b]=_.useState(Math.round(e*100).toString()),[g,y]=_.useState(!1),w=_.useRef(null),v=_.useRef(null),m=_.useRef(null),z=R=>(Math.log(R)-Math.log(r))/(Math.log(i)-Math.log(r))*100,C=R=>{const A=R/100;return Math.exp(Math.log(r)+A*(Math.log(i)-Math.log(r)))},E=z(e);_.useEffect(()=>{if(!u)return;const R=A=>{m.current&&!m.current.contains(A.target)&&d(!1)};return document.addEventListener("mousedown",R),()=>document.removeEventListener("mousedown",R)},[u]),_.useEffect(()=>{if(!g)return;const R=O=>{if(!w.current)return;const F=w.current.getBoundingClientRect(),L=O.clientX-F.left,X=Math.max(0,Math.min(100,L/F.width*100)),T=C(X);t(Math.round(T*100)/100)},A=()=>{y(!1)};return document.addEventListener("mousemove",R),document.addEventListener("mouseup",A),()=>{document.removeEventListener("mousemove",R),document.removeEventListener("mouseup",A)}},[g,r,i,t,C]);const I=R=>{if(!w.current)return;const A=w.current.getBoundingClientRect(),O=R.clientX-A.left,F=Math.max(0,Math.min(100,O/A.width*100)),L=C(F);t(Math.round(L*100)/100)};return s.jsxs("div",{ref:m,className:"relative flex items-center gap-1",children:[o&&s.jsx("button",{onClick:()=>{o(!a)},className:`p-0.5 rounded transition-colors ${a?n?"bg-blue-600/20 text-blue-400 hover:bg-blue-600/30":"bg-blue-100 text-blue-600 hover:bg-blue-200":n?"hover:bg-zinc-800 text-zinc-400 hover:text-zinc-200":"hover:bg-zinc-200 text-zinc-500 hover:text-zinc-800"}`,...c(a?"解锁缩放":"锁定缩放"),children:a?s.jsx(eq,{size:13}):s.jsx(QG,{size:13})}),u?s.jsxs("div",{className:`fixed flex items-center gap-1.5 px-2.5 py-1.5 rounded-lg border shadow-lg z-50 transition-all ${n?"bg-zinc-900/95 border-zinc-700 text-zinc-300":"bg-white/95 border-zinc-200 text-zinc-700"}`,style:{minWidth:"220px",top:"60px",right:"16px"},children:[s.jsx("button",{onClick:()=>{const R=Math.max(r,e/1.2);t(Math.round(R*100)/100)},className:`p-0.5 rounded transition-colors flex-shrink-0 ${n?"hover:bg-zinc-800 text-zinc-400 hover:text-zinc-200":"hover:bg-zinc-200 text-zinc-500 hover:text-zinc-800"}`,...c("缩小"),children:s.jsx(GP,{size:14})}),s.jsxs("div",{ref:w,className:`flex-1 h-1 rounded-full cursor-pointer relative group ${n?"bg-zinc-700":"bg-zinc-300"}`,onMouseDown:R=>{y(!0),I(R)},style:{minWidth:"60px"},children:[s.jsx("div",{className:`h-full rounded-full transition-all ${n?"bg-blue-600":"bg-blue-500"}`,style:{width:`${E}%`}}),s.jsx("div",{className:`absolute top-1/2 -translate-y-1/2 w-2 h-2 rounded-full transition-all ${n?"bg-blue-500 group-hover:bg-blue-400":"bg-blue-400 group-hover:bg-blue-500"}`,style:{left:`${E}%`,transform:"translate(-50%, -50%)"}})]}),s.jsx("div",{className:`w-10 text-center text-xs font-medium cursor-pointer rounded px-1.5 py-0.5 transition-colors flex-shrink-0 ${n?"hover:bg-zinc-800 text-zinc-300":"hover:bg-zinc-200 text-zinc-700"}`,onDoubleClick:()=>{p(!0),b(Math.round(e*100).toString()),setTimeout(()=>{var R;(R=v.current)==null||R.select()},0)},...c("双击输入自定义缩放比例"),children:h?s.jsx("input",{ref:v,type:"number",value:f,onChange:R=>b(R.target.value),onBlur:()=>{const R=parseInt(f,10);!isNaN(R)&&R>=r*100&&R<=i*100&&t(R/100),p(!1)},onKeyDown:R=>{if(R.key==="Enter"){const A=parseInt(f,10);!isNaN(A)&&A>=r*100&&A<=i*100&&t(A/100),p(!1)}else R.key==="Escape"&&p(!1)},min:Math.round(r*100),max:Math.round(i*100),className:`w-full text-center text-xs font-medium rounded px-0.5 py-0.5 ${n?"bg-zinc-800 border border-blue-500 text-white":"bg-white border border-blue-400 text-black"}`}):`${Math.round(e*100)}%`}),s.jsx("button",{onClick:()=>{const R=Math.min(i,e*1.2);t(Math.round(R*100)/100)},className:`p-0.5 rounded transition-colors flex-shrink-0 ${n?"hover:bg-zinc-800 text-zinc-400 hover:text-zinc-200":"hover:bg-zinc-200 text-zinc-500 hover:text-zinc-800"}`,...c("放大"),children:s.jsx(Lw,{size:14})}),s.jsx("button",{onClick:()=>d(!1),className:`p-0.5 rounded transition-colors flex-shrink-0 ${n?"hover:bg-zinc-800 text-zinc-400 hover:text-zinc-200":"hover:bg-zinc-200 text-zinc-500 hover:text-zinc-800"}`,...c("关闭"),children:s.jsx(Qr,{size:14})})]}):s.jsxs("div",{className:`text-xs font-medium cursor-pointer rounded px-2 py-0.5 transition-colors ${n?"hover:bg-zinc-800 text-zinc-300":"hover:bg-zinc-200 text-zinc-700"}`,onDoubleClick:()=>d(!0),...c("双击打开缩放控制面板"),children:[Math.round(e*100),"%"]})]})},O$="#dfdfdf",L$="#09090b",Qie=({rightToolbarCollapsed:e=!1,onToggleRightToolbarCollapsed:t,isDark:n,theme:r,projectName:i,isEditingProjectName:a,isDownloading:o,downloadProgress:l,currentZoom:c,isSidebarOpen:u=!1,isZoomLocked:d=!1,nodeBorderVisibilityMode:h="visible",onThemeToggle:p,onProjectNameChange:f,onEditProjectNameStart:b,onEditProjectNameEnd:g,onClearCanvas:y,onOpenSettings:w,onOpenStorageManage:v,onDownloadSelected:m,onZoomChange:z,onZoomLockChange:C,onNodeBorderVisibilityModeChange:E,showCanvasGrid:I=!0,onCanvasGridToggle:R,showCanvasSnap:A=!1,onCanvasSnapToggle:O,showCanvasMinimap:F=!0,onCanvasMinimapToggle:L,canvasBackgroundColor:X,canvasBackgroundDefaultHex:T,onCanvasBackgroundColorChange:q,projectNameInputRef:H,showNewProjectSaveHint:J=!1})=>{const[Z,B]=_.useState(!1),V=_.useRef(null),N=T??(n?L$:O$);_.useEffect(()=>{if(!Z)return;const Y=se=>{V.current&&!V.current.contains(se.target)&&B(!1)};return document.addEventListener("mousedown",Y,!0),()=>document.removeEventListener("mousedown",Y,!0)},[Z]);const j=()=>{if(!E)return;E(h==="visible"?"hide-on-pan":h==="hide-on-pan"?"hidden":"visible")},k=()=>{switch(h){case"visible":return s.jsx(cl,{size:13});case"hide-on-pan":return s.jsx(rf,{size:13});case"hidden":return s.jsx(nm,{size:13})}},W=()=>{switch(h){case"visible":return"边框";case"hide-on-pan":return"拖动隐藏";case"hidden":return"无边框"}},M=()=>{switch(h){case"visible":return"节点边框始终显示(点击切换为拖动时隐藏)";case"hide-on-pan":return"拖动画布时隐藏节点边框(点击切换为全局隐藏)";case"hidden":return"节点边框全局隐藏(点击切换为始终显示)"}};return s.jsxs("div",{className:`absolute top-0 left-0 right-0 h-14 flex items-center justify-between z-50 pointer-events-none ${n?"shadow-none":""}`,children:[s.jsxs("div",{className:`absolute pointer-events-auto transition-all duration-300 ${u?"left-[256px]":"left-4"}`,children:[s.jsxs("div",{className:`relative flex items-center gap-2 px-2 py-1.5 rounded-full border ${n?"bg-zinc-900 border-zinc-800":"bg-[#f6f6f6] border-black/10"}`,children:[s.jsx(JQ,{isDark:n,size:28}),a?s.jsx("input",{ref:H,type:"text",value:i,onChange:Y=>f(Y.target.value),onBlur:g,onKeyDown:Y=>{Y.key==="Enter"&&g()},placeholder:"请在此处输入项目名",className:`px-2 py-0.5 text-xs border rounded-full outline-none project-name-input ${n?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-[#f6f6f6] border-zinc-300 text-zinc-800"}`,style:{minWidth:"100px",maxWidth:"200px"}}):s.jsx("span",{onClick:b,className:`text-xs cursor-pointer hover:underline pr-1 ${n?"text-zinc-400":"text-zinc-500"}`,title:"点击编辑项目名称",children:i||"未命名项目"})]}),J&&s.jsx("p",{className:"absolute top-full left-0 mt-1.5 text-[11px] whitespace-nowrap pointer-events-none text-zinc-500",children:"记得保存在项目管理里保存奥~"})]}),s.jsxs("div",{className:`absolute right-4 flex flex-row items-center gap-1 top-navbar-fast-tooltip ${n?"top-navbar-fast-tooltip--dark":"top-navbar-fast-tooltip--light"} ${e?"py-1.5 px-2":"px-2 py-1.5"} rounded-full border ${n?"shadow-none":"shadow-md"} transition-all duration-300 pointer-events-auto ${n?"bg-zinc-900 border-zinc-800":"bg-[#f6f6f6] border-zinc-200"}`,children:[t&&s.jsx("button",{onClick:Y=>{Y.preventDefault(),Y.stopPropagation(),t()},className:`py-0.5 px-1.5 rounded transition-all shrink-0 ${n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50":"text-zinc-500 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":e?"展开工具栏":"收缩工具栏(仅显示常用功能)",children:e?s.jsx(Ja,{size:12}):s.jsx(PP,{size:12})}),e?s.jsxs(s.Fragment,{children:[c!==void 0&&z&&s.jsx(qN,{zoom:c,onZoomChange:z,isDark:n,minZoom:.1,maxZoom:3,isZoomLocked:d,onZoomLockChange:C,useFastTooltip:!0}),s.jsx("div",{className:`w-px h-4.5 ${n?"bg-zinc-700":"bg-zinc-300"}`}),s.jsxs("button",{onClick:m,disabled:o,className:`flex items-center gap-1 px-2 py-0.5 rounded-lg text-xs font-medium transition-all ${o?n?"bg-blue-600/30 text-blue-300 cursor-wait":"bg-blue-100 text-blue-700 cursor-wait":n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50":"text-zinc-500 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":"批量下载选中的图片/视频/音频节点",children:[s.jsx(mu,{size:13}),s.jsx("span",{children:"下载"})]}),v&&s.jsxs("button",{onClick:v,className:`flex items-center gap-1 px-2 py-0.5 rounded-lg text-xs font-medium transition-all ${n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50":"text-zinc-500 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":"本地存储管理",children:[s.jsx(hm,{size:13}),s.jsx("span",{children:"存储"})]})]}):s.jsxs(s.Fragment,{children:[c!==void 0&&z&&s.jsx(qN,{zoom:c,onZoomChange:z,isDark:n,minZoom:.1,maxZoom:3,isZoomLocked:d,onZoomLockChange:C,useFastTooltip:!0}),s.jsx("div",{className:`w-px h-4.5 ${n?"bg-zinc-700":"bg-zinc-300"}`}),s.jsxs("button",{onClick:m,disabled:o,className:`flex items-center gap-1 px-2 py-0.5 rounded-lg text-xs font-medium transition-colors relative overflow-hidden ${o?n?"bg-blue-600/30 text-blue-300 cursor-wait":"bg-blue-100 text-blue-700 cursor-wait":n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50":"text-zinc-600 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":"批量下载选中的图片/视频/音频节点(音频将转为 MP3 保存到指定目录)",children:[o&&l&&l.total>0&&s.jsx("div",{className:"absolute left-0 top-0 bottom-0 bg-blue-500/30 transition-all duration-300 rounded-lg",style:{width:`${l.current/l.total*100}%`}}),s.jsx(mu,{size:13,className:o?"animate-pulse":""}),s.jsx("span",{className:"relative z-10",children:"下载"})]}),s.jsxs("button",{onClick:p,className:`flex items-center gap-1 px-2 py-0.5 rounded-lg text-xs font-medium transition-colors ${n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50":"text-zinc-600 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":"切换明暗主题",children:[r==="dark"?s.jsx(HP,{size:13,className:"text-amber-400"}):s.jsx(sq,{size:13,className:"text-blue-500"}),s.jsx("span",{children:r==="dark"?"亮色":"暗色"})]}),q&&X&&s.jsxs("div",{ref:V,className:"relative",children:[s.jsxs("button",{type:"button",onClick:Y=>{Y.preventDefault(),Y.stopPropagation(),B(se=>!se)},className:`flex items-center gap-1 px-2 py-0.5 rounded-lg text-xs font-medium cursor-pointer transition-colors ${n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50":"text-zinc-600 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":"画布背景色(圆点网格不变,仅底层颜色;按当前明暗主题分别记忆)","aria-expanded":Z,"aria-haspopup":"dialog",children:[s.jsx("span",{className:`w-[18px] h-[18px] rounded border shrink-0 ${n?"border-zinc-600":"border-zinc-300"}`,style:{backgroundColor:/^#[0-9a-fA-F]{6}$/.test(X)?X:N}}),s.jsx("span",{children:"画布色"})]}),Z&&s.jsxs("div",{className:`absolute z-[200] right-0 top-full mt-2 min-w-[188px] p-2 rounded-xl border shadow-xl ${n?"bg-zinc-900 border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:Y=>Y.stopPropagation(),role:"dialog","aria-label":"画布背景色",children:[s.jsxs("button",{type:"button",className:`w-full flex items-center justify-center gap-1.5 py-2 px-2 rounded-lg text-[11px] font-medium transition-colors ${n?"bg-zinc-800 text-zinc-200 hover:bg-zinc-700":"bg-zinc-100 text-zinc-800 hover:bg-zinc-200"}`,onClick:()=>{q(N),B(!1)},children:[s.jsx(P5,{size:12}),"恢复默认"]}),s.jsxs("label",{className:`mt-2 flex flex-col gap-1 text-[11px] cursor-pointer ${n?"text-zinc-400":"text-zinc-600"}`,children:[s.jsx("span",{children:"自定义颜色"}),s.jsx("input",{type:"color",value:/^#[0-9a-fA-F]{6}$/.test(X)?X:N,onChange:Y=>q(Y.target.value),className:"h-9 w-full min-w-0 cursor-pointer rounded border-0 bg-transparent"})]})]})]}),s.jsx("button",{onClick:y,className:`px-2 py-0.5 rounded-lg text-xs font-medium transition-colors ${n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50":"text-zinc-600 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":"清空画布",children:"清空"}),R&&s.jsxs("button",{onClick:R,className:`flex items-center gap-1 px-2 py-0.5 rounded-lg text-xs font-medium transition-colors ${I?n?"text-zinc-200 bg-zinc-700/50":"text-zinc-800 bg-zinc-200/50":n?"text-zinc-500 hover:text-zinc-300 hover:bg-zinc-800/50":"text-zinc-500 hover:text-zinc-700 hover:bg-zinc-200/50"}`,"data-tip":I?"隐藏画布网格":"显示画布网格",children:[s.jsx(gu,{size:13}),s.jsx("span",{children:"网格"})]}),O&&s.jsxs("button",{onClick:O,className:`flex items-center gap-1 px-2 py-0.5 rounded-lg text-xs font-medium transition-colors ${A?n?"text-zinc-200 bg-zinc-700/50":"text-zinc-800 bg-zinc-200/50":n?"text-zinc-500 hover:text-zinc-300 hover:bg-zinc-800/50":"text-zinc-500 hover:text-zinc-700 hover:bg-zinc-200/50"}`,"data-tip":A?"关闭网格吸附":"开启网格吸附(拖拽时对齐网格和节点)",children:[s.jsx(tq,{size:13}),s.jsx("span",{children:"吸附"})]}),L&&s.jsxs("button",{onClick:L,className:`flex items-center gap-1 px-2 py-0.5 rounded-lg text-xs font-medium transition-colors ${F?n?"text-zinc-200 bg-zinc-700/50":"text-zinc-800 bg-zinc-200/50":n?"text-zinc-500 hover:text-zinc-300 hover:bg-zinc-800/50":"text-zinc-500 hover:text-zinc-700 hover:bg-zinc-200/50"}`,"data-tip":F?"隐藏画布导航小窗":"显示画布导航小窗",children:[s.jsx(nq,{size:13}),s.jsx("span",{children:"导航"})]}),E&&s.jsxs("button",{onClick:j,className:`flex items-center gap-1 px-2 py-0.5 rounded-lg text-xs font-medium transition-colors ${h==="visible"?n?"text-zinc-200 bg-zinc-700/50":"text-zinc-800 bg-zinc-200/50":h==="hide-on-pan"?n?"text-blue-400 bg-blue-900/30":"text-blue-600 bg-blue-100/50":n?"text-zinc-500 hover:text-zinc-300 hover:bg-zinc-800/50":"text-zinc-500 hover:text-zinc-700 hover:bg-zinc-200/50"}`,"data-tip":M(),children:[k(),s.jsx("span",{children:W()})]}),s.jsx("div",{className:`w-px h-4.5 ${n?"bg-zinc-700":"bg-zinc-300"}`}),v&&s.jsxs("button",{onClick:v,className:`flex items-center gap-1 px-2 py-0.5 rounded-lg text-xs font-medium transition-colors ${n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50":"text-zinc-600 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":"本地存储管理",children:[s.jsx(hm,{size:13}),s.jsx("span",{children:"存储"})]}),s.jsxs("button",{onClick:w,className:`flex items-center gap-1 px-2 py-0.5 rounded-lg text-xs font-medium transition-colors ${n?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50":"text-zinc-600 hover:text-zinc-800 hover:bg-zinc-200/50"}`,"data-tip":"API 设置",children:[s.jsx(Ov,{size:13}),s.jsx("span",{children:"API 设置"})]})]})]})]})},eae=_.memo(Qie),$4="pose_reference_folders",sw="pose_reference_current",tae=/\.(png|jpe?g|gif|webp|bmp)$/i;function KN(e){return tae.test(e)}function XN(e){return e.replace(/\.[^.]+$/,"").trim()||e}function nae(){if(typeof window>"u")return!1;const e=window;return!!(e.__TAURI_INTERNALS__||e.__TAURI__)}async function n7(e){const t=[],n=await h$(e);for(const r of n)if(r.isFile&&KN(r.name)){const i=await dv(e,r.name);t.push({id:i,title:XN(r.name),category:"未分类",imageUrl:"",filePath:i})}else if(r.isDirectory){const i=await dv(e,r.name),a=await h$(i),o=r.name;for(const l of a)if(l.isFile&&KN(l.name)){const c=await dv(i,l.name);t.push({id:c,title:XN(l.name),category:o,imageUrl:"",filePath:c})}}return t}function rae(e){try{return decodeURIComponent(e)}catch{return e}}async function Ff(e){const t=rae(e),n=await xx(t),r=(t.split(".").pop()||"").toLowerCase(),i=r==="png"?"image/png":r==="gif"?"image/gif":r==="webp"?"image/webp":r==="bmp"?"image/bmp":"image/jpeg",a=new Blob([n],{type:i});return URL.createObjectURL(a)}async function sae(){const e=await bb({directory:!0,multiple:!1,title:"选择姿势参考图片所在文件夹"});if(!e)return null;const t=Array.isArray(e)?e[0]:e,n=await n7(t);return{folderPath:t,items:n}}async function iae(e){return n7(e)}async function aae(){if(typeof localStorage>"u")return{folderPaths:[],currentPath:null};try{const e=localStorage.getItem($4),t=localStorage.getItem(sw);let n=[];if(e){const i=JSON.parse(e);n=Array.isArray(i)?i:[]}if(n.length===0){const i=localStorage.getItem("pose_reference_folder");i&&(n=[i],localStorage.removeItem("pose_reference_folder"))}let r=null;if(t!==null)try{const i=parseInt(t,10);!Number.isNaN(i)&&i>=0&&i0&&(r=n[0]),r&&!n.includes(r)&&(r=n[0]??null),{folderPaths:n,currentPath:r}}catch(e){return console.warn("[PoseReference] loadFromStoredPath failed:",e),{folderPaths:[],currentPath:null}}}function N1(e,t){typeof localStorage>"u"||(localStorage.setItem($4,JSON.stringify(e)),t!==null?localStorage.setItem(sw,t):localStorage.removeItem(sw))}function YN(){typeof localStorage<"u"&&(localStorage.removeItem($4),localStorage.removeItem(sw))}function oae(e){return e.replace(/\.[^.]+$/,"").trim()||e}const lae=60,om=new Map,vx=[],r7="pose_reference_favorites";function cae(){try{const e=localStorage.getItem(r7);if(e){const t=JSON.parse(e);return new Set(Array.isArray(t)?t:[])}}catch{}return new Set}function uae(e){try{localStorage.setItem(r7,JSON.stringify([...e]))}catch{}}function JN(){for(;vx.length>lae&&vx.length>0;){const e=vx.shift(),t=om.get(e);t&&URL.revokeObjectURL(t),om.delete(e)}}const Yc=new Map,ZN=20;function QN(){if(Yc.size<=ZN)return;const e=[...Yc.keys()];for(let t=0;t{uae(p)},[p]);const z=_.useCallback(B=>{f(V=>{const N=new Set(V);return N.has(B)?N.delete(B):N.add(B),N})},[]),C=nae(),E=_.useCallback(async B=>{const V=Yc.get(B);if(V)return V;const N=await iae(B);return Yc.set(B,N),QN(),N},[]),I=_.useCallback(async()=>{if(C){u(!0),h(null);try{const{folderPaths:B,currentPath:V}=await aae();if(r(B),a(V),V){const N=await E(V);l(N)}else l([])}catch(B){h(B.message||"加载失败"),l([])}finally{u(!1)}}},[C,E]);_.useEffect(()=>{I()},[I]);const R=_.useCallback(async()=>{if(C){u(!0),h(null);try{const B=await sae();if(!B)return;const{folderPath:V,items:N}=B,j=n.includes(V)?n:[...n,V];Yc.set(V,N),QN(),r(j),a(V),l(N),N1(j,V)}catch(B){h(B.message||"选择文件夹失败")}finally{u(!1)}}},[C,n]),A=_.useCallback(async B=>{if(B===i||!n.includes(B))return;a(B),h(null);const V=Yc.get(B);if(V){l(V),N1(n,B);return}u(!0);try{const N=await E(B);l(N),N1(n,B)}catch(N){h(N.message||"加载失败"),l([])}finally{u(!1)}},[i,n,E]),O=_.useCallback(()=>{if(!i)return;const B=n.indexOf(i),V=n.filter(k=>k!==i);if(Yc.delete(i),r(V),V.length===0){a(null),l([]),YN();return}const N=V[Math.min(B,V.length-1)];a(N),N1(V,N);const j=Yc.get(N);j?l(j):(u(!0),E(N).then(k=>{l(k),Yc.set(N,k)}).catch(()=>l([])).finally(()=>u(!1)))},[i,n,E]),F=_.useCallback(B=>{const V=B.map((N,j)=>({id:`pose-file-${j}-${Date.now()}`,title:oae(N.name),category:"本地",imageUrl:URL.createObjectURL(N),file:N}));l(V),a(null),h(null)},[]),L=_.useCallback(()=>{YN(),Yc.clear(),r([]),a(null),l([]),h(null)},[]),X=_.useCallback(async()=>{if(!C)return;u(!0),h(null),w9();const B=!1;try{let V,N;if(!B){if(V=await Kw(),!V){g(!1),h("请先打开 Eagle 应用(或先启动「Eagle 素材库代理」)"),w([]),l([]);return}N=await z9()}if(g(!0),w(N),t("eagle"),N.length>0){m(N[0].id);const k=(await j$({folders:N[0].id,limit:500})).filter(W=>eE(W.ext)).map(W=>({id:`${up}${W.id}`,title:W.name.replace(/\.[^.]+$/,"").trim()||W.name,category:N[0].name,imageUrl:""}));t_.set(N[0].id,k),l(k)}else l([])}catch(V){const N=V.message||"连接 Eagle 失败";h(N.includes("请先打开")?N:`连接 Eagle 失败:${N}(请确保已打开 Eagle 应用;若使用代理请先启动「Eagle 素材库代理」)`),g(!1),l([])}finally{u(!1)}},[C]),T=_.useCallback(async B=>{if(B===v)return;m(B);const V=t_.get(B);if(V){l(V);return}u(!0),h(null);try{const N=await j$({folders:B,limit:500}),j=g4(y,B),k=N.filter(W=>eE(W.ext)).map(W=>({id:`${up}${W.id}`,title:W.name.replace(/\.[^.]+$/,"").trim()||W.name,category:(j==null?void 0:j.name)||"未分类",imageUrl:""}));t_.set(B,k),l(k)}catch(N){h(N.message||"加载失败"),l([])}finally{u(!1)}},[v,y]),q=_.useCallback(()=>{if(t("local"),l([]),m(null),h(null),i){const B=Yc.get(i);B?l(B):E(i).then(l).catch(()=>l([]))}else I()},[i,E,I]),H=i,J=_.useCallback(async B=>{if(B.imageUrl&&!B.filePath&&!B.id.startsWith(up))return B.imageUrl;let V=B.filePath;if(B.id.startsWith(up)){const j=B.id.slice(up.length),k=B.id,W=om.get(k);if(W)return W;if(V=await Gv(j)??void 0,!V)return null;try{const M=await Ff(V);return om.set(k,M),vx.push(k),JN(),M}catch{return null}}if(!V)return null;const N=om.get(V);if(N)return N;try{const j=await Ff(V);return om.set(V,j),vx.push(V),JN(),j}catch{return null}},[]),Z=_.useCallback(async B=>{let V=B.filePath;if(B.id.startsWith(up)){const N=B.id.slice(up.length),j=await $9(N),k=await Gv(N);if(V=j??k??void 0,j&&j!==k)try{return await Ff(j)}catch(W){if(console.warn("[usePoseReferenceLibrary] Eagle 原图路径读取失败,尝试缩略图:",W),k)try{return await Ff(k)}catch{}return null}if(V)try{return await Ff(V)}catch(W){return console.warn("[usePoseReferenceLibrary] readLocalFileAsBlobUrl failed:",W),null}return null}if(V)try{return await Ff(V)}catch(N){return console.warn("[usePoseReferenceLibrary] readLocalFileAsBlobUrl failed:",N),null}return B.file?URL.createObjectURL(B.file):B.imageUrl?B.imageUrl:null},[]);return{isTauri:C,dataSource:e,eagleAvailable:b,eagleFolders:y,currentEagleFolderId:v,setDataSource:t,connectEagle:X,switchEagleFolder:T,switchToLocal:q,folderPath:H,folderPaths:n,currentPath:i,items:o,loading:c,error:d,favoritedIds:p,toggleFavorite:z,chooseFolder:R,switchFolder:A,removeCurrentFolder:O,loadStored:I,setItemsFromFiles:F,clearFolder:L,getPreviewUrl:J,getInsertUrl:Z}}const pae={"gen-image":zh,"gen-video":Mx,"motion-control":Mx,"custom-agent":Ax,preview:cl,"local-save":xu,"text-node":Vo,"input-image":si,"video-input":aa,"video-analyze":ml,"storyboard-node":gj,"storyboard-chart-node":gj,"novel-input":E5,"gen-music":$c,"rh-app":si,"rh-comfy":si,"jimeng-super-resolution":si,"table-editor-node":Pw,"inpaint-crop":ml,"inpaint-stitch":ml},fae={"gen-image":"AI 绘图生成","gen-video":"AI 视频生成","motion-control":"动作迁移","custom-agent":"自定义 Agent",preview:"预览节点","local-save":"本地保存","text-node":"文本节点","input-image":"图片输入","video-input":"视频输入","video-analyze":"视频分析","storyboard-node":"分镜视表","storyboard-chart-node":"分镜图表","novel-input":"小说输入","gen-music":"AI 音乐生成","rh-app":"RH 应用","rh-comfy":"RH Comfy","jimeng-super-resolution":"智能超清","table-editor-node":"表格编辑器","inpaint-crop":"裁剪局部重绘","inpaint-stitch":"无缝拼回"},mae=({visible:e,nodeId:t,options:n,onSelect:r,onClose:i,isDark:a=!0,isCollapsedFloating:o=!1})=>{const[l,c]=_.useState(null),u=_.useCallback(b=>{r(b)},[r]);if(!e||n.length===0)return null;const d=36,h=o?80:65,p=0,f=(b,g)=>{const y=Math.PI*2/3,w=-y/2,v=y/(g-1||1),m=w+v*b,z=h+h*Math.cos(m),C=p+h*Math.sin(m);return{x:z,y:C,angle:m}};return s.jsx("div",{className:"absolute z-0",style:{right:"-16px",top:"50%",transform:"translateY(-50%)",pointerEvents:"auto"},children:n.map((b,g)=>{const y=pae[b.type],w=fae[b.type]||b.label,v=l===g,{x:m,y:z}=f(g,n.length);return s.jsx("div",{className:"absolute",style:{left:`${m}px`,top:`${z}px`,transform:"translate(-50%, -50%)"},children:s.jsxs("button",{onClick:()=>u(b),onMouseEnter:()=>c(g),onMouseLeave:()=>c(null),className:`flex items-center justify-center gap-2 shadow-lg transition-all duration-200 ${v?"rounded-full px-3":"rounded-full"} ${a?"bg-zinc-800 hover:bg-zinc-700 border border-zinc-700":"bg-white hover:bg-zinc-50 border border-zinc-300"}`,style:{height:`${d}px`,minWidth:`${d}px`,width:v?"auto":`${d}px`},onMouseDown:C=>C.stopPropagation(),children:[y&&s.jsx(y,{size:16,className:a?"text-zinc-300":"text-zinc-600"}),v&&s.jsx("span",{className:`text-xs font-medium whitespace-nowrap ${a?"text-zinc-100":"text-zinc-900"}`,children:w})]})},b.type)})})},gae=150,iw=new Map;let n_=null;function s7(){return n_||(n_=new ResizeObserver(e=>{for(const t of e){const n=iw.get(t.target);if(!n)continue;const{width:r,height:i}=t.contentRect;fO(n.nodeId,r,i),n.debounceId!==null&&clearTimeout(n.debounceId),n.debounceId=setTimeout(()=>{var a;n.debounceId=null,(a=n.onEdgeUpdate)==null||a.call(n,n.nodeId)},gae)}})),n_}function xae(e,t,n){iw.set(e,{nodeId:t,onEdgeUpdate:n,debounceId:null}),s7().observe(e)}function bae(e){const t=iw.get(e);(t==null?void 0:t.debounceId)!==null&&clearTimeout(t.debounceId),iw.delete(e),s7().unobserve(e)}const yae=new URL(""+new URL("gemini-color-BRjDr-0b.webp",import.meta.url).href,import.meta.url).href,vae=new URL(""+new URL("openai-DM5htlBi.webp",import.meta.url).href,import.meta.url).href,wae=new URL(""+new URL("openai bai-C9wdsUvK.webp",import.meta.url).href,import.meta.url).href,_ae=new URL(""+new URL("jimeng-color-CtBciSlW.webp",import.meta.url).href,import.meta.url).href,zae=new URL(""+new URL("nanobanana-color-Re8s94pO.webp",import.meta.url).href,import.meta.url).href,$ae=new URL(""+new URL("qwen-color-ig8k3JUL.webp",import.meta.url).href,import.meta.url).href;function Sae(e,t){const n=(e||"").toLowerCase();return n.includes("gemini")?yae:n.includes("nano-banana")?zae:n.includes("qwen-image-edit")?$ae:n.includes("gpt-image")||n.includes("gpt-4o-image")||n.includes("openai")?t?wae:vae:n.includes("jimeng")?_ae:null}const jae=300,Cae=380;function Nae(e,t){const n=document.elementFromPoint(e,t);if(!n)return!1;const r=n.closest("textarea");if(r instanceof HTMLTextAreaElement&&r.selectionStart!==r.selectionEnd)return!0;const i=n.closest("input");if(i instanceof HTMLInputElement&&["text","search","url","tel","email","password",""].includes(i.type||"text")&&typeof i.selectionStart=="number"&&typeof i.selectionEnd=="number"&&i.selectionStart!==i.selectionEnd)return!0;const a=typeof document.getSelection=="function"?document.getSelection():null;if(a&&!a.isCollapsed&&a.rangeCount>0){const o=n.closest('[contenteditable="true"]');if(o&&a.anchorNode&&o.contains(a.anchorNode))return!0}return!1}const E1=new URL(""+new URL("openai-DM5htlBi.webp",import.meta.url).href,import.meta.url).href,I1=new URL(""+new URL("openai bai-C9wdsUvK.webp",import.meta.url).href,import.meta.url).href,tE=new URL(""+new URL("flux-CzJA5PDw.webp",import.meta.url).href,import.meta.url).href,nE=new URL(""+new URL("flux bai-CYYe7fkT.webp",import.meta.url).href,import.meta.url).href,rE=new URL("data:image/webp;base64,UklGRlILAABXRUJQVlA4WAoAAAAQAAAAfwIAfwIAQUxQSCsIAAABkEXbtulIN6q2bdu2bdu2bdu2bdu2bdtWKs3P02Ofc5O8GxGS0EYSJCma2Lurb0Bvw2mGfivtdxn/Y/yP8T/G/xj/Y/yP8T/G/2ipDFoO+qpNJOlQj9aXUhr/BH3dD08jIa6AHu1LGkJJ8Ql0fmRXNDL/J+g0JtSg51Av11nRSF3Uo62gdDYD9XJb7TSS6D3o3AtPKJVQ92lURSJBToMe7Xs2Qk3wFnQCCyoamfQTdDoSqusI6uX6Kxopj3q0LTZCGY16uf1OGon1CvYjE6EW84DO6ziKRJwHYT8yEWqMF6CX85RRNDL0J+j0I1T7LtTLjVE0ki8Q9SOTg1D6oe7JIDQS+THsRyZCzeMGnQ9JiPzO2g77kYlQIz1C/WdNRSM9UI82mlBt61EvN1PRSJbvsB+ZCKUj6l4KTiNh78B+ZCLUTN94x+VWw35kItQwt3nH5VrhfmQilMW843KpPsN+ZCKUJqh7K4zmk/7fs0lB+ge/hHq59mKQ/rNQL7fZJgXpXxl1H0ZknfT/QUr6v0PN5QqIQfofRb1cHzFI/7Gol9vnkIL0L+4BnecxpCD9Y8KW/qUVjQzRN9J/JBXp74b9IUVCGYC6JwI0n/R/n1j3Sf/qika6w/6QIgOl/1QxSP/OqHtR+0n/1FKQ/mFhS//6uk/6L+Od9L8WilCaoe7N0FKQ/ik/o5b+WXgn/ZsQaojLqJdro2ikDgOl/xzUy20Sg/SvgroPxCD9E74DHXc+KUj/IKdQL9dD0UhJD/+k/3jU3UtF+r/kn/QvAVv6RxeD9H+JmsuVlIL0dx5AvdxQMUj/Qah7TAzSP68bdN7E46D0Z92N42dVKUh/+zbUy01SNJKZgdK/K+peCCYF6Z/5G+h8TKb7pH9tMUj/JaiXWyoG6d8CdW/oPun/NZ2ikXn6Rvq34KD0592NY4ONCBTWN9L/fgTNJ/1/5BCD9D+NermuYpD+E1B3NwelP+9uHM+icVD6s+7GEViId9K//z9l3Y3j50AxSP/BqHvUxUDpz7sbx+u4mk/6e8qKQfpvR73cODFI/26oey6oGKT/d9jLiUH630G9XC1FIy1RjzZL/Q3vbhyzxSD9W6Lu9VAMlP68u3F8SSsF6a+ChQN9Ufm9VRt1lysOXsyT/hwM96S/FDIR9VknDpZ50t/OwTBP+nOw3JP+DAzzpD8Hyz3pz8EwT/pzsNyT/gwM86Q/B8s96c/BcE/6MzDMk/4cLPOkvxia6jNsp87B8E76p+Xgn8yT/mJoHdRdafyX/hag0r/bT9AZq/uk/7mgJl/p31QMrWrml/5SyGBuS3/jv/Q3/kv/+9pP+mf38ZP+W82A0n8baulf1k9f+hv/pb/xX/oPMP5Lf6+A9G+BurMtgqR/Fe0n/d/5+En/CajPOluDS/+8btA56jICSv9VqM9q+QpI/5TaT/pfNvJLfykkprdO+heyBpf+XX+Czjh/Iem/xNpP+s9FfdbMGlz6l/Dzlf6DTFzS/7wcpP9t1NI/qfFf+nsFpP+p/7bGf+lv/Jf+zVF3jo+f9P9qES79x6M+62LtJ/0HWoRL/2+opX8wo4f0T+fjJ/1XWftJ/926T/o/k4P0P2DNIf3jSqG2DZYc0v+j8V/6m7+l/0BLDun/Uw7Svwvqjjf8Sn8pZA7qs+ZGX+kfzegr/cXQTMZ/6e+HK/1zGD2k/yBfAekf6THovtF+0r+cNbj0b4a6c639pP8Gm5+Q9B+H+qyr9pP+Dmsg6Z/HDTrH5CD9Hxn/pb+Gk/43/IWkf2VvnfSPYAku/R27jR7SvzPqTvAXkv6LUZ/VtgiS/rNRn7Uw/kt/r4D0H/Dzf43xX/ob/6V/Aj9f6V9c+0n/F0YP6b/eR1f6G/+lv/Ff+tu9ddJ/sPFf+nsFpH9T1F1iBJT+rqO6T/qPRX3Wzfgv/S1Apf9yzkn/IOFAX3YxSH/nYdCTbbSRSgrWSf8RoCd7EIGW9L/EOelf1IM57nxikP5RnoCerIcYpL99B+jJ9jrEIP17gZ7seXQxSP9cPzDHU1IM0j/cXdCTDRWD9LetBT3Z8QAxSP+2qJ1cPFK170It/QsrCkn9BXSqikH6h7wKerJJcpD+C0BPdiGYGKR/fdROLpkYpH+i96BTl9ZZJ9SdqCgk6BnQky2Vg/SfgtrJhSaVMKyT/hVQO7n0Yvhu/VivQKeVHKT/Id0n/YfpPulfJJCD30w7C/VZS85J/+5ykP7bQU+2Rw7Svyfsb6YVg/TP8h21k9N90n8IC6X/HhrSfw3sb6YVg/Rvrfukf6rPHJT+/Tkn/UNcQe3k5CD95+s+6V/XSyf9a4tB+gc5zUPpz7knp0k8lP6ce3IqD/tdMHSf9G/JQum/lIb0P8jBd8FI8YlzT05DUL8Lhhykfz635pP+kR+jfhcM3Sf9d1OT/pz7rGJ33Sf9M6OW/oXEIP3D3kH9LhhikP5qte6T/i1hvwuG7pP+5XSf9J8gB+k/D/W7YMhB+leF/S4YLJT+VRWFJPTSSf+5cpD+E2B/M60YpH9Jj8aR/nVo/GfBS9CTNafVJt5c6T+Ig9I/6LmfjHtyyuulk/5d5CD9t6GW/nYxSP+u3mDpPwb1WXca0v826MkGykH6LwE92VE5SP/moCd7LQfpn/Iz6JRlofQfQkP6XwY92Xg5SP85uk/6VwE92QdBSP93oFNLDtL/FOjJ5shB+o8DPdl1OUj/Eqilf1rdJ/2biUH6O3aDnmylEoP0H4ha+oenlb7LQV80pH/UpaAny6K032X8j/E/xv8Y/2P8j/E/xv8Y/6OnogAAVlA4IAADAADwWACdASqAAoACPhkMhUIhBAEABABhLS3cLuwjaAE9gHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ9YAA/v/8RMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",import.meta.url).href,sE=new URL("data:image/webp;base64,UklGRpwLAABXRUJQVlA4WAoAAAAQAAAAfwIAfwIAQUxQSCsIAAABkEXbtulIN6q2bdu2bdu2bdu2bdu2bdtWKs3P02Ofc5O8GxGS0EYSJCma2Lurb0Bvw2mGfivtdxn/Y/yP8T/G/xj/Y/yP8T/G/2ipDFoO+qpNJOlQj9aXUhr/BH3dD08jIa6AHu1LGkJJ8Ql0fmRXNDL/J+g0JtSg51Av11nRSF3Uo62gdDYD9XJb7TSS6D3o3AtPKJVQ92lURSJBToMe7Xs2Qk3wFnQCCyoamfQTdDoSqusI6uX6Kxopj3q0LTZCGY16uf1OGon1CvYjE6EW84DO6ziKRJwHYT8yEWqMF6CX85RRNDL0J+j0I1T7LtTLjVE0ki8Q9SOTg1D6oe7JIDQS+THsRyZCzeMGnQ9JiPzO2g77kYlQIz1C/WdNRSM9UI82mlBt61EvN1PRSJbvsB+ZCKUj6l4KTiNh78B+ZCLUTN94x+VWw35kItQwt3nH5VrhfmQilMW843KpPsN+ZCKUJqh7K4zmk/7fs0lB+ge/hHq59mKQ/rNQL7fZJgXpXxl1H0ZknfT/QUr6v0PN5QqIQfofRb1cHzFI/7Gol9vnkIL0L+4BnecxpCD9Y8KW/qUVjQzRN9J/JBXp74b9IUVCGYC6JwI0n/R/n1j3Sf/qika6w/6QIgOl/1QxSP/OqHtR+0n/1FKQ/mFhS//6uk/6L+Od9L8WilCaoe7N0FKQ/ik/o5b+WXgn/ZsQaojLqJdro2ikDgOl/xzUy20Sg/SvgroPxCD9E74DHXc+KUj/IKdQL9dD0UhJD/+k/3jU3UtF+r/kn/QvAVv6RxeD9H+JmsuVlIL0dx5AvdxQMUj/Qah7TAzSP68bdN7E46D0Z92N42dVKUh/+zbUy01SNJKZgdK/K+peCCYF6Z/5G+h8TKb7pH9tMUj/JaiXWyoG6d8CdW/oPun/NZ2ikXn6Rvq34KD0592NY4ONCBTWN9L/fgTNJ/1/5BCD9D+NermuYpD+E1B3NwelP+9uHM+icVD6s+7GEViId9K//z9l3Y3j50AxSP/BqHvUxUDpz7sbx+u4mk/6e8qKQfpvR73cODFI/26oey6oGKT/d9jLiUH630G9XC1FIy1RjzZL/Q3vbhyzxSD9W6Lu9VAMlP68u3F8SSsF6a+ChQN9Ufm9VRt1lysOXsyT/hwM96S/FDIR9VknDpZ50t/OwTBP+nOw3JP+DAzzpD8Hyz3pz8EwT/pzsNyT/gwM86Q/B8s96c/BcE/6MzDMk/4cLPOkvxia6jNsp87B8E76p+Xgn8yT/mJoHdRdafyX/hag0r/bT9AZq/uk/7mgJl/p31QMrWrml/5SyGBuS3/jv/Q3/kv/+9pP+mf38ZP+W82A0n8baulf1k9f+hv/pb/xX/oPMP5Lf6+A9G+BurMtgqR/Fe0n/d/5+En/CajPOluDS/+8btA56jICSv9VqM9q+QpI/5TaT/pfNvJLfykkprdO+heyBpf+XX+Czjh/Iem/xNpP+s9FfdbMGlz6l/Dzlf6DTFzS/7wcpP9t1NI/qfFf+nsFpP+p/7bGf+lv/Jf+zVF3jo+f9P9qES79x6M+62LtJ/0HWoRL/2+opX8wo4f0T+fjJ/1XWftJ/926T/o/k4P0P2DNIf3jSqG2DZYc0v+j8V/6m7+l/0BLDun/Uw7Svwvqjjf8Sn8pZA7qs+ZGX+kfzegr/cXQTMZ/6e+HK/1zGD2k/yBfAekf6THovtF+0r+cNbj0b4a6c639pP8Gm5+Q9B+H+qyr9pP+Dmsg6Z/HDTrH5CD9Hxn/pb+Gk/43/IWkf2VvnfSPYAku/R27jR7SvzPqTvAXkv6LUZ/VtgiS/rNRn7Uw/kt/r4D0H/Dzf43xX/ob/6V/Aj9f6V9c+0n/F0YP6b/eR1f6G/+lv/Ff+tu9ddJ/sPFf+nsFpH9T1F1iBJT+rqO6T/qPRX3Wzfgv/S1Apf9yzkn/IOFAX3YxSH/nYdCTbbSRSgrWSf8RoCd7EIGW9L/EOelf1IM57nxikP5RnoCerIcYpL99B+jJ9jrEIP17gZ7seXQxSP9cPzDHU1IM0j/cXdCTDRWD9LetBT3Z8QAxSP+2qJ1cPFK170It/QsrCkn9BXSqikH6h7wKerJJcpD+C0BPdiGYGKR/fdROLpkYpH+i96BTl9ZZJ9SdqCgk6BnQky2Vg/SfgtrJhSaVMKyT/hVQO7n0Yvhu/VivQKeVHKT/Id0n/YfpPulfJJCD30w7C/VZS85J/+5ykP7bQU+2Rw7Svyfsb6YVg/TP8h21k9N90n8IC6X/HhrSfw3sb6YVg/Rvrfukf6rPHJT+/Tkn/UNcQe3k5CD95+s+6V/XSyf9a4tB+gc5zUPpz7knp0k8lP6ce3IqD/tdMHSf9G/JQum/lIb0P8jBd8FI8YlzT05DUL8Lhhykfz635pP+kR+jfhcM3Sf9d1OT/pz7rGJ33Sf9M6OW/oXEIP3D3kH9LhhikP5qte6T/i1hvwuG7pP+5XSf9J8gB+k/D/W7YMhB+leF/S4YLJT+VRWFJPTSSf+5cpD+E2B/M60YpH9Jj8aR/nVo/GfBS9CTNafVJt5c6T+Ig9I/6LmfjHtyyuulk/5d5CD9t6GW/nYxSP+u3mDpPwb1WXca0v826MkGykH6LwE92VE5SP/moCd7LQfpn/Iz6JRlofQfQkP6XwY92Xg5SP85uk/6VwE92QdBSP93oFNLDtL/FOjJ5shB+o8DPdl1OUj/Eqilf1rdJ/2biUH6O3aDnmylEoP0H4ha+oenlb7LQV80pH/UpaAny6K032X8j/E/xv8Y/2P8j/E/xv8Y/6OnogAAVlA4IPQCAABQVwCdASqAAoACAAAAJaW7hd2EbR3Bk8abRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMabRMaasAD+//7254AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQU0FJTgAAADhCSU0D7QAAAAAAEABIAAAAAQACAEgAAAABAAI4QklNBCgAAAAAAAwAAAACP/AAAAAAAAA4QklNBEMAAAAAAA5QYmVXARAABgBkAAAAAA==",import.meta.url).href,k1=new URL(""+new URL("midjourney-BOG0L-7m.webp",import.meta.url).href,import.meta.url).href,A1=new URL(""+new URL("midjourney bai-4Fw3hs7F.webp",import.meta.url).href,import.meta.url).href,M1=new URL(""+new URL("jimeng-color-CtBciSlW.webp",import.meta.url).href,import.meta.url).href,T1=new URL(""+new URL("qwen-color-ig8k3JUL.webp",import.meta.url).href,import.meta.url).href,R1=new URL(""+new URL("bytedance-color-CPzTHojG.webp",import.meta.url).href,import.meta.url).href,P1=new URL(""+new URL("gemini-color-BRjDr-0b.webp",import.meta.url).href,import.meta.url).href,r_=new URL(""+new URL("grok-DEnnqgaa.webp",import.meta.url).href,import.meta.url).href,s_=new URL(""+new URL("grok bai-CiCMAJ0q.webp",import.meta.url).href,import.meta.url).href,iE=new URL(""+new URL("minimax-color-Dx2mFylD.webp",import.meta.url).href,import.meta.url).href,aE=new URL(""+new URL("kling-color-O6Fl0YZh.webp",import.meta.url).href,import.meta.url).href,oE=new URL(""+new URL("vidu-color-DfcYl6hz.webp",import.meta.url).href,import.meta.url).href,lE=new URL(""+new URL("doubao-color-BfZ9o9VO.webp",import.meta.url).href,import.meta.url).href,Eae=new URL(""+new URL("suno-Xv1k_XXC.webp",import.meta.url).href,import.meta.url).href,Iae=new URL(""+new URL("suno baise--dMPbHiP.webp",import.meta.url).href,import.meta.url).href,kae=(e,t)=>t.isNodeDragging?e.node.id===t.node.id&&e.isSelected===t.isSelected&&e.isDark===t.isDark&&e.renderQuality===t.renderQuality:!(e.node.id!==t.node.id||e.node.x!==t.node.x||e.node.y!==t.node.y||e.node.width!==t.node.width||e.node.height!==t.node.height||e.node.type!==t.node.type||e.node.nodeName!==t.node.nodeName||e.node.content!==t.node.content||e.node.settings!==t.node.settings||e.isSelected!==t.isSelected||e.isNodeDragging!==t.isNodeDragging||e.isConnected!==t.isConnected||e.isDark!==t.isDark||e.view.zoom!==t.view.zoom||e.viewportWidth!==t.viewportWidth||e.viewportHeight!==t.viewportHeight||e.connectingSource!==t.connectingSource||e.renderQuality!==t.renderQuality||e.dataVersion!==t.dataVersion||e.shouldHideBorder!==t.shouldHideBorder||e.hasOpenDropdown!==t.hasOpenDropdown||e.disableNodeDrag!==t.disableNodeDrag||e.doodleDrawingNodeId!==t.doodleDrawingNodeId||e.children!==t.children),Aae=({node:e,isSelected:t,isNodeDragging:n,isConnected:r,isDark:i,view:a,viewportWidth:o,viewportHeight:l,connectingSource:c,renderQuality:u="high",dataVersion:d,isInGroup:h=!1,hideConnections:p=!1,upstreamNodeNames:f=[],shouldHideBorder:b=!1,isPreviewCollapsed:g=!1,onEdgeUpdate:y,onNodeMouseDown:w,onNodeMouseUp:v,onDeleteNode:m,onStartResize:z,onStartConnectFromOutput:C,onStartConnectFromInput:E,onConnectToInput:I,onConnectToOutput:R,setLightboxItem:A,setLightboxOpen:O,onMouseEnter:F,onMouseLeave:L,updateNode:X,onShowConnectionDial:T,onHideConnectionDial:q,showConnectionDial:H,connectionDialOptions:J,disableNodeDrag:Z=!1,doodleDrawingNodeId:B=null,onConnectionDialSelect:V,hasOutputConnection:N,isVisible:j=!0,hasOpenDropdown:k=!1,children:W})=>{var Te,Be,He,Je,Me,Re,Ve,Ze,je,Le,Xe,qe,tt,Ye,ct,pt,ht,wt,$t,jt,Nt,Yt,un,Tn,Ht,fn,Dn;const M=e.type==="doodle-canvas"&&B===e.id,Y=Z;(e==null?void 0:e.isGenerating)===!0||(e==null?void 0:e.extractingFrames)===!0||(e==null||e.isMasking);const se=_.useRef(null),[ie,oe]=_.useState(!1),[re,ee]=_.useState(e.nodeName||""),[pe,we]=_.useState(!1),[Q,me]=_.useState("both"),ue=_.useRef(null),U=_.useRef(null),G=_.useRef(null),te=_.useRef(null),ge=_.useRef(null),ne=_.useRef(null),le=_.useCallback(()=>{U.current!=null&&(window.clearTimeout(U.current),U.current=null),te.current&&(window.removeEventListener("mousemove",te.current),te.current=null),ge.current&&(window.removeEventListener("mouseup",ge.current),ge.current=null),G.current=null},[]),fe=_.useCallback((it,Lt)=>{if(it.shiftKey)return;le(),G.current={x:it.clientX,y:it.clientY},te.current=Gt=>{const qt=G.current;if(!qt)return;Math.abs(Gt.clientX-qt.x)+Math.abs(Gt.clientY-qt.y)>8&&le()},ge.current=()=>{le()},window.addEventListener("mousemove",te.current),window.addEventListener("mouseup",ge.current);const gt=it.clientX,Jt=it.clientY,Wt=it.ctrlKey,Pt=it.metaKey,Bt=it.altKey,zt=e.type==="text-node"?Cae:jae;U.current=window.setTimeout(()=>{if(le(),Nae(gt,Jt))return;w({button:0,target:Lt,currentTarget:Lt,clientX:gt,clientY:Jt,ctrlKey:Wt,metaKey:Pt,altKey:Bt,stopPropagation:()=>{}})},zt)},[le,w,e.type]);_.useEffect(()=>()=>{le()},[le]),_.useEffect(()=>{ie||ee(e.nodeName||""),ie&&ne.current&&(ne.current.focus(),ne.current.select())},[e.nodeName,ie]),_.useEffect(()=>{const it=Lt=>{var Bt,zt,Gt;const gt=Lt,Jt=(Bt=gt==null?void 0:gt.detail)==null?void 0:Bt.nodeId;if(!Jt||Jt!==e.id)return;const Wt=((zt=gt==null?void 0:gt.detail)==null?void 0:zt.side)||"both",Pt=((Gt=gt==null?void 0:gt.detail)==null?void 0:Gt.mode)||"commit";if(me(Wt),Pt==="hover"){we(!0);return}we(!1),requestAnimationFrame(()=>we(!0)),ue.current&&window.clearTimeout(ue.current),ue.current=window.setTimeout(()=>{we(!1),ue.current=null},750)};return window.addEventListener("nodeConnectionFlash",it),()=>{window.removeEventListener("nodeConnectionFlash",it),ue.current&&window.clearTimeout(ue.current),ue.current=null}},[e.id]);const be=_.useCallback(()=>{if(F&&F(),c)try{window.dispatchEvent(new CustomEvent("nodeConnectionFlash",{detail:{nodeId:e.id,mode:"hover",side:"both"}}))}catch{}},[F,c,e.id]),de=_.useCallback(()=>{L&&L(),we(!1)},[L]),$e=_.useCallback(()=>{X&&X(e.id,{nodeName:re.trim()||void 0}),oe(!1)},[e.id,re,X]),ze=_.useCallback(()=>{ee(e.nodeName||""),oe(!1)},[e.nodeName]);_.useEffect(()=>{const it=se.current;if(it)return tY(e.id,it,a.zoom),cv(e.id,e.x,e.y),xae(it,e.id,y),()=>{nY(e.id),bae(it)}},[e.id,e.x,e.y,y,a.zoom]);const _e=Math.max(.8,Math.min(2,1/a.zoom)),Ce=((Te=e.settings)!=null&&Te.hasCustomSize&&e.settings.savedNodeWidth!=null?e.settings.savedNodeWidth:e.width)/_e,xe=(e.type==="gen-image"||e.type==="gen-video"||e.type==="motion-control"||e.type==="rh-app"||e.type==="rh-comfy"||e.type==="storyboard-chart-node")&&e.isGenerating===!0,Ne=_.useCallback(it=>{T&&(N||mn(async()=>{const{getQuickConnectOptions:Lt}=await Promise.resolve().then(()=>rpe);return{getQuickConnectOptions:Lt}},void 0,import.meta.url).then(({getQuickConnectOptions:Lt})=>{const gt=Lt(e.type,"output");gt.length!==0&&T({nodeId:e.id,portDirection:"output",x:0,y:0,options:gt})}).catch(Lt=>{console.error("[CanvasNodeWrapper] Failed to load quick connect config:",Lt)}))},[e.id,e.type,T,N]),ve=_.useCallback(()=>{},[]),Ie=(e.type==="gen-image"||e.type==="gen-video"||e.type==="motion-control"||e.type==="custom-agent")&&!!((Be=e.settings)!=null&&Be.isCollapsed),Pe=e.type!=="image-compare"&&e.type!=="gen-music"&&e.type!=="local-save"&&e.type!=="doodle-canvas"&&e.type!=="inpaint-stitch";return s.jsxs("div",{ref:se,"data-node-id":e.id,"data-node-type":e.type,"data-render-quality":u,"data-preview-collapsed":g?"true":void 0,"data-hide-border":b,"data-has-image":e.type==="input-image"&&e.content&&a.zoom>.25?"true":void 0,"data-highlighted":e.type==="input-image"&&((He=e.settings)!=null&&He.highlighted)?"true":void 0,className:`absolute rounded-xl group flex flex-col node-wrapper node-move-cursor render-quality-${u} ${pe?"node-connect-edge-glow":""} ${g?"group-preview-collapsed":""} ${b?"!border-transparent !shadow-none":t?"border node-selected-border":e.type==="input-image"&&e.content&&a.zoom<=.25?i?"border border-zinc-800":"border border-zinc-200":(e.type==="input-image"&&e.content||e.type==="preview")&&a.zoom>.25?"!border-0":e.type==="input-image"?"border border-transparent":i?"border border-zinc-800":"border border-zinc-200"} ${e.type==="input-image"&&e.content&&a.zoom>.25?"!bg-transparent":i?"bg-[#18181b]":"bg-white"} ${n?"node-move-cursor-dragging":""}`,"data-connect-glow-side":pe?Q:void 0,style:{transform:`translate3d(${e.x}px, ${e.y}px, 0)`,width:(Je=e.settings)!=null&&Je.hasCustomSize&&e.settings.savedNodeWidth!=null?e.settings.savedNodeWidth:e.width,height:(Me=e.settings)!=null&&Me.hasCustomSize&&e.settings.savedNodeHeight!=null?e.settings.savedNodeHeight:e.height,zIndex:n?50:t?15:10,overflow:"visible",boxShadow:void 0,...e.type==="input-image"&&e.content&&a.zoom>.25?{border:"none"}:{},willChange:n?"transform":"auto",contain:u==="low"&&b&&!k&&!(e.type==="input-image"&&((Re=e.settings)!=null&&Re.highlighted))&&!xe&&!["custom-agent","gen-image","gen-video","motion-control"].includes(e.type)?"layout style paint":"layout style",contentVisibility:u==="low"&&b&&!["custom-agent","gen-image","gen-video","motion-control"].includes(e.type)?"auto":void 0},onMouseEnter:be,onMouseLeave:de,onMouseUp:v,onMouseDownCapture:it=>{if(it.button!==0||Z)return;const Lt=it.target;(Lt.tagName==="TEXTAREA"||Lt.tagName==="INPUT"||Lt.isContentEditable||Lt.closest('textarea, input, [contenteditable="true"]'))&&fe(it,it.currentTarget)},onMouseDown:it=>{const Lt=it.target;if(Lt.tagName==="INPUT"||Lt.tagName==="TEXTAREA"||Lt.tagName==="SELECT"||Lt.tagName==="BUTTON"||Lt.isContentEditable||Lt.closest("input, textarea, select, button")){it.stopPropagation();return}if(Lt.closest("[data-crop-select-overlay]")){it.stopPropagation();return}if(!Lt.closest("[data-image-reorder-thumb]")&&!Lt.closest("[data-table-resize-handle]")&&!(Lt.closest("[data-table-editor-controls]")||Lt.closest("[data-table-editor-toolbar]"))){if(Lt.closest("[data-node-name-label]")&&!(it.ctrlKey||it.metaKey)){it.stopPropagation();return}Z||w(it)}},onDoubleClick:it=>{const Lt=it.target;if(Lt.closest('button[title="下载音频"]')||Lt.closest('button[title*="下载"]')||Lt.closest(".audio-player-download")||Lt.closest("[data-download-button]")){it.preventDefault(),it.stopPropagation();return}if(e.type==="preview")return;const gt=e.type==="input-image"||e.type==="gen-image"||e.type==="rh-app"||e.type==="rh-comfy"||e.type==="jimeng-super-resolution",Jt=e.type==="video-input";if((gt||Jt)&&e.content&&A){it.stopPropagation();const Wt=qt=>{var st;if(!qt)return!1;if(qt.startsWith("data:video")||qt.includes("force_video_display=true"))return!0;const De=(st=qt.split(".").pop())==null?void 0:st.split("?")[0].toLowerCase();return["mp4","webm","ogg","mov"].includes(De||"")},Pt=qt=>{var st;if(!qt)return!1;if(qt.startsWith("data:audio"))return!0;const De=(st=qt.split(".").pop())==null?void 0:st.split("?")[0].toLowerCase();return["mp3","wav","ogg","m4a","aac","flac"].includes(De||"")},Bt=Wt(e.content)?"video":Pt(e.content)?"audio":"image",zt=e.settings||{},Gt=zt.mjImages||zt.previewMjImages||zt.batchImages;(async()=>{var Ae;let qt=e.content,De=Gt&&Gt.length>1?Gt:void 0;if(Bt==="image"&&(e._contentAssetId||e._previewMjAssetIds&&e._previewMjAssetIds.length>0)){const nt=e._previewMjAssetIds&&e._previewMjAssetIds.length>0?e._previewMjAssetIds:e._contentAssetId?[e._contentAssetId]:[];if(nt.length>0)try{const{localCacheManager:_t}=await mn(async()=>{const{localCacheManager:Qe}=await Promise.resolve().then(()=>Xa);return{localCacheManager:Qe}},void 0,import.meta.url),{assetStore:xt}=await mn(async()=>{const{assetStore:Qe}=await Promise.resolve().then(()=>_s);return{assetStore:Qe}},void 0,import.meta.url),Tt=[];for(let Qe=0;Qe0&&(qt=St[0],St.length>1&&(De=St))}catch{}}if(Bt==="image"&&!e._contentAssetId&&!((Ae=e._previewMjAssetIds)!=null&&Ae.length)&&qt.startsWith("blob:")){const{getFullBlobUrlForDisplayUrl:nt}=await mn(async()=>{const{getFullBlobUrlForDisplayUrl:xt}=await Promise.resolve().then(()=>Do);return{getFullBlobUrlForDisplayUrl:xt}},void 0,import.meta.url),_t=await nt(qt,void 0);_t&&(qt=_t)}A({url:qt,type:Bt,mjImages:De}),O&&O(!0)})();return}console.log("[CanvasNodeWrapper] Double click on node wrapper, stopping propagation to canvas",{nodeId:e.id,nodeType:e.type}),it.stopPropagation()},children:[xe&&s.jsx("div",{className:"pointer-events-none absolute left-1/2 -translate-x-1/2 z-[200]",style:{top:"-44px"},children:s.jsx(KQ,{isGenerating:!0,isDark:i,nodeId:e.id,modelId:((Ve=e.settings)==null?void 0:Ve.modelId)??((Ze=e.settings)==null?void 0:Ze.model)})}),!h&&!b&&s.jsxs("div",{className:"absolute left-0 flex items-center gap-1.5 z-50 min-w-0 overflow-hidden",style:{bottom:"100%",marginBottom:"6px",transform:`scale(${_e})`,transformOrigin:"left bottom",maxWidth:`${Ce}px`,pointerEvents:Z?"none":"auto"},children:[ie?s.jsx("input",{ref:ne,type:"text",value:re,onChange:it=>ee(it.target.value),onBlur:$e,onKeyDown:it=>{it.key==="Enter"?(it.preventDefault(),$e()):it.key==="Escape"&&(it.preventDefault(),ze())},className:`px-1.5 py-0.5 text-sm font-medium border-transparent rounded outline-none bg-transparent ${i?"text-zinc-100":"text-zinc-900"}`,style:{minWidth:"80px",maxWidth:`${e.width}px`}}):s.jsxs("div",{className:"flex items-center gap-1.5 min-w-0 flex-1 overflow-hidden",children:[e.type==="input-image"&&!!((je=e.settings)!=null&&je.imageSize)&&s.jsx("span",{className:`text-[10px] font-light shrink-0 ${i?"text-zinc-300":"text-zinc-700"}`,children:String(e.settings.imageSize)}),e.type==="preview"&&!!((Le=e.settings)!=null&&Le.previewSourceModel||(Xe=e.settings)!=null&&Xe.previewSize)&&(()=>{var Jt;const it=((Jt=e.settings)==null?void 0:Jt.previewSourceModel)||"";if(!it)return null;const Lt="shrink-0 w-[1em] h-[1em] object-contain inline-flex items-center",gt={fontSize:"0.875rem"};return it==="nano-banana"||it==="nano-banana-2"||it==="gemini-3.1-flash-image-preview"||it.startsWith("grsai-nano-banana")?s.jsx("span",{className:"text-sm shrink-0 inline-flex items-center",title:"Nano Banana","aria-hidden":!0,children:"🍌"}):it==="gpt-image"||it==="gpt-image-1.5"?s.jsx("img",{src:i?I1:E1,alt:"",className:Lt,style:gt,title:"OpenAI","aria-hidden":!0}):it==="flux-kontext"?s.jsx("img",{src:i?nE:tE,alt:"",className:Lt,style:gt,title:"Flux","aria-hidden":!0}):it==="z-image-official"||it==="z-image-turbo"?s.jsx("img",{src:i?sE:rE,alt:"",className:Lt,style:gt,title:"Z-Image","aria-hidden":!0}):it.includes("mj")||it.toLowerCase().includes("midjourney")?s.jsx("img",{src:i?A1:k1,alt:"",className:Lt,style:gt,title:"Midjourney","aria-hidden":!0}):it.includes("jimeng-5.0")||it.includes("jimeng-4.6")||it.includes("jimeng-4.5")||it.includes("jimeng-4.1")||it.includes("jimeng-4.0")||it.includes("jimeng-3.1")?s.jsx("img",{src:M1,alt:"",className:Lt,style:gt,title:"即梦","aria-hidden":!0}):it==="wan-2.6-image-official"||it==="qwen-image-edit"?s.jsx("img",{src:T1,alt:"",className:Lt,style:gt,title:it==="qwen-image-edit"?"Qwen Image Edit":"Wan 2.6","aria-hidden":!0}):it==="seedream-4.5"||it==="seedream-4.0"?s.jsx("img",{src:R1,alt:"",className:Lt,style:gt,title:"Seedream","aria-hidden":!0}):e0(it)?s.jsx("img",{src:P1,alt:"",className:Lt,style:gt,title:"Gemini Image Official","aria-hidden":!0}):it==="sora-2"||it==="sora-2-pro"?s.jsx("img",{src:i?I1:E1,alt:"",className:Lt,style:gt,title:"Sora","aria-hidden":!0}):it==="google-veo3"||it==="google-veo3.1-pro"||it==="google-veo3.1-fast"?s.jsx("img",{src:P1,alt:"",className:Lt,style:gt,title:"Veo","aria-hidden":!0}):it.includes("grok")?s.jsx("img",{src:i?s_:r_,alt:"",className:Lt,style:gt,title:"Grok","aria-hidden":!0}):it.includes("jimeng-video")?s.jsx("img",{src:M1,alt:"",className:Lt,style:gt,title:"即梦视频","aria-hidden":!0}):it.startsWith("hailuo-")?s.jsx("img",{src:iE,alt:"",className:Lt,style:gt,title:"Hailuo","aria-hidden":!0}):it==="wan-2.6"||it==="wan-2.6-official"?s.jsx("img",{src:T1,alt:"",className:Lt,style:gt,title:"Wan 2.6","aria-hidden":!0}):it==="wan-2.6-official"||it==="seedance-1.5-pro"||it==="seedance-1-0-pro"||it==="seedance-1-0-pro-fast"||it==="seedance-1-0-lite-t2v"||it==="seedance-1-0-lite-i2v"?s.jsx("img",{src:R1,alt:"",className:Lt,style:gt,title:"Seedance","aria-hidden":!0}):it.includes("kling-o1")||it.includes("kling-v2-5-turbo")||it.includes("kling-v2-6")||it.includes("kling-v3")?s.jsx("img",{src:aE,alt:"",className:Lt,style:gt,title:"Kling","aria-hidden":!0}):it==="vidu-q2"||it==="vidu-q2-turbo"||it==="vidu-2.0"||it==="vidu-q3-pro"?s.jsx("img",{src:oE,alt:"",className:Lt,style:gt,title:"Vidu","aria-hidden":!0}):it==="mj-video"?s.jsx("img",{src:i?A1:k1,alt:"",className:Lt,style:gt,title:"MJ Video","aria-hidden":!0}):it==="seedance-1.5-pro-api"||it==="seedance-1-0-pro-api"||it==="seedance-1-0-lite-t2v-api"||it==="seedance-1-0-lite-i2v-api"?s.jsx("img",{src:lE,alt:"",className:Lt,style:gt,title:"Seedance API","aria-hidden":!0}):null})(),e.type==="text-node"&&((qe=e.settings)==null?void 0:qe.textNodeHasImageInput)&&(()=>{var Lt;const it=x9(((Lt=e.settings)==null?void 0:Lt.textNodeChatModel)||"",i);return it?s.jsx("img",{src:it,alt:"",className:"shrink-0 w-[1em] h-[1em] object-contain",style:{fontSize:"0.875rem"},title:"视觉分析模型","aria-hidden":!0}):null})(),e.type==="preview"&&(!!((tt=e.settings)!=null&&tt.previewSize)||!!((Ye=e.settings)!=null&&Ye.previewActualSize))&&s.jsx("span",{className:`text-[10px] font-light shrink-0 ${i?"text-zinc-300":"text-zinc-700"}`,children:String(((ct=e.settings)==null?void 0:ct.previewActualSize)??e.settings.previewSize)}),e.type==="gen-image"&&(()=>{var gt;const it=((gt=e.settings)==null?void 0:gt.model)||"";return it==="nano-banana"||it==="nano-banana-2"||it==="gemini-3.1-flash-image-preview"||it.startsWith("grsai-nano-banana")?s.jsx("span",{className:"text-sm shrink-0 inline-flex items-center",title:"Nano Banana","aria-hidden":!0,children:"🍌"}):null})(),e.type==="gen-image"&&(()=>{var gt;const it=((gt=e.settings)==null?void 0:gt.model)||"";return it==="gpt-image"||it==="gpt-image-1.5"?s.jsx("img",{src:i?I1:E1,alt:"OpenAI",className:"shrink-0 w-[1em] h-[1em] object-contain",style:{fontSize:"0.875rem"},title:"OpenAI","aria-hidden":!0}):null})(),e.type==="gen-image"&&(()=>{var gt;return(((gt=e.settings)==null?void 0:gt.model)||"")==="flux-kontext"?s.jsx("img",{src:i?nE:tE,alt:"Flux Kontext",className:"shrink-0 w-[1em] h-[1em] object-contain",style:{fontSize:"0.875rem"},title:"Flux Kontext","aria-hidden":!0}):null})(),e.type==="gen-image"&&(()=>{var gt;const it=((gt=e.settings)==null?void 0:gt.model)||"";return it==="z-image-official"||it==="z-image-turbo"?s.jsx("img",{src:i?sE:rE,alt:"Z-Image",className:"shrink-0 w-[1em] h-[1em] object-contain",style:{fontSize:"0.875rem"},title:"Z-Image","aria-hidden":!0}):null})(),e.type==="gen-image"&&(()=>{var gt;const it=((gt=e.settings)==null?void 0:gt.model)||"";return it.includes("mj")||it.toLowerCase().includes("midjourney")?s.jsx("img",{src:i?A1:k1,alt:"Midjourney",className:"shrink-0 w-[1em] h-[1em] object-contain",style:{fontSize:"0.875rem"},title:"Midjourney","aria-hidden":!0}):null})(),e.type==="gen-image"&&(()=>{var gt;const it=((gt=e.settings)==null?void 0:gt.model)||"";return it.includes("jimeng-5.0")||it.includes("jimeng-4.6")||it.includes("jimeng-4.5")||it.includes("jimeng-4.1")||it.includes("jimeng-4.0")||it.includes("jimeng-3.1")?s.jsx("img",{src:M1,alt:"即梦",className:"shrink-0 w-[1em] h-[1em] object-contain",style:{fontSize:"0.875rem"},title:"即梦","aria-hidden":!0}):null})(),e.type==="gen-image"&&(()=>{var Jt;const it=((Jt=e.settings)==null?void 0:Jt.model)||"",Lt=it==="wan-2.6-image-official",gt=it==="qwen-image-edit";return Lt||gt?s.jsx("img",{src:T1,alt:gt?"Qwen Image Edit":"Wan 2.6 Image Official",className:"shrink-0 w-[1em] h-[1em] object-contain",style:{fontSize:"0.875rem"},title:gt?"Qwen Image Edit":"Wan 2.6 Image Official","aria-hidden":!0}):null})(),e.type==="gen-image"&&(()=>{var gt;const it=((gt=e.settings)==null?void 0:gt.model)||"";return it==="seedream-4.5"||it==="seedream-4.0"?s.jsx("img",{src:R1,alt:"Seedream",className:"shrink-0 w-[1em] h-[1em] object-contain",style:{fontSize:"0.875rem"},title:"Seedream","aria-hidden":!0}):null})(),e.type==="gen-image"&&(()=>{var gt;const it=((gt=e.settings)==null?void 0:gt.model)||"";return it==="grok-4.1-image"||it==="grok-4.2-image"?s.jsx("img",{src:i?s_:r_,alt:"Grok Image",className:"shrink-0 w-[1em] h-[1em] object-contain",style:{fontSize:"0.875rem"},title:"Grok Image","aria-hidden":!0}):null})(),e.type==="gen-image"&&(()=>{var Lt;const it=((Lt=e.settings)==null?void 0:Lt.model)||"";return e0(it)?s.jsx("img",{src:P1,alt:"Gemini Image",className:"shrink-0 w-[1em] h-[1em] object-contain",style:{fontSize:"0.875rem"},title:"Gemini Image Official","aria-hidden":!0}):null})(),e.type==="gen-video"&&(()=>{var gt;const it=((gt=e.settings)==null?void 0:gt.model)||"";return it==="sora-2"||it==="sora-2-pro"?s.jsx("img",{src:i?I1:E1,alt:"Sora",className:"shrink-0 w-[1em] h-[1em] object-contain",style:{fontSize:"0.875rem"},title:"Sora","aria-hidden":!0}):null})(),e.type==="gen-video"&&(()=>{var gt;const it=((gt=e.settings)==null?void 0:gt.model)||"";return it==="google-veo3"||it==="google-veo3.1-pro"||it==="google-veo3.1-fast"||it==="veo-3.1-official"||it==="veo-3.1-fast-official"?s.jsx("img",{src:P1,alt:"Google Veo",className:"shrink-0 w-[1em] h-[1em] object-contain",style:{fontSize:"0.875rem"},title:"Google Veo 3.1","aria-hidden":!0}):null})(),e.type==="gen-video"&&(()=>{var gt;return(((gt=e.settings)==null?void 0:gt.model)||"").includes("grok")?s.jsx("img",{src:i?s_:r_,alt:"Grok",className:"shrink-0 w-[1em] h-[1em] object-contain",style:{fontSize:"0.875rem"},title:"Grok3 Video","aria-hidden":!0}):null})(),e.type==="gen-video"&&(()=>{var gt;return(((gt=e.settings)==null?void 0:gt.model)||"").includes("jimeng-video")?s.jsx("img",{src:M1,alt:"即梦视频",className:"shrink-0 w-[1em] h-[1em] object-contain",style:{fontSize:"0.875rem"},title:"即梦视频","aria-hidden":!0}):null})(),e.type==="gen-video"&&(()=>{var gt;return(((gt=e.settings)==null?void 0:gt.model)||"").startsWith("hailuo-")?s.jsx("img",{src:iE,alt:"Hailuo",className:"shrink-0 w-[1em] h-[1em] object-contain",style:{fontSize:"0.875rem"},title:"Hailuo","aria-hidden":!0}):null})(),e.type==="gen-video"&&(()=>{var gt;return(((gt=e.settings)==null?void 0:gt.model)||"")==="wan-2.6"?s.jsx("img",{src:T1,alt:"Wan 2.6",className:"shrink-0 w-[1em] h-[1em] object-contain",style:{fontSize:"0.875rem"},title:"Wan 2.6","aria-hidden":!0}):null})(),e.type==="gen-video"&&(()=>{var gt;const it=((gt=e.settings)==null?void 0:gt.model)||"";return it==="wan-2.6-official"||it==="seedance-1.5-pro"||it==="seedance-1-0-pro"||it==="seedance-1-0-pro-fast"||it==="seedance-1-0-lite-t2v"||it==="seedance-1-0-lite-i2v"?s.jsx("img",{src:R1,alt:"Wan 2.6 / Seedance",className:"shrink-0 w-[1em] h-[1em] object-contain",style:{fontSize:"0.875rem"},title:"Wan 2.6 Official / Seedance Official","aria-hidden":!0}):null})(),e.type==="gen-video"&&(()=>{var gt;const it=((gt=e.settings)==null?void 0:gt.model)||"";return it.includes("kling-o1")||it.includes("kling-v2-5-turbo")||it.includes("kling-v2-6")||it.includes("kling-v3")?s.jsx("img",{src:aE,alt:"Kling",className:"shrink-0 w-[1em] h-[1em] object-contain",style:{fontSize:"0.875rem"},title:"Kling","aria-hidden":!0}):null})(),e.type==="gen-video"&&(()=>{var gt;const it=((gt=e.settings)==null?void 0:gt.model)||"";return it==="vidu-q2"||it==="vidu-q2-turbo"||it==="vidu-2.0"||it==="vidu-q3-pro"?s.jsx("img",{src:oE,alt:"Vidu",className:"shrink-0 w-[1em] h-[1em] object-contain",style:{fontSize:"0.875rem"},title:"Vidu","aria-hidden":!0}):null})(),e.type==="gen-video"&&(()=>{var gt;return(((gt=e.settings)==null?void 0:gt.model)||"")==="mj-video"?s.jsx("img",{src:i?A1:k1,alt:"MJ Video",className:"shrink-0 w-[1em] h-[1em] object-contain",style:{fontSize:"0.875rem"},title:"MJ Video","aria-hidden":!0}):null})(),e.type==="gen-video"&&(()=>{var gt;const it=((gt=e.settings)==null?void 0:gt.model)||"";return it==="seedance-1.5-pro-api"||it==="seedance-1-0-pro-api"||it==="seedance-1-0-lite-t2v-api"||it==="seedance-1-0-lite-i2v-api"?s.jsx("img",{src:lE,alt:"Seedance API",className:"shrink-0 w-[1em] h-[1em] object-contain",style:{fontSize:"0.875rem"},title:"Seedance API","aria-hidden":!0}):null})(),e.type==="gen-music"&&s.jsx("img",{src:i?Iae:Eae,alt:"Suno",className:"shrink-0 w-[1em] h-[1em] object-contain",style:{fontSize:"0.875rem"},title:"Suno","aria-hidden":!0}),e.type==="preview"&&(((pt=e.settings)==null?void 0:pt.expandModelName)||((ht=e.settings)==null?void 0:ht.eraserModelName))&&(()=>{const it=String(e.settings.expandModelName||e.settings.eraserModelName||""),Lt=String(e.settings.expandModelId||e.settings.eraserModelId||it),gt=Sae(Lt,i);return gt?s.jsx("img",{src:gt,alt:it,className:"shrink-0 w-[1em] h-[1em] object-contain",style:{fontSize:"0.875rem"},title:it,"aria-hidden":!0}):s.jsx(si,{size:14,className:i?"text-zinc-400":"text-zinc-500",title:it,"aria-hidden":!0})})(),s.jsx("span",{"data-node-name-label":!0,onClick:()=>oe(!0),className:`text-sm font-medium cursor-pointer transition-opacity hover:opacity-70 whitespace-nowrap min-w-0 overflow-hidden text-ellipsis ${i?"text-zinc-500":"text-zinc-700"}`,style:{writingMode:"horizontal-tb",textOrientation:"mixed"},title:e.type==="text-node"&&((wt=e.settings)!=null&&wt.textNodeHasImageInput)?"视觉反推":e.type==="preview"&&(($t=e.settings)!=null&&$t.expandModelName)?`智能扩图 · ${e.settings.expandModelName}`:e.type==="preview"&&((jt=e.settings)!=null&&jt.eraserModelName)?`智能擦除 · ${e.settings.eraserModelName}`:e.nodeName||"未命名节点",children:e.type==="text-node"&&((Nt=e.settings)!=null&&Nt.textNodeHasImageInput)?"视觉反推":e.type==="preview"&&((Yt=e.settings)!=null&&Yt.expandModelName)?`智能扩图 · ${e.settings.expandModelName}`:e.type==="preview"&&((un=e.settings)!=null&&un.eraserModelName)?`智能擦除 · ${e.settings.eraserModelName}`:e.nodeName||"未命名节点"}),e.type==="preview"&&typeof((Tn=e.settings)==null?void 0:Tn.generationTime)=="string"&&((Ht=e.settings)==null?void 0:Ht.generationTime)&&s.jsx("span",{className:"ml-1 px-1 py-0.5 rounded text-[10px] font-light shrink-0 text-zinc-500",title:"生成耗时",children:e.settings.generationTime}),e.type==="preview"&&typeof((fn=e.settings)==null?void 0:fn.eraserResolution)=="string"&&e.settings.eraserResolution&&s.jsxs("span",{className:"ml-1 px-1 py-0.5 rounded text-[10px] font-light shrink-0 text-zinc-500",title:"精度",children:["精度 ",e.settings.eraserResolution]})]}),p&&f.length>0&&s.jsx(s.Fragment,{children:f.map((it,Lt)=>s.jsx("span",{className:`px-1.5 py-0.5 text-xs font-medium rounded whitespace-nowrap ${i?"bg-transparent text-zinc-200 border border-zinc-400/50":"bg-emerald-100 text-emerald-700 border border-emerald-300"}`,style:{writingMode:"horizontal-tb",textOrientation:"mixed"},title:it,children:it},Lt))})]}),s.jsx("button",{onClick:it=>{it.stopPropagation(),m()},className:`absolute -top-2.5 -right-2.5 z-50 p-1 rounded-full shadow border opacity-0 group-hover:opacity-100 scale-90 hover:scale-100 cursor-pointer ${i?"bg-zinc-800 text-zinc-400 hover:text-red-500 hover:bg-zinc-700 border-zinc-700":"bg-zinc-100 text-zinc-500 hover:text-red-500 hover:bg-zinc-200 border-zinc-300"}`,onMouseDown:it=>it.stopPropagation(),children:s.jsx(Qr,{size:12})}),!((Dn=e.settings)!=null&&Dn.isCollapsed)&&s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"absolute bottom-1 right-1 w-4 h-4 z-[100] resize-handle resize-handle-corner resize-handle-corner-rb flex items-end justify-end p-0.5 opacity-0",style:{pointerEvents:Y?"none":void 0},onMouseDown:it=>{it.stopPropagation(),it.preventDefault(),z({horizontal:"right",vertical:"bottom"})}}),s.jsx("div",{className:"absolute bottom-1 left-1 w-4 h-4 z-[100] resize-handle resize-handle-corner flex items-end justify-start p-0.5 cursor-nesw-resize opacity-0",style:{pointerEvents:Y?"none":void 0},onMouseDown:it=>{it.stopPropagation(),it.preventDefault(),z({horizontal:"left",vertical:"bottom"})}}),s.jsx("div",{className:"absolute top-4 right-0 bottom-4 w-4 z-[100] resize-handle resize-handle-side",style:{marginRight:"-4px",pointerEvents:e.type==="storyboard-chart-node"||M||Y?"none":void 0},onMouseDown:e.type==="storyboard-chart-node"?void 0:it=>{it.stopPropagation(),it.preventDefault(),z({horizontal:"right",vertical:"none"})},children:e.type==="storyboard-chart-node"?s.jsx("div",{className:"absolute top-0 bottom-0 right-0 w-[3px] resize-handle-side",style:{pointerEvents:"auto"},onMouseDown:it=>{it.stopPropagation(),it.preventDefault(),z({horizontal:"right",vertical:"none"})}}):null}),s.jsx("div",{className:"absolute top-4 left-0 bottom-4 w-4 z-[100] resize-handle resize-handle-side",style:{marginLeft:"-4px",pointerEvents:M||Y?"none":void 0},onMouseDown:it=>{it.stopPropagation(),it.preventDefault(),z({horizontal:"left",vertical:"none"})}}),s.jsx("div",{className:"absolute bottom-0 left-4 right-4 h-4 z-[100] resize-handle resize-handle-top-bottom",style:{marginBottom:"-4px",pointerEvents:Y?"none":void 0},onMouseDown:it=>{it.stopPropagation(),it.preventDefault(),z({horizontal:"none",vertical:"bottom"})}})]}),e.type!=="input-image"&&s.jsx("div",{className:`input-point ${r?"connected":""} ${c?"active":""}`,style:{position:"absolute",top:"50%",left:"-0.35rem",transform:"translateY(-50%)",width:"0.6rem",height:"0.6rem",backgroundColor:r?"#ffffff":"#52525b",borderRadius:"50%",zIndex:200,cursor:"crosshair",pointerEvents:"auto"},onMouseDown:E,onMouseUp:I}),s.jsx("div",{"data-input-image-content":e.type==="input-image"&&e.content&&a.zoom>.25?"true":void 0,className:`${e.type==="input-image"||e.type==="custom-agent"||e.type==="gen-image"||e.type==="gen-video"||e.type==="motion-control"||e.type==="rh-app"||e.type==="rh-comfy"||e.type==="preview"||e.type==="storyboard-chart-node"?"overflow-visible":"overflow-hidden"} ${e.type==="input-image"||e.type==="preview"||e.type==="image-compare"?"smart-image-container":""} rounded-xl flex flex-col w-full relative pointer-events-auto flex-1 h-full ${e.type==="input-image"&&e.content&&a.zoom>.25?"!bg-transparent !border-0 !outline-none":`${e.type==="preview"?"!border-0 !outline-none ":""}${i?"bg-[#18181b]":"bg-white"}`}`,onDoubleClick:it=>{e.type==="input-image"||e.type==="preview"||it.stopPropagation()},onPointerDown:it=>{const Lt=it.target;(Lt.tagName==="INPUT"||Lt.tagName==="TEXTAREA"||Lt.tagName==="SELECT"||Lt.tagName==="BUTTON"||Lt.isContentEditable||Lt.closest('input, textarea, select, button, [contenteditable="true"], [role="button"]')||Lt.closest("[data-gen-prompt-apply]")||Lt.closest(".rh-list-dropdown")||Lt.closest(".node-dropdown-button")||Lt.closest(".node-dropdown-menu")||Lt.closest("[data-model-select-area]")||Lt.closest("[data-table-editor-controls]")||Lt.closest("[data-table-editor-toolbar]"))&&it.stopPropagation()},onMouseDown:it=>{const Lt=it.target;(Lt.tagName==="INPUT"||Lt.tagName==="TEXTAREA"||Lt.tagName==="SELECT"||Lt.tagName==="BUTTON"||Lt.isContentEditable||Lt.closest('input, textarea, select, button, [contenteditable="true"], [role="button"]')||Lt.closest("[data-gen-prompt-apply]")||Lt.closest(".rh-list-dropdown")||Lt.closest(".node-dropdown-button")||Lt.closest(".node-dropdown-menu")||Lt.closest("[data-model-select-area]")||Lt.closest("[data-table-editor-controls]")||Lt.closest("[data-table-editor-toolbar]"))&&it.stopPropagation()},children:W}),Pe&&(Ie?s.jsx("div",{className:"absolute top-0 bottom-0 left-full w-14 ml-1 z-[199] cursor-crosshair flex items-center justify-center",style:{pointerEvents:"auto"},children:s.jsx("div",{className:`connector connector-right transition-opacity ${c===e.id,"opacity-100"}`,style:{width:"2.5rem",height:"2.5rem",backgroundColor:i?"transparent":"#ffffff",border:i?c===e.id?"1px solid rgba(255,255,255,0.5)":"1px solid rgba(255,255,255,0.3)":"1px solid #d4d4d8",borderRadius:"50%",display:"flex",alignItems:"center",justifyContent:"center",boxShadow:i?"none":"0 1px 3px rgba(0,0,0,0.08)"},onMouseDown:it=>{q&&q(),C(it)},onMouseUp:R,onMouseEnter:Ne,onMouseLeave:ve,children:s.jsx(Xi,{size:24,style:{pointerEvents:"none",color:i?"#ffffff":"#6b7280"}})})}):s.jsx("div",{className:`connector connector-right transition-opacity ${c===e.id,"opacity-100"}`,style:{position:"absolute",top:"50%",right:"-1.25rem",transform:"translateY(-50%)",width:"2.5rem",height:"2.5rem",backgroundColor:i?"transparent":"#ffffff",border:i?c===e.id?"1px solid rgba(255,255,255,0.5)":"1px solid rgba(255,255,255,0.3)":"1px solid #d4d4d8",borderRadius:"50%",display:"flex",alignItems:"center",justifyContent:"center",cursor:"crosshair",zIndex:200,pointerEvents:"auto",boxShadow:i?"none":"0 1px 3px rgba(0,0,0,0.08)"},onMouseDown:it=>{q&&q(),C(it)},onMouseUp:R,onMouseEnter:Ne,onMouseLeave:ve,children:s.jsx(Xi,{size:24,style:{pointerEvents:"none",color:i?"#ffffff":"#6b7280"}})})),Pe&&H&&J&&J.length>0&&V&&s.jsx(mae,{visible:H,nodeId:e.id,options:J,onSelect:V,onClose:()=>q&&q(),isDark:i,isCollapsedFloating:Ie})]})},Mae=_.memo(Aae,kae),cE=e=>{const t=e;return(t==null?void 0:t.isGenerating)===!0||(t==null?void 0:t.extractingFrames)===!0||(t==null?void 0:t.isMasking)===!0},Tae=(e,t)=>{const n=t?"#f8fafc":"#60a5fa";switch(e.inputType){case"oref":return"#22c55e";case"sref":return"#3b82f6";case"veo_start":case"veo_end":return"#a855f7";default:return n}},Rae=(e,t,n)=>{const r=u=>{const d=u.replace("#",""),h=parseInt(d.slice(0,2),16),p=parseInt(d.slice(2,4),16),f=parseInt(d.slice(4,6),16);return{r:h,g:p,b:f}},i=r(e),a=r(t),o=Math.round(i.r*(1-n)+a.r*n),l=Math.round(i.g*(1-n)+a.g*n),c=Math.round(i.b*(1-n)+a.b*n);return`#${o.toString(16).padStart(2,"0")}${l.toString(16).padStart(2,"0")}${c.toString(16).padStart(2,"0")}`},uE=(e,t,n)=>{const r=e.settings||{},i=r.selectedPreviewId,a=r._autoCreatedPreviewId;if(i)return i;if(a)return a;const o=t.filter(l=>l.from===e.id).map(l=>n.get(l.to)).filter(l=>!!l&&l.type==="preview").map(l=>l.id);return o.length>0?o[o.length-1]:null},Pae=(e,t)=>{if(!(typeof document>"u")){document.querySelectorAll(".socket-energy-out-active").forEach(n=>n.classList.remove("socket-energy-out-active")),document.querySelectorAll(".socket-energy-in-active").forEach(n=>n.classList.remove("socket-energy-in-active")),document.querySelectorAll("[data-energy-color]").forEach(n=>n.removeAttribute("data-energy-color"));for(const n of e){const r=document.querySelector(`[data-node-id="${n.fromId}"]`),i=document.querySelector(`[data-node-id="${n.toId}"]`);r==null||r.querySelector(".connector"),i==null||i.querySelector(".input-point")}}},Oae=e=>{const t=new Map;for(const n of e)t.set(n.id,{startOffsetY:0,endOffsetY:0});return t},Lae=(e,t,n,r=0,i=0,a,o)=>{let l,c,u,d;if(a)l=a.x*n.zoom+n.x,c=a.y*n.zoom+n.y+r;else{const f=l$(e.id);f?(l=(f.x+f.width)*n.zoom+n.x,c=(f.y+f.height/2)*n.zoom+n.y+r):(l=(e.x+e.width)*n.zoom+n.x,c=(e.y+e.height/2)*n.zoom+n.y+r)}if(o)u=o.x*n.zoom+n.x,d=o.y*n.zoom+n.y+i;else{const f=l$(t.id);f?(u=f.x*n.zoom+n.x,d=(f.y+f.height/2)*n.zoom+n.y+i):(u=t.x*n.zoom+n.x,d=(t.y+t.height/2)*n.zoom+n.y+i)}const h=Math.max(Math.abs(u-l)*.5,50);return{pathD:`M ${l} ${c} C ${l+h} ${c}, ${u-h} ${d}, ${u} ${d}`,midX:(l+u)/2,midY:(c+d)/2}},dE=(e,t,n)=>{var a;const r=n.createSVGPoint();r.x=e,r.y=t;const i=r.matrixTransform(((a=n.getScreenCTM())==null?void 0:a.inverse())??n.createSVGMatrix());return{x:i.x,y:i.y}},hE=14,pE=(e,t,n)=>{if(!e||typeof e.getTotalLength!="function")return!1;const r=e.getTotalLength();if(!Number.isFinite(r)||r<=0)return!1;let i=1/0;const a=48;for(let o=0;o<=a;o++){const l=o/a*r,c=e.getPointAtLength(l),u=(c.x-t)**2+(c.y-n)**2;u{const r=e.getTotalLength();if(!Number.isFinite(r)||r<=0)return{x:t,y:n};const i=40;let a=0,o=1/0;for(let h=0;h<=i;h++){const p=h/i*r,f=e.getPointAtLength(p),b=(f.x-t)**2+(f.y-n)**2;b{const{pathD:b,midX:g,midY:y}=Lae(t,n,r,i,a,p,f),w=_.useRef(null),v=_.useRef(null),[m,z]=_.useState(!1),[C,E]=_.useState({x:g,y}),I=_.useCallback(()=>{v.current!==null&&(clearTimeout(v.current),v.current=null)},[]);_.useEffect(()=>()=>I(),[I]),_.useEffect(()=>{z(!1),I()},[r.x,r.y,r.zoom,I]);const R=_.useCallback(J=>{const Z=J.target.ownerSVGElement;if(!Z)return;const B=dE(J.clientX,J.clientY,Z),V=w.current;pE(V,B.x,B.y)&&(V&&V.getTotalLength()>0?E(Bae(V,B.x,B.y)):E({x:B.x,y:B.y}))},[]),A=_.useCallback(J=>{R(J)},[R]),O=_.useCallback(J=>{const Z=J.target.ownerSVGElement;if(!Z)return;const B=dE(J.clientX,J.clientY,Z);pE(w.current,B.x,B.y)&&(I(),v.current=setTimeout(()=>z(!0),500),R(J))},[I,R]),F=_.useCallback(J=>{const Z=J==null?void 0:J.relatedTarget;Z!=null&&Z.closest(".edge-delete-btn")||Z!=null&&Z.closest(".edge-hit-path")||(I(),z(!1))},[I]),L=l||o,X=c,T=X?Tae(e,u):null,q=T?Rae(T,u?"#18181b":"#ffffff",u?.72:.55):null,H=X?`edge-flow-gradient-${e.id}`:null;return s.jsxs("g",{"data-connection-id":e.id,className:"connection-group","data-energy":X?"true":void 0,style:{opacity:L?1:u?.6:1,transition:"opacity 0.15s ease"},children:[X&&H&&T&&q&&s.jsx("defs",{children:s.jsxs("linearGradient",{id:H,x1:"0%",y1:"0%",x2:"100%",y2:"0%",children:[s.jsx("stop",{offset:"0%",stopColor:q,stopOpacity:"0.18"}),s.jsx("stop",{offset:"34%",stopColor:q,stopOpacity:"0.18"}),s.jsx("stop",{offset:"44%",stopColor:T,stopOpacity:"0.98"}),s.jsx("stop",{offset:"56%",stopColor:T,stopOpacity:"0.98"}),s.jsx("stop",{offset:"66%",stopColor:q,stopOpacity:"0.18"}),s.jsx("stop",{offset:"100%",stopColor:q,stopOpacity:"0.18"}),s.jsx("animateTransform",{attributeName:"gradientTransform",type:"translate",from:"-1 0",to:"1 0",dur:"2.4s",repeatCount:"indefinite"})]})}),s.jsx("path",{ref:w,className:"edge-hit-path",d:b,stroke:"transparent",strokeWidth:"20",fill:"none",strokeLinecap:"round",style:{pointerEvents:"stroke",cursor:"pointer"},onMouseEnter:O,onMouseMove:A,onMouseLeave:F,onClick:J=>{J.stopPropagation(),h()},onDoubleClick:J=>{J.stopPropagation(),J.preventDefault(),d()},onContextMenu:J=>{J.preventDefault(),J.stopPropagation(),d()}}),s.jsx("path",{className:"edge-bg",d:b,stroke:u?"#27272a":"#e4e4e7",strokeWidth:"2",fill:"none",strokeLinecap:"round",style:{pointerEvents:"none"}}),s.jsx("path",{className:"edge-main",d:b,stroke:L?u?"#ffffff":"#3b82f6":u?"#52525b":"rgba(24, 24, 27, 0.85)",strokeWidth:L?"1.5":"1",fill:"none",strokeLinecap:"round",style:{pointerEvents:"none",transition:"stroke 0.15s ease, stroke-width 0.15s ease"}}),X&&H&&s.jsxs(s.Fragment,{children:[s.jsx("path",{className:"edge-flow-glow",d:b,stroke:`url(#${H})`,strokeWidth:2.6,fill:"none",strokeLinecap:"round",style:{pointerEvents:"none",filter:`url(#${u?"edge-flow-glow-dark":"edge-flow-glow-light"})`,opacity:u?.16:.1}}),s.jsx("path",{className:"edge-flow",d:b,stroke:`url(#${H})`,strokeWidth:1.35,fill:"none",strokeLinecap:"round",style:{pointerEvents:"none",opacity:.95}})]}),m&&s.jsxs("g",{className:"edge-delete-btn",transform:`translate(${C.x}, ${C.y})`,style:{cursor:"pointer",pointerEvents:"auto"},onClick:J=>{J.stopPropagation(),d()},onMouseLeave:J=>{const Z=J==null?void 0:J.relatedTarget;Z!=null&&Z.closest(".edge-hit-path")||(I(),z(!1))},children:[s.jsx("circle",{r:"15",fill:"transparent",stroke:"none",style:{pointerEvents:"all"}}),s.jsx("circle",{r:"8",fill:u?"#27272a":"#ffffff",stroke:u?"#52525b":"#18181b",strokeWidth:"1",className:"transition-opacity",style:{pointerEvents:"none"}}),s.jsx("text",{textAnchor:"middle",dominantBaseline:"central",fontSize:"11",fill:u?"#a1a1aa":"#52525b",className:"select-none",style:{pointerEvents:"none"},children:"×"})]})]})});i7.displayName="ConnectionLine";const sx=_.memo(({fromX:e,fromY:t,toX:n,toY:r,isDark:i,isReverse:a,groupRef:o})=>{const l=Math.max(Math.abs(n-e)*.5,50),c=a?`M ${e} ${t} C ${e-l} ${t}, ${n+l} ${r}, ${n} ${r}`:`M ${e} ${t} C ${e+l} ${t}, ${n-l} ${r}, ${n} ${r}`,u=i?"#fff":"#000";return s.jsxs("g",{className:"connecting-line",ref:o,"data-is-reverse":a?"true":"false",children:[s.jsx("path",{d:c,stroke:u,strokeWidth:1.5,strokeDasharray:"8,4",fill:"none",strokeLinecap:"round",opacity:.9}),s.jsx("circle",{cx:n,cy:r,r:4,fill:u})]})});sx.displayName="ConnectingLine";const Uae=({connections:e,nodes:t,view:n,viewportWidth:r,viewportHeight:i,selectedNodeId:a,selectedNodeIds:o,selectedConnectionId:l,onSelectConnection:c,isDark:u,onDeleteConnection:d,svgRef:h,collectionEndpoints:p})=>{const f=_.useRef(null),b=h||f,g=new Map;t.forEach(v=>g.set(v.id,v));const y=fr.useMemo(()=>Oae(e),[e]),w=fr.useMemo(()=>{const v=[];for(const m of e){const z=g.get(m.from),C=g.get(m.to);!z||!C||v.push(`${m.id}:${z.x},${z.y},${z.width},${z.height}->${C.x},${C.y},${C.width},${C.height}`)}return v.join("|")},[e,t]);return _.useEffect(()=>{requestAnimationFrame(()=>{Jd(e,n,b.current,n.zoom,void 0,void 0,p)});const v=setTimeout(()=>{Jd(e,n,b.current,n.zoom,void 0,void 0,p)},120),m=setTimeout(()=>{Jd(e,n,b.current,n.zoom,void 0,void 0,p)},280);return()=>{clearTimeout(v),clearTimeout(m)}},[e,n.zoom,n.x,n.y,p,w]),_.useEffect(()=>{const v=[];for(const m of e){const z=g.get(m.from),C=g.get(m.to);if(!z||!C||!cE(z)||C.type!=="preview")continue;const E=uE(z,e,g);E&&E===C.id&&v.push({fromId:z.id,toId:C.id})}Pae(v)},[e,t,u]),s.jsxs(s.Fragment,{children:[s.jsxs("defs",{children:[s.jsxs("filter",{id:"edge-flow-glow-dark",x:"-60%",y:"-60%",width:"220%",height:"220%",children:[s.jsx("feGaussianBlur",{stdDeviation:"3.2",result:"blur"}),s.jsxs("feMerge",{children:[s.jsx("feMergeNode",{in:"blur"}),s.jsx("feMergeNode",{in:"SourceGraphic"})]})]}),s.jsxs("filter",{id:"edge-flow-glow-light",x:"-60%",y:"-60%",width:"220%",height:"220%",children:[s.jsx("feGaussianBlur",{stdDeviation:"2.4",result:"blur"}),s.jsxs("feMerge",{children:[s.jsx("feMergeNode",{in:"blur"}),s.jsx("feMergeNode",{in:"SourceGraphic"})]})]})]}),e.filter(v=>g.get(v.from)&&g.get(v.to)).map((v,m)=>{var L,X;const z=g.get(v.from),C=g.get(v.to),E=y.get(v.id)||{startOffsetY:0,endOffsetY:0},I=(L=p==null?void 0:p.get(v.from))==null?void 0:L.output,R=(X=p==null?void 0:p.get(v.to))==null?void 0:X.input,A=a===v.from||a===v.to||o.has(v.from)||o.has(v.to),O=l===v.id,F=(()=>{if(!cE(z)||C.type!=="preview")return!1;const T=uE(z,e,g);return!!T&&T===C.id})();return s.jsx(i7,{connection:v,fromNode:z,toNode:C,view:n,startOffsetY:E.startOffsetY,endOffsetY:E.endOffsetY,isRelatedToSelected:A,isSelected:O,isTaskActiveOnThisEdge:F,isDark:u,onDelete:()=>d(v.id),onSelect:()=>c(v.id),overrideStartWorld:I,overrideEndWorld:R},v.id||`conn-${v.from}-${v.to}-${m}`)})]})},Fae=Uae,Wae=(e,t,n,r,i)=>{if(!e)return;const a=e.dataset.isReverse==="true",o=Math.max(Math.abs(r-t)*.5,50),l=a?`M ${t} ${n} C ${t-o} ${n}, ${r+o} ${i}, ${r} ${i}`:`M ${t} ${n} C ${t+o} ${n}, ${r-o} ${i}, ${r} ${i}`;e.querySelectorAll("path").forEach(d=>d.setAttribute("d",l));const u=e.querySelector("circle");u&&(u.setAttribute("cx",String(r)),u.setAttribute("cy",String(i)))},Dae=_.memo(({data:e,isDark:t,onDelete:n})=>{const{pathD:r,midX:i,midY:a,isRelatedToSelected:o}=e,l=`flow-gradient-local-${e.conn.id}`;return s.jsxs("g",{className:"connection-group",style:{opacity:o?1:.5,transition:"opacity 0.15s ease"},children:[s.jsx("defs",{children:s.jsxs("linearGradient",{id:l,x1:"0%",y1:"0%",x2:"100%",y2:"0%",children:[s.jsx("stop",{offset:"0%",stopColor:t?"#ffffff":"#0f172a",stopOpacity:"0.3"}),s.jsx("stop",{offset:"50%",stopColor:t?"#ffffff":"#0f172a",stopOpacity:"0.9"}),s.jsx("stop",{offset:"100%",stopColor:t?"#ffffff":"#0f172a",stopOpacity:"0.3"})]})}),s.jsx("path",{d:r,stroke:`url(#${l})`,strokeWidth:2,fill:"none",style:{pointerEvents:"stroke"}}),s.jsx("circle",{cx:i,cy:a,r:12,fill:"transparent",style:{cursor:"pointer",pointerEvents:"all"},onClick:c=>{c.stopPropagation(),n()}})]})},(e,t)=>!(e.data.conn.id!==t.data.conn.id||e.data.pathD!==t.data.pathD||e.data.isRelatedToSelected!==t.data.isRelatedToSelected||e.isDark!==t.isDark)),Vae=({connections:e,nodes:t,view:n,viewportWidth:r,viewportHeight:i,viewOffset:a,selectedNodeId:o,selectedNodeIds:l,isDark:c,onDeleteConnection:u})=>{const d=n.zoom<=.15,h=_.useMemo(()=>{const f=new Map;return t.forEach(b=>f.set(b.id,b)),f},[t]);if(d)return s.jsx("svg",{className:"connections-layer-local",style:{position:"absolute",top:0,left:0,width:"100%",height:"100%",pointerEvents:"none",overflow:"visible"},children:e.map(f=>{const b=h.get(f.from),g=h.get(f.to);if(!b||!g)return null;const y=b.x+b.width,w=b.y+b.height/2,v=g.x,m=g.y+g.height/2;return s.jsx("line",{x1:y,y1:w,x2:v,y2:m,stroke:c?"#ffffff":"#0f172a",strokeWidth:1,opacity:.3},f.id)})});const p=_.useMemo(()=>{const f=[];for(const b of e){const g=h.get(b.from),y=h.get(b.to);if(!g||!y)continue;const w=g.x+g.width,v=g.y+g.height/2,m=y.x,z=y.y+y.height/2,C=w*n.zoom+a.x,E=v*n.zoom+a.y,I=m*n.zoom+a.x,R=z*n.zoom+a.y,A=100,O=Math.min(C,I),F=Math.max(C,I),L=Math.min(E,R),X=Math.max(E,R);if(!!(F<-A||O>r+A||X<-A||L>i+A))continue;const q=Math.max(Math.abs(m-w)*.5,50),H=`M ${w} ${v} C ${w+q} ${v}, ${m-q} ${z}, ${m} ${z}`,J=(w+m)/2,Z=(v+z)/2,B=o===b.from||o===b.to||l.has(b.from)||l.has(b.to);f.push({conn:b,startX:w,startY:v,endX:m,endY:z,pathD:H,midX:J,midY:Z,isRelatedToSelected:B})}return f.sort((b,g)=>b.isRelatedToSelected&&!g.isRelatedToSelected?1:!b.isRelatedToSelected&&g.isRelatedToSelected?-1:0),f},[e,h,n.zoom,r,i,a.x,a.y,o,l]);return s.jsx(s.Fragment,{children:p.map(f=>s.jsx(Dae,{data:f,isDark:c,onDelete:()=>u(f.conn.id)},f.conn.id))})},Hae=(e,t)=>!(e.connections!==t.connections||e.nodes!==t.nodes||e.view.zoom!==t.view.zoom||e.viewportWidth!==t.viewportWidth||e.viewportHeight!==t.viewportHeight||e.selectedNodeId!==t.selectedNodeId||e.selectedNodeIds!==t.selectedNodeIds||e.isDark!==t.isDark);_.memo(Vae,Hae);const fE=25,mE=1,i_=.3,gE=.5,Gae=({view:e,isDark:t,isPanning:n,showGrid:r=!0,backgroundColor:i})=>{const a=_.useMemo(()=>e.zoom<=i_?0:e.zoom>=gE?1:(e.zoom-i_)/(gE-i_),[e.zoom]),o=r&&a>0,l=e.x,c=e.y,u=i!=null&&i.trim()?i.trim():t?"#09090b":"#dfdfdf",d=t?`rgba(63, 63, 70, ${a})`:`rgba(82, 82, 91, ${a*.42})`;return s.jsxs("div",{className:"absolute inset-0","data-canvas-bg":"true",style:{backgroundColor:u,backgroundImage:o?`radial-gradient(circle, ${d} ${mE}px, transparent ${mE}px)`:"none",backgroundSize:o?`${fE}px ${fE}px`:void 0,backgroundPosition:o?`${l}px ${c}px`:void 0,cursor:n?"grabbing":"default",...o?{transform:"translateZ(0)",willChange:"transform"}:{},...o?{contain:"paint"}:{}},children:[s.jsx("div",{className:"absolute inset-0 pointer-events-none",style:{background:"none"}}),s.jsx("div",{className:"absolute pointer-events-none",style:{top:"40%",left:"50%",transform:"translate(-50%, -50%)",width:"60%",height:"40%",background:"none",opacity:0}})]})},qae=(e,t)=>!(e.view.x!==t.view.x||e.view.y!==t.view.y||e.view.zoom!==t.view.zoom||e.isDark!==t.isDark||e.isPanning!==t.isPanning||e.showGrid!==t.showGrid||(e.backgroundColor||"")!==(t.backgroundColor||"")),Kae=_.memo(Gae,qae),Xae=({visible:e,nodeIds:t,position:n,viewZoom:r,viewOffset:i,isDark:a=!0,onStartConnection:o,onMouseMove:l})=>{const[c,u]=_.useState(!1),[d,h]=_.useState(!1),p=n.x*r+i.x,f=n.y*r+i.y,b=_.useCallback(g=>{g.preventDefault(),g.stopPropagation(),h(!0),o(t)},[t,o]);return _.useEffect(()=>{if(!d)return;const g=w=>{if(l){const v=(w.clientX-i.x)/r,m=(w.clientY-i.y)/r;l(v,m)}},y=()=>{h(!1)};return window.addEventListener("mousemove",g),window.addEventListener("mouseup",y),()=>{window.removeEventListener("mousemove",g),window.removeEventListener("mouseup",y)}},[d,r,i,l]),!e||t.length<2?null:s.jsxs("div",{className:"absolute z-[400] pointer-events-auto",style:{left:`${p}px`,top:`${f}px`,transform:"translate(-50%, -50%)"},children:[s.jsxs("button",{onMouseDown:b,onMouseEnter:()=>u(!0),onMouseLeave:()=>u(!1),className:`flex items-center justify-center gap-2 transition-all duration-200 ${c?"rounded-full px-4":"rounded-full"} ${a?"bg-transparent hover:bg-white/5 border border-white/30 text-white":"bg-blue-500 hover:bg-blue-400 border-2 border-blue-300"}`,style:{height:"48px",minWidth:"48px",width:c?"auto":"48px",cursor:d?"grabbing":"grab"},children:[s.jsx(Bp,{size:24,className:"text-white"}),c&&s.jsxs("span",{className:"text-sm font-medium whitespace-nowrap text-white",children:["批量连接 (",t.length,")"]})]}),!c&&!d&&s.jsxs("div",{className:`absolute top-full mt-2 left-1/2 transform -translate-x-1/2 text-xs whitespace-nowrap px-2 py-1 rounded ${a?"bg-transparent text-white border border-white/30":"bg-white text-zinc-700 shadow-lg"}`,children:["拖拽连接 ",t.length," 个图片"]})]})},Yae=({visible:e,nodeIds:t,position:n,viewZoom:r,viewOffset:i,isDark:a=!0,onStartConnection:o,onMouseMove:l})=>{const[c,u]=_.useState(!1),[d,h]=_.useState(!1),p=n.x*r+i.x,f=n.y*r+i.y,b=_.useCallback(g=>{g.preventDefault(),g.stopPropagation(),h(!0),o(t)},[t,o]);return _.useEffect(()=>{if(!d)return;const g=w=>{if(l){const v=(w.clientX-i.x)/r,m=(w.clientY-i.y)/r;l(v,m)}},y=()=>{h(!1)};return window.addEventListener("mousemove",g),window.addEventListener("mouseup",y),()=>{window.removeEventListener("mousemove",g),window.removeEventListener("mouseup",y)}},[d,r,i,l]),!e||t.length<2?null:s.jsxs("div",{className:"absolute z-[400] pointer-events-auto",style:{left:`${p}px`,top:`${f}px`,transform:"translate(-50%, -50%)"},children:[s.jsxs("button",{onMouseDown:b,onMouseEnter:()=>u(!0),onMouseLeave:()=>u(!1),className:`flex items-center justify-center gap-2 transition-all duration-200 ${c?"rounded-full px-4":"rounded-full"} ${a?"bg-transparent hover:bg-white/5 border border-white/30 text-white":"bg-purple-500 hover:bg-purple-400 border-2 border-purple-300"}`,style:{height:"48px",minWidth:"48px",width:c?"auto":"48px",cursor:d?"grabbing":"grab"},children:[s.jsx(JG,{size:24,className:"text-white"}),c&&s.jsxs("span",{className:"text-sm font-medium whitespace-nowrap text-white",children:["反向批量连接 (",t.length,")"]})]}),!c&&!d&&s.jsxs("div",{className:`absolute top-full mt-2 left-1/2 transform -translate-x-1/2 text-xs whitespace-nowrap px-2 py-1 rounded ${a?"bg-transparent text-white border border-white/30":"bg-white text-zinc-700 shadow-lg"}`,children:["拖拽源节点连接到 ",t.length," 个目标"]})]})},xE="#a3a3a3",Jae=(e,t)=>e.groups===t.groups&&e.nodes===t.nodes&&e.selectedGroupId===t.selectedGroupId&&e.isDark===t.isDark&&e.onGroupSelect===t.onGroupSelect&&e.onGroupResize===t.onGroupResize&&e.view.zoom===t.view.zoom,Zae=({groups:e,nodes:t,view:n,selectedGroupId:r,onGroupSelect:i,isDark:a=!1,onGroupResize:o})=>{const l=_.useRef(null),c=_.useCallback((h,p,f,b)=>{o&&(f.preventDefault(),f.stopPropagation(),l.current={groupId:h,origin:p,startMouseX:f.clientX,startMouseY:f.clientY,startBounds:b})},[o]);_.useEffect(()=>{if(!o)return;const h=f=>{const b=l.current;if(!b)return;const g=f.clientX-b.startMouseX,y=f.clientY-b.startMouseY,w=g/n.zoom,v=y/n.zoom,{x:m,y:z,width:C,height:E}=b.startBounds;let I=m,R=z,A=C,O=E;const F=40;switch(b.origin){case"nw":I=m+w,R=z+v,A=C-w,O=E-v;break;case"ne":R=z+v,A=C+w,O=E-v;break;case"sw":I=m+w,A=C-w,O=E+v;break;case"se":A=C+w,O=E+v;break}A=Math.max(F,A),O=Math.max(F,O),o(b.groupId,{x:I,y:R,width:A,height:O})},p=()=>{l.current=null};return window.addEventListener("mousemove",h),window.addEventListener("mouseup",p),()=>{window.removeEventListener("mousemove",h),window.removeEventListener("mouseup",p)}},[o,n.zoom]);const u=_.useMemo(()=>e.filter(h=>!h.collapsed).map(h=>{const p=Vp(h.nodeIds,t);return{...h,bounds:p}}),[e,t]),d=_.useCallback((h,p)=>{p.stopPropagation(),i(h===r?null:h)},[r,i]);return s.jsx("div",{className:"absolute pointer-events-none",style:{zIndex:5,left:0,top:0,width:"100%",height:"100%"},children:u.map(h=>{const p=!a&&h.color==="#ffffff"?xE:h.color,f=!a&&h.color==="#ffffff"?`${xE}18`:`${h.color}10`,b=12;return s.jsxs("div",{className:"absolute pointer-events-none",style:{left:h.bounds.x,top:h.bounds.y,width:h.bounds.width,height:h.bounds.height},children:[s.jsx("div",{className:"absolute inset-0 rounded-lg pointer-events-none",style:{border:`2px dashed ${p}`,backgroundColor:f,opacity:.6}}),s.jsx("div",{className:"absolute left-0 top-0 w-full rounded-t-lg pointer-events-auto",style:{height:b},onClick:g=>d(h.id,g)}),s.jsx("div",{className:"absolute right-0 top-0 h-full rounded-r-lg pointer-events-auto",style:{width:b},onClick:g=>d(h.id,g)}),s.jsx("div",{className:"absolute left-0 bottom-0 w-full rounded-b-lg pointer-events-auto",style:{height:b},onClick:g=>d(h.id,g)}),s.jsx("div",{className:"absolute left-0 top-0 h-full rounded-l-lg pointer-events-auto",style:{width:b},onClick:g=>d(h.id,g)}),o&&s.jsx(s.Fragment,{children:s.jsx("div",{className:"absolute w-5 h-5 z-[60] flex items-end justify-end cursor-nwse-resize pointer-events-auto",style:{right:-6,bottom:-6},onMouseDown:g=>c(h.id,"se",g,h.bounds),title:"拖拽缩放分组",children:s.jsx("div",{className:"w-3 h-3 rounded-sm bg-white/90 border border-zinc-500 shadow-sm flex items-center justify-center",style:{boxShadow:"0 0 0 1px rgba(0,0,0,0.25)"},children:s.jsx("svg",{viewBox:"0 0 16 16",className:"w-2.5 h-2.5 text-zinc-700",children:s.jsx("path",{d:"M4 12h2v-2h2V8h2V6h2V4h-2v2h-2v2H8v2H6v2H4v-2z",fill:"currentColor"})})})})})]},h.id)})})},Qae=_.memo(Zae,Jae),a_="#a3a3a3",eoe=(e,t)=>e.groups===t.groups&&e.nodes===t.nodes&&e.view.zoom===t.view.zoom&&e.selectedGroupId===t.selectedGroupId&&e.isDark===t.isDark&&e.onGroupNameChange===t.onGroupNameChange&&e.onGroupColorChange===t.onGroupColorChange&&e.onGroupDelete===t.onGroupDelete&&e.onGroupExecute===t.onGroupExecute&&e.onGroupDragStart===t.onGroupDragStart&&e.onGroupExportWorkflow===t.onGroupExportWorkflow,toe=({groups:e,nodes:t,view:n,selectedGroupId:r,onGroupNameChange:i,onGroupColorChange:a,onGroupDelete:o,onGroupExecute:l,onGroupDragStart:c,onGroupExportWorkflow:u,isDark:d=!1,onTogglePreviewCollapsed:h})=>{const[p,f]=_.useState(null),[b,g]=_.useState(""),[y,w]=_.useState(null),[v,m]=_.useState(null),z=_.useMemo(()=>e.filter(L=>!L.collapsed).map(L=>{const X=Vp(L.nodeIds,t);return{...L,bounds:X}}),[e,t]),C=_.useCallback((L,X,T)=>{T.stopPropagation(),f(L),g(X)},[]),E=_.useCallback(L=>{b.trim()&&i(L,b.trim()),f(null),g("")},[b,i]),I=_.useCallback(()=>{f(null),g("")},[]),R=_.useCallback((L,X)=>{X.stopPropagation(),w(T=>T===L?null:L)},[]),A=_.useCallback((L,X,T)=>{T.stopPropagation(),a(L,X),w(null)},[a]),O=_.useCallback((L,X)=>{X.stopPropagation(),o(L)},[o]),F=_.useCallback((L,X)=>{X.stopPropagation(),l(L)},[l]);return s.jsx("div",{className:"absolute pointer-events-none",style:{zIndex:100,left:0,top:0,width:"100%",height:"100%"},children:z.map(L=>{const X=L.id===p,T=L.id===y,q=!!L.previewCollapsed;return s.jsx("div",{className:"absolute pointer-events-auto",style:{left:L.bounds.x,top:L.bounds.y-45/n.zoom},children:s.jsxs("div",{className:`flex items-center gap-1.5 px-2 py-1.5 rounded-lg ${d?"bg-zinc-900/40 border border-zinc-600 shadow-none":"bg-gray-900/95 shadow-lg rounded-md border-0"}`,style:{cursor:"move",transform:`scale(${1/n.zoom})`,transformOrigin:"top left",...d?{borderLeft:`2px solid ${L.color}`}:{borderLeft:`3px solid ${L.color==="#ffffff"?a_:L.color}`}},onMouseDown:H=>{H.preventDefault(),H.stopPropagation(),c(L.id,H)},onClick:H=>{H.stopPropagation()},children:[X?s.jsx("input",{type:"text",value:b,onChange:H=>g(H.target.value),onKeyDown:H=>{H.key==="Enter"?E(L.id):H.key==="Escape"&&I()},onBlur:()=>E(L.id),className:`w-24 px-2 py-0.5 text-xs rounded outline-none ${d?"text-zinc-100 bg-transparent border border-zinc-600 focus:border-zinc-500":"text-white bg-gray-800 border border-gray-700 focus:border-gray-600"}`,autoFocus:!0,onClick:H=>H.stopPropagation()}):s.jsx("span",{className:`text-xs font-medium cursor-text px-1 ${d?"text-zinc-200":"text-white"}`,onClick:H=>C(L.id,L.name,H),children:L.name}),s.jsx("div",{className:`w-px h-4 shrink-0 ${d?"bg-zinc-600":"bg-gray-700"}`}),h&&s.jsx("button",{className:`flex items-center justify-center w-6 h-6 rounded transition-colors border ${d?"bg-transparent border-zinc-600 hover:bg-zinc-800/50 text-zinc-300 hover:text-zinc-100":"bg-gray-800 hover:bg-gray-700 text-white border-transparent"}`,onClick:H=>{H.stopPropagation(),h(L.id)},title:q?"显示组内节点":"预览折叠组内节点",children:s.jsxs("svg",{className:"w-3.5 h-3.5",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",children:[s.jsx("path",{d:"M1 12s4-7 11-7 11 7 11 7-4 7-11 7S1 12 1 12Z"}),s.jsx("circle",{cx:"12",cy:"12",r:"3"}),q&&s.jsx("line",{x1:"4",y1:"4",x2:"20",y2:"20"})]})}),s.jsx("button",{className:`flex items-center justify-center w-6 h-6 rounded transition-all ${d?"border border-zinc-600 bg-transparent text-zinc-300 hover:text-zinc-100 hover:border-zinc-500":"border-0 hover:scale-110"}`,style:d?void 0:{backgroundColor:L.color==="#ffffff"?a_:L.color},onClick:H=>F(L.id,H),title:"整组执行",children:s.jsx("svg",{className:"w-3.5 h-3.5",fill:"currentColor",viewBox:"0 0 24 24",children:s.jsx("path",{d:"M8 5v14l11-7z"})})}),s.jsx("button",{className:`flex items-center justify-center w-6 h-6 rounded transition-colors border ${d?"bg-transparent border-zinc-600 hover:bg-zinc-800/50 text-zinc-300 hover:text-zinc-100":"bg-gray-800 hover:bg-gray-700 text-white border-transparent"}`,onClick:H=>{H.stopPropagation(),u(L.id)},title:"创建工作流",children:s.jsx("svg",{className:"w-3.5 h-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:s.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 4v16m8-8H4"})})}),s.jsxs("div",{className:"relative",children:[s.jsx("button",{className:`flex items-center justify-center w-6 h-6 rounded transition-colors border ${d?"bg-transparent border-zinc-600 hover:bg-zinc-800/50 text-zinc-400":"bg-gray-800 hover:bg-gray-700 border-transparent"}`,onClick:H=>R(L.id,H),title:"背景颜色",children:s.jsx("div",{className:`w-3.5 h-3.5 rounded-sm ${d?"border border-zinc-500":"border border-gray-600"}`,style:{backgroundColor:!d&&L.color==="#ffffff"?a_:L.color}})}),T&&s.jsx("div",{className:`absolute top-full left-0 mt-1 p-1.5 rounded-lg shadow-xl flex gap-1 z-50 ${d?"bg-zinc-900/95 border border-zinc-600":"bg-gray-900 border border-gray-700"}`,onClick:H=>H.stopPropagation(),children:x$.map(H=>s.jsx("button",{className:"w-5 h-5 rounded-sm border transition-all hover:scale-110",style:{backgroundColor:H,borderColor:L.color===H?d?"#e4e4e7":"#ffffff":d?"#3f3f46":"#4b5563",borderWidth:L.color===H?"2px":"1px"},onClick:J=>A(L.id,H,J),title:H},H))})]}),s.jsx("div",{className:`w-px h-4 shrink-0 ${d?"bg-zinc-600":"bg-gray-700"}`}),s.jsx("button",{className:`flex items-center justify-center w-6 h-6 rounded transition-colors border ${d?"bg-transparent border-zinc-600 hover:bg-red-500/20 text-zinc-400 hover:text-red-400 hover:border-red-500/50":"bg-gray-800 hover:bg-red-600 text-white border-transparent"}`,onClick:H=>O(L.id,H),title:"解组",children:s.jsx("svg",{className:"w-3.5 h-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:s.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"})})})]})},`toolbar-${L.id}`)})})},noe=_.memo(toe,eoe),roe=({selectedNodeIds:e,collections:t,groups:n=[],onCollect:r,onExpand:i,isDark:a=!1,isSelecting:o=!1})=>{const[l,c]=_.useState(""),[u,d]=_.useState(!1),[h,p]=_.useState(!1),f=e.size,b=f>0&&!o,g=b&&n.length>0?XO(Array.from(e),n):!1,y=b&&!g,w=_.useCallback(()=>{const m=Array.from(e);m.length!==0&&(r(m,l.trim()||void 0),c(""),d(!1))},[e,l,r]),v=_.useCallback(()=>{p(m=>!m)},[]);return!b&&t.length===0?null:s.jsxs("div",{className:"absolute top-3 left-1/2 -translate-x-1/2 z-20 flex flex-col items-center gap-2 pointer-events-auto",style:{maxWidth:"min(420px, calc(100vw - 24px))"},children:[y&&s.jsxs("div",{className:` + flex flex-nowrap items-center gap-2 rounded-xl border shadow-lg w-fit pr-2 + ${a?"bg-zinc-900/95 border-zinc-700/80 backdrop-blur-sm":"bg-white/95 border-zinc-200 backdrop-blur-sm"} + `,children:[s.jsxs("div",{className:`flex flex-nowrap items-center gap-2 pl-3 py-2 pr-2 shrink-0 ${a?"text-zinc-300":"text-zinc-700"}`,children:[s.jsx(Rv,{size:16,className:a?"text-zinc-400":"text-zinc-500"}),s.jsxs("span",{className:"text-xs font-medium whitespace-nowrap",children:["已选 ",s.jsx("span",{className:"font-semibold text-inherit",children:f})," 个节点"]})]}),u?s.jsxs("div",{className:"flex flex-nowrap items-center gap-1.5 py-1.5 pr-2 shrink-0",children:[s.jsx("input",{type:"text",value:l,onChange:m=>c(m.target.value),onKeyDown:m=>{m.key==="Enter"&&w(),m.key==="Escape"&&d(!1)},placeholder:"收纳夹名称",className:` + w-24 px-2 py-1 text-xs rounded-md border outline-none + ${a?"bg-zinc-800 border-zinc-600 text-zinc-200 placeholder-zinc-500":"bg-zinc-50 border-zinc-300 text-zinc-800 placeholder-zinc-400"} + `,autoFocus:!0}),s.jsx("button",{onClick:w,className:`px-2.5 py-1 text-xs font-medium rounded-md transition-colors ${a?"bg-emerald-600 hover:bg-emerald-500 text-white":"bg-emerald-500 hover:bg-emerald-600 text-white"}`,children:"确定"})]}):s.jsxs("div",{className:"flex flex-nowrap items-center shrink-0",children:[s.jsx("button",{onClick:()=>d(!0),className:`px-2 py-1 text-[10px] rounded-lg transition-colors whitespace-nowrap ${a?"text-zinc-400 hover:bg-zinc-800 hover:text-zinc-300":"text-zinc-500 hover:bg-zinc-100 hover:text-zinc-700"}`,title:"自定义名称",children:"命名"}),s.jsxs("button",{onClick:w,className:` + flex flex-nowrap items-center gap-1.5 px-3 py-2 rounded-lg text-xs font-medium transition-colors whitespace-nowrap + ${a?"bg-zinc-700 hover:bg-zinc-600 text-zinc-100":"bg-zinc-800 hover:bg-zinc-700 text-white"} + `,title:"将选中节点收纳,不显示以节约性能,连线保留",children:[s.jsx(Rv,{size:14}),"收纳"]})]})]}),t.length>0&&s.jsxs("div",{className:"flex flex-col items-center",children:[s.jsxs("button",{onClick:v,className:` + flex items-center gap-2 px-3 py-1.5 rounded-lg border text-xs font-medium transition-colors + ${a?"bg-zinc-900/90 border-zinc-700/80 text-zinc-400 hover:text-zinc-300 hover:bg-zinc-800/90":"bg-white/90 border-zinc-200 text-zinc-500 hover:text-zinc-700 hover:bg-zinc-50"} + `,children:[s.jsx(Ll,{size:12}),"收纳夹 (",t.length,")",s.jsx(Ei,{size:12,className:`transition-transform ${h?"rotate-180":""}`})]}),h&&s.jsx("div",{className:` + mt-1.5 rounded-xl border shadow-lg overflow-hidden + ${a?"bg-zinc-900/95 border-zinc-700/80":"bg-white/95 border-zinc-200"} + `,children:t.map(m=>s.jsxs("div",{className:` + flex items-center justify-between gap-3 px-3 py-2 border-b last:border-b-0 + ${a?"border-zinc-800":"border-zinc-100"} + `,children:[s.jsx("span",{className:`text-xs truncate max-w-[180px] ${a?"text-zinc-300":"text-zinc-700"}`,title:m.name,children:m.name}),s.jsxs("span",{className:`text-[10px] shrink-0 ${a?"text-zinc-500":"text-zinc-400"}`,children:[m.nodeIds.length," 个节点"]}),s.jsxs("button",{onClick:()=>i(m.id),className:` + flex items-center gap-1 px-2 py-1 rounded text-[10px] font-medium transition-colors + ${a?"text-emerald-400 hover:bg-zinc-800":"text-emerald-600 hover:bg-zinc-100"} + `,title:"展开后节点重新显示在画布",children:[s.jsx(Ll,{size:10}),"展开"]})]},m.id))})]})]})};_.memo(roe);const soe=-60,ioe=160,O1=80,bE=45;function aoe(e,t){const n=t.filter(l=>e.has(l.id));if(n.length===0)return null;let r=1/0,i=1/0,a=-1/0,o=-1/0;return n.forEach(l=>{r=Math.min(r,l.x),i=Math.min(i,l.y),a=Math.max(a,l.x+l.width),o=Math.max(o,l.y+l.height)}),{centerX:(r+a)/2,centerY:(i+o)/2,minX:r,minY:i}}const ooe=({view:e,nodes:t,groups:n,selectedNodeIds:r,isSelecting:i,showCollectionPopup:a,onCollect:o,onExpand:l,onClearSelection:c,updateCollectionPosition:u,isDark:d=!1,compactModeEnabledForSelection:h,onToggleCompactModeForSelection:p})=>{const[f,b]=_.useState(""),[g,y]=_.useState(!1),[w,v]=_.useState(null),m=_.useRef(null),z=_.useMemo(()=>n.filter(F=>F.collapsed),[n]),C=_.useMemo(()=>XO(Array.from(r),n),[r,n]),E=_.useMemo(()=>aoe(r,t),[r,t]),I=r.size>0&&!i&&a&&!C,R=_.useMemo(()=>{const F=new Map;return z.forEach(L=>{if(L.collapsedX!=null&&L.collapsedY!=null)F.set(L.id,{x:L.collapsedX,y:L.collapsedY});else{const X=Vp(L.nodeIds,t),T=X.width>0?X.x+X.width/2:200,q=X.height>0?X.y+X.height/2:200;F.set(L.id,{x:T,y:q})}}),F},[z,t]),A=_.useCallback(()=>{const F=Array.from(r);if(F.length===0)return;const L=E?{x:E.centerX,y:E.centerY}:void 0;o(F,f.trim()||void 0,L),b(""),y(!1),c()},[r,f,E,o,c]),O=_.useCallback((F,L,X,T)=>{L.preventDefault(),L.stopPropagation(),v(F),m.current={groupId:F,startX:X,startY:T,clientX:L.clientX,clientY:L.clientY}},[]);return _.useEffect(()=>{if(!w)return;const F=X=>{const T=m.current;if(!T||T.groupId!==w)return;const q=X.clientX-T.clientX,H=X.clientY-T.clientY,J=q/e.zoom,Z=H/e.zoom;u(T.groupId,T.startX+J,T.startY+Z)},L=()=>{v(null),m.current=null};return window.addEventListener("mousemove",F),window.addEventListener("mouseup",L),()=>{window.removeEventListener("mousemove",F),window.removeEventListener("mouseup",L)}},[w,e.zoom,u]),!I&&z.length===0?null:s.jsx("div",{className:"absolute inset-0 pointer-events-none",style:{zIndex:25},children:s.jsxs("div",{className:"absolute inset-0 pointer-events-auto",children:[I&&E&&s.jsx("div",{className:"absolute pointer-events-auto",style:{left:E.centerX,top:E.minY+soe,transform:"translate(-50%, 0)"},children:s.jsxs("div",{className:` + flex flex-nowrap items-center gap-2 rounded-xl border shadow-lg w-fit pr-2 + ${d?"bg-zinc-900/95 border-zinc-700/80":"bg-white/95 border-zinc-200"} + `,children:[s.jsxs("div",{className:`flex flex-nowrap items-center gap-2 pl-3 py-2 pr-2 shrink-0 ${d?"text-zinc-300":"text-zinc-700"}`,children:[s.jsx(Rv,{size:16,className:d?"text-zinc-400":"text-zinc-500"}),s.jsxs("span",{className:"text-xs font-medium whitespace-nowrap",children:["已选 ",s.jsx("span",{className:"font-semibold",children:r.size})," 个节点"]})]}),g?s.jsxs("div",{className:"flex flex-nowrap items-center gap-1.5 py-1.5 pr-2 shrink-0",children:[s.jsxs("button",{type:"button",onClick:F=>{F.preventDefault(),F.stopPropagation(),p(Array.from(r),!h)},className:` + flex flex-nowrap items-center gap-1.5 px-2 py-1 text-[10px] rounded-lg pointer-events-auto whitespace-nowrap + ${d?h?"bg-zinc-800 text-zinc-200":"text-zinc-400 hover:bg-zinc-800":h?"bg-zinc-200 text-zinc-700":"text-zinc-500 hover:bg-zinc-100"} + `,title:"简洁模式:隐藏输入控件,只保留图片/视频预览(并可在预览窗口查看提示词)",children:[s.jsx(cl,{size:12,className:d?"text-zinc-400":"text-zinc-600"}),"简洁模式"]}),s.jsx("input",{type:"text",value:f,onChange:F=>b(F.target.value),onKeyDown:F=>{F.key==="Enter"&&A(),F.key==="Escape"&&y(!1)},placeholder:"收纳夹名称",className:` + w-24 px-2 py-1 text-xs rounded-md border outline-none pointer-events-auto + ${d?"bg-zinc-800 border-zinc-600 text-zinc-200":"bg-zinc-50 border-zinc-300 text-zinc-800"} + `,autoFocus:!0}),s.jsx("button",{onClick:A,className:"px-2.5 py-1 text-xs font-medium rounded-md bg-emerald-600 hover:bg-emerald-500 text-white pointer-events-auto",children:"确定"})]}):s.jsxs("div",{className:"flex flex-nowrap items-center shrink-0",children:[s.jsx("button",{onClick:()=>y(!0),className:`px-2 py-1 text-[10px] rounded-lg pointer-events-auto whitespace-nowrap ${d?"text-zinc-400 hover:bg-zinc-800":"text-zinc-500 hover:bg-zinc-100"}`,title:"自定义名称",children:"命名"}),s.jsxs("button",{type:"button",onClick:F=>{F.preventDefault(),F.stopPropagation(),p(Array.from(r),!h)},className:` + flex flex-nowrap items-center gap-1.5 px-2 py-1 text-[10px] rounded-lg pointer-events-auto whitespace-nowrap + ${d?h?"bg-zinc-800 text-zinc-200":"text-zinc-400 hover:bg-zinc-800":h?"bg-zinc-200 text-zinc-700":"text-zinc-500 hover:bg-zinc-100"} + `,title:"简洁模式:隐藏输入控件,只保留图片/视频预览(并可在预览窗口查看提示词)",children:[s.jsx(cl,{size:12,className:d?"text-zinc-400":"text-zinc-600"}),"简洁模式"]}),s.jsxs("button",{onClick:A,className:` + flex flex-nowrap items-center gap-1.5 px-3 py-2 rounded-lg text-xs font-medium pointer-events-auto whitespace-nowrap + ${d?"bg-zinc-700 hover:bg-zinc-600 text-zinc-100":"bg-zinc-800 hover:bg-zinc-700 text-white"} + `,title:"在当前位置创建收纳夹,可拖动",children:[s.jsx(Rv,{size:14}),"收纳"]})]})]})}),z.map(F=>{const L=R.get(F.id);if(!L)return null;const X=w===F.id;return s.jsxs("div",{className:`absolute pointer-events-auto rounded-xl border shadow-lg transition-colors ${X?"opacity-90 scale-[1.02]":""} ${d?"bg-zinc-900/95 border-zinc-700/80":"bg-white/95 border-zinc-200"}`,style:{left:L.x,top:L.y,transform:"translate(-50%, -50%)",minWidth:ioe},title:"拖入节点收纳;点击展开恢复显示",children:[s.jsxs("div",{className:` + flex items-center gap-2 px-3 py-2 cursor-grab active:cursor-grabbing + ${d?"border-b border-zinc-800":"border-b border-zinc-100"} + `,onMouseDown:T=>O(F.id,T,L.x,L.y),children:[s.jsx(k5,{size:12,className:d?"text-zinc-500":"text-zinc-400"}),s.jsx(Ll,{size:14,className:d?"text-zinc-400":"text-zinc-500"}),s.jsx("span",{className:`text-xs font-medium truncate flex-1 ${d?"text-zinc-300":"text-zinc-700"}`,title:F.name,children:F.name}),s.jsxs("span",{className:`text-[10px] shrink-0 ${d?"text-zinc-500":"text-zinc-400"}`,children:[F.nodeIds.length," 个节点"]})]}),s.jsx("div",{className:"flex justify-end px-2 py-1.5",children:s.jsxs("button",{onClick:()=>l(F.id),className:` + flex items-center gap-1 px-2 py-1 rounded text-[10px] font-medium pointer-events-auto + ${d?"text-emerald-400 hover:bg-zinc-800":"text-emerald-600 hover:bg-zinc-100"} + `,title:"展开后节点重新显示",children:[s.jsx(Ll,{size:10}),"展开"]})})]},F.id)})]})})},loe=_.memo(ooe),dp=160,hp=100,co=8,coe=4e3,uoe=200,o_=24,L1=2.5;function doe(e){if(!e.length){const o=coe/2;return{minX:-o,minY:-o,maxX:o,maxY:o}}let t=1/0,n=1/0,r=-1/0,i=-1/0;for(const o of e)t=Math.min(t,o.x),n=Math.min(n,o.y),r=Math.max(r,o.x+(o.width||200)),i=Math.max(i,o.y+(o.height||120));const a=uoe;return{minX:t-a,minY:n-a,maxX:r+a,maxY:i+a}}function hoe({view:e,viewportWidth:t,viewportHeight:n,nodes:r,onViewChange:i,isDark:a=!0,className:o=""}){const l=_.useRef(null),[c,u]=_.useState(!1),d=_.useRef(e);d.current=e;const h=_.useMemo(()=>doe(r),[r]),p=h.maxX-h.minX,f=h.maxY-h.minY,b=_.useMemo(()=>({left:-e.x/e.zoom,top:-e.y/e.zoom,width:t/e.zoom,height:n/e.zoom}),[e.x,e.y,e.zoom,t,n]),g=_.useCallback(T=>co+(T-h.minX)/p*(dp-2*co),[h.minX,p]),y=_.useCallback(T=>co+(T-h.minY)/f*(hp-2*co),[h.minY,f]),w=_.useCallback(T=>{const q=(T-co)/(dp-2*co);return h.minX+q*p},[h.minX,p]),v=_.useCallback(T=>{const q=(T-co)/(hp-2*co);return h.minY+q*f},[h.minY,f]),m=_.useMemo(()=>{const T=g(b.left),q=y(b.top),H=g(b.left+b.width),J=y(b.top+b.height);return{x:Math.max(co,Math.min(dp-co,T)),y:Math.max(co,Math.min(hp-co,q)),width:Math.max(4,Math.min(dp-2*co,H-T)),height:Math.max(4,Math.min(hp-2*co,J-q))}},[b,g,y]),z=_.useMemo(()=>r.length?(r.length<=o_?r:Array.from({length:o_},(q,H)=>r[Math.round(H*(r.length-1)/(o_-1))])).map(q=>{const H=q.x+(q.width||200)/2,J=q.y+(q.height||120)/2;return{x:g(H)-L1/2,y:y(J)-L1/2}}):[],[r,g,y]),C=_.useCallback(T=>{var V,N;if(T.preventDefault(),!l.current)return;const q=l.current.getBoundingClientRect(),H=T.clientX-q.left,J=T.clientY-q.top,Z=w(H),B=v(J);i({...e,x:t/2-Z*e.zoom,y:n/2-B*e.zoom}),u(!0),(N=(V=T.target).setPointerCapture)==null||N.call(V,T.pointerId)},[e,t,n,w,v,i]),E=_.useCallback(T=>{if(!c||!l.current)return;const q=l.current.getBoundingClientRect(),H=T.clientX-q.left,J=T.clientY-q.top,Z=w(H),B=v(J),V=d.current;i({...V,x:t/2-Z*V.zoom,y:n/2-B*V.zoom})},[c,t,n,w,v,i]),I=_.useCallback(T=>{var q,H;(H=(q=T.target).releasePointerCapture)==null||H.call(q,T.pointerId),u(!1)},[]),R={x:co,y:co,width:dp-2*co,height:hp-2*co},A=a?"rgba(255,255,255,0.2)":"rgba(0,0,0,0.2)",O=a?"rgba(255,255,255,0.85)":"rgba(59,130,246,0.9)",F=a?"rgba(255,255,255,0.12)":"rgba(59,130,246,0.15)",L=a?"rgba(255,255,255,0.06)":"rgba(0,0,0,0.06)",X=a?"rgba(34,197,94,0.92)":"rgba(34,197,94,0.85)";return s.jsx("div",{ref:l,className:`absolute bottom-3 right-3 rounded-lg overflow-hidden border ${a?"shadow-none":"shadow-md"} select-none touch-none ${o}`,style:{width:dp,height:hp,borderColor:A,backgroundColor:a?"rgba(9,9,11,0.85)":"rgba(244,244,245,0.9)",zIndex:20},onPointerDown:C,onPointerMove:E,onPointerUp:I,onPointerLeave:I,title:"画布导航:点击或拖拽可快速定位",role:"button","aria-label":"画布导航",children:s.jsxs("svg",{width:dp,height:hp,style:{display:"block"},children:[s.jsx("rect",{...R,fill:L,rx:4,ry:4}),z.map((T,q)=>s.jsx("rect",{x:T.x,y:T.y,width:L1,height:L1,fill:X},q)),s.jsx("rect",{x:m.x,y:m.y,width:m.width,height:m.height,fill:F,stroke:O,strokeWidth:1.5,rx:2,ry:2})]})})}const poe=({croppingNodeId:e,nodes:t,isDark:n=!1})=>{if(!e)return null;const r=t.find(u=>u.id===e);if(!r)return null;const i=4,c=6+22+4+i;return s.jsx("div",{className:"absolute pointer-events-none z-[100]",style:{left:r.x,top:r.y-c,width:r.width,height:i},children:s.jsx("div",{className:"h-full overflow-hidden rounded-full",children:s.jsx("div",{className:`h-full animate-pulse ${n?"bg-white/50":"bg-black/40"}`})})})},foe=_.memo(poe),a7=["#171717","#ef4444","#f97316","#eab308","#22c55e","#06b6d4","#3b82f6","#8b5cf6","#ec4899","#ffffff"],yE="flex items-center gap-1 px-2 py-2 rounded-full border transition-all",moe=({visible:e,isDark:t,subTool:n,onSubToolChange:r,brushColor:i,onBrushColorChange:a,brushWidth:o,onBrushWidthChange:l,eraserWidth:c,onEraserWidthChange:u})=>{const[d,h]=_.useState(!1),p=_.useRef(null);if(_.useEffect(()=>{if(!d)return;const m=z=>{p.current&&!p.current.contains(z.target)&&h(!1)};return document.addEventListener("mousedown",m,!0),()=>document.removeEventListener("mousedown",m,!0)},[d]),_.useEffect(()=>{e||h(!1)},[e]),!e)return null;const f=(Math.min(48,Math.max(4,c))-4)/44*100,b=t?`${yE} bg-zinc-900 border-zinc-800 text-zinc-100 shadow-none`:`${yE} bg-[#f6f6f6] border-zinc-200 text-zinc-800 shadow-md shadow-zinc-400/20`,g=m=>`p-2 rounded-full transition-colors ${m?t?"bg-white text-zinc-900":"bg-zinc-900 text-white":t?"text-zinc-400 hover:bg-zinc-800/80":"text-zinc-600 hover:bg-zinc-100"}`,y=`w-px h-6 shrink-0 ${t?"bg-zinc-800":"bg-zinc-200"}`,w=t?"w-20 h-1.5 rounded-full bg-white/15 accent-zinc-100":"w-20 h-1.5 accent-blue-500 bg-zinc-200",v=t?"w-20 h-1.5 rounded-full bg-white/15 accent-zinc-100":"doodle-toolbar-eraser-range-light w-20 h-[6px] rounded-full bg-transparent";return s.jsx("div",{className:"fixed left-1/2 -translate-x-1/2 z-[120] pointer-events-auto",style:{bottom:24},onMouseDown:m=>m.stopPropagation(),onClick:m=>m.stopPropagation(),children:s.jsxs("div",{className:`${b} doodle-bottom-toolbar-fast-tooltip max-w-[calc(100vw-32px)] flex-nowrap ${t?"doodle-bottom-toolbar-fast-tooltip--dark":"doodle-bottom-toolbar-fast-tooltip--light"}`,children:[s.jsx("button",{type:"button",className:g(n==="select"),onClick:()=>r("select"),"data-tip":"选择 / 框选 (V)","aria-label":"选择 / 框选,快捷键 V",children:s.jsx(A5,{size:18})}),s.jsx("button",{type:"button",className:g(n==="brush"),onClick:()=>r("brush"),"data-tip":"画笔 (B)","aria-label":"画笔,快捷键 B",children:s.jsx(rw,{size:18})}),s.jsx("button",{type:"button",className:g(n==="eraser"),onClick:()=>r("eraser"),"data-tip":"橡皮擦 (E)","aria-label":"橡皮擦,快捷键 E",children:s.jsx(gb,{size:18})}),s.jsx("div",{className:y,"aria-hidden":!0}),s.jsxs("div",{ref:p,className:`relative flex items-center gap-1.5 px-1 ${t?"text-zinc-300":"text-zinc-700"}`,children:[s.jsx("button",{type:"button","data-tip":"画笔颜色","aria-label":"画笔颜色",onMouseDown:m=>m.stopPropagation(),onClick:m=>{m.preventDefault(),m.stopPropagation(),h(z=>!z)},className:`w-8 h-8 rounded-full shrink-0 border ${t?"border-zinc-600":"border-zinc-300"}`,style:{backgroundColor:/^#[0-9a-fA-F]{6}$/.test(i)?i:"#171717"}}),s.jsx("span",{className:"text-[11px] whitespace-nowrap hidden sm:inline pointer-events-none",children:"颜色"}),d&&s.jsxs("div",{className:`absolute z-[140] left-0 bottom-full mb-2 min-w-[200px] p-2 rounded-xl border shadow-xl ${t?"bg-zinc-900 border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:m=>m.stopPropagation(),children:[s.jsx("div",{className:"grid grid-cols-5 gap-1.5 mb-2",children:a7.map(m=>s.jsx("button",{type:"button",title:m,className:`w-7 h-7 rounded-md border-2 transition-transform hover:scale-105 ${i.toLowerCase()===m.toLowerCase()?t?"border-white":"border-zinc-900":t?"border-zinc-600":"border-zinc-300"}`,style:{backgroundColor:m},onClick:()=>a(m)},m))}),s.jsxs("label",{className:"flex items-center gap-2 cursor-pointer text-[11px]",children:[s.jsx("span",{className:t?"text-zinc-400":"text-zinc-600",children:"更多"}),s.jsx("input",{type:"color",value:/^#[0-9a-fA-F]{6}$/.test(i)?i:"#171717",onChange:m=>a(m.target.value),className:"h-8 w-full min-w-0 cursor-pointer rounded border-0 bg-transparent"})]})]})]}),s.jsxs("div",{className:`flex items-center gap-1 px-1 ${t?"text-zinc-300":"text-zinc-700"}`,"data-tip":"画笔粗细",children:[s.jsx("span",{className:"text-[11px] whitespace-nowrap",children:"粗细"}),s.jsx("input",{type:"range",min:1,max:16,step:.5,value:o,onChange:m=>l(Number(m.target.value)),className:w}),s.jsx("span",{className:"text-[10px] w-7 tabular-nums",children:o.toFixed(1)})]}),s.jsx("div",{className:y,"aria-hidden":!0}),s.jsxs("div",{className:`flex items-center gap-1 px-1 ${t?"text-zinc-300":"text-zinc-700"}`,"data-tip":"橡皮大小",children:[s.jsx("span",{className:"text-[11px] whitespace-nowrap",children:"橡皮"}),s.jsx("input",{type:"range",min:4,max:48,step:1,value:c,onChange:m=>u(Number(m.target.value)),className:v,style:t?void 0:{"--eraser-fill-pct":`${f}%`}}),s.jsx("span",{className:"text-[10px] w-7 tabular-nums",children:c})]})]})})},goe=({visible:e,isDark:t,screenLeft:n,screenTop:r,selectionColor:i,onSelectionColorChange:a,onCreateArtboard:o})=>{const[l,c]=_.useState(!1),u=_.useRef(null);if(_.useEffect(()=>{if(!l)return;const p=f=>{u.current&&!u.current.contains(f.target)&&c(!1)};return document.addEventListener("mousedown",p,!0),()=>document.removeEventListener("mousedown",p,!0)},[l]),_.useEffect(()=>{e||c(!1)},[e]),!e)return null;const d=t?"flex items-center gap-0 rounded-full border border-zinc-800 bg-zinc-900 text-zinc-100 shadow-none":"flex items-center gap-0 rounded-full border border-zinc-200 bg-white/95 text-zinc-800 shadow-xl shadow-zinc-400/20",h=`w-px h-5 shrink-0 ${t?"bg-zinc-600":"bg-zinc-200"}`;return s.jsx("div",{className:"fixed z-[121] pointer-events-auto flex flex-col items-center",style:{left:n,top:r-8,transform:"translate(-50%, -100%)"},onMouseDown:p=>p.stopPropagation(),onClick:p=>p.stopPropagation(),children:s.jsxs("div",{className:`${d} doodle-bottom-toolbar-fast-tooltip ${t?"doodle-bottom-toolbar-fast-tooltip--dark":"doodle-bottom-toolbar-fast-tooltip--light"}`,children:[s.jsxs("div",{ref:u,className:"relative flex items-center gap-1.5 px-3 py-2",children:[s.jsx("button",{type:"button","data-tip":"选中笔迹颜色","aria-label":"选中笔迹颜色",onMouseDown:p=>p.stopPropagation(),onClick:p=>{p.preventDefault(),p.stopPropagation(),c(f=>!f)},className:`w-7 h-7 rounded-full shrink-0 border ${t?"border-zinc-600":"border-zinc-300"}`,style:{backgroundColor:/^#[0-9a-fA-F]{6}$/.test(i)?i:"#171717"}}),s.jsx("span",{className:"text-xs",children:"颜色"}),l&&s.jsxs("div",{className:`absolute z-[140] left-2 bottom-full mb-2 min-w-[200px] p-2 rounded-xl border shadow-xl ${t?"bg-zinc-900 border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:p=>p.stopPropagation(),children:[s.jsx("div",{className:"grid grid-cols-5 gap-1.5 mb-2",children:a7.map(p=>s.jsx("button",{type:"button",title:p,className:`w-7 h-7 rounded-md border-2 transition-transform hover:scale-105 ${i.toLowerCase()===p.toLowerCase()?t?"border-white":"border-zinc-900":t?"border-zinc-600":"border-zinc-300"}`,style:{backgroundColor:p},onClick:()=>a(p)},p))}),s.jsxs("label",{className:"flex items-center gap-2 cursor-pointer text-[11px]",children:[s.jsx("span",{className:t?"text-zinc-400":"text-zinc-600",children:"更多"}),s.jsx("input",{type:"color",value:/^#[0-9a-fA-F]{6}$/.test(i)?i:"#171717",onChange:p=>a(p.target.value),className:"h-8 w-full min-w-0 cursor-pointer rounded border-0 bg-transparent"})]})]})]}),s.jsx("div",{className:h,"aria-hidden":!0}),s.jsx("button",{type:"button",className:"px-3 py-2 text-xs font-medium hover:opacity-90 transition-opacity",onClick:o,"data-tip":"以选区大小导出为灰白底草稿图并生成图片节点","aria-label":"以选区大小导出为灰白底草稿图并生成图片节点",children:"创建画板"})]})})};function vE(e,t){if(e.length===0)return{minX:0,minY:0,maxX:0,maxY:0};let n=e[0].x,r=e[0].y,i=e[0].x,a=e[0].y;for(let o=1;oi.maxX||ci.maxY)}function voe(e,t,n){return e.map(r=>({x:r.x+t,y:r.y+n}))}function woe(e,t,n){const r=Math.max(t.maxX-t.minX,1e-6),i=Math.max(t.maxY-t.minY,1e-6),a=n.maxX-n.minX,o=n.maxY-n.minY;return e.map(l=>({x:n.minX+(l.x-t.minX)/r*a,y:n.minY+(l.y-t.minY)/i*o}))}function _oe(e,t,n,r,i=12){let{minX:a,minY:o,maxX:l,maxY:c}=e;switch(t){case"nw":a=Math.min(n,l-i),o=Math.min(r,c-i);break;case"n":o=Math.min(r,c-i);break;case"ne":l=Math.max(n,a+i),o=Math.min(r,c-i);break;case"e":l=Math.max(n,a+i);break;case"se":l=Math.max(n,a+i),c=Math.max(r,o+i);break;case"s":c=Math.max(r,o+i);break;case"sw":a=Math.min(n,l-i),c=Math.max(r,o+i);break;case"w":a=Math.min(n,l-i);break}return{minX:a,minY:o,maxX:l,maxY:c}}function zoe(e,t,n){if(e.length===0||t.length===0)return e.length?[e]:[];const r=e.map(o=>{let l=1/0;for(const c of t)l=Math.min(l,Math.hypot(o.x-c.x,o.y-c.y));for(let c=0;c=2&&i.push(a),a=[]):a.push(e[o]);return a.length>=2&&i.push(a),i}const $oe=({containerRef:e,enabled:t=!0})=>{const n=_.useRef(new Map),r=_.useRef(!1),i=_.useRef(new Set),a=_.useRef(null);_.useEffect(()=>{if(t)return a.current=new IntersectionObserver(h=>{h.forEach(p=>{const f=p.target;if(p.isIntersecting){if(i.current.add(f),!r.current){const b=n.current.get(f);b!=null&&b.wasPlaying&&f.play().catch(()=>{})}}else i.current.delete(f),f.paused||(n.current.set(f,{wasPlaying:!0,currentTime:f.currentTime}),f.pause()),f.preload="metadata"})},{root:e.current,rootMargin:"50px",threshold:.01}),()=>{var h;(h=a.current)==null||h.disconnect()}},[e,t]);const o=_.useCallback(h=>{if(!t||!a.current)return;let p=h.parentElement,f=!1;for(;p;){const b=window.getComputedStyle(p).zIndex;if(b&&parseInt(b)>=100){f=!0;break}p=p.parentElement}f||(a.current.observe(h),n.current.has(h)||n.current.set(h,{wasPlaying:!h.paused,currentTime:h.currentTime}))},[t]),l=_.useCallback(h=>{a.current&&(a.current.unobserve(h),n.current.delete(h),i.current.delete(h))},[]),c=_.useCallback(()=>{if(!t||r.current)return;r.current=!0;const h=e.current;if(!h)return;h.querySelectorAll("video").forEach(f=>{let b=f.parentElement,g=!1;for(;b;){const y=window.getComputedStyle(b).zIndex;if(y&&parseInt(y)>=100){g=!0;break}b=b.parentElement}if(!g)if(f.paused){if(f.getAttribute("data-user-controlled")==="true"){const w=f.getAttribute("data-user-playing")==="true";n.current.set(f,{wasPlaying:w,currentTime:f.currentTime})}}else{const y=f.getAttribute("data-user-controlled")==="true",w=f.getAttribute("data-user-playing")==="true";n.current.set(f,{wasPlaying:y?w:!0,currentTime:f.currentTime}),f.pause()}})},[e,t]),u=_.useCallback(()=>{!t||!r.current||(r.current=!1,i.current.forEach(h=>{const p=n.current.get(h);if(p!=null&&p.wasPlaying){const f=h.getAttribute("data-user-controlled")==="true",b=h.getAttribute("data-user-playing")==="true";(!f||b)&&h.play().catch(()=>{})}}))},[t]),d=_.useCallback(()=>{if(!t||!e.current||!a.current)return;e.current.querySelectorAll("video").forEach(p=>{n.current.has(p)||o(p)})},[e,t,o]);return _.useEffect(()=>{if(!t)return;const h=setTimeout(d,100),p=new MutationObserver(f=>{f.forEach(b=>{b.addedNodes.forEach(g=>{g instanceof HTMLElement&&(g.querySelectorAll("video").forEach(o),g.tagName==="VIDEO"&&o(g))}),b.removedNodes.forEach(g=>{g instanceof HTMLElement&&(g.querySelectorAll("video").forEach(l),g.tagName==="VIDEO"&&l(g))})})});return e.current&&p.observe(e.current,{childList:!0,subtree:!0}),()=>{clearTimeout(h),p.disconnect()}},[e,t,d,o,l]),{freezeAllVideos:c,unfreezeVideos:u,observeVideo:o,unobserveVideo:l,isInteractingRef:r}};function Soe(e,t){return _.useMemo(()=>!t||!e?null:!e.type||!["image","video","audio"].includes(e.type)?(console.warn("[Lightbox] Invalid or missing type:",e.type),null):e.url?e:(console.warn("[Lightbox] No URL in lightboxItem:",e),null),[e,t])}let Jc=null,ix=0;const joe=5,wE=3e3,o7=(e="/api/kling-callback-stream")=>{if(Jc){console.log("[KlingCallbackClient] 已经连接到服务器");return}console.log("[KlingCallbackClient] 正在连接到服务器:",e);try{Jc=new EventSource(e),Jc.onopen=()=>{console.log("[KlingCallbackClient] 已连接到服务器"),ix=0},Jc.onmessage=t=>{try{const n=JSON.parse(t.data);n.type==="connected"?console.log("[KlingCallbackClient] 连接确认"):n.task_id&&(console.log("[KlingCallbackClient] 收到 callback 数据:",{task_id:n.task_id,task_status:n.task_status}),yK(n))}catch(n){console.error("[KlingCallbackClient] 解析消息失败:",n)}},Jc.onerror=()=>{console.error("[KlingCallbackClient] 连接错误"),Jc==null||Jc.close(),Jc=null,ix{o7(e)},wE)):console.error("[KlingCallbackClient] 达到最大重新连接次数,放弃连接")}}catch(t){console.error("[KlingCallbackClient] 连接失败:",t)}},Coe=()=>{Jc&&(console.log("[KlingCallbackClient] 断开连接"),Jc.close(),Jc=null,ix=0)},Noe=({enabled:e=!0,serverUrl:t="/api/kling-callback-stream"}={})=>{_.useEffect(()=>{if(!e)return;console.log("[useKlingCallbackConnection] 初始化 callback 连接");const n=setTimeout(()=>{o7(t)},1e3);return()=>{clearTimeout(n),Coe()}},[e,t])},Eoe="qiaodoumayi_projects",Ioe=2,Mh="project_meta",Th="project_payload",Rh="project_assets";let B1=null;function Bm(){return B1||(B1=new Promise((e,t)=>{const n=indexedDB.open(Eoe,Ioe);n.onerror=()=>t(n.error),n.onsuccess=()=>e(n.result),n.onupgradeneeded=r=>{const i=r.target.result;i.objectStoreNames.contains(Mh)||i.createObjectStore(Mh,{keyPath:"id"}).createIndex("updatedAt","updatedAt",{unique:!1}),i.objectStoreNames.contains(Th)||i.createObjectStore(Th,{keyPath:"id"}),i.objectStoreNames.contains(Rh)||i.createObjectStore(Rh,{keyPath:"id"}).createIndex("projectId","projectId",{unique:!1})}}),B1)}async function koe(){const e=await Bm();return new Promise((t,n)=>{const a=e.transaction(Mh,"readonly").objectStore(Mh).getAll();a.onsuccess=()=>{const o=a.result.sort((l,c)=>c.updatedAt-l.updatedAt);t(o)},a.onerror=()=>n(a.error)})}async function _E(e){const t=await Bm();return new Promise((n,r)=>{const o=t.transaction(Th,"readonly").objectStore(Th).get(e);o.onsuccess=()=>{const l=o.result;n(l?l.payload:null)},o.onerror=()=>r(o.error)})}async function Aoe(e,t,n,r){const i=await Bm(),a=Date.now(),o={id:e,name:t,updatedAt:a,nodeCount:r};return new Promise((l,c)=>{const u=i.transaction([Mh,Th],"readwrite"),d=u.objectStore(Mh),h=u.objectStore(Th);d.put(o),h.put({id:e,payload:n}),u.oncomplete=()=>l(),u.onerror=()=>c(u.error)})}async function Moe(e){const t=await Bm();return new Promise((n,r)=>{const i=t.transaction([Mh,Th,Rh],"readwrite");i.objectStore(Mh).delete(e),i.objectStore(Th).delete(e);const l=i.objectStore(Rh).index("projectId").openCursor(IDBKeyRange.only(e));l.onsuccess=()=>{const c=l.result;c?(c.delete(),c.continue()):i.oncomplete=()=>n()},l.onerror=()=>r(l.error),i.oncomplete=()=>n(),i.onerror=()=>r(i.error)})}function l7(e,t){return`${e}:${t}`}async function Toe(e,t,n){const r=await Bm();return new Promise((i,a)=>{const o=r.transaction(Rh,"readwrite");o.objectStore(Rh).put({id:l7(e,t),projectId:e,assetKey:t,data:n}),o.oncomplete=()=>i(),o.onerror=()=>a(o.error)})}async function Roe(e,t){const n=await Bm();return new Promise((r,i)=>{const l=n.transaction(Rh,"readonly").objectStore(Rh).get(l7(e,t));l.onsuccess=()=>{const c=l.result;r(c?c.data:null)},l.onerror=()=>i(l.error)})}function Poe(){return`project_${Date.now()}_${Math.random().toString(36).slice(2,10)}`}const zE=3e5,Ooe="[内容过大已省略]",Loe="__projectAsset";function l_(e){return!!(e instanceof RangeError||e instanceof Error&&/Invalid string length|string length/i.test(e.message))}function Boe(e){return typeof e=="string"&&(e.startsWith("data:image/")||e.startsWith("data:video/")||e.startsWith("data:audio/"))}function Cm(e){return typeof e=="object"&&e!==null&&e.__projectAsset===!0&&typeof e.key=="string"}function B$(e,t){if(e==null)return e;if(typeof e=="string")return e.length>t?Ooe:e;if(Array.isArray(e))return e.map(n=>B$(n,t));if(typeof e=="object"){const n={};for(const[r,i]of Object.entries(e))n[r]=B$(i,t);return n}return e}function U$(e,t=[],n=0){return n>15?t:typeof e=="string"&&e.startsWith("content_ref:")?(t.push(e.replace(/^content_ref:/,"")),t):Array.isArray(e)?(e.forEach(r=>U$(r,t,n+1)),t):(e!==null&&typeof e=="object"&&!Cm(e)&&Object.values(e).forEach(r=>U$(r,t,n+1)),t)}async function Uoe(e,t){const n=[...new Set(U$(e))];if(n.length===0)return;t==null||t(`正在解析 ${n.length} 个素材引用...`);const r=new Map;await Promise.all(n.map(async a=>{const o=await Ln.get(a);r.set(a,o??null)}));function i(a,o){if(!(o>15)&&!(typeof a=="string"&&a.startsWith("content_ref:"))){if(Array.isArray(a)){for(let l=0;l0;){const{obj:l,parent:c,key:u}=a.shift();if(Boe(l)&&l.length>n)i.push({parent:c,key:u,value:l});else if(Array.isArray(l))l.forEach((d,h)=>a.push({obj:d,parent:l,key:h}));else if(typeof l=="object"&&l!==null&&!Cm(l))for(const d of Object.keys(l))a.push({obj:l[d],parent:l,key:d})}if(i.length===0)return 0;r==null||r(`正在保存 ${i.length} 个素材到本地...`);let o=0;for(const{parent:l,key:c,value:u}of i){const d=`asset_${o}`;await Toe(t,d,u),l[c]={[Loe]:!0,key:d},o+=1}return i.length}async function Woe(e){const n=await(await fetch(e)).blob();return URL.createObjectURL(n)}async function $E(e,t,n){const r=[],i=[];if(typeof e=="object"&&e!==null)for(const a of Object.keys(e))i.push({obj:e[a],parent:e,key:a});for(;i.length>0;){const{obj:a,parent:o,key:l}=i.shift();if(Cm(a))r.push({parent:o,key:l,assetKey:a.key});else if(Array.isArray(a))a.forEach((c,u)=>i.push({obj:c,parent:a,key:u}));else if(typeof a=="object"&&a!==null&&!Cm(a))for(const c of Object.keys(a))i.push({obj:a[c],parent:a,key:c})}if(r.length===0)return 0;n==null||n(`正在还原 ${r.length} 个素材...`);for(const{parent:a,key:o,assetKey:l}of r){const c=await Roe(t,l);if(c)try{a[o]=await Woe(c)}catch{a[o]=c}else a[o]=""}return r.length}function SE(e){return typeof e!="string"||!e?!1:e.startsWith("data:image/")||e.startsWith("data:video/")||e.startsWith("data:audio/")||e.startsWith("blob:")||e.startsWith("http")&&(e.includes("/image")||/\.(jpg|jpeg|png|gif|webp|mp4|webm|mp3|wav|m4a)(\?|$)/i.test(e))}function Doe(e){const t=(n,r)=>{if(!(r>20)){if(Array.isArray(n)){n.forEach((i,a)=>{SE(i)?n[a]="":i!==null&&typeof i=="object"&&t(i,r+1)});return}if(n!==null&&typeof n=="object"&&!Cm(n)){const i=n;for(const a of Object.keys(i)){const o=i[a];if(SE(o))i[a]="";else if(a==="settings"&&o!==null&&typeof o=="object"){const l=o;if(Array.isArray(l.inputMedia)&&(l.inputMedia=l.inputMedia.map(c=>typeof c=="object"&&c!==null&&c.url?{...c,url:""}:c)),Array.isArray(l.generatedImages)&&(l.generatedImages=l.generatedImages.map(c=>typeof c=="object"&&c!==null?{...c,thumbUrl:"",fullUrl:""}:c)),l.canvasData&&typeof l.canvasData=="object"){const c=l.canvasData.images;Array.isArray(c)&&c.forEach(u=>{u&&typeof u=="object"&&(u.src="")})}typeof l._blobUrl=="string"&&(l._blobUrl="")}else a==="frames"&&Array.isArray(o)?i[a]=o.map(l=>typeof l=="object"&&l!==null&&l.url?{...l,url:""}:l):a==="shots"&&Array.isArray(o)?i[a]=o.map(l=>typeof l=="object"&&l!==null?{...l,image_url:"",video_url:""}:l):o!==null&&typeof o=="object"&&t(o,r+1)}}}};e.nodes&&e.nodes.forEach(n=>t(n,0))}function Voe(e){e.nodes&&(e.nodes=e.nodes.map(t=>{if(!(t.previewType==="video"||t.type==="gen-video"||t.type==="video-input"||t.type==="video-analyze"||t.type==="generate-character-video"||t.type==="generate-scene-video"))return t;const r={...t};return typeof r.content=="string"&&(r.content=""),r.videoPosterUrl&&(r.videoPosterUrl=""),r.videoMeta&&(r.videoMeta=void 0),Array.isArray(r.frames)&&(r.frames=r.frames.map(i=>typeof i=="object"&&i!==null?{...i,url:""}:i)),Array.isArray(r.selectedKeyframes)&&(r.selectedKeyframes=r.selectedKeyframes.map(i=>typeof i=="object"&&i!==null?{...i,url:""}:i)),Array.isArray(r.shots)&&(r.shots=r.shots.map(i=>typeof i=="object"&&i!==null?{...i,video_url:""}:i)),r}))}function Hoe({nodes:e,connections:t,view:n,groups:r,canvasTextBoxes:i=[],canvasDoodleStrokes:a=[],setNodes:o,setConnections:l,setView:c,setGroups:u,setCanvasTextBoxes:d,setCanvasDoodleStrokes:h,setHistory:p,onProgress:f,onStripped:b}){const[g,y]=_.useState([]),w=_.useRef([]),[v,m]=_.useState(null),[z,C]=_.useState(null),[E,I]=_.useState(!1),[R,A]=_.useState(!1),O=_.useCallback(async()=>{try{const J=await koe();return y(J),w.current=J,J}catch(J){return console.error("[useProjectManager] listProjects failed:",J),w.current}},[]),F=_.useCallback(async(J,Z=3)=>{for(let B=0;BN.id===J))return;await new Promise(N=>setTimeout(N,150))}},[O]),L=_.useCallback(async(J,Z,B)=>{const V=Z??Poe(),N=J.trim()||"未命名项目",k=((B==null?void 0:B.saveMode)??"workflow+assets")==="workflow-only";I(!0),f==null||f(0,"正在准备...");try{f==null||f(5,"正在生成数据...");let W=JSON.parse(JSON.stringify({nodes:e,connections:t,view:n,groups:r,canvasTextBoxes:i,canvasDoodleStrokes:a}));if(k)Doe(W),f==null||f(40,"正在生成数据...");else{Voe(W),await Uoe(W,se=>f==null?void 0:f(8,se));const Y=Ol(W);if(Y>0){f==null||f(12,"正在转换画布素材(优先本地缓存)...");const se={count:Y,current:0},ie=[];W.nodes=await ll(W.nodes,0,oe=>f==null?void 0:f(12+oe*.28,`转换素材 ${Math.round(oe)}%`),se,ie,{onFailedBehavior:"placeholder",silentFail:!0,preserveOriginalFields:["content","previewMjImages","previewMjVideos","selectedPreviewImage","selectedPreviewVideo"],timeoutMs:3e4})}f==null||f(40,"正在生成数据..."),await Foe(W,V,zE,se=>f==null?void 0:f(45,se))}let M;try{M=JSON.stringify(W)}catch(Y){if(l_(Y)){f==null||f(50,"数据过大,正在压缩...");const se=B$(W,zE);try{M=JSON.stringify(se),b==null||b()}catch{throw new Error("项目过大,请减少画布中的图片/视频数量后重试")}}else throw Y}return f==null||f(80,"正在写入本地缓存..."),await Aoe(V,N,M,W.nodes.length),m(V),C(N),await F(V),f==null||f(100,"保存完成"),V}finally{I(!1),f==null||f(0,"")}},[e,t,n,r,i,a,f,b,F]),X=_.useCallback(async J=>{A(!0),f==null||f(0,"正在加载...");try{const Z=await _E(J);if(!Z)throw new Error("项目数据不存在");let B=JSON.parse(Z);if(await $E(B,J,k=>f==null?void 0:f(15,k)),jx(B)){f==null||f(20,"正在还原画布素材...");const{data:k}=await Iv(B);B=k}f==null||f(70,"正在应用...");const V=Date.now(),N=(B.nodes||[]).map(k=>({...k,_nodeUpdateTime:V}));o(N),l(B.connections||[]),c(B.view||{x:0,y:0,zoom:1}),u(B.groups||[]),d==null||d(Array.isArray(B.canvasTextBoxes)?B.canvasTextBoxes:[]),h==null||h(Array.isArray(B.canvasDoodleStrokes)?B.canvasDoodleStrokes:[]);const j=g.find(k=>k.id===J);j&&(m(j.id),C(j.name)),f==null||f(100,"加载完成")}catch(Z){throw l_(Z)?new Error("项目数据过大,无法加载。请尝试用较少的画布素材重新保存后再打开。"):Z}finally{A(!1),f==null||f(0,"")}},[o,l,c,u,d,h,p,g,f]),T=_.useCallback(async J=>{A(!0),f==null||f(0,"正在加载...");try{const Z=await _E(J);if(!Z)throw new Error("项目数据不存在");let B=JSON.parse(Z);if(await $E(B,J,re=>f==null?void 0:f(15,re)),jx(B)){f==null||f(20,"正在还原画布素材...");const{data:re}=await Iv(B);B=re}f==null||f(50,"正在插入...");const V=B.nodes||[],N=B.connections||[],j=B.groups||[];if(V.length===0){f==null||f(100,"该项目无节点");return}const k=new Map;V.forEach(re=>k.set(re.id,ns()));const W=80;let M=W,Y=W;if(e.length>0){const re=Math.max(...e.map(pe=>pe.x+(pe.width??200))),ee=Math.max(...e.map(pe=>pe.y+(pe.height??120)));M=re+W,Y=0}const se=V.map(re=>({...re,id:k.get(re.id)??re.id,x:re.x+M,y:re.y+Y,_nodeUpdateTime:Date.now()})),ie=N.filter(re=>k.has(re.from)&&k.has(re.to)).map(re=>({...re,id:ns(),from:k.get(re.from)??re.from,to:k.get(re.to)??re.to})),oe=j.map(re=>{const ee=(re.nodeIds||[]).filter(we=>k.has(we)).map(we=>k.get(we)??we),pe={...re,id:ns(),nodeIds:ee};return re.collapsedX!=null&&(pe.collapsedX=re.collapsedX+M),re.collapsedY!=null&&(pe.collapsedY=re.collapsedY+Y),pe});o(re=>[...re,...se]),l(re=>[...re,...ie]),u(re=>[...re,...oe.filter(ee=>ee.nodeIds.length>0)]),f==null||f(100,"")}catch(Z){throw l_(Z)?new Error("项目数据过大,无法加载。请尝试用较少的画布素材重新保存后再插入。"):Z}finally{A(!1),f==null||f(0,"")}},[o,l,u,f]),q=_.useCallback(async J=>{await Moe(J),v===J&&(m(null),C(null)),await O()},[v,O]),H=_.useCallback(()=>{m(null),C(null)},[]);return{projects:g,currentProjectId:v,currentProjectName:z,isSaving:E,isLoading:R,refreshList:O,saveProject:L,openProject:X,insertProject:T,deleteProject:q,clearCurrentProject:H}}function Goe(e){return e<=.75?"远 / 广角":e<=1.12?"中等":"近 / 特写"}function qoe(e,t,n){const r=e*Math.PI/180,i=t*Math.PI/180,a=n*Math.cos(i)*Math.sin(r),o=-n*Math.sin(i);return{x:a,y:o}}const Koe=({rotationDeg:e,tiltDeg:t,isDark:n})=>{const a=26+e%360*.07,o=-18+t*.07,l=n?"border border-white/20 bg-gradient-to-br from-zinc-500 via-zinc-600 to-zinc-800 shadow-[inset_0_1px_0_rgba(255,255,255,0.12)]":"border border-black/15 bg-gradient-to-br from-zinc-400 via-zinc-500 to-zinc-700 shadow-[inset_0_1px_0_rgba(255,255,255,0.2)]",c=n?"bg-zinc-900":"bg-zinc-700",u=n?"bg-zinc-600":"bg-zinc-500";return s.jsx("div",{className:"pointer-events-none relative flex items-center justify-center",style:{width:48,height:48,perspective:130,filter:"drop-shadow(0 6px 12px rgba(0,0,0,0.5)) drop-shadow(0 2px 4px rgba(0,0,0,0.35))"},"aria-hidden":!0,children:s.jsxs("div",{className:"relative [transform-style:preserve-3d]",style:{width:34,height:34,transform:`rotateX(${o}deg) rotateY(${a}deg)`},children:[s.jsx("div",{className:`absolute inset-0 flex items-center justify-center rounded-[10px] ${l}`,style:{transform:"translateZ(17px)",backfaceVisibility:"hidden",WebkitBackfaceVisibility:"hidden"},children:s.jsx(Ya,{className:"text-white",style:{width:34*.42,height:34*.42},strokeWidth:1.85})}),s.jsx("div",{className:`absolute inset-0 ${c}`,style:{transform:"rotateY(90deg) translateZ(17px)",backfaceVisibility:"hidden",WebkitBackfaceVisibility:"hidden",borderRadius:"0 6px 6px 0"}}),s.jsx("div",{className:`absolute inset-0 ${u}`,style:{transform:"rotateX(-90deg) translateZ(17px)",backfaceVisibility:"hidden",WebkitBackfaceVisibility:"hidden",borderRadius:"6px 6px 0 0"}})]})})},Wf=({className:e,style:t,children:n})=>s.jsx("div",{className:`absolute left-0 top-0 flex h-[120px] w-[120px] items-center justify-center border border-black/10 bg-white/30 text-[10px] text-zinc-500 backdrop-blur-[1px] dark:border-white/15 dark:bg-zinc-900/40 dark:text-zinc-400 ${e||""}`,style:{backfaceVisibility:"hidden",WebkitBackfaceVisibility:"hidden",...t},children:n}),Xoe=({rotation:e,tilt:t,scale:n,previewImageUrl:r,isDark:i})=>{const a=o=>({transform:o,transformOrigin:"center center"});return s.jsx("div",{className:`relative flex h-[220px] w-full cursor-default select-none items-center justify-center overflow-hidden rounded-2xl border ${i?"border-white/10 bg-zinc-950/60":"border-zinc-200/80 bg-zinc-100"}`,style:{perspective:"900px"},children:s.jsxs("div",{className:"relative h-[120px] w-[120px] [transform-style:preserve-3d]",style:{transform:`translateZ(-60px) rotateX(${-t}deg) rotateY(${e}deg) scale(${.42+n*.28})`},children:[s.jsx(Wf,{style:a("translateZ(60px)"),children:r?s.jsx("img",{src:r,alt:"",className:"h-full w-full object-cover",draggable:!1}):s.jsx("span",{children:"前"})}),s.jsx(Wf,{style:a("rotateY(180deg) translateZ(60px)"),children:"后"}),s.jsx(Wf,{style:a("rotateY(90deg) translateZ(60px)"),children:"右"}),s.jsx(Wf,{style:a("rotateY(-90deg) translateZ(60px)"),children:"左"}),s.jsx(Wf,{style:a("rotateX(90deg) translateZ(60px)"),children:"顶"}),s.jsx(Wf,{style:a("rotateX(-90deg) translateZ(60px)"),children:"底"})]})})};function Yoe(e){const t=Math.max(.5,Math.min(2,e));return Math.round(36+(t-.5)/1.5*56)}const Joe=({rotation:e,tilt:t,scale:n,previewImageUrl:r,isDark:i})=>{const{x:o,y:l}=qoe(e,t,88),c=Yoe(n),u=i?"rgba(255,255,255,0.24)":"rgba(0,0,0,0.12)",d=12,h=5,p=i?"rgba(255,255,255,0.28)":"rgba(0,0,0,0.16)";return s.jsxs("div",{className:`relative mx-auto flex h-[220px] w-full max-w-[280px] cursor-default select-none items-center justify-center overflow-visible rounded-2xl border ${i?"border-white/10 bg-black":"border-zinc-200/80 bg-zinc-100"}`,children:[s.jsx("svg",{width:"260",height:"220",viewBox:"0 0 260 220",className:"pointer-events-none","aria-hidden":!0,children:s.jsxs("g",{transform:"translate(130,110)",children:[s.jsx("line",{x1:0,y1:0,x2:o*.48,y2:l*.48,stroke:p,strokeWidth:1.2,strokeDasharray:"5 4",opacity:.9}),s.jsx("circle",{r:88,fill:"none",stroke:u,strokeWidth:1.2}),Array.from({length:d},(f,b)=>{const g=b/d*Math.PI,y=88*Math.sin(g);return s.jsx("ellipse",{rx:y,ry:88*.28,fill:"none",stroke:u,strokeWidth:.9,opacity:.85},`m-${b}`)}),Array.from({length:h},(f,b)=>{const g=-.85+b/(h-1)*1.7,y=88*Math.sqrt(Math.max(0,1-g*g));return s.jsx("ellipse",{rx:y,ry:y*.32,cy:-g*88*.55,fill:"none",stroke:u,strokeWidth:.8,opacity:.75},`p-${b}`)})]})}),s.jsx("div",{className:`pointer-events-none absolute left-1/2 top-1/2 z-[1] -translate-x-1/2 -translate-y-1/2 overflow-hidden rounded-lg border shadow-md ring-1 ring-black/5 transition-[width,height] duration-200 ease-out dark:ring-white/10 ${i?"border-white/25 bg-zinc-900":"border-zinc-200 bg-white"}`,style:{width:c,height:c},children:r?s.jsx("img",{src:r,alt:"",className:"h-full w-full object-cover",draggable:!1}):s.jsx("div",{className:`flex h-full w-full items-center justify-center text-[10px] ${i?"text-zinc-500":"text-zinc-400"}`,children:"场景"})}),s.jsx("div",{className:"pointer-events-none absolute left-1/2 top-1/2 z-[2]",style:{transform:`translate(calc(-50% + ${o}px), calc(-50% + ${l}px))`},"aria-hidden":!0,children:s.jsx(Koe,{rotationDeg:e,tiltDeg:t,isDark:i})})]})},Zoe=({config:e,onConfigChange:t,onConfirm:n,isDark:r,isVisible:i,isOpen:a,onClose:o,previewImageUrl:l})=>{const[c,u]=_.useState(e),d=_.useRef(null),h=_.useRef(c);_.useEffect(()=>{u(e),h.current=e},[e]),_.useEffect(()=>{if(!a)return;const z=C=>{d.current&&!d.current.contains(C.target)&&(o==null||o())};return document.addEventListener("mousedown",z),()=>document.removeEventListener("mousedown",z)},[a,o]);const p=_.useCallback(z=>{h.current=z,u(z),t(z)},[t]),f=_.useCallback((z,C)=>{let E=C;z==="rotation"&&(E=(E%360+360)%360),z==="tilt"&&(E=Math.max(-90,Math.min(90,E))),z==="scale"&&(E=Math.max(.5,Math.min(2,E))),p({...c,[z]:E,isActive:!0})},[c,p]),b=_.useCallback(()=>{p({...c,isActive:!c.isActive})},[c,p]),g=_.useCallback(()=>{p({rotation:0,tilt:0,scale:1,isActive:c.isActive,sceneMode:c.sceneMode,viewMode:c.viewMode})},[c.isActive,c.sceneMode,c.viewMode,p]),y=_.useCallback(()=>{t(c),n==null||n(c),o==null||o()},[c,t,n,o]),w=_.useCallback(z=>{p({...c,viewMode:z,isActive:!0})},[c,p]),v=_.useCallback(z=>{p({...c,sceneMode:z,isActive:!0})},[c,p]),m=c.viewMode||"subject";return a?s.jsxs("div",{ref:d,className:`absolute top-0 left-full z-50 ml-4 w-[min(92vw,320px)] rounded-2xl border p-4 shadow-2xl ${r?"border-white/30 bg-zinc-900 text-white":"border-zinc-200 bg-white"}`,children:[s.jsxs("div",{className:"mb-3 flex items-center justify-between",onClick:z=>z.stopPropagation(),children:[s.jsx("h3",{className:`text-sm font-semibold ${r?"text-white":"text-zinc-900"}`,children:"多角度"}),s.jsxs("div",{className:"flex items-center gap-1",children:[s.jsx("button",{type:"button",title:"重置角度",onClick:z=>{z.stopPropagation(),g()},onMouseDown:z=>z.stopPropagation(),className:`rounded-lg p-1.5 transition-colors ${r?"text-zinc-400 hover:bg-white/10 hover:text-white":"text-zinc-500 hover:bg-zinc-100"}`,children:s.jsx(Rx,{className:"h-4 w-4"})}),s.jsx("button",{type:"button",onClick:z=>{z.stopPropagation(),o==null||o()},onMouseDown:z=>z.stopPropagation(),className:`rounded-lg p-1.5 transition-colors ${r?"text-zinc-400 hover:bg-white/10 hover:text-white":"text-zinc-500 hover:bg-zinc-100"}`,children:s.jsx(Qr,{className:"h-4 w-4"})})]})]}),s.jsx("div",{className:"mb-3",onClick:z=>z.stopPropagation(),children:s.jsx("button",{type:"button",onClick:b,onMouseDown:z=>z.stopPropagation(),className:`w-full rounded-xl border py-2 text-xs font-medium transition-colors ${c.isActive?r?"border-white/50 bg-transparent text-white":"border-pink-300 bg-pink-50 text-pink-800":r?"border-white/30 text-zinc-500 hover:bg-white/5 hover:text-white":"border-zinc-200 text-zinc-600 hover:bg-zinc-50"}`,children:c.isActive?"已启用":"已禁用 · 不生效机位提示词"})}),s.jsxs("div",{className:`mb-3 flex rounded-xl border p-0.5 ${r?"border-white/15 bg-transparent":"border-zinc-200 bg-zinc-100"}`,onClick:z=>z.stopPropagation(),children:[s.jsx("button",{type:"button",className:`flex-1 rounded-lg py-2 text-xs font-medium transition-colors ${m==="subject"?r?"border border-white/50 bg-transparent text-white":"bg-white text-zinc-900 shadow-sm":r?"border border-white/30 bg-transparent text-zinc-500 hover:bg-white/5 hover:text-white":"text-zinc-500 hover:text-zinc-800"}`,onClick:()=>w("subject"),children:"主体"}),s.jsx("button",{type:"button",className:`flex-1 rounded-lg py-2 text-xs font-medium transition-colors ${m==="camera"?r?"border border-white/50 bg-transparent text-white":"bg-white text-zinc-900 shadow-sm":r?"border border-white/30 bg-transparent text-zinc-500 hover:bg-white/5 hover:text-white":"text-zinc-500 hover:text-zinc-800"}`,onClick:()=>w("camera"),children:"摄像头"})]}),m==="subject"?s.jsx(Xoe,{rotation:c.rotation,tilt:c.tilt,scale:c.scale,previewImageUrl:l,isDark:r}):s.jsx(Joe,{rotation:c.rotation,tilt:c.tilt,scale:c.scale,previewImageUrl:l,isDark:r}),s.jsx("p",{className:`mt-2 text-[10px] leading-relaxed ${r?"text-zinc-500":"text-zinc-400"}`,children:m==="subject"?"主体模式:立方体仅作示意;请用下方滑杆调整机位,数值与「摄像头」一致。":"摄像头模式:中心场景图会随「缩放」滑杆变大/变小;立体方块相机沿轨道示意机位;方向键与滑杆微调,摘要将写入生图提示词。"}),s.jsxs("div",{className:"mt-3 space-y-3",onClick:z=>z.stopPropagation(),children:[s.jsxs("div",{children:[s.jsxs("div",{className:"mb-1 flex items-center justify-between",children:[s.jsxs("div",{className:"flex items-center gap-1.5",children:[s.jsx(Rx,{className:`h-3.5 w-3.5 ${r?"text-zinc-400":"text-zinc-600"}`}),s.jsx("span",{className:`text-xs font-medium ${r?"text-zinc-300":"text-zinc-700"}`,children:"旋转"})]}),s.jsxs("span",{className:`text-xs ${r?"text-zinc-400":"text-zinc-500"}`,children:[Math.round(c.rotation),"°"]})]}),s.jsx("input",{type:"range",min:0,max:360,value:c.rotation,onChange:z=>f("rotation",Number(z.target.value)),onMouseDown:z=>z.stopPropagation(),className:`multi-angle-slider h-2 w-full cursor-pointer appearance-none rounded-lg ${r?"bg-transparent":"multi-angle-slider-light bg-zinc-200 accent-blue-600"}`})]}),s.jsxs("div",{children:[s.jsxs("div",{className:"mb-1 flex items-center justify-between",children:[s.jsxs("div",{className:"flex items-center gap-1.5",children:[s.jsx(iq,{className:`h-3.5 w-3.5 ${r?"text-zinc-400":"text-zinc-600"}`}),s.jsx("span",{className:`text-xs font-medium ${r?"text-zinc-300":"text-zinc-700"}`,children:"倾斜"})]}),s.jsxs("span",{className:`text-xs ${r?"text-zinc-400":"text-zinc-500"}`,children:[Math.round(c.tilt),"°"]})]}),s.jsx("input",{type:"range",min:-90,max:90,value:c.tilt,onChange:z=>f("tilt",Number(z.target.value)),onMouseDown:z=>z.stopPropagation(),className:`multi-angle-slider h-2 w-full cursor-pointer appearance-none rounded-lg ${r?"bg-transparent":"multi-angle-slider-light bg-zinc-200 accent-blue-600"}`})]}),s.jsxs("div",{children:[s.jsxs("div",{className:"mb-1 flex items-center justify-between",children:[s.jsxs("div",{className:"flex items-center gap-1.5",children:[s.jsx(Lw,{className:`h-3.5 w-3.5 ${r?"text-zinc-400":"text-zinc-600"}`}),s.jsx("span",{className:`text-xs font-medium ${r?"text-zinc-300":"text-zinc-700"}`,children:"缩放"})]}),s.jsx("span",{className:`text-xs ${r?"text-zinc-400":"text-zinc-500"}`,children:Goe(c.scale)})]}),s.jsx("input",{type:"range",min:.5,max:2,step:.05,value:c.scale,onChange:z=>f("scale",Number(z.target.value)),onMouseDown:z=>z.stopPropagation(),className:`multi-angle-slider h-2 w-full cursor-pointer appearance-none rounded-lg ${r?"bg-transparent":"multi-angle-slider-light bg-zinc-200 accent-blue-600"}`})]})]}),s.jsx("div",{className:"mt-3",onClick:z=>z.stopPropagation(),children:s.jsxs("div",{className:"mb-1.5 flex gap-2",children:[s.jsxs("button",{type:"button",onClick:()=>v("character"),onMouseDown:z=>z.stopPropagation(),className:`flex flex-1 items-center justify-center gap-1 rounded-lg border py-2 text-xs transition-colors ${(c.sceneMode||"character")==="character"?r?"border-white/40 text-white":"border-blue-400 bg-blue-50 text-blue-900":r?"border-white/15 text-zinc-500 hover:bg-white/5":"border-zinc-200 text-zinc-600 hover:bg-zinc-50"}`,children:[s.jsx(hd,{className:"h-3.5 w-3.5"}),"通用"]}),s.jsxs("button",{type:"button",onClick:()=>v("architecture"),onMouseDown:z=>z.stopPropagation(),className:`flex flex-1 items-center justify-center gap-1 rounded-lg border py-2 text-xs transition-colors ${c.sceneMode==="architecture"?r?"border-white/40 text-white":"border-blue-400 bg-blue-50 text-blue-900":r?"border-white/15 text-zinc-500 hover:bg-white/5":"border-zinc-200 text-zinc-600 hover:bg-zinc-50"}`,children:[s.jsx(jG,{className:"h-3.5 w-3.5"}),"建筑/室内"]})]})}),s.jsxs("div",{className:"mt-3 flex gap-2",onClick:z=>z.stopPropagation(),children:[s.jsx("button",{type:"button",onClick:()=>o==null?void 0:o(),onMouseDown:z=>z.stopPropagation(),className:`flex-1 rounded-xl border py-2.5 text-xs font-medium transition-colors ${r?"border-white/30 text-zinc-200 hover:bg-white/5":"border-zinc-300 text-zinc-700 hover:bg-zinc-50"}`,children:"取消"}),s.jsx("button",{type:"button",onClick:y,onMouseDown:z=>z.stopPropagation(),className:`flex-1 rounded-xl py-2.5 text-xs font-semibold transition-colors ${r?"border border-white/50 bg-transparent text-white hover:bg-white/5":"bg-zinc-900 text-white hover:bg-zinc-800"}`,children:"立即使用"})]})]}):null},Qoe=({rotation:e,tilt:t,sourceImage:n,isVisible:r,isDark:i,onClick:a})=>{const o=_.useRef(null),[l,c]=_.useState(!1);_.useEffect(()=>{!o.current||!r||(o.current.style.transform=`rotateY(${e}deg) rotateX(${t}deg)`)},[e,t,r]);const u=28,d=u/2,h={position:"absolute",width:`${u}px`,height:`${u}px`,backgroundColor:i?l?"rgba(63, 63, 70, 1)":"rgba(39, 39, 42, 0.8)":l?"rgba(244, 244, 245, 1)":"rgba(255, 255, 255, 1)",border:`1px solid ${i?"rgba(63, 63, 70, 1)":"rgba(212, 212, 216, 1)"}`,borderRadius:"0.5rem",display:"flex",alignItems:"center",justifyContent:"center",backdropFilter:"blur(4px)",pointerEvents:"auto",cursor:"pointer",transition:"background-color 0.15s ease-in-out"},p={opacity:1,width:"16px",height:"16px",color:i?"rgba(212, 212, 216, 1)":"rgba(82, 82, 91, 1)",zIndex:1};return r?s.jsxs("div",{ref:o,className:"relative cursor-pointer",style:{width:`${u}px`,height:`${u}px`,transformStyle:"preserve-3d",perspective:"200px",transition:l?"transform 0.1s ease-out":"none",cursor:"pointer"},onMouseEnter:()=>c(!0),onMouseLeave:()=>c(!1),onClick:f=>{f.stopPropagation(),a==null||a()},onMouseDown:f=>{f.stopPropagation()},children:[s.jsx("div",{style:{...h,transform:`translateZ(${d}px)`},children:s.jsx(Ya,{style:p})}),s.jsx("div",{style:{...h,transform:`translateZ(-${d}px) rotateY(180deg)`}}),s.jsx("div",{style:{...h,transform:`rotateY(90deg) translateZ(${d}px)`}}),s.jsx("div",{style:{...h,transform:`rotateY(-90deg) translateZ(${d}px)`}}),s.jsx("div",{style:{...h,transform:`rotateX(90deg) translateZ(${d}px)`}}),s.jsx("div",{style:{...h,transform:`rotateX(-90deg) translateZ(${d}px)`}})]}):null},ele=({marker:e,index:t,isDark:n,isEditable:r,isSelected:i=!1,imageWidth:a,imageHeight:o,onMove:l,onDelete:c,onEdit:u,onClick:d})=>{const[h,p]=_.useState(!1),[f,b]=_.useState(!1),[g,y]=_.useState(!1),w=_.useRef(null),v=(e.radius||.05)*Math.min(a,o),m=E=>{var q;if(!r||!l)return;E.stopPropagation(),E.preventDefault(),p(!0),y(!1);const I=E.clientX,R=E.clientY,A=e.x,O=e.y,F=(q=w.current)==null?void 0:q.parentElement;if(!F)return;const L=F.getBoundingClientRect(),X=H=>{(Math.abs(H.clientX-I)>3||Math.abs(H.clientY-R)>3)&&y(!0);const Z=(H.clientX-I)/L.width*100,B=(H.clientY-R)/L.height*100,V=Math.max(0,Math.min(100,A+Z)),N=Math.max(0,Math.min(100,O+B));l(V,N)},T=()=>{p(!1),document.removeEventListener("mousemove",X),document.removeEventListener("mouseup",T)};document.addEventListener("mousemove",X),document.addEventListener("mouseup",T)},z=E=>{if(E.stopPropagation(),E.preventDefault(),g){y(!1);return}console.log("[MarkerPoint] Marker clicked:",{markerId:e.id,label:e.label,hasOnClick:!!d,hasOnEdit:!!u}),d&&d(),u&&(console.log("[MarkerPoint] Calling onEdit for marker:",e.id),u())},C=E=>{!r||!c||(E.preventDefault(),E.stopPropagation(),window.confirm("确定要删除这个标记点吗?")&&c())};return s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"absolute marker-range",style:{left:`${e.x}%`,top:`${e.y}%`,transform:"translate(-50%, -50%)",width:`${v*2}px`,height:`${v*2}px`,borderRadius:"50%",border:i?"2px dashed rgba(251, 191, 36, 0.8)":"2px dashed rgba(59, 130, 246, 0.6)",background:i?"rgba(251, 191, 36, 0.15)":"rgba(59, 130, 246, 0.08)",pointerEvents:"none",zIndex:i?98:97,transition:"all 0.2s ease"}}),s.jsxs("div",{ref:w,className:`absolute marker-point ${h?"dragging":""} ${i?"selected":""}`,style:{left:`${e.x}%`,top:`${e.y}%`,transform:"translate(-50%, -50%)",width:"16px",height:"16px",borderRadius:"50%",background:e.color||"rgba(59, 130, 246, 0.9)",border:i?"2px solid #fbbf24":"1px solid white",boxShadow:i?"0 0 0 2px rgba(251, 191, 36, 0.3), 0 2px 8px rgba(0, 0, 0, 0.3)":"0 2px 8px rgba(0, 0, 0, 0.3)",display:"flex",alignItems:"center",justifyContent:"center",color:"white",fontWeight:600,fontSize:"10px",cursor:r?h?"move":"pointer":"default",transition:h?"none":"transform 0.2s, border 0.2s, box-shadow 0.2s",opacity:h?.6:1,zIndex:h?1e3:i?101:100,userSelect:"none"},onMouseDown:m,onClick:z,onContextMenu:C,onMouseEnter:()=>b(!0),onMouseLeave:()=>b(!1),children:[t+1,!h&&s.jsx("div",{style:{position:"absolute",width:"100%",height:"100%",borderRadius:"50%",border:`1px solid ${e.color||"rgba(59, 130, 246, 0.6)"}`,animation:"marker-pulse 2s infinite",pointerEvents:"none"}})]}),f&&(e.isAnalyzing||!e.label||e.label==="未分析")&&s.jsxs("div",{className:"absolute",style:{left:`${e.x}%`,top:`calc(${e.y}% - 50px)`,transform:"translateX(-50%)",minWidth:"120px",maxWidth:"200px",background:n?"rgba(30, 30, 30, 0.95)":"rgba(255, 255, 255, 0.95)",color:n?"#e5e7eb":"#1f2937",padding:"6px 10px",borderRadius:"6px",fontSize:"12px",boxShadow:"0 2px 8px rgba(0, 0, 0, 0.2)",zIndex:1001,pointerEvents:"none",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:[e.isAnalyzing?"AI 分析中...":"点击编辑标记",s.jsx("div",{style:{position:"absolute",bottom:"-6px",left:"50%",transform:"translateX(-50%)",width:0,height:0,borderLeft:"6px solid transparent",borderRight:"6px solid transparent",borderTop:`6px solid ${n?"rgba(30, 30, 30, 0.95)":"rgba(255, 255, 255, 0.95)"}`}})]}),e.label&&e.label!=="未分析"&&!e.isAnalyzing&&s.jsx("div",{className:"absolute marker-label",style:{left:`${e.x}%`,top:`calc(${e.y}% + 24px)`,transform:"translateX(-50%)",minWidth:"80px",maxWidth:"200px",background:"rgba(255, 255, 255, 0.95)",color:"#2563eb",padding:"4px 10px",borderRadius:"6px",fontSize:"12px",fontWeight:500,boxShadow:"0 2px 8px rgba(0, 0, 0, 0.15)",border:"1px solid rgba(37, 99, 235, 0.2)",zIndex:99,pointerEvents:"none",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",textAlign:"center"},children:e.label})]})},tle=({nodeId:e,markers:t,onMarkersChange:n,isDark:r,isMarkerMode:i,imageWidth:a,imageHeight:o,imageUrl:l,mainLabel:c,onMarkerEdit:u})=>{const[d,h]=_.useState(null),p=_.useRef(null),f=_.useCallback(async v=>{if(!i||v.target!==v.currentTarget)return;const m=v.currentTarget.getBoundingClientRect(),z=v.clientX-m.left,C=v.clientY-m.top,E=z/m.width*100,I=C/m.height*100;if(E<0||E>100||I<0||I>100)return;const R=ns(),A={id:R,x:E,y:I,label:"未分析",color:"#3b82f6",createdAt:Date.now(),radius:.05,activeLevel:"detail",mainLabel:c||"图片",partLabel:"部件",detailLabel:"未分析",isAnalyzing:!1};n([...t,A]),h(R),u&&u(R)},[i,t,n,c,u]),b=_.useCallback((v,m,z)=>{const C=t.map(E=>E.id===v?{...E,x:m,y:z}:E);n(C)},[t,n]),g=_.useCallback(v=>{const z=t.filter(C=>C.id!==v).map((C,E)=>({...C,label:String(E+1)}));n(z)},[t,n]),y=_.useCallback(v=>{h(v),u&&u(v)},[u]),w=_.useCallback(v=>{h(v)},[]);return _.useEffect(()=>{if(!i||!d)return;const v=m=>{(m.key==="Delete"||m.key==="Backspace")&&(m.preventDefault(),g(d),h(null))};return window.addEventListener("keydown",v),()=>window.removeEventListener("keydown",v)},[i,d]),!a||!o?null:s.jsx("div",{ref:p,className:"absolute inset-0 marker-layer",style:{pointerEvents:i?"auto":"none",cursor:i?"crosshair":"default",zIndex:50},onClick:f,onMouseDown:v=>{i&&v.target===v.currentTarget&&v.stopPropagation()},children:t.map((v,m)=>s.jsx(ele,{marker:v,index:m,isDark:r,isEditable:i,isSelected:d===v.id,imageWidth:a,imageHeight:o,onMove:(z,C)=>b(v.id,z,C),onDelete:()=>g(v.id),onEdit:()=>y(v.id),onClick:()=>w(v.id)},v.id))})};function nle(e,t,n){const r=e.width,i=e.height,a=t/n;let o,l;return r/i>a?(l=i,o=i*a):(o=r,l=r/a),{left:e.left+(r-o)/2,top:e.top+(i-l)/2,width:o,height:l}}function rle(e,t,n,r){const i=n/r;let a,o;return e/t>i?(o=t,a=t*i):(a=e,o=e/i),{left:(e-a)/2,top:(t-o)/2,width:a,height:o}}const sle=({containerRef:e,imageAreaRef:t,imgNaturalWidth:n,imgNaturalHeight:r,containerWidth:i,containerHeight:a,objectFit:o="cover",selection:l,onSelectionChange:c,isDark:u,disabled:d,view:h,canvasRef:p,nodeRect:f})=>{const[b,g]=_.useState(!1),[y,w]=_.useState("rect"),[,v]=_.useState(0),[m,z]=_.useState(null),[C,E]=_.useState([]),I=_.useRef(null),R=_.useRef(null),A=_.useRef([]),O=_.useRef(null),F=_.useRef(null),L=_.useCallback((Y,se)=>{if(!n||!r)return{x:0,y:0};if(h&&(p!=null&&p.current)&&f){const we=p.current.getBoundingClientRect(),Q=(Y-we.left-h.x)/h.zoom,me=(se-we.top-h.y)/h.zoom,ue=Q-f.x,U=me-f.y,G=rle(f.width,f.height,n,r);if(G.width<=0||G.height<=0)return{x:0,y:0};const te=(ue-G.left)/G.width,ge=(U-G.top)/G.height;return{x:Math.round(te*n),y:Math.round(ge*r)}}const ie=F.current,oe=ie||(()=>{const we=(t==null?void 0:t.current)??O.current??e.current;return we?we.getBoundingClientRect():null})();if(!oe)return{x:0,y:0};const re=nle(oe,n,r);if(re.width<=0||re.height<=0)return{x:0,y:0};const ee=(Y-re.left)/re.width,pe=(se-re.top)/re.height;return{x:Math.round(ee*n),y:Math.round(pe*r)}},[e,t,n,r,h,p,f]),X=_.useCallback((Y,se,ie,oe,re,ee)=>{const pe=Math.max(0,Math.min(Y,ie)),we=Math.max(0,Math.min(se,oe));let Q=Math.abs(ie-Y),me=Math.abs(oe-se);const ue=n-8,U=r-8;if(Q>=8&&me>=8){Q=Math.max(8,Math.ceil(Q/8)*8),me=Math.max(8,Math.ceil(me/8)*8);const G=Math.min(pe,n-Q),te=Math.min(we,r-me),ge=Math.max(0,Math.min(G,ue-Q+8)),ne=Math.max(0,Math.min(te,U-me+8));c({x:ge,y:ne,width:Q,height:me,shape:re!=="rect"?re:void 0,penPath:ee&&ee.length>=2?ee:void 0})}},[n,r,c]),T=_.useCallback(Y=>{if(d||Y.button!==0)return;Y.preventDefault(),Y.stopPropagation();const se=(t==null?void 0:t.current)??O.current??e.current;if(se){const re=se.getBoundingClientRect();F.current={left:re.left,top:re.top,width:re.width,height:re.height}}const ie=L(Y.clientX,Y.clientY);I.current=ie;const oe={x:Y.clientX,y:Y.clientY};R.current=oe,z(oe),y==="pen"&&(A.current=[ie],E([ie])),g(!0)},[d,L,y]),q=_.useCallback(Y=>{const se={x:Y.clientX,y:Y.clientY};if(R.current=se,v(ie=>ie+1),y==="pen"&&I.current){const ie=L(Y.clientX,Y.clientY),oe=A.current[A.current.length-1];(oe?Math.hypot(ie.x-oe.x,ie.y-oe.y):10)>=2&&(A.current=[...A.current,ie],E([...A.current]))}},[y,L]),H=_.useCallback(()=>{const Y=R.current;if(!I.current||!Y){F.current=null,g(!1),z(null),E([]),A.current=[],R.current=null;return}const se=L(Y.x,Y.y);if(y==="pen"){const ie=A.current;if(ie.length>=2){const oe=ie.map(me=>me.x),re=ie.map(me=>me.y),ee=Math.max(0,Math.min(...oe)),pe=Math.max(0,Math.min(...re)),we=Math.min(n,Math.max(...oe)),Q=Math.min(r,Math.max(...re));X(ee,pe,we,Q,"pen",ie)}}else if(y==="circle"){const ie=Math.min(I.current.x,se.x),oe=Math.min(I.current.y,se.y),re=Math.max(I.current.x,se.x),ee=Math.max(I.current.y,se.y);X(ie,oe,re,ee,"circle")}else{const ie=Math.min(I.current.x,se.x),oe=Math.min(I.current.y,se.y),re=Math.max(I.current.x,se.x),ee=Math.max(I.current.y,se.y);X(ie,oe,re,ee,"rect")}F.current=null,g(!1),z(null),E([]),A.current=[],R.current=null},[y,L,n,r,X]),J=_.useRef(!1);J.current=b,_.useEffect(()=>{if(!b)return;const Y=se=>{J.current&&q(se)};return document.addEventListener("mousemove",Y,{passive:!0}),document.addEventListener("mouseup",H),()=>{document.removeEventListener("mousemove",Y),document.removeEventListener("mouseup",H)}},[b,q,H]);const Z=_.useCallback(()=>{b&&H()},[b,H]),B=_.useCallback(()=>{var ee,pe,we,Q;const Y=f?f.width:((ee=F.current)==null?void 0:ee.width)??((pe=(t==null?void 0:t.current)??O.current??e.current)==null?void 0:pe.getBoundingClientRect().width)??i,se=f?f.height:((we=F.current)==null?void 0:we.height)??((Q=(t==null?void 0:t.current)??O.current??e.current)==null?void 0:Q.getBoundingClientRect().height)??a,ie=Math.max(Y/n,se/r),oe=(n*ie-Y)/2,re=(r*ie-se)/2;return{scale:ie,offsetX:oe,offsetY:re,cw:Y,ch:se}},[e,t,i,a,n,r,f]),V=_.useCallback((Y,se)=>{const{scale:ie,offsetX:oe,offsetY:re}=B();return{x:Y*ie-oe,y:se*ie-re,scale:ie}},[B]);let N=null,j=null,k=null;const W=R.current;if(b&&m&&W&&I.current){const Y=L(W.x,W.y),se=Math.min(I.current.x,Y.x),ie=Math.min(I.current.y,Y.y),oe=Math.max(I.current.x,Y.x),re=Math.max(I.current.y,Y.y);if(y==="circle"){const ee=(se+oe)/2,pe=(ie+re)/2,we=Math.min(Math.abs(oe-se),Math.abs(re-ie))/2,Q=V(ee,pe);j={cx:Q.x,cy:Q.y,r:we*Q.scale}}else if(y==="pen"){const ee=A.current,pe=W?L(W.x,W.y):null,we=pe&&ee.length>=1?[...ee,pe]:ee;we.length>=2&&(k=we.map(me=>V(me.x,me.y)).map((me,ue)=>`${ue===0?"M":"L"} ${me.x} ${me.y}`).join(" "))}else{const ee=B(),pe=V(se,ie),we=V(oe,re);N={left:Math.max(0,pe.x),top:Math.max(0,pe.y),width:Math.min(ee.cw,we.x-pe.x),height:Math.min(ee.ch,we.y-pe.y)}}}else if(l&&l.width>=8&&l.height>=8&&!b){const Y=l.shape||"rect",se=l.penPath;if(Y==="circle"){const ie=l.x+l.width/2,oe=l.y+l.height/2,re=Math.min(l.width,l.height)/2,ee=V(ie,oe);j={cx:ee.x,cy:ee.y,r:re*ee.scale}}else if(Y==="pen"&&se&&se.length>=2)k=se.map(oe=>V(oe.x,oe.y)).map((oe,re)=>`${re===0?"M":"L"} ${oe.x} ${oe.y}`).join(" ");else{const ie=V(l.x,l.y),oe=V(l.x+l.width,l.y+l.height);N={left:ie.x,top:ie.y,width:oe.x-ie.x,height:oe.y-ie.y}}}const M=Y=>`p-1.5 rounded border ${Y?"border-blue-500 bg-blue-500/20 text-blue-400":u?"border-zinc-600 bg-zinc-800/80 text-zinc-400 hover:bg-zinc-700":"border-zinc-300 bg-white/80 text-zinc-500 hover:bg-zinc-100"}`;return s.jsxs("div",{ref:O,"data-crop-select-overlay":!0,className:"absolute inset-0 z-20 cursor-crosshair select-none",onMouseDown:T,onMouseLeave:Z,style:{pointerEvents:d?"none":"auto"},children:[!d&&s.jsxs("div",{className:"absolute bottom-2 left-2 right-2 flex items-center justify-between gap-2",children:[s.jsxs("div",{className:`flex items-center gap-1 px-2 py-1.5 rounded ${u?"bg-zinc-800/90 text-zinc-300":"bg-white/90 text-zinc-600"}`,children:[s.jsx("button",{type:"button",title:"矩形选区",className:M(y==="rect"),onClick:()=>w("rect"),children:s.jsx(Ih,{size:14,strokeWidth:2.5})}),s.jsx("button",{type:"button",title:"圆形选区",className:M(y==="circle"),onClick:()=>w("circle"),children:s.jsx(BP,{size:14,strokeWidth:2.5})}),s.jsx("button",{type:"button",title:"钢笔自由绘制",className:M(y==="pen"),onClick:()=>w("pen"),children:s.jsx(R5,{size:14,strokeWidth:2.5})})]}),s.jsx("span",{className:"text-[10px] text-zinc-500",children:y==="rect"?"拖拽框选":y==="circle"?"拖拽绘制圆形":"拖拽自由绘制"})]}),N&&N.width>0&&N.height>0&&s.jsx("div",{className:"absolute border-2 border-dashed pointer-events-none",style:{left:N.left,top:N.top,width:N.width,height:N.height,borderColor:"rgb(59 130 246)",backgroundColor:"rgba(59 130 246 / 0.15)"}}),j&&s.jsx("div",{className:"absolute border-2 border-dashed pointer-events-none",style:{left:j.cx-j.r,top:j.cy-j.r,width:j.r*2,height:j.r*2,borderColor:"rgb(59 130 246)",backgroundColor:"rgba(59 130 246 / 0.15)",borderRadius:"50%"}}),k&&s.jsx("svg",{className:"absolute inset-0 w-full h-full pointer-events-none",style:{overflow:"visible"},children:s.jsx("path",{d:k,fill:"none",stroke:"rgb(59 130 246)",strokeWidth:2,strokeDasharray:"4 2"})})]})},ile=({settings:e,onChange:t,isDark:n,onClose:r,nodeId:i})=>{const[a,o]=_.useState(!1),[l,c]=_.useState({x:0,y:-80,z:0}),u=_.useRef(null),d=_.useRef(),h=(v,m)=>{m.preventDefault(),m.stopPropagation(),t({...e,direction:v,isActive:!0,customPosition:void 0})},p=(v,m)=>{if(v==="custom"&&m)return m;switch(v){case"top":return{x:0,y:-80,z:0};case"bottom":return{x:0,y:80,z:0};case"left":return{x:-80,y:0,z:0};case"right":return{x:80,y:0,z:0};case"front":return{x:0,y:0,z:80};case"back":return{x:0,y:0,z:-80};default:return{x:0,y:0,z:0}}};_.useEffect(()=>{const v=p(e.direction,e.customPosition),m=()=>{c(z=>{const C=v.x-z.x,E=v.y-z.y,I=v.z-z.z,R=.15;return Math.abs(C)<.1&&Math.abs(E)<.1&&Math.abs(I)<.1?v:{x:z.x+C*R,y:z.y+E*R,z:z.z+I*R}}),d.current=requestAnimationFrame(m)};return d.current=requestAnimationFrame(m),()=>{d.current&&cancelAnimationFrame(d.current)}},[e.direction,e.customPosition]);const b=((v,m,z)=>{const E=300/(300-z);return{x:v*E,y:m*E,scale:E,opacity:Math.max(.3,Math.min(1,.5+(z+100)/200))}})(l.x,l.y,l.z),g=v=>{v.preventDefault(),v.stopPropagation(),o(!0)};_.useEffect(()=>{if(!a)return;const v=z=>{if(!u.current)return;const C=u.current.getBoundingClientRect(),E=C.left+C.width/2,I=C.top+C.height/2,R=z.clientX-E,A=z.clientY-I,O=Math.sqrt(R*R+A*A),F=Math.min(C.width,C.height)/2-20,L=Math.min(O,F),X=Math.atan2(A,R),T=Math.cos(X)*L,q=Math.sin(X)*L,H=80,J=T/F*H,Z=q/F*H,B=Math.sqrt(Math.max(0,H*H-J*J-Z*Z)),N=!z.shiftKey?B:-B;t({...e,direction:"custom",isActive:!0,customPosition:{x:J,y:Z,z:N}})},m=()=>{o(!1)};return document.addEventListener("mousemove",v),document.addEventListener("mouseup",m),()=>{document.removeEventListener("mousemove",v),document.removeEventListener("mouseup",m)}},[a,t,e]);const y=20+e.brightness/100*40,w=y*(e.brightness/100)*2;return s.jsxs("div",{className:`p-4 rounded-lg border flex flex-col gap-4 select-none w-80 ${n?"bg-zinc-900 border-white/30":"bg-white border-zinc-200"}`,onMouseDown:v=>v.stopPropagation(),onClick:v=>v.stopPropagation(),children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsxs("div",{className:`flex items-center gap-2 text-sm font-semibold ${n?"text-white":"text-zinc-800"}`,children:[s.jsx(HP,{size:16}),s.jsx("span",{children:"重打光"})]}),s.jsx("button",{className:`w-10 h-5 rounded-full relative transition-colors border ${e.isActive?n?"bg-transparent border-white/50":"bg-black border-black":n?"bg-transparent border-white/30":"bg-zinc-700 border-zinc-700"}`,onClick:v=>{v.preventDefault(),v.stopPropagation(),t({...e,isActive:!e.isActive})},children:s.jsx("div",{className:`absolute top-0.5 w-4 h-4 rounded-full transition-all ${e.isActive?"left-5 bg-white":n?"left-0.5 bg-white/50":"left-0.5 bg-white"}`})})]}),e.isActive&&s.jsxs(s.Fragment,{children:[s.jsxs("div",{className:"flex flex-col gap-2",children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsx("span",{className:`text-xs ${n?"text-zinc-500":"text-zinc-600"}`,children:"快速选择"}),e.direction!=="custom"&&s.jsx("span",{className:`text-xs ${n?"text-white":"text-blue-600"}`,children:e.direction==="top"?"顶光":e.direction==="front"?"正面":e.direction==="right"?"右侧":e.direction==="left"?"左侧":e.direction==="back"?"背光":"底光"})]}),s.jsx("div",{className:"grid grid-cols-3 gap-2",children:[{dir:"top",label:"顶光",icon:"↑"},{dir:"front",label:"正面",icon:"●"},{dir:"right",label:"右侧",icon:"→"},{dir:"left",label:"左侧",icon:"←"},{dir:"back",label:"背光",icon:"○"},{dir:"bottom",label:"底光",icon:"↓"}].map(({dir:v,label:m,icon:z})=>s.jsxs("button",{onClick:C=>h(v,C),className:`px-3 py-2 rounded-lg text-sm font-medium transition-all flex items-center justify-center gap-1.5 border ${e.direction===v?n?"bg-transparent border-white/50 text-white":"bg-black text-white border-black shadow-sm ring-2 ring-zinc-400/30":n?"bg-transparent border-white/30 text-white hover:bg-white/5":"bg-zinc-100 text-zinc-700 border-zinc-300 hover:bg-zinc-200 hover:border-zinc-400"}`,children:[s.jsx("span",{className:"text-base",children:z}),s.jsx("span",{children:m})]},v))})]}),s.jsxs("div",{className:"flex flex-col gap-2",children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsx("span",{className:`text-xs ${n?"text-zinc-500":"text-zinc-600"}`,children:"按住拖动改变光线方向"}),e.direction==="custom"&&s.jsx("span",{className:`text-xs ${n?"text-white":"text-blue-600"}`,children:"自由模式"})]}),s.jsxs("div",{ref:u,className:`relative h-64 rounded-lg border flex items-center justify-center overflow-hidden cursor-grab active:cursor-grabbing ${n?"bg-zinc-950 border-white/30":"bg-zinc-200 border-zinc-300"}`,onMouseDown:g,children:[s.jsxs("svg",{className:"absolute inset-0 w-full h-full opacity-20",viewBox:"0 0 200 200",children:[Array.from({length:12}).map((v,m)=>{const z=m*30*Math.PI/180;return s.jsx("ellipse",{cx:"100",cy:"100",rx:Math.abs(Math.cos(z))*80,ry:"80",fill:"none",stroke:"currentColor",strokeWidth:"0.5",className:n?"text-zinc-600":"text-zinc-500"},`meridian-${m}`)}),Array.from({length:7}).map((v,m)=>{const z=100+(m-3)*25,C=Math.sqrt(Math.max(0,6400-Math.pow((m-3)*25,2)));return s.jsx("circle",{cx:"100",cy:z,r:C,fill:"none",stroke:"currentColor",strokeWidth:"0.5",className:n?"text-zinc-600":"text-zinc-500"},`parallel-${m}`)})]}),s.jsx("div",{className:"absolute top-2 left-1/2 -translate-x-1/2 text-xs text-zinc-600",children:"▲"}),s.jsx("div",{className:"absolute bottom-2 left-1/2 -translate-x-1/2 text-xs text-zinc-600",children:"▼"}),s.jsx("div",{className:"absolute left-2 top-1/2 -translate-y-1/2 text-xs text-zinc-600",children:"◀"}),s.jsx("div",{className:"absolute right-2 top-1/2 -translate-y-1/2 text-xs text-zinc-600",children:"▶"}),s.jsx("div",{className:"absolute rounded-full pointer-events-none transition-all",style:{width:`${y}px`,height:`${y}px`,backgroundColor:e.color,boxShadow:` + 0 0 ${w}px ${e.color}, + 0 0 ${w*.5}px ${e.color}, + inset 0 0 ${y*.3}px rgba(255,255,255,0.8) + `,transform:`translate(${b.x}px, ${b.y}px) scale(${b.scale})`,opacity:b.opacity*(e.brightness/100),filter:`blur(${e.hardness==="soft"?"6px":"0px"})`},children:s.jsx("div",{className:"absolute inset-0 rounded-full",style:{background:"radial-gradient(circle at 30% 30%, rgba(255,255,255,0.8), transparent 60%)"}})}),s.jsxs("svg",{className:"absolute inset-0 w-full h-full pointer-events-none",viewBox:"0 0 200 200",children:[s.jsx("defs",{children:s.jsxs("linearGradient",{id:"lightBeam",x1:"0%",y1:"0%",x2:"100%",y2:"0%",children:[s.jsx("stop",{offset:"0%",stopColor:e.color,stopOpacity:"0"}),s.jsx("stop",{offset:"50%",stopColor:e.color,stopOpacity:e.brightness/200}),s.jsx("stop",{offset:"100%",stopColor:e.color,stopOpacity:"0"})]})}),s.jsx("line",{x1:100+b.x,y1:100+b.y,x2:"100",y2:"100",stroke:"url(#lightBeam)",strokeWidth:y/2,opacity:e.brightness/150})]}),s.jsx("div",{className:`absolute w-12 h-12 flex items-center justify-center z-10 ${n?"text-zinc-500":"text-zinc-600"}`,children:s.jsx("svg",{width:"32",height:"32",viewBox:"0 0 24 24",fill:"currentColor",children:s.jsx("path",{d:"M9 2L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2h-3.17L15 2H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z"})})})]})]}),s.jsxs("div",{className:"flex flex-col gap-2",children:[s.jsxs("div",{className:"flex justify-between text-xs",children:[s.jsx("span",{className:n?"text-zinc-500":"text-zinc-600",children:"光强"}),s.jsxs("span",{className:n?"text-white font-semibold":"text-zinc-700 font-semibold",children:[e.brightness,"%"]})]}),s.jsxs("div",{className:"relative",children:[s.jsx("input",{type:"range",min:"0",max:"100",value:e.brightness,onChange:v=>{v.stopPropagation(),t({...e,brightness:parseInt(v.target.value)})},className:`w-full h-2 rounded-lg appearance-none cursor-pointer light-intensity-slider ${n?"light-intensity-slider-dark":""}`,style:{background:n?`linear-gradient(to right, ${e.color} 0%, ${e.color} ${e.brightness}%, transparent ${e.brightness}%, transparent 100%)`:`linear-gradient(to right, ${e.color} 0%, ${e.color} ${e.brightness}%, rgb(228 228 231) ${e.brightness}%, rgb(228 228 231) 100%)`}}),s.jsx("div",{className:`absolute top-1/2 -translate-y-1/2 w-4 h-4 rounded-full border-2 pointer-events-none transition-all ${n?"border-white":"border-zinc-300"}`,style:{left:`calc(${e.brightness}% - 8px)`,backgroundColor:e.color,boxShadow:`0 0 ${e.brightness/5}px ${e.color}`}})]})]}),s.jsxs("div",{className:"flex flex-col gap-2",children:[s.jsx("span",{className:`text-xs ${n?"text-zinc-500":"text-zinc-600"}`,children:"光质"}),s.jsx("div",{className:"flex gap-2",children:[{value:"soft",label:"柔光",icon:"◐"},{value:"hard",label:"硬光",icon:"◉"}].map(({value:v,label:m,icon:z})=>s.jsxs("button",{className:`flex-1 py-2.5 text-sm rounded-lg transition-all flex items-center justify-center gap-2 border ${e.hardness===v?n?"bg-transparent border-white/50 text-white":"bg-black text-white border-black shadow-sm":n?"bg-transparent border-white/30 text-white hover:bg-white/5":"bg-zinc-100 text-zinc-700 border-zinc-300 hover:bg-zinc-200 hover:border-zinc-400"}`,onClick:C=>{C.preventDefault(),C.stopPropagation(),t({...e,hardness:v})},children:[s.jsx("span",{className:"text-lg",children:z}),s.jsx("span",{children:m})]},v))})]}),s.jsxs("div",{className:"flex flex-col gap-2",children:[s.jsx("span",{className:`text-xs ${n?"text-zinc-500":"text-zinc-600"}`,children:"颜色"}),s.jsxs("div",{className:"flex gap-2",children:[s.jsx("input",{type:"color",value:e.color,onChange:v=>{v.stopPropagation(),t({...e,color:v.target.value})},className:`w-12 h-12 rounded-lg cursor-pointer border-2 ${n?"bg-transparent border-white/30":"bg-white border-zinc-300"}`,style:{colorScheme:n?"dark":"light"}}),s.jsx("div",{className:`flex-1 flex items-center px-3 py-2 rounded-lg border ${n?"bg-transparent border-white/30":"bg-white border-zinc-300"}`,children:s.jsx("span",{className:`text-sm font-mono ${n?"text-white":"text-zinc-800"}`,children:e.color.toUpperCase()})})]})]}),s.jsxs("button",{onClick:v=>{v.preventDefault(),v.stopPropagation();const m=ale(e),z=new CustomEvent("lightingConfirmed",{detail:{nodeId:i,settings:e,prompt:m,timestamp:Date.now()}});window.dispatchEvent(z),console.log("[LightControlPanel] 灯光已确定:",{nodeId:i,settings:e,prompt:m}),r&&r()},className:`w-full py-3 font-medium rounded-lg transition-colors flex items-center justify-center gap-2 border ${n?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-black hover:bg-zinc-800 text-white border-black"}`,children:[s.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:s.jsx("polyline",{points:"20 6 9 17 4 12"})}),s.jsx("span",{children:"确定"})]})]})]})};function ale(e){if(!e.isActive)return"";const t=[],n={top:"顶光",front:"正面光",left:"左侧光",right:"右侧光",back:"背光",bottom:"底光"};if(e.direction==="custom"&&e.customPosition){const{x:r,y:i,z:a}=e.customPosition,o=Math.abs(r),l=Math.abs(i),c=Math.abs(a),u=Math.max(o,l,c);let d="";u===o?d=r>0?"右侧":"左侧":u===l?d=i>0?"底部":"顶部":d=a>0?"正面":"背面",t.push(`方向: ${d}(自由模式)`)}else t.push(`方向: ${n[e.direction]}`);return t.push(`光质: ${e.hardness==="soft"?"柔光":"硬光"}`),t.push(`光强: ${e.brightness}%`),t.push(`颜色: ${e.color}`),t.join(" | ")}const c7="color_adjust_presets";function lm(){try{const e=localStorage.getItem(c7);if(!e)return[];const t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}function u7(e){try{localStorage.setItem(c7,JSON.stringify(e))}catch(t){console.warn("[colorAdjustPresets] save failed:",t)}}function ole(e,t){const n=lm(),i={id:`preset_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,name:e,params:{...t},createdAt:Date.now()};return n.unshift(i),u7(n),i}function lle(e){const t=lm().filter(n=>n.id!==e);u7(t)}const cle=[{key:"light",label:"光线"},{key:"exposure",label:"曝光"},{key:"contrast",label:"对比度"},{key:"highlights",label:"高光"},{key:"shadows",label:"阴影"},{key:"whites",label:"白色"},{key:"blacks",label:"黑色"},{key:"temperature",label:"色温"},{key:"tint",label:"色调"},{key:"vibrance",label:"自然饱和度"},{key:"saturation",label:"饱和度"}],ule=({imageContent:e,isDark:t,savedParams:n={},onClose:r,onApply:i,onParamsChange:a})=>{const[o,l]=_.useState("adjust"),[c,u]=_.useState(()=>({light:n.light??0,exposure:n.exposure??0,contrast:n.contrast??0,highlights:n.highlights??0,shadows:n.shadows??0,whites:n.whites??0,blacks:n.blacks??0,temperature:n.temperature??0,tint:n.tint??0,vibrance:n.vibrance??0,saturation:n.saturation??0,sharpness:n.sharpness??0,clarity:n.clarity??0})),[d,h]=_.useState(!1),[p,f]=_.useState(()=>lm()),[b,g]=_.useState("");_.useEffect(()=>{f(lm())},[o]);const y=_.useCallback((E,I)=>{u(R=>({...R,[E]:I}))},[]);_.useEffect(()=>{a==null||a(c)},[c,a]);const w=_.useCallback(E=>{u(I=>({...I,...E.params}))},[]),v=_.useCallback(()=>{const E=b.trim()||`方案 ${new Date().toLocaleString("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})}`;ole(E,c),g(""),f(lm())},[c,b]),m=_.useCallback((E,I)=>{E.stopPropagation(),lle(I),f(lm())},[]),z=_.useCallback(()=>{u({light:0,exposure:0,contrast:0,highlights:0,shadows:0,whites:0,blacks:0,temperature:0,tint:0,vibrance:0,saturation:0,sharpness:0,clarity:0})},[]),C=_.useCallback(async()=>{if(!Object.values(c).some(I=>I!==0&&I!==void 0)){r(void 0);return}h(!0);try{const{applyColorAdjust:I}=await mn(async()=>{const{applyColorAdjust:A}=await Promise.resolve().then(()=>fle);return{applyColorAdjust:A}},void 0,import.meta.url),R=await I(e,c);i(c,R),r(void 0)}catch(I){console.error("[ColorAdjustPanel] 应用调色失败:",I)}finally{h(!1)}},[c,e,i,r]);return s.jsxs("div",{className:`flex flex-col rounded-lg overflow-hidden border ${t?"bg-zinc-900 border-white/30 shadow-lg shadow-black/20":"bg-white border-zinc-200 shadow-xl"}`,style:{width:220,maxHeight:520},onClick:E=>E.stopPropagation(),children:[s.jsxs("div",{className:`flex items-center justify-between px-3 py-2 border-b ${t?"border-white/10":"border-zinc-200"}`,children:[s.jsx("span",{className:"text-xs font-medium text-zinc-500",children:"调色编辑"}),s.jsx("button",{onClick:()=>r(c),className:`p-1 rounded-md ${t?"text-zinc-500 hover:text-zinc-300 hover:bg-zinc-800/40":"text-zinc-500 hover:bg-zinc-100"}`,title:"关闭",children:s.jsx(Qr,{size:16})})]}),s.jsxs("div",{className:`flex flex-col flex-1 min-h-0 ${t?"bg-transparent":"border-zinc-200 bg-zinc-100"}`,children:[s.jsx("div",{className:`flex border-b ${t?"border-white/10":"border-zinc-200"}`,children:["adjust","detail","scheme"].map(E=>s.jsxs("button",{onClick:()=>l(E),className:`flex-1 py-2 flex items-center justify-center gap-1 text-[11px] transition-colors ${o===E?t?"text-zinc-200 border-b border-zinc-500":"text-zinc-900 border-b-2 border-zinc-900":t?"text-zinc-500 hover:text-zinc-400":"text-zinc-500 hover:text-zinc-700"}`,children:[E==="adjust"&&s.jsx(n$,{size:12}),E==="detail"&&s.jsx(O5,{size:12}),E==="scheme"&&s.jsx(Ll,{size:12}),E==="adjust"?"调整":E==="detail"?"细节":"方案"]},E))}),s.jsxs("div",{className:"flex-1 overflow-y-auto p-2 custom-scrollbar",children:[o==="adjust"&&s.jsxs(s.Fragment,{children:[cle.map(({key:E,label:I})=>s.jsxs("div",{className:t?"mb-2.5":"mb-3",children:[s.jsxs("div",{className:"flex justify-between items-center mb-0.5",children:[s.jsx("span",{className:`text-[11px] ${t?"text-zinc-500":"text-zinc-600"}`,children:I}),s.jsx("span",{className:`text-[10px] w-8 text-right tabular-nums ${t?"text-zinc-600":"text-zinc-400"}`,children:c[E]??0})]}),s.jsx("input",{type:"range",min:-100,max:100,value:c[E]??0,onChange:R=>y(E,Number(R.target.value)),className:`w-full rounded-full cursor-pointer ${t?"h-1 accent-zinc-400 [color-scheme:dark]":"h-1.5 accent-blue-500 [color-scheme:light]"}`})]},E)),s.jsx("button",{onClick:z,className:`w-full py-1.5 text-xs rounded-md mt-2 ${t?"text-zinc-600 hover:text-zinc-400 hover:bg-zinc-800/30":"text-zinc-500 hover:bg-zinc-200 rounded-lg"}`,children:"重置"})]}),o==="detail"&&s.jsxs(s.Fragment,{children:[[{key:"sharpness",label:"锐化",min:0,max:100},{key:"clarity",label:"清晰度",min:-100,max:100}].map(({key:E,label:I,min:R,max:A})=>s.jsxs("div",{className:t?"mb-2.5":"mb-3",children:[s.jsxs("div",{className:"flex justify-between items-center mb-0.5",children:[s.jsx("span",{className:`text-[11px] ${t?"text-zinc-500":"text-zinc-600"}`,children:I}),s.jsx("span",{className:`text-[10px] w-8 text-right tabular-nums ${t?"text-zinc-600":"text-zinc-400"}`,children:c[E]??0})]}),s.jsx("input",{type:"range",min:R,max:A,value:c[E]??0,onChange:O=>y(E,Number(O.target.value)),className:`w-full rounded-full cursor-pointer ${t?"h-1 accent-zinc-400 [color-scheme:dark]":"h-1.5 accent-blue-500 [color-scheme:light]"}`})]},E)),s.jsx("button",{onClick:z,className:`w-full py-1.5 text-xs rounded-md mt-2 ${t?"text-zinc-600 hover:text-zinc-400 hover:bg-zinc-800/30":"text-zinc-500 hover:bg-zinc-200 rounded-lg"}`,children:"重置"})]}),o==="scheme"&&s.jsxs("div",{className:"space-y-3",children:[s.jsxs("div",{className:"flex gap-2 items-center",children:[s.jsx("input",{type:"text",value:b,onChange:E=>g(E.target.value),placeholder:"方案名称(可选)",className:`w-28 min-w-0 px-2 py-1 rounded text-[11px] ${t?"bg-zinc-800/40 text-zinc-400 border-zinc-700/60 placeholder:text-zinc-600":"bg-white text-zinc-800 border-zinc-300"} border`}),s.jsxs("button",{onClick:v,className:`flex items-center gap-1 px-2 py-1 rounded text-[11px] shrink-0 ${t?"bg-zinc-700/60 hover:bg-zinc-600/60 text-zinc-300":"bg-black hover:bg-zinc-800 text-white"}`,title:"保存当前调色为方案",children:[s.jsx(xu,{size:12}),"保存"]})]}),s.jsx("div",{className:`text-[10px] ${t?"text-zinc-600":"text-zinc-400"}`,children:"已保存的方案(点击应用)"}),s.jsx("div",{className:"space-y-0.5 max-h-52 overflow-y-auto custom-scrollbar",children:p.length===0?s.jsx("div",{className:`text-[11px] py-2 ${t?"text-zinc-600":"text-zinc-400"}`,children:"暂无方案,可先调节后保存"}):p.map(E=>s.jsxs("div",{onClick:()=>w(E),className:`flex items-center justify-between px-2 py-1.5 rounded cursor-pointer text-[11px] ${t?"hover:bg-zinc-800/40 text-zinc-500 hover:text-zinc-300":"hover:bg-zinc-100 text-zinc-700"}`,children:[s.jsx("span",{className:"truncate flex-1",children:E.name}),s.jsx("button",{onClick:I=>m(I,E.id),className:`p-1 rounded hover:opacity-80 ${t?"text-zinc-600 hover:text-red-400/80":"text-zinc-400 hover:text-red-500"}`,title:"删除方案",children:s.jsx(Zi,{size:12})})]},E.id))})]})]}),s.jsx("div",{className:`p-2 border-t ${t?"border-white/10":"border-zinc-200"}`,children:s.jsx("button",{onClick:C,disabled:d,className:`w-full py-2 text-xs font-medium disabled:opacity-50 ${t?"rounded-md bg-zinc-700/80 text-zinc-200 hover:bg-zinc-600/80":"rounded-lg bg-black text-white hover:bg-zinc-800"}`,children:d?"应用中...":"应用调色"})})]})]})},d7={light:0,exposure:0,contrast:0,highlights:0,shadows:0,whites:0,blacks:0,temperature:0,tint:0,vibrance:0,saturation:0,sharpness:0,clarity:0};function Xc(e){return Math.max(-100,Math.min(100,e))}function dle(e){return e>=0?1+e/100*1.5:1+e/100*.9}function hle(e,t,n,r,i,a,o,l,c,u,d,h,p,f){let b=e/255,g=t/255,y=n/255;const w=.299*b+.587*g+.114*y,v=r/100*.3+i/100*.5;b=Math.max(0,Math.min(1,b+v)),g=Math.max(0,Math.min(1,g+v)),y=Math.max(0,Math.min(1,y+v));const m=dle(a),z=.5;b=(b-z)*m+z,g=(g-z)*m+z,y=(y-z)*m+z;const C=l/100,I=Math.max(0,1-w*2)*C*.4;b=Math.max(0,Math.min(1,b+I)),g=Math.max(0,Math.min(1,g+I)),y=Math.max(0,Math.min(1,y+I));const R=o/100,O=Math.max(0,w*2-1)*R*.4;b=Math.max(0,Math.min(1,b+O)),g=Math.max(0,Math.min(1,g+O)),y=Math.max(0,Math.min(1,y+O));const F=u/100*.25;b=(b-F)/(1-F),g=(g-F)/(1-F),y=(y-F)/(1-F);const L=1-c/100*.25;b=b/L,g=g/L,y=y/L;const X=d/100*.15;b=Math.max(0,Math.min(1,b+X)),y=Math.max(0,Math.min(1,y-X));const T=h/100*.1;b=Math.max(0,Math.min(1,b+T)),g=Math.max(0,Math.min(1,g-T));const q=.299*b+.587*g+.114*y,H=1+f/100*.8,J=1+p/100*.6*(1-Math.abs(q-.5)*2),Z=H*J;return b=(b-q)*Z+q,g=(g-q)*Z+q,y=(y-q)*Z+q,[Math.round(Math.max(0,Math.min(255,b*255))),Math.round(Math.max(0,Math.min(255,g*255))),Math.round(Math.max(0,Math.min(255,y*255)))]}async function ple(e,t){const n={...d7,...t},r=Xc(n.light),i=Xc(n.exposure),a=Xc(n.contrast),o=Xc(n.highlights),l=Xc(n.shadows),c=Xc(n.whites),u=Xc(n.blacks),d=Xc(n.temperature??0),h=Xc(n.tint??0),p=Xc(n.vibrance??0),f=Xc(n.saturation??0),b=new Image;b.crossOrigin="anonymous",await new Promise((C,E)=>{b.onload=()=>C(),b.onerror=()=>E(new Error("图片加载失败")),b.src=e});const g=document.createElement("canvas");g.width=b.naturalWidth,g.height=b.naturalHeight;const y=g.getContext("2d");if(!y)throw new Error("Canvas 2D 不可用");y.drawImage(b,0,0);const w=y.getImageData(0,0,g.width,g.height),v=w.data;for(let C=0;C0||z!==0){const C=y.getImageData(0,0,g.width,g.height),E=C.data,I=g.width,R=g.height,A=(F,L)=>(L*I+F)*4,O=F=>Math.max(0,Math.min(255,Math.round(F)));if(m>0){const F=m/100*1.5,L=new Uint8ClampedArray(E.length);L.set(E);for(let X=1;X{const[p,f]=_.useState(e.activeLevel||"detail"),[b,g]=_.useState(e.radius||.05),[y,w]=_.useState(!1),[v,m]=_.useState(""),[z,C]=_.useState(e.mainLabel||""),[E,I]=_.useState(e.partLabel||""),[R,A]=_.useState(e.detailLabel||""),O=fr.useRef(!1);fr.useEffect(()=>{C(e.mainLabel||""),I(e.partLabel||""),A(e.detailLabel||"")},[e.mainLabel,e.partLabel,e.detailLabel]),fr.useEffect(()=>{f(e.activeLevel||"detail"),g(e.radius||.05)},[e.activeLevel,e.radius]);const F=_.useMemo(()=>{console.log("[MarkerEditPanel] All apiConfigs:",d);const Z=d.filter(B=>B.type==="Chat");return console.log("[MarkerEditPanel] Filtered Chat models:",Z),Z},[d]);_.useMemo(()=>{!v&&F.length>0&&m(F[0].id)},[F,v]);const L=async()=>{var B,V,N,j,k,W;if(!u){alert("无法分析:图片 URL 未提供");return}if(!v){alert("请选择一个 Chat 模型");return}const Z=F.find(M=>M.id===v);if(!Z){alert("未找到选中的模型配置");return}w(!0);try{const M=`请分析图片中坐标 (${e.x.toFixed(1)}%, ${e.y.toFixed(1)}%) 位置的内容。 + +请按照以下三个层级进行描述: +1. 整体层级:这张图片的主题是什么?(例如:平衡车、汽车、建筑物等) +2. 部件层级:标记点所在的部件是什么?(例如:座椅、车轮、窗户等) +3. 细节层级:标记点的具体细节是什么?(例如:红色锚点图案、金属螺丝、玻璃反光等) + +请以 JSON 格式返回,格式如下: +{ + "main": "整体描述", + "part": "部件描述", + "detail": "细节描述" +}`,Y=Z.key||h,se=(Z.url||"https://ai.comfly.chat").replace(/\/+$/,"");if(!Y)throw new Error("请先配置 API Key");console.log("[MarkerEditPanel] 发送分析请求:",{modelId:v,baseUrl:se,modelName:Z.modelName,prompt:M.substring(0,100)+"..."});let ie=u;if(!u.startsWith("data:"))try{const ue=await(await fetch(u)).blob();ie=await new Promise((U,G)=>{const te=new FileReader;te.onload=()=>U(te.result),te.onerror=G,te.readAsDataURL(ue)})}catch(me){console.warn("[MarkerEditPanel] 图片转 base64 失败,使用原始 URL:",me),ie=u}const oe=[{type:"image_url",image_url:{url:ie}},{type:"text",text:M}],re=await fetch(`${se}/v1/chat/completions`,{method:"POST",headers:{Authorization:`Bearer ${Y}`,"Content-Type":"application/json"},body:JSON.stringify({model:Z.modelName||"gemini-3-pro-preview",messages:[{role:"user",content:oe}],stream:!1})});if(!re.ok){const me=await re.text();throw console.error("[MarkerEditPanel] API 错误响应:",re.status,me),new Error(me||`API 错误: ${re.status}`)}const ee=await re.json();console.log("[MarkerEditPanel] 收到分析结果:",ee);let pe=null;if(ee.choices&&ee.choices.length>0?pe=(V=(B=ee.choices[0])==null?void 0:B.message)==null?void 0:V.content:ee.content?pe=ee.content:(W=(k=(j=(N=ee.data)==null?void 0:N.choices)==null?void 0:j[0])==null?void 0:k.message)!=null&&W.content&&(pe=ee.data.choices[0].message.content),!pe)throw new Error("API 返回空内容");console.log("[MarkerEditPanel] 提取的内容:",pe);let we;try{const me=pe.match(/\{[\s\S]*\}/);if(me)we=JSON.parse(me[0]);else throw new Error("响应中未找到 JSON 格式")}catch(me){console.warn("[MarkerEditPanel] JSON 解析失败,使用默认值:",me),we={main:e.mainLabel||"图片",part:"部件",detail:pe.substring(0,50)}}const Q={...e,mainLabel:we.main,partLabel:we.part,detailLabel:we.detail,label:p==="main"?we.main:p==="part"?we.part:we.detail,isAnalyzing:!1};i(Q)}catch(M){console.error("[MarkerEditPanel] AI 分析失败:",M),alert("AI 分析失败:"+M.message)}finally{w(!1)}},X=()=>{const Z=z||e.mainLabel||"图片",B=E||e.partLabel||"部件",V=R||e.detailLabel||"细节";i({...e,activeLevel:p,radius:b,mainLabel:z,partLabel:E,detailLabel:R,label:p==="main"?Z:p==="part"?B:V}),r()},T=Z=>{f(Z);const B=z||e.mainLabel||"图片",V=E||e.partLabel||"部件",N=R||e.detailLabel||"细节";i({...e,activeLevel:Z,radius:b,mainLabel:z,partLabel:E,detailLabel:R,label:Z==="main"?B:Z==="part"?V:N})},q=(Z,B)=>{i(Z==="main"?{...e,mainLabel:B,...p==="main"?{label:B}:{}}:Z==="part"?{...e,partLabel:B,...p==="part"?{label:B}:{}}:{...e,detailLabel:B,...p==="detail"?{label:B}:{}})},H=fr.useRef(null),J=(Z,B)=>{H.current&&clearTimeout(H.current),H.current=setTimeout(()=>{q(Z,B),H.current=null},80)};return s.jsxs("div",{className:`w-80 rounded-xl ${n?"bg-zinc-900 border border-white/30 shadow-none":"bg-white border border-zinc-200 shadow-2xl"}`,style:{pointerEvents:"auto"},children:[s.jsxs("div",{className:`flex items-center justify-between p-4 border-b ${n?"border-white/30":"border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:"px-2 py-1 rounded-full text-xs font-bold bg-blue-500 text-white",children:t.findIndex(Z=>Z.id===e.id)+1}),s.jsx("span",{className:`text-sm font-bold ${n?"text-white":"text-zinc-900"}`,children:"标记编辑"})]}),s.jsx("button",{onClick:r,className:`p-1 rounded-lg transition-colors ${n?"hover:bg-white/5 text-white":"hover:bg-zinc-100 text-zinc-600"}`,children:s.jsx("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"currentColor",children:s.jsx("path",{d:"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z"})})})]}),s.jsxs("div",{className:"p-4 space-y-4",onClick:Z=>Z.stopPropagation(),onMouseDown:Z=>Z.stopPropagation(),children:[s.jsxs("div",{className:`p-3 rounded-lg border ${n?"bg-transparent border-white/30":"bg-blue-50 border-blue-200"}`,children:[s.jsx("label",{className:`text-xs font-medium mb-2 block ${n?"text-zinc-300":"text-zinc-700"}`,children:"🤖 AI 智能分析"}),s.jsx("select",{value:v,onChange:Z=>m(Z.target.value),disabled:y,className:`marker-edit-select w-full px-3 py-2 rounded-lg text-sm mb-2 ${n?"bg-transparent border-white/30 text-white":"bg-white border-zinc-300 text-zinc-900"} border ${y?"opacity-50 cursor-not-allowed":""}`,children:F.length===0?s.jsx("option",{value:"",children:"未配置 Chat 模型"}):F.map(Z=>s.jsx("option",{value:Z.id,children:Z.modelName||Z.provider||Z.id},Z.id))}),s.jsx("button",{onClick:L,disabled:y||!v||!u,className:`w-full px-4 py-2.5 rounded-lg text-sm font-medium transition-colors flex items-center justify-center gap-2 border ${y||!v||!u?n?"bg-transparent border-white/20 cursor-not-allowed text-white/50":"bg-zinc-600 cursor-not-allowed text-zinc-400 border-zinc-600":n?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-black hover:bg-zinc-800 text-white border-black"}`,children:y?s.jsxs(s.Fragment,{children:[s.jsxs("svg",{className:"animate-spin h-4 w-4",viewBox:"0 0 24 24",children:[s.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4",fill:"none"}),s.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})]}),"分析中..."]}):s.jsxs(s.Fragment,{children:[s.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:s.jsx("path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"})}),"开始分析"]})}),s.jsx("div",{className:`text-[10px] mt-2 ${n?"text-zinc-500":"text-zinc-600"}`,children:"使用 AI 自动识别标记点的内容(整体/部件/细节)"})]}),s.jsxs("div",{children:[s.jsxs("label",{className:`text-xs font-medium mb-2 block ${n?"text-zinc-300":"text-zinc-700"}`,children:["标记层级 ",e.isAnalyzing&&s.jsx("span",{className:"text-blue-500",children:"(分析中...)"})]}),s.jsxs("div",{className:"flex gap-2",children:[s.jsx("button",{onClick:()=>T("main"),disabled:e.isAnalyzing,className:`flex-1 px-3 py-2 rounded-lg text-sm font-medium transition-colors border ${p==="main"?n?"bg-transparent border-white/50 text-white":"bg-black text-white border-black":n?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-zinc-100 hover:bg-zinc-200 text-zinc-700 border-zinc-300"} ${e.isAnalyzing?"opacity-50 cursor-not-allowed":""}`,children:"整体"}),s.jsx("button",{onClick:()=>T("part"),disabled:e.isAnalyzing,className:`flex-1 px-3 py-2 rounded-lg text-sm font-medium transition-colors border ${p==="part"?n?"bg-transparent border-white/50 text-white":"bg-black text-white border-black":n?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-zinc-100 hover:bg-zinc-200 text-zinc-700 border-zinc-300"} ${e.isAnalyzing?"opacity-50 cursor-not-allowed":""}`,children:"部件"}),s.jsx("button",{onClick:()=>T("detail"),disabled:e.isAnalyzing,className:`flex-1 px-3 py-2 rounded-lg text-sm font-medium transition-colors border ${p==="detail"?n?"bg-transparent border-white/50 text-white":"bg-black text-white border-black":n?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-zinc-100 hover:bg-zinc-200 text-zinc-700 border-zinc-300"} ${e.isAnalyzing?"opacity-50 cursor-not-allowed":""}`,children:"细节"})]})]}),s.jsxs("div",{className:"space-y-3",children:[s.jsxs("div",{children:[s.jsxs("label",{className:`text-xs font-medium mb-1 flex items-center gap-1 ${n?"text-zinc-300":"text-zinc-700"}`,children:[s.jsx("span",{className:`w-2 h-2 rounded-full ${p==="main"?"bg-blue-500":"bg-zinc-400"}`}),"整体层级"]}),s.jsx("input",{type:"text",value:z,onChange:Z=>{const B=Z.target.value;if(C(B),O.current){J("main",B);return}q("main",B)},onCompositionStart:()=>{O.current=!0},onCompositionUpdate:Z=>{J("main",Z.currentTarget.value)},onCompositionEnd:Z=>{O.current=!1,H.current&&clearTimeout(H.current),q("main",Z.currentTarget.value)},onBlur:Z=>{O.current&&(O.current=!1,H.current&&clearTimeout(H.current),q("main",Z.currentTarget.value))},onKeyDown:Z=>{Z.stopPropagation()},placeholder:"例如:平衡车、汽车、建筑物...",className:`w-full border rounded-lg px-3 py-2 text-sm ${n?"bg-transparent border-white/30 text-white placeholder-white/50":"bg-white border-zinc-300 text-zinc-900 placeholder-zinc-400"} ${p==="main"?n?"ring-2 ring-white/30":"ring-2 ring-blue-500/50":""}`})]}),s.jsxs("div",{children:[s.jsxs("label",{className:`text-xs font-medium mb-1 flex items-center gap-1 ${n?"text-zinc-300":"text-zinc-700"}`,children:[s.jsx("span",{className:`w-2 h-2 rounded-full ${p==="part"?"bg-blue-500":"bg-zinc-400"}`}),"部件层级"]}),s.jsx("input",{type:"text",value:E,onChange:Z=>{const B=Z.target.value;if(I(B),O.current){J("part",B);return}q("part",B)},onCompositionStart:()=>{O.current=!0},onCompositionUpdate:Z=>{J("part",Z.currentTarget.value)},onCompositionEnd:Z=>{O.current=!1,H.current&&clearTimeout(H.current),q("part",Z.currentTarget.value)},onBlur:Z=>{O.current&&(O.current=!1,H.current&&clearTimeout(H.current),q("part",Z.currentTarget.value))},onKeyDown:Z=>{Z.stopPropagation()},placeholder:"例如:座椅、车轮、窗户...",className:`w-full border rounded-lg px-3 py-2 text-sm ${n?"bg-transparent border-white/30 text-white placeholder-white/50":"bg-white border-zinc-300 text-zinc-900 placeholder-zinc-400"} ${p==="part"?n?"ring-2 ring-white/30":"ring-2 ring-blue-500/50":""}`})]}),s.jsxs("div",{children:[s.jsxs("label",{className:`text-xs font-medium mb-1 flex items-center gap-1 ${n?"text-zinc-300":"text-zinc-700"}`,children:[s.jsx("span",{className:`w-2 h-2 rounded-full ${p==="detail"?"bg-blue-500":"bg-zinc-400"}`}),"细节层级"]}),s.jsx("input",{type:"text",value:R,onChange:Z=>{const B=Z.target.value;if(A(B),O.current){J("detail",B);return}q("detail",B)},onCompositionStart:()=>{O.current=!0},onCompositionUpdate:Z=>{J("detail",Z.currentTarget.value)},onCompositionEnd:Z=>{O.current=!1,H.current&&clearTimeout(H.current),q("detail",Z.currentTarget.value)},onBlur:Z=>{O.current&&(O.current=!1,H.current&&clearTimeout(H.current),q("detail",Z.currentTarget.value))},onKeyDown:Z=>{Z.stopPropagation()},placeholder:"例如:红色锚点图案、金属螺丝...",className:`w-full border rounded-lg px-3 py-2 text-sm ${n?"bg-transparent border-white/30 text-white placeholder-white/50":"bg-white border-zinc-300 text-zinc-900 placeholder-zinc-400"} ${p==="detail"?n?"ring-2 ring-white/30":"ring-2 ring-blue-500/50":""}`})]}),s.jsx("div",{className:`text-[10px] ${n?"text-zinc-500":"text-zinc-600"}`,children:"💡 提示:修改后会实时保存,切换层级按钮可查看不同层级的标签"})]})]}),s.jsxs("div",{className:`flex gap-2 p-4 border-t ${n?"border-white/30":"border-zinc-200"}`,children:[s.jsx("button",{className:`flex-1 px-4 py-2.5 rounded-lg text-sm transition-colors font-medium border ${n?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-black hover:bg-zinc-800 text-white border-black"}`,onClick:X,children:"✓ 保存 (Ctrl+Enter)"}),s.jsx("button",{className:`px-4 py-2.5 rounded-lg text-sm transition-colors font-medium border ${n?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-zinc-100 hover:bg-zinc-200 text-zinc-700 border-zinc-300"}`,onClick:r,children:"✕ 取消 (Esc)"})]})]})},gle=({imageContent:e,imageMimeType:t,isDark:n,apiConfigs:r=[],globalApiKey:i="",onClose:a,onGenerated:o,savedState:l,onStateChange:c})=>{var te,ge;const[u,d]=_.useState((l==null?void 0:l.detectedRegions)||[]),[h,p]=_.useState((l==null?void 0:l.selectedRegions)||[]),[f,b]=_.useState(!1),[g,y]=_.useState(""),[w,v]=_.useState(1),[m,z]=_.useState({x:0,y:0}),[C,E]=_.useState(!1),[I,R]=_.useState(!1),[A,O]=_.useState({x:0,y:0}),F=_.useRef(null),L=_.useMemo(()=>r.filter(ne=>ne.type==="Chat"),[r]),[X,T]=_.useState(()=>{var le;return l!=null&&l.selectedLLMModel?l.selectedLLMModel:((le=r.filter(fe=>fe.type==="Chat")[0])==null?void 0:le.id)||""}),[q,H]=_.useState(!1),[J,Z]=_.useState(null),[B,V]=_.useState(null),[N,j]=_.useState(null),k=_.useRef(null),W=_.useRef(null),M=_.useRef(null),Y=_.useRef(null),se=_.useRef(null),ie=_.useRef({regionId:null,handle:null,startX:0,startY:0,startBbox:null}),oe=_.useRef(N),re=_.useRef(null),ee=_.useRef(!1);_.useEffect(()=>{oe.current=N},[N]),_.useEffect(()=>{if(!q)return;const ne=le=>{Y.current&&!Y.current.contains(le.target)&&H(!1)};return document.addEventListener("mousedown",ne),()=>document.removeEventListener("mousedown",ne)},[q]),_.useEffect(()=>{c&&c({detectedRegions:u,selectedRegions:h,selectedLLMModel:X})},[u,h,X]),_.useEffect(()=>{const ne=se.current;if(!ne)return;const le=fe=>{const be=k.current,de=be==null?void 0:be.parentElement,$e=fe.target;if(de&&de.contains($e)){fe.preventDefault(),fe.stopPropagation();const _e=fe.deltaY>0?-.1:.1;v(Ee=>Math.max(.05,Math.min(3,Ee+_e))),R(!0),F.current&&clearTimeout(F.current),F.current=setTimeout(()=>{F.current=null,R(!1)},150)}else fe.stopPropagation()};return ne.addEventListener("wheel",le,{passive:!1}),()=>{ne.removeEventListener("wheel",le),F.current&&clearTimeout(F.current)}},[]),_.useEffect(()=>{var de;const ne=(de=k.current)==null?void 0:de.parentElement;if(!ne)return;const le=$e=>{$e.button!==0||$e.target.closest("[data-text-region]")||($e.stopPropagation(),E(!0),O({x:$e.clientX-m.x,y:$e.clientY-m.y}),$e.preventDefault())},fe=$e=>{if(!C)return;$e.stopPropagation();const ze=$e.clientX-A.x,_e=$e.clientY-A.y;z({x:ze,y:_e})},be=$e=>{C&&$e.stopPropagation(),E(!1)};return ne.addEventListener("mousedown",le),document.addEventListener("mousemove",fe),document.addEventListener("mouseup",be),()=>{ne.removeEventListener("mousedown",le),document.removeEventListener("mousemove",fe),document.removeEventListener("mouseup",be)}},[C,A,m]),_.useEffect(()=>{B&&setTimeout(()=>{const ne=document.getElementById(`region-edit-${B}`);if(ne){ne.scrollIntoView({behavior:"smooth",block:"center"});const le=ne.querySelector("input");le&&(le.focus(),le.select())}},150)},[B]),_.useEffect(()=>{L.length>0&&!X&&T(L[0].id)},[L,X,r.length]);const pe=_.useCallback(async()=>{if(e.startsWith("data:")){const ne=e.split(",")[1];if(!ne)throw new Error("无效的 data URL 格式");return ne}if(e.startsWith("blob:"))try{const le=await(await fetch(e)).blob();return new Promise((fe,be)=>{const de=new FileReader;de.onloadend=()=>{const ze=de.result.split(",")[1];ze?fe(ze):be(new Error("无法转换 blob 为 base64"))},de.onerror=()=>be(new Error("读取 blob 失败")),de.readAsDataURL(le)})}catch(ne){throw new Error(`读取 blob URL 失败: ${ne}`)}return e},[e]),we=_.useCallback(async()=>{var ne,le,fe;try{const be=await pe();if(!be){alert("无法获取图片数据");return}const de=r.find(Te=>Te.id===X);if(!de){alert("请先选择 Chat 模型");return}const $e=de.key||i,ze=(de.url||"https://ai.comfly.chat").replace(/\/+$/,"");if(!$e){alert("请先配置 API Key");return}b(!0),y("正在识别文字...");const Ee=[{type:"text",text:`你是一个专业的OCR文字识别助手。请分析图片中的所有文字区域。 + +要求: +1. 识别图片中所有可见的文字 +2. 按完整语义单元分割(标题、句子、列表项等) +3. 返回每个文字区域的边界框坐标(相对坐标0-1) + +返回JSON格式: +{ + "regions": [ + { + "text": "识别出的文字", + "bbox": { "x": 0.1, "y": 0.1, "width": 0.3, "height": 0.08 } + } + ] +} + +注意: +- x, y 是左上角坐标(相对于图片宽高的比例,0-1之间) +- width, height 是区域宽高(相对于图片宽高的比例) +- 只返回JSON,不要其他文字`},{type:"image_url",image_url:{url:`data:${t||"image/png"};base64,${be}`}}],Ce={model:de.modelName,messages:[{role:"user",content:Ee}],max_tokens:16e3,temperature:.3,response_format:{type:"json_object"}};console.log("[TextEdit] 发送识别请求:",{model:de.modelName,baseUrl:ze,imageSize:be.length,mimeType:t});const xe=await fetch(`${ze}/v1/chat/completions`,{method:"POST",headers:{Authorization:`Bearer ${$e}`,"Content-Type":"application/json"},body:JSON.stringify(Ce)});if(!xe.ok){const Te=await xe.text();throw console.error("[TextEdit] 识别失败:",Te),new Error(`文字识别失败 (${xe.status}): ${Te}`)}const ve=(fe=(le=(ne=(await xe.json()).choices)==null?void 0:ne[0])==null?void 0:le.message)==null?void 0:fe.content;if(!ve)throw new Error("LLM未返回识别结果");console.log("[TextEdit] 识别结果:",ve);const ke=ve.match(/\{[\s\S]*\}/);if(!ke)throw new Error("无法解析识别结果");const Pe=(JSON.parse(ke[0]).regions||[]).map(Te=>{var Be,He,Je,Me;return{text:Te.text||"",bbox:{x:Number((Be=Te.bbox)==null?void 0:Be.x)||0,y:Number((He=Te.bbox)==null?void 0:He.y)||0,width:Number((Je=Te.bbox)==null?void 0:Je.width)||.1,height:Number((Me=Te.bbox)==null?void 0:Me.height)||.05}}});Pe.length===0?alert("未识别到文字区域"):(d(Pe),alert(`识别完成!共识别到 ${Pe.length} 个文字区域`))}catch(be){console.error("[TextEdit] 识别失败:",be),alert(`识别失败: ${be instanceof Error?be.message:"未知错误"}`)}finally{b(!1),y("")}},[pe,t,X,r,i]),Q=_.useCallback(ne=>{const le=u[ne];if(!le)return;const fe=h.findIndex(be=>Math.abs(be.originalBbox.x-le.bbox.x)<.001&&Math.abs(be.originalBbox.y-le.bbox.y)<.001);if(fe>=0){const be=h[fe];p(de=>de.filter(($e,ze)=>ze!==fe)),B===be.id&&V(null)}else{const be={id:`text_${Date.now()}_${ne}`,displayId:h.length+1,originalText:le.text,newText:le.text,bbox:{...le.bbox},originalBbox:{...le.bbox},isModified:!1};p(de=>[...de,be]),V(be.id)}},[u,h,B]),me=_.useCallback((ne,le)=>{p(fe=>fe.map(be=>be.id===ne?{...be,newText:le,isModified:le!==be.originalText}:be))},[]),ue=_.useCallback((ne,le)=>{p(fe=>fe.map(be=>be.id===ne?{...be,bbox:{...be.bbox,rotation:le}}:be))},[]),U=_.useCallback((ne,le,fe)=>{ne.stopPropagation(),ne.preventDefault();const be=h.find(de=>de.id===le);be&&(ie.current={regionId:le,handle:fe,startX:ne.clientX,startY:ne.clientY,startBbox:{...be.bbox}})},[h]);_.useEffect(()=>{const ne=fe=>{const{regionId:be,handle:de,startX:$e,startY:ze,startBbox:_e}=ie.current;!be||!de||!_e||!k.current||(re.current&&cancelAnimationFrame(re.current),re.current=requestAnimationFrame(()=>{const Ee=k.current;if(!Ee)return;const Ce=Ee.getBoundingClientRect(),xe=(fe.clientX-$e)/Ce.width,Ne=(fe.clientY-ze)/Ce.height;let ve={..._e};if(de==="rotate"){const ke=Ce.left+(_e.x+_e.width/2)*Ce.width,Ie=Ce.top+(_e.y+_e.height/2)*Ce.height,Pe=Math.atan2(fe.clientY-Ie,fe.clientX-ke)*(180/Math.PI);ve.rotation=Math.round(Pe+90)}else if(de==="move")ve.x=Math.max(0,Math.min(1-ve.width,_e.x+xe)),ve.y=Math.max(0,Math.min(1-ve.height,_e.y+Ne));else{if(de.includes("w")){const ke=Math.max(0,_e.x+xe);ve.width=Math.max(.02,_e.width-(ke-_e.x)),ve.x=ke}if(de.includes("e")&&(ve.width=Math.max(.02,Math.min(1-_e.x,_e.width+xe))),de.includes("n")){const ke=Math.max(0,_e.y+Ne);ve.height=Math.max(.02,_e.height-(ke-_e.y)),ve.y=ke}de.includes("s")&&(ve.height=Math.max(.02,Math.min(1-_e.y,_e.height+Ne)))}j({id:be,bbox:ve})}))},le=()=>{const{regionId:fe}=ie.current;re.current&&(cancelAnimationFrame(re.current),re.current=null);const be=oe.current;fe&&be&&be.id===fe&&p(de=>de.map($e=>$e.id===fe?{...$e,bbox:be.bbox}:$e)),ie.current={regionId:null,handle:null,startX:0,startY:0,startBbox:null},j(null),ee.current=!0,setTimeout(()=>{ee.current=!1},100)};return document.addEventListener("mousemove",ne),document.addEventListener("mouseup",le),()=>{document.removeEventListener("mousemove",ne),document.removeEventListener("mouseup",le),re.current&&cancelAnimationFrame(re.current)}},[]);const G=_.useCallback(()=>{const ne=h.filter(fe=>fe.isModified);if(ne.length===0){alert("请先修改文字内容");return}const le={originalImage:e,modifications:ne.map(fe=>({originalText:fe.originalText,newText:fe.newText,bbox:fe.bbox}))};o(JSON.stringify(le)),alert("文字修改数据已准备好,请连接到AI绘画节点生成图片"),a()},[h,e,o,a]);return s.jsxs("div",{className:`absolute inset-0 z-40 ${n?"bg-zinc-900":"bg-white"} rounded-xl overflow-hidden flex flex-col`,children:[s.jsxs("div",{className:`flex items-center justify-between p-4 border-b ${n?"border-zinc-700":"border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(M5,{size:20,className:n?"text-green-400":"text-green-600"}),s.jsx("h3",{className:`font-bold ${n?"text-white":"text-zinc-900"}`,children:"文字编辑"})]}),s.jsx("button",{onClick:a,className:`px-3 py-1 rounded ${n?"bg-zinc-800 hover:bg-zinc-700 text-white":"bg-zinc-200 hover:bg-zinc-300 text-zinc-900"}`,children:"关闭"})]}),s.jsxs("div",{ref:se,className:"flex-1 overflow-auto minimal-scrollbar p-4 space-y-4",children:[s.jsxs("div",{className:"space-y-2",children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsxs("span",{className:`text-sm ${n?"text-zinc-400":"text-zinc-600"}`,children:["图片缩放: ",Math.round(w*100),"% (滚轮缩放,左键拖动)"]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("button",{onClick:()=>{v(Math.max(.05,w-.25))},className:`px-3 py-1 rounded text-sm ${n?"bg-zinc-700 hover:bg-zinc-600 text-white":"bg-zinc-200 hover:bg-zinc-300 text-zinc-900"}`,children:"-"}),s.jsx("button",{onClick:()=>{v(1),z({x:0,y:0})},className:`px-3 py-1 rounded text-sm ${n?"bg-zinc-700 hover:bg-zinc-600 text-white":"bg-zinc-200 hover:bg-zinc-300 text-zinc-900"}`,children:"重置"}),s.jsx("button",{onClick:()=>{v(Math.min(3,w+.25))},className:`px-3 py-1 rounded text-sm ${n?"bg-zinc-700 hover:bg-zinc-600 text-white":"bg-zinc-200 hover:bg-zinc-300 text-zinc-900"}`,children:"+"})]})]}),s.jsx("div",{ref:W,className:"relative w-full overflow-hidden bg-black/10 rounded-lg",style:{minHeight:280,maxHeight:"52vh",cursor:C?"grabbing":"grab"},children:s.jsxs("div",{ref:k,className:"relative inline-block min-w-full",style:{transform:`scale(${w}) translate(${m.x/w}px, ${m.y/w}px)`,transformOrigin:"top left",width:`${100/w}%`,transition:C||I?"none":"transform 0.1s ease-out"},children:[s.jsx("img",{src:e,alt:"编辑图片",className:"w-full h-auto block",style:{pointerEvents:"none"},draggable:!1,onLoad:ne=>{const le=ne.currentTarget,fe=W.current;if(!fe||!le.naturalWidth||!le.naturalHeight)return;const be=(de=0)=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{const $e=fe.clientWidth,ze=fe.clientHeight;if($e<=0||ze<=0){de<4&&setTimeout(()=>be(de+1),80*(de+1));return}const _e=le.naturalWidth,Ee=le.naturalHeight,Ce=Math.min(1,ze*_e/($e*Ee));Ce>.05&&Ce<=1&&(v(Math.round(Ce*100)/100),z({x:0,y:0}))})})};be(0)}}),u.map((ne,le)=>{if(h.some(de=>Math.abs(de.originalBbox.x-ne.bbox.x)<.001&&Math.abs(de.originalBbox.y-ne.bbox.y)<.001))return null;const be=J===le;return s.jsxs("div",{"data-text-region":"true",className:`absolute cursor-pointer transition-all ${be?"border-4 border-white/80 bg-white/20":"border-4 border-red-500 bg-red-500/30 hover:border-white/60 hover:bg-white/15"}`,style:{left:`${ne.bbox.x*100}%`,top:`${ne.bbox.y*100}%`,width:`${ne.bbox.width*100}%`,height:`${ne.bbox.height*100}%`,minWidth:"40px",minHeight:"30px",pointerEvents:"auto",zIndex:100,position:"absolute",transform:ne.bbox.rotation?`rotate(${ne.bbox.rotation}deg)`:void 0,transformOrigin:"center center"},onMouseDown:de=>{de.preventDefault(),de.stopPropagation(),Q(le)},onClick:de=>{de.preventDefault(),de.stopPropagation(),Q(le)},onMouseEnter:()=>Z(le),onMouseLeave:()=>Z(null),title:ne.text,children:[be&&s.jsx("div",{className:"absolute -top-8 left-0 bg-black/90 text-white text-xs px-2 py-1 rounded whitespace-nowrap max-w-xs overflow-hidden text-ellipsis z-10",children:ne.text}),s.jsx("span",{className:"absolute -top-4 -left-1 bg-blue-500 text-white text-[10px] w-4 h-4 flex items-center justify-center rounded-full",children:le+1})]},`detected-${le}`)}),h.map(ne=>{const le=B===ne.id,fe=N&&N.id===ne.id?N.bbox:ne.bbox;return s.jsxs("div",{"data-text-region":"true",className:`absolute transition-all cursor-pointer ${le?"border-4 border-amber-400 bg-amber-400/30":"border-3 border-green-400 bg-green-400/20"}`,style:{left:`${fe.x*100}%`,top:`${fe.y*100}%`,width:`${fe.width*100}%`,height:`${fe.height*100}%`,minWidth:"40px",minHeight:"30px",transform:fe.rotation?`rotate(${fe.rotation}deg)`:void 0,transformOrigin:"center center"},onClick:()=>{ee.current||V(le?null:ne.id)},children:[s.jsx("div",{className:`absolute -top-8 left-0 text-white text-xs px-2 py-1 rounded whitespace-nowrap max-w-xs overflow-hidden text-ellipsis z-10 ${le?"bg-amber-600":"bg-green-600"}`,children:ne.newText||ne.originalText}),s.jsx("span",{className:`absolute -top-4 -left-1 text-white text-[10px] w-4 h-4 flex items-center justify-center rounded-full ${le?"bg-amber-500":"bg-green-500"}`,children:ne.displayId}),s.jsx("div",{className:"absolute inset-2 cursor-move",onMouseDown:be=>U(be,ne.id,"move")}),["nw","ne","sw","se"].map(be=>s.jsx("div",{className:`absolute w-3 h-3 rounded-full ${le?"bg-amber-400":"bg-green-400"} border-2 border-white cursor-${be}-resize`,style:{top:be.includes("n")?-6:"auto",bottom:be.includes("s")?-6:"auto",left:be.includes("w")?-6:"auto",right:be.includes("e")?-6:"auto"},onMouseDown:de=>U(de,ne.id,be)},be)),s.jsx("div",{className:`absolute w-3 h-3 rounded-full ${le?"bg-purple-500":"bg-purple-400"} border-2 border-white cursor-grab`,style:{top:-20,left:"50%",transform:"translateX(-50%)"},onMouseDown:be=>U(be,ne.id,"rotate"),title:"拖动旋转"})]},ne.id)})]})})]}),s.jsxs("div",{ref:M,className:`p-4 rounded-lg ${n?"bg-zinc-800":"bg-zinc-100"}`,children:[s.jsxs("h4",{className:`font-bold mb-2 ${n?"text-white":"text-zinc-900"}`,children:["已选中的文字 (",h.length,")"]}),h.length===0?s.jsx("p",{className:`text-sm ${n?"text-zinc-400":"text-zinc-600"}`,children:u.length>0?"点击图片选择要修改的文字":"请先识别文字"}):s.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-3 overflow-y-auto minimal-scrollbar",style:{maxHeight:"300px"},children:h.map(ne=>{const le=B===ne.id;return s.jsxs("div",{id:`region-edit-${ne.id}`,className:`p-3 rounded-lg transition-all ${le?n?"bg-amber-900/30 border-2 border-amber-500":"bg-amber-100 border-2 border-amber-400":n?"bg-zinc-700":"bg-white"}`,onClick:()=>V(ne.id),children:[s.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[s.jsx("span",{className:`px-2 py-1 rounded-full text-xs font-bold ${le?"bg-amber-500 text-white":"bg-green-500 text-white"}`,children:ne.displayId}),s.jsxs("label",{className:`text-xs font-medium truncate flex-1 ${n?"text-zinc-300":"text-zinc-700"}`,title:ne.originalText,children:["原文: ",ne.originalText]})]}),s.jsx("input",{type:"text",value:ne.newText,onChange:fe=>me(ne.id,fe.target.value),onClick:fe=>{fe.stopPropagation(),V(ne.id)},className:`w-full px-2 py-1.5 rounded text-sm ${n?"bg-zinc-600 text-white":"bg-zinc-50 text-zinc-900"} border-2 ${ne.isModified?"border-orange-400":n?"border-zinc-500":"border-zinc-300"} focus:outline-none focus:ring-2 focus:ring-amber-400`,placeholder:"输入新文字"}),s.jsxs("div",{className:"flex items-center gap-1 mt-2",children:[s.jsx("label",{className:`text-[10px] ${n?"text-zinc-400":"text-zinc-600"} whitespace-nowrap`,children:"旋转:"}),s.jsx("input",{type:"range",min:"-180",max:"180",value:ne.bbox.rotation||0,onChange:fe=>ue(ne.id,Number(fe.target.value)),className:"flex-1 h-1"}),s.jsx("input",{type:"number",min:"-180",max:"180",value:ne.bbox.rotation||0,onChange:fe=>ue(ne.id,Number(fe.target.value)),className:`w-12 px-1 py-0.5 rounded text-[10px] ${n?"bg-zinc-600 text-white":"bg-zinc-50 text-zinc-900"} border ${n?"border-zinc-500":"border-zinc-300"}`}),s.jsx("span",{className:`text-[10px] ${n?"text-zinc-400":"text-zinc-600"}`,children:"°"})]}),ne.isModified&&s.jsx("p",{className:"text-[10px] text-orange-500 mt-1",children:"✓ 已修改"})]},ne.id)})})]}),s.jsxs("div",{className:`p-4 rounded-lg ${n?"bg-zinc-800/60 border border-zinc-600/30":"bg-zinc-100"}`,children:[s.jsx("h4",{className:`font-bold mb-2 ${n?"text-white":"text-zinc-900"}`,children:"模型配置"}),s.jsx("div",{className:"space-y-2",children:s.jsxs("div",{children:[s.jsx("label",{className:`text-sm ${n?"text-zinc-400":"text-zinc-600"} block mb-1`,children:"Chat 模型(用于文字识别)"}),s.jsxs("div",{className:"relative",ref:Y,children:[s.jsxs("button",{type:"button",onClick:()=>H(ne=>!ne),onMouseDown:ne=>ne.stopPropagation(),className:`w-full flex items-center justify-between px-3 py-2 rounded border text-left outline-none focus:outline-none focus:ring-0 transition-colors ${n?"bg-zinc-800/40 text-zinc-300 border-zinc-600/30 hover:bg-zinc-700/40":"bg-white text-zinc-900 border-zinc-300 hover:bg-zinc-50"}`,children:[s.jsx("span",{className:"truncate",children:L.length>0&&X?((te=L.find(ne=>ne.id===X))==null?void 0:te.provider)||((ge=L.find(ne=>ne.id===X))==null?void 0:ge.modelName)||X:"请选择模型"}),s.jsx(Ei,{size:14,className:`flex-shrink-0 transition-transform ${q?"rotate-180":""}`})]}),q&&s.jsx("div",{className:`absolute top-full left-0 right-0 mt-1 rounded border p-1 z-[110] max-h-56 overflow-y-auto ${n?"bg-black border-zinc-600 text-zinc-200":"bg-white border-zinc-300 shadow-lg text-zinc-900"}`,onMouseDown:ne=>ne.stopPropagation(),children:L.length>0?L.map(ne=>s.jsx("button",{type:"button",onClick:()=>{T(ne.id),H(!1)},onMouseDown:le=>le.stopPropagation(),className:`w-full flex items-center justify-between px-2 py-1.5 rounded text-left text-sm transition-colors ${n?"bg-transparent hover:bg-zinc-800 text-zinc-200":"bg-transparent hover:bg-zinc-100 text-zinc-900"} ${ne.id===X?n?"bg-zinc-800/80":"bg-zinc-100":""}`,children:ne.provider||ne.modelName||ne.id},ne.id)):s.jsx("div",{className:"px-2 py-1.5 text-sm text-zinc-500",children:"请先在设置中配置 Chat 模型"})})]})]})})]}),s.jsxs("div",{className:"space-y-2",children:[L.length===0&&s.jsx("div",{className:`p-4 rounded-lg ${n?"bg-yellow-900/20 border-yellow-700":"bg-yellow-100 border-yellow-300"} border`,children:s.jsx("p",{className:`text-sm ${n?"text-yellow-300":"text-yellow-800"}`,children:'⚠️ 请先在"模型接口配置"中添加至少一个 Chat 模型(如 Gemini、GPT-4o、Claude 等)'})}),s.jsx("button",{onClick:we,disabled:f||!X,className:`w-full px-4 py-2 rounded flex items-center justify-center gap-2 ${n?"bg-zinc-700 hover:bg-zinc-600 disabled:bg-zinc-800 disabled:text-zinc-500 text-zinc-200 border border-zinc-600/30":"bg-blue-500 hover:bg-blue-600 disabled:bg-zinc-600 text-white"}`,children:f?s.jsxs(s.Fragment,{children:[s.jsx(zr,{size:18,className:"animate-spin"}),g||"正在识别..."]}):u.length>0?"重新识别文字":"开始识别文字"}),s.jsx("button",{onClick:G,disabled:h.filter(ne=>ne.isModified).length===0,className:`w-full px-4 py-2 rounded flex items-center justify-center gap-2 ${n?"bg-zinc-700 hover:bg-zinc-600 disabled:bg-zinc-800 disabled:text-zinc-500 text-zinc-200 border border-zinc-600/30":"bg-green-500 hover:bg-green-600 disabled:bg-zinc-600 text-white"}`,children:"输出修改数据"})]})]})]})},jE=[{r:255,g:0,b:0,zh:"红色"},{r:255,g:220,b:0,zh:"黄色"},{r:0,g:120,b:255,zh:"蓝色"}];function xle(e,t){return(e.r-t.r)**2+(e.g-t.g)**2+(e.b-t.b)**2}function ble(e){let t=jE[0],n=1/0;for(const r of jE){const i=xle(e,r);i{const d=_.useRef(null),h=_.useRef(null),p=_.useRef(null),f=_.useRef(t);f.current=t;const[b,g]=_.useState([]),[y,w]=_.useState(!1),[v,m]=_.useState(!1),[z,C]=_.useState(a??vle),[E,I]=_.useState(o??wle),[R,A]=_.useState({w:0,h:0}),[O,F]=_.useState(1),L=_.useRef(null);_.useEffect(()=>{p.current=null;const B=new Image;B.crossOrigin="anonymous",B.onload=()=>{p.current=B,A({w:B.naturalWidth,h:B.naturalHeight})},B.onerror=()=>{p.current=null,A({w:0,h:0})},B.src=e},[e]);const X=_.useCallback(B=>{const V=d.current;if(!V||R.w===0)return null;const N=V.getBoundingClientRect(),j=B.clientX-N.left,k=B.clientY-N.top,W=j/N.width*R.w,M=k/N.height*R.h;return W<0||W>R.w||M<0||M>R.h?null:{x:W,y:M}},[R]),T=_.useCallback(B=>{var k,W;B.preventDefault(),B.stopPropagation(),(W=(k=B.target).setPointerCapture)==null||W.call(k,B.pointerId);const V=X(B);if(!V)return;w(!0),L.current=V;const j={points:[V],width:v?E:c??z,isEraser:v};i==="red-composite"&&!v&&(j.markRgb={r:u.r,g:u.g,b:u.b}),g(M=>[...M,j])},[X,v,E,z,c,i,u]),q=_.useCallback(B=>{if(!y)return;B.preventDefault();const V=X(B);if(!V)return;const N=L.current;N&&(Math.abs(V.x-N.x)>.5||Math.abs(V.y-N.y)>.5)&&g(j=>{const k=j[j.length-1];return k?(L.current=V,[...j.slice(0,-1),{...k,points:[...k.points,V]}]):j})},[y,X]),H=_.useCallback(B=>{var V,N;(N=(V=B.target).releasePointerCapture)==null||N.call(V,B.pointerId),w(!1),L.current=null},[]);_.useEffect(()=>{const B=()=>{w(!1),L.current=null};return window.addEventListener("mouseup",B),()=>window.removeEventListener("mouseup",B)},[]),_.useEffect(()=>{const B=d.current,V=p.current;if(!B||!V||R.w===0)return;const N=B.getContext("2d");if(N){if((B.width!==R.w||B.height!==R.h)&&(B.width=R.w,B.height=R.h),N.clearRect(0,0,R.w,R.h),N.drawImage(V,0,0),i==="red-composite"){const j=R.w,k=R.h,W=document.createElement("canvas");W.width=j,W.height=k;const M=W.getContext("2d");M&&(M.lineCap="round",M.lineJoin="round",b.forEach(Y=>{if(M.beginPath(),Y.points.forEach((se,ie)=>ie===0?M.moveTo(se.x,se.y):M.lineTo(se.x,se.y)),M.lineWidth=Y.width,Y.isEraser)M.globalCompositeOperation="destination-out",M.strokeStyle="rgba(0, 0, 0, 1)",M.stroke(),M.globalCompositeOperation="source-over";else{M.globalCompositeOperation="source-over";const se=Y.markRgb??u;M.strokeStyle=CE(se,.85),M.stroke()}})),N.drawImage(W,0,0);return}N.lineCap="round",N.lineJoin="round",b.forEach(j=>{N.strokeStyle=j.isEraser?"black":"white",N.lineWidth=j.width,N.beginPath(),j.points.forEach((k,W)=>W===0?N.moveTo(k.x,k.y):N.lineTo(k.x,k.y)),N.stroke()})}},[R,b,i,u]);const J=_.useCallback(async()=>{const{w:B,h:V}=R;if(B===0||V===0)return;const N=document.createElement("canvas");N.width=B,N.height=V;const j=N.getContext("2d");if(!j)return;if(j.fillStyle="black",j.fillRect(0,0,B,V),j.lineCap="round",j.lineJoin="round",b.forEach(ie=>{j.strokeStyle=ie.isEraser?"black":"white",j.lineWidth=ie.width,j.beginPath(),ie.points.forEach((oe,re)=>re===0?j.moveTo(oe.x,oe.y):j.lineTo(oe.x,oe.y)),j.stroke()}),i==="mask-png"){N.toBlob(ie=>{ie&&f.current(ie)},"image/png",.95);return}if(i==="red-composite"){const ie=p.current;if(!ie||ie.naturalWidth===0)return;const oe=document.createElement("canvas");oe.width=B,oe.height=V;const re=oe.getContext("2d");if(!re)return;re.drawImage(ie,0,0,B,V);const ee=document.createElement("canvas");ee.width=B,ee.height=V;const pe=ee.getContext("2d");if(!pe)return;pe.lineCap="round",pe.lineJoin="round";const we=yle(b);b.forEach(Q=>{if(pe.beginPath(),Q.points.forEach((me,ue)=>ue===0?pe.moveTo(me.x,me.y):pe.lineTo(me.x,me.y)),pe.lineWidth=Q.width,Q.isEraser)pe.globalCompositeOperation="destination-out",pe.strokeStyle="rgba(0, 0, 0, 1)",pe.stroke(),pe.globalCompositeOperation="source-over";else{pe.globalCompositeOperation="source-over";const me=Q.markRgb??u;pe.strokeStyle=CE(me,.92),pe.stroke()}}),re.drawImage(ee,0,0),oe.toBlob(Q=>{Q&&f.current(Q,{markColorNamesZh:we})},"image/png",.95);return}const k=j.getImageData(0,0,B,V),W=document.createElement("canvas");W.width=B,W.height=V;const M=W.getContext("2d");if(!M)return;const Y=new Image;Y.crossOrigin="anonymous",await new Promise((ie,oe)=>{Y.onload=()=>{M.drawImage(Y,0,0),ie()},Y.onerror=oe,Y.src=e});const se=M.getImageData(0,0,B,V);for(let ie=0;ie{ie&&f.current(ie)},"image/png",.95)},[e,R,b,i,u]);_.useEffect(()=>{l==="canvas-only"&&(y||b.length&&J())},[l,y,b,J]);const Z=_.useCallback(()=>g([]),[]);return l==="canvas-only"?s.jsx("div",{ref:h,className:"w-full h-full overflow-hidden",children:s.jsx("div",{className:"w-full h-full select-none touch-none",style:{width:"100%",height:"100%"},children:s.jsx("canvas",{ref:d,width:R.w,height:R.h,className:"w-full h-full touch-none cursor-crosshair",style:{display:"block"},onPointerDown:T,onPointerMove:q,onPointerUp:H,onPointerLeave:H,onContextMenu:B=>B.preventDefault()})})}):s.jsxs("div",{className:`flex flex-col ${r?"bg-zinc-900 text-white":"bg-zinc-50 text-zinc-900"}`,children:[s.jsxs("div",{className:`p-3 border-b ${r?"border-white/30":"border-zinc-700/50"} flex items-center justify-between gap-2 flex-wrap`,children:[s.jsx("span",{className:"text-xs text-zinc-500",children:"白色笔触 = 修改区域(蒙版格式:白=修改,黑=保留)"}),s.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[s.jsxs("button",{type:"button",onClick:()=>m(!1),className:`flex items-center gap-1 px-2 py-1 rounded text-xs ${r?v?"border border-white/30 text-zinc-500 hover:bg-white/5 hover:text-white":"border border-white/50 bg-transparent text-white":v?"":"bg-zinc-600"}`,children:[s.jsx(R5,{size:14}),"画笔"]}),s.jsxs("button",{type:"button",onClick:()=>m(!0),className:`flex items-center gap-1 px-2 py-1 rounded text-xs ${r?v?"border border-white/50 bg-transparent text-white":"border border-white/30 text-zinc-500 hover:bg-white/5 hover:text-white":v?"bg-zinc-600":""}`,children:[s.jsx(gb,{size:14}),"橡皮"]}),s.jsxs("button",{type:"button",onClick:Z,className:`flex items-center gap-1 px-2 py-1 rounded text-xs ${r?"border border-white/30 hover:bg-white/5 hover:text-white text-zinc-500":"hover:bg-zinc-600"}`,children:[s.jsx(P5,{size:14}),"清空"]}),s.jsxs("div",{className:`flex items-center gap-2 border-l ${r?"border-white/15":"border-zinc-600"} pl-2`,children:[s.jsx("span",{className:"text-[10px] text-zinc-400",children:"笔刷"}),s.jsx("input",{type:"range",min:6,max:120,step:1,value:z,onChange:B=>C(Number(B.target.value)),className:"w-20 h-1.5 accent-zinc-500"}),s.jsx("span",{className:"text-[10px] min-w-[2rem] text-right text-zinc-400",children:Math.round(z)})]}),s.jsxs("div",{className:`flex items-center gap-2 border-l ${r?"border-white/15":"border-zinc-600"} pl-2`,children:[s.jsx("button",{type:"button",onClick:()=>F(B=>Math.max(c_,B-NE)),disabled:O<=c_,className:`p-1 rounded ${r?"hover:bg-white/5":"hover:bg-zinc-600"} disabled:opacity-40`,title:"缩小",children:s.jsx(GP,{size:14})}),s.jsx("input",{type:"range",min:c_*100,max:u_*100,value:O*100,onChange:B=>F(Number(B.target.value)/100),className:"w-20 h-1.5 accent-zinc-500"}),s.jsx("button",{type:"button",onClick:()=>F(B=>Math.min(u_,B+NE)),disabled:O>=u_,className:`p-1 rounded ${r?"hover:bg-white/5":"hover:bg-zinc-600"} disabled:opacity-40`,title:"放大",children:s.jsx(Lw,{size:14})}),s.jsxs("span",{className:"text-xs min-w-[2.5rem] text-center",children:[Math.round(O*100),"%"]})]})]})]}),s.jsx("div",{ref:h,className:"flex-1 overflow-auto p-4 flex items-start justify-center min-h-[360px]",style:{maxHeight:560},children:s.jsx("div",{className:"inline-block select-none touch-none",style:{transform:`scale(${O})`,transformOrigin:"top left",width:R.w,height:R.h},children:s.jsx("canvas",{ref:d,width:R.w,height:R.h,className:`cursor-crosshair border touch-none ${r?"border-white/20":"border-zinc-600/50"}`,style:{display:"block"},onPointerDown:T,onPointerMove:q,onPointerUp:H,onPointerLeave:H,onContextMenu:B=>B.preventDefault()})})}),s.jsxs("div",{className:`p-3 border-t ${r?"border-white/30":"border-zinc-700/50"} flex justify-end gap-2`,children:[s.jsx("button",{type:"button",onClick:n,className:`px-3 py-1.5 text-sm rounded border ${r?"border-white/30 hover:bg-white/5":"border-zinc-600 hover:bg-zinc-700"}`,children:"取消"}),s.jsx("button",{type:"button",onClick:J,className:"px-3 py-1.5 text-sm rounded bg-green-600 hover:bg-green-500 text-white",children:"保存并替换图片"})]})]})};function _le(e){try{const[t,n]=e.split(","),r=t==null?void 0:t.match(/data:([^;]+)/),i=(r==null?void 0:r[1])||"image/jpeg",a=atob(n||""),o=new Uint8Array(a.length);for(let l=0;l{try{let r=t;if(t.startsWith("http://")||t.startsWith("https://")){const l=await fetch(t);if(!l.ok)return;const c=await l.blob();if(!c.type.startsWith("image/"))return;r=await new Promise((u,d)=>{const h=new FileReader;h.onload=()=>u(h.result),h.onerror=()=>d(h.error),h.readAsDataURL(c)})}await zi.storeWithThumbnails(e,r);const i=await zi.getPreview(e);if(!i)return;const{localCacheManager:a}=await mn(async()=>{const{localCacheManager:l}=await Promise.resolve().then(()=>Xa);return{localCacheManager:l}},void 0,import.meta.url);a.isAvailable()&&await a.saveThumbnail(e,i,"preview");const o=_le(i);if(o){await Xr.saveBlobAsset(`${e}_thumbnail`,o,"");const l=await Xr.getAssetUrl(`${e}_thumbnail`);l&&n(c=>c.map(u=>u.id===e?{...u,thumbnailUrl:l,_thumbnailAssetId:`${e}_thumbnail`}:u))}}catch(r){console.warn("[scheduleHistoryThumbnailSave] 缩略图保存失败:",r)}})()}const js=G5("InputImageNode"),EE="input_image_last_dir",IE=["nano-banana","nano-banana-2","gemini-3.1-flash-image-preview","gpt-image","gpt-image-1.5"],$le={"nano-banana":"Nano Banana","nano-banana-2":"Nano Banana Pro","gemini-3.1-flash-image-preview":"Nano Banana 2","gpt-image":"GPT-4o Image","gpt-image-1.5":"GPT Image 1.5"},Ag={red:{r:255,g:0,b:0},yellow:{r:255,g:220,b:0},blue:{r:0,g:120,b:255}},U1={markColorNamesZh:["红色"]};function Sle(e){const t=e.filter(Boolean),n=t[0]||"红色";return t.length<=1?`基于原图帮我去除${n}区域,然后自然补缺${n}区域,让整体风格保持一致,只去除涂抹区域就行,其他地方不用修改`:`基于原图帮我去除图中${t.join("、")}等颜色标记区域,然后自然补缺这些标记区域,让整体风格保持一致,只去除涂抹区域就行,其他地方不用修改`}const jle=2*1024*1024,Cle=({node:e,isDark:t,updateNode:n,viewZoom:r,view:i,canvasRef:a,renderQuality:o="high",setInputImageContextMenu:l,setLightboxItem:c,setLightboxOpen:u,nodes:d,connections:h,setNodes:p,setConnections:f,setSelectedNodeId:b,generateId:g,apiConfigs:y=[],globalApiKey:w="",setHistory:v,isCompactMode:m=!1,onCompactModeImageClick:z})=>{var Vt,Zt,Sn,jn,_n,Cn,Kn,Xn,$r,Tr,kr,Rr,sr,mt,It,tn,cn,zn,Rn;const[C,E]=_.useState(!1),[I,R]=_.useState(!1),[A,O]=_.useState(!0),[F,L]=_.useState(!1),[X,T]=_.useState(!1),[q,H]=_.useState(!1),[J,Z]=_.useState(!1),[B,V]=_.useState(!1),[N,j]=_.useState(!1),[k,W]=_.useState(!1),[M,Y]=_.useState(null),[se,ie]=_.useState(()=>({...U1})),[oe,re]=_.useState("red"),[ee,pe]=_.useState(32),[we,Q]=_.useState(""),[me,ue]=_.useState("Auto"),[U,G]=_.useState(!1),[te,ge]=_.useState(null),[ne,le]=_.useState(!1),[fe,be]=_.useState(null),[de,$e]=_.useState(!1),[ze,_e]=_.useState(!1),[Ee,Ce]=_.useState(!1),[xe,Ne]=_.useState(!1),[ve,ke]=_.useState(null),[Ie,Pe]=_.useState(null),[Te,Be]=_.useState({width:0,height:0}),[He,Je]=_.useState({width:0,height:0}),[Me,Re]=_.useState(null),Ve=_.useRef(null),Ze=_.useRef(null),je=_.useRef(null),Le=_.useRef(null),Xe=_.useRef(null),qe=_.useRef(new Map),tt=20,Ye=_.useRef(null),ct=_.useRef(null),pt=_.useRef(null),ht=_.useRef(null),wt=!!((Vt=e.settings)!=null&&Vt.disableThumbnailCreationOnImport),$t=_.useMemo(()=>{var bn;const bt=(bn=e.settings)==null?void 0:bn._assetId;return bt?[bt]:void 0},[e.settings]),{content:jt,isLoading:Nt}=Ul(e.content,{shouldLoadContent:!0,nodeType:"input-image",preferConstantDisplay:!0,usePreview:!0,disableThumbnailStoreWrites:wt,blobRecoveryAssetIds:$t,onBlobUrlRecovered:bt=>n(e.id,{content:bt})}),Yt=jt,un=Ie??Yt,Tn=((Zt=e.settings)==null?void 0:Zt.colorAdjustOriginal)||Yt,Ht=_.useMemo(()=>{const bt=un;if(!(bt!=null&&bt.startsWith("data:image"))||bt.length<=2*1024*1024)return bt;const bn=qe.current.get(bt);if(bn)return bn;const An=Hd(bt);if(qe.current.set(bt,An),qe.current.size>tt){const Vn=qe.current.keys().next().value;Vn&&qe.current.delete(Vn)}return An},[un]),fn=_.useMemo(()=>{const bt=Tn;return!(bt!=null&&bt.startsWith("data:image"))||bt.length<=2*1024*1024?bt:Hd(bt)},[Tn]);_.useEffect(()=>{if(e.content&&e.content===ct.current){ct.current=null;return}ct.current=null,Pe(null)},[e.content]),_.useEffect(()=>()=>{for(const bt of qe.current.values())try{URL.revokeObjectURL(bt)}catch{}qe.current.clear()},[]),_.useEffect(()=>{if(!ze&&Ye.current){const bt=Ye.current;Ye.current=null,n(e.id,{width:bt.width,height:bt.height})}},[ze,e.id,n]);const Dn=e.markers||[],it=_.useCallback(bt=>{n(e.id,{markers:bt})},[e.id,n]),Lt=_.useCallback(bt=>{console.log("[InputImageNode] handleMarkerEdit called:",{markerId:bt,currentEditingMarkerId:fe,currentIsMarkerEditOpen:ne}),be(bt),le(!0)},[fe,ne]),gt=_.useCallback(bt=>{const bn=Dn.map(An=>An.id===bt.id?bt:An);it(bn)},[Dn,it]),Jt=_.useCallback(bt=>{if(!fe)return;const bn=Dn.map(An=>{if(An.id===fe){let Vn=An.label;return bt==="main"?Vn=An.mainLabel||e.nodeName||"图片":bt==="part"?Vn=An.partLabel||"部件":bt==="detail"&&(Vn=An.detailLabel||"细节"),{...An,activeLevel:bt,label:Vn}}return An});it(bn)},[fe,Dn,it,e.nodeName]),Wt=_.useCallback(bt=>{n(e.id,{settings:{...e.settings,textEditState:bt}})},[e.id,e.settings,n]);_.useEffect(()=>{if(!X)return;const bt=An=>{const Vn=An.target;Ze.current&&Ze.current.contains(Vn)||(T(!1),js.debug("Clicked outside node, exiting marker mode"))},bn=setTimeout(()=>{document.addEventListener("mousedown",bt)},100);return()=>{clearTimeout(bn),document.removeEventListener("mousedown",bt)}},[X]),_.useEffect(()=>{if(!q)return;const bt=An=>{const Vn=An.target;Ze.current&&Ze.current.contains(Vn)||H(!1)},bn=setTimeout(()=>document.addEventListener("mousedown",bt),100);return()=>{clearTimeout(bn),document.removeEventListener("mousedown",bt)}},[q]),_.useEffect(()=>{const bt=new CustomEvent("cropSelectModeChange",{detail:q?e.id:null});return window.dispatchEvent(bt),()=>{q&&window.dispatchEvent(new CustomEvent("cropSelectModeChange",{detail:null}))}},[q,e.id]),_.useEffect(()=>{J&&(L(!1),$e(!1),T(!1),_e(!1),H(!1))},[J]);const Pt=_.useMemo(()=>{const bn=y.filter(An=>An.type==="Image").filter(An=>IE.includes(An.id));return IE.map(An=>bn.find(Vn=>Vn.id===An)).filter(Boolean)},[y]);_.useEffect(()=>{if(!J||we)return;const bt=Pt.find(bn=>bn.id==="nano-banana-2")||Pt[0];bt!=null&&bt.id&&Q(bt.id)},[J,Pt,we]);const Bt=_.useCallback(bt=>bt.provider||bt.modelName||$le[bt.id]||bt.id||"",[]),zt=_.useCallback(async(bt,bn)=>{if(!Yt)throw new Error("没有图片内容");const An=y.find(Ut=>Ut.id===we&&Ut.type==="Image");if(!An)throw new Error("未找到可用的图片模型配置");const Vn=An.key||w;if(!Vn)throw new Error("请先配置 API Key");const Sr=(An.url||"").replace(/\/+$/,"");if(!Sr)throw new Error("未配置模型 API 地址");const Ir=Sle(bn),Wr=new FormData;Wr.append("model",An.modelName||An.id||we),Wr.append("prompt",Ir),Wr.append("n","1"),Wr.append("response_format","url"),Wr.append("aspect_ratio","Auto"),me&&me!=="Auto"&&Wr.append("image_size",me),Wr.append("image",bt,"composite.png");const ir=`${Sr}/v1/images/edits?async=true`,Yn=await Pl(ir,{method:"POST",headers:{Authorization:`Bearer ${Vn}`},body:Wr});if(!Yn.ok){const Ut=await Yn.text();throw new Error(`API 请求失败: ${Yn.status} - ${Ut}`)}const Zn=await Yn.json(),Ke=Zn.data,Et=(Ke==null?void 0:Ke.id)??Zn.task_id??(Ke==null?void 0:Ke.task_id)??Zn.id;if(Et){const Ut=Bn=>Bn<20?800:Bn<50?1500:3e3;for(let Bn=0;Bn<200;Bn++){Bn>0&&await new Promise(nr=>setTimeout(nr,Ut(Bn-1)));const Nr=`${Sr}/v1/images/tasks/${Et}`,vr=await(await Pl(Nr,{headers:{Authorization:`Bearer ${Vn}`}})).json(),gr=L5(vr);if(gr==="COMPLETED"||gr==="SUCCESS"||gr==="SUCCEEDED"||gr==="FINISHED"||gr==="DONE"){const nr=Wx(vr,!1,!1);if(nr.length>0){const tr=nr[0],jr=new Image;return jr.src=tr,await new Promise((Br,_r)=>{jr.onload=()=>Br(),jr.onerror=()=>_r(new Error("图片加载失败"))}),{url:tr,width:jr.naturalWidth,height:jr.naturalHeight}}}if(gr==="FAILED"||gr==="ERROR")throw new Error(B5(vr,gr)||"擦除任务失败")}throw new Error("擦除轮询超时")}const Gn=Wx(Zn,!1,!1);if(Gn.length>0){const Ut=Gn[0],Bn=new Image;return Bn.src=Ut,await new Promise((Nr,br)=>{Bn.onload=()=>Nr(),Bn.onerror=()=>br(new Error("图片加载失败"))}),{url:Ut,width:Bn.naturalWidth,height:Bn.naturalHeight}}throw new Error("未获取到擦除结果")},[Yt,we,me,y,w]),Gt=_.useCallback(async()=>{if(!M||U)return;if(!p||!f||!g){ge("无法创建预览节点,请刷新画布后重试");return}const bt=M,bn=[...se.markColorNamesZh];G(!0),ge(null);const An=g(),Vn=e.x+e.width+80,Sr=e.y,Ir=Bt(y.find(Yn=>Yn.id===we)||{id:we}),Wr=Date.now(),ir=Ms(An,"preview",Vn,Sr,"智能擦除",{eraserModelId:we,eraserModelName:Ir,eraserResolution:me},d||[]);ir._expandPending=!0,ir._expandTaskStartTime=Wr,p(Yn=>[...Yn,ir]),f(Yn=>[...Yn,{id:g(),from:e.id,to:An}]);try{const{url:Yn,width:Zn,height:Ke}=await zt(bt,bn),Et=g(),Gn={id:Et,type:"image",url:Yn,prompt:"智能擦除",time:new Date().toLocaleTimeString(),status:"completed",progress:100,modelName:Bt(y.find(Bn=>Bn.id===we)||{id:we})},Ut=await Ln.storeImageUrlAsRef(Yn);v&&v(Bn=>[Gn,...Bn]),v&&zle(Et,Yn,v),p(Bn=>Bn.map(Nr=>Nr.id===An?{...Nr,content:Ut,previewType:"image",_expandPending:void 0,_expandTaskStartTime:void 0,settings:{...Nr.settings,eraserModelId:we,eraserModelName:Bt(y.find(br=>br.id===we)||{id:we}),eraserResolution:me},width:Math.max(150,Math.min(Zn||300,400)),height:Math.max(150,Math.min(Ke||300,400))}:Nr)),Y(null),ie({...U1}),V(!1),Z(!1)}catch(Yn){const Zn=Yn instanceof Error?Yn.message:String(Yn);ge(Zn),p(Ke=>Ke.map(Et=>Et.id===An?{...Et,_expandPending:void 0,_expandTaskStartTime:void 0}:Et))}finally{G(!1)}},[M,se.markColorNamesZh,U,p,f,g,e.id,e.x,e.y,e.width,d,zt,Bt,y,we,me,v]);_.useEffect(()=>{if(!je.current)return;const bt=()=>{if(je.current){const An=je.current.getBoundingClientRect();Be({width:An.width,height:An.height})}};bt(),window.addEventListener("resize",bt);const bn=new ResizeObserver(bt);return bn.observe(je.current),()=>{window.removeEventListener("resize",bt),bn.disconnect()}},[Yt]),_.useEffect(()=>{if(!Ze.current)return;const bt=new IntersectionObserver(bn=>{bn.forEach(An=>{O(An.isIntersecting)})},{threshold:.1,rootMargin:"50px"});return bt.observe(Ze.current),()=>{bt.disconnect()}},[]);const qt=((Sn=e.settings)==null?void 0:Sn.multiAngle)||{rotation:0,tilt:0,scale:1,isActive:!1},De=((jn=e.settings)==null?void 0:jn.lighting)||{direction:"front",hardness:"soft",brightness:80,color:"#ffffff",isActive:!1},st=_.useMemo(()=>!d||!h?!1:d.some(bt=>bt.type==="canvas-node"&&h.some(bn=>bn.from===e.id&&bn.to===bt.id)),[e.id,d,h]),Ae=_.useCallback(()=>{if(!d||!h||!p||!f||!b){console.warn("[InputImageNode] 缺少必要的 props 来创建画板节点");return}const bt=g||ns,bn=d.find(ir=>ir.type==="canvas-node"&&h.some(Yn=>Yn.from===e.id&&Yn.to===ir.id));if(bn){b(bn.id);return}const An=bt(),Vn=Ms(An,"canvas-node",e.x+e.width+100,e.y,void 0,void 0,d),Sr={strokes:[],maskStrokes:[],textElements:[],images:[],backgroundColor:"transparent",aspectRatio:"1:1",width:Vn.width,height:Vn.height,sourceImageUrl:e.content||void 0};Vn.settings={...Vn.settings,canvasData:Sr},p(ir=>[...ir,Vn]);const Wr={id:bt(),from:e.id,to:An};f(ir=>[...ir,Wr]),b(An)},[e.id,e.x,e.y,e.width,e.content,d,h,p,f,b,g]),nt=_.useCallback(bt=>{n(e.id,{settings:{...e.settings,multiAngle:bt}})},[e.id,e.settings,n]),_t=_.useCallback(bt=>{n(e.id,{settings:{...e.settings,lighting:bt}})},[e.id,e.settings,n]),xt=_.useCallback(bt=>{n(e.id,{settings:{...e.settings,multiAngle:bt}});const bn=new CustomEvent("multiAngleUpdated",{detail:{nodeId:e.id,config:bt}});window.dispatchEvent(bn),console.log("[InputImageNode] 角度配置已确认:",bt)},[e.id,e.settings,n]);_.useEffect(()=>{const bt=An=>{const Vn=An.target;Ze.current&&Ze.current.contains(Vn)||I&&(js.debug("Click outside node, deselecting"),R(!1))},bn=An=>{const Vn=An.detail.nodeId;Vn!==e.id&&I&&(js.debug(`Another node selected (${Vn}), deselecting this node`),R(!1))};return document.addEventListener("mousedown",bt),window.addEventListener("inputImageNodeSelected",bn),()=>{document.removeEventListener("mousedown",bt),window.removeEventListener("inputImageNodeSelected",bn)}},[I,e.id]),_.useEffect(()=>{if(!de)return;const bt=bn=>{const{nodeId:An,settings:Vn,prompt:Sr}=bn.detail;if(An!==e.id)return;console.log("[InputImageNode] 灯光已确定:",{nodeId:e.id,lightingSettings:Vn,prompt:Sr}),$e(!1);const Ir=new CustomEvent("inputImageLightingUpdated",{detail:{nodeId:e.id,lightingSettings:Vn,prompt:Sr,timestamp:Date.now()}});window.dispatchEvent(Ir)};return window.addEventListener("lightingConfirmed",bt),()=>{window.removeEventListener("lightingConfirmed",bt)}},[e.id,de]);const Tt=((_n=e.settings)==null?void 0:_n.mediaType)||(Yt!=null&&Yt.startsWith("data:video")?"video":Yt!=null&&Yt.startsWith("data:audio")?"audio":Yt!=null&&Yt.match(/\.(mp4|webm|ogg|mov)$/i)?"video":Yt!=null&&Yt.match(/\.(mp3|wav|ogg|m4a|aac)$/i)?"audio":"image"),St=Tt==="audio",Qe=Tt==="video",Ue=Tt==="image",Ge=(Cn=e.settings)==null?void 0:Cn.hasCustomSize;_.useEffect(()=>{if(Ge||!Yt||!Ue&&!Qe)return;const bt=e.content;if(!(bt!==Xe.current))return;if(Xe.current=bt??null,Ue){const Vn=new Image;Vn.onload=()=>{const Sr=Vn.naturalWidth,Ir=Vn.naturalHeight;Je({width:Sr,height:Ir}),An(Sr,Ir)},Vn.onerror=()=>{console.error("[InputImageNode] 无法加载图片以获取尺寸")},Vn.src=Ht||Yt}else if(Qe){const Vn=document.createElement("video");Vn.onloadedmetadata=()=>{const Sr=Vn.videoWidth,Ir=Vn.videoHeight;Je({width:Sr,height:Ir}),An(Sr,Ir)},Vn.onerror=()=>{console.error("[InputImageNode] 无法加载视频以获取尺寸")},Vn.src=Yt}function An(Vn,Sr){const Ir=Vn/Sr,ir=Ir>=.85&&Ir<=1/.85?260:440,Yn=800,Zn=150;let Ke,Et;Ir>=1?(Ke=ir,Et=Math.round(ir/Ir)):(Et=ir,Ke=Math.round(ir*Ir));const Gn=Math.max(Ke,Et),Ut=Math.min(Ke,Et);if(Gn>Yn){const Bn=Yn/Gn;Ke=Math.round(Ke*Bn),Et=Math.round(Et*Bn)}else if(Ut{if(!Yt||!Ue){Re(null);return}if(o==="low"){Re(null);return}if(o==="high"){Re(null);return}if(wt){Re(null);return}const bt=typeof e.content=="string"&&Ln.isContentRef(e.content)?Ln.extractId(e.content):e.id;let bn=!1;return(async()=>{try{if(zi.hasThumbnail(bt)){const Vn=await zi.getThumbnail(bt);!bn&&Vn&&Re(Vn);return}if(Yt.startsWith("data:image")&&Yt.length>30*1024&&(await zi.storeWithThumbnails(bt,Yt),!bn)){const Vn=await zi.getThumbnail(bt);Vn&&Re(Vn)}}catch{}})(),()=>{bn=!0}},[e.id,e.content,Yt,Ue,o,wt]);const at=_.useCallback(async()=>{if(!Yt||!Qe||!p||!f||!g)return;j(!0);let bt=null;try{const{url:bn,revoke:An}=await qv(Yt);bt=An;const Vn=document.createElement("video");Vn.muted=!0,Vn.playsInline=!0,Vn.crossOrigin=bn.startsWith("http")?"anonymous":null,await new Promise((Nr,br)=>{Vn.onloadedmetadata=()=>Nr(),Vn.onerror=()=>br(Vn.error),Vn.src=bn});const Sr=Vn.duration||0;Vn.remove();const Ir=Math.max(0,Sr-.05),[Wr,ir]=await Promise.all([fm(bn,0,{preserveOriginal:!0,quality:.95}),fm(bn,Ir,{preserveOriginal:!0,quality:.95})]),Yn=e.width??300,Zn=e.height??200,Ke=24,Et=g(),Gn=g(),Ut=Ms(Et,"input-image",e.x+Yn+Ke,e.y,"首帧",{mediaType:"image"},d||[]),Bn=Ms(Gn,"input-image",e.x+Yn+Ke*2+Yn,e.y,"尾帧",{mediaType:"image"},d||[]);p(Nr=>[...Nr,{...Ut,content:Wr,width:Yn,height:Zn},{...Bn,content:ir,width:Yn,height:Zn}]),b==null||b(Et)}catch(bn){js.error("提取视频首尾帧失败",bn),console.error("[InputImageNode] 提取视频首尾帧失败:",bn)}finally{bt==null||bt(),j(!1)}},[Yt,Qe,e,p,f,g,d,b]),rt=_.useCallback(async()=>{if(!Yt||!Qe||!p||!f||!g)return;const bt=pt.current,bn=bt!=null&&Number.isFinite(bt.currentTime)?bt.currentTime:0;j(!0);let An=null;try{const{url:Vn,revoke:Sr}=await qv(Yt);An=Sr;const Ir=await fm(Vn,bn,{preserveOriginal:!0,quality:.95}),Wr=e.width??300,ir=e.height??200,Yn=24,Zn=g(),Ke=Ms(Zn,"input-image",e.x+Wr+Yn,e.y,"当前帧",{mediaType:"image"},d||[]);p(Et=>[...Et,{...Ke,content:Ir,width:Wr,height:ir}]),b==null||b(Zn)}catch(Vn){js.error("提取视频当前帧失败",Vn),console.error("[InputImageNode] 提取视频当前帧失败:",Vn)}finally{An==null||An(),j(!1)}},[Yt,Qe,e,p,f,g,d,b]);_.useEffect(()=>{if(!k)return;const bt=bn=>{const An=ht.current;An&&!An.contains(bn.target)&&W(!1)};return document.addEventListener("pointerdown",bt),()=>document.removeEventListener("pointerdown",bt)},[k]),_.useEffect(()=>{const bt=async bn=>{var Sr;if(!I){js.debug("Node not selected, ignoring paste");return}js.debug("Paste event detected, isSelected:",I);const An=(Sr=bn.clipboardData)==null?void 0:Sr.items;if(!An){js.debug("No clipboard items");return}js.debug("Clipboard items count:",An.length);let Vn=!1;for(let Ir=0;Ir{var Ut;js.debug("File loaded successfully, type:",Yn);const{extractNodeNameFromFileName:Et}=await mn(async()=>{const{extractNodeNameFromFileName:Bn}=await Promise.resolve().then(()=>Sp);return{extractNodeNameFromFileName:Bn}},void 0,import.meta.url),Gn=Et(ir.name);n(e.id,{content:(Ut=Ke.target)==null?void 0:Ut.result,nodeName:Gn,settings:{...e.settings,mediaType:Yn,disableThumbnailCreationOnImport:!0,hasCustomSize:void 0,imageSize:void 0}})},Zn.onerror=Ke=>{js.error("FileReader error:",Ke)},Zn.readAsDataURL(ir),bn.preventDefault(),bn.stopPropagation(),Vn=!0;break}}if(!Vn){js.debug("No file found in clipboard items, trying text/plain");for(let Ir=0;Ir{if(js.debug("Clipboard text:",ir),ir&&ir.match(/\.(mp3|wav|ogg|m4a|aac|flac|mp4|webm|mov|avi|mkv|jpg|jpeg|png|gif|webp)$/i)){js.debug("Detected file path in clipboard:",ir);try{const Zn=await(await fetch(ir.startsWith("file://")?ir:`file://${ir}`)).blob(),Ke=ir.toLowerCase().split(".").pop()||"";let Et="image";["mp4","webm","ogg","mov","avi","mkv","flv"].includes(Ke)?Et="video":["mp3","wav","ogg","m4a","aac","flac"].includes(Ke)&&(Et="audio");const Gn=new FileReader;Gn.onload=Ut=>{var Bn;js.debug("File loaded from path, type:",Et),n(e.id,{content:(Bn=Ut.target)==null?void 0:Bn.result,settings:{...e.settings,mediaType:Et,disableThumbnailCreationOnImport:!0,hasCustomSize:void 0,imageSize:void 0}})},Gn.readAsDataURL(Zn)}catch(Yn){js.error("Failed to load file from path:",Yn)}}});break}}}};return window.addEventListener("paste",bt),()=>window.removeEventListener("paste",bt)},[e.id,e.settings,n,I]);const lt=async bt=>{var Ir,Wr;bt.preventDefault(),bt.stopPropagation(),E(!1);const bn=bt.dataTransfer.getData("application/json");if(bn)try{const ir=JSON.parse(bn);if(ir.type==="history-item"&&ir.item){js.debug("History item dropped:",ir.item);let Yn=ir.item.url;try{if(ir.item.url&&ir.item.url.startsWith("blob:")){const Et=await(await fetch(ir.item.url)).blob();Yn=URL.createObjectURL(Et)}else Yn=ir.item.url}catch(Ke){js.error("Failed to create blob copy, using original URL:",Ke),Yn=ir.item.url}const Zn=((Wr=(Ir=ir.item.prompt)==null?void 0:Ir.split(` +`)[0])==null?void 0:Wr.substring(0,20))||e.nodeName||"图片";if(n(e.id,{content:Yn,nodeName:Zn,settings:{...e.settings,mediaType:ir.item.type||"image",_blobUrl:Yn,hasCustomSize:void 0,imageSize:void 0}}),(ir.item.type||"image")==="image"&&(Yn.startsWith("data:image")||Yn.startsWith("blob:"))){const Ke=Yn.startsWith("data:image")?Hd(Yn):Yn,Et=new Image;Et.onload=()=>{if(Ke!==Yn&&Ke.startsWith("blob:"))try{URL.revokeObjectURL(Ke)}catch{}const Gn=Et.naturalWidth,Ut=Et.naturalHeight,Bn=Gn/Ut,br=Bn>=.85&&Bn<=1/.85?260:320,vr=600,gr=150;let nr=Bn>=1?br:Math.round(br*Bn),tr=Bn>=1?Math.round(br/Bn):br;const jr=Math.max(nr,tr),Br=Math.min(nr,tr);if(jr>vr){const _r=vr/jr;nr=Math.round(nr*_r),tr=Math.round(tr*_r)}else if(Br{n(e.id,{width:nr,height:tr,settings:{...e.settings,imageSize:`${Gn}×${Ut}`,hasCustomSize:void 0}})})},Et.src=Ke}js.debug("Node updated with history item");return}}catch(ir){js.error("Failed to parse history item data:",ir)}const An=bt.dataTransfer.files[0];if(!An){js.warn("No file in drop event");return}if(js.debug("File dropped:",An.name,An.type,An.size),An.type.startsWith("image/")||/\.(jpg|jpeg|png|gif|webp|bmp|svg)$/i.test(An.name))try{const{extractNodeNameFromFileName:ir}=await mn(async()=>{const{extractNodeNameFromFileName:Ke}=await Promise.resolve().then(()=>Sp);return{extractNodeNameFromFileName:Ke}},void 0,import.meta.url),Yn=ir(An.name);let Zn=null;try{const Ke=await Bl();if(An.size>jle||Ke.shouldUseRust){const Ut=An.size>10485760?1920:2560;Zn=`data:image/jpeg;base64,${await Mm("process_image",An,{maxDimension:Ut,maxSize:2*1024*1024,quality:.85})}`,js.debug(`Image processed via Rust pipeline (maxDim: ${Ut})`)}}catch(Ke){js.warn("[InputImageNode] Rust image processing failed, fallback to FileReader:",Ke)}if(Zn||(Zn=await new Promise((Ke,Et)=>{const Gn=new FileReader;Gn.onload=Ut=>{var Bn;Ke((Bn=Ut.target)==null?void 0:Bn.result)},Gn.onerror=Ut=>{js.error("FileReader error for image:",Ut),Et(Ut)},Gn.readAsDataURL(An)})),n(e.id,{content:Zn,nodeName:Yn,settings:{...e.settings,mediaType:"image",disableThumbnailCreationOnImport:!0,hasCustomSize:void 0,imageSize:void 0}}),Zn.startsWith("data:image")){const Ke=Hd(Zn),Et=new Image;Et.onload=()=>{if(Ke!==Zn)try{URL.revokeObjectURL(Ke)}catch{}const Gn=Et.naturalWidth,Ut=Et.naturalHeight,Bn=Gn/Ut,br=Bn>=.85&&Bn<=1/.85?260:320,vr=600,gr=150;let nr,tr;Bn>=1?(nr=br,tr=Math.round(br/Bn)):(tr=br,nr=Math.round(br*Bn));const jr=Math.max(nr,tr),Br=Math.min(nr,tr);if(jr>vr){const Ur=vr/jr;nr=Math.round(nr*Ur),tr=Math.round(tr*Ur)}else if(Br{n(_r,{width:nr,height:tr,settings:es})})},Et.onerror=()=>{js.warn("[InputImageNode] Drop: image load failed for size calc")},Et.src=Ke}return}catch(ir){js.error("[InputImageNode] Failed to handle dropped image file:",ir)}const Sr=new FileReader;Sr.onload=async ir=>{var Gn;let Yn="image";if(An.type.startsWith("video/"))Yn="video";else if(An.type.startsWith("audio/"))Yn="audio";else if(An.type.startsWith("image/"))Yn="image";else{const Ut=An.name.toLowerCase().split(".").pop()||"";["mp4","webm","ogg","mov","avi","mkv","flv"].includes(Ut)?Yn="video":["mp3","wav","ogg","m4a","aac","flac"].includes(Ut)?Yn="audio":["jpg","jpeg","png","gif","webp","bmp","svg"].includes(Ut)&&(Yn="image")}js.debug("Detected media type:",Yn);const{extractNodeNameFromFileName:Zn}=await mn(async()=>{const{extractNodeNameFromFileName:Ut}=await Promise.resolve().then(()=>Sp);return{extractNodeNameFromFileName:Ut}},void 0,import.meta.url),Ke=Zn(An.name),Et=(Gn=ir.target)==null?void 0:Gn.result;if(n(e.id,{content:Et,nodeName:Ke,settings:{...e.settings,mediaType:Yn,hasCustomSize:void 0,imageSize:void 0}}),Yn==="image"&&Et.startsWith("data:image")){const Ut=Hd(Et),Bn=new Image;Bn.onload=()=>{if(Ut!==Et)try{URL.revokeObjectURL(Ut)}catch{}const Nr=Bn.naturalWidth,br=Bn.naturalHeight,vr=Nr/br,nr=vr>=.85&&vr<=1/.85?260:320,tr=600,jr=150;let Br,_r;vr>=1?(Br=nr,_r=Math.round(nr/vr)):(_r=nr,Br=Math.round(nr*vr));const es=Math.max(Br,_r),Ur=Math.min(Br,_r);if(es>tr){const os=tr/es;Br=Math.round(Br*os),_r=Math.round(_r*os)}else if(Urn(zs,{width:Br,height:_r,settings:Ts}))},Bn.onerror=()=>js.warn("[InputImageNode] Drop(FileReader): image load failed"),Bn.src=Ut}},Sr.onerror=ir=>{js.error("FileReader error:",ir)},Sr.readAsDataURL(An)},ot=async bt=>{var Vn;const bn=(Vn=bt.target.files)==null?void 0:Vn[0];if(!bn)return;const An=new FileReader;An.onload=async Sr=>{var Ke;let Ir="image";bn.type.startsWith("video/")?Ir="video":bn.type.startsWith("audio/")?Ir="audio":bn.type.startsWith("image/")&&(Ir="image");const{extractNodeNameFromFileName:Wr}=await mn(async()=>{const{extractNodeNameFromFileName:Et}=await Promise.resolve().then(()=>Sp);return{extractNodeNameFromFileName:Et}},void 0,import.meta.url),ir=Wr(bn.name),Yn=(Ke=Sr.target)==null?void 0:Ke.result,Zn={content:Yn,nodeName:ir,settings:{...e.settings,mediaType:Ir,hasCustomSize:void 0,imageSize:void 0,colorAdjust:void 0,colorAdjustOriginal:void 0,colorAdjustHideCompare:void 0}};if(Ir==="video"&&(Zn.videoFileName=bn.name),n(e.id,Zn),Ir==="image"&&Yn.startsWith("data:image")){const Et=Hd(Yn),Gn=new Image;Gn.onload=()=>{if(Et!==Yn)try{URL.revokeObjectURL(Et)}catch{}const Ut=Gn.naturalWidth,Bn=Gn.naturalHeight,Nr=Ut/Bn,vr=Nr>=.85&&Nr<=1/.85?260:320,gr=600,nr=150;let tr,jr;Nr>=1?(tr=vr,jr=Math.round(vr/Nr)):(jr=vr,tr=Math.round(vr*Nr));const Br=Math.max(tr,jr),_r=Math.min(tr,jr);if(Br>gr){const es=gr/Br;tr=Math.round(tr*es),jr=Math.round(jr*es)}else if(_r{var bn;if(typeof window<"u"&&"__TAURI__"in window)try{const{open:An}=await mn(async()=>{const{open:Ke}=await Promise.resolve().then(()=>L0);return{open:Ke}},void 0,import.meta.url),{invoke:Vn}=await mn(async()=>{const{invoke:Ke}=await Promise.resolve().then(()=>tf);return{invoke:Ke}},void 0,import.meta.url),Sr=typeof localStorage<"u"?localStorage.getItem(EE):void 0,Ir=await An({multiple:!1,directory:!1,title:"选择图片",defaultPath:Sr||void 0,filters:[{name:"图片",extensions:["png","jpg","jpeg","gif","webp","bmp"]}]});if(!Ir||typeof Ir!="string")return;const Wr=Ir;try{const Ke=Wr.replace(/[/\\][^/\\]+$/,"");Ke&&Ke!==Wr&&localStorage.setItem(EE,Ke)}catch{}const ir=await Vn("read_file_as_base64",{filePath:Wr});if(!ir)return;const{extractNodeNameFromFileName:Yn}=await mn(async()=>{const{extractNodeNameFromFileName:Ke}=await Promise.resolve().then(()=>Sp);return{extractNodeNameFromFileName:Ke}},void 0,import.meta.url),Zn=Yn(Wr.split(/[/\\]/).pop()||"");if(n(e.id,{content:ir,nodeName:Zn||e.nodeName,_localFilePath:Wr,settings:{...e.settings,mediaType:"image",hasCustomSize:void 0,imageSize:void 0,colorAdjust:void 0,colorAdjustOriginal:void 0,colorAdjustHideCompare:void 0}}),ir.startsWith("data:image")){const Ke=Hd(ir),Et=new Image;Et.onload=()=>{if(Ke!==ir)try{URL.revokeObjectURL(Ke)}catch{}const Gn=Et.naturalWidth,Ut=Et.naturalHeight,Bn=Gn/Ut,br=Bn>=.85&&Bn<=1/.85?260:320,vr=600,gr=150;let nr,tr;Bn>=1?(nr=br,tr=Math.round(br/Bn)):(tr=br,nr=Math.round(br*Bn));const jr=Math.max(nr,tr),Br=Math.min(nr,tr);if(jr>vr){const _r=vr/jr;nr=Math.round(nr*_r),tr=Math.round(tr*_r)}else if(Br{zi.storeWithThumbnails(e.id,ir).catch(()=>{})},500)}}catch(An){js.warn("[InputImageNode] handleChangeImage failed:",An)}else(bn=Ve.current)==null||bn.click()},[e.id,e.settings,e.nodeName,n]),kt=_.useCallback(async bt=>{var Vn;if(bt&&(bt.preventDefault(),bt.stopPropagation()),!e.content){js.warn("No content to display");return}if(!c||!u){js.error("setLightboxItem or setLightboxOpen is not available");return}let bn;if(Ln.isContentRef(e.content))try{const Sr=Ln.extractId(e.content);bn=await Ln.get(Sr)||Yt||""}catch(Sr){js.error("Resolve content_ref for lightbox failed:",Sr),bn=Yt||""}else bn=Ue?Ht||Yt||"":Yt||"";if(!bn){js.warn("No URL for lightbox");return}const An={id:e.id,url:bn,type:St?"audio":Qe?"video":"image",title:((Vn=e.settings)==null?void 0:Vn.musicTitle)||void 0,prompt:e.prompt||""};try{c(An),u(!0)}catch(Sr){js.error("Error calling setLightboxItem/setLightboxOpen:",Sr)}},[e.id,e.content,e.settings,e.prompt,Yt,Ht,St,Qe,Ue,c,u]),Ot=St?"audio/*,.mp3,.wav,.ogg,.m4a,.aac,.flac":Qe?"video/*,.mp4,.webm,.mov,.avi,.mkv,.flv,.ogg":"image/*,.jpg,.jpeg,.png,.gif,.webp,.bmp,.svg,video/*,.mp4,.webm,.mov,.avi,.mkv,.flv,.ogg,audio/*,.mp3,.wav,.ogg,.m4a,.aac,.flac",dn=St?"选择音频":Qe?"选择视频":"选择文件";return s.jsxs("div",{ref:Ze,"data-node-id":e.id,"data-node-type":e.type,className:`relative w-full h-full pointer-events-auto drop-zone rounded-xl ${Yt?"":`flex flex-col items-center justify-center ${t?"bg-zinc-900":"bg-zinc-100"}`} ${C?t?"ring-2 ring-white/40":"ring-2 ring-blue-500":""}`,style:{pointerEvents:"auto"},onMouseDown:bt=>{js.debug("Node mousedown, setting selected to true"),R(!0);const bn=new CustomEvent("inputImageNodeSelected",{detail:{nodeId:e.id}});window.dispatchEvent(bn)},onContextMenu:bt=>{Yt&&(bt.preventDefault(),bt.stopPropagation(),l({visible:!0,x:bt.clientX,y:bt.clientY,nodeId:e.id}))},onDrop:lt,onDragOver:bt=>{bt.preventDefault(),bt.stopPropagation(),E(!0)},onDragEnter:bt=>{bt.preventDefault(),bt.stopPropagation(),E(!0)},onDragLeave:bt=>{bt.preventDefault(),bt.stopPropagation(),bt.currentTarget.contains(bt.relatedTarget)||E(!1)},onClick:bt=>{js.debug("Node clicked, isSelected:",I),m&&Yt&&!bt.ctrlKey&&!bt.metaKey&&!X&&!C&&(z==null||z(e.id),bt.stopPropagation())},onDoubleClick:bt=>{js.debug("Root level double click event triggered"),Yt&&!X?(js.debug("Node has content, calling handleDoubleClick"),bt.preventDefault(),bt.stopPropagation(),kt(bt)):js.debug("Node has no content or in marker mode, ignoring double click")},children:[Nt&&s.jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-black/50 z-10",children:s.jsx(zr,{className:"w-8 h-8 animate-spin text-blue-500"})}),Yt&&s.jsx("div",{className:`absolute left-1/2 -translate-x-1/2 z-[120] transition-all duration-150 ${I?"opacity-100 translate-y-0 scale-100":"opacity-0 -translate-y-1 scale-[0.98] pointer-events-none"}`,style:{top:"-96px"},onClick:bt=>bt.stopPropagation(),onMouseDown:bt=>bt.stopPropagation(),children:s.jsx("div",{className:`input-node-fast-tooltip ${t?"input-node-fast-tooltip--dark":"input-node-fast-tooltip--light"} flex items-center overflow-hidden rounded-full border ${t?"bg-black border-white/10":"bg-white border-black/10"}`,children:s.jsxs("div",{className:"flex items-center",children:[s.jsx("div",{className:"w-11 h-11 flex items-center justify-center",children:s.jsx(Qoe,{rotation:qt.rotation,tilt:qt.tilt,isVisible:A,isDark:t,onClick:()=>{L(!F),F||($e(!1),T(!1),_e(!1),Z(!1))}})}),s.jsx("div",{className:`${t?"bg-white/10":"bg-black/10"} w-px h-6`}),s.jsx("button",{className:`w-11 h-11 flex items-center justify-center transition-colors ${st?t?"text-white bg-white/10":"text-blue-600 bg-blue-500/10":t?"text-zinc-200 hover:bg-white/10":"text-zinc-700 hover:bg-black/5"}`,"data-toolbar-active":st?"true":"false",onClick:()=>Ae(),"data-tip":st?"打开画板节点":"创建画板节点",children:s.jsx(T5,{size:18})}),s.jsx("div",{className:`${t?"bg-white/10":"bg-black/10"} w-px h-6`}),s.jsx("button",{className:`w-11 h-11 flex items-center justify-center transition-colors ${X?t?"text-white bg-white/12":"text-blue-600 bg-blue-500/10":t?"text-zinc-200 hover:bg-white/10":"text-zinc-700 hover:bg-black/5"}`,"data-toolbar-active":X?"true":"false",onClick:()=>{T(!X),X||(L(!1),$e(!1),_e(!1),Z(!1))},"data-tip":X?"退出标记模式":"标记模式",children:s.jsx(mx,{size:18})}),s.jsx("div",{className:`${t?"bg-white/10":"bg-black/10"} w-px h-6`}),s.jsx("button",{className:`w-11 h-11 flex items-center justify-center transition-colors ${q?t?"text-white bg-white/12":"text-blue-600 bg-blue-500/10":t?"text-zinc-200 hover:bg-white/10":"text-zinc-700 hover:bg-black/5"}`,"data-toolbar-active":q?"true":"false",onClick:()=>{H(!q),q||(L(!1),$e(!1),T(!1),_e(!1),Z(!1))},"data-tip":q?"退出框选":"框选裁剪区域(连到裁剪局部重绘节点)",children:s.jsx(ml,{size:18})}),Qe&&p&&f&&g&&s.jsxs(s.Fragment,{children:[s.jsx("div",{className:`${t?"bg-white/10":"bg-black/10"} w-px h-6`}),s.jsxs("div",{className:"relative flex items-center",ref:ht,children:[s.jsx("button",{type:"button",className:`w-11 h-11 flex items-center justify-center transition-colors ${N?t?"text-zinc-500 cursor-wait":"text-zinc-400 cursor-wait":t?"text-zinc-200 hover:bg-white/10":"text-zinc-700 hover:bg-black/5"}`,onClick:bt=>{bt.stopPropagation(),!N&&W(bn=>!bn)},disabled:N,"data-tip":N?"提取中…":"提取视频帧(首尾帧或当前画面)",children:N?s.jsx(zr,{size:18,className:"animate-spin"}):s.jsx(Mx,{size:18})}),k&&!N&&s.jsxs("div",{className:t?"absolute left-1/2 top-full z-[200] mt-1 min-w-[9.5rem] -translate-x-1/2 rounded-lg border border-white/10 bg-zinc-900 py-1 shadow-lg":"absolute left-1/2 top-full z-[200] mt-1 min-w-[9.5rem] -translate-x-1/2 rounded-lg border border-zinc-200 bg-white py-1 shadow-lg",onClick:bt=>bt.stopPropagation(),onPointerDown:bt=>bt.stopPropagation(),children:[s.jsx("button",{type:"button",className:t?"block w-full px-3 py-2 text-left text-xs text-zinc-100 hover:bg-white/10":"block w-full px-3 py-2 text-left text-xs text-zinc-800 hover:bg-zinc-100",onClick:()=>{W(!1),at()},children:"提取首尾帧"}),s.jsx("button",{type:"button",className:t?"block w-full px-3 py-2 text-left text-xs text-zinc-100 hover:bg-white/10":"block w-full px-3 py-2 text-left text-xs text-zinc-800 hover:bg-zinc-100",onClick:()=>{W(!1),rt()},children:"提取当前帧"})]})]})]}),s.jsx("div",{className:`${t?"bg-white/10":"bg-black/10"} w-px h-6`}),s.jsx("button",{className:`w-11 h-11 flex items-center justify-center transition-colors ${J?t?"text-white bg-white/12":"text-emerald-700 bg-emerald-500/10":t?"text-zinc-200 hover:bg-white/10":"text-zinc-700 hover:bg-black/5"}`,"data-toolbar-active":J?"true":"false",onClick:()=>{const bt=!J;Z(bt),bt?(ge(null),Y(null),ie({...U1})):V(!1)},"data-tip":J?"关闭橡皮擦工具":"橡皮擦(彩色标记区域,单图提交补缺)",children:s.jsx(gb,{size:18})}),s.jsx("div",{className:`${t?"bg-white/10":"bg-black/10"} w-px h-6`}),s.jsx("button",{className:`w-11 h-11 flex items-center justify-center transition-colors ${de?t?"text-white bg-white/12":"text-blue-600 bg-blue-500/10":t?"text-zinc-200 hover:bg-white/10":"text-zinc-700 hover:bg-black/5"}`,"data-toolbar-active":de?"true":"false",onClick:()=>{$e(!de),de||(L(!1),T(!1),_e(!1),Z(!1))},"data-tip":de?"关闭重打光面板":"重打光",children:s.jsx(YG,{size:18})}),s.jsx("div",{className:`${t?"bg-white/10":"bg-black/10"} w-px h-6`}),s.jsx("button",{className:`w-11 h-11 flex items-center justify-center transition-colors ${Ee?t?"text-white bg-white/12":"text-blue-600 bg-blue-500/10":t?"text-zinc-200 hover:bg-white/10":"text-zinc-700 hover:bg-black/5"}`,"data-toolbar-active":Ee?"true":"false",onClick:()=>{Ce(!Ee),Ee||(L(!1),$e(!1),T(!1),_e(!1),Z(!1)),Ee&&ke(null)},"data-tip":Ee?"关闭调色编辑":"调色编辑",children:s.jsx(n$,{size:18})}),s.jsx("div",{className:`${t?"bg-white/10":"bg-black/10"} w-px h-6`}),s.jsxs("div",{className:"relative",children:[s.jsx("button",{className:`w-11 h-11 flex items-center justify-center transition-colors ${ze?t?"text-white bg-white/12":"text-emerald-600 bg-emerald-500/10":t?"text-zinc-200 hover:bg-white/10":"text-zinc-700 hover:bg-black/5"}`,"data-toolbar-active":ze?"true":"false",onClick:()=>{if(ze)_e(!1);else{const bt=Math.max(300,typeof window<"u"?window.innerWidth:1200),bn=Math.max(400,typeof window<"u"?window.innerHeight:800),An=Math.min(850,Math.round(bt*.68)),Vn=Math.min(720,Math.round(bn*.72));Ye.current={width:e.width,height:e.height},n(e.id,{width:An,height:Vn}),_e(!0)}ze||(L(!1),$e(!1),T(!1),Z(!1))},"data-tip":ze?"关闭文字编辑":"文字编辑",children:s.jsx(M5,{size:18})}),(Kn=e.settings)!=null&&Kn.textEditData?s.jsx("div",{className:`absolute top-2 right-2 w-2.5 h-2.5 rounded-full ${t?"bg-orange-400":"bg-orange-500"}`,"data-tip":"已有文字编辑数据"}):null]}),s.jsx("div",{className:`${t?"bg-white/10":"bg-black/10"} w-px h-6`}),s.jsx("button",{className:`w-11 h-11 flex items-center justify-center transition-colors ${t?"text-zinc-200 hover:bg-white/10":"text-zinc-700 hover:bg-black/5"}`,onClick:()=>At(),"data-tip":"更换图片",children:s.jsx(Rp,{size:18})})]})})}),Yt?s.jsx("div",{className:"relative w-full h-full overflow-hidden rounded-xl bg-transparent border-0",onClick:bt=>{bt.stopPropagation()},style:{pointerEvents:"auto"},children:Ue?s.jsxs(s.Fragment,{children:[s.jsxs("div",{ref:je,className:"absolute inset-0 w-full h-full overflow-hidden rounded-xl flex items-center justify-center bg-transparent border-0",children:[Yt?s.jsxs(s.Fragment,{children:[xe&&((Xn=e.settings)!=null&&Xn.colorAdjustOriginal)?s.jsxs("div",{className:"w-full h-full flex",children:[s.jsxs("div",{className:"flex-1 flex items-center justify-center overflow-hidden border-r border-zinc-600/50",children:[s.jsx("span",{className:"absolute top-1 left-2 text-[10px] text-zinc-500 z-10 bg-black/50 px-1 rounded",children:"原图"}),s.jsx("img",{src:($r=e.settings)==null?void 0:$r.colorAdjustOriginal,alt:"原图",className:"w-full h-full object-cover",draggable:!1})]}),s.jsxs("div",{className:"flex-1 flex items-center justify-center overflow-hidden",children:[s.jsx("span",{className:"absolute top-1 right-2 text-[10px] text-zinc-500 z-10 bg-black/50 px-1 rounded",children:"调色后"}),s.jsx("img",{src:Ht,alt:"调色后",className:"w-full h-full object-cover",draggable:!1})]})]}):s.jsx("div",{className:"w-full h-full flex items-center justify-center bg-transparent",children:s.jsx("img",{ref:Le,src:Ee&&ve?fn:Ht,alt:"输入图片",className:"w-full h-full",style:{objectFit:"cover",objectPosition:"center",display:"block",filter:Ee&&ve?h7(ve):void 0},draggable:!1,loading:o==="medium"?"lazy":"eager",decoding:"async",onError:async()=>{var Sr;const bt=Ee&&ve?fn:Ht;if(!(bt!=null&&bt.startsWith("blob:")))return;const bn=(Sr=e.settings)==null?void 0:Sr._assetId;if(!bn)return;const{recoverDeadBlobUrl:An}=await mn(async()=>{const{recoverDeadBlobUrl:Ir}=await Promise.resolve().then(()=>Do);return{recoverDeadBlobUrl:Ir}},void 0,import.meta.url),Vn=await An(bt,[bn]);Vn&&n(e.id,{content:Vn})}})}),((Tr=e.settings)==null?void 0:Tr.colorAdjustOriginal)&&!((kr=e.settings)!=null&&kr.colorAdjustHideCompare)&&s.jsxs("button",{onClick:bt=>{bt.stopPropagation(),Ne(bn=>!bn)},className:`absolute bottom-2 left-1/2 -translate-x-1/2 z-20 flex items-center gap-1.5 px-2.5 py-1 rounded-lg text-[11px] backdrop-blur-sm ${xe?"bg-blue-600 text-white":t?"bg-zinc-800/90 text-zinc-300 hover:bg-zinc-700":"bg-white/90 text-zinc-600 hover:bg-zinc-100"}`,title:xe?"关闭对比":"原图 vs 调色后",children:[s.jsx(n$,{size:12}),xe?"关闭对比":"原图 vs 调色后"]})]}):s.jsx("div",{className:"w-full h-full flex items-center justify-center bg-zinc-100 dark:bg-zinc-800",children:s.jsx(si,{size:24,className:"text-zinc-400"})}),Yt&&Ue&&q&&Te.width>0&&He.width>0&&!xe&&s.jsx(sle,{containerRef:je,imageAreaRef:Le,imgNaturalWidth:He.width,imgNaturalHeight:He.height,containerWidth:Te.width,containerHeight:Te.height,objectFit:"cover",selection:((Rr=e.settings)==null?void 0:Rr.cropSelection)??null,onSelectionChange:bt=>n(e.id,{settings:{...e.settings,cropSelection:bt}}),isDark:t,view:i,canvasRef:a,nodeRect:{x:e.x,y:e.y,width:(sr=e.settings)!=null&&sr.hasCustomSize&&e.settings.savedNodeWidth!=null?e.settings.savedNodeWidth:e.width,height:(mt=e.settings)!=null&&mt.hasCustomSize&&e.settings.savedNodeHeight!=null?e.settings.savedNodeHeight:e.height}}),Yt&&Te.width>0&&!xe&&!q&&s.jsx(tle,{nodeId:e.id,markers:Dn,onMarkersChange:it,isDark:t,isMarkerMode:X,imageWidth:Te.width,imageHeight:Te.height,imageUrl:Yt,mainLabel:e.nodeName,onMarkerEdit:Lt}),B&&Yt&&Ue&&!xe&&s.jsx("div",{className:"absolute inset-0 w-full h-full z-30",children:s.jsx(p7,{imageUrl:Yt,isDark:t,outputType:"red-composite",variant:"canvas-only",externalBrushWidth:ee,markColor:Ag[oe],onClose:()=>V(!1),onSave:(bt,bn)=>{Y(bt),ie(bn??{...U1})}})})]}),ze&&Yt&&s.jsx(gle,{imageContent:Yt,imageMimeType:"image/png",isDark:t,apiConfigs:y,globalApiKey:w,savedState:(It=e.settings)==null?void 0:It.textEditState,onStateChange:Wt,onClose:()=>_e(!1),onGenerated:bt=>{n(e.id,{settings:{...e.settings,textEditData:bt}}),_e(!1)}})]}):Qe?s.jsx("video",{ref:pt,src:Yt,className:"w-full h-full object-contain bg-black",controls:!0,preload:"metadata",onClick:bt=>bt.stopPropagation(),onPlay:bt=>{const bn=bt.currentTarget;bn.setAttribute("data-user-controlled","true"),bn.setAttribute("data-user-playing","true")},onPause:bt=>{const bn=bt.currentTarget;bn.setAttribute("data-user-controlled","true"),bn.setAttribute("data-user-playing","false")}}):St?s.jsx("div",{className:"w-full h-full flex items-center justify-center p-4",children:s.jsx(U0,{audioUrl:Yt,isDark:t,title:(tn=e.settings)==null?void 0:tn.musicTitle,className:"w-full"})}):null}):s.jsxs("div",{className:"flex flex-col items-center justify-center h-full w-full",children:[s.jsxs("label",{className:t?"px-4 py-2 rounded-lg text-xs font-medium transition-colors cursor-pointer border bg-transparent text-zinc-100 border-zinc-500 hover:bg-zinc-800/60":"px-4 py-2 rounded-lg text-xs font-medium transition-colors cursor-pointer bg-black hover:bg-zinc-900 text-white",onMouseDown:bt=>bt.stopPropagation(),children:[dn,s.jsx("input",{ref:Ve,type:"file",className:"hidden",accept:Ot,onChange:ot})]}),s.jsxs("div",{className:"text-[10px] text-center mt-2 text-zinc-500",children:["或拖放文件到此处",s.jsx("br",{}),"或 Ctrl+V 粘贴"]}),s.jsx("div",{className:`text-[9px] text-center mt-1 ${t?"text-zinc-600":"text-zinc-400"}`,children:"支持音频、视频、图片素材"})]}),Yt&&s.jsx("input",{ref:Ve,type:"file",className:"hidden",accept:Ot,onChange:ot}),F&&Yt&&Ue&&s.jsx("div",{className:"absolute top-0 left-full ml-4 z-50",style:{pointerEvents:"auto"},onClick:bt=>bt.stopPropagation(),children:s.jsx(Zoe,{config:qt,onConfigChange:nt,onConfirm:xt,isDark:t,isVisible:A,isOpen:F,onClose:()=>L(!1),previewImageUrl:Yt})}),J&&Yt&&Ue&&s.jsx("div",{className:"absolute top-0 left-full ml-4 z-50 w-72",style:{pointerEvents:"auto"},onClick:bt=>bt.stopPropagation(),onMouseDown:bt=>bt.stopPropagation(),children:s.jsxs("div",{className:`rounded-xl border shadow-xl overflow-hidden ${t?"bg-zinc-900 border-white/30 text-white":"bg-white border-zinc-200"}`,children:[s.jsxs("div",{className:`flex items-center justify-between px-3 py-2 ${t?"bg-zinc-900/70":"bg-zinc-100"}`,children:[s.jsx("span",{className:"font-medium text-sm",children:"橡皮工具"}),s.jsx("button",{className:"p-1 rounded hover:opacity-80",onClick:()=>{Z(!1),V(!1)},children:"×"})]}),s.jsxs("div",{className:"p-3 space-y-3",children:[s.jsxs("div",{children:[s.jsx("label",{className:"block text-xs mb-1 opacity-80",children:"模型"}),s.jsx("select",{className:`w-full rounded px-2 py-1.5 text-sm border ${t?"bg-black border-white/30 text-white [color-scheme:dark] [&>option]:bg-black [&>option]:text-white":"bg-white border-zinc-300"}`,value:we,onChange:bt=>Q(bt.target.value),children:Pt.map(bt=>s.jsx("option",{value:bt.id,children:Bt(bt)},bt.id))})]}),s.jsxs("div",{children:[s.jsx("label",{className:"block text-xs mb-1 opacity-80",children:"分辨率"}),s.jsxs("select",{className:`w-full rounded px-2 py-1.5 text-sm border ${t?"bg-black border-white/30 text-white [color-scheme:dark] [&>option]:bg-black [&>option]:text-white":"bg-white border-zinc-300"}`,value:me,onChange:bt=>ue(bt.target.value),children:[s.jsx("option",{value:"Auto",children:"Auto"}),s.jsx("option",{value:"1K",children:"1K"}),s.jsx("option",{value:"2K",children:"2K"}),s.jsx("option",{value:"4K",children:"4K"})]})]}),s.jsxs("div",{children:[s.jsx("label",{className:"block text-xs mb-1 opacity-80",children:"笔刷颜色"}),s.jsx("div",{className:"flex gap-2",children:Object.keys(Ag).map(bt=>s.jsx("button",{className:`w-8 h-8 rounded-full border-2 transition ${oe===bt?"border-white ring-2 ring-emerald-500":"border-transparent"}`,style:{backgroundColor:`rgb(${Ag[bt].r},${Ag[bt].g},${Ag[bt].b})`},onClick:()=>re(bt),title:bt==="red"?"红色":bt==="yellow"?"黄色":"蓝色"},bt))})]}),s.jsxs("div",{children:[s.jsxs("label",{className:"block text-xs mb-1 opacity-80",children:["笔刷大小 ",ee]}),s.jsx("input",{type:"range",min:8,max:120,value:ee,onChange:bt=>pe(Number(bt.target.value)),className:"w-full"})]}),s.jsx("button",{className:`w-full py-2 rounded-lg text-sm font-medium ${B?t?"border border-white/50 bg-transparent text-white":"bg-zinc-300 text-zinc-800":t?"border border-white/30 bg-transparent text-zinc-200 hover:bg-white/5":"bg-black hover:bg-zinc-800 text-white"}`,onClick:()=>V(bt=>!bt),children:B?"收起涂抹":"打开涂抹"}),s.jsx("p",{className:"text-xs opacity-70",children:"点「打开涂抹」在图上涂抹;松手后自动保存,再点「立即使用」"}),te&&s.jsx("p",{className:"text-xs text-red-500",children:te}),s.jsxs("div",{className:"flex gap-2",children:[s.jsx("button",{className:`flex-1 py-2 rounded-lg text-sm ${t?"border border-white/30 bg-transparent text-zinc-200 hover:bg-white/5":"bg-zinc-200 hover:bg-zinc-300"}`,onClick:()=>{Z(!1),V(!1),Y(null)},children:"取消"}),s.jsx("button",{className:`flex-1 py-2 rounded-lg text-sm ${t?"border border-white/30 bg-transparent text-zinc-200 hover:bg-white/5":"bg-black hover:bg-zinc-800 text-white"} disabled:opacity-50 disabled:cursor-not-allowed`,disabled:!M||U,onClick:()=>void Gt(),children:U?"擦除中…":"立即使用"})]})]})]})}),de&&Yt&&Ue&&s.jsx("div",{className:"absolute top-0 left-full ml-4 z-50",style:{pointerEvents:"auto"},onClick:bt=>bt.stopPropagation(),children:s.jsx(ile,{settings:De,onChange:_t,isDark:t,onClose:()=>$e(!1),nodeId:e.id})}),Ee&&Yt&&Ue&&s.jsx("div",{className:"absolute top-0 left-full ml-4 z-50",style:{pointerEvents:"auto"},onClick:bt=>bt.stopPropagation(),onMouseDown:bt=>bt.stopPropagation(),onDoubleClick:bt=>bt.stopPropagation(),children:s.jsx(ule,{imageContent:((cn=e.settings)==null?void 0:cn.colorAdjustOriginal)||Yt,isDark:t,savedParams:((zn=e.settings)==null?void 0:zn.colorAdjustDraft)??((Rn=e.settings)==null?void 0:Rn.colorAdjust)??{},onParamsChange:bt=>ke(bt),onClose:bt=>{bt&&n(e.id,{settings:{...e.settings,colorAdjustDraft:bt}}),Ce(!1),ke(null)},onApply:(bt,bn)=>{var Vn;ct.current=bn,Pe(bn);const An=((Vn=e.settings)==null?void 0:Vn.colorAdjustOriginal)||Yt;n(e.id,{content:bn,settings:{...e.settings,colorAdjust:bt,colorAdjustOriginal:An,colorAdjustHideCompare:!0,colorAdjustDraft:void 0}}),Ne(!1),Ce(!1),ke(null)}})}),ne&&fe&&Yt&&Ue&&(()=>{const bt=Dn.find(bn=>bn.id===fe);return bt?s.jsx("div",{className:"absolute top-0 left-full ml-4 z-50",style:{pointerEvents:"auto"},onClick:bn=>bn.stopPropagation(),onMouseDown:bn=>bn.stopPropagation(),children:s.jsx(mle,{marker:bt,markers:Dn,isDark:t,imageWidth:He.width,imageHeight:He.height,imageUrl:Yt,apiConfigs:y,globalApiKey:w,onClose:()=>{le(!1),be(null)},onSave:gt,onLevelChange:Jt,onRadiusChange:bn=>{const An=Dn.map(Vn=>Vn.id===bt.id?{...Vn,radius:bn}:Vn);it(An)}})}):null})()]})},cm=e=>e==null?"":typeof e=="string"?e:Array.isArray(e)?e.map(t=>{if(typeof t=="string")return t;if(t&&typeof t=="object"){const n=t;if(typeof n.text=="string")return n.text;if(typeof n.content=="string")return n.content}return""}).join(""):String(e),Nle=e=>{const t=e.choices,n=(t==null?void 0:t[0])??null,r=(n==null?void 0:n.delta)??e.delta;let i=(r==null?void 0:r.content)??(n==null?void 0:n.text)??e.content??(r==null?void 0:r.text);if(i==null||i===""){const a=r==null?void 0:r.reasoning_content;a!=null&&a!==""&&(i=a)}return cm(i)},d_=e=>{const t=e.choices,n=(t==null?void 0:t[0])??null,r=n==null?void 0:n.message,i=e.data,a=i==null?void 0:i.choices,o=(a==null?void 0:a[0])??null,l=o==null?void 0:o.message,c=e.message,u=(r==null?void 0:r.content)??(typeof c=="string"?c:c==null?void 0:c.content)??(l==null?void 0:l.content);return cm(u)},Ele=e=>{let t=e;const n=[/^Here is the prompt:?\s*/i,/^好的[,,]?这是提示词[::]\s*/i,/^以下是提示词[::]\s*/i,/^Prompt[::]\s*/i,/^提示词[::]\s*/i,/^根据.*?[,,]?生成.*?[::]\s*/i,/^我.*?整理.*?[::]\s*/i];for(const i of n)t=t.replace(i,"");const r=[/\n*希望.*?满意.*$/i,/\n*如果.*?需要.*?修改.*$/i,/\n*以上.*?供参考.*$/i];for(const i of r)t=t.replace(i,"");return t=t.replace(/\*\*\*/g,""),t=t.replace(/\*\*/g,""),t=t.replace(/#{1,6}\s/g,""),t=t.replace(/```[\s\S]*?```/g,""),t=t.replace(/`([^`]+)`/g,"$1"),t=t.replace(/\n{3,}/g,` + +`),t=t.trim(),!t&&e.trim()?e.trim():t},Ile=({node:e,isDark:t,updateNode:n,connections:r=[],nodes:i=[],setConnections:a,apiConfigs:o=[],globalApiKey:l="",getConnectedInputImages:c,getOrderedInputItems:u})=>{var B,V,N,j,k,W;const d=_.useMemo(()=>(o||[]).filter(M=>M.type==="Chat"),[o]),[h,p]=_.useState(()=>{var M;return((M=e.settings)==null?void 0:M.textNodeChatModel)||"gemini-3-pro"}),[f,b]=_.useState(!1),[g,y]=_.useState(""),w=_.useRef(null),v=_.useRef(e);_.useEffect(()=>{v.current=e},[e]),_.useEffect(()=>{const M=w.current;if(!M)return;const Y=se=>{se.stopPropagation(),se.preventDefault(),M.scrollTop+=se.deltaY};return M.addEventListener("wheel",Y,{passive:!1,capture:!0}),()=>{M.removeEventListener("wheel",Y,{capture:!0})}},[]);const m=_.useMemo(()=>u?u(e.id):(c?c(e.id):[]).map(Y=>({url:Y,type:"image"})),[u,c,e.id,(B=e.settings)==null?void 0:B.inputItemOrder]),z=m.length>0;_.useEffect(()=>{var se,ie;const M=(se=e.settings)==null?void 0:se.textNodeChatModel,Y=(ie=e.settings)==null?void 0:ie.textNodeHasImageInput;M===h&&Y===z||n(e.id,{settings:{...e.settings,textNodeChatModel:h,textNodeHasImageInput:z}})},[h,z,e.id,e.settings,n]);const{textFromUpstreamTextNodes:C,upstreamTextNodeCount:E}=_.useMemo(()=>{const M=r.filter(ie=>ie.to===e.id&&(!ie.inputType||ie.inputType==="default")),Y=[];return M.forEach(ie=>{var re,ee,pe;const oe=i.find(we=>we.id===ie.from);if(oe&&(oe.type==="text-node"||oe.type==="custom-agent"||oe.type==="novel-input")){const we=(((re=oe.settings)==null?void 0:re.text)||oe.prompt||oe.content||((ee=oe.settings)==null?void 0:ee.outputContent)||((pe=oe.settings)==null?void 0:pe.novelContent)||"").trim();we&&Y.push({text:we})}}),{textFromUpstreamTextNodes:Y.map(ie=>ie.text).filter(Boolean).join(` + +`)||null,upstreamTextNodeCount:Y.length}},[r,i,e.id]),I=_.useMemo(()=>m.map(M=>M.url),[m]),R=iu(I),A=_.useMemo(()=>m.map((M,Y)=>{var se,ie,oe;return{...M,url:((se=R[Y])==null?void 0:se.content)||M.url||"",isLoading:((ie=R[Y])==null?void 0:ie.isLoading)??!1,hasError:((oe=R[Y])==null?void 0:oe.hasError)??!1}}),[m,R]),O=_.useMemo(()=>{if(!r||!i)return new Map;const M=new Map;return r.filter(se=>se.to===e.id&&(!se.inputType||se.inputType==="default")).forEach(se=>{const ie=i.find(re=>re.id===se.from);if(!ie)return;(()=>{var re,ee;if(ie.type==="preview"){if(ie.selectedPreviewImage)return[ie.selectedPreviewImage];if((re=ie.previewMjImages)!=null&&re[0])return[ie.previewMjImages[0]];if(ie.content)return[ie.content]}else if(ie.type==="input-image"||ie.type==="video-input"||ie.type==="rh-app"){if(ie.content)return[ie.content];const pe=(ee=ie.settings)==null?void 0:ee.generatedImages;if(pe!=null&&pe.length)return pe.map(we=>we.fullUrl)}else if(ie.content)return[ie.content];return[]})().forEach(re=>M.set(re,se.from))}),M},[r,i,e.id]),F=_.useCallback((M,Y)=>{Y.preventDefault(),Y.stopPropagation();const se=O.get(M);se&&a&&a(ie=>ie.filter(oe=>!(oe.from===se&&oe.to===e.id)))},[O,e.id,a]),[L,X]=_.useState(null),[T,q]=_.useState(null),H=_.useCallback((M,Y)=>{if(M===Y||M<0||Y<0||M>=m.length||Y>=m.length)return;const se=[...m],[ie]=se.splice(M,1);se.splice(Y,0,ie),n(e.id,{settings:{...e.settings,inputItemOrder:se.map(oe=>oe.url)}}),X(null)},[m,e.id,e.settings,n]),J=_.useCallback(()=>{const M=r.filter(Y=>Y.from===e.id).map(Y=>Y.to);return i.filter(Y=>M.includes(Y.id))},[r,i,e.id]),Z=_.useCallback(async()=>{var ie,oe;if(f)return;const M=((ie=e.settings)==null?void 0:ie.text)||e.prompt||C||"",Y=M.trim().length>0,se=A.some(re=>re.url&&!re.isLoading&&!re.hasError);if(!Y&&!se){alert("请输入文字或连接图片/视频");return}if(m.length>0&&A.some(re=>re.isLoading)){alert("内容正在加载中,请稍候...");return}console.log("[TextNode] Starting analysis:",{hasInput:Y,hasItems:se,itemCount:A.length}),b(!0);try{const re=o.find(Ce=>Ce.type==="Chat"&&Ce.id===h),ee=(re==null?void 0:re.key)||l,pe=((re==null?void 0:re.url)||"https://ai.comfly.chat").replace(/\/+$/,"");if(console.log("[TextNode] API config:",{model:h,hasApiKey:!!ee,baseUrl:pe,configFound:!!re}),!ee){alert("请先配置 API Key"),b(!1);return}const we=`你是一个专业的AI提示词工程师和创意总监。你的任务是:严格按照用户的指令要求,使用提供的参考图片/视频来完成任务。 + +【核心原则】 +1. 用户的指令是最高优先级 - 必须严格执行用户要求的任务 +2. 图片只是参考素材 - 不要主动描述图片,除非用户明确要求 +3. 输出要直接可用 - 生成的内容应该可以直接用于AI绘画/视频生成 + +【禁止行为】 +❌ 不要自作主张描述图片内容(除非用户要求"描述图片") +❌ 不要添加解释性前缀(如"好的,这是..."、"以下是...") +❌ 不要分别列举每张图片的内容(除非用户要求) +❌ 不要偏离用户的指令去做其他事情 + +【必须遵守】 +✅ 如果用户要求"生成提示词",就输出提示词,不要描述图片 +✅ 如果用户要求"结合图一和图二",就合成元素,不要分别描述 +✅ 如果用户要求"规划场景",就输出场景方案,不要分析图片 +✅ 严格遵守用户指定的格式要求(如字数、段落数等) +✅ 用中文输出(除非用户要求英文) + +记住:你是在执行用户的创作指令,不是在写图片分析报告!`,Q=[],me=A.filter(Ce=>Ce.url&&!Ce.isLoading&&!Ce.hasError);if(me.length>0)for(let Ce=0;CeBe.blob());Ne=await new Promise((Be,He)=>{const Je=new FileReader;Je.onerror=()=>He(new Error("FileReader failed")),Je.onloadend=()=>Be(Je.result),Je.readAsDataURL(Te)})}catch(Te){console.error(`[TextNode] Failed to convert Blob URL ${Ce+1}:`,Te),alert(`${xe.type==="video"?"视频":"图片"}${Ce+1}转换失败,请重新连接`),b(!1);return}const ve=Ne.startsWith("data:image/"),ke=Ne.startsWith("http://")||Ne.startsWith("https://"),Ie=Ne.startsWith("data:video/"),Pe=xe.type==="video"&&(Ne.startsWith("http")||Ne.includes(".mp4")||Ne.includes(".webm"));xe.type==="video"&&(Ie||Pe)?Q.push({type:"image_url",image_url:{url:Ne,detail:"high"}}):ve||ke?Q.push({type:"image_url",image_url:{url:Ne,detail:"high"}}):!Ie&&!Pe&&!ve&&!ke&&console.warn("[TextNode] Skipping invalid URL format:",Ne.substring(0,50))}const ue=M.trim(),G=me.some(Ce=>Ce.type==="video")?"请基于这段视频,分析其内容、风格和节奏,生成适合AI绘画/视频的提示词或场景描述。":"请基于这张图片,生成一个适合AI绘画的详细提示词(Prompt)。要求:保留图片的核心视觉元素、风格、氛围,输出格式为单段连贯的提示词文本。";let te="";if(me.length>0){const Ce=ue||G,xe=me.length,Ne=me.some(ve=>ve.type==="video")?"参考图片/视频":"张参考图片";te=`【任务】 +${Ce} + +【说明】上方已提供 ${xe} ${Ne},请严格按照任务要求完成,直接输出结果,不要描述媒体内容。`}else te=ue||"请输入你的需求";Q.push({type:"text",text:te});const ge=(re==null?void 0:re.modelName)||h,le=Q.some(Ce=>Ce.type==="image_url")?Q:((oe=Q.find(Ce=>Ce.type==="text"))==null?void 0:oe.text)||"请输入你的需求",fe={model:ge,messages:[{role:"system",content:we},{role:"user",content:le}],max_tokens:16e3,temperature:.7,stream:!0},be=await fetch(`${pe}/v1/chat/completions`,{method:"POST",headers:{Authorization:`Bearer ${ee}`,"Content-Type":"application/json"},body:JSON.stringify(fe)});if(!be.ok){const Ce=await be.text();throw console.error("[TextNode] API error:",Ce),new Error(`API 请求失败: ${be.status}`)}let de="";const $e=Ce=>{const xe=Nle(Ce)||d_(Ce);xe&&(de+=xe,y(de))};if(be.body){const Ce=be.body.getReader(),xe=new TextDecoder("utf-8");let Ne="",ve="";try{for(;;){const{done:ke,value:Ie}=await Ce.read();if(ke){if(Ne.trim()){const Be=Ne.split(` +`);for(const He of Be){const Je=He.trim();if(!(!Je||Je==="data: [DONE]")){if(Je.startsWith("data: "))try{const Me=Je.slice(6);if(Me==="[DONE]"||!Me.trim())continue;const Re=JSON.parse(Me);$e(Re)}catch{}else if(Je.startsWith("{"))try{const Me=JSON.parse(Je);$e(Me)}catch{}}}}break}const Pe=xe.decode(Ie,{stream:!0});ve+=Pe,Ne+=Pe;const Te=Ne.split(` +`);Ne=Te.pop()||"";for(const Be of Te){const He=Be.trim();if(!(!He||He==="data: [DONE]")){if(He.startsWith("data: "))try{const Je=He.slice(6);if(Je==="[DONE]"||!Je.trim())continue;const Me=JSON.parse(Je);$e(Me)}catch{}else if(He.startsWith("{"))try{const Je=JSON.parse(He);$e(Je)}catch{}}}}}finally{Ce.releaseLock()}if(!de.trim()&&ve.trim())try{const ke=JSON.parse(ve.trim()),Ie=d_(ke)||cm(ke.content)||cm(ke.text);Ie&&(de=Ie)}catch{}}else{const Ce=await be.json();de=d_(Ce)||cm(Ce.content)||cm(Ce.text)||""}if(!de.trim())throw new Error("AI 未返回有效内容");y("");const ze=Ele(de),_e=v.current;n(e.id,{settings:{..._e.settings||{},text:ze,aiGenerated:!0},prompt:ze}),J().forEach(Ce=>{(Ce.type==="gen-image"||Ce.type==="gen-video")&&n(Ce.id,{prompt:ze})})}catch(re){console.error("[TextNode] AI analysis failed:",re),y(""),alert(`AI 分析失败: ${re instanceof Error?re.message:"未知错误"}`)}finally{b(!1)}},[e,m,A,h,o,l,n,J,f,C]);return s.jsx("div",{className:"relative w-full h-full flex flex-col transition-colors pointer-events-auto bg-transparent",children:s.jsxs("div",{className:"flex-1 p-3 flex flex-col gap-2 overflow-y-auto custom-scrollbar",children:[z&&s.jsx("div",{className:"mb-2 relative",children:s.jsxs("div",{className:"flex gap-1.5 overflow-visible items-center flex-wrap",onDragOver:M=>{M.preventDefault(),M.stopPropagation(),M.dataTransfer.dropEffect="move"},children:[A.slice(0,14).map((M,Y)=>s.jsxs("div",{"data-image-reorder-thumb":!0,className:`relative shrink-0 cursor-grab active:cursor-grabbing touch-none select-none ${L===Y?"opacity-60 scale-95":""}`,title:"长按拖拽可调换顺序",draggable:!0,onMouseEnter:()=>q(Y),onMouseLeave:()=>q(null),onDragStart:se=>{if(se.target.closest("button")){se.preventDefault();return}se.dataTransfer.setData("text/plain",String(Y)),se.dataTransfer.effectAllowed="move",se.stopPropagation(),X(Y)},onDragEnd:()=>X(null),onDragEnter:se=>{se.preventDefault(),se.stopPropagation(),se.dataTransfer.dropEffect="move"},onDragOver:se=>{se.preventDefault(),se.stopPropagation(),se.dataTransfer.dropEffect="move"},onDrop:se=>{se.preventDefault(),se.stopPropagation();const ie=Number(se.dataTransfer.getData("text/plain"));!Number.isNaN(ie)&&ie!==Y&&H(ie,Y)},children:[s.jsx("span",{className:"absolute -top-1 -left-1 w-3.5 h-3.5 text-[8px] font-semibold rounded-full bg-zinc-700 text-white select-none flex items-center justify-center border border-white/70 shadow-sm leading-none pointer-events-none",style:{zIndex:30},children:Y+1}),s.jsx("button",{onClick:se=>F(M.url,se),className:`absolute -top-1 -right-1 w-3.5 h-3.5 rounded-full flex items-center justify-center transition-opacity ${T===Y?"opacity-100":"opacity-0"} ${t?"bg-red-600 hover:bg-red-500":"bg-red-500 hover:bg-red-600"} text-white shadow-lg`,style:{zIndex:31},title:"取消引用",children:s.jsx("svg",{width:"6",height:"6",viewBox:"0 0 8 8",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:s.jsx("path",{d:"M1 1L7 7M7 1L1 7",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})})}),s.jsx("div",{className:`relative w-9 h-9 rounded border overflow-hidden ${t?"border-white/30 bg-transparent":"border-zinc-300 bg-zinc-200"}`,title:M.type==="video"?`视频 ${Y+1}`:`图片 ${Y+1}`,children:M.isLoading?s.jsx("div",{className:"w-full h-full flex items-center justify-center",children:s.jsx(zr,{size:10,className:"animate-spin text-zinc-500"})}):M.hasError||!M.url?s.jsx("div",{className:"w-full h-full flex items-center justify-center",children:M.type==="video"?s.jsx(aa,{size:10,className:"text-zinc-500"}):s.jsx(si,{size:10,className:"text-zinc-500"})}):M.type==="video"?s.jsx("video",{src:M.url,className:"w-full h-full object-cover",muted:!0,preload:"metadata",playsInline:!0}):s.jsx("img",{src:M.url,className:"w-full h-full object-cover",alt:`参考 ${Y+1}`})})]},Y)),s.jsx("div",{className:`relative shrink-0 w-9 h-9 rounded border border-dashed flex items-center justify-center cursor-pointer transition-colors ${t?"border-white/30 bg-transparent hover:border-white/50 hover:bg-white/5":"border-zinc-300 bg-zinc-50 hover:border-zinc-400 hover:bg-zinc-100"}`,title:"可以继续连接更多图片/视频节点",children:s.jsx("svg",{width:"16",height:"16",viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:s.jsx("path",{d:"M10 5V15M5 10H15",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",className:t?"text-white/40":"text-zinc-400"})})})]})}),z&&s.jsxs("div",{className:"flex items-center gap-2 pb-2",children:[s.jsx("select",{value:d.some(M=>M.id===h)?h:((V=d[0])==null?void 0:V.id)||"",onChange:M=>p(M.target.value),className:`flex-1 px-2 py-1.5 text-xs rounded border outline-none transition-colors text-node-chat-select ${t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-white border-zinc-300 text-zinc-800"}`,onMouseDown:M=>M.stopPropagation(),children:d.map(M=>s.jsx("option",{value:M.id,children:M.provider??M.id},M.id))}),s.jsx("button",{onClick:Z,disabled:f,className:`px-3 py-1.5 text-xs rounded border transition-colors flex items-center gap-1.5 ${f?t?"bg-transparent text-white/50 border-white/20 cursor-not-allowed":"bg-zinc-600 text-zinc-400 cursor-not-allowed border-transparent":t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-black text-white hover:bg-zinc-900 border-transparent"}`,onMouseDown:M=>M.stopPropagation(),children:f?s.jsxs(s.Fragment,{children:[s.jsx(zr,{size:12,className:"animate-spin"}),s.jsx("span",{children:"分析中..."})]}):s.jsx(s.Fragment,{children:s.jsx("span",{children:"运行"})})})]}),C&&E>0&&s.jsxs("div",{className:`mb-2 flex items-center gap-1.5 px-2 py-1 rounded text-[10px] border ${t?"bg-transparent border-white/30":"bg-blue-50 border-blue-200"}`,children:[s.jsx(Vo,{size:12,className:t?"text-white":"text-blue-600"}),s.jsxs("span",{className:t?"text-white":"text-blue-700",children:["上游已连接: 文字节点(",E,"个)"]})]}),s.jsx("textarea",{ref:w,"data-node-type":"text-node","data-node-id":e.id,value:f?g:(N=e.settings)!=null&&N.aiGenerated?((j=e.settings)==null?void 0:j.text)??e.prompt??"":C?"":((k=e.settings)==null?void 0:k.text)||e.prompt||"",readOnly:f||!!C&&!((W=e.settings)!=null&&W.aiGenerated),onChange:M=>{var se;if(C&&!((se=e.settings)!=null&&se.aiGenerated))return;const Y=M.target.value;n(e.id,{settings:{...e.settings||{},text:Y,aiGenerated:!1},prompt:Y})},placeholder:C?"文字由上游节点提供":z?`输入你的需求(留空则自动生成提示词),例如: +• 生成一个适合AI绘画的提示词 +• 结合图一的人物和图二的背景,规划一个场景 +• 提取图片/视频的风格特点,生成新的创意方向`:"输入文字内容...",className:`flex-1 resize-none outline-none text-base p-3 rounded overflow-y-auto rh-scroll-minimal leading-relaxed bg-transparent border-0 ${t?"text-zinc-200 placeholder-zinc-500":"text-zinc-800 placeholder-zinc-400"}`,onMouseDown:M=>M.stopPropagation()})]})})},kle=({node:e,isDark:t,updateNode:n,setNodes:r,setConnections:i,apiConfigs:a})=>{var o,l;return s.jsx("div",{className:`relative w-full h-full flex flex-col transition-colors pointer-events-auto ${t?"bg-zinc-900/80":"bg-zinc-100"}`,children:s.jsxs("div",{className:"flex-1 flex flex-col p-3 overflow-hidden min-h-0 gap-2",children:[s.jsx("textarea",{"data-node-type":"novel-input","data-node-id":e.id,"data-scrollable":"true",value:((o=e.settings)==null?void 0:o.content)||e.prompt||"",onChange:c=>{const u=c.target.value;u.length<=1e4&&n(e.id,{settings:{...e.settings||{},content:u},prompt:u})},placeholder:"输入小说内容(最多10,000字)...",maxLength:1e4,className:`w-full h-full resize-none outline-none text-sm p-2 rounded border overflow-y-auto custom-scrollbar ${t?"bg-zinc-800/50 border-zinc-700/50 text-zinc-200 placeholder-zinc-500":"bg-white/80 border-zinc-300/80 text-zinc-800 placeholder-zinc-400"}`,onMouseDown:c=>c.stopPropagation()}),s.jsxs("div",{className:"flex items-center justify-between gap-2 shrink-0",children:[s.jsxs("span",{className:"text-[10px] text-zinc-500",children:[(((l=e.settings)==null?void 0:l.content)||"").length.toLocaleString(),"/10,000"]}),s.jsx("button",{className:`flex-1 px-3 py-2 rounded text-xs font-medium transition-colors ${t?"bg-blue-600 hover:bg-blue-500 text-white":"bg-blue-500 hover:bg-blue-600 text-white"}`,onMouseDown:c=>c.stopPropagation(),type:"button",onClick:()=>{var f,b;const c=((f=e.settings)==null?void 0:f.content)||e.prompt||"";if(!c||c.trim().length===0){alert("请先输入小说内容");return}const u=e.x+e.width+100,d=e.y+e.height/2,h=`node-${Date.now()}`,p={id:h,type:"extract-characters-scenes",x:u-200,y:d-200,width:400,height:500,settings:{model:((b=a.find(g=>g.type==="Chat"))==null?void 0:b.id)||"",content:c}};r(g=>[...g,p]),i(g=>[...g,{id:`conn-${Date.now()}`,from:e.id,to:h}])},children:"提取角色和场景"})]})]})})},Ale=({node:e,isDark:t,updateNode:n,setNodes:r,setConnections:i,apiConfigs:a,globalApiKey:o})=>{var c,u,d,h,p,f,b,g;const l=async()=>{var w,v,m,z,C,E;const y=((w=e.settings)==null?void 0:w.content)||"";if(!y||y.trim().length===0){alert("没有找到小说内容,请先连接小说输入节点");return}n(e.id,{settings:{...e.settings,isAnalyzing:!0,progress:0}});try{const I=((v=e.settings)==null?void 0:v.model)||((m=a.find(N=>N.type==="Chat"))==null?void 0:m.id)||"",R=a.find(N=>N.id===I),A=(R==null?void 0:R.key)||o,O=((R==null?void 0:R.url)||"https://ai.comfly.chat").replace(/\/+$/,"");if(!A)throw new Error("请先配置 API Key");const F=setInterval(()=>{var N;n(e.id,{settings:{...e.settings,isAnalyzing:!0,progress:Math.min((((N=e.settings)==null?void 0:N.progress)||0)+10,90)}})},500),L=await fetch(`${O}/v1/chat/completions`,{method:"POST",headers:{Authorization:`Bearer ${A}`,"Content-Type":"application/json"},body:JSON.stringify({model:(R==null?void 0:R.modelName)||"gemini-3-pro-preview",messages:[{role:"system",content:'你是一个专业的小说分析助手。请分析以下小说内容,提取其中的角色和场景。以JSON格式返回,格式为:{"characters": [{"id": "char1", "name": "角色名", "role": "主角/配角/反派"}], "scenes": [{"id": "scene1", "name": "场景名"}]}'},{role:"user",content:`请分析以下小说内容,提取角色和场景: + +${y.substring(0,5e3)}`}],stream:!1})});if(clearInterval(F),!L.ok)throw new Error(`API Error: ${L.status}`);const X=await L.json();let T=((E=(C=(z=X.choices)==null?void 0:z[0])==null?void 0:C.message)==null?void 0:E.content)||X.content||X.text||"",q={characters:[],scenes:[]};try{const N=T.match(/\{[\s\S]*\}/);N&&(q=JSON.parse(N[0]))}catch{console.error("解析分析结果失败")}n(e.id,{settings:{...e.settings,isAnalyzing:!1,progress:100,analysisResults:q}});const H=e.x+e.width+100,J=e.y,Z=Date.now(),B=[],V=[];if(q.characters&&q.characters.length>0&&q.characters.forEach((N,j)=>{const k=`node-char-desc-${Z}-${j}`;B.push({id:k,type:"character-description",x:H,y:J+j*450,width:400,height:400,content:"",prompt:"",settings:{characterId:N.id,characterName:N.name,role:N.role,description:N.description,duration:"15s",style:"none",mode:"video",prompt:`动漫风格,全身视角,名叫${N.name}的角色站在白色背景前,${N.description||""},正在用中文普通话面向镜头做自我介绍`}});const W=`node-char-video-${Z}-${j}`;B.push({id:W,type:"generate-character-video",x:H+420,y:J+j*450,width:400,height:450,content:"",prompt:"",settings:{model:"sora-2",duration:"15s",ratio:"16:9"}});const M=`node-char-create-${Z}-${j}`;B.push({id:M,type:"create-character",x:H+840,y:J+j*450,width:350,height:300,content:"",prompt:"",settings:{name:N.name,startSecond:1,endSecond:3}}),V.push({id:`conn-char-${Z}-${j}`,from:e.id,to:k}),V.push({id:`conn-video-${Z}-${j}`,from:k,to:W}),V.push({id:`conn-create-${Z}-${j}`,from:W,to:M})}),q.scenes&&q.scenes.length>0){const N=q.characters?q.characters.length:0;q.scenes.forEach((j,k)=>{const W=`node-scene-desc-${Z}-${k}`;B.push({id:W,type:"scene-description",x:H,y:J+(N+k)*450,width:400,height:400,content:"",prompt:"",settings:{sceneId:j.id,sceneName:j.name,description:j.description,duration:"15s",style:"none",mode:"video",prompt:j.description||j.name}});const M=`node-scene-video-${Z}-${k}`;B.push({id:M,type:"generate-scene-video",x:H+420,y:J+(N+k)*450,width:400,height:450,content:"",prompt:"",settings:{model:"sora-2",duration:"15s",ratio:"16:9"}});const Y=`node-scene-create-${Z}-${k}`;B.push({id:Y,type:"create-scene",x:H+840,y:J+(N+k)*450,width:350,height:300,content:"",prompt:"",settings:{name:j.name,startSecond:1,endSecond:3}}),V.push({id:`conn-scene-${Z}-${k}`,from:e.id,to:W}),V.push({id:`conn-scene-video-${Z}-${k}`,from:W,to:M}),V.push({id:`conn-scene-create-${Z}-${k}`,from:M,to:Y})})}B.length>0&&(r(N=>[...N,...B]),i(N=>[...N,...V]))}catch(I){console.error("分析失败:",I),n(e.id,{settings:{...e.settings,isAnalyzing:!1,progress:0}}),alert(`分析失败: ${I instanceof Error?I.message:"未知错误"}`)}};return s.jsxs("div",{className:`relative w-full h-full flex flex-col transition-colors pointer-events-auto ${t?"bg-zinc-900/80":"bg-zinc-100"}`,children:[s.jsxs("div",{className:`flex items-center gap-1.5 px-3 py-2 border-b text-xs font-semibold shrink-0 ${t?"border-zinc-800":"border-zinc-200"}`,children:[s.jsx(Up,{size:12,className:"text-yellow-500"}),s.jsx("span",{children:"提取角色和场景"})]}),s.jsxs("div",{className:"px-3 py-2 shrink-0",children:[s.jsx("div",{className:"text-[10px] text-zinc-500 mb-1",children:"选择分析模型"}),s.jsx("select",{value:((c=e.settings)==null?void 0:c.model)||"",onChange:y=>n(e.id,{settings:{...e.settings||{},model:y.target.value}}),className:`w-full px-2 py-1.5 rounded text-xs border ${t?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,onMouseDown:y=>y.stopPropagation(),children:a.filter(y=>y.type==="Chat").map(y=>s.jsx("option",{value:y.id,children:y.provider},y.id))})]}),s.jsx("div",{className:"flex-1 overflow-auto p-3 min-h-0",children:(u=e.settings)!=null&&u.analysisResults?(()=>{const y=e.settings.analysisResults;return s.jsxs(s.Fragment,{children:[y.characters&&y.characters.length>0&&s.jsxs("div",{className:"mb-3",children:[s.jsxs("div",{className:"text-[10px] font-medium mb-1 text-zinc-500",children:["角色 (",y.characters.length,")"]}),y.characters.map((w,v)=>s.jsx("div",{className:`p-2 rounded mb-1 ${t?"bg-zinc-800":"bg-zinc-50"}`,children:s.jsxs("div",{className:"flex items-center gap-1",children:[s.jsx("span",{className:`w-2 h-2 rounded-full shrink-0 ${v===0?"bg-red-500":v===1?"bg-purple-500":"bg-blue-500"}`}),s.jsxs("span",{className:"text-[11px]",children:[w.name," (",w.role||"未知",")"]})]})},w.id))]}),y.scenes&&y.scenes.length>0&&s.jsxs("div",{children:[s.jsxs("div",{className:"text-[10px] font-medium mb-1 text-zinc-500",children:["场景 (",y.scenes.length,")"]}),y.scenes.map(w=>s.jsx("div",{className:`p-2 rounded mb-1 ${t?"bg-zinc-800":"bg-zinc-50"}`,children:s.jsxs("div",{className:"flex items-center gap-1",children:[s.jsx("span",{className:"w-2 h-2 rounded-full bg-green-500 shrink-0"}),s.jsx("span",{className:"text-[11px]",children:w.name})]})},w.id))]})]})})():s.jsxs("div",{className:"flex flex-col items-center justify-center flex-1 gap-2 text-[11px] text-zinc-500 h-full",children:[s.jsx(Up,{size:24,className:"text-zinc-400"}),s.jsx("span",{children:'点击"提取"按钮开始分析'})]})}),s.jsxs("div",{className:`px-3 py-2 border-t shrink-0 ${t?"border-zinc-800":"border-zinc-200"}`,children:[!!((d=e.settings)!=null&&d.isAnalyzing)&&s.jsxs("div",{className:"mb-2",children:[s.jsx("div",{className:"text-[10px] mb-1 text-zinc-500",children:"正在分析小说内容..."}),s.jsx("div",{className:`w-full h-1.5 rounded-full overflow-hidden ${t?"bg-zinc-800":"bg-zinc-200"}`,children:s.jsx("div",{className:"h-full bg-blue-500 transition-all duration-300",style:{width:`${((h=e.settings)==null?void 0:h.progress)||0}%`}})}),s.jsxs("div",{className:"text-[10px] text-zinc-500 mt-1",children:[((p=e.settings)==null?void 0:p.progress)||0,"% 完成"]})]}),s.jsx("button",{id:`extract-button-${e.id}`,className:`w-full py-2 rounded text-xs font-medium transition-colors ${(f=e.settings)!=null&&f.isAnalyzing?"bg-zinc-400 cursor-not-allowed text-white":t?"bg-gradient-to-r from-blue-600 to-indigo-600 hover:from-blue-500 hover:to-indigo-500 text-white":"bg-blue-600 hover:bg-blue-500 text-white"}`,disabled:!!((b=e.settings)!=null&&b.isAnalyzing),onMouseDown:y=>y.stopPropagation(),onClick:l,children:(g=e.settings)!=null&&g.isAnalyzing?"分析中...":"提取"})]})]})},Mle=({node:e,isDark:t,updateNode:n,setNodes:r,setConnections:i,apiConfigs:a,globalApiKey:o,filterJimengModels:l})=>{var C,E,I,R,A,O,F,L,X,T,q,H,J,Z,B,V,N,j,k,W,M,Y,se,ie,oe;const c=e.type==="character-description",u=c?"角色描述":"场景描述",d=_.useRef(null),h=_.useRef(null);_.useEffect(()=>{const re=async ee=>{var te,ge;if(!h.current)return;const pe=document.activeElement;if(!(h.current===pe||h.current.contains(pe)))return;console.log("[DescriptionNode] Global paste event triggered");const me=Array.from(((te=ee.clipboardData)==null?void 0:te.items)||[]).filter(ne=>ne.type&&ne.type.startsWith("image/"));if(console.log("[DescriptionNode] Found image items:",me.length),me.length===0){console.log("[DescriptionNode] No image items in clipboard");return}ee.preventDefault(),ee.stopPropagation();const ue=((ge=e.settings)==null?void 0:ge.referenceImages)||[],U=Math.max(0,4-ue.length),G=me.slice(0,U);if(G.length===0){console.log("[DescriptionNode] Already have 4 images, cannot add more");return}console.log("[DescriptionNode] Processing",G.length,"images");try{const ne=await Promise.all(G.map(le=>new Promise((fe,be)=>{const de=le.getAsFile();if(!de){be(new Error("Failed to get file"));return}const $e=new FileReader;$e.onload=ze=>{var _e;fe((_e=ze.target)==null?void 0:_e.result)},$e.onerror=()=>{be(new Error("Failed to read file"))},$e.readAsDataURL(de)})));console.log("[DescriptionNode] Successfully processed",ne.length,"images"),n(e.id,{settings:{...e.settings,referenceImages:[...ue,...ne]}})}catch(ne){console.error("[DescriptionNode] Failed to process images:",ne)}};return document.addEventListener("paste",re),()=>{document.removeEventListener("paste",re)}},[e.id,e.settings,n]);const p=[{value:"none",label:"无"},{value:"2d-anime",label:"2D动漫"},{value:"3d-anime",label:"3D动漫"},{value:"realistic",label:"写实"},{value:"selfie",label:"自拍"},{value:"news",label:"新闻"},{value:"manga",label:"漫画"}],f=["10s","15s"],b=re=>{switch(re){case"2d-anime":return"2D动漫风格";case"3d-anime":return"3D动漫风格";case"realistic":return"写实风格";case"selfie":return"自拍风格";case"news":return"新闻风格";case"manga":return"漫画风格";default:return"动漫风格"}},g=c?`动漫风格,全身视角,名叫${((C=e.settings)==null?void 0:C.characterName)||"{角色名}"}的角色站在白色背景前,${((E=e.settings)==null?void 0:E.description)||""},正在用中文普通话面向镜头做自我介绍`:((I=e.settings)==null?void 0:I.description)||"",y=re=>{if(!re)return"";let ee=re.replace(/["'""「」](.*?)[^,,。;!?、\s]["'""「」]/g,"");return ee=ee.replace(/利用《.*?》游戏.*?/g,""),ee=ee.replace(/内心(.*?)(?=[,。;!?、\s])/g,""),ee=ee.replace(/(推动|拉动|操作|转身|站立|走动|说|介绍|正在|负责|穿着|站在|面对|做)(.*?)(?=[,。;!?、\s])/g,""),ee=ee.replace(/(天命杠杆|战舰|游戏|操作|控制|推进|推动|极低速度|以极低速度|最终|最后|现在|正在|目前|此前|起先|起初)/g,""),ee=ee.replace(/,然后缓慢转一圈360度全方位展示身体/g,""),ee=ee.replace(/(背景|场景|环境|建筑|地点|位置|周围|附近|后面|前面|旁边)(.*?)(?=[,。;!?、\s])/g,""),ee=ee.replace(/,+/g,",").replace(/^,|,$/g,"").trim(),ee},w=re=>{var Q;re.preventDefault(),re.stopPropagation();const ee=Array.from(re.dataTransfer.files||[]);if(ee.length===0)return;const pe=((Q=e.settings)==null?void 0:Q.referenceImages)||[],we=[];ee.slice(0,4-pe.length).forEach(me=>{if(me.type.startsWith("image/")){const ue=new FileReader;ue.onload=U=>{var G;we.push((G=U.target)==null?void 0:G.result),we.length===ee.slice(0,4-pe.length).length&&n(e.id,{settings:{...e.settings,referenceImages:[...pe,...we]}})},ue.readAsDataURL(me)}})},v=async re=>{var U,G;re.preventDefault(),re.stopPropagation(),console.log("[DescriptionNode] Paste event triggered");const pe=Array.from(((U=re.clipboardData)==null?void 0:U.items)||[]).filter(te=>te.type&&te.type.startsWith("image/"));if(console.log("[DescriptionNode] Found image items:",pe.length),pe.length===0){console.log("[DescriptionNode] No image items in clipboard");return}const we=((G=e.settings)==null?void 0:G.referenceImages)||[],Q=Math.max(0,4-we.length),me=pe.slice(0,Q);if(me.length===0){console.log("[DescriptionNode] Already have 4 images, cannot add more");return}console.log("[DescriptionNode] Processing",me.length,"images");const ue=await Promise.all(me.map(te=>new Promise((ge,ne)=>{const le=te.getAsFile();if(!le){ne(new Error("Failed to get file"));return}const fe=new FileReader;fe.onload=be=>{var de;ge((de=be.target)==null?void 0:de.result)},fe.onerror=()=>{ne(new Error("Failed to read file"))},fe.readAsDataURL(le)})));console.log("[DescriptionNode] Successfully processed",ue.length,"images"),n(e.id,{settings:{...e.settings,referenceImages:[...we,...ue]}})},m=async()=>{var Q,me,ue,U,G,te,ge;const re=((Q=e.settings)==null?void 0:Q.prompt)||g;if(!re||re.trim().length===0){alert("请先输入提示词");return}const ee=((me=e.settings)==null?void 0:me.chatModel)||((ue=a.find(ne=>ne.type==="Chat"))==null?void 0:ue.id);if(!ee){alert("请先选择大模型");return}const pe=a.find(ne=>ne.id===ee);if(!pe){alert("未找到大模型配置");return}const we=pe.key||o;if(!we){alert("请先配置API Key");return}n(e.id,{settings:{...e.settings,isEnhancing:!0}});try{const ne=(pe.url||"https://ai.comfly.chat").replace(/\/+$/,""),le=await fetch(`${ne}/v1/chat/completions`,{method:"POST",headers:{Authorization:`Bearer ${we}`,"Content-Type":"application/json"},body:JSON.stringify({model:pe.modelName||"gpt-4o",messages:[{role:"system",content:"你是一个场景描述增强专家。请根据用户提供的场景描述,增加更多细节,包括环境氛围、光线、材质、色彩、空间布局等,但必须确保不包含任何人物、角色、字符。输出应详细且生动,只包含场景特征描述。"},{role:"user",content:re}],temperature:.7})});if(!le.ok)throw new Error("增强场景描述失败");const be=((ge=(te=(G=(U=(await le.json()).choices)==null?void 0:U[0])==null?void 0:G.message)==null?void 0:te.content)==null?void 0:ge.trim())||re;n(e.id,{settings:{...e.settings,prompt:be,isEnhancing:!1}})}catch(ne){console.error("增强场景描述失败:",ne),n(e.id,{settings:{...e.settings,isEnhancing:!1}}),alert("增强场景描述失败,请重试")}},z=()=>{var U,G,te,ge,ne,le,fe,be,de;const re=((U=e.settings)==null?void 0:U.mode)||"video",ee=((G=e.settings)==null?void 0:G.prompt)||g,pe=((te=e.settings)==null?void 0:te.referenceImages)||[];if(!ee.trim()){alert("请输入提示词");return}if(re==="image"){const $e=e.x+e.width+100,ze=e.y+e.height/2,_e=`node-${Date.now()}`,Ee={id:_e,type:c?"generate-character-image":"generate-scene-image",x:$e-200,y:ze-200,width:400,height:450,settings:{model:((ge=e.settings)==null?void 0:ge.imageModel)||((ne=a.find(Ce=>Ce.type==="Image"))==null?void 0:ne.id)||"",prompt:ee,chatModel:(le=e.settings)==null?void 0:le.chatModel,ratio:((fe=e.settings)==null?void 0:fe.imageRatio)||"16:9",resolution:((be=e.settings)==null?void 0:be.imageResolution)||"2K",referenceImages:pe,sourceType:e.type,sourceId:e.id}};r(Ce=>[...Ce,Ee]),i(Ce=>[...Ce,{id:`conn-${Date.now()}`,from:e.id,to:_e}]);return}const we=e.x+e.width+100,Q=e.y+e.height/2,me=`node-${Date.now()}`,ue={id:me,type:c?"generate-character-video":"generate-scene-video",x:we-200,y:Q-200,width:400,height:450,settings:{model:"sora-2",duration:((de=e.settings)==null?void 0:de.duration)||"15s",ratio:"16:9",videoPrompt:ee,referenceImages:pe,sourceType:e.type,sourceId:e.id}};r($e=>[...$e,ue]),i($e=>[...$e,{id:`conn-${Date.now()}`,from:e.id,to:me}])};return s.jsxs("div",{ref:d,className:`relative w-full h-full flex flex-col transition-colors pointer-events-auto ${t?"bg-zinc-900/80":"bg-zinc-100"}`,children:[s.jsxs("div",{className:`flex items-center justify-between px-3 py-2 border-b text-xs font-semibold shrink-0 ${t?"text-zinc-300 border-zinc-800":"text-zinc-700 border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center gap-1.5",children:[s.jsx(Vo,{size:12,className:c?"text-red-500":"text-green-500"}),s.jsx("span",{children:u})]}),c&&((R=e.settings)==null?void 0:R.characterName)&&s.jsxs("div",{className:"text-[10px] text-zinc-500",children:["角色: ",(A=e.settings)==null?void 0:A.characterName]})]}),s.jsxs("div",{className:"flex-1 flex flex-col gap-2 p-3 overflow-hidden min-h-0",children:[s.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[s.jsx("button",{className:`px-2 py-1 rounded text-[10px] transition-colors ${(((O=e.settings)==null?void 0:O.mode)||"video")==="video"?"bg-blue-500 text-white":t?"bg-zinc-800 text-zinc-400 hover:bg-zinc-700":"bg-zinc-100 text-zinc-600 hover:bg-zinc-200"}`,onMouseDown:re=>re.stopPropagation(),onClick:()=>{var ee;const re=((ee=e.settings)==null?void 0:ee.prompt)||g;if(c){const pe=re.includes("360度")?re:re+",然后缓慢转一圈360度全方位展示身体";n(e.id,{settings:{...e.settings,mode:"video",prompt:pe}})}else n(e.id,{settings:{...e.settings,mode:"video"}})},children:"视频模式"}),s.jsx("button",{className:`px-2 py-1 rounded text-[10px] transition-colors ${((F=e.settings)==null?void 0:F.mode)==="image"?"bg-blue-500 text-white":t?"bg-zinc-800 text-zinc-400 hover:bg-zinc-700":"bg-zinc-100 text-zinc-600 hover:bg-zinc-200"}`,onMouseDown:re=>re.stopPropagation(),onClick:()=>{var ee;const re=((ee=e.settings)==null?void 0:ee.prompt)||g;if(c){const pe=re.replace(/,然后缓慢转一圈360度全方位展示身体/g,"");n(e.id,{settings:{...e.settings,mode:"image",prompt:pe}})}else n(e.id,{settings:{...e.settings,mode:"image"}})},children:"图片模式"})]}),s.jsxs("div",{className:"flex-1 flex flex-col gap-1 min-h-0",children:[s.jsxs("div",{className:"flex items-center justify-between shrink-0",children:[s.jsx("span",{className:"text-[10px] text-zinc-500",children:"提示词"}),s.jsxs("div",{className:"flex items-center gap-2",children:[!c&&s.jsx("button",{className:"text-[10px] text-purple-500 hover:text-purple-400",onMouseDown:re=>re.stopPropagation(),disabled:!!((L=e.settings)!=null&&L.isEnhancing),onClick:m,children:(X=e.settings)!=null&&X.isEnhancing?"增强中...":"增强提示词"}),s.jsx("button",{className:"text-[10px] text-blue-500 hover:text-blue-400",onMouseDown:re=>re.stopPropagation(),disabled:!!((T=e.settings)!=null&&T.isFiltering),onClick:()=>{var ee;const re=((ee=e.settings)==null?void 0:ee.prompt)||g;if(!re){alert("请先输入提示词");return}n(e.id,{settings:{...e.settings,isFiltering:!0}});try{const pe=y(re);n(e.id,{settings:{...e.settings,prompt:pe,isFiltering:!1}})}catch{n(e.id,{settings:{...e.settings,isFiltering:!1}}),alert("过滤提示词失败")}},children:(q=e.settings)!=null&&q.isFiltering?"过滤中...":"过滤提示词"})]})]}),s.jsx("textarea",{value:((H=e.settings)==null?void 0:H.prompt)||g,onChange:re=>{n(e.id,{settings:{...e.settings,prompt:re.target.value}})},placeholder:`输入${c?"角色":"场景"}描述...`,className:`flex-1 w-full p-2 rounded text-xs resize-none outline-none min-h-[80px] ${t?"bg-zinc-800 text-zinc-200 placeholder-zinc-500 border border-zinc-700":"bg-white text-zinc-800 placeholder-zinc-400 border border-zinc-300"}`,style:{minHeight:"100px",maxHeight:"200px",overflowY:"auto",resize:"vertical"},onMouseDown:re=>re.stopPropagation()})]}),(((J=e.settings)==null?void 0:J.mode)||"video")==="video"?s.jsxs("div",{className:"flex items-center justify-between shrink-0",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:"text-[10px] text-zinc-500",children:"时长"}),f.map(re=>{var ee;return s.jsx("button",{className:`px-2 py-0.5 rounded text-[10px] ${(((ee=e.settings)==null?void 0:ee.duration)||"15s")===re?"bg-blue-500 text-white":t?"bg-zinc-800 text-zinc-400":"bg-zinc-200 text-zinc-600"}`,onMouseDown:pe=>pe.stopPropagation(),onClick:()=>n(e.id,{settings:{...e.settings,duration:re}}),children:re},re)})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:"text-[10px] text-zinc-500",children:"风格"}),s.jsx("select",{value:((Z=e.settings)==null?void 0:Z.style)||"none",onChange:re=>{var me;const ee=re.target.value,pe=b(ee),Q=(((me=e.settings)==null?void 0:me.prompt)||g).replace(/^[^,]+,/,`${pe},`);n(e.id,{settings:{...e.settings,style:ee,prompt:Q}})},className:`px-2 py-0.5 rounded text-[10px] ${t?"bg-zinc-800 text-zinc-300 border-zinc-700":"bg-white text-zinc-700 border-zinc-300"} border`,onMouseDown:re=>re.stopPropagation(),children:p.map(re=>s.jsx("option",{value:re.value,children:re.label},re.value))})]})]}):s.jsxs("div",{className:"flex flex-col gap-2 shrink-0",children:[s.jsxs("div",{children:[s.jsx("span",{className:"text-[10px] block mb-1 text-zinc-500",children:"模型"}),s.jsxs("select",{value:((B=e.settings)==null?void 0:B.imageModel)||"",onChange:re=>n(e.id,{settings:{...e.settings,imageModel:re.target.value}}),className:`w-full text-[10px] px-2 py-1 rounded border ${t?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,onMouseDown:re=>re.stopPropagation(),children:[s.jsx("option",{value:"",children:"选择模型"}),(l?l(a.filter(re=>re.type==="Image")):a.filter(re=>re.type==="Image")).map(re=>s.jsx("option",{value:re.id,children:re.provider},re.id))]})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsxs("div",{className:"flex-1",children:[s.jsx("span",{className:"text-[10px] block mb-1 text-zinc-500",children:"比例"}),s.jsxs("select",{value:((V=e.settings)==null?void 0:V.imageRatio)||"16:9",onChange:re=>n(e.id,{settings:{...e.settings,imageRatio:re.target.value}}),className:`w-full text-[10px] px-2 py-1 rounded border ${t?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,onMouseDown:re=>re.stopPropagation(),children:[s.jsx("option",{value:"Auto",children:"Auto"}),s.jsx("option",{value:"1:1",children:"1:1"}),s.jsx("option",{value:"16:9",children:"16:9"}),s.jsx("option",{value:"9:16",children:"9:16"}),s.jsx("option",{value:"4:3",children:"4:3"}),s.jsx("option",{value:"3:4",children:"3:4"}),s.jsx("option",{value:"21:9",children:"21:9"}),s.jsx("option",{value:"3:2",children:"3:2"}),s.jsx("option",{value:"2:3",children:"2:3"})]})]}),s.jsxs("div",{className:"flex-1",children:[s.jsx("span",{className:"text-[10px] block mb-1 text-zinc-500",children:"分辨率"}),s.jsxs("select",{value:((N=e.settings)==null?void 0:N.imageResolution)||"2K",onChange:re=>n(e.id,{settings:{...e.settings,imageResolution:re.target.value}}),className:`w-full text-[10px] px-2 py-1 rounded border ${t?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,onMouseDown:re=>re.stopPropagation(),children:[s.jsx("option",{value:"2K",children:"2K"}),s.jsx("option",{value:"4K",children:"4K"})]})]})]})]}),s.jsxs("div",{className:"shrink-0",children:[s.jsxs("div",{className:"flex items-center justify-between mb-1",children:[s.jsx("span",{className:"text-[10px] text-zinc-500",children:"参考图"}),s.jsx("button",{className:"text-[10px] text-blue-500 hover:text-blue-400",type:"button",onClick:re=>{var ee;re.stopPropagation(),(ee=document.getElementById(`ref-upload-${e.id}`))==null||ee.click()},onMouseDown:re=>re.stopPropagation(),children:"+ 添加参考图"}),s.jsx("input",{id:`ref-upload-${e.id}`,type:"file",multiple:!0,accept:"image/*,.jpg,.jpeg,.png,.gif,.webp,.bmp,.svg",className:"hidden",onChange:re=>{var Q;const ee=Array.from(re.target.files||[]);if(ee.length===0)return;const pe=((Q=e.settings)==null?void 0:Q.referenceImages)||[],we=[];ee.slice(0,4-pe.length).forEach(me=>{if(me.type.startsWith("image/")){const ue=new FileReader;ue.onload=U=>{var G;we.push((G=U.target)==null?void 0:G.result),we.length===ee.slice(0,4-pe.length).length&&n(e.id,{settings:{...e.settings,referenceImages:[...pe,...we]}})},ue.readAsDataURL(me)}})}})]}),s.jsx("div",{ref:h,tabIndex:0,className:`h-20 border rounded overflow-hidden flex items-center justify-center outline-none focus:ring-2 focus:ring-blue-500 ${t?"border-zinc-700":"border-zinc-300"}`,onClick:re=>{re.stopPropagation(),re.currentTarget.focus()},onPaste:v,onDragOver:re=>{re.preventDefault(),re.stopPropagation()},onDrop:w,onMouseDown:re=>{re.currentTarget.focus()},children:(((j=e.settings)==null?void 0:j.referenceImages)||[]).length>0?s.jsx("div",{className:"flex gap-1 overflow-x-auto w-full h-full p-1",children:(((k=e.settings)==null?void 0:k.referenceImages)||[]).map((re,ee)=>s.jsxs("div",{className:"relative w-16 h-16 flex-shrink-0",children:[s.jsx("img",{src:re,alt:`Reference ${ee+1}`,className:"w-full h-full object-cover rounded",onMouseDown:pe=>pe.stopPropagation()}),s.jsx("button",{className:"absolute top-0 right-0 bg-red-500 text-white text-[10px] p-0.5 rounded-bl",onClick:pe=>{var Q;pe.stopPropagation();const we=(((Q=e.settings)==null?void 0:Q.referenceImages)||[]).filter((me,ue)=>ue!==ee);n(e.id,{settings:{...e.settings,referenceImages:we}})},onMouseDown:pe=>pe.stopPropagation(),children:"×"})]},ee))}):s.jsx("span",{className:`text-xs ${t?"text-zinc-400":"text-zinc-500"}`,children:"拖放图片到此处、点击添加,或 Ctrl+V 粘贴"})})]}),((W=e.settings)==null?void 0:W.mode)==="image"&&((M=e.settings)==null?void 0:M.generatedImage)&&s.jsxs("div",{className:"shrink-0",children:[s.jsxs("div",{className:"flex items-center justify-between mb-1",children:[s.jsx("span",{className:"text-[10px] text-zinc-500",children:"生成结果"}),s.jsx("button",{className:"text-[10px] text-red-500 hover:text-red-400",onClick:re=>{re.stopPropagation(),n(e.id,{settings:{...e.settings,generatedImage:void 0}})},onMouseDown:re=>re.stopPropagation(),children:"清除"})]}),s.jsxs("div",{className:`relative h-32 border rounded overflow-hidden ${t?"border-green-700 bg-green-900/20":"border-green-300 bg-green-50"}`,children:[s.jsx("img",{src:(Y=e.settings)==null?void 0:Y.generatedImage,alt:"Generated",className:"w-full h-full object-contain",onMouseDown:re=>re.stopPropagation()}),s.jsx("div",{className:"absolute bottom-1 right-1 text-[9px] text-green-500 bg-black/50 px-1 rounded",children:"右键可发送到画布"})]})]})]}),s.jsx("div",{className:`px-3 py-2 border-t shrink-0 ${t?"border-zinc-800":"border-zinc-200"}`,children:s.jsx("button",{className:`w-full py-2 rounded text-xs font-medium text-white transition-colors ${(se=e.settings)!=null&&se.isGenerating?"bg-zinc-500 cursor-not-allowed":"bg-gradient-to-r from-green-600 to-emerald-600 hover:from-green-500 hover:to-emerald-500"}`,onMouseDown:re=>re.stopPropagation(),disabled:!!((ie=e.settings)!=null&&ie.isGenerating),onClick:re=>{re.preventDefault(),re.stopPropagation(),z()},children:((oe=e.settings)==null?void 0:oe.mode)==="image"?c?"生成角色图片":"生成场景图片":"生成视频"})})]})};function Tle(e){return String((e==null?void 0:e.ratio)??"Auto")}function Rle(e){return String((e==null?void 0:e.batchSize)??1)}const Ple=["nano-banana","nano-banana-2","gpt-image","gpt-image-1.5","flux-kontext","z-image-turbo","z-image-official"],Ole=({node:e,nodes:t,connections:n,isDark:r,updateNode:i,setNodes:a,setHistory:o,apiConfigs:l,globalApiKey:c,connectingSource:u,connectingTarget:d,connectingInputType:h,setConnectingSource:p,setConnectingTarget:f,setConnectingInputType:b,setConnections:g,setMousePos:y,canvasRef:w,view:v,getConnectedImageForInput:m,generate:z,generateId:C})=>{var V,N,j,k,W,M,Y,se,ie,oe,re,ee,pe,we,Q,me,ue,U,G,te,ge;const E=e.type==="generate-character-image",I=E?"生成角色图片":"生成场景图片",R=fr.useRef(null),A=_.useMemo(()=>{if(!n||!t)return[];const ne=n.reduce((de,$e)=>{if($e.to===e.id&&(!$e.inputType||$e.inputType==="default")){const ze=$e.to;de.has(ze)||de.set(ze,[]),de.get(ze).push($e)}return de},new Map),le=new Map(t.map(de=>[de.id,de])),fe=[],be=ne.get(e.id)||[];for(const de of be){const $e=le.get(de.from);($e==null?void 0:$e.type)==="text-node"&&fe.push($e)}return fe},[e.id,n,t]),O=_.useMemo(()=>{if(!n||!t)return[];const ne=n.reduce((de,$e)=>{if($e.to===e.id&&(!$e.inputType||$e.inputType==="default")){const ze=$e.to;de.has(ze)||de.set(ze,[]),de.get(ze).push($e)}return de},new Map),le=new Map(t.map(de=>[de.id,de])),fe=[],be=ne.get(e.id)||[];for(const de of be){const $e=le.get(de.from);($e==null?void 0:$e.type)==="custom-agent"&&fe.push($e)}return fe},[e.id,n,t]),F=_.useMemo(()=>{var fe,be;const ne=new Map(t.map(de=>[de.id,de])),le=[];if(A.length>0)for(const de of A){const $e=ne.get(de.id)||de,ze=((fe=$e.settings)==null?void 0:fe.text)||"",_e=$e.prompt||"",Ee=(ze||_e).trim();Ee.length>0&&le.push(Ee)}if(O.length>0)for(const de of O){const ze=(((be=(ne.get(de.id)||de).settings)==null?void 0:be.outputContent)||"").trim();ze.length>0&&le.push(ze)}return le.join(` + +`)},[A,O,t]),L=(ne,le)=>{var be;ne.stopPropagation(),ne.preventDefault();const fe=(be=w.current)==null?void 0:be.getBoundingClientRect();if(fe){const de=(ne.clientX-fe.left-v.x)/v.zoom,$e=(ne.clientY-fe.top-v.y)/v.zoom;y({x:de,y:$e})}f(e.id),b(le)},X=(ne,le)=>{ne.stopPropagation(),u&&u!==e.id&&(n.some(be=>be.from===u&&be.to===e.id&&be.inputType===le)||(g(be=>be.filter(de=>!(de.to===e.id&&de.inputType===le))),g(be=>[...be,{id:le==="oref"||le==="sref"?C():`conn-${Date.now()}`,from:u,to:e.id,inputType:le}])),p(null))},T=((V=e.settings)==null?void 0:V.model)||"qwen-image-edit";l.find(ne=>ne.id===T);const q=T.includes("mj-")||T.toLowerCase().includes("midjourney"),H=q?m(e.id,"oref"):null,J=q?m(e.id,"sref"):null,Z=((N=e.settings)==null?void 0:N.imageUrls)||((j=e.settings)!=null&&j.imageUrl||e.content?[((k=e.settings)==null?void 0:k.imageUrl)||e.content]:[]),B=((W=e.settings)==null?void 0:W.selectedImageIndex)??null;return s.jsx("div",{className:`relative w-full h-full flex flex-col transition-colors pointer-events-auto overflow-hidden ${r?"bg-zinc-900/80":"bg-zinc-100"}`,children:s.jsxs(s.Fragment,{children:[s.jsxs("div",{className:`flex items-center gap-1.5 px-3 py-2 border-b text-xs font-semibold shrink-0 ${r?"text-zinc-300 border-zinc-800":"text-zinc-700 border-zinc-200"}`,children:[s.jsx(Vo,{size:12,className:"text-blue-500"}),s.jsx("span",{children:I})]}),s.jsxs("div",{className:"flex-1 flex flex-col gap-3 p-3 overflow-y-auto min-h-0",children:[s.jsxs("div",{children:[s.jsx("label",{className:"text-[10px] block mb-1 text-zinc-500",children:E?"大模型选择(用于提示词过滤)":"大模型选择(用于过滤人物、字符描述)"}),s.jsxs("select",{value:((M=e.settings)==null?void 0:M.chatModel)||"",onChange:ne=>i(e.id,{settings:{...e.settings,chatModel:ne.target.value}}),className:`w-full px-2 py-1 rounded text-xs border ${r?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,onMouseDown:ne=>ne.stopPropagation(),children:[s.jsx("option",{value:"",children:"选择大模型(可选)"}),l.filter(ne=>ne.type==="Chat").map(ne=>s.jsx("option",{value:ne.id,children:ne.provider},ne.id))]})]}),s.jsxs("div",{children:[s.jsx("label",{className:"text-[10px] block mb-1 text-zinc-500",children:"选择模型"}),s.jsxs("select",{value:((Y=e.settings)==null?void 0:Y.model)||"qwen-image-edit",onChange:ne=>i(e.id,{settings:{...e.settings,model:ne.target.value}}),className:`w-full px-2 py-1 rounded text-xs border ${r?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,onMouseDown:ne=>ne.stopPropagation(),children:[s.jsx("option",{value:"",children:"选择模型"}),l.filter(ne=>ne.type==="Image").map(ne=>{var le,fe,be;return s.jsxs("option",{value:ne.id,children:[ne.provider,((le=ne.provider)!=null&&le.startsWith("Seedream")||(fe=ne.provider)!=null&&fe.startsWith("Seedance"))&&!((be=ne.provider)!=null&&be.includes("API"))?" Official":""]},ne.id)})]})]}),(((se=e.settings)==null?void 0:se.referenceImages)??[]).length>0?s.jsxs("div",{className:`flex items-center gap-1.5 px-2 py-1 rounded text-[10px] ${r?"bg-green-900/30 border border-green-700":"bg-green-50 border border-green-200"}`,children:[s.jsx("span",{className:"text-green-500",children:"✅"}),s.jsxs("span",{className:r?"text-green-400":"text-green-700",children:["引用图片成功 (",String((((ie=e.settings)==null?void 0:ie.referenceImages)??[]).length),"张)"]})]}):null,A.length>0||O.length>0?s.jsxs("div",{className:`flex items-center gap-1.5 px-2 py-1 rounded text-[10px] ${r?"bg-blue-900/30 border border-blue-700":"bg-blue-50 border border-blue-200"}`,children:[s.jsx("span",{className:"text-blue-500",children:"📝"}),s.jsxs("span",{className:r?"text-blue-400":"text-blue-700",children:["上游已连接:",A.length>0?s.jsxs("span",{children:["文字节点(",A.length,"个)"]}):null,A.length>0&&O.length>0?s.jsx("span",{children:" + "}):null,O.length>0?s.jsxs("span",{children:["Agent节点(",O.length,"个)"]}):null]})]}):null,s.jsxs("div",{className:"space-y-3",children:[s.jsxs("div",{children:[s.jsx("label",{className:"text-[10px] block mb-1 text-zinc-500",children:"比例"}),s.jsxs("select",{value:Tle(e.settings),onChange:ne=>i(e.id,{settings:{...e.settings||{},ratio:ne.target.value}}),className:`w-full px-2 py-1 rounded text-xs border ${r?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,onMouseDown:ne=>ne.stopPropagation(),children:[s.jsx("option",{value:"Auto",children:"Auto"}),s.jsx("option",{value:"1:1",children:"1:1"}),s.jsx("option",{value:"16:9",children:"16:9"}),s.jsx("option",{value:"9:16",children:"9:16"}),s.jsx("option",{value:"4:3",children:"4:3"}),s.jsx("option",{value:"3:4",children:"3:4"}),s.jsx("option",{value:"21:9",children:"21:9"}),s.jsx("option",{value:"3:2",children:"3:2"}),s.jsx("option",{value:"2:3",children:"2:3"})]})]}),Ple.includes(String(((oe=e.settings)==null?void 0:oe.model)??""))?s.jsxs("div",{children:[s.jsx("label",{className:"text-[10px] block mb-1 text-zinc-500",children:"生成数量"}),s.jsxs("select",{value:Rle(e.settings),onChange:ne=>i(e.id,{settings:{...e.settings||{},batchSize:parseInt(ne.target.value)}}),className:`w-full px-2 py-1 rounded text-xs border ${r?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,onMouseDown:ne=>ne.stopPropagation(),children:[s.jsx("option",{value:1,children:"1张 (默认)"}),s.jsx("option",{value:2,children:"2张"}),s.jsx("option",{value:4,children:"4张 (2x2)"}),s.jsx("option",{value:9,children:"9张 (3x3)"})]})]}):null]}),q&&s.jsxs(s.Fragment,{children:[s.jsxs("div",{children:[s.jsx("label",{className:"text-[10px] block mb-1 text-zinc-500",children:"MJ 版本"}),s.jsx("select",{value:((re=e.settings)==null?void 0:re.mjVersion)||"--v 6.1",onChange:ne=>i(e.id,{settings:{...e.settings,mjVersion:ne.target.value}}),className:`w-full px-2 py-1 rounded text-xs border ${r?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,onMouseDown:ne=>ne.stopPropagation(),children:Kz.map(ne=>s.jsx("option",{value:ne.value,children:ne.label},ne.value))})]}),s.jsxs("div",{className:"flex flex-col gap-1.5",children:[s.jsxs("div",{className:"relative flex items-center gap-1.5",children:[s.jsx("div",{className:`w-2 h-2 rounded-full cursor-crosshair transition-all ${d===e.id&&h==="oref"?"bg-blue-500 ring-2 ring-blue-400":r?"bg-zinc-600 hover:bg-zinc-500":"bg-zinc-400 hover:bg-zinc-500"}`,style:{position:"absolute",left:"-4px",top:"50%",transform:"translateY(-50%)",zIndex:20},title:"oref输入 - 点击开始连接","data-input-type":"oref",onMouseDown:ne=>L(ne,"oref"),onMouseUp:ne=>X(ne,"oref")}),s.jsxs("div",{className:"flex items-center gap-1.5 flex-1 ml-2",children:[s.jsx("span",{className:`text-[10px] font-medium ${r?"text-zinc-400":"text-zinc-600"}`,children:"oref"}),H&&s.jsx("div",{className:"w-1.5 h-1.5 rounded-full bg-green-500"})]})]}),s.jsxs("div",{className:"relative flex items-center gap-1.5",children:[s.jsx("div",{className:"w-2 h-2 mr-1 ml-2"}),s.jsxs("div",{className:"flex items-center gap-1.5 flex-1",children:[s.jsx("span",{className:`text-[10px] font-medium ${r?"text-zinc-400":"text-zinc-600"}`,children:"ow"}),((ee=e.settings)==null?void 0:ee.mjOw)>0&&s.jsx("div",{className:"w-1.5 h-1.5 rounded-full bg-green-500"})]}),s.jsx("input",{type:"number",min:"1",max:"1000",placeholder:"1-1000",value:((pe=e.settings)==null?void 0:pe.mjOw)||"",onChange:ne=>{const le=parseInt(ne.target.value,10);isNaN(le)||le<1?i(e.id,{settings:{...e.settings,mjOw:void 0}}):le>1e3?i(e.id,{settings:{...e.settings,mjOw:1e3}}):i(e.id,{settings:{...e.settings,mjOw:le}})},onMouseDown:ne=>ne.stopPropagation(),className:`flex-1 px-2 py-1 rounded text-[10px] border outline-none focus:border-blue-500/50 ${r?"bg-zinc-900/50 border-zinc-700 text-zinc-300 placeholder-zinc-600":"bg-white border-zinc-300 text-zinc-800 placeholder-zinc-400"}`})]}),s.jsxs("div",{className:"relative flex items-center gap-1.5",children:[s.jsx("div",{className:`w-2 h-2 rounded-full cursor-crosshair transition-all ${d===e.id&&h==="sref"?"bg-blue-500 ring-2 ring-blue-400":r?"bg-zinc-600 hover:bg-zinc-500":"bg-zinc-400 hover:bg-zinc-500"}`,style:{position:"absolute",left:"-4px",top:"50%",transform:"translateY(-50%)",zIndex:20},title:"sref输入 - 点击开始连接","data-input-type":"sref",onMouseDown:ne=>L(ne,"sref"),onMouseUp:ne=>X(ne,"sref")}),s.jsxs("div",{className:"flex items-center gap-1.5 flex-1 ml-2",children:[s.jsx("span",{className:`text-[10px] font-medium ${r?"text-zinc-400":"text-zinc-600"}`,children:"sref"}),J&&s.jsx("div",{className:"w-1.5 h-1.5 rounded-full bg-green-500"})]})]})]})]}),s.jsxs("div",{children:[s.jsx("label",{className:"text-[10px] block mb-1 text-zinc-500",children:"提示词"}),s.jsx("textarea",{ref:R,"data-node-id":e.id,"data-scrollable":"true",value:((we=e.settings)==null?void 0:we.prompt)||"",onChange:ne=>{const le=ne.target.value;i(e.id,{settings:{...e.settings,prompt:le}})},placeholder:(A.length>0||O.length>0,"输入提示词..."),className:`w-full h-20 resize-none outline-none text-sm p-3 rounded ${r?"bg-zinc-900/50 text-zinc-200 placeholder-zinc-600":"bg-transparent text-zinc-800 placeholder-zinc-400"}`,onMouseDown:ne=>ne.stopPropagation()})]}),Z.length>0?s.jsxs("div",{className:"relative w-full",children:[Z.length>1?s.jsx("div",{className:"grid grid-cols-2 gap-2",children:Z.map((ne,le)=>s.jsxs("div",{className:`relative aspect-square bg-black rounded-lg overflow-hidden cursor-pointer transition-all ${B===le?"ring-2 ring-blue-500 ring-offset-2":"hover:ring-1 hover:ring-zinc-400"}`,onClick:fe=>{fe.stopPropagation();const be=B===le?null:le;i(e.id,{settings:{...e.settings,selectedImageIndex:be}})},onContextMenu:fe=>{fe.preventDefault(),fe.stopPropagation();const de={id:`node-${Date.now()}`,type:"input-image",x:e.x+e.width+50,y:e.y,width:400,height:300,content:ne,settings:{}};a($e=>[...$e,de])},onMouseDown:fe=>fe.stopPropagation(),children:[s.jsx("img",{src:ne,alt:`Generated ${le+1}`,className:"w-full h-full object-contain"}),s.jsxs("div",{className:"absolute top-1 left-1 bg-black/50 text-white text-[10px] px-1 py-0.5 rounded",children:[le+1,"/",Z.length]}),B===le&&s.jsx("div",{className:"absolute top-1 right-1 bg-blue-500 text-white text-[10px] px-1 py-0.5 rounded",children:"✓ 已选中"})]},le))}):s.jsx("div",{className:"relative w-full aspect-video bg-black rounded-lg overflow-hidden cursor-pointer",onContextMenu:ne=>{ne.preventDefault(),ne.stopPropagation();const fe={id:`node-${Date.now()}`,type:"input-image",x:e.x+e.width+50,y:e.y,width:400,height:300,content:Z[0],settings:{}};a(be=>[...be,fe])},onMouseDown:ne=>ne.stopPropagation(),children:s.jsx("img",{src:Z[0],alt:"Generated",className:"w-full h-full object-contain"})}),Z.length>1&&s.jsx("div",{className:`mt-2 px-2 py-1 rounded text-[10px] ${r?"bg-zinc-800/50 border border-zinc-700":"bg-zinc-100 border border-zinc-300"}`,children:s.jsx("span",{className:r?"text-zinc-400":"text-zinc-600",children:"💡 右键图片可发送到画布"})})]}):s.jsx("div",{className:`w-full aspect-video rounded border-2 border-dashed flex items-center justify-center ${r?"border-zinc-700":"border-zinc-300"}`,children:s.jsx("span",{className:`text-sm ${r?"text-zinc-400":"text-zinc-500"}`,children:'点击"生成"按钮开始生成'})}),((Q=e.settings)==null?void 0:Q.isGenerating)&&s.jsxs("div",{className:"mb-2",children:[s.jsx("div",{className:"text-[10px] mb-1 text-zinc-500",children:"正在生成图片..."}),s.jsx("div",{className:`w-full h-1.5 rounded-full overflow-hidden ${r?"bg-zinc-800":"bg-zinc-200"}`,children:s.jsx("div",{className:"h-full bg-blue-500 transition-all duration-300",style:{width:`${((me=e.settings)==null?void 0:me.progress)||0}%`}})}),s.jsxs("div",{className:"text-[10px] text-zinc-500 mt-1",children:[((ue=e.settings)==null?void 0:ue.progress)||0,"% 完成"]})]}),((U=e.settings)==null?void 0:U.error)&&s.jsx("div",{className:"text-[10px] text-red-500",children:e.settings.error})]}),s.jsx("div",{className:`px-3 py-2 border-t shrink-0 ${r?"border-zinc-800":"border-zinc-200"}`,children:s.jsx("button",{className:`w-full py-2 rounded text-xs font-medium transition-colors ${(G=e.settings)!=null&&G.isGenerating?"bg-zinc-400 cursor-not-allowed text-white":"bg-blue-600 hover:bg-blue-500 text-white"}`,disabled:!!((te=e.settings)!=null&&te.isGenerating),onMouseDown:ne=>ne.stopPropagation(),onClick:async()=>{var Ee,Ce,xe,Ne,ve,ke,Ie,Pe,Te;const ne=((Ee=e.settings)==null?void 0:Ee.prompt)||"",le=((Ce=e.settings)==null?void 0:Ce.model)||"qwen-image-edit",fe=((xe=e.settings)==null?void 0:xe.ratio)||"16:9",be=((Ne=e.settings)==null?void 0:Ne.referenceImages)||[],de=e.type==="generate-scene-image";let $e="";if(ne.trim()&&F.trim()?$e=`${ne.trim()} + +${F.trim()}`:ne.trim()?$e=ne.trim():F.trim()&&($e=F.trim()),!$e.trim()){alert("请先输入提示词或连接上游文字节点/Agent节点");return}const ze=l.find(Be=>Be.id===le);if(!ze){alert("请先选择模型");return}if(!(ze.key||c)){alert("请先配置API Key");return}i(e.id,{settings:{...e.settings,isGenerating:!0,error:null}});try{console.log(`[生成${de?"场景":"角色"}图片] 开始生成,模型:`,le,"比例:",fe),console.log(`[生成${de?"场景":"角色"}图片] 合并后的提示词:`,$e.substring(0,100)+"...");let Be=$e;const He=((ve=e.settings)==null?void 0:ve.chatModel)||"",Je=He?l.find(Me=>Me.id===He):l.find(Me=>Me.type==="Chat");if(Je){const Me=Je.key||c;if(Me)try{const Re=(Je.url||"https://ai.comfly.chat").replace(/\/+$/,"");let Ve;q?Ve=de?"你是一个 Midjourney 提示词专家。请将以下中文场景描述转换为简洁的英文 Midjourney 提示词。只保留关键的场景、环境、建筑、背景特征,去除所有人物、角色、对话和动作描述。输出格式:简洁的英文关键词,用逗号分隔,不要有多余的解释。":'你是一个 Midjourney 提示词专家。请将以下中文角色描述转换为简洁的英文 Midjourney 提示词。只保留关键的人物外貌、服装、姿态特征,去除所有剧情、动作、对话和背景信息。输出格式:简洁的英文关键词,用逗号分隔,必须包含 "white background",不要有多余的解释。':Ve=de?"你是一个场景描述优化专家。请分析以下提示词,只保留关于场景、环境、建筑、背景等场景特征的描述,去除所有人物、角色、字符、对话和动作描述。输出应简洁,只包含场景特征描述,不能包含任何人物或角色。":'你是一个提示词优化专家。请分析以下提示词,只保留关于人物外貌、服装、姿态等角色特征的描述,去除所有剧情、动作、对话和背景信息。输出应简洁,只包含角色特征描述,格式为"全身视角,[人物特征描述],站在纯白色背景前"。必须确保背景始终是纯白色,不能有任何场景描述。';const Ze=await fetch(`${Re}/v1/chat/completions`,{method:"POST",headers:{Authorization:`Bearer ${Me}`,"Content-Type":"application/json"},body:JSON.stringify({model:Je.modelName||Je.id||"gpt-4o",messages:[{role:"system",content:Ve},{role:"user",content:$e}],temperature:.3})});if(Ze.ok){const Le=(Te=(Pe=(Ie=(ke=(await Ze.json()).choices)==null?void 0:ke[0])==null?void 0:Ie.message)==null?void 0:Pe.content)==null?void 0:Te.trim();Le&&(Be=Le,console.log(`[生成${de?"场景":"角色"}图片] ${q?"转换为英文":"过滤后"}的提示词:`,Be))}}catch(Re){console.warn("提示词处理失败,使用原始提示词:",Re)}}!de&&!q&&!Be.includes("白色背景")&&!Be.includes("纯白色背景")&&!Be.includes("white background")&&(Be=Be+",纯白色背景"),i(e.id,{prompt:Be,settings:{...e.settings,model:le,ratio:fe,prompt:Be,...be.length>0?{referenceImages:be}:{}}}),setTimeout(()=>{z({...e,prompt:Be,settings:{...e.settings,model:le,ratio:fe,prompt:Be,...be.length>0?{referenceImages:be}:{}}})},0)}catch(Be){console.error(`[生成${e.type==="generate-scene-image"?"场景":"角色"}图片] 失败:`,Be);const He=Be instanceof Error?Be.message:"生成失败";i(e.id,{settings:{...e.settings,isGenerating:!1,progress:0,error:He}}),alert(`生成失败: ${He}`)}},children:(ge=e.settings)!=null&&ge.isGenerating?"生成中...":E?"生成角色图片":"生成场景图片"})})]})})},Lle=({node:e,nodes:t,connections:n,isDark:r,updateNode:i,setHistory:a,apiConfigs:o,globalApiKey:l,characterLibrary:c,getDurationsForModel:u,getDefaultDurationForModel:d,isGrokVideoModel:h,isVeoModel:p,isHailuoModel:f,supportsStartEndFrames:b,GROK_VIDEO_RATIOS:g,connectingSource:y,connectingTarget:w,connectingInputType:v,setConnectingTarget:m,setConnectingInputType:z,setMousePos:C,canvasRef:E,view:I,getConnectedImageForInput:R,generate:A})=>{var V,N,j,k,W,M,Y,se,ie,oe,re,ee,pe,we,Q,me;const O=e.type==="generate-character-video",F=O?"生成角色视频":"生成场景视频",L=new Map(t.map(ue=>[ue.id,ue])),X=n.filter(ue=>ue.to===e.id).map(ue=>L.get(ue.from)).find(ue=>(ue==null?void 0:ue.type)===(O?"character-description":"scene-description")),T=((V=e.settings)==null?void 0:V.videoPrompt)||((N=X==null?void 0:X.settings)==null?void 0:N.prompt)||"",q=_.useMemo(()=>{if(!n||!t)return[];const ue=n.reduce((te,ge)=>{if(ge.to===e.id&&(!ge.inputType||ge.inputType==="default")){const ne=ge.to;te.has(ne)||te.set(ne,[]),te.get(ne).push(ge)}return te},new Map),U=[],G=ue.get(e.id)||[];for(const te of G){const ge=L.get(te.from);(ge==null?void 0:ge.type)==="text-node"&&U.push(ge)}return U},[e.id,n,t,L]),H=_.useMemo(()=>{if(!n||!t)return[];const ue=n.reduce((te,ge)=>{if(ge.to===e.id&&(!ge.inputType||ge.inputType==="default")){const ne=ge.to;te.has(ne)||te.set(ne,[]),te.get(ne).push(ge)}return te},new Map),U=[],G=ue.get(e.id)||[];for(const te of G){const ge=L.get(te.from);(ge==null?void 0:ge.type)==="custom-agent"&&U.push(ge)}return U},[e.id,n,t,L]),J=_.useMemo(()=>{var U,G;const ue=[];if(q.length>0)for(const te of q){const ge=L.get(te.id)||te,ne=((U=ge.settings)==null?void 0:U.text)||"",le=ge.prompt||"",fe=(ne||le).trim();fe.length>0&&ue.push(fe)}if(H.length>0)for(const te of H){const ne=(((G=(L.get(te.id)||te).settings)==null?void 0:G.outputContent)||"").trim();ne.length>0&&ue.push(ne)}return ue.join(` + +`)},[q,H,L]),Z=n.filter(ue=>ue.to===e.id&&(!ue.inputType||ue.inputType==="default")),B=[];if(Z.forEach(ue=>{const U=L.get(ue.from);U!=null&&U.content&&B.push(U.content)}),B.length===0){const ue=((j=e.settings)==null?void 0:j.referenceImages)||((k=X==null?void 0:X.settings)==null?void 0:k.referenceImages)||[];B.push(...ue)}return s.jsx("div",{className:`relative w-full h-full flex flex-col transition-colors pointer-events-auto ${r?"bg-zinc-900/80":"bg-zinc-100"}`,children:s.jsxs(s.Fragment,{children:[s.jsxs("div",{className:`flex items-center gap-1.5 px-3 py-2 border-b text-xs font-semibold shrink-0 ${r?"text-zinc-300 border-zinc-800":"text-zinc-700 border-zinc-200"}`,children:[s.jsx(aa,{size:12,className:"text-green-500"}),s.jsx("span",{children:F})]}),s.jsxs("div",{className:"flex-1 flex flex-col gap-3 p-3 overflow-y-auto min-h-0 rh-scroll-minimal",children:[B.length>0&&s.jsxs("div",{className:`flex flex-col gap-2 px-2 py-2 rounded text-[10px] ${r?"bg-green-900/30 border border-green-700":"bg-green-50 border border-green-200"}`,children:[s.jsxs("div",{className:"flex items-center gap-1.5",children:[s.jsx("span",{className:"text-green-500",children:"✅"}),s.jsxs("span",{className:r?"text-green-400":"text-green-700",children:["引用图片成功 (",B.length,"张)"]})]}),s.jsx("div",{className:"flex gap-2 overflow-x-auto",children:B.slice(0,4).map((ue,U)=>s.jsx("div",{className:"relative w-16 h-16 flex-shrink-0 rounded overflow-hidden border border-green-500",children:s.jsx("img",{src:ue,alt:`Reference ${U+1}`,className:"w-full h-full object-cover",onMouseDown:G=>G.stopPropagation()})},U))})]}),q.length>0||H.length>0?s.jsxs("div",{className:`flex items-center gap-1.5 px-2 py-1 rounded text-[10px] ${r?"bg-blue-900/30 border border-blue-700":"bg-blue-50 border border-blue-200"}`,children:[s.jsx("span",{className:"text-blue-500",children:"📝"}),s.jsxs("span",{className:r?"text-blue-400":"text-blue-700",children:["上游已连接:",q.length>0?s.jsxs("span",{children:["文字节点(",q.length,"个)"]}):null,q.length>0&&H.length>0?s.jsx("span",{children:" + "}):null,H.length>0?s.jsxs("span",{children:["Agent节点(",H.length,"个)"]}):null]})]}):null,s.jsxs("div",{children:[s.jsx("label",{className:"text-[10px] block mb-1 text-zinc-500",children:"选择模型"}),s.jsx("select",{value:String(((W=e.settings)==null?void 0:W.model)??"sora-2"),onChange:ue=>i(e.id,{settings:{...e.settings,model:ue.target.value}}),className:`w-full px-2 py-1 rounded text-xs border ${r?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,onMouseDown:ue=>ue.stopPropagation(),children:o.filter(ue=>ue.type==="Video").map(ue=>{var U,G,te;return s.jsxs("option",{value:ue.id,children:[ue.provider,((U=ue.provider)!=null&&U.startsWith("Seedream")||(G=ue.provider)!=null&&G.startsWith("Seedance"))&&!((te=ue.provider)!=null&&te.includes("API"))?" Official":""]},ue.id)})})]}),(()=>{var te,ge;const ue=((te=e.settings)==null?void 0:te.model)||"sora-2",U=u(ue),G=d(ue);return s.jsxs("div",{children:[s.jsx("label",{className:"text-[10px] block mb-1 text-zinc-500",children:"时长"}),s.jsx("select",{value:((ge=e.settings)==null?void 0:ge.duration)||G,onChange:ne=>i(e.id,{settings:{...e.settings,duration:ne.target.value}}),className:`w-full px-2 py-1 rounded text-xs border ${r?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,onMouseDown:ne=>ne.stopPropagation(),children:U.map(ne=>s.jsx("option",{value:ne,children:ne.replace("s","秒")},ne))})]})})(),(()=>{var G,te;const ue=((G=e.settings)==null?void 0:G.model)||"sora-2",U=h(ue)?g:["16:9","9:16","1:1"];return s.jsxs("div",{children:[s.jsx("label",{className:"text-[10px] block mb-1 text-zinc-500",children:"比例"}),s.jsx("select",{value:((te=e.settings)==null?void 0:te.ratio)||U[0],onChange:ge=>i(e.id,{settings:{...e.settings,ratio:ge.target.value}}),className:`w-full px-2 py-1 rounded text-xs border ${r?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,onMouseDown:ge=>ge.stopPropagation(),children:U.map(ge=>s.jsx("option",{value:ge,children:ge},ge))})]})})(),b(((M=e.settings)==null?void 0:M.model)||"")&&((Y=e.settings)==null?void 0:Y.veoFramesMode)&&(()=>{var le;const ue=R(e.id,"veo_start"),U=R(e.id,"veo_end"),G=((le=e.settings)==null?void 0:le.model)||"";let te="Veo 3 首尾帧";f(G)?te="Hailuo 2.0 首尾帧":G.includes("kling-v2-5-turbo")?te="Kling v2.5 Turbo 首尾帧":G.includes("kling-v3")&&(te="Kling v3 首尾帧");const ge=G.includes("kling-v2-5-turbo"),ne=ue||U;return s.jsxs("div",{className:`p-3 rounded-lg border space-y-2 ${r?"bg-zinc-900/40 border-emerald-500/20":"bg-emerald-50 border-emerald-200"}`,onMouseDown:fe=>fe.stopPropagation(),children:[s.jsx("div",{className:`text-[11px] font-semibold ${r?"text-zinc-200":"text-zinc-700"}`,children:te}),s.jsx("div",{className:"text-[10px] text-zinc-500",children:"第一张为首帧,第二张为尾帧(最多 2 张)"}),ge&&ne&&s.jsxs("div",{className:`text-[10px] px-2 py-1 rounded ${r?"bg-blue-900/30 text-blue-300 border border-blue-700/50":"bg-blue-50 text-blue-700 border border-blue-200"}`,children:["⚡ 使用首尾帧时将自动切换到 ",s.jsx("span",{className:"font-semibold",children:"pro"})," 模式"]}),s.jsxs("div",{className:"relative flex items-center gap-2",children:[s.jsx("div",{className:"absolute left-[-4px] top-1/2 -translate-y-1/2 w-12 h-12 -m-4 flex items-center justify-center cursor-pointer z-20",style:{zIndex:20},title:"首帧输入 - 点击开始连接","data-input-type":"veo_start",onMouseDown:fe=>{var de;fe.stopPropagation(),fe.preventDefault();const be=(de=E.current)==null?void 0:de.getBoundingClientRect();if(be){const $e=(fe.clientX-be.left-I.x)/I.zoom,ze=(fe.clientY-be.top-I.y)/I.zoom;C({x:$e,y:ze})}m(e.id),z("veo_start")},onMouseUp:fe=>{fe.stopPropagation(),fe.preventDefault()},children:s.jsx("div",{className:`w-2 h-2 rounded-full transition-all pointer-events-none ${w===e.id&&v==="veo_start"?"bg-emerald-500 ring-2 ring-emerald-400 scale-150":y&&y!==e.id?"scale-150 bg-blue-500 ring-2 ring-blue-400 z-50":ue?"bg-green-500":r?"bg-zinc-600 hover:bg-zinc-500":"bg-zinc-400 hover:bg-zinc-500"}`})}),s.jsxs("div",{className:"flex items-center justify-between flex-1 ml-2",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:`text-[10px] font-medium ${r?"text-zinc-400":"text-zinc-600"}`,children:"● 首帧"}),ue&&s.jsx("div",{className:"w-1.5 h-1.5 rounded-full bg-green-500"})]}),ue?s.jsx("div",{className:"w-8 h-8 rounded overflow-hidden border border-zinc-700/40",children:s.jsx("img",{src:ue,className:"w-full h-full object-cover",alt:"首帧"})}):s.jsx("span",{className:`text-[10px] ${r?"text-zinc-600":"text-zinc-400"}`,children:"未连接"})]})]}),s.jsxs("div",{className:"relative flex items-center gap-2",children:[s.jsx("div",{className:"absolute left-[-4px] top-1/2 -translate-y-1/2 w-12 h-12 -m-4 flex items-center justify-center cursor-pointer z-20",style:{zIndex:20},title:"尾帧输入 - 点击开始连接","data-input-type":"veo_end",onMouseDown:fe=>{var de;fe.stopPropagation(),fe.preventDefault();const be=(de=E.current)==null?void 0:de.getBoundingClientRect();if(be){const $e=(fe.clientX-be.left-I.x)/I.zoom,ze=(fe.clientY-be.top-I.y)/I.zoom;C({x:$e,y:ze})}m(e.id),z("veo_end")},onMouseUp:fe=>{fe.stopPropagation(),fe.preventDefault()},children:s.jsx("div",{className:`w-2 h-2 rounded-full transition-all pointer-events-none ${w===e.id&&v==="veo_end"?"bg-emerald-500 ring-2 ring-emerald-400 scale-150":y&&y!==e.id?"scale-150 bg-blue-500 ring-2 ring-blue-400 z-50":U?"bg-green-500":r?"bg-zinc-600 hover:bg-zinc-500":"bg-zinc-400 hover:bg-zinc-500"}`})}),s.jsxs("div",{className:"flex items-center justify-between flex-1 ml-2",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:`text-[10px] font-medium ${r?"text-zinc-400":"text-zinc-600"}`,children:"● 尾帧"}),U&&s.jsx("div",{className:"w-1.5 h-1.5 rounded-full bg-green-500"})]}),U?s.jsx("div",{className:"w-8 h-8 rounded overflow-hidden border border-zinc-700/40",children:s.jsx("img",{src:U,className:"w-full h-full object-cover",alt:"尾帧"})}):s.jsx("span",{className:`text-[10px] ${r?"text-zinc-600":"text-zinc-400"}`,children:"未连接"})]})]})]})})(),p(((se=e.settings)==null?void 0:se.model)||"")&&s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsx("span",{className:`text-[10px] ${r?"text-zinc-400":"text-zinc-600"}`,children:"启用首尾帧"}),s.jsx("button",{className:`w-8 h-4 rounded-full transition-colors ${(ie=e.settings)!=null&&ie.veoFramesMode?"bg-emerald-500":r?"bg-zinc-700":"bg-zinc-300"}`,onClick:ue=>{var U;ue.stopPropagation(),i(e.id,{settings:{...e.settings,veoFramesMode:!((U=e.settings)!=null&&U.veoFramesMode)}})},onMouseDown:ue=>ue.stopPropagation(),children:s.jsx("div",{className:`w-3 h-3 rounded-full bg-white transition-transform ${(oe=e.settings)!=null&&oe.veoFramesMode?"translate-x-4":"translate-x-0.5"}`})})]}),b(((re=e.settings)==null?void 0:re.model)||"")&&!p(((ee=e.settings)==null?void 0:ee.model)||"")&&s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsx("span",{className:`text-[10px] ${r?"text-zinc-400":"text-zinc-600"}`,children:"启用首尾帧"}),s.jsx("button",{className:`w-8 h-4 rounded-full transition-colors ${(pe=e.settings)!=null&&pe.veoFramesMode?"bg-emerald-500":r?"bg-zinc-700":"bg-zinc-300"}`,onClick:ue=>{var U;ue.stopPropagation(),i(e.id,{settings:{...e.settings,veoFramesMode:!((U=e.settings)!=null&&U.veoFramesMode)}})},onMouseDown:ue=>ue.stopPropagation(),children:s.jsx("div",{className:`w-3 h-3 rounded-full bg-white transition-transform ${(we=e.settings)!=null&&we.veoFramesMode?"translate-x-4":"translate-x-0.5"}`})})]}),s.jsx("div",{children:s.jsx("textarea",{"data-node-id":e.id,"data-scrollable":"true",value:T,onChange:ue=>{i(e.id,{settings:{...e.settings,videoPrompt:ue.target.value}})},placeholder:(q.length>0||H.length>0,"输入提示词..."),className:`w-full h-20 resize-none outline-none text-sm p-3 rounded ${r?"bg-zinc-900/50 text-zinc-200 placeholder-zinc-600":"bg-transparent text-zinc-800 placeholder-zinc-400"}`,onMouseDown:ue=>ue.stopPropagation()})}),e.content||(Q=e.settings)!=null&&Q.videoUrl?s.jsx("div",{className:"relative w-full aspect-video bg-black rounded-lg overflow-hidden",children:s.jsx("video",{src:e.content||((me=e.settings)==null?void 0:me.videoUrl),controls:!0,className:"w-full h-full object-contain",onMouseDown:ue=>ue.stopPropagation()})}):s.jsx("div",{className:`w-full aspect-video rounded border-2 border-dashed flex items-center justify-center ${r?"border-zinc-700":"border-zinc-300"}`,children:s.jsx("span",{className:`text-sm ${r?"text-zinc-400":"text-zinc-500"}`,children:'点击"生成"按钮开始生成'})}),e.errorMsg&&s.jsx("div",{className:"text-[10px] text-red-500",children:String(e.errorMsg)})]}),s.jsx("div",{className:`px-3 py-2 border-t shrink-0 ${r?"border-zinc-800":"border-zinc-200"}`,children:s.jsx("button",{className:`w-full py-2 rounded text-xs font-medium transition-colors ${e.isGenerating?"bg-zinc-400 cursor-not-allowed text-white":"bg-green-600 hover:bg-green-500 text-white"}`,disabled:!!e.isGenerating,onMouseDown:ue=>ue.stopPropagation(),onClick:()=>{var fe,be,de,$e;const ue=((fe=e.settings)==null?void 0:fe.videoPrompt)||T;let U="";if(ue.trim()&&J.trim()?U=`${ue.trim()} + +${J.trim()}`:ue.trim()?U=ue.trim():J.trim()&&(U=J.trim()),!U.trim()){alert("请输入视频提示词或连接上游文字节点/Agent节点");return}const G=((be=e.settings)==null?void 0:be.model)||"sora-2",te=o.find(ze=>ze.id===G);if(!te){alert("请选择视频模型");return}if(!(te.key||l)){alert("请配置API Key");return}console.log("[GenerateVideoNode] 合并后的提示词:",U.substring(0,100)+"...");const ne=((de=e.settings)==null?void 0:de.duration)||d(G),le=(($e=e.settings)==null?void 0:$e.ratio)||(h(G)?g[0]:"16:9");i(e.id,{prompt:U,settings:{...e.settings,model:G,duration:ne,ratio:le,videoPrompt:ue,...B.length>0?{referenceImages:B}:{}}}),setTimeout(()=>{A({...e,prompt:U,settings:{...e.settings,model:G,duration:ne,ratio:le,videoPrompt:ue,...B.length>0?{referenceImages:B}:{}}})},0)},children:e.isGenerating?"生成中...":"生成视频"})})]})})},Ble=({node:e,nodes:t,connections:n,isDark:r,updateNode:i,apiConfigs:a,globalApiKey:o,setCharacterLibrary:l})=>{var y,w,v,m,z,C,E,I,R,A;const c=e.type==="create-character",u=c?"创建角色":"创建场景",d=((y=e.settings)==null?void 0:y.startSecond)??1,h=((w=e.settings)==null?void 0:w.endSecond)??3,p=new Map(t.map(O=>[O.id,O])),f=n.filter(O=>O.to===e.id).map(O=>p.get(O.from)).find(O=>(O==null?void 0:O.type)==="generate-character-video"||(O==null?void 0:O.type)==="generate-scene-video"),b=((v=f==null?void 0:f.settings)==null?void 0:v.videoUrl)||(f==null?void 0:f.content)||"",g=async()=>{var F,L;const O=((F=e.settings)==null?void 0:F.name)||"";if(!O||O.trim().length===0){alert(`请填写${c?"角色":"场景"}名称`);return}if(c){if(h-d<1||h-d>3){alert("时间范围必须在 1-3 秒之间");return}if(!b){alert("找不到关联的视频节点或视频URL");return}const X=a.find(q=>q.type==="Video"&&(q.id==="sora-2"||q.id==="sora-2-pro"));if(!X){alert("未找到 Sora 2 模型配置,请先在设置中配置 Sora 2 或 Sora 2 Pro");return}const T=X.key||o;if(!T){alert("请先配置 API Key");return}i(e.id,{settings:{...e.settings,isCreating:!0,createProgress:10,createError:null}});try{const q=["jimeng-5.0","jimeng-4.6","jimeng-4.5","jimeng-4.1","jimeng-3.1"],Z=`${(((L=a.find(k=>!q.includes(k.id)))==null?void 0:L.url)||"https://ai.comfly.chat").replace(/\/+$/,"")}/sora/v1/characters`,B=`${d},${h}`,V={url:b,timestamps:B};i(e.id,{settings:{...e.settings,isCreating:!0,createProgress:50}});const N=await fetch(Z,{method:"POST",headers:{Authorization:`Bearer ${T}`,"Content-Type":"application/json"},body:JSON.stringify(V)});if(i(e.id,{settings:{...e.settings,isCreating:!0,createProgress:90}}),!N.ok){const k=await N.text();throw new Error(`API错误 (${N.status}): ${k||N.statusText}`)}const j=await N.json();if(console.log("[Create Character Node] Success:",j),i(e.id,{settings:{...e.settings,isCreating:!0,createProgress:100}}),j.id&&j.username){const k=async Y=>{if(!Y||Y.startsWith("data:"))return Y;try{const ie=await(await fetch(Y)).blob();return new Promise(oe=>{const re=new FileReader;re.onloadend=()=>oe(re.result),re.onerror=()=>oe(Y),re.readAsDataURL(ie)})}catch{return Y}};let W=j.profile_picture_url||"";if(W&&W.startsWith("http"))try{W=await k(W),console.log("[角色库] 图片已转为本地DataURL")}catch(Y){console.warn("[角色库] 图片转换失败,使用原URL:",Y)}const M={id:j.id,name:j.username,imageUrl:W,description:j.permalink||""};l(Y=>{const se=[...Y,M];try{localStorage.setItem("qiaodoumayi_characters",JSON.stringify(se))}catch(ie){console.error("保存角色库失败:",ie)}return se}),setTimeout(()=>{i(e.id,{settings:{...e.settings,isCreating:!1,createProgress:0,createError:null}}),alert(`角色 "${j.username}" 创建成功!已添加到Sora角色库`)},500)}else throw new Error("返回数据缺少 id 或 username")}catch(q){console.error("[Create Character Node] Failed:",q);const H=q.message||"创建失败";i(e.id,{settings:{...e.settings,isCreating:!1,createProgress:0,createError:H}}),alert(`创建角色失败: ${H}`)}}else console.log("创建场景",{name:O,startSecond:d,endSecond:h}),alert("场景创建功能待实现")};return s.jsxs("div",{className:`relative w-full h-full flex flex-col transition-colors pointer-events-auto ${r?"bg-zinc-900/80":"bg-zinc-100"}`,children:[s.jsxs("div",{className:`flex items-center gap-1.5 px-3 py-2 border-b text-xs font-semibold shrink-0 ${r?"text-zinc-300 border-zinc-800":"text-zinc-700 border-zinc-200"}`,children:[s.jsx(hd,{size:12,className:c?"text-blue-500":"text-green-500"}),s.jsx("span",{children:u})]}),s.jsxs("div",{className:"flex-1 flex flex-col gap-3 p-3 overflow-y-auto min-h-0",children:[s.jsxs("div",{children:[s.jsx("label",{className:"text-[10px] block mb-1 text-zinc-500",children:c?"角色名称":"场景名称"}),s.jsx("input",{type:"text",value:((m=e.settings)==null?void 0:m.name)||"",onChange:O=>i(e.id,{settings:{...e.settings,name:O.target.value}}),placeholder:c?"输入角色名称...":"输入场景名称...",className:`w-full px-2 py-1 rounded text-xs border ${r?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,onMouseDown:O=>O.stopPropagation()})]}),s.jsxs("div",{children:[s.jsx("label",{className:"text-[10px] block mb-1 text-zinc-500",children:"时间范围(秒,间隔需在 1-3 秒之间)"}),s.jsxs("div",{className:"flex gap-2 items-center flex-wrap",children:[s.jsx("input",{type:"number",min:"0",step:"0.1",value:d,onChange:O=>i(e.id,{settings:{...e.settings,startSecond:parseFloat(O.target.value)||0}}),className:`w-20 px-2 py-1 rounded text-xs border ${r?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,onMouseDown:O=>O.stopPropagation()}),s.jsx("span",{className:`text-xs ${r?"text-zinc-400":"text-zinc-500"}`,children:"到"}),s.jsx("input",{type:"number",min:"0",step:"0.1",value:h,onChange:O=>i(e.id,{settings:{...e.settings,endSecond:parseFloat(O.target.value)||0}}),className:`w-20 px-2 py-1 rounded text-xs border ${r?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,onMouseDown:O=>O.stopPropagation()}),s.jsxs("span",{className:`text-xs ${r?"text-zinc-400":"text-zinc-500"}`,children:["秒(间隔: ",(h-d).toFixed(1),"s)"]})]})]}),b?s.jsx("div",{className:"relative w-full aspect-video bg-black rounded-lg overflow-hidden",children:s.jsx("video",{src:b,controls:!0,className:"w-full h-full object-contain",preload:"metadata",onMouseDown:O=>O.stopPropagation()})}):s.jsx("div",{className:`w-full aspect-video rounded border-2 border-dashed flex items-center justify-center ${r?"border-zinc-700":"border-zinc-300"}`,children:s.jsx("span",{className:`text-sm ${r?"text-zinc-400":"text-zinc-500"}`,children:"请先在视频节点生成视频"})})]}),!!((z=e.settings)!=null&&z.isCreating)&&s.jsxs("div",{className:`px-3 py-2 border-t shrink-0 ${r?"border-zinc-800":"border-zinc-200"}`,children:[s.jsx("div",{className:"flex items-center gap-2 mb-2",children:s.jsxs("div",{className:"flex-1",children:[s.jsxs("div",{className:"flex items-center justify-between mb-1",children:[s.jsxs("span",{className:"text-[10px] text-zinc-500",children:[u,"中..."]}),s.jsx("span",{className:"text-[10px] text-zinc-500",children:`${Number(((C=e.settings)==null?void 0:C.createProgress)??0)}%`})]}),s.jsx("div",{className:`w-full h-1.5 rounded-full overflow-hidden ${r?"bg-zinc-800":"bg-zinc-200"}`,children:s.jsx("div",{className:"h-full bg-blue-500 transition-all duration-300",style:{width:`${((E=e.settings)==null?void 0:E.createProgress)||0}%`}})})]})}),typeof((I=e.settings)==null?void 0:I.createError)=="string"&&e.settings.createError&&s.jsx("div",{className:"text-[10px] text-red-500 mt-1",children:e.settings.createError})]}),s.jsx("div",{className:`px-3 py-2 border-t shrink-0 ${r?"border-zinc-800":"border-zinc-200"}`,children:s.jsxs("button",{className:`w-full py-2 rounded text-xs font-medium transition-colors ${(R=e.settings)!=null&&R.isCreating?"bg-zinc-400 cursor-not-allowed text-white":"bg-gradient-to-r from-blue-600 to-indigo-600 hover:from-blue-500 hover:to-indigo-500 text-white"}`,disabled:!!((A=e.settings)!=null&&A.isCreating),onMouseDown:O=>O.stopPropagation(),onClick:g,children:["创建",c?"角色":"场景"]})})]})},Ule=({node:e,nodes:t=[],connections:n=[],isDark:r,updateNode:i,frameSelectionRef:a,setFrameContextMenu:o,renderQuality:l="high"})=>{var H,J;const c=_.useMemo(()=>{if(e.content)return null;const Z=new Map(t.map(B=>[B.id,B]));for(const B of n){if(B.to!==e.id)continue;const V=Z.get(B.from);if((V==null?void 0:V.type)==="input-image"&&V.content){const N=V.content;if(xb(N)||N.startsWith("blob:"))return N}}return null},[e.id,e.content,t,n]),u=e.content||c||null,{content:d,isLoading:h}=Ul(u??void 0),p=d,f=_.useRef(null),b=(H=e.settings)==null?void 0:H.videoFramesScrollTop,g=(J=e.settings)==null?void 0:J.videoCurrentTime,y=_.useRef(null),w=_.useRef(null),v=_.useCallback(()=>{const Z=f.current;Z&&(y.current&&clearTimeout(y.current),y.current=setTimeout(()=>{y.current=null;const B=Z.scrollTop;b!==B&&i(e.id,{settings:{...e.settings,videoFramesScrollTop:B}})},150))},[e.id,e.settings,i,b]),m=_.useCallback(Z=>{var N;if((((N=e.frames)==null?void 0:N.length)??0)===0)return;const V=typeof b=="number"&&b>=0?b:0;Math.abs(Z.scrollTop-V)>2&&(Z.scrollTop=Math.min(V,Z.scrollHeight-Z.clientHeight))},[e.frames,b]);_.useLayoutEffect(()=>{var N;const Z=f.current,B=((N=e.frames)==null?void 0:N.length)??0;if(!Z||B===0)return;m(Z);const V=new ResizeObserver(()=>{f.current&&m(f.current)});return V.observe(Z),()=>V.disconnect()},[e.frames,b,m]),_.useEffect(()=>{var j;const Z=f.current,B=((j=e.frames)==null?void 0:j.length)??0;if(!Z||B===0)return;const V=setTimeout(()=>m(Z),100),N=setTimeout(()=>m(Z),400);return()=>{clearTimeout(V),clearTimeout(N)}},[e.frames,b,m]);const z=async Z=>{Z.preventDefault();const B=Z.dataTransfer.files[0];if(B&&(B.type.startsWith("video/")||B.name.endsWith(".webm"))){const V=URL.createObjectURL(B),N=document.createElement("video"),{extractNodeNameFromFileName:j}=await mn(async()=>{const{extractNodeNameFromFileName:W}=await Promise.resolve().then(()=>Sp);return{extractNodeNameFromFileName:W}},void 0,import.meta.url),k=j(B.name);N.onloadedmetadata=()=>{i(e.id,{content:V,videoFileName:B.name,nodeName:k,videoMeta:{duration:N.duration,w:N.videoWidth,h:N.videoHeight}})},N.src=V}},C=async(Z,B=!1)=>{var N;const V=(N=Z.target.files)==null?void 0:N[0];if(V){const j=URL.createObjectURL(V),k=document.createElement("video"),{extractNodeNameFromFileName:W}=await mn(async()=>{const{extractNodeNameFromFileName:Y}=await Promise.resolve().then(()=>Sp);return{extractNodeNameFromFileName:Y}},void 0,import.meta.url),M=W(V.name);k.onloadedmetadata=()=>{const Y={content:j,videoFileName:V.name,nodeName:M,videoMeta:{duration:k.duration,w:k.videoWidth,h:k.videoHeight}};B&&(Y.frames=[],Y.selectedKeyframes=[],Y.settings={...e.settings,videoFramesScrollTop:0,videoCurrentTime:0}),i(e.id,Y)},k.src=j}},E=_.useCallback(async()=>{const Z=e.content||c||null;if(!Z)return;const B=e.content||p||Z;if(!B)return;const V=2,N=document.createElement("video");N.src=B,N.crossOrigin="anonymous",await new Promise((Y,se)=>{N.onloadedmetadata=()=>Y(),N.onerror=()=>se(new Error("视频加载失败")),N.load()});const j=N.duration,k=document.createElement("canvas"),W=k.getContext("2d"),M=[];i(e.id,{extractingFrames:!0});for(let Y=0;Y{N.onseeked=()=>se()}),k.width=N.videoWidth,k.height=N.videoHeight,W==null||W.drawImage(N,0,0),M.push({url:k.toDataURL("image/jpeg",.8),time:Y});i(e.id,{frames:M,selectedKeyframes:[],extractingFrames:!1})},[e.id,e.content,c,p,i]),I=_.useCallback(async()=>{const Z=e.content||c||null;if(!Z)return;const B=e.content||p||Z;if(!B)return;const V=document.createElement("video");V.src=B,V.crossOrigin="anonymous",await new Promise((Y,se)=>{V.onloadedmetadata=()=>Y(),V.onerror=()=>se(new Error("视频加载失败")),V.load()});const N=V.duration,j=document.createElement("canvas"),k=j.getContext("2d"),W=[],M=Math.min(30,Math.ceil(N));i(e.id,{extractingFrames:!0});for(let Y=0;Y{V.onseeked=()=>ie()}),j.width=V.videoWidth,j.height=V.videoHeight,k==null||k.drawImage(V,0,0),W.push({url:j.toDataURL("image/jpeg",.8),time:se})}i(e.id,{frames:W,selectedKeyframes:[],extractingFrames:!1})},[e.id,e.content,c,p,i]),R=(Z,B,V)=>{const N=e.frames||[],j=e.selectedKeyframes||[],k=Y=>`${Y.time}-${Y.url}`,W=new Map(N.map(Y=>[k(Y),Y]));let M=[...j];if(Z.shiftKey&&a.current[e.id]!==void 0&&N.length>0){const Y=a.current[e.id],se=Math.min(Y,V),ie=Math.max(Y,V),oe=N.slice(se,ie+1),re=new Set(M.map(k));oe.forEach(ee=>re.add(k(ee))),M=Array.from(re).map(ee=>W.get(ee)).filter(Boolean)}else M=M.some(se=>k(se)===k(B))?M.filter(se=>k(se)!==k(B)):[...M,B];a.current[e.id]=V,i(e.id,{selectedKeyframes:M})},A=e.frames||[],O=e.selectedKeyframes||[],F=Z=>`${Z.time}-${Z.url}`,L=e.frames||[],X=L.map(Z=>Z.url),T=iu(X);T.some(Z=>Z.isLoading);const q=L.map((Z,B)=>{var V;return{...Z,url:((V=T[B])==null?void 0:V.content)||Z.url}});return s.jsx("div",{className:`relative w-full h-full flex flex-col transition-colors pointer-events-auto video-input-container ${r?"bg-[#18181b]":"bg-white"}`,onDrop:z,onDragOver:Z=>Z.preventDefault(),children:s.jsxs("div",{className:"flex-1 flex flex-col gap-3 p-3 overflow-hidden min-h-0",children:[p?s.jsxs("div",{className:"space-y-2",children:[c&&!e.content&&s.jsx("div",{className:"text-[10px] text-zinc-500 text-center py-0.5",children:"视频来自上游图片输入节点"}),s.jsx("div",{className:"relative w-full aspect-video bg-black rounded-lg overflow-hidden flex items-center justify-center",children:h?s.jsxs("div",{className:"flex flex-col items-center justify-center gap-2 text-zinc-500",children:[s.jsx(zr,{size:24,className:"animate-spin"}),s.jsx("span",{className:"text-xs",children:"加载视频中..."})]}):l==="low"?s.jsx("div",{className:"w-full h-full flex items-center justify-center bg-black/50",children:e.videoPosterUrl?s.jsx("img",{src:e.videoPosterUrl,alt:"视频封面",className:"w-full h-full object-contain"}):s.jsxs("div",{className:"flex flex-col items-center gap-2 text-zinc-500",children:[s.jsx(aa,{size:48}),s.jsx("span",{className:"text-xs",children:"视频预览"})]})}):s.jsx("video",{src:p,controls:!0,className:"w-full h-full object-contain",poster:e.videoPosterUrl,preload:l==="medium"?"metadata":"auto",muted:l==="medium",onCanPlay:Z=>{const B=Z.currentTarget,V=typeof g=="number"&&g>=0&&g0&&Math.abs(B.currentTime-V)>.5&&(B.currentTime=V)},onTimeUpdate:Z=>{const B=Z.currentTarget;w.current&&clearTimeout(w.current),w.current=setTimeout(()=>{var j;w.current=null;const V=B.currentTime;((j=e.settings)==null?void 0:j.videoCurrentTime)!==V&&i(e.id,{settings:{...e.settings,videoCurrentTime:V}})},500)},onPlay:Z=>{const B=Z.currentTarget;B.setAttribute("data-user-controlled","true"),B.setAttribute("data-user-playing","true")},onPause:Z=>{const B=Z.currentTarget;B.setAttribute("data-user-controlled","true"),B.setAttribute("data-user-playing","false")},onDoubleClick:Z=>{Z.preventDefault(),Z.stopPropagation()},draggable:!1,onMouseDown:Z=>Z.stopPropagation()})}),s.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[s.jsxs("label",{className:r?"px-3 py-1.5 rounded text-xs font-medium transition-colors cursor-pointer border bg-transparent text-white border-white/30 hover:bg-white/5":"bg-black hover:bg-zinc-900 text-white px-3 py-1.5 rounded text-xs font-medium transition-colors cursor-pointer",onMouseDown:Z=>Z.stopPropagation(),children:["更换视频",s.jsx("input",{type:"file",className:"hidden",accept:"video/*,.mp4,.webm,.mov,.avi,.mkv,.flv,.ogg",onChange:Z=>C(Z,!0)})]}),s.jsx("button",{className:`px-3 py-1.5 rounded text-xs border transition-colors ${r?"bg-transparent hover:bg-white/5 text-white border-white/30":"border-zinc-300 hover:border-blue-500 hover:text-blue-600"}`,onMouseDown:Z=>Z.stopPropagation(),onClick:E,children:"自动抽帧(2fps)"}),s.jsx("button",{className:`px-3 py-1.5 rounded text-xs border transition-colors ${r?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-green-50 border-green-300 hover:border-green-500 hover:text-green-600"}`,onMouseDown:Z=>Z.stopPropagation(),onClick:I,children:"智能抽帧"}),e.extractingFrames&&s.jsx("span",{className:"text-[11px] text-blue-500",children:"抽帧中..."})]})]}):s.jsxs("div",{className:"flex flex-col items-center justify-center flex-1 gap-3",children:[s.jsx("div",{className:`w-12 h-12 rounded-2xl flex items-center justify-center border ${r?"bg-zinc-800 border-zinc-700/50":"bg-zinc-100 border-zinc-300"}`,children:s.jsx(aa,{className:`w-6 h-6 ${r?"text-zinc-500":"text-zinc-400"}`})}),s.jsxs("label",{className:r?"px-4 py-2 rounded-lg text-xs font-medium transition-colors cursor-pointer border bg-transparent text-zinc-100 border-zinc-500 hover:bg-zinc-800/60":"px-4 py-2 rounded-lg text-xs font-medium transition-colors cursor-pointer bg-black hover:bg-zinc-900 text-white",onMouseDown:Z=>Z.stopPropagation(),children:["选择或拖拽视频",s.jsx("input",{type:"file",className:"hidden",accept:"video/*,.mp4,.webm,.mov,.avi,.mkv,.flv,.ogg",onChange:Z=>C(Z)})]}),s.jsx("div",{className:"text-[10px] text-center text-zinc-500 pointer-events-none",children:"支持 MP4/WEBM,拖拽或 Ctrl+V 不可用"})]}),s.jsxs("div",{className:"flex items-center justify-between text-[11px] text-zinc-500",children:[s.jsx("span",{children:"抽帧缩略图"}),s.jsxs("span",{children:[A.length," 张"]})]}),s.jsx("div",{ref:f,className:"grid gap-3 w-full overflow-y-auto custom-scrollbar flex-1 min-h-0",style:{gridTemplateColumns:"repeat(auto-fill, minmax(clamp(100px, 15vw, 160px), 1fr))",gridAutoRows:"minmax(80px, auto)"},onScroll:v,onWheel:Z=>{Z.stopPropagation()},children:A.length===0?s.jsx("div",{className:`col-span-full text-[11px] text-zinc-500 text-center py-4 border rounded ${r?"bg-zinc-800/40 border-zinc-700":"bg-white/40 border-zinc-300"}`,children:"点击「自动抽帧」即可生成缩略图"}):q.map((Z,B)=>{var j;const V=O.some(k=>F(k)===F(L[B])),N=(j=T[B])==null?void 0:j.isLoading;return s.jsxs("button",{className:`relative rounded border overflow-hidden group ${V?"ring-2 ring-blue-500":""}`,onMouseDown:k=>k.stopPropagation(),onClick:k=>R(k,L[B],B),onContextMenu:k=>{k.preventDefault(),k.stopPropagation(),o({visible:!0,x:k.clientX,y:k.clientY,nodeId:e.id,frame:L[B]})},children:[N?s.jsx("div",{className:"w-full aspect-video flex items-center justify-center bg-black",children:s.jsx(zr,{size:16,className:"animate-spin text-zinc-500"})}):s.jsx("img",{src:Z.url,className:"w-full aspect-video object-contain bg-black",alt:`frame-${B}`,loading:"lazy"}),s.jsxs("div",{className:"absolute left-1 top-1 text-[10px] px-1 py-0.5 rounded bg-black/60 text-white",children:[Z.time.toFixed(2),"s"]}),s.jsx("div",{className:"absolute right-1 top-1 w-4 h-4 rounded-full border border-white/80 bg-black/40 flex items-center justify-center",children:V?s.jsx(OP,{size:10,className:"text-white"}):null})]},`${Z.url}-${B}`)})})]})})},Fle=({node:e,nodes:t,connections:n,isDark:r,updateNode:i,setNodes:a,setConnections:o,apiConfigs:l,generateId:c,handleGeneratePrompts:u,handleAutoVideoAnalysis:d})=>{var A,O,F,L,X;const[h,p]=_.useState(!1),[f,b]=_.useState(!1);_.useEffect(()=>{!e.isGenerating&&h&&p(!1)},[e.isGenerating,h]);const g=new Map(t.map(T=>[T.id,T])),y=n.filter(T=>T.to===e.id).map(T=>g.get(T.from)).find(T=>{if(!T)return!1;if(T.type==="video-input")return!0;if(T.type==="input-image"&&T.content){const q=T.content;return xb(q)||q.startsWith("blob:")}return!1});if(!y)return s.jsx("div",{className:`relative w-full h-full flex flex-col transition-colors pointer-events-auto video-analyze-container ${r?"bg-[#18181b]":"bg-white"}`,children:s.jsx("div",{className:"flex-1 flex flex-col gap-3 p-3 overflow-hidden min-h-0",children:s.jsxs("div",{className:"flex flex-col items-center justify-center flex-1 gap-2 text-[11px] text-zinc-500",children:[s.jsx(Bp,{size:24,className:"text-zinc-400"}),s.jsx("span",{children:"请连接一个视频输入节点"})]})})});const w=y.type==="input-image";let v=y.videoFileName;if(!v&&w){if(v=y.nodeName,!v&&y.prompt){const T=y.prompt;T.includes(".")&&(T.includes(".mp4")||T.includes(".webm")||T.includes(".mov"))&&(v=T)}if(!v&&y.content){const T=y.content;if(T.includes("/")){const q=T.split("/"),H=q[q.length-1];H&&(H.includes(".mp4")||H.includes(".webm")||H.includes(".mov"))&&(v=H)}}v||(v="来自图片输入节点")}else v||(v="未命名视频");const m=((A=y.videoMeta)==null?void 0:A.duration)||0,z=y.selectedKeyframes||[];(O=e.settings)!=null&&O.analysisMode;const C=e.isGenerating||h,E=((F=e.settings)==null?void 0:F.customAnalysisPrompt)||"",I=T=>{var Z,B;if(w)return null;const q=y,H=(Z=q.selectedKeyframes)==null?void 0:Z.find(V=>Math.abs(V.time-T)<.1);if(H)return H.url;const J=(B=q.frames)==null?void 0:B.find(V=>Math.abs(V.time-T)<.1);return(J==null?void 0:J.url)||null},R=T=>{const q=e.x+e.width+100,H=e.y+e.height/2,J=c(),Z={id:J,type:"gen-image",x:q-180,y:H-170,width:360,height:340,settings:{model:"mj-v6",prompt:T,ratio:"Auto",resolution:"Auto"}};a(B=>[...B,Z]),setTimeout(()=>{const B=c(),V={id:B,type:"preview",x:q+200,y:H-130,width:320,height:260};a(N=>[...N,V]),o(N=>[...N,{id:c(),from:J,to:B}])},50)};return s.jsx("div",{className:`relative w-full h-full flex flex-col transition-colors pointer-events-auto video-analyze-container ${r?"bg-[#18181b]":"bg-white"}`,children:s.jsxs("div",{className:"flex-1 flex flex-col gap-3 p-3 overflow-hidden min-h-0",children:[s.jsxs("div",{className:"space-y-2",children:[s.jsxs("div",{className:`text-[11px] px-2 py-1.5 rounded border ${r?"bg-transparent border-white/30":"bg-zinc-50 border-zinc-300"}`,children:[s.jsx("div",{className:"flex items-center justify-between mb-1",children:s.jsx("span",{className:"text-zinc-500",children:"关联的视频"})}),s.jsxs("div",{className:r?"text-zinc-300":"text-zinc-700",children:[s.jsxs("div",{children:["文件名: ",v]}),!w&&s.jsxs(s.Fragment,{children:[s.jsxs("div",{children:["总时长: ",m.toFixed(1),"s"]}),s.jsxs("div",{children:["已选关键帧: ",z.length," 个"]})]})]})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("label",{className:"text-[11px] text-zinc-500",children:"Chat模型:"}),s.jsx("select",{value:((L=e.settings)==null?void 0:L.chatModel)||((X=e.settings)==null?void 0:X.model)||"gemini-3-pro",onChange:T=>i(e.id,{settings:{...e.settings,chatModel:T.target.value,model:T.target.value}}),className:`flex-1 px-2 py-1 text-[11px] rounded border transition-colors video-analyze-select ${r?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-zinc-50 border-zinc-300 text-zinc-800"}`,onMouseDown:T=>T.stopPropagation(),children:l.filter(T=>T.type==="Chat").map(T=>s.jsx("option",{value:T.id,children:T.provider},T.id))})]}),s.jsxs("div",{className:"flex flex-col gap-1",children:[s.jsxs("button",{type:"button",onClick:()=>b(T=>!T),onMouseDown:T=>T.stopPropagation(),className:`w-full flex items-center justify-between gap-2 text-left px-2 py-1 rounded border ${r?"bg-transparent border-white/30":"bg-white border-zinc-300"}`,children:[s.jsx("span",{className:"text-[11px] text-zinc-500",children:"自定义 Prompt(可选)"}),s.jsx("span",{className:`text-[11px] text-zinc-500 transition-transform ${f?"rotate-0":"rotate-90"}`,"aria-hidden":!0,children:"▶"})]}),!f&&s.jsx("textarea",{value:E,placeholder:"留空则使用默认拆解;写入详细要求则按你的要求拆解(例如:风格、镜头语言、节奏、人物情绪等)",rows:3,onChange:T=>{const q=T.target.value;i(e.id,{settings:{...e.settings,customAnalysisPrompt:q}})},onMouseDown:T=>T.stopPropagation(),className:`w-full px-2 py-1 text-[11px] rounded border outline-none focus:outline-none focus:ring-0 resize-none ${r?"bg-transparent border-white/30 text-white":"bg-white border-zinc-300 text-zinc-800"}`})]}),s.jsx("button",{onClick:()=>{p(!0),d(e.id)},disabled:C,className:`w-full px-3 py-2 rounded border text-xs font-medium transition-colors flex items-center justify-center gap-2 ${C?r?"bg-transparent text-white/50 border-white/20 cursor-not-allowed":"bg-black text-white/60 cursor-not-allowed border-transparent":r?"bg-transparent hover:bg-transparent text-white border-white/30":"bg-black hover:bg-zinc-900 text-white shadow-lg border-transparent"}`,onMouseDown:T=>T.stopPropagation(),children:C?s.jsxs(s.Fragment,{children:[s.jsx(zr,{size:14,className:"animate-spin"}),s.jsx("span",{children:"AI 正在拆解视频中..."})]}):s.jsx(s.Fragment,{children:s.jsx("span",{children:"开始拆解视频"})})}),e.errorMsg&&s.jsx("div",{className:"text-[10px] text-red-500 px-2 py-1 rounded bg-red-500/10",children:e.errorMsg})]}),e.analysisResults&&e.analysisResults.length>0&&s.jsxs("div",{className:"space-y-2 flex-1 flex flex-col min-h-0",children:[s.jsxs("div",{className:"text-[11px] font-medium text-zinc-700 dark:text-zinc-300 shrink-0 flex items-center gap-1",children:[s.jsx(Ya,{size:12})," 拆解提示词 (",e.analysisResults.length," 个场景)"]}),s.jsx("div",{className:"space-y-2 flex-1 overflow-y-auto custom-scrollbar min-h-0",children:e.analysisResults.map((T,q)=>{var N,j,k,W,M,Y,se,ie;const H=((N=T.keyframes)==null?void 0:N.find(oe=>oe.type==="current"))||((j=T.keyframes)==null?void 0:j[0]),J=(k=T.keyframes)==null?void 0:k.find(oe=>oe.type==="prev"),Z=(W=T.keyframes)==null?void 0:W.find(oe=>oe.type==="next"),B=(H==null?void 0:H.description)||((Y=(M=T.keyframes)==null?void 0:M[0])==null?void 0:Y.description)||"无描述",V=(((se=e.settings)==null?void 0:se.expandedScenes)||[]).includes(q);return s.jsxs("div",{className:`rounded-lg border overflow-hidden ${r?"bg-transparent border-white/30":"bg-white border-zinc-300"}`,children:[s.jsx("button",{className:`w-full px-3 py-2 flex items-center justify-between text-left transition-colors ${r?"hover:bg-zinc-700/50":"hover:bg-zinc-50"}`,onClick:()=>{var ee;const oe=((ee=e.settings)==null?void 0:ee.expandedScenes)||[],re=V?oe.filter(pe=>pe!==q):[...oe,q];i(e.id,{settings:{...e.settings,expandedScenes:re}})},onMouseDown:oe=>oe.stopPropagation(),children:s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(Ja,{size:14,className:`transition-transform ${V?"rotate-90":""}`}),s.jsxs("span",{className:"font-medium text-[11px]",children:["场景 ",T.scene_index||q+1]}),s.jsx("span",{className:"text-[10px] text-zinc-500",children:T.time_range})]})}),V&&s.jsxs("div",{className:"px-3 pb-3 space-y-3",children:[s.jsx("div",{className:"text-[10px] text-zinc-600 dark:text-zinc-400 line-clamp-2 select-text cursor-text",onMouseDown:oe=>oe.stopPropagation(),children:B}),s.jsx("div",{className:"grid grid-cols-3 gap-2",children:[J,H,Z].map((oe,re)=>{if(!oe)return s.jsx("div",{className:"aspect-video bg-zinc-200 dark:bg-zinc-700 rounded"},re);const ee=I(oe.time);return s.jsxs("div",{className:"relative aspect-video bg-black rounded overflow-hidden",children:[ee?s.jsx("img",{src:ee,className:"w-full h-full object-cover",alt:`关键帧 ${re+1}`,loading:"lazy"}):s.jsx("div",{className:"w-full h-full flex items-center justify-center text-[8px] text-zinc-500",children:oe.type==="prev"?"上一帧":oe.type==="current"?"当前帧":"下一帧"}),s.jsxs("div",{className:"absolute bottom-0 left-0 right-0 bg-black/60 text-white text-[8px] px-1 py-0.5 text-center",children:[oe.time.toFixed(1),"s"]})]},re)})}),s.jsx("div",{className:"space-y-2",children:(ie=T.keyframes)==null?void 0:ie.map((oe,re)=>s.jsxs("div",{className:"space-y-1.5",children:[s.jsxs("div",{className:"text-[9px] text-zinc-500",children:[oe.type==="prev"?"上一帧":oe.type==="current"?"当前帧":oe.type==="next"?"下一帧":`帧 ${re+1}`," (",oe.time.toFixed(1),"s)"]}),oe.mj_prompt&&s.jsx("div",{className:`p-2 rounded border ${r?"bg-transparent border-white/30":"bg-zinc-50 border-zinc-200"}`,children:s.jsxs("div",{className:"flex items-start justify-between gap-2",children:[s.jsxs("div",{className:"flex-1",children:[s.jsxs("div",{className:`text-[9px] mb-1 flex items-center gap-1 ${r?"text-white":"text-green-500"}`,children:[s.jsx(Mv,{size:10})," MJ Prompt"]}),s.jsx("div",{className:`text-[10px] break-words select-text cursor-text ${r?"text-zinc-300":"text-zinc-700"}`,onMouseDown:ee=>ee.stopPropagation(),children:oe.mj_prompt})]}),s.jsxs("div",{className:"flex items-center gap-1 shrink-0",children:[s.jsx("button",{onClick:async()=>{await navigator.clipboard.writeText(oe.mj_prompt||"")},className:`p-1 rounded transition-colors ${r?"text-zinc-400 hover:text-zinc-300 hover:bg-transparent":"text-zinc-500 hover:text-zinc-700 hover:bg-zinc-200"}`,onMouseDown:ee=>ee.stopPropagation(),title:"",children:s.jsx(hj,{size:12})}),s.jsx("button",{onClick:()=>R(oe.mj_prompt||""),className:`p-1 rounded transition-colors ${r?"text-blue-400 hover:text-blue-300 hover:bg-transparent":"text-blue-600 hover:bg-blue-100"}`,onMouseDown:ee=>ee.stopPropagation(),title:"",children:s.jsx(si,{size:12})})]})]})}),oe.jimeng_prompt&&s.jsx("div",{className:`p-2 rounded border ${r?"bg-transparent border-white/30":"bg-zinc-50 border-zinc-200"}`,children:s.jsxs("div",{className:"flex items-start justify-between gap-2",children:[s.jsxs("div",{className:"flex-1",children:[s.jsxs("div",{className:`text-[9px] mb-1 flex items-center gap-1 ${r?"text-white":"text-yellow-500"}`,children:[s.jsx(Mv,{size:10})," 即梦 Prompt"]}),s.jsx("div",{className:`text-[10px] break-words select-text cursor-text ${r?"text-zinc-300":"text-zinc-700"}`,onMouseDown:ee=>ee.stopPropagation(),children:oe.jimeng_prompt})]}),s.jsx("button",{onClick:async()=>{await navigator.clipboard.writeText(oe.jimeng_prompt||"")},className:`p-1 rounded transition-colors ${r?"text-zinc-400 hover:text-zinc-300 hover:bg-transparent":"text-zinc-500 hover:text-zinc-700 hover:bg-zinc-200"}`,onMouseDown:ee=>ee.stopPropagation(),title:"",children:s.jsx(hj,{size:12})})]})})]},re))})]})]},q)})})]})]})})},Wle=()=>{try{return typeof window<"u"&&("__TAURI_INTERNALS__"in window||"__TAURI__"in window||window.location.protocol==="tauri:")}catch{return!1}},S4="qiaodoumayi_saved_folder_history",kE=10,wx=()=>{try{const e=localStorage.getItem(S4);return e?JSON.parse(e):[]}catch{return[]}},Dle=e=>{if(e.trim())try{let t=wx();t=t.filter(n=>n!==e),t.unshift(e),t.length>kE&&(t=t.slice(0,kE)),localStorage.setItem(S4,JSON.stringify(t))}catch(t){console.error("保存文件夹历史失败:",t)}},Vle=e=>{try{let t=wx();t=t.filter(n=>n!==e),localStorage.setItem(S4,JSON.stringify(t))}catch(t){console.error("删除文件夹历史失败:",t)}},Hle=({node:e,isDark:t,updateNode:n,getConnectedInputImages:r,getConnectedInputItems:i,hasMultiImageSource:a})=>{var F,L,X,T,q,H,J,Z,B,V,N,j,k,W,M,Y,se,ie;const o=_.useMemo(()=>i?i(e.id):r(e.id).map(re=>{let ee="image";if(!re)return{url:re,type:ee};const pe=re.toLowerCase();return re.startsWith("data:")?re.startsWith("data:video/")?ee="video":re.startsWith("data:audio/")&&(ee="audio"):pe.includes(".mp4")||pe.includes(".webm")||pe.includes(".mov")||pe.includes("/v1/videos/")?ee="video":(pe.includes(".mp3")||pe.includes(".wav")||pe.includes(".m4a")||pe.includes(".aac")||pe.includes(".ogg")||pe.includes(".flac")||pe.includes("audio/")||pe.includes("/v1/audio/"))&&(ee="audio"),{url:re,type:ee}}),[i,r,e.id]),l=_.useMemo(()=>o.map(oe=>oe.url),[o]),c=a(e.id),u=_.useRef([]),d=_.useRef(!!((F=e.settings)!=null&&F.autoSave)),[h,p]=_.useState(wx()),f=_.useRef(new Map),[b,g]=_.useState(new Map),y=oe=>{if(!oe)return!1;if(oe.startsWith("data:video/"))return!0;if(oe.startsWith("data:image/")||oe.startsWith("data:audio/"))return!1;const re=oe.toLowerCase();return re.includes(".mp4")||re.includes(".webm")||re.includes(".mov")||re.includes("/v1/videos/")},[w,v]=_.useState(new Set),m="VIDEO_PLACEHOLDER",z=_.useCallback(oe=>{if(f.current.has(oe))return;f.current.set(oe,m);const re=document.createElement("video");re.crossOrigin="anonymous",re.muted=!0,re.preload="metadata",re.onloadedmetadata=()=>{re.currentTime=.1},re.onseeked=()=>{try{const ee=document.createElement("canvas");ee.width=64,ee.height=64;const pe=ee.getContext("2d");if(pe&&re.videoWidth&&re.videoHeight){const we=Math.min(re.videoWidth,re.videoHeight),Q=(re.videoWidth-we)/2,me=(re.videoHeight-we)/2;pe.drawImage(re,Q,me,we,we,0,0,64,64);const ue=ee.toDataURL("image/jpeg",.7);f.current.set(oe,ue),g(new Map(f.current))}}catch{}},re.onerror=()=>{},re.src=oe},[]);_.useEffect(()=>{l.forEach(oe=>{y(oe)&&!f.current.has(oe)&&z(oe)})},[l,z]),_.useEffect(()=>{const oe=new Set(l);v(re=>{const ee=new Set(re);return ee.forEach(pe=>{oe.has(pe)||ee.delete(pe)}),ee.size===re.size?re:ee})},[l]),_.useEffect(()=>{var ee,pe,we;const oe=((ee=e.settings)==null?void 0:ee.serverUrl)||"http://127.0.0.1:9528",re=async()=>{try{const Q=await fetch(`${oe}/ping`,{method:"GET"});if(Q.ok){const me=await Q.json();try{const ue=await fetch(`${oe}/config`,{method:"GET"});if(ue.ok){const G=(await ue.json()).convert_png_to_jpg===!0;n(e.id,{settings:{...e.settings,serverStatus:"connected",savePath:me.save_path||"",convertPngToJpg:G}})}else n(e.id,{settings:{...e.settings,serverStatus:"connected",savePath:me.save_path||""}})}catch{n(e.id,{settings:{...e.settings,serverStatus:"connected",savePath:me.save_path||""}})}}else n(e.id,{settings:{...e.settings,serverStatus:"error"}})}catch{n(e.id,{settings:{...e.settings,serverStatus:"error"}})}};(!((pe=e.settings)!=null&&pe.serverStatus)||((we=e.settings)==null?void 0:we.serverStatus)==="checking")&&re()},[]);const C=oe=>{n(e.id,{settings:{...e.settings,subfolder:oe}})},E=(oe,re)=>{re.stopPropagation(),Vle(oe),p(wx())},I=async()=>{var re;const oe=((re=e.settings)==null?void 0:re.serverUrl)||"http://127.0.0.1:9528";try{const ee=await fetch(`${oe}/ping`,{method:"GET"});if(ee.ok){const pe=await ee.json();try{const we=await fetch(`${oe}/config`,{method:"GET"});if(we.ok){const me=(await we.json()).convert_png_to_jpg===!0;n(e.id,{settings:{...e.settings,serverStatus:"connected",savePath:pe.save_path||"",convertPngToJpg:me}})}else n(e.id,{settings:{...e.settings,serverStatus:"connected",savePath:pe.save_path||""}})}catch{n(e.id,{settings:{...e.settings,serverStatus:"connected",savePath:pe.save_path||""}})}}else n(e.id,{settings:{...e.settings,serverStatus:"error"}})}catch{n(e.id,{settings:{...e.settings,serverStatus:"error"}})}},R=async()=>{const oe=Wle();if(console.log("[LocalSave] Tauri环境检测:",oe),!oe){alert(`此功能仅在Tauri应用中可用。 + +请运行 "启动本地接收器.bat" 手动启动服务器。`);return}try{n(e.id,{settings:{...e.settings,serverStatus:"checking"}}),console.log("[LocalSave] 调用 start_local_server 命令...");const re=await yn("start_local_server",{port:9528});console.log("[LocalSave] 启动服务器结果:",re),setTimeout(async()=>{await I()},2e3)}catch(re){console.error("[LocalSave] 启动服务器失败:",re),n(e.id,{settings:{...e.settings,serverStatus:"error"}}),alert(`启动服务器失败: ${re} + +请确保已安装Python,或手动运行 "启动本地接收器.bat"`)}},A=_.useCallback(async(oe=!1)=>{var me,ue,U,G,te,ge;if(((me=e.settings)==null?void 0:me.serverStatus)!=="connected"){oe||alert(`请先连接本地服务器! + +运行 "启动本地接收器.bat" 启动服务。`);return}if(l.length===0){oe||alert("没有可保存的图片。请将图片节点连接到此节点。");return}const re=((ue=e.settings)==null?void 0:ue.serverUrl)||"http://127.0.0.1:9528",ee=((U=e.settings)==null?void 0:U.subfolder)||"",pe=((G=e.settings)==null?void 0:G.convertPngToJpg)??!0;try{const ne=await fetch(`${re}/config`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({convert_png_to_jpg:pe})});if(!ne.ok)console.warn(`[保存] 更新服务器配置失败,状态码: ${ne.status},将使用当前配置`);else{const le=await ne.json();console.log(`[保存] 服务器配置已更新: convert_png_to_jpg=${((te=le.config)==null?void 0:te.convert_png_to_jpg)??le.convert_png_to_jpg}`)}}catch(ne){console.warn("[保存] 更新服务器配置失败:",ne)}const we=[],Q=ne=>new Promise((le,fe)=>{const be=new FileReader;be.onloadend=()=>le(be.result),be.onerror=()=>fe(new Error("FileReader failed")),be.readAsDataURL(ne)});for(let ne=0;ne{if(!be)return null;try{const xe=await xr.readAsset(be);return xe?xe.blob:await Xr.getAssetBlob(be)||null}catch{return null}};if(de){if(_e=".mp4",!le.startsWith("data:"))try{const xe=await Ee();if(xe)ze=await Q(xe);else{const Ne=await fetch(le,{mode:"cors"});if(!Ne.ok)throw new Error("Fetch failed");const ve=await Ne.blob();ze=await Q(ve)}}catch{ze=le}}else if($e)if(le.toLowerCase().includes(".mp3")?_e=".mp3":le.toLowerCase().includes(".wav")?_e=".wav":le.toLowerCase().includes(".m4a")?_e=".m4a":le.toLowerCase().includes(".aac")?_e=".aac":le.toLowerCase().includes(".ogg")?_e=".ogg":le.toLowerCase().includes(".flac")?_e=".flac":_e=".mp3",le.startsWith("data:")){if(le.includes("data:audio/")){const xe=le.match(/data:audio\/(\w+)/);xe&&(_e={mpeg:".mp3",wav:".wav",mp4:".m4a",aac:".aac",ogg:".ogg",flac:".flac"}[xe[1]]||_e)}}else try{const xe=await Ee();let Ne;xe?Ne=xe:Ne=await(await fetch(le)).blob(),Ne.type.startsWith("audio/")&&(_e={"audio/mpeg":".mp3","audio/wav":".wav","audio/x-wav":".wav","audio/mp4":".m4a","audio/aac":".aac","audio/ogg":".ogg","audio/flac":".flac"}[Ne.type]||_e),ze=await Q(Ne)}catch{ze=le}else if(le.startsWith("data:"))le.includes("data:image/jpeg")||le.includes("data:image/jpg")?_e=".jpg":le.includes("data:image/png")?_e=".png":le.includes("data:image/webp")&&(_e=".webp");else try{const xe=await Ee();let Ne;xe?Ne=xe:Ne=await(await fetch(le)).blob(),ze=await Q(Ne),Ne.type==="image/jpeg"||le.toLowerCase().includes(".jpg")||le.toLowerCase().includes(".jpeg")?_e=".jpg":Ne.type==="image/png"||le.toLowerCase().includes(".png")?_e=".png":(Ne.type==="image/webp"||le.toLowerCase().includes(".webp"))&&(_e=".webp")}catch{ze=le}const Ce=Date.now();we.push({filename:`Qiaodoumayi_${Ce}_${ne}${_e}`,content:ze})}catch(ze){console.error("处理文件失败:",ze)}}if(we.length===0){alert("没有可保存的文件");return}try{const le=await(await fetch(`${re}/save-batch`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({files:we,subfolder:ee})})).json();if(le.success){const fe=((ge=e.settings)==null?void 0:ge.subfolder)||"";fe&&(Dle(fe),p(wx())),n(e.id,{settings:{...e.settings,lastSaved:new Date().toISOString(),savedFiles:le.results||[],lastSavedUrls:[...l]}}),oe&&console.log("[自动保存] 保存成功:",le.message)}else oe?console.error("[自动保存] 保存失败:",le.error):alert(`保存失败: ${le.error||"未知错误"}`)}catch(ne){console.error("保存请求失败:",ne),oe||alert("保存失败: 无法连接到本地服务器"),n(e.id,{settings:{...e.settings,serverStatus:"error"}})}},[e.id,e.settings,l,n]),O=JSON.stringify(l);return _.useEffect(()=>{var ue,U,G;const oe=!!((ue=e.settings)!=null&&ue.autoSave),re=oe&&!d.current;if(d.current=oe,!oe||((U=e.settings)==null?void 0:U.serverStatus)!=="connected"||l.length===0||c)return;const ee=O,pe=JSON.stringify(u.current),we=JSON.stringify(((G=e.settings)==null?void 0:G.lastSavedUrls)||[]);if(!(re||ee!==pe&&ee!==we))return;u.current=[...l],console.log("[自动保存] 触发保存,文件数:",l.length);const me=setTimeout(()=>{A(!0)},1e3);return()=>clearTimeout(me)},[O,(L=e.settings)==null?void 0:L.autoSave,(X=e.settings)==null?void 0:X.serverStatus,c]),s.jsxs("div",{className:"flex flex-col h-full pointer-events-auto",children:[s.jsxs("div",{className:"flex-1 flex flex-col p-3 gap-2 overflow-auto rh-scroll-minimal",children:[s.jsxs("div",{className:"space-y-1",children:[s.jsxs("div",{className:"flex items-center justify-between gap-2",children:[s.jsx("label",{className:`text-[10px] font-medium ${t?"text-white/80":"text-zinc-600"}`,children:"服务器地址"}),s.jsxs("span",{className:`flex items-center gap-1 text-[10px] font-medium ${((T=e.settings)==null?void 0:T.serverStatus)==="connected"?t?"text-white/80":"text-green-600":((q=e.settings)==null?void 0:q.serverStatus)==="error"?t?"text-red-400":"text-red-600":t?"text-white/60":"text-zinc-500"}`,children:[s.jsx("span",{className:`w-1 h-1 rounded-full flex-shrink-0 ${((H=e.settings)==null?void 0:H.serverStatus)==="connected"?t?"bg-white/80":"bg-green-500":((J=e.settings)==null?void 0:J.serverStatus)==="error"?"bg-red-400":t?"bg-white/50":"bg-zinc-400"}`}),((Z=e.settings)==null?void 0:Z.serverStatus)==="connected"?"已连接":((B=e.settings)==null?void 0:B.serverStatus)==="error"?"未连接":"检测中"]})]}),s.jsxs("div",{className:"flex gap-1",children:[s.jsx("input",{type:"text",value:((V=e.settings)==null?void 0:V.serverUrl)||"http://127.0.0.1:9528",onChange:oe=>n(e.id,{settings:{...e.settings,serverUrl:oe.target.value}}),placeholder:"http://127.0.0.1:9528",className:`flex-1 px-2 py-1.5 text-xs rounded border outline-none ${t?"bg-transparent border-white/30 text-white placeholder:text-white/40":"bg-white border-zinc-300 text-zinc-800"}`,onMouseDown:oe=>oe.stopPropagation()}),((N=e.settings)==null?void 0:N.serverStatus)==="error"&&s.jsxs("button",{className:`px-3 py-1 text-xs rounded border transition-colors flex items-center gap-1 ${t?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-green-500 hover:bg-green-600 text-white border-transparent"}`,onMouseDown:oe=>oe.stopPropagation(),onClick:oe=>{oe.stopPropagation(),oe.preventDefault(),R()},title:"启动本地接收器服务",children:[s.jsx(Ia,{size:12}),"启动"]}),s.jsx("button",{className:`px-2 py-1 text-xs rounded border transition-colors ${t?"border-white/30 text-white/80 hover:bg-white/5":"border-zinc-300 text-zinc-700 hover:bg-zinc-100"}`,onMouseDown:oe=>oe.stopPropagation(),onClick:oe=>{oe.stopPropagation(),oe.preventDefault(),I()},children:"测试"})]})]}),s.jsxs("div",{className:"space-y-1",children:[s.jsx("label",{className:`text-[10px] font-medium ${t?"text-white/80":"text-zinc-600"}`,children:"子文件夹(可选)"}),s.jsx("input",{type:"text",value:((j=e.settings)==null?void 0:j.subfolder)||"",onChange:oe=>n(e.id,{settings:{...e.settings,subfolder:oe.target.value}}),placeholder:"例如: project1/images",className:`w-full px-2 py-1.5 text-xs rounded border outline-none ${t?"bg-transparent border-white/30 text-white placeholder:text-white/40":"bg-white border-zinc-300 text-zinc-800"}`,onMouseDown:oe=>oe.stopPropagation()}),h.length>0?s.jsx("div",{className:"flex flex-wrap gap-1 mt-1.5",children:h.slice(0,5).map((oe,re)=>{var ee;return s.jsx("button",{className:`px-1.5 py-0.5 text-[9px] rounded border transition-colors ${t?"bg-transparent border-white/30 text-white/80 hover:bg-white/5":"bg-zinc-200 text-zinc-700 hover:bg-zinc-300 border-transparent"} ${((ee=e.settings)==null?void 0:ee.subfolder)===oe?t?"ring-1 ring-white/50":"ring-1 ring-green-500":""}`,onMouseDown:pe=>pe.stopPropagation(),onClick:()=>C(oe),onContextMenu:pe=>{pe.preventDefault(),pe.stopPropagation(),E(oe,pe)},title:`${oe} +右键删除`,children:oe.length>12?oe.slice(0,12)+"...":oe},re)})}):null]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("input",{type:"checkbox",id:`auto-save-${e.id}`,checked:!!((k=e.settings)!=null&&k.autoSave),onChange:oe=>n(e.id,{settings:{...e.settings,autoSave:oe.target.checked}}),className:"w-3.5 h-3.5 rounded",onMouseDown:oe=>oe.stopPropagation()}),s.jsx("label",{htmlFor:`auto-save-${e.id}`,className:`text-[10px] ${t?"text-white/80":"text-zinc-600"}`,children:"有新输入时自动保存"})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("input",{type:"checkbox",id:`convert-png-${e.id}`,checked:!!(((W=e.settings)==null?void 0:W.convertPngToJpg)??!0),onChange:async oe=>{var pe;const re=oe.target.checked;n(e.id,{settings:{...e.settings,convertPngToJpg:re}});const ee=((pe=e.settings)==null?void 0:pe.serverUrl)||"http://127.0.0.1:9528";try{(await fetch(`${ee}/config`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({convert_png_to_jpg:re})})).ok||console.warn("更新服务器配置失败")}catch(we){console.warn("更新服务器配置失败:",we)}},className:"w-3.5 h-3.5 rounded",onMouseDown:oe=>oe.stopPropagation()}),s.jsx("label",{htmlFor:`convert-png-${e.id}`,className:`text-[10px] ${t?"text-white/80":"text-zinc-600"}`,children:"PNG图片压缩为JPG"})]}),((M=e.settings)==null?void 0:M.savePath)&&s.jsxs("div",{className:`text-[10px] p-2 rounded border ${t?"bg-transparent border-white/30 text-white/70":"bg-zinc-100 text-zinc-600 border-transparent"}`,children:["保存路径: ",String(e.settings.savePath)]}),o.length>0&&s.jsxs("div",{className:`p-2 rounded border ${t?"bg-transparent border-white/30":"bg-zinc-50 border-zinc-200"}`,children:[s.jsxs("div",{className:`text-[10px] font-medium mb-1.5 ${t?"text-white/80":"text-zinc-700"}`,children:["待保存文件 (",o.length,")"]}),s.jsxs("div",{className:"flex flex-wrap gap-1",children:[o.slice(0,6).map((oe,re)=>{const{url:ee,type:pe}=oe,we=pe==="video",Q=pe==="audio",me=b.get(ee),ue=me&&me!=="VIDEO_PLACEHOLDER"&&me.startsWith("data:");if(we)return ue?s.jsxs("div",{className:"relative w-8 h-8 rounded overflow-hidden",children:[s.jsx("img",{src:me,className:"w-full h-full object-cover",alt:`视频 ${re+1}`}),s.jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-black/30",children:s.jsx(Ia,{size:10,className:"text-white",fill:"white"})})]},re):s.jsx("div",{className:`w-8 h-8 rounded border flex items-center justify-center ${t?"bg-transparent border-white/30":"bg-zinc-300 border-transparent"}`,children:s.jsx(aa,{size:14,className:t?"text-white/60":"text-blue-400"})},re);if(Q)return s.jsx("div",{className:`w-8 h-8 rounded border flex items-center justify-center ${t?"bg-transparent border-white/30":"bg-zinc-300 border-transparent"}`,children:s.jsx($c,{size:14,className:t?"text-white/60":"text-amber-400"})},re);const U=w.has(ee);return s.jsxs("div",{className:`relative w-8 h-8 rounded overflow-hidden border ${t?"bg-transparent border-white/30":"bg-zinc-200 border-transparent"}`,children:[!U&&s.jsx("img",{src:ee,className:"w-full h-full object-cover",alt:`待保存 ${re+1}`,onError:()=>v(G=>new Set(G).add(ee))}),U&&s.jsx("div",{className:"absolute inset-0 flex items-center justify-center",children:s.jsx(si,{size:14,className:t?"text-white/50":"text-zinc-400"})})]},re)}),o.length>6&&s.jsxs("div",{className:`w-8 h-8 rounded border flex items-center justify-center text-[10px] ${t?"bg-transparent border-white/30 text-white/60":"bg-zinc-200 text-zinc-600 border-transparent"}`,children:["+",o.length-6]})]})]}),((Y=e.settings)==null?void 0:Y.lastSaved)&&s.jsxs("div",{className:`text-[10px] ${t?"text-white/70":"text-green-600"}`,children:["✓ 上次保存: ",new Date(String(e.settings.lastSaved)).toLocaleTimeString()]})]}),s.jsx("div",{className:`px-3 py-2 border-t ${t?"border-white/30":"border-zinc-200"}`,children:s.jsxs("button",{className:`w-full px-3 py-2 rounded border text-xs font-medium transition-colors flex items-center justify-center gap-1.5 ${((se=e.settings)==null?void 0:se.serverStatus)==="connected"?t?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-green-500 hover:bg-green-600 text-white border-transparent":t?"bg-transparent border-white/20 text-white/50 cursor-not-allowed":"bg-zinc-200 text-zinc-500 cursor-not-allowed border-transparent"}`,disabled:((ie=e.settings)==null?void 0:ie.serverStatus)!=="connected",onMouseDown:oe=>oe.stopPropagation(),onClick:()=>A(!1),children:[s.jsx(xu,{size:14}),"保存到本地"]})})]})},Gle=[2,3,4,5];function qle(e,t){const n=Math.max(1,e||3),r=Math.max(1,t||3);if(n===r&&n>=2&&n<=5)return n;const i=Math.min(5,Math.max(2,Math.max(n,r)));return i>=2&&i<=5?i:3}const Kle=({isOpen:e,isDark:t,images:n,assetIds:r,rows:i,cols:a,onClose:o,onStitched:l})=>{const[c,u]=_.useState([]),[d,h]=_.useState(null),[p,f]=_.useState(!1),[b,g]=_.useState("grid"),[y,w]=_.useState(3);_.useEffect(()=>{e&&(u(n),h(null),f(!1),g("grid"),w(qle(i,a)))},[e]);const v=y,m=y,z=(R,A)=>{R===A||R<0||A<0||u(O=>{if(R>=O.length||A>=O.length)return O;const F=[...O],L=F[R];return F[R]=F[A],F[A]=L,F})},C=_.useCallback(async(R,A)=>{const O=r==null?void 0:r[R];let F=A;try{if(F.startsWith("blob:")){const{getFullBlobForDisplayUrl:L}=await mn(async()=>{const{getFullBlobForDisplayUrl:T}=await Promise.resolve().then(()=>Do);return{getFullBlobForDisplayUrl:T}},void 0,import.meta.url),X=await L(F);if(X)return URL.createObjectURL(X)}if(O){const{localCacheManager:L}=await mn(async()=>{const{localCacheManager:q}=await Promise.resolve().then(()=>Xa);return{localCacheManager:q}},void 0,import.meta.url);if(L.isAvailable()&&L.hasAsset(O)){const q=await L.readAsset(O);if(q!=null&&q.blob)return URL.createObjectURL(q.blob)}const{assetStore:X}=await mn(async()=>{const{assetStore:q}=await Promise.resolve().then(()=>_s);return{assetStore:q}},void 0,import.meta.url),T=await X.getAssetBlob(O);if(T)return URL.createObjectURL(T)}if(!F.startsWith("data:")&&!F.startsWith("blob:")){const L=await fetch(F);if(L.ok){const X=await L.blob();return URL.createObjectURL(X)}}}catch{}return F},[r]),E=_.useCallback(async()=>{if(c.length){f(!0);try{if(b==="vertical"){const W=await C(0,c[0]),M=await new Promise((te,ge)=>{const ne=new Image;ne.onload=()=>te(ne),ne.onerror=le=>ge(le),ne.src=W}),Y=Math.floor(M.naturalWidth||M.width||1024);let se=0;const ie=[];for(let te=0;te{const ze=new Image;ze.onload=()=>de(ze),ze.onerror=_e=>$e(_e),ze.src=ge}),le=ne.naturalWidth||ne.width||1024,fe=ne.naturalHeight||ne.height||1024,be=Math.max(1,Math.floor(Y/le*fe));ie.push(be),se+=be}const oe=Y,re=Math.floor(se),ee=document.createElement("canvas");ee.width=oe,ee.height=re;const pe=ee.getContext("2d");if(!pe){f(!1);return}let we=0;for(let te=0;te{const $e=new Image;$e.onload=()=>be($e),$e.onerror=ze=>de(ze),$e.src=ge}),le=ie[te],fe=Math.floor(we);pe.drawImage(ne,0,0,ne.naturalWidth||ne.width,ne.naturalHeight||ne.height,0,fe,oe,le),we=fe+le}const Q=ee.toDataURL("image/png"),me=1600;let ue=oe,U=re;if(oe>me||re>me){const te=Math.min(me/oe,me/re);ue=Math.round(oe*te),U=Math.round(re*te)}let G=Q;if(ue!==oe||U!==re){const te=document.createElement("canvas");te.width=ue,te.height=U;const ge=te.getContext("2d");ge&&(ge.drawImage(ee,0,0,oe,re,0,0,ue,U),G=te.toDataURL("image/png"))}await l({fullDataUrl:Q,previewDataUrl:G}),f(!1),o();return}const A=0,O=await C(A,c[A]),F=await new Promise((W,M)=>{const Y=new Image;Y.onload=()=>W(Y),Y.onerror=se=>M(se),Y.src=O}),L=Math.floor(F.naturalWidth||F.width||1024),X=Math.floor(F.naturalHeight||F.height||1024),T=L*m,q=X*v,H=document.createElement("canvas");H.width=T,H.height=q;const J=H.getContext("2d");if(!J){f(!1);return}const Z=c.slice(0,v*m);for(let W=0;W{const Q=new Image;Q.onload=()=>pe(Q),Q.onerror=me=>we(me),Q.src=ie}),re=se*L,ee=Y*X;J.drawImage(oe,0,0,oe.naturalWidth||oe.width,oe.naturalHeight||oe.height,re,ee,L,X)}const B=H.toDataURL("image/png"),V=1600;let N=T,j=q;if(T>V||q>V){const W=Math.min(V/T,V/q);N=Math.round(T*W),j=Math.round(q*W)}let k=B;if(N!==T||j!==q){const W=document.createElement("canvas");W.width=N,W.height=j;const M=W.getContext("2d");M&&(M.drawImage(H,0,0,T,q,0,0,N,j),k=W.toDataURL("image/png"))}await l({fullDataUrl:B,previewDataUrl:k}),f(!1),o()}catch(R){console.error("[GridStitchModal] 拼接失败:",R),f(!1)}}},[c,m,v,y,b,C,l,o]);if(!e)return null;const I=s.jsx("div",{className:"fixed inset-0 z-[120] flex items-center justify-center p-4",style:{backgroundColor:t?"rgba(0,0,0,0.65)":"rgba(0,0,0,0.45)"},onMouseDown:o,children:s.jsxs("div",{className:`w-[720px] min-w-[520px] max-w-[calc(100vw-2rem)] max-h-[calc(100vh-2rem)] rounded-xl shadow-2xl overflow-hidden flex flex-col flex-shrink-0 ${t?"bg-[#18181b] text-zinc-100":"bg-white text-zinc-900"}`,onMouseDown:R=>R.stopPropagation(),children:[s.jsxs("div",{className:`px-4 py-3 border-b flex flex-col gap-3 flex-shrink-0 ${t?"border-zinc-700":"border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-start justify-between gap-3",children:[s.jsxs("div",{className:"flex flex-col gap-0.5 min-w-0 flex-1",children:[s.jsx("span",{className:"text-sm font-medium whitespace-nowrap",children:"宫格拼接"}),s.jsx("span",{className:"text-[11px] opacity-70 break-words",children:b==="vertical"?"竖排拼接:按顺序从上到下竖着拼成一列(使用原图分辨率)":`拖拽调整顺序,按 ${v}×${m} 宫格从左到右、从上到下拼接(使用原图分辨率)`})]}),s.jsx("button",{type:"button",className:"text-xs px-2 py-1 rounded border border-transparent hover:border-zinc-500/60 whitespace-nowrap flex-shrink-0",onClick:o,children:"关闭"})]}),s.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[s.jsx("span",{className:"text-[11px] opacity-70 whitespace-nowrap",children:"拼接方式:"}),s.jsxs("div",{className:`inline-flex rounded-lg border p-0.5 flex-shrink-0 ${t?"border-zinc-600 bg-zinc-800/50":"border-zinc-300 bg-zinc-100"}`,children:[s.jsx("button",{type:"button",className:`px-3 py-1.5 rounded-md text-xs font-medium transition-colors whitespace-nowrap ${b==="grid"?t?"bg-violet-600 text-white":"bg-blue-600 text-white":t?"text-zinc-400 hover:text-zinc-200":"text-zinc-600 hover:text-zinc-900"}`,onClick:()=>g("grid"),children:"宫格排列"}),s.jsx("button",{type:"button",className:`px-3 py-1.5 rounded-md text-xs font-medium transition-colors whitespace-nowrap ${b==="vertical"?t?"bg-violet-600 text-white":"bg-blue-600 text-white":t?"text-zinc-400 hover:text-zinc-200":"text-zinc-600 hover:text-zinc-900"}`,onClick:()=>g("vertical"),children:"竖排拼接"})]})]}),b==="grid"&&s.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[s.jsx("span",{className:"text-[11px] opacity-70 whitespace-nowrap",children:"宫格大小:"}),s.jsx("div",{className:`inline-flex rounded-lg border p-0.5 flex-wrap gap-0.5 ${t?"border-zinc-600 bg-zinc-800/50":"border-zinc-300 bg-zinc-100"}`,children:Gle.map(R=>s.jsxs("button",{type:"button",className:`px-2.5 py-1 rounded-md text-xs font-medium transition-colors whitespace-nowrap ${y===R?t?"bg-violet-600 text-white":"bg-blue-600 text-white":t?"text-zinc-400 hover:text-zinc-200":"text-zinc-600 hover:text-zinc-900"}`,onClick:()=>w(R),children:[R,"×",R]},R))})]})]}),s.jsx("div",{className:"flex-1 overflow-auto p-4",children:s.jsx("div",{className:"mx-auto grid gap-1.5",style:{gridTemplateColumns:`repeat(${b==="vertical"?3:m}, minmax(0, 1fr))`,maxWidth:640},onDragOver:R=>{R.preventDefault(),R.stopPropagation(),R.dataTransfer.dropEffect="move"},children:c.map((R,A)=>s.jsxs("div",{className:`relative aspect-[4/3] rounded border overflow-hidden cursor-grab active:cursor-grabbing touch-none select-none ${t?"border-zinc-700 bg-zinc-900":"border-zinc-200 bg-zinc-50"} ${d===A?"opacity-60 scale-95":""}`,draggable:!0,title:"长按拖拽可调换图片顺序",onDragStart:O=>{O.dataTransfer.setData("text/plain",String(A)),O.dataTransfer.effectAllowed="move",O.stopPropagation(),h(A)},onDragEnd:()=>h(null),onDragEnter:O=>{O.preventDefault(),O.stopPropagation(),O.dataTransfer.dropEffect="move"},onDragOver:O=>{O.preventDefault(),O.stopPropagation(),O.dataTransfer.dropEffect="move"},onDrop:O=>{O.preventDefault(),O.stopPropagation();const F=Number(O.dataTransfer.getData("text/plain"));!Number.isNaN(F)&&F!==A&&z(F,A)},children:[s.jsx("img",{src:R,alt:`图${A+1}`,className:"w-full h-full object-cover pointer-events-none"}),s.jsx("div",{className:`absolute top-1 left-1 text-[10px] px-1.5 py-0.5 rounded-full font-medium ${t?"bg-black/60 text-white":"bg-white/80 text-zinc-800"}`,children:A+1})]},`tile-${A}`))})}),s.jsxs("div",{className:`px-4 py-3 border-t flex items-center justify-between gap-3 flex-shrink-0 ${t?"border-zinc-700":"border-zinc-200"}`,children:[s.jsx("span",{className:"text-[11px] opacity-70 break-words min-w-0",children:b==="vertical"?`当前共 ${c.length} 张图,将按顺序从上到下竖排拼接。`:`当前共 ${c.length} 张图,将按 ${y}×${y} 宫格从左到右、从上到下拼接(至多 ${y*y} 格)。`}),s.jsxs("div",{className:"flex items-center gap-2 flex-shrink-0",children:[s.jsx("button",{type:"button",className:`px-3 py-1.5 rounded text-xs border whitespace-nowrap ${t?"border-zinc-600 text-zinc-200 hover:bg-zinc-800":"border-zinc-300 text-zinc-700 hover:bg-zinc-100"}`,onClick:o,disabled:p,children:"取消"}),s.jsx("button",{type:"button",className:`px-3 py-1.5 rounded text-xs font-medium border whitespace-nowrap ${t?"border-violet-500 bg-violet-600 text-white hover:bg-violet-500":"border-blue-500 bg-blue-600 text-white hover:bg-blue-500"} ${p?"opacity-80 cursor-wait":""}`,onClick:E,disabled:p||!c.length,children:p?"拼接中…":"开始拼接"})]})]})]})});return Ni.createPortal(I,document.body)};function AE(e){if(!e||typeof e!="string")return!1;const t=e.toLowerCase();return(t.includes("prod-ss-vidu")||t.includes("s3")&&t.includes("amazonaws"))&&(t.includes(".mp4")||t.includes("/video"))}const Xle=({node:e,isDark:t,updateNode:n,setNodes:r,setPreviewContextMenu:i,setLightboxItem:a,setLightboxOpen:o,setChatFiles:l,setIsChatOpen:c,generateId:u,viewZoom:d=1,onDownload:h,isDownloading:p=!1,downloadProgress:f,renderQuality:b="high",shouldHideBorder:g=!1,nodes:y=[],connections:w=[],splitImageToShots:v,setConnections:m,setIsCanvasFullscreen:z,onGenerateFromUpstream:C,isCompactMode:E=!1,onCompactModeImageClick:I})=>{var xt,Tt,St;const[R,A]=fr.useState([]),[O,F]=fr.useState(null),[L,X]=fr.useState(!1),[T,q]=fr.useState(!1),H=fr.useRef(!1),[J,Z]=fr.useState(0),[B,V]=fr.useState(!1),[N,j]=fr.useState(!1),[k,W]=fr.useState(null),M=fr.useCallback(async(Qe,Ue)=>{if(!(Qe!=null&&Qe.startsWith("blob:")))return null;try{const{recoverDeadBlobUrl:Ge}=await mn(async()=>{const{recoverDeadBlobUrl:at}=await Promise.resolve().then(()=>Do);return{recoverDeadBlobUrl:at}},void 0,import.meta.url);return await Ge(Qe,[Ue])}catch{return null}},[]),[Y,se]=fr.useState(!1),[ie,oe]=fr.useState(!1),[re,ee]=fr.useState(!1),[pe,we]=fr.useState(!1),Q=fr.useRef(null),{content:me,isLoading:ue}=Ul(e.content,{usePreview:!0,nodeType:"preview",shouldLoadContent:!0,preferConstantDisplay:!0}),{content:U}=Ul(e.selectedPreviewImage,{nodeType:"preview",shouldLoadContent:!0,preferConstantDisplay:!0}),{content:G}=Ul(e.selectedPreviewVideo,{nodeType:"preview",shouldLoadContent:!0,preferConstantDisplay:!0}),te=e.previewMjImages||[],ge=iu(te,{usePreview:!0,nodeType:"preview",shouldLoadContent:!0,preferConstantDisplay:!0}),ne=ge.map(Qe=>Qe.content).filter(Boolean),le=ge.some(Qe=>Qe.isLoading),fe=e.previewMjVideos||[],be=iu(fe,{nodeType:"preview",shouldLoadContent:!0,preferConstantDisplay:!0}),de=be.map(Qe=>Qe.content).filter(Boolean),$e=be.some(Qe=>Qe.isLoading),ze=e.settings||{},_e=typeof ze.expandModelId=="string"||typeof ze.expandModelName=="string"||typeof ze.eraserModelId=="string"||typeof ze.eraserModelName=="string",Ee=fr.useMemo(()=>w.filter(Ge=>Ge.to===e.id&&(!Ge.inputType||Ge.inputType==="default")).map(Ge=>Ge.from).map(Ge=>y.find(at=>at.id===Ge)).filter(Ge=>Ge!=null&&Ge.type==="input-image").map(Ge=>Ge.content).filter(Ge=>typeof Ge=="string"&&Ge.length>0),[w,e.id,y]),Ce=fr.useMemo(()=>{var rt;const Ge=w.filter(lt=>lt.to===e.id&&(!lt.inputType||lt.inputType==="default")).map(lt=>lt.from).map(lt=>y.find(ot=>ot.id===lt)).filter(lt=>lt!=null&&(lt.type==="rh-app"||lt.type==="rh-comfy")),at=[];for(const lt of Ge){const ot=lt.previewMjImages;if(ot!=null&&ot.length)at.push(...ot);else if(typeof lt.content=="string"&<.content.length>0)at.push(lt.content);else{const At=(rt=lt.settings)==null?void 0:rt.generatedImages;At!=null&&At.length&&at.push(...At.map(kt=>kt.fullUrl||kt.thumbUrl).filter(Boolean))}}return at},[w,e.id,y]),xe=iu(Ee,{usePreview:!0,nodeType:"preview",shouldLoadContent:!0,preferConstantDisplay:!0}),Ne=xe.map(Qe=>Qe.content).filter(Boolean);xe.some(Qe=>Qe.isLoading);const ve=!_e&&Ee.length>=2,ke=!_e&&Ee.length===1,Pe=iu(Ce,{usePreview:!0,nodeType:"preview",shouldLoadContent:!0,preferConstantDisplay:!0}).map(Qe=>Qe.content).filter(Boolean),Te=Ce.length>0,Be=!!(ze._isStoryboardMosaic&&ze._stitchedFullUrl),He=me||ne.length>0||de.length>0||Be&&!!me||ve&&(Ne.length>0||Ee.length>=2)||ke&&(Ne.length>0||Ee.length===1)||Te&&(Pe.length>0||Ce.length>0),Je=Be&&me?[me]:ve&&Ne.length>=2||ke&&Ne.length>0?Ne:ne.length>0?ne:Te&&Pe.length>0?Pe:me?[me]:[],Me=de.length>0?de:[],Re=G||U||Me[0]||Je[0]||null,Ve=Je.length>1,Ze=Me.length>1,{upstreamGenNodes:je,isUpstreamReused:Le}=fr.useMemo(()=>{const Ue=w.filter(lt=>lt.to===e.id&&(!lt.inputType||lt.inputType==="default")).map(lt=>lt.from),Ge=y.filter(lt=>Ue.includes(lt.id)&&(lt.type==="gen-image"||lt.type==="gen-video"||lt.type==="motion-control"||lt.type==="storyboard-chart-node"||lt.type==="rh-app"||lt.type==="rh-comfy")),at=new Set(y.filter(lt=>lt.type==="preview").map(lt=>lt.id)),rt=Ge.some(lt=>w.filter(ot=>ot.from===lt.id&&at.has(ot.to)).length>=2);return{upstreamGenNodes:Ge,isUpstreamReused:rt}},[w,e.id,y]),Xe=fr.useMemo(()=>{const Qe=Ue=>{const Ge=Ue.settings||{},at=Ge.selectedPreviewId,rt=Ge._autoCreatedPreviewId;if(at)return at===e.id;if(rt)return rt===e.id;const lt=w.filter(ot=>ot.from===Ue.id).map(ot=>{var At;return(At=y.find(kt=>kt.id===ot.to&&kt.type==="preview"))==null?void 0:At.id}).filter(ot=>typeof ot=="string");return lt.length>0?lt[lt.length-1]===e.id:!1};return je.filter(Qe)},[je,w,y,e.id]),qe=fr.useMemo(()=>y.find(Qe=>{var Ue,Ge;return(Qe.type==="gen-image"||Qe.type==="gen-video"||Qe.type==="motion-control")&&(((Ue=Qe.settings)==null?void 0:Ue.selectedPreviewId)===e.id||((Ge=Qe.settings)==null?void 0:Ge._autoCreatedPreviewId)===e.id)}),[y,e.id]),tt=fr.useMemo(()=>{const Qe=qe?[qe]:[];return[...Xe,...Qe].find(Ge=>Ge.type==="motion-control")},[Xe,qe]),Ye=fr.useMemo(()=>{var Ue;if(!tt)return null;const Qe=((Ue=tt.settings)==null?void 0:Ue.model)||"kling-video-v2-6";return Qe==="kling-v3"||Qe.includes("kling-v3")?"可灵 · Kling 3.0":"可灵 · Kling v2.6"},[tt]),ct=fr.useMemo(()=>{var at,rt,lt,ot;const Qe=qe?[...Xe,qe]:Xe;let Ue=null,Ge=null;for(const At of Qe){const kt=!!At.isGenerating||!!((at=At.settings)!=null&&at.isGenerating),Ot=At.errorMsg||((rt=At.settings)==null?void 0:rt.error);kt&&(Ue=At),Ot&&!Ge&&(Ge=At)}if(Ue){const At=(lt=Ue.settings)==null?void 0:lt.progress;return{generating:!0,progress:typeof At=="number"?At:void 0}}return Ge?{generating:!1,error:Ge.errorMsg||((ot=Ge.settings)==null?void 0:ot.error)||"生成失败"}:{generating:!1}},[Xe,qe]);fr.useEffect(()=>{He&&L&&X(!1)},[He,L]),fr.useEffect(()=>{if(!L)return;const Qe=window.setTimeout(()=>X(!1),300*1e3);return()=>clearTimeout(Qe)},[L]),fr.useEffect(()=>{const Qe=Ue=>{const Ge=Ue.detail;(Ge==null?void 0:Ge.previewNodeId)===e.id&&(X(!1),j(!1))};return window.addEventListener("previewGenerateFailed",Qe),()=>window.removeEventListener("previewGenerateFailed",Qe)},[e.id]),fr.useEffect(()=>{const Qe=Ue=>{const Ge=Ue.detail;(Ge==null?void 0:Ge.targetPreviewId)===e.id&&j(!0)};return window.addEventListener("previewGenerationStarted",Qe),()=>window.removeEventListener("previewGenerationStarted",Qe)},[e.id]);const pt=ct.generating||L||N;fr.useEffect(()=>{pt&&(H.current=!0)},[pt]),fr.useEffect(()=>{N&&(H.current=!0)},[N]),fr.useEffect(()=>{pt&&V(!1)},[pt]),fr.useEffect(()=>{He&&H.current&&(H.current=!1,j(!1),q(!0))},[He]);const ht=fr.useCallback(Qe=>{Qe.propertyName==="opacity"&&(q(!1),Z(0))},[]);fr.useEffect(()=>{if(!pt){T||Z(0);return}const Qe=Date.now(),Ue=75*1e3;let Ge;const at=()=>{const rt=Date.now()-Qe,lt=Math.min(rt/Ue*100,100);Z(lt),lt<100&&(Ge=requestAnimationFrame(at))};return Ge=requestAnimationFrame(at),()=>cancelAnimationFrame(Ge)},[pt,T]);const wt=te.length>0||Be||ve&&Ne.length>=2||ke&&Ne.length>0||Te&&Pe.length>0,$t=!wt&&(e.previewType==="video"||Ze||Re&&(Re.startsWith("data:video")||/\.(mp4|webm|mov)(\?|$)/i.test(Re.split("?")[0])||Re.includes("force_video_display=true"))),jt=e.previewType==="audio"||Re&&(Re.startsWith("data:audio")||/\.(mp3|wav|ogg|m4a|aac|flac)(\?|$)/i.test(Re.split("?")[0])),Nt=Re&&!wt&&(Re.startsWith("data:video")||Re.startsWith("blob:")||/\.(mp4|webm|mov)(\?|$)/i.test(Re.split("?")[0])||Re.includes("force_video_display=true")||e.previewType==="video"&&(Re.startsWith("http")||Re.startsWith("https"))&&(Re.includes("vlabvod.com")||Re.includes("dreamnia.jimeng.com")||Re.includes(".mp4"))),Yt=ue||le||$e;(xt=e.settings)!=null&&xt.generationTime;const un=!!e._expandPending&&typeof e._expandTaskStartTime=="number",[Tn,Ht]=fr.useState(0),[fn,Dn]=fr.useState(!1),it=fr.useRef(!1);fr.useEffect(()=>{if(!un){it.current&&(Ht(100),Dn(!0)),it.current=!1;return}it.current=!0;const Qe=e._expandTaskStartTime,Ue=75*1e3;let Ge;const at=()=>{const rt=Date.now()-Qe,lt=Math.min(rt/Ue*95,95);Ht(lt),lt<95&&(Ge=requestAnimationFrame(at))};return Ge=requestAnimationFrame(at),()=>cancelAnimationFrame(Ge)},[un,e._expandTaskStartTime]);const Lt=fr.useCallback(Qe=>{Qe.propertyName==="opacity"&&(Dn(!1),Ht(0))},[]),gt=fr.useRef(null);fr.useEffect(()=>{const Qe=Re;if(!Qe||!$t||!AE(Qe)){gt.current&&(URL.revokeObjectURL(gt.current),gt.current=null),W(null),se(!1),oe(!1);return}return W(Qe),se(!1),oe(!1),gt.current=Qe,()=>{gt.current=null,W(null),se(!1),oe(!1)}},[Re,$t]);const Jt=fr.useMemo(()=>{var at;const Qe=w.find(rt=>rt.to===e.id);if(!Qe)return;const Ue=y.find(rt=>rt.id===Qe.from);return Ue&&(Ue.prompt||((at=Ue.settings)==null?void 0:at.prompt)||"").trim()||void 0},[w,y,e.id]),Wt=Qe=>{var Ue;if(Qe.preventDefault(),Qe.stopPropagation(),R.length>0){const Ge=[...R].sort((rt,lt)=>rt-lt),at=Ge.map(rt=>Je[rt]).filter(Boolean);i({visible:!0,x:Qe.clientX,y:Qe.clientY,item:{url:at[0],type:$t?"video":jt?"audio":"image",sourceNode:e,selectedUrls:at,selectedIndices:Ge,prompt:Jt}})}else if(Re){let Ge=Re,at,rt;if(Ve&&Je.length>0){const ot=e.selectedPreviewImage||Je[0],At=Math.max(0,Je.indexOf(ot));Ge=Je[At]||Je[0],at=[Ge],rt=[At]}const lt=$t?((Ue=_t.current)==null?void 0:Ue.currentTime)??0:void 0;i({visible:!0,x:Qe.clientX,y:Qe.clientY,item:{url:Ge,type:$t?"video":jt?"audio":"image",sourceNode:e,prompt:Jt,...$t?{videoCurrentTime:lt}:{},...at?{selectedUrls:at,selectedIndices:rt}:{}}})}},Pt=fr.useCallback(async(Qe,Ue,Ge)=>{var kt;if(Qe.preventDefault(),Qe.stopPropagation(),!a||!o)return;let at=Ue||Re,rt=Ve?Je:void 0;const ot=Ze&&Me.includes(at||"")||$t?"video":jt?"audio":"image";if(ot==="image"){const Ot=e._previewMjAssetIds&&e._previewMjAssetIds.length>0?e._previewMjAssetIds:e._contentAssetId?[e._contentAssetId]:[],dn=Vt=>{if(!Vt)return null;try{return C5(Vt)||null}catch{return null}};if(Ot.length===0){const Vt=dn(at);Vt&&Ot.push(Vt)}if(Ot.length>0)try{const{localCacheManager:Vt}=await mn(async()=>{const{localCacheManager:_n}=await Promise.resolve().then(()=>Xa);return{localCacheManager:_n}},void 0,import.meta.url),{assetStore:Zt}=await mn(async()=>{const{assetStore:_n}=await Promise.resolve().then(()=>_s);return{assetStore:_n}},void 0,import.meta.url),Sn=[];for(let _n=0;_n0&&(at=jn[Ge??0]??jn[0],rt=jn)}catch(Vt){console.warn("[PreviewNodeInline] Failed to resolve original images for lightbox:",Vt)}}if(Ve&&te.length>0&&!rt)try{const dn=(await Promise.all(te.map(Vt=>Ln.isContentRef(Vt)?Ln.get(Ln.extractId(Vt)):Promise.resolve(Vt)))).filter(Boolean);dn.length>0&&(at=dn[Ge??0]??dn[0],rt=dn)}catch(Ot){console.warn("[PreviewNodeInline] Failed to load images for lightbox:",Ot)}if(!at)return;const At={id:e.id,url:at,type:ot,prompt:e.prompt||"",title:void 0,width:e.width,height:e.height,modelName:((kt=e.settings)==null?void 0:kt.model)||"Unknown",mjImages:rt,mjVideos:Ze?Me:void 0,selectedMjImageIndex:Ge!==void 0?Ge:0};a(At),o(!0),(Qe.ctrlKey||Qe.metaKey)&&z&&z(!0)},[Re,$t,jt,Ve,Ze,Je,Me,te,e,a,o,z]),Bt=()=>{!Ve||Je.length===0||ee(!0)},zt=async Qe=>{if(!(!(Qe!=null&&Qe.fullDataUrl)||!(Qe!=null&&Qe.previewDataUrl)))try{const{contentStore:Ue}=await mn(async()=>{const{contentStore:rt}=await Promise.resolve().then(()=>Nh);return{contentStore:rt}},void 0,import.meta.url),Ge=await Ue.storeImageUrlAsRef(Qe.fullDataUrl),at=await Ue.storeImageUrlAsRef(Qe.previewDataUrl);n(e.id,{content:at,previewType:"image",previewMjImages:void 0,selectedPreviewImage:void 0,settings:{...e.settings||{},previewGridRows:1,previewGridCols:1,_isStoryboardMosaic:!0,_stitchedFullUrl:Ge,_stitchedPreviewUrl:at}});try{const{localCacheManager:rt}=await mn(async()=>{const{localCacheManager:lt}=await Promise.resolve().then(()=>Xa);return{localCacheManager:lt}},void 0,import.meta.url);if(rt.isAvailable()){const lt=Ue.extractId(Ge);try{const At=await(await fetch(Qe.fullDataUrl)).blob();await rt.saveAsset(lt,At,"image/png")}catch(ot){console.warn("[PreviewNode] 拼图原图写入本地缓存失败:",ot)}try{const At=await(await fetch(Qe.previewDataUrl)).blob(),kt=`preview_${lt}`;await rt.saveAsset(kt,At,"image/png",void 0,"thumbnails")}catch(ot){console.warn("[PreviewNode] 拼图缩略图写入本地缓存失败:",ot)}}}catch(rt){console.warn("[PreviewNode] 拼图写入本地缓存目录失败(原图/缩略图):",rt)}}catch{n(e.id,{content:Qe.previewDataUrl,previewType:"image",previewMjImages:void 0,selectedPreviewImage:void 0,settings:{...e.settings||{},previewGridRows:1,previewGridCols:1,_isStoryboardMosaic:!0,_stitchedFullUrl:Qe.fullDataUrl,_stitchedPreviewUrl:Qe.previewDataUrl}})}},Gt=async()=>{var jn;const Qe=e.settings||{},Ue=Qe._stitchedFullUrl,Ge=Qe._stitchedPreviewUrl;if(!!Qe._isStoryboardMosaic&&typeof Ue=="string"&&Ue){const _n=e.x+e.width+100,Cn=e.y;let Kn=Ue;try{const{contentStore:$r}=await mn(async()=>{const{contentStore:Rr}=await Promise.resolve().then(()=>Nh);return{contentStore:Rr}},void 0,import.meta.url),{localCacheManager:Tr}=await mn(async()=>{const{localCacheManager:Rr}=await Promise.resolve().then(()=>Xa);return{localCacheManager:Rr}},void 0,import.meta.url),kr=$r.extractId(Ue);if(Tr.isAvailable()&&Tr.hasAsset(kr)){const Rr=await Tr.readAsset(kr);if(Rr!=null&&Rr.blob){const sr=URL.createObjectURL(Rr.blob);try{Kn=await $r.storeImageUrlAsRef(sr)}finally{try{URL.revokeObjectURL(sr)}catch{}}}}}catch($r){console.warn("[PreviewNode] 从缓存目录读取拼接原图失败,使用 content_ref:",$r)}const Xn={id:u(),type:"input-image",x:_n,y:Cn,width:320,height:280,content:Kn,prompt:"",settings:{mediaType:"image",_mosaicRefFull:Ue,_mosaicRefPreview:Ge}};r($r=>[...$r,Xn]);return}const rt=Re;if(!rt)return;const lt=e.x+e.width+100,ot=e.y;let At=rt,kt="";const Ot=e._previewMjAssetIds,dn=Ve&&Je.length>0?Je.findIndex(_n=>_n===rt):-1,Vt=dn>=0&&(Ot!=null&&Ot[dn])?Ot[dn]:e._contentAssetId;try{if(Vt){const{localCacheManager:_n}=await mn(async()=>{const{localCacheManager:Cn}=await Promise.resolve().then(()=>Xa);return{localCacheManager:Cn}},void 0,import.meta.url);if(_n.isAvailable()&&_n.hasAsset(Vt)){const Cn=await _n.readAsset(Vt);Cn&&(At=URL.createObjectURL(Cn.blob),kt=Cn.mimeType)}if(At===rt){const{assetStore:Cn}=await mn(async()=>{const{assetStore:Xn}=await Promise.resolve().then(()=>_s);return{assetStore:Xn}},void 0,import.meta.url),Kn=await Cn.getAssetBlob(Vt);Kn&&(At=URL.createObjectURL(Kn),kt=Kn.type)}}if(At===rt){const _n=await fetch(rt);if(_n.ok){const Cn=await _n.blob();kt=Cn.type,At=URL.createObjectURL(Cn)}}}catch(_n){console.warn("[PreviewNode] 获取原图失败:",_n)}let Zt="image";kt.startsWith("video/")||e.previewType==="video"||rt.match(/\.(mp4|webm|ogg|mov)$/i)||rt.includes("video")?Zt="video":(kt.startsWith("audio/")||rt.match(/\.(mp3|wav|ogg|m4a|aac)$/i)||rt.includes("audio"))&&(Zt="audio"),console.log("[PreviewNode] ========== Detected mediaType:",Zt,"=========="),console.log("[PreviewNode] Detection factors:",{blobType:kt,previewType:e.previewType,urlMatch:rt.match(/\.(mp4|webm|ogg|mov)$/i),includesVideo:rt.includes("video")});const Sn={id:u(),type:"input-image",x:lt,y:ot,width:280,height:280,content:At,prompt:"",settings:{mediaType:Zt,_blobUrl:At,...Vt?{_assetId:Vt}:{}}};console.log("[PreviewNode] ========== Creating new node =========="),console.log("[PreviewNode] Node details:",{id:Sn.id,type:Sn.type,settings:Sn.settings,contentPreview:(jn=Sn.content)==null?void 0:jn.substring(0,50)}),r(_n=>{const Cn=[..._n,Sn];return console.log("[PreviewNode] ========== Nodes updated, total nodes:",Cn.length,"=========="),Cn})},qt=async()=>{if(!Re||!v){Gt();return}let Ue=w.filter(lt=>lt.from===e.id).map(lt=>y.find(ot=>ot.id===lt.to&&ot.type==="storyboard-node")).filter(Boolean)[0]||null,Ge=!1;if(!Ue){const lt=e.x+e.width+100,ot=e.y,At={id:u(),type:"storyboard-node",x:lt,y:ot,width:400,height:600,content:"",prompt:"",settings:{shots:[]}};if(r(kt=>[...kt,At]),Ue=At,Ge=!0,m){const kt={id:u(),from:e.id,to:At.id};m(Ot=>Ot.some(Vt=>Vt.from===kt.from&&Vt.to===kt.to)?Ot:[...Ot,kt])}}const at=Ve?Je.length:1;let rt;if(Ve&&at>1){const lt=Math.ceil(Math.sqrt(at));rt={rows:Math.ceil(at/lt),cols:lt}}else rt={rows:2,cols:2};try{if(Ge&&await new Promise(lt=>setTimeout(lt,100)),Ve&&Je.length>1){const lt=`检测到${Je.length}张图片,是否要将所有图片拆分为分镜镜头? + +点击"确定"将每张图片作为一个镜头,点击"取消"将第一张图片按${rt.rows}x${rt.cols}网格拆分。`;if(window.confirm(lt))for(let At=0;AtsetTimeout(Ot,100)),await v(Ue.id,kt,{rows:1,cols:1})}else await v(Ue.id,Re,rt)}else await v(Ue.id,Re,rt)}catch(lt){const ot=lt instanceof Error?lt.message:"未知错误";console.warn(`[PreviewNode] 发送到分镜节点失败: ${ot}`)}},De=()=>{if(!Re)return;const Qe={name:$t?"Preview.mp4":jt?"Preview.mp3":"Preview.png",type:$t?"video/mp4":jt?"audio/mpeg":"image/png",content:Re,isImage:!$t&&!jt,isVideo:$t,isAudio:jt,fromPreview:!0};l(Ue=>[...Ue,Qe]),c(!0)},st=async Qe=>{if(!(!Re||!h)&&(Qe.ctrlKey||Qe.metaKey)){Qe.preventDefault(),Qe.stopPropagation();const Ue=$t?"mp4":jt?"mp3":"png",Ge=`Preview-${Date.now()}.${Ue}`;await h(Re,Ge,$t?"video":jt?"audio":"image")}},[Ae,nt]=fr.useState(null);fr.useRef(null);const _t=fr.useRef(null);return fr.useEffect(()=>{var Qe;if(!Ve&&!Ze&&Re&&!$t&&!jt){const Ue=new Image;Ue.onload=()=>{var dn;const Ge=Re.startsWith("blob:")?e$(Re):null,at=Ge&&Ge.width>0&&Ge.height>0?{width:Ge.width,height:Ge.height}:{width:Ue.naturalWidth,height:Ue.naturalHeight};nt(at);const rt=`${at.width}×${at.height}`;((dn=e.settings)==null?void 0:dn.previewSize)!==rt&&n(e.id,{settings:{...e.settings,previewSize:rt}});const lt=at.height/at.width,ot=at.height>at.width,At=420;let kt,Ot;ot?(Ot=Math.min(At,Math.round(e.width*lt)),kt=Math.round(Ot/lt)):(kt=e.width,Ot=Math.round(e.width*lt)),(Math.abs(Ot-e.height)>10||Math.abs(kt-e.width)>10)&&n(e.id,{width:kt,height:Ot})},Ue.onerror=()=>nt(null),Ue.src=Re}else if(!(!Ze&&$t&&Nt)){if(Ve&&Je.length>0){const Ue=Je[0],Ge=new Image;Ge.onload=()=>{var Xn,$r,Tr;const at=Ue.startsWith("blob:")?e$(Ue):null,rt=at&&at.width>0&&at.height>0?{width:at.width,height:at.height}:{width:Ge.naturalWidth,height:Ge.naturalHeight};nt(rt);const lt=`${rt.width}×${rt.height}`;((Xn=e.settings)==null?void 0:Xn.previewSize)!==lt&&n(e.id,{settings:{...e.settings,previewSize:lt}});const ot=Je.length,At=($r=e.settings)==null?void 0:$r.previewGridRows,kt=(Tr=e.settings)==null?void 0:Tr.previewGridCols,Ot=kt!=null&&At!=null&&kt>0&&At>0?kt:ot===1?1:ot===4?2:ot===9?3:2,dn=kt!=null&&At!=null&&kt>0&&At>0?At:ot===1?1:ot===4?2:ot===9?3:Math.ceil(ot/2),Vt=e.width/Ot,Zt=rt.height/rt.width,Sn=Vt*Zt,jn=rt.height>rt.width,_n=420;let Cn,Kn;jn?(Kn=Math.min(_n,Math.round(Sn*dn)),Cn=Math.round(Kn/dn*Ot/Zt)):(Cn=e.width,Kn=Math.round(Sn*dn)),(Math.abs(Kn-e.height)>10||Math.abs(Cn-e.width)>10)&&n(e.id,{width:Cn,height:Kn})},Ge.onerror=()=>nt(null),Ge.src=Ue}else if(nt(null),!Re&&((Qe=e.settings)!=null&&Qe.previewSize)){const{previewSize:Ue,...Ge}=e.settings;n(e.id,{settings:Ge})}}},[Re,$t,jt,Ve,Ze,Je,e.width,e.height,e.id,n]),fr.useEffect(()=>{const Qe=Ge=>{const at=Ge.target;Q.current&&!Q.current.contains(at)&&pe&&we(!1)},Ue=Ge=>{const at=Ge.detail;(at==null?void 0:at.nodeId)!==e.id&&pe&&we(!1)};return document.addEventListener("mousedown",Qe),window.addEventListener("previewNodeFocused",Ue),()=>{document.removeEventListener("mousedown",Qe),window.removeEventListener("previewNodeFocused",Ue)}},[pe,e.id]),s.jsxs("div",{ref:Q,className:"flex flex-col pointer-events-auto group w-full h-full overflow-hidden min-w-0",children:[s.jsxs("div",{className:"flex flex-col p-0 gap-0 w-full h-full flex-1 min-h-0 overflow-hidden min-w-0",children:[s.jsxs("div",{className:`relative rounded-xl overflow-hidden flex items-center justify-center w-full flex-1 min-h-0 ${!$t&&!jt&&!Ze&&Ae||$t&&!Ze&&!jt&&Ae?"bg-transparent border-0":t?"bg-zinc-900 border border-zinc-700/40":"bg-white border border-zinc-200/60"}`,style:{width:"100%",height:"100%"},onMouseDown:()=>{we(!0),window.dispatchEvent(new CustomEvent("previewNodeFocused",{detail:{nodeId:e.id}}))},onContextMenu:Wt,onDoubleClick:Qe=>{Ve||Pt(Qe)},onClick:Qe=>{if(E&&!Qe.ctrlKey&&!Qe.metaKey){I==null||I(e.id),Qe.stopPropagation();return}st(Qe)},children:[(un||fn)&&s.jsxs("div",{className:`absolute inset-0 z-[25] rounded-xl overflow-hidden pointer-events-none transition-opacity duration-400 ease-out ${fn?"opacity-0":"opacity-100"}`,onTransitionEnd:fn?Lt:void 0,"aria-hidden":!0,children:[s.jsx("div",{className:`absolute inset-0 ${t?"bg-zinc-900/85":"bg-black/35"}`}),s.jsx("div",{className:"absolute inset-y-0 left-0 transition-[width] duration-300 ease-linear",style:{width:`${fn?100:Tn}%`,background:t?"linear-gradient(90deg, rgba(161,161,170,0.95) 0%, rgba(113,113,122,0.98) 70%, rgba(82,82,91,1) 100%)":"linear-gradient(90deg, rgba(224,242,254,0.95) 0%, rgba(187,223,255,0.98) 70%, rgba(128,191,255,1) 100%)"}})]}),!un&&Yt&&!He&&s.jsx("div",{className:`absolute inset-0 flex items-center justify-center z-10 ${t?"bg-zinc-900/80":"bg-white/80"}`,children:s.jsx(zr,{className:`w-6 h-6 animate-spin ${t?"text-zinc-400":"text-zinc-500"}`})}),(Xe.length>0||qe)&&ct.error&&!B&&s.jsx("div",{className:"absolute inset-0 z-30 flex items-center justify-center p-4 rounded-xl bg-black/50",onMouseDown:Qe=>Qe.stopPropagation(),onClick:Qe=>Qe.stopPropagation(),children:s.jsxs("div",{className:`w-full max-w-sm rounded-lg border overflow-hidden shadow-xl ${t?"bg-zinc-900 border-zinc-600":"bg-zinc-100 border-zinc-300"}`,children:[s.jsx("div",{className:"bg-red-500 border-b border-red-600 px-3 py-2 text-center",children:s.jsx("span",{className:"text-white text-sm font-medium",children:"提示"})}),s.jsx("div",{className:`px-4 py-4 text-sm leading-relaxed ${t?"text-zinc-200":"text-zinc-800"}`,children:ct.error||"生成失败"}),s.jsx("div",{className:"px-4 pb-4 flex justify-center",children:s.jsx("button",{type:"button",onClick:Qe=>{Qe.stopPropagation(),V(!0)},className:`px-6 py-2 rounded-md text-sm font-medium transition-colors ${t?"text-white hover:bg-white/10":"text-zinc-700 hover:bg-zinc-200"}`,children:"确认"})})]})}),He?jt?s.jsx("div",{className:"w-full h-full flex items-center justify-center p-4 bg-zinc-800/50",children:s.jsx("audio",{src:Re??"",controls:!0,className:"w-full max-w-md",preload:"metadata",onMouseDown:Qe=>Qe.stopPropagation(),onClick:Qe=>Qe.stopPropagation()})}):Ze?s.jsxs(s.Fragment,{children:[s.jsx("div",{className:`w-full h-full grid gap-0.5 p-0.5 ${Me.length===1?"grid-cols-1 grid-rows-1":Me.length===4?"grid-cols-2 grid-rows-2":Me.length===9?"grid-cols-3 grid-rows-3":"grid-cols-2"}`,children:Me.map((Qe,Ue)=>{const Ge=e.selectedPreviewVideo===Qe||!e.selectedPreviewVideo&&Ue===0,at=R.includes(Ue);return s.jsxs("div",{className:`mj-grid-quadrant relative w-full h-full overflow-hidden bg-black flex items-center justify-center group cursor-pointer transition-all ${at?"ring-4 ring-green-500 ring-inset scale-[0.98]":Ge?"ring-2 ring-blue-500 ring-inset":"hover:ring-1 hover:ring-white/30 hover:ring-inset"}`,onClick:rt=>{rt.stopPropagation();const lt=rt.shiftKey,ot=rt.ctrlKey||rt.metaKey;if(lt&&!ot){rt.preventDefault();const At=O!==null?O:0,kt=Ue,Ot=Math.min(At,kt),dn=Math.max(At,kt),Vt=Array.from({length:dn-Ot+1},(Zt,Sn)=>Ot+Sn);A(Zt=>{const Sn=new Set([...Zt,...Vt]);return Array.from(Sn)}),F(Ue);return}if(ot&<){rt.preventDefault(),A(At=>At.includes(Ue)?At.filter(kt=>kt!==Ue):[...At,Ue]),F(Ue);return}if(E&&!lt&&!ot){I==null||I(e.id);return}n(e.id,{selectedPreviewVideo:Qe}),A([]),F(Ue)},onDoubleClick:rt=>{Pt(rt,Qe,Ue)},children:[Ge&&!at&&s.jsxs("div",{className:"absolute top-1 left-1 z-30 bg-blue-500 text-white text-[9px] px-1.5 py-0.5 rounded font-medium flex items-center gap-0.5",children:[s.jsx(Eo,{size:10}),"引用"]}),at&&s.jsx("div",{className:"absolute top-1 left-1 z-30 bg-green-500 text-white rounded-full w-5 h-5 flex items-center justify-center text-xs font-bold shadow-sm",children:"✓"}),s.jsx("div",{className:`absolute top-1 right-1 z-30 text-[10px] px-1.5 py-0.5 rounded font-medium ${at?"bg-green-500/80 text-white":Ge?"bg-blue-500/80 text-white":t?"bg-black/60 text-white/70":"bg-white/60 text-zinc-700"}`,children:Ue+1}),s.jsx("video",{src:Ea(Qe)||Qe,className:"w-full h-full object-contain cursor-grab",controls:pe,draggable:!1,preload:"metadata",muted:!0,onMouseDown:rt=>{(rt.ctrlKey||rt.metaKey)&&h&&rt.stopPropagation()}})]},Ue)})}),R.length>0&&s.jsxs("div",{className:`absolute bottom-2 left-1/2 -translate-x-1/2 px-3 py-1 rounded-full text-[10px] font-medium shadow-lg ${t?"bg-green-500/90 text-white":"bg-green-500 text-white"}`,children:["已选中 ",R.length," 个视频 • Shift+点击范围选择"]})]}):$t&&Nt?s.jsxs(s.Fragment,{children:[Ye&&s.jsx("div",{className:`absolute top-2 left-2 z-20 pointer-events-none rounded-md border px-2 py-0.5 text-[10px] font-semibold shadow-sm ${t?"border-orange-500/40 bg-orange-950/80 text-orange-200":"border-orange-300 bg-orange-50 text-orange-900"}`,children:Ye}),AE(Re)&&Y&&s.jsxs("div",{className:"absolute inset-0 flex items-center justify-center bg-black/50 z-10",children:[s.jsx(zr,{className:"w-6 h-6 animate-spin text-white"}),s.jsx("span",{className:"ml-2 text-white text-xs",children:"加载视频…"})]}),s.jsx("video",{ref:_t,src:k??(Ea(Re)||Re)??"",className:"w-full h-full object-contain cursor-grab",controls:pe,draggable:!1,preload:"metadata",onLoadedMetadata:Qe=>{var Ge;const Ue=Qe.currentTarget;if(Ue.videoWidth>0&&Ue.videoHeight>0){const at={width:Ue.videoWidth,height:Ue.videoHeight};nt(at);const rt=`${Ue.videoWidth}×${Ue.videoHeight}`;((Ge=e.settings)==null?void 0:Ge.previewSize)!==rt&&n(e.id,{settings:{...e.settings,previewSize:rt}});const lt=Ue.videoHeight/Ue.videoWidth,ot=Ue.videoHeight>Ue.videoWidth,At=420;let kt,Ot;ot&<>1?(Ot=Math.min(At,Math.round(e.width*lt)),kt=Math.round(Ot/lt)):(kt=e.width,Ot=Math.round(e.width*lt));const dn=Math.abs(Ot-e.height),Vt=Math.abs(kt-e.width);(dn>10||Vt>10)&&n(e.id,{width:kt,height:Ot})}},onMouseDown:Qe=>{if((Qe.ctrlKey||Qe.metaKey)&&Re&&h){Qe.stopPropagation(),Qe.preventDefault();const Ue=`Preview-${Date.now()}.mp4`;h(Re,Ue,"video")}},onClick:Qe=>{if(Qe.stopPropagation(),E&&!Qe.ctrlKey&&!Qe.metaKey){I==null||I(e.id);return}if((Qe.ctrlKey||Qe.metaKey)&&Re&&h){Qe.preventDefault();const Ue=`Preview-${Date.now()}.mp4`;h(Re,Ue,"video")}},onDoubleClick:Pt,onPlay:Qe=>{const Ue=Qe.currentTarget;Ue.setAttribute("data-user-controlled","true"),Ue.setAttribute("data-user-playing","true")},onPause:Qe=>{const Ue=Qe.currentTarget;Ue.setAttribute("data-user-controlled","true"),Ue.setAttribute("data-user-playing","false")}})]}):$t&&!Nt?s.jsx("div",{className:"w-full h-full flex items-center justify-center bg-zinc-800/80 text-zinc-500 text-xs",children:"无视频"}):ve&&Ee.length>=2&&Ne.length<2?s.jsxs("div",{className:`w-full h-full flex flex-col items-center justify-center gap-2 ${t?"text-zinc-500":"text-zinc-400"}`,children:[s.jsx(zr,{size:24,className:"animate-spin"}),s.jsxs("span",{className:"text-xs",children:["加载中… (",Ne.length,"/",Ee.length,")"]})]}):Ve?(()=>{var ot,At;const Qe=Je.length,Ue=(ot=e.settings)==null?void 0:ot.previewGridRows,Ge=(At=e.settings)==null?void 0:At.previewGridCols,at=Ge!=null&&Ue!=null&&Ge>0&&Ue>0,rt=ve?Math.ceil(Math.sqrt(Qe))||1:at?Ge:Qe===1?1:Qe===4?2:Qe===9?3:2,lt=ve?Math.ceil(Qe/rt)||1:at?Ue:Qe===1?1:Qe===4?2:Qe===9?3:Math.ceil(Qe/2);return s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"w-full h-full grid gap-0 p-0",style:{gridTemplateColumns:`repeat(${rt}, 1fr)`,gridTemplateRows:`repeat(${lt}, 1fr)`},children:Je.map((kt,Ot)=>{const dn=e.selectedPreviewImage===kt||!e.selectedPreviewImage&&Ot===0,Vt=R.includes(Ot);return s.jsxs("div",{className:`mj-grid-quadrant relative w-full h-full overflow-hidden bg-black flex items-center justify-center group cursor-pointer transition-all ${Vt?"ring-4 ring-green-500 ring-inset scale-[0.98]":dn?"ring-2 ring-blue-500 ring-inset":"hover:ring-1 hover:ring-white/30 hover:ring-inset"}`,onClick:Zt=>{Zt.stopPropagation();const Sn=Zt.shiftKey,jn=Zt.ctrlKey||Zt.metaKey;if(Sn&&!jn){Zt.preventDefault();const _n=O!==null?O:0,Cn=Ot,Kn=Math.min(_n,Cn),Xn=Math.max(_n,Cn),$r=Array.from({length:Xn-Kn+1},(Tr,kr)=>Kn+kr);A(Tr=>{const kr=new Set([...Tr,...$r]);return Array.from(kr)}),F(Ot);return}if(jn&&Sn){Zt.preventDefault(),A(_n=>_n.includes(Ot)?_n.filter(Cn=>Cn!==Ot):[..._n,Ot]),F(Ot);return}if(E&&!Sn&&!jn){I==null||I(e.id);return}n(e.id,{selectedPreviewImage:kt}),A([]),F(Ot)},onDoubleClick:Zt=>{Pt(Zt,kt,Ot)},children:[dn&&!Vt&&s.jsxs("div",{className:"absolute top-1 left-1 z-30 bg-blue-500 text-white text-[9px] px-1.5 py-0.5 rounded font-medium flex items-center gap-0.5",children:[s.jsx(Eo,{size:10}),"引用"]}),Vt&&s.jsx("div",{className:"absolute top-1 left-1 z-30 bg-green-500 text-white rounded-full w-5 h-5 flex items-center justify-center text-xs font-bold shadow-sm",children:"✓"}),s.jsx("div",{className:`absolute top-1 right-1 z-30 text-[10px] px-1.5 py-0.5 rounded font-medium ${Vt?"bg-green-500/80 text-white":dn?"bg-blue-500/80 text-white":t?"bg-black/60 text-white/70":"bg-white/60 text-zinc-700"}`,children:Ot+1}),s.jsx(w$,{src:kt,displayWidth:e.width/rt,displayHeight:e.height/lt,zoom:d,isDark:t,alt:`预览图 ${Ot+1}`,objectFit:"cover",quality:"high",onBlobUrlRecovery:Zt=>{var Sn;return M(Zt,(Sn=e._previewMjAssetIds)==null?void 0:Sn[Ot])}})]},Ot)})}),R.length>0&&s.jsxs("div",{className:`absolute bottom-2 left-1/2 -translate-x-1/2 px-3 py-1 rounded-full text-[10px] font-medium shadow-lg ${t?"bg-green-500/90 text-white":"bg-green-500 text-white"}`,children:["已选中 ",R.length," 张 • Shift+点击范围选择"]})]})})():ke&&Ne.length===0?s.jsxs("div",{className:`w-full h-full flex flex-col items-center justify-center gap-2 ${t?"text-zinc-500":"text-zinc-400"}`,children:[s.jsx(zr,{size:20,className:"animate-spin"}),s.jsx("span",{className:"text-xs",children:"加载中…"})]}):s.jsx("div",{className:"w-full h-full cursor-pointer",onDoubleClick:Qe=>{Qe.preventDefault(),Qe.stopPropagation(),Pt(Qe)},children:s.jsx(w$,{src:Re||"",displayWidth:e.width,displayHeight:e.height,zoom:d,isDark:t,alt:"预览",objectFit:"cover",quality:"high",onBlobUrlRecovery:Qe=>M(Qe,e._contentAssetId)})}):s.jsxs("div",{className:`flex flex-col items-center justify-center text-center text-[11px] py-6 px-4 gap-3 ${t?"text-zinc-500":"text-zinc-400"}`,children:[(Xe.length>0||qe)&&(ct.generating||ct.error)&&s.jsx("div",{className:`inline-flex flex-row items-center gap-2 rounded-full border px-4 py-1.5 ${ct.error?t?"bg-red-950/20 border-red-500/30":"bg-red-50/80 border-red-200":t?"bg-white/5 border-white/10":"bg-black/5 border-zinc-200"}`,children:ct.generating?s.jsxs(s.Fragment,{children:[s.jsx(zr,{size:14,className:`shrink-0 animate-spin ${t?"text-zinc-400":"text-zinc-500"}`}),s.jsx("span",{className:`whitespace-nowrap ${t?"text-zinc-400":"text-zinc-600"}`,children:"生成中"})]}):s.jsxs(s.Fragment,{children:[s.jsx(nf,{size:14,className:"shrink-0 text-red-500"}),s.jsx("span",{className:`truncate max-w-[200px] whitespace-nowrap ${t?"text-red-400":"text-red-600"}`,title:ct.error,children:ct.error||"生成失败"})]})}),!(ct.generating||ct.error)&&s.jsxs(s.Fragment,{children:[s.jsx(cl,{size:24,className:"opacity-50"}),s.jsx("span",{children:"连接 AI 绘图 / AI 视频 / 可灵动作迁移 节点"}),s.jsx("span",{children:"或从历史记录发送到此处进行预览"})]}),!ct.generating&&Le&&je.length>=1&&C&&(L?s.jsxs("span",{className:`inline-flex items-center gap-1.5 px-3 py-2 rounded-lg border text-[11px] font-medium ${t?"border-white/20 text-zinc-400":"border-zinc-200 text-zinc-500"}`,children:[s.jsx(zr,{size:12,className:"animate-spin"}),"正在生成"]}):s.jsxs("button",{type:"button",onClick:Qe=>{Qe.stopPropagation(),C(je[0]),X(!0)},onMouseDown:Qe=>Qe.stopPropagation(),className:`inline-flex items-center gap-1.5 px-3 py-2 rounded-lg border text-[11px] font-medium transition-colors ${t?"border-white/30 text-white hover:bg-white/10":"border-zinc-300 text-zinc-700 hover:bg-zinc-100"}`,title:`使用上游「${je[0].nodeName||(je[0].type==="storyboard-chart-node"?"分镜图表":je[0].type==="gen-video"?"生成视频":je[0].type==="motion-control"?"动作迁移(Kling)":"生成图片")}」的提示词与素材生成,结果仅显示在本预览窗口`,children:[s.jsx(Ia,{size:12,fill:"currentColor"}),"使用上游节点生成"]}))]}),(Xe.length>0||qe||N)&&(pt||T)&&s.jsxs("div",{className:`absolute inset-0 z-[25] rounded-xl overflow-hidden pointer-events-none transition-opacity duration-400 ease-out ${T?"opacity-0":"opacity-100"}`,onTransitionEnd:T?ht:void 0,"aria-hidden":!0,children:[s.jsx("div",{className:`absolute inset-0 ${He?t?"bg-zinc-900/85":"bg-black/35":t?"bg-zinc-800":"bg-black/35"}`}),s.jsx("div",{className:"absolute inset-y-0 left-0 transition-[width] duration-300 ease-linear",style:{width:`${J}%`,background:t?"linear-gradient(90deg, rgba(161,161,170,0.95) 0%, rgba(113,113,122,0.98) 70%, rgba(82,82,91,1) 100%)":"linear-gradient(90deg, rgba(224,242,254,0.95) 0%, rgba(187,223,255,0.98) 70%, rgba(128,191,255,1) 100%)"}})]})]}),He&&!g&&s.jsxs("div",{className:`absolute left-0 right-0 flex items-center justify-between gap-0.5 text-[10px] font-extralight px-1 py-1.5 rounded-lg transition-opacity duration-200 flex-nowrap overflow-x-hidden min-w-0 bg-transparent border border-transparent shadow-none backdrop-blur-0 ${pe?"opacity-100":"opacity-0"}`,style:{top:"100%",marginTop:"8px",pointerEvents:pe?"auto":"none"},onMouseDown:Qe=>Qe.stopPropagation(),children:[s.jsxs("button",{className:`flex-1 min-w-0 inline-flex items-center justify-center gap-0.5 px-1.5 py-1.5 rounded-md border transition-colors ${t?"border-zinc-700/50 text-zinc-300 hover:bg-zinc-800/80 hover:border-zinc-600":"bg-white border-zinc-300 text-zinc-700 hover:bg-zinc-100 hover:border-zinc-400"}`,onMouseDown:Qe=>Qe.stopPropagation(),onClick:Bt,disabled:!Ve,children:[s.jsx(Mw,{size:12,className:"shrink-0"}),s.jsx("span",{className:"font-extralight whitespace-nowrap truncate min-w-0",children:Ve?"宫格拼接":"宫格拼接(需多图)"})]}),s.jsxs("button",{className:`flex-1 min-w-0 inline-flex items-center justify-center gap-0.5 px-1.5 py-1.5 rounded-md border transition-colors ${t?"border-zinc-700/50 text-zinc-300 hover:bg-zinc-800/80 hover:border-zinc-600":"bg-white border-zinc-300 text-zinc-700 hover:bg-zinc-100 hover:border-zinc-400"}`,onMouseDown:Qe=>Qe.stopPropagation(),onClick:Gt,children:[s.jsx(VP,{size:12,className:"shrink-0"}),s.jsx("span",{className:"font-extralight whitespace-nowrap truncate min-w-0",children:"发送到画布"})]}),s.jsxs("button",{className:`flex-1 min-w-0 inline-flex items-center justify-center gap-0.5 px-1.5 py-1.5 rounded-md border transition-colors ${t?"border-zinc-700/50 text-zinc-300 hover:bg-zinc-800/80 hover:border-zinc-600":"bg-white border-zinc-300 text-zinc-700 hover:bg-zinc-100 hover:border-zinc-400"}`,onMouseDown:Qe=>Qe.stopPropagation(),onClick:De,children:[s.jsx(Wp,{size:12,className:"shrink-0"}),s.jsx("span",{className:"font-extralight whitespace-nowrap truncate min-w-0",children:"发送到对话"})]}),v&&s.jsxs("button",{className:`flex-1 min-w-0 inline-flex items-center justify-center gap-0.5 px-1.5 py-1.5 rounded-md border transition-colors ${t?"border-zinc-700/50 text-zinc-300 hover:bg-zinc-800/80 hover:border-zinc-600":"bg-white border-zinc-300 text-zinc-700 hover:bg-zinc-100 hover:border-zinc-400"}`,onMouseDown:Qe=>Qe.stopPropagation(),onClick:qt,title:"将图片拆分并发送到分镜节点",children:[s.jsx(Ii,{size:12,className:"shrink-0"}),s.jsx("span",{className:"font-extralight whitespace-nowrap truncate min-w-0",children:"发送到分镜"})]})]})]}),re&&Ve&&s.jsx(Kle,{isOpen:re,isDark:t,images:Je,assetIds:void 0,rows:((Tt=e.settings)==null?void 0:Tt.previewGridRows)||3,cols:((St=e.settings)==null?void 0:St.previewGridCols)||3,onClose:()=>ee(!1),onStitched:zt})]})};async function lb(e,t,n,r=!1,i=!1){let a,o;if(i)a=t,o=n;else{const b=e.aspectRatio.split(":").map(Number),g=b.length===2?b[0]/b[1]:1,y=1024;g>=1?(a=y,o=Math.round(y/g)):(o=y,a=Math.round(y*g))}const l=document.createElement("canvas");l.width=a,l.height=o;const c=l.getContext("2d");if(!c)return"";let u,d,h,p,f;if(i)u=1,p=t,f=n,d=0,h=0;else{const b=a/t,g=o/n;u=Math.min(b,g),p=t*u,f=n*u,d=(a-p)/2,h=(o-f)/2}if(r)return c.fillStyle="black",c.fillRect(0,0,a,o),e.maskStrokes&&e.maskStrokes.forEach(b=>{c.beginPath(),c.strokeStyle="white",c.lineWidth=b.width*u,c.lineCap="round",c.lineJoin="round",b.points.forEach((g,y)=>{const w=(b.x+g.x)*u+d,v=(b.y+g.y)*u+h;y===0?c.moveTo(w,v):c.lineTo(w,v)}),c.stroke()}),l.toDataURL("image/png");{c.fillStyle=e.backgroundColor==="transparent"?"#171717":e.backgroundColor||"#171717",c.fillRect(0,0,a,o);const b=e.layers||[],g=new Map(b.map(v=>[v.id,v])),y=[];e.images.forEach(v=>{const m=v.layerId?g.get(v.layerId):null;(!v.layerId||(m==null?void 0:m.visible)!==!1)&&y.push({type:"image",data:v,layerId:v.layerId,zIndex:(m==null?void 0:m.zIndex)??0})}),e.strokes.forEach(v=>{const m=v.layerId?g.get(v.layerId):null;(!v.layerId||(m==null?void 0:m.visible)!==!1)&&y.push({type:"stroke",data:v,layerId:v.layerId,zIndex:(m==null?void 0:m.zIndex)??0})}),e.textElements.forEach(v=>{const m=v.layerId?g.get(v.layerId):null;(!v.layerId||(m==null?void 0:m.visible)!==!1)&&y.push({type:"text",data:v,layerId:v.layerId,zIndex:(m==null?void 0:m.zIndex)??0})}),(e.shapes||[]).forEach(v=>{const m=v.layerId?g.get(v.layerId):null;(!v.layerId||(m==null?void 0:m.visible)!==!1)&&y.push({type:"shape",data:v,layerId:v.layerId,zIndex:(m==null?void 0:m.zIndex)??0})}),(e.stickFigures||[]).forEach(v=>{const m=v.layerId?g.get(v.layerId):null;(!v.layerId||(m==null?void 0:m.visible)!==!1)&&y.push({type:"stickFigure",data:v,layerId:v.layerId,zIndex:(m==null?void 0:m.zIndex)??0})}),y.sort((v,m)=>v.zIndex-m.zIndex);const w=e.images.length>0;for(const v of y)switch(v.type){case"image":{const m=v.data,z=new Image;if(z.crossOrigin="anonymous",await new Promise(C=>{z.onload=C,z.onerror=C,z.src=m.src}),z.complete&&z.naturalWidth>0){c.save(),c.globalAlpha=m.opacity;const C=m.x*u+d,E=m.y*u+h,I=m.width*u,R=m.height*u,A=m.contentX??0,O=m.contentY??0,F=m.contentWidth!==void 0&&m.contentHeight!==void 0&&(m.contentWidth>m.width*1.1||m.contentHeight>m.height*1.1);let L,X;F?(L=(m.contentWidth??z.naturalWidth)*(z.naturalWidth/(m.contentWidth??m.width)),X=(m.contentHeight??z.naturalHeight)*(z.naturalHeight/(m.contentHeight??m.height)),L=Math.min(L,z.naturalWidth),X=Math.min(X,z.naturalHeight)):(L=z.naturalWidth,X=z.naturalHeight);const T=(m.rotation??0)*(Math.PI/180),q=m.flipHorizontal===!0,H=m.flipVertical===!0,J=C+I/2,Z=E+R/2;c.translate(J,Z),T!==0&&c.rotate(T),(q||H)&&c.scale(q?-1:1,H?-1:1),c.translate(-I/2,-R/2),c.drawImage(z,A,O,L,X,0,0,I,R),c.restore()}break}case"stroke":{const m=v.data;c.beginPath(),c.strokeStyle=m.color,c.lineWidth=m.width*u,c.lineCap="round",c.lineJoin="round";const z=w?m.opacity*.6:m.opacity;c.globalAlpha=z,m.points.forEach((C,E)=>{const I=(m.x+C.x)*u+d,R=(m.y+C.y)*u+h;E===0?c.moveTo(I,R):c.lineTo(I,R)}),c.stroke();break}case"text":{const m=v.data;c.globalAlpha=m.opacity,c.fillStyle=m.color;let z;switch(m.fontSize){case"XL":z=36;break;case"L":z=24;break;case"S":z=14;break;case"M":default:z=16;break}const C=m.scale??1,E=z*C*u;c.font=`${E}px ${m.fontFamily==="mono"?"monospace":m.fontFamily==="serif"?"serif":m.fontFamily==="script"?"cursive":"sans-serif"}`,c.textAlign=m.align,c.fillText(m.content,m.x*u+d,m.y*u+h);break}case"shape":{const m=v.data;c.save(),c.globalAlpha=m.opacity;const z=m.x*u+d,C=m.y*u+h,E=m.width*u,I=m.height*u;switch(c.translate(z+E/2,C+I/2),c.rotate(m.rotation*Math.PI/180),c.translate(-(z+E/2),-(C+I/2)),m.fillMode==="fill"?c.fillStyle=m.color:(c.strokeStyle=m.color,c.lineWidth=m.strokeWidth*u),m.type){case"rectangle":m.fillMode==="fill"?c.fillRect(z,C,E,I):c.strokeRect(z,C,E,I);break;case"circle":c.beginPath(),c.ellipse(z+E/2,C+I/2,E/2,I/2,0,0,2*Math.PI),m.fillMode==="fill"?c.fill():c.stroke();break;case"triangle":c.beginPath(),c.moveTo(z+E/2,C),c.lineTo(z+E,C+I),c.lineTo(z,C+I),c.closePath(),m.fillMode==="fill"?c.fill():c.stroke();break;case"line":c.beginPath(),c.moveTo(z,C),c.lineTo(z+E,C+I),c.stroke();break}c.restore();break}case"stickFigure":{const m=v.data;c.save(),c.globalAlpha=m.opacity,c.strokeStyle=m.color,c.lineWidth=m.strokeWidth*u,c.lineCap="round";const z=m.x*u+d,C=m.y*u+h,E=m.scale*u;c.beginPath(),c.arc(z+m.joints.head.x*E,C+m.joints.head.y*E,10*E,0,2*Math.PI),c.stroke();const I=(R,A)=>{c.beginPath(),c.moveTo(z+m.joints[R].x*E,C+m.joints[R].y*E),c.lineTo(z+m.joints[A].x*E,C+m.joints[A].y*E),c.stroke()};I("neck","waist"),I("neck","leftShoulder"),I("leftShoulder","leftElbow"),I("leftElbow","leftHand"),I("neck","rightShoulder"),I("rightShoulder","rightElbow"),I("rightElbow","rightHand"),I("waist","leftHip"),I("leftHip","leftKnee"),I("leftKnee","leftFoot"),I("waist","rightHip"),I("rightHip","rightKnee"),I("rightKnee","rightFoot"),c.restore();break}}return l.toDataURL("image/png")}}async function Yle(e){return await(await fetch(e)).blob()}const ME=Object.freeze(Object.defineProperty({__proto__:null,drawCanvasToImage:lb,getBlobFromDataURL:Yle},Symbol.toStringTag,{value:"Module"})),cb="canvas-node:",ub="@asset:";function F1(e){return!e||!e.startsWith(cb)?null:e.slice(cb.length)}function W1(e){return!e||!e.startsWith(ub)?null:e.slice(ub.length)}function bv(e){return!e||e.startsWith(cb)||e.startsWith(ub)?e:e.startsWith("data:image")||e.startsWith("data:")&&e.includes("image/")?Hd(e):e}function h_(e,t,n){const r=bv(t);return n.startsWith("data:")&&r.startsWith("blob:")&&e.current.push(r),r}const Jle=({node:e,updateNode:t,getConnectedInputImages:n,nodes:r,dataVersion:i=0,isCompactMode:a=!1,onCompactModeImageClick:o})=>{var W;const l=_.useRef(r);l.current=r;const c=_.useRef(!1),u=_.useRef(null),d=_.useMemo(()=>n(e.id),[n,e.id]),h=d[0],p=d[1]||d[0],{content:f,isLoading:b}=Ul(h,{shouldLoadContent:!0,nodeType:"input-image",useOriginal:!0,preferConstantDisplay:!0}),{content:g,isLoading:y}=Ul(p||h,{shouldLoadContent:!0,nodeType:"input-image",useOriginal:!0,preferConstantDisplay:!0}),w=f!==void 0?f:h&&Ln.isContentRef(h)?"":h,v=g!==void 0?g:p&&p!==h?Ln.isContentRef(p)?"":p:w,m=!!w&&(F1(w)!==null||v&&F1(v)!==null),z=!!w&&(W1(w)!==null||v&&W1(v)!==null),[C,E]=_.useState(""),[I,R]=_.useState(""),[A,O]=_.useState(!1),F=_.useRef([]),L=_.useRef(0),X=()=>{F.current.forEach(M=>{try{URL.revokeObjectURL(M)}catch{}}),F.current=[]};_.useEffect(()=>()=>X(),[]);const T=m?i:-1;_.useEffect(()=>{if(!h){X(),E(""),R(""),O(!1);return}if(w===""||v===""&&w!==v)return;const M=++L.current,Y=async ee=>{var ue;const pe=F1(ee);if(!pe)return bv(ee);const Q=l.current.find(U=>U.id===pe&&U.type==="canvas-node"),me=(ue=Q==null?void 0:Q.settings)==null?void 0:ue.canvasData;if(!Q||!me)return ee;try{const U=await lb(me,Q.width,Q.height,!1,!0);if(!U)return ee;const G=bv(U);return U.startsWith("data:")&&G.startsWith("blob:")&&F.current.push(G),G}catch{return ee}},se=async ee=>{const pe=W1(ee);if(!pe)return bv(ee);try{return await Xr.getAssetUrl(pe)||ee}catch{return ee}},ie=async ee=>F1(ee)?Y(ee):W1(ee)?se(ee):h_(F,ee,ee);if(!(m||z)){X();const ee=h_(F,w,w),pe=v&&v!==w?h_(F,v,v):ee;E(ee),R(pe),O(!1);return}O(!0);const re=window.setTimeout(()=>{M===L.current&&(X(),(async()=>{try{const[ee,pe]=await Promise.all([ie(w),ie(v||w)]);if(M!==L.current)return;E(ee),R(pe||ee)}finally{M===L.current&&O(!1)}})())},200);return()=>{clearTimeout(re)}},[h,w,v,m,z,T]);const q=((W=e.settings)==null?void 0:W.comparePos)??50,H=(b||y)&&(Ln.isContentRef(h)||p&&Ln.isContentRef(p));if(_.useEffect(()=>{const M=()=>{c.current=!1};return window.addEventListener("mouseup",M,!0),window.addEventListener("touchend",M,!0),window.addEventListener("touchcancel",M,!0),()=>{window.removeEventListener("mouseup",M,!0),window.removeEventListener("touchend",M,!0),window.removeEventListener("touchcancel",M,!0)}},[]),!h)return s.jsxs("div",{className:"w-full h-full flex flex-col items-center justify-center text-zinc-500 bg-zinc-900/50 rounded-lg border border-zinc-800 border-dashed pointer-events-none",children:[s.jsx(yj,{size:24,className:"mb-2 opacity-50"}),s.jsx("span",{className:"text-xs font-medium",children:"连接图片以对比"})]});const J=C&&!C.startsWith(cb)&&!C.startsWith(ub),Z=I&&!I.startsWith(cb)&&!I.startsWith(ub),B=(M,Y)=>{if(Y.clientWidth<=0)return;const se=Y.getBoundingClientRect(),ie=Math.max(0,Math.min(M-se.left,se.width)),oe=Math.round(ie/se.width*100*10)/10;u.current!=null&&Math.abs(oe-u.current)<.1||(u.current=oe,t(e.id,{settings:{...e.settings,comparePos:oe}}))},V=M=>{c.current&&B(M.clientX,M.currentTarget)},N=M=>{var se;if(!c.current)return;const Y=(se=M.touches)==null?void 0:se[0];Y&&B(Y.clientX,M.currentTarget)},j=M=>{const Y=M.target;Y.closest(".resize-handle")||Y.closest("[data-table-resize-handle]")||(c.current=!0,u.current=q,M.stopPropagation())},k=M=>{var ie;const Y=M.target;if(Y.closest(".resize-handle")||Y.closest("[data-table-resize-handle]"))return;c.current=!0;const se=(ie=M.touches)==null?void 0:ie[0];se&&B(se.clientX,M.currentTarget),M.stopPropagation()};return s.jsxs("div",{className:"relative w-full h-full cursor-col-resize overflow-hidden group rounded-lg select-none shadow-2xl border border-zinc-800 bg-[#09090b] pointer-events-auto",onMouseMove:V,onTouchMove:N,onMouseDown:j,onTouchStart:k,onClick:M=>{a&&!M.ctrlKey&&!M.metaKey&&(o==null||o(e.id),M.stopPropagation())},children:[s.jsx("div",{className:"absolute inset-0 opacity-20 pointer-events-none",style:{backgroundImage:"conic-gradient(#333 90deg, transparent 90deg), conic-gradient(transparent 90deg, #333 90deg)",backgroundSize:"20px 20px",backgroundPosition:"0 0, 10px 10px"}}),(A||H)&&(!J||!Z)&&s.jsx("div",{className:"absolute inset-0 flex items-center justify-center z-10 bg-black/30 pointer-events-none",children:s.jsx("span",{className:"text-[10px] text-zinc-400",children:A?"正在生成画板预览…":"正在加载原图…"})}),J&&s.jsx("div",{className:"absolute inset-0 w-full h-full overflow-hidden pointer-events-none select-none",style:{clipPath:`inset(0 ${100-q}% 0 0)`},children:s.jsx("img",{src:C,decoding:"async",className:"absolute inset-0 w-full h-full object-contain",draggable:!1,alt:""})}),Z&&s.jsx("div",{className:"absolute inset-0 w-full h-full overflow-hidden pointer-events-none select-none",style:{clipPath:`inset(0 0 0 ${q}%)`},children:s.jsx("img",{src:I,decoding:"async",className:"absolute inset-0 w-full h-full object-contain",draggable:!1,alt:""})}),s.jsx("div",{className:"absolute top-0 bottom-0 w-0.5 bg-white/80 shadow-[0_0_10px_rgba(0,0,0,0.5)] pointer-events-none",style:{left:`${q}%`},children:s.jsx("div",{className:"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-6 h-6 bg-white rounded-full shadow-lg flex items-center justify-center text-black",children:s.jsx(yj,{size:12,className:"rotate-90"})})}),s.jsx("div",{className:"absolute bottom-2 left-2 bg-black/70 text-white text-[10px] font-medium px-2 py-0.5 rounded border border-white/10 pointer-events-none",children:"原始"}),s.jsx("div",{className:"absolute bottom-2 right-2 bg-blue-600/80 text-white text-[10px] font-medium px-2 py-0.5 rounded border border-white/10 pointer-events-none",children:"生成"})]})},j4=({isOpen:e,onClose:t,onConfirm:n,isDark:r=!1,maxDuration:i=10,currentVideoFile:a=null,apiKey:o,baseUrl:l,attachMode:c="floating"})=>{const[u,d]=_.useState(a),[h,p]=_.useState(0),[f,b]=_.useState(0),[g,y]=_.useState(!1),[w,v]=_.useState(0),[m,z]=_.useState(0),[C,E]=_.useState(null),[I,R]=_.useState(0),[A,O]=_.useState([]),[F,L]=_.useState(""),[X,T]=_.useState(!1),[q,H]=_.useState(""),[J,Z]=_.useState("base"),[B,V]=_.useState("yes"),[N,j]=_.useState(!1),k=_.useRef(null),W=_.useRef(null),M=_.useRef(null),Y=_.useRef(null);_.useEffect(()=>{if(!u||!e)return;const fe=k.current;if(!fe)return;const be=URL.createObjectURL(u);return fe.src=be,fe.preload="metadata",fe.onloadedmetadata=()=>{const de=fe.duration;p(de),v(0),z(de),se(fe,de),L("")},()=>{URL.revokeObjectURL(be),fe&&(fe.pause(),fe.src="")}},[u,e,i]);const se=async(fe,be)=>{const de=[],ze=document.createElement("canvas"),_e=ze.getContext("2d");if(_e){ze.width=160,ze.height=90;for(let Ee=0;Ee<10;Ee++){const Ce=be/10*Ee;fe.currentTime=Ce,await new Promise(xe=>{fe.onseeked=()=>{_e.drawImage(fe,0,0,ze.width,ze.height),de.push(ze.toDataURL("image/jpeg",.7)),xe()}})}O(de)}};_.useEffect(()=>{const fe=k.current;if(!fe)return;const be=()=>{fe.currentTime>=m?(fe.pause(),y(!1),b(w),fe.currentTime=w):b(fe.currentTime)};if(g){fe.currentTime=w,fe.play().catch($e=>console.error("播放失败:",$e));const de=setInterval(be,100);return()=>clearInterval(de)}else fe.pause()},[g,w,m]);const ie=async fe=>{var de;const be=(de=fe.target.files)==null?void 0:de[0];be&&await oe(be)},oe=async fe=>{var _e;const be=(_e=fe.name.split(".").pop())==null?void 0:_e.toLowerCase();if(!["mp4","mov"].includes(be||"")){L("仅支持 MP4 或 MOV 格式的视频文件");return}const de=20*1024*1024;if(fe.size>de){L("视频文件大小不能超过 20MB");return}const $e=document.createElement("video"),ze=URL.createObjectURL(fe);$e.src=ze,$e.preload="metadata";try{await new Promise((Ne,ve)=>{$e.onloadedmetadata=()=>Ne(),$e.onerror=()=>ve(new Error("无法读取视频信息"))});const Ee=$e.duration;if(Ee<3){L("视频时长不能少于 3秒"),URL.revokeObjectURL(ze);return}if(Ee>10){L("视频时长不能超过 10秒"),URL.revokeObjectURL(ze);return}const Ce=$e.videoWidth,xe=$e.videoHeight;if(Ce<720||Ce>2160||xe<720||xe>2160){L(`视频尺寸不符合要求(当前: ${Ce}x${xe},要求: 720-2160px)`),URL.revokeObjectURL(ze);return}d(fe),L(""),y(!1),b(0),URL.revokeObjectURL(ze)}catch(Ee){L(Ee.message||"视频文件验证失败"),URL.revokeObjectURL(ze)}},re=async fe=>{fe.preventDefault(),fe.stopPropagation(),j(!1);const be=fe.dataTransfer.getData("application/json");if(be)try{const $e=JSON.parse(be);if($e.type==="history-item"&&$e.item){if(console.log("[Kling Video] History item dropped:",$e.item),$e.item.type!=="video"){L("只支持拖入视频,不支持图片或音频");return}T(!0),H("正在处理视频..."),L("");try{const _e=await(await fetch($e.item.url)).blob(),Ee=`history-${Date.now()}.mp4`,Ce=new File([_e],Ee,{type:_e.type||"video/mp4"});await oe(Ce),H("")}catch(ze){console.error("[Kling Video] 处理历史视频失败:",ze),L(`视频处理失败: ${ze instanceof Error?ze.message:String(ze)}`),H("")}finally{T(!1)}return}}catch($e){console.error("[Kling Video] Failed to parse history item data:",$e)}const de=fe.dataTransfer.files[0];de&&await oe(de)},ee=fe=>{fe.preventDefault(),fe.stopPropagation(),j(!0)},pe=fe=>{fe.preventDefault(),fe.stopPropagation(),j(!1)},we=()=>{const fe=k.current;fe&&(g?fe.pause():(fe.currentTime=w,fe.play().catch(be=>console.error("播放失败:",be))),y(!g))},Q=fe=>{const be=Math.floor(fe/60),de=Math.floor(fe%60),$e=Math.floor(fe%1*10);return`${be.toString().padStart(2,"0")}:${de.toString().padStart(2,"0")}.${$e}`},me=fe=>h?fe/h*100:0,ue=fe=>h?fe/100*h:0,U=fe=>{if(!W.current||!h)return;const be=W.current.getBoundingClientRect(),$e=(fe.clientX-be.left)/be.width*100,ze=ue($e),_e=Math.abs(ze-w),Ee=Math.abs(ze-m);if(_e{if(be.preventDefault(),be.stopPropagation(),!W.current)return;E(fe);const de=W.current.getBoundingClientRect(),ze=(be.clientX-de.left)/de.width*100,_e=me(fe==="start"?w:m);R(ze-_e),document.body.style.userSelect="none",document.body.style.cursor="ew-resize"};_.useEffect(()=>{if(!C||!W.current||!h)return;const fe=de=>{de.preventDefault();const $e=W.current.getBoundingClientRect(),_e=(de.clientX-$e.left)/$e.width*100,Ee=Math.max(0,Math.min(100,_e-I)),Ce=ue(Ee);if(C==="start"){const xe=Math.max(0,Math.min(Ce,m-3));v(xe)}else{const xe=Math.min(h,Math.max(Ce,w+3));z(xe)}},be=()=>{E(null),R(0),document.body.style.userSelect="",document.body.style.cursor=""};return window.addEventListener("mousemove",fe),window.addEventListener("mouseup",be),()=>{window.removeEventListener("mousemove",fe),window.removeEventListener("mouseup",be)}},[C,I,h,w,m]);const te=()=>{d(null),p(0),b(0),y(!1),v(0),z(0),O([]),L(""),M.current&&(M.current.value="")},ge=async()=>{if(!u){L("请先选择视频文件");return}const fe=m-w;if(fe<3){L("选择的视频片段至少需要 3秒");return}if(fe>i){L(`选择的视频片段不能超过 ${i}秒`);return}if(o&&l)try{T(!0),H("正在上传视频..."),L("");const be=new FormData;be.append("file",u);const de=`${l}/v1/files`;console.log("[KlingVideoUpload] 上传视频到:",de);const $e=await fetch(de,{method:"POST",headers:{Authorization:`Bearer ${o}`},body:be});if(!$e.ok){const Ee=await $e.text();throw new Error(`上传失败: ${$e.status} ${Ee}`)}const ze=await $e.json();console.log("[KlingVideoUpload] 上传成功,完整响应:",ze);let _e=ze.url||ze.file_url||ze.download_url;if(console.log("[KlingVideoUpload] 提取的URL字段:",{url:ze.url,file_url:ze.file_url,download_url:ze.download_url,finalUrl:_e}),!_e&&ze.id&&(_e=`${l}/v1/files/${ze.id}`,console.log("[KlingVideoUpload] 使用ID构建URL:",_e)),!_e)throw new Error("未能获取视频URL");console.log("[KlingVideoUpload] 最终视频URL:",_e),H("上传成功!"),console.log("[KlingVideoUpload] 调用onConfirm,参数:",{fileName:u.name,startTime:w,endTime:m,videoUrl:_e,referType:J,keepOriginalSound:B}),n(u,w,m,_e,J,B),t()}catch(be){console.error("[KlingVideoUpload] 上传失败:",be),L(be.message||"视频上传失败"),T(!1),H("")}else n(u,w,m,void 0,J,B),t()};if(!e)return null;const ne=m-w,le=c==="inline";return s.jsxs(s.Fragment,{children:[!le&&s.jsx("div",{className:"fixed inset-0 z-[100]",style:{backgroundColor:"rgba(0, 0, 0, 0.3)"},onClick:t}),s.jsxs("div",{ref:Y,className:`z-[1000] rounded-lg shadow-2xl border ${le?"w-full":"absolute top-0 left-full ml-4 w-[480px]"} ${r?"bg-zinc-900 border-white/30":"bg-white border-zinc-200"}`,style:{pointerEvents:"auto"},onMouseDown:fe=>fe.stopPropagation(),children:[s.jsx("div",{className:"p-4 pt-4",children:u?s.jsxs(s.Fragment,{children:[s.jsxs("div",{className:"flex items-center justify-between mb-3",children:[s.jsxs("div",{className:`text-xs ${r?"text-zinc-400":"text-zinc-600"}`,children:[s.jsx("p",{className:"font-medium truncate max-w-[300px]",children:u.name}),s.jsxs("p",{className:"mt-0.5",children:["时长: ",Q(h)," | 大小: ",(u.size/1024/1024).toFixed(2)," MB"]})]}),s.jsx("button",{onClick:te,className:`p-2 rounded transition-colors ${r?"hover:bg-red-500/10 text-red-400":"hover:bg-red-50 text-red-500"}`,title:"删除视频",children:s.jsx(Zi,{size:16})})]}),s.jsx("div",{className:`mb-3 rounded-lg overflow-hidden border ${r?"border-zinc-700 bg-zinc-900":"border-zinc-200 bg-zinc-100"}`,children:s.jsx("video",{ref:k,className:"w-full h-auto",style:{maxHeight:"240px"}})}),s.jsxs("div",{className:"flex items-center gap-3 mb-3",children:[s.jsx("button",{onClick:we,className:`p-2 rounded-full transition-colors ${r?"bg-blue-600 hover:bg-blue-500 text-white":"bg-blue-500 hover:bg-blue-600 text-white"}`,children:g?s.jsx(Rw,{size:14}):s.jsx(Ia,{size:14,className:"ml-0.5"})}),s.jsxs("div",{className:"flex-1",children:[s.jsxs("div",{className:`text-xs font-mono ${r?"text-zinc-300":"text-zinc-700"}`,children:[Q(f)," / ",Q(h)]}),s.jsxs("div",{className:`text-xs mt-0.5 ${r?"text-zinc-400":"text-zinc-600"}`,children:["已选: ",ne.toFixed(1),"s",ne>=3&&ne<=i?s.jsx("span",{className:"text-green-500 ml-1",children:"✓"}):s.jsxs("span",{className:"text-red-500 ml-1",children:["需要 3-",i,"s"]})]})]})]}),s.jsxs("div",{ref:W,className:`relative rounded-lg mb-3 cursor-pointer overflow-hidden ${r?"bg-zinc-900":"bg-zinc-100"}`,style:{height:"80px"},onClick:U,children:[s.jsx("div",{className:"absolute inset-0 flex",children:A.map((fe,be)=>s.jsx("div",{className:"flex-1 h-full",style:{backgroundImage:`url(${fe})`,backgroundSize:"cover",backgroundPosition:"center"}},be))}),s.jsx("div",{className:"absolute top-0 bottom-0 bg-blue-500/30 border-l-2 border-r-2 border-blue-500 pointer-events-none",style:{left:`${me(w)}%`,width:`${me(m)-me(w)}%`}}),f>=w&&f<=m&&s.jsx("div",{className:"absolute top-0 bottom-0 w-0.5 bg-white shadow-lg pointer-events-none z-20",style:{left:`${me(f)}%`},children:s.jsx("div",{className:"absolute -top-1 left-1/2 -translate-x-1/2 w-2 h-2 rounded-full bg-white shadow-lg"})}),s.jsx("div",{className:"absolute top-0 bottom-0 w-1 bg-blue-500 cursor-ew-resize z-30 hover:w-1.5 transition-all",style:{left:`${me(w)}%`},onMouseDown:fe=>G("start",fe),children:s.jsx("div",{className:"absolute -bottom-5 left-1/2 -translate-x-1/2 text-xs font-mono whitespace-nowrap text-blue-500",children:Q(w)})}),s.jsx("div",{className:"absolute top-0 bottom-0 w-1 bg-blue-500 cursor-ew-resize z-30 hover:w-1.5 transition-all",style:{left:`${me(m)}%`},onMouseDown:fe=>G("end",fe),children:s.jsx("div",{className:"absolute -bottom-5 left-1/2 -translate-x-1/2 text-xs font-mono whitespace-nowrap text-blue-500",children:Q(m)})})]}),s.jsxs("div",{className:`text-xs text-center mb-3 ${r?"text-zinc-400":"text-zinc-600"}`,children:["拖动时间轴两端调整视频片段,需选择 3-",i,"秒"]}),s.jsxs("div",{className:`space-y-2 mb-3 p-3 rounded-lg border ${r?"bg-zinc-900/30 border-zinc-700":"bg-zinc-50 border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsx("span",{className:`text-xs ${r?"text-zinc-300":"text-zinc-700"}`,children:"视频类型"}),s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsxs("label",{className:"flex items-center gap-1.5 cursor-pointer",children:[s.jsx("input",{type:"radio",name:"referType",value:"base",checked:J==="base",onChange:fe=>Z("base"),className:"w-3.5 h-3.5 cursor-pointer"}),s.jsx("span",{className:`text-xs ${r?"text-zinc-400":"text-zinc-600"}`,children:"待编辑视频"})]}),s.jsxs("label",{className:"flex items-center gap-1.5 cursor-pointer",children:[s.jsx("input",{type:"radio",name:"referType",value:"feature",checked:J==="feature",onChange:fe=>Z("feature"),className:"w-3.5 h-3.5 cursor-pointer"}),s.jsx("span",{className:`text-xs ${r?"text-zinc-400":"text-zinc-600"}`,children:"特征参考视频"})]})]})]}),s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsx("span",{className:`text-xs ${r?"text-zinc-300":"text-zinc-700"}`,children:"保留原声"}),s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsxs("label",{className:"flex items-center gap-1.5 cursor-pointer",children:[s.jsx("input",{type:"radio",name:"keepOriginalSound",value:"yes",checked:B==="yes",onChange:fe=>V("yes"),className:"w-3.5 h-3.5 cursor-pointer"}),s.jsx("span",{className:`text-xs ${r?"text-zinc-400":"text-zinc-600"}`,children:"是"})]}),s.jsxs("label",{className:"flex items-center gap-1.5 cursor-pointer",children:[s.jsx("input",{type:"radio",name:"keepOriginalSound",value:"no",checked:B==="no",onChange:fe=>V("no"),className:"w-3.5 h-3.5 cursor-pointer"}),s.jsx("span",{className:`text-xs ${r?"text-zinc-400":"text-zinc-600"}`,children:"否"})]})]})]})]}),F&&s.jsx("div",{className:`text-xs p-2 rounded mb-3 ${r?"bg-yellow-500/10 text-yellow-400 border border-yellow-500/20":"bg-yellow-50 text-yellow-700 border border-yellow-200"}`,children:F}),X&&q&&s.jsx("div",{className:`text-xs p-2 rounded mb-3 text-center ${r?"bg-blue-500/10 text-blue-400 border border-blue-500/20":"bg-blue-50 text-blue-700 border border-blue-200"}`,children:q})]}):s.jsxs(s.Fragment,{children:[s.jsx("div",{onMouseDown:fe=>{fe.preventDefault(),fe.stopPropagation()},onClick:fe=>{var be;fe.preventDefault(),fe.stopPropagation(),(be=M.current)==null||be.click()},onDrop:re,onDragOver:ee,onDragLeave:pe,className:`border-2 border-dashed rounded-lg p-8 text-center cursor-pointer transition-colors ${N?r?"border-white/50 bg-white/5":"border-blue-500 bg-blue-50":r?"border-white/30 hover:border-white/50 bg-transparent":"border-zinc-300 hover:border-zinc-400 bg-zinc-50"}`,children:s.jsxs("div",{className:"flex flex-col items-center gap-3",children:[s.jsx("div",{className:`p-4 rounded-full ${r?"bg-transparent":"bg-blue-50"}`,children:s.jsx(ou,{size:32,className:r?"text-white/60":"text-blue-500"})}),s.jsxs("div",{children:[s.jsx("p",{className:`text-sm font-medium mb-1 ${r?"text-white":"text-zinc-800"}`,children:"点击或拖拽上传视频"}),s.jsx("p",{className:`text-xs ${r?"text-white/50":"text-zinc-600"}`,children:"仅支持 MP4/MOV 格式,3-10秒,720-2160px,最大 20MB"})]})]})}),s.jsx("input",{ref:M,type:"file",accept:".mp4,.mov,video/mp4,video/quicktime",onChange:ie,className:"hidden"})]})}),s.jsxs("div",{className:`flex justify-end gap-2 px-4 py-3 border-t ${r?"border-white/30":"border-zinc-200"}`,children:[s.jsx("button",{onClick:t,disabled:X,className:`px-4 py-2 rounded text-sm transition-colors border ${X?r?"bg-transparent border-white/20 text-white/50 cursor-not-allowed":"bg-zinc-400 text-zinc-200 cursor-not-allowed border-transparent":r?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-zinc-100 hover:bg-zinc-200 text-zinc-700 border-transparent"}`,children:"取消"}),u&&s.jsx("button",{onClick:ge,disabled:!u||ne<3||ne>i||X,className:`px-4 py-2 rounded text-sm transition-colors border ${u&&ne>=3&&ne<=i&&!X?r?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-blue-600 hover:bg-blue-500 text-white border-transparent":r?"bg-transparent border-white/20 text-white/50 cursor-not-allowed":"bg-zinc-400 text-zinc-200 cursor-not-allowed border-transparent"}`,children:X?"上传中...":"确认上传"})]})]})]})},f7=({isOpen:e,isDark:t,currentImages:n,onClose:r,onConfirm:i,onChange:a,apiKey:o,baseUrl:l,maxImages:c=7,attachMode:u="floating"})=>{const[d,h]=_.useState(n),[p,f]=_.useState(!1),[b,g]=_.useState(""),[y,w]=_.useState(!1),v=_.useRef(null);if(!e)return null;const m=async O=>{if(!O||O.length===0)return;const F=Array.from(O);if(d.length+F.length>c){alert(`最多支持上传 ${c} 张图片,当前已有 ${d.length} 张`);return}f(!0),g(`正在上传 0/${F.length} 张图片...`);try{const L=[];for(let X=0;X{if(O.preventDefault(),O.stopPropagation(),w(!1),p)return;const F=O.dataTransfer.getData("application/json");if(F)try{const X=JSON.parse(F);if(X.type==="history-item"&&X.item){if(console.log("[Kling Image] History item dropped:",X.item),X.item.type!=="image"){alert("只支持拖入图片,不支持视频或音频");return}if(d.length>=c){alert(`最多支持上传 ${c} 张图片`);return}f(!0),g("正在处理图片...");try{const q=await(await fetch(X.item.url)).blob(),H=`history-${Date.now()}.png`,J=new File([q],H,{type:q.type||"image/png"}),Z=new FormData;Z.append("file",J);const B=await fetch(`${l}/v1/files`,{method:"POST",headers:{Authorization:`Bearer ${o}`},body:Z});if(!B.ok)throw new Error(`上传失败: ${B.statusText}`);const V=await B.json();console.log("[Kling Image] 图片上传成功:",V);let N="";if(V.url?N=V.url:V.data&&V.data.url?N=V.data.url:(console.warn("[Kling Image] 响应中没有 URL,使用 filename:",V.filename),N=V.filename||""),N){const j=[...d,{url:N,file:J}];h(j),a&&a(j)}g("")}catch(T){console.error("[Kling Image] 处理历史图片失败:",T),alert(`图片处理失败: ${T instanceof Error?T.message:String(T)}`),g("")}finally{f(!1)}return}}catch(X){console.error("[Kling Image] Failed to parse history item data:",X)}const L=O.dataTransfer.files;L&&L.length>0&&await m(L)},C=O=>{O.preventDefault(),O.stopPropagation(),p||w(!0)},E=O=>{O.preventDefault(),O.stopPropagation(),w(!1)},I=O=>{const F=d.filter((L,X)=>X!==O);h(F),a&&a(F)},R=()=>{i(d),r()},A=u==="inline";return s.jsxs(s.Fragment,{children:[!A&&s.jsx("div",{className:"fixed inset-0 z-[100]",style:{backgroundColor:"rgba(0, 0, 0, 0.3)"},onClick:r}),s.jsxs("div",{className:`rounded-lg shadow-2xl border ${A?"w-full":"absolute top-0 left-full ml-4"} ${t?"bg-zinc-900 border-white/30":"bg-white border-zinc-200"}`,style:{width:"420px",maxHeight:"90vh",zIndex:1e3,pointerEvents:"auto"},onMouseDown:O=>O.stopPropagation(),onClick:O=>O.stopPropagation(),children:[s.jsxs("div",{className:"p-4 pt-4 space-y-4 overflow-y-auto minimal-scrollbar",style:{maxHeight:"calc(90vh - 100px)"},children:[s.jsxs("div",{onClick:()=>{var O;return!p&&((O=v.current)==null?void 0:O.click())},onDrop:z,onDragOver:C,onDragLeave:E,className:`border-2 border-dashed rounded-lg p-6 cursor-pointer transition-colors ${p?"opacity-50 cursor-not-allowed":y?t?"border-white/50 bg-white/5":"border-blue-500 bg-blue-50":t?"border-white/20 hover:border-white/40 bg-transparent":"border-zinc-300 hover:border-blue-500 bg-zinc-50"}`,children:[s.jsx("input",{ref:v,type:"file",accept:"image/*",multiple:!0,style:{display:"none"},onChange:O=>m(O.target.files),disabled:p}),s.jsx("div",{className:"flex flex-col items-center gap-2",children:p?s.jsxs(s.Fragment,{children:[s.jsx(zr,{size:32,className:`animate-spin ${t?"text-white":"text-blue-500"}`}),s.jsx("p",{className:`text-xs ${t?"text-zinc-400":"text-zinc-600"}`,children:b})]}):s.jsxs(s.Fragment,{children:[s.jsx(ou,{size:32,className:t?"text-white/60":"text-zinc-400"}),s.jsx("p",{className:`text-xs ${t?"text-white/70":"text-zinc-600"}`,children:"点击或拖拽上传图片"}),s.jsxs("p",{className:`text-[10px] ${t?"text-white/50":"text-zinc-400"}`,children:["支持 JPG、PNG、WebP 等格式,最多 ",c," 张"]})]})})]}),d.length>0&&s.jsxs("div",{className:"space-y-2",children:[s.jsxs("p",{className:`text-xs font-medium ${t?"text-zinc-400":"text-zinc-600"}`,children:["已上传图片 (",d.length,")"]}),s.jsx("div",{className:"grid grid-cols-3 gap-2",children:d.map((O,F)=>s.jsxs("div",{className:`relative aspect-square rounded-lg overflow-hidden border ${t?"border-white/30":"border-zinc-200"}`,children:[s.jsx("img",{src:O.url,alt:`图片 ${F+1}`,className:"w-full h-full object-cover"}),s.jsx("div",{className:"absolute inset-0 bg-black/50 opacity-0 hover:opacity-100 transition-opacity flex items-center justify-center",children:s.jsx("button",{onClick:()=>I(F),className:"p-1.5 rounded-full bg-red-500 text-white hover:bg-red-600 transition-colors",children:s.jsx(Zi,{size:14})})}),s.jsx("div",{className:"absolute bottom-1 left-1 px-1.5 py-0.5 rounded text-[9px] bg-black/60 text-white",children:F+1})]},F))})]}),s.jsxs("div",{className:`text-[10px] space-y-1 ${t?"text-white/50":"text-zinc-500"}`,children:[s.jsx("p",{children:"图片将自动上传到服务器"}),s.jsxs("p",{children:["确认后会在提示词中插入 ","<<>>",", ","<<>>"," 等标记"]}),s.jsxs("p",{children:["图片、视频、主体总数不能超过 ",c," 个"]})]})]}),s.jsxs("div",{className:`flex justify-end gap-2 p-3 pt-2 border-t ${t?"border-white/30":"border-zinc-200"}`,children:[s.jsx("button",{onClick:r,className:`px-3 py-1.5 rounded text-xs transition-colors border ${t?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-zinc-100 hover:bg-zinc-200 text-zinc-700 border-transparent"}`,children:"取消"}),s.jsxs("button",{onClick:R,disabled:d.length===0,className:`px-4 py-1.5 rounded text-xs transition-colors border ${d.length===0?t?"bg-transparent border-white/20 text-white/50 cursor-not-allowed":"bg-zinc-600 text-zinc-400 cursor-not-allowed border-transparent":t?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-blue-600 hover:bg-blue-500 text-white border-transparent"}`,children:["确认 (",d.length,")"]})]})]})]})},Zle=()=>{const e=_.useCallback(a=>{var g,y,w,v;if(a.type!=="storyboard-node")throw new Error("节点类型错误");const o=((g=a.settings)==null?void 0:g.shots)||[],l=m=>m.image_urls&&Array.isArray(m.image_urls)&&m.image_urls.length>0?m.image_urls:m.image_url&&typeof m.image_url=="string"?[m.image_url]:[],c=o.map((m,z)=>{const C=l(m);return{shot_number:m.scene_index||z+1,shot_size:m.shot_size||m.camera||"中景",description_zh:m.description_zh||m.description||"",description_en:m.description_en||"",prompt:m.prompt||"",image_url:C[0]||"",...C.length>1?{image_urls:C}:{},time_range:m.time_range||"",camera:m.camera||"",camera_angle:m.camera_angle||"",tags:m.tags||[],dialogue:m.dialogue||"",character:m.character||"",model:m.model||"sora-2",ratio:m.ratio||"16:9",duration:m.duration||"15s",resolution:m.resolution||"1080P"}}),u=((y=a.settings)==null?void 0:y.layout_specification)||((w=a.settings)!=null&&w.jsonData?(()=>{try{const m=JSON.parse(a.settings.jsonData);return m==null?void 0:m.layout_specification}catch{return}})():void 0),d={version:"1.0",projectTitle:((v=a.settings)==null?void 0:v.projectTitle)||"分镜表",exportedAt:new Date().toISOString(),total_shots:c.length,...u?{layout_specification:u}:{},shots:c};let h;try{h=JSON.stringify(d,null,2)}catch(m){if(m instanceof RangeError&&m.message.includes("Invalid string length"))console.warn("数据过大,使用紧凑格式"),h=JSON.stringify(d);else throw m}const p=new Blob([h],{type:"application/json"}),f=URL.createObjectURL(p),b=document.createElement("a");b.href=f,b.download=`${d.projectTitle}_${new Date().toISOString().slice(0,10)}.json`,document.body.appendChild(b),b.click(),document.body.removeChild(b),URL.revokeObjectURL(f)},[]),t=_.useCallback(a=>{var g;if(a.type!=="storyboard-node")throw new Error("节点类型错误");const o=((g=a.settings)==null?void 0:g.shots)||[],l=["镜号","画面URL","中文描述","英文描述","对白/旁白","角色","景别","角度","运镜","时长","提示词"],c=y=>y.image_urls&&Array.isArray(y.image_urls)&&y.image_urls.length>0?y.image_urls:y.image_url&&typeof y.image_url=="string"?[y.image_url]:[],u=o.map(y=>{const w=c(y);return[String(y.scene_index||""),w.length>0?w.join("; "):"",String(y.description_zh||y.description||""),String(y.description_en||""),String(y.dialogue||""),String(y.character||""),String(y.shot_size||""),String(y.camera_angle||""),String(y.camera||""),String(y.duration||""),String(y.prompt||"")]}),d=y=>{const w=String(y);return w.includes(",")||w.includes('"')||w.includes(` +`)||w.includes("\r")?`"${w.replace(/"/g,'""')}"`:w},h=[l.join(","),...u.map(y=>y.map(w=>d(w)).join(","))].join(` +`),p=new Blob(["\uFEFF"+h],{type:"text/csv;charset=utf-8;"}),f=URL.createObjectURL(p),b=document.createElement("a");return b.href=f,b.download=`CineScript-Storyboard-${new Date().toISOString().slice(0,10)}.csv`,document.body.appendChild(b),b.click(),document.body.removeChild(b),URL.revokeObjectURL(f),!0},[]),n=_.useCallback(async a=>{var c,u;if(a.type!=="storyboard-node")throw new Error("节点类型错误");const o=((c=a.settings)==null?void 0:c.shots)||[];if(o.length===0)return alert("没有可导出的镜头"),!1;let l;try{window.jspdf?l=window.jspdf.jsPDF:await new Promise((d,h)=>{const p=document.createElement("script");p.src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js",p.onload=()=>{l=window.jspdf.jsPDF,d()},p.onerror=()=>h(new Error("Failed to load jsPDF")),document.head.appendChild(p)})}catch(d){return console.error("[Export] 加载jsPDF失败:",d),alert("加载PDF库失败,请检查网络连接"),!1}try{const d=new l({orientation:"landscape",unit:"mm",format:"a4"}),h=(q,H,J,Z="#000000")=>{const B=document.createElement("canvas"),V=B.getContext("2d");if(!V)return{dataUrl:"",width:0,height:0,lines:0};V.font=`${H}px "Noto Sans SC", "Microsoft YaHei", "SimHei", "PingFang SC", "Hiragino Sans GB", sans-serif`,V.fillStyle=Z,V.textBaseline="top",V.textAlign="left";const N=/[\u4e00-\u9fa5]/.test(q);if(J){const j=q.split(""),k=[];let W="";for(let ie=0;ieJ&&W.length>0?(k.push(W),W=j[ie]):W=oe}W.length>0&&k.push(W);const M=H*1.3,Y=2;let se=0;return k.forEach(ie=>{const oe=V.measureText(ie).width;oe>se&&(se=oe)}),B.width=Math.ceil(se)+Y*2,B.height=Math.ceil(k.length*M)+Y*2,V.font=`${H}px "Noto Sans SC", "Microsoft YaHei", "SimHei", "PingFang SC", "Hiragino Sans GB", sans-serif`,V.fillStyle=Z,V.textBaseline="top",V.textAlign="left",k.forEach((ie,oe)=>{V.fillText(ie,Y,Y+oe*M)}),{dataUrl:B.toDataURL("image/png"),width:B.width*.264583,height:B.height*.264583,lines:k.length}}else{const j=V.measureText(q),k=2;return B.width=Math.ceil(j.width)+k*2,B.height=Math.ceil(H)+k*2,V.font=`${H}px "Noto Sans SC", "Microsoft YaHei", "SimHei", "PingFang SC", "Hiragino Sans GB", sans-serif`,V.fillStyle=Z,V.textBaseline="top",V.textAlign="left",V.fillText(q,k,k),{dataUrl:B.toDataURL("image/png"),width:B.width*.264583,height:B.height*.264583,lines:1}}},p=d.internal.pageSize.getWidth(),f=d.internal.pageSize.getHeight(),b=10,g=p-b*2,y=f-b*2,w=q=>q.image_urls&&Array.isArray(q.image_urls)&&q.image_urls.length>0?q.image_urls:q.image_url&&typeof q.image_url=="string"?[q.image_url]:[],v=q=>new Promise((H,J)=>{if(q.startsWith("data:")){const B=new Image;B.onload=()=>{H({base64:q,width:B.naturalWidth,height:B.naturalHeight})},B.onerror=()=>J(new Error("Base64图片解析失败")),B.src=q;return}const Z=new Image;Z.crossOrigin="anonymous",Z.onload=()=>{try{const B=document.createElement("canvas");B.width=Z.naturalWidth,B.height=Z.naturalHeight;const V=B.getContext("2d");if(!V){J(new Error("无法创建canvas上下文"));return}V.drawImage(Z,0,0);const N=B.toDataURL("image/jpeg",.8);H({base64:N,width:Z.naturalWidth,height:Z.naturalHeight})}catch(B){J(B)}},Z.onerror=()=>J(new Error("图片加载失败")),Z.src=q});let m=b;const z=60,C=50,E=35,I=b+C+8,R=((u=a.settings)==null?void 0:u.projectTitle)||"分镜表",A=h(R,18,void 0,"#000000");A.dataUrl&&d.addImage(A.dataUrl,"PNG",b,m,A.width,A.height),m+=10;const O=`导出时间: ${new Date().toLocaleString("zh-CN")}`,F=`镜头总数: ${o.length}`,L=h(O,10,void 0,"#666666"),X=h(F,10,void 0,"#666666");L.dataUrl&&d.addImage(L.dataUrl,"PNG",b,m,L.width,L.height),X.dataUrl&&d.addImage(X.dataUrl,"PNG",p-b-X.width,m,X.width,X.height),m+=12;for(let q=0;qf-b&&(d.addPage(),m=b);const J=w(H),Z=H.scene_index||q+1,B=H.description_zh||H.description||"",V=H.description_en||"",N=H.prompt||"",j=H.camera||"",k=H.duration||"15s",W=H.model||"";d.setDrawColor(200,200,200),d.line(b,m-2,p-b,m-2);const M=`镜头 ${Z}`,Y=h(M,14,void 0,"#000000");if(Y.dataUrl&&d.addImage(Y.dataUrl,"PNG",b,m+5,Y.width,Y.height),J.length>0)try{const oe=await v(J[0]),re=oe.width/oe.height;let ee=C,pe=E;re>C/E?pe=C/re:ee=E*re,d.addImage(oe.base64,"JPEG",b,m+8,ee,pe),J.length>1&&(d.setFontSize(8),d.setFillColor(0,0,0,.7),d.rect(b+ee-15,m+8,15,8,"F"),d.setTextColor(255,255,255),d.text(`+${J.length-1}`,b+ee-12,m+8+6),d.setTextColor(0,0,0))}catch(oe){console.warn(`[Export] 镜头 ${Z} 图片加载失败:`,oe),d.setFillColor(240,240,240),d.rect(b,m+8,C,E,"F"),d.setDrawColor(200,200,200),d.rect(b,m+8,C,E,"S");const re=h("图片加载失败",8,void 0,"#969696");re.dataUrl&&d.addImage(re.dataUrl,"PNG",b+C/2-re.width/2,m+8+E/2-re.height/2,re.width,re.height)}else{d.setFillColor(240,240,240),d.rect(b,m+8,C,E,"F"),d.setDrawColor(200,200,200),d.rect(b,m+8,C,E,"S");const oe=h("无图片",8,void 0,"#969696");oe.dataUrl&&d.addImage(oe.dataUrl,"PNG",b+C/2-oe.width/2,m+8+E/2-oe.height/2,oe.width,oe.height)}let se=m+10;if(B){const oe=h(B,11,g-C-8,"#000000");oe.dataUrl&&(d.addImage(oe.dataUrl,"PNG",I,se,oe.width,oe.height),se+=oe.height+3)}if(V){const oe=h(V,9,g-C-8,"#646464");oe.dataUrl&&(d.addImage(oe.dataUrl,"PNG",I,se,oe.width,oe.height),se+=oe.height+3)}const ie=[W,j,k].filter(Boolean).join(" | ");if(ie){const oe=h(ie,8,g-C-8,"#646464");oe.dataUrl&&(d.addImage(oe.dataUrl,"PNG",I,se+2,oe.width,oe.height),se+=oe.height+2)}if(N&&se+10200?N.substring(0,200)+"...":N,re=h(oe,7,g-C-8,"#505050");re.dataUrl&&se+re.height{var l,c,u,d;if(a.type!=="storyboard-node")throw new Error("节点类型错误");const o=((l=a.settings)==null?void 0:l.shots)||[];if(o.length===0)return alert("没有可导出的镜头"),!1;try{const h=z=>z.image_urls&&Array.isArray(z.image_urls)&&z.image_urls.length>0?z.image_urls:z.image_url&&typeof z.image_url=="string"?[z.image_url]:[],p=async z=>{if(z.startsWith("data:"))return z;try{const E=await(await fetch(z)).blob();return new Promise((I,R)=>{const A=new FileReader;A.onloadend=()=>{const O=A.result;I(O)},A.onerror=R,A.readAsDataURL(E)})}catch(C){return console.error("[Export] 图片转换失败:",C),z}},f=await Promise.all(o.map(async(z,C)=>{const E=h(z),I=await Promise.all(E.map(R=>p(R)));return{shot_number:z.scene_index||C+1,shot_size:z.shot_size||z.camera||"中景",description_zh:z.description_zh||z.description||"",description_en:z.description_en||"",prompt:z.prompt||"",image_url:I[0]||"",...I.length>1?{image_urls:I}:{},time_range:z.time_range||"",camera:z.camera||"",camera_angle:z.camera_angle||"",tags:z.tags||[],dialogue:z.dialogue||"",character:z.character||"",model:z.model||"sora-2",ratio:z.ratio||"16:9",duration:z.duration||"15s",resolution:z.resolution||"1080P"}})),b=((c=a.settings)==null?void 0:c.layout_specification)||((u=a.settings)!=null&&u.jsonData?(()=>{try{const z=JSON.parse(a.settings.jsonData);return z==null?void 0:z.layout_specification}catch{return}})():void 0),g={version:"2.0",projectTitle:((d=a.settings)==null?void 0:d.projectTitle)||"分镜表",exportedAt:new Date().toISOString(),total_shots:f.length,...b?{layout_specification:b}:{},shots:f};let y;try{y=JSON.stringify(g,null,2)}catch(z){if(z instanceof RangeError&&z.message.includes("Invalid string length"))console.warn("数据过大,使用紧凑格式"),y=JSON.stringify(g);else throw z}const w=new Blob([y],{type:"application/json"}),v=URL.createObjectURL(w),m=document.createElement("a");return m.href=v,m.download=`${g.projectTitle}_完整版_${new Date().toISOString().slice(0,10)}.json`,document.body.appendChild(m),m.click(),document.body.removeChild(m),URL.revokeObjectURL(v),!0}catch(h){throw console.error("[Export] 文件导出失败:",h),h}},[]),i=_.useCallback(async a=>{try{const o=await a.text(),l=JSON.parse(o);if(!l.shots||!Array.isArray(l.shots))throw new Error("无效的分镜表文件格式");const c=async d=>{if(!d||typeof d!="string")return"";if(!d.startsWith("data:"))return d;try{if(!d.includes(","))return console.warn("[Import] 无效的 Base64 格式,缺少逗号分隔符"),d;const h=await fetch(d);if(!h.ok)throw new Error(`HTTP ${h.status}: ${h.statusText}`);const p=await h.blob();if(!p||p.size===0)throw new Error("Blob 为空或无效");return URL.createObjectURL(p)}catch(h){return console.error("[Import] Base64转换失败:",h,"Base64长度:",d.length),d}};return await Promise.all(l.shots.map(async(d,h)=>{const p=d.image_urls||(d.image_url?[d.image_url]:[]),f=await Promise.all(p.map(b=>c(b)));return{id:`imported-${Date.now()}-${h}-${Math.random().toString(36).substr(2,9)}`,scene_index:d.shot_number||h+1,description_zh:d.description_zh||"",description_en:d.description_en||"",prompt:d.prompt||"",image_url:f[0]||"",...f.length>1?{image_urls:f}:{},time_range:d.time_range||"",camera:d.camera||"",camera_angle:d.camera_angle||"",tags:d.tags||[],dialogue:d.dialogue||"",character:d.character||"",model:d.model||"sora-2",ratio:d.ratio||"16:9",duration:d.duration||"15s",resolution:d.resolution||"1080P",shot_size:d.shot_size||"",status:"draft"}}))}catch(o){throw console.error("[Import] 文件导入失败:",o),o}},[]);return{exportStoryboardJSON:e,exportStoryboardCSV:t,exportStoryboardPDF:n,exportStoryboardFile:r,importStoryboardFile:i}},Qle=({node:e,isDark:t,apiConfigs:n,getConnectedVideoAnalyzeNode:r,importShotsFromAnalysis:i,updateShot:a,generateSingleShot:o,deleteShot:l,addEmptyShot:c,setLightboxItem:u,setLightboxOpen:d,nodes:h=[],connections:p=[],getConnectedInputImages:f,globalApiKey:b="",dataVersion:g,generateFromScript:y,splitImageToShots:w,generateSequenceFromShot:v,updateNode:m,setNodes:z,setConnections:C,generateId:E,characterLibrary:I=[],klingSubjectLibrary:R=[],setKlingSubjectsOpen:A,onDownloadStoryboardVideos:O,isDownloading:F=!1,downloadProgress:L={current:0,total:0},filterJimengModels:X})=>{var St,Qe;const T=((St=e.settings)==null?void 0:St.shots)||[],q=_.useRef(null),[H,J]=_.useState("list");Zle();const[Z,B]=_.useState(new Set),[V,N]=_.useState(!1),[j,k]=_.useState({from:"",to:""}),[W,M]=_.useState(!1),[Y,se]=_.useState(!1),[ie,oe]=_.useState(""),[re,ee]=_.useState(!1),[pe,we]=_.useState(""),[Q,me]=_.useState(""),[ue,U]=_.useState(""),[G,te]=_.useState(""),[ge,ne]=_.useState(!1),[le,fe]=_.useState(!1),[be,de]=_.useState(!1),[$e,ze]=_.useState(!1),[_e,Ee]=_.useState(null),[Ce,xe]=_.useState(""),[Ne,ve]=_.useState(4),[ke,Ie]=_.useState(!1),[Pe,Te]=_.useState(null),[Be,He]=_.useState(null),[Je,Me]=_.useState(null),[Re,Ve]=_.useState(null),[Ze,je]=_.useState(!1),[Le,Xe]=_.useState(null);_.useMemo(()=>{const Ue=n.filter(Ge=>Ge.type==="Chat");return Ue.length>0?Ue[0].modelName||Ue[0].id:"gemini-3-pro-preview"},[n]);const[qe,tt]=_.useState(()=>{const Ue=n.filter(Ge=>Ge.type==="Chat");return Ue.length>0?Ue[0].modelName||Ue[0].id:"gemini-3-pro-preview"}),[Ye,ct]=_.useState("original"),[pt,ht]=_.useState(10),[wt,$t]=_.useState(!1),[jt,Nt]=_.useState(null);_.useEffect(()=>{var Ge;const Ue=(Ge=e.settings)==null?void 0:Ge.jsonData;Ue&&Nt(Ue)},[(Qe=e.settings)==null?void 0:Qe.jsonData]);const Yt=_.useMemo(()=>pe&&G?nu(pe,G):["5s","10s","15s","30s","60s"],[pe,G]),un=_.useMemo(()=>pe?eu(pe):["720P","1080P","4K"],[pe]),Tn=_.useMemo(()=>pe&&hl(pe)?Lp:["16:9","9:16","1:1","4:3","3:4"],[pe]),Ht=_.useCallback(()=>{if(!pe||!Q||!ue||!G||T.length===0){ee(!1);return}const Ue=T.map(Ge=>({...Ge,model:pe,ratio:Q,duration:ue,resolution:G}));m(e.id,{settings:{...e.settings,shots:Ue}}),ee(!1)},[pe,Q,ue,G,T,e,m]),fn=_.useMemo(()=>{if(!p||!h||p.length===0)return null;const Ue=p.find(Ge=>{if(Ge.to!==e.id)return!1;const at=h.find(rt=>rt.id===Ge.from);return at&&(at.type==="text-node"||at.type==="custom-agent"||at.type==="novel-input")});return Ue&&h.find(Ge=>Ge.id===Ue.from)||null},[p,h,e.id,g]),Dn=_.useMemo(()=>{if(!p||!h||p.length===0)return null;const Ue=p.find(Ge=>{if(Ge.to!==e.id)return!1;const at=h.find(rt=>rt.id===Ge.from);return at&&(at.type==="input-image"||at.type==="preview")});return Ue&&h.find(Ge=>Ge.id===Ue.from)||null},[p,h,e.id,g]),it=_.useMemo(()=>r?r(e.id):null,[r,e.id,g]),Lt=_.useCallback(async()=>{var lt,ot;if(!fn||!y)return;const Ge=new Map(h.map(At=>[At.id,At])).get(fn.id)||fn;let at="";if(Ge.type==="custom-agent")at=(((lt=Ge.settings)==null?void 0:lt.outputContent)||"").trim();else{const At=((ot=Ge.settings)==null?void 0:ot.text)||"",kt=Ge.prompt||"",Ot=Ge.content||"";at=(At||kt||Ot).trim()}if(!at){alert("连接的文本节点没有内容");return}fe(!0);let rt=null;if(Ye!=="original")if(Ye==="custom"){const At=pt,kt=Math.ceil(Math.sqrt(At));rt={rows:Math.ceil(At/kt),cols:kt}}else{const[At,kt]=Ye.split("x").map(Number);rt={rows:At,cols:kt}}fe(!0);try{const At=await y(e.id,at,rt,qe);At&&typeof At=="object"&&(Nt(JSON.stringify(At,null,2)),$t(!1))}catch(At){console.error("[Storyboard] 从文本生成失败:",At),Nt(null);const kt=At instanceof Error?At.message:"生成失败,请检查网络连接或稍后重试";alert(`从文本生成分镜失败: ${kt}`)}finally{fe(!1)}},[fn,y,e.id,h,Ye,pt,qe]),gt=_.useCallback(async()=>{var lt;if(!Dn||!w)return;const Ge=new Map(h.map(ot=>[ot.id,ot])).get(Dn.id)||Dn;let at="";if(Ge.type==="preview"?at=Ge.selectedPreviewImage||((lt=Ge.previewMjImages)==null?void 0:lt[0])||Ge.content||"":at=Ge.content||"",!at){alert("连接的图片节点没有图片");return}let rt;if(Ye==="custom"){const ot=pt,At=Math.ceil(Math.sqrt(ot));rt={rows:Math.ceil(ot/At),cols:At}}else if(Ye==="original")rt={rows:3,cols:3};else{const[ot,At]=Ye.split("x").map(Number);rt={rows:ot,cols:At}}fe(!0);try{await w(e.id,at,rt)}catch(ot){console.error("[Storyboard] 图片拆解失败:",ot)}finally{fe(!1)}},[Dn,w,e.id,h,Ye,pt]),Jt=_.useCallback(()=>{i(e.id)},[i,e.id]),Wt=_.useCallback(Ue=>{if(Ue){const Ge=parseInt(Ue.from),at=parseInt(Ue.to);if(isNaN(Ge)||isNaN(at)||Ge<1||atT.length){alert("请输入有效的镜号范围");return}const rt=T.filter(lt=>{const ot=lt.scene_index;return ot>=Ge&&ot<=at});if(rt.length===0){alert("没有找到要删除的镜头");return}window.confirm(`确定要删除镜号 ${Ge} 到 ${at} 的 ${rt.length} 个镜头吗?`)&&(rt.forEach(lt=>l(e.id,lt.id)),k({from:"",to:""}))}else{if(Z.size===0){alert("请先选择要删除的镜头");return}window.confirm(`确定要删除选中的 ${Z.size} 个镜头吗?`)&&(Z.forEach(Ge=>l(e.id,Ge)),B(new Set))}N(!1)},[T,Z,l,e.id]),Pt=_.useCallback(async Ue=>{const Ge=Ue?T.filter(ot=>Ue.has(ot.id)&&ot.video_url):T.filter(ot=>ot.video_url);if(Ge.length===0){alert(Ue?"选中的镜头中没有已生成的视频":"当前分镜表没有已生成的视频");return}const at=Ge.map((ot,At)=>{const kt=ot.scene_index??At+1,Ot=String(ot.description||ot.prompt||"").replace(/[/\\?*:"<>|]/g,"_").slice(0,40)||`镜头${kt}`;return{url:ot.video_url,name:`分镜_${kt}_${Ot}.mp4`}});if(O){await O(at);return}M(!0);const rt=async ot=>{if(ot.startsWith("blob:")||ot.startsWith("data:"))return(await fetch(ot)).blob();if(typeof window<"u"&&"__TAURI__"in window)try{const{downloadWithFallback:kt}=await mn(async()=>{const{downloadWithFallback:Ot}=await Promise.resolve().then(()=>n0);return{downloadWithFallback:Ot}},void 0,import.meta.url);return await kt(ot,12e4)}catch{const kt=await fetch(ot);if(!kt.ok)throw new Error(`HTTP ${kt.status}`);return kt.blob()}const At=await fetch(ot);if(!At.ok)throw new Error(`HTTP ${At.status}`);return At.blob()},lt=(ot,At)=>{const kt=URL.createObjectURL(ot),Ot=document.createElement("a");Ot.href=kt,Ot.download=At,Ot.style.display="none",document.body.appendChild(Ot),Ot.click(),document.body.removeChild(Ot),URL.revokeObjectURL(kt)};for(let ot=0;otsetTimeout(dn,400))}M(!1)},[T,O]),Bt=O?F:W,zt=_.useCallback(()=>{const Ue=ie.trim();Ue&&(T.forEach(Ge=>{const at=Ge.prompt||"",rt=Ge.description_zh||"",lt=Ge.description||"",ot=Ge.description_en||"";a(e.id,Ge.id,{prompt:Ue+at,description_zh:Ue+rt,description:Ue+lt,...ot?{description_en:Ue+ot}:{}})}),oe(""),se(!1))},[ie,T,a,e.id]),Gt=_.useCallback(Ue=>Ue.image_urls&&Array.isArray(Ue.image_urls)&&Ue.image_urls.length>0?Ue.image_urls:Ue.image_url&&typeof Ue.image_url=="string"?[Ue.image_url]:[],[]),qt=_.useCallback(()=>{const Ue=at=>{var rt;return at.status!=="generating"&&(((rt=at.prompt)==null?void 0:rt.trim())||Gt(at).length>0)},Ge=T.filter(Ue);if(Ge.length===0){alert("当前没有可生成的镜头(请确保镜头有画面描述/提示词或至少一张参考图,且未在生成中)");return}Ge.forEach((at,rt)=>{setTimeout(()=>{o(e.id,at)},rt*400)})},[T,Gt,o,e.id]),De=_.useCallback((Ue,Ge)=>{if(!z||!E)return;const at=e.nodeName||"分镜节点",rt=`_镜头${String(Ge+1).padStart(2,"0")}`,lt=Ue.prompt||Ue.description||"",ot=Ue.model||"sora-2",At=Ue.ratio||Ue.aspect_ratio||"16:9",kt=Ue.duration||"15s",Ot=Ue.resolution||"1080P",dn=`${at}${rt}`,Vt=E(),Zt=!!Ue.enableFrames,Sn={model:ot,ratio:At,duration:kt,resolution:Ot};Zt&&Kd(ot)&&(Sn.veoFramesMode=!0);const jn=80,_n=260,Cn=Ue.startFrame||"",Kn=Ue.endFrame||"",Xn=Gt(Ue),Tr=Kd(ot)&&(Zt||Xn.length>=2),kr=[];Cn&&kr.push({url:Cn,inputType:"veo_start",label:"首帧"}),Kn&&kr.push({url:Kn,inputType:"veo_end",label:"尾帧"}),Xn.length>0&&(Cn||Kn?Xn[0]&&kr.unshift({url:Xn[0],inputType:"default",label:"主图"}):Tr&&Xn.length>=2?Xn.length===2?(kr.push({url:Xn[0],inputType:"veo_start",label:"首帧"}),kr.push({url:Xn[1],inputType:"veo_end",label:"尾帧"})):(kr.push({url:Xn[0],inputType:"default",label:"主图"}),kr.push({url:Xn[1],inputType:"veo_start",label:"首帧"}),kr.push({url:Xn[2],inputType:"veo_end",label:"尾帧"})):Xn.slice(0,3).forEach((tn,cn)=>kr.push({url:tn,inputType:"default",label:cn===0?"图":`图${cn+1}`})));const Rr=e.x+(e.width??600)+jn,sr=kr.length*_n+(kr.length-1)*jn,mt=Rr+(kr.length>0?sr+jn:0),It=kr.map(tn=>({id:E(),inputType:tn.inputType}));if(z(tn=>{const zn=[{...Ms(Vt,"gen-video",mt,e.y,dn,Sn,tn),prompt:lt}];return kr.forEach((Rn,bt)=>{const bn=Ms(It[bt].id,"input-image",Rr+bt*(_n+jn),e.y,`${at}${rt}_${Rn.label}`,void 0,tn);zn.push({...bn,content:Rn.url})}),[...tn,...zn]}),kr.length>0&&C){const tn=kr.map((cn,zn)=>({id:E(),from:It[zn].id,to:Vt,inputType:It[zn].inputType==="default"?void 0:It[zn].inputType}));C(cn=>[...cn,...tn])}},[e.x,e.y,e.width,e.nodeName,z,C,E,Gt]),st=_.useCallback(Ue=>{if(Gt(Ue).length===0)return;if(!(Ue.prompt||Ue.description||"").trim()){alert("镜头没有提示词,无法生成分镜序列");return}Ee(Ue);const rt=n.filter(lt=>lt.type==="Chat");rt.length>0&&xe(rt[0].modelName||rt[0].id),ve(4),ze(!0)},[n,u,d]),Ae=_.useCallback(async()=>{var Ot,dn,Vt,Zt,Sn,jn,_n;if(!_e||!z||!E)return;const Ue=_e.prompt||_e.description||"";if(!Ue.trim()){alert("镜头没有提示词,无法生成分镜序列");return}const Ge=n.filter(Cn=>Cn.type==="Chat");if(Ge.length===0){alert("请先配置 Chat API");return}const at=Ge.find(Cn=>(Cn.modelName||Cn.id)===Ce)||Ge[0],rt=at.key||b;if(!rt){alert("请先配置 API Key");return}const lt=(at.url||"https://linyunai.net").replace(/\/+$/,"");Ie(!0),ze(!1);const ot=_e.id;ot&&a(e.id,ot,{status:"generating",generatingProgress:10});let At=10;const kt=setInterval(()=>{ot&&(At+=10,At<90&&a(e.id,ot,{generatingProgress:At}))},500);try{const Cn=`你是一个专业的AI绘画提示词生成专家。基于用户提供的分镜提示词,生成${Ne}个连贯的、适合AI绘画的提示词。 + +要求: +1. 每个提示词应该基于原始分镜提示词进行扩展和变化 +2. ${Ne}个提示词应该保持视觉连贯性和故事性 +3. 可以是同一场景的不同角度、不同景别,或者时间上的延续 +4. 每个提示词要简洁、清晰、突出视觉重点 +5. 使用英文,符合AI绘画模型的提示词格式 + +请以JSON格式返回,格式如下: +{ + "prompts": [ + "第一个AI绘画提示词", + "第二个AI绘画提示词", + ... + ] +}`,Kn=await fetch(`${lt}/v1/chat/completions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${rt}`},body:JSON.stringify({model:at.modelName||"gemini-3-pro-preview",messages:[{role:"system",content:Cn},{role:"user",content:`原始分镜提示词: +${Ue} + +请基于此提示词生成${Ne}个连贯的AI绘画提示词。`}],max_tokens:2e3,temperature:.7,stream:!1})});if(!Kn.ok)throw new Error(`API请求失败: ${Kn.status}`);const Xn=await Kn.json(),Tr=(((Vt=(dn=(Ot=Xn.choices)==null?void 0:Ot[0])==null?void 0:dn.message)==null?void 0:Vt.content)||((_n=(jn=(Sn=(Zt=Xn.data)==null?void 0:Zt.choices)==null?void 0:Sn[0])==null?void 0:jn.message)==null?void 0:_n.content)||Xn.content||"").match(/\{[\s\S]*\}/);if(!Tr)throw new Error("未找到JSON格式的数据");const Rr=JSON.parse(Tr[0]).prompts||[];if(Rr.length!==Ne)throw new Error(`期望${Ne}个提示词,但得到${Rr.length}个`);const sr=360,mt=340,It=20,tn=e.x+e.width+100,cn=e.y,zn=[];Rr.forEach((Rn,bt)=>{const bn=Ms(E(),"gen-image",tn,cn+bt*(mt+It),void 0,{model:"qwen-image-edit",ratio:"16:9",resolution:"1K",batchCount:1},[...h,...zn]);bn.prompt=Rn,zn.push(bn)}),z(Rn=>[...Rn,...zn]),clearInterval(kt),ot&&(a(e.id,ot,{status:"draft",generatingProgress:100}),setTimeout(()=>{a(e.id,ot,{generatingProgress:0})},1e3)),alert(`成功创建 ${zn.length} 个AI绘画节点`)}catch(Cn){console.error("[Storyboard] 生成AI绘画节点失败:",Cn);const Kn=Cn instanceof Error?Cn.message:"生成失败";clearInterval(kt),ot&&a(e.id,ot,{status:"draft",generatingProgress:0}),alert(`生成失败: ${Kn}`)}finally{Ie(!1),Ee(null)}},[_e,Ce,Ne,e,n,b,z,E,a]),nt=_.useCallback(Ue=>{st(Ue)},[st]);_.useCallback(async Ue=>{var kt,Ot,dn,Vt,Zt,Sn,jn;if(Gt(Ue).length===0)return;if(!z||!E){alert("创建节点功能不可用");return}const at=Ue.prompt||Ue.description||"";if(!at.trim()){alert("镜头没有提示词,无法生成AI绘画节点");return}const rt=n.filter(_n=>_n.type==="Chat");if(rt.length===0){alert("请先配置 Chat API");return}const lt=rt[0],ot=lt.key||b;if(!ot){alert("请先配置 API Key");return}const At=(lt.url||"https://linyunai.net").replace(/\/+$/,"");try{const Cn=await fetch(`${At}/v1/chat/completions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${ot}`},body:JSON.stringify({model:lt.modelName||"gemini-3-pro-preview",messages:[{role:"system",content:`你是一个专业的AI绘画提示词生成专家。基于用户提供的分镜提示词,生成4个连贯的、适合AI绘画的提示词。 + +要求: +1. 每个提示词应该基于原始分镜提示词进行扩展和变化 +2. 4个提示词应该保持视觉连贯性和故事性 +3. 可以是同一场景的不同角度、不同景别,或者时间上的延续 +4. 每个提示词要简洁、清晰、突出视觉重点 +5. 使用英文,符合AI绘画模型的提示词格式 + +请以JSON格式返回,格式如下: +{ + "prompts": [ + "第一个AI绘画提示词", + "第二个AI绘画提示词", + "第三个AI绘画提示词", + "第四个AI绘画提示词" + ] +}`},{role:"user",content:`原始分镜提示词: +${at} + +请基于此提示词生成4个连贯的AI绘画提示词。`}],max_tokens:2e3,temperature:.7,stream:!1})});if(!Cn.ok)throw new Error(`API请求失败: ${Cn.status}`);const Kn=await Cn.json(),$r=(((dn=(Ot=(kt=Kn.choices)==null?void 0:kt[0])==null?void 0:Ot.message)==null?void 0:dn.content)||((jn=(Sn=(Zt=(Vt=Kn.data)==null?void 0:Vt.choices)==null?void 0:Zt[0])==null?void 0:Sn.message)==null?void 0:jn.content)||Kn.content||"").match(/\{[\s\S]*\}/);if(!$r)throw new Error("未找到JSON格式的数据");const kr=JSON.parse($r[0]).prompts||[];if(kr.length!==4)throw new Error(`期望4个提示词,但得到${kr.length}个`);const Rr=360,sr=340,mt=20,It=e.x+e.width+100,tn=e.y,cn=[];kr.forEach((zn,Rn)=>{const bt=Ms(E(),"gen-image",It,tn+Rn*(sr+mt),void 0,{model:"qwen-image-edit",ratio:"16:9",resolution:"1K",batchCount:1},[...h,...cn]);bt.prompt=zn,cn.push(bt)}),z(zn=>[...zn,...cn]),alert(`成功创建 ${cn.length} 个AI绘画节点`)}catch(_n){console.error("[Storyboard] 生成AI绘画节点失败:",_n);const Cn=_n instanceof Error?_n.message:"生成失败";alert(`生成失败: ${Cn}`)}},[e,n,b,z,E,u,d]);const _t=_.useCallback(()=>{if(h.filter(Ge=>Ge.type==="storyboard-node"&&Ge.id!==e.id).length===0){alert("画布中没有其他分镜节点");return}de(!0)},[h,e]),xt=_.useCallback(Ue=>{var kt,Ot;if(!m||!E){alert("更新功能不可用");return}const Ge=h.find(dn=>dn.id===Ue);if(!Ge||Ge.type!=="storyboard-node"){alert("选中的节点无效");return}const at=((kt=Ge.settings)==null?void 0:kt.shots)||[];if(at.length===0){alert("选中的分镜节点没有镜头"),de(!1);return}const rt=((Ot=e.settings)==null?void 0:Ot.shots)||[];if(rt.length===0){const dn=at.map((Vt,Zt)=>({...Vt,id:E(),scene_index:Zt+1}));m(e.id,{settings:{...e.settings,shots:dn}}),de(!1),alert(`成功同步 ${at.length} 个镜头到当前分镜表`);return}const lt=rt.map((dn,Vt)=>{if(VtKn.image_urls&&Array.isArray(Kn.image_urls)&&Kn.image_urls.length>0?Kn.image_urls:Kn.image_url&&typeof Kn.image_url=="string"?[Kn.image_url]:[],jn=Sn(Zt),_n=Sn(dn),Cn=jn.length>0?jn:_n;return{...dn,prompt:Zt.prompt||Zt.description||dn.prompt||"",description:Zt.description||Zt.prompt||dn.description||"",description_zh:Zt.description_zh||Zt.description||dn.description_zh||"",description_en:Zt.description_en||Zt.prompt||dn.description_en||"",image_url:Cn[0]||"",image_urls:Cn,camera:Zt.camera||dn.camera||"",tags:Zt.tags||dn.tags||[],model:Zt.model||dn.model||"sora-2",ratio:Zt.ratio||dn.ratio||"16:9",duration:Zt.duration||dn.duration||"15s",resolution:Zt.resolution||dn.resolution||"1080P"}}else return dn});if(at.length>rt.length){const dn=at.slice(rt.length).map((Vt,Zt)=>({...Vt,id:E(),scene_index:rt.length+Zt+1}));lt.push(...dn)}m(e.id,{settings:{...e.settings,shots:lt}}),de(!1);const ot=Math.min(rt.length,at.length),At=Math.max(0,at.length-rt.length);At>0?alert(`成功同步 ${ot} 个现有镜头,并添加 ${At} 个新镜头`):alert(`成功同步 ${ot} 个现有镜头`)},[h,e,m,E]);_.useEffect(()=>{const Ue=q.current;if(!Ue)return;const Ge=rt=>{var ot;const lt=(ot=rt.dataTransfer)==null?void 0:ot.getData("application/json");if(lt)try{const At=JSON.parse(lt);if(At.type==="history-item"&&At.item){const kt=At.item;if(kt.type==="image"&&kt.url){rt.preventDefault(),rt.stopPropagation(),console.log("[StoryboardNode] 从历史记录拖拽图片到分镜表(原生事件):",kt);let dn=rt.target.closest("[data-shot-id]");if(dn){const Vt=dn.getAttribute("data-shot-id");if(console.log("[StoryboardNode] 拖拽到镜头上,shotId:",Vt),Vt&&a){const Zt=T.find(Sn=>Sn.id===Vt);if(Zt){const _n=[...Zt.image_urls||(Zt.image_url?[Zt.image_url]:[]),kt.url].slice(0,3);a(e.id,Vt,{image_urls:_n,image_url:_n[0]||""}),console.log("[StoryboardNode] 已添加图片到镜头:",Vt)}}}else{console.log("[StoryboardNode] 拖拽到空白区域,创建新镜头");const Vt={id:(E==null?void 0:E())||`shot-${Date.now()}`,scene_index:T.length+1,shot_type:"Medium Shot",camera_movement:"Static",description:kt.prompt||"从历史记录添加",image_url:kt.url,image_urls:[kt.url],video_url:"",status:"idle"},Zt=[...T,Vt];m&&m(e.id,{settings:{...e.settings,shots:Zt}})}}}}catch(At){console.error("[StoryboardNode] 原生事件处理失败:",At)}},at=rt=>{var ot;(((ot=rt.dataTransfer)==null?void 0:ot.types)||[]).includes("application/json")&&(rt.preventDefault(),rt.stopPropagation())};return Ue.addEventListener("drop",Ge,!0),Ue.addEventListener("dragover",at,!0),()=>{Ue.removeEventListener("drop",Ge,!0),Ue.removeEventListener("dragover",at,!0)}},[T,e,m,a,E]);const Tt=!!(Pe||Be||Je);return s.jsxs("div",{className:`flex h-full w-full rounded-xl overflow-hidden pointer-events-auto transition-colors storyboard-container ${t?"bg-[#18181b] border border-zinc-800":"bg-white border border-zinc-300 shadow-sm"}`,children:[s.jsxs("div",{ref:q,className:"flex flex-col h-full min-w-0 flex-1 rounded-xl overflow-hidden ",children:[s.jsxs("div",{className:`p-2 border-b flex items-center justify-between shrink-0 ${t?"border-zinc-800":"border-zinc-200"}`,children:[s.jsx("div",{className:"flex items-center gap-2",children:s.jsx("span",{className:`text-xs font-medium ${t?"text-zinc-300":"text-zinc-700"}`,children:"分镜表"})}),s.jsxs("div",{className:"flex items-center gap-2",children:[T.length>0&&s.jsxs("button",{type:"button",onClick:()=>se(!0),className:`px-2 py-1 rounded text-xs transition-colors flex items-center gap-1 border ${t?"bg-transparent border-white/30 text-white hover:bg-white/5":"bg-zinc-100 text-zinc-600 hover:bg-zinc-200 border-zinc-300"}`,onMouseDown:Ue=>Ue.stopPropagation(),title:"在所有镜头的画面描述/提示词前批量添加相同前缀",children:[s.jsx(Lv,{size:12}),"批量添加前缀"]}),T.some(Ue=>{var Ge;return Ue.status!=="generating"&&(((Ge=Ue.prompt)==null?void 0:Ge.trim())||Gt(Ue).length>0)})&&s.jsxs("button",{type:"button",onClick:qt,className:`px-2 py-1 rounded text-xs transition-colors flex items-center gap-1 border ${t?"bg-transparent border-white/30 text-white hover:bg-white/5":"bg-zinc-100 text-zinc-600 hover:bg-zinc-200 border-zinc-300"}`,onMouseDown:Ue=>Ue.stopPropagation(),title:"一键启动所有可生成镜头(有提示词或参考图且未在生成中的镜头)",children:[s.jsx(Ia,{size:12,fill:"currentColor"}),"一键生成"]}),T.length>0&&s.jsxs("button",{type:"button",onClick:()=>{const Ue=T[0]||{},Ge=Ue.model||"sora-2",at=Ue.ratio||"16:9",rt=Ue.duration||"15s",lt=Ue.resolution||"1080P";we(Ge);const ot=hl(Ge)?Lp:["16:9","9:16","1:1","4:3","3:4"],At=eu(Ge),kt=nu(Ge,lt);me(ot.includes(at)?at:ot[0]);const Ot=At.includes(lt)?lt:At[0];te(Ot),U(kt.includes(rt)?rt:kt[0]),ee(!0)},className:`px-2 py-1 rounded text-xs transition-colors flex items-center gap-1 border ${t?"bg-transparent border-white/30 text-white hover:bg-white/5":"bg-zinc-100 text-zinc-600 hover:bg-zinc-200 border-zinc-300"}`,onMouseDown:Ue=>Ue.stopPropagation(),title:"一键批量调整本分镜表中所有镜头的模型 / 比例 / 时长",children:[s.jsx(gq,{size:12}),"批量设置"]}),T.some(Ue=>Ue.video_url)&&s.jsxs("button",{onClick:()=>Pt(),disabled:Bt,className:`px-2 py-1 rounded text-xs transition-colors flex items-center gap-1 border ${Bt?t?"bg-zinc-800 text-zinc-500 border-zinc-700 cursor-not-allowed":"bg-zinc-200 text-zinc-400 border-zinc-300 cursor-not-allowed":t?"bg-transparent border-white/30 text-white hover:bg-white/5":"bg-zinc-100 text-zinc-600 hover:bg-zinc-200 border-zinc-300"}`,onMouseDown:Ue=>Ue.stopPropagation(),title:O?"批量下载选中的图片/视频(保存到指定目录)":"下载本分镜表所有已生成视频",children:[Bt?s.jsx(zr,{size:12,className:"animate-spin"}):s.jsx(mu,{size:12}),Bt?L!=null&&L.total?`下载中 ${L.current}/${L.total}`:"下载中...":"批量下载视频"]}),s.jsxs("div",{className:"flex gap-1",children:[s.jsxs("button",{onClick:()=>J("list"),className:`px-2 py-1 rounded text-xs transition-colors border ${H==="list"?t?"bg-transparent border-white/50 text-white":"bg-blue-600 text-white border-blue-600":t?"bg-transparent border-white/30 text-white hover:bg-white/5":"bg-zinc-100 text-zinc-600 hover:bg-zinc-200 border-zinc-300"}`,onMouseDown:Ue=>Ue.stopPropagation(),children:[s.jsx(ZG,{size:12,className:"inline mr-1"}),"列表"]}),s.jsxs("button",{onClick:()=>J("grid"),className:`px-2 py-1 rounded text-xs transition-colors border ${H==="grid"?t?"bg-transparent border-white/50 text-white":"bg-blue-600 text-white border-blue-600":t?"bg-transparent border-white/30 text-white hover:bg-white/5":"bg-zinc-100 text-zinc-600 hover:bg-zinc-200 border-zinc-300"}`,onMouseDown:Ue=>Ue.stopPropagation(),children:[s.jsx(Ii,{size:12,className:"inline mr-1"}),"宫格"]}),s.jsxs("button",{onClick:()=>J("table"),className:`px-2 py-1 rounded text-xs transition-colors border ${H==="table"?t?"bg-transparent border-white/50 text-white":"bg-blue-600 text-white border-blue-600":t?"bg-transparent border-white/30 text-white hover:bg-white/5":"bg-zinc-100 text-zinc-600 hover:bg-zinc-200 border-zinc-300"}`,onMouseDown:Ue=>Ue.stopPropagation(),children:[s.jsx(Pw,{size:12,className:"inline mr-1"}),"表格"]})]})]})]}),(fn||Dn||it)&&s.jsxs("div",{className:`p-2 border-b space-y-2 shrink-0 ${t?"border-white/30":"border-zinc-200"}`,children:[fn&&s.jsxs("div",{className:`p-2 rounded space-y-2 border ${t?"bg-transparent border-white/30":"bg-blue-50 border border-blue-200"}`,children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(Vo,{size:14,className:t?"text-white":"text-blue-600"}),s.jsx("span",{className:`text-xs ${t?"text-white":"text-blue-700"}`,children:"已连接文本节点"})]}),s.jsxs("button",{onClick:Lt,disabled:le,className:`px-3 py-1 rounded text-xs transition-colors flex items-center gap-1 border ${t?"bg-transparent border-white/30 hover:bg-white/5 text-white disabled:opacity-50 disabled:cursor-not-allowed":"bg-blue-600 hover:bg-blue-700 text-white border-blue-600 disabled:opacity-50 disabled:cursor-not-allowed"}`,onMouseDown:Ue=>Ue.stopPropagation(),children:[le&&s.jsx(zr,{size:12,className:"animate-spin"}),le?"生成中...":"从文本生成"]})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("label",{className:`text-[10px] ${t?"text-white":"text-blue-700"}`,children:"模型:"}),s.jsx("select",{value:qe,onChange:Ue=>tt(Ue.target.value),className:`storyboard-select flex-1 px-2 py-1 rounded text-xs border outline-none ${t?"bg-transparent border-white/30 text-white":"bg-white border-zinc-300 text-zinc-800"}`,onMouseDown:Ue=>Ue.stopPropagation(),children:n.filter(Ue=>Ue.type==="Chat").map(Ue=>s.jsx("option",{value:Ue.modelName||Ue.id,children:Ue.provider||Ue.id},Ue.id))})]})]}),Dn&&s.jsxs("div",{className:`flex items-center gap-2 p-2 rounded border ${t?"bg-transparent border-white/30":"bg-green-50 border border-green-200"}`,children:[s.jsxs("div",{className:"flex items-center gap-2 flex-1",children:[s.jsx(si,{size:14,className:t?"text-white":"text-green-600"}),s.jsx("span",{className:`text-xs ${t?"text-white":"text-green-700"}`,children:"已连接图片节点"})]}),s.jsxs("button",{onClick:_t,className:`px-2 py-1 rounded text-xs transition-colors flex items-center gap-1 border ${t?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-blue-600 hover:bg-blue-700 text-white border-blue-600"}`,onMouseDown:Ue=>Ue.stopPropagation(),title:"同步提示词节点",children:[s.jsx(Eh,{size:12}),"同步提示词"]}),s.jsxs("button",{onClick:gt,disabled:le,className:`px-3 py-1 rounded text-xs transition-colors flex items-center gap-1 border ${t?"bg-transparent border-white/30 hover:bg-white/5 text-white disabled:opacity-50 disabled:cursor-not-allowed":"bg-green-600 hover:bg-green-700 text-white border-green-600 disabled:opacity-50 disabled:cursor-not-allowed"}`,onMouseDown:Ue=>Ue.stopPropagation(),children:[le&&s.jsx(zr,{size:12,className:"animate-spin"}),le?"拆解中...":"拆解为分镜"]})]}),it&&s.jsxs("div",{className:`flex items-center justify-between p-2 rounded border ${t?"bg-transparent border-white/30":"bg-purple-50 border border-purple-200"}`,children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(aa,{size:14,className:t?"text-white":"text-purple-600"}),s.jsx("span",{className:`text-xs ${t?"text-white":"text-purple-700"}`,children:"已连接视频分析节点"})]}),s.jsx("button",{onClick:Jt,className:`px-3 py-1 rounded text-xs transition-colors border ${t?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-purple-600 hover:bg-purple-700 text-white border-purple-600"}`,onMouseDown:Ue=>Ue.stopPropagation(),children:"导入分析结果"})]})]}),(fn||Dn)&&s.jsxs("div",{className:`p-3 border-b shrink-0 space-y-3 ${t?"border-white/30 bg-zinc-900/30":"border-zinc-200 bg-zinc-50"}`,children:[s.jsxs("div",{className:"space-y-2",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(Ii,{size:14,className:t?"text-white":"text-zinc-600"}),s.jsx("span",{className:`text-xs font-medium ${t?"text-white":"text-zinc-700"}`,children:"宫格布局"})]}),s.jsx("div",{className:`flex items-center gap-1.5 p-1 rounded-lg border ${t?"bg-transparent border-white/30":"bg-zinc-100 border-zinc-300"}`,children:["original","3x3","4x4","5x5","custom"].map(Ue=>s.jsxs("button",{onClick:()=>ct(Ue),className:`flex-1 px-2 py-1.5 rounded text-xs transition-all border relative ${Ye===Ue?t?"bg-white/10 border-white/70 text-white font-semibold shadow-lg shadow-white/20 ring-2 ring-white/30":"bg-white text-black shadow-md font-semibold border-blue-500 ring-2 ring-blue-200":t?"bg-transparent border-white/30 text-white hover:bg-white/5 hover:border-white/40":"bg-transparent text-zinc-600 hover:text-zinc-700 border-transparent hover:bg-zinc-50"}`,onMouseDown:Ge=>Ge.stopPropagation(),children:[Ue==="original"?"原":Ue==="custom"?"自定义":Ue.toUpperCase(),Ye===Ue&&s.jsx("span",{className:`absolute -top-1 -right-1 w-2 h-2 rounded-full ${t?"bg-white":"bg-blue-500"}`})]},Ue))}),Ye==="custom"&&s.jsxs("div",{className:`flex items-center justify-between px-3 py-2 rounded-lg border ${t?"bg-transparent border-white/30":"bg-zinc-100 border border-zinc-300"}`,children:[s.jsx("div",{className:"flex items-center gap-2",children:s.jsx("span",{className:`text-[10px] font-medium ${t?"text-white":"text-zinc-600"}`,children:"# 镜头总数"})}),s.jsx("input",{type:"number",min:"1",max:"100",value:pt,onChange:Ue=>ht(parseInt(Ue.target.value)||10),className:`w-20 px-2 py-1 rounded text-xs border text-center font-medium ${t?"bg-transparent border-white/30 text-white focus:ring-2 focus:ring-white/30":"bg-white border-zinc-300 text-zinc-800 focus:ring-2 focus:ring-blue-500"}`,onMouseDown:Ue=>Ue.stopPropagation()})]})]}),T.length>0&&s.jsxs("div",{className:`flex items-center justify-between px-3 py-2 rounded-lg border ${t?"bg-transparent border-white/30":"bg-zinc-100 border-zinc-300"}`,children:[s.jsx("span",{className:`text-xs ${t?"text-white":"text-zinc-600"}`,children:"# 镜头总数"}),s.jsx("span",{className:`text-xs font-medium px-2.5 py-1 rounded border ${t?"bg-transparent border-white/30 text-white":"bg-zinc-200 text-zinc-700 border-zinc-300"}`,children:T.length})]})]}),jt&&(()=>{const Ue=({text:Ge,isDark:at})=>{const[rt,lt]=_.useState(!1),ot=async()=>{try{await navigator.clipboard.writeText(Ge),lt(!0),setTimeout(()=>lt(!1),2e3)}catch(At){console.error("复制失败:",At)}};return s.jsx("button",{onClick:ot,className:`p-1.5 rounded transition-colors ${at?"text-white/60 hover:text-white hover:bg-white/5 border border-white/30 hover:border-white/50":"text-zinc-600 hover:text-green-600 hover:bg-green-100"}`,onMouseDown:At=>At.stopPropagation(),title:rt?"已复制":"复制JSON",children:rt?s.jsx(Eo,{size:14}):s.jsx(Eh,{size:14})})};return s.jsxs("div",{className:`p-2 border-b shrink-0 ${t?"border-white/30 bg-transparent":"border-zinc-200 bg-zinc-50"}`,children:[s.jsxs("button",{onClick:()=>$t(!wt),className:`w-full flex items-center justify-between px-3 py-2 rounded-lg transition-colors border ${t?"bg-transparent hover:bg-white/5 text-white border-white/30 hover:border-white/50":"bg-zinc-100 hover:bg-zinc-200 text-zinc-700 border-transparent"}`,onMouseDown:Ge=>Ge.stopPropagation(),children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(Mv,{size:14,className:t?"text-white/60":"text-blue-600"}),s.jsx("span",{className:"text-xs font-medium",children:"JSON Code"})]}),s.jsx("div",{className:"flex items-center gap-2",children:wt?s.jsx(Qr,{size:12,className:t?"text-white/60":"text-zinc-600"}):s.jsx(Ii,{size:12,className:t?"text-white/60":"text-zinc-600"})})]}),wt&&s.jsxs("div",{className:`mt-2 rounded-lg border overflow-hidden ${t?"bg-transparent border-white/30":"bg-white border-zinc-300"}`,children:[s.jsxs("div",{className:`flex items-center justify-between px-3 py-2 border-b ${t?"border-white/30 bg-transparent":"border-zinc-200 bg-zinc-50"}`,children:[s.jsx("span",{className:`text-xs font-medium ${t?"text-white/80":"text-zinc-700"}`,children:"JSON数据"}),s.jsx(Ue,{text:jt,isDark:t})]}),s.jsx("pre",{className:`p-3 text-xs overflow-auto max-h-64 minimal-scrollbar ${t?"text-white/70":"text-zinc-800"}`,children:s.jsx("code",{children:jt})})]})]})})(),H==="list"?s.jsx("div",{className:"flex-1 overflow-y-auto minimal-scrollbar p-3 space-y-3 min-h-0 bg-opacity-50",onWheel:Ue=>Ue.stopPropagation(),children:T.length>0?s.jsx(s.Fragment,{children:T.map((Ue,Ge)=>s.jsxs("div",{className:"group/item",children:[s.jsx(nce,{shot:Ue,idx:Ge,nodeId:e.id,node:e,isDark:t,apiConfigs:n,updateShot:a,updateNode:m,generateSingleShot:o,deleteShot:l,nodes:h,characterLibrary:I,klingSubjectLibrary:R,setKlingSubjectsOpen:A,onOpenKlingSubject:()=>Te(Ue.id),onOpenKlingVideo:()=>He(Ue.id),onOpenKlingImage:()=>Me(Ue.id),wan26AudioShotId:Re,onWan26AudioFileSelected:at=>{Xe(at),Ve(Ue.id),je(!0)},showWan26AudioSegmentSelector:Ze&&Re===Ue.id,pendingWan26AudioFile:Re===Ue.id?Le:null,onWan26AudioSegmentConfirm:(at,rt)=>{Re&&a(e.id,Re,{wan26AudioConfig:"upload",wan26AudioFile:at,wan26AudioSegment:rt}),je(!1),Xe(null),Ve(null)},onCloseWan26AudioSegment:()=>{je(!1),Xe(null),Ve(null)},generateSequenceFromShot:v,handleOpenGenerateSequenceModal:st,onSendShotToGenVideo:De,filterJimengModels:X,setLightboxItem:u,setLightboxOpen:d}),s.jsx("div",{className:"relative -mt-1",onMouseDown:at=>at.stopPropagation(),children:s.jsxs("button",{onClick:()=>c(e.id,Ge),className:`w-full py-1.5 rounded-lg border-2 border-dashed text-xs flex items-center justify-center gap-1 transition-all opacity-0 group-hover/item:opacity-100 ${t?"bg-transparent border-white/30 text-white hover:bg-white/5 hover:border-white/50":"border-zinc-300 text-zinc-500 hover:border-zinc-400 hover:text-zinc-600 hover:bg-zinc-50"}`,onMouseDown:at=>at.stopPropagation(),title:"在此处插入空白镜头",children:[s.jsx(Xi,{size:12}),s.jsx("span",{children:"插入空白镜头"})]})})]},Ue.id))}):s.jsxs("div",{className:`flex-1 rounded-lg border-2 border-dashed flex flex-col items-center justify-center py-8 ${t?"border-zinc-700":"border-zinc-300"}`,children:[s.jsx(gu,{size:32,className:`mb-2 ${t?"text-zinc-600":"text-zinc-400"}`}),s.jsx("span",{className:`text-xs ${t?"text-zinc-500":"text-zinc-400"}`,children:"暂无分镜,请添加或同步分析结果"})]})}):H==="grid"?s.jsx(tce,{shots:T,isDark:t,onShotClick:nt,node:e,apiConfigs:n,globalApiKey:b,setNodes:z,generateId:E}):s.jsx("div",{className:"flex-1 min-h-0 flex flex-col",children:s.jsx(rce,{shots:T,isDark:t,updateShot:a,deleteShot:l,nodeId:e.id,selectedShots:Z,setSelectedShots:B,onBatchDelete:()=>N(!0),onBatchDownload:()=>Pt(Z),isBatchDownloading:Bt})}),s.jsx("div",{className:`p-3 border-t shrink-0 ${t?"border-zinc-800":"border-zinc-200"}`,children:s.jsxs("button",{onClick:()=>c(e.id),className:`w-full py-2 rounded-lg border-2 border-dashed text-xs flex items-center justify-center gap-1 transition-colors ${t?"bg-transparent border-white/30 text-white hover:bg-white/5 hover:border-white/50":"border-zinc-300 text-zinc-500 hover:border-zinc-400 hover:text-zinc-600"}`,onMouseDown:Ue=>Ue.stopPropagation(),children:[s.jsx(Xi,{size:14}),"添加空白镜头"]})}),s.jsx(jp,{isOpen:be,onClose:()=>de(!1),title:"同步提示词节点",theme:t?"dark":"light",children:s.jsxs("div",{className:`p-5 space-y-4 ${t?"text-zinc-200":"text-zinc-800"}`,children:[s.jsx("p",{className:`text-sm ${t?"text-zinc-400":"text-zinc-600"}`,children:"请选择要同步的分镜节点:"}),s.jsx("div",{className:"space-y-2 max-h-[400px] overflow-y-auto minimal-scrollbar",children:h.filter(Ue=>Ue.type==="storyboard-node"&&Ue.id!==e.id).map(Ue=>{var lt;const at=(ot=>{var At;return ot.nodeName||((At=ot.settings)==null?void 0:At.projectTitle)||`分镜节点 ${ot.id.slice(0,8)}`})(Ue),rt=(((lt=Ue.settings)==null?void 0:lt.shots)||[]).length;return s.jsx("button",{onClick:()=>xt(Ue.id),className:`w-full p-3 rounded-lg border text-left transition-colors ${t?"border-zinc-700 bg-zinc-800/50 hover:bg-zinc-700 hover:border-zinc-600":"border-zinc-300 bg-zinc-50 hover:bg-zinc-100 hover:border-zinc-400"}`,children:s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsx("span",{className:`font-medium ${t?"text-zinc-200":"text-zinc-800"}`,children:at}),s.jsxs("span",{className:"text-xs text-zinc-500",children:[rt," 个镜头"]})]})},Ue.id)})})]})}),s.jsx(jp,{isOpen:Y,onClose:()=>{se(!1),oe("")},title:"批量添加提示词前缀",theme:t?"dark":"light",children:s.jsxs("div",{className:`p-5 space-y-4 ${t?"text-zinc-200":"text-zinc-800"}`,children:[s.jsx("p",{className:`text-sm ${t?"text-zinc-400":"text-zinc-600"}`,children:"将在当前分镜表所有镜头的「画面描述」/ 提示词内容前添加相同前缀,已有内容会保留并接在后边。"}),s.jsxs("div",{children:[s.jsx("label",{className:`block text-sm font-medium mb-2 ${t?"text-zinc-300":"text-zinc-700"}`,children:"前缀内容"}),s.jsx("textarea",{value:ie,onChange:Ue=>oe(Ue.target.value),placeholder:"例如:国风风格,",rows:3,className:`w-full px-3 py-2 rounded-lg border outline-none resize-none ${t?"bg-zinc-800 border-zinc-700 text-zinc-200 placeholder:text-zinc-500":"bg-white border-zinc-300 text-zinc-800 placeholder:text-zinc-400"}`,onMouseDown:Ue=>Ue.stopPropagation()})]}),s.jsxs("div",{className:"flex gap-3 pt-2",children:[s.jsxs("button",{onClick:zt,disabled:!ie.trim(),className:`flex-1 px-4 py-2 rounded-lg font-medium transition-colors ${ie.trim()?t?"bg-zinc-800 hover:bg-zinc-700 text-zinc-200":"bg-black hover:bg-zinc-900 text-white":t?"bg-zinc-700 text-zinc-500 cursor-not-allowed":"bg-zinc-200 text-zinc-400 cursor-not-allowed"}`,onMouseDown:Ue=>Ue.stopPropagation(),children:["确定(共 ",T.length," 个镜头)"]}),s.jsx("button",{onClick:()=>{se(!1),oe("")},className:`px-4 py-2 rounded-lg font-medium transition-colors ${t?"bg-zinc-800 hover:bg-zinc-700 text-zinc-300":"bg-zinc-100 hover:bg-zinc-200 text-zinc-700"}`,onMouseDown:Ue=>Ue.stopPropagation(),children:"取消"})]})]})}),s.jsx(jp,{isOpen:re,onClose:()=>ee(!1),title:"批量设置模型 / 比例 / 时长",theme:t?"dark":"light",children:s.jsxs("div",{className:`p-5 space-y-4 ${t?"text-zinc-200":"text-zinc-800"}`,children:[s.jsx("p",{className:`text-sm ${t?"text-zinc-400":"text-zinc-600"}`,children:"该操作会将当前分镜表中所有镜头的模型、画面比例和时长统一为下面选择的配置(已有镜头会被覆盖)。"}),s.jsxs("div",{className:"space-y-3",children:[s.jsxs("div",{children:[s.jsx("label",{className:`block text-sm font-medium mb-1 ${t?"text-zinc-300":"text-zinc-700"}`,children:"模型"}),s.jsx("select",{value:pe,onChange:Ue=>{const Ge=Ue.target.value;we(Ge);const at=eu(Ge),rt=at.includes(G)?G:at[0];te(rt);const lt=nu(Ge,rt);U(lt.includes(ue)?ue:lt[0]);const ot=hl(Ge)?Lp:["16:9","9:16","1:1","4:3","3:4"];me(ot.includes(Q)?Q:ot[0])},className:`w-full px-3 py-2 rounded-lg border outline-none text-sm ${t?"bg-zinc-800 border-zinc-700 text-zinc-100":"bg-white border-zinc-300 text-zinc-800"}`,onMouseDown:Ue=>Ue.stopPropagation(),children:(X?X(n.filter(Ue=>Ue.type==="Video")):n.filter(Ue=>Ue.type==="Video")).map(Ue=>{var Ge,at,rt;return s.jsx("option",{value:Ue.id,children:(Ue.provider||Ue.modelName||Ue.id)+(((Ge=Ue.provider)!=null&&Ge.startsWith("Seedream")||(at=Ue.provider)!=null&&at.startsWith("Seedance"))&&!((rt=Ue.provider)!=null&&rt.includes("API"))?" Official":"")},Ue.id)})})]}),s.jsxs("div",{className:"flex gap-3",children:[s.jsxs("div",{className:"flex-1",children:[s.jsx("label",{className:`block text-sm font-medium mb-1 ${t?"text-zinc-300":"text-zinc-700"}`,children:"比例"}),s.jsx("select",{value:Q,onChange:Ue=>me(Ue.target.value),className:`w-full px-3 py-2 rounded-lg border outline-none text-sm ${t?"bg-zinc-800 border-zinc-700 text-zinc-100":"bg-white border-zinc-300 text-zinc-800"}`,onMouseDown:Ue=>Ue.stopPropagation(),children:Tn.map(Ue=>s.jsx("option",{value:Ue,children:Ue},Ue))})]}),s.jsxs("div",{className:"flex-1",children:[s.jsx("label",{className:`block text-sm font-medium mb-1 ${t?"text-zinc-300":"text-zinc-700"}`,children:"时长"}),s.jsx("select",{value:ue,onChange:Ue=>U(Ue.target.value),className:`w-full px-3 py-2 rounded-lg border outline-none text-sm ${t?"bg-zinc-800 border-zinc-700 text-zinc-100":"bg-white border-zinc-300 text-zinc-800"}`,onMouseDown:Ue=>Ue.stopPropagation(),children:Yt.map(Ue=>s.jsx("option",{value:Ue,children:Ue.replace("s","秒")},Ue))})]})]}),un.length>0&&s.jsxs("div",{children:[s.jsx("label",{className:`block text-sm font-medium mb-1 ${t?"text-zinc-300":"text-zinc-700"}`,children:"分辨率"}),s.jsx("select",{value:G,onChange:Ue=>{const Ge=Ue.target.value;if(te(Ge),pe){const at=nu(pe,Ge);U(at.includes(ue)?ue:at[0])}},className:`w-full px-3 py-2 rounded-lg border outline-none text-sm ${t?"bg-zinc-800 border-zinc-700 text-zinc-100":"bg-white border-zinc-300 text-zinc-800"}`,onMouseDown:Ue=>Ue.stopPropagation(),children:un.map(Ue=>s.jsx("option",{value:Ue,children:Ue},Ue))})]})]}),s.jsxs("div",{className:"flex gap-3 pt-2",children:[s.jsxs("button",{onClick:Ht,disabled:!pe||!Q||!ue||un.length>0&&!G,className:`flex-1 px-4 py-2 rounded-lg font-medium transition-colors ${!pe||!Q||!ue?t?"bg-zinc-700 text-zinc-500 cursor-not-allowed":"bg-zinc-200 text-zinc-400 cursor-not-allowed":t?"bg-zinc-800 hover:bg-zinc-700 text-zinc-200":"bg-black hover:bg-zinc-900 text-white"}`,onMouseDown:Ue=>Ue.stopPropagation(),children:["确定(共 ",T.length," 个镜头)"]}),s.jsx("button",{onClick:()=>ee(!1),className:`px-4 py-2 rounded-lg font-medium transition-colors ${t?"bg-zinc-800 hover:bg-zinc-700 text-zinc-300":"bg-zinc-100 hover:bg-zinc-200 text-zinc-700"}`,onMouseDown:Ue=>Ue.stopPropagation(),children:"取消"})]})]})}),s.jsx(jp,{isOpen:$e,onClose:()=>{ze(!1),Ee(null)},title:"生成分镜序列",theme:t?"dark":"light",children:s.jsxs("div",{className:`p-5 space-y-4 ${t?"text-zinc-200":"text-zinc-800"}`,children:[s.jsxs("div",{children:[s.jsx("label",{className:`block text-sm font-medium mb-2 ${t?"text-zinc-300":"text-zinc-700"}`,children:"Chat对话大模型"}),s.jsx("select",{value:Ce,onChange:Ue=>xe(Ue.target.value),className:`w-full px-3 py-2 rounded-lg border outline-none ${t?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,children:n.filter(Ue=>Ue.type==="Chat").map(Ue=>s.jsxs("option",{value:Ue.modelName||Ue.id,children:[Ue.provider||Ue.id," - ",Ue.modelName||Ue.id]},Ue.id))})]}),s.jsxs("div",{children:[s.jsx("label",{className:`block text-sm font-medium mb-2 ${t?"text-zinc-300":"text-zinc-700"}`,children:"生成镜头数量"}),s.jsx("input",{type:"number",min:"1",max:"20",value:Ne,onChange:Ue=>ve(parseInt(Ue.target.value)||4),className:`w-full px-3 py-2 rounded-lg border outline-none ${t?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`})]}),s.jsxs("div",{className:"flex gap-3 pt-2",children:[s.jsx("button",{onClick:Ae,disabled:ke||!Ce,className:`flex-1 px-4 py-2 rounded-lg font-medium transition-colors ${ke||!Ce?"bg-zinc-600 text-zinc-400 cursor-not-allowed":t?"bg-zinc-800 hover:bg-zinc-700 text-zinc-200":"bg-blue-600 hover:bg-blue-700 text-white"}`,children:ke?s.jsxs("span",{className:"flex items-center justify-center gap-2",children:[s.jsx(zr,{size:16,className:"animate-spin"}),"生成中..."]}):"确定"}),s.jsx("button",{onClick:()=>{ze(!1),Ee(null)},className:`px-4 py-2 rounded-lg font-medium transition-colors ${t?"bg-zinc-800 hover:bg-zinc-700 text-zinc-300":"bg-zinc-100 hover:bg-zinc-200 text-zinc-700"}`,children:"取消"})]})]})}),s.jsx(jp,{isOpen:V,onClose:()=>{N(!1),k({from:"",to:""})},title:"批量删除",theme:t?"dark":"light",children:s.jsxs("div",{className:`p-5 space-y-4 ${t?"text-zinc-200":"text-zinc-800"}`,children:[s.jsxs("div",{children:[s.jsx("label",{className:`block text-sm font-medium mb-2 ${t?"text-zinc-300":"text-zinc-700"}`,children:"删除范围"}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("input",{type:"number",min:"1",max:T.length,value:j.from,onChange:Ue=>k({...j,from:Ue.target.value}),placeholder:"起始镜号",className:`flex-1 px-3 py-2 rounded-lg border outline-none ${t?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`}),s.jsx("span",{className:t?"text-zinc-400":"text-zinc-600",children:"到"}),s.jsx("input",{type:"number",min:"1",max:T.length,value:j.to,onChange:Ue=>k({...j,to:Ue.target.value}),placeholder:"结束镜号",className:`flex-1 px-3 py-2 rounded-lg border outline-none ${t?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`})]})]}),s.jsxs("div",{className:"flex gap-3 pt-2",children:[s.jsx("button",{onClick:()=>Wt(j.from&&j.to?j:void 0),disabled:!j.from||!j.to,className:`flex-1 px-4 py-2 rounded-lg font-medium transition-colors ${!j.from||!j.to?"bg-zinc-600 text-zinc-400 cursor-not-allowed":"bg-red-600 hover:bg-red-700 text-white"}`,children:"确认删除"}),s.jsx("button",{onClick:()=>{N(!1),k({from:"",to:""})},className:`px-4 py-2 rounded-lg font-medium transition-colors ${t?"bg-zinc-800 hover:bg-zinc-700 text-zinc-300":"bg-zinc-100 hover:bg-zinc-200 text-zinc-700"}`,children:"取消"})]})]})}),Ze&&Le&&Re&&(()=>{const Ue=(Ge,at)=>{a(e.id,Re,{wan26AudioConfig:"upload",wan26AudioFile:Le,wan26AudioSegment:{startTime:Ge,endTime:at}}),je(!1),Xe(null),Ve(null)};return s.jsx(i9,{audioFile:Le,isOpen:!0,onClose:()=>{je(!1),Xe(null),Ve(null)},onConfirm:Ue,isDark:!!t,minDuration:3,maxDuration:15})})()]}),Tt&&s.jsxs("div",{className:`shrink-0 w-[480px] pl-4 flex flex-col border-l overflow-y-auto minimal-scrollbar ${t?"border-white/30 bg-zinc-900/30":"border-zinc-200 bg-zinc-50"}`,onMouseDown:Ue=>Ue.stopPropagation(),children:[Pe&&(()=>{const Ue=T.find(Ge=>Ge.id===Pe);return Ue?R&&R.length>0&&A?s.jsx(s9,{isOpen:!0,isDark:!!t,klingSubjectLibrary:R,selectedSubjects:Ue.klingSubjects||[],onClose:()=>Te(null),onConfirm:Ge=>{a(e.id,Pe,{klingSubjects:Ge}),Te(null)},onCreateSubject:()=>{Te(null),A(!0)},attachMode:"inline"}):s.jsxs("div",{className:`p-4 rounded border ${t?"bg-transparent border-white/30":"bg-zinc-50 border-zinc-200"}`,children:[s.jsx("div",{className:`text-sm mb-2 ${t?"text-white":"text-zinc-700"}`,children:"可灵主体选择"}),s.jsx("div",{className:`text-xs ${t?"text-zinc-400":"text-zinc-500"}`,children:"当前没有可用的主体库,请先创建主体。"}),A&&s.jsx("button",{onClick:()=>{Te(null),A(!0)},className:`mt-3 px-3 py-1.5 rounded text-xs border transition-colors ${t?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-blue-600 hover:bg-blue-700 text-white border-blue-600"}`,children:"创建主体"})]}):null})(),Be&&(()=>{const Ue=T.find(lt=>lt.id===Be);if(!Ue)return null;const Ge=n.find(lt=>lt.id===Ue.model),at=(Ge==null?void 0:Ge.key)||b,rt=((Ge==null?void 0:Ge.url)||"https://ai.comfly.chat").replace(/\/+$/,"");return s.jsx(j4,{isOpen:!0,onClose:()=>He(null),onConfirm:(lt,ot,At,kt,Ot,dn)=>{a(e.id,Be,{klingVideoFile:lt,klingVideoSegment:{startTime:ot,endTime:At},klingVideoUrl:kt,klingVideoReferType:Ot||"base",klingVideoKeepSound:dn||"yes"}),He(null)},isDark:!!t,maxDuration:10,currentVideoFile:Ue.klingVideoFile||null,apiKey:at,baseUrl:rt,attachMode:"inline"})})(),Je&&(()=>{const Ue=T.find(lt=>lt.id===Je);if(!Ue)return null;const Ge=n.find(lt=>lt.id===Ue.model),at=(Ge==null?void 0:Ge.key)||b||"",rt=((Ge==null?void 0:Ge.url)||"https://ai.comfly.chat").replace(/\/+$/,"");return s.jsx(f7,{isOpen:!0,isDark:!!t,currentImages:Ue.klingImages||[],onClose:()=>Me(null),onConfirm:lt=>{a(e.id,Je,{klingImages:lt}),Me(null)},apiKey:at,baseUrl:rt,attachMode:"inline"})})()]})]})},ece=({shot:e,idx:t,nodeId:n,node:r,isDark:i,apiConfigs:a,updateShot:o,updateNode:l,generateSingleShot:c,deleteShot:u,nodes:d=[],characterLibrary:h=[],klingSubjectLibrary:p=[],setKlingSubjectsOpen:f,onOpenKlingSubject:b,onOpenKlingVideo:g,onOpenKlingImage:y,wan26AudioShotId:w,onWan26AudioFileSelected:v,showWan26AudioSegmentSelector:m,pendingWan26AudioFile:z,onWan26AudioSegmentConfirm:C,onCloseWan26AudioSegment:E,generateSequenceFromShot:I,handleOpenGenerateSequenceModal:R,onSendShotToGenVideo:A,filterJimengModels:O,setLightboxItem:F,setLightboxOpen:L})=>{var ue;const[X,T]=_.useState(!1),[q,H]=_.useState(!1),J=_.useRef(null),Z=e.model||"sora-2",B=e.resolution||"1080P",V=e.duration||"15s",N=_.useMemo(()=>hl(Z)?Lp:["16:9","9:16","1:1","4:3","3:4"],[Z]),j=_.useMemo(()=>nu(Z,B),[Z,B]),k=_.useMemo(()=>eu(Z),[Z]),W=_.useMemo(()=>hl(Z),[Z]),M=_.useMemo(()=>Qd(Z),[Z]),Y=_.useMemo(()=>dl(Z),[Z]),se=_.useMemo(()=>No(Z),[Z]),ie=_.useMemo(()=>fu(Z),[Z]),oe=_.useMemo(()=>au(Z),[Z]),re=_.useMemo(()=>Kd(Z),[Z]),ee=_.useCallback(U=>U.image_urls&&Array.isArray(U.image_urls)&&U.image_urls.length>0?U.image_urls:U.image_url&&typeof U.image_url=="string"?[U.image_url]:[],[]),pe=U=>{const G=U.target.files;if(!G||G.length===0)return;const te=Array.from(G);let ge=0;const ne=[];te.forEach(le=>{if(le.type.startsWith("image/")){const fe=new FileReader;fe.onload=be=>{var de;if((de=be.target)!=null&&de.result&&(ne.push(be.target.result),ge++,ge===te.filter($e=>$e.type.startsWith("image/")).length)){const _e=[...ee(e),...ne].slice(0,3);o(n,e.id,{image_urls:_e,image_url:_e[0]||""})}},fe.readAsDataURL(le)}})},we=U=>{const G=U.clipboardData.items,te=[];for(let ge=0;ge0){const ge=ee(e);let ne=0;const le=[];te.forEach(fe=>{const be=new FileReader;be.onload=de=>{var $e;if(($e=de.target)!=null&&$e.result&&(le.push(de.target.result),ne++,ne===te.length)){const _e=[...ge,...le].slice(0,3);o(n,e.id,{image_urls:_e,image_url:_e[0]||""})}},be.readAsDataURL(fe)})}},Q=(U,G)=>{U.preventDefault(),U.stopPropagation();const te=U.dataTransfer.getData("application/json");if(te)try{const ge=JSON.parse(te);if(ge.type==="history-item"&&ge.item){const ne=ge.item;if(ne.type==="image"&&ne.url){console.log(`[StoryboardNode] 从历史记录拖拽图片到${G}:`,ne),o(n,e.id,{[G]:ne.url});return}}}catch(ge){console.error(`[StoryboardNode] 解析历史记录拖拽数据失败(${G}):`,ge)}if(U.dataTransfer.files&&U.dataTransfer.files.length>0){const ge=U.dataTransfer.files[0];if(ge.type.startsWith("image/")){const ne=new FileReader;ne.onload=le=>{var fe;return o(n,e.id,{[G]:(fe=le.target)==null?void 0:fe.result})},ne.readAsDataURL(ge)}}},me=U=>{U.preventDefault(),U.stopPropagation();const G=U.dataTransfer.getData("application/json");if(G)try{const te=JSON.parse(G);if(te.type==="history-item"&&te.item){const ge=te.item;if(ge.type==="image"&&ge.url){console.log("[StoryboardNode] 从历史记录拖拽图片到镜头:",ge);const fe=[...ee(e),ge.url].slice(0,3);o(n,e.id,{image_urls:fe,image_url:fe[0]||""});return}}}catch(te){console.error("[StoryboardNode] 解析历史记录拖拽数据失败:",te)}if(U.dataTransfer.files&&U.dataTransfer.files.length>0){const te=Array.from(U.dataTransfer.files).filter(fe=>fe.type.startsWith("image/"));if(te.length===0)return;const ge=ee(e);let ne=0;const le=[];te.forEach(fe=>{const be=new FileReader;be.onload=de=>{var $e;if(($e=de.target)!=null&&$e.result&&(le.push(de.target.result),ne++,ne===te.length)){const _e=[...ge,...le].slice(0,3);o(n,e.id,{image_urls:_e,image_url:_e[0]||""})}},be.readAsDataURL(fe)})}};return s.jsxs("div",{"data-shot-id":e.id,tabIndex:0,onPaste:we,className:`flex gap-3 p-3 rounded-lg border transition-all group/shot cursor-pointer outline-none focus:ring-2 focus:ring-blue-500/50 ${i?"bg-zinc-900/50 border-zinc-800 hover:border-zinc-600":"bg-white border-zinc-200 hover:border-blue-300 hover:shadow-md"}`,onClick:U=>{U.currentTarget.focus()},children:[s.jsxs("div",{className:`font-mono text-sm w-6 shrink-0 flex items-start pt-1 font-bold relative ${i?"text-zinc-600":"text-zinc-400"}`,children:[t+1,(e.status==="generating"||e.generatingProgress>0)&&s.jsx("div",{className:"absolute -left-1 top-0 bottom-0 w-1 bg-blue-500 rounded-full animate-pulse",style:{height:`${e.generatingProgress||0}%`,transition:"height 0.3s ease"}})]}),s.jsx("div",{className:`min-w-[240px] w-64 shrink-0 transition-colors ${re&&e.enableFrames?"space-y-2":""}`,onClick:U=>U.stopPropagation(),children:re&&e.enableFrames?s.jsxs(s.Fragment,{children:[s.jsxs("div",{className:`w-full aspect-video rounded border relative group overflow-hidden transition-colors ${i?"bg-black border-zinc-800":"bg-zinc-100 border-zinc-300"}`,onDrop:U=>Q(U,"startFrame"),onDragOver:U=>U.preventDefault(),children:[e.startFrame?s.jsxs(s.Fragment,{children:[s.jsx("img",{src:e.startFrame,className:"w-full h-full object-cover",alt:"首帧"}),s.jsx("button",{onClick:U=>{U.stopPropagation(),o(n,e.id,{startFrame:""})},className:`absolute top-1 right-1 p-1 rounded opacity-0 group-hover:opacity-100 transition-opacity ${i?"bg-black/60 hover:bg-red-600 text-white":"bg-white/80 hover:bg-red-500 text-zinc-600 hover:text-white"}`,title:"清除首帧",children:s.jsx(Qr,{size:10})}),s.jsx("div",{className:`absolute bottom-0 left-0 right-0 px-1 py-0.5 text-[8px] text-center ${i?"bg-emerald-900/80 text-emerald-300":"bg-emerald-500/80 text-white"}`,children:"首帧"})]}):s.jsxs("div",{className:`w-full h-full flex flex-col items-center justify-center text-[10px] gap-1 ${i?"text-zinc-700":"text-zinc-400"}`,children:[s.jsx(si,{size:14}),s.jsx("span",{children:"首帧"})]}),!e.startFrame&&s.jsxs("label",{className:"absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 flex items-center justify-center text-white text-xs transition-opacity cursor-pointer",onClick:U=>U.stopPropagation(),onMouseDown:U=>U.stopPropagation(),children:[s.jsxs("span",{className:"flex flex-col items-center gap-1 pointer-events-none",children:[s.jsx(Ll,{size:14}),"选择首帧"]}),s.jsx("input",{type:"file",className:"hidden",accept:"image/*,.jpg,.jpeg,.png,.gif,.webp,.bmp,.svg",onChange:U=>{var te;const G=(te=U.target.files)==null?void 0:te[0];if(G){const ge=new FileReader;ge.onload=ne=>{var le;return o(n,e.id,{startFrame:(le=ne.target)==null?void 0:le.result})},ge.readAsDataURL(G)}},onClick:U=>U.stopPropagation()})]})]}),s.jsxs("div",{className:`w-full aspect-video rounded border relative group overflow-hidden transition-colors ${i?"bg-black border-zinc-800":"bg-zinc-100 border-zinc-300"}`,onDrop:U=>Q(U,"endFrame"),onDragOver:U=>U.preventDefault(),children:[e.endFrame?s.jsxs(s.Fragment,{children:[s.jsx("img",{src:e.endFrame,className:"w-full h-full object-cover",alt:"尾帧"}),s.jsx("button",{onClick:U=>{U.stopPropagation(),o(n,e.id,{endFrame:""})},className:`absolute top-1 right-1 p-1 rounded opacity-0 group-hover:opacity-100 transition-opacity ${i?"bg-black/60 hover:bg-red-600 text-white":"bg-white/80 hover:bg-red-500 text-zinc-600 hover:text-white"}`,title:"清除尾帧",children:s.jsx(Qr,{size:10})}),s.jsx("div",{className:`absolute bottom-0 left-0 right-0 px-1 py-0.5 text-[8px] text-center ${i?"bg-emerald-900/80 text-emerald-300":"bg-emerald-500/80 text-white"}`,children:"尾帧"})]}):s.jsxs("div",{className:`w-full h-full flex flex-col items-center justify-center text-[10px] gap-1 ${i?"text-zinc-700":"text-zinc-400"}`,children:[s.jsx(si,{size:14}),s.jsx("span",{children:"尾帧"})]}),!e.endFrame&&s.jsxs("label",{className:"absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 flex items-center justify-center text-white text-xs transition-opacity cursor-pointer",onClick:U=>U.stopPropagation(),onMouseDown:U=>U.stopPropagation(),children:[s.jsxs("span",{className:"flex flex-col items-center gap-1 pointer-events-none",children:[s.jsx(Ll,{size:14}),"选择尾帧"]}),s.jsx("input",{type:"file",className:"hidden",accept:"image/*,.jpg,.jpeg,.png,.gif,.webp,.bmp,.svg",onChange:U=>{var te;const G=(te=U.target.files)==null?void 0:te[0];if(G){const ge=new FileReader;ge.onload=ne=>{var le;return o(n,e.id,{endFrame:(le=ne.target)==null?void 0:le.result})},ge.readAsDataURL(G)}},onClick:U=>U.stopPropagation()})]})]})]}):s.jsxs("div",{className:`w-full aspect-video rounded border relative group overflow-hidden ${i?"bg-black border-zinc-800":"bg-zinc-100 border-zinc-300"}`,onDrop:me,onDragOver:U=>U.preventDefault(),children:[e.video_url?s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"w-full h-full relative",onDoubleClick:U=>{U.preventDefault(),U.stopPropagation(),F&&L&&(console.log("[Storyboard] Video double-clicked, opening lightbox"),F({url:e.video_url,type:"video",prompt:e.prompt||e.description||`镜头 ${t+1}`}),L(!0))},children:s.jsx("video",{src:e.video_url,className:"w-full h-full object-cover rounded",controls:!0,controlsList:"nofullscreen",disablePictureInPicture:!0,onPlay:U=>{const G=U.currentTarget;G.setAttribute("data-user-controlled","true"),G.setAttribute("data-user-playing","true")},onPause:U=>{const G=U.currentTarget;G.setAttribute("data-user-controlled","true"),G.setAttribute("data-user-playing","false")},preload:"metadata",onMouseDown:U=>U.stopPropagation(),onDoubleClick:U=>(U.preventDefault(),U.stopPropagation(),!1)})}),s.jsx("button",{onClick:U=>{U.stopPropagation(),o(n,e.id,{video_url:"",status:"draft"})},className:`absolute top-1 right-1 p-1 rounded opacity-0 group-hover:opacity-100 transition-opacity ${i?"bg-black/60 hover:bg-red-600 text-white":"bg-white/80 hover:bg-red-500 text-zinc-600 hover:text-white"}`,title:"清除视频",children:s.jsx(Qr,{size:10})})]}):e.status==="generating"?s.jsxs("div",{className:`w-full h-full flex flex-col items-center justify-center text-[10px] gap-2 ${i?"bg-zinc-900 text-zinc-300":"bg-zinc-100 text-zinc-600"}`,children:[s.jsx(zr,{size:20,className:"animate-spin text-blue-500"}),s.jsx("span",{children:"视频生成中..."})]}):(()=>{const U=ee(e);return U.length>0?s.jsx(s.Fragment,{children:s.jsx("div",{className:"w-full h-full grid grid-cols-3 gap-1 p-1",children:U.map((G,te)=>s.jsxs("div",{className:`relative flex flex-col rounded overflow-hidden border group/img ${i?"border-zinc-700 bg-zinc-900":"border-zinc-300 bg-white"}`,children:[s.jsxs("div",{className:`w-full px-1 py-0.5 text-center text-[9px] font-semibold ${i?"bg-blue-600 text-white":"bg-blue-500 text-white"}`,children:["图",te+1]}),s.jsx("div",{className:"relative flex-1 min-h-0",children:s.jsx("img",{src:Ea(G)||G,className:"w-full h-full object-cover cursor-pointer hover:opacity-80 transition-opacity",alt:`镜头 ${t+1} - 图片 ${te+1}`,onError:ge=>{ge.currentTarget,G&&G.startsWith("blob:")?console.warn(`[ListView] Blob URL 加载失败: ${G.substring(0,50)}...`):G&&G.startsWith("data:")&&console.warn("[ListView] Base64 图片加载失败")},onDoubleClick:ge=>{ge.preventDefault(),ge.stopPropagation(),F&&L&&(F({url:Ea(G)||G,type:"image",prompt:e.prompt||e.description||`镜头 ${t+1} - 图${te+1}`}),L(!0))}})}),s.jsx("button",{onClick:ge=>{ge.stopPropagation();const ne=U.filter((le,fe)=>fe!==te);o(n,e.id,{image_urls:ne,image_url:ne[0]||""})},className:`absolute top-0.5 right-0.5 w-4 h-4 flex items-center justify-center rounded opacity-0 group-hover/img:opacity-100 transition-opacity ${i?"bg-red-600/90 hover:bg-red-600 text-white":"bg-red-500/90 hover:bg-red-500 text-white"}`,title:"删除图片",children:s.jsx(Qr,{size:10})})]},te))})}):s.jsxs("div",{className:`w-full h-full flex flex-col items-center justify-center text-[10px] gap-1 ${i?"text-zinc-700":"text-zinc-400"}`,children:[s.jsx(si,{size:14}),s.jsx("span",{children:"点击粘贴/拖入"}),s.jsx("span",{className:"text-[9px] opacity-70",children:"支持1-3张图片"})]})})(),!e.video_url&&ee(e).length===0&&e.status!=="generating"&&s.jsxs("label",{className:"absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 flex items-center justify-center text-white text-xs transition-opacity cursor-pointer",onClick:U=>U.stopPropagation(),onMouseDown:U=>U.stopPropagation(),children:[s.jsxs("span",{className:"flex flex-col items-center gap-1 pointer-events-none",children:[s.jsx(Ll,{size:14}),"选择图片"]}),s.jsx("input",{type:"file",className:"hidden",accept:"image/*,.jpg,.jpeg,.png,.gif,.webp,.bmp,.svg",multiple:!0,onChange:pe,onClick:U=>U.stopPropagation()})]}),!e.video_url&&ee(e).length>0&&ee(e).length<3&&e.status!=="generating"&&s.jsxs("label",{className:`absolute bottom-1 right-1 p-1 rounded opacity-0 group-hover:opacity-100 transition-opacity cursor-pointer \${ + isDark ? 'bg-black/60 hover:bg-blue-600 text-white' : 'bg-white/80 hover:bg-blue-500 text-zinc-600 hover:text-white' + }`,onClick:U=>U.stopPropagation(),onMouseDown:U=>U.stopPropagation(),title:"添加更多图片",children:[s.jsx(Xi,{size:12}),s.jsx("input",{type:"file",className:"hidden",accept:"image/*,.jpg,.jpeg,.png,.gif,.webp,.bmp,.svg",multiple:!0,onChange:pe,onClick:U=>U.stopPropagation()})]})]})}),s.jsxs("div",{className:"flex-1 min-w-0 flex flex-col gap-2 relative",children:[(e.status==="generating"||e.generatingProgress>0)&&s.jsx("div",{className:`absolute top-0 left-0 right-0 h-1 rounded-t overflow-hidden ${i?"bg-zinc-800":"bg-zinc-200"}`,children:s.jsx("div",{className:"h-full bg-blue-500 transition-all duration-300 ease-out",style:{width:`${e.generatingProgress||0}%`}})}),s.jsxs("div",{className:"flex gap-2 items-center flex-wrap",children:[s.jsx("select",{value:Z,onChange:U=>{const G=U.target.value,te=nu(G,B),ge=hl(G)?Lp:["16:9","9:16","1:1","4:3","3:4"];o(n,e.id,{model:G,duration:te.includes(V)?V:te[0],ratio:ge.includes(e.ratio||"16:9")?e.ratio:ge[0]})},onClick:U=>U.stopPropagation(),onMouseDown:U=>U.stopPropagation(),className:`storyboard-select text-xs px-2 py-1 rounded border outline-none transition-colors ${i?"bg-transparent border-white/30 text-white hover:bg-white/5":"bg-white border-zinc-300 text-zinc-800 hover:border-zinc-400"}`,children:(O?O(a.filter(U=>U.type==="Video")):a.filter(U=>U.type==="Video")).map(U=>{var G,te,ge;return s.jsx("option",{value:U.id,children:(U.provider||U.modelName||U.id)+(((G=U.provider)!=null&&G.startsWith("Seedream")||(te=U.provider)!=null&&te.startsWith("Seedance"))&&!((ge=U.provider)!=null&&ge.includes("API"))?" Official":"")},U.id)})}),s.jsx("select",{value:e.ratio||"16:9",onChange:U=>o(n,e.id,{ratio:U.target.value}),onClick:U=>U.stopPropagation(),onMouseDown:U=>U.stopPropagation(),className:`storyboard-select text-xs px-2 py-1 rounded border outline-none transition-colors ${i?"bg-transparent border-white/30 text-white hover:bg-white/5":"bg-white border-zinc-300 text-zinc-800 hover:border-zinc-400"}`,children:N.map(U=>s.jsx("option",{value:U,children:U},U))}),s.jsx("select",{value:V,onChange:U=>o(n,e.id,{duration:U.target.value}),onClick:U=>U.stopPropagation(),onMouseDown:U=>U.stopPropagation(),className:`storyboard-select text-xs px-2 py-1 rounded border outline-none transition-colors ${i?"bg-transparent border-white/30 text-white hover:bg-white/5":"bg-white border-zinc-300 text-zinc-800 hover:border-zinc-400"}`,children:j.map(U=>s.jsx("option",{value:U,children:U.replace("s","秒")},U))}),W&&s.jsx("select",{value:B,onChange:U=>o(n,e.id,{resolution:U.target.value}),onClick:U=>U.stopPropagation(),onMouseDown:U=>U.stopPropagation(),className:`storyboard-select text-xs px-2 py-1 rounded border outline-none transition-colors ${i?"bg-transparent border-white/30 text-white hover:bg-white/5":"bg-white border-zinc-300 text-zinc-800 hover:border-zinc-400"}`,children:["1080P","720P"].map(U=>s.jsx("option",{value:U,children:U},U))}),M&&s.jsx("select",{value:B,onChange:U=>{const G=U.target.value,te=nu(Z,G);o(n,e.id,{resolution:G,duration:te.includes(V)?V:te[0]})},onClick:U=>U.stopPropagation(),onMouseDown:U=>U.stopPropagation(),className:`storyboard-select text-xs px-2 py-1 rounded border outline-none transition-colors ${i?"bg-transparent border-white/30 text-white hover:bg-white/5":"bg-white border-zinc-300 text-zinc-800 hover:border-zinc-400"}`,children:k.map(U=>s.jsx("option",{value:U,children:U},U))}),Y&&k.length>0&&s.jsx("select",{value:B,onChange:U=>o(n,e.id,{resolution:U.target.value}),onClick:U=>U.stopPropagation(),onMouseDown:U=>U.stopPropagation(),className:`storyboard-select text-xs px-2 py-1 rounded border outline-none transition-colors ${i?"bg-transparent border-white/30 text-white hover:bg-white/5":"bg-white border-zinc-300 text-zinc-800 hover:border-zinc-400"}`,children:k.map(U=>s.jsx("option",{value:U,children:U},U))}),ie&&k.length>0&&s.jsx("select",{value:B,onChange:U=>o(n,e.id,{resolution:U.target.value}),onClick:U=>U.stopPropagation(),onMouseDown:U=>U.stopPropagation(),className:`storyboard-select text-xs px-2 py-1 rounded border outline-none transition-colors ${i?"bg-transparent border-white/30 text-white hover:bg-white/5":"bg-white border-zinc-300 text-zinc-800 hover:border-zinc-400"}`,children:k.map(U=>s.jsx("option",{value:U,children:U},U))}),oe&&k.length>0&&s.jsx("select",{value:B,onChange:U=>o(n,e.id,{resolution:U.target.value}),onClick:U=>U.stopPropagation(),onMouseDown:U=>U.stopPropagation(),className:`storyboard-select text-xs px-2 py-1 rounded border outline-none transition-colors ${i?"bg-transparent border-white/30 text-white hover:bg-white/5":"bg-white border-zinc-300 text-zinc-800 hover:border-zinc-400"}`,children:k.map(U=>s.jsx("option",{value:U,children:U},U))}),se&&k.length>0&&s.jsx("select",{value:B,onChange:U=>o(n,e.id,{resolution:U.target.value}),onClick:U=>U.stopPropagation(),onMouseDown:U=>U.stopPropagation(),className:`storyboard-select text-xs px-2 py-1 rounded border outline-none transition-colors ${i?"bg-transparent border-white/30 text-white hover:bg-white/5":"bg-white border-zinc-300 text-zinc-800 hover:border-zinc-400"}`,children:k.map(U=>s.jsx("option",{value:U,children:U},U))}),se&&b&&s.jsxs(s.Fragment,{children:[s.jsxs("button",{type:"button",onClick:U=>{U.stopPropagation(),b()},onMouseDown:U=>U.stopPropagation(),className:`flex items-center gap-1 px-2 py-1 rounded text-[10px] border transition-colors ${(e.klingSubjects||[]).length>0?i?"bg-transparent border-white/50 text-white":"bg-cyan-500/30 border-cyan-400 text-cyan-700":i?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-zinc-100 hover:bg-zinc-200 text-zinc-600 border-zinc-300"}`,title:(e.klingSubjects||[]).length>0?`已选择 ${(e.klingSubjects||[]).length} 个主体`:"选择可灵主体",children:[s.jsx(Ya,{size:12}),s.jsx("span",{children:(e.klingSubjects||[]).length>0?`${e.klingSubjects.length}`:"主体"})]}),(e.klingSubjects||[]).length>0&&p&&s.jsxs("div",{className:"flex items-center gap-1 flex-wrap",children:[e.klingSubjects.slice(0,3).map(U=>{const G=p.find(te=>te.id===U);return G?s.jsx("span",{className:`px-1.5 py-0.5 text-[9px] rounded border ${i?"bg-transparent border-white/30 text-white":"bg-cyan-50 text-cyan-700 border-cyan-200"}`,title:G.name,children:G.name},U):null}),(e.klingSubjects||[]).length>3&&s.jsxs("span",{className:`text-[9px] ${i?"text-white/70":"text-zinc-500"}`,children:["+",(e.klingSubjects||[]).length-3]})]})]}),se&&g&&s.jsxs("button",{type:"button",onClick:U=>{U.stopPropagation(),g()},onMouseDown:U=>U.stopPropagation(),className:`flex items-center gap-1 px-2 py-1 rounded text-[10px] border transition-colors ${e.klingVideoFile||e.klingVideoUrl?i?"bg-transparent border-white/50 text-white":"bg-emerald-500/30 border-emerald-400 text-emerald-700":i?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-zinc-100 hover:bg-zinc-200 text-zinc-600 border-zinc-300"}`,title:(ue=e.klingVideoFile)!=null&&ue.name||e.klingVideoUrl?"已上传视频":"上传视频",children:[s.jsx(aa,{size:12}),s.jsx("span",{children:e.klingVideoFile||e.klingVideoUrl?"视频✓":"视频"})]}),se&&y&&s.jsxs("button",{type:"button",onClick:U=>{U.stopPropagation(),y()},onMouseDown:U=>U.stopPropagation(),className:`flex items-center gap-1 px-2 py-1 rounded text-[10px] border transition-colors ${(e.klingImages||[]).length>0?i?"bg-transparent border-white/50 text-white":"bg-blue-500/30 border-blue-400 text-blue-700":i?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-zinc-100 hover:bg-zinc-200 text-zinc-600 border-zinc-300"}`,title:(e.klingImages||[]).length>0?`已上传 ${e.klingImages.length} 张图片`:"上传图片",children:[s.jsx(Rp,{size:12}),s.jsx("span",{children:(e.klingImages||[]).length>0?`图片(${e.klingImages.length})`:"图片"})]}),oe&&(()=>{const U=e.wan26AudioConfig||"none",G=e.wan26AudioFile||null,te=ge=>{var le;const ne=(le=ge.target.files)==null?void 0:le[0];!ne||!v||(v(ne),J.current&&(J.current.value=""))};return s.jsxs(s.Fragment,{children:[s.jsxs("select",{value:U,onChange:ge=>{const ne=ge.target.value;o(n,e.id,{wan26AudioConfig:ne,...ne!=="upload"?{wan26AudioFile:null,wan26AudioSegment:null}:{}}),ne==="upload"&&setTimeout(()=>{var le;return(le=J.current)==null?void 0:le.click()},100)},onClick:ge=>ge.stopPropagation(),onMouseDown:ge=>ge.stopPropagation(),className:`text-xs px-2 py-1 rounded border outline-none transition-colors ${i?U!=="none"?"bg-transparent border-white/50 text-white":"bg-transparent border-white/30 text-white hover:bg-white/5":U!=="none"?"bg-purple-500/30 border-purple-400 text-purple-700":"bg-white border-zinc-300 text-zinc-800 hover:border-zinc-400"}`,title:U==="none"?"无音频":U==="auto"?"自动配乐":G?"已上传音频":"上传音频",children:[s.jsx("option",{value:"none",children:"无音频"}),s.jsx("option",{value:"auto",children:"自动配乐"}),s.jsx("option",{value:"upload",children:G?"音频✓":"上传音频"})]}),s.jsx("input",{ref:J,type:"file",accept:"audio/*,.mp3,.wav,.m4a,.aac,.ogg,.flac",onChange:te,className:"hidden"})]})})(),oe&&s.jsxs("label",{className:`flex items-center gap-1 px-2 py-1 rounded text-[10px] border cursor-pointer transition-colors ${i?e.wan26MultiShot?"bg-transparent border-white/50 text-white":"bg-transparent border-white/30 hover:bg-white/5 text-white":e.wan26MultiShot?"bg-purple-500/30 border-purple-400 text-purple-700":"bg-zinc-100 hover:bg-zinc-200 text-zinc-600 border-zinc-300"}`,onClick:U=>U.stopPropagation(),onMouseDown:U=>U.stopPropagation(),title:"多镜头叙事:生成包含多个镜头的视频",children:[s.jsx("input",{type:"checkbox",checked:!!e.wan26MultiShot,onChange:U=>o(n,e.id,{wan26MultiShot:U.target.checked}),className:"w-3 h-3 cursor-pointer",onClick:U=>U.stopPropagation()}),s.jsx("span",{children:"多镜头"})]}),(Z==="sora-2"||Z==="sora-2-pro")&&s.jsxs("label",{className:"flex items-center gap-1.5 cursor-pointer",children:[s.jsx("input",{type:"checkbox",checked:e.enableHD||!1,onChange:U=>o(n,e.id,{enableHD:U.target.checked}),onClick:U=>U.stopPropagation(),onMouseDown:U=>U.stopPropagation(),className:"w-3 h-3 rounded"}),s.jsx("span",{className:`text-[10px] ${i?"text-zinc-400":"text-zinc-600"}`,children:"HD"})]}),re&&s.jsxs("label",{className:"flex items-center gap-1.5 cursor-pointer",title:"Veo/Hailuo/Kling/Vidu 支持首尾帧",children:[s.jsx("input",{type:"checkbox",checked:e.enableFrames||!1,onChange:U=>o(n,e.id,{enableFrames:U.target.checked}),onClick:U=>U.stopPropagation(),onMouseDown:U=>U.stopPropagation(),className:"w-3 h-3 rounded"}),s.jsx("span",{className:`text-[10px] ${i?"text-zinc-400":"text-zinc-600"}`,children:"首尾帧"})]})]}),Z.includes("sora")&&h.length>0&&s.jsxs("div",{className:"flex items-center gap-2 overflow-x-auto py-1 flex-1 rh-scroll-minimal border-b border-dashed mb-2",style:{borderColor:i?"rgba(63, 63, 70, 0.5)":"rgba(161, 161, 170, 0.5)"},onClick:U=>U.stopPropagation(),onMouseDown:U=>U.stopPropagation(),children:[s.jsx("span",{className:"text-[10px] shrink-0 text-zinc-500",children:"角色库"}),h.slice(0,8).map(U=>{const G=`@${U.name}`,te=e.description||"",ge=te.includes(G);return s.jsxs("button",{type:"button",onClick:ne=>{ne.stopPropagation();const le=document.querySelector(`textarea[data-node-id="${n}"][data-shot-id="${e.id}"]`),fe=le?le.value:te,be=(le==null?void 0:le.selectionStart)??fe.length,de=fe.slice(0,be)+` ${G} `+fe.slice(be);o(n,e.id,{description:de}),setTimeout(()=>{if(le){const $e=be+G.length+2;le.setSelectionRange($e,$e),le.focus()}},0)},className:`relative shrink-0 transition-all ${ge?"scale-110 opacity-100":"opacity-70 hover:opacity-100"}`,title:U.name,onMouseDown:ne=>ne.stopPropagation(),children:[U.imageUrl?s.jsx("img",{src:U.imageUrl,alt:U.name,className:`w-7 h-7 rounded-full object-cover border-2 ${ge?"border-blue-500 ring-2 ring-blue-500":"border-transparent"}`}):s.jsx("div",{className:`w-7 h-7 rounded-full border-2 flex items-center justify-center text-[10px] ${i?"bg-zinc-700 border-zinc-600":"bg-zinc-200 border-zinc-300"}`,children:(U.name||"?").slice(0,1)}),s.jsx("div",{className:"absolute -bottom-0.5 -right-0.5 bg-black/50 rounded-full p-0.5",children:s.jsx(Bp,{size:8,className:"text-green-400"})})]},U.id)})]}),s.jsx("textarea",{"data-node-type":"storyboard","data-node-id":n,"data-shot-id":e.id,"data-scrollable":"true",className:`text-sm outline-none resize-none bg-transparent transition-all h-12 ${i?"text-zinc-200 placeholder:text-zinc-700":"text-zinc-800 placeholder:text-zinc-400"}`,value:e.description||"",placeholder:"画面描述...",onChange:U=>o(n,e.id,{description:U.target.value}),onClick:U=>U.stopPropagation(),onMouseDown:U=>U.stopPropagation()}),s.jsx("div",{className:`p-2 rounded border text-[10px] ${i?"bg-transparent border-white/30":"bg-zinc-50 border-zinc-200"}`,children:s.jsx("textarea",{"data-node-type":"storyboard-prompt","data-node-id":n,"data-shot-id":e.id,"data-scrollable":"true",className:`w-full text-[10px] outline-none resize-none bg-transparent h-16 ${i?"text-zinc-300":"text-zinc-700"}`,value:e.prompt||"",placeholder:"等待生成提示词...",onChange:U=>o(n,e.id,{prompt:U.target.value}),onClick:U=>U.stopPropagation(),onMouseDown:U=>U.stopPropagation()})}),s.jsxs("div",{className:"flex gap-1 flex-wrap items-center mt-1",children:[(e.tags||[]).map((U,G)=>s.jsx("span",{className:`px-1.5 py-0.5 text-[10px] rounded border ${i?"bg-transparent text-white border-white/30":"bg-blue-50 text-blue-600 border-blue-200"}`,children:U},G)),e.camera&&s.jsxs("span",{className:`px-1.5 py-0.5 text-[10px] rounded border flex items-center gap-1 ${i?"bg-transparent text-white border-white/30":"bg-purple-50 text-purple-600 border-purple-200"}`,children:[s.jsx(aa,{size:8})," ",e.camera]}),e.time_range&&s.jsx("span",{className:`text-[10px] ml-auto font-mono px-1.5 py-0.5 rounded border ${i?"bg-transparent border-white/30 text-white":"text-zinc-400"}`,children:e.time_range})]})]}),s.jsxs("div",{className:`flex flex-col gap-2 justify-center border-l pl-2 shrink-0 relative ${i?"border-zinc-800":"border-zinc-200"}`,children:[(e.status==="generating"||e.generatingProgress>0)&&s.jsx("div",{className:"absolute -left-1 top-0 bottom-0 w-1 bg-blue-500 rounded-full animate-pulse"}),s.jsx("button",{onClick:U=>{U.stopPropagation(),c(n,e)},className:`p-1.5 rounded text-white shadow-sm transition-all active:scale-95 border ${e.status==="generating"?i?"bg-transparent border-white/20 cursor-not-allowed text-white/50":"bg-zinc-500 cursor-not-allowed border-zinc-500":i?"bg-transparent border-white/30 hover:bg-white/5":"bg-green-600 hover:bg-green-500 border-green-600"}`,onMouseDown:U=>U.stopPropagation(),title:"生成视频",disabled:e.status==="generating",children:e.status==="generating"?s.jsx(zr,{size:14,className:"animate-spin"}):s.jsx(Ia,{size:14,fill:"currentColor"})}),A&&s.jsx("button",{onClick:U=>{U.stopPropagation(),A(e,t)},className:`p-1.5 rounded transition-colors border ${i?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-blue-500 hover:bg-blue-600 text-white border-blue-500"}`,onMouseDown:U=>U.stopPropagation(),title:"发送到 AI 视频节点",children:s.jsx(Lo,{size:14})}),R&&s.jsx("button",{onClick:U=>{U.stopPropagation(),R(e)},disabled:X,className:`p-1.5 rounded transition-colors border ${X?i?"bg-transparent border-white/20 cursor-not-allowed text-white/50":"bg-zinc-500 cursor-not-allowed text-white border-zinc-500":i?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-purple-500 hover:bg-purple-600 text-white border-purple-500"}`,onMouseDown:U=>U.stopPropagation(),title:"生成分镜序列",children:X?s.jsx(zr,{size:14,className:"animate-spin"}):s.jsx(Ii,{size:14})}),s.jsx("button",{onClick:()=>u(n,e.id),className:`p-1.5 transition-colors border rounded ${i?"bg-transparent border-white/30 hover:bg-white/5 text-white hover:text-red-400":"text-zinc-400 hover:text-red-600 border-zinc-300 hover:border-red-300"}`,onMouseDown:U=>U.stopPropagation(),title:"删除镜头",children:s.jsx(Zi,{size:14})})]})]})},tce=({shots:e,isDark:t,onShotClick:n,node:r,apiConfigs:i,globalApiKey:a,setNodes:o,generateId:l})=>{const c=_.useCallback(d=>d.image_urls&&Array.isArray(d.image_urls)&&d.image_urls.length>0?d.image_urls:d.image_url&&typeof d.image_url=="string"?[d.image_url]:[],[]),u=_.useMemo(()=>e.length<=4?2:e.length<=9?3:e.length<=16?4:5,[e.length]);return s.jsxs("div",{className:"flex flex-col h-full",children:[e.length>0&&s.jsx("div",{className:`p-2 border-b flex items-center justify-between shrink-0 ${t?"border-zinc-800 bg-zinc-900/50":"border-zinc-200 bg-zinc-50"}`,children:s.jsxs("span",{className:`text-xs ${t?"text-zinc-400":"text-zinc-600"}`,children:["共 ",e.length," 个镜头"]})}),s.jsx("div",{className:"flex-1 overflow-y-auto minimal-scrollbar p-3 min-h-0",onWheel:d=>d.stopPropagation(),children:e.length>0?s.jsx("div",{className:"grid gap-2",style:{gridTemplateColumns:`repeat(${u}, 1fr)`},children:e.map((d,h)=>s.jsxs("div",{className:`aspect-video rounded border relative group cursor-pointer transition-all ${t?"border-zinc-700 hover:border-zinc-600 hover:shadow-lg":"border-zinc-300 hover:border-zinc-400 hover:shadow-md"}`,onClick:()=>n(d),onMouseDown:p=>p.stopPropagation(),title:d.description?`镜头 ${h+1}: ${d.description}`:`镜头 ${h+1}`,children:[(()=>{const p=c(d);return p.length>0?s.jsx("div",{className:`w-full h-full ${p.length===1?"":(p.length===2,"grid grid-cols-2 gap-0.5")}`,children:p.slice(0,3).map((f,b)=>s.jsx("img",{src:Ea(f)||f,className:`object-cover rounded ${p.length===1||p.length===2?"w-full h-full":b===0?"col-span-2 h-1/2":"w-full h-1/2"}`,alt:`镜头 ${h+1} - 图片 ${b+1}`,loading:"lazy",onError:g=>{g.currentTarget,f&&f.startsWith("blob:")?console.warn(`[GridView] Blob URL 加载失败: ${f.substring(0,50)}...`):f&&f.startsWith("data:")&&console.warn("[GridView] Base64 图片加载失败")}},b))}):s.jsxs("div",{className:`w-full h-full flex flex-col items-center justify-center ${t?"bg-zinc-800":"bg-zinc-100"}`,children:[s.jsx(gu,{size:20,className:`mb-1 ${t?"text-zinc-500":"text-zinc-400"}`}),s.jsxs("span",{className:`text-xs ${t?"text-zinc-400":"text-zinc-500"}`,children:["镜头 ",h+1]})]})})(),s.jsx("div",{className:`absolute top-1 left-1 px-1.5 py-0.5 rounded text-xs font-medium ${t?"bg-black/60 text-white":"bg-white/80 text-zinc-700"}`,children:h+1}),d.status==="generating"&&s.jsx("div",{className:"absolute top-1 right-1 px-1.5 py-0.5 rounded bg-blue-600/80 text-white",children:s.jsx(zr,{size:10,className:"animate-spin"})}),!!(d.description_zh||d.description)&&s.jsxs("div",{className:"absolute bottom-0 left-0 right-0 p-2 rounded-b bg-gradient-to-t from-black/80 to-transparent opacity-0 group-hover:opacity-100 transition-opacity text-white",children:[s.jsx("div",{className:"text-xs font-medium line-clamp-2",children:d.description_zh||d.description||""}),!!(d.model||d.ratio||d.duration)&&s.jsxs("div",{className:"flex flex-wrap gap-1 mt-1",children:[!!d.model&&s.jsx("span",{className:"px-1 py-0.5 bg-blue-500/30 rounded text-[10px]",children:d.model.toUpperCase()}),!!d.ratio&&s.jsx("span",{className:"px-1 py-0.5 bg-green-500/30 rounded text-[10px]",children:d.ratio}),!!d.duration&&s.jsx("span",{className:"px-1 py-0.5 bg-purple-500/30 rounded text-[10px]",children:d.duration})]})]})]},d.id))}):s.jsxs("div",{className:`flex-1 rounded-lg border-2 border-dashed flex flex-col items-center justify-center py-8 ${t?"border-zinc-700":"border-zinc-300"}`,children:[s.jsx(gu,{size:32,className:`mb-2 ${t?"text-zinc-600":"text-zinc-400"}`}),s.jsx("span",{className:`text-xs ${t?"text-zinc-500":"text-zinc-400"}`,children:"暂无分镜,请添加或同步分析结果"})]})})]})},nce=fr.memo(ece,(e,t)=>e.shot===t.shot&&e.isDark===t.isDark&&e.idx===t.idx&&e.apiConfigs===t.apiConfigs&&e.filterJimengModels===t.filterJimengModels&&e.onSendShotToGenVideo===t.onSendShotToGenVideo&&e.handleOpenGenerateSequenceModal===t.handleOpenGenerateSequenceModal),rce=({shots:e,isDark:t,updateShot:n,deleteShot:r,nodeId:i,selectedShots:a,setSelectedShots:o,onBatchDelete:l,onBatchDownload:c,isBatchDownloading:u})=>{const d=_.useCallback(f=>f.image_urls&&Array.isArray(f.image_urls)&&f.image_urls.length>0?f.image_urls:f.image_url&&typeof f.image_url=="string"?[f.image_url]:[],[]),h=_.useCallback(f=>{o(f?new Set(e.map(b=>b.id)):new Set)},[e,o]),p=_.useCallback(f=>{o(b=>{const g=new Set(b);return g.has(f)?g.delete(f):g.add(f),g})},[o]);return s.jsxs("div",{className:"flex flex-col h-full",children:[e.length>0&&s.jsxs("div",{className:`p-2 border-b flex items-center justify-between shrink-0 ${t?"border-zinc-800 bg-zinc-900/50":"border-zinc-200 bg-zinc-50"}`,children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("input",{type:"checkbox",checked:a.size===e.length&&e.length>0,onChange:f=>h(f.target.checked),className:"cursor-pointer",onMouseDown:f=>f.stopPropagation()}),s.jsxs("span",{className:`text-sm ${t?"text-zinc-400":"text-zinc-600"}`,children:["已选择 ",a.size," 个镜头"]})]}),s.jsxs("div",{className:"flex gap-2",children:[s.jsxs("button",{onClick:c,disabled:a.size===0||u,className:`px-3 py-1 rounded text-xs transition-colors flex items-center gap-1 ${a.size===0||u?t?"bg-zinc-800 text-zinc-600 cursor-not-allowed":"bg-zinc-200 text-zinc-400 cursor-not-allowed":"bg-blue-600 hover:bg-blue-700 text-white"}`,onMouseDown:f=>f.stopPropagation(),title:"下载选中镜头中已生成的视频",children:[u?s.jsx(zr,{size:12,className:"animate-spin"}):s.jsx(mu,{size:12}),u?"下载中...":"批量下载"]}),s.jsxs("button",{onClick:l,disabled:a.size===0,className:`px-3 py-1 rounded text-xs transition-colors flex items-center gap-1 ${a.size===0?t?"bg-zinc-800 text-zinc-600 cursor-not-allowed":"bg-zinc-200 text-zinc-400 cursor-not-allowed":"bg-red-600 hover:bg-red-700 text-white"}`,onMouseDown:f=>f.stopPropagation(),children:[s.jsx(Zi,{size:12}),"批量删除"]})]})]}),s.jsx("div",{className:"flex-1 overflow-y-auto overflow-x-auto minimal-scrollbar min-h-0",style:{height:0},children:e.length>0?s.jsxs("table",{className:`w-full border-collapse text-sm ${t?"text-zinc-300":"text-zinc-700"}`,children:[s.jsx("thead",{className:`sticky top-0 z-10 ${t?"bg-zinc-800":"bg-zinc-100"}`,children:s.jsxs("tr",{children:[s.jsx("th",{className:"p-3 border-b text-left w-12",children:s.jsx("input",{type:"checkbox",checked:a.size===e.length&&e.length>0,onChange:f=>h(f.target.checked),className:"cursor-pointer",onMouseDown:f=>f.stopPropagation()})}),s.jsx("th",{className:`p-3 border-b text-left w-16 ${t?"border-zinc-700":"border-zinc-300"}`,children:"镜号"}),s.jsx("th",{className:`p-3 border-b text-left w-32 ${t?"border-zinc-700":"border-zinc-300"}`,children:"画面"}),s.jsx("th",{className:`p-3 border-b text-left min-w-[200px] ${t?"border-zinc-700":"border-zinc-300"}`,children:"中英画面描述"}),s.jsx("th",{className:`p-3 border-b text-left min-w-[150px] ${t?"border-zinc-700":"border-zinc-300"}`,children:"对白/旁白"}),s.jsx("th",{className:`p-3 border-b text-left w-24 ${t?"border-zinc-700":"border-zinc-300"}`,children:"角色"}),s.jsx("th",{className:`p-3 border-b text-left w-20 ${t?"border-zinc-700":"border-zinc-300"}`,children:"景别"}),s.jsx("th",{className:`p-3 border-b text-left w-20 ${t?"border-zinc-700":"border-zinc-300"}`,children:"角度"}),s.jsx("th",{className:`p-3 border-b text-left w-20 ${t?"border-zinc-700":"border-zinc-300"}`,children:"运镜"}),s.jsx("th",{className:`p-3 border-b text-left w-16 ${t?"border-zinc-700":"border-zinc-300"}`,children:"时长"}),s.jsx("th",{className:`p-3 border-b text-left w-24 ${t?"border-zinc-700":"border-zinc-300"}`,children:"操作"})]})}),s.jsx("tbody",{children:e.map(f=>s.jsxs("tr",{className:`hover:bg-opacity-50 transition-colors ${t?"hover:bg-zinc-800":"hover:bg-zinc-100"}`,children:[s.jsx("td",{className:`p-3 border-b ${t?"border-zinc-700":"border-zinc-300"}`,children:s.jsx("input",{type:"checkbox",checked:a.has(f.id),onChange:()=>p(f.id),className:"cursor-pointer",onMouseDown:b=>b.stopPropagation()})}),s.jsx("td",{className:`p-3 border-b ${t?"border-zinc-700":"border-zinc-300"}`,children:String(f.scene_index??"")}),s.jsx("td",{className:`p-3 border-b ${t?"border-zinc-700":"border-zinc-300"}`,children:(()=>{const b=d(f);return b.length>0?s.jsx("div",{className:`flex gap-0.5 ${b.length===1?"w-16":(b.length===2,"w-32")}`,children:b.slice(0,3).map((g,y)=>s.jsx("img",{src:Ea(g)||g,alt:`图片 ${y+1}`,className:`object-cover rounded ${b.length===1?"w-16 h-10":b.length===2?"w-15 h-10 flex-1":"w-10 h-10 flex-1"}`},y))}):s.jsx("div",{className:`w-16 h-10 rounded flex items-center justify-center text-xs ${t?"bg-zinc-700 text-zinc-500":"bg-zinc-200 text-zinc-400"}`,children:"无图"})})()}),s.jsx("td",{className:`p-3 border-b ${t?"border-zinc-700":"border-zinc-300"}`,children:s.jsxs("div",{className:"space-y-1",children:[s.jsx("input",{type:"text",value:f.description_zh||f.description||"",onChange:b=>n(i,f.id,{description_zh:b.target.value}),className:`w-full px-2 py-1.5 text-sm border rounded outline-none ${t?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,placeholder:"中文描述",onMouseDown:b=>b.stopPropagation()}),s.jsx("input",{type:"text",value:f.description_en||"",onChange:b=>n(i,f.id,{description_en:b.target.value}),className:`w-full px-2 py-1.5 text-sm border rounded outline-none ${t?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,placeholder:"English Description",onMouseDown:b=>b.stopPropagation()})]})}),s.jsx("td",{className:`p-3 border-b ${t?"border-zinc-700":"border-zinc-300"}`,children:s.jsx("input",{type:"text",value:f.dialogue||"",onChange:b=>n(i,f.id,{dialogue:b.target.value}),className:`w-full px-1 py-0.5 text-xs border rounded outline-none ${t?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,placeholder:"对白/旁白",onMouseDown:b=>b.stopPropagation()})}),s.jsx("td",{className:`p-3 border-b ${t?"border-zinc-700":"border-zinc-300"}`,children:s.jsx("input",{type:"text",value:f.character||"",onChange:b=>n(i,f.id,{character:b.target.value}),className:`w-full px-1 py-0.5 text-xs border rounded outline-none ${t?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,placeholder:"角色",onMouseDown:b=>b.stopPropagation()})}),s.jsx("td",{className:`p-3 border-b ${t?"border-zinc-700":"border-zinc-300"}`,children:s.jsx("input",{type:"text",value:f.shot_size||"",onChange:b=>n(i,f.id,{shot_size:b.target.value}),className:`w-full px-1 py-0.5 text-xs border rounded outline-none ${t?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,placeholder:"景别",onMouseDown:b=>b.stopPropagation()})}),s.jsx("td",{className:`p-3 border-b ${t?"border-zinc-700":"border-zinc-300"}`,children:s.jsx("input",{type:"text",value:f.camera_angle||"",onChange:b=>n(i,f.id,{camera_angle:b.target.value}),className:`w-full px-1 py-0.5 text-xs border rounded outline-none ${t?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,placeholder:"角度",onMouseDown:b=>b.stopPropagation()})}),s.jsx("td",{className:`p-3 border-b ${t?"border-zinc-700":"border-zinc-300"}`,children:s.jsx("input",{type:"text",value:f.camera||"",onChange:b=>n(i,f.id,{camera:b.target.value}),className:`w-full px-1 py-0.5 text-xs border rounded outline-none ${t?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,placeholder:"运镜",onMouseDown:b=>b.stopPropagation()})}),s.jsx("td",{className:`p-3 border-b ${t?"border-zinc-700":"border-zinc-300"}`,children:s.jsx("input",{type:"text",value:f.duration||"",onChange:b=>n(i,f.id,{duration:b.target.value}),className:`w-full px-1 py-0.5 text-xs border rounded outline-none ${t?"bg-zinc-800 border-zinc-700 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,placeholder:"时长",onMouseDown:b=>b.stopPropagation()})}),s.jsx("td",{className:`p-3 border-b ${t?"border-zinc-700":"border-zinc-300"}`,children:s.jsx("div",{className:"flex items-center gap-1.5",children:s.jsx("button",{onClick:()=>r(i,f.id),className:"p-1.5 rounded text-sm transition-colors bg-red-600 hover:bg-red-700 text-white",onMouseDown:b=>b.stopPropagation(),title:"删除",children:s.jsx(Zi,{size:14})})})})]},f.id))})]}):s.jsxs("div",{className:`flex-1 rounded-lg border-2 border-dashed flex flex-col items-center justify-center py-8 ${t?"border-zinc-700":"border-zinc-300"}`,children:[s.jsx(Pw,{size:32,className:`mb-2 ${t?"text-zinc-600":"text-zinc-400"}`}),s.jsx("span",{className:`text-sm ${t?"text-zinc-500":"text-zinc-400"}`,children:"暂无分镜,请添加或同步分析结果"})]})})]})},TE=[{label:"智能",ratio:null},{label:"21:9",ratio:[21,9]},{label:"16:9",ratio:[16,9]},{label:"8:1",ratio:[8,1]},{label:"4:1",ratio:[4,1]},{label:"3:2",ratio:[3,2]},{label:"4:3",ratio:[4,3]},{label:"5:4",ratio:[5,4]},{label:"1:1",ratio:[1,1]},{label:"4:5",ratio:[4,5]},{label:"3:4",ratio:[3,4]},{label:"2:3",ratio:[2,3]},{label:"1:4",ratio:[1,4]},{label:"9:16",ratio:[9,16]},{label:"1:8",ratio:[1,8]}],F$=({isDark:e,selectedRatio:t,filterRatios:n,onSelect:r})=>{const i=new Map;TE.forEach(p=>{const f=p.ratio?`${p.ratio[0]}:${p.ratio[1]}`:"Auto";i.set(f,p)});const a=n&&n.length>0?n.map(p=>{const f=i.get(p);if(f)return f;if(p==="Auto")return{label:"智能",ratio:null};const b=p.split(":");if(b.length===2){const g=parseInt(b[0],10),y=parseInt(b[1],10);if(!isNaN(g)&&!isNaN(y))return{label:p,ratio:[g,y]}}return null}).filter(p=>!!p):TE,o=e?"border-white/30":"border-zinc-400",l=e?"bg-white/10":"bg-blue-100",c=e?"":"text-blue-700",u=e?"hover:bg-white/5":"hover:bg-zinc-100",d=e?"text-zinc-300":"text-zinc-600",h=r?"button":"div";return s.jsx("div",{className:"flex flex-nowrap items-center gap-1 p-2 overflow-x-auto max-h-16 rh-scroll-minimal",children:a.map(p=>{const f=p.ratio?`${p.ratio[0]}:${p.ratio[1]}`:"Auto",b=t===f;return s.jsxs(h,{type:r?"button":void 0,onClick:r?()=>r(f):void 0,className:`flex flex-col items-center gap-0.5 px-1.5 py-1 rounded border transition-colors cursor-pointer focus:outline-none focus:ring-1 focus:ring-white/50 shrink-0 ${b?l:""} ${o} ${r?u:""}`,title:`${p.label} ${p.ratio?`(${f})`:""}`,children:[s.jsx("div",{className:"flex items-center justify-center w-5 h-3.5 shrink-0",style:{minWidth:20,minHeight:14},children:p.ratio?s.jsx("div",{className:"rounded-[1px] border bg-transparent",style:{aspectRatio:`${p.ratio[0]} / ${p.ratio[1]}`,maxWidth:p.ratio[0]>=p.ratio[1]?14:10,maxHeight:p.ratio[1]>=p.ratio[0]?12:8,minWidth:4,minHeight:4,borderColor:e?"rgba(255,255,255,0.7)":"rgba(0,0,0,0.6)"}}):s.jsxs("svg",{width:"12",height:"10",viewBox:"0 0 12 10",fill:"none",stroke:"currentColor",strokeWidth:"1.2",className:"opacity-80",children:[s.jsx("rect",{x:"1",y:"1",width:"10",height:"8",rx:"0.5"}),s.jsx("path",{d:"M4 1v8M8 1v8M1 4h10M1 6h10",strokeDasharray:"1 1"})]})}),s.jsx("span",{className:`text-[9px] font-medium leading-none ${b&&c?c:d}`,children:p.label})]},f)})})},sce=({isDark:e,promptLibraryForm:t,setPromptLibraryForm:n,setPromptLibrary:r,editingId:i,onCancelEdit:a})=>{const[o,l]=_.useState(t.name),[c,u]=_.useState(t.prompt);return _.useEffect(()=>{l(t.name),u(t.prompt)},[t.name,t.prompt]),s.jsxs("div",{className:"grid grid-cols-1 gap-1.5",onMouseDown:d=>d.stopPropagation(),onClick:d=>d.stopPropagation(),children:[s.jsx("input",{type:"text",value:o,onChange:d=>{l(d.target.value),n(h=>({...h,name:d.target.value}))},placeholder:"自定义名称(例如:柔光人像)",className:`w-full px-2 py-1 text-base rounded border leading-relaxed ${e?"bg-transparent border-white/30 text-white placeholder:text-zinc-500":"bg-white border-zinc-300 text-zinc-800 placeholder:text-zinc-400"}`,onMouseDown:d=>d.stopPropagation(),onClick:d=>d.stopPropagation(),onFocus:d=>d.stopPropagation(),onKeyDown:d=>d.stopPropagation()}),s.jsx("textarea",{"data-scrollable":"true",value:c,onChange:d=>{u(d.target.value),n(h=>({...h,prompt:d.target.value}))},placeholder:"输入提示词内容...",rows:i?4:2,className:`w-full px-3 py-2 text-base rounded resize-y leading-relaxed border ${e?"bg-transparent border-white/30 text-white placeholder:text-zinc-500":"bg-zinc-50 text-zinc-800 placeholder:text-zinc-400 border-transparent"}`,style:{minHeight:"40px",maxHeight:"200px"},onMouseDown:d=>d.stopPropagation(),onClick:d=>d.stopPropagation(),onFocus:d=>d.stopPropagation(),onKeyDown:d=>d.stopPropagation()}),s.jsx("button",{onClick:()=>{const d=o.trim(),h=c.trim();if(!d||!h){alert("请输入名称和提示词内容");return}r(i?p=>p.map(f=>f.id===i?{...f,name:d,prompt:h}:f):p=>[{id:`custom-${Date.now()}`,name:d,prompt:h},...p]),l(""),u(""),n({name:"",prompt:""}),i&&a&&a()},className:`w-full py-1.5 rounded text-[11px] border ${e?"bg-transparent border-white/30 text-white hover:bg-white/5":"bg-blue-600 text-white hover:bg-blue-500 border-transparent"}`,onMouseDown:d=>d.stopPropagation(),children:i?"更新提示词":"添加到常用提示词库"}),i&&s.jsx("button",{onClick:()=>{l(""),u(""),n({name:"",prompt:""}),a&&a()},className:`w-full py-1.5 rounded text-[11px] border ${e?"bg-transparent border-white/30 text-white hover:bg-white/5":"bg-zinc-200 text-zinc-700 hover:bg-zinc-300 border-transparent"}`,onMouseDown:d=>d.stopPropagation(),children:"取消编辑"})]})},Mg=({src:e,alt:t,className:n,isDark:r,useThumbnail:i=!1,blobRecoveryAssetIds:a,onBlobRecovered:o})=>{const{content:l,isLoading:c,hasError:u}=Ul(e,{useThumbnail:i,blobRecoveryAssetIds:a,onBlobUrlRecovered:o}),[d,h]=fr.useState(null);fr.useEffect(()=>{h(null)},[e]);const p=d??l;return c?s.jsx("div",{className:`flex items-center justify-center min-w-[2rem] min-h-[2rem] ${n} ${r?"bg-zinc-800/50":"bg-zinc-200/50"}`,children:s.jsx(zr,{size:10,className:"animate-spin text-zinc-500"})}):u||!p?s.jsx("div",{className:`flex items-center justify-center min-w-[2rem] min-h-[2rem] ${n} ${r?"bg-zinc-700":"bg-zinc-300"}`,children:s.jsx("span",{className:"text-[8px] text-zinc-500",children:"!"})}):s.jsx("img",{src:p,className:n,alt:t,loading:"eager",decoding:"async",onError:async()=>{if(!(a!=null&&a.length))return;const f=d??l;if(!(f!=null&&f.startsWith("blob:")))return;const{recoverDeadBlobUrl:b}=await mn(async()=>{const{recoverDeadBlobUrl:y}=await Promise.resolve().then(()=>Do);return{recoverDeadBlobUrl:y}},void 0,import.meta.url),g=await b(f,a);g&&(h(g),o==null||o(g))}})};function ice(e,t){const n=window.getSelection();if(!n)return;const r=document.createRange();let i=0;const a=o=>{var l;if(o.nodeType===Node.TEXT_NODE){const c=o.length;if(i+c>=t)return r.setStart(o,Math.min(t-i,c)),r.collapse(!0),n.removeAllRanges(),n.addRange(r),!0;i+=c}else if(o.nodeType===Node.ELEMENT_NODE){const c=o;if((l=c.hasAttribute)!=null&&l.call(c,"data-tag")){const d=`【${c.getAttribute("data-tag-content")||""}】`.length;if(i+d>=t)return r.setStart(c,0),r.collapse(!0),n.removeAllRanges(),n.addRange(r),!0;i+=d}else for(let u=0;u{const c=_.useRef(null),[u,d]=_.useState(!1),h=_.useRef(null),p=_.useRef(!1),f=_.useRef(t),b=_.useRef(!1),[g,y]=_.useState(!1),[w,v]=_.useState(0),[m,z]=_.useState(0),C=_.useRef(null),E=V=>{const N=[],j=/【([^】]+)】|(<<>>)|(<<>>)|(<<>>)/g;let k=0,W;for(;(W=j.exec(V))!==null;)W.index>k&&N.push({type:"text",content:V.slice(k,W.index)}),W[1]?N.push({type:"tag",content:W[1]}):W[2]?N.push({type:"video",content:W[2]}):W[3]?N.push({type:"element",content:W[3]}):W[4]&&N.push({type:"image",content:W[4]}),k=j.lastIndex;return k{if(!c.current)return;const N=E(V);c.current.innerHTML="",N.forEach(j=>{if(j.type==="tag"&&c.current){const k=document.createElement("span");k.setAttribute("data-tag","true"),k.setAttribute("data-tag-content",j.content),k.contentEditable="false",k.className=`inline-flex items-center gap-0.5 px-1 rounded text-[11px] font-medium whitespace-nowrap ${a?"bg-transparent text-white/70 border border-white/30":"bg-cyan-100 text-cyan-700 border border-cyan-300"}`,k.style.cssText="vertical-align: middle; cursor: default; user-select: none;";const W=document.createElement("span");W.textContent=j.content,k.appendChild(W);const M=document.createElement("button");M.type="button",M.contentEditable="false",M.className=`ml-0.5 rounded-full p-0.5 cursor-pointer flex items-center justify-center ${a?"hover:bg-white/20":"hover:bg-black/10"}`,M.style.cssText="line-height: 1;",M.innerHTML='',M.onmousedown=Y=>{Y.preventDefault(),Y.stopPropagation(),A(j.content)},k.appendChild(M),c.current.appendChild(k)}else if(j.type==="video"&&c.current){const k=document.createElement("span");k.setAttribute("data-video","true"),k.contentEditable="false",k.className=`inline-flex items-center gap-0.5 px-1 rounded text-[11px] font-medium whitespace-nowrap ${a?"bg-purple-500/30 text-purple-300 border border-purple-500/50":"bg-purple-100 text-purple-700 border border-purple-300"}`,k.style.cssText="vertical-align: middle; cursor: default; user-select: none;",o&&(k.title=o);const W=document.createElement("span");W.textContent=j.content,k.appendChild(W),c.current.appendChild(k)}else if(j.type==="element"&&c.current){const k=document.createElement("span");k.setAttribute("data-element","true"),k.contentEditable="false",k.className=`inline-flex items-center gap-0.5 px-1 rounded text-[11px] font-medium whitespace-nowrap ${a?"bg-orange-500/30 text-orange-300 border border-orange-500/50":"bg-orange-100 text-orange-700 border border-orange-300"}`,k.style.cssText="vertical-align: middle; cursor: default; user-select: none;";const W=document.createElement("span");W.textContent=j.content,k.appendChild(W),c.current.appendChild(k)}else if(j.type==="image"&&c.current){const k=document.createElement("span");k.setAttribute("data-image","true"),k.contentEditable="false",k.className=`inline-flex items-center gap-0.5 px-1 rounded text-[11px] font-medium whitespace-nowrap ${a?"bg-blue-500/30 text-blue-300 border border-blue-500/50":"bg-blue-100 text-blue-700 border border-blue-300"}`,k.style.cssText="vertical-align: middle; cursor: default; user-select: none;";const W=document.createElement("span");W.textContent=j.content,k.appendChild(W),c.current.appendChild(k)}else if(c.current){const k=document.createTextNode(j.content);c.current.appendChild(k)}})},[a,o]);_.useEffect(()=>{c.current&&t&&(I(t),f.current=t)},[]);const R=_.useCallback((V,N)=>{const j=window.getSelection();if(!j)return;const k=document.createRange();let W=0;const M=Y=>{var se;if(Y.nodeType===Node.TEXT_NODE){const ie=Y.length;if(W+ie>=N)return k.setStart(Y,N-W),k.collapse(!0),j.removeAllRanges(),j.addRange(k),!0;W+=ie}else if(Y.nodeType===Node.ELEMENT_NODE){const ie=Y;if((se=ie.hasAttribute)!=null&&se.call(ie,"data-tag")){const re=`【${ie.getAttribute("data-tag-content")||""}】`.length;if(W+re>=N)return k.setStart(ie,0),k.collapse(!0),j.removeAllRanges(),j.addRange(k),!0;W+=re}else for(let oe=0;oe{if(p.current){p.current=!1;return}c.current&&t!==f.current&&(f.current=t,I(t),C.current!==null&&(R(c.current,C.current),C.current=null))},[t,I,R,e]),_.useEffect(()=>()=>{if(h.current&&(clearTimeout(h.current),h.current=null),c.current){const V=O(c.current);V!==f.current&&(n(V),f.current=V)}},[e,n]);const A=V=>{if(!c.current)return;const N=`【${V}】`,k=O(c.current).replace(N,"");n(k),r&&r(V)},O=V=>{let N="";return V.childNodes.forEach(j=>{if(j.nodeType===Node.TEXT_NODE)N+=j.textContent||"";else if(j.nodeType===Node.ELEMENT_NODE){const k=j;if(k.hasAttribute("data-tag")){const W=k.getAttribute("data-tag-content")||"";N+=`【${W}】`}else k.hasAttribute("data-video")||k.hasAttribute("data-element")||k.hasAttribute("data-image")?N+=k.textContent||"":k.tagName==="BR"?N+=` +`:k.tagName==="DIV"?N+=` +`+O(k):N+=k.textContent||""}}),N},F=()=>{var V;if(c.current)try{const N=window.getSelection();if(N&&N.rangeCount>0){const j=N.getRangeAt(0);let k=0;const W=document.createTreeWalker(c.current,NodeFilter.SHOW_TEXT|NodeFilter.SHOW_ELEMENT,null);let M,Y=!1;for(;(M=W.nextNode())!==null;)if(M===j.startContainer){M.nodeType===Node.TEXT_NODE&&(k+=j.startOffset),Y=!0;break}else if(M.nodeType===Node.TEXT_NODE)k+=M.length;else if(M.nodeType===Node.ELEMENT_NODE){const se=M;if(se.hasAttribute("data-tag")){const ie=se.getAttribute("data-tag-content")||"";k+=`【${ie}】`.length}}if(!Y){const se=j.cloneRange();se.selectNodeContents(c.current),se.setEnd(j.endContainer,j.endOffset);const ie=se.cloneContents(),oe=document.createElement("div");oe.appendChild(ie),oe.querySelectorAll("[data-tag]").forEach(ee=>{var Q;const pe=ee.getAttribute("data-tag-content")||"",we=document.createTextNode(`【${pe}】`);(Q=ee.parentNode)==null||Q.replaceChild(we,ee)}),k=((V=oe.textContent)==null?void 0:V.length)||0}c.current.dataset.cursorPos=String(k)}}catch(N){console.error("Failed to save cursor position:",N)}},L=()=>{if(!c.current||b.current)return;const V=O(c.current);F();let N=0;const j=window.getSelection();j&&j.rangeCount>0&&(N=j.getRangeAt(0).startOffset),(l||[]).length>0&&N>0&&V[N-1]==="@"?(y(!0),v(N),z(0)):g||y(!1),p.current=!0,f.current=V,h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{V!==t&&n(V)},50)},X=V=>{V.preventDefault();const j=V.clipboardData.getData("text/plain").replace(/\r\n/g,` +`).replace(/\r/g,` +`).replace(/\n{3,}/g,` + +`).replace(/[ \t]+/g," ").trim();document.execCommand("insertText",!1,j)},T=()=>{b.current=!0},q=()=>{b.current=!1,L()},H=V=>{var N,j,k,W,M;if(!g&&V.key==="@"&&l&&l.length>0&&e.startsWith("gen-video")){const Y=parseInt(((N=c.current)==null?void 0:N.dataset.cursorPos)||"0",10);y(!0),v(Y+1),z(0);return}if(g){if(V.key==="Escape"){y(!1);return}if(l&&l.length>0){if(V.key==="ArrowDown"){V.preventDefault(),z(Y=>(Y+1)%l.length);return}if(V.key==="ArrowUp"){V.preventDefault(),z(Y=>(Y-1+l.length)%l.length);return}if(V.key==="Enter"){V.preventDefault();const Y=m0,[Z,B]=_.useState(!1);return _.useEffect(()=>{if(c.current){const V=()=>{if(c.current){const W=c.current.scrollHeight,M=c.current.clientHeight,Y=W>M+2;B(Y)}},N=setTimeout(()=>{V()},0),j=new ResizeObserver(()=>{setTimeout(V,0)});j.observe(c.current);const k=()=>{setTimeout(V,0)};return c.current.addEventListener("input",k),()=>{clearTimeout(N),j.disconnect(),c.current&&c.current.removeEventListener("input",k)}}},[t]),s.jsxs("div",{className:"relative flex-1 w-full min-w-0 min-h-[60px] overflow-hidden",children:[s.jsx("div",{ref:c,"data-node-type":"gen-node","data-node-id":e,"data-has-overflow":Z?"true":"false",contentEditable:!0,onInput:L,onKeyDown:H,onPaste:X,onClick:F,onKeyUp:F,onCompositionStart:T,onCompositionEnd:q,onFocus:()=>d(!0),onBlur:()=>{if(d(!1),y(!1),F(),c.current){const V=O(c.current);V!==f.current&&(h.current&&(clearTimeout(h.current),h.current=null),n(V),f.current=V)}},className:`absolute inset-0 w-full h-full resize-none outline-none text-base p-2 bg-transparent overflow-y-auto overflow-x-hidden rh-scroll-minimal leading-relaxed ${a?"text-zinc-200":"text-zinc-800"}`,style:{overflowWrap:"anywhere",wordWrap:"break-word",wordBreak:"break-all",whiteSpace:"pre-wrap",lineHeight:1.5,fontFamily:"inherit",letterSpacing:"normal",contain:"layout style"},suppressContentEditableWarning:!0}),!J&&!u&&s.jsx("div",{className:`absolute inset-0 p-2 text-base pointer-events-none ${a?"text-zinc-500":"text-zinc-400"}`,style:{lineHeight:1.5},children:i}),g&&l&&l.length>0&&s.jsx("div",{className:`absolute left-0 right-0 bottom-full mb-1 rounded-lg border shadow-xl overflow-hidden z-[100] max-h-48 overflow-y-auto ${a?"bg-zinc-800 border-zinc-600":"bg-white border-zinc-200"}`,onMouseDown:V=>V.preventDefault(),children:l.map((V,N)=>{const j=V.type==="image"?`图片${N+1}`:V.type==="video"?`视频${N+1}`:`音频${N+1}`,k=`@${N+1}`;return s.jsxs("button",{type:"button",className:`w-full flex items-center gap-2 px-3 py-2 text-left text-sm ${N===m?a?"bg-zinc-700 text-zinc-50":"bg-zinc-100 text-zinc-900":a?"hover:bg-zinc-700 text-zinc-200":"hover:bg-zinc-100 text-zinc-800"}`,onClick:()=>{const W=t.slice(0,w)+k+t.slice(w);C.current=w+k.length,n(W),y(!1)},children:[V.type==="image"&&V.url&&s.jsx("img",{src:V.url,alt:"",className:"w-10 h-10 rounded object-cover shrink-0"}),V.type==="video"&&s.jsx("div",{className:`w-10 h-10 rounded shrink-0 flex items-center justify-center ${a?"bg-zinc-700":"bg-zinc-200"}`,children:s.jsx(aa,{size:18,className:a?"text-zinc-400":"text-zinc-500"})}),V.type==="audio"&&s.jsx("div",{className:`w-10 h-10 rounded shrink-0 flex items-center justify-center ${a?"bg-zinc-700":"bg-zinc-200"}`,children:s.jsx(Vo,{size:18,className:a?"text-zinc-400":"text-zinc-500"})}),s.jsx("span",{className:"truncate",children:j}),s.jsx("span",{className:`shrink-0 text-[10px] ${a?"text-zinc-500":"text-zinc-400"}`,children:k})]},V.id)})})]})},oce=({node:e,nodes:t,isDark:n,updateNode:r,deleteNode:i,apiConfigs:a,apiStatus:o,globalApiKey:l,generationTimers:c,getConnectedInputImages:u,getConnectedImageForInput:d,getConnectedDirectorNodes:h,connectingSource:p,connectingTarget:f,connectingInputType:b,setConnectingSource:g,setConnectingTarget:y,setConnectingInputType:w,setConnections:v,connections:m,canvasRef:z,view:C,setMousePos:E,characterLibrary:I,setCharactersOpen:R,klingSubjectLibrary:A,setKlingSubjectsOpen:O,promptLibrary:F,setPromptLibrary:L,promptLibraryCollapsed:X,setPromptLibraryCollapsed:T,promptLibraryEditorOpen:q,setPromptLibraryEditorOpen:H,promptLibraryForm:J,setPromptLibraryForm:Z,activeDropdown:B,setActiveDropdown:V,generate:N,generateId:j,setNodes:k,filterJimengModels:W,dataVersion:M,setLightboxItem:Y,setLightboxOpen:se})=>{var Sr,Ir,Wr,ir,Yn,Zn,Ke,Et,Gn,Ut,Bn,Nr,br,vr,gr,nr,tr,jr,Br,_r,es,Ur,zs,Ts,os,wi,ki,gi,$i,gs,Ri,Ki,Ps,Si,xi,li,ca,ea,Wa,ks,Pi,_i,ta,ua,Wi,ci,Oi,da,ha,Li,ka;const[ie,oe]=_.useState(!0),[,re]=_.useState(!1),[ee,pe]=_.useState(null),[we,Q]=_.useState(null),[me,ue]=_.useState(1),[U,G]=_.useState({x:0,y:0}),[te,ge]=_.useState(!1),ne=_.useRef({x:0,y:0,translateX:0,translateY:0});_.useEffect(()=>{we&&(ue(1),G({x:0,y:0}))},[we]),_.useEffect(()=>{if(!te)return;const dt=Kt=>{const an=Kt.clientX-ne.current.x,en=Kt.clientY-ne.current.y;G({x:ne.current.translateX+an,y:ne.current.translateY+en})},vt=()=>ge(!1);return window.addEventListener("mousemove",dt),window.addEventListener("mouseup",vt),()=>{window.removeEventListener("mousemove",dt),window.removeEventListener("mouseup",vt)}},[te]);const[le,fe]=_.useState(void 0),[be,de]=_.useState(0);_.useEffect(()=>{const dt=vt=>{if(!m)return;m.filter(an=>an.to===e.id&&an.from===vt.detail.nodeId).length>0&&de(an=>an+1)};return window.addEventListener("multiAngleUpdated",dt),()=>{window.removeEventListener("multiAngleUpdated",dt)}},[m,e.id]),_.useEffect(()=>{const dt=vt=>{var an;const Kt=((an=e.settings)==null?void 0:an.model)||(e.type==="gen-image"?"qwen-image-edit":"sora-2");vt.detail.modelId===Kt&&r(e.id,{settings:{...e.settings||{},resolution:vt.detail.settings.resolution,ratio:vt.detail.settings.ratio}})};return window.addEventListener("modelSettingsUpdated",dt),()=>{window.removeEventListener("modelSettingsUpdated",dt)}},[e.id,e.type,(Sr=e.settings)==null?void 0:Sr.model,r]);const $e=_.useCallback(()=>{if(e.type!=="gen-image"&&e.type!=="gen-video")return null;const dt=m.filter(gn=>gn.from===e.id);console.log("[autoConnectPreviewNode] 节点",e.id,"的出站连接:",dt.length,dt);const vt=dt.map(gn=>{const lr=t.find(On=>On.id===gn.to);return(lr==null?void 0:lr.type)==="preview"?lr.id:null}).filter(gn=>gn!==null);if(vt.length>0){const gn=vt[vt.length-1];return console.log("[autoConnectPreviewNode] 节点",e.id,"已有预览连接,使用最后连接的预览:",gn,"共",vt.length,"个"),gn}console.log("[autoConnectPreviewNode] 节点",e.id,"没有预览连接,将创建新的预览节点"),console.log("[autoConnectPreviewNode] 当前 nodes 总数:",t.length,"当前 connections 总数:",m.length);const Kt=j(),an=e.nodeName||(e.type==="gen-video"?"生成视频":"生成图片"),en=Ms(Kt,"preview",e.x+e.width+80,e.y,an,void 0,t);en.width=400,en.height=400,console.log("[autoConnectPreviewNode] 创建新预览节点:",Kt,"位置:",en.x,en.y),k(gn=>[...gn,en]);const rn={id:j(),from:e.id,to:Kt,fromPort:"output",toPort:"input"};return console.log("[autoConnectPreviewNode] 创建连接:",rn),v(gn=>[...gn,rn]),r(e.id,{settings:{...e.settings||{},selectedPreviewId:Kt}}),Kt},[e,t,m,j,k,v,r]),ze=h(e.id),_e=ze.filter(dt=>dt.type==="professional-camera"),Ee=ze.filter(dt=>dt.type==="camera-movement"),Ce=dt=>{var lr;const vt=(lr=dt.settings)==null?void 0:lr.cinemaConfig;if(!vt)return"";const Kt=[],an=lu.find(On=>On.id===vt.cameraId),en=cu.find(On=>On.id===vt.lensId),rn=uu.find(On=>On.id===vt.focalLengthId),gn=du.find(On=>On.id===vt.apertureId);return an&&Kt.push(`[${an.name}]`),en&&Kt.push(`[${en.name}]`),rn&&Kt.push(`[${rn.value}mm]`),gn&&Kt.push(`[${gn.value}]`),Kt.join(" + ")},xe=((Ir=e.settings)==null?void 0:Ir.model)||(e.type==="gen-image"?"qwen-image-edit":"sora-2"),ve=!gm(xe)&&(xe.includes("mj")||xe.toLowerCase().includes("midjourney"));xe.includes("jimeng");const ke=au(xe),Ie=No(xe),[Pe,Te]=_.useState(""),Be=_.useRef(null),[He,Je]=_.useState(!1),[Me,Re]=_.useState(null),[Ve,Ze]=_.useState(!1),je=_.useRef(null),[Le,Xe]=_.useState(!1),qe=_.useRef(xe),tt=_.useRef(null),Ye=_.useRef(null),[ct,pt]=_.useState(null);_.useEffect(()=>{if(qe.current!==xe&&(console.log("[Kling O1] 模型切换:",qe.current,"->",xe),console.log("[Kling O1] isKlingO1Model:",No(xe)),qe.current=xe,e.type==="gen-video"&&No(xe))){console.log("[Kling O1] 检查图片连接..."),console.log("[Kling O1] 当前节点ID:",e.id);const dt=m.filter(Kt=>Kt.to===e.id);console.log("[Kling O1] 所有连接到此节点的连接:",dt);const vt=dt.filter(Kt=>{const an=t.find(gn=>gn.id===Kt.from),en=an&&(an.type==="input-image"||an.type==="preview"),rn=!Kt.inputType||Kt.inputType==="image"||Kt.inputType==="start-frame"||Kt.inputType==="end-frame"||Kt.inputType==="reference-image"||Kt.inputType==="input-image";return console.log("[Kling O1] 检查连接:",{from:Kt.from,to:Kt.to,inputType:Kt.inputType,sourceNodeType:an==null?void 0:an.type,isImageNode:en,isImageInput:rn,willDisconnect:en&&rn}),en&&rn});if(console.log("[Kling O1] 找到图片连接:",vt.length,"个",vt),vt.length>0){console.log("[Kling O1] 断开图片连接");const Kt=new Set(vt.map(an=>an.id));v(an=>an.filter(en=>!Kt.has(en.id))),alert(`可灵 O1 模型不支持多图引用,已自动断开图片输入节点连接。 + +请使用"上传图片"按钮单独上传图片。`)}}},[xe,e.id,e.type,m,t,v]);const ht=440;_.useEffect(()=>{e.type!=="gen-video"||!Wo(xe)||(e.width??320)>=ht||r(e.id,{width:ht})},[e.type,e.id,e.width,xe,r]);const wt=_.useRef({}),$t=He,jt=!!((Wr=e.settings)!=null&&Wr.showVideoSegmentSelector),Nt=Me;(ir=e.settings)==null||ir.pendingVideoFile,(Yn=e.settings)==null||Yn.wan26AudioSegment,(Zn=e.settings)==null||Zn.klingVideoSegment;const Yt=dt=>{Je(dt),r(e.id,{settings:{...e.settings,showAudioSegmentSelector:dt}})},un=dt=>{Re(dt),r(e.id,{settings:{...e.settings,pendingAudioFile:dt}})},Tn=dt=>{r(e.id,{settings:{...e.settings,showVideoSegmentSelector:dt}})},Ht=_.useCallback((dt,vt)=>{Me&&(r(e.id,{settings:{...e.settings,wan26AudioFile:Me,wan26AudioSegment:{startTime:dt,endTime:vt},showAudioSegmentSelector:!1,pendingAudioFile:null}}),Je(!1),Re(null),Te(""))},[Me,e.id,e.settings,r]),fn=_.useCallback((dt,vt,Kt,an,en,rn)=>{console.log("[handleVideoSegmentConfirm] 收到参数:",{fileName:dt.name,startTime:vt,endTime:Kt,videoUrl:an,referType:en,keepOriginalSound:rn}),wt.current={klingVideoUrl:an,klingVideoReferType:en||"base",klingVideoKeepSound:rn||"yes",klingVideoSegment:{startTime:vt,endTime:Kt}},console.log("[handleVideoSegmentConfirm] 已保存到 ref:",wt.current);const gn={...e.settings,klingVideoFile:dt,klingVideoSegment:{startTime:vt,endTime:Kt},klingVideoUrl:an,klingVideoReferType:en||"base",klingVideoKeepSound:rn||"yes",showVideoSegmentSelector:!1,pendingVideoFile:null};let lr=e.prompt||"";an&&!lr.includes("<<>>")&&(lr=lr?`${lr} <<>>`:"<<>>",console.log("[handleVideoSegmentConfirm] 将插入 <<>> 到提示词")),r(e.id,{settings:gn,prompt:lr}),console.log("[handleVideoSegmentConfirm] 已更新节点,videoUrl:",an,"prompt:",lr)},[e.id,e.prompt,e.settings,r]),Dn=e.type==="gen-image"?"Image":"Video",it=a.filter(dt=>dt.type===Dn),Lt=W?W(it):it,gt=a.find(dt=>dt.id===xe||xe==="nano-banana-hd"&&dt.id==="nano-banana"),Jt=_.useCallback(dt=>{if(dt.preventDefault(),dt.stopPropagation(),Lt.length===0)return;const vt=Lt.findIndex(lr=>lr.id===xe),Kt=dt.deltaY>0?1:-1;let an=vt+Kt;if(an<0&&(an=0),an>=Lt.length&&(an=Lt.length-1),an===vt)return;const en=Lt[an],rn=im(en.id),gn={...e.settings||{},model:en.id};rn&&(rn.aspectRatio&&(gn.ratio=rn.aspectRatio),rn.resolution&&(gn.resolution=rn.resolution),rn.imageCount&&(gn.batchCount=rn.imageCount),rn.videoDuration&&(gn.duration=`${rn.videoDuration}s`),rn.videoResolution&&(gn.resolution=rn.videoResolution)),r(e.id,{settings:gn}),A2(e.type,en.id)},[Lt,xe,im,e.id,e.settings,r]),Wt=z5(xe),Pt=eu(xe),Bt=_.useMemo(()=>u(e.id),[u,e.id,M]),zt=_.useMemo(()=>{if(e.type!=="gen-video"||!E0(xe)||!m||!t)return[];const dt=m.filter(gn=>gn.to===e.id&&(!gn.inputType||gn.inputType==="default")),vt=gn=>{if(!gn)return!1;if(gn.startsWith("data:audio/"))return!0;const lr=gn.toLowerCase();return lr.includes(".mp3")||lr.includes(".wav")||lr.includes(".ogg")||lr.includes(".m4a")||lr.includes(".aac")},Kt=[];let an=0,en=0,rn=0;return dt.forEach((gn,lr)=>{var Ns,Di,ii,Hs,ji,na,ui;const On=t.find(fs=>fs.id===gn.from);if(!On||On.type==="camera-movement"||On.type==="professional-camera")return;let wr,cs="image";if(On.type==="preview")On.selectedPreviewImage?wr=On.selectedPreviewImage:(Ns=On.previewMjImages)!=null&&Ns[0]?wr=On.previewMjImages[0]:On.content&&(wr=On.content),cs=On.previewType==="video"?"video":"image";else if(On.type==="canvas-node")On.content?wr=On.content:(Di=On.settings)!=null&&Di.canvasData&&(wr=`canvas-node:${On.id}`);else if(On.type==="rh-app"){const fs=(ii=On.settings)==null?void 0:ii.generatedImages;fs!=null&&fs.length?wr=fs[0].fullUrl:On.content&&(wr=On.content)}else if(On.type==="gen-music")wr=(Hs=On.settings)==null?void 0:Hs.audioUrl,cs="audio";else if(On.type==="video-input"&&On.content)wr=On.content,cs="video";else if(On.content){const fs=On.content,Js=(ji=On.settings)==null?void 0:ji.mediaType;Js?cs=Js:xb(fs)?cs="video":vt(fs)&&(cs="audio"),wr=fs}if(!wr)return;if(cs==="image"){const fs=String(wr).toLowerCase(),Js=fs.startsWith("data:video/")||fs.includes(".mp4")||fs.includes(".mov")||fs.includes(".webm")||fs.includes("/doc_video/")||fs.includes("/video/"),Ai=On.type==="video-input"||On.previewType==="video"||!!On.videoMeta||((na=On.settings)==null?void 0:na.mediaType)==="video";(Js||Ai)&&(cs="video")}const Ar=`seedance-conn-${gn.from}-${lr}`;let Or;cs==="image"?Or=`图片${++an}`:cs==="video"?Or=`视频${++en}`:Or=`音频${++rn}`;const ls=cs==="image"?(ui=On.settings)==null?void 0:ui.seedanceAssetUrl:void 0;Kt.push({id:Ar,type:cs,name:Or,url:wr,assetUrl:ls})}),Kt},[e.id,e.type,xe,m,t,M]);_.useEffect(()=>{var en;if(e.type!=="gen-video"||!E0(xe))return;const dt=zt,vt=((en=e.settings)==null?void 0:en.seedanceMaterials)||[],Kt=vt.filter(rn=>!rn.id.startsWith("seedance-conn-")),an=dt.length>0?[...dt,...Kt]:Kt;(JSON.stringify(an.map(rn=>rn.id))!==JSON.stringify(vt.map(rn=>rn.id))||JSON.stringify(an.map(rn=>rn.url))!==JSON.stringify(vt.map(rn=>rn.url))||JSON.stringify(an.map(rn=>rn.assetUrl||""))!==JSON.stringify(vt.map(rn=>rn.assetUrl||"")))&&r(e.id,{settings:{...e.settings,seedanceMaterials:an}})},[e.type,e.id,e.settings,xe,zt,r]);const Gt=_.useMemo(()=>{var vt;return e.type!=="gen-video"||!E0(xe)?[]:(((vt=e.settings)==null?void 0:vt.seedanceMaterials)||[]).map(Kt=>Kt.url)},[e.type,(Ke=e.settings)==null?void 0:Ke.seedanceMaterials,xe]),qt=iu(Gt,{useOriginal:!0}),De=_.useMemo(()=>{var dt;if(e.type==="gen-video"&&E0(xe))return((dt=e.settings)==null?void 0:dt.seedanceMaterials)||[]},[e.type,xe,(Et=e.settings)==null?void 0:Et.seedanceMaterials]),st=_.useMemo(()=>!m||!t?!1:m.filter(vt=>vt.to===e.id&&(!vt.inputType||vt.inputType==="default")).some(vt=>{var an;const Kt=t.find(en=>en.id===vt.from);return(Kt==null?void 0:Kt.type)==="input-image"&&((an=Kt.settings)==null?void 0:an.textEditData)}),[m,t,e.id,M]),[Ae,nt]=_.useState({});_.useEffect(()=>{const dt=vt=>{const{nodeId:Kt,lightingSettings:an,prompt:en}=vt.detail;m.some(gn=>gn.from===Kt&&gn.to===e.id)&&an.isActive&&(console.log("[GenImageVideoNode] 接收到灯光数据:",{nodeId:Kt,lightingSettings:an,prompt:en}),nt(gn=>({...gn,[Kt]:{settings:an,prompt:en}})))};return window.addEventListener("inputImageLightingUpdated",dt),()=>{window.removeEventListener("inputImageLightingUpdated",dt)}},[m,e.id]);const _t=xe.includes("nano-banana-2")||xe.includes("gemini-3.1-flash-image-preview"),xt=_.useMemo(()=>{if(!m||!t)return null;const dt=m.find(Kt=>Kt.to===e.id&&(!Kt.inputType||Kt.inputType==="default"));if(!dt)return null;const vt=t.find(Kt=>Kt.id===dt.from);return vt&&vt.type==="storyboard-node"?vt:null},[m,t,e.id,M]),Tt=_.useMemo(()=>{var vt;if(!xt)return null;const dt=(vt=xt.settings)==null?void 0:vt.jsonData;return dt||null},[xt]),St=_.useMemo(()=>{if(!Tt)return null;try{return JSON.parse(Tt)}catch(dt){return console.error("[GenImage] 解析分镜JSON数据失败:",dt),null}},[Tt]),Qe=_.useMemo(()=>{if(!m||!t)return[];const dt=m.reduce((en,rn)=>{if(rn.to===e.id){const gn=rn.to;en.has(gn)||en.set(gn,[]),en.get(gn).push(rn)}return en},new Map),vt=new Map(t.map(en=>[en.id,en])),Kt=[],an=dt.get(e.id)||[];for(const en of an){const rn=vt.get(en.from);(rn==null?void 0:rn.type)==="text-node"&&Kt.push(rn)}return Kt},[e.id,m,t,M]),Ue=_.useMemo(()=>{if(!m||!t)return[];const dt=m.reduce((en,rn)=>{if(rn.to===e.id){const gn=rn.to;en.has(gn)||en.set(gn,[]),en.get(gn).push(rn)}return en},new Map),vt=new Map(t.map(en=>[en.id,en])),Kt=[],an=dt.get(e.id)||[];for(const en of an){const rn=vt.get(en.from);(rn==null?void 0:rn.type)==="custom-agent"&&Kt.push(rn)}return Kt},[e.id,m,t,M]),Ge=_.useMemo(()=>{var Kt,an;const dt=new Map(t.map(en=>[en.id,en])),vt=[];if(xt&&Tt)return Tt;if(Qe.length>0)for(const en of Qe){const rn=dt.get(en.id)||en,gn=((Kt=rn.settings)==null?void 0:Kt.text)||"",lr=rn.prompt||"",On=rn.content||"",wr=(gn||lr||On).trim();wr.length>0&&vt.push(wr)}if(Ue.length>0)for(const en of Ue){const gn=(((an=(dt.get(en.id)||en).settings)==null?void 0:an.outputContent)||"").trim();gn.length>0&&vt.push(gn)}return vt.join(` + +`)},[Qe,Ue,xt,Tt,t,e.id,m]),at=_.useRef("");_.useEffect(()=>{if(xt&&Tt&&Tt.trim()){const dt=e.prompt||"";if(!dt||dt===at.current){const vt=setTimeout(()=>{r(e.id,{prompt:Tt}),at.current=Tt},100);return()=>clearTimeout(vt)}else if(dt!==at.current&&Tt!==at.current&&dt.trim().startsWith("{")&&dt.trim().endsWith("}")){const Kt=setTimeout(()=>{r(e.id,{prompt:Tt}),at.current=Tt},100);return()=>clearTimeout(Kt)}}else xt||(at.current="")},[xt,Tt,e.id,e.prompt,r]);const rt=e.prompt&&e.prompt.trim().length>0,lt=!rt&&!xt&&(Ue.length>0||Qe.length>0),ot=_.useMemo(()=>{var an;if(!m||!t)return{angleAugmentedPrompt:"",angleConfig:null};const dt=m.filter(en=>en.to===e.id&&(!en.inputType||en.inputType==="default"));let vt="",Kt=null;for(const en of dt){const rn=t.find(gn=>gn.id===en.from);if((rn==null?void 0:rn.type)==="input-image"){const gn=(an=rn.settings)==null?void 0:an.multiAngle;if(gn){Kt=gn;const lr=XP(gn);if(lr.augmentedPrompt){vt=lr.augmentedPrompt;break}}}}return{angleConfig:Kt,angleAugmentedPrompt:vt}},[m,t,e.id,be]),At=_.useMemo(()=>{if(!m||!t)return{hasMarkers:!1,markerDescriptions:[]};const dt=m.filter(Kt=>Kt.to===e.id&&(!Kt.inputType||Kt.inputType==="default")),vt=[];return dt.forEach(Kt=>{const an=t.find(en=>en.id===Kt.from);if(an&&an.type==="input-image"&&an.markers&&an.markers.length>0){const en=an.markers.filter(rn=>rn.label&&rn.label.trim()&&!rn.isAnalyzing);if(en.length>0){const rn=an.width||512,gn=an.height||512,lr=en.map((On,wr)=>{const cs=Math.round(On.x/100*rn),Ar=Math.round(On.y/100*gn),Or=Math.round(On.x),ls=Math.round(On.y);return`${wr+1}. [位置: (${cs}, ${Ar})px / (${Or}%, ${ls}%)] ${On.label}`}).join(` +`);vt.push(lr)}}}),{hasMarkers:vt.length>0,markerDescriptions:vt}},[m,t,e.id]),[kt,Ot]=_.useState(null),[dn,Vt]=_.useState(null),Zt=_.useMemo(()=>{if(!m||!t)return new Map;const dt=new Map;return m.filter(Kt=>Kt.to===e.id&&(!Kt.inputType||Kt.inputType==="default")).forEach(Kt=>{const an=t.find(rn=>rn.id===Kt.from);if(!an||an.type==="camera-movement"||an.type==="professional-camera")return;(()=>{var rn,gn;if(an.type==="preview"){if(an.selectedPreviewImage)return[an.selectedPreviewImage];if(an.previewMjImages&&an.previewMjImages.length>0)return[an.previewMjImages[0]];if(an.content)return[an.content]}else if(an.type==="canvas-node"){if(an.content)return[an.content];if((rn=an.settings)!=null&&rn.canvasData)return[`canvas-node:${an.id}`]}else if(an.type==="rh-app"){const lr=(gn=an.settings)==null?void 0:gn.generatedImages;if(lr!=null&&lr.length)return lr.map(On=>On.fullUrl);if(an.content)return[an.content]}else if(an.content)return[an.content];return[]})().forEach(rn=>dt.set(rn,Kt.from))}),dt},[m,t,e.id]),Sn=_.useCallback((dt,vt)=>{vt.preventDefault(),vt.stopPropagation();const Kt=Zt.get(dt);Kt&&v(an=>an.filter(en=>!(en.from===Kt&&en.to===e.id)))},[Zt,e.id,v]),jn=_.useCallback((dt,vt)=>{if(dt===vt||dt<0||vt<0||dt>=Bt.length||vt>=Bt.length)return;const Kt=[...Bt],[an]=Kt.splice(dt,1);Kt.splice(vt,0,an),r(e.id,{settings:{...e.settings,inputImageOrder:Kt}}),Vt(null)},[Bt,e.id,e.settings,r]),_n=()=>e.type==="gen-video"&&E0(xe)||Bt.length===0?null:s.jsxs("div",{className:"mb-2 relative",children:[(Tr()||st||Object.keys(Ae).length>0)&&s.jsxs("div",{className:"flex items-center gap-1.5 mb-1.5",children:[Tr(),st&&s.jsxs("span",{className:`text-[10px] font-medium flex items-center gap-1 px-2 py-0.5 rounded border ${n?"bg-zinc-800/40 text-zinc-300 border-zinc-600/30":"bg-orange-100 text-orange-700 border-orange-300"}`,title:"上游节点包含文字编辑数据",children:[s.jsx(M5,{size:10}),"文字编辑"]}),Object.keys(Ae).length>0&&s.jsxs("span",{className:`text-[10px] font-medium flex items-center gap-1 px-2 py-0.5 rounded border ${n?"bg-zinc-800/40 text-zinc-300 border-zinc-600/30":"bg-yellow-100 text-yellow-700 border-yellow-300"}`,title:Object.values(Ae).map(dt=>dt.prompt).join(` +`),children:[s.jsx("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"currentColor",children:s.jsx("path",{d:"M9 21c0 .55.45 1 1 1h4c.55 0 1-.45 1-1v-1H9v1zm3-19C8.14 2 5 5.14 5 9c0 2.38 1.19 4.47 3 5.74V17c0 .55.45 1 1 1h6c.55 0 1-.45 1-1v-2.26c1.81-1.27 3-3.36 3-5.74 0-3.86-3.14-7-7-7z"})}),"灯光 ",Object.keys(Ae).length]})]}),s.jsxs("div",{className:"flex gap-1.5 overflow-visible items-center flex-wrap",onDragOver:dt=>{dt.preventDefault(),dt.stopPropagation(),dt.dataTransfer.dropEffect="move"},children:[Bt.slice(0,hl(xe)?7:14).map((dt,vt)=>s.jsxs("div",{"data-image-reorder-thumb":!0,className:`relative shrink-0 cursor-grab active:cursor-grabbing touch-none select-none ${dn===vt?"opacity-60 scale-95":""}`,title:"长按拖拽可调换图片顺序",draggable:!0,onMouseEnter:()=>Ot(vt),onMouseLeave:()=>Ot(null),onDragStart:Kt=>{if(Kt.target.closest("button")){Kt.preventDefault();return}Kt.dataTransfer.setData("text/plain",String(vt)),Kt.dataTransfer.effectAllowed="move",Kt.stopPropagation(),Vt(vt)},onDragEnd:Kt=>{Kt.stopPropagation(),Vt(null)},onDragEnter:Kt=>{Kt.preventDefault(),Kt.stopPropagation(),Kt.dataTransfer.dropEffect="move"},onDragOver:Kt=>{Kt.preventDefault(),Kt.stopPropagation(),Kt.dataTransfer.dropEffect="move"},onDrop:Kt=>{Kt.preventDefault(),Kt.stopPropagation();const an=Number(Kt.dataTransfer.getData("text/plain"));!Number.isNaN(an)&&an!==vt&&jn(an,vt)},children:[s.jsx("span",{className:"absolute -top-1 -left-1 w-3.5 h-3.5 text-[8px] font-semibold rounded-full bg-zinc-700 text-white select-none flex items-center justify-center border border-white/70 shadow-sm leading-none pointer-events-none",style:{zIndex:30},children:vt+1}),s.jsx("button",{onClick:Kt=>Sn(dt,Kt),className:`absolute -top-1 -right-1 w-3.5 h-3.5 rounded-full flex items-center justify-center transition-opacity ${kt===vt?"opacity-100":"opacity-0"} ${n?"bg-red-600 hover:bg-red-500":"bg-red-500 hover:bg-red-600"} text-white shadow-lg`,style:{zIndex:31},title:"取消引用",children:s.jsx("svg",{width:"6",height:"6",viewBox:"0 0 8 8",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:s.jsx("path",{d:"M1 1L7 7M7 1L1 7",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})})}),s.jsx("div",{className:`relative w-9 h-9 rounded border cursor-pointer overflow-hidden ${n?"border-zinc-700 bg-zinc-800":"border-zinc-300 bg-zinc-200"}`,onClick:Kt=>{Kt.stopPropagation();const an=document.querySelector(`[data-node-type="gen-node"][data-node-id="${e.id}"]`);if(!an)return;an.focus();const en=window.getSelection();if(!en)return;if(en.rangeCount===0){const gn=document.createRange();gn.selectNodeContents(an),gn.collapse(!1),en.removeAllRanges(),en.addRange(gn)}const rn=hl(xe)?`@img${vt+1} `:`@${vt+1}`;document.execCommand("insertText",!1,rn)},children:s.jsx(Mg,{src:dt,className:"w-full h-full object-cover",alt:`参考图 ${vt+1}`,isDark:n})})]},vt)),s.jsx("div",{className:`relative shrink-0 w-9 h-9 rounded border border-dashed flex items-center justify-center cursor-pointer transition-colors ${n?"border-zinc-700 bg-zinc-900/30 hover:border-zinc-600 hover:bg-zinc-800/50":"border-zinc-300 bg-zinc-50 hover:border-zinc-400 hover:bg-zinc-100"}`,title:"可以继续连接更多图片节点",children:s.jsx("svg",{width:"16",height:"16",viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:s.jsx("path",{d:"M10 5V15M5 10H15",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",className:n?"text-zinc-600":"text-zinc-400"})})})]})]}),Cn=()=>{if(xt&&St){const dt=St.shots||[];return s.jsx("div",{className:`mb-2 p-2 rounded border ${n?"bg-transparent border-white/30":"bg-blue-50 border-blue-200"}`,children:s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(Vo,{size:12,className:n?"text-white":"text-blue-600"}),s.jsxs("span",{className:`text-xs ${n?"text-white":"text-blue-700"}`,children:["已连接分镜节点,读取到 ",dt.length," 个镜头的JSON数据"]})]})})}return Qe.length===0&&Ue.length===0?null:s.jsxs("div",{className:`mb-2 flex items-center gap-1.5 px-2 py-1 rounded text-[10px] border ${n?"bg-transparent border-white/30":"bg-blue-50 border border-blue-200"}`,children:[s.jsx("span",{className:n?"text-white":"text-blue-500",children:"📝"}),s.jsxs("span",{className:n?"text-white":"text-blue-700",children:["上游已连接:",Qe.length>0&&s.jsxs("span",{children:["文字节点(",Qe.length,"个)"]}),Qe.length>0&&Ue.length>0&&s.jsx("span",{children:" + "}),Ue.length>0&&s.jsxs("span",{children:["Agent节点(",Ue.length,"个)"]})]})]})},Kn=()=>{if(Ee.length===0)return null;let dt=0;return Ee.forEach(vt=>{var an;const Kt=(an=vt.settings)==null?void 0:an.movementConfig;Kt&&(Kt.movementId&&dt++,Kt.directionId&&dt++,Kt.angleId&&dt++,Kt.speedId&&dt++,Kt.styleId&&dt++,Kt.deviceId&&dt++)}),dt===0?null:s.jsxs("div",{className:`px-2 pt-1 pb-1 flex items-center gap-1 text-[10px] ${n?"text-white/70":"text-cyan-600"}`,children:[s.jsx("span",{children:"🎬"}),s.jsxs("span",{children:["包含 ",dt," 个运镜设置"]})]})},Xn=()=>_e.length===0?null:s.jsxs("div",{className:`px-2 pt-2 pb-1 flex flex-wrap gap-1 items-center ${n?"border-white/30":"border-zinc-200"}`,children:[s.jsx("span",{className:"text-[10px]",children:"📷"}),_e.map(dt=>{const vt=Ce(dt);return vt?s.jsx("span",{className:`text-[11px] px-1.5 py-0.5 rounded font-medium border ${n?"bg-transparent text-white/70 border-white/30":"bg-blue-100 text-blue-700 border-transparent"}`,children:vt},dt.id):null})]}),$r=()=>ot.angleConfig?s.jsxs("div",{className:`px-2 pt-1 pb-1 flex items-center gap-1 text-[10px] rounded ${ot.angleConfig.isActive?n?"bg-zinc-800/40 text-zinc-300 border border-zinc-600/30":"bg-blue-50 text-blue-600 border border-blue-200":n?"bg-zinc-700/30 text-zinc-400 border border-zinc-600/30":"bg-zinc-100 text-zinc-500 border border-zinc-300"}`,children:[s.jsx("span",{children:"📸"}),s.jsx("span",{children:"3D角度:"}),ot.angleConfig.isActive?s.jsx(s.Fragment,{children:s.jsx("span",{className:"font-medium",children:"已启动"})}):s.jsx("span",{className:"text-zinc-500",children:"已配置但未启用"})]}):null,Tr=()=>{if(!At.hasMarkers)return null;const dt=At.markerDescriptions.reduce((vt,Kt)=>vt+(Kt.match(/\n/g)||[]).length+1,0);return s.jsxs("div",{className:`inline-flex items-center gap-1 px-2 py-1 rounded text-[10px] font-medium ${n?"bg-zinc-800/40 text-zinc-300 border border-zinc-600/30":"bg-white text-cyan-600 border border-cyan-300"}`,children:[s.jsx("span",{children:"📍"}),s.jsxs("span",{children:["文字标记 (",dt,")"]})]})},kr=()=>{var gn;if(e.type!=="gen-video"||!Kd(xe)||!((gn=e.settings)!=null&&gn.veoFramesMode))return null;const dt=d(e.id,"veo_start"),vt=d(e.id,"veo_end"),Kt=fu(xe),an=zc(xe),en=Wo(xe),rn=dt||vt;return s.jsxs("div",{className:`mb-2 rounded-lg p-3 space-y-2 ${n?"bg-transparent border-0":"bg-emerald-50 border border-emerald-200"}`,onMouseDown:lr=>lr.stopPropagation(),children:[s.jsxs("div",{className:"relative flex items-center gap-2",children:[s.jsx("div",{className:`w-2 h-2 rounded-full cursor-crosshair transition-all ${f===e.id&&b==="veo_start"?n?"bg-white/80 ring-2 ring-white/40":"bg-emerald-500 ring-2 ring-emerald-400":dt?n?"bg-white/80":"bg-green-500":n?"bg-zinc-600 hover:bg-zinc-500":"bg-zinc-400 hover:bg-zinc-500"}`,style:{position:"absolute",left:"-8px",top:"50%",transform:"translateY(-50%)",zIndex:20},title:"首帧输入","data-input-type":"veo_start",onMouseDown:lr=>Rr(lr,"veo_start"),onMouseUp:lr=>sr(lr,"veo_start")}),s.jsxs("div",{className:"flex items-center justify-between flex-1 ml-1",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:`text-[10px] font-medium ${n?"text-white/80":"text-zinc-600"}`,children:"● 首帧"}),dt&&s.jsx("div",{className:`w-1.5 h-1.5 rounded-full ${n?"bg-white/80":"bg-green-500"}`})]}),dt&&s.jsx("div",{className:"w-8 h-8 rounded overflow-hidden border border-zinc-700/40",children:s.jsx(Mg,{src:dt,className:"w-full h-full object-cover",alt:"首帧",isDark:n})}),!dt&&s.jsx("span",{className:`text-[10px] ${n?"text-zinc-600":"text-zinc-400"}`,children:"未连接"})]})]}),s.jsxs("div",{className:"relative flex items-center gap-2",children:[s.jsx("div",{className:`w-2 h-2 rounded-full cursor-crosshair transition-all ${f===e.id&&b==="veo_end"?n?"bg-white/80 ring-2 ring-white/40":"bg-emerald-500 ring-2 ring-emerald-400":vt?n?"bg-white/80":"bg-green-500":n?"bg-zinc-600 hover:bg-zinc-500":"bg-zinc-400 hover:bg-zinc-500"}`,style:{position:"absolute",left:"-8px",top:"50%",transform:"translateY(-50%)",zIndex:20},title:"尾帧输入","data-input-type":"veo_end",onMouseDown:lr=>Rr(lr,"veo_end"),onMouseUp:lr=>sr(lr,"veo_end")}),s.jsxs("div",{className:"flex items-center justify-between flex-1 ml-1",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:`text-[10px] font-medium ${n?"text-white/80":"text-zinc-600"}`,children:"● 尾帧"}),vt&&s.jsx("div",{className:`w-1.5 h-1.5 rounded-full ${n?"bg-white/80":"bg-green-500"}`})]}),vt&&s.jsx("div",{className:"w-8 h-8 rounded overflow-hidden border border-zinc-700/40",children:s.jsx(Mg,{src:vt,className:"w-full h-full object-cover",alt:"尾帧",isDark:n})}),!vt&&s.jsx("span",{className:`text-[10px] ${n?"text-zinc-600":"text-zinc-400"}`,children:"未连接"})]})]}),(Kt||an||en)&&rn&&s.jsxs("div",{className:`text-[10px] px-2 py-1 rounded ${n?"bg-blue-900/30 text-blue-300 border border-blue-700/50":"bg-blue-50 text-blue-700 border border-blue-200"}`,children:["⚡ 首尾帧模式下已自动切换到 ",s.jsx("span",{className:"font-semibold",children:"pro (高表现)"})," 模式"]})]})},Rr=(dt,vt)=>{var an;dt.stopPropagation(),dt.preventDefault();const Kt=(an=z.current)==null?void 0:an.getBoundingClientRect();if(Kt){const en=(dt.clientX-Kt.left-C.x)/C.zoom,rn=(dt.clientY-Kt.top-C.y)/C.zoom;E({x:en,y:rn})}y(e.id),w(vt)},sr=(dt,vt)=>{if(dt.stopPropagation(),p&&p!==e.id){if(!m)return;m.some(an=>an.from===p&&an.to===e.id&&an.inputType===vt)||(v(an=>an.filter(en=>!(en.to===e.id&&en.inputType===vt))),v(an=>[...an,{id:vt==="oref"||vt==="sref"?j():`conn-${Date.now()}`,from:p,to:e.id,inputType:vt}])),g(null)}},mt=!!((Gn=e.settings)!=null&&Gn.isCollapsed);e.type;const It=_.useMemo(()=>{var Kt;if(e.type!=="gen-video"||!((Kt=e.settings)!=null&&Kt.veoFramesMode)||!Kd(xe))return[];const dt=d(e.id,"veo_start"),vt=d(e.id,"veo_end");return[dt,vt].filter(an=>!!an)},[e.id,e.type,(Ut=e.settings)==null?void 0:Ut.veoFramesMode,xe,d,m,M]),tn=(e.type==="gen-video"&&E0(xe)?(((Nr=(Bn=e.settings)==null?void 0:Bn.seedanceMaterials)==null?void 0:Nr.length)??0)>0:Bt.length>0)||It.length>0,cn=_.useCallback(()=>{var Kt,an,en;const dt=!mt,vt=ve?440:420;if(dt){const rn=tn?90:52,gn=(Kt=e.settings)!=null&&Kt.hasCustomSize&&e.settings.savedNodeHeight!=null?e.settings.savedNodeHeight:e.height||vt;r(e.id,{settings:{...e.settings||{},isCollapsed:!0,_expandedHeight:gn,savedNodeHeight:rn},height:rn})}else{const rn=((an=e.settings)==null?void 0:an._expandedHeight)||vt,lr=Math.max(rn,ve?440:340);r(e.id,{settings:{...e.settings||{},isCollapsed:!1,savedNodeHeight:(en=e.settings)!=null&&en.hasCustomSize?lr:void 0},height:lr})}},[mt,ve,e.id,e.type,e.height,e.settings,r,tn]),zn=_.useRef(tn);_.useEffect(()=>{if(mt){const dt=tn?90:52;zn.current!==tn&&e.height!==dt&&r(e.id,{height:dt,settings:{...e.settings,savedNodeHeight:dt}})}zn.current=tn},[mt,tn]);const Rn=440;_.useEffect(()=>{!mt&&ve&&e.height&&e.height{const dt=bt.current===!0,vt=mt&&dt&&e.isGenerating===!1,Kt=mt&&bn.current===!1;bt.current=e.isGenerating,bn.current=mt,(vt||Kt)&&(An.current=!1,V(an=>(an==null?void 0:an.nodeId)===e.id&&(an==null?void 0:an.type)==="collapsed-prompt"?null:an))},[mt,e.id,e.isGenerating,V]);const Vn=(B==null?void 0:B.nodeId)===e.id&&(B==null?void 0:B.type)==="collapsed-prompt"&&An.current;if(mt){const dt=It.length>0?It:e.type==="gen-video"&&E0(xe)?(((br=e.settings)==null?void 0:br.seedanceMaterials)||[]).map(vt=>vt.url):Bt;return s.jsxs("div",{className:"relative w-full h-full flex flex-col min-w-0 pointer-events-auto px-2.5 py-1.5 gap-1 justify-center",children:[dt.length>0&&s.jsxs("div",{className:"flex items-center gap-1.5",children:[s.jsx("div",{className:"flex -space-x-1.5 items-center",children:dt.slice(0,8).map((vt,Kt)=>s.jsx("div",{className:`relative shrink-0 w-6 h-6 rounded-full border-2 overflow-hidden ${n?"border-[#18181b] bg-zinc-800":"border-white bg-zinc-200"}`,style:{zIndex:10-Kt},children:s.jsx(Mg,{src:vt,className:"w-full h-full object-cover",alt:`参考图 ${Kt+1}`,isDark:n})},Kt))}),s.jsxs("span",{className:`text-[9px] shrink-0 ${n?"text-zinc-500":"text-zinc-400"}`,children:[dt.length,"张引用"]})]}),s.jsxs("div",{className:"flex items-center gap-1",children:[s.jsxs("div",{className:"relative flex-1 min-w-0","data-model-select-area":!0,children:[s.jsx("button",{title:gt==null?void 0:gt.provider,onClick:vt=>{vt.preventDefault(),vt.stopPropagation(),V((B==null?void 0:B.type)==="model"&&B.nodeId===e.id?null:{nodeId:e.id,type:"model"})},onMouseDown:vt=>vt.stopPropagation(),className:`node-dropdown-button flex items-center gap-1.5 pl-1 pr-2 py-0.5 rounded text-[10px] transition-colors border w-full ${n?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:s.jsx("span",{className:"truncate",children:(gt==null?void 0:gt.provider)||"Model"})}),(B==null?void 0:B.nodeId)===e.id&&B.type==="model"&&s.jsx("div",{className:`node-dropdown-menu absolute bottom-full left-0 mb-1 w-48 rounded-lg shadow-xl p-1 z-[100] border max-h-64 overflow-y-auto rh-scroll-minimal custom-scrollbar ${n?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:vt=>vt.stopPropagation(),onWheel:Jt,children:Lt.map(vt=>{var Kt,an,en;return s.jsx("button",{onClick:()=>{const rn=im(vt.id),gn={...e.settings||{},model:vt.id};rn&&(rn.aspectRatio&&(gn.ratio=rn.aspectRatio),rn.resolution&&(gn.resolution=rn.resolution),rn.imageCount&&(gn.batchCount=rn.imageCount),rn.videoDuration&&(gn.duration=`${rn.videoDuration}s`),rn.videoResolution&&(gn.resolution=rn.videoResolution)),r(e.id,{settings:gn}),A2(e.type,vt.id),V(null)},className:`w-full flex items-center justify-between px-2 py-1.5 rounded text-left transition-colors ${n?"hover:bg-zinc-800 text-zinc-300":"hover:bg-zinc-100 text-zinc-700"} ${xe===vt.id?n?"bg-zinc-800":"bg-zinc-100":""}`,children:s.jsxs("span",{className:"text-xs font-medium truncate",children:[vt.provider??"",((Kt=vt.provider)!=null&&Kt.startsWith("Seedream")||(an=vt.provider)!=null&&an.startsWith("Seedance"))&&!((en=vt.provider)!=null&&en.includes("API"))?" Official":""]})},vt.id)})})]}),s.jsxs("div",{className:"relative shrink-0",children:[s.jsx("button",{onClick:vt=>{vt.stopPropagation(),V((B==null?void 0:B.type)==="ratio"&&B.nodeId===e.id?null:{nodeId:e.id,type:"ratio"})},onMouseDown:vt=>vt.stopPropagation(),className:`node-dropdown-button flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] border ${n?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:((vr=e.settings)==null?void 0:vr.ratio)||"Auto"}),(B==null?void 0:B.nodeId)===e.id&&B.type==="ratio"&&s.jsx("div",{className:`node-dropdown-menu absolute bottom-full left-1/2 -translate-x-1/2 mb-1 min-w-fit max-w-[90vw] rounded-lg shadow-xl z-[100] border ${n?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:vt=>vt.stopPropagation(),children:s.jsx(F$,{isDark:n,selectedRatio:((gr=e.settings)==null?void 0:gr.ratio)||"Auto",filterRatios:Wt,onSelect:vt=>{r(e.id,{settings:{...e.settings||{},ratio:vt}}),Kc(xe,{aspectRatio:vt}),V(null)}})})]}),Pt.length>0&&!ve&&s.jsxs("div",{className:"relative shrink-0",children:[s.jsx("button",{onClick:vt=>{vt.stopPropagation(),V((B==null?void 0:B.type)==="resolution"&&B.nodeId===e.id?null:{nodeId:e.id,type:"resolution"})},onMouseDown:vt=>vt.stopPropagation(),className:`node-dropdown-button flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] border ${n?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:((nr=e.settings)==null?void 0:nr.resolution)||Pt[0]}),(B==null?void 0:B.nodeId)===e.id&&B.type==="resolution"&&s.jsx("div",{className:`node-dropdown-menu absolute bottom-full left-1/2 -translate-x-1/2 mb-1 rounded-lg shadow-xl p-1 z-[100] border ${n?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:vt=>vt.stopPropagation(),children:s.jsx("div",{className:"flex flex-nowrap items-center gap-0.5",children:Pt.map(vt=>{var Kt;return s.jsx("button",{onClick:()=>{r(e.id,{settings:{...e.settings||{},resolution:vt}}),Kc(xe,{resolution:vt}),V(null)},className:`px-2 py-1 rounded text-[10px] transition-colors shrink-0 ${n?"hover:bg-zinc-800 text-zinc-300":"hover:bg-zinc-100 text-zinc-700"} ${((Kt=e.settings)==null?void 0:Kt.resolution)===vt?n?"bg-zinc-800":"bg-zinc-100":""}`,children:vt},vt)})})})]}),s.jsxs("span",{className:"inline-flex items-center gap-0.5 shrink-0",children:[e.isGenerating&&s.jsx(zr,{size:10,className:"animate-spin shrink-0 text-current"}),s.jsx("button",{className:`p-1 rounded-md border active:scale-95 shrink-0 transition-all ${n?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,onMouseDown:vt=>vt.stopPropagation(),onClick:vt=>{vt.stopPropagation(),re(!0);const Kt=m.find(an=>an.from===e.id&&t.find(en=>en.id===an.to&&en.type==="preview"));Kt!=null&&Kt.to&&window.dispatchEvent(new CustomEvent("previewGenerationStarted",{detail:{targetPreviewId:Kt.to}})),N({...e,prompt:e.prompt||""})},title:"生成",children:s.jsx(Ia,{size:10,fill:"currentColor"})})]}),s.jsx("button",{className:`p-1 rounded transition-colors shrink-0 ${n?"hover:bg-zinc-800 text-zinc-500 hover:text-zinc-300":"hover:bg-zinc-200 text-zinc-400 hover:text-zinc-600"}`,onMouseDown:vt=>vt.stopPropagation(),onClick:vt=>{vt.stopPropagation(),cn()},title:"展开节点",children:s.jsx(jh,{size:12})})]}),s.jsx("div",{className:"w-full flex items-end justify-center cursor-pointer group/prompt-line pt-1 pb-0",onMouseDown:vt=>vt.stopPropagation(),onClick:vt=>{vt.stopPropagation(),An.current=!0,V((B==null?void 0:B.type)==="collapsed-prompt"&&B.nodeId===e.id?null:{nodeId:e.id,type:"collapsed-prompt"})},children:s.jsx("div",{className:`w-10 h-[2px] rounded-full transition-all ${Vn?"bg-blue-500":n?"bg-zinc-700 group-hover/prompt-line:bg-zinc-400":"bg-zinc-300 group-hover/prompt-line:bg-zinc-500"}`})}),Vn&&s.jsx("div",{className:`absolute top-full left-0 right-0 mt-1 rounded-lg shadow-2xl border z-[100] p-2 ${n?"bg-[#1a1a1e] border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:vt=>vt.stopPropagation(),onClick:vt=>vt.stopPropagation(),onWheel:vt=>vt.stopPropagation(),children:s.jsx("textarea",{value:e.prompt||"",onChange:vt=>r(e.id,{prompt:vt.target.value}),placeholder:lt?"提示词由上游节点提供":"输入提示词...",readOnly:lt&&!rt,"data-scrollable":!0,className:`w-full min-w-0 h-24 resize-none rounded-md p-3 text-xs leading-relaxed focus:outline-none focus:ring-1 focus:ring-blue-500/50 custom-scrollbar break-words ${n?"bg-zinc-900/50 text-zinc-200 placeholder-zinc-600":"bg-transparent text-zinc-800 placeholder-zinc-400"}`,style:{wordBreak:"break-all",overflowWrap:"anywhere"},onMouseDown:vt=>vt.stopPropagation(),onWheel:vt=>vt.stopPropagation(),onKeyDown:vt=>{vt.stopPropagation(),vt.key==="Escape"&&V(null)},autoFocus:!0})})]})}return s.jsxs("div",{className:"relative w-full h-full flex flex-col min-h-0 min-w-0 pointer-events-auto group p-3 overflow-visible",children:[_n(),Cn(),s.jsx("div",{className:"group/prompt relative mb-2 flex-1 min-h-0 min-w-0 overflow-visible",children:s.jsxs("div",{className:`w-full h-full flex flex-col p-2 overflow-visible min-w-0 ${n?"bg-transparent border-0":"bg-transparent border border-transparent"}`,children:[Xn(),Kn(),$r(),s.jsx(ace,{nodeId:e.id,value:e.prompt||"",onChange:dt=>r(e.id,{prompt:dt}),placeholder:lt?"提示词由上游节点提供":"输入提示词...",isDark:n,videoUrl:((tr=e.settings)==null?void 0:tr.klingVideoUrl)||void 0,seedanceMaterials:De})]})}),e.type==="gen-video"&&E0(xe)&&(()=>{var en;const dt=((en=e.settings)==null?void 0:en.seedanceMaterials)||[],vt=12,Kt="image/jpeg,image/png,image/webp,image/gif,image/bmp,video/mp4,video/quicktime,video/x-m4v,audio/mpeg,audio/wav,audio/mp4,audio/aac,audio/ogg,audio/x-flac,.mp3,.wav,.m4a,.aac,.ogg,.flac",an=rn=>rn.type.startsWith("image/")?"image":rn.type.startsWith("video/")?"video":rn.type.startsWith("audio/")?"audio":"image";return s.jsx("div",{className:"mb-2 border-t border-dashed pt-2",style:{borderColor:n?"rgba(63, 63, 70, 0.5)":"rgba(161, 161, 170, 0.5)"},onMouseDown:rn=>rn.stopPropagation(),onClick:rn=>rn.stopPropagation(),children:s.jsxs("div",{className:"flex flex-wrap items-center gap-1.5",children:[dt.map((rn,gn)=>{const lr=`@${gn+1}`;return s.jsxs("div",{role:"button",tabIndex:0,onContextMenu:On=>{On.preventDefault(),On.stopPropagation(),rn.id.startsWith("seedance-conn-")||pt({x:On.clientX,y:On.clientY,index:gn})},title:rn.id.startsWith("seedance-conn-")?`${lr} ${rn.name}(来自画布连线,断开连线可移除)`:`${lr} ${rn.name}(右键可替换素材)`,className:`flex items-center gap-1.5 px-2 py-1 rounded border text-[10px] ${n?"bg-zinc-800/50 border-zinc-600 text-zinc-300":"bg-zinc-100 border-zinc-300 text-zinc-700"}`,children:[(()=>{var cs,Ar,Or;const wr=(((cs=qt[gn])==null?void 0:cs.content)??(rn.url.startsWith("content_ref:")?void 0:rn.url))||rn.url;return s.jsx("span",{className:"w-6 h-6 rounded overflow-hidden shrink-0 bg-zinc-600/30 flex items-center justify-center",children:rn.type==="image"?wr&&!wr.startsWith("content_ref:")?s.jsx("img",{src:wr,alt:"",className:"w-full h-full object-cover"}):(Ar=qt[gn])!=null&&Ar.isLoading?s.jsx(zr,{size:12,className:"animate-spin text-zinc-400"}):s.jsx(Rp,{size:12,className:"text-zinc-400"}):rn.type==="video"?wr&&!wr.startsWith("content_ref:")?s.jsx("video",{src:wr,muted:!0,preload:"metadata",playsInline:!0,className:"w-full h-full object-cover"}):(Or=qt[gn])!=null&&Or.isLoading?s.jsx(zr,{size:12,className:"animate-spin text-zinc-400"}):s.jsx(aa,{size:12,className:"text-zinc-400"}):s.jsx($c,{size:12,className:n?"text-zinc-400":"text-zinc-500"})})})(),s.jsxs("button",{type:"button",onClick:On=>{On.stopPropagation();const wr=document.querySelector(`[data-node-type="gen-node"][data-node-id="${e.id}"]`);if(!wr)return;wr.focus();const cs=window.getSelection();if(!cs)return;const Ar=wr.textContent||"";if(!Ar.trim()){const ls=document.createRange();ls.selectNodeContents(wr),cs.removeAllRanges(),cs.addRange(ls)}else{const ls=parseInt(wr.dataset.cursorPos||"0",10),Ns=Math.min(ls,Ar.length);ice(wr,Ns)}document.execCommand("insertText",!1,lr)},className:`flex items-center gap-1 text-left min-w-0 ${n?"hover:bg-zinc-700":"hover:bg-zinc-200"}`,title:`插入 ${lr}(${rn.name})`,children:[s.jsx("span",{className:"font-medium",children:lr}),s.jsx("span",{className:`shrink-0 px-1 rounded ${rn.type==="image"?"bg-blue-500/20":rn.type==="video"?"bg-amber-500/20":"bg-green-500/20"}`,children:rn.type==="image"?"图":rn.type==="video"?"视":"音"})]}),!rn.id.startsWith("seedance-conn-")&&s.jsx("button",{type:"button",onClick:On=>{On.stopPropagation(),URL.revokeObjectURL(rn.url);const wr=dt.filter(cs=>cs.id!==rn.id);r(e.id,{settings:{...e.settings,seedanceMaterials:wr}})},className:n?"text-zinc-400 hover:text-red-400 shrink-0":"text-zinc-500 hover:text-red-600 shrink-0",title:"移除",children:s.jsx(Qr,{size:12})})]},rn.id)}),s.jsx("input",{ref:tt,type:"file",accept:Kt,className:"hidden",onChange:rn=>{var ls;const gn=(ls=rn.target.files)==null?void 0:ls[0];if(rn.target.value="",!gn)return;const lr=Ye.current,On=`sm-${Date.now()}-${Math.random().toString(36).slice(2,9)}`,wr=URL.createObjectURL(gn),cs=an(gn),Ar=[{id:On,type:cs,name:gn.name,url:wr}];let Or;if(lr!==null&&lr>=0&&lr{var gn;rn.stopPropagation(),Ye.current=null,(gn=tt.current)==null||gn.click()},className:`flex items-center gap-1 px-2 py-1 rounded border text-[10px] ${n?"border-zinc-600 text-zinc-400 hover:bg-zinc-700":"border-zinc-300 text-zinc-600 hover:bg-zinc-200"}`,title:"添加素材",children:[s.jsx(Rp,{size:12}),"添加素材"]})]})})})(),ct&&Ni.createPortal(s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"fixed inset-0 z-[9998]","aria-hidden":!0,onClick:()=>pt(null),onContextMenu:dt=>{dt.preventDefault(),pt(null)}}),s.jsx("div",{className:`fixed z-[9999] min-w-[120px] py-1 rounded-lg shadow-lg border text-[12px] ${n?"bg-zinc-800 border-zinc-600 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,style:{left:ct.x,top:ct.y},children:s.jsxs("button",{type:"button",className:`w-full px-3 py-2 text-left flex items-center gap-2 ${n?"hover:bg-zinc-700":"hover:bg-zinc-100"}`,onClick:()=>{Ye.current=ct.index,pt(null),setTimeout(()=>{var dt;return(dt=tt.current)==null?void 0:dt.click()},0)},children:[s.jsx(Rp,{size:12}),"替换素材"]})})]}),document.body),kr(),e.type==="gen-video"&&(()=>{var lr;if(!xe.includes("sora")||I.length===0)return null;const vt=e.prompt||"",Kt=5,an=((lr=e.settings)==null?void 0:lr.characterStartIndex)||0,en=I.slice(an,an+Kt),rn=I.length>an+Kt,gn=I.length-(an+Kt);return s.jsxs("div",{className:"mb-2 border-t border-dashed pt-2",style:{borderColor:n?"rgba(63, 63, 70, 0.5)":"rgba(161, 161, 170, 0.5)"},children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsx("div",{className:"flex gap-2 overflow-x-auto py-1 flex-1 rh-scroll-minimal",children:en.map(On=>{const wr=`@${On.name}`,cs=vt.includes(wr);return s.jsxs("button",{onClick:Ar=>{Ar.stopPropagation();const Or=document.querySelector(`textarea[data-node-id="${e.id}"]`),ls=Or?Or.value:vt||"";let Ns;const Di=Or==null?void 0:Or.dataset.cursorPos,ii=Di?parseInt(Di,10):Or&&Or.selectionStart!==void 0?Or.selectionStart:ls.length;if(Ns=ls.slice(0,ii)+` ${wr} `+ls.slice(ii),r(e.id,{prompt:Ns}),Or){const Hs=ii+wr.length+2;Or.dataset.cursorPos=String(Hs),setTimeout(()=>{document.activeElement===Or&&Or.setSelectionRange(Hs,Hs)},0)}},className:`relative shrink-0 transition-all ${cs?"scale-110":"opacity-70 hover:opacity-100"}`,title:On.name,onMouseDown:Ar=>Ar.stopPropagation(),children:[s.jsx(Mg,{src:On.imageUrl||"",alt:On.name,className:`w-8 h-8 rounded-full object-cover border-2 ${cs?"border-blue-500 ring-2 ring-blue-500":"border-transparent"}`,isDark:n}),s.jsx("div",{className:"absolute -bottom-0.5 -right-0.5 bg-black/50 rounded-full p-0.5",children:s.jsx(Bp,{size:8,className:"text-green-400"})})]},On.id)})}),rn&&s.jsxs("button",{onClick:On=>{On.stopPropagation();const wr=an+Kt;r(e.id,{settings:{...e.settings,characterStartIndex:wr>=I.length?0:wr}})},onMouseDown:On=>{On.stopPropagation()},onMouseUp:On=>{On.stopPropagation()},className:`shrink-0 px-2 py-1 text-[10px] rounded transition-colors ml-2 cursor-pointer ${n?"bg-zinc-800 text-zinc-300 hover:bg-zinc-700":"bg-zinc-100 text-zinc-600 hover:bg-zinc-200"}`,title:"查看更多角色",type:"button",children:["+",gn]}),an>0&&s.jsx("button",{onClick:On=>{On.stopPropagation(),r(e.id,{settings:{...e.settings,characterStartIndex:0}})},onMouseDown:On=>On.stopPropagation(),onMouseUp:On=>On.stopPropagation(),className:`shrink-0 px-2 py-1 text-[10px] rounded transition-colors ml-2 cursor-pointer ${n?"bg-zinc-800 text-zinc-300 hover:bg-zinc-700":"bg-zinc-100 text-zinc-600 hover:bg-zinc-200"}`,title:"返回第一页",type:"button",children:"←"})]}),(()=>{const On=e.prompt||"",wr=I.filter(cs=>On.includes(`@${cs.name}`));return wr.length===0?null:s.jsx("div",{className:"mt-2 flex flex-wrap gap-2",children:wr.map(cs=>s.jsxs("div",{className:`flex items-center gap-1.5 px-2 py-1 rounded-full text-[10px] ${n?"bg-purple-900/30 border border-purple-700/40 text-purple-300":"bg-purple-100 border border-purple-300 text-purple-700"}`,children:[cs.imageUrl&&s.jsx("img",{src:cs.imageUrl,alt:cs.name,className:"w-4 h-4 rounded-full object-cover"}),s.jsxs("span",{children:["@",cs.name]}),s.jsx("button",{onClick:Ar=>{Ar.stopPropagation();const Or=On.replace(new RegExp(`\\s*@${cs.name}\\s*`,"g")," ").trim();r(e.id,{prompt:Or})},className:`ml-0.5 hover:text-red-500 transition-colors ${n?"text-purple-400":"text-purple-600"}`,title:"移除角色",onMouseDown:Ar=>Ar.stopPropagation(),children:"×"})]},cs.id))})})()]})})(),_t&&s.jsxs("div",{"data-node-header-toolbar":!0,className:`mb-2 rounded-lg p-2 ${n?"bg-transparent":"bg-zinc-50"} ${q&&!ie?"flex-1 min-h-0 flex flex-col overflow-hidden":"shrink-0"}`,children:[s.jsxs("div",{className:"flex items-center justify-between shrink-0",children:[s.jsxs("button",{className:"flex items-center gap-1 text-[11px] font-semibold",onClick:()=>oe(dt=>!dt),onMouseDown:dt=>dt.stopPropagation(),children:[s.jsx("span",{className:n?"text-white":"text-zinc-700",children:"常用提示词库"}),s.jsx(Ja,{size:12,className:`transition-transform ${ie?"":"rotate-90"} ${n?"text-white":"text-zinc-500"}`})]}),!ie&&s.jsxs("div",{className:"flex items-center gap-2 text-[10px]",children:[s.jsxs("span",{className:n?"text-white":"text-zinc-500",children:[F.length," 项"]}),s.jsx("button",{className:`px-2 py-0.5 rounded text-[10px] border ${n?"bg-transparent border-white/30 text-white hover:bg-white/5":"border-zinc-300 text-zinc-700 hover:bg-zinc-100"}`,onClick:()=>H(dt=>!dt),onMouseDown:dt=>dt.stopPropagation(),children:q?"收起":"管理"})]})]}),!ie&&s.jsxs("div",{className:`space-y-2 mt-2 flex-1 min-h-0 overflow-y-auto minimal-scrollbar ${q?"flex flex-col":""}`,children:[s.jsxs("div",{className:`overflow-y-auto minimal-scrollbar flex flex-wrap gap-2 ${q?"min-h-0":"max-h-36"}`,children:[F.map(dt=>s.jsxs("div",{className:`border rounded-lg px-2 py-1.5 flex items-center gap-2 text-[11px] ${n?"bg-transparent border-white/30 text-white":"border-zinc-200 bg-zinc-50 text-zinc-700"}`,children:[s.jsxs("span",{className:"font-medium",children:["【",dt.name,"】"]}),s.jsx("button",{"data-gen-prompt-apply":!0,type:"button",onClick:vt=>{vt.stopPropagation(),r(e.id,{prompt:dt.prompt.trim()})},onPointerDown:vt=>vt.stopPropagation(),onMouseDown:vt=>vt.stopPropagation(),className:`relative z-10 px-2 py-0.5 rounded text-[10px] border shrink-0 ${n?"bg-transparent border-white/30 text-white hover:bg-white/5":"bg-blue-600 text-white hover:bg-blue-500 border-transparent"}`,children:"应用"}),q&&s.jsxs(s.Fragment,{children:[s.jsx("button",{onClick:()=>{Z({name:dt.name,prompt:dt.prompt}),pe(dt.id)},className:`px-2 py-0.5 rounded text-[10px] border ${n?"bg-transparent border-white/30 text-white hover:bg-white/5":"border-green-200 text-green-600 hover:bg-green-50"}`,onMouseDown:vt=>vt.stopPropagation(),children:"编辑"}),s.jsx("button",{onClick:()=>L(vt=>vt.filter(Kt=>Kt.id!==dt.id)),className:`px-2 py-0.5 rounded text-[10px] border ${n?"bg-transparent border-white/30 text-white hover:bg-white/5":"border-red-200 text-red-600 hover:bg-red-50"}`,onMouseDown:vt=>vt.stopPropagation(),children:"删除"})]})]},dt.id)),F.length===0&&s.jsx("div",{className:`text-[11px] ${n?"text-white":"text-zinc-400"}`,children:"暂无常用提示词"})]}),q&&s.jsx(sce,{isDark:n,promptLibraryForm:J,setPromptLibraryForm:Z,setPromptLibrary:L,editingId:ee||void 0,onCancelEdit:()=>pe(null)})]})]}),ve&&(()=>{var Kt,an;const dt=d(e.id,"oref"),vt=d(e.id,"sref");return s.jsxs("div",{className:"flex flex-col gap-1.5 mb-2 relative","data-mj-instructions":"true",children:[s.jsxs("div",{className:"relative flex items-center gap-1.5","data-mj-oref":"true",children:[s.jsx("div",{className:`w-2 h-2 rounded-full cursor-crosshair transition-all ${f===e.id&&b==="oref"?"bg-blue-500 ring-2 ring-blue-400":n?"bg-zinc-600 hover:bg-zinc-500":"bg-zinc-400 hover:bg-zinc-500"}`,style:{position:"absolute",left:"-4px",top:"50%",transform:"translateY(-50%)",zIndex:20},title:"oref输入 - 点击开始连接","data-input-type":"oref",onMouseDown:en=>Rr(en,"oref"),onMouseUp:en=>sr(en,"oref")}),s.jsxs("div",{className:"flex items-center gap-1.5 flex-1 ml-2",children:[s.jsx("span",{className:`text-[10px] font-medium ${n?"text-zinc-400":"text-zinc-600"}`,children:"oref"}),dt&&s.jsx("div",{className:"w-1.5 h-1.5 rounded-full bg-green-500"})]})]}),s.jsxs("div",{className:"relative flex items-center gap-1.5",children:[s.jsx("div",{className:"w-2 h-2 mr-1 ml-2"}),s.jsxs("div",{className:"flex items-center gap-1.5 flex-1",children:[s.jsx("span",{className:`text-[10px] font-medium ${n?"text-zinc-400":"text-zinc-600"}`,children:"ow"}),((Kt=e.settings)==null?void 0:Kt.mjOw)>0&&s.jsx("div",{className:"w-1.5 h-1.5 rounded-full bg-green-500"})]}),s.jsx("input",{type:"number",min:"1",max:"1000",placeholder:"1-1000",value:((an=e.settings)==null?void 0:an.mjOw)||"",onChange:en=>{const rn=parseInt(en.target.value,10);isNaN(rn)||rn<1?r(e.id,{settings:{...e.settings||{},mjOw:void 0}}):rn>1e3?r(e.id,{settings:{...e.settings||{},mjOw:1e3}}):r(e.id,{settings:{...e.settings||{},mjOw:rn}})},onMouseDown:en=>en.stopPropagation(),className:`flex-1 px-2 py-1 rounded text-[10px] border outline-none focus:border-blue-500/50 ${n?"bg-zinc-900/50 border-zinc-700 text-zinc-300 placeholder-zinc-600":"bg-white border-zinc-300 text-zinc-800 placeholder-zinc-400"}`})]}),s.jsxs("div",{className:"relative flex items-center gap-1.5","data-mj-sref":"true",children:[s.jsx("div",{className:`w-2 h-2 rounded-full cursor-crosshair transition-all ${f===e.id&&b==="sref"?"bg-blue-500 ring-2 ring-blue-400":n?"bg-zinc-600 hover:bg-zinc-500":"bg-zinc-400 hover:bg-zinc-500"}`,style:{position:"absolute",left:"-4px",top:"50%",transform:"translateY(-50%)",zIndex:20},title:"sref输入 - 点击开始连接","data-input-type":"sref",onMouseDown:en=>Rr(en,"sref"),onMouseUp:en=>sr(en,"sref")}),s.jsxs("div",{className:"flex items-center gap-1.5 flex-1 ml-2",children:[s.jsx("span",{className:`text-[10px] font-medium ${n?"text-zinc-400":"text-zinc-600"}`,children:"sref"}),vt&&s.jsx("div",{className:"w-1.5 h-1.5 rounded-full bg-green-500"})]})]})]})})(),s.jsxs("div",{className:"mt-auto flex items-center justify-between shrink-0 relative gap-2 flex-nowrap overflow-visible min-h-[28px] ",children:[s.jsxs("div",{className:"relative flex-1 min-w-0 overflow-visible","data-model-select-area":!0,children:[s.jsx("button",{title:gt==null?void 0:gt.provider,onClick:dt=>{dt.preventDefault(),dt.stopPropagation(),V((B==null?void 0:B.type)==="model"&&B.nodeId===e.id?null:{nodeId:e.id,type:"model"})},onMouseDown:dt=>{dt.preventDefault(),dt.stopPropagation()},className:`node-dropdown-button flex items-center gap-2 pl-1 pr-2 py-1 rounded text-[10px] transition-colors border w-full ${n?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:s.jsx("span",{className:"truncate",children:gt!=null&>.provider?`${gt.provider}${(gt.provider.startsWith("Seedream")||gt.provider.startsWith("Seedance"))&&!gt.provider.includes("API")?" Official":""}`:"Model"})}),(B==null?void 0:B.nodeId)===e.id&&B.type==="model"&&s.jsx("div",{className:`node-dropdown-menu absolute bottom-full left-0 mb-1 w-48 rounded-lg shadow-xl p-1 z-[100] border max-h-64 overflow-y-auto rh-scroll-minimal custom-scrollbar ${n?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:dt=>dt.stopPropagation(),onWheel:Jt,children:Lt.map(dt=>{var vt,Kt,an;return s.jsx("button",{onClick:()=>{const en=im(dt.id),rn={...e.settings||{},model:dt.id};en&&(en.aspectRatio&&(rn.ratio=en.aspectRatio),en.resolution&&(rn.resolution=en.resolution),en.imageCount&&(rn.batchCount=en.imageCount),en.videoDuration&&(rn.duration=`${en.videoDuration}s`),en.videoResolution&&(rn.resolution=en.videoResolution)),r(e.id,{settings:rn}),A2(e.type,dt.id),V(null)},className:`w-full flex items-center justify-between px-2 py-1.5 rounded text-left transition-colors ${n?"hover:bg-zinc-800 text-zinc-300":"hover:bg-zinc-100 text-zinc-700"} ${xe===dt.id?n?"bg-zinc-800":"bg-zinc-100":""}`,children:s.jsxs("span",{className:"text-xs font-medium truncate",children:[dt.provider??"",((vt=dt.provider)!=null&&vt.startsWith("Seedream")||(Kt=dt.provider)!=null&&Kt.startsWith("Seedance"))&&!((an=dt.provider)!=null&&an.includes("API"))?" Official":""]})},dt.id)})})]}),ve&&s.jsxs("div",{className:"relative overflow-visible",children:[s.jsx("button",{onClick:dt=>{dt.stopPropagation(),V((B==null?void 0:B.type)==="mjVersion"&&B.nodeId===e.id?null:{nodeId:e.id,type:"mjVersion"})},onMouseDown:dt=>dt.stopPropagation(),className:`node-dropdown-button flex items-center gap-1 px-2 py-1 rounded text-[10px] transition-colors border ${n?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:s.jsx("span",{className:"truncate",children:((jr=Kz.find(dt=>{var vt;return dt.value===((vt=e.settings)==null?void 0:vt.mjVersion)}))==null?void 0:jr.label)||"MJ V7"})}),(B==null?void 0:B.nodeId)===e.id&&B.type==="mjVersion"&&s.jsx("div",{className:`node-dropdown-menu absolute bottom-full left-0 mb-1 w-28 rounded-lg shadow-xl p-1 z-[100] border max-h-64 overflow-y-auto rh-scroll-minimal custom-scrollbar ${n?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:dt=>dt.stopPropagation(),children:Kz.map(dt=>{var vt,Kt;return s.jsxs("button",{onClick:()=>{r(e.id,{settings:{...e.settings||{},mjVersion:dt.value}}),V(null)},className:`w-full flex items-center justify-between px-2 py-1.5 rounded text-left transition-colors ${n?"hover:bg-zinc-800 text-zinc-300":"hover:bg-zinc-100 text-zinc-700"} ${((vt=e.settings)==null?void 0:vt.mjVersion)===dt.value?n?"bg-zinc-800":"bg-zinc-100":""}`,children:[s.jsx("span",{className:"text-xs font-medium",children:dt.label}),((Kt=e.settings)==null?void 0:Kt.mjVersion)===dt.value&&s.jsx(Eo,{size:12,className:"text-green-500"})]},dt.value)})})]}),s.jsxs("div",{className:"flex gap-1 shrink-0 flex-nowrap items-center",children:[s.jsxs("div",{className:"relative shrink-0 overflow-visible",children:[s.jsx("button",{onClick:dt=>{dt.stopPropagation(),V((B==null?void 0:B.type)==="ratio"&&B.nodeId===e.id?null:{nodeId:e.id,type:"ratio"})},onMouseDown:dt=>dt.stopPropagation(),className:`node-dropdown-button flex items-center gap-1 px-2 py-1 rounded text-[10px] border whitespace-nowrap ${n?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:((Br=e.settings)==null?void 0:Br.ratio)||"Auto"}),(B==null?void 0:B.nodeId)===e.id&&B.type==="ratio"&&s.jsx("div",{className:`node-dropdown-menu absolute bottom-full left-1/2 -translate-x-1/2 mb-1 min-w-fit max-w-[90vw] rounded-lg shadow-xl z-[100] border ${n?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:dt=>dt.stopPropagation(),children:s.jsx(F$,{isDark:n,selectedRatio:((_r=e.settings)==null?void 0:_r.ratio)||"Auto",filterRatios:Wt,onSelect:dt=>{r(e.id,{settings:{...e.settings||{},ratio:dt}}),Kc(xe,{aspectRatio:dt}),V(null)}})})]}),e.type==="gen-image"&&(xe.includes("gpt-image")||xe.includes("gpt-4o-image"))&&s.jsxs("div",{className:"relative overflow-visible",children:[s.jsx("button",{onClick:dt=>{dt.stopPropagation(),V((B==null?void 0:B.type)==="quality"&&B.nodeId===e.id?null:{nodeId:e.id,type:"quality"})},onMouseDown:dt=>dt.stopPropagation(),className:`node-dropdown-button flex items-center gap-1 px-2 py-1 rounded text-[10px] border ${n?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,title:"图片质量",children:((es=e.settings)==null?void 0:es.gptImageQuality)==="hd"?"HD":"Standard"}),(B==null?void 0:B.nodeId)===e.id&&B.type==="quality"&&s.jsx("div",{className:`node-dropdown-menu absolute bottom-full right-0 mb-1 w-28 rounded-lg shadow-xl p-1 z-[100] border ${n?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:dt=>dt.stopPropagation(),children:["standard","hd"].map(dt=>{var vt;return s.jsx("button",{onClick:()=>{r(e.id,{settings:{...e.settings||{},gptImageQuality:dt}}),V(null)},className:`w-full px-2 py-1.5 rounded text-left text-xs transition-colors ${n?"hover:bg-zinc-800 text-zinc-300":"hover:bg-zinc-100 text-zinc-700"} ${((vt=e.settings)==null?void 0:vt.gptImageQuality)===dt?n?"bg-zinc-800":"bg-zinc-100":""}`,children:dt==="hd"?"HD (高清)":"Standard (标准)"},dt)})})]}),e.type==="gen-video"&&(()=>{var en,rn;const dt=((en=e.settings)==null?void 0:en.resolution)||void 0,vt=Qd(xe)?nu(xe,dt):nu(xe),Kt=((rn=e.settings)==null?void 0:rn.duration)||vt[0]||"5s",an=vt.includes(Kt)?Kt:vt[0]||"5s";return s.jsxs("div",{className:"relative overflow-visible",children:[s.jsx("button",{onClick:gn=>{gn.stopPropagation(),V((B==null?void 0:B.type)==="duration"&&B.nodeId===e.id?null:{nodeId:e.id,type:"duration"})},onMouseDown:gn=>gn.stopPropagation(),className:`node-dropdown-button flex items-center gap-1 px-2 py-1 rounded text-[10px] border ${n?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:an}),(B==null?void 0:B.nodeId)===e.id&&B.type==="duration"&&s.jsx("div",{className:`node-dropdown-menu absolute bottom-full left-1/2 -translate-x-1/2 mb-1 w-20 rounded-lg shadow-xl p-1 z-[100] border ${n?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:gn=>gn.stopPropagation(),children:vt.map(gn=>s.jsx("button",{onClick:()=>{var On;const lr={...e.settings||{},duration:gn};if(xe==="vidu-2.0"&&gn==="8s"){const wr=eu(xe,gn),cs=((On=e.settings)==null?void 0:On.resolution)||"";cs&&!wr.includes(cs)&&(lr.resolution="720p",Kc(xe,{videoResolution:"720p"}))}r(e.id,{settings:lr}),Kc(xe,{videoDuration:parseInt(gn)}),V(null)},className:`w-full text-center py-1 text-[10px] rounded ${n?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"}`,children:gn},gn))})]})})(),e.type==="gen-image"&&Pt.length>0&&!ve&&xe!=="wan-2.6-image-official"&&s.jsxs("div",{className:"relative shrink-0 overflow-visible",children:[s.jsx("button",{onClick:dt=>{dt.stopPropagation(),V((B==null?void 0:B.type)==="resolution"&&B.nodeId===e.id?null:{nodeId:e.id,type:"resolution"})},onMouseDown:dt=>dt.stopPropagation(),className:`node-dropdown-button flex items-center gap-1 px-2 py-1 rounded text-[10px] border whitespace-nowrap ${n?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:((Ur=e.settings)==null?void 0:Ur.resolution)||Pt[0]}),(B==null?void 0:B.nodeId)===e.id&&B.type==="resolution"&&s.jsx("div",{className:`node-dropdown-menu absolute bottom-full left-1/2 -translate-x-1/2 mb-1 rounded-lg shadow-xl p-1 z-[100] border ${n?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:dt=>dt.stopPropagation(),children:s.jsx("div",{className:"flex flex-nowrap items-center gap-0.5",children:Pt.map(dt=>{var vt;return s.jsx("button",{onClick:()=>{r(e.id,{settings:{...e.settings||{},resolution:dt}}),Kc(xe,{resolution:dt}),V(null)},className:`px-2 py-1 rounded text-[10px] transition-colors shrink-0 ${n?"hover:bg-zinc-800 text-zinc-300":"hover:bg-zinc-100 text-zinc-700"} ${((vt=e.settings)==null?void 0:vt.resolution)===dt?n?"bg-zinc-800":"bg-zinc-100":""}`,children:dt},dt)})})})]}),e.type==="gen-video"&&dl(xe)&&(()=>{var vt;const dt=eu(xe);return s.jsxs("div",{className:"relative overflow-visible",children:[s.jsx("button",{onClick:Kt=>{Kt.stopPropagation(),V((B==null?void 0:B.type)==="veo-res"&&B.nodeId===e.id?null:{nodeId:e.id,type:"veo-res"})},onMouseDown:Kt=>Kt.stopPropagation(),className:`node-dropdown-button flex items-center gap-1 px-2 py-1 rounded text-[10px] border ${n?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:((vt=e.settings)==null?void 0:vt.resolution)||dt[0]||"720P"}),(B==null?void 0:B.nodeId)===e.id&&B.type==="veo-res"&&s.jsx("div",{className:`node-dropdown-menu absolute bottom-full left-1/2 -translate-x-1/2 mb-1 w-24 rounded-lg shadow-xl p-1 z-[100] border ${n?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:Kt=>Kt.stopPropagation(),children:dt.map(Kt=>{var an;return s.jsx("button",{onClick:()=>{r(e.id,{settings:{...e.settings||{},resolution:Kt}}),Kc(xe,{videoResolution:Kt}),V(null)},className:`w-full text-center py-1 text-[10px] rounded ${n?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"} ${((an=e.settings)==null?void 0:an.resolution)===Kt?n?"bg-zinc-800":"bg-zinc-100":""}`,children:Kt},Kt)})})]})})(),e.type==="gen-video"&&ru(xe)&&(()=>{var en,rn;const dt=((en=e.settings)==null?void 0:en.duration)||nu(xe)[0]||"5s",vt=eu(xe,dt),Kt=((rn=e.settings)==null?void 0:rn.resolution)||vt[0]||"720p",an=vt.includes(Kt)?Kt:vt[0]||"720p";return s.jsxs("div",{className:"relative overflow-visible",children:[s.jsx("button",{onClick:gn=>{gn.stopPropagation(),V((B==null?void 0:B.type)==="vidu-res"&&B.nodeId===e.id?null:{nodeId:e.id,type:"vidu-res"})},onMouseDown:gn=>gn.stopPropagation(),className:`node-dropdown-button flex items-center gap-1 px-2 py-1 rounded text-[10px] border ${n?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:an}),(B==null?void 0:B.nodeId)===e.id&&B.type==="vidu-res"&&s.jsx("div",{className:`node-dropdown-menu absolute bottom-full left-1/2 -translate-x-1/2 mb-1 w-24 rounded-lg shadow-xl p-1 z-[100] border ${n?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:gn=>gn.stopPropagation(),children:vt.map(gn=>{var lr;return s.jsx("button",{onClick:()=>{r(e.id,{settings:{...e.settings||{},resolution:gn}}),Kc(xe,{videoResolution:gn}),V(null)},className:`w-full text-center py-1 text-[10px] rounded ${n?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"} ${((lr=e.settings)==null?void 0:lr.resolution)===gn?n?"bg-zinc-800":"bg-zinc-100":""}`,children:gn},gn)})})]})})(),e.type==="gen-video"&&pl(xe)&&(()=>{var an;const dt=eu(xe),vt=((an=e.settings)==null?void 0:an.resolution)||dt[0]||"720P",Kt=dt.includes(vt)?vt:dt[0]||"720P";return s.jsxs("div",{className:"relative overflow-visible",children:[s.jsx("button",{onClick:en=>{en.stopPropagation(),V((B==null?void 0:B.type)==="seedance-res"&&B.nodeId===e.id?null:{nodeId:e.id,type:"seedance-res"})},onMouseDown:en=>en.stopPropagation(),className:`node-dropdown-button flex items-center gap-1 px-2 py-1 rounded text-[10px] border ${n?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:Kt}),(B==null?void 0:B.nodeId)===e.id&&B.type==="seedance-res"&&s.jsx("div",{className:`node-dropdown-menu absolute bottom-full left-1/2 -translate-x-1/2 mb-1 w-24 rounded-lg shadow-xl p-1 z-[100] border ${n?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:en=>en.stopPropagation(),children:dt.map(en=>{var rn;return s.jsx("button",{onClick:()=>{r(e.id,{settings:{...e.settings||{},resolution:en}}),Kc(xe,{videoResolution:en}),V(null)},className:`w-full text-center py-1 text-[10px] rounded ${n?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"} ${((rn=e.settings)==null?void 0:rn.resolution)===en?n?"bg-zinc-800":"bg-zinc-100":""}`,children:en},en)})})]})})(),e.type==="gen-video"&&oP(xe)&&s.jsxs("div",{className:"relative overflow-visible",children:[s.jsx("button",{onClick:dt=>{dt.stopPropagation(),V((B==null?void 0:B.type)==="seedance-audio"&&B.nodeId===e.id?null:{nodeId:e.id,type:"seedance-audio"})},onMouseDown:dt=>dt.stopPropagation(),className:`node-dropdown-button flex items-center gap-1 px-2 py-1 rounded text-[10px] border ${n?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,title:"有声视频 / 无声视频",children:((zs=e.settings)==null?void 0:zs.seedanceGenerateAudio)!==!1?"有声":"无声"}),(B==null?void 0:B.nodeId)===e.id&&B.type==="seedance-audio"&&s.jsx("div",{className:`node-dropdown-menu absolute bottom-full left-1/2 -translate-x-1/2 mb-1 w-20 rounded-lg shadow-xl p-1 z-[100] border ${n?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:dt=>dt.stopPropagation(),children:[{value:!0,label:"有声"},{value:!1,label:"无声"}].map(dt=>{var vt;return s.jsx("button",{onClick:()=>{r(e.id,{settings:{...e.settings||{},seedanceGenerateAudio:dt.value}}),Kc(xe,{seedanceGenerateAudio:dt.value}),V(null)},className:`w-full text-center py-1 text-[10px] rounded ${n?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"} ${((vt=e.settings)==null?void 0:vt.seedanceGenerateAudio)!==!1===dt.value?n?"bg-zinc-800":"bg-zinc-100":""}`,children:dt.label},String(dt.value))})})]}),e.type==="gen-video"&&Qd(xe)&&(()=>{var Kt,an;let dt=eu(xe);return!!((Kt=e.settings)!=null&&Kt.veoFramesMode)&&Kd(xe)&&(dt=dt.filter(en=>en==="768P"||en==="1080P")),s.jsxs("div",{className:"relative overflow-visible",children:[s.jsx("button",{onClick:en=>{en.stopPropagation(),V((B==null?void 0:B.type)==="hailuo-res"&&B.nodeId===e.id?null:{nodeId:e.id,type:"hailuo-res"})},onMouseDown:en=>en.stopPropagation(),className:`node-dropdown-button flex items-center gap-1 px-2 py-1 rounded text-[10px] border ${n?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:((an=e.settings)==null?void 0:an.resolution)||dt[0]||"768P"}),(B==null?void 0:B.nodeId)===e.id&&B.type==="hailuo-res"&&s.jsx("div",{className:`node-dropdown-menu absolute bottom-full left-1/2 -translate-x-1/2 mb-1 w-24 rounded-lg shadow-xl p-1 z-[100] border ${n?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:en=>en.stopPropagation(),children:dt.map(en=>{var rn;return s.jsx("button",{onClick:()=>{r(e.id,{settings:{...e.settings||{},resolution:en}}),Kc(xe,{videoResolution:en}),V(null)},className:`w-full text-center py-1 text-[10px] rounded ${n?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"} ${((rn=e.settings)==null?void 0:rn.resolution)===en?n?"bg-zinc-800":"bg-zinc-100":""}`,children:en},en)})})]})})(),e.type==="gen-video"&&xe==="sora-2-pro"&&(()=>{var Kt,an,en,rn;const dt=((Kt=e.settings)==null?void 0:Kt.duration)||"10s",vt=dt==="10s"||dt==="15s";return s.jsxs("label",{className:`flex items-center gap-1 px-2 py-1 rounded text-[10px] border transition-colors ${vt?"cursor-pointer":"cursor-not-allowed opacity-50"} ${n?(an=e.settings)!=null&&an.isHD&&vt?"bg-blue-600/30 border-blue-500 text-blue-300":"bg-transparent hover:bg-white/5 text-white border-white/30":(en=e.settings)!=null&&en.isHD&&vt?"bg-blue-500/30 border-blue-400 text-blue-700":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,onClick:gn=>gn.stopPropagation(),title:vt?"HD模式":"HD仅支持10s和15s时长",children:[s.jsx("input",{type:"checkbox",checked:!!((rn=e.settings)!=null&&rn.isHD)&&vt,disabled:!vt,onChange:gn=>{gn.stopPropagation(),vt&&r(e.id,{settings:{...e.settings,isHD:gn.target.checked}})},className:"w-3 h-3 cursor-pointer disabled:cursor-not-allowed",onMouseDown:gn=>gn.stopPropagation()}),s.jsx("span",{children:"HD"})]})})(),e.type==="gen-video"&&dl(xe)&&s.jsxs("label",{className:`flex items-center gap-1 px-2 py-1 rounded text-[10px] border cursor-pointer transition-colors ${n?(Ts=e.settings)!=null&&Ts.veoFramesMode?"bg-transparent border-white/40 text-white":"bg-transparent hover:bg-white/5 text-white border-white/30":(os=e.settings)!=null&&os.veoFramesMode?"bg-emerald-500/20 border-emerald-300 text-emerald-700":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,onClick:dt=>dt.stopPropagation(),children:[s.jsx("input",{type:"checkbox",checked:!!((wi=e.settings)!=null&&wi.veoFramesMode),onChange:dt=>{dt.stopPropagation(),r(e.id,{settings:{...e.settings,veoFramesMode:dt.target.checked}})},className:"w-3 h-3 cursor-pointer",onMouseDown:dt=>dt.stopPropagation()}),s.jsx("span",{children:"首尾帧"})]}),e.type==="gen-video"&&Kd(xe)&&!dl(xe)&&s.jsxs("label",{className:`flex items-center gap-1 px-2 py-1 rounded text-[10px] border cursor-pointer transition-colors ${n?(ki=e.settings)!=null&&ki.veoFramesMode?"bg-transparent border-white/40 text-white":"bg-transparent hover:bg-white/5 text-white border-white/30":(gi=e.settings)!=null&&gi.veoFramesMode?"bg-emerald-500/20 border-emerald-300 text-emerald-700":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,onClick:dt=>dt.stopPropagation(),children:[s.jsx("input",{type:"checkbox",checked:!!(($i=e.settings)!=null&&$i.veoFramesMode),onChange:dt=>{var an;dt.stopPropagation();const vt=dt.target.checked,Kt=((an=e.settings)==null?void 0:an.resolution)||"768P";vt&&Kt==="512P"?r(e.id,{settings:{...e.settings,veoFramesMode:!0,resolution:"768P"}}):r(e.id,{settings:{...e.settings,veoFramesMode:vt}})},className:"w-3 h-3 cursor-pointer",onMouseDown:dt=>dt.stopPropagation()}),s.jsx("span",{children:"首尾帧"})]}),e.type==="gen-video"&&ke&&s.jsxs("div",{className:"relative overflow-visible",children:[s.jsx("button",{onClick:dt=>{dt.stopPropagation(),V((B==null?void 0:B.type)==="wan26-res"&&B.nodeId===e.id?null:{nodeId:e.id,type:"wan26-res"})},onMouseDown:dt=>dt.stopPropagation(),className:`node-dropdown-button flex items-center gap-1 px-2 py-1 rounded text-[10px] border ${n?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:((gs=e.settings)==null?void 0:gs.wan26Resolution)||"720P"}),(B==null?void 0:B.nodeId)===e.id&&B.type==="wan26-res"&&s.jsx("div",{className:`node-dropdown-menu absolute bottom-full left-1/2 -translate-x-1/2 mb-1 w-24 rounded-lg shadow-xl p-1 z-[100] border ${n?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:dt=>dt.stopPropagation(),children:["720P","1080P"].map(dt=>{var vt;return s.jsx("button",{onClick:()=>{r(e.id,{settings:{...e.settings||{},wan26Resolution:dt}}),V(null)},className:`w-full text-center py-1 text-[10px] rounded ${n?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"} ${((vt=e.settings)==null?void 0:vt.wan26Resolution)===dt?n?"bg-zinc-800":"bg-zinc-100":""}`,children:dt},dt)})})]}),e.type==="gen-video"&&ke&&(()=>{var an,en;const dt=((an=e.settings)==null?void 0:an.wan26AudioConfig)||"none",vt=((en=e.settings)==null?void 0:en.wan26AudioFile)||null,Kt=async rn=>{var lr;const gn=(lr=rn.target.files)==null?void 0:lr[0];if(gn){console.log("[Wan 2.6] 音频文件选择:",gn.name,gn.size,gn.type);try{un(gn),Yt(!0),Te(""),console.log("[Wan 2.6] 设置状态完成:",{pendingAudioFile:gn.name,showAudioSegmentSelector:!0})}catch(On){console.error("[Wan 2.6] 音频文件处理错误:",On),Te("无法读取音频文件"),un(null),Yt(!1),Be.current&&(Be.current.value="")}}};return s.jsxs(s.Fragment,{children:[s.jsxs("div",{className:"relative overflow-visible",children:[s.jsx("button",{onClick:rn=>{rn.stopPropagation(),V((B==null?void 0:B.type)==="wan26-audio"&&B.nodeId===e.id?null:{nodeId:e.id,type:"wan26-audio"})},onMouseDown:rn=>rn.stopPropagation(),className:`node-dropdown-button flex items-center gap-1 px-2 py-1 rounded text-[10px] border ${n?dt!=="none"?"bg-purple-600/30 border-purple-500 text-purple-300":"bg-transparent hover:bg-white/5 text-white border-white/30":dt!=="none"?"bg-purple-500/30 border-purple-400 text-purple-700":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,title:dt==="none"?"无音频":dt==="auto"?"自动配乐":vt?vt.name:"上传音频",children:dt==="none"?"无音频":dt==="auto"?"自动配乐":vt?"音频✓":"音频"}),(B==null?void 0:B.nodeId)===e.id&&B.type==="wan26-audio"&&s.jsx("div",{className:`node-dropdown-menu absolute bottom-full left-1/2 -translate-x-1/2 mb-1 w-28 rounded-lg shadow-xl p-1 z-[100] border ${n?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:rn=>rn.stopPropagation(),children:[{value:"none",label:"无音频"},{value:"auto",label:"自动配乐"},{value:"upload",label:"上传音频"}].map(rn=>s.jsx("button",{onClick:()=>{r(e.id,{settings:{...e.settings,wan26AudioConfig:rn.value,...rn.value!=="upload"?{wan26AudioFile:null,wan26AudioSegment:null}:{}}}),V(null),rn.value==="upload"&&setTimeout(()=>{var gn;(gn=Be.current)==null||gn.click()},100)},className:`w-full text-center py-1 text-[10px] rounded ${n?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"} ${dt===rn.value?n?"bg-zinc-800":"bg-zinc-100":""}`,children:rn.label},rn.value))})]}),s.jsx("input",{ref:Be,type:"file",accept:"audio/*,.mp3,.wav,.m4a,.aac,.ogg,.flac",onChange:Kt,className:"hidden"})]})})(),e.type==="gen-video"&&ke&&s.jsxs("label",{className:`flex items-center gap-1 px-2 py-1 rounded text-[10px] border cursor-pointer transition-colors ${n?(Ri=e.settings)!=null&&Ri.wan26MultiShot?"bg-purple-600/30 border-purple-500 text-purple-300":"bg-transparent hover:bg-white/5 text-white border-white/30":(Ki=e.settings)!=null&&Ki.wan26MultiShot?"bg-purple-500/30 border-purple-400 text-purple-700":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,onClick:dt=>dt.stopPropagation(),title:"多镜头叙事:生成包含多个镜头的视频",children:[s.jsx("input",{type:"checkbox",checked:!!((Ps=e.settings)!=null&&Ps.wan26MultiShot),onChange:dt=>{dt.stopPropagation(),r(e.id,{settings:{...e.settings,wan26MultiShot:dt.target.checked}})},className:"w-3 h-3 cursor-pointer",onMouseDown:dt=>dt.stopPropagation()}),s.jsx("span",{children:"多镜头"})]}),e.type==="gen-video"&&fu(xe)&&(()=>{var en,rn;const dt=!!d(e.id,"veo_start"),vt=!!d(e.id,"veo_end"),Kt=dt||vt;return((en=e.settings)==null?void 0:en.veoFramesMode)&&Kt?((((rn=e.settings)==null?void 0:rn.klingV25Resolution)||"std")!=="pro"&&r(e.id,{settings:{...e.settings,klingV25Resolution:"pro"}}),s.jsx("div",{className:"relative",children:s.jsx("button",{disabled:!0,className:`flex items-center gap-1 px-2 py-1 rounded text-[10px] border cursor-not-allowed opacity-60 ${n?"bg-zinc-800/50 text-zinc-400 border-zinc-700/50":"bg-zinc-100 text-zinc-600 border-zinc-300"}`,title:"首尾帧模式下强制使用 pro (高表现) 模式",children:"pro (高表现)"})})):s.jsxs("div",{className:"relative overflow-visible",children:[s.jsx("button",{onClick:gn=>{gn.stopPropagation(),V((B==null?void 0:B.type)==="kling-v25-res"&&B.nodeId===e.id?null:{nodeId:e.id,type:"kling-v25-res"})},onMouseDown:gn=>gn.stopPropagation(),className:`node-dropdown-button flex items-center gap-1 px-2 py-1 rounded text-[10px] border ${n?"bg-zinc-800/50 hover:bg-zinc-800 text-zinc-400 border-zinc-700/50":"bg-zinc-100 hover:bg-zinc-200 text-zinc-600 border-zinc-300"}`,title:"Kling v2.5 Turbo 分辨率",children:(()=>{var lr;return(((lr=e.settings)==null?void 0:lr.klingV25Resolution)||"std")==="std"?"std (高性能)":"pro (高表现)"})()}),(B==null?void 0:B.nodeId)===e.id&&B.type==="kling-v25-res"&&s.jsx("div",{className:`node-dropdown-menu absolute bottom-full left-1/2 -translate-x-1/2 mb-1 w-32 rounded-lg shadow-xl p-1 z-[100] border ${n?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:gn=>gn.stopPropagation(),children:[{value:"std",label:"std (高性能)"},{value:"pro",label:"pro (高表现)"}].map(gn=>{var lr,On;return s.jsx("button",{onClick:()=>{r(e.id,{settings:{...e.settings||{},klingV25Resolution:gn.value}}),V(null)},className:`w-full text-center py-1 text-[10px] rounded ${n?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"} ${((lr=e.settings)==null?void 0:lr.klingV25Resolution)===gn.value||!((On=e.settings)!=null&&On.klingV25Resolution)&&gn.value==="std"?n?"bg-zinc-800":"bg-zinc-100":""}`,children:gn.label},gn.value)})})]})})(),e.type==="gen-video"&&zc(xe)&&(()=>{var en,rn,gn,lr;const dt=!!d(e.id,"veo_start"),vt=!!d(e.id,"veo_end"),Kt=dt||vt,an=((en=e.settings)==null?void 0:en.veoFramesMode)&&Kt;return an&&(((rn=e.settings)==null?void 0:rn.klingV26Resolution)||"std")!=="pro"&&r(e.id,{settings:{...e.settings,klingV26Resolution:"pro"}}),s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"relative",children:an?s.jsx("button",{disabled:!0,className:`flex items-center gap-1 px-2 py-1 rounded text-[10px] border cursor-not-allowed opacity-60 ${n?"bg-transparent text-white/50 border-white/20":"bg-transparent text-gray-500 border-gray-200"}`,title:"首尾帧模式下强制使用 pro (高表现)",children:"pro (高表现)"}):s.jsxs(s.Fragment,{children:[s.jsx("button",{onClick:On=>{On.stopPropagation(),V((B==null?void 0:B.type)==="kling-v26-res"&&B.nodeId===e.id?null:{nodeId:e.id,type:"kling-v26-res"})},onMouseDown:On=>On.stopPropagation(),className:`node-dropdown-button flex items-center gap-1 px-2 py-1 rounded text-[10px] border ${n?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,title:"Kling v2.6 模式",children:(((gn=e.settings)==null?void 0:gn.klingV26Resolution)||"std")==="std"?"std (高性能)":"pro (高表现)"}),(B==null?void 0:B.nodeId)===e.id&&B.type==="kling-v26-res"&&s.jsx("div",{className:`node-dropdown-menu absolute bottom-full left-1/2 -translate-x-1/2 mb-1 w-32 rounded-lg shadow-xl p-1 z-[100] border ${n?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:On=>On.stopPropagation(),children:[{value:"std",label:"std (高性能)"},{value:"pro",label:"pro (高表现)"}].map(On=>{var wr;return s.jsx("button",{onClick:()=>{r(e.id,{settings:{...e.settings||{},klingV26Resolution:On.value}}),V(null)},className:`w-full text-center py-1 text-[10px] rounded ${n?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"} ${(((wr=e.settings)==null?void 0:wr.klingV26Resolution)||"std")===On.value?n?"bg-zinc-800":"bg-zinc-100":""}`,children:On.label},On.value)})})]})}),s.jsxs("div",{className:"relative",children:[s.jsx("button",{onClick:On=>{On.stopPropagation(),V((B==null?void 0:B.type)==="kling-v26-sound"&&B.nodeId===e.id?null:{nodeId:e.id,type:"kling-v26-sound"})},onMouseDown:On=>On.stopPropagation(),className:`node-dropdown-button flex items-center gap-1 px-2 py-1 rounded text-[10px] border ${n?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,title:"是否生成声音",children:(((lr=e.settings)==null?void 0:lr.klingV26Sound)||"off")==="on"?"声音 on":"声音 off"}),(B==null?void 0:B.nodeId)===e.id&&B.type==="kling-v26-sound"&&s.jsx("div",{className:`node-dropdown-menu absolute bottom-full left-1/2 -translate-x-1/2 mb-1 w-24 rounded-lg shadow-xl p-1 z-[100] border ${n?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:On=>On.stopPropagation(),children:[{value:"on",label:"on"},{value:"off",label:"off"}].map(On=>{var wr;return s.jsx("button",{onClick:()=>{r(e.id,{settings:{...e.settings||{},klingV26Sound:On.value}}),V(null)},className:`w-full text-center py-1 text-[10px] rounded ${n?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"} ${(((wr=e.settings)==null?void 0:wr.klingV26Sound)||"off")===On.value?n?"bg-zinc-800":"bg-zinc-100":""}`,children:On.label},On.value)})})]})]})})(),e.type==="gen-video"&&Wo(xe)&&(()=>{var Kt,an;const dt=["720P","1080P"],vt=((Kt=e.settings)==null?void 0:Kt.resolution)||"720P";return s.jsxs(s.Fragment,{children:[s.jsxs("div",{className:"relative",children:[s.jsx("button",{onClick:en=>{en.stopPropagation(),V((B==null?void 0:B.type)==="kling-v3-res"&&B.nodeId===e.id?null:{nodeId:e.id,type:"kling-v3-res"})},onMouseDown:en=>en.stopPropagation(),className:`node-dropdown-button flex items-center gap-1 px-2 py-1 rounded text-[10px] border ${n?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,title:"分辨率",children:dt.includes(vt)?vt:"720P"}),(B==null?void 0:B.nodeId)===e.id&&B.type==="kling-v3-res"&&s.jsx("div",{className:`node-dropdown-menu absolute bottom-full left-1/2 -translate-x-1/2 mb-1 w-20 rounded-lg shadow-xl p-1 z-[100] border ${n?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:en=>en.stopPropagation(),children:dt.map(en=>s.jsx("button",{onClick:()=>{r(e.id,{settings:{...e.settings||{},resolution:en}}),Kc(xe,{resolution:en}),V(null)},className:`w-full text-center py-1 text-[10px] rounded ${n?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"} ${vt===en||!dt.includes(vt)&&en==="720P"?n?"bg-zinc-800":"bg-zinc-100":""}`,children:en},en))})]}),s.jsxs("div",{className:"relative",children:[s.jsx("button",{onClick:en=>{en.stopPropagation(),V((B==null?void 0:B.type)==="kling-v3-sound"&&B.nodeId===e.id?null:{nodeId:e.id,type:"kling-v3-sound"})},onMouseDown:en=>en.stopPropagation(),className:`node-dropdown-button flex items-center gap-1 px-2 py-1 rounded text-[10px] border ${n?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,title:"音画同步(默认开声音)",children:(((an=e.settings)==null?void 0:an.klingV3Sound)??"on")==="on"?"声音 on":"声音 off"}),(B==null?void 0:B.nodeId)===e.id&&B.type==="kling-v3-sound"&&s.jsx("div",{className:`node-dropdown-menu absolute bottom-full left-1/2 -translate-x-1/2 mb-1 w-24 rounded-lg shadow-xl p-1 z-[100] border ${n?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:en=>en.stopPropagation(),children:[{value:"on",label:"on"},{value:"off",label:"off"}].map(en=>{var rn;return s.jsx("button",{onClick:()=>{r(e.id,{settings:{...e.settings||{},klingV3Sound:en.value}}),V(null)},className:`w-full text-center py-1 text-[10px] rounded ${n?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-100"} ${(((rn=e.settings)==null?void 0:rn.klingV3Sound)??"on")===en.value?n?"bg-zinc-800":"bg-zinc-100":""}`,children:en.label},en.value)})})]})]})})(),e.type==="gen-video"&&Ie&&s.jsxs("button",{onClick:dt=>{dt.stopPropagation(),Ze(!0)},className:`flex items-center gap-1 px-2 py-1 rounded text-[10px] border transition-colors ${(((Si=e.settings)==null?void 0:Si.klingSubjects)||[]).length>0?n?"bg-transparent border-white/50 text-white":"bg-cyan-500/30 border-cyan-400 text-cyan-700":n?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-zinc-100 hover:bg-zinc-200 text-zinc-600 border-zinc-300"}`,title:(((xi=e.settings)==null?void 0:xi.klingSubjects)||[]).length>0?`已选择 ${(((li=e.settings)==null?void 0:li.klingSubjects)||[]).length} 个主体`:"选择可灵主体",children:[s.jsx(Ya,{size:12}),s.jsx("span",{children:(((ca=e.settings)==null?void 0:ca.klingSubjects)||[]).length>0?`${(((ea=e.settings)==null?void 0:ea.klingSubjects)||[]).length}`:"主体"})]}),e.type==="gen-video"&&Wo(xe)&&s.jsxs("button",{onClick:dt=>{dt.stopPropagation(),Ze(!0)},className:`flex items-center gap-1 px-2 py-1 rounded text-[10px] border transition-colors ${(((Wa=e.settings)==null?void 0:Wa.klingSubjects)||[]).length>0?n?"bg-transparent border-white/50 text-white":"bg-cyan-500/30 border-cyan-400 text-cyan-700":n?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-zinc-100 hover:bg-zinc-200 text-zinc-600 border-zinc-300"}`,title:(((ks=e.settings)==null?void 0:ks.klingSubjects)||[]).length>0?`已选择 ${(((Pi=e.settings)==null?void 0:Pi.klingSubjects)||[]).length} 个主体`:"选择可灵主体(主体库)",children:[s.jsx(Ya,{size:12}),s.jsx("span",{children:(((_i=e.settings)==null?void 0:_i.klingSubjects)||[]).length>0?`${(((ta=e.settings)==null?void 0:ta.klingSubjects)||[]).length}`:"主体"})]}),e.type==="gen-video"&&Ie&&(()=>{var vt;const dt=((vt=e.settings)==null?void 0:vt.klingVideoFile)||null;return s.jsxs("button",{onClick:Kt=>{Kt.stopPropagation(),Tn(!0)},className:`flex items-center gap-1 px-2 py-1 rounded text-[10px] border transition-colors ${dt?n?"bg-transparent border-white/50 text-white":"bg-emerald-500/30 border-emerald-400 text-emerald-700":n?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-zinc-100 hover:bg-zinc-200 text-zinc-600 border-zinc-300"}`,title:dt?dt.name:"上传视频",children:[s.jsx(aa,{size:12}),s.jsx("span",{children:dt?"视频✓":"视频"})]})})(),e.type==="gen-video"&&Ie&&s.jsxs("button",{onClick:dt=>{dt.stopPropagation(),Xe(!0)},className:`flex items-center gap-1 px-2 py-1 rounded text-[10px] border transition-colors ${(((ua=e.settings)==null?void 0:ua.klingImages)||[]).length>0?n?"bg-transparent border-white/50 text-white":"bg-blue-500/30 border-blue-400 text-blue-700":n?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-zinc-100 hover:bg-zinc-200 text-zinc-600 border-zinc-300"}`,title:(((Wi=e.settings)==null?void 0:Wi.klingImages)||[]).length>0?`已上传 ${(((ci=e.settings)==null?void 0:ci.klingImages)||[]).length} 张图片`:"上传图片",children:[s.jsx(Rp,{size:12}),s.jsx("span",{children:(((Oi=e.settings)==null?void 0:Oi.klingImages)||[]).length>0?`图片(${(((da=e.settings)==null?void 0:da.klingImages)||[]).length})`:"图片"})]}),e.type==="gen-image"&&(()=>{var an,en;const dt=["nano-banana","nano-banana-2","gemini-3.1-flash-image-preview","grsai-nano-banana-fast","grsai-nano-banana-pro","grsai-nano-banana-2","gpt-image","gpt-image-1.5","flux-kontext","z-image-turbo","z-image-official"],vt=((an=e.settings)==null?void 0:an.model)||"";return dt.includes(vt)?s.jsxs("div",{className:"relative shrink-0 overflow-visible",children:[s.jsxs("button",{onClick:rn=>{rn.stopPropagation(),V((B==null?void 0:B.type)==="batchSize"&&B.nodeId===e.id?null:{nodeId:e.id,type:"batchSize"})},onMouseDown:rn=>rn.stopPropagation(),className:`node-dropdown-button flex items-center gap-1 px-2 py-1 rounded text-[10px] border whitespace-nowrap ${n?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,title:"生成张数",children:[((en=e.settings)==null?void 0:en.batchSize)||1,"张"]}),(B==null?void 0:B.nodeId)===e.id&&B.type==="batchSize"&&s.jsx("div",{className:`node-dropdown-menu absolute bottom-full left-1/2 -translate-x-1/2 mb-1 min-w-fit rounded-lg shadow-xl px-2 py-1.5 z-[100] border ${n?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:rn=>rn.stopPropagation(),children:s.jsx("div",{className:"flex flex-nowrap items-center gap-1",children:[{value:1,label:"1张"},{value:2,label:"2张"},{value:4,label:"4张"},{value:9,label:"9张"}].map(({value:rn,label:gn})=>{var lr;return s.jsx("button",{onClick:()=>{r(e.id,{settings:{...e.settings||{},batchSize:rn}}),V(null)},className:`px-2 py-1 rounded text-[10px] transition-colors shrink-0 whitespace-nowrap ${n?"hover:bg-zinc-800 text-zinc-300":"hover:bg-zinc-100 text-zinc-700"} ${((lr=e.settings)==null?void 0:lr.batchSize)===rn?n?"bg-zinc-800":"bg-zinc-100":""}`,children:gn},rn)})})})]}):null})(),e.type==="gen-image"&&(()=>{var en,rn;const dt=["nano-banana","nano-banana-2","gemini-3.1-flash-image-preview","grsai-nano-banana-fast","grsai-nano-banana-pro","grsai-nano-banana-2","gpt-image","gpt-image-1.5","qwen-image-edit"],vt=((en=e.settings)==null?void 0:en.model)||"";if(!dt.includes(vt))return null;const an=((rn=e.settings)==null?void 0:rn.useAsyncMode)??!0;return s.jsx("button",{onClick:gn=>{gn.stopPropagation(),r(e.id,{settings:{...e.settings||{},useAsyncMode:!an}})},className:`flex items-center gap-1 px-2 py-1 rounded text-[10px] border whitespace-nowrap shrink-0 ${n?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,title:an?"异步模式(轮询)- 更稳定":"同步模式(直接返回)- 更快但可能超时",children:an?"异步":"同步"})})(),s.jsxs("span",{className:"inline-flex items-center gap-1 shrink-0",children:[e.isGenerating&&s.jsx(zr,{size:12,className:"animate-spin shrink-0 text-current"}),s.jsx("button",{className:`p-1.5 rounded-md border transition-all shrink-0 active:scale-95 ${n?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,onMouseDown:dt=>dt.stopPropagation(),onClick:dt=>{dt.stopPropagation();const vt=$e(),Kt=e.prompt||"";let an="";Kt.trim()&&Ge.trim()?an=`${Kt.trim()} + +${Ge.trim()}`:Kt.trim()?an=Kt.trim():Ge.trim()&&(an=Ge.trim()),an.trim()&&console.log("[GenImageVideoNodeInline] 合并后的提示词:",an.substring(0,100)+"..."),console.log("[GenImageVideoNodeInline] latestVideoInfoRef.current:",wt.current);const en={...e.settings||{},_autoCreatedPreviewId:vt||void 0,...wt.current.klingVideoUrl?{klingVideoUrl:wt.current.klingVideoUrl,klingVideoReferType:wt.current.klingVideoReferType,klingVideoKeepSound:wt.current.klingVideoKeepSound,klingVideoSegment:wt.current.klingVideoSegment}:{}};console.log("[GenImageVideoNodeInline] previewNodeId:",vt),console.log("[GenImageVideoNodeInline] 生成时使用的 settings:",en),console.log("[GenImageVideoNodeInline] 其中 _autoCreatedPreviewId:",en._autoCreatedPreviewId),console.log("[GenImageVideoNodeInline] 其中 klingVideoUrl:",en.klingVideoUrl),re(!0),r(e.id,{settings:en}),vt&&requestAnimationFrame(()=>{window.dispatchEvent(new CustomEvent("previewGenerationStarted",{detail:{targetPreviewId:vt}}))}),N({...e,prompt:an||e.prompt,settings:en})},title:"生成",children:s.jsx(Ia,{size:12,fill:"currentColor"})})]}),s.jsx("button",{className:`p-1.5 rounded-md transition-all shrink-0 ${n?"text-zinc-500 hover:text-zinc-300 hover:bg-zinc-800":"text-zinc-400 hover:text-zinc-600 hover:bg-zinc-200"}`,onMouseDown:dt=>dt.stopPropagation(),onClick:dt=>{dt.stopPropagation(),cn()},title:"折叠节点",children:s.jsx(rf,{size:12})})]})]}),we&&s.jsxs("div",{className:"fixed inset-0 z-[9999] flex items-center justify-center bg-black/80 backdrop-blur-sm",children:[s.jsx("div",{className:"absolute inset-0 z-0",onClick:()=>Q(null),"aria-hidden":!0}),s.jsx("button",{onClick:()=>Q(null),className:"absolute top-4 right-4 z-10 p-2 rounded-full bg-black/60 hover:bg-black/80 text-white transition-colors pointer-events-auto",children:s.jsx(Qr,{size:20})}),s.jsx("div",{className:"relative flex items-center justify-center pointer-events-none z-10 overflow-hidden",style:{cursor:te?"grabbing":me>1?"grab":"zoom-out"},children:s.jsx("div",{className:"pointer-events-auto select-none overflow-hidden flex items-center justify-center",style:{width:"90vw",height:"85vh",maxWidth:"100%",maxHeight:"100%"},onWheel:dt=>{dt.preventDefault(),dt.stopPropagation(),ue(vt=>Math.min(5,Math.max(.2,vt+(dt.deltaY>0?-.15:.15))))},onMouseDown:dt=>{dt.button===1&&(dt.preventDefault(),ne.current={x:dt.clientX,y:dt.clientY,translateX:U.x,translateY:U.y},ge(!0))},onAuxClick:dt=>{dt.button===1&&dt.preventDefault()},children:s.jsx("img",{src:we,alt:"预览",className:"w-full h-full object-contain rounded-lg pointer-events-none",style:{transform:`scale(${me}) translate(${U.x}px, ${U.y}px)`,transition:te?"none":"transform 0.1s ease-out"},draggable:!1})})})]}),e.type==="gen-video"&&(Ie||Wo(xe))&&Ve&&s.jsx(s9,{isOpen:!0,isDark:n,klingSubjectLibrary:A,selectedSubjects:((ha=e.settings)==null?void 0:ha.klingSubjects)||[],onClose:()=>Ze(!1),onChange:dt=>{let vt=e.prompt||"";vt=vt.replace(/<<>>/g,"").replace(/\s+/g," ").trim(),dt.forEach((Kt,an)=>{const en=`<<>>`;vt=vt.trim()+(vt?" ":"")+en}),r(e.id,{prompt:vt,settings:{...e.settings,klingSubjects:dt}})},onConfirm:()=>Ze(!1),onCreateSubject:()=>{Ze(!1),O(!0)}}),e.type==="gen-video"&&ke&&$t&&Nt?s.jsx(i9,{audioFile:Nt,isOpen:!0,isDark:n,minDuration:3,maxDuration:15,onClose:()=>{console.log("[Wan 2.6] AudioSegmentSelector 关闭"),Je(!1),Re(null),Be.current&&(Be.current.value="")},onConfirm:Ht}):null,e.type==="gen-video"&&Ie&&jt&&s.jsx(j4,{isOpen:!0,isDark:n,maxDuration:10,currentVideoFile:((Li=e.settings)==null?void 0:Li.klingVideoFile)||null,apiKey:(gt==null?void 0:gt.key)||l,baseUrl:gt==null?void 0:gt.url,onClose:()=>{Tn(!1),je.current&&(je.current.value="")},onConfirm:fn}),e.type==="gen-video"&&Ie&&Le&&s.jsx(f7,{isOpen:!0,isDark:n,currentImages:((ka=e.settings)==null?void 0:ka.klingImages)||[],apiKey:(gt==null?void 0:gt.key)||l,baseUrl:(gt==null?void 0:gt.url)||"https://ai.comfly.chat",maxImages:7,onClose:()=>Xe(!1),onChange:dt=>{let vt=e.prompt||"";vt=vt.replace(/<<>>/g,"").replace(/\s+/g," ").trim(),dt.forEach((Kt,an)=>{const en=`<<>>`;vt=vt.trim()+(vt?" ":"")+en}),r(e.id,{prompt:vt,settings:{...e.settings,klingImages:dt}})},onConfirm:()=>Xe(!1)})]})},lce={pause:Rw,"move-right":lq,"move-left":oq,"rotate-cw":Rx,"move-horizontal":aq,user:hd,circle:BP,zap:O5,target:bq,"arrow-right":_G,"arrow-left":wG,"arrow-up":zG,"arrow-down":vG,eye:cl,"trending-up":wq,"trending-down":vq,maximize:rq,navigation:uq,"rotate-ccw":P5,"fast-forward":PG,rewind:mq,"corner-up-right":MG,"corner-right-down":AG,"refresh-cw":Ch,box:SG,"maximize-2":jh,"zoom-in":Lw,"refresh-ccw":fq,clock:dd,"navigation-2":cq,plane:pq,smartphone:xq,"git-branch":I5,cpu:TG,video:aa},cce=({node:e,nodes:t,connections:n,isDark:r,updateNode:i})=>{var w;const a=()=>{const v=n.find(z=>z.from===e.id);if(!v)return null;const m=t.find(z=>z.id===v.to);return m&&(m.type==="gen-image"||m.type==="gen-video")?m:null},o=v=>{const m=a();if(m){const z=document.querySelector(`div[contenteditable][data-node-id="${m.id}"]`);let C="";if(z){const I=R=>{let A="";return R.childNodes.forEach(O=>{if(O.nodeType===Node.TEXT_NODE)A+=O.textContent||"";else if(O.nodeType===Node.ELEMENT_NODE){const F=O;if(F.hasAttribute("data-tag")){const L=F.getAttribute("data-tag-content")||"";A+=`【${L}】`}else F.tagName==="BR"?A+=` +`:F.tagName==="DIV"?A+=` +`+I(F):A+=F.textContent||""}}),A};C=I(z)}else C=m.prompt||"";const E=`【${v}】`;if(!C.includes(E)){let I,R=C.length;if(z&&z.dataset.cursorPos){const X=parseInt(z.dataset.cursorPos,10);!isNaN(X)&&X>=0&&X<=C.length&&(R=X)}else if(z&&document.activeElement===z)try{const X=window.getSelection();if(X&&X.rangeCount>0){const T=X.getRangeAt(0),q=T.cloneRange();q.selectNodeContents(z),q.setEnd(T.endContainer,T.endOffset),R=q.toString().length}}catch(X){console.warn("[CameraMovement] 获取光标位置失败:",X)}const A=C.slice(0,R),O=C.slice(R),F=A.length>0&&!A.endsWith(" "),L=O.length>0&&!O.startsWith(" ");if(I=A+(F?" ":"")+E+(L?" ":"")+O,i(m.id,{prompt:I}),z){const X=R+E.length+(F?1:0)+(L?1:0);z.dataset.cursorPos=String(X)}}}},l=v=>{const m=a();if(m){const z=m.prompt||"",C=`【${v}】`;if(z.includes(C)){let E=z.replace(C,"");E=E.replace(/\s+/g," ").trim(),i(m.id,{prompt:E})}}},c=((w=e.settings)==null?void 0:w.movementConfig)||{movementId:null,directionId:null,angleId:null,speedId:null,styleId:null,deviceId:null},u=v=>{const m=c[v];return m?typeof m=="string"?[m]:Array.isArray(m)?m:[]:[]},d=(v,m)=>u(v).includes(m),h=a(),p=(h==null?void 0:h.prompt)||"";_.useEffect(()=>{if(!h)return;const v=p,m=[{key:"movementId",items:Px,title:"机位运动"},{key:"directionId",items:Ox,title:"运动方向"},{key:"angleId",items:Lx,title:"机位角度"},{key:"speedId",items:Bx,title:"速度/幅度"},{key:"styleId",items:Ux,title:"经典风格"},{key:"deviceId",items:Fx,title:"模拟设备"}];let z=!1;const C={...c};for(const{key:E,items:I,title:R}of m){const A=u(E);if(A.length>0){const O=A.filter(F=>{const L=I.find(X=>X.id===F);if(L){const X=`【${R}:${L.name}】`;return v.includes(X)}return!1});O.length!==A.length&&(C[E]=O.length>0?O:null,z=!0)}}z&&i(e.id,{settings:{...e.settings,movementConfig:C},content:Sy(C)})},[p,c,e.id,e.settings,i]);const f=(v,m,z)=>{if(!m||!z)return;const C=u(v),E=C.includes(m);let I;E?(I=C.filter(A=>A!==m),l(z)):(I=[...C,m],o(z));const R={...c,[v]:I.length>0?I:null};i(e.id,{settings:{...e.settings,movementConfig:R},content:Sy(R)})},b=(v,m,z,C)=>{const E=lce[v.icon]||aa,I=d(m,v.id),R=I&&r?"border-white/50 bg-white/5 ring-1 ring-white/30":I?`border-${C}-500 bg-${C}-500/20 ring-1 ring-${C}-500/50`:r?"border-zinc-700/50 bg-zinc-800/50 hover:border-zinc-600 hover:bg-zinc-700/50":"border-zinc-300 bg-zinc-100 hover:border-zinc-400 hover:bg-zinc-200",A=I&&r?"text-white/80":I?`text-${C}-400`:r?"text-zinc-400":"text-zinc-600",O=I&&r?"text-white/80":I?`text-${C}-400`:r?"text-zinc-500":"text-zinc-600";return s.jsxs("button",{onMouseDown:F=>F.stopPropagation(),onClick:()=>z(v.id),className:`flex flex-col items-center justify-center p-1.5 rounded-lg border min-w-[52px] ${R}`,title:`${v.name} (${v.nameEn})`,children:[s.jsx(E,{size:16,className:A}),s.jsx("span",{className:`text-[9px] mt-0.5 leading-tight ${O}`,children:v.name})]},v.id)},g=(v,m,z,C,E)=>s.jsxs("div",{className:"mb-3",children:[s.jsxs("div",{className:`text-[10px] mb-1.5 flex items-center gap-1 ${r?"text-zinc-500":"text-zinc-600"}`,children:[s.jsx("span",{className:"font-medium",children:v}),s.jsxs("span",{className:"text-[8px] opacity-60",children:["(",m,")"]})]}),s.jsx("div",{className:"flex gap-1 overflow-x-auto pb-2 director-scrollbar",children:z.map(I=>b(I,C,R=>f(C,R,`${v}:${I.name}`),E))})]});Cq(c);const y=Sy(c);return s.jsxs("div",{className:`h-full flex flex-col ${r?"bg-zinc-900":"bg-white"}`,children:[s.jsxs("div",{className:"flex-1 overflow-y-auto p-2 space-y-1 hide-scrollbar",children:[g("机位运动","Movement",Px,"movementId","cyan"),g("运动方向","Direction",Ox,"directionId","blue"),g("机位角度","Angle",Lx,"angleId","purple"),g("速度/幅度","Speed",Bx,"speedId","green"),g("经典风格","Style",Ux,"styleId","amber"),g("模拟设备","Device",Fx,"deviceId","rose")]}),y&&s.jsxs("div",{className:`px-2 py-1.5 border-t ${r?"border-zinc-800 bg-zinc-800/50":"border-zinc-200 bg-zinc-50"}`,children:[s.jsx("div",{className:`text-[9px] mb-0.5 ${r?"text-zinc-500":"text-zinc-600"}`,children:"生成的运镜提示词:"}),s.jsx("div",{className:"text-[10px] text-cyan-400 font-mono leading-relaxed break-all",children:y})]})]})},uce=cce,dce=e=>{const t=[],n=lu.find(o=>o.id===e.cameraId),r=cu.find(o=>o.id===e.lensId),i=uu.find(o=>o.id===e.focalLengthId),a=du.find(o=>o.id===e.apertureId);return n&&t.push(`[${n.name}]`),r&&t.push(`[${r.name}]`),i&&t.push(`[${i.value}mm]`),a&&t.push(`[${a.value}]`),t.join(" + ")},hce=({node:e,isDark:t,updateNode:n})=>{var u;const r=((u=e.settings)==null?void 0:u.cinemaConfig)||{cameraId:null,lensId:null,focalLengthId:null,apertureId:null},i=d=>{n(e.id,{settings:{...e.settings,cinemaConfig:d},content:wm(d)})},a=d=>{i({...r,cameraId:r.cameraId===d?null:d})},o=d=>{i({...r,lensId:r.lensId===d?null:d})},l=d=>{i({...r,focalLengthId:r.focalLengthId===d?null:d})},c=d=>{i({...r,apertureId:r.apertureId===d?null:d})};return lu.find(d=>d.id===r.cameraId),cu.find(d=>d.id===r.lensId),uu.find(d=>d.id===r.focalLengthId),du.find(d=>d.id===r.apertureId),dce(r),wm(r),s.jsx("div",{className:`h-full flex flex-col ${t?"bg-zinc-900":"bg-white"}`,children:s.jsxs("div",{className:"flex-1 overflow-y-auto p-2 space-y-3 hide-scrollbar",children:[s.jsxs("div",{children:[s.jsxs("div",{className:`text-[10px] mb-1.5 flex items-center gap-1 ${t?"text-zinc-500":"text-zinc-600"}`,children:[s.jsx(Ya,{size:10,className:t?"text-white/60":"text-blue-400"}),s.jsx("span",{className:"font-medium",children:"摄像机"}),s.jsxs("span",{className:"text-[8px] opacity-60",children:["(",lu.length,"款)"]})]}),s.jsx("div",{className:"flex gap-1.5 overflow-x-auto pb-2 director-scrollbar",children:lu.map(d=>s.jsxs("div",{onMouseDown:h=>h.stopPropagation(),onClick:()=>a(d.id),className:`flex-shrink-0 w-16 cursor-pointer rounded-lg overflow-hidden border ${r.cameraId===d.id?t?"border-white/50 ring-1 ring-white/30":"border-blue-500 ring-1 ring-blue-500/30":t?"border-zinc-700/50 hover:border-zinc-600":"border-zinc-300 hover:border-zinc-400"}`,children:[s.jsx("div",{className:`w-16 h-16 flex items-center justify-center overflow-hidden ${r.cameraId===d.id&&t?"bg-white/5":t?"bg-zinc-800":"bg-zinc-100"}`,children:s.jsx("img",{src:`/cinema/${d.image}`,alt:d.name,className:"w-full h-full object-cover",onError:h=>{h.target.style.display="none"}})}),s.jsx("div",{className:`p-1 text-center ${r.cameraId===d.id&&t?"bg-white/5":t?"bg-zinc-800/80":"bg-zinc-100"}`,children:s.jsx("span",{className:`text-[9px] font-medium ${t?"text-white":"text-zinc-900"}`,children:d.name})})]},d.id))})]}),s.jsxs("div",{children:[s.jsxs("div",{className:`text-[10px] mb-1.5 flex items-center gap-1 ${t?"text-zinc-500":"text-zinc-600"}`,children:[s.jsx(Yd,{size:10,className:t?"text-white/60":"text-purple-400"}),s.jsx("span",{className:"font-medium",children:"镜头"}),s.jsxs("span",{className:"text-[8px] opacity-60",children:["(",cu.length,"款)"]})]}),s.jsx("div",{className:"flex gap-1.5 overflow-x-auto pb-2 director-scrollbar",children:cu.map(d=>s.jsxs("div",{onMouseDown:h=>h.stopPropagation(),onClick:()=>o(d.id),className:`flex-shrink-0 w-14 cursor-pointer rounded-lg overflow-hidden border ${r.lensId===d.id?t?"border-white/50 ring-1 ring-white/30":"border-purple-500 ring-1 ring-purple-500/30":t?"border-zinc-700/50 hover:border-zinc-600":"border-zinc-300 hover:border-zinc-400"}`,children:[s.jsx("div",{className:`w-14 h-14 flex items-center justify-center overflow-hidden ${r.lensId===d.id&&t?"bg-white/5":t?"bg-zinc-800":"bg-zinc-100"}`,children:s.jsx("img",{src:`/cinema/${d.image}`,alt:d.name,className:"w-full h-full object-cover",onError:h=>{h.target.style.display="none"}})}),s.jsx("div",{className:`p-0.5 text-center ${r.lensId===d.id&&t?"bg-white/5":t?"bg-zinc-800/80":"bg-zinc-100"}`,children:s.jsx("span",{className:`text-[8px] font-medium block leading-tight ${t?"text-white":"text-zinc-900"}`,children:d.name})})]},d.id))})]}),s.jsxs("div",{children:[s.jsxs("div",{className:`text-[10px] mb-1.5 flex items-center gap-1 ${t?"text-zinc-500":"text-zinc-600"}`,children:[s.jsx(Tx,{size:10,className:t?"text-white/60":"text-green-400"}),s.jsx("span",{className:"font-medium",children:"焦段"}),s.jsxs("span",{className:"text-[8px] opacity-60",children:["(",uu.length,"个)"]})]}),s.jsx("div",{className:"flex gap-1.5 flex-wrap",children:uu.map(d=>s.jsxs("div",{onMouseDown:h=>h.stopPropagation(),onClick:()=>l(d.id),className:`w-12 h-12 cursor-pointer rounded-lg border flex flex-col items-center justify-center ${r.focalLengthId===d.id?t?"border-white/50 ring-1 ring-white/30 bg-white/5":"border-green-500 ring-1 ring-green-500/30 bg-green-500/10":t?"border-zinc-700/50 hover:border-zinc-600 bg-zinc-800/50":"border-zinc-300 hover:border-zinc-400 bg-zinc-100"}`,children:[s.jsx("span",{className:`text-base font-bold ${r.focalLengthId===d.id?t?"text-white/90":"text-green-400":t?"text-white":"text-zinc-900"}`,children:d.value}),s.jsx("span",{className:`text-[8px] ${t?"text-zinc-500":"text-zinc-600"}`,children:"mm"})]},d.id))})]}),s.jsxs("div",{children:[s.jsxs("div",{className:`text-[10px] mb-1.5 flex items-center gap-1 ${t?"text-zinc-500":"text-zinc-600"}`,children:[s.jsx(Yd,{size:10,className:t?"text-white/60":"text-orange-400"}),s.jsx("span",{className:"font-medium",children:"光圈"}),s.jsxs("span",{className:"text-[8px] opacity-60",children:["(",du.length,"个)"]})]}),s.jsx("div",{className:"flex gap-1.5 overflow-x-auto pb-2 director-scrollbar",children:du.map(d=>s.jsxs("div",{onMouseDown:h=>h.stopPropagation(),onClick:()=>c(d.id),className:`flex-shrink-0 w-16 cursor-pointer rounded-lg overflow-hidden border ${r.apertureId===d.id?t?"border-white/50 ring-1 ring-white/30":"border-orange-500 ring-1 ring-orange-500/30":t?"border-zinc-700/50 hover:border-zinc-600":"border-zinc-300 hover:border-zinc-400"}`,children:[s.jsx("div",{className:`w-16 h-16 flex items-center justify-center overflow-hidden ${r.apertureId===d.id&&t?"bg-white/5":t?"bg-zinc-800":"bg-zinc-100"}`,children:s.jsx("img",{src:`/cinema/${d.image}`,alt:d.value,className:"w-full h-full object-cover",onError:h=>{h.target.style.display="none"}})}),s.jsx("div",{className:`p-1 text-center ${r.apertureId===d.id&&t?"bg-white/5":t?"bg-zinc-800/80":"bg-zinc-100"}`,children:s.jsx("span",{className:`text-[9px] font-medium ${t?"text-white":"text-zinc-900"}`,children:d.value})})]},d.id))})]})]})})},pce=_.memo(hce),p_="qiaodoumayi_prompt_library",fce=()=>typeof window<"u"&&("__TAURI__"in window||"__TAURI_INTERNALS__"in window);async function RE(e,t="确认删除"){if(fce())try{const{ask:n}=await mn(async()=>{const{ask:r}=await Promise.resolve().then(()=>L0);return{ask:r}},void 0,import.meta.url);return await n(e,{title:t,kind:"warning",okLabel:"删除",cancelLabel:"取消"})}catch{return window.confirm(e)}return window.confirm(e)}function PE(e,t){const i=l=>{const c=JSON.stringify(l);try{return localStorage.setItem(e,c),!0}catch(u){if(u instanceof DOMException&&(u.name==="QuotaExceededError"||u.code===22))return!1;throw u}};if(i(t))return;const a=t.slice(-80).map(l=>({...l,prompt:l.prompt.length>4e3?l.prompt.slice(0,4e3)+"...":l.prompt}));if(i(a)){console.warn("[Agent提示词库] 存储空间不足,已裁剪后保存(保留最近",80,"条,单条",4e3,"字)");return}const o=t.slice(-30).map(l=>({...l,prompt:l.prompt.length>1500?l.prompt.slice(0,1500)+"...":l.prompt}));if(i(o)){console.warn("[Agent提示词库] 存储空间严重不足,已大幅裁剪后保存");return}console.warn("[Agent提示词库] 无法保存到本地存储,请清理浏览器缓存或关闭其他占用存储的应用")}const OE=[{id:"template-1",name:"【角色板】",prompt:"你是一位专业的角色设计师,擅长根据参考图片创建详细的角色描述..."},{id:"template-2",name:"【分镜版】",prompt:"你是一位经验丰富的分镜师,能够将故事情节转化为视觉化的分镜脚本..."},{id:"template-3",name:"【情绪版】",prompt:"你是一位情感设计专家,擅长捕捉和表达情绪氛围..."},{id:"template-4",name:"【高清放大】",prompt:"你是一位图像增强专家,专注于提升图片质量和细节..."},{id:"template-5",name:"【九宫格分镜脚本】",prompt:"你是一位视觉叙事专家,擅长创建九宫格分镜脚本..."}],mce=({node:e,isDark:t,updateNode:n,connections:r=[],nodes:i=[],apiConfigs:a=[],globalApiKey:o="",getConnectedInputImages:l,getConnectedInputItems:c,getOrderedInputItems:u,promptLibrary:d,setPromptLibrary:h,setNodes:p,setConnections:f,generateId:b,view:g,canvasRef:y,connectingSource:w,connectingTarget:v,connectingInputType:m,setConnectingSource:z,setConnectingTarget:C,setConnectingInputType:E,setMousePos:I,getConnectedImageForInput:R,dataVersion:A})=>{var Zt,Sn,jn,_n,Cn,Kn,Xn,$r,Tr,kr,Rr,sr;const O=fr.useRef(null),F=fr.useRef(null),L=fr.useRef(null),X=fr.useRef({systemPrompt:null,userPrompt:null,outputContent:null}),T=fr.useRef({systemPrompt:!1,userPrompt:!1,outputContent:!1}),q=_.useMemo(()=>a.filter(mt=>mt.type==="Chat"),[a]),H=q.length>0?q[0].id:"gemini-3-pro",[J,Z]=_.useState(((Zt=e.settings)==null?void 0:Zt.modelStage1)||H),[B,V]=_.useState(((Sn=e.settings)==null?void 0:Sn.modelStage2)||H),[N,j]=_.useState(!1),[k,W]=_.useState(!1),M=fr.useRef(!1),Y=fr.useRef(null),se=((jn=e.settings)==null?void 0:jn.outputContent)||"",[ie,oe]=_.useState(se),re=fr.useRef(ie);fr.useEffect(()=>{re.current=ie},[ie]),fr.useEffect(()=>{var It;const mt=((It=e.settings)==null?void 0:It.outputContent)||"";mt!==ie&&oe(mt)},[(_n=e.settings)==null?void 0:_n.outputContent,e.id]);const ee=_.useMemo(()=>q.map(mt=>mt.id).join(","),[q]);fr.useEffect(()=>{if(q.length===0)return;const mt=q[0].id,It=q.some(cn=>cn.id===J),tn=q.some(cn=>cn.id===B);(!It||!tn)&&(It||Z(mt),tn||V(mt),n(e.id,{settings:{...ke.current,...!It&&{modelStage1:mt},...!tn&&{modelStage2:mt}}}))},[ee]);const[pe,we]=_.useState(()=>{var mt;return!!((mt=e.settings)!=null&&mt._agentRunning)}),[Q,me]=_.useState(!1),[ue,U]=_.useState(!1),[G,te]=_.useState([]),[ge,ne]=_.useState(null),[le,fe]=_.useState({name:"",content:""}),[be,de]=_.useState(!1),[$e,ze]=_.useState(null),[_e,Ee]=_.useState({name:"",prompt:""}),[Ce,xe]=_.useState(()=>{try{const mt=localStorage.getItem(p_);return mt?JSON.parse(mt):OE}catch{return OE}}),Ne=d??Ce,ve=h??xe;fr.useEffect(()=>{var It;if(T.current.systemPrompt){T.current.systemPrompt=!1;return}const mt=((It=e.settings)==null?void 0:It.systemPrompt)||"";O.current&&O.current.value!==mt&&(O.current.value=mt)},[(Cn=e.settings)==null?void 0:Cn.systemPrompt]),fr.useEffect(()=>{var It;if(T.current.userPrompt){T.current.userPrompt=!1;return}const mt=((It=e.settings)==null?void 0:It.userPrompt)||"";F.current&&F.current.value!==mt&&(F.current.value=mt)},[(Kn=e.settings)==null?void 0:Kn.userPrompt]),fr.useEffect(()=>{L.current&&L.current.value!==ie&&(L.current.value=ie)},[ie]);const ke=fr.useRef(e.settings);ke.current=e.settings;const Ie=fr.useRef(n);Ie.current=n,fr.useEffect(()=>{var It;const mt=!!((It=e.settings)!=null&&It._agentRunning);we(mt)},[(Xn=e.settings)==null?void 0:Xn._agentRunning]);const Pe=fr.useCallback(mt=>{oe(mt);const It=L.current;It&&(It.value=mt,It.scrollTop=It.scrollHeight),mt.length>0&&!M.current&&(M.current=!0,W(!0))},[]);fr.useEffect(()=>()=>{var Rn;Object.values(X.current).forEach(bt=>{bt&&clearTimeout(bt)});const mt={};let It=!1;const tn=ke.current||{};if(O.current){const bt=O.current.value,bn=tn.systemPrompt||"";bt!==bn&&(mt.systemPrompt=bt,It=!0)}if(F.current){const bt=F.current.value,bn=tn.userPrompt||"";bt!==bn&&(mt.userPrompt=bt,It=!0)}const cn=((Rn=L.current)==null?void 0:Rn.value)??re.current,zn=tn.outputContent||"";cn!==zn&&(mt.outputContent=cn,It=!0),It&&Ie.current(e.id,{settings:{...tn,...mt}})},[e.id]);const Te=fr.useRef(null),Be=fr.useRef(null);_.useEffect(()=>{if(h)return;Be.current=Ce;const mt=setTimeout(()=>{PE(p_,Ce),Te.current=null,Be.current=null},400);return Te.current=mt,()=>{Te.current&&(clearTimeout(Te.current),Te.current=null),Be.current&&(PE(p_,Be.current),Be.current=null)}},[Ce,h]);const He=_.useMemo(()=>r.filter(tn=>tn.to===e.id&&(!tn.inputType||tn.inputType==="default")).map(tn=>{const cn=i.find(zn=>zn.id===tn.from);if(!cn)return"";if(cn.type==="preview"){if(cn.selectedPreviewImage)return`${tn.from}:${cn.selectedPreviewImage}`;if(cn.previewMjImages&&Array.isArray(cn.previewMjImages))return`${tn.from}:${cn.previewMjImages[0]||""}`}return`${tn.from}:${cn.content||""}`}).join("|"),[r,i,e.id]),{connectedImages:Je,connectedVideos:Me}=_.useMemo(()=>{const mt=u?u(e.id):c?c(e.id):[],It=mt.filter(cn=>cn.type==="image").map(cn=>cn.url),tn=mt.filter(cn=>cn.type==="video").map(cn=>cn.url);return{connectedImages:It,connectedVideos:tn}},[u,c,e.id,He,A]),Re=Je.length>0||Me.length>0,Ve=_.useMemo(()=>Je.join("|"),[Je]),Ze=iu(Je),je=_.useMemo(()=>Ze.map((It,tn)=>({originalUrl:Je[tn],url:It.content||Je[tn],isLoading:It.isLoading,hasError:It.hasError})),[Ze,Ve]),[Le,Xe]=_.useState(null),[qe,tt]=_.useState(null),Ye=_.useMemo(()=>u?u(e.id):c?c(e.id):[],[u,c,e.id,He,A]),ct=_.useMemo(()=>{const mt=new Map;return r.filter(tn=>tn.to===e.id&&(!tn.inputType||tn.inputType==="default")).forEach(tn=>{const cn=i.find(Rn=>Rn.id===tn.from);if(!cn)return;(()=>{var Rn;if(cn.type==="preview")return cn.selectedPreviewImage?[cn.selectedPreviewImage]:cn.previewMjImages&&Array.isArray(cn.previewMjImages)&&cn.previewMjImages.length>0?[cn.previewMjImages[0]]:cn.content?[cn.content]:[];if(cn.type==="input-image"||cn.type==="video-input"||cn.type==="rh-app"){if(cn.content)return[cn.content];const bt=(Rn=cn.settings)==null?void 0:Rn.generatedImages;return bt!=null&&bt.length?bt.map(bn=>bn.fullUrl):[]}return cn.content?[cn.content]:[]})().forEach(Rn=>{Rn&&mt.set(Rn,tn.from)})}),mt},[r,i,e.id]),pt=_.useCallback((mt,It)=>{if(It.preventDefault(),It.stopPropagation(),!f)return;const tn=ct.get(mt);tn&&f(cn=>cn.filter(zn=>!(zn.from===tn&&zn.to===e.id&&(!zn.inputType||zn.inputType==="default"))))},[ct,e.id,f]),ht=_.useCallback((mt,It)=>{if(mt===It||mt<0||It<0||mt>=Je.length||It>=Je.length)return;const tn=Je[mt],cn=Je[It];if(!tn||!cn)return;const zn=Ye.map(Sr=>Sr.url),Rn=zn.indexOf(tn),bt=zn.indexOf(cn);if(Rn<0||bt<0)return;const bn=[...zn],[An]=bn.splice(Rn,1),Vn=Rn{pt(mt,It)},[pt]),un=_.useCallback((mt,It)=>{if(mt===It||mt<0||It<0||mt>=Me.length||It>=Me.length)return;const tn=Me[mt],cn=Me[It];if(!tn||!cn)return;const zn=Ye.map(Sr=>Sr.url),Rn=zn.indexOf(tn),bt=zn.indexOf(cn);if(Rn<0||bt<0)return;const bn=[...zn],[An]=bn.splice(Rn,1),Vn=Rn{j(Dn)},[Dn]);const it=_.useMemo(()=>{const mt=new Map(i.map(cn=>[cn.id,cn])),It=r.filter(cn=>cn.to===e.id&&cn.inputType==="agent_meta_prompt"),tn=[];for(const cn of It){const zn=mt.get(cn.from);zn&&(zn.type==="text-node"||zn.type==="custom-agent")&&tn.push(zn)}return tn},[r,i,e.id]),Lt=_.useMemo(()=>{const mt=new Map(i.map(cn=>[cn.id,cn])),It=r.filter(cn=>cn.to===e.id&&cn.inputType==="agent_user_input"),tn=[];for(const cn of It){const zn=mt.get(cn.from);zn&&(zn.type==="text-node"||zn.type==="custom-agent")&&tn.push(zn)}return tn},[r,i,e.id]),gt=_.useMemo(()=>it[0]??null,[it]),Jt=_.useMemo(()=>Lt[0]??null,[Lt]),Wt=_.useMemo(()=>it.find(mt=>mt.type==="custom-agent")??null,[it]),Pt=_.useMemo(()=>Lt.find(mt=>mt.type==="custom-agent")??null,[Lt]),Bt=_.useMemo(()=>{const mt=new Set(["agent_meta_prompt","agent_user_input","agent_output",void 0]),It=r.reduce((zn,Rn)=>(Rn.to===e.id&&mt.has(Rn.inputType)&&zn.push(Rn),zn),[]),tn=new Map(i.map(zn=>[zn.id,zn])),cn=[];for(const zn of It){const Rn=tn.get(zn.from);(Rn==null?void 0:Rn.type)==="custom-agent"&&cn.push(Rn)}return cn},[r,i,e.id]),zt=_.useMemo(()=>{var tn,cn;if(it.length===0)return"";const mt=new Map(i.map(zn=>[zn.id,zn])),It=[];for(const zn of it){const Rn=mt.get(zn.id)||zn,bt=Rn.type==="custom-agent"?(((tn=Rn.settings)==null?void 0:tn.outputContent)||"").trim():(((cn=Rn.settings)==null?void 0:cn.text)||Rn.prompt||Rn.content||"").trim();bt&&It.push(bt)}return It.join(` + +`)},[it,i]),Gt=_.useMemo(()=>{var tn,cn;if(Lt.length===0)return"";const mt=new Map(i.map(zn=>[zn.id,zn])),It=[];for(const zn of Lt){const Rn=mt.get(zn.id)||zn,bt=Rn.type==="custom-agent"?(((tn=Rn.settings)==null?void 0:tn.outputContent)||"").trim():(((cn=Rn.settings)==null?void 0:cn.text)||Rn.prompt||Rn.content||"").trim();bt&&It.push(bt)}return It.join(` + +`)},[Lt,i]),qt=_.useMemo(()=>{var tn;if(Bt.length===0)return"";const mt=new Map(i.map(cn=>[cn.id,cn])),It=[];for(const cn of Bt){const Rn=(((tn=(mt.get(cn.id)||cn).settings)==null?void 0:tn.outputContent)||"").trim();Rn.length>0&&It.push(Rn)}return It.join(` + +`)},[Bt,i]),De=_.useCallback(()=>{const mt=r.reduce((cn,zn)=>(zn.from===e.id&&cn.add(zn.to),cn),new Set),It=new Map(i.map(cn=>[cn.id,cn])),tn=[];return mt.forEach(cn=>{const zn=It.get(cn);zn&&tn.push(zn)}),tn},[r,i,e.id]),st=_.useCallback(mt=>{var cn;if(!mt.trim()||!p)return;const It=De(),tn=[];for(let zn=0;znzn.id)});for(const zn of tn){const Rn=((cn=zn.settings)==null?void 0:cn.text)||"",bt=zn.prompt||"",bn=Rn||bt;!bn.trim()||bn===mt?(n(zn.id,{settings:{...zn.settings,text:mt},prompt:mt}),console.log(`[CustomAgentNode] Updated text node ${zn.id} with output content`)):console.log(`[CustomAgentNode] Skipped updating text node ${zn.id} as it has manual content`)}},[De,n,p]),Ae=_.useCallback((mt,It)=>{if(mt.stopPropagation(),mt.preventDefault(),y!=null&&y.current&&g&&I){const tn=y.current.getBoundingClientRect(),cn=(mt.clientX-tn.left-g.x)/g.zoom,zn=(mt.clientY-tn.top-g.y)/g.zoom;I({x:cn,y:zn})}C&&C(e.id),E&&E(It)},[e.id,y,g,I,C,E]),nt=_.useCallback((mt,It)=>{console.log(`[CustomAgentNode] handleInputMouseUp START, inputType: ${It}, connectingSource: ${w}`),mt.__handledByCustomAgent=!0,mt.stopPropagation(),mt.preventDefault(),w&&w!==e.id&&f&&b?(r.some(cn=>cn.from===w&&cn.to===e.id&&cn.inputType===It)?console.log("[CustomAgentNode] Connection already exists"):(It==="agent_user_input"||It==="agent_meta_prompt"||f(zn=>zn.filter(Rn=>!(Rn.to===e.id&&Rn.inputType===It))),f(zn=>[...zn,{id:b(),from:w,to:e.id,inputType:It}]),console.log(`[CustomAgentNode] ✅ Successfully connected to ${It} from ${w}`)),z&&(z(null),console.log("[CustomAgentNode] Cleared connectingSource"))):console.log("[CustomAgentNode] handleInputMouseUp - no connectingSource or invalid conditions",{hasConnectingSource:!!w,isSameNode:w===e.id,hasSetConnections:!!f,hasGenerateId:!!b})},[e.id,w,r,f,b,z]),_t=_.useCallback((mt,It)=>{const tn=mt.target;tn.closest("[data-input-type]")||(mt.__handledByCustomAgent=!0,!(!w&&(tn.tagName==="BUTTON"||tn.tagName==="INPUT"||tn.tagName==="TEXTAREA"||tn.tagName==="SELECT"||tn.closest("button")||tn.closest("input")||tn.closest("select")))&&(mt.stopPropagation(),mt.preventDefault(),console.log(`[CustomAgentNode] Area Drop detected. Source: ${w}, Input: ${It}`),w&&w!==e.id&&f&&b&&(r.some(Rn=>Rn.from===w&&Rn.to===e.id&&Rn.inputType===It)||(It==="agent_user_input"||It==="agent_meta_prompt"||f(bt=>bt.filter(bn=>!(bn.to===e.id&&bn.inputType===It))),f(bt=>[...bt,{id:b(),from:w,to:e.id,inputType:It}]),console.log(`[CustomAgentNode] ✅ Connected to ${It} via Area Drop`)),z&&z(null))))},[e.id,w,r,f,b,z]),xt=_.useCallback(mt=>{n(e.id,{settings:{...ke.current,systemPrompt:mt.prompt}}),O.current&&(O.current.value=mt.prompt,T.current.systemPrompt=!0),me(!1)},[e.id,n]),Tt=_.useCallback(mt=>{n(e.id,{settings:{...ke.current,systemPrompt:mt.content}}),O.current&&(O.current.value=mt.content,T.current.systemPrompt=!0),U(!1)},[e.id,n]),St=_.useCallback(()=>{if(!_e.name.trim()||!_e.prompt.trim()){alert("请填写模板名称和内容");return}if($e)ve(mt=>mt.map(It=>It.id===$e?{...It,name:_e.name,prompt:_e.prompt}:It));else{const mt={id:`custom-${Date.now()}`,name:_e.name,prompt:_e.prompt};ve(It=>[...It,mt])}Ee({name:"",prompt:""}),ze(null),de(!1)},[_e,$e,ve]),Qe=_.useCallback(async mt=>{await RE("确定要删除这个模板吗?")&&ve(tn=>tn.filter(cn=>cn.id!==mt))},[ve]),Ue=_.useCallback(mt=>{Ee({name:mt.name,prompt:mt.prompt}),ze(mt.id),de(!0)},[]),Ge=_.useCallback(()=>{if(!Tn.trim()){alert("请先输入元提示词");return}Ee({name:"",prompt:Tn}),ze(null),de(!0)},[Tn]),at=_.useCallback(async()=>{var bt,bn,An,Vn,Sr,Ir,Wr,ir,Yn,Zn,Ke,Et,Gn,Ut,Bn,Nr,br,vr,gr,nr,tr,jr,Br,_r,es,Ur,zs,Ts,os,wi,ki,gi,$i,gs,Ri,Ki;if(pe)return;X.current.systemPrompt&&(clearTimeout(X.current.systemPrompt),X.current.systemPrompt=null),X.current.userPrompt&&(clearTimeout(X.current.userPrompt),X.current.userPrompt=null);const mt=((bt=O.current)==null?void 0:bt.value)??Tn,It=((bn=F.current)==null?void 0:bn.value)??Ht;(mt!==Tn||It!==Ht)&&(T.current.systemPrompt=!0,T.current.userPrompt=!0,n(e.id,{settings:{...ke.current,systemPrompt:mt,userPrompt:It}}));let tn="";const cn=[];mt.trim()&&cn.push(mt.trim()),zt.trim()&&cn.push(zt.trim()),qt.trim()&&cn.push(`[引用Agent输出]: +${qt.trim()}`),tn=cn.join(` + +`);let zn="";const Rn=[];if(It.trim()&&Rn.push(It.trim()),Gt.trim()&&Rn.push(Gt.trim()),qt.trim()&&Rn.push(`[引用Agent输出]: +${qt.trim()}`),zn=Rn.join(` + +`),!tn.trim()&&!zn.trim()){alert("请至少输入元提示词或用户需求,或连接上游文字节点/Agent节点");return}console.log("[CustomAgentNode] Generating with merged prompts:",{systemPrompt:mt.length,metaPromptFromUpstream:zt.length,agentOutputFromUpstream:qt.length,finalSystemPrompt:tn.length,userPrompt:It.length,userInputFromUpstream:Gt.length,finalUserPrompt:zn.length}),we(!0),M.current=!1,Y.current=new AbortController,n(e.id,{settings:{...ke.current,_agentRunning:!0}});try{const Ps=a.find(Ar=>Ar.type==="Chat"&&Ar.id===J),Si=(Ps==null?void 0:Ps.key)||o,xi=((Ps==null?void 0:Ps.url)||"https://ai.comfly.chat").replace(/\/+$/,"");if(!Si){alert("请先配置 API Key"),we(!1);return}const li=[],ca=je.filter(Ar=>!Ar.hasError).length,ea=1.5*1024*1024,Wa=3*1024*1024,ks=1920;if(console.log(`[CustomAgentNode] 图片压缩策略: ${ca}张图片, 目标大小${(ea/1024).toFixed(0)}KB, 上限${(Wa/1024).toFixed(0)}KB, 最大边${ks}px`),Je.length>0)for(let Ar=0;ArsetTimeout(Ns,500)));let ls=Or.url;try{if(ls.startsWith("blob:")){console.log(`[CustomAgentNode] Converting & compressing Blob URL image ${Ar+1}...`);const Ns=await fetch(ls).then(ii=>ii.blob()),Di=await new Promise((ii,Hs)=>{const ji=new FileReader;ji.onerror=()=>Hs(new Error("FileReader failed")),ji.onloadend=()=>ii(ji.result),ji.readAsDataURL(Ns)});ls=await $h(Di,ea,Wa,ks)}else ls.startsWith("data:")?(console.log(`[CustomAgentNode] Compressing DataURL image ${Ar+1}...`),ls=await $h(ls,ea,Wa,ks)):(ls.startsWith("http://")||ls.startsWith("https://"))&&console.log(`[CustomAgentNode] Image ${Ar+1} is HTTP URL, keeping as-is`);console.log(`[CustomAgentNode] Image ${Ar+1} processed successfully`)}catch(Ns){console.error(`[CustomAgentNode] Failed to process image ${Ar+1}:`,Ns),alert(`图片${Ar+1}处理失败,请重新连接图片`),we(!1);return}li.push({type:"image_url",image_url:{url:ls,detail:ca>4?"low":"high"}})}if(Me.length>0){console.log(`[CustomAgentNode] 添加 ${Me.length} 个视频到消息内容`);for(let Ar=0;ArDi.blob()),Ns=await new Promise((Di,ii)=>{const Hs=new FileReader;Hs.onerror=()=>ii(new Error("FileReader failed")),Hs.onloadend=()=>Di(Hs.result),Hs.readAsDataURL(ls)});Or=Ns,console.log(`[CustomAgentNode] Video ${Ar+1} converted to data URL (${(Ns.length/1024/1024).toFixed(2)}MB)`)}catch(ls){console.error(`[CustomAgentNode] Failed to convert video ${Ar+1}:`,ls),alert(`视频${Ar+1}处理失败,请重新连接视频`),we(!1);return}li.push({type:"image_url",image_url:{url:Or,detail:"high"}}),console.log(`[CustomAgentNode] 视频 ${Ar+1} 已添加: ${Or.substring(0,50)}...`)}}const Pi=aO(zn,5e4,35e3,1e4);Pi.wasTruncated&&console.warn(`[CustomAgentNode] 用户需求过长已截断: ${zn.length} → ${Pi.text.length}`);const _i=tn,ta=Pi.text;let ua="";ta.trim()&&(ua=ta.trim()),Re&&(ua=`[参考媒体已提供: ${Je.length} 张图片${Me.length>0?`, ${Me.length} 个视频`:""}] + +${ua}`),li.push({type:"text",text:ua||"请分析提供的内容并生成执行方案。"});const Wi=(Ps==null?void 0:Ps.modelName)||J,ci=li.some(Ar=>Ar.type==="image_url"),Oi=ua||"请分析提供的内容并生成执行方案。",da=Wi.startsWith("gpt-5"),ha=_i||"You are an intelligent creative director. Analyze the provided content and create a detailed execution plan.";let Li;if(da){const Ar=`[指令要求] +${ha} + +[用户输入] +${Oi}`;console.log("[CustomAgentNode] GPT 5.x detected, merging system prompt into user message for model:",Wi),ci?Li=[{role:"user",content:li.map((ls,Ns)=>Ns===li.length-1&&ls.type==="text"?{type:"text",text:Ar}:ls)}]:Li=[{role:"user",content:Ar}]}else Li=[{role:"system",content:ha},{role:"user",content:ci?li:Oi}];const ka=Me.length>0,dt=1/0,vt=1/0,Kt=async()=>{let Ar=Li,Or=_i,ls=ta,Ns=li.filter(ui=>ui.type==="image_url"),Di=[],ii=!1,Hs={model:Wi,messages:da?[{role:"user",content:ci?li.map((ui,fs)=>fs===li.length-1&&ui.type==="text"?{type:"text",text:`[指令要求] +${Or} + +[用户输入] +${ls}`}:ui):`[指令要求] +${Or} + +[用户输入] +${ls}`}]:[{role:"system",content:Or},{role:"user",content:ci?li:ls}],max_tokens:16e3,temperature:.7,stream:!0},ji=iO(Hs),na=(ji/1024/1024).toFixed(2);return console.log(`[CustomAgentNode] 初始 payload 大小: ${na}MB`),{requestBody:Hs,payloadSize:ji,wasOptimized:ii,optimizationSteps:Di}},{requestBody:an,payloadSize:en,wasOptimized:rn,optimizationSteps:gn}=await Kt(),lr=(en/1024/1024).toFixed(2);console.log(`[CustomAgentNode] 最终 payload 大小: ${lr}MB (streaming模式)`);const On=await fetch(`${xi}/v1/chat/completions`,{method:"POST",headers:{Authorization:`Bearer ${Si}`,"Content-Type":"application/json"},body:JSON.stringify(an),signal:(An=Y.current)==null?void 0:An.signal});if(!On.ok){const Ar=await On.text().catch(()=>"");let Or="";throw On.status===413?Or=`请求内容过大 (${lr}MB),已超过服务器限制。 + +建议: +1. 减少连接的图片数量(当前 ${ca} 张,建议减少至 1-2 张) +2. 缩短元提示词或用户需求 +3. 检查网络连接是否正常`:On.status===429?Or="API 请求频率过高,请稍后重试":Or=`API 请求失败: ${On.status}${Ar?` - ${Ar.substring(0,200)}`:""}`,new Error(Or)}let wr="";if(On.body){const Ar=On.body.getReader(),Or=new TextDecoder("utf-8");let ls="",Ns=0;try{for(;;){const{done:Di,value:ii}=await Ar.read();if(Di){if(ls.trim()){const na=ls.split(` +`);for(const ui of na){const fs=ui.trim();if(!(!fs||fs==="data: [DONE]")){if(!fs.startsWith("data: ")){if(fs.startsWith("{"))try{const Js=JSON.parse(fs),Ai=((Ir=(Sr=(Vn=Js.choices)==null?void 0:Vn[0])==null?void 0:Sr.delta)==null?void 0:Ir.content)||((Yn=(ir=(Wr=Js.choices)==null?void 0:Wr[0])==null?void 0:ir.message)==null?void 0:Yn.content)||Js.content;Ai&&(wr+=Ai)}catch{}continue}try{const Js=fs.slice(6);if(Js==="[DONE]"||Js.trim()==="")continue;const Ai=JSON.parse(Js),Wl=((Et=(Ke=(Zn=Ai.choices)==null?void 0:Zn[0])==null?void 0:Ke.delta)==null?void 0:Et.content)||((Bn=(Ut=(Gn=Ai.choices)==null?void 0:Gn[0])==null?void 0:Ut.message)==null?void 0:Bn.content)||((Nr=Ai.delta)==null?void 0:Nr.content)||Ai.content||"";if(Wl&&(wr+=Wl,Pe(wr)),(vr=(br=Ai.choices)==null?void 0:br[0])!=null&&vr.finish_reason){const Dl=Ai.choices[0].finish_reason;console.log(`[CustomAgentNode] 检测到 finish_reason: ${Dl}`),Dl==="length"?(j(!0),console.warn("[CustomAgentNode] ⚠️ 响应可能被截断(达到长度限制)")):j(!1)}}catch{console.warn(`[CustomAgentNode] 解析 JSON 失败,行内容: ${fs.substring(0,100)}`)}}}}break}const Hs=Or.decode(ii,{stream:!0});ls+=Hs,Ns++;const ji=ls.split(` +`);ls=ji.pop()||"";for(const na of ji){const ui=na.trim();if(!(!ui||ui==="data: [DONE]")){if(ui.startsWith("data: "))try{const fs=ui.slice(6);if(fs==="[DONE]"||fs.trim()==="")continue;const Js=JSON.parse(fs),Ai=((tr=(nr=(gr=Js.choices)==null?void 0:gr[0])==null?void 0:nr.delta)==null?void 0:tr.content)||((_r=(Br=(jr=Js.choices)==null?void 0:jr[0])==null?void 0:Br.message)==null?void 0:_r.content)||((es=Js.delta)==null?void 0:es.content)||Js.content||"";if(Ai&&(wr+=Ai,Pe(wr)),(zs=(Ur=Js.choices)==null?void 0:Ur[0])!=null&&zs.finish_reason){const Wl=Js.choices[0].finish_reason;console.log(`[CustomAgentNode] 检测到 finish_reason: ${Wl}`),Wl==="length"?(j(!0),console.warn("[CustomAgentNode] ⚠️ 响应可能被截断(达到长度限制)")):j(!1)}}catch{console.warn(`[CustomAgentNode] 解析行失败: ${ui.substring(0,50)}...`)}else if(ui.startsWith("{"))try{const fs=JSON.parse(ui),Js=((wi=(os=(Ts=fs.choices)==null?void 0:Ts[0])==null?void 0:os.delta)==null?void 0:wi.content)||(($i=(gi=(ki=fs.choices)==null?void 0:ki[0])==null?void 0:gi.message)==null?void 0:$i.content)||fs.content;Js&&(wr+=Js,Pe(wr))}catch{}}}}}finally{Ar.releaseLock()}if(console.log(`[CustomAgentNode] Streaming 完成,共接收 ${Ns} 个 chunk,${wr.length} 字符`),wr.length===0)console.error("[CustomAgentNode] ⚠️ 警告:流式响应内容为空!");else if(wr.length<50)console.warn(`[CustomAgentNode] ⚠️ 警告:流式响应内容异常短 (${wr.length} 字符),可能被截断`);else if(wr.trim().startsWith("{")||wr.trim().startsWith("["))try{JSON.parse(wr),console.log("[CustomAgentNode] ✅ JSON 格式验证通过"),j(!1)}catch(Di){console.warn("[CustomAgentNode] ⚠️ JSON 格式验证失败,可能被截断:",Di);const ii=(wr.match(/\{/g)||[]).length,Hs=(wr.match(/\}/g)||[]).length,ji=(wr.match(/\[/g)||[]).length,na=(wr.match(/\]/g)||[]).length;(ii>Hs||ji>na)&&(j(!0),ii>Hs&&console.warn(`[CustomAgentNode] 检测到缺少 ${ii-Hs} 个闭合括号,可能被截断`),ji>na&&console.warn(`[CustomAgentNode] 检测到缺少 ${ji-na} 个闭合方括号,可能被截断`))}}else wr=((Ki=(Ri=(gs=(await On.json()).choices)==null?void 0:gs[0])==null?void 0:Ri.message)==null?void 0:Ki.content)||"";if(!wr)throw new Error("AI 未返回有效内容");const cs={...ke.current,outputContent:wr,modelStage1:J,modelStage2:B,isTruncated:N};ke.current=cs,n(e.id,{settings:cs}),oe(wr),st(wr),console.log("[CustomAgentNode] Generation completed:",wr)}catch(Ps){if(Ps instanceof Error&&Ps.name==="AbortError"){console.log("[CustomAgentNode] Generation cancelled by user");return}console.error("[CustomAgentNode] Generation failed:",Ps);const Si=Ps instanceof Error?Ps.message:"未知错误";let xi=Si;Si.includes("Failed to fetch")||Si.includes("ERR_CONNECTION")||Si.includes("NetworkError")?xi=`网络连接失败(请求内容可能过大)。 + +建议: +1. 减少连接的图片数量(当前 ${je.filter(ca=>!ca.hasError).length} 张,建议减少至 1-2 张) +2. 缩短元提示词或用户需求 +3. 检查网络连接是否正常`:(Si.includes("请求内容过大")||Si.includes("Payload"))&&(xi=Si),alert(`生成失败: ${xi}`)}finally{we(!1),n(e.id,{settings:{...ke.current,_agentRunning:!1}})}},[e,Tn,Ht,zt,Gt,qt,J,Je,Me,Re,a,o,n,pe,st]),rt=fr.useCallback(()=>{var mt;(mt=Y.current)==null||mt.abort()},[]),lt=_.useCallback(async()=>{var It,tn,cn,zn,Rn,bt,bn,An,Vn,Sr,Ir,Wr,ir,Yn,Zn,Ke,Et,Gn,Ut,Bn,Nr,br,vr,gr,nr;const mt=(((It=L.current)==null?void 0:It.value)??fn).trim();if(!mt){alert("请先生成内容后再续写");return}we(!0),j(!1),Y.current=new AbortController;try{const tr=((tn=O.current)==null?void 0:tn.value)??Tn,jr=((cn=F.current)==null?void 0:cn.value)??Ht;let Br="";const _r=[];tr.trim()&&_r.push(tr.trim()),zt.trim()&&_r.push(zt.trim()),qt.trim()&&_r.push(`[引用Agent输出]: +${qt.trim()}`),Br=_r.join(` + +`);let es="";const Ur=[];jr.trim()&&Ur.push(jr.trim()),Gt.trim()&&Ur.push(Gt.trim()),qt.trim()&&Ur.push(`[引用Agent输出]: +${qt.trim()}`),es=Ur.join(` + +`);const zs=[],Ts=je.filter(ks=>!ks.hasError).length,os=200*1024,wi=300*1024,ki=1920;if(Je.length>0)for(let ks=0;kssetTimeout(ta,500)));let _i=Pi.url;try{if(_i.startsWith("blob:")){console.log(`[CustomAgentNode] [续写] Converting & compressing Blob URL image ${ks+1}...`);const ta=await fetch(_i).then(Wi=>Wi.blob()),ua=await new Promise((Wi,ci)=>{const Oi=new FileReader;Oi.onerror=()=>ci(new Error("FileReader failed")),Oi.onloadend=()=>Wi(Oi.result),Oi.readAsDataURL(ta)});_i=await $h(ua,os,wi,ki)}else _i.startsWith("data:")&&(console.log(`[CustomAgentNode] [续写] Compressing DataURL image ${ks+1}...`),_i=await $h(_i,os,wi,ki));console.log(`[CustomAgentNode] [续写] Image ${ks+1} processed successfully`)}catch(ta){console.error(`[CustomAgentNode] [续写] Failed to process image ${ks+1}:`,ta);continue}zs.push({type:"image_url",image_url:{url:_i,detail:Ts>4?"low":"high"}})}const gi=a.find(ks=>ks.type==="Chat"&&ks.id===J),$i=(gi==null?void 0:gi.key)||o,gs=((gi==null?void 0:gi.url)||"https://ai.comfly.chat").replace(/\/+$/,"");if(!$i){alert("请先配置 API Key"),we(!1);return}const Ri=(gi==null?void 0:gi.modelName)||J,Ki=Ri.startsWith("gpt-5"),Ps=`${Br} + +--- + +【续写指令】 +你正在继续完成一个被截断的响应。用户已经提供了完整的上下文(包括元提示词、用户需求和图片),以及当前已生成的部分内容。 + +请从"当前已生成内容"的末尾无缝继续,完成剩余部分。 + +要求: +1. **无缝衔接**:从当前内容的最后一个字符或最后一个句子自然继续,不要重复已生成的内容 +2. **保持格式**:如果当前内容是 JSON,请继续完成 JSON 结构;如果是文本,请继续文本内容 +3. **保持风格**:保持与当前内容相同的风格和语调 +4. **完成内容**:确保完成所有未完成的部分,特别是如果当前内容是 JSON,请补全所有缺失的字段和闭合括号 +5. **参考上下文**:请参考用户提供的元提示词、用户需求和图片,确保续写的内容符合原始要求 + +如果当前内容是 JSON 且不完整,请: +- 补全缺失的字段值 +- 添加缺失的闭合括号和方括号 +- 确保 JSON 格式完整且有效 +- 参考元提示词中的 JSON 结构要求 + +如果当前内容是文本,请: +- 继续完成未完成的句子或段落 +- 保持逻辑连贯性 +- 确保内容完整`,Si=zs.length>0,xi=`${es?`[用户需求] +${es} + +`:""}[当前已生成内容(请从此处继续完成)] + +${mt}`;Si&&zs.push({type:"text",text:xi});let li;Ki?(console.log("[CustomAgentNode] [续写] GPT 5.x detected, merging system prompt into user message"),Si?li=[{role:"user",content:zs.map((Pi,_i)=>_i===zs.length-1&&Pi.type==="text"?{type:"text",text:`[指令要求] +${Ps} + +${xi}`}:Pi)}]:li=[{role:"user",content:`[指令要求] +${Ps} + +${xi}`}]):li=[{role:"system",content:Ps},{role:"user",content:Si?zs:xi}],console.log("[CustomAgentNode] [续写] 使用完整上下文继续生成:",{systemPromptLength:Br.length,userPromptLength:es.length,imageCount:zs.filter(ks=>ks.type==="image_url").length,currentOutputLength:mt.length});const ca=await fetch(`${gs}/v1/chat/completions`,{method:"POST",headers:{Authorization:`Bearer ${$i}`,"Content-Type":"application/json"},body:JSON.stringify({model:Ri,messages:li,max_tokens:16e3,temperature:.7,stream:!0}),signal:(zn=Y.current)==null?void 0:zn.signal});if(!ca.ok)throw new Error(`API 请求失败: ${ca.status}`);let ea="";if(ca.body){const ks=ca.body.getReader(),Pi=new TextDecoder("utf-8");let _i="",ta=0;try{for(;;){const{done:ua,value:Wi}=await ks.read();if(ua){if(_i.trim()){const Oi=_i.split(` +`);for(const da of Oi){const ha=da.trim();if(!(!ha||ha==="data: [DONE]")&&ha.startsWith("data: "))try{const Li=ha.slice(6);if(Li==="[DONE]"||Li.trim()==="")continue;const ka=JSON.parse(Li),dt=((bn=(bt=(Rn=ka.choices)==null?void 0:Rn[0])==null?void 0:bt.delta)==null?void 0:bn.content)||((Sr=(Vn=(An=ka.choices)==null?void 0:An[0])==null?void 0:Vn.message)==null?void 0:Sr.content)||((Ir=ka.delta)==null?void 0:Ir.content)||ka.content||"";dt&&(ea+=dt,Pe(mt+ea)),((ir=(Wr=ka.choices)==null?void 0:Wr[0])==null?void 0:ir.finish_reason)==="length"?j(!0):j(!1)}catch{}}}break}_i+=Pi.decode(Wi,{stream:!0}),ta++;const ci=_i.split(` +`);_i=ci.pop()||"";for(const Oi of ci){const da=Oi.trim();if(!(!da||da==="data: [DONE]")&&da.startsWith("data: "))try{const ha=da.slice(6);if(ha==="[DONE]"||ha.trim()==="")continue;const Li=JSON.parse(ha),ka=((Ke=(Zn=(Yn=Li.choices)==null?void 0:Yn[0])==null?void 0:Zn.delta)==null?void 0:Ke.content)||((Ut=(Gn=(Et=Li.choices)==null?void 0:Et[0])==null?void 0:Gn.message)==null?void 0:Ut.content)||((Bn=Li.delta)==null?void 0:Bn.content)||Li.content||"";ka&&(ea+=ka,Pe(mt+ea)),((br=(Nr=Li.choices)==null?void 0:Nr[0])==null?void 0:br.finish_reason)==="length"?j(!0):j(!1)}catch{}}}}finally{ks.releaseLock()}console.log(`[CustomAgentNode] Continue generation 完成,共接收 ${ta} 个 chunk,${ea.length} 字符`)}else ea=((nr=(gr=(vr=(await ca.json()).choices)==null?void 0:vr[0])==null?void 0:gr.message)==null?void 0:nr.content)||"";if(!ea)throw new Error("AI 未返回有效内容");const Wa=mt+ea;n(e.id,{settings:{...ke.current,outputContent:Wa,modelStage1:J,modelStage2:B,isTruncated:N}}),st(Wa),console.log("[CustomAgentNode] Continue generation completed")}catch(tr){if(tr instanceof Error&&tr.name==="AbortError"){console.log("[CustomAgentNode] Continue generation cancelled by user");return}console.error("[CustomAgentNode] Continue generation failed:",tr);const jr=tr instanceof Error?tr.message:"未知错误";alert(`继续生成失败: ${jr}`)}finally{we(!1)}},[fn,J,Tn,Ht,zt,Gt,qt,Je,je,a,o,n,st,N]),ot=_.useCallback(async()=>{var mt,It,tn,cn;if(!fn.trim()){alert("请先生成内容");return}we(!0),Y.current=new AbortController;try{const zn=a.find(Zn=>Zn.type==="Chat"&&Zn.id===B),Rn=(zn==null?void 0:zn.key)||o,bt=((zn==null?void 0:zn.url)||"https://ai.comfly.chat").replace(/\/+$/,"");if(!Rn){alert("请先配置 API Key"),we(!1);return}const bn=(zn==null?void 0:zn.modelName)||B,An=bn.startsWith("gpt-5"),Vn=`你是一位专业的内容改写专家。请对用户提供的文本进行改写,要求: + +1. **保持核心意思不变**:确保改写后的内容表达的核心思想、关键信息与原文完全一致 +2. **改变表达方式**:使用不同的词汇、句式、结构来表达相同的内容 +3. **保持专业性**:如果原文是专业内容(如分镜脚本、技术文档),改写后也要保持专业性 +4. **保持格式**:如果原文有特定格式(如表格、列表、编号),改写后也要保持相同格式 +5. **保持长度**:改写后的内容长度应与原文相近,不要过度精简或扩充 +6. **自然流畅**:改写后的文本要读起来自然流畅,符合中文表达习惯 + +改写技巧: +- 同义词替换:使用意思相近的词汇 +- 句式转换:主动句改被动句,或调整句子结构 +- 顺序调整:在不影响逻辑的情况下调整内容顺序 +- 细节丰富:适当增加描述性细节,但不改变核心意思 + +注意:不要添加原文没有的信息,也不要删除重要信息。`,Sr=`请改写以下内容,保持相同意思但换一种表达方式: + +${fn}`;let Ir;An?(console.log("[CustomAgentNode] GPT 5.x detected for refine, merging system prompt into user message"),Ir=[{role:"user",content:`[指令要求] +${Vn} + +[用户输入] +${Sr}`}]):Ir=[{role:"system",content:Vn},{role:"user",content:Sr}];const Wr=await fetch(`${bt}/v1/chat/completions`,{method:"POST",headers:{Authorization:`Bearer ${Rn}`,"Content-Type":"application/json"},body:JSON.stringify({model:bn,messages:Ir,max_tokens:16e3,temperature:.7}),signal:(mt=Y.current)==null?void 0:mt.signal});if(!Wr.ok)throw new Error(`API 请求失败: ${Wr.status}`);const Yn=((cn=(tn=(It=(await Wr.json()).choices)==null?void 0:It[0])==null?void 0:tn.message)==null?void 0:cn.content)||"";if(!Yn)throw new Error("AI 未返回有效内容");n(e.id,{settings:{...ke.current,outputContent:Yn}}),console.log("[CustomAgentNode] Content rewriting completed")}catch(zn){if(zn instanceof Error&&zn.name==="AbortError"){console.log("[CustomAgentNode] Content rewriting cancelled by user");return}console.error("[CustomAgentNode] Content rewriting failed:",zn),alert(`改写失败: ${zn instanceof Error?zn.message:"未知错误"}`)}finally{we(!1)}},[fn,B,a,o,n,e]);_.useCallback(async()=>{var mt,It,tn,cn,zn,Rn,bt,bn,An,Vn,Sr,Ir,Wr,ir,Yn;if(!fn.trim()){alert("请先生成内容");return}if(!p||!b||!g){console.warn("[CustomAgentNode] Missing required props for node creation");return}we(!0);try{const Zn=fn,Ke=[/(?:shot|镜头|场景|scene)\s*[:\d]+/gi,/第[一二三四五六七八九十\d]+(?:镜|个镜头|场景)/gi,/\d+\.\s*(?:镜头|场景|shot)/gi,/\*\*\d+\*\*/g,/\|\s*\*\*\d+\*\*/g,/【镜头\s*\d+】/g,/镜头\s*\d+[::]/g];let Et=0;Ke.forEach(nr=>{const tr=Zn.match(nr);tr&&tr.length>Et&&(Et=tr.length)}),console.log("[CustomAgentNode] Detected shot count:",Et);const Gn=e.x+e.width+100;let Ut=e.y;const Bn=[],Nr=[],br=a.find(nr=>nr.type==="Chat"&&nr.id===J),vr=(br==null?void 0:br.key)||o,gr=((br==null?void 0:br.url)||"https://ai.comfly.chat").replace(/\/+$/,"");if(!vr)throw new Error("请先配置 API Key");if(Et>=3){console.log("[CustomAgentNode] Creating storyboard node with LLM formatting...");try{const nr=await fetch(`${gr}/v1/chat/completions`,{method:"POST",headers:{Authorization:`Bearer ${vr}`,"Content-Type":"application/json"},body:JSON.stringify({model:(br==null?void 0:br.modelName)||J,messages:[{role:"system",content:`你是一位专业的分镜脚本格式化专家。请将用户提供的文本(可能是表格、列表或混乱文本)整理为规范的分镜表格式。 + +输出要求: +1. 每个镜头必须包含以下字段(用 | 分隔): + 镜头编号 | 场景描述 | 镜头类型 | 运镜方式 | 时长 + +2. 格式示例: + 镜头1 | 极近特写男主角眼睛,紫色瞳孔,锐利眼神 | 特写 | 固定镜头 | 3s + 镜头2 | 中景镜头,极斗篷男人坐在未来王座上 | 中景 | 缓慢推进 | 5s + +3. 镜头类型选项:特写、近景、中景、全景、远景 +4. 运镜方式选项:固定镜头、推进、拉远、横移、跟随、旋转、升降、急剧变焦 +5. 时长格式:Xs(如 3s, 5s, 10s) + +6. 如果原文是表格格式(如 | **01** | 内容 |),请提取其中的关键信息 +7. 如果原文没有明确的镜头类型或运镜,请根据场景描述智能推断 +8. 每行一个镜头,不要添加额外的解释文字 +9. 保持场景描述简洁清晰,突出视觉重点 +10. 去除 HTML 标签(如
    )和 Markdown 格式(如 **)`},{role:"user",content:`请将以下内容整理为规范的分镜表格式: + +${Zn}`}],max_tokens:16e3,temperature:.3})});if(!nr.ok)throw new Error(`LLM 格式化失败: ${nr.status}`);const jr=((tn=(It=(mt=(await nr.json()).choices)==null?void 0:mt[0])==null?void 0:It.message)==null?void 0:tn.content)||Zn;console.log("[CustomAgentNode] Formatted storyboard content:",jr);const Br=[];jr.split(` +`).filter(Ur=>Ur.trim()).forEach((Ur,zs)=>{const Ts=Ur.split("|").map(os=>os.trim());if(Ts.length>=5){const os=b();Br.push({id:os,scene_number:"1",shot_number:`${zs+1}`,shot_type:Ts[2]||"中景",camera_angle:"平视",camera_movement:Ts[3]||"固定镜头",description:Ts[1]||"",dialogue:"",sound_effects:"",duration:Ts[4]||"5s",image_url:"",video_url:"",status:"draft",model:"sora-2",ratio:"16:9",prompt:Ts[1]||""})}else if(Ur.includes("镜头")||Ur.includes("Shot")){const os=b();Br.push({id:os,scene_number:"1",shot_number:`${zs+1}`,shot_type:"中景",camera_angle:"平视",camera_movement:"固定镜头",description:Ur,dialogue:"",sound_effects:"",duration:"5s",image_url:"",video_url:"",status:"draft",model:"sora-2",ratio:"16:9",prompt:Ur})}}),console.log("[CustomAgentNode] Parsed shots:",Br);const es={id:b(),type:"storyboard-node",x:Gn,y:Ut,width:600,height:500,prompt:jr,settings:{shots:Br,projectTitle:"智能分镜表"},shots:Br};Bn.push(es),Nr.push({id:b(),from:e.id,to:es.id})}catch(nr){console.error("[CustomAgentNode] LLM formatting failed:",nr);const tr={id:b(),type:"storyboard-node",x:Gn,y:Ut,width:600,height:500,prompt:Zn,settings:{projectTitle:"智能分镜表"},shots:[]};Bn.push(tr),Nr.push({id:b(),from:e.id,to:tr.id})}}else if(Et>=1&&Et<=2){console.log("[CustomAgentNode] Creating individual video nodes with LLM extraction...");try{const nr=await fetch(`${gr}/v1/chat/completions`,{method:"POST",headers:{Authorization:`Bearer ${vr}`,"Content-Type":"application/json"},body:JSON.stringify({model:(br==null?void 0:br.modelName)||J,messages:[{role:"system",content:`你是一位专业的视频提示词提取专家。请从用户提供的文本中提取每个镜头的描述,并转换为适合 AI 视频生成的提示词。 + +输出要求: +1. 每个镜头一行,使用 "---" 分隔 +2. 每行只包含该镜头的视觉描述,去除多余的说明文字 +3. 提示词要简洁、清晰、突出视觉重点 +4. 不要添加镜头编号或额外的解释 + +格式示例: +极近特写男主角眼睛,紫色瞳孔,锐利眼神,暗黑风格 +--- +中景镜头,男人坐在未来王座上,穿着黑色斗篷,赛博朋克风格`},{role:"user",content:`请从以下内容中提取每个镜头的视频生成提示词: + +${Zn}`}],max_tokens:16e3,temperature:.3})});if(!nr.ok)throw new Error(`LLM 提取失败: ${nr.status}`);const jr=((Rn=(zn=(cn=(await nr.json()).choices)==null?void 0:cn[0])==null?void 0:zn.message)==null?void 0:Rn.content)||Zn;console.log("[CustomAgentNode] Extracted prompts:",jr),jr.split("---").map(_r=>_r.trim()).filter(_r=>_r.length>0).slice(0,2).forEach((_r,es)=>{const Ur={id:b(),type:"gen-video",x:Gn,y:Ut+es*450,width:320,height:420,prompt:_r,settings:{modelId:"sora-2",ratio:"16:9",duration:"5s"}};Bn.push(Ur),Nr.push({id:b(),from:e.id,to:Ur.id})})}catch(nr){console.error("[CustomAgentNode] LLM extraction failed:",nr),Zn.split(` +`).filter(jr=>jr.trim()&&(jr.includes("镜头")||jr.includes("Shot")||jr.includes("场景"))).slice(0,2).forEach((jr,Br)=>{const _r=jr.replace(/^(?:镜头|Shot|场景)\s*\d*\s*[::]?\s*/i,"").trim(),es={id:b(),type:"gen-video",x:Gn,y:Ut+Br*450,width:320,height:420,prompt:_r||Zn,settings:{modelId:"sora-2",ratio:"16:9",duration:"5s"}};Bn.push(es),Nr.push({id:b(),from:e.id,to:es.id})})}}else{console.log("[CustomAgentNode] No clear shot structure, using LLM to analyze content type...");try{const nr=await fetch(`${gr}/v1/chat/completions`,{method:"POST",headers:{Authorization:`Bearer ${vr}`,"Content-Type":"application/json"},body:JSON.stringify({model:(br==null?void 0:br.modelName)||J,messages:[{role:"system",content:`你是一位专业的内容分析专家。请判断用户提供的文本内容是关于图片设计还是视频设计。 + +判断标准: +1. **图片内容**的特征: + - 描述静态场景、画面、构图 + - 强调光影、色彩、质感、氛围 + - 使用"场景"、"画面"、"构图"、"静态"等词汇 + - 描述多个独立的场景设计方案 + - 强调产品摄影、视觉设计、平面设计 + +2. **视频内容**的特征: + - 描述动态过程、运镜、镜头运动 + - 强调时间流程、动作、转场 + - 使用"推进"、"拉远"、"跟随"、"旋转"等运镜词汇 + - 描述连续的故事情节或动作序列 + - 强调视频拍摄、动画制作 + +输出要求: +- 只输出一个词:"图片" 或 "视频" +- 不要添加任何解释或额外文字`},{role:"user",content:`请判断以下内容是关于图片设计还是视频设计: + +${Zn.substring(0,1e3)}`}],max_tokens:10,temperature:.1})});if(!nr.ok)throw new Error(`LLM 判断失败: ${nr.status}`);const tr=await nr.json(),jr=(((An=(bn=(bt=tr.choices)==null?void 0:bt[0])==null?void 0:bn.message)==null?void 0:An.content)||"").trim().toLowerCase();console.log("[CustomAgentNode] LLM detected content type:",jr),console.log("[CustomAgentNode] Full LLM response:",(Ir=(Sr=(Vn=tr.choices)==null?void 0:Vn[0])==null?void 0:Sr.message)==null?void 0:Ir.content);const Br=jr.includes("图片")||jr.includes("图像")||jr.includes("image")||jr.includes("picture")||jr.includes("photo")||Zn.includes("场景")&&Zn.includes("画面"),_r=jr.includes("视频")||jr.includes("video")||jr.includes("动画");if(console.log("[CustomAgentNode] isImage:",Br,"isVideo:",_r),Br||!_r&&Zn.includes("场景")){console.log("[CustomAgentNode] Creating image nodes with LLM extraction...");try{const es=await fetch(`${gr}/v1/chat/completions`,{method:"POST",headers:{Authorization:`Bearer ${vr}`,"Content-Type":"application/json"},body:JSON.stringify({model:(br==null?void 0:br.modelName)||J,messages:[{role:"system",content:`你是一位专业的图片提示词提取专家。请从用户提供的文本中提取每个场景的图片生成提示词。 + +输出要求: +1. **识别文本中所有的场景**(可能是5个、10个、20个或更多) +2. 每个场景一行,使用 "---" 分隔 +3. 每行只包含该场景的视觉描述,适合 AI 图片生成 +4. 提示词要简洁、清晰、突出视觉重点 +5. 包含关键元素:主体、环境、风格、光影、色彩 +6. 不要添加场景编号或额外的解释 +7. **重要**:如果场景描述中提到产品或主体物品,在提示词末尾标注 [参考:图一] +8. 如果场景描述中明确提到参考其他图片(如"图二"、"参考场景"),在提示词末尾标注对应的引用(如 [参考:图二]) + +格式示例: +极简风格产品摄影,金属质感风扇,暗黑背景,聚光灯打光,高级感 [参考:图一] +--- +未来科技场景,风扇悬浮在沙漠中,外星地表风格,微光照明 [参考:图一] [参考:图二] +--- +极简沙漠场景,风扇立在沙丘上,日落光影,温暖色调 [参考:图一] +--- +水下场景,风扇在清澈水中,气泡环绕,蓝色调 [参考:图一] + +注意: +- 提取文本中所有的场景,不要遗漏 +- 大部分场景都应该包含产品(图一),除非场景描述明确不需要产品 +- 保持原文的场景顺序`},{role:"user",content:`请从以下内容中提取所有场景的图片生成提示词(不要遗漏任何场景): + +${Zn}`}],max_tokens:16e3,temperature:.7})});if(!es.ok){const os=await es.text();throw console.error("[CustomAgentNode] LLM extraction API error:",es.status,os),new Error(`LLM 提取失败: ${es.status}`)}const zs=((Yn=(ir=(Wr=(await es.json()).choices)==null?void 0:Wr[0])==null?void 0:ir.message)==null?void 0:Yn.content)||"";console.log("[CustomAgentNode] Extracted image prompts:",zs),console.log("[CustomAgentNode] Connected images count:",Je.length),console.log("[CustomAgentNode] Connections to this node:",r.filter(os=>os.to===e.id));const Ts=zs.split("---").map(os=>os.trim()).filter(os=>os.length>0);if(console.log(`[CustomAgentNode] Parsed ${Ts.length} scenes from LLM response`),Ts.length===0)throw new Error("LLM 未返回有效的场景提示词");Ts.forEach((os,wi)=>{const ki=os.match(/\[参考[::]?图([一二三四五六1-6])\]/g)||[];let gi=os.replace(/\[参考[::]?图[一二三四五六1-6]\]/g,"").trim();console.log(`[CustomAgentNode] Scene ${wi+1}: Found ${ki.length} references:`,ki);const $i={id:b(),type:"gen-image",x:Gn+wi%3*340,y:Ut+Math.floor(wi/3)*360,width:320,height:340,prompt:gi,settings:{modelId:"jimeng-3.0",ratio:"1:1"}};if(Bn.push($i),Nr.push({id:b(),from:e.id,to:$i.id}),ki.length>0&&Je.length>0){const gs=r.filter(Ri=>Ri.to===e.id);console.log(`[CustomAgentNode] Scene ${wi+1}: Input image connections:`,gs.length),ki.forEach(Ri=>{const Ki=Ri.match(/图([一二三四五六1-6])/);if(!Ki)return;const Ps=Ki[1],xi=({一:1,二:2,三:3,四:4,五:5,六:6,1:1,2:2,3:3,4:4,5:5,6:6}[Ps]||1)-1;if(console.log(`[CustomAgentNode] Scene ${wi+1}: Processing reference 图${Ps}, imageIndex=${xi}`),xi>=0&&xi0&&console.warn(`[CustomAgentNode] ⚠️ Scene ${wi+1}: References detected but no connected images`)})}catch(es){console.error("[CustomAgentNode] LLM extraction failed:",es);const Ur=Zn.replace(/^(?:生成|创建|画|绘制|请|帮我).*?[::]\s*/gm,"").replace(/\d+\s*[张幅个]\s*(?:图片|图像|画面)\s*[::]?\s*/gi,"").replace(/^[#\-*]\s*/gm,"").trim();for(let zs=0;zs<5;zs++){const Ts={id:b(),type:"gen-image",x:Gn+zs%3*340,y:Ut+Math.floor(zs/3)*360,width:320,height:340,prompt:Ur,settings:{modelId:"jimeng-3.0",ratio:"1:1"}};Bn.push(Ts),Nr.push({id:b(),from:e.id,to:Ts.id})}}}else if(_r){console.log("[CustomAgentNode] Creating video node");let es=Zn.replace(/^(?:生成|创建|制作|请|帮我).*?[::]\s*/gm,"").replace(/视频\s*[::]?\s*/gi,"").replace(/^[#\-*]\s*/gm,"").trim();const Ur={id:b(),type:"gen-video",x:Gn,y:Ut,width:320,height:420,prompt:es,settings:{modelId:"sora-2",ratio:"16:9",duration:"5s"}};Bn.push(Ur),Nr.push({id:b(),from:e.id,to:Ur.id})}else{console.log("[CustomAgentNode] Creating text node (default)");const es={id:b(),type:"text-node",x:Gn,y:Ut,width:300,height:200,prompt:Zn,settings:{text:Zn}};Bn.push(es),Nr.push({id:b(),from:e.id,to:es.id})}}catch(nr){console.error("[CustomAgentNode] LLM content type detection failed:",nr);const tr=/场景|画面|构图|光影|色彩|质感/i.test(Zn),jr=/运镜|推进|拉远|跟随|旋转|镜头运动/i.test(Zn);if(tr&&!jr){console.log("[CustomAgentNode] Fallback: Creating 5 image nodes based on keywords");const Br=Zn.replace(/^(?:你好|我是|仔细观察).*?[::]\s*/gm,"").replace(/^[#\-*]\s*/gm,"").substring(0,500).trim();for(let _r=0;_r<5;_r++){const es={id:b(),type:"gen-image",x:Gn+_r%3*340,y:Ut+Math.floor(_r/3)*360,width:320,height:340,prompt:Br,settings:{modelId:"jimeng-3.0",ratio:"1:1"}};if(Bn.push(es),Nr.push({id:b(),from:e.id,to:es.id}),_r<2&&Je.length>_r){const Ur=r.filter(zs=>zs.to===e.id);if(Ur.length>_r){const zs=Ur[_r].from;Nr.push({id:b(),from:zs,to:es.id,inputType:"default"}),console.log(`[CustomAgentNode] Fallback: Connected reference image ${_r+1} to image node ${_r+1}`)}}}}else{const Br={id:b(),type:"text-node",x:Gn,y:Ut,width:300,height:200,prompt:Zn,settings:{text:Zn}};Bn.push(Br),Nr.push({id:b(),from:e.id,to:Br.id})}}}Bn.length>0&&(p(nr=>[...nr,...Bn]),f&&Nr.length>0&&f(nr=>[...nr,...Nr]),console.log("[CustomAgentNode] Smart dispatch completed:",{nodesCreated:Bn.length,connectionsCreated:Nr.length,types:Bn.map(nr=>nr.type)}))}catch(Zn){console.error("[CustomAgentNode] Smart dispatch failed:",Zn),alert(`智能分发失败: ${Zn instanceof Error?Zn.message:"未知错误"}`)}finally{we(!1)}},[fn,e,p,f,b,g,r,J,a,o]);const At=fr.useRef(0),kt=fr.useRef(!1);fr.useEffect(()=>{var It;const mt=(It=e.settings)==null?void 0:It._executeTrigger;if(!kt.current){kt.current=!0,mt&&(At.current=mt);return}mt&&mt!==At.current&&!pe&&(At.current=mt,console.log("[CustomAgentNode] 检测到外部执行触发,开始执行:",e.id),setTimeout(()=>{at()},100))},[(Rr=e.settings)==null?void 0:Rr._executeTrigger,at,e.id,pe]);const Ot=!!((sr=e.settings)!=null&&sr.isCollapsed),dn=800,Vt=_.useCallback(()=>{var It,tn,cn;if(!Ot){const Rn=Je.length>0||Me.length>0?96:64,bt=(It=e.settings)!=null&&It.hasCustomSize&&e.settings.savedNodeHeight!=null?e.settings.savedNodeHeight:e.height||dn;n(e.id,{settings:{...e.settings||{},isCollapsed:!0,_expandedHeight:bt,savedNodeHeight:Rn},height:Rn})}else{const zn=((tn=e.settings)==null?void 0:tn._expandedHeight)||dn,Rn=Math.max(zn,400);n(e.id,{settings:{...e.settings||{},isCollapsed:!1,savedNodeHeight:(cn=e.settings)!=null&&cn.hasCustomSize?Rn:void 0},height:Rn})}},[Ot,e.id,e.height,e.settings,n,Je.length,Me.length]);if(_.useEffect(()=>{if(!Ot)return;const It=Je.length>0||Me.length>0?96:64;e.height!==It&&n(e.id,{height:It,settings:{...e.settings,savedNodeHeight:It}})},[Ot,Je.length,Me.length]),Ot){const mt=Je.length>0||Me.length>0;return s.jsxs("div",{className:`relative w-full h-full flex flex-col pointer-events-auto rounded-xl overflow-hidden px-3 py-2.5 gap-2 justify-center ${t?"bg-zinc-900/95 border border-zinc-800/80":"bg-transparent"}`,children:[mt&&s.jsxs("div",{className:"flex items-center gap-1.5 shrink-0",children:[s.jsxs("div",{className:"flex -space-x-1.5 items-center",children:[je.slice(0,6).map((It,tn)=>{var cn;return s.jsx("div",{className:`relative shrink-0 w-6 h-6 rounded-full border-2 overflow-hidden ${t?"border-zinc-900/95 bg-zinc-800":"border-white bg-zinc-200"}`,style:{zIndex:6-tn},children:It.isLoading?s.jsx("div",{className:"w-full h-full flex items-center justify-center",children:s.jsx(zr,{size:10,className:"animate-spin text-zinc-500"})}):It.hasError||!It.url?s.jsx("div",{className:"w-full h-full flex items-center justify-center",children:s.jsx(si,{size:10,className:"text-zinc-500"})}):s.jsx("img",{src:Ea(It.url)||It.url,className:"w-full h-full object-cover",alt:""})},`collapsed-img-${tn}-${(cn=It.url)==null?void 0:cn.substring(0,30)}`)}),Me.slice(0,6-je.length).map((It,tn)=>s.jsxs("div",{className:`relative shrink-0 w-6 h-6 rounded-full border-2 overflow-hidden ${t?"border-zinc-900/95 bg-zinc-800":"border-white bg-zinc-200"}`,style:{zIndex:6-je.length-tn},children:[s.jsx("video",{src:It,className:"w-full h-full object-cover",muted:!0}),s.jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-black/40 pointer-events-none",children:s.jsx(aa,{size:10,className:"text-white"})})]},`collapsed-vid-${tn}`))]}),s.jsxs("span",{className:`text-[9px] shrink-0 ${t?"text-zinc-500":"text-zinc-400"}`,children:[Je.length+Me.length," 张"]})]}),!mt&&s.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[s.jsx(Ax,{size:14,className:t?"text-zinc-400":"text-blue-600"}),s.jsx("span",{className:`text-xs font-semibold truncate flex-1 ${t?"text-zinc-300":"text-zinc-800"}`,children:"自定义代理"})]}),s.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[s.jsx("select",{value:J,onChange:It=>{const tn=It.target.value;Z(tn),n(e.id,{settings:{...e.settings||{},modelStage1:tn}})},className:`flex-1 min-w-0 px-2 py-1 text-[10px] rounded border outline-none cursor-pointer ${t?"bg-zinc-800/60 hover:bg-zinc-800 text-zinc-200 border-zinc-700 [&>option]:bg-zinc-900 [&>option]:text-zinc-200":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,onMouseDown:It=>It.stopPropagation(),title:"元提示词预览模型",children:q.map(It=>s.jsx("option",{value:It.id,children:It.provider},It.id))}),s.jsxs("button",{onClick:at,disabled:pe,className:`shrink-0 px-2.5 py-1.5 text-[10px] rounded flex items-center gap-1 transition-colors ${pe?"bg-zinc-600 text-zinc-400 cursor-not-allowed":t?"bg-transparent hover:bg-white/5 text-zinc-200":"bg-black hover:bg-zinc-900 text-white"}`,onMouseDown:It=>It.stopPropagation(),title:"运行",children:[pe?s.jsx(zr,{size:12,className:"animate-spin"}):s.jsx(Ia,{size:12}),s.jsx("span",{children:"运行"})]}),pe&&s.jsxs("button",{onClick:rt,className:`shrink-0 px-2 py-1.5 text-[10px] rounded flex items-center gap-1 transition-colors ${t?"bg-zinc-700 text-zinc-400 hover:bg-red-900/50 hover:text-red-400":"bg-zinc-200 text-zinc-600 hover:bg-red-100 hover:text-red-600"}`,onMouseDown:It=>It.stopPropagation(),title:"取消生成",children:[s.jsx(Qr,{size:12}),s.jsx("span",{children:"取消"})]}),s.jsx("button",{onClick:Vt,className:`p-1 rounded transition-colors ${t?"text-zinc-500 hover:bg-zinc-700 hover:text-zinc-300":"text-zinc-500 hover:bg-zinc-200 hover:text-zinc-700"}`,onMouseDown:It=>It.stopPropagation(),title:"展开节点",children:s.jsx(jh,{size:14})})]})]})}return s.jsx("div",{className:`relative w-full h-full flex flex-col transition-colors pointer-events-auto rounded-xl overflow-hidden ${t?"bg-zinc-900/80":"bg-transparent"}`,children:s.jsxs("div",{className:"flex-1 min-h-0 flex flex-col overflow-hidden",children:[s.jsxs("div",{className:"flex-1 p-3 flex flex-col gap-3 overflow-y-auto rh-scroll-minimal overflow-x-visible",children:[s.jsxs("div",{className:"flex flex-col gap-2 relative",onMouseUpCapture:mt=>_t(mt,"agent_meta_prompt"),children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsxs("div",{className:"flex items-center gap-1",children:[s.jsx("div",{className:`w-3 h-3 rounded-full cursor-crosshair transition-all flex-shrink-0 ${w&&w!==e.id?"bg-blue-500 ring-2 ring-blue-400 animate-pulse":gt?"bg-green-500":t?"bg-zinc-600 hover:bg-zinc-500":"bg-zinc-400 hover:bg-zinc-500"}`,style:{zIndex:200,pointerEvents:"auto"},title:"元提示词输入 - 可连接多个文字/Agent节点,按连接顺序拼接","data-input-type":"agent_meta_prompt",onMouseDown:mt=>Ae(mt,"agent_meta_prompt"),onMouseUpCapture:mt=>nt(mt,"agent_meta_prompt"),onContextMenu:mt=>mt.preventDefault()}),s.jsxs("label",{className:`text-[10px] font-medium ${t?"text-zinc-300":"text-zinc-700"}`,children:["元提示词",it.length>0&&s.jsxs("span",{className:"ml-1 text-blue-500 text-[9px]",children:["(已连接",it.length,"个节点",Wt?",含Agent":"",",按顺序拼接)"]})]})]}),s.jsxs("div",{className:"flex items-center gap-1","data-node-header-toolbar":!0,children:[s.jsx("select",{value:J,onChange:mt=>{X.current.systemPrompt&&(clearTimeout(X.current.systemPrompt),X.current.systemPrompt=null),X.current.userPrompt&&(clearTimeout(X.current.userPrompt),X.current.userPrompt=null),X.current.outputContent&&(clearTimeout(X.current.outputContent),X.current.outputContent=null),Z(mt.target.value);const It={...ke.current};O.current&&(It.systemPrompt=O.current.value),F.current&&(It.userPrompt=F.current.value),L.current&&(It.outputContent=L.current.value),n(e.id,{settings:{...It,modelStage1:mt.target.value}})},className:`px-2 py-1 text-xs rounded border outline-none cursor-pointer transition-colors ${t?"bg-transparent hover:bg-white/5 text-white border-white/30 [&>option]:bg-zinc-900 [&>option]:text-white":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,onMouseDown:mt=>mt.stopPropagation(),children:q.length===0?s.jsx("option",{value:"",children:"请先在模型配置中添加 Chat 模型"}):q.map(mt=>s.jsx("option",{value:mt.id,children:mt.provider},mt.id))}),s.jsxs("button",{onClick:()=>me(!Q),className:`px-2 py-1 text-[10px] rounded border transition-colors flex items-center gap-1 ${t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,onMouseDown:mt=>mt.stopPropagation(),children:[s.jsx("span",{children:"常用提示词库"}),Q?s.jsx(bm,{size:10}):s.jsx(Ei,{size:10})]}),s.jsxs("button",{onClick:()=>{U(!ue),ue||te(_c())},className:`px-2 py-1 text-[10px] rounded border transition-colors flex items-center gap-1 ${t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,onMouseDown:mt=>mt.stopPropagation(),title:"来自 Chat Skill 模式保存的 Skill,可应用为系统提示词",children:[s.jsx("span",{children:"Skill 库"}),ue?s.jsx(bm,{size:10}):s.jsx(Ei,{size:10})]}),s.jsx("button",{type:"button",onClick:mt=>{mt.stopPropagation(),Vt()},onPointerDown:mt=>mt.stopPropagation(),onMouseDown:mt=>mt.stopPropagation(),className:`relative z-10 p-1 rounded transition-colors ${t?"text-zinc-400 hover:bg-zinc-700 hover:text-zinc-200":"text-zinc-500 hover:bg-zinc-200 hover:text-zinc-700"}`,title:"折叠节点",children:s.jsx(rf,{size:12})})]})]}),ue&&s.jsxs("div",{className:`rounded-lg border p-3 ${t?"bg-zinc-900/95 border-zinc-700":"bg-white border-zinc-300"}`,children:[s.jsxs("div",{className:"flex items-center justify-between mb-3",children:[s.jsxs("span",{className:`text-[10px] font-medium ${t?"text-zinc-300":"text-zinc-700"}`,children:["Skill 库(来自对话保存,共 ",G.length," 项)"]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsxs("button",{onClick:()=>{ne("__new__"),fe({name:"",content:""})},className:`px-2 py-1 text-[10px] rounded border transition-colors flex items-center gap-1 ${t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,onMouseDown:mt=>mt.stopPropagation(),title:"新建并保存一个 Skill 到库中",children:[s.jsx(xu,{size:10}),"新建保存"]}),s.jsx("button",{onClick:()=>U(!1),className:`px-2 py-1 text-[10px] rounded border transition-colors ${t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,onMouseDown:mt=>mt.stopPropagation(),children:"收起"})]})]}),s.jsx("div",{className:"grid grid-cols-3 gap-2 max-h-48 overflow-y-auto rh-scroll-minimal mb-3",children:G.length===0?s.jsx("div",{className:`col-span-3 py-4 text-center text-[10px] ${t?"text-zinc-500":"text-zinc-400"}`,children:"暂无保存的 Skill。在 Chat 中切换到「Skill」模式,与 AI 制作 Skill 后对助手回复点击「保存为 Skill」即可在此应用。"}):G.map(mt=>s.jsxs("div",{className:`flex items-center justify-between px-3 py-2 rounded border transition-colors ${t?"bg-transparent border-white/30 hover:border-white/50":"bg-transparent border-gray-300 hover:border-gray-400"}`,children:[s.jsx("span",{className:`text-[10px] font-medium truncate flex-1 mr-2 ${t?"text-white":"text-gray-900"}`,title:mt.name,children:mt.name}),s.jsxs("div",{className:"flex items-center gap-1 shrink-0",children:[s.jsx("button",{"data-gen-prompt-apply":!0,type:"button",onClick:It=>{It.stopPropagation(),Tt(mt)},onPointerDown:It=>It.stopPropagation(),onMouseDown:It=>It.stopPropagation(),className:`relative z-10 px-2 py-1 text-[9px] rounded border transition-colors shrink-0 ${t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:"应用"}),s.jsx("button",{onClick:()=>{ne(mt.id),fe({name:mt.name,content:mt.content})},className:`p-1 rounded transition-colors ${t?"text-white hover:bg-white/5":"text-gray-600 hover:bg-black/5"}`,onMouseDown:It=>It.stopPropagation(),title:"编辑",children:s.jsx(bj,{size:12})}),s.jsx("button",{onClick:async()=>{await RE("确定从 Skill 库中删除该项?")&&(xO(mt.id),te(_c()))},className:`p-1 rounded transition-colors ${t?"text-white hover:bg-white/5":"text-gray-600 hover:bg-black/5"}`,onMouseDown:It=>It.stopPropagation(),title:"删除",children:s.jsx(Zi,{size:12})})]})]},mt.id))}),ge&&s.jsxs("div",{className:`p-3 rounded-lg border ${t?"bg-zinc-800 border-zinc-700":"bg-white border-zinc-300"}`,children:[s.jsx("div",{className:`text-[10px] font-medium mb-2 ${t?"text-zinc-300":"text-zinc-700"}`,children:ge==="__new__"?"新建 Skill":"编辑 Skill"}),s.jsx("input",{type:"text",value:le.name,onChange:mt=>fe({...le,name:mt.target.value}),placeholder:"Skill 名称",className:`w-full px-2 py-1.5 text-[10px] rounded border outline-none mb-2 ${t?"bg-zinc-900 border-zinc-700 text-zinc-200 placeholder-zinc-500":"bg-white border-zinc-300 text-zinc-800 placeholder-zinc-400"}`,onMouseDown:mt=>mt.stopPropagation()}),s.jsx("textarea",{"data-node-id":e.id,"data-scrollable":"true",value:le.content,onChange:mt=>fe({...le,content:mt.target.value}),placeholder:"Skill 内容...",maxLength:8e4,className:`w-full px-2 py-1.5 text-base rounded border outline-none resize-none h-32 rh-scroll-minimal leading-relaxed ${t?"bg-zinc-900 border-zinc-700 text-zinc-200 placeholder-zinc-500":"bg-white border-zinc-300 text-zinc-800 placeholder-zinc-400"}`,onMouseDown:mt=>mt.stopPropagation()}),s.jsxs("div",{className:"flex gap-2 mt-2",children:[s.jsx("button",{onClick:()=>{if(!le.name.trim()||!le.content.trim()){alert("请填写名称和内容");return}ge==="__new__"?(q5({name:le.name.trim(),content:le.content}),te(_c())):(bO(ge,{name:le.name.trim(),content:le.content}),te(_c())),ne(null),fe({name:"",content:""})},className:`flex-1 px-2 py-1 text-[10px] rounded border transition-colors ${t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,onMouseDown:mt=>mt.stopPropagation(),children:ge==="__new__"?"保存到 Skill 库":"保存修改"}),s.jsx("button",{onClick:()=>{ne(null),fe({name:"",content:""})},className:`px-2 py-1 text-[10px] rounded border transition-colors ${t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,onMouseDown:mt=>mt.stopPropagation(),children:"取消"})]})]})]}),Q&&s.jsxs("div",{className:`rounded-lg border p-3 ${t?"bg-zinc-900/95 border-zinc-700":"bg-white border-zinc-300"}`,children:[s.jsxs("div",{className:"flex items-center justify-between mb-3",children:[s.jsxs("span",{className:`text-[10px] font-medium ${t?"text-zinc-300":"text-zinc-700"}`,children:["常用提示词库 (",Ne.length," 项)"]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("button",{onClick:()=>{Ee({name:"",prompt:""}),ze(null),de(!0)},className:`px-2 py-1 text-[10px] rounded border transition-colors ${t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,onMouseDown:mt=>mt.stopPropagation(),children:"新建"}),s.jsx("button",{onClick:Ge,className:`px-2 py-1 text-[10px] rounded border transition-colors ${t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,onMouseDown:mt=>mt.stopPropagation(),children:"保存当前"}),s.jsx("button",{onClick:()=>me(!1),className:`px-2 py-1 text-[10px] rounded border transition-colors ${t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,onMouseDown:mt=>mt.stopPropagation(),children:"收起"})]})]}),s.jsx("div",{className:"grid grid-cols-3 gap-2 max-h-48 overflow-y-auto rh-scroll-minimal mb-3",children:Ne.map(mt=>s.jsxs("div",{className:`flex items-center justify-between px-3 py-2 rounded border transition-colors ${t?"bg-transparent border-white/30 hover:border-white/50":"bg-transparent border-gray-300 hover:border-gray-400"}`,children:[s.jsx("span",{className:`text-[10px] font-medium truncate flex-1 mr-2 ${t?"text-white":"text-gray-900"}`,title:mt.name,children:mt.name}),s.jsxs("div",{className:"flex items-center gap-1 shrink-0",children:[s.jsx("button",{"data-gen-prompt-apply":!0,type:"button",onClick:It=>{It.stopPropagation(),xt(mt)},onPointerDown:It=>It.stopPropagation(),onMouseDown:It=>It.stopPropagation(),className:`relative z-10 px-2 py-1 text-[9px] rounded border transition-colors shrink-0 ${t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:"应用"}),s.jsx("button",{onClick:()=>Ue(mt),className:`p-1 rounded transition-colors ${t?"text-white hover:bg-white/5":"text-gray-600 hover:bg-black/5"}`,onMouseDown:It=>It.stopPropagation(),title:"编辑",children:s.jsx(bj,{size:12})}),s.jsx("button",{onClick:()=>Qe(mt.id),className:`p-1 rounded transition-colors ${t?"text-white hover:bg-white/5":"text-gray-600 hover:bg-black/5"}`,onMouseDown:It=>It.stopPropagation(),title:"删除",children:s.jsx(Zi,{size:12})})]})]},mt.id))}),be&&s.jsxs("div",{className:`p-3 rounded-lg border ${t?"bg-zinc-800 border-zinc-700":"bg-white border-zinc-300"}`,children:[s.jsx("div",{className:`text-[10px] font-medium mb-2 ${t?"text-zinc-300":"text-zinc-700"}`,children:$e?"编辑模板":"新建模板"}),s.jsx("input",{type:"text",value:_e.name,onChange:mt=>Ee({..._e,name:mt.target.value}),placeholder:"自定义名称 (例如: 柔光人像)",className:`w-full px-2 py-1.5 text-[10px] rounded border outline-none mb-2 ${t?"bg-zinc-900 border-zinc-700 text-zinc-200 placeholder-zinc-500":"bg-white border-zinc-300 text-zinc-800 placeholder-zinc-400"}`,onMouseDown:mt=>mt.stopPropagation()}),s.jsx("textarea",{"data-node-id":e.id,"data-scrollable":"true",value:_e.prompt,onChange:mt=>Ee({..._e,prompt:mt.target.value}),placeholder:"输入提示词内容...",maxLength:8e4,className:`w-full px-3 py-2 text-base rounded outline-none resize-none h-24 rh-scroll-minimal leading-relaxed ${t?"bg-zinc-900/50 text-zinc-200 placeholder-zinc-600":"bg-transparent text-zinc-800 placeholder-zinc-400"}`,onMouseDown:mt=>mt.stopPropagation()}),s.jsxs("div",{className:"flex gap-2 mt-2",children:[s.jsx("button",{onClick:St,className:`flex-1 px-2 py-1 text-[10px] rounded border transition-colors ${t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,onMouseDown:mt=>mt.stopPropagation(),children:$e?"保存修改":"添加到常用提示词库"}),s.jsx("button",{onClick:()=>{de(!1),Ee({name:"",prompt:""}),ze(null)},className:`px-2 py-1 text-[10px] rounded border transition-colors ${t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,onMouseDown:mt=>mt.stopPropagation(),children:"取消"})]})]})]}),s.jsx("textarea",{ref:O,"data-node-id":e.id,"data-scrollable":"true",defaultValue:Tn,onChange:mt=>{T.current.systemPrompt=!0,X.current.systemPrompt&&clearTimeout(X.current.systemPrompt),X.current.systemPrompt=setTimeout(()=>{n(e.id,{settings:{...ke.current,systemPrompt:mt.target.value}})},100)},placeholder:gt?"输入元提示词(生成时会自动合并上游文字节点内容)...":"输入元提示词... (设定身份、风格等)",className:`resize-y outline-none text-base p-3 rounded min-h-24 rh-scroll-minimal leading-relaxed w-full ${t?"bg-zinc-900/50 text-zinc-200 placeholder-zinc-600":"bg-transparent text-zinc-800 placeholder-zinc-400"}`,style:{maxHeight:"none"},onMouseDown:mt=>mt.stopPropagation()})]}),Re&&s.jsxs("div",{className:"mb-2 relative",onMouseUp:mt=>{w&&w!==e.id&&_t(mt,"default")},children:[s.jsxs("div",{className:"flex justify-between items-center mb-1.5",children:[s.jsxs("span",{className:`text-[10px] font-medium flex items-center gap-1 ${t?"text-zinc-300":"text-zinc-700"}`,children:[s.jsx(si,{size:10}),"引用媒体"]}),s.jsxs("span",{className:"text-[9px] font-mono text-zinc-500",children:[Je.length," 图片 ",Me.length>0&&`+ ${Me.length} 视频`]})]}),s.jsxs("div",{className:"flex flex-wrap gap-1.5 items-center overflow-visible",onDragOver:mt=>{mt.preventDefault(),mt.stopPropagation(),mt.dataTransfer.dropEffect="move"},children:[je.map((mt,It)=>{var tn;return s.jsxs("div",{"data-image-reorder-thumb":!0,className:`relative shrink-0 cursor-grab active:cursor-grabbing touch-none select-none ${Le===It?"opacity-60 scale-95":""}`,title:"长按拖拽可调换顺序",draggable:!0,onMouseEnter:()=>tt(It),onMouseLeave:()=>tt(null),onDragStart:cn=>{if(cn.target.closest("button")){cn.preventDefault();return}cn.dataTransfer.setData("text/plain",String(It)),cn.dataTransfer.effectAllowed="move",cn.stopPropagation(),Xe(It)},onDragEnd:()=>Xe(null),onDragEnter:cn=>{cn.preventDefault(),cn.stopPropagation(),cn.dataTransfer.dropEffect="move"},onDragOver:cn=>{cn.preventDefault(),cn.stopPropagation(),cn.dataTransfer.dropEffect="move"},onDrop:cn=>{cn.preventDefault(),cn.stopPropagation();const zn=Number(cn.dataTransfer.getData("text/plain"));!Number.isNaN(zn)&&zn!==It&&ht(zn,It)},children:[s.jsx("span",{className:"absolute -top-1 -left-1 w-3.5 h-3.5 text-[8px] font-semibold rounded-full bg-zinc-700 text-white select-none flex items-center justify-center border border-white/70 shadow-sm leading-none pointer-events-none z-[10]",style:{pointerEvents:"none"},children:It+1}),s.jsx("button",{onClick:cn=>pt(mt.originalUrl,cn),className:`absolute -top-1 -right-1 w-3.5 h-3.5 rounded-full flex items-center justify-center transition-opacity ${qe===It?"opacity-100":"opacity-0"} ${t?"bg-red-600 hover:bg-red-500":"bg-red-500 hover:bg-red-600"} text-white shadow-lg`,style:{zIndex:31},title:"取消引用",children:s.jsx("svg",{width:"6",height:"6",viewBox:"0 0 8 8",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:s.jsx("path",{d:"M1 1L7 7M7 1L1 7",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})})}),s.jsx("div",{className:`relative w-9 h-9 rounded border overflow-hidden ${t?"border-zinc-700 bg-zinc-800":"border-zinc-300 bg-zinc-200"}`,children:mt.isLoading?s.jsx("div",{className:"w-full h-full flex items-center justify-center bg-zinc-800",children:s.jsx(zr,{size:12,className:"animate-spin text-zinc-500"})}):mt.hasError||!mt.url?s.jsx("div",{className:"w-full h-full flex items-center justify-center bg-zinc-800",children:s.jsx(si,{size:12,className:"text-zinc-500"})}):s.jsx("img",{src:Ea(mt.url)||mt.url,className:"w-full h-full object-cover",alt:`媒体 ${It+1}`})})]},`${Ve}-${It}-${(tn=mt.originalUrl)==null?void 0:tn.substring(0,50)}`)}),Me.map((mt,It)=>s.jsxs("div",{"data-image-reorder-thumb":!0,className:`relative shrink-0 cursor-grab active:cursor-grabbing touch-none select-none ${wt===It?"opacity-60 scale-95":""}`,title:"长按拖拽可调换顺序",draggable:!0,onMouseEnter:()=>Nt(It),onMouseLeave:()=>Nt(null),onDragStart:tn=>{if(tn.target.closest("button")){tn.preventDefault();return}tn.dataTransfer.setData("text/plain",String(It)),tn.dataTransfer.effectAllowed="move",tn.stopPropagation(),$t(It)},onDragEnd:()=>$t(null),onDragEnter:tn=>{tn.preventDefault(),tn.stopPropagation(),tn.dataTransfer.dropEffect="move"},onDragOver:tn=>{tn.preventDefault(),tn.stopPropagation(),tn.dataTransfer.dropEffect="move"},onDrop:tn=>{tn.preventDefault(),tn.stopPropagation();const cn=Number(tn.dataTransfer.getData("text/plain"));!Number.isNaN(cn)&&cn!==It&&un(cn,It)},children:[s.jsx("span",{className:"absolute -top-1 -left-1 w-3.5 h-3.5 text-[8px] font-semibold rounded-full bg-zinc-700 text-white select-none flex items-center justify-center border border-white/70 shadow-sm leading-none pointer-events-none z-[10]",style:{pointerEvents:"none"},children:je.length+It+1}),s.jsx("button",{onClick:tn=>Yt(mt,tn),className:`absolute -top-1 -right-1 w-3.5 h-3.5 rounded-full flex items-center justify-center transition-opacity ${jt===It?"opacity-100":"opacity-0"} ${t?"bg-red-600 hover:bg-red-500":"bg-red-500 hover:bg-red-600"} text-white shadow-lg`,style:{zIndex:31},title:"取消引用",children:s.jsx("svg",{width:"6",height:"6",viewBox:"0 0 8 8",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:s.jsx("path",{d:"M1 1L7 7M7 1L1 7",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})})}),s.jsxs("div",{className:`relative w-9 h-9 rounded border overflow-hidden ${t?"border-zinc-700 bg-zinc-800":"border-zinc-300 bg-zinc-200"}`,children:[s.jsx("video",{src:Ea(mt)||mt,className:"w-full h-full object-cover",muted:!0,playsInline:!0}),s.jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-black/30 pointer-events-none",children:s.jsx(aa,{size:14,className:"text-white"})})]})]},`video-${It}-${mt.substring(0,50)}`))]})]}),s.jsxs("div",{className:"flex flex-col gap-2 relative",onMouseUpCapture:mt=>_t(mt,"agent_user_input"),children:[s.jsxs("div",{className:"flex items-center gap-1",children:[s.jsx("div",{className:`w-3 h-3 rounded-full cursor-crosshair transition-all flex-shrink-0 ${w&&w!==e.id?"bg-blue-500 ring-2 ring-blue-400 animate-pulse":Jt?"bg-green-500":t?"bg-zinc-600 hover:bg-zinc-500":"bg-zinc-400 hover:bg-zinc-500"}`,style:{zIndex:200,pointerEvents:"auto"},title:"用户需求输入 - 可连接多个文字/Agent节点,按连接顺序拼接","data-input-type":"agent_user_input",onMouseDown:mt=>Ae(mt,"agent_user_input"),onMouseUpCapture:mt=>nt(mt,"agent_user_input"),onContextMenu:mt=>mt.preventDefault()}),s.jsxs("label",{className:`text-[10px] font-medium ${t?"text-zinc-300":"text-zinc-700"}`,children:["用户需求",Lt.length>0&&s.jsxs("span",{className:"ml-1 text-blue-500 text-[9px]",children:["(已连接",Lt.length,"个节点",Pt?",含Agent":"",",按顺序拼接)"]})]})]}),s.jsx("textarea",{ref:F,"data-node-id":e.id,"data-scrollable":"true",defaultValue:Ht,onChange:mt=>{T.current.userPrompt=!0,X.current.userPrompt&&clearTimeout(X.current.userPrompt),X.current.userPrompt=setTimeout(()=>{n(e.id,{settings:{...ke.current,userPrompt:mt.target.value}})},100)},placeholder:Lt.length>0?"可继续输入,与上方连接内容按顺序拼接":"输入用户需求或连接文字/Agent节点(可连多个,按连接顺序拼接)",className:`resize-y outline-none text-base p-3 rounded min-h-24 rh-scroll-minimal leading-relaxed w-full ${t?"bg-zinc-900/50 text-zinc-200 placeholder-zinc-600":"bg-transparent text-zinc-800 placeholder-zinc-400"}`,style:{maxHeight:"none"},onMouseDown:mt=>mt.stopPropagation()})]}),s.jsxs("div",{className:"flex flex-col gap-2 flex-1 min-h-0",children:[s.jsxs("div",{className:"flex items-center justify-between flex-shrink-0",children:[s.jsx("label",{className:`text-[10px] font-medium ${t?"text-zinc-300":"text-zinc-700"}`,children:"输出内容"}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("select",{value:B,onChange:mt=>{X.current.systemPrompt&&(clearTimeout(X.current.systemPrompt),X.current.systemPrompt=null),X.current.userPrompt&&(clearTimeout(X.current.userPrompt),X.current.userPrompt=null),X.current.outputContent&&(clearTimeout(X.current.outputContent),X.current.outputContent=null),V(mt.target.value);const It={...ke.current};O.current&&(It.systemPrompt=O.current.value),F.current&&(It.userPrompt=F.current.value),L.current&&(It.outputContent=L.current.value),n(e.id,{settings:{...It,modelStage2:mt.target.value}})},style:{cursor:"pointer"},className:`px-2 py-1 text-xs rounded border outline-none ${t?"bg-zinc-900 hover:bg-zinc-800 text-zinc-200 border-white/30 [&>option]:bg-zinc-900 [&>option]:text-zinc-200":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,onMouseDown:mt=>mt.stopPropagation(),children:q.length===0?s.jsx("option",{value:"",children:"请先在模型配置中添加 Chat 模型"}):q.map(mt=>s.jsx("option",{value:mt.id,children:mt.provider},mt.id))}),(fn.trim()||k)&&s.jsxs(s.Fragment,{children:[s.jsxs("button",{onClick:lt,disabled:pe,className:`px-2 py-1 text-[10px] rounded border transition-colors flex items-center gap-1 ${pe?"bg-transparent text-white/50 border-white/20 cursor-not-allowed":t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,onMouseDown:mt=>mt.stopPropagation(),title:"继续生成内容,从当前内容末尾续写",children:[s.jsx(Ia,{size:10}),s.jsx("span",{children:"续写"})]}),s.jsxs("button",{onClick:ot,disabled:pe,className:`px-2 py-1 text-[10px] rounded border transition-colors flex items-center gap-1 ${pe?"bg-transparent text-white/50 border-white/20 cursor-not-allowed":t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,onMouseDown:mt=>mt.stopPropagation(),title:"使用 Stage 2 模型改写内容,保持相同意思但换一种表达方式",children:[s.jsx(bc,{size:10}),s.jsx("span",{children:"洗稿"})]})]})]})]}),s.jsx("textarea",{ref:L,"data-node-id":e.id,"data-scrollable":"true",value:ie,onChange:mt=>{const It=mt.target.value;oe(It),It.trim()||W(!1),X.current.outputContent&&clearTimeout(X.current.outputContent),X.current.outputContent=setTimeout(()=>{n(e.id,{settings:{...ke.current,outputContent:It}})},100)},placeholder:`输出文字内容... + +# 运行:新结果覆盖;续写:在末尾追加`,className:`resize-none outline-none text-base p-3 rounded flex-1 min-h-0 rh-scroll-minimal leading-relaxed w-full ${t?"bg-zinc-900/50 text-zinc-200 placeholder-zinc-600":"bg-transparent text-zinc-800 placeholder-zinc-400"}`,onMouseDown:mt=>mt.stopPropagation()})]})]}),s.jsx("div",{className:`flex-shrink-0 border-t ${t?"border-zinc-800 bg-zinc-900/80":"border-zinc-200 bg-zinc-100"}`,children:s.jsxs("div",{className:"p-3 flex flex-col gap-2",children:[s.jsxs("div",{className:"flex gap-2",children:[s.jsx("button",{onClick:at,disabled:pe,className:`flex-1 min-w-0 px-3 py-2 text-xs rounded transition-colors flex items-center justify-center gap-2 ${pe?"bg-zinc-600 text-zinc-400 cursor-not-allowed":t?"bg-zinc-800 text-zinc-200 hover:bg-zinc-700 border border-white/10":"bg-black text-white hover:bg-zinc-900"}`,onMouseDown:mt=>mt.stopPropagation(),title:"使用 Stage 1 模型生成,新结果覆盖输出",children:pe?s.jsxs(s.Fragment,{children:[s.jsx(zr,{size:14,className:"animate-spin"}),s.jsx("span",{children:"生成中..."})]}):s.jsxs(s.Fragment,{children:[s.jsx(Ia,{size:14}),s.jsx("span",{children:"运行"})]})}),pe&&s.jsxs("button",{onClick:rt,className:`flex-shrink-0 px-3 py-2 text-xs rounded transition-colors flex items-center justify-center gap-1.5 ${t?"bg-zinc-700 text-zinc-300 hover:bg-red-900/50 hover:text-red-400 border border-zinc-600":"bg-zinc-200 text-zinc-600 hover:bg-red-100 hover:text-red-600 border border-zinc-300"}`,onMouseDown:mt=>mt.stopPropagation(),title:"取消生成",children:[s.jsx(Qr,{size:14}),s.jsx("span",{children:"取消"})]})]}),s.jsx("div",{className:`text-[9px] ${t?"text-zinc-500":"text-zinc-400"}`,children:"💡 运行覆盖结果;有回复后可在输出区使用续写、洗稿"})]})})]})})},gce=fr.memo(mce);function xce(e){const t=e.trim();if(/^\d+$/.test(t))return t;const n=t.match(/ai-detail\/(\d+)/)||t.match(/(\d{15,})/);return n?n[1]:t}function qd(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="object"){const t=e,n=String(t.index??t.value??t.name??t.label??t.text??t.id??"");if(n&&n!=="[object Object]")return n}return typeof e=="object"?"":String(e)}function LE(e){if(e==null)return[];if(Array.isArray(e))return e.length>0&&Array.isArray(e[0])?e[0]:e;if(typeof e=="object"){const t=e,n=t.options??t.values??t.items??t.choices??t.data??t.list;if(Array.isArray(n))return n;const r=Object.keys(t).filter(i=>!["options","values","items","choices","data","list","selected","default"].includes(i));if(r.length>0)return r.map(i=>({index:i,name:qd(t[i])||i}))}return[]}function bce(e){if(e==null)return{index:"",name:""};if(typeof e=="string")return{index:e,name:e};if(Array.isArray(e)){const i=String(e[0]??""),a=String(e[1]??e[0]??"");return{index:i||a,name:a||i}}const t=e,n=qd(t.index??t.value??t.id??t.text??t.key??""),r=qd(t.name??t.label??t.text??t.display??t.index??t.value??n);return{index:n||r,name:r||n}}const yce=[{index:"1k",name:"1k"},{index:"2k",name:"2k"},{index:"4k",name:"4k"},{index:"8k (Official only)",name:"8k (Official only)"}],vce=[{index:"Third-party",name:"Third-party"},{index:"Official",name:"Official"}];function wce(e){const t=(e.fieldName||"").toLowerCase(),n=(e.description||"").toLowerCase();return t.includes("resolution")||n.includes("分辨率")}function _ce(e){const t=(e.description||"").toLowerCase(),n=(e.fieldName||"").toLowerCase();return t.includes("official")||t.includes("api")||t.includes("第三方")||n.includes("api")||n.includes("type")}function BE(e){if(e==null)return"";try{const t=typeof e=="string"?JSON.parse(e.trim()):e;if(Array.isArray(t)&&t.length>1&&t[1]&&typeof t[1]=="object"){const n=t[1];return qd(n.default??n.selected??n.value??"")||""}}catch{}return""}function zce(e,t){if(e==null)return[];try{let n;if(typeof e=="string"){const a=e.trim();if(a.startsWith("[")||a.startsWith("{")){const o=JSON.parse(a);n=LE(o),n.length===0&&Array.isArray(o)&&(n=o)}else if(a.includes(","))n=a.split(",").map(o=>o.trim()).filter(Boolean);else if(a)n=[a];else return[]}else n=LE(e),n.length===0&&Array.isArray(e)&&(n=e);let r=n.map(bce).filter(a=>a.index!==""||a.name!=="");const i=new Set;if(r=r.filter(a=>{const o=a.index.toLowerCase();return i.has(o)?!1:(i.add(o),!0)}),t&&wce(t)&&r.length<4){const a=new Set(r.map(l=>l.index.toLowerCase())),o=[...r];for(const l of yce)a.has(l.index.toLowerCase())||(o.push(l),a.add(l.index.toLowerCase()));r=o}if(t&&_ce(t)&&r.length<2){const a=new Set(r.map(l=>l.index.toLowerCase())),o=[...r];for(const l of vce)a.has(l.index.toLowerCase())||(o.push(l),a.add(l.index.toLowerCase()));r=o}return r}catch{return[]}}function $ce(e){const t=(e.fieldName||"").toLowerCase(),n=(e.description||"").toLowerCase();return t.includes("prompt")||t.includes("text")||n.includes("提示")||n.includes("文本")||n.includes("输入")}function UE(e){const t=e.toLowerCase();return t.includes(".mp4")||t.includes(".webm")||t.includes(".mov")||t.includes("video")?"video":t.includes(".mp3")||t.includes(".wav")||t.includes(".ogg")||t.includes(".m4a")||t.includes(".aac")||t.includes(".flac")||t.includes("audio")?"audio":"image"}function FE(e){const t=(e.fileType||"").toLowerCase(),n=(e.fileUrl||"").toLowerCase();return t==="txt"||n.endsWith(".txt")}async function Sce(e){const t=await fetch(e,{mode:"cors"});if(!t.ok)throw new Error(`获取文本失败: ${t.status}`);return t.text()}const jce=({node:e,isDark:t,updateNode:n,connections:r=[],nodes:i=[],getConnectedInputImages:a,getConnectedTextForInput:o,dataVersion:l=0,setHistory:c,setNodes:u,setConnections:d,setConnectingTarget:h,setConnectingInputType:p,setConnectingSource:f,connectingSource:b,setMousePos:g,canvasRef:y,view:w,generateId:v,onSaveToRhLibrary:m})=>{var Ne,ve,ke,Ie,Pe,Te,Be,He,Je,Me,Re;const[z,C]=_.useState(!1),[E,I]=_.useState(!1),[R,A]=_.useState("idle"),[O,F]=_.useState(null),[L,X]=_.useState(new Set),[T,q]=_.useState(null),H=_.useRef({});_.useEffect(()=>{const Ve=Ze=>{L.size>0&&(Ze.target.closest(".rh-list-dropdown")||X(new Set))};return document.addEventListener("mousedown",Ve),()=>document.removeEventListener("mousedown",Ve)},[L.size]);const J=((Ne=e.settings)==null?void 0:Ne.rhApiKey)||typeof localStorage<"u"&&localStorage.getItem(ri.RH_API_KEY)||"",Z=((ve=e.settings)==null?void 0:ve.webappId)||"",B=((ke=e.settings)==null?void 0:ke.webappName)||"",V=((Ie=e.settings)==null?void 0:Ie.rhCovers)||[],N=((Pe=e.settings)==null?void 0:Pe.nodeInfoListTemplate)||[],j=((Te=e.settings)==null?void 0:Te.rhUseOverseas)??!1,k=((Be=e.settings)==null?void 0:Be.rhInstanceType)??"default",W=((He=e.settings)==null?void 0:He.rhParamValues)||{},M=((Je=e.settings)==null?void 0:Je.rhUploadPreviews)||{},Y=((Me=e.settings)==null?void 0:Me.generatedImages)||[],se=(Re=e.settings)==null?void 0:Re.rhLastRunDurationMs,ie=xce(Z),oe=_.useMemo(()=>{const Ve=new Map;let Ze=0;for(const je of N)(je.fieldType||"").toUpperCase()==="STRING"&&Ve.set(`${je.nodeId}:${je.fieldName}`,Ze++);return Ve},[N]),re=_.useMemo(()=>a?a(e.id):[],[a,e.id,l]),{textFromDefaultConnectedTextNodes:ee,defaultConnectedTextNodeCount:pe}=_.useMemo(()=>{const Ve=r.filter(Le=>Le.to===e.id&&(!Le.inputType||Le.inputType==="default")),Ze=[];return Ve.forEach(Le=>{var qe,tt,Ye;const Xe=i.find(ct=>ct.id===Le.from);if(Xe&&(Xe.type==="text-node"||Xe.type==="custom-agent"||Xe.type==="novel-input")){const ct=(((qe=Xe.settings)==null?void 0:qe.text)||Xe.prompt||Xe.content||((tt=Xe.settings)==null?void 0:tt.outputContent)||((Ye=Xe.settings)==null?void 0:Ye.novelContent)||"").trim();ct&&Ze.push({node:Xe,text:ct})}}),{textFromDefaultConnectedTextNodes:Ze.map(Le=>Le.text).filter(Boolean).join(` + +`)||null,defaultConnectedTextNodeCount:Ze.length}},[r,i,e.id,l]),we=_.useMemo(()=>{const Ve=new Map;let Ze=0;for(const je of N){const Le=(je.fieldType||"").toUpperCase();(Le==="IMAGE"||Le==="AUDIO"||Le==="VIDEO")&&Ve.set(`${je.nodeId}:${je.fieldName}`,Ze++)}return Ve},[N]),Q=_.useCallback(async()=>{if(!J.trim()){F("请输入 RH API Key");return}if(!ie){F("请输入 WebApp ID(或粘贴 RH 应用详情页链接)");return}C(!0),F(null);try{const Ve=await kZ({apiKey:J.trim(),webappId:ie,useOverseas:j});if(Ve.code!==0)throw new Error(Ve.msg||"获取应用信息失败");const Ze=Ve.data;if(!Ze)throw new Error("返回数据为空");const je=Ze.nodeInfoList||[],Le={};je.forEach(qe=>{const tt=`${qe.nodeId}:${qe.fieldName}`;let Ye=qd(qe.fieldValue)||"";(qe.fieldType||"").toUpperCase()==="LIST"&&!Ye&&(Ye=BE(qe.fieldData)||Ye),Le[tt]=Ye});const Xe={...W,...Le};n(e.id,{settings:{...e.settings,rhApiKey:J.trim(),webappId:ie,webappName:Ze.webappName||"",rhCovers:Ze.covers||[],nodeInfoListTemplate:je,rhParamValues:Xe}});try{typeof localStorage<"u"&&localStorage.setItem(ri.RH_API_KEY,J.trim())}catch{}m==null||m({webappId:ie,webappName:Ze.webappName||"",covers:Ze.covers||[],nodeInfoListTemplate:je,rhParamValues:Xe})}catch(Ve){const Ze=Ve instanceof Error?Ve.message:"获取应用信息失败";F(Ze)}finally{C(!1)}},[J,ie,j,e.id,e.settings,n,W,m]),me=_.useCallback((Ve,Ze)=>{n(e.id,{settings:{...e.settings,rhParamValues:{...W,[Ve]:Ze}}})},[e.id,e.settings,n,W]),ue=_.useCallback(async(Ve,Ze)=>{const je=`${Ve.nodeId}:${Ve.fieldName}`,Le=M[je];if(Le!=null&&Le.startsWith("blob:"))try{URL.revokeObjectURL(Le)}catch{}const Xe=URL.createObjectURL(Ze);n(e.id,{settings:{...e.settings,rhUploadPreviews:{...M,[je]:Xe}}});try{F(null);const qe=await WO({apiKey:J.trim(),file:Ze,useOverseas:j});n(e.id,{settings:{...e.settings,rhParamValues:{...W,[je]:qe.fileName},rhUploadPreviews:{...M,[je]:Xe}}})}catch(qe){F(qe instanceof Error?qe.message:"上传失败"),URL.revokeObjectURL(Xe);const{[je]:tt,...Ye}=M;n(e.id,{settings:{...e.settings,rhUploadPreviews:Ye}})}q(null)},[J,j,e.id,e.settings,n,W,M]),U=_.useCallback(async(Ve,Ze)=>{const je=`${Ve.nodeId}:${Ve.fieldName}`,Le=M[je];if(Le!=null&&Le.startsWith("blob:"))try{URL.revokeObjectURL(Le)}catch{}let Xe;try{Xe=await(await fetch(Ze,{mode:"cors"})).blob()}catch{try{Xe=await new Promise((ct,pt)=>{const ht=new Image;ht.crossOrigin="anonymous",ht.onload=()=>{const wt=document.createElement("canvas");wt.width=ht.naturalWidth,wt.height=ht.naturalHeight;const $t=wt.getContext("2d");if(!$t){pt(new Error("无法创建画布"));return}$t.drawImage(ht,0,0),wt.toBlob(jt=>jt?ct(jt):pt(new Error("toBlob 失败")),"image/png")},ht.onerror=()=>pt(new Error("图片加载失败,可能受跨域限制")),ht.src=Ze})}catch(ct){F(ct instanceof Error?ct.message:"获取图片失败"),q(null);return}}const qe=Ze.includes(".png")?"png":Ze.includes(".webp")?"webp":"jpg",tt=new File([Xe],`upload.${qe}`,{type:Xe.type||"image/jpeg"});await ue(Ve,tt)},[ue,M]),G=_.useCallback(async(Ve,Ze)=>{var Le;const je=(Le=Ze.target.files)==null?void 0:Le[0];je&&(await ue(Ve,je),Ze.target.value="")},[ue]),te=_.useCallback(async()=>{const Ve=[];let Ze=0;for(const je of N){const Le=`${je.nodeId}:${je.fieldName}`;let Xe=W[Le]??je.fieldValue??"",qe=qd(Xe);const tt=(je.fieldType||"").toUpperCase();if(tt==="STRING"){const ct=`rh_str_${oe.get(Le)??0}`;let pt=o==null?void 0:o(e.id,ct);!pt&&re.length>0&&ee&&(pt=ee),qe=(e.prompt||pt||qe).trim()||qe}else if((tt==="IMAGE"||tt==="AUDIO"||tt==="VIDEO")&&re.length>0){const Ye=re[Ze];if(Ye)try{let ct;if(Ye.startsWith("canvas-node:"))throw F("画板节点需先导出图片"),new Error("画板节点需先导出");ct=await As(Ye),qe=await FO({apiKey:J.trim(),file:ct,useOverseas:j}),Ze++}catch(ct){throw F(ct instanceof Error?ct.message:"参考图上传失败"),ct}}Ve.push({nodeId:je.nodeId,fieldName:je.fieldName,fieldValue:qe})}return Ve},[N,W,e.prompt,oe,o,e.id,re,ee,J,j]),ge=_.useCallback(async()=>{var Le;if(!J.trim()||!ie){F("请先获取应用信息");return}I(!0),F(null),A("queued"),n(e.id,{isGenerating:!0});let Ve=null,Ze=null,je=null;try{const Xe=await te(),qe=await AZ({apiKey:J.trim(),webappId:ie,nodeInfoList:Xe,useOverseas:j,instanceType:k==="plus"?"plus":"default"});Ze=qe.taskId;const{promptTips:tt}=qe;if(c&&Ze){je=Date.now();const gt={id:Ze,url:"",type:"image",prompt:e.prompt||B,time:new Date().toLocaleTimeString(),status:"generating",progress:0,modelName:`RH: ${B}`,sourceNodeId:e.id,startTime:je};c(Wt=>[gt,...Wt]);let Jt=0;Ve=setInterval(()=>{Jt=Math.min(95,Jt+3),c==null||c(Wt=>Wt.map(Pt=>Pt.id===Ze?{...Pt,progress:Jt}:Pt))},3e3)}if(tt)try{const gt=JSON.parse(tt),Jt=gt==null?void 0:gt.node_errors;if(Jt&&Object.keys(Jt).length>0){const Wt=Bt=>{if(typeof Bt=="string")return Bt;if(Bt&&typeof Bt=="object"){const zt=Bt;return zt.message??zt.msg??zt.error??zt.detail??JSON.stringify(zt)}return String(Bt)},Pt=Object.entries(Jt).map(([Bt,zt])=>`节点 ${Bt}: ${Wt(zt)}`).join("; ");F(Pt)}}catch{}const Ye=await VO({apiKey:J.trim(),taskId:Ze,useOverseas:j,onProgress:gt=>A(gt==="queued"?"queued":"running")});if(!Ye.success){F(Ye.error||"任务失败"),Ve&&clearInterval(Ve),c==null||c(gt=>gt.map(Jt=>Jt.id===Ze?{...Jt,status:"failed",progress:0,errorMsg:Ye.error}:Jt)),n(e.id,{isGenerating:!1}),A("idle");return}Ve&&clearInterval(Ve);const ct=Ye.outputItems||(Ye.fileUrls||[]).map(gt=>({fileUrl:gt})),pt=ct.filter(gt=>!FE(gt)).map(gt=>gt.fileUrl),ht=ct.filter(FE),wt=pt,$t=Date.now(),jt=pt[0]||"",Nt=jt?UE(jt):"image",Yt=Nt==="video"?"video":"image",un=pt.map((gt,Jt)=>({id:`${Ze}_${Jt}`,thumbUrl:gt,fullUrl:gt,createdAt:$t})),Tn=je!=null?$t-je:void 0;n(e.id,{content:jt,previewType:Nt,settings:{...e.settings,generatedImages:[...Y,...un],rhLastRunDurationMs:Tn}}),(async()=>{try{const{assetStore:gt}=await mn(async()=>{const{assetStore:Jt}=await Promise.resolve().then(()=>_s);return{assetStore:Jt}},void 0,import.meta.url);await gt.init();for(let Jt=0;Jtgt.map(Jt=>Jt.id===Ze?{...Jt,type:Nt,url:jt,status:"completed",progress:100,mjImages:wt.length>1?wt:void 0,durationMs:Tn,_assetId:Ze,_mjAssetIds:wt.length>1?wt.map((Wt,Pt)=>Pt===0?Ze:`${Ze}_${Pt}`):void 0}:Jt));let fn=r.filter(gt=>gt.from===e.id&&(!gt.inputType||gt.inputType==="default")).map(gt=>gt.to);const Dn=new Map(i.map(gt=>[gt.id,gt]));if(!fn.some(gt=>{var Jt;return((Jt=Dn.get(gt))==null?void 0:Jt.type)==="preview"})&&pt.length>0&&u&&d&&v){const gt=v(),Jt=Ms(gt,"preview",e.x+e.width+80,e.y,void 0,void 0,i);Jt.width=400,Jt.height=400,u(Wt=>[...Wt,Jt]),d(Wt=>[...Wt,{id:v(),from:e.id,to:gt,fromPort:"output",toPort:"input"}]),fn=[gt]}if(fn.filter(gt=>{var Jt;return((Jt=Dn.get(gt))==null?void 0:Jt.type)==="preview"}).forEach(gt=>{const Jt=Dn.get(gt),Wt={content:jt,previewType:Nt,previewMjImages:wt.length>1&&Nt==="image"?wt:void 0,selectedPreviewImage:Nt==="image"?jt:void 0};Nt==="audio"&&(Wt.settings={...(Jt==null?void 0:Jt.settings)||{},musicTitle:e.prompt||B}),n(gt,Wt)}),ht.length>0&&u&&d&&v)try{const gt=[];for(const Wt of ht){const Pt=await Sce(Wt.fileUrl);Pt.trim()&>.push(Pt.trim())}const Jt=gt.join(` + +`);if(Jt){const Wt=new Map(i.map(Bt=>[Bt.id,Bt])),Pt=r.filter(Bt=>Bt.from===e.id&&(!Bt.inputType||Bt.inputType==="default")).map(Bt=>Bt.to).filter(Bt=>{var zt;return((zt=Wt.get(Bt))==null?void 0:zt.type)==="text-node"});if(Pt.length>0)n(Pt[0],{settings:{...((Le=Wt.get(Pt[0]))==null?void 0:Le.settings)||{},text:Jt}});else{const Bt=v(),zt=Ms(Bt,"text-node",e.x+e.width+80,e.y,void 0,void 0,i);zt.settings={...zt.settings,text:Jt},u(Gt=>[...Gt,zt]),d(Gt=>[...Gt,{id:v(),from:e.id,to:Bt,fromPort:"output",toPort:"input"}])}n(e.id,{settings:{...e.settings,generatedImages:[...Y,...un],rhLastRunDurationMs:Tn,rhOutputText:Jt}})}}catch(gt){console.error("[RhApp] 获取 TXT 文本失败:",gt)}A("done"),n(e.id,{isGenerating:!1})}catch(Xe){F(Xe instanceof Error?Xe.message:"运行失败"),A("idle"),n(e.id,{isGenerating:!1}),Ve&&clearInterval(Ve),c&&Ze&&c(qe=>qe.map(tt=>tt.id===Ze?{...tt,status:"failed",progress:0,errorMsg:Xe.message}:tt))}finally{I(!1)}},[J,ie,j,k,e.id,e.settings,e.prompt,e.width,e.x,r,i,n,te,Y,c,u,d,v]),ne=_.useCallback(Ve=>{const Ze=Ve.target.value;n(e.id,{settings:{...e.settings,rhApiKey:Ze}});try{typeof localStorage<"u"&&localStorage.setItem(ri.RH_API_KEY,Ze)}catch{}F(null)},[e.id,e.settings,n]),le=_.useCallback(Ve=>{n(e.id,{settings:{...e.settings,webappId:Ve.target.value}}),F(null)},[e.id,e.settings,n]),fe=_.useCallback(Ve=>{n(e.id,{settings:{...e.settings,rhUseOverseas:Ve.target.checked}})},[e.id,e.settings,n]),be=_.useCallback(Ve=>{n(e.id,{settings:{...e.settings,rhInstanceType:Ve}})},[e.id,e.settings,n]),de=_.useCallback(Ve=>{n(e.id,{prompt:Ve.target.value})},[e.id,n]),$e=_.useCallback((Ve,Ze)=>{if(Ve.stopPropagation(),Ve.preventDefault(),y!=null&&y.current&&w&&g){const je=y.current.getBoundingClientRect(),Le=(Ve.clientX-je.left-w.x)/w.zoom,Xe=(Ve.clientY-je.top-w.y)/w.zoom;g({x:Le,y:Xe})}h==null||h(e.id),p==null||p(Ze)},[e.id,y,w,g,h,p]),ze=_.useCallback((Ve,Ze)=>{Ve.stopPropagation(),b&&b!==e.id&&d&&v&&(r.some(Le=>Le.from===b&&Le.to===e.id&&(Le.inputType||"default")===Ze)||d(Le=>[...Le.filter(Xe=>!(Xe.to===e.id&&(Xe.inputType||"default")===Ze)),{id:v(),from:b,to:e.id,inputType:Ze}]),h==null||h(null),p==null||p(null),f==null||f(null))},[e.id,b,r,d,v,h,p,f]),_e=t?"bg-transparent":"bg-white",Ee=t?"border-white/30":"border-zinc-200",Ce=t?"bg-transparent border-white/30 text-white placeholder-white/50":"bg-zinc-50 border-zinc-300 text-zinc-900 placeholder-zinc-400",xe=t?"text-white":"text-zinc-600";return s.jsx("div",{className:`flex flex-col h-full ${_e} ${Ee} border rounded-xl overflow-hidden`,children:s.jsxs("div",{className:"flex-1 overflow-y-auto p-3 space-y-3 rh-scroll-minimal",children:[s.jsxs("div",{children:[s.jsxs("label",{className:`flex items-center gap-1.5 text-xs font-medium mb-1.5 ${xe}`,children:[s.jsx(WP,{size:14}),"RH API Key"]}),s.jsx("input",{type:"password",value:J,onChange:ne,placeholder:"在 RH 控制台获取",className:`w-full px-2.5 py-1.5 text-sm rounded-md border ${Ce} focus:outline-none focus:ring-1 focus:ring-blue-500`})]}),s.jsxs("div",{children:[s.jsxs("label",{className:`flex items-center gap-1.5 text-xs font-medium mb-1.5 ${xe}`,children:[s.jsx(FP,{size:14}),"WebApp ID"]}),s.jsx("input",{type:"text",value:Z,onChange:le,placeholder:"详情页链接末尾数字或完整链接",className:`w-full px-2.5 py-1.5 text-sm rounded-md border ${Ce} focus:outline-none focus:ring-1 focus:ring-blue-500`})]}),s.jsxs("label",{className:`flex items-center gap-2 text-xs cursor-pointer ${xe}`,children:[s.jsx("input",{type:"checkbox",checked:j,onChange:fe,className:`rounded ${t?"border-white/30":"border-zinc-500"}`}),"使用海外地址 (runninghub.ai)"]}),s.jsx("button",{onClick:Q,disabled:z,className:`w-full flex items-center justify-center gap-2 px-3 py-2 text-sm font-medium rounded-md transition-colors border ${z?t?"bg-transparent border-white/20 text-white/50 cursor-not-allowed":"bg-zinc-500/50 text-zinc-400 cursor-not-allowed":t?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-blue-500 hover:bg-blue-600 text-white"}`,children:z?s.jsxs(s.Fragment,{children:[s.jsx(zr,{size:16,className:"animate-spin"}),"获取中..."]}):s.jsxs(s.Fragment,{children:[s.jsx(ym,{size:16}),"获取应用信息"]})}),O&&s.jsxs("div",{className:`flex items-start gap-2 p-2 rounded-md border ${t?"bg-transparent border-red-500/30 text-red-400":"bg-red-50 text-red-600"}`,children:[s.jsx(nf,{size:16,className:"flex-shrink-0 mt-0.5"}),s.jsx("span",{className:"text-xs",children:O})]}),B&&s.jsxs("div",{className:`rounded-md p-3 border ${Ee} ${t?"bg-transparent":"bg-zinc-50"}`,children:[s.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[s.jsx(Aw,{size:16,className:"text-green-500"}),s.jsx("span",{className:"font-medium text-sm",children:B})]}),V.length>0&&s.jsx("div",{className:"flex gap-2 mb-2 overflow-x-auto",children:V.slice(0,3).map((Ve,Ze)=>s.jsx("img",{src:Ve.thumbnailUri||Ve.url,alt:"",className:"w-16 h-16 object-cover rounded"},Ze))}),s.jsxs("a",{href:`https://www.runninghub.cn/ai-detail/${ie||Z}`,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-1 text-xs text-blue-500 hover:underline mt-2",children:[s.jsx(Tv,{size:12}),"在 RH 平台打开"]})]}),N.length>0&&s.jsxs("div",{className:"space-y-3 min-h-[180px]",children:[s.jsx("div",{className:`text-xs font-medium ${xe}`,children:"可编辑参数"}),N.map(Ve=>{var pt;const Ze=`${Ve.nodeId}:${Ve.fieldName}`,je=W[Ze]??Ve.fieldValue??"",Le=(Ve.fieldType||"").toUpperCase(),Xe=Ve.description||Ve.fieldName;if(Le==="STRING"&&$ce(Ve)){const wt=`rh_str_${oe.get(Ze)??0}`,$t=o==null?void 0:o(e.id,wt),jt=re.length>0?ee:null,Nt=!!($t||jt),Yt=e.prompt||$t||jt||qd(je);return s.jsxs("div",{className:"flex flex-col flex-1 min-h-[80px]",children:[s.jsxs("div",{className:"flex items-center justify-between mb-1.5",children:[s.jsx("label",{className:`block text-xs ${xe}`,children:Xe}),s.jsx("span",{"data-input-type":wt,onMouseDown:un=>{un.stopPropagation(),$e(un,wt)},onMouseUp:un=>{un.stopPropagation(),ze(un,wt)},title:"点击后拖到文本节点可单独连接此框",className:`cursor-pointer px-1.5 py-0.5 rounded text-[10px] ${Nt?t?"text-green-400":"text-green-600":t?"text-zinc-400 hover:text-zinc-300":"text-zinc-500 hover:text-zinc-600"}`,children:Nt?"已连接":"链接"})]}),jt&&pe>0&&s.jsxs("div",{className:`mb-1 flex items-center gap-1.5 px-2 py-1 rounded text-[10px] border ${t?"bg-transparent border-white/30":"bg-blue-50 border-blue-200"}`,children:[s.jsx(Vo,{size:12,className:t?"text-white":"text-blue-600"}),s.jsxs("span",{className:t?"text-white":"text-blue-700",children:["上游已连接: 文字节点(",pe,"个)"]})]}),s.jsxs("div",{"data-input-type":wt,onMouseUp:un=>ze(un,wt),children:[s.jsx("textarea",{value:Yt,onChange:un=>{de(un),me(Ze,un.target.value)},placeholder:"可连接文字节点(图片连接后,default 端口的文字节点会自动识别)",rows:5,style:{minHeight:"100px"},className:`w-full px-3 py-2 text-lg rounded-md border ${Ce} focus:outline-none focus:ring-1 focus:ring-blue-500 resize-y min-h-[100px] leading-relaxed`}),Nt&&s.jsx("span",{className:"text-[10px] text-zinc-500 mt-0.5 block",children:$t?"已连接文字节点":"已识别 default 端口文字节点"})]})]},Ze)}if(Le==="LIST"){const ht=zce(Ve.fieldData,Ve),wt=qd(je),$t=BE(Ve.fieldData),jt=wt||($t&&ht.some(Yt=>Yt.index===$t)?$t:"")||(((pt=ht[0])==null?void 0:pt.index)??""),Nt=String(jt??"");return s.jsxs("div",{className:"rh-list-dropdown",children:[s.jsx("label",{className:`block text-xs mb-1 ${xe}`,children:Xe}),s.jsxs("div",{className:"relative",children:[s.jsxs("button",{type:"button",onMouseDown:Yt=>{Yt.preventDefault(),Yt.stopPropagation();const un=L.has(Ze);X(new Set(un?[]:[Ze]))},className:`w-full px-2.5 py-1.5 text-sm rounded-md border text-left flex items-center justify-between ${Ce} focus:outline-none focus:ring-1 focus:ring-blue-500`,children:[s.jsx("span",{className:"truncate",children:Nt||"请选择"}),s.jsx("span",{className:"text-xs",children:"▼"})]}),L.has(Ze)&&s.jsx("div",{className:`absolute top-full left-0 right-0 mt-1 border rounded-md shadow-lg z-[9999] max-h-[300px] overflow-y-auto min-w-max rh-scroll-minimal ${t?"bg-zinc-900 border-zinc-600 text-white":Ce}`,onMouseDown:Yt=>{Yt.stopPropagation(),Yt.preventDefault()},children:ht.length>0?ht.map(Yt=>s.jsx("div",{role:"option",onMouseDown:un=>{un.stopPropagation(),un.preventDefault(),me(Ze,String(Yt.index)),X(new Set)},className:`px-2.5 py-1.5 text-sm cursor-pointer hover:bg-blue-500/20 select-none ${Nt===String(Yt.index)?"bg-blue-500/30 font-medium":""}`,title:String(Yt.name),children:String(Yt.name)},Yt.index)):s.jsx("div",{className:"px-2.5 py-1.5 text-sm text-zinc-500",children:"无选项"})})]})]},Ze)}if(Le==="IMAGE"||Le==="AUDIO"||Le==="VIDEO"){const ht=we.get(Ze)??0,wt=re[ht],$t=!!wt,jt=qd(je),Nt=M[Ze],Yt=Le==="IMAGE"&&(Nt||wt),un=jt&&(jt.startsWith("api/")||jt.startsWith("openapi/")),Tn=T===Ze,Ht=Le==="IMAGE";if(Le==="AUDIO"){const fn=wt,Dn=Nt||fn;return s.jsxs("div",{children:[s.jsx("label",{className:`block text-xs mb-1 ${xe}`,children:Xe}),s.jsxs("div",{className:"flex gap-2 items-center flex-wrap",children:[Dn&&s.jsxs("div",{className:`w-full rounded-md border p-2 flex items-center gap-2 ${t?"border-white/30 bg-transparent":"border-zinc-300 bg-zinc-50"}`,children:[s.jsx($c,{size:20,className:t?"text-green-400":"text-green-600"}),s.jsx("audio",{src:Nt||fn,controls:!0,className:"flex-1 h-8",onMouseDown:it=>it.stopPropagation(),onClick:it=>it.stopPropagation()})]}),un&&!Dn&&s.jsxs("div",{className:`w-full rounded-md border p-2 flex items-center gap-2 ${t?"border-white/30 bg-transparent":"border-zinc-300 bg-zinc-50"}`,children:[s.jsx($c,{size:20,className:t?"text-green-400":"text-green-600"}),s.jsx("span",{className:`text-xs ${t?"text-white":"text-zinc-600"}`,children:"音频已上传"})]}),s.jsxs("div",{className:"flex gap-2 items-center w-full",children:[s.jsx("input",{ref:it=>{H.current[Ze]=it},type:"file",accept:"audio/*",className:"hidden",onChange:it=>G(Ve,it)}),s.jsxs("button",{type:"button",onClick:()=>{var it;return(it=H.current[Ze])==null?void 0:it.click()},className:`flex items-center gap-1.5 px-2 py-1.5 text-xs rounded-md border ${Ee} ${t?"hover:bg-white/5":"hover:bg-zinc-100"}`,title:"上传音频或从画布连接音频节点",children:[s.jsx(Xi,{size:14,className:"text-blue-500"}),s.jsx(ou,{size:14}),"上传音频"]}),$t&&s.jsx("span",{className:`text-[10px] ${t?"text-green-400":"text-green-600"}`,children:"已连接画布音频"})]})]})]},Ze)}if(Le==="VIDEO"){const fn=wt,Dn=Nt||fn;return s.jsxs("div",{children:[s.jsx("label",{className:`block text-xs mb-1 ${xe}`,children:Xe}),s.jsxs("div",{className:"flex gap-2 items-center flex-wrap",children:[Dn&&s.jsx("div",{className:`w-full rounded-md border overflow-hidden ${t?"border-white/30 bg-transparent":"border-zinc-300 bg-zinc-50"}`,children:s.jsx("video",{src:Nt||fn,controls:!0,className:"w-full max-h-32",onMouseDown:it=>it.stopPropagation(),onClick:it=>it.stopPropagation()})}),un&&!Dn&&s.jsx("div",{className:`w-16 h-16 rounded-md border flex items-center justify-center flex-shrink-0 ${t?"border-white/30 bg-transparent":"border-zinc-400/50 bg-zinc-800/50"}`,children:s.jsx(aa,{size:24,className:t?"text-green-400":"text-green-600"})}),s.jsxs("div",{className:"flex gap-2 items-center",children:[s.jsx("input",{ref:it=>{H.current[Ze]=it},type:"file",accept:"video/*",className:"hidden",onChange:it=>G(Ve,it)}),s.jsxs("button",{type:"button",onClick:()=>{var it;return(it=H.current[Ze])==null?void 0:it.click()},className:`flex items-center gap-1.5 px-2 py-1.5 text-xs rounded-md border ${Ee} ${t?"hover:bg-white/5":"hover:bg-zinc-100"}`,title:"上传视频或从画布连接视频",children:[s.jsx(Xi,{size:14,className:"text-blue-500"}),s.jsx(ou,{size:14}),"上传视频"]}),$t&&s.jsx("span",{className:`text-[10px] ${t?"text-green-400":"text-green-600"}`,children:"已连接画布视频"}),un&&!$t&&s.jsx("span",{className:`text-[10px] ${t?"text-white/60":"text-zinc-500"}`,children:"已上传"})]})]})]},Ze)}return s.jsxs("div",{children:[s.jsx("label",{className:`block text-xs mb-1 ${xe}`,children:Xe}),s.jsxs("div",{className:"flex gap-2 items-center flex-wrap",children:[Yt&&s.jsx("div",{className:`w-16 h-16 rounded-md overflow-hidden border flex-shrink-0 ${t?"border-white/30 bg-transparent":"border-zinc-400/50 bg-zinc-800/50"}`,children:s.jsx("img",{src:Nt||wt,alt:"上传预览",className:"w-full h-full object-cover",onError:fn=>{fn.target.style.display="none"}})}),s.jsxs("div",{"data-rh-upload-zone":"true",className:`flex flex-col gap-1 flex-1 min-w-0 rounded-md border-2 border-dashed transition-colors ${Tn&&Ht?"border-blue-500 bg-blue-500/10":`${Ee} ${t?"hover:border-white/50":"hover:border-zinc-300"}`}`,onDragEnter:Ht?fn=>{fn.preventDefault(),fn.stopPropagation(),fn.dataTransfer.dropEffect="copy",q(Ze)}:void 0,onDragOver:Ht?fn=>{fn.preventDefault(),fn.stopPropagation(),fn.dataTransfer.dropEffect="copy",q(Ze)}:void 0,onDragLeave:Ht?fn=>{fn.preventDefault(),fn.currentTarget.contains(fn.relatedTarget)||q(null)}:void 0,onDrop:Ht?async fn=>{var Lt,gt,Jt;fn.preventDefault(),fn.stopPropagation(),q(null);const Dn=fn.dataTransfer.getData("application/json");if(Dn)try{const Wt=JSON.parse(Dn);if(Wt.type==="history-item"&&((Lt=Wt.item)!=null&&Lt.url)){let Pt=Wt.item.url;if(((gt=Wt.item.mjImages)==null?void 0:gt.length)>0){const Bt=Wt.item.selectedMjImageIndex??0;Pt=Wt.item.mjImages[Bt]||Pt}if(Pt){await U(Ve,Pt);return}}}catch{}const it=(Jt=fn.dataTransfer.files)==null?void 0:Jt[0];it&&(it.type.startsWith("image/")||/\.(png|jpg|jpeg|gif|webp)$/i.test(it.name))&&await ue(Ve,it)}:void 0,children:[s.jsxs("div",{className:"flex gap-2 items-center p-2",children:[s.jsx("input",{ref:fn=>{H.current[Ze]=fn},type:"file",accept:"image/*",className:"hidden",onChange:fn=>G(Ve,fn)}),s.jsxs("button",{type:"button",onClick:()=>{var fn;return(fn=H.current[Ze])==null?void 0:fn.click()},className:`flex items-center gap-1.5 px-2 py-1.5 text-xs rounded-md border ${Ee} ${t?"hover:bg-white/5":"hover:bg-zinc-100"}`,title:"点击上传或从生成历史拖入图片",children:[s.jsx(Xi,{size:14,className:"text-blue-500"}),s.jsx(ou,{size:14}),"上传"]}),$t&&s.jsx("span",{className:`text-[10px] ${t?"text-green-400":"text-green-600"}`,children:"已连接画布图片"})]}),Tn&&Ht&&s.jsx("span",{className:`text-[10px] ${t?"text-blue-400":"text-blue-500"} px-2 pb-1`,children:"松开即可上传"}),jt&&(jt.startsWith("api/")||jt.startsWith("openapi/"))&&s.jsx("span",{className:`text-[10px] ${t?"text-white/60":"text-zinc-500"} truncate px-2`,children:"已上传"})]})]})]},Ze)}const tt=`rh_str_${oe.get(Ze)??0}`,Ye=o==null?void 0:o(e.id,tt),ct=Ye||qd(je);return s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center justify-between mb-1.5",children:[s.jsx("label",{className:`block text-xs ${xe}`,children:Xe}),s.jsx("span",{"data-input-type":tt,onMouseDown:ht=>{ht.stopPropagation(),$e(ht,tt)},onMouseUp:ht=>{ht.stopPropagation(),ze(ht,tt)},title:"点击后拖到文本节点可单独连接此框",className:`cursor-pointer px-1.5 py-0.5 rounded text-[10px] ${Ye?t?"text-green-400":"text-green-600":t?"text-zinc-400 hover:text-zinc-300":"text-zinc-500 hover:text-zinc-600"}`,children:Ye?"已连接":"链接"})]}),s.jsxs("div",{"data-input-type":tt,onMouseUp:ht=>ze(ht,tt),children:[s.jsx("input",{type:"text",value:ct,onChange:ht=>me(Ze,ht.target.value),placeholder:"可连接文字节点(点「链接」后拖到文本节点)",className:`w-full px-3 py-2 text-sm rounded-md border ${Ce} focus:outline-none focus:ring-1 focus:ring-blue-500`}),Ye&&s.jsx("span",{className:"text-[10px] text-zinc-500 mt-0.5 block",children:"已连接文字节点"})]})]},Ze)})]}),B&&s.jsxs("div",{className:"space-y-1.5",children:[s.jsx("div",{className:`text-xs font-medium ${xe}`,children:"显存机器"}),s.jsxs("div",{className:"flex gap-2",children:[s.jsx("button",{type:"button",onClick:()=>be("default"),className:`flex-1 px-3 py-2 text-sm font-medium rounded-md border transition-colors ${k==="default"?t?"bg-zinc-700 border-zinc-600 text-white":"bg-zinc-200 border-zinc-300 text-zinc-900":t?"bg-transparent border-white/20 text-white/70 hover:bg-white/5":"bg-transparent border-zinc-200 text-zinc-600 hover:bg-zinc-50"}`,children:"24G"}),s.jsx("button",{type:"button",onClick:()=>be("plus"),className:`flex-1 px-3 py-2 text-sm font-medium rounded-md border transition-colors ${k==="plus"?t?"bg-zinc-700 border-zinc-600 text-white":"bg-zinc-200 border-zinc-300 text-zinc-900":t?"bg-transparent border-white/20 text-white/70 hover:bg-white/5":"bg-transparent border-zinc-200 text-zinc-600 hover:bg-zinc-50"}`,children:"48G"})]})]}),B&&s.jsx("button",{onClick:ge,disabled:E,className:`w-full flex items-center justify-center gap-2 px-3 py-2 text-sm font-medium rounded-md transition-colors border ${E?t?"bg-transparent border-white/20 text-white/50 cursor-not-allowed":"bg-zinc-500/50 text-zinc-400 cursor-not-allowed":t?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-green-500 hover:bg-green-600 text-white"}`,children:E?s.jsxs(s.Fragment,{children:[s.jsx(zr,{size:16,className:"animate-spin"}),R==="queued"?"排队中...":"运行中..."]}):s.jsxs(s.Fragment,{children:[s.jsx(Ia,{size:16}),"运行"]})}),Y.length>0&&s.jsxs("div",{className:"space-y-2",children:[s.jsxs("div",{className:`flex items-center justify-between gap-2 text-xs font-medium ${xe}`,children:[s.jsxs("div",{className:"flex items-center gap-1.5",children:[s.jsx(si,{size:14}),"生成结果"]}),se!=null&&s.jsxs("span",{className:`flex items-center gap-1 ${t?"text-green-400":"text-green-600"}`,children:[s.jsx(dd,{size:12}),se<1e3?`${se}ms`:`${(se/1e3).toFixed(1)}s`]})]}),s.jsx("div",{className:"flex flex-wrap gap-2",children:Y.slice(-6).reverse().map(Ve=>{const Ze=UE(Ve.fullUrl);return Ze==="audio"?s.jsxs("div",{className:`flex flex-col gap-1 w-full min-w-[200px] p-2 rounded-lg border ${t?"border-zinc-600 bg-zinc-800/50":"border-zinc-300 bg-zinc-50"}`,children:[s.jsxs("div",{className:"flex items-center gap-1.5 text-xs text-zinc-500",children:[s.jsx($c,{size:12}),"音频"]}),s.jsx("audio",{src:Ve.fullUrl,controls:!0,className:"w-full h-8",preload:"metadata",onMouseDown:je=>je.stopPropagation(),onClick:je=>je.stopPropagation()})]},Ve.id):Ze==="video"?s.jsx("div",{className:`block w-14 h-14 rounded overflow-hidden border ${t?"border-zinc-600":"border-zinc-300"} hover:border-blue-500 transition-colors`,children:s.jsx("video",{src:Ve.fullUrl,className:"w-full h-full object-cover",muted:!0,preload:"metadata",onMouseDown:je=>je.stopPropagation(),onClick:je=>je.stopPropagation()})},Ve.id):s.jsx("a",{href:Ve.fullUrl,target:"_blank",rel:"noopener noreferrer",className:"block w-14 h-14 rounded overflow-hidden border border-zinc-300 hover:border-blue-500 transition-colors",children:s.jsx("img",{src:Ve.fullUrl,alt:"",className:"w-full h-full object-cover"})},Ve.id)})})]})]})})};function Cce(e){const t=e.trim();if(/^\d+$/.test(t))return t;const n=t.match(/workflow\/(\d+)/)||t.match(/(\d{15,})/);return n?n[1]:t}function Nce(e){return Array.isArray(e)&&e.length>=2&&typeof e[0]=="string"&&typeof e[1]=="number"}function Ece(e){const t=[],n=new Set,r=i=>{const a=`${i.nodeId}:${i.fieldName}`;n.has(a)||(n.add(a),t.push(i))};try{let i=typeof e=="string"?JSON.parse(e):e;if(typeof i!="object"||i===null)return t;const a=typeof i.prompt=="object"?i.prompt:i;for(const[o,l]of Object.entries(a)){const c=l,u=c.class_type||"",d=c.inputs||{},p=(c._meta||{}).title||u;if(u==="CLIPTextEncode"&&"text"in d)r({nodeId:o,fieldName:"text",fieldValue:String(d.text??""),fieldType:"STRING",description:`${p} - 提示词`});else if(u==="KSampler")"seed"in d&&r({nodeId:o,fieldName:"seed",fieldValue:String(d.seed??""),fieldType:"NUMBER",description:`${p} - 种子`}),"steps"in d&&r({nodeId:o,fieldName:"steps",fieldValue:String(d.steps??""),fieldType:"NUMBER",description:`${p} - 步数`}),"cfg"in d&&r({nodeId:o,fieldName:"cfg",fieldValue:String(d.cfg??""),fieldType:"NUMBER",description:`${p} - CFG`}),"denoise"in d&&r({nodeId:o,fieldName:"denoise",fieldValue:String(d.denoise??""),fieldType:"NUMBER",description:`${p} - 去噪强度`});else if((u==="LoadImage"||u==="LoadImageFromUrl"||u==="LG_LoadImage"||u.endsWith("LG_LoadImage")||u.includes("LoadImage")||typeof p=="string"&&p.includes("LoadImage"))&&("image"in d||"filename"in d)){const f="image"in d?"image":"filename",b=d[f];let g="";if(typeof b=="string")g=b;else if(Array.isArray(b)&&b.length>0)g=String(b[0]);else if(typeof b=="object"&&b!==null){const y=b;g=String(y.__value__??y.value??"")}r({nodeId:o,fieldName:f,fieldValue:g,fieldType:"IMAGE",description:`${p} - 参考图`})}else if((u==="LoadAudio"||u==="LoadAudioStandalone"||u==="VHS_LoadAudio"||u==="VHS_LoadAudioUpload"||u==="LoadVHSAudio")&&("audio"in d||"audio_file"in d)){const f="audio"in d?"audio":"audio_file";r({nodeId:o,fieldName:f,fieldValue:"",fieldType:"AUDIO",description:`${p} - 音频`})}else if((u==="LoadVideo"||u==="LoadVideoFromUrl")&&("video"in d||"video_path"in d)){const f="video"in d?"video":"video_path";r({nodeId:o,fieldName:f,fieldValue:"",fieldType:"VIDEO",description:`${p} - 视频`})}else if(u==="EmptyLatentImage")"width"in d&&r({nodeId:o,fieldName:"width",fieldValue:String(d.width??""),fieldType:"NUMBER",description:`${p} - 宽度`}),"height"in d&&r({nodeId:o,fieldName:"height",fieldValue:String(d.height??""),fieldType:"NUMBER",description:`${p} - 高度`}),"batch_size"in d&&r({nodeId:o,fieldName:"batch_size",fieldValue:String(d.batch_size??""),fieldType:"NUMBER",description:`${p} - 批次`});else for(const[f,b]of Object.entries(d)){if(Nce(b)||f==="clip"||f==="model"||f==="vae"||f==="latent_image"||f==="samples")continue;if((f==="image"||f==="filename")&&(typeof b=="string"||Array.isArray(b)&&b.length>0||typeof b=="object"&&b!==null&&("__value__"in b||"value"in b))){let y="";if(typeof b=="string")y=b;else if(Array.isArray(b))y=String(b[0]??"");else if(typeof b=="object"&&b!==null){const w=b;y=String(w.__value__??w.value??"")}r({nodeId:o,fieldName:f,fieldValue:y,fieldType:"IMAGE",description:`${p} - ${f==="image"?"参考图":f}`})}else typeof b=="string"&&b.length>0&&b.length<500?r({nodeId:o,fieldName:f,fieldValue:b,fieldType:"STRING",description:`${p} - ${f}`}):typeof b=="number"&&r({nodeId:o,fieldName:f,fieldValue:String(b),fieldType:"NUMBER",description:`${p} - ${f}`})}}}catch{}return t}function WE(e){const t=(e.fieldName||"").toLowerCase();return t==="text"||t.includes("prompt")}function Ice(e){const t=[];if(!e||typeof e!="string")return t;try{const n=JSON.parse(e),r=typeof n.prompt=="object"&&n.prompt!==null?n.prompt:n;for(const[i,a]of Object.entries(r)){const c=(a.inputs||{}).crop;(c==="0"||typeof c=="string"&&c.trim()==="0")&&t.push({nodeId:i,fieldName:"crop",fieldValue:0})}}catch{}return t}function m7(e){if(!e)return!1;const t=e.split("?")[0].toLowerCase();return/\.(mp4|webm|mov|avi|mkv)(\?|$)/i.test(t)}function zp(e){if(!e)return!1;const t=e.split("?")[0].toLowerCase();return/\.(mp3|wav|ogg|m4a|aac|flac)(\?|$)/i.test(t)}function f_(e){return!!(!e||e.startsWith("data:audio/")||e.startsWith("data:video/")||zp(e)||m7(e))}const kce=({node:e,isDark:t,updateNode:n,connections:r=[],nodes:i=[],getConnectedInputImages:a,dataVersion:o=0,setHistory:l,setNodes:c,setConnections:u,generateId:d,onSaveWorkflowToLibrary:h})=>{var ge,ne,le,fe,be,de,$e,ze,_e,Ee;const[p,f]=_.useState(!1),[b,g]=_.useState(!1),[y,w]=_.useState("idle"),[v,m]=_.useState(null),[z,C]=_.useState(!1),[E,I]=_.useState(null),R=_.useRef(null),A=_.useRef(null),O=_.useRef({}),F=((ge=e.settings)==null?void 0:ge.rhApiKey)||typeof localStorage<"u"&&localStorage.getItem(ri.RH_API_KEY)||"",L=((ne=e.settings)==null?void 0:ne.workflowId)||"",X=((le=e.settings)==null?void 0:le.rhUseOverseas)??!1,T=((fe=e.settings)==null?void 0:fe.comfyEditableParams)||[],q=((be=e.settings)==null?void 0:be.rhComfyParamValues)||{},H=((de=e.settings)==null?void 0:de.comfyRawWorkflowJson)||"",J=(($e=e.settings)==null?void 0:$e.rhComfyUploadPreviews)||{},Z=((ze=e.settings)==null?void 0:ze.generatedImages)||[],B=(_e=e.settings)==null?void 0:_e.rhComfyLastRunDurationMs,V=Cce(L),N=_.useMemo(()=>{const Ce=new Map(i.map(Ne=>[Ne.id,Ne])),xe=[];return r.filter(Ne=>Ne.to===e.id&&(!Ne.inputType||Ne.inputType==="default")).forEach(Ne=>{var ke,Ie;const ve=Ce.get(Ne.from);if(ve&&(ve.type==="text-node"||ve.type==="custom-agent")){const Pe=((ke=ve.settings)==null?void 0:ke.text)||ve.prompt||ve.content||((Ie=ve.settings)==null?void 0:Ie.outputContent)||"";Pe.trim()&&xe.push(Pe.trim())}}),xe.join(` + +`)},[e.id,r,i,o]),j=_.useMemo(()=>{const Ce=new Map(i.map(Ne=>[Ne.id,Ne])),xe=[];return r.filter(Ne=>Ne.to===e.id&&(!Ne.inputType||Ne.inputType==="default")).forEach(Ne=>{var Ie,Pe,Te,Be,He;const ve=Ce.get(Ne.from);if(!ve||ve.type==="camera-movement"||ve.type==="professional-camera"||ve.type==="gen-music")return;const ke=Je=>{!Je||typeof Je!="string"||f_(Je)||xe.includes(Je)||xe.push(Je)};if(ve.type==="preview"){const Je=ve.previewType||((Ie=ve.settings)==null?void 0:Ie.previewType);if(Je==="audio"||Je==="video")return;ve.selectedPreviewImage?ke(ve.selectedPreviewImage):(Pe=ve.previewMjImages)!=null&&Pe[0]?ke(ve.previewMjImages[0]):ve.content&&ke(ve.content)}else if(ve.type==="canvas-node")ve.content?xe.push(ve.content):(Te=ve.settings)!=null&&Te.canvasData&&xe.push(`canvas-node:${ve.id}`);else if(ve.type==="rh-app"){const Je=(Be=ve.settings)==null?void 0:Be.generatedImages;Je!=null&&Je.length?Je.forEach(Me=>ke(Me.fullUrl)):ve.content&&ke(ve.content)}else if(ve.type==="input-image"){const Je=(He=ve.settings)==null?void 0:He.mediaType;if(Je==="audio"||Je==="video")return;ve.content&&ke(ve.content)}else ve.type==="rh-comfy"||ve.type==="gen-image"||ve.type==="gen-video"||ve.type==="video-input"?ve.content&&!f_(ve.content)&&ke(ve.content):ve.content&&ke(ve.content)}),xe},[e.id,r,i,o]),k=_.useMemo(()=>{const Ce=new Map(i.map(Ne=>[Ne.id,Ne])),xe=[];return r.filter(Ne=>Ne.to===e.id).forEach(Ne=>{var Ie,Pe;const ve=Ce.get(Ne.from);if(!ve)return;let ke="";if(ve.type==="gen-music")ke=((Ie=ve.settings)==null?void 0:Ie.audioUrl)||"";else if(ve.type==="rh-comfy"||ve.type==="rh-app"){const Te=ve.content||"";Te&&zp(Te)&&(ke=Te)}else if(ve.type==="preview"){const Te=ve.previewType||((Pe=ve.settings)==null?void 0:Pe.previewType),Be=ve.content||"";(Te==="audio"&&Be||Be&&zp(Be))&&(ke=Be)}else if(ve.type==="input-image"){const Te=ve.content||"";Te&&zp(Te)&&(ke=Te)}if(!ke&&ve.content&&typeof ve.content=="string"){const Te=ve.content;(zp(Te)||Te.startsWith("data:audio")||Te.startsWith("blob:")&&Te.length>10)&&(ke=Te)}ke&&!xe.includes(ke)&&xe.push(ke)}),xe},[e.id,r,i,o]),W=_.useCallback(async()=>{var Ce;if(!F.trim()){m("请输入 RH API Key");return}if(!V){m("请输入 Workflow ID(或粘贴 RH 工作流链接)");return}f(!0),m(null);try{const xe=await MZ({apiKey:F.trim(),workflowId:V,useOverseas:X});if(xe.code!==0)throw new Error(xe.msg||"获取工作流失败");const Ne=(Ce=xe.data)==null?void 0:Ce.prompt;if(!Ne)throw new Error("返回数据为空");const ve=Ece(Ne),ke={};ve.forEach(Pe=>{const Te=`${Pe.nodeId}:${Pe.fieldName}`;ke[Te]=Pe.fieldValue});const Ie={...q,...ke};if(n(e.id,{settings:{...e.settings,rhApiKey:F.trim(),workflowId:V,comfyEditableParams:ve,rhComfyParamValues:Ie,comfyRawWorkflowJson:Ne}}),typeof localStorage<"u")try{localStorage.setItem(ri.RH_API_KEY,F.trim())}catch{}}catch(xe){const Ne=xe instanceof Error?xe.message:"获取工作流失败";m(Ne)}finally{f(!1)}},[F,V,X,e.id,e.settings,n,q]),M=_.useCallback((Ce,xe)=>{n(e.id,{settings:{...e.settings,rhComfyParamValues:{...q,[Ce]:xe}}})},[e.id,e.settings,n,q]),Y=_.useCallback(async(Ce,xe)=>{const Ne=`${Ce.nodeId}:${Ce.fieldName}`,ve=J[Ne];if(ve!=null&&ve.startsWith("blob:"))try{URL.revokeObjectURL(ve)}catch{}const ke=URL.createObjectURL(xe);n(e.id,{settings:{...e.settings,rhComfyUploadPreviews:{...J,[Ne]:ke}}});try{m(null);const Ie=await WO({apiKey:F.trim(),file:xe,useOverseas:X});n(e.id,{settings:{...e.settings,rhComfyParamValues:{...q,[Ne]:Ie.fileName},rhComfyUploadPreviews:{...J,[Ne]:ke}}})}catch(Ie){m(Ie instanceof Error?Ie.message:"上传失败"),URL.revokeObjectURL(ke);const{[Ne]:Pe,...Te}=J;n(e.id,{settings:{...e.settings,rhComfyUploadPreviews:Te}})}},[F,X,e.id,e.settings,n,q,J]),se=_.useCallback((Ce,xe)=>{var ve;const Ne=(ve=xe.target.files)==null?void 0:ve[0];Ne&&(Y(Ce,Ne),xe.target.value="")},[Y]),ie=_.useCallback(Ce=>{n(e.id,{prompt:Ce.target.value})},[e.id,n]),oe=_.useCallback(async()=>{const Ce=[];let xe=0;for(const ve of T){const ke=`${ve.nodeId}:${ve.fieldName}`;let Ie=q[ke]??ve.fieldValue??"";if(ve.fieldType==="STRING"&&WE(ve))Ie=(e.prompt||N||String(Ie)).trim()||Ie;else if(ve.fieldType==="IMAGE"&&j.length>0){const Pe=j[xe];if(Pe)try{if(Pe.startsWith("canvas-node:"))throw m("画板节点需先导出图片"),new Error("画板节点需先导出");const Te=await As(Pe);Ie=await FO({apiKey:F.trim(),file:Te,useOverseas:X}),xe++}catch(Te){throw m(Te instanceof Error?Te.message:"参考图上传失败"),Te}}else if(ve.fieldType==="AUDIO"||ve.fieldType==="VIDEO"){const Pe=String(Ie??"");Ie=Pe.startsWith("api/")||Pe.startsWith("openapi/")?Pe:Ie}else if(ve.fieldType==="NUMBER"){const Pe=String(Ie??"").replace(",","."),Te=["seed","steps","width","height","batch_size"].includes(ve.fieldName),Be=Te?parseInt(Pe,10):Number(Pe);Ie=isNaN(Be)?Te?0:Ie:Be}else ve.fieldName==="crop"&&Ie==="0"&&(Ie=0);Ce.push({nodeId:ve.nodeId,fieldName:ve.fieldName,fieldValue:Ie})}const Ne=Ice(H);for(const ve of Ne)Ce.some(ke=>ke.nodeId===ve.nodeId&&ke.fieldName===ve.fieldName)||Ce.push({nodeId:ve.nodeId,fieldName:ve.fieldName,fieldValue:ve.fieldValue});return Ce},[T,q,e.prompt,N,j,F,X,H]),re=_.useCallback(async()=>{var Ne;if(!F.trim()||!V){m("请先获取工作流");return}g(!0),m(null),w("queued"),n(e.id,{isGenerating:!0}),R.current=new AbortController;let Ce=null,xe=null;try{const ve=T.length>0?await oe():void 0;if(Ce=(await TZ({apiKey:F.trim(),workflowId:V,nodeInfoList:ve,useOverseas:X})).taskId,A.current=Ce,n(e.id,{settings:{...e.settings,rhComfyCurrentTaskId:Ce}}),l&&Ce){xe=Date.now();const qe={id:Ce,url:"",type:"image",prompt:e.prompt||"ComfyUI 工作流",time:new Date().toLocaleTimeString(),status:"generating",progress:0,modelName:"RH ComfyUI",sourceNodeId:e.id,startTime:xe,rhUseOverseas:X};l(tt=>[qe,...tt])}const Ie=await VO({apiKey:F.trim(),taskId:Ce,useOverseas:X,onProgress:qe=>w(qe==="queued"?"queued":"running"),signal:(Ne=R.current)==null?void 0:Ne.signal});if(!Ie.success){m(Ie.error||"任务失败"),l==null||l(qe=>qe.map(tt=>tt.id===Ce?{...tt,status:"failed",progress:0,errorMsg:Ie.error}:tt)),n(e.id,{isGenerating:!1}),w("idle");return}const Pe=Ie.fileUrls||[],Te=Date.now(),Be=Pe[0]||"",He=m7(Be),Je=zp(Be),Me=He?"video":Je?"audio":"image",Re=Pe.map((qe,tt)=>({id:`${Ce}_${tt}`,thumbUrl:qe,fullUrl:qe,createdAt:Te})),Ve=xe!=null?Te-xe:void 0;n(e.id,{content:Be,previewType:Me==="audio"?"image":Me,settings:{...e.settings,generatedImages:[...Z,...Re],rhComfyLastRunDurationMs:Ve}}),(async()=>{try{const{assetStore:qe}=await mn(async()=>{const{assetStore:tt}=await Promise.resolve().then(()=>_s);return{assetStore:tt}},void 0,import.meta.url);await qe.init();for(let tt=0;ttqe.map(tt=>tt.id===Ce?{...tt,type:Me,url:Be,status:"completed",progress:100,mjImages:Pe.length>1?Pe:void 0,durationMs:Ve,_assetId:Ce,_mjAssetIds:Pe.length>1?Pe.map((Ye,ct)=>ct===0?Ce:`${Ce}_${ct}`):void 0}:tt));let je=r.filter(qe=>qe.from===e.id&&(!qe.inputType||qe.inputType==="default")).map(qe=>qe.to);const Le=new Map(i.map(qe=>[qe.id,qe]));if(!je.some(qe=>{var tt;return((tt=Le.get(qe))==null?void 0:tt.type)==="preview"})&&c&&u&&d){const qe=d(),tt=Ms(qe,"preview",e.x+e.width+80,e.y,void 0,void 0,i);tt.width=400,tt.height=400,c(Ye=>[...Ye,tt]),u(Ye=>[...Ye,{id:d(),from:e.id,to:qe,fromPort:"output",toPort:"input"}]),je=[qe]}je.forEach(qe=>{n(qe,{content:Be,previewType:Me==="audio"?"image":Me,previewMjImages:Pe.length>1?Pe:void 0,selectedPreviewImage:Be})}),w("done")}catch(ve){m(ve instanceof Error?ve.message:"运行失败"),l==null||l(ke=>ke.map(Ie=>Ie.id===Ce?{...Ie,status:"failed",progress:0,errorMsg:ve.message}:Ie))}finally{g(!1),w("idle"),A.current=null,n(e.id,{isGenerating:!1,settings:{...e.settings,rhComfyCurrentTaskId:void 0}}),R.current=null}},[F,V,X,e.id,e.settings,e.prompt,e.width,e.x,r,i,T,oe,Z,n,l,c,u,d]),ee=_.useCallback(async()=>{var xe;const Ce=A.current;if(!(!Ce||!F.trim())){try{await RZ({apiKey:F.trim(),taskId:Ce,useOverseas:X})}catch{}(xe=R.current)==null||xe.abort()}},[F,X]),pe=_.useCallback(Ce=>{const xe=Ce.target.value;n(e.id,{settings:{...e.settings,rhApiKey:xe}});try{typeof localStorage<"u"&&localStorage.setItem(ri.RH_API_KEY,xe)}catch{}m(null)},[e.id,e.settings,n]),we=_.useCallback(Ce=>{n(e.id,{settings:{...e.settings,workflowId:Ce.target.value}}),m(null)},[e.id,e.settings,n]),Q=_.useCallback(Ce=>{n(e.id,{settings:{...e.settings,rhUseOverseas:Ce.target.checked}})},[e.id,e.settings,n]),me=t?"bg-transparent":"bg-white",ue=t?"border-white/30":"border-zinc-200",U=t?"bg-transparent border-white/30 text-white placeholder-white/50":"bg-zinc-50 border-zinc-300 text-zinc-900 placeholder-zinc-400",G=t?"text-white":"text-zinc-600",te=e.prompt||N||"";return s.jsx("div",{className:`flex flex-col h-full ${me} ${ue} border rounded-xl overflow-hidden`,children:s.jsxs("div",{className:"flex-1 overflow-y-auto p-3 space-y-3 rh-scroll-minimal",children:[s.jsxs("div",{children:[s.jsxs("label",{className:`flex items-center gap-1.5 text-xs font-medium mb-1.5 ${G}`,children:[s.jsx(WP,{size:14}),"RH API Key"]}),s.jsx("input",{type:"password",value:F,onChange:pe,placeholder:"在 RH 控制台获取",className:`w-full px-2.5 py-1.5 text-sm rounded-md border ${U} focus:outline-none focus:ring-1 focus:ring-blue-500`})]}),s.jsxs("div",{children:[s.jsxs("label",{className:`flex items-center gap-1.5 text-xs font-medium mb-1.5 ${G}`,children:[s.jsx(FP,{size:14}),"Workflow ID"]}),s.jsx("input",{type:"text",value:L,onChange:we,placeholder:"工作流链接末尾数字或完整链接",className:`w-full px-2.5 py-1.5 text-sm rounded-md border ${U} focus:outline-none focus:ring-1 focus:ring-blue-500`})]}),s.jsxs("label",{className:`flex items-center gap-2 text-xs cursor-pointer ${G}`,children:[s.jsx("input",{type:"checkbox",checked:X,onChange:Q,className:`rounded ${t?"border-white/30":"border-zinc-500"}`}),"使用海外地址 (runninghub.ai)"]}),s.jsx("button",{onClick:W,disabled:p,className:`w-full flex items-center justify-center gap-2 px-3 py-2 text-sm font-medium rounded-md transition-colors border ${p?t?"bg-transparent border-white/20 text-white/50 cursor-not-allowed":"bg-zinc-500/50 text-zinc-400 cursor-not-allowed":t?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-blue-500 hover:bg-blue-600 text-white"}`,children:p?s.jsxs(s.Fragment,{children:[s.jsx(zr,{size:16,className:"animate-spin"}),"获取工作流"]}):s.jsxs(s.Fragment,{children:[s.jsx(Ow,{size:16}),"获取工作流"]})}),T.length>0&&V&&h&&s.jsxs("button",{onClick:()=>{var ke;const Ce=window.prompt("请输入工作流名称(用于在应用库中识别)",`工作流 ${V}`);if(Ce===null)return;const xe=(Ce||`工作流 ${V}`).trim(),Ne={};if(J)for(const[Ie,Pe]of Object.entries(J))typeof Pe=="string"&&Pe.startsWith("http")&&(Ne[Ie]=Pe);const ve=[];(ke=Z==null?void 0:Z[0])!=null&&ke.fullUrl&&ve.push({url:Z[0].fullUrl}),h({workflowId:V,customName:xe,comfyEditableParams:T,rhComfyParamValues:q,comfyRawWorkflowJson:H,rhUseOverseas:X,rhComfyUploadPreviews:Object.keys(Ne).length>0?Ne:void 0,covers:ve.length>0?ve:void 0})},className:`w-full flex items-center justify-center gap-2 px-3 py-2 text-sm font-medium rounded-md transition-colors border ${t?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-zinc-200 hover:bg-zinc-300 text-zinc-700"}`,title:"保存到 RH AI 应用库,下次可快速填充到 Comfy 节点",children:[s.jsx(ym,{size:16}),"保存到应用库"]}),v&&s.jsxs("div",{className:`flex items-start gap-2 p-2 rounded-md border ${t?"bg-transparent border-red-500/30 text-red-400":"bg-red-50 text-red-600"}`,children:[s.jsx(nf,{size:16,className:"flex-shrink-0 mt-0.5"}),s.jsx("span",{className:"text-xs",children:v})]}),T.length>0&&s.jsxs("div",{className:`rounded-md p-3 border ${ue} ${t?"bg-transparent":"bg-zinc-50"}`,children:[s.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[s.jsx(Aw,{size:16,className:"text-green-500"}),s.jsx("span",{className:"font-medium text-sm",children:"可编辑参数"})]}),s.jsxs("a",{href:`https://www.runninghub.cn/workflow/${V}`,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-1 text-xs text-blue-500 hover:underline mb-2",children:[s.jsx(Tv,{size:12}),"在 RH 平台打开"]})]}),H&&s.jsxs("div",{className:`rounded-md border ${ue} overflow-hidden`,children:[s.jsxs("button",{type:"button",onClick:()=>C(Ce=>!Ce),className:`w-full flex items-center gap-2 px-3 py-2 text-left text-xs font-medium border-t ${t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-zinc-100 hover:bg-zinc-200 text-zinc-700"}`,children:[z?s.jsx(Ei,{size:14}):s.jsx(Ja,{size:14}),"查看 ComfyUI 工作流结构"]}),z&&s.jsx("pre",{className:`p-3 text-[10px] overflow-auto max-h-[300px] rh-scroll-minimal ${t?"bg-zinc-900 text-zinc-400":"bg-zinc-50 text-zinc-700"}`,children:(()=>{try{const Ce=JSON.parse(H);return JSON.stringify(Ce,null,2)}catch{return H}})()})]}),s.jsx("div",{className:"grid grid-cols-2 gap-x-3 gap-y-2",children:T.map(Ce=>{const xe=`${Ce.nodeId}:${Ce.fieldName}`,Ne=q[xe]??Ce.fieldValue??"";if(Ce.fieldType==="STRING"&&WE(Ce))return s.jsxs("div",{className:"flex flex-col flex-1 min-h-[80px] col-span-2",children:[s.jsx("label",{className:`block text-xs mb-1.5 ${G}`,children:Ce.description}),s.jsx("textarea",{value:te||Ne,onChange:ve=>{ie(ve),M(xe,ve.target.value)},placeholder:"可连接文字节点",rows:4,className:`w-full px-3 py-2 text-sm rounded-md border ${U} focus:outline-none focus:ring-1 focus:ring-blue-500 resize-y min-h-[80px]`}),N&&s.jsx("span",{className:"text-[10px] text-zinc-500 mt-0.5 block",children:"已连接文字节点"})]},xe);if(Ce.fieldType==="NUMBER")return s.jsxs("div",{children:[s.jsx("label",{className:`block text-xs mb-1.5 ${G}`,children:Ce.description}),s.jsx("input",{type:"number",value:Ne,onChange:ve=>M(xe,ve.target.value),className:`w-full px-3 py-2 text-sm rounded-md border ${U} focus:outline-none focus:ring-1 focus:ring-blue-500`})]},xe);if(Ce.fieldType==="IMAGE"){const ve=j.length>0,ke=J[xe]||(ve?j[0]:""),Ie=q[xe]??"",Pe=!!ke&&!ke.startsWith("canvas-node:");return s.jsxs("div",{className:"col-span-2",children:[s.jsx("label",{className:`block text-xs mb-1.5 ${G}`,children:Ce.description}),s.jsxs("div",{className:"flex gap-2 items-center flex-wrap",children:[ke&&s.jsx("div",{className:`w-16 h-16 rounded-md overflow-hidden border flex-shrink-0 ${t?"border-white/30 bg-transparent":"border-zinc-400/50 bg-zinc-800/50"}`,children:s.jsx("img",{src:ke,alt:"预览",className:"w-full h-full object-cover",onError:Te=>{Te.target.style.display="none"}})}),s.jsxs("div",{className:"flex flex-col gap-1",children:[s.jsxs("div",{className:"flex items-center gap-1.5",children:[s.jsxs("label",{className:`flex items-center gap-1.5 px-2 py-1.5 text-xs rounded-md border ${ue} cursor-pointer ${t?"hover:bg-white/5":"hover:bg-zinc-100"}`,onMouseDown:Te=>Te.stopPropagation(),children:[s.jsx(ou,{size:14}),"上传图片",s.jsx("input",{type:"file",accept:"image/*",className:"hidden",onChange:Te=>se(Ce,Te)})]}),Pe&&s.jsxs("button",{type:"button",onClick:()=>I(xe),onMouseDown:Te=>Te.stopPropagation(),className:`flex items-center gap-1.5 px-2 py-1.5 text-xs rounded-md border ${ue} ${t?"hover:bg-white/5":"hover:bg-zinc-100"}`,title:"在图片上绘制蒙版(ComfyUI 格式:白=修改区域)",children:[s.jsx(dq,{size:14}),"编辑蒙版"]})]}),s.jsx("span",{className:"text-xs text-zinc-500",children:ve?`已连接 ${j.length} 张图`:Ie.startsWith("api/")||Ie.startsWith("openapi/")?"已上传":"或连接图片节点"})]})]})]},xe)}if(Ce.fieldType==="AUDIO"){const ve=q[xe]??"",ke=J[xe],Ie=!!(ve&&(ve.startsWith("api/")||ve.startsWith("openapi/")||ve.includes("/")))||!!ke,Pe=k.length>0,Te=Pe?k[0]:"";return s.jsxs("div",{className:"col-span-2",children:[s.jsx("label",{className:`block text-xs mb-1.5 ${G}`,children:Ce.description}),s.jsxs("div",{className:"flex gap-2 items-center flex-wrap",children:[(Ie||Pe)&&s.jsx("div",{className:`w-10 h-10 rounded-md border flex-shrink-0 flex items-center justify-center ${t?"border-white/30 bg-transparent":"border-zinc-400/50 bg-zinc-800/50"}`,children:s.jsx($c,{size:20,className:t?"text-green-400":"text-green-600"})}),s.jsxs("button",{type:"button",className:`flex items-center gap-1.5 px-2 py-1.5 text-xs rounded-md border ${ue} cursor-pointer ${t?"hover:bg-white/5":"hover:bg-zinc-100"}`,onMouseDown:Be=>Be.stopPropagation(),onClick:Be=>{var He;Be.stopPropagation(),Be.preventDefault(),(He=O.current[xe])==null||He.click()},children:[s.jsx(ou,{size:14}),"上传音频 (mp3/wav/ogg)"]}),s.jsx("input",{ref:Be=>{O.current[xe]=Be},type:"file",accept:"audio/*,.mp3,.wav,.ogg,.flac",className:"hidden",onChange:Be=>se(Ce,Be)}),Ie&&s.jsx("span",{className:"text-xs text-green-500",children:"已上传"}),Pe&&!Ie&&s.jsx("span",{className:"text-xs text-green-500",children:"已连接音频"})]}),Ie&&ke&&s.jsx("div",{className:`mt-2 rounded-md border overflow-hidden ${t?"border-white/30":"border-zinc-300"}`,children:s.jsx(U0,{audioUrl:ke,isDark:t,title:"已上传的音频"})}),Pe&&Te&&!Ie&&s.jsx("div",{className:`mt-2 rounded-md border overflow-hidden ${t?"border-white/30":"border-zinc-300"}`,children:s.jsx(U0,{audioUrl:Te,isDark:t,title:"连接的音频"})})]},xe)}if(Ce.fieldType==="VIDEO"){const ve=q[xe]??"",ke=ve.startsWith("api/")||ve.startsWith("openapi/");return s.jsxs("div",{className:"col-span-2",children:[s.jsx("label",{className:`block text-xs mb-1.5 ${G}`,children:Ce.description}),s.jsxs("div",{className:"flex gap-2 items-center flex-wrap",children:[ke&&s.jsx("div",{className:`w-10 h-10 rounded-md border flex-shrink-0 flex items-center justify-center ${t?"border-white/30 bg-transparent":"border-zinc-400/50 bg-zinc-800/50"}`,children:s.jsx(aa,{size:20,className:t?"text-green-400":"text-green-600"})}),s.jsxs("button",{type:"button",className:`flex items-center gap-1.5 px-2 py-1.5 text-xs rounded-md border ${ue} cursor-pointer ${t?"hover:bg-white/5":"hover:bg-zinc-100"}`,onMouseDown:Ie=>Ie.stopPropagation(),onClick:Ie=>{var Pe;Ie.stopPropagation(),Ie.preventDefault(),(Pe=O.current[xe])==null||Pe.click()},children:[s.jsx(ou,{size:14}),"上传视频 (mp4/webm)"]}),s.jsx("input",{ref:Ie=>{O.current[xe]=Ie},type:"file",accept:"video/*,.mp4,.webm,.mov",className:"hidden",onChange:Ie=>se(Ce,Ie)}),ke&&s.jsx("span",{className:"text-xs text-green-500",children:"已上传"})]})]},xe)}return s.jsxs("div",{children:[s.jsx("label",{className:`block text-xs mb-1.5 ${G}`,children:Ce.description}),s.jsx("input",{type:"text",value:Ne,onChange:ve=>M(xe,ve.target.value),className:`w-full px-3 py-2 text-sm rounded-md border ${U} focus:outline-none focus:ring-1 focus:ring-blue-500`})]},xe)})}),T.length>0&&s.jsxs("div",{className:"flex gap-2",children:[s.jsx("button",{onClick:re,disabled:b,className:`flex-1 flex items-center justify-center gap-2 px-3 py-2 text-sm font-medium rounded-md transition-colors border ${b?t?"bg-transparent border-white/20 text-white/50 cursor-not-allowed":"bg-zinc-500/50 text-zinc-400 cursor-not-allowed":t?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-green-500 hover:bg-green-600 text-white"}`,children:b?s.jsxs(s.Fragment,{children:[s.jsx(zr,{size:16,className:"animate-spin"}),y==="queued"?"排队中...":"运行中..."]}):s.jsxs(s.Fragment,{children:[s.jsx(Ia,{size:16}),"运行"]})}),b&&s.jsxs("button",{onClick:ee,className:`flex items-center justify-center gap-2 px-3 py-2 text-sm font-medium rounded-md border ${t?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-red-500 hover:bg-red-600 text-white"}`,children:[s.jsx(Ih,{size:16}),"取消"]})]}),T.length===0&&V&&s.jsx("button",{onClick:re,disabled:b,className:`w-full flex items-center justify-center gap-2 px-3 py-2 text-sm font-medium rounded-md transition-colors border ${b?t?"bg-transparent border-white/20 text-white/50 cursor-not-allowed":"bg-zinc-500/50 text-zinc-400 cursor-not-allowed":t?"bg-transparent border-white/30 hover:bg-white/5 text-white":"bg-green-500 hover:bg-green-600 text-white"}`,children:b?s.jsxs(s.Fragment,{children:[s.jsx(zr,{size:16,className:"animate-spin"}),"运行(简易模式)"]}):s.jsxs(s.Fragment,{children:[s.jsx(Ia,{size:16}),"运行(简易模式)"]})}),Z.length>0&&s.jsxs("div",{className:"space-y-2",children:[s.jsxs("div",{className:`flex items-center justify-between gap-2 text-xs font-medium ${G}`,children:[s.jsxs("div",{className:"flex items-center gap-1.5",children:[((Ee=e.settings)==null?void 0:Ee.previewType)==="audio"?s.jsx($c,{size:14}):s.jsx(si,{size:14}),"生成结果"]}),B!=null&&s.jsxs("span",{className:`flex items-center gap-1 ${t?"text-green-400":"text-green-600"}`,children:[s.jsx(dd,{size:12}),B<1e3?`${B}ms`:`${(B/1e3).toFixed(1)}s`]})]}),s.jsx("div",{className:"flex flex-wrap gap-2",children:Z.slice(-6).reverse().map(Ce=>zp(Ce.fullUrl)?s.jsx("div",{className:`w-14 h-14 rounded overflow-hidden border flex items-center justify-center ${t?"border-white/30 bg-transparent":"border-zinc-300 bg-zinc-800/50"}`,children:s.jsx("audio",{src:Ce.fullUrl,controls:!0,className:"w-full h-full max-h-14 object-contain",preload:"metadata",onMouseDown:Ne=>Ne.stopPropagation(),onClick:Ne=>Ne.stopPropagation()})},Ce.id):s.jsx("a",{href:Ce.fullUrl,target:"_blank",rel:"noopener noreferrer",className:"block w-14 h-14 rounded overflow-hidden border border-zinc-300 hover:border-blue-500 transition-colors",children:s.jsx("img",{src:Ce.fullUrl,alt:"",className:"w-full h-full object-cover"})},Ce.id))})]}),E&&(()=>{const Ce=T.find(Ne=>`${Ne.nodeId}:${Ne.fieldName}`===E);let xe=J[E];if(!xe&&j.length>0){const ve=T.filter(ke=>ke.fieldType==="IMAGE").findIndex(ke=>`${ke.nodeId}:${ke.fieldName}`===E);xe=ve>=0?j[ve]??j[0]:j[0]}return!Ce||!xe?null:s.jsx(jp,{isOpen:!0,onClose:()=>I(null),title:"编辑蒙版(ComfyUI 格式)",theme:t?"dark":"light",children:s.jsx(p7,{imageUrl:xe,isDark:t,onClose:()=>I(null),onSave:async Ne=>{const ve=new File([Ne],"masked.png",{type:"image/png"});await Y(Ce,ve),I(null)}})})})()]})})},DE="jimeng_i2i_seed3_tilesr_cvtob",Ace=({node:e,nodes:t,connections:n,isDark:r,updateNode:i,setNodes:a,getConnectedInputImages:o,jimengSuperResUrl:l="",jimengSuperResApiKey:c="",generateId:u,setHistory:d,setConnections:h})=>{var A,O;const[p,f]=_.useState(!1),[b,g]=_.useState(null),[y,w]=_.useState(null),v=((A=e.settings)==null?void 0:A.resolution)||"4k",m=((O=e.settings)==null?void 0:O.scale)??50,C=o(e.id)[0]||null;_.useEffect(()=>{if(!C){w(null);return}if(!Ln.isContentRef(C)){w(C);return}let F=!1;return(async()=>{try{await Ln.init();const L=Ln.extractId(C),X=await Ln.get(L);!F&&X?w(X):F||w(null)}catch(L){console.error("[JimengSuperRes] content_ref 解析失败:",L),F||w(null)}})(),()=>{F=!0}},[C]);const E=(l||"").trim().replace(/\/+$/,""),I=c||"",R=_.useCallback(async()=>{var F;if(!E){g("请在「模型接口配置」- 工具 中填写即梦智能超清的 BASE URL");return}if(!C){g("请先连接一张图片(图片输入或预览节点)");return}g(null),f(!0);try{let L=C;if(C.startsWith("content_ref:")){await Ln.init();const M=Ln.extractId(C),Y=await Ln.get(M);if(!Y)throw new Error("无法解析图片引用");L=Y}const X=await nO(L,4.5*1024*1024,4096,M=>console.log(`[智能超清] ${M}`)),T=`${E}/jimeng/visual/super-resolution/submit`,q={req_key:DE,binary_data_base64:[X],resolution:v==="8k"?"8k":"4k",scale:Math.max(0,Math.min(100,m))},H=await fetch(T,{method:"POST",headers:{"Content-Type":"application/json",...I?{Authorization:`Bearer ${I}`}:{}},body:JSON.stringify(q)}),J=await H.json();if(J.code!==1e4||!((F=J.data)!=null&&F.task_id)){const M=J.message||H.statusText||"提交失败";g(M),f(!1);return}const Z=J.data.task_id,B=`${E}/jimeng/visual/super-resolution/result`,V={req_key:DE,task_id:Z,req_json:JSON.stringify({return_url:!0})},N=async M=>{var oe,re,ee;const se=await(await fetch(B,{method:"POST",headers:{"Content-Type":"application/json",...I?{Authorization:`Bearer ${I}`}:{}},body:JSON.stringify(V)})).json();if(se.code!==1e4)throw new Error(se.message||"查询失败");const ie=(((oe=se.data)==null?void 0:oe.status)||"").toLowerCase();if(ie==="done"){const pe=(re=se.data)==null?void 0:re.image_urls;if(pe&&pe.length>0)return pe[0];const we=(ee=se.data)==null?void 0:ee.binary_data_base64;if(we&&we.length>0)return`data:image/jpeg;base64,${we[0]}`;throw new Error("结果中无图片")}if(ie==="not_found"||ie==="expired")throw new Error(ie==="expired"?"任务已过期":"任务未找到");return await new Promise(pe=>setTimeout(pe,2e3)),N(M+1)},j=await N(0);i(e.id,{content:j});const W=n.filter(M=>M.from===e.id).map(M=>t.find(Y=>Y.id===M.to)).filter(M=>M!=null&&M.type==="preview").map(M=>M.id);if(W.length>0&&a(M=>M.map(Y=>W.includes(Y.id)?{...Y,content:j,previewType:"image"}:Y)),h){const M=u(),Y=Ms(M,"preview",e.x+(e.width??320)+80,e.y,void 0,void 0,t);Y.content=j,Y.previewType="image",a(se=>[...se,Y]),h(se=>[...se,{id:u(),from:e.id,to:M,fromPort:"output",toPort:"input"}])}if(d){const Y={id:u(),url:j,type:"image",prompt:`即梦智能超清 ${v}`,time:new Date().toLocaleTimeString(),status:"completed",progress:100,modelName:"即梦智能超清"};d(se=>[Y,...se.slice(0,99)])}}catch(L){const X=L instanceof Error?L.message:"生成失败";g(X)}finally{f(!1)}},[C,v,m,E,I,e.id,e.x,e.y,e.width,n,t,i,a,h,d,u]);return s.jsxs("div",{className:`w-full h-full flex flex-col rounded-xl p-3 overflow-hidden min-h-0 ${r?"bg-transparent":"bg-white border border-zinc-200"}`,children:[C?s.jsx("div",{className:`w-full h-24 rounded overflow-hidden mb-2 ${r?"border border-white/30":"border border-zinc-300 bg-zinc-800/50"}`,children:s.jsx("img",{src:y??(C.startsWith("content_ref:")?"":C),alt:"输入",className:"w-full h-full object-contain"})}):s.jsx("div",{className:`w-full h-24 rounded border border-dashed flex items-center justify-center mb-2 text-[10px] ${r?"text-white/60 border-white/30":"text-zinc-400 border-zinc-300"}`,children:"连接图片"}),e.content&&s.jsx("div",{className:`w-full h-32 rounded overflow-hidden mb-2 ${r?"border border-white/30":"border border-zinc-300 bg-zinc-800/50"}`,children:s.jsx("img",{src:e.content,alt:"结果",className:"w-full h-full object-contain"})}),s.jsxs("div",{className:"flex flex-wrap gap-2 mb-2",children:[s.jsxs("select",{value:v,onChange:F=>i(e.id,{settings:{...e.settings,resolution:F.target.value}}),className:`text-[10px] rounded border px-2 py-1 ${r?"bg-transparent border-white/30 text-white [&>option]:bg-zinc-900 [&>option]:text-white":"bg-white border-zinc-300 text-zinc-800"}`,children:[s.jsx("option",{value:"4k",children:"4K"}),s.jsx("option",{value:"8k",children:"8K"})]}),s.jsxs("label",{className:`flex items-center gap-1 text-[10px] ${r?"text-white":"text-zinc-600"}`,children:["细节",s.jsx("input",{type:"range",min:0,max:100,value:m,onChange:F=>i(e.id,{settings:{...e.settings,scale:Number(F.target.value)}}),className:`w-16 ${r?"h-0.5 bg-white/20 rounded-full appearance-none cursor-pointer [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:w-2 [&::-webkit-slider-thumb]:h-2 [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-white/60 [&::-webkit-slider-thumb]:cursor-pointer [&::-webkit-slider-thumb]:border-0 [&::-moz-range-track]:bg-white/20 [&::-moz-range-track]:rounded-full [&::-moz-range-thumb]:appearance-none [&::-moz-range-thumb]:w-2 [&::-moz-range-thumb]:h-2 [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:bg-white/60 [&::-moz-range-thumb]:border-0 [&::-moz-range-thumb]:cursor-pointer":"h-1.5"}`}),s.jsx("span",{className:`text-[10px] min-w-[24px] ${r?"text-white/80":"text-zinc-600"}`,children:m})]})]}),b&&s.jsxs("div",{className:`flex items-center gap-1 text-[10px] mb-2 ${r?"text-red-400":"text-red-600"}`,children:[s.jsx(nf,{size:12}),b]}),s.jsxs("button",{onClick:R,disabled:!C||p,className:`w-full py-1.5 rounded text-xs font-medium flex items-center justify-center gap-1.5 ${!C||p?r?"bg-transparent border border-white/20 text-white/50 cursor-not-allowed":"bg-zinc-200 text-zinc-400 cursor-not-allowed":r?"bg-transparent border border-white/30 hover:bg-white/5 text-white":"bg-amber-500 hover:bg-amber-400 text-white"}`,children:[p?s.jsx(zr,{size:12,className:"animate-spin"}):s.jsx(bc,{size:12}),p?"超清中…":"生成超清"]})]})};function VE(e){return Math.max(8,Math.ceil(e/8)*8)}const Mce=({node:e,nodes:t,connections:n,isDark:r,updateNode:i,getConnectedInputImages:a,setNodes:o,setConnections:l,generateId:c})=>{var F,L,X,T,q,H;const[u,d]=_.useState(!1),[h,p]=_.useState(null),f=n.find(J=>J.to===e.id&&(!J.inputType||J.inputType==="default")),b=f?t.find(J=>J.id===f.from):null,g=(b==null?void 0:b.type)==="input-image"?(F=b.settings)==null?void 0:F.cropSelection:void 0,y=((L=e.settings)==null?void 0:L.cropX)??(g==null?void 0:g.x)??0,w=((X=e.settings)==null?void 0:X.cropY)??(g==null?void 0:g.y)??0,v=((T=e.settings)==null?void 0:T.cropWidth)??(g==null?void 0:g.width)??256,m=((q=e.settings)==null?void 0:q.cropHeight)??(g==null?void 0:g.height)??256,z=((H=e.settings)==null?void 0:H.contextPixels)??32,E=a(e.id)[0]||null,I=VE(v),R=VE(m),A=_.useCallback(async()=>{if(!E){p("请先连接一张图片");return}p(null),d(!0);try{let J=E;if(E.startsWith("content_ref:")){await Ln.init();const pe=Ln.extractId(E),we=await Ln.get(pe);if(!we)throw new Error("无法解析图片引用");J=we}const Z=await As(J,{compressForApi:!1}),B=await createImageBitmap(Z),V=B.width,N=B.height,j=Math.round(Math.max(0,y-z)),k=Math.round(Math.max(0,w-z)),W=Math.round(Math.min(V,y+I+z)),M=Math.round(Math.min(N,w+R+z)),Y=Math.max(1,W-j),se=Math.max(1,M-k),ie=document.createElement("canvas");ie.width=Y,ie.height=se;const oe=ie.getContext("2d");if(!oe)throw new Error("无法创建 Canvas");oe.drawImage(B,j,k,Y,se,0,0,Y,se);const re=ie.toDataURL("image/png"),ee={sourceWidth:V,sourceHeight:N,x0:j,y0:k,outWidth:Y,outHeight:se};if(i(e.id,{content:re,settings:{...e.settings,_cropStitcher:ee,_originalNodeId:null}}),o&&l&&c){const pe=e.id,we=e.x,Q=e.y,me=e.width??320,U=n.filter(ge=>ge.from===pe).map(ge=>ge.to);if(!t.filter(ge=>U.includes(ge.id)).some(ge=>ge.type==="gen-image"||ge.type==="generate-character-image"||ge.type==="generate-scene-image")){let ge={};try{const fe=ex("Image");fe&&(ge=fe)}catch(fe){console.warn("Failed to load model defaults:",fe)}const ne=c(),le=c();setTimeout(()=>{o(fe=>{const be=Ms(ne,"gen-image",we+me+80,Q,void 0,ge,fe);return[...fe,be]}),l(fe=>[...fe,{id:le,from:pe,to:ne}])},0)}}}catch(J){p(J instanceof Error?J.message:"裁剪失败")}finally{d(!1)}},[E,y,w,I,R,z,e.id,e.settings,e.width,e.x,e.y,i,t,n,o,l,c]),O=_.useCallback((J,Z)=>{i(e.id,{settings:{...e.settings,[J]:Z}})},[e.id,e.settings,i]);return E?s.jsxs("div",{className:`w-full h-full flex flex-col rounded-xl p-3 overflow-hidden min-h-0 ${r?"bg-transparent":"bg-white border border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[s.jsx(ml,{size:18,className:"text-zinc-500 shrink-0"}),s.jsx("span",{className:"text-xs font-medium truncate",children:"裁剪局部重绘"})]}),g&&s.jsx("div",{className:`text-[10px] mb-2 ${r?"text-green-500/90":"text-green-600"}`,children:"已从图片输入节点框选"}),s.jsxs("div",{className:`text-[10px] space-y-1.5 mb-2 ${r?"text-zinc-400":"text-zinc-600"}`,children:[s.jsxs("div",{className:"grid grid-cols-4 gap-1",children:[s.jsx("label",{children:"X"}),s.jsx("input",{type:"number",min:0,value:y,onChange:J=>O("cropX",Math.max(0,parseInt(J.target.value,10)||0)),className:`col-span-3 w-full px-1.5 py-0.5 rounded text-[10px] [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none ${r?"bg-zinc-800 border-zinc-600 text-zinc-200":"bg-white border-zinc-300"} border`})]}),s.jsxs("div",{className:"grid grid-cols-4 gap-1",children:[s.jsx("label",{children:"Y"}),s.jsx("input",{type:"number",min:0,value:w,onChange:J=>O("cropY",Math.max(0,parseInt(J.target.value,10)||0)),className:`col-span-3 w-full px-1.5 py-0.5 rounded text-[10px] [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none ${r?"bg-zinc-800 border-zinc-600 text-zinc-200":"bg-white border-zinc-300"} border`})]}),s.jsxs("div",{className:"grid grid-cols-4 gap-1",children:[s.jsx("label",{children:"W"}),s.jsx("input",{type:"number",min:8,value:v,onChange:J=>O("cropWidth",Math.max(8,parseInt(J.target.value,10)||8)),className:`col-span-3 w-full px-1.5 py-0.5 rounded text-[10px] [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none ${r?"bg-zinc-800 border-zinc-600 text-zinc-200":"bg-white border-zinc-300"} border`}),s.jsxs("span",{className:"col-span-4 text-[9px] opacity-70",children:["→ ",I," (8倍数)"]})]}),s.jsxs("div",{className:"grid grid-cols-4 gap-1",children:[s.jsx("label",{children:"H"}),s.jsx("input",{type:"number",min:8,value:m,onChange:J=>O("cropHeight",Math.max(8,parseInt(J.target.value,10)||8)),className:`col-span-3 w-full px-1.5 py-0.5 rounded text-[10px] [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none ${r?"bg-zinc-800 border-zinc-600 text-zinc-200":"bg-white border-zinc-300"} border`}),s.jsxs("span",{className:"col-span-4 text-[9px] opacity-70",children:["→ ",R," (8倍数)"]})]}),s.jsxs("div",{className:"grid grid-cols-4 gap-1",children:[s.jsx("label",{children:"上下文"}),s.jsx("input",{type:"number",min:0,value:z,onChange:J=>O("contextPixels",Math.max(0,parseInt(J.target.value,10)||0)),className:`col-span-3 w-full px-1.5 py-0.5 rounded text-[10px] [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none ${r?"bg-zinc-800 border-zinc-600 text-zinc-200":"bg-white border-zinc-300"} border`}),s.jsx("span",{className:"col-span-4 text-[9px] opacity-70",children:"px 扩展"})]})]}),h&&s.jsxs("div",{className:"flex items-center gap-1.5 mb-2 text-red-500 text-[10px]",children:[s.jsx(nf,{size:12}),h]}),s.jsxs("button",{onClick:A,disabled:u,className:`w-full py-1.5 rounded text-xs font-medium flex items-center justify-center gap-1.5 ${r?"bg-zinc-700 hover:bg-zinc-600 text-zinc-100 disabled:opacity-50":"bg-zinc-200 hover:bg-zinc-300 text-zinc-800 disabled:opacity-50"}`,children:[u?s.jsx(zr,{size:14,className:"animate-spin"}):s.jsx(ml,{size:14}),"应用裁剪"]}),e.content&&s.jsx("div",{className:"mt-2 text-[10px] text-zinc-500 truncate",children:"裁剪局部重绘、图片输入-原图"})]}):s.jsxs("div",{className:`w-full h-full flex flex-col items-center justify-center rounded-xl p-4 min-h-0 ${r?"bg-zinc-900/50 border border-zinc-800":"bg-zinc-100 border border-zinc-300"}`,children:[s.jsx(ml,{size:28,className:"mb-2 text-zinc-500"}),s.jsx("span",{className:"text-xs text-zinc-500 text-center",children:"连接图片输入节点"}),s.jsx("span",{className:"text-[10px] text-zinc-500 text-center mt-1",children:"在图片上点击 ✂️ 框选裁剪区域"})]})};function HE(e){var t;if(e.type==="preview"){const n=e.previewMjImages,r=e._previewMjAssetIds,i=e.selectedPreviewImage;if(i&&(n!=null&&n.length)){const a=n.findIndex(l=>l===i),o=a>=0&&(r!=null&&r[a])?r[a]:e._contentAssetId;return{url:i,assetId:o??e._contentAssetId??null}}if(n!=null&&n.length){const a=n.length-1,o=n[a],l=(r==null?void 0:r[a])??e._contentAssetId;return{url:o,assetId:l??null}}return{url:e.content??null,assetId:e._contentAssetId??null}}if(e.type==="rh-app"||e.type==="rh-comfy"||e.type==="gen-image"){const n=(t=e.settings)==null?void 0:t.generatedImages;if(n!=null&&n.length){const r=n[0];return{url:r.fullUrl,assetId:r.assetId??null}}return{url:e.content??null,assetId:e._contentAssetId??null}}return e.type==="input-image"?{url:e.content??null,assetId:e._contentAssetId??null}:{url:e.content??null,assetId:e._contentAssetId??null}}async function GE(e,t){if(!e&&!t)return null;if(t)try{const{localCacheManager:n}=await mn(async()=>{const{localCacheManager:a}=await Promise.resolve().then(()=>Xa);return{localCacheManager:a}},void 0,import.meta.url);if(n.isAvailable()&&n.hasAsset(t)){const a=await n.readAsset(t);if(a!=null&&a.blob&&a.blob.size>0)return a.blob}const{assetStore:r}=await mn(async()=>{const{assetStore:a}=await Promise.resolve().then(()=>_s);return{assetStore:a}},void 0,import.meta.url),i=await r.getAssetBlob(t);if(i&&i.size>0)return i}catch(n){console.warn("[InpaintStitch] 从 assetId 读取失败,降级为 URL:",n)}if(e){if(e.startsWith("content_ref:")){await Ln.init();const n=Ln.extractId(e),r=await Ln.get(n);if(r)return await As(r,{compressForApi:!1})}return await As(e,{compressForApi:!1})}return null}const Tce=({node:e,nodes:t,connections:n,isDark:r,updateNode:i,getConnectedInputImages:a,setPreviewContextMenu:o})=>{var R,A;const[l,c]=_.useState(!1),[u,d]=_.useState(null),h=n.filter(O=>O.to===e.id&&(!O.inputType||O.inputType==="default")),p=h.find(O=>{const F=t.find(L=>L.id===O.from);return(F==null?void 0:F.type)==="inpaint-crop"}),f=h.find(O=>{const F=t.find(L=>L.id===O.from);return(F==null?void 0:F.type)==="gen-image"||(F==null?void 0:F.type)==="rh-app"||(F==null?void 0:F.type)==="rh-comfy"})??h.find(O=>{const F=t.find(L=>L.id===O.from);return(F==null?void 0:F.type)==="preview"}),b=p?t.find(O=>O.id===p.from):null,g=f?t.find(O=>O.id===f.from):null,y=(R=b==null?void 0:b.settings)==null?void 0:R._cropStitcher,w=h.find(O=>{const F=t.find(L=>L.id===O.from);return(F==null?void 0:F.type)==="input-image"||(F==null?void 0:F.type)==="preview"&&F!==g}),v=w?{from:w.from,to:e.id}:b?n.find(O=>O.to===b.id&&(!O.inputType||O.inputType==="default")):null,m=v?t.find(O=>O.id===v.from):null,z=m?HE(m):{url:null,assetId:null},C=g?HE(g):{url:null,assetId:null},E=_.useCallback(async()=>{if(!y){d("请连接 Inpaint Crop 节点");return}if(!z.url&&!z.assetId){d("请确保 Crop 节点已连接原图");return}if(!C.url&&!C.assetId){d("请连接重绘结果(gen-image / 预览 / RH 应用)");return}const O=!!z.url&&z.url===C.url,F=!!z.assetId&&z.assetId===C.assetId;if(O||F){d("重绘结果不能与原图相同,请连接生成图片/重绘结果节点");return}d(null),c(!0);try{const[L,X]=await Promise.all([GE(z.url,z.assetId),GE(C.url,C.assetId)]);if(!L||L.size===0)throw new Error("无法加载原图,请检查本地缓存或连接");if(!X||X.size===0)throw new Error("无法加载重绘图,请检查预览节点的图片是否已缓存");const[T,q]=await Promise.all([createImageBitmap(L),createImageBitmap(X)]);if(T.width===0||T.height===0)throw new Error("原图加载异常,尺寸为 0");if(q.width===0||q.height===0)throw new Error("重绘图加载异常,尺寸为 0");if(T.width===q.width&&T.height===q.height&&L.size===X.size)throw new Error("检测到原图与重绘结果可能为同一张图,请确认「重绘结果」连接的是生成图(如 1248×832 生成图片),而非原图或预览中的原图");const{sourceWidth:H,sourceHeight:J,x0:Z,y0:B,outWidth:V,outHeight:N}=y,j=Math.floor(Math.max(0,Math.round(Z))),k=Math.floor(Math.max(0,Math.round(B))),W=Math.max(1,Math.round(V)),M=Math.max(1,Math.round(N)),Y=Math.min(W,Math.max(0,H-j)),se=Math.min(M,Math.max(0,J-k));if((T.width!==H||T.height!==J)&&console.warn("[InpaintStitch] 原图尺寸与 Crop 时不一致:",`${T.width}x${T.height} vs ${H}x${J}`),Y<=0||se<=0)throw new Error("重绘区域尺寸异常或超出原图边界,请检查 Crop 节点");const ie=document.createElement("canvas");ie.width=H,ie.height=J;const oe=ie.getContext("2d");if(!oe)throw new Error("无法创建 Canvas");oe.drawImage(T,0,0),oe.imageSmoothingEnabled=!0,oe.imageSmoothingQuality="high";const re=Math.min(Y,se);let pe=Math.max(q.width/Y,q.height/se)>1.5?Math.min(80,Math.floor(re*.14)):Math.min(64,Math.floor(re*.1));if(pe=Math.min(pe+4,Math.floor(re/2)),pe>=6&&Y>pe*3&&se>pe*3){const U=document.createElement("canvas");U.width=Y,U.height=se;const G=U.getContext("2d");if(G){G.imageSmoothingEnabled=!0,G.imageSmoothingQuality="high",G.drawImage(q,0,0,q.width,q.height,0,0,Y,se);const te=document.createElement("canvas");te.width=Y,te.height=se;const ge=te.getContext("2d",{alpha:!0});if(ge){const ne=pe,le=pe,fe=Y-pe,be=se-pe,de=Math.max(1,fe-ne),$e=Math.max(1,be-le);ge.fillStyle="rgba(255,255,255,1)",ge.fillRect(ne,le,de,$e);const ze=(_e,Ee,Ce,xe,Ne)=>{const ve=ge.createLinearGradient(_e,Ee,Ce,xe);ve.addColorStop(0,"rgba(255,255,255,0)"),ve.addColorStop(.4,"rgba(255,255,255,0.25)"),ve.addColorStop(.7,"rgba(255,255,255,0.65)"),ve.addColorStop(1,"rgba(255,255,255,1)"),ge.fillStyle=ve,ge.fillRect(Ne.x,Ne.y,Ne.width,Ne.height)};ze(0,0,0,pe,{x:0,y:0,width:Y,height:pe}),ze(0,se,0,se-pe,{x:0,y:se-pe,width:Y,height:pe}),ze(0,0,pe,0,{x:0,y:0,width:pe,height:se}),ze(Y,0,Y-pe,0,{x:Y-pe,y:0,width:pe,height:se}),G.globalCompositeOperation="destination-in",G.drawImage(te,0,0),G.globalCompositeOperation="source-over",oe.drawImage(U,0,0,Y,se,j,k,Y,se)}else oe.drawImage(q,0,0,q.width,q.height,j,k,Y,se)}else oe.drawImage(q,0,0,q.width,q.height,j,k,Y,se)}else oe.drawImage(q,0,0,q.width,q.height,j,k,Y,se);const Q=ie.toDataURL("image/png");if(!Q||Q.length<100)throw new Error("拼回结果生成失败");const me=400;let ue=Q;if(H>me||J>me){const U=Math.min(me/H,me/J),G=Math.round(H*U),te=Math.round(J*U),ge=document.createElement("canvas");ge.width=G,ge.height=te;const ne=ge.getContext("2d");ne&&(ne.drawImage(ie,0,0,H,J,0,0,G,te),ue=ge.toDataURL("image/png"))}i(e.id,{content:Q,settings:{...e.settings||{},_stitchPreviewUrl:ue}})}catch(L){d(L instanceof Error?L.message:"拼回失败")}finally{c(!1)}},[y,z.url,z.assetId,C.url,C.assetId,e.id,e.settings,i]),I=!!y&&(!!z.url||!!z.assetId)&&(!!C.url||!!C.assetId);return s.jsxs("div",{className:`w-full h-full flex flex-col rounded-xl p-3 overflow-hidden min-h-0 ${r?"bg-transparent":"bg-white border border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[s.jsx(fj,{size:18,className:"text-zinc-500 shrink-0"}),s.jsx("span",{className:"text-xs font-medium truncate",children:"无缝拼回"})]}),s.jsxs("div",{className:`text-[10px] space-y-1 mb-3 ${r?"text-zinc-400":"text-zinc-600"}`,children:[s.jsx("div",{className:b?"text-green-600":"text-zinc-500",children:b?"✓ 裁剪局部重绘":"○ 连接裁剪局部重绘"}),s.jsx("div",{className:m?"text-green-600":"text-zinc-500",children:m?"✓ 图片输入-原图":"○ 连接图片输入-原图"}),s.jsx("div",{className:g?"text-green-600":"text-zinc-500",children:g?"✓ 重绘结果":"○ 连接重绘结果"})]}),u&&s.jsxs("div",{className:"flex items-center gap-1.5 mb-2 text-red-500 text-[10px]",children:[s.jsx(nf,{size:12}),u]}),s.jsxs("button",{onClick:E,disabled:l||!I,className:`w-full py-1.5 rounded text-xs font-medium flex items-center justify-center gap-1.5 ${r?"bg-zinc-700 hover:bg-zinc-600 text-zinc-100 disabled:opacity-50 disabled:cursor-not-allowed":"bg-zinc-200 hover:bg-zinc-300 text-zinc-800 disabled:opacity-50 disabled:cursor-not-allowed"}`,children:[l?s.jsx(zr,{size:14,className:"animate-spin"}):s.jsx(fj,{size:14}),"拼回原图"]}),e.content&&s.jsx("div",{className:"mt-2 flex-1 min-h-[160] rounded overflow-hidden flex items-center justify-center bg-zinc-100 dark:bg-zinc-800/50",onContextMenu:O=>{o&&(O.preventDefault(),O.stopPropagation(),o({visible:!0,x:O.clientX,y:O.clientY,item:{url:e.content,type:"image",sourceNode:e}}))},children:s.jsx("img",{src:((A=e.settings)==null?void 0:A._stitchPreviewUrl)||e.content,alt:"拼回结果",className:"w-full h-full object-contain"},typeof e.content=="string"?`stitch-${e.content.length}`:"stitch-empty")})]})},Rce=({node:e,nodes:t,connections:n,view:r,isDark:i,updateNode:a,generate:o,generateId:l,setNodes:c,setConnections:u,apiConfigs:d,apiStatus:h,globalApiKey:p,klingSubjectLibrary:f,setKlingSubjectsOpen:b})=>{var ue,U,G,te,ge,ne,le,fe,be,de;const g=_.useRef(null),[y,w]=_.useState(null),v=_.useRef(null),m=_.useRef(null),z=((ue=e.settings)==null?void 0:ue.model)||"kling-video-v2-6",C=d.find($e=>$e.id===z),E=(C==null?void 0:C.url)||"https://ai.comfly.chat",I=(C==null?void 0:C.key)||p,R=d.filter($e=>$e.id==="kling-video-v2-6"||$e.id==="kling-v3"),A=((U=e.settings)==null?void 0:U.klingImages)||[],O=((G=e.settings)==null?void 0:G.klingVideoUrl)||"",F=((te=e.settings)==null?void 0:te.klingVideoKeepSound)||"yes",L=((ge=e.settings)==null?void 0:ge.klingMotionControlMode)||"std",X=((ne=e.settings)==null?void 0:ne.klingMotionControlCharacterOrientation)||"image",T=((le=e.settings)==null?void 0:le.klingMotionControlWatermarkEnabled)??!0;(fe=e.settings)!=null&&fe.klingSubjects;const[q,H]=_.useState(!1),[J,Z]=_.useState(!1),B=_.useMemo(()=>new Map(t.map($e=>[$e.id,$e])),[t]),V=n.filter($e=>$e.to===e.id),N=$e=>{if(!$e)return!1;const ze=$e.toLowerCase();return!!(ze.startsWith("data:video")||/\\.(mp4|webm|mov|m4v|ogg)(\\?|$)/i.test(ze)||ze.includes("force_video_display=true"))},j=()=>{for(const $e of V){const ze=B.get($e.from),_e=ze==null?void 0:ze.content;if(!(typeof _e!="string"||!_e)&&((ze==null?void 0:ze.type)==="input-image"||(ze==null?void 0:ze.type)==="preview"&&ze.previewType==="image"))return _e}},k=()=>{for(const $e of V){const ze=B.get($e.from),_e=ze==null?void 0:ze.content;if(!(typeof _e!="string"||!_e)){if((ze==null?void 0:ze.type)==="video-input"||(ze==null?void 0:ze.type)==="preview"&&ze.previewType==="video")return _e;if((ze==null?void 0:ze.type)!=="input-image"&&!((ze==null?void 0:ze.type)==="preview"&&ze.previewType==="image")&&N(_e))return _e}}},W=j(),M=k(),Y=W||((be=A[0])==null?void 0:be.url),se=O||M,ie=!!Y,oe=!!se,re=$e=>{a(e.id,{settings:{...e.settings||{},model:$e}})},ee=()=>{var ze;const $e=(ze=g.current)==null?void 0:ze.getBoundingClientRect();return $e?{top:$e.top,left:$e.right+12}:null},pe=$e=>{const ze=ee();ze&&w(ze),H(!0)},we=$e=>y?Ni.createPortal(s.jsx("div",{ref:m,style:{position:"fixed",top:y.top,left:y.left,zIndex:1002,transformOrigin:"top left",transform:`scale(${r.zoom})`,width:480},children:$e}),document.body):null,Q=J||q,me=_.useCallback(()=>{const ze=n.filter(Ne=>Ne.from===e.id).map(Ne=>{const ve=t.find(ke=>ke.id===Ne.to);return(ve==null?void 0:ve.type)==="preview"?ve.id:null}).filter(Ne=>Ne!==null);if(ze.length>0)return ze[ze.length-1];const _e=l(),Ee=e.nodeName||"动作迁移",Ce=Ms(_e,"preview",e.x+e.width+80,e.y,Ee,void 0,t);Ce.width=400,Ce.height=400,c(Ne=>[...Ne,Ce]);const xe={id:l(),from:e.id,to:_e};return u(Ne=>[...Ne,xe]),a(e.id,{settings:{...e.settings||{},selectedPreviewId:_e}}),_e},[e,t,n,l,c,u,a]);return _.useEffect(()=>{if(!Q){v.current=null,w(null);return}let $e=0,ze=!1;const _e=()=>{const Ee=ee();if(Ee)if(!ze)v.current=Ee,w(Ee),ze=!0;else{const Ce=v.current;if(!Ce||Math.abs(Ce.top-Ee.top)>.15||Math.abs(Ce.left-Ee.left)>.15){v.current=Ee;const xe=m.current;xe&&(xe.style.top=`${Ee.top}px`,xe.style.left=`${Ee.left}px`)}}$e=requestAnimationFrame(_e)};return $e=requestAnimationFrame(_e),()=>cancelAnimationFrame($e)},[Q,r.zoom]),s.jsxs("div",{ref:g,className:"w-full h-full flex flex-col gap-3 p-3 relative",children:[s.jsxs("div",{children:[s.jsx("div",{className:`text-[10px] mb-1 ${i?"text-zinc-400":"text-zinc-500"}`,children:"Kling 模型"}),s.jsx("div",{className:"flex gap-2",children:R.map($e=>{const ze=$e.id===z;return s.jsx("button",{onClick:()=>re($e.id),className:`flex-1 text-center text-[11px] py-1.5 rounded border transition-colors ${i?ze?"bg-blue-500/20 border-blue-500 text-blue-200":"bg-zinc-900/30 border-zinc-700 text-zinc-200 hover:bg-zinc-900/50":ze?"bg-blue-100 border-blue-400 text-blue-700":"bg-white border-zinc-200 text-zinc-700 hover:bg-zinc-50"}`,children:$e.provider},$e.id)})})]}),s.jsxs("div",{children:[s.jsx("div",{className:`text-[10px] mb-1 ${i?"text-zinc-400":"text-zinc-500"}`,children:"模式"}),s.jsx("div",{className:"flex gap-2",children:["std","pro"].map($e=>{const ze=L===$e;return s.jsx("button",{onClick:()=>a(e.id,{settings:{...e.settings||{},klingMotionControlMode:$e}}),className:`flex-1 text-center text-[11px] py-1.5 rounded border transition-colors ${i?ze?"bg-blue-500/20 border-blue-500 text-blue-200":"bg-zinc-900/20 border-zinc-700 text-zinc-200":ze?"bg-blue-100 border-blue-400 text-blue-700":"bg-white border-zinc-200 text-zinc-700"}`,children:$e.toUpperCase()},$e)})})]}),s.jsxs("div",{className:"flex flex-col gap-1",children:[s.jsx("div",{className:`text-[10px] ${i?"text-zinc-400":"text-zinc-500"}`,children:"动作迁移提示词"}),s.jsx("textarea",{value:e.prompt||"",onChange:$e=>a(e.id,{prompt:$e.target.value}),placeholder:"描述你希望角色/场景如何发生动作迁移...",className:`w-full text-[11px] p-2 rounded border outline-none resize-none h-28 ${i?"bg-zinc-900/40 border-zinc-700 text-zinc-100":"bg-white border-zinc-200 text-zinc-800"}`})]}),s.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[s.jsxs("div",{className:`rounded-lg border p-2 ${i?"border-zinc-700 bg-zinc-900/20":"border-zinc-200 bg-white"}`,children:[s.jsxs("div",{className:`flex items-center gap-1 ${i?"text-zinc-200":"text-zinc-800"}`,children:[s.jsx(si,{size:14}),s.jsx("span",{className:"text-[11px] font-medium",children:"参考图(图片输入端)"})]}),s.jsx("div",{className:`text-[10px] mt-1 ${i?"text-zinc-400":"text-zinc-500"}`,children:ie?"已连接(1张)":"未连接图片输入端"}),ie&&s.jsx("div",{className:"mt-2",children:s.jsx("img",{src:Y,alt:"reference",className:"w-full h-24 object-cover rounded"})})]}),s.jsxs("div",{className:`rounded-lg border p-2 ${i?"border-zinc-700 bg-zinc-900/20":"border-zinc-200 bg-white"}`,children:[s.jsxs("div",{className:`flex items-center gap-1 ${i?"text-zinc-200":"text-zinc-800"}`,children:[s.jsx(aa,{size:14}),s.jsx("span",{className:"text-[11px] font-medium",children:"参考视频"})]}),s.jsx("div",{className:`text-[10px] mt-1 ${i?"text-zinc-400":"text-zinc-500"}`,children:oe?"已上传":"未上传"}),s.jsx("button",{onClick:$e=>{$e.preventDefault(),$e.stopPropagation(),pe()},className:`mt-2 w-full px-2 py-1.5 rounded text-[11px] border transition-colors ${q?i?"bg-blue-500/20 border-blue-500 text-blue-200":"bg-blue-100 border-blue-400 text-blue-700":i?"bg-zinc-900/30 border-zinc-700 hover:bg-zinc-900/50 text-zinc-200":"bg-white border-zinc-200 hover:bg-zinc-50 text-zinc-800"}`,children:"上传参考视频"}),oe&&s.jsx("div",{className:"mt-2",children:s.jsx("video",{src:se,controls:!0,className:"w-full h-24 rounded object-cover"})})]})]}),s.jsxs("div",{className:"grid grid-cols-3 gap-2",children:[s.jsxs("div",{className:`rounded-lg border p-2 ${i?"border-zinc-700 bg-zinc-900/20":"border-zinc-200 bg-white"}`,children:[s.jsx("div",{className:`text-[10px] ${i?"text-zinc-400":"text-zinc-500"}`,children:"保留原声"}),s.jsx("div",{className:"flex gap-2 mt-2",children:["yes","no"].map($e=>{const ze=F===$e;return s.jsx("button",{onClick:()=>a(e.id,{settings:{...e.settings||{},klingVideoKeepSound:$e}}),className:`flex-1 text-[11px] py-1.5 rounded border ${i?ze?"bg-blue-500/20 border-blue-500 text-blue-200":"bg-zinc-900/20 border-zinc-700 text-zinc-200":ze?"bg-blue-100 border-blue-400 text-blue-700":"bg-white border-zinc-200 text-zinc-800"}`,children:$e==="yes"?"开":"关"},$e)})})]}),s.jsxs("div",{className:`rounded-lg border p-2 ${i?"border-zinc-700 bg-zinc-900/20":"border-zinc-200 bg-white"}`,children:[s.jsx("div",{className:`text-[10px] ${i?"text-zinc-400":"text-zinc-500"}`,children:"朝向来源"}),s.jsx("div",{className:"flex gap-2 mt-2",children:["image","video"].map($e=>{const ze=X===$e;return s.jsx("button",{onClick:()=>a(e.id,{settings:{...e.settings||{},klingMotionControlCharacterOrientation:$e}}),className:`flex-1 text-[11px] py-1.5 rounded border ${i?ze?"bg-blue-500/20 border-blue-500 text-blue-200":"bg-zinc-900/20 border-zinc-700 text-zinc-200":ze?"bg-blue-100 border-blue-400 text-blue-700":"bg-white border-zinc-200 text-zinc-800"}`,children:$e==="image"?"图":"视频"},$e)})})]}),s.jsxs("div",{className:`rounded-lg border p-2 ${i?"border-zinc-700 bg-zinc-900/20":"border-zinc-200 bg-white"}`,children:[s.jsx("div",{className:`text-[10px] ${i?"text-zinc-400":"text-zinc-500"}`,children:"水印"}),s.jsx("button",{onClick:()=>a(e.id,{settings:{...e.settings||{},klingMotionControlWatermarkEnabled:!T}}),className:`mt-2 w-full text-[11px] py-1.5 rounded border transition-colors ${i?T?"bg-blue-500/20 border-blue-500 text-blue-200":"bg-zinc-900/20 border-zinc-700 text-zinc-200":T?"bg-blue-100 border-blue-400 text-blue-700":"bg-white border-zinc-200 text-zinc-800"}`,children:T?"启用":"关闭"})]})]}),s.jsxs("div",{className:"mt-auto pt-1",children:[s.jsx("button",{onMouseDown:$e=>$e.stopPropagation(),onClick:$e=>{$e.stopPropagation();const ze=me(),_e={...e.settings||{},_autoCreatedPreviewId:ze||void 0};a(e.id,{settings:_e}),ze&&requestAnimationFrame(()=>{window.dispatchEvent(new CustomEvent("previewGenerationStarted",{detail:{targetPreviewId:ze}}))}),o({...e,settings:_e})},disabled:e.isGenerating||!ie||!oe,className:`w-full py-2 rounded-lg text-sm font-medium transition-colors flex items-center justify-center gap-2 ${e.isGenerating||!ie||!oe?i?"bg-zinc-800 text-zinc-500 cursor-not-allowed":"bg-zinc-100 text-zinc-400 cursor-not-allowed":i?"bg-blue-600 hover:bg-blue-500 text-white":"bg-black hover:bg-zinc-900 text-white"}`,children:e.isGenerating?"生成中...":"开始动作迁移"}),e.errorMsg&&s.jsx("div",{className:`mt-2 text-[10px] ${i?"text-red-300":"text-red-700"}`,children:e.errorMsg})]}),q&&we(s.jsx(j4,{isOpen:q,isDark:i,maxDuration:10,currentVideoFile:((de=e.settings)==null?void 0:de.klingVideoFile)||null,apiKey:I,baseUrl:E,attachMode:"inline",onClose:()=>H(!1),onConfirm:($e,ze,_e,Ee,Ce,xe)=>{a(e.id,{settings:{...e.settings||{},klingVideoFile:$e,klingVideoUrl:Ee||"",klingVideoKeepSound:xe||"yes"}}),H(!1)}}))]})},Pce=["Pop","Rock","Electronic","Cinematic","Jazz","Classical","Hip-Hop","Country","R&B","Folk"],Oce=({node:e,isDark:t,updateNode:n,setHistory:r,apiConfigs:i,globalApiKey:a,generateId:o,generate:l,connections:c=[],nodes:u=[]})=>{var jt,Nt,Yt,un,Tn,Ht,fn,Dn,it,Lt,gt,Jt,Wt,Pt,Bt,zt,Gt,qt,De,st;const d=_.useRef(null),h=_.useRef(null),p=_.useRef({prompt:null,lyrics:null}),f=_.useRef({prompt:!1,lyrics:!1}),[b,g]=_.useState(((jt=e.settings)==null?void 0:jt.mode)||"inspiration"),[y,w]=_.useState(e.prompt||""),[v,m]=_.useState(((Nt=e.settings)==null?void 0:Nt.lyrics)||""),[z,C]=_.useState(((Yt=e.settings)==null?void 0:Yt.tags)||""),[E,I]=_.useState(((un=e.settings)==null?void 0:un.title)||""),[R,A]=_.useState(((Tn=e.settings)==null?void 0:Tn.model)||"suno-v4"),[O,F]=_.useState(!1),[L,X]=_.useState(null),[T,q]=_.useState(((Ht=e.settings)==null?void 0:Ht.isInstrumental)||!1),[H,J]=_.useState(((fn=e.settings)==null?void 0:fn.extendTime)||0),[Z,B]=_.useState(!1),[V,N]=_.useState(!1),[j,k]=_.useState(!1),[W,M]=_.useState(!1),[Y,se]=_.useState(!1),[ie,oe]=_.useState(!1),[re,ee]=_.useState(!1),[pe,we]=_.useState(!1),[Q,me]=_.useState(0),[ue,U]=_.useState(""),G=_.useRef(null),te=_.useRef(null),[ge,ne]=_.useState(!1),[le,fe]=_.useState(""),[be,de]=_.useState(0),[$e,ze]=_.useState(!1),_e=((Dn=i.find(Ae=>Ae.type==="Chat"))==null?void 0:Dn.id)||"gpt-4o",Ee=((it=e.settings)==null?void 0:it.lyricsChatModel)||_e,Ce=Ae=>/\.(mp3|wav|ogg|m4a|aac|flac)(\?|$)/i.test((Ae||"").split("?")[0])||(Ae||"").startsWith("data:audio"),xe=Ae=>Ce(Ae)||(Ae||"").startsWith("blob:")&&(Ae||"").length>10,Ne=(()=>{var nt,_t,xt;if(!(c!=null&&c.length)||!(u!=null&&u.length))return"";const Ae=c.filter(Tt=>Tt.to===e.id&&(!Tt.inputType||Tt.inputType==="default"));for(const Tt of Ae){const St=u.find(Ue=>Ue.id===Tt.from);if(!St)continue;let Qe="";if(St.type==="gen-music")Qe=((nt=St.settings)==null?void 0:nt.audioUrl)||"";else if(St.type==="rh-comfy"||St.type==="rh-app"){const Ue=St.content||"";Ue&&Ce(Ue)&&(Qe=Ue)}else if(St.type==="preview"){const Ue=St.previewType||((_t=St.settings)==null?void 0:_t.previewType),Ge=St.content||"";(Ue==="audio"&&Ge||Ge&&xe(Ge))&&(Qe=Ge)}else if(St.type==="input-image"){const Ue=St.content||"",Ge=((xt=St.settings)==null?void 0:xt.mediaType)==="audio"||St.previewType==="audio";Ue&&(Ce(Ue)||Ge&&(Ue||"").startsWith("blob:"))&&(Qe=Ue)}if(!Qe&&St.content&&typeof St.content=="string"){const Ue=St.content;xe(Ue)&&(Qe=Ue)}if(Qe)return Qe}return""})();_.useEffect(()=>{if(f.current.prompt){f.current.prompt=!1;return}const Ae=e.prompt||"";d.current&&d.current.value!==Ae&&(d.current.value=Ae,w(Ae))},[e.prompt]),_.useEffect(()=>{var nt;if(f.current.lyrics){f.current.lyrics=!1;return}const Ae=((nt=e.settings)==null?void 0:nt.lyrics)||"";h.current&&h.current.value!==Ae&&(h.current.value=Ae,m(Ae))},[(Lt=e.settings)==null?void 0:Lt.lyrics]),_.useEffect(()=>()=>{var _t;Object.values(p.current).forEach(xt=>{xt&&clearTimeout(xt)});const Ae={};let nt=!1;if(d.current){const xt=d.current.value,Tt=e.prompt||"";xt!==Tt&&(Ae.prompt=xt,nt=!0)}if(h.current){const xt=h.current.value,Tt=((_t=e.settings)==null?void 0:_t.lyrics)||"";xt!==Tt&&(Ae.settings||(Ae.settings={...e.settings||{}}),Ae.settings.lyrics=xt,nt=!0)}nt&&(Ae.settings?n(e.id,{prompt:Ae.prompt,settings:Ae.settings}):n(e.id,{prompt:Ae.prompt}))},[e.id,e.prompt,e.settings,n]);const ve=e.isGenerating||!1,ke=((gt=e.settings)==null?void 0:gt.audioUrl)||"",Ie=((Jt=e.settings)==null?void 0:Jt.clipId)||"",Pe=((Wt=e.settings)==null?void 0:Wt.generatedLyrics)||"",Te=((Pt=e.settings)==null?void 0:Pt.musicTitle)||"",Be=typeof((Bt=e.settings)==null?void 0:Bt.duration)=="number"?e.settings.duration:void 0,He=((zt=e.settings)==null?void 0:zt.uploadedAudioUrl)||"",Je=((Gt=e.settings)==null?void 0:Gt.uploadedFileName)||"",Me=Ne||He||ue,Re=!!ke,Ve=_.useCallback(()=>{var Ae,nt,_t,xt;n(e.id,{prompt:b==="inspiration"?y:"",settings:{...e.settings,mode:b,lyrics:b==="custom"?v:"",tags:z,title:E,model:R,isInstrumental:T,extendTime:H,clipId:(Ae=e.settings)==null?void 0:Ae.clipId,audioUrl:(nt=e.settings)==null?void 0:nt.audioUrl,generatedLyrics:(_t=e.settings)==null?void 0:_t.generatedLyrics,musicTitle:(xt=e.settings)==null?void 0:xt.musicTitle}})},[e.id,e.settings,b,y,v,z,E,R,T,H,n]),Ze=_.useCallback(()=>{ne(!0),fe(""),de(0)},[]),je=_.useCallback(async()=>{var Ae,nt,_t;if(!le.trim()){alert("请输入音乐风格或歌曲名称");return}N(!0),de(10);try{const xt=i.filter(ot=>ot.type==="Chat"),Tt=xt.find(ot=>ot.id===Ee)||xt[0],St=(Tt==null?void 0:Tt.key)||a,Qe=((Tt==null?void 0:Tt.url)||"https://ai.comfly.chat").replace(/\/+$/,"");if(!St){N(!1),de(0),alert("请先配置 Chat API Key");return}Na.updateConfig(Qe,St,i),de(20);const Ue=`[Intro] + +[Verse 1] +那年初夏的午后, +你微笑着走进我心头。 +蝉鸣伴随着心跳, +悄悄诉说着爱的节奏。 + +[Pre-Chorus] +时间静止在那一刻, +仿佛全世界只剩我们。 + +[Chorus] +你是我心中的光, +照亮前行的方向。 +无论风雨多么猖狂, +有你在身旁,便是天堂。 + +[Verse 2] +回忆如同泛黄的信笺, +记录着我们的每一天。 +你的笑容是最美的诗篇, +温暖我孤单的岁月。 + +[Pre-Chorus] +即使时光流转不停, +我依然守护着那份情。 + +[Chorus] +你是我心中的光, +照亮前行的方向。 +无论风雨多么猖狂, +有你在身旁,便是天堂。 + +[Bridge] +如果有一天你迷失方向, +请记得我在原地守望。 +无论距离有多么漫长, +我的心始终为你开放。 + +[Chorus] +你是我心中的光, +照亮前行的方向。 +无论风雨多么猖狂, +有你在身旁,便是天堂。 + +[Outro]`,Ge=`你是一位专业的歌词创作助手。请根据用户提供的音乐风格或歌曲名称,参考以下歌词模板格式,创作一首完整的歌词。 + +歌词模板格式说明: +- [Intro] - 引子/前奏 +- [Verse 1/2] - 主歌部分,讲述故事 +- [Pre-Chorus] - 导歌/预副歌,情绪逐渐上升 +- [Chorus] - 副歌,最抓人的部分,通常重复多次 +- [Bridge] - 桥段/连接段,改变调性或情绪 +- [Outro] - 尾奏/结尾 + +请严格按照模板格式输出,保持结构完整,歌词内容要符合用户描述的风格和主题。`,at=`请根据以下描述创作歌词:${le} + +参考模板格式,创作一首完整的歌词。`;de(40);const rt=await Na.chatCompletion({model:(Tt==null?void 0:Tt.modelName)||Ee,messages:[{role:"system",content:Ge},{role:"user",content:at}],max_tokens:2e3});if(de(80),!rt.success||!rt.data)throw new Error(rt.error||"生成歌词失败");const lt=((_t=(nt=(Ae=rt.data.choices)==null?void 0:Ae[0])==null?void 0:nt.message)==null?void 0:_t.content)||"";if(!lt)throw new Error("未获取到生成的歌词内容");de(100),m(lt),Ve(),setTimeout(()=>{ne(!1),N(!1),de(0),fe("")},500)}catch(xt){console.error("[Generate Lyrics with Chat] Error:",xt),N(!1),de(0),alert(xt.message||"生成歌词失败")}},[le,Ee,i,a,Ve]),Le=_.useCallback(Ae=>{const nt=z.split(",").map(_t=>_t.trim()).filter(Boolean);if(!nt.includes(Ae)){const _t=nt.length>0?`${z}, ${Ae}`:Ae;C(_t),Ve()}},[z,Ve]),Xe=_.useCallback(()=>{if(b==="inspiration"&&!y.trim()){alert("请输入音乐描述");return}if((b==="custom"||b==="extend")&&!v.trim()){alert("请输入歌词");return}if(!l){console.error("[GenMusic] generate function is not available"),alert("生成功能未初始化,请刷新页面重试");return}Ve(),b==="extend"&&Ie&&n(e.id,{settings:{...e.settings,continueClipId:Ie,continueAt:0}});try{l(e)}catch(Ae){console.error("[GenMusic] Generate error:",Ae),alert(Ae.message||"生成失败,请检查控制台")}},[b,y,v,z,E,R,Ie,e,l,Ve,n]),qe=_.useCallback(async()=>{if(!ke||!Ie){alert("请先生成音乐");return}B(!0)},[ke,Ie]),tt=_.useCallback(async()=>{var Ae;if(!Ie||H<0){alert("请输入有效的续写时间(秒)");return}k(!0),B(!1);try{const nt=i.find(Qe=>Qe.id===R||Qe.id.includes("suno")),_t=(nt==null?void 0:nt.key)||a,xt=((nt==null?void 0:nt.url)||"https://ai.comfly.chat").replace(/\/+$/,"");if(!_t){alert("请先配置 API Key"),k(!1);return}Na.updateConfig(xt,_t,i);const Tt=R.includes("v3.5")?"chirp-v3-5":"chirp-v4",St=await Na.extendMusic({prompt:v||y||E||"继续创作",mv:Tt,title:E||"续写音乐",tags:z||"",continue_at:H,continue_clip_id:Ie,task:"extend",make_instrumental:T,model:R});if(!St.success||!((Ae=St.data)!=null&&Ae.task_id))throw new Error(St.error||"续写失败");if(n(e.id,{isGenerating:!0,errorMsg:void 0,settings:{...e.settings,mode:"extend",continueClipId:Ie,continueAt:H,remoteTaskId:St.data.task_id}}),l){const Qe={...e,isGenerating:!0,settings:{...e.settings,mode:"extend",continueClipId:Ie,continueAt:H,remoteTaskId:St.data.task_id}};l(Qe)}}catch(nt){console.error("[Extend Music] Error:",nt),alert(nt.message||"续写失败")}finally{k(!1)}},[Ie,H,v,y,E,z,T,R,i,a,e,l,n]),Ye=_.useCallback(async()=>{if(!ke||!Ie){alert("请先生成音乐");return}M(!0);try{await new Promise(Ae=>setTimeout(Ae,2e3)),alert("MV 生成功能开发中")}catch(Ae){console.error("[Generate MV] Error:",Ae)}finally{M(!1)}},[ke,Ie]);_.useCallback(async()=>{if(!ke||!Ie){alert("请先生成音乐");return}se(!0);try{await new Promise(Ae=>setTimeout(Ae,2e3)),alert("MIDI 下载功能开发中")}catch(Ae){console.error("[Get MIDI] Error:",Ae)}finally{se(!1)}},[ke,Ie]);const ct=_.useCallback(async()=>{if(!Ie){alert("请先生成音乐");return}ee(!0);try{const Ae=i.find(Ge=>Ge.id===R||Ge.id.includes("suno")),nt=(Ae==null?void 0:Ae.key)||a,_t=((Ae==null?void 0:Ae.url)||"https://ai.comfly.chat").replace(/\/+$/,"");if(!nt){alert("请先配置 API Key"),ee(!1);return}Na.updateConfig(_t,nt,i);const xt=await Na.getMusicTiming(Ie,R);if(!xt.success||!xt.data)throw new Error(xt.error||"获取节奏分析失败");n(e.id,{settings:{...e.settings,timingData:xt.data}});const Tt=JSON.stringify(xt.data,null,2),St=new Blob([Tt],{type:"application/json"}),Qe=URL.createObjectURL(St),Ue=document.createElement("a");Ue.href=Qe,Ue.download=`timing_${Ie}.json`,Ue.click(),URL.revokeObjectURL(Qe),alert("节奏分析数据已保存并导出为 JSON 文件")}catch(Ae){console.error("[Get Timing] Error:",Ae),alert(Ae.message||"获取节奏分析失败")}finally{ee(!1)}},[Ie,R,i,a,e,n]),pt=_.useCallback(async Ae=>{const nt=i.find(Ot=>Ot.id===R||Ot.id.includes("suno")),_t=(nt==null?void 0:nt.key)||a,xt=((nt==null?void 0:nt.url)||"https://ai.comfly.chat").replace(/\/+$/,"");if(!_t){alert("请先配置 API Key");return}Na.updateConfig(xt,_t,i);const Tt=Ae.name.split(".").pop()||"mp3",St=await Na.getAudioUploadSignature(Tt,R);if(!St.success||!St.data)throw new Error(St.error||"获取上传签名失败");const{id:Qe,url:Ue,fields:Ge}=St.data,at=URL.createObjectURL(Ae);if(U(at),me(0),!await Na.uploadAudioToS3(Ue,Ge,Ae,Ot=>{me(Ot)}))throw new Error("上传文件到 S3 失败");me(100);const lt=await Na.reportUploadFinish(Qe,Ae.name,R);if(!lt.success)throw new Error(lt.error||"报告上传完毕失败");let ot="processing",At=0;const kt=30;for(;ot!=="complete"&&AtsetTimeout(dn,3e3));const Ot=await Na.getUploadStatus(Qe,R);if(Ot.success&&Ot.data&&(ot=Ot.data.status,ot==="complete")){const dn=await Na.initializeAudioClip(Qe,R);if(!dn.success||!dn.data)throw new Error(dn.error||"初始化音频文件失败");const Vt=dn.data.clip_id;n(e.id,{settings:{...e.settings,continueClipId:Vt,uploadedAudioId:Qe,uploadedAudioUrl:at,uploadedFileName:Ae.name,mode:"extend"}}),U(at),B(!0),alert('上传成功!音频已显示在节点上,请设置续写参数后点击"续写音乐"按钮');return}At++}if(ot!=="complete")throw new Error("上传处理超时")},[R,i,a,e,n]),ht=_.useCallback(async()=>{var Ae;(Ae=G.current)==null||Ae.click()},[]),wt=_.useCallback(async Ae=>{var _t;const nt=(_t=Ae.target.files)==null?void 0:_t[0];if(nt){if(!nt.type.startsWith("audio/")&&!nt.name.match(/\.(mp3|wav|ogg|m4a|aac|flac)$/i)){alert("请选择音频文件(mp3, wav, ogg, m4a, aac, flac)");return}we(!0);try{await pt(nt)}catch(xt){console.error("[Upload Audio] Error:",xt),alert(xt.message||"音频上传失败"),U("")}finally{we(!1),me(0),G.current&&(G.current.value="")}}},[pt]);_.useEffect(()=>{if(!Ne){te.current=null;return}te.current!==Ne&&(te.current=Ne,we(!0),(async()=>{try{const Ae=await fetch(Ne);if(!Ae.ok)throw new Error("获取连线音频失败");const nt=await Ae.blob(),xt=((Ne.split("?")[0]||"").split(".").pop()||"mp3").toLowerCase(),Tt=/^(mp3|wav|ogg|m4a|aac|flac)$/i.test(xt)?xt:"mp3",St=new File([nt],`reference.${Tt}`,{type:nt.type||"audio/mpeg"});await pt(St)}catch(Ae){console.error("[Connected audio upload]",Ae),te.current=null,alert((Ae==null?void 0:Ae.message)||"连线音频上传失败")}finally{we(!1),me(0)}})())},[Ne,pt]);const $t=_.useCallback(async()=>{var Ae,nt;if(Ie){oe(!0);try{const _t=i.find(Qe=>Qe.id===R||Qe.id.includes("suno")),xt=(_t==null?void 0:_t.key)||a,Tt=((_t==null?void 0:_t.url)||"https://ai.comfly.chat").replace(/\/+$/,"");Na.updateConfig(Tt,xt,i);const St=await Na.getMusicTaskStatus(Ie,R);if(St.success&&((Ae=St.data)!=null&&Ae.data)&&Array.isArray(St.data.data)&&St.data.data.length>0){const Ue=((nt=St.data.data[0].metadata)==null?void 0:nt.prompt)||"";Ue&&n(e.id,{settings:{...e.settings,generatedLyrics:Ue}})}}catch(_t){console.error("[Load Lyrics] Error:",_t)}finally{oe(!1)}}},[Ie,R,i,a,e.id,e.settings,n]);return s.jsxs("div",{className:`flex flex-col h-full ${t?"text-zinc-100":"text-zinc-900"}`,children:[Re?s.jsx(s.Fragment,{children:s.jsxs("div",{className:"flex-1 overflow-y-auto p-4 space-y-4 music-node-scrollbar",children:[Me&&s.jsxs("div",{children:[s.jsx("div",{className:`text-xs font-medium mb-2 ${t?"text-zinc-400":"text-zinc-600"}`,children:Ne?"连接的参考音频":"上传的参考音频"}),s.jsx(U0,{audioUrl:Me,isDark:t,title:Ne?"连接的音频":Je||"上传的音频"})]}),ke&&s.jsxs("div",{children:[Me&&s.jsx("div",{className:`text-xs font-medium mb-2 mt-4 ${t?"text-zinc-400":"text-zinc-600"}`,children:"生成的音乐"}),s.jsx(U0,{audioUrl:ke,isDark:t,title:Te||"生成的音乐",initialDuration:Be})]}),s.jsxs("div",{className:"space-y-2",children:[s.jsxs("div",{className:`text-xs font-medium mb-2 ${t?"text-zinc-400":"text-zinc-600"}`,children:["魔法工具箱 ",s.jsx("span",{className:"text-green-500",children:"(部分工具正在建设中)"})]}),s.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[s.jsxs("button",{onClick:Ae=>{Ae.stopPropagation(),Ae.nativeEvent.stopImmediatePropagation(),qe()},onMouseDown:Ae=>{Ae.stopPropagation(),Ae.nativeEvent.stopImmediatePropagation()},disabled:j,className:`flex items-center justify-center gap-2 px-2 py-1 rounded border text-xs transition-colors ${j?t?"bg-transparent text-white/50 border-white/20 cursor-not-allowed":"bg-transparent text-gray-500 border-gray-200 cursor-not-allowed":t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:[j?s.jsx(zr,{size:14,className:"animate-spin"}):s.jsx($c,{size:14}),s.jsx("span",{children:"续写"})]}),s.jsxs("button",{onClick:Ae=>{Ae.stopPropagation(),Ae.nativeEvent.stopImmediatePropagation(),ht()},onMouseDown:Ae=>{Ae.stopPropagation(),Ae.nativeEvent.stopImmediatePropagation()},disabled:pe,className:`flex items-center justify-center gap-2 px-2 py-1 rounded border text-xs transition-colors ${pe?t?"bg-transparent text-white/50 border-white/20 cursor-not-allowed":"bg-transparent text-gray-500 border-gray-200 cursor-not-allowed":t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:[pe?s.jsx(zr,{size:14,className:"animate-spin"}):s.jsx(w2,{size:14}),s.jsx("span",{children:"上传续写"})]}),s.jsxs("button",{onClick:Ae=>{Ae.stopPropagation(),Ae.nativeEvent.stopImmediatePropagation(),Ye()},onMouseDown:Ae=>{Ae.stopPropagation(),Ae.nativeEvent.stopImmediatePropagation()},disabled:W,className:`flex items-center justify-center gap-2 px-2 py-1 rounded border text-xs transition-colors ${W?t?"bg-transparent text-white/50 border-white/20 cursor-not-allowed":"bg-transparent text-gray-500 border-gray-200 cursor-not-allowed":t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:[W?s.jsx(zr,{size:14,className:"animate-spin"}):s.jsx(aa,{size:14}),s.jsx("span",{children:"生成 MV"})]}),s.jsxs("button",{onClick:Ae=>{Ae.stopPropagation(),Ae.nativeEvent.stopImmediatePropagation(),ct()},onMouseDown:Ae=>{Ae.stopPropagation(),Ae.nativeEvent.stopImmediatePropagation()},disabled:re,className:`flex items-center justify-center gap-2 px-2 py-1 rounded border text-xs transition-colors ${re?t?"bg-transparent text-white/50 border-white/20 cursor-not-allowed":"bg-transparent text-gray-500 border-gray-200 cursor-not-allowed":t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:[re?s.jsx(zr,{size:14,className:"animate-spin"}):s.jsx(dd,{size:14}),s.jsx("span",{children:"节奏分析"})]})]})]}),Z&&s.jsxs("div",{className:`p-3 rounded border ${t?"bg-transparent border-white/30":"bg-transparent border-gray-300"}`,children:[s.jsx("label",{className:`block text-xs font-medium mb-2 ${t?"text-zinc-300":"text-zinc-700"}`,children:"从第几秒开始续写"}),s.jsxs("div",{className:"space-y-3",children:[s.jsxs("div",{children:[s.jsx("input",{type:"range",min:"0",max:Math.max(120,H+30),step:"1",value:H,onChange:Ae=>J(Number(Ae.target.value)),className:"w-full audio-slider",style:{background:`linear-gradient(to right, ${t?"rgba(255, 255, 255, 0.5)":"rgba(0, 0, 0, 0.3)"} 0%, ${t?"rgba(255, 255, 255, 0.5)":"rgba(0, 0, 0, 0.3)"} ${H/Math.max(120,H+30)*100}%, ${t?"rgba(255, 255, 255, 0.1)":"rgba(0, 0, 0, 0.1)"} ${H/Math.max(120,H+30)*100}%, ${t?"rgba(255, 255, 255, 0.1)":"rgba(0, 0, 0, 0.1)"} 100%)`}}),s.jsxs("div",{className:"flex justify-between text-xs mt-1",children:[s.jsx("span",{className:t?"text-zinc-400":"text-zinc-600",children:"0秒"}),s.jsxs("span",{className:`font-medium ${t?"text-white":"text-gray-900"}`,children:[H,"秒"]}),s.jsxs("span",{className:t?"text-zinc-400":"text-zinc-600",children:[Math.max(120,H+30),"秒"]})]})]}),s.jsxs("div",{className:"flex gap-2",children:[s.jsx("input",{type:"number",min:"0",value:H,onChange:Ae=>J(Number(Ae.target.value)),placeholder:"0",className:`flex-1 px-3 py-2 text-sm rounded border ${t?"bg-transparent border-white/30 text-white":"bg-transparent border-gray-300 text-gray-900"}`}),s.jsx("button",{onClick:tt,disabled:j,className:`px-2 py-1 rounded border text-xs transition-colors ${j?t?"bg-transparent text-white/50 border-white/20 cursor-not-allowed":"bg-transparent text-gray-500 border-gray-200 cursor-not-allowed":t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:j?s.jsx(zr,{size:14,className:"animate-spin"}):"确认"}),s.jsx("button",{onClick:()=>B(!1),className:`px-2 py-1 rounded border text-xs transition-colors ${t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:"取消"})]})]})]}),s.jsxs("div",{className:"border-t border-zinc-700/50 pt-3",children:[s.jsxs("button",{onClick:()=>{!O&&!Pe&&Ie&&$t(),F(!O)},className:`w-full flex items-center justify-between px-2 py-1 rounded border text-xs transition-colors ${t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(Vo,{size:14}),s.jsx("span",{children:"查看歌词"}),ie&&s.jsx(zr,{size:12,className:"animate-spin"})]}),O?s.jsx(bm,{size:14}):s.jsx(Ei,{size:14})]}),O&&s.jsxs("div",{className:"mt-2 space-y-2",children:[s.jsx("div",{className:`p-3 rounded-lg text-xs whitespace-pre-wrap max-h-40 overflow-y-auto ${t?"bg-zinc-800/50 text-zinc-300":"bg-zinc-50 text-zinc-700"}`,children:Pe||(ie?"加载中...":"暂无歌词")}),Pe&&s.jsxs("button",{onClick:async()=>{try{await navigator.clipboard.writeText(Pe),alert("歌词已复制到剪贴板")}catch{const nt=document.createElement("textarea");nt.value=Pe,nt.style.position="fixed",nt.style.opacity="0",document.body.appendChild(nt),nt.select(),document.execCommand("copy"),document.body.removeChild(nt),alert("歌词已复制到剪贴板")}},className:`w-full px-2 py-1 rounded border text-xs transition-colors flex items-center justify-center gap-2 ${t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:[s.jsx(Vo,{size:14}),s.jsx("span",{children:"一键复制歌词"})]})]})]})]})}):s.jsxs(s.Fragment,{children:[s.jsxs("div",{className:"flex border-b border-zinc-700/50 relative",style:{pointerEvents:"none"},children:[s.jsx("button",{onClick:Ae=>{Ae.preventDefault(),Ae.stopPropagation(),Ae.nativeEvent.stopImmediatePropagation(),b!=="inspiration"&&(g("inspiration"),n(e.id,{settings:{...e.settings,mode:"inspiration"}}))},onMouseDown:Ae=>{Ae.preventDefault(),Ae.stopPropagation(),Ae.nativeEvent.stopImmediatePropagation()},onMouseUp:Ae=>{Ae.preventDefault(),Ae.stopPropagation(),Ae.nativeEvent.stopImmediatePropagation()},className:`flex-1 px-4 py-3 text-xs font-medium transition-colors border-b cursor-pointer relative ${b==="inspiration"?t?"bg-transparent text-white border-white/50":"bg-transparent text-gray-900 border-gray-400":t?"text-white/60 hover:text-white border-transparent":"text-gray-600 hover:text-gray-900 border-transparent"}`,style:{pointerEvents:"auto",zIndex:20,minHeight:"44px"},children:s.jsx("span",{className:"relative z-10",children:"灵感模式"})}),s.jsx("button",{onClick:Ae=>{Ae.preventDefault(),Ae.stopPropagation(),Ae.nativeEvent.stopImmediatePropagation(),b!=="custom"&&(g("custom"),n(e.id,{settings:{...e.settings,mode:"custom"}}))},onMouseDown:Ae=>{Ae.preventDefault(),Ae.stopPropagation(),Ae.nativeEvent.stopImmediatePropagation()},onMouseUp:Ae=>{Ae.preventDefault(),Ae.stopPropagation(),Ae.nativeEvent.stopImmediatePropagation()},className:`flex-1 px-4 py-3 text-xs font-medium transition-colors border-b cursor-pointer relative ${b==="custom"?t?"bg-transparent text-white border-white/50":"bg-transparent text-gray-900 border-gray-400":t?"text-white/60 hover:text-white border-transparent":"text-gray-600 hover:text-gray-900 border-transparent"}`,style:{pointerEvents:"auto",zIndex:20,minHeight:"44px"},children:s.jsx("span",{className:"relative z-10",children:"自定义模式"})})]}),s.jsxs("div",{className:"p-4 space-y-3",children:[s.jsxs("div",{children:[s.jsx("label",{className:`block text-xs font-medium mb-1.5 ${t?"text-zinc-300":"text-zinc-700"}`,children:"参考音频(可选)"}),s.jsxs("div",{className:"space-y-2",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("input",{ref:G,type:"file",accept:"audio/*,.mp3,.wav,.ogg,.m4a,.aac,.flac",onChange:wt,className:"hidden"}),s.jsx("button",{onClick:Ae=>{Ae.stopPropagation(),Ae.nativeEvent.stopImmediatePropagation(),ht()},onMouseDown:Ae=>{Ae.stopPropagation(),Ae.nativeEvent.stopImmediatePropagation()},disabled:pe,className:`flex items-center gap-2 px-2 py-1 text-xs rounded border transition-colors ${pe?t?"bg-transparent text-white/50 border-white/20 cursor-not-allowed":"bg-transparent text-gray-500 border-gray-200 cursor-not-allowed":t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:pe?s.jsxs(s.Fragment,{children:[s.jsx(zr,{size:14,className:"animate-spin"}),s.jsx("span",{children:"上传中..."})]}):s.jsxs(s.Fragment,{children:[s.jsx(w2,{size:14}),s.jsx("span",{children:"上传音频"})]})}),s.jsx("span",{className:"text-xs text-zinc-500",children:"用于续写或二次创作"})]}),pe&&s.jsxs("div",{className:"space-y-1",children:[s.jsxs("div",{className:"flex items-center justify-between text-xs",children:[s.jsx("span",{className:t?"text-zinc-400":"text-zinc-600",children:"上传进度"}),s.jsxs("span",{className:t?"text-zinc-400":"text-zinc-600",children:[Q,"%"]})]}),s.jsx("div",{className:`w-full h-2 rounded-full overflow-hidden ${t?"bg-zinc-700":"bg-zinc-200"}`,children:s.jsx("div",{className:`h-full transition-all duration-300 ${t?"bg-blue-500":"bg-blue-600"}`,style:{width:`${Q}%`}})})]}),Me&&!pe&&s.jsxs("div",{className:`p-2 rounded border ${t?"bg-transparent border-white/30":"bg-transparent border-gray-300"}`,children:[s.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[s.jsx(w2,{size:14,className:t?"text-green-400":"text-green-600"}),s.jsx("span",{className:`text-xs font-medium ${t?"text-zinc-300":"text-zinc-700"}`,children:Ne?"已连接参考音频":"已上传音频"})]}),s.jsx(U0,{audioUrl:Me,isDark:t,title:Ne?"连接的音频":Je||"上传的音频"})]})]})]}),b==="inspiration"?s.jsxs("div",{children:[s.jsx("label",{className:`block text-xs font-medium mb-1.5 ${t?"text-zinc-300":"text-zinc-700"}`,children:"音乐描述"}),s.jsx("textarea",{ref:d,"data-node-type":"gen-music","data-node-id":e.id,value:y,onChange:Ae=>{const nt=Ae.target.value;w(nt),f.current.prompt=!0,p.current.prompt&&clearTimeout(p.current.prompt),p.current.prompt=setTimeout(()=>{n(e.id,{prompt:nt})},50)},onBlur:Ae=>{const nt=Ae.target.value;p.current.prompt&&clearTimeout(p.current.prompt),n(e.id,{prompt:nt})},placeholder:"例如:一首轻快的夏日城市流行乐",className:`w-full px-3 py-2 text-sm rounded resize-none outline-none focus:outline-none focus:ring-0 ${t?"bg-transparent text-white placeholder-zinc-500":"bg-transparent text-gray-900 placeholder-zinc-400"}`,rows:4})]}):s.jsx("div",{className:"space-y-3",children:!T&&s.jsxs("div",{children:[s.jsx("label",{className:`block text-xs font-medium mb-1.5 ${t?"text-zinc-300":"text-zinc-700"}`,children:"歌词"}),s.jsxs("div",{className:"relative",children:[s.jsx("textarea",{ref:h,"data-node-type":"gen-music-lyrics","data-node-id":e.id,value:v,onChange:Ae=>{const nt=Ae.target.value;m(nt),f.current.lyrics=!0,p.current.lyrics&&clearTimeout(p.current.lyrics),p.current.lyrics=setTimeout(()=>{Ve()},50)},onBlur:()=>{p.current.lyrics&&clearTimeout(p.current.lyrics),Ve()},placeholder:"输入歌词内容...",className:`w-full px-3 py-2 pr-10 text-sm rounded resize-none outline-none focus:outline-none focus:ring-0 overflow-y-auto rh-scroll-minimal scroll-no-buttons ${t?"bg-transparent text-white placeholder-zinc-500":"bg-transparent text-gray-900 placeholder-zinc-400"}`,rows:6}),s.jsx("button",{onClick:Ae=>{Ae.preventDefault(),Ae.stopPropagation(),Ae.nativeEvent.stopImmediatePropagation(),console.log("[GenMusicNode] AI 生成歌词按钮被点击"),Ze()},onMouseDown:Ae=>{Ae.preventDefault(),Ae.stopPropagation(),Ae.nativeEvent.stopImmediatePropagation()},disabled:V,className:`absolute top-2 right-2 p-1.5 rounded border transition-colors z-10 ${V?"cursor-not-allowed opacity-50 bg-transparent border-white/20":t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-600 border-gray-300"}`,style:{pointerEvents:"auto"},title:"AI 生成歌词",children:V?s.jsx(zr,{size:14,className:"animate-spin"}):s.jsx(Up,{size:14})})]})]})}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("label",{className:`text-xs font-medium ${t?"text-white":"text-zinc-700"}`,children:"纯音乐模式"}),s.jsx("button",{onClick:()=>{q(!T),Ve()},className:`w-12 h-6 rounded-full transition-all relative border ${T?t?"bg-transparent border-white/50":"bg-blue-600 border-transparent":t?"bg-transparent border-white/30":"bg-zinc-300 border-transparent"}`,children:s.jsx("div",{className:`absolute top-1 w-4 h-4 rounded-full transition-transform ${T?"bg-white translate-x-7":t?"bg-white/50 translate-x-1":"bg-white translate-x-1"}`})})]}),s.jsxs("div",{children:[s.jsx("label",{className:`block text-xs font-medium mb-1.5 ${t?"text-zinc-300":"text-zinc-700"}`,children:"风格/流派(可选)"}),s.jsx("input",{type:"text",value:z,onChange:Ae=>{C(Ae.target.value),Ve()},placeholder:"例如:pop, electronic, rock",className:`w-full px-3 py-2 text-sm rounded mb-2 outline-none focus:outline-none focus:ring-0 ${t?"bg-transparent text-white placeholder-zinc-500":"bg-transparent text-gray-900 placeholder-zinc-400"}`}),s.jsx("div",{className:"flex gap-1.5 overflow-x-auto pb-2 style-tags-scrollbar",style:{scrollbarWidth:"thin"},children:Pce.map(Ae=>s.jsx("button",{onClick:()=>Le(Ae),className:`px-2 py-1 text-[10px] rounded border whitespace-nowrap transition-colors flex-shrink-0 ${z.includes(Ae)?t?"bg-transparent border-white/50 text-white":"bg-transparent border-gray-400 text-gray-900":t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:Ae},Ae))})]}),s.jsxs("div",{children:[s.jsx("label",{className:`block text-xs font-medium mb-1.5 ${t?"text-zinc-300":"text-zinc-700"}`,children:"标题(可选)"}),s.jsx("input",{type:"text",value:E,onChange:Ae=>{I(Ae.target.value),Ve()},placeholder:"音乐标题",className:`w-full px-3 py-2 text-sm rounded outline-none focus:outline-none focus:ring-0 ${t?"bg-transparent text-white placeholder-zinc-500":"bg-transparent text-gray-900 placeholder-zinc-400"}`})]}),s.jsxs("div",{children:[s.jsx("label",{className:`block text-xs font-medium mb-1.5 ${t?"text-zinc-300":"text-zinc-700"}`,children:"模型版本"}),s.jsxs("div",{className:"relative",children:[s.jsxs("button",{onClick:Ae=>{Ae.stopPropagation(),Ae.nativeEvent.stopImmediatePropagation(),X((L==null?void 0:L.type)==="sunoVersion"&&L.nodeId===e.id?null:{nodeId:e.id,type:"sunoVersion"})},onMouseDown:Ae=>{Ae.stopPropagation(),Ae.nativeEvent.stopImmediatePropagation()},className:`w-full flex items-center justify-between px-3 py-2 text-sm rounded border transition-colors ${t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:[s.jsx("span",{className:"truncate",children:((qt=nj.find(Ae=>Ae.value===R))==null?void 0:qt.label)||"v4"}),s.jsx(Ei,{size:14,className:`flex-shrink-0 transition-transform ${(L==null?void 0:L.type)==="sunoVersion"&&L.nodeId===e.id?"rotate-180":""}`})]}),(L==null?void 0:L.nodeId)===e.id&&L.type==="sunoVersion"&&s.jsx("div",{className:`absolute bottom-full left-0 mb-1 w-full rounded border p-1 z-[60] max-h-64 overflow-y-auto style-tags-scrollbar ${t?"bg-zinc-900 border-white/30":"bg-white border-gray-300"}`,onMouseDown:Ae=>Ae.stopPropagation(),children:nj.map(Ae=>s.jsx("button",{onClick:nt=>{nt.stopPropagation(),nt.nativeEvent.stopImmediatePropagation(),A(Ae.value),n(e.id,{settings:{...e.settings||{},model:Ae.value}}),X(null)},onMouseDown:nt=>{nt.stopPropagation(),nt.nativeEvent.stopImmediatePropagation()},className:`w-full flex items-center justify-between px-2 py-1.5 rounded text-left transition-colors ${t?"bg-transparent hover:bg-white/5 text-white":"bg-transparent hover:bg-black/5 text-gray-900"}`,children:s.jsx("span",{className:"text-xs font-medium",children:Ae.label})},Ae.value))})]})]}),b==="extend"&&s.jsx("div",{className:`px-3 py-2 rounded border text-xs ${t?"bg-transparent text-white border-white/30":"bg-transparent text-gray-900 border-gray-300"}`,children:"正在基于上个片段扩展..."})]}),s.jsxs("div",{className:"border-t border-zinc-700/50 p-4",children:[s.jsx("button",{onClick:Ae=>{Ae.preventDefault(),Ae.stopPropagation(),Ae.nativeEvent.stopImmediatePropagation(),ve||Xe()},onMouseDown:Ae=>{Ae.stopPropagation(),Ae.nativeEvent.stopImmediatePropagation()},disabled:ve,style:{pointerEvents:"auto",zIndex:100},className:`w-full px-4 py-2.5 rounded border font-medium text-sm transition-colors flex items-center justify-center gap-2 relative ${ve?t?"bg-transparent text-white/50 border-white/20 cursor-not-allowed":"bg-transparent text-gray-500 border-gray-200 cursor-not-allowed":t?"bg-transparent hover:bg-white/5 text-white border-white/30 cursor-pointer":"bg-black hover:bg-zinc-900 text-white border-black cursor-pointer"}`,children:ve?s.jsxs(s.Fragment,{children:[s.jsx(zr,{size:16,className:"animate-spin"}),s.jsx("span",{children:"生成中..."})]}):s.jsx(s.Fragment,{children:s.jsx("span",{children:b==="extend"?"续写音乐":"运行"})})}),e.errorMsg&&s.jsx("div",{className:`mt-2 text-xs px-3 py-2 rounded border ${t?"bg-transparent text-red-400 border-red-500/50":"bg-transparent text-red-600 border-red-300"}`,children:e.errorMsg})]})]}),ge&&s.jsx("div",{className:"fixed inset-0 z-[100] flex items-center justify-center bg-black/50",onClick:Ae=>{Ae.target===Ae.currentTarget&&(ne(!1),ze(!1))},children:s.jsxs("div",{className:`w-full max-w-md rounded-lg shadow-xl border ${t?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onClick:Ae=>Ae.stopPropagation(),children:[s.jsxs("div",{className:`flex items-center justify-between px-4 py-3 border-b ${t?"border-zinc-700":"border-zinc-200"}`,children:[s.jsx("h3",{className:`text-sm font-semibold ${t?"text-zinc-200":"text-zinc-900"}`,children:"AI 生成歌词"}),s.jsx("button",{onClick:()=>{ne(!1),fe(""),de(0),ze(!1)},className:`p-1 rounded transition-colors ${t?"hover:bg-zinc-700 text-zinc-400 hover:text-zinc-200":"hover:bg-zinc-100 text-zinc-500 hover:text-zinc-700"}`,children:s.jsx(Qr,{size:16})})]}),s.jsxs("div",{className:"p-4 space-y-4",children:[s.jsxs("div",{children:[s.jsx("label",{className:`block text-xs font-medium mb-2 ${t?"text-zinc-300":"text-zinc-700"}`,children:"音乐风格或歌曲名称"}),s.jsx("input",{type:"text",value:le,onChange:Ae=>fe(Ae.target.value),placeholder:"例如:轻快的夏日城市流行乐、关于爱情的抒情歌曲",className:`w-full px-3 py-2 text-sm rounded border ${t?"bg-transparent border-white/30 text-white placeholder-zinc-500":"bg-transparent border-gray-300 text-gray-900 placeholder-zinc-400"}`,disabled:V,onKeyDown:Ae=>{Ae.key==="Enter"&&!V&&le.trim()&&je()}})]}),s.jsxs("div",{className:"relative",children:[s.jsx("label",{className:`block text-xs font-medium mb-2 ${t?"text-zinc-300":"text-zinc-700"}`,children:"Chat 模型"}),s.jsxs("button",{type:"button",onClick:Ae=>{Ae.stopPropagation(),V||ze(nt=>!nt)},onMouseDown:Ae=>Ae.stopPropagation(),disabled:V,className:`w-full flex items-center justify-between px-3 py-2 text-sm rounded border outline-none focus:outline-none focus:ring-0 transition-colors ${t?"bg-zinc-800/80 hover:bg-zinc-700/80 border-white/30 text-white":"bg-transparent hover:bg-black/5 border-gray-300 text-gray-900"}`,children:[s.jsx("span",{className:"truncate",children:((De=i.find(Ae=>Ae.type==="Chat"&&Ae.id===Ee))==null?void 0:De.provider)||((st=i.find(Ae=>Ae.type==="Chat"&&Ae.id===Ee))==null?void 0:st.modelName)||Ee}),s.jsx(Ei,{size:14,className:`flex-shrink-0 transition-transform ${$e?"rotate-180":""}`})]}),$e&&s.jsx("div",{className:`absolute top-full left-0 right-0 mt-1 rounded border p-1 z-[110] max-h-56 overflow-y-auto style-tags-scrollbar ${t?"bg-zinc-900 border-white/30":"bg-white border-gray-300 shadow-lg"}`,onMouseDown:Ae=>Ae.stopPropagation(),children:i.filter(Ae=>Ae.type==="Chat").map(Ae=>s.jsx("button",{type:"button",onClick:nt=>{nt.stopPropagation(),n(e.id,{settings:{...e.settings,lyricsChatModel:Ae.id}}),ze(!1)},onMouseDown:nt=>nt.stopPropagation(),className:`w-full flex items-center justify-between px-2 py-1.5 rounded text-left transition-colors ${t?"bg-transparent hover:bg-zinc-700 text-white":"bg-transparent hover:bg-black/5 text-gray-900"}`,children:s.jsx("span",{className:"text-xs font-medium",children:Ae.provider||Ae.modelName||Ae.id})},Ae.id))})]}),V&&s.jsxs("div",{className:"space-y-2",children:[s.jsxs("div",{className:`flex items-center justify-between text-xs ${t?"text-zinc-400":"text-zinc-600"}`,children:[s.jsx("span",{children:"正在生成歌词..."}),s.jsxs("span",{children:[be,"%"]})]}),s.jsx("div",{className:`h-2 rounded-full overflow-hidden ${t?"bg-zinc-800":"bg-zinc-200"}`,children:s.jsx("div",{className:"h-full bg-blue-500 transition-all duration-300",style:{width:`${be}%`}})})]}),s.jsxs("div",{className:"flex gap-2",children:[s.jsx("button",{onClick:()=>{ne(!1),fe(""),de(0),ze(!1)},className:`flex-1 px-2 py-1 rounded border text-sm transition-colors ${t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,disabled:V,children:"取消"}),s.jsx("button",{onClick:je,disabled:V||!le.trim(),className:`flex-1 px-2 py-1 rounded border text-sm transition-colors flex items-center justify-center gap-2 ${V||!le.trim()?t?"bg-transparent text-white/50 border-white/20 cursor-not-allowed":"bg-transparent text-gray-500 border-gray-200 cursor-not-allowed":t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:V?s.jsxs(s.Fragment,{children:[s.jsx(zr,{size:16,className:"animate-spin"}),s.jsx("span",{children:"生成中..."})]}):s.jsxs(s.Fragment,{children:[s.jsx(Up,{size:16}),s.jsx("span",{children:"开始生成"})]})})]})]})]})})]})},Lce=["时间段","镜头类型","画面描述","视觉/技术要求","音效/旁白"];function Bce(e,t){if(e.length===0)return"";const n=t??Lce,r="| "+n.join(" | ")+" |",i="| "+n.map(()=>"---").join(" | ")+" |",a=e.map(o=>"| "+n.map(l=>(o[l]??"").replace(/\n/g," ")).join(" | ")+" |").join(` +`);return r+` +`+i+` +`+a}const Uce=()=>`row-${Date.now()}-${Math.random().toString(36).slice(2,9)}`,qE=`你是一个专业的内容分类助手。请分析用户提供的文本,提取其中的结构化信息,并整理成表格。 + +【重要】整理分类时不能改变原文里的内容,只负责归类排列,要细致保留原文所有信息。不要增删改原文,仅按类别整理。 +1. 根据文本内容智能确定列名,不固定。例如:分镜类可能是 时间段、镜头类型、画面描述、视觉/技术要求、音效/旁白;列表类可能是 序号、名称、说明。 +2. 每一行对应一个完整条目。 +3. 列名用简短中文,清晰表达含义。 +4. 将原文内容准确归类到对应列,保持原文信息完整,不遗漏、不篡改。 +5. 只输出 JSON,不要其他文字。格式如下: +{ + "columns": ["列1", "列2", "列3", ...], + "rows": [ + {"列1": "值1", "列2": "值2", ...}, + ... + ] +}`;async function Fce(e,t){var y,w,v,m,z,C,E;const{baseUrl:n,apiKey:r,modelName:i,customPrompt:a}=t,o=a!=null&&a.trim()?`${qE} + +【用户自定义指令】${a}`:qE,l=`${n.replace(/\/+$/,"")}/v1/chat/completions`,c=await fetch(l,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify({model:i,messages:[{role:"system",content:o},{role:"user",content:`请分析以下文本,提取结构化表格数据(保持原文不变,仅归类整理): + +${e}`}],max_tokens:16e3,temperature:.3,stream:!1})});if(!c.ok){const I=await c.text();throw new Error(`API 请求失败: ${c.status} - ${I}`)}const u=await c.json(),h=(((v=(w=(y=u.choices)==null?void 0:y[0])==null?void 0:w.message)==null?void 0:v.content)||((E=(C=(z=(m=u.data)==null?void 0:m.choices)==null?void 0:z[0])==null?void 0:C.message)==null?void 0:E.content)||u.content||"").match(/\{[\s\S]*\}/);if(!h)throw new Error("未找到 JSON 格式的表格数据");const p=JSON.parse(h[0]),f=Array.isArray(p.columns)?p.columns.map(I=>String(I).trim()).filter(Boolean):[],g=(Array.isArray(p.rows)?p.rows:[]).map(I=>{const R={id:Uce()};return f.forEach(A=>{const O=I[A]??I[A.toLowerCase()]??I[A.toUpperCase()]??"";R[A]=String(O??"").trim()}),R});if(f.length===0||g.length===0)throw new Error("未生成有效的表格列或行");return{columns:f,rows:g}}function Wce(e,t,n,r){e.font=r;const i=[],a=t.split(/\n/g);for(const o of a){const l=o.split("");let c="";for(let u=0;un){let p=0;for(;p{if(l&&l[j]!=null)m.push(Math.max(z,Math.min(l[j],C)));else{let W=d.measureText(j).width+i*2;t.forEach(M=>{(M[j]??"").toString().split(` +`).forEach(ie=>{const oe=d.measureText(ie.length>40?ie.slice(0,37)+"...":ie).width+i*2;oe>W&&(W=Math.min(oe,C))})}),m.push(Math.max(z,Math.min(W,C)))}});const E=40,I=E+m.reduce((j,k)=>j+k,0),R=Math.min(a,Math.max(I,400)),A=R/I,O=m.map(j=>Math.round(j*A)),F=Math.round(E*A),L=i/2,X=j=>Math.max(20,j-i),T=t.slice(0,30),q=T.map(j=>c&&c[j.id]!=null?Math.max(b,c[j.id]):b),H=f+q.reduce((j,k)=>j+k,0),J=R+2,Z=H+2;u.width=Math.round(J*o),u.height=Math.round(Z*o),d.scale(o,o),d.fillStyle="#ffffff",d.fillRect(0,0,J,Z),d.strokeStyle=g,d.fillStyle=w,d.lineWidth=1;const B=(j,k,W,M,Y,se,ie=!1)=>{se&&(d.fillStyle=y,d.fillRect(k,W,M,Y),d.fillStyle=w),d.strokeRect(k,W,M,Y),d.font=se?p:h;const oe=ie?Wce(d,j,X(M),d.font):[j.length>50?j.slice(0,47)+"...":j],re=Math.floor((Y-i)/v)||1;oe.slice(0,re).forEach((pe,we)=>{const Q=W+i+r+we*v;Q+v<=W+Y&&d.fillText(pe,k+L,Q)})};let V=1,N=1;return B("#",V,N,F,f,!0),V+=F,e.forEach((j,k)=>{B(j,V,N,O[k],f,!0),V+=O[k]}),N=f+1,T.forEach((j,k)=>{const W=q[k];V=1,B(String(k+1),V,N,F,W,!1),V+=F,e.forEach((M,Y)=>{B((j[M]??"").toString(),V,N,O[Y],W,!1,!0),V+=O[Y]}),N+=W}),u.toDataURL("image/png")}const Vce=60,Hce=120,KE=36,Gce=48,qce=({node:e,isDark:t,nodes:n,connections:r,updateNode:i,apiConfigs:a,globalApiKey:o,setNodes:l,generateId:c,dataVersion:u})=>{var Ee,Ce,xe,Ne,ve,ke,Ie,Pe,Te,Be,He,Je;const d=((Ee=e.settings)==null?void 0:Ee.tableColumns)||[],h=((Ce=e.settings)==null?void 0:Ce.tableRows)||[],p=((xe=e.settings)==null?void 0:xe.colWidths)||{},f=((Ne=e.settings)==null?void 0:Ne.rowHeights)||{},b=_.useMemo(()=>d.length>0?d:h.length>0?Object.keys(h[0]).filter(Re=>Re!=="id"):[],[d,h]),[g,y]=_.useState(()=>b),[w,v]=_.useState(()=>h),[m,z]=_.useState(()=>p),[C,E]=_.useState(()=>f),[I,R]=_.useState(null),[A,O]=_.useState("table"),[F,L]=_.useState(!1),[X,T]=_.useState(()=>{var Me;return((Me=e.settings)==null?void 0:Me.customPrompt)||""}),[q,H]=_.useState(!1),J=_.useRef(null),Z=_.useRef(null),B=_.useRef(m),V=_.useRef(C),N=_.useRef(new Map);B.current=m,V.current=C;const j=_.useMemo(()=>a.filter(Me=>Me.type==="Chat"),[a]),k=((ve=j[0])==null?void 0:ve.modelName)||((ke=j[0])==null?void 0:ke.id)||"gemini-3-pro-preview",W=((Ie=e.settings)==null?void 0:Ie.selectedChatModel)||k,[M,Y]=_.useState(W);_.useEffect(()=>{b.length>0&&y(b),h.length>0&&v(h),Object.keys(p).length>0&&z(p),Object.keys(f).length>0&&E(f)},[(Pe=e.settings)==null?void 0:Pe.tableColumns,(Te=e.settings)==null?void 0:Te.tableRows,(Be=e.settings)==null?void 0:Be.colWidths,(He=e.settings)==null?void 0:He.rowHeights,u,b,p,f]),_.useEffect(()=>{const Me=W;Me!==M&&Y(Me)},[W,k]);const se=_.useCallback(Me=>m[Me]??Hce,[m]),ie=_.useCallback(Me=>C[Me]??Gce,[C]),oe=_.useCallback((Me,Re,Ve,Ze)=>{const je=Me??g,Le=Re??w,Xe=Ve??m,qe=Ze??C;Me&&y(Me),Re&&v(Re),Ve&&z(Ve),Ze&&E(Ze),i(e.id,{settings:{...e.settings,tableColumns:je,tableRows:Le,colWidths:Xe,rowHeights:qe,selectedChatModel:M,customPrompt:X.trim()||void 0}})},[e.id,e.settings,M,X,g,w,m,C,i]),re=_.useMemo(()=>{if(!(r!=null&&r.length))return null;const Me=r.find(Re=>Re.to===e.id&&(!Re.inputType||Re.inputType==="default"));return Me&&n.find(Re=>Re.id===Me.from)||null},[r,n,e.id,u]),ee=_.useMemo(()=>{var Ve,Ze;const Me=re;if(!Me)return"";if(Me.type==="custom-agent")return(((Ve=Me.settings)==null?void 0:Ve.outputContent)||"").trim();const Re=((Ze=Me.settings)==null?void 0:Ze.text)||Me.prompt||Me.content||"";return String(Re||"").trim()},[re,u]),pe=_.useCallback(async()=>{var je;R(null);const Me=ee||((je=e.settings)==null?void 0:je.rawText)||"";if(!Me.trim()){R("请先连接文本/Agent 节点,或粘贴要解析的内容");return}const Re=j.find(Le=>(Le.modelName||Le.id)===M)||j[0];if(!Re){R("请先配置 Chat API");return}const Ve=Re.key||o;if(!Ve){R("请先配置 API Key");return}const Ze=(Re.url||"https://ai.comfly.chat").replace(/\/+$/,"");L(!0);try{const Le=await Fce(Me,{baseUrl:Ze,apiKey:Ve,modelName:Re.modelName||Re.id||"gemini-3-pro-preview",customPrompt:X.trim()||void 0});oe(Le.columns,Le.rows)}catch(Le){R(Le instanceof Error?Le.message:"解析失败")}finally{L(!1)}},[ee,(Je=e.settings)==null?void 0:Je.rawText,M,j,o,X,oe]),we=_.useCallback(()=>{const Me={id:`row-${Date.now()}-${Math.random().toString(36).slice(2,9)}`};g.forEach(Re=>{Me[Re]=""}),oe(void 0,[...w,Me])},[g,w,oe]),Q=_.useCallback(Me=>{oe(void 0,w.filter(Re=>Re.id!==Me))},[g,w,oe]),me=_.useCallback((Me,Re,Ve)=>{oe(void 0,w.map(Ze=>Ze.id===Me?{...Ze,[Re]:Ve}:Ze))},[g,w,oe]),ue=_.useCallback((Me,Re)=>{Re.preventDefault(),J.current={col:Me,startX:Re.clientX,startW:se(Me)};const Ve=je=>{if(!J.current)return;const Le=je.clientX-J.current.startX,Xe=Math.max(Vce,J.current.startW+Le);z(qe=>{const tt={...qe,[Me]:Xe};return B.current=tt,tt})},Ze=()=>{J.current=null,document.removeEventListener("mousemove",Ve),document.removeEventListener("mouseup",Ze),oe(void 0,void 0,{...B.current})};document.addEventListener("mousemove",Ve),document.addEventListener("mouseup",Ze)},[se,oe]),U=_.useCallback(()=>{const Me={};for(const Re of w){let Ve=KE;for(const Ze of g){const je=N.current.get(`${Re.id}-${Ze}`);if(je){const Le=je.scrollHeight;Le>0&&(Ve=Math.max(Ve,Le+16))}}Me[Re.id]=Ve}E(Me),V.current=Me,oe(void 0,void 0,void 0,Me)},[w,g,oe]),G=_.useCallback((Me,Re)=>{Re.preventDefault(),Z.current={rowId:Me,startY:Re.clientY,startH:ie(Me)};const Ve=je=>{if(!Z.current)return;const Le=je.clientY-Z.current.startY,Xe=Math.max(KE,Z.current.startH+Le);E(qe=>{const tt={...qe,[Me]:Xe};return V.current=tt,tt})},Ze=()=>{Z.current=null,document.removeEventListener("mousemove",Ve),document.removeEventListener("mouseup",Ze),oe(void 0,void 0,void 0,{...V.current})};document.addEventListener("mousemove",Ve),document.addEventListener("mouseup",Ze)},[ie,oe]),te=_.useCallback(()=>{if(!g.length||!w.length||!l||!c)return;const Me=Dce(g,w,{maxWidth:1400,fontSize:14,pixelRatio:2,colWidths:m,rowHeights:C}),Ve=60+w.slice(0,30).reduce((je,Le)=>je+ie(Le.id),0),Ze=Ms(c(),"input-image",e.x+(e.width??520)+40,e.y,void 0,void 0,n);Ze.content=Me,Ze.width=520,Ze.height=Math.min(800,Math.max(280,Ve)),Ze.settings={...Ze.settings,_blobUrl:Me},l(je=>[...je,Ze])},[g,w,m,C,ie,l,c,e.x,e.y,e.width,n]),ge=_.useMemo(()=>g.length?Bce(w,g):"",[w,g]),ne=t,le=ne?"bg-zinc-900":"bg-white",fe=ne?"text-zinc-200":"text-zinc-800",be=ne?"border-zinc-600":"border-zinc-300",de=ne?"bg-transparent border-zinc-600 text-zinc-100 placeholder-zinc-500 focus:bg-zinc-800/50":"bg-transparent border-zinc-300 text-zinc-900 placeholder-zinc-400 focus:bg-zinc-50",$e=ne?"bg-zinc-700 text-zinc-100":"bg-zinc-100 text-zinc-900",ze=ne?"text-zinc-400 hover:text-zinc-200":"text-zinc-500 hover:text-zinc-700",_e=ne?"bg-zinc-700 text-zinc-100":"bg-zinc-100 text-zinc-800";return s.jsxs("div",{className:`flex flex-col w-full h-full ${le} rounded-lg overflow-hidden border ${be}`,children:[s.jsxs("div",{className:`flex items-center justify-between gap-2 px-2 py-1.5 border-b ${be} flex-shrink-0`,children:[s.jsx("div",{className:`flex-1 min-w-0 flex items-center py-0.5 cursor-grab active:cursor-grabbing select-none touch-none ${fe}`,title:"拖动节点",children:s.jsx("span",{className:"text-[13px] font-medium truncate",children:"表格编辑器"})}),s.jsx("div",{className:"flex items-center gap-2 shrink-0",children:s.jsxs("div",{className:"flex items-center gap-2 py-2 px-3 -m-1 rounded","data-table-editor-toolbar":!0,"data-table-editor-controls":!0,onMouseDown:Me=>Me.stopPropagation(),children:[s.jsx("select",{value:M,onChange:Me=>Y(Me.target.value),title:"选择 Chat 模型",className:`text-[11px] px-2 py-0.5 rounded border max-w-[120px] truncate ${ne?"bg-black text-zinc-100 border-zinc-600":"bg-white text-zinc-900 border-zinc-300"}`,children:j.map(Me=>s.jsx("option",{value:Me.modelName||Me.id,children:Me.provider||Me.id},Me.id))}),s.jsx("button",{type:"button",onClick:pe,disabled:F,title:"调用大模型智能分类",className:`p-1.5 rounded border ${be} ${de} hover:opacity-80 disabled:opacity-50`,children:F?s.jsx(zr,{className:"w-3.5 h-3.5 animate-spin"}):s.jsx(Ch,{className:"w-3.5 h-3.5"})}),s.jsx("button",{type:"button",onClick:te,disabled:!g.length||!w.length,title:"下载为白色底分镜图片到画布",className:`p-1.5 rounded border ${be} ${de} hover:opacity-80 disabled:opacity-50`,children:s.jsx(mu,{className:"w-3.5 h-3.5"})})]})})]}),s.jsxs("div",{className:"flex-shrink-0","data-table-editor-prompt":!0,children:[s.jsxs("div",{className:`flex items-stretch border-b ${be}`,children:[s.jsx("div",{className:`cursor-grab active:cursor-grabbing flex items-center justify-center px-1.5 shrink-0 border-r ${be} select-none touch-none`,title:"拖动节点",children:s.jsx(k5,{className:`w-4 h-4 shrink-0 ${ne?"text-zinc-500":"text-zinc-400"}`})}),s.jsxs("button",{type:"button",onClick:()=>H(!q),className:`flex-1 flex items-center justify-between px-2 py-1.5 text-left text-[11px] min-w-0 ${ze} ${ne?"hover:bg-zinc-800/30":"hover:bg-zinc-100"}`,children:[s.jsx("span",{className:"truncate",children:"Prompt 自定义"}),q?s.jsx(bm,{className:"w-3.5 h-3.5 shrink-0 ml-1"}):s.jsx(Ei,{className:"w-3.5 h-3.5 shrink-0 ml-1"})]})]}),q&&s.jsx("div",{className:"px-2 pb-2 pt-1",children:s.jsx("textarea",{value:X,onChange:Me=>T(Me.target.value),onBlur:()=>i(e.id,{settings:{...e.settings,customPrompt:X.trim()||void 0}}),placeholder:"例如:我需要更加细致的分镜、我不需要xxx镜头等",rows:3,className:`w-full text-[11px] px-2 py-1.5 rounded border ${be} ${de} resize-none focus:outline-none focus:ring-1 focus:ring-blue-500 overflow-y-auto minimal-scrollbar`})})]}),s.jsxs("div",{className:`flex items-center justify-between px-2 py-1 border-b ${be} flex-shrink-0`,"data-table-editor-controls":!0,onMouseDown:Me=>Me.stopPropagation(),children:[s.jsxs("div",{className:"flex items-center gap-0.5",children:[s.jsx("button",{type:"button",onClick:()=>O("table"),className:`px-2 py-0.5 text-[11px] rounded ${A==="table"?$e:ze}`,children:"表格"}),s.jsx("button",{type:"button",onClick:()=>O("markdown"),className:`px-2 py-0.5 text-[11px] rounded ${A==="markdown"?$e:ze}`,children:"Markdown"})]}),s.jsxs("div",{className:"flex items-center gap-1",children:[s.jsxs("button",{type:"button",onClick:U,disabled:w.length===0,title:"根据内容自动调整所有行高,使文字完整显示",className:`text-[11px] px-2 py-0.5 rounded border ${be} ${de} hover:opacity-80 disabled:opacity-50 flex items-center gap-1`,children:[s.jsx(yG,{className:"w-3.5 h-3.5"}),"行高自适应"]}),s.jsx("button",{type:"button",onClick:we,className:`text-[11px] px-2 py-0.5 rounded border ${be} ${de} hover:opacity-80`,children:"+ 行"}),s.jsx("button",{type:"button",title:"列名由大模型根据内容智能生成",className:`text-[11px] px-2 py-0.5 rounded border ${be} opacity-60 cursor-default ${de}`,children:"+ 列"})]})]}),I&&s.jsx("div",{className:`px-2 py-1.5 text-[11px] text-amber-500 border-b ${be} bg-amber-500/10`,children:I}),s.jsx("div",{className:"flex-1 overflow-auto p-1.5 minimal-scrollbar","data-table-editor-scroll":!0,children:w.length===0&&A==="table"?s.jsx("div",{className:`text-center py-6 text-xs ${ne?"text-zinc-500":"text-zinc-400"}`,children:re?"点击上方刷新,调用大模型智能分类":"连接文本/Agent 节点后,点击刷新解析"}):A==="markdown"?s.jsx("pre",{className:`text-[11px] p-2 rounded border ${be} ${de} whitespace-pre-wrap font-mono overflow-auto h-full min-h-[80px]`,children:ge||"(暂无内容)"}):s.jsx("div",{className:"overflow-x-auto overflow-y-auto rounded border border-zinc-300 dark:border-zinc-600 minimal-scrollbar",children:s.jsxs("table",{className:"w-full text-[11px] border-collapse",style:{tableLayout:"fixed",minWidth:36+g.reduce((Me,Re)=>Me+se(Re),0)},children:[s.jsxs("colgroup",{children:[s.jsx("col",{style:{width:36}}),g.map(Me=>s.jsx("col",{style:{width:se(Me)}},Me))]}),s.jsx("thead",{children:s.jsxs("tr",{children:[s.jsx("th",{className:`w-9 px-1 py-1.5 border ${be} ${_e} font-medium text-center`,children:"#"}),g.map(Me=>s.jsxs("th",{className:`px-1 py-1.5 border ${be} ${_e} font-medium text-left relative group`,style:{width:se(Me)},children:[s.jsx("span",{className:"truncate block",children:Me}),s.jsx("span",{"data-table-resize-handle":!0,onMouseDown:Re=>{Re.stopPropagation(),Re.preventDefault(),ue(Me,Re)},className:"absolute right-0 top-0 bottom-0 w-1.5 cursor-col-resize hover:bg-blue-500/50 group-hover:bg-blue-500/30 shrink-0",title:"拖拽调整列宽"})]},Me))]})}),s.jsx("tbody",{children:w.map((Me,Re)=>s.jsxs(fr.Fragment,{children:[s.jsxs("tr",{className:`relative group/row ${ne?"hover:bg-zinc-800/50":"hover:bg-zinc-50"}`,style:{height:ie(Me.id)},children:[s.jsx("td",{className:`px-1 py-1 border ${be} text-center align-top`,children:s.jsx("button",{type:"button",onClick:()=>Q(Me.id),className:"p-0.5 rounded hover:bg-red-500/20 text-red-500",title:"删除行",children:s.jsx(Zi,{className:"w-3 h-3 inline"})})}),g.map(Ve=>s.jsx("td",{className:`px-1 py-0.5 border ${be} align-top overflow-hidden`,style:{width:se(Ve)},children:s.jsx("textarea",{ref:Ze=>{Ze?N.current.set(`${Me.id}-${Ve}`,Ze):N.current.delete(`${Me.id}-${Ve}`)},value:Me[Ve]??"",onChange:Ze=>me(Me.id,Ve,Ze.target.value),placeholder:Ve,rows:2,className:`w-full min-w-0 px-1 py-0.5 text-[11px] border-0 focus:outline-none focus:ring-1 focus:ring-blue-500 rounded resize-none overflow-hidden ${de}`,style:{minHeight:ie(Me.id)-16}})},Ve))]}),s.jsx("tr",{className:"group/resize",children:s.jsx("td",{colSpan:g.length+1,className:`p-0 h-1.5 cursor-row-resize hover:bg-blue-500/50 ${be} border-t-0`,"data-table-resize-handle":!0,title:"拖拽调整行高",onMouseDown:Ve=>{Ve.stopPropagation(),Ve.preventDefault(),G(Me.id,Ve)}})})]},Me.id))})]})})})]})},XE=({shape:e,isSelected:t,isInSelectedLayer:n=!1,onSelect:r,onDragStart:i,onResizeStart:a})=>{const{type:o,x:l,y:c,width:u,height:d,color:h,fillMode:p,strokeWidth:f,opacity:b,rotation:g}=e,y=()=>{const w={fill:p==="fill"?h:"none",stroke:p==="stroke"?h:"none",strokeWidth:p==="stroke"?f:0,opacity:b};switch(o){case"rectangle":return s.jsx("rect",{x:0,y:0,width:u,height:d,...w});case"circle":return s.jsx("ellipse",{cx:u/2,cy:d/2,rx:u/2,ry:d/2,...w});case"triangle":const v=`${u/2},0 ${u},${d} 0,${d}`;return s.jsx("polygon",{points:v,...w});case"line":return s.jsx("line",{x1:0,y1:0,x2:u,y2:d,stroke:h,strokeWidth:f,opacity:b});default:return null}};return s.jsxs("g",{transform:`translate(${l}, ${c}) rotate(${g}, ${u/2}, ${d/2})`,style:{cursor:"move",pointerEvents:"all"},children:[s.jsx("rect",{x:0,y:0,width:u,height:d,fill:"transparent",stroke:"none",pointerEvents:"all",onClick:w=>{w.stopPropagation(),r()},onMouseDown:w=>{w.stopPropagation(),i(w)}}),s.jsx("g",{pointerEvents:"none",children:y()}),t&&s.jsxs(s.Fragment,{children:[s.jsx("rect",{x:-2,y:-2,width:u+4,height:d+4,fill:"none",stroke:"#3b82f6",strokeWidth:1,strokeDasharray:"4 2",pointerEvents:"none"}),["nw","ne","sw","se"].map(w=>{const v=w.includes("e")?u:0,m=w.includes("s")?d:0;return s.jsx("circle",{cx:v,cy:m,r:4,fill:"#3b82f6",stroke:"white",strokeWidth:1,style:{cursor:`${w}-resize`},pointerEvents:"all",onMouseDown:z=>{z.stopPropagation(),a(z,w)}},w)})]}),!t&&n&&s.jsx("rect",{x:-2,y:-2,width:u+4,height:d+4,fill:"none",stroke:"#60a5fa",strokeWidth:1,strokeDasharray:"4 2",opacity:.5,pointerEvents:"none"})]})},Kce=({stickFigure:e,isSelected:t,isInSelectedLayer:n=!1,onSelect:r,onDragStart:i,onJointDragStart:a})=>{const{x:o,y:l,scale:c,color:u,strokeWidth:d,opacity:h,joints:p}=e,f=(g,y)=>{const w=p[g],v=p[y];return s.jsx("line",{x1:w.x*c,y1:w.y*c,x2:v.x*c,y2:v.y*c,stroke:u,strokeWidth:d,opacity:h,strokeLinecap:"round",style:{cursor:t?"move":"pointer"},pointerEvents:"all",onMouseDown:m=>{m.stopPropagation(),t?i(m):r()}},`${g}-${y}`)},b=g=>{const y=p[g];return s.jsx("circle",{cx:y.x*c,cy:y.y*c,r:t?5:3,fill:t?"#3b82f6":u,stroke:"white",strokeWidth:1,style:{cursor:t?"move":"pointer"},pointerEvents:"all",onMouseDown:w=>{w.stopPropagation(),t&&a(w,g)}},g)};return s.jsxs("g",{transform:`translate(${o}, ${l})`,style:{pointerEvents:"all"},children:[s.jsx("rect",{x:-50*c,y:-70*c,width:100*c,height:140*c,fill:"transparent",stroke:"none",pointerEvents:"all",onClick:g=>{g.stopPropagation(),r()},onMouseDown:g=>{t||(g.stopPropagation(),r())}}),s.jsx("circle",{cx:p.head.x*c,cy:p.head.y*c,r:10*c,fill:"none",stroke:u,strokeWidth:d,opacity:h,style:{cursor:t?"move":"pointer"},pointerEvents:"all",onMouseDown:g=>{g.stopPropagation(),t?i(g):r()}}),s.jsxs("g",{children:[f("neck","waist"),f("neck","leftShoulder"),f("leftShoulder","leftElbow"),f("leftElbow","leftHand"),f("neck","rightShoulder"),f("rightShoulder","rightElbow"),f("rightElbow","rightHand"),f("waist","leftHip"),f("leftHip","leftKnee"),f("leftKnee","leftFoot"),f("waist","rightHip"),f("rightHip","rightKnee"),f("rightKnee","rightFoot")]}),t&&s.jsxs(s.Fragment,{children:[b("head"),b("neck"),b("leftShoulder"),b("rightShoulder"),b("leftElbow"),b("rightElbow"),b("leftHand"),b("rightHand"),b("waist"),b("leftHip"),b("rightHip"),b("leftKnee"),b("rightKnee"),b("leftFoot"),b("rightFoot")]}),!t&&n&&s.jsx("rect",{x:-50*c-2,y:-70*c-2,width:100*c+4,height:140*c+4,fill:"none",stroke:"#60a5fa",strokeWidth:1,strokeDasharray:"4 2",opacity:.5,pointerEvents:"none"})]})},Xce=(e,t)=>({id:Date.now().toString(),x:e,y:t,scale:1,color:"#000000",strokeWidth:2,opacity:1,joints:{head:{x:0,y:-60},neck:{x:0,y:-40},leftShoulder:{x:-15,y:-35},rightShoulder:{x:15,y:-35},leftElbow:{x:-25,y:-15},rightElbow:{x:25,y:-15},leftHand:{x:-30,y:5},rightHand:{x:30,y:5},waist:{x:0,y:0},leftHip:{x:-10,y:5},rightHip:{x:10,y:5},leftKnee:{x:-15,y:30},rightKnee:{x:15,y:30},leftFoot:{x:-20,y:55},rightFoot:{x:20,y:55}}});var Ca=(e=>(e.SELECT="SELECT",e.HAND="HAND",e.PEN="PEN",e.ERASER="ERASER",e.TEXT="TEXT",e.MASK_PEN="MASK_PEN",e.SHAPE="SHAPE",e.STICK_FIGURE="STICK_FIGURE",e))(Ca||{});const Yce=fr.memo(({width:e,height:t,canvasData:n,onUpdate:r,isDark:i,activeTool:a,brushSettings:o,textSettings:l,eraserSettings:c,shapeSettings:u={type:"rectangle",color:"#3b82f6",fillMode:"stroke",strokeWidth:2,opacity:1},stickFigureSettings:d={color:"#000000",strokeWidth:2,opacity:1},viewZoom:h,activeLayerId:p,onSelectLayer:f,onSelectImage:b})=>{var Ne;const g=_.useRef(null),[y,w]=_.useState(!1),[v,m]=_.useState(!1),[z,C]=_.useState([]),[E,I]=_.useState(null),R=_.useRef(null),[A,O]=_.useState(null),[F,L]=_.useState(null),[X,T]=_.useState(null),[q,H]=_.useState(null),J=_.useRef(null),Z=_.useRef(null),[B,V]=_.useState(null),[N,j]=_.useState("");_.useEffect(()=>{b==null||b(B)},[B,b]);const[k,W]=_.useState(null),[M,Y]=_.useState(null),[se,ie]=_.useState(!1),[oe,re]=_.useState(null),[ee,pe]=_.useState(null),[we,Q]=_.useState(null),[me,ue]=_.useState(null),U=_.useRef({dx:0,dy:0}),G=_.useRef(null),[te,ge]=_.useState(null),ne=_.useCallback(ve=>{var Ie;const ke=(Ie=g.current)==null?void 0:Ie.getBoundingClientRect();return ke?{x:(ve.clientX-ke.left)/h,y:(ve.clientY-ke.top)/h}:{x:0,y:0}},[h]),le=_.useCallback(ve=>{switch(ve){case"serif":return'ui-serif, Georgia, Cambria, "Times New Roman", Times, serif';case"mono":return'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace';case"script":return'"Comic Sans MS", "Chalkboard SE", "Comic Neue", cursive';case"sans":default:return'ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif'}},[]),fe=_.useCallback((ve,ke=1)=>{let Ie;switch(ve){case"XL":Ie=36;break;case"L":Ie=24;break;case"S":Ie=14;break;case"M":default:Ie=16;break}return`${Ie*ke}px`},[]),be=_.useCallback(ve=>{if(ve.stopPropagation(),a==="PEN"||a==="MASK_PEN")w(!0),C([ne(ve)]);else if(a==="ERASER")m(!0);else if(a==="SHAPE"&&u){const ke=ne(ve);ie(!0),re(ke);const Ie={id:Date.now().toString(),type:u.type,x:ke.x,y:ke.y,width:0,height:0,color:u.color,fillMode:u.fillMode,strokeWidth:u.strokeWidth,opacity:u.opacity,rotation:0,layerId:p};pe(Ie)}else if(a==="STICK_FIGURE"&&d){const ke=ne(ve),Ie=Xce(ke.x,ke.y);Ie.color=d.color,Ie.strokeWidth=d.strokeWidth,Ie.opacity=d.opacity,Ie.layerId=p,r({stickFigures:[...n.stickFigures||[],Ie]}),Y(Ie.id)}else if(a==="TEXT"){ve.preventDefault();const ke=ne(ve),Ie=Date.now().toString(),Pe="输入文本",Te={id:Ie,x:ke.x,y:ke.y,content:Pe,color:l.color,fontSize:l.fontSize,fontFamily:l.fontFamily,align:l.align,opacity:l.opacity,scale:1,layerId:p};r({textElements:[...n.textElements,Te]}),H(Ie),J.current=Ie,I(Ie),j(Pe)}else a==="SELECT"&&(T(null),H(null),V(null),W(null),Y(null))},[a,ne,l,u,d,n.textElements,n.stickFigures,r]),de=_.useCallback((ve,ke,Ie,Pe,Te)=>{if(ve.stopPropagation(),a==="SELECT"||a==="HAND"||a==="TEXT"){if(ke==="image"){V(Ie),H(null),T(null);const Be=n.images.find(He=>He.id===Ie);Be!=null&&Be.layerId&&f&&f(Be.layerId)}else if(ke==="text"){H(Ie),J.current=Ie,V(null),T(null);const Be=n.textElements.find(He=>He.id===Ie);Be!=null&&Be.layerId&&f&&f(Be.layerId)}else if(ke==="stroke"){T(Ie),H(null),V(null);const Be=n.strokes.find(He=>He.id===Ie);Be!=null&&Be.layerId&&f&&f(Be.layerId)}a!=="TEXT"&&(O({type:ke,id:Ie,startX:ve.clientX,startY:ve.clientY,initialX:Pe,initialY:Te}),ke==="image"&&(U.current={dx:0,dy:0},ue({dx:0,dy:0})))}},[a,n.images,n.textElements,n.strokes,f]),$e=_.useCallback((ve,ke,Ie,Pe)=>{ve.stopPropagation(),ve.preventDefault(),L({id:ke,type:"image",handle:Ie,startX:ve.clientX,startY:ve.clientY,initial:{x:Pe.x,y:Pe.y,w:Pe.width,h:Pe.height,contentW:Pe.contentWidth,contentH:Pe.contentHeight,contentX:Pe.contentX,contentY:Pe.contentY}})},[]),ze=_.useCallback((ve,ke,Ie,Pe)=>{ve.stopPropagation(),ve.preventDefault(),L({id:ke,type:"text",handle:Ie,startX:ve.clientX,startY:ve.clientY,initial:{x:Pe.x,y:Pe.y,scale:Pe.scale??1}})},[]);_.useEffect(()=>{const ve=Ie=>{if(y){C(Pe=>[...Pe,ne(Ie)]);return}if(v){const Pe=ne(Ie),Te=c.size,Be=[];n.strokes.forEach(He=>{const Je=He.points.map(Re=>{const Ve=He.x+Re.x,Ze=He.y+Re.y;return Math.sqrt(Math.pow(Ve-Pe.x,2)+Math.pow(Ze-Pe.y,2))>=Te+He.width/2});if(Je.every(Re=>Re)){Be.push(He);return}if(Je.every(Re=>!Re))return;let Me=[];for(let Re=0;Re=2){const Ve=Me.map(Xe=>He.x+Xe.x),Ze=Me.map(Xe=>He.y+Xe.y),je=(Math.min(...Ve)+Math.max(...Ve))/2,Le=(Math.min(...Ze)+Math.max(...Ze))/2;Be.push({...He,id:`${He.id}-split-${Be.length}`,points:Me.map(Xe=>({x:He.x+Xe.x-je,y:He.y+Xe.y-Le})),x:je,y:Le})}Me=[]}if(Me.length>=2){const Re=Me.map(Le=>He.x+Le.x),Ve=Me.map(Le=>He.y+Le.y),Ze=(Math.min(...Re)+Math.max(...Re))/2,je=(Math.min(...Ve)+Math.max(...Ve))/2;Be.push({...He,id:`${He.id}-split-${Be.length}`,points:Me.map(Le=>({x:He.x+Le.x-Ze,y:He.y+Le.y-je})),x:Ze,y:je})}}),Be.length!==n.strokes.length&&r({strokes:Be});return}if(se&&oe&&ee){const Pe=ne(Ie),Te=Math.abs(Pe.x-oe.x),Be=Math.abs(Pe.y-oe.y),He=Math.min(Pe.x,oe.x),Je=Math.min(Pe.y,oe.y);pe({...ee,x:He,y:Je,width:Te,height:Be});return}if(we){const Pe=ne(Ie),Te=(n.stickFigures||[]).map(Be=>Be.id===we.figureId?{...Be,joints:{...Be.joints,[we.jointName]:{x:(Pe.x-Be.x)/Be.scale,y:(Pe.y-Be.y)/Be.scale}}}:Be);r({stickFigures:Te});return}if(F){Ie.stopPropagation();const Pe=(Ie.clientX-F.startX)/h,Te=(Ie.clientY-F.startY)/h;if(F.type==="text"){const{initial:Be,handle:He}=F,Je=Be.scale??1;let Me=0;if(He==="se"||He==="ne"||He==="sw"||He==="nw"){const Ze=Math.sqrt(Pe*Pe+Te*Te),je=He==="se"&&(Pe>0||Te>0)||He==="ne"&&(Pe>0||Te<0)||He==="sw"&&(Pe<0||Te>0)||He==="nw"&&(Pe<0||Te<0);Me=Ze*(je?.02:-.02)}else He==="e"?Me=Pe*.02:He==="w"?Me=-Pe*.02:He==="s"?Me=Te*.02:He==="n"&&(Me=-Te*.02);const Re=Math.max(.3,Math.min(5,Je+Me)),Ve=n.textElements.map(Ze=>Ze.id===F.id?{...Ze,scale:Re}:Ze);r({textElements:Ve})}else if(F.type==="image"){const{initial:Be,handle:He}=F,Je=Be.w??1,Me=Be.h??1,Re=Be.contentW??Je,Ve=Be.contentH??Me,Ze=Be.contentX??0,je=Be.contentY??0;let Le=Be.x,Xe=Be.y,qe=Je,tt=Me,Ye=Re,ct=Ve,pt=Ze,ht=je;if(He.length===2){const $t=Ie.ctrlKey||Ie.metaKey,jt=Je/Me;let Nt=Je,Yt=Me;if(He.includes("e")&&(Nt=Je+Pe),He.includes("w")&&(Nt=Je-Pe),He.includes("s")&&(Yt=Me+Te),He.includes("n")&&(Yt=Me-Te),Nt=Math.max(20,Nt),Yt=Math.max(20,Yt),$t){const Ht=Math.abs(Nt-Je)/Je,fn=Math.abs(Yt-Me)/Me;Ht>fn?(qe=Nt,tt=qe/jt):(tt=Yt,qe=tt*jt)}else qe=Nt,tt=Yt;He.includes("w")?Le=Be.x+(Je-qe):Le=Be.x,He.includes("n")?Xe=Be.y+(Me-tt):Xe=Be.y;const un=qe/Je,Tn=tt/Me;Ye=Re*un,ct=Ve*Tn,pt=Ze*un,ht=je*Tn}else He==="e"?qe=Math.max(20,Je+Pe):He==="s"?tt=Math.max(20,Me+Te):He==="w"?(qe=Math.max(20,Je-Pe),Le=Be.x+(Je-qe),pt=Ze-(Le-Be.x)):He==="n"&&(tt=Math.max(20,Me-Te),Xe=Be.y+(Me-tt),ht=je-(Xe-Be.y));const wt=n.images.map($t=>$t.id===F.id?{...$t,x:Le,y:Xe,width:qe,height:tt,contentWidth:Ye,contentHeight:ct,contentX:pt,contentY:ht}:$t);r({images:wt})}return}if(A){const Pe=(Ie.clientX-A.startX)/h,Te=(Ie.clientY-A.startY)/h;if(A.type==="image"){const Be=n.images.find(He=>He.id===A.id);if(Be){let Je=A.initialX+Pe,Me=A.initialY+Te;Je=Math.max(-Be.width+40,Math.min(e-40,Je)),Me=Math.max(-Be.height+40,Math.min(t-40,Me));const Re=Je-A.initialX,Ve=Me-A.initialY;U.current={dx:Re,dy:Ve},G.current==null&&(G.current=requestAnimationFrame(()=>{G.current=null,ue({...U.current})}))}}else if(A.type==="text"){const Be=n.textElements.map(He=>He.id===A.id?{...He,x:A.initialX+Pe,y:A.initialY+Te}:He);r({textElements:Be})}else if(A.type==="stroke")if((n.shapes||[]).find(He=>He.id===A.id)){const He=(n.shapes||[]).map(Je=>Je.id===A.id?{...Je,x:A.initialX+Pe,y:A.initialY+Te}:Je);r({shapes:He})}else if((n.stickFigures||[]).find(Je=>Je.id===A.id)){const Je=(n.stickFigures||[]).map(Me=>Me.id===A.id?{...Me,x:A.initialX+Pe,y:A.initialY+Te}:Me);r({stickFigures:Je})}else{const Je=n.strokes.map(Me=>Me.id===A.id?{...Me,x:A.initialX+Pe,y:A.initialY+Te}:Me);r({strokes:Je})}}},ke=()=>{if(y){if(w(!1),z.length>1){const Ie=z.map(Je=>Je.x),Pe=z.map(Je=>Je.y),Te=(Math.min(...Ie)+Math.max(...Ie))/2,Be=(Math.min(...Pe)+Math.max(...Pe))/2,He={id:Date.now().toString(),points:z.map(Je=>({x:Je.x-Te,y:Je.y-Be})),color:a==="MASK_PEN"?"#a855f7":o.color,width:a==="MASK_PEN"?20:o.width,opacity:a==="MASK_PEN"?.5:o.opacity,x:Te,y:Be,rotation:0,scale:1,layerId:p};r(a==="MASK_PEN"?{maskStrokes:[...n.maskStrokes||[],He]}:{strokes:[...n.strokes,He]})}C([])}if(v&&m(!1),se&&ee&&(ee.width>5&&ee.height>5&&r({shapes:[...n.shapes||[],ee]}),ie(!1),re(null),pe(null)),we&&Q(null),(A==null?void 0:A.type)==="image"){G.current!=null&&(cancelAnimationFrame(G.current),G.current=null);const Ie=U.current,Pe=n.images.map(Te=>Te.id===A.id?{...Te,x:A.initialX+Ie.dx,y:A.initialY+Ie.dy}:Te);r({images:Pe}),ue(null),U.current={dx:0,dy:0}}O(null),L(null)};return(y||v||A||F||se||we)&&(window.addEventListener("mousemove",ve),window.addEventListener("mouseup",ke)),()=>{window.removeEventListener("mousemove",ve),window.removeEventListener("mouseup",ke)}},[y,v,z,A,F,se,oe,ee,we,n.strokes,n.images,n.shapes,n.stickFigures,a,o,c,u,d,r,ne,h,e,t]),_.useEffect(()=>{if(E&&R.current){const ve=n.textElements.find(ke=>ke.id===E);ve&&(N!==ve.content&&j(ve.content),setTimeout(()=>{if(R.current)if(R.current.focus(),ve.content==="输入文本")R.current.select();else{const ke=R.current.value.length;R.current.setSelectionRange(ke,ke)}},0))}else j("")},[E,n.textElements]),_.useEffect(()=>{const ve=ke=>{var Te,Be,He,Je,Me;const Ie=ke.target;if(Ie.tagName==="TEXTAREA"||Ie.tagName==="INPUT"||Ie.isContentEditable)return;if(ke.key==="Delete"||ke.key==="Del"||ke.code==="Delete"||ke.key==="Backspace"||ke.code==="Backspace"){const Re=q||J.current||Z.current;if(Re){ke.preventDefault(),ke.stopPropagation(),(Te=ke.stopImmediatePropagation)==null||Te.call(ke);const Ve=n.textElements.filter(Ze=>Ze.id!==Re);r({textElements:Ve}),H(null),J.current=null,Z.current=null,I(null),j("");return}if(B){ke.preventDefault(),ke.stopPropagation(),(Be=ke.stopImmediatePropagation)==null||Be.call(ke);const Ve=n.images.filter(Ze=>Ze.id!==B);r({images:Ve}),V(null);return}if(X){ke.preventDefault(),ke.stopPropagation(),(He=ke.stopImmediatePropagation)==null||He.call(ke);const Ve=n.strokes.filter(Ze=>Ze.id!==X);r({strokes:Ve}),T(null);return}if(k){ke.preventDefault(),ke.stopPropagation(),(Je=ke.stopImmediatePropagation)==null||Je.call(ke);const Ve=(n.shapes||[]).filter(Ze=>Ze.id!==k);r({shapes:Ve}),W(null);return}if(M){ke.preventDefault(),ke.stopPropagation(),(Me=ke.stopImmediatePropagation)==null||Me.call(ke);const Ve=(n.stickFigures||[]).filter(Ze=>Ze.id!==M);r({stickFigures:Ve}),Y(null);return}}};return window.addEventListener("keydown",ve,!0),()=>{window.removeEventListener("keydown",ve,!0)}},[q,B,X,k,M,n.textElements,n.images,n.strokes,n.shapes,n.stickFigures,r]);const _e=a==="PEN"||a==="MASK_PEN"||a==="ERASER"||a==="SHAPE"||a==="STICK_FIGURE",Ee=_.useCallback(ve=>{const ke=n.layers||[],Ie=new Map(ke.map(Pe=>[Pe.id,Pe]));return ve.filter(Pe=>{if(!Pe.layerId)return!0;const Te=Ie.get(Pe.layerId);return(Te==null?void 0:Te.visible)!==!1})},[n.layers]);_.useCallback(()=>{const ve=n.layers||[],ke=new Map(ve.map(Pe=>[Pe.id,Pe])),Ie=[];return n.images.forEach(Pe=>{const Te=Pe.layerId?ke.get(Pe.layerId):null;(!Pe.layerId||(Te==null?void 0:Te.visible)!==!1)&&Ie.push({type:"image",data:Pe,layerId:Pe.layerId,zIndex:(Te==null?void 0:Te.zIndex)??0})}),n.strokes.forEach(Pe=>{const Te=Pe.layerId?ke.get(Pe.layerId):null;(!Pe.layerId||(Te==null?void 0:Te.visible)!==!1)&&Ie.push({type:"stroke",data:Pe,layerId:Pe.layerId,zIndex:(Te==null?void 0:Te.zIndex)??0})}),n.textElements.forEach(Pe=>{const Te=Pe.layerId?ke.get(Pe.layerId):null;(!Pe.layerId||(Te==null?void 0:Te.visible)!==!1)&&Ie.push({type:"text",data:Pe,layerId:Pe.layerId,zIndex:(Te==null?void 0:Te.zIndex)??0})}),(n.shapes||[]).forEach(Pe=>{const Te=Pe.layerId?ke.get(Pe.layerId):null;(!Pe.layerId||(Te==null?void 0:Te.visible)!==!1)&&Ie.push({type:"shape",data:Pe,layerId:Pe.layerId,zIndex:(Te==null?void 0:Te.zIndex)??0})}),(n.stickFigures||[]).forEach(Pe=>{const Te=Pe.layerId?ke.get(Pe.layerId):null;(!Pe.layerId||(Te==null?void 0:Te.visible)!==!1)&&Ie.push({type:"stickFigure",data:Pe,layerId:Pe.layerId,zIndex:(Te==null?void 0:Te.zIndex)??0})}),Ie.sort((Pe,Te)=>Pe.zIndex-Te.zIndex)},[n]);const Ce=_.useCallback(ve=>{if(!ve)return!0;const Ie=(n.layers||[]).find(Pe=>Pe.id===ve);return(Ie==null?void 0:Ie.locked)!==!0},[n.layers]),xe=_.useCallback(ve=>{if(ve.points.length===0)return{x:ve.x,y:ve.y,width:0,height:0};const ke=ve.points.map(Me=>ve.x+Me.x),Ie=ve.points.map(Me=>ve.y+Me.y),Pe=Math.min(...ke),Te=Math.max(...ke),Be=Math.min(...Ie),He=Math.max(...Ie),Je=Math.max(ve.width*2,10);return{x:Pe-Je,y:Be-Je,width:Te-Pe+Je*2,height:He-Be+Je*2}},[]);return _.useEffect(()=>{if(!E)return;const ve=Ie=>{const Pe=Ie.target;Pe.closest("[data-text-editor]")||Pe.closest(".absolute.inset-0")||(I(null),j(""))},ke=setTimeout(()=>{document.addEventListener("mousedown",ve,!0)},100);return()=>{clearTimeout(ke),document.removeEventListener("mousedown",ve,!0)}},[E]),s.jsxs("div",{className:"absolute inset-0 w-full h-full",style:{width:e,height:t},"data-text-editor":"canvas",onClick:ve=>{a==="SELECT"&&ve.target===ve.currentTarget&&(T(null),H(null),V(null),W(null),Y(null))},children:[Ee(n.images).map(ve=>{const ke=ve.contentWidth??ve.width,Ie=ve.contentHeight??ve.height,Pe=ve.contentX??0,Te=ve.contentY??0,Be=n.layers||[],He=ve.layerId?Be.find(Ve=>Ve.id===ve.layerId):null,Je=He?He.zIndex*10+20:20,Me=p&&ve.layerId===p,Re=(A==null?void 0:A.type)==="image"&&A.id===ve.id&&me;return s.jsx("div",{onMouseDown:Ve=>{Ce(ve.layerId)&&de(Ve,"image",ve.id,ve.x,ve.y)},className:`absolute select-none ${(a==="SELECT"||a==="HAND")&&Ce(ve.layerId)?"pointer-events-auto cursor-move":"pointer-events-none"}`,style:{left:ve.x,top:ve.y,width:ve.width,height:ve.height,opacity:ve.opacity,zIndex:Je,...Re?{transform:`translate(${me.dx}px, ${me.dy}px)`,willChange:"transform"}:{}},children:s.jsxs("div",{className:`w-full h-full relative ${B===ve.id?"ring-2 ring-blue-500":Me?"ring-2 ring-blue-400/50":""}`,style:{transformOrigin:"50% 50%",transform:`rotate(${ve.rotation??0}deg) scaleX(${ve.flipHorizontal?-1:1}) scaleY(${ve.flipVertical?-1:1})`},children:[s.jsx("div",{className:"absolute inset-0 overflow-hidden",children:s.jsx("img",{src:ve.src,className:"absolute max-w-none pointer-events-none",style:{width:ke,height:Ie,left:Pe,top:Te},alt:"User Element"})}),B===ve.id&&a==="SELECT"&&s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"absolute -top-1 -left-1 w-3 h-3 bg-white border border-blue-500 rounded-full cursor-nw-resize z-50",onMouseDown:Ve=>$e(Ve,ve.id,"nw",ve)}),s.jsx("div",{className:"absolute -top-1 -right-1 w-3 h-3 bg-white border border-blue-500 rounded-full cursor-ne-resize z-50",onMouseDown:Ve=>$e(Ve,ve.id,"ne",ve)}),s.jsx("div",{className:"absolute -bottom-1 -left-1 w-3 h-3 bg-white border border-blue-500 rounded-full cursor-sw-resize z-50",onMouseDown:Ve=>$e(Ve,ve.id,"sw",ve)}),s.jsx("div",{className:"absolute -bottom-1 -right-1 w-3 h-3 bg-white border border-blue-500 rounded-full cursor-se-resize z-50",onMouseDown:Ve=>$e(Ve,ve.id,"se",ve)}),s.jsx("div",{className:"absolute top-1/2 -translate-y-1/2 -left-1 w-3 h-3 bg-white border border-blue-500 rounded-full cursor-ew-resize z-50",onMouseDown:Ve=>$e(Ve,ve.id,"w",ve)}),s.jsx("div",{className:"absolute top-1/2 -translate-y-1/2 -right-1 w-3 h-3 bg-white border border-blue-500 rounded-full cursor-ew-resize z-50",onMouseDown:Ve=>$e(Ve,ve.id,"e",ve)}),s.jsx("div",{className:"absolute left-1/2 -translate-x-1/2 -top-1 w-3 h-3 bg-white border border-blue-500 rounded-full cursor-ns-resize z-50",onMouseDown:Ve=>$e(Ve,ve.id,"n",ve)}),s.jsx("div",{className:"absolute left-1/2 -translate-x-1/2 -bottom-1 w-3 h-3 bg-white border border-blue-500 rounded-full cursor-ns-resize z-50",onMouseDown:Ve=>$e(Ve,ve.id,"s",ve)})]})]})},ve.id)}),Ee(n.strokes).map(ve=>{const ke=xe(ve),Ie=n.layers||[],Pe=ve.layerId?Ie.find(He=>He.id===ve.layerId):null,Te=Pe?Pe.zIndex*10+30:30,Be=p&&ve.layerId===p;return s.jsx("svg",{className:"absolute inset-0 w-full h-full pointer-events-none",style:{zIndex:Te},children:s.jsxs("g",{children:[a==="SELECT"&&Ce(ve.layerId)&&s.jsx("rect",{x:ke.x,y:ke.y,width:ke.width,height:ke.height,fill:"transparent",stroke:"none",className:"cursor-pointer pointer-events-auto",onMouseDown:He=>{Ce(ve.layerId)&&(He.stopPropagation(),de(He,"stroke",ve.id,ve.x,ve.y))}}),(X===ve.id||Be)&&s.jsx("path",{d:`M ${ve.points.map(He=>`${ve.x+He.x} ${ve.y+He.y}`).join(" L ")}`,fill:"none",stroke:X===ve.id?"#3b82f6":"#60a5fa",strokeWidth:ve.width+4,strokeLinecap:"round",opacity:X===ve.id?.5:.3,pointerEvents:"none"}),s.jsx("path",{d:`M ${ve.points.map(He=>`${ve.x+He.x} ${ve.y+He.y}`).join(" L ")}`,fill:"none",stroke:ve.color,strokeWidth:ve.width,strokeLinecap:"round",strokeOpacity:ve.opacity,pointerEvents:"none"})]})},ve.id)}),Ee(n.shapes||[]).map(ve=>{const ke=n.layers||[],Ie=ve.layerId?ke.find(Be=>Be.id===ve.layerId):null,Pe=Ie?Ie.zIndex*10+30:30,Te=p&&ve.layerId===p;return s.jsx("svg",{className:"absolute inset-0 w-full h-full pointer-events-none",style:{zIndex:Pe},children:s.jsx(XE,{shape:ve,isSelected:k===ve.id,isInSelectedLayer:!!Te,onSelect:()=>{a==="SELECT"&&Ce(ve.layerId)&&(W(ve.id),H(null),V(null),T(null),Y(null),ve.layerId&&f&&f(ve.layerId))},onDragStart:Be=>{a==="SELECT"&&Ce(ve.layerId)&&O({type:"stroke",id:ve.id,startX:Be.clientX,startY:Be.clientY,initialX:ve.x,initialY:ve.y})},onResizeStart:(Be,He)=>{Be.stopPropagation()}})},ve.id)}),Ee(n.stickFigures||[]).map(ve=>{const ke=n.layers||[],Ie=ve.layerId?ke.find(Be=>Be.id===ve.layerId):null,Pe=Ie?Ie.zIndex*10+30:30,Te=p&&ve.layerId===p;return s.jsx("svg",{className:"absolute inset-0 w-full h-full pointer-events-none",style:{zIndex:Pe},children:s.jsx(Kce,{stickFigure:ve,isSelected:M===ve.id,isInSelectedLayer:!!Te,onSelect:()=>{a==="SELECT"&&Ce(ve.layerId)&&(Y(ve.id),H(null),V(null),T(null),W(null),ve.layerId&&f&&f(ve.layerId))},onDragStart:Be=>{a==="SELECT"&&Ce(ve.layerId)&&O({type:"stroke",id:ve.id,startX:Be.clientX,startY:Be.clientY,initialX:ve.x,initialY:ve.y})},onJointDragStart:(Be,He)=>{a==="SELECT"&&Ce(ve.layerId)&&(Be.stopPropagation(),Q({figureId:ve.id,jointName:He}))}})},ve.id)}),s.jsxs("svg",{ref:g,className:`absolute inset-0 w-full h-full z-[1000] ${a==="ERASER"?"cursor-cell":a==="SHAPE"||a==="STICK_FIGURE"||_e?"cursor-crosshair":a==="TEXT"?"cursor-text":"cursor-default"} ${_e||a==="TEXT"&&!E?"pointer-events-auto":"pointer-events-none"}`,onMouseDown:ve=>be(ve),onMouseMove:ve=>{a==="ERASER"&&ge(ne(ve))},onMouseLeave:()=>{a==="ERASER"&&ge(null)},children:[(Ne=n.maskStrokes)==null?void 0:Ne.map(ve=>s.jsx("path",{d:`M ${ve.points.map(ke=>`${ve.x+ke.x} ${ve.y+ke.y}`).join(" L ")}`,fill:"none",stroke:"#a855f7",strokeWidth:ve.width,strokeLinecap:"round",strokeOpacity:.4},ve.id)),y&&s.jsx("path",{d:`M ${z.map(ve=>`${ve.x} ${ve.y}`).join(" L ")}`,fill:"none",stroke:a==="MASK_PEN"?"#a855f7":o.color,strokeWidth:a==="MASK_PEN"?20:o.width,strokeOpacity:a==="MASK_PEN"?.5:o.opacity,strokeLinecap:"round"}),ee&&s.jsx(XE,{shape:ee,isSelected:!1,isInSelectedLayer:!1,onSelect:()=>{},onDragStart:()=>{},onResizeStart:()=>{}}),a==="ERASER"&&te&&s.jsx("circle",{cx:te.x,cy:te.y,r:c.size,fill:"none",stroke:"#ef4444",strokeWidth:2,strokeDasharray:"4 2",opacity:.6,pointerEvents:"none"})]}),Ee(n.textElements).map(ve=>{const ke=n.layers||[],Ie=ve.layerId?ke.find(Be=>Be.id===ve.layerId):null,Pe=Ie?Ie.zIndex*10+40:40,Te=p&&ve.layerId===p;return s.jsx("div",{onMouseEnter:()=>{Z.current=ve.id},onMouseLeave:()=>{Z.current===ve.id&&(Z.current=null)},onMouseDown:Be=>{Ce(ve.layerId)&&de(Be,"text",ve.id,ve.x,ve.y)},onDoubleClick:Be=>{(a==="SELECT"||a==="TEXT")&&Ce(ve.layerId)&&(Be.stopPropagation(),I(ve.id))},className:`absolute ${q===ve.id&&E!==ve.id?"ring-1 ring-blue-500 bg-blue-500/10 select-none":Te&&E!==ve.id?"ring-1 ring-blue-400/50 bg-blue-400/5 select-none":E===ve.id?"":"select-none"} ${E===ve.id?"pointer-events-auto cursor-text":(a==="SELECT"||a==="HAND"||a==="TEXT")&&Ce(ve.layerId)?"pointer-events-auto cursor-move":"pointer-events-none"}`,style:{left:ve.x,top:ve.y,color:ve.color,opacity:ve.opacity,zIndex:Pe,transform:`translateX(${ve.align==="center"?"-50%":ve.align==="right"?"-100%":"0"})`},children:s.jsxs("div",{className:"relative inline-block",style:{transform:`scale(${ve.scale??1})`,transformOrigin:ve.align==="center"?"center":ve.align==="right"?"right":"left"},children:[E===ve.id?s.jsx("div",{"data-text-editor":"container",onMouseDown:Be=>Be.stopPropagation(),children:s.jsx("textarea",{ref:R,value:N,onChange:Be=>{Be.stopPropagation(),j(Be.target.value)},onFocus:Be=>{Be.stopPropagation()},onClick:Be=>{Be.stopPropagation(),R.current&&R.current.focus()},onMouseDown:Be=>{Be.stopPropagation(),Be.preventDefault()},"data-text-editor":"textarea",className:"bg-transparent border-none outline-none resize-none overflow-hidden whitespace-pre p-0 m-0",autoFocus:!0,style:{color:ve.color,fontFamily:le(ve.fontFamily),fontSize:fe(ve.fontSize,ve.scale??1),textAlign:ve.align,minWidth:"100px",height:"auto",lineHeight:"1.2",boxSizing:"content-box",textShadow:"0 1px 2px rgba(0,0,0,0.3)"},onBlur:Be=>{I(null);const He=Be.target.value;if(He.trim()){const Je=n.textElements.map(Me=>Me.id===ve.id?{...Me,content:He}:Me);r({textElements:Je})}else{const Je=n.textElements.filter(Me=>Me.id!==ve.id);r({textElements:Je})}j("")},onKeyDown:Be=>{if(Be.stopPropagation(),Be.key==="Escape")Be.preventDefault(),I(null),j("");else if(Be.key==="Delete"||Be.key==="Backspace"){const He=Be.target,Je=He.selectionStart||0,Me=He.selectionEnd||0;if(Je===Me){if(Je>0&&Be.key==="Backspace"){Be.preventDefault();const Re=N.slice(0,Je-1)+N.slice(Je);j(Re),setTimeout(()=>{R.current&&(R.current.selectionStart=Je-1,R.current.selectionEnd=Je-1)},0)}else if(Je{R.current&&(R.current.selectionStart=Je,R.current.selectionEnd=Je)},0)}}}})}):s.jsx("span",{style:{fontFamily:le(ve.fontFamily),fontSize:fe(ve.fontSize,1)},className:"font-bold drop-shadow-md whitespace-pre",children:ve.content}),q===ve.id&&a==="SELECT"&&!E&&s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"absolute -top-1 -left-1 w-3 h-3 bg-white border border-blue-500 rounded-full cursor-nw-resize z-50",onMouseDown:Be=>ze(Be,ve.id,"nw",ve)}),s.jsx("div",{className:"absolute -top-1 -right-1 w-3 h-3 bg-white border border-blue-500 rounded-full cursor-ne-resize z-50",onMouseDown:Be=>ze(Be,ve.id,"ne",ve)}),s.jsx("div",{className:"absolute -bottom-1 -left-1 w-3 h-3 bg-white border border-blue-500 rounded-full cursor-sw-resize z-50",onMouseDown:Be=>ze(Be,ve.id,"sw",ve)}),s.jsx("div",{className:"absolute -bottom-1 -right-1 w-3 h-3 bg-white border border-blue-500 rounded-full cursor-se-resize z-50",onMouseDown:Be=>ze(Be,ve.id,"se",ve)}),s.jsx("div",{className:"absolute top-1/2 -translate-y-1/2 -left-1 w-3 h-3 bg-white border border-blue-500 rounded-full cursor-ew-resize z-50",onMouseDown:Be=>ze(Be,ve.id,"w",ve)}),s.jsx("div",{className:"absolute top-1/2 -translate-y-1/2 -right-1 w-3 h-3 bg-white border border-blue-500 rounded-full cursor-ew-resize z-50",onMouseDown:Be=>ze(Be,ve.id,"e",ve)}),s.jsx("div",{className:"absolute left-1/2 -translate-x-1/2 -top-1 w-3 h-3 bg-white border border-blue-500 rounded-full cursor-ns-resize z-50",onMouseDown:Be=>ze(Be,ve.id,"n",ve)}),s.jsx("div",{className:"absolute left-1/2 -translate-x-1/2 -bottom-1 w-3 h-3 bg-white border border-blue-500 rounded-full cursor-ns-resize z-50",onMouseDown:Be=>ze(Be,ve.id,"s",ve)})]})]})},ve.id)})]})},(e,t)=>!(e.width!==t.width||e.height!==t.height||e.isDark!==t.isDark||e.activeTool!==t.activeTool||e.viewZoom!==t.viewZoom||e.activeLayerId!==t.activeLayerId||e.canvasData!==t.canvasData||e.brushSettings!==t.brushSettings||e.textSettings!==t.textSettings||e.eraserSettings!==t.eraserSettings||e.shapeSettings!==t.shapeSettings||e.stickFigureSettings!==t.stickFigureSettings||e.onUpdate!==t.onUpdate||e.onSelectLayer!==t.onSelectLayer||e.onSelectImage!==t.onSelectImage)),Jce=({layers:e,selectedLayerId:t,onSelectLayer:n,onUpdateLayer:r,onUpdateLayers:i,onDeleteLayer:a,onMoveLayer:o,onCreateLayer:l,isDark:c})=>{const[u,d]=_.useState(null),[h,p]=_.useState(""),[f,b]=_.useState(null),[g,y]=_.useState(null),w=[...e].sort((O,F)=>F.zIndex-O.zIndex),v=O=>{d(O.id),p(O.name)},m=()=>{u&&h.trim()&&r(u,{name:h.trim()}),d(null),p("")},z=()=>{d(null),p("")},C=(O,F)=>{O.stopPropagation(),b(F),O.dataTransfer.effectAllowed="move",O.dataTransfer.setData("text/plain",F)},E=(O,F)=>{O.preventDefault(),O.stopPropagation(),O.dataTransfer.dropEffect="move",f&&f!==F&&y(F)},I=()=>{y(null)},R=(O,F)=>{if(O.preventDefault(),O.stopPropagation(),!f||f===F){b(null),y(null);return}const L=e.find(T=>T.id===f),X=e.find(T=>T.id===F);if(L&&X){const T=L.zIndex;i?i([{layerId:f,updates:{zIndex:X.zIndex}},{layerId:F,updates:{zIndex:T}}]):(r(f,{zIndex:X.zIndex}),setTimeout(()=>{r(F,{zIndex:T})},0))}b(null),y(null)},A=()=>{b(null),y(null)};return s.jsxs("div",{className:`h-32 flex flex-col border-t ${c?"bg-zinc-900 border-zinc-800":"bg-zinc-50 border-zinc-200"}`,onMouseDown:O=>O.stopPropagation(),children:[s.jsxs("div",{className:`h-8 flex items-center justify-between px-3 border-b ${c?"border-zinc-800":"border-zinc-200"}`,children:[s.jsx("span",{className:`text-xs font-medium ${c?"text-zinc-300":"text-zinc-700"}`,children:"图层管理"}),s.jsxs("button",{onClick:l,className:`flex items-center gap-1 px-2 py-0.5 rounded text-[10px] transition-colors ${c?"bg-zinc-800 hover:bg-zinc-700 text-zinc-300":"bg-zinc-200 hover:bg-zinc-300 text-zinc-700"}`,children:[s.jsx(Xi,{size:12}),"新建图层"]})]}),s.jsx("div",{className:"flex-1 overflow-x-auto overflow-y-hidden",children:w.length===0?s.jsx("div",{className:`h-full flex items-center justify-center text-xs ${c?"text-zinc-500":"text-zinc-400"}`,children:'暂无图层,点击"新建图层"开始'}):s.jsx("div",{className:"h-full flex items-center gap-2 px-3 py-2",children:w.map(O=>s.jsxs("div",{className:`flex-shrink-0 w-32 h-full flex flex-col rounded border-2 transition-all ${t===O.id?"border-blue-500 bg-blue-500/20":g===O.id?"border-blue-500 bg-blue-500/10":f===O.id?"border-zinc-500 opacity-50":c?"border-zinc-700 bg-zinc-800 hover:border-zinc-600":"border-zinc-300 bg-white hover:border-zinc-400"}`,onClick:()=>n==null?void 0:n(O.id),onDragOver:F=>E(F,O.id),onDragLeave:I,onDrop:F=>R(F,O.id),children:[s.jsx("div",{className:"flex-1 flex items-center justify-center px-2 py-1 cursor-move select-none",draggable:!0,onDragStart:F=>{F.stopPropagation(),C(F,O.id)},onDragEnd:A,onMouseDown:F=>{F.stopPropagation()},children:u===O.id?s.jsx("input",{type:"text",value:h,onChange:F=>p(F.target.value),onKeyDown:F=>{F.key==="Enter"&&m(),F.key==="Escape"&&z(),F.stopPropagation()},onClick:F=>F.stopPropagation(),className:`w-full px-1 py-0.5 text-xs text-center rounded border ${c?"bg-zinc-700 border-zinc-600 text-zinc-200":"bg-white border-zinc-300 text-zinc-800"}`,autoFocus:!0}):s.jsx("span",{className:`text-xs truncate ${c?"text-zinc-300":"text-zinc-700"}`,children:O.name})}),s.jsx("div",{className:`flex items-center justify-center gap-1 px-1 py-1 border-t ${c?"border-zinc-700":"border-zinc-200"}`,draggable:!1,onMouseDown:F=>F.stopPropagation(),children:u===O.id?s.jsxs(s.Fragment,{children:[s.jsx("button",{onClick:F=>{F.stopPropagation(),m()},className:"p-0.5 text-green-500 hover:text-green-400",children:s.jsx(Eo,{size:12})}),s.jsx("button",{onClick:F=>{F.stopPropagation(),z()},className:"p-0.5 text-red-500 hover:text-red-400",children:s.jsx(Qr,{size:12})})]}):s.jsxs(s.Fragment,{children:[s.jsx("button",{onClick:F=>{F.stopPropagation(),r(O.id,{visible:!O.visible})},className:`p-0.5 rounded transition-colors ${O.visible?c?"text-zinc-400 hover:text-zinc-200":"text-zinc-600 hover:text-zinc-800":"text-red-500 hover:text-red-400"}`,title:O.visible?"隐藏":"显示",children:O.visible?s.jsx(cl,{size:12}):s.jsx(nm,{size:12})}),s.jsx("button",{onClick:F=>{F.stopPropagation(),v(O)},className:`p-0.5 ${c?"text-zinc-500 hover:text-zinc-300":"text-zinc-400 hover:text-zinc-600"}`,title:"重命名",children:s.jsx(R5,{size:12})}),s.jsx("button",{onClick:F=>{F.stopPropagation(),confirm(`确定要删除图层"${O.name}"吗?该图层上的所有元素也会被删除。`)&&a(O.id)},className:"p-0.5 rounded text-red-500 hover:text-red-400 transition-colors",title:"删除",children:s.jsx(Zi,{size:12})})]})})]},O.id))})})]})},Df=({tool:e,activeTool:t,onClick:n,icon:r,isDark:i,title:a})=>{const o=e===t;return s.jsx("button",{type:"button",title:a,onClick:l=>{l.stopPropagation(),n()},className:`w-7 h-7 flex items-center justify-center rounded-lg transition-colors ${o?i?"bg-blue-600 text-white":"bg-black text-white":i?"text-zinc-400 hover:text-zinc-100 hover:bg-zinc-800":"text-zinc-600 hover:text-zinc-800 hover:bg-zinc-200"}`,children:r})},D1=({color:e,onChange:t,isDark:n})=>{const r=["#ef4444","#f97316","#eab308","#22c55e","#06b6d4","#3b82f6","#8b5cf6","#ec4899","#ffffff","#000000"];return s.jsx("div",{className:"flex items-center gap-1",children:r.map(i=>s.jsx("button",{onClick:a=>{a.stopPropagation(),t(i)},className:`w-5 h-5 rounded-full border-2 transition-all ${e===i?n?"border-blue-500 scale-110":"border-black scale-110":n?"border-zinc-600 hover:border-zinc-500":"border-zinc-300 hover:border-zinc-400"}`,style:{backgroundColor:i}},i))})},YE=({size:e,onChange:t,isDark:n})=>{const r=[2,4,8];return s.jsx("div",{className:"flex items-center gap-1",children:r.map(i=>s.jsxs("button",{onClick:a=>{a.stopPropagation(),t(i)},className:`px-2 py-0.5 rounded text-[10px] transition-colors ${e===i?n?"bg-blue-600 text-white":"bg-black text-white":n?"bg-zinc-800 text-zinc-400 hover:bg-zinc-700":"bg-zinc-200 text-zinc-600 hover:bg-zinc-300"}`,children:[i,"px"]},i))})},Zce=({node:e,isDark:t,updateNode:n,deleteNode:r,viewZoom:i,connections:a,nodes:o,setNodes:l,setConnections:c,generateId:u})=>{var oe,re;const d=_.useMemo(()=>a.filter(ee=>ee.to===e.id).map(ee=>o.find(pe=>pe.id===ee.from&&pe.type==="input-image")).filter(ee=>ee!=null),[a,o,e.id]),h=((oe=e.settings)==null?void 0:oe.canvasData)||{strokes:[],maskStrokes:[],textElements:[],images:[],backgroundColor:"transparent",aspectRatio:"1:1",width:e.width,height:e.height},p=_.useRef(new Set);_.useEffect(()=>{if(!d.length)return;const ee=[],pe=[],we=[];d.forEach((Q,me)=>{if(!Q.content||p.current.has(Q.id))return;p.current.add(Q.id);const ue=(async()=>{let U;try{U=await SP(Q.content)}catch(G){console.error("[CanvasNode] 图片压缩失败,使用原图:",G),U=Q.content}return new Promise(G=>{const te=new Image;te.onload=()=>{const ge=e.width*.7,ne=e.height*.7;let le=te.width,fe=te.height;const be=ge/te.width,de=ne/te.height,$e=Math.min(be,de,1);le=te.width*$e,fe=te.height*$e;const ze=(e.width-le)/2,_e=(e.height-fe)/2,Ee=me*30,Ce=me*30,xe=`layer-image-${Q.id}-${Date.now()}`,Ne=h.layers||[],ve=Ne.length>0?Math.max(...Ne.map(Pe=>Pe.zIndex)):-1,ke={id:xe,name:`图片 ${me+1}`,visible:!0,locked:!1,zIndex:ve+1+me},Ie={id:`imported-${Q.id}-${Date.now()}`,x:ze+Ee,y:_e+Ce,width:le,height:fe,src:U,opacity:1,rotation:0,contentWidth:void 0,contentHeight:void 0,contentX:0,contentY:0,layerId:xe};ee.push(Ie),pe.push(ke),G()},te.onerror=()=>{console.error("[CanvasNode] 图片加载失败:",Q.id),G()},te.src=U})})();we.push(ue)}),Promise.all(we).then(()=>{ee.length>0&&n(e.id,{settings:{...e.settings,canvasData:{...h,images:[...h.images,...ee],layers:[...h.layers||[],...pe]}}})})},[d.map(ee=>`${ee.id}-${ee.content}`).join(","),e.width,e.height,e.id,e.settings,h,n]),_.useEffect(()=>{const ee=new Set(d.map(pe=>pe.id));p.current.forEach(pe=>{ee.has(pe)||p.current.delete(pe)})},[d.map(ee=>ee.id).join(",")]);const f=_.useMemo(()=>a.filter(ee=>ee.from===e.id).map(ee=>o.find(pe=>pe.id===ee.to&&pe.type==="input-image")).filter(ee=>ee!=null),[a,o,e.id]),b=_.useRef(new Set);_.useEffect(()=>{if(!f.length){b.current.clear();return}const ee=f.map(Q=>Q.id),pe=ee.filter(Q=>!b.current.has(Q));if(pe.length>0){if(!(h.strokes.length>0||h.textElements.length>0||h.images.length>0)){pe.forEach(ue=>b.current.add(ue));return}pe.forEach(ue=>b.current.add(ue));const me=f.filter(ue=>pe.includes(ue.id));(async()=>{try{const ue=await lb(h,e.width,e.height,!1,!1);me.forEach(U=>{n(U.id,{content:ue})})}catch(ue){console.error("[CanvasNode] 自动更新下游图片输入节点失败:",ue)}})()}const we=new Set(ee);b.current.forEach(Q=>{we.has(Q)||b.current.delete(Q)})},[f.map(ee=>ee.id).join(","),e.width,e.height,n]);const[g,y]=_.useState(Ca.SELECT),[w,v]=_.useState(null),[m,z]=_.useState(!1),[C,E]=_.useState(null),[I,R]=_.useState({color:"#ef4444",width:4,opacity:1}),[A,O]=_.useState({color:"#ffffff",fontFamily:"sans",fontSize:"M",align:"left",opacity:1}),[F,L]=_.useState({size:20}),[X,T]=_.useState({type:"rectangle",color:"#3b82f6",fillMode:"stroke",strokeWidth:2,opacity:1}),[q,H]=_.useState({color:"#000000",strokeWidth:2,opacity:1});_.useEffect(()=>{const ee=pe=>{var Q;if(pe.key!=="t"&&pe.key!=="T")return;const we=pe.target;(Q=we==null?void 0:we.closest)!=null&&Q.call(we,'input, textarea, [contenteditable="true"]')||(pe.preventDefault(),pe.stopPropagation(),y(Ca.TEXT))};return window.addEventListener("keydown",ee,!0),()=>window.removeEventListener("keydown",ee,!0)},[]);const J=_.useCallback(ee=>{n(e.id,{settings:{...e.settings,canvasData:{...h,...ee}}})},[e.id,e.settings,h,n]);_.useEffect(()=>{if(!h.layers||h.layers.length===0){const ee={id:"layer-default",name:"图层 1",visible:!0,locked:!1,zIndex:0};n(e.id,{settings:{...e.settings,canvasData:{...h,layers:[ee]}}})}},[]);const Z=_.useMemo(()=>{const ee=h.layers||[];if(C){const pe=ee.find(we=>we.id===C);if(pe&&pe.visible&&!pe.locked)return pe}return ee.filter(pe=>pe.visible&&!pe.locked).sort((pe,we)=>we.zIndex-pe.zIndex)[0]||ee[0]},[h.layers,C]),B=_.useCallback((ee,pe)=>{const Q=(h.layers||[]).map(me=>me.id===ee?{...me,...pe}:me);J({layers:Q})},[h.layers,J]),V=_.useCallback(ee=>{const pe=h.layers||[],we=new Map(ee.map(me=>[me.layerId,me.updates])),Q=pe.map(me=>{const ue=we.get(me.id);return ue?{...me,...ue}:me});J({layers:Q})},[h.layers,J]),N=_.useCallback(ee=>{const we=(h.layers||[]).filter(te=>te.id!==ee),Q=h.strokes.filter(te=>te.layerId!==ee),me=h.textElements.filter(te=>te.layerId!==ee),ue=h.images.filter(te=>te.layerId!==ee),U=(h.shapes||[]).filter(te=>te.layerId!==ee),G=(h.stickFigures||[]).filter(te=>te.layerId!==ee);J({layers:we,strokes:Q,textElements:me,images:ue,shapes:U,stickFigures:G})},[h,J]),j=_.useCallback((ee,pe)=>{const we=h.layers||[],Q=[...we].sort((ue,U)=>U.zIndex-ue.zIndex),me=Q.findIndex(ue=>ue.id===ee);if(me!==-1){if(pe==="up"&&me>0){const ue=Q[me-1],U=Q[me],G=U.zIndex,te=we.map(ge=>ge.id===U.id?{...ge,zIndex:ue.zIndex}:ge.id===ue.id?{...ge,zIndex:G}:ge);J({layers:te})}else if(pe==="down"&&mege.id===U.id?{...ge,zIndex:ue.zIndex}:ge.id===ue.id?{...ge,zIndex:G}:ge);J({layers:te})}}},[h.layers,J]),k=_.useCallback(()=>{const ee=h.layers||[],pe=ee.length>0?Math.max(...ee.map(me=>me.zIndex)):-1,we=`layer-${Date.now()}`,Q={id:we,name:`图层 ${ee.length+1}`,visible:!0,locked:!1,zIndex:pe+1};J({layers:[...ee,Q]}),E(we)},[h.layers,J]),W=_.useCallback(ee=>{if(!w)return;const pe=(ee%360+360)%360,we=h.images.map(Q=>Q.id===w?{...Q,rotation:pe}:Q);J({images:we})},[w,h.images,J]);_.useCallback(ee=>{if(!w)return;const pe=h.images.find(we=>we.id===w);W(((pe==null?void 0:pe.rotation)??0)+ee)},[w,h.images,W]);const M=_.useCallback(()=>{if(!w)return;const ee=h.images.map(pe=>pe.id===w?{...pe,flipHorizontal:!pe.flipHorizontal}:pe);J({images:ee})},[w,h.images,J]),Y=_.useCallback(()=>{if(!w)return;const ee=h.images.map(pe=>pe.id===w?{...pe,flipVertical:!pe.flipVertical}:pe);J({images:ee})},[w,h.images,J]),se=_.useCallback(ee=>{E(ee)},[]),ie=_.useCallback(async()=>{try{const ee=await lb(h,e.width,e.height,!1,!0),pe=document.createElement("a");pe.href=ee,pe.download=`canvas-${e.id}.png`,pe.click();const we=u(),me=Ms(we,"input-image",e.x+e.width+60,e.y,void 0,{ratio:h.aspectRatio||"1:1"},o);l(ue=>[...ue,{...me,content:ee}])}catch(ee){console.error("[CanvasNode] 下载画板失败:",ee)}},[h,e.width,e.height,e.id,e.x,e.y,u,l]);return s.jsxs("div",{className:`relative w-full h-full flex flex-col rounded-xl overflow-hidden ${t?"bg-zinc-900":"bg-zinc-100"}`,children:[s.jsx("div",{className:`h-6 flex-shrink-0 border-b ${t?"bg-zinc-900/90 border-zinc-800":"bg-zinc-50 border-zinc-200"}`,title:"画板节点"}),s.jsxs("div",{className:"flex-1 relative overflow-hidden",style:{backgroundColor:h.backgroundColor==="transparent"?"transparent":h.backgroundColor||(t?"#171717":"#f4f4f5")},children:[s.jsx("div",{className:"absolute inset-0 opacity-10 pointer-events-none",style:{backgroundImage:"radial-gradient(#fff 1px, transparent 1px)",backgroundSize:"20px 20px"}}),d.length>0&&((re=d[0])==null?void 0:re.content)&&h.images.length===0&&s.jsx("img",{src:d[0].content,className:"absolute inset-0 w-full h-full object-contain opacity-20 pointer-events-none",alt:"源图片背景"}),s.jsx(Yce,{width:e.width,height:e.height-64,canvasData:h,onUpdate:J,isDark:t,activeTool:g,brushSettings:I,textSettings:A,eraserSettings:F,shapeSettings:X,stickFigureSettings:q,viewZoom:i,activeLayerId:Z==null?void 0:Z.id,onSelectLayer:se,onSelectImage:v})]}),s.jsxs("div",{className:`h-10 flex items-center justify-center gap-2 px-3 border-t ${t?"bg-zinc-900/90 border-zinc-800":"bg-zinc-50 border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center gap-1",children:[s.jsx(Df,{tool:Ca.SELECT,activeTool:g,onClick:()=>y(Ca.SELECT),icon:s.jsx(A5,{size:16}),isDark:t}),s.jsx(Df,{tool:Ca.PEN,activeTool:g,onClick:()=>y(Ca.PEN),icon:s.jsx(T5,{size:16}),isDark:t}),s.jsx(Df,{tool:Ca.SHAPE,activeTool:g,onClick:()=>y(Ca.SHAPE),icon:s.jsx(Ih,{size:16}),isDark:t}),s.jsx(Df,{tool:Ca.STICK_FIGURE,activeTool:g,onClick:()=>y(Ca.STICK_FIGURE),icon:s.jsx(hd,{size:16}),isDark:t}),s.jsx(Df,{tool:Ca.TEXT,activeTool:g,onClick:()=>y(Ca.TEXT),icon:s.jsx(Lv,{size:16}),isDark:t,title:"文字注释 (T)"}),s.jsx(Df,{tool:Ca.ERASER,activeTool:g,onClick:()=>y(Ca.ERASER),icon:s.jsx(gb,{size:16}),isDark:t})]}),w&&g===Ca.SELECT&&(()=>{const ee=h.images.find(we=>we.id===w),pe=ee?((ee.rotation??0)+360)%360:0;return s.jsxs("div",{className:`flex items-center gap-2 ml-2 pl-2 border-l ${t?"border-zinc-700":"border-zinc-300"}`,children:[s.jsx("span",{className:`text-[10px] shrink-0 ${t?"text-zinc-400":"text-zinc-600"}`,children:"旋转"}),s.jsx("input",{type:"range",min:0,max:360,value:pe,onChange:we=>{we.stopPropagation(),W(Number(we.target.value))},onClick:we=>we.stopPropagation(),className:`w-20 h-1.5 rounded-full appearance-none cursor-pointer accent-blue-500 ${t?"bg-zinc-700":"bg-zinc-300"}`,title:`${Math.round(pe)}°`}),s.jsxs("span",{className:"text-[10px] w-8 shrink-0 text-zinc-500",children:[Math.round(pe),"°"]}),s.jsx("button",{type:"button",onClick:we=>{we.stopPropagation(),M()},className:`w-7 h-7 flex items-center justify-center rounded-lg transition-colors ${t?"text-zinc-400 hover:bg-zinc-800 hover:text-zinc-200":"text-zinc-600 hover:bg-zinc-200 hover:text-zinc-800"}`,title:"水平翻转",children:s.jsx(LG,{size:16})}),s.jsx("button",{type:"button",onClick:we=>{we.stopPropagation(),Y()},className:`w-7 h-7 flex items-center justify-center rounded-lg transition-colors ${t?"text-zinc-400 hover:bg-zinc-800 hover:text-zinc-200":"text-zinc-600 hover:bg-zinc-200 hover:text-zinc-800"}`,title:"垂直翻转",children:s.jsx(BG,{size:16})})]})})(),g===Ca.PEN&&s.jsxs("div",{className:`flex items-center gap-2 ml-2 pl-2 border-l ${t?"border-zinc-700":"border-zinc-300"}`,children:[s.jsx(D1,{color:I.color,onChange:ee=>R(pe=>({...pe,color:ee})),isDark:t}),s.jsx(YE,{size:I.width,onChange:ee=>R(pe=>({...pe,width:ee})),isDark:t})]}),g===Ca.TEXT&&s.jsxs("div",{className:`flex items-center gap-2 ml-2 pl-2 border-l ${t?"border-zinc-700":"border-zinc-300"}`,children:[s.jsx(D1,{color:A.color,onChange:ee=>O(pe=>({...pe,color:ee})),isDark:t}),s.jsx("div",{className:"flex items-center gap-1",children:["S","M","L","XL"].map(ee=>s.jsx("button",{onClick:pe=>{pe.stopPropagation(),O(we=>({...we,fontSize:ee}))},className:`px-2 py-0.5 rounded text-[10px] transition-colors ${A.fontSize===ee?t?"bg-blue-600 text-white":"bg-black text-white":t?"bg-zinc-800 text-zinc-400 hover:bg-zinc-700":"bg-zinc-200 text-zinc-600 hover:bg-zinc-300"}`,children:ee},ee))})]}),g===Ca.ERASER&&s.jsxs("div",{className:`flex items-center gap-2 ml-2 pl-2 border-l ${t?"border-zinc-700":"border-zinc-300"}`,children:[s.jsx("span",{className:`text-xs ${t?"text-zinc-400":"text-zinc-600"}`,children:"擦除范围:"}),s.jsx(YE,{size:F.size,onChange:ee=>L(pe=>({...pe,size:ee})),isDark:t})]}),g===Ca.SHAPE&&s.jsxs("div",{className:`flex items-center gap-2 ml-2 pl-2 border-l ${t?"border-zinc-700":"border-zinc-300"}`,children:[s.jsx("div",{className:"flex items-center gap-1",children:[{type:"rectangle",label:"□"},{type:"circle",label:"○"},{type:"triangle",label:"△"},{type:"line",label:"/"}].map(({type:ee,label:pe})=>s.jsx("button",{onClick:we=>{we.stopPropagation(),T(Q=>({...Q,type:ee}))},className:`w-6 h-6 flex items-center justify-center rounded text-sm transition-colors ${X.type===ee?t?"bg-blue-600 text-white":"bg-black text-white":t?"bg-zinc-800 text-zinc-400 hover:bg-zinc-700":"bg-zinc-200 text-zinc-600 hover:bg-zinc-300"}`,title:ee,children:pe},ee))}),s.jsxs("div",{className:"flex items-center gap-1",children:[s.jsx("button",{onClick:ee=>{ee.stopPropagation(),T(pe=>({...pe,fillMode:"stroke"}))},className:`px-2 py-0.5 rounded text-[10px] transition-colors ${X.fillMode==="stroke"?t?"bg-blue-600 text-white":"bg-black text-white":t?"bg-zinc-800 text-zinc-400 hover:bg-zinc-700":"bg-zinc-200 text-zinc-600 hover:bg-zinc-300"}`,children:"描边"}),s.jsx("button",{onClick:ee=>{ee.stopPropagation(),T(pe=>({...pe,fillMode:"fill"}))},className:`px-2 py-0.5 rounded text-[10px] transition-colors ${X.fillMode==="fill"?t?"bg-blue-600 text-white":"bg-black text-white":t?"bg-zinc-800 text-zinc-400 hover:bg-zinc-700":"bg-zinc-200 text-zinc-600 hover:bg-zinc-300"}`,children:"填充"})]}),s.jsx(D1,{color:X.color,onChange:ee=>T(pe=>({...pe,color:ee})),isDark:t})]}),g===Ca.STICK_FIGURE&&s.jsxs("div",{className:`flex items-center gap-2 ml-2 pl-2 border-l ${t?"border-zinc-700":"border-zinc-300"}`,children:[s.jsx("span",{className:`text-xs ${t?"text-zinc-400":"text-zinc-600"}`,children:"点击画布添加火柴人"}),s.jsx(D1,{color:q.color,onChange:ee=>H(pe=>({...pe,color:ee})),isDark:t})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("button",{onClick:ee=>{ee.stopPropagation(),z(!m)},className:`p-1 rounded transition-colors ${m?t?"bg-blue-600 text-white":"bg-black text-white":t?"text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800":"text-zinc-500 hover:text-zinc-700 hover:bg-zinc-200"}`,title:"图层管理",children:s.jsx(DP,{size:14})}),s.jsx("button",{onClick:ee=>{ee.stopPropagation(),ie()},className:`px-2 py-1 rounded-lg text-xs transition-colors ${t?"bg-zinc-800 hover:bg-zinc-700 text-zinc-300":"bg-zinc-200 hover:bg-zinc-300 text-zinc-700"}`,children:s.jsx(mu,{size:14})})]})]}),m&&s.jsx(Jce,{layers:h.layers||[],selectedLayerId:C||void 0,onSelectLayer:se,onUpdateLayer:B,onUpdateLayers:V,onDeleteLayer:N,onMoveLayer:j,onCreateLayer:k,isDark:t})]})},JE=({src:e,alt:t,className:n,isDark:r,renderQuality:i="high",shouldLoad:a=!0})=>{const o=Ul(e,{usePreview:!0,nodeType:"preview",shouldLoadContent:a,preferConstantDisplay:!0,renderQuality:i}),l=(o==null?void 0:o.content)??(e.startsWith("content_ref:")?void 0:e);return l?s.jsx("img",{src:l,alt:t,className:n,loading:"lazy",decoding:"async"}):s.jsx("div",{className:`flex items-center justify-center bg-zinc-700/50 rounded ${n||""}`,children:s.jsx(si,{size:16,className:r?"text-zinc-500":"text-zinc-400"})})},Qce=({node:e,isDark:t,updateNode:n,connections:r=[],nodes:i=[],apiConfigs:a=[],globalApiKey:o="",getConnectedInputImages:l,generateFromScriptForChart:c,generateChartBatch:u,setNodes:d,setConnections:h,generateId:p,filterJimengModels:f,chartArtStyles:b=[],renderQuality:g="high"})=>{var un,Tn,Ht,fn,Dn,it,Lt,gt,Jt,Wt,Pt,Bt,zt,Gt,qt;const v=((un=e.settings)==null?void 0:un.gridMode)??"grid",m=Math.max(1,Math.min(12,((Tn=e.settings)==null?void 0:Tn.rows)??3)),z=Math.max(1,Math.min(12,((Ht=e.settings)==null?void 0:Ht.cols)??3)),C=Math.max(1,Math.min(64,((fn=e.settings)==null?void 0:fn.totalGrids)??9)),E=v==="grid"?C:m*z,I=_.useMemo(()=>{var Ae;const De=((Ae=e.settings)==null?void 0:Ae.cells)||[],st=[];for(let nt=0;nt{const De=a.filter(st=>st.type==="Image");return f?f(De):De},[a,f]),L=F.find(De=>De.id===R),X=_.useMemo(()=>l?l(e.id):[],[l,e.id]),T=_.useMemo(()=>{if(!(r!=null&&r.length)||!(i!=null&&i.length))return null;const De=r.find(st=>{if(st.to!==e.id)return!1;const Ae=i.find(nt=>nt.id===st.from);return Ae&&(Ae.type==="text-node"||Ae.type==="custom-agent"||Ae.type==="novel-input")});return De&&i.find(st=>st.id===De.from)||null},[r,i,e.id]),q=_.useMemo(()=>{if(!(r!=null&&r.length)||!(i!=null&&i.length))return[];const De=r.filter(nt=>nt.to===e.id),st=[],Ae=new Set;return De.forEach(nt=>{const _t=i.find(Tt=>Tt.id===nt.from);!_t||!(_t.type==="text-node"||_t.type==="custom-agent"||_t.type==="novel-input")||Ae.has(_t.id)||(Ae.add(_t.id),st.push(_t))}),st},[r,i,e.id]),H=_.useMemo(()=>{if(!(r!=null&&r.length)||!(i!=null&&i.length))return new Map;const De=new Map;return r.filter(Ae=>Ae.to===e.id&&(!Ae.inputType||Ae.inputType==="default")).forEach(Ae=>{const nt=i.find(xt=>xt.id===Ae.from);if(!nt||nt.type==="camera-movement"||nt.type==="professional-camera")return;(()=>{var xt,Tt;if(nt.type==="preview"){if(nt.selectedPreviewImage)return[nt.selectedPreviewImage];if(nt.previewMjImages&&nt.previewMjImages.length>0)return[nt.previewMjImages[0]];if(nt.content)return[nt.content]}else if(nt.type==="canvas-node"){if(nt.content)return[nt.content];if((xt=nt.settings)!=null&&xt.canvasData)return[`canvas-node:${nt.id}`]}else if(nt.type==="rh-app"){const St=(Tt=nt.settings)==null?void 0:Tt.generatedImages;if(St!=null&&St.length)return St.map(Qe=>Qe.fullUrl);if(nt.content)return[nt.content]}else if(nt.content)return[nt.content];return[]})().forEach(xt=>De.set(xt,Ae.from))}),De},[r,i,e.id]),J=_.useCallback((De,st)=>{st.preventDefault(),st.stopPropagation();const Ae=H.get(De);Ae&&h&&h(nt=>nt.filter(_t=>!(_t.from===Ae&&_t.to===e.id)))},[H,e.id,h]),Z=_.useCallback((De,st)=>{if(De===st||De<0||st<0||De>=X.length||st>=X.length)return;const Ae=[...X],[nt]=Ae.splice(De,1);Ae.splice(st,0,nt),n(e.id,{settings:{...e.settings,inputImageOrder:Ae}})},[X,e.id,e.settings,n]),[B,V]=_.useState(()=>{const De=a.filter(st=>st.type==="Chat");return De.length>0?De[0].modelName||De[0].id:"gemini-3-pro-preview"}),[N,j]=_.useState(!1),[k,W]=_.useState(!1),[M,Y]=_.useState(!1),[se,ie]=_.useState("");_.useEffect(()=>{var st;const De=((st=e.settings)==null?void 0:st.jsonData)||"";De&&ie(De)},[(Lt=e.settings)==null?void 0:Lt.jsonData]);const oe=_.useCallback(async()=>{var nt,_t;if(!T||!c)return;const st=new Map(i.map(xt=>[xt.id,xt])).get(T.id)||T;let Ae="";if(st.type==="custom-agent")Ae=(((nt=st.settings)==null?void 0:nt.outputContent)||"").trim();else{const xt=((_t=st.settings)==null?void 0:_t.text)||"",Tt=st.prompt||"",St=st.content||"";Ae=(xt||Tt||St).trim()}if(!Ae){alert("连接的文本节点没有内容");return}j(!0);try{const xt=v==="grid"?C:void 0;await c(e.id,Ae,m,z,B,xt)}catch(xt){console.error("[StoryboardChart] 从文本生成失败:",xt),alert(`从文本生成失败: ${xt instanceof Error?xt.message:"未知错误"}`)}finally{j(!1)}},[T,c,e.id,i,m,z,B,v,C]),re=_.useCallback(()=>{var De;if(!se.trim()){alert("请先输入或生成 JSON 数据");return}try{const st=se.match(/\{[\s\S]*\}/);if(!st)throw new Error("未找到有效的 JSON 对象");const Ae=JSON.parse(st[0]),nt=Ae.shots||[];if(nt.length===0)throw new Error("JSON 中没有 shots 数组");let _t,xt=m,Tt=z;if(v==="grid")_t=Math.max(1,Math.min(64,Ae.total_shots??nt.length)),xt=Math.ceil(_t/3),Tt=3;else{const Ge=Ae.layout_specification;if(Ge&&/^\d+x\d+$/i.test(Ge)){const[at,rt]=Ge.split("x").map(Number);at>=1&&at<=12&&rt>=1&&rt<=12&&(xt=at,Tt=rt)}_t=xt*Tt}const St=((De=e.settings)==null?void 0:De.cells)||[],Qe=[];for(let Ge=0;Ge<_t;Ge++){const at=nt[Ge],rt=St[Ge]||{id:`c-${Ge}`,prompt:""},lt=at?(at.prompt||at.description_zh||at.description_en||"").trim():"",ot=at?JSON.stringify({shot_number:at.shot_number??Ge+1,shot_size:at.shot_size||"",description_zh:at.description_zh||"",description_en:at.description_en||"",prompt:lt},null,2):"";Qe.push({id:rt.id||`c-${Ge}`,prompt:ot,refs:rt.refs,linkNodeId:rt.linkNodeId})}const Ue={...e.settings,cells:Qe,rows:xt,cols:Tt,jsonData:se};v==="grid"&&(Ue.totalGrids=_t),n(e.id,{settings:Ue})}catch(st){alert(`同步失败: ${st instanceof Error?st.message:"JSON 解析错误"}`)}},[se,m,z,e.id,e.settings,n,v]),ee=((gt=e.settings)==null?void 0:gt.chartArtStyle)??"auto",pe=_.useCallback(De=>{n(e.id,{settings:{...e.settings,chartArtStyle:De}})},[e.id,e.settings,n]),[we,Q]=_.useState(!1),[me,ue]=_.useState(""),[U,G]=_.useState(null),[te,ge]=_.useState(null),[ne,le]=_.useState(null),[fe,be]=_.useState(!1),de=_.useRef(null),[$e,ze]=_.useState(!1),_e=_.useRef(null),Ee=_.useRef(0),Ce=_.useRef(0),xe=_.useRef(0),Ne=_.useRef(new Map),ve=_.useCallback(De=>{n(e.id,{settings:{...e.settings,cells:De}})},[e.id,e.settings,n]),ke=_.useCallback((De,st)=>{const Ae=[...I];Ae[De]={...Ae[De],prompt:st},ve(Ae)},[I,ve]),Ie=_.useCallback((De,st)=>{const Ae=[...I];Ae[De]={...Ae[De],linkNodeId:st||void 0},ve(Ae)},[I,ve]),Pe=_.useCallback(De=>{var xt,Tt;if(!De)return"";const st=i.find(St=>St.id===De);if(!st)return"";if(st.type==="custom-agent")return(((xt=st.settings)==null?void 0:xt.outputContent)||"").trim();const Ae=((Tt=st.settings)==null?void 0:Tt.text)||"",nt=st.prompt||"",_t=st.content||"";return(Ae||nt||_t).trim()},[i]),Te=_.useCallback((De,st)=>{const Ae=(De.prompt||"").trim();if(Ae)return Ae;const nt=Pe(De.linkNodeId);return nt||`分镜 ${st+1} 描述`},[Pe]),Be=_.useCallback(async()=>{var xt,Tt,St,Qe,Ue,Ge,at,rt;const De=((xt=e.settings)==null?void 0:xt.customDistributionRules)||"";if(!De.trim()){alert("请先填写分发替换指令");return}const st=a.find(lt=>lt.type==="Chat"&&(lt.id===B||lt.modelName===B))||a.find(lt=>lt.type==="Chat");if(!st){alert("请先配置 Chat API");return}const Ae=st.key||o;if(!Ae){alert("请先配置 API Key");return}const nt=(st.url||"https://ai.comfly.chat").replace(/\/+$/,"");if(I.filter(lt=>(lt.prompt||"").trim()).length===0){alert("宫格中没有可替换的内容");return}W(!0);try{const lt=I.map(Cn=>Cn.prompt||""),ot=`你是一个分镜文本替换助手。用户会给出替换指令和一个 JSON 数组(数组的每个元素是分镜宫格一格的原始内容,可能是 JSON 对象字符串或纯文本)。 +请对每个元素按用户指令进行替换:若为 JSON 则修改其中的 prompt、description_zh、description_en 等文本字段;若为纯文本则直接替换。 +保持结构和格式不变,只修改需替换的文本。你必须返回且仅返回一个 JSON 数组,长度与输入相同,顺序对应。每个元素为修改后的内容(保持原格式:JSON 则仍为可解析的 JSON 字符串)。`,At=`替换指令:${De} + +待处理的宫格内容(JSON 数组,按顺序): +${JSON.stringify(lt,null,0)}`,kt=new AbortController,Ot=setTimeout(()=>kt.abort(),9e4),dn=await fetch(`${nt}/v1/chat/completions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${Ae}`},body:JSON.stringify({model:st.modelName||"gemini-3-pro-preview",messages:[{role:"system",content:ot},{role:"user",content:At}],max_tokens:32e3,temperature:.3,stream:!1}),signal:kt.signal});if(clearTimeout(Ot),!dn.ok){const Cn=await dn.text();throw new Error(`API 请求失败: ${dn.status} - ${Cn}`)}const Vt=await dn.json();let Zt=((Qe=(St=(Tt=Vt.choices)==null?void 0:Tt[0])==null?void 0:St.message)==null?void 0:Qe.content)||((rt=(at=(Ge=(Ue=Vt.data)==null?void 0:Ue.choices)==null?void 0:Ge[0])==null?void 0:at.message)==null?void 0:rt.content)||Vt.content||"";Zt=Zt.replace(/^```(?:json)?\s*|\s*```$/g,"").trim();const Sn=Zt.match(/\[[\s\S]*\]/);if(!Sn)throw new Error("模型未返回有效的 JSON 数组");const jn=JSON.parse(Sn[0]),_n=I.map((Cn,Kn)=>{const Xn=jn[Kn];let $r=Cn.prompt;return Xn!=null&&(typeof Xn=="string"?$r=Xn:typeof Xn=="object"&&($r=JSON.stringify(Xn,null,2))),{...Cn,prompt:$r}});ve(_n)}catch(lt){console.error("[StoryboardChart] 执行替换失败:",lt),alert(`执行替换失败: ${lt instanceof Error?lt.message:"未知错误"}`)}finally{W(!1)}},[(Jt=e.settings)==null?void 0:Jt.customDistributionRules,I,ve,a,B,o]),He=I.some(De=>(De.prompt||"").trim()),Je=_.useCallback(De=>{const st=Math.max(1,Math.min(12,De));n(e.id,{settings:{...e.settings,rows:st}})},[e.id,e.settings,n]),Me=_.useCallback(De=>{const st=Math.max(1,Math.min(12,De));n(e.id,{settings:{...e.settings,cols:st}})},[e.id,e.settings,n]),Re=_.useCallback(De=>{const st=Math.max(1,Math.min(64,De));if(v==="grid")n(e.id,{settings:{...e.settings,totalGrids:st}});else{const Ae=Math.min(3,st,12),nt=Math.min(12,Math.ceil(st/Ae));n(e.id,{settings:{...e.settings,rows:Math.max(1,nt),cols:Math.max(1,Ae)}})}},[e.id,e.settings,n,v]),Ve=_.useCallback(De=>{var Ae;const st={gridMode:De};De==="grid"&&((Ae=e.settings)==null?void 0:Ae.totalGrids)==null&&(st.totalGrids=m*z),n(e.id,{settings:{...e.settings,...st}})},[e.id,e.settings,n,m,z]),Ze=_.useCallback((De,st)=>{st.key==="@"&&(st.preventDefault(),Ce.current=st.currentTarget.selectionStart??0,G(De))},[]),je=_.useCallback((De,st,Ae)=>{var Ge;const nt=((Ge=I[De])==null?void 0:Ge.prompt)||"",_t=Ae??Ce.current,xt=nt.slice(0,_t),Tt=nt.slice(_t),St=`@${st}`,Qe=xt+St+Tt;ke(De,Qe),G(null);const Ue=_t+St.length;setTimeout(()=>{const at=Ne.current.get(De);at&&(at.focus(),at.setSelectionRange(Ue,Ue))},0)},[I,ke]),Le=_.useCallback(De=>{const st=xe.current,Ae=Ne.current.get(st),nt=Ae!=null?Ae.selectionStart??Ae.value.length:0;je(st,De,nt)},[je]),[Xe,qe]=_.useState(!1),[tt,Ye]=_.useState(null),ct=_.useCallback(async()=>{var Ae,nt,_t;if(!I.some(xt=>(xt.prompt||"").trim()||xt.refs&&xt.refs.length>0||!!Pe(xt.linkNodeId))){alert("请至少填写一个分镜描述、引用图片,或绑定一个文本/Agent节点");return}if(!u){alert("生成功能暂不可用,请确保已正确配置");return}const st=a.find(xt=>xt.id===R);if(!(st!=null&&st.key)&&!o){alert("请先配置 API Key");return}qe(!0);try{const xt=ee!=="auto"&&((Ae=b.find(St=>St.id===ee))==null?void 0:Ae.prompt)||"",Tt=I.map((St,Qe)=>{let Ue=Te(St,Qe),Ge=Ue;try{const lt=JSON.parse(Ue);lt&&typeof lt.prompt=="string"&&(Ge=lt.prompt.trim())}catch{}St.refs&&St.refs.length>0&&(Ge=(Ge+" "+St.refs.map(lt=>`@${lt}`).join(" ")).trim());let at=Ge||Te(St,Qe);if(b.length>0){const lt=[...b].sort((ot,At)=>{var kt,Ot;return(((kt=At.prompt)==null?void 0:kt.length)||0)-(((Ot=ot.prompt)==null?void 0:Ot.length)||0)});for(const ot of lt){const At=(ot.prompt||"").trim();if(At){if(at===At){at="";break}if(at.startsWith(At+", ")){at=at.slice(At.length+2).trim();break}if(at.startsWith(At+",")){at=at.slice(At.length+1).trim();break}if(at.startsWith(At)){at=at.slice(At.length).trim();break}}}at.trim()||(at=Ge||Te(St,Qe))}const rt=xt?`${xt}, ${at}`:at;return{id:St.id,prompt:rt}});await u({nodeId:e.id,cells:Tt,model:R,ratio:((nt=e.settings)==null?void 0:nt.ratio)||"1:1",resolution:((_t=e.settings)==null?void 0:_t.resolution)||"2K",refImages:X,connections:r,nodes:i,updateNode:n,setNodes:d,setConnections:h,generateId:p,gridRows:v==="grid"?Math.ceil(E/3):m,gridCols:pt})}catch(xt){console.error("[StoryboardChart] 生成失败:",xt),alert(`生成失败: ${xt instanceof Error?xt.message:"未知错误"}`)}finally{qe(!1)}},[I,u,a,R,o,e.id,e.settings,X,r,i,n,d,h,p,ee,b,Pe,Te]),pt=v==="grid"?3:z,ht=Math.max(56,Math.min(200,((Wt=e.settings)==null?void 0:Wt.cellRowHeight)??96)),wt=_.useRef(null),$t=_.useRef(null),[jt,Nt]=_.useState(null);_.useEffect(()=>{if(U===null||!X.length){Nt(null);return}const De=Ne.current.get(U);if(!De)return;const st=De.getBoundingClientRect();Nt({top:st.top,left:st.left,width:st.width})},[U,X.length]),_.useEffect(()=>{if(!fe)return;const De=st=>{de.current&&!de.current.contains(st.target)&&be(!1)};return document.addEventListener("mousedown",De),()=>document.removeEventListener("mousedown",De)},[fe]),_.useEffect(()=>{if(!we)return;const De=st=>{$t.current&&!$t.current.contains(st.target)&&Q(!1)};return document.addEventListener("mousedown",De),()=>document.removeEventListener("mousedown",De)},[we]);const Yt=s.jsxs("div",{ref:wt,className:"flex flex-col h-full overflow-hidden pointer-events-auto",children:[s.jsxs("div",{"data-chart-row-col":!0,role:"toolbar","aria-label":"行数列数",className:`relative z-10 flex items-center gap-3 px-3 py-2 border-b shrink-0 cursor-default select-none pointer-events-auto ${t?"border-zinc-700":"border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center gap-0.5 rounded overflow-hidden border",style:{borderColor:t?"rgba(255,255,255,0.2)":"rgba(0,0,0,0.15)"},children:[s.jsx("button",{type:"button",onClick:De=>{De.stopPropagation(),Ve("grid")},className:`px-2 py-0.5 text-[10px] ${v==="grid"?t?"bg-violet-500/30 text-violet-200":"bg-blue-100 text-blue-700":t?"text-zinc-400 hover:bg-zinc-700":"text-zinc-600 hover:bg-zinc-100"}`,children:"宫格排列"}),s.jsx("button",{type:"button",onClick:De=>{De.stopPropagation(),Ve("rows-cols")},className:`px-2 py-0.5 text-[10px] ${v==="rows-cols"?t?"bg-violet-500/30 text-violet-200":"bg-blue-100 text-blue-700":t?"text-zinc-400 hover:bg-zinc-700":"text-zinc-600 hover:bg-zinc-100"}`,children:"行列"})]}),v==="grid"&&s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"h-4 w-px shrink-0","aria-hidden":!0,style:{background:t?"rgba(255,255,255,0.2)":"rgba(0,0,0,0.15)"}}),s.jsxs("div",{className:"flex items-center gap-1",children:[s.jsx("span",{className:"text-[10px] shrink-0 text-zinc-500",children:"宫格"}),s.jsx("button",{type:"button","aria-label":"减少宫格",onClick:De=>{De.stopPropagation(),E>1&&Re(E-1)},onMouseDown:De=>De.stopPropagation(),disabled:E<=1,className:`min-w-[20px] min-h-[20px] flex items-center justify-center rounded cursor-pointer ${E<=1?"opacity-50 cursor-not-allowed":""} ${t?"hover:bg-zinc-700":"hover:bg-zinc-200"}`,children:s.jsx(x1,{size:12})}),s.jsx("input",{type:"text",inputMode:"numeric",value:me!==""?me:E,onChange:De=>ue(De.target.value.replace(/\D/g,"").slice(0,3)),onBlur:()=>{const De=parseInt(me,10);!isNaN(De)&&De>=1&&De<=64&&Re(De),ue("")},onKeyDown:De=>{if(De.key==="Enter"){const st=parseInt(me,10);!isNaN(st)&&st>=1&&st<=64&&Re(st),ue(""),De.target.blur()}},onMouseDown:De=>De.stopPropagation(),className:`w-8 px-0.5 py-0.5 rounded text-[10px] text-center tabular-nums outline-none border-0 bg-transparent cursor-text select-text ${t?"text-zinc-300":"text-zinc-700"}`}),s.jsx("button",{type:"button","aria-label":"增加宫格",onClick:De=>{De.stopPropagation(),E<64&&Re(E+1)},onMouseDown:De=>De.stopPropagation(),disabled:E>=64,className:`min-w-[20px] min-h-[20px] flex items-center justify-center rounded cursor-pointer ${E>=64?"opacity-50 cursor-not-allowed":""} ${t?"hover:bg-zinc-700":"hover:bg-zinc-200"}`,children:s.jsx(Xi,{size:12})})]})]}),v==="rows-cols"&&s.jsxs(s.Fragment,{children:[s.jsxs("div",{className:"flex items-center gap-1",children:[s.jsx("span",{className:`text-xs ${t?"text-zinc-400":"text-zinc-600"}`,children:"行"}),s.jsx("button",{type:"button","aria-label":"减少行",onClick:De=>{De.stopPropagation(),m>1&&Je(m-1)},onMouseDown:De=>{De.stopPropagation()},onPointerDown:De=>{De.stopPropagation()},disabled:m<=1,className:`min-w-[20px] min-h-[20px] flex items-center justify-center rounded cursor-pointer ${m<=1?"opacity-50 cursor-not-allowed":""} ${t?"hover:bg-zinc-700":"hover:bg-zinc-200"}`,children:s.jsx(x1,{size:12})}),s.jsx("span",{className:"text-xs w-5 text-center tabular-nums",children:m}),s.jsx("button",{type:"button","aria-label":"增加行",onClick:De=>{De.stopPropagation(),m<12&&Je(m+1)},onMouseDown:De=>{De.stopPropagation()},onPointerDown:De=>{De.stopPropagation()},disabled:m>=12,className:`min-w-[20px] min-h-[20px] flex items-center justify-center rounded cursor-pointer ${m>=12?"opacity-50 cursor-not-allowed":""} ${t?"hover:bg-zinc-700":"hover:bg-zinc-200"}`,children:s.jsx(Xi,{size:12})})]}),s.jsxs("div",{className:"flex items-center gap-1",children:[s.jsx("span",{className:`text-xs ${t?"text-zinc-400":"text-zinc-600"}`,children:"列"}),s.jsx("button",{type:"button","aria-label":"减少列",onClick:De=>{De.stopPropagation(),z>1&&Me(z-1)},onMouseDown:De=>{De.stopPropagation()},onPointerDown:De=>{De.stopPropagation()},disabled:z<=1,className:`min-w-[20px] min-h-[20px] flex items-center justify-center rounded cursor-pointer ${z<=1?"opacity-50 cursor-not-allowed":""} ${t?"hover:bg-zinc-700":"hover:bg-zinc-200"}`,children:s.jsx(x1,{size:12})}),s.jsx("span",{className:"text-xs w-5 text-center tabular-nums",children:z}),s.jsx("button",{type:"button","aria-label":"增加列",onClick:De=>{De.stopPropagation(),z<12&&Me(z+1)},onMouseDown:De=>{De.stopPropagation()},onPointerDown:De=>{De.stopPropagation()},disabled:z>=12,className:`min-w-[20px] min-h-[20px] flex items-center justify-center rounded cursor-pointer ${z>=12?"opacity-50 cursor-not-allowed":""} ${t?"hover:bg-zinc-700":"hover:bg-zinc-200"}`,children:s.jsx(Xi,{size:12})})]}),s.jsx("div",{className:"h-4 w-px shrink-0","aria-hidden":!0,style:{background:t?"rgba(255,255,255,0.2)":"rgba(0,0,0,0.15)"}})]}),s.jsx("div",{className:"h-4 w-px shrink-0","aria-hidden":!0,style:{background:t?"rgba(255,255,255,0.2)":"rgba(0,0,0,0.15)"}}),s.jsxs("div",{className:"flex items-center gap-1",children:[s.jsx("span",{className:`text-xs ${t?"text-zinc-400":"text-zinc-600"}`,children:"行高"}),s.jsx("button",{type:"button","aria-label":"减少行高",onClick:De=>{De.stopPropagation();const st=Math.max(56,ht-24);n(e.id,{settings:{...e.settings,cellRowHeight:st}})},onMouseDown:De=>De.stopPropagation(),disabled:ht<=56,className:`min-w-[20px] min-h-[20px] flex items-center justify-center rounded cursor-pointer ${ht<=56?"opacity-50 cursor-not-allowed":""} ${t?"hover:bg-zinc-700":"hover:bg-zinc-200"}`,children:s.jsx(x1,{size:12})}),s.jsxs("span",{className:"text-xs w-10 text-center tabular-nums",children:[ht,"px"]}),s.jsx("button",{type:"button","aria-label":"增加行高",onClick:De=>{De.stopPropagation();const st=Math.min(200,ht+24);n(e.id,{settings:{...e.settings,cellRowHeight:st}})},onMouseDown:De=>De.stopPropagation(),disabled:ht>=200,className:`min-w-[20px] min-h-[20px] flex items-center justify-center rounded cursor-pointer ${ht>=200?"opacity-50 cursor-not-allowed":""} ${t?"hover:bg-zinc-700":"hover:bg-zinc-200"}`,children:s.jsx(Xi,{size:12})})]}),s.jsx("div",{className:"flex-1"}),s.jsx("button",{type:"button",onClick:De=>{if(De.stopPropagation(),$e)ze(!1),requestAnimationFrame(()=>{const st=_e.current;st&&Ee.current&&(st.scrollTop=Ee.current)});else{const st=_e.current;st&&(Ee.current=st.scrollTop),ze(!0)}},onMouseDown:De=>De.stopPropagation(),className:`p-1.5 rounded transition-colors ${t?"text-zinc-400 hover:bg-zinc-700 hover:text-zinc-200":"text-zinc-500 hover:bg-zinc-200 hover:text-zinc-800"}`,title:$e?"退出全屏":"全屏显示(更方便打字与使用)",children:$e?s.jsx(rf,{size:14}):s.jsx(jh,{size:14})})]}),b.length>0&&s.jsxs("div",{className:`p-2 border-b shrink-0 ${t?"border-zinc-700":"border-zinc-200"}`,children:[s.jsx("label",{className:`text-[10px] font-medium block mb-1 ${t?"text-zinc-400":"text-zinc-600"}`,children:"绘图风格"}),s.jsxs("div",{className:"relative",ref:$t,children:[s.jsxs("button",{type:"button",onClick:De=>{De.stopPropagation(),Q(st=>!st)},onMouseDown:De=>De.stopPropagation(),className:`w-full flex items-center justify-between px-2 py-1.5 rounded text-[10px] border ${t?"bg-transparent border-white/30 text-white":"bg-white border-zinc-300 text-zinc-800"}`,children:[s.jsx(zh,{size:12,className:"shrink-0 mr-1.5 opacity-70"}),s.jsx("span",{className:"truncate flex-1 text-left",children:ee==="auto"?"不添加风格前缀 (默认)":((Pt=b.find(De=>De.id===ee))==null?void 0:Pt.label)||ee}),s.jsx(Ei,{size:10,className:`shrink-0 ml-1 transition-transform ${we?"rotate-180":""}`})]}),we&&s.jsxs("div",{"data-chart-style-dropdown":!0,className:`absolute left-0 right-0 mt-1 z-50 rounded-lg border shadow-xl max-h-48 overflow-y-auto minimal-scrollbar ${t?"bg-zinc-900 border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:De=>De.stopPropagation(),children:[s.jsx("div",{onClick:()=>{pe("auto"),Q(!1)},className:`px-2 py-1.5 text-[10px] cursor-pointer ${ee==="auto"?t?"bg-violet-500/20 text-violet-300":"bg-violet-50 text-violet-700":t?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-50"}`,children:"不添加风格前缀 (默认)"}),b.filter(De=>De.category==="cinematic"||De.category==="stylized"||De.category==="custom").map(De=>s.jsx("div",{onClick:()=>{pe(De.id),Q(!1)},className:`px-2 py-1.5 text-[10px] cursor-pointer ${ee===De.id?t?"bg-violet-500/20 text-violet-300":"bg-violet-50 text-violet-700":t?"text-zinc-300 hover:bg-zinc-800":"text-zinc-700 hover:bg-zinc-50"}`,children:De.label},De.id))]})]})]}),T&&s.jsx("div",{className:`p-2 border-b shrink-0 ${t?"border-zinc-700":"border-zinc-200"}`,children:s.jsxs("div",{className:`p-2 rounded space-y-2 border ${t?"bg-transparent border-white/30":"bg-blue-50 border-blue-200"}`,children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(Vo,{size:14,className:t?"text-white":"text-blue-600"}),s.jsx("span",{className:`text-xs ${t?"text-white":"text-blue-700"}`,children:"已连接文本节点"})]}),s.jsxs("button",{onClick:oe,disabled:N,className:`px-3 py-1 rounded text-xs transition-colors flex items-center gap-1 border ${t?"bg-transparent border-white/30 hover:bg-white/5 text-white disabled:opacity-50 disabled:cursor-not-allowed":"bg-black hover:bg-zinc-800 text-white border-black disabled:opacity-50 disabled:cursor-not-allowed"}`,onMouseDown:De=>De.stopPropagation(),children:[N&&s.jsx(zr,{size:12,className:"animate-spin"}),N?"生成中...":"从文本生成"]})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("label",{className:`text-[10px] ${t?"text-white":"text-blue-700"}`,children:"模型:"}),s.jsx("select",{value:B,onChange:De=>V(De.target.value),className:`storyboard-select flex-1 px-2 py-1 rounded text-xs border outline-none ${t?"bg-transparent border-white/30 text-white":"bg-white border-zinc-300 text-zinc-800"}`,onMouseDown:De=>De.stopPropagation(),children:a.filter(De=>De.type==="Chat").map(De=>s.jsx("option",{value:De.modelName||De.id,children:De.provider||De.id},De.id))})]})]})}),s.jsxs("div",{className:`p-2 border-b shrink-0 ${t?"border-zinc-700":"border-zinc-200"}`,children:[s.jsxs("button",{type:"button",onClick:()=>Y(!M),className:`w-full flex items-center justify-between px-3 py-2 rounded-lg transition-colors border ${t?"bg-transparent hover:bg-white/5 text-white border-white/30 hover:border-white/50":"bg-zinc-100 hover:bg-zinc-200 text-zinc-700 border-transparent"}`,onMouseDown:De=>De.stopPropagation(),children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(Mv,{size:14,className:t?"text-white/60":"text-blue-600"}),s.jsx("span",{className:"text-xs font-medium",children:"JSON Code"})]}),M?s.jsx(Qr,{size:12,className:t?"text-white/60":"text-zinc-600"}):s.jsx(Ii,{size:12,className:t?"text-white/60":"text-zinc-600"})]}),M&&s.jsxs("div",{"data-chart-json-code":!0,className:`mt-2 rounded-lg border overflow-hidden ${t?"bg-transparent border-white/30":"bg-white border-zinc-300"}`,children:[s.jsxs("div",{className:`flex items-center justify-between px-3 py-2 border-b ${t?"border-white/30":"border-zinc-200 bg-zinc-50"}`,children:[s.jsx("span",{className:`text-xs font-medium ${t?"text-white/80":"text-zinc-700"}`,children:"JSON数据"}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("button",{type:"button",onClick:()=>{try{navigator.clipboard.writeText(se)}catch{}},className:`p-1.5 rounded transition-colors ${t?"text-white/60 hover:bg-white/5":"text-zinc-600 hover:bg-zinc-100"}`,onMouseDown:De=>De.stopPropagation(),title:"复制",children:s.jsx(Eh,{size:14})}),s.jsx("button",{type:"button",onClick:re,className:`px-2 py-1 rounded text-[10px] border ${t?"border-white/30 hover:bg-white/5 text-white":"bg-black hover:bg-zinc-800 text-white border-black"}`,onMouseDown:De=>De.stopPropagation(),children:"同步到宫格"})]})]}),s.jsx("textarea",{value:se,onChange:De=>ie(De.target.value),placeholder:'粘贴或编辑 JSON,格式如 {"layout_specification":"3x3","total_shots":9,"shots":[{...}]}',className:`w-full p-3 text-xs font-mono resize-none minimal-scrollbar outline-none border-0 ${t?"bg-transparent text-white/80 placeholder:text-zinc-500":"bg-white text-zinc-800 placeholder:text-zinc-400"}`,rows:8,onMouseDown:De=>De.stopPropagation()})]})]}),He&&s.jsx("div",{className:`p-2 border-b shrink-0 ${t?"border-zinc-700":"border-zinc-200"}`,children:s.jsxs("div",{className:`p-2 rounded space-y-2 border ${t?"bg-transparent border-white/30":"bg-blue-50/80 border-blue-200/80"}`,children:[s.jsxs("div",{className:"flex items-center justify-between gap-2",children:[s.jsx("span",{className:`text-[10px] font-medium shrink-0 ${t?"text-white":"text-blue-700"}`,children:"分发替换"}),s.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[s.jsx("span",{className:`text-[10px] ${t?"text-white/80":"text-blue-700"}`,children:"模型:"}),s.jsx("select",{value:B,onChange:De=>V(De.target.value),className:`px-2 py-0.5 rounded text-[10px] border outline-none min-w-[90px] storyboard-select ${t?"bg-black border-white/30 text-white":"bg-white border-zinc-300 text-zinc-800"}`,onMouseDown:De=>De.stopPropagation(),children:a.filter(De=>De.type==="Chat").map(De=>s.jsx("option",{value:De.modelName||De.id,children:De.provider||De.id},De.id))}),s.jsxs("button",{type:"button",onClick:De=>{De.stopPropagation(),Be()},onMouseDown:De=>De.stopPropagation(),disabled:k,className:`shrink-0 px-3 py-1 rounded text-[10px] font-medium flex items-center gap-1 transition-opacity ${k?"opacity-70 cursor-wait":""} ${t?"bg-black hover:bg-zinc-900 text-white border border-white/30":"bg-black hover:bg-zinc-800 text-white border border-zinc-800"}`,title:"使用所选 Chat 模型按上述指令批量替换宫格内容",children:[k&&s.jsx(zr,{size:12,className:"animate-spin shrink-0"}),k?"正在替换...":"执行替换"]})]})]}),s.jsx("textarea",{value:((Bt=e.settings)==null?void 0:Bt.customDistributionRules)||"",onChange:De=>n(e.id,{settings:{...e.settings,customDistributionRules:De.target.value}}),placeholder:"例:帮我将主角换成@1",rows:2,className:`w-full px-2 py-1.5 rounded text-[10px] outline-none border resize-none minimal-scrollbar ${t?"bg-transparent border-white/20 text-zinc-300 placeholder:text-zinc-500":"bg-white/60 border-zinc-200 text-zinc-800 placeholder:text-zinc-400"}`,onMouseDown:De=>De.stopPropagation(),disabled:k})]})}),s.jsxs("div",{className:`flex flex-wrap items-center gap-2 px-3 py-2 border-b shrink-0 ${t?"border-zinc-700":"border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center gap-1",children:[s.jsx("span",{className:"text-[10px] text-zinc-500",children:"画质"}),s.jsx("div",{className:"flex gap-0.5",children:(O.length>0?O:["1K","2K","4K"]).map(De=>{var st;return s.jsx("button",{onClick:()=>n(e.id,{settings:{...e.settings,resolution:De}}),className:`px-2 py-0.5 rounded text-[10px] border ${((st=e.settings)==null?void 0:st.resolution)===De?t?"border-zinc-500 text-zinc-300 bg-transparent":"bg-blue-100 text-blue-700 border-transparent":t?"border-transparent hover:bg-zinc-700":"border-transparent hover:bg-zinc-100"}`,children:De},De)})})]}),s.jsxs("div",{className:"flex items-center gap-1",children:[s.jsx("span",{className:"text-[10px] text-zinc-500",children:"比例"}),s.jsx(F$,{isDark:t,selectedRatio:((zt=e.settings)==null?void 0:zt.ratio)||"1:1",filterRatios:A,onSelect:De=>n(e.id,{settings:{...e.settings,ratio:De}})})]})]}),s.jsxs("div",{ref:_e,className:"flex-1 overflow-y-auto minimal-scrollbar p-3 min-h-0","data-chart-scroll-area":!0,children:[s.jsxs("div",{className:`flex items-center gap-2 mb-2 ${t?"text-zinc-400":"text-zinc-600"}`,children:[s.jsx("span",{className:"text-[10px]",children:(L==null?void 0:L.provider)||"模型"}),s.jsxs("div",{ref:de,className:"relative overflow-visible","data-model-select-area":!0,children:[s.jsxs("button",{type:"button",title:L==null?void 0:L.provider,onClick:De=>{De.stopPropagation(),be(st=>!st)},onMouseDown:De=>De.stopPropagation(),className:`node-dropdown-button flex items-center gap-1 px-2 py-0.5 rounded text-[10px] transition-colors border ${t?"bg-transparent hover:bg-white/5 text-white border-white/30":"bg-transparent hover:bg-black/5 text-gray-900 border-gray-300"}`,children:[s.jsx("span",{className:"truncate max-w-[100px]",children:(L==null?void 0:L.provider)||"模型"}),s.jsx(Ei,{size:10,className:"shrink-0 opacity-70"})]}),fe&&s.jsx("div",{className:`node-dropdown-menu absolute left-0 top-full mt-1 w-40 rounded-lg shadow-xl p-1 z-[100] border max-h-64 overflow-y-auto rh-scroll-minimal custom-scrollbar ${t?"bg-[#18181b] border-zinc-700":"bg-white border-zinc-200"}`,onMouseDown:De=>De.stopPropagation(),children:F.map(De=>s.jsx("button",{type:"button",onClick:()=>{n(e.id,{settings:{...e.settings,model:De.id}}),be(!1)},className:`w-full flex items-center px-2 py-1.5 rounded text-left text-[10px] transition-colors ${t?"hover:bg-zinc-800 text-zinc-300":"hover:bg-zinc-100 text-zinc-700"} ${R===De.id?t?"bg-zinc-800":"bg-zinc-100":""}`,children:s.jsx("span",{className:"font-medium truncate",children:De.provider??""})},De.id))})]}),s.jsxs("span",{className:"text-[10px]",children:[((Gt=e.settings)==null?void 0:Gt.ratio)||"Auto","·",((qt=e.settings)==null?void 0:qt.resolution)||"2K"]})]}),X.length>0&&s.jsxs("div",{className:"mb-2 flex gap-1.5 items-center flex-wrap","data-image-reorder-thumb":!0,onDragOver:De=>{De.preventDefault(),De.stopPropagation(),De.dataTransfer.dropEffect="move"},children:[X.slice(0,g==="low"?6:14).map((De,st)=>s.jsxs("div",{"data-image-reorder-thumb":!0,className:`relative shrink-0 cursor-grab active:cursor-grabbing touch-none select-none ${ne===st?"opacity-60 scale-95":""}`,title:"长按拖拽可调换图片顺序,点击插入 @ 引用",draggable:!0,onMouseEnter:()=>ge(st),onMouseLeave:()=>ge(null),onDragStart:Ae=>{if(Ae.target.closest("button")){Ae.preventDefault();return}Ae.dataTransfer.setData("text/plain",String(st)),Ae.dataTransfer.effectAllowed="move",Ae.stopPropagation(),le(st)},onDragEnd:()=>le(null),onDragEnter:Ae=>{Ae.preventDefault(),Ae.stopPropagation(),Ae.dataTransfer.dropEffect="move"},onDragOver:Ae=>{Ae.preventDefault(),Ae.stopPropagation(),Ae.dataTransfer.dropEffect="move"},onDrop:Ae=>{Ae.preventDefault(),Ae.stopPropagation();const nt=Number(Ae.dataTransfer.getData("text/plain"));!Number.isNaN(nt)&&nt!==st&&Z(nt,st)},children:[s.jsx("span",{className:"absolute -top-1 -left-1 w-3.5 h-3.5 text-[8px] font-semibold rounded-full bg-zinc-700 text-white flex items-center justify-center border border-white/70 shadow-sm leading-none z-[1] pointer-events-none",children:st+1}),s.jsx("button",{type:"button",onClick:Ae=>J(De,Ae),className:`absolute -top-1 -right-1 w-3.5 h-3.5 rounded-full flex items-center justify-center transition-opacity z-[2] ${te===st?"opacity-100":"opacity-0"} ${t?"bg-red-600 hover:bg-red-500":"bg-red-500 hover:bg-red-600"} text-white shadow-lg`,title:"取消引用",onMouseDown:Ae=>Ae.stopPropagation(),children:s.jsx("svg",{width:"6",height:"6",viewBox:"0 0 8 8",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:s.jsx("path",{d:"M1 1L7 7M7 1L1 7",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})})}),s.jsx("div",{role:"button",tabIndex:0,onClick:Ae=>{Ae.stopPropagation(),Le(st+1)},onKeyDown:Ae=>{(Ae.key==="Enter"||Ae.key===" ")&&(Ae.preventDefault(),Le(st+1))},className:`w-9 h-9 rounded border overflow-hidden cursor-pointer ${t?"border-zinc-700 bg-zinc-800 hover:ring-2 hover:ring-blue-500/50":"border-zinc-300 bg-zinc-200 hover:ring-2 hover:ring-blue-400/50"}`,title:`点击插入 @${st+1}`,children:s.jsx(JE,{src:De,alt:`图${st+1}`,className:"w-full h-full object-cover",isDark:t,renderQuality:g,shouldLoad:g==="high"||st<6})})]},st)),s.jsxs("span",{className:`text-[9px] ${t?"text-zinc-500":"text-zinc-400"}`,children:[X.length,"张引用"]})]}),s.jsx("div",{"data-chart-cell-area":!0,className:"grid gap-1.5",style:{gridTemplateColumns:`repeat(${pt}, 1fr)`},children:I.map((De,st)=>{const Ae=De.prompt.match(/@(\d+)/g)||[];return s.jsxs("div",{"data-chart-cell":!0,className:`rounded border min-h-0 flex flex-col ${t?"border-zinc-600/80":"border-black/20"}`,children:[s.jsxs("div",{className:"px-1.5 pt-1 pb-0.5 flex items-center justify-between gap-1 border-b border-transparent",children:[s.jsxs("div",{className:"flex flex-wrap gap-0.5 items-center",children:[Ae.map((nt,_t)=>s.jsx("span",{className:`inline-flex items-center px-1.5 py-0.5 rounded text-[9px] font-medium ${t?"bg-blue-500/30 text-blue-300 border border-blue-500/50":"bg-blue-100 text-blue-700 border border-blue-300/60"}`,title:"已引用图片",children:nt},`${nt}-${_t}`)),q.length>0&&s.jsxs("select",{value:De.linkNodeId||"",onChange:nt=>Ie(st,nt.target.value),className:`px-1.5 py-0.5 rounded text-[9px] border outline-none max-w-[120px] ${t?"bg-zinc-900 border-zinc-600 text-zinc-300":"bg-white border-zinc-300 text-zinc-700"}`,title:"绑定文本/Agent节点(该宫格可直接使用节点文本)",onMouseDown:nt=>nt.stopPropagation(),children:[s.jsx("option",{value:"",children:"未绑定"}),q.map(nt=>s.jsx("option",{value:nt.id,children:(nt.nodeName||(nt.type==="custom-agent"?"Agent节点":"文本节点")).slice(0,20)},nt.id))]})]}),u&&s.jsx("button",{type:"button",className:`px-1.5 py-0.5 rounded text-[9px] border ${t?"border-zinc-600 text-zinc-300 hover:bg-zinc-800":"border-black bg-black text-white hover:bg-zinc-800"}`,title:"仅生成此宫格",disabled:tt===st,onClick:async nt=>{var Tt,St,Qe;nt.stopPropagation();const _t=I[st],xt=Te(_t,st);if(!xt&&(!_t.refs||_t.refs.length===0)&&!Pe(_t.linkNodeId)){alert("当前宫格没有内容(可填写文本、引用图片,或绑定文本/Agent节点)");return}try{Ye(st);const Ue=ee!=="auto"&&((Tt=b.find(lt=>lt.id===ee))==null?void 0:Tt.prompt)||"";let Ge=xt;try{const lt=JSON.parse(xt);lt&&typeof lt.prompt=="string"&&(Ge=lt.prompt.trim())}catch{}_t.refs&&_t.refs.length>0&&(Ge=(Ge+" "+_t.refs.map(lt=>`@${lt}`).join(" ")).trim());let at=Ge||Te(_t,st);if(b.length>0){const lt=[...b].sort((ot,At)=>{var kt,Ot;return(((kt=At.prompt)==null?void 0:kt.length)||0)-(((Ot=ot.prompt)==null?void 0:Ot.length)||0)});for(const ot of lt){const At=(ot.prompt||"").trim();if(At){if(at===At){at="";break}if(at.startsWith(At+", ")){at=at.slice(At.length+2).trim();break}if(at.startsWith(At+",")){at=at.slice(At.length+1).trim();break}if(at.startsWith(At)){at=at.slice(At.length).trim();break}}}at.trim()||(at=Ge||Te(_t,st))}const rt=Ue?`${Ue}, ${at}`:at;await u({nodeId:e.id,cells:[{id:_t.id,prompt:rt}],model:R,ratio:((St=e.settings)==null?void 0:St.ratio)||"1:1",resolution:((Qe=e.settings)==null?void 0:Qe.resolution)||"2K",refImages:X,connections:r,nodes:i,updateNode:n,setNodes:d,setConnections:h,generateId:p,gridRows:v==="grid"?Math.ceil(E/3):m,gridCols:pt,cellIndices:[st]})}catch(Ue){console.error("[StoryboardChart] 单格生成失败:",Ue),alert(`生成失败: ${Ue instanceof Error?Ue.message:"未知错误"}`)}finally{Ye(Ue=>Ue===st?null:Ue)}},children:tt===st?"生成中...":"生成"})]}),s.jsx("textarea",{ref:nt=>{nt&&Ne.current.set(st,nt)},value:De.prompt,onChange:nt=>ke(st,nt.target.value),onKeyDown:nt=>Ze(st,nt),onFocus:()=>{xe.current=st},placeholder:"输入描述,@ 引用图片(可绑定文本/Agent节点)",rows:3,className:`w-full flex-1 min-h-0 px-1.5 py-1 text-[10px] resize-none outline-none bg-transparent border-0 rounded minimal-scrollbar ${t?"text-zinc-200 placeholder:text-zinc-500":"text-zinc-800 placeholder:text-zinc-400"}`,style:{minHeight:ht},onMouseDown:nt=>nt.stopPropagation()})]},De.id)})})]}),jt&&U!==null&&X.length>0&&Ni.createPortal(s.jsx("div",{className:`fixed z-[9999] rounded-lg border shadow-xl overflow-hidden max-h-48 overflow-y-auto ${t?"border-zinc-600":"border-zinc-200"}`,style:{left:jt.left,bottom:typeof window<"u"?window.innerHeight-jt.top+8:void 0,width:Math.max(jt.width,200)},onMouseDown:De=>De.preventDefault(),children:s.jsx("div",{className:t?"bg-zinc-800 border-zinc-600":"bg-white border-zinc-200",children:X.map((De,st)=>s.jsxs("button",{type:"button",className:`w-full flex items-center gap-2 px-3 py-2 text-left text-xs ${t?"hover:bg-zinc-700 text-zinc-200":"hover:bg-zinc-100 text-zinc-800"}`,onClick:()=>je(U,st+1),children:[s.jsx(JE,{src:X[st],alt:`图${st+1}`,className:"w-10 h-10 rounded object-cover shrink-0",isDark:t,renderQuality:g,shouldLoad:!0}),s.jsxs("span",{children:["图",st+1]})]},st))})}),document.body),s.jsx("div",{className:`flex justify-end px-3 py-2 border-t shrink-0 ${t?"border-zinc-700":"border-zinc-200"}`,children:s.jsx("button",{onClick:ct,disabled:Xe,className:`flex items-center gap-1.5 px-4 py-2 rounded text-sm font-medium transition-colors ${Xe?t?"bg-zinc-700 text-zinc-500 cursor-not-allowed":"bg-zinc-200 text-zinc-500 cursor-not-allowed":t?"bg-zinc-800/80 hover:bg-zinc-700 border border-zinc-600 text-zinc-200":"bg-black hover:bg-zinc-800 text-white"}`,children:Xe?s.jsx(s.Fragment,{children:"生成中..."}):s.jsxs(s.Fragment,{children:[s.jsx(Ia,{size:14,fill:"currentColor"}),"生成"]})})})]});return $e?Ni.createPortal(s.jsx("div",{className:"fixed inset-0 z-[99999] flex flex-col overflow-hidden",style:{backgroundColor:t?"#09090b":"#f4f4f5"},children:Yt}),document.body):Yt},eue=40,ZE=2,QE=32,tue=4,g7="#000000";function eI(e){if(/^#[0-9A-Fa-f]{6}$/.test(e))return e;if(/^#[0-9A-Fa-f]{3}$/.test(e)){const t=e[1]+e[1],n=e[2]+e[2],r=e[3]+e[3];return`#${t}${n}${r}`}return g7}const nue=({node:e,isDark:t,updateNode:n,setNodes:r,nodes:i,generateId:a,onDrawingChange:o})=>{var V,N,j,k,W;const l=_.useRef(null),c=_.useRef(null),u=_.useRef(!1),d=_.useRef([]),h=((V=e.settings)==null?void 0:V.doodleStrokes)||[],p=((N=e.settings)==null?void 0:N.doodleBrushSize)??tue,f=Math.max(ZE,Math.min(QE,p)),b=((j=e.settings)==null?void 0:j.doodleBrushColor)??g7,g=((k=e.settings)==null?void 0:k.doodleBackgroundColor)??(t?"#171717":"#fafafa"),y=((W=e.settings)==null?void 0:W.doodleToolMode)??"pen",[w,v]=_.useState(null),[m,z]=_.useState(!1),C=Math.max(80,e.width),E=Math.max(80,e.height-eue),I=_.useCallback(M=>{n(e.id,{settings:{...e.settings,doodleStrokes:M}})},[e.id,e.settings,n]),R=_.useCallback(M=>{var ee,pe,we;const Y=(ee=l.current)==null?void 0:ee.getBoundingClientRect();if(!Y)return null;const se="touches"in M?(pe=M.touches[0])==null?void 0:pe.clientX:M.clientX,ie="touches"in M?(we=M.touches[0])==null?void 0:we.clientY:M.clientY;if(se==null||ie==null)return null;const oe=C/Y.width,re=E/Y.height;return{x:(se-Y.left)*oe,y:(ie-Y.top)*re}},[C,E]),A=_.useCallback(()=>{const M=l.current,Y=M==null?void 0:M.getContext("2d");if(!M||!Y)return;Y.fillStyle=g,Y.fillRect(0,0,M.width,M.height),(w?[...h,w]:h).forEach(ie=>{if(ie.points.length<2)return;Y.beginPath(),Y.strokeStyle=ie.color,Y.lineWidth=ie.width,Y.lineCap="round",Y.lineJoin="round",Y.globalAlpha=ie.opacity??1;const oe=ie.x??0,re=ie.y??0;ie.points.forEach((ee,pe)=>{const we=oe+ee.x,Q=re+ee.y;pe===0?Y.moveTo(we,Q):Y.lineTo(we,Q)}),Y.stroke()}),Y.globalAlpha=1},[h,w,g]);_.useEffect(()=>{const M=l.current;if(!M)return;const Y=C,se=E;(M.width!==Y||M.height!==se)&&(M.width=Y,M.height=se),A()},[C,E,A]);const O=y==="eraser"?g:b,F=_.useCallback(M=>{M.preventDefault();const Y=R(M);Y&&(u.current=!0,o==null||o(!0),d.current=[Y],v({id:`doodle-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,points:[Y],color:O,width:y==="eraser"?Math.max(f*2,16):f,opacity:1,x:0,y:0,rotation:0,scale:1}))},[R,O,f,y,o]),L=_.useCallback(M=>{if(!u.current)return;const Y=R(M);Y&&(d.current.push(Y),v(se=>se?{...se,points:[...d.current]}:null))},[R]),X=_.useCallback(()=>{if(!u.current)return;u.current=!1,o==null||o(!1);const M=d.current;if(M.length>=2){const Y={id:`doodle-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,points:M,color:O,width:y==="eraser"?Math.max(f*2,16):f,opacity:1,x:0,y:0,rotation:0,scale:1};I([...h,Y])}v(null),d.current=[]},[h,O,f,y,I,o]);_.useEffect(()=>{const M=()=>{if(u.current){u.current=!1,o==null||o(!1);const Y=d.current;if(Y.length>=2){const se={id:`doodle-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,points:Y,color:O,width:y==="eraser"?Math.max(f*2,16):f,opacity:1,x:0,y:0,rotation:0,scale:1};I([...h,se])}v(null),d.current=[]}};return window.addEventListener("mouseup",M),window.addEventListener("touchend",M),()=>{window.removeEventListener("mouseup",M),window.removeEventListener("touchend",M)}},[O,f,y,h,I,o]);const T=_.useCallback(async()=>{const M=w?[...h,w]:h;if(M.length===0)return;const Y={strokes:M,textElements:[],images:[],layers:[],backgroundColor:g,aspectRatio:"1:1",width:C,height:E};try{let se=null;const ie=await lb(Y,C,E,!1,!0);if(!ie)return;let oe=ie;try{const{assetStore:Q}=await mn(async()=>{const{assetStore:te}=await Promise.resolve().then(()=>_s);return{assetStore:te}},void 0,import.meta.url),ue=await(await fetch(ie)).blob(),U=`doodle_${Date.now()}_${e.id}`;if(await Q.saveBlobAsset(U,ue,ie)){const te=await Q.getAssetUrl(U);te&&(oe=te),se=U}}catch{}const re=e.x+e.width+60,ee=e.y,pe=a(),we=Ms(pe,"input-image",re,ee,void 0,{mediaType:"image"},i);we.content=oe,we.settings={...we.settings,mediaType:"image",_blobUrl:oe},se&&(we._contentAssetId=se),r(Q=>[...Q,we])}catch(se){console.error("[DoodleCanvasNodeInline] 导出失败:",se)}},[h,w,C,E,g,e.id,e.x,e.width,e.y,a,i,r]),q=M=>{n(e.id,{settings:{...e.settings,doodleBrushSize:M}})},H=M=>{n(e.id,{settings:{...e.settings,doodleBrushColor:M}})},J=M=>{n(e.id,{settings:{...e.settings,doodleBackgroundColor:M}})},Z=M=>{n(e.id,{settings:{...e.settings,doodleToolMode:M}})},B=h.length>0||w!=null;return s.jsxs("div",{ref:c,className:`relative w-full h-full flex flex-col rounded-xl overflow-hidden ${t?"bg-zinc-900":"bg-zinc-100"}`,onMouseDown:M=>M.stopPropagation(),onClick:M=>M.stopPropagation(),children:[s.jsx("div",{className:"flex-1 min-h-0 relative",style:{touchAction:"none"},children:s.jsx("canvas",{ref:l,width:C,height:E,className:"absolute inset-0 w-full h-full block",style:{touchAction:"none",cursor:y==="eraser"?"cell":"crosshair"},onMouseDown:F,onMouseMove:L,onMouseLeave:X,onMouseUp:X,onTouchStart:F,onTouchMove:L,onTouchEnd:X})}),s.jsxs("div",{className:`flex-shrink-0 flex items-center justify-between gap-2 px-2 py-1.5 border-t ${t?"bg-zinc-900/95 border-zinc-800":"bg-zinc-50 border-zinc-200"}`,children:[s.jsxs("div",{className:"flex items-center gap-1.5",children:[s.jsxs("div",{className:"flex items-center gap-0.5",children:[s.jsx("button",{type:"button",title:"画笔",onClick:M=>{M.stopPropagation(),Z("pen")},className:`w-6 h-6 flex items-center justify-center rounded transition-colors ${y==="pen"?t?"bg-blue-600 text-white":"bg-black text-white":t?"bg-zinc-800 text-zinc-400 hover:bg-zinc-700":"bg-zinc-200 text-zinc-600 hover:bg-zinc-300"}`,children:s.jsx(T5,{size:14})}),s.jsx("button",{type:"button",title:"橡皮擦",onClick:M=>{M.stopPropagation(),Z("eraser")},className:`w-6 h-6 flex items-center justify-center rounded transition-colors ${y==="eraser"?t?"bg-blue-600 text-white":"bg-black text-white":t?"bg-zinc-800 text-zinc-400 hover:bg-zinc-700":"bg-zinc-200 text-zinc-600 hover:bg-zinc-300"}`,children:s.jsx(gb,{size:14})})]}),s.jsxs("div",{className:"flex items-center gap-1.5",children:[s.jsxs("span",{className:`text-[10px] shrink-0 w-6 text-right ${t?"text-zinc-400":"text-zinc-500"}`,title:y==="eraser"?`橡皮擦 ${Math.max(f*2,16)}px`:`画笔 ${f}px`,children:[y==="eraser"?Math.max(f*2,16):f,"px"]}),s.jsx("input",{type:"range",min:ZE,max:QE,value:f,onChange:M=>{M.stopPropagation(),q(Number(M.target.value))},onClick:M=>M.stopPropagation(),title:y==="eraser"?"橡皮擦大小":"画笔大小",className:`w-20 h-1.5 rounded-full appearance-none cursor-pointer accent-blue-500 ${t?"bg-zinc-700":"bg-zinc-300"}`})]}),y==="pen"&&s.jsx("label",{className:"flex items-center gap-1 cursor-pointer",title:"画笔颜色(自由选色)",children:s.jsx("input",{type:"color",value:eI(b),onChange:M=>{M.stopPropagation(),H(M.target.value)},onClick:M=>M.stopPropagation(),className:"w-6 h-6 rounded border border-zinc-500 cursor-pointer bg-transparent overflow-hidden",style:{padding:0}})}),s.jsx("span",{className:`text-[10px] ${t?"text-zinc-500":"text-zinc-400"}`,children:"|"}),s.jsxs("div",{className:"flex items-center gap-0.5",children:[s.jsxs("button",{type:"button",onClick:M=>{M.stopPropagation(),z(Y=>!Y)},title:"画布背景色(自由选色)",className:`flex items-center gap-0.5 px-1.5 py-0.5 rounded border ${t?`hover:bg-zinc-800 border-transparent ${m?"bg-zinc-800":""}`:`border-black bg-black text-white hover:bg-zinc-800 ${m?"bg-zinc-800":""}`}`,children:[m?s.jsx(Ei,{size:12,className:t?"text-zinc-400":"text-white"}):s.jsx(Ja,{size:12,className:t?"text-zinc-400":"text-white"}),s.jsx(zh,{size:12,className:t?"text-zinc-400":"text-white"}),s.jsx("span",{className:`text-[10px] ${t?"text-zinc-500":"text-white"}`,children:"背景"}),s.jsx("div",{className:`w-4 h-4 rounded border shrink-0 ${g==="#ffffff"||g==="#fafafa"||g==="#fef3c7"?"border-zinc-400":"border-transparent"}`,style:{backgroundColor:g}})]}),m&&s.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",title:"背景色(自由选色)",children:[s.jsx("span",{className:"text-[10px] text-zinc-500",children:"选色"}),s.jsx("input",{type:"color",value:eI(g),onChange:M=>{M.stopPropagation(),J(M.target.value)},onClick:M=>M.stopPropagation(),className:"w-6 h-6 rounded border border-zinc-500 cursor-pointer bg-transparent overflow-hidden",style:{padding:0}})]})]})]}),s.jsxs("button",{type:"button",onClick:M=>{M.stopPropagation(),T()},disabled:!B,title:B?"导出到画布":"请先绘制",className:`flex items-center gap-1 px-2 py-1 rounded text-xs ${B?t?"bg-blue-600 text-white hover:bg-blue-500":"bg-black text-white hover:bg-zinc-800":t?"bg-zinc-800 text-zinc-500 cursor-not-allowed":"bg-zinc-200 text-zinc-400 cursor-not-allowed"}`,children:[s.jsx(mu,{size:14}),"导出"]})]})]})},Vf=(e,t)=>e===t?!0:JSON.stringify(e)===JSON.stringify(t),rue=(e,t)=>{var r,i,a,o;if(e.node.type==="local-save"||t.node.type==="local-save"||t.promptLibraryEditorOpen||e.dataVersion!==t.dataVersion)return!1;const n=["text-node","gen-image","gen-video","motion-control","generate-character-image","generate-scene-image","generate-character-video","generate-scene-video","custom-agent","image-compare","jimeng-super-resolution","storyboard-node","storyboard-chart-node","table-editor-node","rh-comfy","rh-app","inpaint-crop","inpaint-stitch"];if(n.includes(e.node.type)||n.includes(t.node.type)){if(e.connections!==t.connections)return!1;const l=new Set;t.connections.forEach(c=>{c.to===t.node.id&&l.add(c.from)});for(const c of l){const u=e.nodes.find(h=>h.id===c),d=t.nodes.find(h=>h.id===c);if((u==null?void 0:u.content)!==(d==null?void 0:d.content)||(u==null?void 0:u.selectedPreviewImage)!==(d==null?void 0:d.selectedPreviewImage)||(u==null?void 0:u.previewType)!==(d==null?void 0:d.previewType)||!Vf(u==null?void 0:u.previewMjImages,d==null?void 0:d.previewMjImages)||!Vf(u==null?void 0:u.settings,d==null?void 0:d.settings)||(u==null?void 0:u.prompt)!==(d==null?void 0:d.prompt))return!1}}return!((e.node.type==="text-node"||t.node.type==="text-node")&&e.connections!==t.connections||(e.node.type==="gen-image"||e.node.type==="gen-video")&&e.connections!==t.connections||(e.node.type==="generate-character-image"||t.node.type==="generate-character-image"||e.node.type==="generate-scene-image"||t.node.type==="generate-scene-image"||e.node.type==="generate-character-video"||t.node.type==="generate-character-video"||e.node.type==="generate-scene-video"||t.node.type==="generate-scene-video")&&(e.connections!==t.connections||e.nodes!==t.nodes)||(e.node.type==="custom-agent"||t.node.type==="custom-agent")&&(e.connections!==t.connections||e.nodes!==t.nodes)||(e.node.type==="video-input"||t.node.type==="video-input")&&(!Vf(e.node.frames,t.node.frames)||!Vf(e.node.selectedKeyframes,t.node.selectedKeyframes)||e.node.extractingFrames!==t.node.extractingFrames)||e.node.id!==t.node.id||e.node.type!==t.node.type||e.node.content!==t.node.content||e.node.prompt!==t.node.prompt||e.node.isGenerating!==t.node.isGenerating||e.node.errorMsg!==t.node.errorMsg||e.node.x!==t.node.x||e.node.y!==t.node.y||e.node.width!==t.node.width||e.node.height!==t.node.height||e.node.selectedPreviewImage!==t.node.selectedPreviewImage||!Vf(e.node.previewMjImages,t.node.previewMjImages)||!Vf(e.node.settings,t.node.settings)||e.isDark!==t.isDark||e.view.zoom!==t.view.zoom||e.connectingSource!==t.connectingSource||e.connectingTarget!==t.connectingTarget||e.connectingInputType!==t.connectingInputType||((r=e.activeDropdown)==null?void 0:r.nodeId)!==((i=t.activeDropdown)==null?void 0:i.nodeId)||((a=e.activeDropdown)==null?void 0:a.type)!==((o=t.activeDropdown)==null?void 0:o.type)||e.promptLibraryCollapsed!==t.promptLibraryCollapsed||e.promptLibraryEditorOpen!==t.promptLibraryEditorOpen||(t.promptLibraryEditorOpen||e.promptLibraryEditorOpen)&&(e.promptLibraryForm.name!==t.promptLibraryForm.name||e.promptLibraryForm.prompt!==t.promptLibraryForm.prompt))},sue=new Set(["gen-image","gen-video","motion-control","preview","storyboard-chart-node","video-input","video-analyze","input-image","rh-app","rh-comfy","jimeng-super-resolution"]),iue=e=>{const{node:t,view:n,renderQuality:r="high"}=e,a=EH()||!1?r:"high",o=t.isGenerating?"high":a,l=o==="low"&&sue.has(t.type)?"high":o;switch(t.type){case"input-image":return s.jsx(Cle,{node:t,isDark:e.isDark,updateNode:e.updateNode,viewZoom:e.view.zoom,view:e.view,canvasRef:e.canvasRef,renderQuality:l,setInputImageContextMenu:e.setInputImageContextMenu,isCompactMode:e.isCompactMode,onCompactModeImageClick:e.onCompactModeImageClick,setLightboxItem:c=>{if(console.log("[NodeContent] Received lightbox item from InputImageNode:",c),console.log("[NodeContent] props.setLightboxItem type:",typeof e.setLightboxItem),c&&c.url){const u={id:t.id,type:c.type,url:c.url,prompt:t.prompt||"",title:c.title};console.log("[NodeContent] Setting lightbox with data:",u),console.log("[NodeContent] Calling props.setLightboxItem...");try{e.setLightboxItem(u),console.log("[NodeContent] props.setLightboxItem called successfully")}catch(d){console.error("[NodeContent] Error calling props.setLightboxItem:",d)}}else console.warn("[NodeContent] Invalid lightbox item:",c),e.setLightboxItem(null)},setLightboxOpen:e.setLightboxOpen,nodes:e.nodes,connections:e.connections,setNodes:e.setNodes,setConnections:e.setConnections,setSelectedNodeId:e.setSelectedNodeId,generateId:e.generateId,apiConfigs:e.apiConfigs,globalApiKey:e.globalApiKey,setHistory:e.setHistory});case"text-node":return s.jsx(Ile,{node:t,isDark:e.isDark,updateNode:e.updateNode,connections:e.connections,nodes:e.nodes,setConnections:e.setConnections,apiConfigs:e.apiConfigs,globalApiKey:e.globalApiKey,getConnectedInputImages:e.getConnectedInputImages,getOrderedInputItems:e.getOrderedInputItems});case"novel-input":return s.jsx(kle,{node:t,isDark:e.isDark,updateNode:e.updateNode,setNodes:e.setNodes,setConnections:e.setConnections,apiConfigs:e.apiConfigs});case"extract-characters-scenes":return s.jsx(Ale,{node:t,isDark:e.isDark,updateNode:e.updateNode,setNodes:e.setNodes,setConnections:e.setConnections,apiConfigs:e.apiConfigs,globalApiKey:e.globalApiKey});case"character-description":case"scene-description":return s.jsx(Mle,{node:t,isDark:e.isDark,updateNode:e.updateNode,setNodes:e.setNodes,setConnections:e.setConnections,apiConfigs:e.apiConfigs,globalApiKey:e.globalApiKey,filterJimengModels:e.filterJimengModels});case"generate-character-image":case"generate-scene-image":return s.jsx(Ole,{node:t,nodes:e.nodes,connections:e.connections,isDark:e.isDark,updateNode:e.updateNode,setNodes:e.setNodes,setHistory:e.setHistory,apiConfigs:e.apiConfigs,globalApiKey:e.globalApiKey,connectingSource:e.connectingSource,connectingTarget:e.connectingTarget,connectingInputType:e.connectingInputType,setConnectingSource:e.setConnectingSource,setConnectingTarget:e.setConnectingTarget,setConnectingInputType:e.setConnectingInputType,setConnections:e.setConnections,setMousePos:e.setMousePos,canvasRef:e.canvasRef,view:e.view,getConnectedImageForInput:e.getConnectedImageForInput,generate:e.generate,generateId:e.generateId});case"generate-character-video":case"generate-scene-video":return s.jsx(Lle,{node:t,nodes:e.nodes,connections:e.connections,isDark:e.isDark,updateNode:e.updateNode,setHistory:e.setHistory,apiConfigs:e.apiConfigs,globalApiKey:e.globalApiKey,characterLibrary:e.characterLibrary,getDurationsForModel:nu,getDefaultDurationForModel:jv,isGrokVideoModel:hl,isVeoModel:dl,isHailuoModel:Qd,supportsStartEndFrames:Kd,GROK_VIDEO_RATIOS:Lp,connectingSource:e.connectingSource,connectingTarget:e.connectingTarget,connectingInputType:e.connectingInputType,setConnectingTarget:e.setConnectingTarget,setConnectingInputType:e.setConnectingInputType,setMousePos:e.setMousePos,canvasRef:e.canvasRef,view:e.view,getConnectedImageForInput:e.getConnectedImageForInput,generate:e.generate});case"create-character":case"create-scene":return s.jsx(Ble,{node:t,nodes:e.nodes,connections:e.connections,isDark:e.isDark,updateNode:e.updateNode,apiConfigs:e.apiConfigs,globalApiKey:e.globalApiKey,setCharacterLibrary:e.setCharacterLibrary});case"video-input":return s.jsx(Ule,{node:t,nodes:e.nodes,connections:e.connections,isDark:e.isDark,updateNode:e.updateNode,frameSelectionRef:e.frameSelectionRef,setFrameContextMenu:e.setFrameContextMenu,renderQuality:l});case"video-analyze":return s.jsx(Fle,{node:t,nodes:e.nodes,connections:e.connections,isDark:e.isDark,updateNode:e.updateNode,setNodes:e.setNodes,setConnections:e.setConnections,apiConfigs:e.apiConfigs,generateId:e.generateId,handleGeneratePrompts:e.handleGeneratePrompts,handleAutoVideoAnalysis:e.handleAutoVideoAnalysis});case"storyboard-chart-node":return s.jsx(Qce,{node:t,isDark:e.isDark,updateNode:e.updateNode,connections:e.connections,nodes:e.nodes,apiConfigs:e.apiConfigs,globalApiKey:e.globalApiKey,getConnectedInputImages:e.getConnectedInputImages,generateChartBatch:e.generateChartBatch,generateFromScriptForChart:e.generateFromScriptForChart,setNodes:e.setNodes,setConnections:e.setConnections,generateId:e.generateId,filterJimengModels:e.filterJimengModels,renderQuality:l,chartArtStyles:e.chartArtStyles});case"storyboard-node":return s.jsx(Qle,{node:t,isDark:e.isDark,apiConfigs:e.apiConfigs,getConnectedVideoAnalyzeNode:e.getConnectedVideoAnalyzeNode,importShotsFromAnalysis:e.importShotsFromAnalysis,updateShot:e.updateShot,generateSingleShot:e.generateSingleShot,deleteShot:e.deleteShot,addEmptyShot:e.addEmptyShot,setLightboxItem:e.setLightboxItem,setLightboxOpen:e.setLightboxOpen,nodes:e.nodes,connections:e.connections,getConnectedInputImages:e.getConnectedInputImages,globalApiKey:e.globalApiKey,dataVersion:e.dataVersion,generateFromScript:e.generateFromScript,splitImageToShots:e.splitImageToShots,generateSequenceFromShot:e.generateSequenceFromShot,updateNode:e.updateNode,setNodes:e.setNodes,setConnections:e.setConnections,generateId:e.generateId,characterLibrary:e.characterLibrary,klingSubjectLibrary:e.klingSubjectLibrary,setKlingSubjectsOpen:e.setKlingSubjectsOpen,onDownloadStoryboardVideos:e.onDownloadStoryboardVideos,isDownloading:e.isDownloading,downloadProgress:e.downloadProgress,filterJimengModels:e.filterJimengModels});case"image-compare":return s.jsx(Jle,{node:t,isDark:e.isDark,updateNode:e.updateNode,getConnectedInputImages:e.getConnectedInputImages,nodes:e.nodes,dataVersion:e.dataVersion,isCompactMode:e.isCompactMode,onCompactModeImageClick:e.onCompactModeImageClick});case"inpaint-crop":return s.jsx(Mce,{node:t,nodes:e.nodes,connections:e.connections,isDark:e.isDark,updateNode:e.updateNode,getConnectedInputImages:e.getConnectedInputImages,setNodes:e.setNodes,setConnections:e.setConnections,generateId:e.generateId});case"inpaint-stitch":return s.jsx(Tce,{node:t,nodes:e.nodes,connections:e.connections,isDark:e.isDark,updateNode:e.updateNode,getConnectedInputImages:e.getConnectedInputImages,setPreviewContextMenu:e.setPreviewContextMenu});case"jimeng-super-resolution":return s.jsx(Ace,{node:t,nodes:e.nodes,connections:e.connections,isDark:e.isDark,updateNode:e.updateNode,setNodes:e.setNodes,setConnections:e.setConnections,getConnectedInputImages:e.getConnectedInputImages,jimengSuperResUrl:e.jimengSuperResUrl,jimengSuperResApiKey:e.jimengSuperResApiKey,generateId:e.generateId,setHistory:e.setHistory});case"local-save":return s.jsx(Hle,{node:t,isDark:e.isDark,updateNode:e.updateNode,getConnectedInputImages:e.getConnectedInputImages,getConnectedInputItems:e.getConnectedInputItems,hasMultiImageSource:e.hasMultiImageSource});case"gen-image":case"gen-video":return s.jsx(oce,{node:t,nodes:e.nodes,isDark:e.isDark,updateNode:e.updateNode,deleteNode:e.deleteNode,apiConfigs:e.apiConfigs,apiStatus:e.apiStatus,globalApiKey:e.globalApiKey,generationTimers:e.generationTimers,getConnectedInputImages:e.getConnectedInputImages,getConnectedImageForInput:e.getConnectedImageForInput,getConnectedDirectorNodes:e.getConnectedDirectorNodes,connectingSource:e.connectingSource,connectingTarget:e.connectingTarget,connectingInputType:e.connectingInputType,setConnectingSource:e.setConnectingSource,setConnectingTarget:e.setConnectingTarget,setConnectingInputType:e.setConnectingInputType,setConnections:e.setConnections,connections:e.connections,canvasRef:e.canvasRef,view:e.view,setMousePos:e.setMousePos,characterLibrary:e.characterLibrary,setCharactersOpen:e.setCharactersOpen,klingSubjectLibrary:e.klingSubjectLibrary,setKlingSubjectsOpen:e.setKlingSubjectsOpen,promptLibrary:e.promptLibrary,setPromptLibrary:e.setPromptLibrary,promptLibraryCollapsed:e.promptLibraryCollapsed,setPromptLibraryCollapsed:e.setPromptLibraryCollapsed,promptLibraryEditorOpen:e.promptLibraryEditorOpen,setPromptLibraryEditorOpen:e.setPromptLibraryEditorOpen,promptLibraryForm:e.promptLibraryForm,setPromptLibraryForm:e.setPromptLibraryForm,activeDropdown:e.activeDropdown,setActiveDropdown:e.setActiveDropdown,generate:e.generate,generateId:e.generateId,setNodes:e.setNodes,filterJimengModels:e.filterJimengModels,dataVersion:e.dataVersion,setLightboxItem:e.setLightboxItem,setLightboxOpen:e.setLightboxOpen,isCompactMode:e.isCompactMode,onCompactModeImageClick:e.onCompactModeImageClick});case"motion-control":return s.jsx(Rce,{node:t,nodes:e.nodes,connections:e.connections,view:e.view,isDark:e.isDark,updateNode:e.updateNode,generate:e.generate,generateId:e.generateId,setNodes:e.setNodes,setConnections:e.setConnections,apiConfigs:e.apiConfigs,apiStatus:e.apiStatus,globalApiKey:e.globalApiKey,klingSubjectLibrary:e.klingSubjectLibrary,setKlingSubjectsOpen:e.setKlingSubjectsOpen});case"preview":return s.jsx(Xle,{node:t,isDark:e.isDark,updateNode:e.updateNode,setNodes:e.setNodes,setPreviewContextMenu:e.setPreviewContextMenu,setLightboxItem:e.setLightboxItem,setLightboxOpen:e.setLightboxOpen,setChatFiles:e.setChatFiles,setIsChatOpen:e.setIsChatOpen,generateId:e.generateId,viewZoom:e.view.zoom,onDownload:e.onDownloadFile,isDownloading:e.isDownloading,downloadProgress:e.downloadProgress,renderQuality:l,shouldHideBorder:e.shouldHideBorder,nodes:e.nodes,connections:e.connections,splitImageToShots:e.splitImageToShots,setConnections:e.setConnections,setIsCanvasFullscreen:e.setIsCanvasFullscreen,isCompactMode:e.isCompactMode,onCompactModeImageClick:e.onCompactModeImageClick,onGenerateFromUpstream:c=>{var u,d,h,p,f,b,g,y,w,v,m,z;if(c.type==="storyboard-chart-node"&&e.generateChartBatch&&e.getConnectedInputImages){const C=((u=c.settings)==null?void 0:u.cells)||[],E=((d=c.settings)==null?void 0:d.gridMode)??"grid",I=Math.max(1,Math.min(12,((h=c.settings)==null?void 0:h.rows)??3)),R=Math.max(1,Math.min(12,((p=c.settings)==null?void 0:p.cols)??3)),A=Math.max(1,Math.min(64,((f=c.settings)==null?void 0:f.totalGrids)??9)),O=E==="grid"?A:I*R,F=((b=c.settings)==null?void 0:b.chartArtStyle)??"auto",L=F!=="auto"&&((g=e.chartArtStyles)!=null&&g.length)&&((y=e.chartArtStyles.find(H=>H.id===F))==null?void 0:y.prompt)||"",X=e.chartArtStyles||[],T=[];for(let H=0;H`@${N}`).join(" ")).trim());let B=Z||`分镜 ${H+1} 描述`;if(X.length>0){const N=[...X].sort((j,k)=>{var W,M;return(((W=k.prompt)==null?void 0:W.length)||0)-(((M=j.prompt)==null?void 0:M.length)||0)});for(const j of N){const k=(j.prompt||"").trim();if(k){if(B===k){B="";break}if(B.startsWith(k+", ")){B=B.slice(k.length+2).trim();break}if(B.startsWith(k+",")){B=B.slice(k.length+1).trim();break}if(B.startsWith(k)){B=B.slice(k.length).trim();break}}}B.trim()||(B=Z||`分镜 ${H+1} 描述`)}const V=L?`${L}, ${B}`:B;T.push({id:J.id||`c-${H}`,prompt:V})}const q=e.getConnectedInputImages(c.id)||[];e.generateChartBatch({nodeId:c.id,cells:T,model:((v=c.settings)==null?void 0:v.model)||"qwen-image-edit",ratio:((m=c.settings)==null?void 0:m.ratio)||"1:1",resolution:((z=c.settings)==null?void 0:z.resolution)||"2K",refImages:q,connections:e.connections,nodes:e.nodes,updateNode:e.updateNode,setNodes:e.setNodes,setConnections:e.setConnections,generateId:e.generateId,gridRows:E==="grid"?Math.ceil(O/3):I,gridCols:E==="grid"?3:R,targetPreviewId:t.id}).catch(()=>{try{window.dispatchEvent(new CustomEvent("previewGenerateFailed",{detail:{previewNodeId:t.id}}))}catch{}})}else{const C={...c.settings||{},_autoCreatedPreviewId:t.id,selectedPreviewId:t.id};e.updateNode(c.id,{settings:C}),requestAnimationFrame(()=>{window.dispatchEvent(new CustomEvent("previewGenerationStarted",{detail:{targetPreviewId:t.id}}))}),e.generate({...c,settings:C})}}});case"camera-movement":return s.jsx(uce,{node:t,nodes:e.nodes,connections:e.connections,isDark:e.isDark,updateNode:e.updateNode});case"professional-camera":return s.jsx(pce,{node:t,isDark:e.isDark,updateNode:e.updateNode});case"gen-music":return s.jsx(Oce,{node:t,isDark:e.isDark,updateNode:e.updateNode,setHistory:e.setHistory,apiConfigs:e.apiConfigs,globalApiKey:e.globalApiKey,generateId:e.generateId,generate:e.generate,connections:e.connections,nodes:e.nodes});case"custom-agent":return s.jsx(gce,{node:t,isDark:e.isDark,updateNode:e.updateNode,connections:e.connections,nodes:e.nodes,apiConfigs:e.apiConfigs,globalApiKey:e.globalApiKey,getConnectedInputImages:e.getConnectedInputImages,getConnectedInputItems:e.getConnectedInputItems,getOrderedInputItems:e.getOrderedInputItems,promptLibrary:e.promptLibrary,setPromptLibrary:e.setPromptLibrary,setNodes:e.setNodes,setConnections:e.setConnections,generateId:e.generateId,view:e.view,canvasRef:e.canvasRef,connectingSource:e.connectingSource,connectingTarget:e.connectingTarget,connectingInputType:e.connectingInputType,setConnectingSource:e.setConnectingSource,setConnectingTarget:e.setConnectingTarget,setConnectingInputType:e.setConnectingInputType,setMousePos:e.setMousePos,getConnectedImageForInput:e.getConnectedImageForInput,dataVersion:e.dataVersion});case"canvas-node":return s.jsx(Zce,{node:t,isDark:e.isDark,updateNode:e.updateNode,deleteNode:e.deleteNode,viewZoom:e.view.zoom,connections:e.connections,nodes:e.nodes,setNodes:e.setNodes,setConnections:e.setConnections,generateId:e.generateId});case"rh-app":return s.jsx(jce,{node:t,isDark:e.isDark,updateNode:e.updateNode,connections:e.connections,nodes:e.nodes,getConnectedInputImages:e.getConnectedInputImages,getConnectedTextForInput:e.getConnectedTextForInput,dataVersion:e.dataVersion,setHistory:e.setHistory,setNodes:e.setNodes,setConnections:e.setConnections,setConnectingTarget:e.setConnectingTarget,setConnectingInputType:e.setConnectingInputType,setConnectingSource:e.setConnectingSource,connectingSource:e.connectingSource,setMousePos:e.setMousePos,canvasRef:e.canvasRef,view:e.view,generateId:e.generateId,onSaveToRhLibrary:e.onSaveToRhLibrary});case"table-editor-node":return s.jsx(qce,{node:t,isDark:e.isDark,nodes:e.nodes,connections:e.connections,updateNode:e.updateNode,apiConfigs:e.apiConfigs,globalApiKey:e.globalApiKey,setNodes:e.setNodes,generateId:e.generateId,dataVersion:e.dataVersion});case"rh-comfy":return s.jsx(kce,{node:t,isDark:e.isDark,updateNode:e.updateNode,connections:e.connections,nodes:e.nodes,getConnectedInputImages:e.getConnectedInputImages,dataVersion:e.dataVersion,setHistory:e.setHistory,setNodes:e.setNodes,setConnections:e.setConnections,generateId:e.generateId,onSaveWorkflowToLibrary:e.onSaveWorkflowToLibrary});case"doodle-canvas":return s.jsx(nue,{node:t,isDark:e.isDark,updateNode:e.updateNode,setNodes:e.setNodes,nodes:e.nodes,generateId:e.generateId,onDrawingChange:e.onDoodleDrawingChange?c=>{var u;return(u=e.onDoodleDrawingChange)==null?void 0:u.call(e,c?t.id:null)}:void 0});default:return null}},aue=_.memo(iue,rue);function oue(e){typeof requestIdleCallback<"u"?requestIdleCallback(()=>{e().catch(()=>{})}):setTimeout(()=>{e().catch(()=>{})},2e3)}function lue(e){e.forEach(t=>{oue(t)})}function cue(){try{const e=localStorage.getItem(ri.HISTORY);let t=e?JSON.parse(e):[];const n=new Set,r=t.filter(i=>n.has(i.id)?(console.warn(`[initializeHistory] 发现重复的历史记录ID: ${i.id},已过滤`),!1):(n.add(i.id),!0));if(r.length!==t.length){console.log(`[initializeHistory] 已过滤 ${t.length-r.length} 个重复的历史记录`);try{localStorage.setItem(ri.HISTORY,JSON.stringify(r))}catch(i){console.error("[initializeHistory] 更新localStorage失败:",i)}}return hue(r),r}catch{return[]}}const uue=5e3,m_=10,due=600;function hue(e){const t=e.filter(n=>{var r;return n._assetId||n._audioAssetId||((r=n._mjAssetIds)==null?void 0:r.length)||n._mjOriginalAssetId||n._thumbnailAssetId});t.length!==0&&setTimeout(()=>{pue(t).catch(n=>{console.error("[initializeHistory] 恢复资源失败:",n)})},uue)}async function pue(e){const{assetStore:t}=await mn(async()=>{const{assetStore:i}=await Promise.resolve().then(()=>_s);return{assetStore:i}},void 0,import.meta.url);let n=0,r=0;for(let i=0;i0){const f=(await Promise.all(u.map(async b=>await t.getAssetUrl(b)||null))).filter(b=>b!==null);f.length>0&&(o.mjImages=f,n+=f.length,(!o.url||o.url.startsWith("http"))&&(o.url=f[0]))}const d=o._mjOriginalAssetId;if(d){const p=await t.getAssetUrl(d);p&&(o.mjOriginalUrl=p,n++)}const h=o._thumbnailAssetId;if(h){const p=await t.getAssetUrl(h);p&&(o.thumbnailUrl=p,n++)}}catch(l){r++,console.error(`[restoreAssetsFromAssetStore] Failed to restore assets for ${o.id}:`,l)}i+m_setTimeout(o,due))}(n>0||r>0)&&console.log(`[restoreAssetsFromAssetStore] 恢复完成: ${n} 成功, ${r} 失败 (优先级: 本地缓存 → IndexedDB)`)}const tI="qiaodoumayi_agent_prompt_library";function fue(){try{let e=[];const t=localStorage.getItem(_m);if(t)e=JSON.parse(t);else{const i=localStorage.getItem(tI);if(i){e=JSON.parse(i);try{localStorage.setItem(_m,JSON.stringify(e)),localStorage.removeItem(tI)}catch{}}}const n=new Set(e.map(i=>i.id)),r=[...e];return wC.forEach(i=>{n.has(i.id)||r.unshift(i)}),r}catch{return wC}}function mue(){try{const e=localStorage.getItem(ri.CHARACTERS);return e?JSON.parse(e):[]}catch{return[]}}class g_{constructor(){Mn(this,"listeners",new Map);Mn(this,"globalListeners",new Set)}subscribe(t,n){return this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(n),()=>{var r,i;(r=this.listeners.get(t))==null||r.delete(n),((i=this.listeners.get(t))==null?void 0:i.size)===0&&this.listeners.delete(t)}}subscribeAll(t){return this.globalListeners.add(t),()=>{this.globalListeners.delete(t)}}notify(t,n){var r;(r=this.listeners.get(t))==null||r.forEach(i=>i(n))}notifyAll(t){this.globalListeners.forEach(n=>n(t))}clear(){this.listeners.clear(),this.globalListeners.clear()}}class gue{constructor(){Mn(this,"positions",new Map);Mn(this,"sizes",new Map);Mn(this,"states",new Map);Mn(this,"positionSubs",new g_);Mn(this,"sizeSubs",new g_);Mn(this,"stateSubs",new g_);Mn(this,"batchUpdateScheduled",!1);Mn(this,"pendingPositionUpdates",new Map)}getPosition(t){return this.positions.get(t)}setPosition(t,n,r=!1){this.positions.set(t,n),r?this.positionSubs.notify(t,n):(this.pendingPositionUpdates.set(t,n),this.scheduleBatchUpdate())}setPositions(t,n=!1){t.forEach((r,i)=>{this.positions.set(i,r)}),n?t.forEach((r,i)=>{this.positionSubs.notify(i,r)}):(t.forEach((r,i)=>{this.pendingPositionUpdates.set(i,r)}),this.scheduleBatchUpdate())}subscribePosition(t,n){return this.positionSubs.subscribe(t,n)}getSize(t){return this.sizes.get(t)}setSize(t,n){this.sizes.set(t,n),this.sizeSubs.notify(t,n)}subscribeSize(t,n){return this.sizeSubs.subscribe(t,n)}getState(t){return this.states.get(t)}setState(t,n){const i={...this.states.get(t)||{isGenerating:!1,progress:0},...n};this.states.set(t,i),this.stateSubs.notify(t,i)}subscribeState(t,n){return this.stateSubs.subscribe(t,n)}scheduleBatchUpdate(){this.batchUpdateScheduled||(this.batchUpdateScheduled=!0,requestAnimationFrame(()=>{this.flushBatchUpdate()}))}flushBatchUpdate(){this.batchUpdateScheduled=!1,this.pendingPositionUpdates.size>0&&(this.pendingPositionUpdates.forEach((t,n)=>{this.positionSubs.notify(n,t)}),this.pendingPositionUpdates.clear())}flush(){this.flushBatchUpdate()}initFromNodes(t){t.forEach(n=>{this.positions.set(n.id,{x:n.x,y:n.y}),this.sizes.set(n.id,{width:n.width,height:n.height}),n.isGenerating!==void 0&&this.states.set(n.id,{isGenerating:n.isGenerating,progress:0})})}removeNode(t){this.positions.delete(t),this.sizes.delete(t),this.states.delete(t),this.pendingPositionUpdates.delete(t)}clear(){this.positions.clear(),this.sizes.clear(),this.states.clear(),this.pendingPositionUpdates.clear(),this.positionSubs.clear(),this.sizeSubs.clear(),this.stateSubs.clear()}getStats(){return{positions:this.positions.size,sizes:this.sizes.size,states:this.states.size}}}const xue=new gue,bue=42,yue=62;function vue(e,t,n){const r=e.filter(i=>t.has(i.id));if(r.length===0)return null;if(n){const i=r.find(a=>a.id===n);if(i)return i}return r.reduce((i,a)=>a.yt.has(a.id)).length<2)return e;if(n==="distribute-horizontal-top"||n==="distribute-horizontal-center-y"||n==="distribute-horizontal-bottom"){const a=b_(e,t,"distribute-horizontal");return x_(a,t,n==="distribute-horizontal-top"?"align-top":n==="distribute-horizontal-bottom"?"align-bottom":"align-center-y",r)}if(n==="distribute-vertical-left"||n==="distribute-vertical-center-x"||n==="distribute-vertical-right"){const a=b_(e,t,"distribute-vertical");return x_(a,t,n==="distribute-vertical-left"?"align-left":n==="distribute-vertical-right"?"align-right":"align-center-x",r)}return n==="distribute-horizontal"||n==="distribute-vertical"?b_(e,t,n):x_(e,t,n,r)}function x_(e,t,n,r){const i=e.filter(f=>t.has(f.id));if(i.length<2)return e;vue(e,t,r);const a=Math.min(...i.map(f=>f.x)),o=Math.max(...i.map(f=>f.x+f.width)),l=Math.min(...i.map(f=>f.y)),c=Math.max(...i.map(f=>f.y+f.height)),u=(a+o)/2,d=(l+c)/2,h=Math.max(...i.map(f=>f.width)),p=Math.max(...i.map(f=>f.height));return e.map(f=>{if(!t.has(f.id))return f;switch(n){case"align-left":return{...f,x:a};case"align-right":return{...f,x:o-f.width};case"align-top":return{...f,y:l};case"align-bottom":return{...f,y:c-f.height};case"align-center-x":return{...f,x:Math.round(u-f.width/2)};case"align-center-y":return{...f,y:Math.round(d-f.height/2)};case"match-width":{const b=Math.max(0,h),g=f.x+f.width/2,y=Math.round(g-b/2);return{...f,x:y,width:b}}case"match-height":{const b=Math.max(0,p),g=f.y+f.height/2,y=Math.round(g-b/2);return{...f,y,height:b}}default:return f}})}function b_(e,t,n){const r=e.filter(u=>t.has(u.id));if(r.length<=2)return e;if(n==="distribute-horizontal"){const u=[...r].sort((b,g)=>b.x-g.x),d=u[0],h=d.y;let p=d.x;const f=new Map;return u.forEach(b=>{f.set(b.id,{x:Math.round(p),y:h}),p+=b.width+bue}),e.map(b=>{const g=f.get(b.id);return g?{...b,x:g.x,y:g.y}:b})}const i=[...r].sort((u,d)=>u.y-d.y),a=i[0],o=a.x+a.width/2;let l=a.y;const c=new Map;return i.forEach(u=>{const d=o-u.width/2;c.set(u.id,{x:Math.round(d),y:Math.round(l)}),l+=u.height+yue}),e.map(u=>{const d=c.get(u.id);return d?{...u,x:d.x,y:d.y}:u})}async function _ue(){console.log("🧪 开始测试内存使用率..."),console.log(` +📊 初始状态:`),await Dp();const e=10*1024*1024;console.log(` +📈 开始分配内存...`);for(let t=0;t<50;t++){if(new Array(e).fill(Math.random()),(t+1)%10===0){const n=await Bl();if(console.log(`已分配 ${(t+1)*10}MB, JavaScript 堆使用率: ${n.jsHeapUsagePercent.toFixed(2)}%`),n.jsHeapUsagePercent>70){console.log("✅ JavaScript 堆使用率超过 70%,应该使用 Rust 后端");break}}await new Promise(n=>setTimeout(n,100))}console.log(` +📊 最终状态:`),await Dp(),console.log(` +🧹 清理测试数据...`),window.gc&&window.gc(),console.log(` +✅ 测试完成!`)}async function zue(){console.log("🧪 测试大数据处理(自动使用 Rust 后端)...");const e=150*1024*1024;console.log(` +📦 创建测试数据: ${(e/1024/1024).toFixed(2)} MB`);const t=new Blob([new ArrayBuffer(e)],{type:"application/octet-stream"});console.log(` +🔍 检查是否可以安全处理...`);const n=await Ww(e);console.log("检查结果:",n),console.log(` +📊 当前内存状态:`),await Dp(),console.log(` +🚀 开始处理大数据...`);try{const r=await Fw("process_file",t);console.log("✅ 处理完成!结果长度:",r.length)}catch(r){console.error("❌ 处理失败:",r)}console.log(` +📊 处理后内存状态:`),await Dp(),console.log(` +✅ 测试完成!`)}async function $ue(){console.log("🧪 测试自动切换到 Rust 后端..."),console.log(` +📊 初始状态:`);const e=await Bl();console.log(`JavaScript 堆使用率: ${e.jsHeapUsagePercent.toFixed(2)}%`),console.log(`是否使用 Rust 后端: ${e.shouldUseRust?"是":"否"}`);const t=75;console.log(` +📈 开始增加内存压力(目标: ${t}%)...`);let n=e.jsHeapUsagePercent,r=0;for(;nsetTimeout(a,50))}console.log(` +📊 最终状态:`);const i=await Bl();if(await Dp(),i.shouldUseRust){console.log(` +🚀 测试处理数据(应该使用 Rust 后端)...`);const a=new Blob([new ArrayBuffer(10*1024*1024)],{type:"application/octet-stream"});try{const o=await Fw("process_file",a);console.log("✅ 处理完成!即使数据较小,也使用了 Rust 后端")}catch(o){console.error("❌ 处理失败:",o)}}console.log(` +🧹 清理测试数据...`),window.gc&&(window.gc(),console.log("✅ 已触发垃圾回收")),console.log(` +✅ 测试完成!`)}async function Sue(){console.log(`⚡ 快速测试... +`);const e=await Bl();console.log("📊 当前状态:"),console.log(` JavaScript 堆使用率: ${e.jsHeapUsagePercent.toFixed(2)}%`),console.log(` 是否使用 Rust 后端: ${e.shouldUseRust?"是 ✅":"否 ❌"}`),console.log(` 系统总内存: ${e.systemTotalGB.toFixed(2)} GB`),console.log(` 建议: ${e.recommendation}`),console.log(` +🧪 测试不同大小的数据:`);const t=[{size:50*1024*1024,name:"50MB (小数据)"},{size:100*1024*1024,name:"100MB (临界值)"},{size:200*1024*1024,name:"200MB (大数据)"}];for(const n of t){const r=await Ww(n.size),i=n.size>=100*1024*1024||e.shouldUseRust;console.log(` + ${n.name}:`),console.log(` 大小: ${(n.size/1024/1024).toFixed(2)} MB`),console.log(` 应该使用 Rust: ${i?"是 ✅":"否 ❌"}`),console.log(` 可以安全处理: ${r.canProcess?"是 ✅":"否 ❌"}`),console.log(` 原因: ${r.reason}`),console.log(` 建议: ${r.suggestion}`)}console.log(` +✅ 快速测试完成!`)}typeof window<"u"&&(window.memoryTest={testMemoryUsage:_ue,testLargeDataProcessing:zue,testAutoSwitch:$ue,quickTest:Sue},console.log("💡 内存测试工具已加载!在控制台中使用 window.memoryTest 访问"),console.log(" 例如: await window.memoryTest.quickTest()"),console.log(" 或: await window.memoryTest.testAutoSwitch()"));const nI=e=>{switch(e){case"serif":return'ui-serif, Georgia, Cambria, "Times New Roman", Times, serif';case"mono":return'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace';case"script":return'"Comic Sans MS", "Chalkboard SE", "Comic Neue", cursive';case"sans":default:return'ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif'}},V1=e=>{const t=e.length;if(t===0)return"";if(t===1)return`M ${e[0].x} ${e[0].y}`;if(t===2)return`M ${e[0].x} ${e[0].y} L ${e[1].x} ${e[1].y}`;let n=`M ${e[0].x} ${e[0].y}`;for(let i=0;i{const t="nativeEvent"in e?e.nativeEvent:e;return"pointerType"in t&&t.pointerType==="pen"&&typeof t.pressure=="number"?Math.max(.05,Math.min(1,t.pressure)):1},jue=.001;function W$(e){return e.some(t=>Math.abs(t.pressure-1)>jue)}function sI(e,t,n){const r=e.map(l=>({x:l.x,y:l.y}));if(r.length<2)return[];if(!W$(e))return[{id:"",points:r,color:t,width:n}];const i=[],a=6,o=18;for(let l=0;lg+y.pressure,0)/d.length,p=d[0],f=d[d.length-1];if(Math.hypot(f.x-p.x,f.y-p.y)<.01)continue;const b=Math.max(.6,n*x7(h));i.push({id:"",points:d.map(g=>({x:g.x,y:g.y})),color:t,width:b})}return i.length>0?i:[{id:"",points:r,color:t,width:n}]}const x7=e=>.2+Math.max(.05,Math.min(1,e))*1.6;function iI(){const[e,t]=p1(ri.THEME,"dark"),[n,r]=$g(ri.SHOW_CANVAS_GRID,!0),[i,a]=$g(ri.SHOW_CANVAS_SNAP,!1),[o,l]=_.useState([]),[c,u]=_.useState(!1),[d,h]=_.useState(!1),[p,f]=_.useState([]),b=_.useRef(null),g=_.useRef({x:0,y:0}),y=_.useRef(!1),[w,v]=$g(ri.SHOW_CANVAS_MINIMAP,!0),[m,z]=p1(ri.CANVAS_BG_COLOR_LIGHT,O$),[C,E]=p1(ri.CANVAS_BG_COLOR_DARK,L$),[I,R]=_.useState("select"),[A,O]=_.useState([]),[F,L]=_.useState([]),X=_.useRef([]),[T,q]=_.useState(null),[H,J]=_.useState(null),Z=_.useRef([]),B=_.useRef([]),V=_.useRef(0),N=_.useRef(null),j=_.useRef(null),k=_.useRef(null),W=_.useRef(null),[M,Y]=_.useState("brush"),[se,ie]=_.useState("#171717"),[oe,re]=_.useState(2.75),[ee,pe]=_.useState(18),[we,Q]=_.useState([]),[me,ue]=_.useState(null),[U,G]=_.useState("#171717"),te=_.useRef("#171717"),ge=_.useRef(2.75),ne=_.useRef(18),[le,fe]=_.useState(null),[be,de]=_.useState(null),[$e,ze]=_.useState(null),[_e,Ee]=_.useState(!1),[Ce,xe]=_.useState(null),Ne=_.useRef(!1),ve=_.useRef(null),ke=_.useRef(null),{toasts:Ie,success:Pe,error:Te,loading:Be,updateToast:He,removeToast:Je}=YQ();_.useEffect(()=>{X.current=F},[F]),_.useEffect(()=>{te.current=se},[se]),_.useEffect(()=>{ge.current=oe},[oe]),_.useEffect(()=>{ne.current=ee},[ee]),_.useEffect(()=>{if(we.length===0)return;const ye=we[0],We=X.current.find(ft=>ft.id===ye);We&&G(We.color)},[we.join(",")]),_.useEffect(()=>{const ye=We=>{var sn;if(I!=="doodle"||M!=="select"||!we.length)return;const ft=We.target;if(ft&&(ft.tagName==="INPUT"||ft.tagName==="TEXTAREA"||ft.isContentEditable)||!(We.key==="Delete"||We.key==="Del"||We.code==="Delete"))return;const Rt=new Set(we);We.preventDefault(),We.stopPropagation(),(sn=We.stopImmediatePropagation)==null||sn.call(We),L(Dt=>Dt.filter(Xt=>!Rt.has(Xt.id))),Q([]),ue(null)};return window.addEventListener("keydown",ye,!0),()=>{window.removeEventListener("keydown",ye,!0)}},[I,M,we]),_.useEffect(()=>{const ye=document.documentElement;e==="dark"?(ye.classList.add("theme-dark"),ye.classList.remove("theme-light"),document.body.style.backgroundColor="#09090b"):(ye.classList.add("theme-light"),ye.classList.remove("theme-dark"),document.body.style.backgroundColor="#f4f4f5")},[e]),_.useEffect(()=>{const We="./".endsWith("/")?"./":".//";document.documentElement.style.setProperty("--app-doodle-cursor",`url('${We}doodle-cursor.svg') 16 16`)},[]),_.useEffect(()=>{const ye=setTimeout(()=>u(!0),80);return()=>clearTimeout(ye)},[]),_.useEffect(()=>{lQ()},[]),_.useEffect(()=>{const ye=setTimeout(()=>{mn(async()=>{const{optimizationTracker:We}=await Promise.resolve().then(()=>ipe);return{optimizationTracker:We}},void 0,import.meta.url).then(({optimizationTracker:We})=>{We.start("应用启动"),typeof window<"u"&&(window.optimizationTracker=We)}).catch(()=>{})},6e3);return()=>clearTimeout(ye)},[]);const Me=_.useRef(!1);_.useEffect(()=>{if(!Me.current)return Me.current=!0,Promise.all([mn(async()=>{const{initializeEnvironment:ye}=await Promise.resolve().then(()=>ope);return{initializeEnvironment:ye}},void 0,import.meta.url).then(({initializeEnvironment:ye})=>ye().catch(()=>{}))]).then(()=>{setTimeout(()=>{mn(async()=>{const{memoryMonitor:ye}=await Promise.resolve().then(()=>aw);return{memoryMonitor:ye}},void 0,import.meta.url).then(({memoryMonitor:ye})=>{ye.start(),typeof window<"u"&&(window.memoryMonitor=ye)}).catch(()=>{}),mn(async()=>{const{initIdleMemoryCleanup:ye}=await Promise.resolve().then(()=>dpe);return{initIdleMemoryCleanup:ye}},void 0,import.meta.url).then(({initIdleMemoryCleanup:ye})=>{ye()}).catch(()=>{})},5e3)}).catch(()=>{}),setTimeout(()=>{mn(async()=>{const{initializePerformanceOptimization:ye}=await Promise.resolve().then(()=>mpe);return{initializePerformanceOptimization:ye}},void 0,import.meta.url).then(({initializePerformanceOptimization:ye})=>{ye()}).catch(()=>{}),mn(async()=>{const{initializeFinalOptimization:ye}=await Promise.resolve().then(()=>ype);return{initializeFinalOptimization:ye}},void 0,import.meta.url).then(({initializeFinalOptimization:ye})=>{ye()}).catch(()=>{})},4e3),()=>{}},[]),_.useEffect(()=>{const ye=setTimeout(()=>{lue([()=>mn(()=>Promise.resolve().then(()=>mee),void 0,import.meta.url),()=>mn(()=>Promise.resolve().then(()=>mte),void 0,import.meta.url),()=>mn(()=>Promise.resolve().then(()=>yte),void 0,import.meta.url),()=>mn(()=>Promise.resolve().then(()=>kQ),void 0,import.meta.url).then(We=>({default:We.CategorizedExportModal})),()=>mn(()=>Promise.resolve().then(()=>AQ),void 0,import.meta.url).then(We=>({default:We.FeatureControlPanel}))])},5e3);return()=>clearTimeout(ye)},[]),_.useEffect(()=>{const ye=console.error;return console.error=(...We)=>{var Mt;const ft=((Mt=We[0])==null?void 0:Mt.toString())||"";ft.includes("ERR_FILE_NOT_FOUND")||ft.includes("ERR_CONNECTION_REFUSED")||ft.includes("blob:http")&&ft.includes("net::")||ye.apply(console,We)},()=>{console.error=ye}},[]);const{configs:Re,globalApiKey:Ve,globalBaseUrl:Ze,activeEndpoint:je,jimengUseLocalFile:Le,jimengSuperResUrl:Xe,jimengSuperResApiKey:qe,getEndpoints:tt,updateConfig:Ye,updateConfigs:ct,setGlobalApiKey:pt,setGlobalBaseUrl:ht,switchEndpoint:wt,setJimengSessionId:$t,setJimengUseLocalFile:jt,setJimengSuperResUrl:Nt,setJimengSuperResApiKey:Yt}=TH();_.useEffect(()=>{const ye=setTimeout(()=>{mn(async()=>{const{initGeminiMarkerService:We}=await Promise.resolve().then(()=>wpe);return{initGeminiMarkerService:We}},void 0,import.meta.url).then(({initGeminiMarkerService:We})=>{We(Re,Ve),console.log("[App] Gemini 标记分析服务已初始化")})},2e3);return()=>clearTimeout(ye)},[Re,Ve]);const{showBaseUrl:un,showJimengModels:Tn,showWatermark:Ht,showGeminiImageOfficialModels:fn,showGrsaiModels:Dn,showSeedanceHiddenFeatures:it,authMode:Lt,authenticate:gt,toggleJimengModels:Jt,toggleWatermark:Wt,toggleZImageTurbo:Pt,toggleGeminiImageOfficialModels:Bt,toggleGrsaiModels:zt,toggleSeedanceHiddenFeatures:Gt,filterModels:qt}=aQ();Noe({enabled:!1});const[De,st]=_.useState([]),[Ae,nt]=_.useState([]),[_t,xt]=_.useState([]),[Tt,St]=_.useState(null),[Qe,Ue]=_.useState(0);_.useEffect(()=>{Ue(ye=>ye+1)},[De]),_.useEffect(()=>{xue.initFromNodes(De)},[De]);const[Ge,at]=_.useState({x:0,y:0,zoom:1}),rt=_.useRef({x:0,y:0,zoom:1}),[lt,ot]=_.useState(!1),[At,kt]=_.useState(!1),[Ot,dn]=_.useState(null),[Vt,Zt]=_.useState(new Set),[Sn,jn]=_.useState(null),[_n,Cn]=_.useState(null),[Kn,Xn]=_.useState(0),$r=_.useRef(null),Tr=_.useRef(0),[kr,Rr]=_.useState(!1),[sr,mt]=_.useState(new Set),[It,tn]=_.useState(null),[cn,zn]=_.useState(""),[Rn,bt]=_.useState({visible:!1,prompt:"",inputImageUrls:[]}),bn=_.useCallback((ye,We)=>{mt(ft=>{const Mt=new Set(ft);return ye.forEach(Rt=>{We?Mt.add(Rt):Mt.delete(Rt)}),Mt})},[]),An=_.useRef(null),Vn=_.useRef(null),{saveState:Sr,undo:Ir,redo:Wr,setIsApplyingHistory:ir}=QZ({maxHistorySize:dh.MAX_HISTORY_SIZE});nQ({nodes:De,connections:Ae,selectedNodeIds:Vt,setNodes:st}),_.useEffect(()=>{const ye=setTimeout(()=>{Sr(De,Ae)},dh.DEBOUNCE_DELAY.HISTORY_SAVE);return()=>clearTimeout(ye)},[De,Ae,Sr]);const Yn=_.useCallback(()=>{const ye=Ir();ye&&(ir(!0),st(ye.nodes),nt(ye.connections),setTimeout(()=>ir(!1),100))},[Ir,ir]),Zn=_.useCallback(()=>{const ye=Wr();ye&&(ir(!0),st(ye.nodes),nt(ye.connections),setTimeout(()=>ir(!1),100))},[Wr,ir]),Ke=_.useCallback(ye=>{const We=new Set(Vt);Ot&&We.add(Ot),!(We.size<2)&&st(ft=>wue(ft,We,ye,Ot??void 0))},[Ot,Vt,st]),[Et,Gn]=_.useState([]);_.useEffect(()=>{const ye=setTimeout(()=>{const We=cue();Gn(We)},100);return()=>clearTimeout(ye)},[]);const Ut=_.useCallback(ye=>{Gn(We=>{const ft=typeof ye=="function"?ye(We):ye,Mt=new Map,Rt=[];for(const sn of ft)Mt.has(sn.id)||(Mt.set(sn.id,sn),Rt.push(sn));if(Rt.length{gr.current=Et},[Et]),_.useEffect(()=>{const ye=Et.filter(ft=>{var Mt;return ft.status==="generating"&&ft.remoteTaskId&&((Mt=ft.apiConfig)==null?void 0:Mt.modelId)&&No(ft.apiConfig.modelId)});if(console.log("[App] 可灵 O1 轮询检查,正在生成的任务数:",ye.length),ye.length===0)return;const We=[];return ye.forEach(ft=>{console.log("[App] 为可灵 O1 任务设置轮询:",ft.id);const Mt=setInterval(async()=>{const sn=gr.current.find(Dt=>Dt.id===ft.id);if(!sn){console.log("[App] 可灵 O1 任务不存在,停止轮询:",ft.id),clearInterval(Mt);return}if(sn.status!=="generating"){console.log("[App] 可灵 O1 任务状态已变化,停止轮询:",{id:ft.id,status:sn.status}),clearInterval(Mt);return}console.log("[App] 可灵 O1 轮询刷新任务:",ft.id);try{await Bn(sn)}catch(Dt){console.error("[App] 可灵 O1 轮询刷新失败:",Dt)}},5e3);We.push(Mt)}),()=>{console.log("[App] 清理可灵 O1 轮询定时器,数量:",We.length),We.forEach(ft=>clearInterval(ft))}},[Et,Bn]);const nr=_.useRef(!1);_.useEffect(()=>{nr.current||(nr.current=!0,vr(Et))},[Et,vr]),_.useEffect(()=>{const ye=Mt=>{const{taskId:Rt,videoUrl:sn,generationTime:Dt,sourceNodeId:Xt,previewNodeIds:xn,previewSourceModel:on}=Mt.detail;console.log("[App] 收到 klingO1VideoComplete 事件:",{taskId:Rt,videoUrl:sn==null?void 0:sn.substring(0,50),generationTime:Dt,sourceNodeId:Xt,previewNodeIds:xn}),Ut(Pn=>Pn.map(Hn=>Hn.id===Rt?(console.log("[App] 可灵 O1 视频完成,强制更新状态:",{id:Hn.id,oldStatus:Hn.status,newStatus:"completed"}),{...Hn,status:"completed",url:sn,progress:100,generationTime:Dt}):Hn)),xn&&xn.length>0&&sn&&(console.log("[App] 更新预览节点:",xn),st(Pn=>Pn.map(Hn=>{if(xn.includes(Hn.id)&&Hn.type==="preview"){console.log("[App] 更新预览节点内容:",Hn.id);const Nn={...Hn,content:sn,previewType:"video"};return on&&(Nn.settings={...Hn.settings||{},previewSourceModel:on}),Nn}return Hn}))),Xt&&(console.log("[App] 停止源节点生成状态:",Xt),st(Pn=>Pn.map(Hn=>Hn.id===Xt?{...Hn,isGenerating:!1}:Hn)))},We=Mt=>{const{assetId:Rt}=Mt.detail;console.log("[App] 收到 assetDownloadComplete 事件:",Rt);const sn=Et.find(Dt=>{var Xt;return Dt.id===Rt&&((Xt=Dt.apiConfig)==null?void 0:Xt.modelId)&&No(Dt.apiConfig.modelId)});sn&&(console.log("[App] 可灵 O1 资源下载完成,当前状态:",sn.status),console.log("[App] 强制更新状态为 completed:",Rt),Ut(Dt=>Dt.map(xn=>xn.id===Rt?(console.log("[App] 更新历史项状态:",{id:xn.id,oldStatus:xn.status,newStatus:"completed"}),{...xn,status:"completed",progress:100}):xn)))},ft=Mt=>{const{taskId:Rt}=Mt.detail;console.log("[App] 收到 allAssetsDownloadComplete 事件:",Rt);const sn=Et.find(Dt=>{var Xt;return Dt.id===Rt&&((Xt=Dt.apiConfig)==null?void 0:Xt.modelId)&&No(Dt.apiConfig.modelId)});sn&&(console.log("[App] 可灵 O1 所有资源下载完成,当前状态:",sn.status),console.log("[App] 强制更新状态为 completed:",Rt),Ut(Dt=>Dt.map(xn=>xn.id===Rt?(console.log("[App] 更新历史项状态 (all complete):",{id:xn.id,oldStatus:xn.status,newStatus:"completed"}),{...xn,status:"completed",progress:100}):xn)))};return window.addEventListener("klingO1VideoComplete",ye),window.addEventListener("assetDownloadComplete",We),window.addEventListener("allAssetsDownloadComplete",ft),()=>{window.removeEventListener("klingO1VideoComplete",ye),window.removeEventListener("assetDownloadComplete",We),window.removeEventListener("allAssetsDownloadComplete",ft)}},[Et,Ut]);const tr=_.useCallback(async ye=>{var Dt,Xt;const We=ye.url&&typeof ye.url=="string"&&ye.url.length>0,ft=ye.mjImages&&Array.isArray(ye.mjImages)&&ye.mjImages.length>0,Mt=ye.mjOriginalUrl&&typeof ye.mjOriginalUrl=="string",Rt=Mt?ye.mjOriginalUrl:We?ye.url:null;if(!Rt){console.warn("[handleRefreshMjImage] 无效的MJ图片项:缺少有效的URL",{id:ye.id,hasUrl:We,hasMjImages:ft,hasOriginalUrl:Mt,url:(Dt=ye.url)==null?void 0:Dt.substring(0,50),mjOriginalUrl:(Xt=ye.mjOriginalUrl)==null?void 0:Xt.substring(0,50)}),Te("无法刷新:缺少原始图片URL");return}const sn=Be("正在重新裁切MJ图片...");try{console.log("[handleRefreshMjImage] 开始重新裁切MJ图片:",{id:ye.id,sourceUrl:Rt.substring(0,50),existingMjImages:ft?ye.mjImages.length:0});let xn=Rt,on=!1;if(typeof window<"u"&&("__TAURI__"in window||"__TAURI_INTERNALS__"in window)&&(Rt.startsWith("http://")||Rt.startsWith("https://")))try{const{downloadWithFallback:Pn}=await mn(async()=>{const{downloadWithFallback:Hn}=await Promise.resolve().then(()=>n0);return{downloadWithFallback:Hn}},void 0,import.meta.url),Jn=await Pn(Rt,6e4);xn=URL.createObjectURL(Jn),on=!0}catch(Pn){console.warn("[handleRefreshMjImage] Tauri 下载原图失败,使用原 URL:",Pn)}try{const{split2x2Image:Pn}=await mn(async()=>{const{split2x2Image:ar}=await Promise.resolve().then(()=>Do);return{split2x2Image:ar}},void 0,import.meta.url),Jn=await Pn(xn);if(Jn.length===0)throw new Error("裁切失败:未生成任何图片");console.log("[handleRefreshMjImage] 裁切成功,共",Jn.length,"张图片");const{assetStore:Hn}=await mn(async()=>{const{assetStore:ar}=await Promise.resolve().then(()=>_s);return{assetStore:ar}},void 0,import.meta.url);await Hn.init();const Nn=await Promise.all(Jn.map(async(ar,bs)=>{const qi=`mj_${ye.id}_split_${bs}`;try{if(ar.url&&ar.url.startsWith("blob:")){const Ds=await fetch(ar.url);if(Ds.ok){const hi=await Ds.blob();await Hn.saveBlobAsset(qi,hi,Rt),console.log(`[handleRefreshMjImage] ✅ 切片 ${bs} 已保存到 assetStore: ${qi}`);const Ti=await Hn.getAssetUrl(qi);if(Ti)return Ti}}}catch(Ds){console.warn(`[handleRefreshMjImage] ⚠️ 保存切片 ${bs} 失败:`,Ds)}return ar.url})),hr=Jn.map((ar,bs)=>`mj_${ye.id}_split_${bs}`);Ut(ar=>ar.map(bs=>bs.id===ye.id?{...bs,url:Nn[0],mjImages:Nn,_mjAssetIds:hr,selectedMjImageIndex:0,mjNeedsSplit:!1,mjOriginalUrl:Rt}:bs));const Er=ye.sourceNodeId,as=Er?De.filter(ar=>ar.type==="preview"&&Ae.some(bs=>bs.from===Er&&bs.to===ar.id)):[];as.length>0?(console.log("[handleRefreshMjImage] 找到",as.length,"个连接的预览节点"),console.log("[handleRefreshMjImage] 预览节点IDs:",as.map(ar=>ar.id)),st(ar=>ar.map(bs=>as.some(qi=>qi.id===bs.id)?(console.log("[handleRefreshMjImage] 更新预览节点:",bs.id),{...bs,content:Nn[0],previewMjImages:Nn,selectedPreviewImage:Nn[0]}):bs))):console.log("[handleRefreshMjImage] 未找到连接的预览节点",{sourceNodeId:Er,hasSourceNodeId:!!Er,totalNodes:De.length,previewNodes:De.filter(ar=>ar.type==="preview").length,connections:Ae.length}),console.log("[handleRefreshMjImage] MJ图片刷新完成"),He(sn,{type:"success",message:"刷新成功"})}finally{on&&xn.startsWith("blob:")&&URL.revokeObjectURL(xn)}}catch(xn){console.error("[handleRefreshMjImage] 刷新失败:",xn);const on=xn instanceof Error?xn.message:"未知错误";He(sn,{type:"error",message:`刷新失败: ${on}`})}},[Ut,De,Ae,st,Te,Be,He]),{chatSessions:jr,setChatSessions:Br,currentChatId:_r,setCurrentChatId:es,chatInput:Ur,setChatInput:zs,isChatOpen:Ts,setIsChatOpen:os,chatWidth:wi,chatFontSize:ki,setChatFontSize:gi,chatFiles:$i,setChatFiles:gs,chatModel:Ri,setChatModel:Ki,isChatSending:Ps,historyMessageCount:Si,setHistoryMessageCount:xi,chatSkillMode:li,setChatSkillMode:ca,deleteChatSession:ea,deleteChatMessages:Wa,createNewChat:ks,renameChatSession:Pi,sendChatMessage:_i,handleChatResizeStart:ta,sessionsForCurrentMode:ua}=mY({apiConfigs:Re,globalApiKey:Ve}),{isScriptWriterOpen:Wi,setIsScriptWriterOpen:ci,project:Oi,projectMetas:da,currentProjectId:ha,setProjectName:Li,newProject:ka,switchProject:dt,deleteProject:vt,setOutline:Kt,setScriptPromptCustom:an,setScriptSkillId:en,setEpisodeCount:rn,importTxt:gn,addEpisode:lr,removeEpisode:On,updateEpisode:wr,selectedEpisodeId:cs,setSelectedEpisodeId:Ar,scriptModel:Or,setScriptModel:ls,chatModels:Ns,smartSplitEpisodes:Di,smartSplitByDuration:ii,generateEpisodeScript:Hs,cancelGeneration:ji,isSplitting:na,isGeneratingEpisode:ui,splitProgress:fs,extractCharactersScenesProps:Js,extractCharactersScenesPropsManual:Ai,isExtracting:Wl,extractProgress:Dl,allStyles:yd,customStyles:yu,addCustomStyle:bl,removeCustomStyle:Qt,updateCustomStyle:H0,generateStyleWithAI:r0,isGeneratingStyle:s0,generateSceneConceptArt:Vl,isGeneratingConcept:Vi,extractionModelId:Hl,setExtractionModelId:ya,extractionSkillId:Gl,setExtractionSkillId:vd}=TY({apiConfigs:Re,globalApiKey:Ve}),vu=_.useCallback(ye=>{var ft;const We=[`# Ep${ye.index} ${ye.title}`,""];return ye.durationSeconds&&We.push(`**时长**: ${ye.durationSeconds}秒`,""),ye.emotionKeywords&&ye.emotionKeywords.length>0&&We.push(`**情绪关键词**: ${ye.emotionKeywords.join(" / ")}`,""),ye.segmentDetail&&(We.push("## 结构化要素","","**1. 主题**",ye.segmentDetail.subject||"(无)","","**2. 环境**",ye.segmentDetail.setting||"(无)","","**3. 动作与时间线**"),ye.segmentDetail.timeline&&ye.segmentDetail.timeline.length>0?ye.segmentDetail.timeline.forEach(Mt=>{We.push(`- ${Mt.timeRange}: ${Mt.description}`)}):We.push("- (无)"),We.push("","**4. 镜头**",ye.segmentDetail.camera||"(无)","","**5. 影像风格**",ye.segmentDetail.visualStyle||"(无)","","**6. 声音**",ye.segmentDetail.audio||"(无)","","**7. 衔接**",ye.segmentDetail.transition||"(无)","","**8. 旁白**",ye.segmentDetail.narration||"(无)","")),ye.hookSummary&&We.push("## 钩子","",ye.hookSummary,""),(ft=ye.content)!=null&&ft.trim()&&We.push("## 原始文本","",ye.content.trim()),We.join(` +`).trim()},[]),Cc=_.useCallback(ye=>{if(ye.length===0)return;const We=200,ft=200,Mt=320,Rt=280,sn=50,Dt=ye.map(()=>ns());st(Xt=>{const xn=ye.map((on,Pn)=>{const Jn=We+Pn*(Mt+sn),Hn=ft,Nn=Ms(Dt[Pn],"text-node",Jn,Hn,`片段${on.index}: ${on.title}`,void 0,Xt);Nn.width=Mt,Nn.height=Rt;const hr=vu(on);return Nn.settings={...Nn.settings,text:hr},Nn.prompt=hr,Nn});return[...Xt,...xn]})},[st,vu]),wd=_.useCallback((ye,We)=>{const ft=We==="character"?"角色":We==="scene"?"场景":"道具",Mt=ns(),Rt=360,sn=300,Dt=250+Math.random()*100,Xt=200+Math.random()*100,xn=`${ye.name}`,on=ye.visualPrompt||"",Pn=[`## ${ft}: ${ye.name}`,"",ye.description?`**描述**: ${ye.description}`:"","owner"in ye&&ye.owner?`**归属**: ${ye.owner}`:"","role"in ye&&ye.role?`**定位**: ${ye.role}`:"","","---","","**概念设计提示词:**","",on].filter(Boolean).join(` +`);st(Jn=>{const Hn=Ms(Mt,"text-node",Dt,Xt,xn,void 0,Jn);return Hn.width=Rt,Hn.height=sn,Hn.settings={...Hn.settings,text:Pn},Hn.prompt=on,[...Jn,Hn]})},[st]),wu=(ye,We)=>We===25?ye.conceptPrompt:We===4?ye.conceptPrompt4:We===6?ye.conceptPrompt6:We===9?ye.conceptPrompt9:ye.conceptPrompt,cr={4:"4宫格",6:"6宫格",9:"9宫格",25:"25宫格"},Go=_.useCallback((ye,We,ft=25)=>{const Mt=wu(We,ft);if(!Mt)return;const Rt=Oi.episodes.find(hr=>hr.id===ye),sn=Rt?`Ep${Rt.index}`:"",Dt=We.location||`SCENE ${We.sceneNumber}`,Xt=ns(),xn=360,on=320,Pn=250+Math.random()*100,Jn=200+Math.random()*100,Hn=`${sn} S${We.sceneNumber} ${Dt}`,Nn=[`## 🎬 SCENE ${We.sceneNumber} ${cr[ft]}分镜概念图`,"",`**场次**: SCENE ${We.sceneNumber}`,We.location?`**场景**: ${We.location}`:"",We.emotionTone?`**情绪基调**: ${We.emotionTone}`:"","","---","",`**${cr[ft]}概念图提示词:**`,"",Mt].filter(Boolean).join(` +`);st(hr=>{const Er=Ms(Xt,"text-node",Pn,Jn,Hn,void 0,hr);return Er.width=xn,Er.height=on,Er.settings={...Er.settings,text:Nn},Er.prompt=Mt,[...hr,Er]})},[st,Oi.episodes]),yl=_.useCallback((ye,We,ft)=>{const Mt=Oi.episodes.find(Hn=>Hn.id===ye),Rt=Mt?`Ep${Mt.index}`:"",sn=ns(),Dt=360,Xt=200,xn=250+Math.random()*100,on=200+Math.random()*100,Pn=`${Rt} S${We} 镜头`,Jn=["## 🎬 镜头提示词","",`**场次**: SCENE ${We}`,"","---","",ft.trim()].filter(Boolean).join(` +`);st(Hn=>{const Nn=Ms(sn,"text-node",xn,on,Pn,void 0,Hn);return Nn.width=Dt,Nn.height=Xt,Nn.settings={...Nn.settings,text:Jn},Nn.prompt=ft.trim(),[...Hn,Nn]})},[st,Oi.episodes]),{lightboxItem:er,lightboxOpen:Aa,setLightboxItem:qn,setLightboxOpen:go,settingsOpen:Nc,setSettingsOpen:Io,storageManageOpen:_u,setStorageManageOpen:zu,historyOpen:ko,setHistoryOpen:ql,createCharacterOpen:_d,setCreateCharacterOpen:$u,batchManageOpen:Su,setBatchManageOpen:ju,skillToWorkflowOpen:zd,setSkillToWorkflowOpen:Da}=NZ(),[Cu,Ec]=_.useState(""),[i0,$d]=_.useState(!1),{contextMenu:Kl,setContextMenu:Nu,frameContextMenu:Eu,setFrameContextMenu:Ic,historyContextMenu:Gs,setHistoryContextMenu:Xl,selectionContextMenu:kc,setSelectionContextMenu:qo,previewContextMenu:Sd,setPreviewContextMenu:Ac,inputImageContextMenu:Yl,setInputImageContextMenu:Jl,croppingNodeId:vl,setCroppingNodeId:Iu}=CZ(),{isDownloading:ku,downloadProgress:Ko,setIsDownloading:jd,setDownloadProgress:Mc,handleDownloadFile:Tc,cancelDownload:Au,getCancellationToken:Mu}=IZ(),[Tu,Cd]=_.useState({nodeId:null,shotId:null}),a0=_.useRef({}),[Zl,Ru]=_.useState({visible:!1,progress:0,status:"",type:"import"}),[o0,Ql]=_.useState(!1),xo=_.useRef(null),{apiTesting:Nd,apiStatus:Xo,testApiConnection:eo}=XZ({apiConfigs:Re,globalApiKey:Ve}),ec=_.useCallback(async(ye,We)=>{const ft=(ye||"").trim().replace(/\/+$/,"");if(!ft)return{success:!1,message:"请填写 BASE URL"};const Mt=`${ft}/health`;try{const Rt=await fetch(Mt,{method:"GET",headers:{"Content-Type":"application/json"}});if(!Rt.ok)return{success:!1,message:`连接失败 (${Rt.status})`};const sn=await Rt.json();return sn.status==="ok"?{success:!0,message:"连接成功"}:{success:!1,message:sn.message||"服务异常"}}catch(Rt){return{success:!1,message:Rt instanceof Error?Rt.message:"连接失败"}}},[]),[Va,Rc]=_.useState(()=>fue()),[Yo,Pc]=_.useState([]);_.useEffect(()=>{const ye=setTimeout(()=>{const We=mue();Pc(We)},7e3);return()=>clearTimeout(ye)},[]);const[Ha,tc]=_.useState(()=>{try{const ye=localStorage.getItem(ri.KLING_SUBJECTS);return ye?JSON.parse(ye):[]}catch{return[]}}),[Jo,Oc]=_.useState(()=>{try{const ye=localStorage.getItem(ri.SEEDANCE_ROLES);return ye?JSON.parse(ye):[]}catch{return[]}}),[Pu,Zo]=_.useState(()=>{try{const ye=localStorage.getItem(ri.RH_APP_LIBRARY);return ye?JSON.parse(ye):[]}catch{return[]}}),[Ma,Os]=_.useState("未命名项目"),[Fs,wl]=_.useState(()=>mZ()),{localCacheServerConnected:pa,localServerConfig:Ta,setLocalServerConfig:nc,localCacheSettingsOpen:Lc,setLocalCacheSettingsOpen:Ra}=bZ(),[Mi,Ou]=_.useState(!1),[Ed,Id]=p1("canvas-node-border-visibility-mode","visible");_.useEffect(()=>{BJ(Mi)},[Mi]);const[_l,Ao]=_.useState(!1),[Pa,Lu]=_.useState(null),[Bu,l0]=_.useState(null),[zl,rc]=_.useState(null),[Oa,$l]=_.useState(null),[Qo,fa]=_.useState(null),[va,bo]=_.useState(null),[ma,La]=_.useState({x:0,y:0}),[sc,Uu]=_.useState(!1),[c0,ic]=_.useState(!1),wa=pQ(),Hi=fQ({nodes:De,selectedNodeIds:Vt,isActive:sc}),ai=mQ({nodes:De,selectedNodeIds:Vt,isActive:c0}),[Ba,ac]=_.useState(null),[oc,$]=_.useState(null),[P,K]=_.useState(!1),[ae,he]=_.useState(null),Oe=_.useRef(!1),[et,yt]=_.useState(null),[Ct,nn]=_.useState(null);_.useEffect(()=>{!ae&&!P&&wa&&Vt.size>=2?De.filter(We=>Vt.has(We.id)&&We.type==="input-image"&&We.content&&We.content.length>0).length>=2?(Uu(!0),ic(!1)):(Uu(!1),Vt.size>=2?ic(!0):ic(!1)):wa||(Uu(!1),ic(!1),ac(null),$(null))},[ae,P,wa,Vt,De]),_.useEffect(()=>{Vt.size===0&&(Uu(!1),ic(!1),ac(null),$(null))},[Vt]),_.useEffect(()=>{const ye=We=>yt(We.detail);return window.addEventListener("cropSelectModeChange",ye),()=>window.removeEventListener("cropSelectModeChange",ye)},[]);const pn=_.useRef(null),Un=_.useRef(De),Qn=_.useRef(Ot),Hr=_.useRef(Vt),Zs=_.useRef(null),Ci=_.useRef(Ae),u0=_.useRef(null),G0=_.useRef(!1),hf=_.useRef(null),Dh=_.useRef({x:0,y:0}),kd=_.useRef(!1),d0=_.useRef(null),el=_.useRef(null),to=_.useRef(null),pf=_.useRef(null),[q0,Fu]=_.useState(null),[Qs,h0]=_.useState(null),[Sb,Wu]=_.useState(!1),[Ad,ff]=_.useState({name:"",prompt:""}),jb=_.useMemo(()=>({}),[]),[qs,Cb]=_.useState(()=>{try{const ye=localStorage.getItem("qiaodoumayi_viewport_size");if(ye){const We=JSON.parse(ye);if(We.width>=100&&We.height>=100)return We}}catch{}return{width:window.innerWidth,height:window.innerHeight}}),Vh=_.useCallback(ye=>{let We=ye.targetPreviewId||ye.sourceNodeId;if(!We)return;let ft=De.find(Xt=>Xt.id===We);if(!ft&&ye.sourceNodeId){const Xt=Ae.find(xn=>xn.from===ye.sourceNodeId&&De.some(on=>on.id===xn.to&&on.type==="preview"));Xt&&(ft=De.find(xn=>xn.id===Xt.to))}if(ft||(ft=De.find(Xt=>Xt.id===We)),!ft)return;const Mt=Ge.zoom,Rt=ft.x+(ft.width||320)/2,sn=ft.y+(ft.height||200)/2,Dt={x:qs.width/2-Rt*Mt,y:qs.height/2-sn*Mt,zoom:Mt};at(Dt),rt.current=Dt,dn(ft.id),Zt(new Set([ft.id]))},[De,Ae,Ge.zoom,qs,at,dn,Zt]),no=_.useMemo(()=>{const ye=We=>typeof We=="string"&&We.trim().length>0;return De.filter(We=>{if(We.type==="input-image")return ye(We.content);if(We.type==="preview"){const ft=Array.isArray(We.previewMjImages)&&We.previewMjImages.length>0,Mt=Array.isArray(We.previewMjVideos)&&We.previewMjVideos.length>0;return ft||Mt||ye(We.content)}return!1}).sort((We,ft)=>We.y-ft.y||We.x-ft.x)},[De]),K0=_.useCallback(ye=>{const We=rt.current.zoom,ft=ye.x+(ye.width||320)/2,Mt=ye.y+(ye.height||200)/2,Rt={x:qs.width/2-ft*We,y:qs.height/2-Mt*We,zoom:We},Dt={...rt.current},Xt=Rt;$r.current&&(cancelAnimationFrame($r.current),$r.current=null);const xn=Tr.current+1;Tr.current=xn;const on=380,Pn=typeof performance<"u"?performance.now():Date.now(),Jn=Nn=>Nn<.5?4*Nn*Nn*Nn:1-Math.pow(-2*Nn+2,3)/2,Hn=Nn=>{if(Tr.current!==xn)return;const hr=Nn-Pn,Er=Math.min(1,Math.max(0,hr/on)),as=Jn(Er),ar={x:Dt.x+(Xt.x-Dt.x)*as,y:Dt.y+(Xt.y-Dt.y)*as,zoom:Dt.zoom+(Xt.zoom-Dt.zoom)*as};rt.current=ar,at(ar),Er<1?$r.current=requestAnimationFrame(Hn):(rt.current=Xt,at(Xt),$r.current=null)};dn(ye.id),Zt(new Set([ye.id])),Cn(ye.id),Xn(Nn=>Nn+1),$r.current=requestAnimationFrame(Hn)},[qs.width,qs.height,at,dn,Zt]);_.useCallback(()=>{const ye=Qn.current??(Hr.current.size===1?Array.from(Hr.current)[0]:null);if(!ye)return;const We=Un.current.find(hr=>hr.id===ye);if(!We)return;const ft=.93,Mt=We.x+(We.width||320)/2,Rt=We.y+(We.height||200)/2,sn={x:qs.width/2-Mt*ft,y:qs.height/2-Rt*ft,zoom:ft},Xt={...rt.current},xn=sn;$r.current&&(cancelAnimationFrame($r.current),$r.current=null);const on=Tr.current+1;Tr.current=on;const Pn=380,Jn=typeof performance<"u"?performance.now():Date.now(),Hn=hr=>hr<.5?4*hr*hr*hr:1-Math.pow(-2*hr+2,3)/2,Nn=hr=>{if(Tr.current!==on)return;const Er=hr-Jn,as=Math.min(1,Math.max(0,Er/Pn)),ar=Hn(as),bs={x:Xt.x+(xn.x-Xt.x)*ar,y:Xt.y+(xn.y-Xt.y)*ar,zoom:Xt.zoom+(xn.zoom-Xt.zoom)*ar};rt.current=bs,at(bs),as<1?$r.current=requestAnimationFrame(Nn):(rt.current=xn,at(xn),$r.current=null)};$r.current=requestAnimationFrame(Nn),dn(We.id),Zt(new Set([We.id])),Cn(We.id),Xn(hr=>hr+1)},[qs.width,qs.height,at,dn,Zt]),_.useEffect(()=>{if(!_n)return;const ye=window.setTimeout(()=>Cn(null),2200);return()=>window.clearTimeout(ye)},[_n,Kn]),_.useEffect(()=>{Vt.size===0&&Rr(!1)},[Vt.size]),_.useEffect(()=>{if(Un.current=De,Qn.current=Ot,Hr.current=Vt,Zs.current=Sn,Ci.current=Ae,!Bc.current){const ye=Math.abs(Ge.x-rt.current.x),We=Math.abs(Ge.y-rt.current.y),ft=Math.abs(Ge.zoom-rt.current.zoom);(ye>1||We>1||ft>.001)&&(rt.current=Ge)}},[De,Ot,Vt,Sn,Ae,Ge]),_.useEffect(()=>{const ye=We=>{const ft=We,{from:Mt,to:Rt,inputType:sn}=ft.detail;Mt&&Rt&&nt(Dt=>Dt.some(xn=>xn.from===Mt&&xn.to===Rt&&xn.inputType===sn)?Dt:[...Dt,{id:`conn-${Date.now()}`,from:Mt,to:Rt,inputType:sn||"default"}])};return window.addEventListener("addConnection",ye),()=>{window.removeEventListener("addConnection",ye)}},[]),_.useEffect(()=>{const ye=()=>{Oe.current&&(K(!1),Oe.current=!1,he(null))};return window.addEventListener("mouseup",ye),()=>{window.removeEventListener("mouseup",ye)}},[]);const X0=_.useMemo(()=>_h(ye=>{try{localStorage.setItem("qiaodoumayi_viewport_size",JSON.stringify(ye))}catch{}},500),[]);_.useEffect(()=>{const ye=()=>{const We={width:window.innerWidth,height:window.innerHeight};Cb(We),X0(We),requestAnimationFrame(()=>{Ci.current&&to.current&&Jd(Ci.current,rt.current,to.current,void 0,void 0,void 0,ra.current)})};return window.addEventListener("resize",ye),()=>window.removeEventListener("resize",ye)},[X0]),_.useEffect(()=>{const ye=()=>{Ci.current&&to.current&&requestAnimationFrame(()=>{Jd(Ci.current,rt.current,to.current,void 0,void 0,void 0,ra.current)})};ye();const We=setTimeout(ye,150);return()=>clearTimeout(We)},[De,Ae,q0,Ot,Et,e,_t]);const bi=_.useMemo(()=>{const ye=new Map;return De.forEach(We=>ye.set(We.id,We)),ye},[De]),Um=_.useMemo(()=>{const ye=new Set;return Ae.forEach(We=>ye.add(We.to)),ye},[Ae]),[Y0,Nb]=_.useState(new Set);_.useEffect(()=>{const ye=()=>{if(Aa)return;const Rt=new Set;Pa&&(Rt.add(Pa),Vt.has(Pa)&&Vt.forEach(Dt=>Rt.add(Dt))),Bu&&Rt.add(Bu);const sn=document.activeElement;if(sn){if(sn.tagName==="INPUT"){const Dt=sn.getAttribute("data-node-id");Dt&&Rt.add(Dt)}if(sn.tagName==="TEXTAREA"){const Dt=sn.getAttribute("data-node-id");Dt&&Rt.add(Dt)}if(sn.getAttribute("contenteditable")==="true"){const Dt=sn.getAttribute("data-node-id");Dt&&Rt.add(Dt)}}De.forEach(Dt=>{Dt.isGenerating&&Rt.add(Dt.id)}),Nb(Rt)};ye();const We=setInterval(ye,200),ft=()=>ye(),Mt=()=>setTimeout(ye,100);return document.addEventListener("focusin",ft),document.addEventListener("focusout",Mt),()=>{clearInterval(We),document.removeEventListener("focusin",ft),document.removeEventListener("focusout",Mt)}},[Pa,Bu,Vt,De,Aa]);const J0=De.length,Gi=_.useMemo(()=>CH(J0,Mi||_l),[J0,Mi,_l]);_.useEffect(()=>{window.__NODE_COUNT__=J0},[J0]);const[Fm,Wm]=_.useState(0);_.useEffect(()=>{const ye=()=>{Wm(We=>We+1)};return window.addEventListener("performancePresetChanged",ye),()=>window.removeEventListener("performancePresetChanged",ye)},[]);const{visibleNodes:Hh,visibleNodeIds:Z0,nodeQualityMap:mf}=zZ({nodes:De,view:Ge,viewportWidth:qs.width,viewportHeight:qs.height,overscan:Gi,forceIncludeNodeIds:Y0,isPanning:Mi}),tl=_.useMemo(()=>{const ye=new Set;return _t.forEach(We=>{We.collapsed&&We.nodeIds.forEach(ft=>ye.add(ft))}),ye},[_t]),Bi=_.useMemo(()=>new Set(["input-image","video-input","preview","image-compare","rh-app","rh-comfy","jimeng-super-resolution"]),[]),_a=_.useMemo(()=>{let ye=Hh.filter(We=>!tl.has(We.id));return sr.size>0&&(ye=ye.filter(We=>sr.has(We.id)?Bi.has(We.type):!0)),ye},[Hh,tl,sr,Bi]),za=_.useMemo(()=>{const ye=new Set;return _t.forEach(We=>{We.previewCollapsed&&We.nodeIds.forEach(ft=>ye.add(ft))}),ye},[_t]),Md=_.useMemo(()=>{const ye=new Set(za);return sr.forEach(We=>ye.add(We)),ye},[za,sr]);_.useEffect(()=>{if(sr.size===0){tn(null);return}let ye=1/0,We=1/0,ft=-1/0,Mt=-1/0;for(const Rt of De)sr.has(Rt.id)&&(ye=Math.min(ye,Rt.x),We=Math.min(We,Rt.y),ft=Math.max(ft,Rt.x+Rt.width),Mt=Math.max(Mt,Rt.y+Rt.height));if(ye===1/0||ft===-1/0){tn(null);return}tn({minX:ye,minY:We,maxX:ft,maxY:Mt})},[sr,De]);const Q0=_.useCallback(ye=>{if(sr.size===0)return;const We=Array.from(sr),ft=De.filter(Jn=>We.includes(Jn.id));if(ft.length===0)return;let Mt=1/0,Rt=1/0,sn=-1/0,Dt=-1/0;ft.forEach(Jn=>{Mt=Math.min(Mt,Jn.x),Rt=Math.min(Rt,Jn.y),sn=Math.max(sn,Jn.x+Jn.width),Dt=Math.max(Dt,Jn.y+Jn.height)});const Xt=sn-Mt,xn=Dt-Rt;if(Xt<=0||xn<=0)return;const on=ye.width/Xt,Pn=ye.height/xn;st(Jn=>Jn.map(Hn=>{if(!sr.has(Hn.id))return Hn;const Nn=Hn.x-Mt,hr=Hn.y-Rt;return{...Hn,x:ye.x+Nn*on,y:ye.y+hr*Pn,width:Math.max(40,Hn.width*on),height:Math.max(40,Hn.height*Pn)}}))},[sr,De,st]),Gh=_.useCallback((ye,We)=>{It&&(We.preventDefault(),We.stopPropagation(),Vn.current={origin:ye,startMouseX:We.clientX,startMouseY:We.clientY,startBounds:{...It}})},[It]);_.useEffect(()=>{const ye=ft=>{var bs;const Mt=Vn.current;if(!Mt)return;const Rt=((bs=rt.current)==null?void 0:bs.zoom)??1,sn=(ft.clientX-Mt.startMouseX)/Rt,Dt=(ft.clientY-Mt.startMouseY)/Rt,{minX:Xt,minY:xn,maxX:on,maxY:Pn}=Mt.startBounds,Jn=on-Xt,Hn=Pn-xn,Nn=40;let hr,Er,as,ar;switch(Mt.origin){case"nw":{as=Math.max(Nn,Jn-sn),ar=Math.max(Nn,Hn-Dt),hr=on-as,Er=Pn-ar;break}case"ne":{as=Math.max(Nn,Jn+sn),ar=Math.max(Nn,Hn-Dt),hr=Xt,Er=Pn-ar;break}case"sw":{as=Math.max(Nn,Jn-sn),ar=Math.max(Nn,Hn+Dt),hr=on-as,Er=xn;break}case"se":default:{as=Math.max(Nn,Jn+sn),ar=Math.max(Nn,Hn+Dt),hr=Xt,Er=xn;break}}Q0({x:hr,y:Er,width:as,height:ar})},We=()=>{Vn.current=null};return window.addEventListener("mousemove",ye),window.addEventListener("mouseup",We),()=>{window.removeEventListener("mousemove",ye),window.removeEventListener("mouseup",We)}},[Q0]);const lc=_.useMemo(()=>{const ye=new Map;return _t.forEach(We=>{if(!We.collapsed||We.collapsedX==null||We.collapsedY==null)return;const ft={x:We.collapsedX+O1,y:We.collapsedY},Mt={x:We.collapsedX-O1,y:We.collapsedY};We.nodeIds.forEach(Rt=>ye.set(Rt,{output:ft,input:Mt}))}),ye},[_t]),ra=_.useRef(lc);_.useEffect(()=>{ra.current=lc},[lc]);const Dm=_.useMemo(()=>{const ye=Ae.filter(sn=>{const Dt=Md.has(sn.from),Xt=Md.has(sn.to);if(Dt&&Xt)return!1;const xn=tl.has(sn.from),on=tl.has(sn.to),Pn=Z0.has(sn.from),Jn=Z0.has(sn.to);if(xn&&on){const Hn=lc.get(sn.from),Nn=lc.get(sn.to);return!!(Hn&&Nn)}return Pn||Jn});if(ye.length<100)return ye;const We=-Ge.x/Ge.zoom-100,ft=-Ge.y/Ge.zoom-100,Mt=(qs.width-Ge.x)/Ge.zoom+100,Rt=(qs.height-Ge.y)/Ge.zoom+100;return ye.filter(sn=>{var as,ar,bs,qi;const Dt=tl.has(sn.from),Xt=tl.has(sn.to);let xn,on,Pn,Jn;if(Dt&&Xt){const Ds=(as=lc.get(sn.from))==null?void 0:as.output,hi=(ar=lc.get(sn.to))==null?void 0:ar.input;if(!Ds||!hi)return!0;xn=Ds.x,on=Ds.y,Pn=hi.x,Jn=hi.y}else{const Ds=bi.get(sn.from),hi=bi.get(sn.to);if(!Ds||!hi)return!0;if(Dt){const Ti=(bs=lc.get(sn.from))==null?void 0:bs.output;if(!Ti)return!0;xn=Ti.x,on=Ti.y}else xn=Ds.x+Ds.width,on=Ds.y+Ds.height/2;if(Xt){const Ti=(qi=lc.get(sn.to))==null?void 0:qi.input;if(!Ti)return!0;Pn=Ti.x,Jn=Ti.y}else Pn=hi.x,Jn=hi.y+hi.height/2}const Hn=Math.min(xn,Pn),Nn=Math.max(xn,Pn),hr=Math.min(on,Jn),Er=Math.max(on,Jn);return!(NnMt||ErRt)})},[Ae,Z0,Ge,qs,bi,tl,lc,Md]),Vm=_.useMemo(()=>{var We;const ye=new Map;for(const ft of Ae){const Mt=ye.get(ft.to)??[];Mt.push(((We=bi.get(ft.from))==null?void 0:We.nodeName)||"未命名节点"),ye.set(ft.to,Mt)}return ye},[Ae,bi]),{getConnectedVideoInputNode:Hm,getConnectedVideoAnalyzeNode:cc,groupKeyframesByTime:Sl,getConnectedInputImages:eh,getConnectedInputItems:qh,hasMultiImageSource:Gm,getConnectedImageForInput:qm,getConnectedTextForInput:Eb,getConnectedDirectorNodes:Ib}=VZ({connections:Ae,nodesMap:bi,dataVersion:Qe}),p0=_.useCallback(ye=>{var Rt;const We=eh(ye),ft=bi.get(ye),Mt=(Rt=ft==null?void 0:ft.settings)==null?void 0:Rt.inputImageOrder;if(Mt&&Mt.length===We.length){const sn=new Set(We);if(Mt.every(Dt=>sn.has(Dt)))return Mt}return We},[eh,bi]),kb=_.useCallback(ye=>{var sn,Dt,Xt,xn;const We=bi.get(ye);if(!We)return;let ft="",Mt=[];if(We.type==="preview"){const on=Ae.find(Pn=>Pn.to===ye);if(on){const Pn=bi.get(on.from);Pn&&(ft=(Pn.prompt||((sn=Pn.settings)==null?void 0:sn.prompt)||"").trim(),Mt=p0(on.from))}}else if(We.type==="gen-image"||We.type==="gen-video")ft=(We.prompt||((Dt=We.settings)==null?void 0:Dt.prompt)||"").trim(),Mt=p0(ye);else if(We.type==="input-image"){const on=We.content||((Xt=We.settings)==null?void 0:Xt.imageUrl);on&&(Mt=[on])}else(We.type==="image-compare"||We.type==="rh-app"||We.type==="rh-comfy"||We.type==="jimeng-super-resolution")&&(ft=(We.prompt||((xn=We.settings)==null?void 0:xn.prompt)||"").trim(),Mt=p0(ye));const Rt={x:We.x,y:We.y,width:We.width,height:We.height};bt({visible:!0,prompt:ft,inputImageUrls:Mt,anchorBounds:Rt})},[bi,Ae,p0]),Ab=_.useCallback(ye=>{var Rt;const We=qh(ye),ft=bi.get(ye),Mt=(Rt=ft==null?void 0:ft.settings)==null?void 0:Rt.inputItemOrder;if(Mt&&Mt.length===We.length){const sn=new Map(We.map(({url:Dt})=>[Dt,We.find(Xt=>Xt.url===Dt)]));if(Mt.every(Dt=>sn.has(Dt)))return Mt.map(Dt=>sn.get(Dt))}return We},[qh,bi]),Km=_.useMemo(()=>_h(async ye=>{try{const ft=typeof navigator<"u"&&(navigator.platform.toLowerCase().includes("mac")||navigator.platform.toLowerCase().includes("win")||navigator.userAgent.toLowerCase().includes("mac")||navigator.userAgent.toLowerCase().includes("win"))?1e3:500;let Mt=ye;ye.length>ft&&(Mt=ye.slice(-ft));try{localStorage.setItem(ri.HISTORY,JSON.stringify(Mt)),console.log(`[App] 已保存 ${Mt.length} 条历史记录`)}catch(Rt){console.warn("[App] 历史记录保存失败:",Rt)}}catch(We){if(We instanceof DOMException&&(We.name==="QuotaExceededError"||We.code===22)){console.warn("历史记录存储配额超限,正在清理旧数据...");try{const ft=ye.slice(-100);localStorage.setItem(ri.HISTORY,JSON.stringify(ft)),console.log("已清理历史记录,保留最新 100 条")}catch{console.error("清理后仍然失败,清空历史记录"),localStorage.removeItem(ri.HISTORY)}}else console.error("保存历史记录失败:",We)}},dh.DEBOUNCE_DELAY.STORAGE_SAVE),[]);_.useEffect(()=>{Km(Et)},[Et,Km]),YZ({history:Et}),_.useEffect(()=>{try{localStorage.setItem(_m,JSON.stringify(Va))}catch{}},[Va]),_.useEffect(()=>{const ye=We=>{if(We.key===_m&&We.newValue)try{const ft=JSON.parse(We.newValue);Array.isArray(ft)&&Rc(ft)}catch{}};return window.addEventListener("storage",ye),()=>window.removeEventListener("storage",ye)},[]);const Xm=_.useMemo(()=>_h(ye=>{try{localStorage.setItem(ri.CHARACTERS,JSON.stringify(ye))}catch{}},dh.DEBOUNCE_DELAY.CHARACTER_SAVE),[]);_.useEffect(()=>{Xm(Yo)},[Yo,Xm]);const th=_.useMemo(()=>_h(ye=>{try{localStorage.setItem(ri.KLING_SUBJECTS,JSON.stringify(ye))}catch{}},dh.DEBOUNCE_DELAY.CHARACTER_SAVE),[]);_.useEffect(()=>{th(Ha)},[Ha,th]);const Ym=_.useMemo(()=>_h(ye=>{try{localStorage.setItem(ri.SEEDANCE_ROLES,JSON.stringify(ye))}catch{}},dh.DEBOUNCE_DELAY.CHARACTER_SAVE),[]);_.useEffect(()=>{Ym(Jo)},[Jo,Ym]);const Kh=_.useMemo(()=>_h(ye=>{try{localStorage.setItem(ri.RH_APP_LIBRARY,JSON.stringify(ye))}catch{}},dh.DEBOUNCE_DELAY.CHARACTER_SAVE),[]);_.useEffect(()=>{Kh(Pu)},[Pu,Kh]);const gf=_.useCallback((ye,We,ft,Mt,Rt,sn)=>{const Dt=ns();let Xt={};try{if(ye==="gen-image"||ye==="generate-character-image"||ye==="generate-scene-image"){const xn=ex("Image");xn&&(Xt=xn)}else if(ye==="gen-video"||ye==="generate-character-video"||ye==="generate-scene-video"){const xn=ex("Video");xn&&(Xt=xn)}}catch(xn){console.error("Failed to load global defaults:",xn)}if(st(xn=>{const on=Ms(Dt,ye,We??100,ft??100,void 0,Xt,xn);return[...xn,on]}),dn(Dt),sn&&sn.length>0){const xn=sn.map(on=>({id:ns(),from:on,to:Dt}));nt(on=>[...on,...xn])}else if(Mt){const xn={id:ns(),from:Mt,to:Dt};nt(on=>[...on,xn])}if(Rt){const xn={id:ns(),from:Dt,to:Rt};nt(on=>[...on,xn])}return Nu({visible:!1,x:0,y:0}),Dt},[]),xf=_.useCallback(ye=>{st(We=>{const ft=We.find(Mt=>Mt.id===ye);if(ft){const Mt=We.filter(sn=>sn.id!==ye),Rt=new Set;Mt.forEach(sn=>{var Dt,Xt,xn;(Dt=sn.content)!=null&&Dt.startsWith("blob:")&&Rt.add(sn.content),(Xt=sn.settings)!=null&&Xt._blobUrl&&typeof sn.settings._blobUrl=="string"&&Rt.add(sn.settings._blobUrl),sn.previewMjImages&&Array.isArray(sn.previewMjImages)&&sn.previewMjImages.forEach(on=>{typeof on=="string"&&on.startsWith("blob:")&&Rt.add(on)}),(xn=sn.selectedPreviewImage)!=null&&xn.startsWith("blob:")&&Rt.add(sn.selectedPreviewImage)}),mn(()=>Promise.resolve().then(()=>Lue),void 0,import.meta.url).then(sn=>{sn.cleanupNodeSafe?sn.cleanupNodeSafe(ft,Rt):sn.cleanupNode(ft)}).catch(sn=>{var Dt,Xt;console.error("[App] Failed to import nodeCleanup:",sn),(Dt=ft.content)!=null&&Dt.startsWith("blob:")&&!Rt.has(ft.content)&&URL.revokeObjectURL(ft.content),(Xt=ft.settings)!=null&&Xt._blobUrl&&!Rt.has(ft.settings._blobUrl)&&URL.revokeObjectURL(ft.settings._blobUrl)})}return We.filter(Mt=>Mt.id!==ye)}),nt(We=>We.filter(ft=>ft.from!==ye&&ft.to!==ye)),Ot===ye&&dn(null)},[Ot]),Jm=_.useCallback(ye=>{nt(We=>We.filter(ft=>ft.id!==ye))},[]),nh=fr.useRef({pendingUpdates:new Map,rafId:null}),bf=_.useCallback(()=>{const{pendingUpdates:ye}=nh.current;ye.size!==0&&(st(We=>We.map(Mt=>{const Rt=ye.get(Mt.id);return Rt?{...Mt,...Rt}:Mt})),ye.clear(),nh.current.rafId=null)},[st]),Td=_.useCallback((ye,We)=>{var Dt;const ft=We.x!=null||We.y!=null||We.width!=null||We.height!=null,Mt=We.prompt!=null,Rt=We.settings!=null&&((Dt=We.settings)==null?void 0:Dt.isCollapsed)!=null;if(We.settings!=null&&!ft&&!We.prompt&&!We.content||Mt||Rt){st(Xt=>Xt.map(xn=>xn.id===ye?{...xn,...We}:xn));return}st(Xt=>Xt.map(xn=>xn.id===ye?{...xn,...We}:xn))},[De.length,bf]);_.useEffect(()=>()=>{nh.current.rafId!==null&&(cancelAnimationFrame(nh.current.rafId),nh.current.rafId=null),bf()},[bf]);const Zm=_.useCallback((ye,We)=>{st(ft=>ft.map(Mt=>Mt.id===ye?{...Mt,settings:{...Mt.settings,...We}}:Mt))},[]);_.useCallback((ye,We,ft)=>{const Rt={id:ns(),from:ye,to:We,...ft?{inputType:ft}:{}};nt(sn=>[...sn,Rt]),st(sn=>{const Dt=sn.find(Xt=>Xt.id===We);return(Dt==null?void 0:Dt.type)==="preview"?sn.map(Xt=>Xt.id===ye?{...Xt,settings:{...Xt.settings||{},selectedPreviewId:We}}:Xt):sn})},[]),_.useCallback(ye=>{nt(We=>We.filter(ft=>ft.id!==ye))},[]),_.useCallback((ye,We,ft)=>{const Mt=ye.map(Rt=>({id:ns(),from:Rt,to:We,...ft?{inputType:ft}:{}}));nt(Rt=>[...Rt,...Mt])},[]);const Qm=_.useCallback(ye=>{ac(ye),Hi&&La({x:Hi.dialPosition.x,y:Hi.dialPosition.y})},[Hi]),Mb=_.useCallback(ye=>{$(ye)},[]),Tb=_.useCallback(ye=>{h0({visible:!0,...ye})},[]),Rb=_.useCallback(()=>{h0(ye=>ye&&{...ye,visible:!1})},[]);_.useEffect(()=>{!Ot&&Vt.size===0?Qs!=null&&Qs.visible&&h0(null):Qs!=null&&Qs.nodeId&&Ot!==Qs.nodeId&&!Vt.has(Qs.nodeId)&&h0(null)},[Ot,Vt,Qs]);const n2=_.useCallback(ye=>{if(!(Qs!=null&&Qs.nodeId)||!Qs.portDirection)return;const We=Qs.nodeId,ft=Un.current.find(Xt=>Xt.id===We),{x:Mt,y:Rt}=ft?{x:ft.x+(ft.width??320)+80,y:ft.y}:{x:200,y:200},sn=ns();let Dt={};try{if(ye.type==="gen-image"||ye.type==="generate-character-image"||ye.type==="generate-scene-image"){const Xt=ex("Image");Xt&&(Dt=Xt)}else if(ye.type==="gen-video"||ye.type==="generate-character-video"||ye.type==="generate-scene-video"){const Xt=ex("Video");Xt&&(Dt=Xt)}}catch(Xt){console.error("Failed to load global defaults:",Xt)}st(Xt=>{const xn=Ms(sn,ye.type,Mt,Rt,void 0,Dt,Xt);return[...Xt,xn]}),nt(Xt=>[...Xt,{id:ns(),from:We,to:sn}]),h0(null)},[Qs]),{generate:yf,runExpandImage:Pb,generateChartBatch:r2}=DX({apiConfigs:Re,globalApiKey:Ve,connections:Ae,nodes:De,nodesMap:bi,updateNode:Td,setHistory:Ut,getConnectedInputImages:p0,getConnectedImageForInput:qm,generateId:ns}),Ob=_.useCallback(async ye=>{const We=bi.get(ye);if(!We){console.warn("[handleExecuteNode] 节点不存在:",ye);return}switch(console.log("[handleExecuteNode] 执行节点:",ye,We.type),We.type){case"gen-image":case"generate-character-image":case"generate-scene-image":case"gen-video":case"motion-control":case"generate-character-video":case"generate-scene-video":case"gen-music":const ft={...We,settings:{...We.settings,_autoCreatedPreviewId:void 0}};console.log("[handleExecuteNode] 清除 _autoCreatedPreviewId,让节点创建自己的预览窗口"),await yf(ft);break;case"custom-agent":st(Mt=>Mt.map(Rt=>Rt.id===ye?{...Rt,settings:{...Rt.settings,_executeTrigger:Date.now()}}:Rt));break;default:console.log("[handleExecuteNode] 节点类型不支持执行:",We.type)}},[bi,yf,st]),{createGroup:vf,createCollection:Lb,expandCollection:wf,updateCollectionPosition:s2,deleteGroup:i2,updateGroupName:eg,updateGroupColor:uc,toggleGroupPreviewCollapsed:tg,addNodesToGroup:rh,executeGroup:ng,exportGroupWorkflow:Bb}=dQ({groups:_t,setGroups:xt,nodes:De,setNodes:st,connections:Ae,executeNode:Ob}),Ub=_.useCallback((ye,We,ft)=>{if(ft.length===0)return;const Mt=_t.filter(sn=>sn.collapsed&&sn.collapsedX!=null&&sn.collapsedY!=null);for(let sn=Mt.length-1;sn>=0;sn--){const Dt=Mt[sn],Xt=Dt.collapsedX,xn=Dt.collapsedY;if(ye>=Xt-O1&&ye<=Xt+O1&&We>=xn-bE&&We<=xn+bE){const Pn=ft.filter(Jn=>!Dt.nodeIds.includes(Jn));Pn.length>0&&rh(Dt.id,Pn);return}}const Rt=_t.filter(sn=>!sn.collapsed);for(let sn=Rt.length-1;sn>=0;sn--){const Dt=Rt[sn],Xt=Vp(Dt.nodeIds,De);if(ye>=Xt.x&&ye<=Xt.x+Xt.width&&We>=Xt.y&&We<=Xt.y+Xt.height){const xn=ft.filter(on=>!Dt.nodeIds.includes(on));xn.length>0&&rh(Dt.id,xn);return}}},[_t,De,rh]);hQ({canvasRef:pn,view:Ge,nodes:De,onGroupCreate:ye=>{console.log("[App] Alt+框选创建分组,节点:",ye),vf(ye)}});const rg=220,sh=_.useCallback(async ye=>{try{const We=Ge.x+80,ft=Ge.y+120,Mt=520,Rt=[];for(let Dt=0;Dt{const Pn=Ms(xn,"custom-agent",We+Dt*Mt,ft,Xt.name||`步骤${Dt+1}`,{systemPrompt:Xt.systemPrompt||Xt.description||""},on);return[...on,Pn]}),Dt>0&&nt(on=>[...on,{id:ns(),from:Rt[Dt-1],to:Rt[Dt]}]),DtsetTimeout(on,rg))}const sn=vf(Rt);sn&&eg(sn.id,ye.workflowName||"未命名工作流"),Pe(`已根据 Skill 创建 ${ye.steps.length} 个节点,已放入分组「${ye.workflowName||"未命名工作流"}」`),Da(!1)}catch(We){throw console.error("[handleSkillToWorkflowCreate] 创建工作流失败:",We),We}},[Ge.x,Ge.y,st,nt,vf,eg,ns,Pe]),sg=_.useCallback((ye,We)=>{We.preventDefault(),We.stopPropagation(),kd.current=!0,Ou(!1),Bc.current=!1;const ft=We.clientX,Mt=We.clientY,Rt=_t.find(on=>on.id===ye);if(!Rt){kd.current=!1;return}const sn=new Map;Rt.nodeIds.forEach(on=>{const Pn=De.find(Jn=>Jn.id===on);Pn&&sn.set(on,{x:Pn.x,y:Pn.y})});let Dt=null;const Xt=on=>{const Pn=(on.clientX-ft)/Ge.zoom,Jn=(on.clientY-Mt)/Ge.zoom;Dt&&cancelAnimationFrame(Dt),Dt=requestAnimationFrame(()=>{st(Hn=>Hn.map(Nn=>{const hr=sn.get(Nn.id);return hr?{...Nn,x:hr.x+Pn,y:hr.y+Jn}:Nn}))})},xn=on=>{on.preventDefault(),on.stopPropagation(),Dt&&cancelAnimationFrame(Dt),setTimeout(()=>{kd.current=!1},50),window.removeEventListener("mousemove",Xt),window.removeEventListener("mouseup",xn),document.body.classList.remove("canvas-interacting")};document.body.classList.add("canvas-interacting"),window.addEventListener("mousemove",Xt,{passive:!1}),window.addEventListener("mouseup",xn,{passive:!1})},[_t,De,Ge.zoom,st,Ou]),{handleGeneratePrompts:ig,handleAutoVideoAnalysis:a2}=GX({nodesMap:bi,apiConfigs:Re,globalApiKey:Ve,getConnectedVideoInputNode:Hm,groupKeyframesByTime:Sl,setNodes:st,setConnections:nt,setSettingsOpen:Io}),{importShotsFromAnalysis:Fb,updateShot:ag,addEmptyShot:Wb,deleteShot:Db,generateSingleShot:Vb,generateFromScript:o2,generateFromScriptForChart:Mo,splitImageToShots:Ua,generateSequenceFromShot:Hb}=qX({nodesMap:bi,apiConfigs:Re,globalApiKey:Ve,getConnectedVideoAnalyzeNode:cc,updateNodeSettings:Zm,setNodes:st,setHistory:Ut}),{freezeAllVideos:ih,unfreezeVideos:ah}=$oe({containerRef:pn,enabled:!0}),Gb=_.useCallback(async ye=>{ih==null||ih();try{await ng(ye)}finally{setTimeout(()=>{ah==null||ah()},500)}},[ng,ih,ah]),qb=_.useCallback((ye,We)=>{const ft=_t.find(Mt=>Mt.id===ye);ft&&st(Mt=>{const Rt=Vp(ft.nodeIds,Mt);if(Rt.width<=0||Rt.height<=0)return Mt;const sn=We.width/Rt.width,Dt=We.height/Rt.height;return Mt.map(Xt=>{if(!ft.nodeIds.includes(Xt.id))return Xt;const xn=Xt.x-Rt.x,on=Xt.y-Rt.y;return{...Xt,x:We.x+xn*sn,y:We.y+on*Dt,width:Math.max(40,Xt.width*sn),height:Math.max(40,Xt.height*Dt)}})})},[_t,st]),dc=_.useRef(null),{handleDownloadSelected:Kb,handleDownloadUrlList:og,handleNodeDoubleClick:Xb}=WZ({nodes:De,connections:Ae,selectedNodeId:Ot,selectedNodeIds:Vt,setNodes:st,setIsDownloading:jd,setDownloadProgress:Mc,setLightboxItem:qn,setLightboxOpen:go,getCancellationToken:Mu,onDownloadStart:ye=>{dc.current=Be(`正在准备下载 ${ye} 个文件...`,0)},onDownloadProgress:(ye,We,ft)=>{if(dc.current){const Mt=Math.round(ye/We*100);He(dc.current,{message:`正在下载 ${ye}/${We}: ${ft}`,progress:Mt})}},onDownloadComplete:(ye,We)=>{dc.current&&(Je(dc.current),dc.current=null);const Mt=(()=>{const Rt=localStorage.getItem("qiaodoumayi_download_directory");if(Rt)return`文件已保存到「${Rt}」`;const sn=navigator.userAgent.toLowerCase();return sn.includes("win")?"文件已保存到「文档\\Qiaodoumayi_Media」文件夹":sn.includes("mac")?"文件已保存到「文稿/Qiaodoumayi_Media」文件夹":sn.includes("linux")?"文件已保存到「Documents/Qiaodoumayi_Media」文件夹":"文件已保存到浏览器默认下载文件夹"})();We===0?Pe(`下载完成!成功下载 ${ye} 个文件 +${Mt}`,6e3):Te(`下载完成:成功 ${ye} 个,失败 ${We} 个 +${Mt}`,6e3)},onDownloadError:ye=>{dc.current&&(Je(dc.current),dc.current=null),Te(ye)}}),{handleCanvasContextMenu:Yb,handleCanvasMouseDown:Xh,handleCanvasDoubleClick:lg,handleCanvasMouseMove:Yh,handleCanvasMouseUp:_f,handleBackgroundClick:zf,isPanningRef:Bc,dragStartPos:Jb,nodeStartPos:cg,dragElementRef:Zb,dragNodeIdRef:$f}=dY({view:Ge,viewRef:rt,selectionBoxDivRef:pf,nodes:De,selectedNodeId:Ot,selectedNodeIds:Vt,selectedNodeIdsRef:Hr,nodesRef:Un,canvasRef:pn,canvasContentRef:An,mousePosRef:Dh,isSelectingRef:Oe,multiNodeDragStartPos:hf,connectingLineRef:d0,connectingLineReverseRef:el,updateConnectingLineDOM:Wae,svgContainerRef:to,connectionsRef:Ci,freezeAllVideos:ih,unfreezeVideos:ah,isPanning:Mi,isSelecting:P,selectionBox:ae,dragNodeId:Pa,resizingNodeId:Bu,resizeDirection:zl,connectingSource:Oa,connectingTarget:Qo,connectingInputType:va,multiConnectingSourceIds:Ba,multiConnectingTargetIds:oc,frameContextMenu:Eu,historyContextMenu:Gs,isDraggingGroupRef:kd,collectionEndpointsRef:ra,setView:at,setNodes:st,setConnections:nt,setSelectedNodeId:dn,setSelectedNodeIds:Zt,setSelectedConnectionId:jn,onBoxSelectComplete:_.useCallback(ye=>{ye.length>0&&Rr(!0)},[]),onSelectionCleared:_.useCallback(()=>Rr(!1),[]),onDropNodeOntoGroup:Ub,snapToGrid:i,onAlignmentGuidesChange:l,setIsPanning:Ou,setIsDragging:Ao,setDragNodeId:Lu,setResizingNodeId:l0,setResizeDirection:rc,setIsSelecting:K,setSelectionBox:he,setMousePos:La,setConnectingSource:$l,setConnectingTarget:fa,setConnectingInputType:bo,setMultiConnectingSourceIds:ac,setMultiConnectingTargetIds:$,setContextMenu:Nu,setSelectionContextMenu:qo,setFrameContextMenu:Ic,setHistoryContextMenu:Xl,generateId:ns,handleNodeDoubleClick:Xb});_.useEffect(()=>{if(!Pa)return;const ye=We=>{Yh({clientX:We.clientX,clientY:We.clientY})};return window.addEventListener("mousemove",ye,{passive:!1}),()=>window.removeEventListener("mousemove",ye)},[Pa,Yh]);const Uc=_.useCallback(ye=>{Yh(ye),!y.current&&De.length===0&&!d&&!_l&&!Mi&&ye.clientX!=null&&ye.clientY!=null&&(g.current={x:ye.clientX,y:ye.clientY},b.current&&clearTimeout(b.current),b.current=setTimeout(()=>{if(b.current=null,y.current)return;y.current=!0;const{x:We,y:ft}=g.current;f(Mt=>[...Mt.slice(-12),{id:ns(),x:We,y:ft,text:oee()}])},320))},[Yh,De.length,d,_l,Mi]);_.useEffect(()=>{I!=="text-create"&&(Ne.current=!1,ve.current=null,xe(null))},[I]),_.useEffect(()=>{if(I==="doodle")return;const ye=N.current;ye&&!ye.ended&&(ye.ended=!0,window.removeEventListener("mousemove",ye.onMove),window.removeEventListener("pointermove",ye.onMove),window.removeEventListener("mouseup",ye.onUp),window.removeEventListener("pointerup",ye.onUp),window.removeEventListener("pointercancel",ye.onUp),N.current=null,Z.current=[],B.current=[],q(null),J(null)),Q([]),ue(null);const We=j.current;We&&(window.removeEventListener("mousemove",We.onMove),window.removeEventListener("mouseup",We.onUp),j.current=null);const ft=k.current;ft&&(window.removeEventListener("mousemove",ft.onMove),window.removeEventListener("mouseup",ft.onUp),k.current=null);const Mt=W.current;Mt&&(window.removeEventListener("mousemove",Mt.onMove),window.removeEventListener("mouseup",Mt.onUp),W.current=null)},[I]),_.useEffect(()=>{const ye=N.current;ye&&!ye.ended&&ye.onUp(),ue(null);const We=j.current;We&&(window.removeEventListener("mousemove",We.onMove),window.removeEventListener("mouseup",We.onUp),j.current=null)},[M]),_.useEffect(()=>{if(!le)return;const ye=window.requestAnimationFrame(()=>{const We=document.querySelector(`textarea[data-canvas-text-id="${le}"]`);if(We){We.focus();const ft=We.value.length;We.setSelectionRange(ft,ft)}});return()=>window.cancelAnimationFrame(ye)},[le]);const Qb=_.useCallback(ye=>{var Rt,sn;if(I==="doodle"){const Dt=ye.nativeEvent;if(!(Dt instanceof PointerEvent)&&Dt.type==="mousedown"&&Date.now()-V.current<500)return}if(ye.button!==0){Xh(ye);return}const We=ye.target,ft=We.id==="canvas-bg"||We===ye.currentTarget,Mt=ft||!We.closest('.node-wrapper, .connector, button, input, textarea, select, [contenteditable="true"], .node-dropdown-button, .node-dropdown-menu');if(I==="doodle"&&Mt){const Dt=(Rt=pn.current)==null?void 0:Rt.getBoundingClientRect();if(!Dt)return;const Xt=rt.current.x,xn=rt.current.zoom,on=rt.current.y,Pn=(ye.clientX-Dt.left-Xt)/xn,Jn=(ye.clientY-Dt.top-on)/xn;if(M==="select"){if(j.current)return;const Ds=ye.ctrlKey||ye.metaKey,hi={x0:Pn,y0:Jn,x1:Pn,y1:Jn},Ti=sl=>{var il;const yo=(il=pn.current)==null?void 0:il.getBoundingClientRect();if(!yo)return;const sa=(sl.clientX-yo.left-rt.current.x)/rt.current.zoom,Ga=(sl.clientY-yo.top-rt.current.y)/rt.current.zoom;hi.x1=sa,hi.y1=Ga,ue({...hi})},$0=sl=>{var El;window.removeEventListener("mousemove",Ti),window.removeEventListener("mouseup",$0),j.current=null;const yo=(El=pn.current)==null?void 0:El.getBoundingClientRect();if(!yo){ue(null);return}hi.x1=(sl.clientX-yo.left-rt.current.x)/rt.current.zoom,hi.y1=(sl.clientY-yo.top-rt.current.y)/rt.current.zoom;const{x0:sa,y0:Ga,x1:il,y1:qu}=hi;if(ue(null),Math.hypot(il-sa,qu-Ga)<4){Ds||Q([]);return}const Dc=X.current.filter(Il=>yoe(sa,Ga,il,qu,vE(Il.points,Il.width/2+1))).map(Il=>Il.id);Q(Ds?Il=>Array.from(new Set([...Il,...Dc])):Dc)};j.current={onMove:Ti,onUp:$0},ue({x0:Pn,y0:Jn,x1:Pn,y1:Jn}),window.addEventListener("mousemove",Ti),window.addEventListener("mouseup",$0),ye.preventDefault(),ye.stopPropagation();return}const Hn=M,Nn=rI(ye),hr={x:Pn,y:Jn,pressure:Nn},Er=[{x:Pn,y:Jn}];B.current=[hr],Z.current=Er,q(Er),J([hr]);let as=!1;const ar={ended:!1,onMove:()=>{},onUp:()=>{}},bs=1.25/xn,qi=.06/xn;ar.onMove=Ds=>{var qu;if(ar.ended)return;const hi="pointerType"in Ds;if(hi)as=!0;else if(as)return;const Ti=(qu=pn.current)==null?void 0:qu.getBoundingClientRect();if(!Ti)return;const sl=hi&&Ds.pointerType==="pen"?qi:bs,yo=hi&&typeof Ds.getCoalescedEvents=="function"?Ds.getCoalescedEvents():[Ds];let sa=Z.current,Ga=B.current,il=!1;for(const Dc of yo){const El=(Dc.clientX-Ti.left-rt.current.x)/rt.current.zoom,Il=(Dc.clientY-Ti.top-rt.current.y)/rt.current.zoom,Pf=rI(Dc),Of=sa[sa.length-1];Of&&Math.hypot(El-Of.x,Il-Of.y){if(ar.ended||!(!!Ds&&"pointerType"in Ds)&&as)return;ar.ended=!0,window.removeEventListener("mousemove",ar.onMove),window.removeEventListener("pointermove",ar.onMove),window.removeEventListener("mouseup",ar.onUp),window.removeEventListener("pointerup",ar.onUp),window.removeEventListener("pointercancel",ar.onUp),N.current=null;const Ti=Z.current,$0=B.current;if(Z.current=[],B.current=[],q(null),J(null),Hn==="eraser"){if(Ti.length<1)return;const sa=ne.current/2;L(Ga=>{const il=[];for(const qu of Ga){const Dc=zoe(qu.points,Ti,sa);for(const El of Dc)El.length>=2&&il.push({...qu,id:ns(),points:El})}return il});return}const sl=te.current,yo=ge.current;if(Ti.length>=2){const sa=sI($0,sl,yo);sa.length>0&&L(Ga=>[...Ga,...sa.map(il=>({...il,id:ns()}))])}else if(Ti.length===1){const sa=Ti[0];L(Ga=>[...Ga,{id:ns(),points:[sa,{x:sa.x+.8,y:sa.y}],color:sl,width:yo}])}},N.current=ar,window.addEventListener("mousemove",ar.onMove),window.addEventListener("pointermove",ar.onMove,{passive:!0}),window.addEventListener("mouseup",ar.onUp),window.addEventListener("pointerup",ar.onUp,{passive:!0}),window.addEventListener("pointercancel",ar.onUp,{passive:!0}),ye.preventDefault(),ye.stopPropagation();return}if(I==="text-create"){if(!ft)return;const Dt=(sn=pn.current)==null?void 0:sn.getBoundingClientRect();if(!Dt)return;const Xt=(ye.clientX-Dt.left-Ge.x)/Ge.zoom,xn=(ye.clientY-Dt.top-Ge.y)/Ge.zoom;Ne.current=!0,ve.current={startX:Xt,startY:xn},fe(null),xe({startX:Xt,startY:xn,endX:Xt,endY:xn}),ye.preventDefault(),ye.stopPropagation();return}Xh(ye)},[I,Xh,Ge.x,Ge.y,Ge.zoom,pn,ns,M]),e1=_.useCallback(ye=>{var We;if(I==="text-create"&&Ne.current&&ve.current){const ft=(We=pn.current)==null?void 0:We.getBoundingClientRect();if(!ft)return;const Mt=(ye.clientX-ft.left-Ge.x)/Ge.zoom,Rt=(ye.clientY-ft.top-Ge.y)/Ge.zoom,{startX:sn,startY:Dt}=ve.current;xe({startX:sn,startY:Dt,endX:Mt,endY:Rt});return}Uc(ye)},[I,pn,Uc,Ge.x,Ge.y,Ge.zoom]),ug=_.useCallback(ye=>{var ft;const We=N.current;if(We&&!We.ended){We.onUp(),ye.preventDefault(),ye.stopPropagation();return}if(I==="text-create"&&Ne.current&&ve.current){const Mt=(ft=pn.current)==null?void 0:ft.getBoundingClientRect();if(!Mt)return;const Rt=(ye.clientX-Mt.left-Ge.x)/Ge.zoom,sn=(ye.clientY-Mt.top-Ge.y)/Ge.zoom,{startX:Dt,startY:Xt}=ve.current,xn=Math.min(Dt,Rt),on=Math.min(Xt,sn),Pn=Math.max(140,Math.abs(Rt-Dt)),Jn=Math.max(56,Math.abs(sn-Xt)),Hn=ns();O(Nn=>[...Nn,{id:Hn,x:xn,y:on,width:Pn,height:Jn,text:"",fontSize:48,fontFamily:"sans",color:"#111111",bold:!1,italic:!1,underline:!1,strike:!1,align:"left"}]),fe(Hn),de(Hn),R("select"),Ne.current=!1,ve.current=null,xe(null),ye.preventDefault(),ye.stopPropagation();return}_f(ye)},[I,pn,ns,_f,Ge.x,Ge.y,Ge.zoom]);_.useEffect(()=>{const ye=ft=>{const Mt=ke.current;if(!Mt)return;const Rt=(ft.clientX-Mt.startClientX)/rt.current.zoom,sn=(ft.clientY-Mt.startClientY)/rt.current.zoom;O(Dt=>Dt.map(Xt=>Xt.id===Mt.id?{...Xt,x:Mt.startX+Rt,y:Mt.startY+sn}:Xt))},We=()=>{ke.current=null,Ee(!1)};return window.addEventListener("mousemove",ye),window.addEventListener("mouseup",We),()=>{window.removeEventListener("mousemove",ye),window.removeEventListener("mouseup",We)}},[]),_.useEffect(()=>{const ye=We=>{const ft=We.target;if(ft.tagName==="TEXTAREA"||ft.tagName==="INPUT"||ft.isContentEditable)return;(We.key==="Delete"||We.key==="Del"||We.code==="Delete"||We.key==="Backspace"||We.code==="Backspace")&&be&&!le&&(We.preventDefault(),We.stopPropagation(),O(Rt=>Rt.filter(sn=>sn.id!==be)),de(null),ze(null))};return window.addEventListener("keydown",ye,!0),()=>{window.removeEventListener("keydown",ye,!0)}},[be,le]),pY({isDragging:(_l||Pa!==null)&&!kd.current,connectingSource:Oa,isPanning:Mi,view:Ge,setView:at,enabled:!0});const{syncFromExternal:dg,getIsPanning:hg}=RH({containerRef:pn,contentRef:An,initialView:Ge,isDraggingGroupRef:kd,isZoomLocked:lt,enablePan:!1,onViewCommit:ye=>{var We;at(ye),rt.current=ye,(We=Ci.current)!=null&&We.length&&to.current&&Jd(Ci.current,ye,to.current,ye.zoom,void 0,void 0,ra.current)},onViewChange:ye=>{var We;rt.current=ye,(We=Ci.current)!=null&&We.length&&to.current&&Jd(Ci.current,ye,to.current,ye.zoom,void 0,void 0,ra.current)}});_.useEffect(()=>{hg()||dg(Ge)},[Ge,dg,hg]);const{handleNodeMouseDown:Jh,handleNodeMouseUp:ro,handleStartResize:l2}=HZ({selectedNodeIds:Vt,connectingSource:Oa,connectingTarget:Qo,connectingInputType:va,multiConnectingSourceIds:Ba,multiConnectingTargetIds:oc,dragStartPos:Jb,nodeStartPos:cg,dragElementRef:Zb,dragNodeIdRef:$f,setSelectedNodeId:dn,setSelectedNodeIds:Zt,onSelectionNotFromBoxSelect:()=>Rr(!1),setDragNodeId:Lu,setResizingNodeId:l0,setResizeDirection:rc,setConnections:nt,setConnectingSource:$l,setConnectingTarget:fa,setConnectingInputType:bo,setMultiConnectingSourceIds:ac,setMultiConnectingTargetIds:$,generateId:ns,setNodes:st,nodesRef:Un,selectedNodeIdsRef:Hr}),{handleStartConnectFromOutput:c2,handleStartConnectFromInput:Sf,handleConnectToInput:so,handleConnectToOutput:u2}=DZ({view:Ge,canvasRef:pn,connectingSource:Oa,connectingTarget:Qo,connectingInputType:va,setMousePos:La,setConnectingSource:$l,setConnectingTarget:fa,setConnectingInputType:bo,setConnections:nt,setNodes:st,nodes:De,generateId:ns}),{getNodeCallbacks:Fr}=JZ({nodes:De,nodesRef:Un,handleNodeMouseDown:Jh,handleNodeMouseUp:ro,deleteNode:xf,handleStartResize:l2,handleStartConnectFromOutput:c2,handleStartConnectFromInput:Sf,handleConnectToInput:so,handleConnectToOutput:u2}),{handleNavigate:oh}=ZZ({lightboxItem:er,setLightboxItem:qn,setHistory:Ut});_.useEffect(()=>{Aa&&bt(ye=>({...ye,visible:!1}))},[Aa]);const pg=_.useCallback(()=>{qn(null),go(!1),Ql(!1)},[qn,go,Ql]),t1=_.useCallback(async ye=>{if(ye.length===0)return;console.log("[SendToCanvas] 开始处理图片:",ye.length,"张");const{assetStore:We}=await mn(async()=>{const{assetStore:Hn}=await Promise.resolve().then(()=>_s);return{assetStore:Hn}},void 0,import.meta.url),ft=await Promise.all(ye.map(async(Hn,Nn)=>{try{if(Hn.startsWith("http://")||Hn.startsWith("https://")){const hr=`sendToCanvas_${Date.now()}_${Nn}`;if(await We.saveAsset(hr,Hn)){const as=await We.getAssetUrl(hr);if(as)return console.log("[SendToCanvas] HTTP URL 已缓存到 assetStore"),as}return Hn}if(Hn.startsWith("data:")){const hr=`sendToCanvas_${Date.now()}_${Nn}`,as=await(await fetch(Hn)).blob();if(await We.saveBlobAsset(hr,as,Hn)){const qi=await We.getAssetUrl(hr);if(qi)return console.log("[SendToCanvas] Base64 已转换并缓存到 assetStore"),qi}return URL.createObjectURL(as)}if(Hn.startsWith("blob:")){try{const{getFullBlobForDisplayUrl:hr}=await mn(async()=>{const{getFullBlobForDisplayUrl:qi}=await Promise.resolve().then(()=>Do);return{getFullBlobForDisplayUrl:qi}},void 0,import.meta.url),as=await hr(Hn)??await fetch(Hn).then(qi=>qi.blob());if(!as)return Hn;const ar=`sendToCanvas_${Date.now()}_${Nn}`;await We.saveBlobAsset(ar,as,Hn);const bs=await We.getAssetUrl(ar);if(bs)return bs}catch(hr){console.warn("[SendToCanvas] Blob URL 缓存失败:",hr)}return Hn}return Hn}catch(hr){return console.error("[SendToCanvas] 处理图片 URL 失败:",hr),Hn}})),Mt=ft.length;let Rt=1,sn=1;Mt<=4?(Rt=2,sn=Math.ceil(Mt/2)):(Rt=3,sn=Math.ceil(Mt/3));const Dt=-Ge.x/Ge.zoom+100,Xt=-Ge.y/Ge.zoom+100,xn=320,on=280,Pn=100,Jn=100;st(Hn=>{const Nn=[];return ft.forEach((hr,Er)=>{const as=Math.floor(Er/Rt),ar=Er%Rt,bs=Dt+ar*(xn+Pn),qi=Xt+as*(on+Jn),Ds=ns(),hi=Ms(Ds,"input-image",bs,qi,void 0,void 0,[...Hn,...Nn]);hi.content=hr,hi.width=xn,hi.height=on,Nn.push(hi)}),Nn.length>0&&dn(Nn[0].id),console.log(`[SendToCanvas] 创建了 ${Nn.length} 个图片节点,布局: ${sn}x${Rt}`),[...Hn,...Nn]})},[Ge,st,dn]),d2=_.useCallback(async(ye,We)=>{const{assetStore:ft}=await mn(async()=>{const{assetStore:on}=await Promise.resolve().then(()=>_s);return{assetStore:on}},void 0,import.meta.url);let Mt=ye;try{if(ye.startsWith("http://")||ye.startsWith("https://")){const on=`pose_${Date.now()}`;if(await ft.saveAsset(on,ye)){const Jn=await ft.getAssetUrl(on);Jn&&(Mt=Jn)}}else if(ye.startsWith("data:")){const on=`pose_${Date.now()}`,Jn=await(await fetch(ye)).blob();if(await ft.saveBlobAsset(on,Jn,ye)){const Nn=await ft.getAssetUrl(on);Nn&&(Mt=Nn)}}else if(ye.startsWith("blob:"))try{const on=`pose_${Date.now()}`,Jn=await(await fetch(ye)).blob();await ft.saveBlobAsset(on,Jn,ye)}catch{}}catch{}const sn=(320-Ge.x)/Ge.zoom,Dt=-Ge.y/Ge.zoom+100,Xt=320,xn=280;st(on=>{const Pn=ns(),Jn=Ms(Pn,"input-image",sn,Dt,We,void 0,on);return Jn.content=Mt,Jn.width=Xt,Jn.height=xn,dn(Pn),[...on,Jn]})},[Ge,st,dn,ns]),{handleFileDrop:lh}=PO({mousePosRef:Dh,canvasRef:pn,view:Ge,setNodes:st,generateId:ns});qZ({selectedNodeIdRef:Qn,nodesRef:Un,setNodes:st,onFilesPasted:ye=>lh(ye)});const di=hae();xZ({onFileDrop:lh,enabled:!0}),_.useEffect(()=>{const ye=async ft=>{var sn,Dt,Xt,xn;const Mt=(sn=ft.dataTransfer)==null?void 0:sn.getData("application/json");if(!Mt)return;const Rt=ft.target;if(!((Dt=Rt==null?void 0:Rt.closest)!=null&&Dt.call(Rt,"[data-rh-upload-zone]")))try{const on=JSON.parse(Mt);if(on.type==="pose-reference"&&on.itemId!=null&&on.title!=null){ft.preventDefault(),ft.stopPropagation();const Pn=(Xt=pn.current)==null?void 0:Xt.getBoundingClientRect();if(!Pn)return;const Jn=(ft.clientX-Pn.left-Ge.x)/Ge.zoom,Hn=(ft.clientY-Pn.top-Ge.y)/Ge.zoom,Nn=di.items.find(Er=>Er.id===on.itemId);if(!Nn)return;const hr=await di.getInsertUrl(Nn);if(!hr)return;st(Er=>{const as=ns(),ar=Ms(as,"input-image",Jn-140,Hn-140,on.title,void 0,Er);return ar.content=hr,ar.width=280,ar.height=280,[...Er,ar]});return}if(on.type==="history-item"&&on.item){const Pn=(xn=pn.current)==null?void 0:xn.getBoundingClientRect();if(!Pn)return;const Jn=(ft.clientX-Pn.left-Ge.x)/Ge.zoom,Hn=(ft.clientY-Pn.top-Ge.y)/Ge.zoom;if(De.find(ar=>ar.type!=="storyboard-node"?!1:Jn>=ar.x&&Jn<=ar.x+ar.width&&Hn>=ar.y&&Hn<=ar.y+ar.height))return;ft.preventDefault(),ft.stopPropagation();let hr=on.item.url,Er;try{if(on.item.url&&on.item.url.startsWith("blob:")){const bs=await(await fetch(on.item.url)).blob();hr=URL.createObjectURL(bs)}else hr=on.item.url}catch(ar){console.warn("[App] Blob fetch failed, trying assetStore:",ar);const bs=on.item._assetId||on.item.id;if(bs)try{const{assetStore:qi}=await mn(async()=>{const{assetStore:hi}=await Promise.resolve().then(()=>_s);return{assetStore:hi}},void 0,import.meta.url),Ds=await qi.getAssetBlob(bs);Ds&&(hr=URL.createObjectURL(Ds),Er=bs)}catch(qi){console.error("[App] assetStore fallback failed:",qi)}hr||(hr=on.item.url)}const as={id:ns(),type:"input-image",x:Jn-140,y:Hn-140,width:280,height:280,content:hr,prompt:on.item.prompt||"",settings:{_blobUrl:hr,_assetId:Er,mediaType:on.item.type||"image"}};st(ar=>[...ar,as])}}catch(on){console.error("[App] Failed to handle history drop:",on)}},We=pn.current;if(We)return We.addEventListener("drop",ye),()=>We.removeEventListener("drop",ye)},[Ge,st,ns,De,di]),GZ({canvasRef:pn,setView:at,isZoomLocked:lt});const[f0,jf]=_.useState(!1),fg=()=>{try{const ye=localStorage.getItem(ri.POSE_LIBRARY_PANEL);if(ye){const We=JSON.parse(ye);return{open:!!(We!=null&&We.open),floating:(We==null?void 0:We.floating)!==!1}}}catch{}return{open:!1,floating:!0}},[m0,Cf]=_.useState(()=>fg().open),[g0,Fa]=_.useState(()=>fg().floating),jl=_.useCallback((ye,We)=>{try{localStorage.setItem(ri.POSE_LIBRARY_PANEL,JSON.stringify({open:ye,floating:We}))}catch{}},[]);_.useEffect(()=>{jl(m0,g0)},[m0,g0,jl]);const[Rd,mg]=_.useState(!1),[Nf,Cl]=_.useState(!1),[Ef,hc]=_.useState(!1),[Zh,If]=_.useState(!1),[x0,kf]=_.useState(!1),[Qh,n1]=_.useState(!1),[b0,ep]=_.useState(!1),[nl,Ws]=$g(ri.LEFT_TOOLBAR_COLLAPSED,!1);_.useEffect(()=>{!it&&x0&&kf(!1)},[it,x0]);const[$a,ga]=$g(ri.RIGHT_TOOLBAR_COLLAPSED,!1),[xa,rl]=_.useState({percent:0,message:""}),[Du,ba]=_.useState(!1),ch=_.useRef(!1),[y0,tp]=_.useState(!1),[gg,v0]=_.useState(!1),[To,Af]=_.useState(!1),Pd=_.useRef(null),[Vu,Mf]=_.useState(new Set),[xg,pc]=_.useState(!1),[Tf,Hu]=_.useState(!1),{projects:np,currentProjectId:Gu,currentProjectName:w0,isSaving:Od,isLoading:rp,refreshList:io,saveProject:Fc,openProject:Nl,insertProject:Ro,deleteProject:r1,clearCurrentProject:bg}=Hoe({nodes:De,connections:Ae,view:Ge,groups:_t,canvasTextBoxes:A,canvasDoodleStrokes:F,setNodes:st,setConnections:nt,setView:at,setGroups:xt,setCanvasTextBoxes:O,setCanvasDoodleStrokes:L,setHistory:Ut,onProgress:(ye,We)=>{if(rl({percent:ye,message:We||""}),ye>=100&&We)try{Pe==null||Pe(We)}catch{}},onStripped:()=>{try{Pe==null||Pe("部分过大素材已省略,项目已保存")}catch{}}});_.useEffect(()=>{if(ch.current&&!Od){ba(!0);const ye=setTimeout(()=>ba(!1),1500);return()=>clearTimeout(ye)}ch.current=Od},[Od]);const yg={projectName:Ma,nodes:De,connections:Ae,view:Ge,history:Et,chatSessions:jr,characterLibrary:Yo,klingSubjectLibrary:Ha,selectedNodeId:Ot,selectedNodeIds:Vt,groups:_t,canvasTextBoxes:A,canvasDoodleStrokes:F,setNodes:st,setConnections:nt,setView:at,setHistory:Ut,setChatSessions:Br,setCharacterLibrary:Pc,setKlingSubjectLibrary:tc,setProjectName:Os,setGroups:xt,setCanvasTextBoxes:O,setCanvasDoodleStrokes:L,setSelectionContextMenu:qo,viewportSize:qs,onProgress:(ye,We,ft="export")=>{Ru({visible:ye!==0,progress:ye<0?0:ye,status:We,type:ft}),ye<0?setTimeout(()=>{Ru(Mt=>({...Mt,visible:!1}))},3e3):ye>=100&&setTimeout(()=>{Ru(Mt=>({...Mt,visible:!1}))},500)}},{handleLoadProject:h2,handleImportWorkflow:Ld,handleSaveSelectedWorkflow:s1}=lZ(yg),{saveNow:vg,importAutoSaveJson:_0,lastSaveTime:sp}=fZ({enabled:Fs.enabled,intervalMinutes:Fs.intervalMinutes,nodes:De,connections:Ae,groups:_t,view:Ge,projectName:Ma,history:Et,setNodes:st,setConnections:nt,setGroups:xt,setView:at,setProjectName:Os,onSaveSuccess:()=>Pe("已自动保存成功"),onSaveFailure:ye=>Te(ye)});_.useEffect(()=>{u0.current=sp?sp.getTime():null},[sp]),cZ({history:Et,setHistory:Ut}),JO({nodes:De,connections:Ae,groups:_t,canvasTextBoxes:A,canvasDoodleStrokes:F,history:Et,chatSessions:jr,characterLibrary:Yo,view:Ge,projectName:Ma,viewportSize:qs}),_.useCallback(()=>{if(I!=="doodle")return!1;const ye=X.current;if(ye.length===0)return!1;const We=ye[ye.length-1],ft=ye.slice(0,-1);return X.current=ft,L(ft),Q(Mt=>Mt.filter(Rt=>Rt!==We.id)),!0},[I]),_.useCallback(ye=>{var ft;if(I!=="doodle")return!1;const We=(ft=ye.key)==null?void 0:ft.toLowerCase();return We==="v"?(Y("select"),!0):We==="b"?(Y("brush"),!0):We==="e"?(Y("eraser"),!0):!1},[I]);const Wc=_.useRef(null);_.useEffect(()=>{const ye=()=>{Wc.current!=null&&(clearInterval(Wc.current),Wc.current=null)},We=on=>{re(Pn=>{const Jn=Math.round((Pn+on*.5)*2)/2;return Math.max(1,Math.min(16,Jn))})},ft=on=>{pe(Pn=>{const Jn=Pn+on;return Math.max(4,Math.min(48,Jn))})},Mt=on=>{M==="brush"?We(on):M==="eraser"&&ft(on)},Rt=on=>on.code==="Equal"||on.code==="NumpadAdd"||on.key==="+"?1:on.code==="Minus"||on.code==="NumpadSubtract"?-1:null,sn=on=>on.code==="Equal"||on.code==="NumpadAdd"||on.code==="Minus"||on.code==="NumpadSubtract",Dt=on=>{if(I!=="doodle"||M!=="brush"&&M!=="eraser")return;const Pn=on.target;if(Pn.tagName==="INPUT"||Pn.tagName==="TEXTAREA"||Pn.tagName==="SELECT"||Pn.isContentEditable||on.ctrlKey||on.metaKey||on.altKey)return;const Jn=Rt(on);Jn!=null&&(on.repeat||(on.preventDefault(),on.stopPropagation(),Mt(Jn),ye(),Wc.current=window.setInterval(()=>Mt(Jn),55)))},Xt=on=>{sn(on)&&ye()},xn=()=>ye();return window.addEventListener("keydown",Dt,!0),window.addEventListener("keyup",Xt,!0),window.addEventListener("blur",xn),()=>{ye(),window.removeEventListener("keydown",Dt,!0),window.removeEventListener("keyup",Xt,!0),window.removeEventListener("blur",xn)}},[I,M]),OY({nodesRef:Un,connectionsRef:Ci,selectedNodeIdRef:Qn,selectedNodeIdsRef:Hr,selectedConnectionIdRef:Zs,mousePosRef:Dh,deleteNode:xf,setSelectedNodeId:dn,setSelectedNodeIds:Zt,setSelectedConnectionId:jn,setNodes:st,setConnections:nt,onSave:async()=>pc(!0),onQuickSave:async()=>{try{await Fc(Gu&&w0?w0:Ma||"未命名项目",Gu||void 0,{saveMode:"workflow+assets"}),Pe==null||Pe("项目已保存")}catch(ye){Te==null||Te((ye==null?void 0:ye.message)||"保存失败")}},onUndo:Yn,onRedo:Zn}),_.useEffect(()=>{console.log("=== Window Close Warning Setup (Rust event) ===");const ye=typeof window<"u"&&("__TAURI_INTERNALS__"in window||"__TAURI__"in window||window.location.protocol==="tauri:");if(console.log("Is Tauri?",ye),!ye)return;let We;return(async()=>{try{const{getCurrentWindow:Mt}=await mn(async()=>{const{getCurrentWindow:sn}=await Promise.resolve().then(()=>zpe);return{getCurrentWindow:sn}},void 0,import.meta.url),Rt=Mt();console.log("Setting up tauri://close-requested listener..."),We=await Rt.listen("tauri://close-requested",async()=>{if(console.log("🔴 CLOSE REQUESTED EVENT RECEIVED FROM RUST!"),G0.current){console.log("⚠️ Dialog already showing, ignoring duplicate close request");return}const sn=Un.current,Dt=u0.current;console.log("Nodes:",sn.length),console.log("Last save:",Dt);const Xt=sn.length>0&&(!Dt||Date.now()-Dt>300*1e3);if(console.log("Should warn?",Xt),Xt)try{G0.current=!0;const{ask:xn}=await mn(async()=>{const{ask:Jn}=await Promise.resolve().then(()=>L0);return{ask:Jn}},void 0,import.meta.url),on=`画布上有 ${sn.length} 个节点,确定要关闭吗? + +${Dt?"建议先保存工作流。":"你还没有保存过工作流!"}`;console.log("Showing dialog...");const Pn=await xn(on,{title:"确认关闭",kind:"warning",okLabel:"关闭",cancelLabel:"取消"});console.log("User confirmed?",Pn),Pn?(console.log("Destroying window..."),await Rt.destroy()):(console.log("User cancelled"),G0.current=!1)}catch(xn){console.error("Dialog error:",xn),G0.current=!1,await Rt.destroy()}else console.log("No warning needed, closing window"),await Rt.destroy()}),console.log("Listener setup complete")}catch(Mt){console.error("Setup failed:",Mt)}})(),()=>{We&&We()}},[]),_.useEffect(()=>{let ye=!1,We=!1,ft=null;const Mt=Rt=>{Rt.ctrlKey&&Rt.shiftKey&&Rt.key==="O"?(Rt.preventDefault(),Rt.stopPropagation(),ye=!0,We=!1,ft&&clearTimeout(ft),ft=window.setTimeout(()=>{ye=!1,We=!1},2e3),console.log("[快捷键] 第1步完成: Ctrl+Shift+O")):ye&&!We&&(Rt.key==="j"||Rt.key==="J")?(Rt.preventDefault(),Rt.stopPropagation(),We=!0,ft&&clearTimeout(ft),ft=window.setTimeout(()=>{ye=!1,We=!1},2e3),console.log("[快捷键] 第2步完成: J")):ye&&We&&Rt.key===" "&&(Rt.preventDefault(),Rt.stopPropagation(),ye=!1,We=!1,ft&&clearTimeout(ft),console.log("[快捷键] 第3步完成: 空格 - 打开控制面板"),$d(!0))};return window.addEventListener("keydown",Mt),()=>{window.removeEventListener("keydown",Mt),ft&&clearTimeout(ft)}},[]),_.useEffect(()=>{const ye=We=>{if(We.key!=="Tab")return;const ft=document.activeElement;if(ft){const Xt=ft.tagName;if(Xt==="INPUT"||Xt==="TEXTAREA"||Xt==="SELECT"||ft.isContentEditable)return}if(no.length===0)return;We.preventDefault(),We.stopPropagation();const Mt=no.findIndex(Xt=>Xt.id===Ot),Rt=We.shiftKey?-1:1,sn=Mt===-1?Rt>0?0:no.length-1:(Mt+Rt+no.length)%no.length,Dt=no[sn];Dt&&K0(Dt)};return window.addEventListener("keydown",ye,!0),()=>window.removeEventListener("keydown",ye,!0)},[no,Ot,K0]);const Cr=e==="dark",i1=De.length>dh.PERF_MODE_THRESHOLD,Rf=_l||Mi||P,ip=jH(Ge.zoom);jZ({nodes:De,view:Ge,isInteracting:Rf,canvasWidth:qs.width,canvasHeight:qs.height});const rs=Mi||Bc.current?rt.current:Ge,Po=_.useMemo(()=>{if(we.length===0)return null;const ye=[];for(const We of we){const ft=F.find(Mt=>Mt.id===We);ft&&ye.push(vE(ft.points,ft.width/2+1))}return xoe(ye)},[F,we]),a1=_.useCallback((ye,We)=>{var xn;if(ye.stopPropagation(),ye.preventDefault(),k.current||We.length===0)return;const ft=(xn=pn.current)==null?void 0:xn.getBoundingClientRect();if(!ft)return;const Mt=(ye.clientX-ft.left-rt.current.x)/rt.current.zoom,Rt=(ye.clientY-ft.top-rt.current.y)/rt.current.zoom,sn=new Map;for(const on of We){const Pn=X.current.find(Jn=>Jn.id===on);Pn&&sn.set(on,Pn.points.map(Jn=>({...Jn})))}const Dt=on=>{var Er;const Pn=(Er=pn.current)==null?void 0:Er.getBoundingClientRect();if(!Pn)return;const Jn=(on.clientX-Pn.left-rt.current.x)/rt.current.zoom,Hn=(on.clientY-Pn.top-rt.current.y)/rt.current.zoom,Nn=Jn-Mt,hr=Hn-Rt;L(as=>as.map(ar=>{if(!We.includes(ar.id))return ar;const bs=sn.get(ar.id);return bs?{...ar,points:voe(bs,Nn,hr)}:ar}))},Xt=()=>{window.removeEventListener("mousemove",Dt),window.removeEventListener("mouseup",Xt),k.current=null};k.current={onMove:Dt,onUp:Xt},window.addEventListener("mousemove",Dt),window.addEventListener("mouseup",Xt)},[]),o1=_.useCallback((ye,We,ft,Mt)=>{if(ye.stopPropagation(),ye.preventDefault(),W.current||ft.length===0)return;const Rt=new Map(ft.map(xn=>{const on=X.current.find(Pn=>Pn.id===xn);return[xn,on.points.map(Pn=>({...Pn}))]})),sn={...Mt},Dt=xn=>{var Nn;const on=(Nn=pn.current)==null?void 0:Nn.getBoundingClientRect();if(!on)return;const Pn=(xn.clientX-on.left-rt.current.x)/rt.current.zoom,Jn=(xn.clientY-on.top-rt.current.y)/rt.current.zoom,Hn=_oe(sn,We,Pn,Jn);L(hr=>hr.map(Er=>{if(!ft.includes(Er.id))return Er;const as=Rt.get(Er.id);return as?{...Er,points:woe(as,sn,Hn)}:Er}))},Xt=()=>{window.removeEventListener("mousemove",Dt),window.removeEventListener("mouseup",Xt),W.current=null};W.current={onMove:Dt,onUp:Xt},window.addEventListener("mousemove",Dt),window.addEventListener("mouseup",Xt)},[]),z0=_.useCallback(async()=>{if(we.length===0)return;const ye=Po;if(!ye)return;const We=ye.minX,ft=ye.minY,Mt=Math.max(1,Math.ceil(ye.maxX-ye.minX)),Rt=Math.max(1,Math.ceil(ye.maxY-ye.minY)),sn=F.filter(Nn=>we.includes(Nn.id)),Dt=document.createElement("canvas");Dt.width=Mt,Dt.height=Rt;const Xt=Dt.getContext("2d");if(!Xt)return;Xt.fillStyle="#F5F5F5",Xt.fillRect(0,0,Mt,Rt);for(const Nn of sn)if(!(Nn.points.length<1)){if(Xt.strokeStyle=Nn.color,Xt.lineWidth=Nn.width,Xt.lineCap="round",Xt.lineJoin="round",Nn.points.length===1){const hr=Nn.points[0];Xt.beginPath(),Xt.arc(hr.x-We,hr.y-ft,Math.max(Nn.width/2,.5),0,Math.PI*2),Xt.fillStyle=Nn.color,Xt.fill();continue}Xt.beginPath(),Xt.moveTo(Nn.points[0].x-We,Nn.points[0].y-ft);for(let hr=1;hrDt.toBlob(hr=>Nn(hr),"image/png"));if(!xn)return;const{assetStore:on}=await mn(async()=>{const{assetStore:Nn}=await Promise.resolve().then(()=>_s);return{assetStore:Nn}},void 0,import.meta.url),Pn=`doodle_board_${Date.now()}`,Jn=await on.saveBlobAsset(Pn,xn,"");let Hn=URL.createObjectURL(xn);if(Jn){const Nn=await on.getAssetUrl(Pn);Nn&&(Hn=Nn)}st(Nn=>{const hr=ns(),Er=Ms(hr,"input-image",We,ft,"涂鸦画板",void 0,Nn);return Er.content=Hn,Er.width=Mt,Er.height=Rt,dn(hr),[...Nn,Er]}),Pe==null||Pe("已创建画板图片节点")},[we,Po,F,st,dn,ns,Pe]),l1=Soe(er,Aa);return s.jsxs(s.Fragment,{children:[s.jsx(GC,{visible:Zl.visible,progress:Zl.progress,status:Zl.status,type:Zl.type,isDark:Cr}),ku&&Ko.total>0&&s.jsx(GC,{visible:!0,progress:Ko.current/Ko.total*100,status:`正在下载内容 ${Ko.current}/${Ko.total} 个文件`,type:"export",onCancel:Au,isDark:Cr}),(Od||Du)&&s.jsxs("div",{className:`fixed bottom-6 left-1/2 -translate-x-1/2 z-[9998] flex flex-col items-center gap-2 min-w-[280px] max-w-[90vw] px-4 py-3 rounded-xl shadow-2xl backdrop-blur-xl animate-in fade-in duration-200 ${Cr?"bg-[#09090b]/95 border border-white/10":"bg-blue-500/95 border border-blue-400/30"}`,style:{pointerEvents:"none"},children:[s.jsx("span",{className:`text-[10px] font-mono tracking-wider uppercase ${Cr?"text-zinc-400":"text-white/90"}`,children:Du?"保存完成":"项目管理保存中"}),s.jsx("div",{className:`w-full h-1.5 rounded-full overflow-hidden ${Cr?"bg-zinc-800":"bg-white/30"}`,children:s.jsx("div",{className:`h-full rounded-full transition-all duration-300 ease-out ${Cr?"bg-white/90":"bg-white"}`,style:{width:`${Du?100:xa.percent}%`}})}),!Du&&xa.message&&s.jsx("span",{className:`text-[11px] truncate w-full text-center ${Cr?"text-zinc-500":"text-white/80"}`,children:xa.message})]}),s.jsxs("div",{className:`w-full h-screen font-sans overflow-hidden select-none flex flex-col transition-colors duration-300 ${Cr?"bg-[#09090b] text-white":"bg-zinc-100 text-zinc-900"} ${i1?"perf-mode":""} ${Rf?"interacting":""} ${ip}`,children:[s.jsx(eae,{rightToolbarCollapsed:$a,onToggleRightToolbarCollapsed:()=>ga(!$a),isDark:Cr,theme:e,projectName:Ma,isEditingProjectName:gg,isDownloading:ku,downloadProgress:Ko,currentZoom:Ge.zoom,isSidebarOpen:ko&&!Ef||f0||Zh||it&&x0||Qh||b0||Wi&&!Nf||m0&&!g0,isZoomLocked:lt,nodeBorderVisibilityMode:Ed,onNodeBorderVisibilityModeChange:Id,onThemeToggle:()=>t(e==="dark"?"light":"dark"),onProjectNameChange:Os,onEditProjectNameStart:()=>{v0(!0),setTimeout(()=>{var ye;return(ye=Pd.current)==null?void 0:ye.focus()},0)},onEditProjectNameEnd:()=>{v0(!1),Af(!1)},onClearCanvas:()=>{st([]),nt([])},onOpenSettings:()=>Io(!0),onOpenStorageManage:()=>zu(!0),onDownloadSelected:Kb,onZoomChange:ye=>at(We=>({...We,zoom:ye})),onZoomLockChange:ot,showCanvasGrid:n,onCanvasGridToggle:()=>r(!n),showCanvasSnap:i,onCanvasSnapToggle:()=>a(!i),showCanvasMinimap:w,onCanvasMinimapToggle:()=>v(!w),canvasBackgroundColor:Cr?C:m,canvasBackgroundDefaultHex:Cr?L$:O$,onCanvasBackgroundColorChange:ye=>Cr?E(ye):z(ye),projectNameInputRef:Pd,showNewProjectSaveHint:To}),s.jsxs("div",{className:`absolute top-0 bottom-0 left-0 right-0 transition-opacity duration-500 ease-out ${c?"opacity-100":"opacity-0"} ${Cr?"bg-[#09090b]":"bg-zinc-100"}`,children:[s.jsx(p4,{isOpen:ko,onClose:()=>{console.log("[App] 关闭历史记录面板"),ql(!1)},floating:Ef,onSwitchToSidebar:()=>hc(!1),onSwitchToFloating:()=>hc(!0),isDark:Cr,history:Et,localCacheServerConnected:pa,localCacheSettingsOpen:Lc,localServerConfig:Ta,onSetLocalCacheSettingsOpen:Ra,onSetLocalServerConfig:nc,onSetHistory:Ut,onSetLightboxItem:qn,onSetLightboxOpen:go,onSetBatchManageOpen:ju,onHistoryContextMenu:(ye,We)=>{var sn;ye.preventDefault(),ye.stopPropagation();const ft=(sn=pn.current)==null?void 0:sn.getBoundingClientRect(),Mt=ft?(ye.clientX-ft.left-Ge.x)/Ge.zoom:0,Rt=ft?(ye.clientY-ft.top-Ge.y)/Ge.zoom:0;Xl({visible:!0,x:ye.clientX,y:ye.clientY,worldX:Mt,worldY:Rt,item:We})},onRefreshVideo:Bn,onRefreshAudio:Nr,onRefreshMjImage:tr,onRefreshComfyTask:br,onLocateToNode:Vh}),f0&&s.jsx($te,{isOpen:!0,isDark:Cr,characterLibrary:Yo,onClose:()=>{console.log("[App] 关闭角色库面板"),jf(!1)},onCreateCharacter:()=>$u(!0),onDeleteCharacter:ye=>Pc(We=>We.filter(ft=>ft.id!==ye))}),m0&&s.jsx(Ote,{isOpen:!0,floating:g0,isDark:Cr,items:di.items,loading:di.loading,error:di.error,folderPath:di.folderPath,folderPaths:di.folderPaths,isTauri:di.isTauri,favoritedIds:di.favoritedIds,dataSource:di.dataSource,eagleFolders:di.eagleFolders,currentEagleFolderId:di.currentEagleFolderId,onClose:()=>Cf(!1),onSwitchToSidebar:()=>Fa(!1),onSwitchToFloating:()=>Fa(!0),onChooseFolder:di.chooseFolder,onSwitchFolder:di.switchFolder,onRemoveCurrentFolder:di.removeCurrentFolder,onClearFolder:di.clearFolder,onSelectFiles:di.isTauri?void 0:di.setItemsFromFiles,onConnectEagle:di.isTauri?di.connectEagle:void 0,onSwitchEagleFolder:di.switchEagleFolder,onSwitchToLocal:di.switchToLocal,getPreviewUrl:di.getPreviewUrl,onToggleFavorite:di.toggleFavorite,onInsertPose:async ye=>{const We=await di.getInsertUrl(ye);We?(await d2(We,ye.title),Pe(`已将「${ye.title}」插入到画布`)):Te("无法读取该图片")}}),b0&&s.jsx(Ute,{isOpen:!0,isDark:Cr,projects:np,currentProjectId:Gu,currentProjectName:w0,isSaving:Od,isLoading:rp,progress:xa,onClose:()=>ep(!1),onRefreshList:io,onSaveCurrent:async ye=>{if(Gu&&w0)try{await Fc(w0,Gu,{saveMode:ye}),Pe("项目已保存")}catch(We){Te((We==null?void 0:We.message)||"保存失败")}else Te("请先点击「另存为」保存当前工作流")},onSaveAs:async(ye,We)=>{try{await Fc(ye,void 0,{saveMode:We}),Pe("已另存为新项目")}catch(ft){Te((ft==null?void 0:ft.message)||"另存为失败")}},onOpen:async(ye,We)=>{try{await Nl(ye),We&&Os(We),ep(!1),Pe("项目已打开")}catch(ft){Te((ft==null?void 0:ft.message)||"打开失败")}},onInsert:async ye=>{try{await Ro(ye),Pe("项目已插入到画布")}catch(We){Te((We==null?void 0:We.message)||"插入失败")}},onDelete:async ye=>{try{await r1(ye),Pe("项目已删除")}catch(We){Te((We==null?void 0:We.message)||"删除失败")}},projectName:Ma}),Qh&&s.jsx(Ate,{isOpen:!0,isDark:Cr,rhAppLibrary:Pu,onClose:()=>n1(!1),onDeleteItem:ye=>Zo(We=>We.filter(ft=>ft.id!==ye)),onUpdateItem:(ye,We)=>Zo(ft=>ft.map(Mt=>Mt.id===ye?{...Mt,...We}:Mt)),onFillToNode:ye=>{const We=(ye.type||"app")==="workflow",ft=We?"rh-comfy":"rh-app",Mt=Ot?De.find(Rt=>Rt.id===Ot&&Rt.type===ft):De.find(Rt=>Rt.type===ft);Mt?We?(Td(Mt.id,{settings:{...Mt.settings,workflowId:ye.webappId,comfyEditableParams:ye.comfyEditableParams,rhComfyParamValues:ye.rhParamValues||{},comfyRawWorkflowJson:ye.comfyRawWorkflowJson,rhUseOverseas:ye.rhUseOverseas??!1,rhComfyUploadPreviews:ye.rhComfyUploadPreviews||{}}}),Pe(`已将工作流 "${ye.customName||ye.webappName}" 填充到 Comfy 节点`)):(Td(Mt.id,{settings:{...Mt.settings,webappId:ye.webappId,webappName:ye.customName||ye.webappName,rhCovers:ye.covers,nodeInfoListTemplate:ye.nodeInfoListTemplate,rhParamValues:ye.rhParamValues||{}}}),Pe(`已将应用 "${ye.customName||ye.webappName}" 填充到 RH 节点`)):Te(We?"请先选择一个 RH Comfy 节点":"请先选择一个 RH 节点")}}),Zh&&s.jsx(jte,{isOpen:!0,isDark:Cr,klingSubjectLibrary:Ha,onClose:()=>{console.log("[App] 关闭可灵主体库面板"),If(!1)},onCreateSubject:()=>tp(!0),onDeleteSubject:ye=>tc(We=>We.filter(ft=>ft.id!==ye)),onSendToNode:ye=>{var ft;const We=Ot?De.find(Mt=>{var Rt;return Mt.id===Ot&&((Rt=Mt.settings)==null?void 0:Rt.model)==="kling-o1"}):De.find(Mt=>{var Rt;return((Rt=Mt.settings)==null?void 0:Rt.model)==="kling-o1"});if(We){const Mt=Ha.find(Rt=>Rt.id===ye);if(Mt){const Rt=((ft=We.settings)==null?void 0:ft.klingSubjects)||[];Rt.length<7&&!Rt.includes(ye)?(Td(We.id,{settings:{...We.settings,klingSubjects:[...Rt,ye]}}),Pe(`已将主体 "${Mt.name}" 添加到节点`)):Rt.includes(ye)?Te("该主体已添加到节点"):Te("最多只能添加 7 个主体")}}else Te("请先选择一个 Kling O1 视频生成节点")}}),it&&x0&&s.jsx(Ite,{isOpen:!0,isDark:Cr,roles:Jo,onClose:()=>kf(!1),onAddRole:ye=>Oc(We=>[ye,...We]),onDeleteRole:ye=>Oc(We=>We.filter(ft=>ft.id!==ye)),onUpdateRole:(ye,We)=>Oc(ft=>ft.map(Mt=>Mt.id===ye?{...Mt,...We}:Mt)),onSendToCanvas:async ye=>{var xn;const We=Jo.find(on=>on.id===ye);if(!We)return;if(!We.previewImageUrl){Te("角色预览图缺失");return}if(!We.assetUrl){Te("角色未通过审核(缺少 Asset://)");return}const ft=Ot?De.find(on=>on.id===Ot&&on.type==="gen-video"):De.find(on=>on.type==="gen-video"),Mt=(xn=pn.current)==null?void 0:xn.getBoundingClientRect(),Rt=Mt?(Mt.width/2-Ge.x)/Ge.zoom:200,sn=Mt?(Mt.height/2-Ge.y)/Ge.zoom:200;let Dt=We.previewImageUrl;if(We._assetId)try{const{localCacheManager:on}=await mn(async()=>{const{localCacheManager:Hn}=await Promise.resolve().then(()=>Xa);return{localCacheManager:Hn}},void 0,import.meta.url),{assetStore:Pn}=await mn(async()=>{const{assetStore:Hn}=await Promise.resolve().then(()=>_s);return{assetStore:Hn}},void 0,import.meta.url);await on.ensureRestored();const Jn=await on.readAssetAsUrl(We._assetId);if(Jn)Dt=Jn;else{const Hn=await Pn.getAssetUrl(We._assetId);Hn&&(Dt=Hn)}}catch{}const Xt=ns();st(on=>{const Pn=Ms(Xt,"input-image",Rt-140,sn-140,We.name,void 0,on);return Pn.content=Dt,Pn.width=280,Pn.height=280,Pn.settings={...Pn.settings||{},mediaType:"image",seedanceAssetUrl:We.assetUrl},[...on,Pn]}),ft?(nt(on=>[...on,{id:ns(),from:Xt,to:ft.id,inputType:"default"}]),Pe(`已发送角色 "${We.name}" 到画布并连接到视频节点`)):Pe(`已发送角色 "${We.name}" 到画布`)}}),Wi&&s.jsx(Vte,{isOpen:!0,floating:Nf,onSwitchToSidebar:()=>Cl(!1),onSwitchToFloating:()=>Cl(!0),isDark:Cr,project:Oi,projectMetas:da,currentProjectId:ha,selectedEpisodeId:cs,isSplitting:na,isGeneratingEpisode:ui,splitProgress:fs,scriptModel:Or,chatModels:Ns,onClose:()=>ci(!1),onSetOutline:Kt,onSetEpisodeCount:rn,onSetProjectName:Li,onImportTxt:gn,onSmartSplit:Di,onSmartSplitByDuration:ii,onAddEpisode:lr,onRemoveEpisode:On,onUpdateEpisode:wr,onSelectEpisode:Ar,onGenerateEpisode:Hs,onCancelGeneration:ji,onSetScriptModel:ls,onSetScriptPromptCustom:an,onSetScriptSkillId:en,onNewProject:ka,onSwitchProject:dt,onDeleteProject:vt,onExportToCanvas:Cc,onExtract:Js,onExtractManual:Ai,isExtracting:Wl,extractProgress:Dl,onExportItemToCanvas:wd,onGenerateSceneConcept:Vl,isGeneratingConcept:Vi,onExportSceneToCanvas:Go,onExportShotToCanvas:yl,allStyles:yd,customStyles:yu,onAddCustomStyle:bl,onRemoveCustomStyle:Qt,onUpdateCustomStyle:H0,onGenerateStyleWithAI:r0,isGeneratingStyle:s0,extractionModelId:Hl,onSetExtractionModelId:ya,extractionSkillId:Gl,onSetExtractionSkillId:vd}),s.jsx("div",{className:`absolute top-1/2 -translate-y-1/2 z-50 transition-all duration-300 ${ko&&!Ef||f0||Zh||it&&x0||Qh||b0||Wi&&!Nf||m0&&!g0?"left-[256px]":"left-4"}`,children:s.jsx(Zie,{collapsed:nl,onToggleCollapsed:()=>Ws(!nl),isDark:Cr,activeTool:I,historyOpen:ko,charactersOpen:f0,klingSubjectsOpen:Zh,seedanceRolesOpen:x0,showSeedanceRolesTool:it,rhAppLibraryOpen:Qh,projectPanelOpen:b0,scriptWriterOpen:Wi,poseLibraryOpen:m0,chatOpen:Ts,textToolActive:I==="text-create",doodleToolActive:I==="doodle",hideConnections:At,onSetActiveTool:R,onToggleHistory:ye=>{ye&&(ye.preventDefault(),ye.stopPropagation()),console.log("[App] 点击历史记录按钮,当前 historyOpen:",ko),R("history"),ql(We=>!We)},onToggleCharacters:ye=>{ye&&(ye.preventDefault(),ye.stopPropagation()),console.log("[App] 点击角色库按钮,当前 charactersOpen:",f0),R("characters"),jf(We=>!We)},onToggleKlingSubjects:ye=>{ye&&(ye.preventDefault(),ye.stopPropagation()),console.log("[App] 点击可灵主体库按钮,当前 klingSubjectsOpen:",Zh),R("kling-subjects"),If(We=>!We)},onToggleSeedanceRoles:ye=>{ye&&(ye.preventDefault(),ye.stopPropagation()),R("seedance-roles"),kf(We=>!We)},onToggleRhAppLibrary:ye=>{ye&&(ye.preventDefault(),ye.stopPropagation()),R("rh-app-library"),n1(We=>!We)},onToggleProjectPanel:ye=>{ye&&(ye.preventDefault(),ye.stopPropagation()),ep(We=>!We)},onToggleScriptWriter:ye=>{ye&&(ye.preventDefault(),ye.stopPropagation()),ci(We=>!We)},onTogglePoseLibrary:ye=>{ye&&(ye.preventDefault(),ye.stopPropagation()),Cf(We=>!We)},onToggleChat:ye=>{ye&&(ye.preventDefault(),ye.stopPropagation()),console.log("[App] 点击对话按钮,当前 isChatOpen:",Ts),os(We=>!We)},onToggleTextTool:ye=>{ye&&(ye.preventDefault(),ye.stopPropagation()),R(We=>We==="text-create"?"select":"text-create")},onToggleDoodleTool:ye=>{ye&&(ye.preventDefault(),ye.stopPropagation()),Ne.current=!1,ve.current=null,xe(null),R(We=>We==="doodle"?"select":"doodle")},onToggleConnections:()=>{kt(ye=>!ye)},onSaveProject:()=>pc(!0),onLoadProject:h2,onImportWorkflow:Ld,onOpenSkillToWorkflow:()=>{Ec(""),Da(!0)},onToggleAlignPanel:()=>Hu(ye=>!ye),onCategorizedExport:()=>pc(!0)})}),s.jsx(moe,{visible:I==="doodle",isDark:Cr,subTool:M,onSubToolChange:Y,brushColor:se,onBrushColorChange:ie,brushWidth:oe,onBrushWidthChange:re,eraserWidth:ee,onEraserWidthChange:pe}),I==="doodle"&&Po&&we.length>0&&(()=>{const ye=pn.current;if(!ye)return null;const We=ye.getBoundingClientRect(),ft=rs.zoom,Mt=rs.x,Rt=rs.y,sn=(Po.minX+Po.maxX)/2*ft+Mt+We.left,Dt=Po.minY*ft+Rt+We.top;return s.jsx(goe,{visible:!0,isDark:Cr,screenLeft:sn,screenTop:Dt,selectionColor:U,onSelectionColorChange:Xt=>{G(Xt),L(xn=>xn.map(on=>we.includes(on.id)?{...on,color:Xt}:on))},onCreateArtboard:z0})})(),s.jsxs("div",{className:`absolute inset-0 overflow-hidden transition-opacity duration-200 ${Su?"opacity-0 pointer-events-none":"opacity-100"}`,ref:xo,children:[s.jsx(Kae,{view:rs,isDark:Cr,isPanning:Mi,showGrid:n,backgroundColor:Cr?C:m,viewportWidth:qs.width,viewportHeight:qs.height}),De.length===0&&!d&&s.jsx(iee,{isDark:Cr,projectBar:s.jsx(aee,{isDark:Cr,projects:np,isLoading:rp,onRefreshList:io,onOpenProject:async(ye,We)=>{try{await Nl(ye),We&&Os(We),h(!0),Pe==null||Pe("项目已打开")}catch(ft){Te==null||Te((ft==null?void 0:ft.message)||"打开失败")}},onCreateNew:()=>{bg(),h(!0),Af(!0),v0(!0),setTimeout(()=>{var ye;return(ye=Pd.current)==null?void 0:ye.focus()},150),Pe==null||Pe("请在左上角输入项目名称")}})}),w&&s.jsx(hoe,{view:rs,viewportWidth:qs.width,viewportHeight:qs.height,nodes:De,onViewChange:at,isDark:Cr}),s.jsxs("div",{ref:pn,id:"canvas-bg",className:`absolute inset-0 canvas-custom-cursor ${Mi?"canvas-panning":""} ${Pa?"canvas-node-dragging":""} ${_e?"canvas-text-dragging":""} ${I==="text-create"?"canvas-text-create-cursor":""} ${I==="doodle"&&M==="brush"?"canvas-doodle-cursor":""} ${ip}`,style:{touchAction:I==="doodle"?"none":"auto"},onMouseDown:Qb,onPointerDown:ye=>{I==="doodle"&&ye.pointerType==="pen"&&(V.current=Date.now(),ye.preventDefault(),ye.stopPropagation(),Qb(ye))},onMouseMove:e1,onMouseUp:ug,onClick:ye=>{de(null),le&&fe(null),zf(ye)},onMouseLeave:()=>{const ye=Oa!==null,We=_l,ft=Mi||((Bc==null?void 0:Bc.current)??!1);!ye&&!We&&!ft&&(Ou(!1),Bc.current=!1,Ao(!1),Lu(null),l0(null),$l(null),fa(null),bo(null),ac(null),$(null),hf.current=null,document.body.classList.remove("canvas-interacting")),(P||Oe.current)&&(K(!1),Oe.current=!1,he(null))},onDoubleClick:ye=>{h(!0),f([]),lg(ye)},onContextMenu:Yb,children:[Ce&&s.jsx("div",{className:"absolute pointer-events-none z-[60] rounded-sm border border-black/70 bg-black/10",style:{left:Math.min(Ce.startX,Ce.endX)*rs.zoom+rs.x,top:Math.min(Ce.startY,Ce.endY)*rs.zoom+rs.y,width:Math.max(1,Math.abs(Ce.endX-Ce.startX)*rs.zoom),height:Math.max(1,Math.abs(Ce.endY-Ce.startY)*rs.zoom)}}),s.jsxs("svg",{ref:to,className:"absolute inset-0 overflow-visible",style:{zIndex:1,pointerEvents:"none"},children:[!At&&s.jsx(Fae,{connections:Dm,nodes:De,view:rs,viewportWidth:qs.width,viewportHeight:qs.height,selectedNodeId:Ot,selectedNodeIds:Vt,selectedConnectionId:Sn,onSelectConnection:jn,isDark:Cr,onDeleteConnection:Jm,collectionEndpoints:lc}),o.length>0&&o.map((ye,We)=>s.jsx("line",{x1:ye.x1,y1:ye.y1,x2:ye.x2,y2:ye.y2,stroke:Cr?"#3b82f6":"#2563eb",strokeWidth:1,strokeDasharray:"4 4",opacity:.8,pointerEvents:"none"},We)),Oa&&(()=>{const ye=bi.get(Oa);if(!ye)return null;const We=(ye.x+ye.width)*rs.zoom+rs.x,ft=(ye.y+ye.height/2)*rs.zoom+rs.y,Mt=ma.x*rs.zoom+rs.x,Rt=ma.y*rs.zoom+rs.y;return s.jsx(sx,{groupRef:d0,fromX:We,fromY:ft,toX:Mt,toY:Rt,isDark:Cr})})(),Qo&&(()=>{const ye=bi.get(Qo);if(!ye)return null;const We=ye.x*rs.zoom+rs.x,ft=(ye.y+ye.height/2)*rs.zoom+rs.y,Mt=ma.x*rs.zoom+rs.x,Rt=ma.y*rs.zoom+rs.y;return s.jsx(sx,{groupRef:el,fromX:We,fromY:ft,toX:Mt,toY:Rt,isDark:Cr,isReverse:!0})})(),Ba&&Ba.map(ye=>{const We=bi.get(ye);if(!We)return null;const ft=(We.x+We.width)*rs.zoom+rs.x,Mt=(We.y+We.height/2)*rs.zoom+rs.y,Rt=ma.x*rs.zoom+rs.x,sn=ma.y*rs.zoom+rs.y;return s.jsx(sx,{fromX:ft,fromY:Mt,toX:Rt,toY:sn,isDark:Cr},ye)}),oc&&oc.map(ye=>{const We=bi.get(ye);if(!We)return null;const ft=ma.x*rs.zoom+rs.x,Mt=ma.y*rs.zoom+rs.y,Rt=We.x*rs.zoom+rs.x,sn=(We.y+We.height/2)*rs.zoom+rs.y;return s.jsx(sx,{fromX:ft,fromY:Mt,toX:Rt,toY:sn,isDark:Cr,isReverse:!0},ye)})]}),s.jsxs("div",{ref:An,style:{transform:`translate3d(${rs.x}px, ${rs.y}px, 0) scale(${rs.zoom})`,transformOrigin:"0 0",position:"relative",zIndex:10,willChange:Mi?"transform":"auto",backfaceVisibility:"hidden"},children:[s.jsx("svg",{className:"absolute left-0 top-0 overflow-visible",style:{width:1,height:1,zIndex:0,pointerEvents:"none"},"aria-hidden":!0,children:s.jsxs("g",{children:[F.map(ye=>s.jsx("path",{d:V1(ye.points),fill:"none",stroke:ye.color,strokeWidth:ye.width,strokeLinecap:"round",strokeLinejoin:"round",style:{pointerEvents:I==="doodle"&&M==="select"?"stroke":"none",cursor:I==="doodle"&&M==="select"?"pointer":void 0},onMouseDown:We=>{if(I!=="doodle"||M!=="select")return;We.stopPropagation(),We.preventDefault();const ft=We.ctrlKey||We.metaKey;Q(ft?Mt=>Mt.includes(ye.id)?Mt.filter(Rt=>Rt!==ye.id):[...Mt,ye.id]:[ye.id])}},ye.id)),T&&H&&M==="eraser"&&T.length>=2&&s.jsx("path",{d:V1(T),fill:"none",stroke:"rgba(239,68,68,0.55)",strokeWidth:ee,strokeLinecap:"round",strokeLinejoin:"round",opacity:.92,style:{pointerEvents:"none"}}),T&&H&&M==="brush"&&T.length>=2&&!W$(H)&&s.jsx("path",{d:V1(T),fill:"none",stroke:se,strokeWidth:oe,strokeLinecap:"round",strokeLinejoin:"round",opacity:.92,style:{pointerEvents:"none"}}),T&&H&&M==="brush"&&T.length>=2&&W$(H)&&sI(H,se,oe).map((We,ft)=>s.jsx("path",{d:V1(We.points),fill:"none",stroke:We.color,strokeWidth:We.width,strokeLinecap:"round",strokeLinejoin:"round",opacity:.92,style:{pointerEvents:"none"}},`doodle-draft-p-${ft}`)),H&&H.length===1&&T&&T.length===1&&(()=>{const ye=H[0],We=M==="eraser",ft=We?ee:Math.max(.6,oe*x7(ye.pressure));return s.jsx("path",{d:`M ${ye.x} ${ye.y} L ${ye.x+.6} ${ye.y}`,fill:"none",stroke:We?"rgba(239,68,68,0.55)":se,strokeWidth:ft,strokeLinecap:"round",strokeLinejoin:"round",opacity:.92,style:{pointerEvents:"none"}})})()]})}),I==="doodle"&&M==="select"&&me&&s.jsx("div",{className:"absolute pointer-events-none z-[5]",style:{left:Math.min(me.x0,me.x1),top:Math.min(me.y0,me.y1),width:Math.abs(me.x1-me.x0),height:Math.abs(me.y1-me.y0),border:"1px dashed rgba(59,130,246,0.95)",background:"rgba(59,130,246,0.06)"}}),I==="doodle"&&M==="select"&&Po&&we.length>0&&s.jsxs("div",{className:"absolute z-[8]",style:{left:Po.minX,top:Po.minY,width:Math.max(0,Po.maxX-Po.minX),height:Math.max(0,Po.maxY-Po.minY),pointerEvents:"none"},children:[s.jsx("div",{className:"absolute inset-0 rounded-sm border pointer-events-none",style:{borderColor:Cr?"rgba(250,250,250,0.85)":"rgba(23,23,23,0.88)"}}),s.jsx("div",{className:"absolute cursor-move z-[1]",style:{inset:8,pointerEvents:"auto"},onMouseDown:ye=>a1(ye,we)}),["nw","ne","se","sw"].map(ye=>{const We={nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"};return s.jsx("div",{className:"absolute w-2.5 h-2.5 bg-white border border-zinc-900 box-border z-[2]",style:{left:ye.includes("w")?0:"100%",top:ye.includes("n")?0:"100%",transform:"translate(-50%, -50%)",cursor:We[ye],pointerEvents:"auto"},onMouseDown:ft=>o1(ft,ye,we,Po)},ye)})]}),s.jsx(Qae,{groups:_t,nodes:De,view:rs,selectedGroupId:Tt,onGroupSelect:St,isDark:Cr,onGroupResize:qb}),s.jsx(noe,{groups:_t,nodes:De,view:rs,selectedGroupId:Tt,onGroupNameChange:eg,onGroupColorChange:uc,onGroupDelete:i2,onGroupExecute:Gb,onGroupDragStart:sg,onGroupExportWorkflow:Bb,isDark:Cr,onTogglePreviewCollapsed:tg},`group-toolbar-${Cr?"dark":"light"}`),_n?(()=>{const ye=De.find(Rt=>Rt.id===_n);if(!ye)return null;const We=ye.x+(ye.width||320)/2,ft=ye.y+(ye.height||200)/2,Mt=Math.max(140,Math.min(600,Math.max(ye.width||320,ye.height||200)*1.35));return s.jsx("div",{className:"node-focus-ripple",style:{left:We,top:ft,width:Mt,height:Mt,zIndex:80,transform:"translate(-50%, -50%)"}},`node-focus-ripple-${_n}-${Kn}`)})():null,s.jsx(loe,{view:rs,nodes:De,groups:_t,selectedNodeIds:Vt,isSelecting:P,showCollectionPopup:kr,compactModeEnabledForSelection:Vt.size>0&&Array.from(Vt).every(ye=>sr.has(ye)),onToggleCompactModeForSelection:bn,onCollect:(ye,We,ft)=>{Lb(ye,We,ft)},onExpand:wf,onClearSelection:()=>{Zt(new Set),dn(null),Rr(!1)},updateCollectionPosition:s2,isDark:Cr}),(()=>{const ye=A.find(Dt=>Dt.id===be);if(!ye||le)return null;const We=ye.x,ft=ye.y-56,Mt=[14,16,18,20,24,28,32,40,48,56,64,72],Rt=Mt.reduce((Dt,Xt)=>Math.abs(Xt-ye.fontSize)Dt.stopPropagation(),onClick:Dt=>Dt.stopPropagation(),children:[s.jsx("select",{value:Rt,onChange:Dt=>{const Xt=Number(Dt.target.value);O(xn=>xn.map(on=>on.id===be?{...on,fontSize:Xt}:on))},className:`text-sm rounded-md px-1.5 py-1 border outline-none ${Cr?"bg-zinc-800 border-zinc-700":"bg-white border-zinc-300"}`,children:Mt.map(Dt=>s.jsx("option",{value:Dt,children:Dt},Dt))}),s.jsxs("select",{value:sn,onChange:Dt=>{const Xt=Dt.target.value;O(xn=>xn.map(on=>on.id===be?{...on,fontFamily:Xt}:on))},className:`text-sm rounded-md px-1.5 py-1 border outline-none ${Cr?"bg-zinc-800 border-zinc-700":"bg-white border-zinc-300"}`,title:"字体",children:[s.jsx("option",{value:"sans",children:"无衬线"}),s.jsx("option",{value:"serif",children:"衬线"}),s.jsx("option",{value:"mono",children:"等宽"}),s.jsx("option",{value:"script",children:"手写"})]}),s.jsx("input",{type:"color",value:ye.color,onChange:Dt=>{const Xt=Dt.target.value;O(xn=>xn.map(on=>on.id===be?{...on,color:Xt}:on))},className:"w-8 h-8 p-0 border-0 bg-transparent cursor-pointer","data-tip":"颜色"}),s.jsx("button",{className:`w-8 h-8 rounded-md text-base font-bold ${ye.bold?Cr?"bg-zinc-700":"bg-zinc-300":""}`,onClick:()=>O(Dt=>Dt.map(Xt=>Xt.id===be?{...Xt,bold:!Xt.bold}:Xt)),"data-tip":"粗体",children:"B"}),s.jsx("button",{className:`w-8 h-8 rounded-md text-base italic ${ye.italic?Cr?"bg-zinc-700":"bg-zinc-300":""}`,onClick:()=>O(Dt=>Dt.map(Xt=>Xt.id===be?{...Xt,italic:!Xt.italic}:Xt)),"data-tip":"斜体",children:"I"}),s.jsx("button",{className:`w-8 h-8 rounded-md text-base underline ${ye.underline?Cr?"bg-zinc-700":"bg-zinc-300":""}`,onClick:()=>O(Dt=>Dt.map(Xt=>Xt.id===be?{...Xt,underline:!Xt.underline}:Xt)),"data-tip":"下划线",children:"U"}),s.jsx("button",{className:`w-8 h-8 rounded-md text-base line-through ${ye.strike?Cr?"bg-zinc-700":"bg-zinc-300":""}`,onClick:()=>O(Dt=>Dt.map(Xt=>Xt.id===be?{...Xt,strike:!Xt.strike}:Xt)),"data-tip":"删除线",children:"S"}),s.jsx("button",{className:`w-8 h-8 rounded-md text-sm ${ye.align==="left"?Cr?"bg-zinc-700":"bg-zinc-300":""}`,onClick:()=>O(Dt=>Dt.map(Xt=>Xt.id===be?{...Xt,align:"left"}:Xt)),"data-tip":"左对齐",children:"左"}),s.jsx("button",{className:`w-8 h-8 rounded-md text-sm ${ye.align==="center"?Cr?"bg-zinc-700":"bg-zinc-300":""}`,onClick:()=>O(Dt=>Dt.map(Xt=>Xt.id===be?{...Xt,align:"center"}:Xt)),"data-tip":"居中",children:"中"}),s.jsx("button",{className:`w-8 h-8 rounded-md text-sm ${ye.align==="right"?Cr?"bg-zinc-700":"bg-zinc-300":""}`,onClick:()=>O(Dt=>Dt.map(Xt=>Xt.id===be?{...Xt,align:"right"}:Xt)),"data-tip":"右对齐",children:"右"})]})})(),A.map(ye=>{var sn;const We=le===ye.id,ft=$e===ye.id,Mt=((sn=ke.current)==null?void 0:sn.id)===ye.id,Rt=We||ft||Mt;return s.jsx("div",{className:`absolute z-[9] rounded-sm ${Rt?"border":"border border-transparent"} ${Cr?Rt?"border-white/50 bg-black/10":"bg-transparent":Rt?"border-black/60 bg-black/5":"bg-transparent"}`,style:{left:ye.x,top:ye.y,width:ye.width,height:ye.height},onMouseEnter:()=>ze(ye.id),onMouseLeave:()=>ze(Dt=>Dt===ye.id?null:Dt),onMouseDown:Dt=>{Dt.button===0&&(Dt.preventDefault(),Dt.stopPropagation(),de(ye.id),le!==ye.id&&(ke.current={id:ye.id,startClientX:Dt.clientX,startClientY:Dt.clientY,startX:ye.x,startY:ye.y},Ee(!0)))},onClick:Dt=>{Dt.stopPropagation(),de(ye.id)},onDoubleClick:Dt=>{Dt.stopPropagation(),de(ye.id),fe(ye.id)},children:We?s.jsx("textarea",{"data-canvas-text-id":ye.id,value:ye.text,onChange:Dt=>{const Xt=Dt.target.value;O(xn=>xn.map(on=>on.id===ye.id?{...on,text:Xt}:on))},onBlur:()=>fe(null),className:`canvas-text-input-cursor canvas-text-editor-minimal w-full h-full resize-none bg-transparent border-0 shadow-none px-2 py-1.5 text-[14px] leading-[1.15] outline-none ${Cr?"text-zinc-100 placeholder-zinc-500":"text-zinc-900 placeholder-zinc-500"}`,placeholder:"输入文本...",style:{fontSize:`${ye.fontSize}px`,fontFamily:nI(ye.fontFamily),color:ye.color,fontWeight:ye.bold?700:400,fontStyle:ye.italic?"italic":"normal",textDecoration:`${ye.underline?"underline":""} ${ye.strike?"line-through":""}`.trim()||"none",textAlign:ye.align}}):s.jsx("div",{className:`w-full h-full px-2 py-1.5 leading-[1.15] whitespace-pre-wrap break-words overflow-hidden select-text ${Cr?"text-zinc-100":"text-zinc-900"}`,style:{fontSize:`${ye.fontSize}px`,fontFamily:nI(ye.fontFamily),color:ye.color,fontWeight:ye.bold?700:400,fontStyle:ye.italic?"italic":"normal",textDecoration:`${ye.underline?"underline":""} ${ye.strike?"line-through":""}`.trim()||"none",textAlign:ye.align},children:ye.text||""})},ye.id)}),It&&sr.size>0&&(()=>{const ye={nw:"nwse-resize",ne:"nesw-resize",sw:"nesw-resize",se:"nwse-resize"};return s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"absolute rounded-lg pointer-events-none",style:{left:It.minX,top:It.minY,width:Math.max(0,It.maxX-It.minX),height:Math.max(0,It.maxY-It.minY),zIndex:6,border:Cr?"1px solid rgba(255,255,255,0.18)":"1px solid rgba(59,130,246,0.35)",background:Cr?"rgba(255,255,255,0.03)":"rgba(59,130,246,0.05)",boxShadow:Cr?"0 0 0 1px rgba(255,255,255,0.04) inset":"0 0 0 1px rgba(59,130,246,0.05) inset"}}),s.jsxs("div",{className:"absolute flex items-center gap-1 z-[7]",style:{left:It.minX,top:It.minY-24},children:[s.jsx("input",{type:"text",value:cn,onChange:We=>zn(We.target.value),placeholder:"标签",className:`bg-transparent border-0 text-xs focus:outline-none focus:ring-0 min-w-[48px] max-w-[120px] placeholder:opacity-60 ${Cr?"text-white placeholder:text-white/60":"text-gray-900 placeholder:text-gray-500"}`,onClick:We=>We.stopPropagation(),onMouseDown:We=>We.stopPropagation(),onPointerDown:We=>We.stopPropagation()}),s.jsx("button",{type:"button",onClick:We=>{We.stopPropagation(),bn(Array.from(sr),!1)},className:`p-0.5 rounded hover:opacity-80 ${Cr?"text-white/70 hover:text-white":"text-gray-600 hover:text-gray-900"}`,title:"退出简洁模式","aria-label":"退出简洁模式",children:s.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:s.jsx("path",{d:"M18 6L6 18M6 6l12 12"})})})]}),["nw","ne","sw","se"].map(We=>s.jsx("div",{className:"absolute w-4 h-4 z-[8] cursor-pointer pointer-events-auto flex items-center justify-center",style:{left:(We.includes("w")?It.minX:It.maxX)-8,top:(We.includes("n")?It.minY:It.maxY)-8,cursor:ye[We]},onMouseDown:ft=>Gh(We,ft),title:"拖拽拉伸",children:s.jsx("div",{className:`w-2.5 h-2.5 rounded-sm shrink-0 ${Cr?"bg-white/60 border border-white/40":"bg-gray-400 border border-gray-500"}`})},We))]})})(),Rn.visible&&Rn.anchorBounds&&s.jsx(dee,{visible:!0,prompt:Rn.prompt,inputImageUrls:Rn.inputImageUrls,onClose:()=>bt(ye=>({...ye,visible:!1})),isDark:Cr,anchorBounds:Rn.anchorBounds,inCanvas:!0}),_a.map(ye=>{var Hn;const We=Ot===ye.id||Vt.has(ye.id),ft=Pa===ye.id||Pa&&Vt.has(ye.id),Mt=Um.has(ye.id),Rt=Fr(ye.id),sn=Mi||Md.has(ye.id)?"low":mf.get(ye.id)||"low",Dt=(Qs==null?void 0:Qs.nodeId)===ye.id&&(Qs==null?void 0:Qs.visible),Xt=_t.some(Nn=>Nn.nodeIds.includes(ye.id)),xn=Md.has(ye.id),on=Mi||((Bc==null?void 0:Bc.current)??!1),Pn=Ed==="hidden"||Ed==="hide-on-pan"&&on,Jn=At?Vm.get(ye.id)??[]:[];return s.jsx(Mae,{node:ye,isSelected:We,isNodeDragging:!!ft,disableNodeDrag:et===ye.id,doodleDrawingNodeId:Ct,isConnected:Mt,isDark:Cr,view:rs,viewportWidth:qs.width,viewportHeight:qs.height,connectingSource:Oa,renderQuality:sn,dataVersion:Qe,isInGroup:Xt,isPreviewCollapsed:xn,hideConnections:At,upstreamNodeNames:Jn,shouldHideBorder:Pn,hasOpenDropdown:(q0==null?void 0:q0.nodeId)===ye.id,onNodeMouseDown:Rt.onMouseDown,onNodeMouseUp:Rt.onMouseUp,onDeleteNode:Rt.onDelete,onStartResize:Rt.onStartResize,onStartConnectFromOutput:Rt.onStartConnectFromOutput,onStartConnectFromInput:Rt.onStartConnectFromInput,onConnectToInput:Rt.onConnectToInput,onConnectToOutput:Rt.onConnectToOutput,setLightboxItem:qn,setLightboxOpen:go,updateNode:Td,onShowConnectionDial:Tb,onHideConnectionDial:Rb,showConnectionDial:Dt,connectionDialOptions:Dt?Qs==null?void 0:Qs.options:void 0,onConnectionDialSelect:n2,children:s.jsx(aue,{node:ye,nodes:De,connections:Ae,isDark:Cr,view:rs,renderQuality:sn,dataVersion:Qe,shouldHideBorder:Pn,apiConfigs:Re,globalApiKey:Ve,jimengSuperResUrl:Xe,jimengSuperResApiKey:qe,apiStatus:Xo,generationTimers:jb,connectingSource:Oa,connectingTarget:Qo,connectingInputType:va,updateNode:Td,setNodes:st,setConnections:nt,setHistory:Ut,generateId:ns,setConnectingSource:$l,setConnectingTarget:fa,setConnectingInputType:bo,setMousePos:La,canvasRef:pn,frameSelectionRef:a0,setFrameContextMenu:Ic,handleGeneratePrompts:ig,handleAutoVideoAnalysis:a2,getConnectedVideoAnalyzeNode:cc,importShotsFromAnalysis:Fb,updateShot:ag,generateSingleShot:Vb,deleteShot:Db,addEmptyShot:Wb,generateFromScript:o2,generateFromScriptForChart:Mo,splitImageToShots:Ua,generateSequenceFromShot:Hb,generateChartBatch:r2,getConnectedInputImages:p0,getConnectedInputItems:qh,getOrderedInputItems:Ab,getConnectedImageForInput:qm,getConnectedTextForInput:Eb,filterJimengModels:qt,chartArtStyles:yd,getConnectedDirectorNodes:Ib,hasMultiImageSource:Gm,characterLibrary:Yo,setCharacterLibrary:Pc,setCharactersOpen:jf,klingSubjectLibrary:Ha,setKlingSubjectsOpen:If,promptLibrary:Va,setPromptLibrary:Rc,promptLibraryCollapsed:Sb,setPromptLibraryCollapsed:Wu,promptLibraryEditorOpen:!!((Hn=ye.settings)!=null&&Hn.promptLibraryEditorOpen),setPromptLibraryEditorOpen:Nn=>{var Er;const hr=typeof Nn=="function"?Nn(!!((Er=ye.settings)!=null&&Er.promptLibraryEditorOpen)):Nn;Zm(ye.id,{promptLibraryEditorOpen:hr})},promptLibraryForm:Ad,setPromptLibraryForm:ff,activeDropdown:q0,setActiveDropdown:Fu,generate:yf,deleteNode:xf,setSelectedNodeId:dn,setInputImageContextMenu:Jl,setPreviewContextMenu:Ac,setLightboxItem:qn,setLightboxOpen:go,setChatFiles:gs,setIsChatOpen:os,onDownloadFile:Tc,isDownloading:ku,downloadProgress:Ko,onDownloadStoryboardVideos:og,setIsCanvasFullscreen:Ql,onDoodleDrawingChange:nn,onSaveToRhLibrary:Nn=>{Zo(hr=>{const Er=hr.find(ar=>ar.webappId===Nn.webappId),as={id:(Er==null?void 0:Er.id)??`rh_app_${Nn.webappId}_${Date.now()}`,type:"app",webappId:Nn.webappId,webappName:Nn.webappName,covers:Nn.covers||[],nodeInfoListTemplate:Nn.nodeInfoListTemplate,rhParamValues:Nn.rhParamValues||{},createdAt:(Er==null?void 0:Er.createdAt)??Date.now()};return Er?hr.map(ar=>ar.webappId===Nn.webappId?as:ar):[...hr,as]}),Pe("已保存到 RH 应用库")},onSaveWorkflowToLibrary:Nn=>{Zo(hr=>{const Er=hr.find(ar=>ar.type==="workflow"&&ar.webappId===Nn.workflowId),as={id:(Er==null?void 0:Er.id)??`rh_workflow_${Nn.workflowId}_${Date.now()}`,type:"workflow",webappId:Nn.workflowId,webappName:Nn.customName||`工作流 ${Nn.workflowId}`,customName:Nn.customName,covers:Nn.covers||[],rhParamValues:Nn.rhComfyParamValues||{},comfyEditableParams:Nn.comfyEditableParams,comfyRawWorkflowJson:Nn.comfyRawWorkflowJson,rhUseOverseas:Nn.rhUseOverseas,rhComfyUploadPreviews:Nn.rhComfyUploadPreviews,createdAt:(Er==null?void 0:Er.createdAt)??Date.now()};return Er?hr.map(ar=>ar.type==="workflow"&&ar.webappId===Nn.workflowId?as:ar):[...hr,as]}),Pe("工作流已保存到 RH AI 应用库")},isCompactMode:sr.has(ye.id),onCompactModeImageClick:kb})},ye.id)}),s.jsx(foe,{croppingNodeId:vl,nodes:De,isDark:Cr})]})]}),Hi&&s.jsx(Xae,{visible:!0,nodeIds:Hi.nodeIds,position:Hi.dialPosition,viewZoom:rs.zoom,viewOffset:{x:rs.x,y:rs.y},isDark:Cr,onStartConnection:Qm,onMouseMove:(ye,We)=>{La({x:ye,y:We})}}),ai&&s.jsx(Yae,{visible:!0,nodeIds:ai.nodeIds,position:ai.dialPosition,viewZoom:rs.zoom,viewOffset:{x:rs.x,y:rs.y},isDark:Cr,onStartConnection:Mb,onMouseMove:(ye,We)=>{La({x:ye,y:We})}}),ae&&s.jsx("div",{ref:pf,className:`absolute pointer-events-none z-50 border ${Cr?"rounded-lg border-white/25 bg-white/10":"rounded-lg border-black/20 bg-black/10"}`,style:{left:Math.min(ae.startX,ae.endX),top:Math.min(ae.startY,ae.endY),width:Math.abs(ae.endX-ae.startX),height:Math.abs(ae.endY-ae.startY)}})]}),s.jsx(d4,{isOpen:Ts,onClose:()=>os(!1),floating:Rd,onSwitchToSidebar:()=>mg(!1),onSwitchToFloating:()=>mg(!0),isDark:Cr,chatWidth:wi,chatFontSize:ki,onSetChatFontSize:gi,chatModel:Ri,chatInput:Ur,chatFiles:$i,chatSessions:jr,currentChatId:_r,isChatSending:Ps,historyMessageCount:Si,onSetChatModel:Ki,onSetChatInput:zs,onSetChatFiles:gs,onSetCurrentChatId:es,onSetHistoryMessageCount:xi,onCreateNewChat:ks,onDeleteChatSession:ea,onDeleteChatMessages:Wa,onRenameChatSession:Pi,onSendChatMessage:_i,onChatResizeStart:ta,apiConfigs:Re,chatSkillMode:li,onSetChatSkillMode:ca,sessionsForCurrentMode:ua,onOpenSkillToWorkflow:ye=>{Ec(ye||""),Da(!0)}})]})]}),s.jsx(fne,{contextMenu:Kl,setContextMenu:Nu,isDark:Cr,addNode:gf,nodes:De,showWatermark:Ht}),s.jsx(mne,{selectionContextMenu:kc,setSelectionContextMenu:qo,isDark:Cr,selectedNodeIds:Vt,selectedNodeId:Ot,handleSaveSelectedWorkflow:s1,nodes:De,isPanning:Mi}),s.jsx(jne,{previewContextMenu:Sd,setPreviewContextMenu:Ac,setCroppingNodeId:Iu,isDark:Cr,nodes:De,view:Ge,selectedNodeIds:Vt,setChatFiles:gs,setIsChatOpen:os,setNodes:st,setConnections:nt,generateId:ns,splitImageToShots:Ua,runExpandImage:Pb,imageConfigs:qt(Re.filter(ye=>ye.type==="Image")),showJimengModels:Tn,history:Et,setHistory:Ut,setLightboxItem:qn,setLightboxOpen:go,toastError:Te,toastSuccess:Pe}),s.jsx(Yie,{inputImageContextMenu:Yl,setInputImageContextMenu:Jl,setCroppingNodeId:Iu,isDark:Cr,nodes:De,selectedNodeIds:Vt,setChatFiles:gs,setIsChatOpen:os,setNodes:st,setConnections:nt,generateId:ns,splitImageToShots:Ua,runExpandImage:Pb,imageConfigs:qt(Re.filter(ye=>ye.type==="Image")),showJimengModels:Tn,setHistory:Ut,setLightboxItem:qn,setLightboxOpen:go,toastError:Te}),s.jsx(vte,{isOpen:Su,onClose:()=>ju(!1),isDark:Cr,history:Et,batchSelectedIds:Vu,onSetBatchSelectedIds:Mf,onSetHistory:Ut,onSetLightboxItem:qn,toastSuccess:Pe,toastError:Te}),s.jsx(BQ,{isOpen:zd,onClose:()=>Da(!1),isDark:Cr,initialText:Cu,apiConfigs:Re,chatModel:Ri,globalApiKey:Ve,onCreateWorkflow:sh,onError:Te}),s.jsx(QO,{isOpen:i0,onClose:()=>$d(!1),isDark:Cr,authMode:Lt,onAuthenticate:gt,watermarkHidden:!Ht,onToggleWatermark:()=>{Wt(),Pe(`水印${Ht?"已隐藏":"已显示"}`)},jimengModelsHidden:!Tn,onToggleJimengModels:()=>{Jt(),Pt(),Pe(`画画模型${Tn?"已隐藏":"已显示"}`)},geminiImageOfficialHidden:!fn,onToggleGeminiImageOfficial:()=>{Bt(),Pe(`Gemini 官方生图视频模型${fn?"已隐藏":"已显示"}`)},grsaiModelsHidden:!Dn,onToggleGrsaiModels:()=>{zt(),Pe(`Grsai Nano Banana${Dn?"已隐藏":"已显示"}`)},seedanceHiddenFeaturesHidden:!it,onToggleSeedanceHiddenFeatures:()=>{Gt(),Pe(`Seedance 角色库与恶龙逗勇者 Official${it?"已隐藏":"已显示"}`)}}),s.jsx(_te,{isOpen:_d,onClose:()=>$u(!1),isDark:Cr,history:Et,apiConfigs:Re,globalApiKey:Ve,onSetCharacterLibrary:Pc}),s.jsx(Gte,{isOpen:y0,onClose:()=>tp(!1),isDark:Cr,history:Et,apiConfigs:Re,globalApiKey:Ve,chatModel:Ri,onSetChatModel:Ki,onSetKlingSubjectLibrary:tc,klingSubjectLibrary:Ha,onShowToast:(ye,We)=>{ye==="success"?Pe(We):ye==="error"||ye==="warning"?Te(We):ye==="info"&&Pe(We)}}),s.jsx(t4,{isOpen:Nc,onClose:()=>Io(!1),isDark:Cr,apiConfigs:Re,globalApiKey:Ve,globalBaseUrl:Ze,activeEndpoint:je,jimengUseLocalFile:Le,apiTesting:Nd,apiStatus:Xo,showBaseUrl:un,filterJimengModels:qt,jimengModelsHidden:!Tn,onSetGlobalApiKey:pt,onSetGlobalBaseUrl:ht,onSetJimengUseLocalFile:jt,onSetJimengSessionId:$t,jimengSuperResUrl:Xe,jimengSuperResApiKey:qe,onSetJimengSuperResUrl:Nt,onSetJimengSuperResApiKey:Yt,onTestJimengSuperResConnection:ec,onUpdateConfig:Ye,onUpdateConfigs:ct,onTestApiConnection:eo,onSwitchEndpoint:wt,getEndpoints:tt}),s.jsx(wte,{isOpen:_u,onClose:()=>zu(!1),isDark:Cr,nodes:De,history:Et,onSetHistory:Ut,autosaveEnabled:Fs.enabled,autosaveIntervalMinutes:Fs.intervalMinutes,onAutoSaveConfigChange:(ye,We)=>{gZ(ye,We),wl({enabled:ye,intervalMinutes:We})},onSaveNow:vg,onImportAutoSaveJson:_0}),s.jsx(ZO,{isOpen:xg,onClose:()=>pc(!1),isDark:Cr,nodes:De,connections:Ae,groups:_t,canvasTextBoxes:A,canvasDoodleStrokes:F,projectName:Ma,history:Et,selectedNodeIds:Vt,chatSessions:jr,characterLibrary:Yo,view:Ge,viewportSize:qs,setNodes:st,setConnections:nt,setHistory:Ut,setChatSessions:Br,setCharacterLibrary:Pc,setGroups:xt,setView:at,setProjectName:Os,setCanvasTextBoxes:O,setCanvasDoodleStrokes:L}),s.jsx(Nne,{historyContextMenu:Gs,setHistoryContextMenu:Xl,isDark:Cr,nodes:De,view:Ge,selectedNodeId:Ot,activeShot:Tu,canvasRef:pn,setChatFiles:gs,setIsChatOpen:os,setNodes:st,updateShot:ag,generateId:ns,splitImageToShots:Ua,toastSuccess:Pe,toastError:Te}),s.jsx(gne,{frameContextMenu:Eu,setFrameContextMenu:Ic,isDark:Cr,nodes:De,view:Ge,selectedNodeId:Ot,setChatFiles:gs,setIsChatOpen:os,setNodes:st,updateNode:Td,generateId:ns}),l1&&Ni.createPortal(s.jsx(VQ,{item:l1,onClose:pg,onNavigate:oh,onSendToCanvas:t1,isCanvasFullscreen:o0,canvasContainerRef:xo}),document.body),s.jsx(n9,{toasts:Ie,onClose:Je,isDark:e==="dark"}),s.jsx(QQ,{isDark:e==="dark",isHidden:!Ht}),s.jsx(ZQ,{isDark:e==="dark"}),s.jsx(uee,{isDark:e==="dark",onAlign:Ke,visible:Tf,onVisibleChange:Hu}),s.jsx(pee,{totalNodes:De.length,visibleNodesCount:Hh.length,nodeQualityMap:mf,isDark:e==="dark",lightboxOpen:Aa})]})}class aI extends _.Component{constructor(n){super(n);Mn(this,"handleReload",()=>{window.location.reload()});Mn(this,"handleReset",()=>{this.setState({hasError:!1,error:null,errorInfo:null})});this.state={hasError:!1,error:null,errorInfo:null}}static getDerivedStateFromError(n){return{hasError:!0}}componentDidCatch(n,r){console.error("[ErrorBoundary] Caught error:",n,r),this.setState({error:n,errorInfo:r})}render(){return this.state.hasError?s.jsx("div",{className:"w-full h-screen flex items-center justify-center bg-zinc-900 text-white",children:s.jsxs("div",{className:"max-w-2xl p-8 bg-zinc-800 rounded-lg border border-zinc-700",children:[s.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[s.jsx("svg",{className:"w-8 h-8 text-red-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:s.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"})}),s.jsx("h1",{className:"text-2xl font-bold",children:"应用出现错误"})]}),s.jsx("p",{className:"text-zinc-300 mb-4",children:"应用遇到了一个意外错误。您可以尝试重新加载页面,或者联系技术支持。"}),this.state.error&&s.jsxs("details",{className:"mb-4 p-4 bg-zinc-900 rounded border border-zinc-700",children:[s.jsx("summary",{className:"cursor-pointer text-sm font-medium mb-2",children:"错误详情"}),s.jsxs("div",{className:"text-xs text-red-400 font-mono whitespace-pre-wrap",children:[this.state.error.toString(),this.state.errorInfo&&s.jsx("div",{className:"mt-2 text-zinc-400",children:this.state.errorInfo.componentStack})]})]}),s.jsxs("div",{className:"flex gap-3",children:[s.jsx("button",{onClick:this.handleReload,className:"px-4 py-2 bg-blue-600 hover:bg-blue-700 rounded transition-colors",children:"重新加载页面"}),s.jsx("button",{onClick:this.handleReset,className:"px-4 py-2 bg-zinc-700 hover:bg-zinc-600 rounded transition-colors",children:"尝试恢复"})]})]})}):this.props.children}}(function(){const e=console.error,t=console.warn,n=console.log,r=l=>{if(typeof l=="string")return l;if(l&&typeof l=="object"){if(l.message)return l.message;if(typeof l.toString=="function")return l.toString()}return String(l)},i=l=>{const c=l.map(r).join(" ");if(c.includes("Unable to preventDefault inside passive event listener")||c.includes("passive event listener invocation")||c.includes("preventDefault")&&c.includes("passive"))return!0;for(const d of l){let h=r(d);if(h.includes("blob:http")&&(h.includes("ERR_FILE_NOT_FOUND")||h.includes("Failed to fetch")||h.includes("net::ERR"))||h.includes("[AssetStore]")||h.includes("[useAssetCache]")||h.includes("127.0.0.1:9527")||h.includes("127.0.0.1:9528")||h.includes("localhost:9527")||h.includes("localhost:9528")||h.includes("ERR_CONNECTION_REFUSED")||h.includes("checkLocalCacheServer")||h.includes("[LocalCache]")||h.includes("/ping")||h.includes("404")&&h.includes("ping")||h.includes("CORS policy")||h.includes("Access-Control-Allow-Origin")||h.includes("has been blocked by CORS")||h.includes("Access to fetch at")||h.includes("prod-ss-vidu")||h.includes("amazonaws.com.cn")&&h.includes("infer/tasks")||h.includes("net::ERR_FAILED")&&(h.includes("prod-ss-vidu")||h.includes("amazonaws.com.cn"))||(h.includes("[downloadUrlToLocal]")||h.includes("[downloadAndGetLocalUrl]"))&&(h.includes("Failed to fetch")||h.includes("处理失败")||h.includes("下载失败"))||h.includes("Internal React error")||h.includes("Expected static flag was missing")||h.includes("Warning: Maximum update depth exceeded")||h.includes("localAssetManager")||h.includes("auto-download"))return!0}return!1},a=l=>{const c=l.map(u=>typeof u=="string"?u:String(u)).join(" ");return!!(c.includes("[Performance]")&&(c.includes("Preset changed")||c.includes("Config updated")||c.includes("Config reset")||c.includes("Global API")||c.includes("Available presets")||c.includes("Current preset"))||c.includes("[ConnectionLineOptimizer]")&&(c.includes("Connection animations")||c.includes("Network monitoring")||c.includes("Network busy")||c.includes("Network idle")||c.includes("Auto preset")||c.includes("User manual preset")||c.includes("skipping auto switch")||c.includes("isBusy"))||c.includes("[NodeRenderOptimizer]")||c.includes("[PerformanceOptimizationManager]")&&(c.includes("Node render state changed")||c.includes("Quality level")||c.includes("Node content")))};console.error=function(...l){i(l)||e.apply(console,l)},console.warn=function(...l){i(l)||t.apply(console,l)},console.log=function(...l){a(l)||n.apply(console,l)},window.addEventListener("error",l=>{const c=l.target;if(c&&(c.tagName==="IMG"||c.tagName==="VIDEO")&&(c.src||"").startsWith("blob:"))return l.preventDefault(),l.stopPropagation(),!1},!0);const o=window.fetch;window.fetch=function(...l){var u;const c=typeof l[0]=="string"?l[0]:((u=l[0])==null?void 0:u.url)??"";return c.includes("127.0.0.1:9527")||c.includes("127.0.0.1:9528")||c.includes("localhost:9527")||c.includes("localhost:9528")?o.apply(this,l).catch(d=>{throw d}):o.apply(this,l)}})();try{window.__LINGOAPP_RENDERED__=!0;const e=document.querySelector(".art-status");e&&(e.textContent="[JS已执行]");const t=document.getElementById("root");t?JS.createRoot(t).render(s.jsx(fr.StrictMode,{children:s.jsx(aI,{children:s.jsx(iI,{})})})):window.addEventListener("DOMContentLoaded",()=>{try{window.__LINGOAPP_RENDERED__=!0;const n=document.querySelector(".art-status");n&&(n.textContent="[JS已执行]");const r=document.getElementById("root");if(!r)return;JS.createRoot(r).render(s.jsx(fr.StrictMode,{children:s.jsx(aI,{children:s.jsx(iI,{})})}))}catch(n){console.error("[main] DOMContentLoaded render failed:",n);const r=document.querySelector(".art-status");r&&(r.textContent="[启动失败] See console")}},{once:!0})}catch(e){console.error("[main] Startup render failed:",e);const t=document.querySelector(".art-status");t&&(t.textContent="[启动失败] See console")}async function Cue(e){try{const t=await yn("download_file_bypass_cors",{url:e}),n=new Uint8Array(t);return new Blob([n])}catch(t){throw t}}async function Nue(e,t=6e4){if(e.startsWith("http://")||e.startsWith("https://"))try{return await Cue(e)}catch{}const n=new AbortController,r=setTimeout(()=>n.abort(),t);try{const i=await fetch(e,{mode:"cors",signal:n.signal,credentials:"omit",cache:"default"});if(clearTimeout(r),!i.ok)throw new Error(`HTTP ${i.status}: ${i.statusText}`);return await i.blob()}catch(i){throw clearTimeout(r),i}}const n0=Object.freeze(Object.defineProperty({__proto__:null,downloadWithFallback:Nue},Symbol.toStringTag,{value:"Module"}));function Eue(e,t,n,r=.05,i=!0){let a=e,o=t,l=0,c=0;if(i){const p=Math.max(e,t);a=p,o=p,l=(p-e)/2,c=(p-t)/2,console.log("[MarkerMask] 调整为正方形:",{original:`${e}×${t}`,square:`${a}×${o}`,offset:`(${l}, ${c})`})}const u=document.createElement("canvas");u.width=a,u.height=o;const d=u.getContext("2d");if(!d)throw new Error("无法创建Canvas上下文");d.fillStyle="black",d.fillRect(0,0,a,o),d.fillStyle="white",console.log("[MarkerMask] 开始生成蒙版:",{canvasSize:`${a}×${o}`,imageSize:`${e}×${t}`,markerCount:n.length});for(const p of n){const f=p.x*e+l,b=p.y*t+c,g=(p.radius||r)*Math.min(e,t);console.log("[MarkerMask] 绘制标记点:",{label:p.label,relativePos:`(${(p.x*100).toFixed(1)}%, ${(p.y*100).toFixed(1)}%)`,absolutePos:`(${Math.round(f)}, ${Math.round(b)})`,radius:Math.round(g)}),d.beginPath(),d.arc(f,b,g,0,Math.PI*2),d.fill()}const h=u.toDataURL("image/png").split(",")[1];return console.log("[MarkerMask] ✅ 蒙版生成完成:",{size:`${a}×${o}`,dataSize:`${(h.length/1024).toFixed(2)} KB`}),h}function Iue(e,t,n){const{buildMarkerPrompt:r}=require("../services/geminiMarkerService");return r(e,t,n,"zh")}function kue(e,t="image/png"){const n=atob(e),r=new ArrayBuffer(n.length),i=new Uint8Array(r);for(let a=0;a{const r=new Image,i=URL.createObjectURL(e);r.onload=()=>{const a=Math.max(r.width,r.height),o=document.createElement("canvas");o.width=a,o.height=a;const l=o.getContext("2d");if(!l){n(new Error("无法创建Canvas上下文"));return}l.fillStyle="black",l.fillRect(0,0,a,a);const c=(a-r.width)/2,u=(a-r.height)/2;l.drawImage(r,c,u),o.toBlob(d=>{URL.revokeObjectURL(i),d?(console.log("[MarkerMask] 图片已转换为正方形:",{original:`${r.width}×${r.height}`,square:`${a}×${a}`}),t(d)):n(new Error("转换为Blob失败"))},"image/png")},r.onerror=()=>{URL.revokeObjectURL(i),n(new Error("加载图片失败"))},r.src=i})}const yv=Object.freeze(Object.defineProperty({__proto__:null,base64ToBlob:kue,buildMarkerPrompt:Iue,generateMarkerMask:Eue,makeImageSquare:Aue},Symbol.toStringTag,{value:"Module"}));var y_={exports:{}};/*! + +JSZip v3.10.1 - A JavaScript class for generating and reading zip files + + +(c) 2009-2016 Stuart Knightley +Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/main/LICENSE.markdown. + +JSZip uses the library pako released under the MIT license : +https://github.com/nodeca/pako/blob/main/LICENSE +*/var oI;function Mue(){return oI||(oI=1,(function(e,t){(function(n){e.exports=n()})(function(){return(function n(r,i,a){function o(u,d){if(!i[u]){if(!r[u]){var h=typeof Qg=="function"&&Qg;if(!d&&h)return h(u,!0);if(l)return l(u,!0);var p=new Error("Cannot find module '"+u+"'");throw p.code="MODULE_NOT_FOUND",p}var f=i[u]={exports:{}};r[u][0].call(f.exports,function(b){var g=r[u][1][b];return o(g||b)},f,f.exports,n,r,i,a)}return i[u].exports}for(var l=typeof Qg=="function"&&Qg,c=0;c>2,f=(3&u)<<4|d>>4,b=1>6:64,g=2>4,d=(15&p)<<4|(f=l.indexOf(c.charAt(g++)))>>2,h=(3&f)<<6|(b=l.indexOf(c.charAt(g++))),v[y++]=u,f!==64&&(v[y++]=d),b!==64&&(v[y++]=h);return v}},{"./support":30,"./utils":32}],2:[function(n,r,i){var a=n("./external"),o=n("./stream/DataWorker"),l=n("./stream/Crc32Probe"),c=n("./stream/DataLengthProbe");function u(d,h,p,f,b){this.compressedSize=d,this.uncompressedSize=h,this.crc32=p,this.compression=f,this.compressedContent=b}u.prototype={getContentWorker:function(){var d=new o(a.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new c("data_length")),h=this;return d.on("end",function(){if(this.streamInfo.data_length!==h.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")}),d},getCompressedWorker:function(){return new o(a.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},u.createWorkerFrom=function(d,h,p){return d.pipe(new l).pipe(new c("uncompressedSize")).pipe(h.compressWorker(p)).pipe(new c("compressedSize")).withStreamInfo("compression",h)},r.exports=u},{"./external":6,"./stream/Crc32Probe":25,"./stream/DataLengthProbe":26,"./stream/DataWorker":27}],3:[function(n,r,i){var a=n("./stream/GenericWorker");i.STORE={magic:"\0\0",compressWorker:function(){return new a("STORE compression")},uncompressWorker:function(){return new a("STORE decompression")}},i.DEFLATE=n("./flate")},{"./flate":7,"./stream/GenericWorker":28}],4:[function(n,r,i){var a=n("./utils"),o=(function(){for(var l,c=[],u=0;u<256;u++){l=u;for(var d=0;d<8;d++)l=1&l?3988292384^l>>>1:l>>>1;c[u]=l}return c})();r.exports=function(l,c){return l!==void 0&&l.length?a.getTypeOf(l)!=="string"?(function(u,d,h,p){var f=o,b=p+h;u^=-1;for(var g=p;g>>8^f[255&(u^d[g])];return-1^u})(0|c,l,l.length,0):(function(u,d,h,p){var f=o,b=p+h;u^=-1;for(var g=p;g>>8^f[255&(u^d.charCodeAt(g))];return-1^u})(0|c,l,l.length,0):0}},{"./utils":32}],5:[function(n,r,i){i.base64=!1,i.binary=!1,i.dir=!1,i.createFolders=!0,i.date=null,i.compression=null,i.compressionOptions=null,i.comment=null,i.unixPermissions=null,i.dosPermissions=null},{}],6:[function(n,r,i){var a=null;a=typeof Promise<"u"?Promise:n("lie"),r.exports={Promise:a}},{lie:37}],7:[function(n,r,i){var a=typeof Uint8Array<"u"&&typeof Uint16Array<"u"&&typeof Uint32Array<"u",o=n("pako"),l=n("./utils"),c=n("./stream/GenericWorker"),u=a?"uint8array":"array";function d(h,p){c.call(this,"FlateWorker/"+h),this._pako=null,this._pakoAction=h,this._pakoOptions=p,this.meta={}}i.magic="\b\0",l.inherits(d,c),d.prototype.processChunk=function(h){this.meta=h.meta,this._pako===null&&this._createPako(),this._pako.push(l.transformTo(u,h.data),!1)},d.prototype.flush=function(){c.prototype.flush.call(this),this._pako===null&&this._createPako(),this._pako.push([],!0)},d.prototype.cleanUp=function(){c.prototype.cleanUp.call(this),this._pako=null},d.prototype._createPako=function(){this._pako=new o[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var h=this;this._pako.onData=function(p){h.push({data:p,meta:h.meta})}},i.compressWorker=function(h){return new d("Deflate",h)},i.uncompressWorker=function(){return new d("Inflate",{})}},{"./stream/GenericWorker":28,"./utils":32,pako:38}],8:[function(n,r,i){function a(f,b){var g,y="";for(g=0;g>>=8;return y}function o(f,b,g,y,w,v){var m,z,C=f.file,E=f.compression,I=v!==u.utf8encode,R=l.transformTo("string",v(C.name)),A=l.transformTo("string",u.utf8encode(C.name)),O=C.comment,F=l.transformTo("string",v(O)),L=l.transformTo("string",u.utf8encode(O)),X=A.length!==C.name.length,T=L.length!==O.length,q="",H="",J="",Z=C.dir,B=C.date,V={crc32:0,compressedSize:0,uncompressedSize:0};b&&!g||(V.crc32=f.crc32,V.compressedSize=f.compressedSize,V.uncompressedSize=f.uncompressedSize);var N=0;b&&(N|=8),I||!X&&!T||(N|=2048);var j=0,k=0;Z&&(j|=16),w==="UNIX"?(k=798,j|=(function(M,Y){var se=M;return M||(se=Y?16893:33204),(65535&se)<<16})(C.unixPermissions,Z)):(k=20,j|=(function(M){return 63&(M||0)})(C.dosPermissions)),m=B.getUTCHours(),m<<=6,m|=B.getUTCMinutes(),m<<=5,m|=B.getUTCSeconds()/2,z=B.getUTCFullYear()-1980,z<<=4,z|=B.getUTCMonth()+1,z<<=5,z|=B.getUTCDate(),X&&(H=a(1,1)+a(d(R),4)+A,q+="up"+a(H.length,2)+H),T&&(J=a(1,1)+a(d(F),4)+L,q+="uc"+a(J.length,2)+J);var W="";return W+=` +\0`,W+=a(N,2),W+=E.magic,W+=a(m,2),W+=a(z,2),W+=a(V.crc32,4),W+=a(V.compressedSize,4),W+=a(V.uncompressedSize,4),W+=a(R.length,2),W+=a(q.length,2),{fileRecord:h.LOCAL_FILE_HEADER+W+R+q,dirRecord:h.CENTRAL_FILE_HEADER+a(k,2)+W+a(F.length,2)+"\0\0\0\0"+a(j,4)+a(y,4)+R+q+F}}var l=n("../utils"),c=n("../stream/GenericWorker"),u=n("../utf8"),d=n("../crc32"),h=n("../signature");function p(f,b,g,y){c.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=b,this.zipPlatform=g,this.encodeFileName=y,this.streamFiles=f,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}l.inherits(p,c),p.prototype.push=function(f){var b=f.meta.percent||0,g=this.entriesCount,y=this._sources.length;this.accumulate?this.contentBuffer.push(f):(this.bytesWritten+=f.data.length,c.prototype.push.call(this,{data:f.data,meta:{currentFile:this.currentFile,percent:g?(b+100*(g-y-1))/g:100}}))},p.prototype.openedSource=function(f){this.currentSourceOffset=this.bytesWritten,this.currentFile=f.file.name;var b=this.streamFiles&&!f.file.dir;if(b){var g=o(f,b,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:g.fileRecord,meta:{percent:0}})}else this.accumulate=!0},p.prototype.closedSource=function(f){this.accumulate=!1;var b=this.streamFiles&&!f.file.dir,g=o(f,b,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(g.dirRecord),b)this.push({data:(function(y){return h.DATA_DESCRIPTOR+a(y.crc32,4)+a(y.compressedSize,4)+a(y.uncompressedSize,4)})(f),meta:{percent:100}});else for(this.push({data:g.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},p.prototype.flush=function(){for(var f=this.bytesWritten,b=0;b=this.index;c--)u=(u<<8)+this.byteAt(c);return this.index+=l,u},readString:function(l){return a.transformTo("string",this.readData(l))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var l=this.readInt(4);return new Date(Date.UTC(1980+(l>>25&127),(l>>21&15)-1,l>>16&31,l>>11&31,l>>5&63,(31&l)<<1))}},r.exports=o},{"../utils":32}],19:[function(n,r,i){var a=n("./Uint8ArrayReader");function o(l){a.call(this,l)}n("../utils").inherits(o,a),o.prototype.readData=function(l){this.checkOffset(l);var c=this.data.slice(this.zero+this.index,this.zero+this.index+l);return this.index+=l,c},r.exports=o},{"../utils":32,"./Uint8ArrayReader":21}],20:[function(n,r,i){var a=n("./DataReader");function o(l){a.call(this,l)}n("../utils").inherits(o,a),o.prototype.byteAt=function(l){return this.data.charCodeAt(this.zero+l)},o.prototype.lastIndexOfSignature=function(l){return this.data.lastIndexOf(l)-this.zero},o.prototype.readAndCheckSignature=function(l){return l===this.readData(4)},o.prototype.readData=function(l){this.checkOffset(l);var c=this.data.slice(this.zero+this.index,this.zero+this.index+l);return this.index+=l,c},r.exports=o},{"../utils":32,"./DataReader":18}],21:[function(n,r,i){var a=n("./ArrayReader");function o(l){a.call(this,l)}n("../utils").inherits(o,a),o.prototype.readData=function(l){if(this.checkOffset(l),l===0)return new Uint8Array(0);var c=this.data.subarray(this.zero+this.index,this.zero+this.index+l);return this.index+=l,c},r.exports=o},{"../utils":32,"./ArrayReader":17}],22:[function(n,r,i){var a=n("../utils"),o=n("../support"),l=n("./ArrayReader"),c=n("./StringReader"),u=n("./NodeBufferReader"),d=n("./Uint8ArrayReader");r.exports=function(h){var p=a.getTypeOf(h);return a.checkSupport(p),p!=="string"||o.uint8array?p==="nodebuffer"?new u(h):o.uint8array?new d(a.transformTo("uint8array",h)):new l(a.transformTo("array",h)):new c(h)}},{"../support":30,"../utils":32,"./ArrayReader":17,"./NodeBufferReader":19,"./StringReader":20,"./Uint8ArrayReader":21}],23:[function(n,r,i){i.LOCAL_FILE_HEADER="PK",i.CENTRAL_FILE_HEADER="PK",i.CENTRAL_DIRECTORY_END="PK",i.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK\x07",i.ZIP64_CENTRAL_DIRECTORY_END="PK",i.DATA_DESCRIPTOR="PK\x07\b"},{}],24:[function(n,r,i){var a=n("./GenericWorker"),o=n("../utils");function l(c){a.call(this,"ConvertWorker to "+c),this.destType=c}o.inherits(l,a),l.prototype.processChunk=function(c){this.push({data:o.transformTo(this.destType,c.data),meta:c.meta})},r.exports=l},{"../utils":32,"./GenericWorker":28}],25:[function(n,r,i){var a=n("./GenericWorker"),o=n("../crc32");function l(){a.call(this,"Crc32Probe"),this.withStreamInfo("crc32",0)}n("../utils").inherits(l,a),l.prototype.processChunk=function(c){this.streamInfo.crc32=o(c.data,this.streamInfo.crc32||0),this.push(c)},r.exports=l},{"../crc32":4,"../utils":32,"./GenericWorker":28}],26:[function(n,r,i){var a=n("../utils"),o=n("./GenericWorker");function l(c){o.call(this,"DataLengthProbe for "+c),this.propName=c,this.withStreamInfo(c,0)}a.inherits(l,o),l.prototype.processChunk=function(c){if(c){var u=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=u+c.data.length}o.prototype.processChunk.call(this,c)},r.exports=l},{"../utils":32,"./GenericWorker":28}],27:[function(n,r,i){var a=n("../utils"),o=n("./GenericWorker");function l(c){o.call(this,"DataWorker");var u=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,c.then(function(d){u.dataIsReady=!0,u.data=d,u.max=d&&d.length||0,u.type=a.getTypeOf(d),u.isPaused||u._tickAndRepeat()},function(d){u.error(d)})}a.inherits(l,o),l.prototype.cleanUp=function(){o.prototype.cleanUp.call(this),this.data=null},l.prototype.resume=function(){return!!o.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,a.delay(this._tickAndRepeat,[],this)),!0)},l.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(a.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},l.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var c=null,u=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case"string":c=this.data.substring(this.index,u);break;case"uint8array":c=this.data.subarray(this.index,u);break;case"array":case"nodebuffer":c=this.data.slice(this.index,u)}return this.index=u,this.push({data:c,meta:{percent:this.max?this.index/this.max*100:0}})},r.exports=l},{"../utils":32,"./GenericWorker":28}],28:[function(n,r,i){function a(o){this.name=o||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}a.prototype={push:function(o){this.emit("data",o)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(o){this.emit("error",o)}return!0},error:function(o){return!this.isFinished&&(this.isPaused?this.generatedError=o:(this.isFinished=!0,this.emit("error",o),this.previous&&this.previous.error(o),this.cleanUp()),!0)},on:function(o,l){return this._listeners[o].push(l),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(o,l){if(this._listeners[o])for(var c=0;c "+o:o}},r.exports=a},{}],29:[function(n,r,i){var a=n("../utils"),o=n("./ConvertWorker"),l=n("./GenericWorker"),c=n("../base64"),u=n("../support"),d=n("../external"),h=null;if(u.nodestream)try{h=n("../nodejs/NodejsStreamOutputAdapter")}catch{}function p(b,g){return new d.Promise(function(y,w){var v=[],m=b._internalType,z=b._outputType,C=b._mimeType;b.on("data",function(E,I){v.push(E),g&&g(I)}).on("error",function(E){v=[],w(E)}).on("end",function(){try{var E=(function(I,R,A){switch(I){case"blob":return a.newBlob(a.transformTo("arraybuffer",R),A);case"base64":return c.encode(R);default:return a.transformTo(I,R)}})(z,(function(I,R){var A,O=0,F=null,L=0;for(A=0;A"u")i.blob=!1;else{var a=new ArrayBuffer(0);try{i.blob=new Blob([a],{type:"application/zip"}).size===0}catch{try{var o=new(self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder);o.append(a),i.blob=o.getBlob("application/zip").size===0}catch{i.blob=!1}}}try{i.nodestream=!!n("readable-stream").Readable}catch{i.nodestream=!1}},{"readable-stream":16}],31:[function(n,r,i){for(var a=n("./utils"),o=n("./support"),l=n("./nodejsUtils"),c=n("./stream/GenericWorker"),u=new Array(256),d=0;d<256;d++)u[d]=252<=d?6:248<=d?5:240<=d?4:224<=d?3:192<=d?2:1;u[254]=u[254]=1;function h(){c.call(this,"utf-8 decode"),this.leftOver=null}function p(){c.call(this,"utf-8 encode")}i.utf8encode=function(f){return o.nodebuffer?l.newBufferFrom(f,"utf-8"):(function(b){var g,y,w,v,m,z=b.length,C=0;for(v=0;v>>6:(y<65536?g[m++]=224|y>>>12:(g[m++]=240|y>>>18,g[m++]=128|y>>>12&63),g[m++]=128|y>>>6&63),g[m++]=128|63&y);return g})(f)},i.utf8decode=function(f){return o.nodebuffer?a.transformTo("nodebuffer",f).toString("utf-8"):(function(b){var g,y,w,v,m=b.length,z=new Array(2*m);for(g=y=0;g>10&1023,z[y++]=56320|1023&w)}return z.length!==y&&(z.subarray?z=z.subarray(0,y):z.length=y),a.applyFromCharCode(z)})(f=a.transformTo(o.uint8array?"uint8array":"array",f))},a.inherits(h,c),h.prototype.processChunk=function(f){var b=a.transformTo(o.uint8array?"uint8array":"array",f.data);if(this.leftOver&&this.leftOver.length){if(o.uint8array){var g=b;(b=new Uint8Array(g.length+this.leftOver.length)).set(this.leftOver,0),b.set(g,this.leftOver.length)}else b=this.leftOver.concat(b);this.leftOver=null}var y=(function(v,m){var z;for((m=m||v.length)>v.length&&(m=v.length),z=m-1;0<=z&&(192&v[z])==128;)z--;return z<0||z===0?m:z+u[v[z]]>m?z:m})(b),w=b;y!==b.length&&(o.uint8array?(w=b.subarray(0,y),this.leftOver=b.subarray(y,b.length)):(w=b.slice(0,y),this.leftOver=b.slice(y,b.length))),this.push({data:i.utf8decode(w),meta:f.meta})},h.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:i.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},i.Utf8DecodeWorker=h,a.inherits(p,c),p.prototype.processChunk=function(f){this.push({data:i.utf8encode(f.data),meta:f.meta})},i.Utf8EncodeWorker=p},{"./nodejsUtils":14,"./stream/GenericWorker":28,"./support":30,"./utils":32}],32:[function(n,r,i){var a=n("./support"),o=n("./base64"),l=n("./nodejsUtils"),c=n("./external");function u(g){return g}function d(g,y){for(var w=0;w>8;this.dir=!!(16&this.externalFileAttributes),f==0&&(this.dosPermissions=63&this.externalFileAttributes),f==3&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||this.fileNameStr.slice(-1)!=="/"||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var f=a(this.extraFields[1].value);this.uncompressedSize===o.MAX_VALUE_32BITS&&(this.uncompressedSize=f.readInt(8)),this.compressedSize===o.MAX_VALUE_32BITS&&(this.compressedSize=f.readInt(8)),this.localHeaderOffset===o.MAX_VALUE_32BITS&&(this.localHeaderOffset=f.readInt(8)),this.diskNumberStart===o.MAX_VALUE_32BITS&&(this.diskNumberStart=f.readInt(4))}},readExtraFields:function(f){var b,g,y,w=f.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});f.index+4>>6:(f<65536?p[y++]=224|f>>>12:(p[y++]=240|f>>>18,p[y++]=128|f>>>12&63),p[y++]=128|f>>>6&63),p[y++]=128|63&f);return p},i.buf2binstring=function(h){return d(h,h.length)},i.binstring2buf=function(h){for(var p=new a.Buf8(h.length),f=0,b=p.length;f>10&1023,v[b++]=56320|1023&g)}return d(v,b)},i.utf8border=function(h,p){var f;for((p=p||h.length)>h.length&&(p=h.length),f=p-1;0<=f&&(192&h[f])==128;)f--;return f<0||f===0?p:f+c[h[f]]>p?f:p}},{"./common":41}],43:[function(n,r,i){r.exports=function(a,o,l,c){for(var u=65535&a|0,d=a>>>16&65535|0,h=0;l!==0;){for(l-=h=2e3>>1:o>>>1;l[c]=o}return l})();r.exports=function(o,l,c,u){var d=a,h=u+c;o^=-1;for(var p=u;p>>8^d[255&(o^l[p])];return-1^o}},{}],46:[function(n,r,i){var a,o=n("../utils/common"),l=n("./trees"),c=n("./adler32"),u=n("./crc32"),d=n("./messages"),h=0,p=4,f=0,b=-2,g=-1,y=4,w=2,v=8,m=9,z=286,C=30,E=19,I=2*z+1,R=15,A=3,O=258,F=O+A+1,L=42,X=113,T=1,q=2,H=3,J=4;function Z(Q,me){return Q.msg=d[me],me}function B(Q){return(Q<<1)-(4Q.avail_out&&(ue=Q.avail_out),ue!==0&&(o.arraySet(Q.output,me.pending_buf,me.pending_out,ue,Q.next_out),Q.next_out+=ue,me.pending_out+=ue,Q.total_out+=ue,Q.avail_out-=ue,me.pending-=ue,me.pending===0&&(me.pending_out=0))}function j(Q,me){l._tr_flush_block(Q,0<=Q.block_start?Q.block_start:-1,Q.strstart-Q.block_start,me),Q.block_start=Q.strstart,N(Q.strm)}function k(Q,me){Q.pending_buf[Q.pending++]=me}function W(Q,me){Q.pending_buf[Q.pending++]=me>>>8&255,Q.pending_buf[Q.pending++]=255&me}function M(Q,me){var ue,U,G=Q.max_chain_length,te=Q.strstart,ge=Q.prev_length,ne=Q.nice_match,le=Q.strstart>Q.w_size-F?Q.strstart-(Q.w_size-F):0,fe=Q.window,be=Q.w_mask,de=Q.prev,$e=Q.strstart+O,ze=fe[te+ge-1],_e=fe[te+ge];Q.prev_length>=Q.good_match&&(G>>=2),ne>Q.lookahead&&(ne=Q.lookahead);do if(fe[(ue=me)+ge]===_e&&fe[ue+ge-1]===ze&&fe[ue]===fe[te]&&fe[++ue]===fe[te+1]){te+=2,ue++;do;while(fe[++te]===fe[++ue]&&fe[++te]===fe[++ue]&&fe[++te]===fe[++ue]&&fe[++te]===fe[++ue]&&fe[++te]===fe[++ue]&&fe[++te]===fe[++ue]&&fe[++te]===fe[++ue]&&fe[++te]===fe[++ue]&&te<$e);if(U=O-($e-te),te=$e-O,gele&&--G!=0);return ge<=Q.lookahead?ge:Q.lookahead}function Y(Q){var me,ue,U,G,te,ge,ne,le,fe,be,de=Q.w_size;do{if(G=Q.window_size-Q.lookahead-Q.strstart,Q.strstart>=de+(de-F)){for(o.arraySet(Q.window,Q.window,de,de,0),Q.match_start-=de,Q.strstart-=de,Q.block_start-=de,me=ue=Q.hash_size;U=Q.head[--me],Q.head[me]=de<=U?U-de:0,--ue;);for(me=ue=de;U=Q.prev[--me],Q.prev[me]=de<=U?U-de:0,--ue;);G+=de}if(Q.strm.avail_in===0)break;if(ge=Q.strm,ne=Q.window,le=Q.strstart+Q.lookahead,fe=G,be=void 0,be=ge.avail_in,fe=A)for(te=Q.strstart-Q.insert,Q.ins_h=Q.window[te],Q.ins_h=(Q.ins_h<=A&&(Q.ins_h=(Q.ins_h<=A)if(U=l._tr_tally(Q,Q.strstart-Q.match_start,Q.match_length-A),Q.lookahead-=Q.match_length,Q.match_length<=Q.max_lazy_match&&Q.lookahead>=A){for(Q.match_length--;Q.strstart++,Q.ins_h=(Q.ins_h<=A&&(Q.ins_h=(Q.ins_h<=A&&Q.match_length<=Q.prev_length){for(G=Q.strstart+Q.lookahead-A,U=l._tr_tally(Q,Q.strstart-1-Q.prev_match,Q.prev_length-A),Q.lookahead-=Q.prev_length-1,Q.prev_length-=2;++Q.strstart<=G&&(Q.ins_h=(Q.ins_h<Q.pending_buf_size-5&&(ue=Q.pending_buf_size-5);;){if(Q.lookahead<=1){if(Y(Q),Q.lookahead===0&&me===h)return T;if(Q.lookahead===0)break}Q.strstart+=Q.lookahead,Q.lookahead=0;var U=Q.block_start+ue;if((Q.strstart===0||Q.strstart>=U)&&(Q.lookahead=Q.strstart-U,Q.strstart=U,j(Q,!1),Q.strm.avail_out===0)||Q.strstart-Q.block_start>=Q.w_size-F&&(j(Q,!1),Q.strm.avail_out===0))return T}return Q.insert=0,me===p?(j(Q,!0),Q.strm.avail_out===0?H:J):(Q.strstart>Q.block_start&&(j(Q,!1),Q.strm.avail_out),T)}),new oe(4,4,8,4,se),new oe(4,5,16,8,se),new oe(4,6,32,32,se),new oe(4,4,16,16,ie),new oe(8,16,32,32,ie),new oe(8,16,128,128,ie),new oe(8,32,128,256,ie),new oe(32,128,258,1024,ie),new oe(32,258,258,4096,ie)],i.deflateInit=function(Q,me){return we(Q,me,v,15,8,0)},i.deflateInit2=we,i.deflateReset=pe,i.deflateResetKeep=ee,i.deflateSetHeader=function(Q,me){return Q&&Q.state?Q.state.wrap!==2?b:(Q.state.gzhead=me,f):b},i.deflate=function(Q,me){var ue,U,G,te;if(!Q||!Q.state||5>8&255),k(U,U.gzhead.time>>16&255),k(U,U.gzhead.time>>24&255),k(U,U.level===9?2:2<=U.strategy||U.level<2?4:0),k(U,255&U.gzhead.os),U.gzhead.extra&&U.gzhead.extra.length&&(k(U,255&U.gzhead.extra.length),k(U,U.gzhead.extra.length>>8&255)),U.gzhead.hcrc&&(Q.adler=u(Q.adler,U.pending_buf,U.pending,0)),U.gzindex=0,U.status=69):(k(U,0),k(U,0),k(U,0),k(U,0),k(U,0),k(U,U.level===9?2:2<=U.strategy||U.level<2?4:0),k(U,3),U.status=X);else{var ge=v+(U.w_bits-8<<4)<<8;ge|=(2<=U.strategy||U.level<2?0:U.level<6?1:U.level===6?2:3)<<6,U.strstart!==0&&(ge|=32),ge+=31-ge%31,U.status=X,W(U,ge),U.strstart!==0&&(W(U,Q.adler>>>16),W(U,65535&Q.adler)),Q.adler=1}if(U.status===69)if(U.gzhead.extra){for(G=U.pending;U.gzindex<(65535&U.gzhead.extra.length)&&(U.pending!==U.pending_buf_size||(U.gzhead.hcrc&&U.pending>G&&(Q.adler=u(Q.adler,U.pending_buf,U.pending-G,G)),N(Q),G=U.pending,U.pending!==U.pending_buf_size));)k(U,255&U.gzhead.extra[U.gzindex]),U.gzindex++;U.gzhead.hcrc&&U.pending>G&&(Q.adler=u(Q.adler,U.pending_buf,U.pending-G,G)),U.gzindex===U.gzhead.extra.length&&(U.gzindex=0,U.status=73)}else U.status=73;if(U.status===73)if(U.gzhead.name){G=U.pending;do{if(U.pending===U.pending_buf_size&&(U.gzhead.hcrc&&U.pending>G&&(Q.adler=u(Q.adler,U.pending_buf,U.pending-G,G)),N(Q),G=U.pending,U.pending===U.pending_buf_size)){te=1;break}te=U.gzindexG&&(Q.adler=u(Q.adler,U.pending_buf,U.pending-G,G)),te===0&&(U.gzindex=0,U.status=91)}else U.status=91;if(U.status===91)if(U.gzhead.comment){G=U.pending;do{if(U.pending===U.pending_buf_size&&(U.gzhead.hcrc&&U.pending>G&&(Q.adler=u(Q.adler,U.pending_buf,U.pending-G,G)),N(Q),G=U.pending,U.pending===U.pending_buf_size)){te=1;break}te=U.gzindexG&&(Q.adler=u(Q.adler,U.pending_buf,U.pending-G,G)),te===0&&(U.status=103)}else U.status=103;if(U.status===103&&(U.gzhead.hcrc?(U.pending+2>U.pending_buf_size&&N(Q),U.pending+2<=U.pending_buf_size&&(k(U,255&Q.adler),k(U,Q.adler>>8&255),Q.adler=0,U.status=X)):U.status=X),U.pending!==0){if(N(Q),Q.avail_out===0)return U.last_flush=-1,f}else if(Q.avail_in===0&&B(me)<=B(ue)&&me!==p)return Z(Q,-5);if(U.status===666&&Q.avail_in!==0)return Z(Q,-5);if(Q.avail_in!==0||U.lookahead!==0||me!==h&&U.status!==666){var ne=U.strategy===2?(function(le,fe){for(var be;;){if(le.lookahead===0&&(Y(le),le.lookahead===0)){if(fe===h)return T;break}if(le.match_length=0,be=l._tr_tally(le,0,le.window[le.strstart]),le.lookahead--,le.strstart++,be&&(j(le,!1),le.strm.avail_out===0))return T}return le.insert=0,fe===p?(j(le,!0),le.strm.avail_out===0?H:J):le.last_lit&&(j(le,!1),le.strm.avail_out===0)?T:q})(U,me):U.strategy===3?(function(le,fe){for(var be,de,$e,ze,_e=le.window;;){if(le.lookahead<=O){if(Y(le),le.lookahead<=O&&fe===h)return T;if(le.lookahead===0)break}if(le.match_length=0,le.lookahead>=A&&0le.lookahead&&(le.match_length=le.lookahead)}if(le.match_length>=A?(be=l._tr_tally(le,1,le.match_length-A),le.lookahead-=le.match_length,le.strstart+=le.match_length,le.match_length=0):(be=l._tr_tally(le,0,le.window[le.strstart]),le.lookahead--,le.strstart++),be&&(j(le,!1),le.strm.avail_out===0))return T}return le.insert=0,fe===p?(j(le,!0),le.strm.avail_out===0?H:J):le.last_lit&&(j(le,!1),le.strm.avail_out===0)?T:q})(U,me):a[U.level].func(U,me);if(ne!==H&&ne!==J||(U.status=666),ne===T||ne===H)return Q.avail_out===0&&(U.last_flush=-1),f;if(ne===q&&(me===1?l._tr_align(U):me!==5&&(l._tr_stored_block(U,0,0,!1),me===3&&(V(U.head),U.lookahead===0&&(U.strstart=0,U.block_start=0,U.insert=0))),N(Q),Q.avail_out===0))return U.last_flush=-1,f}return me!==p?f:U.wrap<=0?1:(U.wrap===2?(k(U,255&Q.adler),k(U,Q.adler>>8&255),k(U,Q.adler>>16&255),k(U,Q.adler>>24&255),k(U,255&Q.total_in),k(U,Q.total_in>>8&255),k(U,Q.total_in>>16&255),k(U,Q.total_in>>24&255)):(W(U,Q.adler>>>16),W(U,65535&Q.adler)),N(Q),0=ue.w_size&&(te===0&&(V(ue.head),ue.strstart=0,ue.block_start=0,ue.insert=0),fe=new o.Buf8(ue.w_size),o.arraySet(fe,me,be-ue.w_size,ue.w_size,0),me=fe,be=ue.w_size),ge=Q.avail_in,ne=Q.next_in,le=Q.input,Q.avail_in=be,Q.next_in=0,Q.input=me,Y(ue);ue.lookahead>=A;){for(U=ue.strstart,G=ue.lookahead-(A-1);ue.ins_h=(ue.ins_h<>>=A=R>>>24,m-=A,(A=R>>>16&255)===0)q[d++]=65535&R;else{if(!(16&A)){if((64&A)==0){R=z[(65535&R)+(v&(1<>>=A,m-=A),m<15&&(v+=T[c++]<>>=A=R>>>24,m-=A,!(16&(A=R>>>16&255))){if((64&A)==0){R=C[(65535&R)+(v&(1<>>=A,m-=A,(A=d-h)>3,v&=(1<<(m-=O<<3))-1,a.next_in=c,a.next_out=d,a.avail_in=c>>24&255)+(L>>>8&65280)+((65280&L)<<8)+((255&L)<<24)}function v(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new a.Buf16(320),this.work=new a.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function m(L){var X;return L&&L.state?(X=L.state,L.total_in=L.total_out=X.total=0,L.msg="",X.wrap&&(L.adler=1&X.wrap),X.mode=b,X.last=0,X.havedict=0,X.dmax=32768,X.head=null,X.hold=0,X.bits=0,X.lencode=X.lendyn=new a.Buf32(g),X.distcode=X.distdyn=new a.Buf32(y),X.sane=1,X.back=-1,p):f}function z(L){var X;return L&&L.state?((X=L.state).wsize=0,X.whave=0,X.wnext=0,m(L)):f}function C(L,X){var T,q;return L&&L.state?(q=L.state,X<0?(T=0,X=-X):(T=1+(X>>4),X<48&&(X&=15)),X&&(X<8||15=J.wsize?(a.arraySet(J.window,X,T-J.wsize,J.wsize,0),J.wnext=0,J.whave=J.wsize):(q<(H=J.wsize-J.wnext)&&(H=q),a.arraySet(J.window,X,T-q,H,J.wnext),(q-=H)?(a.arraySet(J.window,X,T-q,q,0),J.wnext=q,J.whave=J.wsize):(J.wnext+=H,J.wnext===J.wsize&&(J.wnext=0),J.whave>>8&255,T.check=l(T.check,te,2,0),j=N=0,T.mode=2;break}if(T.flags=0,T.head&&(T.head.done=!1),!(1&T.wrap)||(((255&N)<<8)+(N>>8))%31){L.msg="incorrect header check",T.mode=30;break}if((15&N)!=8){L.msg="unknown compression method",T.mode=30;break}if(j-=4,Q=8+(15&(N>>>=4)),T.wbits===0)T.wbits=Q;else if(Q>T.wbits){L.msg="invalid window size",T.mode=30;break}T.dmax=1<>8&1),512&T.flags&&(te[0]=255&N,te[1]=N>>>8&255,T.check=l(T.check,te,2,0)),j=N=0,T.mode=3;case 3:for(;j<32;){if(B===0)break e;B--,N+=q[J++]<>>8&255,te[2]=N>>>16&255,te[3]=N>>>24&255,T.check=l(T.check,te,4,0)),j=N=0,T.mode=4;case 4:for(;j<16;){if(B===0)break e;B--,N+=q[J++]<>8),512&T.flags&&(te[0]=255&N,te[1]=N>>>8&255,T.check=l(T.check,te,2,0)),j=N=0,T.mode=5;case 5:if(1024&T.flags){for(;j<16;){if(B===0)break e;B--,N+=q[J++]<>>8&255,T.check=l(T.check,te,2,0)),j=N=0}else T.head&&(T.head.extra=null);T.mode=6;case 6:if(1024&T.flags&&(B<(M=T.length)&&(M=B),M&&(T.head&&(Q=T.head.extra_len-T.length,T.head.extra||(T.head.extra=new Array(T.head.extra_len)),a.arraySet(T.head.extra,q,J,M,Q)),512&T.flags&&(T.check=l(T.check,q,M,J)),B-=M,J+=M,T.length-=M),T.length))break e;T.length=0,T.mode=7;case 7:if(2048&T.flags){if(B===0)break e;for(M=0;Q=q[J+M++],T.head&&Q&&T.length<65536&&(T.head.name+=String.fromCharCode(Q)),Q&&M>9&1,T.head.done=!0),L.adler=T.check=0,T.mode=12;break;case 10:for(;j<32;){if(B===0)break e;B--,N+=q[J++]<>>=7&j,j-=7&j,T.mode=27;break}for(;j<3;){if(B===0)break e;B--,N+=q[J++]<>>=1)){case 0:T.mode=14;break;case 1:if(O(T),T.mode=20,X!==6)break;N>>>=2,j-=2;break e;case 2:T.mode=17;break;case 3:L.msg="invalid block type",T.mode=30}N>>>=2,j-=2;break;case 14:for(N>>>=7&j,j-=7&j;j<32;){if(B===0)break e;B--,N+=q[J++]<>>16^65535)){L.msg="invalid stored block lengths",T.mode=30;break}if(T.length=65535&N,j=N=0,T.mode=15,X===6)break e;case 15:T.mode=16;case 16:if(M=T.length){if(B>>=5,j-=5,T.ndist=1+(31&N),N>>>=5,j-=5,T.ncode=4+(15&N),N>>>=4,j-=4,286>>=3,j-=3}for(;T.have<19;)T.lens[ge[T.have++]]=0;if(T.lencode=T.lendyn,T.lenbits=7,ue={bits:T.lenbits},me=u(0,T.lens,0,19,T.lencode,0,T.work,ue),T.lenbits=ue.bits,me){L.msg="invalid code lengths set",T.mode=30;break}T.have=0,T.mode=19;case 19:for(;T.have>>16&255,re=65535&G,!((ie=G>>>24)<=j);){if(B===0)break e;B--,N+=q[J++]<>>=ie,j-=ie,T.lens[T.have++]=re;else{if(re===16){for(U=ie+2;j>>=ie,j-=ie,T.have===0){L.msg="invalid bit length repeat",T.mode=30;break}Q=T.lens[T.have-1],M=3+(3&N),N>>>=2,j-=2}else if(re===17){for(U=ie+3;j>>=ie)),N>>>=3,j-=3}else{for(U=ie+7;j>>=ie)),N>>>=7,j-=7}if(T.have+M>T.nlen+T.ndist){L.msg="invalid bit length repeat",T.mode=30;break}for(;M--;)T.lens[T.have++]=Q}}if(T.mode===30)break;if(T.lens[256]===0){L.msg="invalid code -- missing end-of-block",T.mode=30;break}if(T.lenbits=9,ue={bits:T.lenbits},me=u(d,T.lens,0,T.nlen,T.lencode,0,T.work,ue),T.lenbits=ue.bits,me){L.msg="invalid literal/lengths set",T.mode=30;break}if(T.distbits=6,T.distcode=T.distdyn,ue={bits:T.distbits},me=u(h,T.lens,T.nlen,T.ndist,T.distcode,0,T.work,ue),T.distbits=ue.bits,me){L.msg="invalid distances set",T.mode=30;break}if(T.mode=20,X===6)break e;case 20:T.mode=21;case 21:if(6<=B&&258<=V){L.next_out=Z,L.avail_out=V,L.next_in=J,L.avail_in=B,T.hold=N,T.bits=j,c(L,W),Z=L.next_out,H=L.output,V=L.avail_out,J=L.next_in,q=L.input,B=L.avail_in,N=T.hold,j=T.bits,T.mode===12&&(T.back=-1);break}for(T.back=0;oe=(G=T.lencode[N&(1<>>16&255,re=65535&G,!((ie=G>>>24)<=j);){if(B===0)break e;B--,N+=q[J++]<>ee)])>>>16&255,re=65535&G,!(ee+(ie=G>>>24)<=j);){if(B===0)break e;B--,N+=q[J++]<>>=ee,j-=ee,T.back+=ee}if(N>>>=ie,j-=ie,T.back+=ie,T.length=re,oe===0){T.mode=26;break}if(32&oe){T.back=-1,T.mode=12;break}if(64&oe){L.msg="invalid literal/length code",T.mode=30;break}T.extra=15&oe,T.mode=22;case 22:if(T.extra){for(U=T.extra;j>>=T.extra,j-=T.extra,T.back+=T.extra}T.was=T.length,T.mode=23;case 23:for(;oe=(G=T.distcode[N&(1<>>16&255,re=65535&G,!((ie=G>>>24)<=j);){if(B===0)break e;B--,N+=q[J++]<>ee)])>>>16&255,re=65535&G,!(ee+(ie=G>>>24)<=j);){if(B===0)break e;B--,N+=q[J++]<>>=ee,j-=ee,T.back+=ee}if(N>>>=ie,j-=ie,T.back+=ie,64&oe){L.msg="invalid distance code",T.mode=30;break}T.offset=re,T.extra=15&oe,T.mode=24;case 24:if(T.extra){for(U=T.extra;j>>=T.extra,j-=T.extra,T.back+=T.extra}if(T.offset>T.dmax){L.msg="invalid distance too far back",T.mode=30;break}T.mode=25;case 25:if(V===0)break e;if(M=W-V,T.offset>M){if((M=T.offset-M)>T.whave&&T.sane){L.msg="invalid distance too far back",T.mode=30;break}Y=M>T.wnext?(M-=T.wnext,T.wsize-M):T.wnext-M,M>T.length&&(M=T.length),se=T.window}else se=H,Y=Z-T.offset,M=T.length;for(VI?(A=Y[se+y[X]],j[k+y[X]]):(A=96,0),v=1<>Z)+(m-=v)]=R<<24|A<<16|O|0,m!==0;);for(v=1<>=1;if(v!==0?(N&=v-1,N+=v):N=0,X++,--W[L]==0){if(L===q)break;L=h[p+y[X]]}if(H>>7)]}function k(G,te){G.pending_buf[G.pending++]=255&te,G.pending_buf[G.pending++]=te>>>8&255}function W(G,te,ge){G.bi_valid>w-ge?(G.bi_buf|=te<>w-G.bi_valid,G.bi_valid+=ge-w):(G.bi_buf|=te<>>=1,ge<<=1,0<--te;);return ge>>>1}function se(G,te,ge){var ne,le,fe=new Array(y+1),be=0;for(ne=1;ne<=y;ne++)fe[ne]=be=be+ge[ne-1]<<1;for(le=0;le<=te;le++){var de=G[2*le+1];de!==0&&(G[2*le]=Y(fe[de]++,de))}}function ie(G){var te;for(te=0;te>1;1<=ge;ge--)ee(G,fe,ge);for(le=$e;ge=G.heap[1],G.heap[1]=G.heap[G.heap_len--],ee(G,fe,1),ne=G.heap[1],G.heap[--G.heap_max]=ge,G.heap[--G.heap_max]=ne,fe[2*le]=fe[2*ge]+fe[2*ne],G.depth[le]=(G.depth[ge]>=G.depth[ne]?G.depth[ge]:G.depth[ne])+1,fe[2*ge+1]=fe[2*ne+1]=le,G.heap[1]=le++,ee(G,fe,1),2<=G.heap_len;);G.heap[--G.heap_max]=G.heap[1],(function(_e,Ee){var Ce,xe,Ne,ve,ke,Ie,Pe=Ee.dyn_tree,Te=Ee.max_code,Be=Ee.stat_desc.static_tree,He=Ee.stat_desc.has_stree,Je=Ee.stat_desc.extra_bits,Me=Ee.stat_desc.extra_base,Re=Ee.stat_desc.max_length,Ve=0;for(ve=0;ve<=y;ve++)_e.bl_count[ve]=0;for(Pe[2*_e.heap[_e.heap_max]+1]=0,Ce=_e.heap_max+1;Ce>=7;le>>=1)if(1&ze&&de.dyn_ltree[2*$e]!==0)return o;if(de.dyn_ltree[18]!==0||de.dyn_ltree[20]!==0||de.dyn_ltree[26]!==0)return l;for($e=32;$e>>3,(fe=G.static_len+3+7>>>3)<=le&&(le=fe)):le=fe=ge+5,ge+4<=le&&te!==-1?U(G,te,ge,ne):G.strategy===4||fe===le?(W(G,2+(ne?1:0),3),pe(G,F,L)):(W(G,4+(ne?1:0),3),(function(de,$e,ze,_e){var Ee;for(W(de,$e-257,5),W(de,ze-1,5),W(de,_e-4,4),Ee=0;Ee<_e;Ee++)W(de,de.bl_tree[2*O[Ee]+1],3);me(de,de.dyn_ltree,$e-1),me(de,de.dyn_dtree,ze-1)})(G,G.l_desc.max_code+1,G.d_desc.max_code+1,be+1),pe(G,G.dyn_ltree,G.dyn_dtree)),ie(G),ne&&oe(G)},i._tr_tally=function(G,te,ge){return G.pending_buf[G.d_buf+2*G.last_lit]=te>>>8&255,G.pending_buf[G.d_buf+2*G.last_lit+1]=255&te,G.pending_buf[G.l_buf+G.last_lit]=255&ge,G.last_lit++,te===0?G.dyn_ltree[2*ge]++:(G.matches++,te--,G.dyn_ltree[2*(T[ge]+h+1)]++,G.dyn_dtree[2*j(te)]++),G.last_lit===G.lit_bufsize-1},i._tr_align=function(G){W(G,2,3),M(G,m,F),(function(te){te.bi_valid===16?(k(te,te.bi_buf),te.bi_buf=0,te.bi_valid=0):8<=te.bi_valid&&(te.pending_buf[te.pending++]=255&te.bi_buf,te.bi_buf>>=8,te.bi_valid-=8)})(G)}},{"../utils/common":41}],53:[function(n,r,i){r.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(n,r,i){(function(a){(function(o,l){if(!o.setImmediate){var c,u,d,h,p=1,f={},b=!1,g=o.document,y=Object.getPrototypeOf&&Object.getPrototypeOf(o);y=y&&y.setTimeout?y:o,c={}.toString.call(o.process)==="[object process]"?function(z){process.nextTick(function(){v(z)})}:(function(){if(o.postMessage&&!o.importScripts){var z=!0,C=o.onmessage;return o.onmessage=function(){z=!1},o.postMessage("","*"),o.onmessage=C,z}})()?(h="setImmediate$"+Math.random()+"$",o.addEventListener?o.addEventListener("message",m,!1):o.attachEvent("onmessage",m),function(z){o.postMessage(h+z,"*")}):o.MessageChannel?((d=new MessageChannel).port1.onmessage=function(z){v(z.data)},function(z){d.port2.postMessage(z)}):g&&"onreadystatechange"in g.createElement("script")?(u=g.documentElement,function(z){var C=g.createElement("script");C.onreadystatechange=function(){v(z),C.onreadystatechange=null,u.removeChild(C),C=null},u.appendChild(C)}):function(z){setTimeout(v,0,z)},y.setImmediate=function(z){typeof z!="function"&&(z=new Function(""+z));for(var C=new Array(arguments.length-1),E=0;E"u"?a===void 0?this:a:self)}).call(this,typeof Mp<"u"?Mp:typeof self<"u"?self:typeof window<"u"?window:{})},{}]},{},[10])(10)})})(y_)),y_.exports}var Tue=Mue();const Rue=Am(Tue),C4=Object.freeze(Object.defineProperty({__proto__:null,default:Rue},Symbol.toStringTag,{value:"Module"}));function Pue(e,t){var i,a,o;let n=0,r=0;if((i=e.content)!=null&&i.startsWith("blob:"))if(t.has(e.content))console.log(`[Cleanup] Skipping content URL (referenced by other nodes): ${e.content.substring(0,50)}`),r++;else try{URL.revokeObjectURL(e.content),n++}catch(l){console.warn("[Cleanup] Failed to revoke content URL:",e.content,l)}if((a=e.settings)!=null&&a._blobUrl&&typeof e.settings._blobUrl=="string")if(t.has(e.settings._blobUrl))console.log(`[Cleanup] Skipping settings blob URL (referenced by other nodes): ${e.settings._blobUrl.substring(0,50)}`),r++;else try{URL.revokeObjectURL(e.settings._blobUrl),n++}catch(l){console.warn("[Cleanup] Failed to revoke settings blob URL:",l)}if(e.previewMjImages&&Array.isArray(e.previewMjImages)&&e.previewMjImages.forEach(l=>{if(typeof l=="string"&&l.startsWith("blob:"))if(t.has(l))r++;else try{URL.revokeObjectURL(l),n++}catch(c){console.warn("[Cleanup] Failed to revoke preview image URL:",l,c)}}),(o=e.selectedPreviewImage)!=null&&o.startsWith("blob:"))if(t.has(e.selectedPreviewImage))r++;else try{URL.revokeObjectURL(e.selectedPreviewImage),n++}catch(l){console.warn("[Cleanup] Failed to revoke selected preview URL:",l)}e.selectedKeyframes&&Array.isArray(e.selectedKeyframes)&&e.selectedKeyframes.forEach(l=>{var c;if((c=l.url)!=null&&c.startsWith("blob:"))if(t.has(l.url))r++;else try{URL.revokeObjectURL(l.url),n++}catch(u){console.warn("[Cleanup] Failed to revoke keyframe URL:",l.url,u)}}),e.frames&&Array.isArray(e.frames)&&e.frames.forEach(l=>{var c;if((c=l.url)!=null&&c.startsWith("blob:"))if(t.has(l.url))r++;else try{URL.revokeObjectURL(l.url),n++}catch(u){console.warn("[Cleanup] Failed to revoke frame URL:",l.url,u)}}),e.shots&&Array.isArray(e.shots)&&e.shots.forEach(l=>{var c,u;if((c=l.image_url)!=null&&c.startsWith("blob:"))if(t.has(l.image_url))r++;else try{URL.revokeObjectURL(l.image_url),n++}catch(d){console.warn("[Cleanup] Failed to revoke shot image URL:",l.image_url,d)}if((u=l.video_url)!=null&&u.startsWith("blob:"))if(t.has(l.video_url))r++;else try{URL.revokeObjectURL(l.video_url),n++}catch(d){console.warn("[Cleanup] Failed to revoke shot video URL:",l.video_url,d)}}),(n>0||r>0)&&console.log(`[Cleanup] Node ${e.id} (${e.type}): Released ${n} Blob URLs, Skipped ${r} (referenced by other nodes)`)}function N4(e){var n,r,i;let t=0;if((n=e.content)!=null&&n.startsWith("blob:"))try{URL.revokeObjectURL(e.content),t++}catch(a){console.warn("[Cleanup] Failed to revoke content URL:",e.content,a)}if((r=e.settings)!=null&&r._blobUrl&&typeof e.settings._blobUrl=="string")try{URL.revokeObjectURL(e.settings._blobUrl),t++}catch(a){console.warn("[Cleanup] Failed to revoke settings blob URL:",a)}if(e.previewMjImages&&Array.isArray(e.previewMjImages)&&e.previewMjImages.forEach(a=>{if(typeof a=="string"&&a.startsWith("blob:"))try{URL.revokeObjectURL(a),t++}catch(o){console.warn("[Cleanup] Failed to revoke preview image URL:",a,o)}}),(i=e.selectedPreviewImage)!=null&&i.startsWith("blob:"))try{URL.revokeObjectURL(e.selectedPreviewImage),t++}catch(a){console.warn("[Cleanup] Failed to revoke selected preview URL:",a)}e.selectedKeyframes&&Array.isArray(e.selectedKeyframes)&&e.selectedKeyframes.forEach(a=>{var o;if((o=a.url)!=null&&o.startsWith("blob:"))try{URL.revokeObjectURL(a.url),t++}catch(l){console.warn("[Cleanup] Failed to revoke keyframe URL:",a.url,l)}}),e.frames&&Array.isArray(e.frames)&&e.frames.forEach(a=>{var o;if((o=a.url)!=null&&o.startsWith("blob:"))try{URL.revokeObjectURL(a.url),t++}catch(l){console.warn("[Cleanup] Failed to revoke frame URL:",a.url,l)}}),e.shots&&Array.isArray(e.shots)&&e.shots.forEach(a=>{var o,l;if((o=a.image_url)!=null&&o.startsWith("blob:"))try{URL.revokeObjectURL(a.image_url),t++}catch(c){console.warn("[Cleanup] Failed to revoke shot image URL:",a.image_url,c)}if((l=a.video_url)!=null&&l.startsWith("blob:"))try{URL.revokeObjectURL(a.video_url),t++}catch(c){console.warn("[Cleanup] Failed to revoke shot video URL:",a.video_url,c)}}),e.analysisResults&&Array.isArray(e.analysisResults)&&e.analysisResults.forEach(a=>{a.keyframes&&Array.isArray(a.keyframes)&&a.keyframes.forEach(o=>{})}),t>0&&console.log(`[Cleanup] Released ${t} Blob URLs for node: ${e.id} (${e.type})`)}function D$(e){console.log(`[Cleanup] Cleaning up ${e.length} nodes...`),e.forEach(t=>N4(t))}function Oue(e,t){const n=e.find(r=>r.id===t);n?N4(n):console.warn(`[Cleanup] Node not found: ${t}`)}const Lue=Object.freeze(Object.defineProperty({__proto__:null,cleanupNode:N4,cleanupNodeById:Oue,cleanupNodeSafe:Pue,cleanupNodes:D$},Symbol.toStringTag,{value:"Module"})),Fd=!1,_b=typeof navigator<"u"&&(navigator.platform.toLowerCase().includes("win")||navigator.userAgent.toLowerCase().includes("win")),Qw=typeof navigator<"u"&&(navigator.platform.toLowerCase().includes("mac")||navigator.userAgent.toLowerCase().includes("mac")),lI=_b||Qw,Bue=_b?3e4:6e4,cI=_b?.65:Qw?.8:.75,v_=_b?.75:Qw?.9:.85,Uue=_b?.55:Qw?.75:.7;class Fue{constructor(){Mn(this,"intervalId",null);Mn(this,"isMonitoring",!1);Mn(this,"lastGcTime",0);Mn(this,"gcCooldown",3e4)}start(){this.isMonitoring||(this.isMonitoring=!0,this.checkMemory(),this.intervalId=window.setInterval(()=>{this.checkMemory()},Bue))}stop(){this.intervalId&&(clearInterval(this.intervalId),this.intervalId=null),this.isMonitoring=!1}async checkMemory(){try{const t=performance.memory;if(!t)return;const n=t.usedJSHeapSize,r=t.jsHeapSizeLimit,i=n/r;i>=v_?await this.emergencyCleanup():i>=cI?(await this.cleanup(),window.gc&&(window.gc(),this.lastGcTime=Date.now())):i>=Uue&&this.trySmartGC()}catch{}}trySmartGC(){if(!window.gc)return;const t=Date.now();if(!(t-this.lastGcTime=v_?{canSave:!1,reason:`当前内存使用率过高 (${(n.ratio*100).toFixed(1)}%)`,suggestion:"建议先关闭其他标签页或重启浏览器后再保存"}:t>0&&(n.used+t)/n.total>=v_?{canSave:!1,reason:`保存操作预计需要 ${(t/1024/1024).toFixed(1)}MB,可能导致内存不足`,suggestion:"建议减少节点数量、删除大型视频节点、或使用性能更好的设备"}:n.ratio>=cI?{canSave:!0,reason:`当前内存使用率较高 (${(n.ratio*100).toFixed(1)}%)`,suggestion:"保存过程中如遇到问题,建议先清理缓存或关闭其他标签页"}:{canSave:!0}:{canSave:!0}}async cleanup(){var t;try{await zi.clearMemoryCache(),Ln.clearMemoryCache();try{const{assetStore:n}=await mn(async()=>{const{assetStore:r}=await Promise.resolve().then(()=>_s);return{assetStore:r}},void 0,import.meta.url);(t=n.clearBlobUrlCache)==null||t.call(n)}catch{}try{const{memoryPoolManager:n}=await mn(async()=>{const{memoryPoolManager:r}=await Promise.resolve().then(()=>tP);return{memoryPoolManager:r}},void 0,import.meta.url);n.cleanup()}catch{}}catch{}}cleanupNodeResources(t,n=!1){let r=0;try{n?t.forEach(i=>{D$([i]),r++}):(D$(t),r=t.length)}catch{}return r}cleanupHistory(t,n){const i=n??(lI?300:100);if(t.length<=i)return t;const a=t.slice(-i);return t.length-a.length,a}async fullCleanup(t,n){let r=0,i=0;try{t&&t.length>0&&(r=this.cleanupNodeResources(t,!1));const a=lI?300:100;if(n&&n.length>a){const o=n.length,l=this.cleanupHistory(n,a);i=o-l.length}await zi.clearMemoryCache(),Ln.clearMemoryCache();try{const{assetStore:o}=await mn(async()=>{const{assetStore:l}=await Promise.resolve().then(()=>_s);return{assetStore:l}},void 0,import.meta.url)}catch{}return window.gc&&(window.gc(),this.lastGcTime=Date.now()),{nodeResourcesCleaned:r,historyItemsRemoved:i,cachesCleared:!0}}catch{return{nodeResourcesCleaned:r,historyItemsRemoved:i,cachesCleared:!1}}}async emergencyCleanup(){var t;try{await zi.clearMemoryCache(),Ln.clearMemoryCache();try{const{assetStore:n}=await mn(async()=>{const{assetStore:r}=await Promise.resolve().then(()=>_s);return{assetStore:r}},void 0,import.meta.url);(t=n.clearBlobUrlCache)==null||t.call(n)}catch{}try{const{memoryPoolManager:n}=await mn(async()=>{const{memoryPoolManager:r}=await Promise.resolve().then(()=>tP);return{memoryPoolManager:r}},void 0,import.meta.url);n.cleanup()}catch{}window.gc&&(window.gc(),this.lastGcTime=Date.now())}catch{}}forceGC(){window.gc&&(window.gc(),this.lastGcTime=Date.now())}async manualCleanup(){await this.cleanup()}async cleanupBeforeSave(){await this.cleanup(),await new Promise(t=>setTimeout(t,100))}}const Wue=new Fue,aw=Object.freeze(Object.defineProperty({__proto__:null,memoryMonitor:Wue},Symbol.toStringTag,{value:"Module"}));var H1={},w_,uI;function Qi(){if(uI)return w_;uI=1;function e(y){return new Int8Array(y)}function t(y){return new Int16Array(y)}function n(y){return new Int32Array(y)}function r(y){return new Float32Array(y)}function i(y){return new Float64Array(y)}function a(y){if(y.length==1)return r(y[0]);var w=y[0];y=y.slice(1);for(var v=[],m=0;m=0;--T){var j,k;j=O[F+T]*h[20+T]+O[F+-1-T]*p[28+T],k=O[F+T]*p[28+T]-O[F+-1-T]*h[20+T],O[F+-1-T]=j,O[F+T]=k}}}if(z=m,C=286,w.mode_gr==1)for(var W=0;W<18;W++)t.arraycopy(w.sb_sample[E][1][W],0,w.sb_sample[E][0][W],0,32)}}}return __=o,__}var z_,hI;function b7(){if(hI)return z_;hI=1;var e=Ho(),t=Qi(),n=t.System;t.VbrMode,t.Float,t.ShortBlock,t.Util,t.Arrays,t.new_array_n,t.new_byte,t.new_double;var r=t.new_float,i=t.new_float_n;t.new_int,t.new_int_n,t.assert;function a(){this.l=r(e.SBMAX_l),this.s=i([e.SBMAX_s,3]);var o=this;this.assign=function(l){n.arraycopy(l.l,0,o.l,0,e.SBMAX_l);for(var c=0;c.03125)C.ATH.adjust>=1?C.ATH.adjust=1:C.ATH.adjust=R?(C.ATH.adjust*=R*.075+.925,C.ATH.adjust=R?C.ATH.adjust=R:C.ATH.adjust=c.FFTOFFSET),l(I.mf_size>=c.BLKSIZE+C.framesize-c.FFTOFFSET),l(I.mf_size>=512+C.framesize-32)}}this.lame_encode_mp3_frame=function(C,E,I,R,A,O){var F,L=r([2,2]);L[0][0]=new d,L[0][1]=new d,L[1][0]=new d,L[1][1]=new d;var X=r([2,2]);X[0][0]=new d,X[0][1]=new d,X[1][0]=new d,X[1][1]=new d;var T,q=[null,null],H=C.internal_flags,J=a([2,4]),Z=[.5,.5],B=[[0,0],[0,0]],V=[[0,0],[0,0]],N,j,k;if(q[0]=E,q[1]=I,H.lame_encode_frame_init==0&&z(C,q),H.padding=0,(H.slot_lag-=H.frac_SpF)<0&&(H.slot_lag+=C.out_samplerate,H.padding=1),H.psymodel!=0){var W,M=[null,null],Y=0,se=o(2);for(k=0;k0&&(Z[k]=J[k][3]/Z[k])),j=0;j>1,C=b,E=b<<1,I=E+C,b=E<<1,g=h,y=g+R;do{var A,O,F,L;O=d[g+0]-d[g+C],A=d[g+0]+d[g+C],L=d[g+E]-d[g+I],F=d[g+E]+d[g+I],d[g+E]=A-F,d[g+0]=A+F,d[g+I]=O-L,d[g+C]=O+L,O=d[y+0]-d[y+C],A=d[y+0]+d[y+C],L=t.SQRT2*d[y+I],F=t.SQRT2*d[y+E],d[y+E]=A-F,d[y+0]=A+F,d[y+I]=O-L,d[y+C]=O+L,y+=b,g+=b}while(g=0);c(h[g],y,r.BLKSIZE_s/2)}},this.fft_long=function(d,h,p,f,b){var g=r.BLKSIZE/8-1,y=r.BLKSIZE/2;do{var w,v,m,z,C,E=u[g]&255;w=a[E]*f[p][b+E],C=a[E+512]*f[p][b+E+512],v=w-C,w=w+C,m=a[E+256]*f[p][b+E+256],C=a[E+768]*f[p][b+E+768],z=m-C,m=m+C,y-=4,h[y+0]=w+m,h[y+2]=w-m,h[y+1]=v+z,h[y+3]=v-z,w=a[E+1]*f[p][b+E+1],C=a[E+513]*f[p][b+E+513],v=w-C,w=w+C,m=a[E+257]*f[p][b+E+257],C=a[E+769]*f[p][b+E+769],z=m-C,m=m+C,h[y+r.BLKSIZE/2+0]=w+m,h[y+r.BLKSIZE/2+2]=w-m,h[y+r.BLKSIZE/2+1]=v+z,h[y+r.BLKSIZE/2+3]=v-z}while(--g>=0);c(h,y,r.BLKSIZE/2)},this.init_fft=function(d){for(var h=0;h=0;--Nt){var Yt=qe[tt+0][Nt],un=qe[tt+1][Nt];qe[tt+0][Nt]=(Yt+un)*i.SQRT2*.5,qe[tt+1][Nt]=(Yt-un)*i.SQRT2*.5}for(var Tn=2;Tn>=0;--Tn)for(var Nt=h.BLKSIZE_s-1;Nt>=0;--Nt){var Yt=Ye[ct+0][Tn][Nt],un=Ye[ct+1][Tn][Nt];Ye[ct+0][Tn][Nt]=(Yt+un)*i.SQRT2*.5,Ye[ct+1][Tn][Nt]=(Yt-un)*i.SQRT2*.5}}Le[0]=qe[tt+0][0],Le[0]*=Le[0];for(var Nt=h.BLKSIZE/2-1;Nt>=0;--Nt){var Ht=qe[tt+0][h.BLKSIZE/2-Nt],fn=qe[tt+0][h.BLKSIZE/2+Nt];Le[h.BLKSIZE/2-Nt]=(Ht*Ht+fn*fn)*.5}for(var Tn=2;Tn>=0;--Tn){Xe[Tn][0]=Ye[ct+0][Tn][0],Xe[Tn][0]*=Xe[Tn][0];for(var Nt=h.BLKSIZE_s/2-1;Nt>=0;--Nt){var Ht=Ye[ct+0][Tn][h.BLKSIZE_s/2-Nt],fn=Ye[ct+0][Tn][h.BLKSIZE_s/2+Nt];Xe[Tn][h.BLKSIZE_s/2-Nt]=(Ht*Ht+fn*fn)*.5}}{for(var Dn=0,Nt=11;Ntje)if(Le=Le*B)return je+Le;ct=je/Le}if(u(je>=0),u(Le>=0),je+=Le,qe+3<=6){if(ct>=Z)return je;var pt=0|i.FAST_LOG10_X(ct,16);return je*W[pt]}var pt=0|i.FAST_LOG10_X(ct,16);if(Le=tt.ATH.cb_l[Xe]*tt.ATH.adjust,u(Le>=0),jeLe){var ht,wt;return ht=1,pt<=13&&(ht=M[pt]),wt=i.FAST_LOG10_X(je/Le,10/15),je*((k[pt]-ht)*wt+ht)}return pt>13?je:je*M[pt]}return je*k[pt]}var se=[1.33352*1.33352,1.35879*1.35879,1.38454*1.38454,1.39497*1.39497,1.40548*1.40548,1.3537*1.3537,1.30382*1.30382,1.22321*1.22321,1.14758*1.14758,1];function ie(je,Le,Xe){var qe;if(je<0&&(je=0),Le<0&&(Le=0),je<=0)return Le;if(Le<=0)return je;if(Le>je?qe=Le/je:qe=je/Le,-2<=Xe&&Xe<=2){if(qe>=Z)return je+Le;var tt=0|i.FAST_LOG10_X(qe,16);return(je+Le)*se[tt]}return qe1){for(var qe=0;qe1.58*je.thm[1].l[Le]||je.thm[1].l[Le]>1.58*je.thm[0].l[Le])){var Xe=je.mld_l[Le]*je.en[3].l[Le],qe=Math.max(je.thm[2].l[Le],Math.min(je.thm[3].l[Le],Xe));Xe=je.mld_l[Le]*je.en[2].l[Le];var tt=Math.max(je.thm[3].l[Le],Math.min(je.thm[2].l[Le],Xe));je.thm[2].l[Le]=qe,je.thm[3].l[Le]=tt}for(var Le=0;Le1.58*je.thm[1].s[Le][Ye]||je.thm[1].s[Le][Ye]>1.58*je.thm[0].s[Le][Ye])){var Xe=je.mld_s[Le]*je.en[3].s[Le][Ye],qe=Math.max(je.thm[2].s[Le][Ye],Math.min(je.thm[3].s[Le][Ye],Xe));Xe=je.mld_s[Le]*je.en[2].s[Le][Ye];var tt=Math.max(je.thm[3].s[Le][Ye],Math.min(je.thm[2].s[Le][Ye],Xe));je.thm[2].s[Le][Ye]=qe,je.thm[3].s[Le][Ye]=tt}}function ee(je,Le,Xe){var qe=Le,tt=Math.pow(10,Xe);Le*=2,qe*=2;for(var Ye=0;Ye0)}je.thm[2].l[Ye]=Math.min(pt,je.thm[2].l[Ye]),je.thm[3].l[Ye]=Math.min(ht,je.thm[3].l[Ye])}tt*=h.BLKSIZE_s/h.BLKSIZE;for(var Ye=0;Ye0)}je.thm[2].s[Ye][jt]=Math.min(je.thm[2].s[Ye][jt],pt),je.thm[3].s[Ye][jt]=Math.min(je.thm[3].s[Ye][jt],ht)}}function pe(je,Le,Xe,qe,tt){var Ye,ct,pt=0,ht=0;for(Ye=ct=0;Ye=0),u(Xe[ct]>=0),pt+=Le[ct],ht+=Xe[ct],ct++;if(je.en[qe].s[Ye][tt]=pt,je.thm[qe].s[Ye][tt]=ht,ct>=$t){++Ye;break}u(Le[ct]>=0),u(Xe[ct]>=0);{var Nt=je.PSY.bo_s_weight[Ye],Yt=1-Nt;pt=Nt*Le[ct],ht=Nt*Xe[ct],je.en[qe].s[Ye][tt]+=pt,je.thm[qe].s[Ye][tt]+=ht,pt=Yt*Le[ct],ht=Yt*Xe[ct]}}for(;Ye=0),u(Xe[Ye]>=0),ct+=Le[Ye],pt+=Xe[Ye],Ye++;if(je.en[qe].l[tt]=ct,je.thm[qe].l[tt]=pt,Ye>=wt){++tt;break}u(Le[Ye]>=0),u(Xe[Ye]>=0);{var jt=je.PSY.bo_l_weight[tt],Nt=1-jt;ct=jt*Le[Ye],pt=jt*Xe[Ye],je.en[qe].l[tt]+=ct,je.thm[qe].l[tt]+=pt,ct=Nt*Le[Ye],pt=Nt*Xe[Ye]}}for(;tt=0)}for(;ht<=h.CBANDS;++ht)Xe[ht]=0,qe[ht]=0}function me(je,Le,Xe,qe){var tt=je.internal_flags;je.short_blocks==r.short_block_coupled&&!(Le[0]!=0&&Le[1]!=0)&&(Le[0]=Le[1]=0);for(var Ye=0;Ye=1?je:Xe<=0?Le:Le>0?Math.pow(je/Le,Xe)*Le:0}var U=[11.8,13.6,17.2,32,46.5,51.3,57.5,67.1,71.5,84.6,97.6,130];function G(je,Le){for(var Xe=309.07,qe=0;qe0){var ct=Ye*Le,pt=je.en.s[qe][tt];pt>ct&&(pt>ct*1e10?Xe+=U[qe]*(10*b):(u(ct>0),Xe+=U[qe]*i.FAST_LOG10(pt/ct)))}}return Xe}var te=[6.8,5.8,5.8,6.4,6.5,9.9,12.1,14.4,15,18.9,21.6,26.9,34.2,40.2,46.8,56.5,60.7,73.9,85.7,93.4,126.1];function ge(je,Le){for(var Xe=281.0575,qe=0;qe0){var Ye=tt*Le,ct=je.en.l[qe];ct>Ye&&(ct>Ye*1e10?Xe+=te[qe]*(10*b):(u(Ye>0),Xe+=te[qe]*i.FAST_LOG10(ct/Ye)))}}return Xe}function ne(je,Le,Xe,qe,tt){var Ye,ct;for(Ye=ct=0;Ye=0),pt+=$t,ht<$t&&(ht=$t)}Xe[Ye]=pt,qe[Ye]=ht,tt[Ye]=pt*je.rnumlines_l[Ye],u(je.rnumlines_l[Ye]>=0),u(pt>=0),u(Xe[Ye]>=0),u(qe[Ye]>=0),u(tt[Ye]>=0)}}function le(je,Le,Xe,qe){var tt=N.length-1,Ye=0,ct=Xe[Ye]+Xe[Ye+1];if(u(ct>=0),ct>0){var pt=Le[Ye];pt0),ct=20*(pt*2-ct)/(ct*(je.numlines_l[Ye]+je.numlines_l[Ye+1]-1));var ht=0|ct;ht>tt&&(ht=tt),qe[Ye]=ht}else qe[Ye]=0;for(Ye=1;Ye=0),ct>0){var pt=Le[Ye-1];pt0),ct=20*(pt*3-ct)/(ct*(je.numlines_l[Ye-1]+je.numlines_l[Ye]+je.numlines_l[Ye+1]-1));var ht=0|ct;ht>tt&&(ht=tt),qe[Ye]=ht}else qe[Ye]=0;if(u(Ye>0),u(Ye==je.npart_l-1),ct=Xe[Ye-1]+Xe[Ye],u(ct>=0),ct>0){var pt=Le[Ye-1];pt0),ct=20*(pt*2-ct)/(ct*(je.numlines_l[Ye-1]+je.numlines_l[Ye]-1));var ht=0|ct;ht>tt&&(ht=tt),qe[Ye]=ht}else qe[Ye]=0;u(Ye==je.npart_l-1)}var fe=[-865163e-23*2,-.00851586*2,-674764e-23*2,.0209036*2,-336639e-22*2,-.0438162*2,-154175e-22*2,.0931738*2,-552212e-22*2,-.313819*2];this.L3psycho_anal_ns=function(je,Le,Xe,qe,tt,Ye,ct,pt,ht,wt){var $t=je.internal_flags,jt=l([2,h.BLKSIZE]),Nt=l([2,3,h.BLKSIZE_s]),Yt=o(h.CBANDS+1),un=o(h.CBANDS+1),Tn=o(h.CBANDS+2),Ht=c(2),fn=c(2),Dn,it,Lt,gt,Jt,Wt,Pt,Bt,zt=l([2,576]),Gt,qt=c(h.CBANDS+2),De=c(h.CBANDS+2);for(a.fill(De,0),Dn=$t.channels_out,je.mode==MPEGMode.JOINT_STEREO&&(Dn=4),je.VBR==t.vbr_off?Gt=$t.ResvMax==0?0:$t.ResvSize/$t.ResvMax*.5:je.VBR==t.vbr_rh||je.VBR==t.vbr_mtrh||je.VBR==t.vbr_mt?Gt=.6:Gt=1,it=0;it<$t.channels_out;it++){var st=Le[it],Ae=Xe+576-350-O+192;for(u(fe.length==(O-1)/2),gt=0;gt<576;gt++){var nt,_t;for(nt=st[Ae+gt+10],_t=0,Jt=0;Jt<(O-1)/2-1;Jt+=2)nt+=fe[Jt]*(st[Ae+gt+Jt]+st[Ae+gt+O-Jt]),_t+=fe[Jt+1]*(st[Ae+gt+Jt+1]+st[Ae+gt+O-Jt-1]);zt[it][gt]=nt+_t}tt[qe][it].en.assign($t.en[it]),tt[qe][it].thm.assign($t.thm[it]),Dn>2&&(Ye[qe][it].en.assign($t.en[it+2]),Ye[qe][it].thm.assign($t.thm[it+2]))}for(it=0;it0),Ue[gt]=St[gt]/$t.nsPsy.last_en_subshort[it][gt+4],Qe[0]+=St[gt];if(it==2)for(gt=0;gt<576;gt++){var Ot,dn;Ot=zt[0][gt],dn=zt[1][gt],zt[0][gt]=Ot+dn,zt[1][gt]=Ot-dn}{var Vt=zt[it&1],Zt=0;for(gt=0;gt<9;gt++){for(var Sn=Zt+64,jn=1;ZtSt[gt+3-2]?(u(St[gt+3-2]>0),jn=jn/St[gt+3-2]):St[gt+3-2]>jn*10?(u(jn>0),jn=St[gt+3-2]/(jn*10)):jn=0,Ue[gt+3]=jn}}if(je.analysis){var _n=Ue[0];for(gt=1;gt<12;gt++)_nat&&(ot[gt/3]=gt%3+1);for(gt=1;gt<4;gt++){var Cn;Qe[gt-1]>Qe[gt]?(u(Qe[gt]>0),Cn=Qe[gt-1]/Qe[gt]):(u(Qe[gt-1]>0),Cn=Qe[gt]/Qe[gt-1]),Cn<1.7&&(ot[gt]=0,gt==1&&(ot[0]=0))}for(ot[0]!=0&&$t.nsPsy.lastAttacks[it]!=0&&(ot[0]=0),($t.nsPsy.lastAttacks[it]==3||ot[0]+ot[1]+ot[2]+ot[3]!=0)&&(Ge=0,ot[1]!=0&&ot[0]!=0&&(ot[1]=0),ot[2]!=0&&ot[1]!=0&&(ot[2]=0),ot[3]!=0&&ot[2]!=0&&(ot[3]=0)),it<2?fn[it]=Ge:Ge==0&&(fn[0]=fn[1]=0),ht[it]=$t.tot_ener[it],Tt=Nt,xt=jt,T(je,At,kt,xt,it&1,Tt,it&1,qe,it,Le,Xe),ne($t,At,Yt,rt,lt),le($t,rt,lt,qt),Bt=0;Bt<3;Bt++){var Kn,Xn;for(Q(je,kt,un,Tn,it,Bt),pe($t,un,Tn,it,Bt),Pt=0;Pt=2||ot[Bt+1]==1){var $r=Bt!=0?Bt-1:2,jn=ue($t.thm[it].s[Pt][$r],Xn,I*Gt);Xn=Math.min(Xn,jn)}if(ot[Bt]==1){var $r=Bt!=0?Bt-1:2,jn=ue($t.thm[it].s[Pt][$r],Xn,R*Gt);Xn=Math.min(Xn,jn)}else if(Bt!=0&&ot[Bt-1]==3||Bt==0&&$t.nsPsy.lastAttacks[it]==3){var $r=Bt!=2?Bt+1:0,jn=ue($t.thm[it].s[Pt][$r],Xn,R*Gt);Xn=Math.min(Xn,jn)}Kn=St[Bt*3+3]+St[Bt*3+4]+St[Bt*3+5],St[Bt*3+5]*60&&oe(je,je.interChRatio),je.mode==MPEGMode.JOINT_STEREO){var sr;re($t),sr=je.msfix,Math.abs(sr)>0&&ee($t,sr,je.ATHlower*$t.ATH.adjust)}for(me(je,fn,wt,Ht),it=0;it1?(mt=pt,It=-2,tn=h.NORM_TYPE,(wt[0]==h.SHORT_TYPE||wt[1]==h.SHORT_TYPE)&&(tn=h.SHORT_TYPE),cn=Ye[qe][it-2]):(mt=ct,It=0,tn=wt[it],cn=tt[qe][it]),tn==h.SHORT_TYPE?mt[It+it]=G(cn,$t.masking_lower):mt[It+it]=ge(cn,$t.masking_lower),je.analysis&&($t.pinfo.pe[qe][it]=mt[It+it])}return 0};function be(je,Le,Xe,qe,tt,Ye,ct,pt){var ht=je.internal_flags;if(qe<2)f.fft_long(ht,ct[pt],qe,Le,Xe);else if(qe==2)for(var wt=h.BLKSIZE-1;wt>=0;--wt){var $t=ct[pt+0][wt],jt=ct[pt+1][wt];ct[pt+0][wt]=($t+jt)*i.SQRT2*.5,ct[pt+1][wt]=($t-jt)*i.SQRT2*.5}Ye[0]=ct[pt+0][0],Ye[0]*=Ye[0];for(var wt=h.BLKSIZE/2-1;wt>=0;--wt){var Nt=ct[pt+0][h.BLKSIZE/2-wt],Yt=ct[pt+0][h.BLKSIZE/2+wt];Ye[h.BLKSIZE/2-wt]=(Nt*Nt+Yt*Yt)*.5}{for(var un=0,wt=11;wt=0;--wt){var $t=ct[pt+0][tt][wt],jt=ct[pt+1][tt][wt];ct[pt+0][tt][wt]=($t+jt)*i.SQRT2*.5,ct[pt+1][tt][wt]=($t-jt)*i.SQRT2*.5}Ye[tt][0]=ct[pt+0][tt][0],Ye[tt][0]*=Ye[tt][0];for(var wt=h.BLKSIZE_s/2-1;wt>=0;--wt){var Nt=ct[pt+0][tt][h.BLKSIZE_s/2-wt],Yt=ct[pt+0][tt][h.BLKSIZE_s/2+wt];Ye[tt][h.BLKSIZE_s/2-wt]=(Nt*Nt+Yt*Yt)*.5}}function $e(je,Le,Xe,qe){var tt=je.internal_flags;je.athaa_loudapprox==2&&Xe<2&&(tt.loudness_sq[Le][Xe]=tt.loudness_sq_save[Xe],tt.loudness_sq_save[Xe]=X(qe,tt))}var ze=[-865163e-23*2,-.00851586*2,-674764e-23*2,.0209036*2,-336639e-22*2,-.0438162*2,-154175e-22*2,.0931738*2,-552212e-22*2,-.313819*2];function _e(je,Le,Xe,qe,tt,Ye,ct,pt,ht,wt){for(var $t=l([2,576]),jt=je.internal_flags,Nt=jt.channels_out,Yt=je.mode==MPEGMode.JOINT_STEREO?4:Nt,un=0;un2&&(Ye[qe][un].en.assign(jt.en[un+2]),Ye[qe][un].thm.assign(jt.thm[un+2]))}for(var un=0;un0;++Ht,--it){var Gt=$t[0][Ht],qt=$t[1][Ht];$t[0][Ht]=Gt+qt,$t[1][Ht]=Gt-qt}for(var Ht=0;Ht<3;Ht++)gt[Ht]=jt.nsPsy.last_en_subshort[un][Ht+6],u(jt.nsPsy.last_en_subshort[un][Ht+4]>0),Lt[Ht]=gt[Ht]/jt.nsPsy.last_en_subshort[un][Ht+4],Jt[0]+=gt[Ht];for(var Ht=0;Ht<9;Ht++){for(var De=Pt+64,st=1;Ptgt[Ht+3-2]?(u(gt[Ht+3-2]>0),st=st/gt[Ht+3-2]):gt[Ht+3-2]>st*10?(u(st>0),st=gt[Ht+3-2]/(st*10)):st=0,Lt[Ht+3]=st}for(var Ht=0;Ht<3;++Ht){var Ae=gt[Ht*3+3]+gt[Ht*3+4]+gt[Ht*3+5],nt=1;gt[Ht*3+5]*6Bt&&(ht[un][Ht/3]=Ht%3+1);for(var Ht=1;Ht<4;Ht++){var xt=Jt[Ht-1],Tt=Jt[Ht],St=Math.max(xt,Tt);St<4e4&&xt<1.7*Tt&&Tt<1.7*xt&&(Ht==1&&ht[un][0]<=ht[un][Ht]&&(ht[un][0]=0),ht[un][Ht]=0)}ht[un][0]<=jt.nsPsy.lastAttacks[un]&&(ht[un][0]=0),(jt.nsPsy.lastAttacks[un]==3||ht[un][0]+ht[un][1]+ht[un][2]+ht[un][3]!=0)&&(zt=0,ht[un][1]!=0&&ht[un][0]!=0&&(ht[un][1]=0),ht[un][2]!=0&&ht[un][1]!=0&&(ht[un][2]=0),ht[un][3]!=0&&ht[un][2]!=0&&(ht[un][3]=0)),un<2?wt[un]=zt:zt==0&&(wt[0]=wt[1]=0),ct[un]=jt.tot_ener[un]}}function Ee(je,Le,Xe){if(Xe==0)for(var qe=0;qe=0),ct>0){var pt=Le[Ye];pt0),ct=20*(pt*2-ct)/(ct*(je.numlines_s[Ye]+je.numlines_s[Ye+1]-1));var ht=0|ct;ht>tt&&(ht=tt),qe[Ye]=ht}else qe[Ye]=0;for(Ye=1;Ye=0),ct>0){var pt=Le[Ye-1];pt0),ct=20*(pt*3-ct)/(ct*(je.numlines_s[Ye-1]+je.numlines_s[Ye]+je.numlines_s[Ye+1]-1));var ht=0|ct;ht>tt&&(ht=tt),qe[Ye]=ht}else qe[Ye]=0;if(u(Ye>0),u(Ye==je.npart_s-1),ct=Xe[Ye-1]+Xe[Ye],u(ct>=0),ct>0){var pt=Le[Ye-1];pt0),ct=20*(pt*2-ct)/(ct*(je.numlines_s[Ye-1]+je.numlines_s[Ye]-1));var ht=0|ct;ht>tt&&(ht=tt),qe[Ye]=ht}else qe[Ye]=0;u(Ye==je.npart_s-1)}function Ne(je,Le,Xe,qe,tt,Ye){var ct=je.internal_flags,pt=new float[h.CBANDS],ht=o(h.CBANDS),wt,$t,jt,Nt=new int[h.CBANDS];for(jt=$t=0;jt=0),pt[jt]=un,u(Tn>0),ht[jt]=Yt/Tn,u(ht[jt]>=0)}for(u(jt==ct.npart_s),u($t==129);jtgt&&(qe[jt]=gt),ct.masking_lower>1&&(qe[jt]*=ct.masking_lower),qe[jt]>Xe[jt]&&(qe[jt]=Xe[jt]),ct.masking_lower<1&&(qe[jt]*=ct.masking_lower),u(qe[jt]>=0)}for(;jt0?qe[ht]=Math.min(jt,Dn):qe[ht]=Math.min(jt,Xe[ht]*R)}else{var it=y*je.nb_2[tt][ht],Lt=g*je.nb_1[tt][ht],Dn;it<=0&&(it=jt),Lt<=0&&(Lt=jt),je.blocktype_old[tt&1]==h.NORM_TYPE?Dn=Math.min(Lt,it):Dn=Lt,qe[ht]=Math.min(jt,Dn)}je.nb_2[tt][ht]=je.nb_1[tt][ht],je.nb_1[tt][ht]=jt,$t=Ye[ht],$t*=je.minval_l[ht],$t*=Nt,qe[ht]>$t&&(qe[ht]=$t),je.masking_lower>1&&(qe[ht]*=je.masking_lower),qe[ht]>Xe[ht]&&(qe[ht]=Xe[ht]),je.masking_lower<1&&(qe[ht]*=je.masking_lower),u(qe[ht]>=0)}for(;ht0?Math.pow(10,tt):1,wt,$t,jt=0;jt0){var Lt,gt,Jt=qe[jt]*ht;if(Lt=Math.min(Math.max(un,Jt),Math.max(Tn,Jt)),Ht=Math.max($t,Jt),fn=Math.max(wt,Jt),gt=Ht+fn,gt>0&&Lt*pt0)}$t=Math.min(Ht,$t),wt=Math.min(fn,wt)}$t>Nt&&($t=Nt),wt>Yt&&(wt=Yt),Le[2][jt]=$t,Le[3][jt]=wt}}this.L3psycho_anal_vbr=function(je,Le,Xe,qe,tt,Ye,ct,pt,ht,wt){var $t=je.internal_flags,jt,Nt,Yt=o(h.HBLKSIZE),un=l([3,h.HBLKSIZE_s]),Tn=l([2,h.BLKSIZE]),Ht=l([2,3,h.BLKSIZE_s]),fn=l([4,h.CBANDS]),Dn=l([4,h.CBANDS]),it=l([4,3]),Lt=.6,gt=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],Jt=c(2),Wt=je.mode==MPEGMode.JOINT_STEREO?4:$t.channels_out;_e(je,Le,Xe,qe,tt,Ye,ht,it,gt,Jt),ke(je,Jt);{for(var Pt=0;Pt=2||gt[Pt][zt+1]==1){var st=zt!=0?zt-1:2,Ae=ue($t.thm[Pt].s[Gt][st],De,I*Lt);De=Math.min(De,Ae)}else if(gt[Pt][zt]==1){var st=zt!=0?zt-1:2,Ae=ue($t.thm[Pt].s[Gt][st],De,R*Lt);De=Math.min(De,Ae)}else if(zt!=0&>[Pt][zt-1]==3||zt==0&&$t.nsPsy.lastAttacks[Pt]==3){var st=zt!=2?zt+1:0,Ae=ue($t.thm[Pt].s[Gt][st],De,R*Lt);De=Math.min(De,Ae)}De*=it[Pt][zt],qt[zt]=De}for(var zt=0;zt<3;zt++)$t.thm[Pt].s[Gt][zt]=qt[zt]}}}for(var Pt=0;Pt1?(nt=pt,_t=-2,xt=h.NORM_TYPE,(wt[0]==h.SHORT_TYPE||wt[1]==h.SHORT_TYPE)&&(xt=h.SHORT_TYPE),Tt=Ye[qe][Pt-2]):(nt=ct,_t=0,xt=wt[Pt],Tt=tt[qe][Pt]),xt==h.SHORT_TYPE?nt[_t+Pt]=G(Tt,$t.masking_lower):nt[_t+Pt]=ge(Tt,$t.masking_lower),je.analysis&&($t.pinfo.pe[qe][Pt]=nt[_t+Pt])}return 0};function Te(je,Le){var Xe=je,qe;return Xe>=0?qe=-Xe*27:qe=Xe*Le,qe<=-72?0:Math.exp(qe*F)}function Be(je){var Le=0,Xe=0;{var qe=0,tt,Ye;for(qe=0;Te(qe,je)>1e-20;qe-=1);for(tt=qe,Ye=0;Math.abs(Ye-tt)>1e-12;)qe=(Ye+tt)/2,Te(qe,je)>0?Ye=qe:tt=qe;Le=tt}{var qe=0,tt,Ye;for(qe=0;Te(qe,je)>1e-20;qe+=1);for(tt=0,Ye=qe;Math.abs(Ye-tt)>1e-12;)qe=(Ye+tt)/2,Te(qe,je)>0?tt=qe:Ye=qe;Xe=Ye}{var ct=0,pt=1e3,ht;for(ht=0;ht<=pt;++ht){var qe=Le+ht*(Xe-Le)/pt,wt=Te(qe,je);ct+=wt}{var $t=(pt+1)/(ct*(Xe-Le));return $t}}}function He(je){var Le,Xe,qe,tt;return Le=je,Le>=0?Le*=3:Le*=1.5,Le>=.5&&Le<=2.5?(tt=Le-.5,Xe=8*(tt*tt-2*tt)):Xe=0,Le+=.474,qe=15.811389+7.5*Le-17.5*Math.sqrt(1+Le*Le),qe<=-60?0:(Le=Math.exp((Xe+qe)*F),Le/=.6609193,Le)}function Je(je){return je<0&&(je=0),je=je*.001,13*Math.atan(.76*je)+3.5*Math.atan(je*je/(7.5*7.5))}function Me(je,Le,Xe,qe,tt,Ye,ct,pt,ht,wt,$t,jt){var Nt=o(h.CBANDS+1),Yt=pt/(jt>15?2*576:384),un=c(h.HBLKSIZE),Tn;pt/=ht;var Ht=0,fn=0;for(Tn=0;Tnht/2){Ht=ht/2,++Tn;break}}u(Tnht/2&&(Jt=ht/2),Xe[Lt]=(un[gt]+un[Jt])/2,Le[Lt]=un[Jt];var zt=Yt*Pt;ct[Lt]=(zt-Nt[Le[Lt]])/(Nt[Le[Lt]+1]-Nt[Le[Lt]]),ct[Lt]<0?ct[Lt]=0:ct[Lt]>1&&(ct[Lt]=1),Bt=Je(pt*wt[Lt]*$t),Bt=Math.min(Bt,15.5)/15.5,Ye[Lt]=Math.pow(10,1.25*(1-Math.cos(Math.PI*Bt))-2.5)}Ht=0;for(var Gt=0;Gt0);pt++);for(je[wt][0]=pt,pt=Le-1;pt>0&&!(ct[wt][pt]>0);pt--);je[wt][1]=pt,ht+=je[wt][1]-je[wt][0]+1}for(var Yt=o(ht),un=0,wt=0;wt=tt&&(Tn=pt*($t[Xe]-tt)/(Ye-tt)+ct*(Ye-$t[Xe])/(Ye-tt)),Nt[Xe]=Math.pow(10,Tn/10),Le.numlines_l[Xe]>0?Le.rnumlines_l[Xe]=1/Le.numlines_l[Xe]:Le.rnumlines_l[Xe]=0}Le.s3_ll=Re(Le.s3ind,Le.npart_l,$t,jt,Nt,qe);var Ht=0;for(Xe=0;XeLt&&(fn=Lt)}Le.ATH.cb_l[Xe]=fn,fn=-20+$t[Xe]*20/10,fn>6&&(fn=100),fn<-15&&(fn=-15),fn-=8,Le.minval_l[Xe]=Math.pow(10,fn/10)*Le.numlines_l[Xe]}for(Le.npart_s=Me(Le.numlines_s,Le.bo_s,Le.bm_s,$t,jt,Le.mld_s,Le.PSY.bo_s_weight,Yt,h.BLKSIZE_s,Le.scalefac_band.s,h.BLKSIZE_s/384,h.SBMAX_s),u(Le.npart_s=tt&&(Tn=wt*($t[Xe]-tt)/(Ye-tt)+ht*(Ye-$t[Xe])/(Ye-tt)),Nt[Xe]=Math.pow(10,Tn/10),fn=n.MAX_VALUE;for(var Dn=0;DnLt&&(fn=Lt)}Le.ATH.cb_s[Xe]=fn,fn=-7+$t[Xe]*7/12,$t[Xe]>12&&(fn*=1+Math.log(1+fn)*3.1),$t[Xe]<12&&(fn*=1+Math.log(1-fn)*2.3),fn<-15&&(fn=-15),fn-=8,Le.minval_s[Xe]=Math.pow(10,fn/10)*Le.numlines_s[Xe]}Le.s3_ss=Re(Le.s3ind_s,Le.npart_s,$t,jt,Nt,qe),j(),f.init_fft(Le),Le.decay=Math.exp(-1*b/(C*Yt/192));{var gt;gt=A,(je.exp_nspsytune&2)!=0&&(gt=1),Math.abs(je.msfix)>0&&(gt=je.msfix),je.msfix=gt;for(var Jt=0;JtLe.npart_l-1&&(Le.s3ind[Jt][1]=Le.npart_l-1)}var Wt=576*Le.mode_gr/Yt;if(Le.ATH.decay=Math.pow(10,-12/10*Wt),Le.ATH.adjust=.01,Le.ATH.adjustLimit=1,u(Le.bo_l[h.SBMAX_l-1]<=Le.npart_l),u(Le.bo_s[h.SBMAX_s-1]<=Le.npart_s),je.ATHtype!=-1){var it,Pt=je.out_samplerate/h.BLKSIZE,Bt=0;for(it=0,Xe=0;Xe=0;)Le.ATH.eql_w[Xe]*=Bt}{for(var Jt=Ht=0;Jt0;){F=O>g.sampleWindow-g.totsamp?g.sampleWindow-g.totsamp:O,LMAX_ORDER-L&&(F=MAX_ORDER-L)):(E=w+L,I=y,R=m+L,A=v),d(I,E,g.lstepbuf,g.lstep+g.totsamp,F,c[g.reqindex]),d(A,R,g.rstepbuf,g.rstep+g.totsamp,F,c[g.reqindex]),h(g.lstepbuf,g.lstep+g.totsamp,g.loutbuf,g.lout+g.totsamp,F,u[g.reqindex]),h(g.rstepbuf,g.rstep+g.totsamp,g.routbuf,g.rout+g.totsamp,F,u[g.reqindex]),E=g.lout+g.totsamp,I=g.loutbuf,R=g.rout+g.totsamp,A=g.routbuf;for(var X=F%8;X--!=0;)g.lsum+=f(I[E++]),g.rsum+=f(A[R++]);for(X=F/8;X--!=0;)g.lsum+=f(I[E+0])+f(I[E+1])+f(I[E+2])+f(I[E+3])+f(I[E+4])+f(I[E+5])+f(I[E+6])+f(I[E+7]),E+=8,g.rsum+=f(A[R+0])+f(A[R+1])+f(A[R+2])+f(A[R+3])+f(A[R+4])+f(A[R+5])+f(A[R+6])+f(A[R+7]),R+=8;if(O-=F,L+=F,g.totsamp+=F,g.totsamp==g.sampleWindow){var T=r.STEPS_per_dB*10*Math.log10((g.lsum+g.rsum)/g.totsamp*.5+1e-37),q=T<=0?0:0|T;q>=g.A.length&&(q=g.A.length-1),g.A[q]++,g.lsum=g.rsum=0,t.arraycopy(g.loutbuf,g.totsamp,g.loutbuf,0,MAX_ORDER),t.arraycopy(g.routbuf,g.totsamp,g.routbuf,0,MAX_ORDER),t.arraycopy(g.lstepbuf,g.totsamp,g.lstepbuf,0,MAX_ORDER),t.arraycopy(g.rstepbuf,g.totsamp,g.rstepbuf,0,MAX_ORDER),g.totsamp=0}if(g.totsamp>g.sampleWindow)return GAIN_ANALYSIS_ERROR}return z0&&!((m-=g[w])<=0););return i-w/r.STEPS_per_dB}this.GetTitleGain=function(g){for(var y=b(g.A,g.A.length),w=0;w>2&63,J>=32&&(J-=64),Z=Math.pow(10,J/4/10),J=T.exp_nspsytune>>8&63,J>=32&&(J-=64),B=Math.pow(10,J/4/10),J=T.exp_nspsytune>>14&63,J>=32&&(J-=64),V=Math.pow(10,J/4/10),J=T.exp_nspsytune>>20&63,J>=32&&(J-=64),N=V*Math.pow(10,J/4/10),J=0;Jd.MAX_BITS_PER_GRANULE&&(se=d.MAX_BITS_PER_GRANULE),j=0,W=0;WJ*3/4&&(k[W]=J*3/4),k[W]<0&&(k[W]=0),k[W]+H[W]>d.MAX_BITS_PER_CHANNEL&&(k[W]=Math.max(0,d.MAX_BITS_PER_CHANNEL-H[W])),j+=k[W];if(j>Y)for(W=0;Wd.MAX_BITS_PER_GRANULE){var ie=0;for(W=0;W.5&&(Z=.5);var B=0|Z*.5*(T[0]+T[1]);B>d.MAX_BITS_PER_CHANNEL-T[0]&&(B=d.MAX_BITS_PER_CHANNEL-T[0]),B<0&&(B=0),T[1]>=125&&(T[1]-B>125?(T[0]J&&(T[0]=J*T[0]/B,T[1]=J*T[1]/B),l(T[0]<=d.MAX_BITS_PER_CHANNEL),l(T[1]<=d.MAX_BITS_PER_CHANNEL),l(T[0]+T[1]<=d.MAX_BITS_PER_GRANULE)},this.athAdjust=function(T,q,H){var J=90.30873362,Z=94.82444863,B=i.FAST_LOG10_X(q,10),V=T*T,N=0;return B-=H,V>1e-20&&(N=1+i.FAST_LOG10_X(V,10/J)),N<0&&(N=0),B*=N,B+=H+J-Z,Math.pow(10,.1*B)},this.calc_xmin=function(T,q,H,J){var Z=0,B=T.internal_flags,V,N=0,j=0,k=B.ATH,W=H.xr,M=T.VBR==n.vbr_mtrh?1:0,Y=B.masking_lower;for((T.VBR==n.vbr_mtrh||T.VBR==n.vbr_mt)&&(Y=1),V=0;V>1,se=0;do{var we,Q;we=W[N]*W[N],se+=we,re+=we0);if(se>ie&&j++,V==c.SBPSY_l){var me=ie*B.nsPsy.longfact[V];re0){var me;me=se*q.thm.l[V]*Y/ue,M!=0&&(me*=B.nsPsy.longfact[V]),ie>1;oe=ne/ee,re=y;do{var we,Q;we=W[N]*W[N],se+=we,re+=we0);if(se>ne&&j++,te==c.SBPSY_s){var me=ne*B.nsPsy.shortfact[te];re0){var me;me=se*q.thm.s[te][ge]*Y/ue,M!=0&&(me*=B.nsPsy.shortfact[te]),ieJ[Z-3+1]&&(J[Z-3+1]+=(J[Z-3]-J[Z-3+1])*B.decay),J[Z-3+1]>J[Z-3+2]&&(J[Z-3+2]+=(J[Z-3+1]-J[Z-3+2])*B.decay))}return j};function X(T){this.s=T}this.calc_noise_core=function(T,q,H,J){var Z=0,B=q.s,V=T.l3_enc;if(B>T.count1)for(;H--!=0;){var N;N=T.xr[B],B++,Z+=N*N,N=T.xr[B],B++,Z+=N*N}else if(B>T.big_values){var j=a(2);for(j[0]=0,j[1]=J;H--!=0;){var N;N=Math.abs(T.xr[B])-j[V[B]],B++,Z+=N*N,N=Math.abs(T.xr[B])-j[V[B]],B++,Z+=N*N}}else for(;H--!=0;){var N;N=Math.abs(T.xr[B])-A[V[B]]*J,B++,Z+=N*N,N=Math.abs(T.xr[B])-A[V[B]]*J,B++,Z+=N*N}return q.s=B,Z},this.calc_noise=function(T,q,H,J,Z){var B=0,V=0,N,j,k=0,W=0,M=0,Y=-20,se=0,ie=T.scalefac,oe=0;for(J.over_SSD=0,N=0;N>1,se+T.width[N]>T.max_nonzero_coeff){var we;we=T.max_nonzero_coeff-se+1,we>0?j=we>>1:j=0}var Q=new X(se);ee=this.calc_noise_core(T,Q,j,pe),se=Q.s,Z!=null&&(Z.step[N]=re,Z.noise[N]=ee),ee=H[B++]=ee/q[V++],ee=i.FAST_LOG10(Math.max(ee,1e-20)),Z!=null&&(Z.noise_log[N]=ee)}if(Z!=null&&(Z.global_gain=T.global_gain),M+=ee,ee>0){var me;me=Math.max(0|ee*10+.5,1),J.over_SSD+=me*me,k++,W+=ee}Y=Math.max(Y,ee)}return J.over_count=k,J.tot_noise=M,J.over_noise=W,J.max_noise=Y,k},this.set_pinfo=function(T,q,H,J,Z){var B=T.internal_flags,V,N,j,k,W,M=q.scalefac_scale==0?.5:1,Y=q.scalefac,se=a(L3Side.SFBMAX),ie=a(L3Side.SFBMAX),oe=new CalcNoiseResult;calc_xmin(T,H,q,se),calc_noise(q,se,ie,oe,null);var re=0;for(N=q.sfb_lmax,q.block_type!=c.SHORT_TYPE&&q.mixed_block_flag==0&&(N=22),V=0;V0&&!T.ATHonly?k=k/H.en.l[V]:k=0,B.pinfo.thr[J][Z][V]=W*Math.max(k*H.thm.l[V],B.ATH.l[V]),B.pinfo.LAMEsfb[J][Z][V]=0,q.preflag!=0&&V>=11&&(B.pinfo.LAMEsfb[J][Z][V]=-M*E[V]),V=0),B.pinfo.LAMEsfb[J][Z][V]-=M*Y[V])}if(q.block_type==c.SHORT_TYPE)for(N=V,V=q.sfb_smin;V0?k=k/H.en.s[V][Q]:k=0,(T.ATHonly||T.ATHshort)&&(k=0),B.pinfo.thr_s[J][Z][3*V+Q]=W*Math.max(k*H.thm.s[V][Q],B.ATH.s[V]),B.pinfo.LAMEsfb_s[J][Z][3*V+Q]=-2*q.subblock_gain[Q],V0),V=V>>1;V--!=0;)W[M++]=Y>j[k++]?0:1,W[M++]=Y>j[k++]?0:1}function b(V,N,j,k,W,M){i(V>0),V=V>>1;var Y=V%2;for(V=V>>1;V--!=0;){var se,ie,oe,re,ee,pe,we,Q;se=j[k++]*N,ie=j[k++]*N,ee=0|se,oe=j[k++]*N,pe=0|ie,re=j[k++]*N,we=0|oe,se+=d.adj43[ee],Q=0|re,ie+=d.adj43[pe],W[M++]=0|se,oe+=d.adj43[we],W[M++]=0|ie,re+=d.adj43[Q],W[M++]=0|oe,W[M++]=0|re}if(Y!=0){var se,ie,ee,pe;se=j[k++]*N,ie=j[k++]*N,ee=0|se,pe=0|ie,se+=d.adj43[ee],ie+=d.adj43[pe],W[M++]=0|se,W[M++]=0|ie}}function g(V,N,j,k,W){var M,Y,se=0,ie,oe=0,re=0,ee=0,pe=N,we=0,Q=pe,me=0,ue=V,U=0;for(ie=W!=null&&k.global_gain==W.global_gain,k.block_type==a.SHORT_TYPE?Y=38:Y=21,M=0;M<=Y;M++){var G=-1;if((ie||k.block_type==a.NORM_TYPE)&&(G=k.global_gain-(k.scalefac[M]+(k.preflag!=0?d.pretab[M]:0)<=0),ie&&W.step[M]==G)oe!=0&&(b(oe,j,ue,U,Q,me),oe=0),re!=0&&(f(re,j,ue,U,Q,me),re=0);else{var te=k.width[M];if(se+k.width[M]>k.max_nonzero_coeff){var ge;ge=k.max_nonzero_coeff-se+1,n.fill(N,k.max_nonzero_coeff,576,0),te=ge,te<0&&(te=0),M=Y+1}if(oe==0&&re==0&&(Q=pe,me=we,ue=V,U=ee),W!=null&&W.sfb_count1>0&&M>=W.sfb_count1&&W.step[M]>0&&G>=W.step[M]?(oe!=0&&(b(oe,j,ue,U,Q,me),oe=0,Q=pe,me=we,ue=V,U=ee),re+=te):(re!=0&&(f(re,j,ue,U,Q,me),re=0,Q=pe,me=we,ue=V,U=ee),oe+=te),te<=0){re!=0&&(f(re,j,ue,U,Q,me),re=0),oe!=0&&(b(oe,j,ue,U,Q,me),oe=0);break}}M<=Y&&(we+=k.width[M],ee+=k.width[M],se+=k.width[M])}oe!=0&&(b(oe,j,ue,U,Q,me),oe=0),re!=0&&(f(re,j,ue,U,Q,me),re=0)}function y(V,N,j){var k=0,W=0;do{var M=V[N++],Y=V[N++];k14&&(oe=15,se+=Y),oe*=16),re!=0&&(re>14&&(re=15,se+=Y),oe+=re),se+=o.largetbl[oe]}while(N>=16,se>ie&&(se=ie,k=W),M.bits+=se,k}function v(V,N,j,k){var W=0,M=o.ht[1].hlen;do{var Y=V[N+0]*2+V[N+1];N+=2,W+=M[Y]}while(N>=16,M>Y&&(M=Y,k++),W.bits+=M,k}function z(V,N,j,k,W){var M=0,Y=0,se=0,ie=o.ht[k].xlen,oe=o.ht[k].hlen,re=o.ht[k+1].hlen,ee=o.ht[k+2].hlen;do{var pe=V[N+0]*ie+V[N+1];N+=2,M+=oe[pe],Y+=re[pe],se+=ee[pe]}while(NY&&(M=Y,we++),M>se&&(M=se,we=k+2),W.bits+=M,we}var C=[1,2,5,7,7,10,10,13,13,13,13,13,13,13,13];function E(V,N,j,k){var W=y(V,N,j);switch(W){case 0:return W;case 1:return v(V,N,j,k);case 2:case 3:return m(V,N,j,C[W-1],k);case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:case 15:return z(V,N,j,C[W-1],k);default:if(W>c.IXMAX_VAL)return k.bits=c.LARGE_BITS,-1;W-=15;var M;for(M=24;M<32&&!(o.ht[M].linmax>=W);M++);var Y;for(Y=M-8;Y<24&&!(o.ht[Y].linmax>=W);Y++);return w(V,N,j,Y,M,k)}}this.noquant_count_bits=function(V,N,j){var k=N.l3_enc,W=Math.min(576,N.max_nonzero_coeff+2>>1<<1);for(j!=null&&(j.sfb_count1=0);W>1&&(k[W-1]|k[W-2])==0;W-=2);N.count1=W;for(var M=0,Y=0;W>3;W-=4){var se;if(((k[W-1]|k[W-2]|k[W-3]|k[W-4])&2147483647)>1)break;se=((k[W-4]*2+k[W-3])*2+k[W-2])*2+k[W-1],M+=o.t32l[se],Y+=o.t33l[se]}var ie=M;if(N.count1table_select=0,M>Y&&(ie=Y,N.count1table_select=1),N.count1bits=ie,N.big_values=W,W==0)return ie;if(N.block_type==a.SHORT_TYPE)M=3*V.scalefac_band.s[3],M>N.big_values&&(M=N.big_values),Y=N.big_values;else if(N.block_type==a.NORM_TYPE){if(i(W<=576),M=N.region0_count=V.bv_scf[W-2],Y=N.region1_count=V.bv_scf[W-1],i(M+Y+2Y&&(M=Y);if(M=Math.min(M,W),Y=Math.min(Y,W),i(M>=0),i(Y>=0),0M)return c.LARGE_BITS;if(g(N,W,d.IPOW20(j.global_gain),j,k),(V.substep_shaping&2)!=0)for(var Y=0,se=j.global_gain+j.scalefac_scale,ie=.634521682242439/d.IPOW20(se),oe=0;oe=0),V.pseudohalf[oe]==0)Y+=re;else{var ee;for(ee=Y,Y+=re;ee=ie?W[ee]:0}}return this.noquant_count_bits(V,j,k)};function I(V,N,j,k,W,M,Y){for(var se=N.big_values,ie=0;ie<=22;ie++)k[ie]=c.LARGE_BITS;for(var ie=0;ie<16;ie++){var oe=V.scalefac_band.l[ie+1];if(oe>=se)break;var re=0,ee=new h(re),pe=E(j,0,oe,ee);re=ee.bits;for(var we=0;we<8;we++){var Q=V.scalefac_band.l[ie+we+2];if(Q>=se)break;var me=re;ee=new h(me);var ue=E(j,oe,Q,ee);me=ee.bits,k[ie+we]>me&&(k[ie+we]=me,W[ie+we]=ie,M[ie+we]=pe,Y[ie+we]=ue)}}}function R(V,N,j,k,W,M,Y,se){for(var ie=N.big_values,oe=2;oe=ie)break;var ee=W[oe-2]+N.count1bits;if(j.part2_3_length<=ee)break;var pe=new h(ee),we=E(k,re,ie,pe);ee=pe.bits,!(j.part2_3_length<=ee)&&(j.assign(N),j.part2_3_length=ee,j.region0_count=M[oe-2],j.region1_count=oe-2-M[oe-2],j.table_select[0]=Y[oe-2],j.table_select[1]=se[oe-2],j.table_select[2]=we)}}this.best_huffman_divide=function(V,N){var j=new l,k=N.l3_enc,W=r(23),M=r(23),Y=r(23),se=r(23);if(!(N.block_type==a.SHORT_TYPE&&V.mode_gr==1)){j.assign(N),N.block_type==a.NORM_TYPE&&(I(V,N,k,W,M,Y,se),R(V,j,N,k,W,M,Y,se));var ie=j.big_values;if(!(ie==0||(k[ie-2]|k[ie-1])>1)&&(ie=N.count1+2,!(ie>576))){j.assign(N),j.count1=ie;var oe=0,re=0;for(i(ie<=576);ie>j.big_values;ie-=4){var ee=((k[ie-4]*2+k[ie-3])*2+k[ie-2])*2+k[ie-1];oe+=o.t32l[ee],re+=o.t33l[ee]}if(j.big_values=ie,j.count1table_select=0,oe>re&&(oe=re,j.count1table_select=1),j.count1bits=oe,j.block_type==a.NORM_TYPE)R(V,j,N,k,W,M,Y,se);else{if(j.part2_3_length=oe,oe=V.scalefac_band.l[8],oe>ie&&(oe=ie),oe>0){var pe=new h(j.part2_3_length);j.table_select[0]=E(k,0,oe,pe),j.part2_3_length=pe.bits}if(ie>oe){var pe=new h(j.part2_3_length);j.table_select[1]=E(k,oe,ie,pe),j.part2_3_length=pe.bits}N.part2_3_length>j.part2_3_length&&N.assign(j)}}}};var A=[1,1,1,1,8,2,2,2,4,4,4,8,8,8,16,16],O=[1,2,4,8,1,2,4,8,2,4,8,2,4,8,4,8],F=[0,0,0,0,3,1,1,1,2,2,2,3,3,3,4,4],L=[0,1,2,3,0,1,2,3,1,2,3,1,2,3,2,3];u.slen1_tab=F,u.slen2_tab=L;function X(V,N){for(var j,k=N.tt[1][V],W=N.tt[0][V],M=0;M=0);j++);if(j==o.scfsi_band[M+1]){for(j=o.scfsi_band[M];jre&&(k.part2_length=re,k.scalefac_compress=M)}}this.best_scalefac_store=function(V,N,j,k){var W=k.tt[N][j],M,Y,se,ie,oe=0;for(se=0,M=0;M=0),se+=re,ie=-re;ie<0&&W.l3_enc[ie+se]==0;ie++);ie==0&&(W.scalefac[M]=oe=-2)}if(W.scalefac_scale==0&&W.preflag==0){var ee=0;for(M=0;M0&&(ee|=W.scalefac[M]);if((ee&1)==0&&ee!=0){for(M=0;M0&&(W.scalefac[M]>>=1);W.scalefac_scale=oe=1}}if(W.preflag==0&&W.block_type!=a.SHORT_TYPE&&V.mode_gr==2){for(M=11;M0&&(W.scalefac[M]-=d.pretab[M]);W.preflag=oe=1}}for(Y=0;Y<4;Y++)k.scfsi[j][Y]=0;for(V.mode_gr==2&&N==1&&k.tt[0][j].block_type!=a.SHORT_TYPE&&k.tt[1][j].block_type!=a.SHORT_TYPE&&(X(j,k),oe=0),M=0;MM[N]&&(V.part2_length=M[N],V.scalefac_compress=N);return V.part2_length==c.LARGE_BITS};var Z=[[15,15,7,7],[15,15,7,0],[7,3,0,0],[15,31,31,0],[7,7,7,0],[3,3,0,0]];this.scale_bitcount_lsf=function(V,N){var j,k,W,M,Y,se,ie,oe,re=r(4),ee=N.scalefac;for(N.preflag!=0?j=2:j=0,ie=0;ie<4;ie++)re[ie]=0;if(N.block_type==a.SHORT_TYPE){k=1;var pe=d.nr_of_sfb_block[j][k];for(oe=0,W=0;W<4;W++)for(M=pe[W]/3,ie=0;iere[W]&&(re[W]=ee[oe*3+Y])}else{k=0;var pe=d.nr_of_sfb_block[j][k];for(oe=0,W=0;W<4;W++)for(M=pe[W],ie=0;iere[W]&&(re[W]=ee[oe])}for(se=!1,W=0;W<4;W++)re[W]>Z[j][W]&&(se=!0);if(!se){var we,Q,me,ue;for(N.sfb_partition_table=d.nr_of_sfb_block[j][k],W=0;W<4;W++)N.slen[W]=B[re[W]];switch(we=N.slen[0],Q=N.slen[1],me=N.slen[2],ue=N.slen[3],j){case 0:N.scalefac_compress=(we*5+Q<<4)+(me<<2)+ue;break;case 1:N.scalefac_compress=400+(we*5+Q<<2)+me;break;case 2:N.scalefac_compress=500+we*3+Q;break;default:t.err.printf(`intensity stereo not implemented yet +`);break}}if(!se)for(i(N.sfb_partition_table!=null),N.part2_length=0,W=0;W<4;W++)N.part2_length+=N.slen[W]*N.sfb_partition_table[W];return se};var B=[0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4];this.huffman_init=function(V){for(var N=2;N<=576;N+=2){for(var j=0,k;V.scalefac_band.l[++j]N;)k--;for(k<0&&(k=p[j][0]),V.bv_scf[N-2]=k,k=p[j][1];V.scalefac_band.l[k+V.bv_scf[N-2]+2]>N;)k--;k<0&&(k=p[j][1]),V.bv_scf[N-1]=k}}}return V_=u,V_}var H_,TI;function S7(){if(TI)return H_;TI=1;var e=Qi(),t=e.System;e.VbrMode,e.Float,e.ShortBlock,e.Util;var n=e.Arrays;e.new_array_n;var r=e.new_byte;e.new_double,e.new_float;var i=e.new_float_n,a=e.new_int;e.new_int_n;var o=e.assert,l=$7(),c=I4(),u=Ho(),d=t2();h.EQ=function(p,f){return Math.abs(p)>Math.abs(f)?Math.abs(p-f)<=Math.abs(p)*1e-6:Math.abs(p-f)<=Math.abs(f)*1e-6},h.NEQ=function(p,f){return!h.EQ(p,f)};function h(){var p=this,f=32773,b=32,g=null,y=null,w=null,v=null;this.setModules=function(N,j,k,W){g=N,y=j,w=k,v=W};var m=null,z=0,C=0,E=0;this.getframebits=function(N){var j=N.internal_flags,k;j.bitrate_index!=0?k=c.bitrate_table[N.version][j.bitrate_index]:k=N.brate,o(8<=k&&k<=640);var W=0|(N.version+1)*72e3*k/N.out_samplerate+j.padding;return 8*W};function I(N){t.arraycopy(N.header[N.w_ptr].buf,0,m,C,N.sideinfo_len),C+=N.sideinfo_len,z+=N.sideinfo_len*8,N.w_ptr=N.w_ptr+1&d.MAX_HEADER_BUF-1}function R(N,j,k){for(o(k0;){var W;E==0&&(E=8,C++,o(C=z),N.header[N.w_ptr].write_timing==z&&I(N),m[C]=0),W=Math.min(k,E),k-=W,E-=W,o(k>k<0;){var W;E==0&&(E=8,C++,o(C>k<=0),j>=8&&(R(k,76,8),j-=8),j>=8&&(R(k,65,8),j-=8),j>=8&&(R(k,77,8),j-=8),j>=8&&(R(k,69,8),j-=8),j>=32){var M=w.getLameShortVersion();if(j>=32)for(W=0;W=8;++W)j-=8,R(k,M.charAt(W),8)}for(;j>=1;j-=1)R(k,k.ancillary_flag,1),k.ancillary_flag^=N.disable_reservoir?0:1;o(j==0)}function F(N,j,k){for(var W=N.header[N.h_ptr].ptr;k>0;){var M=Math.min(k,8-(W&7));k-=M,o(k>3]|=j>>k<<8-(W&7)-M,W+=M}N.header[N.h_ptr].ptr=W}function L(N,j){N<<=8;for(var k=0;k<8;k++)N<<=1,j<<=1,((j^N)&65536)!=0&&(j^=f);return j}this.CRC_writeheader=function(N,j){var k=65535;k=L(j[2]&255,k),k=L(j[3]&255,k);for(var W=6;W>8),j[5]=byte(k&255)};function X(N,j){var k=N.internal_flags,W,M,Y;if(W=k.l3_side,k.header[k.h_ptr].ptr=0,n.fill(k.header[k.h_ptr].buf,0,k.sideinfo_len,0),N.out_samplerate<16e3?F(k,4094,12):F(k,4095,12),F(k,N.version,1),F(k,1,2),F(k,N.error_protection?0:1,1),F(k,k.bitrate_index,4),F(k,k.samplerate_index,2),F(k,k.padding,1),F(k,N.extension,1),F(k,N.mode.ordinal(),2),F(k,k.mode_ext,2),F(k,N.copyright,1),F(k,N.original,1),F(k,N.emphasis,2),N.error_protection&&F(k,0,16),N.version==1){for(o(W.main_data_begin>=0),F(k,W.main_data_begin,9),k.channels_out==2?F(k,W.private_bits,3):F(k,W.private_bits,5),Y=0;Y=0),F(k,W.main_data_begin,8),F(k,W.private_bits,k.channels_out),M=0,Y=0;Y0;--W){var ie=0,oe=0,re;re=j.l3_enc[Y+0],re!=0&&(oe+=8,j.xr[se+0]<0&&ie++,o(re<=1)),re=j.l3_enc[Y+1],re!=0&&(oe+=4,ie*=2,j.xr[se+1]<0&&ie++,o(re<=1)),re=j.l3_enc[Y+2],re!=0&&(oe+=2,ie*=2,j.xr[se+2]<0&&ie++,o(re<=1)),re=j.l3_enc[Y+3],re!=0&&(oe++,ie*=2,j.xr[se+3]<0&&ie++,o(re<=1)),Y+=4,se+=4,R(N,ie+k.table[oe],k.hlen[oe]),M+=k.hlen[oe]}return M}function q(N,j,k,W,M){var Y=c.ht[j],se=0;if(o(j<32),j==0)return se;for(var ie=k;ie15){if(Q>14){var ue=Q-15;o(ue<=Y.linmax),we|=ue<<1,re=ee,Q=15}if(me>14){var U=me-15;o(U<=Y.linmax),we<<=ee,we|=U,re+=ee,me=15}pe=16}me!=0&&(we<<=1,M.xr[ie+1]<0&&we++,oe--),o((Q|me)<16),Q=Q*pe+me,re-=oe,oe+=Y.hlen[Q],o(oe<=b),o(re<=b),R(N,Y.table[Q],oe),R(N,we,re),se+=oe+re}return se}function H(N,j){var k=3*N.scalefac_band.s[3];k>j.big_values&&(k=j.big_values);var W=q(N,j.table_select[0],0,k,j);return W+=q(N,j.table_select[1],k,j.big_values,j),W}function J(N,j){var k,W,M,Y;k=j.big_values,o(0<=k&&k<=576);var se=j.region0_count+1;return o(0<=se),o(sek&&(M=k),Y>k&&(Y=k),W=q(N,j.table_select[0],0,M,j),W+=q(N,j.table_select[1],M,Y,j),W+=q(N,j.table_select[2],Y,k,j),W}function Z(N){var j,k,W,M,Y=0,se=N.internal_flags,ie=se.l3_side;if(N.version==1)for(j=0;j<2;j++)for(k=0;k=0&&(M=1+se-ie,se0&&(EQ(N.scale,1)||EQ(N.scale,0))?j.noclipScale=Math.floor(32767/j.PeakSample*100)/100:j.noclipScale=-1)}},this.add_dummy_byte=function(N,j,k){for(var W=N.internal_flags,M;k-- >0;)for(A(W,j,8),M=0;M ResvSize"),k.main_data_begin*8!=j.ResvSize&&(t.err.printf(`bit reservoir error: +l3_side.main_data_begin: %d +Resvoir size: %d +resv drain (post) %d +resv drain (pre) %d +header and sideinfo: %d +data bits: %d +total bits: %d (remainder: %d) +bitsperframe: %d +`,8*k.main_data_begin,j.ResvSize,k.resvDrain_post,k.resvDrain_pre,8*j.sideinfo_len,M-k.resvDrain_post-8*j.sideinfo_len,M,M%8,W),t.err.println("This is a fatal error. It has several possible causes:"),t.err.println("90%% LAME compiled with buggy version of gcc using advanced optimizations"),t.err.println(" 9%% Your system is overclocked"),t.err.println(" 1%% bug in LAME encoding library"),j.ResvSize=k.main_data_begin*8),o(z%8==0),z>1e9){var Y;for(Y=0;YW)return-1;if(t.arraycopy(m,0,j,k,Y),C=-1,E=0,M!=0){var se=a(1);if(se[0]=N.nMusicCRC,v.updateMusicCRC(se,j,k,Y),N.nMusicCRC=se[0],Y>0&&(N.VBR_seek_table.nBytesWritten+=Y),N.decode_on_the_fly){for(var ie=i([2,1152]),oe=Y,re=-1,ee;re!=0;)if(re=y.hip_decode1_unclipped(N.hip,j,k,oe,ie[0],ie[1]),oe=0,re==-1&&(re=0),re>0){if(o(re<=1152),N.findPeakSample){for(ee=0;eeN.PeakSample?N.PeakSample=ie[0][ee]:-ie[0][ee]>N.PeakSample&&(N.PeakSample=-ie[0][ee]);if(N.channels_out>1)for(ee=0;eeN.PeakSample?N.PeakSample=ie[1][ee]:-ie[1][ee]>N.PeakSample&&(N.PeakSample=-ie[1][ee])}if(N.findReplayGain&&g.AnalyzeSamples(N.rgdata,ie[0],0,ie[1],0,re,N.channels_out)==GainAnalysis.GAIN_ANALYSIS_ERROR)return-6}}}return Y},this.init_bit_stream_w=function(N){m=r(Lame.LAME_MAXMP3BUFFER),N.h_ptr=N.w_ptr=0,N.header[N.h_ptr].write_timing=0,C=-1,E=0,z=0}}return H_=h,H_}var G_,RI;function ede(){if(RI)return G_;RI=1;var e=Qi(),t=e.System,n=e.VbrMode;e.Float;var r=e.ShortBlock;e.Util,e.Arrays,e.new_array_n,e.new_byte,e.new_double;var i=e.new_float;e.new_float_n,e.new_int;var a=e.new_int_n,o=e.new_short_n,l=e.assert,c=Gue(),u=que(),d=t2(),h=Jue(),p=Zue(),f=Que(),b=S7(),g=I4(),y=Ho();function w(){var v=this,m=128*1024;w.V9=410,w.V8=420,w.V7=430,w.V6=440,w.V5=450,w.V4=460,w.V3=470,w.V2=480,w.V1=490,w.V0=500,w.R3MIX=1e3,w.STANDARD=1001,w.EXTREME=1002,w.INSANE=1003,w.STANDARD_FAST=1004,w.EXTREME_FAST=1005,w.MEDIUM=1006,w.MEDIUM_FAST=1007;var z=16384+m;w.LAME_MAXMP3BUFFER=z;var C,E,I,R,A,O=new c,F,L,X;this.enc=new y,this.setModules=function(G,te,ge,ne,le,fe,be,de,$e){C=G,E=te,I=ge,R=ne,A=le,F=fe,L=de,X=$e,this.enc.setModules(E,O,R,F)};function T(){this.mask_adjust=0,this.mask_adjust_short=0,this.bo_l_weight=i(y.SBMAX_l),this.bo_s_weight=i(y.SBMAX_s)}function q(){this.lowerlimit=0}function H(G,te){this.lowpass=te}var J=4294479419;function Z(G){var te;return G.class_id=J,te=G.internal_flags=new d,G.mode=MPEGMode.NOT_SET,G.original=1,G.in_samplerate=44100,G.num_channels=2,G.num_samples=-1,G.bWriteVbrTag=!0,G.quality=-1,G.short_blocks=null,te.subblock_gain=-1,G.lowpassfreq=0,G.highpassfreq=0,G.lowpasswidth=-1,G.highpasswidth=-1,G.VBR=n.vbr_off,G.VBR_q=4,G.ATHcurve=-1,G.VBR_mean_bitrate_kbps=128,G.VBR_min_bitrate_kbps=0,G.VBR_max_bitrate_kbps=0,G.VBR_hard_min=0,te.VBR_min_bitrate=1,te.VBR_max_bitrate=13,G.quant_comp=-1,G.quant_comp_short=-1,G.msfix=-1,te.resample_ratio=1,te.OldValue[0]=180,te.OldValue[1]=180,te.CurrentStep[0]=4,te.CurrentStep[1]=4,te.masking_lower=1,te.nsPsy.attackthre=-1,te.nsPsy.attackthre_s=-1,G.scale=-1,G.athaa_type=-1,G.ATHtype=-1,G.athaa_loudapprox=-1,G.athaa_sensitivity=0,G.useTemporal=null,G.interChRatio=-1,te.mf_samples_to_encode=y.ENCDELAY+y.POSTDELAY,G.encoder_padding=0,te.mf_size=y.ENCDELAY-y.MDCTDELAY,G.findReplayGain=!1,G.decode_on_the_fly=!1,te.decode_on_the_fly=!1,te.findReplayGain=!1,te.findPeakSample=!1,te.RadioGain=0,te.AudiophileGain=0,te.noclipGainChange=0,te.noclipScale=-1,G.preset=0,G.write_id3tag_automatic=!0,0}this.lame_init=function(){var G=new u;return Z(G),G.lame_allocated_gfp=1,G};function B(G){return G>1?0:G<=0?1:Math.cos(Math.PI/2*G)}this.nearestBitrateFullIndex=function(G){var te=[8,16,24,32,40,48,56,64,80,96,112,128,160,192,224,256,320],ge=0,ne=0,le=0,fe=0;fe=te[16],le=16,ne=te[16],ge=16;for(var be=0;be<16;be++)if(Math.max(G,te[be+1])!=G){fe=te[be+1],le=be+1,ne=te[be],ge=be;break}return fe-G>G-ne?ge:le};function V(G,te){var ge=44100;return te>=48e3?ge=48e3:te>=44100?ge=44100:te>=32e3?ge=32e3:te>=24e3?ge=24e3:te>=22050?ge=22050:te>=16e3?ge=16e3:te>=12e3?ge=12e3:te>=11025?ge=11025:te>=8e3&&(ge=8e3),G==-1?ge:(G<=15960&&(ge=44100),G<=15250&&(ge=32e3),G<=11220&&(ge=24e3),G<=9970&&(ge=22050),G<=7230&&(ge=16e3),G<=5420&&(ge=12e3),G<=4510&&(ge=11025),G<=3970&&(ge=8e3),te44100?48e3:te>32e3?44100:te>24e3?32e3:te>22050?24e3:te>16e3?22050:te>12e3?16e3:te>11025?12e3:te>8e3?11025:8e3:ge)}function N(G,te){switch(G){case 44100:return te.version=1,0;case 48e3:return te.version=1,1;case 32e3:return te.version=1,2;case 22050:return te.version=0,0;case 24e3:return te.version=0,1;case 16e3:return te.version=0,2;case 11025:return te.version=0,0;case 12e3:return te.version=0,1;case 8e3:return te.version=0,2;default:return te.version=0,-1}}function j(G,te,ge){ge<16e3&&(te=2);for(var ne=g.bitrate_table[te][1],le=2;le<=14;le++)g.bitrate_table[te][le]>0&&Math.abs(g.bitrate_table[te][le]-G)0&&g.bitrate_table[te][ne]==G)return ne;return-1}function W(G,te){var ge=[new H(8,2e3),new H(16,3700),new H(24,3900),new H(32,5500),new H(40,7e3),new H(48,7500),new H(56,1e4),new H(64,11e3),new H(80,13500),new H(96,15100),new H(112,15600),new H(128,17e3),new H(160,17500),new H(192,18600),new H(224,19400),new H(256,19700),new H(320,20500)],ne=v.nearestBitrateFullIndex(te);G.lowerlimit=ge[ne].lowpass}function M(G){var te=G.internal_flags,ge=32,ne=-1;if(te.lowpass1>0){for(var le=999,fe=0;fe<=31;fe++){var be=fe/31;be>=te.lowpass2&&(ge=Math.min(ge,fe)),te.lowpass10&&te.highpass2<.9*(.75/31)&&(te.highpass1=0,te.highpass2=0,t.err.println(`Warning: highpass filter disabled. highpass frequency too small +`)),te.highpass2>0){for(var de=-1,fe=0;fe<=31;fe++){var be=fe/31;be<=te.highpass1&&(ne=Math.max(ne,fe)),te.highpass1te.highpass1?$e=B((te.highpass2-be)/(te.highpass2-te.highpass1+1e-20)):$e=1,te.lowpass2>te.lowpass1?ze=B((be-te.lowpass1)/(te.lowpass2-te.lowpass1+1e-20)):ze=1,te.amp_filter[fe]=$e*ze}}function Y(G){var te=G.internal_flags;switch(G.quality){default:case 9:te.psymodel=0,te.noise_shaping=0,te.noise_shaping_amp=0,te.noise_shaping_stop=0,te.use_best_huffman=0,te.full_outer_loop=0;break;case 8:G.quality=7;case 7:te.psymodel=1,te.noise_shaping=0,te.noise_shaping_amp=0,te.noise_shaping_stop=0,te.use_best_huffman=0,te.full_outer_loop=0;break;case 6:te.psymodel=1,te.noise_shaping==0&&(te.noise_shaping=1),te.noise_shaping_amp=0,te.noise_shaping_stop=0,te.subblock_gain==-1&&(te.subblock_gain=1),te.use_best_huffman=0,te.full_outer_loop=0;break;case 5:te.psymodel=1,te.noise_shaping==0&&(te.noise_shaping=1),te.noise_shaping_amp=0,te.noise_shaping_stop=0,te.subblock_gain==-1&&(te.subblock_gain=1),te.use_best_huffman=0,te.full_outer_loop=0;break;case 4:te.psymodel=1,te.noise_shaping==0&&(te.noise_shaping=1),te.noise_shaping_amp=0,te.noise_shaping_stop=0,te.subblock_gain==-1&&(te.subblock_gain=1),te.use_best_huffman=1,te.full_outer_loop=0;break;case 3:te.psymodel=1,te.noise_shaping==0&&(te.noise_shaping=1),te.noise_shaping_amp=1,te.noise_shaping_stop=1,te.subblock_gain==-1&&(te.subblock_gain=1),te.use_best_huffman=1,te.full_outer_loop=0;break;case 2:te.psymodel=1,te.noise_shaping==0&&(te.noise_shaping=1),te.substep_shaping==0&&(te.substep_shaping=2),te.noise_shaping_amp=1,te.noise_shaping_stop=1,te.subblock_gain==-1&&(te.subblock_gain=1),te.use_best_huffman=1,te.full_outer_loop=0;break;case 1:te.psymodel=1,te.noise_shaping==0&&(te.noise_shaping=1),te.substep_shaping==0&&(te.substep_shaping=2),te.noise_shaping_amp=2,te.noise_shaping_stop=1,te.subblock_gain==-1&&(te.subblock_gain=1),te.use_best_huffman=1,te.full_outer_loop=0;break;case 0:te.psymodel=1,te.noise_shaping==0&&(te.noise_shaping=1),te.substep_shaping==0&&(te.substep_shaping=2),te.noise_shaping_amp=2,te.noise_shaping_stop=1,te.subblock_gain==-1&&(te.subblock_gain=1),te.use_best_huffman=1,te.full_outer_loop=0;break}}function se(G){var te=G.internal_flags;G.frameNum=0,G.write_id3tag_automatic&&L.id3tag_write_v2(G),te.bitrate_stereoMode_Hist=a([16,5]),te.bitrate_blockType_Hist=a([16,6]),te.PeakSample=0,G.bWriteVbrTag&&F.InitVbrTag(G)}this.lame_init_params=function(G){var te=G.internal_flags;if(te.Class_ID=0,te.ATH==null&&(te.ATH=new h),te.PSY==null&&(te.PSY=new T),te.rgdata==null&&(te.rgdata=new p),te.channels_in=G.num_channels,te.channels_in==1&&(G.mode=MPEGMode.MONO),te.channels_out=G.mode==MPEGMode.MONO?1:2,te.mode_ext=y.MPG_MD_MS_LR,G.mode==MPEGMode.MONO&&(G.force_ms=!1),G.VBR==n.vbr_off&&G.VBR_mean_bitrate_kbps!=128&&G.brate==0&&(G.brate=G.VBR_mean_bitrate_kbps),G.VBR==n.vbr_off||G.VBR==n.vbr_mtrh||G.VBR==n.vbr_mt||(G.free_format=!1),G.VBR==n.vbr_off&&G.brate==0&&b.EQ(G.compression_ratio,0)&&(G.compression_ratio=11.025),G.VBR==n.vbr_off&&G.compression_ratio>0&&(G.out_samplerate==0&&(G.out_samplerate=map2MP3Frequency(int(.97*G.in_samplerate))),G.brate=0|G.out_samplerate*16*te.channels_out/(1e3*G.compression_ratio),te.samplerate_index=N(G.out_samplerate,G),G.free_format||(G.brate=j(G.brate,G.version,G.out_samplerate))),G.out_samplerate!=0&&(G.out_samplerate<16e3?(G.VBR_mean_bitrate_kbps=Math.max(G.VBR_mean_bitrate_kbps,8),G.VBR_mean_bitrate_kbps=Math.min(G.VBR_mean_bitrate_kbps,64)):G.out_samplerate<32e3?(G.VBR_mean_bitrate_kbps=Math.max(G.VBR_mean_bitrate_kbps,8),G.VBR_mean_bitrate_kbps=Math.min(G.VBR_mean_bitrate_kbps,160)):(G.VBR_mean_bitrate_kbps=Math.max(G.VBR_mean_bitrate_kbps,32),G.VBR_mean_bitrate_kbps=Math.min(G.VBR_mean_bitrate_kbps,320))),G.lowpassfreq==0){var ge=16e3;switch(G.VBR){case n.vbr_off:{var ne=new q;W(ne,G.brate),ge=ne.lowerlimit;break}case n.vbr_abr:{var ne=new q;W(ne,G.VBR_mean_bitrate_kbps),ge=ne.lowerlimit;break}case n.vbr_rh:{var le=[19500,19e3,18600,18e3,17500,16e3,15600,14900,12500,1e4,3950];if(0<=G.VBR_q&&G.VBR_q<=9){var fe=le[G.VBR_q],be=le[G.VBR_q+1],de=G.VBR_q_frac;ge=linear_int(fe,be,de)}else ge=19500;break}default:{var le=[19500,19e3,18500,18e3,17500,16500,15500,14500,12500,9500,3950];if(0<=G.VBR_q&&G.VBR_q<=9){var fe=le[G.VBR_q],be=le[G.VBR_q+1],de=G.VBR_q_frac;ge=linear_int(fe,be,de)}else ge=19500}}G.mode==MPEGMode.MONO&&(G.VBR==n.vbr_off||G.VBR==n.vbr_abr)&&(ge*=1.5),G.lowpassfreq=ge|0}if(G.out_samplerate==0&&(2*G.lowpassfreq>G.in_samplerate&&(G.lowpassfreq=G.in_samplerate/2),G.out_samplerate=V(G.lowpassfreq|0,G.in_samplerate)),G.lowpassfreq=Math.min(20500,G.lowpassfreq),G.lowpassfreq=Math.min(G.out_samplerate/2,G.lowpassfreq),G.VBR==n.vbr_off&&(G.compression_ratio=G.out_samplerate*16*te.channels_out/(1e3*G.brate)),G.VBR==n.vbr_abr&&(G.compression_ratio=G.out_samplerate*16*te.channels_out/(1e3*G.VBR_mean_bitrate_kbps)),G.bWriteVbrTag||(G.findReplayGain=!1,G.decode_on_the_fly=!1,te.findPeakSample=!1),te.findReplayGain=G.findReplayGain,te.decode_on_the_fly=G.decode_on_the_fly,te.decode_on_the_fly&&(te.findPeakSample=!0),te.findReplayGain&&C.InitGainAnalysis(te.rgdata,G.out_samplerate)==GainAnalysis.INIT_GAIN_ANALYSIS_ERROR)return G.internal_flags=null,-6;switch(te.decode_on_the_fly&&!G.decode_only&&(te.hip!=null&&X.hip_decode_exit(te.hip),te.hip=X.hip_decode_init()),te.mode_gr=G.out_samplerate<=24e3?1:2,G.framesize=576*te.mode_gr,G.encoder_delay=y.ENCDELAY,te.resample_ratio=G.in_samplerate/G.out_samplerate,G.VBR){case n.vbr_mt:case n.vbr_rh:case n.vbr_mtrh:{var $e=[5.7,6.5,7.3,8.2,10,11.9,13,14,15,16.5];G.compression_ratio=$e[G.VBR_q]}break;case n.vbr_abr:G.compression_ratio=G.out_samplerate*16*te.channels_out/(1e3*G.VBR_mean_bitrate_kbps);break;default:G.compression_ratio=G.out_samplerate*16*te.channels_out/(1e3*G.brate);break}if(G.mode==MPEGMode.NOT_SET&&(G.mode=MPEGMode.JOINT_STEREO),G.highpassfreq>0?(te.highpass1=2*G.highpassfreq,G.highpasswidth>=0?te.highpass2=2*(G.highpassfreq+G.highpasswidth):te.highpass2=2*G.highpassfreq,te.highpass1/=G.out_samplerate,te.highpass2/=G.out_samplerate):(te.highpass1=0,te.highpass2=0),G.lowpassfreq>0?(te.lowpass2=2*G.lowpassfreq,G.lowpasswidth>=0?(te.lowpass1=2*(G.lowpassfreq-G.lowpasswidth),te.lowpass1<0&&(te.lowpass1=0)):te.lowpass1=2*G.lowpassfreq,te.lowpass1/=G.out_samplerate,te.lowpass2/=G.out_samplerate):(te.lowpass1=0,te.lowpass2=0),M(G),te.samplerate_index=N(G.out_samplerate,G),te.samplerate_index<0)return G.internal_flags=null,-1;if(G.VBR==n.vbr_off){if(G.free_format)te.bitrate_index=0;else if(G.brate=j(G.brate,G.version,G.out_samplerate),te.bitrate_index=k(G.brate,G.version,G.out_samplerate),te.bitrate_index<=0)return G.internal_flags=null,-1}else te.bitrate_index=1;G.analysis&&(G.bWriteVbrTag=!1),te.pinfo!=null&&(G.bWriteVbrTag=!1),E.init_bit_stream_w(te);for(var ze=te.samplerate_index+3*G.version+6*(G.out_samplerate<16e3?1:0),_e=0;_e=0),G.VBR){case n.vbr_mt:G.VBR=n.vbr_mtrh;case n.vbr_mtrh:{G.useTemporal==null&&(G.useTemporal=!1),I.apply_preset(G,500-G.VBR_q*10,0),G.quality<0&&(G.quality=LAME_DEFAULT_QUALITY),G.quality<5&&(G.quality=0),G.quality>5&&(G.quality=5),te.PSY.mask_adjust=G.maskingadjust,te.PSY.mask_adjust_short=G.maskingadjust_short,G.experimentalY?te.sfb21_extra=!1:te.sfb21_extra=G.out_samplerate>44e3,te.iteration_loop=new VBRNewIterationLoop(A);break}case n.vbr_rh:{I.apply_preset(G,500-G.VBR_q*10,0),te.PSY.mask_adjust=G.maskingadjust,te.PSY.mask_adjust_short=G.maskingadjust_short,G.experimentalY?te.sfb21_extra=!1:te.sfb21_extra=G.out_samplerate>44e3,G.quality>6&&(G.quality=6),G.quality<0&&(G.quality=LAME_DEFAULT_QUALITY),te.iteration_loop=new VBROldIterationLoop(A);break}default:{var Ne;te.sfb21_extra=!1,G.quality<0&&(G.quality=LAME_DEFAULT_QUALITY),Ne=G.VBR,Ne==n.vbr_off&&(G.VBR_mean_bitrate_kbps=G.brate),I.apply_preset(G,G.VBR_mean_bitrate_kbps,0),G.VBR=Ne,te.PSY.mask_adjust=G.maskingadjust,te.PSY.mask_adjust_short=G.maskingadjust_short,Ne==n.vbr_off?te.iteration_loop=new f(A):te.iteration_loop=new ABRIterationLoop(A);break}}if(l(G.scale>=0),G.VBR!=n.vbr_off){if(te.VBR_min_bitrate=1,te.VBR_max_bitrate=14,G.out_samplerate<16e3&&(te.VBR_max_bitrate=8),G.VBR_min_bitrate_kbps!=0&&(G.VBR_min_bitrate_kbps=j(G.VBR_min_bitrate_kbps,G.version,G.out_samplerate),te.VBR_min_bitrate=k(G.VBR_min_bitrate_kbps,G.version,G.out_samplerate),te.VBR_min_bitrate<0)||G.VBR_max_bitrate_kbps!=0&&(G.VBR_max_bitrate_kbps=j(G.VBR_max_bitrate_kbps,G.version,G.out_samplerate),te.VBR_max_bitrate=k(G.VBR_max_bitrate_kbps,G.version,G.out_samplerate),te.VBR_max_bitrate<0))return-1;G.VBR_min_bitrate_kbps=g.bitrate_table[G.version][te.VBR_min_bitrate],G.VBR_max_bitrate_kbps=g.bitrate_table[G.version][te.VBR_max_bitrate],G.VBR_mean_bitrate_kbps=Math.min(g.bitrate_table[G.version][te.VBR_max_bitrate],G.VBR_mean_bitrate_kbps),G.VBR_mean_bitrate_kbps=Math.max(g.bitrate_table[G.version][te.VBR_min_bitrate],G.VBR_mean_bitrate_kbps)}return G.tune&&(te.PSY.mask_adjust+=G.tune_value_a,te.PSY.mask_adjust_short+=G.tune_value_a),Y(G),l(G.scale>=0),G.athaa_type<0?te.ATH.useAdjust=3:te.ATH.useAdjust=G.athaa_type,te.ATH.aaSensitivityP=Math.pow(10,G.athaa_sensitivity/-10),G.short_blocks==null&&(G.short_blocks=r.short_block_allowed),G.short_blocks==r.short_block_allowed&&(G.mode==MPEGMode.JOINT_STEREO||G.mode==MPEGMode.STEREO)&&(G.short_blocks=r.short_block_coupled),G.quant_comp<0&&(G.quant_comp=1),G.quant_comp_short<0&&(G.quant_comp_short=0),G.msfix<0&&(G.msfix=0),G.exp_nspsytune=G.exp_nspsytune|1,G.internal_flags.nsPsy.attackthre<0&&(G.internal_flags.nsPsy.attackthre=c.NSATTACKTHRE),G.internal_flags.nsPsy.attackthre_s<0&&(G.internal_flags.nsPsy.attackthre_s=c.NSATTACKTHRE_S),l(G.scale>=0),G.scale<0&&(G.scale=1),G.ATHtype<0&&(G.ATHtype=4),G.ATHcurve<0&&(G.ATHcurve=4),G.athaa_loudapprox<0&&(G.athaa_loudapprox=2),G.interChRatio<0&&(G.interChRatio=0),G.useTemporal==null&&(G.useTemporal=!0),te.slot_lag=te.frac_SpF=0,G.VBR==n.vbr_off&&(te.slot_lag=te.frac_SpF=(G.version+1)*72e3*G.brate%G.out_samplerate|0),R.iteration_init(G),O.psymodel_init(G),l(G.scale>=0),0};function ie(G,te){(G.in_buffer_0==null||G.in_buffer_nsamples0&&be>=0;){var xe=Ce-le.mf_size,Ne=G.frameNum;xe*=G.in_samplerate,xe/=G.out_samplerate,xe>1152&&(xe=1152),xe<1&&(xe=1),$e=ne-de,ne==0&&($e=0),be=this.lame_encode_buffer(G,fe[0],fe[1],xe,te,ge,$e),ge+=be,de+=be,_e-=Ne!=G.frameNum?1:0}if(le.mf_samples_to_encode=0,be<0||($e=ne-de,ne==0&&($e=0),E.flush_bitstream(G),be=E.copy_buffer(le,te,ge,$e,1),be<0))return be;if(ge+=be,de+=be,$e=ne-de,ne==0&&($e=0),G.write_id3tag_automatic){if(L.id3tag_write_v1(G),be=E.copy_buffer(le,te,ge,$e,0),be<0)return be;de+=be}return de},this.lame_encode_buffer=function(G,te,ge,ne,le,fe,be){var de=G.internal_flags,$e=[null,null];if(de.Class_ID!=J)return-3;if(ne==0)return 0;ie(de,ne),$e[0]=de.in_buffer_0,$e[1]=de.in_buffer_1;for(var ze=0;ze1&&($e[1][ze]=ge[ze]);return re(G,$e[0],$e[1],ne,le,fe,be)};function oe(G){var te=y.BLKSIZE+G.framesize-y.FFTOFFSET;return te=Math.max(te,512+G.framesize-32),l(d.MFSIZE>=te),te}function re(G,te,ge,ne,le,fe,be){var de=G.internal_flags,$e=0,ze,_e,Ee,Ce,xe,Ne=[null,null],ve=[null,null];if(de.Class_ID!=J)return-3;if(ne==0)return 0;if(xe=E.copy_buffer(de,le,fe,be,0),xe<0)return xe;if(fe+=xe,$e+=xe,ve[0]=te,ve[1]=ge,b.NEQ(G.scale,0)&&b.NEQ(G.scale,1))for(_e=0;_e0;){var Ie=[null,null],Pe=0,Te=0;Ie[0]=ve[0],Ie[1]=ve[1];var Be=new pe;if(U(G,Ne,Ie,ke,ne,Be),Pe=Be.n_in,Te=Be.n_out,de.findReplayGain&&!de.decode_on_the_fly&&C.AnalyzeSamples(de.rgdata,Ne[0],de.mf_size,Ne[1],de.mf_size,Te,de.channels_out)==GainAnalysis.GAIN_ANALYSIS_ERROR)return-6;if(ne-=Pe,ke+=Pe,de.channels_out==2,de.mf_size+=Te,l(de.mf_size<=d.MFSIZE),de.mf_samples_to_encode<1&&(de.mf_samples_to_encode=y.ENCDELAY+y.POSTDELAY),de.mf_samples_to_encode+=Te,de.mf_size>=Ce){var He=be-$e;if(be==0&&(He=0),ze=ee(G,Ne[0],Ne[1],le,fe,He),ze<0)return ze;for(fe+=ze,$e+=ze,de.mf_size-=G.framesize,de.mf_samples_to_encode-=G.framesize,Ee=0;Ee1&&(G=1);var le=G-.5,fe=.42-.5*Math.cos(2*G*Math.PI)+.08*Math.cos(4*G*Math.PI);return Math.abs(le)<1e-9?ne/Math.PI:fe*Math.sin(ge*ne*le)/(Math.PI*ge*le)}function ue(G,te,ge,ne,le,fe,be,de,$e){var ze=G.internal_flags,_e,Ee=0,Ce,xe=G.out_samplerate/Q(G.out_samplerate,G.in_samplerate);xe>d.BPC&&(xe=d.BPC);var Ne=Math.abs(ze.resample_ratio-Math.floor(.5+ze.resample_ratio))<1e-4?1:0,ve=1/ze.resample_ratio;ve>1&&(ve=1);var ke=31;ke%2==0&&--ke,ke+=Ne;var Ie=ke+1;if(ze.fill_buffer_resample_init==0){for(ze.inbuf_old[0]=i(Ie),ze.inbuf_old[1]=i(Ie),_e=0;_e<=2*xe;++_e)ze.blackfilt[_e]=i(Ie);for(ze.itime[0]=0,ze.itime[1]=0,Ee=0;Ee<=2*xe;Ee++){var Pe=0,Te=(Ee-xe)/(2*xe);for(_e=0;_e<=ke;_e++)Pe+=ze.blackfilt[Ee][_e]=me(_e-Te,ve,ke);for(_e=0;_e<=ke;_e++)ze.blackfilt[Ee][_e]/=Pe}ze.fill_buffer_resample_init=1}var Be=ze.inbuf_old[$e];for(Ce=0;Ce=be)break;var Te=He-ze.itime[$e]-(Ee+.5*(ke%2));l(Math.abs(Te)<=.501),Je=0|Math.floor(Te*2*xe+xe+.5);var Me=0;for(_e=0;_e<=ke;++_e){var Re=0|_e+Ee-ke/2,Ve;l(Re=0),Ve=Re<0?Be[Ie+Re]:le[fe+Re],Me+=Ve*ze.blackfilt[Je][_e]}te[ge+Ce]=Me}if(de.num_used=Math.min(be,ke+Ee-ke/2),ze.itime[$e]+=de.num_used-Ce*ze.resample_ratio,de.num_used>=Ie)for(_e=0;_e1.0001)for(var de=0;de0||(p.quant_comp=m.quant_comp),b!=0?p.quant_comp_short=m.quant_comp_s:Math.abs(p.quant_comp_short- -1)>0||(p.quant_comp_short=m.quant_comp_s),m.expY!=0&&(p.experimentalY=m.expY!=0),b!=0?p.internal_flags.nsPsy.attackthre=m.st_lrm:Math.abs(p.internal_flags.nsPsy.attackthre- -1)>0||(p.internal_flags.nsPsy.attackthre=m.st_lrm),b!=0?p.internal_flags.nsPsy.attackthre_s=m.st_s:Math.abs(p.internal_flags.nsPsy.attackthre_s- -1)>0||(p.internal_flags.nsPsy.attackthre_s=m.st_s),b!=0?p.maskingadjust=m.masking_adj:Math.abs(p.maskingadjust-0)>0||(p.maskingadjust=m.masking_adj),b!=0?p.maskingadjust_short=m.masking_adj_short:Math.abs(p.maskingadjust_short-0)>0||(p.maskingadjust_short=m.masking_adj_short),b!=0?p.ATHlower=-m.ath_lower/10:Math.abs(-p.ATHlower*10-0)>0||(p.ATHlower=-m.ath_lower/10),b!=0?p.ATHcurve=m.ath_curve:Math.abs(p.ATHcurve- -1)>0||(p.ATHcurve=m.ath_curve),b!=0?p.athaa_sensitivity=m.ath_sensitivity:Math.abs(p.athaa_sensitivity- -1)>0||(p.athaa_sensitivity=m.ath_sensitivity),m.interch>0&&(b!=0?p.interChRatio=m.interch:Math.abs(p.interChRatio- -1)>0||(p.interChRatio=m.interch)),m.safejoint>0&&(p.exp_nspsytune=p.exp_nspsytune|m.safejoint),m.sfb21mod>0&&(p.exp_nspsytune=p.exp_nspsytune|m.sfb21mod<<20),b!=0?p.msfix=m.msfix:Math.abs(p.msfix- -1)>0||(p.msfix=m.msfix),b==0&&(p.VBR_q=f,p.VBR_q_frac=y)}var u=[new i(8,9,9,0,0,6.6,145,0,.95,0,-30,11,.0012,1),new i(16,9,9,0,0,6.6,145,0,.95,0,-25,11,.001,1),new i(24,9,9,0,0,6.6,145,0,.95,0,-20,11,.001,1),new i(32,9,9,0,0,6.6,145,0,.95,0,-15,11,.001,1),new i(40,9,9,0,0,6.6,145,0,.95,0,-10,11,9e-4,1),new i(48,9,9,0,0,6.6,145,0,.95,0,-10,11,9e-4,1),new i(56,9,9,0,0,6.6,145,0,.95,0,-6,11,8e-4,1),new i(64,9,9,0,0,6.6,145,0,.95,0,-2,11,8e-4,1),new i(80,9,9,0,0,6.6,145,0,.95,0,0,8,7e-4,1),new i(96,9,9,0,2.5,6.6,145,0,.95,0,1,5.5,6e-4,1),new i(112,9,9,0,2.25,6.6,145,0,.95,0,2,4.5,5e-4,1),new i(128,9,9,0,1.95,6.4,140,0,.95,0,3,4,2e-4,1),new i(160,9,9,1,1.79,6,135,0,.95,-2,5,3.5,0,1),new i(192,9,9,1,1.49,5.6,125,0,.97,-4,7,3,0,0),new i(224,9,9,1,1.25,5.2,125,0,.98,-6,9,2,0,0),new i(256,9,9,1,.97,5.2,125,0,1,-8,10,1,0,0),new i(320,9,9,1,.9,5.2,125,0,1,-10,12,0,0,0)];function d(p,f,b){var g=f,y=a.nearestBitrateFullIndex(f);if(p.VBR=t.vbr_abr,p.VBR_mean_bitrate_kbps=g,p.VBR_mean_bitrate_kbps=Math.min(p.VBR_mean_bitrate_kbps,320),p.VBR_mean_bitrate_kbps=Math.max(p.VBR_mean_bitrate_kbps,8),p.brate=p.VBR_mean_bitrate_kbps,p.VBR_mean_bitrate_kbps>320&&(p.disable_reservoir=!0),u[y].safejoint>0&&(p.exp_nspsytune=p.exp_nspsytune|2),u[y].sfscale>0&&(p.internal_flags.noise_shaping=2),Math.abs(u[y].nsbass)>0){var w=int(u[y].nsbass*4);w<0&&(w+=64),p.exp_nspsytune=p.exp_nspsytune|w<<2}return b!=0?p.quant_comp=u[y].quant_comp:Math.abs(p.quant_comp- -1)>0||(p.quant_comp=u[y].quant_comp),b!=0?p.quant_comp_short=u[y].quant_comp_s:Math.abs(p.quant_comp_short- -1)>0||(p.quant_comp_short=u[y].quant_comp_s),b!=0?p.msfix=u[y].nsmsfix:Math.abs(p.msfix- -1)>0||(p.msfix=u[y].nsmsfix),b!=0?p.internal_flags.nsPsy.attackthre=u[y].st_lrm:Math.abs(p.internal_flags.nsPsy.attackthre- -1)>0||(p.internal_flags.nsPsy.attackthre=u[y].st_lrm),b!=0?p.internal_flags.nsPsy.attackthre_s=u[y].st_s:Math.abs(p.internal_flags.nsPsy.attackthre_s- -1)>0||(p.internal_flags.nsPsy.attackthre_s=u[y].st_s),b!=0?p.scale=u[y].scale:Math.abs(p.scale- -1)>0||(p.scale=u[y].scale),b!=0?p.maskingadjust=u[y].masking_adj:Math.abs(p.maskingadjust-0)>0||(p.maskingadjust=u[y].masking_adj),u[y].masking_adj>0?b!=0?p.maskingadjust_short=u[y].masking_adj*.9:Math.abs(p.maskingadjust_short-0)>0||(p.maskingadjust_short=u[y].masking_adj*.9):b!=0?p.maskingadjust_short=u[y].masking_adj*1.1:Math.abs(p.maskingadjust_short-0)>0||(p.maskingadjust_short=u[y].masking_adj*1.1),b!=0?p.ATHlower=-u[y].ath_lower/10:Math.abs(-p.ATHlower*10-0)>0||(p.ATHlower=-u[y].ath_lower/10),b!=0?p.ATHcurve=u[y].ath_curve:Math.abs(p.ATHcurve- -1)>0||(p.ATHcurve=u[y].ath_curve),b!=0?p.interChRatio=u[y].interch:Math.abs(p.interChRatio- -1)>0||(p.interChRatio=u[y].interch),f}this.apply_preset=function(p,f,b){switch(f){case Lame.R3MIX:{f=Lame.V3,p.VBR=t.vbr_mtrh;break}case Lame.MEDIUM:{f=Lame.V4,p.VBR=t.vbr_rh;break}case Lame.MEDIUM_FAST:{f=Lame.V4,p.VBR=t.vbr_mtrh;break}case Lame.STANDARD:{f=Lame.V2,p.VBR=t.vbr_rh;break}case Lame.STANDARD_FAST:{f=Lame.V2,p.VBR=t.vbr_mtrh;break}case Lame.EXTREME:{f=Lame.V0,p.VBR=t.vbr_rh;break}case Lame.EXTREME_FAST:{f=Lame.V0,p.VBR=t.vbr_mtrh;break}case Lame.INSANE:return f=320,p.preset=f,d(p,f,b),p.VBR=t.vbr_off,f}switch(p.preset=f,f){case Lame.V9:return c(p,9,b),f;case Lame.V8:return c(p,8,b),f;case Lame.V7:return c(p,7,b),f;case Lame.V6:return c(p,6,b),f;case Lame.V5:return c(p,5,b),f;case Lame.V4:return c(p,4,b),f;case Lame.V3:return c(p,3,b),f;case Lame.V2:return c(p,2,b),f;case Lame.V1:return c(p,1,b),f;case Lame.V0:return c(p,0,b),f}return 8<=f&&f<=320?d(p,f,b):(p.preset=0,f)};function h(p,f){var b=0;return 0>f&&(b=-1,f=0),9q.xrpow_max&&(q.xrpow_max=H[B])}return Z}this.init_xrpow=function(q,H,J){var Z=0,B=0|H.max_nonzero_coeff;if(o(J!=null),H.xrpow_max=0,o(0<=B&&B<=575),i.fill(J,B,576,0),Z=m(H,J,B,Z),Z>1e-20){var V=0;(q.substep_shaping&2)!=0&&(V=1);for(var N=0;N=0&&!B;V--){var N=q.scalefac_band.psfb21[V],j=q.scalefac_band.psfb21[V+1],k=y.athAdjust(J.adjust,J.psfb21[V],J.floor);q.nsPsy.longfact[21]>1e-12&&(k*=q.nsPsy.longfact[21]);for(var W=j-1;W>=N;W--)if(Math.abs(Z[W])=0&&!B;V--){var N=q.scalefac_band.s[12]*3+(q.scalefac_band.s[13]-q.scalefac_band.s[12])*M+(q.scalefac_band.psfb12[V]-q.scalefac_band.psfb12[0]),j=N+(q.scalefac_band.psfb12[V+1]-q.scalefac_band.psfb12[V]),Y=y.athAdjust(J.adjust,J.psfb12[V],J.floor);q.nsPsy.shortfact[12]>1e-12&&(Y*=q.nsPsy.shortfact[12]);for(var W=j-1;W>=N;W--)if(Math.abs(Z[W])J?(W==C.BINSEARCH_DOWN&&(j=!0),j&&(N/=2),W=C.BINSEARCH_UP,M=N):(W==C.BINSEARCH_UP&&(j=!0),j&&(N/=2),W=C.BINSEARCH_DOWN,M=-N),H.global_gain+=M,H.global_gain<0&&(H.global_gain=0,j=!0),H.global_gain>255&&(H.global_gain=255,j=!0)}for(o(H.global_gain>=0),o(H.global_gain<256);V>J&&H.global_gain<255;)H.global_gain++,V=v.count_bits(q,B,H,null);return q.CurrentStep[Z]=k-H.global_gain>=4?4:2,q.OldValue[Z]=H.global_gain,H.part2_3_length=V,V}this.trancate_smallspectrums=function(q,H,J,Z){var B=a(p.SFBMAX);if(!((q.substep_shaping&4)==0&&H.block_type==d.SHORT_TYPE||(q.substep_shaping&128)!=0)){y.calc_noise(H,J,B,new c,null);for(var N=0;N<576;N++){var V=0;H.l3_enc[N]!=0&&(V=Math.abs(H.xr[N])),Z[N]=V}var N=0,j=8;H.block_type==d.SHORT_TYPE&&(j=6);do{var k,W,M,Y,se=H.width[j];if(N+=se,!(B[j]>=1)&&(i.sort(Z,N-se,se),!BitStream.EQ(Z[N-1],0))){k=(1-B[j])*J[j],W=0,Y=0;do{var ie;for(M=1;Y+M0)}}while(++j0?(V=J.over_SSD<=H.over_SSD,J.over_SSD==H.over_SSD&&(V=J.bits.2||J.max_noise<=0&&H.max_noise<0&&H.max_noise>J.max_noise-.2&&J.tot_noise0&&H.max_noise>J.max_noise-.2&&J.tot_noise0&&H.max_noise>-.05&&H.max_noise>J.max_noise-.1&&J.tot_noise+J.over_noise0&&H.max_noise>-.1&&H.max_noise>J.max_noise-.15&&J.tot_noise+J.over_noise+J.over_noise1?j=Math.pow(j,.5):j*=.95;break;case 0:default:j>1?j=1:j*=.95;break}for(var M=0,k=0;kH.xrpow_max&&(H.xrpow_max=Z[M+se]);if(V.noise_shaping_amp==2)return}}}function L(q,H){for(var J=1.2968395546510096,Z=0,B=0;Bq.xrpow_max&&(q.xrpow_max=H[Z+j])}q.scalefac[B]=N>>1}q.preflag=0,q.scalefac_scale=1}function X(q,H,J){var Z,B=H.scalefac;for(Z=0;Z=16)return!0;for(var V=0;V<3;V++){var N=0,j=0;for(Z=H.sfb_lmax+V;Z=7)return!0;H.subblock_gain[V]++;var k=q.scalefac_band.l[H.sfb_lmax];for(Z=H.sfb_lmax+V;Z=0),Y=Y-(4>>H.scalefac_scale),Y>=0){B[Z]=Y,k+=M*3;continue}B[Z]=0;{var se=210+(Y<H.xrpow_max&&(H.xrpow_max=J[k+ie]);k+=M*(3-V-1)}{var W=y.IPOW20(202);k+=H.width[Z]*(V+1);for(var ie=-H.width[Z];ie<0;ie++)J[k+ie]*=W,J[k+ie]>H.xrpow_max&&(H.xrpow_max=J[k+ie])}}}return!1}function T(q,H,J,Z,B){var V=q.internal_flags;F(q,H,J,Z,B);var N=I(H);return N?!1:(V.mode_gr==2?N=v.scale_bitcount(H):N=v.scale_bitcount_lsf(V,H),N?(V.noise_shaping>1&&(i.fill(V.pseudohalf,0),H.scalefac_scale==0?(L(H,Z),N=!1):H.block_type==d.SHORT_TYPE&&V.subblock_gain>0&&(N=X(V,H,Z)||I(H))),N||(V.mode_gr==2?N=v.scale_bitcount(H):N=v.scale_bitcount_lsf(V,H)),!N):!0)}this.outer_loop=function(q,H,J,Z,B,V){var N=q.internal_flags,j=new h,k=a(576),W=a(p.SFBMAX),M=new c,Y,se=new u,ie=9999999,oe=!1,re=!1,ee=0;if(E(N,H,V,B,Z),N.noise_shaping==0)return 100;y.calc_noise(H,J,W,M,se),M.bits=H.part2_3_length,j.assign(H);var pe=0;for(t.arraycopy(Z,0,k,0,576);!oe;){do{var we=new c,Q,me=255;if((N.substep_shaping&2)!=0?Q=20:Q=3,N.sfb21_extra&&(W[j.sfbmax]>1||j.block_type==d.SHORT_TYPE&&(W[j.sfbmax+1]>1||W[j.sfbmax+2]>1))||!T(q,j,W,Z,re))break;j.scalefac_scale!=0&&(me=254);var ue=V-j.part2_length;if(ue<=0)break;for(;(j.part2_3_length=v.count_bits(N,Z,j,se))>ue&&j.global_gain<=me;)j.global_gain++;if(j.global_gain>me)break;if(M.over_count==0){for(;(j.part2_3_length=v.count_bits(N,Z,j,se))>ie&&j.global_gain<=me;)j.global_gain++;if(j.global_gain>me)break}if(y.calc_noise(j,J,W,we,se),we.bits=j.part2_3_length,H.block_type!=d.SHORT_TYPE?Y=q.quant_comp:Y=q.quant_comp_short,Y=O(Y,M,we,j,W)?1:0,Y!=0)ie=H.part2_3_length,M=we,H.assign(j),pe=0,t.arraycopy(Z,0,k,0,576);else if(N.full_outer_loop==0&&(++pe>Q&&M.over_count==0||N.noise_shaping_amp==3&&re&&pe>30||N.noise_shaping_amp==3&&re&&j.global_gain-ee>15))break}while(j.global_gain+j.scalefac_scale<255);N.noise_shaping_amp==3?re?oe=!0:(j.assign(H),t.arraycopy(k,0,Z,0,576),pe=0,ee=j.global_gain,re=!0):oe=!0}return o(H.global_gain+H.scalefac_scale<=255),q.VBR==n.vbr_rh||q.VBR==n.vbr_mtrh?t.arraycopy(k,0,Z,0,576):(N.substep_shaping&1)!=0&&trancate_smallspectrums(N,H,J,Z),M.over_count},this.iteration_finish_one=function(q,H,J){var Z=q.l3_side,B=Z.tt[H][J];v.best_scalefac_store(q,H,J,Z),q.use_best_huffman==1&&v.best_huffman_divide(q,B),g.ResvAdjust(q,B)},this.VBR_encode_granule=function(q,H,J,Z,B,V,N){var j=q.internal_flags,k=new h,W=a(576),M=N,Y=N+1,se=(N+V)/2,ie,oe,re=0,ee=j.sfb21_extra;o(M<=LameInternalFlags.MAX_BITS_PER_CHANNEL),i.fill(k.l3_enc,0);do o(se>=V),o(se<=N),o(V<=N),se>M-42?j.sfb21_extra=!1:j.sfb21_extra=ee,oe=outer_loop(q,H,J,Z,B,se),oe<=0?(re=1,Y=H.part2_3_length,k.assign(H),t.arraycopy(Z,0,W,0,576),N=Y-32,ie=N-V,se=(N+V)/2):(V=se+32,ie=N-V,se=(N+V)/2,re!=0&&(re=2,H.assign(k),t.arraycopy(W,0,Z,0,576)));while(ie>12);j.sfb21_extra=ee,re==2&&t.arraycopy(k.l3_enc,0,H.l3_enc,0,576),o(H.part2_3_length<=M)},this.get_framebits=function(q,H){var J=q.internal_flags;J.bitrate_index=J.VBR_min_bitrate;var Z=b.getframebits(q);J.bitrate_index=1,Z=b.getframebits(q);for(var B=1;B<=J.VBR_max_bitrate;B++){J.bitrate_index=B;var V=new MeanBits(Z);H[B]=g.ResvFrameBegin(q,V),Z=V.bits}},this.VBR_old_prepare=function(q,H,J,Z,B,V,N,j,k){var W=q.internal_flags,M,Y=0,se=1,ie=0;W.bitrate_index=W.VBR_max_bitrate;var oe=g.ResvFrameBegin(q,new MeanBits(0))/W.mode_gr;get_framebits(q,V);for(var re=0;reV[W.VBR_max_bitrate]&&(j[re][pe]*=V[W.VBR_max_bitrate],j[re][pe]/=ie),N[re][pe]>j[re][pe]&&(N[re][pe]=j[re][pe]);return se},this.bitpressure_strategy=function(q,H,J,Z){for(var B=0;BM&&(V[se][ie]*=M,V[se][ie]/=W);return j},this.calc_target_bits=function(q,H,J,Z,B,V){var N=q.internal_flags,j=N.l3_side,k,W,M,Y,se=0;N.bitrate_index=N.VBR_max_bitrate;var ie=new MeanBits(se);for(V[0]=g.ResvFrameBegin(q,ie),se=ie.bits,N.bitrate_index=1,se=b.getframebits(q)-N.sideinfo_len*8,B[0]=se/(N.mode_gr*N.channels_out),se=q.VBR_mean_bitrate_kbps*q.framesize*1e3,(N.substep_shaping&1)!=0&&(se*=1.09),se/=q.out_samplerate,se-=N.sideinfo_len*8,se/=N.mode_gr*N.channels_out,k=.93+.07*(11-q.compression_ratio)/(11-5.5),k<.9&&(k=.9),k>1&&(k=1),W=0;W700){var re=int((H[W][M]-700)/1.4),ee=j.tt[W][M];Z[W][M]=int(k*se),ee.block_type==d.SHORT_TYPE&&rese*3/2?re=se*3/2:re<0&&(re=0),Z[W][M]+=re}Z[W][M]>LameInternalFlags.MAX_BITS_PER_CHANNEL&&(Z[W][M]=LameInternalFlags.MAX_BITS_PER_CHANNEL),oe+=Z[W][M]}if(oe>LameInternalFlags.MAX_BITS_PER_GRANULE)for(M=0;MLameInternalFlags.MAX_BITS_PER_CHANNEL&&(Z[W][M]=LameInternalFlags.MAX_BITS_PER_CHANNEL),Y+=Z[W][M];if(Y>V[0])for(W=0;W320?l=8*int(i.brate*1e3/(i.out_samplerate/1152)/8+.5):(l=8*1440,i.strict_ISO&&(l=8*int(32e4/(i.out_samplerate/1152)/8+.5))),o.ResvMax=l-u,o.ResvMax>d&&(o.ResvMax=d),(o.ResvMax<0||i.disable_reservoir)&&(o.ResvMax=0);var h=a.bits*o.mode_gr+Math.min(o.ResvSize,o.ResvMax);return h>l&&(h=l),t(o.ResvMax%8==0),t(o.ResvMax>=0),c.resvDrain_pre=0,o.pinfo!=null&&(o.pinfo.mean_bits=a.bits/2,o.pinfo.resvsize=o.ResvSize),h},this.ResvMaxBits=function(i,a,o,l){var c=i.internal_flags,u,d=c.ResvSize,h=c.ResvMax;l!=0&&(d+=a),(c.substep_shaping&1)!=0&&(h*=.9),o.bits=a,d*10>h*9?(u=d-h*9/10,o.bits+=u,c.substep_shaping|=128):(u=0,c.substep_shaping&=127,!i.disable_reservoir&&(c.substep_shaping&1)==0&&(o.bits-=.1*a));var p=d0&&(t(o%8==0),t(o>=0),c+=o);{var u=Math.min(l.main_data_begin*8,c)/8;l.resvDrain_pre+=8*u,c-=8*u,i.ResvSize-=8*u,l.main_data_begin-=u}l.resvDrain_post+=c,i.ResvSize-=c}}return Z_=n,Z_}var Q_,WI;function ode(){if(WI)return Q_;WI=1;function e(){var t="http://www.mp3dev.org/",n=3,r=98,i=4,a=0,o=93;this.getLameVersion=function(){return n+"."+r+"."+i},this.getLameShortVersion=function(){return n+"."+r+"."+i},this.getLameVeryShortVersion=function(){return"LAME"+n+"."+r+"r"},this.getPsyVersion=function(){return a+"."+o},this.getLameUrl=function(){return t},this.getLameOsBitness=function(){return"32bits"}}return Q_=e,Q_}var e3,DI;function lde(){if(DI)return e3;DI=1;var e=Qi(),t=e.System,n=e.VbrMode;e.Float;var r=e.ShortBlock;e.Util;var i=e.Arrays;e.new_array_n;var a=e.new_byte;e.new_double,e.new_float,e.new_float_n,e.new_int,e.new_int_n;var o=e.assert;l.NUMTOCENTRIES=100,l.MAXFRAMESIZE=2880;function l(){var c,u,d;this.setModules=function(N,j,k){c=N,u=j,d=k};var h=1,p=2,f=4,b=8,g=l.NUMTOCENTRIES,y=l.MAXFRAMESIZE,w=g+4+4+4+4+4,v=w+9+1+1+8+1+1+3+1+1+2+4+2+2,m=128,z=64,C=32,E=null,I="Xing",R="Info",A=[0,49345,49537,320,49921,960,640,49729,50689,1728,1920,51009,1280,50625,50305,1088,52225,3264,3456,52545,3840,53185,52865,3648,2560,51905,52097,2880,51457,2496,2176,51265,55297,6336,6528,55617,6912,56257,55937,6720,7680,57025,57217,8e3,56577,7616,7296,56385,5120,54465,54657,5440,55041,6080,5760,54849,53761,4800,4992,54081,4352,53697,53377,4160,61441,12480,12672,61761,13056,62401,62081,12864,13824,63169,63361,14144,62721,13760,13440,62529,15360,64705,64897,15680,65281,16320,16e3,65089,64001,15040,15232,64321,14592,63937,63617,14400,10240,59585,59777,10560,60161,11200,10880,59969,60929,11968,12160,61249,11520,60865,60545,11328,58369,9408,9600,58689,9984,59329,59009,9792,8704,58049,58241,9024,57601,8640,8320,57409,40961,24768,24960,41281,25344,41921,41601,25152,26112,42689,42881,26432,42241,26048,25728,42049,27648,44225,44417,27968,44801,28608,28288,44609,43521,27328,27520,43841,26880,43457,43137,26688,30720,47297,47489,31040,47873,31680,31360,47681,48641,32448,32640,48961,32e3,48577,48257,31808,46081,29888,30080,46401,30464,47041,46721,30272,29184,45761,45953,29504,45313,29120,28800,45121,20480,37057,37249,20800,37633,21440,21120,37441,38401,22208,22400,38721,21760,38337,38017,21568,39937,23744,23936,40257,24320,40897,40577,24128,23040,39617,39809,23360,39169,22976,22656,38977,34817,18624,18816,35137,19200,35777,35457,19008,19968,36545,36737,20288,36097,19904,19584,35905,17408,33985,34177,17728,34561,18368,18048,34369,33281,17088,17280,33601,16640,33217,32897,16448];function O(N,j){if(N.nVbrNumFrames++,N.sum+=j,N.seen++,!(N.seenN.pos-1&&(se=N.pos-1),M=N.bag[se],Y=N.sum;var ie=0|256*M/Y;ie>255&&(ie=255),j[k]=255&ie}}this.addVbrFrame=function(N){var j=N.internal_flags,k=Tables.bitrate_table[N.version][j.bitrate_index];o(j.VBR_seek_table.bag!=null),O(j.VBR_seek_table,k)};function L(N,j){var k=N[j+0]&255;return k<<=8,k|=N[j+1]&255,k<<=8,k|=N[j+2]&255,k<<=8,k|=N[j+3]&255,k}function X(N,j,k){N[j+0]=255&(k>>24&255),N[j+1]=255&(k>>16&255),N[j+2]=255&(k>>8&255),N[j+3]=255&(k&255)}function T(N,j,k){N[j+0]=255&(k>>8&255),N[j+1]=255&(k&255)}function q(N,j){return new String(N,j,I.length(),E).equals(I)||new String(N,j,R.length(),E).equals(R)}function H(N,j,k){return 255&(N<>3&1,M=N[k+2]>>2&3,Y=N[k+3]>>6&3,se=N[k+2]>>4&15;if(se=Tables.bitrate_table[W][se],N[k+1]>>4==14?j.samprate=Tables.samplerate_table[2][M]:j.samprate=Tables.samplerate_table[W][M],W!=0?Y!=3?k+=36:k+=21:Y!=3?k+=21:k+=13,!q(N,k))return null;k+=4,j.hId=W;var ie=j.flags=L(N,k);if(k+=4,(ie&h)!=0&&(j.frames=L(N,k),k+=4),(ie&p)!=0&&(j.bytes=L(N,k),k+=4),(ie&f)!=0){if(j.toc!=null)for(var oe=0;oe>4;var ee=(N[k+1]&15)<<8;return ee+=N[k+2]&255,(re<0||re>3e3)&&(re=-1),(ee<0||ee>3e3)&&(ee=-1),j.encDelay=re,j.encPadding=ee,j},this.InitVbrTag=function(N){var j=N.internal_flags,k;N.version==1?k=m:N.out_samplerate<16e3?k=C:k=z,N.VBR==n.vbr_off&&(k=N.brate);var W=(N.version+1)*72e3*k/N.out_samplerate,M=j.sideinfo_len+v;if(j.VBR_seek_table.TotalFrameSize=W,Wy){N.bWriteVbrTag=!1;return}j.VBR_seek_table.nVbrNumFrames=0,j.VBR_seek_table.nBytesWritten=0,j.VBR_seek_table.sum=0,j.VBR_seek_table.seen=0,j.VBR_seek_table.want=1,j.VBR_seek_table.pos=0,j.VBR_seek_table.bag==null&&(j.VBR_seek_table.bag=new int[400],j.VBR_seek_table.size=400);var Y=a(y);J(N,Y);for(var se=j.VBR_seek_table.TotalFrameSize,ie=0;ie>8^A[k&255],j}this.updateMusicCRC=function(N,j,k,W){for(var M=0;M255?255:N.lowpassfreq/100+.5),U=0,G=0,te=0,ge=N.internal_flags.noise_shaping,ne=0,le=0,fe=0,be=0,de=0,$e=(N.exp_nspsytune&1)!=0,ze=(N.exp_nspsytune&2)!=0,_e=!1,Ee=!1,Ce=N.internal_flags.nogap_total,xe=N.internal_flags.nogap_current,Ne=N.ATHtype,ve=0,ke;switch(N.VBR){case vbr_abr:ke=N.VBR_mean_bitrate_kbps;break;case vbr_off:ke=N.brate;break;default:ke=N.VBR_min_bitrate_kbps}switch(N.VBR.ordinal()510&&(Y.RadioGain=510),Y.RadioGain<-510&&(Y.RadioGain=-510),G=8192,G|=3072,Y.RadioGain>=0?G|=Y.RadioGain:(G|=512,G|=-Y.RadioGain)),Y.findPeakSample&&(U=Math.abs(0|Y.PeakSample/32767*Math.pow(2,23)+.5)),Ce!=-1&&(xe>0&&(Ee=!0),xe48e3?fe=3:fe=1,(N.short_blocks==r.short_block_forced||N.short_blocks==r.short_block_dispensed||N.lowpassfreq==-1&&N.highpassfreq==-1||N.scale_leftN.scale_right||N.disable_reservoir&&N.brate<320||N.noATH||N.ATHonly||Ne==0||N.in_samplerate<=32e3)&&(le=1),be=ge+(ne<<2)+(le<<5)+(fe<<6),de=Y.nMusicCRC,X(k,W+se,re),se+=4;for(var Ie=0;Ie<9;Ie++)k[W+se+Ie]=255&ee.charAt(Ie);se+=9,k[W+se]=255&Q,se++,k[W+se]=255&ue,se++,X(k,W+se,U),se+=4,T(k,W+se,G),se+=2,T(k,W+se,te),se+=2,k[W+se]=255&ve,se++,ke>=255?k[W+se]=255:k[W+se]=255&ke,se++,k[W+se]=255&ie>>4,k[W+se+1]=255&(ie<<4)+(oe>>8),k[W+se+2]=255&oe,se+=3,k[W+se]=255&be,se++,k[W+se++]=0,T(k,W+se,N.preset),se+=2,X(k,W+se,j),se+=4,T(k,W+se,de),se+=2;for(var Pe=0;PeM.length?-1:(Y<1||j.write(M,0,Y),0)}}return e3=l,e3}var VI;function cde(){if(VI)return H1;VI=1;var e=Qi();e.System,e.VbrMode,e.Float,e.ShortBlock,e.Util,e.Arrays,e.new_array_n;var t=e.new_byte;e.new_double,e.new_float,e.new_float_n,e.new_int,e.new_int_n;var n=e.assert,r=ede(),i=tde(),a=w7(),o=z7(),l=ide(),c=$7(),u=ade(),d=y7(),h=S7();Ho();var p=ode(),f=lde();function b(){this.setModules=function(C,E){}}function g(){this.setModules=function(C,E,I){}}function y(){}function w(){this.setModules=function(C,E){}}function v(C,E,I){arguments.length!=3&&(console.error("WARN: Mp3Encoder(channels, samplerate, kbps) not specified"),C=1,E=44100,I=128);var R=new r,A=new b,O=new a,F=new h,L=new i,X=new o,T=new l,q=new f,H=new p,J=new w,Z=new u,B=new c,V=new g,N=new y;R.setModules(O,F,L,X,T,q,H,J,N),F.setModules(O,N,H,q),J.setModules(F,H),L.setModules(R),T.setModules(F,Z,X,B),X.setModules(B,Z,R.enc.psy),Z.setModules(F),B.setModules(X),q.setModules(R,F,H),A.setModules(V,N),V.setModules(H,J,L);var j=R.lame_init();j.num_channels=C,j.in_samplerate=E,j.brate=I,j.mode=d.STEREO,j.quality=3,j.bWriteVbrTag=!1,j.disable_reservoir=!0,j.write_id3tag_automatic=!1;var k=R.lame_init_params(j);n(k==0);var W=1152,M=0|1.25*W+7200,Y=t(M);this.encodeBuffer=function(se,ie){C==1&&(ie=se),n(se.length==ie.length),se.length>W&&(W=se.length,M=0|1.25*W+7200,Y=t(M));var oe=R.lame_encode_buffer(j,se,ie,se.length,Y,0,M);return new Int8Array(Y.subarray(0,oe))},this.flush=function(){var se=R.lame_encode_flush(j,Y,0,M);return new Int8Array(Y.subarray(0,se))}}function m(){this.dataOffset=0,this.dataLen=0,this.channels=0,this.sampleRate=0}function z(C){return C.charCodeAt(0)<<24|C.charCodeAt(1)<<16|C.charCodeAt(2)<<8|C.charCodeAt(3)}return m.RIFF=z("RIFF"),m.WAVE=z("WAVE"),m.fmt_=z("fmt "),m.data=z("data"),m.readHeader=function(C){var E=new m,I=C.getUint32(0,!1);if(m.RIFF==I&&(C.getUint32(4,!0),m.WAVE==C.getUint32(8,!1)&&m.fmt_==C.getUint32(12,!1))){var R=C.getUint32(16,!0),A=20;switch(R){case 16:case 18:E.channels=C.getUint16(A+2,!0),E.sampleRate=C.getUint32(A+4,!0);break;default:throw"extended fmt chunk not implemented"}A+=R;for(var O=m.data,F=0;O!=I&&(I=C.getUint32(A,!1),F=C.getUint32(A+4,!0),O!=I);)A+=F+8;return E.dataLen=F,E.dataOffset=A+8,E}},H1.Mp3Encoder=v,H1.WavHeader=m,H1}var j7=cde();const ude=Am(j7),dde=aH({__proto__:null,default:ude},[j7]);/*! + * ONNX Runtime Web v1.21.0 + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + */var k4=Object.defineProperty,hde=Object.getOwnPropertyDescriptor,pde=Object.getOwnPropertyNames,fde=Object.prototype.hasOwnProperty,mde=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')}),ur=(e,t)=>()=>(e&&(t=e(e=0)),t),zb=(e,t)=>{for(var n in t)k4(e,n,{get:t[n],enumerable:!0})},gde=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of pde(t))!fde.call(e,i)&&i!==n&&k4(e,i,{get:()=>t[i],enumerable:!(r=hde(t,i))||r.enumerable});return e},ow=e=>gde(k4({},"__esModule",{value:!0}),e),Tg,gh,Pp,HI,C7,N7=ur(()=>{Tg=new Map,gh=[],Pp=(e,t,n)=>{if(t&&typeof t.init=="function"&&typeof t.createInferenceSessionHandler=="function"){let r=Tg.get(e);if(r===void 0)Tg.set(e,{backend:t,priority:n});else{if(r.priority>n)return;if(r.priority===n&&r.backend!==t)throw new Error(`cannot register backend "${e}" using priority ${n}`)}if(n>=0){let i=gh.indexOf(e);i!==-1&&gh.splice(i,1);for(let a=0;a{let t=Tg.get(e);if(!t)return"backend not found.";if(t.initialized)return t.backend;if(t.aborted)return t.error;{let n=!!t.initPromise;try{return n||(t.initPromise=t.backend.init(e)),await t.initPromise,t.initialized=!0,t.backend}catch(r){return n||(t.error=`${r}`,t.aborted=!0),t.error}finally{delete t.initPromise}}},C7=async e=>{let t=e.executionProviders||[],n=t.map(c=>typeof c=="string"?c:c.name),r=n.length===0?gh:n,i,a=[],o=new Set;for(let c of r){let u=await HI(c);typeof u=="string"?a.push({name:c,err:u}):(i||(i=u),i===u&&o.add(c))}if(!i)throw new Error(`no available backend found. ERR: ${a.map(c=>`[${c.name}] ${c.err}`).join(", ")}`);for(let{name:c,err:u}of a)n.includes(c)&&console.warn(`removing requested execution provider "${c}" from session options because it is not available: ${u}`);let l=t.filter(c=>o.has(typeof c=="string"?c:c.name));return[i,new Proxy(e,{get:(c,u)=>u==="executionProviders"?l:Reflect.get(c,u)})]}}),xde=ur(()=>{N7()}),E7,bde=ur(()=>{E7="1.21.0"}),t3,Zc,I7=ur(()=>{bde(),t3="warning",Zc={wasm:{},webgl:{},webgpu:{},versions:{common:E7},set logLevel(e){if(e!==void 0){if(typeof e!="string"||["verbose","info","warning","error","fatal"].indexOf(e)===-1)throw new Error(`Unsupported logging level: ${e}`);t3=e}},get logLevel(){return t3}},Object.defineProperty(Zc,"logLevel",{enumerable:!0})}),Ui,yde=ur(()=>{I7(),Ui=Zc}),k7,A7,vde=ur(()=>{k7=(e,t)=>{let n=typeof document<"u"?document.createElement("canvas"):new OffscreenCanvas(1,1);n.width=e.dims[3],n.height=e.dims[2];let r=n.getContext("2d");if(r!=null){let i,a;(t==null?void 0:t.tensorLayout)!==void 0&&t.tensorLayout==="NHWC"?(i=e.dims[2],a=e.dims[3]):(i=e.dims[3],a=e.dims[2]);let o=(t==null?void 0:t.format)!==void 0?t.format:"RGB",l=t==null?void 0:t.norm,c,u;l===void 0||l.mean===void 0?c=[255,255,255,255]:typeof l.mean=="number"?c=[l.mean,l.mean,l.mean,l.mean]:(c=[l.mean[0],l.mean[1],l.mean[2],0],l.mean[3]!==void 0&&(c[3]=l.mean[3])),l===void 0||l.bias===void 0?u=[0,0,0,0]:typeof l.bias=="number"?u=[l.bias,l.bias,l.bias,l.bias]:(u=[l.bias[0],l.bias[1],l.bias[2],0],l.bias[3]!==void 0&&(u[3]=l.bias[3]));let d=a*i,h=0,p=d,f=d*2,b=-1;o==="RGBA"?(h=0,p=d,f=d*2,b=d*3):o==="RGB"?(h=0,p=d,f=d*2):o==="RBG"&&(h=0,f=d,p=d*2);for(let g=0;g{let n=typeof document<"u"?document.createElement("canvas").getContext("2d"):new OffscreenCanvas(1,1).getContext("2d"),r;if(n!=null){let i,a,o;(t==null?void 0:t.tensorLayout)!==void 0&&t.tensorLayout==="NHWC"?(i=e.dims[2],a=e.dims[1],o=e.dims[3]):(i=e.dims[3],a=e.dims[2],o=e.dims[1]);let l=t!==void 0&&t.format!==void 0?t.format:"RGB",c=t==null?void 0:t.norm,u,d;c===void 0||c.mean===void 0?u=[255,255,255,255]:typeof c.mean=="number"?u=[c.mean,c.mean,c.mean,c.mean]:(u=[c.mean[0],c.mean[1],c.mean[2],255],c.mean[3]!==void 0&&(u[3]=c.mean[3])),c===void 0||c.bias===void 0?d=[0,0,0,0]:typeof c.bias=="number"?d=[c.bias,c.bias,c.bias,c.bias]:(d=[c.bias[0],c.bias[1],c.bias[2],0],c.bias[3]!==void 0&&(d[3]=c.bias[3]));let h=a*i;if(t!==void 0&&(t.format!==void 0&&o===4&&t.format!=="RGBA"||o===3&&t.format!=="RGB"&&t.format!=="BGR"))throw new Error("Tensor format doesn't match input tensor dims");let p=4,f=0,b=1,g=2,y=3,w=0,v=h,m=h*2,z=-1;l==="RGBA"?(w=0,v=h,m=h*2,z=h*3):l==="RGB"?(w=0,v=h,m=h*2):l==="RBG"&&(w=0,m=h,v=h*2),r=n.createImageData(i,a);for(let C=0;C{A4(),G1=(e,t)=>{if(e===void 0)throw new Error("Image buffer must be defined");if(t.height===void 0||t.width===void 0)throw new Error("Image height and width must be defined");if(t.tensorLayout==="NHWC")throw new Error("NHWC Tensor layout is not supported yet");let{height:n,width:r}=t,i=t.norm??{mean:255,bias:0},a,o;typeof i.mean=="number"?a=[i.mean,i.mean,i.mean,i.mean]:a=[i.mean[0],i.mean[1],i.mean[2],i.mean[3]??255],typeof i.bias=="number"?o=[i.bias,i.bias,i.bias,i.bias]:o=[i.bias[0],i.bias[1],i.bias[2],i.bias[3]??0];let l=t.format!==void 0?t.format:"RGBA",c=t.tensorFormat!==void 0&&t.tensorFormat!==void 0?t.tensorFormat:"RGB",u=n*r,d=c==="RGBA"?new Float32Array(u*4):new Float32Array(u*3),h=4,p=0,f=1,b=2,g=3,y=0,w=u,v=u*2,m=-1;l==="RGB"&&(h=3,p=0,f=1,b=2,g=-1),c==="RGBA"?m=u*3:c==="RBG"?(y=0,v=u,w=u*2):c==="BGR"&&(v=0,w=u,y=u*2);for(let z=0;z{let n=typeof HTMLImageElement<"u"&&e instanceof HTMLImageElement,r=typeof ImageData<"u"&&e instanceof ImageData,i=typeof ImageBitmap<"u"&&e instanceof ImageBitmap,a=typeof e=="string",o,l=t??{},c=()=>{if(typeof document<"u")return document.createElement("canvas");if(typeof OffscreenCanvas<"u")return new OffscreenCanvas(1,1);throw new Error("Canvas is not supported")},u=d=>typeof HTMLCanvasElement<"u"&&d instanceof HTMLCanvasElement||d instanceof OffscreenCanvas?d.getContext("2d"):null;if(n){let d=c();d.width=e.width,d.height=e.height;let h=u(d);if(h!=null){let p=e.height,f=e.width;if(t!==void 0&&t.resizedHeight!==void 0&&t.resizedWidth!==void 0&&(p=t.resizedHeight,f=t.resizedWidth),t!==void 0){if(l=t,t.tensorFormat!==void 0)throw new Error("Image input config format must be RGBA for HTMLImageElement");l.tensorFormat="RGBA",l.height=p,l.width=f}else l.tensorFormat="RGBA",l.height=p,l.width=f;h.drawImage(e,0,0),o=h.getImageData(0,0,f,p).data}else throw new Error("Can not access image data")}else if(r){let d,h;if(t!==void 0&&t.resizedWidth!==void 0&&t.resizedHeight!==void 0?(d=t.resizedHeight,h=t.resizedWidth):(d=e.height,h=e.width),t!==void 0&&(l=t),l.format="RGBA",l.height=d,l.width=h,t!==void 0){let p=c();p.width=h,p.height=d;let f=u(p);if(f!=null)f.putImageData(e,0,0),o=f.getImageData(0,0,h,d).data;else throw new Error("Can not access image data")}else o=e.data}else if(i){if(t===void 0)throw new Error("Please provide image config with format for Imagebitmap");let d=c();d.width=e.width,d.height=e.height;let h=u(d);if(h!=null){let p=e.height,f=e.width;return h.drawImage(e,0,0,f,p),o=h.getImageData(0,0,f,p).data,l.height=p,l.width=f,G1(o,l)}else throw new Error("Can not access image data")}else{if(a)return new Promise((d,h)=>{let p=c(),f=u(p);if(!e||!f)return h();let b=new Image;b.crossOrigin="Anonymous",b.src=e,b.onload=()=>{p.width=b.width,p.height=b.height,f.drawImage(b,0,0,p.width,p.height);let g=f.getImageData(0,0,p.width,p.height);l.height=p.height,l.width=p.width,d(G1(g.data,l))}});throw new Error("Input data provided is not supported - aborted tensor creation")}if(o!==void 0)return G1(o,l);throw new Error("Input data provided is not supported - aborted tensor creation")},T7=(e,t)=>{let{width:n,height:r,download:i,dispose:a}=t,o=[1,r,n,4];return new yc({location:"texture",type:"float32",texture:e,dims:o,download:i,dispose:a})},R7=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new yc({location:"gpu-buffer",type:n??"float32",gpuBuffer:e,dims:r,download:i,dispose:a})},P7=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new yc({location:"ml-tensor",type:n??"float32",mlTensor:e,dims:r,download:i,dispose:a})},O7=(e,t,n)=>new yc({location:"cpu-pinned",type:e,data:t,dims:n??[t.length]})}),Cp,ax,n3,L7,_de=ur(()=>{Cp=new Map([["float32",Float32Array],["uint8",Uint8Array],["int8",Int8Array],["uint16",Uint16Array],["int16",Int16Array],["int32",Int32Array],["bool",Uint8Array],["float64",Float64Array],["uint32",Uint32Array],["int4",Uint8Array],["uint4",Uint8Array]]),ax=new Map([[Float32Array,"float32"],[Uint8Array,"uint8"],[Int8Array,"int8"],[Uint16Array,"uint16"],[Int16Array,"int16"],[Int32Array,"int32"],[Float64Array,"float64"],[Uint32Array,"uint32"]]),n3=!1,L7=()=>{if(!n3){n3=!0;let e=typeof BigInt64Array<"u"&&BigInt64Array.from,t=typeof BigUint64Array<"u"&&BigUint64Array.from,n=globalThis.Float16Array,r=typeof n<"u"&&n.from;e&&(Cp.set("int64",BigInt64Array),ax.set(BigInt64Array,"int64")),t&&(Cp.set("uint64",BigUint64Array),ax.set(BigUint64Array,"uint64")),r?(Cp.set("float16",n),ax.set(n,"float16")):Cp.set("float16",Uint16Array)}}}),B7,U7,zde=ur(()=>{A4(),B7=e=>{let t=1;for(let n=0;n{switch(e.location){case"cpu":return new yc(e.type,e.data,t);case"cpu-pinned":return new yc({location:"cpu-pinned",data:e.data,type:e.type,dims:t});case"texture":return new yc({location:"texture",texture:e.texture,type:e.type,dims:t});case"gpu-buffer":return new yc({location:"gpu-buffer",gpuBuffer:e.gpuBuffer,type:e.type,dims:t});case"ml-tensor":return new yc({location:"ml-tensor",mlTensor:e.mlTensor,type:e.type,dims:t});default:throw new Error(`tensorReshape: tensor location ${e.location} is not supported`)}}}),yc,A4=ur(()=>{vde(),wde(),_de(),zde(),yc=class{constructor(e,t,n){L7();let r,i;if(typeof e=="object"&&"location"in e)switch(this.dataLocation=e.location,r=e.type,i=e.dims,e.location){case"cpu-pinned":{let o=Cp.get(r);if(!o)throw new TypeError(`unsupported type "${r}" to create tensor from pinned buffer`);if(!(e.data instanceof o))throw new TypeError(`buffer should be of type ${o.name}`);this.cpuData=e.data;break}case"texture":{if(r!=="float32")throw new TypeError(`unsupported type "${r}" to create tensor from texture`);this.gpuTextureData=e.texture,this.downloader=e.download,this.disposer=e.dispose;break}case"gpu-buffer":{if(r!=="float32"&&r!=="float16"&&r!=="int32"&&r!=="int64"&&r!=="uint32"&&r!=="uint8"&&r!=="bool"&&r!=="uint4"&&r!=="int4")throw new TypeError(`unsupported type "${r}" to create tensor from gpu buffer`);this.gpuBufferData=e.gpuBuffer,this.downloader=e.download,this.disposer=e.dispose;break}case"ml-tensor":{if(r!=="float32"&&r!=="float16"&&r!=="int32"&&r!=="int64"&&r!=="uint32"&&r!=="uint64"&&r!=="int8"&&r!=="uint8"&&r!=="bool"&&r!=="uint4"&&r!=="int4")throw new TypeError(`unsupported type "${r}" to create tensor from MLTensor`);this.mlTensorData=e.mlTensor,this.downloader=e.download,this.disposer=e.dispose;break}default:throw new Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let o,l;if(typeof e=="string")if(r=e,l=n,e==="string"){if(!Array.isArray(t))throw new TypeError("A string tensor's data must be a string array.");o=t}else{let c=Cp.get(e);if(c===void 0)throw new TypeError(`Unsupported tensor type: ${e}.`);if(Array.isArray(t)){if(e==="float16"&&c===Uint16Array||e==="uint4"||e==="int4")throw new TypeError(`Creating a ${e} tensor from number array is not supported. Please use ${c.name} as data.`);e==="uint64"||e==="int64"?o=c.from(t,BigInt):o=c.from(t)}else if(t instanceof c)o=t;else if(t instanceof Uint8ClampedArray)if(e==="uint8")o=Uint8Array.from(t);else throw new TypeError("A Uint8ClampedArray tensor's data must be type of uint8");else if(e==="float16"&&t instanceof Uint16Array&&c!==Uint16Array)o=new globalThis.Float16Array(t.buffer,t.byteOffset,t.length);else throw new TypeError(`A ${r} tensor's data must be type of ${c}`)}else if(l=t,Array.isArray(e)){if(e.length===0)throw new TypeError("Tensor type cannot be inferred from an empty array.");let c=typeof e[0];if(c==="string")r="string",o=e;else if(c==="boolean")r="bool",o=Uint8Array.from(e);else throw new TypeError(`Invalid element type of data array: ${c}.`)}else if(e instanceof Uint8ClampedArray)r="uint8",o=Uint8Array.from(e);else{let c=ax.get(e.constructor);if(c===void 0)throw new TypeError(`Unsupported type for tensor data: ${e.constructor}.`);r=c,o=e}if(l===void 0)l=[o.length];else if(!Array.isArray(l))throw new TypeError("A tensor's dims must be a number array");i=l,this.cpuData=o,this.dataLocation="cpu"}let a=B7(i);if(this.cpuData&&a!==this.cpuData.length&&!((r==="uint4"||r==="int4")&&Math.ceil(a/2)===this.cpuData.length))throw new Error(`Tensor's size(${a}) does not match data length(${this.cpuData.length}).`);this.type=r,this.dims=i,this.size=a}static async fromImage(e,t){return M7(e,t)}static fromTexture(e,t){return T7(e,t)}static fromGpuBuffer(e,t){return R7(e,t)}static fromMLTensor(e,t){return P7(e,t)}static fromPinnedBuffer(e,t,n){return O7(e,t,n)}toDataURL(e){return k7(this,e)}toImageData(e){return A7(this,e)}get data(){if(this.ensureValid(),!this.cpuData)throw new Error("The data is not on CPU. Use `getData()` to download GPU data to CPU, or use `texture` or `gpuBuffer` property to access the GPU data directly.");return this.cpuData}get location(){return this.dataLocation}get texture(){if(this.ensureValid(),!this.gpuTextureData)throw new Error("The data is not stored as a WebGL texture.");return this.gpuTextureData}get gpuBuffer(){if(this.ensureValid(),!this.gpuBufferData)throw new Error("The data is not stored as a WebGPU buffer.");return this.gpuBufferData}get mlTensor(){if(this.ensureValid(),!this.mlTensorData)throw new Error("The data is not stored as a WebNN MLTensor.");return this.mlTensorData}async getData(e){switch(this.ensureValid(),this.dataLocation){case"cpu":case"cpu-pinned":return this.data;case"texture":case"gpu-buffer":case"ml-tensor":{if(!this.downloader)throw new Error("The current tensor is not created with a specified data downloader.");if(this.isDownloading)throw new Error("The current tensor is being downloaded.");try{this.isDownloading=!0;let t=await this.downloader();return this.downloader=void 0,this.dataLocation="cpu",this.cpuData=t,e&&this.disposer&&(this.disposer(),this.disposer=void 0),t}finally{this.isDownloading=!1}}default:throw new Error(`cannot get data from location: ${this.dataLocation}`)}}dispose(){if(this.isDownloading)throw new Error("The current tensor is being downloaded.");this.disposer&&(this.disposer(),this.disposer=void 0),this.cpuData=void 0,this.gpuTextureData=void 0,this.gpuBufferData=void 0,this.mlTensorData=void 0,this.downloader=void 0,this.isDownloading=void 0,this.dataLocation="none"}ensureValid(){if(this.dataLocation==="none")throw new Error("The tensor is disposed.")}reshape(e){if(this.ensureValid(),this.downloader||this.disposer)throw new Error("Cannot reshape a tensor that owns GPU resource.");return U7(this,e)}}}),cd,F7=ur(()=>{A4(),cd=yc}),db,r3,md,hu,W7=ur(()=>{I7(),db=(e,t)=>{(typeof Zc.trace>"u"?!Zc.wasm.trace:!Zc.trace)||console.timeStamp(`${e}::ORT::${t}`)},r3=(e,t)=>{var i;let n=((i=new Error().stack)==null?void 0:i.split(/\r\n|\r|\n/g))||[],r=!1;for(let a=0;a{(typeof Zc.trace>"u"?!Zc.wasm.trace:!Zc.trace)||r3("BEGIN",e)},hu=e=>{(typeof Zc.trace>"u"?!Zc.wasm.trace:!Zc.trace)||r3("END",e)}}),D7,$de=ur(()=>{N7(),F7(),W7(),D7=class V7{constructor(t){this.handler=t}async run(t,n,r){md();let i={},a={};if(typeof t!="object"||t===null||t instanceof cd||Array.isArray(t))throw new TypeError("'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.");let o=!0;if(typeof n=="object"){if(n===null)throw new TypeError("Unexpected argument[1]: cannot be null.");if(n instanceof cd)throw new TypeError("'fetches' cannot be a Tensor");if(Array.isArray(n)){if(n.length===0)throw new TypeError("'fetches' cannot be an empty array.");o=!1;for(let u of n){if(typeof u!="string")throw new TypeError("'fetches' must be a string array or an object.");if(this.outputNames.indexOf(u)===-1)throw new RangeError(`'fetches' contains invalid output name: ${u}.`);i[u]=null}if(typeof r=="object"&&r!==null)a=r;else if(typeof r<"u")throw new TypeError("'options' must be an object.")}else{let u=!1,d=Object.getOwnPropertyNames(n);for(let h of this.outputNames)if(d.indexOf(h)!==-1){let p=n[h];(p===null||p instanceof cd)&&(u=!0,o=!1,i[h]=p)}if(u){if(typeof r=="object"&&r!==null)a=r;else if(typeof r<"u")throw new TypeError("'options' must be an object.")}else a=n}}else if(typeof n<"u")throw new TypeError("Unexpected argument[1]: must be 'fetches' or 'options'.");for(let u of this.inputNames)if(typeof t[u]>"u")throw new Error(`input '${u}' is missing in 'feeds'.`);if(o)for(let u of this.outputNames)i[u]=null;let l=await this.handler.run(t,i,a),c={};for(let u in l)if(Object.hasOwnProperty.call(l,u)){let d=l[u];d instanceof cd?c[u]=d:c[u]=new cd(d.type,d.data,d.dims)}return hu(),c}async release(){return this.handler.dispose()}static async create(t,n,r,i){md();let a,o={};if(typeof t=="string"){if(a=t,typeof n=="object"&&n!==null)o=n;else if(typeof n<"u")throw new TypeError("'options' must be an object.")}else if(t instanceof Uint8Array){if(a=t,typeof n=="object"&&n!==null)o=n;else if(typeof n<"u")throw new TypeError("'options' must be an object.")}else if(t instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&t instanceof SharedArrayBuffer){let d=t,h=0,p=t.byteLength;if(typeof n=="object"&&n!==null)o=n;else if(typeof n=="number"){if(h=n,!Number.isSafeInteger(h))throw new RangeError("'byteOffset' must be an integer.");if(h<0||h>=d.byteLength)throw new RangeError(`'byteOffset' is out of range [0, ${d.byteLength}).`);if(p=t.byteLength-h,typeof r=="number"){if(p=r,!Number.isSafeInteger(p))throw new RangeError("'byteLength' must be an integer.");if(p<=0||h+p>d.byteLength)throw new RangeError(`'byteLength' is out of range (0, ${d.byteLength-h}].`);if(typeof i=="object"&&i!==null)o=i;else if(typeof i<"u")throw new TypeError("'options' must be an object.")}else if(typeof r<"u")throw new TypeError("'byteLength' must be a number.")}else if(typeof n<"u")throw new TypeError("'options' must be an object.");a=new Uint8Array(d,h,p)}else throw new TypeError("Unexpected argument[0]: must be 'path' or 'buffer'.");let[l,c]=await C7(o),u=await l.createInferenceSessionHandler(a,c);return hu(),new V7(u)}startProfiling(){this.handler.startProfiling()}endProfiling(){this.handler.endProfiling()}get inputNames(){return this.handler.inputNames}get outputNames(){return this.handler.outputNames}}}),M4,Sde=ur(()=>{$de(),M4=D7}),jde=ur(()=>{}),Cde=ur(()=>{}),Nde=ur(()=>{}),Ede=ur(()=>{}),H7={};zb(H7,{InferenceSession:()=>M4,TRACE:()=>db,TRACE_FUNC_BEGIN:()=>md,TRACE_FUNC_END:()=>hu,Tensor:()=>cd,env:()=>Ui,registerBackend:()=>Pp});var xd=ur(()=>{xde(),yde(),Sde(),F7(),jde(),Cde(),W7(),Nde(),Ede()}),T4=ur(()=>{}),G7={};zb(G7,{default:()=>q7});var s3,i3,q7,Ide=ur(()=>{var e;YU(),lf(),R4(),s3="ort-wasm-proxy-worker",i3=((e=globalThis.self)==null?void 0:e.name)===s3,i3&&(self.onmessage=t=>{let{type:n,in:r}=t.data;try{switch(n){case"init-wasm":P4(r.wasm).then(()=>{eS(r).then(()=>{postMessage({type:n})},i=>{postMessage({type:n,err:i})})},i=>{postMessage({type:n,err:i})});break;case"init-ep":{let{epName:i,env:a}=r;tS(a,i).then(()=>{postMessage({type:n})},o=>{postMessage({type:n,err:o})});break}case"copy-from":{let{buffer:i}=r,a=pw(i);postMessage({type:n,out:a});break}case"create":{let{model:i,options:a}=r;nS(i,a).then(o=>{postMessage({type:n,out:o})},o=>{postMessage({type:n,err:o})});break}case"release":rS(r),postMessage({type:n});break;case"run":{let{sessionId:i,inputIndices:a,inputs:o,outputIndices:l,options:c}=r;sS(i,a,o,l,new Array(l.length).fill(null),c).then(u=>{u.some(d=>d[3]!=="cpu")?postMessage({type:n,err:"Proxy does not support non-cpu tensor location."}):postMessage({type:n,out:u},aS([...o,...u]))},u=>{postMessage({type:n,err:u})});break}case"end-profiling":iS(r),postMessage({type:n});break;default:}}catch(i){postMessage({type:n,err:i})}}),q7=i3?null:t=>new Worker(t??fc,{type:"module",name:s3})}),K7={};zb(K7,{default:()=>X7});var a3,o3,X7,GI,kde=ur(()=>{var e,t;o3=(a3=import.meta.url,async function(n={}){var oc;var r,i,a=n,o=new Promise(($,P)=>{r=$,i=P}),l=typeof window=="object",c=typeof WorkerGlobalScope<"u",u=c&&((oc=self.name)==null?void 0:oc.startsWith("em-pthread"));a.mountExternalData=($,P)=>{$.startsWith("./")&&($=$.substring(2)),(a.Bd||(a.Bd=new Map)).set($,P)},a.unmountExternalData=()=>{delete a.Bd};var d=globalThis.SharedArrayBuffer??new WebAssembly.Memory({initial:0,maximum:0,shared:!0}).buffer.constructor;let h=()=>{let $=(K,ae,he)=>(...Oe)=>{let et=Ke,yt=ae==null?void 0:ae();Oe=K(...Oe);let Ct=ae==null?void 0:ae();return yt!==Ct&&(K=Ct,he(yt),ae=he=null),Ke!=et?new Promise((nn,pn)=>{br={resolve:nn,reject:pn}}):Oe},P=K=>async(...ae)=>{var he;try{if(a.Cd)throw Error("Session already started");let Oe=a.Cd={be:ae[0],errors:[]},et=await K(...ae);if(a.Cd!==Oe)throw Error("Session mismatch");(he=a.Dd)==null||he.flush();let yt=Oe.errors;if(0nn),0a._OrtCreateSession,K=>a._OrtCreateSession=K),a._OrtRun=P($(a._OrtRun,()=>a._OrtRun,K=>a._OrtRun=K)),a._OrtRunWithBinding=P($(a._OrtRunWithBinding,()=>a._OrtRunWithBinding,K=>a._OrtRunWithBinding=K)),a._OrtBindInput=$(a._OrtBindInput,()=>a._OrtBindInput,K=>a._OrtBindInput=K),h=void 0};a.jsepInit=($,P)=>{if(h==null||h(),$==="webgpu"){[a.Dd,a.Rd,a.Vd,a.Hd,a.Ud,a.hc,a.Wd,a.Zd,a.Sd,a.Td,a.Xd]=P;let K=a.Dd;a.jsepRegisterBuffer=(ae,he,Oe,et)=>K.registerBuffer(ae,he,Oe,et),a.jsepGetBuffer=ae=>K.getBuffer(ae),a.jsepCreateDownloader=(ae,he,Oe)=>K.createDownloader(ae,he,Oe),a.jsepOnCreateSession=ae=>{K.onCreateSession(ae)},a.jsepOnReleaseSession=ae=>{K.onReleaseSession(ae)},a.jsepOnRunStart=ae=>K.onRunStart(ae),a.$d=(ae,he)=>{K.upload(ae,he)}}else if($==="webnn"){[a.Dd,a.Yd,a.Id,a.jsepEnsureTensor,a.Jd,a.jsepDownloadTensor]=P,a.jsepReleaseTensorId=a.Id,a.jsepUploadTensor=a.Jd;let K=a.Dd;a.jsepOnRunStart=ae=>K.onRunStart(ae),a.jsepOnRunEnd=K.onRunEnd.bind(K),a.jsepRegisterMLContext=(ae,he)=>{K.registerMLContext(ae,he)},a.jsepOnReleaseSession=ae=>{K.onReleaseSession(ae)},a.jsepCreateMLTensorDownloader=(ae,he)=>K.createMLTensorDownloader(ae,he),a.jsepRegisterMLTensor=(ae,he,Oe,et)=>K.registerMLTensor(ae,he,Oe,et),a.jsepCreateMLContext=ae=>K.createMLContext(ae),a.jsepRegisterMLConstant=(ae,he,Oe,et,yt)=>K.registerMLConstant(ae,he,Oe,et,yt,a.Bd),a.jsepRegisterGraphInput=K.registerGraphInput.bind(K),a.jsepIsGraphInput=K.isGraphInput.bind(K),a.jsepCreateTemporaryTensor=K.createTemporaryTensor.bind(K)}};var p,f,b=Object.assign({},a),g=($,P)=>{throw P},y="";(l||c)&&(c?y=self.location.href:typeof document<"u"&&document.currentScript&&(y=document.currentScript.src),a3&&(y=a3),y=y.startsWith("blob:")?"":y.slice(0,y.replace(/[?#].*/,"").lastIndexOf("/")+1),c&&(f=$=>{var P=new XMLHttpRequest;return P.open("GET",$,!1),P.responseType="arraybuffer",P.send(null),new Uint8Array(P.response)}),p=async $=>{if(V($))return new Promise((K,ae)=>{var he=new XMLHttpRequest;he.open("GET",$,!0),he.responseType="arraybuffer",he.onload=()=>{he.status==200||he.status==0&&he.response?K(he.response):ae(he.status)},he.onerror=ae,he.send(null)});var P=await fetch($,{credentials:"same-origin"});if(P.ok)return P.arrayBuffer();throw Error(P.status+" : "+P.url)});var w=console.log.bind(console),v=console.error.bind(console),m=w,z=v;Object.assign(a,b),b=null;var C,E,I,R,A,O,F,L,X,T,q,H,J,Z=a.wasmBinary,B=!1,V=$=>$.startsWith("file://");function N(){return C.buffer!=R.buffer&&ee(),R}function j(){return C.buffer!=R.buffer&&ee(),A}function k(){return C.buffer!=R.buffer&&ee(),O}function W(){return C.buffer!=R.buffer&&ee(),F}function M(){return C.buffer!=R.buffer&&ee(),L}function Y(){return C.buffer!=R.buffer&&ee(),X}function se(){return C.buffer!=R.buffer&&ee(),T}function ie(){return C.buffer!=R.buffer&&ee(),J}if(u){let $=function(P){try{var K=P.data,ae=K.yd;if(ae==="load"){let he=[];self.onmessage=Oe=>he.push(Oe),self.startWorker=()=>{postMessage({yd:"loaded"});for(let Oe of he)$(Oe);self.onmessage=$};for(let Oe of K.Od)a[Oe]&&!a[Oe].proxy||(a[Oe]=(...et)=>{postMessage({yd:"callHandler",Nd:Oe,args:et})},Oe=="print"&&(m=a[Oe]),Oe=="printErr"&&(z=a[Oe]));C=K.he,ee(),oe(K.ie)}else if(ae==="run"){He(K.xd),ya(K.xd,0,0,1,0,0),Pe(),tn(K.xd),re||(s0(),re=!0);try{Je(K.de,K.Fd)}catch(he){if(he!="unwind")throw he}}else K.target!=="setimmediate"&&(ae==="checkMailbox"?re&&cn():ae&&(z(`worker: received unknown command ${ae}`),z(K)))}catch(he){throw Gl(),he}};var oe,re=!1;z=function(...P){P=P.join(" "),console.error(P)},self.alert=function(...P){postMessage({yd:"alert",text:P.join(" "),fe:Vl()})},self.onunhandledrejection=P=>{throw P.reason||P},self.onmessage=$}function ee(){var $=C.buffer;a.HEAP8=R=new Int8Array($),a.HEAP16=O=new Int16Array($),a.HEAPU8=A=new Uint8Array($),a.HEAPU16=F=new Uint16Array($),a.HEAP32=L=new Int32Array($),a.HEAPU32=X=new Uint32Array($),a.HEAPF32=T=new Float32Array($),a.HEAPF64=J=new Float64Array($),a.HEAP64=q=new BigInt64Array($),a.HEAPU64=H=new BigUint64Array($)}function pe(){u?startWorker(a):Qt.Bb()}u||(C=new WebAssembly.Memory({initial:256,maximum:65536,shared:!0}),ee());var we,Q=0,me=null;function ue(){if(--Q==0&&me){var $=me;me=null,$()}}function U($){throw z($="Aborted("+$+")"),B=!0,$=new WebAssembly.RuntimeError($+". Build with -sASSERTIONS for more info."),i($),$}function G(){return{a:{Ta:ne,Va:ge,W:Re,la:Ze,b:qe,u:tt,R:Ye,Za:ct,d:pt,pb:wt,g:Le,T:Yt,Ga:un,lb:fn,nb:Dn,Ha:it,Ea:Lt,wb:gt,Da:Jt,pa:Wt,mb:Pt,jb:Bt,Fa:zt,kb:Gt,Ma:st,za:St,eb:Ue,cb:Ot,ya:Vt,V:Zt,N:Sn,db:jn,ma:Rr,fb:sr,zb:mt,hb:zn,qb:bt,ab:bn,Aa:An,yb:tn,Ja:Vn,S:Wr,Wa:ir,$:nr,G:jr,E:es,m:rt,H:zs,B:ki,X:gi,J:$i,v:gs,O:Ri,D:Ki,t:Ps,A:Si,z:xi,w:li,r:ca,tb:ea,ub:_i,vb:ta,rb:ua,sb:Wi,bb:da,Oa:ha,La:ka,y:Kt,ja:an,Ba:en,Ka:Li,qa:rn,Ia:gn,ib:lr,U:Oi,fa:On,Sa:wr,gb:cs,Qa:Ns,Pa:Di,Ab:na,Ca:ui,ob:Ce,aa:fs,oa:Js,xb:Ai,na:Dl,$a:Lu,ia:sc,sa:Hi,ga:Ao,da:$l,ua:ic,p:Id,e:Jo,c:Ha,ea:rc,f:Oc,n:Zo,k:Ra,Y:Os,ka:Mi,j:_l,wa:zl,Ra:ac,ca:ma,Ua:Ba,P:Oa,K:wl,_:bo,Q:Pa,Z:Uu,x:Fs,l:tc,va,i:Pc,h:Ma,ra:ai,ta:wa,o:Pu,q:pa,s:nc,I:Lc,C:Ed,L:Ou,xa:l0,_a:Bu,F:La,Ya:Qo,ba:c0,M:Ta,Xa:fa,ha:yd,a:C,Na:_e}}}var te={1319426:()=>typeof wasmOffsetConverter<"u",1319483:($,P,K,ae,he)=>{if(a===void 0||!a.Bd)return 1;if(($=Nt(Number($>>>0))).startsWith("./")&&($=$.substring(2)),!($=a.Bd.get($)))return 2;if(P=Number(P>>>0),K=Number(K>>>0),ae=Number(ae>>>0),P+K>$.byteLength)return 3;try{let Oe=$.subarray(P,P+K);switch(he){case 0:j().set(Oe,ae>>>0);break;case 1:a.$d(ae,Oe);break;default:return 4}return 0}catch{return 4}},1320198:($,P,K)=>{a.Jd($,j().subarray(P>>>0,P+K>>>0))},1320261:()=>a.Yd(),1320302:$=>{a.Id($)},1320338:()=>{a.Sd()},1320369:()=>{a.Td()},1320398:()=>{a.Xd()},1320423:$=>a.Rd($),1320456:$=>a.Vd($),1320488:($,P,K)=>{a.Hd(Number($),Number(P),Number(K),!0)},1320551:($,P,K)=>{a.Hd(Number($),Number(P),Number(K))},1320608:$=>{a.hc("Abs",$,void 0)},1320659:$=>{a.hc("Neg",$,void 0)},1320710:$=>{a.hc("Floor",$,void 0)},1320763:$=>{a.hc("Ceil",$,void 0)},1320815:$=>{a.hc("Reciprocal",$,void 0)},1320873:$=>{a.hc("Sqrt",$,void 0)},1320925:$=>{a.hc("Exp",$,void 0)},1320976:$=>{a.hc("Erf",$,void 0)},1321027:$=>{a.hc("Sigmoid",$,void 0)},1321082:($,P,K)=>{a.hc("HardSigmoid",$,{alpha:P,beta:K})},1321161:$=>{a.hc("Log",$,void 0)},1321212:$=>{a.hc("Sin",$,void 0)},1321263:$=>{a.hc("Cos",$,void 0)},1321314:$=>{a.hc("Tan",$,void 0)},1321365:$=>{a.hc("Asin",$,void 0)},1321417:$=>{a.hc("Acos",$,void 0)},1321469:$=>{a.hc("Atan",$,void 0)},1321521:$=>{a.hc("Sinh",$,void 0)},1321573:$=>{a.hc("Cosh",$,void 0)},1321625:$=>{a.hc("Asinh",$,void 0)},1321678:$=>{a.hc("Acosh",$,void 0)},1321731:$=>{a.hc("Atanh",$,void 0)},1321784:$=>{a.hc("Tanh",$,void 0)},1321836:$=>{a.hc("Not",$,void 0)},1321887:($,P,K)=>{a.hc("Clip",$,{min:P,max:K})},1321956:$=>{a.hc("Clip",$,void 0)},1322008:($,P)=>{a.hc("Elu",$,{alpha:P})},1322066:$=>{a.hc("Gelu",$,void 0)},1322118:$=>{a.hc("Relu",$,void 0)},1322170:($,P)=>{a.hc("LeakyRelu",$,{alpha:P})},1322234:($,P)=>{a.hc("ThresholdedRelu",$,{alpha:P})},1322304:($,P)=>{a.hc("Cast",$,{to:P})},1322362:$=>{a.hc("Add",$,void 0)},1322413:$=>{a.hc("Sub",$,void 0)},1322464:$=>{a.hc("Mul",$,void 0)},1322515:$=>{a.hc("Div",$,void 0)},1322566:$=>{a.hc("Pow",$,void 0)},1322617:$=>{a.hc("Equal",$,void 0)},1322670:$=>{a.hc("Greater",$,void 0)},1322725:$=>{a.hc("GreaterOrEqual",$,void 0)},1322787:$=>{a.hc("Less",$,void 0)},1322839:$=>{a.hc("LessOrEqual",$,void 0)},1322898:($,P,K,ae,he)=>{a.hc("ReduceMean",$,{keepDims:!!P,noopWithEmptyAxes:!!K,axes:ae?Array.from(M().subarray(Number(ae)>>>0,Number(he)>>>0)):[]})},1323073:($,P,K,ae,he)=>{a.hc("ReduceMax",$,{keepDims:!!P,noopWithEmptyAxes:!!K,axes:ae?Array.from(M().subarray(Number(ae)>>>0,Number(he)>>>0)):[]})},1323247:($,P,K,ae,he)=>{a.hc("ReduceMin",$,{keepDims:!!P,noopWithEmptyAxes:!!K,axes:ae?Array.from(M().subarray(Number(ae)>>>0,Number(he)>>>0)):[]})},1323421:($,P,K,ae,he)=>{a.hc("ReduceProd",$,{keepDims:!!P,noopWithEmptyAxes:!!K,axes:ae?Array.from(M().subarray(Number(ae)>>>0,Number(he)>>>0)):[]})},1323596:($,P,K,ae,he)=>{a.hc("ReduceSum",$,{keepDims:!!P,noopWithEmptyAxes:!!K,axes:ae?Array.from(M().subarray(Number(ae)>>>0,Number(he)>>>0)):[]})},1323770:($,P,K,ae,he)=>{a.hc("ReduceL1",$,{keepDims:!!P,noopWithEmptyAxes:!!K,axes:ae?Array.from(M().subarray(Number(ae)>>>0,Number(he)>>>0)):[]})},1323943:($,P,K,ae,he)=>{a.hc("ReduceL2",$,{keepDims:!!P,noopWithEmptyAxes:!!K,axes:ae?Array.from(M().subarray(Number(ae)>>>0,Number(he)>>>0)):[]})},1324116:($,P,K,ae,he)=>{a.hc("ReduceLogSum",$,{keepDims:!!P,noopWithEmptyAxes:!!K,axes:ae?Array.from(M().subarray(Number(ae)>>>0,Number(he)>>>0)):[]})},1324293:($,P,K,ae,he)=>{a.hc("ReduceSumSquare",$,{keepDims:!!P,noopWithEmptyAxes:!!K,axes:ae?Array.from(M().subarray(Number(ae)>>>0,Number(he)>>>0)):[]})},1324473:($,P,K,ae,he)=>{a.hc("ReduceLogSumExp",$,{keepDims:!!P,noopWithEmptyAxes:!!K,axes:ae?Array.from(M().subarray(Number(ae)>>>0,Number(he)>>>0)):[]})},1324653:$=>{a.hc("Where",$,void 0)},1324706:($,P,K)=>{a.hc("Transpose",$,{perm:P?Array.from(M().subarray(Number(P)>>>0,Number(K)>>>0)):[]})},1324830:($,P,K,ae)=>{a.hc("DepthToSpace",$,{blocksize:P,mode:Nt(K),format:ae?"NHWC":"NCHW"})},1324963:($,P,K,ae)=>{a.hc("DepthToSpace",$,{blocksize:P,mode:Nt(K),format:ae?"NHWC":"NCHW"})},1325096:($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn,Hr,Zs)=>{a.hc("ConvTranspose",$,{format:Ct?"NHWC":"NCHW",autoPad:P,dilations:[K],group:ae,kernelShape:[he],pads:[Oe,et],strides:[yt],wIsConst:()=>!!N()[nn>>>0],outputPadding:pn?Array.from(M().subarray(Number(pn)>>>0,Number(Un)>>>0)):[],outputShape:Qn?Array.from(M().subarray(Number(Qn)>>>0,Number(Hr)>>>0)):[],activation:Nt(Zs)})},1325529:($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn,Hr)=>{a.hc("ConvTranspose",$,{format:yt?"NHWC":"NCHW",autoPad:P,dilations:Array.from(M().subarray(Number(K)>>>0,2+(Number(K)>>>0)>>>0)),group:ae,kernelShape:Array.from(M().subarray(Number(he)>>>0,2+(Number(he)>>>0)>>>0)),pads:Array.from(M().subarray(Number(Oe)>>>0,4+(Number(Oe)>>>0)>>>0)),strides:Array.from(M().subarray(Number(et)>>>0,2+(Number(et)>>>0)>>>0)),wIsConst:()=>!!N()[Ct>>>0],outputPadding:nn?Array.from(M().subarray(Number(nn)>>>0,Number(pn)>>>0)):[],outputShape:Un?Array.from(M().subarray(Number(Un)>>>0,Number(Qn)>>>0)):[],activation:Nt(Hr)})},1326190:($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn,Hr,Zs)=>{a.hc("ConvTranspose",$,{format:Ct?"NHWC":"NCHW",autoPad:P,dilations:[K],group:ae,kernelShape:[he],pads:[Oe,et],strides:[yt],wIsConst:()=>!!N()[nn>>>0],outputPadding:pn?Array.from(M().subarray(Number(pn)>>>0,Number(Un)>>>0)):[],outputShape:Qn?Array.from(M().subarray(Number(Qn)>>>0,Number(Hr)>>>0)):[],activation:Nt(Zs)})},1326623:($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn,Hr)=>{a.hc("ConvTranspose",$,{format:yt?"NHWC":"NCHW",autoPad:P,dilations:Array.from(M().subarray(Number(K)>>>0,2+(Number(K)>>>0)>>>0)),group:ae,kernelShape:Array.from(M().subarray(Number(he)>>>0,2+(Number(he)>>>0)>>>0)),pads:Array.from(M().subarray(Number(Oe)>>>0,4+(Number(Oe)>>>0)>>>0)),strides:Array.from(M().subarray(Number(et)>>>0,2+(Number(et)>>>0)>>>0)),wIsConst:()=>!!N()[Ct>>>0],outputPadding:nn?Array.from(M().subarray(Number(nn)>>>0,Number(pn)>>>0)):[],outputShape:Un?Array.from(M().subarray(Number(Un)>>>0,Number(Qn)>>>0)):[],activation:Nt(Hr)})},1327284:($,P)=>{a.hc("GlobalAveragePool",$,{format:P?"NHWC":"NCHW"})},1327375:($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn,Hr)=>{a.hc("AveragePool",$,{format:Hr?"NHWC":"NCHW",auto_pad:P,ceil_mode:K,count_include_pad:ae,storage_order:he,dilations:Oe?Array.from(M().subarray(Number(Oe)>>>0,Number(et)>>>0)):[],kernel_shape:yt?Array.from(M().subarray(Number(yt)>>>0,Number(Ct)>>>0)):[],pads:nn?Array.from(M().subarray(Number(nn)>>>0,Number(pn)>>>0)):[],strides:Un?Array.from(M().subarray(Number(Un)>>>0,Number(Qn)>>>0)):[]})},1327854:($,P)=>{a.hc("GlobalAveragePool",$,{format:P?"NHWC":"NCHW"})},1327945:($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn,Hr)=>{a.hc("AveragePool",$,{format:Hr?"NHWC":"NCHW",auto_pad:P,ceil_mode:K,count_include_pad:ae,storage_order:he,dilations:Oe?Array.from(M().subarray(Number(Oe)>>>0,Number(et)>>>0)):[],kernel_shape:yt?Array.from(M().subarray(Number(yt)>>>0,Number(Ct)>>>0)):[],pads:nn?Array.from(M().subarray(Number(nn)>>>0,Number(pn)>>>0)):[],strides:Un?Array.from(M().subarray(Number(Un)>>>0,Number(Qn)>>>0)):[]})},1328424:($,P)=>{a.hc("GlobalMaxPool",$,{format:P?"NHWC":"NCHW"})},1328511:($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn,Hr)=>{a.hc("MaxPool",$,{format:Hr?"NHWC":"NCHW",auto_pad:P,ceil_mode:K,count_include_pad:ae,storage_order:he,dilations:Oe?Array.from(M().subarray(Number(Oe)>>>0,Number(et)>>>0)):[],kernel_shape:yt?Array.from(M().subarray(Number(yt)>>>0,Number(Ct)>>>0)):[],pads:nn?Array.from(M().subarray(Number(nn)>>>0,Number(pn)>>>0)):[],strides:Un?Array.from(M().subarray(Number(Un)>>>0,Number(Qn)>>>0)):[]})},1328986:($,P)=>{a.hc("GlobalMaxPool",$,{format:P?"NHWC":"NCHW"})},1329073:($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn,Hr)=>{a.hc("MaxPool",$,{format:Hr?"NHWC":"NCHW",auto_pad:P,ceil_mode:K,count_include_pad:ae,storage_order:he,dilations:Oe?Array.from(M().subarray(Number(Oe)>>>0,Number(et)>>>0)):[],kernel_shape:yt?Array.from(M().subarray(Number(yt)>>>0,Number(Ct)>>>0)):[],pads:nn?Array.from(M().subarray(Number(nn)>>>0,Number(pn)>>>0)):[],strides:Un?Array.from(M().subarray(Number(Un)>>>0,Number(Qn)>>>0)):[]})},1329548:($,P,K,ae,he)=>{a.hc("Gemm",$,{alpha:P,beta:K,transA:ae,transB:he})},1329652:$=>{a.hc("MatMul",$,void 0)},1329706:($,P,K,ae)=>{a.hc("ArgMax",$,{keepDims:!!P,selectLastIndex:!!K,axis:ae})},1329814:($,P,K,ae)=>{a.hc("ArgMin",$,{keepDims:!!P,selectLastIndex:!!K,axis:ae})},1329922:($,P)=>{a.hc("Softmax",$,{axis:P})},1329985:($,P)=>{a.hc("Concat",$,{axis:P})},1330045:($,P,K,ae,he)=>{a.hc("Split",$,{axis:P,numOutputs:K,splitSizes:ae?Array.from(M().subarray(Number(ae)>>>0,Number(he)>>>0)):[]})},1330201:$=>{a.hc("Expand",$,void 0)},1330255:($,P)=>{a.hc("Gather",$,{axis:Number(P)})},1330326:($,P)=>{a.hc("GatherElements",$,{axis:Number(P)})},1330405:($,P)=>{a.hc("GatherND",$,{batch_dims:Number(P)})},1330484:($,P,K,ae,he,Oe,et,yt,Ct,nn,pn)=>{a.hc("Resize",$,{antialias:P,axes:K?Array.from(M().subarray(Number(K)>>>0,Number(ae)>>>0)):[],coordinateTransformMode:Nt(he),cubicCoeffA:Oe,excludeOutside:et,extrapolationValue:yt,keepAspectRatioPolicy:Nt(Ct),mode:Nt(nn),nearestMode:Nt(pn)})},1330846:($,P,K,ae,he,Oe,et)=>{a.hc("Slice",$,{starts:P?Array.from(M().subarray(Number(P)>>>0,Number(K)>>>0)):[],ends:ae?Array.from(M().subarray(Number(ae)>>>0,Number(he)>>>0)):[],axes:Oe?Array.from(M().subarray(Number(Oe)>>>0,Number(et)>>>0)):[]})},1331110:$=>{a.hc("Tile",$,void 0)},1331162:($,P,K)=>{a.hc("InstanceNormalization",$,{epsilon:P,format:K?"NHWC":"NCHW"})},1331276:($,P,K)=>{a.hc("InstanceNormalization",$,{epsilon:P,format:K?"NHWC":"NCHW"})},1331390:$=>{a.hc("Range",$,void 0)},1331443:($,P)=>{a.hc("Einsum",$,{equation:Nt(P)})},1331524:($,P,K,ae,he)=>{a.hc("Pad",$,{mode:P,value:K,pads:ae?Array.from(M().subarray(Number(ae)>>>0,Number(he)>>>0)):[]})},1331667:($,P,K,ae,he,Oe)=>{a.hc("BatchNormalization",$,{epsilon:P,momentum:K,spatial:!!he,trainingMode:!!ae,format:Oe?"NHWC":"NCHW"})},1331836:($,P,K,ae,he,Oe)=>{a.hc("BatchNormalization",$,{epsilon:P,momentum:K,spatial:!!he,trainingMode:!!ae,format:Oe?"NHWC":"NCHW"})},1332005:($,P,K)=>{a.hc("CumSum",$,{exclusive:Number(P),reverse:Number(K)})},1332102:($,P,K)=>{a.hc("DequantizeLinear",$,{axis:P,blockSize:K})},1332192:($,P,K,ae,he)=>{a.hc("GridSample",$,{align_corners:P,mode:Nt(K),padding_mode:Nt(ae),format:he?"NHWC":"NCHW"})},1332362:($,P,K,ae,he)=>{a.hc("GridSample",$,{align_corners:P,mode:Nt(K),padding_mode:Nt(ae),format:he?"NHWC":"NCHW"})},1332532:($,P)=>{a.hc("ScatterND",$,{reduction:Nt(P)})},1332617:($,P,K,ae,he,Oe,et,yt,Ct)=>{a.hc("Attention",$,{numHeads:P,isUnidirectional:K,maskFilterValue:ae,scale:he,doRotary:Oe,qkvHiddenSizes:et?Array.from(M().subarray(Number(yt)>>>0,Number(yt)+et>>>0)):[],pastPresentShareBuffer:!!Ct})},1332889:$=>{a.hc("BiasAdd",$,void 0)},1332944:$=>{a.hc("BiasSplitGelu",$,void 0)},1333005:$=>{a.hc("FastGelu",$,void 0)},1333061:($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn,Hr,Zs,Ci)=>{a.hc("Conv",$,{format:Un?"NHWC":"NCHW",auto_pad:P,dilations:K?Array.from(M().subarray(Number(K)>>>0,Number(ae)>>>0)):[],group:he,kernel_shape:Oe?Array.from(M().subarray(Number(Oe)>>>0,Number(et)>>>0)):[],pads:yt?Array.from(M().subarray(Number(yt)>>>0,Number(Ct)>>>0)):[],strides:nn?Array.from(M().subarray(Number(nn)>>>0,Number(pn)>>>0)):[],w_is_const:()=>!!N()[Number(Qn)>>>0],activation:Nt(Hr),activation_params:Zs?Array.from(se().subarray(Number(Zs)>>>0,Number(Ci)>>>0)):[]})},1333645:$=>{a.hc("Gelu",$,void 0)},1333697:($,P,K,ae,he,Oe,et,yt,Ct)=>{a.hc("GroupQueryAttention",$,{numHeads:P,kvNumHeads:K,scale:ae,softcap:he,doRotary:Oe,rotaryInterleaved:et,smoothSoftmax:yt,localWindowSize:Ct})},1333914:($,P,K,ae)=>{a.hc("LayerNormalization",$,{axis:P,epsilon:K,simplified:!!ae})},1334025:($,P,K,ae)=>{a.hc("LayerNormalization",$,{axis:P,epsilon:K,simplified:!!ae})},1334136:($,P,K,ae,he,Oe)=>{a.hc("MatMulNBits",$,{k:P,n:K,accuracyLevel:ae,bits:he,blockSize:Oe})},1334263:($,P,K,ae,he,Oe)=>{a.hc("MultiHeadAttention",$,{numHeads:P,isUnidirectional:K,maskFilterValue:ae,scale:he,doRotary:Oe})},1334422:($,P)=>{a.hc("QuickGelu",$,{alpha:P})},1334486:($,P,K,ae,he)=>{a.hc("RotaryEmbedding",$,{interleaved:!!P,numHeads:K,rotaryEmbeddingDim:ae,scale:he})},1334625:($,P,K)=>{a.hc("SkipLayerNormalization",$,{epsilon:P,simplified:!!K})},1334727:($,P,K)=>{a.hc("SkipLayerNormalization",$,{epsilon:P,simplified:!!K})},1334829:($,P,K,ae)=>{a.hc("GatherBlockQuantized",$,{gatherAxis:P,quantizeAxis:K,blockSize:ae})},1334950:$=>{a.Wd($)},1334984:($,P)=>a.Zd(Number($),Number(P),a.Cd.be,a.Cd.errors)};function ge($,P,K){return gr(async()=>{await a.Ud(Number($),Number(P),Number(K))})}function ne(){return typeof wasmOffsetConverter<"u"}class le{constructor(P){Mn(this,"name","ExitStatus");this.message=`Program terminated with exit(${P})`,this.status=P}}var fe=$=>{$.terminate(),$.onmessage=()=>{}},be=[],de=$=>{xe.length==0&&(Be(),Te(xe[0]));var P=xe.pop();if(!P)return 6;Ne.push(P),ke[$.xd]=P,P.xd=$.xd;var K={yd:"run",de:$.ce,Fd:$.Fd,xd:$.xd};return P.postMessage(K,$.Ld),0},$e=0,ze=($,P,...K)=>{for(var ae=2*K.length,he=qn(),Oe=Aa(8*ae),et=Oe>>>3,yt=0;yt>>0]=Ct)}return $=vd($,0,ae,Oe,P),er(he),$};function _e($){if(u)return ze(0,1,$);if(I=$,!(0<$e)){for(var P of Ne)fe(P);for(P of xe)fe(P);xe=[],Ne=[],ke={},B=!0}g(0,new le($))}function Ee($){if(u)return ze(1,0,$);Ce($)}var Ce=$=>{if(I=$,u)throw Ee($),"unwind";_e($)},xe=[],Ne=[],ve=[],ke={},Ie=$=>{var P=$.xd;delete ke[P],xe.push($),Ne.splice(Ne.indexOf($),1),$.xd=0,vu(P)};function Pe(){ve.forEach($=>$())}var Te=$=>new Promise(P=>{$.onmessage=he=>{var Oe=(he=he.data).yd;if(he.Ed&&he.Ed!=Vl()){var et=ke[he.Ed];et?et.postMessage(he,he.Ld):z(`Internal error! Worker sent a message "${Oe}" to target pthread ${he.Ed}, but that thread no longer exists!`)}else Oe==="checkMailbox"?cn():Oe==="spawnThread"?de(he):Oe==="cleanupThread"?Ie(ke[he.ee]):Oe==="loaded"?($.loaded=!0,P($)):Oe==="alert"?alert(`Thread ${he.fe}: ${he.text}`):he.target==="setimmediate"?$.postMessage(he):Oe==="callHandler"?a[he.Nd](...he.args):Oe&&z(`worker sent an unknown command ${Oe}`)},$.onerror=he=>{throw z(`worker sent an error! ${he.filename}:${he.lineno}: ${he.message}`),he};var K,ae=[];for(K of[])a.propertyIsEnumerable(K)&&ae.push(K);$.postMessage({yd:"load",Od:ae,he:C,ie:E})});function Be(){var $=new Worker(import.meta.url.startsWith("file:")?new URL(""+new URL("ort.webgpu.bundle.min-CEayb2S6.mjs",import.meta.url).href,import.meta.url):new URL(import.meta.url),{type:"module",workerData:"em-pthread",name:"em-pthread"});xe.push($)}var He=$=>{ee();var P=Y()[$+52>>>2>>>0];$=Y()[$+56>>>2>>>0],yl(P,P-$),er(P)},Je=($,P)=>{$e=0,$=ql($,P),0<$e?I=$:Cc($)},Me=[];function Re($){var P=new je($>>>=0);if(N()[P.wd+12>>>0]==0){var K=1;N()[P.wd+12>>>0]=K}return K=0,N()[P.wd+13>>>0]=K,Me.push(P),Nc($),_u($)}var Ve=0,Ze=()=>{cr(0,0);var $=Me.pop();go($.Gd),Ve=0};class je{constructor(P){this.Gd=P,this.wd=P-24}}function Le($){throw Ve||(Ve=$>>>0),Ve}var Xe=$=>{var P=Ve;if(!P)return Go(0),0;var K=new je(P);Y()[K.wd+16>>>2>>>0]=P;var ae=Y()[K.wd+4>>>2>>>0];if(!ae)return Go(0),P;for(var he of $){if(he===0||he===ae)break;if(Io(he,ae,K.wd+16))return Go(he),P}return Go(ae),P};function qe(){return Xe([])}function tt($){return Xe([$>>>0])}function Ye($,P){return Xe([$>>>0,P>>>0])}var ct=()=>{var $=Me.pop();$||U("no exception to throw");var P=$.Gd;if(N()[$.wd+13>>>0]==0){Me.push($);var K=1;N()[$.wd+13>>>0]=K,K=0,N()[$.wd+12>>>0]=K}throw Ve=P};function pt($,P,K){var ae=new je($>>>=0);throw P>>>=0,K>>>=0,Y()[ae.wd+16>>>2>>>0]=0,Y()[ae.wd+4>>>2>>>0]=P,Y()[ae.wd+8>>>2>>>0]=K,Ve=$}function ht($,P,K,ae){return u?ze(2,1,$,P,K,ae):wt($,P,K,ae)}function wt($,P,K,ae){if($>>>=0,K>>>=0,ae>>>=0,d===void 0)return 6;var he=[];return u&&he.length===0?ht($,P>>>=0,K,ae):($={ce:K,xd:$,Fd:ae,Ld:he},u?($.yd="spawnThread",postMessage($,he),0):de($))}var $t=typeof TextDecoder<"u"?new TextDecoder:void 0,jt=($,P=0,K=NaN)=>{var ae=(P>>>=0)+K;for(K=P;$[K]&&!(K>=ae);)++K;if(16(he=(240&he)==224?(15&he)<<12|Oe<<6|et:(7&he)<<18|Oe<<12|et<<6|63&$[P++])?ae+=String.fromCharCode(he):(he-=65536,ae+=String.fromCharCode(55296|he>>10,56320|1023&he))}}else ae+=String.fromCharCode(he)}return ae},Nt=($,P)=>($>>>=0)?jt(j(),$,P):"";function Yt($,P,K){return u?ze(3,1,$,P,K):0}function un($,P){if(u)return ze(4,1,$,P)}var Tn=$=>{for(var P=0,K=0;K<$.length;++K){var ae=$.charCodeAt(K);127>=ae?P++:2047>=ae?P+=2:55296<=ae&&57343>=ae?(P+=4,++K):P+=3}return P},Ht=($,P,K)=>{var ae=j();if(P>>>=0,0=et&&(et=65536+((1023&et)<<10)|1023&$.charCodeAt(++Oe)),127>=et){if(P>=K)break;ae[P++>>>0]=et}else{if(2047>=et){if(P+1>=K)break;ae[P++>>>0]=192|et>>6}else{if(65535>=et){if(P+2>=K)break;ae[P++>>>0]=224|et>>12}else{if(P+3>=K)break;ae[P++>>>0]=240|et>>18,ae[P++>>>0]=128|et>>12&63}ae[P++>>>0]=128|et>>6&63}ae[P++>>>0]=128|63&et}}ae[P>>>0]=0,$=P-he}else $=0;return $};function fn($,P){if(u)return ze(5,1,$,P)}function Dn($,P,K){if(u)return ze(6,1,$,P,K)}function it($,P,K){return u?ze(7,1,$,P,K):0}function Lt($,P){if(u)return ze(8,1,$,P)}function gt($,P,K){if(u)return ze(9,1,$,P,K)}function Jt($,P,K,ae){if(u)return ze(10,1,$,P,K,ae)}function Wt($,P,K,ae){if(u)return ze(11,1,$,P,K,ae)}function Pt($,P,K,ae){if(u)return ze(12,1,$,P,K,ae)}function Bt($){if(u)return ze(13,1,$)}function zt($,P){if(u)return ze(14,1,$,P)}function Gt($,P,K){if(u)return ze(15,1,$,P,K)}var qt,De,st=()=>U(""),Ae=$=>{for(var P="";j()[$>>>0];)P+=qt[j()[$++>>>0]];return P},nt={},_t={};function xt($,P,K={}){return(function(ae,he,Oe={}){var et=he.name;if(!ae)throw new De(`type "${et}" must have a positive integer typeid pointer`);if(_t.hasOwnProperty(ae)){if(Oe.Pd)return;throw new De(`Cannot register type '${et}' twice`)}_t[ae]=he,nt.hasOwnProperty(ae)&&(he=nt[ae],delete nt[ae],he.forEach(yt=>yt()))})($,P,K)}var Tt=($,P,K)=>{switch(P){case 1:return K?ae=>N()[ae>>>0]:ae=>j()[ae>>>0];case 2:return K?ae=>k()[ae>>>1>>>0]:ae=>W()[ae>>>1>>>0];case 4:return K?ae=>M()[ae>>>2>>>0]:ae=>Y()[ae>>>2>>>0];case 8:return K?ae=>q[ae>>>3]:ae=>H[ae>>>3];default:throw new TypeError(`invalid integer width (${P}): ${$}`)}};function St($,P,K){K>>>=0,xt($>>>=0,{name:P=Ae(P>>>0),fromWireType:ae=>ae,toWireType:function(ae,he){if(typeof he!="bigint"&&typeof he!="number")throw he=he===null?"null":(ae=typeof he)=="object"||ae==="array"||ae==="function"?he.toString():""+he,new TypeError(`Cannot convert "${he}" to ${this.name}`);return typeof he=="number"&&(he=BigInt(he)),he},zd:Qe,readValueFromPointer:Tt(P,K,P.indexOf("u")==-1),Ad:null})}var Qe=8;function Ue($,P,K,ae){xt($>>>=0,{name:P=Ae(P>>>0),fromWireType:function(he){return!!he},toWireType:function(he,Oe){return Oe?K:ae},zd:Qe,readValueFromPointer:function(he){return this.fromWireType(j()[he>>>0])},Ad:null})}var Ge=[],at=[];function rt($){9<($>>>=0)&&--at[$+1]==0&&(at[$]=void 0,Ge.push($))}var lt=$=>{if(!$)throw new De("Cannot use deleted val. handle = "+$);return at[$]},ot=$=>{switch($){case void 0:return 2;case null:return 4;case!0:return 6;case!1:return 8;default:let P=Ge.pop()||at.length;return at[P]=$,at[P+1]=1,P}};function At($){return this.fromWireType(Y()[$>>>2>>>0])}var kt={name:"emscripten::val",fromWireType:$=>{var P=lt($);return rt($),P},toWireType:($,P)=>ot(P),zd:Qe,readValueFromPointer:At,Ad:null};function Ot($){return xt($>>>0,kt)}var dn=($,P)=>{switch(P){case 4:return function(K){return this.fromWireType(se()[K>>>2>>>0])};case 8:return function(K){return this.fromWireType(ie()[K>>>3>>>0])};default:throw new TypeError(`invalid float width (${P}): ${$}`)}};function Vt($,P,K){K>>>=0,xt($>>>=0,{name:P=Ae(P>>>0),fromWireType:ae=>ae,toWireType:(ae,he)=>he,zd:Qe,readValueFromPointer:dn(P,K),Ad:null})}function Zt($,P,K,ae,he){if($>>>=0,K>>>=0,P=Ae(P>>>0),he===-1&&(he=4294967295),he=yt=>yt,ae===0){var Oe=32-8*K;he=yt=>yt<>>Oe}var et=P.includes("unsigned")?function(yt,Ct){return Ct>>>0}:function(yt,Ct){return Ct};xt($,{name:P,fromWireType:he,toWireType:et,zd:Qe,readValueFromPointer:Tt(P,K,ae!==0),Ad:null})}function Sn($,P,K){function ae(Oe){var et=Y()[Oe>>>2>>>0];return Oe=Y()[Oe+4>>>2>>>0],new he(N().buffer,Oe,et)}var he=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array][P];xt($>>>=0,{name:K=Ae(K>>>0),fromWireType:ae,zd:Qe,readValueFromPointer:ae},{Pd:!0})}function jn($,P){xt($>>>=0,{name:P=Ae(P>>>0),fromWireType:function(K){for(var ae,he=Y()[K>>>2>>>0],Oe=K+4,et=Oe,yt=0;yt<=he;++yt){var Ct=Oe+yt;yt!=he&&j()[Ct>>>0]!=0||(et=Nt(et,Ct-et),ae===void 0?ae=et:(ae+="\0",ae+=et),et=Ct+1)}return Vi(K),ae},toWireType:function(K,ae){ae instanceof ArrayBuffer&&(ae=new Uint8Array(ae));var he=typeof ae=="string";if(!(he||ae instanceof Uint8Array||ae instanceof Uint8ClampedArray||ae instanceof Int8Array))throw new De("Cannot pass non-string to std::string");var Oe=he?Tn(ae):ae.length,et=Hl(4+Oe+1),yt=et+4;if(Y()[et>>>2>>>0]=Oe,he)Ht(ae,yt,Oe+1);else if(he)for(he=0;he>>0]=Ct}else for(he=0;he>>0]=ae[he];return K!==null&&K.push(Vi,et),et},zd:Qe,readValueFromPointer:At,Ad(K){Vi(K)}})}var _n=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0,Cn=($,P)=>{for(var K=$>>1,ae=K+P/2;!(K>=ae)&&W()[K>>>0];)++K;if(32<(K<<=1)-$&&_n)return _n.decode(j().slice($,K));for(K="",ae=0;!(ae>=P/2);++ae){var he=k()[$+2*ae>>>1>>>0];if(he==0)break;K+=String.fromCharCode(he)}return K},Kn=($,P,K)=>{if(K??(K=2147483647),2>K)return 0;var ae=P;K=(K-=2)<2*$.length?K/2:$.length;for(var he=0;he>>1>>>0]=Oe,P+=2}return k()[P>>>1>>>0]=0,P-ae},Xn=$=>2*$.length,$r=($,P)=>{for(var K=0,ae="";!(K>=P/4);){var he=M()[$+4*K>>>2>>>0];if(he==0)break;++K,65536<=he?(he-=65536,ae+=String.fromCharCode(55296|he>>10,56320|1023&he)):ae+=String.fromCharCode(he)}return ae},Tr=($,P,K)=>{if(P>>>=0,K??(K=2147483647),4>K)return 0;var ae=P;K=ae+K-4;for(var he=0;he<$.length;++he){var Oe=$.charCodeAt(he);if(55296<=Oe&&57343>=Oe&&(Oe=65536+((1023&Oe)<<10)|1023&$.charCodeAt(++he)),M()[P>>>2>>>0]=Oe,(P+=4)+4>K)break}return M()[P>>>2>>>0]=0,P-ae},kr=$=>{for(var P=0,K=0;K<$.length;++K){var ae=$.charCodeAt(K);55296<=ae&&57343>=ae&&++K,P+=4}return P};function Rr($,P,K){if($>>>=0,P>>>=0,K=Ae(K>>>=0),P===2)var ae=Cn,he=Kn,Oe=Xn,et=yt=>W()[yt>>>1>>>0];else P===4&&(ae=$r,he=Tr,Oe=kr,et=yt=>Y()[yt>>>2>>>0]);xt($,{name:K,fromWireType:yt=>{for(var Ct,nn=Y()[yt>>>2>>>0],pn=yt+4,Un=0;Un<=nn;++Un){var Qn=yt+4+Un*P;Un!=nn&&et(Qn)!=0||(pn=ae(pn,Qn-pn),Ct===void 0?Ct=pn:(Ct+="\0",Ct+=pn),pn=Qn+P)}return Vi(yt),Ct},toWireType:(yt,Ct)=>{if(typeof Ct!="string")throw new De(`Cannot pass non-string to C++ string type ${K}`);var nn=Oe(Ct),pn=Hl(4+nn+P);return Y()[pn>>>2>>>0]=nn/P,he(Ct,pn+4,nn+P),yt!==null&&yt.push(Vi,pn),pn},zd:Qe,readValueFromPointer:At,Ad(yt){Vi(yt)}})}function sr($,P){xt($>>>=0,{Qd:!0,name:P=Ae(P>>>0),zd:0,fromWireType:()=>{},toWireType:()=>{}})}function mt($){ya($>>>0,!c,1,!l,131072,!1),Pe()}var It=$=>{if(!B)try{if($(),!(0<$e))try{u?Cc(I):Ce(I)}catch(P){P instanceof le||P=="unwind"||g(0,P)}}catch(P){P instanceof le||P=="unwind"||g(0,P)}};function tn($){$>>>=0,typeof Atomics.ge=="function"&&(Atomics.ge(M(),$>>>2,$).value.then(cn),$+=128,Atomics.store(M(),$>>>2,1))}var cn=()=>{var $=Vl();$&&(tn($),It(wu))};function zn($,P){($>>>=0)==P>>>0?setTimeout(cn):u?postMessage({Ed:$,yd:"checkMailbox"}):($=ke[$])&&$.postMessage({yd:"checkMailbox"})}var Rn=[];function bt($,P,K,ae,he){for(P>>>=0,ae/=2,Rn.length=ae,K=he>>>0>>>3,he=0;he>>0];return(P?te[P]:H0[$])(...Rn)}var bn=()=>{$e=0};function An($){$>>>=0,u?postMessage({yd:"cleanupThread",ee:$}):Ie(ke[$])}function Vn($){}var Sr=($,P)=>{var K=_t[$];if(K===void 0)throw $=r0($),K=Ae($),Vi($),new De(`${P} has unknown type ${K}`);return K},Ir=($,P,K)=>{var ae=[];return $=$.toWireType(ae,K),ae.length&&(Y()[P>>>2>>>0]=ot(ae)),$};function Wr($,P,K){return P>>>=0,K>>>=0,$=lt($>>>0),P=Sr(P,"emval::as"),Ir(P,K,$)}function ir($,P){return P>>>=0,$=lt($>>>0),(P=Sr(P,"emval::as")).toWireType(null,$)}var Yn=$=>{try{$()}catch(P){U(P)}},Zn=0,Ke=null,Et=0,Gn=[],Ut={},Bn={},Nr=0,br=null,vr=[];function gr($){return(function(P){if(!B){if(Zn===0){var K=!1,ae=!1;P((he=0)=>{if(!B&&(Et=he,K=!0,ae)){Zn=2,Yn(()=>Rc(Ke)),typeof MainLoop<"u"&&MainLoop.Md&&MainLoop.resume(),he=!1;try{var Oe=(function(){var Ct=M()[Ke+8>>>2>>>0];return Ct=Qt[Bn[Ct]],--$e,Ct()})()}catch(Ct){Oe=Ct,he=!0}var et=!1;if(!Ke){var yt=br;yt&&(br=null,(he?yt.reject:yt.resolve)(Oe),et=!0)}if(he&&!et)throw Oe}}),ae=!0,K||(Zn=1,Ke=(function(){var he=Hl(65548),Oe=he+12;Y()[he>>>2>>>0]=Oe,Y()[he+4>>>2>>>0]=Oe+65536,Oe=Gn[0];var et=Ut[Oe];return et===void 0&&(et=Nr++,Ut[Oe]=et,Bn[et]=Oe),Oe=et,M()[he+8>>>2>>>0]=Oe,he})(),typeof MainLoop<"u"&&MainLoop.Md&&MainLoop.pause(),Yn(()=>ec(Ke)))}else Zn===2?(Zn=0,Yn(Yo),Vi(Ke),Ke=null,vr.forEach(It)):U(`invalid state: ${Zn}`);return Et}})(P=>{$().then(P)})}function nr($){return $>>>=0,gr(async()=>{var P=await lt($);return ot(P)})}var tr=[];function jr($,P,K,ae){return K>>>=0,ae>>>=0,($=tr[$>>>0])(null,P=lt(P>>>0),K,ae)}var Br={},_r=$=>{var P=Br[$];return P===void 0?Ae($):P};function es($,P,K,ae,he){return K>>>=0,ae>>>=0,he>>>=0,($=tr[$>>>0])(P=lt(P>>>0),P[K=_r(K)],ae,he)}var Ur=()=>typeof globalThis=="object"?globalThis:Function("return this")();function zs($){return($>>>=0)==0?ot(Ur()):($=_r($),ot(Ur()[$]))}var Ts=$=>{var P=tr.length;return tr.push($),P},os=($,P)=>{for(var K=Array($),ae=0;ae<$;++ae)K[ae]=Sr(Y()[P+4*ae>>>2>>>0],"parameter "+ae);return K},wi=($,P)=>Object.defineProperty(P,"name",{value:$});function ki($,P,K){var ae=(P=os($,P>>>0)).shift();$--;var he=`return function (obj, func, destructorsRef, args) { +`,Oe=0,et=[];K===0&&et.push("obj");for(var yt=["retType"],Ct=[ae],nn=0;nn<$;++nn)et.push("arg"+nn),yt.push("argType"+nn),Ct.push(P[nn]),he+=` var arg${nn} = argType${nn}.readValueFromPointer(args${Oe?"+"+Oe:""}); +`,Oe+=P[nn].zd;return he+=` var rv = ${K===1?"new func":"func.call"}(${et.join(", ")}); +`,ae.Qd||(yt.push("emval_returnValue"),Ct.push(Ir),he+=` return emval_returnValue(retType, destructorsRef, rv); +`),yt.push(he+`}; +`),$=(function(pn){var Un=Function;if(!(Un instanceof Function))throw new TypeError(`new_ called with constructor type ${typeof Un} which is not a function`);var Qn=wi(Un.name||"unknownFunctionName",function(){});return Qn.prototype=Un.prototype,Qn=new Qn,(pn=Un.apply(Qn,pn))instanceof Object?pn:Qn})(yt)(...Ct),K=`methodCaller<(${P.map(pn=>pn.name).join(", ")}) => ${ae.name}>`,Ts(wi(K,$))}function gi($){return $=_r($>>>0),ot(a[$])}function $i($,P){return P>>>=0,$=lt($>>>0),P=lt(P),ot($[P])}function gs($){9<($>>>=0)&&(at[$+1]+=1)}function Ri(){return ot([])}function Ki($){$=lt($>>>0);for(var P=Array($.length),K=0;K<$.length;K++)P[K]=$[K];return ot(P)}function Ps($){return ot(_r($>>>0))}function Si(){return ot({})}function xi($){for(var P=lt($>>>=0);P.length;){var K=P.pop();P.pop()(K)}rt($)}function li($,P,K){P>>>=0,K>>>=0,$=lt($>>>0),P=lt(P),K=lt(K),$[P]=K}function ca($,P){return P>>>=0,$=($=Sr($>>>0,"_emval_take_value")).readValueFromPointer(P),ot($)}function ea($,P){$=-9007199254740992>$||9007199254740992<$?NaN:Number($),P>>>=0,$=new Date(1e3*$),M()[P>>>2>>>0]=$.getUTCSeconds(),M()[P+4>>>2>>>0]=$.getUTCMinutes(),M()[P+8>>>2>>>0]=$.getUTCHours(),M()[P+12>>>2>>>0]=$.getUTCDate(),M()[P+16>>>2>>>0]=$.getUTCMonth(),M()[P+20>>>2>>>0]=$.getUTCFullYear()-1900,M()[P+24>>>2>>>0]=$.getUTCDay(),$=($.getTime()-Date.UTC($.getUTCFullYear(),0,1,0,0,0,0))/864e5|0,M()[P+28>>>2>>>0]=$}var Wa=$=>$%4==0&&($%100!=0||$%400==0),ks=[0,31,60,91,121,152,182,213,244,274,305,335],Pi=[0,31,59,90,120,151,181,212,243,273,304,334];function _i($,P){$=-9007199254740992>$||9007199254740992<$?NaN:Number($),P>>>=0,$=new Date(1e3*$),M()[P>>>2>>>0]=$.getSeconds(),M()[P+4>>>2>>>0]=$.getMinutes(),M()[P+8>>>2>>>0]=$.getHours(),M()[P+12>>>2>>>0]=$.getDate(),M()[P+16>>>2>>>0]=$.getMonth(),M()[P+20>>>2>>>0]=$.getFullYear()-1900,M()[P+24>>>2>>>0]=$.getDay();var K=(Wa($.getFullYear())?ks:Pi)[$.getMonth()]+$.getDate()-1|0;M()[P+28>>>2>>>0]=K,M()[P+36>>>2>>>0]=-60*$.getTimezoneOffset(),K=new Date($.getFullYear(),6,1).getTimezoneOffset();var ae=new Date($.getFullYear(),0,1).getTimezoneOffset();$=0|(K!=ae&&$.getTimezoneOffset()==Math.min(ae,K)),M()[P+32>>>2>>>0]=$}function ta($){$>>>=0;var P=new Date(M()[$+20>>>2>>>0]+1900,M()[$+16>>>2>>>0],M()[$+12>>>2>>>0],M()[$+8>>>2>>>0],M()[$+4>>>2>>>0],M()[$>>>2>>>0],0),K=M()[$+32>>>2>>>0],ae=P.getTimezoneOffset(),he=new Date(P.getFullYear(),6,1).getTimezoneOffset(),Oe=new Date(P.getFullYear(),0,1).getTimezoneOffset(),et=Math.min(Oe,he);return 0>K?M()[$+32>>>2>>>0]=+(he!=Oe&&et==ae):0>>2>>>0]=P.getDay(),K=(Wa(P.getFullYear())?ks:Pi)[P.getMonth()]+P.getDate()-1|0,M()[$+28>>>2>>>0]=K,M()[$>>>2>>>0]=P.getSeconds(),M()[$+4>>>2>>>0]=P.getMinutes(),M()[$+8>>>2>>>0]=P.getHours(),M()[$+12>>>2>>>0]=P.getDate(),M()[$+16>>>2>>>0]=P.getMonth(),M()[$+20>>>2>>>0]=P.getYear(),$=P.getTime(),BigInt(isNaN($)?-1:$/1e3)}function ua($,P,K,ae,he,Oe,et){return u?ze(16,1,$,P,K,ae,he,Oe,et):-52}function Wi($,P,K,ae,he,Oe){if(u)return ze(17,1,$,P,K,ae,he,Oe)}var ci={},Oi=()=>performance.timeOrigin+performance.now();function da($,P){if(u)return ze(18,1,$,P);if(ci[$]&&(clearTimeout(ci[$].id),delete ci[$]),!P)return 0;var K=setTimeout(()=>{delete ci[$],It(()=>wd($,performance.timeOrigin+performance.now()))},P);return ci[$]={id:K,ke:P},0}function ha($,P,K,ae){$>>>=0,P>>>=0,K>>>=0,ae>>>=0;var he=new Date().getFullYear(),Oe=new Date(he,0,1).getTimezoneOffset();he=new Date(he,6,1).getTimezoneOffset();var et=Math.max(Oe,he);Y()[$>>>2>>>0]=60*et,M()[P>>>2>>>0]=+(Oe!=he),$=(P=yt=>{var Ct=Math.abs(yt);return`UTC${0<=yt?"-":"+"}${String(Math.floor(Ct/60)).padStart(2,"0")}${String(Ct%60).padStart(2,"0")}`})(Oe),P=P(he),heDate.now();function ka($,P,K){return 0<=$&&3>=$?($===0?$=Date.now():$=performance.timeOrigin+performance.now(),q[K>>>0>>>3]=BigInt(Math.round(1e6*$)),0):28}var dt=[],vt=($,P)=>{dt.length=0;for(var K;K=j()[$++>>>0];){var ae=K!=105;P+=(ae&=K!=112)&&P%8?4:0,dt.push(K==112?Y()[P>>>2>>>0]:K==106?q[P>>>3]:K==105?M()[P>>>2>>>0]:ie()[P>>>3>>>0]),P+=ae?8:4}return dt};function Kt($,P,K){return $>>>=0,P=vt(P>>>0,K>>>0),te[$](...P)}function an($,P,K){return $>>>=0,P=vt(P>>>0,K>>>0),te[$](...P)}var en=()=>{};function rn($,P){return z(Nt($>>>0,P>>>0))}var gn=()=>{throw $e+=1,"unwind"};function lr(){return 4294901760}var On=()=>navigator.hardwareConcurrency;function wr(){return U("Cannot use emscripten_pc_get_function without -sUSE_OFFSET_CONVERTER"),0}function cs($){$>>>=0;var P=j().length;if($<=P||4294901760<$)return!1;for(var K=1;4>=K;K*=2){var ae=P*(1+.2/K);ae=Math.min(ae,$+100663296);e:{ae=(Math.min(4294901760,65536*Math.ceil(Math.max($,ae)/65536))-C.buffer.byteLength+65535)/65536|0;try{C.grow(ae),ee();var he=1;break e}catch{}he=void 0}if(he)return!0}return!1}var Ar=()=>(U("Cannot use convertFrameToPC (needed by __builtin_return_address) without -sUSE_OFFSET_CONVERTER"),0),Or={},ls=$=>{$.forEach(P=>{Ar()})};function Ns(){var $=Error().stack.toString().split(` +`);return $[0]=="Error"&&$.shift(),ls($),Or.Kd=Ar(),Or.ae=$,Or.Kd}function Di($,P,K){if($>>>=0,P>>>=0,Or.Kd==$)var ae=Or.ae;else(ae=Error().stack.toString().split(` +`))[0]=="Error"&&ae.shift(),ls(ae);for(var he=3;ae[he]&&Ar()!=$;)++he;for($=0;$>>2>>>0]=Ar();return $}var ii,Hs={},ji=()=>{if(!ii){var $,P={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:"./this.program"};for($ in Hs)Hs[$]===void 0?delete P[$]:P[$]=Hs[$];var K=[];for($ in P)K.push(`${$}=${P[$]}`);ii=K}return ii};function na($,P){if(u)return ze(19,1,$,P);$>>>=0,P>>>=0;var K=0;return ji().forEach((ae,he)=>{var Oe=P+K;for(he=Y()[$+4*he>>>2>>>0]=Oe,Oe=0;Oe>>0]=ae.charCodeAt(Oe);N()[he>>>0]=0,K+=ae.length+1}),0}function ui($,P){if(u)return ze(20,1,$,P);$>>>=0,P>>>=0;var K=ji();Y()[$>>>2>>>0]=K.length;var ae=0;return K.forEach(he=>ae+=he.length+1),Y()[P>>>2>>>0]=ae,0}function fs($){return u?ze(21,1,$):52}function Js($,P,K,ae){return u?ze(22,1,$,P,K,ae):52}function Ai($,P,K,ae){return u?ze(23,1,$,P,K,ae):70}var Wl=[null,[],[]];function Dl($,P,K,ae){if(u)return ze(24,1,$,P,K,ae);P>>>=0,K>>>=0,ae>>>=0;for(var he=0,Oe=0;Oe>>2>>>0],yt=Y()[P+4>>>2>>>0];P+=8;for(var Ct=0;Ct>>0],pn=Wl[$];nn===0||nn===10?(($===1?m:z)(jt(pn)),pn.length=0):pn.push(nn)}he+=yt}return Y()[ae>>>2>>>0]=he,0}function yd($){return $>>>0}u||(function(){for(var $=a.numThreads-1;$--;)Be();be.unshift(()=>{Q++,(function(P){u?P():Promise.all(xe.map(Te)).then(P)})(()=>ue())})})();for(var yu=Array(256),bl=0;256>bl;++bl)yu[bl]=String.fromCharCode(bl);qt=yu,De=a.BindingError=class extends Error{constructor($){super($),this.name="BindingError"}},a.InternalError=class extends Error{constructor($){super($),this.name="InternalError"}},at.push(0,1,void 0,1,null,1,!0,1,!1,1),a.count_emval_handles=()=>at.length/2-5-Ge.length;var Qt,H0=[_e,Ee,ht,Yt,un,fn,Dn,it,Lt,gt,Jt,Wt,Pt,Bt,zt,Gt,ua,Wi,da,na,ui,fs,Js,Ai,Dl];(async function(){function $(ae,he){return Qt=ae.exports,Qt=(function(){var Oe=Qt,et={};for(let[yt,Ct]of Object.entries(Oe))et[yt]=typeof Ct=="function"?(...nn)=>{Gn.push(yt);try{return Ct(...nn)}finally{B||(Gn.pop(),Ke&&Zn===1&&Gn.length===0&&(Zn=0,$e+=1,Yn(Va),typeof Fibers<"u"&&Fibers.le()))}}:Ct;return et})(),Qt=(function(){var Oe=Qt,et=Ct=>nn=>Ct(nn)>>>0,yt=Ct=>()=>Ct()>>>0;return(Oe=Object.assign({},Oe)).Cb=et(Oe.Cb),Oe.fc=yt(Oe.fc),Oe.ic=et(Oe.ic),Oe.vc=et(Oe.vc),Oe.wc=yt(Oe.wc),Oe.Ac=et(Oe.Ac),Oe})(),ve.push(Qt.jc),E=he,ue(),Qt}Q++;var P=G();if(a.instantiateWasm)return new Promise(ae=>{a.instantiateWasm(P,(he,Oe)=>{$(he,Oe),ae(he.exports)})});if(u)return new Promise(ae=>{oe=he=>{var Oe=new WebAssembly.Instance(he,G());ae($(Oe,he))}});we??(we=a.locateFile?a.locateFile?a.locateFile("ort-wasm-simd-threaded.jsep.wasm",y):y+"ort-wasm-simd-threaded.jsep.wasm":new URL(""+new URL("ort-wasm-simd-threaded.jsep-D5Jk56-t.wasm",import.meta.url).href,import.meta.url).href);try{var K=await(async function(ae){var he=we;if(!Z&&typeof WebAssembly.instantiateStreaming=="function"&&!V(he))try{var Oe=fetch(he,{credentials:"same-origin"});return await WebAssembly.instantiateStreaming(Oe,ae)}catch(et){z(`wasm streaming compile failed: ${et}`),z("falling back to ArrayBuffer instantiation")}return(async function(et,yt){try{var Ct=await(async function(nn){if(!Z)try{var pn=await p(nn);return new Uint8Array(pn)}catch{}if(nn==we&&Z)nn=new Uint8Array(Z);else{if(!f)throw"both async and sync fetching of the wasm failed";nn=f(nn)}return nn})(et);return await WebAssembly.instantiate(Ct,yt)}catch(nn){z(`failed to asynchronously prepare wasm: ${nn}`),U(nn)}})(he,ae)})(P);return $(K.instance,K.module)}catch(ae){return i(ae),Promise.reject(ae)}})();var r0=$=>(r0=Qt.Cb)($),s0=()=>(s0=Qt.Db)();a._OrtInit=($,P)=>(a._OrtInit=Qt.Eb)($,P),a._OrtGetLastError=($,P)=>(a._OrtGetLastError=Qt.Fb)($,P),a._OrtCreateSessionOptions=($,P,K,ae,he,Oe,et,yt,Ct,nn)=>(a._OrtCreateSessionOptions=Qt.Gb)($,P,K,ae,he,Oe,et,yt,Ct,nn),a._OrtAppendExecutionProvider=($,P)=>(a._OrtAppendExecutionProvider=Qt.Hb)($,P),a._OrtAddFreeDimensionOverride=($,P,K)=>(a._OrtAddFreeDimensionOverride=Qt.Ib)($,P,K),a._OrtAddSessionConfigEntry=($,P,K)=>(a._OrtAddSessionConfigEntry=Qt.Jb)($,P,K),a._OrtReleaseSessionOptions=$=>(a._OrtReleaseSessionOptions=Qt.Kb)($),a._OrtCreateSession=($,P,K)=>(a._OrtCreateSession=Qt.Lb)($,P,K),a._OrtReleaseSession=$=>(a._OrtReleaseSession=Qt.Mb)($),a._OrtGetInputOutputCount=($,P,K)=>(a._OrtGetInputOutputCount=Qt.Nb)($,P,K),a._OrtGetInputName=($,P)=>(a._OrtGetInputName=Qt.Ob)($,P),a._OrtGetOutputName=($,P)=>(a._OrtGetOutputName=Qt.Pb)($,P),a._OrtFree=$=>(a._OrtFree=Qt.Qb)($),a._OrtCreateTensor=($,P,K,ae,he,Oe)=>(a._OrtCreateTensor=Qt.Rb)($,P,K,ae,he,Oe),a._OrtGetTensorData=($,P,K,ae,he)=>(a._OrtGetTensorData=Qt.Sb)($,P,K,ae,he),a._OrtReleaseTensor=$=>(a._OrtReleaseTensor=Qt.Tb)($),a._OrtCreateRunOptions=($,P,K,ae)=>(a._OrtCreateRunOptions=Qt.Ub)($,P,K,ae),a._OrtAddRunConfigEntry=($,P,K)=>(a._OrtAddRunConfigEntry=Qt.Vb)($,P,K),a._OrtReleaseRunOptions=$=>(a._OrtReleaseRunOptions=Qt.Wb)($),a._OrtCreateBinding=$=>(a._OrtCreateBinding=Qt.Xb)($),a._OrtBindInput=($,P,K)=>(a._OrtBindInput=Qt.Yb)($,P,K),a._OrtBindOutput=($,P,K,ae)=>(a._OrtBindOutput=Qt.Zb)($,P,K,ae),a._OrtClearBoundOutputs=$=>(a._OrtClearBoundOutputs=Qt._b)($),a._OrtReleaseBinding=$=>(a._OrtReleaseBinding=Qt.$b)($),a._OrtRunWithBinding=($,P,K,ae,he)=>(a._OrtRunWithBinding=Qt.ac)($,P,K,ae,he),a._OrtRun=($,P,K,ae,he,Oe,et,yt)=>(a._OrtRun=Qt.bc)($,P,K,ae,he,Oe,et,yt),a._OrtEndProfiling=$=>(a._OrtEndProfiling=Qt.cc)($),a._JsepOutput=($,P,K)=>(a._JsepOutput=Qt.dc)($,P,K),a._JsepGetNodeName=$=>(a._JsepGetNodeName=Qt.ec)($);var Vl=()=>(Vl=Qt.fc)(),Vi=a._free=$=>(Vi=a._free=Qt.gc)($),Hl=a._malloc=$=>(Hl=a._malloc=Qt.ic)($),ya=($,P,K,ae,he,Oe)=>(ya=Qt.kc)($,P,K,ae,he,Oe),Gl=()=>(Gl=Qt.lc)(),vd=($,P,K,ae,he)=>(vd=Qt.mc)($,P,K,ae,he),vu=$=>(vu=Qt.nc)($),Cc=$=>(Cc=Qt.oc)($),wd=($,P)=>(wd=Qt.pc)($,P),wu=()=>(wu=Qt.qc)(),cr=($,P)=>(cr=Qt.rc)($,P),Go=$=>(Go=Qt.sc)($),yl=($,P)=>(yl=Qt.tc)($,P),er=$=>(er=Qt.uc)($),Aa=$=>(Aa=Qt.vc)($),qn=()=>(qn=Qt.wc)(),go=$=>(go=Qt.xc)($),Nc=$=>(Nc=Qt.yc)($),Io=($,P,K)=>(Io=Qt.zc)($,P,K),_u=$=>(_u=Qt.Ac)($),zu=a.dynCall_iii=($,P,K)=>(zu=a.dynCall_iii=Qt.Bc)($,P,K),ko=a.dynCall_vi=($,P)=>(ko=a.dynCall_vi=Qt.Cc)($,P),ql=a.dynCall_ii=($,P)=>(ql=a.dynCall_ii=Qt.Dc)($,P),_d=a.dynCall_vii=($,P,K)=>(_d=a.dynCall_vii=Qt.Ec)($,P,K),$u=a.dynCall_iiii=($,P,K,ae)=>($u=a.dynCall_iiii=Qt.Fc)($,P,K,ae),Su=a.dynCall_viii=($,P,K,ae)=>(Su=a.dynCall_viii=Qt.Gc)($,P,K,ae),ju=a.dynCall_iiiii=($,P,K,ae,he)=>(ju=a.dynCall_iiiii=Qt.Hc)($,P,K,ae,he),zd=a.dynCall_viiii=($,P,K,ae,he)=>(zd=a.dynCall_viiii=Qt.Ic)($,P,K,ae,he),Da=a.dynCall_viiiiii=($,P,K,ae,he,Oe,et)=>(Da=a.dynCall_viiiiii=Qt.Jc)($,P,K,ae,he,Oe,et),Cu=a.dynCall_viiiiiii=($,P,K,ae,he,Oe,et,yt)=>(Cu=a.dynCall_viiiiiii=Qt.Kc)($,P,K,ae,he,Oe,et,yt),Ec=a.dynCall_ji=($,P)=>(Ec=a.dynCall_ji=Qt.Lc)($,P),i0=a.dynCall_v=$=>(i0=a.dynCall_v=Qt.Mc)($),$d=a.dynCall_viiiii=($,P,K,ae,he,Oe)=>($d=a.dynCall_viiiii=Qt.Nc)($,P,K,ae,he,Oe),Kl=a.dynCall_i=$=>(Kl=a.dynCall_i=Qt.Oc)($),Nu=a.dynCall_fii=($,P,K)=>(Nu=a.dynCall_fii=Qt.Pc)($,P,K),Eu=a.dynCall_viiiiiiii=($,P,K,ae,he,Oe,et,yt,Ct)=>(Eu=a.dynCall_viiiiiiii=Qt.Qc)($,P,K,ae,he,Oe,et,yt,Ct),Ic=a.dynCall_viiiiiiiiii=($,P,K,ae,he,Oe,et,yt,Ct,nn,pn)=>(Ic=a.dynCall_viiiiiiiiii=Qt.Rc)($,P,K,ae,he,Oe,et,yt,Ct,nn,pn),Gs=a.dynCall_jiii=($,P,K,ae)=>(Gs=a.dynCall_jiii=Qt.Sc)($,P,K,ae),Xl=a.dynCall_dii=($,P,K)=>(Xl=a.dynCall_dii=Qt.Tc)($,P,K),kc=a.dynCall_viiiiiiiii=($,P,K,ae,he,Oe,et,yt,Ct,nn)=>(kc=a.dynCall_viiiiiiiii=Qt.Uc)($,P,K,ae,he,Oe,et,yt,Ct,nn),qo=a.dynCall_viiiiiiiiiii=($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un)=>(qo=a.dynCall_viiiiiiiiiii=Qt.Vc)($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un),Sd=a.dynCall_iiiiii=($,P,K,ae,he,Oe)=>(Sd=a.dynCall_iiiiii=Qt.Wc)($,P,K,ae,he,Oe),Ac=a.dynCall_iij=($,P,K)=>(Ac=a.dynCall_iij=Qt.Xc)($,P,K),Yl=a.dynCall_iiiiiiiiii=($,P,K,ae,he,Oe,et,yt,Ct,nn)=>(Yl=a.dynCall_iiiiiiiiii=Qt.Yc)($,P,K,ae,he,Oe,et,yt,Ct,nn),Jl=a.dynCall_iiiiiiiiiii=($,P,K,ae,he,Oe,et,yt,Ct,nn,pn)=>(Jl=a.dynCall_iiiiiiiiiii=Qt.Zc)($,P,K,ae,he,Oe,et,yt,Ct,nn,pn),vl=a.dynCall_vij=($,P,K)=>(vl=a.dynCall_vij=Qt._c)($,P,K),Iu=a.dynCall_iiif=($,P,K,ae)=>(Iu=a.dynCall_iiif=Qt.$c)($,P,K,ae),ku=a.dynCall_iiij=($,P,K,ae)=>(ku=a.dynCall_iiij=Qt.ad)($,P,K,ae),Ko=a.dynCall_fiii=($,P,K,ae)=>(Ko=a.dynCall_fiii=Qt.bd)($,P,K,ae),jd=a.dynCall_viiiiiiiiiiiii=($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn,Hr)=>(jd=a.dynCall_viiiiiiiiiiiii=Qt.cd)($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn,Hr),Mc=a.dynCall_vjiii=($,P,K,ae,he)=>(Mc=a.dynCall_vjiii=Qt.dd)($,P,K,ae,he),Tc=a.dynCall_vif=($,P,K)=>(Tc=a.dynCall_vif=Qt.ed)($,P,K),Au=a.dynCall_iiiiiii=($,P,K,ae,he,Oe,et)=>(Au=a.dynCall_iiiiiii=Qt.fd)($,P,K,ae,he,Oe,et),Mu=a.dynCall_iiiij=($,P,K,ae,he)=>(Mu=a.dynCall_iiiij=Qt.gd)($,P,K,ae,he),Tu=a.dynCall_iiiiiiii=($,P,K,ae,he,Oe,et,yt)=>(Tu=a.dynCall_iiiiiiii=Qt.hd)($,P,K,ae,he,Oe,et,yt),Cd=a.dynCall_viiiiiiiiiiii=($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn)=>(Cd=a.dynCall_viiiiiiiiiiii=Qt.id)($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn),a0=a.dynCall_diii=($,P,K,ae)=>(a0=a.dynCall_diii=Qt.jd)($,P,K,ae),Zl=a.dynCall_jiiii=($,P,K,ae,he)=>(Zl=a.dynCall_jiiii=Qt.kd)($,P,K,ae,he),Ru=a.dynCall_viiij=($,P,K,ae,he)=>(Ru=a.dynCall_viiij=Qt.ld)($,P,K,ae,he),o0=a.dynCall_fiiii=($,P,K,ae,he)=>(o0=a.dynCall_fiiii=Qt.md)($,P,K,ae,he),Ql=a.dynCall_viiif=($,P,K,ae,he)=>(Ql=a.dynCall_viiif=Qt.nd)($,P,K,ae,he),xo=a.dynCall_diiii=($,P,K,ae,he)=>(xo=a.dynCall_diiii=Qt.od)($,P,K,ae,he),Nd=a.dynCall_viiid=($,P,K,ae,he)=>(Nd=a.dynCall_viiid=Qt.pd)($,P,K,ae,he),Xo=a.dynCall_iiiijii=($,P,K,ae,he,Oe,et)=>(Xo=a.dynCall_iiiijii=Qt.qd)($,P,K,ae,he,Oe,et),eo=a.dynCall_iiiiiij=($,P,K,ae,he,Oe,et)=>(eo=a.dynCall_iiiiiij=Qt.rd)($,P,K,ae,he,Oe,et),ec=$=>(ec=Qt.sd)($),Va=()=>(Va=Qt.td)(),Rc=$=>(Rc=Qt.ud)($),Yo=()=>(Yo=Qt.vd)();function Pc($,P,K){var ae=qn();try{_d($,P,K)}catch(he){if(er(ae),he!==he+0)throw he;cr(1,0)}}function Ha($,P,K){var ae=qn();try{return zu($,P,K)}catch(he){if(er(ae),he!==he+0)throw he;cr(1,0)}}function tc($,P){var K=qn();try{ko($,P)}catch(ae){if(er(K),ae!==ae+0)throw ae;cr(1,0)}}function Jo($,P){var K=qn();try{return ql($,P)}catch(ae){if(er(K),ae!==ae+0)throw ae;cr(1,0)}}function Oc($,P,K,ae){var he=qn();try{return $u($,P,K,ae)}catch(Oe){if(er(he),Oe!==Oe+0)throw Oe;cr(1,0)}}function Pu($,P,K,ae,he){var Oe=qn();try{zd($,P,K,ae,he)}catch(et){if(er(Oe),et!==et+0)throw et;cr(1,0)}}function Zo($,P,K,ae,he){var Oe=qn();try{return ju($,P,K,ae,he)}catch(et){if(er(Oe),et!==et+0)throw et;cr(1,0)}}function Ma($,P,K,ae){var he=qn();try{Su($,P,K,ae)}catch(Oe){if(er(he),Oe!==Oe+0)throw Oe;cr(1,0)}}function Os($,P,K,ae,he,Oe,et){var yt=qn();try{return Au($,P,K,ae,he,Oe,et)}catch(Ct){if(er(yt),Ct!==Ct+0)throw Ct;cr(1,0)}}function Fs($){var P=qn();try{i0($)}catch(K){if(er(P),K!==K+0)throw K;cr(1,0)}}function wl($,P,K){var ae=qn();try{return Ac($,P,K)}catch(he){if(er(ae),he!==he+0)throw he;cr(1,0)}}function pa($,P,K,ae,he,Oe){var et=qn();try{$d($,P,K,ae,he,Oe)}catch(yt){if(er(et),yt!==yt+0)throw yt;cr(1,0)}}function Ta($,P,K){var ae=qn();try{vl($,P,K)}catch(he){if(er(ae),he!==he+0)throw he;cr(1,0)}}function nc($,P,K,ae,he,Oe,et){var yt=qn();try{Da($,P,K,ae,he,Oe,et)}catch(Ct){if(er(yt),Ct!==Ct+0)throw Ct;cr(1,0)}}function Lc($,P,K,ae,he,Oe,et,yt){var Ct=qn();try{Cu($,P,K,ae,he,Oe,et,yt)}catch(nn){if(er(Ct),nn!==nn+0)throw nn;cr(1,0)}}function Ra($,P,K,ae,he,Oe){var et=qn();try{return Sd($,P,K,ae,he,Oe)}catch(yt){if(er(et),yt!==yt+0)throw yt;cr(1,0)}}function Mi($,P,K,ae,he,Oe,et,yt){var Ct=qn();try{return Tu($,P,K,ae,he,Oe,et,yt)}catch(nn){if(er(Ct),nn!==nn+0)throw nn;cr(1,0)}}function Ou($,P,K,ae,he,Oe,et,yt,Ct,nn){var pn=qn();try{kc($,P,K,ae,he,Oe,et,yt,Ct,nn)}catch(Un){if(er(pn),Un!==Un+0)throw Un;cr(1,0)}}function Ed($,P,K,ae,he,Oe,et,yt,Ct){var nn=qn();try{Eu($,P,K,ae,he,Oe,et,yt,Ct)}catch(pn){if(er(nn),pn!==pn+0)throw pn;cr(1,0)}}function Id($){var P=qn();try{return Kl($)}catch(K){if(er(P),K!==K+0)throw K;cr(1,0)}}function _l($,P,K,ae,he,Oe,et,yt,Ct,nn){var pn=qn();try{return Yl($,P,K,ae,he,Oe,et,yt,Ct,nn)}catch(Un){if(er(pn),Un!==Un+0)throw Un;cr(1,0)}}function Ao($,P,K){var ae=qn();try{return Nu($,P,K)}catch(he){if(er(ae),he!==he+0)throw he;cr(1,0)}}function Pa($,P,K,ae){var he=qn();try{return Gs($,P,K,ae)}catch(Oe){if(er(he),Oe!==Oe+0)throw Oe;return cr(1,0),0n}}function Lu($,P,K){var ae=qn();try{return Xl($,P,K)}catch(he){if(er(ae),he!==he+0)throw he;cr(1,0)}}function Bu($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un){var Qn=qn();try{qo($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un)}catch(Hr){if(er(Qn),Hr!==Hr+0)throw Hr;cr(1,0)}}function l0($,P,K,ae,he,Oe,et,yt,Ct,nn,pn){var Un=qn();try{Ic($,P,K,ae,he,Oe,et,yt,Ct,nn,pn)}catch(Qn){if(er(Un),Qn!==Qn+0)throw Qn;cr(1,0)}}function zl($,P,K,ae,he,Oe,et,yt,Ct,nn,pn){var Un=qn();try{return Jl($,P,K,ae,he,Oe,et,yt,Ct,nn,pn)}catch(Qn){if(er(Un),Qn!==Qn+0)throw Qn;cr(1,0)}}function rc($,P,K,ae){var he=qn();try{return Iu($,P,K,ae)}catch(Oe){if(er(he),Oe!==Oe+0)throw Oe;cr(1,0)}}function Oa($,P,K,ae){var he=qn();try{return ku($,P,K,ae)}catch(Oe){if(er(he),Oe!==Oe+0)throw Oe;cr(1,0)}}function $l($,P,K,ae){var he=qn();try{return Ko($,P,K,ae)}catch(Oe){if(er(he),Oe!==Oe+0)throw Oe;cr(1,0)}}function Qo($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn,Hr){var Zs=qn();try{jd($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn,Hr)}catch(Ci){if(er(Zs),Ci!==Ci+0)throw Ci;cr(1,0)}}function fa($,P,K,ae,he){var Oe=qn();try{Mc($,P,K,ae,he)}catch(et){if(er(Oe),et!==et+0)throw et;cr(1,0)}}function va($,P,K){var ae=qn();try{Tc($,P,K)}catch(he){if(er(ae),he!==he+0)throw he;cr(1,0)}}function bo($,P){var K=qn();try{return Ec($,P)}catch(ae){if(er(K),ae!==ae+0)throw ae;return cr(1,0),0n}}function ma($,P,K,ae,he){var Oe=qn();try{return Mu($,P,K,ae,he)}catch(et){if(er(Oe),et!==et+0)throw et;cr(1,0)}}function La($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn){var Hr=qn();try{Cd($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn)}catch(Zs){if(er(Hr),Zs!==Zs+0)throw Zs;cr(1,0)}}function sc($,P,K,ae){var he=qn();try{return a0($,P,K,ae)}catch(Oe){if(er(he),Oe!==Oe+0)throw Oe;cr(1,0)}}function Uu($,P,K,ae,he){var Oe=qn();try{return Zl($,P,K,ae,he)}catch(et){if(er(Oe),et!==et+0)throw et;return cr(1,0),0n}}function c0($,P,K,ae,he){var Oe=qn();try{Ru($,P,K,ae,he)}catch(et){if(er(Oe),et!==et+0)throw et;cr(1,0)}}function ic($,P,K,ae,he){var Oe=qn();try{return o0($,P,K,ae,he)}catch(et){if(er(Oe),et!==et+0)throw et;cr(1,0)}}function wa($,P,K,ae,he){var Oe=qn();try{Ql($,P,K,ae,he)}catch(et){if(er(Oe),et!==et+0)throw et;cr(1,0)}}function Hi($,P,K,ae,he){var Oe=qn();try{return xo($,P,K,ae,he)}catch(et){if(er(Oe),et!==et+0)throw et;cr(1,0)}}function ai($,P,K,ae,he){var Oe=qn();try{Nd($,P,K,ae,he)}catch(et){if(er(Oe),et!==et+0)throw et;cr(1,0)}}function Ba($,P,K,ae,he,Oe,et){var yt=qn();try{return Xo($,P,K,ae,he,Oe,et)}catch(Ct){if(er(yt),Ct!==Ct+0)throw Ct;cr(1,0)}}function ac($,P,K,ae,he,Oe,et){var yt=qn();try{return eo($,P,K,ae,he,Oe,et)}catch(Ct){if(er(yt),Ct!==Ct+0)throw Ct;cr(1,0)}}return a.stackSave=()=>qn(),a.stackRestore=$=>er($),a.stackAlloc=$=>Aa($),a.setValue=function($,P,K="i8"){switch(K.endsWith("*")&&(K="*"),K){case"i1":case"i8":N()[$>>>0]=P;break;case"i16":k()[$>>>1>>>0]=P;break;case"i32":M()[$>>>2>>>0]=P;break;case"i64":q[$>>>3]=BigInt(P);break;case"float":se()[$>>>2>>>0]=P;break;case"double":ie()[$>>>3>>>0]=P;break;case"*":Y()[$>>>2>>>0]=P;break;default:U(`invalid type for setValue: ${K}`)}},a.getValue=function($,P="i8"){switch(P.endsWith("*")&&(P="*"),P){case"i1":case"i8":return N()[$>>>0];case"i16":return k()[$>>>1>>>0];case"i32":return M()[$>>>2>>>0];case"i64":return q[$>>>3];case"float":return se()[$>>>2>>>0];case"double":return ie()[$>>>3>>>0];case"*":return Y()[$>>>2>>>0];default:U(`invalid type for getValue: ${P}`)}},a.UTF8ToString=Nt,a.stringToUTF8=Ht,a.lengthBytesUTF8=Tn,(function $(){if(0{T4(),l3=typeof location>"u"?void 0:location.origin,qI=()=>{var e;return(e=import.meta.url)!=null&&e.startsWith("file:")?new URL(new URL(""+new URL("ort.webgpu.bundle.min-CEayb2S6.mjs",import.meta.url).href,import.meta.url).href,l3).href:import.meta.url},fc=qI(),Y7=()=>{if(fc&&!fc.startsWith("blob:"))return fc.substring(0,fc.lastIndexOf("/")+1)},q1=(e,t)=>{try{let n=t??fc;return(n?new URL(e,n):new URL(e)).origin===l3}catch{return!1}},KI=(e,t)=>{let n=t??fc;try{return(n?new URL(e,n):new URL(e)).href}catch{return}},XI=(e,t)=>`${t??"./"}${e}`,c3=async e=>{let t=await(await fetch(e,{credentials:"same-origin"})).blob();return URL.createObjectURL(t)},YI=async e=>(await import(e)).default,u3=(Ide(),ow(G7)).default,J7=async()=>{if(!fc)throw new Error("Failed to load proxy worker: cannot determine the script source URL.");if(q1(fc))return[void 0,u3()];let e=await c3(fc);return[e,u3(e)]},d3=(kde(),ow(K7)).default,Z7=async(e,t,n)=>{if(!e&&!t&&d3&&fc&&q1(fc))return[void 0,d3];{let r="ort-wasm-simd-threaded.jsep.mjs",i=e??KI(r,t),a=n&&i&&!q1(i,t),o=a?await c3(i):i??XI(r,t);return[a?o:void 0,await YI(o)]}}}),h3,K1,Rg,p3,JI,ZI,P4,qa,lf=ur(()=>{R4(),K1=!1,Rg=!1,p3=!1,JI=()=>{if(typeof SharedArrayBuffer>"u")return!1;try{return typeof MessageChannel<"u"&&new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch{return!1}},ZI=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,30,1,28,0,65,0,253,15,253,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,186,1,26,11]))}catch{return!1}},P4=async e=>{if(K1)return Promise.resolve();if(Rg)throw new Error("multiple calls to 'initializeWebAssembly()' detected.");if(p3)throw new Error("previous call to 'initializeWebAssembly()' failed.");Rg=!0;let t=e.initTimeout,n=e.numThreads;if(!ZI())throw new Error("WebAssembly SIMD is not supported in the current environment.");let r=JI();n>1&&!r&&(typeof self<"u"&&!self.crossOriginIsolated&&console.warn("env.wasm.numThreads is set to "+n+", but this will not work unless you enable crossOriginIsolated mode. See https://web.dev/cross-origin-isolation-guide/ for more info."),console.warn("WebAssembly multi-threading is not supported in the current environment. Falling back to single-threading."),e.numThreads=n=1);let i=e.wasmPaths,a=typeof i=="string"?i:void 0,o=i==null?void 0:i.mjs,l=(o==null?void 0:o.href)??o,c=i==null?void 0:i.wasm,u=(c==null?void 0:c.href)??c,d=e.wasmBinary,[h,p]=await Z7(l,a,n>1),f=!1,b=[];if(t>0&&b.push(new Promise(g=>{setTimeout(()=>{f=!0,g()},t)})),b.push(new Promise((g,y)=>{let w={numThreads:n};if(d)w.wasmBinary=d;else if(u||a)w.locateFile=v=>u??a+v;else if(l&&l.indexOf("blob:")!==0)w.locateFile=v=>new URL(v,l).href;else if(h){let v=Y7();v&&(w.locateFile=m=>v+m)}p(w).then(v=>{Rg=!1,K1=!0,h3=v,g(),h&&URL.revokeObjectURL(h)},v=>{Rg=!1,p3=!0,y(v)})})),await Promise.race(b),f)throw new Error(`WebAssembly backend initializing failed due to timeout: ${t}ms`)},qa=()=>{if(K1&&h3)return h3;throw new Error("WebAssembly is not initialized yet.")}}),So,lw,ti,O4=ur(()=>{lf(),So=(e,t)=>{let n=qa(),r=n.lengthBytesUTF8(e)+1,i=n._malloc(r);return n.stringToUTF8(e,i,r),t.push(i),i},lw=(e,t,n,r)=>{if(typeof e=="object"&&e!==null){if(n.has(e))throw new Error("Circular reference in options");n.add(e)}Object.entries(e).forEach(([i,a])=>{let o=t?t+i:i;if(typeof a=="object")lw(a,o+".",n,r);else if(typeof a=="string"||typeof a=="number")r(o,a.toString());else if(typeof a=="boolean")r(o,a?"1":"0");else throw new Error(`Can't handle extra config type: ${typeof a}`)})},ti=e=>{let t=qa(),n=t.stackSave();try{let r=t.PTR_SIZE,i=t.stackAlloc(2*r);t._OrtGetLastError(i,i+r);let a=Number(t.getValue(i,r===4?"i32":"i64")),o=t.getValue(i+r,"*"),l=o?t.UTF8ToString(o):"";throw new Error(`${e} ERROR_CODE: ${a}, ERROR_MESSAGE: ${l}`)}finally{t.stackRestore(n)}}}),Q7,Ade=ur(()=>{lf(),O4(),Q7=e=>{let t=qa(),n=0,r=[],i=e||{};try{if((e==null?void 0:e.logSeverityLevel)===void 0)i.logSeverityLevel=2;else if(typeof e.logSeverityLevel!="number"||!Number.isInteger(e.logSeverityLevel)||e.logSeverityLevel<0||e.logSeverityLevel>4)throw new Error(`log serverity level is not valid: ${e.logSeverityLevel}`);if((e==null?void 0:e.logVerbosityLevel)===void 0)i.logVerbosityLevel=0;else if(typeof e.logVerbosityLevel!="number"||!Number.isInteger(e.logVerbosityLevel))throw new Error(`log verbosity level is not valid: ${e.logVerbosityLevel}`);(e==null?void 0:e.terminate)===void 0&&(i.terminate=!1);let a=0;return(e==null?void 0:e.tag)!==void 0&&(a=So(e.tag,r)),n=t._OrtCreateRunOptions(i.logSeverityLevel,i.logVerbosityLevel,!!i.terminate,a),n===0&&ti("Can't create run options."),(e==null?void 0:e.extra)!==void 0&&lw(e.extra,"",new WeakSet,(o,l)=>{let c=So(o,r),u=So(l,r);t._OrtAddRunConfigEntry(n,c,u)!==0&&ti(`Can't set a run config entry: ${o} - ${l}.`)}),[n,r]}catch(a){throw n!==0&&t._OrtReleaseRunOptions(n),r.forEach(o=>t._free(o)),a}}}),QI,ek,tk,nk,eL,Mde=ur(()=>{lf(),O4(),QI=e=>{switch(e){case"disabled":return 0;case"basic":return 1;case"extended":return 2;case"all":return 99;default:throw new Error(`unsupported graph optimization level: ${e}`)}},ek=e=>{switch(e){case"sequential":return 0;case"parallel":return 1;default:throw new Error(`unsupported execution mode: ${e}`)}},tk=e=>{e.extra||(e.extra={}),e.extra.session||(e.extra.session={});let t=e.extra.session;t.use_ort_model_bytes_directly||(t.use_ort_model_bytes_directly="1"),e.executionProviders&&e.executionProviders.some(n=>(typeof n=="string"?n:n.name)==="webgpu")&&(e.enableMemPattern=!1)},nk=(e,t,n)=>{for(let r of t){let i=typeof r=="string"?r:r.name;switch(i){case"webnn":if(i="WEBNN",typeof r!="string"){let o=r==null?void 0:r.deviceType;if(o){let l=So("deviceType",n),c=So(o,n);qa()._OrtAddSessionConfigEntry(e,l,c)!==0&&ti(`Can't set a session config entry: 'deviceType' - ${o}.`)}}break;case"webgpu":if(i="JS",typeof r!="string"){let o=r;if(o!=null&&o.preferredLayout){if(o.preferredLayout!=="NCHW"&&o.preferredLayout!=="NHWC")throw new Error(`preferredLayout must be either 'NCHW' or 'NHWC': ${o.preferredLayout}`);let l=So("preferredLayout",n),c=So(o.preferredLayout,n);qa()._OrtAddSessionConfigEntry(e,l,c)!==0&&ti(`Can't set a session config entry: 'preferredLayout' - ${o.preferredLayout}.`)}}break;case"wasm":case"cpu":continue;default:throw new Error(`not supported execution provider: ${i}`)}let a=So(i,n);qa()._OrtAppendExecutionProvider(e,a)!==0&&ti(`Can't append execution provider: ${i}.`)}},eL=e=>{let t=qa(),n=0,r=[],i=e||{};tk(i);try{let a=QI(i.graphOptimizationLevel??"all"),o=ek(i.executionMode??"sequential"),l=typeof i.logId=="string"?So(i.logId,r):0,c=i.logSeverityLevel??2;if(!Number.isInteger(c)||c<0||c>4)throw new Error(`log serverity level is not valid: ${c}`);let u=i.logVerbosityLevel??0;if(!Number.isInteger(u)||u<0||u>4)throw new Error(`log verbosity level is not valid: ${u}`);let d=typeof i.optimizedModelFilePath=="string"?So(i.optimizedModelFilePath,r):0;if(n=t._OrtCreateSessionOptions(a,!!i.enableCpuMemArena,!!i.enableMemPattern,o,!!i.enableProfiling,0,l,c,u,d),n===0&&ti("Can't create session options."),i.executionProviders&&nk(n,i.executionProviders,r),i.enableGraphCapture!==void 0){if(typeof i.enableGraphCapture!="boolean")throw new Error(`enableGraphCapture must be a boolean value: ${i.enableGraphCapture}`);let h=So("enableGraphCapture",r),p=So(i.enableGraphCapture.toString(),r);t._OrtAddSessionConfigEntry(n,h,p)!==0&&ti(`Can't set a session config entry: 'enableGraphCapture' - ${i.enableGraphCapture}.`)}if(i.freeDimensionOverrides)for(let[h,p]of Object.entries(i.freeDimensionOverrides)){if(typeof h!="string")throw new Error(`free dimension override name must be a string: ${h}`);if(typeof p!="number"||!Number.isInteger(p)||p<0)throw new Error(`free dimension override value must be a non-negative integer: ${p}`);let f=So(h,r);t._OrtAddFreeDimensionOverride(n,f,p)!==0&&ti(`Can't set a free dimension override: ${h} - ${p}.`)}return i.extra!==void 0&&lw(i.extra,"",new WeakSet,(h,p)=>{let f=So(h,r),b=So(p,r);t._OrtAddSessionConfigEntry(n,f,b)!==0&&ti(`Can't set a session config entry: ${h} - ${p}.`)}),[n,r]}catch(a){throw n!==0&&t._OrtReleaseSessionOptions(n)!==0&&ti("Can't release session options."),r.forEach(o=>t._free(o)),a}}}),Qf,Np,Ep,L4,cw,B4,U4,V$,hs=ur(()=>{Qf=e=>{switch(e){case"int8":return 3;case"uint8":return 2;case"bool":return 9;case"int16":return 5;case"uint16":return 4;case"int32":return 6;case"uint32":return 12;case"float16":return 10;case"float32":return 1;case"float64":return 11;case"string":return 8;case"int64":return 7;case"uint64":return 13;case"int4":return 22;case"uint4":return 21;default:throw new Error(`unsupported data type: ${e}`)}},Np=e=>{switch(e){case 3:return"int8";case 2:return"uint8";case 9:return"bool";case 5:return"int16";case 4:return"uint16";case 6:return"int32";case 12:return"uint32";case 10:return"float16";case 1:return"float32";case 11:return"float64";case 8:return"string";case 7:return"int64";case 13:return"uint64";case 22:return"int4";case 21:return"uint4";default:throw new Error(`unsupported data type: ${e}`)}},Ep=(e,t)=>{let n=[-1,4,1,1,2,2,4,8,-1,1,2,8,4,8,-1,-1,-1,-1,-1,-1,-1,.5,.5][e],r=typeof t=="number"?t:t.reduce((i,a)=>i*a,1);return n>0?Math.ceil(r*n):void 0},L4=e=>{switch(e){case"float16":return typeof Float16Array<"u"&&Float16Array.from?Float16Array:Uint16Array;case"float32":return Float32Array;case"uint8":return Uint8Array;case"int8":return Int8Array;case"uint16":return Uint16Array;case"int16":return Int16Array;case"int32":return Int32Array;case"bool":return Uint8Array;case"float64":return Float64Array;case"uint32":return Uint32Array;case"int64":return BigInt64Array;case"uint64":return BigUint64Array;default:throw new Error(`unsupported type: ${e}`)}},cw=e=>{switch(e){case"verbose":return 0;case"info":return 1;case"warning":return 2;case"error":return 3;case"fatal":return 4;default:throw new Error(`unsupported logging level: ${e}`)}},B4=e=>e==="float32"||e==="float16"||e==="int32"||e==="int64"||e==="uint32"||e==="uint8"||e==="bool"||e==="uint4"||e==="int4",U4=e=>e==="float32"||e==="float16"||e==="int32"||e==="int64"||e==="uint32"||e==="uint64"||e==="int8"||e==="uint8"||e==="bool"||e==="uint4"||e==="int4",V$=e=>{switch(e){case"none":return 0;case"cpu":return 1;case"cpu-pinned":return 2;case"texture":return 3;case"gpu-buffer":return 4;case"ml-tensor":return 5;default:throw new Error(`unsupported data location: ${e}`)}}}),F4,tL=ur(()=>{T4(),F4=async e=>{if(typeof e=="string"){let t=await fetch(e);if(!t.ok)throw new Error(`failed to load external data file: ${e}`);let n=t.headers.get("Content-Length"),r=n?parseInt(n,10):0;if(r<1073741824)return new Uint8Array(await t.arrayBuffer());{if(!t.body)throw new Error(`failed to load external data file: ${e}, no response body.`);let i=t.body.getReader(),a;try{a=new ArrayBuffer(r)}catch(l){if(l instanceof RangeError){let c=Math.ceil(r/65536);a=new WebAssembly.Memory({initial:c,maximum:c}).buffer}else throw l}let o=0;for(;;){let{done:l,value:c}=await i.read();if(l)break;let u=c.byteLength;new Uint8Array(a,o,u).set(c),o+=u}return new Uint8Array(a,0,r)}}else return e instanceof Blob?new Uint8Array(await e.arrayBuffer()):e instanceof Uint8Array?e:new Uint8Array(e)}}),rk,sk,ik,ak,W4,ok,Bs,D0=ur(()=>{hs(),rk=["V","I","W","E","F"],sk=(e,t)=>{console.log(`[${rk[e]},${new Date().toISOString()}]${t}`)},W4=(e,t)=>{ik=e,ak=t},ok=(e,t)=>{let n=cw(e),r=cw(ik);n>=r&&sk(n,typeof t=="function"?t():t)},Bs=(...e)=>{ak&&ok(...e)}}),D4,nL=ur(()=>{hs(),D4=(e,t)=>new(L4(t))(e)}),V4=ur(()=>{}),f3,X1,Y1,lk,ck,m3,H$,uk,rL,Tde=ur(()=>{D0(),V4(),f3=new Map([[64,250],[128,200],[256,200],[512,200],[2048,230],[4096,200],[8192,50],[16384,50],[32768,50],[65536,50],[131072,50],[262144,50],[524288,50],[1048576,50],[2097152,30],[4194304,20],[8388608,10],[12582912,10],[16777216,10],[26214400,15],[33554432,22],[44236800,2],[58982400,6],[67108864,6],[134217728,6],[167772160,6]]),X1=[],Y1=e=>Math.ceil(Number(e)/16)*16,lk=e=>{for(let t=0;tck++,H$=async(e,t,n,r)=>{let i=Y1(n),a=e.device.createBuffer({size:i,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});try{let o=e.getCommandEncoder();e.endComputePass(),o.copyBufferToBuffer(t,0,a,0,i),e.flush(),await a.mapAsync(GPUMapMode.READ);let l=a.getMappedRange();if(r){let c=r();return c.set(new Uint8Array(l,0,n)),c}else return new Uint8Array(l.slice(0,n))}finally{a.destroy()}},uk=class{constructor(e){this.backend=e,this.storageCache=new Map,this.freeBuffers=new Map,this.freeUniformBuffers=new Map,this.buffersPending=[],this.capturedPendingBuffers=new Map;for(let[t]of f3)X1.push(t),this.freeBuffers.set(t,[]),this.freeUniformBuffers.set(t,[]);this.sessionCount=0}upload(e,t){let n=t.buffer,r=t.byteOffset,i=t.byteLength,a=Y1(i),o=this.storageCache.get(e);if(!o)throw new Error("gpu data for uploading does not exist");if(Number(o.originalSize)!==i)throw new Error(`inconsistent data size. gpu data size=${o.originalSize}, data size=${i}`);let l=this.backend.device.createBuffer({mappedAtCreation:!0,size:a,usage:GPUBufferUsage.MAP_WRITE|GPUBufferUsage.COPY_SRC}),c=l.getMappedRange();new Uint8Array(c).set(new Uint8Array(n,r,i)),l.unmap();let u=this.backend.device.createCommandEncoder();u.copyBufferToBuffer(l,0,o.gpuData.buffer,0,a),this.backend.device.queue.submit([u.finish()]),l.destroy(),Bs("verbose",()=>`[WebGPU] GpuDataManager.upload(id=${e})`)}memcpy(e,t){let n=this.storageCache.get(e);if(!n)throw new Error("source gpu data for memcpy does not exist");let r=this.storageCache.get(t);if(!r)throw new Error("destination gpu data for memcpy does not exist");if(n.originalSize!==r.originalSize)throw new Error("inconsistent source and destination gpu data size");let i=Y1(n.originalSize),a=this.backend.getCommandEncoder();this.backend.endComputePass(),a.copyBufferToBuffer(n.gpuData.buffer,0,r.gpuData.buffer,0,i)}registerExternalBuffer(e,t,n){let r;if(n){if(r=n[0],e===n[1])return Bs("verbose",()=>`[WebGPU] GpuDataManager.registerExternalBuffer(size=${t}) => id=${r}, buffer is the same, skip.`),r;if(this.backend.capturedCommandList.has(this.backend.currentSessionId))throw new Error(`Registering a different external buffer under graph capture mode is not supported yet. + Please use the previous external buffer!`)}else r=m3();return this.storageCache.set(r,{gpuData:{id:r,type:0,buffer:e},originalSize:t}),Bs("verbose",()=>`[WebGPU] GpuDataManager.registerExternalBuffer(size=${t}) => id=${r}, registered.`),r}unregisterExternalBuffer(e){e!==void 0&&(this.storageCache.delete(e),Bs("verbose",()=>`[WebGPU] GpuDataManager.unregisterExternalBuffer() => id=${e}`))}create(e,t=GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST){let n=lk(e),r,i=(t&GPUBufferUsage.STORAGE)===GPUBufferUsage.STORAGE,a=(t&GPUBufferUsage.UNIFORM)===GPUBufferUsage.UNIFORM;if(i||a){let l=(i?this.freeBuffers:this.freeUniformBuffers).get(n);l?l.length>0?r=l.pop():r=this.backend.device.createBuffer({size:n,usage:t}):r=this.backend.device.createBuffer({size:n,usage:t})}else r=this.backend.device.createBuffer({size:n,usage:t});let o={id:m3(),type:0,buffer:r};return this.storageCache.set(o.id,{gpuData:o,originalSize:Number(e)}),Bs("verbose",()=>`[WebGPU] GpuDataManager.create(size=${e}) => id=${o.id}`),o}get(e){var t;return(t=this.storageCache.get(e))==null?void 0:t.gpuData}release(e){let t=typeof e=="bigint"?Number(e):e,n=this.storageCache.get(t);if(!n){if(this.storageCache.size===0)return 0;throw new Error("releasing data does not exist")}return Bs("verbose",()=>`[WebGPU] GpuDataManager.release(id=${t}), gpuDataId=${n.gpuData.id}`),this.storageCache.delete(t),this.buffersPending.push(n.gpuData.buffer),n.originalSize}async download(e,t){let n=this.storageCache.get(Number(e));if(!n)throw new Error("data does not exist");await H$(this.backend,n.gpuData.buffer,n.originalSize,t)}refreshPendingBuffers(){if(this.buffersPending.length!==0)if(this.backend.sessionStatus==="default"){for(let e of this.buffersPending){let t=f3.get(e.size);if((e.usage&GPUBufferUsage.STORAGE)===GPUBufferUsage.STORAGE){let n=this.freeBuffers.get(e.size)||[];t===void 0||n.length>=t?e.destroy():n.push(e)}else if((e.usage&GPUBufferUsage.UNIFORM)===GPUBufferUsage.UNIFORM){let n=this.freeUniformBuffers.get(e.size)||[];t===void 0||n.length>=t?e.destroy():n.push(e)}else e.destroy()}this.buffersPending=[]}else{let e=this.capturedPendingBuffers.get(this.backend.currentSessionId);e||(e=[],this.capturedPendingBuffers.set(this.backend.currentSessionId,e));for(let t of this.buffersPending)e.push(t);this.buffersPending=[]}}dispose(){this.freeBuffers.forEach(e=>{e.forEach(t=>{t.destroy()})}),this.freeUniformBuffers.forEach(e=>{e.forEach(t=>{t.destroy()})}),this.storageCache.forEach(e=>{e.gpuData.buffer.destroy()}),this.capturedPendingBuffers.forEach(e=>{e.forEach(t=>{t.destroy()})}),this.storageCache=new Map,this.freeBuffers=new Map,this.freeUniformBuffers=new Map,this.capturedPendingBuffers=new Map}onCreateSession(){this.sessionCount+=1}onReleaseSession(e){let t=this.capturedPendingBuffers.get(e);t&&(t.forEach(n=>{n.destroy()}),this.capturedPendingBuffers.delete(e)),this.sessionCount-=1,this.sessionCount===0&&(Bs("warning",()=>"[WebGPU] Clearing webgpu buffer cache"),this.storageCache.forEach(n=>{n.gpuData.buffer.destroy()}),this.storageCache=new Map)}},rL=(...e)=>new uk(...e)}),dk,pi,oa=ur(()=>{dk=class{constructor(e){Object.assign(this,e)}get cacheKey(){return this.key||(this.key=Object.getOwnPropertyNames(this).sort().map(e=>`${this[e]}`).join(";")),this.key}},pi=e=>new dk(e)}),hk,Nm,In,uw,sL,iL,aL,vs=ur(()=>{hk=class{static calcMatMulShape(e,t){return e[1]!==t[0]?void 0:[e[0],t[1]]}},Nm=class{static calcShape(e,t,n=!1){let r=e.length,i=t.length;if(r===0)return t;if(i===0)return e;let a=Math.max(e.length,t.length),o=new Array(a);if(n){if(r<2||i<2)return;let l=hk.calcMatMulShape([e[r-2],e[r-1]],[t[i-2],t[i-1]]);if(l===void 0)return;[o[a-2],o[a-1]]=l}for(let l=n?3:1;l<=a;l++){let c=r-l<0?1:e[r-l],u=i-l<0?1:t[i-l];if(c!==u&&c>1&&u>1)return;let d=Math.max(c,u);if(c&&u)o[a-l]=Math.max(c,u);else{if(d>1)return;o[a-l]=0}}return o}static isValidBroadcast(e,t){let n=e.length,r=t.length;if(n>r)return!1;for(let i=1;i<=n;i++)if(e[n-i]!==1&&e[n-i]!==t[r-i])return!1;return!0}},In=class vv{static size(t){return vv.getSizeFromDimensionRange(t,0,t.length)}static convertShape(t,n=4){let r=t.length;if(r===0)return[];let i=new Array(r),a=r-1;for(;a>=0;){if(t[a]%n===0){i[a]=t[a]/n;break}if(n%t[a]!==0)throw new Error("cannot convert shape");i[a]=1,n/=t[a],a--}for(a--;a>=0;a--)i[a]=t[a];return i}static sizeFromDimension(t,n){if(n<0||n>t.length)throw new Error(`invalid dimension of ${n} for sizeFromDimension as Tensor has ${t.length} dimensions.`);return vv.getSizeFromDimensionRange(t,n,t.length)}static sizeToDimension(t,n){if(n<0||n>t.length)throw new Error(`invalid dimension of ${n} for sizeToDimension as Tensor has ${t.length} dimensions.`);return vv.getSizeFromDimensionRange(t,0,n)}static getSizeFromDimensionRange(t,n,r){let i=1;for(let a=n;a=0;--i)r[i]=r[i+1]*t[i+1];return r}static normalizeAxis(t,n){if(t<-n&&t>=n)throw new Error("unsupported axis for this operation.");return t<0?t+n:t}static normalizeAxes(t,n){return t.map(r=>this.normalizeAxis(r,n??t.length))}static sortBasedOnPerm(t,n){return n?n.map(r=>t[r]):t.slice().reverse()}static padShape(t,n){let r=t.length;return t.map((i,a)=>i+n[a]+n[a+r])}static areEqual(t,n){return t.length!==n.length?!1:t.every((r,i)=>r===n[i])}},uw=class ox{static adjustPoolAttributes(t,n,r,i,a,o){if(!t&&r.length!==n.length-2)throw new Error("length of specified kernel shapes should be 2 less than length of input dimensions");if(t)for(let l=0;l=r.length?r.push(n[l+2]):r[l]=n[l+2];for(let l=0;l=r[l]||o[l+r.length]>=r[l])throw new Error("pads should be smaller than kernel")}}static adjustPadsBasedOnAutoPad(t,n,r,i,a,o,l){if(l){if(a.length!==2*(t.length-2))throw new Error("length of pads should be twice the length of data dimensions");if(n.length!==t.length-2)throw new Error("length of strides should be the length of data dimensions");if(i.length!==t.length-2)throw new Error("length of kernel shapes should be the length of data dimensions");for(let c=0;c{hs(),vs(),Em=64,J1=(e,t)=>{if(t===3)throw new Error("vec3 has same alignment as vec4, use vec4 instead");switch(Number(e)){case 10:return t>1?`vec${t}`:"f16";case 1:return t>1?`vec${t}`:"f32";case 6:return t>1?`vec${t}`:"i32";case 12:return t>1?`vec${t}`:"u32";case 7:if(t>1)throw new Error("currently not supported vecX of uint64 yet");return["vec2","i32"];case 13:if(t>1)throw new Error("currently not supported vecX of uint64 yet");return["vec2","u32"];case 9:if(t!==4)throw new Error("bool must be vec4");return["u32","vec4"];case 22:return"i32";case 21:return"u32";default:throw new Error(`Unknown data type: ${e}`)}},Za=(e,t=1)=>{let n=J1(e,t);return typeof n=="string"?n:n[0]},Bo=(e,t=1)=>{let n=J1(e,t);return typeof n=="string"?n:n[1]},Yr=(...e)=>{let t=[];return e.forEach(n=>{n.length!==0&&t.push({type:12,data:n},{type:12,data:In.computeStrides(n)})}),t},Yi=e=>e%4===0?4:e%2===0?2:1,G$=(e="f32",t,n="0")=>!t||t===1?`${e}(${n})`:`vec${t}<${e}>(${n})`,um=(e,t,n)=>e==="f32"?n:t===1?`f32(${n})`:`vec${t}(${n})`,Ph=(e,t)=>t===4?`(${e}.x + ${e}.y + ${e}.z + ${e}.w)`:t===2?`(${e}.x + ${e}.y)`:t===3?`(${e}.x + ${e}.y + ${e}.z)`:e,Gr=(e,t,n,r)=>e.startsWith("uniforms.")&&n>4?typeof t=="string"?r==="f16"?`${e}[(${t}) / 8][(${t}) % 8 / 4][(${t}) % 8 % 4]`:`${e}[(${t}) / 4][(${t}) % 4]`:r==="f16"?`${e}[${Math.floor(t/8)}][${Math.floor(t%8/4)}][${t%8%4}]`:`${e}[${Math.floor(t/4)}][${t%4}]`:n>1?`${e}[${t}]`:e,Pg=(e,t,n,r,i)=>{let a=typeof n=="number",o=a?n:n.length,l=[...new Array(o).keys()],c=o<2?"u32":o<=4?`vec${o}`:`array`,u=J1(t,i),d=typeof u=="string"?u:u[1],h=typeof u=="string"?u:u[0],p={indices:c,value:d,storage:h,tensor:t},f=N=>typeof N=="string"?N:`${N}u`,b={offsetToIndices:!1,indicesToOffset:!1,broadcastedIndicesToOffset:!1,set:!1,setByIndices:!1,get:!1,getByIndices:!1},g=a?"uniforms.":"",y=`${g}${e}_shape`,w=`${g}${e}_strides`,v="";for(let N=0;N ${p.indices} { + var indices: ${p.indices}; + var current = offset; + ${v} + return indices; + }`,z=N=>(b.offsetToIndices=!0,o<2?N:`o2i_${e}(${N})`),C=[];if(o>=2)for(let N=o-1;N>=0;N--)C.push(`${Gr(w,N,o)} * (indices[${N}])`);let E=o<2?"":` + fn i2o_${e}(indices: ${p.indices}) -> u32 { + return ${C.join("+")}; + }`,I=N=>(b.indicesToOffset=!0,o<2?N:`i2o_${e}(${N})`),R=(...N)=>o===0?"0u":`${p.indices}(${N.map(f).join(",")})`,A=(N,j)=>o<2?`${N}`:`${Gr(N,j,o)}`,O=(N,j,k)=>o<2?`${N}=${k};`:`${Gr(N,j,o)}=${k};`,F={},L=(N,j)=>{b.broadcastedIndicesToOffset=!0;let k=`${j.name}broadcastedIndicesTo${e}Offset`;if(k in F)return`${k}(${N})`;let W=[];for(let M=o-1;M>=0;M--){let Y=j.indicesGet("outputIndices",M+j.rank-o);W.push(`${A(w,M)} * (${Y} % ${A(y,M)})`)}return F[k]=`fn ${k}(outputIndices: ${j.type.indices}) -> u32 { + return ${W.length>0?W.join("+"):"0u"}; + }`,`${k}(${N})`},X=(N,j)=>(()=>{if(p.storage===p.value)return`${e}[${N}]=${j};`;if(p.storage==="vec2"&&p.value==="i32")return`${e}[${N}]=vec2(u32(${j}), select(0u, 0xFFFFFFFFu, ${j} < 0));`;if(p.storage==="vec2"&&p.value==="u32")return`${e}[${N}]=vec2(u32(${j}), 0u);`;if(p.storage==="u32"&&p.value==="vec4")return`${e}[${N}]=dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(${j}));`;throw new Error(`not supported combination of storage type ${p.storage} and value type ${p.value} yet`)})(),T=N=>(()=>{if(p.storage===p.value)return`${e}[${N}]`;if(p.storage==="vec2"&&p.value==="i32")return`i32(${e}[${N}].x)`;if(p.storage==="vec2"&&p.value==="u32")return`u32(${e}[${N}].x)`;if(p.storage==="u32"&&p.value==="vec4")return`vec4(bool(${e}[${N}] & 0xFFu), bool(${e}[${N}] & 0xFF00u), bool(${e}[${N}] & 0xFF0000u), bool(${e}[${N}] & 0xFF000000u))`;throw new Error(`not supported combination of storage type ${p.storage} and value type ${p.value} yet`)})(),q=o<2?"":` + fn get_${e}ByIndices(indices: ${p.indices}) -> ${d} { + return ${T(`i2o_${e}(indices)`)}; + }`,H=o<2?"":(()=>{let N=l.map(k=>`d${k}: u32`).join(", "),j=l.map(k=>`d${k}`).join(", ");return` + fn get_${e}(${N}) -> ${d} { + return get_${e}ByIndices(${R(j)}); + }`})(),J=(...N)=>{if(N.length!==o)throw new Error(`indices length must be ${o}`);let j=N.map(f).join(",");return o===0?T("0u"):o===1?T(j[0]):(b.get=!0,b.getByIndices=!0,b.indicesToOffset=!0,`get_${e}(${j})`)},Z=N=>o<2?T(N):(b.getByIndices=!0,b.indicesToOffset=!0,`get_${e}ByIndices(${N})`),B=o<2?"":` + fn set_${e}ByIndices(indices: ${p.indices}, value: ${d}) { + ${X(`i2o_${e}(indices)`,"value")} + }`,V=o<2?"":(()=>{let N=l.map(k=>`d${k}: u32`).join(", "),j=l.map(k=>`d${k}`).join(", ");return` + fn set_${e}(${N}, value: ${d}) { + set_${e}ByIndices(${R(j)}, value); + }`})();return{impl:()=>{let N=[],j=!1;return b.offsetToIndices&&(N.push(m),j=!0),b.indicesToOffset&&(N.push(E),j=!0),b.broadcastedIndicesToOffset&&(Object.values(F).forEach(k=>N.push(k)),j=!0),b.set&&(N.push(V),j=!0),b.setByIndices&&(N.push(B),j=!0),b.get&&(N.push(H),j=!0),b.getByIndices&&(N.push(q),j=!0),!a&&j&&N.unshift(`const ${y} = ${p.indices}(${n.join(",")});`,`const ${w} = ${p.indices}(${In.computeStrides(n).join(",")});`),N.join(` +`)},type:p,offsetToIndices:z,indicesToOffset:I,broadcastedIndicesToOffset:L,indices:R,indicesGet:A,indicesSet:O,set:(...N)=>{if(N.length!==o+1)throw new Error(`indices length must be ${o}`);let j=N[o];if(typeof j!="string")throw new Error("value must be string");let k=N.slice(0,o).map(f).join(",");return o===0?X("0u",j):o===1?X(k[0],j):(b.set=!0,b.setByIndices=!0,b.indicesToOffset=!0,`set_${e}(${k}, ${j})`)},setByOffset:X,setByIndices:(N,j)=>o<2?X(N,j):(b.setByIndices=!0,b.indicesToOffset=!0,`set_${e}ByIndices(${N}, ${j});`),get:J,getByOffset:T,getByIndices:Z,usage:r,name:e,strides:w,shape:y,rank:o}},Fn=(e,t,n,r=1)=>Pg(e,t,n,"input",r),Dr=(e,t,n,r=1)=>Pg(e,t,n,"output",r),oL=(e,t,n)=>Pg(e,t,n,"atomicOutput",1),H4=(e,t,n,r=1)=>Pg(e,t,n,"internal",r),pk=class{constructor(e,t){this.normalizedDispatchGroup=e,this.limits=t,this.internalVariables=[],this.variables=[],this.uniforms=[],this.variableIndex=0}guardAgainstOutOfBoundsWorkgroupSizes(e){return`if (global_idx >= ${typeof e=="number"?`${e}u`:e}) { return; }`}mainStart(e=Em){let t=typeof e=="number"?e:e[0],n=typeof e=="number"?1:e[1],r=typeof e=="number"?1:e[2];if(t>this.limits.maxComputeWorkgroupSizeX||n>this.limits.maxComputeWorkgroupSizeY||r>this.limits.maxComputeWorkgroupSizeZ)throw new Error(`workgroup size [${t}, ${n}, ${r}] exceeds the maximum workgroup size [${this.limits.maxComputeWorkgroupSizeX}, ${this.limits.maxComputeWorkgroupSizeY}, ${this.limits.maxComputeWorkgroupSizeZ}].`);if(t*n*r>this.limits.maxComputeInvocationsPerWorkgroup)throw new Error(`workgroup size [${t}, ${n}, ${r}] exceeds the maximum workgroup invocations ${this.limits.maxComputeInvocationsPerWorkgroup}.`);let i=this.normalizedDispatchGroup[1]===1&&this.normalizedDispatchGroup[2]===1,a=i?`@builtin(global_invocation_id) global_id : vec3, + @builtin(workgroup_id) workgroup_id : vec3, + @builtin(local_invocation_index) local_idx : u32, + @builtin(local_invocation_id) local_id : vec3`:`@builtin(global_invocation_id) global_id : vec3, + @builtin(local_invocation_id) local_id : vec3, + @builtin(local_invocation_index) local_idx : u32, + @builtin(workgroup_id) workgroup_id : vec3, + @builtin(num_workgroups) num_workgroups : vec3`,o=i?`let global_idx = global_id.x; + let workgroup_index = workgroup_id.x;`:`let workgroup_index = workgroup_id.z * num_workgroups[0] * num_workgroups[1] + + workgroup_id.y * num_workgroups[0] + workgroup_id.x; + let global_idx = workgroup_index * ${t*n*r}u + local_idx;`;return`@compute @workgroup_size(${t}, ${n}, ${r}) + fn main(${a}) { + ${o} + `}appendVariableUniforms(e){e.rank!==0&&(e.shape.startsWith("uniforms.")&&this.uniforms.push({name:e.shape.replace("uniforms.",""),type:"u32",length:e.rank}),e.strides.startsWith("uniforms.")&&this.uniforms.push({name:e.strides.replace("uniforms.",""),type:"u32",length:e.rank}))}declareVariable(e,t){if(e.usage==="internal")throw new Error("cannot use internal variable with declareVariable(). use registerInternalVariables() instead.");this.variables.push(e),this.appendVariableUniforms(e);let n=e.usage==="input"?"read":"read_write",r=e.usage==="atomicOutput"?"atomic":e.type.storage;return`@group(0) @binding(${t}) var ${e.name}: array<${r}>;`}declareVariables(...e){return e.map(t=>this.declareVariable(t,this.variableIndex++)).join(` +`)}registerInternalVariable(e){if(e.usage!=="internal")throw new Error("cannot use input or output variable with registerInternalVariable(). use declareVariables() instead.");this.internalVariables.push(e),this.appendVariableUniforms(e)}registerInternalVariables(...e){return e.forEach(t=>this.registerInternalVariable(t)),this}registerUniform(e,t,n=1){return this.uniforms.push({name:e,type:t,length:n}),this}registerUniforms(e){return this.uniforms=this.uniforms.concat(e),this}uniformDeclaration(){if(this.uniforms.length===0)return"";let e=[];for(let{name:t,type:n,length:r}of this.uniforms)if(r&&r>4)n==="f16"?e.push(`@align(16) ${t}:array, ${Math.ceil(r/8)}>`):e.push(`${t}:array, ${Math.ceil(r/4)}>`);else{let i=r==null||r===1?n:`vec${r}<${n}>`;e.push(`${t}:${i}`)}return` + struct Uniforms { ${e.join(", ")} }; + @group(0) @binding(${this.variableIndex}) var uniforms: Uniforms;`}get additionalImplementations(){return this.uniformDeclaration()+this.variables.map(e=>e.impl()).join(` +`)+this.internalVariables.map(e=>e.impl()).join(` +`)}get variablesInfo(){if(this.uniforms.length===0)return;let e=t=>[12,10,1,6][["u32","f16","f32","i32"].indexOf(t)];return this.uniforms.map(t=>[e(t.type),t.length??1])}},lL=(e,t)=>new pk(e,t)}),fk,g3,mk,gk,xk,bk,Sc,cL,uL,Fh=ur(()=>{hs(),vs(),oa(),$s(),fk=(e,t)=>{if(!e||e.length!==1)throw new Error("Transpose requires 1 input.");if(t.length!==0&&t.length!==e[0].dims.length)throw new Error(`perm size ${t.length} does not match input rank ${e[0].dims.length}`)},g3=(e,t)=>t.length!==0?t:[...new Array(e).keys()].reverse(),mk=(e,t)=>In.sortBasedOnPerm(e,g3(e.length,t)),gk=(e,t,n,r)=>{let i=`fn perm(i: ${r.type.indices}) -> ${n.type.indices} { + var a: ${n.type.indices};`;for(let a=0;a{let n=[],r=[];for(let i=0;i{let n=0;for(let r=0;r{let n=e.dataType,r=e.dims.length,i=g3(r,t),a=mk(e.dims,i),o=e.dims,l=a,c=r<2||bk(i,e.dims),u;if(c)return u=b=>{let g=Fn("input",n,o,4),y=Dr("output",n,l,4);return` + ${b.registerUniform("output_size","u32").declareVariables(g,y)} + ${b.mainStart()} + ${b.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + output[global_idx] = input[global_idx]; + }`},{name:"TransposeCopy",shaderCache:{inputDependencies:["type"]},getRunData:()=>{let b=In.size(a);return{outputs:[{dims:a,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(b/64/4)},programUniforms:[{type:12,data:Math.ceil(b/4)}]}},getShaderSource:u};let{newShape:d,newPerm:h}=xk(e.dims,i),p=In.areEqual(h,[2,3,1]),f=In.areEqual(h,[3,1,2]);if(d.length===2||p||f){o=p?[d[0],d[1]*d[2]]:f?[d[0]*d[1],d[2]]:d,l=[o[1],o[0]];let b=16;return u=g=>{let y=Fn("a",n,o.length),w=Dr("output",n,l.length);return` + ${g.registerUniform("output_size","u32").declareVariables(y,w)} + var tile : array, ${b}>; + ${g.mainStart([b,b,1])} + let stride = (uniforms.output_shape[1] - 1) / ${b} + 1; + let workgroup_id_x = workgroup_index % stride; + let workgroup_id_y = workgroup_index / stride; + let input_col = workgroup_id_y * ${b}u + local_id.x; + let input_row = workgroup_id_x * ${b}u + local_id.y; + if (input_row < uniforms.a_shape[0] && input_col < uniforms.a_shape[1]) { + tile[local_id.y][local_id.x] = ${y.getByIndices(`${y.type.indices}(input_row, input_col)`)}; + } + workgroupBarrier(); + + let output_col = workgroup_id_x * ${b}u + local_id.x; + let output_row = workgroup_id_y * ${b}u + local_id.y; + if (output_row < uniforms.output_shape[0] && output_col < uniforms.output_shape[1]) { + ${w.setByIndices(`${w.type.indices}(output_row, output_col)`,"tile[local_id.x][local_id.y]")} + } + }`},{name:"TransposeShared",shaderCache:{inputDependencies:["type"]},getRunData:()=>{let g=In.size(a);return{outputs:[{dims:a,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(l[1]/b),y:Math.ceil(l[0]/b)},programUniforms:[{type:12,data:g},...Yr(o,l)]}},getShaderSource:u}}return u=b=>{let g=Fn("a",n,o.length),y=Dr("output",n,l.length);return` + ${b.registerUniform("output_size","u32").declareVariables(g,y)} + + ${gk(i,r,g,y)} + + ${b.mainStart()} + ${b.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let indices = ${y.offsetToIndices("global_idx")}; + let aIndices = perm(indices); + + ${y.setByOffset("global_idx",g.getByIndices("aIndices"))} + }`},{name:"Transpose",shaderCache:{hint:`${t}`,inputDependencies:["rank"]},getRunData:()=>{let b=In.size(a);return{outputs:[{dims:a,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(b/64)},programUniforms:[{type:12,data:b},...Yr(o,l)]}},getShaderSource:u}},cL=(e,t)=>{fk(e.inputs,t.perm),e.compute(Sc(e.inputs[0],t.perm))},uL=e=>pi({perm:e.perm})}),yk,vk,wk,_k,zk,$k,Sk,jk,Ck,Nk,Xu,dL,hL,pL,fL,mL,gL,xL,bL,yL,vL,Rde=ur(()=>{hs(),vs(),$s(),G4(),Fh(),yk={max:"select(bestValue, candidate, candidate > bestValue)",min:"select(bestValue, candidate, candidate < bestValue)",mean:"bestValue + candidate",sum:"bestValue + candidate",prod:"bestValue * candidate",sumSquare:"bestValue + candidate * candidate",logSumExp:"bestValue + exp(candidate)",l1:"bestValue + abs(candidate)",l2:"bestValue + candidate * candidate",logSum:"bestValue + candidate"},vk={max:"select(bestValue, candidate, candidate > bestValue)",min:"select(bestValue, candidate, candidate < bestValue)",mean:"bestValue + candidate",sum:"bestValue + candidate",prod:"bestValue * candidate",sumSquare:"bestValue + candidate",logSumExp:"bestValue + candidate",l1:"bestValue + candidate",l2:"bestValue + candidate",logSum:"bestValue + candidate"},wk={max:"_A[offset]",min:"_A[offset]",mean:"0",sum:"0",prod:"1",sumSquare:"0",logSumExp:"0",l1:"0",l2:"0",logSum:"0"},_k={max:"bestValue",min:"bestValue",sum:"bestValue",prod:"bestValue",sumSquare:"bestValue",logSumExp:"log(bestValue)",l1:"bestValue",l2:"sqrt(bestValue)",logSum:"log(bestValue)"},zk=(e,t)=>{let n=[];for(let r=t-e;r{let n=[],r=e.length;for(let a=0;ae[a]);return[n,i]},Sk=(e,t)=>{let n=e.length+t.length,r=[],i=0;for(let a=0;a{for(let n=0;n{let n=[];if(!jk(e,t)){for(let r=0;rn.push(r))}return n},Nk=(e,t,n,r,i,a,o)=>{let l=n[0].dims,c=In.size(a),u=In.size(o),d=Fn("_A",n[0].dataType,l),h=Dr("output",i,a),p=64;c===1&&(p=256);let f=` + var aBestValues : array; + `,b=g=>` + ${g.registerUniform("reduceSize","u32").declareVariables(d,h)} + ${f} + fn DIV_CEIL(a : u32, b : u32) -> u32 { + return ((a - 1u) / b + 1u); + } + ${g.mainStart(p)} + + let outputIndex = global_idx / ${p}; + let offset = outputIndex * uniforms.reduceSize; + + var bestValue = f32(${wk[r]}); + let Length = uniforms.reduceSize; + for (var k = local_idx; k < Length; k = k + ${p}) { + let candidate = f32(${d.getByOffset("offset + k")}); + bestValue = ${yk[r]}; + } + aBestValues[local_idx] = bestValue; + workgroupBarrier(); + + var reduceSize = min(Length, ${p}u); + for (var currentSize = reduceSize / 2u; reduceSize > 1u; + currentSize = reduceSize / 2u) { + let interval = DIV_CEIL(reduceSize, 2u); + if (local_idx < currentSize) { + let candidate = aBestValues[local_idx + interval]; + bestValue = ${vk[r]}; + aBestValues[local_idx] = bestValue; + } + reduceSize = interval; + workgroupBarrier(); + } + + if (local_idx == 0u) { + ${h.setByOffset("outputIndex",`${r==="mean"?`${h.type.storage}(bestValue / f32(uniforms.reduceSize))`:`${h.type.storage}(${_k[r]})`}`)}; + } + }`;return{name:e,shaderCache:{hint:`${t};${p}`,inputDependencies:["type"]},getShaderSource:b,getRunData:()=>({outputs:[{dims:a,dataType:i}],dispatchGroup:{x:c},programUniforms:[{type:12,data:u}]})}},Xu=(e,t,n,r)=>{let i=e.inputs.length===1?n:q$(e.inputs,n),a=i.axes;a.length===0&&!i.noopWithEmptyAxes&&(a=e.inputs[0].dims.map((f,b)=>b));let o=In.normalizeAxes(a,e.inputs[0].dims.length),l=o,c=e.inputs[0],u=Ck(l,e.inputs[0].dims.length);u.length>0&&(c=e.compute(Sc(e.inputs[0],u),{inputs:[0],outputs:[-1]})[0],l=zk(l.length,c.dims.length));let[d,h]=$k(c.dims,l),p=d;i.keepDims&&(p=Sk(d,o)),e.compute(Nk(t,i.cacheKey,[c],r,e.inputs[0].dataType,p,h),{inputs:[c]})},dL=(e,t)=>{Xu(e,"ReduceMeanShared",t,"mean")},hL=(e,t)=>{Xu(e,"ReduceL1Shared",t,"l1")},pL=(e,t)=>{Xu(e,"ReduceL2Shared",t,"l2")},fL=(e,t)=>{Xu(e,"ReduceLogSumExpShared",t,"logSumExp")},mL=(e,t)=>{Xu(e,"ReduceMaxShared",t,"max")},gL=(e,t)=>{Xu(e,"ReduceMinShared",t,"min")},xL=(e,t)=>{Xu(e,"ReduceProdShared",t,"prod")},bL=(e,t)=>{Xu(e,"ReduceSumShared",t,"sum")},yL=(e,t)=>{Xu(e,"ReduceSumSquareShared",t,"sumSquare")},vL=(e,t)=>{Xu(e,"ReduceLogSumShared",t,"logSum")}}),Yu,Ek,dw,q$,Ju,Ik,kk,Ak,Mk,Tk,Rk,Pk,Ok,Lk,Bk,Zu,wL,_L,zL,$L,SL,jL,CL,NL,EL,IL,G4=ur(()=>{hs(),vs(),oa(),$s(),Rde(),Yu=e=>{if(!e||e.length===0||e.length>2)throw new Error("Reduce op requires 1 or 2 inputs.");if(e.length===2&&e[1].dims.length!==1)throw new Error("Invalid axes input dims.")},Ek=e=>["","",`var value = ${e.getByIndices("input_indices")};`,""],dw=(e,t,n,r,i,a,o=!1,l=!1)=>{let c=[],u=n[0].dims,d=u.length,h=In.normalizeAxes(i,d),p=!l&&h.length===0;u.forEach((g,y)=>{p||h.indexOf(y)>=0?o&&c.push(1):c.push(g)});let f=c.length,b=In.size(c);return{name:e,shaderCache:t,getShaderSource:g=>{let y=[],w=Fn("_A",n[0].dataType,d),v=Dr("output",a,f),m=r(w,v,h),z=m[2];for(let C=0,E=0;C=0?(o&&E++,z=`for(var j${C}: u32 = 0; j${C} < ${u[C]}; j${C}++) { + ${m[2].includes("last_index")?`let last_index = j${C};`:""} + ${w.indicesSet("input_indices",C,`j${C}`)} + ${z} + }`):(y.push(`${w.indicesSet("input_indices",C,v.indicesGet("output_indices",E))};`),E++);return` + + ${g.registerUniform("output_size","u32").declareVariables(w,v)} + + ${g.mainStart()} + ${g.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + var input_indices: ${w.type.indices}; + let output_indices = ${v.offsetToIndices("global_idx")}; + + ${y.join(` +`)} + ${m[0]} // init ops for reduce max/min + ${m[1]} + ${z} + ${m[3]} + ${m.length===4?v.setByOffset("global_idx","value"):m.slice(4).join(` +`)} + }`},getRunData:()=>({outputs:[{dims:c,dataType:a}],dispatchGroup:{x:Math.ceil(b/64)},programUniforms:[{type:12,data:b},...Yr(u,c)]})}},q$=(e,t)=>{let n=[];return e[1].dims[0]>0&&e[1].getBigInt64Array().forEach(r=>n.push(Number(r))),pi({axes:n,keepDims:t.keepDims,noopWithEmptyAxes:t.noopWithEmptyAxes})},Ju=(e,t,n,r)=>{let i=e.inputs,a=i.length===1?n:q$(i,n);e.compute(dw(t,{hint:a.cacheKey,inputDependencies:["rank"]},[i[0]],a.noopWithEmptyAxes&&a.axes.length===0?Ek:r,a.axes,i[0].dataType,a.keepDims,a.noopWithEmptyAxes),{inputs:[0]})},Ik=(e,t)=>{Yu(e.inputs),Ju(e,"ReduceLogSum",t,(n,r)=>[`var value = ${r.type.storage}(0);`,"",`value += ${n.getByIndices("input_indices")};`,"value = log(value);"])},kk=(e,t)=>{Yu(e.inputs),Ju(e,"ReduceL1",t,(n,r)=>[`var value = ${r.type.storage}(0);`,"",`value += abs(${n.getByIndices("input_indices")});`,""])},Ak=(e,t)=>{Yu(e.inputs),Ju(e,"ReduceL2",t,(n,r)=>[`var t = ${r.type.value}(0); var value = ${r.type.value}(0);`,"",`t = ${n.getByIndices("input_indices")}; value += (t * t);`,"value = sqrt(value);"])},Mk=(e,t)=>{Yu(e.inputs),Ju(e,"ReduceLogSumExp",t,(n,r)=>[`var value = ${r.type.storage}(0);`,"",`value += exp(${n.getByIndices("input_indices")});`,"value = log(value);"])},Tk=(e,t)=>{Yu(e.inputs),Ju(e,"ReduceMax",t,(n,r,i)=>{let a=[];for(let o=0;o=0||i.length===0)&&a.push(n.indicesSet("input_indices",o,0));return[`${a.join(` +`)}`,`var value = ${n.getByIndices("input_indices")};`,`value = max(value, ${n.getByIndices("input_indices")});`,""]})},Rk=(e,t)=>{Yu(e.inputs),Ju(e,"ReduceMean",t,(n,r,i)=>{let a=1;for(let o=0;o=0||i.length===0)&&(a*=e.inputs[0].dims[o]);return["var sum = f32(0);","",`sum += f32(${n.getByIndices("input_indices")});`,`let value = ${r.type.value}(sum / ${a});`]})},Pk=(e,t)=>{Yu(e.inputs),Ju(e,"ReduceMin",t,(n,r,i)=>{let a=[];for(let o=0;o=0||i.length===0)&&a.push(`input_indices[${o}] = 0;`);return[`${a.join(` +`)}`,`var value = ${n.getByIndices("input_indices")};`,`value = min(value, ${n.getByIndices("input_indices")});`,""]})},Ok=(e,t)=>{Yu(e.inputs),Ju(e,"ReduceProd",t,(n,r)=>[`var value = ${r.type.storage}(1);`,"",`value *= ${n.getByIndices("input_indices")};`,""])},Lk=(e,t)=>{Yu(e.inputs),Ju(e,"ReduceSum",t,(n,r)=>[`var value = ${r.type.storage}(0);`,"",`value += ${n.getByIndices("input_indices")};`,""])},Bk=(e,t)=>{Yu(e.inputs),Ju(e,"ReduceSumSquare",t,(n,r)=>[`var t = ${r.type.value}(0); var value = ${r.type.value}(0);`,"",`t = ${n.getByIndices("input_indices")}; value += t * t;`,""])},Zu=(e,t,n)=>{if(t.length===0)return n;let r=1,i=1;for(let a=0;a1024},wL=(e,t)=>{Zu(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?Rk(e,t):dL(e,t)},_L=(e,t)=>{Zu(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?kk(e,t):hL(e,t)},zL=(e,t)=>{Zu(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?Ak(e,t):pL(e,t)},$L=(e,t)=>{Zu(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?Mk(e,t):fL(e,t)},SL=(e,t)=>{Zu(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?Tk(e,t):mL(e,t)},jL=(e,t)=>{Zu(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?Pk(e,t):gL(e,t)},CL=(e,t)=>{Zu(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?Ok(e,t):xL(e,t)},NL=(e,t)=>{Zu(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?Lk(e,t):bL(e,t)},EL=(e,t)=>{Zu(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?Bk(e,t):yL(e,t)},IL=(e,t)=>{Zu(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?Ik(e,t):vL(e,t)}}),x3,kL,AL,K$,Pde=ur(()=>{hs(),oa(),G4(),x3=e=>{if(!e||e.length===0||e.length>2)throw new Error("ArgMinMaxOp op requires 1 or 2 inputs.");if(e[0].dataType!==1)throw new Error("Invalid input type.")},kL=(e,t)=>{x3(e.inputs);let n=(r,i,a)=>{let o=[];for(let l=0;l=0||a.length===0)&&o.push(`input_indices[${l}] = 0;`);return[`${o.join(` +`)}`,`var value = ${r.getByIndices("input_indices")}; +var best_index : i32 = 0;`,`if (${r.getByIndices("input_indices")} ${t.selectLastIndex>0?"<=":"<"} value) { + value = ${r.getByIndices("input_indices")}; + best_index = i32(last_index); + }`,"",i.setByOffset("global_idx","best_index")]};e.compute(dw("ArgMin",{hint:t.cacheKey,inputDependencies:["rank"]},[e.inputs[0]],n,[t.axis],7,t.keepDims),{inputs:[0]})},AL=(e,t)=>{x3(e.inputs);let n=(r,i,a)=>{let o=[];for(let l=0;l=0||a.length===0)&&o.push(`input_indices[${l}] = 0;`);return[`${o.join(` +`)}`,`var value = ${r.getByIndices("input_indices")}; +var best_index : i32 = 0;`,`if (${r.getByIndices("input_indices")} ${t.selectLastIndex>0?">=":">"} value) { + value = ${r.getByIndices("input_indices")}; + best_index = i32(last_index); + }`,"",i.setByOffset("global_idx","best_index")]};e.compute(dw("argMax",{hint:t.cacheKey,inputDependencies:["rank"]},[e.inputs[0]],n,[t.axis],7,t.keepDims),{inputs:[0]})},K$=e=>pi(e)}),Uk,Z1,Fk,Wk,Dk,hb,Vk,ML,q4=ur(()=>{hs(),vs(),V4(),$s(),Uk=(e,t)=>{let n=e[0],r=e[1],i=e[2],a=e[3],o=e[4],l=e[5];if(o&&l)throw new Error("Attention cannot have both past and attention_bias");if(n.dims.length!==3)throw new Error('Input "input" must have 3 dimensions');let c=n.dims[0],u=n.dims[1],d=n.dims[2];if(i.dims.length!==1)throw new Error('Input "bias" is expected to have 1 dimensions');if(r.dims.length!==2)throw new Error('Input "weights" is expected to have 2 dimensions');if(r.dims[0]!==d)throw new Error("Input 1 dimension 0 should have same length as dimension 2 of input 0");if(i.dims[0]!==r.dims[1])throw new Error('Input "bias" dimension 0 should have same length as dimension 1 of input "weights"');let h=i.dims[0]/3,p=h,f=p;if(t.qkvHiddenSizes.length>0){if(t.qkvHiddenSizes.length!==3)throw new Error("qkv_hidden_sizes attribute should have 3 elements");for(let m of t.qkvHiddenSizes)if(m%t.numHeads!==0)throw new Error("qkv_hidden_sizes should be divisible by num_heads");h=t.qkvHiddenSizes[0],p=t.qkvHiddenSizes[1],f=t.qkvHiddenSizes[2]}let b=u;if(h!==p)throw new Error("qkv_hidden_sizes first element should be same as the second");if(i.dims[0]!==h+p+f)throw new Error('Input "bias" dimension 0 should have same length as sum of Q/K/V hidden sizes');let g=0;if(o){if(p!==f)throw new Error('Input "past" expect k_hidden_size == v_hidden_size');if(o.dims.length!==5)throw new Error('Input "past" must have 5 dimensions');if(o.dims[0]!==2)throw new Error('Input "past" first dimension must be 2');if(o.dims[1]!==c)throw new Error('Input "past" second dimension must be batch_size');if(o.dims[2]!==t.numHeads)throw new Error('Input "past" third dimension must be num_heads');if(o.dims[4]!==p/t.numHeads)throw new Error('Input "past" fifth dimension must be k_hidden_size / num_heads');t.pastPresentShareBuffer||(g=o.dims[3])}let y=b+g,w=-1,v=0;if(a)throw new Error("Mask not supported");if(o)throw new Error("past is not supported");if(l){if(l.dims.length!==4)throw new Error('Input "attention_bias" must have 4 dimensions');if(l.dims[0]!==c||l.dims[1]!==t.numHeads||l.dims[2]!==u||l.dims[3]!==y)throw new Error('Expect "attention_bias" shape (batch_size, num_heads, sequence_length, total_sequence_length)')}return{batchSize:c,sequenceLength:u,pastSequenceLength:g,kvSequenceLength:b,totalSequenceLength:y,maxSequenceLength:w,inputHiddenSize:d,hiddenSize:h,vHiddenSize:f,headSize:Math.floor(h/t.numHeads),vHeadSize:Math.floor(f/t.numHeads),numHeads:t.numHeads,isUnidirectional:!1,pastPresentShareBuffer:!1,maskFilterValue:t.maskFilterValue,maskType:v,scale:t.scale,broadcastResPosBias:!1,passPastInKv:!1,qkvFormat:1}},Z1=(e,t,n)=>t&&e?` + let total_sequence_length_input = u32(${t.getByOffset("0")}); + let present_sequence_length = max(total_sequence_length_input, uniforms.past_sequence_length); + let is_subsequent_prompt: bool = sequence_length > 1 && sequence_length != total_sequence_length_input; + let is_first_prompt: bool = is_subsequent_prompt == false && sequence_length == total_sequence_length_input; + total_sequence_length = u32(${e==null?void 0:e.getByOffset("batchIdx")}) + 1; + var past_sequence_length: u32 = 0; + if (is_first_prompt == false) { + past_sequence_length = total_sequence_length - sequence_length; + } + `:` + ${n?"let past_sequence_length = uniforms.past_sequence_length":""}; + let present_sequence_length = total_sequence_length; + `,Fk=(e,t,n,r,i,a,o,l)=>{let c=Yi(o?1:a),u=64,d=a/c;d{let v=Dr("x",e.dataType,e.dims,c),m=[v],z=o?Fn("seq_lens",o.dataType,o.dims):void 0;z&&m.push(z);let C=l?Fn("total_sequence_length_input",l.dataType,l.dims):void 0;C&&m.push(C);let E=Bo(e.dataType),I=[{name:"batch_size",type:"u32"},{name:"num_heads",type:"u32"},{name:"past_sequence_length",type:"u32"},{name:"sequence_length",type:"u32"},{name:"total_sequence_length",type:"u32"},{name:"elements_per_thread",type:"u32"}];return` + var thread_max: array; + var thread_sum: array; + ${w.registerUniforms(I).declareVariables(...m)} + ${w.mainStart([u,1,1])} + let batchIdx = workgroup_id.z / uniforms.num_heads; + let headIdx = workgroup_id.z % uniforms.num_heads; + let sequence_length = uniforms.sequence_length; + var total_sequence_length = uniforms.total_sequence_length; + ${Z1(z,C,!1)} + let local_offset = local_idx * uniforms.elements_per_thread; + let offset = (global_idx / ${u}) * uniforms.total_sequence_length + local_offset; + let seq_causal_length = ${o?"u32(past_sequence_length + workgroup_id.y + 1)":"total_sequence_length"}; + var thread_max_vector = ${b}(-3.402823e+38f); + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + thread_max_vector = max(${b}(x[offset + i]), thread_max_vector); + } + thread_max[local_idx] = ${(()=>{switch(c){case 1:return"thread_max_vector";case 2:return"max(thread_max_vector.x, thread_max_vector.y)";case 4:return"max(max(thread_max_vector.x, thread_max_vector.y), max(thread_max_vector.z, thread_max_vector.w))";default:throw new Error(`Unsupported components: ${c}`)}})()}; + workgroupBarrier(); + + var max_value = f32(-3.402823e+38f); + for (var i = 0u; i < ${u}; i++) { + max_value = max(thread_max[i], max_value); + } + + var sum_vector = ${b}(0); + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + sum_vector += exp(${b}(x[offset + i]) - max_value); + } + thread_sum[local_idx] = ${(()=>{switch(c){case 1:return"sum_vector";case 2:return"sum_vector.x + sum_vector.y";case 4:return"sum_vector.x + sum_vector.y + sum_vector.z + sum_vector.w";default:throw new Error(`Unsupported components: ${c}`)}})()}; + workgroupBarrier(); + + var sum: f32 = 0; + for (var i = 0u; i < ${u}; i++) { + sum += thread_sum[i]; + } + + if (sum == 0) { + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + x[offset + i] = ${v.type.value}(${E}(1.0) / ${E}(seq_causal_length)); + } + } else { + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + var f32input = ${b}(x[offset + i]); + x[offset + i] = ${v.type.value}(exp(f32input - max_value) / sum); + } + } + ${o?` + for (var total_seq_id: u32 = seq_causal_length; total_seq_id + local_offset < uniforms.total_sequence_length; total_seq_id++) { + x[offset + total_seq_id] = ${v.type.value}(${E}(0)); + }`:""}; + }`};return{name:"AttentionProbsSoftmax",shaderCache:{hint:`${u};${f};${c}`,inputDependencies:g},getShaderSource:y,getRunData:()=>({outputs:[],dispatchGroup:{x:Math.ceil(a/u),y:i,z:t*n},programUniforms:p})}},Wk=(e,t,n,r,i,a,o,l,c)=>{let u=o+a.kvSequenceLength,d=[a.batchSize,a.numHeads,a.sequenceLength,u],h=e>1&&r,p=a.kvNumHeads?a.kvNumHeads:a.numHeads,f=h?[a.batchSize,p,u,a.headSize]:void 0,b=a.nReps?a.nReps:1,g=a.scale===0?1/Math.sqrt(a.headSize):a.scale,y=Yi(a.headSize),w=a.headSize/y,v=12,m={x:Math.ceil(u/v),y:Math.ceil(a.sequenceLength/v),z:a.batchSize*a.numHeads},z=[{type:12,data:a.sequenceLength},{type:12,data:w},{type:12,data:u},{type:12,data:a.numHeads},{type:12,data:a.headSize},{type:1,data:g},{type:12,data:o},{type:12,data:a.kvSequenceLength},{type:12,data:b}],C=h&&r&&In.size(r.dims)>0,E=["type","type"];C&&E.push("type"),i&&E.push("type"),l&&E.push("type"),c&&E.push("type");let I=[{dims:d,dataType:t.dataType,gpuDataType:0}];h&&I.push({dims:f,dataType:t.dataType,gpuDataType:0});let R=A=>{let O=Fn("q",t.dataType,t.dims,y),F=Fn("key",n.dataType,n.dims,y),L=[O,F];if(C){let B=Fn("past_key",r.dataType,r.dims,y);L.push(B)}i&&L.push(Fn("attention_bias",i.dataType,i.dims));let X=l?Fn("seq_lens",l.dataType,l.dims):void 0;X&&L.push(X);let T=c?Fn("total_sequence_length_input",c.dataType,c.dims):void 0;T&&L.push(T);let q=Dr("output",t.dataType,d),H=[q];h&&H.push(Dr("present_key",t.dataType,f,y));let J=Bo(1,y),Z=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"alpha",type:"f32"},{name:"past_sequence_length",type:"u32"},{name:"kv_sequence_length",type:"u32"},{name:"n_reps",type:"u32"}];return` + const TILE_SIZE = ${v}u; + + var tileQ: array<${O.type.storage}, ${v*v}>; + var tileK: array<${O.type.storage}, ${v*v}>; + ${A.registerUniforms(Z).declareVariables(...L,...H)} + ${A.mainStart([v,v,1])} + // x holds the N and y holds the M + let headIdx = workgroup_id.z % uniforms.num_heads; + let kvHeadIdx = ${b===1?"headIdx":"headIdx / uniforms.n_reps"}; + let kv_num_heads = ${b===1?"uniforms.num_heads":"uniforms.num_heads / uniforms.n_reps"}; + let batchIdx = workgroup_id.z / uniforms.num_heads; + let m = workgroup_id.y * TILE_SIZE; + let n = workgroup_id.x * TILE_SIZE; + let sequence_length = uniforms.M; + var total_sequence_length = uniforms.N; + ${Z1(X,T,!0)} + let absKvHeadIdx = batchIdx * kv_num_heads + kvHeadIdx; + let qOffset = workgroup_id.z * uniforms.M * uniforms.K + m * uniforms.K; + ${C&&h?"let pastKeyOffset = absKvHeadIdx * uniforms.past_sequence_length * uniforms.K;":""}; + let kOffset = absKvHeadIdx * uniforms.kv_sequence_length * uniforms.K; + ${h?"let presentKeyOffset = absKvHeadIdx * uniforms.N * uniforms.K;":""} + var value = ${J}(0); + for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { + if (global_id.y < uniforms.M && w + local_id.x < uniforms.K) { + tileQ[TILE_SIZE * local_id.y + local_id.x] = q[qOffset + local_id.y * uniforms.K + w + local_id.x]; + } + if (n + local_id.y < uniforms.N && w + local_id.x < uniforms.K) { + var idx = TILE_SIZE * local_id.y + local_id.x; + ${C&&h?` + if (n + local_id.y < past_sequence_length) { + tileK[idx] = past_key[pastKeyOffset + (n + local_id.y) * uniforms.K + w + local_id.x]; + } else if (n + local_id.y - past_sequence_length < uniforms.kv_sequence_length) { + tileK[idx] = key[kOffset + (n + local_id.y - past_sequence_length) * uniforms.K + w + local_id.x]; + }`:` + if (n + local_id.y < uniforms.kv_sequence_length) { + tileK[idx] = key[kOffset + (n + local_id.y) * uniforms.K + w + local_id.x]; + }`} + ${h?`if (n + local_id.y < present_sequence_length) { + present_key[presentKeyOffset + (n + local_id.y) * uniforms.K + w + local_id.x] = tileK[idx]; + }`:""} + } + workgroupBarrier(); + + for (var k: u32 = 0u; k < TILE_SIZE && w+k < uniforms.K; k++) { + value += ${J}(tileQ[TILE_SIZE * local_id.y + k] * tileK[TILE_SIZE * local_id.x + k]); + } + + workgroupBarrier(); + } + + if (global_id.y < uniforms.M && global_id.x < total_sequence_length) { + let headOffset = workgroup_id.z * uniforms.M * uniforms.N; + let outputIdx = headOffset + global_id.y * uniforms.N + global_id.x; + var sum: f32 = ${(()=>{switch(y){case 1:return"value";case 2:return"value.x + value.y";case 4:return"value.x + value.y + value.z + value.w";default:throw new Error(`Unsupported components: ${y}`)}})()}; + output[outputIdx] = ${q.type.value} (sum * uniforms.alpha) + ${i?"attention_bias[outputIdx]":"0.0"}; + } + }`};return{name:"AttentionProbs",shaderCache:{hint:`${y};${i!==void 0};${r!==void 0};${e}`,inputDependencies:E},getRunData:()=>({outputs:I,dispatchGroup:m,programUniforms:z}),getShaderSource:R}},Dk=(e,t,n,r,i,a,o=void 0,l=void 0)=>{let c=a+i.kvSequenceLength,u=i.nReps?i.nReps:1,d=i.vHiddenSize*u,h=e>1&&r,p=i.kvNumHeads?i.kvNumHeads:i.numHeads,f=h?[i.batchSize,p,c,i.headSize]:void 0,b=[i.batchSize,i.sequenceLength,d],g=12,y={x:Math.ceil(i.vHeadSize/g),y:Math.ceil(i.sequenceLength/g),z:i.batchSize*i.numHeads},w=[{type:12,data:i.sequenceLength},{type:12,data:c},{type:12,data:i.vHeadSize},{type:12,data:i.numHeads},{type:12,data:i.headSize},{type:12,data:d},{type:12,data:a},{type:12,data:i.kvSequenceLength},{type:12,data:u}],v=h&&r&&In.size(r.dims)>0,m=["type","type"];v&&m.push("type"),o&&m.push("type"),l&&m.push("type");let z=[{dims:b,dataType:t.dataType,gpuDataType:0}];h&&z.push({dims:f,dataType:t.dataType,gpuDataType:0});let C=E=>{let I=Fn("probs",t.dataType,t.dims),R=Fn("v",n.dataType,n.dims),A=[I,R];v&&A.push(Fn("past_value",r.dataType,r.dims));let O=o?Fn("seq_lens",o.dataType,o.dims):void 0;o&&A.push(O);let F=l?Fn("total_sequence_length_input",l.dataType,l.dims):void 0;l&&A.push(F);let L=[Dr("output",t.dataType,b)];h&&L.push(Dr("present_value",t.dataType,f));let X=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"v_hidden_size",type:"u32"},{name:"past_sequence_length",type:"u32"},{name:"kv_sequence_length",type:"u32"},{name:"n_reps",type:"u32"}];return` + const TILE_SIZE = ${g}u; + var tileQ: array<${I.type.value}, ${g*g}>; + var tileV: array<${I.type.value}, ${g*g}>; + ${E.registerUniforms(X).declareVariables(...A,...L)} + ${E.mainStart([g,g,1])} + let headIdx = workgroup_id.z % uniforms.num_heads; + let batchIdx = workgroup_id.z / uniforms.num_heads; + let kvHeadIdx = ${u===1?"headIdx":"headIdx / uniforms.n_reps"}; + let kv_num_heads = ${u===1?"uniforms.num_heads":"uniforms.num_heads / uniforms.n_reps"}; + let m = global_id.y; + let n = global_id.x; + let sequence_length = uniforms.M; + var total_sequence_length = uniforms.K; + ${Z1(O,F,!0)} + let offsetA = workgroup_id.z * uniforms.M * uniforms.K + m * uniforms.K; + let absKvHeadIdx = batchIdx * kv_num_heads + kvHeadIdx; // kvHeadIdx is relative to the batch + ${v&&h?"let pastValueOffset = absKvHeadIdx * uniforms.N * uniforms.past_sequence_length + n;":""}; + let vOffset = absKvHeadIdx * uniforms.N * uniforms.kv_sequence_length + n; + ${h?"let presentValueOffset = absKvHeadIdx * uniforms.N * uniforms.K + n;":""} + var value = ${I.type.storage}(0); + for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { + if (m < uniforms.M && w + local_id.x < uniforms.K) { + tileQ[TILE_SIZE * local_id.y + local_id.x] = probs[offsetA + w + local_id.x]; + } + if (n < uniforms.N && w + local_id.y < uniforms.K) { + var idx = TILE_SIZE * local_id.y + local_id.x; + ${v&&h?` + if (w + local_id.y < past_sequence_length) { + tileV[idx] = past_value[pastValueOffset + (w + local_id.y) * uniforms.N]; + } else if (w + local_id.y - past_sequence_length < uniforms.kv_sequence_length) { + tileV[idx] = v[vOffset + (w + local_id.y - past_sequence_length) * uniforms.N]; + } + `:` + if (w + local_id.y < uniforms.kv_sequence_length) { + tileV[idx] = v[vOffset + (w + local_id.y) * uniforms.N]; + }`} + ${h?` + if (w + local_id.y < present_sequence_length) { + present_value[presentValueOffset + (w + local_id.y) * uniforms.N] = tileV[idx]; + }`:""} + } + workgroupBarrier(); + for (var k: u32 = 0u; k < TILE_SIZE && w+k < total_sequence_length; k++) { + value += tileQ[TILE_SIZE * local_id.y + k] * tileV[TILE_SIZE * k + local_id.x]; + } + workgroupBarrier(); + } + + // we need to transpose output from BNSH_v to BSND_v + if (m < uniforms.M && n < uniforms.N) { + let outputIdx = batchIdx * uniforms.M * uniforms.v_hidden_size + m * uniforms.v_hidden_size + + headIdx * uniforms.N + n; + output[outputIdx] = value; + } + }`};return{name:"AttentionScore",shaderCache:{hint:`${r!==void 0};${e}`,inputDependencies:m},getRunData:()=>({outputs:z,dispatchGroup:y,programUniforms:w}),getShaderSource:C}},hb=(e,t,n,r,i,a,o,l,c,u,d=void 0,h=void 0)=>{let p=Math.min(e.outputCount,1+(o?1:0)+(l?1:0)),f=p>1?u.pastSequenceLength:0,b=f+u.kvSequenceLength,g=c&&In.size(c.dims)>0?c:void 0,y=[t,n];p>1&&o&&In.size(o.dims)>0&&y.push(o),g&&y.push(g),d&&y.push(d),h&&y.push(h);let w=e.compute(Wk(p,t,n,o,g,u,f,d,h),{inputs:y,outputs:p>1?[-1,1]:[-1]})[0];e.compute(Fk(w,u.batchSize,u.numHeads,f,u.sequenceLength,b,d,h),{inputs:d&&h?[w,d,h]:[w],outputs:[]});let v=[w,r];p>1&&l&&In.size(l.dims)>0&&v.push(l),d&&v.push(d),h&&v.push(h),e.compute(Dk(p,w,r,l,u,f,d,h),{inputs:v,outputs:p>1?[0,2]:[0]})},Vk=(e,t)=>{let n=[t.batchSize,t.numHeads,t.sequenceLength,t.headSize],r=t.sequenceLength,i=t.inputHiddenSize,a=t.headSize,o=12,l={x:Math.ceil(t.headSize/o),y:Math.ceil(t.sequenceLength/o),z:t.batchSize*t.numHeads},c=[e.inputs[0],e.inputs[1],e.inputs[2]],u=[{type:12,data:r},{type:12,data:i},{type:12,data:a},{type:12,data:t.numHeads},{type:12,data:t.headSize},{type:12,data:t.hiddenSize},{type:12,data:t.hiddenSize+t.hiddenSize+t.vHiddenSize}],d=h=>{let p=Dr("output_q",c[0].dataType,n),f=Dr("output_k",c[0].dataType,n),b=Dr("output_v",c[0].dataType,n),g=Fn("input",c[0].dataType,c[0].dims),y=Fn("weight",c[1].dataType,c[1].dims),w=Fn("bias",c[2].dataType,c[2].dims),v=g.type.storage,m=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"hidden_size",type:"u32"},{name:"ldb",type:"u32"}];return` + const TILE_SIZE = ${o}u; + var tileInput: array<${v}, ${o*o}>; + var tileWeightQ: array<${v}, ${o*o}>; + var tileWeightK: array<${v}, ${o*o}>; + var tileWeightV: array<${v}, ${o*o}>; + ${h.registerUniforms(m).declareVariables(g,y,w,p,f,b)} + ${h.mainStart([o,o,1])} + let batchIndex = workgroup_id.z / uniforms.num_heads; + let headNumber = workgroup_id.z % uniforms.num_heads; + let m = global_id.y; + let n = global_id.x; + + let inputOffset = batchIndex * (uniforms.M * uniforms.K) + m * uniforms.K; + let biasOffsetQ = headNumber * uniforms.head_size; + let biasOffsetK = uniforms.hidden_size + biasOffsetQ; + let biasOffsetV = uniforms.hidden_size + biasOffsetK; + + var valueQ = ${v}(0); + var valueK = ${v}(0); + var valueV = ${v}(0); + for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { + if (m < uniforms.M && w + local_id.x < uniforms.K) { + tileInput[TILE_SIZE * local_id.y + local_id.x] = input[inputOffset + w + local_id.x]; + } + if (n < uniforms.N && w + local_id.y < uniforms.K) { + let offset = n + (w + local_id.y) * uniforms.ldb; + tileWeightQ[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetQ + offset]; + tileWeightK[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetK + offset]; + tileWeightV[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetV + offset]; + } + workgroupBarrier(); + for (var k: u32 = 0u; k({outputs:[{dims:n,dataType:e.inputs[0].dataType,gpuDataType:0},{dims:n,dataType:e.inputs[0].dataType,gpuDataType:0},{dims:n,dataType:e.inputs[0].dataType,gpuDataType:0}],dispatchGroup:l,programUniforms:u}),getShaderSource:d},{inputs:c,outputs:[-1,-1,-1]})},ML=(e,t)=>{let n=Uk(e.inputs,t),[r,i,a]=Vk(e,n);return hb(e,r,i,a,e.inputs[4],void 0,void 0,void 0,e.inputs[5],n)}}),Hk,Gk,qk,TL,Ode=ur(()=>{xd(),hs(),vs(),oa(),$s(),Hk=(e,t)=>{if(!e||e.length!==5)throw new Error("BatchNormalization requires 5 inputs");let n=(r,i,a)=>{let o=i.length;if(o!==r.length)throw new Error(`${a}: num dimensions != ${o}`);i.forEach((l,c)=>{if(l!==r[c])throw new Error(`${a}: dim[${c}] do not match`)})};if(e[0].dims.length>1){let r=t.format==="NHWC"?t.spatial?e[0].dims.slice(-1):e[0].dims.slice(-1).concat(e[0].dims.slice(1,e[0].dims.length-1)):e[0].dims.slice(1,t.spatial?2:void 0);n(e[1].dims,r,"Invalid input scale"),n(e[2].dims,r,"Invalid input B"),n(e[3].dims,r,"Invalid input mean"),n(e[4].dims,r,"Invalid input var")}else n(e[1].dims,[1],"Invalid input scale"),n(e[2].dims,[1],"Invalid input B"),n(e[3].dims,[1],"Invalid input mean"),n(e[4].dims,[1],"Invalid input var")},Gk=(e,t)=>{let{epsilon:n,spatial:r,format:i}=t,a=e[0].dims,o=r?Yi(a[a.length-1]):1,l=i==="NHWC"&&a.length>1?o:1,c=In.size(a)/o,u=r,d=u?a.length:a,h=Fn("x",e[0].dataType,e[0].dims,o),p=Fn("scale",e[1].dataType,e[1].dims,l),f=Fn("bias",e[2].dataType,e[2].dims,l),b=Fn("inputMean",e[3].dataType,e[3].dims,l),g=Fn("inputVar",e[4].dataType,e[4].dims,l),y=Dr("y",e[0].dataType,d,o),w=()=>{let m="";if(r)m=`let cOffset = ${a.length===1?"0u":i==="NHWC"?`outputIndices[${a.length-1}] / ${o}`:"outputIndices[1]"};`;else if(i==="NCHW")m=` + ${y.indicesSet("outputIndices","0","0")} + let cOffset = ${y.indicesToOffset("outputIndices")};`;else{m=`var cIndices = ${p.type.indices}(0); + cIndices[0] = outputIndices[${a.length-1}];`;for(let z=1;z` + const epsilon = ${n}; + ${m.registerUniform("outputSize","u32").declareVariables(h,p,f,b,g,y)} + ${m.mainStart()} + ${m.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + var outputIndices = ${y.offsetToIndices(`global_idx * ${o}`)}; + ${w()} + let scale = ${p.getByOffset("cOffset")}; + let bias = ${f.getByOffset("cOffset")}; + let inputMean = ${b.getByOffset("cOffset")}; + let inputVar = ${g.getByOffset("cOffset")}; + let x = ${h.getByOffset("global_idx")}; + let value = (x - inputMean) * inverseSqrt(inputVar + epsilon) * scale + bias; + ${y.setByOffset("global_idx","value")} + }`;return{name:"BatchNormalization",shaderCache:{hint:`${t.epsilon}_${t.format}_${r}_${o}`,inputDependencies:u?["rank","type","type","type","type"]:void 0},getShaderSource:v,getRunData:()=>({outputs:[{dims:e[0].dims,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(c/64)},programUniforms:u?[{type:12,data:c},...Yr(a)]:[{type:12,data:c}]})}},qk=e=>pi(e),TL=(e,t)=>{let{inputs:n,outputCount:r}=e,i=qk({...t,outputCount:r});if(Ui.webgpu.validateInputContent&&Hk(n,i),t.trainingMode)throw new Error("BatchNormalization trainingMode is not supported yet.");e.compute(Gk(n,i))}}),Kk,Xk,RL,Lde=ur(()=>{vs(),$s(),Kk=e=>{if(e[0].dims.length!==3)throw new Error("input should have 3 dimensions");if(![320,640,1280].includes(e[0].dims[2]))throw new Error("number of channels should be 320, 640 or 1280");if(e[1].dims.length!==1)throw new Error("bias is expected to have 1 dimensions");if(e[0].dims[2]!==e[1].dims[0])throw new Error("last dimension of input and bias are not the same")},Xk=e=>{let t=e[0].dims,n=e[0].dims[2],r=In.size(t)/4,i=e[0].dataType,a=Fn("input",i,t,4),o=Fn("bias",i,[n],4),l=Fn("residual",i,t,4),c=Dr("output",i,t,4);return{name:"BiasAdd",getRunData:()=>({outputs:[{dims:t,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(r/64)}}),getShaderSource:u=>` + const channels = ${n}u / 4; + ${u.declareVariables(a,o,l,c)} + + ${u.mainStart()} + ${u.guardAgainstOutOfBoundsWorkgroupSizes(r)} + let value = ${a.getByOffset("global_idx")} + + ${o.getByOffset("global_idx % channels")} + ${l.getByOffset("global_idx")}; + ${c.setByOffset("global_idx","value")} + }`}},RL=e=>{Kk(e.inputs),e.compute(Xk(e.inputs))}}),Yk,Ks,PL,OL,LL,BL,UL,FL,WL,DL,VL,Jk,HL,GL,qL,KL,lx,XL,wv,YL,JL,ZL,QL,eB,tB,nB,rB,sB,iB,aB,oB,lB,cB,uB,dB,b3,hB,X$,Y$,pB,fB,mB,Zk,Qk,gB,K4=ur(()=>{hs(),vs(),oa(),$s(),Yk=(e,t,n,r,i,a,o)=>{let l=Math.ceil(t/4),c="";typeof i=="string"?c=`${i}(a)`:c=i("a");let u=Fn("inputData",n,[l],4),d=Dr("outputData",r,[l],4),h=[{name:"vec_size",type:"u32"}];return o&&h.push(...o),` + ${e.registerUniforms(h).declareVariables(u,d)} + + ${a??""} + + ${e.mainStart()} + ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + + let a = ${u.getByOffset("global_idx")}; + ${d.setByOffset("global_idx",c)} + }`},Ks=(e,t,n,r,i,a=e.dataType,o,l)=>{let c=[{type:12,data:Math.ceil(In.size(e.dims)/4)}];return o&&c.push(...o),{name:t,shaderCache:{hint:i,inputDependencies:["type"]},getShaderSource:u=>Yk(u,In.size(e.dims),e.dataType,a,n,r,l),getRunData:u=>({outputs:[{dims:e.dims,dataType:a}],dispatchGroup:{x:Math.ceil(In.size(u[0].dims)/64/4)},programUniforms:c})}},PL=e=>{e.compute(Ks(e.inputs[0],"Abs","abs"))},OL=e=>{e.compute(Ks(e.inputs[0],"Acos","acos"))},LL=e=>{e.compute(Ks(e.inputs[0],"Acosh","acosh"))},BL=e=>{e.compute(Ks(e.inputs[0],"Asin","asin"))},UL=e=>{e.compute(Ks(e.inputs[0],"Asinh","asinh"))},FL=e=>{e.compute(Ks(e.inputs[0],"Atan","atan"))},WL=e=>{e.compute(Ks(e.inputs[0],"Atanh","atanh"))},DL=e=>pi(e),VL=(e,t)=>{let n;switch(t.to){case 10:n="vec4";break;case 1:n="vec4";break;case 12:n="vec4";break;case 6:n="vec4";break;case 9:n="vec4";break;default:throw new RangeError(`not supported type (specified in attribute 'to' from 'Cast' operator): ${t.to}`)}e.compute(Ks(e.inputs[0],"Cast",n,void 0,t.cacheKey,t.to))},Jk=e=>{let t,n,r=e.length>=2&&e[1].data!==0,i=e.length>=3&&e[2].data!==0;switch(e[0].dataType){case 1:t=r?e[1].getFloat32Array()[0]:-34028234663852886e22,n=i?e[2].getFloat32Array()[0]:34028234663852886e22;break;case 10:t=r?e[1].getUint16Array()[0]:64511,n=i?e[2].getUint16Array()[0]:31743;break;default:throw new Error("Unsupport data type")}return pi({min:t,max:n})},HL=(e,t)=>{let n=t||Jk(e.inputs),r=Bo(e.inputs[0].dataType);e.compute(Ks(e.inputs[0],"Clip",i=>`clamp(${i}, vec4<${r}>(uniforms.min), vec4<${r}>(uniforms.max))`,void 0,n.cacheKey,void 0,[{type:e.inputs[0].dataType,data:n.min},{type:e.inputs[0].dataType,data:n.max}],[{name:"min",type:r},{name:"max",type:r}]),{inputs:[0]})},GL=e=>{e.compute(Ks(e.inputs[0],"Ceil","ceil"))},qL=e=>{e.compute(Ks(e.inputs[0],"Cos","cos"))},KL=e=>{e.compute(Ks(e.inputs[0],"Cosh","cosh"))},lx=e=>pi(e),XL=(e,t)=>{let n=Bo(e.inputs[0].dataType);e.compute(Ks(e.inputs[0],"Elu",r=>`elu_vf32(${r})`,` + const elu_alpha_ = ${n}(${t.alpha}); + + fn elu_f32(a: ${n}) -> ${n} { + return select((exp(a) - 1.0) * elu_alpha_, a, a >= 0.0); + } + + fn elu_vf32(v: vec4<${n}>) -> vec4<${n}> { + return vec4(elu_f32(v.x), elu_f32(v.y), elu_f32(v.z), elu_f32(v.w)); + }`,t.cacheKey))},wv=(e="f32")=>` +const r0: ${e} = 0.3275911; +const r1: ${e} = 0.254829592; +const r2: ${e} = -0.284496736; +const r3: ${e} = 1.421413741; +const r4: ${e} = -1.453152027; +const r5: ${e} = 1.061405429; + +fn erf_vf32(v: vec4<${e}>) -> vec4<${e}> { + let absv = abs(v); + let x = 1.0 / (1.0 + r0 * absv); + return sign(v) * (1.0 - ((((r5 * x + r4) * x + r3) * x + r2) * x + r1) * x * exp(-absv * absv)); +}`,YL=e=>{let t=Bo(e.inputs[0].dataType);e.compute(Ks(e.inputs[0],"Erf",n=>`erf_vf32(${n})`,wv(t)))},JL=e=>{e.compute(Ks(e.inputs[0],"Exp","exp"))},ZL=e=>{e.compute(Ks(e.inputs[0],"Floor","floor"))},QL=e=>{let t=Bo(e.inputs[0].dataType);e.compute(Ks(e.inputs[0],"Gelu",n=>`0.5 * ${n} * (1.0 + erf_vf32(${n} * 0.7071067811865475))`,wv(t)))},eB=(e,t)=>{let n=Bo(e.inputs[0].dataType);e.compute(Ks(e.inputs[0],"LeakyRelu",r=>`select(leaky_relu_alpha_ * ${r}, ${r}, ${r} >= vec4<${n}>(0.0))`,`const leaky_relu_alpha_ = ${n}(${t.alpha});`,t.cacheKey))},tB=e=>{e.compute(Ks(e.inputs[0],"Not",t=>`!${t}`))},nB=e=>{e.compute(Ks(e.inputs[0],"Neg",t=>`-${t}`))},rB=e=>{e.compute(Ks(e.inputs[0],"Reciprocal",t=>`1.0/${t}`))},sB=e=>{let t=Bo(e.inputs[0].dataType);e.compute(Ks(e.inputs[0],"Relu",n=>`select(vec4<${t}>(0.0), ${n}, ${n} > vec4<${t}>(0.0))`))},iB=e=>{e.compute(Ks(e.inputs[0],"Sigmoid",t=>`(1.0 / (1.0 + exp(-${t})))`))},aB=e=>pi(e),oB=(e,t)=>{let n=Bo(e.inputs[0].dataType);e.compute(Ks(e.inputs[0],"HardSigmoid",r=>`max(vec4<${n}>(0.0), min(vec4<${n}>(1.0), ${t.alpha} * ${r} + vec4<${n}>(${t.beta})))`,void 0,t.cacheKey))},lB=e=>{e.compute(Ks(e.inputs[0],"Sin","sin"))},cB=e=>{e.compute(Ks(e.inputs[0],"Sinh","sinh"))},uB=e=>{e.compute(Ks(e.inputs[0],"Sqrt","sqrt"))},dB=e=>{e.compute(Ks(e.inputs[0],"Tan","tan"))},b3=e=>`sign(${e}) * (1 - exp(-2 * abs(${e}))) / (1 + exp(-2 * abs(${e})))`,hB=e=>{e.compute(Ks(e.inputs[0],"Tanh",b3))},X$=(e="f32")=>` +const fast_gelu_a: ${e} = 0.5; +const fast_gelu_b: ${e} = 0.7978845608028654; +const fast_gelu_c: ${e} = 0.035677408136300125; + +fn tanh_v(v: vec4<${e}>) -> vec4<${e}> { + return ${b3("v")}; +} +`,Y$=e=>`(fast_gelu_a + fast_gelu_a * tanh_v(${e} * (fast_gelu_c * ${e} * ${e} + fast_gelu_b))) * ${e}`,pB=e=>{let t=Bo(e.inputs[0].dataType);e.compute(Ks(e.inputs[0],"FastGelu",Y$,X$(t),void 0,e.inputs[0].dataType))},fB=(e,t)=>{let n=Bo(e.inputs[0].dataType);return e.compute(Ks(e.inputs[0],"ThresholdedRelu",r=>`select(vec4<${n}>(0.0), ${r}, ${r} > thresholded_relu_alpha_)`,`const thresholded_relu_alpha_ = vec4<${n}>(${t.alpha});`,t.cacheKey)),0},mB=e=>{e.compute(Ks(e.inputs[0],"Log","log"))},Zk=(e,t)=>` +const alpha = vec4<${e}>(${t}); +const one = ${e}(1.0); +const zero = ${e}(0.0); + +fn quick_gelu_impl(x: vec4<${e}>) -> vec4<${e}> { + let v = x *alpha; + var x1 : vec4<${e}>; + for (var i = 0; i < 4; i = i + 1) { + if (v[i] >= zero) { + x1[i] = one / (one + exp(-v[i])); + } else { + x1[i] = one - one / (one + exp(v[i])); + } + } + return x * x1; +} +`,Qk=e=>`quick_gelu_impl(${e})`,gB=(e,t)=>{let n=Bo(e.inputs[0].dataType);e.compute(Ks(e.inputs[0],"QuickGelu",Qk,Zk(n,t.alpha),t.cacheKey,e.inputs[0].dataType))}}),e6,t6,xB,Bde=ur(()=>{vs(),$s(),K4(),e6=e=>{if(e[0].dims.length!==3)throw new Error("input should have 3 dimensions");if(![2560,5120,10240].includes(e[0].dims[2]))throw new Error("hidden state should be 2560, 5120 or 10240");if(e[1].dims.length!==1)throw new Error("bias is expected to have 1 dimensions");if(e[0].dims[2]!==e[1].dims[0])throw new Error("last dimension of input and bias are not the same")},t6=e=>{let t=e[0].dims.slice();t[2]=t[2]/2;let n=Fn("input",e[0].dataType,e[0].dims,4),r=Fn("bias",e[0].dataType,[e[0].dims[2]],4),i=Dr("output",e[0].dataType,t,4),a=In.size(t)/4,o=Za(e[0].dataType);return{name:"BiasSplitGelu",getRunData:()=>({outputs:[{dims:t,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(a/64)}}),getShaderSource:l=>` + const M_SQRT2 = sqrt(2.0); + const halfChannels = ${e[0].dims[2]/4/2}u; + + ${l.declareVariables(n,r,i)} + + ${wv(o)} + + ${l.mainStart()} + ${l.guardAgainstOutOfBoundsWorkgroupSizes(a)} + let biasIdx = global_idx % halfChannels; + let batchIndex = global_idx / halfChannels; + let inputOffset = biasIdx + batchIndex * halfChannels * 2; + let valueLeft = input[inputOffset] + bias[biasIdx]; + let valueRight = input[inputOffset + halfChannels] + bias[biasIdx + halfChannels]; + let geluRight = valueRight * 0.5 * (erf_vf32(valueRight / M_SQRT2) + 1); + + ${i.setByOffset("global_idx","valueLeft * geluRight")} + }`}},xB=e=>{e6(e.inputs),e.compute(t6(e.inputs))}}),n6,r6,Qu,bB,yB,vB,wB,_B,zB,$B,SB,jB,CB,Ude=ur(()=>{hs(),vs(),$s(),n6=(e,t,n,r,i,a,o,l,c,u,d,h)=>{let p,f;typeof l=="string"?p=f=(v,m)=>`${l}((${v}),(${m}))`:typeof l=="function"?p=f=l:(p=l.scalar,f=l.vector);let b=Dr("outputData",d,r.length,4),g=Fn("aData",c,t.length,4),y=Fn("bData",u,n.length,4),w;if(i)if(a){let v=In.size(t)===1,m=In.size(n)===1,z=t.length>0&&t[t.length-1]%4===0,C=n.length>0&&n[n.length-1]%4===0;v||m?w=b.setByOffset("global_idx",f(v?`${g.type.value}(${g.getByOffset("0")}.x)`:g.getByOffset("global_idx"),m?`${y.type.value}(${y.getByOffset("0")}.x)`:y.getByOffset("global_idx"))):w=` + let outputIndices = ${b.offsetToIndices("global_idx * 4u")}; + let offsetA = ${g.broadcastedIndicesToOffset("outputIndices",b)}; + let offsetB = ${y.broadcastedIndicesToOffset("outputIndices",b)}; + ${b.setByOffset("global_idx",f(o||z?g.getByOffset("offsetA / 4u"):`${g.type.value}(${g.getByOffset("offsetA / 4u")}[offsetA % 4u])`,o||C?y.getByOffset("offsetB / 4u"):`${y.type.value}(${y.getByOffset("offsetB / 4u")}[offsetB % 4u])`))} + `}else w=b.setByOffset("global_idx",f(g.getByOffset("global_idx"),y.getByOffset("global_idx")));else{if(!a)throw new Error("no necessary to use scalar implementation for element-wise binary op implementation.");let v=(m,z,C="")=>{let E=`aData[indexA${z}][componentA${z}]`,I=`bData[indexB${z}][componentB${z}]`;return` + let outputIndices${z} = ${b.offsetToIndices(`global_idx * 4u + ${z}u`)}; + let offsetA${z} = ${g.broadcastedIndicesToOffset(`outputIndices${z}`,b)}; + let offsetB${z} = ${y.broadcastedIndicesToOffset(`outputIndices${z}`,b)}; + let indexA${z} = offsetA${z} / 4u; + let indexB${z} = offsetB${z} / 4u; + let componentA${z} = offsetA${z} % 4u; + let componentB${z} = offsetB${z} % 4u; + ${m}[${z}] = ${C}(${p(E,I)}); + `};d===9?w=` + var data = vec4(0); + ${v("data",0,"u32")} + ${v("data",1,"u32")} + ${v("data",2,"u32")} + ${v("data",3,"u32")} + outputData[global_idx] = dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(data));`:w=` + ${v("outputData[global_idx]",0)} + ${v("outputData[global_idx]",1)} + ${v("outputData[global_idx]",2)} + ${v("outputData[global_idx]",3)} + `}return` + ${e.registerUniform("vec_size","u32").declareVariables(g,y,b)} + + ${h??""} + + ${e.mainStart()} + ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + ${w} + }`},r6=(e,t,n,r,i,a,o=n.dataType)=>{let l=n.dims.map(g=>Number(g)??1),c=r.dims.map(g=>Number(g)??1),u=!In.areEqual(l,c),d=l,h=In.size(l),p=!1,f=!1,b=[u];if(u){let g=Nm.calcShape(l,c,!1);if(!g)throw new Error("Can't perform binary op on the given tensors");d=g.slice(),h=In.size(d);let y=In.size(l)===1,w=In.size(c)===1,v=l.length>0&&l[l.length-1]%4===0,m=c.length>0&&c[c.length-1]%4===0;b.push(y),b.push(w),b.push(v),b.push(m);let z=1;for(let C=1;Cg.toString()).join("_"),inputDependencies:["rank","rank"]},getShaderSource:g=>n6(g,l,c,d,p,u,f,i,n.dataType,r.dataType,o,a),getRunData:()=>({outputs:[{dims:d,dataType:o}],dispatchGroup:{x:Math.ceil(h/64/4)},programUniforms:[{type:12,data:Math.ceil(In.size(d)/4)},...Yr(l,c,d)]})}},Qu=(e,t,n,r,i,a)=>{e.compute(r6(t,i??"",e.inputs[0],e.inputs[1],n,r,a))},bB=e=>{Qu(e,"Add",(t,n)=>`${t}+${n}`)},yB=e=>{Qu(e,"Div",(t,n)=>`${t}/${n}`)},vB=e=>{Qu(e,"Equal",{scalar:(t,n)=>`u32(${t}==${n})`,vector:(t,n)=>`vec4(${t}==${n})`},void 0,void 0,9)},wB=e=>{Qu(e,"Mul",(t,n)=>`${t}*${n}`)},_B=e=>{let t=Fn("input",e.inputs[0].dataType,e.inputs[0].dims).type.value;Qu(e,"Pow",{scalar:(n,r)=>`pow_custom(${n},${r})`,vector:(n,r)=>`pow_vector_custom(${n},${r})`},` + fn pow_custom(a : ${t}, b : ${t}) -> ${t} { + if (b == ${t}(0.0)) { + return ${t}(1.0); + } else if (a < ${t}(0.0) && f32(b) != floor(f32(b))) { + return ${t}(pow(f32(a), f32(b))); // NaN + } + return select(sign(a), ${t}(1.0), round(f32(abs(b) % ${t}(2.0))) != 1.0) * ${t}(${t==="i32"?"round":""}(pow(f32(abs(a)), f32(b)))); + } + fn pow_vector_custom(a : vec4<${t}>, b : vec4<${t}>) -> vec4<${t}> { + // TODO: implement vectorized pow + return vec4<${t}>(pow_custom(a.x, b.x), pow_custom(a.y, b.y), pow_custom(a.z, b.z), pow_custom(a.w, b.w)); + } + `)},zB=e=>{Qu(e,"Sub",(t,n)=>`${t}-${n}`)},$B=e=>{Qu(e,"Greater",{scalar:(t,n)=>`u32(${t}>${n})`,vector:(t,n)=>`vec4(${t}>${n})`},void 0,void 0,9)},SB=e=>{Qu(e,"Less",{scalar:(t,n)=>`u32(${t}<${n})`,vector:(t,n)=>`vec4(${t}<${n})`},void 0,void 0,9)},jB=e=>{Qu(e,"GreaterOrEqual",{scalar:(t,n)=>`u32(${t}>=${n})`,vector:(t,n)=>`vec4(${t}>=${n})`},void 0,void 0,9)},CB=e=>{Qu(e,"LessOrEqual",{scalar:(t,n)=>`u32(${t}<=${n})`,vector:(t,n)=>`vec4(${t}<=${n})`},void 0,void 0,9)}}),s6,i6,a6,o6,NB,EB,Fde=ur(()=>{hs(),vs(),oa(),$s(),s6=(e,t)=>{if(!e||e.length<1)throw new Error("too few inputs");let n=0,r=e[n],i=r.dataType,a=r.dims.length;e.forEach((o,l)=>{if(l!==n){if(o.dataType!==i)throw new Error("input tensors should be one type");if(o.dims.length!==a)throw new Error("input tensors should have the same shape");o.dims.forEach((c,u)=>{if(u!==t&&c!==r.dims[u])throw new Error("non concat dimensions must match")})}})},i6=(e,t)=>` + fn calculateInputIndex(index: u32) -> u32 { + let sizeInConcatAxis = array(${t}); + for (var i: u32 = 0u; i < ${e}; i += 1u ) { + if (index < sizeInConcatAxis[i]) { + return i; + } + } + return ${e}u; + }`,a6=(e,t)=>{let n=e.length,r=[];for(let i=0;i{let i=In.size(n),a=new Array(e.length),o=new Array(e.length),l=0,c=[],u=[],d=[{type:12,data:i}];for(let g=0;g`uniforms.sizeInConcatAxis${g}`).join(","),b=g=>` + + ${(()=>{g.registerUniform("outputSize","u32");for(let y=0;y(${f}); + ${p} -= sizeInConcatAxis[inputIndex - 1u]; + } + + ${a6(o,h)} + }`;return{name:"Concat",shaderCache:{hint:`${t}`,inputDependencies:c},getRunData:()=>({outputs:[{dims:n,dataType:r}],dispatchGroup:{x:Math.ceil(i/64)},programUniforms:d}),getShaderSource:b}},NB=(e,t)=>{let n=e.inputs,r=n[0].dims,i=In.normalizeAxis(t.axis,r.length);s6(n,i);let a=r.slice();a[i]=n.reduce((l,c)=>l+(c.dims.length>i?c.dims[i]:0),0);let o=n.filter(l=>In.size(l.dims)>0);e.compute(o6(o,i,a,n[0].dataType),{inputs:o})},EB=e=>pi({axis:e.axis})}),Xp,Yp,Jp,X4,cf=ur(()=>{hs(),vs(),Xp=(e,t,n="f32")=>{switch(e.activation){case"Relu":return`value = max(value, ${t}(0.0));`;case"Sigmoid":return`value = (${t}(1.0) / (${t}(1.0) + exp(-value)));`;case"Clip":return`value = clamp(value, ${t}(${n}(uniforms.clip_min)), ${t}(${n}(uniforms.clip_max)));`;case"HardSigmoid":return`value = max(${t}(0.0), min(${t}(1.0), ${n}(uniforms.alpha) * value + ${n}(uniforms.beta)));`;case"LeakyRelu":return`value = select(${n}(uniforms.alpha) * value, value, value >= ${t}(0.0));`;case"Tanh":return`let e2x = exp(-2.0 * abs(value)); + value = sign(value) * (1.0 - e2x) / (1.0 + e2x); + `;case"":return"";default:throw new Error(`Unsupported activation ${e.activation}`)}},Yp=(e,t)=>{e.activation==="Clip"?t.push({type:1,data:e.clipMax},{type:1,data:e.clipMin}):e.activation==="HardSigmoid"?t.push({type:1,data:e.alpha},{type:1,data:e.beta}):e.activation==="LeakyRelu"&&t.push({type:1,data:e.alpha})},Jp=(e,t)=>{e.activation==="Clip"?t.push({name:"clip_max",type:"f32"},{name:"clip_min",type:"f32"}):e.activation==="HardSigmoid"?t.push({name:"alpha",type:"f32"},{name:"beta",type:"f32"}):e.activation==="LeakyRelu"&&t.push({name:"alpha",type:"f32"})},X4=e=>{let t=(e==null?void 0:e.activation)||"";if(t==="HardSigmoid"){let[n,r]=(e==null?void 0:e.activation_params)||[.2,.5];return{activation:t,alpha:n,beta:r}}else if(t==="Clip"){let[n,r]=(e==null?void 0:e.activation_params)||[iL,aL];return{activation:t,clipMax:r,clipMin:n}}else if(t==="LeakyRelu"){let[n]=(e==null?void 0:e.activation_params)||[.01];return{activation:t,alpha:n}}return{activation:t}}}),ho,IB,Y4=ur(()=>{ho=(e,t)=>{switch(e){case 1:return t;case 2:return`vec2<${t}>`;case 3:return`vec3<${t}>`;case 4:return`vec4<${t}>`;default:throw new Error(`${e}-component is not supported.`)}},IB=e=>` + ${e?"value = value + getBiasByOutputCoords(coords);":""} + `}),kB,Wde=ur(()=>{kB=e=>` +fn getIndexFromCoords4D(coords : vec4, shape : vec4) -> i32 { + return dot(coords, vec4( + shape.y * shape.z * shape.w, shape.z * shape.w, shape.w, 1)); +} +fn getOutputIndexFromCoords(coords : vec4) -> i32 { + return dot(coords, vec4( + i32(${e}.x), i32(${e}.y), i32(${e}.z), 1)); +} +`}),_x,J4,Z4=ur(()=>{hs(),vs(),$s(),cf(),_x=(e,t,n,r,i)=>{let a=r-n;return` + ${Array.from({length:n}).map((o,l)=>` + if (${Gr(t.shape,l,t.rank)} != 1) { + ${t.indicesSet(e,l,Gr(i,l+a,r))} + } else { + ${t.indicesSet(e,l,0)} + }`).join("")} +`},J4=(e,t,n,r,i=!1,a)=>{let o=e[0].dims,l=e[1].dims,c=o[o.length-2],u=l[l.length-1],d=o[o.length-1],h=Yi(u),p=Yi(d),f=Yi(c),b=In.size(n)/h/f,g=e.length>2,y=r?r.slice(0,-2):n.slice(0,-2),w=[In.size(y),c,u],v=[{type:12,data:b},{type:12,data:c},{type:12,data:u},{type:12,data:d}];Yp(t,v),v.push(...Yr(y,o,l)),g&&v.push(...Yr(e[2].dims)),v.push(...Yr(w));let m=z=>{let C=H4("batch_dims",e[0].dataType,y.length),E=Fn("a",e[0].dataType,o.length,p),I=Fn("b",e[1].dataType,l.length,h),R=Dr("output",e[0].dataType,w.length,h),A=Za(R.type.tensor),O=Xp(t,R.type.value,A),F=[E,I],L="";if(g){let q=i?h:1;F.push(Fn("bias",e[2].dataType,e[2].dims.length,q)),L=`${i?`value += bias[col / ${q}];`:`value += ${R.type.value}(bias[row + i]);`}`}let X=[{name:"output_size",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"}];Jp(t,X);let T=()=>{let q=`var a_data: ${E.type.value};`;for(let H=0;H; + for (var k: u32 = 0u; k < uniforms.K; k = k + ${p}) { + ${T()} + } + for (var i = 0u; i < ${f}u; i++) { + var value = values[i]; + ${L} + ${O} + let cur_indices = ${R.type.indices}(batch, row + i, col); + let offset = ${R.indicesToOffset("cur_indices")}; + ${R.setByOffset(`offset / ${h}`,"value")}; + } + } + `};return{name:"MatMulNaive",shaderCache:{hint:`${t.activation};${h};${p};${f};${i}`,inputDependencies:g?["rank","rank","rank"]:["rank","rank"]},getRunData:()=>({outputs:[{dims:a?a(n):n,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(b/64)},programUniforms:v}),getShaderSource:m}}}),l6,c6,J$,y3,u6,Z$,d6,hw,Q4=ur(()=>{hs(),vs(),$s(),cf(),Z4(),Y4(),l6=(e,t)=>e?` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + kStart + inputRow, + globalRowStart / innerElementSize + inputCol${t?", batchIndices":""}); + `:` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + globalRow + innerRow, + kStart / innerElementSize + inputCol${t?", batchIndices":""}); + `,c6=(e,t)=>e?` + let ACached0 = mm_Asub[k * innerElementSize][localRow]; + let ACached1 = mm_Asub[k * innerElementSize + 1][localRow]; + let ACached2 = mm_Asub[k * innerElementSize + 2][localRow]; + ${t===3?"":"let ACached3 = mm_Asub[k * innerElementSize + 3][localRow];"} + for (var i = 0; i < rowPerThread; i = i + 1) { + acc[i] = BCached0 * ACached0[i] + acc[i]; + acc[i] = BCached1 * ACached1[i] + acc[i]; + acc[i] = BCached2 * ACached2[i] + acc[i]; + ${t===3?"":"acc[i] = BCached3 * ACached3[i] + acc[i];"} + }`:` + for (var i = 0; i < rowPerThread; i = i + 1) { + let ACached = mm_Asub[tileRow + i][k]; + acc[i] = BCached0 * ACached.x + acc[i]; + acc[i] = BCached1 * ACached.y + acc[i]; + acc[i] = BCached2 * ACached.z + acc[i]; + ${t===3?"":"acc[i] = BCached3 * ACached.w + acc[i];"} + }`,J$=(e,t,n="f32",r,i=!1,a=32,o=!1,l=32)=>{let c=t[1]*e[1],u=t[0]*e[0],d=i?c:a,h=i?a:c,p=d/t[0],f=a/t[1];if(!((i&&p===4&&e[1]===4||!i&&(p===3||p===4))&&d%t[0]===0&&a%t[1]===0&&e[0]===4))throw new Error(`If transposeA ${i} is true, innerElementSize ${p} and workPerThread[1] ${e[1]} must be 4. + Otherwise, innerElementSize ${p} must be 3 or 4. + tileAWidth ${d} must be divisible by workgroupSize[0]${t[0]}. tileInner ${a} must be divisible by workgroupSize[1] ${t[1]}. colPerThread ${e[0]} must be 4.`);return` +var mm_Asub: array, ${d/p}>, ${h}>; +var mm_Bsub: array, ${u/e[0]}>, ${a}>; + +const rowPerThread = ${e[1]}; +const colPerThread = ${e[0]}; +const innerElementSize = ${p}; +const tileInner = ${a}; + +@compute @workgroup_size(${t[0]}, ${t[1]}, ${t[2]}) +fn main(@builtin(local_invocation_id) localId : vec3, + @builtin(global_invocation_id) globalId : vec3, + @builtin(workgroup_id) workgroupId : vec3) { + let localRow = i32(localId.y); + let tileRow = localRow * rowPerThread; + let tileCol = i32(localId.x); + + let globalRow =i32(globalId.y) * rowPerThread; + let globalCol = i32(globalId.x); + let batch = ${o?"0":"i32(globalId.z)"}; + ${r?`let batchIndices = ${r.offsetToIndices("u32(batch)")};`:""} + let globalRowStart = i32(workgroupId.y) * ${c}; + + let num_tiles = ${o?`${Math.ceil(l/a)}`:"(uniforms.dim_inner - 1) / tileInner + 1"}; + var kStart = ${o?`i32(globalId.z) * ${l}`:"0"}; + + var acc: array, rowPerThread>; + + // Loop over shared dimension. + let tileRowB = localRow * ${f}; + for (var t = 0; t < num_tiles; t = t + 1) { + // Load one tile of A into local memory. + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + let inputRow = tileRow + innerRow; + let inputCol = tileCol; + ${l6(i,r)} + } + + // Load one tile of B into local memory. + for (var innerRow = 0; innerRow < ${f}; innerRow = innerRow + 1) { + let inputRow = tileRowB + innerRow; + let inputCol = tileCol; + mm_Bsub[inputRow][inputCol] = mm_readB(batch, kStart + inputRow, globalCol${r?", batchIndices":""}); + } + kStart = kStart + tileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + for (var k = 0; k < tileInner / innerElementSize; k = k + 1) { + let BCached0 = mm_Bsub[k * innerElementSize][tileCol]; + let BCached1 = mm_Bsub[k * innerElementSize + 1][tileCol]; + let BCached2 = mm_Bsub[k * innerElementSize + 2][tileCol]; + ${p===3?"":"let BCached3 = mm_Bsub[k * innerElementSize + 3][tileCol];"} + + ${c6(i,p)} + } + + workgroupBarrier(); + } + + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + mm_write(batch, globalRow + innerRow, globalCol, acc[innerRow]); + } +}`},y3=(e,t)=>e?` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + kStart + inputRow, + globalRowStart + inputCol${t?", batchIndices":""}); + `:` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + globalRowStart + inputRow, + kStart + inputCol${t?", batchIndices":""}); + `,u6=e=>e?"let ACached = mm_Asub[k][tileRow + innerRow];":"let ACached = mm_Asub[tileRow + innerRow][k];",Z$=(e,t,n="f32",r,i=!1,a=32,o=!1,l=32,c=!1)=>{let u=e[1]*t[1],d=e[0]*t[0],h=i?u:a,p=i?a:u;if(!(p%t[1]===0&&h%t[0]===0&&a%t[1]===0))throw new Error(`tileAHight ${p} must be divisible by workgroupSize[1]${t[1]}, tileAWidth ${h} must be divisible by workgroupSize[0]${t[0]}, tileInner ${a} must be divisible by workgroupSize[1]${t[1]}`);let f=p/t[1],b=h/t[0],g=a/t[1],y=c?` + let localRow = i32(localId.y); + let localCol = i32(localId.x); + let globalRowStart = i32(workgroupId.y) * ${u}; + let globalColStart = i32(workgroupId.x) * ${d}; + + // Loop over shared dimension. + for (var t = 0; t < num_tiles; t = t + 1) { + // Load one tile of A into local memory. + for (var inputRow = localRow; inputRow < ${p}; inputRow = inputRow + ${t[1]}) { + for (var inputCol = localCol; inputCol < ${h}; inputCol = inputCol + ${t[0]}) { + ${y3(i,r)} + } + } + // Load one tile of B into local memory. + for (var inputRow = localRow; inputRow < ${a}; inputRow = inputRow + ${t[1]}) { + for (var inputCol = localCol; inputCol < ${d}; inputCol = inputCol + ${t[0]}) { + mm_Bsub[inputRow][inputCol] = mm_readB(batch, + kStart + inputRow, + globalColStart + inputCol${r?", batchIndices":""}); + } + } + kStart = kStart + tileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + var BCached : array<${n}, colPerThread>; + for (var k = 0; k < tileInner; k = k + 1) { + for (var inner = 0; inner < colPerThread; inner = inner + 1) { + BCached[inner] = mm_Bsub[k][localCol + inner * ${t[0]}]; + } + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + let ACached = ${i?`mm_Asub[k][localRow + innerRow * ${t[1]}];`:`mm_Asub[localRow + innerRow * ${t[1]}][k];`} + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + acc[innerRow][innerCol] = acc[innerRow][innerCol] + + ACached * BCached[innerCol]; + } + } + } + workgroupBarrier(); + } + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + let gRow = globalRowStart + localRow + innerRow * ${t[1]}; + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + let gCol = globalColStart + localCol + innerCol * ${t[0]}; + mm_write(batch, gRow, gCol, acc[innerRow][innerCol]); + } + } + `:` +let tileRow = i32(localId.y) * rowPerThread; +let tileCol = i32(localId.x) * colPerThread; + +let globalRow = i32(globalId.y) * rowPerThread; +let globalCol = i32(globalId.x) * colPerThread; +let globalRowStart = i32(workgroupId.y) * ${u}; + +let tileRowA = i32(localId.y) * ${f}; +let tileColA = i32(localId.x) * ${b}; +let tileRowB = i32(localId.y) * ${g}; +// Loop over shared dimension. +for (var t = 0; t < num_tiles; t = t + 1) { + // Load one tile of A into local memory. + for (var innerRow = 0; innerRow < ${f}; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < ${b}; innerCol = innerCol + 1) { + let inputRow = tileRowA + innerRow; + let inputCol = tileColA + innerCol; + ${y3(i,r)} + } + } + + // Load one tile of B into local memory. + for (var innerRow = 0; innerRow < ${g}; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + let inputRow = tileRowB + innerRow; + let inputCol = tileCol + innerCol; + mm_Bsub[inputRow][inputCol] = mm_readB(batch, + kStart + inputRow, + globalCol + innerCol${r?", batchIndices":""}); + } + } + kStart = kStart + tileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + var BCached : array<${n}, colPerThread>; + for (var k = 0; k < tileInner; k = k + 1) { + for (var inner = 0; inner < colPerThread; inner = inner + 1) { + BCached[inner] = mm_Bsub[k][tileCol + inner]; + } + + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + ${u6(i)} + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + acc[innerRow][innerCol] = acc[innerRow][innerCol] + ACached * BCached[innerCol]; + } + } + } + + workgroupBarrier(); +} + +for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + mm_write(batch, globalRow + innerRow, globalCol + innerCol, + acc[innerRow][innerCol]); + } +} +`;return` + var mm_Asub : array, ${p}>; + var mm_Bsub : array, ${a}>; + const rowPerThread = ${e[1]}; + const colPerThread = ${e[0]}; + const tileInner = ${a}; + +@compute @workgroup_size(${t[0]}, ${t[1]}, ${t[2]}) +fn main(@builtin(local_invocation_id) localId : vec3, + @builtin(global_invocation_id) globalId : vec3, + @builtin(workgroup_id) workgroupId : vec3) { + let batch = ${o?"0":"i32(globalId.z)"}; + ${r?`let batchIndices = ${r.offsetToIndices("u32(batch)")};`:""} + let num_tiles = ${o?`${Math.ceil(l/a)}`:"(uniforms.dim_inner - 1) / tileInner + 1"}; + var kStart = ${o?`i32(globalId.z) * ${l}`:"0"}; + + var acc : array, rowPerThread>; + ${y} + } +`},d6=(e,t,n,r,i=!1)=>{let[a,o,l,c]=r,u=Za(r[0].type.tensor);return` + fn mm_readA(batch: i32, row: i32, colIn: i32, batchIndices: ${a.type.indices}) -> ${ho(e,u)} { + var value = ${ho(e,u)}(0.0); + let col = colIn * ${e}; + if(row < uniforms.dim_a_outer && col < uniforms.dim_inner) + { + var aIndices: ${o.type.indices}; + ${_x("aIndices",o,o.rank-2,a.rank,"batchIndices")} + ${o.indicesSet("aIndices",o.rank-2,"u32(row)")} + ${o.indicesSet("aIndices",o.rank-1,"u32(colIn)")} + value = ${o.getByIndices("aIndices")}; + } + return value; + } + + fn mm_readB(batch: i32, row: i32, colIn: i32, batchIndices: ${a.type.indices}) -> ${ho(e,u)} { + var value = ${ho(e,u)}(0.0); + let col = colIn * ${e}; + if(row < uniforms.dim_inner && col < uniforms.dim_b_outer) + { + var bIndices: ${l.type.indices}; + ${_x("bIndices",l,l.rank-2,a.rank,"batchIndices")} + ${l.indicesSet("bIndices",l.rank-2,"u32(row)")} + ${l.indicesSet("bIndices",l.rank-1,"u32(colIn)")} + value = ${l.getByIndices("bIndices")}; + } + return value; + } + + fn mm_write(batch: i32, row: i32, colIn: i32, valueIn: ${ho(e,u)}) { + let col = colIn * ${e}; + if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) { + var value = valueIn; + let coords = vec3(batch, row, colIn); + ${t?`value = value + ${i?"bias[colIn]":`${ho(e,u)}(bias[row])`};`:""} + ${n} + ${c.setByIndices("vec3(coords)","value")} + } + } + `},hw=(e,t,n,r,i=!1,a)=>{let o=e[0].dims,l=e[1].dims,c=o.slice(0,-2),u=l.slice(0,-2),d=r?r.slice(0,-2):n.slice(0,-2),h=In.size(d),p=o[o.length-2],f=o[o.length-1],b=l[l.length-1],g=f%4===0&&b%4===0,y=p<=8?[4,1,1]:[4,4,1],w=[8,8,1],v=[Math.ceil(b/w[0]/y[0]),Math.ceil(p/w[1]/y[1]),Math.ceil(h/w[2]/y[2])],m=g?4:1,z=[...c,p,f/m],C=z.length,E=[...u,f,b/m],I=E.length,R=[h,p,b/m],A=[{type:6,data:p},{type:6,data:b},{type:6,data:f}];Yp(t,A),A.push(...Yr(d,z,E));let O=["rank","rank"],F=e.length>2;F&&(A.push(...Yr(e[2].dims)),O.push("rank")),A.push(...Yr(R));let L=X=>{let T=d.length,q=H4("batchDims",e[0].dataType,T,1),H=Za(e[0].dataType),J=Fn("a",e[0].dataType,C,m),Z=Fn("b",e[1].dataType,I,m),B=Dr("result",e[0].dataType,R.length,m),V=[J,Z];if(F){let M=i?m:1;V.push(Fn("bias",e[2].dataType,e[2].dims.length,M))}let N=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"}];Jp(t,N);let j=Za(B.type.tensor),k=Xp(t,B.type.value,j),W=d6(m,F,k,[q,J,Z,B],i);return` + ${X.registerUniforms(N).registerInternalVariables(q).declareVariables(...V,B)} + ${W} + ${g?J$(y,w,H,q):Z$(y,w,H,q)} + `};return{name:"MatMul",shaderCache:{hint:`${y};${t.activation};${g};${i}`,inputDependencies:O},getRunData:()=>({outputs:[{dims:a?a(n):n,dataType:e[0].dataType}],dispatchGroup:{x:v[0],y:v[1],z:v[2]},programUniforms:A}),getShaderSource:L}}}),h6,AB,Dde=ur(()=>{hs(),D0(),$s(),cf(),Y4(),Wde(),Q4(),h6=(e,t,n,r,i=!1,a,o=4,l=4,c=4,u="f32")=>{let d=A=>{switch(A){case 1:return"resData = x[xIndex];";case 3:return`resData = vec3<${u}>(x[xIndex], x[xIndex + 1], x[xIndex + 2]);`;case 4:return"resData = x[xIndex / 4];";default:throw new Error(`innerElementSize ${A} is not supported.`)}},h=A=>{switch(A){case 1:return"return w[row * i32(uniforms.w_shape[3]) + colIn];";case 4:return"return w[row * i32(uniforms.w_shape[3]) / 4 + colIn];";default:throw new Error(`innerElementSize ${A} is not supported.`)}},p=e?` + let coord = vec4(batch, xRow, xCol, xCh); + `:` + let coord = vec4(batch, xCh, xRow, xCol); + `,f=e?` + let coords = vec4( + batch, + row / outWidth, + row % outWidth, + col); + `:` + let coords = vec4( + batch, + row, + col / outWidth, + col % outWidth); + `,b=e?"i32(uniforms.x_shape[1])":"i32(uniforms.x_shape[2])",g=e?"i32(uniforms.x_shape[2])":"i32(uniforms.x_shape[3])",y=e?"row":"col",w=e?"col":"row",v=` + let inChannels = i32(uniforms.w_shape[2]); + let outWidth = ${e?"i32(uniforms.result_shape[2])":"i32(uniforms.result_shape[3])"}; + let outRow = ${y} / outWidth; + let outCol = ${y} % outWidth; + + let WRow = ${w} / (i32(uniforms.w_shape[1]) * inChannels); + let WCol = ${w} / inChannels % i32(uniforms.w_shape[1]); + let xRow = outRow * uniforms.stride[0] + uniforms.dilation[0] * WRow - uniforms.pad[0]; + let xCol = outCol * uniforms.stride[1] + uniforms.dilation[1] * WCol - uniforms.pad[1]; + let xCh = ${w} % inChannels; + var resData = ${ho(o,u)}(0.0); + // The bounds checking is always needed since we use it to pad zero for + // the 'same' padding type. + if (xRow >= 0 && xRow < ${b} && xCol >= 0 && xCol < ${g}) { + ${p} + let xIndex = getIndexFromCoords4D(coord, vec4(uniforms.x_shape)); + ${d(o)} + } + return resData;`,m=e?t&&r?` + let col = colIn * ${o}; + ${v}`:` + let col = colIn * ${o}; + if (row < uniforms.dim_a_outer && col < uniforms.dim_inner) { + ${v} + } + return ${ho(o,u)}(0.0);`:r&&n?` + let col = colIn * ${o}; + ${v}`:` + let col = colIn * ${o}; + if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) { + ${v} + } + return ${ho(o,u)}(0.0);`,z=e?r&&n?h(l):` + let col = colIn * ${l}; + if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) { + ${h(l)} + } + return ${ho(l,u)}(0.0);`:` + let col = colIn * ${l}; + if (row < uniforms.dim_inner && col < uniforms.dim_a_outer) { + ${h(l)} + } + return ${ho(l,u)}(0.0);`,C=ho(c,u),E=ho(e?o:l,u),I=ho(e?l:o,u),R=Xp(a,C,u);return` + fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${E} { + ${e?m:z} + } + + fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${I} { + ${e?z:m} + } + + fn mm_write(batch: i32, row : i32, colIn : i32, valueIn : ${C}) { + let col = colIn * ${c}; + if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) + { + var value = valueIn; + let outWidth = ${e?"i32(uniforms.result_shape[2])":"i32(uniforms.result_shape[3])"}; + ${f} + ${IB(i)} + ${R} + setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value); + } + }`},AB=(e,t,n,r,i,a,o,l,c)=>{let u=t.format==="NHWC",d=u?e[0].dims[3]:e[0].dims[1],h=n[0],p=u?n[2]:n[3],f=u?n[1]:n[2],b=u?n[3]:n[1],g=u&&(d%4===0||d%3===0)&&b%4===0,y=u?b:p*f,w=u?p*f:b,v=[8,8,1],m=r<=8?[4,1,1]:[4,4,1],z=[Math.ceil(y/v[0]/m[0]),Math.ceil(w/v[1]/m[1]),Math.ceil(h/v[2]/m[2])];Bs("verbose",()=>`[conv2d_mm_webgpu] dispatch = ${z}`);let C=g?u&&d%4!==0?3:4:1,E=v[1]*m[1],I=v[0]*m[0],R=Math.max(v[0]*C,v[1]),A=r%E===0,O=i%I===0,F=a%R===0,L=g?[C,4,4]:[1,1,1],X=[{type:6,data:r},{type:6,data:i},{type:6,data:a},{type:6,data:[t.pads[0],t.pads[1]]},{type:6,data:t.strides},{type:6,data:t.dilations}];Yp(t,X),X.push(...Yr(e[0].dims,e[1].dims));let T=["rank","rank"];o&&(X.push(...Yr(e[2].dims)),T.push("rank")),X.push(...Yr(n));let q=H=>{let J=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"},{name:"pad",type:"i32",length:2},{name:"stride",type:"i32",length:2},{name:"dilation",type:"i32",length:2}];Jp(t,J);let Z=g?4:1,B=Za(e[0].dataType),V=` + fn setOutputAtIndex(flatIndex : i32, value : ${g?`vec4<${B}>`:B}) { + result[flatIndex] = ${g?`vec4<${B}>`:B}(value); + } + fn setOutputAtCoords(d0 : i32, d1 : i32, d2 : i32, d3 : i32, value : ${g?`vec4<${B}>`:B}) { + let flatIndex = getOutputIndexFromCoords(vec4(d0, d1, d2, d3)); + setOutputAtIndex(flatIndex ${g?"/ 4":""}, value); + }`,N=Fn("x",e[0].dataType,e[0].dims.length,C===3?1:C),j=Fn("w",e[1].dataType,e[1].dims.length,Z),k=[N,j],W=Dr("result",e[0].dataType,n.length,Z);if(o){let M=Fn("bias",e[2].dataType,e[2].dims.length,Z);k.push(M),V+=` + fn getBiasByOutputCoords(coords : vec4) -> ${g?`vec4<${B}>`:B} { + return bias[coords.${u?"w":"y"}${g?"/ 4":""}]; + }`}return` + ${kB("uniforms.result_strides")} + //struct Uniforms { xShape : vec4, wShape : vec4, outShape : vec4, + // outShapeStrides: vec3, filterDims : vec2, pad : vec2, stride : vec2, + // dilation : vec2, dimAOuter : i32, dimBOuter : i32, dimInner : i32 }; + ${H.registerUniforms(J).declareVariables(...k,W)} + ${V} + ${h6(u,A,O,F,o,t,L[0],L[1],L[2],B)} + ${g?J$(m,v,B,void 0,!u,R):Z$(m,v,B,void 0,!u,R,!1,void 0,l)}`};return{name:"Conv2DMatMul",shaderCache:{hint:`${t.cacheKey};${C};${g};${A};${O};${F};${E};${I};${R}`,inputDependencies:T},getRunData:()=>({outputs:[{dims:c?c(n):n,dataType:e[0].dataType}],dispatchGroup:{x:z[0],y:z[1],z:z[2]},programUniforms:X}),getShaderSource:q}}}),p6,v3,Og,f6,w3,m6,MB,TB,Vde=ur(()=>{hs(),D0(),vs(),$s(),cf(),Y4(),p6=e=>{let t=1;for(let n=0;ntypeof e=="number"?[e,e,e]:e,Og=(e,t)=>t<=1?e:e+(e-1)*(t-1),f6=(e,t,n,r=1)=>{let i=Og(t,r);return Math.floor((e[0]*(n-1)-n+i)/2)},w3=(e,t,n,r,i)=>{i==null&&(i=f6(e,t[0],r[0]));let a=[0,0,0,n];for(let o=0;o<3;o++)e[o]+2*i>=t[o]&&(a[o]=Math.trunc((e[o]-t[o]+2*i)/r[o]+1));return a},m6=(e,t,n,r,i,a,o,l,c,u)=>{let d,h,p,f;if(e==="VALID"&&(e=0),typeof e=="number"){d={top:e,bottom:e,left:e,right:e,front:e,back:e};let b=w3([t,n,r,1],[l,c,u],1,[i,a,o],e);h=b[0],p=b[1],f=b[2]}else if(Array.isArray(e)){if(!e.every((g,y,w)=>g===w[0]))throw Error(`Unsupported padding parameter: ${e}`);d={top:e[0],bottom:e[1],left:e[2],right:e[3],front:e[4],back:e[5]};let b=w3([t,n,r,1],[l,c,u],1,[i,a,o],e[0]);h=b[0],p=b[1],f=b[2]}else if(e==="SAME_UPPER"){h=Math.ceil(t/i),p=Math.ceil(n/a),f=Math.ceil(r/o);let b=(h-1)*i+l-t,g=(p-1)*a+c-n,y=(f-1)*o+u-r,w=Math.floor(b/2),v=b-w,m=Math.floor(g/2),z=g-m,C=Math.floor(y/2),E=y-C;d={top:m,bottom:z,left:C,right:E,front:w,back:v}}else throw Error(`Unknown padding parameter: ${e}`);return{padInfo:d,outDepth:h,outHeight:p,outWidth:f}},MB=(e,t,n,r,i,a=!1,o="channelsLast")=>{let l,c,u,d,h;if(o==="channelsLast")[l,c,u,d,h]=e;else if(o==="channelsFirst")[l,h,c,u,d]=e;else throw new Error(`Unknown dataFormat ${o}`);let[p,,f,b,g]=t,[y,w,v]=v3(n),[m,z,C]=v3(r),E=Og(f,m),I=Og(b,z),R=Og(g,C),{padInfo:A,outDepth:O,outHeight:F,outWidth:L}=m6(i,c,u,d,y,w,v,E,I,R),X=a?p*h:p,T=[0,0,0,0,0];return o==="channelsFirst"?T=[l,X,O,F,L]:o==="channelsLast"&&(T=[l,O,F,L,X]),{batchSize:l,dataFormat:o,inDepth:c,inHeight:u,inWidth:d,inChannels:h,outDepth:O,outHeight:F,outWidth:L,outChannels:X,padInfo:A,strideDepth:y,strideHeight:w,strideWidth:v,filterDepth:f,filterHeight:b,filterWidth:g,effectiveFilterDepth:E,effectiveFilterHeight:I,effectiveFilterWidth:R,dilationDepth:m,dilationHeight:z,dilationWidth:C,inShape:e,outShape:T,filterShape:t}},TB=(e,t,n,r,i,a)=>{let o=a==="channelsLast";o?e[0].dims[3]:e[0].dims[1];let l=[64,1,1],c={x:n.map((y,w)=>w)},u=[Math.ceil(p6(c.x.map(y=>n[y]))/l[0]),1,1];Bs("verbose",()=>`[conv3d_naive_webgpu] dispatch = ${u}`);let d=1,h=In.size(n),p=[{type:12,data:h},{type:12,data:r},{type:12,data:i},{type:12,data:t.strides},{type:12,data:t.dilations}];Yp(t,p),p.push(...Yr(e[0].dims,e[1].dims));let f=["rank","rank"],b=e.length===3;b&&(p.push(...Yr(e[2].dims)),f.push("rank")),p.push(...Yr(n));let g=y=>{let w=[{name:"output_size",type:"u32"},{name:"filter_dims",type:"u32",length:r.length},{name:"pads",type:"u32",length:i.length},{name:"strides",type:"u32",length:t.strides.length},{name:"dilations",type:"u32",length:t.dilations.length}];Jp(t,w);let v=1,m=Za(e[0].dataType),z=Fn("x",e[0].dataType,e[0].dims.length,d),C=Fn("W",e[1].dataType,e[1].dims.length,v),E=[z,C],I=Dr("result",e[0].dataType,n.length,v),R="";if(b){let F=Fn("bias",e[2].dataType,e[2].dims.length,v);E.push(F),R+=` + fn getBiasByOutputCoords(coords : array) -> ${m} { + return bias[${o?Gr("coords",4,5):Gr("coords",1,5)}]; + }`}let A=ho(d,m),O=Xp(t,A,m);return` + ${R} + fn getX(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 { + let aIndices = array(d0, d1, d2, d3, d4); + return ${z.getByIndices("aIndices")}; + } + fn getW(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 { + let aIndices = array(d0, d1, d2, d3, d4); + return ${C.getByIndices("aIndices")}; + } + ${y.registerUniforms(w).declareVariables(...E,I)} + ${y.mainStart()} + ${y.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let coords = ${I.offsetToIndices("global_idx")}; + let batch = ${Gr("coords",0,z.rank)}; + let d2 = ${o?Gr("coords",z.rank-1,z.rank):Gr("coords",1,z.rank)}; + let xFRCCorner = vec3(${o?Gr("coords",1,z.rank):Gr("coords",2,z.rank)}, + ${o?Gr("coords",2,z.rank):Gr("coords",3,z.rank)}, + ${o?Gr("coords",3,z.rank):Gr("coords",4,z.rank)}) * uniforms.strides - uniforms.pads; + let xFCorner = xFRCCorner.x; + let xRCorner = xFRCCorner.y; + let xCCorner = xFRCCorner.z; + let xShapeY = ${o?Gr("uniforms.x_shape",1,z.rank):Gr("uniforms.x_shape",2,z.rank)}; + let xShapeZ = ${o?Gr("uniforms.x_shape",2,z.rank):Gr("uniforms.x_shape",3,z.rank)}; + let xShapeW = ${o?Gr("uniforms.x_shape",3,z.rank):Gr("uniforms.x_shape",4,z.rank)}; + let xShapeU = ${o?Gr("uniforms.x_shape",4,z.rank):Gr("uniforms.x_shape",1,z.rank)}; + let inputDepthNearestVec4 = (xShapeU / 4) * 4; + let inputDepthVec4Remainder = xShapeU % 4; + + var value = 0.0; + for (var wF = 0u; wF < uniforms.filter_dims[0]; wF++) { + let xF = xFCorner + wF * uniforms.dilations[0]; + if (xF < 0 || xF >= xShapeY) { + continue; + } + + for (var wR = 0u; wR < uniforms.filter_dims[1]; wR++) { + let xR = xRCorner + wR * uniforms.dilations[1]; + if (xR < 0 || xR >= xShapeZ) { + continue; + } + + for (var wC = 0u; wC < uniforms.filter_dims[2]; wC++) { + let xC = xCCorner + wC * uniforms.dilations[2]; + if (xC < 0 || xC >= xShapeW) { + continue; + } + + for (var d1 = 0u; d1 < inputDepthNearestVec4; d1 += 4) { + ${o?`let xValues = vec4( + getX(batch, xF, xR, xC, d1), + getX(batch, xF, xR, xC, d1 + 1), + getX(batch, xF, xR, xC, d1 + 2), + getX(batch, xF, xR, xC, d1 + 3)); + `:`let xValues = vec4( + getX(batch, d1, xF, xR, xC), + getX(batch, d1 + 1, xF, xR, xC), + getX(batch, d1 + 2, xF, xR, xC), + getX(batch, d1 + 3, xF, xR, xC)); + `} + let wValues = vec4( + getW(d2, d1, wF, wR, wC), + getW(d2, d1 + 1, wF, wR, wC), + getW(d2, d1 + 2, wF, wR, wC), + getW(d2, d1 + 3, wF, wR, wC)); + value += dot(xValues, wValues); + } + if (inputDepthVec4Remainder == 1) { + ${o?`value += getX(batch, xF, xR, xC, inputDepthNearestVec4) + * getW(d2, inputDepthNearestVec4, wF, wR, wC);`:`value += getX(batch, inputDepthNearestVec4, xF, xR, xC) + * getW(d2, inputDepthNearestVec4, wF, wR, wC);`} + } else if (inputDepthVec4Remainder == 2) { + ${o?`let xValues = vec2( + getX(batch, xF, xR, xC, inputDepthNearestVec4), + getX(batch, xF, xR, xC, inputDepthNearestVec4 + 1)); + `:`let xValues = vec2( + getX(batch, inputDepthNearestVec4, xF, xR, xC), + getX(batch, inputDepthNearestVec4 + 1, xF, xR, xC)); + `} + let wValues = vec2( + getW(d2, inputDepthNearestVec4, wF, wR, wC), + getW(d2, inputDepthNearestVec4 + 1, wF, wR, wC)); + value += dot(xValues, wValues); + } else if (inputDepthVec4Remainder == 3) { + ${o?`let xValues = vec3( + getX(batch, xF, xR, xC, inputDepthNearestVec4), + getX(batch, xF, xR, xC, inputDepthNearestVec4 + 1), + getX(batch, xF, xR, xC, inputDepthNearestVec4 + 2)); + `:`let xValues = vec3( + getX(batch, inputDepthNearestVec4, xF, xR, xC), + getX(batch, inputDepthNearestVec4 + 1, xF, xR, xC), + getX(batch, inputDepthNearestVec4 + 2, xF, xR, xC)); + `} + let wValues = vec3( + getW(d2, inputDepthNearestVec4, wF, wR, wC), + getW(d2, inputDepthNearestVec4 + 1, wF, wR, wC), + getW(d2, inputDepthNearestVec4 + 2, wF, wR, wC)); + value += dot(xValues, wValues); + } + } + } + } + ${b?"value = value + getBiasByOutputCoords(coords)":""}; + ${O} + result[global_idx] = f32(value); + }`};return{name:"Conv3DNaive",shaderCache:{hint:`${t.cacheKey};${o};${d};${b}`,inputDependencies:f},getRunData:()=>({outputs:[{dims:n,dataType:e[0].dataType}],dispatchGroup:{x:u[0],y:u[1],z:u[2]},programUniforms:p}),getShaderSource:g}}}),RB,PB,Hde=ur(()=>{hs(),vs(),$s(),cf(),RB=(e,t,n,r)=>{let i=e.length>2,a=i?"value += b[output_channel];":"",o=e[0].dims,l=e[1].dims,c=t.format==="NHWC",u=c?n[3]:n[1],d=u/t.group,h=c&&d>=4?Yi(u):1,p=In.size(n)/h,f=[{type:12,data:p},{type:12,data:t.dilations},{type:12,data:[t.strides[0],t.strides[1]]},{type:12,data:[t.pads[0],t.pads[1]]},{type:12,data:d}];Yp(t,f),f.push(...Yr(o,[l[0],l[1],l[2],l[3]/h]));let b=i?["rank","rank","rank"]:["rank","rank"];f.push(...Yr([n[0],n[1],n[2],n[3]/h]));let g=y=>{let w=Dr("output",e[0].dataType,n.length,h),v=Za(w.type.tensor),m=Xp(t,w.type.value,v),z=Fn("x",e[0].dataType,o.length),C=Fn("w",e[1].dataType,l.length,h),E=[z,C];i&&E.push(Fn("b",e[2].dataType,e[2].dims,h));let I=[{name:"output_size",type:"u32"},{name:"dilations",type:"u32",length:t.dilations.length},{name:"strides",type:"u32",length:2},{name:"pads",type:"u32",length:2},{name:"output_channels_per_group",type:"u32"}];Jp(t,I);let R=c?` + for (var wHeight: u32 = 0u; wHeight < uniforms.w_shape[0]; wHeight++) { + let xHeight = xRCCorner.x + wHeight * uniforms.dilations[0]; + + if (xHeight < 0u || xHeight >= uniforms.x_shape[1]) { + continue; + } + + for (var wWidth: u32 = 0u; wWidth < uniforms.w_shape[1]; wWidth++) { + let xWidth = xRCCorner.y + wWidth * uniforms.dilations[1]; + if (xWidth < 0u || xWidth >= uniforms.x_shape[2]) { + continue; + } + + for (var wInChannel: u32 = 0u; wInChannel < uniforms.w_shape[2]; wInChannel++) { + let input_channel = in_channel_offset + wInChannel; + let xVal = ${z.get("batch","xHeight","xWidth","input_channel")}; + let wVal = ${C.get("wHeight","wWidth","wInChannel","output_channel")}; + value += xVal * wVal; + } + } + } + `:` + for (var wInChannel: u32 = 0u; wInChannel < uniforms.w_shape[1]; wInChannel++) { + let input_channel = in_channel_offset + wInChannel; + for (var wHeight: u32 = 0u; wHeight < uniforms.w_shape[2]; wHeight++) { + let xHeight = xRCCorner.x + wHeight * uniforms.dilations[0]; + + if (xHeight < 0u || xHeight >= uniforms.x_shape[2]) { + continue; + } + + for (var wWidth: u32 = 0u; wWidth < uniforms.w_shape[3]; wWidth++) { + let xWidth = xRCCorner.y + wWidth * uniforms.dilations[1]; + if (xWidth < 0u || xWidth >= uniforms.x_shape[3]) { + continue; + } + + let xVal = ${z.get("batch","input_channel","xHeight","xWidth")}; + let wVal = ${C.get("output_channel","wInChannel","wHeight","wWidth")}; + value += xVal * wVal; + } + } + } + `;return` + ${y.registerUniforms(I).declareVariables(...E,w)} + + ${y.mainStart()} + ${y.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let outputIndices = ${w.offsetToIndices("global_idx")}; + let batch: u32 = outputIndices[0]; + let output_channel: u32 = outputIndices[${c?3:1}]; + let xRCCorner: vec2 = vec2(outputIndices[${c?1:2}], outputIndices[${c?2:3}]) * uniforms.strides - uniforms.pads; + let group_id: u32 = output_channel * ${h} / uniforms.output_channels_per_group; + var in_channel_offset = group_id * uniforms.w_shape[${c?2:1}]; + + var value: ${w.type.value} = ${w.type.value}(0); + ${R} + ${a} + ${m} + ${w.setByOffset("global_idx","value")} + }`};return{name:"GroupedConv",shaderCache:{hint:`${t.cacheKey}_${h}`,inputDependencies:b},getRunData:()=>({outputs:[{dims:r?r(n):n,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(p/64)},programUniforms:f}),getShaderSource:g}},PB=(e,t,n,r)=>{let i=e.length>2,a=Yi(n[3]),o=Yi(n[2]),l=In.size(n)/a/o,c=[e[0].dims[0],e[0].dims[1],e[0].dims[2],e[0].dims[3]/a],u=[e[1].dims[0],e[1].dims[1],e[1].dims[2],e[1].dims[3]/a],d=[n[0],n[1],n[2],n[3]/a],h=[{type:12,data:l},{type:6,data:[t.strides[0],t.strides[1]]},{type:6,data:[t.pads[0],t.pads[1]]}];Yp(t,h),h.push(...Yr(c,u,d));let p=(o-1)*t.strides[1]+u[1],f=b=>{let g=Dr("output",e[0].dataType,d.length,a),y=Za(g.type.tensor),w=Xp(t,g.type.value,y),v=Fn("x",e[0].dataType,c.length,a),m=Fn("w",e[1].dataType,u.length,a),z=[v,m];i&&z.push(Fn("b",e[2].dataType,e[2].dims,a));let C=i?"value += b[output_channel];":"",E=[{name:"output_size",type:"u32"},{name:"strides",type:"i32",length:2},{name:"pads",type:"i32",length:2}];return Jp(t,E),` + ${b.registerUniforms(E).declareVariables(...z,g)} + ${b.mainStart()} + ${b.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let width0 = uniforms.output_shape[3]; + let output_channel = global_idx % width0; + var index1 = global_idx / width0; + let width1 = uniforms.output_shape[2] / ${o}u; + let col = (index1 % width1) * ${o}u; + index1 = index1 / width1; + let row = index1 % uniforms.output_shape[1]; + let batch = index1 / uniforms.output_shape[1]; + + let x_corner = vec2(i32(row), i32(col)) * uniforms.strides - uniforms.pads; + + var x_vals: array<${v.type.value}, ${p}>; + var values: array<${g.type.value}, ${o}>; + let input_channel = output_channel; + // Use constant instead of uniform can give better performance for w's height/width. + for (var w_height: u32 = 0u; w_height < ${u[0]}; w_height++) { + let x_height = x_corner.x + i32(w_height); + if (x_height >= 0 && u32(x_height) < uniforms.x_shape[1]) { + for (var i = 0; i < ${p}; i++) { + let x_width = x_corner.y + i; + if (x_width >= 0 && u32(x_width) < uniforms.x_shape[2]) { + x_vals[i] = ${v.get("batch","u32(x_height)","u32(x_width)","input_channel")}; + } else { + x_vals[i] = ${v.type.value}(0); + } + } + for (var w_width: u32 = 0u; w_width < ${u[1]}; w_width++) { + let w_val = ${m.get("w_height","w_width","0","output_channel")}; + for (var i = 0u; i < ${o}u; i++) { + values[i] = fma(x_vals[i * u32(uniforms.strides[1]) + w_width], w_val, values[i]); + } + } + } + } + + for (var i = 0u; i < ${o}u; i++) { + var value = values[i]; + ${C} + ${w} + ${g.set("batch","row","col + i","output_channel","value")}; + } + }`};return{name:"GroupedConv-Vectorize",shaderCache:{hint:`${t.cacheKey};${a};${o};${p};${u[0]};${u[1]}`,inputDependencies:i?["rank","rank","type"]:["rank","rank"]},getRunData:()=>({outputs:[{dims:r?r(n):n,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(l/64)},programUniforms:h}),getShaderSource:f}}}),g6,Q1,x6,ey,Q$,_3,b6,y6,e5,Gde=ur(()=>{vs(),Dde(),Vde(),Q4(),Hde(),cf(),Z4(),Fh(),g6=(e,t,n,r,i,a)=>{let o=e[0],l=e.slice(a?1:2,a?3:4),c=l.length,u=t[0],d=t.slice(2).map((p,f)=>p+(p-1)*(n[f]-1)),h=l.map((p,f)=>p+r[f]+r[f+c]).map((p,f)=>Math.floor((p-d[f]+i[f])/i[f]));return h.splice(0,0,o),h.splice(a?3:1,0,u),h},Q1=[2,3,1,0],x6=(e,t)=>{if(!e||e.length!==2&&e.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(e[0].dims.length>5)throw new Error("greater than 5D is not supported");if(e[0].dims.length!==e[1].dims.length)throw new Error("filter does not have same dimension as input");let n=e[0].dims[t.format==="NHWC"?e[0].dims.length-1:1],r=e[1].dims[1]*t.group;if(n!==r)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");if(e.length===3&&(e[2].dims.length!==1||e[1].dims[0]!==e[2].dims[0]))throw new Error("invalid bias");let i=e[0].dims.length-2;if(t.dilations.length!==i)throw new Error(`dilations should be ${i}D`);if(t.strides.length!==i)throw new Error(`strides should be ${i}D`);if(t.pads.length!==i*2)throw new Error(`pads should be ${i*2}D`);if(t.kernelShape.length!==0&&t.kernelShape.length!==e[1].dims.length-2)throw new Error("invalid kernel shape")},ey=(e,t)=>{let n=e.kernelShape.slice();n.length{let t=X4(e),n=e.format,r=["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][e.auto_pad],i=e.dilations,a=e.group,o=e.kernel_shape,l=e.pads,c=e.strides,u=e.w_is_const();return{autoPad:r,format:n,dilations:i,group:a,kernelShape:o,pads:l,strides:c,wIsConst:u,...t,cacheKey:`${e.format};${t.activation};`}},_3=(e,t,n,r)=>{let i=n.format==="NHWC",a=g6(t[0].dims,t[1].dims,n.dilations,n.pads,n.strides,i);if(n.group!==1){let E=[t[0]];if(i){let I=e.kernelCustomData.wT??e.compute(Sc(t[1],Q1),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];n.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=I),E.push(I)}else E.push(t[1]);t.length===3&&E.push(t[2]),!e.adapterInfo.isArchitecture("ampere")&&i&&t[1].dims[0]===n.group&&t[1].dims[1]===1&&n.dilations[0]===1&&n.dilations[1]===1?e.compute(PB(E,n,a,r),{inputs:E}):e.compute(RB(E,n,a,r),{inputs:E});return}let o=t.length===3,l=t[0].dims[i?1:2],c=t[0].dims[i?2:3],u=t[0].dims[i?3:1],d=t[1].dims[2],h=t[1].dims[3],p=a[i?1:2],f=a[i?2:3],b=a[i?3:1],g=i&&d===l&&h===c&&n.pads[0]===0&&n.pads[1]===0;if(g||d===1&&h===1&&n.dilations[0]===1&&n.dilations[1]===1&&n.strides[0]===1&&n.strides[1]===1&&n.pads[0]===0&&n.pads[1]===0){let E=a[0],I,R,A,O=[];if(i){let X=e.kernelCustomData.wT??e.compute(Sc(t[1],Q1),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];if(n.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=X),g){let T=l*c*u;I=t[0].reshape([1,E,T]),R=X.reshape([1,T,b]),A=[1,E,b]}else I=t[0].reshape([E,l*c,u]),R=X.reshape([1,u,b]),A=[E,p*f,b];O.push(I),O.push(R)}else I=t[0].reshape([E,u,l*c]),R=t[1].reshape([1,b,u]),A=[E,b,p*f],O.push(R),O.push(I);o&&O.push(t[2]);let F=A[2],L=O[0].dims[O[0].dims.length-1];F<8&&L<8?e.compute(J4(O,n,a,A,i,r),{inputs:O}):e.compute(hw(O,n,a,A,i,r),{inputs:O});return}let y=!0,w=e.kernelCustomData.wT??e.compute(Sc(t[1],Q1),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];n.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=w);let v=[t[0],w];o&&v.push(t[2]);let m=i?p*f:b,z=i?b:p*f,C=d*h*u;e.compute(AB(v,n,a,m,z,C,o,y,r),{inputs:v})},b6=(e,t)=>{let n=t.format==="NHWC",r=[e.inputs[0].reshape(n?[e.inputs[0].dims[0],1,e.inputs[0].dims[1],e.inputs[0].dims[2]]:[e.inputs[0].dims[0],e.inputs[0].dims[1],1,e.inputs[0].dims[2]]),e.inputs[1].reshape([e.inputs[1].dims[0],e.inputs[1].dims[1],1,e.inputs[1].dims[2]])];e.inputs.length===3&&r.push(e.inputs[2]);let i=[0,t.pads[0],0,t.pads[1]],a=[1].concat(t.strides),o=[1].concat(t.dilations),l=[1].concat(t.kernelShape),c=ey({...t,pads:i,strides:a,dilations:o,kernelShape:l},r);_3(e,r,c,u=>n?[u[0],u[2],u[3]]:[u[0],u[1],u[3]])},y6=(e,t,n)=>{let r=n.format==="NHWC"?"channelsLast":"channelsFirst",i=ey(n,t),a=n.autoPad==="NOTSET"?n.pads:n.autoPad,o=MB(t[0].dims,t[1].dims,n.strides,n.dilations,a,!1,r);e.compute(TB(t,i,o.outShape,[o.filterDepth,o.filterHeight,o.filterWidth],[o.padInfo.front,o.padInfo.top,o.padInfo.left],r))},e5=(e,t)=>{if(x6(e.inputs,t),e.inputs[0].dims.length===3)b6(e,t);else if(e.inputs[0].dims.length===5)y6(e,e.inputs,t);else{let n=ey(t,e.inputs);_3(e,e.inputs,n)}}}),OB,qde=ur(()=>{hs(),D0(),vs(),$s(),OB=(e,t,n)=>{let r=e.length>2,i=t.outputShape,a=t.format==="NHWC",o=t.group,l=e[1].dims,c=l[2]/o,u=l[3],d=a?Yi(c):1,h=a?Yi(u):1,p=a?u===1?d:h:1,f=In.size(i)/h,b=[Math.ceil(f/64),1,1];Bs("verbose",()=>`[conv2d_backprop_webgpu] dispatch = ${b}`);let g=["rank","rank"],y=[t.strides[0],t.strides[1]],w=[t.kernelShape[a?1:2],t.kernelShape[a?2:3]],v=[t.dilations[0],t.dilations[1]],m=[w[0]+(t.dilations[0]<=1?0:(t.kernelShape[a?1:2]-1)*(t.dilations[0]-1)),w[1]+(t.dilations[1]<=1?0:(t.kernelShape[a?2:3]-1)*(t.dilations[1]-1))],z=[m[0]-1-Math.floor((t.pads[0]+t.pads[2])/2),m[1]-1-Math.floor((t.pads[1]+t.pads[3])/2)],C=[{type:12,data:f},{type:12,data:y},{type:12,data:w},{type:12,data:v},{type:12,data:m},{type:6,data:z},{type:12,data:c},{type:12,data:u},...Yr(e[0].dims,e[1].dims)];r&&(C.push(...Yr(e[2].dims)),g.push("rank")),C.push(...Yr(i));let E=I=>{let R=[{name:"output_size",type:"u32"},{name:"strides",type:"u32",length:y.length},{name:"filter_dims",type:"u32",length:w.length},{name:"dilations",type:"u32",length:w.length},{name:"effective_filter_dims",type:"u32",length:m.length},{name:"pads",type:"i32",length:z.length},{name:"input_channels_per_group",type:"u32"},{name:"output_channels_per_group",type:"u32"}],A=Za(e[0].dataType),O=a?1:2,F=a?2:3,L=a?3:1,X=Fn("W",e[1].dataType,e[1].dims.length,p),T=Fn("Dy",e[0].dataType,e[0].dims.length,d),q=[T,X];r&&q.push(Fn("bias",e[2].dataType,[i[L]].length,h));let H=Dr("result",e[0].dataType,i.length,h),J=()=>{let B="";if(d===1)B+=` + let w_offset = ${X.indicesToOffset(`${X.type.indices}(u32(wRPerm), u32(wCPerm), inputChannel, wOutChannel)`)}; + let wValue = ${X.getByOffset(`w_offset / ${p}`)}; + dotProd = dotProd + xValue * wValue;`;else if(u===1)B+=` + let wValue = ${X.getByOffset(`${X.indicesToOffset(`${X.type.indices}(u32(wRPerm), u32(wCPerm), inputChannel, wOutChannel)`)} / ${p}`)}; + dotProd = dotProd + dot(xValue, wValue);`;else for(let V=0;V(i32(r), i32(c)) - uniforms.pads; + let dyRCorner = dyCorner.x; + let dyCCorner = dyCorner.y; + let groupId = d1 / uniforms.output_channels_per_group; + let wOutChannel = d1 - groupId * uniforms.output_channels_per_group; + // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1). + // ? = to be determined. : = across all values in that axis. + var dotProd = ${H.type.value}(0.0); + var wR: u32 = 0; + if (uniforms.dilations.x == 1) { + // Minimum wR >= 0 that satisfies (dyRCorner + wR) % (uniforms.strides.x) == 0 + wR = u32(((dyRCorner + i32(uniforms.strides.x) - 1) / i32(uniforms.strides.x)) * i32(uniforms.strides.x) - dyRCorner); + } + for (; wR < uniforms.effective_filter_dims.x; wR = wR + 1) { + if (wR % uniforms.dilations.x != 0) { + continue; + } + let dyR = (${A}(dyRCorner) + ${A}(wR)) / ${A}(uniforms.strides[0]); + let wRPerm = uniforms.filter_dims.x - 1 - wR / uniforms.dilations.x; + if (dyR < 0.0 || dyR >= ${A}(uniforms.Dy_shape[${O}]) || fract(dyR) > 0.0 || + wRPerm < 0) { + continue; + } + let idyR: u32 = u32(dyR); + var wC: u32 = 0; + if (uniforms.dilations.y == 1) { + // Minimum wC >= 0 that satisfies (dyCCorner + wC) % (uniforms.strides.y) == 0 + wC = u32(((dyCCorner + i32(uniforms.strides.y) - 1) / i32(uniforms.strides.y)) * i32(uniforms.strides.y) - dyCCorner); + } + + for (; wC < uniforms.effective_filter_dims.y; wC = wC + 1) { + if (wC % uniforms.dilations.y != 0) { + continue; + } + let dyC = (${A}(dyCCorner) + ${A}(wC)) / ${A}(uniforms.strides.y); + let wCPerm = uniforms.filter_dims.y - 1 - wC / uniforms.dilations.y; + if (dyC < 0.0 || dyC >= ${A}(uniforms.Dy_shape[${F}]) || + fract(dyC) > 0.0 || wCPerm < 0) { + continue; + } + let idyC: u32 = u32(dyC); + var inputChannel = groupId * uniforms.input_channels_per_group; + for (var d2: u32 = 0; d2 < uniforms.input_channels_per_group; d2 = d2 + ${d}) { + let xValue = ${a?T.getByOffset(`${T.indicesToOffset(`${T.type.indices}(batch, idyR, idyC, inputChannel)`)} / ${d}`):T.get("batch","inputChannel","idyR","idyC")}; + ${J()} + inputChannel = inputChannel + ${d}; + } + wC = wC + uniforms.strides.y - 1; + } + wR = wR + uniforms.strides[0] - 1; + } + let value = dotProd${r?` + bias[d1 / ${h}]`:""}; + ${H.setByOffset("global_idx","value")}; + `;return` + ${I.registerUniforms(R).declareVariables(...q,H)} + ${I.mainStart()} + ${I.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")}; + ${Z}}`};return{name:"ConvTranspose2D",shaderCache:{hint:`${t.cacheKey};${d}${p}${h}${u===1}`,inputDependencies:g},getRunData:()=>({dispatchGroup:{x:b[0],y:b[1],z:b[2]},outputs:[{dims:n?n(i):i,dataType:e[0].dataType}],programUniforms:C}),getShaderSource:E}}}),v6,w6,_6,z3,LB,z6,$3,$6,BB,Kde=ur(()=>{qde(),cf(),Fh(),v6=(e,t,n,r,i,a)=>(e-1)*t+n+(r-1)*i+1-a,w6=(e,t,n,r,i)=>{let a=Math.floor(e/2);t==="SAME_UPPER"?(n[r]=a,n[i]=e-a):t==="SAME_LOWER"&&(n[r]=e-a,n[i]=a)},_6=(e,t,n,r,i,a,o,l,c,u)=>{let d=e.length-2,h=u.length===0;c.length{let n=e.kernelShape.slice();if(e.kernelShape.length===0||e.kernelShape.reduce((h,p)=>h*p,1)===0){n.length=0;for(let h=2;hh+p,0)===0){let h=t[0].dims.length-2;c=new Array(h).fill(1)}let u=e.strides.slice();if(u.reduce((h,p)=>h+p,0)===0){let h=t[0].dims.length-2;u=new Array(h).fill(1)}_6(l,n,c,e.autoPad,e.group,i,u,r,o,a);let d=Object.assign({},e);return Object.assign(d,{kernelShape:n,pads:i,outputPadding:o,outputShape:a,dilations:c,strides:u}),d},LB=e=>{let t=X4(e),n=e.format,r=["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][typeof e.autoPad>"u"?0:e.autoPad],i=e.dilations,a=e.group,o=e.kernelShape,l=e.pads,c=e.strides,u=e.wIsConst(),d=e.outputPadding,h=e.outputShape;return{autoPad:r,format:n,dilations:i,group:a,kernelShape:o,outputPadding:d,outputShape:h,pads:l,strides:c,wIsConst:u,...t,cacheKey:`${e.format};${t.activation};`}},z6=(e,t)=>{if(!e||e.length!==2&&e.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(e[0].dims.length!==4&&e[0].dims.length!==3)throw new Error("currently only support 2-dimensional conv");if(e[0].dims.length!==e[1].dims.length)throw new Error("filter does not have same dimension as input");let n=e[0].dims[t.format==="NHWC"?e[0].dims.length-1:1],r=e[1].dims[0];if(n!==r)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");let i=e[1].dims[1]*t.group;if(e.length===3&&(e[2].dims.length!==1||e[2].dims[0]!==i))throw new Error("invalid bias");let a=e[0].dims.length-2;if(t.dilations.reduce((o,l)=>o+l,0)>0&&t.dilations.length!==a)throw new Error(`dilations should be ${a}D`);if(t.strides.reduce((o,l)=>o+l,0)>0&&t.strides.length!==a)throw new Error(`strides should be ${a}D`);if(t.pads.reduce((o,l)=>o+l,0)>0&&t.pads.length!==a*2)throw new Error(`pads should be ${a*2}D`);if(t.outputPadding.length!==a&&t.outputPadding.length!==0)throw new Error(`output_padding should be ${a}D`);if(t.kernelShape.reduce((o,l)=>o+l,0)>0&&t.kernelShape.length!==0&&t.kernelShape.length!==e[1].dims.length-2)throw new Error("invalid kernel shape");if(t.outputShape.length!==0&&t.outputShape.length!==e[0].dims.length-2)throw new Error("invalid output shape")},$3=(e,t,n,r)=>{let i=e.kernelCustomData.wT??e.compute(Sc(t[1],[2,3,0,1]),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];n.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=i);let a=[t[0],i];t.length===3&&a.push(t[2]),e.compute(OB(a,n,r),{inputs:a})},$6=(e,t)=>{let n=t.format==="NHWC",r=[e.inputs[0].reshape(n?[e.inputs[0].dims[0],1,e.inputs[0].dims[1],e.inputs[0].dims[2]]:[e.inputs[0].dims[0],e.inputs[0].dims[1],1,e.inputs[0].dims[2]]),e.inputs[1].reshape([e.inputs[1].dims[0],e.inputs[1].dims[1],1,e.inputs[1].dims[2]])];e.inputs.length===3&&r.push(e.inputs[2]);let i=t.kernelShape;(i.length===0||i[0]===0)&&(i=[e.inputs[1].dims[2]]);let a=t.dilations;(a.length===0||a[0]===0)&&(a=[1]);let o=t.strides;(o.length===0||o[0]===0)&&(o=[1]);let l=t.pads;l.length===0&&(l=[0,0]),l=[0,l[0],0,l[1]],o=[1].concat(o),a=[1].concat(a),i=[1].concat(i);let c=t.outputPadding;c=[0].concat(c);let u=z3({...t,pads:l,strides:o,dilations:a,kernelShape:i,outputPadding:c},r);$3(e,r,u,d=>n?[d[0],d[2],d[3]]:[d[0],d[1],d[3]])},BB=(e,t)=>{if(z6(e.inputs,t),e.inputs[0].dims.length===3)$6(e,t);else{let n=z3(t,e.inputs);$3(e,e.inputs,n)}}}),S6,UB,FB,Xde=ur(()=>{hs(),vs(),oa(),$s(),S6=(e,t,n,r)=>{let i=In.size(t),a=t.length,o=Fn("input",e,a),l=Dr("output",e,a),c=n.dataType===6?n.getInt32Array()[0]:Number(n.getBigInt64Array()[0]),u=In.normalizeAxis(c,a),d=h=>{let p=` i32(${o.indicesGet("inputIndices","uniforms.axis")}) `,f=Gr("uniforms.input_shape","uniforms.axis",a),b=r.reverse?p+(r.exclusive?" + 1":""):"0",g=r.reverse?f:p+(r.exclusive?"":" + 1");return` + ${h.registerUniform("outputSize","u32").registerUniform("axis","u32").declareVariables(o,l)} + ${h.mainStart()} + ${h.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + var inputIndices = ${l.offsetToIndices("global_idx")}; + var sum = ${l.type.value}(0); + let first : i32 = ${b}; + let last : i32 = ${g}; + for (var i : i32 = first; i < last; i++) { + ${o.indicesSet("inputIndices","uniforms.axis","u32(i)")}; + sum = sum + ${o.getByIndices("inputIndices")}; + } + ${l.setByOffset("global_idx","sum")}; + }`};return{name:"CumSum",shaderCache:{hint:r.cacheKey,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:t,dataType:e}],dispatchGroup:{x:Math.ceil(i/64)},programUniforms:[{type:12,data:i},{type:12,data:u},...Yr(t,t)]}),getShaderSource:d}},UB=(e,t)=>{let n=e.inputs[0].dims,r=e.inputs[0].dataType,i=e.inputs[1];e.compute(S6(r,n,i,t),{inputs:[0]})},FB=e=>{let t=e.exclusive===1,n=e.reverse===1;return pi({exclusive:t,reverse:n})}}),j6,C6,N6,WB,DB,Yde=ur(()=>{hs(),vs(),oa(),$s(),j6=e=>{if(!e||e.length!==1)throw new Error("DepthToSpace requires 1 input.");if(e[0].dims.length!==4)throw new Error("DepthToSpace requires 4D input.")},C6=(e,t,n,r)=>{let i=[];i.push(`fn perm(i: ${r.type.indices}) -> ${n.type.indices} { + var a: ${n.type.indices};`);for(let a=0;a{let n,r,i,a,o,l,c=t.format==="NHWC",u=t.blocksize,d=t.mode==="DCR";c?([n,r,i,a]=e.dims,o=d?[n,r,i,u,u,a/u**2]:[n,r,i,a/u**2,u,u],l=d?[0,1,3,2,4,5]:[0,1,4,2,5,3]):([n,r,i,a]=[e.dims[0],e.dims[2],e.dims[3],e.dims[1]],o=d?[n,u,u,a/u**2,r,i]:[n,a/u**2,u,u,r,i],l=d?[0,3,4,1,5,2]:[0,1,4,2,5,3]);let h=e.reshape(o),p=h.dims.length,f=e.dataType,b=Fn("a",f,p),g=Dr("output",f,p),y=w=>` + ${w.registerUniform("output_size","u32").declareVariables(b,g)} + + ${C6(l,p,b,g)} + + ${w.mainStart()} + ${w.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let indices = ${g.offsetToIndices("global_idx")}; + let aIndices = perm(indices); + + ${g.setByOffset("global_idx",b.getByIndices("aIndices"))} + }`;return{name:"DepthToSpace",shaderCache:{hint:`${e.dims};${t.blocksize};${t.mode}`,inputDependencies:["rank"]},getRunData:w=>{let v=c?[n,r*u,i*u,a/u**2]:[n,a/u**2,r*u,i*u],m=In.size(v),z=h.dims,C=In.sortBasedOnPerm(z,l);return{outputs:[{dims:v,dataType:w[0].dataType}],dispatchGroup:{x:Math.ceil(m/64)},programUniforms:[{type:12,data:m},...Yr(z,C)]}},getShaderSource:y}},WB=(e,t)=>{j6(e.inputs),e.compute(N6(e.inputs[0],t))},DB=e=>pi({blocksize:e.blocksize,mode:e.mode,format:e.format})}),ty,Lg,S3,E6,I6,k6,A6,j3,M6,VB,HB,Jde=ur(()=>{hs(),vs(),oa(),$s(),ty="[a-zA-Z]|\\.\\.\\.",Lg="("+ty+")+",S3="^"+Lg+"$",E6="("+Lg+",)*"+Lg,I6="^"+E6+"$",k6=class{constructor(e=-1){this.symbolToIndices=new Map,this.inputIndex=e}addSymbol(e,t){let n=this.symbolToIndices.get(e);n===void 0?n=[t]:n.push(t),this.symbolToIndices.set(e,n)}},A6=class{constructor(e,t){var i;this.equation=t,this.hasEllipsis=!1,this.symbolToInfo=new Map,this.lhs=new Array,this.outputDims=[];let[n,r]=t.includes("->")?t.split("->",2):[t,""];if(!n.match(RegExp(I6)))throw new Error("Invalid LHS term");if(n.split(",").forEach((a,o)=>{let l=e[o].dims.slice();if(!a.match(RegExp(S3)))throw new Error("Invalid LHS term");let c=this.processTerm(a,!0,l,o);this.lhs.push(c)}),r==="")r+=[...this.symbolToInfo.entries()].filter(([a,o])=>o.count===1||a==="...").map(([a])=>a).join("");else if(!r.match(RegExp(Lg)))throw new Error("Invalid RHS");(i=r.match(RegExp(ty,"g")))==null||i.forEach(a=>{if(a==="...")this.outputDims=this.outputDims.concat(this.ellipsisDims);else{let o=this.symbolToInfo.get(a);if(o===void 0)throw new Error("Invalid RHS symbol");this.outputDims.push(o.dimValue)}}),this.rhs=this.processTerm(r,!1,this.outputDims)}addSymbol(e,t,n){let r=this.symbolToInfo.get(e);if(r!==void 0){if(r.dimValue!==t&&r.count!==1)throw new Error("Dimension mismatch");r.count++,r.inputIndices.push(n)}else r={count:1,dimValue:t,inputIndices:[n]};this.symbolToInfo.set(e,r)}processTerm(e,t,n,r=-1){let i=n.length,a=!1,o=[],l=0;if(!e.match(RegExp(S3))&&!t&&e!=="")throw new Error("Invalid LHS term");let c=e.match(RegExp(ty,"g")),u=new k6(r);return c==null||c.forEach((d,h)=>{if(d==="..."){if(a)throw new Error("Only one ellipsis is allowed per input term");a=!0;let p=i-c.length+1;if(p<0)throw new Error("Ellipsis out of bounds");if(o=n.slice(l,l+p),this.hasEllipsis){if(this.ellipsisDims.length!==o.length||this.ellipsisDims.toString()!==o.toString())throw new Error("Ellipsis dimensions mismatch")}else if(t)this.hasEllipsis=!0,this.ellipsisDims=o;else throw new Error("Ellipsis must be specified in the LHS");for(let f=0;fe+"_max",M6=(e,t,n,r)=>{let i=e.map(u=>u.length).map((u,d)=>Fn(`input${d}`,t,u)),a=In.size(r),o=Dr("output",t,r.length),l=[...n.symbolToInfo.keys()].filter(u=>!n.rhs.symbolToIndices.has(u)),c=u=>{let d=[],h="var prod = 1.0;",p="var sum = 0.0;",f="sum += prod;",b=[],g=[],y=[],w=[],v=n.symbolToInfo.size===n.rhs.symbolToIndices.size;n.symbolToInfo.forEach((z,C)=>{var E;if(n.rhs.symbolToIndices.has(C)){let I=(E=n.rhs.symbolToIndices.get(C))==null?void 0:E[0];I!==void 0&&n.lhs.forEach((R,A)=>{if(z.inputIndices.includes(A)){let O=R.symbolToIndices.get(C);if(O===void 0)throw new Error("Invalid symbol error");O.forEach(F=>{d.push(`${i[A].indicesSet(`input${A}Indices`,F,o.indicesGet("outputIndices",I))}`)})}})}else n.lhs.forEach((I,R)=>{if(z.inputIndices.includes(R)){let A=I.symbolToIndices.get(C);if(A===void 0)throw new Error("Invalid symbol error");A.forEach(O=>{b.push(`${i[R].indicesSet(`input${R}Indices`,O,`${C}`)}`)}),w.push(`prod *= ${i[R].getByIndices(`input${R}Indices`)};`)}}),g.push(`for(var ${C}: u32 = 0; ${C} < uniforms.${j3(C)}; ${C}++) {`),y.push("}")});let m=v?[...d,`let sum = ${i.map((z,C)=>z.getByIndices(`input${C}Indices`)).join(" * ")};`]:[...d,p,...g,...b,h,...w,f,...y];return` + ${u.registerUniforms(l.map(z=>({name:`${j3(z)}`,type:"u32"}))).registerUniform("outputSize","u32").declareVariables(...i,o)} + + ${u.mainStart()} + ${u.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + var outputIndices = ${o.offsetToIndices("global_idx")}; + ${i.map((z,C)=>`var input${C}Indices: ${i[C].type.indices};`).join(` +`)} + ${m.join(` +`)}; + ${o.setByOffset("global_idx","sum")}; + }`};return{name:"Einsum",shaderCache:{hint:n.equation,inputDependencies:e.map(()=>"rank")},getRunData:()=>{let u=l.filter(h=>n.symbolToInfo.has(h)).map(h=>{var p;return{type:12,data:((p=n.symbolToInfo.get(h))==null?void 0:p.dimValue)||0}});u.push({type:12,data:a});let d=e.map((h,p)=>[...Yr(h)]).reduce((h,p)=>h.concat(p),u);return d.push(...Yr(r)),{outputs:[{dims:r,dataType:t}],dispatchGroup:{x:Math.ceil(a/64)},programUniforms:d}},getShaderSource:c}},VB=(e,t)=>{let n=new A6(e.inputs,t.equation),r=n.outputDims,i=e.inputs.map((a,o)=>a.dims);e.compute(M6(i,e.inputs[0].dataType,n,r))},HB=e=>{let t=e.equation.replace(/\s+/g,"");return pi({equation:t})}}),T6,C3,R6,P6,GB,Zde=ur(()=>{hs(),vs(),$s(),T6=e=>{if(!e||e.length!==2)throw new Error("Expand requires 2 input.");let t=e[0].dims,n=Array.from(e[1].getBigInt64Array(),Number),r=n.length{let n=e.length-t.length,r=[];for(let i=0;ie.length>t.length?C3(e,t):C3(t,e),P6=e=>{let t=e[0].dims,n=Array.from(e[1].getBigInt64Array(),Number),r=R6(t,n),i=e[0].dataType,a=i===9||In.size(t)===1,o=i===9||t.length>0&&t[t.length-1]%4===0?4:1,l=a||r.length>0&&r[r.length-1]%4===0?4:1,c=Math.ceil(In.size(r)/l),u=h=>{let p=Fn("input",i,t.length,o),f=Dr("output",i,r.length,l),b;if(i===9){let g=(y,w,v="")=>` + let outputIndices${w} = ${f.offsetToIndices(`outputOffset + ${w}u`)}; + let offset${w} = ${p.broadcastedIndicesToOffset(`outputIndices${w}`,f)}; + let index${w} = offset${w} / 4u; + let component${w} = offset${w} % 4u; + ${y}[${w}] = ${v}(${p.getByOffset(`index${w}`)}[component${w}]); + `;b=` + let outputOffset = global_idx * ${l}; + var data = vec4(0); + ${g("data",0,"u32")} + ${g("data",1,"u32")} + ${g("data",2,"u32")} + ${g("data",3,"u32")} + ${f.setByOffset("global_idx","data")} + }`}else b=` + let outputIndices = ${f.offsetToIndices(`global_idx * ${l}`)}; + let inputOffset = ${p.broadcastedIndicesToOffset("outputIndices",f)}; + let data = ${f.type.value}(${p.getByOffset(`inputOffset / ${o}`)}); + ${f.setByOffset("global_idx","data")} + }`;return` + ${h.registerUniform("vec_size","u32").declareVariables(p,f)} + ${h.mainStart()} + ${h.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + ${b}`},d=[{type:12,data:c},...Yr(t,r)];return{name:"Expand",shaderCache:{hint:`${r.length};${o}${l}`,inputDependencies:["rank"]},getShaderSource:u,getRunData:()=>({outputs:[{dims:r,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(c/64)},programUniforms:d})}},GB=e=>{T6(e.inputs),e.compute(P6(e.inputs),{inputs:[0]})}}),O6,qB,Qde=ur(()=>{hs(),vs(),$s(),K4(),O6=e=>{let t=e[0].dataType,n=In.size(e[0].dims),r=In.size(e[1].dims),i=r%4===0,a=o=>{let l=Fn("x",t,[1],4),c=Fn("bias",t,[1],4),u=Dr("y",t,[1],4),d=[{name:"output_vec_size",type:"u32"},{name:"bias_size",type:"u32"}],h=f=>` + let bias${f}_offset: u32 = (global_idx * 4 + ${f}) % uniforms.bias_size; + let bias${f} = ${c.getByOffset(`bias${f}_offset / 4`)}[bias${f}_offset % 4];`,p=i?` + let bias = ${c.getByOffset("global_idx % (uniforms.bias_size / 4)")};`:`${h(0)}${h(1)}${h(2)}${h(3)} + let bias = ${l.type.value}(bias0, bias1, bias2, bias3);`;return`${o.registerUniforms(d).declareVariables(l,c,u)} + + ${X$(Bo(t))} + + ${o.mainStart(Em)} + ${o.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_vec_size")} + + let x = ${l.getByOffset("global_idx")}; + ${p} + let x_in = x + bias; + ${u.setByOffset("global_idx",Y$("x_in"))} + }`};return{name:"FastGeluWithBias",shaderCache:{hint:`${i}`,inputDependencies:["type","type"]},getShaderSource:a,getRunData:o=>({outputs:[{dims:o[0].dims,dataType:o[0].dataType}],programUniforms:[{type:12,data:Math.ceil(n/4)},{type:12,data:r}],dispatchGroup:{x:Math.ceil(n/Em/4)}})}},qB=e=>{e.inputs.length<2||In.size(e.inputs[1].dims)===0?pB(e):e.compute(O6(e.inputs))}}),L6,B6,KB,XB,e0e=ur(()=>{hs(),vs(),oa(),$s(),L6=e=>{if(!e||e.length!==2)throw new Error("Gather requires 2 inputs.")},B6=(e,t)=>{let n=e[0].dims,r=e[1].dims,i=n.length,a=In.normalizeAxis(t.axis,i),o=n.slice(0);o.splice(a,1,...r);let l=n[a],c=e[0].dataType===9?4:1,u=Math.ceil(In.size(o)/c),d=[{type:12,data:u},{type:6,data:l},{type:12,data:a},...Yr(e[0].dims,e[1].dims,o)],h=p=>{let f=Fn("data",e[0].dataType,e[0].dims.length,c),b=Fn("inputIndices",e[1].dataType,e[1].dims.length),g=Dr("output",e[0].dataType,o.length,c),y=v=>{let m=r.length,z=`var indicesIndices${v} = ${b.type.indices}(0);`;for(let C=0;C1?`indicesIndices${v}[${C}]`:`indicesIndices${v}`} = ${o.length>1?`outputIndices${v}[uniforms.axis + ${C}]`:`outputIndices${v}`};`;z+=` + var idx${v} = ${b.getByIndices(`indicesIndices${v}`)}; + if (idx${v} < 0) { + idx${v} = idx${v} + uniforms.axisDimLimit; + } + var dataIndices${v} : ${f.type.indices}; + `;for(let C=0,E=0;C1?`dataIndices${v}[${C}]`:`dataIndices${v}`} = u32(idx${v});`,E+=m):(z+=`${i>1?`dataIndices${v}[${C}]`:`dataIndices${v}`} = ${o.length>1?`outputIndices${v}[${E}]`:`outputIndices${v}`};`,E++);return z},w;if(e[0].dataType===9){let v=(m,z,C="")=>` + let outputIndices${z} = ${g.offsetToIndices(`outputOffset + ${z}u`)}; + ${y(z)}; + let offset${z} = ${f.indicesToOffset(`dataIndices${z}`)}; + let index${z} = offset${z} / 4u; + let component${z} = offset${z} % 4u; + ${m}[${z}] = ${C}(${f.getByOffset(`index${z}`)}[component${z}]); + `;w=` + let outputOffset = global_idx * ${c}; + var value = vec4(0); + ${v("value",0,"u32")} + ${v("value",1,"u32")} + ${v("value",2,"u32")} + ${v("value",3,"u32")} + ${g.setByOffset("global_idx","value")} + `}else w=` + let outputIndices = ${g.offsetToIndices("global_idx")}; + ${y("")}; + let value = ${f.getByIndices("dataIndices")}; + ${g.setByOffset("global_idx","value")}; + `;return` + ${p.registerUniform("outputSize","u32").registerUniform("axisDimLimit","i32").registerUniform("axis","u32").declareVariables(f,b,g)} + ${p.mainStart()} + ${p.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + ${w} + }`};return{name:"Gather",shaderCache:{hint:t.cacheKey,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:o,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(u/64)},programUniforms:d}),getShaderSource:h}},KB=e=>pi({axis:e.axis}),XB=(e,t)=>{let n=e.inputs;L6(n),e.compute(B6(e.inputs,t))}}),U6,YB,JB,t0e=ur(()=>{hs(),vs(),$s(),U6=(e,t,n,r,i,a,o,l,c)=>{let u=[{type:12,data:a},{type:12,data:r},{type:12,data:i},{type:12,data:n},{type:12,data:o},{type:12,data:l},{type:12,data:c}],d=[a];u.push(...Yr(t.dims,d));let h=p=>{let f=Fn("indices_data",t.dataType,t.dims.length),b=Dr("input_slice_offsets_data",12,1,1),g=[f,b],y=[{name:"output_size",type:"u32"},{name:"batch_dims",type:"u32"},{name:"input_dims",type:"u32",length:i.length},{name:"sizes_from_slice_dims_data",type:"u32",length:n.length},{name:"num_slices_per_batch",type:"u32"},{name:"input_batch_stride",type:"u32"},{name:"num_slice_dims",type:"u32"}];return` + ${p.registerUniforms(y).declareVariables(...g)} + ${p.mainStart()} + ${p.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let batch_idx = global_idx / uniforms.num_slices_per_batch; + let base_offset = batch_idx * uniforms.input_batch_stride; + + let slice_indices_base_offset = global_idx * uniforms.num_slice_dims; + var relative_slice_offset = 0; + for (var dim_idx = 0u; dim_idx < uniforms.num_slice_dims; dim_idx ++) { + var index = i32(indices_data[dim_idx + slice_indices_base_offset].x); + let input_dim_idx = uniforms.batch_dims + dim_idx; + if (index < 0) { + ${i.length===1?"index += i32(uniforms.input_dims);":"index += i32(uniforms.input_dims[input_dim_idx]);"} + } + ${n.length===1?"relative_slice_offset += index * i32(uniforms.sizes_from_slice_dims_data);":"relative_slice_offset += index * i32(uniforms.sizes_from_slice_dims_data[dim_idx]);"} + } + + input_slice_offsets_data[global_idx] = base_offset + u32(relative_slice_offset); + }`};return e.compute({name:"computeSliceOffsets",shaderCache:{hint:`${i.length}_${n.length}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:d,dataType:e.inputs[1].dataType}],dispatchGroup:{x:Math.ceil(a/64)},programUniforms:u}),getShaderSource:h},{inputs:[t],outputs:[-1]})[0]},YB=(e,t)=>{let n=e.inputs,r=n[0].dims,i=n[0].dataType,a=n[1].dims,o=a[a.length-1],l=In.sizeToDimension(a,a.length-1),c=In.sizeFromDimension(r,t.batchDims+o),u=In.sizeToDimension(r,t.batchDims),d=In.sizeFromDimension(r,t.batchDims),h=l/u,p=new Array(o),f=c;for(let z=0;zr.length)throw new Error("last dimension of indices must not be larger than rank of input tensor");let y=a.slice(0,-1).concat(r.slice(g)),w=In.size(y),v=[{type:12,data:w},{type:12,data:c},...Yr(n[0].dims,b.dims,y)],m=z=>{let C=Fn("data",n[0].dataType,n[0].dims.length),E=Fn("slice_offsets",12,b.dims.length),I=Dr("output",n[0].dataType,y.length);return` + ${z.registerUniform("output_size","u32").registerUniform("slice_size","u32").declareVariables(C,E,I)} + ${z.mainStart()} + ${z.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let slice_offset = slice_offsets[global_idx / uniforms.slice_size]; + output[global_idx] = data[u32(slice_offset) + global_idx % uniforms.slice_size]; + }`};e.compute({name:"GatherND",shaderCache:{hint:t.cacheKey,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:y,dataType:i}],dispatchGroup:{x:Math.ceil(w/64)},programUniforms:v}),getShaderSource:m},{inputs:[n[0],b]})},JB=e=>({batchDims:e.batch_dims,cacheKey:""})}),F6,W6,ZB,QB,n0e=ur(()=>{hs(),vs(),oa(),$s(),F6=(e,t)=>{if(e.length<3||e.length>4)throw new Error("GatherBlockQuantized requires 3 or 4 inputs.");let n=In.normalizeAxis(t.quantizeAxis,e[0].dims.length),r=t.blockSize,i=e[0],a=e[2],o=e.length===4?e[3]:void 0;if(a.dims.length!==i.dims.length||!i.dims.map((l,c)=>c===n?Math.ceil(l/r)===a.dims[c]:l===a.dims[c]).reduce((l,c)=>l&&c,!0))throw new Error("Scales must have the same rank as the input tensor and the dims should match except on gatherAxis.");if(o){if(o.dataType!==i.dataType)throw new Error("Zero point must have the same data type as the input tensor.");if(o.dims.length!==a.dims.length||!o.dims.map((l,c)=>l===a.dims[c]).reduce((l,c)=>l&&c,!0))throw new Error("Zero point must have the same rank as the input tensor and the dims should match except on quantizeAxis.")}},W6=(e,t)=>{let n=e[0].dims,r=e[1].dims,i=n.length,a=In.normalizeAxis(t.gatherAxis,i),o=In.normalizeAxis(t.quantizeAxis,i),l=n.slice(0);l.splice(a,1,...r);let c=In.size(l),u=e[2].dataType,d=e[0].dataType===22,h=[{type:12,data:c},{type:12,data:o},{type:12,data:a},{type:12,data:t.blockSize},...Yr(...e.map((f,b)=>f.dims),l)],p=f=>{let b=Fn("data",e[0].dataType,e[0].dims.length),g=Fn("inputIndices",e[1].dataType,e[1].dims.length),y=Fn("scales",e[2].dataType,e[2].dims.length),w=e.length>3?Fn("zeroPoint",e[3].dataType,e[3].dims.length):void 0,v=Dr("output",u,l.length),m=[b,g,y];w&&m.push(w);let z=[{name:"output_size",type:"u32"},{name:"quantize_axis",type:"u32"},{name:"gather_axis",type:"u32"},{name:"block_size",type:"u32"}];return` + ${f.registerUniforms(z).declareVariables(...m,v)} + ${f.mainStart()} + let output_indices = ${v.offsetToIndices("global_idx")}; + var indices_indices = ${g.type.indices}(0); + ${r.length>1?` + for (var i: u32 = 0; i < ${r.length}; i++) { + let index = ${v.indicesGet("output_indices","uniforms.gather_axis + i")}; + ${g.indicesSet("indices_indices","i","index")}; + }`:`indices_indices = ${v.indicesGet("output_indices","uniforms.gather_axis")};`}; + var data_indices = ${b.type.indices}(0); + for (var i: u32 = 0; i < uniforms.gather_axis; i++) { + let index = ${v.indicesGet("output_indices","i")}; + ${b.indicesSet("data_indices","i","index")}; + } + var index_from_indices = ${g.getByIndices("indices_indices")}; + if (index_from_indices < 0) { + index_from_indices += ${n[a]}; + } + ${b.indicesSet("data_indices","uniforms.gather_axis","u32(index_from_indices)")}; + for (var i = uniforms.gather_axis + 1; i < ${l.length}; i++) { + let index = ${v.indicesGet("output_indices",`i + ${r.length} - 1`)}; + ${b.indicesSet("data_indices","i","index")}; + } + let data_offset = ${b.indicesToOffset("data_indices")}; + let data_index = data_offset % 8; + // Convert 4-bit packed data to 8-bit packed data. + let packed_4bit_quantized_data = ${b.getByOffset("data_offset / 8")}; + let packed_8bit_quantized_data = (packed_4bit_quantized_data >> (4 * (data_index % 2))) & 0x0f0f0f0f; + let quantized_data_vec = ${d?"unpack4xI8":"unpack4xU8"}(u32(packed_8bit_quantized_data)); + let quantized_data = quantized_data_vec[data_index / 2]; + var scale_indices = data_indices; + let quantize_axis_index = ${y.indicesGet("data_indices","uniforms.quantize_axis")} / uniforms.block_size; + ${y.indicesSet("scale_indices","uniforms.quantize_axis","quantize_axis_index")}; + var scale = ${y.getByIndices("scale_indices")}; + ${w?` + let zero_point_indices = scale_indices; + let zero_point_offset = ${w.indicesToOffset("zero_point_indices")}; + let zero_point_index = zero_point_offset % 8; + let packed_4bit_zero_points = ${w.getByOffset("zero_point_offset / 8")}; + let packed_8bit_zero_points = (packed_4bit_zero_points >> (4 * (zero_point_index % 2))) & 0x0f0f0f0f; + let zero_point_vec = ${d?"unpack4xI8":"unpack4xU8"}(u32(packed_8bit_zero_points)); + let zero_point = zero_point_vec[zero_point_index / 2];`:"var zero_point = 0"}; + let dequantized_data = ${Bo(u)}(quantized_data - zero_point) * scale; + ${v.setByOffset("global_idx","dequantized_data")}; + }`};return{name:"GatherBlockQuantized",shaderCache:{hint:`${t.cacheKey};${e.filter((f,b)=>b!==1).map(f=>f.dims.join("_")).join(";")}`,inputDependencies:Array.from({length:e.length},(f,b)=>"rank")},getRunData:()=>({outputs:[{dims:l,dataType:u}],dispatchGroup:{x:Math.ceil(c/64)},programUniforms:h}),getShaderSource:p}},ZB=(e,t)=>{let n=e.inputs;F6(n,t),e.compute(W6(e.inputs,t))},QB=e=>pi({blockSize:e.blockSize,gatherAxis:e.gatherAxis,quantizeAxis:e.quantizeAxis})}),D6,V6,eU,tU,r0e=ur(()=>{hs(),vs(),oa(),$s(),D6=e=>{if(!e||e.length!==2)throw new Error("GatherElements requires 2 inputs.");if(e[0].dims.length<1)throw new Error("GatherElements requires that the data input be rank >= 1.");if(e[0].dims.length!==e[1].dims.length)throw new Error(`GatherElements requires that the data input and + indices input tensors be of same rank.`)},V6=(e,t)=>{let n=e[0].dims,r=e[0].dataType,i=n.length,a=e[1].dims,o=e[1].dataType,l=In.normalizeAxis(t.axis,i),c=n[l],u=a.slice(0),d=In.size(u),h=Fn("input",r,i),p=Fn("indicesInput",o,a.length),f=Dr("output",r,u.length),b=[{type:12,data:d},{type:6,data:c},{type:12,data:l}];return b.push(...Yr(n,a,u)),{name:"GatherElements",shaderCache:{inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:u,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(d/64)},programUniforms:b}),getShaderSource:g=>` + ${g.registerUniform("outputSize","u32").registerUniform("axisDimLimit","i32").registerUniform("axis","u32").declareVariables(h,p,f)} + ${g.mainStart()} + ${g.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + + let outputIndices = ${f.offsetToIndices("global_idx")}; + + var idx = ${p.getByOffset("global_idx")}; + if (idx < 0) { + idx = idx + uniforms.axisDimLimit; + } + var inputIndices = ${h.type.indices}(outputIndices); + ${h.indicesSet("inputIndices","uniforms.axis","u32(idx)")}; + let value = ${h.getByIndices("inputIndices")}; + + ${f.setByOffset("global_idx","value")}; + }`}},eU=e=>pi({axis:e.axis}),tU=(e,t)=>{let n=e.inputs;D6(n),e.compute(V6(e.inputs,t))}}),H6,G6,nU,rU,s0e=ur(()=>{hs(),vs(),$s(),H6=e=>{if(!e)throw new Error("Input is missing");if(e.length<2||e.length>3)throw new Error("Invaid input number.");if(e.length===3&&e[2].dims.length>2)throw new Error("Invalid input shape of C");if(e[0].dataType!==e[1].dataType||e.length===3&&e[0].dataType!==e[2].dataType)throw new Error("Input types are mismatched")},G6=(e,t)=>{let n=e[0].dims.slice(),r=e[1].dims.slice(),[i,a,o]=sL.getShapeOfGemmResult(n,t.transA,r,t.transB,e.length===3?e[2].dims:void 0),l=[i,a];if(!l)throw new Error("Can't use gemm on the given tensors");let c=16,u=Math.ceil(a/c),d=Math.ceil(i/c),h=!0,p=In.size(l),f=[{type:12,data:h?u:p},{type:12,data:i},{type:12,data:a},{type:12,data:o},{type:1,data:t.alpha},{type:1,data:t.beta}],b=["type","type"];e.length===3&&(f.push(...Yr(e[2].dims)),b.push("rank")),f.push(...Yr(l));let g=w=>{let v="";t.transA&&t.transB?v="value += a[k * uniforms.M + m] * b[n * uniforms.K + k];":t.transA&&!t.transB?v="value += a[k * uniforms.M + m] * b[k * uniforms.N + n];":!t.transA&&t.transB?v="value += a[m * uniforms.K + k] * b[n * uniforms.K + k];":!t.transA&&!t.transB&&(v="value += a[m * uniforms.K + k] * b[k * uniforms.N + n];");let m=t.alpha===1?"":"value *= uniforms.alpha;",z=Fn("a",e[0].dataType,e[0].dims),C=Fn("b",e[1].dataType,e[1].dims),E=z.type.value,I=null,R=[z,C];e.length===3&&(I=Fn("c",e[2].dataType,e[2].dims.length),R.push(I));let A=Dr("output",e[0].dataType,l.length);R.push(A);let O=[{name:"output_size",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"},{name:"alpha",type:"f32"},{name:"beta",type:"f32"}];return` + ${w.registerUniforms(O).declareVariables(...R)} + + ${w.mainStart()} + ${w.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let m = global_idx / uniforms.N; + let n = global_idx % uniforms.N; + + var value = ${E}(0); + for (var k: u32 = 0u; k < uniforms.K; k++) { + ${v} + } + + ${m} + ${I!=null?`let cOffset = ${I.broadcastedIndicesToOffset("vec2(m, n)",A)}; value += ${E}(uniforms.beta) * ${I.getByOffset("cOffset")};`:""} + output[global_idx] = value; + }`},y=w=>{let v=Fn("a",e[0].dataType,e[0].dims),m=Fn("b",e[1].dataType,e[1].dims),z=null,C=[v,m];e.length===3&&(z=Fn("c",e[2].dataType,e[2].dims.length),C.push(z));let E=Dr("output",e[0].dataType,l.length);C.push(E);let I=[{name:"num_tile_n",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"},{name:"alpha",type:"f32"},{name:"beta",type:"f32"}],R="",A="";t.transA&&t.transB?(A=` + var col = tile_row_start + local_id.x; + var row = k_start + local_id.y; + if (col < uniforms.M && row < uniforms.K) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.M + col]; + } else { + tile_a[local_id.y][local_id.x] = ${v.type.value}(0); + } + + col = k_start + local_id.x; + row = tile_col_start + local_id.y; + if (col < uniforms.K && row < uniforms.N) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.K + col]; + } else { + tile_b[local_id.y][local_id.x] = ${m.type.value}(0); + } + `,R="value += tile_a[k][local_id.y] * tile_b[local_id.x][k];"):t.transA&&!t.transB?(A=` + var col = tile_row_start + local_id.x; + var row = k_start + local_id.y; + if (col < uniforms.M && row < uniforms.K) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.M + col]; + } else { + tile_a[local_id.y][local_id.x] = ${v.type.value}(0); + } + + col = tile_col_start + local_id.x; + row = k_start + local_id.y; + if (col < uniforms.N && row < uniforms.K) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.N + col]; + } else { + tile_b[local_id.y][local_id.x] = ${m.type.value}(0); + } + `,R="value += tile_a[k][local_id.y] * tile_b[k][local_id.x];"):!t.transA&&t.transB?(A=` + var col = k_start + local_id.x; + var row = tile_row_start + local_id.y; + if (col < uniforms.K && row < uniforms.M) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.K + col]; + } else { + tile_a[local_id.y][local_id.x] = ${v.type.value}(0); + } + + col = k_start + local_id.x; + row = tile_col_start + local_id.y; + if (col < uniforms.K && row < uniforms.N) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.K + col]; + } else { + tile_b[local_id.y][local_id.x] = ${m.type.value}(0); + } + `,R="value += tile_a[local_id.y][k] * tile_b[local_id.x][k];"):!t.transA&&!t.transB&&(A=` + var col = k_start + local_id.x; + var row = tile_row_start + local_id.y; + if (col < uniforms.K && row < uniforms.M) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.K + col]; + } else { + tile_a[local_id.y][local_id.x] = ${v.type.value}(0); + } + + col = tile_col_start + local_id.x; + row = k_start + local_id.y; + if (col < uniforms.N && row < uniforms.K) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.N + col]; + } else { + tile_b[local_id.y][local_id.x] = ${m.type.value}(0); + } + `,R="value += tile_a[local_id.y][k] * tile_b[k][local_id.x];");let O=t.alpha===1?"":"value *= uniforms.alpha;";return` + ${w.registerUniforms(I).declareVariables(...C)} + var tile_a: array, ${c}>; + var tile_b: array, ${c}>; + ${w.mainStart([c,c,1])} + let tile_col_start = (workgroup_index % uniforms.num_tile_n) * ${c}; + let tile_row_start = (workgroup_index / uniforms.num_tile_n) * ${c}; + let num_tiles = (uniforms.K - 1) / ${c} + 1; + var k_start = 0u; + var value = ${E.type.value}(0); + for (var t: u32 = 0u; t < num_tiles; t++) { + ${A} + k_start = k_start + ${c}; + workgroupBarrier(); + + for (var k: u32 = 0u; k < ${c}; k++) { + ${R} + } + workgroupBarrier(); + } + + ${O} + let m = tile_row_start + local_id.y; + let n = tile_col_start + local_id.x; + ${z!=null?`let cOffset = ${z.broadcastedIndicesToOffset("vec2(m, n)",E)}; value += ${E.type.value}(uniforms.beta) * ${z.getByOffset("cOffset")};`:""} + if (m < uniforms.M && n < uniforms.N) { + output[m * uniforms.N + n] = value; + } + }`};return h?{name:"GemmShared",shaderCache:{hint:`${t.cacheKey}`,inputDependencies:b},getRunData:()=>({outputs:[{dims:l,dataType:e[0].dataType}],dispatchGroup:{x:u*d},programUniforms:f}),getShaderSource:y}:{name:"Gemm",shaderCache:{hint:`${t.cacheKey}`,inputDependencies:b},getRunData:()=>({outputs:[{dims:l,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(p/64)},programUniforms:f}),getShaderSource:g}},nU=e=>{let t=e.transA,n=e.transB,r=e.alpha,i=e.beta;return{transA:t,transB:n,alpha:r,beta:i,cacheKey:`${e.transA};${e.transB};${e.alpha===1}`}},rU=(e,t)=>{H6(e.inputs),e.compute(G6(e.inputs,t))}}),Wd,C0,pp,fp,q6,K6,X6,Y6,J6,Z6,Q6,eA,sU,iU,i0e=ur(()=>{hs(),vs(),oa(),$s(),[Wd,C0,pp,fp]=[0,1,2,3],q6=e=>{if(e[0].dims.length!==4)throw new Error("only 4-D tensor is supported.");if(e[0].dims.length!==e[1].dims.length)throw new Error("input dimensions must be equal to grid dimensions");if(e[0].dims.length-2!==e[1].dims[e[1].dims.length-1])throw new Error(`last dimension of grid must be equal to ${e[0].dims.length-2}`);if(e[0].dims[0]!==e[1].dims[0])throw new Error("grid batch size must match input batch size")},K6=` + fn gs_get_cubic_coeffs(x: f32) -> vec4 { + let cubic_alpha = -0.75f; + let x_abs = abs(x); + var coeffs: vec4; + coeffs[0] = (((cubic_alpha * (x_abs + 1) - 5 * cubic_alpha) * (x_abs + 1) + 8 * cubic_alpha) * (x_abs + 1) - 4 * cubic_alpha); + coeffs[1] = (((cubic_alpha + 2) * x_abs - (cubic_alpha + 3)) * x_abs * x_abs + 1); + coeffs[2] = (((cubic_alpha + 2) * (1 - x_abs) - (cubic_alpha + 3)) * (1 - x_abs) * (1 - x_abs) + 1); + coeffs[3] = (((cubic_alpha * (2 - x_abs) - 5 * cubic_alpha) * (2 - x_abs) + 8 * cubic_alpha) * (2 - x_abs) - 4 * cubic_alpha); + return coeffs; + } +`,X6=e=>` + fn gs_bicubic_interpolate(p: mat4x4<${e}>, x: f32, y: f32) -> ${e} { + var v: vec4; + var coeffs = gs_get_cubic_coeffs(x); + for (var i = 0; i < 4; i++) { + v[i] = coeffs[0] * p[i][0] + coeffs[1] * p[i][1] + coeffs[2] * p[i][2] + coeffs[3] * p[i][3]; + } + coeffs = gs_get_cubic_coeffs(y); + let pixel = ${e}(coeffs[0] * v[0] + coeffs[1] * v[1] + coeffs[2] * v[2] + coeffs[3] * v[3]); + return pixel; + } +`,Y6=e=>` + fn gs_denormalize(n: f32, length: i32) -> f32 { + ${e.alignCorners===0?` + // alignCorners: false => [-1, 1] to [-0.5, length - 0.5] + return ((n + 1.0) * f32(length) - 1.0) / 2.0; + `:` + // alignCorners: true => [-1, 1] to [0, length - 1] + return (n + 1.0) / 2.0 * (f32(length - 1)); + `} + } +`,J6=e=>` + ${e.paddingMode==="reflection"?` + fn gs_reflect(x: i32, x_min: f32, x_max: f32) -> u32 { + var dx = 0.0; + var fx = f32(x); + let range = x_max - x_min; + if (fx < x_min) { + dx = x_min - fx; + let n = u32(dx / range); + let r = dx - f32(n) * range; + if (n % 2 == 0) { + fx = x_min + r; + } else { + fx = x_max - r; + } + } else if (fx > x_max) { + dx = fx - x_max; + let n = u32(dx / range); + let r = dx - f32(n) * range; + if (n % 2 == 0) { + fx = x_max - r; + } else { + fx = x_min + r; + } + } + return u32(fx); + }`:""} +`,Z6=(e,t,n)=>` + fn pixel_at_grid(r: i32, c: i32, H: i32, W: i32, batch: u32, channel: u32, border: vec4) -> ${t} { + var pixel = ${t}(0); + var indices = vec4(0); + indices[${Wd}] = batch; + indices[${C0}] = channel;`+(()=>{switch(n.paddingMode){case"zeros":return` + if (r >= 0 && r < H && c >=0 && c < W) { + indices[${pp}] = u32(r); + indices[${fp}] = u32(c); + } + `;case"border":return` + indices[${pp}] = u32(clamp(r, 0, H - 1)); + indices[${fp}] = u32(clamp(c, 0, W - 1)); + `;case"reflection":return` + indices[${pp}] = gs_reflect(r, border[1], border[3]); + indices[${fp}] = gs_reflect(c, border[0], border[2]); + `;default:throw new Error(`padding mode ${n.paddingMode} is not supported`)}})()+` + return ${e.getByIndices("indices")}; + } +`,Q6=(e,t,n)=>(()=>{switch(n.mode){case"nearest":return` + let result = pixel_at_grid(i32(round(y)), i32(round(x)), H_in, W_in, indices[${Wd}], indices[${C0}], border); + `;case"bilinear":return` + let x1 = i32(floor(x)); + let y1 = i32(floor(y)); + let x2 = x1 + 1; + let y2 = y1 + 1; + + let p11 = pixel_at_grid(y1, x1, H_in, W_in, indices[${Wd}], indices[${C0}], border); + let p12 = pixel_at_grid(y1, x2, H_in, W_in, indices[${Wd}], indices[${C0}], border); + let p21 = pixel_at_grid(y2, x1, H_in, W_in, indices[${Wd}], indices[${C0}], border); + let p22 = pixel_at_grid(y2, x2, H_in, W_in, indices[${Wd}], indices[${C0}], border); + + let dx2 = ${t}(f32(x2) - x); + let dx1 = ${t}(x - f32(x1)); + let dy2 = ${t}(f32(y2) - y); + let dy1 = ${t}(y - f32(y1)); + let result = dy2 * (dx2 * p11 + dx1 * p12) + dy1 * (dx2 * p21 + dx1 * p22); + `;case"bicubic":return` + let x0 = i32(floor(x)) - 1; + let y0 = i32(floor(y)) - 1; + var p: mat4x4<${t}>; + for (var h = 0; h < 4; h++) { + for (var w = 0; w < 4; w++) { + p[h][w] = pixel_at_grid(h + y0, w + x0, H_in, W_in, indices[${Wd}], indices[${C0}], border); + } + } + + let dx = x - f32(x0 + 1); + let dy = y - f32(y0 + 1); + let result = gs_bicubic_interpolate(p, dx, dy); + `;default:throw new Error(`mode ${n.mode} is not supported`)}})()+`${e.setByOffset("global_idx","result")}`,eA=(e,t)=>{let n=Fn("x",e[0].dataType,e[0].dims.length),r=[e[1].dims[0],e[1].dims[1],e[1].dims[2]],i=Fn("grid",e[1].dataType,r.length,2),a=[e[0].dims[0],e[0].dims[1],e[1].dims[1],e[1].dims[2]];t.format==="NHWC"&&(a=[e[0].dims[0],e[1].dims[1],e[1].dims[2],e[0].dims[3]],[Wd,C0,pp,fp]=[0,3,1,2]);let o=Dr("output",e[0].dataType,a.length),l=n.type.value,c=In.size(a),u=[{type:12,data:c},...Yr(e[0].dims,r,a)],d=h=>` + ${h.registerUniform("output_size","u32").declareVariables(n,i,o)} + ${K6} + ${X6(l)} + ${Y6(t)} + ${J6(t)} + ${Z6(n,l,t)} + + ${h.mainStart()} + ${h.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let H_in = i32(uniforms.x_shape[${pp}]); + let W_in = i32(uniforms.x_shape[${fp}]); + + ${t.alignCorners===0?` + let x_min = -0.5; + let x_max = f32(W_in) - 0.5; + let y_min = -0.5; + let y_max = f32(H_in) - 0.5; + `:` + let x_min = 0.0; + let x_max = f32(W_in) - 1.0; + let y_min = 0.0; + let y_max = f32(H_in) - 1.0; + `}; + let border = vec4(x_min, y_min, x_max, y_max); + + let indices = ${o.offsetToIndices("global_idx")}; + var grid_indices = vec3(indices[${Wd}], indices[${pp}], indices[${fp}]); + let nxy = ${i.getByIndices("grid_indices")}; + var x = gs_denormalize(f32(nxy[0]), W_in); + var y = gs_denormalize(f32(nxy[1]), H_in); + + ${Q6(o,l,t)} + }`;return{name:"GridSample",shaderCache:{hint:`${t.cacheKey}`,inputDependencies:["type","type"]},getRunData:h=>{let p=In.size(a);return{outputs:[{dims:a,dataType:h[0].dataType}],dispatchGroup:{x:Math.ceil(p/64)},programUniforms:u}},getShaderSource:d}},sU=(e,t)=>{q6(e.inputs),e.compute(eA(e.inputs,t))},iU=e=>pi({alignCorners:e.align_corners,mode:e.mode,paddingMode:e.padding_mode,format:e.format})}),al,tA,aU,N3,nA,cx,oU,lU=ur(()=>{hs(),vs(),oa(),V4(),q4(),$s(),Fh(),al=(e,t)=>e.length>t&&e[t].dims.length>0?e[t]:void 0,tA=(e,t)=>{let n=e[0],r=al(e,1),i=al(e,2),a=al(e,3),o=al(e,4),l=al(e,5),c=al(e,6),u=al(e,7);if(n.dims.length!==3&&n.dims.length!==5)throw new Error("Input query is expected to have 3 or 5 dimensions");let d=n.dims[0],h=n.dims[1],p=n.dims.length===3?n.dims[2]:t.numHeads*n.dims[4],f=h,b=0,g=0,y=Math.floor(p/t.numHeads);if(c&&u&&In.size(c.dims)&&In.size(u.dims)){if(c.dims.length!==4)throw new Error('Input "past_key" is expected to have 4 dimensions');if(c.dims[0]!==d||c.dims[1]!==t.numHeads||c.dims[3]!==y)throw new Error('Input "past_key" shape (batch_size, num_heads, past_sequence_length, head_size)');if(u.dims[0]!==d||u.dims[1]!==t.numHeads||u.dims[3]!==y)throw new Error('Input "past_value" shape (batch_size, num_heads, past_sequence_length, head_size)');if(c.dims[2]!==u.dims[2])throw new Error('Input "past_key" and "past_value" shall have same dim 2 (past_sequence_length)');if(u.dims.length!==4)throw new Error('Input "past_value" is expected to have 4 dimensions');b=c.dims[2],g=c.dims[2]}else if(c&&In.size(c.dims)||u&&In.size(u.dims))throw new Error('Input "past_key" and "past_value" shall be both present or both absent');let w;if(r&&In.size(r.dims)>0){if(n.dims.length!==3)throw new Error('Input "query" is expected to have 3 dimensions when key is given');if(r.dims.length<3||r.dims.length>5)throw new Error('Input "key" is expected to have 3, 4, or 5 dimensions');if(n.dims[0]!==r.dims[0])throw new Error('Input "query" and "key" shall have same dim 0 (batch size)');if(r.dims.length===3){if(r.dims[2]!==n.dims[2])throw new Error('Input "query" and "key" shall have same dim 2 (hidden_size)');w=2,f=r.dims[1]}else if(r.dims.length===5){if(r.dims[2]!==t.numHeads||r.dims[3]!==2||r.dims[4]!==y)throw new Error('Expect "key" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');if(i)throw new Error('Expect "value" be none when "key" has packed kv format.');w=5,f=r.dims[1]}else{if(r.dims[1]!==t.numHeads||r.dims[3]!==y)throw new Error('Expect "key" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');w=0,f=r.dims[2]}}else{if(n.dims.length!==5)throw new Error('Input "query" is expected to have 5 dimensions when key is empty');if(n.dims[2]!==t.numHeads||n.dims[3]!==3)throw new Error('Expect "query" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');w=3}if(a&&In.size(a.dims)>0){if(a.dims.length!==1)throw new Error('Input "bias" is expected to have 1 dimension');if(r&&r.dims.length===5&&r.dims[3]===2)throw new Error("bias is not allowed for packed kv.")}let v=b+f,m=0;if(o&&In.size(o.dims)>0){m=8;let I=o.dims;throw I.length===1?I[0]===d?m=1:I[0]===3*d+2&&(m=3):I.length===2&&I[0]===d&&I[1]===v&&(m=5),m===8?new Error('Input "key_padding_mask" shape shall be (batch_size) or (batch_size, total_sequence_length)'):new Error("Mask not supported")}let z=!1,C=p;if(i&&In.size(i.dims)>0){if(i.dims.length!==3&&i.dims.length!==4)throw new Error('Input "value" is expected to have 3 or 4 dimensions');if(n.dims[0]!==i.dims[0])throw new Error('Input "query" and "value" shall have same dim 0 (batch_size)');if(i.dims.length===3){if(f!==i.dims[1])throw new Error('Input "key" and "value" shall have the same dim 1 (kv_sequence_length)');C=i.dims[2]}else{if(f!==i.dims[2])throw new Error('Input "key" and "value" shall have the same dim 2 (kv_sequence_length)');C=i.dims[1]*i.dims[3],z=!0}}let E=!1;if(o&&In.size(o.dims)>0)throw new Error("Key padding mask is not supported");if(l&&In.size(l.dims)>0){if(l.dims.length!==4)throw new Error('Input "attention_bias" is expected to have 4 dimensions');if(l.dims[0]!==d||l.dims[1]!==t.numHeads||l.dims[2]!==h||l.dims[3]!==v)throw new Error('Expect "attention_bias" shape (batch_size, num_heads, sequence_length, total_sequence_length)')}return{batchSize:d,sequenceLength:h,pastSequenceLength:b,kvSequenceLength:f,totalSequenceLength:v,maxSequenceLength:g,inputHiddenSize:0,hiddenSize:p,vHiddenSize:C,headSize:y,vHeadSize:Math.floor(C/t.numHeads),numHeads:t.numHeads,isUnidirectional:!1,pastPresentShareBuffer:!1,maskFilterValue:t.maskFilterValue,maskType:m,scale:t.scale,broadcastResPosBias:E,passPastInKv:z,qkvFormat:w}},aU=e=>pi({...e}),N3=pi({perm:[0,2,1,3]}),nA=(e,t,n,r,i,a,o)=>{let l=[r,i,a],c=In.size(l),u=[{type:12,data:c},{type:12,data:o},{type:12,data:a}],d=h=>{let p=Dr("qkv_with_bias",t.dataType,l),f=Fn("qkv",t.dataType,l),b=Fn("bias",n.dataType,l),g=[{name:"output_size",type:"u32"},{name:"bias_offset",type:"u32"},{name:"hidden_size",type:"u32"}];return` + ${h.registerUniforms(g).declareVariables(f,b,p)} + ${h.mainStart()} + ${h.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let bias_offset_idx = (global_idx % uniforms.hidden_size) + uniforms.bias_offset; + + qkv_with_bias[global_idx] = qkv[global_idx] + bias[bias_offset_idx]; + }`};return e.compute({name:"MultiHeadAttentionAddBias",shaderCache:{inputDependencies:["type","type"]},getRunData:()=>({outputs:[{dims:l,dataType:t.dataType,gpuDataType:0}],dispatchGroup:{x:Math.ceil(c/64)},programUniforms:u}),getShaderSource:d},{inputs:[t,n],outputs:[-1]})[0]},cx=(e,t,n,r,i,a,o,l)=>{let c=a;if(o&&In.size(o.dims)>0){if(r===1)throw new Error("AddBiasReshape is not implemented. Please export your model with packed QKV or KV");return c=nA(e,a,o,t,r,n*i,l),c=c.reshape([t,r,n,i]),n===1||r===1?c:e.compute(Sc(c,N3.perm),{inputs:[c],outputs:[-1]})[0]}else return a.dims.length===3&&(c=a.reshape([t,r,n,i])),n===1||r===1?c:e.compute(Sc(c,N3.perm),{inputs:[c],outputs:[-1]})[0]},oU=(e,t)=>{let n=tA(e.inputs,t),r=e.inputs[0],i=al(e.inputs,1),a=al(e.inputs,2),o=al(e.inputs,3),l=al(e.inputs,4),c=al(e.inputs,5),u=al(e.inputs,6),d=al(e.inputs,7);if(r.dims.length===5)throw new Error("Packed QKV is not implemented");if((i==null?void 0:i.dims.length)===5)throw new Error("Packed KV is not implemented");let h=i&&a&&i.dims.length===4&&a.dims.length===4,p=cx(e,n.batchSize,n.numHeads,n.sequenceLength,n.headSize,r,o,0);if(h)return hb(e,p,i,a,l,void 0,u,d,c,n);if(!i||!a)throw new Error("key and value must be provided");let f=cx(e,n.batchSize,n.numHeads,n.kvSequenceLength,n.headSize,i,o,n.hiddenSize),b=cx(e,n.batchSize,n.numHeads,n.kvSequenceLength,n.vHeadSize,a,o,2*n.hiddenSize);hb(e,p,f,b,l,void 0,u,d,c,n)}}),rA,sA,iA,aA,t5,cU,uU,dU=ur(()=>{hs(),vs(),oa(),$s(),rA=e=>{if(!e||e.length<1)throw new Error("too few inputs")},sA=(e,t)=>{let n=[],r=t.numOutputs;return e[1].dims[0]>0&&(e[1].getBigInt64Array().forEach(i=>n.push(Number(i))),r=n.length),pi({numOutputs:r,axis:t.axis,splitSizes:n})},iA=e=>` +fn calculateOutputIndex(index: u32) -> u32 { + for (var i: u32 = 0u; i < ${e}u; i += 1u ) { + if (index < ${Gr("uniforms.size_in_split_axis","i",e)}) { + return i; + } + } + return ${e}u; +}`,aA=e=>{let t=e.length,n=[];for(let r=0;r{let n=e[0].dims,r=In.size(n),i=e[0].dataType,a=In.normalizeAxis(t.axis,n.length),o=new Array(t.numOutputs),l=Fn("input",i,n.length),c=new Array(t.numOutputs),u=[],d=[],h=0,p=[{type:12,data:r}];for(let b=0;b` + ${b.registerUniform("input_size","u32").registerUniform("size_in_split_axis","u32",c.length).declareVariables(l,...o)} + ${iA(c.length)} + ${aA(o)} + + ${b.mainStart()} + ${b.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.input_size")} + + var indices = ${l.offsetToIndices("global_idx")}; + var index = ${l.indicesGet("indices",a)}; + let output_number = calculateOutputIndex(index); + if (output_number != 0) { + index -= ${Gr("uniforms.size_in_split_axis","output_number - 1u",c.length)}; + ${l.indicesSet("indices",a,"index")}; + } + writeBufferData(output_number, indices, global_idx); + }`;return{name:"Split",shaderCache:{hint:t.cacheKey,inputDependencies:["rank"]},getShaderSource:f,getRunData:()=>({outputs:u,dispatchGroup:{x:Math.ceil(r/64)},programUniforms:p})}},cU=(e,t)=>{rA(e.inputs);let n=e.inputs.length===1?t:sA(e.inputs,t);e.compute(t5(e.inputs,n),{inputs:[0]})},uU=e=>{let t=e.axis,n=e.splitSizes,r=e.numOutputs<0?n.length:e.numOutputs;if(r!==n.length)throw new Error("numOutputs and splitSizes lengh must be equal");return pi({axis:t,numOutputs:r,splitSizes:n})}}),oA,lA,E3,hU,a0e=ur(()=>{oa(),q4(),lU(),dU(),Fh(),oA=(e,t)=>{if(t.doRotary)throw new Error("GroupQuerryAttention do_rotary attribute is not supported");if(t.doRotary&&e.length<=7)throw new Error("cos_cache and sin_cache inputs are required if do_rotary is specified");let n=e[0],r=e[1],i=e[2],a=e[3],o=e[4];if(t.localWindowSize!==-1)throw new Error("Local attention is not supported");if(t.softcap!==0)throw new Error("Softcap is not supported");if(t.rotaryInterleaved!==0)throw new Error("Rotary interleaved is not supported");if(t.smoothSoftmax)throw new Error("Smooth softmax is not supported");if(n.dims.length!==3&&n.dims.length!==5)throw new Error("Input query is expected to have 3 or 5 dimensions");let l=!1,c=n.dims[0],u=n.dims[1],d=n.dims.length===3?l?n.dims[2]/3:n.dims[2]:t.numHeads*n.dims[4],h=u,p=0,f=!r||r.dims.length===0,b=Math.floor(f?d/(t.numHeads+2*t.kvNumHeads):d/t.numHeads);f&&(d=b*t.numHeads);let g=a&&a.dims.length!==0,y=o&&o.dims.length!==0;if(g&&a.dims.length===4&&a.dims[0]===c&&a.dims[1]!==t.kvNumHeads&&a.dims[2]===t.kvNumHeads&&a.dims[3]===b)throw new Error("BSNH pastKey/pastValue is not supported");if(g&&y){if(a.dims.length!==4)throw new Error('Input "past_key" is expected to have 4 dimensions');if(o.dims.length!==4)throw new Error('Input "past_value" is expected to have 4 dimensions');p=a.dims[2]}else if(g||y)throw new Error('Input "past_key" and "past_value" shall be both present or both absent');let w=1;if(r&&r.dims.length>0){if(n.dims.length!==3)throw new Error('Input "query" is expected to have 3 dimensions when key is given');if(r.dims.length<3||r.dims.length>5)throw new Error('Input "key" is expected to have 3, 4, or 5 dimensions');if(n.dims[0]!==r.dims[0])throw new Error('Input "query" and "key" shall have same dim 0 (batch size)');if(r.dims.length===3){if(n.dims[2]%r.dims[2]!==0)throw new Error('Dimension 2 of "query" should be a multiple of "key"');h=r.dims[1]}else if(r.dims.length===5){if(r.dims[2]!==t.numHeads||r.dims[3]!==2||r.dims[4]!==b)throw new Error('Expect "key" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');if(i)throw new Error('Expect "value" be none when "key" has packed kv format.');h=r.dims[1]}else{if(r.dims[1]!==t.numHeads||r.dims[3]!==b)throw new Error('Expect "key" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');h=r.dims[2]}}else{if(n.dims.length!==3&&n.dims.length!==5)throw new Error('Input "query" is expected to have 3 or 5 dimensions when key is empty');if(n.dims.length===5&&(n.dims[2]!==t.numHeads||n.dims[3]!==3))throw new Error('Expect "query" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');w=3}let v=0,m=!1,z=t.kvNumHeads?b*t.kvNumHeads:d;if(i&&i.dims.length>0){if(i.dims.length!==3&&i.dims.length!==4)throw new Error('Input "value" is expected to have 3 or 4 dimensions');if(n.dims[0]!==i.dims[0])throw new Error('Input "query" and "value" shall have same dim 0 (batch_size)');if(i.dims.length===3){if(h!==i.dims[1])throw new Error('Input "key" and "value" shall have the same dim 1 (kv_sequence_length)');z=i.dims[2]}else{if(h!==i.dims[2])throw new Error('Input "past_key" and "past_value" shall have the same dim 2 (kv_sequence_length)');z=i.dims[1]*i.dims[3],m=!0}}let C=e.length>4?e[5]:void 0;if(C&&C.dims.length!==1&&C.dims[0]!==c)throw new Error('Input "seqlens" is expected to have 1 dimension and the same dim 0 as batch_size');return{batchSize:c,sequenceLength:u,pastSequenceLength:p,kvSequenceLength:h,totalSequenceLength:-1,maxSequenceLength:-1,inputHiddenSize:0,hiddenSize:d,vHiddenSize:z,headSize:b,vHeadSize:Math.floor(z/t.kvNumHeads),numHeads:t.numHeads,kvNumHeads:t.kvNumHeads,nReps:t.numHeads/t.kvNumHeads,pastPresentShareBuffer:!1,maskType:v,scale:t.scale,broadcastResPosBias:!1,passPastInKv:m,qkvFormat:w}},lA=pi({perm:[0,2,1,3]}),E3=(e,t,n)=>{let r=t,i=n.kvNumHeads;return t.dims.length===3&&n.kvSequenceLength!==0&&(r=t.reshape([n.batchSize,n.kvSequenceLength,i,n.headSize]),r=e.compute(Sc(r,lA.perm),{inputs:[r],outputs:[-1]})[0]),r},hU=(e,t)=>{var y;let n=oA(e.inputs,t);if(e.inputs[0].dims.length===5)throw new Error("Packed QKV is not implemented");if(((y=e.inputs[1])==null?void 0:y.dims.length)===5)throw new Error("Packed KV is not implemented");let r=e.inputs[0],i=e.inputs[1]&&e.inputs[1].dims.length>0?e.inputs[1]:void 0,a=e.inputs[2]&&e.inputs[2].dims.length>0?e.inputs[2]:void 0,o=e.inputs[3]&&e.inputs[3].dims.length!==0?e.inputs[3]:void 0,l=e.inputs[4]&&e.inputs[4].dims.length!==0?e.inputs[4]:void 0,c=e.inputs.length>4?e.inputs[5]:void 0,u=e.inputs.length>5?e.inputs[6]:void 0,d=n.kvNumHeads?n.kvNumHeads:n.numHeads,h=pi({axis:2,numOutputs:3,splitSizes:[n.numHeads*n.headSize,d*n.headSize,d*n.headSize]}),[p,f,b]=!i&&!a?e.compute(t5([r],h),{inputs:[r],outputs:[-1,-1,-1]}):[r,i,a],g=cx(e,n.batchSize,n.numHeads,n.sequenceLength,n.headSize,p,void 0,0);hb(e,g,E3(e,f,n),E3(e,b,n),void 0,void 0,o,l,void 0,n,c,u)}}),I3,cA,uA,pU,o0e=ur(()=>{hs(),vs(),Fh(),$s(),I3=(e,t,n,r,i,a,o,l)=>{let c=Yi(a),u=c===1?"f32":`vec${c}f`,d=c===1?"vec2f":`mat2x${c}f`,h=i*o,p=64;h===1&&(p=256);let f=[i,o,a/c],b=[i,o,2],g=["rank","type","type"],y=[];y.push(...Yr(f,b));let w=v=>{let m=Fn("x",t.dataType,3,c),z=Fn("scale",n.dataType,n.dims),C=Fn("bias",r.dataType,r.dims),E=Dr("output",1,3,2),I=[m,z,C,E];return` + var workgroup_shared : array<${d}, ${p}>; + const workgroup_size = ${p}u; + ${v.declareVariables(...I)} + ${v.mainStart(p)} + let batch = workgroup_index / uniforms.x_shape[1]; + let channel = workgroup_index % uniforms.x_shape[1]; + let hight = uniforms.x_shape[2]; + // initialize workgroup memory + var sum = ${u}(0); + var squared_sum = ${u}(0); + for (var h = local_idx; h < hight; h += workgroup_size) { + let value = ${u}(${m.get("batch","channel","h")}); + sum += value; + squared_sum += value * value; + } + workgroup_shared[local_idx] = ${d}(sum, squared_sum); + workgroupBarrier(); + + for (var currSize = workgroup_size >> 1; currSize > 0; currSize = currSize >> 1) { + if (local_idx < currSize) { + workgroup_shared[local_idx] = workgroup_shared[local_idx] + workgroup_shared[local_idx + currSize]; + } + workgroupBarrier(); + } + if (local_idx == 0) { + let sum_final = ${Ph("workgroup_shared[0][0]",c)} / f32(hight * ${c}); + let squared_sum_final = ${Ph("workgroup_shared[0][1]",c)} / f32(hight * ${c}); + + let inv_std_dev = inverseSqrt(squared_sum_final - sum_final * sum_final + f32(${l})); + let channel_scale = inv_std_dev * f32(scale[channel]); + let channel_shift = f32(bias[channel]) - sum_final * channel_scale; + output[workgroup_index] = vec2f(channel_scale, channel_shift); + } + }`};return e.compute({name:"InstanceNormComputeChannelScaleShift",shaderCache:{hint:`${c};${l};${p}`,inputDependencies:g},getRunData:()=>({outputs:[{dims:b,dataType:1}],dispatchGroup:{x:h},programUniforms:y}),getShaderSource:w},{inputs:[t,n,r],outputs:[-1]})[0]},cA=(e,t,n)=>{let r=t[0].dims,i=r,a=2,o=r[0],l=r[1],c=In.sizeFromDimension(r,a),u=Yi(c),d=In.size(i)/u,h=I3(e,t[0],t[1],t[2],o,c,l,n.epsilon),p=[o,l,c/u],f=[o,l],b=["type","none"],g=y=>{let w=Fn("x",t[0].dataType,p.length,u),v=Fn("scale_shift",1,f.length,2),m=Dr("output",t[0].dataType,p.length,u),z=[w,v,m];return` + ${y.registerUniform("output_size","u32").declareVariables(...z)} + ${y.mainStart()} + ${y.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let outputIndices = ${m.offsetToIndices("global_idx")}; + let batch = outputIndices[0]; + let channel = outputIndices[1]; + let scale_shift = ${v.getByIndices("vec2(batch, channel)")}; + let value = ${w.getByOffset("global_idx")} * ${m.type.value}(scale_shift.x) + ${m.type.value}(scale_shift.y); + ${m.setByOffset("global_idx","value")}; + }`};e.compute({name:"InstanceNormalization",shaderCache:{hint:`${u}`,inputDependencies:b},getRunData:()=>({outputs:[{dims:i,dataType:t[0].dataType}],dispatchGroup:{x:Math.ceil(d/64)},programUniforms:[{type:12,data:d},...Yr(p,f,p)]}),getShaderSource:g},{inputs:[t[0],h]})},uA=(e,t,n)=>{let r=t[0].dims,i=r,a=r[0],o=r[r.length-1],l=In.sizeFromDimension(r,1)/o,c=Yi(o),u=In.size(i)/c,d=[{type:12,data:l},{type:12,data:Math.floor(o/c)}],h=["type","type"],p=!1,f=[0,r.length-1];for(let w=0;wr[f[v]])),g=I3(e,b,t[1],t[2],a,l,o,n.epsilon),y=w=>{let v=Za(t[0].dataType),m=c===1?"vec2f":`mat${c}x2f`,z=I=>{let R=I===0?"x":"y",A=c===1?"f32":`vec${c}f`;switch(c){case 1:return`${v}(${A}(scale.${R}))`;case 2:return`vec2<${v}>(${A}(scale[0].${R}, scale[1].${R}))`;case 4:return`vec4<${v}>(${A}(scale[0].${R}, scale[1].${R}, scale[2].${R}, scale[3].${R}))`;default:throw new Error(`Not supported compoents ${c}`)}},C=Fn("input",t[0].dataType,t[0].dims,c),E=Dr("output",t[0].dataType,i,c);return` + @group(0) @binding(0) var input : array<${C.type.storage}>; + @group(0) @binding(1) var scale_input : array<${m}>; + @group(0) @binding(2) var output : array<${E.type.storage}>; + struct Uniforms {H: u32, C : u32}; + @group(0) @binding(3) var uniforms: Uniforms; + + ${w.mainStart()} + let current_image_number = global_idx / (uniforms.C * uniforms.H); + let current_channel_number = global_idx % uniforms.C; + + let scale_offset = current_image_number * uniforms.C + current_channel_number; + let scale = scale_input[scale_offset]; + output[global_idx] = fma(input[global_idx], ${z(0)}, ${z(1)}); + }`};e.compute({name:"InstanceNormalizationNHWC",shaderCache:{hint:`${c}`,inputDependencies:h},getRunData:()=>({outputs:[{dims:i,dataType:t[0].dataType}],dispatchGroup:{x:Math.ceil(u/64)},programUniforms:d}),getShaderSource:y},{inputs:[t[0],g]})},pU=(e,t)=>{t.format==="NHWC"?uA(e,e.inputs,t):cA(e,e.inputs,t)}}),dA,hA,fU,l0e=ur(()=>{hs(),vs(),$s(),dA=e=>{if(!e||e.length<2)throw new Error("layerNorm requires at least 2 inputs.")},hA=(e,t,n)=>{let r=t.simplified,i=e[0].dims,a=e[1],o=!r&&e[2],l=i,c=In.normalizeAxis(t.axis,i.length),u=In.sizeToDimension(i,c),d=In.sizeFromDimension(i,c),h=In.size(a.dims),p=o?In.size(o.dims):0;if(h!==d||o&&p!==d)throw new Error(`Size of X.shape()[axis:] == ${d}. + Size of scale and bias (if provided) must match this. + Got scale size of ${h} and bias size of ${p}`);let f=[];for(let C=0;C1,v=n>2,m=C=>{let E=Za(e[0].dataType),I=[Fn("x",e[0].dataType,e[0].dims,b),Fn("scale",a.dataType,a.dims,b)];o&&I.push(Fn("bias",o.dataType,o.dims,b)),I.push(Dr("output",e[0].dataType,l,b)),w&&I.push(Dr("mean_data_output",1,f)),v&&I.push(Dr("inv_std_output",1,f));let R=[{name:"norm_count",type:"u32"},{name:"norm_size",type:"f32"},{name:"norm_size_vectorized",type:"u32"},{name:"epsilon",type:"f32"}];return` + ${C.registerUniforms(R).declareVariables(...I)} + ${C.mainStart()} + ${C.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.norm_count")} + let offset = global_idx * uniforms.norm_size_vectorized; + var mean_vector = ${G$("f32",b)}; + var mean_square_vector = ${G$("f32",b)}; + + for (var h: u32 = 0u; h < uniforms.norm_size_vectorized; h++) { + let value = ${um(E,b,"x[h + offset]")}; + mean_vector += value; + mean_square_vector += value * value; + } + let mean = ${Ph("mean_vector",b)} / uniforms.norm_size; + let inv_std_dev = inverseSqrt(${Ph("mean_square_vector",b)} / uniforms.norm_size ${r?"":"- mean * mean"} + uniforms.epsilon); + + for (var j: u32 = 0; j < uniforms.norm_size_vectorized; j++) { + let f32input = ${um(E,b,"x[j + offset]")}; + let f32scale = ${um(E,b,"scale[j]")}; + output[j + offset] = ${I[0].type.value}((f32input ${r?"":"- mean"}) * inv_std_dev * f32scale + ${o?`+ ${um(E,b,"bias[j]")}`:""} + ); + } + + ${w?"mean_data_output[global_idx] = mean":""}; + ${v?"inv_std_output[global_idx] = inv_std_dev":""}; + }`},z=[{dims:l,dataType:e[0].dataType}];return w&&z.push({dims:f,dataType:1}),v&&z.push({dims:f,dataType:1}),{name:"LayerNormalization",shaderCache:{hint:`${b};${n};${r}`,inputDependencies:g},getRunData:()=>({outputs:z,dispatchGroup:{x:Math.ceil(u/64)},programUniforms:y}),getShaderSource:m}},fU=(e,t)=>{dA(e.inputs),e.compute(hA(e.inputs,t,e.outputCount))}}),pA,mU,c0e=ur(()=>{vs(),Z4(),Q4(),pA=e=>{if(!e||e.length!==2)throw new Error("MatMul requires 2 inputs.");if(e[0].dims[e[0].dims.length-1]!==e[1].dims[e[1].dims.length-2])throw new Error("shared dimension does not match.")},mU=e=>{pA(e.inputs);let t=Nm.calcShape(e.inputs[0].dims,e.inputs[1].dims,!0);if(!t)throw new Error("Can't use matmul on the given tensors");let n=t[t.length-1],r=e.inputs[0].dims[e.inputs[0].dims.length-1];if(n<8&&r<8)e.compute(J4(e.inputs,{activation:""},t));else{let i=t[t.length-2],a=In.size(e.inputs[0].dims.slice(0,-2)),o=In.size(e.inputs[1].dims.slice(0,-2));if(a!==1&&i===1&&o===1){let l=e.inputs[0].reshape([1,a,r]),c=e.inputs[1].reshape([1,r,n]),u=[1,a,n],d=[l,c];e.compute(hw(d,{activation:""},t,u),{inputs:d})}else e.compute(hw(e.inputs,{activation:""},t))}}}),fA,mA,gA,gU,xU,u0e=ur(()=>{hs(),vs(),oa(),$s(),fA=(e,t)=>{if(e.length<3||e.length>4)throw new Error("MatMulNBits requires 3 or 4 inputs");let n=e[0],r=n.dims.length;if(n.dims[r-1]!==t.k)throw new Error("The last dim of input shape does not match the k value");let i=Math.floor((t.k+t.blockSize-1)/t.blockSize),a=t.blockSize/8*t.bits,o=e[1];if(!In.areEqual(o.dims,[t.n,i,a]))throw new Error("The second inputs must be 3D tensor with shape N X nBlocksPerCol X blobSize");let l=e[2].dims;if(In.size(l)!==t.n*i)throw new Error("scales input size error.");if(e.length===4){let c=e[3].dims,u=t.bits>4?t.n*i:t.n*Math.floor((i+1)/2);if(In.size(c)!==u)throw new Error("zeroPoints input size error.")}},mA=(e,t)=>{let n=e[0].dims,r=n.length,i=n[r-2],a=t.k,o=t.n,l=n.slice(0,r-2),c=In.size(l),u=e[1].dims[2]/4,d=e[0].dataType,h=Yi(t.k),p=Yi(u),f=Yi(o),b=l.concat([i,o]),g=i>1&&o/f%2===0?2:1,y=In.size(b)/f/g,w=64,v=[],m=[c,i,a/h],z=In.convertShape(e[1].dims).slice();z.splice(-1,1,u/p),v.push(...Yr(m)),v.push(...Yr(z)),v.push(...Yr(e[2].dims)),e.length===4&&v.push(...Yr(In.convertShape(e[3].dims)));let C=[c,i,o/f];v.push(...Yr(C));let E=I=>{let R=m.length,A=Fn("a",e[0].dataType,R,h),O=Fn("b",12,z.length,p),F=Fn("scales",e[2].dataType,e[2].dims.length),L=[A,O,F],X=e.length===4?Fn("zero_points",12,e[3].dims.length):void 0;X&&L.push(X);let T=C.length,q=Dr("output",e[0].dataType,T,f),H=Za(e[0].dataType),J=(()=>{switch(h){case 1:return`array<${H}, 8>`;case 2:return`mat4x2<${H}>`;case 4:return`mat2x4<${H}>`;default:throw new Error(`${h}-component is not supported.`)}})(),Z=()=>{let N=` + // reuse a data + var input_offset = ${A.indicesToOffset(`${A.type.indices}(batch, row, word_offset)`)}; + var a_data: ${J}; + for (var j: u32 = 0; j < ${8/h}; j++) { + a_data[j] = ${A.getByOffset("input_offset")}; + input_offset++; + } + `;for(let j=0;j> 4) & b_mask); + b_quantized_values = ${J}(${Array.from({length:4},(k,W)=>`${H}(b_value_lower[${W}]), ${H}(b_value_upper[${W}])`).join(", ")}); + b_dequantized_values = ${h===1?`${J}(${Array.from({length:8},(k,W)=>`(b_quantized_values[${W}] - ${X?`zero_point${j}`:"zero_point"}) * scale${j}`).join(", ")});`:`(b_quantized_values - ${J}(${Array(8).fill(`${X?`zero_point${j}`:"zero_point"}`).join(",")})) * scale${j};`}; + workgroup_shared[local_id.x * ${g} + ${Math.floor(j/f)}]${f>1?`[${j%f}]`:""} += ${Array.from({length:8/h},(k,W)=>`${h===1?`a_data[${W}] * b_dequantized_values[${W}]`:`dot(a_data[${W}], b_dequantized_values[${W}])`}`).join(" + ")}; + `;return N},B=()=>{let N=` + var col_index = col * ${f}; + ${X?` + let zero_point_bytes_per_col = (nBlocksPerCol + 1) / 2; + var zero_point_byte_count: u32; + var zero_point_word_index: u32; + var zero_point_byte_offset: u32; + let zero_point_nibble_offset: u32 = block & 0x1u; + var zero_point_bits_offset: u32; + var zero_point_word: u32;`:` + // The default zero point is 8 for unsigned 4-bit quantization. + let zero_point = ${H}(8);`} + `;for(let j=0;j> 0x1u); + zero_point_word_index = zero_point_byte_count >> 0x2u; + zero_point_byte_offset = zero_point_byte_count & 0x3u; + zero_point_bits_offset = (zero_point_byte_offset << 3) + (zero_point_nibble_offset << 2); + zero_point_word = ${X.getByOffset("zero_point_word_index")} >> zero_point_bits_offset; + let zero_point${j} = ${H}((zero_point_word) & 0xFu);`:""} + col_index += 1;`;return N},V=()=>{let N=`col_index = col * ${f};`;for(let j=0;j; + var b_value_upper: vec4; + var b_quantized_values: ${J}; + var b_dequantized_values: ${J};`,N};return` + var workgroup_shared: array<${q.type.value}, ${g*w}>; + ${I.declareVariables(...L,q)} + ${I.mainStart([w,1,1])} + let output_indices = ${q.offsetToIndices(`(global_idx / ${w}) * ${g}`)}; + let col = output_indices[2]; + let row = output_indices[1]; + let batch = output_indices[0]; + let nBlocksPerCol = uniforms.b_shape[1]; + + for (var block = local_id.x; block < nBlocksPerCol; block += ${w}) { + //process one block + var word_offset: u32 = block * ${t.blockSize/h}; + ${B()} + for (var word: u32 = 0; word < ${u}; word += ${p}) { + ${V()} + for (var i: u32 = 0; i < ${p}; i++) { + ${Z()} + word_offset += ${8/h}; + } + } + } + workgroupBarrier(); + + if (local_id.x < ${g}) { + var output_value: ${q.type.value} = ${q.type.value}(0); + var workgroup_shared_offset: u32 = local_id.x; + for (var b: u32 = 0u; b < ${w}u; b++) { + output_value += workgroup_shared[workgroup_shared_offset]; + workgroup_shared_offset += ${g}; + } + ${q.setByIndices(`${q.type.indices}(batch, row, col + local_id.x)`,"output_value")}; + } + }`};return{name:"MatMulNBits",shaderCache:{hint:`${t.blockSize};${t.bits};${h};${p};${f};${g};${w}`,inputDependencies:Array(e.length).fill("rank")},getRunData:()=>({outputs:[{dims:b,dataType:d}],dispatchGroup:{x:y},programUniforms:v}),getShaderSource:E}},gA=(e,t)=>{let n=e[0].dims,r=n.length,i=n[r-2],a=t.k,o=t.n,l=n.slice(0,r-2),c=In.size(l),u=e[1].dims[2]/4,d=e[0].dataType,h=Yi(t.k),p=Yi(u),f=l.concat([i,o]),b=128,g=o%8===0?8:o%4===0?4:1,y=b/g,w=y*p*8,v=w/h,m=w/t.blockSize,z=In.size(f)/g,C=[],E=[c,i,a/h],I=In.convertShape(e[1].dims).slice();I.splice(-1,1,u/p),C.push(...Yr(E)),C.push(...Yr(I)),C.push(...Yr(e[2].dims)),e.length===4&&C.push(...Yr(In.convertShape(e[3].dims)));let R=[c,i,o];C.push(...Yr(R));let A=O=>{let F=E.length,L=Fn("a",e[0].dataType,F,h),X=Fn("b",12,I.length,p),T=Fn("scales",e[2].dataType,e[2].dims.length),q=[L,X,T],H=e.length===4?Fn("zero_points",12,e[3].dims.length):void 0;H&&q.push(H);let J=R.length,Z=Dr("output",e[0].dataType,J),B=Za(e[0].dataType),V=()=>{switch(h){case 1:return` + let a_data0 = vec4<${B}>(sub_a[word_offset], sub_a[word_offset + 1], sub_a[word_offset + 2], sub_a[word_offset + 3]); + let a_data1 = vec4<${B}>(sub_a[word_offset + 4], sub_a[word_offset + 5], sub_a[word_offset + 6], sub_a[word_offset + 7]);`;case 2:return` + let a_data0 = vec4<${B}>(sub_a[word_offset], sub_a[word_offset + 1]); + let a_data1 = vec4<${B}>(sub_a[word_offset + 2], sub_a[word_offset + 3]);`;case 4:return` + let a_data0 = sub_a[word_offset]; + let a_data1 = sub_a[word_offset + 1];`;default:throw new Error(`${h}-component is not supported.`)}};return` + var sub_a: array<${L.type.value}, ${v}>; + var inter_results: array, ${g}>; + ${O.declareVariables(...q,Z)} + ${O.mainStart([y,g,1])} + let output_indices = ${Z.offsetToIndices(`workgroup_index * ${g}`)}; + let col = output_indices[2]; + let row = output_indices[1]; + let batch = output_indices[0]; + let n_blocks_per_col = uniforms.b_shape[1]; + let num_tiles = (n_blocks_per_col - 1) / ${m} + 1; + + // Loop over shared dimension. + for (var tile: u32 = 0; tile < num_tiles; tile += 1) { + let a_col_start = tile * ${v}; + // load one tile A data into shared memory. + for (var a_offset = local_idx; a_offset < ${v}; a_offset += ${b}) + { + let a_col = a_col_start + a_offset; + if (a_col < uniforms.a_shape[2]) + { + sub_a[a_offset] = ${L.getByIndices(`${L.type.indices}(batch, row, a_col)`)}; + } else { + sub_a[a_offset] = ${L.type.value}(0); + } + } + workgroupBarrier(); + + // each thread process one block + let b_row = col + local_id.y; + let block = tile * ${m} + local_id.x; + ${H?` + let zero_point_bytes_per_col = (n_blocks_per_col + 1) / 2; + let zero_point_byte_count = b_row * zero_point_bytes_per_col + (block >> 0x1u); + let zero_point_word_index = zero_point_byte_count >> 0x2u; + let zero_point_byte_offset = zero_point_byte_count & 0x3u; + let zero_point_nibble_offset: u32 = block & 0x1u; + let zero_point_bits_offset = (zero_point_byte_offset << 3) + (zero_point_nibble_offset << 2); + let zero_point_word = ${H.getByOffset("zero_point_word_index")} >> zero_point_bits_offset; + let zero_point = ${B}((zero_point_word) & 0xFu);`:` + // The default zero point is 8 for unsigned 4-bit quantization. + let zero_point = ${B}(8);`} + let scale = ${T.getByOffset("b_row * n_blocks_per_col + block")}; + let b_data = ${X.getByIndices(`${X.type.indices}(b_row, block, 0)`)}; + var word_offset = local_id.x * ${t.blockSize/h}; + for (var i: u32 = 0; i < ${p}; i++) { + ${V()} + let b_value = ${p===1?"b_data":"b_data[i]"}; + let b_value_lower = unpack4xU8(b_value & 0x0F0F0F0Fu); + let b_value_upper = unpack4xU8((b_value >> 4) & 0x0F0F0F0Fu); + let b_quantized_values = mat2x4<${B}>(${Array.from({length:4},(N,j)=>`${B}(b_value_lower[${j}]), ${B}(b_value_upper[${j}])`).join(", ")}); + let b_dequantized_values = (b_quantized_values - mat2x4<${B}>(${Array(8).fill("zero_point").join(",")})) * scale; + inter_results[local_id.y][local_id.x] += ${Array.from({length:2},(N,j)=>`${`dot(a_data${j}, b_dequantized_values[${j}])`}`).join(" + ")}; + word_offset += ${8/h}; + } + workgroupBarrier(); + } + + if (local_idx < ${g}) { + var output_value: ${Z.type.value} = ${Z.type.value}(0); + for (var b = 0u; b < ${y}; b++) { + output_value += inter_results[local_idx][b]; + } + if (col + local_idx < uniforms.output_shape[2]) + { + ${Z.setByIndices(`${Z.type.indices}(batch, row, col + local_idx)`,"output_value")} + } + } + }`};return{name:"BlockwiseMatMulNBits32",shaderCache:{hint:`${t.blockSize};${h};${p};${y};${g}`,inputDependencies:Array(e.length).fill("rank")},getRunData:()=>({outputs:[{dims:f,dataType:d}],dispatchGroup:{x:z},programUniforms:C}),getShaderSource:A}},gU=(e,t)=>{fA(e.inputs,t),t.blockSize===32&&e.adapterInfo.isVendor("intel")&&e.adapterInfo.isArchitecture("gen-12lp")?e.compute(gA(e.inputs,t)):e.compute(mA(e.inputs,t))},xU=e=>pi(e)}),xA,bA,yA,vA,wA,_A,zA,$A,bU,d0e=ur(()=>{hs(),vs(),$s(),xA=e=>{if(!e||e.length<1)throw new Error("Too few inputs");if(e[0].dataType!==1&&e[0].dataType!==10)throw new Error("Input type must be float or float16.");if(e.length>=2){let t=e[0].dims.length*2===e[1].dims[0];if(e.length===4&&(t=e[3].dims[0]*2===e[1].dims[0]),!t)throw new Error("The pads should be a 1D tensor of shape [2 * input_rank] or [2 * num_axes].")}},bA=(e,t,n)=>{let r="";for(let i=t-1;i>=0;--i)r+=` + k = i32(${e.indicesGet("indices",i)}) - ${Gr("uniforms.pads",i,n)}; + if (k < 0) { + break; + } + if (k >= i32(${Gr("uniforms.x_shape",i,t)})) { + break; + } + offset += k * i32(${Gr("uniforms.x_strides",i,t)}); + `;return` + value = ${e.type.value}(uniforms.constant_value); + for (var i = 0; i < 1; i++) { + var offset = 0; + var k = 0; + ${r} + value = x[offset]; + } + `},yA=(e,t,n)=>{let r="";for(let i=t-1;i>=0;--i)r+=` + k = i32(${e.indicesGet("indices",i)}) - ${Gr("uniforms.pads",i,n)}; + if (k < 0) { + k = -k; + } + { + let _2n_1 = 2 * (i32(${Gr("uniforms.x_shape",i,t)}) - 1); + k = k % _2n_1; + if(k >= i32(${Gr("uniforms.x_shape",i,t)})) { + k = _2n_1 - k; + } + } + offset += k * i32(${Gr("uniforms.x_strides",i,t)}); + `;return` + var offset = 0; + var k = 0; + ${r} + value = x[offset]; + `},vA=(e,t,n)=>{let r="";for(let i=t-1;i>=0;--i)r+=` + k = i32(${e.indicesGet("indices",i)}) - ${Gr("uniforms.pads",i,n)}; + if (k < 0) { + k = 0; + } + if (k >= i32(${Gr("uniforms.x_shape",i,t)})) { + k = i32(${Gr("uniforms.x_shape",i,t)}) - 1; + } + offset += k * i32(${Gr("uniforms.x_strides",i,t)}); + `;return` + var offset = 0; + var k = 0; + ${r} + value = x[offset]; + `},wA=(e,t,n)=>{let r="";for(let i=t-1;i>=0;--i)r+=` + k = i32(${e.indicesGet("indices",i)}) - ${Gr("uniforms.pads",i,n)}; + if (k < 0) { + k += i32(${Gr("uniforms.x_shape",i,t)}]); + } + if (k >= i32(${Gr("uniforms.x_shape",i,t)})) { + k -= i32(${Gr("uniforms.x_shape",i,t)}); + } + offset += k * i32(${Gr("uniforms.x_strides",i,t)}); + `;return` + var offset = 0; + var k = 0; + ${r} + value = x[offset]; + `},_A=(e,t,n)=>{switch(n.mode){case 0:return bA(e,t,n.pads.length);case 1:return yA(e,t,n.pads.length);case 2:return vA(e,t,n.pads.length);case 3:return wA(e,t,n.pads.length);default:throw new Error("Invalid mode")}},zA=(e,t)=>{let n=In.padShape(e[0].dims.slice(),t.pads),r=e[0].dims,i=In.size(n),a=[{type:12,data:i},{type:6,data:t.pads}],o=e.length>=3&&e[2].data;t.mode===0&&a.push({type:o?e[2].dataType:1,data:t.value}),a.push(...Yr(e[0].dims,n));let l=["rank"],c=u=>{let d=Dr("output",e[0].dataType,n.length),h=Fn("x",e[0].dataType,r.length),p=h.type.value,f=_A(d,r.length,t),b=[{name:"output_size",type:"u32"},{name:"pads",type:"i32",length:t.pads.length}];return t.mode===0&&b.push({name:"constant_value",type:o?p:"f32"}),` + ${u.registerUniforms(b).declareVariables(h,d)} + ${u.mainStart()} + ${u.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let indices = ${d.offsetToIndices("global_idx")}; + + var value = ${p}(0); + ${f} + output[global_idx] = value; + }`};return{name:"Pad",shaderCache:{hint:`${t.mode}${o}`,inputDependencies:l},getRunData:()=>({outputs:[{dims:n,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(In.size(n)/64)},programUniforms:a}),getShaderSource:c}},$A=(e,t)=>{if(e.length>1){let n=e[1].getBigInt64Array(),r=e.length>=3&&e[2].data?e[2].dataType===10?e[2].getUint16Array()[0]:e[2].getFloat32Array()[0]:0,i=e[0].dims.length,a=new Int32Array(2*i).fill(0);if(e.length>=4){let l=e[3].getBigInt64Array();for(let c=0;ca[Number(c)]=Number(l));let o=[];return a.forEach(l=>o.push(l)),{mode:t.mode,value:r,pads:o}}else return t},bU=(e,t)=>{xA(e.inputs);let n=$A(e.inputs,t);e.compute(zA(e.inputs,n),{inputs:[0]})}}),Bg,k3,A3,M3,T3,SA,jA,R3,P3,yU,vU,O3,wU,_U,L3,zU,$U,SU,jU,h0e=ur(()=>{xd(),hs(),vs(),$s(),Bg=e=>{if(Ui.webgpu.validateInputContent&&(!e||e.length!==1))throw new Error("Pool ops requires 1 input.")},k3=(e,t,n)=>{let r=t.format==="NHWC",i=e.dims.slice();r&&i.splice(1,0,i.pop());let a=Object.hasOwnProperty.call(t,"dilations"),o=t.kernelShape.slice(),l=t.strides.slice(),c=a?t.dilations.slice():[],u=t.pads.slice();uw.adjustPoolAttributes(n,i,o,l,c,u);let d=uw.computePoolOutputShape(n,i,l,c,o,u,t.autoPad),h=Object.assign({},t);a?Object.assign(h,{kernelShape:o,strides:l,pads:u,dilations:c,cacheKey:t.cacheKey}):Object.assign(h,{kernelShape:o,strides:l,pads:u,cacheKey:t.cacheKey});let p=d.slice();return p.push(p.splice(1,1)[0]),[h,r?p:d]},A3=(e,t)=>{let n=t.format==="NHWC",r=In.size(e),i=In.size(t.kernelShape),a=[{type:12,data:r},{type:12,data:i}],o=[{name:"outputSize",type:"u32"},{name:"kernelSize",type:"u32"}];if(t.kernelShape.length<=2){let l=t.kernelShape[t.kernelShape.length-1],c=t.strides[t.strides.length-1],u=t.pads[t.pads.length/2-1],d=t.pads[t.pads.length-1],h=!!(u+d);a.push({type:12,data:l},{type:12,data:c},{type:12,data:u},{type:12,data:d}),o.push({name:"kw",type:"u32"},{name:"sw",type:"u32"},{name:"pwStart",type:"u32"},{name:"pwEnd",type:"u32"});let p=!1;if(t.kernelShape.length===2){let f=t.kernelShape[t.kernelShape.length-2],b=t.strides[t.strides.length-2],g=t.pads[t.pads.length/2-2],y=t.pads[t.pads.length-2];p=!!(g+y),a.push({type:12,data:f},{type:12,data:b},{type:12,data:g},{type:12,data:y}),o.push({name:"kh",type:"u32"},{name:"sh",type:"u32"},{name:"phStart",type:"u32"},{name:"phEnd",type:"u32"})}return[a,o,!0,h,p]}else{if(n)throw new Error("Pooling with kernelShape.length > 2 is not supported for NHWC format.");let l=In.computeStrides(t.kernelShape);a.push({type:12,data:l},{type:12,data:t.pads},{type:12,data:t.strides}),o.push({name:"kernelStrides",type:"u32",length:l.length},{name:"pads",type:"u32",length:t.pads.length},{name:"strides",type:"u32",length:t.strides.length});let c=t.pads.reduce((u,d)=>u+d);return[a,o,!!c,!1,!1]}},M3=(e,t,n,r,i,a,o,l,c,u,d,h)=>{let p=i.format==="NHWC",f=t.type.value,b=Dr("output",t.type.tensor,r);if(i.kernelShape.length<=2){let g="",y="",w="",v=n-(p?2:1);if(d?g=` + for (var i: u32 = 0u; i < uniforms.kw; i++) { + xIndices[${v}] = indices[${v}] * uniforms.sw - uniforms.pwStart + i; + if (xIndices[${v}] < 0 || xIndices[${v}] + >= uniforms.x_shape[${v}]) { + pad++; + continue; + } + let x_val = x[${t.indicesToOffset("xIndices")}]; + ${a} + }`:g=` + for (var i: u32 = 0u; i < uniforms.kw; i++) { + xIndices[${v}] = indices[${v}] * uniforms.sw - uniforms.pwStart + i; + let x_val = x[${t.indicesToOffset("xIndices")}]; + ${a} + }`,i.kernelShape.length===2){let m=n-(p?3:2);h?y=` + for (var j: u32 = 0u; j < uniforms.kh; j++) { + xIndices[${m}] = indices[${m}] * uniforms.sh - uniforms.phStart + j; + if (xIndices[${m}] < 0 || xIndices[${m}] >= uniforms.x_shape[${m}]) { + pad += i32(uniforms.kw); + continue; + } + `:y=` + for (var j: u32 = 0u; j < uniforms.kh; j++) { + xIndices[${m}] = indices[${m}] * uniforms.sh - uniforms.phStart + j; + `,w=` + } + `}return` + ${e.registerUniforms(c).declareVariables(t,b)} + + ${e.mainStart()} + ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + + let indices = ${b.offsetToIndices("global_idx")}; + var xIndices = ${b.offsetToIndices("global_idx")}; + + var value = ${f}(${l}); + var pad = 0; + ${y} + ${g} + ${w} + ${o} + + output[global_idx] = value; + }`}else{if(p)throw new Error("Pooling with kernelShape.length > 2 is not supported for NHWC format.");let g=i.kernelShape.length,y=i.pads.length,w="";return u?w=` + if (xIndices[j] >= uniforms.x_shape[j]) { + pad++; + isPad = true; + break; + } + } + if (!isPad) { + let x_val = x[${t.indicesToOffset("xIndices")}]; + ${a} + }`:w=` + } + let x_val = x[${t.indicesToOffset("xIndices")}]; + ${a} + `,` + ${e.registerUniforms(c).declareVariables(t,b)} + + ${e.mainStart()} + ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + let indices = ${b.offsetToIndices("global_idx")}; + var xIndices = ${b.offsetToIndices("global_idx")}; + + var offsets: array; + + var value = ${f}(${l}); + var pad = 0; + var isPad = false; + + for (var i: u32 = 0u; i < uniforms.kernelSize; i++) { + var offset = i; + for (var j = 0u; j < ${g-1}u; j++) { + offsets[j] = offset / ${Gr("uniforms.kernelStrides","j",g)}; + offset -= offsets[j] * ${Gr("uniforms.kernelStrides","j",g)}; + } + offsets[${g-1}] = offset; + + isPad = false; + for (var j = ${n-g}u; j < ${n}u; j++) { + xIndices[j] = indices[j] * ${Gr("uniforms.strides",`j - ${n-g}u`,g)} + + offsets[j - ${n-g}u] - ${Gr("uniforms.pads","j - 2u",y)}; + ${w} + } + ${o} + + output[global_idx] = value; + }`}},T3=e=>`${e.format};${e.ceilMode};${e.autoPad};${e.kernelShape.length}`,SA=e=>`${T3(e)};${e.countIncludePad}`,jA=e=>`${T3(e)};${e.storageOrder};${e.dilations}`,R3=e=>({format:e.format,autoPad:["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][e.auto_pad],ceilMode:e.ceil_mode,kernelShape:e.kernel_shape,strides:e.strides,pads:e.pads}),P3=(e,t,n,r)=>{let[i,a]=k3(t,r,n),o=Fn("x",t.dataType,t.dims.length),l=o.type.value,c="value += x_val;",u="";i.countIncludePad?u+=`value /= ${l}(uniforms.kernelSize);`:u+=`value /= ${l}(i32(uniforms.kernelSize) - pad);`;let[d,h,p,f,b]=A3(a,i);d.push(...Yr(t.dims,a));let g=["rank"];return{name:e,shaderCache:{hint:`${r.cacheKey};${p};${f};${b}`,inputDependencies:g},getRunData:()=>({outputs:[{dims:a,dataType:t.dataType}],dispatchGroup:{x:Math.ceil(In.size(a)/64)},programUniforms:d}),getShaderSource:y=>M3(y,o,t.dims.length,a.length,i,c,u,0,h,p,f,b)}},yU=e=>{let t=e.count_include_pad!==0,n=R3(e);if(n.ceilMode!==0)throw new Error("using ceil() in shape computation is not yet supported for AveragePool");let r={countIncludePad:t,...n,cacheKey:""};return{...r,cacheKey:SA(r)}},vU=(e,t)=>{Bg(e.inputs),e.compute(P3("AveragePool",e.inputs[0],!1,t))},O3={autoPad:"",ceilMode:0,countIncludePad:!1,kernelShape:[],strides:[],pads:[],storageOrder:0,dilations:[]},wU=e=>{let t=e.format;return{format:t,...O3,cacheKey:t}},_U=(e,t)=>{Bg(e.inputs),e.compute(P3("GlobalAveragePool",e.inputs[0],!0,t))},L3=(e,t,n,r)=>{let[i,a]=k3(t,r,n),o=` + value = max(x_val, value); + `,l="",c=Fn("x",t.dataType,t.dims.length),u=["rank"],[d,h,p,f,b]=A3(a,i);return d.push(...Yr(t.dims,a)),{name:e,shaderCache:{hint:`${r.cacheKey};${p};${f};${b}`,inputDependencies:u},getRunData:()=>({outputs:[{dims:a,dataType:t.dataType}],dispatchGroup:{x:Math.ceil(In.size(a)/64)},programUniforms:d}),getShaderSource:g=>M3(g,c,t.dims.length,a.length,i,o,l,t.dataType===10?-65504:-1e5,h,p,f,b)}},zU=(e,t)=>{Bg(e.inputs),e.compute(L3("MaxPool",e.inputs[0],!1,t))},$U=e=>{let t=e.storage_order,n=e.dilations,r=R3(e);if(t!==0)throw new Error("column major storage order is not yet supported for MaxPool");if(r.ceilMode!==0)throw new Error("using ceil() in shape computation is not yet supported for MaxPool");let i={storageOrder:t,dilations:n,...r,cacheKey:""};return{...i,cacheKey:jA(i)}},SU=e=>{let t=e.format;return{format:t,...O3,cacheKey:t}},jU=(e,t)=>{Bg(e.inputs),e.compute(L3("GlobalMaxPool",e.inputs[0],!0,t))}}),CA,NA,CU,NU,p0e=ur(()=>{hs(),vs(),oa(),$s(),CA=(e,t)=>{if(e.length<2||e.length>3)throw new Error("DequantizeLinear requires 2 or 3 inputs.");if(e.length===3&&e[1].dims===e[2].dims)throw new Error("x-scale and x-zero-point must have the same shape.");if(e.length===3&&e[0].dataType!==e[2].dataType)throw new Error("x and x-zero-point must have the same data type.");if(e[0].dataType===6&&e.length>2)throw new Error("In the case of dequantizing int32 there is no zero point.");if(e[1].dims.length!==0&&e[1].dims.length!==1&&e[1].dims.length!==e[0].dims.length)throw new Error("scale input must be a scalar, a 1D tensor, or have the same rank as the input tensor.");if(e.length>2){if(e[0].dataType!==e[2].dataType)throw new Error("x and x-zero-point must have the same data type.");if(e[1].dims.length!==e[2].dims.length)throw new Error("scale and zero-point inputs must have the same rank.");if(!e[1].dims.map((n,r)=>n===e[2].dims[r]).reduce((n,r)=>n&&r,!0))throw new Error("scale and zero-point inputs must have the same shape.")}if(t.blockSize>0){if(e[1].dims.length===0||e[1].dims.length===1&&e[1].dims[0]===1)throw new Error("blockSize must be set only for block quantization.");if(!e[1].dims.map((i,a)=>a===t.axis||i===e[0].dims[a]).reduce((i,a)=>i&&a,!0))throw new Error("For block qunatization, scale input shape to match the input shape except for the axis");if(e[1].dims.length!==e[0].dims.length)throw new Error("For block qunatization the scale input rank must be the same as the x rank.");let n=e[0].dims[t.axis],r=e[1].dims[t.axis];if(t.blockSizeMath.ceil(n/(r-1)-1))throw new Error("blockSize must be with in the range [ceil(dI / Si), ceil(dI / (Si - 1) - 1)].")}},NA=(e,t)=>{let n=In.normalizeAxis(t.axis,e[0].dims.length),r=e[0].dataType,i=r===3,a=e[0].dims,o=e[1].dataType,l=In.size(a),c=r===3||r===2,u=c?[Math.ceil(In.size(e[0].dims)/4)]:e[0].dims,d=e[1].dims,h=e.length>2?e[2]:void 0,p=h?c?[Math.ceil(In.size(h.dims)/4)]:h.dims:void 0,f=d.length===0||d.length===1&&d[0]===1,b=f===!1&&d.length===1,g=Yi(l),y=f&&(!c||g===4),w=y?g:1,v=y&&!c?g:1,m=Fn("input",c?12:r,u.length,v),z=Fn("scale",o,d.length),C=h?Fn("zero_point",c?12:r,p.length):void 0,E=Dr("output",o,a.length,w),I=[m,z];C&&I.push(C);let R=[u,d];h&&R.push(p);let A=[{type:12,data:l/w},{type:12,data:n},{type:12,data:t.blockSize},...Yr(...R,a)],O=F=>{let L=[{name:"output_size",type:"u32"},{name:"axis",type:"u32"},{name:"block_size",type:"u32"}];return` + ${F.registerUniforms(L).declareVariables(...I,E)} + ${F.mainStart()} + ${F.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let output_indices = ${E.offsetToIndices("global_idx")}; + + // Set input x + ${c?` + let input = ${m.getByOffset("global_idx / 4")}; + let x_vec = ${i?"unpack4xI8(input)":"unpack4xU8(input)"}; + let x_value = ${w===1?"x_vec[global_idx % 4]":"x_vec"};`:`let x_value = ${m.getByOffset("global_idx")};`}; + + // Set scale input + ${f?`let scale_value= ${z.getByOffset("0")}`:b?` + let scale_index = ${E.indicesGet("output_indices","uniforms.axis")}; + let scale_value= ${z.getByOffset("scale_index")};`:` + var scale_indices: ${z.type.indices} = output_indices; + let index = ${z.indicesGet("scale_indices","uniforms.axis")} / uniforms.block_size; + ${z.indicesSet("scale_indices","uniforms.axis","index")}; + let scale_value= ${z.getByIndices("scale_indices")};`}; + + // Set zero-point input + ${C?f?c?` + let zero_point_input = ${C.getByOffset("0")}; + let zero_point_vec = ${i?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; + let zero_point_value= zero_point_vec[0]`:`let zero_point_value = ${C.getByOffset("0")}`:b?c?` + let zero_point_index = ${E.indicesGet("output_indices","uniforms.axis")}; + let zero_point_input = ${C.getByOffset("zero_point_index / 4")}; + let zero_point_vec = ${i?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; + let zero_point_value = zero_point_vec[zero_point_index % 4]`:` + let zero_point_index = ${E.indicesGet("output_indices","uniforms.axis")}; + let zero_point_value = ${C.getByOffset("zero_point_index")};`:c?` + let zero_point_offset = ${z.indicesToOffset("scale_indices")}; + let zero_point_input = ${C.getByOffset("zero_point_offset / 4")}; + let zero_point_vec = ${i?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; + let zero_point_value = zero_point_vec[zero_point_offset % 4];`:`let zero_point_value = ${C.getByIndices("scale_indices")};`:`let zero_point_value = ${c?i?"i32":"u32":m.type.value}(0);`}; + // Compute and write output + ${E.setByOffset("global_idx",`${E.type.value}(x_value - zero_point_value) * scale_value`)}; + }`};return{name:"DequantizeLinear",shaderCache:{hint:t.cacheKey,inputDependencies:C?["rank","rank","rank"]:["rank","rank"]},getShaderSource:O,getRunData:()=>({outputs:[{dims:a,dataType:o}],dispatchGroup:{x:Math.ceil(l/w/64),y:1,z:1},programUniforms:A})}},CU=(e,t)=>{CA(e.inputs,t),e.compute(NA(e.inputs,t))},NU=e=>pi({axis:e.axis,blockSize:e.blockSize})}),EA,IA,EU,f0e=ur(()=>{xd(),hs(),$s(),EA=(e,t,n)=>{let r=e===t,i=et&&n>0;if(r||i||a)throw new Error("Range these inputs' contents are invalid.")},IA=(e,t,n,r)=>{let i=Math.abs(Math.ceil((t-e)/n)),a=[i],o=i,l=[{type:12,data:o},{type:r,data:e},{type:r,data:n},...Yr(a)],c=u=>{let d=Dr("output",r,a.length),h=d.type.value,p=[{name:"outputSize",type:"u32"},{name:"start",type:h},{name:"delta",type:h}];return` + ${u.registerUniforms(p).declareVariables(d)} + ${u.mainStart()} + ${u.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + output[global_idx] = uniforms.start + ${h}(global_idx) * uniforms.delta; + }`};return{name:"Range",shaderCache:{hint:`${r}`},getShaderSource:c,getRunData:()=>({outputs:[{dims:a,dataType:r}],dispatchGroup:{x:Math.ceil(o/64)},programUniforms:l})}},EU=e=>{let t=0,n=0,r=0;e.inputs[0].dataType===6?(t=e.inputs[0].getInt32Array()[0],n=e.inputs[1].getInt32Array()[0],r=e.inputs[2].getInt32Array()[0]):e.inputs[0].dataType===1&&(t=e.inputs[0].getFloat32Array()[0],n=e.inputs[1].getFloat32Array()[0],r=e.inputs[2].getFloat32Array()[0]),Ui.webgpu.validateInputContent&&EA(t,n,r),e.compute(IA(t,n,r,e.inputs[0].dataType),{inputs:[]})}}),kA,AA,IU,kU,m0e=ur(()=>{hs(),vs(),oa(),$s(),kA=(e,t,n,r)=>{if(e!=="none"&&r!=="i32"&&r!=="u32"&&r!=="f32")throw new Error(`Input ${r} is not supported with reduction ${e}.`);let i=`{ + var oldValue = 0; + loop { + let newValueF32 =`,a=`; + let newValue = bitcast(newValueF32); + let res = atomicCompareExchangeWeak(&${t}, oldValue, newValue); + if res.exchanged { + break; + } + oldValue = res.old_value; + } + }`;switch(e){case"none":return`${t}=${n};`;case"add":return r==="i32"||r==="u32"?`atomicAdd(&${t}, bitcast<${r}>(${n}));`:` + ${i}bitcast<${r}>(oldValue) + (${n})${a}`;case"max":return r==="i32"||r==="u32"?`atomicMax(&${t}, bitcast<${r}>(${n}));`:` + ${i}max(bitcast(oldValue), (${n}))${a}`;case"min":return r==="i32"||r==="u32"?`atomicMin(&${t}, bitcast<${r}>(${n}));`:`${i}min(bitcast<${r}>(oldValue), (${n}))${a}`;case"mul":return`${i}(bitcast<${r}>(oldValue) * (${n}))${a}`;default:throw new Error(`Reduction ${e} is not supported.`)}},AA=(e,t)=>{let n=e[0].dims,r=e[1].dims,i=n,a=1,o=Math.ceil(In.size(r)/a),l=r[r.length-1],c=In.sizeFromDimension(n,l),u=[{type:12,data:o},{type:12,data:l},{type:12,data:c},...Yr(e[1].dims,e[2].dims,i)],d=h=>{let p=Fn("indices",e[1].dataType,e[1].dims.length),f=Fn("updates",e[2].dataType,e[2].dims.length,a),b=t.reduction!=="none"&&t.reduction!==""?oL("output",e[0].dataType,i.length):Dr("output",e[0].dataType,i.length,a);return` + ${h.registerUniform("output_size","u32").registerUniform("last_index_dimension","u32").registerUniform("num_updates_elements","u32").declareVariables(p,f,b)} + ${h.mainStart()} + ${h.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + var hasDuplicates = false; + if (${t.reduction==="none"}) { + let n = ${In.size(r)}; + for (var i = 0; i < n; i = i + 1) { + for (var j = i + 1; j < n; j = j + 1) { + var index_i = i32(indices[i].x); + var index_j = i32(indices[j].x); + if (index_i == index_j) { + hasDuplicates = true; + break; + } + } + if (hasDuplicates) { + break; + } + } + } + + var data_offset = 0u; + var indices_start = uniforms.last_index_dimension * global_idx; + if (${t.reduction==="none"} && hasDuplicates) { + if (global_idx != 0u) { + return; + } + indices_start = 0u; + } + let indices_end = indices_start + uniforms.last_index_dimension; + for (var i = indices_start; i < indices_end; i++) { + var index = i32(indices[i].x); + ${e[0].dims.length===1?` + let element_count_dim = uniforms.output_strides; + let dim_value = uniforms.output_shape;`:` + let element_count_dim = uniforms.output_strides[i - indices_start]; + let dim_value = uniforms.output_shape[i - indices_start + uniforms.last_index_dimension];`} + if (index >= 0) { + if (index >= i32(dim_value)) { + index = i32(dim_value - 1); + } + } else { + if (index < -i32(dim_value)) { + index = 0; + } else { + index += i32(dim_value); + } + } + data_offset += u32((u32(index) * element_count_dim)); + } + + for (var i = 0u; i < uniforms.num_updates_elements; i++) { + let value = updates[uniforms.num_updates_elements * global_idx + i]; + ${kA(t.reduction,"output[data_offset + i]","value",b.type.value)} + } + + }`};return{name:"ScatterND",shaderCache:{hint:`${t.cacheKey}_${t.reduction}`,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:i,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(o/64)},programUniforms:u}),getShaderSource:d}},IU=e=>pi({reduction:e.reduction}),kU=(e,t)=>{e.compute(AA(e.inputs,t),{inputs:[e.inputs[1],e.inputs[2]],outputs:[]})}}),MA,TA,RA,B3,PA,OA,LA,BA,UA,FA,WA,DA,U3,VA,HA,GA,qA,KA,AU,MU,g0e=ur(()=>{hs(),vs(),oa(),$s(),MA=(e,t)=>{if(e.every(n=>n>0||(()=>{throw new Error("Resize requires scales input values to be positive")})),e.length>0){if(t.mode==="linear"){if(!(e.length===2||e.length===3||e.length===4&&e[0]===1&&e[1]===1||e.length===4&&e[0]===1&&e[3]===1||e.length===5&&e[0]===1&&e[1]===1))throw new Error(`For linear mode, Resize requires scales to be 2D, 3D, 4D with either two outermost or one innermost and + one outermost scale values equal to 1, or 5D with two outermost scale values equal to 1`)}else if(t.mode==="cubic"&&!(e.length===2||e.length===4&&e[0]===1&&e[1]===1||e.length===4&&e[0]===1&&e[3]===1))throw new Error("Resize requires scales input size to be 2 or 4 for cubic mode")}},TA=(e,t,n)=>{t.every(i=>i>=0&&i{throw new Error("Resize requires axes input values to be positive and less than rank")}));let r=new Array(n).fill(1);return t.forEach((i,a)=>r[i]=e[a]),r},RA=(e,t,n,r,i,a)=>{let[o,l,c]=n>10?[1,2,3]:[-1,e.length>1?1:-1,-1],u=e[0].dims.length;if(o>0&&e.length>o&&e[o].dims.length>0)e[o].getFloat32Array().forEach(d=>a.push(d));else if(t.coordinateTransformMode==="tf_crop_and_resize")throw new Error("Resize requires RoI input to be specified when coordinateTransformMode is tfCropAndResize");if(l>0&&e.length>l&&e[l].dims.length===1&&e[l].dims[0]>0){if(e[l].getFloat32Array().forEach(d=>r.push(d)),r.length!==0&&r.length!==u&&n>=18&&r.length!==t.axes.length)throw new Error("Resize requires scales input size to be same as input rank or axes size for opset 18 and up");MA(r,t),t.axes.length>0&&TA(r,t.axes,u).forEach((d,h)=>r[h]=d)}if(c>0&&e.length>c&&e[c].dims.length===1&&e[c].dims[0]>0&&(e[c].getBigInt64Array().forEach(d=>i.push(Number(d))),i.length!==0&&i.length!==u&&n>=18&&i.length!==t.axes.length))throw new Error("Resize requires sizes input size to be same as input rank or axes size for opset 18 and up");if(t.axes.length>0){if(r.length!==0&&r.length!==t.axes.length)throw new Error('Resize requires "scales" input size to be of axes rank when axes attributes is specified');if(i.length!==0&&i.length!==t.axes.length)throw new Error('Resize requires "sizes" input size to be of rank axes rank when axes attributes is specified')}if(typeof r<"u"&&typeof i<"u"&&r.length>0&&i.length>u)throw new Error("Resize requires only of scales or sizes to be specified")},B3=(e,t,n,r)=>` + // The whole part and the fractional part are calculated separately due to inaccuracy of floating + // point division. As an example, f32(21) / f32(7) may evaluate to 2.99... instead of 3, causing an + // offset-by-one error later in floor(). + let big = (${e}) * (${t}); + let whole = ${r}(big / (${n})); + let fract = ${r}(big % (${n})) / ${r}(${n}); + return whole + fract; +`,PA=(e,t)=>`fn getOriginalCoordinateFromResizedCoordinate(xResized: u32, xScale: f32, lengthResized: u32, + lengthOriginal: u32, roiStart: f32, roiEnd: f32) -> ${t} { `+(()=>{switch(e){case"asymmetric":return` + if (xScale < 1.0 || floor(xScale) != xScale) { + return ${t}(xResized) / ${t}(xScale); + } else { + ${B3("xResized","lengthOriginal","lengthResized",t)} + } + `;case"pytorch_half_pixel":return`if (lengthResized > 1) { + return (${t}(xResized) + 0.5) / ${t}(xScale) - 0.5; + } else { + return 0.0; + }`;case"tf_half_pixel_for_nn":return`return (${t}(xResized) + 0.5) / ${t}(xScale);`;case"align_corners":return`if (lengthResized == 1) { + return 0.0; + } else { + ${B3("xResized","lengthOriginal - 1","lengthResized - 1",t)} + }`;case"tf_crop_and_resize":return`if (lengthResized > 1) { + return ${t}(roiStart) * ${t}(lengthOriginal - 1) + + (${t}(xResized) * ${t}(roiEnd - roiStart) * ${t}(lengthOriginal - 1)) / + ${t}(lengthResized - 1); + } else { + return 0.5 * ${t}(roiStart + roiEnd) * ${t}(lengthOriginal - 1); + }`;case"half_pixel_symmetric":return`const outputWidth = ${t}xScale * ${t}(lengthResized); + const adjustment = ${t}(lengthResized) / outputWidth; + const center = ${t}(lengthOriginal) / 2; + const offset = center * (1 - adjustment); + return offset + ((${t}(xResized) + 0.5) / ${t}(xScale)) - 0.5;`;case"half_pixel":return`return ((${t}(xResized) + 0.5) / ${t}(xScale)) - 0.5;`;default:throw new Error(`Coordinate transform mode ${e} is not supported`)}})()+"}",OA=(e,t,n)=>`fn getNearestPixelFromOriginal(xOriginal: ${n}, isDownSample: bool) -> ${n} {`+(()=>{switch(e){case"round_prefer_ceil":return"if (fract(xOriginal) == 0.5) { return ceil(xOriginal); } else { return round(xOriginal); }";case"floor":return"return floor(xOriginal);";case"ceil":return"return ceil(xOriginal);";case"round_prefer_floor":return"if (fract(xOriginal) == 0.5) { return floor(xOriginal); } else { return round(xOriginal); }";case"simple":default:if(t<11)return"if (isDownSample) { return ceil(xOriginal); } else { return xOriginal; }";throw new Error(`Nearest mode ${e} is not supported`)}})()+"}",LA=(e,t,n)=>{let r=new Array(n).fill(0).concat(new Array(n).fill(1)),i=e.length===0?r:e.slice();return t.length>0?(t.forEach((a,o)=>{r[a]=i[o],r[o+n]=i[t.length+o]}),r):i},BA=(e,t,n,r)=>{let i=[];if(n.length>0)if(r.length>0){if(e.forEach(a=>i.push(a)),Math.max(...r)>e.length)throw new Error("axes is out of bound");r.forEach((a,o)=>i[a]=n[o])}else n.forEach(a=>i.push(a));else{if(t.length===0)throw new Error("Resize requires either scales or sizes.");i=e.map((a,o)=>Math.round(a*t[o]))}return i},UA=(e,t,n)=>{let r=(()=>{switch(n.keepAspectRatioPolicy){case"not_larger":return n.axes.length>0?Math.min(...n.axes.map(a=>t[a]),Number.MAX_VALUE):Math.min(...t,Number.MAX_VALUE);case"not_smaller":return n.axes.length>0?Math.max(...n.axes.map(a=>t[a]),Number.MIN_VALUE):Math.max(...t,Number.MIN_VALUE);default:throw new Error(`Keep aspect ratio policy ${n.keepAspectRatioPolicy} is not supported`)}})();t.fill(1,0,t.length);let i=e.slice();return n.axes.length>0?(n.axes.forEach(a=>t[a]=r),n.axes.forEach(a=>i[a]=Math.round(e[a]*t[a]))):(t.fill(r,0,t.length),i.forEach((a,o)=>i[o]=Math.round(a*t[o]))),i},FA=(e,t,n,r,i)=>` + fn calculateOriginalIndicesFromOutputIndices(output_indices: ${e.type.indices}) -> array<${e.type.value}, ${n.length}> { + var original_indices: array<${e.type.value}, ${n.length}>; + for (var i:u32 = 0; i < ${n.length}; i++) { + var output_index = ${e.indicesGet("output_indices","i")}; + var scale = ${Gr("uniforms.scales","i",r)}; + var roi_low = ${Gr("uniforms.roi","i",i)}; + var roi_hi = ${Gr("uniforms.roi",`i + ${t.length}`,i)}; + if (scale == 1.0) { + original_indices[i] = ${e.type.value}(output_index); + } else { + var input_shape_i = ${Gr("uniforms.input_shape","i",t.length)}; + var output_shape_i = ${Gr("uniforms.output_shape","i",n.length)}; + original_indices[i] = getOriginalCoordinateFromResizedCoordinate(output_index, scale, output_shape_i, + input_shape_i, roi_low, roi_hi); + } + } + return original_indices; + }`,WA=(e,t,n,r,i,a,o)=>` + fn calculateInputIndicesFromOutputIndices(output_indices: ${t.type.indices}) -> ${e.type.indices} { + var input_indices: ${e.type.indices}; + for (var i:u32 = 0; i < ${r.length}; i++) { + var output_index = ${t.indicesGet("output_indices","i")}; + var input_index: u32; + var scale = ${Gr("uniforms.scales","i",i)}; + if (scale == 1.0) { + input_index = output_index; + } else { + var roi_low = ${Gr("uniforms.roi","i",a)}; + var roi_hi = ${Gr("uniforms.roi",`i + ${n.length}`,a)}; + var input_shape_i = ${Gr("uniforms.input_shape","i",n.length)}; + var output_shape_i = ${Gr("uniforms.output_shape","i",r.length)}; + var original_idx = getOriginalCoordinateFromResizedCoordinate(output_index, scale, output_shape_i, + input_shape_i, roi_low, roi_hi); + if (!${o} || (original_idx >= 0 && original_idx < ${t.type.value}(input_shape_i))) { + if (original_idx < 0) { + input_index = 0; + } else if (original_idx > ${t.type.value}(input_shape_i - 1)) { + input_index = input_shape_i - 1; + } else { + input_index = u32(getNearestPixelFromOriginal(original_idx, scale < 1)); + } + } else { + input_index = u32(original_idx); + } + } + ${e.indicesSet("input_indices","i","input_index")} + } + return input_indices; + }`,DA=(e,t)=>` + fn checkInputIndices(input_indices: ${e.type.indices}) -> bool { + for (var i:u32 = 0; i < ${t.length}; i++) { + var input_index = ${e.indicesGet("input_indices","i")}; + if (input_index < 0 || input_index >= ${Gr("uniforms.input_shape","i",t.length)}) { + return false; + } + } + return true; + }`,U3=(e,t,n,r)=>e.rank>r?` + ${e.indicesSet("input_indices",t,"channel")}; + ${e.indicesSet("input_indices",n,"batch")}; +`:"",VA=(e,t,n,r,i)=>{let[a,o,l,c]=n.length===2?[-1,0,1,-1]:[0,2,3,1],u=e.type.value;return` + fn getInputValue(batch: u32, channel: u32, row: u32, col: u32) -> ${u} { + var input_indices: ${e.type.indices}; + ${e.indicesSet("input_indices",o,`max(0, min(row, ${n[o]} - 1))`)}; + ${e.indicesSet("input_indices",l,`max(0, min(col, ${n[l]} - 1))`)}; + ${U3(e,c,a,2)} + return ${e.getByIndices("input_indices")}; + } + + fn bilinearInterpolation(output_indices: ${t.type.indices}) -> ${u} { + var originalIndices = calculateOriginalIndicesFromOutputIndices(output_indices); + var row:${u} = originalIndices[${o}]; + var col:${u} = originalIndices[${l}]; + ${r?`if (row < 0 || row > (${n[o]} - 1) || col < 0 || col > (${n[l]} - 1)) { + return ${i}; + }`:""}; + row = max(0, min(row, ${n[o]} - 1)); + col = max(0, min(col, ${n[l]} - 1)); + var row1: u32 = u32(row); + var col1: u32 = u32(col); + var row2: u32 = u32(row + 1); + var col2: u32 = u32(col + 1); + var channel: u32 = ${n.length>2?`u32(originalIndices[${c}])`:"0"}; + var batch: u32 = ${n.length>2?`u32(originalIndices[${a}])`:"0"}; + var x11: ${u} = getInputValue(batch, channel, row1, col1); + var x12: ${u} = getInputValue(batch, channel, row1, col2); + var x21: ${u} = getInputValue(batch, channel, row2, col1); + var x22: ${u} = getInputValue(batch, channel, row2, col2); + var dx1: ${u} = abs(row - ${u}(row1)); + var dx2: ${u} = abs(${u}(row2) - row); + var dy1: ${u} = abs(col - ${u}(col1)); + var dy2: ${u} = abs(${u}(col2) - col); + if (row1 == row2) { + dx1 = 0.5; + dx2 = 0.5; + } + if (col1 == col2) { + dy1 = 0.5; + dy2 = 0.5; + } + return (x11 * dx2 * dy2 + x12 * dx2 * dy1 + x21 * dx1 * dy2 + x22 * dx1 * dy1); + }`},HA=(e,t,n,r,i,a,o,l,c,u)=>{let d=n.length===2,[h,p]=d?[0,1]:[2,3],f=e.type.value,b=g=>{let y=g===h?"row":"col";return` + fn ${y}CubicInterpolation(input_indices: ${e.type.indices}, output_indices: ${t.type.indices}) -> ${f} { + var output_index = ${t.indicesGet("output_indices",g)}; + var originalIdx: ${f} = getOriginalCoordinateFromResizedCoordinate(output_index, ${i[g]}, + ${r[g]}, ${n[g]}, ${a[g]}, ${a[g]} + ${n.length}); + var fractOriginalIdx: ${f} = originalIdx - floor(originalIdx); + var coefs = getCubicInterpolationCoefs(fractOriginalIdx); + + if (${l} && (originalIdx < 0 || originalIdx > (${n[g]} - 1))) { + return ${c}; + } + var data: array<${f}, 4> = array<${f}, 4>(0.0, 0.0, 0.0, 0.0); + for (var i: i32 = -1; i < 3; i++) { + var ${y}: ${f} = originalIdx + ${f}(i); + if (${y} < 0 || ${y} >= ${n[g]}) { + ${u?`coefs[i + 1] = 0.0; + continue;`:l?`return ${c};`:`${y} = max(0, min(${y}, ${n[g]} - 1));`}; + } + var input_indices_copy: ${e.type.indices} = input_indices; + ${e.indicesSet("input_indices_copy",g,`u32(${y})`)}; + data[i + 1] = ${g===h?e.getByIndices("input_indices_copy"):"rowCubicInterpolation(input_indices_copy, output_indices)"}; + } + return cubicInterpolation1D(data, coefs); + }`};return` + ${b(h)}; + ${b(p)}; + fn getCubicInterpolationCoefs(s: ${f}) -> array<${f}, 4> { + var absS = abs(s); + var coeffs: array<${f}, 4> = array<${f}, 4>(0.0, 0.0, 0.0, 0.0); + var oneMinusAbsS: ${f} = 1.0 - absS; + var twoMinusAbsS: ${f} = 2.0 - absS; + var onePlusAbsS: ${f} = 1.0 + absS; + coeffs[0] = ((${o} * onePlusAbsS - 5 * ${o}) * onePlusAbsS + 8 * ${o}) * onePlusAbsS - 4 * ${o}; + coeffs[1] = ((${o} + 2) * absS - (${o} + 3)) * absS * absS + 1; + coeffs[2] = ((${o} + 2) * oneMinusAbsS - (${o} + 3)) * oneMinusAbsS * oneMinusAbsS + 1; + coeffs[3] = ((${o} * twoMinusAbsS - 5 * ${o}) * twoMinusAbsS + 8 * ${o}) * twoMinusAbsS - 4 * ${o}; + return coeffs; + } + + fn cubicInterpolation1D(x: array<${f}, 4>, coefs: array<${f}, 4>) -> ${f} { + var coefsSum: ${f} = coefs[0] + coefs[1] + coefs[2] + coefs[3]; + return (x[0] * coefs[0] + x[1] * coefs[1]+ x[2] * coefs[2]+ x[3] * coefs[3]) / coefsSum; + } + + fn bicubicInterpolation(output_indices: ${t.type.indices}) -> ${f} { + var input_indices: ${e.type.indices} = output_indices; + return colCubicInterpolation(input_indices, output_indices); + } + `},GA=(e,t,n,r,i)=>{let[a,o,l,c,u]=n.length===3?[-1,0,1,2,-1]:[0,2,3,4,1],d=e.type.value;return` + fn getInputValue(batch: u32, channel: u32, depth:u32, height: u32, width: u32) -> ${d} { + var input_indices: ${e.type.indices}; + ${e.indicesSet("input_indices",o,`max(0, min(depth, ${n[o]} - 1))`)}; + ${e.indicesSet("input_indices",l,`max(0, min(height, ${n[l]} - 1))`)}; + ${e.indicesSet("input_indices",c,`max(0, min(width, ${n[c]} - 1))`)}; + ${U3(e,u,a,3)} + return ${e.getByIndices("input_indices")}; + } + + fn trilinearInterpolation(output_indices: ${t.type.indices}) -> ${d} { + var originalIndices = calculateOriginalIndicesFromOutputIndices(output_indices); + var depth:${d} = originalIndices[${o}]; + var height:${d} = originalIndices[${l}]; + var width:${d} = originalIndices[${c}]; + ${r?`if (depth < 0 || depth > (${n[o]} - 1) || height < 0 || height > (${n[l]} - 1) || width < 0 || (width > ${n[c]} - 1)) { + return ${i}; + }`:""}; + + depth = max(0, min(depth, ${n[o]} - 1)); + height = max(0, min(height, ${n[l]} - 1)); + width = max(0, min(width, ${n[c]} - 1)); + var depth1: u32 = u32(depth); + var height1: u32 = u32(height); + var width1: u32 = u32(width); + var depth2: u32 = u32(depth + 1); + var height2: u32 = u32(height + 1); + var width2: u32 = u32(width + 1); + var channel: u32 = ${n.length>3?`u32(originalIndices[${u}])`:"0"}; + var batch: u32 = ${n.length>3?`u32(originalIndices[${a}])`:"0"}; + + var x111: ${d} = getInputValue(batch, channel, depth1, height1, width1); + var x112: ${d} = getInputValue(batch, channel, depth1, height1, width2); + var x121: ${d} = getInputValue(batch, channel, depth1, height2, width1); + var x122: ${d} = getInputValue(batch, channel, depth1, height2, width2); + var x211: ${d} = getInputValue(batch, channel, depth2, height1, width1); + var x212: ${d} = getInputValue(batch, channel, depth2, height1, width2); + var x221: ${d} = getInputValue(batch, channel, depth2, height2, width1); + var x222: ${d} = getInputValue(batch, channel, depth2, height2, width2); + var dx1: ${d} = abs(depth - ${d}(depth1)); + var dx2: ${d} = abs(${d}(depth2) - depth); + var dy1: ${d} = abs(height - ${d}(height1)); + var dy2: ${d} = abs(${d}(height2) - height); + var dz1: ${d} = abs(width - ${d}(width1)); + var dz2: ${d} = abs(${d}(width2) - width); + if (depth1 == depth2) { + dx1 = 0.5; + dx2 = 0.5; + } + if (height1 == height2) { + dy1 = 0.5; + dy2 = 0.5; + } + if (width1 == width2) { + dz1 = 0.5; + dz2 = 0.5; + } + return (x111 * dx2 * dy2 * dz2 + x112 * dx2 * dy2 * dz1 + x121 * dx2 * dy1 *dz2 + x122 * dx2 * dy1 * dz1 + + x211 * dx1 * dy2 * dz2 + x212 * dx1 * dy2 * dz1 + x221 * dx1 * dy1 *dz2 + x222 * dx1 * dy1 * dz1); + }`},qA=(e,t,n,r,i,a)=>{let o=e.dims,l=LA(a,t.axes,o.length),c=BA(o,r,i,t.axes),u=r.slice();r.length===0&&(u=o.map((v,m)=>v===0?1:c[m]/v),t.keepAspectRatioPolicy!=="stretch"&&(c=UA(o,u,t)));let d=Dr("output",e.dataType,c.length),h=Fn("input",e.dataType,o.length),p=In.size(c),f=o.length===c.length&&o.every((v,m)=>v===c[m]),b=t.coordinateTransformMode==="tf_crop_and_resize",g=t.extrapolationValue,y=h.type.value,w=v=>` + ${f?"":` + ${PA(t.coordinateTransformMode,y)}; + ${(()=>{switch(t.mode){case"nearest":return` + ${DA(h,o)}; + ${OA(t.nearestMode,n,y)}; + ${WA(h,d,o,c,u.length,l.length,b)}; + `;case"linear":return` + ${FA(d,o,c,u.length,l.length)}; + ${(()=>{if(o.length===2||o.length===4)return`${VA(h,d,o,b,g)}`;if(o.length===3||o.length===5)return`${GA(h,d,o,b,g)}`;throw Error("Linear mode only supports input dims 2, 3, 4 and 5 are supported in linear mode.")})()}; + `;case"cubic":return` + ${(()=>{if(o.length===2||o.length===4)return`${HA(h,d,o,c,u,l,t.cubicCoeffA,b,t.extrapolationValue,t.excludeOutside)}`;throw Error("Cubic mode only supports input dims 2 and 4 are supported in linear mode.")})()}; + `;default:throw Error("Invalid resize mode")}})()}; + `} + ${v.registerUniform("output_size","u32").registerUniform("scales","f32",u.length).registerUniform("roi","f32",l.length).declareVariables(h,d)} + ${v.mainStart()} + ${v.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + ${f?"output[global_idx] = input[global_idx];":` + let output_indices = ${d.offsetToIndices("global_idx")}; + var input_indices: ${h.type.indices}; + ${(()=>{switch(t.mode){case"nearest":return`input_indices = calculateInputIndicesFromOutputIndices(output_indices); + if (checkInputIndices(input_indices)) { + output[global_idx] = ${h.getByIndices("input_indices")}; + } else { + output[global_idx] = ${t.extrapolationValue}; + }`;case"linear":return`output[global_idx] = ${o.length===2||o.length===4?"bilinearInterpolation":"trilinearInterpolation"}(output_indices);`;case"cubic":return"output[global_idx] = bicubicInterpolation(output_indices);";default:throw Error(`Unsupported resize mode: ${t.mode}`)}})()}; +`} + }`;return{name:"Resize",shaderCache:{hint:`${t.cacheKey}|${n}|${u.length>0?t.mode==="cubic"?u:u.length:""}|${i.length>0?i:""}|${l.length>0?l:""}|${f}|${t.mode==="nearest"?o.length:o}`,inputDependencies:["rank"]},getShaderSource:w,getRunData:()=>({outputs:[{dims:c,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(p/64)},programUniforms:[{type:12,data:p},{type:1,data:u},{type:1,data:l},...Yr(o,c)]})}},KA=e=>{let t=e.customDataBuffer;return new Uint32Array(t,t.byteOffset,1)[0]},AU=(e,t)=>{let n=[],r=[],i=[],a=KA(e);if(t.antialias!==0)throw Error("Only default value (0) for Antialias attribute is supported");RA(e.inputs,t,a,n,r,i),e.compute(qA(e.inputs[0],t,a,n,r,i),{inputs:[0]})},MU=e=>{let t=e.antialias,n=e.axes,r=e.coordinateTransformMode,i=e.cubicCoeffA,a=e.excludeOutside!==0,o=e.extrapolationValue,l=e.keepAspectRatioPolicy,c=e.mode,u=e.nearestMode===""?"simple":e.nearestMode;return pi({antialias:t,axes:n,coordinateTransformMode:r,cubicCoeffA:i,excludeOutside:a,extrapolationValue:o,keepAspectRatioPolicy:l,mode:c,nearestMode:u})}}),XA,YA,TU,x0e=ur(()=>{hs(),vs(),oa(),$s(),XA=(e,t)=>{let[n,r,i,a]=e,{numHeads:o,rotaryEmbeddingDim:l}=t;if(n.dims.length!==3&&n.dims.length!==4)throw new Error(`Input 'x' is expected to have 3 or 4 dimensions, got ${n.dims.length}`);if(!In.areEqual(r.dims,[])&&!In.areEqual(r.dims,[1])&&r.dims.length!==2)throw new Error(`Input 'position_ids' is expected to have 0, 1, or 2 dimensions, got ${r.dims.length}`);if(i.dims.length!==2)throw new Error(`Input 'cos_cache' is expected to have 2 dimensions, got ${i.dims.length}`);if(a.dims.length!==2)throw new Error(`Input 'sin_cache' is expected to have 2 dimensions, got ${a.dims.length}`);if(!In.areEqual(i.dims,a.dims))throw new Error("Inputs 'cos_cache' and 'sin_cache' are expected to have the same shape");if(l>0&&o===0)throw new Error("num_heads must be provided if rotary_embedding_dim is specified");let c=n.dims[0],u=n.dims[n.dims.length-2],d=i.dims[0],h=In.sizeFromDimension(n.dims,1)/u,p=l===0?i.dims[1]*2:h/o;if(l>p)throw new Error("rotary_embedding_dim must be less than or equal to head_size");if(r.dims.length===2){if(c!==r.dims[0])throw new Error(`Input 'position_ids' dimension 0 should be of size batch_size, got ${r.dims[0]}`);if(u!==r.dims[1])throw new Error(`Input 'position_ids' dimension 1 should be of size sequence_length, got ${r.dims[1]}`)}if(p/2!==i.dims[1]&&l/2!==i.dims[1])throw new Error(`Input 'cos_cache' dimension 1 should be same as head_size / 2 or rotary_embedding_dim / 2, got ${i.dims[1]}`);if(u>d)throw new Error("Updating cos_cache and sin_cache in RotaryEmbedding is not currently supported")},YA=(e,t)=>{let{interleaved:n,numHeads:r,rotaryEmbeddingDim:i,scale:a}=t,o=e[0].dims[0],l=In.sizeFromDimension(e[0].dims,1),c=e[0].dims[e[0].dims.length-2],u=l/c,d=e[2].dims[1],h=i===0?d*2:u/r,p=new Array(o,c,u/h,h-d),f=In.computeStrides(p),b=[{type:1,data:a},{type:12,data:p},{type:12,data:f},...e[0].dims.length===3?new Array({type:12,data:[l,u,h,1]}):[],...e[0].dims.length===4?new Array({type:12,data:[l,h,c*h,1]}):[],...Yr(e[0].dims,e[1].dims,e[2].dims,e[3].dims,e[0].dims)],g=y=>{let w=Fn("input",e[0].dataType,e[0].dims.length),v=Fn("position_ids",e[1].dataType,e[1].dims.length),m=Fn("cos_cache",e[2].dataType,e[2].dims.length),z=Fn("sin_cache",e[3].dataType,e[3].dims.length),C=Dr("output",e[0].dataType,e[0].dims.length);return y.registerUniforms([{name:"scale",type:"f32"},{name:"global_shape",type:"u32",length:p.length},{name:"global_strides",type:"u32",length:f.length},{name:"input_output_strides",type:"u32",length:f.length}]),` + ${y.declareVariables(w,v,m,z,C)} + + ${y.mainStart(Em)} + let half_rotary_emb_dim = uniforms.${m.name}_shape[1]; + let bsnh = global_idx / uniforms.global_strides % uniforms.global_shape; + let size = uniforms.global_shape[0] * uniforms.global_strides[0]; + ${y.guardAgainstOutOfBoundsWorkgroupSizes("size")} + + if (bsnh[3] < half_rotary_emb_dim) { + let position_ids_idx = + ${v.broadcastedIndicesToOffset("bsnh.xy",Dr("",v.type.tensor,2))}; + let position_id = + u32(${v.getByOffset("position_ids_idx")}) + select(0, bsnh[1], position_ids_idx == 0); + let i = dot(bsnh, uniforms.input_output_strides) + select(0, bsnh[3], ${n}); + let j = i + select(half_rotary_emb_dim, 1, ${n}); + let re = ${w.getByOffset("i")} * ${m.get("position_id","bsnh[3]")} - + ${w.getByOffset("j")} * ${z.get("position_id","bsnh[3]")}; + ${C.setByOffset("i","re")} + let im = ${w.getByOffset("i")} * ${z.get("position_id","bsnh[3]")} + + ${w.getByOffset("j")} * ${m.get("position_id","bsnh[3]")}; + ${C.setByOffset("j","im")} + } else { + let k = dot(bsnh, uniforms.input_output_strides) + half_rotary_emb_dim; + ${C.setByOffset("k",w.getByOffset("k"))} + } + }`};return{name:"RotaryEmbedding",shaderCache:{hint:pi({interleaved:n}).cacheKey,inputDependencies:["rank","rank","rank","rank"]},getShaderSource:g,getRunData:()=>({outputs:[{dims:e[0].dims,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(In.size(p)/Em)},programUniforms:b})}},TU=(e,t)=>{XA(e.inputs,t),e.compute(YA(e.inputs,t))}}),JA,ZA,RU,b0e=ur(()=>{hs(),vs(),$s(),JA=e=>{if(!e||e.length<3)throw new Error("layerNorm requires at least 3 inputs.");let t=e[0],n=e[1],r=e[2];if(t.dataType!==n.dataType||t.dataType!==r.dataType)throw new Error("All inputs must have the same data type");if(t.dims.length!==3&&t.dims.length!==2)throw new Error("Input must be 2D or 3D");if(n.dims.length!==3&&n.dims.length!==2)throw new Error("Skip must be 2D or 3D");let i=t.dims[t.dims.length-1],a=t.dims[t.dims.length-2];if(n.dims[n.dims.length-1]!==i)throw new Error("Skip must have the same hidden size as input");if(n.dims[n.dims.length-2]!==a)throw new Error("Skip must have the same sequence length as input");if(r.dims.length!==1)throw new Error("Gamma must be 1D");if(r.dims[r.dims.length-1]!==i)throw new Error("Gamma must have the same hidden size as input");if(e.length>3){let o=e[3];if(o.dims.length!==1)throw new Error("Beta must be 1D");if(o.dims[o.dims.length-1]!==i)throw new Error("Beta must have the same hidden size as input")}if(e.length>4){let o=e[4];if(o.dims.length!==1)throw new Error("Bias must be 1D");if(o.dims[o.dims.length-1]!==i)throw new Error("Bias must have the same hidden size as input")}},ZA=(e,t,n,r)=>{let i=t.simplified,a=e[0].dims,o=In.size(a),l=a,c=o,u=a.slice(-1)[0],d=r?a.slice(0,-1).concat(1):[],h=!i&&e.length>3,p=e.length>4,f=r&&n>1,b=r&&n>2,g=n>3,y=64,w=Yi(u),v=[{type:12,data:c},{type:12,data:w},{type:12,data:u},{type:1,data:t.epsilon}],m=C=>{let E=[{name:"output_size",type:"u32"},{name:"components",type:"u32"},{name:"hidden_size",type:"u32"},{name:"epsilon",type:"f32"}],I=[Fn("x",e[0].dataType,e[0].dims,w),Fn("skip",e[1].dataType,e[1].dims,w),Fn("gamma",e[2].dataType,e[2].dims,w)];h&&I.push(Fn("beta",e[3].dataType,e[3].dims,w)),p&&I.push(Fn("bias",e[4].dataType,e[4].dims,w)),I.push(Dr("output",e[0].dataType,l,w)),f&&I.push(Dr("mean_output",1,d)),b&&I.push(Dr("inv_std_output",1,d)),g&&I.push(Dr("input_skip_bias_sum",e[0].dataType,l,w));let R=Za(e[0].dataType),A=Za(1,w);return` + + ${C.registerUniforms(E).declareVariables(...I)} + var sum_shared : array<${A}, ${y}>; + var sum_squared_shared : array<${A}, ${y}>; + + ${C.mainStart([y,1,1])} + let ix = local_id.x; + let iy = global_id.x / ${y}; + + let hidden_size_vectorized: u32 = uniforms.hidden_size / uniforms.components; + var stride = hidden_size_vectorized / ${y}; + let offset = ix * stride + iy * hidden_size_vectorized; + let offset1d = stride * ix; + if (ix == ${y-1}) { + stride = hidden_size_vectorized - stride * ix; + } + for (var i: u32 = 0; i < stride; i++) { + let skip_value = skip[offset + i]; + let bias_value = ${p?"bias[offset1d + i]":R+"(0.0)"}; + let input_value = x[offset + i]; + let value = input_value + skip_value + bias_value; + ${g?"input_skip_bias_sum[offset + i] = value;":""} + output[offset + i] = value; + let f32_value = ${um(R,w,"value")}; + sum_shared[ix] += f32_value; + sum_squared_shared[ix] += f32_value * f32_value; + } + workgroupBarrier(); + + var reduce_size : u32 = ${y}; + for (var curr_size = reduce_size >> 1; curr_size > 0; curr_size = reduce_size >> 1) { + reduce_size = curr_size + (reduce_size & 1); + if (ix < curr_size) { + sum_shared[ix] += sum_shared[ix + reduce_size]; + sum_squared_shared[ix] += sum_squared_shared[ix + reduce_size]; + } + workgroupBarrier(); + } + + let sum = sum_shared[0]; + let square_sum = sum_squared_shared[0]; + let mean = ${Ph("sum",w)} / f32(uniforms.hidden_size); + let inv_std_dev = inverseSqrt(${Ph("square_sum",w)} / f32(uniforms.hidden_size) ${i?"":"- mean * mean"} + uniforms.epsilon); + ${f?"mean_output[global_idx] = mean;":""} + ${b?"inv_std_output[global_idx] = inv_std_dev;":""} + + for (var i: u32 = 0; i < stride; i++) { + output[offset + i] = (output[offset + i] ${i?"":`- ${R}(mean)`}) * + ${R}(inv_std_dev) * gamma[offset1d + i] + ${h?"+ beta[offset1d + i]":""}; + } + }`},z=[{dims:l,dataType:e[0].dataType}];return n>1&&z.push({dims:d,dataType:1}),n>2&&z.push({dims:d,dataType:1}),n>3&&z.push({dims:a,dataType:e[0].dataType}),{name:"SkipLayerNormalization",shaderCache:{hint:`${w};${f};${b};${g}`,inputDependencies:e.map((C,E)=>"type")},getShaderSource:m,getRunData:()=>({outputs:z,dispatchGroup:{x:Math.ceil(c/u)},programUniforms:v})}},RU=(e,t)=>{JA(e.inputs);let n=[0];e.outputCount>1&&n.push(-3),e.outputCount>2&&n.push(-3),e.outputCount>3&&n.push(3),e.compute(ZA(e.inputs,t,e.outputCount,!1),{outputs:n})}}),QA,Ug,eM,F3,tM,nM,PU,OU,y0e=ur(()=>{hs(),vs(),oa(),$s(),QA=(e,t)=>{if(!e||e.length<1)throw new Error("too few inputs");if(t.axes.length!==0){if(t.axes.length!==t.starts.length||t.axes.length!==t.ends.length)throw new Error("axes, starts and ends must have the same length")}else if(t.starts.length!==t.ends.length)throw new Error("starts and ends must have the same length");e.slice(1).forEach((n,r)=>{if(e[r+1].dataType!==6&&e[r+1].dataType!==7)throw new Error(`Input ${r} must be an array of int32 or int64`)})},Ug=(e,t)=>{let n=[];if(e.length>t)if(e[t].dataType===7)e[t].getBigInt64Array().forEach(r=>n.push(Number(r)));else if(e[t].dataType===6)e[t].getInt32Array().forEach(r=>n.push(Number(r)));else throw new Error(`Input ${t} must be an array of int32 or int64`);return n},eM=(e,t)=>{if(e.length>1){let n=Ug(e,1),r=Ug(e,2),i=Ug(e,3);return i.length===0&&(i=[...Array(e[0].dims.length).keys()]),pi({starts:n,ends:r,axes:i})}else return t},F3=(e,t,n,r,i)=>{let a=e;return e<0&&(a+=n[r[t]]),i[t]<0?Math.max(0,Math.min(a,n[r[t]]-1)):Math.max(0,Math.min(a,n[r[t]]))},tM=(e,t,n)=>`fn calculateInputIndices(output_indices: ${t.type.indices}) -> ${e.type.indices} { + var input_indices: ${e.type.indices}; + var carry = 0u; + for (var i = ${n.length}; i >= 0; i--) { + let input_shape_i = ${Gr("uniforms.input_shape","i",n.length)}; + let steps_i = ${Gr("uniforms.steps","i",n.length)}; + let signs_i = ${Gr("uniforms.signs","i",n.length)}; + let starts_i = ${Gr("uniforms.starts","i",n.length)}; + var output_index = ${t.indicesGet("output_indices","i")}; + var input_index = output_index * steps_i + starts_i + carry; + carry = input_index / input_shape_i; + input_index = input_index % input_shape_i; + if (signs_i < 0) { + input_index = input_shape_i - input_index - 1u + starts_i; + } + ${e.indicesSet("input_indices","i","input_index")}; + } + return input_indices; + }`,nM=(e,t)=>{let n=e[0].dims,r=In.size(n),i=t.axes.length>0?In.normalizeAxes(t.axes,n.length):[...Array(n.length).keys()],a=Ug(e,4);a.forEach(w=>w!==0||(()=>{throw new Error("step cannot be 0")})),a.length===0&&(a=Array(i.length).fill(1));let o=t.starts.map((w,v)=>F3(w,v,n,i,a)),l=t.ends.map((w,v)=>F3(w,v,n,i,a));if(i.length!==o.length||i.length!==l.length)throw new Error("start, ends and axes should have the same number of elements");if(i.length!==n.length)for(let w=0;wMath.sign(w));a.forEach((w,v,m)=>{if(w<0){let z=(l[v]-o[v])/w,C=o[v],E=C+z*a[v];o[v]=E,l[v]=C,m[v]=-w}});let u=n.slice(0);i.forEach((w,v)=>{u[w]=Math.ceil((l[w]-o[w])/a[w])});let d={dims:u,dataType:e[0].dataType},h=Dr("output",e[0].dataType,u.length),p=Fn("input",e[0].dataType,e[0].dims.length),f=In.size(u),b=[{name:"outputSize",type:"u32"},{name:"starts",type:"u32",length:o.length},{name:"signs",type:"i32",length:c.length},{name:"steps",type:"u32",length:a.length}],g=[{type:12,data:f},{type:12,data:o},{type:6,data:c},{type:12,data:a},...Yr(e[0].dims,u)],y=w=>` + ${w.registerUniforms(b).declareVariables(p,h)} + ${tM(p,h,n)} + ${w.mainStart()} + ${w.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + let output_indices = ${h.offsetToIndices("global_idx")}; + let input_indices = calculateInputIndices(output_indices); + ${h.setByOffset("global_idx",p.getByIndices("input_indices"))} + }`;return{name:"Slice",shaderCache:{hint:`${c.length}_${o.length}_${a.length}`,inputDependencies:["rank"]},getShaderSource:y,getRunData:()=>({outputs:[d],dispatchGroup:{x:Math.ceil(r/64)},programUniforms:g})}},PU=(e,t)=>{QA(e.inputs,t);let n=eM(e.inputs,t);e.compute(nM(e.inputs,n),{inputs:[0]})},OU=e=>{let t=e.starts,n=e.ends,r=e.axes;return pi({starts:t,ends:n,axes:r})}}),rM,sM,LU,BU,v0e=ur(()=>{hs(),vs(),oa(),Fh(),$s(),rM=e=>{if(!e||e.length!==1)throw new Error("Softmax op requires 1 input.")},sM=(e,t)=>{let n=e.inputs[0],r=n.dims,i=In.size(r),a=r.length,o=In.normalizeAxis(t.axis,a),l=oR),u[o]=a-1,u[a-1]=o,c=e.compute(Sc(n,u),{inputs:[n],outputs:[-1]})[0]):c=n;let d=c.dims,h=d[a-1],p=i/h,f=Yi(h),b=h/f,g=64;p===1&&(g=256);let y=(I,R)=>R===4?`max(max(${I}.x, ${I}.y), max(${I}.z, ${I}.w))`:R===2?`max(${I}.x, ${I}.y)`:R===3?`max(max(${I}.x, ${I}.y), ${I}.z)`:I,w=Fn("x",c.dataType,c.dims,f),v=Dr("result",c.dataType,c.dims,f),m=w.type.value,z=Za(c.dataType)==="f32"?`var threadMax = ${m}(-3.402823e+38f);`:`var threadMax = ${m}(-65504.0h);`,C=I=>` + var rowMaxShared : ${m}; + var rowSumShared : ${m}; + var threadShared : array<${m}, ${g}>; + + fn getValue(row: i32, col: i32, row_stride: i32) -> ${m} { + let index = row * row_stride + col; + return x[index]; + } + + fn setValue(row: i32, col: i32, row_stride: i32, value: ${m}) { + let index = row * row_stride + col; + result[index] = value; + } + ${I.registerUniform("packedCols","i32").declareVariables(w,v)} + ${I.mainStart(g)} + let gindex = i32(global_idx); + let lindex = i32(local_idx); + const wg = ${g}; + let row = gindex / wg; + let cols = uniforms.packedCols; + let row_stride : i32 = uniforms.packedCols; + + // find the rows max + ${z} + for (var col = lindex; col < cols; col += wg) { + let value = getValue(row, col, row_stride); + threadMax = max(threadMax, value); + } + if (lindex < cols) { + threadShared[lindex] = threadMax; + } + workgroupBarrier(); + + var reduceSize = min(cols, wg); + for (var currSize = reduceSize >> 1; currSize > 0; currSize = reduceSize >> 1) { + reduceSize = currSize + (reduceSize & 1); + if (lindex < currSize) { + threadShared[lindex] = max(threadShared[lindex], threadShared[lindex + reduceSize]); + } + workgroupBarrier(); + } + if (lindex == 0) { + rowMaxShared = ${m}(${y("threadShared[0]",f)}); + } + workgroupBarrier(); + + // find the rows sum + var threadSum = ${m}(0.0); + for (var col = lindex; col < cols; col += wg) { + let subExp = exp(getValue(row, col, row_stride) - rowMaxShared); + threadSum += subExp; + } + threadShared[lindex] = threadSum; + workgroupBarrier(); + + for (var currSize = wg >> 1; currSize > 0; currSize = currSize >> 1) { + if (lindex < currSize) { + threadShared[lindex] = threadShared[lindex] + threadShared[lindex + currSize]; + } + workgroupBarrier(); + } + if (lindex == 0) { + rowSumShared = ${m}(${Ph("threadShared[0]",f)}); + } + workgroupBarrier(); + + // calculate final value for each element in the row + for (var col = lindex; col < cols; col += wg) { + let value = exp(getValue(row, col, row_stride) - rowMaxShared) / rowSumShared; + setValue(row, col, row_stride, value); + } + }`,E=e.compute({name:"Softmax",shaderCache:{hint:`${f};${g}`,inputDependencies:["type"]},getRunData:()=>({outputs:[{dims:d,dataType:c.dataType}],dispatchGroup:{x:p},programUniforms:[{type:6,data:b}]}),getShaderSource:C},{inputs:[c],outputs:[l?-1:0]})[0];l&&e.compute(Sc(E,u),{inputs:[E]})},LU=(e,t)=>{rM(e.inputs),sM(e,t)},BU=e=>pi({axis:e.axis})}),W3,iM,aM,oM,UU,w0e=ur(()=>{hs(),vs(),$s(),W3=e=>Array.from(e.getBigInt64Array(),Number),iM=e=>{if(!e||e.length!==2)throw new Error("Tile requires 2 inputs.");if(e[0].dataType!==1&&e[0].dataType!==10&&e[0].dataType!==6&&e[0].dataType!==12)throw new Error("Tile only support float, float16, int32, and uint32 data types");if(e[1].dataType!==7)throw new Error("Tile `repeats` input should be of int64 data type");if(e[1].dims.length!==1)throw new Error("Tile `repeats` input should be 1-D");if(W3(e[1]).length!==e[0].dims.length)throw new Error("Tile `repeats` input should have same number of elements as rank of input data tensor")},aM=(e,t)=>{let n=[];for(let r=0;r{let n=e[0].dims,r=t??W3(e[1]),i=aM(n,r),a=In.size(i),o=e[0].dataType,l=Fn("input",o,n.length),c=Dr("output",o,i.length),u=d=>` + const inputShape = ${l.indices(...n)}; + ${d.registerUniform("output_size","u32").declareVariables(l,c)} + ${d.mainStart()} + ${d.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let output_indices = ${c.offsetToIndices("global_idx")}; + var input_indices: ${l.type.indices}; + for (var i = 0; i < ${n.length}; i++) { + let input_dim_i = ${l.indicesGet("uniforms.input_shape","i")}; + let input_dim_value = ${c.indicesGet("output_indices","i")} % input_dim_i; + + ${l.indicesSet("input_indices","i","input_dim_value")} + } + ${c.setByOffset("global_idx",l.getByIndices("input_indices"))} + }`;return{name:"Tile",shaderCache:{hint:`${r}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:i,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(a/64)},programUniforms:[{type:12,data:a},...Yr(e[0].dims,i)]}),getShaderSource:u}},UU=e=>{iM(e.inputs),e.compute(oM(e.inputs),{inputs:[0]})}}),lM,cM,FU,_0e=ur(()=>{hs(),vs(),$s(),lM=(e,t,n,r,i)=>{let a=Dr("output_data",i,n.length,4),o=Fn("a_data",t[1].dataType,t[1].dims.length,4),l=Fn("b_data",t[2].dataType,t[2].dims.length,4),c=Fn("c_data",t[0].dataType,t[0].dims.length,4),u,d=(h,p,f)=>`select(${p}, ${h}, ${f})`;if(!r)u=a.setByOffset("global_idx",d(o.getByOffset("global_idx"),l.getByOffset("global_idx"),c.getByOffset("global_idx")));else{let h=(p,f,b="")=>{let g=`a_data[index_a${f}][component_a${f}]`,y=`b_data[index_b${f}][component_b${f}]`,w=`bool(c_data[index_c${f}] & (0xffu << (component_c${f} * 8)))`;return` + let output_indices${f} = ${a.offsetToIndices(`global_idx * 4u + ${f}u`)}; + let offset_a${f} = ${o.broadcastedIndicesToOffset(`output_indices${f}`,a)}; + let offset_b${f} = ${l.broadcastedIndicesToOffset(`output_indices${f}`,a)}; + let offset_c${f} = ${c.broadcastedIndicesToOffset(`output_indices${f}`,a)}; + let index_a${f} = offset_a${f} / 4u; + let index_b${f} = offset_b${f} / 4u; + let index_c${f} = offset_c${f} / 4u; + let component_a${f} = offset_a${f} % 4u; + let component_b${f} = offset_b${f} % 4u; + let component_c${f} = offset_c${f} % 4u; + ${p}[${f}] = ${b}(${d(g,y,w)}); + `};i===9?u=` + var data = vec4(0); + ${h("data",0,"u32")} + ${h("data",1,"u32")} + ${h("data",2,"u32")} + ${h("data",3,"u32")} + output_data[global_idx] = dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(data));`:u=` + ${h("output_data[global_idx]",0)} + ${h("output_data[global_idx]",1)} + ${h("output_data[global_idx]",2)} + ${h("output_data[global_idx]",3)} + `}return` + ${e.registerUniform("vec_size","u32").declareVariables(c,o,l,a)} + ${e.mainStart()} + ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + ${u} + }`},cM=e=>{let t=e[1].dims,n=e[2].dims,r=e[0].dims,i=e[1].dataType,a=!(In.areEqual(t,n)&&In.areEqual(n,r)),o=t,l=In.size(t);if(a){let u=Nm.calcShape(Nm.calcShape(t,n,!1),r,!1);if(!u)throw new Error("Can't perform where op on the given tensors");o=u,l=In.size(o)}let c=Math.ceil(l/4);return{name:"Where",shaderCache:{inputDependencies:["rank","rank","rank"]},getShaderSource:u=>lM(u,e,o,a,i),getRunData:()=>({outputs:[{dims:o,dataType:i}],dispatchGroup:{x:Math.ceil(l/64/4)},programUniforms:[{type:12,data:c},...Yr(r,t,n,o)]})}},FU=e=>{e.compute(cM(e.inputs))}}),WU,z0e=ur(()=>{Pde(),q4(),Ode(),Lde(),Bde(),Ude(),Fde(),Gde(),Kde(),Xde(),Yde(),Jde(),Zde(),Qde(),e0e(),t0e(),n0e(),r0e(),s0e(),i0e(),a0e(),o0e(),l0e(),c0e(),u0e(),lU(),d0e(),h0e(),p0e(),f0e(),m0e(),G4(),g0e(),x0e(),b0e(),y0e(),v0e(),dU(),w0e(),Fh(),K4(),_0e(),WU=new Map([["Abs",[PL]],["Acos",[OL]],["Acosh",[LL]],["Add",[bB]],["ArgMax",[AL,K$]],["ArgMin",[kL,K$]],["Asin",[BL]],["Asinh",[UL]],["Atan",[FL]],["Atanh",[WL]],["Attention",[ML]],["AveragePool",[vU,yU]],["BatchNormalization",[TL]],["BiasAdd",[RL]],["BiasSplitGelu",[xB]],["Cast",[VL,DL]],["Ceil",[GL]],["Clip",[HL]],["Concat",[NB,EB]],["Conv",[e5,Q$]],["ConvTranspose",[BB,LB]],["Cos",[qL]],["Cosh",[KL]],["CumSum",[UB,FB]],["DepthToSpace",[WB,DB]],["DequantizeLinear",[CU,NU]],["Div",[yB]],["Einsum",[VB,HB]],["Elu",[XL,lx]],["Equal",[vB]],["Erf",[YL]],["Exp",[JL]],["Expand",[GB]],["FastGelu",[qB]],["Floor",[ZL]],["FusedConv",[e5,Q$]],["Gather",[XB,KB]],["GatherElements",[tU,eU]],["GatherBlockQuantized",[ZB,QB]],["GatherND",[YB,JB]],["Gelu",[QL]],["Gemm",[rU,nU]],["GlobalAveragePool",[_U,wU]],["GlobalMaxPool",[jU,SU]],["Greater",[$B]],["GreaterOrEqual",[jB]],["GridSample",[sU,iU]],["GroupQueryAttention",[hU]],["HardSigmoid",[oB,aB]],["InstanceNormalization",[pU]],["LayerNormalization",[fU]],["LeakyRelu",[eB,lx]],["Less",[SB]],["LessOrEqual",[CB]],["Log",[mB]],["MatMul",[mU]],["MatMulNBits",[gU,xU]],["MaxPool",[zU,$U]],["Mul",[wB]],["MultiHeadAttention",[oU,aU]],["Neg",[nB]],["Not",[tB]],["Pad",[bU]],["Pow",[_B]],["QuickGelu",[gB,lx]],["Range",[EU]],["Reciprocal",[rB]],["ReduceMin",[jL]],["ReduceMean",[wL]],["ReduceMax",[SL]],["ReduceSum",[NL]],["ReduceProd",[CL]],["ReduceL1",[_L]],["ReduceL2",[zL]],["ReduceLogSum",[IL]],["ReduceLogSumExp",[$L]],["ReduceSumSquare",[EL]],["Relu",[sB]],["Resize",[AU,MU]],["RotaryEmbedding",[TU]],["ScatterND",[kU,IU]],["Sigmoid",[iB]],["Sin",[lB]],["Sinh",[cB]],["Slice",[PU,OU]],["SkipLayerNormalization",[RU]],["Split",[cU,uU]],["Sqrt",[uB]],["Softmax",[LU,BU]],["Sub",[zB]],["Tan",[dB]],["Tanh",[hB]],["ThresholdedRelu",[fB,lx]],["Tile",[UU]],["Transpose",[cL,uL]],["Where",[FU]]])}),DU,$0e=ur(()=>{xd(),D0(),$s(),DU=class{constructor(e){this.backend=e,this.repo=new Map,this.attributesBound=!1}getArtifact(e){return this.repo.get(e)}setArtifact(e,t){this.repo.set(e,t)}run(e,t,n,r,i){md(e.programInfo.name);let a=this.backend.device,o=this.backend.getComputePassEncoder();this.backend.writeTimestamp(this.backend.pendingDispatchNumber*2);let l=[];for(let u of t)l.push({binding:l.length,resource:{buffer:u.buffer}});for(let u of n)l.push({binding:l.length,resource:{buffer:u.buffer}});i&&l.push({binding:l.length,resource:i});let c=a.createBindGroup({layout:e.computePipeline.getBindGroupLayout(0),entries:l,label:e.programInfo.name});if(this.backend.sessionStatus==="capturing"){let u={kernelId:this.backend.currentKernelId,computePipeline:e.computePipeline,bindGroup:c,dispatchGroup:r};this.backend.capturedCommandList.get(this.backend.currentSessionId).push(u)}o.setPipeline(e.computePipeline),o.setBindGroup(0,c),o.dispatchWorkgroups(...r),this.backend.writeTimestamp(this.backend.pendingDispatchNumber*2+1),this.backend.pendingDispatchNumber++,(this.backend.pendingDispatchNumber>=this.backend.maxDispatchNumber||this.backend.queryType==="at-passes")&&this.backend.endComputePass(),this.backend.pendingDispatchNumber>=this.backend.maxDispatchNumber&&this.backend.flush(),hu(e.programInfo.name)}dispose(){}build(e,t){md(e.name);let n=this.backend.device,r=[];[{feature:"shader-f16",extension:"f16"},{feature:"subgroups",extension:"subgroups"},{feature:"subgroups-f16",extension:"subgroups_f16"}].forEach(u=>{n.features.has(u.feature)&&r.push(`enable ${u.extension};`)});let i=lL(t,this.backend.device.limits),a=e.getShaderSource(i),o=`${r.join(` +`)} +${i.additionalImplementations} +${a}`,l=n.createShaderModule({code:o,label:e.name});Bs("verbose",()=>`[WebGPU] ${e.name} shader code: ${o}`);let c=n.createComputePipeline({compute:{module:l,entryPoint:"main"},layout:"auto",label:e.name});return hu(e.name),{programInfo:e,computePipeline:c,uniformVariablesInfo:i.variablesInfo}}normalizeDispatchGroupSize(e){let t=typeof e=="number"?e:e.x,n=typeof e=="number"?1:e.y||1,r=typeof e=="number"?1:e.z||1,i=this.backend.device.limits.maxComputeWorkgroupsPerDimension;if(t<=i&&n<=i&&r<=i)return[t,n,r];let a=t*n*r,o=Math.ceil(Math.sqrt(a));if(o>i){if(o=Math.ceil(Math.cbrt(a)),o>i)throw new Error("Total dispatch size exceeds WebGPU maximum.");return[o,o,o]}else return[o,o,1]}}}),uM,dM,hM,pM,VU,S0e=ur(()=>{xd(),hs(),D0(),nL(),Tde(),z0e(),$0e(),uM=(e,t)=>{if(t.length!==e.length)throw new Error(`inputDependencies length ${t.length} is not equal to inputTensors length ${e.length}.`);let n=[];for(let r=0;r{var i,a;let r=e.name;return(i=e.shaderCache)!=null&&i.hint&&(r+="["+e.shaderCache.hint+"]"),r+=":"+n+`:${uM(t,((a=e.shaderCache)==null?void 0:a.inputDependencies)??new Array(t.length).fill("dims"))}`,r},hM=class{constructor(e){e&&(this.architecture=e.architecture,this.vendor=e.vendor)}isArchitecture(e){return this.architecture===e}isVendor(e){return this.vendor===e}},pM=class{constructor(e){this.subgroupsSupported=e.features.has("subgroups"),this.subgroupsF16Supported=e.features.has("subgroups");let t=e.limits;!this.subgroupsSupported||!t.minSubgroupSize||!t.maxSubgroupSize?this.subgroupSizeRange=void 0:this.subgroupSizeRange=[t.minSubgroupSize,t.maxSubgroupSize]}},VU=class{constructor(){this.currentSessionId=null,this.currentKernelId=null,this.commandEncoder=null,this.computePassEncoder=null,this.maxDispatchNumber=16,this.pendingDispatchNumber=0,this.pendingKernels=[],this.pendingQueries=new Map,this.sessionStatus="default",this.capturedCommandList=new Map,this.capturedPendingKernels=new Map,this.sessionExternalDataMapping=new Map}get currentKernelCustomData(){if(this.currentKernelId===null)throw new Error("currentKernelCustomData(): currentKernelId is null. (should not happen)");let e=this.kernelCustomData.get(this.currentKernelId);return e||(e={},this.kernelCustomData.set(this.currentKernelId,e)),e}async initialize(e,t){this.env=e;let n=[],r={requiredLimits:{maxComputeWorkgroupStorageSize:t.limits.maxComputeWorkgroupStorageSize,maxComputeWorkgroupsPerDimension:t.limits.maxComputeWorkgroupsPerDimension,maxStorageBufferBindingSize:t.limits.maxStorageBufferBindingSize,maxBufferSize:t.limits.maxBufferSize,maxComputeInvocationsPerWorkgroup:t.limits.maxComputeInvocationsPerWorkgroup,maxComputeWorkgroupSizeX:t.limits.maxComputeWorkgroupSizeX,maxComputeWorkgroupSizeY:t.limits.maxComputeWorkgroupSizeY,maxComputeWorkgroupSizeZ:t.limits.maxComputeWorkgroupSizeZ},requiredFeatures:n},i=a=>t.features.has(a)&&n.push(a)&&!0;i("chromium-experimental-timestamp-query-inside-passes")||i("timestamp-query"),i("shader-f16"),i("subgroups")&&i("subgroups-f16"),this.device=await t.requestDevice(r),this.deviceInfo=new pM(this.device),this.adapterInfo=new hM(t.info||await t.requestAdapterInfo()),this.gpuDataManager=rL(this),this.programManager=new DU(this),this.kernels=new Map,this.kernelPersistentData=new Map,this.kernelCustomData=new Map,W4(e.logLevel,!!e.debug),this.device.onuncapturederror=a=>{a.error instanceof GPUValidationError&&console.error(`An uncaught WebGPU validation error was raised: ${a.error.message}`)},Object.defineProperty(this.env.webgpu,"device",{value:this.device,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(this.env.webgpu,"adapter",{value:t,writable:!1,enumerable:!0,configurable:!1}),this.setQueryType()}dispose(){typeof this.querySet<"u"&&this.querySet.destroy(),this.gpuDataManager.dispose()}getCommandEncoder(){return this.commandEncoder||(this.commandEncoder=this.device.createCommandEncoder()),this.commandEncoder}getComputePassEncoder(){if(!this.computePassEncoder){let e=this.getCommandEncoder(),t={};this.queryType==="at-passes"&&(t.timestampWrites={querySet:this.querySet,beginningOfPassWriteIndex:this.pendingDispatchNumber*2,endOfPassWriteIndex:this.pendingDispatchNumber*2+1}),this.computePassEncoder=e.beginComputePass(t)}return this.computePassEncoder}endComputePass(){this.computePassEncoder&&(this.computePassEncoder.end(),this.computePassEncoder=null)}flush(){if(!this.commandEncoder)return;md(),this.endComputePass();let e;this.queryType!=="none"&&(this.commandEncoder.resolveQuerySet(this.querySet,0,this.pendingDispatchNumber*2,this.queryResolveBuffer,0),e=this.device.createBuffer({size:this.pendingDispatchNumber*2*8,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),this.pendingQueries.set(e,this.pendingKernels),this.pendingKernels=[],this.commandEncoder.copyBufferToBuffer(this.queryResolveBuffer,0,e,0,this.pendingDispatchNumber*2*8)),this.device.queue.submit([this.commandEncoder.finish()]),this.gpuDataManager.refreshPendingBuffers(),this.commandEncoder=null,this.pendingDispatchNumber=0,this.queryType!=="none"&&e.mapAsync(GPUMapMode.READ).then(()=>{var r;let t=new BigUint64Array(e.getMappedRange()),n=this.pendingQueries.get(e);for(let i=0;i"u"&&(this.queryTimeBase=f);let g=Number(f-this.queryTimeBase),y=Number(b-this.queryTimeBase);if(!Number.isSafeInteger(g)||!Number.isSafeInteger(y))throw new RangeError("incorrect timestamp range");if((r=this.env.webgpu.profiling)!=null&&r.ondata)this.env.webgpu.profiling.ondata({version:1,inputsMetadata:h.map(w=>({dims:w.dims,dataType:Np(w.dataType)})),outputsMetadata:p.map(w=>({dims:w.dims,dataType:Np(w.dataType)})),kernelId:o,kernelType:c,kernelName:u,programName:d,startTime:g,endTime:y});else{let w="";h.forEach((m,z)=>{w+=`input[${z}]: [${m.dims}] | ${Np(m.dataType)}, `});let v="";p.forEach((m,z)=>{v+=`output[${z}]: [${m.dims}] | ${Np(m.dataType)}, `}),console.log(`[profiling] kernel "${o}|${c}|${u}|${d}" ${w}${v}execution time: ${y-g} ns`)}db("GPU",`${d}::${f}::${b}`)}e.unmap(),this.pendingQueries.delete(e)}),hu()}run(e,t,n,r,i,a){md(e.name);let o=[];for(let v=0;vm):n;if(d.length!==l.length)throw new Error(`Output size ${d.length} must be equal to ${l.length}.`);let h=[],p=[];for(let v=0;v=a)throw new Error(`Invalid output index: ${d[v]}`);if(d[v]===-3)continue;let m=d[v]===-1,z=d[v]===-2,C=m||z?i(l[v].dataType,l[v].dims):r(d[v],l[v].dataType,l[v].dims);if(h.push(C),C.data===0)continue;let E=this.gpuDataManager.get(C.data);if(!E)throw new Error(`no GPU data for output: ${C.data}`);if(m&&this.temporaryData.push(E),z){let I=this.kernelPersistentData.get(this.currentKernelId);I||(I=[],this.kernelPersistentData.set(this.currentKernelId,I)),I.push(E)}p.push(E)}if(o.length!==t.length||p.length!==h.length){if(p.length===0)return hu(e.name),h;throw new Error(`Program ${e.name} has zero-sized tensor(s) in inputs or outputs. This is not supported now.`)}let f;if(u){let v=0,m=[];u.forEach(I=>{let R=typeof I.data=="number"?[I.data]:I.data;if(R.length===0)return;let A=I.type===10?2:4,O,F;I.type===10?(F=R.length>4?16:R.length>2?8:R.length*A,O=R.length>4?16:A*R.length):(F=R.length<=2?R.length*A:16,O=16),v=Math.ceil(v/F)*F,m.push(v);let L=I.type===10?8:4;v+=R.length>4?Math.ceil(R.length/L)*O:R.length*A});let z=16;v=Math.ceil(v/z)*z;let C=new ArrayBuffer(v);u.forEach((I,R)=>{let A=m[R],O=typeof I.data=="number"?[I.data]:I.data;if(I.type===6)new Int32Array(C,A,O.length).set(O);else if(I.type===12)new Uint32Array(C,A,O.length).set(O);else if(I.type===10)new Uint16Array(C,A,O.length).set(O);else if(I.type===1)new Float32Array(C,A,O.length).set(O);else throw new Error(`Unsupported uniform type: ${Np(I.type)}`)});let E=this.gpuDataManager.create(v,GPUBufferUsage.COPY_DST|GPUBufferUsage.UNIFORM);this.device.queue.writeBuffer(E.buffer,0,C,0,v),this.gpuDataManager.release(E.id),f={offset:0,size:v,buffer:E.buffer}}let b=this.programManager.normalizeDispatchGroupSize(c),g=b[1]===1&&b[2]===1,y=dM(e,t,g),w=this.programManager.getArtifact(y);if(w||(w=this.programManager.build(e,b),this.programManager.setArtifact(y,w),Bs("info",()=>`[artifact] key: ${y}, programName: ${e.name}`)),u&&w.uniformVariablesInfo){if(u.length!==w.uniformVariablesInfo.length)throw new Error(`Uniform variables count mismatch: expect ${w.uniformVariablesInfo.length}, got ${u.length} in program "${w.programInfo.name}".`);for(let v=0;v`[ProgramManager] run "${e.name}" (key=${y}) with ${b[0]}x${b[1]}x${b[2]}`),this.queryType!=="none"||this.sessionStatus==="capturing"){let v={kernelId:this.currentKernelId,programName:w.programInfo.name,inputTensorViews:t,outputTensorViews:h};this.pendingKernels.push(v),this.sessionStatus==="capturing"&&this.capturedPendingKernels.get(this.currentSessionId).push(v)}return this.programManager.run(w,o,p,b,f),hu(e.name),h}upload(e,t){this.gpuDataManager.upload(e,t)}memcpy(e,t){this.gpuDataManager.memcpy(e,t)}async download(e,t){await this.gpuDataManager.download(e,t)}alloc(e){return this.gpuDataManager.create(e).id}free(e){return this.gpuDataManager.release(e)}createKernel(e,t,n,r){let i=WU.get(e);if(!i)throw new Error(`kernel not implemented: ${e}`);let a={kernelType:e,kernelName:r,kernelEntry:i[0],attributes:[i[1],n]};this.kernels.set(t,a)}releaseKernel(e){let t=this.kernelPersistentData.get(e);if(t){for(let n of t)this.gpuDataManager.release(n.id);this.kernelPersistentData.delete(e)}this.kernelCustomData.delete(e),this.kernels.delete(e)}computeKernel(e,t,n){let r=this.kernels.get(e);if(!r)throw new Error(`kernel not created: ${e}`);let i=r.kernelType,a=r.kernelName,o=r.kernelEntry,l=r.attributes;if(this.currentKernelId!==null)throw new Error(`kernel "[${i}] ${a}" is not allowed to be called recursively`);this.currentKernelId=e,l[0]&&(l[1]=l[0](l[1]),l[0]=void 0),Bs("info",()=>`[WebGPU] Start to run kernel "[${i}] ${a}"...`);let c=this.env.debug;this.temporaryData=[];try{return c&&this.device.pushErrorScope("validation"),o(t,l[1]),0}catch(u){return n.push(Promise.resolve(`[WebGPU] Kernel "[${i}] ${a}" failed. ${u}`)),1}finally{c&&n.push(this.device.popErrorScope().then(u=>u?`GPU validation error for kernel "[${i}] ${a}": ${u.message}`:null));for(let u of this.temporaryData)this.gpuDataManager.release(u.id);this.temporaryData=[],this.currentKernelId=null}}registerBuffer(e,t,n,r){let i=this.sessionExternalDataMapping.get(e);i||(i=new Map,this.sessionExternalDataMapping.set(e,i));let a=i.get(t),o=this.gpuDataManager.registerExternalBuffer(n,r,a);return i.set(t,[o,n]),o}unregisterBuffers(e){let t=this.sessionExternalDataMapping.get(e);t&&(t.forEach(n=>this.gpuDataManager.unregisterExternalBuffer(n[0])),this.sessionExternalDataMapping.delete(e))}getBuffer(e){let t=this.gpuDataManager.get(e);if(!t)throw new Error(`no GPU data for buffer: ${e}`);return t.buffer}createDownloader(e,t,n){return async()=>{let r=await H$(this,e,t);return D4(r.buffer,n)}}writeTimestamp(e){this.queryType==="inside-passes"&&this.computePassEncoder.writeTimestamp(this.querySet,e)}setQueryType(){var e;this.queryType="none",(((e=this.env.webgpu.profiling)==null?void 0:e.mode)==="default"||(typeof this.env.trace>"u"?this.env.wasm.trace:this.env.trace))&&(this.device.features.has("chromium-experimental-timestamp-query-inside-passes")?this.queryType="inside-passes":this.device.features.has("timestamp-query")&&(this.queryType="at-passes"),this.queryType!=="none"&&typeof this.querySet>"u"&&(this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxDispatchNumber*2}),this.queryResolveBuffer=this.device.createBuffer({size:this.maxDispatchNumber*2*8,usage:GPUBufferUsage.COPY_SRC|GPUBufferUsage.QUERY_RESOLVE})))}captureBegin(){Bs("info","captureBegin"),this.capturedCommandList.get(this.currentSessionId)||this.capturedCommandList.set(this.currentSessionId,[]),this.capturedPendingKernels.get(this.currentSessionId)||this.capturedPendingKernels.set(this.currentSessionId,[]),this.flush(),this.sessionStatus="capturing"}captureEnd(){Bs("info","captureEnd"),this.flush(),this.sessionStatus="default"}replay(){Bs("info","replay"),this.sessionStatus="replaying";let e=this.capturedCommandList.get(this.currentSessionId),t=this.capturedPendingKernels.get(this.currentSessionId),n=e.length;this.pendingKernels=[];for(let r=0;r=this.maxDispatchNumber||this.queryType==="at-passes")&&this.endComputePass(),this.pendingDispatchNumber>=this.maxDispatchNumber&&this.flush()}this.flush(),this.sessionStatus="default"}onCreateSession(){this.gpuDataManager.onCreateSession()}onReleaseSession(e){this.unregisterBuffers(e),this.capturedCommandList.has(e)&&this.capturedCommandList.delete(e),this.capturedPendingKernels.has(e)&&this.capturedPendingKernels.delete(e),this.gpuDataManager.onReleaseSession(e)}onRunStart(e){this.currentSessionId=e,this.setQueryType()}}}),fM,D3,mM,V3,H3,G3,gM,HU,j0e=ur(()=>{D0(),fM=1,D3=()=>fM++,mM=new Map([["float32",32],["float16",16],["int32",32],["uint32",32],["int64",64],["uint64",64],["int8",8],["uint8",8],["int4",4],["uint4",4]]),V3=(e,t)=>{let n=mM.get(e);if(!n)throw new Error("Unsupported data type.");return t.length>0?Math.ceil(t.reduce((r,i)=>r*i)*n/8):0},H3=class{constructor(e){this.sessionId=e.sessionId,this.mlContext=e.context,this.mlTensor=e.tensor,this.dataType=e.dataType,this.tensorShape=e.shape}get tensor(){return this.mlTensor}get type(){return this.dataType}get shape(){return this.tensorShape}get byteLength(){return V3(this.dataType,this.tensorShape)}destroy(){Bs("verbose",()=>"[WebNN] TensorWrapper.destroy"),this.mlTensor.destroy()}write(e){this.mlContext.writeTensor(this.mlTensor,e)}async read(e){return e?this.mlContext.readTensor(this.mlTensor,e):this.mlContext.readTensor(this.mlTensor)}canReuseTensor(e,t,n){return this.mlContext===e&&this.dataType===t&&this.tensorShape.length===n.length&&this.tensorShape.every((r,i)=>r===n[i])}},G3=class{constructor(e,t){this.tensorManager=e,this.wrapper=t}get tensorWrapper(){return this.wrapper}releaseTensor(){this.tensorWrapper&&(this.tensorManager.releaseTensor(this.tensorWrapper),this.wrapper=void 0)}async ensureTensor(e,t,n,r){let i=this.tensorManager.getMLContext(e);if(this.wrapper){if(this.wrapper.canReuseTensor(i,t,n))return this.wrapper.tensor;if(r){if(this.wrapper.byteLength!==V3(t,n))throw new Error("Unable to copy data to tensor with different size.");this.activeUpload=new Uint8Array(await this.wrapper.read())}this.tensorManager.releaseTensor(this.wrapper)}let a=typeof MLTensorUsage>"u"?void 0:MLTensorUsage.READ|MLTensorUsage.WRITE;return this.wrapper=await this.tensorManager.getCachedTensor(e,t,n,a,!0,!0),r&&this.activeUpload&&(this.wrapper.write(this.activeUpload),this.activeUpload=void 0),this.wrapper.tensor}upload(e){if(this.wrapper)if(e.byteLength===this.wrapper.byteLength){this.wrapper.write(e);return}else Bs("verbose",()=>"Data size does not match tensor size. Releasing tensor."),this.releaseTensor();this.activeUpload?this.activeUpload.set(e):this.activeUpload=new Uint8Array(e)}async download(e){if(this.activeUpload)if(e){e instanceof ArrayBuffer?new Uint8Array(e).set(this.activeUpload):new Uint8Array(e.buffer,e.byteOffset,e.byteLength).set(this.activeUpload);return}else return this.activeUpload.buffer;if(!this.wrapper)throw new Error("Tensor has not been created.");return e?this.wrapper.read(e):this.wrapper.read()}},gM=class{constructor(e){this.backend=e,this.tensorTrackersById=new Map,this.freeTensors=[],this.externalTensors=new Set}getMLContext(e){let t=this.backend.getMLContext(e);if(!t)throw new Error("MLContext not found for session.");return t}reserveTensorId(){let e=D3();return this.tensorTrackersById.set(e,new G3(this)),e}releaseTensorId(e){let t=this.tensorTrackersById.get(e);t&&(this.tensorTrackersById.delete(e),t.tensorWrapper&&this.releaseTensor(t.tensorWrapper))}async ensureTensor(e,t,n,r,i){Bs("verbose",()=>`[WebNN] TensorManager.ensureTensor {tensorId: ${t}, dataType: ${n}, shape: ${r}, copyOld: ${i}}`);let a=this.tensorTrackersById.get(t);if(!a)throw new Error("Tensor not found.");return a.ensureTensor(e,n,r,i)}upload(e,t){let n=this.tensorTrackersById.get(e);if(!n)throw new Error("Tensor not found.");n.upload(t)}async download(e,t){Bs("verbose",()=>`[WebNN] TensorManager.download {tensorId: ${e}, dstBuffer: ${t==null?void 0:t.byteLength}}`);let n=this.tensorTrackersById.get(e);if(!n)throw new Error("Tensor not found.");return n.download(t)}releaseTensorsForSession(e){for(let t of this.freeTensors)t.sessionId===e&&t.destroy();this.freeTensors=this.freeTensors.filter(t=>t.sessionId!==e)}registerTensor(e,t,n,r){let i=this.getMLContext(e),a=D3(),o=new H3({sessionId:e,context:i,tensor:t,dataType:n,shape:r});return this.tensorTrackersById.set(a,new G3(this,o)),this.externalTensors.add(o),a}async getCachedTensor(e,t,n,r,i,a){let o=this.getMLContext(e);for(let[c,u]of this.freeTensors.entries())if(u.canReuseTensor(o,t,n)){Bs("verbose",()=>`[WebNN] Reusing tensor {dataType: ${t}, shape: ${n}}`);let d=this.freeTensors.splice(c,1)[0];return d.sessionId=e,d}Bs("verbose",()=>`[WebNN] MLContext.createTensor {dataType: ${t}, shape: ${n}}`);let l=await o.createTensor({dataType:t,shape:n,dimensions:n,usage:r,writable:i,readable:a});return new H3({sessionId:e,context:o,tensor:l,dataType:t,shape:n})}releaseTensor(e){this.externalTensors.has(e)&&this.externalTensors.delete(e),this.freeTensors.push(e)}},HU=(...e)=>new gM(...e)}),ny,xM,GU,C0e=ur(()=>{hs(),lf(),nL(),j0e(),D0(),ny=new Map([[1,"float32"],[10,"float16"],[6,"int32"],[12,"uint32"],[7,"int64"],[13,"uint64"],[22,"int4"],[21,"uint4"],[3,"int8"],[2,"uint8"],[9,"uint8"]]),xM=(e,t)=>{if(e===t)return!0;if(e===void 0||t===void 0)return!1;let n=Object.keys(e).sort(),r=Object.keys(t).sort();return n.length===r.length&&n.every((i,a)=>i===r[a]&&e[i]===t[i])},GU=class{constructor(e){this.tensorManager=HU(this),this.mlContextBySessionId=new Map,this.sessionIdsByMLContext=new Map,this.mlContextCache=[],this.sessionGraphInputs=new Map,this.temporaryGraphInputs=[],this.temporarySessionTensorIds=new Map,W4(e.logLevel,!!e.debug)}get currentSessionId(){if(this.activeSessionId===void 0)throw new Error("No active session");return this.activeSessionId}onRunStart(e){Bs("verbose",()=>`[WebNN] onRunStart {sessionId: ${e}}`),this.activeSessionId=e}onRunEnd(e){Bs("verbose",()=>`[WebNN] onRunEnd {sessionId: ${e}}`);let t=this.temporarySessionTensorIds.get(e);if(t){for(let n of t)Bs("verbose",()=>`[WebNN] releasing temporary tensor {tensorId: ${n}}`),this.tensorManager.releaseTensorId(n);this.temporarySessionTensorIds.delete(e),this.activeSessionId=void 0}}async createMLContext(e){if(e instanceof GPUDevice){let n=this.mlContextCache.findIndex(r=>r.gpuDevice===e);if(n!==-1)return this.mlContextCache[n].mlContext;{let r=await navigator.ml.createContext(e);return this.mlContextCache.push({gpuDevice:e,mlContext:r}),r}}else if(e===void 0){let n=this.mlContextCache.findIndex(r=>r.options===void 0&&r.gpuDevice===void 0);if(n!==-1)return this.mlContextCache[n].mlContext;{let r=await navigator.ml.createContext();return this.mlContextCache.push({mlContext:r}),r}}let t=this.mlContextCache.findIndex(n=>xM(n.options,e));if(t!==-1)return this.mlContextCache[t].mlContext;{let n=await navigator.ml.createContext(e);return this.mlContextCache.push({options:e,mlContext:n}),n}}registerMLContext(e,t){this.mlContextBySessionId.set(e,t);let n=this.sessionIdsByMLContext.get(t);n||(n=new Set,this.sessionIdsByMLContext.set(t,n)),n.add(e),this.temporaryGraphInputs.length>0&&(this.sessionGraphInputs.set(e,this.temporaryGraphInputs),this.temporaryGraphInputs=[])}onReleaseSession(e){this.sessionGraphInputs.delete(e);let t=this.mlContextBySessionId.get(e);if(!t)return;this.tensorManager.releaseTensorsForSession(e),this.mlContextBySessionId.delete(e);let n=this.sessionIdsByMLContext.get(t);if(n.delete(e),n.size===0){this.sessionIdsByMLContext.delete(t);let r=this.mlContextCache.findIndex(i=>i.mlContext===t);r!==-1&&this.mlContextCache.splice(r,1)}}getMLContext(e){return this.mlContextBySessionId.get(e)}reserveTensorId(){return this.tensorManager.reserveTensorId()}releaseTensorId(e){Bs("verbose",()=>`[WebNN] releaseTensorId {tensorId: ${e}}`),this.tensorManager.releaseTensorId(e)}async ensureTensor(e,t,n,r,i){let a=ny.get(n);if(!a)throw new Error(`Unsupported ONNX data type: ${n}`);return this.tensorManager.ensureTensor(e??this.currentSessionId,t,a,r,i)}async createTemporaryTensor(e,t,n){Bs("verbose",()=>`[WebNN] createTemporaryTensor {onnxDataType: ${t}, shape: ${n}}`);let r=ny.get(t);if(!r)throw new Error(`Unsupported ONNX data type: ${t}`);let i=this.tensorManager.reserveTensorId();await this.tensorManager.ensureTensor(e,i,r,n,!1);let a=this.temporarySessionTensorIds.get(e);return a?a.push(i):this.temporarySessionTensorIds.set(e,[i]),i}uploadTensor(e,t){if(!qa().shouldTransferToMLTensor)throw new Error("Trying to upload to a MLTensor while shouldTransferToMLTensor is false");Bs("verbose",()=>`[WebNN] uploadTensor {tensorId: ${e}, data: ${t.byteLength}}`),this.tensorManager.upload(e,t)}async downloadTensor(e,t){return this.tensorManager.download(e,t)}createMLTensorDownloader(e,t){return async()=>{let n=await this.tensorManager.download(e);return D4(n,t)}}registerMLTensor(e,t,n,r){let i=ny.get(n);if(!i)throw new Error(`Unsupported ONNX data type: ${n}`);let a=this.tensorManager.registerTensor(e,t,i,r);return Bs("verbose",()=>`[WebNN] registerMLTensor {tensor: ${t}, dataType: ${i}, dimensions: ${r}} -> {tensorId: ${a}}`),a}registerMLConstant(e,t,n,r,i,a){if(!a)throw new Error("External mounted files are not available.");let o=e;e.startsWith("./")&&(o=e.substring(2));let l=a.get(o);if(!l)throw new Error(`File with name ${o} not found in preloaded files.`);if(t+n>l.byteLength)throw new Error("Out of bounds: data offset and length exceed the external file data size.");let c=l.slice(t,t+n).buffer,u;switch(i.dataType){case"float32":u=new Float32Array(c);break;case"float16":u=new Uint16Array(c);break;case"int32":u=new Int32Array(c);break;case"uint32":u=new Uint32Array(c);break;case"int64":u=new BigInt64Array(c);break;case"uint64":u=new BigUint64Array(c);break;case"int8":u=new Int8Array(c);break;case"int4":case"uint4":case"uint8":u=new Uint8Array(c);break;default:throw new Error(`Unsupported data type: ${i.dataType} in creating WebNN Constant from external data.`)}return Bs("verbose",()=>`[WebNN] registerMLConstant {dataType: ${i.dataType}, shape: ${i.shape}}}`),r.constant(i,u)}registerGraphInput(e){this.temporaryGraphInputs.push(e)}isGraphInput(e,t){let n=this.sessionGraphInputs.get(e);return n?n.includes(t):!1}flush(){}}}),qU={};zb(qU,{init:()=>KU});var ry,bM,KU,N0e=ur(()=>{hs(),S0e(),D0(),vs(),C0e(),ry=class XU{constructor(t,n,r,i){this.module=t,this.dataType=n,this.data=r,this.dims=i}getFloat32Array(){if(this.dataType!==1)throw new Error("Invalid data type");let t=In.size(this.dims);return t===0?new Float32Array:new Float32Array(this.module.HEAP8.buffer,this.data,t)}getBigInt64Array(){if(this.dataType!==7)throw new Error("Invalid data type");let t=In.size(this.dims);return t===0?new BigInt64Array:new BigInt64Array(this.module.HEAP8.buffer,this.data,t)}getInt32Array(){if(this.dataType!==6)throw new Error("Invalid data type");let t=In.size(this.dims);return t===0?new Int32Array:new Int32Array(this.module.HEAP8.buffer,this.data,t)}getUint16Array(){if(this.dataType!==10&&this.dataType!==4)throw new Error("Invalid data type");let t=In.size(this.dims);return t===0?new Uint16Array:new Uint16Array(this.module.HEAP8.buffer,this.data,t)}reshape(t){if(In.size(t)!==In.size(this.dims))throw new Error("Invalid new shape");return new XU(this.module,this.dataType,this.data,t)}},bM=class{constructor(e,t,n){this.module=e,this.backend=t,this.customDataOffset=0,this.customDataSize=0,this.adapterInfo=t.adapterInfo,this.deviceInfo=t.deviceInfo;let r=e.PTR_SIZE,i=n/e.PTR_SIZE,a=r===4?"i32":"i64";this.opKernelContext=Number(e.getValue(r*i++,a));let o=Number(e.getValue(r*i++,a));this.outputCount=Number(e.getValue(r*i++,a)),this.customDataOffset=Number(e.getValue(r*i++,"*")),this.customDataSize=Number(e.getValue(r*i++,a));let l=[];for(let c=0;ctypeof l=="number"?this.inputs[l]:l))??this.inputs,r=(t==null?void 0:t.outputs)??[],i=(l,c,u)=>new ry(this.module,c,this.output(l,u),u),a=(l,c)=>{let u=Ep(l,c);if(!u)throw new Error(`Unsupported data type: ${l}`);let d=u>0?this.backend.gpuDataManager.create(u).id:0;return new ry(this.module,l,d,c)};return this.backend.run(e,n,r,i,a,this.outputCount)}output(e,t){let n=this.module.stackSave();try{let r=this.module.PTR_SIZE,i=r===4?"i32":"i64",a=this.module.stackAlloc((1+t.length)*r);this.module.setValue(a,t.length,i);for(let o=0;o{let i=t.jsepInit;if(!i)throw new Error("Failed to initialize JSEP. The WebAssembly module is not built with JSEP support.");if(e==="webgpu"){let a=new VU;await a.initialize(n,r),i("webgpu",[a,o=>a.alloc(Number(o)),o=>a.free(o),(o,l,c,u=!1)=>{if(u)Bs("verbose",()=>`[WebGPU] jsepCopyGpuToGpu: src=${Number(o)}, dst=${Number(l)}, size=${Number(c)}`),a.memcpy(Number(o),Number(l));else{Bs("verbose",()=>`[WebGPU] jsepCopyCpuToGpu: dataOffset=${Number(o)}, gpuDataId=${Number(l)}, size=${Number(c)}`);let d=t.HEAPU8.subarray(Number(o>>>0),Number(o>>>0)+Number(c));a.upload(Number(l),d)}},async(o,l,c)=>{Bs("verbose",()=>`[WebGPU] jsepCopyGpuToCpu: gpuDataId=${o}, dataOffset=${l}, size=${c}`),await a.download(Number(o),()=>t.HEAPU8.subarray(Number(l)>>>0,Number(l+c)>>>0))},(o,l,c)=>a.createKernel(o,Number(l),c,t.UTF8ToString(t._JsepGetNodeName(Number(l)))),o=>a.releaseKernel(o),(o,l,c,u)=>{Bs("verbose",()=>`[WebGPU] jsepRun: sessionHandle=${c}, kernel=${o}, contextDataOffset=${l}`);let d=new bM(t,a,Number(l));return a.computeKernel(Number(o),d,u)},()=>a.captureBegin(),()=>a.captureEnd(),()=>a.replay()])}else{let a=new GU(n);i("webnn",[a,()=>a.reserveTensorId(),o=>a.releaseTensorId(o),async(o,l,c,u,d)=>a.ensureTensor(o,l,c,u,d),(o,l)=>{a.uploadTensor(o,l)},async(o,l)=>a.downloadTensor(o,l)])}}}),yM,eS,tS,xh,vM,pw,nS,rS,q3,sS,iS,aS,YU=ur(()=>{Ade(),Mde(),hs(),lf(),O4(),tL(),yM=(e,t)=>{qa()._OrtInit(e,t)!==0&&ti("Can't initialize onnxruntime.")},eS=async e=>{yM(e.wasm.numThreads,cw(e.logLevel))},tS=async(e,t)=>{{let n=(N0e(),ow(qU)).init;if(t==="webgpu"){if(typeof navigator>"u"||!navigator.gpu)throw new Error("WebGPU is not supported in current environment");let r=e.webgpu.adapter;if(r){if(typeof r.limits!="object"||typeof r.features!="object"||typeof r.requestDevice!="function")throw new Error("Invalid GPU adapter set in `env.webgpu.adapter`. It must be a GPUAdapter object.")}else{let i=e.webgpu.powerPreference;if(i!==void 0&&i!=="low-power"&&i!=="high-performance")throw new Error(`Invalid powerPreference setting: "${i}"`);let a=e.webgpu.forceFallbackAdapter;if(a!==void 0&&typeof a!="boolean")throw new Error(`Invalid forceFallbackAdapter setting: "${a}"`);if(r=await navigator.gpu.requestAdapter({powerPreference:i,forceFallbackAdapter:a}),!r)throw new Error('Failed to get GPU adapter. You may need to enable flag "--enable-unsafe-webgpu" if you are using Chrome.')}await n("webgpu",qa(),e,r)}if(t==="webnn"){if(typeof navigator>"u"||!navigator.ml)throw new Error("WebNN is not supported in current environment");await n("webnn",qa(),e)}}},xh=new Map,vM=e=>{let t=qa(),n=t.stackSave();try{let r=t.PTR_SIZE,i=t.stackAlloc(2*r);t._OrtGetInputOutputCount(e,i,i+r)!==0&&ti("Can't get session input/output count.");let a=r===4?"i32":"i64";return[Number(t.getValue(i,a)),Number(t.getValue(i+r,a))]}finally{t.stackRestore(n)}},pw=e=>{let t=qa(),n=t._malloc(e.byteLength);if(n===0)throw new Error(`Can't create a session. failed to allocate a buffer of size ${e.byteLength}.`);return t.HEAPU8.set(e,n),[n,e.byteLength]},nS=async(e,t)=>{var h,p,f;let n,r,i=qa();Array.isArray(e)?[n,r]=e:e.buffer===i.HEAPU8.buffer?[n,r]=[e.byteOffset,e.byteLength]:[n,r]=pw(e);let a=0,o=0,l=0,c=[],u=[],d=[];try{if([o,c]=eL(t),(t==null?void 0:t.externalData)&&i.mountExternalData){let C=[];for(let E of t.externalData){let I=typeof E=="string"?E:E.path;C.push(F4(typeof E=="string"?E:E.data).then(R=>{i.mountExternalData(I,R)}))}await Promise.all(C)}for(let C of(t==null?void 0:t.executionProviders)??[])if((typeof C=="string"?C:C.name)==="webnn"){if(i.shouldTransferToMLTensor=!1,typeof C!="string"){let E=C,I=E==null?void 0:E.context,R=E==null?void 0:E.gpuDevice,A=E==null?void 0:E.deviceType,O=E==null?void 0:E.powerPreference;I?i.currentContext=I:R?i.currentContext=await i.jsepCreateMLContext(R):i.currentContext=await i.jsepCreateMLContext({deviceType:A,powerPreference:O})}else i.currentContext=await i.jsepCreateMLContext();break}a=await i._OrtCreateSession(n,r,o),a===0&&ti("Can't create a session."),(h=i.jsepOnCreateSession)==null||h.call(i),i.currentContext&&(i.jsepRegisterMLContext(a,i.currentContext),i.currentContext=void 0,i.shouldTransferToMLTensor=!0);let[b,g]=vM(a),y=!!(t!=null&&t.enableGraphCapture),w=[],v=[],m=[];for(let C=0;CC==="gpu-buffer"||C==="ml-tensor")&&(l=i._OrtCreateBinding(a),l===0&&ti("Can't create IO binding."),z={handle:l,outputPreferredLocations:m,outputPreferredLocationsEncoded:m.map(C=>V$(C))}),xh.set(a,[a,u,d,z,y,!1]),[a,w,v]}catch(b){throw u.forEach(g=>i._OrtFree(g)),d.forEach(g=>i._OrtFree(g)),l!==0&&i._OrtReleaseBinding(l)!==0&&ti("Can't release IO binding."),a!==0&&i._OrtReleaseSession(a)!==0&&ti("Can't release session."),b}finally{i._free(n),o!==0&&i._OrtReleaseSessionOptions(o)!==0&&ti("Can't release session options."),c.forEach(b=>i._free(b)),(f=i.unmountExternalData)==null||f.call(i)}},rS=e=>{var c;let t=qa(),n=xh.get(e);if(!n)throw new Error(`cannot release session. invalid session id: ${e}`);let[r,i,a,o,l]=n;o&&(l&&t._OrtClearBoundOutputs(o.handle)!==0&&ti("Can't clear bound outputs."),t._OrtReleaseBinding(o.handle)!==0&&ti("Can't release IO binding.")),(c=t.jsepOnReleaseSession)==null||c.call(t,e),i.forEach(u=>t._OrtFree(u)),a.forEach(u=>t._OrtFree(u)),t._OrtReleaseSession(r)!==0&&ti("Can't release session."),xh.delete(e)},q3=async(e,t,n,r,i,a=!1)=>{if(!e){t.push(0);return}let o=qa(),l=o.PTR_SIZE,c=e[0],u=e[1],d=e[3],h=d,p,f;if(c==="string"&&(d==="gpu-buffer"||d==="ml-tensor"))throw new Error("String tensor is not supported on GPU.");if(a&&d!=="gpu-buffer")throw new Error(`External buffer must be provided for input/output index ${i} when enableGraphCapture is true.`);if(d==="gpu-buffer"){let y=e[2].gpuBuffer;f=Ep(Qf(c),u);let w=o.jsepRegisterBuffer;if(!w)throw new Error('Tensor location "gpu-buffer" is not supported without using WebGPU.');p=w(r,i,y,f)}else if(d==="ml-tensor"){let y=e[2].mlTensor;f=Ep(Qf(c),u);let w=o.jsepRegisterMLTensor;if(!w)throw new Error('Tensor location "ml-tensor" is not supported without using WebNN.');p=w(r,y,Qf(c),u)}else{let y=e[2];if(Array.isArray(y)){f=l*y.length,p=o._malloc(f),n.push(p);for(let w=0;wo.setValue(g+v*l,w,l===4?"i32":"i64"));let y=o._OrtCreateTensor(Qf(c),p,f,g,u.length,V$(h));y===0&&ti(`Can't create tensor for input/output. session=${r}, index=${i}.`),t.push(y)}finally{o.stackRestore(b)}},sS=async(e,t,n,r,i,a)=>{var F,L,X;let o=qa(),l=o.PTR_SIZE,c=xh.get(e);if(!c)throw new Error(`cannot run inference. invalid session id: ${e}`);let u=c[0],d=c[1],h=c[2],p=c[3],f=c[4],b=c[5],g=t.length,y=r.length,w=0,v=[],m=[],z=[],C=[],E=o.stackSave(),I=o.stackAlloc(g*l),R=o.stackAlloc(g*l),A=o.stackAlloc(y*l),O=o.stackAlloc(y*l);try{[w,v]=Q7(a);for(let H=0;Hre*ee,1);N=Np(W);let oe=p==null?void 0:p.outputPreferredLocations[r[H]];if(N==="string"){if(oe==="gpu-buffer"||oe==="ml-tensor")throw new Error("String tensor is not supported on GPU.");let re=[];for(let ee=0;ee0){let re=o.jsepGetBuffer;if(!re)throw new Error('preferredLocation "gpu-buffer" is not supported without using WebGPU.');let ee=re(j),pe=Ep(W,ie);if(pe===void 0||!B4(N))throw new Error(`Unsupported data type: ${N}`);V=!0,q.push([N,se,{gpuBuffer:ee,download:o.jsepCreateDownloader(ee,pe,N),dispose:()=>{o._OrtReleaseTensor(J)!==0&&ti("Can't release tensor.")}},"gpu-buffer"])}else if(oe==="ml-tensor"&&ie>0){let re=o.jsepEnsureTensor;if(!re)throw new Error('preferredLocation "ml-tensor" is not supported without using WebNN.');if(Ep(W,ie)===void 0||!U4(N))throw new Error(`Unsupported data type: ${N}`);let ee=await re(e,j,W,se,!1);V=!0,q.push([N,se,{mlTensor:ee,download:o.jsepCreateMLTensorDownloader(j,N),dispose:()=>{o.jsepReleaseTensorId(j),o._OrtReleaseTensor(J)}},"ml-tensor"])}else{let re=L4(N),ee=new re(ie);new Uint8Array(ee.buffer,ee.byteOffset,ee.byteLength).set(o.HEAPU8.subarray(j,j+ee.byteLength)),q.push([N,se,ee,"cpu"])}}finally{o.stackRestore(Z),N==="string"&&j&&o._free(j),V||o._OrtReleaseTensor(J),(X=o.jsepOnRunEnd)==null||X.call(o,u)}}return p&&!f&&(o._OrtClearBoundOutputs(p.handle)!==0&&ti("Can't clear bound outputs."),xh.set(e,[u,d,h,p,f,!1])),q}finally{o.stackRestore(E),m.forEach(T=>o._OrtReleaseTensor(T)),z.forEach(T=>o._OrtReleaseTensor(T)),C.forEach(T=>o._free(T)),w!==0&&o._OrtReleaseRunOptions(w),v.forEach(T=>o._free(T))}},iS=e=>{let t=qa(),n=xh.get(e);if(!n)throw new Error("invalid session id");let r=n[0],i=t._OrtEndProfiling(r);i===0&&ti("Can't get an profile file name."),t._OrtFree(i)},aS=e=>{let t=[];for(let n of e){let r=n[2];!Array.isArray(r)&&"buffer"in r&&t.push(r.buffer)}return t}}),bh,Tl,Hf,Fg,Wg,sy,K3,iy,mp,gp,wM,JU,ZU,QU,eF,tF,nF,rF,sF=ur(()=>{xd(),YU(),lf(),R4(),bh=()=>!!Ui.wasm.proxy&&typeof document<"u",Hf=!1,Fg=!1,Wg=!1,iy=new Map,mp=(e,t)=>{let n=iy.get(e);n?n.push(t):iy.set(e,[t])},gp=()=>{if(Hf||!Fg||Wg||!Tl)throw new Error("worker not ready")},wM=e=>{switch(e.data.type){case"init-wasm":Hf=!1,e.data.err?(Wg=!0,K3[1](e.data.err)):(Fg=!0,K3[0]()),sy&&(URL.revokeObjectURL(sy),sy=void 0);break;case"init-ep":case"copy-from":case"create":case"release":case"run":case"end-profiling":{let t=iy.get(e.data.type);e.data.err?t.shift()[1](e.data.err):t.shift()[0](e.data.out);break}}},JU=async()=>{if(!Fg){if(Hf)throw new Error("multiple calls to 'initWasm()' detected.");if(Wg)throw new Error("previous call to 'initWasm()' failed.");if(Hf=!0,bh())return new Promise((e,t)=>{Tl==null||Tl.terminate(),J7().then(([n,r])=>{var i;try{Tl=r,Tl.onerror=o=>t(o),Tl.onmessage=wM,K3=[e,t];let a={type:"init-wasm",in:Ui};!a.in.wasm.wasmPaths&&(n||(i=import.meta.url)!=null&&i.startsWith("file:"))&&(a.in.wasm.wasmPaths={wasm:new URL(""+new URL("ort-wasm-simd-threaded.jsep-D5Jk56-t.wasm",import.meta.url).href,import.meta.url).href}),Tl.postMessage(a),sy=n}catch(a){t(a)}},t)});try{await P4(Ui.wasm),await eS(Ui),Fg=!0}catch(e){throw Wg=!0,e}finally{Hf=!1}}},ZU=async e=>{if(bh())return gp(),new Promise((t,n)=>{mp("init-ep",[t,n]);let r={type:"init-ep",in:{epName:e,env:Ui}};Tl.postMessage(r)});await tS(Ui,e)},QU=async e=>bh()?(gp(),new Promise((t,n)=>{mp("copy-from",[t,n]);let r={type:"copy-from",in:{buffer:e}};Tl.postMessage(r,[e.buffer])})):pw(e),eF=async(e,t)=>{if(bh()){if(t!=null&&t.preferredOutputLocation)throw new Error('session option "preferredOutputLocation" is not supported for proxy.');return gp(),new Promise((n,r)=>{mp("create",[n,r]);let i={type:"create",in:{model:e,options:{...t}}},a=[];e instanceof Uint8Array&&a.push(e.buffer),Tl.postMessage(i,a)})}else return nS(e,t)},tF=async e=>{if(bh())return gp(),new Promise((t,n)=>{mp("release",[t,n]);let r={type:"release",in:e};Tl.postMessage(r)});rS(e)},nF=async(e,t,n,r,i,a)=>{if(bh()){if(n.some(o=>o[3]!=="cpu"))throw new Error("input tensor on GPU is not supported for proxy.");if(i.some(o=>o))throw new Error("pre-allocated output tensor is not supported for proxy.");return gp(),new Promise((o,l)=>{mp("run",[o,l]);let c=n,u={type:"run",in:{sessionId:e,inputIndices:t,inputs:c,outputIndices:r,options:a}};Tl.postMessage(u,aS(c))})}else return sS(e,t,n,r,i,a)},rF=async e=>{if(bh())return gp(),new Promise((t,n)=>{mp("end-profiling",[t,n]);let r={type:"end-profiling",in:e};Tl.postMessage(r)});iS(e)}}),X3,_M,iF,E0e=ur(()=>{xd(),sF(),hs(),T4(),tL(),X3=(e,t)=>{switch(e.location){case"cpu":return[e.type,e.dims,e.data,"cpu"];case"gpu-buffer":return[e.type,e.dims,{gpuBuffer:e.gpuBuffer},"gpu-buffer"];case"ml-tensor":return[e.type,e.dims,{mlTensor:e.mlTensor},"ml-tensor"];default:throw new Error(`invalid data location: ${e.location} for ${t()}`)}},_M=e=>{switch(e[3]){case"cpu":return new cd(e[0],e[2],e[1]);case"gpu-buffer":{let t=e[0];if(!B4(t))throw new Error(`not supported data type: ${t} for deserializing GPU tensor`);let{gpuBuffer:n,download:r,dispose:i}=e[2];return cd.fromGpuBuffer(n,{dataType:t,dims:e[1],download:r,dispose:i})}case"ml-tensor":{let t=e[0];if(!U4(t))throw new Error(`not supported data type: ${t} for deserializing MLTensor tensor`);let{mlTensor:n,download:r,dispose:i}=e[2];return cd.fromMLTensor(n,{dataType:t,dims:e[1],download:r,dispose:i})}default:throw new Error(`invalid data location: ${e[3]}`)}},iF=class{async fetchModelAndCopyToWasmMemory(e){return QU(await F4(e))}async loadModel(e,t){md();let n;typeof e=="string"?n=await this.fetchModelAndCopyToWasmMemory(e):n=e,[this.sessionId,this.inputNames,this.outputNames]=await eF(n,t),hu()}async dispose(){return tF(this.sessionId)}async run(e,t,n){md();let r=[],i=[];Object.entries(e).forEach(h=>{let p=h[0],f=h[1],b=this.inputNames.indexOf(p);if(b===-1)throw new Error(`invalid input '${p}'`);r.push(f),i.push(b)});let a=[],o=[];Object.entries(t).forEach(h=>{let p=h[0],f=h[1],b=this.outputNames.indexOf(p);if(b===-1)throw new Error(`invalid output '${p}'`);a.push(f),o.push(b)});let l=r.map((h,p)=>X3(h,()=>`input "${this.inputNames[i[p]]}"`)),c=a.map((h,p)=>h?X3(h,()=>`output "${this.outputNames[o[p]]}"`):null),u=await nF(this.sessionId,i,l,o,c,n),d={};for(let h=0;hr5,initializeFlags:()=>n5,wasmBackend:()=>oF});var n5,r5,oF,I0e=ur(()=>{xd(),sF(),E0e(),n5=()=>{if((typeof Ui.wasm.initTimeout!="number"||Ui.wasm.initTimeout<0)&&(Ui.wasm.initTimeout=0),Ui.wasm.simd===!1&&console.warn('Deprecated property "env.wasm.simd" is set to false. non-SIMD build is no longer provided, and this setting will be ignored.'),typeof Ui.wasm.proxy!="boolean"&&(Ui.wasm.proxy=!1),typeof Ui.wasm.trace!="boolean"&&(Ui.wasm.trace=!1),typeof Ui.wasm.numThreads!="number"||!Number.isInteger(Ui.wasm.numThreads)||Ui.wasm.numThreads<=0)if(typeof self<"u"&&!self.crossOriginIsolated)Ui.wasm.numThreads=1;else{let e=typeof navigator>"u"?mde("node:os").cpus().length:navigator.hardwareConcurrency;Ui.wasm.numThreads=Math.min(4,Math.ceil((e||1)/2))}},r5=class{async init(e){n5(),await JU(),await ZU(e)}async createInferenceSessionHandler(e,t){let n=new iF;return await n.loadModel(e,t),Promise.resolve(n)}},oF=new r5});xd();xd();xd();var k0e="1.21.0",A0e=H7;{let e=(I0e(),ow(aF)).wasmBackend;Pp("webgpu",e,5),Pp("webnn",e,5),Pp("cpu",e,10),Pp("wasm",e,10)}Object.defineProperty(Ui.versions,"web",{value:k0e,enumerable:!0});/** +* @license +* Copyright 2021 Google LLC. All Rights Reserved. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* ============================================================================= +*//** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + *//** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */const M0e=Object.freeze(Object.defineProperty({__proto__:null,get InferenceSession(){return M4},get TRACE(){return db},get TRACE_FUNC_BEGIN(){return md},get TRACE_FUNC_END(){return hu},get Tensor(){return cd},default:A0e,get env(){return Ui},get registerBackend(){return Pp}},Symbol.toStringTag,{value:"Module"}));/*! + * ONNX Runtime Web v1.21.0 + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + */var oS=Object.defineProperty,T0e=Object.getOwnPropertyDescriptor,R0e=Object.getOwnPropertyNames,P0e=Object.prototype.hasOwnProperty,O0e=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')}),dr=(e,t)=>()=>(e&&(t=e(e=0)),t),$b=(e,t)=>{for(var n in t)oS(e,n,{get:t[n],enumerable:!0})},L0e=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of R0e(t))!P0e.call(e,i)&&i!==n&&oS(e,i,{get:()=>t[i],enumerable:!(r=T0e(t,i))||r.enumerable});return e},fw=e=>L0e(oS({},"__esModule",{value:!0}),e),Dg,yh,Op,zM,lF,cF=dr(()=>{Dg=new Map,yh=[],Op=(e,t,n)=>{if(t&&typeof t.init=="function"&&typeof t.createInferenceSessionHandler=="function"){let r=Dg.get(e);if(r===void 0)Dg.set(e,{backend:t,priority:n});else{if(r.priority>n)return;if(r.priority===n&&r.backend!==t)throw new Error(`cannot register backend "${e}" using priority ${n}`)}if(n>=0){let i=yh.indexOf(e);i!==-1&&yh.splice(i,1);for(let a=0;a{let t=Dg.get(e);if(!t)return"backend not found.";if(t.initialized)return t.backend;if(t.aborted)return t.error;{let n=!!t.initPromise;try{return n||(t.initPromise=t.backend.init(e)),await t.initPromise,t.initialized=!0,t.backend}catch(r){return n||(t.error=`${r}`,t.aborted=!0),t.error}finally{delete t.initPromise}}},lF=async e=>{let t=e.executionProviders||[],n=t.map(c=>typeof c=="string"?c:c.name),r=n.length===0?yh:n,i,a=[],o=new Set;for(let c of r){let u=await zM(c);typeof u=="string"?a.push({name:c,err:u}):(i||(i=u),i===u&&o.add(c))}if(!i)throw new Error(`no available backend found. ERR: ${a.map(c=>`[${c.name}] ${c.err}`).join(", ")}`);for(let{name:c,err:u}of a)n.includes(c)&&console.warn(`removing requested execution provider "${c}" from session options because it is not available: ${u}`);let l=t.filter(c=>o.has(typeof c=="string"?c:c.name));return[i,new Proxy(e,{get:(c,u)=>u==="executionProviders"?l:Reflect.get(c,u)})]}}),B0e=dr(()=>{cF()}),uF,U0e=dr(()=>{uF="1.21.0"}),Y3,Qc,dF=dr(()=>{U0e(),Y3="warning",Qc={wasm:{},webgl:{},webgpu:{},versions:{common:uF},set logLevel(e){if(e!==void 0){if(typeof e!="string"||["verbose","info","warning","error","fatal"].indexOf(e)===-1)throw new Error(`Unsupported logging level: ${e}`);Y3=e}},get logLevel(){return Y3}},Object.defineProperty(Qc,"logLevel",{enumerable:!0})}),Fi,F0e=dr(()=>{dF(),Fi=Qc}),hF,pF,W0e=dr(()=>{hF=(e,t)=>{let n=typeof document<"u"?document.createElement("canvas"):new OffscreenCanvas(1,1);n.width=e.dims[3],n.height=e.dims[2];let r=n.getContext("2d");if(r!=null){let i,a;(t==null?void 0:t.tensorLayout)!==void 0&&t.tensorLayout==="NHWC"?(i=e.dims[2],a=e.dims[3]):(i=e.dims[3],a=e.dims[2]);let o=(t==null?void 0:t.format)!==void 0?t.format:"RGB",l=t==null?void 0:t.norm,c,u;l===void 0||l.mean===void 0?c=[255,255,255,255]:typeof l.mean=="number"?c=[l.mean,l.mean,l.mean,l.mean]:(c=[l.mean[0],l.mean[1],l.mean[2],0],l.mean[3]!==void 0&&(c[3]=l.mean[3])),l===void 0||l.bias===void 0?u=[0,0,0,0]:typeof l.bias=="number"?u=[l.bias,l.bias,l.bias,l.bias]:(u=[l.bias[0],l.bias[1],l.bias[2],0],l.bias[3]!==void 0&&(u[3]=l.bias[3]));let d=a*i,h=0,p=d,f=d*2,b=-1;o==="RGBA"?(h=0,p=d,f=d*2,b=d*3):o==="RGB"?(h=0,p=d,f=d*2):o==="RBG"&&(h=0,f=d,p=d*2);for(let g=0;g{let n=typeof document<"u"?document.createElement("canvas").getContext("2d"):new OffscreenCanvas(1,1).getContext("2d"),r;if(n!=null){let i,a,o;(t==null?void 0:t.tensorLayout)!==void 0&&t.tensorLayout==="NHWC"?(i=e.dims[2],a=e.dims[1],o=e.dims[3]):(i=e.dims[3],a=e.dims[2],o=e.dims[1]);let l=t!==void 0&&t.format!==void 0?t.format:"RGB",c=t==null?void 0:t.norm,u,d;c===void 0||c.mean===void 0?u=[255,255,255,255]:typeof c.mean=="number"?u=[c.mean,c.mean,c.mean,c.mean]:(u=[c.mean[0],c.mean[1],c.mean[2],255],c.mean[3]!==void 0&&(u[3]=c.mean[3])),c===void 0||c.bias===void 0?d=[0,0,0,0]:typeof c.bias=="number"?d=[c.bias,c.bias,c.bias,c.bias]:(d=[c.bias[0],c.bias[1],c.bias[2],0],c.bias[3]!==void 0&&(d[3]=c.bias[3]));let h=a*i;if(t!==void 0&&(t.format!==void 0&&o===4&&t.format!=="RGBA"||o===3&&t.format!=="RGB"&&t.format!=="BGR"))throw new Error("Tensor format doesn't match input tensor dims");let p=4,f=0,b=1,g=2,y=3,w=0,v=h,m=h*2,z=-1;l==="RGBA"?(w=0,v=h,m=h*2,z=h*3):l==="RGB"?(w=0,v=h,m=h*2):l==="RBG"&&(w=0,m=h,v=h*2),r=n.createImageData(i,a);for(let C=0;C{lS(),ay=(e,t)=>{if(e===void 0)throw new Error("Image buffer must be defined");if(t.height===void 0||t.width===void 0)throw new Error("Image height and width must be defined");if(t.tensorLayout==="NHWC")throw new Error("NHWC Tensor layout is not supported yet");let{height:n,width:r}=t,i=t.norm??{mean:255,bias:0},a,o;typeof i.mean=="number"?a=[i.mean,i.mean,i.mean,i.mean]:a=[i.mean[0],i.mean[1],i.mean[2],i.mean[3]??255],typeof i.bias=="number"?o=[i.bias,i.bias,i.bias,i.bias]:o=[i.bias[0],i.bias[1],i.bias[2],i.bias[3]??0];let l=t.format!==void 0?t.format:"RGBA",c=t.tensorFormat!==void 0&&t.tensorFormat!==void 0?t.tensorFormat:"RGB",u=n*r,d=c==="RGBA"?new Float32Array(u*4):new Float32Array(u*3),h=4,p=0,f=1,b=2,g=3,y=0,w=u,v=u*2,m=-1;l==="RGB"&&(h=3,p=0,f=1,b=2,g=-1),c==="RGBA"?m=u*3:c==="RBG"?(y=0,v=u,w=u*2):c==="BGR"&&(v=0,w=u,y=u*2);for(let z=0;z{let n=typeof HTMLImageElement<"u"&&e instanceof HTMLImageElement,r=typeof ImageData<"u"&&e instanceof ImageData,i=typeof ImageBitmap<"u"&&e instanceof ImageBitmap,a=typeof e=="string",o,l=t??{},c=()=>{if(typeof document<"u")return document.createElement("canvas");if(typeof OffscreenCanvas<"u")return new OffscreenCanvas(1,1);throw new Error("Canvas is not supported")},u=d=>typeof HTMLCanvasElement<"u"&&d instanceof HTMLCanvasElement||d instanceof OffscreenCanvas?d.getContext("2d"):null;if(n){let d=c();d.width=e.width,d.height=e.height;let h=u(d);if(h!=null){let p=e.height,f=e.width;if(t!==void 0&&t.resizedHeight!==void 0&&t.resizedWidth!==void 0&&(p=t.resizedHeight,f=t.resizedWidth),t!==void 0){if(l=t,t.tensorFormat!==void 0)throw new Error("Image input config format must be RGBA for HTMLImageElement");l.tensorFormat="RGBA",l.height=p,l.width=f}else l.tensorFormat="RGBA",l.height=p,l.width=f;h.drawImage(e,0,0),o=h.getImageData(0,0,f,p).data}else throw new Error("Can not access image data")}else if(r){let d,h;if(t!==void 0&&t.resizedWidth!==void 0&&t.resizedHeight!==void 0?(d=t.resizedHeight,h=t.resizedWidth):(d=e.height,h=e.width),t!==void 0&&(l=t),l.format="RGBA",l.height=d,l.width=h,t!==void 0){let p=c();p.width=h,p.height=d;let f=u(p);if(f!=null)f.putImageData(e,0,0),o=f.getImageData(0,0,h,d).data;else throw new Error("Can not access image data")}else o=e.data}else if(i){if(t===void 0)throw new Error("Please provide image config with format for Imagebitmap");let d=c();d.width=e.width,d.height=e.height;let h=u(d);if(h!=null){let p=e.height,f=e.width;return h.drawImage(e,0,0,f,p),o=h.getImageData(0,0,f,p).data,l.height=p,l.width=f,ay(o,l)}else throw new Error("Can not access image data")}else{if(a)return new Promise((d,h)=>{let p=c(),f=u(p);if(!e||!f)return h();let b=new Image;b.crossOrigin="Anonymous",b.src=e,b.onload=()=>{p.width=b.width,p.height=b.height,f.drawImage(b,0,0,p.width,p.height);let g=f.getImageData(0,0,p.width,p.height);l.height=p.height,l.width=p.width,d(ay(g.data,l))}});throw new Error("Input data provided is not supported - aborted tensor creation")}if(o!==void 0)return ay(o,l);throw new Error("Input data provided is not supported - aborted tensor creation")},mF=(e,t)=>{let{width:n,height:r,download:i,dispose:a}=t,o=[1,r,n,4];return new vc({location:"texture",type:"float32",texture:e,dims:o,download:i,dispose:a})},gF=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new vc({location:"gpu-buffer",type:n??"float32",gpuBuffer:e,dims:r,download:i,dispose:a})},xF=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new vc({location:"ml-tensor",type:n??"float32",mlTensor:e,dims:r,download:i,dispose:a})},bF=(e,t,n)=>new vc({location:"cpu-pinned",type:e,data:t,dims:n??[t.length]})}),Ip,ux,J3,yF,V0e=dr(()=>{Ip=new Map([["float32",Float32Array],["uint8",Uint8Array],["int8",Int8Array],["uint16",Uint16Array],["int16",Int16Array],["int32",Int32Array],["bool",Uint8Array],["float64",Float64Array],["uint32",Uint32Array],["int4",Uint8Array],["uint4",Uint8Array]]),ux=new Map([[Float32Array,"float32"],[Uint8Array,"uint8"],[Int8Array,"int8"],[Uint16Array,"uint16"],[Int16Array,"int16"],[Int32Array,"int32"],[Float64Array,"float64"],[Uint32Array,"uint32"]]),J3=!1,yF=()=>{if(!J3){J3=!0;let e=typeof BigInt64Array<"u"&&BigInt64Array.from,t=typeof BigUint64Array<"u"&&BigUint64Array.from,n=globalThis.Float16Array,r=typeof n<"u"&&n.from;e&&(Ip.set("int64",BigInt64Array),ux.set(BigInt64Array,"int64")),t&&(Ip.set("uint64",BigUint64Array),ux.set(BigUint64Array,"uint64")),r?(Ip.set("float16",n),ux.set(n,"float16")):Ip.set("float16",Uint16Array)}}}),vF,wF,H0e=dr(()=>{lS(),vF=e=>{let t=1;for(let n=0;n{switch(e.location){case"cpu":return new vc(e.type,e.data,t);case"cpu-pinned":return new vc({location:"cpu-pinned",data:e.data,type:e.type,dims:t});case"texture":return new vc({location:"texture",texture:e.texture,type:e.type,dims:t});case"gpu-buffer":return new vc({location:"gpu-buffer",gpuBuffer:e.gpuBuffer,type:e.type,dims:t});case"ml-tensor":return new vc({location:"ml-tensor",mlTensor:e.mlTensor,type:e.type,dims:t});default:throw new Error(`tensorReshape: tensor location ${e.location} is not supported`)}}}),vc,lS=dr(()=>{W0e(),D0e(),V0e(),H0e(),vc=class{constructor(e,t,n){yF();let r,i;if(typeof e=="object"&&"location"in e)switch(this.dataLocation=e.location,r=e.type,i=e.dims,e.location){case"cpu-pinned":{let o=Ip.get(r);if(!o)throw new TypeError(`unsupported type "${r}" to create tensor from pinned buffer`);if(!(e.data instanceof o))throw new TypeError(`buffer should be of type ${o.name}`);this.cpuData=e.data;break}case"texture":{if(r!=="float32")throw new TypeError(`unsupported type "${r}" to create tensor from texture`);this.gpuTextureData=e.texture,this.downloader=e.download,this.disposer=e.dispose;break}case"gpu-buffer":{if(r!=="float32"&&r!=="float16"&&r!=="int32"&&r!=="int64"&&r!=="uint32"&&r!=="uint8"&&r!=="bool"&&r!=="uint4"&&r!=="int4")throw new TypeError(`unsupported type "${r}" to create tensor from gpu buffer`);this.gpuBufferData=e.gpuBuffer,this.downloader=e.download,this.disposer=e.dispose;break}case"ml-tensor":{if(r!=="float32"&&r!=="float16"&&r!=="int32"&&r!=="int64"&&r!=="uint32"&&r!=="uint64"&&r!=="int8"&&r!=="uint8"&&r!=="bool"&&r!=="uint4"&&r!=="int4")throw new TypeError(`unsupported type "${r}" to create tensor from MLTensor`);this.mlTensorData=e.mlTensor,this.downloader=e.download,this.disposer=e.dispose;break}default:throw new Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let o,l;if(typeof e=="string")if(r=e,l=n,e==="string"){if(!Array.isArray(t))throw new TypeError("A string tensor's data must be a string array.");o=t}else{let c=Ip.get(e);if(c===void 0)throw new TypeError(`Unsupported tensor type: ${e}.`);if(Array.isArray(t)){if(e==="float16"&&c===Uint16Array||e==="uint4"||e==="int4")throw new TypeError(`Creating a ${e} tensor from number array is not supported. Please use ${c.name} as data.`);e==="uint64"||e==="int64"?o=c.from(t,BigInt):o=c.from(t)}else if(t instanceof c)o=t;else if(t instanceof Uint8ClampedArray)if(e==="uint8")o=Uint8Array.from(t);else throw new TypeError("A Uint8ClampedArray tensor's data must be type of uint8");else if(e==="float16"&&t instanceof Uint16Array&&c!==Uint16Array)o=new globalThis.Float16Array(t.buffer,t.byteOffset,t.length);else throw new TypeError(`A ${r} tensor's data must be type of ${c}`)}else if(l=t,Array.isArray(e)){if(e.length===0)throw new TypeError("Tensor type cannot be inferred from an empty array.");let c=typeof e[0];if(c==="string")r="string",o=e;else if(c==="boolean")r="bool",o=Uint8Array.from(e);else throw new TypeError(`Invalid element type of data array: ${c}.`)}else if(e instanceof Uint8ClampedArray)r="uint8",o=Uint8Array.from(e);else{let c=ux.get(e.constructor);if(c===void 0)throw new TypeError(`Unsupported type for tensor data: ${e.constructor}.`);r=c,o=e}if(l===void 0)l=[o.length];else if(!Array.isArray(l))throw new TypeError("A tensor's dims must be a number array");i=l,this.cpuData=o,this.dataLocation="cpu"}let a=vF(i);if(this.cpuData&&a!==this.cpuData.length&&!((r==="uint4"||r==="int4")&&Math.ceil(a/2)===this.cpuData.length))throw new Error(`Tensor's size(${a}) does not match data length(${this.cpuData.length}).`);this.type=r,this.dims=i,this.size=a}static async fromImage(e,t){return fF(e,t)}static fromTexture(e,t){return mF(e,t)}static fromGpuBuffer(e,t){return gF(e,t)}static fromMLTensor(e,t){return xF(e,t)}static fromPinnedBuffer(e,t,n){return bF(e,t,n)}toDataURL(e){return hF(this,e)}toImageData(e){return pF(this,e)}get data(){if(this.ensureValid(),!this.cpuData)throw new Error("The data is not on CPU. Use `getData()` to download GPU data to CPU, or use `texture` or `gpuBuffer` property to access the GPU data directly.");return this.cpuData}get location(){return this.dataLocation}get texture(){if(this.ensureValid(),!this.gpuTextureData)throw new Error("The data is not stored as a WebGL texture.");return this.gpuTextureData}get gpuBuffer(){if(this.ensureValid(),!this.gpuBufferData)throw new Error("The data is not stored as a WebGPU buffer.");return this.gpuBufferData}get mlTensor(){if(this.ensureValid(),!this.mlTensorData)throw new Error("The data is not stored as a WebNN MLTensor.");return this.mlTensorData}async getData(e){switch(this.ensureValid(),this.dataLocation){case"cpu":case"cpu-pinned":return this.data;case"texture":case"gpu-buffer":case"ml-tensor":{if(!this.downloader)throw new Error("The current tensor is not created with a specified data downloader.");if(this.isDownloading)throw new Error("The current tensor is being downloaded.");try{this.isDownloading=!0;let t=await this.downloader();return this.downloader=void 0,this.dataLocation="cpu",this.cpuData=t,e&&this.disposer&&(this.disposer(),this.disposer=void 0),t}finally{this.isDownloading=!1}}default:throw new Error(`cannot get data from location: ${this.dataLocation}`)}}dispose(){if(this.isDownloading)throw new Error("The current tensor is being downloaded.");this.disposer&&(this.disposer(),this.disposer=void 0),this.cpuData=void 0,this.gpuTextureData=void 0,this.gpuBufferData=void 0,this.mlTensorData=void 0,this.downloader=void 0,this.isDownloading=void 0,this.dataLocation="none"}ensureValid(){if(this.dataLocation==="none")throw new Error("The tensor is disposed.")}reshape(e){if(this.ensureValid(),this.downloader||this.disposer)throw new Error("Cannot reshape a tensor that owns GPU resource.");return wF(this,e)}}}),ud,_F=dr(()=>{lS(),ud=vc}),pb,Z3,gd,pu,zF=dr(()=>{dF(),pb=(e,t)=>{(typeof Qc.trace>"u"?!Qc.wasm.trace:!Qc.trace)||console.timeStamp(`${e}::ORT::${t}`)},Z3=(e,t)=>{var i;let n=((i=new Error().stack)==null?void 0:i.split(/\r\n|\r|\n/g))||[],r=!1;for(let a=0;a{(typeof Qc.trace>"u"?!Qc.wasm.trace:!Qc.trace)||Z3("BEGIN",e)},pu=e=>{(typeof Qc.trace>"u"?!Qc.wasm.trace:!Qc.trace)||Z3("END",e)}}),$F,G0e=dr(()=>{cF(),_F(),zF(),$F=class SF{constructor(t){this.handler=t}async run(t,n,r){gd();let i={},a={};if(typeof t!="object"||t===null||t instanceof ud||Array.isArray(t))throw new TypeError("'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.");let o=!0;if(typeof n=="object"){if(n===null)throw new TypeError("Unexpected argument[1]: cannot be null.");if(n instanceof ud)throw new TypeError("'fetches' cannot be a Tensor");if(Array.isArray(n)){if(n.length===0)throw new TypeError("'fetches' cannot be an empty array.");o=!1;for(let u of n){if(typeof u!="string")throw new TypeError("'fetches' must be a string array or an object.");if(this.outputNames.indexOf(u)===-1)throw new RangeError(`'fetches' contains invalid output name: ${u}.`);i[u]=null}if(typeof r=="object"&&r!==null)a=r;else if(typeof r<"u")throw new TypeError("'options' must be an object.")}else{let u=!1,d=Object.getOwnPropertyNames(n);for(let h of this.outputNames)if(d.indexOf(h)!==-1){let p=n[h];(p===null||p instanceof ud)&&(u=!0,o=!1,i[h]=p)}if(u){if(typeof r=="object"&&r!==null)a=r;else if(typeof r<"u")throw new TypeError("'options' must be an object.")}else a=n}}else if(typeof n<"u")throw new TypeError("Unexpected argument[1]: must be 'fetches' or 'options'.");for(let u of this.inputNames)if(typeof t[u]>"u")throw new Error(`input '${u}' is missing in 'feeds'.`);if(o)for(let u of this.outputNames)i[u]=null;let l=await this.handler.run(t,i,a),c={};for(let u in l)if(Object.hasOwnProperty.call(l,u)){let d=l[u];d instanceof ud?c[u]=d:c[u]=new ud(d.type,d.data,d.dims)}return pu(),c}async release(){return this.handler.dispose()}static async create(t,n,r,i){gd();let a,o={};if(typeof t=="string"){if(a=t,typeof n=="object"&&n!==null)o=n;else if(typeof n<"u")throw new TypeError("'options' must be an object.")}else if(t instanceof Uint8Array){if(a=t,typeof n=="object"&&n!==null)o=n;else if(typeof n<"u")throw new TypeError("'options' must be an object.")}else if(t instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&t instanceof SharedArrayBuffer){let d=t,h=0,p=t.byteLength;if(typeof n=="object"&&n!==null)o=n;else if(typeof n=="number"){if(h=n,!Number.isSafeInteger(h))throw new RangeError("'byteOffset' must be an integer.");if(h<0||h>=d.byteLength)throw new RangeError(`'byteOffset' is out of range [0, ${d.byteLength}).`);if(p=t.byteLength-h,typeof r=="number"){if(p=r,!Number.isSafeInteger(p))throw new RangeError("'byteLength' must be an integer.");if(p<=0||h+p>d.byteLength)throw new RangeError(`'byteLength' is out of range (0, ${d.byteLength-h}].`);if(typeof i=="object"&&i!==null)o=i;else if(typeof i<"u")throw new TypeError("'options' must be an object.")}else if(typeof r<"u")throw new TypeError("'byteLength' must be a number.")}else if(typeof n<"u")throw new TypeError("'options' must be an object.");a=new Uint8Array(d,h,p)}else throw new TypeError("Unexpected argument[0]: must be 'path' or 'buffer'.");let[l,c]=await lF(o),u=await l.createInferenceSessionHandler(a,c);return pu(),new SF(u)}startProfiling(){this.handler.startProfiling()}endProfiling(){this.handler.endProfiling()}get inputNames(){return this.handler.inputNames}get outputNames(){return this.handler.outputNames}}}),cS,q0e=dr(()=>{G0e(),cS=$F}),K0e=dr(()=>{}),X0e=dr(()=>{}),Y0e=dr(()=>{}),J0e=dr(()=>{}),jF={};$b(jF,{InferenceSession:()=>cS,TRACE:()=>pb,TRACE_FUNC_BEGIN:()=>gd,TRACE_FUNC_END:()=>pu,Tensor:()=>ud,env:()=>Fi,registerBackend:()=>Op});var bd=dr(()=>{B0e(),F0e(),q0e(),_F(),K0e(),X0e(),zF(),Y0e(),J0e()}),uS=dr(()=>{}),CF={};$b(CF,{default:()=>NF});var Q3,ez,NF,Z0e=dr(()=>{var e;kV(),uf(),dS(),Q3="ort-wasm-proxy-worker",ez=((e=globalThis.self)==null?void 0:e.name)===Q3,ez&&(self.onmessage=t=>{let{type:n,in:r}=t.data;try{switch(n){case"init-wasm":hS(r.wasm).then(()=>{IS(r).then(()=>{postMessage({type:n})},i=>{postMessage({type:n,err:i})})},i=>{postMessage({type:n,err:i})});break;case"init-ep":{let{epName:i,env:a}=r;kS(a,i).then(()=>{postMessage({type:n})},o=>{postMessage({type:n,err:o})});break}case"copy-from":{let{buffer:i}=r,a=vw(i);postMessage({type:n,out:a});break}case"create":{let{model:i,options:a}=r;AS(i,a).then(o=>{postMessage({type:n,out:o})},o=>{postMessage({type:n,err:o})});break}case"release":MS(r),postMessage({type:n});break;case"run":{let{sessionId:i,inputIndices:a,inputs:o,outputIndices:l,options:c}=r;TS(i,a,o,l,new Array(l.length).fill(null),c).then(u=>{u.some(d=>d[3]!=="cpu")?postMessage({type:n,err:"Proxy does not support non-cpu tensor location."}):postMessage({type:n,out:u},PS([...o,...u]))},u=>{postMessage({type:n,err:u})});break}case"end-profiling":RS(r),postMessage({type:n});break;default:}}catch(i){postMessage({type:n,err:i})}}),NF=ez?null:t=>new Worker(t??mc,{type:"module",name:Q3})}),EF={};$b(EF,{default:()=>IF});var tz,nz,IF,$M,Q0e=dr(()=>{var e,t;nz=(tz=import.meta.url,async function(n={}){var oc;var r,i,a=n,o=new Promise(($,P)=>{r=$,i=P}),l=typeof window=="object",c=typeof WorkerGlobalScope<"u",u=c&&((oc=self.name)==null?void 0:oc.startsWith("em-pthread"));a.mountExternalData=($,P)=>{$.startsWith("./")&&($=$.substring(2)),(a.Bd||(a.Bd=new Map)).set($,P)},a.unmountExternalData=()=>{delete a.Bd};var d=globalThis.SharedArrayBuffer??new WebAssembly.Memory({initial:0,maximum:0,shared:!0}).buffer.constructor;let h=()=>{let $=(K,ae,he)=>(...Oe)=>{let et=Ke,yt=ae==null?void 0:ae();Oe=K(...Oe);let Ct=ae==null?void 0:ae();return yt!==Ct&&(K=Ct,he(yt),ae=he=null),Ke!=et?new Promise((nn,pn)=>{br={resolve:nn,reject:pn}}):Oe},P=K=>async(...ae)=>{var he;try{if(a.Cd)throw Error("Session already started");let Oe=a.Cd={be:ae[0],errors:[]},et=await K(...ae);if(a.Cd!==Oe)throw Error("Session mismatch");(he=a.Dd)==null||he.flush();let yt=Oe.errors;if(0nn),0a._OrtCreateSession,K=>a._OrtCreateSession=K),a._OrtRun=P($(a._OrtRun,()=>a._OrtRun,K=>a._OrtRun=K)),a._OrtRunWithBinding=P($(a._OrtRunWithBinding,()=>a._OrtRunWithBinding,K=>a._OrtRunWithBinding=K)),a._OrtBindInput=$(a._OrtBindInput,()=>a._OrtBindInput,K=>a._OrtBindInput=K),h=void 0};a.jsepInit=($,P)=>{if(h==null||h(),$==="webgpu"){[a.Dd,a.Rd,a.Vd,a.Hd,a.Ud,a.hc,a.Wd,a.Zd,a.Sd,a.Td,a.Xd]=P;let K=a.Dd;a.jsepRegisterBuffer=(ae,he,Oe,et)=>K.registerBuffer(ae,he,Oe,et),a.jsepGetBuffer=ae=>K.getBuffer(ae),a.jsepCreateDownloader=(ae,he,Oe)=>K.createDownloader(ae,he,Oe),a.jsepOnCreateSession=ae=>{K.onCreateSession(ae)},a.jsepOnReleaseSession=ae=>{K.onReleaseSession(ae)},a.jsepOnRunStart=ae=>K.onRunStart(ae),a.$d=(ae,he)=>{K.upload(ae,he)}}else if($==="webnn"){[a.Dd,a.Yd,a.Id,a.jsepEnsureTensor,a.Jd,a.jsepDownloadTensor]=P,a.jsepReleaseTensorId=a.Id,a.jsepUploadTensor=a.Jd;let K=a.Dd;a.jsepOnRunStart=ae=>K.onRunStart(ae),a.jsepOnRunEnd=K.onRunEnd.bind(K),a.jsepRegisterMLContext=(ae,he)=>{K.registerMLContext(ae,he)},a.jsepOnReleaseSession=ae=>{K.onReleaseSession(ae)},a.jsepCreateMLTensorDownloader=(ae,he)=>K.createMLTensorDownloader(ae,he),a.jsepRegisterMLTensor=(ae,he,Oe,et)=>K.registerMLTensor(ae,he,Oe,et),a.jsepCreateMLContext=ae=>K.createMLContext(ae),a.jsepRegisterMLConstant=(ae,he,Oe,et,yt)=>K.registerMLConstant(ae,he,Oe,et,yt,a.Bd),a.jsepRegisterGraphInput=K.registerGraphInput.bind(K),a.jsepIsGraphInput=K.isGraphInput.bind(K),a.jsepCreateTemporaryTensor=K.createTemporaryTensor.bind(K)}};var p,f,b=Object.assign({},a),g=($,P)=>{throw P},y="";(l||c)&&(c?y=self.location.href:typeof document<"u"&&document.currentScript&&(y=document.currentScript.src),tz&&(y=tz),y=y.startsWith("blob:")?"":y.slice(0,y.replace(/[?#].*/,"").lastIndexOf("/")+1),c&&(f=$=>{var P=new XMLHttpRequest;return P.open("GET",$,!1),P.responseType="arraybuffer",P.send(null),new Uint8Array(P.response)}),p=async $=>{if(V($))return new Promise((K,ae)=>{var he=new XMLHttpRequest;he.open("GET",$,!0),he.responseType="arraybuffer",he.onload=()=>{he.status==200||he.status==0&&he.response?K(he.response):ae(he.status)},he.onerror=ae,he.send(null)});var P=await fetch($,{credentials:"same-origin"});if(P.ok)return P.arrayBuffer();throw Error(P.status+" : "+P.url)});var w=console.log.bind(console),v=console.error.bind(console),m=w,z=v;Object.assign(a,b),b=null;var C,E,I,R,A,O,F,L,X,T,q,H,J,Z=a.wasmBinary,B=!1,V=$=>$.startsWith("file://");function N(){return C.buffer!=R.buffer&&ee(),R}function j(){return C.buffer!=R.buffer&&ee(),A}function k(){return C.buffer!=R.buffer&&ee(),O}function W(){return C.buffer!=R.buffer&&ee(),F}function M(){return C.buffer!=R.buffer&&ee(),L}function Y(){return C.buffer!=R.buffer&&ee(),X}function se(){return C.buffer!=R.buffer&&ee(),T}function ie(){return C.buffer!=R.buffer&&ee(),J}if(u){let $=function(P){try{var K=P.data,ae=K.yd;if(ae==="load"){let he=[];self.onmessage=Oe=>he.push(Oe),self.startWorker=()=>{postMessage({yd:"loaded"});for(let Oe of he)$(Oe);self.onmessage=$};for(let Oe of K.Od)a[Oe]&&!a[Oe].proxy||(a[Oe]=(...et)=>{postMessage({yd:"callHandler",Nd:Oe,args:et})},Oe=="print"&&(m=a[Oe]),Oe=="printErr"&&(z=a[Oe]));C=K.he,ee(),oe(K.ie)}else if(ae==="run"){He(K.xd),ya(K.xd,0,0,1,0,0),Pe(),tn(K.xd),re||(s0(),re=!0);try{Je(K.de,K.Fd)}catch(he){if(he!="unwind")throw he}}else K.target!=="setimmediate"&&(ae==="checkMailbox"?re&&cn():ae&&(z(`worker: received unknown command ${ae}`),z(K)))}catch(he){throw Gl(),he}};var oe,re=!1;z=function(...P){P=P.join(" "),console.error(P)},self.alert=function(...P){postMessage({yd:"alert",text:P.join(" "),fe:Vl()})},self.onunhandledrejection=P=>{throw P.reason||P},self.onmessage=$}function ee(){var $=C.buffer;a.HEAP8=R=new Int8Array($),a.HEAP16=O=new Int16Array($),a.HEAPU8=A=new Uint8Array($),a.HEAPU16=F=new Uint16Array($),a.HEAP32=L=new Int32Array($),a.HEAPU32=X=new Uint32Array($),a.HEAPF32=T=new Float32Array($),a.HEAPF64=J=new Float64Array($),a.HEAP64=q=new BigInt64Array($),a.HEAPU64=H=new BigUint64Array($)}function pe(){u?startWorker(a):Qt.Bb()}u||(C=new WebAssembly.Memory({initial:256,maximum:65536,shared:!0}),ee());var we,Q=0,me=null;function ue(){if(--Q==0&&me){var $=me;me=null,$()}}function U($){throw z($="Aborted("+$+")"),B=!0,$=new WebAssembly.RuntimeError($+". Build with -sASSERTIONS for more info."),i($),$}function G(){return{a:{Ta:ne,Va:ge,W:Re,la:Ze,b:qe,u:tt,R:Ye,Za:ct,d:pt,pb:wt,g:Le,T:Yt,Ga:un,lb:fn,nb:Dn,Ha:it,Ea:Lt,wb:gt,Da:Jt,pa:Wt,mb:Pt,jb:Bt,Fa:zt,kb:Gt,Ma:st,za:St,eb:Ue,cb:Ot,ya:Vt,V:Zt,N:Sn,db:jn,ma:Rr,fb:sr,zb:mt,hb:zn,qb:bt,ab:bn,Aa:An,yb:tn,Ja:Vn,S:Wr,Wa:ir,$:nr,G:jr,E:es,m:rt,H:zs,B:ki,X:gi,J:$i,v:gs,O:Ri,D:Ki,t:Ps,A:Si,z:xi,w:li,r:ca,tb:ea,ub:_i,vb:ta,rb:ua,sb:Wi,bb:da,Oa:ha,La:ka,y:Kt,ja:an,Ba:en,Ka:Li,qa:rn,Ia:gn,ib:lr,U:Oi,fa:On,Sa:wr,gb:cs,Qa:Ns,Pa:Di,Ab:na,Ca:ui,ob:Ce,aa:fs,oa:Js,xb:Ai,na:Dl,$a:Lu,ia:sc,sa:Hi,ga:Ao,da:$l,ua:ic,p:Id,e:Jo,c:Ha,ea:rc,f:Oc,n:Zo,k:Ra,Y:Os,ka:Mi,j:_l,wa:zl,Ra:ac,ca:ma,Ua:Ba,P:Oa,K:wl,_:bo,Q:Pa,Z:Uu,x:Fs,l:tc,va,i:Pc,h:Ma,ra:ai,ta:wa,o:Pu,q:pa,s:nc,I:Lc,C:Ed,L:Ou,xa:l0,_a:Bu,F:La,Ya:Qo,ba:c0,M:Ta,Xa:fa,ha:yd,a:C,Na:_e}}}var te={1319426:()=>typeof wasmOffsetConverter<"u",1319483:($,P,K,ae,he)=>{if(a===void 0||!a.Bd)return 1;if(($=Nt(Number($>>>0))).startsWith("./")&&($=$.substring(2)),!($=a.Bd.get($)))return 2;if(P=Number(P>>>0),K=Number(K>>>0),ae=Number(ae>>>0),P+K>$.byteLength)return 3;try{let Oe=$.subarray(P,P+K);switch(he){case 0:j().set(Oe,ae>>>0);break;case 1:a.$d(ae,Oe);break;default:return 4}return 0}catch{return 4}},1320198:($,P,K)=>{a.Jd($,j().subarray(P>>>0,P+K>>>0))},1320261:()=>a.Yd(),1320302:$=>{a.Id($)},1320338:()=>{a.Sd()},1320369:()=>{a.Td()},1320398:()=>{a.Xd()},1320423:$=>a.Rd($),1320456:$=>a.Vd($),1320488:($,P,K)=>{a.Hd(Number($),Number(P),Number(K),!0)},1320551:($,P,K)=>{a.Hd(Number($),Number(P),Number(K))},1320608:$=>{a.hc("Abs",$,void 0)},1320659:$=>{a.hc("Neg",$,void 0)},1320710:$=>{a.hc("Floor",$,void 0)},1320763:$=>{a.hc("Ceil",$,void 0)},1320815:$=>{a.hc("Reciprocal",$,void 0)},1320873:$=>{a.hc("Sqrt",$,void 0)},1320925:$=>{a.hc("Exp",$,void 0)},1320976:$=>{a.hc("Erf",$,void 0)},1321027:$=>{a.hc("Sigmoid",$,void 0)},1321082:($,P,K)=>{a.hc("HardSigmoid",$,{alpha:P,beta:K})},1321161:$=>{a.hc("Log",$,void 0)},1321212:$=>{a.hc("Sin",$,void 0)},1321263:$=>{a.hc("Cos",$,void 0)},1321314:$=>{a.hc("Tan",$,void 0)},1321365:$=>{a.hc("Asin",$,void 0)},1321417:$=>{a.hc("Acos",$,void 0)},1321469:$=>{a.hc("Atan",$,void 0)},1321521:$=>{a.hc("Sinh",$,void 0)},1321573:$=>{a.hc("Cosh",$,void 0)},1321625:$=>{a.hc("Asinh",$,void 0)},1321678:$=>{a.hc("Acosh",$,void 0)},1321731:$=>{a.hc("Atanh",$,void 0)},1321784:$=>{a.hc("Tanh",$,void 0)},1321836:$=>{a.hc("Not",$,void 0)},1321887:($,P,K)=>{a.hc("Clip",$,{min:P,max:K})},1321956:$=>{a.hc("Clip",$,void 0)},1322008:($,P)=>{a.hc("Elu",$,{alpha:P})},1322066:$=>{a.hc("Gelu",$,void 0)},1322118:$=>{a.hc("Relu",$,void 0)},1322170:($,P)=>{a.hc("LeakyRelu",$,{alpha:P})},1322234:($,P)=>{a.hc("ThresholdedRelu",$,{alpha:P})},1322304:($,P)=>{a.hc("Cast",$,{to:P})},1322362:$=>{a.hc("Add",$,void 0)},1322413:$=>{a.hc("Sub",$,void 0)},1322464:$=>{a.hc("Mul",$,void 0)},1322515:$=>{a.hc("Div",$,void 0)},1322566:$=>{a.hc("Pow",$,void 0)},1322617:$=>{a.hc("Equal",$,void 0)},1322670:$=>{a.hc("Greater",$,void 0)},1322725:$=>{a.hc("GreaterOrEqual",$,void 0)},1322787:$=>{a.hc("Less",$,void 0)},1322839:$=>{a.hc("LessOrEqual",$,void 0)},1322898:($,P,K,ae,he)=>{a.hc("ReduceMean",$,{keepDims:!!P,noopWithEmptyAxes:!!K,axes:ae?Array.from(M().subarray(Number(ae)>>>0,Number(he)>>>0)):[]})},1323073:($,P,K,ae,he)=>{a.hc("ReduceMax",$,{keepDims:!!P,noopWithEmptyAxes:!!K,axes:ae?Array.from(M().subarray(Number(ae)>>>0,Number(he)>>>0)):[]})},1323247:($,P,K,ae,he)=>{a.hc("ReduceMin",$,{keepDims:!!P,noopWithEmptyAxes:!!K,axes:ae?Array.from(M().subarray(Number(ae)>>>0,Number(he)>>>0)):[]})},1323421:($,P,K,ae,he)=>{a.hc("ReduceProd",$,{keepDims:!!P,noopWithEmptyAxes:!!K,axes:ae?Array.from(M().subarray(Number(ae)>>>0,Number(he)>>>0)):[]})},1323596:($,P,K,ae,he)=>{a.hc("ReduceSum",$,{keepDims:!!P,noopWithEmptyAxes:!!K,axes:ae?Array.from(M().subarray(Number(ae)>>>0,Number(he)>>>0)):[]})},1323770:($,P,K,ae,he)=>{a.hc("ReduceL1",$,{keepDims:!!P,noopWithEmptyAxes:!!K,axes:ae?Array.from(M().subarray(Number(ae)>>>0,Number(he)>>>0)):[]})},1323943:($,P,K,ae,he)=>{a.hc("ReduceL2",$,{keepDims:!!P,noopWithEmptyAxes:!!K,axes:ae?Array.from(M().subarray(Number(ae)>>>0,Number(he)>>>0)):[]})},1324116:($,P,K,ae,he)=>{a.hc("ReduceLogSum",$,{keepDims:!!P,noopWithEmptyAxes:!!K,axes:ae?Array.from(M().subarray(Number(ae)>>>0,Number(he)>>>0)):[]})},1324293:($,P,K,ae,he)=>{a.hc("ReduceSumSquare",$,{keepDims:!!P,noopWithEmptyAxes:!!K,axes:ae?Array.from(M().subarray(Number(ae)>>>0,Number(he)>>>0)):[]})},1324473:($,P,K,ae,he)=>{a.hc("ReduceLogSumExp",$,{keepDims:!!P,noopWithEmptyAxes:!!K,axes:ae?Array.from(M().subarray(Number(ae)>>>0,Number(he)>>>0)):[]})},1324653:$=>{a.hc("Where",$,void 0)},1324706:($,P,K)=>{a.hc("Transpose",$,{perm:P?Array.from(M().subarray(Number(P)>>>0,Number(K)>>>0)):[]})},1324830:($,P,K,ae)=>{a.hc("DepthToSpace",$,{blocksize:P,mode:Nt(K),format:ae?"NHWC":"NCHW"})},1324963:($,P,K,ae)=>{a.hc("DepthToSpace",$,{blocksize:P,mode:Nt(K),format:ae?"NHWC":"NCHW"})},1325096:($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn,Hr,Zs)=>{a.hc("ConvTranspose",$,{format:Ct?"NHWC":"NCHW",autoPad:P,dilations:[K],group:ae,kernelShape:[he],pads:[Oe,et],strides:[yt],wIsConst:()=>!!N()[nn>>>0],outputPadding:pn?Array.from(M().subarray(Number(pn)>>>0,Number(Un)>>>0)):[],outputShape:Qn?Array.from(M().subarray(Number(Qn)>>>0,Number(Hr)>>>0)):[],activation:Nt(Zs)})},1325529:($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn,Hr)=>{a.hc("ConvTranspose",$,{format:yt?"NHWC":"NCHW",autoPad:P,dilations:Array.from(M().subarray(Number(K)>>>0,2+(Number(K)>>>0)>>>0)),group:ae,kernelShape:Array.from(M().subarray(Number(he)>>>0,2+(Number(he)>>>0)>>>0)),pads:Array.from(M().subarray(Number(Oe)>>>0,4+(Number(Oe)>>>0)>>>0)),strides:Array.from(M().subarray(Number(et)>>>0,2+(Number(et)>>>0)>>>0)),wIsConst:()=>!!N()[Ct>>>0],outputPadding:nn?Array.from(M().subarray(Number(nn)>>>0,Number(pn)>>>0)):[],outputShape:Un?Array.from(M().subarray(Number(Un)>>>0,Number(Qn)>>>0)):[],activation:Nt(Hr)})},1326190:($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn,Hr,Zs)=>{a.hc("ConvTranspose",$,{format:Ct?"NHWC":"NCHW",autoPad:P,dilations:[K],group:ae,kernelShape:[he],pads:[Oe,et],strides:[yt],wIsConst:()=>!!N()[nn>>>0],outputPadding:pn?Array.from(M().subarray(Number(pn)>>>0,Number(Un)>>>0)):[],outputShape:Qn?Array.from(M().subarray(Number(Qn)>>>0,Number(Hr)>>>0)):[],activation:Nt(Zs)})},1326623:($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn,Hr)=>{a.hc("ConvTranspose",$,{format:yt?"NHWC":"NCHW",autoPad:P,dilations:Array.from(M().subarray(Number(K)>>>0,2+(Number(K)>>>0)>>>0)),group:ae,kernelShape:Array.from(M().subarray(Number(he)>>>0,2+(Number(he)>>>0)>>>0)),pads:Array.from(M().subarray(Number(Oe)>>>0,4+(Number(Oe)>>>0)>>>0)),strides:Array.from(M().subarray(Number(et)>>>0,2+(Number(et)>>>0)>>>0)),wIsConst:()=>!!N()[Ct>>>0],outputPadding:nn?Array.from(M().subarray(Number(nn)>>>0,Number(pn)>>>0)):[],outputShape:Un?Array.from(M().subarray(Number(Un)>>>0,Number(Qn)>>>0)):[],activation:Nt(Hr)})},1327284:($,P)=>{a.hc("GlobalAveragePool",$,{format:P?"NHWC":"NCHW"})},1327375:($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn,Hr)=>{a.hc("AveragePool",$,{format:Hr?"NHWC":"NCHW",auto_pad:P,ceil_mode:K,count_include_pad:ae,storage_order:he,dilations:Oe?Array.from(M().subarray(Number(Oe)>>>0,Number(et)>>>0)):[],kernel_shape:yt?Array.from(M().subarray(Number(yt)>>>0,Number(Ct)>>>0)):[],pads:nn?Array.from(M().subarray(Number(nn)>>>0,Number(pn)>>>0)):[],strides:Un?Array.from(M().subarray(Number(Un)>>>0,Number(Qn)>>>0)):[]})},1327854:($,P)=>{a.hc("GlobalAveragePool",$,{format:P?"NHWC":"NCHW"})},1327945:($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn,Hr)=>{a.hc("AveragePool",$,{format:Hr?"NHWC":"NCHW",auto_pad:P,ceil_mode:K,count_include_pad:ae,storage_order:he,dilations:Oe?Array.from(M().subarray(Number(Oe)>>>0,Number(et)>>>0)):[],kernel_shape:yt?Array.from(M().subarray(Number(yt)>>>0,Number(Ct)>>>0)):[],pads:nn?Array.from(M().subarray(Number(nn)>>>0,Number(pn)>>>0)):[],strides:Un?Array.from(M().subarray(Number(Un)>>>0,Number(Qn)>>>0)):[]})},1328424:($,P)=>{a.hc("GlobalMaxPool",$,{format:P?"NHWC":"NCHW"})},1328511:($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn,Hr)=>{a.hc("MaxPool",$,{format:Hr?"NHWC":"NCHW",auto_pad:P,ceil_mode:K,count_include_pad:ae,storage_order:he,dilations:Oe?Array.from(M().subarray(Number(Oe)>>>0,Number(et)>>>0)):[],kernel_shape:yt?Array.from(M().subarray(Number(yt)>>>0,Number(Ct)>>>0)):[],pads:nn?Array.from(M().subarray(Number(nn)>>>0,Number(pn)>>>0)):[],strides:Un?Array.from(M().subarray(Number(Un)>>>0,Number(Qn)>>>0)):[]})},1328986:($,P)=>{a.hc("GlobalMaxPool",$,{format:P?"NHWC":"NCHW"})},1329073:($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn,Hr)=>{a.hc("MaxPool",$,{format:Hr?"NHWC":"NCHW",auto_pad:P,ceil_mode:K,count_include_pad:ae,storage_order:he,dilations:Oe?Array.from(M().subarray(Number(Oe)>>>0,Number(et)>>>0)):[],kernel_shape:yt?Array.from(M().subarray(Number(yt)>>>0,Number(Ct)>>>0)):[],pads:nn?Array.from(M().subarray(Number(nn)>>>0,Number(pn)>>>0)):[],strides:Un?Array.from(M().subarray(Number(Un)>>>0,Number(Qn)>>>0)):[]})},1329548:($,P,K,ae,he)=>{a.hc("Gemm",$,{alpha:P,beta:K,transA:ae,transB:he})},1329652:$=>{a.hc("MatMul",$,void 0)},1329706:($,P,K,ae)=>{a.hc("ArgMax",$,{keepDims:!!P,selectLastIndex:!!K,axis:ae})},1329814:($,P,K,ae)=>{a.hc("ArgMin",$,{keepDims:!!P,selectLastIndex:!!K,axis:ae})},1329922:($,P)=>{a.hc("Softmax",$,{axis:P})},1329985:($,P)=>{a.hc("Concat",$,{axis:P})},1330045:($,P,K,ae,he)=>{a.hc("Split",$,{axis:P,numOutputs:K,splitSizes:ae?Array.from(M().subarray(Number(ae)>>>0,Number(he)>>>0)):[]})},1330201:$=>{a.hc("Expand",$,void 0)},1330255:($,P)=>{a.hc("Gather",$,{axis:Number(P)})},1330326:($,P)=>{a.hc("GatherElements",$,{axis:Number(P)})},1330405:($,P)=>{a.hc("GatherND",$,{batch_dims:Number(P)})},1330484:($,P,K,ae,he,Oe,et,yt,Ct,nn,pn)=>{a.hc("Resize",$,{antialias:P,axes:K?Array.from(M().subarray(Number(K)>>>0,Number(ae)>>>0)):[],coordinateTransformMode:Nt(he),cubicCoeffA:Oe,excludeOutside:et,extrapolationValue:yt,keepAspectRatioPolicy:Nt(Ct),mode:Nt(nn),nearestMode:Nt(pn)})},1330846:($,P,K,ae,he,Oe,et)=>{a.hc("Slice",$,{starts:P?Array.from(M().subarray(Number(P)>>>0,Number(K)>>>0)):[],ends:ae?Array.from(M().subarray(Number(ae)>>>0,Number(he)>>>0)):[],axes:Oe?Array.from(M().subarray(Number(Oe)>>>0,Number(et)>>>0)):[]})},1331110:$=>{a.hc("Tile",$,void 0)},1331162:($,P,K)=>{a.hc("InstanceNormalization",$,{epsilon:P,format:K?"NHWC":"NCHW"})},1331276:($,P,K)=>{a.hc("InstanceNormalization",$,{epsilon:P,format:K?"NHWC":"NCHW"})},1331390:$=>{a.hc("Range",$,void 0)},1331443:($,P)=>{a.hc("Einsum",$,{equation:Nt(P)})},1331524:($,P,K,ae,he)=>{a.hc("Pad",$,{mode:P,value:K,pads:ae?Array.from(M().subarray(Number(ae)>>>0,Number(he)>>>0)):[]})},1331667:($,P,K,ae,he,Oe)=>{a.hc("BatchNormalization",$,{epsilon:P,momentum:K,spatial:!!he,trainingMode:!!ae,format:Oe?"NHWC":"NCHW"})},1331836:($,P,K,ae,he,Oe)=>{a.hc("BatchNormalization",$,{epsilon:P,momentum:K,spatial:!!he,trainingMode:!!ae,format:Oe?"NHWC":"NCHW"})},1332005:($,P,K)=>{a.hc("CumSum",$,{exclusive:Number(P),reverse:Number(K)})},1332102:($,P,K)=>{a.hc("DequantizeLinear",$,{axis:P,blockSize:K})},1332192:($,P,K,ae,he)=>{a.hc("GridSample",$,{align_corners:P,mode:Nt(K),padding_mode:Nt(ae),format:he?"NHWC":"NCHW"})},1332362:($,P,K,ae,he)=>{a.hc("GridSample",$,{align_corners:P,mode:Nt(K),padding_mode:Nt(ae),format:he?"NHWC":"NCHW"})},1332532:($,P)=>{a.hc("ScatterND",$,{reduction:Nt(P)})},1332617:($,P,K,ae,he,Oe,et,yt,Ct)=>{a.hc("Attention",$,{numHeads:P,isUnidirectional:K,maskFilterValue:ae,scale:he,doRotary:Oe,qkvHiddenSizes:et?Array.from(M().subarray(Number(yt)>>>0,Number(yt)+et>>>0)):[],pastPresentShareBuffer:!!Ct})},1332889:$=>{a.hc("BiasAdd",$,void 0)},1332944:$=>{a.hc("BiasSplitGelu",$,void 0)},1333005:$=>{a.hc("FastGelu",$,void 0)},1333061:($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn,Hr,Zs,Ci)=>{a.hc("Conv",$,{format:Un?"NHWC":"NCHW",auto_pad:P,dilations:K?Array.from(M().subarray(Number(K)>>>0,Number(ae)>>>0)):[],group:he,kernel_shape:Oe?Array.from(M().subarray(Number(Oe)>>>0,Number(et)>>>0)):[],pads:yt?Array.from(M().subarray(Number(yt)>>>0,Number(Ct)>>>0)):[],strides:nn?Array.from(M().subarray(Number(nn)>>>0,Number(pn)>>>0)):[],w_is_const:()=>!!N()[Number(Qn)>>>0],activation:Nt(Hr),activation_params:Zs?Array.from(se().subarray(Number(Zs)>>>0,Number(Ci)>>>0)):[]})},1333645:$=>{a.hc("Gelu",$,void 0)},1333697:($,P,K,ae,he,Oe,et,yt,Ct)=>{a.hc("GroupQueryAttention",$,{numHeads:P,kvNumHeads:K,scale:ae,softcap:he,doRotary:Oe,rotaryInterleaved:et,smoothSoftmax:yt,localWindowSize:Ct})},1333914:($,P,K,ae)=>{a.hc("LayerNormalization",$,{axis:P,epsilon:K,simplified:!!ae})},1334025:($,P,K,ae)=>{a.hc("LayerNormalization",$,{axis:P,epsilon:K,simplified:!!ae})},1334136:($,P,K,ae,he,Oe)=>{a.hc("MatMulNBits",$,{k:P,n:K,accuracyLevel:ae,bits:he,blockSize:Oe})},1334263:($,P,K,ae,he,Oe)=>{a.hc("MultiHeadAttention",$,{numHeads:P,isUnidirectional:K,maskFilterValue:ae,scale:he,doRotary:Oe})},1334422:($,P)=>{a.hc("QuickGelu",$,{alpha:P})},1334486:($,P,K,ae,he)=>{a.hc("RotaryEmbedding",$,{interleaved:!!P,numHeads:K,rotaryEmbeddingDim:ae,scale:he})},1334625:($,P,K)=>{a.hc("SkipLayerNormalization",$,{epsilon:P,simplified:!!K})},1334727:($,P,K)=>{a.hc("SkipLayerNormalization",$,{epsilon:P,simplified:!!K})},1334829:($,P,K,ae)=>{a.hc("GatherBlockQuantized",$,{gatherAxis:P,quantizeAxis:K,blockSize:ae})},1334950:$=>{a.Wd($)},1334984:($,P)=>a.Zd(Number($),Number(P),a.Cd.be,a.Cd.errors)};function ge($,P,K){return gr(async()=>{await a.Ud(Number($),Number(P),Number(K))})}function ne(){return typeof wasmOffsetConverter<"u"}class le{constructor(P){Mn(this,"name","ExitStatus");this.message=`Program terminated with exit(${P})`,this.status=P}}var fe=$=>{$.terminate(),$.onmessage=()=>{}},be=[],de=$=>{xe.length==0&&(Be(),Te(xe[0]));var P=xe.pop();if(!P)return 6;Ne.push(P),ke[$.xd]=P,P.xd=$.xd;var K={yd:"run",de:$.ce,Fd:$.Fd,xd:$.xd};return P.postMessage(K,$.Ld),0},$e=0,ze=($,P,...K)=>{for(var ae=2*K.length,he=qn(),Oe=Aa(8*ae),et=Oe>>>3,yt=0;yt>>0]=Ct)}return $=vd($,0,ae,Oe,P),er(he),$};function _e($){if(u)return ze(0,1,$);if(I=$,!(0<$e)){for(var P of Ne)fe(P);for(P of xe)fe(P);xe=[],Ne=[],ke={},B=!0}g(0,new le($))}function Ee($){if(u)return ze(1,0,$);Ce($)}var Ce=$=>{if(I=$,u)throw Ee($),"unwind";_e($)},xe=[],Ne=[],ve=[],ke={},Ie=$=>{var P=$.xd;delete ke[P],xe.push($),Ne.splice(Ne.indexOf($),1),$.xd=0,vu(P)};function Pe(){ve.forEach($=>$())}var Te=$=>new Promise(P=>{$.onmessage=he=>{var Oe=(he=he.data).yd;if(he.Ed&&he.Ed!=Vl()){var et=ke[he.Ed];et?et.postMessage(he,he.Ld):z(`Internal error! Worker sent a message "${Oe}" to target pthread ${he.Ed}, but that thread no longer exists!`)}else Oe==="checkMailbox"?cn():Oe==="spawnThread"?de(he):Oe==="cleanupThread"?Ie(ke[he.ee]):Oe==="loaded"?($.loaded=!0,P($)):Oe==="alert"?alert(`Thread ${he.fe}: ${he.text}`):he.target==="setimmediate"?$.postMessage(he):Oe==="callHandler"?a[he.Nd](...he.args):Oe&&z(`worker sent an unknown command ${Oe}`)},$.onerror=he=>{throw z(`worker sent an error! ${he.filename}:${he.lineno}: ${he.message}`),he};var K,ae=[];for(K of[])a.propertyIsEnumerable(K)&&ae.push(K);$.postMessage({yd:"load",Od:ae,he:C,ie:E})});function Be(){var $=new Worker(import.meta.url.startsWith("file:")?new URL(""+new URL("ort.bundle.min-OfoG_cy9.mjs",import.meta.url).href,import.meta.url):new URL(import.meta.url),{type:"module",workerData:"em-pthread",name:"em-pthread"});xe.push($)}var He=$=>{ee();var P=Y()[$+52>>>2>>>0];$=Y()[$+56>>>2>>>0],yl(P,P-$),er(P)},Je=($,P)=>{$e=0,$=ql($,P),0<$e?I=$:Cc($)},Me=[];function Re($){var P=new je($>>>=0);if(N()[P.wd+12>>>0]==0){var K=1;N()[P.wd+12>>>0]=K}return K=0,N()[P.wd+13>>>0]=K,Me.push(P),Nc($),_u($)}var Ve=0,Ze=()=>{cr(0,0);var $=Me.pop();go($.Gd),Ve=0};class je{constructor(P){this.Gd=P,this.wd=P-24}}function Le($){throw Ve||(Ve=$>>>0),Ve}var Xe=$=>{var P=Ve;if(!P)return Go(0),0;var K=new je(P);Y()[K.wd+16>>>2>>>0]=P;var ae=Y()[K.wd+4>>>2>>>0];if(!ae)return Go(0),P;for(var he of $){if(he===0||he===ae)break;if(Io(he,ae,K.wd+16))return Go(he),P}return Go(ae),P};function qe(){return Xe([])}function tt($){return Xe([$>>>0])}function Ye($,P){return Xe([$>>>0,P>>>0])}var ct=()=>{var $=Me.pop();$||U("no exception to throw");var P=$.Gd;if(N()[$.wd+13>>>0]==0){Me.push($);var K=1;N()[$.wd+13>>>0]=K,K=0,N()[$.wd+12>>>0]=K}throw Ve=P};function pt($,P,K){var ae=new je($>>>=0);throw P>>>=0,K>>>=0,Y()[ae.wd+16>>>2>>>0]=0,Y()[ae.wd+4>>>2>>>0]=P,Y()[ae.wd+8>>>2>>>0]=K,Ve=$}function ht($,P,K,ae){return u?ze(2,1,$,P,K,ae):wt($,P,K,ae)}function wt($,P,K,ae){if($>>>=0,K>>>=0,ae>>>=0,d===void 0)return 6;var he=[];return u&&he.length===0?ht($,P>>>=0,K,ae):($={ce:K,xd:$,Fd:ae,Ld:he},u?($.yd="spawnThread",postMessage($,he),0):de($))}var $t=typeof TextDecoder<"u"?new TextDecoder:void 0,jt=($,P=0,K=NaN)=>{var ae=(P>>>=0)+K;for(K=P;$[K]&&!(K>=ae);)++K;if(16(he=(240&he)==224?(15&he)<<12|Oe<<6|et:(7&he)<<18|Oe<<12|et<<6|63&$[P++])?ae+=String.fromCharCode(he):(he-=65536,ae+=String.fromCharCode(55296|he>>10,56320|1023&he))}}else ae+=String.fromCharCode(he)}return ae},Nt=($,P)=>($>>>=0)?jt(j(),$,P):"";function Yt($,P,K){return u?ze(3,1,$,P,K):0}function un($,P){if(u)return ze(4,1,$,P)}var Tn=$=>{for(var P=0,K=0;K<$.length;++K){var ae=$.charCodeAt(K);127>=ae?P++:2047>=ae?P+=2:55296<=ae&&57343>=ae?(P+=4,++K):P+=3}return P},Ht=($,P,K)=>{var ae=j();if(P>>>=0,0=et&&(et=65536+((1023&et)<<10)|1023&$.charCodeAt(++Oe)),127>=et){if(P>=K)break;ae[P++>>>0]=et}else{if(2047>=et){if(P+1>=K)break;ae[P++>>>0]=192|et>>6}else{if(65535>=et){if(P+2>=K)break;ae[P++>>>0]=224|et>>12}else{if(P+3>=K)break;ae[P++>>>0]=240|et>>18,ae[P++>>>0]=128|et>>12&63}ae[P++>>>0]=128|et>>6&63}ae[P++>>>0]=128|63&et}}ae[P>>>0]=0,$=P-he}else $=0;return $};function fn($,P){if(u)return ze(5,1,$,P)}function Dn($,P,K){if(u)return ze(6,1,$,P,K)}function it($,P,K){return u?ze(7,1,$,P,K):0}function Lt($,P){if(u)return ze(8,1,$,P)}function gt($,P,K){if(u)return ze(9,1,$,P,K)}function Jt($,P,K,ae){if(u)return ze(10,1,$,P,K,ae)}function Wt($,P,K,ae){if(u)return ze(11,1,$,P,K,ae)}function Pt($,P,K,ae){if(u)return ze(12,1,$,P,K,ae)}function Bt($){if(u)return ze(13,1,$)}function zt($,P){if(u)return ze(14,1,$,P)}function Gt($,P,K){if(u)return ze(15,1,$,P,K)}var qt,De,st=()=>U(""),Ae=$=>{for(var P="";j()[$>>>0];)P+=qt[j()[$++>>>0]];return P},nt={},_t={};function xt($,P,K={}){return(function(ae,he,Oe={}){var et=he.name;if(!ae)throw new De(`type "${et}" must have a positive integer typeid pointer`);if(_t.hasOwnProperty(ae)){if(Oe.Pd)return;throw new De(`Cannot register type '${et}' twice`)}_t[ae]=he,nt.hasOwnProperty(ae)&&(he=nt[ae],delete nt[ae],he.forEach(yt=>yt()))})($,P,K)}var Tt=($,P,K)=>{switch(P){case 1:return K?ae=>N()[ae>>>0]:ae=>j()[ae>>>0];case 2:return K?ae=>k()[ae>>>1>>>0]:ae=>W()[ae>>>1>>>0];case 4:return K?ae=>M()[ae>>>2>>>0]:ae=>Y()[ae>>>2>>>0];case 8:return K?ae=>q[ae>>>3]:ae=>H[ae>>>3];default:throw new TypeError(`invalid integer width (${P}): ${$}`)}};function St($,P,K){K>>>=0,xt($>>>=0,{name:P=Ae(P>>>0),fromWireType:ae=>ae,toWireType:function(ae,he){if(typeof he!="bigint"&&typeof he!="number")throw he=he===null?"null":(ae=typeof he)=="object"||ae==="array"||ae==="function"?he.toString():""+he,new TypeError(`Cannot convert "${he}" to ${this.name}`);return typeof he=="number"&&(he=BigInt(he)),he},zd:Qe,readValueFromPointer:Tt(P,K,P.indexOf("u")==-1),Ad:null})}var Qe=8;function Ue($,P,K,ae){xt($>>>=0,{name:P=Ae(P>>>0),fromWireType:function(he){return!!he},toWireType:function(he,Oe){return Oe?K:ae},zd:Qe,readValueFromPointer:function(he){return this.fromWireType(j()[he>>>0])},Ad:null})}var Ge=[],at=[];function rt($){9<($>>>=0)&&--at[$+1]==0&&(at[$]=void 0,Ge.push($))}var lt=$=>{if(!$)throw new De("Cannot use deleted val. handle = "+$);return at[$]},ot=$=>{switch($){case void 0:return 2;case null:return 4;case!0:return 6;case!1:return 8;default:let P=Ge.pop()||at.length;return at[P]=$,at[P+1]=1,P}};function At($){return this.fromWireType(Y()[$>>>2>>>0])}var kt={name:"emscripten::val",fromWireType:$=>{var P=lt($);return rt($),P},toWireType:($,P)=>ot(P),zd:Qe,readValueFromPointer:At,Ad:null};function Ot($){return xt($>>>0,kt)}var dn=($,P)=>{switch(P){case 4:return function(K){return this.fromWireType(se()[K>>>2>>>0])};case 8:return function(K){return this.fromWireType(ie()[K>>>3>>>0])};default:throw new TypeError(`invalid float width (${P}): ${$}`)}};function Vt($,P,K){K>>>=0,xt($>>>=0,{name:P=Ae(P>>>0),fromWireType:ae=>ae,toWireType:(ae,he)=>he,zd:Qe,readValueFromPointer:dn(P,K),Ad:null})}function Zt($,P,K,ae,he){if($>>>=0,K>>>=0,P=Ae(P>>>0),he===-1&&(he=4294967295),he=yt=>yt,ae===0){var Oe=32-8*K;he=yt=>yt<>>Oe}var et=P.includes("unsigned")?function(yt,Ct){return Ct>>>0}:function(yt,Ct){return Ct};xt($,{name:P,fromWireType:he,toWireType:et,zd:Qe,readValueFromPointer:Tt(P,K,ae!==0),Ad:null})}function Sn($,P,K){function ae(Oe){var et=Y()[Oe>>>2>>>0];return Oe=Y()[Oe+4>>>2>>>0],new he(N().buffer,Oe,et)}var he=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array][P];xt($>>>=0,{name:K=Ae(K>>>0),fromWireType:ae,zd:Qe,readValueFromPointer:ae},{Pd:!0})}function jn($,P){xt($>>>=0,{name:P=Ae(P>>>0),fromWireType:function(K){for(var ae,he=Y()[K>>>2>>>0],Oe=K+4,et=Oe,yt=0;yt<=he;++yt){var Ct=Oe+yt;yt!=he&&j()[Ct>>>0]!=0||(et=Nt(et,Ct-et),ae===void 0?ae=et:(ae+="\0",ae+=et),et=Ct+1)}return Vi(K),ae},toWireType:function(K,ae){ae instanceof ArrayBuffer&&(ae=new Uint8Array(ae));var he=typeof ae=="string";if(!(he||ae instanceof Uint8Array||ae instanceof Uint8ClampedArray||ae instanceof Int8Array))throw new De("Cannot pass non-string to std::string");var Oe=he?Tn(ae):ae.length,et=Hl(4+Oe+1),yt=et+4;if(Y()[et>>>2>>>0]=Oe,he)Ht(ae,yt,Oe+1);else if(he)for(he=0;he>>0]=Ct}else for(he=0;he>>0]=ae[he];return K!==null&&K.push(Vi,et),et},zd:Qe,readValueFromPointer:At,Ad(K){Vi(K)}})}var _n=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0,Cn=($,P)=>{for(var K=$>>1,ae=K+P/2;!(K>=ae)&&W()[K>>>0];)++K;if(32<(K<<=1)-$&&_n)return _n.decode(j().slice($,K));for(K="",ae=0;!(ae>=P/2);++ae){var he=k()[$+2*ae>>>1>>>0];if(he==0)break;K+=String.fromCharCode(he)}return K},Kn=($,P,K)=>{if(K??(K=2147483647),2>K)return 0;var ae=P;K=(K-=2)<2*$.length?K/2:$.length;for(var he=0;he>>1>>>0]=Oe,P+=2}return k()[P>>>1>>>0]=0,P-ae},Xn=$=>2*$.length,$r=($,P)=>{for(var K=0,ae="";!(K>=P/4);){var he=M()[$+4*K>>>2>>>0];if(he==0)break;++K,65536<=he?(he-=65536,ae+=String.fromCharCode(55296|he>>10,56320|1023&he)):ae+=String.fromCharCode(he)}return ae},Tr=($,P,K)=>{if(P>>>=0,K??(K=2147483647),4>K)return 0;var ae=P;K=ae+K-4;for(var he=0;he<$.length;++he){var Oe=$.charCodeAt(he);if(55296<=Oe&&57343>=Oe&&(Oe=65536+((1023&Oe)<<10)|1023&$.charCodeAt(++he)),M()[P>>>2>>>0]=Oe,(P+=4)+4>K)break}return M()[P>>>2>>>0]=0,P-ae},kr=$=>{for(var P=0,K=0;K<$.length;++K){var ae=$.charCodeAt(K);55296<=ae&&57343>=ae&&++K,P+=4}return P};function Rr($,P,K){if($>>>=0,P>>>=0,K=Ae(K>>>=0),P===2)var ae=Cn,he=Kn,Oe=Xn,et=yt=>W()[yt>>>1>>>0];else P===4&&(ae=$r,he=Tr,Oe=kr,et=yt=>Y()[yt>>>2>>>0]);xt($,{name:K,fromWireType:yt=>{for(var Ct,nn=Y()[yt>>>2>>>0],pn=yt+4,Un=0;Un<=nn;++Un){var Qn=yt+4+Un*P;Un!=nn&&et(Qn)!=0||(pn=ae(pn,Qn-pn),Ct===void 0?Ct=pn:(Ct+="\0",Ct+=pn),pn=Qn+P)}return Vi(yt),Ct},toWireType:(yt,Ct)=>{if(typeof Ct!="string")throw new De(`Cannot pass non-string to C++ string type ${K}`);var nn=Oe(Ct),pn=Hl(4+nn+P);return Y()[pn>>>2>>>0]=nn/P,he(Ct,pn+4,nn+P),yt!==null&&yt.push(Vi,pn),pn},zd:Qe,readValueFromPointer:At,Ad(yt){Vi(yt)}})}function sr($,P){xt($>>>=0,{Qd:!0,name:P=Ae(P>>>0),zd:0,fromWireType:()=>{},toWireType:()=>{}})}function mt($){ya($>>>0,!c,1,!l,131072,!1),Pe()}var It=$=>{if(!B)try{if($(),!(0<$e))try{u?Cc(I):Ce(I)}catch(P){P instanceof le||P=="unwind"||g(0,P)}}catch(P){P instanceof le||P=="unwind"||g(0,P)}};function tn($){$>>>=0,typeof Atomics.ge=="function"&&(Atomics.ge(M(),$>>>2,$).value.then(cn),$+=128,Atomics.store(M(),$>>>2,1))}var cn=()=>{var $=Vl();$&&(tn($),It(wu))};function zn($,P){($>>>=0)==P>>>0?setTimeout(cn):u?postMessage({Ed:$,yd:"checkMailbox"}):($=ke[$])&&$.postMessage({yd:"checkMailbox"})}var Rn=[];function bt($,P,K,ae,he){for(P>>>=0,ae/=2,Rn.length=ae,K=he>>>0>>>3,he=0;he>>0];return(P?te[P]:H0[$])(...Rn)}var bn=()=>{$e=0};function An($){$>>>=0,u?postMessage({yd:"cleanupThread",ee:$}):Ie(ke[$])}function Vn($){}var Sr=($,P)=>{var K=_t[$];if(K===void 0)throw $=r0($),K=Ae($),Vi($),new De(`${P} has unknown type ${K}`);return K},Ir=($,P,K)=>{var ae=[];return $=$.toWireType(ae,K),ae.length&&(Y()[P>>>2>>>0]=ot(ae)),$};function Wr($,P,K){return P>>>=0,K>>>=0,$=lt($>>>0),P=Sr(P,"emval::as"),Ir(P,K,$)}function ir($,P){return P>>>=0,$=lt($>>>0),(P=Sr(P,"emval::as")).toWireType(null,$)}var Yn=$=>{try{$()}catch(P){U(P)}},Zn=0,Ke=null,Et=0,Gn=[],Ut={},Bn={},Nr=0,br=null,vr=[];function gr($){return(function(P){if(!B){if(Zn===0){var K=!1,ae=!1;P((he=0)=>{if(!B&&(Et=he,K=!0,ae)){Zn=2,Yn(()=>Rc(Ke)),typeof MainLoop<"u"&&MainLoop.Md&&MainLoop.resume(),he=!1;try{var Oe=(function(){var Ct=M()[Ke+8>>>2>>>0];return Ct=Qt[Bn[Ct]],--$e,Ct()})()}catch(Ct){Oe=Ct,he=!0}var et=!1;if(!Ke){var yt=br;yt&&(br=null,(he?yt.reject:yt.resolve)(Oe),et=!0)}if(he&&!et)throw Oe}}),ae=!0,K||(Zn=1,Ke=(function(){var he=Hl(65548),Oe=he+12;Y()[he>>>2>>>0]=Oe,Y()[he+4>>>2>>>0]=Oe+65536,Oe=Gn[0];var et=Ut[Oe];return et===void 0&&(et=Nr++,Ut[Oe]=et,Bn[et]=Oe),Oe=et,M()[he+8>>>2>>>0]=Oe,he})(),typeof MainLoop<"u"&&MainLoop.Md&&MainLoop.pause(),Yn(()=>ec(Ke)))}else Zn===2?(Zn=0,Yn(Yo),Vi(Ke),Ke=null,vr.forEach(It)):U(`invalid state: ${Zn}`);return Et}})(P=>{$().then(P)})}function nr($){return $>>>=0,gr(async()=>{var P=await lt($);return ot(P)})}var tr=[];function jr($,P,K,ae){return K>>>=0,ae>>>=0,($=tr[$>>>0])(null,P=lt(P>>>0),K,ae)}var Br={},_r=$=>{var P=Br[$];return P===void 0?Ae($):P};function es($,P,K,ae,he){return K>>>=0,ae>>>=0,he>>>=0,($=tr[$>>>0])(P=lt(P>>>0),P[K=_r(K)],ae,he)}var Ur=()=>typeof globalThis=="object"?globalThis:Function("return this")();function zs($){return($>>>=0)==0?ot(Ur()):($=_r($),ot(Ur()[$]))}var Ts=$=>{var P=tr.length;return tr.push($),P},os=($,P)=>{for(var K=Array($),ae=0;ae<$;++ae)K[ae]=Sr(Y()[P+4*ae>>>2>>>0],"parameter "+ae);return K},wi=($,P)=>Object.defineProperty(P,"name",{value:$});function ki($,P,K){var ae=(P=os($,P>>>0)).shift();$--;var he=`return function (obj, func, destructorsRef, args) { +`,Oe=0,et=[];K===0&&et.push("obj");for(var yt=["retType"],Ct=[ae],nn=0;nn<$;++nn)et.push("arg"+nn),yt.push("argType"+nn),Ct.push(P[nn]),he+=` var arg${nn} = argType${nn}.readValueFromPointer(args${Oe?"+"+Oe:""}); +`,Oe+=P[nn].zd;return he+=` var rv = ${K===1?"new func":"func.call"}(${et.join(", ")}); +`,ae.Qd||(yt.push("emval_returnValue"),Ct.push(Ir),he+=` return emval_returnValue(retType, destructorsRef, rv); +`),yt.push(he+`}; +`),$=(function(pn){var Un=Function;if(!(Un instanceof Function))throw new TypeError(`new_ called with constructor type ${typeof Un} which is not a function`);var Qn=wi(Un.name||"unknownFunctionName",function(){});return Qn.prototype=Un.prototype,Qn=new Qn,(pn=Un.apply(Qn,pn))instanceof Object?pn:Qn})(yt)(...Ct),K=`methodCaller<(${P.map(pn=>pn.name).join(", ")}) => ${ae.name}>`,Ts(wi(K,$))}function gi($){return $=_r($>>>0),ot(a[$])}function $i($,P){return P>>>=0,$=lt($>>>0),P=lt(P),ot($[P])}function gs($){9<($>>>=0)&&(at[$+1]+=1)}function Ri(){return ot([])}function Ki($){$=lt($>>>0);for(var P=Array($.length),K=0;K<$.length;K++)P[K]=$[K];return ot(P)}function Ps($){return ot(_r($>>>0))}function Si(){return ot({})}function xi($){for(var P=lt($>>>=0);P.length;){var K=P.pop();P.pop()(K)}rt($)}function li($,P,K){P>>>=0,K>>>=0,$=lt($>>>0),P=lt(P),K=lt(K),$[P]=K}function ca($,P){return P>>>=0,$=($=Sr($>>>0,"_emval_take_value")).readValueFromPointer(P),ot($)}function ea($,P){$=-9007199254740992>$||9007199254740992<$?NaN:Number($),P>>>=0,$=new Date(1e3*$),M()[P>>>2>>>0]=$.getUTCSeconds(),M()[P+4>>>2>>>0]=$.getUTCMinutes(),M()[P+8>>>2>>>0]=$.getUTCHours(),M()[P+12>>>2>>>0]=$.getUTCDate(),M()[P+16>>>2>>>0]=$.getUTCMonth(),M()[P+20>>>2>>>0]=$.getUTCFullYear()-1900,M()[P+24>>>2>>>0]=$.getUTCDay(),$=($.getTime()-Date.UTC($.getUTCFullYear(),0,1,0,0,0,0))/864e5|0,M()[P+28>>>2>>>0]=$}var Wa=$=>$%4==0&&($%100!=0||$%400==0),ks=[0,31,60,91,121,152,182,213,244,274,305,335],Pi=[0,31,59,90,120,151,181,212,243,273,304,334];function _i($,P){$=-9007199254740992>$||9007199254740992<$?NaN:Number($),P>>>=0,$=new Date(1e3*$),M()[P>>>2>>>0]=$.getSeconds(),M()[P+4>>>2>>>0]=$.getMinutes(),M()[P+8>>>2>>>0]=$.getHours(),M()[P+12>>>2>>>0]=$.getDate(),M()[P+16>>>2>>>0]=$.getMonth(),M()[P+20>>>2>>>0]=$.getFullYear()-1900,M()[P+24>>>2>>>0]=$.getDay();var K=(Wa($.getFullYear())?ks:Pi)[$.getMonth()]+$.getDate()-1|0;M()[P+28>>>2>>>0]=K,M()[P+36>>>2>>>0]=-60*$.getTimezoneOffset(),K=new Date($.getFullYear(),6,1).getTimezoneOffset();var ae=new Date($.getFullYear(),0,1).getTimezoneOffset();$=0|(K!=ae&&$.getTimezoneOffset()==Math.min(ae,K)),M()[P+32>>>2>>>0]=$}function ta($){$>>>=0;var P=new Date(M()[$+20>>>2>>>0]+1900,M()[$+16>>>2>>>0],M()[$+12>>>2>>>0],M()[$+8>>>2>>>0],M()[$+4>>>2>>>0],M()[$>>>2>>>0],0),K=M()[$+32>>>2>>>0],ae=P.getTimezoneOffset(),he=new Date(P.getFullYear(),6,1).getTimezoneOffset(),Oe=new Date(P.getFullYear(),0,1).getTimezoneOffset(),et=Math.min(Oe,he);return 0>K?M()[$+32>>>2>>>0]=+(he!=Oe&&et==ae):0>>2>>>0]=P.getDay(),K=(Wa(P.getFullYear())?ks:Pi)[P.getMonth()]+P.getDate()-1|0,M()[$+28>>>2>>>0]=K,M()[$>>>2>>>0]=P.getSeconds(),M()[$+4>>>2>>>0]=P.getMinutes(),M()[$+8>>>2>>>0]=P.getHours(),M()[$+12>>>2>>>0]=P.getDate(),M()[$+16>>>2>>>0]=P.getMonth(),M()[$+20>>>2>>>0]=P.getYear(),$=P.getTime(),BigInt(isNaN($)?-1:$/1e3)}function ua($,P,K,ae,he,Oe,et){return u?ze(16,1,$,P,K,ae,he,Oe,et):-52}function Wi($,P,K,ae,he,Oe){if(u)return ze(17,1,$,P,K,ae,he,Oe)}var ci={},Oi=()=>performance.timeOrigin+performance.now();function da($,P){if(u)return ze(18,1,$,P);if(ci[$]&&(clearTimeout(ci[$].id),delete ci[$]),!P)return 0;var K=setTimeout(()=>{delete ci[$],It(()=>wd($,performance.timeOrigin+performance.now()))},P);return ci[$]={id:K,ke:P},0}function ha($,P,K,ae){$>>>=0,P>>>=0,K>>>=0,ae>>>=0;var he=new Date().getFullYear(),Oe=new Date(he,0,1).getTimezoneOffset();he=new Date(he,6,1).getTimezoneOffset();var et=Math.max(Oe,he);Y()[$>>>2>>>0]=60*et,M()[P>>>2>>>0]=+(Oe!=he),$=(P=yt=>{var Ct=Math.abs(yt);return`UTC${0<=yt?"-":"+"}${String(Math.floor(Ct/60)).padStart(2,"0")}${String(Ct%60).padStart(2,"0")}`})(Oe),P=P(he),heDate.now();function ka($,P,K){return 0<=$&&3>=$?($===0?$=Date.now():$=performance.timeOrigin+performance.now(),q[K>>>0>>>3]=BigInt(Math.round(1e6*$)),0):28}var dt=[],vt=($,P)=>{dt.length=0;for(var K;K=j()[$++>>>0];){var ae=K!=105;P+=(ae&=K!=112)&&P%8?4:0,dt.push(K==112?Y()[P>>>2>>>0]:K==106?q[P>>>3]:K==105?M()[P>>>2>>>0]:ie()[P>>>3>>>0]),P+=ae?8:4}return dt};function Kt($,P,K){return $>>>=0,P=vt(P>>>0,K>>>0),te[$](...P)}function an($,P,K){return $>>>=0,P=vt(P>>>0,K>>>0),te[$](...P)}var en=()=>{};function rn($,P){return z(Nt($>>>0,P>>>0))}var gn=()=>{throw $e+=1,"unwind"};function lr(){return 4294901760}var On=()=>navigator.hardwareConcurrency;function wr(){return U("Cannot use emscripten_pc_get_function without -sUSE_OFFSET_CONVERTER"),0}function cs($){$>>>=0;var P=j().length;if($<=P||4294901760<$)return!1;for(var K=1;4>=K;K*=2){var ae=P*(1+.2/K);ae=Math.min(ae,$+100663296);e:{ae=(Math.min(4294901760,65536*Math.ceil(Math.max($,ae)/65536))-C.buffer.byteLength+65535)/65536|0;try{C.grow(ae),ee();var he=1;break e}catch{}he=void 0}if(he)return!0}return!1}var Ar=()=>(U("Cannot use convertFrameToPC (needed by __builtin_return_address) without -sUSE_OFFSET_CONVERTER"),0),Or={},ls=$=>{$.forEach(P=>{Ar()})};function Ns(){var $=Error().stack.toString().split(` +`);return $[0]=="Error"&&$.shift(),ls($),Or.Kd=Ar(),Or.ae=$,Or.Kd}function Di($,P,K){if($>>>=0,P>>>=0,Or.Kd==$)var ae=Or.ae;else(ae=Error().stack.toString().split(` +`))[0]=="Error"&&ae.shift(),ls(ae);for(var he=3;ae[he]&&Ar()!=$;)++he;for($=0;$>>2>>>0]=Ar();return $}var ii,Hs={},ji=()=>{if(!ii){var $,P={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:"./this.program"};for($ in Hs)Hs[$]===void 0?delete P[$]:P[$]=Hs[$];var K=[];for($ in P)K.push(`${$}=${P[$]}`);ii=K}return ii};function na($,P){if(u)return ze(19,1,$,P);$>>>=0,P>>>=0;var K=0;return ji().forEach((ae,he)=>{var Oe=P+K;for(he=Y()[$+4*he>>>2>>>0]=Oe,Oe=0;Oe>>0]=ae.charCodeAt(Oe);N()[he>>>0]=0,K+=ae.length+1}),0}function ui($,P){if(u)return ze(20,1,$,P);$>>>=0,P>>>=0;var K=ji();Y()[$>>>2>>>0]=K.length;var ae=0;return K.forEach(he=>ae+=he.length+1),Y()[P>>>2>>>0]=ae,0}function fs($){return u?ze(21,1,$):52}function Js($,P,K,ae){return u?ze(22,1,$,P,K,ae):52}function Ai($,P,K,ae){return u?ze(23,1,$,P,K,ae):70}var Wl=[null,[],[]];function Dl($,P,K,ae){if(u)return ze(24,1,$,P,K,ae);P>>>=0,K>>>=0,ae>>>=0;for(var he=0,Oe=0;Oe>>2>>>0],yt=Y()[P+4>>>2>>>0];P+=8;for(var Ct=0;Ct>>0],pn=Wl[$];nn===0||nn===10?(($===1?m:z)(jt(pn)),pn.length=0):pn.push(nn)}he+=yt}return Y()[ae>>>2>>>0]=he,0}function yd($){return $>>>0}u||(function(){for(var $=a.numThreads-1;$--;)Be();be.unshift(()=>{Q++,(function(P){u?P():Promise.all(xe.map(Te)).then(P)})(()=>ue())})})();for(var yu=Array(256),bl=0;256>bl;++bl)yu[bl]=String.fromCharCode(bl);qt=yu,De=a.BindingError=class extends Error{constructor($){super($),this.name="BindingError"}},a.InternalError=class extends Error{constructor($){super($),this.name="InternalError"}},at.push(0,1,void 0,1,null,1,!0,1,!1,1),a.count_emval_handles=()=>at.length/2-5-Ge.length;var Qt,H0=[_e,Ee,ht,Yt,un,fn,Dn,it,Lt,gt,Jt,Wt,Pt,Bt,zt,Gt,ua,Wi,da,na,ui,fs,Js,Ai,Dl];(async function(){function $(ae,he){return Qt=ae.exports,Qt=(function(){var Oe=Qt,et={};for(let[yt,Ct]of Object.entries(Oe))et[yt]=typeof Ct=="function"?(...nn)=>{Gn.push(yt);try{return Ct(...nn)}finally{B||(Gn.pop(),Ke&&Zn===1&&Gn.length===0&&(Zn=0,$e+=1,Yn(Va),typeof Fibers<"u"&&Fibers.le()))}}:Ct;return et})(),Qt=(function(){var Oe=Qt,et=Ct=>nn=>Ct(nn)>>>0,yt=Ct=>()=>Ct()>>>0;return(Oe=Object.assign({},Oe)).Cb=et(Oe.Cb),Oe.fc=yt(Oe.fc),Oe.ic=et(Oe.ic),Oe.vc=et(Oe.vc),Oe.wc=yt(Oe.wc),Oe.Ac=et(Oe.Ac),Oe})(),ve.push(Qt.jc),E=he,ue(),Qt}Q++;var P=G();if(a.instantiateWasm)return new Promise(ae=>{a.instantiateWasm(P,(he,Oe)=>{$(he,Oe),ae(he.exports)})});if(u)return new Promise(ae=>{oe=he=>{var Oe=new WebAssembly.Instance(he,G());ae($(Oe,he))}});we??(we=a.locateFile?a.locateFile?a.locateFile("ort-wasm-simd-threaded.jsep.wasm",y):y+"ort-wasm-simd-threaded.jsep.wasm":new URL(""+new URL("ort-wasm-simd-threaded.jsep-D5Jk56-t.wasm",import.meta.url).href,import.meta.url).href);try{var K=await(async function(ae){var he=we;if(!Z&&typeof WebAssembly.instantiateStreaming=="function"&&!V(he))try{var Oe=fetch(he,{credentials:"same-origin"});return await WebAssembly.instantiateStreaming(Oe,ae)}catch(et){z(`wasm streaming compile failed: ${et}`),z("falling back to ArrayBuffer instantiation")}return(async function(et,yt){try{var Ct=await(async function(nn){if(!Z)try{var pn=await p(nn);return new Uint8Array(pn)}catch{}if(nn==we&&Z)nn=new Uint8Array(Z);else{if(!f)throw"both async and sync fetching of the wasm failed";nn=f(nn)}return nn})(et);return await WebAssembly.instantiate(Ct,yt)}catch(nn){z(`failed to asynchronously prepare wasm: ${nn}`),U(nn)}})(he,ae)})(P);return $(K.instance,K.module)}catch(ae){return i(ae),Promise.reject(ae)}})();var r0=$=>(r0=Qt.Cb)($),s0=()=>(s0=Qt.Db)();a._OrtInit=($,P)=>(a._OrtInit=Qt.Eb)($,P),a._OrtGetLastError=($,P)=>(a._OrtGetLastError=Qt.Fb)($,P),a._OrtCreateSessionOptions=($,P,K,ae,he,Oe,et,yt,Ct,nn)=>(a._OrtCreateSessionOptions=Qt.Gb)($,P,K,ae,he,Oe,et,yt,Ct,nn),a._OrtAppendExecutionProvider=($,P)=>(a._OrtAppendExecutionProvider=Qt.Hb)($,P),a._OrtAddFreeDimensionOverride=($,P,K)=>(a._OrtAddFreeDimensionOverride=Qt.Ib)($,P,K),a._OrtAddSessionConfigEntry=($,P,K)=>(a._OrtAddSessionConfigEntry=Qt.Jb)($,P,K),a._OrtReleaseSessionOptions=$=>(a._OrtReleaseSessionOptions=Qt.Kb)($),a._OrtCreateSession=($,P,K)=>(a._OrtCreateSession=Qt.Lb)($,P,K),a._OrtReleaseSession=$=>(a._OrtReleaseSession=Qt.Mb)($),a._OrtGetInputOutputCount=($,P,K)=>(a._OrtGetInputOutputCount=Qt.Nb)($,P,K),a._OrtGetInputName=($,P)=>(a._OrtGetInputName=Qt.Ob)($,P),a._OrtGetOutputName=($,P)=>(a._OrtGetOutputName=Qt.Pb)($,P),a._OrtFree=$=>(a._OrtFree=Qt.Qb)($),a._OrtCreateTensor=($,P,K,ae,he,Oe)=>(a._OrtCreateTensor=Qt.Rb)($,P,K,ae,he,Oe),a._OrtGetTensorData=($,P,K,ae,he)=>(a._OrtGetTensorData=Qt.Sb)($,P,K,ae,he),a._OrtReleaseTensor=$=>(a._OrtReleaseTensor=Qt.Tb)($),a._OrtCreateRunOptions=($,P,K,ae)=>(a._OrtCreateRunOptions=Qt.Ub)($,P,K,ae),a._OrtAddRunConfigEntry=($,P,K)=>(a._OrtAddRunConfigEntry=Qt.Vb)($,P,K),a._OrtReleaseRunOptions=$=>(a._OrtReleaseRunOptions=Qt.Wb)($),a._OrtCreateBinding=$=>(a._OrtCreateBinding=Qt.Xb)($),a._OrtBindInput=($,P,K)=>(a._OrtBindInput=Qt.Yb)($,P,K),a._OrtBindOutput=($,P,K,ae)=>(a._OrtBindOutput=Qt.Zb)($,P,K,ae),a._OrtClearBoundOutputs=$=>(a._OrtClearBoundOutputs=Qt._b)($),a._OrtReleaseBinding=$=>(a._OrtReleaseBinding=Qt.$b)($),a._OrtRunWithBinding=($,P,K,ae,he)=>(a._OrtRunWithBinding=Qt.ac)($,P,K,ae,he),a._OrtRun=($,P,K,ae,he,Oe,et,yt)=>(a._OrtRun=Qt.bc)($,P,K,ae,he,Oe,et,yt),a._OrtEndProfiling=$=>(a._OrtEndProfiling=Qt.cc)($),a._JsepOutput=($,P,K)=>(a._JsepOutput=Qt.dc)($,P,K),a._JsepGetNodeName=$=>(a._JsepGetNodeName=Qt.ec)($);var Vl=()=>(Vl=Qt.fc)(),Vi=a._free=$=>(Vi=a._free=Qt.gc)($),Hl=a._malloc=$=>(Hl=a._malloc=Qt.ic)($),ya=($,P,K,ae,he,Oe)=>(ya=Qt.kc)($,P,K,ae,he,Oe),Gl=()=>(Gl=Qt.lc)(),vd=($,P,K,ae,he)=>(vd=Qt.mc)($,P,K,ae,he),vu=$=>(vu=Qt.nc)($),Cc=$=>(Cc=Qt.oc)($),wd=($,P)=>(wd=Qt.pc)($,P),wu=()=>(wu=Qt.qc)(),cr=($,P)=>(cr=Qt.rc)($,P),Go=$=>(Go=Qt.sc)($),yl=($,P)=>(yl=Qt.tc)($,P),er=$=>(er=Qt.uc)($),Aa=$=>(Aa=Qt.vc)($),qn=()=>(qn=Qt.wc)(),go=$=>(go=Qt.xc)($),Nc=$=>(Nc=Qt.yc)($),Io=($,P,K)=>(Io=Qt.zc)($,P,K),_u=$=>(_u=Qt.Ac)($),zu=a.dynCall_iii=($,P,K)=>(zu=a.dynCall_iii=Qt.Bc)($,P,K),ko=a.dynCall_vi=($,P)=>(ko=a.dynCall_vi=Qt.Cc)($,P),ql=a.dynCall_ii=($,P)=>(ql=a.dynCall_ii=Qt.Dc)($,P),_d=a.dynCall_vii=($,P,K)=>(_d=a.dynCall_vii=Qt.Ec)($,P,K),$u=a.dynCall_iiii=($,P,K,ae)=>($u=a.dynCall_iiii=Qt.Fc)($,P,K,ae),Su=a.dynCall_viii=($,P,K,ae)=>(Su=a.dynCall_viii=Qt.Gc)($,P,K,ae),ju=a.dynCall_iiiii=($,P,K,ae,he)=>(ju=a.dynCall_iiiii=Qt.Hc)($,P,K,ae,he),zd=a.dynCall_viiii=($,P,K,ae,he)=>(zd=a.dynCall_viiii=Qt.Ic)($,P,K,ae,he),Da=a.dynCall_viiiiii=($,P,K,ae,he,Oe,et)=>(Da=a.dynCall_viiiiii=Qt.Jc)($,P,K,ae,he,Oe,et),Cu=a.dynCall_viiiiiii=($,P,K,ae,he,Oe,et,yt)=>(Cu=a.dynCall_viiiiiii=Qt.Kc)($,P,K,ae,he,Oe,et,yt),Ec=a.dynCall_ji=($,P)=>(Ec=a.dynCall_ji=Qt.Lc)($,P),i0=a.dynCall_v=$=>(i0=a.dynCall_v=Qt.Mc)($),$d=a.dynCall_viiiii=($,P,K,ae,he,Oe)=>($d=a.dynCall_viiiii=Qt.Nc)($,P,K,ae,he,Oe),Kl=a.dynCall_i=$=>(Kl=a.dynCall_i=Qt.Oc)($),Nu=a.dynCall_fii=($,P,K)=>(Nu=a.dynCall_fii=Qt.Pc)($,P,K),Eu=a.dynCall_viiiiiiii=($,P,K,ae,he,Oe,et,yt,Ct)=>(Eu=a.dynCall_viiiiiiii=Qt.Qc)($,P,K,ae,he,Oe,et,yt,Ct),Ic=a.dynCall_viiiiiiiiii=($,P,K,ae,he,Oe,et,yt,Ct,nn,pn)=>(Ic=a.dynCall_viiiiiiiiii=Qt.Rc)($,P,K,ae,he,Oe,et,yt,Ct,nn,pn),Gs=a.dynCall_jiii=($,P,K,ae)=>(Gs=a.dynCall_jiii=Qt.Sc)($,P,K,ae),Xl=a.dynCall_dii=($,P,K)=>(Xl=a.dynCall_dii=Qt.Tc)($,P,K),kc=a.dynCall_viiiiiiiii=($,P,K,ae,he,Oe,et,yt,Ct,nn)=>(kc=a.dynCall_viiiiiiiii=Qt.Uc)($,P,K,ae,he,Oe,et,yt,Ct,nn),qo=a.dynCall_viiiiiiiiiii=($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un)=>(qo=a.dynCall_viiiiiiiiiii=Qt.Vc)($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un),Sd=a.dynCall_iiiiii=($,P,K,ae,he,Oe)=>(Sd=a.dynCall_iiiiii=Qt.Wc)($,P,K,ae,he,Oe),Ac=a.dynCall_iij=($,P,K)=>(Ac=a.dynCall_iij=Qt.Xc)($,P,K),Yl=a.dynCall_iiiiiiiiii=($,P,K,ae,he,Oe,et,yt,Ct,nn)=>(Yl=a.dynCall_iiiiiiiiii=Qt.Yc)($,P,K,ae,he,Oe,et,yt,Ct,nn),Jl=a.dynCall_iiiiiiiiiii=($,P,K,ae,he,Oe,et,yt,Ct,nn,pn)=>(Jl=a.dynCall_iiiiiiiiiii=Qt.Zc)($,P,K,ae,he,Oe,et,yt,Ct,nn,pn),vl=a.dynCall_vij=($,P,K)=>(vl=a.dynCall_vij=Qt._c)($,P,K),Iu=a.dynCall_iiif=($,P,K,ae)=>(Iu=a.dynCall_iiif=Qt.$c)($,P,K,ae),ku=a.dynCall_iiij=($,P,K,ae)=>(ku=a.dynCall_iiij=Qt.ad)($,P,K,ae),Ko=a.dynCall_fiii=($,P,K,ae)=>(Ko=a.dynCall_fiii=Qt.bd)($,P,K,ae),jd=a.dynCall_viiiiiiiiiiiii=($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn,Hr)=>(jd=a.dynCall_viiiiiiiiiiiii=Qt.cd)($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn,Hr),Mc=a.dynCall_vjiii=($,P,K,ae,he)=>(Mc=a.dynCall_vjiii=Qt.dd)($,P,K,ae,he),Tc=a.dynCall_vif=($,P,K)=>(Tc=a.dynCall_vif=Qt.ed)($,P,K),Au=a.dynCall_iiiiiii=($,P,K,ae,he,Oe,et)=>(Au=a.dynCall_iiiiiii=Qt.fd)($,P,K,ae,he,Oe,et),Mu=a.dynCall_iiiij=($,P,K,ae,he)=>(Mu=a.dynCall_iiiij=Qt.gd)($,P,K,ae,he),Tu=a.dynCall_iiiiiiii=($,P,K,ae,he,Oe,et,yt)=>(Tu=a.dynCall_iiiiiiii=Qt.hd)($,P,K,ae,he,Oe,et,yt),Cd=a.dynCall_viiiiiiiiiiii=($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn)=>(Cd=a.dynCall_viiiiiiiiiiii=Qt.id)($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn),a0=a.dynCall_diii=($,P,K,ae)=>(a0=a.dynCall_diii=Qt.jd)($,P,K,ae),Zl=a.dynCall_jiiii=($,P,K,ae,he)=>(Zl=a.dynCall_jiiii=Qt.kd)($,P,K,ae,he),Ru=a.dynCall_viiij=($,P,K,ae,he)=>(Ru=a.dynCall_viiij=Qt.ld)($,P,K,ae,he),o0=a.dynCall_fiiii=($,P,K,ae,he)=>(o0=a.dynCall_fiiii=Qt.md)($,P,K,ae,he),Ql=a.dynCall_viiif=($,P,K,ae,he)=>(Ql=a.dynCall_viiif=Qt.nd)($,P,K,ae,he),xo=a.dynCall_diiii=($,P,K,ae,he)=>(xo=a.dynCall_diiii=Qt.od)($,P,K,ae,he),Nd=a.dynCall_viiid=($,P,K,ae,he)=>(Nd=a.dynCall_viiid=Qt.pd)($,P,K,ae,he),Xo=a.dynCall_iiiijii=($,P,K,ae,he,Oe,et)=>(Xo=a.dynCall_iiiijii=Qt.qd)($,P,K,ae,he,Oe,et),eo=a.dynCall_iiiiiij=($,P,K,ae,he,Oe,et)=>(eo=a.dynCall_iiiiiij=Qt.rd)($,P,K,ae,he,Oe,et),ec=$=>(ec=Qt.sd)($),Va=()=>(Va=Qt.td)(),Rc=$=>(Rc=Qt.ud)($),Yo=()=>(Yo=Qt.vd)();function Pc($,P,K){var ae=qn();try{_d($,P,K)}catch(he){if(er(ae),he!==he+0)throw he;cr(1,0)}}function Ha($,P,K){var ae=qn();try{return zu($,P,K)}catch(he){if(er(ae),he!==he+0)throw he;cr(1,0)}}function tc($,P){var K=qn();try{ko($,P)}catch(ae){if(er(K),ae!==ae+0)throw ae;cr(1,0)}}function Jo($,P){var K=qn();try{return ql($,P)}catch(ae){if(er(K),ae!==ae+0)throw ae;cr(1,0)}}function Oc($,P,K,ae){var he=qn();try{return $u($,P,K,ae)}catch(Oe){if(er(he),Oe!==Oe+0)throw Oe;cr(1,0)}}function Pu($,P,K,ae,he){var Oe=qn();try{zd($,P,K,ae,he)}catch(et){if(er(Oe),et!==et+0)throw et;cr(1,0)}}function Zo($,P,K,ae,he){var Oe=qn();try{return ju($,P,K,ae,he)}catch(et){if(er(Oe),et!==et+0)throw et;cr(1,0)}}function Ma($,P,K,ae){var he=qn();try{Su($,P,K,ae)}catch(Oe){if(er(he),Oe!==Oe+0)throw Oe;cr(1,0)}}function Os($,P,K,ae,he,Oe,et){var yt=qn();try{return Au($,P,K,ae,he,Oe,et)}catch(Ct){if(er(yt),Ct!==Ct+0)throw Ct;cr(1,0)}}function Fs($){var P=qn();try{i0($)}catch(K){if(er(P),K!==K+0)throw K;cr(1,0)}}function wl($,P,K){var ae=qn();try{return Ac($,P,K)}catch(he){if(er(ae),he!==he+0)throw he;cr(1,0)}}function pa($,P,K,ae,he,Oe){var et=qn();try{$d($,P,K,ae,he,Oe)}catch(yt){if(er(et),yt!==yt+0)throw yt;cr(1,0)}}function Ta($,P,K){var ae=qn();try{vl($,P,K)}catch(he){if(er(ae),he!==he+0)throw he;cr(1,0)}}function nc($,P,K,ae,he,Oe,et){var yt=qn();try{Da($,P,K,ae,he,Oe,et)}catch(Ct){if(er(yt),Ct!==Ct+0)throw Ct;cr(1,0)}}function Lc($,P,K,ae,he,Oe,et,yt){var Ct=qn();try{Cu($,P,K,ae,he,Oe,et,yt)}catch(nn){if(er(Ct),nn!==nn+0)throw nn;cr(1,0)}}function Ra($,P,K,ae,he,Oe){var et=qn();try{return Sd($,P,K,ae,he,Oe)}catch(yt){if(er(et),yt!==yt+0)throw yt;cr(1,0)}}function Mi($,P,K,ae,he,Oe,et,yt){var Ct=qn();try{return Tu($,P,K,ae,he,Oe,et,yt)}catch(nn){if(er(Ct),nn!==nn+0)throw nn;cr(1,0)}}function Ou($,P,K,ae,he,Oe,et,yt,Ct,nn){var pn=qn();try{kc($,P,K,ae,he,Oe,et,yt,Ct,nn)}catch(Un){if(er(pn),Un!==Un+0)throw Un;cr(1,0)}}function Ed($,P,K,ae,he,Oe,et,yt,Ct){var nn=qn();try{Eu($,P,K,ae,he,Oe,et,yt,Ct)}catch(pn){if(er(nn),pn!==pn+0)throw pn;cr(1,0)}}function Id($){var P=qn();try{return Kl($)}catch(K){if(er(P),K!==K+0)throw K;cr(1,0)}}function _l($,P,K,ae,he,Oe,et,yt,Ct,nn){var pn=qn();try{return Yl($,P,K,ae,he,Oe,et,yt,Ct,nn)}catch(Un){if(er(pn),Un!==Un+0)throw Un;cr(1,0)}}function Ao($,P,K){var ae=qn();try{return Nu($,P,K)}catch(he){if(er(ae),he!==he+0)throw he;cr(1,0)}}function Pa($,P,K,ae){var he=qn();try{return Gs($,P,K,ae)}catch(Oe){if(er(he),Oe!==Oe+0)throw Oe;return cr(1,0),0n}}function Lu($,P,K){var ae=qn();try{return Xl($,P,K)}catch(he){if(er(ae),he!==he+0)throw he;cr(1,0)}}function Bu($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un){var Qn=qn();try{qo($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un)}catch(Hr){if(er(Qn),Hr!==Hr+0)throw Hr;cr(1,0)}}function l0($,P,K,ae,he,Oe,et,yt,Ct,nn,pn){var Un=qn();try{Ic($,P,K,ae,he,Oe,et,yt,Ct,nn,pn)}catch(Qn){if(er(Un),Qn!==Qn+0)throw Qn;cr(1,0)}}function zl($,P,K,ae,he,Oe,et,yt,Ct,nn,pn){var Un=qn();try{return Jl($,P,K,ae,he,Oe,et,yt,Ct,nn,pn)}catch(Qn){if(er(Un),Qn!==Qn+0)throw Qn;cr(1,0)}}function rc($,P,K,ae){var he=qn();try{return Iu($,P,K,ae)}catch(Oe){if(er(he),Oe!==Oe+0)throw Oe;cr(1,0)}}function Oa($,P,K,ae){var he=qn();try{return ku($,P,K,ae)}catch(Oe){if(er(he),Oe!==Oe+0)throw Oe;cr(1,0)}}function $l($,P,K,ae){var he=qn();try{return Ko($,P,K,ae)}catch(Oe){if(er(he),Oe!==Oe+0)throw Oe;cr(1,0)}}function Qo($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn,Hr){var Zs=qn();try{jd($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn,Hr)}catch(Ci){if(er(Zs),Ci!==Ci+0)throw Ci;cr(1,0)}}function fa($,P,K,ae,he){var Oe=qn();try{Mc($,P,K,ae,he)}catch(et){if(er(Oe),et!==et+0)throw et;cr(1,0)}}function va($,P,K){var ae=qn();try{Tc($,P,K)}catch(he){if(er(ae),he!==he+0)throw he;cr(1,0)}}function bo($,P){var K=qn();try{return Ec($,P)}catch(ae){if(er(K),ae!==ae+0)throw ae;return cr(1,0),0n}}function ma($,P,K,ae,he){var Oe=qn();try{return Mu($,P,K,ae,he)}catch(et){if(er(Oe),et!==et+0)throw et;cr(1,0)}}function La($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn){var Hr=qn();try{Cd($,P,K,ae,he,Oe,et,yt,Ct,nn,pn,Un,Qn)}catch(Zs){if(er(Hr),Zs!==Zs+0)throw Zs;cr(1,0)}}function sc($,P,K,ae){var he=qn();try{return a0($,P,K,ae)}catch(Oe){if(er(he),Oe!==Oe+0)throw Oe;cr(1,0)}}function Uu($,P,K,ae,he){var Oe=qn();try{return Zl($,P,K,ae,he)}catch(et){if(er(Oe),et!==et+0)throw et;return cr(1,0),0n}}function c0($,P,K,ae,he){var Oe=qn();try{Ru($,P,K,ae,he)}catch(et){if(er(Oe),et!==et+0)throw et;cr(1,0)}}function ic($,P,K,ae,he){var Oe=qn();try{return o0($,P,K,ae,he)}catch(et){if(er(Oe),et!==et+0)throw et;cr(1,0)}}function wa($,P,K,ae,he){var Oe=qn();try{Ql($,P,K,ae,he)}catch(et){if(er(Oe),et!==et+0)throw et;cr(1,0)}}function Hi($,P,K,ae,he){var Oe=qn();try{return xo($,P,K,ae,he)}catch(et){if(er(Oe),et!==et+0)throw et;cr(1,0)}}function ai($,P,K,ae,he){var Oe=qn();try{Nd($,P,K,ae,he)}catch(et){if(er(Oe),et!==et+0)throw et;cr(1,0)}}function Ba($,P,K,ae,he,Oe,et){var yt=qn();try{return Xo($,P,K,ae,he,Oe,et)}catch(Ct){if(er(yt),Ct!==Ct+0)throw Ct;cr(1,0)}}function ac($,P,K,ae,he,Oe,et){var yt=qn();try{return eo($,P,K,ae,he,Oe,et)}catch(Ct){if(er(yt),Ct!==Ct+0)throw Ct;cr(1,0)}}return a.stackSave=()=>qn(),a.stackRestore=$=>er($),a.stackAlloc=$=>Aa($),a.setValue=function($,P,K="i8"){switch(K.endsWith("*")&&(K="*"),K){case"i1":case"i8":N()[$>>>0]=P;break;case"i16":k()[$>>>1>>>0]=P;break;case"i32":M()[$>>>2>>>0]=P;break;case"i64":q[$>>>3]=BigInt(P);break;case"float":se()[$>>>2>>>0]=P;break;case"double":ie()[$>>>3>>>0]=P;break;case"*":Y()[$>>>2>>>0]=P;break;default:U(`invalid type for setValue: ${K}`)}},a.getValue=function($,P="i8"){switch(P.endsWith("*")&&(P="*"),P){case"i1":case"i8":return N()[$>>>0];case"i16":return k()[$>>>1>>>0];case"i32":return M()[$>>>2>>>0];case"i64":return q[$>>>3];case"float":return se()[$>>>2>>>0];case"double":return ie()[$>>>3>>>0];case"*":return Y()[$>>>2>>>0];default:U(`invalid type for getValue: ${P}`)}},a.UTF8ToString=Nt,a.stringToUTF8=Ht,a.lengthBytesUTF8=Tn,(function $(){if(0{uS(),rz=typeof location>"u"?void 0:location.origin,SM=()=>{var e;return(e=import.meta.url)!=null&&e.startsWith("file:")?new URL(new URL(""+new URL("ort.bundle.min-OfoG_cy9.mjs",import.meta.url).href,import.meta.url).href,rz).href:import.meta.url},mc=SM(),kF=()=>{if(mc&&!mc.startsWith("blob:"))return mc.substring(0,mc.lastIndexOf("/")+1)},oy=(e,t)=>{try{let n=t??mc;return(n?new URL(e,n):new URL(e)).origin===rz}catch{return!1}},jM=(e,t)=>{let n=t??mc;try{return(n?new URL(e,n):new URL(e)).href}catch{return}},CM=(e,t)=>`${t??"./"}${e}`,sz=async e=>{let t=await(await fetch(e,{credentials:"same-origin"})).blob();return URL.createObjectURL(t)},NM=async e=>(await import(e)).default,iz=(Z0e(),fw(CF)).default,AF=async()=>{if(!mc)throw new Error("Failed to load proxy worker: cannot determine the script source URL.");if(oy(mc))return[void 0,iz()];let e=await sz(mc);return[e,iz(e)]},az=(Q0e(),fw(EF)).default,MF=async(e,t,n)=>{if(!e&&!t&&az&&mc&&oy(mc))return[void 0,az];{let r="ort-wasm-simd-threaded.jsep.mjs",i=e??jM(r,t),a=n&&i&&!oy(i,t),o=a?await sz(i):i??CM(r,t);return[a?o:void 0,await NM(o)]}}}),oz,ly,Vg,lz,EM,IM,hS,Ka,uf=dr(()=>{dS(),ly=!1,Vg=!1,lz=!1,EM=()=>{if(typeof SharedArrayBuffer>"u")return!1;try{return typeof MessageChannel<"u"&&new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch{return!1}},IM=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,30,1,28,0,65,0,253,15,253,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,186,1,26,11]))}catch{return!1}},hS=async e=>{if(ly)return Promise.resolve();if(Vg)throw new Error("multiple calls to 'initializeWebAssembly()' detected.");if(lz)throw new Error("previous call to 'initializeWebAssembly()' failed.");Vg=!0;let t=e.initTimeout,n=e.numThreads;if(!IM())throw new Error("WebAssembly SIMD is not supported in the current environment.");let r=EM();n>1&&!r&&(typeof self<"u"&&!self.crossOriginIsolated&&console.warn("env.wasm.numThreads is set to "+n+", but this will not work unless you enable crossOriginIsolated mode. See https://web.dev/cross-origin-isolation-guide/ for more info."),console.warn("WebAssembly multi-threading is not supported in the current environment. Falling back to single-threading."),e.numThreads=n=1);let i=e.wasmPaths,a=typeof i=="string"?i:void 0,o=i==null?void 0:i.mjs,l=(o==null?void 0:o.href)??o,c=i==null?void 0:i.wasm,u=(c==null?void 0:c.href)??c,d=e.wasmBinary,[h,p]=await MF(l,a,n>1),f=!1,b=[];if(t>0&&b.push(new Promise(g=>{setTimeout(()=>{f=!0,g()},t)})),b.push(new Promise((g,y)=>{let w={numThreads:n};if(d)w.wasmBinary=d;else if(u||a)w.locateFile=v=>u??a+v;else if(l&&l.indexOf("blob:")!==0)w.locateFile=v=>new URL(v,l).href;else if(h){let v=kF();v&&(w.locateFile=m=>v+m)}p(w).then(v=>{Vg=!1,ly=!0,oz=v,g(),h&&URL.revokeObjectURL(h)},v=>{Vg=!1,lz=!0,y(v)})})),await Promise.race(b),f)throw new Error(`WebAssembly backend initializing failed due to timeout: ${t}ms`)},Ka=()=>{if(ly&&oz)return oz;throw new Error("WebAssembly is not initialized yet.")}}),jo,mw,ni,pS=dr(()=>{uf(),jo=(e,t)=>{let n=Ka(),r=n.lengthBytesUTF8(e)+1,i=n._malloc(r);return n.stringToUTF8(e,i,r),t.push(i),i},mw=(e,t,n,r)=>{if(typeof e=="object"&&e!==null){if(n.has(e))throw new Error("Circular reference in options");n.add(e)}Object.entries(e).forEach(([i,a])=>{let o=t?t+i:i;if(typeof a=="object")mw(a,o+".",n,r);else if(typeof a=="string"||typeof a=="number")r(o,a.toString());else if(typeof a=="boolean")r(o,a?"1":"0");else throw new Error(`Can't handle extra config type: ${typeof a}`)})},ni=e=>{let t=Ka(),n=t.stackSave();try{let r=t.PTR_SIZE,i=t.stackAlloc(2*r);t._OrtGetLastError(i,i+r);let a=Number(t.getValue(i,r===4?"i32":"i64")),o=t.getValue(i+r,"*"),l=o?t.UTF8ToString(o):"";throw new Error(`${e} ERROR_CODE: ${a}, ERROR_MESSAGE: ${l}`)}finally{t.stackRestore(n)}}}),TF,ehe=dr(()=>{uf(),pS(),TF=e=>{let t=Ka(),n=0,r=[],i=e||{};try{if((e==null?void 0:e.logSeverityLevel)===void 0)i.logSeverityLevel=2;else if(typeof e.logSeverityLevel!="number"||!Number.isInteger(e.logSeverityLevel)||e.logSeverityLevel<0||e.logSeverityLevel>4)throw new Error(`log serverity level is not valid: ${e.logSeverityLevel}`);if((e==null?void 0:e.logVerbosityLevel)===void 0)i.logVerbosityLevel=0;else if(typeof e.logVerbosityLevel!="number"||!Number.isInteger(e.logVerbosityLevel))throw new Error(`log verbosity level is not valid: ${e.logVerbosityLevel}`);(e==null?void 0:e.terminate)===void 0&&(i.terminate=!1);let a=0;return(e==null?void 0:e.tag)!==void 0&&(a=jo(e.tag,r)),n=t._OrtCreateRunOptions(i.logSeverityLevel,i.logVerbosityLevel,!!i.terminate,a),n===0&&ni("Can't create run options."),(e==null?void 0:e.extra)!==void 0&&mw(e.extra,"",new WeakSet,(o,l)=>{let c=jo(o,r),u=jo(l,r);t._OrtAddRunConfigEntry(n,c,u)!==0&&ni(`Can't set a run config entry: ${o} - ${l}.`)}),[n,r]}catch(a){throw n!==0&&t._OrtReleaseRunOptions(n),r.forEach(o=>t._free(o)),a}}}),kM,AM,MM,TM,RF,the=dr(()=>{uf(),pS(),kM=e=>{switch(e){case"disabled":return 0;case"basic":return 1;case"extended":return 2;case"all":return 99;default:throw new Error(`unsupported graph optimization level: ${e}`)}},AM=e=>{switch(e){case"sequential":return 0;case"parallel":return 1;default:throw new Error(`unsupported execution mode: ${e}`)}},MM=e=>{e.extra||(e.extra={}),e.extra.session||(e.extra.session={});let t=e.extra.session;t.use_ort_model_bytes_directly||(t.use_ort_model_bytes_directly="1"),e.executionProviders&&e.executionProviders.some(n=>(typeof n=="string"?n:n.name)==="webgpu")&&(e.enableMemPattern=!1)},TM=(e,t,n)=>{for(let r of t){let i=typeof r=="string"?r:r.name;switch(i){case"webnn":if(i="WEBNN",typeof r!="string"){let o=r==null?void 0:r.deviceType;if(o){let l=jo("deviceType",n),c=jo(o,n);Ka()._OrtAddSessionConfigEntry(e,l,c)!==0&&ni(`Can't set a session config entry: 'deviceType' - ${o}.`)}}break;case"webgpu":if(i="JS",typeof r!="string"){let o=r;if(o!=null&&o.preferredLayout){if(o.preferredLayout!=="NCHW"&&o.preferredLayout!=="NHWC")throw new Error(`preferredLayout must be either 'NCHW' or 'NHWC': ${o.preferredLayout}`);let l=jo("preferredLayout",n),c=jo(o.preferredLayout,n);Ka()._OrtAddSessionConfigEntry(e,l,c)!==0&&ni(`Can't set a session config entry: 'preferredLayout' - ${o.preferredLayout}.`)}}break;case"wasm":case"cpu":continue;default:throw new Error(`not supported execution provider: ${i}`)}let a=jo(i,n);Ka()._OrtAppendExecutionProvider(e,a)!==0&&ni(`Can't append execution provider: ${i}.`)}},RF=e=>{let t=Ka(),n=0,r=[],i=e||{};MM(i);try{let a=kM(i.graphOptimizationLevel??"all"),o=AM(i.executionMode??"sequential"),l=typeof i.logId=="string"?jo(i.logId,r):0,c=i.logSeverityLevel??2;if(!Number.isInteger(c)||c<0||c>4)throw new Error(`log serverity level is not valid: ${c}`);let u=i.logVerbosityLevel??0;if(!Number.isInteger(u)||u<0||u>4)throw new Error(`log verbosity level is not valid: ${u}`);let d=typeof i.optimizedModelFilePath=="string"?jo(i.optimizedModelFilePath,r):0;if(n=t._OrtCreateSessionOptions(a,!!i.enableCpuMemArena,!!i.enableMemPattern,o,!!i.enableProfiling,0,l,c,u,d),n===0&&ni("Can't create session options."),i.executionProviders&&TM(n,i.executionProviders,r),i.enableGraphCapture!==void 0){if(typeof i.enableGraphCapture!="boolean")throw new Error(`enableGraphCapture must be a boolean value: ${i.enableGraphCapture}`);let h=jo("enableGraphCapture",r),p=jo(i.enableGraphCapture.toString(),r);t._OrtAddSessionConfigEntry(n,h,p)!==0&&ni(`Can't set a session config entry: 'enableGraphCapture' - ${i.enableGraphCapture}.`)}if(i.freeDimensionOverrides)for(let[h,p]of Object.entries(i.freeDimensionOverrides)){if(typeof h!="string")throw new Error(`free dimension override name must be a string: ${h}`);if(typeof p!="number"||!Number.isInteger(p)||p<0)throw new Error(`free dimension override value must be a non-negative integer: ${p}`);let f=jo(h,r);t._OrtAddFreeDimensionOverride(n,f,p)!==0&&ni(`Can't set a free dimension override: ${h} - ${p}.`)}return i.extra!==void 0&&mw(i.extra,"",new WeakSet,(h,p)=>{let f=jo(h,r),b=jo(p,r);t._OrtAddSessionConfigEntry(n,f,b)!==0&&ni(`Can't set a session config entry: ${h} - ${p}.`)}),[n,r]}catch(a){throw n!==0&&t._OrtReleaseSessionOptions(n)!==0&&ni("Can't release session options."),r.forEach(o=>t._free(o)),a}}}),em,kp,Ap,fS,gw,mS,gS,s5,ps=dr(()=>{em=e=>{switch(e){case"int8":return 3;case"uint8":return 2;case"bool":return 9;case"int16":return 5;case"uint16":return 4;case"int32":return 6;case"uint32":return 12;case"float16":return 10;case"float32":return 1;case"float64":return 11;case"string":return 8;case"int64":return 7;case"uint64":return 13;case"int4":return 22;case"uint4":return 21;default:throw new Error(`unsupported data type: ${e}`)}},kp=e=>{switch(e){case 3:return"int8";case 2:return"uint8";case 9:return"bool";case 5:return"int16";case 4:return"uint16";case 6:return"int32";case 12:return"uint32";case 10:return"float16";case 1:return"float32";case 11:return"float64";case 8:return"string";case 7:return"int64";case 13:return"uint64";case 22:return"int4";case 21:return"uint4";default:throw new Error(`unsupported data type: ${e}`)}},Ap=(e,t)=>{let n=[-1,4,1,1,2,2,4,8,-1,1,2,8,4,8,-1,-1,-1,-1,-1,-1,-1,.5,.5][e],r=typeof t=="number"?t:t.reduce((i,a)=>i*a,1);return n>0?Math.ceil(r*n):void 0},fS=e=>{switch(e){case"float16":return typeof Float16Array<"u"&&Float16Array.from?Float16Array:Uint16Array;case"float32":return Float32Array;case"uint8":return Uint8Array;case"int8":return Int8Array;case"uint16":return Uint16Array;case"int16":return Int16Array;case"int32":return Int32Array;case"bool":return Uint8Array;case"float64":return Float64Array;case"uint32":return Uint32Array;case"int64":return BigInt64Array;case"uint64":return BigUint64Array;default:throw new Error(`unsupported type: ${e}`)}},gw=e=>{switch(e){case"verbose":return 0;case"info":return 1;case"warning":return 2;case"error":return 3;case"fatal":return 4;default:throw new Error(`unsupported logging level: ${e}`)}},mS=e=>e==="float32"||e==="float16"||e==="int32"||e==="int64"||e==="uint32"||e==="uint8"||e==="bool"||e==="uint4"||e==="int4",gS=e=>e==="float32"||e==="float16"||e==="int32"||e==="int64"||e==="uint32"||e==="uint64"||e==="int8"||e==="uint8"||e==="bool"||e==="uint4"||e==="int4",s5=e=>{switch(e){case"none":return 0;case"cpu":return 1;case"cpu-pinned":return 2;case"texture":return 3;case"gpu-buffer":return 4;case"ml-tensor":return 5;default:throw new Error(`unsupported data location: ${e}`)}}}),xS,PF=dr(()=>{uS(),xS=async e=>{if(typeof e=="string"){let t=await fetch(e);if(!t.ok)throw new Error(`failed to load external data file: ${e}`);let n=t.headers.get("Content-Length"),r=n?parseInt(n,10):0;if(r<1073741824)return new Uint8Array(await t.arrayBuffer());{if(!t.body)throw new Error(`failed to load external data file: ${e}, no response body.`);let i=t.body.getReader(),a;try{a=new ArrayBuffer(r)}catch(l){if(l instanceof RangeError){let c=Math.ceil(r/65536);a=new WebAssembly.Memory({initial:c,maximum:c}).buffer}else throw l}let o=0;for(;;){let{done:l,value:c}=await i.read();if(l)break;let u=c.byteLength;new Uint8Array(a,o,u).set(c),o+=u}return new Uint8Array(a,0,r)}}else return e instanceof Blob?new Uint8Array(await e.arrayBuffer()):e instanceof Uint8Array?e:new Uint8Array(e)}}),RM,PM,OM,LM,bS,BM,Us,V0=dr(()=>{ps(),RM=["V","I","W","E","F"],PM=(e,t)=>{console.log(`[${RM[e]},${new Date().toISOString()}]${t}`)},bS=(e,t)=>{OM=e,LM=t},BM=(e,t)=>{let n=gw(e),r=gw(OM);n>=r&&PM(n,typeof t=="function"?t():t)},Us=(...e)=>{LM&&BM(...e)}}),yS,OF=dr(()=>{ps(),yS=(e,t)=>new(fS(t))(e)}),vS=dr(()=>{}),cz,cy,uy,UM,FM,uz,i5,WM,LF,nhe=dr(()=>{V0(),vS(),cz=new Map([[64,250],[128,200],[256,200],[512,200],[2048,230],[4096,200],[8192,50],[16384,50],[32768,50],[65536,50],[131072,50],[262144,50],[524288,50],[1048576,50],[2097152,30],[4194304,20],[8388608,10],[12582912,10],[16777216,10],[26214400,15],[33554432,22],[44236800,2],[58982400,6],[67108864,6],[134217728,6],[167772160,6]]),cy=[],uy=e=>Math.ceil(Number(e)/16)*16,UM=e=>{for(let t=0;tFM++,i5=async(e,t,n,r)=>{let i=uy(n),a=e.device.createBuffer({size:i,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});try{let o=e.getCommandEncoder();e.endComputePass(),o.copyBufferToBuffer(t,0,a,0,i),e.flush(),await a.mapAsync(GPUMapMode.READ);let l=a.getMappedRange();if(r){let c=r();return c.set(new Uint8Array(l,0,n)),c}else return new Uint8Array(l.slice(0,n))}finally{a.destroy()}},WM=class{constructor(e){this.backend=e,this.storageCache=new Map,this.freeBuffers=new Map,this.freeUniformBuffers=new Map,this.buffersPending=[],this.capturedPendingBuffers=new Map;for(let[t]of cz)cy.push(t),this.freeBuffers.set(t,[]),this.freeUniformBuffers.set(t,[]);this.sessionCount=0}upload(e,t){let n=t.buffer,r=t.byteOffset,i=t.byteLength,a=uy(i),o=this.storageCache.get(e);if(!o)throw new Error("gpu data for uploading does not exist");if(Number(o.originalSize)!==i)throw new Error(`inconsistent data size. gpu data size=${o.originalSize}, data size=${i}`);let l=this.backend.device.createBuffer({mappedAtCreation:!0,size:a,usage:GPUBufferUsage.MAP_WRITE|GPUBufferUsage.COPY_SRC}),c=l.getMappedRange();new Uint8Array(c).set(new Uint8Array(n,r,i)),l.unmap();let u=this.backend.device.createCommandEncoder();u.copyBufferToBuffer(l,0,o.gpuData.buffer,0,a),this.backend.device.queue.submit([u.finish()]),l.destroy(),Us("verbose",()=>`[WebGPU] GpuDataManager.upload(id=${e})`)}memcpy(e,t){let n=this.storageCache.get(e);if(!n)throw new Error("source gpu data for memcpy does not exist");let r=this.storageCache.get(t);if(!r)throw new Error("destination gpu data for memcpy does not exist");if(n.originalSize!==r.originalSize)throw new Error("inconsistent source and destination gpu data size");let i=uy(n.originalSize),a=this.backend.getCommandEncoder();this.backend.endComputePass(),a.copyBufferToBuffer(n.gpuData.buffer,0,r.gpuData.buffer,0,i)}registerExternalBuffer(e,t,n){let r;if(n){if(r=n[0],e===n[1])return Us("verbose",()=>`[WebGPU] GpuDataManager.registerExternalBuffer(size=${t}) => id=${r}, buffer is the same, skip.`),r;if(this.backend.capturedCommandList.has(this.backend.currentSessionId))throw new Error(`Registering a different external buffer under graph capture mode is not supported yet. + Please use the previous external buffer!`)}else r=uz();return this.storageCache.set(r,{gpuData:{id:r,type:0,buffer:e},originalSize:t}),Us("verbose",()=>`[WebGPU] GpuDataManager.registerExternalBuffer(size=${t}) => id=${r}, registered.`),r}unregisterExternalBuffer(e){e!==void 0&&(this.storageCache.delete(e),Us("verbose",()=>`[WebGPU] GpuDataManager.unregisterExternalBuffer() => id=${e}`))}create(e,t=GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST){let n=UM(e),r,i=(t&GPUBufferUsage.STORAGE)===GPUBufferUsage.STORAGE,a=(t&GPUBufferUsage.UNIFORM)===GPUBufferUsage.UNIFORM;if(i||a){let l=(i?this.freeBuffers:this.freeUniformBuffers).get(n);l?l.length>0?r=l.pop():r=this.backend.device.createBuffer({size:n,usage:t}):r=this.backend.device.createBuffer({size:n,usage:t})}else r=this.backend.device.createBuffer({size:n,usage:t});let o={id:uz(),type:0,buffer:r};return this.storageCache.set(o.id,{gpuData:o,originalSize:Number(e)}),Us("verbose",()=>`[WebGPU] GpuDataManager.create(size=${e}) => id=${o.id}`),o}get(e){var t;return(t=this.storageCache.get(e))==null?void 0:t.gpuData}release(e){let t=typeof e=="bigint"?Number(e):e,n=this.storageCache.get(t);if(!n){if(this.storageCache.size===0)return 0;throw new Error("releasing data does not exist")}return Us("verbose",()=>`[WebGPU] GpuDataManager.release(id=${t}), gpuDataId=${n.gpuData.id}`),this.storageCache.delete(t),this.buffersPending.push(n.gpuData.buffer),n.originalSize}async download(e,t){let n=this.storageCache.get(Number(e));if(!n)throw new Error("data does not exist");await i5(this.backend,n.gpuData.buffer,n.originalSize,t)}refreshPendingBuffers(){if(this.buffersPending.length!==0)if(this.backend.sessionStatus==="default"){for(let e of this.buffersPending){let t=cz.get(e.size);if((e.usage&GPUBufferUsage.STORAGE)===GPUBufferUsage.STORAGE){let n=this.freeBuffers.get(e.size)||[];t===void 0||n.length>=t?e.destroy():n.push(e)}else if((e.usage&GPUBufferUsage.UNIFORM)===GPUBufferUsage.UNIFORM){let n=this.freeUniformBuffers.get(e.size)||[];t===void 0||n.length>=t?e.destroy():n.push(e)}else e.destroy()}this.buffersPending=[]}else{let e=this.capturedPendingBuffers.get(this.backend.currentSessionId);e||(e=[],this.capturedPendingBuffers.set(this.backend.currentSessionId,e));for(let t of this.buffersPending)e.push(t);this.buffersPending=[]}}dispose(){this.freeBuffers.forEach(e=>{e.forEach(t=>{t.destroy()})}),this.freeUniformBuffers.forEach(e=>{e.forEach(t=>{t.destroy()})}),this.storageCache.forEach(e=>{e.gpuData.buffer.destroy()}),this.capturedPendingBuffers.forEach(e=>{e.forEach(t=>{t.destroy()})}),this.storageCache=new Map,this.freeBuffers=new Map,this.freeUniformBuffers=new Map,this.capturedPendingBuffers=new Map}onCreateSession(){this.sessionCount+=1}onReleaseSession(e){let t=this.capturedPendingBuffers.get(e);t&&(t.forEach(n=>{n.destroy()}),this.capturedPendingBuffers.delete(e)),this.sessionCount-=1,this.sessionCount===0&&(Us("warning",()=>"[WebGPU] Clearing webgpu buffer cache"),this.storageCache.forEach(n=>{n.gpuData.buffer.destroy()}),this.storageCache=new Map)}},LF=(...e)=>new WM(...e)}),DM,fi,la=dr(()=>{DM=class{constructor(e){Object.assign(this,e)}get cacheKey(){return this.key||(this.key=Object.getOwnPropertyNames(this).sort().map(e=>`${this[e]}`).join(";")),this.key}},fi=e=>new DM(e)}),VM,Im,kn,xw,BF,UF,FF,ws=dr(()=>{VM=class{static calcMatMulShape(e,t){return e[1]!==t[0]?void 0:[e[0],t[1]]}},Im=class{static calcShape(e,t,n=!1){let r=e.length,i=t.length;if(r===0)return t;if(i===0)return e;let a=Math.max(e.length,t.length),o=new Array(a);if(n){if(r<2||i<2)return;let l=VM.calcMatMulShape([e[r-2],e[r-1]],[t[i-2],t[i-1]]);if(l===void 0)return;[o[a-2],o[a-1]]=l}for(let l=n?3:1;l<=a;l++){let c=r-l<0?1:e[r-l],u=i-l<0?1:t[i-l];if(c!==u&&c>1&&u>1)return;let d=Math.max(c,u);if(c&&u)o[a-l]=Math.max(c,u);else{if(d>1)return;o[a-l]=0}}return o}static isValidBroadcast(e,t){let n=e.length,r=t.length;if(n>r)return!1;for(let i=1;i<=n;i++)if(e[n-i]!==1&&e[n-i]!==t[r-i])return!1;return!0}},kn=class _v{static size(t){return _v.getSizeFromDimensionRange(t,0,t.length)}static convertShape(t,n=4){let r=t.length;if(r===0)return[];let i=new Array(r),a=r-1;for(;a>=0;){if(t[a]%n===0){i[a]=t[a]/n;break}if(n%t[a]!==0)throw new Error("cannot convert shape");i[a]=1,n/=t[a],a--}for(a--;a>=0;a--)i[a]=t[a];return i}static sizeFromDimension(t,n){if(n<0||n>t.length)throw new Error(`invalid dimension of ${n} for sizeFromDimension as Tensor has ${t.length} dimensions.`);return _v.getSizeFromDimensionRange(t,n,t.length)}static sizeToDimension(t,n){if(n<0||n>t.length)throw new Error(`invalid dimension of ${n} for sizeToDimension as Tensor has ${t.length} dimensions.`);return _v.getSizeFromDimensionRange(t,0,n)}static getSizeFromDimensionRange(t,n,r){let i=1;for(let a=n;a=0;--i)r[i]=r[i+1]*t[i+1];return r}static normalizeAxis(t,n){if(t<-n&&t>=n)throw new Error("unsupported axis for this operation.");return t<0?t+n:t}static normalizeAxes(t,n){return t.map(r=>this.normalizeAxis(r,n??t.length))}static sortBasedOnPerm(t,n){return n?n.map(r=>t[r]):t.slice().reverse()}static padShape(t,n){let r=t.length;return t.map((i,a)=>i+n[a]+n[a+r])}static areEqual(t,n){return t.length!==n.length?!1:t.every((r,i)=>r===n[i])}},xw=class dx{static adjustPoolAttributes(t,n,r,i,a,o){if(!t&&r.length!==n.length-2)throw new Error("length of specified kernel shapes should be 2 less than length of input dimensions");if(t)for(let l=0;l=r.length?r.push(n[l+2]):r[l]=n[l+2];for(let l=0;l=r[l]||o[l+r.length]>=r[l])throw new Error("pads should be smaller than kernel")}}static adjustPadsBasedOnAutoPad(t,n,r,i,a,o,l){if(l){if(a.length!==2*(t.length-2))throw new Error("length of pads should be twice the length of data dimensions");if(n.length!==t.length-2)throw new Error("length of strides should be the length of data dimensions");if(i.length!==t.length-2)throw new Error("length of kernel shapes should be the length of data dimensions");for(let c=0;c{ps(),ws(),km=64,dy=(e,t)=>{if(t===3)throw new Error("vec3 has same alignment as vec4, use vec4 instead");switch(Number(e)){case 10:return t>1?`vec${t}`:"f16";case 1:return t>1?`vec${t}`:"f32";case 6:return t>1?`vec${t}`:"i32";case 12:return t>1?`vec${t}`:"u32";case 7:if(t>1)throw new Error("currently not supported vecX of uint64 yet");return["vec2","i32"];case 13:if(t>1)throw new Error("currently not supported vecX of uint64 yet");return["vec2","u32"];case 9:if(t!==4)throw new Error("bool must be vec4");return["u32","vec4"];case 22:return"i32";case 21:return"u32";default:throw new Error(`Unknown data type: ${e}`)}},Qa=(e,t=1)=>{let n=dy(e,t);return typeof n=="string"?n:n[0]},Uo=(e,t=1)=>{let n=dy(e,t);return typeof n=="string"?n:n[1]},Jr=(...e)=>{let t=[];return e.forEach(n=>{n.length!==0&&t.push({type:12,data:n},{type:12,data:kn.computeStrides(n)})}),t},Ji=e=>e%4===0?4:e%2===0?2:1,a5=(e="f32",t,n="0")=>!t||t===1?`${e}(${n})`:`vec${t}<${e}>(${n})`,dm=(e,t,n)=>e==="f32"?n:t===1?`f32(${n})`:`vec${t}(${n})`,Oh=(e,t)=>t===4?`(${e}.x + ${e}.y + ${e}.z + ${e}.w)`:t===2?`(${e}.x + ${e}.y)`:t===3?`(${e}.x + ${e}.y + ${e}.z)`:e,qr=(e,t,n,r)=>e.startsWith("uniforms.")&&n>4?typeof t=="string"?r==="f16"?`${e}[(${t}) / 8][(${t}) % 8 / 4][(${t}) % 8 % 4]`:`${e}[(${t}) / 4][(${t}) % 4]`:r==="f16"?`${e}[${Math.floor(t/8)}][${Math.floor(t%8/4)}][${t%8%4}]`:`${e}[${Math.floor(t/4)}][${t%4}]`:n>1?`${e}[${t}]`:e,Hg=(e,t,n,r,i)=>{let a=typeof n=="number",o=a?n:n.length,l=[...new Array(o).keys()],c=o<2?"u32":o<=4?`vec${o}`:`array`,u=dy(t,i),d=typeof u=="string"?u:u[1],h=typeof u=="string"?u:u[0],p={indices:c,value:d,storage:h,tensor:t},f=N=>typeof N=="string"?N:`${N}u`,b={offsetToIndices:!1,indicesToOffset:!1,broadcastedIndicesToOffset:!1,set:!1,setByIndices:!1,get:!1,getByIndices:!1},g=a?"uniforms.":"",y=`${g}${e}_shape`,w=`${g}${e}_strides`,v="";for(let N=0;N ${p.indices} { + var indices: ${p.indices}; + var current = offset; + ${v} + return indices; + }`,z=N=>(b.offsetToIndices=!0,o<2?N:`o2i_${e}(${N})`),C=[];if(o>=2)for(let N=o-1;N>=0;N--)C.push(`${qr(w,N,o)} * (indices[${N}])`);let E=o<2?"":` + fn i2o_${e}(indices: ${p.indices}) -> u32 { + return ${C.join("+")}; + }`,I=N=>(b.indicesToOffset=!0,o<2?N:`i2o_${e}(${N})`),R=(...N)=>o===0?"0u":`${p.indices}(${N.map(f).join(",")})`,A=(N,j)=>o<2?`${N}`:`${qr(N,j,o)}`,O=(N,j,k)=>o<2?`${N}=${k};`:`${qr(N,j,o)}=${k};`,F={},L=(N,j)=>{b.broadcastedIndicesToOffset=!0;let k=`${j.name}broadcastedIndicesTo${e}Offset`;if(k in F)return`${k}(${N})`;let W=[];for(let M=o-1;M>=0;M--){let Y=j.indicesGet("outputIndices",M+j.rank-o);W.push(`${A(w,M)} * (${Y} % ${A(y,M)})`)}return F[k]=`fn ${k}(outputIndices: ${j.type.indices}) -> u32 { + return ${W.length>0?W.join("+"):"0u"}; + }`,`${k}(${N})`},X=(N,j)=>(()=>{if(p.storage===p.value)return`${e}[${N}]=${j};`;if(p.storage==="vec2"&&p.value==="i32")return`${e}[${N}]=vec2(u32(${j}), select(0u, 0xFFFFFFFFu, ${j} < 0));`;if(p.storage==="vec2"&&p.value==="u32")return`${e}[${N}]=vec2(u32(${j}), 0u);`;if(p.storage==="u32"&&p.value==="vec4")return`${e}[${N}]=dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(${j}));`;throw new Error(`not supported combination of storage type ${p.storage} and value type ${p.value} yet`)})(),T=N=>(()=>{if(p.storage===p.value)return`${e}[${N}]`;if(p.storage==="vec2"&&p.value==="i32")return`i32(${e}[${N}].x)`;if(p.storage==="vec2"&&p.value==="u32")return`u32(${e}[${N}].x)`;if(p.storage==="u32"&&p.value==="vec4")return`vec4(bool(${e}[${N}] & 0xFFu), bool(${e}[${N}] & 0xFF00u), bool(${e}[${N}] & 0xFF0000u), bool(${e}[${N}] & 0xFF000000u))`;throw new Error(`not supported combination of storage type ${p.storage} and value type ${p.value} yet`)})(),q=o<2?"":` + fn get_${e}ByIndices(indices: ${p.indices}) -> ${d} { + return ${T(`i2o_${e}(indices)`)}; + }`,H=o<2?"":(()=>{let N=l.map(k=>`d${k}: u32`).join(", "),j=l.map(k=>`d${k}`).join(", ");return` + fn get_${e}(${N}) -> ${d} { + return get_${e}ByIndices(${R(j)}); + }`})(),J=(...N)=>{if(N.length!==o)throw new Error(`indices length must be ${o}`);let j=N.map(f).join(",");return o===0?T("0u"):o===1?T(j[0]):(b.get=!0,b.getByIndices=!0,b.indicesToOffset=!0,`get_${e}(${j})`)},Z=N=>o<2?T(N):(b.getByIndices=!0,b.indicesToOffset=!0,`get_${e}ByIndices(${N})`),B=o<2?"":` + fn set_${e}ByIndices(indices: ${p.indices}, value: ${d}) { + ${X(`i2o_${e}(indices)`,"value")} + }`,V=o<2?"":(()=>{let N=l.map(k=>`d${k}: u32`).join(", "),j=l.map(k=>`d${k}`).join(", ");return` + fn set_${e}(${N}, value: ${d}) { + set_${e}ByIndices(${R(j)}, value); + }`})();return{impl:()=>{let N=[],j=!1;return b.offsetToIndices&&(N.push(m),j=!0),b.indicesToOffset&&(N.push(E),j=!0),b.broadcastedIndicesToOffset&&(Object.values(F).forEach(k=>N.push(k)),j=!0),b.set&&(N.push(V),j=!0),b.setByIndices&&(N.push(B),j=!0),b.get&&(N.push(H),j=!0),b.getByIndices&&(N.push(q),j=!0),!a&&j&&N.unshift(`const ${y} = ${p.indices}(${n.join(",")});`,`const ${w} = ${p.indices}(${kn.computeStrides(n).join(",")});`),N.join(` +`)},type:p,offsetToIndices:z,indicesToOffset:I,broadcastedIndicesToOffset:L,indices:R,indicesGet:A,indicesSet:O,set:(...N)=>{if(N.length!==o+1)throw new Error(`indices length must be ${o}`);let j=N[o];if(typeof j!="string")throw new Error("value must be string");let k=N.slice(0,o).map(f).join(",");return o===0?X("0u",j):o===1?X(k[0],j):(b.set=!0,b.setByIndices=!0,b.indicesToOffset=!0,`set_${e}(${k}, ${j})`)},setByOffset:X,setByIndices:(N,j)=>o<2?X(N,j):(b.setByIndices=!0,b.indicesToOffset=!0,`set_${e}ByIndices(${N}, ${j});`),get:J,getByOffset:T,getByIndices:Z,usage:r,name:e,strides:w,shape:y,rank:o}},Wn=(e,t,n,r=1)=>Hg(e,t,n,"input",r),Vr=(e,t,n,r=1)=>Hg(e,t,n,"output",r),WF=(e,t,n)=>Hg(e,t,n,"atomicOutput",1),wS=(e,t,n,r=1)=>Hg(e,t,n,"internal",r),HM=class{constructor(e,t){this.normalizedDispatchGroup=e,this.limits=t,this.internalVariables=[],this.variables=[],this.uniforms=[],this.variableIndex=0}guardAgainstOutOfBoundsWorkgroupSizes(e){return`if (global_idx >= ${typeof e=="number"?`${e}u`:e}) { return; }`}mainStart(e=km){let t=typeof e=="number"?e:e[0],n=typeof e=="number"?1:e[1],r=typeof e=="number"?1:e[2];if(t>this.limits.maxComputeWorkgroupSizeX||n>this.limits.maxComputeWorkgroupSizeY||r>this.limits.maxComputeWorkgroupSizeZ)throw new Error(`workgroup size [${t}, ${n}, ${r}] exceeds the maximum workgroup size [${this.limits.maxComputeWorkgroupSizeX}, ${this.limits.maxComputeWorkgroupSizeY}, ${this.limits.maxComputeWorkgroupSizeZ}].`);if(t*n*r>this.limits.maxComputeInvocationsPerWorkgroup)throw new Error(`workgroup size [${t}, ${n}, ${r}] exceeds the maximum workgroup invocations ${this.limits.maxComputeInvocationsPerWorkgroup}.`);let i=this.normalizedDispatchGroup[1]===1&&this.normalizedDispatchGroup[2]===1,a=i?`@builtin(global_invocation_id) global_id : vec3, + @builtin(workgroup_id) workgroup_id : vec3, + @builtin(local_invocation_index) local_idx : u32, + @builtin(local_invocation_id) local_id : vec3`:`@builtin(global_invocation_id) global_id : vec3, + @builtin(local_invocation_id) local_id : vec3, + @builtin(local_invocation_index) local_idx : u32, + @builtin(workgroup_id) workgroup_id : vec3, + @builtin(num_workgroups) num_workgroups : vec3`,o=i?`let global_idx = global_id.x; + let workgroup_index = workgroup_id.x;`:`let workgroup_index = workgroup_id.z * num_workgroups[0] * num_workgroups[1] + + workgroup_id.y * num_workgroups[0] + workgroup_id.x; + let global_idx = workgroup_index * ${t*n*r}u + local_idx;`;return`@compute @workgroup_size(${t}, ${n}, ${r}) + fn main(${a}) { + ${o} + `}appendVariableUniforms(e){e.rank!==0&&(e.shape.startsWith("uniforms.")&&this.uniforms.push({name:e.shape.replace("uniforms.",""),type:"u32",length:e.rank}),e.strides.startsWith("uniforms.")&&this.uniforms.push({name:e.strides.replace("uniforms.",""),type:"u32",length:e.rank}))}declareVariable(e,t){if(e.usage==="internal")throw new Error("cannot use internal variable with declareVariable(). use registerInternalVariables() instead.");this.variables.push(e),this.appendVariableUniforms(e);let n=e.usage==="input"?"read":"read_write",r=e.usage==="atomicOutput"?"atomic":e.type.storage;return`@group(0) @binding(${t}) var ${e.name}: array<${r}>;`}declareVariables(...e){return e.map(t=>this.declareVariable(t,this.variableIndex++)).join(` +`)}registerInternalVariable(e){if(e.usage!=="internal")throw new Error("cannot use input or output variable with registerInternalVariable(). use declareVariables() instead.");this.internalVariables.push(e),this.appendVariableUniforms(e)}registerInternalVariables(...e){return e.forEach(t=>this.registerInternalVariable(t)),this}registerUniform(e,t,n=1){return this.uniforms.push({name:e,type:t,length:n}),this}registerUniforms(e){return this.uniforms=this.uniforms.concat(e),this}uniformDeclaration(){if(this.uniforms.length===0)return"";let e=[];for(let{name:t,type:n,length:r}of this.uniforms)if(r&&r>4)n==="f16"?e.push(`@align(16) ${t}:array, ${Math.ceil(r/8)}>`):e.push(`${t}:array, ${Math.ceil(r/4)}>`);else{let i=r==null||r===1?n:`vec${r}<${n}>`;e.push(`${t}:${i}`)}return` + struct Uniforms { ${e.join(", ")} }; + @group(0) @binding(${this.variableIndex}) var uniforms: Uniforms;`}get additionalImplementations(){return this.uniformDeclaration()+this.variables.map(e=>e.impl()).join(` +`)+this.internalVariables.map(e=>e.impl()).join(` +`)}get variablesInfo(){if(this.uniforms.length===0)return;let e=t=>[12,10,1,6][["u32","f16","f32","i32"].indexOf(t)];return this.uniforms.map(t=>[e(t.type),t.length??1])}},DF=(e,t)=>new HM(e,t)}),GM,dz,qM,KM,XM,YM,jc,VF,HF,Wh=dr(()=>{ps(),ws(),la(),Ss(),GM=(e,t)=>{if(!e||e.length!==1)throw new Error("Transpose requires 1 input.");if(t.length!==0&&t.length!==e[0].dims.length)throw new Error(`perm size ${t.length} does not match input rank ${e[0].dims.length}`)},dz=(e,t)=>t.length!==0?t:[...new Array(e).keys()].reverse(),qM=(e,t)=>kn.sortBasedOnPerm(e,dz(e.length,t)),KM=(e,t,n,r)=>{let i=`fn perm(i: ${r.type.indices}) -> ${n.type.indices} { + var a: ${n.type.indices};`;for(let a=0;a{let n=[],r=[];for(let i=0;i{let n=0;for(let r=0;r{let n=e.dataType,r=e.dims.length,i=dz(r,t),a=qM(e.dims,i),o=e.dims,l=a,c=r<2||YM(i,e.dims),u;if(c)return u=b=>{let g=Wn("input",n,o,4),y=Vr("output",n,l,4);return` + ${b.registerUniform("output_size","u32").declareVariables(g,y)} + ${b.mainStart()} + ${b.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + output[global_idx] = input[global_idx]; + }`},{name:"TransposeCopy",shaderCache:{inputDependencies:["type"]},getRunData:()=>{let b=kn.size(a);return{outputs:[{dims:a,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(b/64/4)},programUniforms:[{type:12,data:Math.ceil(b/4)}]}},getShaderSource:u};let{newShape:d,newPerm:h}=XM(e.dims,i),p=kn.areEqual(h,[2,3,1]),f=kn.areEqual(h,[3,1,2]);if(d.length===2||p||f){o=p?[d[0],d[1]*d[2]]:f?[d[0]*d[1],d[2]]:d,l=[o[1],o[0]];let b=16;return u=g=>{let y=Wn("a",n,o.length),w=Vr("output",n,l.length);return` + ${g.registerUniform("output_size","u32").declareVariables(y,w)} + var tile : array, ${b}>; + ${g.mainStart([b,b,1])} + let stride = (uniforms.output_shape[1] - 1) / ${b} + 1; + let workgroup_id_x = workgroup_index % stride; + let workgroup_id_y = workgroup_index / stride; + let input_col = workgroup_id_y * ${b}u + local_id.x; + let input_row = workgroup_id_x * ${b}u + local_id.y; + if (input_row < uniforms.a_shape[0] && input_col < uniforms.a_shape[1]) { + tile[local_id.y][local_id.x] = ${y.getByIndices(`${y.type.indices}(input_row, input_col)`)}; + } + workgroupBarrier(); + + let output_col = workgroup_id_x * ${b}u + local_id.x; + let output_row = workgroup_id_y * ${b}u + local_id.y; + if (output_row < uniforms.output_shape[0] && output_col < uniforms.output_shape[1]) { + ${w.setByIndices(`${w.type.indices}(output_row, output_col)`,"tile[local_id.x][local_id.y]")} + } + }`},{name:"TransposeShared",shaderCache:{inputDependencies:["type"]},getRunData:()=>{let g=kn.size(a);return{outputs:[{dims:a,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(l[1]/b),y:Math.ceil(l[0]/b)},programUniforms:[{type:12,data:g},...Jr(o,l)]}},getShaderSource:u}}return u=b=>{let g=Wn("a",n,o.length),y=Vr("output",n,l.length);return` + ${b.registerUniform("output_size","u32").declareVariables(g,y)} + + ${KM(i,r,g,y)} + + ${b.mainStart()} + ${b.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let indices = ${y.offsetToIndices("global_idx")}; + let aIndices = perm(indices); + + ${y.setByOffset("global_idx",g.getByIndices("aIndices"))} + }`},{name:"Transpose",shaderCache:{hint:`${t}`,inputDependencies:["rank"]},getRunData:()=>{let b=kn.size(a);return{outputs:[{dims:a,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(b/64)},programUniforms:[{type:12,data:b},...Jr(o,l)]}},getShaderSource:u}},VF=(e,t)=>{GM(e.inputs,t.perm),e.compute(jc(e.inputs[0],t.perm))},HF=e=>fi({perm:e.perm})}),JM,ZM,QM,e8,t8,n8,r8,s8,i8,a8,ed,GF,qF,KF,XF,YF,JF,ZF,QF,eW,tW,rhe=dr(()=>{ps(),ws(),Ss(),_S(),Wh(),JM={max:"select(bestValue, candidate, candidate > bestValue)",min:"select(bestValue, candidate, candidate < bestValue)",mean:"bestValue + candidate",sum:"bestValue + candidate",prod:"bestValue * candidate",sumSquare:"bestValue + candidate * candidate",logSumExp:"bestValue + exp(candidate)",l1:"bestValue + abs(candidate)",l2:"bestValue + candidate * candidate",logSum:"bestValue + candidate"},ZM={max:"select(bestValue, candidate, candidate > bestValue)",min:"select(bestValue, candidate, candidate < bestValue)",mean:"bestValue + candidate",sum:"bestValue + candidate",prod:"bestValue * candidate",sumSquare:"bestValue + candidate",logSumExp:"bestValue + candidate",l1:"bestValue + candidate",l2:"bestValue + candidate",logSum:"bestValue + candidate"},QM={max:"_A[offset]",min:"_A[offset]",mean:"0",sum:"0",prod:"1",sumSquare:"0",logSumExp:"0",l1:"0",l2:"0",logSum:"0"},e8={max:"bestValue",min:"bestValue",sum:"bestValue",prod:"bestValue",sumSquare:"bestValue",logSumExp:"log(bestValue)",l1:"bestValue",l2:"sqrt(bestValue)",logSum:"log(bestValue)"},t8=(e,t)=>{let n=[];for(let r=t-e;r{let n=[],r=e.length;for(let a=0;ae[a]);return[n,i]},r8=(e,t)=>{let n=e.length+t.length,r=[],i=0;for(let a=0;a{for(let n=0;n{let n=[];if(!s8(e,t)){for(let r=0;rn.push(r))}return n},a8=(e,t,n,r,i,a,o)=>{let l=n[0].dims,c=kn.size(a),u=kn.size(o),d=Wn("_A",n[0].dataType,l),h=Vr("output",i,a),p=64;c===1&&(p=256);let f=` + var aBestValues : array; + `,b=g=>` + ${g.registerUniform("reduceSize","u32").declareVariables(d,h)} + ${f} + fn DIV_CEIL(a : u32, b : u32) -> u32 { + return ((a - 1u) / b + 1u); + } + ${g.mainStart(p)} + + let outputIndex = global_idx / ${p}; + let offset = outputIndex * uniforms.reduceSize; + + var bestValue = f32(${QM[r]}); + let Length = uniforms.reduceSize; + for (var k = local_idx; k < Length; k = k + ${p}) { + let candidate = f32(${d.getByOffset("offset + k")}); + bestValue = ${JM[r]}; + } + aBestValues[local_idx] = bestValue; + workgroupBarrier(); + + var reduceSize = min(Length, ${p}u); + for (var currentSize = reduceSize / 2u; reduceSize > 1u; + currentSize = reduceSize / 2u) { + let interval = DIV_CEIL(reduceSize, 2u); + if (local_idx < currentSize) { + let candidate = aBestValues[local_idx + interval]; + bestValue = ${ZM[r]}; + aBestValues[local_idx] = bestValue; + } + reduceSize = interval; + workgroupBarrier(); + } + + if (local_idx == 0u) { + ${h.setByOffset("outputIndex",`${r==="mean"?`${h.type.storage}(bestValue / f32(uniforms.reduceSize))`:`${h.type.storage}(${e8[r]})`}`)}; + } + }`;return{name:e,shaderCache:{hint:`${t};${p}`,inputDependencies:["type"]},getShaderSource:b,getRunData:()=>({outputs:[{dims:a,dataType:i}],dispatchGroup:{x:c},programUniforms:[{type:12,data:u}]})}},ed=(e,t,n,r)=>{let i=e.inputs.length===1?n:o5(e.inputs,n),a=i.axes;a.length===0&&!i.noopWithEmptyAxes&&(a=e.inputs[0].dims.map((f,b)=>b));let o=kn.normalizeAxes(a,e.inputs[0].dims.length),l=o,c=e.inputs[0],u=i8(l,e.inputs[0].dims.length);u.length>0&&(c=e.compute(jc(e.inputs[0],u),{inputs:[0],outputs:[-1]})[0],l=t8(l.length,c.dims.length));let[d,h]=n8(c.dims,l),p=d;i.keepDims&&(p=r8(d,o)),e.compute(a8(t,i.cacheKey,[c],r,e.inputs[0].dataType,p,h),{inputs:[c]})},GF=(e,t)=>{ed(e,"ReduceMeanShared",t,"mean")},qF=(e,t)=>{ed(e,"ReduceL1Shared",t,"l1")},KF=(e,t)=>{ed(e,"ReduceL2Shared",t,"l2")},XF=(e,t)=>{ed(e,"ReduceLogSumExpShared",t,"logSumExp")},YF=(e,t)=>{ed(e,"ReduceMaxShared",t,"max")},JF=(e,t)=>{ed(e,"ReduceMinShared",t,"min")},ZF=(e,t)=>{ed(e,"ReduceProdShared",t,"prod")},QF=(e,t)=>{ed(e,"ReduceSumShared",t,"sum")},eW=(e,t)=>{ed(e,"ReduceSumSquareShared",t,"sumSquare")},tW=(e,t)=>{ed(e,"ReduceLogSumShared",t,"logSum")}}),td,o8,bw,o5,nd,l8,c8,u8,d8,h8,p8,f8,m8,g8,x8,rd,nW,rW,sW,iW,aW,oW,lW,cW,uW,dW,_S=dr(()=>{ps(),ws(),la(),Ss(),rhe(),td=e=>{if(!e||e.length===0||e.length>2)throw new Error("Reduce op requires 1 or 2 inputs.");if(e.length===2&&e[1].dims.length!==1)throw new Error("Invalid axes input dims.")},o8=e=>["","",`var value = ${e.getByIndices("input_indices")};`,""],bw=(e,t,n,r,i,a,o=!1,l=!1)=>{let c=[],u=n[0].dims,d=u.length,h=kn.normalizeAxes(i,d),p=!l&&h.length===0;u.forEach((g,y)=>{p||h.indexOf(y)>=0?o&&c.push(1):c.push(g)});let f=c.length,b=kn.size(c);return{name:e,shaderCache:t,getShaderSource:g=>{let y=[],w=Wn("_A",n[0].dataType,d),v=Vr("output",a,f),m=r(w,v,h),z=m[2];for(let C=0,E=0;C=0?(o&&E++,z=`for(var j${C}: u32 = 0; j${C} < ${u[C]}; j${C}++) { + ${m[2].includes("last_index")?`let last_index = j${C};`:""} + ${w.indicesSet("input_indices",C,`j${C}`)} + ${z} + }`):(y.push(`${w.indicesSet("input_indices",C,v.indicesGet("output_indices",E))};`),E++);return` + + ${g.registerUniform("output_size","u32").declareVariables(w,v)} + + ${g.mainStart()} + ${g.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + var input_indices: ${w.type.indices}; + let output_indices = ${v.offsetToIndices("global_idx")}; + + ${y.join(` +`)} + ${m[0]} // init ops for reduce max/min + ${m[1]} + ${z} + ${m[3]} + ${m.length===4?v.setByOffset("global_idx","value"):m.slice(4).join(` +`)} + }`},getRunData:()=>({outputs:[{dims:c,dataType:a}],dispatchGroup:{x:Math.ceil(b/64)},programUniforms:[{type:12,data:b},...Jr(u,c)]})}},o5=(e,t)=>{let n=[];return e[1].dims[0]>0&&e[1].getBigInt64Array().forEach(r=>n.push(Number(r))),fi({axes:n,keepDims:t.keepDims,noopWithEmptyAxes:t.noopWithEmptyAxes})},nd=(e,t,n,r)=>{let i=e.inputs,a=i.length===1?n:o5(i,n);e.compute(bw(t,{hint:a.cacheKey,inputDependencies:["rank"]},[i[0]],a.noopWithEmptyAxes&&a.axes.length===0?o8:r,a.axes,i[0].dataType,a.keepDims,a.noopWithEmptyAxes),{inputs:[0]})},l8=(e,t)=>{td(e.inputs),nd(e,"ReduceLogSum",t,(n,r)=>[`var value = ${r.type.storage}(0);`,"",`value += ${n.getByIndices("input_indices")};`,"value = log(value);"])},c8=(e,t)=>{td(e.inputs),nd(e,"ReduceL1",t,(n,r)=>[`var value = ${r.type.storage}(0);`,"",`value += abs(${n.getByIndices("input_indices")});`,""])},u8=(e,t)=>{td(e.inputs),nd(e,"ReduceL2",t,(n,r)=>[`var t = ${r.type.value}(0); var value = ${r.type.value}(0);`,"",`t = ${n.getByIndices("input_indices")}; value += (t * t);`,"value = sqrt(value);"])},d8=(e,t)=>{td(e.inputs),nd(e,"ReduceLogSumExp",t,(n,r)=>[`var value = ${r.type.storage}(0);`,"",`value += exp(${n.getByIndices("input_indices")});`,"value = log(value);"])},h8=(e,t)=>{td(e.inputs),nd(e,"ReduceMax",t,(n,r,i)=>{let a=[];for(let o=0;o=0||i.length===0)&&a.push(n.indicesSet("input_indices",o,0));return[`${a.join(` +`)}`,`var value = ${n.getByIndices("input_indices")};`,`value = max(value, ${n.getByIndices("input_indices")});`,""]})},p8=(e,t)=>{td(e.inputs),nd(e,"ReduceMean",t,(n,r,i)=>{let a=1;for(let o=0;o=0||i.length===0)&&(a*=e.inputs[0].dims[o]);return["var sum = f32(0);","",`sum += f32(${n.getByIndices("input_indices")});`,`let value = ${r.type.value}(sum / ${a});`]})},f8=(e,t)=>{td(e.inputs),nd(e,"ReduceMin",t,(n,r,i)=>{let a=[];for(let o=0;o=0||i.length===0)&&a.push(`input_indices[${o}] = 0;`);return[`${a.join(` +`)}`,`var value = ${n.getByIndices("input_indices")};`,`value = min(value, ${n.getByIndices("input_indices")});`,""]})},m8=(e,t)=>{td(e.inputs),nd(e,"ReduceProd",t,(n,r)=>[`var value = ${r.type.storage}(1);`,"",`value *= ${n.getByIndices("input_indices")};`,""])},g8=(e,t)=>{td(e.inputs),nd(e,"ReduceSum",t,(n,r)=>[`var value = ${r.type.storage}(0);`,"",`value += ${n.getByIndices("input_indices")};`,""])},x8=(e,t)=>{td(e.inputs),nd(e,"ReduceSumSquare",t,(n,r)=>[`var t = ${r.type.value}(0); var value = ${r.type.value}(0);`,"",`t = ${n.getByIndices("input_indices")}; value += t * t;`,""])},rd=(e,t,n)=>{if(t.length===0)return n;let r=1,i=1;for(let a=0;a1024},nW=(e,t)=>{rd(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?p8(e,t):GF(e,t)},rW=(e,t)=>{rd(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?c8(e,t):qF(e,t)},sW=(e,t)=>{rd(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?u8(e,t):KF(e,t)},iW=(e,t)=>{rd(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?d8(e,t):XF(e,t)},aW=(e,t)=>{rd(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?h8(e,t):YF(e,t)},oW=(e,t)=>{rd(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?f8(e,t):JF(e,t)},lW=(e,t)=>{rd(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?m8(e,t):ZF(e,t)},cW=(e,t)=>{rd(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?g8(e,t):QF(e,t)},uW=(e,t)=>{rd(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?x8(e,t):eW(e,t)},dW=(e,t)=>{rd(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?l8(e,t):tW(e,t)}}),hz,hW,pW,l5,she=dr(()=>{ps(),la(),_S(),hz=e=>{if(!e||e.length===0||e.length>2)throw new Error("ArgMinMaxOp op requires 1 or 2 inputs.");if(e[0].dataType!==1)throw new Error("Invalid input type.")},hW=(e,t)=>{hz(e.inputs);let n=(r,i,a)=>{let o=[];for(let l=0;l=0||a.length===0)&&o.push(`input_indices[${l}] = 0;`);return[`${o.join(` +`)}`,`var value = ${r.getByIndices("input_indices")}; +var best_index : i32 = 0;`,`if (${r.getByIndices("input_indices")} ${t.selectLastIndex>0?"<=":"<"} value) { + value = ${r.getByIndices("input_indices")}; + best_index = i32(last_index); + }`,"",i.setByOffset("global_idx","best_index")]};e.compute(bw("ArgMin",{hint:t.cacheKey,inputDependencies:["rank"]},[e.inputs[0]],n,[t.axis],7,t.keepDims),{inputs:[0]})},pW=(e,t)=>{hz(e.inputs);let n=(r,i,a)=>{let o=[];for(let l=0;l=0||a.length===0)&&o.push(`input_indices[${l}] = 0;`);return[`${o.join(` +`)}`,`var value = ${r.getByIndices("input_indices")}; +var best_index : i32 = 0;`,`if (${r.getByIndices("input_indices")} ${t.selectLastIndex>0?">=":">"} value) { + value = ${r.getByIndices("input_indices")}; + best_index = i32(last_index); + }`,"",i.setByOffset("global_idx","best_index")]};e.compute(bw("argMax",{hint:t.cacheKey,inputDependencies:["rank"]},[e.inputs[0]],n,[t.axis],7,t.keepDims),{inputs:[0]})},l5=e=>fi(e)}),b8,hy,y8,v8,w8,fb,_8,fW,zS=dr(()=>{ps(),ws(),vS(),Ss(),b8=(e,t)=>{let n=e[0],r=e[1],i=e[2],a=e[3],o=e[4],l=e[5];if(o&&l)throw new Error("Attention cannot have both past and attention_bias");if(n.dims.length!==3)throw new Error('Input "input" must have 3 dimensions');let c=n.dims[0],u=n.dims[1],d=n.dims[2];if(i.dims.length!==1)throw new Error('Input "bias" is expected to have 1 dimensions');if(r.dims.length!==2)throw new Error('Input "weights" is expected to have 2 dimensions');if(r.dims[0]!==d)throw new Error("Input 1 dimension 0 should have same length as dimension 2 of input 0");if(i.dims[0]!==r.dims[1])throw new Error('Input "bias" dimension 0 should have same length as dimension 1 of input "weights"');let h=i.dims[0]/3,p=h,f=p;if(t.qkvHiddenSizes.length>0){if(t.qkvHiddenSizes.length!==3)throw new Error("qkv_hidden_sizes attribute should have 3 elements");for(let m of t.qkvHiddenSizes)if(m%t.numHeads!==0)throw new Error("qkv_hidden_sizes should be divisible by num_heads");h=t.qkvHiddenSizes[0],p=t.qkvHiddenSizes[1],f=t.qkvHiddenSizes[2]}let b=u;if(h!==p)throw new Error("qkv_hidden_sizes first element should be same as the second");if(i.dims[0]!==h+p+f)throw new Error('Input "bias" dimension 0 should have same length as sum of Q/K/V hidden sizes');let g=0;if(o){if(p!==f)throw new Error('Input "past" expect k_hidden_size == v_hidden_size');if(o.dims.length!==5)throw new Error('Input "past" must have 5 dimensions');if(o.dims[0]!==2)throw new Error('Input "past" first dimension must be 2');if(o.dims[1]!==c)throw new Error('Input "past" second dimension must be batch_size');if(o.dims[2]!==t.numHeads)throw new Error('Input "past" third dimension must be num_heads');if(o.dims[4]!==p/t.numHeads)throw new Error('Input "past" fifth dimension must be k_hidden_size / num_heads');t.pastPresentShareBuffer||(g=o.dims[3])}let y=b+g,w=-1,v=0;if(a)throw new Error("Mask not supported");if(o)throw new Error("past is not supported");if(l){if(l.dims.length!==4)throw new Error('Input "attention_bias" must have 4 dimensions');if(l.dims[0]!==c||l.dims[1]!==t.numHeads||l.dims[2]!==u||l.dims[3]!==y)throw new Error('Expect "attention_bias" shape (batch_size, num_heads, sequence_length, total_sequence_length)')}return{batchSize:c,sequenceLength:u,pastSequenceLength:g,kvSequenceLength:b,totalSequenceLength:y,maxSequenceLength:w,inputHiddenSize:d,hiddenSize:h,vHiddenSize:f,headSize:Math.floor(h/t.numHeads),vHeadSize:Math.floor(f/t.numHeads),numHeads:t.numHeads,isUnidirectional:!1,pastPresentShareBuffer:!1,maskFilterValue:t.maskFilterValue,maskType:v,scale:t.scale,broadcastResPosBias:!1,passPastInKv:!1,qkvFormat:1}},hy=(e,t,n)=>t&&e?` + let total_sequence_length_input = u32(${t.getByOffset("0")}); + let present_sequence_length = max(total_sequence_length_input, uniforms.past_sequence_length); + let is_subsequent_prompt: bool = sequence_length > 1 && sequence_length != total_sequence_length_input; + let is_first_prompt: bool = is_subsequent_prompt == false && sequence_length == total_sequence_length_input; + total_sequence_length = u32(${e==null?void 0:e.getByOffset("batchIdx")}) + 1; + var past_sequence_length: u32 = 0; + if (is_first_prompt == false) { + past_sequence_length = total_sequence_length - sequence_length; + } + `:` + ${n?"let past_sequence_length = uniforms.past_sequence_length":""}; + let present_sequence_length = total_sequence_length; + `,y8=(e,t,n,r,i,a,o,l)=>{let c=Ji(o?1:a),u=64,d=a/c;d{let v=Vr("x",e.dataType,e.dims,c),m=[v],z=o?Wn("seq_lens",o.dataType,o.dims):void 0;z&&m.push(z);let C=l?Wn("total_sequence_length_input",l.dataType,l.dims):void 0;C&&m.push(C);let E=Uo(e.dataType),I=[{name:"batch_size",type:"u32"},{name:"num_heads",type:"u32"},{name:"past_sequence_length",type:"u32"},{name:"sequence_length",type:"u32"},{name:"total_sequence_length",type:"u32"},{name:"elements_per_thread",type:"u32"}];return` + var thread_max: array; + var thread_sum: array; + ${w.registerUniforms(I).declareVariables(...m)} + ${w.mainStart([u,1,1])} + let batchIdx = workgroup_id.z / uniforms.num_heads; + let headIdx = workgroup_id.z % uniforms.num_heads; + let sequence_length = uniforms.sequence_length; + var total_sequence_length = uniforms.total_sequence_length; + ${hy(z,C,!1)} + let local_offset = local_idx * uniforms.elements_per_thread; + let offset = (global_idx / ${u}) * uniforms.total_sequence_length + local_offset; + let seq_causal_length = ${o?"u32(past_sequence_length + workgroup_id.y + 1)":"total_sequence_length"}; + var thread_max_vector = ${b}(-3.402823e+38f); + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + thread_max_vector = max(${b}(x[offset + i]), thread_max_vector); + } + thread_max[local_idx] = ${(()=>{switch(c){case 1:return"thread_max_vector";case 2:return"max(thread_max_vector.x, thread_max_vector.y)";case 4:return"max(max(thread_max_vector.x, thread_max_vector.y), max(thread_max_vector.z, thread_max_vector.w))";default:throw new Error(`Unsupported components: ${c}`)}})()}; + workgroupBarrier(); + + var max_value = f32(-3.402823e+38f); + for (var i = 0u; i < ${u}; i++) { + max_value = max(thread_max[i], max_value); + } + + var sum_vector = ${b}(0); + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + sum_vector += exp(${b}(x[offset + i]) - max_value); + } + thread_sum[local_idx] = ${(()=>{switch(c){case 1:return"sum_vector";case 2:return"sum_vector.x + sum_vector.y";case 4:return"sum_vector.x + sum_vector.y + sum_vector.z + sum_vector.w";default:throw new Error(`Unsupported components: ${c}`)}})()}; + workgroupBarrier(); + + var sum: f32 = 0; + for (var i = 0u; i < ${u}; i++) { + sum += thread_sum[i]; + } + + if (sum == 0) { + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + x[offset + i] = ${v.type.value}(${E}(1.0) / ${E}(seq_causal_length)); + } + } else { + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + var f32input = ${b}(x[offset + i]); + x[offset + i] = ${v.type.value}(exp(f32input - max_value) / sum); + } + } + ${o?` + for (var total_seq_id: u32 = seq_causal_length; total_seq_id + local_offset < uniforms.total_sequence_length; total_seq_id++) { + x[offset + total_seq_id] = ${v.type.value}(${E}(0)); + }`:""}; + }`};return{name:"AttentionProbsSoftmax",shaderCache:{hint:`${u};${f};${c}`,inputDependencies:g},getShaderSource:y,getRunData:()=>({outputs:[],dispatchGroup:{x:Math.ceil(a/u),y:i,z:t*n},programUniforms:p})}},v8=(e,t,n,r,i,a,o,l,c)=>{let u=o+a.kvSequenceLength,d=[a.batchSize,a.numHeads,a.sequenceLength,u],h=e>1&&r,p=a.kvNumHeads?a.kvNumHeads:a.numHeads,f=h?[a.batchSize,p,u,a.headSize]:void 0,b=a.nReps?a.nReps:1,g=a.scale===0?1/Math.sqrt(a.headSize):a.scale,y=Ji(a.headSize),w=a.headSize/y,v=12,m={x:Math.ceil(u/v),y:Math.ceil(a.sequenceLength/v),z:a.batchSize*a.numHeads},z=[{type:12,data:a.sequenceLength},{type:12,data:w},{type:12,data:u},{type:12,data:a.numHeads},{type:12,data:a.headSize},{type:1,data:g},{type:12,data:o},{type:12,data:a.kvSequenceLength},{type:12,data:b}],C=h&&r&&kn.size(r.dims)>0,E=["type","type"];C&&E.push("type"),i&&E.push("type"),l&&E.push("type"),c&&E.push("type");let I=[{dims:d,dataType:t.dataType,gpuDataType:0}];h&&I.push({dims:f,dataType:t.dataType,gpuDataType:0});let R=A=>{let O=Wn("q",t.dataType,t.dims,y),F=Wn("key",n.dataType,n.dims,y),L=[O,F];if(C){let B=Wn("past_key",r.dataType,r.dims,y);L.push(B)}i&&L.push(Wn("attention_bias",i.dataType,i.dims));let X=l?Wn("seq_lens",l.dataType,l.dims):void 0;X&&L.push(X);let T=c?Wn("total_sequence_length_input",c.dataType,c.dims):void 0;T&&L.push(T);let q=Vr("output",t.dataType,d),H=[q];h&&H.push(Vr("present_key",t.dataType,f,y));let J=Uo(1,y),Z=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"alpha",type:"f32"},{name:"past_sequence_length",type:"u32"},{name:"kv_sequence_length",type:"u32"},{name:"n_reps",type:"u32"}];return` + const TILE_SIZE = ${v}u; + + var tileQ: array<${O.type.storage}, ${v*v}>; + var tileK: array<${O.type.storage}, ${v*v}>; + ${A.registerUniforms(Z).declareVariables(...L,...H)} + ${A.mainStart([v,v,1])} + // x holds the N and y holds the M + let headIdx = workgroup_id.z % uniforms.num_heads; + let kvHeadIdx = ${b===1?"headIdx":"headIdx / uniforms.n_reps"}; + let kv_num_heads = ${b===1?"uniforms.num_heads":"uniforms.num_heads / uniforms.n_reps"}; + let batchIdx = workgroup_id.z / uniforms.num_heads; + let m = workgroup_id.y * TILE_SIZE; + let n = workgroup_id.x * TILE_SIZE; + let sequence_length = uniforms.M; + var total_sequence_length = uniforms.N; + ${hy(X,T,!0)} + let absKvHeadIdx = batchIdx * kv_num_heads + kvHeadIdx; + let qOffset = workgroup_id.z * uniforms.M * uniforms.K + m * uniforms.K; + ${C&&h?"let pastKeyOffset = absKvHeadIdx * uniforms.past_sequence_length * uniforms.K;":""}; + let kOffset = absKvHeadIdx * uniforms.kv_sequence_length * uniforms.K; + ${h?"let presentKeyOffset = absKvHeadIdx * uniforms.N * uniforms.K;":""} + var value = ${J}(0); + for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { + if (global_id.y < uniforms.M && w + local_id.x < uniforms.K) { + tileQ[TILE_SIZE * local_id.y + local_id.x] = q[qOffset + local_id.y * uniforms.K + w + local_id.x]; + } + if (n + local_id.y < uniforms.N && w + local_id.x < uniforms.K) { + var idx = TILE_SIZE * local_id.y + local_id.x; + ${C&&h?` + if (n + local_id.y < past_sequence_length) { + tileK[idx] = past_key[pastKeyOffset + (n + local_id.y) * uniforms.K + w + local_id.x]; + } else if (n + local_id.y - past_sequence_length < uniforms.kv_sequence_length) { + tileK[idx] = key[kOffset + (n + local_id.y - past_sequence_length) * uniforms.K + w + local_id.x]; + }`:` + if (n + local_id.y < uniforms.kv_sequence_length) { + tileK[idx] = key[kOffset + (n + local_id.y) * uniforms.K + w + local_id.x]; + }`} + ${h?`if (n + local_id.y < present_sequence_length) { + present_key[presentKeyOffset + (n + local_id.y) * uniforms.K + w + local_id.x] = tileK[idx]; + }`:""} + } + workgroupBarrier(); + + for (var k: u32 = 0u; k < TILE_SIZE && w+k < uniforms.K; k++) { + value += ${J}(tileQ[TILE_SIZE * local_id.y + k] * tileK[TILE_SIZE * local_id.x + k]); + } + + workgroupBarrier(); + } + + if (global_id.y < uniforms.M && global_id.x < total_sequence_length) { + let headOffset = workgroup_id.z * uniforms.M * uniforms.N; + let outputIdx = headOffset + global_id.y * uniforms.N + global_id.x; + var sum: f32 = ${(()=>{switch(y){case 1:return"value";case 2:return"value.x + value.y";case 4:return"value.x + value.y + value.z + value.w";default:throw new Error(`Unsupported components: ${y}`)}})()}; + output[outputIdx] = ${q.type.value} (sum * uniforms.alpha) + ${i?"attention_bias[outputIdx]":"0.0"}; + } + }`};return{name:"AttentionProbs",shaderCache:{hint:`${y};${i!==void 0};${r!==void 0};${e}`,inputDependencies:E},getRunData:()=>({outputs:I,dispatchGroup:m,programUniforms:z}),getShaderSource:R}},w8=(e,t,n,r,i,a,o=void 0,l=void 0)=>{let c=a+i.kvSequenceLength,u=i.nReps?i.nReps:1,d=i.vHiddenSize*u,h=e>1&&r,p=i.kvNumHeads?i.kvNumHeads:i.numHeads,f=h?[i.batchSize,p,c,i.headSize]:void 0,b=[i.batchSize,i.sequenceLength,d],g=12,y={x:Math.ceil(i.vHeadSize/g),y:Math.ceil(i.sequenceLength/g),z:i.batchSize*i.numHeads},w=[{type:12,data:i.sequenceLength},{type:12,data:c},{type:12,data:i.vHeadSize},{type:12,data:i.numHeads},{type:12,data:i.headSize},{type:12,data:d},{type:12,data:a},{type:12,data:i.kvSequenceLength},{type:12,data:u}],v=h&&r&&kn.size(r.dims)>0,m=["type","type"];v&&m.push("type"),o&&m.push("type"),l&&m.push("type");let z=[{dims:b,dataType:t.dataType,gpuDataType:0}];h&&z.push({dims:f,dataType:t.dataType,gpuDataType:0});let C=E=>{let I=Wn("probs",t.dataType,t.dims),R=Wn("v",n.dataType,n.dims),A=[I,R];v&&A.push(Wn("past_value",r.dataType,r.dims));let O=o?Wn("seq_lens",o.dataType,o.dims):void 0;o&&A.push(O);let F=l?Wn("total_sequence_length_input",l.dataType,l.dims):void 0;l&&A.push(F);let L=[Vr("output",t.dataType,b)];h&&L.push(Vr("present_value",t.dataType,f));let X=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"v_hidden_size",type:"u32"},{name:"past_sequence_length",type:"u32"},{name:"kv_sequence_length",type:"u32"},{name:"n_reps",type:"u32"}];return` + const TILE_SIZE = ${g}u; + var tileQ: array<${I.type.value}, ${g*g}>; + var tileV: array<${I.type.value}, ${g*g}>; + ${E.registerUniforms(X).declareVariables(...A,...L)} + ${E.mainStart([g,g,1])} + let headIdx = workgroup_id.z % uniforms.num_heads; + let batchIdx = workgroup_id.z / uniforms.num_heads; + let kvHeadIdx = ${u===1?"headIdx":"headIdx / uniforms.n_reps"}; + let kv_num_heads = ${u===1?"uniforms.num_heads":"uniforms.num_heads / uniforms.n_reps"}; + let m = global_id.y; + let n = global_id.x; + let sequence_length = uniforms.M; + var total_sequence_length = uniforms.K; + ${hy(O,F,!0)} + let offsetA = workgroup_id.z * uniforms.M * uniforms.K + m * uniforms.K; + let absKvHeadIdx = batchIdx * kv_num_heads + kvHeadIdx; // kvHeadIdx is relative to the batch + ${v&&h?"let pastValueOffset = absKvHeadIdx * uniforms.N * uniforms.past_sequence_length + n;":""}; + let vOffset = absKvHeadIdx * uniforms.N * uniforms.kv_sequence_length + n; + ${h?"let presentValueOffset = absKvHeadIdx * uniforms.N * uniforms.K + n;":""} + var value = ${I.type.storage}(0); + for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { + if (m < uniforms.M && w + local_id.x < uniforms.K) { + tileQ[TILE_SIZE * local_id.y + local_id.x] = probs[offsetA + w + local_id.x]; + } + if (n < uniforms.N && w + local_id.y < uniforms.K) { + var idx = TILE_SIZE * local_id.y + local_id.x; + ${v&&h?` + if (w + local_id.y < past_sequence_length) { + tileV[idx] = past_value[pastValueOffset + (w + local_id.y) * uniforms.N]; + } else if (w + local_id.y - past_sequence_length < uniforms.kv_sequence_length) { + tileV[idx] = v[vOffset + (w + local_id.y - past_sequence_length) * uniforms.N]; + } + `:` + if (w + local_id.y < uniforms.kv_sequence_length) { + tileV[idx] = v[vOffset + (w + local_id.y) * uniforms.N]; + }`} + ${h?` + if (w + local_id.y < present_sequence_length) { + present_value[presentValueOffset + (w + local_id.y) * uniforms.N] = tileV[idx]; + }`:""} + } + workgroupBarrier(); + for (var k: u32 = 0u; k < TILE_SIZE && w+k < total_sequence_length; k++) { + value += tileQ[TILE_SIZE * local_id.y + k] * tileV[TILE_SIZE * k + local_id.x]; + } + workgroupBarrier(); + } + + // we need to transpose output from BNSH_v to BSND_v + if (m < uniforms.M && n < uniforms.N) { + let outputIdx = batchIdx * uniforms.M * uniforms.v_hidden_size + m * uniforms.v_hidden_size + + headIdx * uniforms.N + n; + output[outputIdx] = value; + } + }`};return{name:"AttentionScore",shaderCache:{hint:`${r!==void 0};${e}`,inputDependencies:m},getRunData:()=>({outputs:z,dispatchGroup:y,programUniforms:w}),getShaderSource:C}},fb=(e,t,n,r,i,a,o,l,c,u,d=void 0,h=void 0)=>{let p=Math.min(e.outputCount,1+(o?1:0)+(l?1:0)),f=p>1?u.pastSequenceLength:0,b=f+u.kvSequenceLength,g=c&&kn.size(c.dims)>0?c:void 0,y=[t,n];p>1&&o&&kn.size(o.dims)>0&&y.push(o),g&&y.push(g),d&&y.push(d),h&&y.push(h);let w=e.compute(v8(p,t,n,o,g,u,f,d,h),{inputs:y,outputs:p>1?[-1,1]:[-1]})[0];e.compute(y8(w,u.batchSize,u.numHeads,f,u.sequenceLength,b,d,h),{inputs:d&&h?[w,d,h]:[w],outputs:[]});let v=[w,r];p>1&&l&&kn.size(l.dims)>0&&v.push(l),d&&v.push(d),h&&v.push(h),e.compute(w8(p,w,r,l,u,f,d,h),{inputs:v,outputs:p>1?[0,2]:[0]})},_8=(e,t)=>{let n=[t.batchSize,t.numHeads,t.sequenceLength,t.headSize],r=t.sequenceLength,i=t.inputHiddenSize,a=t.headSize,o=12,l={x:Math.ceil(t.headSize/o),y:Math.ceil(t.sequenceLength/o),z:t.batchSize*t.numHeads},c=[e.inputs[0],e.inputs[1],e.inputs[2]],u=[{type:12,data:r},{type:12,data:i},{type:12,data:a},{type:12,data:t.numHeads},{type:12,data:t.headSize},{type:12,data:t.hiddenSize},{type:12,data:t.hiddenSize+t.hiddenSize+t.vHiddenSize}],d=h=>{let p=Vr("output_q",c[0].dataType,n),f=Vr("output_k",c[0].dataType,n),b=Vr("output_v",c[0].dataType,n),g=Wn("input",c[0].dataType,c[0].dims),y=Wn("weight",c[1].dataType,c[1].dims),w=Wn("bias",c[2].dataType,c[2].dims),v=g.type.storage,m=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"hidden_size",type:"u32"},{name:"ldb",type:"u32"}];return` + const TILE_SIZE = ${o}u; + var tileInput: array<${v}, ${o*o}>; + var tileWeightQ: array<${v}, ${o*o}>; + var tileWeightK: array<${v}, ${o*o}>; + var tileWeightV: array<${v}, ${o*o}>; + ${h.registerUniforms(m).declareVariables(g,y,w,p,f,b)} + ${h.mainStart([o,o,1])} + let batchIndex = workgroup_id.z / uniforms.num_heads; + let headNumber = workgroup_id.z % uniforms.num_heads; + let m = global_id.y; + let n = global_id.x; + + let inputOffset = batchIndex * (uniforms.M * uniforms.K) + m * uniforms.K; + let biasOffsetQ = headNumber * uniforms.head_size; + let biasOffsetK = uniforms.hidden_size + biasOffsetQ; + let biasOffsetV = uniforms.hidden_size + biasOffsetK; + + var valueQ = ${v}(0); + var valueK = ${v}(0); + var valueV = ${v}(0); + for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { + if (m < uniforms.M && w + local_id.x < uniforms.K) { + tileInput[TILE_SIZE * local_id.y + local_id.x] = input[inputOffset + w + local_id.x]; + } + if (n < uniforms.N && w + local_id.y < uniforms.K) { + let offset = n + (w + local_id.y) * uniforms.ldb; + tileWeightQ[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetQ + offset]; + tileWeightK[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetK + offset]; + tileWeightV[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetV + offset]; + } + workgroupBarrier(); + for (var k: u32 = 0u; k({outputs:[{dims:n,dataType:e.inputs[0].dataType,gpuDataType:0},{dims:n,dataType:e.inputs[0].dataType,gpuDataType:0},{dims:n,dataType:e.inputs[0].dataType,gpuDataType:0}],dispatchGroup:l,programUniforms:u}),getShaderSource:d},{inputs:c,outputs:[-1,-1,-1]})},fW=(e,t)=>{let n=b8(e.inputs,t),[r,i,a]=_8(e,n);return fb(e,r,i,a,e.inputs[4],void 0,void 0,void 0,e.inputs[5],n)}}),z8,$8,S8,mW,ihe=dr(()=>{bd(),ps(),ws(),la(),Ss(),z8=(e,t)=>{if(!e||e.length!==5)throw new Error("BatchNormalization requires 5 inputs");let n=(r,i,a)=>{let o=i.length;if(o!==r.length)throw new Error(`${a}: num dimensions != ${o}`);i.forEach((l,c)=>{if(l!==r[c])throw new Error(`${a}: dim[${c}] do not match`)})};if(e[0].dims.length>1){let r=t.format==="NHWC"?t.spatial?e[0].dims.slice(-1):e[0].dims.slice(-1).concat(e[0].dims.slice(1,e[0].dims.length-1)):e[0].dims.slice(1,t.spatial?2:void 0);n(e[1].dims,r,"Invalid input scale"),n(e[2].dims,r,"Invalid input B"),n(e[3].dims,r,"Invalid input mean"),n(e[4].dims,r,"Invalid input var")}else n(e[1].dims,[1],"Invalid input scale"),n(e[2].dims,[1],"Invalid input B"),n(e[3].dims,[1],"Invalid input mean"),n(e[4].dims,[1],"Invalid input var")},$8=(e,t)=>{let{epsilon:n,spatial:r,format:i}=t,a=e[0].dims,o=r?Ji(a[a.length-1]):1,l=i==="NHWC"&&a.length>1?o:1,c=kn.size(a)/o,u=r,d=u?a.length:a,h=Wn("x",e[0].dataType,e[0].dims,o),p=Wn("scale",e[1].dataType,e[1].dims,l),f=Wn("bias",e[2].dataType,e[2].dims,l),b=Wn("inputMean",e[3].dataType,e[3].dims,l),g=Wn("inputVar",e[4].dataType,e[4].dims,l),y=Vr("y",e[0].dataType,d,o),w=()=>{let m="";if(r)m=`let cOffset = ${a.length===1?"0u":i==="NHWC"?`outputIndices[${a.length-1}] / ${o}`:"outputIndices[1]"};`;else if(i==="NCHW")m=` + ${y.indicesSet("outputIndices","0","0")} + let cOffset = ${y.indicesToOffset("outputIndices")};`;else{m=`var cIndices = ${p.type.indices}(0); + cIndices[0] = outputIndices[${a.length-1}];`;for(let z=1;z` + const epsilon = ${n}; + ${m.registerUniform("outputSize","u32").declareVariables(h,p,f,b,g,y)} + ${m.mainStart()} + ${m.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + var outputIndices = ${y.offsetToIndices(`global_idx * ${o}`)}; + ${w()} + let scale = ${p.getByOffset("cOffset")}; + let bias = ${f.getByOffset("cOffset")}; + let inputMean = ${b.getByOffset("cOffset")}; + let inputVar = ${g.getByOffset("cOffset")}; + let x = ${h.getByOffset("global_idx")}; + let value = (x - inputMean) * inverseSqrt(inputVar + epsilon) * scale + bias; + ${y.setByOffset("global_idx","value")} + }`;return{name:"BatchNormalization",shaderCache:{hint:`${t.epsilon}_${t.format}_${r}_${o}`,inputDependencies:u?["rank","type","type","type","type"]:void 0},getShaderSource:v,getRunData:()=>({outputs:[{dims:e[0].dims,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(c/64)},programUniforms:u?[{type:12,data:c},...Jr(a)]:[{type:12,data:c}]})}},S8=e=>fi(e),mW=(e,t)=>{let{inputs:n,outputCount:r}=e,i=S8({...t,outputCount:r});if(Fi.webgpu.validateInputContent&&z8(n,i),t.trainingMode)throw new Error("BatchNormalization trainingMode is not supported yet.");e.compute($8(n,i))}}),j8,C8,gW,ahe=dr(()=>{ws(),Ss(),j8=e=>{if(e[0].dims.length!==3)throw new Error("input should have 3 dimensions");if(![320,640,1280].includes(e[0].dims[2]))throw new Error("number of channels should be 320, 640 or 1280");if(e[1].dims.length!==1)throw new Error("bias is expected to have 1 dimensions");if(e[0].dims[2]!==e[1].dims[0])throw new Error("last dimension of input and bias are not the same")},C8=e=>{let t=e[0].dims,n=e[0].dims[2],r=kn.size(t)/4,i=e[0].dataType,a=Wn("input",i,t,4),o=Wn("bias",i,[n],4),l=Wn("residual",i,t,4),c=Vr("output",i,t,4);return{name:"BiasAdd",getRunData:()=>({outputs:[{dims:t,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(r/64)}}),getShaderSource:u=>` + const channels = ${n}u / 4; + ${u.declareVariables(a,o,l,c)} + + ${u.mainStart()} + ${u.guardAgainstOutOfBoundsWorkgroupSizes(r)} + let value = ${a.getByOffset("global_idx")} + + ${o.getByOffset("global_idx % channels")} + ${l.getByOffset("global_idx")}; + ${c.setByOffset("global_idx","value")} + }`}},gW=e=>{j8(e.inputs),e.compute(C8(e.inputs))}}),N8,Xs,xW,bW,yW,vW,wW,_W,zW,$W,SW,E8,jW,CW,NW,EW,hx,IW,zv,kW,AW,MW,TW,RW,PW,OW,LW,BW,UW,FW,WW,DW,VW,HW,GW,pz,qW,c5,u5,KW,XW,YW,I8,k8,JW,$S=dr(()=>{ps(),ws(),la(),Ss(),N8=(e,t,n,r,i,a,o)=>{let l=Math.ceil(t/4),c="";typeof i=="string"?c=`${i}(a)`:c=i("a");let u=Wn("inputData",n,[l],4),d=Vr("outputData",r,[l],4),h=[{name:"vec_size",type:"u32"}];return o&&h.push(...o),` + ${e.registerUniforms(h).declareVariables(u,d)} + + ${a??""} + + ${e.mainStart()} + ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + + let a = ${u.getByOffset("global_idx")}; + ${d.setByOffset("global_idx",c)} + }`},Xs=(e,t,n,r,i,a=e.dataType,o,l)=>{let c=[{type:12,data:Math.ceil(kn.size(e.dims)/4)}];return o&&c.push(...o),{name:t,shaderCache:{hint:i,inputDependencies:["type"]},getShaderSource:u=>N8(u,kn.size(e.dims),e.dataType,a,n,r,l),getRunData:u=>({outputs:[{dims:e.dims,dataType:a}],dispatchGroup:{x:Math.ceil(kn.size(u[0].dims)/64/4)},programUniforms:c})}},xW=e=>{e.compute(Xs(e.inputs[0],"Abs","abs"))},bW=e=>{e.compute(Xs(e.inputs[0],"Acos","acos"))},yW=e=>{e.compute(Xs(e.inputs[0],"Acosh","acosh"))},vW=e=>{e.compute(Xs(e.inputs[0],"Asin","asin"))},wW=e=>{e.compute(Xs(e.inputs[0],"Asinh","asinh"))},_W=e=>{e.compute(Xs(e.inputs[0],"Atan","atan"))},zW=e=>{e.compute(Xs(e.inputs[0],"Atanh","atanh"))},$W=e=>fi(e),SW=(e,t)=>{let n;switch(t.to){case 10:n="vec4";break;case 1:n="vec4";break;case 12:n="vec4";break;case 6:n="vec4";break;case 9:n="vec4";break;default:throw new RangeError(`not supported type (specified in attribute 'to' from 'Cast' operator): ${t.to}`)}e.compute(Xs(e.inputs[0],"Cast",n,void 0,t.cacheKey,t.to))},E8=e=>{let t,n,r=e.length>=2&&e[1].data!==0,i=e.length>=3&&e[2].data!==0;switch(e[0].dataType){case 1:t=r?e[1].getFloat32Array()[0]:-34028234663852886e22,n=i?e[2].getFloat32Array()[0]:34028234663852886e22;break;case 10:t=r?e[1].getUint16Array()[0]:64511,n=i?e[2].getUint16Array()[0]:31743;break;default:throw new Error("Unsupport data type")}return fi({min:t,max:n})},jW=(e,t)=>{let n=t||E8(e.inputs),r=Uo(e.inputs[0].dataType);e.compute(Xs(e.inputs[0],"Clip",i=>`clamp(${i}, vec4<${r}>(uniforms.min), vec4<${r}>(uniforms.max))`,void 0,n.cacheKey,void 0,[{type:e.inputs[0].dataType,data:n.min},{type:e.inputs[0].dataType,data:n.max}],[{name:"min",type:r},{name:"max",type:r}]),{inputs:[0]})},CW=e=>{e.compute(Xs(e.inputs[0],"Ceil","ceil"))},NW=e=>{e.compute(Xs(e.inputs[0],"Cos","cos"))},EW=e=>{e.compute(Xs(e.inputs[0],"Cosh","cosh"))},hx=e=>fi(e),IW=(e,t)=>{let n=Uo(e.inputs[0].dataType);e.compute(Xs(e.inputs[0],"Elu",r=>`elu_vf32(${r})`,` + const elu_alpha_ = ${n}(${t.alpha}); + + fn elu_f32(a: ${n}) -> ${n} { + return select((exp(a) - 1.0) * elu_alpha_, a, a >= 0.0); + } + + fn elu_vf32(v: vec4<${n}>) -> vec4<${n}> { + return vec4(elu_f32(v.x), elu_f32(v.y), elu_f32(v.z), elu_f32(v.w)); + }`,t.cacheKey))},zv=(e="f32")=>` +const r0: ${e} = 0.3275911; +const r1: ${e} = 0.254829592; +const r2: ${e} = -0.284496736; +const r3: ${e} = 1.421413741; +const r4: ${e} = -1.453152027; +const r5: ${e} = 1.061405429; + +fn erf_vf32(v: vec4<${e}>) -> vec4<${e}> { + let absv = abs(v); + let x = 1.0 / (1.0 + r0 * absv); + return sign(v) * (1.0 - ((((r5 * x + r4) * x + r3) * x + r2) * x + r1) * x * exp(-absv * absv)); +}`,kW=e=>{let t=Uo(e.inputs[0].dataType);e.compute(Xs(e.inputs[0],"Erf",n=>`erf_vf32(${n})`,zv(t)))},AW=e=>{e.compute(Xs(e.inputs[0],"Exp","exp"))},MW=e=>{e.compute(Xs(e.inputs[0],"Floor","floor"))},TW=e=>{let t=Uo(e.inputs[0].dataType);e.compute(Xs(e.inputs[0],"Gelu",n=>`0.5 * ${n} * (1.0 + erf_vf32(${n} * 0.7071067811865475))`,zv(t)))},RW=(e,t)=>{let n=Uo(e.inputs[0].dataType);e.compute(Xs(e.inputs[0],"LeakyRelu",r=>`select(leaky_relu_alpha_ * ${r}, ${r}, ${r} >= vec4<${n}>(0.0))`,`const leaky_relu_alpha_ = ${n}(${t.alpha});`,t.cacheKey))},PW=e=>{e.compute(Xs(e.inputs[0],"Not",t=>`!${t}`))},OW=e=>{e.compute(Xs(e.inputs[0],"Neg",t=>`-${t}`))},LW=e=>{e.compute(Xs(e.inputs[0],"Reciprocal",t=>`1.0/${t}`))},BW=e=>{let t=Uo(e.inputs[0].dataType);e.compute(Xs(e.inputs[0],"Relu",n=>`select(vec4<${t}>(0.0), ${n}, ${n} > vec4<${t}>(0.0))`))},UW=e=>{e.compute(Xs(e.inputs[0],"Sigmoid",t=>`(1.0 / (1.0 + exp(-${t})))`))},FW=e=>fi(e),WW=(e,t)=>{let n=Uo(e.inputs[0].dataType);e.compute(Xs(e.inputs[0],"HardSigmoid",r=>`max(vec4<${n}>(0.0), min(vec4<${n}>(1.0), ${t.alpha} * ${r} + vec4<${n}>(${t.beta})))`,void 0,t.cacheKey))},DW=e=>{e.compute(Xs(e.inputs[0],"Sin","sin"))},VW=e=>{e.compute(Xs(e.inputs[0],"Sinh","sinh"))},HW=e=>{e.compute(Xs(e.inputs[0],"Sqrt","sqrt"))},GW=e=>{e.compute(Xs(e.inputs[0],"Tan","tan"))},pz=e=>`sign(${e}) * (1 - exp(-2 * abs(${e}))) / (1 + exp(-2 * abs(${e})))`,qW=e=>{e.compute(Xs(e.inputs[0],"Tanh",pz))},c5=(e="f32")=>` +const fast_gelu_a: ${e} = 0.5; +const fast_gelu_b: ${e} = 0.7978845608028654; +const fast_gelu_c: ${e} = 0.035677408136300125; + +fn tanh_v(v: vec4<${e}>) -> vec4<${e}> { + return ${pz("v")}; +} +`,u5=e=>`(fast_gelu_a + fast_gelu_a * tanh_v(${e} * (fast_gelu_c * ${e} * ${e} + fast_gelu_b))) * ${e}`,KW=e=>{let t=Uo(e.inputs[0].dataType);e.compute(Xs(e.inputs[0],"FastGelu",u5,c5(t),void 0,e.inputs[0].dataType))},XW=(e,t)=>{let n=Uo(e.inputs[0].dataType);return e.compute(Xs(e.inputs[0],"ThresholdedRelu",r=>`select(vec4<${n}>(0.0), ${r}, ${r} > thresholded_relu_alpha_)`,`const thresholded_relu_alpha_ = vec4<${n}>(${t.alpha});`,t.cacheKey)),0},YW=e=>{e.compute(Xs(e.inputs[0],"Log","log"))},I8=(e,t)=>` +const alpha = vec4<${e}>(${t}); +const one = ${e}(1.0); +const zero = ${e}(0.0); + +fn quick_gelu_impl(x: vec4<${e}>) -> vec4<${e}> { + let v = x *alpha; + var x1 : vec4<${e}>; + for (var i = 0; i < 4; i = i + 1) { + if (v[i] >= zero) { + x1[i] = one / (one + exp(-v[i])); + } else { + x1[i] = one - one / (one + exp(v[i])); + } + } + return x * x1; +} +`,k8=e=>`quick_gelu_impl(${e})`,JW=(e,t)=>{let n=Uo(e.inputs[0].dataType);e.compute(Xs(e.inputs[0],"QuickGelu",k8,I8(n,t.alpha),t.cacheKey,e.inputs[0].dataType))}}),A8,M8,ZW,ohe=dr(()=>{ws(),Ss(),$S(),A8=e=>{if(e[0].dims.length!==3)throw new Error("input should have 3 dimensions");if(![2560,5120,10240].includes(e[0].dims[2]))throw new Error("hidden state should be 2560, 5120 or 10240");if(e[1].dims.length!==1)throw new Error("bias is expected to have 1 dimensions");if(e[0].dims[2]!==e[1].dims[0])throw new Error("last dimension of input and bias are not the same")},M8=e=>{let t=e[0].dims.slice();t[2]=t[2]/2;let n=Wn("input",e[0].dataType,e[0].dims,4),r=Wn("bias",e[0].dataType,[e[0].dims[2]],4),i=Vr("output",e[0].dataType,t,4),a=kn.size(t)/4,o=Qa(e[0].dataType);return{name:"BiasSplitGelu",getRunData:()=>({outputs:[{dims:t,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(a/64)}}),getShaderSource:l=>` + const M_SQRT2 = sqrt(2.0); + const halfChannels = ${e[0].dims[2]/4/2}u; + + ${l.declareVariables(n,r,i)} + + ${zv(o)} + + ${l.mainStart()} + ${l.guardAgainstOutOfBoundsWorkgroupSizes(a)} + let biasIdx = global_idx % halfChannels; + let batchIndex = global_idx / halfChannels; + let inputOffset = biasIdx + batchIndex * halfChannels * 2; + let valueLeft = input[inputOffset] + bias[biasIdx]; + let valueRight = input[inputOffset + halfChannels] + bias[biasIdx + halfChannels]; + let geluRight = valueRight * 0.5 * (erf_vf32(valueRight / M_SQRT2) + 1); + + ${i.setByOffset("global_idx","valueLeft * geluRight")} + }`}},ZW=e=>{A8(e.inputs),e.compute(M8(e.inputs))}}),T8,R8,sd,QW,eD,tD,nD,rD,sD,iD,aD,oD,lD,lhe=dr(()=>{ps(),ws(),Ss(),T8=(e,t,n,r,i,a,o,l,c,u,d,h)=>{let p,f;typeof l=="string"?p=f=(v,m)=>`${l}((${v}),(${m}))`:typeof l=="function"?p=f=l:(p=l.scalar,f=l.vector);let b=Vr("outputData",d,r.length,4),g=Wn("aData",c,t.length,4),y=Wn("bData",u,n.length,4),w;if(i)if(a){let v=kn.size(t)===1,m=kn.size(n)===1,z=t.length>0&&t[t.length-1]%4===0,C=n.length>0&&n[n.length-1]%4===0;v||m?w=b.setByOffset("global_idx",f(v?`${g.type.value}(${g.getByOffset("0")}.x)`:g.getByOffset("global_idx"),m?`${y.type.value}(${y.getByOffset("0")}.x)`:y.getByOffset("global_idx"))):w=` + let outputIndices = ${b.offsetToIndices("global_idx * 4u")}; + let offsetA = ${g.broadcastedIndicesToOffset("outputIndices",b)}; + let offsetB = ${y.broadcastedIndicesToOffset("outputIndices",b)}; + ${b.setByOffset("global_idx",f(o||z?g.getByOffset("offsetA / 4u"):`${g.type.value}(${g.getByOffset("offsetA / 4u")}[offsetA % 4u])`,o||C?y.getByOffset("offsetB / 4u"):`${y.type.value}(${y.getByOffset("offsetB / 4u")}[offsetB % 4u])`))} + `}else w=b.setByOffset("global_idx",f(g.getByOffset("global_idx"),y.getByOffset("global_idx")));else{if(!a)throw new Error("no necessary to use scalar implementation for element-wise binary op implementation.");let v=(m,z,C="")=>{let E=`aData[indexA${z}][componentA${z}]`,I=`bData[indexB${z}][componentB${z}]`;return` + let outputIndices${z} = ${b.offsetToIndices(`global_idx * 4u + ${z}u`)}; + let offsetA${z} = ${g.broadcastedIndicesToOffset(`outputIndices${z}`,b)}; + let offsetB${z} = ${y.broadcastedIndicesToOffset(`outputIndices${z}`,b)}; + let indexA${z} = offsetA${z} / 4u; + let indexB${z} = offsetB${z} / 4u; + let componentA${z} = offsetA${z} % 4u; + let componentB${z} = offsetB${z} % 4u; + ${m}[${z}] = ${C}(${p(E,I)}); + `};d===9?w=` + var data = vec4(0); + ${v("data",0,"u32")} + ${v("data",1,"u32")} + ${v("data",2,"u32")} + ${v("data",3,"u32")} + outputData[global_idx] = dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(data));`:w=` + ${v("outputData[global_idx]",0)} + ${v("outputData[global_idx]",1)} + ${v("outputData[global_idx]",2)} + ${v("outputData[global_idx]",3)} + `}return` + ${e.registerUniform("vec_size","u32").declareVariables(g,y,b)} + + ${h??""} + + ${e.mainStart()} + ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + ${w} + }`},R8=(e,t,n,r,i,a,o=n.dataType)=>{let l=n.dims.map(g=>Number(g)??1),c=r.dims.map(g=>Number(g)??1),u=!kn.areEqual(l,c),d=l,h=kn.size(l),p=!1,f=!1,b=[u];if(u){let g=Im.calcShape(l,c,!1);if(!g)throw new Error("Can't perform binary op on the given tensors");d=g.slice(),h=kn.size(d);let y=kn.size(l)===1,w=kn.size(c)===1,v=l.length>0&&l[l.length-1]%4===0,m=c.length>0&&c[c.length-1]%4===0;b.push(y),b.push(w),b.push(v),b.push(m);let z=1;for(let C=1;Cg.toString()).join("_"),inputDependencies:["rank","rank"]},getShaderSource:g=>T8(g,l,c,d,p,u,f,i,n.dataType,r.dataType,o,a),getRunData:()=>({outputs:[{dims:d,dataType:o}],dispatchGroup:{x:Math.ceil(h/64/4)},programUniforms:[{type:12,data:Math.ceil(kn.size(d)/4)},...Jr(l,c,d)]})}},sd=(e,t,n,r,i,a)=>{e.compute(R8(t,i??"",e.inputs[0],e.inputs[1],n,r,a))},QW=e=>{sd(e,"Add",(t,n)=>`${t}+${n}`)},eD=e=>{sd(e,"Div",(t,n)=>`${t}/${n}`)},tD=e=>{sd(e,"Equal",{scalar:(t,n)=>`u32(${t}==${n})`,vector:(t,n)=>`vec4(${t}==${n})`},void 0,void 0,9)},nD=e=>{sd(e,"Mul",(t,n)=>`${t}*${n}`)},rD=e=>{let t=Wn("input",e.inputs[0].dataType,e.inputs[0].dims).type.value;sd(e,"Pow",{scalar:(n,r)=>`pow_custom(${n},${r})`,vector:(n,r)=>`pow_vector_custom(${n},${r})`},` + fn pow_custom(a : ${t}, b : ${t}) -> ${t} { + if (b == ${t}(0.0)) { + return ${t}(1.0); + } else if (a < ${t}(0.0) && f32(b) != floor(f32(b))) { + return ${t}(pow(f32(a), f32(b))); // NaN + } + return select(sign(a), ${t}(1.0), round(f32(abs(b) % ${t}(2.0))) != 1.0) * ${t}(${t==="i32"?"round":""}(pow(f32(abs(a)), f32(b)))); + } + fn pow_vector_custom(a : vec4<${t}>, b : vec4<${t}>) -> vec4<${t}> { + // TODO: implement vectorized pow + return vec4<${t}>(pow_custom(a.x, b.x), pow_custom(a.y, b.y), pow_custom(a.z, b.z), pow_custom(a.w, b.w)); + } + `)},sD=e=>{sd(e,"Sub",(t,n)=>`${t}-${n}`)},iD=e=>{sd(e,"Greater",{scalar:(t,n)=>`u32(${t}>${n})`,vector:(t,n)=>`vec4(${t}>${n})`},void 0,void 0,9)},aD=e=>{sd(e,"Less",{scalar:(t,n)=>`u32(${t}<${n})`,vector:(t,n)=>`vec4(${t}<${n})`},void 0,void 0,9)},oD=e=>{sd(e,"GreaterOrEqual",{scalar:(t,n)=>`u32(${t}>=${n})`,vector:(t,n)=>`vec4(${t}>=${n})`},void 0,void 0,9)},lD=e=>{sd(e,"LessOrEqual",{scalar:(t,n)=>`u32(${t}<=${n})`,vector:(t,n)=>`vec4(${t}<=${n})`},void 0,void 0,9)}}),P8,O8,L8,B8,cD,uD,che=dr(()=>{ps(),ws(),la(),Ss(),P8=(e,t)=>{if(!e||e.length<1)throw new Error("too few inputs");let n=0,r=e[n],i=r.dataType,a=r.dims.length;e.forEach((o,l)=>{if(l!==n){if(o.dataType!==i)throw new Error("input tensors should be one type");if(o.dims.length!==a)throw new Error("input tensors should have the same shape");o.dims.forEach((c,u)=>{if(u!==t&&c!==r.dims[u])throw new Error("non concat dimensions must match")})}})},O8=(e,t)=>` + fn calculateInputIndex(index: u32) -> u32 { + let sizeInConcatAxis = array(${t}); + for (var i: u32 = 0u; i < ${e}; i += 1u ) { + if (index < sizeInConcatAxis[i]) { + return i; + } + } + return ${e}u; + }`,L8=(e,t)=>{let n=e.length,r=[];for(let i=0;i{let i=kn.size(n),a=new Array(e.length),o=new Array(e.length),l=0,c=[],u=[],d=[{type:12,data:i}];for(let g=0;g`uniforms.sizeInConcatAxis${g}`).join(","),b=g=>` + + ${(()=>{g.registerUniform("outputSize","u32");for(let y=0;y(${f}); + ${p} -= sizeInConcatAxis[inputIndex - 1u]; + } + + ${L8(o,h)} + }`;return{name:"Concat",shaderCache:{hint:`${t}`,inputDependencies:c},getRunData:()=>({outputs:[{dims:n,dataType:r}],dispatchGroup:{x:Math.ceil(i/64)},programUniforms:d}),getShaderSource:b}},cD=(e,t)=>{let n=e.inputs,r=n[0].dims,i=kn.normalizeAxis(t.axis,r.length);P8(n,i);let a=r.slice();a[i]=n.reduce((l,c)=>l+(c.dims.length>i?c.dims[i]:0),0);let o=n.filter(l=>kn.size(l.dims)>0);e.compute(B8(o,i,a,n[0].dataType),{inputs:o})},uD=e=>fi({axis:e.axis})}),Zp,Qp,ef,SS,df=dr(()=>{ps(),ws(),Zp=(e,t,n="f32")=>{switch(e.activation){case"Relu":return`value = max(value, ${t}(0.0));`;case"Sigmoid":return`value = (${t}(1.0) / (${t}(1.0) + exp(-value)));`;case"Clip":return`value = clamp(value, ${t}(${n}(uniforms.clip_min)), ${t}(${n}(uniforms.clip_max)));`;case"HardSigmoid":return`value = max(${t}(0.0), min(${t}(1.0), ${n}(uniforms.alpha) * value + ${n}(uniforms.beta)));`;case"LeakyRelu":return`value = select(${n}(uniforms.alpha) * value, value, value >= ${t}(0.0));`;case"Tanh":return`let e2x = exp(-2.0 * abs(value)); + value = sign(value) * (1.0 - e2x) / (1.0 + e2x); + `;case"":return"";default:throw new Error(`Unsupported activation ${e.activation}`)}},Qp=(e,t)=>{e.activation==="Clip"?t.push({type:1,data:e.clipMax},{type:1,data:e.clipMin}):e.activation==="HardSigmoid"?t.push({type:1,data:e.alpha},{type:1,data:e.beta}):e.activation==="LeakyRelu"&&t.push({type:1,data:e.alpha})},ef=(e,t)=>{e.activation==="Clip"?t.push({name:"clip_max",type:"f32"},{name:"clip_min",type:"f32"}):e.activation==="HardSigmoid"?t.push({name:"alpha",type:"f32"},{name:"beta",type:"f32"}):e.activation==="LeakyRelu"&&t.push({name:"alpha",type:"f32"})},SS=e=>{let t=(e==null?void 0:e.activation)||"";if(t==="HardSigmoid"){let[n,r]=(e==null?void 0:e.activation_params)||[.2,.5];return{activation:t,alpha:n,beta:r}}else if(t==="Clip"){let[n,r]=(e==null?void 0:e.activation_params)||[UF,FF];return{activation:t,clipMax:r,clipMin:n}}else if(t==="LeakyRelu"){let[n]=(e==null?void 0:e.activation_params)||[.01];return{activation:t,alpha:n}}return{activation:t}}}),po,dD,jS=dr(()=>{po=(e,t)=>{switch(e){case 1:return t;case 2:return`vec2<${t}>`;case 3:return`vec3<${t}>`;case 4:return`vec4<${t}>`;default:throw new Error(`${e}-component is not supported.`)}},dD=e=>` + ${e?"value = value + getBiasByOutputCoords(coords);":""} + `}),hD,uhe=dr(()=>{hD=e=>` +fn getIndexFromCoords4D(coords : vec4, shape : vec4) -> i32 { + return dot(coords, vec4( + shape.y * shape.z * shape.w, shape.z * shape.w, shape.w, 1)); +} +fn getOutputIndexFromCoords(coords : vec4) -> i32 { + return dot(coords, vec4( + i32(${e}.x), i32(${e}.y), i32(${e}.z), 1)); +} +`}),zx,CS,NS=dr(()=>{ps(),ws(),Ss(),df(),zx=(e,t,n,r,i)=>{let a=r-n;return` + ${Array.from({length:n}).map((o,l)=>` + if (${qr(t.shape,l,t.rank)} != 1) { + ${t.indicesSet(e,l,qr(i,l+a,r))} + } else { + ${t.indicesSet(e,l,0)} + }`).join("")} +`},CS=(e,t,n,r,i=!1,a)=>{let o=e[0].dims,l=e[1].dims,c=o[o.length-2],u=l[l.length-1],d=o[o.length-1],h=Ji(u),p=Ji(d),f=Ji(c),b=kn.size(n)/h/f,g=e.length>2,y=r?r.slice(0,-2):n.slice(0,-2),w=[kn.size(y),c,u],v=[{type:12,data:b},{type:12,data:c},{type:12,data:u},{type:12,data:d}];Qp(t,v),v.push(...Jr(y,o,l)),g&&v.push(...Jr(e[2].dims)),v.push(...Jr(w));let m=z=>{let C=wS("batch_dims",e[0].dataType,y.length),E=Wn("a",e[0].dataType,o.length,p),I=Wn("b",e[1].dataType,l.length,h),R=Vr("output",e[0].dataType,w.length,h),A=Qa(R.type.tensor),O=Zp(t,R.type.value,A),F=[E,I],L="";if(g){let q=i?h:1;F.push(Wn("bias",e[2].dataType,e[2].dims.length,q)),L=`${i?`value += bias[col / ${q}];`:`value += ${R.type.value}(bias[row + i]);`}`}let X=[{name:"output_size",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"}];ef(t,X);let T=()=>{let q=`var a_data: ${E.type.value};`;for(let H=0;H; + for (var k: u32 = 0u; k < uniforms.K; k = k + ${p}) { + ${T()} + } + for (var i = 0u; i < ${f}u; i++) { + var value = values[i]; + ${L} + ${O} + let cur_indices = ${R.type.indices}(batch, row + i, col); + let offset = ${R.indicesToOffset("cur_indices")}; + ${R.setByOffset(`offset / ${h}`,"value")}; + } + } + `};return{name:"MatMulNaive",shaderCache:{hint:`${t.activation};${h};${p};${f};${i}`,inputDependencies:g?["rank","rank","rank"]:["rank","rank"]},getRunData:()=>({outputs:[{dims:a?a(n):n,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(b/64)},programUniforms:v}),getShaderSource:m}}}),U8,F8,d5,fz,W8,h5,D8,yw,ES=dr(()=>{ps(),ws(),Ss(),df(),NS(),jS(),U8=(e,t)=>e?` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + kStart + inputRow, + globalRowStart / innerElementSize + inputCol${t?", batchIndices":""}); + `:` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + globalRow + innerRow, + kStart / innerElementSize + inputCol${t?", batchIndices":""}); + `,F8=(e,t)=>e?` + let ACached0 = mm_Asub[k * innerElementSize][localRow]; + let ACached1 = mm_Asub[k * innerElementSize + 1][localRow]; + let ACached2 = mm_Asub[k * innerElementSize + 2][localRow]; + ${t===3?"":"let ACached3 = mm_Asub[k * innerElementSize + 3][localRow];"} + for (var i = 0; i < rowPerThread; i = i + 1) { + acc[i] = BCached0 * ACached0[i] + acc[i]; + acc[i] = BCached1 * ACached1[i] + acc[i]; + acc[i] = BCached2 * ACached2[i] + acc[i]; + ${t===3?"":"acc[i] = BCached3 * ACached3[i] + acc[i];"} + }`:` + for (var i = 0; i < rowPerThread; i = i + 1) { + let ACached = mm_Asub[tileRow + i][k]; + acc[i] = BCached0 * ACached.x + acc[i]; + acc[i] = BCached1 * ACached.y + acc[i]; + acc[i] = BCached2 * ACached.z + acc[i]; + ${t===3?"":"acc[i] = BCached3 * ACached.w + acc[i];"} + }`,d5=(e,t,n="f32",r,i=!1,a=32,o=!1,l=32)=>{let c=t[1]*e[1],u=t[0]*e[0],d=i?c:a,h=i?a:c,p=d/t[0],f=a/t[1];if(!((i&&p===4&&e[1]===4||!i&&(p===3||p===4))&&d%t[0]===0&&a%t[1]===0&&e[0]===4))throw new Error(`If transposeA ${i} is true, innerElementSize ${p} and workPerThread[1] ${e[1]} must be 4. + Otherwise, innerElementSize ${p} must be 3 or 4. + tileAWidth ${d} must be divisible by workgroupSize[0]${t[0]}. tileInner ${a} must be divisible by workgroupSize[1] ${t[1]}. colPerThread ${e[0]} must be 4.`);return` +var mm_Asub: array, ${d/p}>, ${h}>; +var mm_Bsub: array, ${u/e[0]}>, ${a}>; + +const rowPerThread = ${e[1]}; +const colPerThread = ${e[0]}; +const innerElementSize = ${p}; +const tileInner = ${a}; + +@compute @workgroup_size(${t[0]}, ${t[1]}, ${t[2]}) +fn main(@builtin(local_invocation_id) localId : vec3, + @builtin(global_invocation_id) globalId : vec3, + @builtin(workgroup_id) workgroupId : vec3) { + let localRow = i32(localId.y); + let tileRow = localRow * rowPerThread; + let tileCol = i32(localId.x); + + let globalRow =i32(globalId.y) * rowPerThread; + let globalCol = i32(globalId.x); + let batch = ${o?"0":"i32(globalId.z)"}; + ${r?`let batchIndices = ${r.offsetToIndices("u32(batch)")};`:""} + let globalRowStart = i32(workgroupId.y) * ${c}; + + let num_tiles = ${o?`${Math.ceil(l/a)}`:"(uniforms.dim_inner - 1) / tileInner + 1"}; + var kStart = ${o?`i32(globalId.z) * ${l}`:"0"}; + + var acc: array, rowPerThread>; + + // Loop over shared dimension. + let tileRowB = localRow * ${f}; + for (var t = 0; t < num_tiles; t = t + 1) { + // Load one tile of A into local memory. + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + let inputRow = tileRow + innerRow; + let inputCol = tileCol; + ${U8(i,r)} + } + + // Load one tile of B into local memory. + for (var innerRow = 0; innerRow < ${f}; innerRow = innerRow + 1) { + let inputRow = tileRowB + innerRow; + let inputCol = tileCol; + mm_Bsub[inputRow][inputCol] = mm_readB(batch, kStart + inputRow, globalCol${r?", batchIndices":""}); + } + kStart = kStart + tileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + for (var k = 0; k < tileInner / innerElementSize; k = k + 1) { + let BCached0 = mm_Bsub[k * innerElementSize][tileCol]; + let BCached1 = mm_Bsub[k * innerElementSize + 1][tileCol]; + let BCached2 = mm_Bsub[k * innerElementSize + 2][tileCol]; + ${p===3?"":"let BCached3 = mm_Bsub[k * innerElementSize + 3][tileCol];"} + + ${F8(i,p)} + } + + workgroupBarrier(); + } + + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + mm_write(batch, globalRow + innerRow, globalCol, acc[innerRow]); + } +}`},fz=(e,t)=>e?` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + kStart + inputRow, + globalRowStart + inputCol${t?", batchIndices":""}); + `:` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + globalRowStart + inputRow, + kStart + inputCol${t?", batchIndices":""}); + `,W8=e=>e?"let ACached = mm_Asub[k][tileRow + innerRow];":"let ACached = mm_Asub[tileRow + innerRow][k];",h5=(e,t,n="f32",r,i=!1,a=32,o=!1,l=32,c=!1)=>{let u=e[1]*t[1],d=e[0]*t[0],h=i?u:a,p=i?a:u;if(!(p%t[1]===0&&h%t[0]===0&&a%t[1]===0))throw new Error(`tileAHight ${p} must be divisible by workgroupSize[1]${t[1]}, tileAWidth ${h} must be divisible by workgroupSize[0]${t[0]}, tileInner ${a} must be divisible by workgroupSize[1]${t[1]}`);let f=p/t[1],b=h/t[0],g=a/t[1],y=c?` + let localRow = i32(localId.y); + let localCol = i32(localId.x); + let globalRowStart = i32(workgroupId.y) * ${u}; + let globalColStart = i32(workgroupId.x) * ${d}; + + // Loop over shared dimension. + for (var t = 0; t < num_tiles; t = t + 1) { + // Load one tile of A into local memory. + for (var inputRow = localRow; inputRow < ${p}; inputRow = inputRow + ${t[1]}) { + for (var inputCol = localCol; inputCol < ${h}; inputCol = inputCol + ${t[0]}) { + ${fz(i,r)} + } + } + // Load one tile of B into local memory. + for (var inputRow = localRow; inputRow < ${a}; inputRow = inputRow + ${t[1]}) { + for (var inputCol = localCol; inputCol < ${d}; inputCol = inputCol + ${t[0]}) { + mm_Bsub[inputRow][inputCol] = mm_readB(batch, + kStart + inputRow, + globalColStart + inputCol${r?", batchIndices":""}); + } + } + kStart = kStart + tileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + var BCached : array<${n}, colPerThread>; + for (var k = 0; k < tileInner; k = k + 1) { + for (var inner = 0; inner < colPerThread; inner = inner + 1) { + BCached[inner] = mm_Bsub[k][localCol + inner * ${t[0]}]; + } + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + let ACached = ${i?`mm_Asub[k][localRow + innerRow * ${t[1]}];`:`mm_Asub[localRow + innerRow * ${t[1]}][k];`} + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + acc[innerRow][innerCol] = acc[innerRow][innerCol] + + ACached * BCached[innerCol]; + } + } + } + workgroupBarrier(); + } + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + let gRow = globalRowStart + localRow + innerRow * ${t[1]}; + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + let gCol = globalColStart + localCol + innerCol * ${t[0]}; + mm_write(batch, gRow, gCol, acc[innerRow][innerCol]); + } + } + `:` +let tileRow = i32(localId.y) * rowPerThread; +let tileCol = i32(localId.x) * colPerThread; + +let globalRow = i32(globalId.y) * rowPerThread; +let globalCol = i32(globalId.x) * colPerThread; +let globalRowStart = i32(workgroupId.y) * ${u}; + +let tileRowA = i32(localId.y) * ${f}; +let tileColA = i32(localId.x) * ${b}; +let tileRowB = i32(localId.y) * ${g}; +// Loop over shared dimension. +for (var t = 0; t < num_tiles; t = t + 1) { + // Load one tile of A into local memory. + for (var innerRow = 0; innerRow < ${f}; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < ${b}; innerCol = innerCol + 1) { + let inputRow = tileRowA + innerRow; + let inputCol = tileColA + innerCol; + ${fz(i,r)} + } + } + + // Load one tile of B into local memory. + for (var innerRow = 0; innerRow < ${g}; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + let inputRow = tileRowB + innerRow; + let inputCol = tileCol + innerCol; + mm_Bsub[inputRow][inputCol] = mm_readB(batch, + kStart + inputRow, + globalCol + innerCol${r?", batchIndices":""}); + } + } + kStart = kStart + tileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + var BCached : array<${n}, colPerThread>; + for (var k = 0; k < tileInner; k = k + 1) { + for (var inner = 0; inner < colPerThread; inner = inner + 1) { + BCached[inner] = mm_Bsub[k][tileCol + inner]; + } + + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + ${W8(i)} + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + acc[innerRow][innerCol] = acc[innerRow][innerCol] + ACached * BCached[innerCol]; + } + } + } + + workgroupBarrier(); +} + +for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + mm_write(batch, globalRow + innerRow, globalCol + innerCol, + acc[innerRow][innerCol]); + } +} +`;return` + var mm_Asub : array, ${p}>; + var mm_Bsub : array, ${a}>; + const rowPerThread = ${e[1]}; + const colPerThread = ${e[0]}; + const tileInner = ${a}; + +@compute @workgroup_size(${t[0]}, ${t[1]}, ${t[2]}) +fn main(@builtin(local_invocation_id) localId : vec3, + @builtin(global_invocation_id) globalId : vec3, + @builtin(workgroup_id) workgroupId : vec3) { + let batch = ${o?"0":"i32(globalId.z)"}; + ${r?`let batchIndices = ${r.offsetToIndices("u32(batch)")};`:""} + let num_tiles = ${o?`${Math.ceil(l/a)}`:"(uniforms.dim_inner - 1) / tileInner + 1"}; + var kStart = ${o?`i32(globalId.z) * ${l}`:"0"}; + + var acc : array, rowPerThread>; + ${y} + } +`},D8=(e,t,n,r,i=!1)=>{let[a,o,l,c]=r,u=Qa(r[0].type.tensor);return` + fn mm_readA(batch: i32, row: i32, colIn: i32, batchIndices: ${a.type.indices}) -> ${po(e,u)} { + var value = ${po(e,u)}(0.0); + let col = colIn * ${e}; + if(row < uniforms.dim_a_outer && col < uniforms.dim_inner) + { + var aIndices: ${o.type.indices}; + ${zx("aIndices",o,o.rank-2,a.rank,"batchIndices")} + ${o.indicesSet("aIndices",o.rank-2,"u32(row)")} + ${o.indicesSet("aIndices",o.rank-1,"u32(colIn)")} + value = ${o.getByIndices("aIndices")}; + } + return value; + } + + fn mm_readB(batch: i32, row: i32, colIn: i32, batchIndices: ${a.type.indices}) -> ${po(e,u)} { + var value = ${po(e,u)}(0.0); + let col = colIn * ${e}; + if(row < uniforms.dim_inner && col < uniforms.dim_b_outer) + { + var bIndices: ${l.type.indices}; + ${zx("bIndices",l,l.rank-2,a.rank,"batchIndices")} + ${l.indicesSet("bIndices",l.rank-2,"u32(row)")} + ${l.indicesSet("bIndices",l.rank-1,"u32(colIn)")} + value = ${l.getByIndices("bIndices")}; + } + return value; + } + + fn mm_write(batch: i32, row: i32, colIn: i32, valueIn: ${po(e,u)}) { + let col = colIn * ${e}; + if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) { + var value = valueIn; + let coords = vec3(batch, row, colIn); + ${t?`value = value + ${i?"bias[colIn]":`${po(e,u)}(bias[row])`};`:""} + ${n} + ${c.setByIndices("vec3(coords)","value")} + } + } + `},yw=(e,t,n,r,i=!1,a)=>{let o=e[0].dims,l=e[1].dims,c=o.slice(0,-2),u=l.slice(0,-2),d=r?r.slice(0,-2):n.slice(0,-2),h=kn.size(d),p=o[o.length-2],f=o[o.length-1],b=l[l.length-1],g=f%4===0&&b%4===0,y=p<=8?[4,1,1]:[4,4,1],w=[8,8,1],v=[Math.ceil(b/w[0]/y[0]),Math.ceil(p/w[1]/y[1]),Math.ceil(h/w[2]/y[2])],m=g?4:1,z=[...c,p,f/m],C=z.length,E=[...u,f,b/m],I=E.length,R=[h,p,b/m],A=[{type:6,data:p},{type:6,data:b},{type:6,data:f}];Qp(t,A),A.push(...Jr(d,z,E));let O=["rank","rank"],F=e.length>2;F&&(A.push(...Jr(e[2].dims)),O.push("rank")),A.push(...Jr(R));let L=X=>{let T=d.length,q=wS("batchDims",e[0].dataType,T,1),H=Qa(e[0].dataType),J=Wn("a",e[0].dataType,C,m),Z=Wn("b",e[1].dataType,I,m),B=Vr("result",e[0].dataType,R.length,m),V=[J,Z];if(F){let M=i?m:1;V.push(Wn("bias",e[2].dataType,e[2].dims.length,M))}let N=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"}];ef(t,N);let j=Qa(B.type.tensor),k=Zp(t,B.type.value,j),W=D8(m,F,k,[q,J,Z,B],i);return` + ${X.registerUniforms(N).registerInternalVariables(q).declareVariables(...V,B)} + ${W} + ${g?d5(y,w,H,q):h5(y,w,H,q)} + `};return{name:"MatMul",shaderCache:{hint:`${y};${t.activation};${g};${i}`,inputDependencies:O},getRunData:()=>({outputs:[{dims:a?a(n):n,dataType:e[0].dataType}],dispatchGroup:{x:v[0],y:v[1],z:v[2]},programUniforms:A}),getShaderSource:L}}}),V8,pD,dhe=dr(()=>{ps(),V0(),Ss(),df(),jS(),uhe(),ES(),V8=(e,t,n,r,i=!1,a,o=4,l=4,c=4,u="f32")=>{let d=A=>{switch(A){case 1:return"resData = x[xIndex];";case 3:return`resData = vec3<${u}>(x[xIndex], x[xIndex + 1], x[xIndex + 2]);`;case 4:return"resData = x[xIndex / 4];";default:throw new Error(`innerElementSize ${A} is not supported.`)}},h=A=>{switch(A){case 1:return"return w[row * i32(uniforms.w_shape[3]) + colIn];";case 4:return"return w[row * i32(uniforms.w_shape[3]) / 4 + colIn];";default:throw new Error(`innerElementSize ${A} is not supported.`)}},p=e?` + let coord = vec4(batch, xRow, xCol, xCh); + `:` + let coord = vec4(batch, xCh, xRow, xCol); + `,f=e?` + let coords = vec4( + batch, + row / outWidth, + row % outWidth, + col); + `:` + let coords = vec4( + batch, + row, + col / outWidth, + col % outWidth); + `,b=e?"i32(uniforms.x_shape[1])":"i32(uniforms.x_shape[2])",g=e?"i32(uniforms.x_shape[2])":"i32(uniforms.x_shape[3])",y=e?"row":"col",w=e?"col":"row",v=` + let inChannels = i32(uniforms.w_shape[2]); + let outWidth = ${e?"i32(uniforms.result_shape[2])":"i32(uniforms.result_shape[3])"}; + let outRow = ${y} / outWidth; + let outCol = ${y} % outWidth; + + let WRow = ${w} / (i32(uniforms.w_shape[1]) * inChannels); + let WCol = ${w} / inChannels % i32(uniforms.w_shape[1]); + let xRow = outRow * uniforms.stride[0] + uniforms.dilation[0] * WRow - uniforms.pad[0]; + let xCol = outCol * uniforms.stride[1] + uniforms.dilation[1] * WCol - uniforms.pad[1]; + let xCh = ${w} % inChannels; + var resData = ${po(o,u)}(0.0); + // The bounds checking is always needed since we use it to pad zero for + // the 'same' padding type. + if (xRow >= 0 && xRow < ${b} && xCol >= 0 && xCol < ${g}) { + ${p} + let xIndex = getIndexFromCoords4D(coord, vec4(uniforms.x_shape)); + ${d(o)} + } + return resData;`,m=e?t&&r?` + let col = colIn * ${o}; + ${v}`:` + let col = colIn * ${o}; + if (row < uniforms.dim_a_outer && col < uniforms.dim_inner) { + ${v} + } + return ${po(o,u)}(0.0);`:r&&n?` + let col = colIn * ${o}; + ${v}`:` + let col = colIn * ${o}; + if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) { + ${v} + } + return ${po(o,u)}(0.0);`,z=e?r&&n?h(l):` + let col = colIn * ${l}; + if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) { + ${h(l)} + } + return ${po(l,u)}(0.0);`:` + let col = colIn * ${l}; + if (row < uniforms.dim_inner && col < uniforms.dim_a_outer) { + ${h(l)} + } + return ${po(l,u)}(0.0);`,C=po(c,u),E=po(e?o:l,u),I=po(e?l:o,u),R=Zp(a,C,u);return` + fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${E} { + ${e?m:z} + } + + fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${I} { + ${e?z:m} + } + + fn mm_write(batch: i32, row : i32, colIn : i32, valueIn : ${C}) { + let col = colIn * ${c}; + if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) + { + var value = valueIn; + let outWidth = ${e?"i32(uniforms.result_shape[2])":"i32(uniforms.result_shape[3])"}; + ${f} + ${dD(i)} + ${R} + setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value); + } + }`},pD=(e,t,n,r,i,a,o,l,c)=>{let u=t.format==="NHWC",d=u?e[0].dims[3]:e[0].dims[1],h=n[0],p=u?n[2]:n[3],f=u?n[1]:n[2],b=u?n[3]:n[1],g=u&&(d%4===0||d%3===0)&&b%4===0,y=u?b:p*f,w=u?p*f:b,v=[8,8,1],m=r<=8?[4,1,1]:[4,4,1],z=[Math.ceil(y/v[0]/m[0]),Math.ceil(w/v[1]/m[1]),Math.ceil(h/v[2]/m[2])];Us("verbose",()=>`[conv2d_mm_webgpu] dispatch = ${z}`);let C=g?u&&d%4!==0?3:4:1,E=v[1]*m[1],I=v[0]*m[0],R=Math.max(v[0]*C,v[1]),A=r%E===0,O=i%I===0,F=a%R===0,L=g?[C,4,4]:[1,1,1],X=[{type:6,data:r},{type:6,data:i},{type:6,data:a},{type:6,data:[t.pads[0],t.pads[1]]},{type:6,data:t.strides},{type:6,data:t.dilations}];Qp(t,X),X.push(...Jr(e[0].dims,e[1].dims));let T=["rank","rank"];o&&(X.push(...Jr(e[2].dims)),T.push("rank")),X.push(...Jr(n));let q=H=>{let J=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"},{name:"pad",type:"i32",length:2},{name:"stride",type:"i32",length:2},{name:"dilation",type:"i32",length:2}];ef(t,J);let Z=g?4:1,B=Qa(e[0].dataType),V=` + fn setOutputAtIndex(flatIndex : i32, value : ${g?`vec4<${B}>`:B}) { + result[flatIndex] = ${g?`vec4<${B}>`:B}(value); + } + fn setOutputAtCoords(d0 : i32, d1 : i32, d2 : i32, d3 : i32, value : ${g?`vec4<${B}>`:B}) { + let flatIndex = getOutputIndexFromCoords(vec4(d0, d1, d2, d3)); + setOutputAtIndex(flatIndex ${g?"/ 4":""}, value); + }`,N=Wn("x",e[0].dataType,e[0].dims.length,C===3?1:C),j=Wn("w",e[1].dataType,e[1].dims.length,Z),k=[N,j],W=Vr("result",e[0].dataType,n.length,Z);if(o){let M=Wn("bias",e[2].dataType,e[2].dims.length,Z);k.push(M),V+=` + fn getBiasByOutputCoords(coords : vec4) -> ${g?`vec4<${B}>`:B} { + return bias[coords.${u?"w":"y"}${g?"/ 4":""}]; + }`}return` + ${hD("uniforms.result_strides")} + //struct Uniforms { xShape : vec4, wShape : vec4, outShape : vec4, + // outShapeStrides: vec3, filterDims : vec2, pad : vec2, stride : vec2, + // dilation : vec2, dimAOuter : i32, dimBOuter : i32, dimInner : i32 }; + ${H.registerUniforms(J).declareVariables(...k,W)} + ${V} + ${V8(u,A,O,F,o,t,L[0],L[1],L[2],B)} + ${g?d5(m,v,B,void 0,!u,R):h5(m,v,B,void 0,!u,R,!1,void 0,l)}`};return{name:"Conv2DMatMul",shaderCache:{hint:`${t.cacheKey};${C};${g};${A};${O};${F};${E};${I};${R}`,inputDependencies:T},getRunData:()=>({outputs:[{dims:c?c(n):n,dataType:e[0].dataType}],dispatchGroup:{x:z[0],y:z[1],z:z[2]},programUniforms:X}),getShaderSource:q}}}),H8,mz,Gg,G8,gz,q8,fD,mD,hhe=dr(()=>{ps(),V0(),ws(),Ss(),df(),jS(),H8=e=>{let t=1;for(let n=0;ntypeof e=="number"?[e,e,e]:e,Gg=(e,t)=>t<=1?e:e+(e-1)*(t-1),G8=(e,t,n,r=1)=>{let i=Gg(t,r);return Math.floor((e[0]*(n-1)-n+i)/2)},gz=(e,t,n,r,i)=>{i==null&&(i=G8(e,t[0],r[0]));let a=[0,0,0,n];for(let o=0;o<3;o++)e[o]+2*i>=t[o]&&(a[o]=Math.trunc((e[o]-t[o]+2*i)/r[o]+1));return a},q8=(e,t,n,r,i,a,o,l,c,u)=>{let d,h,p,f;if(e==="VALID"&&(e=0),typeof e=="number"){d={top:e,bottom:e,left:e,right:e,front:e,back:e};let b=gz([t,n,r,1],[l,c,u],1,[i,a,o],e);h=b[0],p=b[1],f=b[2]}else if(Array.isArray(e)){if(!e.every((g,y,w)=>g===w[0]))throw Error(`Unsupported padding parameter: ${e}`);d={top:e[0],bottom:e[1],left:e[2],right:e[3],front:e[4],back:e[5]};let b=gz([t,n,r,1],[l,c,u],1,[i,a,o],e[0]);h=b[0],p=b[1],f=b[2]}else if(e==="SAME_UPPER"){h=Math.ceil(t/i),p=Math.ceil(n/a),f=Math.ceil(r/o);let b=(h-1)*i+l-t,g=(p-1)*a+c-n,y=(f-1)*o+u-r,w=Math.floor(b/2),v=b-w,m=Math.floor(g/2),z=g-m,C=Math.floor(y/2),E=y-C;d={top:m,bottom:z,left:C,right:E,front:w,back:v}}else throw Error(`Unknown padding parameter: ${e}`);return{padInfo:d,outDepth:h,outHeight:p,outWidth:f}},fD=(e,t,n,r,i,a=!1,o="channelsLast")=>{let l,c,u,d,h;if(o==="channelsLast")[l,c,u,d,h]=e;else if(o==="channelsFirst")[l,h,c,u,d]=e;else throw new Error(`Unknown dataFormat ${o}`);let[p,,f,b,g]=t,[y,w,v]=mz(n),[m,z,C]=mz(r),E=Gg(f,m),I=Gg(b,z),R=Gg(g,C),{padInfo:A,outDepth:O,outHeight:F,outWidth:L}=q8(i,c,u,d,y,w,v,E,I,R),X=a?p*h:p,T=[0,0,0,0,0];return o==="channelsFirst"?T=[l,X,O,F,L]:o==="channelsLast"&&(T=[l,O,F,L,X]),{batchSize:l,dataFormat:o,inDepth:c,inHeight:u,inWidth:d,inChannels:h,outDepth:O,outHeight:F,outWidth:L,outChannels:X,padInfo:A,strideDepth:y,strideHeight:w,strideWidth:v,filterDepth:f,filterHeight:b,filterWidth:g,effectiveFilterDepth:E,effectiveFilterHeight:I,effectiveFilterWidth:R,dilationDepth:m,dilationHeight:z,dilationWidth:C,inShape:e,outShape:T,filterShape:t}},mD=(e,t,n,r,i,a)=>{let o=a==="channelsLast";o?e[0].dims[3]:e[0].dims[1];let l=[64,1,1],c={x:n.map((y,w)=>w)},u=[Math.ceil(H8(c.x.map(y=>n[y]))/l[0]),1,1];Us("verbose",()=>`[conv3d_naive_webgpu] dispatch = ${u}`);let d=1,h=kn.size(n),p=[{type:12,data:h},{type:12,data:r},{type:12,data:i},{type:12,data:t.strides},{type:12,data:t.dilations}];Qp(t,p),p.push(...Jr(e[0].dims,e[1].dims));let f=["rank","rank"],b=e.length===3;b&&(p.push(...Jr(e[2].dims)),f.push("rank")),p.push(...Jr(n));let g=y=>{let w=[{name:"output_size",type:"u32"},{name:"filter_dims",type:"u32",length:r.length},{name:"pads",type:"u32",length:i.length},{name:"strides",type:"u32",length:t.strides.length},{name:"dilations",type:"u32",length:t.dilations.length}];ef(t,w);let v=1,m=Qa(e[0].dataType),z=Wn("x",e[0].dataType,e[0].dims.length,d),C=Wn("W",e[1].dataType,e[1].dims.length,v),E=[z,C],I=Vr("result",e[0].dataType,n.length,v),R="";if(b){let F=Wn("bias",e[2].dataType,e[2].dims.length,v);E.push(F),R+=` + fn getBiasByOutputCoords(coords : array) -> ${m} { + return bias[${o?qr("coords",4,5):qr("coords",1,5)}]; + }`}let A=po(d,m),O=Zp(t,A,m);return` + ${R} + fn getX(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 { + let aIndices = array(d0, d1, d2, d3, d4); + return ${z.getByIndices("aIndices")}; + } + fn getW(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 { + let aIndices = array(d0, d1, d2, d3, d4); + return ${C.getByIndices("aIndices")}; + } + ${y.registerUniforms(w).declareVariables(...E,I)} + ${y.mainStart()} + ${y.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let coords = ${I.offsetToIndices("global_idx")}; + let batch = ${qr("coords",0,z.rank)}; + let d2 = ${o?qr("coords",z.rank-1,z.rank):qr("coords",1,z.rank)}; + let xFRCCorner = vec3(${o?qr("coords",1,z.rank):qr("coords",2,z.rank)}, + ${o?qr("coords",2,z.rank):qr("coords",3,z.rank)}, + ${o?qr("coords",3,z.rank):qr("coords",4,z.rank)}) * uniforms.strides - uniforms.pads; + let xFCorner = xFRCCorner.x; + let xRCorner = xFRCCorner.y; + let xCCorner = xFRCCorner.z; + let xShapeY = ${o?qr("uniforms.x_shape",1,z.rank):qr("uniforms.x_shape",2,z.rank)}; + let xShapeZ = ${o?qr("uniforms.x_shape",2,z.rank):qr("uniforms.x_shape",3,z.rank)}; + let xShapeW = ${o?qr("uniforms.x_shape",3,z.rank):qr("uniforms.x_shape",4,z.rank)}; + let xShapeU = ${o?qr("uniforms.x_shape",4,z.rank):qr("uniforms.x_shape",1,z.rank)}; + let inputDepthNearestVec4 = (xShapeU / 4) * 4; + let inputDepthVec4Remainder = xShapeU % 4; + + var value = 0.0; + for (var wF = 0u; wF < uniforms.filter_dims[0]; wF++) { + let xF = xFCorner + wF * uniforms.dilations[0]; + if (xF < 0 || xF >= xShapeY) { + continue; + } + + for (var wR = 0u; wR < uniforms.filter_dims[1]; wR++) { + let xR = xRCorner + wR * uniforms.dilations[1]; + if (xR < 0 || xR >= xShapeZ) { + continue; + } + + for (var wC = 0u; wC < uniforms.filter_dims[2]; wC++) { + let xC = xCCorner + wC * uniforms.dilations[2]; + if (xC < 0 || xC >= xShapeW) { + continue; + } + + for (var d1 = 0u; d1 < inputDepthNearestVec4; d1 += 4) { + ${o?`let xValues = vec4( + getX(batch, xF, xR, xC, d1), + getX(batch, xF, xR, xC, d1 + 1), + getX(batch, xF, xR, xC, d1 + 2), + getX(batch, xF, xR, xC, d1 + 3)); + `:`let xValues = vec4( + getX(batch, d1, xF, xR, xC), + getX(batch, d1 + 1, xF, xR, xC), + getX(batch, d1 + 2, xF, xR, xC), + getX(batch, d1 + 3, xF, xR, xC)); + `} + let wValues = vec4( + getW(d2, d1, wF, wR, wC), + getW(d2, d1 + 1, wF, wR, wC), + getW(d2, d1 + 2, wF, wR, wC), + getW(d2, d1 + 3, wF, wR, wC)); + value += dot(xValues, wValues); + } + if (inputDepthVec4Remainder == 1) { + ${o?`value += getX(batch, xF, xR, xC, inputDepthNearestVec4) + * getW(d2, inputDepthNearestVec4, wF, wR, wC);`:`value += getX(batch, inputDepthNearestVec4, xF, xR, xC) + * getW(d2, inputDepthNearestVec4, wF, wR, wC);`} + } else if (inputDepthVec4Remainder == 2) { + ${o?`let xValues = vec2( + getX(batch, xF, xR, xC, inputDepthNearestVec4), + getX(batch, xF, xR, xC, inputDepthNearestVec4 + 1)); + `:`let xValues = vec2( + getX(batch, inputDepthNearestVec4, xF, xR, xC), + getX(batch, inputDepthNearestVec4 + 1, xF, xR, xC)); + `} + let wValues = vec2( + getW(d2, inputDepthNearestVec4, wF, wR, wC), + getW(d2, inputDepthNearestVec4 + 1, wF, wR, wC)); + value += dot(xValues, wValues); + } else if (inputDepthVec4Remainder == 3) { + ${o?`let xValues = vec3( + getX(batch, xF, xR, xC, inputDepthNearestVec4), + getX(batch, xF, xR, xC, inputDepthNearestVec4 + 1), + getX(batch, xF, xR, xC, inputDepthNearestVec4 + 2)); + `:`let xValues = vec3( + getX(batch, inputDepthNearestVec4, xF, xR, xC), + getX(batch, inputDepthNearestVec4 + 1, xF, xR, xC), + getX(batch, inputDepthNearestVec4 + 2, xF, xR, xC)); + `} + let wValues = vec3( + getW(d2, inputDepthNearestVec4, wF, wR, wC), + getW(d2, inputDepthNearestVec4 + 1, wF, wR, wC), + getW(d2, inputDepthNearestVec4 + 2, wF, wR, wC)); + value += dot(xValues, wValues); + } + } + } + } + ${b?"value = value + getBiasByOutputCoords(coords)":""}; + ${O} + result[global_idx] = f32(value); + }`};return{name:"Conv3DNaive",shaderCache:{hint:`${t.cacheKey};${o};${d};${b}`,inputDependencies:f},getRunData:()=>({outputs:[{dims:n,dataType:e[0].dataType}],dispatchGroup:{x:u[0],y:u[1],z:u[2]},programUniforms:p}),getShaderSource:g}}}),gD,xD,phe=dr(()=>{ps(),ws(),Ss(),df(),gD=(e,t,n,r)=>{let i=e.length>2,a=i?"value += b[output_channel];":"",o=e[0].dims,l=e[1].dims,c=t.format==="NHWC",u=c?n[3]:n[1],d=u/t.group,h=c&&d>=4?Ji(u):1,p=kn.size(n)/h,f=[{type:12,data:p},{type:12,data:t.dilations},{type:12,data:[t.strides[0],t.strides[1]]},{type:12,data:[t.pads[0],t.pads[1]]},{type:12,data:d}];Qp(t,f),f.push(...Jr(o,[l[0],l[1],l[2],l[3]/h]));let b=i?["rank","rank","rank"]:["rank","rank"];f.push(...Jr([n[0],n[1],n[2],n[3]/h]));let g=y=>{let w=Vr("output",e[0].dataType,n.length,h),v=Qa(w.type.tensor),m=Zp(t,w.type.value,v),z=Wn("x",e[0].dataType,o.length),C=Wn("w",e[1].dataType,l.length,h),E=[z,C];i&&E.push(Wn("b",e[2].dataType,e[2].dims,h));let I=[{name:"output_size",type:"u32"},{name:"dilations",type:"u32",length:t.dilations.length},{name:"strides",type:"u32",length:2},{name:"pads",type:"u32",length:2},{name:"output_channels_per_group",type:"u32"}];ef(t,I);let R=c?` + for (var wHeight: u32 = 0u; wHeight < uniforms.w_shape[0]; wHeight++) { + let xHeight = xRCCorner.x + wHeight * uniforms.dilations[0]; + + if (xHeight < 0u || xHeight >= uniforms.x_shape[1]) { + continue; + } + + for (var wWidth: u32 = 0u; wWidth < uniforms.w_shape[1]; wWidth++) { + let xWidth = xRCCorner.y + wWidth * uniforms.dilations[1]; + if (xWidth < 0u || xWidth >= uniforms.x_shape[2]) { + continue; + } + + for (var wInChannel: u32 = 0u; wInChannel < uniforms.w_shape[2]; wInChannel++) { + let input_channel = in_channel_offset + wInChannel; + let xVal = ${z.get("batch","xHeight","xWidth","input_channel")}; + let wVal = ${C.get("wHeight","wWidth","wInChannel","output_channel")}; + value += xVal * wVal; + } + } + } + `:` + for (var wInChannel: u32 = 0u; wInChannel < uniforms.w_shape[1]; wInChannel++) { + let input_channel = in_channel_offset + wInChannel; + for (var wHeight: u32 = 0u; wHeight < uniforms.w_shape[2]; wHeight++) { + let xHeight = xRCCorner.x + wHeight * uniforms.dilations[0]; + + if (xHeight < 0u || xHeight >= uniforms.x_shape[2]) { + continue; + } + + for (var wWidth: u32 = 0u; wWidth < uniforms.w_shape[3]; wWidth++) { + let xWidth = xRCCorner.y + wWidth * uniforms.dilations[1]; + if (xWidth < 0u || xWidth >= uniforms.x_shape[3]) { + continue; + } + + let xVal = ${z.get("batch","input_channel","xHeight","xWidth")}; + let wVal = ${C.get("output_channel","wInChannel","wHeight","wWidth")}; + value += xVal * wVal; + } + } + } + `;return` + ${y.registerUniforms(I).declareVariables(...E,w)} + + ${y.mainStart()} + ${y.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let outputIndices = ${w.offsetToIndices("global_idx")}; + let batch: u32 = outputIndices[0]; + let output_channel: u32 = outputIndices[${c?3:1}]; + let xRCCorner: vec2 = vec2(outputIndices[${c?1:2}], outputIndices[${c?2:3}]) * uniforms.strides - uniforms.pads; + let group_id: u32 = output_channel * ${h} / uniforms.output_channels_per_group; + var in_channel_offset = group_id * uniforms.w_shape[${c?2:1}]; + + var value: ${w.type.value} = ${w.type.value}(0); + ${R} + ${a} + ${m} + ${w.setByOffset("global_idx","value")} + }`};return{name:"GroupedConv",shaderCache:{hint:`${t.cacheKey}_${h}`,inputDependencies:b},getRunData:()=>({outputs:[{dims:r?r(n):n,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(p/64)},programUniforms:f}),getShaderSource:g}},xD=(e,t,n,r)=>{let i=e.length>2,a=Ji(n[3]),o=Ji(n[2]),l=kn.size(n)/a/o,c=[e[0].dims[0],e[0].dims[1],e[0].dims[2],e[0].dims[3]/a],u=[e[1].dims[0],e[1].dims[1],e[1].dims[2],e[1].dims[3]/a],d=[n[0],n[1],n[2],n[3]/a],h=[{type:12,data:l},{type:6,data:[t.strides[0],t.strides[1]]},{type:6,data:[t.pads[0],t.pads[1]]}];Qp(t,h),h.push(...Jr(c,u,d));let p=(o-1)*t.strides[1]+u[1],f=b=>{let g=Vr("output",e[0].dataType,d.length,a),y=Qa(g.type.tensor),w=Zp(t,g.type.value,y),v=Wn("x",e[0].dataType,c.length,a),m=Wn("w",e[1].dataType,u.length,a),z=[v,m];i&&z.push(Wn("b",e[2].dataType,e[2].dims,a));let C=i?"value += b[output_channel];":"",E=[{name:"output_size",type:"u32"},{name:"strides",type:"i32",length:2},{name:"pads",type:"i32",length:2}];return ef(t,E),` + ${b.registerUniforms(E).declareVariables(...z,g)} + ${b.mainStart()} + ${b.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let width0 = uniforms.output_shape[3]; + let output_channel = global_idx % width0; + var index1 = global_idx / width0; + let width1 = uniforms.output_shape[2] / ${o}u; + let col = (index1 % width1) * ${o}u; + index1 = index1 / width1; + let row = index1 % uniforms.output_shape[1]; + let batch = index1 / uniforms.output_shape[1]; + + let x_corner = vec2(i32(row), i32(col)) * uniforms.strides - uniforms.pads; + + var x_vals: array<${v.type.value}, ${p}>; + var values: array<${g.type.value}, ${o}>; + let input_channel = output_channel; + // Use constant instead of uniform can give better performance for w's height/width. + for (var w_height: u32 = 0u; w_height < ${u[0]}; w_height++) { + let x_height = x_corner.x + i32(w_height); + if (x_height >= 0 && u32(x_height) < uniforms.x_shape[1]) { + for (var i = 0; i < ${p}; i++) { + let x_width = x_corner.y + i; + if (x_width >= 0 && u32(x_width) < uniforms.x_shape[2]) { + x_vals[i] = ${v.get("batch","u32(x_height)","u32(x_width)","input_channel")}; + } else { + x_vals[i] = ${v.type.value}(0); + } + } + for (var w_width: u32 = 0u; w_width < ${u[1]}; w_width++) { + let w_val = ${m.get("w_height","w_width","0","output_channel")}; + for (var i = 0u; i < ${o}u; i++) { + values[i] = fma(x_vals[i * u32(uniforms.strides[1]) + w_width], w_val, values[i]); + } + } + } + } + + for (var i = 0u; i < ${o}u; i++) { + var value = values[i]; + ${C} + ${w} + ${g.set("batch","row","col + i","output_channel","value")}; + } + }`};return{name:"GroupedConv-Vectorize",shaderCache:{hint:`${t.cacheKey};${a};${o};${p};${u[0]};${u[1]}`,inputDependencies:i?["rank","rank","type"]:["rank","rank"]},getRunData:()=>({outputs:[{dims:r?r(n):n,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(l/64)},programUniforms:h}),getShaderSource:f}}}),K8,py,X8,fy,p5,xz,Y8,J8,f5,fhe=dr(()=>{ws(),dhe(),hhe(),ES(),phe(),df(),NS(),Wh(),K8=(e,t,n,r,i,a)=>{let o=e[0],l=e.slice(a?1:2,a?3:4),c=l.length,u=t[0],d=t.slice(2).map((p,f)=>p+(p-1)*(n[f]-1)),h=l.map((p,f)=>p+r[f]+r[f+c]).map((p,f)=>Math.floor((p-d[f]+i[f])/i[f]));return h.splice(0,0,o),h.splice(a?3:1,0,u),h},py=[2,3,1,0],X8=(e,t)=>{if(!e||e.length!==2&&e.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(e[0].dims.length>5)throw new Error("greater than 5D is not supported");if(e[0].dims.length!==e[1].dims.length)throw new Error("filter does not have same dimension as input");let n=e[0].dims[t.format==="NHWC"?e[0].dims.length-1:1],r=e[1].dims[1]*t.group;if(n!==r)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");if(e.length===3&&(e[2].dims.length!==1||e[1].dims[0]!==e[2].dims[0]))throw new Error("invalid bias");let i=e[0].dims.length-2;if(t.dilations.length!==i)throw new Error(`dilations should be ${i}D`);if(t.strides.length!==i)throw new Error(`strides should be ${i}D`);if(t.pads.length!==i*2)throw new Error(`pads should be ${i*2}D`);if(t.kernelShape.length!==0&&t.kernelShape.length!==e[1].dims.length-2)throw new Error("invalid kernel shape")},fy=(e,t)=>{let n=e.kernelShape.slice();n.length{let t=SS(e),n=e.format,r=["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][e.auto_pad],i=e.dilations,a=e.group,o=e.kernel_shape,l=e.pads,c=e.strides,u=e.w_is_const();return{autoPad:r,format:n,dilations:i,group:a,kernelShape:o,pads:l,strides:c,wIsConst:u,...t,cacheKey:`${e.format};${t.activation};`}},xz=(e,t,n,r)=>{let i=n.format==="NHWC",a=K8(t[0].dims,t[1].dims,n.dilations,n.pads,n.strides,i);if(n.group!==1){let E=[t[0]];if(i){let I=e.kernelCustomData.wT??e.compute(jc(t[1],py),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];n.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=I),E.push(I)}else E.push(t[1]);t.length===3&&E.push(t[2]),!e.adapterInfo.isArchitecture("ampere")&&i&&t[1].dims[0]===n.group&&t[1].dims[1]===1&&n.dilations[0]===1&&n.dilations[1]===1?e.compute(xD(E,n,a,r),{inputs:E}):e.compute(gD(E,n,a,r),{inputs:E});return}let o=t.length===3,l=t[0].dims[i?1:2],c=t[0].dims[i?2:3],u=t[0].dims[i?3:1],d=t[1].dims[2],h=t[1].dims[3],p=a[i?1:2],f=a[i?2:3],b=a[i?3:1],g=i&&d===l&&h===c&&n.pads[0]===0&&n.pads[1]===0;if(g||d===1&&h===1&&n.dilations[0]===1&&n.dilations[1]===1&&n.strides[0]===1&&n.strides[1]===1&&n.pads[0]===0&&n.pads[1]===0){let E=a[0],I,R,A,O=[];if(i){let X=e.kernelCustomData.wT??e.compute(jc(t[1],py),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];if(n.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=X),g){let T=l*c*u;I=t[0].reshape([1,E,T]),R=X.reshape([1,T,b]),A=[1,E,b]}else I=t[0].reshape([E,l*c,u]),R=X.reshape([1,u,b]),A=[E,p*f,b];O.push(I),O.push(R)}else I=t[0].reshape([E,u,l*c]),R=t[1].reshape([1,b,u]),A=[E,b,p*f],O.push(R),O.push(I);o&&O.push(t[2]);let F=A[2],L=O[0].dims[O[0].dims.length-1];F<8&&L<8?e.compute(CS(O,n,a,A,i,r),{inputs:O}):e.compute(yw(O,n,a,A,i,r),{inputs:O});return}let y=!0,w=e.kernelCustomData.wT??e.compute(jc(t[1],py),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];n.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=w);let v=[t[0],w];o&&v.push(t[2]);let m=i?p*f:b,z=i?b:p*f,C=d*h*u;e.compute(pD(v,n,a,m,z,C,o,y,r),{inputs:v})},Y8=(e,t)=>{let n=t.format==="NHWC",r=[e.inputs[0].reshape(n?[e.inputs[0].dims[0],1,e.inputs[0].dims[1],e.inputs[0].dims[2]]:[e.inputs[0].dims[0],e.inputs[0].dims[1],1,e.inputs[0].dims[2]]),e.inputs[1].reshape([e.inputs[1].dims[0],e.inputs[1].dims[1],1,e.inputs[1].dims[2]])];e.inputs.length===3&&r.push(e.inputs[2]);let i=[0,t.pads[0],0,t.pads[1]],a=[1].concat(t.strides),o=[1].concat(t.dilations),l=[1].concat(t.kernelShape),c=fy({...t,pads:i,strides:a,dilations:o,kernelShape:l},r);xz(e,r,c,u=>n?[u[0],u[2],u[3]]:[u[0],u[1],u[3]])},J8=(e,t,n)=>{let r=n.format==="NHWC"?"channelsLast":"channelsFirst",i=fy(n,t),a=n.autoPad==="NOTSET"?n.pads:n.autoPad,o=fD(t[0].dims,t[1].dims,n.strides,n.dilations,a,!1,r);e.compute(mD(t,i,o.outShape,[o.filterDepth,o.filterHeight,o.filterWidth],[o.padInfo.front,o.padInfo.top,o.padInfo.left],r))},f5=(e,t)=>{if(X8(e.inputs,t),e.inputs[0].dims.length===3)Y8(e,t);else if(e.inputs[0].dims.length===5)J8(e,e.inputs,t);else{let n=fy(t,e.inputs);xz(e,e.inputs,n)}}}),bD,mhe=dr(()=>{ps(),V0(),ws(),Ss(),bD=(e,t,n)=>{let r=e.length>2,i=t.outputShape,a=t.format==="NHWC",o=t.group,l=e[1].dims,c=l[2]/o,u=l[3],d=a?Ji(c):1,h=a?Ji(u):1,p=a?u===1?d:h:1,f=kn.size(i)/h,b=[Math.ceil(f/64),1,1];Us("verbose",()=>`[conv2d_backprop_webgpu] dispatch = ${b}`);let g=["rank","rank"],y=[t.strides[0],t.strides[1]],w=[t.kernelShape[a?1:2],t.kernelShape[a?2:3]],v=[t.dilations[0],t.dilations[1]],m=[w[0]+(t.dilations[0]<=1?0:(t.kernelShape[a?1:2]-1)*(t.dilations[0]-1)),w[1]+(t.dilations[1]<=1?0:(t.kernelShape[a?2:3]-1)*(t.dilations[1]-1))],z=[m[0]-1-Math.floor((t.pads[0]+t.pads[2])/2),m[1]-1-Math.floor((t.pads[1]+t.pads[3])/2)],C=[{type:12,data:f},{type:12,data:y},{type:12,data:w},{type:12,data:v},{type:12,data:m},{type:6,data:z},{type:12,data:c},{type:12,data:u},...Jr(e[0].dims,e[1].dims)];r&&(C.push(...Jr(e[2].dims)),g.push("rank")),C.push(...Jr(i));let E=I=>{let R=[{name:"output_size",type:"u32"},{name:"strides",type:"u32",length:y.length},{name:"filter_dims",type:"u32",length:w.length},{name:"dilations",type:"u32",length:w.length},{name:"effective_filter_dims",type:"u32",length:m.length},{name:"pads",type:"i32",length:z.length},{name:"input_channels_per_group",type:"u32"},{name:"output_channels_per_group",type:"u32"}],A=Qa(e[0].dataType),O=a?1:2,F=a?2:3,L=a?3:1,X=Wn("W",e[1].dataType,e[1].dims.length,p),T=Wn("Dy",e[0].dataType,e[0].dims.length,d),q=[T,X];r&&q.push(Wn("bias",e[2].dataType,[i[L]].length,h));let H=Vr("result",e[0].dataType,i.length,h),J=()=>{let B="";if(d===1)B+=` + let w_offset = ${X.indicesToOffset(`${X.type.indices}(u32(wRPerm), u32(wCPerm), inputChannel, wOutChannel)`)}; + let wValue = ${X.getByOffset(`w_offset / ${p}`)}; + dotProd = dotProd + xValue * wValue;`;else if(u===1)B+=` + let wValue = ${X.getByOffset(`${X.indicesToOffset(`${X.type.indices}(u32(wRPerm), u32(wCPerm), inputChannel, wOutChannel)`)} / ${p}`)}; + dotProd = dotProd + dot(xValue, wValue);`;else for(let V=0;V(i32(r), i32(c)) - uniforms.pads; + let dyRCorner = dyCorner.x; + let dyCCorner = dyCorner.y; + let groupId = d1 / uniforms.output_channels_per_group; + let wOutChannel = d1 - groupId * uniforms.output_channels_per_group; + // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1). + // ? = to be determined. : = across all values in that axis. + var dotProd = ${H.type.value}(0.0); + var wR: u32 = 0; + if (uniforms.dilations.x == 1) { + // Minimum wR >= 0 that satisfies (dyRCorner + wR) % (uniforms.strides.x) == 0 + wR = u32(((dyRCorner + i32(uniforms.strides.x) - 1) / i32(uniforms.strides.x)) * i32(uniforms.strides.x) - dyRCorner); + } + for (; wR < uniforms.effective_filter_dims.x; wR = wR + 1) { + if (wR % uniforms.dilations.x != 0) { + continue; + } + let dyR = (${A}(dyRCorner) + ${A}(wR)) / ${A}(uniforms.strides[0]); + let wRPerm = uniforms.filter_dims.x - 1 - wR / uniforms.dilations.x; + if (dyR < 0.0 || dyR >= ${A}(uniforms.Dy_shape[${O}]) || fract(dyR) > 0.0 || + wRPerm < 0) { + continue; + } + let idyR: u32 = u32(dyR); + var wC: u32 = 0; + if (uniforms.dilations.y == 1) { + // Minimum wC >= 0 that satisfies (dyCCorner + wC) % (uniforms.strides.y) == 0 + wC = u32(((dyCCorner + i32(uniforms.strides.y) - 1) / i32(uniforms.strides.y)) * i32(uniforms.strides.y) - dyCCorner); + } + + for (; wC < uniforms.effective_filter_dims.y; wC = wC + 1) { + if (wC % uniforms.dilations.y != 0) { + continue; + } + let dyC = (${A}(dyCCorner) + ${A}(wC)) / ${A}(uniforms.strides.y); + let wCPerm = uniforms.filter_dims.y - 1 - wC / uniforms.dilations.y; + if (dyC < 0.0 || dyC >= ${A}(uniforms.Dy_shape[${F}]) || + fract(dyC) > 0.0 || wCPerm < 0) { + continue; + } + let idyC: u32 = u32(dyC); + var inputChannel = groupId * uniforms.input_channels_per_group; + for (var d2: u32 = 0; d2 < uniforms.input_channels_per_group; d2 = d2 + ${d}) { + let xValue = ${a?T.getByOffset(`${T.indicesToOffset(`${T.type.indices}(batch, idyR, idyC, inputChannel)`)} / ${d}`):T.get("batch","inputChannel","idyR","idyC")}; + ${J()} + inputChannel = inputChannel + ${d}; + } + wC = wC + uniforms.strides.y - 1; + } + wR = wR + uniforms.strides[0] - 1; + } + let value = dotProd${r?` + bias[d1 / ${h}]`:""}; + ${H.setByOffset("global_idx","value")}; + `;return` + ${I.registerUniforms(R).declareVariables(...q,H)} + ${I.mainStart()} + ${I.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")}; + ${Z}}`};return{name:"ConvTranspose2D",shaderCache:{hint:`${t.cacheKey};${d}${p}${h}${u===1}`,inputDependencies:g},getRunData:()=>({dispatchGroup:{x:b[0],y:b[1],z:b[2]},outputs:[{dims:n?n(i):i,dataType:e[0].dataType}],programUniforms:C}),getShaderSource:E}}}),Z8,Q8,eT,bz,yD,tT,yz,nT,vD,ghe=dr(()=>{mhe(),df(),Wh(),Z8=(e,t,n,r,i,a)=>(e-1)*t+n+(r-1)*i+1-a,Q8=(e,t,n,r,i)=>{let a=Math.floor(e/2);t==="SAME_UPPER"?(n[r]=a,n[i]=e-a):t==="SAME_LOWER"&&(n[r]=e-a,n[i]=a)},eT=(e,t,n,r,i,a,o,l,c,u)=>{let d=e.length-2,h=u.length===0;c.length{let n=e.kernelShape.slice();if(e.kernelShape.length===0||e.kernelShape.reduce((h,p)=>h*p,1)===0){n.length=0;for(let h=2;hh+p,0)===0){let h=t[0].dims.length-2;c=new Array(h).fill(1)}let u=e.strides.slice();if(u.reduce((h,p)=>h+p,0)===0){let h=t[0].dims.length-2;u=new Array(h).fill(1)}eT(l,n,c,e.autoPad,e.group,i,u,r,o,a);let d=Object.assign({},e);return Object.assign(d,{kernelShape:n,pads:i,outputPadding:o,outputShape:a,dilations:c,strides:u}),d},yD=e=>{let t=SS(e),n=e.format,r=["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][typeof e.autoPad>"u"?0:e.autoPad],i=e.dilations,a=e.group,o=e.kernelShape,l=e.pads,c=e.strides,u=e.wIsConst(),d=e.outputPadding,h=e.outputShape;return{autoPad:r,format:n,dilations:i,group:a,kernelShape:o,outputPadding:d,outputShape:h,pads:l,strides:c,wIsConst:u,...t,cacheKey:`${e.format};${t.activation};`}},tT=(e,t)=>{if(!e||e.length!==2&&e.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(e[0].dims.length!==4&&e[0].dims.length!==3)throw new Error("currently only support 2-dimensional conv");if(e[0].dims.length!==e[1].dims.length)throw new Error("filter does not have same dimension as input");let n=e[0].dims[t.format==="NHWC"?e[0].dims.length-1:1],r=e[1].dims[0];if(n!==r)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");let i=e[1].dims[1]*t.group;if(e.length===3&&(e[2].dims.length!==1||e[2].dims[0]!==i))throw new Error("invalid bias");let a=e[0].dims.length-2;if(t.dilations.reduce((o,l)=>o+l,0)>0&&t.dilations.length!==a)throw new Error(`dilations should be ${a}D`);if(t.strides.reduce((o,l)=>o+l,0)>0&&t.strides.length!==a)throw new Error(`strides should be ${a}D`);if(t.pads.reduce((o,l)=>o+l,0)>0&&t.pads.length!==a*2)throw new Error(`pads should be ${a*2}D`);if(t.outputPadding.length!==a&&t.outputPadding.length!==0)throw new Error(`output_padding should be ${a}D`);if(t.kernelShape.reduce((o,l)=>o+l,0)>0&&t.kernelShape.length!==0&&t.kernelShape.length!==e[1].dims.length-2)throw new Error("invalid kernel shape");if(t.outputShape.length!==0&&t.outputShape.length!==e[0].dims.length-2)throw new Error("invalid output shape")},yz=(e,t,n,r)=>{let i=e.kernelCustomData.wT??e.compute(jc(t[1],[2,3,0,1]),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];n.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=i);let a=[t[0],i];t.length===3&&a.push(t[2]),e.compute(bD(a,n,r),{inputs:a})},nT=(e,t)=>{let n=t.format==="NHWC",r=[e.inputs[0].reshape(n?[e.inputs[0].dims[0],1,e.inputs[0].dims[1],e.inputs[0].dims[2]]:[e.inputs[0].dims[0],e.inputs[0].dims[1],1,e.inputs[0].dims[2]]),e.inputs[1].reshape([e.inputs[1].dims[0],e.inputs[1].dims[1],1,e.inputs[1].dims[2]])];e.inputs.length===3&&r.push(e.inputs[2]);let i=t.kernelShape;(i.length===0||i[0]===0)&&(i=[e.inputs[1].dims[2]]);let a=t.dilations;(a.length===0||a[0]===0)&&(a=[1]);let o=t.strides;(o.length===0||o[0]===0)&&(o=[1]);let l=t.pads;l.length===0&&(l=[0,0]),l=[0,l[0],0,l[1]],o=[1].concat(o),a=[1].concat(a),i=[1].concat(i);let c=t.outputPadding;c=[0].concat(c);let u=bz({...t,pads:l,strides:o,dilations:a,kernelShape:i,outputPadding:c},r);yz(e,r,u,d=>n?[d[0],d[2],d[3]]:[d[0],d[1],d[3]])},vD=(e,t)=>{if(tT(e.inputs,t),e.inputs[0].dims.length===3)nT(e,t);else{let n=bz(t,e.inputs);yz(e,e.inputs,n)}}}),rT,wD,_D,xhe=dr(()=>{ps(),ws(),la(),Ss(),rT=(e,t,n,r)=>{let i=kn.size(t),a=t.length,o=Wn("input",e,a),l=Vr("output",e,a),c=n.dataType===6?n.getInt32Array()[0]:Number(n.getBigInt64Array()[0]),u=kn.normalizeAxis(c,a),d=h=>{let p=` i32(${o.indicesGet("inputIndices","uniforms.axis")}) `,f=qr("uniforms.input_shape","uniforms.axis",a),b=r.reverse?p+(r.exclusive?" + 1":""):"0",g=r.reverse?f:p+(r.exclusive?"":" + 1");return` + ${h.registerUniform("outputSize","u32").registerUniform("axis","u32").declareVariables(o,l)} + ${h.mainStart()} + ${h.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + var inputIndices = ${l.offsetToIndices("global_idx")}; + var sum = ${l.type.value}(0); + let first : i32 = ${b}; + let last : i32 = ${g}; + for (var i : i32 = first; i < last; i++) { + ${o.indicesSet("inputIndices","uniforms.axis","u32(i)")}; + sum = sum + ${o.getByIndices("inputIndices")}; + } + ${l.setByOffset("global_idx","sum")}; + }`};return{name:"CumSum",shaderCache:{hint:r.cacheKey,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:t,dataType:e}],dispatchGroup:{x:Math.ceil(i/64)},programUniforms:[{type:12,data:i},{type:12,data:u},...Jr(t,t)]}),getShaderSource:d}},wD=(e,t)=>{let n=e.inputs[0].dims,r=e.inputs[0].dataType,i=e.inputs[1];e.compute(rT(r,n,i,t),{inputs:[0]})},_D=e=>{let t=e.exclusive===1,n=e.reverse===1;return fi({exclusive:t,reverse:n})}}),sT,iT,aT,zD,$D,bhe=dr(()=>{ps(),ws(),la(),Ss(),sT=e=>{if(!e||e.length!==1)throw new Error("DepthToSpace requires 1 input.");if(e[0].dims.length!==4)throw new Error("DepthToSpace requires 4D input.")},iT=(e,t,n,r)=>{let i=[];i.push(`fn perm(i: ${r.type.indices}) -> ${n.type.indices} { + var a: ${n.type.indices};`);for(let a=0;a{let n,r,i,a,o,l,c=t.format==="NHWC",u=t.blocksize,d=t.mode==="DCR";c?([n,r,i,a]=e.dims,o=d?[n,r,i,u,u,a/u**2]:[n,r,i,a/u**2,u,u],l=d?[0,1,3,2,4,5]:[0,1,4,2,5,3]):([n,r,i,a]=[e.dims[0],e.dims[2],e.dims[3],e.dims[1]],o=d?[n,u,u,a/u**2,r,i]:[n,a/u**2,u,u,r,i],l=d?[0,3,4,1,5,2]:[0,1,4,2,5,3]);let h=e.reshape(o),p=h.dims.length,f=e.dataType,b=Wn("a",f,p),g=Vr("output",f,p),y=w=>` + ${w.registerUniform("output_size","u32").declareVariables(b,g)} + + ${iT(l,p,b,g)} + + ${w.mainStart()} + ${w.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let indices = ${g.offsetToIndices("global_idx")}; + let aIndices = perm(indices); + + ${g.setByOffset("global_idx",b.getByIndices("aIndices"))} + }`;return{name:"DepthToSpace",shaderCache:{hint:`${e.dims};${t.blocksize};${t.mode}`,inputDependencies:["rank"]},getRunData:w=>{let v=c?[n,r*u,i*u,a/u**2]:[n,a/u**2,r*u,i*u],m=kn.size(v),z=h.dims,C=kn.sortBasedOnPerm(z,l);return{outputs:[{dims:v,dataType:w[0].dataType}],dispatchGroup:{x:Math.ceil(m/64)},programUniforms:[{type:12,data:m},...Jr(z,C)]}},getShaderSource:y}},zD=(e,t)=>{sT(e.inputs),e.compute(aT(e.inputs[0],t))},$D=e=>fi({blocksize:e.blocksize,mode:e.mode,format:e.format})}),my,qg,vz,oT,lT,cT,uT,wz,dT,SD,jD,yhe=dr(()=>{ps(),ws(),la(),Ss(),my="[a-zA-Z]|\\.\\.\\.",qg="("+my+")+",vz="^"+qg+"$",oT="("+qg+",)*"+qg,lT="^"+oT+"$",cT=class{constructor(e=-1){this.symbolToIndices=new Map,this.inputIndex=e}addSymbol(e,t){let n=this.symbolToIndices.get(e);n===void 0?n=[t]:n.push(t),this.symbolToIndices.set(e,n)}},uT=class{constructor(e,t){var i;this.equation=t,this.hasEllipsis=!1,this.symbolToInfo=new Map,this.lhs=new Array,this.outputDims=[];let[n,r]=t.includes("->")?t.split("->",2):[t,""];if(!n.match(RegExp(lT)))throw new Error("Invalid LHS term");if(n.split(",").forEach((a,o)=>{let l=e[o].dims.slice();if(!a.match(RegExp(vz)))throw new Error("Invalid LHS term");let c=this.processTerm(a,!0,l,o);this.lhs.push(c)}),r==="")r+=[...this.symbolToInfo.entries()].filter(([a,o])=>o.count===1||a==="...").map(([a])=>a).join("");else if(!r.match(RegExp(qg)))throw new Error("Invalid RHS");(i=r.match(RegExp(my,"g")))==null||i.forEach(a=>{if(a==="...")this.outputDims=this.outputDims.concat(this.ellipsisDims);else{let o=this.symbolToInfo.get(a);if(o===void 0)throw new Error("Invalid RHS symbol");this.outputDims.push(o.dimValue)}}),this.rhs=this.processTerm(r,!1,this.outputDims)}addSymbol(e,t,n){let r=this.symbolToInfo.get(e);if(r!==void 0){if(r.dimValue!==t&&r.count!==1)throw new Error("Dimension mismatch");r.count++,r.inputIndices.push(n)}else r={count:1,dimValue:t,inputIndices:[n]};this.symbolToInfo.set(e,r)}processTerm(e,t,n,r=-1){let i=n.length,a=!1,o=[],l=0;if(!e.match(RegExp(vz))&&!t&&e!=="")throw new Error("Invalid LHS term");let c=e.match(RegExp(my,"g")),u=new cT(r);return c==null||c.forEach((d,h)=>{if(d==="..."){if(a)throw new Error("Only one ellipsis is allowed per input term");a=!0;let p=i-c.length+1;if(p<0)throw new Error("Ellipsis out of bounds");if(o=n.slice(l,l+p),this.hasEllipsis){if(this.ellipsisDims.length!==o.length||this.ellipsisDims.toString()!==o.toString())throw new Error("Ellipsis dimensions mismatch")}else if(t)this.hasEllipsis=!0,this.ellipsisDims=o;else throw new Error("Ellipsis must be specified in the LHS");for(let f=0;fe+"_max",dT=(e,t,n,r)=>{let i=e.map(u=>u.length).map((u,d)=>Wn(`input${d}`,t,u)),a=kn.size(r),o=Vr("output",t,r.length),l=[...n.symbolToInfo.keys()].filter(u=>!n.rhs.symbolToIndices.has(u)),c=u=>{let d=[],h="var prod = 1.0;",p="var sum = 0.0;",f="sum += prod;",b=[],g=[],y=[],w=[],v=n.symbolToInfo.size===n.rhs.symbolToIndices.size;n.symbolToInfo.forEach((z,C)=>{var E;if(n.rhs.symbolToIndices.has(C)){let I=(E=n.rhs.symbolToIndices.get(C))==null?void 0:E[0];I!==void 0&&n.lhs.forEach((R,A)=>{if(z.inputIndices.includes(A)){let O=R.symbolToIndices.get(C);if(O===void 0)throw new Error("Invalid symbol error");O.forEach(F=>{d.push(`${i[A].indicesSet(`input${A}Indices`,F,o.indicesGet("outputIndices",I))}`)})}})}else n.lhs.forEach((I,R)=>{if(z.inputIndices.includes(R)){let A=I.symbolToIndices.get(C);if(A===void 0)throw new Error("Invalid symbol error");A.forEach(O=>{b.push(`${i[R].indicesSet(`input${R}Indices`,O,`${C}`)}`)}),w.push(`prod *= ${i[R].getByIndices(`input${R}Indices`)};`)}}),g.push(`for(var ${C}: u32 = 0; ${C} < uniforms.${wz(C)}; ${C}++) {`),y.push("}")});let m=v?[...d,`let sum = ${i.map((z,C)=>z.getByIndices(`input${C}Indices`)).join(" * ")};`]:[...d,p,...g,...b,h,...w,f,...y];return` + ${u.registerUniforms(l.map(z=>({name:`${wz(z)}`,type:"u32"}))).registerUniform("outputSize","u32").declareVariables(...i,o)} + + ${u.mainStart()} + ${u.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + var outputIndices = ${o.offsetToIndices("global_idx")}; + ${i.map((z,C)=>`var input${C}Indices: ${i[C].type.indices};`).join(` +`)} + ${m.join(` +`)}; + ${o.setByOffset("global_idx","sum")}; + }`};return{name:"Einsum",shaderCache:{hint:n.equation,inputDependencies:e.map(()=>"rank")},getRunData:()=>{let u=l.filter(h=>n.symbolToInfo.has(h)).map(h=>{var p;return{type:12,data:((p=n.symbolToInfo.get(h))==null?void 0:p.dimValue)||0}});u.push({type:12,data:a});let d=e.map((h,p)=>[...Jr(h)]).reduce((h,p)=>h.concat(p),u);return d.push(...Jr(r)),{outputs:[{dims:r,dataType:t}],dispatchGroup:{x:Math.ceil(a/64)},programUniforms:d}},getShaderSource:c}},SD=(e,t)=>{let n=new uT(e.inputs,t.equation),r=n.outputDims,i=e.inputs.map((a,o)=>a.dims);e.compute(dT(i,e.inputs[0].dataType,n,r))},jD=e=>{let t=e.equation.replace(/\s+/g,"");return fi({equation:t})}}),hT,_z,pT,fT,CD,vhe=dr(()=>{ps(),ws(),Ss(),hT=e=>{if(!e||e.length!==2)throw new Error("Expand requires 2 input.");let t=e[0].dims,n=Array.from(e[1].getBigInt64Array(),Number),r=n.length{let n=e.length-t.length,r=[];for(let i=0;ie.length>t.length?_z(e,t):_z(t,e),fT=e=>{let t=e[0].dims,n=Array.from(e[1].getBigInt64Array(),Number),r=pT(t,n),i=e[0].dataType,a=i===9||kn.size(t)===1,o=i===9||t.length>0&&t[t.length-1]%4===0?4:1,l=a||r.length>0&&r[r.length-1]%4===0?4:1,c=Math.ceil(kn.size(r)/l),u=h=>{let p=Wn("input",i,t.length,o),f=Vr("output",i,r.length,l),b;if(i===9){let g=(y,w,v="")=>` + let outputIndices${w} = ${f.offsetToIndices(`outputOffset + ${w}u`)}; + let offset${w} = ${p.broadcastedIndicesToOffset(`outputIndices${w}`,f)}; + let index${w} = offset${w} / 4u; + let component${w} = offset${w} % 4u; + ${y}[${w}] = ${v}(${p.getByOffset(`index${w}`)}[component${w}]); + `;b=` + let outputOffset = global_idx * ${l}; + var data = vec4(0); + ${g("data",0,"u32")} + ${g("data",1,"u32")} + ${g("data",2,"u32")} + ${g("data",3,"u32")} + ${f.setByOffset("global_idx","data")} + }`}else b=` + let outputIndices = ${f.offsetToIndices(`global_idx * ${l}`)}; + let inputOffset = ${p.broadcastedIndicesToOffset("outputIndices",f)}; + let data = ${f.type.value}(${p.getByOffset(`inputOffset / ${o}`)}); + ${f.setByOffset("global_idx","data")} + }`;return` + ${h.registerUniform("vec_size","u32").declareVariables(p,f)} + ${h.mainStart()} + ${h.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + ${b}`},d=[{type:12,data:c},...Jr(t,r)];return{name:"Expand",shaderCache:{hint:`${r.length};${o}${l}`,inputDependencies:["rank"]},getShaderSource:u,getRunData:()=>({outputs:[{dims:r,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(c/64)},programUniforms:d})}},CD=e=>{hT(e.inputs),e.compute(fT(e.inputs),{inputs:[0]})}}),mT,ND,whe=dr(()=>{ps(),ws(),Ss(),$S(),mT=e=>{let t=e[0].dataType,n=kn.size(e[0].dims),r=kn.size(e[1].dims),i=r%4===0,a=o=>{let l=Wn("x",t,[1],4),c=Wn("bias",t,[1],4),u=Vr("y",t,[1],4),d=[{name:"output_vec_size",type:"u32"},{name:"bias_size",type:"u32"}],h=f=>` + let bias${f}_offset: u32 = (global_idx * 4 + ${f}) % uniforms.bias_size; + let bias${f} = ${c.getByOffset(`bias${f}_offset / 4`)}[bias${f}_offset % 4];`,p=i?` + let bias = ${c.getByOffset("global_idx % (uniforms.bias_size / 4)")};`:`${h(0)}${h(1)}${h(2)}${h(3)} + let bias = ${l.type.value}(bias0, bias1, bias2, bias3);`;return`${o.registerUniforms(d).declareVariables(l,c,u)} + + ${c5(Uo(t))} + + ${o.mainStart(km)} + ${o.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_vec_size")} + + let x = ${l.getByOffset("global_idx")}; + ${p} + let x_in = x + bias; + ${u.setByOffset("global_idx",u5("x_in"))} + }`};return{name:"FastGeluWithBias",shaderCache:{hint:`${i}`,inputDependencies:["type","type"]},getShaderSource:a,getRunData:o=>({outputs:[{dims:o[0].dims,dataType:o[0].dataType}],programUniforms:[{type:12,data:Math.ceil(n/4)},{type:12,data:r}],dispatchGroup:{x:Math.ceil(n/km/4)}})}},ND=e=>{e.inputs.length<2||kn.size(e.inputs[1].dims)===0?KW(e):e.compute(mT(e.inputs))}}),gT,xT,ED,ID,_he=dr(()=>{ps(),ws(),la(),Ss(),gT=e=>{if(!e||e.length!==2)throw new Error("Gather requires 2 inputs.")},xT=(e,t)=>{let n=e[0].dims,r=e[1].dims,i=n.length,a=kn.normalizeAxis(t.axis,i),o=n.slice(0);o.splice(a,1,...r);let l=n[a],c=e[0].dataType===9?4:1,u=Math.ceil(kn.size(o)/c),d=[{type:12,data:u},{type:6,data:l},{type:12,data:a},...Jr(e[0].dims,e[1].dims,o)],h=p=>{let f=Wn("data",e[0].dataType,e[0].dims.length,c),b=Wn("inputIndices",e[1].dataType,e[1].dims.length),g=Vr("output",e[0].dataType,o.length,c),y=v=>{let m=r.length,z=`var indicesIndices${v} = ${b.type.indices}(0);`;for(let C=0;C1?`indicesIndices${v}[${C}]`:`indicesIndices${v}`} = ${o.length>1?`outputIndices${v}[uniforms.axis + ${C}]`:`outputIndices${v}`};`;z+=` + var idx${v} = ${b.getByIndices(`indicesIndices${v}`)}; + if (idx${v} < 0) { + idx${v} = idx${v} + uniforms.axisDimLimit; + } + var dataIndices${v} : ${f.type.indices}; + `;for(let C=0,E=0;C1?`dataIndices${v}[${C}]`:`dataIndices${v}`} = u32(idx${v});`,E+=m):(z+=`${i>1?`dataIndices${v}[${C}]`:`dataIndices${v}`} = ${o.length>1?`outputIndices${v}[${E}]`:`outputIndices${v}`};`,E++);return z},w;if(e[0].dataType===9){let v=(m,z,C="")=>` + let outputIndices${z} = ${g.offsetToIndices(`outputOffset + ${z}u`)}; + ${y(z)}; + let offset${z} = ${f.indicesToOffset(`dataIndices${z}`)}; + let index${z} = offset${z} / 4u; + let component${z} = offset${z} % 4u; + ${m}[${z}] = ${C}(${f.getByOffset(`index${z}`)}[component${z}]); + `;w=` + let outputOffset = global_idx * ${c}; + var value = vec4(0); + ${v("value",0,"u32")} + ${v("value",1,"u32")} + ${v("value",2,"u32")} + ${v("value",3,"u32")} + ${g.setByOffset("global_idx","value")} + `}else w=` + let outputIndices = ${g.offsetToIndices("global_idx")}; + ${y("")}; + let value = ${f.getByIndices("dataIndices")}; + ${g.setByOffset("global_idx","value")}; + `;return` + ${p.registerUniform("outputSize","u32").registerUniform("axisDimLimit","i32").registerUniform("axis","u32").declareVariables(f,b,g)} + ${p.mainStart()} + ${p.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + ${w} + }`};return{name:"Gather",shaderCache:{hint:t.cacheKey,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:o,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(u/64)},programUniforms:d}),getShaderSource:h}},ED=e=>fi({axis:e.axis}),ID=(e,t)=>{let n=e.inputs;gT(n),e.compute(xT(e.inputs,t))}}),bT,kD,AD,zhe=dr(()=>{ps(),ws(),Ss(),bT=(e,t,n,r,i,a,o,l,c)=>{let u=[{type:12,data:a},{type:12,data:r},{type:12,data:i},{type:12,data:n},{type:12,data:o},{type:12,data:l},{type:12,data:c}],d=[a];u.push(...Jr(t.dims,d));let h=p=>{let f=Wn("indices_data",t.dataType,t.dims.length),b=Vr("input_slice_offsets_data",12,1,1),g=[f,b],y=[{name:"output_size",type:"u32"},{name:"batch_dims",type:"u32"},{name:"input_dims",type:"u32",length:i.length},{name:"sizes_from_slice_dims_data",type:"u32",length:n.length},{name:"num_slices_per_batch",type:"u32"},{name:"input_batch_stride",type:"u32"},{name:"num_slice_dims",type:"u32"}];return` + ${p.registerUniforms(y).declareVariables(...g)} + ${p.mainStart()} + ${p.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let batch_idx = global_idx / uniforms.num_slices_per_batch; + let base_offset = batch_idx * uniforms.input_batch_stride; + + let slice_indices_base_offset = global_idx * uniforms.num_slice_dims; + var relative_slice_offset = 0; + for (var dim_idx = 0u; dim_idx < uniforms.num_slice_dims; dim_idx ++) { + var index = i32(indices_data[dim_idx + slice_indices_base_offset].x); + let input_dim_idx = uniforms.batch_dims + dim_idx; + if (index < 0) { + ${i.length===1?"index += i32(uniforms.input_dims);":"index += i32(uniforms.input_dims[input_dim_idx]);"} + } + ${n.length===1?"relative_slice_offset += index * i32(uniforms.sizes_from_slice_dims_data);":"relative_slice_offset += index * i32(uniforms.sizes_from_slice_dims_data[dim_idx]);"} + } + + input_slice_offsets_data[global_idx] = base_offset + u32(relative_slice_offset); + }`};return e.compute({name:"computeSliceOffsets",shaderCache:{hint:`${i.length}_${n.length}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:d,dataType:e.inputs[1].dataType}],dispatchGroup:{x:Math.ceil(a/64)},programUniforms:u}),getShaderSource:h},{inputs:[t],outputs:[-1]})[0]},kD=(e,t)=>{let n=e.inputs,r=n[0].dims,i=n[0].dataType,a=n[1].dims,o=a[a.length-1],l=kn.sizeToDimension(a,a.length-1),c=kn.sizeFromDimension(r,t.batchDims+o),u=kn.sizeToDimension(r,t.batchDims),d=kn.sizeFromDimension(r,t.batchDims),h=l/u,p=new Array(o),f=c;for(let z=0;zr.length)throw new Error("last dimension of indices must not be larger than rank of input tensor");let y=a.slice(0,-1).concat(r.slice(g)),w=kn.size(y),v=[{type:12,data:w},{type:12,data:c},...Jr(n[0].dims,b.dims,y)],m=z=>{let C=Wn("data",n[0].dataType,n[0].dims.length),E=Wn("slice_offsets",12,b.dims.length),I=Vr("output",n[0].dataType,y.length);return` + ${z.registerUniform("output_size","u32").registerUniform("slice_size","u32").declareVariables(C,E,I)} + ${z.mainStart()} + ${z.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let slice_offset = slice_offsets[global_idx / uniforms.slice_size]; + output[global_idx] = data[u32(slice_offset) + global_idx % uniforms.slice_size]; + }`};e.compute({name:"GatherND",shaderCache:{hint:t.cacheKey,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:y,dataType:i}],dispatchGroup:{x:Math.ceil(w/64)},programUniforms:v}),getShaderSource:m},{inputs:[n[0],b]})},AD=e=>({batchDims:e.batch_dims,cacheKey:""})}),yT,vT,MD,TD,$he=dr(()=>{ps(),ws(),la(),Ss(),yT=(e,t)=>{if(e.length<3||e.length>4)throw new Error("GatherBlockQuantized requires 3 or 4 inputs.");let n=kn.normalizeAxis(t.quantizeAxis,e[0].dims.length),r=t.blockSize,i=e[0],a=e[2],o=e.length===4?e[3]:void 0;if(a.dims.length!==i.dims.length||!i.dims.map((l,c)=>c===n?Math.ceil(l/r)===a.dims[c]:l===a.dims[c]).reduce((l,c)=>l&&c,!0))throw new Error("Scales must have the same rank as the input tensor and the dims should match except on gatherAxis.");if(o){if(o.dataType!==i.dataType)throw new Error("Zero point must have the same data type as the input tensor.");if(o.dims.length!==a.dims.length||!o.dims.map((l,c)=>l===a.dims[c]).reduce((l,c)=>l&&c,!0))throw new Error("Zero point must have the same rank as the input tensor and the dims should match except on quantizeAxis.")}},vT=(e,t)=>{let n=e[0].dims,r=e[1].dims,i=n.length,a=kn.normalizeAxis(t.gatherAxis,i),o=kn.normalizeAxis(t.quantizeAxis,i),l=n.slice(0);l.splice(a,1,...r);let c=kn.size(l),u=e[2].dataType,d=e[0].dataType===22,h=[{type:12,data:c},{type:12,data:o},{type:12,data:a},{type:12,data:t.blockSize},...Jr(...e.map((f,b)=>f.dims),l)],p=f=>{let b=Wn("data",e[0].dataType,e[0].dims.length),g=Wn("inputIndices",e[1].dataType,e[1].dims.length),y=Wn("scales",e[2].dataType,e[2].dims.length),w=e.length>3?Wn("zeroPoint",e[3].dataType,e[3].dims.length):void 0,v=Vr("output",u,l.length),m=[b,g,y];w&&m.push(w);let z=[{name:"output_size",type:"u32"},{name:"quantize_axis",type:"u32"},{name:"gather_axis",type:"u32"},{name:"block_size",type:"u32"}];return` + ${f.registerUniforms(z).declareVariables(...m,v)} + ${f.mainStart()} + let output_indices = ${v.offsetToIndices("global_idx")}; + var indices_indices = ${g.type.indices}(0); + ${r.length>1?` + for (var i: u32 = 0; i < ${r.length}; i++) { + let index = ${v.indicesGet("output_indices","uniforms.gather_axis + i")}; + ${g.indicesSet("indices_indices","i","index")}; + }`:`indices_indices = ${v.indicesGet("output_indices","uniforms.gather_axis")};`}; + var data_indices = ${b.type.indices}(0); + for (var i: u32 = 0; i < uniforms.gather_axis; i++) { + let index = ${v.indicesGet("output_indices","i")}; + ${b.indicesSet("data_indices","i","index")}; + } + var index_from_indices = ${g.getByIndices("indices_indices")}; + if (index_from_indices < 0) { + index_from_indices += ${n[a]}; + } + ${b.indicesSet("data_indices","uniforms.gather_axis","u32(index_from_indices)")}; + for (var i = uniforms.gather_axis + 1; i < ${l.length}; i++) { + let index = ${v.indicesGet("output_indices",`i + ${r.length} - 1`)}; + ${b.indicesSet("data_indices","i","index")}; + } + let data_offset = ${b.indicesToOffset("data_indices")}; + let data_index = data_offset % 8; + // Convert 4-bit packed data to 8-bit packed data. + let packed_4bit_quantized_data = ${b.getByOffset("data_offset / 8")}; + let packed_8bit_quantized_data = (packed_4bit_quantized_data >> (4 * (data_index % 2))) & 0x0f0f0f0f; + let quantized_data_vec = ${d?"unpack4xI8":"unpack4xU8"}(u32(packed_8bit_quantized_data)); + let quantized_data = quantized_data_vec[data_index / 2]; + var scale_indices = data_indices; + let quantize_axis_index = ${y.indicesGet("data_indices","uniforms.quantize_axis")} / uniforms.block_size; + ${y.indicesSet("scale_indices","uniforms.quantize_axis","quantize_axis_index")}; + var scale = ${y.getByIndices("scale_indices")}; + ${w?` + let zero_point_indices = scale_indices; + let zero_point_offset = ${w.indicesToOffset("zero_point_indices")}; + let zero_point_index = zero_point_offset % 8; + let packed_4bit_zero_points = ${w.getByOffset("zero_point_offset / 8")}; + let packed_8bit_zero_points = (packed_4bit_zero_points >> (4 * (zero_point_index % 2))) & 0x0f0f0f0f; + let zero_point_vec = ${d?"unpack4xI8":"unpack4xU8"}(u32(packed_8bit_zero_points)); + let zero_point = zero_point_vec[zero_point_index / 2];`:"var zero_point = 0"}; + let dequantized_data = ${Uo(u)}(quantized_data - zero_point) * scale; + ${v.setByOffset("global_idx","dequantized_data")}; + }`};return{name:"GatherBlockQuantized",shaderCache:{hint:`${t.cacheKey};${e.filter((f,b)=>b!==1).map(f=>f.dims.join("_")).join(";")}`,inputDependencies:Array.from({length:e.length},(f,b)=>"rank")},getRunData:()=>({outputs:[{dims:l,dataType:u}],dispatchGroup:{x:Math.ceil(c/64)},programUniforms:h}),getShaderSource:p}},MD=(e,t)=>{let n=e.inputs;yT(n,t),e.compute(vT(e.inputs,t))},TD=e=>fi({blockSize:e.blockSize,gatherAxis:e.gatherAxis,quantizeAxis:e.quantizeAxis})}),wT,_T,RD,PD,She=dr(()=>{ps(),ws(),la(),Ss(),wT=e=>{if(!e||e.length!==2)throw new Error("GatherElements requires 2 inputs.");if(e[0].dims.length<1)throw new Error("GatherElements requires that the data input be rank >= 1.");if(e[0].dims.length!==e[1].dims.length)throw new Error(`GatherElements requires that the data input and + indices input tensors be of same rank.`)},_T=(e,t)=>{let n=e[0].dims,r=e[0].dataType,i=n.length,a=e[1].dims,o=e[1].dataType,l=kn.normalizeAxis(t.axis,i),c=n[l],u=a.slice(0),d=kn.size(u),h=Wn("input",r,i),p=Wn("indicesInput",o,a.length),f=Vr("output",r,u.length),b=[{type:12,data:d},{type:6,data:c},{type:12,data:l}];return b.push(...Jr(n,a,u)),{name:"GatherElements",shaderCache:{inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:u,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(d/64)},programUniforms:b}),getShaderSource:g=>` + ${g.registerUniform("outputSize","u32").registerUniform("axisDimLimit","i32").registerUniform("axis","u32").declareVariables(h,p,f)} + ${g.mainStart()} + ${g.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + + let outputIndices = ${f.offsetToIndices("global_idx")}; + + var idx = ${p.getByOffset("global_idx")}; + if (idx < 0) { + idx = idx + uniforms.axisDimLimit; + } + var inputIndices = ${h.type.indices}(outputIndices); + ${h.indicesSet("inputIndices","uniforms.axis","u32(idx)")}; + let value = ${h.getByIndices("inputIndices")}; + + ${f.setByOffset("global_idx","value")}; + }`}},RD=e=>fi({axis:e.axis}),PD=(e,t)=>{let n=e.inputs;wT(n),e.compute(_T(e.inputs,t))}}),zT,$T,OD,LD,jhe=dr(()=>{ps(),ws(),Ss(),zT=e=>{if(!e)throw new Error("Input is missing");if(e.length<2||e.length>3)throw new Error("Invaid input number.");if(e.length===3&&e[2].dims.length>2)throw new Error("Invalid input shape of C");if(e[0].dataType!==e[1].dataType||e.length===3&&e[0].dataType!==e[2].dataType)throw new Error("Input types are mismatched")},$T=(e,t)=>{let n=e[0].dims.slice(),r=e[1].dims.slice(),[i,a,o]=BF.getShapeOfGemmResult(n,t.transA,r,t.transB,e.length===3?e[2].dims:void 0),l=[i,a];if(!l)throw new Error("Can't use gemm on the given tensors");let c=16,u=Math.ceil(a/c),d=Math.ceil(i/c),h=!0,p=kn.size(l),f=[{type:12,data:h?u:p},{type:12,data:i},{type:12,data:a},{type:12,data:o},{type:1,data:t.alpha},{type:1,data:t.beta}],b=["type","type"];e.length===3&&(f.push(...Jr(e[2].dims)),b.push("rank")),f.push(...Jr(l));let g=w=>{let v="";t.transA&&t.transB?v="value += a[k * uniforms.M + m] * b[n * uniforms.K + k];":t.transA&&!t.transB?v="value += a[k * uniforms.M + m] * b[k * uniforms.N + n];":!t.transA&&t.transB?v="value += a[m * uniforms.K + k] * b[n * uniforms.K + k];":!t.transA&&!t.transB&&(v="value += a[m * uniforms.K + k] * b[k * uniforms.N + n];");let m=t.alpha===1?"":"value *= uniforms.alpha;",z=Wn("a",e[0].dataType,e[0].dims),C=Wn("b",e[1].dataType,e[1].dims),E=z.type.value,I=null,R=[z,C];e.length===3&&(I=Wn("c",e[2].dataType,e[2].dims.length),R.push(I));let A=Vr("output",e[0].dataType,l.length);R.push(A);let O=[{name:"output_size",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"},{name:"alpha",type:"f32"},{name:"beta",type:"f32"}];return` + ${w.registerUniforms(O).declareVariables(...R)} + + ${w.mainStart()} + ${w.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let m = global_idx / uniforms.N; + let n = global_idx % uniforms.N; + + var value = ${E}(0); + for (var k: u32 = 0u; k < uniforms.K; k++) { + ${v} + } + + ${m} + ${I!=null?`let cOffset = ${I.broadcastedIndicesToOffset("vec2(m, n)",A)}; value += ${E}(uniforms.beta) * ${I.getByOffset("cOffset")};`:""} + output[global_idx] = value; + }`},y=w=>{let v=Wn("a",e[0].dataType,e[0].dims),m=Wn("b",e[1].dataType,e[1].dims),z=null,C=[v,m];e.length===3&&(z=Wn("c",e[2].dataType,e[2].dims.length),C.push(z));let E=Vr("output",e[0].dataType,l.length);C.push(E);let I=[{name:"num_tile_n",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"},{name:"alpha",type:"f32"},{name:"beta",type:"f32"}],R="",A="";t.transA&&t.transB?(A=` + var col = tile_row_start + local_id.x; + var row = k_start + local_id.y; + if (col < uniforms.M && row < uniforms.K) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.M + col]; + } else { + tile_a[local_id.y][local_id.x] = ${v.type.value}(0); + } + + col = k_start + local_id.x; + row = tile_col_start + local_id.y; + if (col < uniforms.K && row < uniforms.N) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.K + col]; + } else { + tile_b[local_id.y][local_id.x] = ${m.type.value}(0); + } + `,R="value += tile_a[k][local_id.y] * tile_b[local_id.x][k];"):t.transA&&!t.transB?(A=` + var col = tile_row_start + local_id.x; + var row = k_start + local_id.y; + if (col < uniforms.M && row < uniforms.K) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.M + col]; + } else { + tile_a[local_id.y][local_id.x] = ${v.type.value}(0); + } + + col = tile_col_start + local_id.x; + row = k_start + local_id.y; + if (col < uniforms.N && row < uniforms.K) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.N + col]; + } else { + tile_b[local_id.y][local_id.x] = ${m.type.value}(0); + } + `,R="value += tile_a[k][local_id.y] * tile_b[k][local_id.x];"):!t.transA&&t.transB?(A=` + var col = k_start + local_id.x; + var row = tile_row_start + local_id.y; + if (col < uniforms.K && row < uniforms.M) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.K + col]; + } else { + tile_a[local_id.y][local_id.x] = ${v.type.value}(0); + } + + col = k_start + local_id.x; + row = tile_col_start + local_id.y; + if (col < uniforms.K && row < uniforms.N) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.K + col]; + } else { + tile_b[local_id.y][local_id.x] = ${m.type.value}(0); + } + `,R="value += tile_a[local_id.y][k] * tile_b[local_id.x][k];"):!t.transA&&!t.transB&&(A=` + var col = k_start + local_id.x; + var row = tile_row_start + local_id.y; + if (col < uniforms.K && row < uniforms.M) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.K + col]; + } else { + tile_a[local_id.y][local_id.x] = ${v.type.value}(0); + } + + col = tile_col_start + local_id.x; + row = k_start + local_id.y; + if (col < uniforms.N && row < uniforms.K) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.N + col]; + } else { + tile_b[local_id.y][local_id.x] = ${m.type.value}(0); + } + `,R="value += tile_a[local_id.y][k] * tile_b[k][local_id.x];");let O=t.alpha===1?"":"value *= uniforms.alpha;";return` + ${w.registerUniforms(I).declareVariables(...C)} + var tile_a: array, ${c}>; + var tile_b: array, ${c}>; + ${w.mainStart([c,c,1])} + let tile_col_start = (workgroup_index % uniforms.num_tile_n) * ${c}; + let tile_row_start = (workgroup_index / uniforms.num_tile_n) * ${c}; + let num_tiles = (uniforms.K - 1) / ${c} + 1; + var k_start = 0u; + var value = ${E.type.value}(0); + for (var t: u32 = 0u; t < num_tiles; t++) { + ${A} + k_start = k_start + ${c}; + workgroupBarrier(); + + for (var k: u32 = 0u; k < ${c}; k++) { + ${R} + } + workgroupBarrier(); + } + + ${O} + let m = tile_row_start + local_id.y; + let n = tile_col_start + local_id.x; + ${z!=null?`let cOffset = ${z.broadcastedIndicesToOffset("vec2(m, n)",E)}; value += ${E.type.value}(uniforms.beta) * ${z.getByOffset("cOffset")};`:""} + if (m < uniforms.M && n < uniforms.N) { + output[m * uniforms.N + n] = value; + } + }`};return h?{name:"GemmShared",shaderCache:{hint:`${t.cacheKey}`,inputDependencies:b},getRunData:()=>({outputs:[{dims:l,dataType:e[0].dataType}],dispatchGroup:{x:u*d},programUniforms:f}),getShaderSource:y}:{name:"Gemm",shaderCache:{hint:`${t.cacheKey}`,inputDependencies:b},getRunData:()=>({outputs:[{dims:l,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(p/64)},programUniforms:f}),getShaderSource:g}},OD=e=>{let t=e.transA,n=e.transB,r=e.alpha,i=e.beta;return{transA:t,transB:n,alpha:r,beta:i,cacheKey:`${e.transA};${e.transB};${e.alpha===1}`}},LD=(e,t)=>{zT(e.inputs),e.compute($T(e.inputs,t))}}),Dd,N0,xp,bp,ST,jT,CT,NT,ET,IT,kT,AT,BD,UD,Che=dr(()=>{ps(),ws(),la(),Ss(),[Dd,N0,xp,bp]=[0,1,2,3],ST=e=>{if(e[0].dims.length!==4)throw new Error("only 4-D tensor is supported.");if(e[0].dims.length!==e[1].dims.length)throw new Error("input dimensions must be equal to grid dimensions");if(e[0].dims.length-2!==e[1].dims[e[1].dims.length-1])throw new Error(`last dimension of grid must be equal to ${e[0].dims.length-2}`);if(e[0].dims[0]!==e[1].dims[0])throw new Error("grid batch size must match input batch size")},jT=` + fn gs_get_cubic_coeffs(x: f32) -> vec4 { + let cubic_alpha = -0.75f; + let x_abs = abs(x); + var coeffs: vec4; + coeffs[0] = (((cubic_alpha * (x_abs + 1) - 5 * cubic_alpha) * (x_abs + 1) + 8 * cubic_alpha) * (x_abs + 1) - 4 * cubic_alpha); + coeffs[1] = (((cubic_alpha + 2) * x_abs - (cubic_alpha + 3)) * x_abs * x_abs + 1); + coeffs[2] = (((cubic_alpha + 2) * (1 - x_abs) - (cubic_alpha + 3)) * (1 - x_abs) * (1 - x_abs) + 1); + coeffs[3] = (((cubic_alpha * (2 - x_abs) - 5 * cubic_alpha) * (2 - x_abs) + 8 * cubic_alpha) * (2 - x_abs) - 4 * cubic_alpha); + return coeffs; + } +`,CT=e=>` + fn gs_bicubic_interpolate(p: mat4x4<${e}>, x: f32, y: f32) -> ${e} { + var v: vec4; + var coeffs = gs_get_cubic_coeffs(x); + for (var i = 0; i < 4; i++) { + v[i] = coeffs[0] * p[i][0] + coeffs[1] * p[i][1] + coeffs[2] * p[i][2] + coeffs[3] * p[i][3]; + } + coeffs = gs_get_cubic_coeffs(y); + let pixel = ${e}(coeffs[0] * v[0] + coeffs[1] * v[1] + coeffs[2] * v[2] + coeffs[3] * v[3]); + return pixel; + } +`,NT=e=>` + fn gs_denormalize(n: f32, length: i32) -> f32 { + ${e.alignCorners===0?` + // alignCorners: false => [-1, 1] to [-0.5, length - 0.5] + return ((n + 1.0) * f32(length) - 1.0) / 2.0; + `:` + // alignCorners: true => [-1, 1] to [0, length - 1] + return (n + 1.0) / 2.0 * (f32(length - 1)); + `} + } +`,ET=e=>` + ${e.paddingMode==="reflection"?` + fn gs_reflect(x: i32, x_min: f32, x_max: f32) -> u32 { + var dx = 0.0; + var fx = f32(x); + let range = x_max - x_min; + if (fx < x_min) { + dx = x_min - fx; + let n = u32(dx / range); + let r = dx - f32(n) * range; + if (n % 2 == 0) { + fx = x_min + r; + } else { + fx = x_max - r; + } + } else if (fx > x_max) { + dx = fx - x_max; + let n = u32(dx / range); + let r = dx - f32(n) * range; + if (n % 2 == 0) { + fx = x_max - r; + } else { + fx = x_min + r; + } + } + return u32(fx); + }`:""} +`,IT=(e,t,n)=>` + fn pixel_at_grid(r: i32, c: i32, H: i32, W: i32, batch: u32, channel: u32, border: vec4) -> ${t} { + var pixel = ${t}(0); + var indices = vec4(0); + indices[${Dd}] = batch; + indices[${N0}] = channel;`+(()=>{switch(n.paddingMode){case"zeros":return` + if (r >= 0 && r < H && c >=0 && c < W) { + indices[${xp}] = u32(r); + indices[${bp}] = u32(c); + } + `;case"border":return` + indices[${xp}] = u32(clamp(r, 0, H - 1)); + indices[${bp}] = u32(clamp(c, 0, W - 1)); + `;case"reflection":return` + indices[${xp}] = gs_reflect(r, border[1], border[3]); + indices[${bp}] = gs_reflect(c, border[0], border[2]); + `;default:throw new Error(`padding mode ${n.paddingMode} is not supported`)}})()+` + return ${e.getByIndices("indices")}; + } +`,kT=(e,t,n)=>(()=>{switch(n.mode){case"nearest":return` + let result = pixel_at_grid(i32(round(y)), i32(round(x)), H_in, W_in, indices[${Dd}], indices[${N0}], border); + `;case"bilinear":return` + let x1 = i32(floor(x)); + let y1 = i32(floor(y)); + let x2 = x1 + 1; + let y2 = y1 + 1; + + let p11 = pixel_at_grid(y1, x1, H_in, W_in, indices[${Dd}], indices[${N0}], border); + let p12 = pixel_at_grid(y1, x2, H_in, W_in, indices[${Dd}], indices[${N0}], border); + let p21 = pixel_at_grid(y2, x1, H_in, W_in, indices[${Dd}], indices[${N0}], border); + let p22 = pixel_at_grid(y2, x2, H_in, W_in, indices[${Dd}], indices[${N0}], border); + + let dx2 = ${t}(f32(x2) - x); + let dx1 = ${t}(x - f32(x1)); + let dy2 = ${t}(f32(y2) - y); + let dy1 = ${t}(y - f32(y1)); + let result = dy2 * (dx2 * p11 + dx1 * p12) + dy1 * (dx2 * p21 + dx1 * p22); + `;case"bicubic":return` + let x0 = i32(floor(x)) - 1; + let y0 = i32(floor(y)) - 1; + var p: mat4x4<${t}>; + for (var h = 0; h < 4; h++) { + for (var w = 0; w < 4; w++) { + p[h][w] = pixel_at_grid(h + y0, w + x0, H_in, W_in, indices[${Dd}], indices[${N0}], border); + } + } + + let dx = x - f32(x0 + 1); + let dy = y - f32(y0 + 1); + let result = gs_bicubic_interpolate(p, dx, dy); + `;default:throw new Error(`mode ${n.mode} is not supported`)}})()+`${e.setByOffset("global_idx","result")}`,AT=(e,t)=>{let n=Wn("x",e[0].dataType,e[0].dims.length),r=[e[1].dims[0],e[1].dims[1],e[1].dims[2]],i=Wn("grid",e[1].dataType,r.length,2),a=[e[0].dims[0],e[0].dims[1],e[1].dims[1],e[1].dims[2]];t.format==="NHWC"&&(a=[e[0].dims[0],e[1].dims[1],e[1].dims[2],e[0].dims[3]],[Dd,N0,xp,bp]=[0,3,1,2]);let o=Vr("output",e[0].dataType,a.length),l=n.type.value,c=kn.size(a),u=[{type:12,data:c},...Jr(e[0].dims,r,a)],d=h=>` + ${h.registerUniform("output_size","u32").declareVariables(n,i,o)} + ${jT} + ${CT(l)} + ${NT(t)} + ${ET(t)} + ${IT(n,l,t)} + + ${h.mainStart()} + ${h.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let H_in = i32(uniforms.x_shape[${xp}]); + let W_in = i32(uniforms.x_shape[${bp}]); + + ${t.alignCorners===0?` + let x_min = -0.5; + let x_max = f32(W_in) - 0.5; + let y_min = -0.5; + let y_max = f32(H_in) - 0.5; + `:` + let x_min = 0.0; + let x_max = f32(W_in) - 1.0; + let y_min = 0.0; + let y_max = f32(H_in) - 1.0; + `}; + let border = vec4(x_min, y_min, x_max, y_max); + + let indices = ${o.offsetToIndices("global_idx")}; + var grid_indices = vec3(indices[${Dd}], indices[${xp}], indices[${bp}]); + let nxy = ${i.getByIndices("grid_indices")}; + var x = gs_denormalize(f32(nxy[0]), W_in); + var y = gs_denormalize(f32(nxy[1]), H_in); + + ${kT(o,l,t)} + }`;return{name:"GridSample",shaderCache:{hint:`${t.cacheKey}`,inputDependencies:["type","type"]},getRunData:h=>{let p=kn.size(a);return{outputs:[{dims:a,dataType:h[0].dataType}],dispatchGroup:{x:Math.ceil(p/64)},programUniforms:u}},getShaderSource:d}},BD=(e,t)=>{ST(e.inputs),e.compute(AT(e.inputs,t))},UD=e=>fi({alignCorners:e.align_corners,mode:e.mode,paddingMode:e.padding_mode,format:e.format})}),ol,MT,FD,zz,TT,px,WD,DD=dr(()=>{ps(),ws(),la(),vS(),zS(),Ss(),Wh(),ol=(e,t)=>e.length>t&&e[t].dims.length>0?e[t]:void 0,MT=(e,t)=>{let n=e[0],r=ol(e,1),i=ol(e,2),a=ol(e,3),o=ol(e,4),l=ol(e,5),c=ol(e,6),u=ol(e,7);if(n.dims.length!==3&&n.dims.length!==5)throw new Error("Input query is expected to have 3 or 5 dimensions");let d=n.dims[0],h=n.dims[1],p=n.dims.length===3?n.dims[2]:t.numHeads*n.dims[4],f=h,b=0,g=0,y=Math.floor(p/t.numHeads);if(c&&u&&kn.size(c.dims)&&kn.size(u.dims)){if(c.dims.length!==4)throw new Error('Input "past_key" is expected to have 4 dimensions');if(c.dims[0]!==d||c.dims[1]!==t.numHeads||c.dims[3]!==y)throw new Error('Input "past_key" shape (batch_size, num_heads, past_sequence_length, head_size)');if(u.dims[0]!==d||u.dims[1]!==t.numHeads||u.dims[3]!==y)throw new Error('Input "past_value" shape (batch_size, num_heads, past_sequence_length, head_size)');if(c.dims[2]!==u.dims[2])throw new Error('Input "past_key" and "past_value" shall have same dim 2 (past_sequence_length)');if(u.dims.length!==4)throw new Error('Input "past_value" is expected to have 4 dimensions');b=c.dims[2],g=c.dims[2]}else if(c&&kn.size(c.dims)||u&&kn.size(u.dims))throw new Error('Input "past_key" and "past_value" shall be both present or both absent');let w;if(r&&kn.size(r.dims)>0){if(n.dims.length!==3)throw new Error('Input "query" is expected to have 3 dimensions when key is given');if(r.dims.length<3||r.dims.length>5)throw new Error('Input "key" is expected to have 3, 4, or 5 dimensions');if(n.dims[0]!==r.dims[0])throw new Error('Input "query" and "key" shall have same dim 0 (batch size)');if(r.dims.length===3){if(r.dims[2]!==n.dims[2])throw new Error('Input "query" and "key" shall have same dim 2 (hidden_size)');w=2,f=r.dims[1]}else if(r.dims.length===5){if(r.dims[2]!==t.numHeads||r.dims[3]!==2||r.dims[4]!==y)throw new Error('Expect "key" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');if(i)throw new Error('Expect "value" be none when "key" has packed kv format.');w=5,f=r.dims[1]}else{if(r.dims[1]!==t.numHeads||r.dims[3]!==y)throw new Error('Expect "key" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');w=0,f=r.dims[2]}}else{if(n.dims.length!==5)throw new Error('Input "query" is expected to have 5 dimensions when key is empty');if(n.dims[2]!==t.numHeads||n.dims[3]!==3)throw new Error('Expect "query" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');w=3}if(a&&kn.size(a.dims)>0){if(a.dims.length!==1)throw new Error('Input "bias" is expected to have 1 dimension');if(r&&r.dims.length===5&&r.dims[3]===2)throw new Error("bias is not allowed for packed kv.")}let v=b+f,m=0;if(o&&kn.size(o.dims)>0){m=8;let I=o.dims;throw I.length===1?I[0]===d?m=1:I[0]===3*d+2&&(m=3):I.length===2&&I[0]===d&&I[1]===v&&(m=5),m===8?new Error('Input "key_padding_mask" shape shall be (batch_size) or (batch_size, total_sequence_length)'):new Error("Mask not supported")}let z=!1,C=p;if(i&&kn.size(i.dims)>0){if(i.dims.length!==3&&i.dims.length!==4)throw new Error('Input "value" is expected to have 3 or 4 dimensions');if(n.dims[0]!==i.dims[0])throw new Error('Input "query" and "value" shall have same dim 0 (batch_size)');if(i.dims.length===3){if(f!==i.dims[1])throw new Error('Input "key" and "value" shall have the same dim 1 (kv_sequence_length)');C=i.dims[2]}else{if(f!==i.dims[2])throw new Error('Input "key" and "value" shall have the same dim 2 (kv_sequence_length)');C=i.dims[1]*i.dims[3],z=!0}}let E=!1;if(o&&kn.size(o.dims)>0)throw new Error("Key padding mask is not supported");if(l&&kn.size(l.dims)>0){if(l.dims.length!==4)throw new Error('Input "attention_bias" is expected to have 4 dimensions');if(l.dims[0]!==d||l.dims[1]!==t.numHeads||l.dims[2]!==h||l.dims[3]!==v)throw new Error('Expect "attention_bias" shape (batch_size, num_heads, sequence_length, total_sequence_length)')}return{batchSize:d,sequenceLength:h,pastSequenceLength:b,kvSequenceLength:f,totalSequenceLength:v,maxSequenceLength:g,inputHiddenSize:0,hiddenSize:p,vHiddenSize:C,headSize:y,vHeadSize:Math.floor(C/t.numHeads),numHeads:t.numHeads,isUnidirectional:!1,pastPresentShareBuffer:!1,maskFilterValue:t.maskFilterValue,maskType:m,scale:t.scale,broadcastResPosBias:E,passPastInKv:z,qkvFormat:w}},FD=e=>fi({...e}),zz=fi({perm:[0,2,1,3]}),TT=(e,t,n,r,i,a,o)=>{let l=[r,i,a],c=kn.size(l),u=[{type:12,data:c},{type:12,data:o},{type:12,data:a}],d=h=>{let p=Vr("qkv_with_bias",t.dataType,l),f=Wn("qkv",t.dataType,l),b=Wn("bias",n.dataType,l),g=[{name:"output_size",type:"u32"},{name:"bias_offset",type:"u32"},{name:"hidden_size",type:"u32"}];return` + ${h.registerUniforms(g).declareVariables(f,b,p)} + ${h.mainStart()} + ${h.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let bias_offset_idx = (global_idx % uniforms.hidden_size) + uniforms.bias_offset; + + qkv_with_bias[global_idx] = qkv[global_idx] + bias[bias_offset_idx]; + }`};return e.compute({name:"MultiHeadAttentionAddBias",shaderCache:{inputDependencies:["type","type"]},getRunData:()=>({outputs:[{dims:l,dataType:t.dataType,gpuDataType:0}],dispatchGroup:{x:Math.ceil(c/64)},programUniforms:u}),getShaderSource:d},{inputs:[t,n],outputs:[-1]})[0]},px=(e,t,n,r,i,a,o,l)=>{let c=a;if(o&&kn.size(o.dims)>0){if(r===1)throw new Error("AddBiasReshape is not implemented. Please export your model with packed QKV or KV");return c=TT(e,a,o,t,r,n*i,l),c=c.reshape([t,r,n,i]),n===1||r===1?c:e.compute(jc(c,zz.perm),{inputs:[c],outputs:[-1]})[0]}else return a.dims.length===3&&(c=a.reshape([t,r,n,i])),n===1||r===1?c:e.compute(jc(c,zz.perm),{inputs:[c],outputs:[-1]})[0]},WD=(e,t)=>{let n=MT(e.inputs,t),r=e.inputs[0],i=ol(e.inputs,1),a=ol(e.inputs,2),o=ol(e.inputs,3),l=ol(e.inputs,4),c=ol(e.inputs,5),u=ol(e.inputs,6),d=ol(e.inputs,7);if(r.dims.length===5)throw new Error("Packed QKV is not implemented");if((i==null?void 0:i.dims.length)===5)throw new Error("Packed KV is not implemented");let h=i&&a&&i.dims.length===4&&a.dims.length===4,p=px(e,n.batchSize,n.numHeads,n.sequenceLength,n.headSize,r,o,0);if(h)return fb(e,p,i,a,l,void 0,u,d,c,n);if(!i||!a)throw new Error("key and value must be provided");let f=px(e,n.batchSize,n.numHeads,n.kvSequenceLength,n.headSize,i,o,n.hiddenSize),b=px(e,n.batchSize,n.numHeads,n.kvSequenceLength,n.vHeadSize,a,o,2*n.hiddenSize);fb(e,p,f,b,l,void 0,u,d,c,n)}}),RT,PT,OT,LT,m5,VD,HD,GD=dr(()=>{ps(),ws(),la(),Ss(),RT=e=>{if(!e||e.length<1)throw new Error("too few inputs")},PT=(e,t)=>{let n=[],r=t.numOutputs;return e[1].dims[0]>0&&(e[1].getBigInt64Array().forEach(i=>n.push(Number(i))),r=n.length),fi({numOutputs:r,axis:t.axis,splitSizes:n})},OT=e=>` +fn calculateOutputIndex(index: u32) -> u32 { + for (var i: u32 = 0u; i < ${e}u; i += 1u ) { + if (index < ${qr("uniforms.size_in_split_axis","i",e)}) { + return i; + } + } + return ${e}u; +}`,LT=e=>{let t=e.length,n=[];for(let r=0;r{let n=e[0].dims,r=kn.size(n),i=e[0].dataType,a=kn.normalizeAxis(t.axis,n.length),o=new Array(t.numOutputs),l=Wn("input",i,n.length),c=new Array(t.numOutputs),u=[],d=[],h=0,p=[{type:12,data:r}];for(let b=0;b` + ${b.registerUniform("input_size","u32").registerUniform("size_in_split_axis","u32",c.length).declareVariables(l,...o)} + ${OT(c.length)} + ${LT(o)} + + ${b.mainStart()} + ${b.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.input_size")} + + var indices = ${l.offsetToIndices("global_idx")}; + var index = ${l.indicesGet("indices",a)}; + let output_number = calculateOutputIndex(index); + if (output_number != 0) { + index -= ${qr("uniforms.size_in_split_axis","output_number - 1u",c.length)}; + ${l.indicesSet("indices",a,"index")}; + } + writeBufferData(output_number, indices, global_idx); + }`;return{name:"Split",shaderCache:{hint:t.cacheKey,inputDependencies:["rank"]},getShaderSource:f,getRunData:()=>({outputs:u,dispatchGroup:{x:Math.ceil(r/64)},programUniforms:p})}},VD=(e,t)=>{RT(e.inputs);let n=e.inputs.length===1?t:PT(e.inputs,t);e.compute(m5(e.inputs,n),{inputs:[0]})},HD=e=>{let t=e.axis,n=e.splitSizes,r=e.numOutputs<0?n.length:e.numOutputs;if(r!==n.length)throw new Error("numOutputs and splitSizes lengh must be equal");return fi({axis:t,numOutputs:r,splitSizes:n})}}),BT,UT,$z,qD,Nhe=dr(()=>{la(),zS(),DD(),GD(),Wh(),BT=(e,t)=>{if(t.doRotary)throw new Error("GroupQuerryAttention do_rotary attribute is not supported");if(t.doRotary&&e.length<=7)throw new Error("cos_cache and sin_cache inputs are required if do_rotary is specified");let n=e[0],r=e[1],i=e[2],a=e[3],o=e[4];if(t.localWindowSize!==-1)throw new Error("Local attention is not supported");if(t.softcap!==0)throw new Error("Softcap is not supported");if(t.rotaryInterleaved!==0)throw new Error("Rotary interleaved is not supported");if(t.smoothSoftmax)throw new Error("Smooth softmax is not supported");if(n.dims.length!==3&&n.dims.length!==5)throw new Error("Input query is expected to have 3 or 5 dimensions");let l=!1,c=n.dims[0],u=n.dims[1],d=n.dims.length===3?l?n.dims[2]/3:n.dims[2]:t.numHeads*n.dims[4],h=u,p=0,f=!r||r.dims.length===0,b=Math.floor(f?d/(t.numHeads+2*t.kvNumHeads):d/t.numHeads);f&&(d=b*t.numHeads);let g=a&&a.dims.length!==0,y=o&&o.dims.length!==0;if(g&&a.dims.length===4&&a.dims[0]===c&&a.dims[1]!==t.kvNumHeads&&a.dims[2]===t.kvNumHeads&&a.dims[3]===b)throw new Error("BSNH pastKey/pastValue is not supported");if(g&&y){if(a.dims.length!==4)throw new Error('Input "past_key" is expected to have 4 dimensions');if(o.dims.length!==4)throw new Error('Input "past_value" is expected to have 4 dimensions');p=a.dims[2]}else if(g||y)throw new Error('Input "past_key" and "past_value" shall be both present or both absent');let w=1;if(r&&r.dims.length>0){if(n.dims.length!==3)throw new Error('Input "query" is expected to have 3 dimensions when key is given');if(r.dims.length<3||r.dims.length>5)throw new Error('Input "key" is expected to have 3, 4, or 5 dimensions');if(n.dims[0]!==r.dims[0])throw new Error('Input "query" and "key" shall have same dim 0 (batch size)');if(r.dims.length===3){if(n.dims[2]%r.dims[2]!==0)throw new Error('Dimension 2 of "query" should be a multiple of "key"');h=r.dims[1]}else if(r.dims.length===5){if(r.dims[2]!==t.numHeads||r.dims[3]!==2||r.dims[4]!==b)throw new Error('Expect "key" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');if(i)throw new Error('Expect "value" be none when "key" has packed kv format.');h=r.dims[1]}else{if(r.dims[1]!==t.numHeads||r.dims[3]!==b)throw new Error('Expect "key" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');h=r.dims[2]}}else{if(n.dims.length!==3&&n.dims.length!==5)throw new Error('Input "query" is expected to have 3 or 5 dimensions when key is empty');if(n.dims.length===5&&(n.dims[2]!==t.numHeads||n.dims[3]!==3))throw new Error('Expect "query" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');w=3}let v=0,m=!1,z=t.kvNumHeads?b*t.kvNumHeads:d;if(i&&i.dims.length>0){if(i.dims.length!==3&&i.dims.length!==4)throw new Error('Input "value" is expected to have 3 or 4 dimensions');if(n.dims[0]!==i.dims[0])throw new Error('Input "query" and "value" shall have same dim 0 (batch_size)');if(i.dims.length===3){if(h!==i.dims[1])throw new Error('Input "key" and "value" shall have the same dim 1 (kv_sequence_length)');z=i.dims[2]}else{if(h!==i.dims[2])throw new Error('Input "past_key" and "past_value" shall have the same dim 2 (kv_sequence_length)');z=i.dims[1]*i.dims[3],m=!0}}let C=e.length>4?e[5]:void 0;if(C&&C.dims.length!==1&&C.dims[0]!==c)throw new Error('Input "seqlens" is expected to have 1 dimension and the same dim 0 as batch_size');return{batchSize:c,sequenceLength:u,pastSequenceLength:p,kvSequenceLength:h,totalSequenceLength:-1,maxSequenceLength:-1,inputHiddenSize:0,hiddenSize:d,vHiddenSize:z,headSize:b,vHeadSize:Math.floor(z/t.kvNumHeads),numHeads:t.numHeads,kvNumHeads:t.kvNumHeads,nReps:t.numHeads/t.kvNumHeads,pastPresentShareBuffer:!1,maskType:v,scale:t.scale,broadcastResPosBias:!1,passPastInKv:m,qkvFormat:w}},UT=fi({perm:[0,2,1,3]}),$z=(e,t,n)=>{let r=t,i=n.kvNumHeads;return t.dims.length===3&&n.kvSequenceLength!==0&&(r=t.reshape([n.batchSize,n.kvSequenceLength,i,n.headSize]),r=e.compute(jc(r,UT.perm),{inputs:[r],outputs:[-1]})[0]),r},qD=(e,t)=>{var y;let n=BT(e.inputs,t);if(e.inputs[0].dims.length===5)throw new Error("Packed QKV is not implemented");if(((y=e.inputs[1])==null?void 0:y.dims.length)===5)throw new Error("Packed KV is not implemented");let r=e.inputs[0],i=e.inputs[1]&&e.inputs[1].dims.length>0?e.inputs[1]:void 0,a=e.inputs[2]&&e.inputs[2].dims.length>0?e.inputs[2]:void 0,o=e.inputs[3]&&e.inputs[3].dims.length!==0?e.inputs[3]:void 0,l=e.inputs[4]&&e.inputs[4].dims.length!==0?e.inputs[4]:void 0,c=e.inputs.length>4?e.inputs[5]:void 0,u=e.inputs.length>5?e.inputs[6]:void 0,d=n.kvNumHeads?n.kvNumHeads:n.numHeads,h=fi({axis:2,numOutputs:3,splitSizes:[n.numHeads*n.headSize,d*n.headSize,d*n.headSize]}),[p,f,b]=!i&&!a?e.compute(m5([r],h),{inputs:[r],outputs:[-1,-1,-1]}):[r,i,a],g=px(e,n.batchSize,n.numHeads,n.sequenceLength,n.headSize,p,void 0,0);fb(e,g,$z(e,f,n),$z(e,b,n),void 0,void 0,o,l,void 0,n,c,u)}}),Sz,FT,WT,KD,Ehe=dr(()=>{ps(),ws(),Wh(),Ss(),Sz=(e,t,n,r,i,a,o,l)=>{let c=Ji(a),u=c===1?"f32":`vec${c}f`,d=c===1?"vec2f":`mat2x${c}f`,h=i*o,p=64;h===1&&(p=256);let f=[i,o,a/c],b=[i,o,2],g=["rank","type","type"],y=[];y.push(...Jr(f,b));let w=v=>{let m=Wn("x",t.dataType,3,c),z=Wn("scale",n.dataType,n.dims),C=Wn("bias",r.dataType,r.dims),E=Vr("output",1,3,2),I=[m,z,C,E];return` + var workgroup_shared : array<${d}, ${p}>; + const workgroup_size = ${p}u; + ${v.declareVariables(...I)} + ${v.mainStart(p)} + let batch = workgroup_index / uniforms.x_shape[1]; + let channel = workgroup_index % uniforms.x_shape[1]; + let hight = uniforms.x_shape[2]; + // initialize workgroup memory + var sum = ${u}(0); + var squared_sum = ${u}(0); + for (var h = local_idx; h < hight; h += workgroup_size) { + let value = ${u}(${m.get("batch","channel","h")}); + sum += value; + squared_sum += value * value; + } + workgroup_shared[local_idx] = ${d}(sum, squared_sum); + workgroupBarrier(); + + for (var currSize = workgroup_size >> 1; currSize > 0; currSize = currSize >> 1) { + if (local_idx < currSize) { + workgroup_shared[local_idx] = workgroup_shared[local_idx] + workgroup_shared[local_idx + currSize]; + } + workgroupBarrier(); + } + if (local_idx == 0) { + let sum_final = ${Oh("workgroup_shared[0][0]",c)} / f32(hight * ${c}); + let squared_sum_final = ${Oh("workgroup_shared[0][1]",c)} / f32(hight * ${c}); + + let inv_std_dev = inverseSqrt(squared_sum_final - sum_final * sum_final + f32(${l})); + let channel_scale = inv_std_dev * f32(scale[channel]); + let channel_shift = f32(bias[channel]) - sum_final * channel_scale; + output[workgroup_index] = vec2f(channel_scale, channel_shift); + } + }`};return e.compute({name:"InstanceNormComputeChannelScaleShift",shaderCache:{hint:`${c};${l};${p}`,inputDependencies:g},getRunData:()=>({outputs:[{dims:b,dataType:1}],dispatchGroup:{x:h},programUniforms:y}),getShaderSource:w},{inputs:[t,n,r],outputs:[-1]})[0]},FT=(e,t,n)=>{let r=t[0].dims,i=r,a=2,o=r[0],l=r[1],c=kn.sizeFromDimension(r,a),u=Ji(c),d=kn.size(i)/u,h=Sz(e,t[0],t[1],t[2],o,c,l,n.epsilon),p=[o,l,c/u],f=[o,l],b=["type","none"],g=y=>{let w=Wn("x",t[0].dataType,p.length,u),v=Wn("scale_shift",1,f.length,2),m=Vr("output",t[0].dataType,p.length,u),z=[w,v,m];return` + ${y.registerUniform("output_size","u32").declareVariables(...z)} + ${y.mainStart()} + ${y.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let outputIndices = ${m.offsetToIndices("global_idx")}; + let batch = outputIndices[0]; + let channel = outputIndices[1]; + let scale_shift = ${v.getByIndices("vec2(batch, channel)")}; + let value = ${w.getByOffset("global_idx")} * ${m.type.value}(scale_shift.x) + ${m.type.value}(scale_shift.y); + ${m.setByOffset("global_idx","value")}; + }`};e.compute({name:"InstanceNormalization",shaderCache:{hint:`${u}`,inputDependencies:b},getRunData:()=>({outputs:[{dims:i,dataType:t[0].dataType}],dispatchGroup:{x:Math.ceil(d/64)},programUniforms:[{type:12,data:d},...Jr(p,f,p)]}),getShaderSource:g},{inputs:[t[0],h]})},WT=(e,t,n)=>{let r=t[0].dims,i=r,a=r[0],o=r[r.length-1],l=kn.sizeFromDimension(r,1)/o,c=Ji(o),u=kn.size(i)/c,d=[{type:12,data:l},{type:12,data:Math.floor(o/c)}],h=["type","type"],p=!1,f=[0,r.length-1];for(let w=0;wr[f[v]])),g=Sz(e,b,t[1],t[2],a,l,o,n.epsilon),y=w=>{let v=Qa(t[0].dataType),m=c===1?"vec2f":`mat${c}x2f`,z=I=>{let R=I===0?"x":"y",A=c===1?"f32":`vec${c}f`;switch(c){case 1:return`${v}(${A}(scale.${R}))`;case 2:return`vec2<${v}>(${A}(scale[0].${R}, scale[1].${R}))`;case 4:return`vec4<${v}>(${A}(scale[0].${R}, scale[1].${R}, scale[2].${R}, scale[3].${R}))`;default:throw new Error(`Not supported compoents ${c}`)}},C=Wn("input",t[0].dataType,t[0].dims,c),E=Vr("output",t[0].dataType,i,c);return` + @group(0) @binding(0) var input : array<${C.type.storage}>; + @group(0) @binding(1) var scale_input : array<${m}>; + @group(0) @binding(2) var output : array<${E.type.storage}>; + struct Uniforms {H: u32, C : u32}; + @group(0) @binding(3) var uniforms: Uniforms; + + ${w.mainStart()} + let current_image_number = global_idx / (uniforms.C * uniforms.H); + let current_channel_number = global_idx % uniforms.C; + + let scale_offset = current_image_number * uniforms.C + current_channel_number; + let scale = scale_input[scale_offset]; + output[global_idx] = fma(input[global_idx], ${z(0)}, ${z(1)}); + }`};e.compute({name:"InstanceNormalizationNHWC",shaderCache:{hint:`${c}`,inputDependencies:h},getRunData:()=>({outputs:[{dims:i,dataType:t[0].dataType}],dispatchGroup:{x:Math.ceil(u/64)},programUniforms:d}),getShaderSource:y},{inputs:[t[0],g]})},KD=(e,t)=>{t.format==="NHWC"?WT(e,e.inputs,t):FT(e,e.inputs,t)}}),DT,VT,XD,Ihe=dr(()=>{ps(),ws(),Ss(),DT=e=>{if(!e||e.length<2)throw new Error("layerNorm requires at least 2 inputs.")},VT=(e,t,n)=>{let r=t.simplified,i=e[0].dims,a=e[1],o=!r&&e[2],l=i,c=kn.normalizeAxis(t.axis,i.length),u=kn.sizeToDimension(i,c),d=kn.sizeFromDimension(i,c),h=kn.size(a.dims),p=o?kn.size(o.dims):0;if(h!==d||o&&p!==d)throw new Error(`Size of X.shape()[axis:] == ${d}. + Size of scale and bias (if provided) must match this. + Got scale size of ${h} and bias size of ${p}`);let f=[];for(let C=0;C1,v=n>2,m=C=>{let E=Qa(e[0].dataType),I=[Wn("x",e[0].dataType,e[0].dims,b),Wn("scale",a.dataType,a.dims,b)];o&&I.push(Wn("bias",o.dataType,o.dims,b)),I.push(Vr("output",e[0].dataType,l,b)),w&&I.push(Vr("mean_data_output",1,f)),v&&I.push(Vr("inv_std_output",1,f));let R=[{name:"norm_count",type:"u32"},{name:"norm_size",type:"f32"},{name:"norm_size_vectorized",type:"u32"},{name:"epsilon",type:"f32"}];return` + ${C.registerUniforms(R).declareVariables(...I)} + ${C.mainStart()} + ${C.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.norm_count")} + let offset = global_idx * uniforms.norm_size_vectorized; + var mean_vector = ${a5("f32",b)}; + var mean_square_vector = ${a5("f32",b)}; + + for (var h: u32 = 0u; h < uniforms.norm_size_vectorized; h++) { + let value = ${dm(E,b,"x[h + offset]")}; + mean_vector += value; + mean_square_vector += value * value; + } + let mean = ${Oh("mean_vector",b)} / uniforms.norm_size; + let inv_std_dev = inverseSqrt(${Oh("mean_square_vector",b)} / uniforms.norm_size ${r?"":"- mean * mean"} + uniforms.epsilon); + + for (var j: u32 = 0; j < uniforms.norm_size_vectorized; j++) { + let f32input = ${dm(E,b,"x[j + offset]")}; + let f32scale = ${dm(E,b,"scale[j]")}; + output[j + offset] = ${I[0].type.value}((f32input ${r?"":"- mean"}) * inv_std_dev * f32scale + ${o?`+ ${dm(E,b,"bias[j]")}`:""} + ); + } + + ${w?"mean_data_output[global_idx] = mean":""}; + ${v?"inv_std_output[global_idx] = inv_std_dev":""}; + }`},z=[{dims:l,dataType:e[0].dataType}];return w&&z.push({dims:f,dataType:1}),v&&z.push({dims:f,dataType:1}),{name:"LayerNormalization",shaderCache:{hint:`${b};${n};${r}`,inputDependencies:g},getRunData:()=>({outputs:z,dispatchGroup:{x:Math.ceil(u/64)},programUniforms:y}),getShaderSource:m}},XD=(e,t)=>{DT(e.inputs),e.compute(VT(e.inputs,t,e.outputCount))}}),HT,YD,khe=dr(()=>{ws(),NS(),ES(),HT=e=>{if(!e||e.length!==2)throw new Error("MatMul requires 2 inputs.");if(e[0].dims[e[0].dims.length-1]!==e[1].dims[e[1].dims.length-2])throw new Error("shared dimension does not match.")},YD=e=>{HT(e.inputs);let t=Im.calcShape(e.inputs[0].dims,e.inputs[1].dims,!0);if(!t)throw new Error("Can't use matmul on the given tensors");let n=t[t.length-1],r=e.inputs[0].dims[e.inputs[0].dims.length-1];if(n<8&&r<8)e.compute(CS(e.inputs,{activation:""},t));else{let i=t[t.length-2],a=kn.size(e.inputs[0].dims.slice(0,-2)),o=kn.size(e.inputs[1].dims.slice(0,-2));if(a!==1&&i===1&&o===1){let l=e.inputs[0].reshape([1,a,r]),c=e.inputs[1].reshape([1,r,n]),u=[1,a,n],d=[l,c];e.compute(yw(d,{activation:""},t,u),{inputs:d})}else e.compute(yw(e.inputs,{activation:""},t))}}}),GT,qT,KT,JD,ZD,Ahe=dr(()=>{ps(),ws(),la(),Ss(),GT=(e,t)=>{if(e.length<3||e.length>4)throw new Error("MatMulNBits requires 3 or 4 inputs");let n=e[0],r=n.dims.length;if(n.dims[r-1]!==t.k)throw new Error("The last dim of input shape does not match the k value");let i=Math.floor((t.k+t.blockSize-1)/t.blockSize),a=t.blockSize/8*t.bits,o=e[1];if(!kn.areEqual(o.dims,[t.n,i,a]))throw new Error("The second inputs must be 3D tensor with shape N X nBlocksPerCol X blobSize");let l=e[2].dims;if(kn.size(l)!==t.n*i)throw new Error("scales input size error.");if(e.length===4){let c=e[3].dims,u=t.bits>4?t.n*i:t.n*Math.floor((i+1)/2);if(kn.size(c)!==u)throw new Error("zeroPoints input size error.")}},qT=(e,t)=>{let n=e[0].dims,r=n.length,i=n[r-2],a=t.k,o=t.n,l=n.slice(0,r-2),c=kn.size(l),u=e[1].dims[2]/4,d=e[0].dataType,h=Ji(t.k),p=Ji(u),f=Ji(o),b=l.concat([i,o]),g=i>1&&o/f%2===0?2:1,y=kn.size(b)/f/g,w=64,v=[],m=[c,i,a/h],z=kn.convertShape(e[1].dims).slice();z.splice(-1,1,u/p),v.push(...Jr(m)),v.push(...Jr(z)),v.push(...Jr(e[2].dims)),e.length===4&&v.push(...Jr(kn.convertShape(e[3].dims)));let C=[c,i,o/f];v.push(...Jr(C));let E=I=>{let R=m.length,A=Wn("a",e[0].dataType,R,h),O=Wn("b",12,z.length,p),F=Wn("scales",e[2].dataType,e[2].dims.length),L=[A,O,F],X=e.length===4?Wn("zero_points",12,e[3].dims.length):void 0;X&&L.push(X);let T=C.length,q=Vr("output",e[0].dataType,T,f),H=Qa(e[0].dataType),J=(()=>{switch(h){case 1:return`array<${H}, 8>`;case 2:return`mat4x2<${H}>`;case 4:return`mat2x4<${H}>`;default:throw new Error(`${h}-component is not supported.`)}})(),Z=()=>{let N=` + // reuse a data + var input_offset = ${A.indicesToOffset(`${A.type.indices}(batch, row, word_offset)`)}; + var a_data: ${J}; + for (var j: u32 = 0; j < ${8/h}; j++) { + a_data[j] = ${A.getByOffset("input_offset")}; + input_offset++; + } + `;for(let j=0;j> 4) & b_mask); + b_quantized_values = ${J}(${Array.from({length:4},(k,W)=>`${H}(b_value_lower[${W}]), ${H}(b_value_upper[${W}])`).join(", ")}); + b_dequantized_values = ${h===1?`${J}(${Array.from({length:8},(k,W)=>`(b_quantized_values[${W}] - ${X?`zero_point${j}`:"zero_point"}) * scale${j}`).join(", ")});`:`(b_quantized_values - ${J}(${Array(8).fill(`${X?`zero_point${j}`:"zero_point"}`).join(",")})) * scale${j};`}; + workgroup_shared[local_id.x * ${g} + ${Math.floor(j/f)}]${f>1?`[${j%f}]`:""} += ${Array.from({length:8/h},(k,W)=>`${h===1?`a_data[${W}] * b_dequantized_values[${W}]`:`dot(a_data[${W}], b_dequantized_values[${W}])`}`).join(" + ")}; + `;return N},B=()=>{let N=` + var col_index = col * ${f}; + ${X?` + let zero_point_bytes_per_col = (nBlocksPerCol + 1) / 2; + var zero_point_byte_count: u32; + var zero_point_word_index: u32; + var zero_point_byte_offset: u32; + let zero_point_nibble_offset: u32 = block & 0x1u; + var zero_point_bits_offset: u32; + var zero_point_word: u32;`:` + // The default zero point is 8 for unsigned 4-bit quantization. + let zero_point = ${H}(8);`} + `;for(let j=0;j> 0x1u); + zero_point_word_index = zero_point_byte_count >> 0x2u; + zero_point_byte_offset = zero_point_byte_count & 0x3u; + zero_point_bits_offset = (zero_point_byte_offset << 3) + (zero_point_nibble_offset << 2); + zero_point_word = ${X.getByOffset("zero_point_word_index")} >> zero_point_bits_offset; + let zero_point${j} = ${H}((zero_point_word) & 0xFu);`:""} + col_index += 1;`;return N},V=()=>{let N=`col_index = col * ${f};`;for(let j=0;j; + var b_value_upper: vec4; + var b_quantized_values: ${J}; + var b_dequantized_values: ${J};`,N};return` + var workgroup_shared: array<${q.type.value}, ${g*w}>; + ${I.declareVariables(...L,q)} + ${I.mainStart([w,1,1])} + let output_indices = ${q.offsetToIndices(`(global_idx / ${w}) * ${g}`)}; + let col = output_indices[2]; + let row = output_indices[1]; + let batch = output_indices[0]; + let nBlocksPerCol = uniforms.b_shape[1]; + + for (var block = local_id.x; block < nBlocksPerCol; block += ${w}) { + //process one block + var word_offset: u32 = block * ${t.blockSize/h}; + ${B()} + for (var word: u32 = 0; word < ${u}; word += ${p}) { + ${V()} + for (var i: u32 = 0; i < ${p}; i++) { + ${Z()} + word_offset += ${8/h}; + } + } + } + workgroupBarrier(); + + if (local_id.x < ${g}) { + var output_value: ${q.type.value} = ${q.type.value}(0); + var workgroup_shared_offset: u32 = local_id.x; + for (var b: u32 = 0u; b < ${w}u; b++) { + output_value += workgroup_shared[workgroup_shared_offset]; + workgroup_shared_offset += ${g}; + } + ${q.setByIndices(`${q.type.indices}(batch, row, col + local_id.x)`,"output_value")}; + } + }`};return{name:"MatMulNBits",shaderCache:{hint:`${t.blockSize};${t.bits};${h};${p};${f};${g};${w}`,inputDependencies:Array(e.length).fill("rank")},getRunData:()=>({outputs:[{dims:b,dataType:d}],dispatchGroup:{x:y},programUniforms:v}),getShaderSource:E}},KT=(e,t)=>{let n=e[0].dims,r=n.length,i=n[r-2],a=t.k,o=t.n,l=n.slice(0,r-2),c=kn.size(l),u=e[1].dims[2]/4,d=e[0].dataType,h=Ji(t.k),p=Ji(u),f=l.concat([i,o]),b=128,g=o%8===0?8:o%4===0?4:1,y=b/g,w=y*p*8,v=w/h,m=w/t.blockSize,z=kn.size(f)/g,C=[],E=[c,i,a/h],I=kn.convertShape(e[1].dims).slice();I.splice(-1,1,u/p),C.push(...Jr(E)),C.push(...Jr(I)),C.push(...Jr(e[2].dims)),e.length===4&&C.push(...Jr(kn.convertShape(e[3].dims)));let R=[c,i,o];C.push(...Jr(R));let A=O=>{let F=E.length,L=Wn("a",e[0].dataType,F,h),X=Wn("b",12,I.length,p),T=Wn("scales",e[2].dataType,e[2].dims.length),q=[L,X,T],H=e.length===4?Wn("zero_points",12,e[3].dims.length):void 0;H&&q.push(H);let J=R.length,Z=Vr("output",e[0].dataType,J),B=Qa(e[0].dataType),V=()=>{switch(h){case 1:return` + let a_data0 = vec4<${B}>(sub_a[word_offset], sub_a[word_offset + 1], sub_a[word_offset + 2], sub_a[word_offset + 3]); + let a_data1 = vec4<${B}>(sub_a[word_offset + 4], sub_a[word_offset + 5], sub_a[word_offset + 6], sub_a[word_offset + 7]);`;case 2:return` + let a_data0 = vec4<${B}>(sub_a[word_offset], sub_a[word_offset + 1]); + let a_data1 = vec4<${B}>(sub_a[word_offset + 2], sub_a[word_offset + 3]);`;case 4:return` + let a_data0 = sub_a[word_offset]; + let a_data1 = sub_a[word_offset + 1];`;default:throw new Error(`${h}-component is not supported.`)}};return` + var sub_a: array<${L.type.value}, ${v}>; + var inter_results: array, ${g}>; + ${O.declareVariables(...q,Z)} + ${O.mainStart([y,g,1])} + let output_indices = ${Z.offsetToIndices(`workgroup_index * ${g}`)}; + let col = output_indices[2]; + let row = output_indices[1]; + let batch = output_indices[0]; + let n_blocks_per_col = uniforms.b_shape[1]; + let num_tiles = (n_blocks_per_col - 1) / ${m} + 1; + + // Loop over shared dimension. + for (var tile: u32 = 0; tile < num_tiles; tile += 1) { + let a_col_start = tile * ${v}; + // load one tile A data into shared memory. + for (var a_offset = local_idx; a_offset < ${v}; a_offset += ${b}) + { + let a_col = a_col_start + a_offset; + if (a_col < uniforms.a_shape[2]) + { + sub_a[a_offset] = ${L.getByIndices(`${L.type.indices}(batch, row, a_col)`)}; + } else { + sub_a[a_offset] = ${L.type.value}(0); + } + } + workgroupBarrier(); + + // each thread process one block + let b_row = col + local_id.y; + let block = tile * ${m} + local_id.x; + ${H?` + let zero_point_bytes_per_col = (n_blocks_per_col + 1) / 2; + let zero_point_byte_count = b_row * zero_point_bytes_per_col + (block >> 0x1u); + let zero_point_word_index = zero_point_byte_count >> 0x2u; + let zero_point_byte_offset = zero_point_byte_count & 0x3u; + let zero_point_nibble_offset: u32 = block & 0x1u; + let zero_point_bits_offset = (zero_point_byte_offset << 3) + (zero_point_nibble_offset << 2); + let zero_point_word = ${H.getByOffset("zero_point_word_index")} >> zero_point_bits_offset; + let zero_point = ${B}((zero_point_word) & 0xFu);`:` + // The default zero point is 8 for unsigned 4-bit quantization. + let zero_point = ${B}(8);`} + let scale = ${T.getByOffset("b_row * n_blocks_per_col + block")}; + let b_data = ${X.getByIndices(`${X.type.indices}(b_row, block, 0)`)}; + var word_offset = local_id.x * ${t.blockSize/h}; + for (var i: u32 = 0; i < ${p}; i++) { + ${V()} + let b_value = ${p===1?"b_data":"b_data[i]"}; + let b_value_lower = unpack4xU8(b_value & 0x0F0F0F0Fu); + let b_value_upper = unpack4xU8((b_value >> 4) & 0x0F0F0F0Fu); + let b_quantized_values = mat2x4<${B}>(${Array.from({length:4},(N,j)=>`${B}(b_value_lower[${j}]), ${B}(b_value_upper[${j}])`).join(", ")}); + let b_dequantized_values = (b_quantized_values - mat2x4<${B}>(${Array(8).fill("zero_point").join(",")})) * scale; + inter_results[local_id.y][local_id.x] += ${Array.from({length:2},(N,j)=>`${`dot(a_data${j}, b_dequantized_values[${j}])`}`).join(" + ")}; + word_offset += ${8/h}; + } + workgroupBarrier(); + } + + if (local_idx < ${g}) { + var output_value: ${Z.type.value} = ${Z.type.value}(0); + for (var b = 0u; b < ${y}; b++) { + output_value += inter_results[local_idx][b]; + } + if (col + local_idx < uniforms.output_shape[2]) + { + ${Z.setByIndices(`${Z.type.indices}(batch, row, col + local_idx)`,"output_value")} + } + } + }`};return{name:"BlockwiseMatMulNBits32",shaderCache:{hint:`${t.blockSize};${h};${p};${y};${g}`,inputDependencies:Array(e.length).fill("rank")},getRunData:()=>({outputs:[{dims:f,dataType:d}],dispatchGroup:{x:z},programUniforms:C}),getShaderSource:A}},JD=(e,t)=>{GT(e.inputs,t),t.blockSize===32&&e.adapterInfo.isVendor("intel")&&e.adapterInfo.isArchitecture("gen-12lp")?e.compute(KT(e.inputs,t)):e.compute(qT(e.inputs,t))},ZD=e=>fi(e)}),XT,YT,JT,ZT,QT,eR,tR,nR,QD,Mhe=dr(()=>{ps(),ws(),Ss(),XT=e=>{if(!e||e.length<1)throw new Error("Too few inputs");if(e[0].dataType!==1&&e[0].dataType!==10)throw new Error("Input type must be float or float16.");if(e.length>=2){let t=e[0].dims.length*2===e[1].dims[0];if(e.length===4&&(t=e[3].dims[0]*2===e[1].dims[0]),!t)throw new Error("The pads should be a 1D tensor of shape [2 * input_rank] or [2 * num_axes].")}},YT=(e,t,n)=>{let r="";for(let i=t-1;i>=0;--i)r+=` + k = i32(${e.indicesGet("indices",i)}) - ${qr("uniforms.pads",i,n)}; + if (k < 0) { + break; + } + if (k >= i32(${qr("uniforms.x_shape",i,t)})) { + break; + } + offset += k * i32(${qr("uniforms.x_strides",i,t)}); + `;return` + value = ${e.type.value}(uniforms.constant_value); + for (var i = 0; i < 1; i++) { + var offset = 0; + var k = 0; + ${r} + value = x[offset]; + } + `},JT=(e,t,n)=>{let r="";for(let i=t-1;i>=0;--i)r+=` + k = i32(${e.indicesGet("indices",i)}) - ${qr("uniforms.pads",i,n)}; + if (k < 0) { + k = -k; + } + { + let _2n_1 = 2 * (i32(${qr("uniforms.x_shape",i,t)}) - 1); + k = k % _2n_1; + if(k >= i32(${qr("uniforms.x_shape",i,t)})) { + k = _2n_1 - k; + } + } + offset += k * i32(${qr("uniforms.x_strides",i,t)}); + `;return` + var offset = 0; + var k = 0; + ${r} + value = x[offset]; + `},ZT=(e,t,n)=>{let r="";for(let i=t-1;i>=0;--i)r+=` + k = i32(${e.indicesGet("indices",i)}) - ${qr("uniforms.pads",i,n)}; + if (k < 0) { + k = 0; + } + if (k >= i32(${qr("uniforms.x_shape",i,t)})) { + k = i32(${qr("uniforms.x_shape",i,t)}) - 1; + } + offset += k * i32(${qr("uniforms.x_strides",i,t)}); + `;return` + var offset = 0; + var k = 0; + ${r} + value = x[offset]; + `},QT=(e,t,n)=>{let r="";for(let i=t-1;i>=0;--i)r+=` + k = i32(${e.indicesGet("indices",i)}) - ${qr("uniforms.pads",i,n)}; + if (k < 0) { + k += i32(${qr("uniforms.x_shape",i,t)}]); + } + if (k >= i32(${qr("uniforms.x_shape",i,t)})) { + k -= i32(${qr("uniforms.x_shape",i,t)}); + } + offset += k * i32(${qr("uniforms.x_strides",i,t)}); + `;return` + var offset = 0; + var k = 0; + ${r} + value = x[offset]; + `},eR=(e,t,n)=>{switch(n.mode){case 0:return YT(e,t,n.pads.length);case 1:return JT(e,t,n.pads.length);case 2:return ZT(e,t,n.pads.length);case 3:return QT(e,t,n.pads.length);default:throw new Error("Invalid mode")}},tR=(e,t)=>{let n=kn.padShape(e[0].dims.slice(),t.pads),r=e[0].dims,i=kn.size(n),a=[{type:12,data:i},{type:6,data:t.pads}],o=e.length>=3&&e[2].data;t.mode===0&&a.push({type:o?e[2].dataType:1,data:t.value}),a.push(...Jr(e[0].dims,n));let l=["rank"],c=u=>{let d=Vr("output",e[0].dataType,n.length),h=Wn("x",e[0].dataType,r.length),p=h.type.value,f=eR(d,r.length,t),b=[{name:"output_size",type:"u32"},{name:"pads",type:"i32",length:t.pads.length}];return t.mode===0&&b.push({name:"constant_value",type:o?p:"f32"}),` + ${u.registerUniforms(b).declareVariables(h,d)} + ${u.mainStart()} + ${u.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let indices = ${d.offsetToIndices("global_idx")}; + + var value = ${p}(0); + ${f} + output[global_idx] = value; + }`};return{name:"Pad",shaderCache:{hint:`${t.mode}${o}`,inputDependencies:l},getRunData:()=>({outputs:[{dims:n,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(kn.size(n)/64)},programUniforms:a}),getShaderSource:c}},nR=(e,t)=>{if(e.length>1){let n=e[1].getBigInt64Array(),r=e.length>=3&&e[2].data?e[2].dataType===10?e[2].getUint16Array()[0]:e[2].getFloat32Array()[0]:0,i=e[0].dims.length,a=new Int32Array(2*i).fill(0);if(e.length>=4){let l=e[3].getBigInt64Array();for(let c=0;ca[Number(c)]=Number(l));let o=[];return a.forEach(l=>o.push(l)),{mode:t.mode,value:r,pads:o}}else return t},QD=(e,t)=>{XT(e.inputs);let n=nR(e.inputs,t);e.compute(tR(e.inputs,n),{inputs:[0]})}}),Kg,jz,Cz,Nz,Ez,rR,sR,Iz,kz,eV,tV,Az,nV,rV,Mz,sV,iV,aV,oV,The=dr(()=>{bd(),ps(),ws(),Ss(),Kg=e=>{if(Fi.webgpu.validateInputContent&&(!e||e.length!==1))throw new Error("Pool ops requires 1 input.")},jz=(e,t,n)=>{let r=t.format==="NHWC",i=e.dims.slice();r&&i.splice(1,0,i.pop());let a=Object.hasOwnProperty.call(t,"dilations"),o=t.kernelShape.slice(),l=t.strides.slice(),c=a?t.dilations.slice():[],u=t.pads.slice();xw.adjustPoolAttributes(n,i,o,l,c,u);let d=xw.computePoolOutputShape(n,i,l,c,o,u,t.autoPad),h=Object.assign({},t);a?Object.assign(h,{kernelShape:o,strides:l,pads:u,dilations:c,cacheKey:t.cacheKey}):Object.assign(h,{kernelShape:o,strides:l,pads:u,cacheKey:t.cacheKey});let p=d.slice();return p.push(p.splice(1,1)[0]),[h,r?p:d]},Cz=(e,t)=>{let n=t.format==="NHWC",r=kn.size(e),i=kn.size(t.kernelShape),a=[{type:12,data:r},{type:12,data:i}],o=[{name:"outputSize",type:"u32"},{name:"kernelSize",type:"u32"}];if(t.kernelShape.length<=2){let l=t.kernelShape[t.kernelShape.length-1],c=t.strides[t.strides.length-1],u=t.pads[t.pads.length/2-1],d=t.pads[t.pads.length-1],h=!!(u+d);a.push({type:12,data:l},{type:12,data:c},{type:12,data:u},{type:12,data:d}),o.push({name:"kw",type:"u32"},{name:"sw",type:"u32"},{name:"pwStart",type:"u32"},{name:"pwEnd",type:"u32"});let p=!1;if(t.kernelShape.length===2){let f=t.kernelShape[t.kernelShape.length-2],b=t.strides[t.strides.length-2],g=t.pads[t.pads.length/2-2],y=t.pads[t.pads.length-2];p=!!(g+y),a.push({type:12,data:f},{type:12,data:b},{type:12,data:g},{type:12,data:y}),o.push({name:"kh",type:"u32"},{name:"sh",type:"u32"},{name:"phStart",type:"u32"},{name:"phEnd",type:"u32"})}return[a,o,!0,h,p]}else{if(n)throw new Error("Pooling with kernelShape.length > 2 is not supported for NHWC format.");let l=kn.computeStrides(t.kernelShape);a.push({type:12,data:l},{type:12,data:t.pads},{type:12,data:t.strides}),o.push({name:"kernelStrides",type:"u32",length:l.length},{name:"pads",type:"u32",length:t.pads.length},{name:"strides",type:"u32",length:t.strides.length});let c=t.pads.reduce((u,d)=>u+d);return[a,o,!!c,!1,!1]}},Nz=(e,t,n,r,i,a,o,l,c,u,d,h)=>{let p=i.format==="NHWC",f=t.type.value,b=Vr("output",t.type.tensor,r);if(i.kernelShape.length<=2){let g="",y="",w="",v=n-(p?2:1);if(d?g=` + for (var i: u32 = 0u; i < uniforms.kw; i++) { + xIndices[${v}] = indices[${v}] * uniforms.sw - uniforms.pwStart + i; + if (xIndices[${v}] < 0 || xIndices[${v}] + >= uniforms.x_shape[${v}]) { + pad++; + continue; + } + let x_val = x[${t.indicesToOffset("xIndices")}]; + ${a} + }`:g=` + for (var i: u32 = 0u; i < uniforms.kw; i++) { + xIndices[${v}] = indices[${v}] * uniforms.sw - uniforms.pwStart + i; + let x_val = x[${t.indicesToOffset("xIndices")}]; + ${a} + }`,i.kernelShape.length===2){let m=n-(p?3:2);h?y=` + for (var j: u32 = 0u; j < uniforms.kh; j++) { + xIndices[${m}] = indices[${m}] * uniforms.sh - uniforms.phStart + j; + if (xIndices[${m}] < 0 || xIndices[${m}] >= uniforms.x_shape[${m}]) { + pad += i32(uniforms.kw); + continue; + } + `:y=` + for (var j: u32 = 0u; j < uniforms.kh; j++) { + xIndices[${m}] = indices[${m}] * uniforms.sh - uniforms.phStart + j; + `,w=` + } + `}return` + ${e.registerUniforms(c).declareVariables(t,b)} + + ${e.mainStart()} + ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + + let indices = ${b.offsetToIndices("global_idx")}; + var xIndices = ${b.offsetToIndices("global_idx")}; + + var value = ${f}(${l}); + var pad = 0; + ${y} + ${g} + ${w} + ${o} + + output[global_idx] = value; + }`}else{if(p)throw new Error("Pooling with kernelShape.length > 2 is not supported for NHWC format.");let g=i.kernelShape.length,y=i.pads.length,w="";return u?w=` + if (xIndices[j] >= uniforms.x_shape[j]) { + pad++; + isPad = true; + break; + } + } + if (!isPad) { + let x_val = x[${t.indicesToOffset("xIndices")}]; + ${a} + }`:w=` + } + let x_val = x[${t.indicesToOffset("xIndices")}]; + ${a} + `,` + ${e.registerUniforms(c).declareVariables(t,b)} + + ${e.mainStart()} + ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + let indices = ${b.offsetToIndices("global_idx")}; + var xIndices = ${b.offsetToIndices("global_idx")}; + + var offsets: array; + + var value = ${f}(${l}); + var pad = 0; + var isPad = false; + + for (var i: u32 = 0u; i < uniforms.kernelSize; i++) { + var offset = i; + for (var j = 0u; j < ${g-1}u; j++) { + offsets[j] = offset / ${qr("uniforms.kernelStrides","j",g)}; + offset -= offsets[j] * ${qr("uniforms.kernelStrides","j",g)}; + } + offsets[${g-1}] = offset; + + isPad = false; + for (var j = ${n-g}u; j < ${n}u; j++) { + xIndices[j] = indices[j] * ${qr("uniforms.strides",`j - ${n-g}u`,g)} + + offsets[j - ${n-g}u] - ${qr("uniforms.pads","j - 2u",y)}; + ${w} + } + ${o} + + output[global_idx] = value; + }`}},Ez=e=>`${e.format};${e.ceilMode};${e.autoPad};${e.kernelShape.length}`,rR=e=>`${Ez(e)};${e.countIncludePad}`,sR=e=>`${Ez(e)};${e.storageOrder};${e.dilations}`,Iz=e=>({format:e.format,autoPad:["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][e.auto_pad],ceilMode:e.ceil_mode,kernelShape:e.kernel_shape,strides:e.strides,pads:e.pads}),kz=(e,t,n,r)=>{let[i,a]=jz(t,r,n),o=Wn("x",t.dataType,t.dims.length),l=o.type.value,c="value += x_val;",u="";i.countIncludePad?u+=`value /= ${l}(uniforms.kernelSize);`:u+=`value /= ${l}(i32(uniforms.kernelSize) - pad);`;let[d,h,p,f,b]=Cz(a,i);d.push(...Jr(t.dims,a));let g=["rank"];return{name:e,shaderCache:{hint:`${r.cacheKey};${p};${f};${b}`,inputDependencies:g},getRunData:()=>({outputs:[{dims:a,dataType:t.dataType}],dispatchGroup:{x:Math.ceil(kn.size(a)/64)},programUniforms:d}),getShaderSource:y=>Nz(y,o,t.dims.length,a.length,i,c,u,0,h,p,f,b)}},eV=e=>{let t=e.count_include_pad!==0,n=Iz(e);if(n.ceilMode!==0)throw new Error("using ceil() in shape computation is not yet supported for AveragePool");let r={countIncludePad:t,...n,cacheKey:""};return{...r,cacheKey:rR(r)}},tV=(e,t)=>{Kg(e.inputs),e.compute(kz("AveragePool",e.inputs[0],!1,t))},Az={autoPad:"",ceilMode:0,countIncludePad:!1,kernelShape:[],strides:[],pads:[],storageOrder:0,dilations:[]},nV=e=>{let t=e.format;return{format:t,...Az,cacheKey:t}},rV=(e,t)=>{Kg(e.inputs),e.compute(kz("GlobalAveragePool",e.inputs[0],!0,t))},Mz=(e,t,n,r)=>{let[i,a]=jz(t,r,n),o=` + value = max(x_val, value); + `,l="",c=Wn("x",t.dataType,t.dims.length),u=["rank"],[d,h,p,f,b]=Cz(a,i);return d.push(...Jr(t.dims,a)),{name:e,shaderCache:{hint:`${r.cacheKey};${p};${f};${b}`,inputDependencies:u},getRunData:()=>({outputs:[{dims:a,dataType:t.dataType}],dispatchGroup:{x:Math.ceil(kn.size(a)/64)},programUniforms:d}),getShaderSource:g=>Nz(g,c,t.dims.length,a.length,i,o,l,t.dataType===10?-65504:-1e5,h,p,f,b)}},sV=(e,t)=>{Kg(e.inputs),e.compute(Mz("MaxPool",e.inputs[0],!1,t))},iV=e=>{let t=e.storage_order,n=e.dilations,r=Iz(e);if(t!==0)throw new Error("column major storage order is not yet supported for MaxPool");if(r.ceilMode!==0)throw new Error("using ceil() in shape computation is not yet supported for MaxPool");let i={storageOrder:t,dilations:n,...r,cacheKey:""};return{...i,cacheKey:sR(i)}},aV=e=>{let t=e.format;return{format:t,...Az,cacheKey:t}},oV=(e,t)=>{Kg(e.inputs),e.compute(Mz("GlobalMaxPool",e.inputs[0],!0,t))}}),iR,aR,lV,cV,Rhe=dr(()=>{ps(),ws(),la(),Ss(),iR=(e,t)=>{if(e.length<2||e.length>3)throw new Error("DequantizeLinear requires 2 or 3 inputs.");if(e.length===3&&e[1].dims===e[2].dims)throw new Error("x-scale and x-zero-point must have the same shape.");if(e.length===3&&e[0].dataType!==e[2].dataType)throw new Error("x and x-zero-point must have the same data type.");if(e[0].dataType===6&&e.length>2)throw new Error("In the case of dequantizing int32 there is no zero point.");if(e[1].dims.length!==0&&e[1].dims.length!==1&&e[1].dims.length!==e[0].dims.length)throw new Error("scale input must be a scalar, a 1D tensor, or have the same rank as the input tensor.");if(e.length>2){if(e[0].dataType!==e[2].dataType)throw new Error("x and x-zero-point must have the same data type.");if(e[1].dims.length!==e[2].dims.length)throw new Error("scale and zero-point inputs must have the same rank.");if(!e[1].dims.map((n,r)=>n===e[2].dims[r]).reduce((n,r)=>n&&r,!0))throw new Error("scale and zero-point inputs must have the same shape.")}if(t.blockSize>0){if(e[1].dims.length===0||e[1].dims.length===1&&e[1].dims[0]===1)throw new Error("blockSize must be set only for block quantization.");if(!e[1].dims.map((i,a)=>a===t.axis||i===e[0].dims[a]).reduce((i,a)=>i&&a,!0))throw new Error("For block qunatization, scale input shape to match the input shape except for the axis");if(e[1].dims.length!==e[0].dims.length)throw new Error("For block qunatization the scale input rank must be the same as the x rank.");let n=e[0].dims[t.axis],r=e[1].dims[t.axis];if(t.blockSizeMath.ceil(n/(r-1)-1))throw new Error("blockSize must be with in the range [ceil(dI / Si), ceil(dI / (Si - 1) - 1)].")}},aR=(e,t)=>{let n=kn.normalizeAxis(t.axis,e[0].dims.length),r=e[0].dataType,i=r===3,a=e[0].dims,o=e[1].dataType,l=kn.size(a),c=r===3||r===2,u=c?[Math.ceil(kn.size(e[0].dims)/4)]:e[0].dims,d=e[1].dims,h=e.length>2?e[2]:void 0,p=h?c?[Math.ceil(kn.size(h.dims)/4)]:h.dims:void 0,f=d.length===0||d.length===1&&d[0]===1,b=f===!1&&d.length===1,g=Ji(l),y=f&&(!c||g===4),w=y?g:1,v=y&&!c?g:1,m=Wn("input",c?12:r,u.length,v),z=Wn("scale",o,d.length),C=h?Wn("zero_point",c?12:r,p.length):void 0,E=Vr("output",o,a.length,w),I=[m,z];C&&I.push(C);let R=[u,d];h&&R.push(p);let A=[{type:12,data:l/w},{type:12,data:n},{type:12,data:t.blockSize},...Jr(...R,a)],O=F=>{let L=[{name:"output_size",type:"u32"},{name:"axis",type:"u32"},{name:"block_size",type:"u32"}];return` + ${F.registerUniforms(L).declareVariables(...I,E)} + ${F.mainStart()} + ${F.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let output_indices = ${E.offsetToIndices("global_idx")}; + + // Set input x + ${c?` + let input = ${m.getByOffset("global_idx / 4")}; + let x_vec = ${i?"unpack4xI8(input)":"unpack4xU8(input)"}; + let x_value = ${w===1?"x_vec[global_idx % 4]":"x_vec"};`:`let x_value = ${m.getByOffset("global_idx")};`}; + + // Set scale input + ${f?`let scale_value= ${z.getByOffset("0")}`:b?` + let scale_index = ${E.indicesGet("output_indices","uniforms.axis")}; + let scale_value= ${z.getByOffset("scale_index")};`:` + var scale_indices: ${z.type.indices} = output_indices; + let index = ${z.indicesGet("scale_indices","uniforms.axis")} / uniforms.block_size; + ${z.indicesSet("scale_indices","uniforms.axis","index")}; + let scale_value= ${z.getByIndices("scale_indices")};`}; + + // Set zero-point input + ${C?f?c?` + let zero_point_input = ${C.getByOffset("0")}; + let zero_point_vec = ${i?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; + let zero_point_value= zero_point_vec[0]`:`let zero_point_value = ${C.getByOffset("0")}`:b?c?` + let zero_point_index = ${E.indicesGet("output_indices","uniforms.axis")}; + let zero_point_input = ${C.getByOffset("zero_point_index / 4")}; + let zero_point_vec = ${i?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; + let zero_point_value = zero_point_vec[zero_point_index % 4]`:` + let zero_point_index = ${E.indicesGet("output_indices","uniforms.axis")}; + let zero_point_value = ${C.getByOffset("zero_point_index")};`:c?` + let zero_point_offset = ${z.indicesToOffset("scale_indices")}; + let zero_point_input = ${C.getByOffset("zero_point_offset / 4")}; + let zero_point_vec = ${i?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; + let zero_point_value = zero_point_vec[zero_point_offset % 4];`:`let zero_point_value = ${C.getByIndices("scale_indices")};`:`let zero_point_value = ${c?i?"i32":"u32":m.type.value}(0);`}; + // Compute and write output + ${E.setByOffset("global_idx",`${E.type.value}(x_value - zero_point_value) * scale_value`)}; + }`};return{name:"DequantizeLinear",shaderCache:{hint:t.cacheKey,inputDependencies:C?["rank","rank","rank"]:["rank","rank"]},getShaderSource:O,getRunData:()=>({outputs:[{dims:a,dataType:o}],dispatchGroup:{x:Math.ceil(l/w/64),y:1,z:1},programUniforms:A})}},lV=(e,t)=>{iR(e.inputs,t),e.compute(aR(e.inputs,t))},cV=e=>fi({axis:e.axis,blockSize:e.blockSize})}),oR,lR,uV,Phe=dr(()=>{bd(),ps(),Ss(),oR=(e,t,n)=>{let r=e===t,i=et&&n>0;if(r||i||a)throw new Error("Range these inputs' contents are invalid.")},lR=(e,t,n,r)=>{let i=Math.abs(Math.ceil((t-e)/n)),a=[i],o=i,l=[{type:12,data:o},{type:r,data:e},{type:r,data:n},...Jr(a)],c=u=>{let d=Vr("output",r,a.length),h=d.type.value,p=[{name:"outputSize",type:"u32"},{name:"start",type:h},{name:"delta",type:h}];return` + ${u.registerUniforms(p).declareVariables(d)} + ${u.mainStart()} + ${u.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + output[global_idx] = uniforms.start + ${h}(global_idx) * uniforms.delta; + }`};return{name:"Range",shaderCache:{hint:`${r}`},getShaderSource:c,getRunData:()=>({outputs:[{dims:a,dataType:r}],dispatchGroup:{x:Math.ceil(o/64)},programUniforms:l})}},uV=e=>{let t=0,n=0,r=0;e.inputs[0].dataType===6?(t=e.inputs[0].getInt32Array()[0],n=e.inputs[1].getInt32Array()[0],r=e.inputs[2].getInt32Array()[0]):e.inputs[0].dataType===1&&(t=e.inputs[0].getFloat32Array()[0],n=e.inputs[1].getFloat32Array()[0],r=e.inputs[2].getFloat32Array()[0]),Fi.webgpu.validateInputContent&&oR(t,n,r),e.compute(lR(t,n,r,e.inputs[0].dataType),{inputs:[]})}}),cR,uR,dV,hV,Ohe=dr(()=>{ps(),ws(),la(),Ss(),cR=(e,t,n,r)=>{if(e!=="none"&&r!=="i32"&&r!=="u32"&&r!=="f32")throw new Error(`Input ${r} is not supported with reduction ${e}.`);let i=`{ + var oldValue = 0; + loop { + let newValueF32 =`,a=`; + let newValue = bitcast(newValueF32); + let res = atomicCompareExchangeWeak(&${t}, oldValue, newValue); + if res.exchanged { + break; + } + oldValue = res.old_value; + } + }`;switch(e){case"none":return`${t}=${n};`;case"add":return r==="i32"||r==="u32"?`atomicAdd(&${t}, bitcast<${r}>(${n}));`:` + ${i}bitcast<${r}>(oldValue) + (${n})${a}`;case"max":return r==="i32"||r==="u32"?`atomicMax(&${t}, bitcast<${r}>(${n}));`:` + ${i}max(bitcast(oldValue), (${n}))${a}`;case"min":return r==="i32"||r==="u32"?`atomicMin(&${t}, bitcast<${r}>(${n}));`:`${i}min(bitcast<${r}>(oldValue), (${n}))${a}`;case"mul":return`${i}(bitcast<${r}>(oldValue) * (${n}))${a}`;default:throw new Error(`Reduction ${e} is not supported.`)}},uR=(e,t)=>{let n=e[0].dims,r=e[1].dims,i=n,a=1,o=Math.ceil(kn.size(r)/a),l=r[r.length-1],c=kn.sizeFromDimension(n,l),u=[{type:12,data:o},{type:12,data:l},{type:12,data:c},...Jr(e[1].dims,e[2].dims,i)],d=h=>{let p=Wn("indices",e[1].dataType,e[1].dims.length),f=Wn("updates",e[2].dataType,e[2].dims.length,a),b=t.reduction!=="none"&&t.reduction!==""?WF("output",e[0].dataType,i.length):Vr("output",e[0].dataType,i.length,a);return` + ${h.registerUniform("output_size","u32").registerUniform("last_index_dimension","u32").registerUniform("num_updates_elements","u32").declareVariables(p,f,b)} + ${h.mainStart()} + ${h.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + var hasDuplicates = false; + if (${t.reduction==="none"}) { + let n = ${kn.size(r)}; + for (var i = 0; i < n; i = i + 1) { + for (var j = i + 1; j < n; j = j + 1) { + var index_i = i32(indices[i].x); + var index_j = i32(indices[j].x); + if (index_i == index_j) { + hasDuplicates = true; + break; + } + } + if (hasDuplicates) { + break; + } + } + } + + var data_offset = 0u; + var indices_start = uniforms.last_index_dimension * global_idx; + if (${t.reduction==="none"} && hasDuplicates) { + if (global_idx != 0u) { + return; + } + indices_start = 0u; + } + let indices_end = indices_start + uniforms.last_index_dimension; + for (var i = indices_start; i < indices_end; i++) { + var index = i32(indices[i].x); + ${e[0].dims.length===1?` + let element_count_dim = uniforms.output_strides; + let dim_value = uniforms.output_shape;`:` + let element_count_dim = uniforms.output_strides[i - indices_start]; + let dim_value = uniforms.output_shape[i - indices_start + uniforms.last_index_dimension];`} + if (index >= 0) { + if (index >= i32(dim_value)) { + index = i32(dim_value - 1); + } + } else { + if (index < -i32(dim_value)) { + index = 0; + } else { + index += i32(dim_value); + } + } + data_offset += u32((u32(index) * element_count_dim)); + } + + for (var i = 0u; i < uniforms.num_updates_elements; i++) { + let value = updates[uniforms.num_updates_elements * global_idx + i]; + ${cR(t.reduction,"output[data_offset + i]","value",b.type.value)} + } + + }`};return{name:"ScatterND",shaderCache:{hint:`${t.cacheKey}_${t.reduction}`,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:i,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(o/64)},programUniforms:u}),getShaderSource:d}},dV=e=>fi({reduction:e.reduction}),hV=(e,t)=>{e.compute(uR(e.inputs,t),{inputs:[e.inputs[1],e.inputs[2]],outputs:[]})}}),dR,hR,pR,Tz,fR,mR,gR,xR,bR,yR,vR,wR,Rz,_R,zR,$R,SR,jR,pV,fV,Lhe=dr(()=>{ps(),ws(),la(),Ss(),dR=(e,t)=>{if(e.every(n=>n>0||(()=>{throw new Error("Resize requires scales input values to be positive")})),e.length>0){if(t.mode==="linear"){if(!(e.length===2||e.length===3||e.length===4&&e[0]===1&&e[1]===1||e.length===4&&e[0]===1&&e[3]===1||e.length===5&&e[0]===1&&e[1]===1))throw new Error(`For linear mode, Resize requires scales to be 2D, 3D, 4D with either two outermost or one innermost and + one outermost scale values equal to 1, or 5D with two outermost scale values equal to 1`)}else if(t.mode==="cubic"&&!(e.length===2||e.length===4&&e[0]===1&&e[1]===1||e.length===4&&e[0]===1&&e[3]===1))throw new Error("Resize requires scales input size to be 2 or 4 for cubic mode")}},hR=(e,t,n)=>{t.every(i=>i>=0&&i{throw new Error("Resize requires axes input values to be positive and less than rank")}));let r=new Array(n).fill(1);return t.forEach((i,a)=>r[i]=e[a]),r},pR=(e,t,n,r,i,a)=>{let[o,l,c]=n>10?[1,2,3]:[-1,e.length>1?1:-1,-1],u=e[0].dims.length;if(o>0&&e.length>o&&e[o].dims.length>0)e[o].getFloat32Array().forEach(d=>a.push(d));else if(t.coordinateTransformMode==="tf_crop_and_resize")throw new Error("Resize requires RoI input to be specified when coordinateTransformMode is tfCropAndResize");if(l>0&&e.length>l&&e[l].dims.length===1&&e[l].dims[0]>0){if(e[l].getFloat32Array().forEach(d=>r.push(d)),r.length!==0&&r.length!==u&&n>=18&&r.length!==t.axes.length)throw new Error("Resize requires scales input size to be same as input rank or axes size for opset 18 and up");dR(r,t),t.axes.length>0&&hR(r,t.axes,u).forEach((d,h)=>r[h]=d)}if(c>0&&e.length>c&&e[c].dims.length===1&&e[c].dims[0]>0&&(e[c].getBigInt64Array().forEach(d=>i.push(Number(d))),i.length!==0&&i.length!==u&&n>=18&&i.length!==t.axes.length))throw new Error("Resize requires sizes input size to be same as input rank or axes size for opset 18 and up");if(t.axes.length>0){if(r.length!==0&&r.length!==t.axes.length)throw new Error('Resize requires "scales" input size to be of axes rank when axes attributes is specified');if(i.length!==0&&i.length!==t.axes.length)throw new Error('Resize requires "sizes" input size to be of rank axes rank when axes attributes is specified')}if(typeof r<"u"&&typeof i<"u"&&r.length>0&&i.length>u)throw new Error("Resize requires only of scales or sizes to be specified")},Tz=(e,t,n,r)=>` + // The whole part and the fractional part are calculated separately due to inaccuracy of floating + // point division. As an example, f32(21) / f32(7) may evaluate to 2.99... instead of 3, causing an + // offset-by-one error later in floor(). + let big = (${e}) * (${t}); + let whole = ${r}(big / (${n})); + let fract = ${r}(big % (${n})) / ${r}(${n}); + return whole + fract; +`,fR=(e,t)=>`fn getOriginalCoordinateFromResizedCoordinate(xResized: u32, xScale: f32, lengthResized: u32, + lengthOriginal: u32, roiStart: f32, roiEnd: f32) -> ${t} { `+(()=>{switch(e){case"asymmetric":return` + if (xScale < 1.0 || floor(xScale) != xScale) { + return ${t}(xResized) / ${t}(xScale); + } else { + ${Tz("xResized","lengthOriginal","lengthResized",t)} + } + `;case"pytorch_half_pixel":return`if (lengthResized > 1) { + return (${t}(xResized) + 0.5) / ${t}(xScale) - 0.5; + } else { + return 0.0; + }`;case"tf_half_pixel_for_nn":return`return (${t}(xResized) + 0.5) / ${t}(xScale);`;case"align_corners":return`if (lengthResized == 1) { + return 0.0; + } else { + ${Tz("xResized","lengthOriginal - 1","lengthResized - 1",t)} + }`;case"tf_crop_and_resize":return`if (lengthResized > 1) { + return ${t}(roiStart) * ${t}(lengthOriginal - 1) + + (${t}(xResized) * ${t}(roiEnd - roiStart) * ${t}(lengthOriginal - 1)) / + ${t}(lengthResized - 1); + } else { + return 0.5 * ${t}(roiStart + roiEnd) * ${t}(lengthOriginal - 1); + }`;case"half_pixel_symmetric":return`const outputWidth = ${t}xScale * ${t}(lengthResized); + const adjustment = ${t}(lengthResized) / outputWidth; + const center = ${t}(lengthOriginal) / 2; + const offset = center * (1 - adjustment); + return offset + ((${t}(xResized) + 0.5) / ${t}(xScale)) - 0.5;`;case"half_pixel":return`return ((${t}(xResized) + 0.5) / ${t}(xScale)) - 0.5;`;default:throw new Error(`Coordinate transform mode ${e} is not supported`)}})()+"}",mR=(e,t,n)=>`fn getNearestPixelFromOriginal(xOriginal: ${n}, isDownSample: bool) -> ${n} {`+(()=>{switch(e){case"round_prefer_ceil":return"if (fract(xOriginal) == 0.5) { return ceil(xOriginal); } else { return round(xOriginal); }";case"floor":return"return floor(xOriginal);";case"ceil":return"return ceil(xOriginal);";case"round_prefer_floor":return"if (fract(xOriginal) == 0.5) { return floor(xOriginal); } else { return round(xOriginal); }";case"simple":default:if(t<11)return"if (isDownSample) { return ceil(xOriginal); } else { return xOriginal; }";throw new Error(`Nearest mode ${e} is not supported`)}})()+"}",gR=(e,t,n)=>{let r=new Array(n).fill(0).concat(new Array(n).fill(1)),i=e.length===0?r:e.slice();return t.length>0?(t.forEach((a,o)=>{r[a]=i[o],r[o+n]=i[t.length+o]}),r):i},xR=(e,t,n,r)=>{let i=[];if(n.length>0)if(r.length>0){if(e.forEach(a=>i.push(a)),Math.max(...r)>e.length)throw new Error("axes is out of bound");r.forEach((a,o)=>i[a]=n[o])}else n.forEach(a=>i.push(a));else{if(t.length===0)throw new Error("Resize requires either scales or sizes.");i=e.map((a,o)=>Math.round(a*t[o]))}return i},bR=(e,t,n)=>{let r=(()=>{switch(n.keepAspectRatioPolicy){case"not_larger":return n.axes.length>0?Math.min(...n.axes.map(a=>t[a]),Number.MAX_VALUE):Math.min(...t,Number.MAX_VALUE);case"not_smaller":return n.axes.length>0?Math.max(...n.axes.map(a=>t[a]),Number.MIN_VALUE):Math.max(...t,Number.MIN_VALUE);default:throw new Error(`Keep aspect ratio policy ${n.keepAspectRatioPolicy} is not supported`)}})();t.fill(1,0,t.length);let i=e.slice();return n.axes.length>0?(n.axes.forEach(a=>t[a]=r),n.axes.forEach(a=>i[a]=Math.round(e[a]*t[a]))):(t.fill(r,0,t.length),i.forEach((a,o)=>i[o]=Math.round(a*t[o]))),i},yR=(e,t,n,r,i)=>` + fn calculateOriginalIndicesFromOutputIndices(output_indices: ${e.type.indices}) -> array<${e.type.value}, ${n.length}> { + var original_indices: array<${e.type.value}, ${n.length}>; + for (var i:u32 = 0; i < ${n.length}; i++) { + var output_index = ${e.indicesGet("output_indices","i")}; + var scale = ${qr("uniforms.scales","i",r)}; + var roi_low = ${qr("uniforms.roi","i",i)}; + var roi_hi = ${qr("uniforms.roi",`i + ${t.length}`,i)}; + if (scale == 1.0) { + original_indices[i] = ${e.type.value}(output_index); + } else { + var input_shape_i = ${qr("uniforms.input_shape","i",t.length)}; + var output_shape_i = ${qr("uniforms.output_shape","i",n.length)}; + original_indices[i] = getOriginalCoordinateFromResizedCoordinate(output_index, scale, output_shape_i, + input_shape_i, roi_low, roi_hi); + } + } + return original_indices; + }`,vR=(e,t,n,r,i,a,o)=>` + fn calculateInputIndicesFromOutputIndices(output_indices: ${t.type.indices}) -> ${e.type.indices} { + var input_indices: ${e.type.indices}; + for (var i:u32 = 0; i < ${r.length}; i++) { + var output_index = ${t.indicesGet("output_indices","i")}; + var input_index: u32; + var scale = ${qr("uniforms.scales","i",i)}; + if (scale == 1.0) { + input_index = output_index; + } else { + var roi_low = ${qr("uniforms.roi","i",a)}; + var roi_hi = ${qr("uniforms.roi",`i + ${n.length}`,a)}; + var input_shape_i = ${qr("uniforms.input_shape","i",n.length)}; + var output_shape_i = ${qr("uniforms.output_shape","i",r.length)}; + var original_idx = getOriginalCoordinateFromResizedCoordinate(output_index, scale, output_shape_i, + input_shape_i, roi_low, roi_hi); + if (!${o} || (original_idx >= 0 && original_idx < ${t.type.value}(input_shape_i))) { + if (original_idx < 0) { + input_index = 0; + } else if (original_idx > ${t.type.value}(input_shape_i - 1)) { + input_index = input_shape_i - 1; + } else { + input_index = u32(getNearestPixelFromOriginal(original_idx, scale < 1)); + } + } else { + input_index = u32(original_idx); + } + } + ${e.indicesSet("input_indices","i","input_index")} + } + return input_indices; + }`,wR=(e,t)=>` + fn checkInputIndices(input_indices: ${e.type.indices}) -> bool { + for (var i:u32 = 0; i < ${t.length}; i++) { + var input_index = ${e.indicesGet("input_indices","i")}; + if (input_index < 0 || input_index >= ${qr("uniforms.input_shape","i",t.length)}) { + return false; + } + } + return true; + }`,Rz=(e,t,n,r)=>e.rank>r?` + ${e.indicesSet("input_indices",t,"channel")}; + ${e.indicesSet("input_indices",n,"batch")}; +`:"",_R=(e,t,n,r,i)=>{let[a,o,l,c]=n.length===2?[-1,0,1,-1]:[0,2,3,1],u=e.type.value;return` + fn getInputValue(batch: u32, channel: u32, row: u32, col: u32) -> ${u} { + var input_indices: ${e.type.indices}; + ${e.indicesSet("input_indices",o,`max(0, min(row, ${n[o]} - 1))`)}; + ${e.indicesSet("input_indices",l,`max(0, min(col, ${n[l]} - 1))`)}; + ${Rz(e,c,a,2)} + return ${e.getByIndices("input_indices")}; + } + + fn bilinearInterpolation(output_indices: ${t.type.indices}) -> ${u} { + var originalIndices = calculateOriginalIndicesFromOutputIndices(output_indices); + var row:${u} = originalIndices[${o}]; + var col:${u} = originalIndices[${l}]; + ${r?`if (row < 0 || row > (${n[o]} - 1) || col < 0 || col > (${n[l]} - 1)) { + return ${i}; + }`:""}; + row = max(0, min(row, ${n[o]} - 1)); + col = max(0, min(col, ${n[l]} - 1)); + var row1: u32 = u32(row); + var col1: u32 = u32(col); + var row2: u32 = u32(row + 1); + var col2: u32 = u32(col + 1); + var channel: u32 = ${n.length>2?`u32(originalIndices[${c}])`:"0"}; + var batch: u32 = ${n.length>2?`u32(originalIndices[${a}])`:"0"}; + var x11: ${u} = getInputValue(batch, channel, row1, col1); + var x12: ${u} = getInputValue(batch, channel, row1, col2); + var x21: ${u} = getInputValue(batch, channel, row2, col1); + var x22: ${u} = getInputValue(batch, channel, row2, col2); + var dx1: ${u} = abs(row - ${u}(row1)); + var dx2: ${u} = abs(${u}(row2) - row); + var dy1: ${u} = abs(col - ${u}(col1)); + var dy2: ${u} = abs(${u}(col2) - col); + if (row1 == row2) { + dx1 = 0.5; + dx2 = 0.5; + } + if (col1 == col2) { + dy1 = 0.5; + dy2 = 0.5; + } + return (x11 * dx2 * dy2 + x12 * dx2 * dy1 + x21 * dx1 * dy2 + x22 * dx1 * dy1); + }`},zR=(e,t,n,r,i,a,o,l,c,u)=>{let d=n.length===2,[h,p]=d?[0,1]:[2,3],f=e.type.value,b=g=>{let y=g===h?"row":"col";return` + fn ${y}CubicInterpolation(input_indices: ${e.type.indices}, output_indices: ${t.type.indices}) -> ${f} { + var output_index = ${t.indicesGet("output_indices",g)}; + var originalIdx: ${f} = getOriginalCoordinateFromResizedCoordinate(output_index, ${i[g]}, + ${r[g]}, ${n[g]}, ${a[g]}, ${a[g]} + ${n.length}); + var fractOriginalIdx: ${f} = originalIdx - floor(originalIdx); + var coefs = getCubicInterpolationCoefs(fractOriginalIdx); + + if (${l} && (originalIdx < 0 || originalIdx > (${n[g]} - 1))) { + return ${c}; + } + var data: array<${f}, 4> = array<${f}, 4>(0.0, 0.0, 0.0, 0.0); + for (var i: i32 = -1; i < 3; i++) { + var ${y}: ${f} = originalIdx + ${f}(i); + if (${y} < 0 || ${y} >= ${n[g]}) { + ${u?`coefs[i + 1] = 0.0; + continue;`:l?`return ${c};`:`${y} = max(0, min(${y}, ${n[g]} - 1));`}; + } + var input_indices_copy: ${e.type.indices} = input_indices; + ${e.indicesSet("input_indices_copy",g,`u32(${y})`)}; + data[i + 1] = ${g===h?e.getByIndices("input_indices_copy"):"rowCubicInterpolation(input_indices_copy, output_indices)"}; + } + return cubicInterpolation1D(data, coefs); + }`};return` + ${b(h)}; + ${b(p)}; + fn getCubicInterpolationCoefs(s: ${f}) -> array<${f}, 4> { + var absS = abs(s); + var coeffs: array<${f}, 4> = array<${f}, 4>(0.0, 0.0, 0.0, 0.0); + var oneMinusAbsS: ${f} = 1.0 - absS; + var twoMinusAbsS: ${f} = 2.0 - absS; + var onePlusAbsS: ${f} = 1.0 + absS; + coeffs[0] = ((${o} * onePlusAbsS - 5 * ${o}) * onePlusAbsS + 8 * ${o}) * onePlusAbsS - 4 * ${o}; + coeffs[1] = ((${o} + 2) * absS - (${o} + 3)) * absS * absS + 1; + coeffs[2] = ((${o} + 2) * oneMinusAbsS - (${o} + 3)) * oneMinusAbsS * oneMinusAbsS + 1; + coeffs[3] = ((${o} * twoMinusAbsS - 5 * ${o}) * twoMinusAbsS + 8 * ${o}) * twoMinusAbsS - 4 * ${o}; + return coeffs; + } + + fn cubicInterpolation1D(x: array<${f}, 4>, coefs: array<${f}, 4>) -> ${f} { + var coefsSum: ${f} = coefs[0] + coefs[1] + coefs[2] + coefs[3]; + return (x[0] * coefs[0] + x[1] * coefs[1]+ x[2] * coefs[2]+ x[3] * coefs[3]) / coefsSum; + } + + fn bicubicInterpolation(output_indices: ${t.type.indices}) -> ${f} { + var input_indices: ${e.type.indices} = output_indices; + return colCubicInterpolation(input_indices, output_indices); + } + `},$R=(e,t,n,r,i)=>{let[a,o,l,c,u]=n.length===3?[-1,0,1,2,-1]:[0,2,3,4,1],d=e.type.value;return` + fn getInputValue(batch: u32, channel: u32, depth:u32, height: u32, width: u32) -> ${d} { + var input_indices: ${e.type.indices}; + ${e.indicesSet("input_indices",o,`max(0, min(depth, ${n[o]} - 1))`)}; + ${e.indicesSet("input_indices",l,`max(0, min(height, ${n[l]} - 1))`)}; + ${e.indicesSet("input_indices",c,`max(0, min(width, ${n[c]} - 1))`)}; + ${Rz(e,u,a,3)} + return ${e.getByIndices("input_indices")}; + } + + fn trilinearInterpolation(output_indices: ${t.type.indices}) -> ${d} { + var originalIndices = calculateOriginalIndicesFromOutputIndices(output_indices); + var depth:${d} = originalIndices[${o}]; + var height:${d} = originalIndices[${l}]; + var width:${d} = originalIndices[${c}]; + ${r?`if (depth < 0 || depth > (${n[o]} - 1) || height < 0 || height > (${n[l]} - 1) || width < 0 || (width > ${n[c]} - 1)) { + return ${i}; + }`:""}; + + depth = max(0, min(depth, ${n[o]} - 1)); + height = max(0, min(height, ${n[l]} - 1)); + width = max(0, min(width, ${n[c]} - 1)); + var depth1: u32 = u32(depth); + var height1: u32 = u32(height); + var width1: u32 = u32(width); + var depth2: u32 = u32(depth + 1); + var height2: u32 = u32(height + 1); + var width2: u32 = u32(width + 1); + var channel: u32 = ${n.length>3?`u32(originalIndices[${u}])`:"0"}; + var batch: u32 = ${n.length>3?`u32(originalIndices[${a}])`:"0"}; + + var x111: ${d} = getInputValue(batch, channel, depth1, height1, width1); + var x112: ${d} = getInputValue(batch, channel, depth1, height1, width2); + var x121: ${d} = getInputValue(batch, channel, depth1, height2, width1); + var x122: ${d} = getInputValue(batch, channel, depth1, height2, width2); + var x211: ${d} = getInputValue(batch, channel, depth2, height1, width1); + var x212: ${d} = getInputValue(batch, channel, depth2, height1, width2); + var x221: ${d} = getInputValue(batch, channel, depth2, height2, width1); + var x222: ${d} = getInputValue(batch, channel, depth2, height2, width2); + var dx1: ${d} = abs(depth - ${d}(depth1)); + var dx2: ${d} = abs(${d}(depth2) - depth); + var dy1: ${d} = abs(height - ${d}(height1)); + var dy2: ${d} = abs(${d}(height2) - height); + var dz1: ${d} = abs(width - ${d}(width1)); + var dz2: ${d} = abs(${d}(width2) - width); + if (depth1 == depth2) { + dx1 = 0.5; + dx2 = 0.5; + } + if (height1 == height2) { + dy1 = 0.5; + dy2 = 0.5; + } + if (width1 == width2) { + dz1 = 0.5; + dz2 = 0.5; + } + return (x111 * dx2 * dy2 * dz2 + x112 * dx2 * dy2 * dz1 + x121 * dx2 * dy1 *dz2 + x122 * dx2 * dy1 * dz1 + + x211 * dx1 * dy2 * dz2 + x212 * dx1 * dy2 * dz1 + x221 * dx1 * dy1 *dz2 + x222 * dx1 * dy1 * dz1); + }`},SR=(e,t,n,r,i,a)=>{let o=e.dims,l=gR(a,t.axes,o.length),c=xR(o,r,i,t.axes),u=r.slice();r.length===0&&(u=o.map((v,m)=>v===0?1:c[m]/v),t.keepAspectRatioPolicy!=="stretch"&&(c=bR(o,u,t)));let d=Vr("output",e.dataType,c.length),h=Wn("input",e.dataType,o.length),p=kn.size(c),f=o.length===c.length&&o.every((v,m)=>v===c[m]),b=t.coordinateTransformMode==="tf_crop_and_resize",g=t.extrapolationValue,y=h.type.value,w=v=>` + ${f?"":` + ${fR(t.coordinateTransformMode,y)}; + ${(()=>{switch(t.mode){case"nearest":return` + ${wR(h,o)}; + ${mR(t.nearestMode,n,y)}; + ${vR(h,d,o,c,u.length,l.length,b)}; + `;case"linear":return` + ${yR(d,o,c,u.length,l.length)}; + ${(()=>{if(o.length===2||o.length===4)return`${_R(h,d,o,b,g)}`;if(o.length===3||o.length===5)return`${$R(h,d,o,b,g)}`;throw Error("Linear mode only supports input dims 2, 3, 4 and 5 are supported in linear mode.")})()}; + `;case"cubic":return` + ${(()=>{if(o.length===2||o.length===4)return`${zR(h,d,o,c,u,l,t.cubicCoeffA,b,t.extrapolationValue,t.excludeOutside)}`;throw Error("Cubic mode only supports input dims 2 and 4 are supported in linear mode.")})()}; + `;default:throw Error("Invalid resize mode")}})()}; + `} + ${v.registerUniform("output_size","u32").registerUniform("scales","f32",u.length).registerUniform("roi","f32",l.length).declareVariables(h,d)} + ${v.mainStart()} + ${v.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + ${f?"output[global_idx] = input[global_idx];":` + let output_indices = ${d.offsetToIndices("global_idx")}; + var input_indices: ${h.type.indices}; + ${(()=>{switch(t.mode){case"nearest":return`input_indices = calculateInputIndicesFromOutputIndices(output_indices); + if (checkInputIndices(input_indices)) { + output[global_idx] = ${h.getByIndices("input_indices")}; + } else { + output[global_idx] = ${t.extrapolationValue}; + }`;case"linear":return`output[global_idx] = ${o.length===2||o.length===4?"bilinearInterpolation":"trilinearInterpolation"}(output_indices);`;case"cubic":return"output[global_idx] = bicubicInterpolation(output_indices);";default:throw Error(`Unsupported resize mode: ${t.mode}`)}})()}; +`} + }`;return{name:"Resize",shaderCache:{hint:`${t.cacheKey}|${n}|${u.length>0?t.mode==="cubic"?u:u.length:""}|${i.length>0?i:""}|${l.length>0?l:""}|${f}|${t.mode==="nearest"?o.length:o}`,inputDependencies:["rank"]},getShaderSource:w,getRunData:()=>({outputs:[{dims:c,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(p/64)},programUniforms:[{type:12,data:p},{type:1,data:u},{type:1,data:l},...Jr(o,c)]})}},jR=e=>{let t=e.customDataBuffer;return new Uint32Array(t,t.byteOffset,1)[0]},pV=(e,t)=>{let n=[],r=[],i=[],a=jR(e);if(t.antialias!==0)throw Error("Only default value (0) for Antialias attribute is supported");pR(e.inputs,t,a,n,r,i),e.compute(SR(e.inputs[0],t,a,n,r,i),{inputs:[0]})},fV=e=>{let t=e.antialias,n=e.axes,r=e.coordinateTransformMode,i=e.cubicCoeffA,a=e.excludeOutside!==0,o=e.extrapolationValue,l=e.keepAspectRatioPolicy,c=e.mode,u=e.nearestMode===""?"simple":e.nearestMode;return fi({antialias:t,axes:n,coordinateTransformMode:r,cubicCoeffA:i,excludeOutside:a,extrapolationValue:o,keepAspectRatioPolicy:l,mode:c,nearestMode:u})}}),CR,NR,mV,Bhe=dr(()=>{ps(),ws(),la(),Ss(),CR=(e,t)=>{let[n,r,i,a]=e,{numHeads:o,rotaryEmbeddingDim:l}=t;if(n.dims.length!==3&&n.dims.length!==4)throw new Error(`Input 'x' is expected to have 3 or 4 dimensions, got ${n.dims.length}`);if(!kn.areEqual(r.dims,[])&&!kn.areEqual(r.dims,[1])&&r.dims.length!==2)throw new Error(`Input 'position_ids' is expected to have 0, 1, or 2 dimensions, got ${r.dims.length}`);if(i.dims.length!==2)throw new Error(`Input 'cos_cache' is expected to have 2 dimensions, got ${i.dims.length}`);if(a.dims.length!==2)throw new Error(`Input 'sin_cache' is expected to have 2 dimensions, got ${a.dims.length}`);if(!kn.areEqual(i.dims,a.dims))throw new Error("Inputs 'cos_cache' and 'sin_cache' are expected to have the same shape");if(l>0&&o===0)throw new Error("num_heads must be provided if rotary_embedding_dim is specified");let c=n.dims[0],u=n.dims[n.dims.length-2],d=i.dims[0],h=kn.sizeFromDimension(n.dims,1)/u,p=l===0?i.dims[1]*2:h/o;if(l>p)throw new Error("rotary_embedding_dim must be less than or equal to head_size");if(r.dims.length===2){if(c!==r.dims[0])throw new Error(`Input 'position_ids' dimension 0 should be of size batch_size, got ${r.dims[0]}`);if(u!==r.dims[1])throw new Error(`Input 'position_ids' dimension 1 should be of size sequence_length, got ${r.dims[1]}`)}if(p/2!==i.dims[1]&&l/2!==i.dims[1])throw new Error(`Input 'cos_cache' dimension 1 should be same as head_size / 2 or rotary_embedding_dim / 2, got ${i.dims[1]}`);if(u>d)throw new Error("Updating cos_cache and sin_cache in RotaryEmbedding is not currently supported")},NR=(e,t)=>{let{interleaved:n,numHeads:r,rotaryEmbeddingDim:i,scale:a}=t,o=e[0].dims[0],l=kn.sizeFromDimension(e[0].dims,1),c=e[0].dims[e[0].dims.length-2],u=l/c,d=e[2].dims[1],h=i===0?d*2:u/r,p=new Array(o,c,u/h,h-d),f=kn.computeStrides(p),b=[{type:1,data:a},{type:12,data:p},{type:12,data:f},...e[0].dims.length===3?new Array({type:12,data:[l,u,h,1]}):[],...e[0].dims.length===4?new Array({type:12,data:[l,h,c*h,1]}):[],...Jr(e[0].dims,e[1].dims,e[2].dims,e[3].dims,e[0].dims)],g=y=>{let w=Wn("input",e[0].dataType,e[0].dims.length),v=Wn("position_ids",e[1].dataType,e[1].dims.length),m=Wn("cos_cache",e[2].dataType,e[2].dims.length),z=Wn("sin_cache",e[3].dataType,e[3].dims.length),C=Vr("output",e[0].dataType,e[0].dims.length);return y.registerUniforms([{name:"scale",type:"f32"},{name:"global_shape",type:"u32",length:p.length},{name:"global_strides",type:"u32",length:f.length},{name:"input_output_strides",type:"u32",length:f.length}]),` + ${y.declareVariables(w,v,m,z,C)} + + ${y.mainStart(km)} + let half_rotary_emb_dim = uniforms.${m.name}_shape[1]; + let bsnh = global_idx / uniforms.global_strides % uniforms.global_shape; + let size = uniforms.global_shape[0] * uniforms.global_strides[0]; + ${y.guardAgainstOutOfBoundsWorkgroupSizes("size")} + + if (bsnh[3] < half_rotary_emb_dim) { + let position_ids_idx = + ${v.broadcastedIndicesToOffset("bsnh.xy",Vr("",v.type.tensor,2))}; + let position_id = + u32(${v.getByOffset("position_ids_idx")}) + select(0, bsnh[1], position_ids_idx == 0); + let i = dot(bsnh, uniforms.input_output_strides) + select(0, bsnh[3], ${n}); + let j = i + select(half_rotary_emb_dim, 1, ${n}); + let re = ${w.getByOffset("i")} * ${m.get("position_id","bsnh[3]")} - + ${w.getByOffset("j")} * ${z.get("position_id","bsnh[3]")}; + ${C.setByOffset("i","re")} + let im = ${w.getByOffset("i")} * ${z.get("position_id","bsnh[3]")} + + ${w.getByOffset("j")} * ${m.get("position_id","bsnh[3]")}; + ${C.setByOffset("j","im")} + } else { + let k = dot(bsnh, uniforms.input_output_strides) + half_rotary_emb_dim; + ${C.setByOffset("k",w.getByOffset("k"))} + } + }`};return{name:"RotaryEmbedding",shaderCache:{hint:fi({interleaved:n}).cacheKey,inputDependencies:["rank","rank","rank","rank"]},getShaderSource:g,getRunData:()=>({outputs:[{dims:e[0].dims,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(kn.size(p)/km)},programUniforms:b})}},mV=(e,t)=>{CR(e.inputs,t),e.compute(NR(e.inputs,t))}}),ER,IR,gV,Uhe=dr(()=>{ps(),ws(),Ss(),ER=e=>{if(!e||e.length<3)throw new Error("layerNorm requires at least 3 inputs.");let t=e[0],n=e[1],r=e[2];if(t.dataType!==n.dataType||t.dataType!==r.dataType)throw new Error("All inputs must have the same data type");if(t.dims.length!==3&&t.dims.length!==2)throw new Error("Input must be 2D or 3D");if(n.dims.length!==3&&n.dims.length!==2)throw new Error("Skip must be 2D or 3D");let i=t.dims[t.dims.length-1],a=t.dims[t.dims.length-2];if(n.dims[n.dims.length-1]!==i)throw new Error("Skip must have the same hidden size as input");if(n.dims[n.dims.length-2]!==a)throw new Error("Skip must have the same sequence length as input");if(r.dims.length!==1)throw new Error("Gamma must be 1D");if(r.dims[r.dims.length-1]!==i)throw new Error("Gamma must have the same hidden size as input");if(e.length>3){let o=e[3];if(o.dims.length!==1)throw new Error("Beta must be 1D");if(o.dims[o.dims.length-1]!==i)throw new Error("Beta must have the same hidden size as input")}if(e.length>4){let o=e[4];if(o.dims.length!==1)throw new Error("Bias must be 1D");if(o.dims[o.dims.length-1]!==i)throw new Error("Bias must have the same hidden size as input")}},IR=(e,t,n,r)=>{let i=t.simplified,a=e[0].dims,o=kn.size(a),l=a,c=o,u=a.slice(-1)[0],d=r?a.slice(0,-1).concat(1):[],h=!i&&e.length>3,p=e.length>4,f=r&&n>1,b=r&&n>2,g=n>3,y=64,w=Ji(u),v=[{type:12,data:c},{type:12,data:w},{type:12,data:u},{type:1,data:t.epsilon}],m=C=>{let E=[{name:"output_size",type:"u32"},{name:"components",type:"u32"},{name:"hidden_size",type:"u32"},{name:"epsilon",type:"f32"}],I=[Wn("x",e[0].dataType,e[0].dims,w),Wn("skip",e[1].dataType,e[1].dims,w),Wn("gamma",e[2].dataType,e[2].dims,w)];h&&I.push(Wn("beta",e[3].dataType,e[3].dims,w)),p&&I.push(Wn("bias",e[4].dataType,e[4].dims,w)),I.push(Vr("output",e[0].dataType,l,w)),f&&I.push(Vr("mean_output",1,d)),b&&I.push(Vr("inv_std_output",1,d)),g&&I.push(Vr("input_skip_bias_sum",e[0].dataType,l,w));let R=Qa(e[0].dataType),A=Qa(1,w);return` + + ${C.registerUniforms(E).declareVariables(...I)} + var sum_shared : array<${A}, ${y}>; + var sum_squared_shared : array<${A}, ${y}>; + + ${C.mainStart([y,1,1])} + let ix = local_id.x; + let iy = global_id.x / ${y}; + + let hidden_size_vectorized: u32 = uniforms.hidden_size / uniforms.components; + var stride = hidden_size_vectorized / ${y}; + let offset = ix * stride + iy * hidden_size_vectorized; + let offset1d = stride * ix; + if (ix == ${y-1}) { + stride = hidden_size_vectorized - stride * ix; + } + for (var i: u32 = 0; i < stride; i++) { + let skip_value = skip[offset + i]; + let bias_value = ${p?"bias[offset1d + i]":R+"(0.0)"}; + let input_value = x[offset + i]; + let value = input_value + skip_value + bias_value; + ${g?"input_skip_bias_sum[offset + i] = value;":""} + output[offset + i] = value; + let f32_value = ${dm(R,w,"value")}; + sum_shared[ix] += f32_value; + sum_squared_shared[ix] += f32_value * f32_value; + } + workgroupBarrier(); + + var reduce_size : u32 = ${y}; + for (var curr_size = reduce_size >> 1; curr_size > 0; curr_size = reduce_size >> 1) { + reduce_size = curr_size + (reduce_size & 1); + if (ix < curr_size) { + sum_shared[ix] += sum_shared[ix + reduce_size]; + sum_squared_shared[ix] += sum_squared_shared[ix + reduce_size]; + } + workgroupBarrier(); + } + + let sum = sum_shared[0]; + let square_sum = sum_squared_shared[0]; + let mean = ${Oh("sum",w)} / f32(uniforms.hidden_size); + let inv_std_dev = inverseSqrt(${Oh("square_sum",w)} / f32(uniforms.hidden_size) ${i?"":"- mean * mean"} + uniforms.epsilon); + ${f?"mean_output[global_idx] = mean;":""} + ${b?"inv_std_output[global_idx] = inv_std_dev;":""} + + for (var i: u32 = 0; i < stride; i++) { + output[offset + i] = (output[offset + i] ${i?"":`- ${R}(mean)`}) * + ${R}(inv_std_dev) * gamma[offset1d + i] + ${h?"+ beta[offset1d + i]":""}; + } + }`},z=[{dims:l,dataType:e[0].dataType}];return n>1&&z.push({dims:d,dataType:1}),n>2&&z.push({dims:d,dataType:1}),n>3&&z.push({dims:a,dataType:e[0].dataType}),{name:"SkipLayerNormalization",shaderCache:{hint:`${w};${f};${b};${g}`,inputDependencies:e.map((C,E)=>"type")},getShaderSource:m,getRunData:()=>({outputs:z,dispatchGroup:{x:Math.ceil(c/u)},programUniforms:v})}},gV=(e,t)=>{ER(e.inputs);let n=[0];e.outputCount>1&&n.push(-3),e.outputCount>2&&n.push(-3),e.outputCount>3&&n.push(3),e.compute(IR(e.inputs,t,e.outputCount,!1),{outputs:n})}}),kR,Xg,AR,Pz,MR,TR,xV,bV,Fhe=dr(()=>{ps(),ws(),la(),Ss(),kR=(e,t)=>{if(!e||e.length<1)throw new Error("too few inputs");if(t.axes.length!==0){if(t.axes.length!==t.starts.length||t.axes.length!==t.ends.length)throw new Error("axes, starts and ends must have the same length")}else if(t.starts.length!==t.ends.length)throw new Error("starts and ends must have the same length");e.slice(1).forEach((n,r)=>{if(e[r+1].dataType!==6&&e[r+1].dataType!==7)throw new Error(`Input ${r} must be an array of int32 or int64`)})},Xg=(e,t)=>{let n=[];if(e.length>t)if(e[t].dataType===7)e[t].getBigInt64Array().forEach(r=>n.push(Number(r)));else if(e[t].dataType===6)e[t].getInt32Array().forEach(r=>n.push(Number(r)));else throw new Error(`Input ${t} must be an array of int32 or int64`);return n},AR=(e,t)=>{if(e.length>1){let n=Xg(e,1),r=Xg(e,2),i=Xg(e,3);return i.length===0&&(i=[...Array(e[0].dims.length).keys()]),fi({starts:n,ends:r,axes:i})}else return t},Pz=(e,t,n,r,i)=>{let a=e;return e<0&&(a+=n[r[t]]),i[t]<0?Math.max(0,Math.min(a,n[r[t]]-1)):Math.max(0,Math.min(a,n[r[t]]))},MR=(e,t,n)=>`fn calculateInputIndices(output_indices: ${t.type.indices}) -> ${e.type.indices} { + var input_indices: ${e.type.indices}; + var carry = 0u; + for (var i = ${n.length}; i >= 0; i--) { + let input_shape_i = ${qr("uniforms.input_shape","i",n.length)}; + let steps_i = ${qr("uniforms.steps","i",n.length)}; + let signs_i = ${qr("uniforms.signs","i",n.length)}; + let starts_i = ${qr("uniforms.starts","i",n.length)}; + var output_index = ${t.indicesGet("output_indices","i")}; + var input_index = output_index * steps_i + starts_i + carry; + carry = input_index / input_shape_i; + input_index = input_index % input_shape_i; + if (signs_i < 0) { + input_index = input_shape_i - input_index - 1u + starts_i; + } + ${e.indicesSet("input_indices","i","input_index")}; + } + return input_indices; + }`,TR=(e,t)=>{let n=e[0].dims,r=kn.size(n),i=t.axes.length>0?kn.normalizeAxes(t.axes,n.length):[...Array(n.length).keys()],a=Xg(e,4);a.forEach(w=>w!==0||(()=>{throw new Error("step cannot be 0")})),a.length===0&&(a=Array(i.length).fill(1));let o=t.starts.map((w,v)=>Pz(w,v,n,i,a)),l=t.ends.map((w,v)=>Pz(w,v,n,i,a));if(i.length!==o.length||i.length!==l.length)throw new Error("start, ends and axes should have the same number of elements");if(i.length!==n.length)for(let w=0;wMath.sign(w));a.forEach((w,v,m)=>{if(w<0){let z=(l[v]-o[v])/w,C=o[v],E=C+z*a[v];o[v]=E,l[v]=C,m[v]=-w}});let u=n.slice(0);i.forEach((w,v)=>{u[w]=Math.ceil((l[w]-o[w])/a[w])});let d={dims:u,dataType:e[0].dataType},h=Vr("output",e[0].dataType,u.length),p=Wn("input",e[0].dataType,e[0].dims.length),f=kn.size(u),b=[{name:"outputSize",type:"u32"},{name:"starts",type:"u32",length:o.length},{name:"signs",type:"i32",length:c.length},{name:"steps",type:"u32",length:a.length}],g=[{type:12,data:f},{type:12,data:o},{type:6,data:c},{type:12,data:a},...Jr(e[0].dims,u)],y=w=>` + ${w.registerUniforms(b).declareVariables(p,h)} + ${MR(p,h,n)} + ${w.mainStart()} + ${w.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + let output_indices = ${h.offsetToIndices("global_idx")}; + let input_indices = calculateInputIndices(output_indices); + ${h.setByOffset("global_idx",p.getByIndices("input_indices"))} + }`;return{name:"Slice",shaderCache:{hint:`${c.length}_${o.length}_${a.length}`,inputDependencies:["rank"]},getShaderSource:y,getRunData:()=>({outputs:[d],dispatchGroup:{x:Math.ceil(r/64)},programUniforms:g})}},xV=(e,t)=>{kR(e.inputs,t);let n=AR(e.inputs,t);e.compute(TR(e.inputs,n),{inputs:[0]})},bV=e=>{let t=e.starts,n=e.ends,r=e.axes;return fi({starts:t,ends:n,axes:r})}}),RR,PR,yV,vV,Whe=dr(()=>{ps(),ws(),la(),Wh(),Ss(),RR=e=>{if(!e||e.length!==1)throw new Error("Softmax op requires 1 input.")},PR=(e,t)=>{let n=e.inputs[0],r=n.dims,i=kn.size(r),a=r.length,o=kn.normalizeAxis(t.axis,a),l=oR),u[o]=a-1,u[a-1]=o,c=e.compute(jc(n,u),{inputs:[n],outputs:[-1]})[0]):c=n;let d=c.dims,h=d[a-1],p=i/h,f=Ji(h),b=h/f,g=64;p===1&&(g=256);let y=(I,R)=>R===4?`max(max(${I}.x, ${I}.y), max(${I}.z, ${I}.w))`:R===2?`max(${I}.x, ${I}.y)`:R===3?`max(max(${I}.x, ${I}.y), ${I}.z)`:I,w=Wn("x",c.dataType,c.dims,f),v=Vr("result",c.dataType,c.dims,f),m=w.type.value,z=Qa(c.dataType)==="f32"?`var threadMax = ${m}(-3.402823e+38f);`:`var threadMax = ${m}(-65504.0h);`,C=I=>` + var rowMaxShared : ${m}; + var rowSumShared : ${m}; + var threadShared : array<${m}, ${g}>; + + fn getValue(row: i32, col: i32, row_stride: i32) -> ${m} { + let index = row * row_stride + col; + return x[index]; + } + + fn setValue(row: i32, col: i32, row_stride: i32, value: ${m}) { + let index = row * row_stride + col; + result[index] = value; + } + ${I.registerUniform("packedCols","i32").declareVariables(w,v)} + ${I.mainStart(g)} + let gindex = i32(global_idx); + let lindex = i32(local_idx); + const wg = ${g}; + let row = gindex / wg; + let cols = uniforms.packedCols; + let row_stride : i32 = uniforms.packedCols; + + // find the rows max + ${z} + for (var col = lindex; col < cols; col += wg) { + let value = getValue(row, col, row_stride); + threadMax = max(threadMax, value); + } + if (lindex < cols) { + threadShared[lindex] = threadMax; + } + workgroupBarrier(); + + var reduceSize = min(cols, wg); + for (var currSize = reduceSize >> 1; currSize > 0; currSize = reduceSize >> 1) { + reduceSize = currSize + (reduceSize & 1); + if (lindex < currSize) { + threadShared[lindex] = max(threadShared[lindex], threadShared[lindex + reduceSize]); + } + workgroupBarrier(); + } + if (lindex == 0) { + rowMaxShared = ${m}(${y("threadShared[0]",f)}); + } + workgroupBarrier(); + + // find the rows sum + var threadSum = ${m}(0.0); + for (var col = lindex; col < cols; col += wg) { + let subExp = exp(getValue(row, col, row_stride) - rowMaxShared); + threadSum += subExp; + } + threadShared[lindex] = threadSum; + workgroupBarrier(); + + for (var currSize = wg >> 1; currSize > 0; currSize = currSize >> 1) { + if (lindex < currSize) { + threadShared[lindex] = threadShared[lindex] + threadShared[lindex + currSize]; + } + workgroupBarrier(); + } + if (lindex == 0) { + rowSumShared = ${m}(${Oh("threadShared[0]",f)}); + } + workgroupBarrier(); + + // calculate final value for each element in the row + for (var col = lindex; col < cols; col += wg) { + let value = exp(getValue(row, col, row_stride) - rowMaxShared) / rowSumShared; + setValue(row, col, row_stride, value); + } + }`,E=e.compute({name:"Softmax",shaderCache:{hint:`${f};${g}`,inputDependencies:["type"]},getRunData:()=>({outputs:[{dims:d,dataType:c.dataType}],dispatchGroup:{x:p},programUniforms:[{type:6,data:b}]}),getShaderSource:C},{inputs:[c],outputs:[l?-1:0]})[0];l&&e.compute(jc(E,u),{inputs:[E]})},yV=(e,t)=>{RR(e.inputs),PR(e,t)},vV=e=>fi({axis:e.axis})}),Oz,OR,LR,BR,wV,Dhe=dr(()=>{ps(),ws(),Ss(),Oz=e=>Array.from(e.getBigInt64Array(),Number),OR=e=>{if(!e||e.length!==2)throw new Error("Tile requires 2 inputs.");if(e[0].dataType!==1&&e[0].dataType!==10&&e[0].dataType!==6&&e[0].dataType!==12)throw new Error("Tile only support float, float16, int32, and uint32 data types");if(e[1].dataType!==7)throw new Error("Tile `repeats` input should be of int64 data type");if(e[1].dims.length!==1)throw new Error("Tile `repeats` input should be 1-D");if(Oz(e[1]).length!==e[0].dims.length)throw new Error("Tile `repeats` input should have same number of elements as rank of input data tensor")},LR=(e,t)=>{let n=[];for(let r=0;r{let n=e[0].dims,r=t??Oz(e[1]),i=LR(n,r),a=kn.size(i),o=e[0].dataType,l=Wn("input",o,n.length),c=Vr("output",o,i.length),u=d=>` + const inputShape = ${l.indices(...n)}; + ${d.registerUniform("output_size","u32").declareVariables(l,c)} + ${d.mainStart()} + ${d.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let output_indices = ${c.offsetToIndices("global_idx")}; + var input_indices: ${l.type.indices}; + for (var i = 0; i < ${n.length}; i++) { + let input_dim_i = ${l.indicesGet("uniforms.input_shape","i")}; + let input_dim_value = ${c.indicesGet("output_indices","i")} % input_dim_i; + + ${l.indicesSet("input_indices","i","input_dim_value")} + } + ${c.setByOffset("global_idx",l.getByIndices("input_indices"))} + }`;return{name:"Tile",shaderCache:{hint:`${r}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:i,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(a/64)},programUniforms:[{type:12,data:a},...Jr(e[0].dims,i)]}),getShaderSource:u}},wV=e=>{OR(e.inputs),e.compute(BR(e.inputs),{inputs:[0]})}}),UR,FR,_V,Vhe=dr(()=>{ps(),ws(),Ss(),UR=(e,t,n,r,i)=>{let a=Vr("output_data",i,n.length,4),o=Wn("a_data",t[1].dataType,t[1].dims.length,4),l=Wn("b_data",t[2].dataType,t[2].dims.length,4),c=Wn("c_data",t[0].dataType,t[0].dims.length,4),u,d=(h,p,f)=>`select(${p}, ${h}, ${f})`;if(!r)u=a.setByOffset("global_idx",d(o.getByOffset("global_idx"),l.getByOffset("global_idx"),c.getByOffset("global_idx")));else{let h=(p,f,b="")=>{let g=`a_data[index_a${f}][component_a${f}]`,y=`b_data[index_b${f}][component_b${f}]`,w=`bool(c_data[index_c${f}] & (0xffu << (component_c${f} * 8)))`;return` + let output_indices${f} = ${a.offsetToIndices(`global_idx * 4u + ${f}u`)}; + let offset_a${f} = ${o.broadcastedIndicesToOffset(`output_indices${f}`,a)}; + let offset_b${f} = ${l.broadcastedIndicesToOffset(`output_indices${f}`,a)}; + let offset_c${f} = ${c.broadcastedIndicesToOffset(`output_indices${f}`,a)}; + let index_a${f} = offset_a${f} / 4u; + let index_b${f} = offset_b${f} / 4u; + let index_c${f} = offset_c${f} / 4u; + let component_a${f} = offset_a${f} % 4u; + let component_b${f} = offset_b${f} % 4u; + let component_c${f} = offset_c${f} % 4u; + ${p}[${f}] = ${b}(${d(g,y,w)}); + `};i===9?u=` + var data = vec4(0); + ${h("data",0,"u32")} + ${h("data",1,"u32")} + ${h("data",2,"u32")} + ${h("data",3,"u32")} + output_data[global_idx] = dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(data));`:u=` + ${h("output_data[global_idx]",0)} + ${h("output_data[global_idx]",1)} + ${h("output_data[global_idx]",2)} + ${h("output_data[global_idx]",3)} + `}return` + ${e.registerUniform("vec_size","u32").declareVariables(c,o,l,a)} + ${e.mainStart()} + ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + ${u} + }`},FR=e=>{let t=e[1].dims,n=e[2].dims,r=e[0].dims,i=e[1].dataType,a=!(kn.areEqual(t,n)&&kn.areEqual(n,r)),o=t,l=kn.size(t);if(a){let u=Im.calcShape(Im.calcShape(t,n,!1),r,!1);if(!u)throw new Error("Can't perform where op on the given tensors");o=u,l=kn.size(o)}let c=Math.ceil(l/4);return{name:"Where",shaderCache:{inputDependencies:["rank","rank","rank"]},getShaderSource:u=>UR(u,e,o,a,i),getRunData:()=>({outputs:[{dims:o,dataType:i}],dispatchGroup:{x:Math.ceil(l/64/4)},programUniforms:[{type:12,data:c},...Jr(r,t,n,o)]})}},_V=e=>{e.compute(FR(e.inputs))}}),zV,Hhe=dr(()=>{she(),zS(),ihe(),ahe(),ohe(),lhe(),che(),fhe(),ghe(),xhe(),bhe(),yhe(),vhe(),whe(),_he(),zhe(),$he(),She(),jhe(),Che(),Nhe(),Ehe(),Ihe(),khe(),Ahe(),DD(),Mhe(),The(),Rhe(),Phe(),Ohe(),_S(),Lhe(),Bhe(),Uhe(),Fhe(),Whe(),GD(),Dhe(),Wh(),$S(),Vhe(),zV=new Map([["Abs",[xW]],["Acos",[bW]],["Acosh",[yW]],["Add",[QW]],["ArgMax",[pW,l5]],["ArgMin",[hW,l5]],["Asin",[vW]],["Asinh",[wW]],["Atan",[_W]],["Atanh",[zW]],["Attention",[fW]],["AveragePool",[tV,eV]],["BatchNormalization",[mW]],["BiasAdd",[gW]],["BiasSplitGelu",[ZW]],["Cast",[SW,$W]],["Ceil",[CW]],["Clip",[jW]],["Concat",[cD,uD]],["Conv",[f5,p5]],["ConvTranspose",[vD,yD]],["Cos",[NW]],["Cosh",[EW]],["CumSum",[wD,_D]],["DepthToSpace",[zD,$D]],["DequantizeLinear",[lV,cV]],["Div",[eD]],["Einsum",[SD,jD]],["Elu",[IW,hx]],["Equal",[tD]],["Erf",[kW]],["Exp",[AW]],["Expand",[CD]],["FastGelu",[ND]],["Floor",[MW]],["FusedConv",[f5,p5]],["Gather",[ID,ED]],["GatherElements",[PD,RD]],["GatherBlockQuantized",[MD,TD]],["GatherND",[kD,AD]],["Gelu",[TW]],["Gemm",[LD,OD]],["GlobalAveragePool",[rV,nV]],["GlobalMaxPool",[oV,aV]],["Greater",[iD]],["GreaterOrEqual",[oD]],["GridSample",[BD,UD]],["GroupQueryAttention",[qD]],["HardSigmoid",[WW,FW]],["InstanceNormalization",[KD]],["LayerNormalization",[XD]],["LeakyRelu",[RW,hx]],["Less",[aD]],["LessOrEqual",[lD]],["Log",[YW]],["MatMul",[YD]],["MatMulNBits",[JD,ZD]],["MaxPool",[sV,iV]],["Mul",[nD]],["MultiHeadAttention",[WD,FD]],["Neg",[OW]],["Not",[PW]],["Pad",[QD]],["Pow",[rD]],["QuickGelu",[JW,hx]],["Range",[uV]],["Reciprocal",[LW]],["ReduceMin",[oW]],["ReduceMean",[nW]],["ReduceMax",[aW]],["ReduceSum",[cW]],["ReduceProd",[lW]],["ReduceL1",[rW]],["ReduceL2",[sW]],["ReduceLogSum",[dW]],["ReduceLogSumExp",[iW]],["ReduceSumSquare",[uW]],["Relu",[BW]],["Resize",[pV,fV]],["RotaryEmbedding",[mV]],["ScatterND",[hV,dV]],["Sigmoid",[UW]],["Sin",[DW]],["Sinh",[VW]],["Slice",[xV,bV]],["SkipLayerNormalization",[gV]],["Split",[VD,HD]],["Sqrt",[HW]],["Softmax",[yV,vV]],["Sub",[sD]],["Tan",[GW]],["Tanh",[qW]],["ThresholdedRelu",[XW,hx]],["Tile",[wV]],["Transpose",[VF,HF]],["Where",[_V]]])}),$V,Ghe=dr(()=>{bd(),V0(),Ss(),$V=class{constructor(e){this.backend=e,this.repo=new Map,this.attributesBound=!1}getArtifact(e){return this.repo.get(e)}setArtifact(e,t){this.repo.set(e,t)}run(e,t,n,r,i){gd(e.programInfo.name);let a=this.backend.device,o=this.backend.getComputePassEncoder();this.backend.writeTimestamp(this.backend.pendingDispatchNumber*2);let l=[];for(let u of t)l.push({binding:l.length,resource:{buffer:u.buffer}});for(let u of n)l.push({binding:l.length,resource:{buffer:u.buffer}});i&&l.push({binding:l.length,resource:i});let c=a.createBindGroup({layout:e.computePipeline.getBindGroupLayout(0),entries:l,label:e.programInfo.name});if(this.backend.sessionStatus==="capturing"){let u={kernelId:this.backend.currentKernelId,computePipeline:e.computePipeline,bindGroup:c,dispatchGroup:r};this.backend.capturedCommandList.get(this.backend.currentSessionId).push(u)}o.setPipeline(e.computePipeline),o.setBindGroup(0,c),o.dispatchWorkgroups(...r),this.backend.writeTimestamp(this.backend.pendingDispatchNumber*2+1),this.backend.pendingDispatchNumber++,(this.backend.pendingDispatchNumber>=this.backend.maxDispatchNumber||this.backend.queryType==="at-passes")&&this.backend.endComputePass(),this.backend.pendingDispatchNumber>=this.backend.maxDispatchNumber&&this.backend.flush(),pu(e.programInfo.name)}dispose(){}build(e,t){gd(e.name);let n=this.backend.device,r=[];[{feature:"shader-f16",extension:"f16"},{feature:"subgroups",extension:"subgroups"},{feature:"subgroups-f16",extension:"subgroups_f16"}].forEach(u=>{n.features.has(u.feature)&&r.push(`enable ${u.extension};`)});let i=DF(t,this.backend.device.limits),a=e.getShaderSource(i),o=`${r.join(` +`)} +${i.additionalImplementations} +${a}`,l=n.createShaderModule({code:o,label:e.name});Us("verbose",()=>`[WebGPU] ${e.name} shader code: ${o}`);let c=n.createComputePipeline({compute:{module:l,entryPoint:"main"},layout:"auto",label:e.name});return pu(e.name),{programInfo:e,computePipeline:c,uniformVariablesInfo:i.variablesInfo}}normalizeDispatchGroupSize(e){let t=typeof e=="number"?e:e.x,n=typeof e=="number"?1:e.y||1,r=typeof e=="number"?1:e.z||1,i=this.backend.device.limits.maxComputeWorkgroupsPerDimension;if(t<=i&&n<=i&&r<=i)return[t,n,r];let a=t*n*r,o=Math.ceil(Math.sqrt(a));if(o>i){if(o=Math.ceil(Math.cbrt(a)),o>i)throw new Error("Total dispatch size exceeds WebGPU maximum.");return[o,o,o]}else return[o,o,1]}}}),WR,DR,VR,HR,SV,qhe=dr(()=>{bd(),ps(),V0(),OF(),nhe(),Hhe(),Ghe(),WR=(e,t)=>{if(t.length!==e.length)throw new Error(`inputDependencies length ${t.length} is not equal to inputTensors length ${e.length}.`);let n=[];for(let r=0;r{var i,a;let r=e.name;return(i=e.shaderCache)!=null&&i.hint&&(r+="["+e.shaderCache.hint+"]"),r+=":"+n+`:${WR(t,((a=e.shaderCache)==null?void 0:a.inputDependencies)??new Array(t.length).fill("dims"))}`,r},VR=class{constructor(e){e&&(this.architecture=e.architecture,this.vendor=e.vendor)}isArchitecture(e){return this.architecture===e}isVendor(e){return this.vendor===e}},HR=class{constructor(e){this.subgroupsSupported=e.features.has("subgroups"),this.subgroupsF16Supported=e.features.has("subgroups");let t=e.limits;!this.subgroupsSupported||!t.minSubgroupSize||!t.maxSubgroupSize?this.subgroupSizeRange=void 0:this.subgroupSizeRange=[t.minSubgroupSize,t.maxSubgroupSize]}},SV=class{constructor(){this.currentSessionId=null,this.currentKernelId=null,this.commandEncoder=null,this.computePassEncoder=null,this.maxDispatchNumber=16,this.pendingDispatchNumber=0,this.pendingKernels=[],this.pendingQueries=new Map,this.sessionStatus="default",this.capturedCommandList=new Map,this.capturedPendingKernels=new Map,this.sessionExternalDataMapping=new Map}get currentKernelCustomData(){if(this.currentKernelId===null)throw new Error("currentKernelCustomData(): currentKernelId is null. (should not happen)");let e=this.kernelCustomData.get(this.currentKernelId);return e||(e={},this.kernelCustomData.set(this.currentKernelId,e)),e}async initialize(e,t){this.env=e;let n=[],r={requiredLimits:{maxComputeWorkgroupStorageSize:t.limits.maxComputeWorkgroupStorageSize,maxComputeWorkgroupsPerDimension:t.limits.maxComputeWorkgroupsPerDimension,maxStorageBufferBindingSize:t.limits.maxStorageBufferBindingSize,maxBufferSize:t.limits.maxBufferSize,maxComputeInvocationsPerWorkgroup:t.limits.maxComputeInvocationsPerWorkgroup,maxComputeWorkgroupSizeX:t.limits.maxComputeWorkgroupSizeX,maxComputeWorkgroupSizeY:t.limits.maxComputeWorkgroupSizeY,maxComputeWorkgroupSizeZ:t.limits.maxComputeWorkgroupSizeZ},requiredFeatures:n},i=a=>t.features.has(a)&&n.push(a)&&!0;i("chromium-experimental-timestamp-query-inside-passes")||i("timestamp-query"),i("shader-f16"),i("subgroups")&&i("subgroups-f16"),this.device=await t.requestDevice(r),this.deviceInfo=new HR(this.device),this.adapterInfo=new VR(t.info||await t.requestAdapterInfo()),this.gpuDataManager=LF(this),this.programManager=new $V(this),this.kernels=new Map,this.kernelPersistentData=new Map,this.kernelCustomData=new Map,bS(e.logLevel,!!e.debug),this.device.onuncapturederror=a=>{a.error instanceof GPUValidationError&&console.error(`An uncaught WebGPU validation error was raised: ${a.error.message}`)},Object.defineProperty(this.env.webgpu,"device",{value:this.device,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(this.env.webgpu,"adapter",{value:t,writable:!1,enumerable:!0,configurable:!1}),this.setQueryType()}dispose(){typeof this.querySet<"u"&&this.querySet.destroy(),this.gpuDataManager.dispose()}getCommandEncoder(){return this.commandEncoder||(this.commandEncoder=this.device.createCommandEncoder()),this.commandEncoder}getComputePassEncoder(){if(!this.computePassEncoder){let e=this.getCommandEncoder(),t={};this.queryType==="at-passes"&&(t.timestampWrites={querySet:this.querySet,beginningOfPassWriteIndex:this.pendingDispatchNumber*2,endOfPassWriteIndex:this.pendingDispatchNumber*2+1}),this.computePassEncoder=e.beginComputePass(t)}return this.computePassEncoder}endComputePass(){this.computePassEncoder&&(this.computePassEncoder.end(),this.computePassEncoder=null)}flush(){if(!this.commandEncoder)return;gd(),this.endComputePass();let e;this.queryType!=="none"&&(this.commandEncoder.resolveQuerySet(this.querySet,0,this.pendingDispatchNumber*2,this.queryResolveBuffer,0),e=this.device.createBuffer({size:this.pendingDispatchNumber*2*8,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),this.pendingQueries.set(e,this.pendingKernels),this.pendingKernels=[],this.commandEncoder.copyBufferToBuffer(this.queryResolveBuffer,0,e,0,this.pendingDispatchNumber*2*8)),this.device.queue.submit([this.commandEncoder.finish()]),this.gpuDataManager.refreshPendingBuffers(),this.commandEncoder=null,this.pendingDispatchNumber=0,this.queryType!=="none"&&e.mapAsync(GPUMapMode.READ).then(()=>{var r;let t=new BigUint64Array(e.getMappedRange()),n=this.pendingQueries.get(e);for(let i=0;i"u"&&(this.queryTimeBase=f);let g=Number(f-this.queryTimeBase),y=Number(b-this.queryTimeBase);if(!Number.isSafeInteger(g)||!Number.isSafeInteger(y))throw new RangeError("incorrect timestamp range");if((r=this.env.webgpu.profiling)!=null&&r.ondata)this.env.webgpu.profiling.ondata({version:1,inputsMetadata:h.map(w=>({dims:w.dims,dataType:kp(w.dataType)})),outputsMetadata:p.map(w=>({dims:w.dims,dataType:kp(w.dataType)})),kernelId:o,kernelType:c,kernelName:u,programName:d,startTime:g,endTime:y});else{let w="";h.forEach((m,z)=>{w+=`input[${z}]: [${m.dims}] | ${kp(m.dataType)}, `});let v="";p.forEach((m,z)=>{v+=`output[${z}]: [${m.dims}] | ${kp(m.dataType)}, `}),console.log(`[profiling] kernel "${o}|${c}|${u}|${d}" ${w}${v}execution time: ${y-g} ns`)}pb("GPU",`${d}::${f}::${b}`)}e.unmap(),this.pendingQueries.delete(e)}),pu()}run(e,t,n,r,i,a){gd(e.name);let o=[];for(let v=0;vm):n;if(d.length!==l.length)throw new Error(`Output size ${d.length} must be equal to ${l.length}.`);let h=[],p=[];for(let v=0;v=a)throw new Error(`Invalid output index: ${d[v]}`);if(d[v]===-3)continue;let m=d[v]===-1,z=d[v]===-2,C=m||z?i(l[v].dataType,l[v].dims):r(d[v],l[v].dataType,l[v].dims);if(h.push(C),C.data===0)continue;let E=this.gpuDataManager.get(C.data);if(!E)throw new Error(`no GPU data for output: ${C.data}`);if(m&&this.temporaryData.push(E),z){let I=this.kernelPersistentData.get(this.currentKernelId);I||(I=[],this.kernelPersistentData.set(this.currentKernelId,I)),I.push(E)}p.push(E)}if(o.length!==t.length||p.length!==h.length){if(p.length===0)return pu(e.name),h;throw new Error(`Program ${e.name} has zero-sized tensor(s) in inputs or outputs. This is not supported now.`)}let f;if(u){let v=0,m=[];u.forEach(I=>{let R=typeof I.data=="number"?[I.data]:I.data;if(R.length===0)return;let A=I.type===10?2:4,O,F;I.type===10?(F=R.length>4?16:R.length>2?8:R.length*A,O=R.length>4?16:A*R.length):(F=R.length<=2?R.length*A:16,O=16),v=Math.ceil(v/F)*F,m.push(v);let L=I.type===10?8:4;v+=R.length>4?Math.ceil(R.length/L)*O:R.length*A});let z=16;v=Math.ceil(v/z)*z;let C=new ArrayBuffer(v);u.forEach((I,R)=>{let A=m[R],O=typeof I.data=="number"?[I.data]:I.data;if(I.type===6)new Int32Array(C,A,O.length).set(O);else if(I.type===12)new Uint32Array(C,A,O.length).set(O);else if(I.type===10)new Uint16Array(C,A,O.length).set(O);else if(I.type===1)new Float32Array(C,A,O.length).set(O);else throw new Error(`Unsupported uniform type: ${kp(I.type)}`)});let E=this.gpuDataManager.create(v,GPUBufferUsage.COPY_DST|GPUBufferUsage.UNIFORM);this.device.queue.writeBuffer(E.buffer,0,C,0,v),this.gpuDataManager.release(E.id),f={offset:0,size:v,buffer:E.buffer}}let b=this.programManager.normalizeDispatchGroupSize(c),g=b[1]===1&&b[2]===1,y=DR(e,t,g),w=this.programManager.getArtifact(y);if(w||(w=this.programManager.build(e,b),this.programManager.setArtifact(y,w),Us("info",()=>`[artifact] key: ${y}, programName: ${e.name}`)),u&&w.uniformVariablesInfo){if(u.length!==w.uniformVariablesInfo.length)throw new Error(`Uniform variables count mismatch: expect ${w.uniformVariablesInfo.length}, got ${u.length} in program "${w.programInfo.name}".`);for(let v=0;v`[ProgramManager] run "${e.name}" (key=${y}) with ${b[0]}x${b[1]}x${b[2]}`),this.queryType!=="none"||this.sessionStatus==="capturing"){let v={kernelId:this.currentKernelId,programName:w.programInfo.name,inputTensorViews:t,outputTensorViews:h};this.pendingKernels.push(v),this.sessionStatus==="capturing"&&this.capturedPendingKernels.get(this.currentSessionId).push(v)}return this.programManager.run(w,o,p,b,f),pu(e.name),h}upload(e,t){this.gpuDataManager.upload(e,t)}memcpy(e,t){this.gpuDataManager.memcpy(e,t)}async download(e,t){await this.gpuDataManager.download(e,t)}alloc(e){return this.gpuDataManager.create(e).id}free(e){return this.gpuDataManager.release(e)}createKernel(e,t,n,r){let i=zV.get(e);if(!i)throw new Error(`kernel not implemented: ${e}`);let a={kernelType:e,kernelName:r,kernelEntry:i[0],attributes:[i[1],n]};this.kernels.set(t,a)}releaseKernel(e){let t=this.kernelPersistentData.get(e);if(t){for(let n of t)this.gpuDataManager.release(n.id);this.kernelPersistentData.delete(e)}this.kernelCustomData.delete(e),this.kernels.delete(e)}computeKernel(e,t,n){let r=this.kernels.get(e);if(!r)throw new Error(`kernel not created: ${e}`);let i=r.kernelType,a=r.kernelName,o=r.kernelEntry,l=r.attributes;if(this.currentKernelId!==null)throw new Error(`kernel "[${i}] ${a}" is not allowed to be called recursively`);this.currentKernelId=e,l[0]&&(l[1]=l[0](l[1]),l[0]=void 0),Us("info",()=>`[WebGPU] Start to run kernel "[${i}] ${a}"...`);let c=this.env.debug;this.temporaryData=[];try{return c&&this.device.pushErrorScope("validation"),o(t,l[1]),0}catch(u){return n.push(Promise.resolve(`[WebGPU] Kernel "[${i}] ${a}" failed. ${u}`)),1}finally{c&&n.push(this.device.popErrorScope().then(u=>u?`GPU validation error for kernel "[${i}] ${a}": ${u.message}`:null));for(let u of this.temporaryData)this.gpuDataManager.release(u.id);this.temporaryData=[],this.currentKernelId=null}}registerBuffer(e,t,n,r){let i=this.sessionExternalDataMapping.get(e);i||(i=new Map,this.sessionExternalDataMapping.set(e,i));let a=i.get(t),o=this.gpuDataManager.registerExternalBuffer(n,r,a);return i.set(t,[o,n]),o}unregisterBuffers(e){let t=this.sessionExternalDataMapping.get(e);t&&(t.forEach(n=>this.gpuDataManager.unregisterExternalBuffer(n[0])),this.sessionExternalDataMapping.delete(e))}getBuffer(e){let t=this.gpuDataManager.get(e);if(!t)throw new Error(`no GPU data for buffer: ${e}`);return t.buffer}createDownloader(e,t,n){return async()=>{let r=await i5(this,e,t);return yS(r.buffer,n)}}writeTimestamp(e){this.queryType==="inside-passes"&&this.computePassEncoder.writeTimestamp(this.querySet,e)}setQueryType(){var e;this.queryType="none",(((e=this.env.webgpu.profiling)==null?void 0:e.mode)==="default"||(typeof this.env.trace>"u"?this.env.wasm.trace:this.env.trace))&&(this.device.features.has("chromium-experimental-timestamp-query-inside-passes")?this.queryType="inside-passes":this.device.features.has("timestamp-query")&&(this.queryType="at-passes"),this.queryType!=="none"&&typeof this.querySet>"u"&&(this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxDispatchNumber*2}),this.queryResolveBuffer=this.device.createBuffer({size:this.maxDispatchNumber*2*8,usage:GPUBufferUsage.COPY_SRC|GPUBufferUsage.QUERY_RESOLVE})))}captureBegin(){Us("info","captureBegin"),this.capturedCommandList.get(this.currentSessionId)||this.capturedCommandList.set(this.currentSessionId,[]),this.capturedPendingKernels.get(this.currentSessionId)||this.capturedPendingKernels.set(this.currentSessionId,[]),this.flush(),this.sessionStatus="capturing"}captureEnd(){Us("info","captureEnd"),this.flush(),this.sessionStatus="default"}replay(){Us("info","replay"),this.sessionStatus="replaying";let e=this.capturedCommandList.get(this.currentSessionId),t=this.capturedPendingKernels.get(this.currentSessionId),n=e.length;this.pendingKernels=[];for(let r=0;r=this.maxDispatchNumber||this.queryType==="at-passes")&&this.endComputePass(),this.pendingDispatchNumber>=this.maxDispatchNumber&&this.flush()}this.flush(),this.sessionStatus="default"}onCreateSession(){this.gpuDataManager.onCreateSession()}onReleaseSession(e){this.unregisterBuffers(e),this.capturedCommandList.has(e)&&this.capturedCommandList.delete(e),this.capturedPendingKernels.has(e)&&this.capturedPendingKernels.delete(e),this.gpuDataManager.onReleaseSession(e)}onRunStart(e){this.currentSessionId=e,this.setQueryType()}}}),GR,Lz,qR,Bz,Uz,Fz,KR,jV,Khe=dr(()=>{V0(),GR=1,Lz=()=>GR++,qR=new Map([["float32",32],["float16",16],["int32",32],["uint32",32],["int64",64],["uint64",64],["int8",8],["uint8",8],["int4",4],["uint4",4]]),Bz=(e,t)=>{let n=qR.get(e);if(!n)throw new Error("Unsupported data type.");return t.length>0?Math.ceil(t.reduce((r,i)=>r*i)*n/8):0},Uz=class{constructor(e){this.sessionId=e.sessionId,this.mlContext=e.context,this.mlTensor=e.tensor,this.dataType=e.dataType,this.tensorShape=e.shape}get tensor(){return this.mlTensor}get type(){return this.dataType}get shape(){return this.tensorShape}get byteLength(){return Bz(this.dataType,this.tensorShape)}destroy(){Us("verbose",()=>"[WebNN] TensorWrapper.destroy"),this.mlTensor.destroy()}write(e){this.mlContext.writeTensor(this.mlTensor,e)}async read(e){return e?this.mlContext.readTensor(this.mlTensor,e):this.mlContext.readTensor(this.mlTensor)}canReuseTensor(e,t,n){return this.mlContext===e&&this.dataType===t&&this.tensorShape.length===n.length&&this.tensorShape.every((r,i)=>r===n[i])}},Fz=class{constructor(e,t){this.tensorManager=e,this.wrapper=t}get tensorWrapper(){return this.wrapper}releaseTensor(){this.tensorWrapper&&(this.tensorManager.releaseTensor(this.tensorWrapper),this.wrapper=void 0)}async ensureTensor(e,t,n,r){let i=this.tensorManager.getMLContext(e);if(this.wrapper){if(this.wrapper.canReuseTensor(i,t,n))return this.wrapper.tensor;if(r){if(this.wrapper.byteLength!==Bz(t,n))throw new Error("Unable to copy data to tensor with different size.");this.activeUpload=new Uint8Array(await this.wrapper.read())}this.tensorManager.releaseTensor(this.wrapper)}let a=typeof MLTensorUsage>"u"?void 0:MLTensorUsage.READ|MLTensorUsage.WRITE;return this.wrapper=await this.tensorManager.getCachedTensor(e,t,n,a,!0,!0),r&&this.activeUpload&&(this.wrapper.write(this.activeUpload),this.activeUpload=void 0),this.wrapper.tensor}upload(e){if(this.wrapper)if(e.byteLength===this.wrapper.byteLength){this.wrapper.write(e);return}else Us("verbose",()=>"Data size does not match tensor size. Releasing tensor."),this.releaseTensor();this.activeUpload?this.activeUpload.set(e):this.activeUpload=new Uint8Array(e)}async download(e){if(this.activeUpload)if(e){e instanceof ArrayBuffer?new Uint8Array(e).set(this.activeUpload):new Uint8Array(e.buffer,e.byteOffset,e.byteLength).set(this.activeUpload);return}else return this.activeUpload.buffer;if(!this.wrapper)throw new Error("Tensor has not been created.");return e?this.wrapper.read(e):this.wrapper.read()}},KR=class{constructor(e){this.backend=e,this.tensorTrackersById=new Map,this.freeTensors=[],this.externalTensors=new Set}getMLContext(e){let t=this.backend.getMLContext(e);if(!t)throw new Error("MLContext not found for session.");return t}reserveTensorId(){let e=Lz();return this.tensorTrackersById.set(e,new Fz(this)),e}releaseTensorId(e){let t=this.tensorTrackersById.get(e);t&&(this.tensorTrackersById.delete(e),t.tensorWrapper&&this.releaseTensor(t.tensorWrapper))}async ensureTensor(e,t,n,r,i){Us("verbose",()=>`[WebNN] TensorManager.ensureTensor {tensorId: ${t}, dataType: ${n}, shape: ${r}, copyOld: ${i}}`);let a=this.tensorTrackersById.get(t);if(!a)throw new Error("Tensor not found.");return a.ensureTensor(e,n,r,i)}upload(e,t){let n=this.tensorTrackersById.get(e);if(!n)throw new Error("Tensor not found.");n.upload(t)}async download(e,t){Us("verbose",()=>`[WebNN] TensorManager.download {tensorId: ${e}, dstBuffer: ${t==null?void 0:t.byteLength}}`);let n=this.tensorTrackersById.get(e);if(!n)throw new Error("Tensor not found.");return n.download(t)}releaseTensorsForSession(e){for(let t of this.freeTensors)t.sessionId===e&&t.destroy();this.freeTensors=this.freeTensors.filter(t=>t.sessionId!==e)}registerTensor(e,t,n,r){let i=this.getMLContext(e),a=Lz(),o=new Uz({sessionId:e,context:i,tensor:t,dataType:n,shape:r});return this.tensorTrackersById.set(a,new Fz(this,o)),this.externalTensors.add(o),a}async getCachedTensor(e,t,n,r,i,a){let o=this.getMLContext(e);for(let[c,u]of this.freeTensors.entries())if(u.canReuseTensor(o,t,n)){Us("verbose",()=>`[WebNN] Reusing tensor {dataType: ${t}, shape: ${n}}`);let d=this.freeTensors.splice(c,1)[0];return d.sessionId=e,d}Us("verbose",()=>`[WebNN] MLContext.createTensor {dataType: ${t}, shape: ${n}}`);let l=await o.createTensor({dataType:t,shape:n,dimensions:n,usage:r,writable:i,readable:a});return new Uz({sessionId:e,context:o,tensor:l,dataType:t,shape:n})}releaseTensor(e){this.externalTensors.has(e)&&this.externalTensors.delete(e),this.freeTensors.push(e)}},jV=(...e)=>new KR(...e)}),gy,XR,CV,Xhe=dr(()=>{ps(),uf(),OF(),Khe(),V0(),gy=new Map([[1,"float32"],[10,"float16"],[6,"int32"],[12,"uint32"],[7,"int64"],[13,"uint64"],[22,"int4"],[21,"uint4"],[3,"int8"],[2,"uint8"],[9,"uint8"]]),XR=(e,t)=>{if(e===t)return!0;if(e===void 0||t===void 0)return!1;let n=Object.keys(e).sort(),r=Object.keys(t).sort();return n.length===r.length&&n.every((i,a)=>i===r[a]&&e[i]===t[i])},CV=class{constructor(e){this.tensorManager=jV(this),this.mlContextBySessionId=new Map,this.sessionIdsByMLContext=new Map,this.mlContextCache=[],this.sessionGraphInputs=new Map,this.temporaryGraphInputs=[],this.temporarySessionTensorIds=new Map,bS(e.logLevel,!!e.debug)}get currentSessionId(){if(this.activeSessionId===void 0)throw new Error("No active session");return this.activeSessionId}onRunStart(e){Us("verbose",()=>`[WebNN] onRunStart {sessionId: ${e}}`),this.activeSessionId=e}onRunEnd(e){Us("verbose",()=>`[WebNN] onRunEnd {sessionId: ${e}}`);let t=this.temporarySessionTensorIds.get(e);if(t){for(let n of t)Us("verbose",()=>`[WebNN] releasing temporary tensor {tensorId: ${n}}`),this.tensorManager.releaseTensorId(n);this.temporarySessionTensorIds.delete(e),this.activeSessionId=void 0}}async createMLContext(e){if(e instanceof GPUDevice){let n=this.mlContextCache.findIndex(r=>r.gpuDevice===e);if(n!==-1)return this.mlContextCache[n].mlContext;{let r=await navigator.ml.createContext(e);return this.mlContextCache.push({gpuDevice:e,mlContext:r}),r}}else if(e===void 0){let n=this.mlContextCache.findIndex(r=>r.options===void 0&&r.gpuDevice===void 0);if(n!==-1)return this.mlContextCache[n].mlContext;{let r=await navigator.ml.createContext();return this.mlContextCache.push({mlContext:r}),r}}let t=this.mlContextCache.findIndex(n=>XR(n.options,e));if(t!==-1)return this.mlContextCache[t].mlContext;{let n=await navigator.ml.createContext(e);return this.mlContextCache.push({options:e,mlContext:n}),n}}registerMLContext(e,t){this.mlContextBySessionId.set(e,t);let n=this.sessionIdsByMLContext.get(t);n||(n=new Set,this.sessionIdsByMLContext.set(t,n)),n.add(e),this.temporaryGraphInputs.length>0&&(this.sessionGraphInputs.set(e,this.temporaryGraphInputs),this.temporaryGraphInputs=[])}onReleaseSession(e){this.sessionGraphInputs.delete(e);let t=this.mlContextBySessionId.get(e);if(!t)return;this.tensorManager.releaseTensorsForSession(e),this.mlContextBySessionId.delete(e);let n=this.sessionIdsByMLContext.get(t);if(n.delete(e),n.size===0){this.sessionIdsByMLContext.delete(t);let r=this.mlContextCache.findIndex(i=>i.mlContext===t);r!==-1&&this.mlContextCache.splice(r,1)}}getMLContext(e){return this.mlContextBySessionId.get(e)}reserveTensorId(){return this.tensorManager.reserveTensorId()}releaseTensorId(e){Us("verbose",()=>`[WebNN] releaseTensorId {tensorId: ${e}}`),this.tensorManager.releaseTensorId(e)}async ensureTensor(e,t,n,r,i){let a=gy.get(n);if(!a)throw new Error(`Unsupported ONNX data type: ${n}`);return this.tensorManager.ensureTensor(e??this.currentSessionId,t,a,r,i)}async createTemporaryTensor(e,t,n){Us("verbose",()=>`[WebNN] createTemporaryTensor {onnxDataType: ${t}, shape: ${n}}`);let r=gy.get(t);if(!r)throw new Error(`Unsupported ONNX data type: ${t}`);let i=this.tensorManager.reserveTensorId();await this.tensorManager.ensureTensor(e,i,r,n,!1);let a=this.temporarySessionTensorIds.get(e);return a?a.push(i):this.temporarySessionTensorIds.set(e,[i]),i}uploadTensor(e,t){if(!Ka().shouldTransferToMLTensor)throw new Error("Trying to upload to a MLTensor while shouldTransferToMLTensor is false");Us("verbose",()=>`[WebNN] uploadTensor {tensorId: ${e}, data: ${t.byteLength}}`),this.tensorManager.upload(e,t)}async downloadTensor(e,t){return this.tensorManager.download(e,t)}createMLTensorDownloader(e,t){return async()=>{let n=await this.tensorManager.download(e);return yS(n,t)}}registerMLTensor(e,t,n,r){let i=gy.get(n);if(!i)throw new Error(`Unsupported ONNX data type: ${n}`);let a=this.tensorManager.registerTensor(e,t,i,r);return Us("verbose",()=>`[WebNN] registerMLTensor {tensor: ${t}, dataType: ${i}, dimensions: ${r}} -> {tensorId: ${a}}`),a}registerMLConstant(e,t,n,r,i,a){if(!a)throw new Error("External mounted files are not available.");let o=e;e.startsWith("./")&&(o=e.substring(2));let l=a.get(o);if(!l)throw new Error(`File with name ${o} not found in preloaded files.`);if(t+n>l.byteLength)throw new Error("Out of bounds: data offset and length exceed the external file data size.");let c=l.slice(t,t+n).buffer,u;switch(i.dataType){case"float32":u=new Float32Array(c);break;case"float16":u=new Uint16Array(c);break;case"int32":u=new Int32Array(c);break;case"uint32":u=new Uint32Array(c);break;case"int64":u=new BigInt64Array(c);break;case"uint64":u=new BigUint64Array(c);break;case"int8":u=new Int8Array(c);break;case"int4":case"uint4":case"uint8":u=new Uint8Array(c);break;default:throw new Error(`Unsupported data type: ${i.dataType} in creating WebNN Constant from external data.`)}return Us("verbose",()=>`[WebNN] registerMLConstant {dataType: ${i.dataType}, shape: ${i.shape}}}`),r.constant(i,u)}registerGraphInput(e){this.temporaryGraphInputs.push(e)}isGraphInput(e,t){let n=this.sessionGraphInputs.get(e);return n?n.includes(t):!1}flush(){}}}),NV={};$b(NV,{init:()=>EV});var xy,YR,EV,Yhe=dr(()=>{ps(),qhe(),V0(),ws(),Xhe(),xy=class IV{constructor(t,n,r,i){this.module=t,this.dataType=n,this.data=r,this.dims=i}getFloat32Array(){if(this.dataType!==1)throw new Error("Invalid data type");let t=kn.size(this.dims);return t===0?new Float32Array:new Float32Array(this.module.HEAP8.buffer,this.data,t)}getBigInt64Array(){if(this.dataType!==7)throw new Error("Invalid data type");let t=kn.size(this.dims);return t===0?new BigInt64Array:new BigInt64Array(this.module.HEAP8.buffer,this.data,t)}getInt32Array(){if(this.dataType!==6)throw new Error("Invalid data type");let t=kn.size(this.dims);return t===0?new Int32Array:new Int32Array(this.module.HEAP8.buffer,this.data,t)}getUint16Array(){if(this.dataType!==10&&this.dataType!==4)throw new Error("Invalid data type");let t=kn.size(this.dims);return t===0?new Uint16Array:new Uint16Array(this.module.HEAP8.buffer,this.data,t)}reshape(t){if(kn.size(t)!==kn.size(this.dims))throw new Error("Invalid new shape");return new IV(this.module,this.dataType,this.data,t)}},YR=class{constructor(e,t,n){this.module=e,this.backend=t,this.customDataOffset=0,this.customDataSize=0,this.adapterInfo=t.adapterInfo,this.deviceInfo=t.deviceInfo;let r=e.PTR_SIZE,i=n/e.PTR_SIZE,a=r===4?"i32":"i64";this.opKernelContext=Number(e.getValue(r*i++,a));let o=Number(e.getValue(r*i++,a));this.outputCount=Number(e.getValue(r*i++,a)),this.customDataOffset=Number(e.getValue(r*i++,"*")),this.customDataSize=Number(e.getValue(r*i++,a));let l=[];for(let c=0;ctypeof l=="number"?this.inputs[l]:l))??this.inputs,r=(t==null?void 0:t.outputs)??[],i=(l,c,u)=>new xy(this.module,c,this.output(l,u),u),a=(l,c)=>{let u=Ap(l,c);if(!u)throw new Error(`Unsupported data type: ${l}`);let d=u>0?this.backend.gpuDataManager.create(u).id:0;return new xy(this.module,l,d,c)};return this.backend.run(e,n,r,i,a,this.outputCount)}output(e,t){let n=this.module.stackSave();try{let r=this.module.PTR_SIZE,i=r===4?"i32":"i64",a=this.module.stackAlloc((1+t.length)*r);this.module.setValue(a,t.length,i);for(let o=0;o{let i=t.jsepInit;if(!i)throw new Error("Failed to initialize JSEP. The WebAssembly module is not built with JSEP support.");if(e==="webgpu"){let a=new SV;await a.initialize(n,r),i("webgpu",[a,o=>a.alloc(Number(o)),o=>a.free(o),(o,l,c,u=!1)=>{if(u)Us("verbose",()=>`[WebGPU] jsepCopyGpuToGpu: src=${Number(o)}, dst=${Number(l)}, size=${Number(c)}`),a.memcpy(Number(o),Number(l));else{Us("verbose",()=>`[WebGPU] jsepCopyCpuToGpu: dataOffset=${Number(o)}, gpuDataId=${Number(l)}, size=${Number(c)}`);let d=t.HEAPU8.subarray(Number(o>>>0),Number(o>>>0)+Number(c));a.upload(Number(l),d)}},async(o,l,c)=>{Us("verbose",()=>`[WebGPU] jsepCopyGpuToCpu: gpuDataId=${o}, dataOffset=${l}, size=${c}`),await a.download(Number(o),()=>t.HEAPU8.subarray(Number(l)>>>0,Number(l+c)>>>0))},(o,l,c)=>a.createKernel(o,Number(l),c,t.UTF8ToString(t._JsepGetNodeName(Number(l)))),o=>a.releaseKernel(o),(o,l,c,u)=>{Us("verbose",()=>`[WebGPU] jsepRun: sessionHandle=${c}, kernel=${o}, contextDataOffset=${l}`);let d=new YR(t,a,Number(l));return a.computeKernel(Number(o),d,u)},()=>a.captureBegin(),()=>a.captureEnd(),()=>a.replay()])}else{let a=new CV(n);i("webnn",[a,()=>a.reserveTensorId(),o=>a.releaseTensorId(o),async(o,l,c,u,d)=>a.ensureTensor(o,l,c,u,d),(o,l)=>{a.uploadTensor(o,l)},async(o,l)=>a.downloadTensor(o,l)])}}}),JR,IS,kS,vh,ZR,vw,AS,MS,Wz,TS,RS,PS,kV=dr(()=>{ehe(),the(),ps(),uf(),pS(),PF(),JR=(e,t)=>{Ka()._OrtInit(e,t)!==0&&ni("Can't initialize onnxruntime.")},IS=async e=>{JR(e.wasm.numThreads,gw(e.logLevel))},kS=async(e,t)=>{{let n=(Yhe(),fw(NV)).init;if(t==="webgpu"){if(typeof navigator>"u"||!navigator.gpu)throw new Error("WebGPU is not supported in current environment");let r=e.webgpu.adapter;if(r){if(typeof r.limits!="object"||typeof r.features!="object"||typeof r.requestDevice!="function")throw new Error("Invalid GPU adapter set in `env.webgpu.adapter`. It must be a GPUAdapter object.")}else{let i=e.webgpu.powerPreference;if(i!==void 0&&i!=="low-power"&&i!=="high-performance")throw new Error(`Invalid powerPreference setting: "${i}"`);let a=e.webgpu.forceFallbackAdapter;if(a!==void 0&&typeof a!="boolean")throw new Error(`Invalid forceFallbackAdapter setting: "${a}"`);if(r=await navigator.gpu.requestAdapter({powerPreference:i,forceFallbackAdapter:a}),!r)throw new Error('Failed to get GPU adapter. You may need to enable flag "--enable-unsafe-webgpu" if you are using Chrome.')}await n("webgpu",Ka(),e,r)}if(t==="webnn"){if(typeof navigator>"u"||!navigator.ml)throw new Error("WebNN is not supported in current environment");await n("webnn",Ka(),e)}}},vh=new Map,ZR=e=>{let t=Ka(),n=t.stackSave();try{let r=t.PTR_SIZE,i=t.stackAlloc(2*r);t._OrtGetInputOutputCount(e,i,i+r)!==0&&ni("Can't get session input/output count.");let a=r===4?"i32":"i64";return[Number(t.getValue(i,a)),Number(t.getValue(i+r,a))]}finally{t.stackRestore(n)}},vw=e=>{let t=Ka(),n=t._malloc(e.byteLength);if(n===0)throw new Error(`Can't create a session. failed to allocate a buffer of size ${e.byteLength}.`);return t.HEAPU8.set(e,n),[n,e.byteLength]},AS=async(e,t)=>{var h,p,f;let n,r,i=Ka();Array.isArray(e)?[n,r]=e:e.buffer===i.HEAPU8.buffer?[n,r]=[e.byteOffset,e.byteLength]:[n,r]=vw(e);let a=0,o=0,l=0,c=[],u=[],d=[];try{if([o,c]=RF(t),(t==null?void 0:t.externalData)&&i.mountExternalData){let C=[];for(let E of t.externalData){let I=typeof E=="string"?E:E.path;C.push(xS(typeof E=="string"?E:E.data).then(R=>{i.mountExternalData(I,R)}))}await Promise.all(C)}for(let C of(t==null?void 0:t.executionProviders)??[])if((typeof C=="string"?C:C.name)==="webnn"){if(i.shouldTransferToMLTensor=!1,typeof C!="string"){let E=C,I=E==null?void 0:E.context,R=E==null?void 0:E.gpuDevice,A=E==null?void 0:E.deviceType,O=E==null?void 0:E.powerPreference;I?i.currentContext=I:R?i.currentContext=await i.jsepCreateMLContext(R):i.currentContext=await i.jsepCreateMLContext({deviceType:A,powerPreference:O})}else i.currentContext=await i.jsepCreateMLContext();break}a=await i._OrtCreateSession(n,r,o),a===0&&ni("Can't create a session."),(h=i.jsepOnCreateSession)==null||h.call(i),i.currentContext&&(i.jsepRegisterMLContext(a,i.currentContext),i.currentContext=void 0,i.shouldTransferToMLTensor=!0);let[b,g]=ZR(a),y=!!(t!=null&&t.enableGraphCapture),w=[],v=[],m=[];for(let C=0;CC==="gpu-buffer"||C==="ml-tensor")&&(l=i._OrtCreateBinding(a),l===0&&ni("Can't create IO binding."),z={handle:l,outputPreferredLocations:m,outputPreferredLocationsEncoded:m.map(C=>s5(C))}),vh.set(a,[a,u,d,z,y,!1]),[a,w,v]}catch(b){throw u.forEach(g=>i._OrtFree(g)),d.forEach(g=>i._OrtFree(g)),l!==0&&i._OrtReleaseBinding(l)!==0&&ni("Can't release IO binding."),a!==0&&i._OrtReleaseSession(a)!==0&&ni("Can't release session."),b}finally{i._free(n),o!==0&&i._OrtReleaseSessionOptions(o)!==0&&ni("Can't release session options."),c.forEach(b=>i._free(b)),(f=i.unmountExternalData)==null||f.call(i)}},MS=e=>{var c;let t=Ka(),n=vh.get(e);if(!n)throw new Error(`cannot release session. invalid session id: ${e}`);let[r,i,a,o,l]=n;o&&(l&&t._OrtClearBoundOutputs(o.handle)!==0&&ni("Can't clear bound outputs."),t._OrtReleaseBinding(o.handle)!==0&&ni("Can't release IO binding.")),(c=t.jsepOnReleaseSession)==null||c.call(t,e),i.forEach(u=>t._OrtFree(u)),a.forEach(u=>t._OrtFree(u)),t._OrtReleaseSession(r)!==0&&ni("Can't release session."),vh.delete(e)},Wz=async(e,t,n,r,i,a=!1)=>{if(!e){t.push(0);return}let o=Ka(),l=o.PTR_SIZE,c=e[0],u=e[1],d=e[3],h=d,p,f;if(c==="string"&&(d==="gpu-buffer"||d==="ml-tensor"))throw new Error("String tensor is not supported on GPU.");if(a&&d!=="gpu-buffer")throw new Error(`External buffer must be provided for input/output index ${i} when enableGraphCapture is true.`);if(d==="gpu-buffer"){let y=e[2].gpuBuffer;f=Ap(em(c),u);let w=o.jsepRegisterBuffer;if(!w)throw new Error('Tensor location "gpu-buffer" is not supported without using WebGPU.');p=w(r,i,y,f)}else if(d==="ml-tensor"){let y=e[2].mlTensor;f=Ap(em(c),u);let w=o.jsepRegisterMLTensor;if(!w)throw new Error('Tensor location "ml-tensor" is not supported without using WebNN.');p=w(r,y,em(c),u)}else{let y=e[2];if(Array.isArray(y)){f=l*y.length,p=o._malloc(f),n.push(p);for(let w=0;wo.setValue(g+v*l,w,l===4?"i32":"i64"));let y=o._OrtCreateTensor(em(c),p,f,g,u.length,s5(h));y===0&&ni(`Can't create tensor for input/output. session=${r}, index=${i}.`),t.push(y)}finally{o.stackRestore(b)}},TS=async(e,t,n,r,i,a)=>{var F,L,X;let o=Ka(),l=o.PTR_SIZE,c=vh.get(e);if(!c)throw new Error(`cannot run inference. invalid session id: ${e}`);let u=c[0],d=c[1],h=c[2],p=c[3],f=c[4],b=c[5],g=t.length,y=r.length,w=0,v=[],m=[],z=[],C=[],E=o.stackSave(),I=o.stackAlloc(g*l),R=o.stackAlloc(g*l),A=o.stackAlloc(y*l),O=o.stackAlloc(y*l);try{[w,v]=TF(a);for(let H=0;Hre*ee,1);N=kp(W);let oe=p==null?void 0:p.outputPreferredLocations[r[H]];if(N==="string"){if(oe==="gpu-buffer"||oe==="ml-tensor")throw new Error("String tensor is not supported on GPU.");let re=[];for(let ee=0;ee0){let re=o.jsepGetBuffer;if(!re)throw new Error('preferredLocation "gpu-buffer" is not supported without using WebGPU.');let ee=re(j),pe=Ap(W,ie);if(pe===void 0||!mS(N))throw new Error(`Unsupported data type: ${N}`);V=!0,q.push([N,se,{gpuBuffer:ee,download:o.jsepCreateDownloader(ee,pe,N),dispose:()=>{o._OrtReleaseTensor(J)!==0&&ni("Can't release tensor.")}},"gpu-buffer"])}else if(oe==="ml-tensor"&&ie>0){let re=o.jsepEnsureTensor;if(!re)throw new Error('preferredLocation "ml-tensor" is not supported without using WebNN.');if(Ap(W,ie)===void 0||!gS(N))throw new Error(`Unsupported data type: ${N}`);let ee=await re(e,j,W,se,!1);V=!0,q.push([N,se,{mlTensor:ee,download:o.jsepCreateMLTensorDownloader(j,N),dispose:()=>{o.jsepReleaseTensorId(j),o._OrtReleaseTensor(J)}},"ml-tensor"])}else{let re=fS(N),ee=new re(ie);new Uint8Array(ee.buffer,ee.byteOffset,ee.byteLength).set(o.HEAPU8.subarray(j,j+ee.byteLength)),q.push([N,se,ee,"cpu"])}}finally{o.stackRestore(Z),N==="string"&&j&&o._free(j),V||o._OrtReleaseTensor(J),(X=o.jsepOnRunEnd)==null||X.call(o,u)}}return p&&!f&&(o._OrtClearBoundOutputs(p.handle)!==0&&ni("Can't clear bound outputs."),vh.set(e,[u,d,h,p,f,!1])),q}finally{o.stackRestore(E),m.forEach(T=>o._OrtReleaseTensor(T)),z.forEach(T=>o._OrtReleaseTensor(T)),C.forEach(T=>o._free(T)),w!==0&&o._OrtReleaseRunOptions(w),v.forEach(T=>o._free(T))}},RS=e=>{let t=Ka(),n=vh.get(e);if(!n)throw new Error("invalid session id");let r=n[0],i=t._OrtEndProfiling(r);i===0&&ni("Can't get an profile file name."),t._OrtFree(i)},PS=e=>{let t=[];for(let n of e){let r=n[2];!Array.isArray(r)&&"buffer"in r&&t.push(r.buffer)}return t}}),wh,Rl,Gf,Yg,Jg,by,Dz,yy,yp,vp,QR,AV,MV,TV,RV,PV,OV,LV,BV=dr(()=>{bd(),kV(),uf(),dS(),wh=()=>!!Fi.wasm.proxy&&typeof document<"u",Gf=!1,Yg=!1,Jg=!1,yy=new Map,yp=(e,t)=>{let n=yy.get(e);n?n.push(t):yy.set(e,[t])},vp=()=>{if(Gf||!Yg||Jg||!Rl)throw new Error("worker not ready")},QR=e=>{switch(e.data.type){case"init-wasm":Gf=!1,e.data.err?(Jg=!0,Dz[1](e.data.err)):(Yg=!0,Dz[0]()),by&&(URL.revokeObjectURL(by),by=void 0);break;case"init-ep":case"copy-from":case"create":case"release":case"run":case"end-profiling":{let t=yy.get(e.data.type);e.data.err?t.shift()[1](e.data.err):t.shift()[0](e.data.out);break}}},AV=async()=>{if(!Yg){if(Gf)throw new Error("multiple calls to 'initWasm()' detected.");if(Jg)throw new Error("previous call to 'initWasm()' failed.");if(Gf=!0,wh())return new Promise((e,t)=>{Rl==null||Rl.terminate(),AF().then(([n,r])=>{var i;try{Rl=r,Rl.onerror=o=>t(o),Rl.onmessage=QR,Dz=[e,t];let a={type:"init-wasm",in:Fi};!a.in.wasm.wasmPaths&&(n||(i=import.meta.url)!=null&&i.startsWith("file:"))&&(a.in.wasm.wasmPaths={wasm:new URL(""+new URL("ort-wasm-simd-threaded.jsep-D5Jk56-t.wasm",import.meta.url).href,import.meta.url).href}),Rl.postMessage(a),by=n}catch(a){t(a)}},t)});try{await hS(Fi.wasm),await IS(Fi),Yg=!0}catch(e){throw Jg=!0,e}finally{Gf=!1}}},MV=async e=>{if(wh())return vp(),new Promise((t,n)=>{yp("init-ep",[t,n]);let r={type:"init-ep",in:{epName:e,env:Fi}};Rl.postMessage(r)});await kS(Fi,e)},TV=async e=>wh()?(vp(),new Promise((t,n)=>{yp("copy-from",[t,n]);let r={type:"copy-from",in:{buffer:e}};Rl.postMessage(r,[e.buffer])})):vw(e),RV=async(e,t)=>{if(wh()){if(t!=null&&t.preferredOutputLocation)throw new Error('session option "preferredOutputLocation" is not supported for proxy.');return vp(),new Promise((n,r)=>{yp("create",[n,r]);let i={type:"create",in:{model:e,options:{...t}}},a=[];e instanceof Uint8Array&&a.push(e.buffer),Rl.postMessage(i,a)})}else return AS(e,t)},PV=async e=>{if(wh())return vp(),new Promise((t,n)=>{yp("release",[t,n]);let r={type:"release",in:e};Rl.postMessage(r)});MS(e)},OV=async(e,t,n,r,i,a)=>{if(wh()){if(n.some(o=>o[3]!=="cpu"))throw new Error("input tensor on GPU is not supported for proxy.");if(i.some(o=>o))throw new Error("pre-allocated output tensor is not supported for proxy.");return vp(),new Promise((o,l)=>{yp("run",[o,l]);let c=n,u={type:"run",in:{sessionId:e,inputIndices:t,inputs:c,outputIndices:r,options:a}};Rl.postMessage(u,PS(c))})}else return TS(e,t,n,r,i,a)},LV=async e=>{if(wh())return vp(),new Promise((t,n)=>{yp("end-profiling",[t,n]);let r={type:"end-profiling",in:e};Rl.postMessage(r)});RS(e)}}),Vz,eP,UV,Jhe=dr(()=>{bd(),BV(),ps(),uS(),PF(),Vz=(e,t)=>{switch(e.location){case"cpu":return[e.type,e.dims,e.data,"cpu"];case"gpu-buffer":return[e.type,e.dims,{gpuBuffer:e.gpuBuffer},"gpu-buffer"];case"ml-tensor":return[e.type,e.dims,{mlTensor:e.mlTensor},"ml-tensor"];default:throw new Error(`invalid data location: ${e.location} for ${t()}`)}},eP=e=>{switch(e[3]){case"cpu":return new ud(e[0],e[2],e[1]);case"gpu-buffer":{let t=e[0];if(!mS(t))throw new Error(`not supported data type: ${t} for deserializing GPU tensor`);let{gpuBuffer:n,download:r,dispose:i}=e[2];return ud.fromGpuBuffer(n,{dataType:t,dims:e[1],download:r,dispose:i})}case"ml-tensor":{let t=e[0];if(!gS(t))throw new Error(`not supported data type: ${t} for deserializing MLTensor tensor`);let{mlTensor:n,download:r,dispose:i}=e[2];return ud.fromMLTensor(n,{dataType:t,dims:e[1],download:r,dispose:i})}default:throw new Error(`invalid data location: ${e[3]}`)}},UV=class{async fetchModelAndCopyToWasmMemory(e){return TV(await xS(e))}async loadModel(e,t){gd();let n;typeof e=="string"?n=await this.fetchModelAndCopyToWasmMemory(e):n=e,[this.sessionId,this.inputNames,this.outputNames]=await RV(n,t),pu()}async dispose(){return PV(this.sessionId)}async run(e,t,n){gd();let r=[],i=[];Object.entries(e).forEach(h=>{let p=h[0],f=h[1],b=this.inputNames.indexOf(p);if(b===-1)throw new Error(`invalid input '${p}'`);r.push(f),i.push(b)});let a=[],o=[];Object.entries(t).forEach(h=>{let p=h[0],f=h[1],b=this.outputNames.indexOf(p);if(b===-1)throw new Error(`invalid output '${p}'`);a.push(f),o.push(b)});let l=r.map((h,p)=>Vz(h,()=>`input "${this.inputNames[i[p]]}"`)),c=a.map((h,p)=>h?Vz(h,()=>`output "${this.outputNames[o[p]]}"`):null),u=await OV(this.sessionId,i,l,o,c,n),d={};for(let h=0;hx5,initializeFlags:()=>g5,wasmBackend:()=>WV});var g5,x5,WV,Zhe=dr(()=>{bd(),BV(),Jhe(),g5=()=>{if((typeof Fi.wasm.initTimeout!="number"||Fi.wasm.initTimeout<0)&&(Fi.wasm.initTimeout=0),Fi.wasm.simd===!1&&console.warn('Deprecated property "env.wasm.simd" is set to false. non-SIMD build is no longer provided, and this setting will be ignored.'),typeof Fi.wasm.proxy!="boolean"&&(Fi.wasm.proxy=!1),typeof Fi.wasm.trace!="boolean"&&(Fi.wasm.trace=!1),typeof Fi.wasm.numThreads!="number"||!Number.isInteger(Fi.wasm.numThreads)||Fi.wasm.numThreads<=0)if(typeof self<"u"&&!self.crossOriginIsolated)Fi.wasm.numThreads=1;else{let e=typeof navigator>"u"?O0e("node:os").cpus().length:navigator.hardwareConcurrency;Fi.wasm.numThreads=Math.min(4,Math.ceil((e||1)/2))}},x5=class{async init(e){g5(),await AV(),await MV(e)}async createInferenceSessionHandler(e,t){let n=new UV;return await n.loadModel(e,t),Promise.resolve(n)}},WV=new x5});bd();bd();bd();var Qhe="1.21.0",epe=jF;{let e=(Zhe(),fw(FV)).wasmBackend;Op("webgpu",e,5),Op("webnn",e,5),Op("cpu",e,10),Op("wasm",e,10)}Object.defineProperty(Fi.versions,"web",{value:Qhe,enumerable:!0});/** +* @license +* Copyright 2021 Google LLC. All Rights Reserved. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* ============================================================================= +*//** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + *//** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */const tpe=Object.freeze(Object.defineProperty({__proto__:null,get InferenceSession(){return cS},get TRACE(){return pb},get TRACE_FUNC_BEGIN(){return gd},get TRACE_FUNC_END(){return pu},get Tensor(){return ud},default:epe,get env(){return Fi},get registerBackend(){return Op}},Symbol.toStringTag,{value:"Module"})),DV={"text-node":{output:[{type:"gen-image",label:"绘画"},{type:"gen-video",label:"视频"},{type:"custom-agent",label:"Agent"}]},"input-image":{output:[{type:"gen-image",label:"绘画"},{type:"gen-video",label:"视频"},{type:"storyboard-node",label:"分镜视表"},{type:"inpaint-crop",label:"裁剪局部重绘"}]},"gen-image":{output:[]},"gen-video":{output:[]},"motion-control":{output:[]},"novel-input":{output:[{type:"custom-agent",label:"Agent"},{type:"text-node",label:"文本"},{type:"rh-app",label:"RH 应用"}]},"video-input":{output:[{type:"preview",label:"预览"},{type:"rh-app",label:"RH 应用"}]},"video-analyze":{output:[{type:"storyboard-node",label:"分镜视表"},{type:"gen-image",label:"绘画"}]},"table-editor-node":{output:[{type:"storyboard-node",label:"分镜视表"}]},"storyboard-node":{output:[{type:"gen-image",label:"绘画"},{type:"gen-video",label:"视频"}]},"storyboard-chart-node":{output:[{type:"preview",label:"预览"}]},"custom-agent":{output:[]},"rh-app":{output:[]},"rh-comfy":{output:[]},"jimeng-super-resolution":{output:[]},"gen-music":{output:[]},"local-save":{output:[]},"inpaint-crop":{output:[]},"inpaint-stitch":{output:[{type:"preview",label:"预览"},{type:"local-save",label:"保存"}]},preview:{output:[]}};function npe(e,t){const n=DV[e];return n?n[t]||[]:[]}const rpe=Object.freeze(Object.defineProperty({__proto__:null,QUICK_CONNECT_CONFIG:DV,getQuickConnectOptions:npe},Symbol.toStringTag,{value:"Module"}));class spe{constructor(){Mn(this,"snapshots",[]);Mn(this,"startTime",0)}start(t="优化开始"){this.startTime=Date.now(),this.snapshots=[],this.takeSnapshot(t),console.log(`[OptimizationTracker] 开始追踪: ${t}`)}takeSnapshot(t,n){try{const r=performance.memory;if(!r){console.warn("[OptimizationTracker] 无法获取内存信息");return}const i={timestamp:Date.now(),memoryUsage:{used:r.usedJSHeapSize,total:r.jsHeapSizeLimit,ratio:r.usedJSHeapSize/r.jsHeapSizeLimit},label:t,notes:n};this.snapshots.push(i),console.log(`[OptimizationTracker] 快照: ${t} - ${(i.memoryUsage.ratio*100).toFixed(2)}%`)}catch(r){console.error("[OptimizationTracker] 拍摄快照失败:",r)}}end(t="优化完成"){if(this.snapshots.length<2)return console.warn("[OptimizationTracker] 快照数量不足,无法生成报告"),null;this.takeSnapshot(t);const n=this.snapshots[0],r=this.snapshots[this.snapshots.length-1],i=r.memoryUsage.used-n.memoryUsage.used,a=r.memoryUsage.ratio-n.memoryUsage.ratio,o=r.timestamp-n.timestamp,l={startSnapshot:n,endSnapshot:r,snapshots:this.snapshots,memoryChange:i,ratioChange:a,timeElapsed:o,improved:i<0,summary:this.generateSummary(i,a,o)};return console.log("[OptimizationTracker] 优化报告:"),console.log(l.summary),l}generateSummary(t,n,r){const i=(t/1024/1024).toFixed(2),a=(n*100).toFixed(2),o=(r/1e3).toFixed(2);return` +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +📊 优化效果报告 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +${t<0?"✅ 改进":"⚠️ 增加"} + +内存变化: + • 绝对值: ${i} MB + • 相对值: ${a} % + • 初始占用: ${(this.snapshots[0].memoryUsage.ratio*100).toFixed(2)} % + • 最终占用: ${(this.snapshots[this.snapshots.length-1].memoryUsage.ratio*100).toFixed(2)} % + +时间统计: + • 总耗时: ${o} 秒 + • 快照数: ${this.snapshots.length} + +快照详情: +${this.snapshots.map((u,d)=>` ${d+1}. ${u.label} - ${(u.memoryUsage.ratio*100).toFixed(2)}% (${(u.memoryUsage.used/1024/1024).toFixed(1)}MB)${u.notes?` - ${u.notes}`:""}`).join(` +`)} + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + `}getSnapshots(){return[...this.snapshots]}exportAsJSON(){return JSON.stringify(this.snapshots,null,2)}exportAsCSV(){const t=[];return t.push("时间,标签,内存占用(MB),占用比例(%),备注"),this.snapshots.forEach(n=>{const r=new Date(n.timestamp).toLocaleTimeString(),i=(n.memoryUsage.used/1024/1024).toFixed(2),a=(n.memoryUsage.ratio*100).toFixed(2),o=n.notes||"";t.push(`${r},${n.label},${i},${a},"${o}"`)}),t.join(` +`)}clear(){this.snapshots=[],this.startTime=0,console.log("[OptimizationTracker] 数据已清空")}}const VV=new spe;typeof window<"u"&&(window.optimizationTracker=VV,console.log("[OptimizationTracker] Exposed to window.optimizationTracker"));const ipe=Object.freeze(Object.defineProperty({__proto__:null,optimizationTracker:VV},Symbol.toStringTag,{value:"Module"}));function OS(){return typeof window<"u"&&"__TAURI__"in window}function HV(){return!1}function GV(){const e=HV(),t=OS();let n="",r="";return t?(n="http://127.0.0.1:9527",r="/api/proxy"):(n="https://dashscope.aliyuncs.com",r=""),{isDevelopment:e,isTauri:t,proxyUrl:n,dashscopeProxyPath:r}}async function qV(){if(!OS())return null;try{return await yn("get_proxy_server_status")}catch(e){return console.error("[Environment] Failed to get proxy server status:",e),null}}async function ape(){const e=GV();if(console.log("[Environment] 初始化环境配置:",{isDevelopment:e.isDevelopment,isTauri:e.isTauri,proxyUrl:e.proxyUrl,dashscopeProxyPath:e.dashscopeProxyPath}),e.isTauri){console.log("[Environment] 等待代理服务器就绪...");let t=0;const n=10;for(;tsetTimeout(r,500))}console.warn("[Environment] 代理服务器启动超时,继续运行")}else console.log("[Environment] 不需要启动代理服务器",{isDevelopment:e.isDevelopment,isTauri:e.isTauri})}const ope=Object.freeze(Object.defineProperty({__proto__:null,getEnvironmentConfig:GV,getTauriProxyServerStatus:qV,initializeEnvironment:ape,isDevelopmentMode:HV,isTauriApp:OS},Symbol.toStringTag,{value:"Module"}));class ww{constructor(t={}){Mn(this,"bufferPool",[]);Mn(this,"config");Mn(this,"monitoringEnabled",!1);Mn(this,"monitorIntervalId",null);Mn(this,"stats",{buffersCreated:0,buffersReused:0,cleanupCount:0,lastCleanupTime:0});Mn(this,"lastWarningTime",0);Mn(this,"WARNING_LOG_COOLDOWN_MS",60*1e3);const{warning:n,cleanup:r}=ww.getThresholds();this.config={bufferSize:t.bufferSize??1024*1024,maxBuffers:t.maxBuffers??10,monitorInterval:t.monitorInterval??5e3,warningThreshold:t.warningThreshold??n,cleanupThreshold:t.cleanupThreshold??r,autoCleanupEnabled:t.autoCleanupEnabled??!0}}static isWindows(){return typeof navigator<"u"&&/win/i.test(navigator.platform+navigator.userAgent)}static getThresholds(){var r;const t=ww.isWindows();let n=4096;return typeof performance<"u"&&((r=performance.memory)!=null&&r.jsHeapSizeLimit)&&(n=performance.memory.jsHeapSizeLimit/(1024*1024)),(!Number.isFinite(n)||n<=0)&&(n=4096),t&&n<4096?{warning:Math.min(1536,n*.6),cleanup:Math.min(1024,n*.45)}:{warning:4096,cleanup:3072}}startMonitoring(){if(this.monitoringEnabled){console.warn("[MemoryPoolManager] Monitoring already started");return}this.monitoringEnabled=!0,this.monitorIntervalId=window.setInterval(()=>{this.checkMemoryUsage()},this.config.monitorInterval),console.log("[MemoryPoolManager] Memory monitoring started")}stopMonitoring(){this.monitorIntervalId!==null&&(clearInterval(this.monitorIntervalId),this.monitorIntervalId=null),this.monitoringEnabled=!1,console.log("[MemoryPoolManager] Memory monitoring stopped")}checkMemoryUsage(){if(!performance.memory)return;const t=performance.memory.usedJSHeapSize/(1024*1024),n=performance.memory.jsHeapSizeLimit/(1024*1024);if(t>this.config.warningThreshold){const r=Date.now();r-this.lastWarningTime>=this.WARNING_LOG_COOLDOWN_MS&&(this.lastWarningTime=r,console.warn(`[MemoryPoolManager] Memory warning: ${t.toFixed(2)}MB / ${n.toFixed(2)}MB`));const i=new CustomEvent("memoryWarning",{detail:{usedMemoryMB:t,limitMemoryMB:n}});window.dispatchEvent(i)}this.config.autoCleanupEnabled&&t>this.config.cleanupThreshold&&(console.log("[MemoryPoolManager] Auto cleanup triggered"),this.cleanup())}acquireBuffer(){let t;return this.bufferPool.length>0?(t=this.bufferPool.pop(),this.stats.buffersReused++):(t=new ArrayBuffer(this.config.bufferSize),this.stats.buffersCreated++),t}releaseBuffer(t){this.bufferPool.length=t.size){const h=l/o;r==null||r(h)}}const u=await fetch(n,{method:"POST",body:c});return r==null||r(1),u}cleanup(){this.bufferPool=[],typeof gc<"u"&&gc(),this.stats.cleanupCount++,this.stats.lastCleanupTime=Date.now(),console.log("[MemoryPoolManager] Cleanup completed");const t=new CustomEvent("memoryCleanup",{detail:{stats:this.getStats()}});window.dispatchEvent(t)}getStats(){return{...this.stats}}getMemoryUsage(){if(!performance.memory)return null;const t=performance.memory.usedJSHeapSize,n=performance.memory.jsHeapSizeLimit,r=performance.memory.jsHeapSizeUsed;return{usedJSHeapSize:(t/(1024*1024)).toFixed(2)+" MB",jsHeapSizeLimit:(n/(1024*1024)).toFixed(2)+" MB",jsHeapSizeUsed:(r/(1024*1024)).toFixed(2)+" MB",usagePercent:(t/n*100).toFixed(2)+"%"}}getPoolStatus(){return{poolSize:this.bufferPool.length,maxBuffers:this.config.maxBuffers,bufferSize:(this.config.bufferSize/(1024*1024)).toFixed(2)+" MB",totalPoolMemory:(this.bufferPool.length*this.config.bufferSize/(1024*1024)).toFixed(2)+" MB"}}setAutoCleanup(t){this.config.autoCleanupEnabled=t,console.log(`[MemoryPoolManager] Auto cleanup: ${t?"enabled":"disabled"}`)}setCleanupThreshold(t){this.config.cleanupThreshold=t,console.log(`[MemoryPoolManager] Cleanup threshold set to: ${t}MB`)}}const k0=new ww({bufferSize:1024*1024,maxBuffers:10,monitorInterval:5e3,warningThreshold:4096,cleanupThreshold:3072,autoCleanupEnabled:!0}),tP=Object.freeze(Object.defineProperty({__proto__:null,memoryPoolManager:k0},Symbol.toStringTag,{value:"Module"})),lpe=typeof navigator<"u"&&/win/i.test(navigator.platform+navigator.userAgent),KV=lpe?240*1e3:480*1e3;let Hz=null,b5=!1;function cpe(){try{Ln.clearMemoryCache(),zi.clearMemoryCache().catch(()=>{}),k0.cleanup(),mn(async()=>{const{assetStore:e}=await Promise.resolve().then(()=>_s);return{assetStore:e}},[],import.meta.url).then(({assetStore:e})=>{var t;(t=e.clearBlobUrlCache)==null||t.call(e)}).catch(()=>{}),console.log("[IdleMemoryCleanup] 闲置清理完成")}catch(e){console.warn("[IdleMemoryCleanup] 清理失败:",e)}LS()}function LS(){Hz!==null&&clearTimeout(Hz),Hz=setTimeout(cpe,KV)}function XV(){b5&&LS()}function upe(){b5||(b5=!0,window.addEventListener("canvasActivity",XV),LS(),console.log("[IdleMemoryCleanup] 已启动,闲置",KV/6e4,"分钟后自动清理缓存"))}const dpe=Object.freeze(Object.defineProperty({__proto__:null,initIdleMemoryCleanup:upe,resetIdleTimer:XV},Symbol.toStringTag,{value:"Module"}));class hpe{constructor(){Mn(this,"renderState",{isFrozen:!1,frozenAt:0,qualityLevel:"medium",activeRequests:0});Mn(this,"requestMap",new Map);Mn(this,"freezeThreshold",3);Mn(this,"unfreezeDelay",2e3);Mn(this,"unfreezeTimeoutId",null);Mn(this,"qualityAdjustmentEnabled",!0);this.initNetworkMonitoring()}initNetworkMonitoring(){const t=window.fetch;window.fetch=(...n)=>{const r=t.apply(window,n);return this.requestMap.set(r,Date.now()),this.updateRenderState(),r.then(()=>{this.requestMap.delete(r),this.updateRenderState()}).catch(()=>{this.requestMap.delete(r),this.updateRenderState()}),r},console.log("[NodeRenderOptimizer] Network monitoring initialized")}updateRenderState(){const t=this.requestMap.size,n=this.renderState.isFrozen,r=t>=this.freezeThreshold;r&&!n?this.freezeNodeContent():!r&&n&&this.unfreezeNodeContent(),this.renderState.activeRequests=t}freezeNodeContent(){this.renderState.isFrozen=!0,this.renderState.frozenAt=Date.now(),this.setQualityLevel("medium"),Kf({enableImageThumbnails:!1,enableVideoLazyLoad:!1}),this.dispatchStateChangeEvent(),this.scheduleUnfreeze()}unfreezeNodeContent(){this.renderState.isFrozen=!1,this.setQualityLevel("medium"),Kf({enableImageThumbnails:!0,enableVideoLazyLoad:!0}),this.dispatchStateChangeEvent(),this.unfreezeTimeoutId!==null&&(clearTimeout(this.unfreezeTimeoutId),this.unfreezeTimeoutId=null)}scheduleUnfreeze(){this.unfreezeTimeoutId!==null&&clearTimeout(this.unfreezeTimeoutId),this.unfreezeTimeoutId=window.setTimeout(()=>{this.renderState.isFrozen&&this.requestMap.size===0&&this.unfreezeNodeContent(),this.unfreezeTimeoutId=null},this.unfreezeDelay)}setQualityLevel(t){if(this.renderState.qualityLevel!==t){switch(this.renderState.qualityLevel=t,t){case"high":Kf({enableRenderQuality:!0,enableImageThumbnails:!0,enableVideoLazyLoad:!0,tinyZoomThreshold:.1});break;case"medium":Kf({enableRenderQuality:!0,enableImageThumbnails:!1,enableVideoLazyLoad:!0,tinyZoomThreshold:.15});break;case"low":Kf({enableRenderQuality:!0,enableImageThumbnails:!1,enableVideoLazyLoad:!1,tinyZoomThreshold:.25});break}this.dispatchStateChangeEvent()}}dispatchStateChangeEvent(){const t=new CustomEvent("nodeRenderStateChanged",{detail:{...this.renderState}});window.dispatchEvent(t)}getRenderState(){return{...this.renderState}}manualFreeze(){this.freezeNodeContent()}manualUnfreeze(){this.unfreezeNodeContent()}setFreezeThreshold(t){this.freezeThreshold=t,console.log(`[NodeRenderOptimizer] Freeze threshold set to: ${t}`)}setUnfreezeDelay(t){this.unfreezeDelay=t,console.log(`[NodeRenderOptimizer] Unfreeze delay set to: ${t}ms`)}setQualityAdjustmentEnabled(t){this.qualityAdjustmentEnabled=t,console.log(`[NodeRenderOptimizer] Quality adjustment: ${t?"enabled":"disabled"}`)}isFrozen(){return this.renderState.isFrozen}getQualityLevel(){return this.renderState.qualityLevel}getActiveRequests(){return this.renderState.activeRequests}}const wp=new hpe;class ppe{constructor(t={}){Mn(this,"initialized",!1);Mn(this,"config");this.config={enableConnectionLineOptimization:t.enableConnectionLineOptimization??!0,enableNodeRenderOptimization:t.enableNodeRenderOptimization??!0,busyThreshold:t.busyThreshold??3,unfreezeDelay:t.unfreezeDelay??2e3}}initialize(){if(this.initialized){console.warn("[PerformanceOptimizationManager] Already initialized");return}console.log("[PerformanceOptimizationManager] Initializing..."),this.config.enableConnectionLineOptimization&&this.initConnectionLineOptimization(),this.config.enableNodeRenderOptimization&&this.initNodeRenderOptimization(),this.setupEventListeners(),this.initialized=!0,console.log("[PerformanceOptimizationManager] Initialized successfully")}initConnectionLineOptimization(){console.log("[PerformanceOptimizationManager] Connection line optimization enabled"),window.addEventListener("performancePresetChanged",t=>{})}initNodeRenderOptimization(){console.log("[PerformanceOptimizationManager] Node render optimization enabled"),window.addEventListener("nodeRenderStateChanged",t=>{})}setupEventListeners(){window.addEventListener("assetDownloadStart",()=>{console.log("[PerformanceOptimizationManager] Asset download started")}),window.addEventListener("allAssetsDownloadComplete",()=>{console.log("[PerformanceOptimizationManager] All assets downloaded")})}getConnectionLineOptimizer(){return Gd}getNodeRenderOptimizer(){return wp}getNetworkStatus(){return Gd.getNetworkStatus()}getRenderState(){return wp.getRenderState()}getStats(){return{connectionLine:{preset:Gd.getCurrentPreset(),animationsEnabled:Gd.isConnectionAnimationsEnabled(),networkStatus:Gd.getNetworkStatus()},nodeRender:{isFrozen:wp.isFrozen(),qualityLevel:wp.getQualityLevel(),activeRequests:wp.getActiveRequests()}}}pauseAll(){Gd.pauseConnectionAnimations(),wp.manualFreeze(),console.log("[PerformanceOptimizationManager] All optimizations paused")}resumeAll(){Gd.resumeConnectionAnimations(),wp.manualUnfreeze(),console.log("[PerformanceOptimizationManager] All optimizations resumed")}reset(){this.initialized=!1,console.log("[PerformanceOptimizationManager] Reset")}}const YV=new ppe({enableConnectionLineOptimization:!0,enableNodeRenderOptimization:!0,busyThreshold:3,unfreezeDelay:2e3});function fpe(){YV.initialize()}const mpe=Object.freeze(Object.defineProperty({__proto__:null,initializePerformanceOptimization:fpe,performanceOptimizationManager:YV},Symbol.toStringTag,{value:"Module"}));class gpe{constructor(t={}){Mn(this,"config");Mn(this,"loadingStates",new Map);Mn(this,"optimisticUpdates",new Map);Mn(this,"skeletonScreens",new Map);this.config={enableLoadingAnimation:t.enableLoadingAnimation??!0,enableSkeletonScreen:t.enableSkeletonScreen??!0,enableOptimisticUpdate:t.enableOptimisticUpdate??!0,loadingDelay:t.loadingDelay??300,skeletonDuration:t.skeletonDuration??2e3}}showLoading(t,n){if(!this.config.enableLoadingAnimation)return;this.loadingStates.set(t,!0);const r=new CustomEvent("loadingStart",{detail:{id:t,message:n}});window.dispatchEvent(r),console.log(`[UIFeedbackManager] Loading started: ${t}`)}hideLoading(t){this.loadingStates.delete(t);const n=new CustomEvent("loadingEnd",{detail:{id:t}});window.dispatchEvent(n),console.log(`[UIFeedbackManager] Loading ended: ${t}`)}isLoading(t){return this.loadingStates.has(t)}showSkeletonScreen(t,n){if(!this.config.enableSkeletonScreen)return;const r=document.createElement("div");r.id=`skeleton-${t}`,r.className="skeleton-screen",r.innerHTML=n,this.skeletonScreens.set(t,r);const i=new CustomEvent("skeletonScreenShow",{detail:{id:t}});window.dispatchEvent(i),console.log(`[UIFeedbackManager] Skeleton screen shown: ${t}`),setTimeout(()=>{this.hideSkeletonScreen(t)},this.config.skeletonDuration)}hideSkeletonScreen(t){const n=this.skeletonScreens.get(t);if(n){n.remove(),this.skeletonScreens.delete(t);const r=new CustomEvent("skeletonScreenHide",{detail:{id:t}});window.dispatchEvent(r),console.log(`[UIFeedbackManager] Skeleton screen hidden: ${t}`)}}optimisticUpdate(t,n,r,i){if(!this.config.enableOptimisticUpdate){r().catch(o=>{console.error("[UIFeedbackManager] Sync failed:",o),i==null||i(o)});return}const a=this.captureState(t);n(),r().then(()=>{console.log(`[UIFeedbackManager] Optimistic update confirmed: ${t}`);const o=new CustomEvent("optimisticUpdateConfirmed",{detail:{id:t}});window.dispatchEvent(o)}).catch(o=>{console.error("[UIFeedbackManager] Optimistic update failed:",o),this.rollbackState(t,a);const l=new CustomEvent("optimisticUpdateFailed",{detail:{id:t,error:o.message}});window.dispatchEvent(l),i==null||i(o)})}captureState(t){return{id:t,timestamp:Date.now()}}rollbackState(t,n){console.log(`[UIFeedbackManager] Rolling back state for: ${t}`);const r=new CustomEvent("stateRollback",{detail:{id:t,state:n}});window.dispatchEvent(r)}showProgressBar(t,n=0){const r=new CustomEvent("progressBarShow",{detail:{id:t,progress:n}});window.dispatchEvent(r),console.log(`[UIFeedbackManager] Progress bar shown: ${t}`)}updateProgressBar(t,n){const r=Math.max(0,Math.min(100,n)),i=new CustomEvent("progressBarUpdate",{detail:{id:t,progress:r}});window.dispatchEvent(i)}hideProgressBar(t){const n=new CustomEvent("progressBarHide",{detail:{id:t}});window.dispatchEvent(n),console.log(`[UIFeedbackManager] Progress bar hidden: ${t}`)}showSuccess(t,n){const r=new CustomEvent("feedbackSuccess",{detail:{id:t,message:n}});window.dispatchEvent(r),console.log(`[UIFeedbackManager] Success: ${n}`)}showError(t,n){const r=new CustomEvent("feedbackError",{detail:{id:t,message:n}});window.dispatchEvent(r),console.error(`[UIFeedbackManager] Error: ${n}`)}showWarning(t,n){const r=new CustomEvent("feedbackWarning",{detail:{id:t,message:n}});window.dispatchEvent(r),console.warn(`[UIFeedbackManager] Warning: ${n}`)}getLoadingStates(){return Array.from(this.loadingStates.keys())}getOptimisticUpdates(){return Array.from(this.optimisticUpdates.keys())}setLoadingAnimationEnabled(t){this.config.enableLoadingAnimation=t,console.log(`[UIFeedbackManager] Loading animation: ${t?"enabled":"disabled"}`)}setSkeletonScreenEnabled(t){this.config.enableSkeletonScreen=t,console.log(`[UIFeedbackManager] Skeleton screen: ${t?"enabled":"disabled"}`)}setOptimisticUpdateEnabled(t){this.config.enableOptimisticUpdate=t,console.log(`[UIFeedbackManager] Optimistic update: ${t?"enabled":"disabled"}`)}cleanup(){this.loadingStates.clear(),this.optimisticUpdates.clear(),this.skeletonScreens.forEach(t=>t.remove()),this.skeletonScreens.clear(),console.log("[UIFeedbackManager] Cleanup completed")}}const vy=new gpe({enableLoadingAnimation:!0,enableSkeletonScreen:!0,enableOptimisticUpdate:!0,loadingDelay:300,skeletonDuration:2e3});class xpe{constructor(t={}){Mn(this,"initialized",!1);Mn(this,"config");Mn(this,"lastMemoryWarningLog",0);Mn(this,"MEMORY_WARNING_LOG_COOLDOWN_MS",60*1e3);this.config={enableMemoryOptimization:t.enableMemoryOptimization??!0,enableUIFeedbackOptimization:t.enableUIFeedbackOptimization??!0,enableMemoryMonitoring:t.enableMemoryMonitoring??!0}}initialize(){if(this.initialized){console.warn("[FinalOptimizationManager] Already initialized");return}console.log("[FinalOptimizationManager] Initializing..."),this.config.enableMemoryOptimization&&this.initMemoryOptimization(),this.config.enableUIFeedbackOptimization&&this.initUIFeedbackOptimization(),this.setupEventListeners(),this.initialized=!0,console.log("[FinalOptimizationManager] Initialized successfully")}initMemoryOptimization(){console.log("[FinalOptimizationManager] Memory optimization enabled"),this.config.enableMemoryMonitoring&&k0.startMonitoring(),window.addEventListener("memoryWarning",t=>{const n=Date.now();n-this.lastMemoryWarningLog>=this.MEMORY_WARNING_LOG_COOLDOWN_MS&&(this.lastMemoryWarningLog=n,console.warn("[FinalOptimizationManager] Memory warning:",t.detail))}),window.addEventListener("memoryCleanup",t=>{console.log("[FinalOptimizationManager] Memory cleanup:",t.detail)})}initUIFeedbackOptimization(){console.log("[FinalOptimizationManager] UI feedback optimization enabled"),window.addEventListener("loadingStart",t=>{console.log("[FinalOptimizationManager] Loading started:",t.detail)}),window.addEventListener("loadingEnd",t=>{console.log("[FinalOptimizationManager] Loading ended:",t.detail)}),window.addEventListener("optimisticUpdateConfirmed",t=>{console.log("[FinalOptimizationManager] Optimistic update confirmed:",t.detail)}),window.addEventListener("optimisticUpdateFailed",t=>{console.warn("[FinalOptimizationManager] Optimistic update failed:",t.detail)}),window.addEventListener("feedbackSuccess",t=>{console.log("[FinalOptimizationManager] Success:",t.detail)}),window.addEventListener("feedbackError",t=>{console.error("[FinalOptimizationManager] Error:",t.detail)})}setupEventListeners(){window.addEventListener("allAssetsDownloadComplete",()=>{console.log("[FinalOptimizationManager] All assets downloaded")}),window.addEventListener("beforeunload",()=>{this.cleanup()})}getMemoryPoolManager(){return k0}getUIFeedbackManager(){return vy}getStats(){return{memory:{poolStatus:k0.getPoolStatus(),memoryUsage:k0.getMemoryUsage(),stats:k0.getStats()},uiFeedback:{loadingStates:vy.getLoadingStates(),optimisticUpdates:vy.getOptimisticUpdates()}}}cleanupMemory(){k0.cleanup()}cleanup(){k0.stopMonitoring(),vy.cleanup(),console.log("[FinalOptimizationManager] Cleanup completed")}reset(){this.initialized=!1,this.cleanup(),console.log("[FinalOptimizationManager] Reset")}}const JV=new xpe({enableMemoryOptimization:!0,enableUIFeedbackOptimization:!0,enableMemoryMonitoring:!0});function bpe(){JV.initialize()}const ype=Object.freeze(Object.defineProperty({__proto__:null,finalOptimizationManager:JV,initializeFinalOptimization:bpe},Symbol.toStringTag,{value:"Module"}));function vpe(e,t){}const wpe=Object.freeze(Object.defineProperty({__proto__:null,initGeminiMarkerService:vpe},Symbol.toStringTag,{value:"Module"}));class BS{constructor(...t){this.type="Logical",t.length===1?"Logical"in t[0]?(this.width=t[0].Logical.width,this.height=t[0].Logical.height):(this.width=t[0].width,this.height=t[0].height):(this.width=t[0],this.height=t[1])}toPhysical(t){return new mm(this.width*t,this.height*t)}[gl](){return{width:this.width,height:this.height}}toJSON(){return this[gl]()}}class mm{constructor(...t){this.type="Physical",t.length===1?"Physical"in t[0]?(this.width=t[0].Physical.width,this.height=t[0].Physical.height):(this.width=t[0].width,this.height=t[0].height):(this.width=t[0],this.height=t[1])}toLogical(t){return new BS(this.width/t,this.height/t)}[gl](){return{width:this.width,height:this.height}}toJSON(){return this[gl]()}}class qf{constructor(t){this.size=t}toLogical(t){return this.size instanceof BS?this.size:this.size.toLogical(t)}toPhysical(t){return this.size instanceof mm?this.size:this.size.toPhysical(t)}[gl](){return{[`${this.size.type}`]:{width:this.size.width,height:this.size.height}}}toJSON(){return this[gl]()}}class US{constructor(...t){this.type="Logical",t.length===1?"Logical"in t[0]?(this.x=t[0].Logical.x,this.y=t[0].Logical.y):(this.x=t[0].x,this.y=t[0].y):(this.x=t[0],this.y=t[1])}toPhysical(t){return new M0(this.x*t,this.y*t)}[gl](){return{x:this.x,y:this.y}}toJSON(){return this[gl]()}}class M0{constructor(...t){this.type="Physical",t.length===1?"Physical"in t[0]?(this.x=t[0].Physical.x,this.y=t[0].Physical.y):(this.x=t[0].x,this.y=t[0].y):(this.x=t[0],this.y=t[1])}toLogical(t){return new US(this.x/t,this.y/t)}[gl](){return{x:this.x,y:this.y}}toJSON(){return this[gl]()}}class wy{constructor(t){this.position=t}toLogical(t){return this.position instanceof US?this.position:this.position.toLogical(t)}toPhysical(t){return this.position instanceof M0?this.position:this.position.toPhysical(t)}[gl](){return{[`${this.position.type}`]:{x:this.position.x,y:this.position.y}}}toJSON(){return this[gl]()}}let _pe=class $v extends jw{constructor(t){super(t)}static async new(t,n,r){return yn("plugin:image|new",{rgba:_w(t),width:n,height:r}).then(i=>new $v(i))}static async fromBytes(t){return yn("plugin:image|from_bytes",{bytes:_w(t)}).then(n=>new $v(n))}static async fromPath(t){return yn("plugin:image|from_path",{path:t}).then(n=>new $v(n))}async rgba(){return yn("plugin:image|rgba",{rid:this.rid}).then(t=>new Uint8Array(t))}async size(){return yn("plugin:image|size",{rid:this.rid})}};function _w(e){return e==null?null:typeof e=="string"?e:e instanceof _pe?e.rid:e}var zw;(function(e){e[e.Critical=1]="Critical",e[e.Informational=2]="Informational"})(zw||(zw={}));class ZV{constructor(t){this._preventDefault=!1,this.event=t.event,this.id=t.id}preventDefault(){this._preventDefault=!0}isPreventDefault(){return this._preventDefault}}var y5;(function(e){e.None="none",e.Normal="normal",e.Indeterminate="indeterminate",e.Paused="paused",e.Error="error"})(y5||(y5={}));function QV(){return new FS(window.__TAURI_INTERNALS__.metadata.currentWindow.label,{skip:!0})}async function Sv(){return yn("plugin:window|get_all_windows").then(e=>e.map(t=>new FS(t,{skip:!0})))}const Gz=["tauri://created","tauri://error"];class FS{constructor(t,n={}){var r;this.label=t,this.listeners=Object.create(null),n!=null&&n.skip||yn("plugin:window|create",{options:{...n,parent:typeof n.parent=="string"?n.parent:(r=n.parent)===null||r===void 0?void 0:r.label,label:t}}).then(async()=>this.emit("tauri://created")).catch(async i=>this.emit("tauri://error",i))}static async getByLabel(t){var n;return(n=(await Sv()).find(r=>r.label===t))!==null&&n!==void 0?n:null}static getCurrent(){return QV()}static async getAll(){return Sv()}static async getFocusedWindow(){for(const t of await Sv())if(await t.isFocused())return t;return null}async listen(t,n){return this._handleTauriEvent(t,n)?()=>{const r=this.listeners[t];r.splice(r.indexOf(n),1)}:K5(t,n,{target:{kind:"Window",label:this.label}})}async once(t,n){return this._handleTauriEvent(t,n)?()=>{const r=this.listeners[t];r.splice(r.indexOf(n),1)}:LY(t,n,{target:{kind:"Window",label:this.label}})}async emit(t,n){if(Gz.includes(t)){for(const r of this.listeners[t]||[])r({event:t,id:-1,payload:n});return}return BY(t,n)}async emitTo(t,n,r){if(Gz.includes(n)){for(const i of this.listeners[n]||[])i({event:n,id:-1,payload:r});return}return UY(t,n,r)}_handleTauriEvent(t,n){return Gz.includes(t)?(t in this.listeners?this.listeners[t].push(n):this.listeners[t]=[n],!0):!1}async scaleFactor(){return yn("plugin:window|scale_factor",{label:this.label})}async innerPosition(){return yn("plugin:window|inner_position",{label:this.label}).then(t=>new M0(t))}async outerPosition(){return yn("plugin:window|outer_position",{label:this.label}).then(t=>new M0(t))}async innerSize(){return yn("plugin:window|inner_size",{label:this.label}).then(t=>new mm(t))}async outerSize(){return yn("plugin:window|outer_size",{label:this.label}).then(t=>new mm(t))}async isFullscreen(){return yn("plugin:window|is_fullscreen",{label:this.label})}async isMinimized(){return yn("plugin:window|is_minimized",{label:this.label})}async isMaximized(){return yn("plugin:window|is_maximized",{label:this.label})}async isFocused(){return yn("plugin:window|is_focused",{label:this.label})}async isDecorated(){return yn("plugin:window|is_decorated",{label:this.label})}async isResizable(){return yn("plugin:window|is_resizable",{label:this.label})}async isMaximizable(){return yn("plugin:window|is_maximizable",{label:this.label})}async isMinimizable(){return yn("plugin:window|is_minimizable",{label:this.label})}async isClosable(){return yn("plugin:window|is_closable",{label:this.label})}async isVisible(){return yn("plugin:window|is_visible",{label:this.label})}async title(){return yn("plugin:window|title",{label:this.label})}async theme(){return yn("plugin:window|theme",{label:this.label})}async isAlwaysOnTop(){return yn("plugin:window|is_always_on_top",{label:this.label})}async center(){return yn("plugin:window|center",{label:this.label})}async requestUserAttention(t){let n=null;return t&&(t===zw.Critical?n={type:"Critical"}:n={type:"Informational"}),yn("plugin:window|request_user_attention",{label:this.label,value:n})}async setResizable(t){return yn("plugin:window|set_resizable",{label:this.label,value:t})}async setEnabled(t){return yn("plugin:window|set_enabled",{label:this.label,value:t})}async isEnabled(){return yn("plugin:window|is_enabled",{label:this.label})}async setMaximizable(t){return yn("plugin:window|set_maximizable",{label:this.label,value:t})}async setMinimizable(t){return yn("plugin:window|set_minimizable",{label:this.label,value:t})}async setClosable(t){return yn("plugin:window|set_closable",{label:this.label,value:t})}async setTitle(t){return yn("plugin:window|set_title",{label:this.label,value:t})}async maximize(){return yn("plugin:window|maximize",{label:this.label})}async unmaximize(){return yn("plugin:window|unmaximize",{label:this.label})}async toggleMaximize(){return yn("plugin:window|toggle_maximize",{label:this.label})}async minimize(){return yn("plugin:window|minimize",{label:this.label})}async unminimize(){return yn("plugin:window|unminimize",{label:this.label})}async show(){return yn("plugin:window|show",{label:this.label})}async hide(){return yn("plugin:window|hide",{label:this.label})}async close(){return yn("plugin:window|close",{label:this.label})}async destroy(){return yn("plugin:window|destroy",{label:this.label})}async setDecorations(t){return yn("plugin:window|set_decorations",{label:this.label,value:t})}async setShadow(t){return yn("plugin:window|set_shadow",{label:this.label,value:t})}async setEffects(t){return yn("plugin:window|set_effects",{label:this.label,value:t})}async clearEffects(){return yn("plugin:window|set_effects",{label:this.label,value:null})}async setAlwaysOnTop(t){return yn("plugin:window|set_always_on_top",{label:this.label,value:t})}async setAlwaysOnBottom(t){return yn("plugin:window|set_always_on_bottom",{label:this.label,value:t})}async setContentProtected(t){return yn("plugin:window|set_content_protected",{label:this.label,value:t})}async setSize(t){return yn("plugin:window|set_size",{label:this.label,value:t instanceof qf?t:new qf(t)})}async setMinSize(t){return yn("plugin:window|set_min_size",{label:this.label,value:t instanceof qf?t:t?new qf(t):null})}async setMaxSize(t){return yn("plugin:window|set_max_size",{label:this.label,value:t instanceof qf?t:t?new qf(t):null})}async setSizeConstraints(t){function n(r){return r?{Logical:r}:null}return yn("plugin:window|set_size_constraints",{label:this.label,value:{minWidth:n(t==null?void 0:t.minWidth),minHeight:n(t==null?void 0:t.minHeight),maxWidth:n(t==null?void 0:t.maxWidth),maxHeight:n(t==null?void 0:t.maxHeight)}})}async setPosition(t){return yn("plugin:window|set_position",{label:this.label,value:t instanceof wy?t:new wy(t)})}async setFullscreen(t){return yn("plugin:window|set_fullscreen",{label:this.label,value:t})}async setSimpleFullscreen(t){return yn("plugin:window|set_simple_fullscreen",{label:this.label,value:t})}async setFocus(){return yn("plugin:window|set_focus",{label:this.label})}async setFocusable(t){return yn("plugin:window|set_focusable",{label:this.label,value:t})}async setIcon(t){return yn("plugin:window|set_icon",{label:this.label,value:_w(t)})}async setSkipTaskbar(t){return yn("plugin:window|set_skip_taskbar",{label:this.label,value:t})}async setCursorGrab(t){return yn("plugin:window|set_cursor_grab",{label:this.label,value:t})}async setCursorVisible(t){return yn("plugin:window|set_cursor_visible",{label:this.label,value:t})}async setCursorIcon(t){return yn("plugin:window|set_cursor_icon",{label:this.label,value:t})}async setBackgroundColor(t){return yn("plugin:window|set_background_color",{color:t})}async setCursorPosition(t){return yn("plugin:window|set_cursor_position",{label:this.label,value:t instanceof wy?t:new wy(t)})}async setIgnoreCursorEvents(t){return yn("plugin:window|set_ignore_cursor_events",{label:this.label,value:t})}async startDragging(){return yn("plugin:window|start_dragging",{label:this.label})}async startResizeDragging(t){return yn("plugin:window|start_resize_dragging",{label:this.label,value:t})}async setBadgeCount(t){return yn("plugin:window|set_badge_count",{label:this.label,value:t})}async setBadgeLabel(t){return yn("plugin:window|set_badge_label",{label:this.label,value:t})}async setOverlayIcon(t){return yn("plugin:window|set_overlay_icon",{label:this.label,value:t?_w(t):void 0})}async setProgressBar(t){return yn("plugin:window|set_progress_bar",{label:this.label,value:t})}async setVisibleOnAllWorkspaces(t){return yn("plugin:window|set_visible_on_all_workspaces",{label:this.label,value:t})}async setTitleBarStyle(t){return yn("plugin:window|set_title_bar_style",{label:this.label,value:t})}async setTheme(t){return yn("plugin:window|set_theme",{label:this.label,value:t})}async onResized(t){return this.listen(xc.WINDOW_RESIZED,n=>{n.payload=new mm(n.payload),t(n)})}async onMoved(t){return this.listen(xc.WINDOW_MOVED,n=>{n.payload=new M0(n.payload),t(n)})}async onCloseRequested(t){return this.listen(xc.WINDOW_CLOSE_REQUESTED,async n=>{const r=new ZV(n);await t(r),r.isPreventDefault()||await this.destroy()})}async onDragDropEvent(t){const n=await this.listen(xc.DRAG_ENTER,o=>{t({...o,payload:{type:"enter",paths:o.payload.paths,position:new M0(o.payload.position)}})}),r=await this.listen(xc.DRAG_OVER,o=>{t({...o,payload:{type:"over",position:new M0(o.payload.position)}})}),i=await this.listen(xc.DRAG_DROP,o=>{t({...o,payload:{type:"drop",paths:o.payload.paths,position:new M0(o.payload.position)}})}),a=await this.listen(xc.DRAG_LEAVE,o=>{t({...o,payload:{type:"leave"}})});return()=>{n(),i(),r(),a()}}async onFocusChanged(t){const n=await this.listen(xc.WINDOW_FOCUS,i=>{t({...i,payload:!0})}),r=await this.listen(xc.WINDOW_BLUR,i=>{t({...i,payload:!1})});return()=>{n(),r()}}async onScaleChanged(t){return this.listen(xc.WINDOW_SCALE_FACTOR_CHANGED,t)}async onThemeChanged(t){return this.listen(xc.WINDOW_THEME_CHANGED,t)}}var nP;(function(e){e.Disabled="disabled",e.Throttle="throttle",e.Suspend="suspend"})(nP||(nP={}));var rP;(function(e){e.Default="default",e.FluentOverlay="fluentOverlay"})(rP||(rP={}));var v5;(function(e){e.AppearanceBased="appearanceBased",e.Light="light",e.Dark="dark",e.MediumLight="mediumLight",e.UltraDark="ultraDark",e.Titlebar="titlebar",e.Selection="selection",e.Menu="menu",e.Popover="popover",e.Sidebar="sidebar",e.HeaderView="headerView",e.Sheet="sheet",e.WindowBackground="windowBackground",e.HudWindow="hudWindow",e.FullScreenUI="fullScreenUI",e.Tooltip="tooltip",e.ContentBackground="contentBackground",e.UnderWindowBackground="underWindowBackground",e.UnderPageBackground="underPageBackground",e.Mica="mica",e.Blur="blur",e.Acrylic="acrylic",e.Tabbed="tabbed",e.TabbedDark="tabbedDark",e.TabbedLight="tabbedLight"})(v5||(v5={}));var w5;(function(e){e.FollowsWindowActiveState="followsWindowActiveState",e.Active="active",e.Inactive="inactive"})(w5||(w5={}));const zpe=Object.freeze(Object.defineProperty({__proto__:null,CloseRequestedEvent:ZV,get Effect(){return v5},get EffectState(){return w5},LogicalPosition:US,LogicalSize:BS,PhysicalPosition:M0,PhysicalSize:mm,get ProgressBarStatus(){return y5},get UserAttentionType(){return zw},Window:FS,getAllWindows:Sv,getCurrentWindow:QV},Symbol.toStringTag,{value:"Module"})); diff --git a/analysis/qiaodou-extract/extracted/assets/jimeng-color-CtBciSlW.webp b/analysis/qiaodou-extract/extracted/assets/jimeng-color-CtBciSlW.webp new file mode 100644 index 000000000..96534fc36 Binary files /dev/null and b/analysis/qiaodou-extract/extracted/assets/jimeng-color-CtBciSlW.webp differ diff --git a/analysis/qiaodou-extract/extracted/assets/kling-color-O6Fl0YZh.webp b/analysis/qiaodou-extract/extracted/assets/kling-color-O6Fl0YZh.webp new file mode 100644 index 000000000..e8ff6981d Binary files /dev/null and b/analysis/qiaodou-extract/extracted/assets/kling-color-O6Fl0YZh.webp differ diff --git a/analysis/qiaodou-extract/extracted/assets/midjourney bai-4Fw3hs7F.webp b/analysis/qiaodou-extract/extracted/assets/midjourney bai-4Fw3hs7F.webp new file mode 100644 index 000000000..b0a4351f6 Binary files /dev/null and b/analysis/qiaodou-extract/extracted/assets/midjourney bai-4Fw3hs7F.webp differ diff --git a/analysis/qiaodou-extract/extracted/assets/midjourney-BOG0L-7m.webp b/analysis/qiaodou-extract/extracted/assets/midjourney-BOG0L-7m.webp new file mode 100644 index 000000000..4b82081a6 Binary files /dev/null and b/analysis/qiaodou-extract/extracted/assets/midjourney-BOG0L-7m.webp differ diff --git a/analysis/qiaodou-extract/extracted/assets/minimax-color-Dx2mFylD.webp b/analysis/qiaodou-extract/extracted/assets/minimax-color-Dx2mFylD.webp new file mode 100644 index 000000000..798554e35 Binary files /dev/null and b/analysis/qiaodou-extract/extracted/assets/minimax-color-Dx2mFylD.webp differ diff --git a/analysis/qiaodou-extract/extracted/assets/moonshot baise-CDuFHouK.webp b/analysis/qiaodou-extract/extracted/assets/moonshot baise-CDuFHouK.webp new file mode 100644 index 000000000..c6086ac79 Binary files /dev/null and b/analysis/qiaodou-extract/extracted/assets/moonshot baise-CDuFHouK.webp differ diff --git a/analysis/qiaodou-extract/extracted/assets/moonshot-Cy56VaSZ.webp b/analysis/qiaodou-extract/extracted/assets/moonshot-Cy56VaSZ.webp new file mode 100644 index 000000000..cdeb1394a Binary files /dev/null and b/analysis/qiaodou-extract/extracted/assets/moonshot-Cy56VaSZ.webp differ diff --git a/analysis/qiaodou-extract/extracted/assets/nanobanana-color-Re8s94pO.webp b/analysis/qiaodou-extract/extracted/assets/nanobanana-color-Re8s94pO.webp new file mode 100644 index 000000000..89cb5940f Binary files /dev/null and b/analysis/qiaodou-extract/extracted/assets/nanobanana-color-Re8s94pO.webp differ diff --git a/analysis/qiaodou-extract/extracted/assets/openai bai-C9wdsUvK.webp b/analysis/qiaodou-extract/extracted/assets/openai bai-C9wdsUvK.webp new file mode 100644 index 000000000..d51767944 Binary files /dev/null and b/analysis/qiaodou-extract/extracted/assets/openai bai-C9wdsUvK.webp differ diff --git a/analysis/qiaodou-extract/extracted/assets/openai-DM5htlBi.webp b/analysis/qiaodou-extract/extracted/assets/openai-DM5htlBi.webp new file mode 100644 index 000000000..38c85b4f4 Binary files /dev/null and b/analysis/qiaodou-extract/extracted/assets/openai-DM5htlBi.webp differ diff --git a/analysis/qiaodou-extract/extracted/assets/ort-wasm-simd-threaded.jsep-D5Jk56-t.wasm b/analysis/qiaodou-extract/extracted/assets/ort-wasm-simd-threaded.jsep-D5Jk56-t.wasm new file mode 100644 index 000000000..de6a7826d Binary files /dev/null and b/analysis/qiaodou-extract/extracted/assets/ort-wasm-simd-threaded.jsep-D5Jk56-t.wasm differ diff --git a/analysis/qiaodou-extract/extracted/assets/ort.bundle.min-OfoG_cy9.mjs b/analysis/qiaodou-extract/extracted/assets/ort.bundle.min-OfoG_cy9.mjs new file mode 100644 index 000000000..9277252f3 --- /dev/null +++ b/analysis/qiaodou-extract/extracted/assets/ort.bundle.min-OfoG_cy9.mjs @@ -0,0 +1,2817 @@ +/*! + * ONNX Runtime Web v1.21.0 + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + */ +var Un=Object.defineProperty;var Af=Object.getOwnPropertyDescriptor;var kf=Object.getOwnPropertyNames;var Ef=Object.prototype.hasOwnProperty;var Nn=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var G=(e,t)=>()=>(e&&(t=e(e=0)),t);var Zt=(e,t)=>{for(var n in t)Un(e,n,{get:t[n],enumerable:!0})},Pf=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of kf(t))!Ef.call(e,o)&&o!==n&&Un(e,o,{get:()=>t[o],enumerable:!(r=Af(t,o))||r.enumerable});return e};var br=e=>Pf(Un({},"__esModule",{value:!0}),e);var _r,Tt,Ct,zf,Wa,Vn=G(()=>{"use strict";_r=new Map,Tt=[],Ct=(e,t,n)=>{if(t&&typeof t.init=="function"&&typeof t.createInferenceSessionHandler=="function"){let r=_r.get(e);if(r===void 0)_r.set(e,{backend:t,priority:n});else{if(r.priority>n)return;if(r.priority===n&&r.backend!==t)throw new Error(`cannot register backend "${e}" using priority ${n}`)}if(n>=0){let o=Tt.indexOf(e);o!==-1&&Tt.splice(o,1);for(let a=0;a{let t=_r.get(e);if(!t)return"backend not found.";if(t.initialized)return t.backend;if(t.aborted)return t.error;{let n=!!t.initPromise;try{return n||(t.initPromise=t.backend.init(e)),await t.initPromise,t.initialized=!0,t.backend}catch(r){return n||(t.error=`${r}`,t.aborted=!0),t.error}finally{delete t.initPromise}}},Wa=async e=>{let t=e.executionProviders||[],n=t.map(l=>typeof l=="string"?l:l.name),r=n.length===0?Tt:n,o,a=[],s=new Set;for(let l of r){let p=await zf(l);typeof p=="string"?a.push({name:l,err:p}):(o||(o=p),o===p&&s.add(l))}if(!o)throw new Error(`no available backend found. ERR: ${a.map(l=>`[${l.name}] ${l.err}`).join(", ")}`);for(let{name:l,err:p}of a)n.includes(l)&&console.warn(`removing requested execution provider "${l}" from session options because it is not available: ${p}`);let d=t.filter(l=>s.has(typeof l=="string"?l:l.name));return[o,new Proxy(e,{get:(l,p)=>p==="executionProviders"?d:Reflect.get(l,p)})]}});var La=G(()=>{"use strict";Vn()});var Ga,Ha=G(()=>{"use strict";Ga="1.21.0"});var Fa,Ue,Wn=G(()=>{"use strict";Ha();Fa="warning",Ue={wasm:{},webgl:{},webgpu:{},versions:{common:Ga},set logLevel(e){if(e!==void 0){if(typeof e!="string"||["verbose","info","warning","error","fatal"].indexOf(e)===-1)throw new Error(`Unsupported logging level: ${e}`);Fa=e}},get logLevel(){return Fa}};Object.defineProperty(Ue,"logLevel",{enumerable:!0})});var we,qa=G(()=>{"use strict";Wn();we=Ue});var Ka,ja,Za=G(()=>{"use strict";Ka=(e,t)=>{let n=typeof document<"u"?document.createElement("canvas"):new OffscreenCanvas(1,1);n.width=e.dims[3],n.height=e.dims[2];let r=n.getContext("2d");if(r!=null){let o,a;t?.tensorLayout!==void 0&&t.tensorLayout==="NHWC"?(o=e.dims[2],a=e.dims[3]):(o=e.dims[3],a=e.dims[2]);let s=t?.format!==void 0?t.format:"RGB",d=t?.norm,l,p;d===void 0||d.mean===void 0?l=[255,255,255,255]:typeof d.mean=="number"?l=[d.mean,d.mean,d.mean,d.mean]:(l=[d.mean[0],d.mean[1],d.mean[2],0],d.mean[3]!==void 0&&(l[3]=d.mean[3])),d===void 0||d.bias===void 0?p=[0,0,0,0]:typeof d.bias=="number"?p=[d.bias,d.bias,d.bias,d.bias]:(p=[d.bias[0],d.bias[1],d.bias[2],0],d.bias[3]!==void 0&&(p[3]=d.bias[3]));let f=a*o,h=0,y=f,_=f*2,b=-1;s==="RGBA"?(h=0,y=f,_=f*2,b=f*3):s==="RGB"?(h=0,y=f,_=f*2):s==="RBG"&&(h=0,_=f,y=f*2);for(let w=0;w{let n=typeof document<"u"?document.createElement("canvas").getContext("2d"):new OffscreenCanvas(1,1).getContext("2d"),r;if(n!=null){let o,a,s;t?.tensorLayout!==void 0&&t.tensorLayout==="NHWC"?(o=e.dims[2],a=e.dims[1],s=e.dims[3]):(o=e.dims[3],a=e.dims[2],s=e.dims[1]);let d=t!==void 0&&t.format!==void 0?t.format:"RGB",l=t?.norm,p,f;l===void 0||l.mean===void 0?p=[255,255,255,255]:typeof l.mean=="number"?p=[l.mean,l.mean,l.mean,l.mean]:(p=[l.mean[0],l.mean[1],l.mean[2],255],l.mean[3]!==void 0&&(p[3]=l.mean[3])),l===void 0||l.bias===void 0?f=[0,0,0,0]:typeof l.bias=="number"?f=[l.bias,l.bias,l.bias,l.bias]:(f=[l.bias[0],l.bias[1],l.bias[2],0],l.bias[3]!==void 0&&(f[3]=l.bias[3]));let h=a*o;if(t!==void 0&&(t.format!==void 0&&s===4&&t.format!=="RGBA"||s===3&&t.format!=="RGB"&&t.format!=="BGR"))throw new Error("Tensor format doesn't match input tensor dims");let y=4,_=0,b=1,w=2,S=3,$=0,v=h,T=h*2,C=-1;d==="RGBA"?($=0,v=h,T=h*2,C=h*3):d==="RGB"?($=0,v=h,T=h*2):d==="RBG"&&($=0,T=h,v=h*2),r=n.createImageData(o,a);for(let A=0;A{"use strict";wr();Ln=(e,t)=>{if(e===void 0)throw new Error("Image buffer must be defined");if(t.height===void 0||t.width===void 0)throw new Error("Image height and width must be defined");if(t.tensorLayout==="NHWC")throw new Error("NHWC Tensor layout is not supported yet");let{height:n,width:r}=t,o=t.norm??{mean:255,bias:0},a,s;typeof o.mean=="number"?a=[o.mean,o.mean,o.mean,o.mean]:a=[o.mean[0],o.mean[1],o.mean[2],o.mean[3]??255],typeof o.bias=="number"?s=[o.bias,o.bias,o.bias,o.bias]:s=[o.bias[0],o.bias[1],o.bias[2],o.bias[3]??0];let d=t.format!==void 0?t.format:"RGBA",l=t.tensorFormat!==void 0&&t.tensorFormat!==void 0?t.tensorFormat:"RGB",p=n*r,f=l==="RGBA"?new Float32Array(p*4):new Float32Array(p*3),h=4,y=0,_=1,b=2,w=3,S=0,$=p,v=p*2,T=-1;d==="RGB"&&(h=3,y=0,_=1,b=2,w=-1),l==="RGBA"?T=p*3:l==="RBG"?(S=0,v=p,$=p*2):l==="BGR"&&(v=0,$=p,S=p*2);for(let A=0;A{let n=typeof HTMLImageElement<"u"&&e instanceof HTMLImageElement,r=typeof ImageData<"u"&&e instanceof ImageData,o=typeof ImageBitmap<"u"&&e instanceof ImageBitmap,a=typeof e=="string",s,d=t??{},l=()=>{if(typeof document<"u")return document.createElement("canvas");if(typeof OffscreenCanvas<"u")return new OffscreenCanvas(1,1);throw new Error("Canvas is not supported")},p=f=>typeof HTMLCanvasElement<"u"&&f instanceof HTMLCanvasElement||f instanceof OffscreenCanvas?f.getContext("2d"):null;if(n){let f=l();f.width=e.width,f.height=e.height;let h=p(f);if(h!=null){let y=e.height,_=e.width;if(t!==void 0&&t.resizedHeight!==void 0&&t.resizedWidth!==void 0&&(y=t.resizedHeight,_=t.resizedWidth),t!==void 0){if(d=t,t.tensorFormat!==void 0)throw new Error("Image input config format must be RGBA for HTMLImageElement");d.tensorFormat="RGBA",d.height=y,d.width=_}else d.tensorFormat="RGBA",d.height=y,d.width=_;h.drawImage(e,0,0),s=h.getImageData(0,0,_,y).data}else throw new Error("Can not access image data")}else if(r){let f,h;if(t!==void 0&&t.resizedWidth!==void 0&&t.resizedHeight!==void 0?(f=t.resizedHeight,h=t.resizedWidth):(f=e.height,h=e.width),t!==void 0&&(d=t),d.format="RGBA",d.height=f,d.width=h,t!==void 0){let y=l();y.width=h,y.height=f;let _=p(y);if(_!=null)_.putImageData(e,0,0),s=_.getImageData(0,0,h,f).data;else throw new Error("Can not access image data")}else s=e.data}else if(o){if(t===void 0)throw new Error("Please provide image config with format for Imagebitmap");let f=l();f.width=e.width,f.height=e.height;let h=p(f);if(h!=null){let y=e.height,_=e.width;return h.drawImage(e,0,0,_,y),s=h.getImageData(0,0,_,y).data,d.height=y,d.width=_,Ln(s,d)}else throw new Error("Can not access image data")}else{if(a)return new Promise((f,h)=>{let y=l(),_=p(y);if(!e||!_)return h();let b=new Image;b.crossOrigin="Anonymous",b.src=e,b.onload=()=>{y.width=b.width,y.height=b.height,_.drawImage(b,0,0,y.width,y.height);let w=_.getImageData(0,0,y.width,y.height);d.height=y.height,d.width=y.width,f(Ln(w.data,d))}});throw new Error("Input data provided is not supported - aborted tensor creation")}if(s!==void 0)return Ln(s,d);throw new Error("Input data provided is not supported - aborted tensor creation")},Ya=(e,t)=>{let{width:n,height:r,download:o,dispose:a}=t,s=[1,r,n,4];return new De({location:"texture",type:"float32",texture:e,dims:s,download:o,dispose:a})},Xa=(e,t)=>{let{dataType:n,dims:r,download:o,dispose:a}=t;return new De({location:"gpu-buffer",type:n??"float32",gpuBuffer:e,dims:r,download:o,dispose:a})},Ja=(e,t)=>{let{dataType:n,dims:r,download:o,dispose:a}=t;return new De({location:"ml-tensor",type:n??"float32",mlTensor:e,dims:r,download:o,dispose:a})},es=(e,t,n)=>new De({location:"cpu-pinned",type:e,data:t,dims:n??[t.length]})});var It,Qt,rs,ns,os=G(()=>{"use strict";It=new Map([["float32",Float32Array],["uint8",Uint8Array],["int8",Int8Array],["uint16",Uint16Array],["int16",Int16Array],["int32",Int32Array],["bool",Uint8Array],["float64",Float64Array],["uint32",Uint32Array],["int4",Uint8Array],["uint4",Uint8Array]]),Qt=new Map([[Float32Array,"float32"],[Uint8Array,"uint8"],[Int8Array,"int8"],[Uint16Array,"uint16"],[Int16Array,"int16"],[Int32Array,"int32"],[Float64Array,"float64"],[Uint32Array,"uint32"]]),rs=!1,ns=()=>{if(!rs){rs=!0;let e=typeof BigInt64Array<"u"&&BigInt64Array.from,t=typeof BigUint64Array<"u"&&BigUint64Array.from,n=globalThis.Float16Array,r=typeof n<"u"&&n.from;e&&(It.set("int64",BigInt64Array),Qt.set(BigInt64Array,"int64")),t&&(It.set("uint64",BigUint64Array),Qt.set(BigUint64Array,"uint64")),r?(It.set("float16",n),Qt.set(n,"float16")):It.set("float16",Uint16Array)}}});var is,as,ss=G(()=>{"use strict";wr();is=e=>{let t=1;for(let n=0;n{switch(e.location){case"cpu":return new De(e.type,e.data,t);case"cpu-pinned":return new De({location:"cpu-pinned",data:e.data,type:e.type,dims:t});case"texture":return new De({location:"texture",texture:e.texture,type:e.type,dims:t});case"gpu-buffer":return new De({location:"gpu-buffer",gpuBuffer:e.gpuBuffer,type:e.type,dims:t});case"ml-tensor":return new De({location:"ml-tensor",mlTensor:e.mlTensor,type:e.type,dims:t});default:throw new Error(`tensorReshape: tensor location ${e.location} is not supported`)}}});var De,wr=G(()=>{"use strict";Za();ts();os();ss();De=class{constructor(t,n,r){ns();let o,a;if(typeof t=="object"&&"location"in t)switch(this.dataLocation=t.location,o=t.type,a=t.dims,t.location){case"cpu-pinned":{let d=It.get(o);if(!d)throw new TypeError(`unsupported type "${o}" to create tensor from pinned buffer`);if(!(t.data instanceof d))throw new TypeError(`buffer should be of type ${d.name}`);this.cpuData=t.data;break}case"texture":{if(o!=="float32")throw new TypeError(`unsupported type "${o}" to create tensor from texture`);this.gpuTextureData=t.texture,this.downloader=t.download,this.disposer=t.dispose;break}case"gpu-buffer":{if(o!=="float32"&&o!=="float16"&&o!=="int32"&&o!=="int64"&&o!=="uint32"&&o!=="uint8"&&o!=="bool"&&o!=="uint4"&&o!=="int4")throw new TypeError(`unsupported type "${o}" to create tensor from gpu buffer`);this.gpuBufferData=t.gpuBuffer,this.downloader=t.download,this.disposer=t.dispose;break}case"ml-tensor":{if(o!=="float32"&&o!=="float16"&&o!=="int32"&&o!=="int64"&&o!=="uint32"&&o!=="uint64"&&o!=="int8"&&o!=="uint8"&&o!=="bool"&&o!=="uint4"&&o!=="int4")throw new TypeError(`unsupported type "${o}" to create tensor from MLTensor`);this.mlTensorData=t.mlTensor,this.downloader=t.download,this.disposer=t.dispose;break}default:throw new Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let d,l;if(typeof t=="string")if(o=t,l=r,t==="string"){if(!Array.isArray(n))throw new TypeError("A string tensor's data must be a string array.");d=n}else{let p=It.get(t);if(p===void 0)throw new TypeError(`Unsupported tensor type: ${t}.`);if(Array.isArray(n)){if(t==="float16"&&p===Uint16Array||t==="uint4"||t==="int4")throw new TypeError(`Creating a ${t} tensor from number array is not supported. Please use ${p.name} as data.`);t==="uint64"||t==="int64"?d=p.from(n,BigInt):d=p.from(n)}else if(n instanceof p)d=n;else if(n instanceof Uint8ClampedArray)if(t==="uint8")d=Uint8Array.from(n);else throw new TypeError("A Uint8ClampedArray tensor's data must be type of uint8");else if(t==="float16"&&n instanceof Uint16Array&&p!==Uint16Array)d=new globalThis.Float16Array(n.buffer,n.byteOffset,n.length);else throw new TypeError(`A ${o} tensor's data must be type of ${p}`)}else if(l=n,Array.isArray(t)){if(t.length===0)throw new TypeError("Tensor type cannot be inferred from an empty array.");let p=typeof t[0];if(p==="string")o="string",d=t;else if(p==="boolean")o="bool",d=Uint8Array.from(t);else throw new TypeError(`Invalid element type of data array: ${p}.`)}else if(t instanceof Uint8ClampedArray)o="uint8",d=Uint8Array.from(t);else{let p=Qt.get(t.constructor);if(p===void 0)throw new TypeError(`Unsupported type for tensor data: ${t.constructor}.`);o=p,d=t}if(l===void 0)l=[d.length];else if(!Array.isArray(l))throw new TypeError("A tensor's dims must be a number array");a=l,this.cpuData=d,this.dataLocation="cpu"}let s=is(a);if(this.cpuData&&s!==this.cpuData.length&&!((o==="uint4"||o==="int4")&&Math.ceil(s/2)===this.cpuData.length))throw new Error(`Tensor's size(${s}) does not match data length(${this.cpuData.length}).`);this.type=o,this.dims=a,this.size=s}static async fromImage(t,n){return Qa(t,n)}static fromTexture(t,n){return Ya(t,n)}static fromGpuBuffer(t,n){return Xa(t,n)}static fromMLTensor(t,n){return Ja(t,n)}static fromPinnedBuffer(t,n,r){return es(t,n,r)}toDataURL(t){return Ka(this,t)}toImageData(t){return ja(this,t)}get data(){if(this.ensureValid(),!this.cpuData)throw new Error("The data is not on CPU. Use `getData()` to download GPU data to CPU, or use `texture` or `gpuBuffer` property to access the GPU data directly.");return this.cpuData}get location(){return this.dataLocation}get texture(){if(this.ensureValid(),!this.gpuTextureData)throw new Error("The data is not stored as a WebGL texture.");return this.gpuTextureData}get gpuBuffer(){if(this.ensureValid(),!this.gpuBufferData)throw new Error("The data is not stored as a WebGPU buffer.");return this.gpuBufferData}get mlTensor(){if(this.ensureValid(),!this.mlTensorData)throw new Error("The data is not stored as a WebNN MLTensor.");return this.mlTensorData}async getData(t){switch(this.ensureValid(),this.dataLocation){case"cpu":case"cpu-pinned":return this.data;case"texture":case"gpu-buffer":case"ml-tensor":{if(!this.downloader)throw new Error("The current tensor is not created with a specified data downloader.");if(this.isDownloading)throw new Error("The current tensor is being downloaded.");try{this.isDownloading=!0;let n=await this.downloader();return this.downloader=void 0,this.dataLocation="cpu",this.cpuData=n,t&&this.disposer&&(this.disposer(),this.disposer=void 0),n}finally{this.isDownloading=!1}}default:throw new Error(`cannot get data from location: ${this.dataLocation}`)}}dispose(){if(this.isDownloading)throw new Error("The current tensor is being downloaded.");this.disposer&&(this.disposer(),this.disposer=void 0),this.cpuData=void 0,this.gpuTextureData=void 0,this.gpuBufferData=void 0,this.mlTensorData=void 0,this.downloader=void 0,this.isDownloading=void 0,this.dataLocation="none"}ensureValid(){if(this.dataLocation==="none")throw new Error("The tensor is disposed.")}reshape(t){if(this.ensureValid(),this.downloader||this.disposer)throw new Error("Cannot reshape a tensor that owns GPU resource.");return as(this,t)}}});var qe,Gn=G(()=>{"use strict";wr();qe=De});var vr,us,Ne,Be,Hn=G(()=>{"use strict";Wn();vr=(e,t)=>{(typeof Ue.trace>"u"?!Ue.wasm.trace:!Ue.trace)||console.timeStamp(`${e}::ORT::${t}`)},us=(e,t)=>{let n=new Error().stack?.split(/\r\n|\r|\n/g)||[],r=!1;for(let o=0;o{(typeof Ue.trace>"u"?!Ue.wasm.trace:!Ue.trace)||us("BEGIN",e)},Be=e=>{(typeof Ue.trace>"u"?!Ue.wasm.trace:!Ue.trace)||us("END",e)}});var $r,ds=G(()=>{"use strict";Vn();Gn();Hn();$r=class e{constructor(t){this.handler=t}async run(t,n,r){Ne();let o={},a={};if(typeof t!="object"||t===null||t instanceof qe||Array.isArray(t))throw new TypeError("'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.");let s=!0;if(typeof n=="object"){if(n===null)throw new TypeError("Unexpected argument[1]: cannot be null.");if(n instanceof qe)throw new TypeError("'fetches' cannot be a Tensor");if(Array.isArray(n)){if(n.length===0)throw new TypeError("'fetches' cannot be an empty array.");s=!1;for(let p of n){if(typeof p!="string")throw new TypeError("'fetches' must be a string array or an object.");if(this.outputNames.indexOf(p)===-1)throw new RangeError(`'fetches' contains invalid output name: ${p}.`);o[p]=null}if(typeof r=="object"&&r!==null)a=r;else if(typeof r<"u")throw new TypeError("'options' must be an object.")}else{let p=!1,f=Object.getOwnPropertyNames(n);for(let h of this.outputNames)if(f.indexOf(h)!==-1){let y=n[h];(y===null||y instanceof qe)&&(p=!0,s=!1,o[h]=y)}if(p){if(typeof r=="object"&&r!==null)a=r;else if(typeof r<"u")throw new TypeError("'options' must be an object.")}else a=n}}else if(typeof n<"u")throw new TypeError("Unexpected argument[1]: must be 'fetches' or 'options'.");for(let p of this.inputNames)if(typeof t[p]>"u")throw new Error(`input '${p}' is missing in 'feeds'.`);if(s)for(let p of this.outputNames)o[p]=null;let d=await this.handler.run(t,o,a),l={};for(let p in d)if(Object.hasOwnProperty.call(d,p)){let f=d[p];f instanceof qe?l[p]=f:l[p]=new qe(f.type,f.data,f.dims)}return Be(),l}async release(){return this.handler.dispose()}static async create(t,n,r,o){Ne();let a,s={};if(typeof t=="string"){if(a=t,typeof n=="object"&&n!==null)s=n;else if(typeof n<"u")throw new TypeError("'options' must be an object.")}else if(t instanceof Uint8Array){if(a=t,typeof n=="object"&&n!==null)s=n;else if(typeof n<"u")throw new TypeError("'options' must be an object.")}else if(t instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&t instanceof SharedArrayBuffer){let f=t,h=0,y=t.byteLength;if(typeof n=="object"&&n!==null)s=n;else if(typeof n=="number"){if(h=n,!Number.isSafeInteger(h))throw new RangeError("'byteOffset' must be an integer.");if(h<0||h>=f.byteLength)throw new RangeError(`'byteOffset' is out of range [0, ${f.byteLength}).`);if(y=t.byteLength-h,typeof r=="number"){if(y=r,!Number.isSafeInteger(y))throw new RangeError("'byteLength' must be an integer.");if(y<=0||h+y>f.byteLength)throw new RangeError(`'byteLength' is out of range (0, ${f.byteLength-h}].`);if(typeof o=="object"&&o!==null)s=o;else if(typeof o<"u")throw new TypeError("'options' must be an object.")}else if(typeof r<"u")throw new TypeError("'byteLength' must be a number.")}else if(typeof n<"u")throw new TypeError("'options' must be an object.");a=new Uint8Array(f,h,y)}else throw new TypeError("Unexpected argument[0]: must be 'path' or 'buffer'.");let[d,l]=await Wa(s),p=await d.createInferenceSessionHandler(a,l);return Be(),new e(p)}startProfiling(){this.handler.startProfiling()}endProfiling(){this.handler.endProfiling()}get inputNames(){return this.handler.inputNames}get outputNames(){return this.handler.outputNames}}});var Of,ls=G(()=>{"use strict";ds();Of=$r});var cs=G(()=>{"use strict"});var ps=G(()=>{"use strict"});var ms=G(()=>{"use strict"});var fs=G(()=>{"use strict"});var Fn={};Zt(Fn,{InferenceSession:()=>Of,TRACE:()=>vr,TRACE_FUNC_BEGIN:()=>Ne,TRACE_FUNC_END:()=>Be,Tensor:()=>qe,env:()=>we,registerBackend:()=>Ct});var Ge=G(()=>{"use strict";La();qa();ls();Gn();cs();ps();Hn();ms();fs()});var xr=G(()=>{"use strict"});var bs={};Zt(bs,{default:()=>Df});var gs,ys,Df,_s=G(()=>{"use strict";qn();bt();Sr();gs="ort-wasm-proxy-worker",ys=globalThis.self?.name===gs;ys&&(self.onmessage=e=>{let{type:t,in:n}=e.data;try{switch(t){case"init-wasm":Tr(n.wasm).then(()=>{Cr(n).then(()=>{postMessage({type:t})},r=>{postMessage({type:t,err:r})})},r=>{postMessage({type:t,err:r})});break;case"init-ep":{let{epName:r,env:o}=n;Ir(o,r).then(()=>{postMessage({type:t})},a=>{postMessage({type:t,err:a})});break}case"copy-from":{let{buffer:r}=n,o=Yt(r);postMessage({type:t,out:o});break}case"create":{let{model:r,options:o}=n;Ar(r,o).then(a=>{postMessage({type:t,out:a})},a=>{postMessage({type:t,err:a})});break}case"release":kr(n),postMessage({type:t});break;case"run":{let{sessionId:r,inputIndices:o,inputs:a,outputIndices:s,options:d}=n;Er(r,o,a,s,new Array(s.length).fill(null),d).then(l=>{l.some(p=>p[3]!=="cpu")?postMessage({type:t,err:"Proxy does not support non-cpu tensor location."}):postMessage({type:t,out:l},zr([...a,...l]))},l=>{postMessage({type:t,err:l})});break}case"end-profiling":Pr(n),postMessage({type:t});break;default:}}catch(r){postMessage({type:t,err:r})}});Df=ys?null:e=>new Worker(e??Ve,{type:"module",name:gs})});var vs={};Zt(vs,{default:()=>Bf});var Kn,ws,Bf,Mf,$s=G(()=>{"use strict";ws=(Kn=import.meta.url,async function(e={}){var t,n,r=e,o=new Promise((i,u)=>{t=i,n=u}),a=typeof window=="object",s=typeof WorkerGlobalScope<"u",d=s&&self.name?.startsWith("em-pthread");r.mountExternalData=(i,u)=>{i.startsWith("./")&&(i=i.substring(2)),(r.Bd||(r.Bd=new Map)).set(i,u)},r.unmountExternalData=()=>{delete r.Bd};var l=globalThis.SharedArrayBuffer??new WebAssembly.Memory({initial:0,maximum:0,shared:!0}).buffer.constructor;let p=()=>{let i=(c,m,g)=>(...x)=>{let I=Je,z=m?.();x=c(...x);let B=m?.();return z!==B&&(c=B,g(z),m=g=null),Je!=I?new Promise((L,q)=>{En={resolve:L,reject:q}}):x},u=c=>async(...m)=>{try{if(r.Cd)throw Error("Session already started");let g=r.Cd={be:m[0],errors:[]},x=await c(...m);if(r.Cd!==g)throw Error("Session mismatch");r.Dd?.flush();let I=g.errors;if(0B),0r._OrtCreateSession,c=>r._OrtCreateSession=c),r._OrtRun=u(i(r._OrtRun,()=>r._OrtRun,c=>r._OrtRun=c)),r._OrtRunWithBinding=u(i(r._OrtRunWithBinding,()=>r._OrtRunWithBinding,c=>r._OrtRunWithBinding=c)),r._OrtBindInput=i(r._OrtBindInput,()=>r._OrtBindInput,c=>r._OrtBindInput=c),p=void 0};r.jsepInit=(i,u)=>{if(p?.(),i==="webgpu"){[r.Dd,r.Rd,r.Vd,r.Hd,r.Ud,r.hc,r.Wd,r.Zd,r.Sd,r.Td,r.Xd]=u;let c=r.Dd;r.jsepRegisterBuffer=(m,g,x,I)=>c.registerBuffer(m,g,x,I),r.jsepGetBuffer=m=>c.getBuffer(m),r.jsepCreateDownloader=(m,g,x)=>c.createDownloader(m,g,x),r.jsepOnCreateSession=m=>{c.onCreateSession(m)},r.jsepOnReleaseSession=m=>{c.onReleaseSession(m)},r.jsepOnRunStart=m=>c.onRunStart(m),r.$d=(m,g)=>{c.upload(m,g)}}else if(i==="webnn"){[r.Dd,r.Yd,r.Id,r.jsepEnsureTensor,r.Jd,r.jsepDownloadTensor]=u,r.jsepReleaseTensorId=r.Id,r.jsepUploadTensor=r.Jd;let c=r.Dd;r.jsepOnRunStart=m=>c.onRunStart(m),r.jsepOnRunEnd=c.onRunEnd.bind(c),r.jsepRegisterMLContext=(m,g)=>{c.registerMLContext(m,g)},r.jsepOnReleaseSession=m=>{c.onReleaseSession(m)},r.jsepCreateMLTensorDownloader=(m,g)=>c.createMLTensorDownloader(m,g),r.jsepRegisterMLTensor=(m,g,x,I)=>c.registerMLTensor(m,g,x,I),r.jsepCreateMLContext=m=>c.createMLContext(m),r.jsepRegisterMLConstant=(m,g,x,I,z)=>c.registerMLConstant(m,g,x,I,z,r.Bd),r.jsepRegisterGraphInput=c.registerGraphInput.bind(c),r.jsepIsGraphInput=c.isGraphInput.bind(c),r.jsepCreateTemporaryTensor=c.createTemporaryTensor.bind(c)}};var f,h,y=Object.assign({},r),_=(i,u)=>{throw u},b="";(a||s)&&(s?b=self.location.href:typeof document<"u"&&document.currentScript&&(b=document.currentScript.src),Kn&&(b=Kn),b=b.startsWith("blob:")?"":b.slice(0,b.replace(/[?#].*/,"").lastIndexOf("/")+1),s&&(h=i=>{var u=new XMLHttpRequest;return u.open("GET",i,!1),u.responseType="arraybuffer",u.send(null),new Uint8Array(u.response)}),f=async i=>{if(le(i))return new Promise((c,m)=>{var g=new XMLHttpRequest;g.open("GET",i,!0),g.responseType="arraybuffer",g.onload=()=>{g.status==200||g.status==0&&g.response?c(g.response):m(g.status)},g.onerror=m,g.send(null)});var u=await fetch(i,{credentials:"same-origin"});if(u.ok)return u.arrayBuffer();throw Error(u.status+" : "+u.url)});var w=console.log.bind(console),S=console.error.bind(console),$=w,v=S;Object.assign(r,y),y=null;var T,C,A,k,O,M,V,F,j,ne,W,J,ve,Q=r.wasmBinary,ee=!1,le=i=>i.startsWith("file://");function Z(){return T.buffer!=k.buffer&&be(),k}function pe(){return T.buffer!=k.buffer&&be(),O}function ke(){return T.buffer!=k.buffer&&be(),M}function Se(){return T.buffer!=k.buffer&&be(),V}function D(){return T.buffer!=k.buffer&&be(),F}function R(){return T.buffer!=k.buffer&&be(),j}function Y(){return T.buffer!=k.buffer&&be(),ne}function fe(){return T.buffer!=k.buffer&&be(),ve}if(d){let i=function(u){try{var c=u.data,m=c.yd;if(m==="load"){let g=[];self.onmessage=x=>g.push(x),self.startWorker=()=>{postMessage({yd:"loaded"});for(let x of g)i(x);self.onmessage=i};for(let x of c.Od)r[x]&&!r[x].proxy||(r[x]=(...I)=>{postMessage({yd:"callHandler",Nd:x,args:I})},x=="print"&&($=r[x]),x=="printErr"&&(v=r[x]));T=c.he,be(),Fe(c.ie)}else if(m==="run"){cp(c.xd),Dn(c.xd,0,0,1,0,0),Lo(),An(c.xd),xe||(Mi(),xe=!0);try{pp(c.de,c.Fd)}catch(g){if(g!="unwind")throw g}}else c.target!=="setimmediate"&&(m==="checkMailbox"?xe&&ur():m&&(v(`worker: received unknown command ${m}`),v(c)))}catch(g){throw Ri(),g}};var ub=i,Fe,xe=!1;v=function(...u){u=u.join(" "),console.error(u)},self.alert=function(...u){postMessage({yd:"alert",text:u.join(" "),fe:gr()})},self.onunhandledrejection=u=>{throw u.reason||u},self.onmessage=i}function be(){var i=T.buffer;r.HEAP8=k=new Int8Array(i),r.HEAP16=M=new Int16Array(i),r.HEAPU8=O=new Uint8Array(i),r.HEAPU16=V=new Uint16Array(i),r.HEAP32=F=new Int32Array(i),r.HEAPU32=j=new Uint32Array(i),r.HEAPF32=ne=new Float32Array(i),r.HEAPF64=ve=new Float64Array(i),r.HEAP64=W=new BigInt64Array(i),r.HEAPU64=J=new BigUint64Array(i)}function Ye(){d?startWorker(r):U.Bb()}d||(T=new WebAssembly.Memory({initial:256,maximum:65536,shared:!0}),be());var Gt,xt=0,Ht=null;function Bo(){if(--xt==0&&Ht){var i=Ht;Ht=null,i()}}function ut(i){throw v(i="Aborted("+i+")"),ee=!0,i=new WebAssembly.RuntimeError(i+". Build with -sASSERTIONS for more info."),n(i),i}function Mo(){return{a:{Ta:lp,Va:dp,W:mp,la:fp,b:gp,u:yp,R:bp,Za:_p,d:wp,pb:qo,g:hp,T:Zo,Ga:Qo,lb:Xo,nb:Jo,Ha:ei,Ea:ti,wb:ri,Da:ni,pa:oi,mb:ii,jb:ai,Fa:si,kb:ui,Ma:vp,za:xp,eb:Sp,cb:Cp,ya:Ap,V:kp,N:Ep,db:Pp,ma:Up,fb:Np,zb:Vp,hb:Wp,qb:Lp,ab:Gp,Aa:Hp,yb:An,Ja:Fp,S:qp,Wa:Kp,$:Qp,G:Yp,E:Jp,m:Tn,H:em,B:nm,X:om,J:im,v:am,O:sm,D:um,t:dm,A:lm,z:cm,w:pm,r:mm,tb:fm,ub:hm,vb:gm,rb:$i,sb:xi,bb:Si,Oa:bm,La:vm,y:$m,ja:xm,Ba:Sm,Ka:_m,qa:Tm,Ia:Cm,ib:Im,U:ym,fa:Am,Sa:km,gb:Em,Qa:Pm,Pa:zm,Ab:Ai,Ca:ki,ob:_n,aa:Ei,oa:Pi,xb:zi,na:Oi,$a:af,ia:_f,sa:Sf,ga:nf,da:pf,ua:$f,p:tf,e:Nm,c:Rm,ea:lf,f:Vm,n:Lm,k:Ym,Y:Hm,ka:Xm,j:rf,wa:df,Ra:If,ca:yf,Ua:Cf,P:cf,K:qm,_:gf,Q:of,Z:wf,x:Fm,l:Um,va:hf,i:Mm,h:Gm,ra:Tf,ta:xf,o:Wm,q:Km,s:Zm,I:Qm,C:ef,L:Jm,xa:uf,_a:sf,F:bf,Ya:mf,ba:vf,M:jm,Xa:ff,ha:Dm,a:T,Na:bn}}}var hn={1319426:()=>typeof wasmOffsetConverter<"u",1319483:(i,u,c,m,g)=>{if(r===void 0||!r.Bd)return 1;if((i=Ae(Number(i>>>0))).startsWith("./")&&(i=i.substring(2)),!(i=r.Bd.get(i)))return 2;if(u=Number(u>>>0),c=Number(c>>>0),m=Number(m>>>0),u+c>i.byteLength)return 3;try{let x=i.subarray(u,u+c);switch(g){case 0:pe().set(x,m>>>0);break;case 1:r.$d(m,x);break;default:return 4}return 0}catch{return 4}},1320198:(i,u,c)=>{r.Jd(i,pe().subarray(u>>>0,u+c>>>0))},1320261:()=>r.Yd(),1320302:i=>{r.Id(i)},1320338:()=>{r.Sd()},1320369:()=>{r.Td()},1320398:()=>{r.Xd()},1320423:i=>r.Rd(i),1320456:i=>r.Vd(i),1320488:(i,u,c)=>{r.Hd(Number(i),Number(u),Number(c),!0)},1320551:(i,u,c)=>{r.Hd(Number(i),Number(u),Number(c))},1320608:i=>{r.hc("Abs",i,void 0)},1320659:i=>{r.hc("Neg",i,void 0)},1320710:i=>{r.hc("Floor",i,void 0)},1320763:i=>{r.hc("Ceil",i,void 0)},1320815:i=>{r.hc("Reciprocal",i,void 0)},1320873:i=>{r.hc("Sqrt",i,void 0)},1320925:i=>{r.hc("Exp",i,void 0)},1320976:i=>{r.hc("Erf",i,void 0)},1321027:i=>{r.hc("Sigmoid",i,void 0)},1321082:(i,u,c)=>{r.hc("HardSigmoid",i,{alpha:u,beta:c})},1321161:i=>{r.hc("Log",i,void 0)},1321212:i=>{r.hc("Sin",i,void 0)},1321263:i=>{r.hc("Cos",i,void 0)},1321314:i=>{r.hc("Tan",i,void 0)},1321365:i=>{r.hc("Asin",i,void 0)},1321417:i=>{r.hc("Acos",i,void 0)},1321469:i=>{r.hc("Atan",i,void 0)},1321521:i=>{r.hc("Sinh",i,void 0)},1321573:i=>{r.hc("Cosh",i,void 0)},1321625:i=>{r.hc("Asinh",i,void 0)},1321678:i=>{r.hc("Acosh",i,void 0)},1321731:i=>{r.hc("Atanh",i,void 0)},1321784:i=>{r.hc("Tanh",i,void 0)},1321836:i=>{r.hc("Not",i,void 0)},1321887:(i,u,c)=>{r.hc("Clip",i,{min:u,max:c})},1321956:i=>{r.hc("Clip",i,void 0)},1322008:(i,u)=>{r.hc("Elu",i,{alpha:u})},1322066:i=>{r.hc("Gelu",i,void 0)},1322118:i=>{r.hc("Relu",i,void 0)},1322170:(i,u)=>{r.hc("LeakyRelu",i,{alpha:u})},1322234:(i,u)=>{r.hc("ThresholdedRelu",i,{alpha:u})},1322304:(i,u)=>{r.hc("Cast",i,{to:u})},1322362:i=>{r.hc("Add",i,void 0)},1322413:i=>{r.hc("Sub",i,void 0)},1322464:i=>{r.hc("Mul",i,void 0)},1322515:i=>{r.hc("Div",i,void 0)},1322566:i=>{r.hc("Pow",i,void 0)},1322617:i=>{r.hc("Equal",i,void 0)},1322670:i=>{r.hc("Greater",i,void 0)},1322725:i=>{r.hc("GreaterOrEqual",i,void 0)},1322787:i=>{r.hc("Less",i,void 0)},1322839:i=>{r.hc("LessOrEqual",i,void 0)},1322898:(i,u,c,m,g)=>{r.hc("ReduceMean",i,{keepDims:!!u,noopWithEmptyAxes:!!c,axes:m?Array.from(D().subarray(Number(m)>>>0,Number(g)>>>0)):[]})},1323073:(i,u,c,m,g)=>{r.hc("ReduceMax",i,{keepDims:!!u,noopWithEmptyAxes:!!c,axes:m?Array.from(D().subarray(Number(m)>>>0,Number(g)>>>0)):[]})},1323247:(i,u,c,m,g)=>{r.hc("ReduceMin",i,{keepDims:!!u,noopWithEmptyAxes:!!c,axes:m?Array.from(D().subarray(Number(m)>>>0,Number(g)>>>0)):[]})},1323421:(i,u,c,m,g)=>{r.hc("ReduceProd",i,{keepDims:!!u,noopWithEmptyAxes:!!c,axes:m?Array.from(D().subarray(Number(m)>>>0,Number(g)>>>0)):[]})},1323596:(i,u,c,m,g)=>{r.hc("ReduceSum",i,{keepDims:!!u,noopWithEmptyAxes:!!c,axes:m?Array.from(D().subarray(Number(m)>>>0,Number(g)>>>0)):[]})},1323770:(i,u,c,m,g)=>{r.hc("ReduceL1",i,{keepDims:!!u,noopWithEmptyAxes:!!c,axes:m?Array.from(D().subarray(Number(m)>>>0,Number(g)>>>0)):[]})},1323943:(i,u,c,m,g)=>{r.hc("ReduceL2",i,{keepDims:!!u,noopWithEmptyAxes:!!c,axes:m?Array.from(D().subarray(Number(m)>>>0,Number(g)>>>0)):[]})},1324116:(i,u,c,m,g)=>{r.hc("ReduceLogSum",i,{keepDims:!!u,noopWithEmptyAxes:!!c,axes:m?Array.from(D().subarray(Number(m)>>>0,Number(g)>>>0)):[]})},1324293:(i,u,c,m,g)=>{r.hc("ReduceSumSquare",i,{keepDims:!!u,noopWithEmptyAxes:!!c,axes:m?Array.from(D().subarray(Number(m)>>>0,Number(g)>>>0)):[]})},1324473:(i,u,c,m,g)=>{r.hc("ReduceLogSumExp",i,{keepDims:!!u,noopWithEmptyAxes:!!c,axes:m?Array.from(D().subarray(Number(m)>>>0,Number(g)>>>0)):[]})},1324653:i=>{r.hc("Where",i,void 0)},1324706:(i,u,c)=>{r.hc("Transpose",i,{perm:u?Array.from(D().subarray(Number(u)>>>0,Number(c)>>>0)):[]})},1324830:(i,u,c,m)=>{r.hc("DepthToSpace",i,{blocksize:u,mode:Ae(c),format:m?"NHWC":"NCHW"})},1324963:(i,u,c,m)=>{r.hc("DepthToSpace",i,{blocksize:u,mode:Ae(c),format:m?"NHWC":"NCHW"})},1325096:(i,u,c,m,g,x,I,z,B,L,q,X,ue,$e,Le)=>{r.hc("ConvTranspose",i,{format:B?"NHWC":"NCHW",autoPad:u,dilations:[c],group:m,kernelShape:[g],pads:[x,I],strides:[z],wIsConst:()=>!!Z()[L>>>0],outputPadding:q?Array.from(D().subarray(Number(q)>>>0,Number(X)>>>0)):[],outputShape:ue?Array.from(D().subarray(Number(ue)>>>0,Number($e)>>>0)):[],activation:Ae(Le)})},1325529:(i,u,c,m,g,x,I,z,B,L,q,X,ue,$e)=>{r.hc("ConvTranspose",i,{format:z?"NHWC":"NCHW",autoPad:u,dilations:Array.from(D().subarray(Number(c)>>>0,2+(Number(c)>>>0)>>>0)),group:m,kernelShape:Array.from(D().subarray(Number(g)>>>0,2+(Number(g)>>>0)>>>0)),pads:Array.from(D().subarray(Number(x)>>>0,4+(Number(x)>>>0)>>>0)),strides:Array.from(D().subarray(Number(I)>>>0,2+(Number(I)>>>0)>>>0)),wIsConst:()=>!!Z()[B>>>0],outputPadding:L?Array.from(D().subarray(Number(L)>>>0,Number(q)>>>0)):[],outputShape:X?Array.from(D().subarray(Number(X)>>>0,Number(ue)>>>0)):[],activation:Ae($e)})},1326190:(i,u,c,m,g,x,I,z,B,L,q,X,ue,$e,Le)=>{r.hc("ConvTranspose",i,{format:B?"NHWC":"NCHW",autoPad:u,dilations:[c],group:m,kernelShape:[g],pads:[x,I],strides:[z],wIsConst:()=>!!Z()[L>>>0],outputPadding:q?Array.from(D().subarray(Number(q)>>>0,Number(X)>>>0)):[],outputShape:ue?Array.from(D().subarray(Number(ue)>>>0,Number($e)>>>0)):[],activation:Ae(Le)})},1326623:(i,u,c,m,g,x,I,z,B,L,q,X,ue,$e)=>{r.hc("ConvTranspose",i,{format:z?"NHWC":"NCHW",autoPad:u,dilations:Array.from(D().subarray(Number(c)>>>0,2+(Number(c)>>>0)>>>0)),group:m,kernelShape:Array.from(D().subarray(Number(g)>>>0,2+(Number(g)>>>0)>>>0)),pads:Array.from(D().subarray(Number(x)>>>0,4+(Number(x)>>>0)>>>0)),strides:Array.from(D().subarray(Number(I)>>>0,2+(Number(I)>>>0)>>>0)),wIsConst:()=>!!Z()[B>>>0],outputPadding:L?Array.from(D().subarray(Number(L)>>>0,Number(q)>>>0)):[],outputShape:X?Array.from(D().subarray(Number(X)>>>0,Number(ue)>>>0)):[],activation:Ae($e)})},1327284:(i,u)=>{r.hc("GlobalAveragePool",i,{format:u?"NHWC":"NCHW"})},1327375:(i,u,c,m,g,x,I,z,B,L,q,X,ue,$e)=>{r.hc("AveragePool",i,{format:$e?"NHWC":"NCHW",auto_pad:u,ceil_mode:c,count_include_pad:m,storage_order:g,dilations:x?Array.from(D().subarray(Number(x)>>>0,Number(I)>>>0)):[],kernel_shape:z?Array.from(D().subarray(Number(z)>>>0,Number(B)>>>0)):[],pads:L?Array.from(D().subarray(Number(L)>>>0,Number(q)>>>0)):[],strides:X?Array.from(D().subarray(Number(X)>>>0,Number(ue)>>>0)):[]})},1327854:(i,u)=>{r.hc("GlobalAveragePool",i,{format:u?"NHWC":"NCHW"})},1327945:(i,u,c,m,g,x,I,z,B,L,q,X,ue,$e)=>{r.hc("AveragePool",i,{format:$e?"NHWC":"NCHW",auto_pad:u,ceil_mode:c,count_include_pad:m,storage_order:g,dilations:x?Array.from(D().subarray(Number(x)>>>0,Number(I)>>>0)):[],kernel_shape:z?Array.from(D().subarray(Number(z)>>>0,Number(B)>>>0)):[],pads:L?Array.from(D().subarray(Number(L)>>>0,Number(q)>>>0)):[],strides:X?Array.from(D().subarray(Number(X)>>>0,Number(ue)>>>0)):[]})},1328424:(i,u)=>{r.hc("GlobalMaxPool",i,{format:u?"NHWC":"NCHW"})},1328511:(i,u,c,m,g,x,I,z,B,L,q,X,ue,$e)=>{r.hc("MaxPool",i,{format:$e?"NHWC":"NCHW",auto_pad:u,ceil_mode:c,count_include_pad:m,storage_order:g,dilations:x?Array.from(D().subarray(Number(x)>>>0,Number(I)>>>0)):[],kernel_shape:z?Array.from(D().subarray(Number(z)>>>0,Number(B)>>>0)):[],pads:L?Array.from(D().subarray(Number(L)>>>0,Number(q)>>>0)):[],strides:X?Array.from(D().subarray(Number(X)>>>0,Number(ue)>>>0)):[]})},1328986:(i,u)=>{r.hc("GlobalMaxPool",i,{format:u?"NHWC":"NCHW"})},1329073:(i,u,c,m,g,x,I,z,B,L,q,X,ue,$e)=>{r.hc("MaxPool",i,{format:$e?"NHWC":"NCHW",auto_pad:u,ceil_mode:c,count_include_pad:m,storage_order:g,dilations:x?Array.from(D().subarray(Number(x)>>>0,Number(I)>>>0)):[],kernel_shape:z?Array.from(D().subarray(Number(z)>>>0,Number(B)>>>0)):[],pads:L?Array.from(D().subarray(Number(L)>>>0,Number(q)>>>0)):[],strides:X?Array.from(D().subarray(Number(X)>>>0,Number(ue)>>>0)):[]})},1329548:(i,u,c,m,g)=>{r.hc("Gemm",i,{alpha:u,beta:c,transA:m,transB:g})},1329652:i=>{r.hc("MatMul",i,void 0)},1329706:(i,u,c,m)=>{r.hc("ArgMax",i,{keepDims:!!u,selectLastIndex:!!c,axis:m})},1329814:(i,u,c,m)=>{r.hc("ArgMin",i,{keepDims:!!u,selectLastIndex:!!c,axis:m})},1329922:(i,u)=>{r.hc("Softmax",i,{axis:u})},1329985:(i,u)=>{r.hc("Concat",i,{axis:u})},1330045:(i,u,c,m,g)=>{r.hc("Split",i,{axis:u,numOutputs:c,splitSizes:m?Array.from(D().subarray(Number(m)>>>0,Number(g)>>>0)):[]})},1330201:i=>{r.hc("Expand",i,void 0)},1330255:(i,u)=>{r.hc("Gather",i,{axis:Number(u)})},1330326:(i,u)=>{r.hc("GatherElements",i,{axis:Number(u)})},1330405:(i,u)=>{r.hc("GatherND",i,{batch_dims:Number(u)})},1330484:(i,u,c,m,g,x,I,z,B,L,q)=>{r.hc("Resize",i,{antialias:u,axes:c?Array.from(D().subarray(Number(c)>>>0,Number(m)>>>0)):[],coordinateTransformMode:Ae(g),cubicCoeffA:x,excludeOutside:I,extrapolationValue:z,keepAspectRatioPolicy:Ae(B),mode:Ae(L),nearestMode:Ae(q)})},1330846:(i,u,c,m,g,x,I)=>{r.hc("Slice",i,{starts:u?Array.from(D().subarray(Number(u)>>>0,Number(c)>>>0)):[],ends:m?Array.from(D().subarray(Number(m)>>>0,Number(g)>>>0)):[],axes:x?Array.from(D().subarray(Number(x)>>>0,Number(I)>>>0)):[]})},1331110:i=>{r.hc("Tile",i,void 0)},1331162:(i,u,c)=>{r.hc("InstanceNormalization",i,{epsilon:u,format:c?"NHWC":"NCHW"})},1331276:(i,u,c)=>{r.hc("InstanceNormalization",i,{epsilon:u,format:c?"NHWC":"NCHW"})},1331390:i=>{r.hc("Range",i,void 0)},1331443:(i,u)=>{r.hc("Einsum",i,{equation:Ae(u)})},1331524:(i,u,c,m,g)=>{r.hc("Pad",i,{mode:u,value:c,pads:m?Array.from(D().subarray(Number(m)>>>0,Number(g)>>>0)):[]})},1331667:(i,u,c,m,g,x)=>{r.hc("BatchNormalization",i,{epsilon:u,momentum:c,spatial:!!g,trainingMode:!!m,format:x?"NHWC":"NCHW"})},1331836:(i,u,c,m,g,x)=>{r.hc("BatchNormalization",i,{epsilon:u,momentum:c,spatial:!!g,trainingMode:!!m,format:x?"NHWC":"NCHW"})},1332005:(i,u,c)=>{r.hc("CumSum",i,{exclusive:Number(u),reverse:Number(c)})},1332102:(i,u,c)=>{r.hc("DequantizeLinear",i,{axis:u,blockSize:c})},1332192:(i,u,c,m,g)=>{r.hc("GridSample",i,{align_corners:u,mode:Ae(c),padding_mode:Ae(m),format:g?"NHWC":"NCHW"})},1332362:(i,u,c,m,g)=>{r.hc("GridSample",i,{align_corners:u,mode:Ae(c),padding_mode:Ae(m),format:g?"NHWC":"NCHW"})},1332532:(i,u)=>{r.hc("ScatterND",i,{reduction:Ae(u)})},1332617:(i,u,c,m,g,x,I,z,B)=>{r.hc("Attention",i,{numHeads:u,isUnidirectional:c,maskFilterValue:m,scale:g,doRotary:x,qkvHiddenSizes:I?Array.from(D().subarray(Number(z)>>>0,Number(z)+I>>>0)):[],pastPresentShareBuffer:!!B})},1332889:i=>{r.hc("BiasAdd",i,void 0)},1332944:i=>{r.hc("BiasSplitGelu",i,void 0)},1333005:i=>{r.hc("FastGelu",i,void 0)},1333061:(i,u,c,m,g,x,I,z,B,L,q,X,ue,$e,Le,jt)=>{r.hc("Conv",i,{format:X?"NHWC":"NCHW",auto_pad:u,dilations:c?Array.from(D().subarray(Number(c)>>>0,Number(m)>>>0)):[],group:g,kernel_shape:x?Array.from(D().subarray(Number(x)>>>0,Number(I)>>>0)):[],pads:z?Array.from(D().subarray(Number(z)>>>0,Number(B)>>>0)):[],strides:L?Array.from(D().subarray(Number(L)>>>0,Number(q)>>>0)):[],w_is_const:()=>!!Z()[Number(ue)>>>0],activation:Ae($e),activation_params:Le?Array.from(Y().subarray(Number(Le)>>>0,Number(jt)>>>0)):[]})},1333645:i=>{r.hc("Gelu",i,void 0)},1333697:(i,u,c,m,g,x,I,z,B)=>{r.hc("GroupQueryAttention",i,{numHeads:u,kvNumHeads:c,scale:m,softcap:g,doRotary:x,rotaryInterleaved:I,smoothSoftmax:z,localWindowSize:B})},1333914:(i,u,c,m)=>{r.hc("LayerNormalization",i,{axis:u,epsilon:c,simplified:!!m})},1334025:(i,u,c,m)=>{r.hc("LayerNormalization",i,{axis:u,epsilon:c,simplified:!!m})},1334136:(i,u,c,m,g,x)=>{r.hc("MatMulNBits",i,{k:u,n:c,accuracyLevel:m,bits:g,blockSize:x})},1334263:(i,u,c,m,g,x)=>{r.hc("MultiHeadAttention",i,{numHeads:u,isUnidirectional:c,maskFilterValue:m,scale:g,doRotary:x})},1334422:(i,u)=>{r.hc("QuickGelu",i,{alpha:u})},1334486:(i,u,c,m,g)=>{r.hc("RotaryEmbedding",i,{interleaved:!!u,numHeads:c,rotaryEmbeddingDim:m,scale:g})},1334625:(i,u,c)=>{r.hc("SkipLayerNormalization",i,{epsilon:u,simplified:!!c})},1334727:(i,u,c)=>{r.hc("SkipLayerNormalization",i,{epsilon:u,simplified:!!c})},1334829:(i,u,c,m)=>{r.hc("GatherBlockQuantized",i,{gatherAxis:u,quantizeAxis:c,blockSize:m})},1334950:i=>{r.Wd(i)},1334984:(i,u)=>r.Zd(Number(i),Number(u),r.Cd.be,r.Cd.errors)};function dp(i,u,c){return gi(async()=>{await r.Ud(Number(i),Number(u),Number(c))})}function lp(){return typeof wasmOffsetConverter<"u"}class gn{name="ExitStatus";constructor(u){this.message=`Program terminated with exit(${u})`,this.status=u}}var Ro=i=>{i.terminate(),i.onmessage=()=>{}},yn=[],Uo=i=>{ft.length==0&&(Ho(),Go(ft[0]));var u=ft.pop();if(!u)return 6;Ft.push(u),St[i.xd]=u,u.xd=i.xd;var c={yd:"run",de:i.ce,Fd:i.Fd,xd:i.xd};return u.postMessage(c,i.Ld),0},mt=0,Te=(i,u,...c)=>{for(var m=2*c.length,g=ie(),x=Mn(8*m),I=x>>>3,z=0;z>>0]=B)}return i=Ui(i,0,m,x,u),oe(g),i};function bn(i){if(d)return Te(0,1,i);if(A=i,!(0{if(A=i,d)throw No(i),"unwind";bn(i)},ft=[],Ft=[],Vo=[],St={},Wo=i=>{var u=i.xd;delete St[u],ft.push(i),Ft.splice(Ft.indexOf(i),1),i.xd=0,Ni(u)};function Lo(){Vo.forEach(i=>i())}var Go=i=>new Promise(u=>{i.onmessage=g=>{var x=(g=g.data).yd;if(g.Ed&&g.Ed!=gr()){var I=St[g.Ed];I?I.postMessage(g,g.Ld):v(`Internal error! Worker sent a message "${x}" to target pthread ${g.Ed}, but that thread no longer exists!`)}else x==="checkMailbox"?ur():x==="spawnThread"?Uo(g):x==="cleanupThread"?Wo(St[g.ee]):x==="loaded"?(i.loaded=!0,u(i)):x==="alert"?alert(`Thread ${g.fe}: ${g.text}`):g.target==="setimmediate"?i.postMessage(g):x==="callHandler"?r[g.Nd](...g.args):x&&v(`worker sent an unknown command ${x}`)},i.onerror=g=>{throw v(`worker sent an error! ${g.filename}:${g.lineno}: ${g.message}`),g};var c,m=[];for(c of[])r.propertyIsEnumerable(c)&&m.push(c);i.postMessage({yd:"load",Od:m,he:T,ie:C})});function Ho(){var i=new Worker(import.meta.url.startsWith("file:")?new URL("ort.bundle.min.mjs",import.meta.url):new URL(import.meta.url),{type:"module",workerData:"em-pthread",name:"em-pthread"});ft.push(i)}var cp=i=>{be();var u=R()[i+52>>>2>>>0];i=R()[i+56>>>2>>>0],Li(u,u-i),oe(u)},pp=(i,u)=>{mt=0,i=Rn(i,u),0>>=0);if(Z()[u.wd+12>>>0]==0){var c=1;Z()[u.wd+12>>>0]=c}return c=0,Z()[u.wd+13>>>0]=c,sr.push(u),Hi(i),qi(i)}var Dt=0,fp=()=>{se(0,0);var i=sr.pop();Gi(i.Gd),Dt=0};class wn{constructor(u){this.Gd=u,this.wd=u-24}}function hp(i){throw Dt||=i>>>0,Dt}var vn=i=>{var u=Dt;if(!u)return Kt(0),0;var c=new wn(u);R()[c.wd+16>>>2>>>0]=u;var m=R()[c.wd+4>>>2>>>0];if(!m)return Kt(0),u;for(var g of i){if(g===0||g===m)break;if(Fi(g,m,c.wd+16))return Kt(g),u}return Kt(m),u};function gp(){return vn([])}function yp(i){return vn([i>>>0])}function bp(i,u){return vn([i>>>0,u>>>0])}var _p=()=>{var i=sr.pop();i||ut("no exception to throw");var u=i.Gd;if(Z()[i.wd+13>>>0]==0){sr.push(i);var c=1;Z()[i.wd+13>>>0]=c,c=0,Z()[i.wd+12>>>0]=c}throw Dt=u};function wp(i,u,c){var m=new wn(i>>>=0);throw u>>>=0,c>>>=0,R()[m.wd+16>>>2>>>0]=0,R()[m.wd+4>>>2>>>0]=u,R()[m.wd+8>>>2>>>0]=c,Dt=i}function Fo(i,u,c,m){return d?Te(2,1,i,u,c,m):qo(i,u,c,m)}function qo(i,u,c,m){if(i>>>=0,c>>>=0,m>>>=0,l===void 0)return 6;var g=[];return d&&g.length===0?Fo(i,u>>>=0,c,m):(i={ce:c,xd:i,Fd:m,Ld:g},d?(i.yd="spawnThread",postMessage(i,g),0):Uo(i))}var Ko=typeof TextDecoder<"u"?new TextDecoder:void 0,jo=(i,u=0,c=NaN)=>{var m=(u>>>=0)+c;for(c=u;i[c]&&!(c>=m);)++c;if(16(g=(240&g)==224?(15&g)<<12|x<<6|I:(7&g)<<18|x<<12|I<<6|63&i[u++])?m+=String.fromCharCode(g):(g-=65536,m+=String.fromCharCode(55296|g>>10,56320|1023&g))}}else m+=String.fromCharCode(g)}return m},Ae=(i,u)=>(i>>>=0)?jo(pe(),i,u):"";function Zo(i,u,c){return d?Te(3,1,i,u,c):0}function Qo(i,u){if(d)return Te(4,1,i,u)}var Yo=i=>{for(var u=0,c=0;c=m?u++:2047>=m?u+=2:55296<=m&&57343>=m?(u+=4,++c):u+=3}return u},Bt=(i,u,c)=>{var m=pe();if(u>>>=0,0=I&&(I=65536+((1023&I)<<10)|1023&i.charCodeAt(++x)),127>=I){if(u>=c)break;m[u++>>>0]=I}else{if(2047>=I){if(u+1>=c)break;m[u++>>>0]=192|I>>6}else{if(65535>=I){if(u+2>=c)break;m[u++>>>0]=224|I>>12}else{if(u+3>=c)break;m[u++>>>0]=240|I>>18,m[u++>>>0]=128|I>>12&63}m[u++>>>0]=128|I>>6&63}m[u++>>>0]=128|63&I}}m[u>>>0]=0,i=u-g}else i=0;return i};function Xo(i,u){if(d)return Te(5,1,i,u)}function Jo(i,u,c){if(d)return Te(6,1,i,u,c)}function ei(i,u,c){return d?Te(7,1,i,u,c):0}function ti(i,u){if(d)return Te(8,1,i,u)}function ri(i,u,c){if(d)return Te(9,1,i,u,c)}function ni(i,u,c,m){if(d)return Te(10,1,i,u,c,m)}function oi(i,u,c,m){if(d)return Te(11,1,i,u,c,m)}function ii(i,u,c,m){if(d)return Te(12,1,i,u,c,m)}function ai(i){if(d)return Te(13,1,i)}function si(i,u){if(d)return Te(14,1,i,u)}function ui(i,u,c){if(d)return Te(15,1,i,u,c)}var di,ht,vp=()=>ut(""),Xe=i=>{for(var u="";pe()[i>>>0];)u+=di[pe()[i++>>>0]];return u},$n={},xn={},$p={};function dt(i,u,c={}){return function(m,g,x={}){var I=g.name;if(!m)throw new ht(`type "${I}" must have a positive integer typeid pointer`);if(xn.hasOwnProperty(m)){if(x.Pd)return;throw new ht(`Cannot register type '${I}' twice`)}xn[m]=g,delete $p[m],$n.hasOwnProperty(m)&&(g=$n[m],delete $n[m],g.forEach(z=>z()))}(i,u,c)}var li=(i,u,c)=>{switch(u){case 1:return c?m=>Z()[m>>>0]:m=>pe()[m>>>0];case 2:return c?m=>ke()[m>>>1>>>0]:m=>Se()[m>>>1>>>0];case 4:return c?m=>D()[m>>>2>>>0]:m=>R()[m>>>2>>>0];case 8:return c?m=>W[m>>>3]:m=>J[m>>>3];default:throw new TypeError(`invalid integer width (${u}): ${i}`)}};function xp(i,u,c){c>>>=0,dt(i>>>=0,{name:u=Xe(u>>>0),fromWireType:m=>m,toWireType:function(m,g){if(typeof g!="bigint"&&typeof g!="number")throw g=g===null?"null":(m=typeof g)=="object"||m==="array"||m==="function"?g.toString():""+g,new TypeError(`Cannot convert "${g}" to ${this.name}`);return typeof g=="number"&&(g=BigInt(g)),g},zd:gt,readValueFromPointer:li(u,c,u.indexOf("u")==-1),Ad:null})}var gt=8;function Sp(i,u,c,m){dt(i>>>=0,{name:u=Xe(u>>>0),fromWireType:function(g){return!!g},toWireType:function(g,x){return x?c:m},zd:gt,readValueFromPointer:function(g){return this.fromWireType(pe()[g>>>0])},Ad:null})}var Sn=[],lt=[];function Tn(i){9<(i>>>=0)&&--lt[i+1]==0&&(lt[i]=void 0,Sn.push(i))}var Re=i=>{if(!i)throw new ht("Cannot use deleted val. handle = "+i);return lt[i]},We=i=>{switch(i){case void 0:return 2;case null:return 4;case!0:return 6;case!1:return 8;default:let u=Sn.pop()||lt.length;return lt[u]=i,lt[u+1]=1,u}};function Cn(i){return this.fromWireType(R()[i>>>2>>>0])}var Tp={name:"emscripten::val",fromWireType:i=>{var u=Re(i);return Tn(i),u},toWireType:(i,u)=>We(u),zd:gt,readValueFromPointer:Cn,Ad:null};function Cp(i){return dt(i>>>0,Tp)}var Ip=(i,u)=>{switch(u){case 4:return function(c){return this.fromWireType(Y()[c>>>2>>>0])};case 8:return function(c){return this.fromWireType(fe()[c>>>3>>>0])};default:throw new TypeError(`invalid float width (${u}): ${i}`)}};function Ap(i,u,c){c>>>=0,dt(i>>>=0,{name:u=Xe(u>>>0),fromWireType:m=>m,toWireType:(m,g)=>g,zd:gt,readValueFromPointer:Ip(u,c),Ad:null})}function kp(i,u,c,m,g){if(i>>>=0,c>>>=0,u=Xe(u>>>0),g===-1&&(g=4294967295),g=z=>z,m===0){var x=32-8*c;g=z=>z<>>x}var I=u.includes("unsigned")?function(z,B){return B>>>0}:function(z,B){return B};dt(i,{name:u,fromWireType:g,toWireType:I,zd:gt,readValueFromPointer:li(u,c,m!==0),Ad:null})}function Ep(i,u,c){function m(x){var I=R()[x>>>2>>>0];return x=R()[x+4>>>2>>>0],new g(Z().buffer,x,I)}var g=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array][u];dt(i>>>=0,{name:c=Xe(c>>>0),fromWireType:m,zd:gt,readValueFromPointer:m},{Pd:!0})}function Pp(i,u){dt(i>>>=0,{name:u=Xe(u>>>0),fromWireType:function(c){for(var m,g=R()[c>>>2>>>0],x=c+4,I=x,z=0;z<=g;++z){var B=x+z;z!=g&&pe()[B>>>0]!=0||(I=Ae(I,B-I),m===void 0?m=I:(m+="\0",m+=I),I=B+1)}return et(c),m},toWireType:function(c,m){m instanceof ArrayBuffer&&(m=new Uint8Array(m));var g=typeof m=="string";if(!(g||m instanceof Uint8Array||m instanceof Uint8ClampedArray||m instanceof Int8Array))throw new ht("Cannot pass non-string to std::string");var x=g?Yo(m):m.length,I=yr(4+x+1),z=I+4;if(R()[I>>>2>>>0]=x,g)Bt(m,z,x+1);else if(g)for(g=0;g>>0]=B}else for(g=0;g>>0]=m[g];return c!==null&&c.push(et,I),I},zd:gt,readValueFromPointer:Cn,Ad(c){et(c)}})}var ci=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0,zp=(i,u)=>{for(var c=i>>1,m=c+u/2;!(c>=m)&&Se()[c>>>0];)++c;if(32<(c<<=1)-i&&ci)return ci.decode(pe().slice(i,c));for(c="",m=0;!(m>=u/2);++m){var g=ke()[i+2*m>>>1>>>0];if(g==0)break;c+=String.fromCharCode(g)}return c},Op=(i,u,c)=>{if(c??=2147483647,2>c)return 0;var m=u;c=(c-=2)<2*i.length?c/2:i.length;for(var g=0;g>>1>>>0]=x,u+=2}return ke()[u>>>1>>>0]=0,u-m},Dp=i=>2*i.length,Bp=(i,u)=>{for(var c=0,m="";!(c>=u/4);){var g=D()[i+4*c>>>2>>>0];if(g==0)break;++c,65536<=g?(g-=65536,m+=String.fromCharCode(55296|g>>10,56320|1023&g)):m+=String.fromCharCode(g)}return m},Mp=(i,u,c)=>{if(u>>>=0,c??=2147483647,4>c)return 0;var m=u;c=m+c-4;for(var g=0;g=x&&(x=65536+((1023&x)<<10)|1023&i.charCodeAt(++g)),D()[u>>>2>>>0]=x,(u+=4)+4>c)break}return D()[u>>>2>>>0]=0,u-m},Rp=i=>{for(var u=0,c=0;c=m&&++c,u+=4}return u};function Up(i,u,c){if(i>>>=0,u>>>=0,c=Xe(c>>>=0),u===2)var m=zp,g=Op,x=Dp,I=z=>Se()[z>>>1>>>0];else u===4&&(m=Bp,g=Mp,x=Rp,I=z=>R()[z>>>2>>>0]);dt(i,{name:c,fromWireType:z=>{for(var B,L=R()[z>>>2>>>0],q=z+4,X=0;X<=L;++X){var ue=z+4+X*u;X!=L&&I(ue)!=0||(q=m(q,ue-q),B===void 0?B=q:(B+="\0",B+=q),q=ue+u)}return et(z),B},toWireType:(z,B)=>{if(typeof B!="string")throw new ht(`Cannot pass non-string to C++ string type ${c}`);var L=x(B),q=yr(4+L+u);return R()[q>>>2>>>0]=L/u,g(B,q+4,L+u),z!==null&&z.push(et,q),q},zd:gt,readValueFromPointer:Cn,Ad(z){et(z)}})}function Np(i,u){dt(i>>>=0,{Qd:!0,name:u=Xe(u>>>0),zd:0,fromWireType:()=>{},toWireType:()=>{}})}function Vp(i){Dn(i>>>0,!s,1,!a,131072,!1),Lo()}var In=i=>{if(!ee)try{if(i(),!(0>>=0,typeof Atomics.ge=="function"&&(Atomics.ge(D(),i>>>2,i).value.then(ur),i+=128,Atomics.store(D(),i>>>2,1))}var ur=()=>{var i=gr();i&&(An(i),In(Wi))};function Wp(i,u){(i>>>=0)==u>>>0?setTimeout(ur):d?postMessage({Ed:i,yd:"checkMailbox"}):(i=St[i])&&i.postMessage({yd:"checkMailbox"})}var kn=[];function Lp(i,u,c,m,g){for(u>>>=0,m/=2,kn.length=m,c=g>>>0>>>3,g=0;g>>0];return(u?hn[u]:Bm[i])(...kn)}var Gp=()=>{mt=0};function Hp(i){i>>>=0,d?postMessage({yd:"cleanupThread",ee:i}):Wo(St[i])}function Fp(i){}var dr=(i,u)=>{var c=xn[i];if(c===void 0)throw i=Bi(i),c=Xe(i),et(i),new ht(`${u} has unknown type ${c}`);return c},pi=(i,u,c)=>{var m=[];return i=i.toWireType(m,c),m.length&&(R()[u>>>2>>>0]=We(m)),i};function qp(i,u,c){return u>>>=0,c>>>=0,i=Re(i>>>0),u=dr(u,"emval::as"),pi(u,c,i)}function Kp(i,u){return u>>>=0,i=Re(i>>>0),(u=dr(u,"emval::as")).toWireType(null,i)}var lr=i=>{try{i()}catch(u){ut(u)}},yt=0,Je=null,mi=0,cr=[],fi={},hi={},jp=0,En=null,Zp=[];function gi(i){return function(u){if(!ee){if(yt===0){var c=!1,m=!1;u((g=0)=>{if(!ee&&(mi=g,c=!0,m)){yt=2,lr(()=>Na(Je)),typeof MainLoop<"u"&&MainLoop.Md&&MainLoop.resume(),g=!1;try{var x=function(){var B=D()[Je+8>>>2>>>0];return B=U[hi[B]],--mt,B()}()}catch(B){x=B,g=!0}var I=!1;if(!Je){var z=En;z&&(En=null,(g?z.reject:z.resolve)(x),I=!0)}if(g&&!I)throw x}}),m=!0,c||(yt=1,Je=function(){var g=yr(65548),x=g+12;R()[g>>>2>>>0]=x,R()[g+4>>>2>>>0]=x+65536,x=cr[0];var I=fi[x];return I===void 0&&(I=jp++,fi[x]=I,hi[I]=x),x=I,D()[g+8>>>2>>>0]=x,g}(),typeof MainLoop<"u"&&MainLoop.Md&&MainLoop.pause(),lr(()=>Ra(Je)))}else yt===2?(yt=0,lr(Va),et(Je),Je=null,Zp.forEach(In)):ut(`invalid state: ${yt}`);return mi}}(u=>{i().then(u)})}function Qp(i){return i>>>=0,gi(async()=>{var u=await Re(i);return We(u)})}var pr=[];function Yp(i,u,c,m){return c>>>=0,m>>>=0,(i=pr[i>>>0])(null,u=Re(u>>>0),c,m)}var Xp={},mr=i=>{var u=Xp[i];return u===void 0?Xe(i):u};function Jp(i,u,c,m,g){return c>>>=0,m>>>=0,g>>>=0,(i=pr[i>>>0])(u=Re(u>>>0),u[c=mr(c)],m,g)}var yi=()=>typeof globalThis=="object"?globalThis:Function("return this")();function em(i){return(i>>>=0)==0?We(yi()):(i=mr(i),We(yi()[i]))}var tm=i=>{var u=pr.length;return pr.push(i),u},rm=(i,u)=>{for(var c=Array(i),m=0;m>>2>>>0],"parameter "+m);return c},bi=(i,u)=>Object.defineProperty(u,"name",{value:i});function nm(i,u,c){var m=(u=rm(i,u>>>0)).shift();i--;var g=`return function (obj, func, destructorsRef, args) { +`,x=0,I=[];c===0&&I.push("obj");for(var z=["retType"],B=[m],L=0;Lq.name).join(", ")}) => ${m.name}>`,tm(bi(c,i))}function om(i){return i=mr(i>>>0),We(r[i])}function im(i,u){return u>>>=0,i=Re(i>>>0),u=Re(u),We(i[u])}function am(i){9<(i>>>=0)&&(lt[i+1]+=1)}function sm(){return We([])}function um(i){i=Re(i>>>0);for(var u=Array(i.length),c=0;c>>0))}function lm(){return We({})}function cm(i){for(var u=Re(i>>>=0);u.length;){var c=u.pop();u.pop()(c)}Tn(i)}function pm(i,u,c){u>>>=0,c>>>=0,i=Re(i>>>0),u=Re(u),c=Re(c),i[u]=c}function mm(i,u){return u>>>=0,i=(i=dr(i>>>0,"_emval_take_value")).readValueFromPointer(u),We(i)}function fm(i,u){i=-9007199254740992>i||9007199254740992>>=0,i=new Date(1e3*i),D()[u>>>2>>>0]=i.getUTCSeconds(),D()[u+4>>>2>>>0]=i.getUTCMinutes(),D()[u+8>>>2>>>0]=i.getUTCHours(),D()[u+12>>>2>>>0]=i.getUTCDate(),D()[u+16>>>2>>>0]=i.getUTCMonth(),D()[u+20>>>2>>>0]=i.getUTCFullYear()-1900,D()[u+24>>>2>>>0]=i.getUTCDay(),i=(i.getTime()-Date.UTC(i.getUTCFullYear(),0,1,0,0,0,0))/864e5|0,D()[u+28>>>2>>>0]=i}var _i=i=>i%4==0&&(i%100!=0||i%400==0),wi=[0,31,60,91,121,152,182,213,244,274,305,335],vi=[0,31,59,90,120,151,181,212,243,273,304,334];function hm(i,u){i=-9007199254740992>i||9007199254740992>>=0,i=new Date(1e3*i),D()[u>>>2>>>0]=i.getSeconds(),D()[u+4>>>2>>>0]=i.getMinutes(),D()[u+8>>>2>>>0]=i.getHours(),D()[u+12>>>2>>>0]=i.getDate(),D()[u+16>>>2>>>0]=i.getMonth(),D()[u+20>>>2>>>0]=i.getFullYear()-1900,D()[u+24>>>2>>>0]=i.getDay();var c=(_i(i.getFullYear())?wi:vi)[i.getMonth()]+i.getDate()-1|0;D()[u+28>>>2>>>0]=c,D()[u+36>>>2>>>0]=-60*i.getTimezoneOffset(),c=new Date(i.getFullYear(),6,1).getTimezoneOffset();var m=new Date(i.getFullYear(),0,1).getTimezoneOffset();i=0|(c!=m&&i.getTimezoneOffset()==Math.min(m,c)),D()[u+32>>>2>>>0]=i}function gm(i){i>>>=0;var u=new Date(D()[i+20>>>2>>>0]+1900,D()[i+16>>>2>>>0],D()[i+12>>>2>>>0],D()[i+8>>>2>>>0],D()[i+4>>>2>>>0],D()[i>>>2>>>0],0),c=D()[i+32>>>2>>>0],m=u.getTimezoneOffset(),g=new Date(u.getFullYear(),6,1).getTimezoneOffset(),x=new Date(u.getFullYear(),0,1).getTimezoneOffset(),I=Math.min(x,g);return 0>c?D()[i+32>>>2>>>0]=+(g!=x&&I==m):0>>2>>>0]=u.getDay(),c=(_i(u.getFullYear())?wi:vi)[u.getMonth()]+u.getDate()-1|0,D()[i+28>>>2>>>0]=c,D()[i>>>2>>>0]=u.getSeconds(),D()[i+4>>>2>>>0]=u.getMinutes(),D()[i+8>>>2>>>0]=u.getHours(),D()[i+12>>>2>>>0]=u.getDate(),D()[i+16>>>2>>>0]=u.getMonth(),D()[i+20>>>2>>>0]=u.getYear(),i=u.getTime(),BigInt(isNaN(i)?-1:i/1e3)}function $i(i,u,c,m,g,x,I){return d?Te(16,1,i,u,c,m,g,x,I):-52}function xi(i,u,c,m,g,x){if(d)return Te(17,1,i,u,c,m,g,x)}var qt={},ym=()=>performance.timeOrigin+performance.now();function Si(i,u){if(d)return Te(18,1,i,u);if(qt[i]&&(clearTimeout(qt[i].id),delete qt[i]),!u)return 0;var c=setTimeout(()=>{delete qt[i],In(()=>Vi(i,performance.timeOrigin+performance.now()))},u);return qt[i]={id:c,ke:u},0}function bm(i,u,c,m){i>>>=0,u>>>=0,c>>>=0,m>>>=0;var g=new Date().getFullYear(),x=new Date(g,0,1).getTimezoneOffset();g=new Date(g,6,1).getTimezoneOffset();var I=Math.max(x,g);R()[i>>>2>>>0]=60*I,D()[u>>>2>>>0]=+(x!=g),i=(u=z=>{var B=Math.abs(z);return`UTC${0<=z?"-":"+"}${String(Math.floor(B/60)).padStart(2,"0")}${String(B%60).padStart(2,"0")}`})(x),u=u(g),gDate.now(),wm=1;function vm(i,u,c){if(!(0<=i&&3>=i))return 28;if(i===0)i=Date.now();else{if(!wm)return 52;i=performance.timeOrigin+performance.now()}return W[c>>>0>>>3]=BigInt(Math.round(1e6*i)),0}var Pn=[],Ti=(i,u)=>{Pn.length=0;for(var c;c=pe()[i++>>>0];){var m=c!=105;u+=(m&=c!=112)&&u%8?4:0,Pn.push(c==112?R()[u>>>2>>>0]:c==106?W[u>>>3]:c==105?D()[u>>>2>>>0]:fe()[u>>>3>>>0]),u+=m?8:4}return Pn};function $m(i,u,c){return i>>>=0,u=Ti(u>>>0,c>>>0),hn[i](...u)}function xm(i,u,c){return i>>>=0,u=Ti(u>>>0,c>>>0),hn[i](...u)}var Sm=()=>{};function Tm(i,u){return v(Ae(i>>>0,u>>>0))}var Cm=()=>{throw mt+=1,"unwind"};function Im(){return 4294901760}var Am=()=>navigator.hardwareConcurrency;function km(){return ut("Cannot use emscripten_pc_get_function without -sUSE_OFFSET_CONVERTER"),0}function Em(i){i>>>=0;var u=pe().length;if(i<=u||4294901760=c;c*=2){var m=u*(1+.2/c);m=Math.min(m,i+100663296);e:{m=(Math.min(4294901760,65536*Math.ceil(Math.max(i,m)/65536))-T.buffer.byteLength+65535)/65536|0;try{T.grow(m),be();var g=1;break e}catch{}g=void 0}if(g)return!0}return!1}var fr=()=>(ut("Cannot use convertFrameToPC (needed by __builtin_return_address) without -sUSE_OFFSET_CONVERTER"),0),Mt={},Ci=i=>{i.forEach(u=>{var c=fr();c&&(Mt[c]=u)})};function Pm(){var i=Error().stack.toString().split(` +`);return i[0]=="Error"&&i.shift(),Ci(i),Mt.Kd=fr(),Mt.ae=i,Mt.Kd}function zm(i,u,c){if(i>>>=0,u>>>=0,Mt.Kd==i)var m=Mt.ae;else(m=Error().stack.toString().split(` +`))[0]=="Error"&&m.shift(),Ci(m);for(var g=3;m[g]&&fr()!=i;)++g;for(i=0;i>>2>>>0]=fr();return i}var zn,On={},Ii=()=>{if(!zn){var i,u={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:"./this.program"};for(i in On)On[i]===void 0?delete u[i]:u[i]=On[i];var c=[];for(i in u)c.push(`${i}=${u[i]}`);zn=c}return zn};function Ai(i,u){if(d)return Te(19,1,i,u);i>>>=0,u>>>=0;var c=0;return Ii().forEach((m,g)=>{var x=u+c;for(g=R()[i+4*g>>>2>>>0]=x,x=0;x>>0]=m.charCodeAt(x);Z()[g>>>0]=0,c+=m.length+1}),0}function ki(i,u){if(d)return Te(20,1,i,u);i>>>=0,u>>>=0;var c=Ii();R()[i>>>2>>>0]=c.length;var m=0;return c.forEach(g=>m+=g.length+1),R()[u>>>2>>>0]=m,0}function Ei(i){return d?Te(21,1,i):52}function Pi(i,u,c,m){return d?Te(22,1,i,u,c,m):52}function zi(i,u,c,m){return d?Te(23,1,i,u,c,m):70}var Om=[null,[],[]];function Oi(i,u,c,m){if(d)return Te(24,1,i,u,c,m);u>>>=0,c>>>=0,m>>>=0;for(var g=0,x=0;x>>2>>>0],z=R()[u+4>>>2>>>0];u+=8;for(var B=0;B>>0],q=Om[i];L===0||L===10?((i===1?$:v)(jo(q)),q.length=0):q.push(L)}g+=z}return R()[m>>>2>>>0]=g,0}function Dm(i){return i>>>0}d||function(){for(var i=r.numThreads-1;i--;)Ho();yn.unshift(()=>{xt++,function(u){d?u():Promise.all(ft.map(Go)).then(u)}(()=>Bo())})}();for(var Di=Array(256),hr=0;256>hr;++hr)Di[hr]=String.fromCharCode(hr);di=Di,ht=r.BindingError=class extends Error{constructor(i){super(i),this.name="BindingError"}},r.InternalError=class extends Error{constructor(i){super(i),this.name="InternalError"}},lt.push(0,1,void 0,1,null,1,!0,1,!1,1),r.count_emval_handles=()=>lt.length/2-5-Sn.length;var U,Bm=[bn,No,Fo,Zo,Qo,Xo,Jo,ei,ti,ri,ni,oi,ii,ai,si,ui,$i,xi,Si,Ai,ki,Ei,Pi,zi,Oi];(async function(){function i(m,g){return U=m.exports,U=function(){var x=U,I={};for(let[z,B]of Object.entries(x))I[z]=typeof B=="function"?(...L)=>{cr.push(z);try{return B(...L)}finally{ee||(cr.pop(),Je&&yt===1&&cr.length===0&&(yt=0,mt+=1,lr(Ua),typeof Fibers<"u"&&Fibers.le()))}}:B;return I}(),U=function(){var x=U,I=B=>L=>B(L)>>>0,z=B=>()=>B()>>>0;return(x=Object.assign({},x)).Cb=I(x.Cb),x.fc=z(x.fc),x.ic=I(x.ic),x.vc=I(x.vc),x.wc=z(x.wc),x.Ac=I(x.Ac),x}(),Vo.push(U.jc),C=g,Bo(),U}xt++;var u=Mo();if(r.instantiateWasm)return new Promise(m=>{r.instantiateWasm(u,(g,x)=>{i(g,x),m(g.exports)})});if(d)return new Promise(m=>{Fe=g=>{var x=new WebAssembly.Instance(g,Mo());m(i(x,g))}});Gt??=r.locateFile?r.locateFile?r.locateFile("ort-wasm-simd-threaded.jsep.wasm",b):b+"ort-wasm-simd-threaded.jsep.wasm":new URL("ort-wasm-simd-threaded.jsep.wasm",import.meta.url).href;try{var c=await async function(m){var g=Gt;if(!Q&&typeof WebAssembly.instantiateStreaming=="function"&&!le(g))try{var x=fetch(g,{credentials:"same-origin"});return await WebAssembly.instantiateStreaming(x,m)}catch(I){v(`wasm streaming compile failed: ${I}`),v("falling back to ArrayBuffer instantiation")}return async function(I,z){try{var B=await async function(L){if(!Q)try{var q=await f(L);return new Uint8Array(q)}catch{}if(L==Gt&&Q)L=new Uint8Array(Q);else{if(!h)throw"both async and sync fetching of the wasm failed";L=h(L)}return L}(I);return await WebAssembly.instantiate(B,z)}catch(L){v(`failed to asynchronously prepare wasm: ${L}`),ut(L)}}(g,m)}(u);return i(c.instance,c.module)}catch(m){return n(m),Promise.reject(m)}})();var Bi=i=>(Bi=U.Cb)(i),Mi=()=>(Mi=U.Db)();r._OrtInit=(i,u)=>(r._OrtInit=U.Eb)(i,u),r._OrtGetLastError=(i,u)=>(r._OrtGetLastError=U.Fb)(i,u),r._OrtCreateSessionOptions=(i,u,c,m,g,x,I,z,B,L)=>(r._OrtCreateSessionOptions=U.Gb)(i,u,c,m,g,x,I,z,B,L),r._OrtAppendExecutionProvider=(i,u)=>(r._OrtAppendExecutionProvider=U.Hb)(i,u),r._OrtAddFreeDimensionOverride=(i,u,c)=>(r._OrtAddFreeDimensionOverride=U.Ib)(i,u,c),r._OrtAddSessionConfigEntry=(i,u,c)=>(r._OrtAddSessionConfigEntry=U.Jb)(i,u,c),r._OrtReleaseSessionOptions=i=>(r._OrtReleaseSessionOptions=U.Kb)(i),r._OrtCreateSession=(i,u,c)=>(r._OrtCreateSession=U.Lb)(i,u,c),r._OrtReleaseSession=i=>(r._OrtReleaseSession=U.Mb)(i),r._OrtGetInputOutputCount=(i,u,c)=>(r._OrtGetInputOutputCount=U.Nb)(i,u,c),r._OrtGetInputName=(i,u)=>(r._OrtGetInputName=U.Ob)(i,u),r._OrtGetOutputName=(i,u)=>(r._OrtGetOutputName=U.Pb)(i,u),r._OrtFree=i=>(r._OrtFree=U.Qb)(i),r._OrtCreateTensor=(i,u,c,m,g,x)=>(r._OrtCreateTensor=U.Rb)(i,u,c,m,g,x),r._OrtGetTensorData=(i,u,c,m,g)=>(r._OrtGetTensorData=U.Sb)(i,u,c,m,g),r._OrtReleaseTensor=i=>(r._OrtReleaseTensor=U.Tb)(i),r._OrtCreateRunOptions=(i,u,c,m)=>(r._OrtCreateRunOptions=U.Ub)(i,u,c,m),r._OrtAddRunConfigEntry=(i,u,c)=>(r._OrtAddRunConfigEntry=U.Vb)(i,u,c),r._OrtReleaseRunOptions=i=>(r._OrtReleaseRunOptions=U.Wb)(i),r._OrtCreateBinding=i=>(r._OrtCreateBinding=U.Xb)(i),r._OrtBindInput=(i,u,c)=>(r._OrtBindInput=U.Yb)(i,u,c),r._OrtBindOutput=(i,u,c,m)=>(r._OrtBindOutput=U.Zb)(i,u,c,m),r._OrtClearBoundOutputs=i=>(r._OrtClearBoundOutputs=U._b)(i),r._OrtReleaseBinding=i=>(r._OrtReleaseBinding=U.$b)(i),r._OrtRunWithBinding=(i,u,c,m,g)=>(r._OrtRunWithBinding=U.ac)(i,u,c,m,g),r._OrtRun=(i,u,c,m,g,x,I,z)=>(r._OrtRun=U.bc)(i,u,c,m,g,x,I,z),r._OrtEndProfiling=i=>(r._OrtEndProfiling=U.cc)(i),r._JsepOutput=(i,u,c)=>(r._JsepOutput=U.dc)(i,u,c),r._JsepGetNodeName=i=>(r._JsepGetNodeName=U.ec)(i);var gr=()=>(gr=U.fc)(),et=r._free=i=>(et=r._free=U.gc)(i),yr=r._malloc=i=>(yr=r._malloc=U.ic)(i),Dn=(i,u,c,m,g,x)=>(Dn=U.kc)(i,u,c,m,g,x),Ri=()=>(Ri=U.lc)(),Ui=(i,u,c,m,g)=>(Ui=U.mc)(i,u,c,m,g),Ni=i=>(Ni=U.nc)(i),Bn=i=>(Bn=U.oc)(i),Vi=(i,u)=>(Vi=U.pc)(i,u),Wi=()=>(Wi=U.qc)(),se=(i,u)=>(se=U.rc)(i,u),Kt=i=>(Kt=U.sc)(i),Li=(i,u)=>(Li=U.tc)(i,u),oe=i=>(oe=U.uc)(i),Mn=i=>(Mn=U.vc)(i),ie=()=>(ie=U.wc)(),Gi=i=>(Gi=U.xc)(i),Hi=i=>(Hi=U.yc)(i),Fi=(i,u,c)=>(Fi=U.zc)(i,u,c),qi=i=>(qi=U.Ac)(i),Ki=r.dynCall_iii=(i,u,c)=>(Ki=r.dynCall_iii=U.Bc)(i,u,c),ji=r.dynCall_vi=(i,u)=>(ji=r.dynCall_vi=U.Cc)(i,u),Rn=r.dynCall_ii=(i,u)=>(Rn=r.dynCall_ii=U.Dc)(i,u),Zi=r.dynCall_vii=(i,u,c)=>(Zi=r.dynCall_vii=U.Ec)(i,u,c),Qi=r.dynCall_iiii=(i,u,c,m)=>(Qi=r.dynCall_iiii=U.Fc)(i,u,c,m),Yi=r.dynCall_viii=(i,u,c,m)=>(Yi=r.dynCall_viii=U.Gc)(i,u,c,m),Xi=r.dynCall_iiiii=(i,u,c,m,g)=>(Xi=r.dynCall_iiiii=U.Hc)(i,u,c,m,g),Ji=r.dynCall_viiii=(i,u,c,m,g)=>(Ji=r.dynCall_viiii=U.Ic)(i,u,c,m,g),ea=r.dynCall_viiiiii=(i,u,c,m,g,x,I)=>(ea=r.dynCall_viiiiii=U.Jc)(i,u,c,m,g,x,I),ta=r.dynCall_viiiiiii=(i,u,c,m,g,x,I,z)=>(ta=r.dynCall_viiiiiii=U.Kc)(i,u,c,m,g,x,I,z),ra=r.dynCall_ji=(i,u)=>(ra=r.dynCall_ji=U.Lc)(i,u),na=r.dynCall_v=i=>(na=r.dynCall_v=U.Mc)(i),oa=r.dynCall_viiiii=(i,u,c,m,g,x)=>(oa=r.dynCall_viiiii=U.Nc)(i,u,c,m,g,x),ia=r.dynCall_i=i=>(ia=r.dynCall_i=U.Oc)(i),aa=r.dynCall_fii=(i,u,c)=>(aa=r.dynCall_fii=U.Pc)(i,u,c),sa=r.dynCall_viiiiiiii=(i,u,c,m,g,x,I,z,B)=>(sa=r.dynCall_viiiiiiii=U.Qc)(i,u,c,m,g,x,I,z,B),ua=r.dynCall_viiiiiiiiii=(i,u,c,m,g,x,I,z,B,L,q)=>(ua=r.dynCall_viiiiiiiiii=U.Rc)(i,u,c,m,g,x,I,z,B,L,q),da=r.dynCall_jiii=(i,u,c,m)=>(da=r.dynCall_jiii=U.Sc)(i,u,c,m),la=r.dynCall_dii=(i,u,c)=>(la=r.dynCall_dii=U.Tc)(i,u,c),ca=r.dynCall_viiiiiiiii=(i,u,c,m,g,x,I,z,B,L)=>(ca=r.dynCall_viiiiiiiii=U.Uc)(i,u,c,m,g,x,I,z,B,L),pa=r.dynCall_viiiiiiiiiii=(i,u,c,m,g,x,I,z,B,L,q,X)=>(pa=r.dynCall_viiiiiiiiiii=U.Vc)(i,u,c,m,g,x,I,z,B,L,q,X),ma=r.dynCall_iiiiii=(i,u,c,m,g,x)=>(ma=r.dynCall_iiiiii=U.Wc)(i,u,c,m,g,x),fa=r.dynCall_iij=(i,u,c)=>(fa=r.dynCall_iij=U.Xc)(i,u,c),ha=r.dynCall_iiiiiiiiii=(i,u,c,m,g,x,I,z,B,L)=>(ha=r.dynCall_iiiiiiiiii=U.Yc)(i,u,c,m,g,x,I,z,B,L),ga=r.dynCall_iiiiiiiiiii=(i,u,c,m,g,x,I,z,B,L,q)=>(ga=r.dynCall_iiiiiiiiiii=U.Zc)(i,u,c,m,g,x,I,z,B,L,q),ya=r.dynCall_vij=(i,u,c)=>(ya=r.dynCall_vij=U._c)(i,u,c),ba=r.dynCall_iiif=(i,u,c,m)=>(ba=r.dynCall_iiif=U.$c)(i,u,c,m),_a=r.dynCall_iiij=(i,u,c,m)=>(_a=r.dynCall_iiij=U.ad)(i,u,c,m),wa=r.dynCall_fiii=(i,u,c,m)=>(wa=r.dynCall_fiii=U.bd)(i,u,c,m),va=r.dynCall_viiiiiiiiiiiii=(i,u,c,m,g,x,I,z,B,L,q,X,ue,$e)=>(va=r.dynCall_viiiiiiiiiiiii=U.cd)(i,u,c,m,g,x,I,z,B,L,q,X,ue,$e),$a=r.dynCall_vjiii=(i,u,c,m,g)=>($a=r.dynCall_vjiii=U.dd)(i,u,c,m,g),xa=r.dynCall_vif=(i,u,c)=>(xa=r.dynCall_vif=U.ed)(i,u,c),Sa=r.dynCall_iiiiiii=(i,u,c,m,g,x,I)=>(Sa=r.dynCall_iiiiiii=U.fd)(i,u,c,m,g,x,I),Ta=r.dynCall_iiiij=(i,u,c,m,g)=>(Ta=r.dynCall_iiiij=U.gd)(i,u,c,m,g),Ca=r.dynCall_iiiiiiii=(i,u,c,m,g,x,I,z)=>(Ca=r.dynCall_iiiiiiii=U.hd)(i,u,c,m,g,x,I,z),Ia=r.dynCall_viiiiiiiiiiii=(i,u,c,m,g,x,I,z,B,L,q,X,ue)=>(Ia=r.dynCall_viiiiiiiiiiii=U.id)(i,u,c,m,g,x,I,z,B,L,q,X,ue),Aa=r.dynCall_diii=(i,u,c,m)=>(Aa=r.dynCall_diii=U.jd)(i,u,c,m),ka=r.dynCall_jiiii=(i,u,c,m,g)=>(ka=r.dynCall_jiiii=U.kd)(i,u,c,m,g),Ea=r.dynCall_viiij=(i,u,c,m,g)=>(Ea=r.dynCall_viiij=U.ld)(i,u,c,m,g),Pa=r.dynCall_fiiii=(i,u,c,m,g)=>(Pa=r.dynCall_fiiii=U.md)(i,u,c,m,g),za=r.dynCall_viiif=(i,u,c,m,g)=>(za=r.dynCall_viiif=U.nd)(i,u,c,m,g),Oa=r.dynCall_diiii=(i,u,c,m,g)=>(Oa=r.dynCall_diiii=U.od)(i,u,c,m,g),Da=r.dynCall_viiid=(i,u,c,m,g)=>(Da=r.dynCall_viiid=U.pd)(i,u,c,m,g),Ba=r.dynCall_iiiijii=(i,u,c,m,g,x,I)=>(Ba=r.dynCall_iiiijii=U.qd)(i,u,c,m,g,x,I),Ma=r.dynCall_iiiiiij=(i,u,c,m,g,x,I)=>(Ma=r.dynCall_iiiiiij=U.rd)(i,u,c,m,g,x,I),Ra=i=>(Ra=U.sd)(i),Ua=()=>(Ua=U.td)(),Na=i=>(Na=U.ud)(i),Va=()=>(Va=U.vd)();function Mm(i,u,c){var m=ie();try{Zi(i,u,c)}catch(g){if(oe(m),g!==g+0)throw g;se(1,0)}}function Rm(i,u,c){var m=ie();try{return Ki(i,u,c)}catch(g){if(oe(m),g!==g+0)throw g;se(1,0)}}function Um(i,u){var c=ie();try{ji(i,u)}catch(m){if(oe(c),m!==m+0)throw m;se(1,0)}}function Nm(i,u){var c=ie();try{return Rn(i,u)}catch(m){if(oe(c),m!==m+0)throw m;se(1,0)}}function Vm(i,u,c,m){var g=ie();try{return Qi(i,u,c,m)}catch(x){if(oe(g),x!==x+0)throw x;se(1,0)}}function Wm(i,u,c,m,g){var x=ie();try{Ji(i,u,c,m,g)}catch(I){if(oe(x),I!==I+0)throw I;se(1,0)}}function Lm(i,u,c,m,g){var x=ie();try{return Xi(i,u,c,m,g)}catch(I){if(oe(x),I!==I+0)throw I;se(1,0)}}function Gm(i,u,c,m){var g=ie();try{Yi(i,u,c,m)}catch(x){if(oe(g),x!==x+0)throw x;se(1,0)}}function Hm(i,u,c,m,g,x,I){var z=ie();try{return Sa(i,u,c,m,g,x,I)}catch(B){if(oe(z),B!==B+0)throw B;se(1,0)}}function Fm(i){var u=ie();try{na(i)}catch(c){if(oe(u),c!==c+0)throw c;se(1,0)}}function qm(i,u,c){var m=ie();try{return fa(i,u,c)}catch(g){if(oe(m),g!==g+0)throw g;se(1,0)}}function Km(i,u,c,m,g,x){var I=ie();try{oa(i,u,c,m,g,x)}catch(z){if(oe(I),z!==z+0)throw z;se(1,0)}}function jm(i,u,c){var m=ie();try{ya(i,u,c)}catch(g){if(oe(m),g!==g+0)throw g;se(1,0)}}function Zm(i,u,c,m,g,x,I){var z=ie();try{ea(i,u,c,m,g,x,I)}catch(B){if(oe(z),B!==B+0)throw B;se(1,0)}}function Qm(i,u,c,m,g,x,I,z){var B=ie();try{ta(i,u,c,m,g,x,I,z)}catch(L){if(oe(B),L!==L+0)throw L;se(1,0)}}function Ym(i,u,c,m,g,x){var I=ie();try{return ma(i,u,c,m,g,x)}catch(z){if(oe(I),z!==z+0)throw z;se(1,0)}}function Xm(i,u,c,m,g,x,I,z){var B=ie();try{return Ca(i,u,c,m,g,x,I,z)}catch(L){if(oe(B),L!==L+0)throw L;se(1,0)}}function Jm(i,u,c,m,g,x,I,z,B,L){var q=ie();try{ca(i,u,c,m,g,x,I,z,B,L)}catch(X){if(oe(q),X!==X+0)throw X;se(1,0)}}function ef(i,u,c,m,g,x,I,z,B){var L=ie();try{sa(i,u,c,m,g,x,I,z,B)}catch(q){if(oe(L),q!==q+0)throw q;se(1,0)}}function tf(i){var u=ie();try{return ia(i)}catch(c){if(oe(u),c!==c+0)throw c;se(1,0)}}function rf(i,u,c,m,g,x,I,z,B,L){var q=ie();try{return ha(i,u,c,m,g,x,I,z,B,L)}catch(X){if(oe(q),X!==X+0)throw X;se(1,0)}}function nf(i,u,c){var m=ie();try{return aa(i,u,c)}catch(g){if(oe(m),g!==g+0)throw g;se(1,0)}}function of(i,u,c,m){var g=ie();try{return da(i,u,c,m)}catch(x){if(oe(g),x!==x+0)throw x;return se(1,0),0n}}function af(i,u,c){var m=ie();try{return la(i,u,c)}catch(g){if(oe(m),g!==g+0)throw g;se(1,0)}}function sf(i,u,c,m,g,x,I,z,B,L,q,X){var ue=ie();try{pa(i,u,c,m,g,x,I,z,B,L,q,X)}catch($e){if(oe(ue),$e!==$e+0)throw $e;se(1,0)}}function uf(i,u,c,m,g,x,I,z,B,L,q){var X=ie();try{ua(i,u,c,m,g,x,I,z,B,L,q)}catch(ue){if(oe(X),ue!==ue+0)throw ue;se(1,0)}}function df(i,u,c,m,g,x,I,z,B,L,q){var X=ie();try{return ga(i,u,c,m,g,x,I,z,B,L,q)}catch(ue){if(oe(X),ue!==ue+0)throw ue;se(1,0)}}function lf(i,u,c,m){var g=ie();try{return ba(i,u,c,m)}catch(x){if(oe(g),x!==x+0)throw x;se(1,0)}}function cf(i,u,c,m){var g=ie();try{return _a(i,u,c,m)}catch(x){if(oe(g),x!==x+0)throw x;se(1,0)}}function pf(i,u,c,m){var g=ie();try{return wa(i,u,c,m)}catch(x){if(oe(g),x!==x+0)throw x;se(1,0)}}function mf(i,u,c,m,g,x,I,z,B,L,q,X,ue,$e){var Le=ie();try{va(i,u,c,m,g,x,I,z,B,L,q,X,ue,$e)}catch(jt){if(oe(Le),jt!==jt+0)throw jt;se(1,0)}}function ff(i,u,c,m,g){var x=ie();try{$a(i,u,c,m,g)}catch(I){if(oe(x),I!==I+0)throw I;se(1,0)}}function hf(i,u,c){var m=ie();try{xa(i,u,c)}catch(g){if(oe(m),g!==g+0)throw g;se(1,0)}}function gf(i,u){var c=ie();try{return ra(i,u)}catch(m){if(oe(c),m!==m+0)throw m;return se(1,0),0n}}function yf(i,u,c,m,g){var x=ie();try{return Ta(i,u,c,m,g)}catch(I){if(oe(x),I!==I+0)throw I;se(1,0)}}function bf(i,u,c,m,g,x,I,z,B,L,q,X,ue){var $e=ie();try{Ia(i,u,c,m,g,x,I,z,B,L,q,X,ue)}catch(Le){if(oe($e),Le!==Le+0)throw Le;se(1,0)}}function _f(i,u,c,m){var g=ie();try{return Aa(i,u,c,m)}catch(x){if(oe(g),x!==x+0)throw x;se(1,0)}}function wf(i,u,c,m,g){var x=ie();try{return ka(i,u,c,m,g)}catch(I){if(oe(x),I!==I+0)throw I;return se(1,0),0n}}function vf(i,u,c,m,g){var x=ie();try{Ea(i,u,c,m,g)}catch(I){if(oe(x),I!==I+0)throw I;se(1,0)}}function $f(i,u,c,m,g){var x=ie();try{return Pa(i,u,c,m,g)}catch(I){if(oe(x),I!==I+0)throw I;se(1,0)}}function xf(i,u,c,m,g){var x=ie();try{za(i,u,c,m,g)}catch(I){if(oe(x),I!==I+0)throw I;se(1,0)}}function Sf(i,u,c,m,g){var x=ie();try{return Oa(i,u,c,m,g)}catch(I){if(oe(x),I!==I+0)throw I;se(1,0)}}function Tf(i,u,c,m,g){var x=ie();try{Da(i,u,c,m,g)}catch(I){if(oe(x),I!==I+0)throw I;se(1,0)}}function Cf(i,u,c,m,g,x,I){var z=ie();try{return Ba(i,u,c,m,g,x,I)}catch(B){if(oe(z),B!==B+0)throw B;se(1,0)}}function If(i,u,c,m,g,x,I){var z=ie();try{return Ma(i,u,c,m,g,x,I)}catch(B){if(oe(z),B!==B+0)throw B;se(1,0)}}return r.stackSave=()=>ie(),r.stackRestore=i=>oe(i),r.stackAlloc=i=>Mn(i),r.setValue=function(i,u,c="i8"){switch(c.endsWith("*")&&(c="*"),c){case"i1":case"i8":Z()[i>>>0]=u;break;case"i16":ke()[i>>>1>>>0]=u;break;case"i32":D()[i>>>2>>>0]=u;break;case"i64":W[i>>>3]=BigInt(u);break;case"float":Y()[i>>>2>>>0]=u;break;case"double":fe()[i>>>3>>>0]=u;break;case"*":R()[i>>>2>>>0]=u;break;default:ut(`invalid type for setValue: ${c}`)}},r.getValue=function(i,u="i8"){switch(u.endsWith("*")&&(u="*"),u){case"i1":case"i8":return Z()[i>>>0];case"i16":return ke()[i>>>1>>>0];case"i32":return D()[i>>>2>>>0];case"i64":return W[i>>>3];case"float":return Y()[i>>>2>>>0];case"double":return fe()[i>>>3>>>0];case"*":return R()[i>>>2>>>0];default:ut(`invalid type for getValue: ${u}`)}},r.UTF8ToString=Ae,r.stringToUTF8=Bt,r.lengthBytesUTF8=Yo,function i(){if(0{"use strict";xr();Ts=typeof location>"u"?void 0:location.origin,Rf=()=>{if(!!1)return import.meta.url?.startsWith("file:")?new URL(new URL("ort.bundle.min.mjs",import.meta.url).href,Ts).href:import.meta.url},Ve=Rf(),Cs=()=>{if(Ve&&!Ve.startsWith("blob:"))return Ve.substring(0,Ve.lastIndexOf("/")+1)},jn=(e,t)=>{try{let n=t??Ve;return(n?new URL(e,n):new URL(e)).origin===Ts}catch{return!1}},Uf=(e,t)=>{let n=t??Ve;try{return(n?new URL(e,n):new URL(e)).href}catch{return}},Nf=(e,t)=>`${t??"./"}${e}`,Is=async e=>{let n=await(await fetch(e,{credentials:"same-origin"})).blob();return URL.createObjectURL(n)},Vf=async e=>(await import(/*webpackIgnore:true*/e)).default,xs=(_s(),br(bs)).default,As=async()=>{if(!Ve)throw new Error("Failed to load proxy worker: cannot determine the script source URL.");if(jn(Ve))return[void 0,xs()];let e=await Is(Ve);return[e,xs(e)]},Ss=($s(),br(vs)).default,ks=async(e,t,n)=>{if(!e&&!t&&Ss&&Ve&&jn(Ve))return[void 0,Ss];{let r="ort-wasm-simd-threaded.jsep.mjs",o=e??Uf(r,t),a=!!1&&n&&o&&!jn(o,t),s=a?await Is(o):o??Nf(r,t);return[a?s:void 0,await Vf(s)]}}});var Zn,Qn,Or,Es,Wf,Lf,Tr,Ie,bt=G(()=>{"use strict";Sr();Qn=!1,Or=!1,Es=!1,Wf=()=>{if(typeof SharedArrayBuffer>"u")return!1;try{return typeof MessageChannel<"u"&&new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch{return!1}},Lf=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,30,1,28,0,65,0,253,15,253,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,186,1,26,11]))}catch{return!1}},Tr=async e=>{if(Qn)return Promise.resolve();if(Or)throw new Error("multiple calls to 'initializeWebAssembly()' detected.");if(Es)throw new Error("previous call to 'initializeWebAssembly()' failed.");Or=!0;let t=e.initTimeout,n=e.numThreads;if(!Lf())throw new Error("WebAssembly SIMD is not supported in the current environment.");let r=Wf();n>1&&!r&&(typeof self<"u"&&!self.crossOriginIsolated&&console.warn("env.wasm.numThreads is set to "+n+", but this will not work unless you enable crossOriginIsolated mode. See https://web.dev/cross-origin-isolation-guide/ for more info."),console.warn("WebAssembly multi-threading is not supported in the current environment. Falling back to single-threading."),e.numThreads=n=1);let o=e.wasmPaths,a=typeof o=="string"?o:void 0,s=o?.mjs,d=s?.href??s,l=o?.wasm,p=l?.href??l,f=e.wasmBinary,[h,y]=await ks(d,a,n>1),_=!1,b=[];if(t>0&&b.push(new Promise(w=>{setTimeout(()=>{_=!0,w()},t)})),b.push(new Promise((w,S)=>{let $={numThreads:n};if(f)$.wasmBinary=f;else if(p||a)$.locateFile=v=>p??a+v;else if(d&&d.indexOf("blob:")!==0)$.locateFile=v=>new URL(v,d).href;else if(h){let v=Cs();v&&($.locateFile=T=>v+T)}y($).then(v=>{Or=!1,Qn=!0,Zn=v,w(),h&&URL.revokeObjectURL(h)},v=>{Or=!1,Es=!0,S(v)})})),await Promise.race(b),_)throw new Error(`WebAssembly backend initializing failed due to timeout: ${t}ms`)},Ie=()=>{if(Qn&&Zn)return Zn;throw new Error("WebAssembly is not initialized yet.")}});var Pe,Xt,he,Dr=G(()=>{"use strict";bt();Pe=(e,t)=>{let n=Ie(),r=n.lengthBytesUTF8(e)+1,o=n._malloc(r);return n.stringToUTF8(e,o,r),t.push(o),o},Xt=(e,t,n,r)=>{if(typeof e=="object"&&e!==null){if(n.has(e))throw new Error("Circular reference in options");n.add(e)}Object.entries(e).forEach(([o,a])=>{let s=t?t+o:o;if(typeof a=="object")Xt(a,s+".",n,r);else if(typeof a=="string"||typeof a=="number")r(s,a.toString());else if(typeof a=="boolean")r(s,a?"1":"0");else throw new Error(`Can't handle extra config type: ${typeof a}`)})},he=e=>{let t=Ie(),n=t.stackSave();try{let r=t.PTR_SIZE,o=t.stackAlloc(2*r);t._OrtGetLastError(o,o+r);let a=Number(t.getValue(o,r===4?"i32":"i64")),s=t.getValue(o+r,"*"),d=s?t.UTF8ToString(s):"";throw new Error(`${e} ERROR_CODE: ${a}, ERROR_MESSAGE: ${d}`)}finally{t.stackRestore(n)}}});var Ps,zs=G(()=>{"use strict";bt();Dr();Ps=e=>{let t=Ie(),n=0,r=[],o=e||{};try{if(e?.logSeverityLevel===void 0)o.logSeverityLevel=2;else if(typeof e.logSeverityLevel!="number"||!Number.isInteger(e.logSeverityLevel)||e.logSeverityLevel<0||e.logSeverityLevel>4)throw new Error(`log serverity level is not valid: ${e.logSeverityLevel}`);if(e?.logVerbosityLevel===void 0)o.logVerbosityLevel=0;else if(typeof e.logVerbosityLevel!="number"||!Number.isInteger(e.logVerbosityLevel))throw new Error(`log verbosity level is not valid: ${e.logVerbosityLevel}`);e?.terminate===void 0&&(o.terminate=!1);let a=0;return e?.tag!==void 0&&(a=Pe(e.tag,r)),n=t._OrtCreateRunOptions(o.logSeverityLevel,o.logVerbosityLevel,!!o.terminate,a),n===0&&he("Can't create run options."),e?.extra!==void 0&&Xt(e.extra,"",new WeakSet,(s,d)=>{let l=Pe(s,r),p=Pe(d,r);t._OrtAddRunConfigEntry(n,l,p)!==0&&he(`Can't set a run config entry: ${s} - ${d}.`)}),[n,r]}catch(a){throw n!==0&&t._OrtReleaseRunOptions(n),r.forEach(s=>t._free(s)),a}}});var Gf,Hf,Ff,qf,Os,Ds=G(()=>{"use strict";bt();Dr();Gf=e=>{switch(e){case"disabled":return 0;case"basic":return 1;case"extended":return 2;case"all":return 99;default:throw new Error(`unsupported graph optimization level: ${e}`)}},Hf=e=>{switch(e){case"sequential":return 0;case"parallel":return 1;default:throw new Error(`unsupported execution mode: ${e}`)}},Ff=e=>{e.extra||(e.extra={}),e.extra.session||(e.extra.session={});let t=e.extra.session;t.use_ort_model_bytes_directly||(t.use_ort_model_bytes_directly="1"),e.executionProviders&&e.executionProviders.some(n=>(typeof n=="string"?n:n.name)==="webgpu")&&(e.enableMemPattern=!1)},qf=(e,t,n)=>{for(let r of t){let o=typeof r=="string"?r:r.name;switch(o){case"webnn":if(o="WEBNN",typeof r!="string"){let d=r?.deviceType;if(d){let l=Pe("deviceType",n),p=Pe(d,n);Ie()._OrtAddSessionConfigEntry(e,l,p)!==0&&he(`Can't set a session config entry: 'deviceType' - ${d}.`)}}break;case"webgpu":if(o="JS",typeof r!="string"){let s=r;if(s?.preferredLayout){if(s.preferredLayout!=="NCHW"&&s.preferredLayout!=="NHWC")throw new Error(`preferredLayout must be either 'NCHW' or 'NHWC': ${s.preferredLayout}`);let d=Pe("preferredLayout",n),l=Pe(s.preferredLayout,n);Ie()._OrtAddSessionConfigEntry(e,d,l)!==0&&he(`Can't set a session config entry: 'preferredLayout' - ${s.preferredLayout}.`)}}break;case"wasm":case"cpu":continue;default:throw new Error(`not supported execution provider: ${o}`)}let a=Pe(o,n);Ie()._OrtAppendExecutionProvider(e,a)!==0&&he(`Can't append execution provider: ${o}.`)}},Os=e=>{let t=Ie(),n=0,r=[],o=e||{};Ff(o);try{let a=Gf(o.graphOptimizationLevel??"all"),s=Hf(o.executionMode??"sequential"),d=typeof o.logId=="string"?Pe(o.logId,r):0,l=o.logSeverityLevel??2;if(!Number.isInteger(l)||l<0||l>4)throw new Error(`log serverity level is not valid: ${l}`);let p=o.logVerbosityLevel??0;if(!Number.isInteger(p)||p<0||p>4)throw new Error(`log verbosity level is not valid: ${p}`);let f=typeof o.optimizedModelFilePath=="string"?Pe(o.optimizedModelFilePath,r):0;if(n=t._OrtCreateSessionOptions(a,!!o.enableCpuMemArena,!!o.enableMemPattern,s,!!o.enableProfiling,0,d,l,p,f),n===0&&he("Can't create session options."),o.executionProviders&&qf(n,o.executionProviders,r),o.enableGraphCapture!==void 0){if(typeof o.enableGraphCapture!="boolean")throw new Error(`enableGraphCapture must be a boolean value: ${o.enableGraphCapture}`);let h=Pe("enableGraphCapture",r),y=Pe(o.enableGraphCapture.toString(),r);t._OrtAddSessionConfigEntry(n,h,y)!==0&&he(`Can't set a session config entry: 'enableGraphCapture' - ${o.enableGraphCapture}.`)}if(o.freeDimensionOverrides)for(let[h,y]of Object.entries(o.freeDimensionOverrides)){if(typeof h!="string")throw new Error(`free dimension override name must be a string: ${h}`);if(typeof y!="number"||!Number.isInteger(y)||y<0)throw new Error(`free dimension override value must be a non-negative integer: ${y}`);let _=Pe(h,r);t._OrtAddFreeDimensionOverride(n,_,y)!==0&&he(`Can't set a free dimension override: ${h} - ${y}.`)}return o.extra!==void 0&&Xt(o.extra,"",new WeakSet,(h,y)=>{let _=Pe(h,r),b=Pe(y,r);t._OrtAddSessionConfigEntry(n,_,b)!==0&&he(`Can't set a session config entry: ${h} - ${y}.`)}),[n,r]}catch(a){throw n!==0&&t._OrtReleaseSessionOptions(n)!==0&&he("Can't release session options."),r.forEach(s=>t._free(s)),a}}});var Rt,_t,wt,Br,Jt,Mr,Rr,Yn,te=G(()=>{"use strict";Rt=e=>{switch(e){case"int8":return 3;case"uint8":return 2;case"bool":return 9;case"int16":return 5;case"uint16":return 4;case"int32":return 6;case"uint32":return 12;case"float16":return 10;case"float32":return 1;case"float64":return 11;case"string":return 8;case"int64":return 7;case"uint64":return 13;case"int4":return 22;case"uint4":return 21;default:throw new Error(`unsupported data type: ${e}`)}},_t=e=>{switch(e){case 3:return"int8";case 2:return"uint8";case 9:return"bool";case 5:return"int16";case 4:return"uint16";case 6:return"int32";case 12:return"uint32";case 10:return"float16";case 1:return"float32";case 11:return"float64";case 8:return"string";case 7:return"int64";case 13:return"uint64";case 22:return"int4";case 21:return"uint4";default:throw new Error(`unsupported data type: ${e}`)}},wt=(e,t)=>{let n=[-1,4,1,1,2,2,4,8,-1,1,2,8,4,8,-1,-1,-1,-1,-1,-1,-1,.5,.5][e],r=typeof t=="number"?t:t.reduce((o,a)=>o*a,1);return n>0?Math.ceil(r*n):void 0},Br=e=>{switch(e){case"float16":return typeof Float16Array<"u"&&Float16Array.from?Float16Array:Uint16Array;case"float32":return Float32Array;case"uint8":return Uint8Array;case"int8":return Int8Array;case"uint16":return Uint16Array;case"int16":return Int16Array;case"int32":return Int32Array;case"bool":return Uint8Array;case"float64":return Float64Array;case"uint32":return Uint32Array;case"int64":return BigInt64Array;case"uint64":return BigUint64Array;default:throw new Error(`unsupported type: ${e}`)}},Jt=e=>{switch(e){case"verbose":return 0;case"info":return 1;case"warning":return 2;case"error":return 3;case"fatal":return 4;default:throw new Error(`unsupported logging level: ${e}`)}},Mr=e=>e==="float32"||e==="float16"||e==="int32"||e==="int64"||e==="uint32"||e==="uint8"||e==="bool"||e==="uint4"||e==="int4",Rr=e=>e==="float32"||e==="float16"||e==="int32"||e==="int64"||e==="uint32"||e==="uint64"||e==="int8"||e==="uint8"||e==="bool"||e==="uint4"||e==="int4",Yn=e=>{switch(e){case"none":return 0;case"cpu":return 1;case"cpu-pinned":return 2;case"texture":return 3;case"gpu-buffer":return 4;case"ml-tensor":return 5;default:throw new Error(`unsupported data location: ${e}`)}}});var er,Xn=G(()=>{"use strict";xr();er=async e=>{if(typeof e=="string")if(!1)try{let{readFile:t}=Nn("node:fs/promises");return new Uint8Array(await t(e))}catch(t){if(t.code==="ERR_FS_FILE_TOO_LARGE"){let{createReadStream:n}=Nn("node:fs"),r=n(e),o=[];for await(let a of r)o.push(a);return new Uint8Array(Buffer.concat(o))}throw t}else{let t=await fetch(e);if(!t.ok)throw new Error(`failed to load external data file: ${e}`);let n=t.headers.get("Content-Length"),r=n?parseInt(n,10):0;if(r<1073741824)return new Uint8Array(await t.arrayBuffer());{if(!t.body)throw new Error(`failed to load external data file: ${e}, no response body.`);let o=t.body.getReader(),a;try{a=new ArrayBuffer(r)}catch(d){if(d instanceof RangeError){let l=Math.ceil(r/65536);a=new WebAssembly.Memory({initial:l,maximum:l}).buffer}else throw d}let s=0;for(;;){let{done:d,value:l}=await o.read();if(d)break;let p=l.byteLength;new Uint8Array(a,s,p).set(l),s+=p}return new Uint8Array(a,0,r)}}else return e instanceof Blob?new Uint8Array(await e.arrayBuffer()):e instanceof Uint8Array?e:new Uint8Array(e)}});var Kf,jf,Bs,Ms,Ur,Zf,me,tt=G(()=>{"use strict";te();Kf=["V","I","W","E","F"],jf=(e,t)=>{console.log(`[${Kf[e]},${new Date().toISOString()}]${t}`)},Ur=(e,t)=>{Bs=e,Ms=t},Zf=(e,t)=>{let n=Jt(e),r=Jt(Bs);n>=r&&jf(n,typeof t=="function"?t():t)},me=(...e)=>{Ms&&Zf(...e)}});var Nr,Jn=G(()=>{"use strict";te();Nr=(e,t)=>new(Br(t))(e)});var Vr=G(()=>{"use strict"});var Rs,eo,to,Qf,Yf,Us,no,ro,Vs,Ws=G(()=>{"use strict";tt();Vr();Rs=new Map([[64,250],[128,200],[256,200],[512,200],[2048,230],[4096,200],[8192,50],[16384,50],[32768,50],[65536,50],[131072,50],[262144,50],[524288,50],[1048576,50],[2097152,30],[4194304,20],[8388608,10],[12582912,10],[16777216,10],[26214400,15],[33554432,22],[44236800,2],[58982400,6],[67108864,6],[134217728,6],[167772160,6]]),eo=[],to=e=>Math.ceil(Number(e)/16)*16,Qf=e=>{for(let t=0;tYf++,no=async(e,t,n,r)=>{let o=to(n),a=e.device.createBuffer({size:o,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});try{let s=e.getCommandEncoder();e.endComputePass(),s.copyBufferToBuffer(t,0,a,0,o),e.flush(),await a.mapAsync(GPUMapMode.READ);let d=a.getMappedRange();if(r){let l=r();return l.set(new Uint8Array(d,0,n)),l}else return new Uint8Array(d.slice(0,n))}finally{a.destroy()}},ro=class{constructor(t){this.backend=t;this.storageCache=new Map,this.freeBuffers=new Map,this.freeUniformBuffers=new Map,this.buffersPending=[],this.capturedPendingBuffers=new Map;for(let[n]of Rs)eo.push(n),this.freeBuffers.set(n,[]),this.freeUniformBuffers.set(n,[]);this.sessionCount=0}upload(t,n){let r=n.buffer,o=n.byteOffset,a=n.byteLength,s=to(a),d=this.storageCache.get(t);if(!d)throw new Error("gpu data for uploading does not exist");if(Number(d.originalSize)!==a)throw new Error(`inconsistent data size. gpu data size=${d.originalSize}, data size=${a}`);let l=this.backend.device.createBuffer({mappedAtCreation:!0,size:s,usage:GPUBufferUsage.MAP_WRITE|GPUBufferUsage.COPY_SRC}),p=l.getMappedRange();new Uint8Array(p).set(new Uint8Array(r,o,a)),l.unmap();let f=this.backend.device.createCommandEncoder();f.copyBufferToBuffer(l,0,d.gpuData.buffer,0,s),this.backend.device.queue.submit([f.finish()]),l.destroy(),me("verbose",()=>`[WebGPU] GpuDataManager.upload(id=${t})`)}memcpy(t,n){let r=this.storageCache.get(t);if(!r)throw new Error("source gpu data for memcpy does not exist");let o=this.storageCache.get(n);if(!o)throw new Error("destination gpu data for memcpy does not exist");if(r.originalSize!==o.originalSize)throw new Error("inconsistent source and destination gpu data size");let a=to(r.originalSize),s=this.backend.getCommandEncoder();this.backend.endComputePass(),s.copyBufferToBuffer(r.gpuData.buffer,0,o.gpuData.buffer,0,a)}registerExternalBuffer(t,n,r){let o;if(r){if(o=r[0],t===r[1])return me("verbose",()=>`[WebGPU] GpuDataManager.registerExternalBuffer(size=${n}) => id=${o}, buffer is the same, skip.`),o;if(this.backend.capturedCommandList.has(this.backend.currentSessionId))throw new Error(`Registering a different external buffer under graph capture mode is not supported yet. + Please use the previous external buffer!`)}else o=Us();return this.storageCache.set(o,{gpuData:{id:o,type:0,buffer:t},originalSize:n}),me("verbose",()=>`[WebGPU] GpuDataManager.registerExternalBuffer(size=${n}) => id=${o}, registered.`),o}unregisterExternalBuffer(t){t!==void 0&&(this.storageCache.delete(t),me("verbose",()=>`[WebGPU] GpuDataManager.unregisterExternalBuffer() => id=${t}`))}create(t,n=GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST){let r=Qf(t),o,a=(n&GPUBufferUsage.STORAGE)===GPUBufferUsage.STORAGE,s=(n&GPUBufferUsage.UNIFORM)===GPUBufferUsage.UNIFORM;if(a||s){let p=(a?this.freeBuffers:this.freeUniformBuffers).get(r);p?p.length>0?o=p.pop():o=this.backend.device.createBuffer({size:r,usage:n}):o=this.backend.device.createBuffer({size:r,usage:n})}else o=this.backend.device.createBuffer({size:r,usage:n});let d={id:Us(),type:0,buffer:o};return this.storageCache.set(d.id,{gpuData:d,originalSize:Number(t)}),me("verbose",()=>`[WebGPU] GpuDataManager.create(size=${t}) => id=${d.id}`),d}get(t){return this.storageCache.get(t)?.gpuData}release(t){let n=typeof t=="bigint"?Number(t):t,r=this.storageCache.get(n);if(!r){if(this.storageCache.size===0)return 0;throw new Error("releasing data does not exist")}return me("verbose",()=>`[WebGPU] GpuDataManager.release(id=${n}), gpuDataId=${r.gpuData.id}`),this.storageCache.delete(n),this.buffersPending.push(r.gpuData.buffer),r.originalSize}async download(t,n){let r=this.storageCache.get(Number(t));if(!r)throw new Error("data does not exist");await no(this.backend,r.gpuData.buffer,r.originalSize,n)}refreshPendingBuffers(){if(this.buffersPending.length!==0)if(this.backend.sessionStatus==="default"){for(let t of this.buffersPending){let n=Rs.get(t.size);if((t.usage&GPUBufferUsage.STORAGE)===GPUBufferUsage.STORAGE){let r=this.freeBuffers.get(t.size)||[];n===void 0||r.length>=n?t.destroy():r.push(t)}else if((t.usage&GPUBufferUsage.UNIFORM)===GPUBufferUsage.UNIFORM){let r=this.freeUniformBuffers.get(t.size)||[];n===void 0||r.length>=n?t.destroy():r.push(t)}else t.destroy()}this.buffersPending=[]}else{let t=this.capturedPendingBuffers.get(this.backend.currentSessionId);t||(t=[],this.capturedPendingBuffers.set(this.backend.currentSessionId,t));for(let n of this.buffersPending)t.push(n);this.buffersPending=[]}}dispose(){this.freeBuffers.forEach(t=>{t.forEach(n=>{n.destroy()})}),this.freeUniformBuffers.forEach(t=>{t.forEach(n=>{n.destroy()})}),this.storageCache.forEach(t=>{t.gpuData.buffer.destroy()}),this.capturedPendingBuffers.forEach(t=>{t.forEach(n=>{n.destroy()})}),this.storageCache=new Map,this.freeBuffers=new Map,this.freeUniformBuffers=new Map,this.capturedPendingBuffers=new Map}onCreateSession(){this.sessionCount+=1}onReleaseSession(t){let n=this.capturedPendingBuffers.get(t);n&&(n.forEach(r=>{r.destroy()}),this.capturedPendingBuffers.delete(t)),this.sessionCount-=1,this.sessionCount===0&&(me("warning",()=>"[WebGPU] Clearing webgpu buffer cache"),this.storageCache.forEach(r=>{r.gpuData.buffer.destroy()}),this.storageCache=new Map)}},Vs=(...e)=>new ro(...e)});var oo,re,Ce=G(()=>{"use strict";oo=class{constructor(t){Object.assign(this,t)}get cacheKey(){return this.key||(this.key=Object.getOwnPropertyNames(this).sort().map(t=>`${this[t]}`).join(";")),this.key}},re=e=>new oo(e)});var io,rt,E,kt,Wr,Ls,Gs,ae=G(()=>{"use strict";io=class{static calcMatMulShape(t,n){return t[1]!==n[0]?void 0:[t[0],n[1]]}},rt=class{static calcShape(t,n,r=!1){let o=t.length,a=n.length;if(o===0)return n;if(a===0)return t;let s=Math.max(t.length,n.length),d=new Array(s);if(r){if(o<2||a<2)return;let l=io.calcMatMulShape([t[o-2],t[o-1]],[n[a-2],n[a-1]]);if(l===void 0)return;[d[s-2],d[s-1]]=l}for(let l=r?3:1;l<=s;l++){let p=o-l<0?1:t[o-l],f=a-l<0?1:n[a-l];if(p!==f&&p>1&&f>1)return;let h=Math.max(p,f);if(p&&f)d[s-l]=Math.max(p,f);else{if(h>1)return;d[s-l]=0}}return d}static isValidBroadcast(t,n){let r=t.length,o=n.length;if(r>o)return!1;for(let a=1;a<=r;a++)if(t[r-a]!==1&&t[r-a]!==n[o-a])return!1;return!0}},E=class e{static size(t){return e.getSizeFromDimensionRange(t,0,t.length)}static convertShape(t,n=4){let r=t.length;if(r===0)return[];let o=new Array(r),a=r-1;for(;a>=0;){if(t[a]%n===0){o[a]=t[a]/n;break}if(n%t[a]!==0)throw new Error("cannot convert shape");o[a]=1,n/=t[a],a--}for(a--;a>=0;a--)o[a]=t[a];return o}static sizeFromDimension(t,n){if(n<0||n>t.length)throw new Error(`invalid dimension of ${n} for sizeFromDimension as Tensor has ${t.length} dimensions.`);return e.getSizeFromDimensionRange(t,n,t.length)}static sizeToDimension(t,n){if(n<0||n>t.length)throw new Error(`invalid dimension of ${n} for sizeToDimension as Tensor has ${t.length} dimensions.`);return e.getSizeFromDimensionRange(t,0,n)}static getSizeFromDimensionRange(t,n,r){let o=1;for(let a=n;a=0;--o)r[o]=r[o+1]*t[o+1];return r}static normalizeAxis(t,n){if(t<-n&&t>=n)throw new Error("unsupported axis for this operation.");return t<0?t+n:t}static normalizeAxes(t,n){return t.map(r=>this.normalizeAxis(r,n??t.length))}static sortBasedOnPerm(t,n){return n?n.map(r=>t[r]):t.slice().reverse()}static padShape(t,n){let r=t.length;return t.map((o,a)=>o+n[a]+n[a+r])}static areEqual(t,n){return t.length!==n.length?!1:t.every((r,o)=>r===n[o])}},kt=class e{static adjustPoolAttributes(t,n,r,o,a,s){if(!t&&r.length!==n.length-2)throw new Error("length of specified kernel shapes should be 2 less than length of input dimensions");if(t)for(let d=0;d=r.length?r.push(n[d+2]):r[d]=n[d+2];for(let d=0;d=r[d]||s[d+r.length]>=r[d])throw new Error("pads should be smaller than kernel")}}static adjustPadsBasedOnAutoPad(t,n,r,o,a,s,d){if(d){if(a.length!==2*(t.length-2))throw new Error("length of pads should be twice the length of data dimensions");if(n.length!==t.length-2)throw new Error("length of strides should be the length of data dimensions");if(o.length!==t.length-2)throw new Error("length of kernel shapes should be the length of data dimensions");for(let l=0;l{"use strict";te();ae();Et=64,so=(e,t)=>{if(t===3)throw new Error("vec3 has same alignment as vec4, use vec4 instead");switch(Number(e)){case 10:return t>1?`vec${t}`:"f16";case 1:return t>1?`vec${t}`:"f32";case 6:return t>1?`vec${t}`:"i32";case 12:return t>1?`vec${t}`:"u32";case 7:if(t>1)throw new Error("currently not supported vecX of uint64 yet");return["vec2","i32"];case 13:if(t>1)throw new Error("currently not supported vecX of uint64 yet");return["vec2","u32"];case 9:if(t!==4)throw new Error("bool must be vec4");return["u32","vec4"];case 22:return"i32";case 21:return"u32";default:throw new Error(`Unknown data type: ${e}`)}},_e=(e,t=1)=>{let n=so(e,t);return typeof n=="string"?n:n[0]},ze=(e,t=1)=>{let n=so(e,t);return typeof n=="string"?n:n[1]},H=(...e)=>{let t=[];return e.forEach(n=>{n.length!==0&&t.push({type:12,data:n},{type:12,data:E.computeStrides(n)})}),t},ge=e=>e%4===0?4:e%2===0?2:1,uo=(e="f32",t,n="0")=>!t||t===1?`${e}(${n})`:`vec${t}<${e}>(${n})`,Pt=(e,t,n)=>e==="f32"?n:t===1?`f32(${n})`:`vec${t}(${n})`,Ke=(e,t)=>t===4?`(${e}.x + ${e}.y + ${e}.z + ${e}.w)`:t===2?`(${e}.x + ${e}.y)`:t===3?`(${e}.x + ${e}.y + ${e}.z)`:e,K=(e,t,n,r)=>e.startsWith("uniforms.")&&n>4?typeof t=="string"?r==="f16"?`${e}[(${t}) / 8][(${t}) % 8 / 4][(${t}) % 8 % 4]`:`${e}[(${t}) / 4][(${t}) % 4]`:r==="f16"?`${e}[${Math.floor(t/8)}][${Math.floor(t%8/4)}][${t%8%4}]`:`${e}[${Math.floor(t/4)}][${t%4}]`:n>1?`${e}[${t}]`:e,Lr=(e,t,n,r,o)=>{let a=typeof n=="number",s=a?n:n.length,d=[...new Array(s).keys()],l=s<2?"u32":s<=4?`vec${s}`:`array`,p=so(t,o),f=typeof p=="string"?p:p[1],h=typeof p=="string"?p:p[0],y={indices:l,value:f,storage:h,tensor:t},_=R=>typeof R=="string"?R:`${R}u`,b={offsetToIndices:!1,indicesToOffset:!1,broadcastedIndicesToOffset:!1,set:!1,setByIndices:!1,get:!1,getByIndices:!1},w=a?"uniforms.":"",S=`${w}${e}_shape`,$=`${w}${e}_strides`,v="";for(let R=0;R ${y.indices} { + var indices: ${y.indices}; + var current = offset; + ${v} + return indices; + }`,C=R=>(b.offsetToIndices=!0,s<2?R:`o2i_${e}(${R})`),A=[];if(s>=2)for(let R=s-1;R>=0;R--)A.push(`${K($,R,s)} * (indices[${R}])`);let k=s<2?"":` + fn i2o_${e}(indices: ${y.indices}) -> u32 { + return ${A.join("+")}; + }`,O=R=>(b.indicesToOffset=!0,s<2?R:`i2o_${e}(${R})`),M=(...R)=>s===0?"0u":`${y.indices}(${R.map(_).join(",")})`,V=(R,Y)=>s<2?`${R}`:`${K(R,Y,s)}`,F=(R,Y,fe)=>s<2?`${R}=${fe};`:`${K(R,Y,s)}=${fe};`,j={},ne=(R,Y)=>{b.broadcastedIndicesToOffset=!0;let fe=`${Y.name}broadcastedIndicesTo${e}Offset`;if(fe in j)return`${fe}(${R})`;let Fe=[];for(let xe=s-1;xe>=0;xe--){let be=Y.indicesGet("outputIndices",xe+Y.rank-s);Fe.push(`${V($,xe)} * (${be} % ${V(S,xe)})`)}return j[fe]=`fn ${fe}(outputIndices: ${Y.type.indices}) -> u32 { + return ${Fe.length>0?Fe.join("+"):"0u"}; + }`,`${fe}(${R})`},W=(R,Y)=>(()=>{if(y.storage===y.value)return`${e}[${R}]=${Y};`;if(y.storage==="vec2"&&y.value==="i32")return`${e}[${R}]=vec2(u32(${Y}), select(0u, 0xFFFFFFFFu, ${Y} < 0));`;if(y.storage==="vec2"&&y.value==="u32")return`${e}[${R}]=vec2(u32(${Y}), 0u);`;if(y.storage==="u32"&&y.value==="vec4")return`${e}[${R}]=dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(${Y}));`;throw new Error(`not supported combination of storage type ${y.storage} and value type ${y.value} yet`)})(),J=R=>(()=>{if(y.storage===y.value)return`${e}[${R}]`;if(y.storage==="vec2"&&y.value==="i32")return`i32(${e}[${R}].x)`;if(y.storage==="vec2"&&y.value==="u32")return`u32(${e}[${R}].x)`;if(y.storage==="u32"&&y.value==="vec4")return`vec4(bool(${e}[${R}] & 0xFFu), bool(${e}[${R}] & 0xFF00u), bool(${e}[${R}] & 0xFF0000u), bool(${e}[${R}] & 0xFF000000u))`;throw new Error(`not supported combination of storage type ${y.storage} and value type ${y.value} yet`)})(),ve=s<2?"":` + fn get_${e}ByIndices(indices: ${y.indices}) -> ${f} { + return ${J(`i2o_${e}(indices)`)}; + }`,Q=s<2?"":(()=>{let R=d.map(fe=>`d${fe}: u32`).join(", "),Y=d.map(fe=>`d${fe}`).join(", ");return` + fn get_${e}(${R}) -> ${f} { + return get_${e}ByIndices(${M(Y)}); + }`})(),ee=(...R)=>{if(R.length!==s)throw new Error(`indices length must be ${s}`);let Y=R.map(_).join(",");return s===0?J("0u"):s===1?J(Y[0]):(b.get=!0,b.getByIndices=!0,b.indicesToOffset=!0,`get_${e}(${Y})`)},le=R=>s<2?J(R):(b.getByIndices=!0,b.indicesToOffset=!0,`get_${e}ByIndices(${R})`),Z=s<2?"":` + fn set_${e}ByIndices(indices: ${y.indices}, value: ${f}) { + ${W(`i2o_${e}(indices)`,"value")} + }`,pe=s<2?"":(()=>{let R=d.map(fe=>`d${fe}: u32`).join(", "),Y=d.map(fe=>`d${fe}`).join(", ");return` + fn set_${e}(${R}, value: ${f}) { + set_${e}ByIndices(${M(Y)}, value); + }`})();return{impl:()=>{let R=[],Y=!1;return b.offsetToIndices&&(R.push(T),Y=!0),b.indicesToOffset&&(R.push(k),Y=!0),b.broadcastedIndicesToOffset&&(Object.values(j).forEach(fe=>R.push(fe)),Y=!0),b.set&&(R.push(pe),Y=!0),b.setByIndices&&(R.push(Z),Y=!0),b.get&&(R.push(Q),Y=!0),b.getByIndices&&(R.push(ve),Y=!0),!a&&Y&&R.unshift(`const ${S} = ${y.indices}(${n.join(",")});`,`const ${$} = ${y.indices}(${E.computeStrides(n).join(",")});`),R.join(` +`)},type:y,offsetToIndices:C,indicesToOffset:O,broadcastedIndicesToOffset:ne,indices:M,indicesGet:V,indicesSet:F,set:(...R)=>{if(R.length!==s+1)throw new Error(`indices length must be ${s}`);let Y=R[s];if(typeof Y!="string")throw new Error("value must be string");let fe=R.slice(0,s).map(_).join(",");return s===0?W("0u",Y):s===1?W(fe[0],Y):(b.set=!0,b.setByIndices=!0,b.indicesToOffset=!0,`set_${e}(${fe}, ${Y})`)},setByOffset:W,setByIndices:(R,Y)=>s<2?W(R,Y):(b.setByIndices=!0,b.indicesToOffset=!0,`set_${e}ByIndices(${R}, ${Y});`),get:ee,getByOffset:J,getByIndices:le,usage:r,name:e,strides:$,shape:S,rank:s}},P=(e,t,n,r=1)=>Lr(e,t,n,"input",r),N=(e,t,n,r=1)=>Lr(e,t,n,"output",r),Hs=(e,t,n)=>Lr(e,t,n,"atomicOutput",1),Gr=(e,t,n,r=1)=>Lr(e,t,n,"internal",r),ao=class{constructor(t,n){this.normalizedDispatchGroup=t;this.limits=n;this.internalVariables=[];this.variables=[];this.uniforms=[];this.variableIndex=0}guardAgainstOutOfBoundsWorkgroupSizes(t){return`if (global_idx >= ${typeof t=="number"?`${t}u`:t}) { return; }`}mainStart(t=Et){let n=typeof t=="number"?t:t[0],r=typeof t=="number"?1:t[1],o=typeof t=="number"?1:t[2];if(n>this.limits.maxComputeWorkgroupSizeX||r>this.limits.maxComputeWorkgroupSizeY||o>this.limits.maxComputeWorkgroupSizeZ)throw new Error(`workgroup size [${n}, ${r}, ${o}] exceeds the maximum workgroup size [${this.limits.maxComputeWorkgroupSizeX}, ${this.limits.maxComputeWorkgroupSizeY}, ${this.limits.maxComputeWorkgroupSizeZ}].`);if(n*r*o>this.limits.maxComputeInvocationsPerWorkgroup)throw new Error(`workgroup size [${n}, ${r}, ${o}] exceeds the maximum workgroup invocations ${this.limits.maxComputeInvocationsPerWorkgroup}.`);let a=this.normalizedDispatchGroup[1]===1&&this.normalizedDispatchGroup[2]===1,s=a?`@builtin(global_invocation_id) global_id : vec3, + @builtin(workgroup_id) workgroup_id : vec3, + @builtin(local_invocation_index) local_idx : u32, + @builtin(local_invocation_id) local_id : vec3`:`@builtin(global_invocation_id) global_id : vec3, + @builtin(local_invocation_id) local_id : vec3, + @builtin(local_invocation_index) local_idx : u32, + @builtin(workgroup_id) workgroup_id : vec3, + @builtin(num_workgroups) num_workgroups : vec3`,d=a?`let global_idx = global_id.x; + let workgroup_index = workgroup_id.x;`:`let workgroup_index = workgroup_id.z * num_workgroups[0] * num_workgroups[1] + + workgroup_id.y * num_workgroups[0] + workgroup_id.x; + let global_idx = workgroup_index * ${n*r*o}u + local_idx;`;return`@compute @workgroup_size(${n}, ${r}, ${o}) + fn main(${s}) { + ${d} + `}appendVariableUniforms(t){t.rank!==0&&(t.shape.startsWith("uniforms.")&&this.uniforms.push({name:t.shape.replace("uniforms.",""),type:"u32",length:t.rank}),t.strides.startsWith("uniforms.")&&this.uniforms.push({name:t.strides.replace("uniforms.",""),type:"u32",length:t.rank}))}declareVariable(t,n){if(t.usage==="internal")throw new Error("cannot use internal variable with declareVariable(). use registerInternalVariables() instead.");this.variables.push(t),this.appendVariableUniforms(t);let r=t.usage==="input"?"read":"read_write",o=t.usage==="atomicOutput"?"atomic":t.type.storage;return`@group(0) @binding(${n}) var ${t.name}: array<${o}>;`}declareVariables(...t){return t.map(n=>this.declareVariable(n,this.variableIndex++)).join(` +`)}registerInternalVariable(t){if(t.usage!=="internal")throw new Error("cannot use input or output variable with registerInternalVariable(). use declareVariables() instead.");this.internalVariables.push(t),this.appendVariableUniforms(t)}registerInternalVariables(...t){return t.forEach(n=>this.registerInternalVariable(n)),this}registerUniform(t,n,r=1){return this.uniforms.push({name:t,type:n,length:r}),this}registerUniforms(t){return this.uniforms=this.uniforms.concat(t),this}uniformDeclaration(){if(this.uniforms.length===0)return"";let t=[];for(let{name:n,type:r,length:o}of this.uniforms)if(o&&o>4)r==="f16"?t.push(`@align(16) ${n}:array, ${Math.ceil(o/8)}>`):t.push(`${n}:array, ${Math.ceil(o/4)}>`);else{let a=o==null||o===1?r:`vec${o}<${r}>`;t.push(`${n}:${a}`)}return` + struct Uniforms { ${t.join(", ")} }; + @group(0) @binding(${this.variableIndex}) var uniforms: Uniforms;`}get additionalImplementations(){return this.uniformDeclaration()+this.variables.map(t=>t.impl()).join(` +`)+this.internalVariables.map(t=>t.impl()).join(` +`)}get variablesInfo(){if(this.uniforms.length===0)return;let t=n=>[12,10,1,6][["u32","f16","f32","i32"].indexOf(n)];return this.uniforms.map(n=>[t(n.type),n.length??1])}},Fs=(e,t)=>new ao(e,t)});var Xf,qs,Jf,eh,th,rh,Oe,Ks,js,ct=G(()=>{"use strict";te();ae();Ce();ce();Xf=(e,t)=>{if(!e||e.length!==1)throw new Error("Transpose requires 1 input.");if(t.length!==0&&t.length!==e[0].dims.length)throw new Error(`perm size ${t.length} does not match input rank ${e[0].dims.length}`)},qs=(e,t)=>t.length!==0?t:[...new Array(e).keys()].reverse(),Jf=(e,t)=>E.sortBasedOnPerm(e,qs(e.length,t)),eh=(e,t,n,r)=>{let o=`fn perm(i: ${r.type.indices}) -> ${n.type.indices} { + var a: ${n.type.indices};`;for(let a=0;a{let n=[],r=[];for(let o=0;o{let n=0;for(let r=0;r{let n=e.dataType,r=e.dims.length,o=qs(r,t),a=Jf(e.dims,o),s=e.dims,d=a,l=r<2||rh(o,e.dims),p;if(l)return p=w=>{let S=P("input",n,s,4),$=N("output",n,d,4);return` + ${w.registerUniform("output_size","u32").declareVariables(S,$)} + ${w.mainStart()} + ${w.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + output[global_idx] = input[global_idx]; + }`},{name:"TransposeCopy",shaderCache:{inputDependencies:["type"]},getRunData:()=>{let w=E.size(a);return{outputs:[{dims:a,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(w/64/4)},programUniforms:[{type:12,data:Math.ceil(w/4)}]}},getShaderSource:p};let{newShape:f,newPerm:h}=th(e.dims,o),y=E.areEqual(h,[2,3,1]),_=E.areEqual(h,[3,1,2]);if(f.length===2||y||_){s=y?[f[0],f[1]*f[2]]:_?[f[0]*f[1],f[2]]:f,d=[s[1],s[0]];let w=16;return p=S=>{let $=P("a",n,s.length),v=N("output",n,d.length);return` + ${S.registerUniform("output_size","u32").declareVariables($,v)} + var tile : array, ${w}>; + ${S.mainStart([w,w,1])} + let stride = (uniforms.output_shape[1] - 1) / ${w} + 1; + let workgroup_id_x = workgroup_index % stride; + let workgroup_id_y = workgroup_index / stride; + let input_col = workgroup_id_y * ${w}u + local_id.x; + let input_row = workgroup_id_x * ${w}u + local_id.y; + if (input_row < uniforms.a_shape[0] && input_col < uniforms.a_shape[1]) { + tile[local_id.y][local_id.x] = ${$.getByIndices(`${$.type.indices}(input_row, input_col)`)}; + } + workgroupBarrier(); + + let output_col = workgroup_id_x * ${w}u + local_id.x; + let output_row = workgroup_id_y * ${w}u + local_id.y; + if (output_row < uniforms.output_shape[0] && output_col < uniforms.output_shape[1]) { + ${v.setByIndices(`${v.type.indices}(output_row, output_col)`,"tile[local_id.x][local_id.y]")} + } + }`},{name:"TransposeShared",shaderCache:{inputDependencies:["type"]},getRunData:()=>{let S=E.size(a);return{outputs:[{dims:a,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(d[1]/w),y:Math.ceil(d[0]/w)},programUniforms:[{type:12,data:S},...H(s,d)]}},getShaderSource:p}}return p=w=>{let S=P("a",n,s.length),$=N("output",n,d.length);return` + ${w.registerUniform("output_size","u32").declareVariables(S,$)} + + ${eh(o,r,S,$)} + + ${w.mainStart()} + ${w.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let indices = ${$.offsetToIndices("global_idx")}; + let aIndices = perm(indices); + + ${$.setByOffset("global_idx",S.getByIndices("aIndices"))} + }`},{name:"Transpose",shaderCache:{hint:`${t}`,inputDependencies:["rank"]},getRunData:()=>{let w=E.size(a);return{outputs:[{dims:a,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(w/64)},programUniforms:[{type:12,data:w},...H(s,d)]}},getShaderSource:p}},Ks=(e,t)=>{Xf(e.inputs,t.perm),e.compute(Oe(e.inputs[0],t.perm))},js=e=>re({perm:e.perm})});var nh,oh,ih,ah,sh,uh,dh,lh,ch,ph,nt,Zs,Qs,Ys,Xs,Js,eu,tu,ru,nu,ou,iu=G(()=>{"use strict";te();ae();ce();Hr();ct();nh={max:"select(bestValue, candidate, candidate > bestValue)",min:"select(bestValue, candidate, candidate < bestValue)",mean:"bestValue + candidate",sum:"bestValue + candidate",prod:"bestValue * candidate",sumSquare:"bestValue + candidate * candidate",logSumExp:"bestValue + exp(candidate)",l1:"bestValue + abs(candidate)",l2:"bestValue + candidate * candidate",logSum:"bestValue + candidate"},oh={max:"select(bestValue, candidate, candidate > bestValue)",min:"select(bestValue, candidate, candidate < bestValue)",mean:"bestValue + candidate",sum:"bestValue + candidate",prod:"bestValue * candidate",sumSquare:"bestValue + candidate",logSumExp:"bestValue + candidate",l1:"bestValue + candidate",l2:"bestValue + candidate",logSum:"bestValue + candidate"},ih={max:"_A[offset]",min:"_A[offset]",mean:"0",sum:"0",prod:"1",sumSquare:"0",logSumExp:"0",l1:"0",l2:"0",logSum:"0"},ah={max:"bestValue",min:"bestValue",sum:"bestValue",prod:"bestValue",sumSquare:"bestValue",logSumExp:"log(bestValue)",l1:"bestValue",l2:"sqrt(bestValue)",logSum:"log(bestValue)"},sh=(e,t)=>{let n=[];for(let r=t-e;r{let n=[],r=e.length;for(let a=0;ae[a]);return[n,o]},dh=(e,t)=>{let n=e.length+t.length,r=[],o=0;for(let a=0;a{for(let n=0;n{let n=[];if(!lh(e,t)){for(let r=0;rn.push(r))}return n},ph=(e,t,n,r,o,a,s)=>{let d=n[0].dims,l=E.size(a),p=E.size(s),f=P("_A",n[0].dataType,d),h=N("output",o,a),y=64;l===1&&(y=256);let _=` + var aBestValues : array; + `,b=w=>` + ${w.registerUniform("reduceSize","u32").declareVariables(f,h)} + ${_} + fn DIV_CEIL(a : u32, b : u32) -> u32 { + return ((a - 1u) / b + 1u); + } + ${w.mainStart(y)} + + let outputIndex = global_idx / ${y}; + let offset = outputIndex * uniforms.reduceSize; + + var bestValue = f32(${ih[r]}); + let Length = uniforms.reduceSize; + for (var k = local_idx; k < Length; k = k + ${y}) { + let candidate = f32(${f.getByOffset("offset + k")}); + bestValue = ${nh[r]}; + } + aBestValues[local_idx] = bestValue; + workgroupBarrier(); + + var reduceSize = min(Length, ${y}u); + for (var currentSize = reduceSize / 2u; reduceSize > 1u; + currentSize = reduceSize / 2u) { + let interval = DIV_CEIL(reduceSize, 2u); + if (local_idx < currentSize) { + let candidate = aBestValues[local_idx + interval]; + bestValue = ${oh[r]}; + aBestValues[local_idx] = bestValue; + } + reduceSize = interval; + workgroupBarrier(); + } + + if (local_idx == 0u) { + ${h.setByOffset("outputIndex",`${r==="mean"?`${h.type.storage}(bestValue / f32(uniforms.reduceSize))`:`${h.type.storage}(${ah[r]})`}`)}; + } + }`;return{name:e,shaderCache:{hint:`${t};${y}`,inputDependencies:["type"]},getShaderSource:b,getRunData:()=>({outputs:[{dims:a,dataType:o}],dispatchGroup:{x:l},programUniforms:[{type:12,data:p}]})}},nt=(e,t,n,r)=>{let o=e.inputs.length===1?n:lo(e.inputs,n),a=o.axes;a.length===0&&!o.noopWithEmptyAxes&&(a=e.inputs[0].dims.map((_,b)=>b));let s=E.normalizeAxes(a,e.inputs[0].dims.length),d=s,l=e.inputs[0],p=ch(d,e.inputs[0].dims.length);p.length>0&&(l=e.compute(Oe(e.inputs[0],p),{inputs:[0],outputs:[-1]})[0],d=sh(d.length,l.dims.length));let[f,h]=uh(l.dims,d),y=f;o.keepDims&&(y=dh(f,s)),e.compute(ph(t,o.cacheKey,[l],r,e.inputs[0].dataType,y,h),{inputs:[l]})},Zs=(e,t)=>{nt(e,"ReduceMeanShared",t,"mean")},Qs=(e,t)=>{nt(e,"ReduceL1Shared",t,"l1")},Ys=(e,t)=>{nt(e,"ReduceL2Shared",t,"l2")},Xs=(e,t)=>{nt(e,"ReduceLogSumExpShared",t,"logSumExp")},Js=(e,t)=>{nt(e,"ReduceMaxShared",t,"max")},eu=(e,t)=>{nt(e,"ReduceMinShared",t,"min")},tu=(e,t)=>{nt(e,"ReduceProdShared",t,"prod")},ru=(e,t)=>{nt(e,"ReduceSumShared",t,"sum")},nu=(e,t)=>{nt(e,"ReduceSumSquareShared",t,"sumSquare")},ou=(e,t)=>{nt(e,"ReduceLogSumShared",t,"logSum")}});var ot,mh,Fr,lo,it,fh,hh,gh,yh,bh,_h,wh,vh,$h,xh,at,au,su,uu,du,lu,cu,pu,mu,fu,hu,Hr=G(()=>{"use strict";te();ae();Ce();ce();iu();ot=e=>{if(!e||e.length===0||e.length>2)throw new Error("Reduce op requires 1 or 2 inputs.");if(e.length===2&&e[1].dims.length!==1)throw new Error("Invalid axes input dims.")},mh=e=>["","",`var value = ${e.getByIndices("input_indices")};`,""],Fr=(e,t,n,r,o,a,s=!1,d=!1)=>{let l=[],p=n[0].dims,f=p.length,h=E.normalizeAxes(o,f),y=!d&&h.length===0;p.forEach((S,$)=>{y||h.indexOf($)>=0?s&&l.push(1):l.push(S)});let _=l.length,b=E.size(l);return{name:e,shaderCache:t,getShaderSource:S=>{let $=[],v=P("_A",n[0].dataType,f),T=N("output",a,_),C=r(v,T,h),A=C[2];for(let k=0,O=0;k=0?(s&&O++,A=`for(var j${k}: u32 = 0; j${k} < ${p[k]}; j${k}++) { + ${C[2].includes("last_index")?`let last_index = j${k};`:""} + ${v.indicesSet("input_indices",k,`j${k}`)} + ${A} + }`):($.push(`${v.indicesSet("input_indices",k,T.indicesGet("output_indices",O))};`),O++);return` + + ${S.registerUniform("output_size","u32").declareVariables(v,T)} + + ${S.mainStart()} + ${S.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + var input_indices: ${v.type.indices}; + let output_indices = ${T.offsetToIndices("global_idx")}; + + ${$.join(` +`)} + ${C[0]} // init ops for reduce max/min + ${C[1]} + ${A} + ${C[3]} + ${C.length===4?T.setByOffset("global_idx","value"):C.slice(4).join(` +`)} + }`},getRunData:()=>({outputs:[{dims:l,dataType:a}],dispatchGroup:{x:Math.ceil(b/64)},programUniforms:[{type:12,data:b},...H(p,l)]})}},lo=(e,t)=>{let n=[];return e[1].dims[0]>0&&e[1].getBigInt64Array().forEach(r=>n.push(Number(r))),re({axes:n,keepDims:t.keepDims,noopWithEmptyAxes:t.noopWithEmptyAxes})},it=(e,t,n,r)=>{let o=e.inputs,a=o.length===1?n:lo(o,n);e.compute(Fr(t,{hint:a.cacheKey,inputDependencies:["rank"]},[o[0]],a.noopWithEmptyAxes&&a.axes.length===0?mh:r,a.axes,o[0].dataType,a.keepDims,a.noopWithEmptyAxes),{inputs:[0]})},fh=(e,t)=>{ot(e.inputs),it(e,"ReduceLogSum",t,(r,o)=>[`var value = ${o.type.storage}(0);`,"",`value += ${r.getByIndices("input_indices")};`,"value = log(value);"])},hh=(e,t)=>{ot(e.inputs),it(e,"ReduceL1",t,(r,o)=>[`var value = ${o.type.storage}(0);`,"",`value += abs(${r.getByIndices("input_indices")});`,""])},gh=(e,t)=>{ot(e.inputs),it(e,"ReduceL2",t,(r,o)=>[`var t = ${o.type.value}(0); var value = ${o.type.value}(0);`,"",`t = ${r.getByIndices("input_indices")}; value += (t * t);`,"value = sqrt(value);"])},yh=(e,t)=>{ot(e.inputs),it(e,"ReduceLogSumExp",t,(r,o)=>[`var value = ${o.type.storage}(0);`,"",`value += exp(${r.getByIndices("input_indices")});`,"value = log(value);"])},bh=(e,t)=>{ot(e.inputs),it(e,"ReduceMax",t,(r,o,a)=>{let s=[];for(let d=0;d=0||a.length===0)&&s.push(r.indicesSet("input_indices",d,0));return[`${s.join(` +`)}`,`var value = ${r.getByIndices("input_indices")};`,`value = max(value, ${r.getByIndices("input_indices")});`,""]})},_h=(e,t)=>{ot(e.inputs),it(e,"ReduceMean",t,(r,o,a)=>{let s=1;for(let d=0;d=0||a.length===0)&&(s*=e.inputs[0].dims[d]);return["var sum = f32(0);","",`sum += f32(${r.getByIndices("input_indices")});`,`let value = ${o.type.value}(sum / ${s});`]})},wh=(e,t)=>{ot(e.inputs),it(e,"ReduceMin",t,(r,o,a)=>{let s=[];for(let d=0;d=0||a.length===0)&&s.push(`input_indices[${d}] = 0;`);return[`${s.join(` +`)}`,`var value = ${r.getByIndices("input_indices")};`,`value = min(value, ${r.getByIndices("input_indices")});`,""]})},vh=(e,t)=>{ot(e.inputs),it(e,"ReduceProd",t,(r,o)=>[`var value = ${o.type.storage}(1);`,"",`value *= ${r.getByIndices("input_indices")};`,""])},$h=(e,t)=>{ot(e.inputs),it(e,"ReduceSum",t,(r,o)=>[`var value = ${o.type.storage}(0);`,"",`value += ${r.getByIndices("input_indices")};`,""])},xh=(e,t)=>{ot(e.inputs),it(e,"ReduceSumSquare",t,(r,o)=>[`var t = ${o.type.value}(0); var value = ${o.type.value}(0);`,"",`t = ${r.getByIndices("input_indices")}; value += t * t;`,""])},at=(e,t,n)=>{if(t.length===0)return n;let r=1,o=1;for(let a=0;a1024},au=(e,t)=>{at(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?_h(e,t):Zs(e,t)},su=(e,t)=>{at(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?hh(e,t):Qs(e,t)},uu=(e,t)=>{at(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?gh(e,t):Ys(e,t)},du=(e,t)=>{at(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?yh(e,t):Xs(e,t)},lu=(e,t)=>{at(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?bh(e,t):Js(e,t)},cu=(e,t)=>{at(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?wh(e,t):eu(e,t)},pu=(e,t)=>{at(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?vh(e,t):tu(e,t)},mu=(e,t)=>{at(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?$h(e,t):ru(e,t)},fu=(e,t)=>{at(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?xh(e,t):nu(e,t)},hu=(e,t)=>{at(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?fh(e,t):ou(e,t)}});var gu,yu,bu,co,_u=G(()=>{"use strict";te();Ce();Hr();gu=e=>{if(!e||e.length===0||e.length>2)throw new Error("ArgMinMaxOp op requires 1 or 2 inputs.");if(e[0].dataType!==1)throw new Error("Invalid input type.")},yu=(e,t)=>{gu(e.inputs);let n=(r,o,a)=>{let s=[];for(let d=0;d=0||a.length===0)&&s.push(`input_indices[${d}] = 0;`);return[`${s.join(` +`)}`,`var value = ${r.getByIndices("input_indices")}; +var best_index : i32 = 0;`,`if (${r.getByIndices("input_indices")} ${t.selectLastIndex>0?"<=":"<"} value) { + value = ${r.getByIndices("input_indices")}; + best_index = i32(last_index); + }`,"",o.setByOffset("global_idx","best_index")]};e.compute(Fr("ArgMin",{hint:t.cacheKey,inputDependencies:["rank"]},[e.inputs[0]],n,[t.axis],7,t.keepDims),{inputs:[0]})},bu=(e,t)=>{gu(e.inputs);let n=(r,o,a)=>{let s=[];for(let d=0;d=0||a.length===0)&&s.push(`input_indices[${d}] = 0;`);return[`${s.join(` +`)}`,`var value = ${r.getByIndices("input_indices")}; +var best_index : i32 = 0;`,`if (${r.getByIndices("input_indices")} ${t.selectLastIndex>0?">=":">"} value) { + value = ${r.getByIndices("input_indices")}; + best_index = i32(last_index); + }`,"",o.setByOffset("global_idx","best_index")]};e.compute(Fr("argMax",{hint:t.cacheKey,inputDependencies:["rank"]},[e.inputs[0]],n,[t.axis],7,t.keepDims),{inputs:[0]})},co=e=>re(e)});var Sh,po,Th,Ch,Ih,Ut,Ah,wu,qr=G(()=>{"use strict";te();ae();Vr();ce();Sh=(e,t)=>{let n=e[0],r=e[1],o=e[2],a=e[3],s=e[4],d=e[5];if(s&&d)throw new Error("Attention cannot have both past and attention_bias");if(n.dims.length!==3)throw new Error('Input "input" must have 3 dimensions');let l=n.dims[0],p=n.dims[1],f=n.dims[2];if(o.dims.length!==1)throw new Error('Input "bias" is expected to have 1 dimensions');if(r.dims.length!==2)throw new Error('Input "weights" is expected to have 2 dimensions');if(r.dims[0]!==f)throw new Error("Input 1 dimension 0 should have same length as dimension 2 of input 0");if(o.dims[0]!==r.dims[1])throw new Error('Input "bias" dimension 0 should have same length as dimension 1 of input "weights"');let h=o.dims[0]/3,y=h,_=y;if(t.qkvHiddenSizes.length>0){if(t.qkvHiddenSizes.length!==3)throw new Error("qkv_hidden_sizes attribute should have 3 elements");for(let T of t.qkvHiddenSizes)if(T%t.numHeads!==0)throw new Error("qkv_hidden_sizes should be divisible by num_heads");h=t.qkvHiddenSizes[0],y=t.qkvHiddenSizes[1],_=t.qkvHiddenSizes[2]}let b=p;if(h!==y)throw new Error("qkv_hidden_sizes first element should be same as the second");if(o.dims[0]!==h+y+_)throw new Error('Input "bias" dimension 0 should have same length as sum of Q/K/V hidden sizes');let w=0;if(s){if(y!==_)throw new Error('Input "past" expect k_hidden_size == v_hidden_size');if(s.dims.length!==5)throw new Error('Input "past" must have 5 dimensions');if(s.dims[0]!==2)throw new Error('Input "past" first dimension must be 2');if(s.dims[1]!==l)throw new Error('Input "past" second dimension must be batch_size');if(s.dims[2]!==t.numHeads)throw new Error('Input "past" third dimension must be num_heads');if(s.dims[4]!==y/t.numHeads)throw new Error('Input "past" fifth dimension must be k_hidden_size / num_heads');t.pastPresentShareBuffer||(w=s.dims[3])}let S=b+w,$=-1,v=0;if(a)throw new Error("Mask not supported");if(s)throw new Error("past is not supported");if(d){if(d.dims.length!==4)throw new Error('Input "attention_bias" must have 4 dimensions');if(d.dims[0]!==l||d.dims[1]!==t.numHeads||d.dims[2]!==p||d.dims[3]!==S)throw new Error('Expect "attention_bias" shape (batch_size, num_heads, sequence_length, total_sequence_length)')}return{batchSize:l,sequenceLength:p,pastSequenceLength:w,kvSequenceLength:b,totalSequenceLength:S,maxSequenceLength:$,inputHiddenSize:f,hiddenSize:h,vHiddenSize:_,headSize:Math.floor(h/t.numHeads),vHeadSize:Math.floor(_/t.numHeads),numHeads:t.numHeads,isUnidirectional:!1,pastPresentShareBuffer:!1,maskFilterValue:t.maskFilterValue,maskType:v,scale:t.scale,broadcastResPosBias:!1,passPastInKv:!1,qkvFormat:1}},po=(e,t,n)=>t&&e?` + let total_sequence_length_input = u32(${t.getByOffset("0")}); + let present_sequence_length = max(total_sequence_length_input, uniforms.past_sequence_length); + let is_subsequent_prompt: bool = sequence_length > 1 && sequence_length != total_sequence_length_input; + let is_first_prompt: bool = is_subsequent_prompt == false && sequence_length == total_sequence_length_input; + total_sequence_length = u32(${e?.getByOffset("batchIdx")}) + 1; + var past_sequence_length: u32 = 0; + if (is_first_prompt == false) { + past_sequence_length = total_sequence_length - sequence_length; + } + `:` + ${n?"let past_sequence_length = uniforms.past_sequence_length":""}; + let present_sequence_length = total_sequence_length; + `,Th=(e,t,n,r,o,a,s,d)=>{let l=ge(s?1:a),p=64,f=a/l;f{let v=N("x",e.dataType,e.dims,l),T=[v],C=s?P("seq_lens",s.dataType,s.dims):void 0;C&&T.push(C);let A=d?P("total_sequence_length_input",d.dataType,d.dims):void 0;A&&T.push(A);let k=ze(e.dataType),O=[{name:"batch_size",type:"u32"},{name:"num_heads",type:"u32"},{name:"past_sequence_length",type:"u32"},{name:"sequence_length",type:"u32"},{name:"total_sequence_length",type:"u32"},{name:"elements_per_thread",type:"u32"}];return` + var thread_max: array; + var thread_sum: array; + ${$.registerUniforms(O).declareVariables(...T)} + ${$.mainStart([p,1,1])} + let batchIdx = workgroup_id.z / uniforms.num_heads; + let headIdx = workgroup_id.z % uniforms.num_heads; + let sequence_length = uniforms.sequence_length; + var total_sequence_length = uniforms.total_sequence_length; + ${po(C,A,!1)} + let local_offset = local_idx * uniforms.elements_per_thread; + let offset = (global_idx / ${p}) * uniforms.total_sequence_length + local_offset; + let seq_causal_length = ${s?"u32(past_sequence_length + workgroup_id.y + 1)":"total_sequence_length"}; + var thread_max_vector = ${b}(-3.402823e+38f); + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + thread_max_vector = max(${b}(x[offset + i]), thread_max_vector); + } + thread_max[local_idx] = ${(()=>{switch(l){case 1:return"thread_max_vector";case 2:return"max(thread_max_vector.x, thread_max_vector.y)";case 4:return"max(max(thread_max_vector.x, thread_max_vector.y), max(thread_max_vector.z, thread_max_vector.w))";default:throw new Error(`Unsupported components: ${l}`)}})()}; + workgroupBarrier(); + + var max_value = f32(-3.402823e+38f); + for (var i = 0u; i < ${p}; i++) { + max_value = max(thread_max[i], max_value); + } + + var sum_vector = ${b}(0); + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + sum_vector += exp(${b}(x[offset + i]) - max_value); + } + thread_sum[local_idx] = ${(()=>{switch(l){case 1:return"sum_vector";case 2:return"sum_vector.x + sum_vector.y";case 4:return"sum_vector.x + sum_vector.y + sum_vector.z + sum_vector.w";default:throw new Error(`Unsupported components: ${l}`)}})()}; + workgroupBarrier(); + + var sum: f32 = 0; + for (var i = 0u; i < ${p}; i++) { + sum += thread_sum[i]; + } + + if (sum == 0) { + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + x[offset + i] = ${v.type.value}(${k}(1.0) / ${k}(seq_causal_length)); + } + } else { + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + var f32input = ${b}(x[offset + i]); + x[offset + i] = ${v.type.value}(exp(f32input - max_value) / sum); + } + } + ${s?` + for (var total_seq_id: u32 = seq_causal_length; total_seq_id + local_offset < uniforms.total_sequence_length; total_seq_id++) { + x[offset + total_seq_id] = ${v.type.value}(${k}(0)); + }`:""}; + }`};return{name:"AttentionProbsSoftmax",shaderCache:{hint:`${p};${_};${l}`,inputDependencies:w},getShaderSource:S,getRunData:()=>({outputs:[],dispatchGroup:{x:Math.ceil(a/p),y:o,z:t*n},programUniforms:y})}},Ch=(e,t,n,r,o,a,s,d,l)=>{let p=s+a.kvSequenceLength,f=[a.batchSize,a.numHeads,a.sequenceLength,p],h=e>1&&r,y=a.kvNumHeads?a.kvNumHeads:a.numHeads,_=h?[a.batchSize,y,p,a.headSize]:void 0,b=a.nReps?a.nReps:1,w=a.scale===0?1/Math.sqrt(a.headSize):a.scale,S=ge(a.headSize),$=a.headSize/S,v=12,T={x:Math.ceil(p/v),y:Math.ceil(a.sequenceLength/v),z:a.batchSize*a.numHeads},C=[{type:12,data:a.sequenceLength},{type:12,data:$},{type:12,data:p},{type:12,data:a.numHeads},{type:12,data:a.headSize},{type:1,data:w},{type:12,data:s},{type:12,data:a.kvSequenceLength},{type:12,data:b}],A=h&&r&&E.size(r.dims)>0,k=["type","type"];A&&k.push("type"),o&&k.push("type"),d&&k.push("type"),l&&k.push("type");let O=[{dims:f,dataType:t.dataType,gpuDataType:0}];h&&O.push({dims:_,dataType:t.dataType,gpuDataType:0});let M=V=>{let F=P("q",t.dataType,t.dims,S),j=P("key",n.dataType,n.dims,S),ne=[F,j];if(A){let Z=P("past_key",r.dataType,r.dims,S);ne.push(Z)}o&&ne.push(P("attention_bias",o.dataType,o.dims));let W=d?P("seq_lens",d.dataType,d.dims):void 0;W&&ne.push(W);let J=l?P("total_sequence_length_input",l.dataType,l.dims):void 0;J&&ne.push(J);let ve=N("output",t.dataType,f),Q=[ve];h&&Q.push(N("present_key",t.dataType,_,S));let ee=ze(1,S),le=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"alpha",type:"f32"},{name:"past_sequence_length",type:"u32"},{name:"kv_sequence_length",type:"u32"},{name:"n_reps",type:"u32"}];return` + const TILE_SIZE = ${v}u; + + var tileQ: array<${F.type.storage}, ${v*v}>; + var tileK: array<${F.type.storage}, ${v*v}>; + ${V.registerUniforms(le).declareVariables(...ne,...Q)} + ${V.mainStart([v,v,1])} + // x holds the N and y holds the M + let headIdx = workgroup_id.z % uniforms.num_heads; + let kvHeadIdx = ${b===1?"headIdx":"headIdx / uniforms.n_reps"}; + let kv_num_heads = ${b===1?"uniforms.num_heads":"uniforms.num_heads / uniforms.n_reps"}; + let batchIdx = workgroup_id.z / uniforms.num_heads; + let m = workgroup_id.y * TILE_SIZE; + let n = workgroup_id.x * TILE_SIZE; + let sequence_length = uniforms.M; + var total_sequence_length = uniforms.N; + ${po(W,J,!0)} + let absKvHeadIdx = batchIdx * kv_num_heads + kvHeadIdx; + let qOffset = workgroup_id.z * uniforms.M * uniforms.K + m * uniforms.K; + ${A&&h?"let pastKeyOffset = absKvHeadIdx * uniforms.past_sequence_length * uniforms.K;":""}; + let kOffset = absKvHeadIdx * uniforms.kv_sequence_length * uniforms.K; + ${h?"let presentKeyOffset = absKvHeadIdx * uniforms.N * uniforms.K;":""} + var value = ${ee}(0); + for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { + if (global_id.y < uniforms.M && w + local_id.x < uniforms.K) { + tileQ[TILE_SIZE * local_id.y + local_id.x] = q[qOffset + local_id.y * uniforms.K + w + local_id.x]; + } + if (n + local_id.y < uniforms.N && w + local_id.x < uniforms.K) { + var idx = TILE_SIZE * local_id.y + local_id.x; + ${A&&h?` + if (n + local_id.y < past_sequence_length) { + tileK[idx] = past_key[pastKeyOffset + (n + local_id.y) * uniforms.K + w + local_id.x]; + } else if (n + local_id.y - past_sequence_length < uniforms.kv_sequence_length) { + tileK[idx] = key[kOffset + (n + local_id.y - past_sequence_length) * uniforms.K + w + local_id.x]; + }`:` + if (n + local_id.y < uniforms.kv_sequence_length) { + tileK[idx] = key[kOffset + (n + local_id.y) * uniforms.K + w + local_id.x]; + }`} + ${h?`if (n + local_id.y < present_sequence_length) { + present_key[presentKeyOffset + (n + local_id.y) * uniforms.K + w + local_id.x] = tileK[idx]; + }`:""} + } + workgroupBarrier(); + + for (var k: u32 = 0u; k < TILE_SIZE && w+k < uniforms.K; k++) { + value += ${ee}(tileQ[TILE_SIZE * local_id.y + k] * tileK[TILE_SIZE * local_id.x + k]); + } + + workgroupBarrier(); + } + + if (global_id.y < uniforms.M && global_id.x < total_sequence_length) { + let headOffset = workgroup_id.z * uniforms.M * uniforms.N; + let outputIdx = headOffset + global_id.y * uniforms.N + global_id.x; + var sum: f32 = ${(()=>{switch(S){case 1:return"value";case 2:return"value.x + value.y";case 4:return"value.x + value.y + value.z + value.w";default:throw new Error(`Unsupported components: ${S}`)}})()}; + output[outputIdx] = ${ve.type.value} (sum * uniforms.alpha) + ${o?"attention_bias[outputIdx]":"0.0"}; + } + }`};return{name:"AttentionProbs",shaderCache:{hint:`${S};${o!==void 0};${r!==void 0};${e}`,inputDependencies:k},getRunData:()=>({outputs:O,dispatchGroup:T,programUniforms:C}),getShaderSource:M}},Ih=(e,t,n,r,o,a,s=void 0,d=void 0)=>{let l=a+o.kvSequenceLength,p=o.nReps?o.nReps:1,f=o.vHiddenSize*p,h=e>1&&r,y=o.kvNumHeads?o.kvNumHeads:o.numHeads,_=h?[o.batchSize,y,l,o.headSize]:void 0,b=[o.batchSize,o.sequenceLength,f],w=12,S={x:Math.ceil(o.vHeadSize/w),y:Math.ceil(o.sequenceLength/w),z:o.batchSize*o.numHeads},$=[{type:12,data:o.sequenceLength},{type:12,data:l},{type:12,data:o.vHeadSize},{type:12,data:o.numHeads},{type:12,data:o.headSize},{type:12,data:f},{type:12,data:a},{type:12,data:o.kvSequenceLength},{type:12,data:p}],v=h&&r&&E.size(r.dims)>0,T=["type","type"];v&&T.push("type"),s&&T.push("type"),d&&T.push("type");let C=[{dims:b,dataType:t.dataType,gpuDataType:0}];h&&C.push({dims:_,dataType:t.dataType,gpuDataType:0});let A=k=>{let O=P("probs",t.dataType,t.dims),M=P("v",n.dataType,n.dims),V=[O,M];v&&V.push(P("past_value",r.dataType,r.dims));let F=s?P("seq_lens",s.dataType,s.dims):void 0;s&&V.push(F);let j=d?P("total_sequence_length_input",d.dataType,d.dims):void 0;d&&V.push(j);let W=[N("output",t.dataType,b)];h&&W.push(N("present_value",t.dataType,_));let J=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"v_hidden_size",type:"u32"},{name:"past_sequence_length",type:"u32"},{name:"kv_sequence_length",type:"u32"},{name:"n_reps",type:"u32"}];return` + const TILE_SIZE = ${w}u; + var tileQ: array<${O.type.value}, ${w*w}>; + var tileV: array<${O.type.value}, ${w*w}>; + ${k.registerUniforms(J).declareVariables(...V,...W)} + ${k.mainStart([w,w,1])} + let headIdx = workgroup_id.z % uniforms.num_heads; + let batchIdx = workgroup_id.z / uniforms.num_heads; + let kvHeadIdx = ${p===1?"headIdx":"headIdx / uniforms.n_reps"}; + let kv_num_heads = ${p===1?"uniforms.num_heads":"uniforms.num_heads / uniforms.n_reps"}; + let m = global_id.y; + let n = global_id.x; + let sequence_length = uniforms.M; + var total_sequence_length = uniforms.K; + ${po(F,j,!0)} + let offsetA = workgroup_id.z * uniforms.M * uniforms.K + m * uniforms.K; + let absKvHeadIdx = batchIdx * kv_num_heads + kvHeadIdx; // kvHeadIdx is relative to the batch + ${v&&h?"let pastValueOffset = absKvHeadIdx * uniforms.N * uniforms.past_sequence_length + n;":""}; + let vOffset = absKvHeadIdx * uniforms.N * uniforms.kv_sequence_length + n; + ${h?"let presentValueOffset = absKvHeadIdx * uniforms.N * uniforms.K + n;":""} + var value = ${O.type.storage}(0); + for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { + if (m < uniforms.M && w + local_id.x < uniforms.K) { + tileQ[TILE_SIZE * local_id.y + local_id.x] = probs[offsetA + w + local_id.x]; + } + if (n < uniforms.N && w + local_id.y < uniforms.K) { + var idx = TILE_SIZE * local_id.y + local_id.x; + ${v&&h?` + if (w + local_id.y < past_sequence_length) { + tileV[idx] = past_value[pastValueOffset + (w + local_id.y) * uniforms.N]; + } else if (w + local_id.y - past_sequence_length < uniforms.kv_sequence_length) { + tileV[idx] = v[vOffset + (w + local_id.y - past_sequence_length) * uniforms.N]; + } + `:` + if (w + local_id.y < uniforms.kv_sequence_length) { + tileV[idx] = v[vOffset + (w + local_id.y) * uniforms.N]; + }`} + ${h?` + if (w + local_id.y < present_sequence_length) { + present_value[presentValueOffset + (w + local_id.y) * uniforms.N] = tileV[idx]; + }`:""} + } + workgroupBarrier(); + for (var k: u32 = 0u; k < TILE_SIZE && w+k < total_sequence_length; k++) { + value += tileQ[TILE_SIZE * local_id.y + k] * tileV[TILE_SIZE * k + local_id.x]; + } + workgroupBarrier(); + } + + // we need to transpose output from BNSH_v to BSND_v + if (m < uniforms.M && n < uniforms.N) { + let outputIdx = batchIdx * uniforms.M * uniforms.v_hidden_size + m * uniforms.v_hidden_size + + headIdx * uniforms.N + n; + output[outputIdx] = value; + } + }`};return{name:"AttentionScore",shaderCache:{hint:`${r!==void 0};${e}`,inputDependencies:T},getRunData:()=>({outputs:C,dispatchGroup:S,programUniforms:$}),getShaderSource:A}},Ut=(e,t,n,r,o,a,s,d,l,p,f=void 0,h=void 0)=>{let y=Math.min(e.outputCount,1+(s?1:0)+(d?1:0)),_=y>1?p.pastSequenceLength:0,b=_+p.kvSequenceLength,w=l&&E.size(l.dims)>0?l:void 0,S=[t,n];y>1&&s&&E.size(s.dims)>0&&S.push(s),w&&S.push(w),f&&S.push(f),h&&S.push(h);let $=e.compute(Ch(y,t,n,s,w,p,_,f,h),{inputs:S,outputs:y>1?[-1,1]:[-1]})[0];e.compute(Th($,p.batchSize,p.numHeads,_,p.sequenceLength,b,f,h),{inputs:f&&h?[$,f,h]:[$],outputs:[]});let v=[$,r];y>1&&d&&E.size(d.dims)>0&&v.push(d),f&&v.push(f),h&&v.push(h),e.compute(Ih(y,$,r,d,p,_,f,h),{inputs:v,outputs:y>1?[0,2]:[0]})},Ah=(e,t)=>{let n=[t.batchSize,t.numHeads,t.sequenceLength,t.headSize],r=t.sequenceLength,o=t.inputHiddenSize,a=t.headSize,s=12,d={x:Math.ceil(t.headSize/s),y:Math.ceil(t.sequenceLength/s),z:t.batchSize*t.numHeads},l=[e.inputs[0],e.inputs[1],e.inputs[2]],p=[{type:12,data:r},{type:12,data:o},{type:12,data:a},{type:12,data:t.numHeads},{type:12,data:t.headSize},{type:12,data:t.hiddenSize},{type:12,data:t.hiddenSize+t.hiddenSize+t.vHiddenSize}],f=h=>{let y=N("output_q",l[0].dataType,n),_=N("output_k",l[0].dataType,n),b=N("output_v",l[0].dataType,n),w=P("input",l[0].dataType,l[0].dims),S=P("weight",l[1].dataType,l[1].dims),$=P("bias",l[2].dataType,l[2].dims),v=w.type.storage,T=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"hidden_size",type:"u32"},{name:"ldb",type:"u32"}];return` + const TILE_SIZE = ${s}u; + var tileInput: array<${v}, ${s*s}>; + var tileWeightQ: array<${v}, ${s*s}>; + var tileWeightK: array<${v}, ${s*s}>; + var tileWeightV: array<${v}, ${s*s}>; + ${h.registerUniforms(T).declareVariables(w,S,$,y,_,b)} + ${h.mainStart([s,s,1])} + let batchIndex = workgroup_id.z / uniforms.num_heads; + let headNumber = workgroup_id.z % uniforms.num_heads; + let m = global_id.y; + let n = global_id.x; + + let inputOffset = batchIndex * (uniforms.M * uniforms.K) + m * uniforms.K; + let biasOffsetQ = headNumber * uniforms.head_size; + let biasOffsetK = uniforms.hidden_size + biasOffsetQ; + let biasOffsetV = uniforms.hidden_size + biasOffsetK; + + var valueQ = ${v}(0); + var valueK = ${v}(0); + var valueV = ${v}(0); + for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { + if (m < uniforms.M && w + local_id.x < uniforms.K) { + tileInput[TILE_SIZE * local_id.y + local_id.x] = input[inputOffset + w + local_id.x]; + } + if (n < uniforms.N && w + local_id.y < uniforms.K) { + let offset = n + (w + local_id.y) * uniforms.ldb; + tileWeightQ[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetQ + offset]; + tileWeightK[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetK + offset]; + tileWeightV[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetV + offset]; + } + workgroupBarrier(); + for (var k: u32 = 0u; k({outputs:[{dims:n,dataType:e.inputs[0].dataType,gpuDataType:0},{dims:n,dataType:e.inputs[0].dataType,gpuDataType:0},{dims:n,dataType:e.inputs[0].dataType,gpuDataType:0}],dispatchGroup:d,programUniforms:p}),getShaderSource:f},{inputs:l,outputs:[-1,-1,-1]})},wu=(e,t)=>{let n=Sh(e.inputs,t),[r,o,a]=Ah(e,n);return Ut(e,r,o,a,e.inputs[4],void 0,void 0,void 0,e.inputs[5],n)}});var kh,Eh,Ph,vu,$u=G(()=>{"use strict";Ge();te();ae();Ce();ce();kh=(e,t)=>{if(!e||e.length!==5)throw new Error("BatchNormalization requires 5 inputs");let n=(r,o,a)=>{let s=o.length;if(s!==r.length)throw new Error(`${a}: num dimensions != ${s}`);o.forEach((d,l)=>{if(d!==r[l])throw new Error(`${a}: dim[${l}] do not match`)})};if(e[0].dims.length>1){let r=t.format==="NHWC"?t.spatial?e[0].dims.slice(-1):e[0].dims.slice(-1).concat(e[0].dims.slice(1,e[0].dims.length-1)):e[0].dims.slice(1,t.spatial?2:void 0);n(e[1].dims,r,"Invalid input scale"),n(e[2].dims,r,"Invalid input B"),n(e[3].dims,r,"Invalid input mean"),n(e[4].dims,r,"Invalid input var")}else n(e[1].dims,[1],"Invalid input scale"),n(e[2].dims,[1],"Invalid input B"),n(e[3].dims,[1],"Invalid input mean"),n(e[4].dims,[1],"Invalid input var")},Eh=(e,t)=>{let{epsilon:n,spatial:r,format:o}=t,a=e[0].dims,s=r?ge(a[a.length-1]):1,d=o==="NHWC"&&a.length>1?s:1,l=E.size(a)/s,p=r,f=p?a.length:a,h=P("x",e[0].dataType,e[0].dims,s),y=P("scale",e[1].dataType,e[1].dims,d),_=P("bias",e[2].dataType,e[2].dims,d),b=P("inputMean",e[3].dataType,e[3].dims,d),w=P("inputVar",e[4].dataType,e[4].dims,d),S=N("y",e[0].dataType,f,s),$=()=>{let T="";if(r)T=`let cOffset = ${a.length===1?"0u":o==="NHWC"?`outputIndices[${a.length-1}] / ${s}`:"outputIndices[1]"};`;else if(o==="NCHW")T=` + ${S.indicesSet("outputIndices","0","0")} + let cOffset = ${S.indicesToOffset("outputIndices")};`;else{T=`var cIndices = ${y.type.indices}(0); + cIndices[0] = outputIndices[${a.length-1}];`;for(let C=1;C` + const epsilon = ${n}; + ${T.registerUniform("outputSize","u32").declareVariables(h,y,_,b,w,S)} + ${T.mainStart()} + ${T.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + var outputIndices = ${S.offsetToIndices(`global_idx * ${s}`)}; + ${$()} + let scale = ${y.getByOffset("cOffset")}; + let bias = ${_.getByOffset("cOffset")}; + let inputMean = ${b.getByOffset("cOffset")}; + let inputVar = ${w.getByOffset("cOffset")}; + let x = ${h.getByOffset("global_idx")}; + let value = (x - inputMean) * inverseSqrt(inputVar + epsilon) * scale + bias; + ${S.setByOffset("global_idx","value")} + }`;return{name:"BatchNormalization",shaderCache:{hint:`${t.epsilon}_${t.format}_${r}_${s}`,inputDependencies:p?["rank","type","type","type","type"]:void 0},getShaderSource:v,getRunData:()=>({outputs:[{dims:e[0].dims,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(l/64)},programUniforms:p?[{type:12,data:l},...H(a)]:[{type:12,data:l}]})}},Ph=e=>re(e),vu=(e,t)=>{let{inputs:n,outputCount:r}=e,o=Ph({...t,outputCount:r});if(we.webgpu.validateInputContent&&kh(n,o),t.trainingMode)throw new Error("BatchNormalization trainingMode is not supported yet.");e.compute(Eh(n,o))}});var zh,Oh,xu,Su=G(()=>{"use strict";ae();ce();zh=e=>{if(e[0].dims.length!==3)throw new Error("input should have 3 dimensions");if(![320,640,1280].includes(e[0].dims[2]))throw new Error("number of channels should be 320, 640 or 1280");if(e[1].dims.length!==1)throw new Error("bias is expected to have 1 dimensions");if(e[0].dims[2]!==e[1].dims[0])throw new Error("last dimension of input and bias are not the same")},Oh=e=>{let t=e[0].dims,n=e[0].dims[2],r=E.size(t)/4,o=e[0].dataType,a=P("input",o,t,4),s=P("bias",o,[n],4),d=P("residual",o,t,4),l=N("output",o,t,4);return{name:"BiasAdd",getRunData:()=>({outputs:[{dims:t,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(r/64)}}),getShaderSource:f=>` + const channels = ${n}u / 4; + ${f.declareVariables(a,s,d,l)} + + ${f.mainStart()} + ${f.guardAgainstOutOfBoundsWorkgroupSizes(r)} + let value = ${a.getByOffset("global_idx")} + + ${s.getByOffset("global_idx % channels")} + ${d.getByOffset("global_idx")}; + ${l.setByOffset("global_idx","value")} + }`}},xu=e=>{zh(e.inputs),e.compute(Oh(e.inputs))}});var Dh,ye,Tu,Cu,Iu,Au,ku,Eu,Pu,zu,Ou,Bh,Du,Bu,Mu,Ru,tr,Uu,Kr,Nu,Vu,Wu,Lu,Gu,Hu,Fu,qu,Ku,ju,Zu,Qu,Yu,Xu,Ju,ed,td,rd,mo,fo,nd,od,id,Mh,Rh,ad,jr=G(()=>{"use strict";te();ae();Ce();ce();Dh=(e,t,n,r,o,a,s)=>{let d=Math.ceil(t/4),l="";typeof o=="string"?l=`${o}(a)`:l=o("a");let p=P("inputData",n,[d],4),f=N("outputData",r,[d],4),h=[{name:"vec_size",type:"u32"}];return s&&h.push(...s),` + ${e.registerUniforms(h).declareVariables(p,f)} + + ${a??""} + + ${e.mainStart()} + ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + + let a = ${p.getByOffset("global_idx")}; + ${f.setByOffset("global_idx",l)} + }`},ye=(e,t,n,r,o,a=e.dataType,s,d)=>{let l=[{type:12,data:Math.ceil(E.size(e.dims)/4)}];return s&&l.push(...s),{name:t,shaderCache:{hint:o,inputDependencies:["type"]},getShaderSource:p=>Dh(p,E.size(e.dims),e.dataType,a,n,r,d),getRunData:p=>({outputs:[{dims:e.dims,dataType:a}],dispatchGroup:{x:Math.ceil(E.size(p[0].dims)/64/4)},programUniforms:l})}},Tu=e=>{e.compute(ye(e.inputs[0],"Abs","abs"))},Cu=e=>{e.compute(ye(e.inputs[0],"Acos","acos"))},Iu=e=>{e.compute(ye(e.inputs[0],"Acosh","acosh"))},Au=e=>{e.compute(ye(e.inputs[0],"Asin","asin"))},ku=e=>{e.compute(ye(e.inputs[0],"Asinh","asinh"))},Eu=e=>{e.compute(ye(e.inputs[0],"Atan","atan"))},Pu=e=>{e.compute(ye(e.inputs[0],"Atanh","atanh"))},zu=e=>re(e),Ou=(e,t)=>{let n;switch(t.to){case 10:n="vec4";break;case 1:n="vec4";break;case 12:n="vec4";break;case 6:n="vec4";break;case 9:n="vec4";break;default:throw new RangeError(`not supported type (specified in attribute 'to' from 'Cast' operator): ${t.to}`)}e.compute(ye(e.inputs[0],"Cast",n,void 0,t.cacheKey,t.to))},Bh=e=>{let t,n,r=e.length>=2&&e[1].data!==0,o=e.length>=3&&e[2].data!==0;switch(e[0].dataType){case 1:t=r?e[1].getFloat32Array()[0]:-34028234663852886e22,n=o?e[2].getFloat32Array()[0]:34028234663852886e22;break;case 10:t=r?e[1].getUint16Array()[0]:64511,n=o?e[2].getUint16Array()[0]:31743;break;default:throw new Error("Unsupport data type")}return re({min:t,max:n})},Du=(e,t)=>{let n=t||Bh(e.inputs),r=ze(e.inputs[0].dataType);e.compute(ye(e.inputs[0],"Clip",o=>`clamp(${o}, vec4<${r}>(uniforms.min), vec4<${r}>(uniforms.max))`,void 0,n.cacheKey,void 0,[{type:e.inputs[0].dataType,data:n.min},{type:e.inputs[0].dataType,data:n.max}],[{name:"min",type:r},{name:"max",type:r}]),{inputs:[0]})},Bu=e=>{e.compute(ye(e.inputs[0],"Ceil","ceil"))},Mu=e=>{e.compute(ye(e.inputs[0],"Cos","cos"))},Ru=e=>{e.compute(ye(e.inputs[0],"Cosh","cosh"))},tr=e=>re(e),Uu=(e,t)=>{let n=ze(e.inputs[0].dataType);e.compute(ye(e.inputs[0],"Elu",r=>`elu_vf32(${r})`,` + const elu_alpha_ = ${n}(${t.alpha}); + + fn elu_f32(a: ${n}) -> ${n} { + return select((exp(a) - 1.0) * elu_alpha_, a, a >= 0.0); + } + + fn elu_vf32(v: vec4<${n}>) -> vec4<${n}> { + return vec4(elu_f32(v.x), elu_f32(v.y), elu_f32(v.z), elu_f32(v.w)); + }`,t.cacheKey))},Kr=(e="f32")=>` +const r0: ${e} = 0.3275911; +const r1: ${e} = 0.254829592; +const r2: ${e} = -0.284496736; +const r3: ${e} = 1.421413741; +const r4: ${e} = -1.453152027; +const r5: ${e} = 1.061405429; + +fn erf_vf32(v: vec4<${e}>) -> vec4<${e}> { + let absv = abs(v); + let x = 1.0 / (1.0 + r0 * absv); + return sign(v) * (1.0 - ((((r5 * x + r4) * x + r3) * x + r2) * x + r1) * x * exp(-absv * absv)); +}`,Nu=e=>{let t=ze(e.inputs[0].dataType);e.compute(ye(e.inputs[0],"Erf",n=>`erf_vf32(${n})`,Kr(t)))},Vu=e=>{e.compute(ye(e.inputs[0],"Exp","exp"))},Wu=e=>{e.compute(ye(e.inputs[0],"Floor","floor"))},Lu=e=>{let t=ze(e.inputs[0].dataType);e.compute(ye(e.inputs[0],"Gelu",n=>`0.5 * ${n} * (1.0 + erf_vf32(${n} * 0.7071067811865475))`,Kr(t)))},Gu=(e,t)=>{let n=ze(e.inputs[0].dataType);e.compute(ye(e.inputs[0],"LeakyRelu",r=>`select(leaky_relu_alpha_ * ${r}, ${r}, ${r} >= vec4<${n}>(0.0))`,`const leaky_relu_alpha_ = ${n}(${t.alpha});`,t.cacheKey))},Hu=e=>{e.compute(ye(e.inputs[0],"Not",t=>`!${t}`))},Fu=e=>{e.compute(ye(e.inputs[0],"Neg",t=>`-${t}`))},qu=e=>{e.compute(ye(e.inputs[0],"Reciprocal",t=>`1.0/${t}`))},Ku=e=>{let t=ze(e.inputs[0].dataType);e.compute(ye(e.inputs[0],"Relu",n=>`select(vec4<${t}>(0.0), ${n}, ${n} > vec4<${t}>(0.0))`))},ju=e=>{e.compute(ye(e.inputs[0],"Sigmoid",t=>`(1.0 / (1.0 + exp(-${t})))`))},Zu=e=>re(e),Qu=(e,t)=>{let n=ze(e.inputs[0].dataType);e.compute(ye(e.inputs[0],"HardSigmoid",r=>`max(vec4<${n}>(0.0), min(vec4<${n}>(1.0), ${t.alpha} * ${r} + vec4<${n}>(${t.beta})))`,void 0,t.cacheKey))},Yu=e=>{e.compute(ye(e.inputs[0],"Sin","sin"))},Xu=e=>{e.compute(ye(e.inputs[0],"Sinh","sinh"))},Ju=e=>{e.compute(ye(e.inputs[0],"Sqrt","sqrt"))},ed=e=>{e.compute(ye(e.inputs[0],"Tan","tan"))},td=e=>`sign(${e}) * (1 - exp(-2 * abs(${e}))) / (1 + exp(-2 * abs(${e})))`,rd=e=>{e.compute(ye(e.inputs[0],"Tanh",td))},mo=(e="f32")=>` +const fast_gelu_a: ${e} = 0.5; +const fast_gelu_b: ${e} = 0.7978845608028654; +const fast_gelu_c: ${e} = 0.035677408136300125; + +fn tanh_v(v: vec4<${e}>) -> vec4<${e}> { + return ${td("v")}; +} +`,fo=e=>`(fast_gelu_a + fast_gelu_a * tanh_v(${e} * (fast_gelu_c * ${e} * ${e} + fast_gelu_b))) * ${e}`,nd=e=>{let t=ze(e.inputs[0].dataType);e.compute(ye(e.inputs[0],"FastGelu",fo,mo(t),void 0,e.inputs[0].dataType))},od=(e,t)=>{let n=ze(e.inputs[0].dataType);return e.compute(ye(e.inputs[0],"ThresholdedRelu",r=>`select(vec4<${n}>(0.0), ${r}, ${r} > thresholded_relu_alpha_)`,`const thresholded_relu_alpha_ = vec4<${n}>(${t.alpha});`,t.cacheKey)),0},id=e=>{e.compute(ye(e.inputs[0],"Log","log"))},Mh=(e,t)=>` +const alpha = vec4<${e}>(${t}); +const one = ${e}(1.0); +const zero = ${e}(0.0); + +fn quick_gelu_impl(x: vec4<${e}>) -> vec4<${e}> { + let v = x *alpha; + var x1 : vec4<${e}>; + for (var i = 0; i < 4; i = i + 1) { + if (v[i] >= zero) { + x1[i] = one / (one + exp(-v[i])); + } else { + x1[i] = one - one / (one + exp(v[i])); + } + } + return x * x1; +} +`,Rh=e=>`quick_gelu_impl(${e})`,ad=(e,t)=>{let n=ze(e.inputs[0].dataType);e.compute(ye(e.inputs[0],"QuickGelu",Rh,Mh(n,t.alpha),t.cacheKey,e.inputs[0].dataType))}});var Uh,Nh,ud,dd=G(()=>{"use strict";ae();ce();jr();Uh=e=>{if(e[0].dims.length!==3)throw new Error("input should have 3 dimensions");if(![2560,5120,10240].includes(e[0].dims[2]))throw new Error("hidden state should be 2560, 5120 or 10240");if(e[1].dims.length!==1)throw new Error("bias is expected to have 1 dimensions");if(e[0].dims[2]!==e[1].dims[0])throw new Error("last dimension of input and bias are not the same")},Nh=e=>{let t=e[0].dims.slice();t[2]=t[2]/2;let n=P("input",e[0].dataType,e[0].dims,4),r=P("bias",e[0].dataType,[e[0].dims[2]],4),o=N("output",e[0].dataType,t,4),a=E.size(t)/4,s=_e(e[0].dataType);return{name:"BiasSplitGelu",getRunData:()=>({outputs:[{dims:t,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(a/64)}}),getShaderSource:l=>` + const M_SQRT2 = sqrt(2.0); + const halfChannels = ${e[0].dims[2]/4/2}u; + + ${l.declareVariables(n,r,o)} + + ${Kr(s)} + + ${l.mainStart()} + ${l.guardAgainstOutOfBoundsWorkgroupSizes(a)} + let biasIdx = global_idx % halfChannels; + let batchIndex = global_idx / halfChannels; + let inputOffset = biasIdx + batchIndex * halfChannels * 2; + let valueLeft = input[inputOffset] + bias[biasIdx]; + let valueRight = input[inputOffset + halfChannels] + bias[biasIdx + halfChannels]; + let geluRight = valueRight * 0.5 * (erf_vf32(valueRight / M_SQRT2) + 1); + + ${o.setByOffset("global_idx","valueLeft * geluRight")} + }`}},ud=e=>{Uh(e.inputs),e.compute(Nh(e.inputs))}});var Vh,Wh,st,ld,cd,pd,md,fd,hd,gd,yd,bd,_d,wd=G(()=>{"use strict";te();ae();ce();Vh=(e,t,n,r,o,a,s,d,l,p,f,h)=>{let y,_;typeof d=="string"?y=_=(v,T)=>`${d}((${v}),(${T}))`:typeof d=="function"?y=_=d:(y=d.scalar,_=d.vector);let b=N("outputData",f,r.length,4),w=P("aData",l,t.length,4),S=P("bData",p,n.length,4),$;if(o)if(a){let v=E.size(t)===1,T=E.size(n)===1,C=t.length>0&&t[t.length-1]%4===0,A=n.length>0&&n[n.length-1]%4===0;v||T?$=b.setByOffset("global_idx",_(v?`${w.type.value}(${w.getByOffset("0")}.x)`:w.getByOffset("global_idx"),T?`${S.type.value}(${S.getByOffset("0")}.x)`:S.getByOffset("global_idx"))):$=` + let outputIndices = ${b.offsetToIndices("global_idx * 4u")}; + let offsetA = ${w.broadcastedIndicesToOffset("outputIndices",b)}; + let offsetB = ${S.broadcastedIndicesToOffset("outputIndices",b)}; + ${b.setByOffset("global_idx",_(s||C?w.getByOffset("offsetA / 4u"):`${w.type.value}(${w.getByOffset("offsetA / 4u")}[offsetA % 4u])`,s||A?S.getByOffset("offsetB / 4u"):`${S.type.value}(${S.getByOffset("offsetB / 4u")}[offsetB % 4u])`))} + `}else $=b.setByOffset("global_idx",_(w.getByOffset("global_idx"),S.getByOffset("global_idx")));else{if(!a)throw new Error("no necessary to use scalar implementation for element-wise binary op implementation.");let v=(T,C,A="")=>{let k=`aData[indexA${C}][componentA${C}]`,O=`bData[indexB${C}][componentB${C}]`;return` + let outputIndices${C} = ${b.offsetToIndices(`global_idx * 4u + ${C}u`)}; + let offsetA${C} = ${w.broadcastedIndicesToOffset(`outputIndices${C}`,b)}; + let offsetB${C} = ${S.broadcastedIndicesToOffset(`outputIndices${C}`,b)}; + let indexA${C} = offsetA${C} / 4u; + let indexB${C} = offsetB${C} / 4u; + let componentA${C} = offsetA${C} % 4u; + let componentB${C} = offsetB${C} % 4u; + ${T}[${C}] = ${A}(${y(k,O)}); + `};f===9?$=` + var data = vec4(0); + ${v("data",0,"u32")} + ${v("data",1,"u32")} + ${v("data",2,"u32")} + ${v("data",3,"u32")} + outputData[global_idx] = dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(data));`:$=` + ${v("outputData[global_idx]",0)} + ${v("outputData[global_idx]",1)} + ${v("outputData[global_idx]",2)} + ${v("outputData[global_idx]",3)} + `}return` + ${e.registerUniform("vec_size","u32").declareVariables(w,S,b)} + + ${h??""} + + ${e.mainStart()} + ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + ${$} + }`},Wh=(e,t,n,r,o,a,s=n.dataType)=>{let d=n.dims.map(w=>Number(w)??1),l=r.dims.map(w=>Number(w)??1),p=!E.areEqual(d,l),f=d,h=E.size(d),y=!1,_=!1,b=[p];if(p){let w=rt.calcShape(d,l,!1);if(!w)throw new Error("Can't perform binary op on the given tensors");f=w.slice(),h=E.size(f);let S=E.size(d)===1,$=E.size(l)===1,v=d.length>0&&d[d.length-1]%4===0,T=l.length>0&&l[l.length-1]%4===0;b.push(S),b.push($),b.push(v),b.push(T);let C=1;for(let A=1;Aw.toString()).join("_"),inputDependencies:["rank","rank"]},getShaderSource:w=>Vh(w,d,l,f,y,p,_,o,n.dataType,r.dataType,s,a),getRunData:()=>({outputs:[{dims:f,dataType:s}],dispatchGroup:{x:Math.ceil(h/64/4)},programUniforms:[{type:12,data:Math.ceil(E.size(f)/4)},...H(d,l,f)]})}},st=(e,t,n,r,o,a)=>{e.compute(Wh(t,o??"",e.inputs[0],e.inputs[1],n,r,a))},ld=e=>{st(e,"Add",(t,n)=>`${t}+${n}`)},cd=e=>{st(e,"Div",(t,n)=>`${t}/${n}`)},pd=e=>{st(e,"Equal",{scalar:(t,n)=>`u32(${t}==${n})`,vector:(t,n)=>`vec4(${t}==${n})`},void 0,void 0,9)},md=e=>{st(e,"Mul",(t,n)=>`${t}*${n}`)},fd=e=>{let t=P("input",e.inputs[0].dataType,e.inputs[0].dims).type.value;st(e,"Pow",{scalar:(r,o)=>`pow_custom(${r},${o})`,vector:(r,o)=>`pow_vector_custom(${r},${o})`},` + fn pow_custom(a : ${t}, b : ${t}) -> ${t} { + if (b == ${t}(0.0)) { + return ${t}(1.0); + } else if (a < ${t}(0.0) && f32(b) != floor(f32(b))) { + return ${t}(pow(f32(a), f32(b))); // NaN + } + return select(sign(a), ${t}(1.0), round(f32(abs(b) % ${t}(2.0))) != 1.0) * ${t}(${t==="i32"?"round":""}(pow(f32(abs(a)), f32(b)))); + } + fn pow_vector_custom(a : vec4<${t}>, b : vec4<${t}>) -> vec4<${t}> { + // TODO: implement vectorized pow + return vec4<${t}>(pow_custom(a.x, b.x), pow_custom(a.y, b.y), pow_custom(a.z, b.z), pow_custom(a.w, b.w)); + } + `)},hd=e=>{st(e,"Sub",(t,n)=>`${t}-${n}`)},gd=e=>{st(e,"Greater",{scalar:(t,n)=>`u32(${t}>${n})`,vector:(t,n)=>`vec4(${t}>${n})`},void 0,void 0,9)},yd=e=>{st(e,"Less",{scalar:(t,n)=>`u32(${t}<${n})`,vector:(t,n)=>`vec4(${t}<${n})`},void 0,void 0,9)},bd=e=>{st(e,"GreaterOrEqual",{scalar:(t,n)=>`u32(${t}>=${n})`,vector:(t,n)=>`vec4(${t}>=${n})`},void 0,void 0,9)},_d=e=>{st(e,"LessOrEqual",{scalar:(t,n)=>`u32(${t}<=${n})`,vector:(t,n)=>`vec4(${t}<=${n})`},void 0,void 0,9)}});var Gh,Hh,Fh,qh,vd,$d,xd=G(()=>{"use strict";te();ae();Ce();ce();Gh=(e,t)=>{if(!e||e.length<1)throw new Error("too few inputs");let n=0,r=e[n],o=r.dataType,a=r.dims.length;e.forEach((s,d)=>{if(d!==n){if(s.dataType!==o)throw new Error("input tensors should be one type");if(s.dims.length!==a)throw new Error("input tensors should have the same shape");s.dims.forEach((l,p)=>{if(p!==t&&l!==r.dims[p])throw new Error("non concat dimensions must match")})}})},Hh=(e,t)=>` + fn calculateInputIndex(index: u32) -> u32 { + let sizeInConcatAxis = array(${t}); + for (var i: u32 = 0u; i < ${e}; i += 1u ) { + if (index < sizeInConcatAxis[i]) { + return i; + } + } + return ${e}u; + }`,Fh=(e,t)=>{let n=e.length,r=[];for(let o=0;o{let o=E.size(n),a=new Array(e.length),s=new Array(e.length),d=0,l=[],p=[],f=[{type:12,data:o}];for(let w=0;w`uniforms.sizeInConcatAxis${w}`).join(","),b=w=>` + + ${(()=>{w.registerUniform("outputSize","u32");for(let S=0;S(${_}); + ${y} -= sizeInConcatAxis[inputIndex - 1u]; + } + + ${Fh(s,h)} + }`;return{name:"Concat",shaderCache:{hint:`${t}`,inputDependencies:l},getRunData:()=>({outputs:[{dims:n,dataType:r}],dispatchGroup:{x:Math.ceil(o/64)},programUniforms:f}),getShaderSource:b}},vd=(e,t)=>{let n=e.inputs,r=n[0].dims,o=E.normalizeAxis(t.axis,r.length);Gh(n,o);let a=r.slice();a[o]=n.reduce((d,l)=>d+(l.dims.length>o?l.dims[o]:0),0);let s=n.filter(d=>E.size(d.dims)>0);e.compute(qh(s,o,a,n[0].dataType),{inputs:s})},$d=e=>re({axis:e.axis})});var je,Ze,Qe,Zr,vt=G(()=>{"use strict";te();ae();je=(e,t,n="f32")=>{switch(e.activation){case"Relu":return`value = max(value, ${t}(0.0));`;case"Sigmoid":return`value = (${t}(1.0) / (${t}(1.0) + exp(-value)));`;case"Clip":return`value = clamp(value, ${t}(${n}(uniforms.clip_min)), ${t}(${n}(uniforms.clip_max)));`;case"HardSigmoid":return`value = max(${t}(0.0), min(${t}(1.0), ${n}(uniforms.alpha) * value + ${n}(uniforms.beta)));`;case"LeakyRelu":return`value = select(${n}(uniforms.alpha) * value, value, value >= ${t}(0.0));`;case"Tanh":return`let e2x = exp(-2.0 * abs(value)); + value = sign(value) * (1.0 - e2x) / (1.0 + e2x); + `;case"":return"";default:throw new Error(`Unsupported activation ${e.activation}`)}},Ze=(e,t)=>{e.activation==="Clip"?t.push({type:1,data:e.clipMax},{type:1,data:e.clipMin}):e.activation==="HardSigmoid"?t.push({type:1,data:e.alpha},{type:1,data:e.beta}):e.activation==="LeakyRelu"&&t.push({type:1,data:e.alpha})},Qe=(e,t)=>{e.activation==="Clip"?t.push({name:"clip_max",type:"f32"},{name:"clip_min",type:"f32"}):e.activation==="HardSigmoid"?t.push({name:"alpha",type:"f32"},{name:"beta",type:"f32"}):e.activation==="LeakyRelu"&&t.push({name:"alpha",type:"f32"})},Zr=e=>{let t=e?.activation||"";if(t==="HardSigmoid"){let[n,r]=e?.activation_params||[.2,.5];return{activation:t,alpha:n,beta:r}}else if(t==="Clip"){let[n,r]=e?.activation_params||[Ls,Gs];return{activation:t,clipMax:r,clipMin:n}}else if(t==="LeakyRelu"){let[n]=e?.activation_params||[.01];return{activation:t,alpha:n}}return{activation:t}}});var Ee,Sd,Qr=G(()=>{"use strict";Ee=(e,t)=>{switch(e){case 1:return t;case 2:return`vec2<${t}>`;case 3:return`vec3<${t}>`;case 4:return`vec4<${t}>`;default:throw new Error(`${e}-component is not supported.`)}},Sd=e=>` + ${e?"value = value + getBiasByOutputCoords(coords);":""} + `});var Td,Cd=G(()=>{"use strict";Td=e=>` +fn getIndexFromCoords4D(coords : vec4, shape : vec4) -> i32 { + return dot(coords, vec4( + shape.y * shape.z * shape.w, shape.z * shape.w, shape.w, 1)); +} +fn getOutputIndexFromCoords(coords : vec4) -> i32 { + return dot(coords, vec4( + i32(${e}.x), i32(${e}.y), i32(${e}.z), 1)); +} +`});var rr,Yr,Xr=G(()=>{"use strict";te();ae();ce();vt();rr=(e,t,n,r,o)=>{let a=r-n;return` + ${Array.from({length:n}).map((s,d)=>` + if (${K(t.shape,d,t.rank)} != 1) { + ${t.indicesSet(e,d,K(o,d+a,r))} + } else { + ${t.indicesSet(e,d,0)} + }`).join("")} +`},Yr=(e,t,n,r,o=!1,a)=>{let s=e[0].dims,d=e[1].dims,l=s[s.length-2],p=d[d.length-1],f=s[s.length-1],h=ge(p),y=ge(f),_=ge(l),b=E.size(n)/h/_,w=e.length>2,S=r?r.slice(0,-2):n.slice(0,-2),v=[E.size(S),l,p],T=[{type:12,data:b},{type:12,data:l},{type:12,data:p},{type:12,data:f}];Ze(t,T),T.push(...H(S,s,d)),w&&T.push(...H(e[2].dims)),T.push(...H(v));let C=A=>{let k=Gr("batch_dims",e[0].dataType,S.length),O=P("a",e[0].dataType,s.length,y),M=P("b",e[1].dataType,d.length,h),V=N("output",e[0].dataType,v.length,h),F=_e(V.type.tensor),j=je(t,V.type.value,F),ne=[O,M],W="";if(w){let Q=o?h:1;ne.push(P("bias",e[2].dataType,e[2].dims.length,Q)),W=`${o?`value += bias[col / ${Q}];`:`value += ${V.type.value}(bias[row + i]);`}`}let J=[{name:"output_size",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"}];Qe(t,J);let ve=()=>{let Q=`var a_data: ${O.type.value};`;for(let ee=0;ee; + for (var k: u32 = 0u; k < uniforms.K; k = k + ${y}) { + ${ve()} + } + for (var i = 0u; i < ${_}u; i++) { + var value = values[i]; + ${W} + ${j} + let cur_indices = ${V.type.indices}(batch, row + i, col); + let offset = ${V.indicesToOffset("cur_indices")}; + ${V.setByOffset(`offset / ${h}`,"value")}; + } + } + `};return{name:"MatMulNaive",shaderCache:{hint:`${t.activation};${h};${y};${_};${o}`,inputDependencies:w?["rank","rank","rank"]:["rank","rank"]},getRunData:()=>({outputs:[{dims:a?a(n):n,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(b/64)},programUniforms:T}),getShaderSource:C}}});var Kh,jh,ho,Id,Zh,go,Qh,nr,Jr=G(()=>{"use strict";te();ae();ce();vt();Xr();Qr();Kh=(e,t)=>e?` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + kStart + inputRow, + globalRowStart / innerElementSize + inputCol${t?", batchIndices":""}); + `:` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + globalRow + innerRow, + kStart / innerElementSize + inputCol${t?", batchIndices":""}); + `,jh=(e,t)=>e?` + let ACached0 = mm_Asub[k * innerElementSize][localRow]; + let ACached1 = mm_Asub[k * innerElementSize + 1][localRow]; + let ACached2 = mm_Asub[k * innerElementSize + 2][localRow]; + ${t===3?"":"let ACached3 = mm_Asub[k * innerElementSize + 3][localRow];"} + for (var i = 0; i < rowPerThread; i = i + 1) { + acc[i] = BCached0 * ACached0[i] + acc[i]; + acc[i] = BCached1 * ACached1[i] + acc[i]; + acc[i] = BCached2 * ACached2[i] + acc[i]; + ${t===3?"":"acc[i] = BCached3 * ACached3[i] + acc[i];"} + }`:` + for (var i = 0; i < rowPerThread; i = i + 1) { + let ACached = mm_Asub[tileRow + i][k]; + acc[i] = BCached0 * ACached.x + acc[i]; + acc[i] = BCached1 * ACached.y + acc[i]; + acc[i] = BCached2 * ACached.z + acc[i]; + ${t===3?"":"acc[i] = BCached3 * ACached.w + acc[i];"} + }`,ho=(e,t,n="f32",r,o=!1,a=32,s=!1,d=32)=>{let l=t[1]*e[1],p=t[0]*e[0],f=o?l:a,h=o?a:l,y=f/t[0],_=a/t[1];if(!((o&&y===4&&e[1]===4||!o&&(y===3||y===4))&&f%t[0]===0&&a%t[1]===0&&e[0]===4))throw new Error(`If transposeA ${o} is true, innerElementSize ${y} and workPerThread[1] ${e[1]} must be 4. + Otherwise, innerElementSize ${y} must be 3 or 4. + tileAWidth ${f} must be divisible by workgroupSize[0]${t[0]}. tileInner ${a} must be divisible by workgroupSize[1] ${t[1]}. colPerThread ${e[0]} must be 4.`);return` +var mm_Asub: array, ${f/y}>, ${h}>; +var mm_Bsub: array, ${p/e[0]}>, ${a}>; + +const rowPerThread = ${e[1]}; +const colPerThread = ${e[0]}; +const innerElementSize = ${y}; +const tileInner = ${a}; + +@compute @workgroup_size(${t[0]}, ${t[1]}, ${t[2]}) +fn main(@builtin(local_invocation_id) localId : vec3, + @builtin(global_invocation_id) globalId : vec3, + @builtin(workgroup_id) workgroupId : vec3) { + let localRow = i32(localId.y); + let tileRow = localRow * rowPerThread; + let tileCol = i32(localId.x); + + let globalRow =i32(globalId.y) * rowPerThread; + let globalCol = i32(globalId.x); + let batch = ${s?"0":"i32(globalId.z)"}; + ${r?`let batchIndices = ${r.offsetToIndices("u32(batch)")};`:""} + let globalRowStart = i32(workgroupId.y) * ${l}; + + let num_tiles = ${s?`${Math.ceil(d/a)}`:"(uniforms.dim_inner - 1) / tileInner + 1"}; + var kStart = ${s?`i32(globalId.z) * ${d}`:"0"}; + + var acc: array, rowPerThread>; + + // Loop over shared dimension. + let tileRowB = localRow * ${_}; + for (var t = 0; t < num_tiles; t = t + 1) { + // Load one tile of A into local memory. + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + let inputRow = tileRow + innerRow; + let inputCol = tileCol; + ${Kh(o,r)} + } + + // Load one tile of B into local memory. + for (var innerRow = 0; innerRow < ${_}; innerRow = innerRow + 1) { + let inputRow = tileRowB + innerRow; + let inputCol = tileCol; + mm_Bsub[inputRow][inputCol] = mm_readB(batch, kStart + inputRow, globalCol${r?", batchIndices":""}); + } + kStart = kStart + tileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + for (var k = 0; k < tileInner / innerElementSize; k = k + 1) { + let BCached0 = mm_Bsub[k * innerElementSize][tileCol]; + let BCached1 = mm_Bsub[k * innerElementSize + 1][tileCol]; + let BCached2 = mm_Bsub[k * innerElementSize + 2][tileCol]; + ${y===3?"":"let BCached3 = mm_Bsub[k * innerElementSize + 3][tileCol];"} + + ${jh(o,y)} + } + + workgroupBarrier(); + } + + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + mm_write(batch, globalRow + innerRow, globalCol, acc[innerRow]); + } +}`},Id=(e,t)=>e?` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + kStart + inputRow, + globalRowStart + inputCol${t?", batchIndices":""}); + `:` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + globalRowStart + inputRow, + kStart + inputCol${t?", batchIndices":""}); + `,Zh=e=>e?"let ACached = mm_Asub[k][tileRow + innerRow];":"let ACached = mm_Asub[tileRow + innerRow][k];",go=(e,t,n="f32",r,o=!1,a=32,s=!1,d=32,l=!1)=>{let p=e[1]*t[1],f=e[0]*t[0],h=o?p:a,y=o?a:p;if(!(y%t[1]===0&&h%t[0]===0&&a%t[1]===0))throw new Error(`tileAHight ${y} must be divisible by workgroupSize[1]${t[1]}, tileAWidth ${h} must be divisible by workgroupSize[0]${t[0]}, tileInner ${a} must be divisible by workgroupSize[1]${t[1]}`);let _=y/t[1],b=h/t[0],w=a/t[1],S=l?` + let localRow = i32(localId.y); + let localCol = i32(localId.x); + let globalRowStart = i32(workgroupId.y) * ${p}; + let globalColStart = i32(workgroupId.x) * ${f}; + + // Loop over shared dimension. + for (var t = 0; t < num_tiles; t = t + 1) { + // Load one tile of A into local memory. + for (var inputRow = localRow; inputRow < ${y}; inputRow = inputRow + ${t[1]}) { + for (var inputCol = localCol; inputCol < ${h}; inputCol = inputCol + ${t[0]}) { + ${Id(o,r)} + } + } + // Load one tile of B into local memory. + for (var inputRow = localRow; inputRow < ${a}; inputRow = inputRow + ${t[1]}) { + for (var inputCol = localCol; inputCol < ${f}; inputCol = inputCol + ${t[0]}) { + mm_Bsub[inputRow][inputCol] = mm_readB(batch, + kStart + inputRow, + globalColStart + inputCol${r?", batchIndices":""}); + } + } + kStart = kStart + tileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + var BCached : array<${n}, colPerThread>; + for (var k = 0; k < tileInner; k = k + 1) { + for (var inner = 0; inner < colPerThread; inner = inner + 1) { + BCached[inner] = mm_Bsub[k][localCol + inner * ${t[0]}]; + } + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + let ACached = ${o?`mm_Asub[k][localRow + innerRow * ${t[1]}];`:`mm_Asub[localRow + innerRow * ${t[1]}][k];`} + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + acc[innerRow][innerCol] = acc[innerRow][innerCol] + + ACached * BCached[innerCol]; + } + } + } + workgroupBarrier(); + } + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + let gRow = globalRowStart + localRow + innerRow * ${t[1]}; + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + let gCol = globalColStart + localCol + innerCol * ${t[0]}; + mm_write(batch, gRow, gCol, acc[innerRow][innerCol]); + } + } + `:` +let tileRow = i32(localId.y) * rowPerThread; +let tileCol = i32(localId.x) * colPerThread; + +let globalRow = i32(globalId.y) * rowPerThread; +let globalCol = i32(globalId.x) * colPerThread; +let globalRowStart = i32(workgroupId.y) * ${p}; + +let tileRowA = i32(localId.y) * ${_}; +let tileColA = i32(localId.x) * ${b}; +let tileRowB = i32(localId.y) * ${w}; +// Loop over shared dimension. +for (var t = 0; t < num_tiles; t = t + 1) { + // Load one tile of A into local memory. + for (var innerRow = 0; innerRow < ${_}; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < ${b}; innerCol = innerCol + 1) { + let inputRow = tileRowA + innerRow; + let inputCol = tileColA + innerCol; + ${Id(o,r)} + } + } + + // Load one tile of B into local memory. + for (var innerRow = 0; innerRow < ${w}; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + let inputRow = tileRowB + innerRow; + let inputCol = tileCol + innerCol; + mm_Bsub[inputRow][inputCol] = mm_readB(batch, + kStart + inputRow, + globalCol + innerCol${r?", batchIndices":""}); + } + } + kStart = kStart + tileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + var BCached : array<${n}, colPerThread>; + for (var k = 0; k < tileInner; k = k + 1) { + for (var inner = 0; inner < colPerThread; inner = inner + 1) { + BCached[inner] = mm_Bsub[k][tileCol + inner]; + } + + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + ${Zh(o)} + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + acc[innerRow][innerCol] = acc[innerRow][innerCol] + ACached * BCached[innerCol]; + } + } + } + + workgroupBarrier(); +} + +for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + mm_write(batch, globalRow + innerRow, globalCol + innerCol, + acc[innerRow][innerCol]); + } +} +`;return` + var mm_Asub : array, ${y}>; + var mm_Bsub : array, ${a}>; + const rowPerThread = ${e[1]}; + const colPerThread = ${e[0]}; + const tileInner = ${a}; + +@compute @workgroup_size(${t[0]}, ${t[1]}, ${t[2]}) +fn main(@builtin(local_invocation_id) localId : vec3, + @builtin(global_invocation_id) globalId : vec3, + @builtin(workgroup_id) workgroupId : vec3) { + let batch = ${s?"0":"i32(globalId.z)"}; + ${r?`let batchIndices = ${r.offsetToIndices("u32(batch)")};`:""} + let num_tiles = ${s?`${Math.ceil(d/a)}`:"(uniforms.dim_inner - 1) / tileInner + 1"}; + var kStart = ${s?`i32(globalId.z) * ${d}`:"0"}; + + var acc : array, rowPerThread>; + ${S} + } +`},Qh=(e,t,n,r,o=!1)=>{let[a,s,d,l]=r,p=_e(r[0].type.tensor);return` + fn mm_readA(batch: i32, row: i32, colIn: i32, batchIndices: ${a.type.indices}) -> ${Ee(e,p)} { + var value = ${Ee(e,p)}(0.0); + let col = colIn * ${e}; + if(row < uniforms.dim_a_outer && col < uniforms.dim_inner) + { + var aIndices: ${s.type.indices}; + ${rr("aIndices",s,s.rank-2,a.rank,"batchIndices")} + ${s.indicesSet("aIndices",s.rank-2,"u32(row)")} + ${s.indicesSet("aIndices",s.rank-1,"u32(colIn)")} + value = ${s.getByIndices("aIndices")}; + } + return value; + } + + fn mm_readB(batch: i32, row: i32, colIn: i32, batchIndices: ${a.type.indices}) -> ${Ee(e,p)} { + var value = ${Ee(e,p)}(0.0); + let col = colIn * ${e}; + if(row < uniforms.dim_inner && col < uniforms.dim_b_outer) + { + var bIndices: ${d.type.indices}; + ${rr("bIndices",d,d.rank-2,a.rank,"batchIndices")} + ${d.indicesSet("bIndices",d.rank-2,"u32(row)")} + ${d.indicesSet("bIndices",d.rank-1,"u32(colIn)")} + value = ${d.getByIndices("bIndices")}; + } + return value; + } + + fn mm_write(batch: i32, row: i32, colIn: i32, valueIn: ${Ee(e,p)}) { + let col = colIn * ${e}; + if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) { + var value = valueIn; + let coords = vec3(batch, row, colIn); + ${t?`value = value + ${o?"bias[colIn]":`${Ee(e,p)}(bias[row])`};`:""} + ${n} + ${l.setByIndices("vec3(coords)","value")} + } + } + `},nr=(e,t,n,r,o=!1,a)=>{let s=e[0].dims,d=e[1].dims,l=s.slice(0,-2),p=d.slice(0,-2),f=r?r.slice(0,-2):n.slice(0,-2),h=E.size(f),y=s[s.length-2],_=s[s.length-1],b=d[d.length-1],w=_%4===0&&b%4===0,S=y<=8?[4,1,1]:[4,4,1],$=[8,8,1],v=[Math.ceil(b/$[0]/S[0]),Math.ceil(y/$[1]/S[1]),Math.ceil(h/$[2]/S[2])],T=w?4:1,C=[...l,y,_/T],A=C.length,k=[...p,_,b/T],O=k.length,M=[h,y,b/T],V=[{type:6,data:y},{type:6,data:b},{type:6,data:_}];Ze(t,V),V.push(...H(f,C,k));let F=["rank","rank"],j=e.length>2;j&&(V.push(...H(e[2].dims)),F.push("rank")),V.push(...H(M));let ne=W=>{let J=f.length,ve=Gr("batchDims",e[0].dataType,J,1),Q=_e(e[0].dataType),ee=P("a",e[0].dataType,A,T),le=P("b",e[1].dataType,O,T),Z=N("result",e[0].dataType,M.length,T),pe=[ee,le];if(j){let Y=o?T:1;pe.push(P("bias",e[2].dataType,e[2].dims.length,Y))}let ke=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"}];Qe(t,ke);let Se=_e(Z.type.tensor),D=je(t,Z.type.value,Se),R=Qh(T,j,D,[ve,ee,le,Z],o);return` + ${W.registerUniforms(ke).registerInternalVariables(ve).declareVariables(...pe,Z)} + ${R} + ${w?ho(S,$,Q,ve):go(S,$,Q,ve)} + `};return{name:"MatMul",shaderCache:{hint:`${S};${t.activation};${w};${o}`,inputDependencies:F},getRunData:()=>({outputs:[{dims:a?a(n):n,dataType:e[0].dataType}],dispatchGroup:{x:v[0],y:v[1],z:v[2]},programUniforms:V}),getShaderSource:ne}}});var Yh,Ad,kd=G(()=>{"use strict";te();tt();ce();vt();Qr();Cd();Jr();Yh=(e,t,n,r,o=!1,a,s=4,d=4,l=4,p="f32")=>{let f=F=>{switch(F){case 1:return"resData = x[xIndex];";case 3:return`resData = vec3<${p}>(x[xIndex], x[xIndex + 1], x[xIndex + 2]);`;case 4:return"resData = x[xIndex / 4];";default:throw new Error(`innerElementSize ${F} is not supported.`)}},h=F=>{switch(F){case 1:return"return w[row * i32(uniforms.w_shape[3]) + colIn];";case 4:return"return w[row * i32(uniforms.w_shape[3]) / 4 + colIn];";default:throw new Error(`innerElementSize ${F} is not supported.`)}},y=e?` + let coord = vec4(batch, xRow, xCol, xCh); + `:` + let coord = vec4(batch, xCh, xRow, xCol); + `,_=e?` + let coords = vec4( + batch, + row / outWidth, + row % outWidth, + col); + `:` + let coords = vec4( + batch, + row, + col / outWidth, + col % outWidth); + `,b=e?"i32(uniforms.x_shape[1])":"i32(uniforms.x_shape[2])",w=e?"i32(uniforms.x_shape[2])":"i32(uniforms.x_shape[3])",S=e?"row":"col",$=e?"col":"row",v=` + let inChannels = i32(uniforms.w_shape[2]); + let outWidth = ${e?"i32(uniforms.result_shape[2])":"i32(uniforms.result_shape[3])"}; + let outRow = ${S} / outWidth; + let outCol = ${S} % outWidth; + + let WRow = ${$} / (i32(uniforms.w_shape[1]) * inChannels); + let WCol = ${$} / inChannels % i32(uniforms.w_shape[1]); + let xRow = outRow * uniforms.stride[0] + uniforms.dilation[0] * WRow - uniforms.pad[0]; + let xCol = outCol * uniforms.stride[1] + uniforms.dilation[1] * WCol - uniforms.pad[1]; + let xCh = ${$} % inChannels; + var resData = ${Ee(s,p)}(0.0); + // The bounds checking is always needed since we use it to pad zero for + // the 'same' padding type. + if (xRow >= 0 && xRow < ${b} && xCol >= 0 && xCol < ${w}) { + ${y} + let xIndex = getIndexFromCoords4D(coord, vec4(uniforms.x_shape)); + ${f(s)} + } + return resData;`,T=e?t&&r?` + let col = colIn * ${s}; + ${v}`:` + let col = colIn * ${s}; + if (row < uniforms.dim_a_outer && col < uniforms.dim_inner) { + ${v} + } + return ${Ee(s,p)}(0.0);`:r&&n?` + let col = colIn * ${s}; + ${v}`:` + let col = colIn * ${s}; + if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) { + ${v} + } + return ${Ee(s,p)}(0.0);`,C=e?r&&n?h(d):` + let col = colIn * ${d}; + if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) { + ${h(d)} + } + return ${Ee(d,p)}(0.0);`:` + let col = colIn * ${d}; + if (row < uniforms.dim_inner && col < uniforms.dim_a_outer) { + ${h(d)} + } + return ${Ee(d,p)}(0.0);`,A=Ee(l,p),k=e?Ee(s,p):Ee(d,p),O=e?Ee(d,p):Ee(s,p),M=je(a,A,p);return` + fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${k} { + ${e?T:C} + } + + fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${O} { + ${e?C:T} + } + + fn mm_write(batch: i32, row : i32, colIn : i32, valueIn : ${A}) { + let col = colIn * ${l}; + if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) + { + var value = valueIn; + let outWidth = ${e?"i32(uniforms.result_shape[2])":"i32(uniforms.result_shape[3])"}; + ${_} + ${Sd(o)} + ${M} + setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value); + } + }`},Ad=(e,t,n,r,o,a,s,d,l)=>{let p=t.format==="NHWC",f=p?e[0].dims[3]:e[0].dims[1],h=n[0],y=p?n[2]:n[3],_=p?n[1]:n[2],b=p?n[3]:n[1],w=p&&(f%4===0||f%3===0)&&b%4===0,S=p?b:y*_,$=p?y*_:b,v=[8,8,1],T=r<=8?[4,1,1]:[4,4,1],C=[Math.ceil(S/v[0]/T[0]),Math.ceil($/v[1]/T[1]),Math.ceil(h/v[2]/T[2])];me("verbose",()=>`[conv2d_mm_webgpu] dispatch = ${C}`);let A=w?p&&f%4!==0?3:4:1,k=v[1]*T[1],O=v[0]*T[0],M=Math.max(v[0]*A,v[1]),V=r%k===0,F=o%O===0,j=a%M===0,ne=w?[A,4,4]:[1,1,1],W=[{type:6,data:r},{type:6,data:o},{type:6,data:a},{type:6,data:[t.pads[0],t.pads[1]]},{type:6,data:t.strides},{type:6,data:t.dilations}];Ze(t,W),W.push(...H(e[0].dims,e[1].dims));let J=["rank","rank"];s&&(W.push(...H(e[2].dims)),J.push("rank")),W.push(...H(n));let ve=Q=>{let ee=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"},{name:"pad",type:"i32",length:2},{name:"stride",type:"i32",length:2},{name:"dilation",type:"i32",length:2}];Qe(t,ee);let le=w?4:1,Z=_e(e[0].dataType),pe=` + fn setOutputAtIndex(flatIndex : i32, value : ${w?`vec4<${Z}>`:Z}) { + result[flatIndex] = ${w?`vec4<${Z}>`:Z}(value); + } + fn setOutputAtCoords(d0 : i32, d1 : i32, d2 : i32, d3 : i32, value : ${w?`vec4<${Z}>`:Z}) { + let flatIndex = getOutputIndexFromCoords(vec4(d0, d1, d2, d3)); + setOutputAtIndex(flatIndex ${w?"/ 4":""}, value); + }`,ke=P("x",e[0].dataType,e[0].dims.length,A===3?1:A),Se=P("w",e[1].dataType,e[1].dims.length,le),D=[ke,Se],R=N("result",e[0].dataType,n.length,le);if(s){let Y=P("bias",e[2].dataType,e[2].dims.length,le);D.push(Y),pe+=` + fn getBiasByOutputCoords(coords : vec4) -> ${w?`vec4<${Z}>`:Z} { + return bias[coords.${p?"w":"y"}${w?"/ 4":""}]; + }`}return` + ${Td("uniforms.result_strides")} + //struct Uniforms { xShape : vec4, wShape : vec4, outShape : vec4, + // outShapeStrides: vec3, filterDims : vec2, pad : vec2, stride : vec2, + // dilation : vec2, dimAOuter : i32, dimBOuter : i32, dimInner : i32 }; + ${Q.registerUniforms(ee).declareVariables(...D,R)} + ${pe} + ${Yh(p,V,F,j,s,t,ne[0],ne[1],ne[2],Z)} + ${w?ho(T,v,Z,void 0,!p,M):go(T,v,Z,void 0,!p,M,!1,void 0,d)}`};return{name:"Conv2DMatMul",shaderCache:{hint:`${t.cacheKey};${A};${w};${V};${F};${j};${k};${O};${M}`,inputDependencies:J},getRunData:()=>({outputs:[{dims:l?l(n):n,dataType:e[0].dataType}],dispatchGroup:{x:C[0],y:C[1],z:C[2]},programUniforms:W}),getShaderSource:ve}}});var Xh,Ed,en,Jh,Pd,eg,zd,Od,Dd=G(()=>{"use strict";te();tt();ae();ce();vt();Qr();Xh=e=>{let t=1;for(let n=0;ntypeof e=="number"?[e,e,e]:e,en=(e,t)=>t<=1?e:e+(e-1)*(t-1),Jh=(e,t,n,r=1)=>{let o=en(t,r);return Math.floor((e[0]*(n-1)-n+o)/2)},Pd=(e,t,n,r,o)=>{o==null&&(o=Jh(e,t[0],r[0]));let a=[0,0,0,n];for(let s=0;s<3;s++)e[s]+2*o>=t[s]&&(a[s]=Math.trunc((e[s]-t[s]+2*o)/r[s]+1));return a},eg=(e,t,n,r,o,a,s,d,l,p)=>{let f,h,y,_;if(e==="VALID"&&(e=0),typeof e=="number"){f={top:e,bottom:e,left:e,right:e,front:e,back:e};let b=Pd([t,n,r,1],[d,l,p],1,[o,a,s],e);h=b[0],y=b[1],_=b[2]}else if(Array.isArray(e)){if(!e.every((w,S,$)=>w===$[0]))throw Error(`Unsupported padding parameter: ${e}`);f={top:e[0],bottom:e[1],left:e[2],right:e[3],front:e[4],back:e[5]};let b=Pd([t,n,r,1],[d,l,p],1,[o,a,s],e[0]);h=b[0],y=b[1],_=b[2]}else if(e==="SAME_UPPER"){h=Math.ceil(t/o),y=Math.ceil(n/a),_=Math.ceil(r/s);let b=(h-1)*o+d-t,w=(y-1)*a+l-n,S=(_-1)*s+p-r,$=Math.floor(b/2),v=b-$,T=Math.floor(w/2),C=w-T,A=Math.floor(S/2),k=S-A;f={top:T,bottom:C,left:A,right:k,front:$,back:v}}else throw Error(`Unknown padding parameter: ${e}`);return{padInfo:f,outDepth:h,outHeight:y,outWidth:_}},zd=(e,t,n,r,o,a=!1,s="channelsLast")=>{let d,l,p,f,h;if(s==="channelsLast")[d,l,p,f,h]=e;else if(s==="channelsFirst")[d,h,l,p,f]=e;else throw new Error(`Unknown dataFormat ${s}`);let[y,,_,b,w]=t,[S,$,v]=Ed(n),[T,C,A]=Ed(r),k=en(_,T),O=en(b,C),M=en(w,A),{padInfo:V,outDepth:F,outHeight:j,outWidth:ne}=eg(o,l,p,f,S,$,v,k,O,M),W=a?y*h:y,J=[0,0,0,0,0];return s==="channelsFirst"?J=[d,W,F,j,ne]:s==="channelsLast"&&(J=[d,F,j,ne,W]),{batchSize:d,dataFormat:s,inDepth:l,inHeight:p,inWidth:f,inChannels:h,outDepth:F,outHeight:j,outWidth:ne,outChannels:W,padInfo:V,strideDepth:S,strideHeight:$,strideWidth:v,filterDepth:_,filterHeight:b,filterWidth:w,effectiveFilterDepth:k,effectiveFilterHeight:O,effectiveFilterWidth:M,dilationDepth:T,dilationHeight:C,dilationWidth:A,inShape:e,outShape:J,filterShape:t}},Od=(e,t,n,r,o,a)=>{let s=a==="channelsLast",d=s?e[0].dims[3]:e[0].dims[1],l=!1,p=[64,1,1],f={x:n.map((v,T)=>T)},h=[Math.ceil(Xh(f.x.map(v=>n[v]))/p[0]),1,1];me("verbose",()=>`[conv3d_naive_webgpu] dispatch = ${h}`);let y=l?s&&d%4!==0?3:4:1,_=E.size(n),b=[{type:12,data:_},{type:12,data:r},{type:12,data:o},{type:12,data:t.strides},{type:12,data:t.dilations}];Ze(t,b),b.push(...H(e[0].dims,e[1].dims));let w=["rank","rank"],S=e.length===3;S&&(b.push(...H(e[2].dims)),w.push("rank")),b.push(...H(n));let $=v=>{let T=[{name:"output_size",type:"u32"},{name:"filter_dims",type:"u32",length:r.length},{name:"pads",type:"u32",length:o.length},{name:"strides",type:"u32",length:t.strides.length},{name:"dilations",type:"u32",length:t.dilations.length}];Qe(t,T);let C=l?4:1,A=_e(e[0].dataType),k=P("x",e[0].dataType,e[0].dims.length,y===3?1:y),O=P("W",e[1].dataType,e[1].dims.length,C),M=[k,O],V=N("result",e[0].dataType,n.length,C),F="";if(S){let W=P("bias",e[2].dataType,e[2].dims.length,C);M.push(W),F+=` + fn getBiasByOutputCoords(coords : array) -> ${l?`vec4<${A}>`:A} { + return bias[${s?K("coords",4,5):K("coords",1,5)}${l?"/ 4":""}]; + }`}let j=Ee(y,A),ne=je(t,j,A);return` + ${F} + fn getX(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 { + let aIndices = array(d0, d1, d2, d3, d4); + return ${k.getByIndices("aIndices")}; + } + fn getW(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 { + let aIndices = array(d0, d1, d2, d3, d4); + return ${O.getByIndices("aIndices")}; + } + ${v.registerUniforms(T).declareVariables(...M,V)} + ${v.mainStart()} + ${v.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let coords = ${V.offsetToIndices("global_idx")}; + let batch = ${K("coords",0,k.rank)}; + let d2 = ${s?K("coords",k.rank-1,k.rank):K("coords",1,k.rank)}; + let xFRCCorner = vec3(${s?K("coords",1,k.rank):K("coords",2,k.rank)}, + ${s?K("coords",2,k.rank):K("coords",3,k.rank)}, + ${s?K("coords",3,k.rank):K("coords",4,k.rank)}) * uniforms.strides - uniforms.pads; + let xFCorner = xFRCCorner.x; + let xRCorner = xFRCCorner.y; + let xCCorner = xFRCCorner.z; + let xShapeY = ${s?K("uniforms.x_shape",1,k.rank):K("uniforms.x_shape",2,k.rank)}; + let xShapeZ = ${s?K("uniforms.x_shape",2,k.rank):K("uniforms.x_shape",3,k.rank)}; + let xShapeW = ${s?K("uniforms.x_shape",3,k.rank):K("uniforms.x_shape",4,k.rank)}; + let xShapeU = ${s?K("uniforms.x_shape",4,k.rank):K("uniforms.x_shape",1,k.rank)}; + let inputDepthNearestVec4 = (xShapeU / 4) * 4; + let inputDepthVec4Remainder = xShapeU % 4; + + var value = 0.0; + for (var wF = 0u; wF < uniforms.filter_dims[0]; wF++) { + let xF = xFCorner + wF * uniforms.dilations[0]; + if (xF < 0 || xF >= xShapeY) { + continue; + } + + for (var wR = 0u; wR < uniforms.filter_dims[1]; wR++) { + let xR = xRCorner + wR * uniforms.dilations[1]; + if (xR < 0 || xR >= xShapeZ) { + continue; + } + + for (var wC = 0u; wC < uniforms.filter_dims[2]; wC++) { + let xC = xCCorner + wC * uniforms.dilations[2]; + if (xC < 0 || xC >= xShapeW) { + continue; + } + + for (var d1 = 0u; d1 < inputDepthNearestVec4; d1 += 4) { + ${s?`let xValues = vec4( + getX(batch, xF, xR, xC, d1), + getX(batch, xF, xR, xC, d1 + 1), + getX(batch, xF, xR, xC, d1 + 2), + getX(batch, xF, xR, xC, d1 + 3)); + `:`let xValues = vec4( + getX(batch, d1, xF, xR, xC), + getX(batch, d1 + 1, xF, xR, xC), + getX(batch, d1 + 2, xF, xR, xC), + getX(batch, d1 + 3, xF, xR, xC)); + `} + let wValues = vec4( + getW(d2, d1, wF, wR, wC), + getW(d2, d1 + 1, wF, wR, wC), + getW(d2, d1 + 2, wF, wR, wC), + getW(d2, d1 + 3, wF, wR, wC)); + value += dot(xValues, wValues); + } + if (inputDepthVec4Remainder == 1) { + ${s?`value += getX(batch, xF, xR, xC, inputDepthNearestVec4) + * getW(d2, inputDepthNearestVec4, wF, wR, wC);`:`value += getX(batch, inputDepthNearestVec4, xF, xR, xC) + * getW(d2, inputDepthNearestVec4, wF, wR, wC);`} + } else if (inputDepthVec4Remainder == 2) { + ${s?`let xValues = vec2( + getX(batch, xF, xR, xC, inputDepthNearestVec4), + getX(batch, xF, xR, xC, inputDepthNearestVec4 + 1)); + `:`let xValues = vec2( + getX(batch, inputDepthNearestVec4, xF, xR, xC), + getX(batch, inputDepthNearestVec4 + 1, xF, xR, xC)); + `} + let wValues = vec2( + getW(d2, inputDepthNearestVec4, wF, wR, wC), + getW(d2, inputDepthNearestVec4 + 1, wF, wR, wC)); + value += dot(xValues, wValues); + } else if (inputDepthVec4Remainder == 3) { + ${s?`let xValues = vec3( + getX(batch, xF, xR, xC, inputDepthNearestVec4), + getX(batch, xF, xR, xC, inputDepthNearestVec4 + 1), + getX(batch, xF, xR, xC, inputDepthNearestVec4 + 2)); + `:`let xValues = vec3( + getX(batch, inputDepthNearestVec4, xF, xR, xC), + getX(batch, inputDepthNearestVec4 + 1, xF, xR, xC), + getX(batch, inputDepthNearestVec4 + 2, xF, xR, xC)); + `} + let wValues = vec3( + getW(d2, inputDepthNearestVec4, wF, wR, wC), + getW(d2, inputDepthNearestVec4 + 1, wF, wR, wC), + getW(d2, inputDepthNearestVec4 + 2, wF, wR, wC)); + value += dot(xValues, wValues); + } + } + } + } + ${S?"value = value + getBiasByOutputCoords(coords)":""}; + ${ne} + result[global_idx] = f32(value); + }`};return{name:"Conv3DNaive",shaderCache:{hint:`${t.cacheKey};${s};${y};${S}`,inputDependencies:w},getRunData:()=>({outputs:[{dims:n,dataType:e[0].dataType}],dispatchGroup:{x:h[0],y:h[1],z:h[2]},programUniforms:b}),getShaderSource:$}}});var Bd,Md,Rd=G(()=>{"use strict";te();ae();ce();vt();Bd=(e,t,n,r)=>{let o=e.length>2,a=o?"value += b[output_channel];":"",s=e[0].dims,d=e[1].dims,l=t.format==="NHWC",p=l?n[3]:n[1],f=p/t.group,h=l&&f>=4?ge(p):1,y=E.size(n)/h,_=[{type:12,data:y},{type:12,data:t.dilations},{type:12,data:[t.strides[0],t.strides[1]]},{type:12,data:[t.pads[0],t.pads[1]]},{type:12,data:f}];Ze(t,_),_.push(...H(s,[d[0],d[1],d[2],d[3]/h]));let b=o?["rank","rank","rank"]:["rank","rank"];_.push(...H([n[0],n[1],n[2],n[3]/h]));let w=S=>{let $=N("output",e[0].dataType,n.length,h),v=_e($.type.tensor),T=je(t,$.type.value,v),C=P("x",e[0].dataType,s.length),A=P("w",e[1].dataType,d.length,h),k=[C,A];o&&k.push(P("b",e[2].dataType,e[2].dims,h));let O=[{name:"output_size",type:"u32"},{name:"dilations",type:"u32",length:t.dilations.length},{name:"strides",type:"u32",length:2},{name:"pads",type:"u32",length:2},{name:"output_channels_per_group",type:"u32"}];Qe(t,O);let M=l?` + for (var wHeight: u32 = 0u; wHeight < uniforms.w_shape[0]; wHeight++) { + let xHeight = xRCCorner.x + wHeight * uniforms.dilations[0]; + + if (xHeight < 0u || xHeight >= uniforms.x_shape[1]) { + continue; + } + + for (var wWidth: u32 = 0u; wWidth < uniforms.w_shape[1]; wWidth++) { + let xWidth = xRCCorner.y + wWidth * uniforms.dilations[1]; + if (xWidth < 0u || xWidth >= uniforms.x_shape[2]) { + continue; + } + + for (var wInChannel: u32 = 0u; wInChannel < uniforms.w_shape[2]; wInChannel++) { + let input_channel = in_channel_offset + wInChannel; + let xVal = ${C.get("batch","xHeight","xWidth","input_channel")}; + let wVal = ${A.get("wHeight","wWidth","wInChannel","output_channel")}; + value += xVal * wVal; + } + } + } + `:` + for (var wInChannel: u32 = 0u; wInChannel < uniforms.w_shape[1]; wInChannel++) { + let input_channel = in_channel_offset + wInChannel; + for (var wHeight: u32 = 0u; wHeight < uniforms.w_shape[2]; wHeight++) { + let xHeight = xRCCorner.x + wHeight * uniforms.dilations[0]; + + if (xHeight < 0u || xHeight >= uniforms.x_shape[2]) { + continue; + } + + for (var wWidth: u32 = 0u; wWidth < uniforms.w_shape[3]; wWidth++) { + let xWidth = xRCCorner.y + wWidth * uniforms.dilations[1]; + if (xWidth < 0u || xWidth >= uniforms.x_shape[3]) { + continue; + } + + let xVal = ${C.get("batch","input_channel","xHeight","xWidth")}; + let wVal = ${A.get("output_channel","wInChannel","wHeight","wWidth")}; + value += xVal * wVal; + } + } + } + `;return` + ${S.registerUniforms(O).declareVariables(...k,$)} + + ${S.mainStart()} + ${S.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let outputIndices = ${$.offsetToIndices("global_idx")}; + let batch: u32 = outputIndices[0]; + let output_channel: u32 = outputIndices[${l?3:1}]; + let xRCCorner: vec2 = vec2(outputIndices[${l?1:2}], outputIndices[${l?2:3}]) * uniforms.strides - uniforms.pads; + let group_id: u32 = output_channel * ${h} / uniforms.output_channels_per_group; + var in_channel_offset = group_id * uniforms.w_shape[${l?2:1}]; + + var value: ${$.type.value} = ${$.type.value}(0); + ${M} + ${a} + ${T} + ${$.setByOffset("global_idx","value")} + }`};return{name:"GroupedConv",shaderCache:{hint:`${t.cacheKey}_${h}`,inputDependencies:b},getRunData:()=>({outputs:[{dims:r?r(n):n,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(y/64)},programUniforms:_}),getShaderSource:w}},Md=(e,t,n,r)=>{let o=e.length>2,a=ge(n[3]),s=ge(n[2]),d=E.size(n)/a/s,l=[e[0].dims[0],e[0].dims[1],e[0].dims[2],e[0].dims[3]/a],p=[e[1].dims[0],e[1].dims[1],e[1].dims[2],e[1].dims[3]/a],f=[n[0],n[1],n[2],n[3]/a],h=[{type:12,data:d},{type:6,data:[t.strides[0],t.strides[1]]},{type:6,data:[t.pads[0],t.pads[1]]}];Ze(t,h),h.push(...H(l,p,f));let y=(s-1)*t.strides[1]+p[1],_=b=>{let w=N("output",e[0].dataType,f.length,a),S=_e(w.type.tensor),$=je(t,w.type.value,S),v=P("x",e[0].dataType,l.length,a),T=P("w",e[1].dataType,p.length,a),C=[v,T];o&&C.push(P("b",e[2].dataType,e[2].dims,a));let A=o?"value += b[output_channel];":"",k=[{name:"output_size",type:"u32"},{name:"strides",type:"i32",length:2},{name:"pads",type:"i32",length:2}];return Qe(t,k),` + ${b.registerUniforms(k).declareVariables(...C,w)} + ${b.mainStart()} + ${b.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let width0 = uniforms.output_shape[3]; + let output_channel = global_idx % width0; + var index1 = global_idx / width0; + let width1 = uniforms.output_shape[2] / ${s}u; + let col = (index1 % width1) * ${s}u; + index1 = index1 / width1; + let row = index1 % uniforms.output_shape[1]; + let batch = index1 / uniforms.output_shape[1]; + + let x_corner = vec2(i32(row), i32(col)) * uniforms.strides - uniforms.pads; + + var x_vals: array<${v.type.value}, ${y}>; + var values: array<${w.type.value}, ${s}>; + let input_channel = output_channel; + // Use constant instead of uniform can give better performance for w's height/width. + for (var w_height: u32 = 0u; w_height < ${p[0]}; w_height++) { + let x_height = x_corner.x + i32(w_height); + if (x_height >= 0 && u32(x_height) < uniforms.x_shape[1]) { + for (var i = 0; i < ${y}; i++) { + let x_width = x_corner.y + i; + if (x_width >= 0 && u32(x_width) < uniforms.x_shape[2]) { + x_vals[i] = ${v.get("batch","u32(x_height)","u32(x_width)","input_channel")}; + } else { + x_vals[i] = ${v.type.value}(0); + } + } + for (var w_width: u32 = 0u; w_width < ${p[1]}; w_width++) { + let w_val = ${T.get("w_height","w_width","0","output_channel")}; + for (var i = 0u; i < ${s}u; i++) { + values[i] = fma(x_vals[i * u32(uniforms.strides[1]) + w_width], w_val, values[i]); + } + } + } + } + + for (var i = 0u; i < ${s}u; i++) { + var value = values[i]; + ${A} + ${$} + ${w.set("batch","row","col + i","output_channel","value")}; + } + }`};return{name:"GroupedConv-Vectorize",shaderCache:{hint:`${t.cacheKey};${a};${s};${y};${p[0]};${p[1]}`,inputDependencies:o?["rank","rank","type"]:["rank","rank"]},getRunData:()=>({outputs:[{dims:r?r(n):n,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(d/64)},programUniforms:h}),getShaderSource:_}}});var tg,yo,rg,bo,_o,Ud,ng,og,wo,Nd=G(()=>{"use strict";ae();kd();Dd();Jr();Rd();vt();Xr();ct();tg=(e,t,n,r,o,a)=>{let s=e[0],d=e.slice(a?1:2,a?3:4),l=d.length,p=t[0],h=t.slice(2).map((b,w)=>b+(b-1)*(n[w]-1)),_=d.map((b,w)=>b+r[w]+r[w+l]).map((b,w)=>Math.floor((b-h[w]+o[w])/o[w]));return _.splice(0,0,s),_.splice(a?3:1,0,p),_},yo=[2,3,1,0],rg=(e,t)=>{if(!e||e.length!==2&&e.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(e[0].dims.length>5)throw new Error("greater than 5D is not supported");if(e[0].dims.length!==e[1].dims.length)throw new Error("filter does not have same dimension as input");let n=e[0].dims[t.format==="NHWC"?e[0].dims.length-1:1],r=e[1].dims[1]*t.group;if(n!==r)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");if(e.length===3&&(e[2].dims.length!==1||e[1].dims[0]!==e[2].dims[0]))throw new Error("invalid bias");let o=e[0].dims.length-2;if(t.dilations.length!==o)throw new Error(`dilations should be ${o}D`);if(t.strides.length!==o)throw new Error(`strides should be ${o}D`);if(t.pads.length!==o*2)throw new Error(`pads should be ${o*2}D`);if(t.kernelShape.length!==0&&t.kernelShape.length!==e[1].dims.length-2)throw new Error("invalid kernel shape")},bo=(e,t)=>{let n=e.kernelShape.slice();n.length{let t=Zr(e),n=e.format,r=["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][e.auto_pad],o=e.dilations,a=e.group,s=e.kernel_shape,d=e.pads,l=e.strides,p=e.w_is_const();return{autoPad:r,format:n,dilations:o,group:a,kernelShape:s,pads:d,strides:l,wIsConst:p,...t,cacheKey:`${e.format};${t.activation};`}},Ud=(e,t,n,r)=>{let o=n.format==="NHWC",a=tg(t[0].dims,t[1].dims,n.dilations,n.pads,n.strides,o);if(n.group!==1){let k=[t[0]];if(o){let M=e.kernelCustomData.wT??e.compute(Oe(t[1],yo),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];n.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=M),k.push(M)}else k.push(t[1]);t.length===3&&k.push(t[2]),!e.adapterInfo.isArchitecture("ampere")&&o&&t[1].dims[0]===n.group&&t[1].dims[1]===1&&n.dilations[0]===1&&n.dilations[1]===1?e.compute(Md(k,n,a,r),{inputs:k}):e.compute(Bd(k,n,a,r),{inputs:k});return}let s=t.length===3,d=t[0].dims[o?1:2],l=t[0].dims[o?2:3],p=t[0].dims[o?3:1],f=t[1].dims[2],h=t[1].dims[3],y=a[o?1:2],_=a[o?2:3],b=a[o?3:1],w=o&&f===d&&h===l&&n.pads[0]===0&&n.pads[1]===0;if(w||f===1&&h===1&&n.dilations[0]===1&&n.dilations[1]===1&&n.strides[0]===1&&n.strides[1]===1&&n.pads[0]===0&&n.pads[1]===0){let k=a[0],O,M,V,F=[];if(o){let W=e.kernelCustomData.wT??e.compute(Oe(t[1],yo),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];if(n.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=W),w){let J=d*l*p;O=t[0].reshape([1,k,J]),M=W.reshape([1,J,b]),V=[1,k,b]}else O=t[0].reshape([k,d*l,p]),M=W.reshape([1,p,b]),V=[k,y*_,b];F.push(O),F.push(M)}else O=t[0].reshape([k,p,d*l]),M=t[1].reshape([1,b,p]),V=[k,b,y*_],F.push(M),F.push(O);s&&F.push(t[2]);let j=V[2],ne=F[0].dims[F[0].dims.length-1];j<8&&ne<8?e.compute(Yr(F,n,a,V,o,r),{inputs:F}):e.compute(nr(F,n,a,V,o,r),{inputs:F});return}let S=!0,$=e.kernelCustomData.wT??e.compute(Oe(t[1],yo),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];n.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=$);let v=[t[0],$];s&&v.push(t[2]);let T=o?y*_:b,C=o?b:y*_,A=f*h*p;e.compute(Ad(v,n,a,T,C,A,s,S,r),{inputs:v})},ng=(e,t)=>{let n=t.format==="NHWC",r=[e.inputs[0].reshape(n?[e.inputs[0].dims[0],1,e.inputs[0].dims[1],e.inputs[0].dims[2]]:[e.inputs[0].dims[0],e.inputs[0].dims[1],1,e.inputs[0].dims[2]]),e.inputs[1].reshape([e.inputs[1].dims[0],e.inputs[1].dims[1],1,e.inputs[1].dims[2]])];e.inputs.length===3&&r.push(e.inputs[2]);let o=[0,t.pads[0],0,t.pads[1]],a=[1].concat(t.strides),s=[1].concat(t.dilations),d=[1].concat(t.kernelShape),l=bo({...t,pads:o,strides:a,dilations:s,kernelShape:d},r);Ud(e,r,l,p=>n?[p[0],p[2],p[3]]:[p[0],p[1],p[3]])},og=(e,t,n)=>{let r=n.format==="NHWC"?"channelsLast":"channelsFirst",o=bo(n,t),a=n.autoPad==="NOTSET"?n.pads:n.autoPad,s=zd(t[0].dims,t[1].dims,n.strides,n.dilations,a,!1,r);e.compute(Od(t,o,s.outShape,[s.filterDepth,s.filterHeight,s.filterWidth],[s.padInfo.front,s.padInfo.top,s.padInfo.left],r))},wo=(e,t)=>{if(rg(e.inputs,t),e.inputs[0].dims.length===3)ng(e,t);else if(e.inputs[0].dims.length===5)og(e,e.inputs,t);else{let n=bo(t,e.inputs);Ud(e,e.inputs,n)}}});var Vd,Wd=G(()=>{"use strict";te();tt();ae();ce();Vd=(e,t,n)=>{let r=e.length>2,o=t.outputShape,a=t.format==="NHWC",s=t.group,d=e[1].dims,l=d[2]/s,p=d[3],f=a?ge(l):1,h=a?ge(p):1,y=a?p===1?f:h:1,_=E.size(o)/h,b=[Math.ceil(_/64),1,1];me("verbose",()=>`[conv2d_backprop_webgpu] dispatch = ${b}`);let w=["rank","rank"],S=[t.strides[0],t.strides[1]],$=[t.kernelShape[a?1:2],t.kernelShape[a?2:3]],v=[t.dilations[0],t.dilations[1]],T=[$[0]+(t.dilations[0]<=1?0:(t.kernelShape[a?1:2]-1)*(t.dilations[0]-1)),$[1]+(t.dilations[1]<=1?0:(t.kernelShape[a?2:3]-1)*(t.dilations[1]-1))],C=[T[0]-1-Math.floor((t.pads[0]+t.pads[2])/2),T[1]-1-Math.floor((t.pads[1]+t.pads[3])/2)],A=[{type:12,data:_},{type:12,data:S},{type:12,data:$},{type:12,data:v},{type:12,data:T},{type:6,data:C},{type:12,data:l},{type:12,data:p},...H(e[0].dims,e[1].dims)];r&&(A.push(...H(e[2].dims)),w.push("rank")),A.push(...H(o));let k=O=>{let M=[{name:"output_size",type:"u32"},{name:"strides",type:"u32",length:S.length},{name:"filter_dims",type:"u32",length:$.length},{name:"dilations",type:"u32",length:$.length},{name:"effective_filter_dims",type:"u32",length:T.length},{name:"pads",type:"i32",length:C.length},{name:"input_channels_per_group",type:"u32"},{name:"output_channels_per_group",type:"u32"}],V=_e(e[0].dataType),F=a?1:2,j=a?2:3,ne=a?3:1,W=P("W",e[1].dataType,e[1].dims.length,y),J=P("Dy",e[0].dataType,e[0].dims.length,f),ve=[J,W];r&&ve.push(P("bias",e[2].dataType,[o[ne]].length,h));let Q=N("result",e[0].dataType,o.length,h),ee=()=>{let Z="";if(f===1)Z+=` + let w_offset = ${W.indicesToOffset(`${W.type.indices}(u32(wRPerm), u32(wCPerm), inputChannel, wOutChannel)`)}; + let wValue = ${W.getByOffset(`w_offset / ${y}`)}; + dotProd = dotProd + xValue * wValue;`;else if(p===1)Z+=` + let wValue = ${W.getByOffset(`${W.indicesToOffset(`${W.type.indices}(u32(wRPerm), u32(wCPerm), inputChannel, wOutChannel)`)} / ${y}`)}; + dotProd = dotProd + dot(xValue, wValue);`;else for(let pe=0;pe(i32(r), i32(c)) - uniforms.pads; + let dyRCorner = dyCorner.x; + let dyCCorner = dyCorner.y; + let groupId = d1 / uniforms.output_channels_per_group; + let wOutChannel = d1 - groupId * uniforms.output_channels_per_group; + // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1). + // ? = to be determined. : = across all values in that axis. + var dotProd = ${Q.type.value}(0.0); + var wR: u32 = 0; + if (uniforms.dilations.x == 1) { + // Minimum wR >= 0 that satisfies (dyRCorner + wR) % (uniforms.strides.x) == 0 + wR = u32(((dyRCorner + i32(uniforms.strides.x) - 1) / i32(uniforms.strides.x)) * i32(uniforms.strides.x) - dyRCorner); + } + for (; wR < uniforms.effective_filter_dims.x; wR = wR + 1) { + if (wR % uniforms.dilations.x != 0) { + continue; + } + let dyR = (${V}(dyRCorner) + ${V}(wR)) / ${V}(uniforms.strides[0]); + let wRPerm = uniforms.filter_dims.x - 1 - wR / uniforms.dilations.x; + if (dyR < 0.0 || dyR >= ${V}(uniforms.Dy_shape[${F}]) || fract(dyR) > 0.0 || + wRPerm < 0) { + continue; + } + let idyR: u32 = u32(dyR); + var wC: u32 = 0; + if (uniforms.dilations.y == 1) { + // Minimum wC >= 0 that satisfies (dyCCorner + wC) % (uniforms.strides.y) == 0 + wC = u32(((dyCCorner + i32(uniforms.strides.y) - 1) / i32(uniforms.strides.y)) * i32(uniforms.strides.y) - dyCCorner); + } + + for (; wC < uniforms.effective_filter_dims.y; wC = wC + 1) { + if (wC % uniforms.dilations.y != 0) { + continue; + } + let dyC = (${V}(dyCCorner) + ${V}(wC)) / ${V}(uniforms.strides.y); + let wCPerm = uniforms.filter_dims.y - 1 - wC / uniforms.dilations.y; + if (dyC < 0.0 || dyC >= ${V}(uniforms.Dy_shape[${j}]) || + fract(dyC) > 0.0 || wCPerm < 0) { + continue; + } + let idyC: u32 = u32(dyC); + var inputChannel = groupId * uniforms.input_channels_per_group; + for (var d2: u32 = 0; d2 < uniforms.input_channels_per_group; d2 = d2 + ${f}) { + let xValue = ${a?J.getByOffset(`${J.indicesToOffset(`${J.type.indices}(batch, idyR, idyC, inputChannel)`)} / ${f}`):J.get("batch","inputChannel","idyR","idyC")}; + ${ee()} + inputChannel = inputChannel + ${f}; + } + wC = wC + uniforms.strides.y - 1; + } + wR = wR + uniforms.strides[0] - 1; + } + let value = dotProd${r?` + bias[d1 / ${h}]`:""}; + ${Q.setByOffset("global_idx","value")}; + `;return` + ${O.registerUniforms(M).declareVariables(...ve,Q)} + ${O.mainStart()} + ${O.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")}; + ${le}}`};return{name:"ConvTranspose2D",shaderCache:{hint:`${t.cacheKey};${f}${y}${h}${p===1}`,inputDependencies:w},getRunData:()=>({dispatchGroup:{x:b[0],y:b[1],z:b[2]},outputs:[{dims:n?n(o):o,dataType:e[0].dataType}],programUniforms:A}),getShaderSource:k}}});var ig,ag,sg,Ld,Gd,ug,Hd,dg,Fd,qd=G(()=>{"use strict";Wd();vt();ct();ig=(e,t,n,r,o,a)=>(e-1)*t+n+(r-1)*o+1-a,ag=(e,t,n,r,o)=>{let a=Math.floor(e/2);t==="SAME_UPPER"?(n[r]=a,n[o]=e-a):t==="SAME_LOWER"&&(n[r]=e-a,n[o]=a)},sg=(e,t,n,r,o,a,s,d,l,p)=>{let f=e.length-2,h=p.length===0;l.length{let n=e.kernelShape.slice();if(e.kernelShape.length===0||e.kernelShape.reduce((h,y)=>h*y,1)===0){n.length=0;for(let h=2;hh+y,0)===0){let h=t[0].dims.length-2;l=new Array(h).fill(1)}let p=e.strides.slice();if(p.reduce((h,y)=>h+y,0)===0){let h=t[0].dims.length-2;p=new Array(h).fill(1)}sg(d,n,l,e.autoPad,e.group,o,p,r,s,a);let f=Object.assign({},e);return Object.assign(f,{kernelShape:n,pads:o,outputPadding:s,outputShape:a,dilations:l,strides:p}),f},Gd=e=>{let t=Zr(e),n=e.format,r=["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][typeof e.autoPad>"u"?0:e.autoPad],o=e.dilations,a=e.group,s=e.kernelShape,d=e.pads,l=e.strides,p=e.wIsConst(),f=e.outputPadding,h=e.outputShape;return{autoPad:r,format:n,dilations:o,group:a,kernelShape:s,outputPadding:f,outputShape:h,pads:d,strides:l,wIsConst:p,...t,cacheKey:`${e.format};${t.activation};`}},ug=(e,t)=>{if(!e||e.length!==2&&e.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(e[0].dims.length!==4&&e[0].dims.length!==3)throw new Error("currently only support 2-dimensional conv");if(e[0].dims.length!==e[1].dims.length)throw new Error("filter does not have same dimension as input");let n=e[0].dims[t.format==="NHWC"?e[0].dims.length-1:1],r=e[1].dims[0];if(n!==r)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");let o=e[1].dims[1]*t.group;if(e.length===3&&(e[2].dims.length!==1||e[2].dims[0]!==o))throw new Error("invalid bias");let a=e[0].dims.length-2;if(t.dilations.reduce((f,h)=>f+h,0)>0&&t.dilations.length!==a)throw new Error(`dilations should be ${a}D`);if(t.strides.reduce((f,h)=>f+h,0)>0&&t.strides.length!==a)throw new Error(`strides should be ${a}D`);if(t.pads.reduce((f,h)=>f+h,0)>0&&t.pads.length!==a*2)throw new Error(`pads should be ${a*2}D`);if(t.outputPadding.length!==a&&t.outputPadding.length!==0)throw new Error(`output_padding should be ${a}D`);if(t.kernelShape.reduce((f,h)=>f+h,0)>0&&t.kernelShape.length!==0&&t.kernelShape.length!==e[1].dims.length-2)throw new Error("invalid kernel shape");if(t.outputShape.length!==0&&t.outputShape.length!==e[0].dims.length-2)throw new Error("invalid output shape")},Hd=(e,t,n,r)=>{let o=e.kernelCustomData.wT??e.compute(Oe(t[1],[2,3,0,1]),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];n.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=o);let a=[t[0],o];t.length===3&&a.push(t[2]),e.compute(Vd(a,n,r),{inputs:a})},dg=(e,t)=>{let n=t.format==="NHWC",r=[e.inputs[0].reshape(n?[e.inputs[0].dims[0],1,e.inputs[0].dims[1],e.inputs[0].dims[2]]:[e.inputs[0].dims[0],e.inputs[0].dims[1],1,e.inputs[0].dims[2]]),e.inputs[1].reshape([e.inputs[1].dims[0],e.inputs[1].dims[1],1,e.inputs[1].dims[2]])];e.inputs.length===3&&r.push(e.inputs[2]);let o=t.kernelShape;(o.length===0||o[0]===0)&&(o=[e.inputs[1].dims[2]]);let a=t.dilations;(a.length===0||a[0]===0)&&(a=[1]);let s=t.strides;(s.length===0||s[0]===0)&&(s=[1]);let d=t.pads;d.length===0&&(d=[0,0]),d=[0,d[0],0,d[1]],s=[1].concat(s),a=[1].concat(a),o=[1].concat(o);let l=t.outputPadding;l=[0].concat(l);let p=Ld({...t,pads:d,strides:s,dilations:a,kernelShape:o,outputPadding:l},r);Hd(e,r,p,f=>n?[f[0],f[2],f[3]]:[f[0],f[1],f[3]])},Fd=(e,t)=>{if(ug(e.inputs,t),e.inputs[0].dims.length===3)dg(e,t);else{let n=Ld(t,e.inputs);Hd(e,e.inputs,n)}}});var lg,Kd,jd,Zd=G(()=>{"use strict";te();ae();Ce();ce();lg=(e,t,n,r)=>{let o=E.size(t),a=t.length,s=P("input",e,a),d=N("output",e,a),l=n.dataType===6?n.getInt32Array()[0]:Number(n.getBigInt64Array()[0]),p=E.normalizeAxis(l,a),f=h=>{let y=` i32(${s.indicesGet("inputIndices","uniforms.axis")}) `,_=K("uniforms.input_shape","uniforms.axis",a),b=r.reverse?y+(r.exclusive?" + 1":""):"0",w=r.reverse?_:y+(r.exclusive?"":" + 1");return` + ${h.registerUniform("outputSize","u32").registerUniform("axis","u32").declareVariables(s,d)} + ${h.mainStart()} + ${h.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + var inputIndices = ${d.offsetToIndices("global_idx")}; + var sum = ${d.type.value}(0); + let first : i32 = ${b}; + let last : i32 = ${w}; + for (var i : i32 = first; i < last; i++) { + ${s.indicesSet("inputIndices","uniforms.axis","u32(i)")}; + sum = sum + ${s.getByIndices("inputIndices")}; + } + ${d.setByOffset("global_idx","sum")}; + }`};return{name:"CumSum",shaderCache:{hint:r.cacheKey,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:t,dataType:e}],dispatchGroup:{x:Math.ceil(o/64)},programUniforms:[{type:12,data:o},{type:12,data:p},...H(t,t)]}),getShaderSource:f}},Kd=(e,t)=>{let n=e.inputs[0].dims,r=e.inputs[0].dataType,o=e.inputs[1];e.compute(lg(r,n,o,t),{inputs:[0]})},jd=e=>{let t=e.exclusive===1,n=e.reverse===1;return re({exclusive:t,reverse:n})}});var cg,pg,mg,Qd,Yd,Xd=G(()=>{"use strict";te();ae();Ce();ce();cg=e=>{if(!e||e.length!==1)throw new Error("DepthToSpace requires 1 input.");if(e[0].dims.length!==4)throw new Error("DepthToSpace requires 4D input.")},pg=(e,t,n,r)=>{let o=[];o.push(`fn perm(i: ${r.type.indices}) -> ${n.type.indices} { + var a: ${n.type.indices};`);for(let a=0;a{let n,r,o,a,s,d,l=t.format==="NHWC",p=t.blocksize,f=t.mode==="DCR";l?([n,r,o,a]=e.dims,s=f?[n,r,o,p,p,a/p**2]:[n,r,o,a/p**2,p,p],d=f?[0,1,3,2,4,5]:[0,1,4,2,5,3]):([n,r,o,a]=[e.dims[0],e.dims[2],e.dims[3],e.dims[1]],s=f?[n,p,p,a/p**2,r,o]:[n,a/p**2,p,p,r,o],d=f?[0,3,4,1,5,2]:[0,1,4,2,5,3]);let h=e.reshape(s),y=h.dims.length,_=e.dataType,b=P("a",_,y),w=N("output",_,y),S=$=>` + ${$.registerUniform("output_size","u32").declareVariables(b,w)} + + ${pg(d,y,b,w)} + + ${$.mainStart()} + ${$.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let indices = ${w.offsetToIndices("global_idx")}; + let aIndices = perm(indices); + + ${w.setByOffset("global_idx",b.getByIndices("aIndices"))} + }`;return{name:"DepthToSpace",shaderCache:{hint:`${e.dims};${t.blocksize};${t.mode}`,inputDependencies:["rank"]},getRunData:$=>{let v=l?[n,r*p,o*p,a/p**2]:[n,a/p**2,r*p,o*p],T=E.size(v),C=h.dims,A=E.sortBasedOnPerm(C,d);return{outputs:[{dims:v,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(T/64)},programUniforms:[{type:12,data:T},...H(C,A)]}},getShaderSource:S}},Qd=(e,t)=>{cg(e.inputs),e.compute(mg(e.inputs[0],t))},Yd=e=>re({blocksize:e.blocksize,mode:e.mode,format:e.format})});var vo,tn,Jd,fg,hg,$o,xo,el,gg,tl,rl,nl=G(()=>{"use strict";te();ae();Ce();ce();vo="[a-zA-Z]|\\.\\.\\.",tn="("+vo+")+",Jd="^"+tn+"$",fg="("+tn+",)*"+tn,hg="^"+fg+"$",$o=class{constructor(t=-1){this.symbolToIndices=new Map,this.inputIndex=t}addSymbol(t,n){let r=this.symbolToIndices.get(t);r===void 0?r=[n]:r.push(n),this.symbolToIndices.set(t,r)}},xo=class{constructor(t,n){this.equation=n;this.hasEllipsis=!1,this.symbolToInfo=new Map,this.lhs=new Array,this.outputDims=[];let[r,o]=n.includes("->")?n.split("->",2):[n,""];if(!r.match(RegExp(hg)))throw new Error("Invalid LHS term");if(r.split(",").forEach((d,l)=>{let p=t[l].dims.slice();if(!d.match(RegExp(Jd)))throw new Error("Invalid LHS term");let f=this.processTerm(d,!0,p,l);this.lhs.push(f)}),o==="")o+=[...this.symbolToInfo.entries()].filter(([d,l])=>l.count===1||d==="...").map(([d])=>d).join("");else if(!o.match(RegExp(tn)))throw new Error("Invalid RHS");o.match(RegExp(vo,"g"))?.forEach(d=>{if(d==="...")this.outputDims=this.outputDims.concat(this.ellipsisDims);else{let l=this.symbolToInfo.get(d);if(l===void 0)throw new Error("Invalid RHS symbol");this.outputDims.push(l.dimValue)}}),this.rhs=this.processTerm(o,!1,this.outputDims)}addSymbol(t,n,r){let o=this.symbolToInfo.get(t);if(o!==void 0){if(o.dimValue!==n&&o.count!==1)throw new Error("Dimension mismatch");o.count++,o.inputIndices.push(r)}else o={count:1,dimValue:n,inputIndices:[r]};this.symbolToInfo.set(t,o)}processTerm(t,n,r,o=-1){let a=r.length,s=!1,d=[],l=0;if(!t.match(RegExp(Jd))&&!n&&t!=="")throw new Error("Invalid LHS term");let p=t.match(RegExp(vo,"g")),f=new $o(o);return p?.forEach((h,y)=>{if(h==="..."){if(s)throw new Error("Only one ellipsis is allowed per input term");s=!0;let _=a-p.length+1;if(_<0)throw new Error("Ellipsis out of bounds");if(d=r.slice(l,l+_),this.hasEllipsis){if(this.ellipsisDims.length!==d.length||this.ellipsisDims.toString()!==d.toString())throw new Error("Ellipsis dimensions mismatch")}else if(n)this.hasEllipsis=!0,this.ellipsisDims=d;else throw new Error("Ellipsis must be specified in the LHS");for(let b=0;be+"_max",gg=(e,t,n,r)=>{let a=e.map(f=>f.length).map((f,h)=>P(`input${h}`,t,f)),s=E.size(r),d=N("output",t,r.length),l=[...n.symbolToInfo.keys()].filter(f=>!n.rhs.symbolToIndices.has(f)),p=f=>{let h=[],y="var prod = 1.0;",_="var sum = 0.0;",b="sum += prod;",w=[],S=[],$=[],v=[],T=n.symbolToInfo.size===n.rhs.symbolToIndices.size;n.symbolToInfo.forEach((A,k)=>{if(n.rhs.symbolToIndices.has(k)){let O=n.rhs.symbolToIndices.get(k)?.[0];O!==void 0&&n.lhs.forEach((M,V)=>{if(A.inputIndices.includes(V)){let F=M.symbolToIndices.get(k);if(F===void 0)throw new Error("Invalid symbol error");F.forEach(j=>{h.push(`${a[V].indicesSet(`input${V}Indices`,j,d.indicesGet("outputIndices",O))}`)})}})}else n.lhs.forEach((O,M)=>{if(A.inputIndices.includes(M)){let V=O.symbolToIndices.get(k);if(V===void 0)throw new Error("Invalid symbol error");V.forEach(F=>{w.push(`${a[M].indicesSet(`input${M}Indices`,F,`${k}`)}`)}),v.push(`prod *= ${a[M].getByIndices(`input${M}Indices`)};`)}}),S.push(`for(var ${k}: u32 = 0; ${k} < uniforms.${el(k)}; ${k}++) {`),$.push("}")});let C=T?[...h,`let sum = ${a.map((A,k)=>A.getByIndices(`input${k}Indices`)).join(" * ")};`]:[...h,_,...S,...w,y,...v,b,...$];return` + ${f.registerUniforms(l.map(A=>({name:`${el(A)}`,type:"u32"}))).registerUniform("outputSize","u32").declareVariables(...a,d)} + + ${f.mainStart()} + ${f.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + var outputIndices = ${d.offsetToIndices("global_idx")}; + ${a.map((A,k)=>`var input${k}Indices: ${a[k].type.indices};`).join(` +`)} + ${C.join(` +`)}; + ${d.setByOffset("global_idx","sum")}; + }`};return{name:"Einsum",shaderCache:{hint:n.equation,inputDependencies:e.map(()=>"rank")},getRunData:()=>{let f=l.filter(y=>n.symbolToInfo.has(y)).map(y=>({type:12,data:n.symbolToInfo.get(y)?.dimValue||0}));f.push({type:12,data:s});let h=e.map((y,_)=>[...H(y)]).reduce((y,_)=>y.concat(_),f);return h.push(...H(r)),{outputs:[{dims:r,dataType:t}],dispatchGroup:{x:Math.ceil(s/64)},programUniforms:h}},getShaderSource:p}},tl=(e,t)=>{let n=new xo(e.inputs,t.equation),r=n.outputDims,o=e.inputs.map((a,s)=>a.dims);e.compute(gg(o,e.inputs[0].dataType,n,r))},rl=e=>{let t=e.equation.replace(/\s+/g,"");return re({equation:t})}});var yg,ol,bg,_g,il,al=G(()=>{"use strict";te();ae();ce();yg=e=>{if(!e||e.length!==2)throw new Error("Expand requires 2 input.");let t=e[0].dims,n=Array.from(e[1].getBigInt64Array(),Number),r=n.length{let n=e.length-t.length,r=[];for(let o=0;oe.length>t.length?ol(e,t):ol(t,e),_g=e=>{let t=e[0].dims,n=Array.from(e[1].getBigInt64Array(),Number),r=bg(t,n),o=e[0].dataType,a=o===9||E.size(t)===1,s=o===9||t.length>0&&t[t.length-1]%4===0?4:1,d=a||r.length>0&&r[r.length-1]%4===0?4:1,l=Math.ceil(E.size(r)/d),p=h=>{let y=P("input",o,t.length,s),_=N("output",o,r.length,d),b;if(o===9){let w=(S,$,v="")=>` + let outputIndices${$} = ${_.offsetToIndices(`outputOffset + ${$}u`)}; + let offset${$} = ${y.broadcastedIndicesToOffset(`outputIndices${$}`,_)}; + let index${$} = offset${$} / 4u; + let component${$} = offset${$} % 4u; + ${S}[${$}] = ${v}(${y.getByOffset(`index${$}`)}[component${$}]); + `;b=` + let outputOffset = global_idx * ${d}; + var data = vec4(0); + ${w("data",0,"u32")} + ${w("data",1,"u32")} + ${w("data",2,"u32")} + ${w("data",3,"u32")} + ${_.setByOffset("global_idx","data")} + }`}else b=` + let outputIndices = ${_.offsetToIndices(`global_idx * ${d}`)}; + let inputOffset = ${y.broadcastedIndicesToOffset("outputIndices",_)}; + let data = ${_.type.value}(${y.getByOffset(`inputOffset / ${s}`)}); + ${_.setByOffset("global_idx","data")} + }`;return` + ${h.registerUniform("vec_size","u32").declareVariables(y,_)} + ${h.mainStart()} + ${h.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + ${b}`},f=[{type:12,data:l},...H(t,r)];return{name:"Expand",shaderCache:{hint:`${r.length};${s}${d}`,inputDependencies:["rank"]},getShaderSource:p,getRunData:()=>({outputs:[{dims:r,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(l/64)},programUniforms:f})}},il=e=>{yg(e.inputs),e.compute(_g(e.inputs),{inputs:[0]})}});var wg,sl,ul=G(()=>{"use strict";te();ae();ce();jr();wg=e=>{let t=e[0].dataType,n=E.size(e[0].dims),r=E.size(e[1].dims),o=r%4===0,a=s=>{let d=P("x",t,[1],4),l=P("bias",t,[1],4),p=N("y",t,[1],4),f=[{name:"output_vec_size",type:"u32"},{name:"bias_size",type:"u32"}],h=_=>` + let bias${_}_offset: u32 = (global_idx * 4 + ${_}) % uniforms.bias_size; + let bias${_} = ${l.getByOffset(`bias${_}_offset / 4`)}[bias${_}_offset % 4];`,y=o?` + let bias = ${l.getByOffset("global_idx % (uniforms.bias_size / 4)")};`:`${h(0)}${h(1)}${h(2)}${h(3)} + let bias = ${d.type.value}(bias0, bias1, bias2, bias3);`;return`${s.registerUniforms(f).declareVariables(d,l,p)} + + ${mo(ze(t))} + + ${s.mainStart(Et)} + ${s.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_vec_size")} + + let x = ${d.getByOffset("global_idx")}; + ${y} + let x_in = x + bias; + ${p.setByOffset("global_idx",fo("x_in"))} + }`};return{name:"FastGeluWithBias",shaderCache:{hint:`${o}`,inputDependencies:["type","type"]},getShaderSource:a,getRunData:s=>({outputs:[{dims:s[0].dims,dataType:s[0].dataType}],programUniforms:[{type:12,data:Math.ceil(n/4)},{type:12,data:r}],dispatchGroup:{x:Math.ceil(n/Et/4)}})}},sl=e=>{e.inputs.length<2||E.size(e.inputs[1].dims)===0?nd(e):e.compute(wg(e.inputs))}});var vg,$g,dl,ll,cl=G(()=>{"use strict";te();ae();Ce();ce();vg=e=>{if(!e||e.length!==2)throw new Error("Gather requires 2 inputs.")},$g=(e,t)=>{let n=e[0].dims,r=e[1].dims,o=n.length,a=E.normalizeAxis(t.axis,o),s=n.slice(0);s.splice(a,1,...r);let d=n[a],l=e[0].dataType===9?4:1,p=Math.ceil(E.size(s)/l),f=[{type:12,data:p},{type:6,data:d},{type:12,data:a},...H(e[0].dims,e[1].dims,s)],h=y=>{let _=P("data",e[0].dataType,e[0].dims.length,l),b=P("inputIndices",e[1].dataType,e[1].dims.length),w=N("output",e[0].dataType,s.length,l),S=v=>{let T=r.length,C=`var indicesIndices${v} = ${b.type.indices}(0);`;for(let A=0;A1?`indicesIndices${v}[${A}]`:`indicesIndices${v}`} = ${s.length>1?`outputIndices${v}[uniforms.axis + ${A}]`:`outputIndices${v}`};`;C+=` + var idx${v} = ${b.getByIndices(`indicesIndices${v}`)}; + if (idx${v} < 0) { + idx${v} = idx${v} + uniforms.axisDimLimit; + } + var dataIndices${v} : ${_.type.indices}; + `;for(let A=0,k=0;A1?`dataIndices${v}[${A}]`:`dataIndices${v}`} = u32(idx${v});`,k+=T):(C+=`${o>1?`dataIndices${v}[${A}]`:`dataIndices${v}`} = ${s.length>1?`outputIndices${v}[${k}]`:`outputIndices${v}`};`,k++);return C},$;if(e[0].dataType===9){let v=(T,C,A="")=>` + let outputIndices${C} = ${w.offsetToIndices(`outputOffset + ${C}u`)}; + ${S(C)}; + let offset${C} = ${_.indicesToOffset(`dataIndices${C}`)}; + let index${C} = offset${C} / 4u; + let component${C} = offset${C} % 4u; + ${T}[${C}] = ${A}(${_.getByOffset(`index${C}`)}[component${C}]); + `;$=` + let outputOffset = global_idx * ${l}; + var value = vec4(0); + ${v("value",0,"u32")} + ${v("value",1,"u32")} + ${v("value",2,"u32")} + ${v("value",3,"u32")} + ${w.setByOffset("global_idx","value")} + `}else $=` + let outputIndices = ${w.offsetToIndices("global_idx")}; + ${S("")}; + let value = ${_.getByIndices("dataIndices")}; + ${w.setByOffset("global_idx","value")}; + `;return` + ${y.registerUniform("outputSize","u32").registerUniform("axisDimLimit","i32").registerUniform("axis","u32").declareVariables(_,b,w)} + ${y.mainStart()} + ${y.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + ${$} + }`};return{name:"Gather",shaderCache:{hint:t.cacheKey,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:s,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(p/64)},programUniforms:f}),getShaderSource:h}},dl=e=>re({axis:e.axis}),ll=(e,t)=>{let n=e.inputs;vg(n),e.compute($g(e.inputs,t))}});var xg,pl,ml,fl=G(()=>{"use strict";te();ae();ce();xg=(e,t,n,r,o,a,s,d,l)=>{let p=[{type:12,data:a},{type:12,data:r},{type:12,data:o},{type:12,data:n},{type:12,data:s},{type:12,data:d},{type:12,data:l}],f=[a];p.push(...H(t.dims,f));let h=y=>{let _=P("indices_data",t.dataType,t.dims.length),b=N("input_slice_offsets_data",12,1,1),w=[_,b],S=[{name:"output_size",type:"u32"},{name:"batch_dims",type:"u32"},{name:"input_dims",type:"u32",length:o.length},{name:"sizes_from_slice_dims_data",type:"u32",length:n.length},{name:"num_slices_per_batch",type:"u32"},{name:"input_batch_stride",type:"u32"},{name:"num_slice_dims",type:"u32"}];return` + ${y.registerUniforms(S).declareVariables(...w)} + ${y.mainStart()} + ${y.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let batch_idx = global_idx / uniforms.num_slices_per_batch; + let base_offset = batch_idx * uniforms.input_batch_stride; + + let slice_indices_base_offset = global_idx * uniforms.num_slice_dims; + var relative_slice_offset = 0; + for (var dim_idx = 0u; dim_idx < uniforms.num_slice_dims; dim_idx ++) { + var index = i32(indices_data[dim_idx + slice_indices_base_offset].x); + let input_dim_idx = uniforms.batch_dims + dim_idx; + if (index < 0) { + ${o.length===1?"index += i32(uniforms.input_dims);":"index += i32(uniforms.input_dims[input_dim_idx]);"} + } + ${n.length===1?"relative_slice_offset += index * i32(uniforms.sizes_from_slice_dims_data);":"relative_slice_offset += index * i32(uniforms.sizes_from_slice_dims_data[dim_idx]);"} + } + + input_slice_offsets_data[global_idx] = base_offset + u32(relative_slice_offset); + }`};return e.compute({name:"computeSliceOffsets",shaderCache:{hint:`${o.length}_${n.length}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:f,dataType:e.inputs[1].dataType}],dispatchGroup:{x:Math.ceil(a/64)},programUniforms:p}),getShaderSource:h},{inputs:[t],outputs:[-1]})[0]},pl=(e,t)=>{let n=e.inputs,r=n[0].dims,o=n[0].dataType,a=n[1].dims,s=a[a.length-1],d=E.sizeToDimension(a,a.length-1),l=E.sizeFromDimension(r,t.batchDims+s),p=E.sizeToDimension(r,t.batchDims),f=E.sizeFromDimension(r,t.batchDims),h=d/p,y=new Array(s),_=l;for(let C=0;Cr.length)throw new Error("last dimension of indices must not be larger than rank of input tensor");let S=a.slice(0,-1).concat(r.slice(w)),$=E.size(S),v=[{type:12,data:$},{type:12,data:l},...H(n[0].dims,b.dims,S)],T=C=>{let A=P("data",n[0].dataType,n[0].dims.length),k=P("slice_offsets",12,b.dims.length),O=N("output",n[0].dataType,S.length);return` + ${C.registerUniform("output_size","u32").registerUniform("slice_size","u32").declareVariables(A,k,O)} + ${C.mainStart()} + ${C.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let slice_offset = slice_offsets[global_idx / uniforms.slice_size]; + output[global_idx] = data[u32(slice_offset) + global_idx % uniforms.slice_size]; + }`};e.compute({name:"GatherND",shaderCache:{hint:t.cacheKey,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:S,dataType:o}],dispatchGroup:{x:Math.ceil($/64)},programUniforms:v}),getShaderSource:T},{inputs:[n[0],b]})},ml=e=>({batchDims:e.batch_dims,cacheKey:""})});var Sg,Tg,hl,gl,yl=G(()=>{"use strict";te();ae();Ce();ce();Sg=(e,t)=>{if(e.length<3||e.length>4)throw new Error("GatherBlockQuantized requires 3 or 4 inputs.");let n=E.normalizeAxis(t.quantizeAxis,e[0].dims.length),r=t.blockSize,o=e[0],a=e[2],s=e.length===4?e[3]:void 0;if(a.dims.length!==o.dims.length||!o.dims.map((d,l)=>l===n?Math.ceil(d/r)===a.dims[l]:d===a.dims[l]).reduce((d,l)=>d&&l,!0))throw new Error("Scales must have the same rank as the input tensor and the dims should match except on gatherAxis.");if(s){if(s.dataType!==o.dataType)throw new Error("Zero point must have the same data type as the input tensor.");if(s.dims.length!==a.dims.length||!s.dims.map((d,l)=>d===a.dims[l]).reduce((d,l)=>d&&l,!0))throw new Error("Zero point must have the same rank as the input tensor and the dims should match except on quantizeAxis.")}},Tg=(e,t)=>{let n=e[0].dims,r=e[1].dims,o=n.length,a=E.normalizeAxis(t.gatherAxis,o),s=E.normalizeAxis(t.quantizeAxis,o),d=n.slice(0);d.splice(a,1,...r);let l=E.size(d),p=e[2].dataType,h=e[0].dataType===22,y=[{type:12,data:l},{type:12,data:s},{type:12,data:a},{type:12,data:t.blockSize},...H(...e.map((b,w)=>b.dims),d)],_=b=>{let w=P("data",e[0].dataType,e[0].dims.length),S=P("inputIndices",e[1].dataType,e[1].dims.length),$=P("scales",e[2].dataType,e[2].dims.length),v=e.length>3?P("zeroPoint",e[3].dataType,e[3].dims.length):void 0,T=N("output",p,d.length),C=[w,S,$];v&&C.push(v);let A=[{name:"output_size",type:"u32"},{name:"quantize_axis",type:"u32"},{name:"gather_axis",type:"u32"},{name:"block_size",type:"u32"}];return` + ${b.registerUniforms(A).declareVariables(...C,T)} + ${b.mainStart()} + let output_indices = ${T.offsetToIndices("global_idx")}; + var indices_indices = ${S.type.indices}(0); + ${r.length>1?` + for (var i: u32 = 0; i < ${r.length}; i++) { + let index = ${T.indicesGet("output_indices","uniforms.gather_axis + i")}; + ${S.indicesSet("indices_indices","i","index")}; + }`:`indices_indices = ${T.indicesGet("output_indices","uniforms.gather_axis")};`}; + var data_indices = ${w.type.indices}(0); + for (var i: u32 = 0; i < uniforms.gather_axis; i++) { + let index = ${T.indicesGet("output_indices","i")}; + ${w.indicesSet("data_indices","i","index")}; + } + var index_from_indices = ${S.getByIndices("indices_indices")}; + if (index_from_indices < 0) { + index_from_indices += ${n[a]}; + } + ${w.indicesSet("data_indices","uniforms.gather_axis","u32(index_from_indices)")}; + for (var i = uniforms.gather_axis + 1; i < ${d.length}; i++) { + let index = ${T.indicesGet("output_indices",`i + ${r.length} - 1`)}; + ${w.indicesSet("data_indices","i","index")}; + } + let data_offset = ${w.indicesToOffset("data_indices")}; + let data_index = data_offset % 8; + // Convert 4-bit packed data to 8-bit packed data. + let packed_4bit_quantized_data = ${w.getByOffset("data_offset / 8")}; + let packed_8bit_quantized_data = (packed_4bit_quantized_data >> (4 * (data_index % 2))) & 0x0f0f0f0f; + let quantized_data_vec = ${h?"unpack4xI8":"unpack4xU8"}(u32(packed_8bit_quantized_data)); + let quantized_data = quantized_data_vec[data_index / 2]; + var scale_indices = data_indices; + let quantize_axis_index = ${$.indicesGet("data_indices","uniforms.quantize_axis")} / uniforms.block_size; + ${$.indicesSet("scale_indices","uniforms.quantize_axis","quantize_axis_index")}; + var scale = ${$.getByIndices("scale_indices")}; + ${v?` + let zero_point_indices = scale_indices; + let zero_point_offset = ${v.indicesToOffset("zero_point_indices")}; + let zero_point_index = zero_point_offset % 8; + let packed_4bit_zero_points = ${v.getByOffset("zero_point_offset / 8")}; + let packed_8bit_zero_points = (packed_4bit_zero_points >> (4 * (zero_point_index % 2))) & 0x0f0f0f0f; + let zero_point_vec = ${h?"unpack4xI8":"unpack4xU8"}(u32(packed_8bit_zero_points)); + let zero_point = zero_point_vec[zero_point_index / 2];`:"var zero_point = 0"}; + let dequantized_data = ${ze(p)}(quantized_data - zero_point) * scale; + ${T.setByOffset("global_idx","dequantized_data")}; + }`};return{name:"GatherBlockQuantized",shaderCache:{hint:`${t.cacheKey};${e.filter((b,w)=>w!==1).map(b=>b.dims.join("_")).join(";")}`,inputDependencies:Array.from({length:e.length},(b,w)=>"rank")},getRunData:()=>({outputs:[{dims:d,dataType:p}],dispatchGroup:{x:Math.ceil(l/64)},programUniforms:y}),getShaderSource:_}},hl=(e,t)=>{let n=e.inputs;Sg(n,t),e.compute(Tg(e.inputs,t))},gl=e=>re({blockSize:e.blockSize,gatherAxis:e.gatherAxis,quantizeAxis:e.quantizeAxis})});var Cg,Ig,bl,_l,wl=G(()=>{"use strict";te();ae();Ce();ce();Cg=e=>{if(!e||e.length!==2)throw new Error("GatherElements requires 2 inputs.");if(e[0].dims.length<1)throw new Error("GatherElements requires that the data input be rank >= 1.");if(e[0].dims.length!==e[1].dims.length)throw new Error(`GatherElements requires that the data input and + indices input tensors be of same rank.`)},Ig=(e,t)=>{let n=e[0].dims,r=e[0].dataType,o=n.length,a=e[1].dims,s=e[1].dataType,d=E.normalizeAxis(t.axis,o),l=n[d],p=a.slice(0),f=E.size(p),h=P("input",r,o),y=P("indicesInput",s,a.length),_=N("output",r,p.length),b=[{type:12,data:f},{type:6,data:l},{type:12,data:d}];return b.push(...H(n,a,p)),{name:"GatherElements",shaderCache:{inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:p,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(f/64)},programUniforms:b}),getShaderSource:$=>` + ${$.registerUniform("outputSize","u32").registerUniform("axisDimLimit","i32").registerUniform("axis","u32").declareVariables(h,y,_)} + ${$.mainStart()} + ${$.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + + let outputIndices = ${_.offsetToIndices("global_idx")}; + + var idx = ${y.getByOffset("global_idx")}; + if (idx < 0) { + idx = idx + uniforms.axisDimLimit; + } + var inputIndices = ${h.type.indices}(outputIndices); + ${h.indicesSet("inputIndices","uniforms.axis","u32(idx)")}; + let value = ${h.getByIndices("inputIndices")}; + + ${_.setByOffset("global_idx","value")}; + }`}},bl=e=>re({axis:e.axis}),_l=(e,t)=>{let n=e.inputs;Cg(n),e.compute(Ig(e.inputs,t))}});var Ag,kg,vl,$l,xl=G(()=>{"use strict";te();ae();ce();Ag=e=>{if(!e)throw new Error("Input is missing");if(e.length<2||e.length>3)throw new Error("Invaid input number.");if(e.length===3&&e[2].dims.length>2)throw new Error("Invalid input shape of C");if(e[0].dataType!==e[1].dataType||e.length===3&&e[0].dataType!==e[2].dataType)throw new Error("Input types are mismatched")},kg=(e,t)=>{let n=e[0].dims.slice(),r=e[1].dims.slice(),[o,a,s]=Wr.getShapeOfGemmResult(n,t.transA,r,t.transB,e.length===3?e[2].dims:void 0),d=[o,a];if(!d)throw new Error("Can't use gemm on the given tensors");let l=16,p=Math.ceil(a/l),f=Math.ceil(o/l),h=!0,y=E.size(d),_=[{type:12,data:h?p:y},{type:12,data:o},{type:12,data:a},{type:12,data:s},{type:1,data:t.alpha},{type:1,data:t.beta}],b=["type","type"];e.length===3&&(_.push(...H(e[2].dims)),b.push("rank")),_.push(...H(d));let w=$=>{let v="";t.transA&&t.transB?v="value += a[k * uniforms.M + m] * b[n * uniforms.K + k];":t.transA&&!t.transB?v="value += a[k * uniforms.M + m] * b[k * uniforms.N + n];":!t.transA&&t.transB?v="value += a[m * uniforms.K + k] * b[n * uniforms.K + k];":!t.transA&&!t.transB&&(v="value += a[m * uniforms.K + k] * b[k * uniforms.N + n];");let T=t.alpha===1?"":"value *= uniforms.alpha;",C=P("a",e[0].dataType,e[0].dims),A=P("b",e[1].dataType,e[1].dims),k=C.type.value,O=null,M=[C,A];e.length===3&&(O=P("c",e[2].dataType,e[2].dims.length),M.push(O));let V=N("output",e[0].dataType,d.length);M.push(V);let F=[{name:"output_size",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"},{name:"alpha",type:"f32"},{name:"beta",type:"f32"}];return` + ${$.registerUniforms(F).declareVariables(...M)} + + ${$.mainStart()} + ${$.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let m = global_idx / uniforms.N; + let n = global_idx % uniforms.N; + + var value = ${k}(0); + for (var k: u32 = 0u; k < uniforms.K; k++) { + ${v} + } + + ${T} + ${O!=null?`let cOffset = ${O.broadcastedIndicesToOffset("vec2(m, n)",V)}; value += ${k}(uniforms.beta) * ${O.getByOffset("cOffset")};`:""} + output[global_idx] = value; + }`},S=$=>{let v=P("a",e[0].dataType,e[0].dims),T=P("b",e[1].dataType,e[1].dims),C=null,A=[v,T];e.length===3&&(C=P("c",e[2].dataType,e[2].dims.length),A.push(C));let k=N("output",e[0].dataType,d.length);A.push(k);let O=[{name:"num_tile_n",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"},{name:"alpha",type:"f32"},{name:"beta",type:"f32"}],M="",V="";t.transA&&t.transB?(V=` + var col = tile_row_start + local_id.x; + var row = k_start + local_id.y; + if (col < uniforms.M && row < uniforms.K) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.M + col]; + } else { + tile_a[local_id.y][local_id.x] = ${v.type.value}(0); + } + + col = k_start + local_id.x; + row = tile_col_start + local_id.y; + if (col < uniforms.K && row < uniforms.N) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.K + col]; + } else { + tile_b[local_id.y][local_id.x] = ${T.type.value}(0); + } + `,M="value += tile_a[k][local_id.y] * tile_b[local_id.x][k];"):t.transA&&!t.transB?(V=` + var col = tile_row_start + local_id.x; + var row = k_start + local_id.y; + if (col < uniforms.M && row < uniforms.K) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.M + col]; + } else { + tile_a[local_id.y][local_id.x] = ${v.type.value}(0); + } + + col = tile_col_start + local_id.x; + row = k_start + local_id.y; + if (col < uniforms.N && row < uniforms.K) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.N + col]; + } else { + tile_b[local_id.y][local_id.x] = ${T.type.value}(0); + } + `,M="value += tile_a[k][local_id.y] * tile_b[k][local_id.x];"):!t.transA&&t.transB?(V=` + var col = k_start + local_id.x; + var row = tile_row_start + local_id.y; + if (col < uniforms.K && row < uniforms.M) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.K + col]; + } else { + tile_a[local_id.y][local_id.x] = ${v.type.value}(0); + } + + col = k_start + local_id.x; + row = tile_col_start + local_id.y; + if (col < uniforms.K && row < uniforms.N) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.K + col]; + } else { + tile_b[local_id.y][local_id.x] = ${T.type.value}(0); + } + `,M="value += tile_a[local_id.y][k] * tile_b[local_id.x][k];"):!t.transA&&!t.transB&&(V=` + var col = k_start + local_id.x; + var row = tile_row_start + local_id.y; + if (col < uniforms.K && row < uniforms.M) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.K + col]; + } else { + tile_a[local_id.y][local_id.x] = ${v.type.value}(0); + } + + col = tile_col_start + local_id.x; + row = k_start + local_id.y; + if (col < uniforms.N && row < uniforms.K) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.N + col]; + } else { + tile_b[local_id.y][local_id.x] = ${T.type.value}(0); + } + `,M="value += tile_a[local_id.y][k] * tile_b[k][local_id.x];");let F=t.alpha===1?"":"value *= uniforms.alpha;";return` + ${$.registerUniforms(O).declareVariables(...A)} + var tile_a: array, ${l}>; + var tile_b: array, ${l}>; + ${$.mainStart([l,l,1])} + let tile_col_start = (workgroup_index % uniforms.num_tile_n) * ${l}; + let tile_row_start = (workgroup_index / uniforms.num_tile_n) * ${l}; + let num_tiles = (uniforms.K - 1) / ${l} + 1; + var k_start = 0u; + var value = ${k.type.value}(0); + for (var t: u32 = 0u; t < num_tiles; t++) { + ${V} + k_start = k_start + ${l}; + workgroupBarrier(); + + for (var k: u32 = 0u; k < ${l}; k++) { + ${M} + } + workgroupBarrier(); + } + + ${F} + let m = tile_row_start + local_id.y; + let n = tile_col_start + local_id.x; + ${C!=null?`let cOffset = ${C.broadcastedIndicesToOffset("vec2(m, n)",k)}; value += ${k.type.value}(uniforms.beta) * ${C.getByOffset("cOffset")};`:""} + if (m < uniforms.M && n < uniforms.N) { + output[m * uniforms.N + n] = value; + } + }`};return h?{name:"GemmShared",shaderCache:{hint:`${t.cacheKey}`,inputDependencies:b},getRunData:()=>({outputs:[{dims:d,dataType:e[0].dataType}],dispatchGroup:{x:p*f},programUniforms:_}),getShaderSource:S}:{name:"Gemm",shaderCache:{hint:`${t.cacheKey}`,inputDependencies:b},getRunData:()=>({outputs:[{dims:d,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(y/64)},programUniforms:_}),getShaderSource:w}},vl=e=>{let t=e.transA,n=e.transB,r=e.alpha,o=e.beta;return{transA:t,transB:n,alpha:r,beta:o,cacheKey:`${e.transA};${e.transB};${e.alpha===1}`}},$l=(e,t)=>{Ag(e.inputs),e.compute(kg(e.inputs,t))}});var pt,$t,Nt,Vt,Eg,Pg,zg,Og,Dg,Bg,Mg,Rg,Sl,Tl,Cl=G(()=>{"use strict";te();ae();Ce();ce();[pt,$t,Nt,Vt]=[0,1,2,3],Eg=e=>{if(e[0].dims.length!==4)throw new Error("only 4-D tensor is supported.");if(e[0].dims.length!==e[1].dims.length)throw new Error("input dimensions must be equal to grid dimensions");if(e[0].dims.length-2!==e[1].dims[e[1].dims.length-1])throw new Error(`last dimension of grid must be equal to ${e[0].dims.length-2}`);if(e[0].dims[0]!==e[1].dims[0])throw new Error("grid batch size must match input batch size")},Pg=` + fn gs_get_cubic_coeffs(x: f32) -> vec4 { + let cubic_alpha = -0.75f; + let x_abs = abs(x); + var coeffs: vec4; + coeffs[0] = (((cubic_alpha * (x_abs + 1) - 5 * cubic_alpha) * (x_abs + 1) + 8 * cubic_alpha) * (x_abs + 1) - 4 * cubic_alpha); + coeffs[1] = (((cubic_alpha + 2) * x_abs - (cubic_alpha + 3)) * x_abs * x_abs + 1); + coeffs[2] = (((cubic_alpha + 2) * (1 - x_abs) - (cubic_alpha + 3)) * (1 - x_abs) * (1 - x_abs) + 1); + coeffs[3] = (((cubic_alpha * (2 - x_abs) - 5 * cubic_alpha) * (2 - x_abs) + 8 * cubic_alpha) * (2 - x_abs) - 4 * cubic_alpha); + return coeffs; + } +`,zg=e=>` + fn gs_bicubic_interpolate(p: mat4x4<${e}>, x: f32, y: f32) -> ${e} { + var v: vec4; + var coeffs = gs_get_cubic_coeffs(x); + for (var i = 0; i < 4; i++) { + v[i] = coeffs[0] * p[i][0] + coeffs[1] * p[i][1] + coeffs[2] * p[i][2] + coeffs[3] * p[i][3]; + } + coeffs = gs_get_cubic_coeffs(y); + let pixel = ${e}(coeffs[0] * v[0] + coeffs[1] * v[1] + coeffs[2] * v[2] + coeffs[3] * v[3]); + return pixel; + } +`,Og=e=>` + fn gs_denormalize(n: f32, length: i32) -> f32 { + ${e.alignCorners===0?` + // alignCorners: false => [-1, 1] to [-0.5, length - 0.5] + return ((n + 1.0) * f32(length) - 1.0) / 2.0; + `:` + // alignCorners: true => [-1, 1] to [0, length - 1] + return (n + 1.0) / 2.0 * (f32(length - 1)); + `} + } +`,Dg=e=>` + ${e.paddingMode==="reflection"?` + fn gs_reflect(x: i32, x_min: f32, x_max: f32) -> u32 { + var dx = 0.0; + var fx = f32(x); + let range = x_max - x_min; + if (fx < x_min) { + dx = x_min - fx; + let n = u32(dx / range); + let r = dx - f32(n) * range; + if (n % 2 == 0) { + fx = x_min + r; + } else { + fx = x_max - r; + } + } else if (fx > x_max) { + dx = fx - x_max; + let n = u32(dx / range); + let r = dx - f32(n) * range; + if (n % 2 == 0) { + fx = x_max - r; + } else { + fx = x_min + r; + } + } + return u32(fx); + }`:""} +`,Bg=(e,t,n)=>` + fn pixel_at_grid(r: i32, c: i32, H: i32, W: i32, batch: u32, channel: u32, border: vec4) -> ${t} { + var pixel = ${t}(0); + var indices = vec4(0); + indices[${pt}] = batch; + indices[${$t}] = channel;`+(()=>{switch(n.paddingMode){case"zeros":return` + if (r >= 0 && r < H && c >=0 && c < W) { + indices[${Nt}] = u32(r); + indices[${Vt}] = u32(c); + } + `;case"border":return` + indices[${Nt}] = u32(clamp(r, 0, H - 1)); + indices[${Vt}] = u32(clamp(c, 0, W - 1)); + `;case"reflection":return` + indices[${Nt}] = gs_reflect(r, border[1], border[3]); + indices[${Vt}] = gs_reflect(c, border[0], border[2]); + `;default:throw new Error(`padding mode ${n.paddingMode} is not supported`)}})()+` + return ${e.getByIndices("indices")}; + } +`,Mg=(e,t,n)=>(()=>{switch(n.mode){case"nearest":return` + let result = pixel_at_grid(i32(round(y)), i32(round(x)), H_in, W_in, indices[${pt}], indices[${$t}], border); + `;case"bilinear":return` + let x1 = i32(floor(x)); + let y1 = i32(floor(y)); + let x2 = x1 + 1; + let y2 = y1 + 1; + + let p11 = pixel_at_grid(y1, x1, H_in, W_in, indices[${pt}], indices[${$t}], border); + let p12 = pixel_at_grid(y1, x2, H_in, W_in, indices[${pt}], indices[${$t}], border); + let p21 = pixel_at_grid(y2, x1, H_in, W_in, indices[${pt}], indices[${$t}], border); + let p22 = pixel_at_grid(y2, x2, H_in, W_in, indices[${pt}], indices[${$t}], border); + + let dx2 = ${t}(f32(x2) - x); + let dx1 = ${t}(x - f32(x1)); + let dy2 = ${t}(f32(y2) - y); + let dy1 = ${t}(y - f32(y1)); + let result = dy2 * (dx2 * p11 + dx1 * p12) + dy1 * (dx2 * p21 + dx1 * p22); + `;case"bicubic":return` + let x0 = i32(floor(x)) - 1; + let y0 = i32(floor(y)) - 1; + var p: mat4x4<${t}>; + for (var h = 0; h < 4; h++) { + for (var w = 0; w < 4; w++) { + p[h][w] = pixel_at_grid(h + y0, w + x0, H_in, W_in, indices[${pt}], indices[${$t}], border); + } + } + + let dx = x - f32(x0 + 1); + let dy = y - f32(y0 + 1); + let result = gs_bicubic_interpolate(p, dx, dy); + `;default:throw new Error(`mode ${n.mode} is not supported`)}})()+`${e.setByOffset("global_idx","result")}`,Rg=(e,t)=>{let n=P("x",e[0].dataType,e[0].dims.length),r=[e[1].dims[0],e[1].dims[1],e[1].dims[2]],o=P("grid",e[1].dataType,r.length,2),a=[e[0].dims[0],e[0].dims[1],e[1].dims[1],e[1].dims[2]];t.format==="NHWC"&&(a=[e[0].dims[0],e[1].dims[1],e[1].dims[2],e[0].dims[3]],[pt,$t,Nt,Vt]=[0,3,1,2]);let s=N("output",e[0].dataType,a.length),d=n.type.value,l=E.size(a),p=[{type:12,data:l},...H(e[0].dims,r,a)],f=h=>` + ${h.registerUniform("output_size","u32").declareVariables(n,o,s)} + ${Pg} + ${zg(d)} + ${Og(t)} + ${Dg(t)} + ${Bg(n,d,t)} + + ${h.mainStart()} + ${h.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let H_in = i32(uniforms.x_shape[${Nt}]); + let W_in = i32(uniforms.x_shape[${Vt}]); + + ${t.alignCorners===0?` + let x_min = -0.5; + let x_max = f32(W_in) - 0.5; + let y_min = -0.5; + let y_max = f32(H_in) - 0.5; + `:` + let x_min = 0.0; + let x_max = f32(W_in) - 1.0; + let y_min = 0.0; + let y_max = f32(H_in) - 1.0; + `}; + let border = vec4(x_min, y_min, x_max, y_max); + + let indices = ${s.offsetToIndices("global_idx")}; + var grid_indices = vec3(indices[${pt}], indices[${Nt}], indices[${Vt}]); + let nxy = ${o.getByIndices("grid_indices")}; + var x = gs_denormalize(f32(nxy[0]), W_in); + var y = gs_denormalize(f32(nxy[1]), H_in); + + ${Mg(s,d,t)} + }`;return{name:"GridSample",shaderCache:{hint:`${t.cacheKey}`,inputDependencies:["type","type"]},getRunData:h=>{let y=E.size(a);return{outputs:[{dims:a,dataType:h[0].dataType}],dispatchGroup:{x:Math.ceil(y/64)},programUniforms:p}},getShaderSource:f}},Sl=(e,t)=>{Eg(e.inputs),e.compute(Rg(e.inputs,t))},Tl=e=>re({alignCorners:e.align_corners,mode:e.mode,paddingMode:e.padding_mode,format:e.format})});var Me,Vg,Al,Il,Wg,or,kl,So=G(()=>{"use strict";te();ae();Ce();Vr();qr();ce();ct();Me=(e,t)=>e.length>t&&e[t].dims.length>0?e[t]:void 0,Vg=(e,t)=>{let n=e[0],r=Me(e,1),o=Me(e,2),a=Me(e,3),s=Me(e,4),d=Me(e,5),l=Me(e,6),p=Me(e,7);if(n.dims.length!==3&&n.dims.length!==5)throw new Error("Input query is expected to have 3 or 5 dimensions");let f=n.dims[0],h=n.dims[1],y=n.dims.length===3?n.dims[2]:t.numHeads*n.dims[4],_=h,b=0,w=0,S=Math.floor(y/t.numHeads);if(l&&p&&E.size(l.dims)&&E.size(p.dims)){if(l.dims.length!==4)throw new Error('Input "past_key" is expected to have 4 dimensions');if(l.dims[0]!==f||l.dims[1]!==t.numHeads||l.dims[3]!==S)throw new Error('Input "past_key" shape (batch_size, num_heads, past_sequence_length, head_size)');if(p.dims[0]!==f||p.dims[1]!==t.numHeads||p.dims[3]!==S)throw new Error('Input "past_value" shape (batch_size, num_heads, past_sequence_length, head_size)');if(l.dims[2]!==p.dims[2])throw new Error('Input "past_key" and "past_value" shall have same dim 2 (past_sequence_length)');if(p.dims.length!==4)throw new Error('Input "past_value" is expected to have 4 dimensions');b=l.dims[2],w=l.dims[2]}else if(l&&E.size(l.dims)||p&&E.size(p.dims))throw new Error('Input "past_key" and "past_value" shall be both present or both absent');let $;if(r&&E.size(r.dims)>0){if(n.dims.length!==3)throw new Error('Input "query" is expected to have 3 dimensions when key is given');if(r.dims.length<3||r.dims.length>5)throw new Error('Input "key" is expected to have 3, 4, or 5 dimensions');if(n.dims[0]!==r.dims[0])throw new Error('Input "query" and "key" shall have same dim 0 (batch size)');if(r.dims.length===3){if(r.dims[2]!==n.dims[2])throw new Error('Input "query" and "key" shall have same dim 2 (hidden_size)');$=2,_=r.dims[1]}else if(r.dims.length===5){if(r.dims[2]!==t.numHeads||r.dims[3]!==2||r.dims[4]!==S)throw new Error('Expect "key" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');if(o)throw new Error('Expect "value" be none when "key" has packed kv format.');$=5,_=r.dims[1]}else{if(r.dims[1]!==t.numHeads||r.dims[3]!==S)throw new Error('Expect "key" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');$=0,_=r.dims[2]}}else{if(n.dims.length!==5)throw new Error('Input "query" is expected to have 5 dimensions when key is empty');if(n.dims[2]!==t.numHeads||n.dims[3]!==3)throw new Error('Expect "query" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');$=3}if(a&&E.size(a.dims)>0){if(a.dims.length!==1)throw new Error('Input "bias" is expected to have 1 dimension');if(r&&r.dims.length===5&&r.dims[3]===2)throw new Error("bias is not allowed for packed kv.")}let v=b+_,T=0;if(s&&E.size(s.dims)>0){T=8;let O=s.dims;throw O.length===1?O[0]===f?T=1:O[0]===3*f+2&&(T=3):O.length===2&&O[0]===f&&O[1]===v&&(T=5),T===8?new Error('Input "key_padding_mask" shape shall be (batch_size) or (batch_size, total_sequence_length)'):new Error("Mask not supported")}let C=!1,A=y;if(o&&E.size(o.dims)>0){if(o.dims.length!==3&&o.dims.length!==4)throw new Error('Input "value" is expected to have 3 or 4 dimensions');if(n.dims[0]!==o.dims[0])throw new Error('Input "query" and "value" shall have same dim 0 (batch_size)');if(o.dims.length===3){if(_!==o.dims[1])throw new Error('Input "key" and "value" shall have the same dim 1 (kv_sequence_length)');A=o.dims[2]}else{if(_!==o.dims[2])throw new Error('Input "key" and "value" shall have the same dim 2 (kv_sequence_length)');A=o.dims[1]*o.dims[3],C=!0}}let k=!1;if(s&&E.size(s.dims)>0)throw new Error("Key padding mask is not supported");if(d&&E.size(d.dims)>0){if(d.dims.length!==4)throw new Error('Input "attention_bias" is expected to have 4 dimensions');if(d.dims[0]!==f||d.dims[1]!==t.numHeads||d.dims[2]!==h||d.dims[3]!==v)throw new Error('Expect "attention_bias" shape (batch_size, num_heads, sequence_length, total_sequence_length)')}return{batchSize:f,sequenceLength:h,pastSequenceLength:b,kvSequenceLength:_,totalSequenceLength:v,maxSequenceLength:w,inputHiddenSize:0,hiddenSize:y,vHiddenSize:A,headSize:S,vHeadSize:Math.floor(A/t.numHeads),numHeads:t.numHeads,isUnidirectional:!1,pastPresentShareBuffer:!1,maskFilterValue:t.maskFilterValue,maskType:T,scale:t.scale,broadcastResPosBias:k,passPastInKv:C,qkvFormat:$}},Al=e=>re({...e}),Il=re({perm:[0,2,1,3]}),Wg=(e,t,n,r,o,a,s)=>{let d=[r,o,a],l=E.size(d),p=[{type:12,data:l},{type:12,data:s},{type:12,data:a}],f=h=>{let y=N("qkv_with_bias",t.dataType,d),_=P("qkv",t.dataType,d),b=P("bias",n.dataType,d),w=[{name:"output_size",type:"u32"},{name:"bias_offset",type:"u32"},{name:"hidden_size",type:"u32"}];return` + ${h.registerUniforms(w).declareVariables(_,b,y)} + ${h.mainStart()} + ${h.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let bias_offset_idx = (global_idx % uniforms.hidden_size) + uniforms.bias_offset; + + qkv_with_bias[global_idx] = qkv[global_idx] + bias[bias_offset_idx]; + }`};return e.compute({name:"MultiHeadAttentionAddBias",shaderCache:{inputDependencies:["type","type"]},getRunData:()=>({outputs:[{dims:d,dataType:t.dataType,gpuDataType:0}],dispatchGroup:{x:Math.ceil(l/64)},programUniforms:p}),getShaderSource:f},{inputs:[t,n],outputs:[-1]})[0]},or=(e,t,n,r,o,a,s,d)=>{let l=a;if(s&&E.size(s.dims)>0){if(r===1)throw new Error("AddBiasReshape is not implemented. Please export your model with packed QKV or KV");return l=Wg(e,a,s,t,r,n*o,d),l=l.reshape([t,r,n,o]),n===1||r===1?l:e.compute(Oe(l,Il.perm),{inputs:[l],outputs:[-1]})[0]}else return a.dims.length===3&&(l=a.reshape([t,r,n,o])),n===1||r===1?l:e.compute(Oe(l,Il.perm),{inputs:[l],outputs:[-1]})[0]},kl=(e,t)=>{let n=Vg(e.inputs,t),r=e.inputs[0],o=Me(e.inputs,1),a=Me(e.inputs,2),s=Me(e.inputs,3),d=Me(e.inputs,4),l=Me(e.inputs,5),p=Me(e.inputs,6),f=Me(e.inputs,7);if(r.dims.length===5)throw new Error("Packed QKV is not implemented");if(o?.dims.length===5)throw new Error("Packed KV is not implemented");let h=o&&a&&o.dims.length===4&&a.dims.length===4,y=or(e,n.batchSize,n.numHeads,n.sequenceLength,n.headSize,r,s,0);if(h)return Ut(e,y,o,a,d,void 0,p,f,l,n);if(!o||!a)throw new Error("key and value must be provided");let _=or(e,n.batchSize,n.numHeads,n.kvSequenceLength,n.headSize,o,s,n.hiddenSize),b=or(e,n.batchSize,n.numHeads,n.kvSequenceLength,n.vHeadSize,a,s,2*n.hiddenSize);Ut(e,y,_,b,d,void 0,p,f,l,n)}});var Lg,Gg,Hg,Fg,To,El,Pl,Co=G(()=>{"use strict";te();ae();Ce();ce();Lg=e=>{if(!e||e.length<1)throw new Error("too few inputs")},Gg=(e,t)=>{let n=[],r=t.numOutputs;return e[1].dims[0]>0&&(e[1].getBigInt64Array().forEach(o=>n.push(Number(o))),r=n.length),re({numOutputs:r,axis:t.axis,splitSizes:n})},Hg=e=>` +fn calculateOutputIndex(index: u32) -> u32 { + for (var i: u32 = 0u; i < ${e}u; i += 1u ) { + if (index < ${K("uniforms.size_in_split_axis","i",e)}) { + return i; + } + } + return ${e}u; +}`,Fg=e=>{let t=e.length,n=[];for(let r=0;r{let n=e[0].dims,r=E.size(n),o=e[0].dataType,a=E.normalizeAxis(t.axis,n.length),s=new Array(t.numOutputs),d=P("input",o,n.length),l=new Array(t.numOutputs),p=[],f=[],h=0,y=[{type:12,data:r}];for(let b=0;b` + ${b.registerUniform("input_size","u32").registerUniform("size_in_split_axis","u32",l.length).declareVariables(d,...s)} + ${Hg(l.length)} + ${Fg(s)} + + ${b.mainStart()} + ${b.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.input_size")} + + var indices = ${d.offsetToIndices("global_idx")}; + var index = ${d.indicesGet("indices",a)}; + let output_number = calculateOutputIndex(index); + if (output_number != 0) { + index -= ${K("uniforms.size_in_split_axis","output_number - 1u",l.length)}; + ${d.indicesSet("indices",a,"index")}; + } + writeBufferData(output_number, indices, global_idx); + }`;return{name:"Split",shaderCache:{hint:t.cacheKey,inputDependencies:["rank"]},getShaderSource:_,getRunData:()=>({outputs:p,dispatchGroup:{x:Math.ceil(r/64)},programUniforms:y})}},El=(e,t)=>{Lg(e.inputs);let n=e.inputs.length===1?t:Gg(e.inputs,t);e.compute(To(e.inputs,n),{inputs:[0]})},Pl=e=>{let t=e.axis,n=e.splitSizes,r=e.numOutputs<0?n.length:e.numOutputs;if(r!==n.length)throw new Error("numOutputs and splitSizes lengh must be equal");return re({axis:t,numOutputs:r,splitSizes:n})}});var qg,Kg,zl,Ol,Dl=G(()=>{"use strict";Ce();qr();So();Co();ct();qg=(e,t)=>{if(t.doRotary)throw new Error("GroupQuerryAttention do_rotary attribute is not supported");if(t.doRotary&&e.length<=7)throw new Error("cos_cache and sin_cache inputs are required if do_rotary is specified");let n=e[0],r=e[1],o=e[2],a=e[3],s=e[4];if(t.localWindowSize!==-1)throw new Error("Local attention is not supported");if(t.softcap!==0)throw new Error("Softcap is not supported");if(t.rotaryInterleaved!==0)throw new Error("Rotary interleaved is not supported");if(t.smoothSoftmax)throw new Error("Smooth softmax is not supported");if(n.dims.length!==3&&n.dims.length!==5)throw new Error("Input query is expected to have 3 or 5 dimensions");let d=!1,l=n.dims[0],p=n.dims[1],f=n.dims.length===3?d?n.dims[2]/3:n.dims[2]:t.numHeads*n.dims[4],h=p,y=0,_=!r||r.dims.length===0,b=Math.floor(_?f/(t.numHeads+2*t.kvNumHeads):f/t.numHeads);_&&(f=b*t.numHeads);let w=a&&a.dims.length!==0,S=s&&s.dims.length!==0;if(w&&a.dims.length===4&&a.dims[0]===l&&a.dims[1]!==t.kvNumHeads&&a.dims[2]===t.kvNumHeads&&a.dims[3]===b)throw new Error("BSNH pastKey/pastValue is not supported");if(w&&S){if(a.dims.length!==4)throw new Error('Input "past_key" is expected to have 4 dimensions');if(s.dims.length!==4)throw new Error('Input "past_value" is expected to have 4 dimensions');y=a.dims[2]}else if(w||S)throw new Error('Input "past_key" and "past_value" shall be both present or both absent');let v=1;if(r&&r.dims.length>0){if(n.dims.length!==3)throw new Error('Input "query" is expected to have 3 dimensions when key is given');if(r.dims.length<3||r.dims.length>5)throw new Error('Input "key" is expected to have 3, 4, or 5 dimensions');if(n.dims[0]!==r.dims[0])throw new Error('Input "query" and "key" shall have same dim 0 (batch size)');if(r.dims.length===3){if(n.dims[2]%r.dims[2]!==0)throw new Error('Dimension 2 of "query" should be a multiple of "key"');h=r.dims[1]}else if(r.dims.length===5){if(r.dims[2]!==t.numHeads||r.dims[3]!==2||r.dims[4]!==b)throw new Error('Expect "key" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');if(o)throw new Error('Expect "value" be none when "key" has packed kv format.');h=r.dims[1]}else{if(r.dims[1]!==t.numHeads||r.dims[3]!==b)throw new Error('Expect "key" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');h=r.dims[2]}}else{if(n.dims.length!==3&&n.dims.length!==5)throw new Error('Input "query" is expected to have 3 or 5 dimensions when key is empty');if(n.dims.length===5&&(n.dims[2]!==t.numHeads||n.dims[3]!==3))throw new Error('Expect "query" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');v=3}let T=0,C=!1,A=t.kvNumHeads?b*t.kvNumHeads:f;if(o&&o.dims.length>0){if(o.dims.length!==3&&o.dims.length!==4)throw new Error('Input "value" is expected to have 3 or 4 dimensions');if(n.dims[0]!==o.dims[0])throw new Error('Input "query" and "value" shall have same dim 0 (batch_size)');if(o.dims.length===3){if(h!==o.dims[1])throw new Error('Input "key" and "value" shall have the same dim 1 (kv_sequence_length)');A=o.dims[2]}else{if(h!==o.dims[2])throw new Error('Input "past_key" and "past_value" shall have the same dim 2 (kv_sequence_length)');A=o.dims[1]*o.dims[3],C=!0}}let k=e.length>4?e[5]:void 0;if(k&&k.dims.length!==1&&k.dims[0]!==l)throw new Error('Input "seqlens" is expected to have 1 dimension and the same dim 0 as batch_size');return{batchSize:l,sequenceLength:p,pastSequenceLength:y,kvSequenceLength:h,totalSequenceLength:-1,maxSequenceLength:-1,inputHiddenSize:0,hiddenSize:f,vHiddenSize:A,headSize:b,vHeadSize:Math.floor(A/t.kvNumHeads),numHeads:t.numHeads,kvNumHeads:t.kvNumHeads,nReps:t.numHeads/t.kvNumHeads,pastPresentShareBuffer:!1,maskType:T,scale:t.scale,broadcastResPosBias:!1,passPastInKv:C,qkvFormat:v}},Kg=re({perm:[0,2,1,3]}),zl=(e,t,n)=>{let r=t,o=n.kvNumHeads;return t.dims.length===3&&n.kvSequenceLength!==0&&(r=t.reshape([n.batchSize,n.kvSequenceLength,o,n.headSize]),r=e.compute(Oe(r,Kg.perm),{inputs:[r],outputs:[-1]})[0]),r},Ol=(e,t)=>{let n=qg(e.inputs,t);if(e.inputs[0].dims.length===5)throw new Error("Packed QKV is not implemented");if(e.inputs[1]?.dims.length===5)throw new Error("Packed KV is not implemented");let r=e.inputs[0],o=e.inputs[1]&&e.inputs[1].dims.length>0?e.inputs[1]:void 0,a=e.inputs[2]&&e.inputs[2].dims.length>0?e.inputs[2]:void 0,s=e.inputs[3]&&e.inputs[3].dims.length!==0?e.inputs[3]:void 0,d=e.inputs[4]&&e.inputs[4].dims.length!==0?e.inputs[4]:void 0,l=e.inputs.length>4?e.inputs[5]:void 0,p=e.inputs.length>5?e.inputs[6]:void 0,f=n.kvNumHeads?n.kvNumHeads:n.numHeads,h=re({axis:2,numOutputs:3,splitSizes:[n.numHeads*n.headSize,f*n.headSize,f*n.headSize]}),[y,_,b]=!o&&!a?e.compute(To([r],h),{inputs:[r],outputs:[-1,-1,-1]}):[r,o,a],w=or(e,n.batchSize,n.numHeads,n.sequenceLength,n.headSize,y,void 0,0);Ut(e,w,zl(e,_,n),zl(e,b,n),void 0,void 0,s,d,void 0,n,l,p)}});var Bl,jg,Zg,Ml,Rl=G(()=>{"use strict";te();ae();ct();ce();Bl=(e,t,n,r,o,a,s,d)=>{let l=ge(a),p=l===1?"f32":`vec${l}f`,f=l===1?"vec2f":`mat2x${l}f`,h=o*s,y=64;h===1&&(y=256);let _=[o,s,a/l],b=[o,s,2],w=["rank","type","type"],S=[];S.push(...H(_,b));let $=v=>{let T=P("x",t.dataType,3,l),C=P("scale",n.dataType,n.dims),A=P("bias",r.dataType,r.dims),k=N("output",1,3,2),O=[T,C,A,k];return` + var workgroup_shared : array<${f}, ${y}>; + const workgroup_size = ${y}u; + ${v.declareVariables(...O)} + ${v.mainStart(y)} + let batch = workgroup_index / uniforms.x_shape[1]; + let channel = workgroup_index % uniforms.x_shape[1]; + let hight = uniforms.x_shape[2]; + // initialize workgroup memory + var sum = ${p}(0); + var squared_sum = ${p}(0); + for (var h = local_idx; h < hight; h += workgroup_size) { + let value = ${p}(${T.get("batch","channel","h")}); + sum += value; + squared_sum += value * value; + } + workgroup_shared[local_idx] = ${f}(sum, squared_sum); + workgroupBarrier(); + + for (var currSize = workgroup_size >> 1; currSize > 0; currSize = currSize >> 1) { + if (local_idx < currSize) { + workgroup_shared[local_idx] = workgroup_shared[local_idx] + workgroup_shared[local_idx + currSize]; + } + workgroupBarrier(); + } + if (local_idx == 0) { + let sum_final = ${Ke("workgroup_shared[0][0]",l)} / f32(hight * ${l}); + let squared_sum_final = ${Ke("workgroup_shared[0][1]",l)} / f32(hight * ${l}); + + let inv_std_dev = inverseSqrt(squared_sum_final - sum_final * sum_final + f32(${d})); + let channel_scale = inv_std_dev * f32(scale[channel]); + let channel_shift = f32(bias[channel]) - sum_final * channel_scale; + output[workgroup_index] = vec2f(channel_scale, channel_shift); + } + }`};return e.compute({name:"InstanceNormComputeChannelScaleShift",shaderCache:{hint:`${l};${d};${y}`,inputDependencies:w},getRunData:()=>({outputs:[{dims:b,dataType:1}],dispatchGroup:{x:h},programUniforms:S}),getShaderSource:$},{inputs:[t,n,r],outputs:[-1]})[0]},jg=(e,t,n)=>{let r=t[0].dims,o=r,a=2,s=r[0],d=r[1],l=E.sizeFromDimension(r,a),p=ge(l),f=E.size(o)/p,h=Bl(e,t[0],t[1],t[2],s,l,d,n.epsilon),y=[s,d,l/p],_=[s,d],b=["type","none"],w=S=>{let $=P("x",t[0].dataType,y.length,p),v=P("scale_shift",1,_.length,2),T=N("output",t[0].dataType,y.length,p),C=[$,v,T];return` + ${S.registerUniform("output_size","u32").declareVariables(...C)} + ${S.mainStart()} + ${S.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let outputIndices = ${T.offsetToIndices("global_idx")}; + let batch = outputIndices[0]; + let channel = outputIndices[1]; + let scale_shift = ${v.getByIndices("vec2(batch, channel)")}; + let value = ${$.getByOffset("global_idx")} * ${T.type.value}(scale_shift.x) + ${T.type.value}(scale_shift.y); + ${T.setByOffset("global_idx","value")}; + }`};e.compute({name:"InstanceNormalization",shaderCache:{hint:`${p}`,inputDependencies:b},getRunData:()=>({outputs:[{dims:o,dataType:t[0].dataType}],dispatchGroup:{x:Math.ceil(f/64)},programUniforms:[{type:12,data:f},...H(y,_,y)]}),getShaderSource:w},{inputs:[t[0],h]})},Zg=(e,t,n)=>{let r=t[0].dims,o=r,a=r[0],s=r[r.length-1],d=E.sizeFromDimension(r,1)/s,l=ge(s),p=E.size(o)/l,f=[{type:12,data:d},{type:12,data:Math.floor(s/l)}],h=["type","type"],y=!1,_=[0,r.length-1];for(let $=0;$r[_[v]])),w=Bl(e,b,t[1],t[2],a,d,s,n.epsilon),S=$=>{let v=_e(t[0].dataType),T=l===1?"vec2f":`mat${l}x2f`,C=O=>{let M=O===0?"x":"y",V=l===1?"f32":`vec${l}f`;switch(l){case 1:return`${v}(${V}(scale.${M}))`;case 2:return`vec2<${v}>(${V}(scale[0].${M}, scale[1].${M}))`;case 4:return`vec4<${v}>(${V}(scale[0].${M}, scale[1].${M}, scale[2].${M}, scale[3].${M}))`;default:throw new Error(`Not supported compoents ${l}`)}},A=P("input",t[0].dataType,t[0].dims,l),k=N("output",t[0].dataType,o,l);return` + @group(0) @binding(0) var input : array<${A.type.storage}>; + @group(0) @binding(1) var scale_input : array<${T}>; + @group(0) @binding(2) var output : array<${k.type.storage}>; + struct Uniforms {H: u32, C : u32}; + @group(0) @binding(3) var uniforms: Uniforms; + + ${$.mainStart()} + let current_image_number = global_idx / (uniforms.C * uniforms.H); + let current_channel_number = global_idx % uniforms.C; + + let scale_offset = current_image_number * uniforms.C + current_channel_number; + let scale = scale_input[scale_offset]; + output[global_idx] = fma(input[global_idx], ${C(0)}, ${C(1)}); + }`};e.compute({name:"InstanceNormalizationNHWC",shaderCache:{hint:`${l}`,inputDependencies:h},getRunData:()=>({outputs:[{dims:o,dataType:t[0].dataType}],dispatchGroup:{x:Math.ceil(p/64)},programUniforms:f}),getShaderSource:S},{inputs:[t[0],w]})},Ml=(e,t)=>{t.format==="NHWC"?Zg(e,e.inputs,t):jg(e,e.inputs,t)}});var Qg,Yg,Ul,Nl=G(()=>{"use strict";te();ae();ce();Qg=e=>{if(!e||e.length<2)throw new Error("layerNorm requires at least 2 inputs.")},Yg=(e,t,n)=>{let r=t.simplified,o=e[0].dims,a=e[1],s=!r&&e[2],d=o,l=E.normalizeAxis(t.axis,o.length),p=E.sizeToDimension(o,l),f=E.sizeFromDimension(o,l),h=E.size(a.dims),y=s?E.size(s.dims):0;if(h!==f||s&&y!==f)throw new Error(`Size of X.shape()[axis:] == ${f}. + Size of scale and bias (if provided) must match this. + Got scale size of ${h} and bias size of ${y}`);let _=[];for(let A=0;A1,v=n>2,T=A=>{let k=_e(e[0].dataType),O=[P("x",e[0].dataType,e[0].dims,b),P("scale",a.dataType,a.dims,b)];s&&O.push(P("bias",s.dataType,s.dims,b)),O.push(N("output",e[0].dataType,d,b)),$&&O.push(N("mean_data_output",1,_)),v&&O.push(N("inv_std_output",1,_));let M=[{name:"norm_count",type:"u32"},{name:"norm_size",type:"f32"},{name:"norm_size_vectorized",type:"u32"},{name:"epsilon",type:"f32"}];return` + ${A.registerUniforms(M).declareVariables(...O)} + ${A.mainStart()} + ${A.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.norm_count")} + let offset = global_idx * uniforms.norm_size_vectorized; + var mean_vector = ${uo("f32",b)}; + var mean_square_vector = ${uo("f32",b)}; + + for (var h: u32 = 0u; h < uniforms.norm_size_vectorized; h++) { + let value = ${Pt(k,b,"x[h + offset]")}; + mean_vector += value; + mean_square_vector += value * value; + } + let mean = ${Ke("mean_vector",b)} / uniforms.norm_size; + let inv_std_dev = inverseSqrt(${Ke("mean_square_vector",b)} / uniforms.norm_size ${r?"":"- mean * mean"} + uniforms.epsilon); + + for (var j: u32 = 0; j < uniforms.norm_size_vectorized; j++) { + let f32input = ${Pt(k,b,"x[j + offset]")}; + let f32scale = ${Pt(k,b,"scale[j]")}; + output[j + offset] = ${O[0].type.value}((f32input ${r?"":"- mean"}) * inv_std_dev * f32scale + ${s?`+ ${Pt(k,b,"bias[j]")}`:""} + ); + } + + ${$?"mean_data_output[global_idx] = mean":""}; + ${v?"inv_std_output[global_idx] = inv_std_dev":""}; + }`},C=[{dims:d,dataType:e[0].dataType}];return $&&C.push({dims:_,dataType:1}),v&&C.push({dims:_,dataType:1}),{name:"LayerNormalization",shaderCache:{hint:`${b};${n};${r}`,inputDependencies:w},getRunData:()=>({outputs:C,dispatchGroup:{x:Math.ceil(p/64)},programUniforms:S}),getShaderSource:T}},Ul=(e,t)=>{Qg(e.inputs),e.compute(Yg(e.inputs,t,e.outputCount))}});var Xg,Vl,Wl=G(()=>{"use strict";ae();Xr();Jr();Xg=e=>{if(!e||e.length!==2)throw new Error("MatMul requires 2 inputs.");if(e[0].dims[e[0].dims.length-1]!==e[1].dims[e[1].dims.length-2])throw new Error("shared dimension does not match.")},Vl=e=>{Xg(e.inputs);let t=rt.calcShape(e.inputs[0].dims,e.inputs[1].dims,!0);if(!t)throw new Error("Can't use matmul on the given tensors");let n=t[t.length-1],r=e.inputs[0].dims[e.inputs[0].dims.length-1];if(n<8&&r<8)e.compute(Yr(e.inputs,{activation:""},t));else{let o=t[t.length-2],a=E.size(e.inputs[0].dims.slice(0,-2)),s=E.size(e.inputs[1].dims.slice(0,-2));if(a!==1&&o===1&&s===1){let d=e.inputs[0].reshape([1,a,r]),l=e.inputs[1].reshape([1,r,n]),p=[1,a,n],f=[d,l];e.compute(nr(f,{activation:""},t,p),{inputs:f})}else e.compute(nr(e.inputs,{activation:""},t))}}});var Jg,ey,ty,Ll,Gl,Hl=G(()=>{"use strict";te();ae();Ce();ce();Jg=(e,t)=>{if(e.length<3||e.length>4)throw new Error("MatMulNBits requires 3 or 4 inputs");let n=e[0],r=n.dims.length;if(n.dims[r-1]!==t.k)throw new Error("The last dim of input shape does not match the k value");let o=Math.floor((t.k+t.blockSize-1)/t.blockSize),a=t.blockSize/8*t.bits,s=e[1];if(!E.areEqual(s.dims,[t.n,o,a]))throw new Error("The second inputs must be 3D tensor with shape N X nBlocksPerCol X blobSize");let l=e[2].dims;if(E.size(l)!==t.n*o)throw new Error("scales input size error.");if(e.length===4){let f=e[3].dims,h=t.bits>4?t.n*o:t.n*Math.floor((o+1)/2);if(E.size(f)!==h)throw new Error("zeroPoints input size error.")}},ey=(e,t)=>{let n=e[0].dims,r=n.length,o=n[r-2],a=t.k,s=t.n,d=n.slice(0,r-2),l=E.size(d),f=e[1].dims[2]/4,h=e[0].dataType,y=ge(t.k),_=ge(f),b=ge(s),w=d.concat([o,s]),S=o>1&&s/b%2===0?2:1,$=E.size(w)/b/S,v=64,T=[],C=[l,o,a/y],A=E.convertShape(e[1].dims).slice();A.splice(-1,1,f/_),T.push(...H(C)),T.push(...H(A)),T.push(...H(e[2].dims)),e.length===4&&T.push(...H(E.convertShape(e[3].dims)));let k=[l,o,s/b];T.push(...H(k));let O=M=>{let V=C.length,F=P("a",e[0].dataType,V,y),j=P("b",12,A.length,_),ne=P("scales",e[2].dataType,e[2].dims.length),W=[F,j,ne],J=e.length===4?P("zero_points",12,e[3].dims.length):void 0;J&&W.push(J);let ve=k.length,Q=N("output",e[0].dataType,ve,b),ee=_e(e[0].dataType),le=(()=>{switch(y){case 1:return`array<${ee}, 8>`;case 2:return`mat4x2<${ee}>`;case 4:return`mat2x4<${ee}>`;default:throw new Error(`${y}-component is not supported.`)}})(),Z=()=>{let Se=` + // reuse a data + var input_offset = ${F.indicesToOffset(`${F.type.indices}(batch, row, word_offset)`)}; + var a_data: ${le}; + for (var j: u32 = 0; j < ${8/y}; j++) { + a_data[j] = ${F.getByOffset("input_offset")}; + input_offset++; + } + `;for(let D=0;D> 4) & b_mask); + b_quantized_values = ${le}(${Array.from({length:4},(R,Y)=>`${ee}(b_value_lower[${Y}]), ${ee}(b_value_upper[${Y}])`).join(", ")}); + b_dequantized_values = ${y===1?`${le}(${Array.from({length:8},(R,Y)=>`(b_quantized_values[${Y}] - ${J?`zero_point${D}`:"zero_point"}) * scale${D}`).join(", ")});`:`(b_quantized_values - ${le}(${Array(8).fill(`${J?`zero_point${D}`:"zero_point"}`).join(",")})) * scale${D};`}; + workgroup_shared[local_id.x * ${S} + ${Math.floor(D/b)}]${b>1?`[${D%b}]`:""} += ${Array.from({length:8/y},(R,Y)=>`${y===1?`a_data[${Y}] * b_dequantized_values[${Y}]`:`dot(a_data[${Y}], b_dequantized_values[${Y}])`}`).join(" + ")}; + `;return Se},pe=()=>{let Se=` + var col_index = col * ${b}; + ${J?` + let zero_point_bytes_per_col = (nBlocksPerCol + 1) / 2; + var zero_point_byte_count: u32; + var zero_point_word_index: u32; + var zero_point_byte_offset: u32; + let zero_point_nibble_offset: u32 = block & 0x1u; + var zero_point_bits_offset: u32; + var zero_point_word: u32;`:` + // The default zero point is 8 for unsigned 4-bit quantization. + let zero_point = ${ee}(8);`} + `;for(let D=0;D> 0x1u); + zero_point_word_index = zero_point_byte_count >> 0x2u; + zero_point_byte_offset = zero_point_byte_count & 0x3u; + zero_point_bits_offset = (zero_point_byte_offset << 3) + (zero_point_nibble_offset << 2); + zero_point_word = ${J.getByOffset("zero_point_word_index")} >> zero_point_bits_offset; + let zero_point${D} = ${ee}((zero_point_word) & 0xFu);`:""} + col_index += 1;`;return Se},ke=()=>{let Se=`col_index = col * ${b};`;for(let D=0;D; + var b_value_upper: vec4; + var b_quantized_values: ${le}; + var b_dequantized_values: ${le};`,Se};return` + var workgroup_shared: array<${Q.type.value}, ${S*v}>; + ${M.declareVariables(...W,Q)} + ${M.mainStart([v,1,1])} + let output_indices = ${Q.offsetToIndices(`(global_idx / ${v}) * ${S}`)}; + let col = output_indices[2]; + let row = output_indices[1]; + let batch = output_indices[0]; + let nBlocksPerCol = uniforms.b_shape[1]; + + for (var block = local_id.x; block < nBlocksPerCol; block += ${v}) { + //process one block + var word_offset: u32 = block * ${t.blockSize/y}; + ${pe()} + for (var word: u32 = 0; word < ${f}; word += ${_}) { + ${ke()} + for (var i: u32 = 0; i < ${_}; i++) { + ${Z()} + word_offset += ${8/y}; + } + } + } + workgroupBarrier(); + + if (local_id.x < ${S}) { + var output_value: ${Q.type.value} = ${Q.type.value}(0); + var workgroup_shared_offset: u32 = local_id.x; + for (var b: u32 = 0u; b < ${v}u; b++) { + output_value += workgroup_shared[workgroup_shared_offset]; + workgroup_shared_offset += ${S}; + } + ${Q.setByIndices(`${Q.type.indices}(batch, row, col + local_id.x)`,"output_value")}; + } + }`};return{name:"MatMulNBits",shaderCache:{hint:`${t.blockSize};${t.bits};${y};${_};${b};${S};${v}`,inputDependencies:Array(e.length).fill("rank")},getRunData:()=>({outputs:[{dims:w,dataType:h}],dispatchGroup:{x:$},programUniforms:T}),getShaderSource:O}},ty=(e,t)=>{let n=e[0].dims,r=n.length,o=n[r-2],a=t.k,s=t.n,d=n.slice(0,r-2),l=E.size(d),f=e[1].dims[2]/4,h=e[0].dataType,y=ge(t.k),_=ge(f),b=d.concat([o,s]),w=128,S=s%8===0?8:s%4===0?4:1,$=w/S,v=$*_*8,T=v/y,C=v/t.blockSize,A=E.size(b)/S,k=[],O=[l,o,a/y],M=E.convertShape(e[1].dims).slice();M.splice(-1,1,f/_),k.push(...H(O)),k.push(...H(M)),k.push(...H(e[2].dims)),e.length===4&&k.push(...H(E.convertShape(e[3].dims)));let V=[l,o,s];k.push(...H(V));let F=j=>{let ne=O.length,W=P("a",e[0].dataType,ne,y),J=P("b",12,M.length,_),ve=P("scales",e[2].dataType,e[2].dims.length),Q=[W,J,ve],ee=e.length===4?P("zero_points",12,e[3].dims.length):void 0;ee&&Q.push(ee);let le=V.length,Z=N("output",e[0].dataType,le),pe=_e(e[0].dataType),ke=()=>{switch(y){case 1:return` + let a_data0 = vec4<${pe}>(sub_a[word_offset], sub_a[word_offset + 1], sub_a[word_offset + 2], sub_a[word_offset + 3]); + let a_data1 = vec4<${pe}>(sub_a[word_offset + 4], sub_a[word_offset + 5], sub_a[word_offset + 6], sub_a[word_offset + 7]);`;case 2:return` + let a_data0 = vec4<${pe}>(sub_a[word_offset], sub_a[word_offset + 1]); + let a_data1 = vec4<${pe}>(sub_a[word_offset + 2], sub_a[word_offset + 3]);`;case 4:return` + let a_data0 = sub_a[word_offset]; + let a_data1 = sub_a[word_offset + 1];`;default:throw new Error(`${y}-component is not supported.`)}};return` + var sub_a: array<${W.type.value}, ${T}>; + var inter_results: array, ${S}>; + ${j.declareVariables(...Q,Z)} + ${j.mainStart([$,S,1])} + let output_indices = ${Z.offsetToIndices(`workgroup_index * ${S}`)}; + let col = output_indices[2]; + let row = output_indices[1]; + let batch = output_indices[0]; + let n_blocks_per_col = uniforms.b_shape[1]; + let num_tiles = (n_blocks_per_col - 1) / ${C} + 1; + + // Loop over shared dimension. + for (var tile: u32 = 0; tile < num_tiles; tile += 1) { + let a_col_start = tile * ${T}; + // load one tile A data into shared memory. + for (var a_offset = local_idx; a_offset < ${T}; a_offset += ${w}) + { + let a_col = a_col_start + a_offset; + if (a_col < uniforms.a_shape[2]) + { + sub_a[a_offset] = ${W.getByIndices(`${W.type.indices}(batch, row, a_col)`)}; + } else { + sub_a[a_offset] = ${W.type.value}(0); + } + } + workgroupBarrier(); + + // each thread process one block + let b_row = col + local_id.y; + let block = tile * ${C} + local_id.x; + ${ee?` + let zero_point_bytes_per_col = (n_blocks_per_col + 1) / 2; + let zero_point_byte_count = b_row * zero_point_bytes_per_col + (block >> 0x1u); + let zero_point_word_index = zero_point_byte_count >> 0x2u; + let zero_point_byte_offset = zero_point_byte_count & 0x3u; + let zero_point_nibble_offset: u32 = block & 0x1u; + let zero_point_bits_offset = (zero_point_byte_offset << 3) + (zero_point_nibble_offset << 2); + let zero_point_word = ${ee.getByOffset("zero_point_word_index")} >> zero_point_bits_offset; + let zero_point = ${pe}((zero_point_word) & 0xFu);`:` + // The default zero point is 8 for unsigned 4-bit quantization. + let zero_point = ${pe}(8);`} + let scale = ${ve.getByOffset("b_row * n_blocks_per_col + block")}; + let b_data = ${J.getByIndices(`${J.type.indices}(b_row, block, 0)`)}; + var word_offset = local_id.x * ${t.blockSize/y}; + for (var i: u32 = 0; i < ${_}; i++) { + ${ke()} + let b_value = ${_===1?"b_data":"b_data[i]"}; + let b_value_lower = unpack4xU8(b_value & 0x0F0F0F0Fu); + let b_value_upper = unpack4xU8((b_value >> 4) & 0x0F0F0F0Fu); + let b_quantized_values = mat2x4<${pe}>(${Array.from({length:4},(Se,D)=>`${pe}(b_value_lower[${D}]), ${pe}(b_value_upper[${D}])`).join(", ")}); + let b_dequantized_values = (b_quantized_values - mat2x4<${pe}>(${Array(8).fill("zero_point").join(",")})) * scale; + inter_results[local_id.y][local_id.x] += ${Array.from({length:2},(Se,D)=>`${`dot(a_data${D}, b_dequantized_values[${D}])`}`).join(" + ")}; + word_offset += ${8/y}; + } + workgroupBarrier(); + } + + if (local_idx < ${S}) { + var output_value: ${Z.type.value} = ${Z.type.value}(0); + for (var b = 0u; b < ${$}; b++) { + output_value += inter_results[local_idx][b]; + } + if (col + local_idx < uniforms.output_shape[2]) + { + ${Z.setByIndices(`${Z.type.indices}(batch, row, col + local_idx)`,"output_value")} + } + } + }`};return{name:"BlockwiseMatMulNBits32",shaderCache:{hint:`${t.blockSize};${y};${_};${$};${S}`,inputDependencies:Array(e.length).fill("rank")},getRunData:()=>({outputs:[{dims:b,dataType:h}],dispatchGroup:{x:A},programUniforms:k}),getShaderSource:F}},Ll=(e,t)=>{Jg(e.inputs,t),t.blockSize===32&&e.adapterInfo.isVendor("intel")&&e.adapterInfo.isArchitecture("gen-12lp")?e.compute(ty(e.inputs,t)):e.compute(ey(e.inputs,t))},Gl=e=>re(e)});var ry,ny,oy,iy,ay,sy,uy,dy,Fl,ql=G(()=>{"use strict";te();ae();ce();ry=e=>{if(!e||e.length<1)throw new Error("Too few inputs");if(e[0].dataType!==1&&e[0].dataType!==10)throw new Error("Input type must be float or float16.");if(e.length>=2){let t=e[0].dims.length*2===e[1].dims[0];if(e.length===4&&(t=e[3].dims[0]*2===e[1].dims[0]),!t)throw new Error("The pads should be a 1D tensor of shape [2 * input_rank] or [2 * num_axes].")}},ny=(e,t,n)=>{let r="";for(let o=t-1;o>=0;--o)r+=` + k = i32(${e.indicesGet("indices",o)}) - ${K("uniforms.pads",o,n)}; + if (k < 0) { + break; + } + if (k >= i32(${K("uniforms.x_shape",o,t)})) { + break; + } + offset += k * i32(${K("uniforms.x_strides",o,t)}); + `;return` + value = ${e.type.value}(uniforms.constant_value); + for (var i = 0; i < 1; i++) { + var offset = 0; + var k = 0; + ${r} + value = x[offset]; + } + `},oy=(e,t,n)=>{let r="";for(let o=t-1;o>=0;--o)r+=` + k = i32(${e.indicesGet("indices",o)}) - ${K("uniforms.pads",o,n)}; + if (k < 0) { + k = -k; + } + { + let _2n_1 = 2 * (i32(${K("uniforms.x_shape",o,t)}) - 1); + k = k % _2n_1; + if(k >= i32(${K("uniforms.x_shape",o,t)})) { + k = _2n_1 - k; + } + } + offset += k * i32(${K("uniforms.x_strides",o,t)}); + `;return` + var offset = 0; + var k = 0; + ${r} + value = x[offset]; + `},iy=(e,t,n)=>{let r="";for(let o=t-1;o>=0;--o)r+=` + k = i32(${e.indicesGet("indices",o)}) - ${K("uniforms.pads",o,n)}; + if (k < 0) { + k = 0; + } + if (k >= i32(${K("uniforms.x_shape",o,t)})) { + k = i32(${K("uniforms.x_shape",o,t)}) - 1; + } + offset += k * i32(${K("uniforms.x_strides",o,t)}); + `;return` + var offset = 0; + var k = 0; + ${r} + value = x[offset]; + `},ay=(e,t,n)=>{let r="";for(let o=t-1;o>=0;--o)r+=` + k = i32(${e.indicesGet("indices",o)}) - ${K("uniforms.pads",o,n)}; + if (k < 0) { + k += i32(${K("uniforms.x_shape",o,t)}]); + } + if (k >= i32(${K("uniforms.x_shape",o,t)})) { + k -= i32(${K("uniforms.x_shape",o,t)}); + } + offset += k * i32(${K("uniforms.x_strides",o,t)}); + `;return` + var offset = 0; + var k = 0; + ${r} + value = x[offset]; + `},sy=(e,t,n)=>{switch(n.mode){case 0:return ny(e,t,n.pads.length);case 1:return oy(e,t,n.pads.length);case 2:return iy(e,t,n.pads.length);case 3:return ay(e,t,n.pads.length);default:throw new Error("Invalid mode")}},uy=(e,t)=>{let n=E.padShape(e[0].dims.slice(),t.pads),r=e[0].dims,o=E.size(n),a=[{type:12,data:o},{type:6,data:t.pads}],s=e.length>=3&&e[2].data;t.mode===0&&a.push({type:s?e[2].dataType:1,data:t.value}),a.push(...H(e[0].dims,n));let d=["rank"],l=p=>{let f=N("output",e[0].dataType,n.length),h=P("x",e[0].dataType,r.length),y=h.type.value,_=sy(f,r.length,t),b=[{name:"output_size",type:"u32"},{name:"pads",type:"i32",length:t.pads.length}];return t.mode===0&&b.push({name:"constant_value",type:s?y:"f32"}),` + ${p.registerUniforms(b).declareVariables(h,f)} + ${p.mainStart()} + ${p.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let indices = ${f.offsetToIndices("global_idx")}; + + var value = ${y}(0); + ${_} + output[global_idx] = value; + }`};return{name:"Pad",shaderCache:{hint:`${t.mode}${s}`,inputDependencies:d},getRunData:()=>({outputs:[{dims:n,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(E.size(n)/64)},programUniforms:a}),getShaderSource:l}},dy=(e,t)=>{if(e.length>1){let n=e[1].getBigInt64Array(),r=e.length>=3&&e[2].data?e[2].dataType===10?e[2].getUint16Array()[0]:e[2].getFloat32Array()[0]:0,o=e[0].dims.length,a=new Int32Array(2*o).fill(0);if(e.length>=4){let d=e[3].getBigInt64Array();for(let l=0;la[Number(l)]=Number(d));let s=[];return a.forEach(d=>s.push(d)),{mode:t.mode,value:r,pads:s}}else return t},Fl=(e,t)=>{ry(e.inputs);let n=dy(e.inputs,t);e.compute(uy(e.inputs,n),{inputs:[0]})}});var rn,Kl,jl,Zl,Ql,ly,cy,Yl,Xl,Jl,ec,tc,rc,nc,oc,ic,ac,sc,uc,dc=G(()=>{"use strict";Ge();te();ae();ce();rn=e=>{if(we.webgpu.validateInputContent&&(!e||e.length!==1))throw new Error("Pool ops requires 1 input.")},Kl=(e,t,n)=>{let r=t.format==="NHWC",o=e.dims.slice();r&&o.splice(1,0,o.pop());let a=Object.hasOwnProperty.call(t,"dilations"),s=t.kernelShape.slice(),d=t.strides.slice(),l=a?t.dilations.slice():[],p=t.pads.slice();kt.adjustPoolAttributes(n,o,s,d,l,p);let f=kt.computePoolOutputShape(n,o,d,l,s,p,t.autoPad),h=Object.assign({},t);a?Object.assign(h,{kernelShape:s,strides:d,pads:p,dilations:l,cacheKey:t.cacheKey}):Object.assign(h,{kernelShape:s,strides:d,pads:p,cacheKey:t.cacheKey});let y=f.slice();return y.push(y.splice(1,1)[0]),[h,r?y:f]},jl=(e,t)=>{let n=t.format==="NHWC",r=E.size(e),o=E.size(t.kernelShape),a=[{type:12,data:r},{type:12,data:o}],s=[{name:"outputSize",type:"u32"},{name:"kernelSize",type:"u32"}];if(t.kernelShape.length<=2){let d=t.kernelShape[t.kernelShape.length-1],l=t.strides[t.strides.length-1],p=t.pads[t.pads.length/2-1],f=t.pads[t.pads.length-1],h=!!(p+f);a.push({type:12,data:d},{type:12,data:l},{type:12,data:p},{type:12,data:f}),s.push({name:"kw",type:"u32"},{name:"sw",type:"u32"},{name:"pwStart",type:"u32"},{name:"pwEnd",type:"u32"});let y=!1;if(t.kernelShape.length===2){let _=t.kernelShape[t.kernelShape.length-2],b=t.strides[t.strides.length-2],w=t.pads[t.pads.length/2-2],S=t.pads[t.pads.length-2];y=!!(w+S),a.push({type:12,data:_},{type:12,data:b},{type:12,data:w},{type:12,data:S}),s.push({name:"kh",type:"u32"},{name:"sh",type:"u32"},{name:"phStart",type:"u32"},{name:"phEnd",type:"u32"})}return[a,s,!0,h,y]}else{if(n)throw new Error("Pooling with kernelShape.length > 2 is not supported for NHWC format.");let d=E.computeStrides(t.kernelShape);a.push({type:12,data:d},{type:12,data:t.pads},{type:12,data:t.strides}),s.push({name:"kernelStrides",type:"u32",length:d.length},{name:"pads",type:"u32",length:t.pads.length},{name:"strides",type:"u32",length:t.strides.length});let l=t.pads.reduce((p,f)=>p+f);return[a,s,!!l,!1,!1]}},Zl=(e,t,n,r,o,a,s,d,l,p,f,h)=>{let y=o.format==="NHWC",_=t.type.value,b=N("output",t.type.tensor,r);if(o.kernelShape.length<=2){let w="",S="",$="",v=n-(y?2:1);if(f?w=` + for (var i: u32 = 0u; i < uniforms.kw; i++) { + xIndices[${v}] = indices[${v}] * uniforms.sw - uniforms.pwStart + i; + if (xIndices[${v}] < 0 || xIndices[${v}] + >= uniforms.x_shape[${v}]) { + pad++; + continue; + } + let x_val = x[${t.indicesToOffset("xIndices")}]; + ${a} + }`:w=` + for (var i: u32 = 0u; i < uniforms.kw; i++) { + xIndices[${v}] = indices[${v}] * uniforms.sw - uniforms.pwStart + i; + let x_val = x[${t.indicesToOffset("xIndices")}]; + ${a} + }`,o.kernelShape.length===2){let C=n-(y?3:2);h?S=` + for (var j: u32 = 0u; j < uniforms.kh; j++) { + xIndices[${C}] = indices[${C}] * uniforms.sh - uniforms.phStart + j; + if (xIndices[${C}] < 0 || xIndices[${C}] >= uniforms.x_shape[${C}]) { + pad += i32(uniforms.kw); + continue; + } + `:S=` + for (var j: u32 = 0u; j < uniforms.kh; j++) { + xIndices[${C}] = indices[${C}] * uniforms.sh - uniforms.phStart + j; + `,$=` + } + `}return` + ${e.registerUniforms(l).declareVariables(t,b)} + + ${e.mainStart()} + ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + + let indices = ${b.offsetToIndices("global_idx")}; + var xIndices = ${b.offsetToIndices("global_idx")}; + + var value = ${_}(${d}); + var pad = 0; + ${S} + ${w} + ${$} + ${s} + + output[global_idx] = value; + }`}else{if(y)throw new Error("Pooling with kernelShape.length > 2 is not supported for NHWC format.");let w=o.kernelShape.length,S=o.pads.length,$="";return p?$=` + if (xIndices[j] >= uniforms.x_shape[j]) { + pad++; + isPad = true; + break; + } + } + if (!isPad) { + let x_val = x[${t.indicesToOffset("xIndices")}]; + ${a} + }`:$=` + } + let x_val = x[${t.indicesToOffset("xIndices")}]; + ${a} + `,` + ${e.registerUniforms(l).declareVariables(t,b)} + + ${e.mainStart()} + ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + let indices = ${b.offsetToIndices("global_idx")}; + var xIndices = ${b.offsetToIndices("global_idx")}; + + var offsets: array; + + var value = ${_}(${d}); + var pad = 0; + var isPad = false; + + for (var i: u32 = 0u; i < uniforms.kernelSize; i++) { + var offset = i; + for (var j = 0u; j < ${w-1}u; j++) { + offsets[j] = offset / ${K("uniforms.kernelStrides","j",w)}; + offset -= offsets[j] * ${K("uniforms.kernelStrides","j",w)}; + } + offsets[${w-1}] = offset; + + isPad = false; + for (var j = ${n-w}u; j < ${n}u; j++) { + xIndices[j] = indices[j] * ${K("uniforms.strides",`j - ${n-w}u`,w)} + + offsets[j - ${n-w}u] - ${K("uniforms.pads","j - 2u",S)}; + ${$} + } + ${s} + + output[global_idx] = value; + }`}},Ql=e=>`${e.format};${e.ceilMode};${e.autoPad};${e.kernelShape.length}`,ly=e=>`${Ql(e)};${e.countIncludePad}`,cy=e=>`${Ql(e)};${e.storageOrder};${e.dilations}`,Yl=e=>({format:e.format,autoPad:["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][e.auto_pad],ceilMode:e.ceil_mode,kernelShape:e.kernel_shape,strides:e.strides,pads:e.pads}),Xl=(e,t,n,r)=>{let[o,a]=Kl(t,r,n),s=P("x",t.dataType,t.dims.length),d=s.type.value,l="value += x_val;",p="";o.countIncludePad?p+=`value /= ${d}(uniforms.kernelSize);`:p+=`value /= ${d}(i32(uniforms.kernelSize) - pad);`;let[f,h,y,_,b]=jl(a,o);f.push(...H(t.dims,a));let w=["rank"];return{name:e,shaderCache:{hint:`${r.cacheKey};${y};${_};${b}`,inputDependencies:w},getRunData:()=>({outputs:[{dims:a,dataType:t.dataType}],dispatchGroup:{x:Math.ceil(E.size(a)/64)},programUniforms:f}),getShaderSource:S=>Zl(S,s,t.dims.length,a.length,o,l,p,0,h,y,_,b)}},Jl=e=>{let t=e.count_include_pad!==0,n=Yl(e);if(n.ceilMode!==0)throw new Error("using ceil() in shape computation is not yet supported for AveragePool");let r={countIncludePad:t,...n,cacheKey:""};return{...r,cacheKey:ly(r)}},ec=(e,t)=>{rn(e.inputs),e.compute(Xl("AveragePool",e.inputs[0],!1,t))},tc={autoPad:"",ceilMode:0,countIncludePad:!1,kernelShape:[],strides:[],pads:[],storageOrder:0,dilations:[]},rc=e=>{let t=e.format;return{format:t,...tc,cacheKey:t}},nc=(e,t)=>{rn(e.inputs),e.compute(Xl("GlobalAveragePool",e.inputs[0],!0,t))},oc=(e,t,n,r)=>{let[o,a]=Kl(t,r,n),s=` + value = max(x_val, value); + `,d="",l=P("x",t.dataType,t.dims.length),p=["rank"],[f,h,y,_,b]=jl(a,o);return f.push(...H(t.dims,a)),{name:e,shaderCache:{hint:`${r.cacheKey};${y};${_};${b}`,inputDependencies:p},getRunData:()=>({outputs:[{dims:a,dataType:t.dataType}],dispatchGroup:{x:Math.ceil(E.size(a)/64)},programUniforms:f}),getShaderSource:w=>Zl(w,l,t.dims.length,a.length,o,s,d,t.dataType===10?-65504:-1e5,h,y,_,b)}},ic=(e,t)=>{rn(e.inputs),e.compute(oc("MaxPool",e.inputs[0],!1,t))},ac=e=>{let t=e.storage_order,n=e.dilations,r=Yl(e);if(t!==0)throw new Error("column major storage order is not yet supported for MaxPool");if(r.ceilMode!==0)throw new Error("using ceil() in shape computation is not yet supported for MaxPool");let o={storageOrder:t,dilations:n,...r,cacheKey:""};return{...o,cacheKey:cy(o)}},sc=e=>{let t=e.format;return{format:t,...tc,cacheKey:t}},uc=(e,t)=>{rn(e.inputs),e.compute(oc("GlobalMaxPool",e.inputs[0],!0,t))}});var my,fy,lc,cc,pc=G(()=>{"use strict";te();ae();Ce();ce();my=(e,t)=>{if(e.length<2||e.length>3)throw new Error("DequantizeLinear requires 2 or 3 inputs.");if(e.length===3&&e[1].dims===e[2].dims)throw new Error("x-scale and x-zero-point must have the same shape.");if(e.length===3&&e[0].dataType!==e[2].dataType)throw new Error("x and x-zero-point must have the same data type.");if(e[0].dataType===6&&e.length>2)throw new Error("In the case of dequantizing int32 there is no zero point.");if(e[1].dims.length!==0&&e[1].dims.length!==1&&e[1].dims.length!==e[0].dims.length)throw new Error("scale input must be a scalar, a 1D tensor, or have the same rank as the input tensor.");if(e.length>2){if(e[0].dataType!==e[2].dataType)throw new Error("x and x-zero-point must have the same data type.");if(e[1].dims.length!==e[2].dims.length)throw new Error("scale and zero-point inputs must have the same rank.");if(!e[1].dims.map((n,r)=>n===e[2].dims[r]).reduce((n,r)=>n&&r,!0))throw new Error("scale and zero-point inputs must have the same shape.")}if(t.blockSize>0){if(e[1].dims.length===0||e[1].dims.length===1&&e[1].dims[0]===1)throw new Error("blockSize must be set only for block quantization.");if(!e[1].dims.map((o,a)=>a===t.axis||o===e[0].dims[a]).reduce((o,a)=>o&&a,!0))throw new Error("For block qunatization, scale input shape to match the input shape except for the axis");if(e[1].dims.length!==e[0].dims.length)throw new Error("For block qunatization the scale input rank must be the same as the x rank.");let n=e[0].dims[t.axis],r=e[1].dims[t.axis];if(t.blockSizeMath.ceil(n/(r-1)-1))throw new Error("blockSize must be with in the range [ceil(dI / Si), ceil(dI / (Si - 1) - 1)].")}},fy=(e,t)=>{let n=E.normalizeAxis(t.axis,e[0].dims.length),r=e[0].dataType,o=r===3,a=e[0].dims,s=e[1].dataType,d=E.size(a),l=r===3||r===2,p=l?[Math.ceil(E.size(e[0].dims)/4)]:e[0].dims,f=e[1].dims,h=e.length>2?e[2]:void 0,y=h?l?[Math.ceil(E.size(h.dims)/4)]:h.dims:void 0,_=f.length===0||f.length===1&&f[0]===1,b=_===!1&&f.length===1,w=ge(d),S=_&&(!l||w===4),$=S?w:1,v=S&&!l?w:1,T=P("input",l?12:r,p.length,v),C=P("scale",s,f.length),A=h?P("zero_point",l?12:r,y.length):void 0,k=N("output",s,a.length,$),O=[T,C];A&&O.push(A);let M=[p,f];h&&M.push(y);let V=[{type:12,data:d/$},{type:12,data:n},{type:12,data:t.blockSize},...H(...M,a)],F=j=>{let ne=[{name:"output_size",type:"u32"},{name:"axis",type:"u32"},{name:"block_size",type:"u32"}];return` + ${j.registerUniforms(ne).declareVariables(...O,k)} + ${j.mainStart()} + ${j.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let output_indices = ${k.offsetToIndices("global_idx")}; + + // Set input x + ${l?` + let input = ${T.getByOffset("global_idx / 4")}; + let x_vec = ${o?"unpack4xI8(input)":"unpack4xU8(input)"}; + let x_value = ${$===1?"x_vec[global_idx % 4]":"x_vec"};`:`let x_value = ${T.getByOffset("global_idx")};`}; + + // Set scale input + ${_?`let scale_value= ${C.getByOffset("0")}`:b?` + let scale_index = ${k.indicesGet("output_indices","uniforms.axis")}; + let scale_value= ${C.getByOffset("scale_index")};`:` + var scale_indices: ${C.type.indices} = output_indices; + let index = ${C.indicesGet("scale_indices","uniforms.axis")} / uniforms.block_size; + ${C.indicesSet("scale_indices","uniforms.axis","index")}; + let scale_value= ${C.getByIndices("scale_indices")};`}; + + // Set zero-point input + ${A?_?l?` + let zero_point_input = ${A.getByOffset("0")}; + let zero_point_vec = ${o?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; + let zero_point_value= zero_point_vec[0]`:`let zero_point_value = ${A.getByOffset("0")}`:b?l?` + let zero_point_index = ${k.indicesGet("output_indices","uniforms.axis")}; + let zero_point_input = ${A.getByOffset("zero_point_index / 4")}; + let zero_point_vec = ${o?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; + let zero_point_value = zero_point_vec[zero_point_index % 4]`:` + let zero_point_index = ${k.indicesGet("output_indices","uniforms.axis")}; + let zero_point_value = ${A.getByOffset("zero_point_index")};`:l?` + let zero_point_offset = ${C.indicesToOffset("scale_indices")}; + let zero_point_input = ${A.getByOffset("zero_point_offset / 4")}; + let zero_point_vec = ${o?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; + let zero_point_value = zero_point_vec[zero_point_offset % 4];`:`let zero_point_value = ${A.getByIndices("scale_indices")};`:`let zero_point_value = ${l?o?"i32":"u32":T.type.value}(0);`}; + // Compute and write output + ${k.setByOffset("global_idx",`${k.type.value}(x_value - zero_point_value) * scale_value`)}; + }`};return{name:"DequantizeLinear",shaderCache:{hint:t.cacheKey,inputDependencies:A?["rank","rank","rank"]:["rank","rank"]},getShaderSource:F,getRunData:()=>({outputs:[{dims:a,dataType:s}],dispatchGroup:{x:Math.ceil(d/$/64),y:1,z:1},programUniforms:V})}},lc=(e,t)=>{my(e.inputs,t),e.compute(fy(e.inputs,t))},cc=e=>re({axis:e.axis,blockSize:e.blockSize})});var hy,gy,mc,fc=G(()=>{"use strict";Ge();te();ce();hy=(e,t,n)=>{let r=e===t,o=et&&n>0;if(r||o||a)throw new Error("Range these inputs' contents are invalid.")},gy=(e,t,n,r)=>{let o=Math.abs(Math.ceil((t-e)/n)),a=[o],s=o,d=[{type:12,data:s},{type:r,data:e},{type:r,data:n},...H(a)],l=p=>{let f=N("output",r,a.length),h=f.type.value,y=[{name:"outputSize",type:"u32"},{name:"start",type:h},{name:"delta",type:h}];return` + ${p.registerUniforms(y).declareVariables(f)} + ${p.mainStart()} + ${p.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + output[global_idx] = uniforms.start + ${h}(global_idx) * uniforms.delta; + }`};return{name:"Range",shaderCache:{hint:`${r}`},getShaderSource:l,getRunData:()=>({outputs:[{dims:a,dataType:r}],dispatchGroup:{x:Math.ceil(s/64)},programUniforms:d})}},mc=e=>{let t=0,n=0,r=0;e.inputs[0].dataType===6?(t=e.inputs[0].getInt32Array()[0],n=e.inputs[1].getInt32Array()[0],r=e.inputs[2].getInt32Array()[0]):e.inputs[0].dataType===1&&(t=e.inputs[0].getFloat32Array()[0],n=e.inputs[1].getFloat32Array()[0],r=e.inputs[2].getFloat32Array()[0]),we.webgpu.validateInputContent&&hy(t,n,r),e.compute(gy(t,n,r,e.inputs[0].dataType),{inputs:[]})}});var yy,by,hc,gc,yc=G(()=>{"use strict";te();ae();Ce();ce();yy=(e,t,n,r)=>{if(e!=="none"&&r!=="i32"&&r!=="u32"&&r!=="f32")throw new Error(`Input ${r} is not supported with reduction ${e}.`);let o=`{ + var oldValue = 0; + loop { + let newValueF32 =`,a=`; + let newValue = bitcast(newValueF32); + let res = atomicCompareExchangeWeak(&${t}, oldValue, newValue); + if res.exchanged { + break; + } + oldValue = res.old_value; + } + }`;switch(e){case"none":return`${t}=${n};`;case"add":return r==="i32"||r==="u32"?`atomicAdd(&${t}, bitcast<${r}>(${n}));`:` + ${o}bitcast<${r}>(oldValue) + (${n})${a}`;case"max":return r==="i32"||r==="u32"?`atomicMax(&${t}, bitcast<${r}>(${n}));`:` + ${o}max(bitcast(oldValue), (${n}))${a}`;case"min":return r==="i32"||r==="u32"?`atomicMin(&${t}, bitcast<${r}>(${n}));`:`${o}min(bitcast<${r}>(oldValue), (${n}))${a}`;case"mul":return`${o}(bitcast<${r}>(oldValue) * (${n}))${a}`;default:throw new Error(`Reduction ${e} is not supported.`)}},by=(e,t)=>{let n=e[0].dims,r=e[1].dims,o=n,a=1,s=Math.ceil(E.size(r)/a),d=r[r.length-1],l=E.sizeFromDimension(n,d),p=[{type:12,data:s},{type:12,data:d},{type:12,data:l},...H(e[1].dims,e[2].dims,o)],f=h=>{let y=P("indices",e[1].dataType,e[1].dims.length),_=P("updates",e[2].dataType,e[2].dims.length,a),b=t.reduction!=="none"&&t.reduction!==""?Hs("output",e[0].dataType,o.length):N("output",e[0].dataType,o.length,a);return` + ${h.registerUniform("output_size","u32").registerUniform("last_index_dimension","u32").registerUniform("num_updates_elements","u32").declareVariables(y,_,b)} + ${h.mainStart()} + ${h.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + var hasDuplicates = false; + if (${t.reduction==="none"}) { + let n = ${E.size(r)}; + for (var i = 0; i < n; i = i + 1) { + for (var j = i + 1; j < n; j = j + 1) { + var index_i = i32(indices[i].x); + var index_j = i32(indices[j].x); + if (index_i == index_j) { + hasDuplicates = true; + break; + } + } + if (hasDuplicates) { + break; + } + } + } + + var data_offset = 0u; + var indices_start = uniforms.last_index_dimension * global_idx; + if (${t.reduction==="none"} && hasDuplicates) { + if (global_idx != 0u) { + return; + } + indices_start = 0u; + } + let indices_end = indices_start + uniforms.last_index_dimension; + for (var i = indices_start; i < indices_end; i++) { + var index = i32(indices[i].x); + ${e[0].dims.length===1?` + let element_count_dim = uniforms.output_strides; + let dim_value = uniforms.output_shape;`:` + let element_count_dim = uniforms.output_strides[i - indices_start]; + let dim_value = uniforms.output_shape[i - indices_start + uniforms.last_index_dimension];`} + if (index >= 0) { + if (index >= i32(dim_value)) { + index = i32(dim_value - 1); + } + } else { + if (index < -i32(dim_value)) { + index = 0; + } else { + index += i32(dim_value); + } + } + data_offset += u32((u32(index) * element_count_dim)); + } + + for (var i = 0u; i < uniforms.num_updates_elements; i++) { + let value = updates[uniforms.num_updates_elements * global_idx + i]; + ${yy(t.reduction,"output[data_offset + i]","value",b.type.value)} + } + + }`};return{name:"ScatterND",shaderCache:{hint:`${t.cacheKey}_${t.reduction}`,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:o,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(s/64)},programUniforms:p}),getShaderSource:f}},hc=e=>re({reduction:e.reduction}),gc=(e,t)=>{e.compute(by(e.inputs,t),{inputs:[e.inputs[1],e.inputs[2]],outputs:[]})}});var _y,wy,vy,bc,$y,xy,Sy,Ty,Cy,Iy,Ay,ky,_c,Ey,Py,zy,Oy,Dy,wc,vc,$c=G(()=>{"use strict";te();ae();Ce();ce();_y=(e,t)=>{if(e.every(n=>n>0||(()=>{throw new Error("Resize requires scales input values to be positive")})),e.length>0){if(t.mode==="linear"){if(!(e.length===2||e.length===3||e.length===4&&e[0]===1&&e[1]===1||e.length===4&&e[0]===1&&e[3]===1||e.length===5&&e[0]===1&&e[1]===1))throw new Error(`For linear mode, Resize requires scales to be 2D, 3D, 4D with either two outermost or one innermost and + one outermost scale values equal to 1, or 5D with two outermost scale values equal to 1`)}else if(t.mode==="cubic"&&!(e.length===2||e.length===4&&e[0]===1&&e[1]===1||e.length===4&&e[0]===1&&e[3]===1))throw new Error("Resize requires scales input size to be 2 or 4 for cubic mode")}},wy=(e,t,n)=>{t.every(o=>o>=0&&o{throw new Error("Resize requires axes input values to be positive and less than rank")}));let r=new Array(n).fill(1);return t.forEach((o,a)=>r[o]=e[a]),r},vy=(e,t,n,r,o,a)=>{let[s,d,l]=n>10?[1,2,3]:[-1,e.length>1?1:-1,-1],p=e[0].dims.length;if(s>0&&e.length>s&&e[s].dims.length>0)e[s].getFloat32Array().forEach(f=>a.push(f));else if(t.coordinateTransformMode==="tf_crop_and_resize")throw new Error("Resize requires RoI input to be specified when coordinateTransformMode is tfCropAndResize");if(d>0&&e.length>d&&e[d].dims.length===1&&e[d].dims[0]>0){if(e[d].getFloat32Array().forEach(f=>r.push(f)),r.length!==0&&r.length!==p&&n>=18&&r.length!==t.axes.length)throw new Error("Resize requires scales input size to be same as input rank or axes size for opset 18 and up");_y(r,t),t.axes.length>0&&wy(r,t.axes,p).forEach((f,h)=>r[h]=f)}if(l>0&&e.length>l&&e[l].dims.length===1&&e[l].dims[0]>0&&(e[l].getBigInt64Array().forEach(f=>o.push(Number(f))),o.length!==0&&o.length!==p&&n>=18&&o.length!==t.axes.length))throw new Error("Resize requires sizes input size to be same as input rank or axes size for opset 18 and up");if(t.axes.length>0){if(r.length!==0&&r.length!==t.axes.length)throw new Error('Resize requires "scales" input size to be of axes rank when axes attributes is specified');if(o.length!==0&&o.length!==t.axes.length)throw new Error('Resize requires "sizes" input size to be of rank axes rank when axes attributes is specified')}if(typeof r<"u"&&typeof o<"u"&&r.length>0&&o.length>p)throw new Error("Resize requires only of scales or sizes to be specified")},bc=(e,t,n,r)=>` + // The whole part and the fractional part are calculated separately due to inaccuracy of floating + // point division. As an example, f32(21) / f32(7) may evaluate to 2.99... instead of 3, causing an + // offset-by-one error later in floor(). + let big = (${e}) * (${t}); + let whole = ${r}(big / (${n})); + let fract = ${r}(big % (${n})) / ${r}(${n}); + return whole + fract; +`,$y=(e,t)=>`fn getOriginalCoordinateFromResizedCoordinate(xResized: u32, xScale: f32, lengthResized: u32, + lengthOriginal: u32, roiStart: f32, roiEnd: f32) -> ${t} { `+(()=>{switch(e){case"asymmetric":return` + if (xScale < 1.0 || floor(xScale) != xScale) { + return ${t}(xResized) / ${t}(xScale); + } else { + ${bc("xResized","lengthOriginal","lengthResized",t)} + } + `;case"pytorch_half_pixel":return`if (lengthResized > 1) { + return (${t}(xResized) + 0.5) / ${t}(xScale) - 0.5; + } else { + return 0.0; + }`;case"tf_half_pixel_for_nn":return`return (${t}(xResized) + 0.5) / ${t}(xScale);`;case"align_corners":return`if (lengthResized == 1) { + return 0.0; + } else { + ${bc("xResized","lengthOriginal - 1","lengthResized - 1",t)} + }`;case"tf_crop_and_resize":return`if (lengthResized > 1) { + return ${t}(roiStart) * ${t}(lengthOriginal - 1) + + (${t}(xResized) * ${t}(roiEnd - roiStart) * ${t}(lengthOriginal - 1)) / + ${t}(lengthResized - 1); + } else { + return 0.5 * ${t}(roiStart + roiEnd) * ${t}(lengthOriginal - 1); + }`;case"half_pixel_symmetric":return`const outputWidth = ${t}xScale * ${t}(lengthResized); + const adjustment = ${t}(lengthResized) / outputWidth; + const center = ${t}(lengthOriginal) / 2; + const offset = center * (1 - adjustment); + return offset + ((${t}(xResized) + 0.5) / ${t}(xScale)) - 0.5;`;case"half_pixel":return`return ((${t}(xResized) + 0.5) / ${t}(xScale)) - 0.5;`;default:throw new Error(`Coordinate transform mode ${e} is not supported`)}})()+"}",xy=(e,t,n)=>`fn getNearestPixelFromOriginal(xOriginal: ${n}, isDownSample: bool) -> ${n} {`+(()=>{switch(e){case"round_prefer_ceil":return"if (fract(xOriginal) == 0.5) { return ceil(xOriginal); } else { return round(xOriginal); }";case"floor":return"return floor(xOriginal);";case"ceil":return"return ceil(xOriginal);";case"round_prefer_floor":return"if (fract(xOriginal) == 0.5) { return floor(xOriginal); } else { return round(xOriginal); }";case"simple":default:if(t<11)return"if (isDownSample) { return ceil(xOriginal); } else { return xOriginal; }";throw new Error(`Nearest mode ${e} is not supported`)}})()+"}",Sy=(e,t,n)=>{let r=new Array(n).fill(0).concat(new Array(n).fill(1)),o=e.length===0?r:e.slice();return t.length>0?(t.forEach((a,s)=>{r[a]=o[s],r[s+n]=o[t.length+s]}),r):o},Ty=(e,t,n,r)=>{let o=[];if(n.length>0)if(r.length>0){if(e.forEach(a=>o.push(a)),Math.max(...r)>e.length)throw new Error("axes is out of bound");r.forEach((a,s)=>o[a]=n[s])}else n.forEach(a=>o.push(a));else{if(t.length===0)throw new Error("Resize requires either scales or sizes.");o=e.map((a,s)=>Math.round(a*t[s]))}return o},Cy=(e,t,n)=>{let r=(()=>{switch(n.keepAspectRatioPolicy){case"not_larger":return n.axes.length>0?Math.min(...n.axes.map(a=>t[a]),Number.MAX_VALUE):Math.min(...t,Number.MAX_VALUE);case"not_smaller":return n.axes.length>0?Math.max(...n.axes.map(a=>t[a]),Number.MIN_VALUE):Math.max(...t,Number.MIN_VALUE);default:throw new Error(`Keep aspect ratio policy ${n.keepAspectRatioPolicy} is not supported`)}})();t.fill(1,0,t.length);let o=e.slice();return n.axes.length>0?(n.axes.forEach(a=>t[a]=r),n.axes.forEach(a=>o[a]=Math.round(e[a]*t[a]))):(t.fill(r,0,t.length),o.forEach((a,s)=>o[s]=Math.round(a*t[s]))),o},Iy=(e,t,n,r,o)=>` + fn calculateOriginalIndicesFromOutputIndices(output_indices: ${e.type.indices}) -> array<${e.type.value}, ${n.length}> { + var original_indices: array<${e.type.value}, ${n.length}>; + for (var i:u32 = 0; i < ${n.length}; i++) { + var output_index = ${e.indicesGet("output_indices","i")}; + var scale = ${K("uniforms.scales","i",r)}; + var roi_low = ${K("uniforms.roi","i",o)}; + var roi_hi = ${K("uniforms.roi",`i + ${t.length}`,o)}; + if (scale == 1.0) { + original_indices[i] = ${e.type.value}(output_index); + } else { + var input_shape_i = ${K("uniforms.input_shape","i",t.length)}; + var output_shape_i = ${K("uniforms.output_shape","i",n.length)}; + original_indices[i] = getOriginalCoordinateFromResizedCoordinate(output_index, scale, output_shape_i, + input_shape_i, roi_low, roi_hi); + } + } + return original_indices; + }`,Ay=(e,t,n,r,o,a,s)=>` + fn calculateInputIndicesFromOutputIndices(output_indices: ${t.type.indices}) -> ${e.type.indices} { + var input_indices: ${e.type.indices}; + for (var i:u32 = 0; i < ${r.length}; i++) { + var output_index = ${t.indicesGet("output_indices","i")}; + var input_index: u32; + var scale = ${K("uniforms.scales","i",o)}; + if (scale == 1.0) { + input_index = output_index; + } else { + var roi_low = ${K("uniforms.roi","i",a)}; + var roi_hi = ${K("uniforms.roi",`i + ${n.length}`,a)}; + var input_shape_i = ${K("uniforms.input_shape","i",n.length)}; + var output_shape_i = ${K("uniforms.output_shape","i",r.length)}; + var original_idx = getOriginalCoordinateFromResizedCoordinate(output_index, scale, output_shape_i, + input_shape_i, roi_low, roi_hi); + if (!${s} || (original_idx >= 0 && original_idx < ${t.type.value}(input_shape_i))) { + if (original_idx < 0) { + input_index = 0; + } else if (original_idx > ${t.type.value}(input_shape_i - 1)) { + input_index = input_shape_i - 1; + } else { + input_index = u32(getNearestPixelFromOriginal(original_idx, scale < 1)); + } + } else { + input_index = u32(original_idx); + } + } + ${e.indicesSet("input_indices","i","input_index")} + } + return input_indices; + }`,ky=(e,t)=>` + fn checkInputIndices(input_indices: ${e.type.indices}) -> bool { + for (var i:u32 = 0; i < ${t.length}; i++) { + var input_index = ${e.indicesGet("input_indices","i")}; + if (input_index < 0 || input_index >= ${K("uniforms.input_shape","i",t.length)}) { + return false; + } + } + return true; + }`,_c=(e,t,n,r)=>e.rank>r?` + ${e.indicesSet("input_indices",t,"channel")}; + ${e.indicesSet("input_indices",n,"batch")}; +`:"",Ey=(e,t,n,r,o)=>{let[s,d,l,p]=n.length===2?[-1,0,1,-1]:[0,2,3,1],f=e.type.value;return` + fn getInputValue(batch: u32, channel: u32, row: u32, col: u32) -> ${f} { + var input_indices: ${e.type.indices}; + ${e.indicesSet("input_indices",d,`max(0, min(row, ${n[d]} - 1))`)}; + ${e.indicesSet("input_indices",l,`max(0, min(col, ${n[l]} - 1))`)}; + ${_c(e,p,s,2)} + return ${e.getByIndices("input_indices")}; + } + + fn bilinearInterpolation(output_indices: ${t.type.indices}) -> ${f} { + var originalIndices = calculateOriginalIndicesFromOutputIndices(output_indices); + var row:${f} = originalIndices[${d}]; + var col:${f} = originalIndices[${l}]; + ${r?`if (row < 0 || row > (${n[d]} - 1) || col < 0 || col > (${n[l]} - 1)) { + return ${o}; + }`:""}; + row = max(0, min(row, ${n[d]} - 1)); + col = max(0, min(col, ${n[l]} - 1)); + var row1: u32 = u32(row); + var col1: u32 = u32(col); + var row2: u32 = u32(row + 1); + var col2: u32 = u32(col + 1); + var channel: u32 = ${n.length>2?`u32(originalIndices[${p}])`:"0"}; + var batch: u32 = ${n.length>2?`u32(originalIndices[${s}])`:"0"}; + var x11: ${f} = getInputValue(batch, channel, row1, col1); + var x12: ${f} = getInputValue(batch, channel, row1, col2); + var x21: ${f} = getInputValue(batch, channel, row2, col1); + var x22: ${f} = getInputValue(batch, channel, row2, col2); + var dx1: ${f} = abs(row - ${f}(row1)); + var dx2: ${f} = abs(${f}(row2) - row); + var dy1: ${f} = abs(col - ${f}(col1)); + var dy2: ${f} = abs(${f}(col2) - col); + if (row1 == row2) { + dx1 = 0.5; + dx2 = 0.5; + } + if (col1 == col2) { + dy1 = 0.5; + dy2 = 0.5; + } + return (x11 * dx2 * dy2 + x12 * dx2 * dy1 + x21 * dx1 * dy2 + x22 * dx1 * dy1); + }`},Py=(e,t,n,r,o,a,s,d,l,p)=>{let f=n.length===2,h=!0,[y,_]=f?[0,1]:h?[2,3]:[1,2],b=e.type.value,w=S=>{let $=S===y?"row":"col";return` + fn ${$}CubicInterpolation(input_indices: ${e.type.indices}, output_indices: ${t.type.indices}) -> ${b} { + var output_index = ${t.indicesGet("output_indices",S)}; + var originalIdx: ${b} = getOriginalCoordinateFromResizedCoordinate(output_index, ${o[S]}, + ${r[S]}, ${n[S]}, ${a[S]}, ${a[S]} + ${n.length}); + var fractOriginalIdx: ${b} = originalIdx - floor(originalIdx); + var coefs = getCubicInterpolationCoefs(fractOriginalIdx); + + if (${d} && (originalIdx < 0 || originalIdx > (${n[S]} - 1))) { + return ${l}; + } + var data: array<${b}, 4> = array<${b}, 4>(0.0, 0.0, 0.0, 0.0); + for (var i: i32 = -1; i < 3; i++) { + var ${$}: ${b} = originalIdx + ${b}(i); + if (${$} < 0 || ${$} >= ${n[S]}) { + ${p?`coefs[i + 1] = 0.0; + continue;`:d?`return ${l};`:`${$} = max(0, min(${$}, ${n[S]} - 1));`}; + } + var input_indices_copy: ${e.type.indices} = input_indices; + ${e.indicesSet("input_indices_copy",S,`u32(${$})`)}; + data[i + 1] = ${S===y?e.getByIndices("input_indices_copy"):"rowCubicInterpolation(input_indices_copy, output_indices)"}; + } + return cubicInterpolation1D(data, coefs); + }`};return` + ${w(y)}; + ${w(_)}; + fn getCubicInterpolationCoefs(s: ${b}) -> array<${b}, 4> { + var absS = abs(s); + var coeffs: array<${b}, 4> = array<${b}, 4>(0.0, 0.0, 0.0, 0.0); + var oneMinusAbsS: ${b} = 1.0 - absS; + var twoMinusAbsS: ${b} = 2.0 - absS; + var onePlusAbsS: ${b} = 1.0 + absS; + coeffs[0] = ((${s} * onePlusAbsS - 5 * ${s}) * onePlusAbsS + 8 * ${s}) * onePlusAbsS - 4 * ${s}; + coeffs[1] = ((${s} + 2) * absS - (${s} + 3)) * absS * absS + 1; + coeffs[2] = ((${s} + 2) * oneMinusAbsS - (${s} + 3)) * oneMinusAbsS * oneMinusAbsS + 1; + coeffs[3] = ((${s} * twoMinusAbsS - 5 * ${s}) * twoMinusAbsS + 8 * ${s}) * twoMinusAbsS - 4 * ${s}; + return coeffs; + } + + fn cubicInterpolation1D(x: array<${b}, 4>, coefs: array<${b}, 4>) -> ${b} { + var coefsSum: ${b} = coefs[0] + coefs[1] + coefs[2] + coefs[3]; + return (x[0] * coefs[0] + x[1] * coefs[1]+ x[2] * coefs[2]+ x[3] * coefs[3]) / coefsSum; + } + + fn bicubicInterpolation(output_indices: ${t.type.indices}) -> ${b} { + var input_indices: ${e.type.indices} = output_indices; + return colCubicInterpolation(input_indices, output_indices); + } + `},zy=(e,t,n,r,o)=>{let[s,d,l,p,f]=n.length===3?[-1,0,1,2,-1]:[0,2,3,4,1],h=e.type.value;return` + fn getInputValue(batch: u32, channel: u32, depth:u32, height: u32, width: u32) -> ${h} { + var input_indices: ${e.type.indices}; + ${e.indicesSet("input_indices",d,`max(0, min(depth, ${n[d]} - 1))`)}; + ${e.indicesSet("input_indices",l,`max(0, min(height, ${n[l]} - 1))`)}; + ${e.indicesSet("input_indices",p,`max(0, min(width, ${n[p]} - 1))`)}; + ${_c(e,f,s,3)} + return ${e.getByIndices("input_indices")}; + } + + fn trilinearInterpolation(output_indices: ${t.type.indices}) -> ${h} { + var originalIndices = calculateOriginalIndicesFromOutputIndices(output_indices); + var depth:${h} = originalIndices[${d}]; + var height:${h} = originalIndices[${l}]; + var width:${h} = originalIndices[${p}]; + ${r?`if (depth < 0 || depth > (${n[d]} - 1) || height < 0 || height > (${n[l]} - 1) || width < 0 || (width > ${n[p]} - 1)) { + return ${o}; + }`:""}; + + depth = max(0, min(depth, ${n[d]} - 1)); + height = max(0, min(height, ${n[l]} - 1)); + width = max(0, min(width, ${n[p]} - 1)); + var depth1: u32 = u32(depth); + var height1: u32 = u32(height); + var width1: u32 = u32(width); + var depth2: u32 = u32(depth + 1); + var height2: u32 = u32(height + 1); + var width2: u32 = u32(width + 1); + var channel: u32 = ${n.length>3?`u32(originalIndices[${f}])`:"0"}; + var batch: u32 = ${n.length>3?`u32(originalIndices[${s}])`:"0"}; + + var x111: ${h} = getInputValue(batch, channel, depth1, height1, width1); + var x112: ${h} = getInputValue(batch, channel, depth1, height1, width2); + var x121: ${h} = getInputValue(batch, channel, depth1, height2, width1); + var x122: ${h} = getInputValue(batch, channel, depth1, height2, width2); + var x211: ${h} = getInputValue(batch, channel, depth2, height1, width1); + var x212: ${h} = getInputValue(batch, channel, depth2, height1, width2); + var x221: ${h} = getInputValue(batch, channel, depth2, height2, width1); + var x222: ${h} = getInputValue(batch, channel, depth2, height2, width2); + var dx1: ${h} = abs(depth - ${h}(depth1)); + var dx2: ${h} = abs(${h}(depth2) - depth); + var dy1: ${h} = abs(height - ${h}(height1)); + var dy2: ${h} = abs(${h}(height2) - height); + var dz1: ${h} = abs(width - ${h}(width1)); + var dz2: ${h} = abs(${h}(width2) - width); + if (depth1 == depth2) { + dx1 = 0.5; + dx2 = 0.5; + } + if (height1 == height2) { + dy1 = 0.5; + dy2 = 0.5; + } + if (width1 == width2) { + dz1 = 0.5; + dz2 = 0.5; + } + return (x111 * dx2 * dy2 * dz2 + x112 * dx2 * dy2 * dz1 + x121 * dx2 * dy1 *dz2 + x122 * dx2 * dy1 * dz1 + + x211 * dx1 * dy2 * dz2 + x212 * dx1 * dy2 * dz1 + x221 * dx1 * dy1 *dz2 + x222 * dx1 * dy1 * dz1); + }`},Oy=(e,t,n,r,o,a)=>{let s=e.dims,d=Sy(a,t.axes,s.length),l=Ty(s,r,o,t.axes),p=r.slice();r.length===0&&(p=s.map((v,T)=>v===0?1:l[T]/v),t.keepAspectRatioPolicy!=="stretch"&&(l=Cy(s,p,t)));let f=N("output",e.dataType,l.length),h=P("input",e.dataType,s.length),y=E.size(l),_=s.length===l.length&&s.every((v,T)=>v===l[T]),b=t.coordinateTransformMode==="tf_crop_and_resize",w=t.extrapolationValue,S=h.type.value,$=v=>` + ${_?"":` + ${$y(t.coordinateTransformMode,S)}; + ${(()=>{switch(t.mode){case"nearest":return` + ${ky(h,s)}; + ${xy(t.nearestMode,n,S)}; + ${Ay(h,f,s,l,p.length,d.length,b)}; + `;case"linear":return` + ${Iy(f,s,l,p.length,d.length)}; + ${(()=>{if(s.length===2||s.length===4)return`${Ey(h,f,s,b,w)}`;if(s.length===3||s.length===5)return`${zy(h,f,s,b,w)}`;throw Error("Linear mode only supports input dims 2, 3, 4 and 5 are supported in linear mode.")})()}; + `;case"cubic":return` + ${(()=>{if(s.length===2||s.length===4)return`${Py(h,f,s,l,p,d,t.cubicCoeffA,b,t.extrapolationValue,t.excludeOutside)}`;throw Error("Cubic mode only supports input dims 2 and 4 are supported in linear mode.")})()}; + `;default:throw Error("Invalid resize mode")}})()}; + `} + ${v.registerUniform("output_size","u32").registerUniform("scales","f32",p.length).registerUniform("roi","f32",d.length).declareVariables(h,f)} + ${v.mainStart()} + ${v.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + ${_?"output[global_idx] = input[global_idx];":` + let output_indices = ${f.offsetToIndices("global_idx")}; + var input_indices: ${h.type.indices}; + ${(()=>{switch(t.mode){case"nearest":return`input_indices = calculateInputIndicesFromOutputIndices(output_indices); + if (checkInputIndices(input_indices)) { + output[global_idx] = ${h.getByIndices("input_indices")}; + } else { + output[global_idx] = ${t.extrapolationValue}; + }`;case"linear":return`output[global_idx] = ${s.length===2||s.length===4?"bilinearInterpolation":"trilinearInterpolation"}(output_indices);`;case"cubic":return"output[global_idx] = bicubicInterpolation(output_indices);";default:throw Error(`Unsupported resize mode: ${t.mode}`)}})()}; +`} + }`;return{name:"Resize",shaderCache:{hint:`${t.cacheKey}|${n}|${p.length>0?t.mode==="cubic"?p:p.length:""}|${o.length>0?o:""}|${d.length>0?d:""}|${_}|${t.mode==="nearest"?s.length:s}`,inputDependencies:["rank"]},getShaderSource:$,getRunData:()=>({outputs:[{dims:l,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(y/64)},programUniforms:[{type:12,data:y},{type:1,data:p},{type:1,data:d},...H(s,l)]})}},Dy=e=>{let t=e.customDataBuffer;return new Uint32Array(t,t.byteOffset,1)[0]},wc=(e,t)=>{let n=[],r=[],o=[],a=Dy(e);if(t.antialias!==0)throw Error("Only default value (0) for Antialias attribute is supported");vy(e.inputs,t,a,n,r,o),e.compute(Oy(e.inputs[0],t,a,n,r,o),{inputs:[0]})},vc=e=>{let t=e.antialias,n=e.axes,r=e.coordinateTransformMode,o=e.cubicCoeffA,a=e.excludeOutside!==0,s=e.extrapolationValue,d=e.keepAspectRatioPolicy,l=e.mode,p=e.nearestMode===""?"simple":e.nearestMode;return re({antialias:t,axes:n,coordinateTransformMode:r,cubicCoeffA:o,excludeOutside:a,extrapolationValue:s,keepAspectRatioPolicy:d,mode:l,nearestMode:p})}});var By,My,xc,Sc=G(()=>{"use strict";te();ae();Ce();ce();By=(e,t)=>{let[n,r,o,a]=e,{numHeads:s,rotaryEmbeddingDim:d}=t;if(n.dims.length!==3&&n.dims.length!==4)throw new Error(`Input 'x' is expected to have 3 or 4 dimensions, got ${n.dims.length}`);if(!E.areEqual(r.dims,[])&&!E.areEqual(r.dims,[1])&&r.dims.length!==2)throw new Error(`Input 'position_ids' is expected to have 0, 1, or 2 dimensions, got ${r.dims.length}`);if(o.dims.length!==2)throw new Error(`Input 'cos_cache' is expected to have 2 dimensions, got ${o.dims.length}`);if(a.dims.length!==2)throw new Error(`Input 'sin_cache' is expected to have 2 dimensions, got ${a.dims.length}`);if(!E.areEqual(o.dims,a.dims))throw new Error("Inputs 'cos_cache' and 'sin_cache' are expected to have the same shape");if(d>0&&s===0)throw new Error("num_heads must be provided if rotary_embedding_dim is specified");let l=n.dims[0],p=n.dims[n.dims.length-2],f=o.dims[0],h=E.sizeFromDimension(n.dims,1)/p,y=d===0?o.dims[1]*2:h/s;if(d>y)throw new Error("rotary_embedding_dim must be less than or equal to head_size");if(r.dims.length===2){if(l!==r.dims[0])throw new Error(`Input 'position_ids' dimension 0 should be of size batch_size, got ${r.dims[0]}`);if(p!==r.dims[1])throw new Error(`Input 'position_ids' dimension 1 should be of size sequence_length, got ${r.dims[1]}`)}if(y/2!==o.dims[1]&&d/2!==o.dims[1])throw new Error(`Input 'cos_cache' dimension 1 should be same as head_size / 2 or rotary_embedding_dim / 2, got ${o.dims[1]}`);if(p>f)throw new Error("Updating cos_cache and sin_cache in RotaryEmbedding is not currently supported")},My=(e,t)=>{let{interleaved:n,numHeads:r,rotaryEmbeddingDim:o,scale:a}=t,s=e[0].dims[0],d=E.sizeFromDimension(e[0].dims,1),l=e[0].dims[e[0].dims.length-2],p=d/l,f=e[2].dims[1],h=o===0?f*2:p/r,y=new Array(s,l,p/h,h-f),_=E.computeStrides(y),b=[{type:1,data:a},{type:12,data:y},{type:12,data:_},...e[0].dims.length===3?new Array({type:12,data:[d,p,h,1]}):[],...e[0].dims.length===4?new Array({type:12,data:[d,h,l*h,1]}):[],...H(e[0].dims,e[1].dims,e[2].dims,e[3].dims,e[0].dims)],w=S=>{let $=P("input",e[0].dataType,e[0].dims.length),v=P("position_ids",e[1].dataType,e[1].dims.length),T=P("cos_cache",e[2].dataType,e[2].dims.length),C=P("sin_cache",e[3].dataType,e[3].dims.length),A=N("output",e[0].dataType,e[0].dims.length);return S.registerUniforms([{name:"scale",type:"f32"},{name:"global_shape",type:"u32",length:y.length},{name:"global_strides",type:"u32",length:_.length},{name:"input_output_strides",type:"u32",length:_.length}]),` + ${S.declareVariables($,v,T,C,A)} + + ${S.mainStart(Et)} + let half_rotary_emb_dim = uniforms.${T.name}_shape[1]; + let bsnh = global_idx / uniforms.global_strides % uniforms.global_shape; + let size = uniforms.global_shape[0] * uniforms.global_strides[0]; + ${S.guardAgainstOutOfBoundsWorkgroupSizes("size")} + + if (bsnh[3] < half_rotary_emb_dim) { + let position_ids_idx = + ${v.broadcastedIndicesToOffset("bsnh.xy",N("",v.type.tensor,2))}; + let position_id = + u32(${v.getByOffset("position_ids_idx")}) + select(0, bsnh[1], position_ids_idx == 0); + let i = dot(bsnh, uniforms.input_output_strides) + select(0, bsnh[3], ${n}); + let j = i + select(half_rotary_emb_dim, 1, ${n}); + let re = ${$.getByOffset("i")} * ${T.get("position_id","bsnh[3]")} - + ${$.getByOffset("j")} * ${C.get("position_id","bsnh[3]")}; + ${A.setByOffset("i","re")} + let im = ${$.getByOffset("i")} * ${C.get("position_id","bsnh[3]")} + + ${$.getByOffset("j")} * ${T.get("position_id","bsnh[3]")}; + ${A.setByOffset("j","im")} + } else { + let k = dot(bsnh, uniforms.input_output_strides) + half_rotary_emb_dim; + ${A.setByOffset("k",$.getByOffset("k"))} + } + }`};return{name:"RotaryEmbedding",shaderCache:{hint:re({interleaved:n}).cacheKey,inputDependencies:["rank","rank","rank","rank"]},getShaderSource:w,getRunData:()=>({outputs:[{dims:e[0].dims,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(E.size(y)/Et)},programUniforms:b})}},xc=(e,t)=>{By(e.inputs,t),e.compute(My(e.inputs,t))}});var Ry,Uy,Tc,Cc=G(()=>{"use strict";te();ae();ce();Ry=e=>{if(!e||e.length<3)throw new Error("layerNorm requires at least 3 inputs.");let t=e[0],n=e[1],r=e[2];if(t.dataType!==n.dataType||t.dataType!==r.dataType)throw new Error("All inputs must have the same data type");if(t.dims.length!==3&&t.dims.length!==2)throw new Error("Input must be 2D or 3D");if(n.dims.length!==3&&n.dims.length!==2)throw new Error("Skip must be 2D or 3D");let o=t.dims[t.dims.length-1],a=t.dims[t.dims.length-2];if(n.dims[n.dims.length-1]!==o)throw new Error("Skip must have the same hidden size as input");if(n.dims[n.dims.length-2]!==a)throw new Error("Skip must have the same sequence length as input");if(r.dims.length!==1)throw new Error("Gamma must be 1D");if(r.dims[r.dims.length-1]!==o)throw new Error("Gamma must have the same hidden size as input");if(e.length>3){let s=e[3];if(s.dims.length!==1)throw new Error("Beta must be 1D");if(s.dims[s.dims.length-1]!==o)throw new Error("Beta must have the same hidden size as input")}if(e.length>4){let s=e[4];if(s.dims.length!==1)throw new Error("Bias must be 1D");if(s.dims[s.dims.length-1]!==o)throw new Error("Bias must have the same hidden size as input")}},Uy=(e,t,n,r)=>{let o=t.simplified,a=e[0].dims,s=E.size(a),d=a,l=s,p=a.slice(-1)[0],f=r?a.slice(0,-1).concat(1):[],h=!o&&e.length>3,y=e.length>4,_=r&&n>1,b=r&&n>2,w=n>3,S=64,$=ge(p),v=[{type:12,data:l},{type:12,data:$},{type:12,data:p},{type:1,data:t.epsilon}],T=A=>{let k=[{name:"output_size",type:"u32"},{name:"components",type:"u32"},{name:"hidden_size",type:"u32"},{name:"epsilon",type:"f32"}],O=[P("x",e[0].dataType,e[0].dims,$),P("skip",e[1].dataType,e[1].dims,$),P("gamma",e[2].dataType,e[2].dims,$)];h&&O.push(P("beta",e[3].dataType,e[3].dims,$)),y&&O.push(P("bias",e[4].dataType,e[4].dims,$)),O.push(N("output",e[0].dataType,d,$)),_&&O.push(N("mean_output",1,f)),b&&O.push(N("inv_std_output",1,f)),w&&O.push(N("input_skip_bias_sum",e[0].dataType,d,$));let M=_e(e[0].dataType),V=_e(1,$);return` + + ${A.registerUniforms(k).declareVariables(...O)} + var sum_shared : array<${V}, ${S}>; + var sum_squared_shared : array<${V}, ${S}>; + + ${A.mainStart([S,1,1])} + let ix = local_id.x; + let iy = global_id.x / ${S}; + + let hidden_size_vectorized: u32 = uniforms.hidden_size / uniforms.components; + var stride = hidden_size_vectorized / ${S}; + let offset = ix * stride + iy * hidden_size_vectorized; + let offset1d = stride * ix; + if (ix == ${S-1}) { + stride = hidden_size_vectorized - stride * ix; + } + for (var i: u32 = 0; i < stride; i++) { + let skip_value = skip[offset + i]; + let bias_value = ${y?"bias[offset1d + i]":M+"(0.0)"}; + let input_value = x[offset + i]; + let value = input_value + skip_value + bias_value; + ${w?"input_skip_bias_sum[offset + i] = value;":""} + output[offset + i] = value; + let f32_value = ${Pt(M,$,"value")}; + sum_shared[ix] += f32_value; + sum_squared_shared[ix] += f32_value * f32_value; + } + workgroupBarrier(); + + var reduce_size : u32 = ${S}; + for (var curr_size = reduce_size >> 1; curr_size > 0; curr_size = reduce_size >> 1) { + reduce_size = curr_size + (reduce_size & 1); + if (ix < curr_size) { + sum_shared[ix] += sum_shared[ix + reduce_size]; + sum_squared_shared[ix] += sum_squared_shared[ix + reduce_size]; + } + workgroupBarrier(); + } + + let sum = sum_shared[0]; + let square_sum = sum_squared_shared[0]; + let mean = ${Ke("sum",$)} / f32(uniforms.hidden_size); + let inv_std_dev = inverseSqrt(${Ke("square_sum",$)} / f32(uniforms.hidden_size) ${o?"":"- mean * mean"} + uniforms.epsilon); + ${_?"mean_output[global_idx] = mean;":""} + ${b?"inv_std_output[global_idx] = inv_std_dev;":""} + + for (var i: u32 = 0; i < stride; i++) { + output[offset + i] = (output[offset + i] ${o?"":`- ${M}(mean)`}) * + ${M}(inv_std_dev) * gamma[offset1d + i] + ${h?"+ beta[offset1d + i]":""}; + } + }`},C=[{dims:d,dataType:e[0].dataType}];return n>1&&C.push({dims:f,dataType:1}),n>2&&C.push({dims:f,dataType:1}),n>3&&C.push({dims:a,dataType:e[0].dataType}),{name:"SkipLayerNormalization",shaderCache:{hint:`${$};${_};${b};${w}`,inputDependencies:e.map((A,k)=>"type")},getShaderSource:T,getRunData:()=>({outputs:C,dispatchGroup:{x:Math.ceil(l/p)},programUniforms:v})}},Tc=(e,t)=>{Ry(e.inputs);let r=[0];e.outputCount>1&&r.push(-3),e.outputCount>2&&r.push(-3),e.outputCount>3&&r.push(3),e.compute(Uy(e.inputs,t,e.outputCount,!1),{outputs:r})}});var Ny,nn,Vy,Ic,Wy,Ly,Ac,kc,Ec=G(()=>{"use strict";te();ae();Ce();ce();Ny=(e,t)=>{if(!e||e.length<1)throw new Error("too few inputs");if(t.axes.length!==0){if(t.axes.length!==t.starts.length||t.axes.length!==t.ends.length)throw new Error("axes, starts and ends must have the same length")}else if(t.starts.length!==t.ends.length)throw new Error("starts and ends must have the same length");e.slice(1).forEach((n,r)=>{if(e[r+1].dataType!==6&&e[r+1].dataType!==7)throw new Error(`Input ${r} must be an array of int32 or int64`)})},nn=(e,t)=>{let n=[];if(e.length>t)if(e[t].dataType===7)e[t].getBigInt64Array().forEach(r=>n.push(Number(r)));else if(e[t].dataType===6)e[t].getInt32Array().forEach(r=>n.push(Number(r)));else throw new Error(`Input ${t} must be an array of int32 or int64`);return n},Vy=(e,t)=>{if(e.length>1){let n=nn(e,1),r=nn(e,2),o=nn(e,3);return o.length===0&&(o=[...Array(e[0].dims.length).keys()]),re({starts:n,ends:r,axes:o})}else return t},Ic=(e,t,n,r,o)=>{let a=e;return e<0&&(a+=n[r[t]]),o[t]<0?Math.max(0,Math.min(a,n[r[t]]-1)):Math.max(0,Math.min(a,n[r[t]]))},Wy=(e,t,n)=>`fn calculateInputIndices(output_indices: ${t.type.indices}) -> ${e.type.indices} { + var input_indices: ${e.type.indices}; + var carry = 0u; + for (var i = ${n.length}; i >= 0; i--) { + let input_shape_i = ${K("uniforms.input_shape","i",n.length)}; + let steps_i = ${K("uniforms.steps","i",n.length)}; + let signs_i = ${K("uniforms.signs","i",n.length)}; + let starts_i = ${K("uniforms.starts","i",n.length)}; + var output_index = ${t.indicesGet("output_indices","i")}; + var input_index = output_index * steps_i + starts_i + carry; + carry = input_index / input_shape_i; + input_index = input_index % input_shape_i; + if (signs_i < 0) { + input_index = input_shape_i - input_index - 1u + starts_i; + } + ${e.indicesSet("input_indices","i","input_index")}; + } + return input_indices; + }`,Ly=(e,t)=>{let n=e[0].dims,r=E.size(n),o=t.axes.length>0?E.normalizeAxes(t.axes,n.length):[...Array(n.length).keys()],a=nn(e,4);a.forEach($=>$!==0||(()=>{throw new Error("step cannot be 0")})),a.length===0&&(a=Array(o.length).fill(1));let s=t.starts.map(($,v)=>Ic($,v,n,o,a)),d=t.ends.map(($,v)=>Ic($,v,n,o,a));if(o.length!==s.length||o.length!==d.length)throw new Error("start, ends and axes should have the same number of elements");if(o.length!==n.length)for(let $=0;$Math.sign($));a.forEach(($,v,T)=>{if($<0){let C=(d[v]-s[v])/$,A=s[v],k=A+C*a[v];s[v]=k,d[v]=A,T[v]=-$}});let p=n.slice(0);o.forEach(($,v)=>{p[$]=Math.ceil((d[$]-s[$])/a[$])});let f={dims:p,dataType:e[0].dataType},h=N("output",e[0].dataType,p.length),y=P("input",e[0].dataType,e[0].dims.length),_=E.size(p),b=[{name:"outputSize",type:"u32"},{name:"starts",type:"u32",length:s.length},{name:"signs",type:"i32",length:l.length},{name:"steps",type:"u32",length:a.length}],w=[{type:12,data:_},{type:12,data:s},{type:6,data:l},{type:12,data:a},...H(e[0].dims,p)],S=$=>` + ${$.registerUniforms(b).declareVariables(y,h)} + ${Wy(y,h,n)} + ${$.mainStart()} + ${$.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + let output_indices = ${h.offsetToIndices("global_idx")}; + let input_indices = calculateInputIndices(output_indices); + ${h.setByOffset("global_idx",y.getByIndices("input_indices"))} + }`;return{name:"Slice",shaderCache:{hint:`${l.length}_${s.length}_${a.length}`,inputDependencies:["rank"]},getShaderSource:S,getRunData:()=>({outputs:[f],dispatchGroup:{x:Math.ceil(r/64)},programUniforms:w})}},Ac=(e,t)=>{Ny(e.inputs,t);let n=Vy(e.inputs,t);e.compute(Ly(e.inputs,n),{inputs:[0]})},kc=e=>{let t=e.starts,n=e.ends,r=e.axes;return re({starts:t,ends:n,axes:r})}});var Gy,Hy,Pc,zc,Oc=G(()=>{"use strict";te();ae();Ce();ct();ce();Gy=e=>{if(!e||e.length!==1)throw new Error("Softmax op requires 1 input.")},Hy=(e,t)=>{let n=e.inputs[0],r=n.dims,o=E.size(r),a=r.length,s=E.normalizeAxis(t.axis,a),d=sM),p[s]=a-1,p[a-1]=s,l=e.compute(Oe(n,p),{inputs:[n],outputs:[-1]})[0]):l=n;let f=l.dims,h=f[a-1],y=o/h,_=ge(h),b=h/_,w=64;y===1&&(w=256);let S=(O,M)=>M===4?`max(max(${O}.x, ${O}.y), max(${O}.z, ${O}.w))`:M===2?`max(${O}.x, ${O}.y)`:M===3?`max(max(${O}.x, ${O}.y), ${O}.z)`:O,$=P("x",l.dataType,l.dims,_),v=N("result",l.dataType,l.dims,_),T=$.type.value,C=_e(l.dataType)==="f32"?`var threadMax = ${T}(-3.402823e+38f);`:`var threadMax = ${T}(-65504.0h);`,A=O=>` + var rowMaxShared : ${T}; + var rowSumShared : ${T}; + var threadShared : array<${T}, ${w}>; + + fn getValue(row: i32, col: i32, row_stride: i32) -> ${T} { + let index = row * row_stride + col; + return x[index]; + } + + fn setValue(row: i32, col: i32, row_stride: i32, value: ${T}) { + let index = row * row_stride + col; + result[index] = value; + } + ${O.registerUniform("packedCols","i32").declareVariables($,v)} + ${O.mainStart(w)} + let gindex = i32(global_idx); + let lindex = i32(local_idx); + const wg = ${w}; + let row = gindex / wg; + let cols = uniforms.packedCols; + let row_stride : i32 = uniforms.packedCols; + + // find the rows max + ${C} + for (var col = lindex; col < cols; col += wg) { + let value = getValue(row, col, row_stride); + threadMax = max(threadMax, value); + } + if (lindex < cols) { + threadShared[lindex] = threadMax; + } + workgroupBarrier(); + + var reduceSize = min(cols, wg); + for (var currSize = reduceSize >> 1; currSize > 0; currSize = reduceSize >> 1) { + reduceSize = currSize + (reduceSize & 1); + if (lindex < currSize) { + threadShared[lindex] = max(threadShared[lindex], threadShared[lindex + reduceSize]); + } + workgroupBarrier(); + } + if (lindex == 0) { + rowMaxShared = ${T}(${S("threadShared[0]",_)}); + } + workgroupBarrier(); + + // find the rows sum + var threadSum = ${T}(0.0); + for (var col = lindex; col < cols; col += wg) { + let subExp = exp(getValue(row, col, row_stride) - rowMaxShared); + threadSum += subExp; + } + threadShared[lindex] = threadSum; + workgroupBarrier(); + + for (var currSize = wg >> 1; currSize > 0; currSize = currSize >> 1) { + if (lindex < currSize) { + threadShared[lindex] = threadShared[lindex] + threadShared[lindex + currSize]; + } + workgroupBarrier(); + } + if (lindex == 0) { + rowSumShared = ${T}(${Ke("threadShared[0]",_)}); + } + workgroupBarrier(); + + // calculate final value for each element in the row + for (var col = lindex; col < cols; col += wg) { + let value = exp(getValue(row, col, row_stride) - rowMaxShared) / rowSumShared; + setValue(row, col, row_stride, value); + } + }`,k=e.compute({name:"Softmax",shaderCache:{hint:`${_};${w}`,inputDependencies:["type"]},getRunData:()=>({outputs:[{dims:f,dataType:l.dataType}],dispatchGroup:{x:y},programUniforms:[{type:6,data:b}]}),getShaderSource:A},{inputs:[l],outputs:[d?-1:0]})[0];d&&e.compute(Oe(k,p),{inputs:[k]})},Pc=(e,t)=>{Gy(e.inputs),Hy(e,t)},zc=e=>re({axis:e.axis})});var Dc,Fy,qy,Ky,Bc,Mc=G(()=>{"use strict";te();ae();ce();Dc=e=>Array.from(e.getBigInt64Array(),Number),Fy=e=>{if(!e||e.length!==2)throw new Error("Tile requires 2 inputs.");if(e[0].dataType!==1&&e[0].dataType!==10&&e[0].dataType!==6&&e[0].dataType!==12)throw new Error("Tile only support float, float16, int32, and uint32 data types");if(e[1].dataType!==7)throw new Error("Tile `repeats` input should be of int64 data type");if(e[1].dims.length!==1)throw new Error("Tile `repeats` input should be 1-D");if(Dc(e[1]).length!==e[0].dims.length)throw new Error("Tile `repeats` input should have same number of elements as rank of input data tensor")},qy=(e,t)=>{let n=[];for(let r=0;r{let n=e[0].dims,r=t??Dc(e[1]),o=qy(n,r),a=E.size(o),s=e[0].dataType,d=P("input",s,n.length),l=N("output",s,o.length),p=f=>` + const inputShape = ${d.indices(...n)}; + ${f.registerUniform("output_size","u32").declareVariables(d,l)} + ${f.mainStart()} + ${f.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let output_indices = ${l.offsetToIndices("global_idx")}; + var input_indices: ${d.type.indices}; + for (var i = 0; i < ${n.length}; i++) { + let input_dim_i = ${d.indicesGet("uniforms.input_shape","i")}; + let input_dim_value = ${l.indicesGet("output_indices","i")} % input_dim_i; + + ${d.indicesSet("input_indices","i","input_dim_value")} + } + ${l.setByOffset("global_idx",d.getByIndices("input_indices"))} + }`;return{name:"Tile",shaderCache:{hint:`${r}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:o,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(a/64)},programUniforms:[{type:12,data:a},...H(e[0].dims,o)]}),getShaderSource:p}},Bc=e=>{Fy(e.inputs),e.compute(Ky(e.inputs),{inputs:[0]})}});var jy,Zy,Rc,Uc=G(()=>{"use strict";te();ae();ce();jy=(e,t,n,r,o)=>{let a=N("output_data",o,n.length,4),s=P("a_data",t[1].dataType,t[1].dims.length,4),d=P("b_data",t[2].dataType,t[2].dims.length,4),l=P("c_data",t[0].dataType,t[0].dims.length,4),p,f=(h,y,_)=>`select(${y}, ${h}, ${_})`;if(!r)p=a.setByOffset("global_idx",f(s.getByOffset("global_idx"),d.getByOffset("global_idx"),l.getByOffset("global_idx")));else{let h=(y,_,b="")=>{let w=`a_data[index_a${_}][component_a${_}]`,S=`b_data[index_b${_}][component_b${_}]`,$=`bool(c_data[index_c${_}] & (0xffu << (component_c${_} * 8)))`;return` + let output_indices${_} = ${a.offsetToIndices(`global_idx * 4u + ${_}u`)}; + let offset_a${_} = ${s.broadcastedIndicesToOffset(`output_indices${_}`,a)}; + let offset_b${_} = ${d.broadcastedIndicesToOffset(`output_indices${_}`,a)}; + let offset_c${_} = ${l.broadcastedIndicesToOffset(`output_indices${_}`,a)}; + let index_a${_} = offset_a${_} / 4u; + let index_b${_} = offset_b${_} / 4u; + let index_c${_} = offset_c${_} / 4u; + let component_a${_} = offset_a${_} % 4u; + let component_b${_} = offset_b${_} % 4u; + let component_c${_} = offset_c${_} % 4u; + ${y}[${_}] = ${b}(${f(w,S,$)}); + `};o===9?p=` + var data = vec4(0); + ${h("data",0,"u32")} + ${h("data",1,"u32")} + ${h("data",2,"u32")} + ${h("data",3,"u32")} + output_data[global_idx] = dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(data));`:p=` + ${h("output_data[global_idx]",0)} + ${h("output_data[global_idx]",1)} + ${h("output_data[global_idx]",2)} + ${h("output_data[global_idx]",3)} + `}return` + ${e.registerUniform("vec_size","u32").declareVariables(l,s,d,a)} + ${e.mainStart()} + ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + ${p} + }`},Zy=e=>{let t=e[1].dims,n=e[2].dims,r=e[0].dims,o=e[1].dataType,a=!(E.areEqual(t,n)&&E.areEqual(n,r)),s=t,d=E.size(t);if(a){let p=rt.calcShape(rt.calcShape(t,n,!1),r,!1);if(!p)throw new Error("Can't perform where op on the given tensors");s=p,d=E.size(s)}let l=Math.ceil(d/4);return{name:"Where",shaderCache:{inputDependencies:["rank","rank","rank"]},getShaderSource:p=>jy(p,e,s,a,o),getRunData:()=>({outputs:[{dims:s,dataType:o}],dispatchGroup:{x:Math.ceil(d/64/4)},programUniforms:[{type:12,data:l},...H(r,t,n,s)]})}},Rc=e=>{e.compute(Zy(e.inputs))}});var Nc,Vc=G(()=>{"use strict";_u();qr();$u();Su();dd();wd();xd();Nd();qd();Zd();Xd();nl();al();ul();cl();fl();yl();wl();xl();Cl();Dl();Rl();Nl();Wl();Hl();So();ql();dc();pc();fc();yc();Hr();$c();Sc();Cc();Ec();Oc();Co();Mc();ct();jr();Uc();Nc=new Map([["Abs",[Tu]],["Acos",[Cu]],["Acosh",[Iu]],["Add",[ld]],["ArgMax",[bu,co]],["ArgMin",[yu,co]],["Asin",[Au]],["Asinh",[ku]],["Atan",[Eu]],["Atanh",[Pu]],["Attention",[wu]],["AveragePool",[ec,Jl]],["BatchNormalization",[vu]],["BiasAdd",[xu]],["BiasSplitGelu",[ud]],["Cast",[Ou,zu]],["Ceil",[Bu]],["Clip",[Du]],["Concat",[vd,$d]],["Conv",[wo,_o]],["ConvTranspose",[Fd,Gd]],["Cos",[Mu]],["Cosh",[Ru]],["CumSum",[Kd,jd]],["DepthToSpace",[Qd,Yd]],["DequantizeLinear",[lc,cc]],["Div",[cd]],["Einsum",[tl,rl]],["Elu",[Uu,tr]],["Equal",[pd]],["Erf",[Nu]],["Exp",[Vu]],["Expand",[il]],["FastGelu",[sl]],["Floor",[Wu]],["FusedConv",[wo,_o]],["Gather",[ll,dl]],["GatherElements",[_l,bl]],["GatherBlockQuantized",[hl,gl]],["GatherND",[pl,ml]],["Gelu",[Lu]],["Gemm",[$l,vl]],["GlobalAveragePool",[nc,rc]],["GlobalMaxPool",[uc,sc]],["Greater",[gd]],["GreaterOrEqual",[bd]],["GridSample",[Sl,Tl]],["GroupQueryAttention",[Ol]],["HardSigmoid",[Qu,Zu]],["InstanceNormalization",[Ml]],["LayerNormalization",[Ul]],["LeakyRelu",[Gu,tr]],["Less",[yd]],["LessOrEqual",[_d]],["Log",[id]],["MatMul",[Vl]],["MatMulNBits",[Ll,Gl]],["MaxPool",[ic,ac]],["Mul",[md]],["MultiHeadAttention",[kl,Al]],["Neg",[Fu]],["Not",[Hu]],["Pad",[Fl]],["Pow",[fd]],["QuickGelu",[ad,tr]],["Range",[mc]],["Reciprocal",[qu]],["ReduceMin",[cu]],["ReduceMean",[au]],["ReduceMax",[lu]],["ReduceSum",[mu]],["ReduceProd",[pu]],["ReduceL1",[su]],["ReduceL2",[uu]],["ReduceLogSum",[hu]],["ReduceLogSumExp",[du]],["ReduceSumSquare",[fu]],["Relu",[Ku]],["Resize",[wc,vc]],["RotaryEmbedding",[xc]],["ScatterND",[gc,hc]],["Sigmoid",[ju]],["Sin",[Yu]],["Sinh",[Xu]],["Slice",[Ac,kc]],["SkipLayerNormalization",[Tc]],["Split",[El,Pl]],["Sqrt",[Ju]],["Softmax",[Pc,zc]],["Sub",[hd]],["Tan",[ed]],["Tanh",[rd]],["ThresholdedRelu",[od,tr]],["Tile",[Bc]],["Transpose",[Ks,js]],["Where",[Rc]]])});var on,Wc=G(()=>{"use strict";Ge();tt();ce();on=class{constructor(t){this.backend=t;this.repo=new Map,this.attributesBound=!1}getArtifact(t){return this.repo.get(t)}setArtifact(t,n){this.repo.set(t,n)}run(t,n,r,o,a){Ne(t.programInfo.name);let s=this.backend.device,d=this.backend.getComputePassEncoder();this.backend.writeTimestamp(this.backend.pendingDispatchNumber*2);let l=[];for(let f of n)l.push({binding:l.length,resource:{buffer:f.buffer}});for(let f of r)l.push({binding:l.length,resource:{buffer:f.buffer}});a&&l.push({binding:l.length,resource:a});let p=s.createBindGroup({layout:t.computePipeline.getBindGroupLayout(0),entries:l,label:t.programInfo.name});if(this.backend.sessionStatus==="capturing"){let f={kernelId:this.backend.currentKernelId,computePipeline:t.computePipeline,bindGroup:p,dispatchGroup:o};this.backend.capturedCommandList.get(this.backend.currentSessionId).push(f)}d.setPipeline(t.computePipeline),d.setBindGroup(0,p),d.dispatchWorkgroups(...o),this.backend.writeTimestamp(this.backend.pendingDispatchNumber*2+1),this.backend.pendingDispatchNumber++,(this.backend.pendingDispatchNumber>=this.backend.maxDispatchNumber||this.backend.queryType==="at-passes")&&this.backend.endComputePass(),this.backend.pendingDispatchNumber>=this.backend.maxDispatchNumber&&this.backend.flush(),Be(t.programInfo.name)}dispose(){}build(t,n){Ne(t.name);let r=this.backend.device,o=[];[{feature:"shader-f16",extension:"f16"},{feature:"subgroups",extension:"subgroups"},{feature:"subgroups-f16",extension:"subgroups_f16"}].forEach(h=>{r.features.has(h.feature)&&o.push(`enable ${h.extension};`)});let s=Fs(n,this.backend.device.limits),d=t.getShaderSource(s),l=`${o.join(` +`)} +${s.additionalImplementations} +${d}`,p=r.createShaderModule({code:l,label:t.name});me("verbose",()=>`[WebGPU] ${t.name} shader code: ${l}`);let f=r.createComputePipeline({compute:{module:p,entryPoint:"main"},layout:"auto",label:t.name});return Be(t.name),{programInfo:t,computePipeline:f,uniformVariablesInfo:s.variablesInfo}}normalizeDispatchGroupSize(t){let n=typeof t=="number"?t:t.x,r=typeof t=="number"?1:t.y||1,o=typeof t=="number"?1:t.z||1,a=this.backend.device.limits.maxComputeWorkgroupsPerDimension;if(n<=a&&r<=a&&o<=a)return[n,r,o];let s=n*r*o,d=Math.ceil(Math.sqrt(s));if(d>a){if(d=Math.ceil(Math.cbrt(s)),d>a)throw new Error("Total dispatch size exceeds WebGPU maximum.");return[d,d,d]}else return[d,d,1]}}});var Qy,Yy,Io,Ao,an,Lc=G(()=>{"use strict";Ge();te();tt();Jn();Ws();Vc();Wc();Qy=(e,t)=>{if(t.length!==e.length)throw new Error(`inputDependencies length ${t.length} is not equal to inputTensors length ${e.length}.`);let n=[];for(let r=0;r{let r=e.name;return e.shaderCache?.hint&&(r+="["+e.shaderCache.hint+"]"),r+=":"+n+`:${Qy(t,e.shaderCache?.inputDependencies??new Array(t.length).fill("dims"))}`,r},Io=class{constructor(t){t&&(this.architecture=t.architecture,this.vendor=t.vendor)}isArchitecture(t){return this.architecture===t}isVendor(t){return this.vendor===t}},Ao=class{constructor(t){this.subgroupsSupported=t.features.has("subgroups"),this.subgroupsF16Supported=t.features.has("subgroups");let n=t.limits;!this.subgroupsSupported||!n.minSubgroupSize||!n.maxSubgroupSize?this.subgroupSizeRange=void 0:this.subgroupSizeRange=[n.minSubgroupSize,n.maxSubgroupSize]}},an=class{constructor(){this.currentSessionId=null;this.currentKernelId=null;this.commandEncoder=null;this.computePassEncoder=null;this.maxDispatchNumber=16;this.pendingDispatchNumber=0;this.pendingKernels=[];this.pendingQueries=new Map;this.sessionStatus="default";this.capturedCommandList=new Map;this.capturedPendingKernels=new Map;this.sessionExternalDataMapping=new Map}get currentKernelCustomData(){if(this.currentKernelId===null)throw new Error("currentKernelCustomData(): currentKernelId is null. (should not happen)");let t=this.kernelCustomData.get(this.currentKernelId);return t||(t={},this.kernelCustomData.set(this.currentKernelId,t)),t}async initialize(t,n){this.env=t;let r=[],o={requiredLimits:{maxComputeWorkgroupStorageSize:n.limits.maxComputeWorkgroupStorageSize,maxComputeWorkgroupsPerDimension:n.limits.maxComputeWorkgroupsPerDimension,maxStorageBufferBindingSize:n.limits.maxStorageBufferBindingSize,maxBufferSize:n.limits.maxBufferSize,maxComputeInvocationsPerWorkgroup:n.limits.maxComputeInvocationsPerWorkgroup,maxComputeWorkgroupSizeX:n.limits.maxComputeWorkgroupSizeX,maxComputeWorkgroupSizeY:n.limits.maxComputeWorkgroupSizeY,maxComputeWorkgroupSizeZ:n.limits.maxComputeWorkgroupSizeZ},requiredFeatures:r},a=s=>n.features.has(s)&&r.push(s)&&!0;a("chromium-experimental-timestamp-query-inside-passes")||a("timestamp-query"),a("shader-f16"),a("subgroups")&&a("subgroups-f16"),this.device=await n.requestDevice(o),this.deviceInfo=new Ao(this.device),this.adapterInfo=new Io(n.info||await n.requestAdapterInfo()),this.gpuDataManager=Vs(this),this.programManager=new on(this),this.kernels=new Map,this.kernelPersistentData=new Map,this.kernelCustomData=new Map,Ur(t.logLevel,!!t.debug),this.device.onuncapturederror=s=>{s.error instanceof GPUValidationError&&console.error(`An uncaught WebGPU validation error was raised: ${s.error.message}`)},Object.defineProperty(this.env.webgpu,"device",{value:this.device,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(this.env.webgpu,"adapter",{value:n,writable:!1,enumerable:!0,configurable:!1}),this.setQueryType()}dispose(){typeof this.querySet<"u"&&this.querySet.destroy(),this.gpuDataManager.dispose()}getCommandEncoder(){return this.commandEncoder||(this.commandEncoder=this.device.createCommandEncoder()),this.commandEncoder}getComputePassEncoder(){if(!this.computePassEncoder){let t=this.getCommandEncoder(),n={};this.queryType==="at-passes"&&(n.timestampWrites={querySet:this.querySet,beginningOfPassWriteIndex:this.pendingDispatchNumber*2,endOfPassWriteIndex:this.pendingDispatchNumber*2+1}),this.computePassEncoder=t.beginComputePass(n)}return this.computePassEncoder}endComputePass(){this.computePassEncoder&&(this.computePassEncoder.end(),this.computePassEncoder=null)}flush(){if(!this.commandEncoder)return;Ne(),this.endComputePass();let t;this.queryType!=="none"&&(this.commandEncoder.resolveQuerySet(this.querySet,0,this.pendingDispatchNumber*2,this.queryResolveBuffer,0),t=this.device.createBuffer({size:this.pendingDispatchNumber*2*8,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),this.pendingQueries.set(t,this.pendingKernels),this.pendingKernels=[],this.commandEncoder.copyBufferToBuffer(this.queryResolveBuffer,0,t,0,this.pendingDispatchNumber*2*8)),this.device.queue.submit([this.commandEncoder.finish()]),this.gpuDataManager.refreshPendingBuffers(),this.commandEncoder=null,this.pendingDispatchNumber=0,this.queryType!=="none"&&t.mapAsync(GPUMapMode.READ).then(()=>{let n=new BigUint64Array(t.getMappedRange()),r=this.pendingQueries.get(t);for(let o=0;o"u"&&(this.queryTimeBase=_);let w=Number(_-this.queryTimeBase),S=Number(b-this.queryTimeBase);if(!Number.isSafeInteger(w)||!Number.isSafeInteger(S))throw new RangeError("incorrect timestamp range");if(this.env.webgpu.profiling?.ondata)this.env.webgpu.profiling.ondata({version:1,inputsMetadata:h.map($=>({dims:$.dims,dataType:_t($.dataType)})),outputsMetadata:y.map($=>({dims:$.dims,dataType:_t($.dataType)})),kernelId:s,kernelType:l,kernelName:p,programName:f,startTime:w,endTime:S});else{let $="";h.forEach((T,C)=>{$+=`input[${C}]: [${T.dims}] | ${_t(T.dataType)}, `});let v="";y.forEach((T,C)=>{v+=`output[${C}]: [${T.dims}] | ${_t(T.dataType)}, `}),console.log(`[profiling] kernel "${s}|${l}|${p}|${f}" ${$}${v}execution time: ${S-w} ns`)}vr("GPU",`${f}::${_}::${b}`)}t.unmap(),this.pendingQueries.delete(t)}),Be()}run(t,n,r,o,a,s){Ne(t.name);let d=[];for(let T=0;TC):r;if(h.length!==l.length)throw new Error(`Output size ${h.length} must be equal to ${l.length}.`);let y=[],_=[];for(let T=0;T=s)throw new Error(`Invalid output index: ${h[T]}`);if(h[T]===-3)continue;let C=h[T]===-1,A=h[T]===-2,k=C||A?a(l[T].dataType,l[T].dims):o(h[T],l[T].dataType,l[T].dims);if(y.push(k),k.data===0)continue;let O=this.gpuDataManager.get(k.data);if(!O)throw new Error(`no GPU data for output: ${k.data}`);if(C&&this.temporaryData.push(O),A){let M=this.kernelPersistentData.get(this.currentKernelId);M||(M=[],this.kernelPersistentData.set(this.currentKernelId,M)),M.push(O)}_.push(O)}if(d.length!==n.length||_.length!==y.length){if(_.length===0)return Be(t.name),y;throw new Error(`Program ${t.name} has zero-sized tensor(s) in inputs or outputs. This is not supported now.`)}let b;if(f){let T=0,C=[];f.forEach(M=>{let V=typeof M.data=="number"?[M.data]:M.data;if(V.length===0)return;let F=M.type===10?2:4,j,ne;M.type===10?(ne=V.length>4?16:V.length>2?8:V.length*F,j=V.length>4?16:F*V.length):(ne=V.length<=2?V.length*F:16,j=16),T=Math.ceil(T/ne)*ne,C.push(T);let W=M.type===10?8:4;T+=V.length>4?Math.ceil(V.length/W)*j:V.length*F});let A=16;T=Math.ceil(T/A)*A;let k=new ArrayBuffer(T);f.forEach((M,V)=>{let F=C[V],j=typeof M.data=="number"?[M.data]:M.data;if(M.type===6)new Int32Array(k,F,j.length).set(j);else if(M.type===12)new Uint32Array(k,F,j.length).set(j);else if(M.type===10)new Uint16Array(k,F,j.length).set(j);else if(M.type===1)new Float32Array(k,F,j.length).set(j);else throw new Error(`Unsupported uniform type: ${_t(M.type)}`)});let O=this.gpuDataManager.create(T,GPUBufferUsage.COPY_DST|GPUBufferUsage.UNIFORM);this.device.queue.writeBuffer(O.buffer,0,k,0,T),this.gpuDataManager.release(O.id),b={offset:0,size:T,buffer:O.buffer}}let w=this.programManager.normalizeDispatchGroupSize(p),S=w[1]===1&&w[2]===1,$=Yy(t,n,S),v=this.programManager.getArtifact($);if(v||(v=this.programManager.build(t,w),this.programManager.setArtifact($,v),me("info",()=>`[artifact] key: ${$}, programName: ${t.name}`)),f&&v.uniformVariablesInfo){if(f.length!==v.uniformVariablesInfo.length)throw new Error(`Uniform variables count mismatch: expect ${v.uniformVariablesInfo.length}, got ${f.length} in program "${v.programInfo.name}".`);for(let T=0;T`[ProgramManager] run "${t.name}" (key=${$}) with ${w[0]}x${w[1]}x${w[2]}`),this.queryType!=="none"||this.sessionStatus==="capturing"){let T={kernelId:this.currentKernelId,programName:v.programInfo.name,inputTensorViews:n,outputTensorViews:y};this.pendingKernels.push(T),this.sessionStatus==="capturing"&&this.capturedPendingKernels.get(this.currentSessionId).push(T)}return this.programManager.run(v,d,_,w,b),Be(t.name),y}upload(t,n){this.gpuDataManager.upload(t,n)}memcpy(t,n){this.gpuDataManager.memcpy(t,n)}async download(t,n){await this.gpuDataManager.download(t,n)}alloc(t){return this.gpuDataManager.create(t).id}free(t){return this.gpuDataManager.release(t)}createKernel(t,n,r,o){let a=Nc.get(t);if(!a)throw new Error(`kernel not implemented: ${t}`);let s={kernelType:t,kernelName:o,kernelEntry:a[0],attributes:[a[1],r]};this.kernels.set(n,s)}releaseKernel(t){let n=this.kernelPersistentData.get(t);if(n){for(let r of n)this.gpuDataManager.release(r.id);this.kernelPersistentData.delete(t)}this.kernelCustomData.delete(t),this.kernels.delete(t)}computeKernel(t,n,r){let o=this.kernels.get(t);if(!o)throw new Error(`kernel not created: ${t}`);let a=o.kernelType,s=o.kernelName,d=o.kernelEntry,l=o.attributes;if(this.currentKernelId!==null)throw new Error(`kernel "[${a}] ${s}" is not allowed to be called recursively`);this.currentKernelId=t,l[0]&&(l[1]=l[0](l[1]),l[0]=void 0),me("info",()=>`[WebGPU] Start to run kernel "[${a}] ${s}"...`);let p=this.env.debug;this.temporaryData=[];try{return p&&this.device.pushErrorScope("validation"),d(n,l[1]),0}catch(f){return r.push(Promise.resolve(`[WebGPU] Kernel "[${a}] ${s}" failed. ${f}`)),1}finally{p&&r.push(this.device.popErrorScope().then(f=>f?`GPU validation error for kernel "[${a}] ${s}": ${f.message}`:null));for(let f of this.temporaryData)this.gpuDataManager.release(f.id);this.temporaryData=[],this.currentKernelId=null}}registerBuffer(t,n,r,o){let a=this.sessionExternalDataMapping.get(t);a||(a=new Map,this.sessionExternalDataMapping.set(t,a));let s=a.get(n),d=this.gpuDataManager.registerExternalBuffer(r,o,s);return a.set(n,[d,r]),d}unregisterBuffers(t){let n=this.sessionExternalDataMapping.get(t);n&&(n.forEach(r=>this.gpuDataManager.unregisterExternalBuffer(r[0])),this.sessionExternalDataMapping.delete(t))}getBuffer(t){let n=this.gpuDataManager.get(t);if(!n)throw new Error(`no GPU data for buffer: ${t}`);return n.buffer}createDownloader(t,n,r){return async()=>{let o=await no(this,t,n);return Nr(o.buffer,r)}}writeTimestamp(t){this.queryType==="inside-passes"&&this.computePassEncoder.writeTimestamp(this.querySet,t)}setQueryType(){this.queryType="none",(this.env.webgpu.profiling?.mode==="default"||(typeof this.env.trace>"u"?this.env.wasm.trace:this.env.trace))&&(this.device.features.has("chromium-experimental-timestamp-query-inside-passes")?this.queryType="inside-passes":this.device.features.has("timestamp-query")&&(this.queryType="at-passes"),this.queryType!=="none"&&typeof this.querySet>"u"&&(this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxDispatchNumber*2}),this.queryResolveBuffer=this.device.createBuffer({size:this.maxDispatchNumber*2*8,usage:GPUBufferUsage.COPY_SRC|GPUBufferUsage.QUERY_RESOLVE})))}captureBegin(){me("info","captureBegin"),this.capturedCommandList.get(this.currentSessionId)||this.capturedCommandList.set(this.currentSessionId,[]),this.capturedPendingKernels.get(this.currentSessionId)||this.capturedPendingKernels.set(this.currentSessionId,[]),this.flush(),this.sessionStatus="capturing"}captureEnd(){me("info","captureEnd"),this.flush(),this.sessionStatus="default"}replay(){me("info","replay"),this.sessionStatus="replaying";let t=this.capturedCommandList.get(this.currentSessionId),n=this.capturedPendingKernels.get(this.currentSessionId),r=t.length;this.pendingKernels=[];for(let o=0;o=this.maxDispatchNumber||this.queryType==="at-passes")&&this.endComputePass(),this.pendingDispatchNumber>=this.maxDispatchNumber&&this.flush()}this.flush(),this.sessionStatus="default"}onCreateSession(){this.gpuDataManager.onCreateSession()}onReleaseSession(t){this.unregisterBuffers(t),this.capturedCommandList.has(t)&&this.capturedCommandList.delete(t),this.capturedPendingKernels.has(t)&&this.capturedPendingKernels.delete(t),this.gpuDataManager.onReleaseSession(t)}onRunStart(t){this.currentSessionId=t,this.setQueryType()}}});var Xy,Gc,Jy,Hc,sn,un,ko,Fc,qc=G(()=>{"use strict";tt();Xy=1,Gc=()=>Xy++,Jy=new Map([["float32",32],["float16",16],["int32",32],["uint32",32],["int64",64],["uint64",64],["int8",8],["uint8",8],["int4",4],["uint4",4]]),Hc=(e,t)=>{let n=Jy.get(e);if(!n)throw new Error("Unsupported data type.");return t.length>0?Math.ceil(t.reduce((r,o)=>r*o)*n/8):0},sn=class{constructor(t){this.sessionId=t.sessionId,this.mlContext=t.context,this.mlTensor=t.tensor,this.dataType=t.dataType,this.tensorShape=t.shape}get tensor(){return this.mlTensor}get type(){return this.dataType}get shape(){return this.tensorShape}get byteLength(){return Hc(this.dataType,this.tensorShape)}destroy(){me("verbose",()=>"[WebNN] TensorWrapper.destroy"),this.mlTensor.destroy()}write(t){this.mlContext.writeTensor(this.mlTensor,t)}async read(t){return t?this.mlContext.readTensor(this.mlTensor,t):this.mlContext.readTensor(this.mlTensor)}canReuseTensor(t,n,r){return this.mlContext===t&&this.dataType===n&&this.tensorShape.length===r.length&&this.tensorShape.every((o,a)=>o===r[a])}},un=class{constructor(t,n){this.tensorManager=t;this.wrapper=n}get tensorWrapper(){return this.wrapper}releaseTensor(){this.tensorWrapper&&(this.tensorManager.releaseTensor(this.tensorWrapper),this.wrapper=void 0)}async ensureTensor(t,n,r,o){let a=this.tensorManager.getMLContext(t);if(this.wrapper){if(this.wrapper.canReuseTensor(a,n,r))return this.wrapper.tensor;if(o){if(this.wrapper.byteLength!==Hc(n,r))throw new Error("Unable to copy data to tensor with different size.");this.activeUpload=new Uint8Array(await this.wrapper.read())}this.tensorManager.releaseTensor(this.wrapper)}let s=typeof MLTensorUsage>"u"?void 0:MLTensorUsage.READ|MLTensorUsage.WRITE;return this.wrapper=await this.tensorManager.getCachedTensor(t,n,r,s,!0,!0),o&&this.activeUpload&&(this.wrapper.write(this.activeUpload),this.activeUpload=void 0),this.wrapper.tensor}upload(t){if(this.wrapper)if(t.byteLength===this.wrapper.byteLength){this.wrapper.write(t);return}else me("verbose",()=>"Data size does not match tensor size. Releasing tensor."),this.releaseTensor();this.activeUpload?this.activeUpload.set(t):this.activeUpload=new Uint8Array(t)}async download(t){if(this.activeUpload)if(t){t instanceof ArrayBuffer?new Uint8Array(t).set(this.activeUpload):new Uint8Array(t.buffer,t.byteOffset,t.byteLength).set(this.activeUpload);return}else return this.activeUpload.buffer;if(!this.wrapper)throw new Error("Tensor has not been created.");return t?this.wrapper.read(t):this.wrapper.read()}},ko=class{constructor(t){this.backend=t;this.tensorTrackersById=new Map;this.freeTensors=[];this.externalTensors=new Set}getMLContext(t){let n=this.backend.getMLContext(t);if(!n)throw new Error("MLContext not found for session.");return n}reserveTensorId(){let t=Gc();return this.tensorTrackersById.set(t,new un(this)),t}releaseTensorId(t){let n=this.tensorTrackersById.get(t);n&&(this.tensorTrackersById.delete(t),n.tensorWrapper&&this.releaseTensor(n.tensorWrapper))}async ensureTensor(t,n,r,o,a){me("verbose",()=>`[WebNN] TensorManager.ensureTensor {tensorId: ${n}, dataType: ${r}, shape: ${o}, copyOld: ${a}}`);let s=this.tensorTrackersById.get(n);if(!s)throw new Error("Tensor not found.");return s.ensureTensor(t,r,o,a)}upload(t,n){let r=this.tensorTrackersById.get(t);if(!r)throw new Error("Tensor not found.");r.upload(n)}async download(t,n){me("verbose",()=>`[WebNN] TensorManager.download {tensorId: ${t}, dstBuffer: ${n?.byteLength}}`);let r=this.tensorTrackersById.get(t);if(!r)throw new Error("Tensor not found.");return r.download(n)}releaseTensorsForSession(t){for(let n of this.freeTensors)n.sessionId===t&&n.destroy();this.freeTensors=this.freeTensors.filter(n=>n.sessionId!==t)}registerTensor(t,n,r,o){let a=this.getMLContext(t),s=Gc(),d=new sn({sessionId:t,context:a,tensor:n,dataType:r,shape:o});return this.tensorTrackersById.set(s,new un(this,d)),this.externalTensors.add(d),s}async getCachedTensor(t,n,r,o,a,s){let d=this.getMLContext(t);for(let[p,f]of this.freeTensors.entries())if(f.canReuseTensor(d,n,r)){me("verbose",()=>`[WebNN] Reusing tensor {dataType: ${n}, shape: ${r}}`);let h=this.freeTensors.splice(p,1)[0];return h.sessionId=t,h}me("verbose",()=>`[WebNN] MLContext.createTensor {dataType: ${n}, shape: ${r}}`);let l=await d.createTensor({dataType:n,shape:r,dimensions:r,usage:o,writable:a,readable:s});return new sn({sessionId:t,context:d,tensor:l,dataType:n,shape:r})}releaseTensor(t){this.externalTensors.has(t)&&this.externalTensors.delete(t),this.freeTensors.push(t)}},Fc=(...e)=>new ko(...e)});var Eo,eb,dn,Kc=G(()=>{"use strict";te();bt();Jn();qc();tt();Eo=new Map([[1,"float32"],[10,"float16"],[6,"int32"],[12,"uint32"],[7,"int64"],[13,"uint64"],[22,"int4"],[21,"uint4"],[3,"int8"],[2,"uint8"],[9,"uint8"]]),eb=(e,t)=>{if(e===t)return!0;if(e===void 0||t===void 0)return!1;let n=Object.keys(e).sort(),r=Object.keys(t).sort();return n.length===r.length&&n.every((o,a)=>o===r[a]&&e[o]===t[o])},dn=class{constructor(t){this.tensorManager=Fc(this);this.mlContextBySessionId=new Map;this.sessionIdsByMLContext=new Map;this.mlContextCache=[];this.sessionGraphInputs=new Map;this.temporaryGraphInputs=[];this.temporarySessionTensorIds=new Map;Ur(t.logLevel,!!t.debug)}get currentSessionId(){if(this.activeSessionId===void 0)throw new Error("No active session");return this.activeSessionId}onRunStart(t){me("verbose",()=>`[WebNN] onRunStart {sessionId: ${t}}`),this.activeSessionId=t}onRunEnd(t){me("verbose",()=>`[WebNN] onRunEnd {sessionId: ${t}}`);let n=this.temporarySessionTensorIds.get(t);if(n){for(let r of n)me("verbose",()=>`[WebNN] releasing temporary tensor {tensorId: ${r}}`),this.tensorManager.releaseTensorId(r);this.temporarySessionTensorIds.delete(t),this.activeSessionId=void 0}}async createMLContext(t){if(t instanceof GPUDevice){let r=this.mlContextCache.findIndex(o=>o.gpuDevice===t);if(r!==-1)return this.mlContextCache[r].mlContext;{let o=await navigator.ml.createContext(t);return this.mlContextCache.push({gpuDevice:t,mlContext:o}),o}}else if(t===void 0){let r=this.mlContextCache.findIndex(o=>o.options===void 0&&o.gpuDevice===void 0);if(r!==-1)return this.mlContextCache[r].mlContext;{let o=await navigator.ml.createContext();return this.mlContextCache.push({mlContext:o}),o}}let n=this.mlContextCache.findIndex(r=>eb(r.options,t));if(n!==-1)return this.mlContextCache[n].mlContext;{let r=await navigator.ml.createContext(t);return this.mlContextCache.push({options:t,mlContext:r}),r}}registerMLContext(t,n){this.mlContextBySessionId.set(t,n);let r=this.sessionIdsByMLContext.get(n);r||(r=new Set,this.sessionIdsByMLContext.set(n,r)),r.add(t),this.temporaryGraphInputs.length>0&&(this.sessionGraphInputs.set(t,this.temporaryGraphInputs),this.temporaryGraphInputs=[])}onReleaseSession(t){this.sessionGraphInputs.delete(t);let n=this.mlContextBySessionId.get(t);if(!n)return;this.tensorManager.releaseTensorsForSession(t),this.mlContextBySessionId.delete(t);let r=this.sessionIdsByMLContext.get(n);if(r.delete(t),r.size===0){this.sessionIdsByMLContext.delete(n);let o=this.mlContextCache.findIndex(a=>a.mlContext===n);o!==-1&&this.mlContextCache.splice(o,1)}}getMLContext(t){return this.mlContextBySessionId.get(t)}reserveTensorId(){return this.tensorManager.reserveTensorId()}releaseTensorId(t){me("verbose",()=>`[WebNN] releaseTensorId {tensorId: ${t}}`),this.tensorManager.releaseTensorId(t)}async ensureTensor(t,n,r,o,a){let s=Eo.get(r);if(!s)throw new Error(`Unsupported ONNX data type: ${r}`);return this.tensorManager.ensureTensor(t??this.currentSessionId,n,s,o,a)}async createTemporaryTensor(t,n,r){me("verbose",()=>`[WebNN] createTemporaryTensor {onnxDataType: ${n}, shape: ${r}}`);let o=Eo.get(n);if(!o)throw new Error(`Unsupported ONNX data type: ${n}`);let a=this.tensorManager.reserveTensorId();await this.tensorManager.ensureTensor(t,a,o,r,!1);let s=this.temporarySessionTensorIds.get(t);return s?s.push(a):this.temporarySessionTensorIds.set(t,[a]),a}uploadTensor(t,n){if(!Ie().shouldTransferToMLTensor)throw new Error("Trying to upload to a MLTensor while shouldTransferToMLTensor is false");me("verbose",()=>`[WebNN] uploadTensor {tensorId: ${t}, data: ${n.byteLength}}`),this.tensorManager.upload(t,n)}async downloadTensor(t,n){return this.tensorManager.download(t,n)}createMLTensorDownloader(t,n){return async()=>{let r=await this.tensorManager.download(t);return Nr(r,n)}}registerMLTensor(t,n,r,o){let a=Eo.get(r);if(!a)throw new Error(`Unsupported ONNX data type: ${r}`);let s=this.tensorManager.registerTensor(t,n,a,o);return me("verbose",()=>`[WebNN] registerMLTensor {tensor: ${n}, dataType: ${a}, dimensions: ${o}} -> {tensorId: ${s}}`),s}registerMLConstant(t,n,r,o,a,s){if(!s)throw new Error("External mounted files are not available.");let d=t;t.startsWith("./")&&(d=t.substring(2));let l=s.get(d);if(!l)throw new Error(`File with name ${d} not found in preloaded files.`);if(n+r>l.byteLength)throw new Error("Out of bounds: data offset and length exceed the external file data size.");let p=l.slice(n,n+r).buffer,f;switch(a.dataType){case"float32":f=new Float32Array(p);break;case"float16":f=new Uint16Array(p);break;case"int32":f=new Int32Array(p);break;case"uint32":f=new Uint32Array(p);break;case"int64":f=new BigInt64Array(p);break;case"uint64":f=new BigUint64Array(p);break;case"int8":f=new Int8Array(p);break;case"int4":case"uint4":case"uint8":f=new Uint8Array(p);break;default:throw new Error(`Unsupported data type: ${a.dataType} in creating WebNN Constant from external data.`)}return me("verbose",()=>`[WebNN] registerMLConstant {dataType: ${a.dataType}, shape: ${a.shape}}}`),o.constant(a,f)}registerGraphInput(t){this.temporaryGraphInputs.push(t)}isGraphInput(t,n){let r=this.sessionGraphInputs.get(t);return r?r.includes(n):!1}flush(){}}});var jc={};Zt(jc,{init:()=>tb});var ir,Po,tb,Zc=G(()=>{"use strict";te();Lc();tt();ae();Kc();ir=class e{constructor(t,n,r,o){this.module=t;this.dataType=n;this.data=r;this.dims=o}getFloat32Array(){if(this.dataType!==1)throw new Error("Invalid data type");let t=E.size(this.dims);return t===0?new Float32Array:new Float32Array(this.module.HEAP8.buffer,this.data,t)}getBigInt64Array(){if(this.dataType!==7)throw new Error("Invalid data type");let t=E.size(this.dims);return t===0?new BigInt64Array:new BigInt64Array(this.module.HEAP8.buffer,this.data,t)}getInt32Array(){if(this.dataType!==6)throw new Error("Invalid data type");let t=E.size(this.dims);return t===0?new Int32Array:new Int32Array(this.module.HEAP8.buffer,this.data,t)}getUint16Array(){if(this.dataType!==10&&this.dataType!==4)throw new Error("Invalid data type");let t=E.size(this.dims);return t===0?new Uint16Array:new Uint16Array(this.module.HEAP8.buffer,this.data,t)}reshape(t){if(E.size(t)!==E.size(this.dims))throw new Error("Invalid new shape");return new e(this.module,this.dataType,this.data,t)}},Po=class{constructor(t,n,r){this.module=t;this.backend=n;this.customDataOffset=0;this.customDataSize=0;this.adapterInfo=n.adapterInfo,this.deviceInfo=n.deviceInfo;let o=t.PTR_SIZE,a=r/t.PTR_SIZE,s=o===4?"i32":"i64";this.opKernelContext=Number(t.getValue(o*a++,s));let d=Number(t.getValue(o*a++,s));this.outputCount=Number(t.getValue(o*a++,s)),this.customDataOffset=Number(t.getValue(o*a++,"*")),this.customDataSize=Number(t.getValue(o*a++,s));let l=[];for(let p=0;ptypeof d=="number"?this.inputs[d]:d)??this.inputs,o=n?.outputs??[],a=(d,l,p)=>new ir(this.module,l,this.output(d,p),p),s=(d,l)=>{let p=wt(d,l);if(!p)throw new Error(`Unsupported data type: ${d}`);let f=p>0?this.backend.gpuDataManager.create(p).id:0;return new ir(this.module,d,f,l)};return this.backend.run(t,r,o,a,s,this.outputCount)}output(t,n){let r=this.module.stackSave();try{let o=this.module.PTR_SIZE,a=o===4?"i32":"i64",s=this.module.stackAlloc((1+n.length)*o);this.module.setValue(s,n.length,a);for(let d=0;d{let o=t.jsepInit;if(!o)throw new Error("Failed to initialize JSEP. The WebAssembly module is not built with JSEP support.");if(e==="webgpu"){let a=new an;await a.initialize(n,r),o("webgpu",[a,s=>a.alloc(Number(s)),s=>a.free(s),(s,d,l,p=!1)=>{if(p)me("verbose",()=>`[WebGPU] jsepCopyGpuToGpu: src=${Number(s)}, dst=${Number(d)}, size=${Number(l)}`),a.memcpy(Number(s),Number(d));else{me("verbose",()=>`[WebGPU] jsepCopyCpuToGpu: dataOffset=${Number(s)}, gpuDataId=${Number(d)}, size=${Number(l)}`);let f=t.HEAPU8.subarray(Number(s>>>0),Number(s>>>0)+Number(l));a.upload(Number(d),f)}},async(s,d,l)=>{me("verbose",()=>`[WebGPU] jsepCopyGpuToCpu: gpuDataId=${s}, dataOffset=${d}, size=${l}`),await a.download(Number(s),()=>t.HEAPU8.subarray(Number(d)>>>0,Number(d+l)>>>0))},(s,d,l)=>a.createKernel(s,Number(d),l,t.UTF8ToString(t._JsepGetNodeName(Number(d)))),s=>a.releaseKernel(s),(s,d,l,p)=>{me("verbose",()=>`[WebGPU] jsepRun: sessionHandle=${l}, kernel=${s}, contextDataOffset=${d}`);let f=new Po(t,a,Number(d));return a.computeKernel(Number(s),f,p)},()=>a.captureBegin(),()=>a.captureEnd(),()=>a.replay()])}else{let a=new dn(n);o("webnn",[a,()=>a.reserveTensorId(),s=>a.releaseTensorId(s),async(s,d,l,p,f)=>a.ensureTensor(s,d,l,p,f),(s,d)=>{a.uploadTensor(s,d)},async(s,d)=>a.downloadTensor(s,d)])}}});var rb,Cr,Ir,zt,nb,Yt,Ar,kr,Qc,Er,Pr,zr,qn=G(()=>{"use strict";zs();Ds();te();bt();Dr();Xn();rb=(e,t)=>{Ie()._OrtInit(e,t)!==0&&he("Can't initialize onnxruntime.")},Cr=async e=>{rb(e.wasm.numThreads,Jt(e.logLevel))},Ir=async(e,t)=>{{let n=(Zc(),br(jc)).init;if(t==="webgpu"){if(typeof navigator>"u"||!navigator.gpu)throw new Error("WebGPU is not supported in current environment");let r=e.webgpu.adapter;if(r){if(typeof r.limits!="object"||typeof r.features!="object"||typeof r.requestDevice!="function")throw new Error("Invalid GPU adapter set in `env.webgpu.adapter`. It must be a GPUAdapter object.")}else{let o=e.webgpu.powerPreference;if(o!==void 0&&o!=="low-power"&&o!=="high-performance")throw new Error(`Invalid powerPreference setting: "${o}"`);let a=e.webgpu.forceFallbackAdapter;if(a!==void 0&&typeof a!="boolean")throw new Error(`Invalid forceFallbackAdapter setting: "${a}"`);if(r=await navigator.gpu.requestAdapter({powerPreference:o,forceFallbackAdapter:a}),!r)throw new Error('Failed to get GPU adapter. You may need to enable flag "--enable-unsafe-webgpu" if you are using Chrome.')}await n("webgpu",Ie(),e,r)}if(t==="webnn"){if(typeof navigator>"u"||!navigator.ml)throw new Error("WebNN is not supported in current environment");await n("webnn",Ie(),e)}}},zt=new Map,nb=e=>{let t=Ie(),n=t.stackSave();try{let r=t.PTR_SIZE,o=t.stackAlloc(2*r);t._OrtGetInputOutputCount(e,o,o+r)!==0&&he("Can't get session input/output count.");let s=r===4?"i32":"i64";return[Number(t.getValue(o,s)),Number(t.getValue(o+r,s))]}finally{t.stackRestore(n)}},Yt=e=>{let t=Ie(),n=t._malloc(e.byteLength);if(n===0)throw new Error(`Can't create a session. failed to allocate a buffer of size ${e.byteLength}.`);return t.HEAPU8.set(e,n),[n,e.byteLength]},Ar=async(e,t)=>{let n,r,o=Ie();Array.isArray(e)?[n,r]=e:e.buffer===o.HEAPU8.buffer?[n,r]=[e.byteOffset,e.byteLength]:[n,r]=Yt(e);let a=0,s=0,d=0,l=[],p=[],f=[];try{if([s,l]=Os(t),t?.externalData&&o.mountExternalData){let v=[];for(let T of t.externalData){let C=typeof T=="string"?T:T.path;v.push(er(typeof T=="string"?T:T.data).then(A=>{o.mountExternalData(C,A)}))}await Promise.all(v)}for(let v of t?.executionProviders??[])if((typeof v=="string"?v:v.name)==="webnn"){if(o.shouldTransferToMLTensor=!1,typeof v!="string"){let C=v,A=C?.context,k=C?.gpuDevice,O=C?.deviceType,M=C?.powerPreference;A?o.currentContext=A:k?o.currentContext=await o.jsepCreateMLContext(k):o.currentContext=await o.jsepCreateMLContext({deviceType:O,powerPreference:M})}else o.currentContext=await o.jsepCreateMLContext();break}a=await o._OrtCreateSession(n,r,s),a===0&&he("Can't create a session."),o.jsepOnCreateSession?.(),o.currentContext&&(o.jsepRegisterMLContext(a,o.currentContext),o.currentContext=void 0,o.shouldTransferToMLTensor=!0);let[h,y]=nb(a),_=!!t?.enableGraphCapture,b=[],w=[],S=[];for(let v=0;vv==="gpu-buffer"||v==="ml-tensor")&&(d=o._OrtCreateBinding(a),d===0&&he("Can't create IO binding."),$={handle:d,outputPreferredLocations:S,outputPreferredLocationsEncoded:S.map(v=>Yn(v))}),zt.set(a,[a,p,f,$,_,!1]),[a,b,w]}catch(h){throw p.forEach(y=>o._OrtFree(y)),f.forEach(y=>o._OrtFree(y)),d!==0&&o._OrtReleaseBinding(d)!==0&&he("Can't release IO binding."),a!==0&&o._OrtReleaseSession(a)!==0&&he("Can't release session."),h}finally{o._free(n),s!==0&&o._OrtReleaseSessionOptions(s)!==0&&he("Can't release session options."),l.forEach(h=>o._free(h)),o.unmountExternalData?.()}},kr=e=>{let t=Ie(),n=zt.get(e);if(!n)throw new Error(`cannot release session. invalid session id: ${e}`);let[r,o,a,s,d]=n;s&&(d&&t._OrtClearBoundOutputs(s.handle)!==0&&he("Can't clear bound outputs."),t._OrtReleaseBinding(s.handle)!==0&&he("Can't release IO binding.")),t.jsepOnReleaseSession?.(e),o.forEach(l=>t._OrtFree(l)),a.forEach(l=>t._OrtFree(l)),t._OrtReleaseSession(r)!==0&&he("Can't release session."),zt.delete(e)},Qc=async(e,t,n,r,o,a=!1)=>{if(!e){t.push(0);return}let s=Ie(),d=s.PTR_SIZE,l=e[0],p=e[1],f=e[3],h=f,y,_;if(l==="string"&&(f==="gpu-buffer"||f==="ml-tensor"))throw new Error("String tensor is not supported on GPU.");if(a&&f!=="gpu-buffer")throw new Error(`External buffer must be provided for input/output index ${o} when enableGraphCapture is true.`);if(f==="gpu-buffer"){let S=e[2].gpuBuffer;_=wt(Rt(l),p);let $=s.jsepRegisterBuffer;if(!$)throw new Error('Tensor location "gpu-buffer" is not supported without using WebGPU.');y=$(r,o,S,_)}else if(f==="ml-tensor"){let S=e[2].mlTensor;_=wt(Rt(l),p);let $=s.jsepRegisterMLTensor;if(!$)throw new Error('Tensor location "ml-tensor" is not supported without using WebNN.');y=$(r,S,Rt(l),p)}else{let S=e[2];if(Array.isArray(S)){_=d*S.length,y=s._malloc(_),n.push(y);for(let $=0;$s.setValue(w+v*d,$,d===4?"i32":"i64"));let S=s._OrtCreateTensor(Rt(l),y,_,w,p.length,Yn(h));S===0&&he(`Can't create tensor for input/output. session=${r}, index=${o}.`),t.push(S)}finally{s.stackRestore(b)}},Er=async(e,t,n,r,o,a)=>{let s=Ie(),d=s.PTR_SIZE,l=zt.get(e);if(!l)throw new Error(`cannot run inference. invalid session id: ${e}`);let p=l[0],f=l[1],h=l[2],y=l[3],_=l[4],b=l[5],w=t.length,S=r.length,$=0,v=[],T=[],C=[],A=[],k=s.stackSave(),O=s.stackAlloc(w*d),M=s.stackAlloc(w*d),V=s.stackAlloc(S*d),F=s.stackAlloc(S*d);try{[$,v]=Ps(a);for(let W=0;Wxe*be,1);le=_t(Se);let Fe=y?.outputPreferredLocations[r[W]];if(le==="string"){if(Fe==="gpu-buffer"||Fe==="ml-tensor")throw new Error("String tensor is not supported on GPU.");let xe=[];for(let be=0;be0){let xe=s.jsepGetBuffer;if(!xe)throw new Error('preferredLocation "gpu-buffer" is not supported without using WebGPU.');let be=xe(Z),Ye=wt(Se,fe);if(Ye===void 0||!Mr(le))throw new Error(`Unsupported data type: ${le}`);ee=!0,ne.push([le,Y,{gpuBuffer:be,download:s.jsepCreateDownloader(be,Ye,le),dispose:()=>{s._OrtReleaseTensor(J)!==0&&he("Can't release tensor.")}},"gpu-buffer"])}else if(Fe==="ml-tensor"&&fe>0){let xe=s.jsepEnsureTensor;if(!xe)throw new Error('preferredLocation "ml-tensor" is not supported without using WebNN.');if(wt(Se,fe)===void 0||!Rr(le))throw new Error(`Unsupported data type: ${le}`);let Ye=await xe(e,Z,Se,Y,!1);ee=!0,ne.push([le,Y,{mlTensor:Ye,download:s.jsepCreateMLTensorDownloader(Z,le),dispose:()=>{s.jsepReleaseTensorId(Z),s._OrtReleaseTensor(J)}},"ml-tensor"])}else{let xe=Br(le),be=new xe(fe);new Uint8Array(be.buffer,be.byteOffset,be.byteLength).set(s.HEAPU8.subarray(Z,Z+be.byteLength)),ne.push([le,Y,be,"cpu"])}}finally{s.stackRestore(ve),le==="string"&&Z&&s._free(Z),ee||s._OrtReleaseTensor(J),s.jsepOnRunEnd?.(p)}}return y&&!_&&(s._OrtClearBoundOutputs(y.handle)!==0&&he("Can't clear bound outputs."),zt.set(e,[p,f,h,y,_,!1])),ne}finally{s.stackRestore(k),T.forEach(j=>s._OrtReleaseTensor(j)),C.forEach(j=>s._OrtReleaseTensor(j)),A.forEach(j=>s._free(j)),$!==0&&s._OrtReleaseRunOptions($),v.forEach(j=>s._free(j))}},Pr=e=>{let t=Ie(),n=zt.get(e);if(!n)throw new Error("invalid session id");let r=n[0],o=t._OrtEndProfiling(r);o===0&&he("Can't get an profile file name."),t._OrtFree(o)},zr=e=>{let t=[];for(let n of e){let r=n[2];!Array.isArray(r)&&"buffer"in r&&t.push(r.buffer)}return t}});var Ot,He,ar,cn,pn,ln,zo,Oo,Wt,Lt,ib,Yc,Xc,Jc,ep,tp,rp,np,Do=G(()=>{"use strict";Ge();qn();bt();Sr();Ot=()=>!!we.wasm.proxy&&typeof document<"u",ar=!1,cn=!1,pn=!1,Oo=new Map,Wt=(e,t)=>{let n=Oo.get(e);n?n.push(t):Oo.set(e,[t])},Lt=()=>{if(ar||!cn||pn||!He)throw new Error("worker not ready")},ib=e=>{switch(e.data.type){case"init-wasm":ar=!1,e.data.err?(pn=!0,zo[1](e.data.err)):(cn=!0,zo[0]()),ln&&(URL.revokeObjectURL(ln),ln=void 0);break;case"init-ep":case"copy-from":case"create":case"release":case"run":case"end-profiling":{let t=Oo.get(e.data.type);e.data.err?t.shift()[1](e.data.err):t.shift()[0](e.data.out);break}default:}},Yc=async()=>{if(!cn){if(ar)throw new Error("multiple calls to 'initWasm()' detected.");if(pn)throw new Error("previous call to 'initWasm()' failed.");if(ar=!0,Ot())return new Promise((e,t)=>{He?.terminate(),As().then(([n,r])=>{try{He=r,He.onerror=a=>t(a),He.onmessage=ib,zo=[e,t];let o={type:"init-wasm",in:we};!o.in.wasm.wasmPaths&&(n||import.meta.url?.startsWith("file:"))&&(o.in.wasm.wasmPaths={wasm:new URL("ort-wasm-simd-threaded.jsep.wasm",import.meta.url).href}),He.postMessage(o),ln=n}catch(o){t(o)}},t)});try{await Tr(we.wasm),await Cr(we),cn=!0}catch(e){throw pn=!0,e}finally{ar=!1}}},Xc=async e=>{if(Ot())return Lt(),new Promise((t,n)=>{Wt("init-ep",[t,n]);let r={type:"init-ep",in:{epName:e,env:we}};He.postMessage(r)});await Ir(we,e)},Jc=async e=>Ot()?(Lt(),new Promise((t,n)=>{Wt("copy-from",[t,n]);let r={type:"copy-from",in:{buffer:e}};He.postMessage(r,[e.buffer])})):Yt(e),ep=async(e,t)=>{if(Ot()){if(t?.preferredOutputLocation)throw new Error('session option "preferredOutputLocation" is not supported for proxy.');return Lt(),new Promise((n,r)=>{Wt("create",[n,r]);let o={type:"create",in:{model:e,options:{...t}}},a=[];e instanceof Uint8Array&&a.push(e.buffer),He.postMessage(o,a)})}else return Ar(e,t)},tp=async e=>{if(Ot())return Lt(),new Promise((t,n)=>{Wt("release",[t,n]);let r={type:"release",in:e};He.postMessage(r)});kr(e)},rp=async(e,t,n,r,o,a)=>{if(Ot()){if(n.some(s=>s[3]!=="cpu"))throw new Error("input tensor on GPU is not supported for proxy.");if(o.some(s=>s))throw new Error("pre-allocated output tensor is not supported for proxy.");return Lt(),new Promise((s,d)=>{Wt("run",[s,d]);let l=n,p={type:"run",in:{sessionId:e,inputIndices:t,inputs:l,outputIndices:r,options:a}};He.postMessage(p,zr(l))})}else return Er(e,t,n,r,o,a)},np=async e=>{if(Ot())return Lt(),new Promise((t,n)=>{Wt("end-profiling",[t,n]);let r={type:"end-profiling",in:e};He.postMessage(r)});Pr(e)}});var op,ab,mn,ip=G(()=>{"use strict";Ge();Do();te();xr();Xn();op=(e,t)=>{switch(e.location){case"cpu":return[e.type,e.dims,e.data,"cpu"];case"gpu-buffer":return[e.type,e.dims,{gpuBuffer:e.gpuBuffer},"gpu-buffer"];case"ml-tensor":return[e.type,e.dims,{mlTensor:e.mlTensor},"ml-tensor"];default:throw new Error(`invalid data location: ${e.location} for ${t()}`)}},ab=e=>{switch(e[3]){case"cpu":return new qe(e[0],e[2],e[1]);case"gpu-buffer":{let t=e[0];if(!Mr(t))throw new Error(`not supported data type: ${t} for deserializing GPU tensor`);let{gpuBuffer:n,download:r,dispose:o}=e[2];return qe.fromGpuBuffer(n,{dataType:t,dims:e[1],download:r,dispose:o})}case"ml-tensor":{let t=e[0];if(!Rr(t))throw new Error(`not supported data type: ${t} for deserializing MLTensor tensor`);let{mlTensor:n,download:r,dispose:o}=e[2];return qe.fromMLTensor(n,{dataType:t,dims:e[1],download:r,dispose:o})}default:throw new Error(`invalid data location: ${e[3]}`)}},mn=class{async fetchModelAndCopyToWasmMemory(t){return Jc(await er(t))}async loadModel(t,n){Ne();let r;typeof t=="string"?r=await this.fetchModelAndCopyToWasmMemory(t):r=t,[this.sessionId,this.inputNames,this.outputNames]=await ep(r,n),Be()}async dispose(){return tp(this.sessionId)}async run(t,n,r){Ne();let o=[],a=[];Object.entries(t).forEach(y=>{let _=y[0],b=y[1],w=this.inputNames.indexOf(_);if(w===-1)throw new Error(`invalid input '${_}'`);o.push(b),a.push(w)});let s=[],d=[];Object.entries(n).forEach(y=>{let _=y[0],b=y[1],w=this.outputNames.indexOf(_);if(w===-1)throw new Error(`invalid output '${_}'`);s.push(b),d.push(w)});let l=o.map((y,_)=>op(y,()=>`input "${this.inputNames[a[_]]}"`)),p=s.map((y,_)=>y?op(y,()=>`output "${this.outputNames[d[_]]}"`):null),f=await rp(this.sessionId,a,l,d,p,r),h={};for(let y=0;yfn,initializeFlags:()=>ap,wasmBackend:()=>sb});var ap,fn,sb,up=G(()=>{"use strict";Ge();Do();ip();ap=()=>{if((typeof we.wasm.initTimeout!="number"||we.wasm.initTimeout<0)&&(we.wasm.initTimeout=0),we.wasm.simd===!1&&console.warn('Deprecated property "env.wasm.simd" is set to false. non-SIMD build is no longer provided, and this setting will be ignored.'),typeof we.wasm.proxy!="boolean"&&(we.wasm.proxy=!1),typeof we.wasm.trace!="boolean"&&(we.wasm.trace=!1),typeof we.wasm.numThreads!="number"||!Number.isInteger(we.wasm.numThreads)||we.wasm.numThreads<=0)if(typeof self<"u"&&!self.crossOriginIsolated)we.wasm.numThreads=1;else{let e=typeof navigator>"u"?Nn("node:os").cpus().length:navigator.hardwareConcurrency;we.wasm.numThreads=Math.min(4,Math.ceil((e||1)/2))}},fn=class{async init(t){ap(),await Yc(),await Xc(t)}async createInferenceSessionHandler(t,n){let r=new mn;return await r.loadModel(t,n),Promise.resolve(r)}},sb=new fn});Ge();Ge();Ge();var hs="1.21.0";var lT=Fn;{let e=(up(),br(sp)).wasmBackend;Ct("webgpu",e,5),Ct("webnn",e,5),Ct("cpu",e,10),Ct("wasm",e,10)}Object.defineProperty(we.versions,"web",{value:hs,enumerable:!0});export{Of as InferenceSession,vr as TRACE,Ne as TRACE_FUNC_BEGIN,Be as TRACE_FUNC_END,qe as Tensor,lT as default,we as env,Ct as registerBackend}; +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +//# sourceMappingURL=ort.bundle.min.mjs.map diff --git a/analysis/qiaodou-extract/extracted/assets/ort.webgpu.bundle.min-CEayb2S6.mjs b/analysis/qiaodou-extract/extracted/assets/ort.webgpu.bundle.min-CEayb2S6.mjs new file mode 100644 index 000000000..695352d8f --- /dev/null +++ b/analysis/qiaodou-extract/extracted/assets/ort.webgpu.bundle.min-CEayb2S6.mjs @@ -0,0 +1,2817 @@ +/*! + * ONNX Runtime Web v1.21.0 + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + */ +var Un=Object.defineProperty;var Af=Object.getOwnPropertyDescriptor;var kf=Object.getOwnPropertyNames;var Ef=Object.prototype.hasOwnProperty;var Nn=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var G=(e,t)=>()=>(e&&(t=e(e=0)),t);var Zt=(e,t)=>{for(var n in t)Un(e,n,{get:t[n],enumerable:!0})},Pf=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of kf(t))!Ef.call(e,o)&&o!==n&&Un(e,o,{get:()=>t[o],enumerable:!(r=Af(t,o))||r.enumerable});return e};var br=e=>Pf(Un({},"__esModule",{value:!0}),e);var _r,Tt,Ct,zf,Wa,Vn=G(()=>{"use strict";_r=new Map,Tt=[],Ct=(e,t,n)=>{if(t&&typeof t.init=="function"&&typeof t.createInferenceSessionHandler=="function"){let r=_r.get(e);if(r===void 0)_r.set(e,{backend:t,priority:n});else{if(r.priority>n)return;if(r.priority===n&&r.backend!==t)throw new Error(`cannot register backend "${e}" using priority ${n}`)}if(n>=0){let o=Tt.indexOf(e);o!==-1&&Tt.splice(o,1);for(let a=0;a{let t=_r.get(e);if(!t)return"backend not found.";if(t.initialized)return t.backend;if(t.aborted)return t.error;{let n=!!t.initPromise;try{return n||(t.initPromise=t.backend.init(e)),await t.initPromise,t.initialized=!0,t.backend}catch(r){return n||(t.error=`${r}`,t.aborted=!0),t.error}finally{delete t.initPromise}}},Wa=async e=>{let t=e.executionProviders||[],n=t.map(l=>typeof l=="string"?l:l.name),r=n.length===0?Tt:n,o,a=[],s=new Set;for(let l of r){let p=await zf(l);typeof p=="string"?a.push({name:l,err:p}):(o||(o=p),o===p&&s.add(l))}if(!o)throw new Error(`no available backend found. ERR: ${a.map(l=>`[${l.name}] ${l.err}`).join(", ")}`);for(let{name:l,err:p}of a)n.includes(l)&&console.warn(`removing requested execution provider "${l}" from session options because it is not available: ${p}`);let d=t.filter(l=>s.has(typeof l=="string"?l:l.name));return[o,new Proxy(e,{get:(l,p)=>p==="executionProviders"?d:Reflect.get(l,p)})]}});var La=G(()=>{"use strict";Vn()});var Ga,Ha=G(()=>{"use strict";Ga="1.21.0"});var Fa,Ue,Wn=G(()=>{"use strict";Ha();Fa="warning",Ue={wasm:{},webgl:{},webgpu:{},versions:{common:Ga},set logLevel(e){if(e!==void 0){if(typeof e!="string"||["verbose","info","warning","error","fatal"].indexOf(e)===-1)throw new Error(`Unsupported logging level: ${e}`);Fa=e}},get logLevel(){return Fa}};Object.defineProperty(Ue,"logLevel",{enumerable:!0})});var we,qa=G(()=>{"use strict";Wn();we=Ue});var Ka,ja,Za=G(()=>{"use strict";Ka=(e,t)=>{let n=typeof document<"u"?document.createElement("canvas"):new OffscreenCanvas(1,1);n.width=e.dims[3],n.height=e.dims[2];let r=n.getContext("2d");if(r!=null){let o,a;t?.tensorLayout!==void 0&&t.tensorLayout==="NHWC"?(o=e.dims[2],a=e.dims[3]):(o=e.dims[3],a=e.dims[2]);let s=t?.format!==void 0?t.format:"RGB",d=t?.norm,l,p;d===void 0||d.mean===void 0?l=[255,255,255,255]:typeof d.mean=="number"?l=[d.mean,d.mean,d.mean,d.mean]:(l=[d.mean[0],d.mean[1],d.mean[2],0],d.mean[3]!==void 0&&(l[3]=d.mean[3])),d===void 0||d.bias===void 0?p=[0,0,0,0]:typeof d.bias=="number"?p=[d.bias,d.bias,d.bias,d.bias]:(p=[d.bias[0],d.bias[1],d.bias[2],0],d.bias[3]!==void 0&&(p[3]=d.bias[3]));let f=a*o,h=0,y=f,_=f*2,b=-1;s==="RGBA"?(h=0,y=f,_=f*2,b=f*3):s==="RGB"?(h=0,y=f,_=f*2):s==="RBG"&&(h=0,_=f,y=f*2);for(let w=0;w{let n=typeof document<"u"?document.createElement("canvas").getContext("2d"):new OffscreenCanvas(1,1).getContext("2d"),r;if(n!=null){let o,a,s;t?.tensorLayout!==void 0&&t.tensorLayout==="NHWC"?(o=e.dims[2],a=e.dims[1],s=e.dims[3]):(o=e.dims[3],a=e.dims[2],s=e.dims[1]);let d=t!==void 0&&t.format!==void 0?t.format:"RGB",l=t?.norm,p,f;l===void 0||l.mean===void 0?p=[255,255,255,255]:typeof l.mean=="number"?p=[l.mean,l.mean,l.mean,l.mean]:(p=[l.mean[0],l.mean[1],l.mean[2],255],l.mean[3]!==void 0&&(p[3]=l.mean[3])),l===void 0||l.bias===void 0?f=[0,0,0,0]:typeof l.bias=="number"?f=[l.bias,l.bias,l.bias,l.bias]:(f=[l.bias[0],l.bias[1],l.bias[2],0],l.bias[3]!==void 0&&(f[3]=l.bias[3]));let h=a*o;if(t!==void 0&&(t.format!==void 0&&s===4&&t.format!=="RGBA"||s===3&&t.format!=="RGB"&&t.format!=="BGR"))throw new Error("Tensor format doesn't match input tensor dims");let y=4,_=0,b=1,w=2,S=3,$=0,v=h,T=h*2,C=-1;d==="RGBA"?($=0,v=h,T=h*2,C=h*3):d==="RGB"?($=0,v=h,T=h*2):d==="RBG"&&($=0,T=h,v=h*2),r=n.createImageData(o,a);for(let A=0;A{"use strict";wr();Ln=(e,t)=>{if(e===void 0)throw new Error("Image buffer must be defined");if(t.height===void 0||t.width===void 0)throw new Error("Image height and width must be defined");if(t.tensorLayout==="NHWC")throw new Error("NHWC Tensor layout is not supported yet");let{height:n,width:r}=t,o=t.norm??{mean:255,bias:0},a,s;typeof o.mean=="number"?a=[o.mean,o.mean,o.mean,o.mean]:a=[o.mean[0],o.mean[1],o.mean[2],o.mean[3]??255],typeof o.bias=="number"?s=[o.bias,o.bias,o.bias,o.bias]:s=[o.bias[0],o.bias[1],o.bias[2],o.bias[3]??0];let d=t.format!==void 0?t.format:"RGBA",l=t.tensorFormat!==void 0&&t.tensorFormat!==void 0?t.tensorFormat:"RGB",p=n*r,f=l==="RGBA"?new Float32Array(p*4):new Float32Array(p*3),h=4,y=0,_=1,b=2,w=3,S=0,$=p,v=p*2,T=-1;d==="RGB"&&(h=3,y=0,_=1,b=2,w=-1),l==="RGBA"?T=p*3:l==="RBG"?(S=0,v=p,$=p*2):l==="BGR"&&(v=0,$=p,S=p*2);for(let A=0;A{let n=typeof HTMLImageElement<"u"&&e instanceof HTMLImageElement,r=typeof ImageData<"u"&&e instanceof ImageData,o=typeof ImageBitmap<"u"&&e instanceof ImageBitmap,a=typeof e=="string",s,d=t??{},l=()=>{if(typeof document<"u")return document.createElement("canvas");if(typeof OffscreenCanvas<"u")return new OffscreenCanvas(1,1);throw new Error("Canvas is not supported")},p=f=>typeof HTMLCanvasElement<"u"&&f instanceof HTMLCanvasElement||f instanceof OffscreenCanvas?f.getContext("2d"):null;if(n){let f=l();f.width=e.width,f.height=e.height;let h=p(f);if(h!=null){let y=e.height,_=e.width;if(t!==void 0&&t.resizedHeight!==void 0&&t.resizedWidth!==void 0&&(y=t.resizedHeight,_=t.resizedWidth),t!==void 0){if(d=t,t.tensorFormat!==void 0)throw new Error("Image input config format must be RGBA for HTMLImageElement");d.tensorFormat="RGBA",d.height=y,d.width=_}else d.tensorFormat="RGBA",d.height=y,d.width=_;h.drawImage(e,0,0),s=h.getImageData(0,0,_,y).data}else throw new Error("Can not access image data")}else if(r){let f,h;if(t!==void 0&&t.resizedWidth!==void 0&&t.resizedHeight!==void 0?(f=t.resizedHeight,h=t.resizedWidth):(f=e.height,h=e.width),t!==void 0&&(d=t),d.format="RGBA",d.height=f,d.width=h,t!==void 0){let y=l();y.width=h,y.height=f;let _=p(y);if(_!=null)_.putImageData(e,0,0),s=_.getImageData(0,0,h,f).data;else throw new Error("Can not access image data")}else s=e.data}else if(o){if(t===void 0)throw new Error("Please provide image config with format for Imagebitmap");let f=l();f.width=e.width,f.height=e.height;let h=p(f);if(h!=null){let y=e.height,_=e.width;return h.drawImage(e,0,0,_,y),s=h.getImageData(0,0,_,y).data,d.height=y,d.width=_,Ln(s,d)}else throw new Error("Can not access image data")}else{if(a)return new Promise((f,h)=>{let y=l(),_=p(y);if(!e||!_)return h();let b=new Image;b.crossOrigin="Anonymous",b.src=e,b.onload=()=>{y.width=b.width,y.height=b.height,_.drawImage(b,0,0,y.width,y.height);let w=_.getImageData(0,0,y.width,y.height);d.height=y.height,d.width=y.width,f(Ln(w.data,d))}});throw new Error("Input data provided is not supported - aborted tensor creation")}if(s!==void 0)return Ln(s,d);throw new Error("Input data provided is not supported - aborted tensor creation")},Ya=(e,t)=>{let{width:n,height:r,download:o,dispose:a}=t,s=[1,r,n,4];return new De({location:"texture",type:"float32",texture:e,dims:s,download:o,dispose:a})},Xa=(e,t)=>{let{dataType:n,dims:r,download:o,dispose:a}=t;return new De({location:"gpu-buffer",type:n??"float32",gpuBuffer:e,dims:r,download:o,dispose:a})},Ja=(e,t)=>{let{dataType:n,dims:r,download:o,dispose:a}=t;return new De({location:"ml-tensor",type:n??"float32",mlTensor:e,dims:r,download:o,dispose:a})},es=(e,t,n)=>new De({location:"cpu-pinned",type:e,data:t,dims:n??[t.length]})});var It,Qt,rs,ns,os=G(()=>{"use strict";It=new Map([["float32",Float32Array],["uint8",Uint8Array],["int8",Int8Array],["uint16",Uint16Array],["int16",Int16Array],["int32",Int32Array],["bool",Uint8Array],["float64",Float64Array],["uint32",Uint32Array],["int4",Uint8Array],["uint4",Uint8Array]]),Qt=new Map([[Float32Array,"float32"],[Uint8Array,"uint8"],[Int8Array,"int8"],[Uint16Array,"uint16"],[Int16Array,"int16"],[Int32Array,"int32"],[Float64Array,"float64"],[Uint32Array,"uint32"]]),rs=!1,ns=()=>{if(!rs){rs=!0;let e=typeof BigInt64Array<"u"&&BigInt64Array.from,t=typeof BigUint64Array<"u"&&BigUint64Array.from,n=globalThis.Float16Array,r=typeof n<"u"&&n.from;e&&(It.set("int64",BigInt64Array),Qt.set(BigInt64Array,"int64")),t&&(It.set("uint64",BigUint64Array),Qt.set(BigUint64Array,"uint64")),r?(It.set("float16",n),Qt.set(n,"float16")):It.set("float16",Uint16Array)}}});var is,as,ss=G(()=>{"use strict";wr();is=e=>{let t=1;for(let n=0;n{switch(e.location){case"cpu":return new De(e.type,e.data,t);case"cpu-pinned":return new De({location:"cpu-pinned",data:e.data,type:e.type,dims:t});case"texture":return new De({location:"texture",texture:e.texture,type:e.type,dims:t});case"gpu-buffer":return new De({location:"gpu-buffer",gpuBuffer:e.gpuBuffer,type:e.type,dims:t});case"ml-tensor":return new De({location:"ml-tensor",mlTensor:e.mlTensor,type:e.type,dims:t});default:throw new Error(`tensorReshape: tensor location ${e.location} is not supported`)}}});var De,wr=G(()=>{"use strict";Za();ts();os();ss();De=class{constructor(t,n,r){ns();let o,a;if(typeof t=="object"&&"location"in t)switch(this.dataLocation=t.location,o=t.type,a=t.dims,t.location){case"cpu-pinned":{let d=It.get(o);if(!d)throw new TypeError(`unsupported type "${o}" to create tensor from pinned buffer`);if(!(t.data instanceof d))throw new TypeError(`buffer should be of type ${d.name}`);this.cpuData=t.data;break}case"texture":{if(o!=="float32")throw new TypeError(`unsupported type "${o}" to create tensor from texture`);this.gpuTextureData=t.texture,this.downloader=t.download,this.disposer=t.dispose;break}case"gpu-buffer":{if(o!=="float32"&&o!=="float16"&&o!=="int32"&&o!=="int64"&&o!=="uint32"&&o!=="uint8"&&o!=="bool"&&o!=="uint4"&&o!=="int4")throw new TypeError(`unsupported type "${o}" to create tensor from gpu buffer`);this.gpuBufferData=t.gpuBuffer,this.downloader=t.download,this.disposer=t.dispose;break}case"ml-tensor":{if(o!=="float32"&&o!=="float16"&&o!=="int32"&&o!=="int64"&&o!=="uint32"&&o!=="uint64"&&o!=="int8"&&o!=="uint8"&&o!=="bool"&&o!=="uint4"&&o!=="int4")throw new TypeError(`unsupported type "${o}" to create tensor from MLTensor`);this.mlTensorData=t.mlTensor,this.downloader=t.download,this.disposer=t.dispose;break}default:throw new Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let d,l;if(typeof t=="string")if(o=t,l=r,t==="string"){if(!Array.isArray(n))throw new TypeError("A string tensor's data must be a string array.");d=n}else{let p=It.get(t);if(p===void 0)throw new TypeError(`Unsupported tensor type: ${t}.`);if(Array.isArray(n)){if(t==="float16"&&p===Uint16Array||t==="uint4"||t==="int4")throw new TypeError(`Creating a ${t} tensor from number array is not supported. Please use ${p.name} as data.`);t==="uint64"||t==="int64"?d=p.from(n,BigInt):d=p.from(n)}else if(n instanceof p)d=n;else if(n instanceof Uint8ClampedArray)if(t==="uint8")d=Uint8Array.from(n);else throw new TypeError("A Uint8ClampedArray tensor's data must be type of uint8");else if(t==="float16"&&n instanceof Uint16Array&&p!==Uint16Array)d=new globalThis.Float16Array(n.buffer,n.byteOffset,n.length);else throw new TypeError(`A ${o} tensor's data must be type of ${p}`)}else if(l=n,Array.isArray(t)){if(t.length===0)throw new TypeError("Tensor type cannot be inferred from an empty array.");let p=typeof t[0];if(p==="string")o="string",d=t;else if(p==="boolean")o="bool",d=Uint8Array.from(t);else throw new TypeError(`Invalid element type of data array: ${p}.`)}else if(t instanceof Uint8ClampedArray)o="uint8",d=Uint8Array.from(t);else{let p=Qt.get(t.constructor);if(p===void 0)throw new TypeError(`Unsupported type for tensor data: ${t.constructor}.`);o=p,d=t}if(l===void 0)l=[d.length];else if(!Array.isArray(l))throw new TypeError("A tensor's dims must be a number array");a=l,this.cpuData=d,this.dataLocation="cpu"}let s=is(a);if(this.cpuData&&s!==this.cpuData.length&&!((o==="uint4"||o==="int4")&&Math.ceil(s/2)===this.cpuData.length))throw new Error(`Tensor's size(${s}) does not match data length(${this.cpuData.length}).`);this.type=o,this.dims=a,this.size=s}static async fromImage(t,n){return Qa(t,n)}static fromTexture(t,n){return Ya(t,n)}static fromGpuBuffer(t,n){return Xa(t,n)}static fromMLTensor(t,n){return Ja(t,n)}static fromPinnedBuffer(t,n,r){return es(t,n,r)}toDataURL(t){return Ka(this,t)}toImageData(t){return ja(this,t)}get data(){if(this.ensureValid(),!this.cpuData)throw new Error("The data is not on CPU. Use `getData()` to download GPU data to CPU, or use `texture` or `gpuBuffer` property to access the GPU data directly.");return this.cpuData}get location(){return this.dataLocation}get texture(){if(this.ensureValid(),!this.gpuTextureData)throw new Error("The data is not stored as a WebGL texture.");return this.gpuTextureData}get gpuBuffer(){if(this.ensureValid(),!this.gpuBufferData)throw new Error("The data is not stored as a WebGPU buffer.");return this.gpuBufferData}get mlTensor(){if(this.ensureValid(),!this.mlTensorData)throw new Error("The data is not stored as a WebNN MLTensor.");return this.mlTensorData}async getData(t){switch(this.ensureValid(),this.dataLocation){case"cpu":case"cpu-pinned":return this.data;case"texture":case"gpu-buffer":case"ml-tensor":{if(!this.downloader)throw new Error("The current tensor is not created with a specified data downloader.");if(this.isDownloading)throw new Error("The current tensor is being downloaded.");try{this.isDownloading=!0;let n=await this.downloader();return this.downloader=void 0,this.dataLocation="cpu",this.cpuData=n,t&&this.disposer&&(this.disposer(),this.disposer=void 0),n}finally{this.isDownloading=!1}}default:throw new Error(`cannot get data from location: ${this.dataLocation}`)}}dispose(){if(this.isDownloading)throw new Error("The current tensor is being downloaded.");this.disposer&&(this.disposer(),this.disposer=void 0),this.cpuData=void 0,this.gpuTextureData=void 0,this.gpuBufferData=void 0,this.mlTensorData=void 0,this.downloader=void 0,this.isDownloading=void 0,this.dataLocation="none"}ensureValid(){if(this.dataLocation==="none")throw new Error("The tensor is disposed.")}reshape(t){if(this.ensureValid(),this.downloader||this.disposer)throw new Error("Cannot reshape a tensor that owns GPU resource.");return as(this,t)}}});var qe,Gn=G(()=>{"use strict";wr();qe=De});var vr,us,Ne,Be,Hn=G(()=>{"use strict";Wn();vr=(e,t)=>{(typeof Ue.trace>"u"?!Ue.wasm.trace:!Ue.trace)||console.timeStamp(`${e}::ORT::${t}`)},us=(e,t)=>{let n=new Error().stack?.split(/\r\n|\r|\n/g)||[],r=!1;for(let o=0;o{(typeof Ue.trace>"u"?!Ue.wasm.trace:!Ue.trace)||us("BEGIN",e)},Be=e=>{(typeof Ue.trace>"u"?!Ue.wasm.trace:!Ue.trace)||us("END",e)}});var $r,ds=G(()=>{"use strict";Vn();Gn();Hn();$r=class e{constructor(t){this.handler=t}async run(t,n,r){Ne();let o={},a={};if(typeof t!="object"||t===null||t instanceof qe||Array.isArray(t))throw new TypeError("'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.");let s=!0;if(typeof n=="object"){if(n===null)throw new TypeError("Unexpected argument[1]: cannot be null.");if(n instanceof qe)throw new TypeError("'fetches' cannot be a Tensor");if(Array.isArray(n)){if(n.length===0)throw new TypeError("'fetches' cannot be an empty array.");s=!1;for(let p of n){if(typeof p!="string")throw new TypeError("'fetches' must be a string array or an object.");if(this.outputNames.indexOf(p)===-1)throw new RangeError(`'fetches' contains invalid output name: ${p}.`);o[p]=null}if(typeof r=="object"&&r!==null)a=r;else if(typeof r<"u")throw new TypeError("'options' must be an object.")}else{let p=!1,f=Object.getOwnPropertyNames(n);for(let h of this.outputNames)if(f.indexOf(h)!==-1){let y=n[h];(y===null||y instanceof qe)&&(p=!0,s=!1,o[h]=y)}if(p){if(typeof r=="object"&&r!==null)a=r;else if(typeof r<"u")throw new TypeError("'options' must be an object.")}else a=n}}else if(typeof n<"u")throw new TypeError("Unexpected argument[1]: must be 'fetches' or 'options'.");for(let p of this.inputNames)if(typeof t[p]>"u")throw new Error(`input '${p}' is missing in 'feeds'.`);if(s)for(let p of this.outputNames)o[p]=null;let d=await this.handler.run(t,o,a),l={};for(let p in d)if(Object.hasOwnProperty.call(d,p)){let f=d[p];f instanceof qe?l[p]=f:l[p]=new qe(f.type,f.data,f.dims)}return Be(),l}async release(){return this.handler.dispose()}static async create(t,n,r,o){Ne();let a,s={};if(typeof t=="string"){if(a=t,typeof n=="object"&&n!==null)s=n;else if(typeof n<"u")throw new TypeError("'options' must be an object.")}else if(t instanceof Uint8Array){if(a=t,typeof n=="object"&&n!==null)s=n;else if(typeof n<"u")throw new TypeError("'options' must be an object.")}else if(t instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&t instanceof SharedArrayBuffer){let f=t,h=0,y=t.byteLength;if(typeof n=="object"&&n!==null)s=n;else if(typeof n=="number"){if(h=n,!Number.isSafeInteger(h))throw new RangeError("'byteOffset' must be an integer.");if(h<0||h>=f.byteLength)throw new RangeError(`'byteOffset' is out of range [0, ${f.byteLength}).`);if(y=t.byteLength-h,typeof r=="number"){if(y=r,!Number.isSafeInteger(y))throw new RangeError("'byteLength' must be an integer.");if(y<=0||h+y>f.byteLength)throw new RangeError(`'byteLength' is out of range (0, ${f.byteLength-h}].`);if(typeof o=="object"&&o!==null)s=o;else if(typeof o<"u")throw new TypeError("'options' must be an object.")}else if(typeof r<"u")throw new TypeError("'byteLength' must be a number.")}else if(typeof n<"u")throw new TypeError("'options' must be an object.");a=new Uint8Array(f,h,y)}else throw new TypeError("Unexpected argument[0]: must be 'path' or 'buffer'.");let[d,l]=await Wa(s),p=await d.createInferenceSessionHandler(a,l);return Be(),new e(p)}startProfiling(){this.handler.startProfiling()}endProfiling(){this.handler.endProfiling()}get inputNames(){return this.handler.inputNames}get outputNames(){return this.handler.outputNames}}});var Of,ls=G(()=>{"use strict";ds();Of=$r});var cs=G(()=>{"use strict"});var ps=G(()=>{"use strict"});var ms=G(()=>{"use strict"});var fs=G(()=>{"use strict"});var Fn={};Zt(Fn,{InferenceSession:()=>Of,TRACE:()=>vr,TRACE_FUNC_BEGIN:()=>Ne,TRACE_FUNC_END:()=>Be,Tensor:()=>qe,env:()=>we,registerBackend:()=>Ct});var Ge=G(()=>{"use strict";La();qa();ls();Gn();cs();ps();Hn();ms();fs()});var xr=G(()=>{"use strict"});var bs={};Zt(bs,{default:()=>Df});var gs,ys,Df,_s=G(()=>{"use strict";qn();bt();Sr();gs="ort-wasm-proxy-worker",ys=globalThis.self?.name===gs;ys&&(self.onmessage=e=>{let{type:t,in:n}=e.data;try{switch(t){case"init-wasm":Tr(n.wasm).then(()=>{Cr(n).then(()=>{postMessage({type:t})},r=>{postMessage({type:t,err:r})})},r=>{postMessage({type:t,err:r})});break;case"init-ep":{let{epName:r,env:o}=n;Ir(o,r).then(()=>{postMessage({type:t})},a=>{postMessage({type:t,err:a})});break}case"copy-from":{let{buffer:r}=n,o=Yt(r);postMessage({type:t,out:o});break}case"create":{let{model:r,options:o}=n;Ar(r,o).then(a=>{postMessage({type:t,out:a})},a=>{postMessage({type:t,err:a})});break}case"release":kr(n),postMessage({type:t});break;case"run":{let{sessionId:r,inputIndices:o,inputs:a,outputIndices:s,options:d}=n;Er(r,o,a,s,new Array(s.length).fill(null),d).then(l=>{l.some(p=>p[3]!=="cpu")?postMessage({type:t,err:"Proxy does not support non-cpu tensor location."}):postMessage({type:t,out:l},zr([...a,...l]))},l=>{postMessage({type:t,err:l})});break}case"end-profiling":Pr(n),postMessage({type:t});break;default:}}catch(r){postMessage({type:t,err:r})}});Df=ys?null:e=>new Worker(e??Ve,{type:"module",name:gs})});var vs={};Zt(vs,{default:()=>Bf});var Kn,ws,Bf,Mf,$s=G(()=>{"use strict";ws=(Kn=import.meta.url,async function(e={}){var t,n,r=e,o=new Promise((i,u)=>{t=i,n=u}),a=typeof window=="object",s=typeof WorkerGlobalScope<"u",d=s&&self.name?.startsWith("em-pthread");r.mountExternalData=(i,u)=>{i.startsWith("./")&&(i=i.substring(2)),(r.Bd||(r.Bd=new Map)).set(i,u)},r.unmountExternalData=()=>{delete r.Bd};var l=globalThis.SharedArrayBuffer??new WebAssembly.Memory({initial:0,maximum:0,shared:!0}).buffer.constructor;let p=()=>{let i=(c,m,g)=>(...x)=>{let I=Je,z=m?.();x=c(...x);let B=m?.();return z!==B&&(c=B,g(z),m=g=null),Je!=I?new Promise((L,q)=>{En={resolve:L,reject:q}}):x},u=c=>async(...m)=>{try{if(r.Cd)throw Error("Session already started");let g=r.Cd={be:m[0],errors:[]},x=await c(...m);if(r.Cd!==g)throw Error("Session mismatch");r.Dd?.flush();let I=g.errors;if(0B),0r._OrtCreateSession,c=>r._OrtCreateSession=c),r._OrtRun=u(i(r._OrtRun,()=>r._OrtRun,c=>r._OrtRun=c)),r._OrtRunWithBinding=u(i(r._OrtRunWithBinding,()=>r._OrtRunWithBinding,c=>r._OrtRunWithBinding=c)),r._OrtBindInput=i(r._OrtBindInput,()=>r._OrtBindInput,c=>r._OrtBindInput=c),p=void 0};r.jsepInit=(i,u)=>{if(p?.(),i==="webgpu"){[r.Dd,r.Rd,r.Vd,r.Hd,r.Ud,r.hc,r.Wd,r.Zd,r.Sd,r.Td,r.Xd]=u;let c=r.Dd;r.jsepRegisterBuffer=(m,g,x,I)=>c.registerBuffer(m,g,x,I),r.jsepGetBuffer=m=>c.getBuffer(m),r.jsepCreateDownloader=(m,g,x)=>c.createDownloader(m,g,x),r.jsepOnCreateSession=m=>{c.onCreateSession(m)},r.jsepOnReleaseSession=m=>{c.onReleaseSession(m)},r.jsepOnRunStart=m=>c.onRunStart(m),r.$d=(m,g)=>{c.upload(m,g)}}else if(i==="webnn"){[r.Dd,r.Yd,r.Id,r.jsepEnsureTensor,r.Jd,r.jsepDownloadTensor]=u,r.jsepReleaseTensorId=r.Id,r.jsepUploadTensor=r.Jd;let c=r.Dd;r.jsepOnRunStart=m=>c.onRunStart(m),r.jsepOnRunEnd=c.onRunEnd.bind(c),r.jsepRegisterMLContext=(m,g)=>{c.registerMLContext(m,g)},r.jsepOnReleaseSession=m=>{c.onReleaseSession(m)},r.jsepCreateMLTensorDownloader=(m,g)=>c.createMLTensorDownloader(m,g),r.jsepRegisterMLTensor=(m,g,x,I)=>c.registerMLTensor(m,g,x,I),r.jsepCreateMLContext=m=>c.createMLContext(m),r.jsepRegisterMLConstant=(m,g,x,I,z)=>c.registerMLConstant(m,g,x,I,z,r.Bd),r.jsepRegisterGraphInput=c.registerGraphInput.bind(c),r.jsepIsGraphInput=c.isGraphInput.bind(c),r.jsepCreateTemporaryTensor=c.createTemporaryTensor.bind(c)}};var f,h,y=Object.assign({},r),_=(i,u)=>{throw u},b="";(a||s)&&(s?b=self.location.href:typeof document<"u"&&document.currentScript&&(b=document.currentScript.src),Kn&&(b=Kn),b=b.startsWith("blob:")?"":b.slice(0,b.replace(/[?#].*/,"").lastIndexOf("/")+1),s&&(h=i=>{var u=new XMLHttpRequest;return u.open("GET",i,!1),u.responseType="arraybuffer",u.send(null),new Uint8Array(u.response)}),f=async i=>{if(le(i))return new Promise((c,m)=>{var g=new XMLHttpRequest;g.open("GET",i,!0),g.responseType="arraybuffer",g.onload=()=>{g.status==200||g.status==0&&g.response?c(g.response):m(g.status)},g.onerror=m,g.send(null)});var u=await fetch(i,{credentials:"same-origin"});if(u.ok)return u.arrayBuffer();throw Error(u.status+" : "+u.url)});var w=console.log.bind(console),S=console.error.bind(console),$=w,v=S;Object.assign(r,y),y=null;var T,C,A,k,O,M,V,F,j,ne,W,J,ve,Q=r.wasmBinary,ee=!1,le=i=>i.startsWith("file://");function Z(){return T.buffer!=k.buffer&&be(),k}function pe(){return T.buffer!=k.buffer&&be(),O}function ke(){return T.buffer!=k.buffer&&be(),M}function Se(){return T.buffer!=k.buffer&&be(),V}function D(){return T.buffer!=k.buffer&&be(),F}function R(){return T.buffer!=k.buffer&&be(),j}function Y(){return T.buffer!=k.buffer&&be(),ne}function fe(){return T.buffer!=k.buffer&&be(),ve}if(d){let i=function(u){try{var c=u.data,m=c.yd;if(m==="load"){let g=[];self.onmessage=x=>g.push(x),self.startWorker=()=>{postMessage({yd:"loaded"});for(let x of g)i(x);self.onmessage=i};for(let x of c.Od)r[x]&&!r[x].proxy||(r[x]=(...I)=>{postMessage({yd:"callHandler",Nd:x,args:I})},x=="print"&&($=r[x]),x=="printErr"&&(v=r[x]));T=c.he,be(),Fe(c.ie)}else if(m==="run"){cp(c.xd),Dn(c.xd,0,0,1,0,0),Lo(),An(c.xd),xe||(Mi(),xe=!0);try{pp(c.de,c.Fd)}catch(g){if(g!="unwind")throw g}}else c.target!=="setimmediate"&&(m==="checkMailbox"?xe&&ur():m&&(v(`worker: received unknown command ${m}`),v(c)))}catch(g){throw Ri(),g}};var ub=i,Fe,xe=!1;v=function(...u){u=u.join(" "),console.error(u)},self.alert=function(...u){postMessage({yd:"alert",text:u.join(" "),fe:gr()})},self.onunhandledrejection=u=>{throw u.reason||u},self.onmessage=i}function be(){var i=T.buffer;r.HEAP8=k=new Int8Array(i),r.HEAP16=M=new Int16Array(i),r.HEAPU8=O=new Uint8Array(i),r.HEAPU16=V=new Uint16Array(i),r.HEAP32=F=new Int32Array(i),r.HEAPU32=j=new Uint32Array(i),r.HEAPF32=ne=new Float32Array(i),r.HEAPF64=ve=new Float64Array(i),r.HEAP64=W=new BigInt64Array(i),r.HEAPU64=J=new BigUint64Array(i)}function Ye(){d?startWorker(r):U.Bb()}d||(T=new WebAssembly.Memory({initial:256,maximum:65536,shared:!0}),be());var Gt,xt=0,Ht=null;function Bo(){if(--xt==0&&Ht){var i=Ht;Ht=null,i()}}function ut(i){throw v(i="Aborted("+i+")"),ee=!0,i=new WebAssembly.RuntimeError(i+". Build with -sASSERTIONS for more info."),n(i),i}function Mo(){return{a:{Ta:lp,Va:dp,W:mp,la:fp,b:gp,u:yp,R:bp,Za:_p,d:wp,pb:qo,g:hp,T:Zo,Ga:Qo,lb:Xo,nb:Jo,Ha:ei,Ea:ti,wb:ri,Da:ni,pa:oi,mb:ii,jb:ai,Fa:si,kb:ui,Ma:vp,za:xp,eb:Sp,cb:Cp,ya:Ap,V:kp,N:Ep,db:Pp,ma:Up,fb:Np,zb:Vp,hb:Wp,qb:Lp,ab:Gp,Aa:Hp,yb:An,Ja:Fp,S:qp,Wa:Kp,$:Qp,G:Yp,E:Jp,m:Tn,H:em,B:nm,X:om,J:im,v:am,O:sm,D:um,t:dm,A:lm,z:cm,w:pm,r:mm,tb:fm,ub:hm,vb:gm,rb:$i,sb:xi,bb:Si,Oa:bm,La:vm,y:$m,ja:xm,Ba:Sm,Ka:_m,qa:Tm,Ia:Cm,ib:Im,U:ym,fa:Am,Sa:km,gb:Em,Qa:Pm,Pa:zm,Ab:Ai,Ca:ki,ob:_n,aa:Ei,oa:Pi,xb:zi,na:Oi,$a:af,ia:_f,sa:Sf,ga:nf,da:pf,ua:$f,p:tf,e:Nm,c:Rm,ea:lf,f:Vm,n:Lm,k:Ym,Y:Hm,ka:Xm,j:rf,wa:df,Ra:If,ca:yf,Ua:Cf,P:cf,K:qm,_:gf,Q:of,Z:wf,x:Fm,l:Um,va:hf,i:Mm,h:Gm,ra:Tf,ta:xf,o:Wm,q:Km,s:Zm,I:Qm,C:ef,L:Jm,xa:uf,_a:sf,F:bf,Ya:mf,ba:vf,M:jm,Xa:ff,ha:Dm,a:T,Na:bn}}}var hn={1319426:()=>typeof wasmOffsetConverter<"u",1319483:(i,u,c,m,g)=>{if(r===void 0||!r.Bd)return 1;if((i=Ae(Number(i>>>0))).startsWith("./")&&(i=i.substring(2)),!(i=r.Bd.get(i)))return 2;if(u=Number(u>>>0),c=Number(c>>>0),m=Number(m>>>0),u+c>i.byteLength)return 3;try{let x=i.subarray(u,u+c);switch(g){case 0:pe().set(x,m>>>0);break;case 1:r.$d(m,x);break;default:return 4}return 0}catch{return 4}},1320198:(i,u,c)=>{r.Jd(i,pe().subarray(u>>>0,u+c>>>0))},1320261:()=>r.Yd(),1320302:i=>{r.Id(i)},1320338:()=>{r.Sd()},1320369:()=>{r.Td()},1320398:()=>{r.Xd()},1320423:i=>r.Rd(i),1320456:i=>r.Vd(i),1320488:(i,u,c)=>{r.Hd(Number(i),Number(u),Number(c),!0)},1320551:(i,u,c)=>{r.Hd(Number(i),Number(u),Number(c))},1320608:i=>{r.hc("Abs",i,void 0)},1320659:i=>{r.hc("Neg",i,void 0)},1320710:i=>{r.hc("Floor",i,void 0)},1320763:i=>{r.hc("Ceil",i,void 0)},1320815:i=>{r.hc("Reciprocal",i,void 0)},1320873:i=>{r.hc("Sqrt",i,void 0)},1320925:i=>{r.hc("Exp",i,void 0)},1320976:i=>{r.hc("Erf",i,void 0)},1321027:i=>{r.hc("Sigmoid",i,void 0)},1321082:(i,u,c)=>{r.hc("HardSigmoid",i,{alpha:u,beta:c})},1321161:i=>{r.hc("Log",i,void 0)},1321212:i=>{r.hc("Sin",i,void 0)},1321263:i=>{r.hc("Cos",i,void 0)},1321314:i=>{r.hc("Tan",i,void 0)},1321365:i=>{r.hc("Asin",i,void 0)},1321417:i=>{r.hc("Acos",i,void 0)},1321469:i=>{r.hc("Atan",i,void 0)},1321521:i=>{r.hc("Sinh",i,void 0)},1321573:i=>{r.hc("Cosh",i,void 0)},1321625:i=>{r.hc("Asinh",i,void 0)},1321678:i=>{r.hc("Acosh",i,void 0)},1321731:i=>{r.hc("Atanh",i,void 0)},1321784:i=>{r.hc("Tanh",i,void 0)},1321836:i=>{r.hc("Not",i,void 0)},1321887:(i,u,c)=>{r.hc("Clip",i,{min:u,max:c})},1321956:i=>{r.hc("Clip",i,void 0)},1322008:(i,u)=>{r.hc("Elu",i,{alpha:u})},1322066:i=>{r.hc("Gelu",i,void 0)},1322118:i=>{r.hc("Relu",i,void 0)},1322170:(i,u)=>{r.hc("LeakyRelu",i,{alpha:u})},1322234:(i,u)=>{r.hc("ThresholdedRelu",i,{alpha:u})},1322304:(i,u)=>{r.hc("Cast",i,{to:u})},1322362:i=>{r.hc("Add",i,void 0)},1322413:i=>{r.hc("Sub",i,void 0)},1322464:i=>{r.hc("Mul",i,void 0)},1322515:i=>{r.hc("Div",i,void 0)},1322566:i=>{r.hc("Pow",i,void 0)},1322617:i=>{r.hc("Equal",i,void 0)},1322670:i=>{r.hc("Greater",i,void 0)},1322725:i=>{r.hc("GreaterOrEqual",i,void 0)},1322787:i=>{r.hc("Less",i,void 0)},1322839:i=>{r.hc("LessOrEqual",i,void 0)},1322898:(i,u,c,m,g)=>{r.hc("ReduceMean",i,{keepDims:!!u,noopWithEmptyAxes:!!c,axes:m?Array.from(D().subarray(Number(m)>>>0,Number(g)>>>0)):[]})},1323073:(i,u,c,m,g)=>{r.hc("ReduceMax",i,{keepDims:!!u,noopWithEmptyAxes:!!c,axes:m?Array.from(D().subarray(Number(m)>>>0,Number(g)>>>0)):[]})},1323247:(i,u,c,m,g)=>{r.hc("ReduceMin",i,{keepDims:!!u,noopWithEmptyAxes:!!c,axes:m?Array.from(D().subarray(Number(m)>>>0,Number(g)>>>0)):[]})},1323421:(i,u,c,m,g)=>{r.hc("ReduceProd",i,{keepDims:!!u,noopWithEmptyAxes:!!c,axes:m?Array.from(D().subarray(Number(m)>>>0,Number(g)>>>0)):[]})},1323596:(i,u,c,m,g)=>{r.hc("ReduceSum",i,{keepDims:!!u,noopWithEmptyAxes:!!c,axes:m?Array.from(D().subarray(Number(m)>>>0,Number(g)>>>0)):[]})},1323770:(i,u,c,m,g)=>{r.hc("ReduceL1",i,{keepDims:!!u,noopWithEmptyAxes:!!c,axes:m?Array.from(D().subarray(Number(m)>>>0,Number(g)>>>0)):[]})},1323943:(i,u,c,m,g)=>{r.hc("ReduceL2",i,{keepDims:!!u,noopWithEmptyAxes:!!c,axes:m?Array.from(D().subarray(Number(m)>>>0,Number(g)>>>0)):[]})},1324116:(i,u,c,m,g)=>{r.hc("ReduceLogSum",i,{keepDims:!!u,noopWithEmptyAxes:!!c,axes:m?Array.from(D().subarray(Number(m)>>>0,Number(g)>>>0)):[]})},1324293:(i,u,c,m,g)=>{r.hc("ReduceSumSquare",i,{keepDims:!!u,noopWithEmptyAxes:!!c,axes:m?Array.from(D().subarray(Number(m)>>>0,Number(g)>>>0)):[]})},1324473:(i,u,c,m,g)=>{r.hc("ReduceLogSumExp",i,{keepDims:!!u,noopWithEmptyAxes:!!c,axes:m?Array.from(D().subarray(Number(m)>>>0,Number(g)>>>0)):[]})},1324653:i=>{r.hc("Where",i,void 0)},1324706:(i,u,c)=>{r.hc("Transpose",i,{perm:u?Array.from(D().subarray(Number(u)>>>0,Number(c)>>>0)):[]})},1324830:(i,u,c,m)=>{r.hc("DepthToSpace",i,{blocksize:u,mode:Ae(c),format:m?"NHWC":"NCHW"})},1324963:(i,u,c,m)=>{r.hc("DepthToSpace",i,{blocksize:u,mode:Ae(c),format:m?"NHWC":"NCHW"})},1325096:(i,u,c,m,g,x,I,z,B,L,q,X,ue,$e,Le)=>{r.hc("ConvTranspose",i,{format:B?"NHWC":"NCHW",autoPad:u,dilations:[c],group:m,kernelShape:[g],pads:[x,I],strides:[z],wIsConst:()=>!!Z()[L>>>0],outputPadding:q?Array.from(D().subarray(Number(q)>>>0,Number(X)>>>0)):[],outputShape:ue?Array.from(D().subarray(Number(ue)>>>0,Number($e)>>>0)):[],activation:Ae(Le)})},1325529:(i,u,c,m,g,x,I,z,B,L,q,X,ue,$e)=>{r.hc("ConvTranspose",i,{format:z?"NHWC":"NCHW",autoPad:u,dilations:Array.from(D().subarray(Number(c)>>>0,2+(Number(c)>>>0)>>>0)),group:m,kernelShape:Array.from(D().subarray(Number(g)>>>0,2+(Number(g)>>>0)>>>0)),pads:Array.from(D().subarray(Number(x)>>>0,4+(Number(x)>>>0)>>>0)),strides:Array.from(D().subarray(Number(I)>>>0,2+(Number(I)>>>0)>>>0)),wIsConst:()=>!!Z()[B>>>0],outputPadding:L?Array.from(D().subarray(Number(L)>>>0,Number(q)>>>0)):[],outputShape:X?Array.from(D().subarray(Number(X)>>>0,Number(ue)>>>0)):[],activation:Ae($e)})},1326190:(i,u,c,m,g,x,I,z,B,L,q,X,ue,$e,Le)=>{r.hc("ConvTranspose",i,{format:B?"NHWC":"NCHW",autoPad:u,dilations:[c],group:m,kernelShape:[g],pads:[x,I],strides:[z],wIsConst:()=>!!Z()[L>>>0],outputPadding:q?Array.from(D().subarray(Number(q)>>>0,Number(X)>>>0)):[],outputShape:ue?Array.from(D().subarray(Number(ue)>>>0,Number($e)>>>0)):[],activation:Ae(Le)})},1326623:(i,u,c,m,g,x,I,z,B,L,q,X,ue,$e)=>{r.hc("ConvTranspose",i,{format:z?"NHWC":"NCHW",autoPad:u,dilations:Array.from(D().subarray(Number(c)>>>0,2+(Number(c)>>>0)>>>0)),group:m,kernelShape:Array.from(D().subarray(Number(g)>>>0,2+(Number(g)>>>0)>>>0)),pads:Array.from(D().subarray(Number(x)>>>0,4+(Number(x)>>>0)>>>0)),strides:Array.from(D().subarray(Number(I)>>>0,2+(Number(I)>>>0)>>>0)),wIsConst:()=>!!Z()[B>>>0],outputPadding:L?Array.from(D().subarray(Number(L)>>>0,Number(q)>>>0)):[],outputShape:X?Array.from(D().subarray(Number(X)>>>0,Number(ue)>>>0)):[],activation:Ae($e)})},1327284:(i,u)=>{r.hc("GlobalAveragePool",i,{format:u?"NHWC":"NCHW"})},1327375:(i,u,c,m,g,x,I,z,B,L,q,X,ue,$e)=>{r.hc("AveragePool",i,{format:$e?"NHWC":"NCHW",auto_pad:u,ceil_mode:c,count_include_pad:m,storage_order:g,dilations:x?Array.from(D().subarray(Number(x)>>>0,Number(I)>>>0)):[],kernel_shape:z?Array.from(D().subarray(Number(z)>>>0,Number(B)>>>0)):[],pads:L?Array.from(D().subarray(Number(L)>>>0,Number(q)>>>0)):[],strides:X?Array.from(D().subarray(Number(X)>>>0,Number(ue)>>>0)):[]})},1327854:(i,u)=>{r.hc("GlobalAveragePool",i,{format:u?"NHWC":"NCHW"})},1327945:(i,u,c,m,g,x,I,z,B,L,q,X,ue,$e)=>{r.hc("AveragePool",i,{format:$e?"NHWC":"NCHW",auto_pad:u,ceil_mode:c,count_include_pad:m,storage_order:g,dilations:x?Array.from(D().subarray(Number(x)>>>0,Number(I)>>>0)):[],kernel_shape:z?Array.from(D().subarray(Number(z)>>>0,Number(B)>>>0)):[],pads:L?Array.from(D().subarray(Number(L)>>>0,Number(q)>>>0)):[],strides:X?Array.from(D().subarray(Number(X)>>>0,Number(ue)>>>0)):[]})},1328424:(i,u)=>{r.hc("GlobalMaxPool",i,{format:u?"NHWC":"NCHW"})},1328511:(i,u,c,m,g,x,I,z,B,L,q,X,ue,$e)=>{r.hc("MaxPool",i,{format:$e?"NHWC":"NCHW",auto_pad:u,ceil_mode:c,count_include_pad:m,storage_order:g,dilations:x?Array.from(D().subarray(Number(x)>>>0,Number(I)>>>0)):[],kernel_shape:z?Array.from(D().subarray(Number(z)>>>0,Number(B)>>>0)):[],pads:L?Array.from(D().subarray(Number(L)>>>0,Number(q)>>>0)):[],strides:X?Array.from(D().subarray(Number(X)>>>0,Number(ue)>>>0)):[]})},1328986:(i,u)=>{r.hc("GlobalMaxPool",i,{format:u?"NHWC":"NCHW"})},1329073:(i,u,c,m,g,x,I,z,B,L,q,X,ue,$e)=>{r.hc("MaxPool",i,{format:$e?"NHWC":"NCHW",auto_pad:u,ceil_mode:c,count_include_pad:m,storage_order:g,dilations:x?Array.from(D().subarray(Number(x)>>>0,Number(I)>>>0)):[],kernel_shape:z?Array.from(D().subarray(Number(z)>>>0,Number(B)>>>0)):[],pads:L?Array.from(D().subarray(Number(L)>>>0,Number(q)>>>0)):[],strides:X?Array.from(D().subarray(Number(X)>>>0,Number(ue)>>>0)):[]})},1329548:(i,u,c,m,g)=>{r.hc("Gemm",i,{alpha:u,beta:c,transA:m,transB:g})},1329652:i=>{r.hc("MatMul",i,void 0)},1329706:(i,u,c,m)=>{r.hc("ArgMax",i,{keepDims:!!u,selectLastIndex:!!c,axis:m})},1329814:(i,u,c,m)=>{r.hc("ArgMin",i,{keepDims:!!u,selectLastIndex:!!c,axis:m})},1329922:(i,u)=>{r.hc("Softmax",i,{axis:u})},1329985:(i,u)=>{r.hc("Concat",i,{axis:u})},1330045:(i,u,c,m,g)=>{r.hc("Split",i,{axis:u,numOutputs:c,splitSizes:m?Array.from(D().subarray(Number(m)>>>0,Number(g)>>>0)):[]})},1330201:i=>{r.hc("Expand",i,void 0)},1330255:(i,u)=>{r.hc("Gather",i,{axis:Number(u)})},1330326:(i,u)=>{r.hc("GatherElements",i,{axis:Number(u)})},1330405:(i,u)=>{r.hc("GatherND",i,{batch_dims:Number(u)})},1330484:(i,u,c,m,g,x,I,z,B,L,q)=>{r.hc("Resize",i,{antialias:u,axes:c?Array.from(D().subarray(Number(c)>>>0,Number(m)>>>0)):[],coordinateTransformMode:Ae(g),cubicCoeffA:x,excludeOutside:I,extrapolationValue:z,keepAspectRatioPolicy:Ae(B),mode:Ae(L),nearestMode:Ae(q)})},1330846:(i,u,c,m,g,x,I)=>{r.hc("Slice",i,{starts:u?Array.from(D().subarray(Number(u)>>>0,Number(c)>>>0)):[],ends:m?Array.from(D().subarray(Number(m)>>>0,Number(g)>>>0)):[],axes:x?Array.from(D().subarray(Number(x)>>>0,Number(I)>>>0)):[]})},1331110:i=>{r.hc("Tile",i,void 0)},1331162:(i,u,c)=>{r.hc("InstanceNormalization",i,{epsilon:u,format:c?"NHWC":"NCHW"})},1331276:(i,u,c)=>{r.hc("InstanceNormalization",i,{epsilon:u,format:c?"NHWC":"NCHW"})},1331390:i=>{r.hc("Range",i,void 0)},1331443:(i,u)=>{r.hc("Einsum",i,{equation:Ae(u)})},1331524:(i,u,c,m,g)=>{r.hc("Pad",i,{mode:u,value:c,pads:m?Array.from(D().subarray(Number(m)>>>0,Number(g)>>>0)):[]})},1331667:(i,u,c,m,g,x)=>{r.hc("BatchNormalization",i,{epsilon:u,momentum:c,spatial:!!g,trainingMode:!!m,format:x?"NHWC":"NCHW"})},1331836:(i,u,c,m,g,x)=>{r.hc("BatchNormalization",i,{epsilon:u,momentum:c,spatial:!!g,trainingMode:!!m,format:x?"NHWC":"NCHW"})},1332005:(i,u,c)=>{r.hc("CumSum",i,{exclusive:Number(u),reverse:Number(c)})},1332102:(i,u,c)=>{r.hc("DequantizeLinear",i,{axis:u,blockSize:c})},1332192:(i,u,c,m,g)=>{r.hc("GridSample",i,{align_corners:u,mode:Ae(c),padding_mode:Ae(m),format:g?"NHWC":"NCHW"})},1332362:(i,u,c,m,g)=>{r.hc("GridSample",i,{align_corners:u,mode:Ae(c),padding_mode:Ae(m),format:g?"NHWC":"NCHW"})},1332532:(i,u)=>{r.hc("ScatterND",i,{reduction:Ae(u)})},1332617:(i,u,c,m,g,x,I,z,B)=>{r.hc("Attention",i,{numHeads:u,isUnidirectional:c,maskFilterValue:m,scale:g,doRotary:x,qkvHiddenSizes:I?Array.from(D().subarray(Number(z)>>>0,Number(z)+I>>>0)):[],pastPresentShareBuffer:!!B})},1332889:i=>{r.hc("BiasAdd",i,void 0)},1332944:i=>{r.hc("BiasSplitGelu",i,void 0)},1333005:i=>{r.hc("FastGelu",i,void 0)},1333061:(i,u,c,m,g,x,I,z,B,L,q,X,ue,$e,Le,jt)=>{r.hc("Conv",i,{format:X?"NHWC":"NCHW",auto_pad:u,dilations:c?Array.from(D().subarray(Number(c)>>>0,Number(m)>>>0)):[],group:g,kernel_shape:x?Array.from(D().subarray(Number(x)>>>0,Number(I)>>>0)):[],pads:z?Array.from(D().subarray(Number(z)>>>0,Number(B)>>>0)):[],strides:L?Array.from(D().subarray(Number(L)>>>0,Number(q)>>>0)):[],w_is_const:()=>!!Z()[Number(ue)>>>0],activation:Ae($e),activation_params:Le?Array.from(Y().subarray(Number(Le)>>>0,Number(jt)>>>0)):[]})},1333645:i=>{r.hc("Gelu",i,void 0)},1333697:(i,u,c,m,g,x,I,z,B)=>{r.hc("GroupQueryAttention",i,{numHeads:u,kvNumHeads:c,scale:m,softcap:g,doRotary:x,rotaryInterleaved:I,smoothSoftmax:z,localWindowSize:B})},1333914:(i,u,c,m)=>{r.hc("LayerNormalization",i,{axis:u,epsilon:c,simplified:!!m})},1334025:(i,u,c,m)=>{r.hc("LayerNormalization",i,{axis:u,epsilon:c,simplified:!!m})},1334136:(i,u,c,m,g,x)=>{r.hc("MatMulNBits",i,{k:u,n:c,accuracyLevel:m,bits:g,blockSize:x})},1334263:(i,u,c,m,g,x)=>{r.hc("MultiHeadAttention",i,{numHeads:u,isUnidirectional:c,maskFilterValue:m,scale:g,doRotary:x})},1334422:(i,u)=>{r.hc("QuickGelu",i,{alpha:u})},1334486:(i,u,c,m,g)=>{r.hc("RotaryEmbedding",i,{interleaved:!!u,numHeads:c,rotaryEmbeddingDim:m,scale:g})},1334625:(i,u,c)=>{r.hc("SkipLayerNormalization",i,{epsilon:u,simplified:!!c})},1334727:(i,u,c)=>{r.hc("SkipLayerNormalization",i,{epsilon:u,simplified:!!c})},1334829:(i,u,c,m)=>{r.hc("GatherBlockQuantized",i,{gatherAxis:u,quantizeAxis:c,blockSize:m})},1334950:i=>{r.Wd(i)},1334984:(i,u)=>r.Zd(Number(i),Number(u),r.Cd.be,r.Cd.errors)};function dp(i,u,c){return gi(async()=>{await r.Ud(Number(i),Number(u),Number(c))})}function lp(){return typeof wasmOffsetConverter<"u"}class gn{name="ExitStatus";constructor(u){this.message=`Program terminated with exit(${u})`,this.status=u}}var Ro=i=>{i.terminate(),i.onmessage=()=>{}},yn=[],Uo=i=>{ft.length==0&&(Ho(),Go(ft[0]));var u=ft.pop();if(!u)return 6;Ft.push(u),St[i.xd]=u,u.xd=i.xd;var c={yd:"run",de:i.ce,Fd:i.Fd,xd:i.xd};return u.postMessage(c,i.Ld),0},mt=0,Te=(i,u,...c)=>{for(var m=2*c.length,g=ie(),x=Mn(8*m),I=x>>>3,z=0;z>>0]=B)}return i=Ui(i,0,m,x,u),oe(g),i};function bn(i){if(d)return Te(0,1,i);if(A=i,!(0{if(A=i,d)throw No(i),"unwind";bn(i)},ft=[],Ft=[],Vo=[],St={},Wo=i=>{var u=i.xd;delete St[u],ft.push(i),Ft.splice(Ft.indexOf(i),1),i.xd=0,Ni(u)};function Lo(){Vo.forEach(i=>i())}var Go=i=>new Promise(u=>{i.onmessage=g=>{var x=(g=g.data).yd;if(g.Ed&&g.Ed!=gr()){var I=St[g.Ed];I?I.postMessage(g,g.Ld):v(`Internal error! Worker sent a message "${x}" to target pthread ${g.Ed}, but that thread no longer exists!`)}else x==="checkMailbox"?ur():x==="spawnThread"?Uo(g):x==="cleanupThread"?Wo(St[g.ee]):x==="loaded"?(i.loaded=!0,u(i)):x==="alert"?alert(`Thread ${g.fe}: ${g.text}`):g.target==="setimmediate"?i.postMessage(g):x==="callHandler"?r[g.Nd](...g.args):x&&v(`worker sent an unknown command ${x}`)},i.onerror=g=>{throw v(`worker sent an error! ${g.filename}:${g.lineno}: ${g.message}`),g};var c,m=[];for(c of[])r.propertyIsEnumerable(c)&&m.push(c);i.postMessage({yd:"load",Od:m,he:T,ie:C})});function Ho(){var i=new Worker(import.meta.url.startsWith("file:")?new URL("ort.webgpu.bundle.min.mjs",import.meta.url):new URL(import.meta.url),{type:"module",workerData:"em-pthread",name:"em-pthread"});ft.push(i)}var cp=i=>{be();var u=R()[i+52>>>2>>>0];i=R()[i+56>>>2>>>0],Li(u,u-i),oe(u)},pp=(i,u)=>{mt=0,i=Rn(i,u),0>>=0);if(Z()[u.wd+12>>>0]==0){var c=1;Z()[u.wd+12>>>0]=c}return c=0,Z()[u.wd+13>>>0]=c,sr.push(u),Hi(i),qi(i)}var Dt=0,fp=()=>{se(0,0);var i=sr.pop();Gi(i.Gd),Dt=0};class wn{constructor(u){this.Gd=u,this.wd=u-24}}function hp(i){throw Dt||=i>>>0,Dt}var vn=i=>{var u=Dt;if(!u)return Kt(0),0;var c=new wn(u);R()[c.wd+16>>>2>>>0]=u;var m=R()[c.wd+4>>>2>>>0];if(!m)return Kt(0),u;for(var g of i){if(g===0||g===m)break;if(Fi(g,m,c.wd+16))return Kt(g),u}return Kt(m),u};function gp(){return vn([])}function yp(i){return vn([i>>>0])}function bp(i,u){return vn([i>>>0,u>>>0])}var _p=()=>{var i=sr.pop();i||ut("no exception to throw");var u=i.Gd;if(Z()[i.wd+13>>>0]==0){sr.push(i);var c=1;Z()[i.wd+13>>>0]=c,c=0,Z()[i.wd+12>>>0]=c}throw Dt=u};function wp(i,u,c){var m=new wn(i>>>=0);throw u>>>=0,c>>>=0,R()[m.wd+16>>>2>>>0]=0,R()[m.wd+4>>>2>>>0]=u,R()[m.wd+8>>>2>>>0]=c,Dt=i}function Fo(i,u,c,m){return d?Te(2,1,i,u,c,m):qo(i,u,c,m)}function qo(i,u,c,m){if(i>>>=0,c>>>=0,m>>>=0,l===void 0)return 6;var g=[];return d&&g.length===0?Fo(i,u>>>=0,c,m):(i={ce:c,xd:i,Fd:m,Ld:g},d?(i.yd="spawnThread",postMessage(i,g),0):Uo(i))}var Ko=typeof TextDecoder<"u"?new TextDecoder:void 0,jo=(i,u=0,c=NaN)=>{var m=(u>>>=0)+c;for(c=u;i[c]&&!(c>=m);)++c;if(16(g=(240&g)==224?(15&g)<<12|x<<6|I:(7&g)<<18|x<<12|I<<6|63&i[u++])?m+=String.fromCharCode(g):(g-=65536,m+=String.fromCharCode(55296|g>>10,56320|1023&g))}}else m+=String.fromCharCode(g)}return m},Ae=(i,u)=>(i>>>=0)?jo(pe(),i,u):"";function Zo(i,u,c){return d?Te(3,1,i,u,c):0}function Qo(i,u){if(d)return Te(4,1,i,u)}var Yo=i=>{for(var u=0,c=0;c=m?u++:2047>=m?u+=2:55296<=m&&57343>=m?(u+=4,++c):u+=3}return u},Bt=(i,u,c)=>{var m=pe();if(u>>>=0,0=I&&(I=65536+((1023&I)<<10)|1023&i.charCodeAt(++x)),127>=I){if(u>=c)break;m[u++>>>0]=I}else{if(2047>=I){if(u+1>=c)break;m[u++>>>0]=192|I>>6}else{if(65535>=I){if(u+2>=c)break;m[u++>>>0]=224|I>>12}else{if(u+3>=c)break;m[u++>>>0]=240|I>>18,m[u++>>>0]=128|I>>12&63}m[u++>>>0]=128|I>>6&63}m[u++>>>0]=128|63&I}}m[u>>>0]=0,i=u-g}else i=0;return i};function Xo(i,u){if(d)return Te(5,1,i,u)}function Jo(i,u,c){if(d)return Te(6,1,i,u,c)}function ei(i,u,c){return d?Te(7,1,i,u,c):0}function ti(i,u){if(d)return Te(8,1,i,u)}function ri(i,u,c){if(d)return Te(9,1,i,u,c)}function ni(i,u,c,m){if(d)return Te(10,1,i,u,c,m)}function oi(i,u,c,m){if(d)return Te(11,1,i,u,c,m)}function ii(i,u,c,m){if(d)return Te(12,1,i,u,c,m)}function ai(i){if(d)return Te(13,1,i)}function si(i,u){if(d)return Te(14,1,i,u)}function ui(i,u,c){if(d)return Te(15,1,i,u,c)}var di,ht,vp=()=>ut(""),Xe=i=>{for(var u="";pe()[i>>>0];)u+=di[pe()[i++>>>0]];return u},$n={},xn={},$p={};function dt(i,u,c={}){return function(m,g,x={}){var I=g.name;if(!m)throw new ht(`type "${I}" must have a positive integer typeid pointer`);if(xn.hasOwnProperty(m)){if(x.Pd)return;throw new ht(`Cannot register type '${I}' twice`)}xn[m]=g,delete $p[m],$n.hasOwnProperty(m)&&(g=$n[m],delete $n[m],g.forEach(z=>z()))}(i,u,c)}var li=(i,u,c)=>{switch(u){case 1:return c?m=>Z()[m>>>0]:m=>pe()[m>>>0];case 2:return c?m=>ke()[m>>>1>>>0]:m=>Se()[m>>>1>>>0];case 4:return c?m=>D()[m>>>2>>>0]:m=>R()[m>>>2>>>0];case 8:return c?m=>W[m>>>3]:m=>J[m>>>3];default:throw new TypeError(`invalid integer width (${u}): ${i}`)}};function xp(i,u,c){c>>>=0,dt(i>>>=0,{name:u=Xe(u>>>0),fromWireType:m=>m,toWireType:function(m,g){if(typeof g!="bigint"&&typeof g!="number")throw g=g===null?"null":(m=typeof g)=="object"||m==="array"||m==="function"?g.toString():""+g,new TypeError(`Cannot convert "${g}" to ${this.name}`);return typeof g=="number"&&(g=BigInt(g)),g},zd:gt,readValueFromPointer:li(u,c,u.indexOf("u")==-1),Ad:null})}var gt=8;function Sp(i,u,c,m){dt(i>>>=0,{name:u=Xe(u>>>0),fromWireType:function(g){return!!g},toWireType:function(g,x){return x?c:m},zd:gt,readValueFromPointer:function(g){return this.fromWireType(pe()[g>>>0])},Ad:null})}var Sn=[],lt=[];function Tn(i){9<(i>>>=0)&&--lt[i+1]==0&&(lt[i]=void 0,Sn.push(i))}var Re=i=>{if(!i)throw new ht("Cannot use deleted val. handle = "+i);return lt[i]},We=i=>{switch(i){case void 0:return 2;case null:return 4;case!0:return 6;case!1:return 8;default:let u=Sn.pop()||lt.length;return lt[u]=i,lt[u+1]=1,u}};function Cn(i){return this.fromWireType(R()[i>>>2>>>0])}var Tp={name:"emscripten::val",fromWireType:i=>{var u=Re(i);return Tn(i),u},toWireType:(i,u)=>We(u),zd:gt,readValueFromPointer:Cn,Ad:null};function Cp(i){return dt(i>>>0,Tp)}var Ip=(i,u)=>{switch(u){case 4:return function(c){return this.fromWireType(Y()[c>>>2>>>0])};case 8:return function(c){return this.fromWireType(fe()[c>>>3>>>0])};default:throw new TypeError(`invalid float width (${u}): ${i}`)}};function Ap(i,u,c){c>>>=0,dt(i>>>=0,{name:u=Xe(u>>>0),fromWireType:m=>m,toWireType:(m,g)=>g,zd:gt,readValueFromPointer:Ip(u,c),Ad:null})}function kp(i,u,c,m,g){if(i>>>=0,c>>>=0,u=Xe(u>>>0),g===-1&&(g=4294967295),g=z=>z,m===0){var x=32-8*c;g=z=>z<>>x}var I=u.includes("unsigned")?function(z,B){return B>>>0}:function(z,B){return B};dt(i,{name:u,fromWireType:g,toWireType:I,zd:gt,readValueFromPointer:li(u,c,m!==0),Ad:null})}function Ep(i,u,c){function m(x){var I=R()[x>>>2>>>0];return x=R()[x+4>>>2>>>0],new g(Z().buffer,x,I)}var g=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array][u];dt(i>>>=0,{name:c=Xe(c>>>0),fromWireType:m,zd:gt,readValueFromPointer:m},{Pd:!0})}function Pp(i,u){dt(i>>>=0,{name:u=Xe(u>>>0),fromWireType:function(c){for(var m,g=R()[c>>>2>>>0],x=c+4,I=x,z=0;z<=g;++z){var B=x+z;z!=g&&pe()[B>>>0]!=0||(I=Ae(I,B-I),m===void 0?m=I:(m+="\0",m+=I),I=B+1)}return et(c),m},toWireType:function(c,m){m instanceof ArrayBuffer&&(m=new Uint8Array(m));var g=typeof m=="string";if(!(g||m instanceof Uint8Array||m instanceof Uint8ClampedArray||m instanceof Int8Array))throw new ht("Cannot pass non-string to std::string");var x=g?Yo(m):m.length,I=yr(4+x+1),z=I+4;if(R()[I>>>2>>>0]=x,g)Bt(m,z,x+1);else if(g)for(g=0;g>>0]=B}else for(g=0;g>>0]=m[g];return c!==null&&c.push(et,I),I},zd:gt,readValueFromPointer:Cn,Ad(c){et(c)}})}var ci=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0,zp=(i,u)=>{for(var c=i>>1,m=c+u/2;!(c>=m)&&Se()[c>>>0];)++c;if(32<(c<<=1)-i&&ci)return ci.decode(pe().slice(i,c));for(c="",m=0;!(m>=u/2);++m){var g=ke()[i+2*m>>>1>>>0];if(g==0)break;c+=String.fromCharCode(g)}return c},Op=(i,u,c)=>{if(c??=2147483647,2>c)return 0;var m=u;c=(c-=2)<2*i.length?c/2:i.length;for(var g=0;g>>1>>>0]=x,u+=2}return ke()[u>>>1>>>0]=0,u-m},Dp=i=>2*i.length,Bp=(i,u)=>{for(var c=0,m="";!(c>=u/4);){var g=D()[i+4*c>>>2>>>0];if(g==0)break;++c,65536<=g?(g-=65536,m+=String.fromCharCode(55296|g>>10,56320|1023&g)):m+=String.fromCharCode(g)}return m},Mp=(i,u,c)=>{if(u>>>=0,c??=2147483647,4>c)return 0;var m=u;c=m+c-4;for(var g=0;g=x&&(x=65536+((1023&x)<<10)|1023&i.charCodeAt(++g)),D()[u>>>2>>>0]=x,(u+=4)+4>c)break}return D()[u>>>2>>>0]=0,u-m},Rp=i=>{for(var u=0,c=0;c=m&&++c,u+=4}return u};function Up(i,u,c){if(i>>>=0,u>>>=0,c=Xe(c>>>=0),u===2)var m=zp,g=Op,x=Dp,I=z=>Se()[z>>>1>>>0];else u===4&&(m=Bp,g=Mp,x=Rp,I=z=>R()[z>>>2>>>0]);dt(i,{name:c,fromWireType:z=>{for(var B,L=R()[z>>>2>>>0],q=z+4,X=0;X<=L;++X){var ue=z+4+X*u;X!=L&&I(ue)!=0||(q=m(q,ue-q),B===void 0?B=q:(B+="\0",B+=q),q=ue+u)}return et(z),B},toWireType:(z,B)=>{if(typeof B!="string")throw new ht(`Cannot pass non-string to C++ string type ${c}`);var L=x(B),q=yr(4+L+u);return R()[q>>>2>>>0]=L/u,g(B,q+4,L+u),z!==null&&z.push(et,q),q},zd:gt,readValueFromPointer:Cn,Ad(z){et(z)}})}function Np(i,u){dt(i>>>=0,{Qd:!0,name:u=Xe(u>>>0),zd:0,fromWireType:()=>{},toWireType:()=>{}})}function Vp(i){Dn(i>>>0,!s,1,!a,131072,!1),Lo()}var In=i=>{if(!ee)try{if(i(),!(0>>=0,typeof Atomics.ge=="function"&&(Atomics.ge(D(),i>>>2,i).value.then(ur),i+=128,Atomics.store(D(),i>>>2,1))}var ur=()=>{var i=gr();i&&(An(i),In(Wi))};function Wp(i,u){(i>>>=0)==u>>>0?setTimeout(ur):d?postMessage({Ed:i,yd:"checkMailbox"}):(i=St[i])&&i.postMessage({yd:"checkMailbox"})}var kn=[];function Lp(i,u,c,m,g){for(u>>>=0,m/=2,kn.length=m,c=g>>>0>>>3,g=0;g>>0];return(u?hn[u]:Bm[i])(...kn)}var Gp=()=>{mt=0};function Hp(i){i>>>=0,d?postMessage({yd:"cleanupThread",ee:i}):Wo(St[i])}function Fp(i){}var dr=(i,u)=>{var c=xn[i];if(c===void 0)throw i=Bi(i),c=Xe(i),et(i),new ht(`${u} has unknown type ${c}`);return c},pi=(i,u,c)=>{var m=[];return i=i.toWireType(m,c),m.length&&(R()[u>>>2>>>0]=We(m)),i};function qp(i,u,c){return u>>>=0,c>>>=0,i=Re(i>>>0),u=dr(u,"emval::as"),pi(u,c,i)}function Kp(i,u){return u>>>=0,i=Re(i>>>0),(u=dr(u,"emval::as")).toWireType(null,i)}var lr=i=>{try{i()}catch(u){ut(u)}},yt=0,Je=null,mi=0,cr=[],fi={},hi={},jp=0,En=null,Zp=[];function gi(i){return function(u){if(!ee){if(yt===0){var c=!1,m=!1;u((g=0)=>{if(!ee&&(mi=g,c=!0,m)){yt=2,lr(()=>Na(Je)),typeof MainLoop<"u"&&MainLoop.Md&&MainLoop.resume(),g=!1;try{var x=function(){var B=D()[Je+8>>>2>>>0];return B=U[hi[B]],--mt,B()}()}catch(B){x=B,g=!0}var I=!1;if(!Je){var z=En;z&&(En=null,(g?z.reject:z.resolve)(x),I=!0)}if(g&&!I)throw x}}),m=!0,c||(yt=1,Je=function(){var g=yr(65548),x=g+12;R()[g>>>2>>>0]=x,R()[g+4>>>2>>>0]=x+65536,x=cr[0];var I=fi[x];return I===void 0&&(I=jp++,fi[x]=I,hi[I]=x),x=I,D()[g+8>>>2>>>0]=x,g}(),typeof MainLoop<"u"&&MainLoop.Md&&MainLoop.pause(),lr(()=>Ra(Je)))}else yt===2?(yt=0,lr(Va),et(Je),Je=null,Zp.forEach(In)):ut(`invalid state: ${yt}`);return mi}}(u=>{i().then(u)})}function Qp(i){return i>>>=0,gi(async()=>{var u=await Re(i);return We(u)})}var pr=[];function Yp(i,u,c,m){return c>>>=0,m>>>=0,(i=pr[i>>>0])(null,u=Re(u>>>0),c,m)}var Xp={},mr=i=>{var u=Xp[i];return u===void 0?Xe(i):u};function Jp(i,u,c,m,g){return c>>>=0,m>>>=0,g>>>=0,(i=pr[i>>>0])(u=Re(u>>>0),u[c=mr(c)],m,g)}var yi=()=>typeof globalThis=="object"?globalThis:Function("return this")();function em(i){return(i>>>=0)==0?We(yi()):(i=mr(i),We(yi()[i]))}var tm=i=>{var u=pr.length;return pr.push(i),u},rm=(i,u)=>{for(var c=Array(i),m=0;m>>2>>>0],"parameter "+m);return c},bi=(i,u)=>Object.defineProperty(u,"name",{value:i});function nm(i,u,c){var m=(u=rm(i,u>>>0)).shift();i--;var g=`return function (obj, func, destructorsRef, args) { +`,x=0,I=[];c===0&&I.push("obj");for(var z=["retType"],B=[m],L=0;Lq.name).join(", ")}) => ${m.name}>`,tm(bi(c,i))}function om(i){return i=mr(i>>>0),We(r[i])}function im(i,u){return u>>>=0,i=Re(i>>>0),u=Re(u),We(i[u])}function am(i){9<(i>>>=0)&&(lt[i+1]+=1)}function sm(){return We([])}function um(i){i=Re(i>>>0);for(var u=Array(i.length),c=0;c>>0))}function lm(){return We({})}function cm(i){for(var u=Re(i>>>=0);u.length;){var c=u.pop();u.pop()(c)}Tn(i)}function pm(i,u,c){u>>>=0,c>>>=0,i=Re(i>>>0),u=Re(u),c=Re(c),i[u]=c}function mm(i,u){return u>>>=0,i=(i=dr(i>>>0,"_emval_take_value")).readValueFromPointer(u),We(i)}function fm(i,u){i=-9007199254740992>i||9007199254740992>>=0,i=new Date(1e3*i),D()[u>>>2>>>0]=i.getUTCSeconds(),D()[u+4>>>2>>>0]=i.getUTCMinutes(),D()[u+8>>>2>>>0]=i.getUTCHours(),D()[u+12>>>2>>>0]=i.getUTCDate(),D()[u+16>>>2>>>0]=i.getUTCMonth(),D()[u+20>>>2>>>0]=i.getUTCFullYear()-1900,D()[u+24>>>2>>>0]=i.getUTCDay(),i=(i.getTime()-Date.UTC(i.getUTCFullYear(),0,1,0,0,0,0))/864e5|0,D()[u+28>>>2>>>0]=i}var _i=i=>i%4==0&&(i%100!=0||i%400==0),wi=[0,31,60,91,121,152,182,213,244,274,305,335],vi=[0,31,59,90,120,151,181,212,243,273,304,334];function hm(i,u){i=-9007199254740992>i||9007199254740992>>=0,i=new Date(1e3*i),D()[u>>>2>>>0]=i.getSeconds(),D()[u+4>>>2>>>0]=i.getMinutes(),D()[u+8>>>2>>>0]=i.getHours(),D()[u+12>>>2>>>0]=i.getDate(),D()[u+16>>>2>>>0]=i.getMonth(),D()[u+20>>>2>>>0]=i.getFullYear()-1900,D()[u+24>>>2>>>0]=i.getDay();var c=(_i(i.getFullYear())?wi:vi)[i.getMonth()]+i.getDate()-1|0;D()[u+28>>>2>>>0]=c,D()[u+36>>>2>>>0]=-60*i.getTimezoneOffset(),c=new Date(i.getFullYear(),6,1).getTimezoneOffset();var m=new Date(i.getFullYear(),0,1).getTimezoneOffset();i=0|(c!=m&&i.getTimezoneOffset()==Math.min(m,c)),D()[u+32>>>2>>>0]=i}function gm(i){i>>>=0;var u=new Date(D()[i+20>>>2>>>0]+1900,D()[i+16>>>2>>>0],D()[i+12>>>2>>>0],D()[i+8>>>2>>>0],D()[i+4>>>2>>>0],D()[i>>>2>>>0],0),c=D()[i+32>>>2>>>0],m=u.getTimezoneOffset(),g=new Date(u.getFullYear(),6,1).getTimezoneOffset(),x=new Date(u.getFullYear(),0,1).getTimezoneOffset(),I=Math.min(x,g);return 0>c?D()[i+32>>>2>>>0]=+(g!=x&&I==m):0>>2>>>0]=u.getDay(),c=(_i(u.getFullYear())?wi:vi)[u.getMonth()]+u.getDate()-1|0,D()[i+28>>>2>>>0]=c,D()[i>>>2>>>0]=u.getSeconds(),D()[i+4>>>2>>>0]=u.getMinutes(),D()[i+8>>>2>>>0]=u.getHours(),D()[i+12>>>2>>>0]=u.getDate(),D()[i+16>>>2>>>0]=u.getMonth(),D()[i+20>>>2>>>0]=u.getYear(),i=u.getTime(),BigInt(isNaN(i)?-1:i/1e3)}function $i(i,u,c,m,g,x,I){return d?Te(16,1,i,u,c,m,g,x,I):-52}function xi(i,u,c,m,g,x){if(d)return Te(17,1,i,u,c,m,g,x)}var qt={},ym=()=>performance.timeOrigin+performance.now();function Si(i,u){if(d)return Te(18,1,i,u);if(qt[i]&&(clearTimeout(qt[i].id),delete qt[i]),!u)return 0;var c=setTimeout(()=>{delete qt[i],In(()=>Vi(i,performance.timeOrigin+performance.now()))},u);return qt[i]={id:c,ke:u},0}function bm(i,u,c,m){i>>>=0,u>>>=0,c>>>=0,m>>>=0;var g=new Date().getFullYear(),x=new Date(g,0,1).getTimezoneOffset();g=new Date(g,6,1).getTimezoneOffset();var I=Math.max(x,g);R()[i>>>2>>>0]=60*I,D()[u>>>2>>>0]=+(x!=g),i=(u=z=>{var B=Math.abs(z);return`UTC${0<=z?"-":"+"}${String(Math.floor(B/60)).padStart(2,"0")}${String(B%60).padStart(2,"0")}`})(x),u=u(g),gDate.now(),wm=1;function vm(i,u,c){if(!(0<=i&&3>=i))return 28;if(i===0)i=Date.now();else{if(!wm)return 52;i=performance.timeOrigin+performance.now()}return W[c>>>0>>>3]=BigInt(Math.round(1e6*i)),0}var Pn=[],Ti=(i,u)=>{Pn.length=0;for(var c;c=pe()[i++>>>0];){var m=c!=105;u+=(m&=c!=112)&&u%8?4:0,Pn.push(c==112?R()[u>>>2>>>0]:c==106?W[u>>>3]:c==105?D()[u>>>2>>>0]:fe()[u>>>3>>>0]),u+=m?8:4}return Pn};function $m(i,u,c){return i>>>=0,u=Ti(u>>>0,c>>>0),hn[i](...u)}function xm(i,u,c){return i>>>=0,u=Ti(u>>>0,c>>>0),hn[i](...u)}var Sm=()=>{};function Tm(i,u){return v(Ae(i>>>0,u>>>0))}var Cm=()=>{throw mt+=1,"unwind"};function Im(){return 4294901760}var Am=()=>navigator.hardwareConcurrency;function km(){return ut("Cannot use emscripten_pc_get_function without -sUSE_OFFSET_CONVERTER"),0}function Em(i){i>>>=0;var u=pe().length;if(i<=u||4294901760=c;c*=2){var m=u*(1+.2/c);m=Math.min(m,i+100663296);e:{m=(Math.min(4294901760,65536*Math.ceil(Math.max(i,m)/65536))-T.buffer.byteLength+65535)/65536|0;try{T.grow(m),be();var g=1;break e}catch{}g=void 0}if(g)return!0}return!1}var fr=()=>(ut("Cannot use convertFrameToPC (needed by __builtin_return_address) without -sUSE_OFFSET_CONVERTER"),0),Mt={},Ci=i=>{i.forEach(u=>{var c=fr();c&&(Mt[c]=u)})};function Pm(){var i=Error().stack.toString().split(` +`);return i[0]=="Error"&&i.shift(),Ci(i),Mt.Kd=fr(),Mt.ae=i,Mt.Kd}function zm(i,u,c){if(i>>>=0,u>>>=0,Mt.Kd==i)var m=Mt.ae;else(m=Error().stack.toString().split(` +`))[0]=="Error"&&m.shift(),Ci(m);for(var g=3;m[g]&&fr()!=i;)++g;for(i=0;i>>2>>>0]=fr();return i}var zn,On={},Ii=()=>{if(!zn){var i,u={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:"./this.program"};for(i in On)On[i]===void 0?delete u[i]:u[i]=On[i];var c=[];for(i in u)c.push(`${i}=${u[i]}`);zn=c}return zn};function Ai(i,u){if(d)return Te(19,1,i,u);i>>>=0,u>>>=0;var c=0;return Ii().forEach((m,g)=>{var x=u+c;for(g=R()[i+4*g>>>2>>>0]=x,x=0;x>>0]=m.charCodeAt(x);Z()[g>>>0]=0,c+=m.length+1}),0}function ki(i,u){if(d)return Te(20,1,i,u);i>>>=0,u>>>=0;var c=Ii();R()[i>>>2>>>0]=c.length;var m=0;return c.forEach(g=>m+=g.length+1),R()[u>>>2>>>0]=m,0}function Ei(i){return d?Te(21,1,i):52}function Pi(i,u,c,m){return d?Te(22,1,i,u,c,m):52}function zi(i,u,c,m){return d?Te(23,1,i,u,c,m):70}var Om=[null,[],[]];function Oi(i,u,c,m){if(d)return Te(24,1,i,u,c,m);u>>>=0,c>>>=0,m>>>=0;for(var g=0,x=0;x>>2>>>0],z=R()[u+4>>>2>>>0];u+=8;for(var B=0;B>>0],q=Om[i];L===0||L===10?((i===1?$:v)(jo(q)),q.length=0):q.push(L)}g+=z}return R()[m>>>2>>>0]=g,0}function Dm(i){return i>>>0}d||function(){for(var i=r.numThreads-1;i--;)Ho();yn.unshift(()=>{xt++,function(u){d?u():Promise.all(ft.map(Go)).then(u)}(()=>Bo())})}();for(var Di=Array(256),hr=0;256>hr;++hr)Di[hr]=String.fromCharCode(hr);di=Di,ht=r.BindingError=class extends Error{constructor(i){super(i),this.name="BindingError"}},r.InternalError=class extends Error{constructor(i){super(i),this.name="InternalError"}},lt.push(0,1,void 0,1,null,1,!0,1,!1,1),r.count_emval_handles=()=>lt.length/2-5-Sn.length;var U,Bm=[bn,No,Fo,Zo,Qo,Xo,Jo,ei,ti,ri,ni,oi,ii,ai,si,ui,$i,xi,Si,Ai,ki,Ei,Pi,zi,Oi];(async function(){function i(m,g){return U=m.exports,U=function(){var x=U,I={};for(let[z,B]of Object.entries(x))I[z]=typeof B=="function"?(...L)=>{cr.push(z);try{return B(...L)}finally{ee||(cr.pop(),Je&&yt===1&&cr.length===0&&(yt=0,mt+=1,lr(Ua),typeof Fibers<"u"&&Fibers.le()))}}:B;return I}(),U=function(){var x=U,I=B=>L=>B(L)>>>0,z=B=>()=>B()>>>0;return(x=Object.assign({},x)).Cb=I(x.Cb),x.fc=z(x.fc),x.ic=I(x.ic),x.vc=I(x.vc),x.wc=z(x.wc),x.Ac=I(x.Ac),x}(),Vo.push(U.jc),C=g,Bo(),U}xt++;var u=Mo();if(r.instantiateWasm)return new Promise(m=>{r.instantiateWasm(u,(g,x)=>{i(g,x),m(g.exports)})});if(d)return new Promise(m=>{Fe=g=>{var x=new WebAssembly.Instance(g,Mo());m(i(x,g))}});Gt??=r.locateFile?r.locateFile?r.locateFile("ort-wasm-simd-threaded.jsep.wasm",b):b+"ort-wasm-simd-threaded.jsep.wasm":new URL("ort-wasm-simd-threaded.jsep.wasm",import.meta.url).href;try{var c=await async function(m){var g=Gt;if(!Q&&typeof WebAssembly.instantiateStreaming=="function"&&!le(g))try{var x=fetch(g,{credentials:"same-origin"});return await WebAssembly.instantiateStreaming(x,m)}catch(I){v(`wasm streaming compile failed: ${I}`),v("falling back to ArrayBuffer instantiation")}return async function(I,z){try{var B=await async function(L){if(!Q)try{var q=await f(L);return new Uint8Array(q)}catch{}if(L==Gt&&Q)L=new Uint8Array(Q);else{if(!h)throw"both async and sync fetching of the wasm failed";L=h(L)}return L}(I);return await WebAssembly.instantiate(B,z)}catch(L){v(`failed to asynchronously prepare wasm: ${L}`),ut(L)}}(g,m)}(u);return i(c.instance,c.module)}catch(m){return n(m),Promise.reject(m)}})();var Bi=i=>(Bi=U.Cb)(i),Mi=()=>(Mi=U.Db)();r._OrtInit=(i,u)=>(r._OrtInit=U.Eb)(i,u),r._OrtGetLastError=(i,u)=>(r._OrtGetLastError=U.Fb)(i,u),r._OrtCreateSessionOptions=(i,u,c,m,g,x,I,z,B,L)=>(r._OrtCreateSessionOptions=U.Gb)(i,u,c,m,g,x,I,z,B,L),r._OrtAppendExecutionProvider=(i,u)=>(r._OrtAppendExecutionProvider=U.Hb)(i,u),r._OrtAddFreeDimensionOverride=(i,u,c)=>(r._OrtAddFreeDimensionOverride=U.Ib)(i,u,c),r._OrtAddSessionConfigEntry=(i,u,c)=>(r._OrtAddSessionConfigEntry=U.Jb)(i,u,c),r._OrtReleaseSessionOptions=i=>(r._OrtReleaseSessionOptions=U.Kb)(i),r._OrtCreateSession=(i,u,c)=>(r._OrtCreateSession=U.Lb)(i,u,c),r._OrtReleaseSession=i=>(r._OrtReleaseSession=U.Mb)(i),r._OrtGetInputOutputCount=(i,u,c)=>(r._OrtGetInputOutputCount=U.Nb)(i,u,c),r._OrtGetInputName=(i,u)=>(r._OrtGetInputName=U.Ob)(i,u),r._OrtGetOutputName=(i,u)=>(r._OrtGetOutputName=U.Pb)(i,u),r._OrtFree=i=>(r._OrtFree=U.Qb)(i),r._OrtCreateTensor=(i,u,c,m,g,x)=>(r._OrtCreateTensor=U.Rb)(i,u,c,m,g,x),r._OrtGetTensorData=(i,u,c,m,g)=>(r._OrtGetTensorData=U.Sb)(i,u,c,m,g),r._OrtReleaseTensor=i=>(r._OrtReleaseTensor=U.Tb)(i),r._OrtCreateRunOptions=(i,u,c,m)=>(r._OrtCreateRunOptions=U.Ub)(i,u,c,m),r._OrtAddRunConfigEntry=(i,u,c)=>(r._OrtAddRunConfigEntry=U.Vb)(i,u,c),r._OrtReleaseRunOptions=i=>(r._OrtReleaseRunOptions=U.Wb)(i),r._OrtCreateBinding=i=>(r._OrtCreateBinding=U.Xb)(i),r._OrtBindInput=(i,u,c)=>(r._OrtBindInput=U.Yb)(i,u,c),r._OrtBindOutput=(i,u,c,m)=>(r._OrtBindOutput=U.Zb)(i,u,c,m),r._OrtClearBoundOutputs=i=>(r._OrtClearBoundOutputs=U._b)(i),r._OrtReleaseBinding=i=>(r._OrtReleaseBinding=U.$b)(i),r._OrtRunWithBinding=(i,u,c,m,g)=>(r._OrtRunWithBinding=U.ac)(i,u,c,m,g),r._OrtRun=(i,u,c,m,g,x,I,z)=>(r._OrtRun=U.bc)(i,u,c,m,g,x,I,z),r._OrtEndProfiling=i=>(r._OrtEndProfiling=U.cc)(i),r._JsepOutput=(i,u,c)=>(r._JsepOutput=U.dc)(i,u,c),r._JsepGetNodeName=i=>(r._JsepGetNodeName=U.ec)(i);var gr=()=>(gr=U.fc)(),et=r._free=i=>(et=r._free=U.gc)(i),yr=r._malloc=i=>(yr=r._malloc=U.ic)(i),Dn=(i,u,c,m,g,x)=>(Dn=U.kc)(i,u,c,m,g,x),Ri=()=>(Ri=U.lc)(),Ui=(i,u,c,m,g)=>(Ui=U.mc)(i,u,c,m,g),Ni=i=>(Ni=U.nc)(i),Bn=i=>(Bn=U.oc)(i),Vi=(i,u)=>(Vi=U.pc)(i,u),Wi=()=>(Wi=U.qc)(),se=(i,u)=>(se=U.rc)(i,u),Kt=i=>(Kt=U.sc)(i),Li=(i,u)=>(Li=U.tc)(i,u),oe=i=>(oe=U.uc)(i),Mn=i=>(Mn=U.vc)(i),ie=()=>(ie=U.wc)(),Gi=i=>(Gi=U.xc)(i),Hi=i=>(Hi=U.yc)(i),Fi=(i,u,c)=>(Fi=U.zc)(i,u,c),qi=i=>(qi=U.Ac)(i),Ki=r.dynCall_iii=(i,u,c)=>(Ki=r.dynCall_iii=U.Bc)(i,u,c),ji=r.dynCall_vi=(i,u)=>(ji=r.dynCall_vi=U.Cc)(i,u),Rn=r.dynCall_ii=(i,u)=>(Rn=r.dynCall_ii=U.Dc)(i,u),Zi=r.dynCall_vii=(i,u,c)=>(Zi=r.dynCall_vii=U.Ec)(i,u,c),Qi=r.dynCall_iiii=(i,u,c,m)=>(Qi=r.dynCall_iiii=U.Fc)(i,u,c,m),Yi=r.dynCall_viii=(i,u,c,m)=>(Yi=r.dynCall_viii=U.Gc)(i,u,c,m),Xi=r.dynCall_iiiii=(i,u,c,m,g)=>(Xi=r.dynCall_iiiii=U.Hc)(i,u,c,m,g),Ji=r.dynCall_viiii=(i,u,c,m,g)=>(Ji=r.dynCall_viiii=U.Ic)(i,u,c,m,g),ea=r.dynCall_viiiiii=(i,u,c,m,g,x,I)=>(ea=r.dynCall_viiiiii=U.Jc)(i,u,c,m,g,x,I),ta=r.dynCall_viiiiiii=(i,u,c,m,g,x,I,z)=>(ta=r.dynCall_viiiiiii=U.Kc)(i,u,c,m,g,x,I,z),ra=r.dynCall_ji=(i,u)=>(ra=r.dynCall_ji=U.Lc)(i,u),na=r.dynCall_v=i=>(na=r.dynCall_v=U.Mc)(i),oa=r.dynCall_viiiii=(i,u,c,m,g,x)=>(oa=r.dynCall_viiiii=U.Nc)(i,u,c,m,g,x),ia=r.dynCall_i=i=>(ia=r.dynCall_i=U.Oc)(i),aa=r.dynCall_fii=(i,u,c)=>(aa=r.dynCall_fii=U.Pc)(i,u,c),sa=r.dynCall_viiiiiiii=(i,u,c,m,g,x,I,z,B)=>(sa=r.dynCall_viiiiiiii=U.Qc)(i,u,c,m,g,x,I,z,B),ua=r.dynCall_viiiiiiiiii=(i,u,c,m,g,x,I,z,B,L,q)=>(ua=r.dynCall_viiiiiiiiii=U.Rc)(i,u,c,m,g,x,I,z,B,L,q),da=r.dynCall_jiii=(i,u,c,m)=>(da=r.dynCall_jiii=U.Sc)(i,u,c,m),la=r.dynCall_dii=(i,u,c)=>(la=r.dynCall_dii=U.Tc)(i,u,c),ca=r.dynCall_viiiiiiiii=(i,u,c,m,g,x,I,z,B,L)=>(ca=r.dynCall_viiiiiiiii=U.Uc)(i,u,c,m,g,x,I,z,B,L),pa=r.dynCall_viiiiiiiiiii=(i,u,c,m,g,x,I,z,B,L,q,X)=>(pa=r.dynCall_viiiiiiiiiii=U.Vc)(i,u,c,m,g,x,I,z,B,L,q,X),ma=r.dynCall_iiiiii=(i,u,c,m,g,x)=>(ma=r.dynCall_iiiiii=U.Wc)(i,u,c,m,g,x),fa=r.dynCall_iij=(i,u,c)=>(fa=r.dynCall_iij=U.Xc)(i,u,c),ha=r.dynCall_iiiiiiiiii=(i,u,c,m,g,x,I,z,B,L)=>(ha=r.dynCall_iiiiiiiiii=U.Yc)(i,u,c,m,g,x,I,z,B,L),ga=r.dynCall_iiiiiiiiiii=(i,u,c,m,g,x,I,z,B,L,q)=>(ga=r.dynCall_iiiiiiiiiii=U.Zc)(i,u,c,m,g,x,I,z,B,L,q),ya=r.dynCall_vij=(i,u,c)=>(ya=r.dynCall_vij=U._c)(i,u,c),ba=r.dynCall_iiif=(i,u,c,m)=>(ba=r.dynCall_iiif=U.$c)(i,u,c,m),_a=r.dynCall_iiij=(i,u,c,m)=>(_a=r.dynCall_iiij=U.ad)(i,u,c,m),wa=r.dynCall_fiii=(i,u,c,m)=>(wa=r.dynCall_fiii=U.bd)(i,u,c,m),va=r.dynCall_viiiiiiiiiiiii=(i,u,c,m,g,x,I,z,B,L,q,X,ue,$e)=>(va=r.dynCall_viiiiiiiiiiiii=U.cd)(i,u,c,m,g,x,I,z,B,L,q,X,ue,$e),$a=r.dynCall_vjiii=(i,u,c,m,g)=>($a=r.dynCall_vjiii=U.dd)(i,u,c,m,g),xa=r.dynCall_vif=(i,u,c)=>(xa=r.dynCall_vif=U.ed)(i,u,c),Sa=r.dynCall_iiiiiii=(i,u,c,m,g,x,I)=>(Sa=r.dynCall_iiiiiii=U.fd)(i,u,c,m,g,x,I),Ta=r.dynCall_iiiij=(i,u,c,m,g)=>(Ta=r.dynCall_iiiij=U.gd)(i,u,c,m,g),Ca=r.dynCall_iiiiiiii=(i,u,c,m,g,x,I,z)=>(Ca=r.dynCall_iiiiiiii=U.hd)(i,u,c,m,g,x,I,z),Ia=r.dynCall_viiiiiiiiiiii=(i,u,c,m,g,x,I,z,B,L,q,X,ue)=>(Ia=r.dynCall_viiiiiiiiiiii=U.id)(i,u,c,m,g,x,I,z,B,L,q,X,ue),Aa=r.dynCall_diii=(i,u,c,m)=>(Aa=r.dynCall_diii=U.jd)(i,u,c,m),ka=r.dynCall_jiiii=(i,u,c,m,g)=>(ka=r.dynCall_jiiii=U.kd)(i,u,c,m,g),Ea=r.dynCall_viiij=(i,u,c,m,g)=>(Ea=r.dynCall_viiij=U.ld)(i,u,c,m,g),Pa=r.dynCall_fiiii=(i,u,c,m,g)=>(Pa=r.dynCall_fiiii=U.md)(i,u,c,m,g),za=r.dynCall_viiif=(i,u,c,m,g)=>(za=r.dynCall_viiif=U.nd)(i,u,c,m,g),Oa=r.dynCall_diiii=(i,u,c,m,g)=>(Oa=r.dynCall_diiii=U.od)(i,u,c,m,g),Da=r.dynCall_viiid=(i,u,c,m,g)=>(Da=r.dynCall_viiid=U.pd)(i,u,c,m,g),Ba=r.dynCall_iiiijii=(i,u,c,m,g,x,I)=>(Ba=r.dynCall_iiiijii=U.qd)(i,u,c,m,g,x,I),Ma=r.dynCall_iiiiiij=(i,u,c,m,g,x,I)=>(Ma=r.dynCall_iiiiiij=U.rd)(i,u,c,m,g,x,I),Ra=i=>(Ra=U.sd)(i),Ua=()=>(Ua=U.td)(),Na=i=>(Na=U.ud)(i),Va=()=>(Va=U.vd)();function Mm(i,u,c){var m=ie();try{Zi(i,u,c)}catch(g){if(oe(m),g!==g+0)throw g;se(1,0)}}function Rm(i,u,c){var m=ie();try{return Ki(i,u,c)}catch(g){if(oe(m),g!==g+0)throw g;se(1,0)}}function Um(i,u){var c=ie();try{ji(i,u)}catch(m){if(oe(c),m!==m+0)throw m;se(1,0)}}function Nm(i,u){var c=ie();try{return Rn(i,u)}catch(m){if(oe(c),m!==m+0)throw m;se(1,0)}}function Vm(i,u,c,m){var g=ie();try{return Qi(i,u,c,m)}catch(x){if(oe(g),x!==x+0)throw x;se(1,0)}}function Wm(i,u,c,m,g){var x=ie();try{Ji(i,u,c,m,g)}catch(I){if(oe(x),I!==I+0)throw I;se(1,0)}}function Lm(i,u,c,m,g){var x=ie();try{return Xi(i,u,c,m,g)}catch(I){if(oe(x),I!==I+0)throw I;se(1,0)}}function Gm(i,u,c,m){var g=ie();try{Yi(i,u,c,m)}catch(x){if(oe(g),x!==x+0)throw x;se(1,0)}}function Hm(i,u,c,m,g,x,I){var z=ie();try{return Sa(i,u,c,m,g,x,I)}catch(B){if(oe(z),B!==B+0)throw B;se(1,0)}}function Fm(i){var u=ie();try{na(i)}catch(c){if(oe(u),c!==c+0)throw c;se(1,0)}}function qm(i,u,c){var m=ie();try{return fa(i,u,c)}catch(g){if(oe(m),g!==g+0)throw g;se(1,0)}}function Km(i,u,c,m,g,x){var I=ie();try{oa(i,u,c,m,g,x)}catch(z){if(oe(I),z!==z+0)throw z;se(1,0)}}function jm(i,u,c){var m=ie();try{ya(i,u,c)}catch(g){if(oe(m),g!==g+0)throw g;se(1,0)}}function Zm(i,u,c,m,g,x,I){var z=ie();try{ea(i,u,c,m,g,x,I)}catch(B){if(oe(z),B!==B+0)throw B;se(1,0)}}function Qm(i,u,c,m,g,x,I,z){var B=ie();try{ta(i,u,c,m,g,x,I,z)}catch(L){if(oe(B),L!==L+0)throw L;se(1,0)}}function Ym(i,u,c,m,g,x){var I=ie();try{return ma(i,u,c,m,g,x)}catch(z){if(oe(I),z!==z+0)throw z;se(1,0)}}function Xm(i,u,c,m,g,x,I,z){var B=ie();try{return Ca(i,u,c,m,g,x,I,z)}catch(L){if(oe(B),L!==L+0)throw L;se(1,0)}}function Jm(i,u,c,m,g,x,I,z,B,L){var q=ie();try{ca(i,u,c,m,g,x,I,z,B,L)}catch(X){if(oe(q),X!==X+0)throw X;se(1,0)}}function ef(i,u,c,m,g,x,I,z,B){var L=ie();try{sa(i,u,c,m,g,x,I,z,B)}catch(q){if(oe(L),q!==q+0)throw q;se(1,0)}}function tf(i){var u=ie();try{return ia(i)}catch(c){if(oe(u),c!==c+0)throw c;se(1,0)}}function rf(i,u,c,m,g,x,I,z,B,L){var q=ie();try{return ha(i,u,c,m,g,x,I,z,B,L)}catch(X){if(oe(q),X!==X+0)throw X;se(1,0)}}function nf(i,u,c){var m=ie();try{return aa(i,u,c)}catch(g){if(oe(m),g!==g+0)throw g;se(1,0)}}function of(i,u,c,m){var g=ie();try{return da(i,u,c,m)}catch(x){if(oe(g),x!==x+0)throw x;return se(1,0),0n}}function af(i,u,c){var m=ie();try{return la(i,u,c)}catch(g){if(oe(m),g!==g+0)throw g;se(1,0)}}function sf(i,u,c,m,g,x,I,z,B,L,q,X){var ue=ie();try{pa(i,u,c,m,g,x,I,z,B,L,q,X)}catch($e){if(oe(ue),$e!==$e+0)throw $e;se(1,0)}}function uf(i,u,c,m,g,x,I,z,B,L,q){var X=ie();try{ua(i,u,c,m,g,x,I,z,B,L,q)}catch(ue){if(oe(X),ue!==ue+0)throw ue;se(1,0)}}function df(i,u,c,m,g,x,I,z,B,L,q){var X=ie();try{return ga(i,u,c,m,g,x,I,z,B,L,q)}catch(ue){if(oe(X),ue!==ue+0)throw ue;se(1,0)}}function lf(i,u,c,m){var g=ie();try{return ba(i,u,c,m)}catch(x){if(oe(g),x!==x+0)throw x;se(1,0)}}function cf(i,u,c,m){var g=ie();try{return _a(i,u,c,m)}catch(x){if(oe(g),x!==x+0)throw x;se(1,0)}}function pf(i,u,c,m){var g=ie();try{return wa(i,u,c,m)}catch(x){if(oe(g),x!==x+0)throw x;se(1,0)}}function mf(i,u,c,m,g,x,I,z,B,L,q,X,ue,$e){var Le=ie();try{va(i,u,c,m,g,x,I,z,B,L,q,X,ue,$e)}catch(jt){if(oe(Le),jt!==jt+0)throw jt;se(1,0)}}function ff(i,u,c,m,g){var x=ie();try{$a(i,u,c,m,g)}catch(I){if(oe(x),I!==I+0)throw I;se(1,0)}}function hf(i,u,c){var m=ie();try{xa(i,u,c)}catch(g){if(oe(m),g!==g+0)throw g;se(1,0)}}function gf(i,u){var c=ie();try{return ra(i,u)}catch(m){if(oe(c),m!==m+0)throw m;return se(1,0),0n}}function yf(i,u,c,m,g){var x=ie();try{return Ta(i,u,c,m,g)}catch(I){if(oe(x),I!==I+0)throw I;se(1,0)}}function bf(i,u,c,m,g,x,I,z,B,L,q,X,ue){var $e=ie();try{Ia(i,u,c,m,g,x,I,z,B,L,q,X,ue)}catch(Le){if(oe($e),Le!==Le+0)throw Le;se(1,0)}}function _f(i,u,c,m){var g=ie();try{return Aa(i,u,c,m)}catch(x){if(oe(g),x!==x+0)throw x;se(1,0)}}function wf(i,u,c,m,g){var x=ie();try{return ka(i,u,c,m,g)}catch(I){if(oe(x),I!==I+0)throw I;return se(1,0),0n}}function vf(i,u,c,m,g){var x=ie();try{Ea(i,u,c,m,g)}catch(I){if(oe(x),I!==I+0)throw I;se(1,0)}}function $f(i,u,c,m,g){var x=ie();try{return Pa(i,u,c,m,g)}catch(I){if(oe(x),I!==I+0)throw I;se(1,0)}}function xf(i,u,c,m,g){var x=ie();try{za(i,u,c,m,g)}catch(I){if(oe(x),I!==I+0)throw I;se(1,0)}}function Sf(i,u,c,m,g){var x=ie();try{return Oa(i,u,c,m,g)}catch(I){if(oe(x),I!==I+0)throw I;se(1,0)}}function Tf(i,u,c,m,g){var x=ie();try{Da(i,u,c,m,g)}catch(I){if(oe(x),I!==I+0)throw I;se(1,0)}}function Cf(i,u,c,m,g,x,I){var z=ie();try{return Ba(i,u,c,m,g,x,I)}catch(B){if(oe(z),B!==B+0)throw B;se(1,0)}}function If(i,u,c,m,g,x,I){var z=ie();try{return Ma(i,u,c,m,g,x,I)}catch(B){if(oe(z),B!==B+0)throw B;se(1,0)}}return r.stackSave=()=>ie(),r.stackRestore=i=>oe(i),r.stackAlloc=i=>Mn(i),r.setValue=function(i,u,c="i8"){switch(c.endsWith("*")&&(c="*"),c){case"i1":case"i8":Z()[i>>>0]=u;break;case"i16":ke()[i>>>1>>>0]=u;break;case"i32":D()[i>>>2>>>0]=u;break;case"i64":W[i>>>3]=BigInt(u);break;case"float":Y()[i>>>2>>>0]=u;break;case"double":fe()[i>>>3>>>0]=u;break;case"*":R()[i>>>2>>>0]=u;break;default:ut(`invalid type for setValue: ${c}`)}},r.getValue=function(i,u="i8"){switch(u.endsWith("*")&&(u="*"),u){case"i1":case"i8":return Z()[i>>>0];case"i16":return ke()[i>>>1>>>0];case"i32":return D()[i>>>2>>>0];case"i64":return W[i>>>3];case"float":return Y()[i>>>2>>>0];case"double":return fe()[i>>>3>>>0];case"*":return R()[i>>>2>>>0];default:ut(`invalid type for getValue: ${u}`)}},r.UTF8ToString=Ae,r.stringToUTF8=Bt,r.lengthBytesUTF8=Yo,function i(){if(0{"use strict";xr();Ts=typeof location>"u"?void 0:location.origin,Rf=()=>{if(!!1)return import.meta.url?.startsWith("file:")?new URL(new URL("ort.webgpu.bundle.min.mjs",import.meta.url).href,Ts).href:import.meta.url},Ve=Rf(),Cs=()=>{if(Ve&&!Ve.startsWith("blob:"))return Ve.substring(0,Ve.lastIndexOf("/")+1)},jn=(e,t)=>{try{let n=t??Ve;return(n?new URL(e,n):new URL(e)).origin===Ts}catch{return!1}},Uf=(e,t)=>{let n=t??Ve;try{return(n?new URL(e,n):new URL(e)).href}catch{return}},Nf=(e,t)=>`${t??"./"}${e}`,Is=async e=>{let n=await(await fetch(e,{credentials:"same-origin"})).blob();return URL.createObjectURL(n)},Vf=async e=>(await import(/*webpackIgnore:true*/e)).default,xs=(_s(),br(bs)).default,As=async()=>{if(!Ve)throw new Error("Failed to load proxy worker: cannot determine the script source URL.");if(jn(Ve))return[void 0,xs()];let e=await Is(Ve);return[e,xs(e)]},Ss=($s(),br(vs)).default,ks=async(e,t,n)=>{if(!e&&!t&&Ss&&Ve&&jn(Ve))return[void 0,Ss];{let r="ort-wasm-simd-threaded.jsep.mjs",o=e??Uf(r,t),a=!!1&&n&&o&&!jn(o,t),s=a?await Is(o):o??Nf(r,t);return[a?s:void 0,await Vf(s)]}}});var Zn,Qn,Or,Es,Wf,Lf,Tr,Ie,bt=G(()=>{"use strict";Sr();Qn=!1,Or=!1,Es=!1,Wf=()=>{if(typeof SharedArrayBuffer>"u")return!1;try{return typeof MessageChannel<"u"&&new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch{return!1}},Lf=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,30,1,28,0,65,0,253,15,253,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,186,1,26,11]))}catch{return!1}},Tr=async e=>{if(Qn)return Promise.resolve();if(Or)throw new Error("multiple calls to 'initializeWebAssembly()' detected.");if(Es)throw new Error("previous call to 'initializeWebAssembly()' failed.");Or=!0;let t=e.initTimeout,n=e.numThreads;if(!Lf())throw new Error("WebAssembly SIMD is not supported in the current environment.");let r=Wf();n>1&&!r&&(typeof self<"u"&&!self.crossOriginIsolated&&console.warn("env.wasm.numThreads is set to "+n+", but this will not work unless you enable crossOriginIsolated mode. See https://web.dev/cross-origin-isolation-guide/ for more info."),console.warn("WebAssembly multi-threading is not supported in the current environment. Falling back to single-threading."),e.numThreads=n=1);let o=e.wasmPaths,a=typeof o=="string"?o:void 0,s=o?.mjs,d=s?.href??s,l=o?.wasm,p=l?.href??l,f=e.wasmBinary,[h,y]=await ks(d,a,n>1),_=!1,b=[];if(t>0&&b.push(new Promise(w=>{setTimeout(()=>{_=!0,w()},t)})),b.push(new Promise((w,S)=>{let $={numThreads:n};if(f)$.wasmBinary=f;else if(p||a)$.locateFile=v=>p??a+v;else if(d&&d.indexOf("blob:")!==0)$.locateFile=v=>new URL(v,d).href;else if(h){let v=Cs();v&&($.locateFile=T=>v+T)}y($).then(v=>{Or=!1,Qn=!0,Zn=v,w(),h&&URL.revokeObjectURL(h)},v=>{Or=!1,Es=!0,S(v)})})),await Promise.race(b),_)throw new Error(`WebAssembly backend initializing failed due to timeout: ${t}ms`)},Ie=()=>{if(Qn&&Zn)return Zn;throw new Error("WebAssembly is not initialized yet.")}});var Pe,Xt,he,Dr=G(()=>{"use strict";bt();Pe=(e,t)=>{let n=Ie(),r=n.lengthBytesUTF8(e)+1,o=n._malloc(r);return n.stringToUTF8(e,o,r),t.push(o),o},Xt=(e,t,n,r)=>{if(typeof e=="object"&&e!==null){if(n.has(e))throw new Error("Circular reference in options");n.add(e)}Object.entries(e).forEach(([o,a])=>{let s=t?t+o:o;if(typeof a=="object")Xt(a,s+".",n,r);else if(typeof a=="string"||typeof a=="number")r(s,a.toString());else if(typeof a=="boolean")r(s,a?"1":"0");else throw new Error(`Can't handle extra config type: ${typeof a}`)})},he=e=>{let t=Ie(),n=t.stackSave();try{let r=t.PTR_SIZE,o=t.stackAlloc(2*r);t._OrtGetLastError(o,o+r);let a=Number(t.getValue(o,r===4?"i32":"i64")),s=t.getValue(o+r,"*"),d=s?t.UTF8ToString(s):"";throw new Error(`${e} ERROR_CODE: ${a}, ERROR_MESSAGE: ${d}`)}finally{t.stackRestore(n)}}});var Ps,zs=G(()=>{"use strict";bt();Dr();Ps=e=>{let t=Ie(),n=0,r=[],o=e||{};try{if(e?.logSeverityLevel===void 0)o.logSeverityLevel=2;else if(typeof e.logSeverityLevel!="number"||!Number.isInteger(e.logSeverityLevel)||e.logSeverityLevel<0||e.logSeverityLevel>4)throw new Error(`log serverity level is not valid: ${e.logSeverityLevel}`);if(e?.logVerbosityLevel===void 0)o.logVerbosityLevel=0;else if(typeof e.logVerbosityLevel!="number"||!Number.isInteger(e.logVerbosityLevel))throw new Error(`log verbosity level is not valid: ${e.logVerbosityLevel}`);e?.terminate===void 0&&(o.terminate=!1);let a=0;return e?.tag!==void 0&&(a=Pe(e.tag,r)),n=t._OrtCreateRunOptions(o.logSeverityLevel,o.logVerbosityLevel,!!o.terminate,a),n===0&&he("Can't create run options."),e?.extra!==void 0&&Xt(e.extra,"",new WeakSet,(s,d)=>{let l=Pe(s,r),p=Pe(d,r);t._OrtAddRunConfigEntry(n,l,p)!==0&&he(`Can't set a run config entry: ${s} - ${d}.`)}),[n,r]}catch(a){throw n!==0&&t._OrtReleaseRunOptions(n),r.forEach(s=>t._free(s)),a}}});var Gf,Hf,Ff,qf,Os,Ds=G(()=>{"use strict";bt();Dr();Gf=e=>{switch(e){case"disabled":return 0;case"basic":return 1;case"extended":return 2;case"all":return 99;default:throw new Error(`unsupported graph optimization level: ${e}`)}},Hf=e=>{switch(e){case"sequential":return 0;case"parallel":return 1;default:throw new Error(`unsupported execution mode: ${e}`)}},Ff=e=>{e.extra||(e.extra={}),e.extra.session||(e.extra.session={});let t=e.extra.session;t.use_ort_model_bytes_directly||(t.use_ort_model_bytes_directly="1"),e.executionProviders&&e.executionProviders.some(n=>(typeof n=="string"?n:n.name)==="webgpu")&&(e.enableMemPattern=!1)},qf=(e,t,n)=>{for(let r of t){let o=typeof r=="string"?r:r.name;switch(o){case"webnn":if(o="WEBNN",typeof r!="string"){let d=r?.deviceType;if(d){let l=Pe("deviceType",n),p=Pe(d,n);Ie()._OrtAddSessionConfigEntry(e,l,p)!==0&&he(`Can't set a session config entry: 'deviceType' - ${d}.`)}}break;case"webgpu":if(o="JS",typeof r!="string"){let s=r;if(s?.preferredLayout){if(s.preferredLayout!=="NCHW"&&s.preferredLayout!=="NHWC")throw new Error(`preferredLayout must be either 'NCHW' or 'NHWC': ${s.preferredLayout}`);let d=Pe("preferredLayout",n),l=Pe(s.preferredLayout,n);Ie()._OrtAddSessionConfigEntry(e,d,l)!==0&&he(`Can't set a session config entry: 'preferredLayout' - ${s.preferredLayout}.`)}}break;case"wasm":case"cpu":continue;default:throw new Error(`not supported execution provider: ${o}`)}let a=Pe(o,n);Ie()._OrtAppendExecutionProvider(e,a)!==0&&he(`Can't append execution provider: ${o}.`)}},Os=e=>{let t=Ie(),n=0,r=[],o=e||{};Ff(o);try{let a=Gf(o.graphOptimizationLevel??"all"),s=Hf(o.executionMode??"sequential"),d=typeof o.logId=="string"?Pe(o.logId,r):0,l=o.logSeverityLevel??2;if(!Number.isInteger(l)||l<0||l>4)throw new Error(`log serverity level is not valid: ${l}`);let p=o.logVerbosityLevel??0;if(!Number.isInteger(p)||p<0||p>4)throw new Error(`log verbosity level is not valid: ${p}`);let f=typeof o.optimizedModelFilePath=="string"?Pe(o.optimizedModelFilePath,r):0;if(n=t._OrtCreateSessionOptions(a,!!o.enableCpuMemArena,!!o.enableMemPattern,s,!!o.enableProfiling,0,d,l,p,f),n===0&&he("Can't create session options."),o.executionProviders&&qf(n,o.executionProviders,r),o.enableGraphCapture!==void 0){if(typeof o.enableGraphCapture!="boolean")throw new Error(`enableGraphCapture must be a boolean value: ${o.enableGraphCapture}`);let h=Pe("enableGraphCapture",r),y=Pe(o.enableGraphCapture.toString(),r);t._OrtAddSessionConfigEntry(n,h,y)!==0&&he(`Can't set a session config entry: 'enableGraphCapture' - ${o.enableGraphCapture}.`)}if(o.freeDimensionOverrides)for(let[h,y]of Object.entries(o.freeDimensionOverrides)){if(typeof h!="string")throw new Error(`free dimension override name must be a string: ${h}`);if(typeof y!="number"||!Number.isInteger(y)||y<0)throw new Error(`free dimension override value must be a non-negative integer: ${y}`);let _=Pe(h,r);t._OrtAddFreeDimensionOverride(n,_,y)!==0&&he(`Can't set a free dimension override: ${h} - ${y}.`)}return o.extra!==void 0&&Xt(o.extra,"",new WeakSet,(h,y)=>{let _=Pe(h,r),b=Pe(y,r);t._OrtAddSessionConfigEntry(n,_,b)!==0&&he(`Can't set a session config entry: ${h} - ${y}.`)}),[n,r]}catch(a){throw n!==0&&t._OrtReleaseSessionOptions(n)!==0&&he("Can't release session options."),r.forEach(s=>t._free(s)),a}}});var Rt,_t,wt,Br,Jt,Mr,Rr,Yn,te=G(()=>{"use strict";Rt=e=>{switch(e){case"int8":return 3;case"uint8":return 2;case"bool":return 9;case"int16":return 5;case"uint16":return 4;case"int32":return 6;case"uint32":return 12;case"float16":return 10;case"float32":return 1;case"float64":return 11;case"string":return 8;case"int64":return 7;case"uint64":return 13;case"int4":return 22;case"uint4":return 21;default:throw new Error(`unsupported data type: ${e}`)}},_t=e=>{switch(e){case 3:return"int8";case 2:return"uint8";case 9:return"bool";case 5:return"int16";case 4:return"uint16";case 6:return"int32";case 12:return"uint32";case 10:return"float16";case 1:return"float32";case 11:return"float64";case 8:return"string";case 7:return"int64";case 13:return"uint64";case 22:return"int4";case 21:return"uint4";default:throw new Error(`unsupported data type: ${e}`)}},wt=(e,t)=>{let n=[-1,4,1,1,2,2,4,8,-1,1,2,8,4,8,-1,-1,-1,-1,-1,-1,-1,.5,.5][e],r=typeof t=="number"?t:t.reduce((o,a)=>o*a,1);return n>0?Math.ceil(r*n):void 0},Br=e=>{switch(e){case"float16":return typeof Float16Array<"u"&&Float16Array.from?Float16Array:Uint16Array;case"float32":return Float32Array;case"uint8":return Uint8Array;case"int8":return Int8Array;case"uint16":return Uint16Array;case"int16":return Int16Array;case"int32":return Int32Array;case"bool":return Uint8Array;case"float64":return Float64Array;case"uint32":return Uint32Array;case"int64":return BigInt64Array;case"uint64":return BigUint64Array;default:throw new Error(`unsupported type: ${e}`)}},Jt=e=>{switch(e){case"verbose":return 0;case"info":return 1;case"warning":return 2;case"error":return 3;case"fatal":return 4;default:throw new Error(`unsupported logging level: ${e}`)}},Mr=e=>e==="float32"||e==="float16"||e==="int32"||e==="int64"||e==="uint32"||e==="uint8"||e==="bool"||e==="uint4"||e==="int4",Rr=e=>e==="float32"||e==="float16"||e==="int32"||e==="int64"||e==="uint32"||e==="uint64"||e==="int8"||e==="uint8"||e==="bool"||e==="uint4"||e==="int4",Yn=e=>{switch(e){case"none":return 0;case"cpu":return 1;case"cpu-pinned":return 2;case"texture":return 3;case"gpu-buffer":return 4;case"ml-tensor":return 5;default:throw new Error(`unsupported data location: ${e}`)}}});var er,Xn=G(()=>{"use strict";xr();er=async e=>{if(typeof e=="string")if(!1)try{let{readFile:t}=Nn("node:fs/promises");return new Uint8Array(await t(e))}catch(t){if(t.code==="ERR_FS_FILE_TOO_LARGE"){let{createReadStream:n}=Nn("node:fs"),r=n(e),o=[];for await(let a of r)o.push(a);return new Uint8Array(Buffer.concat(o))}throw t}else{let t=await fetch(e);if(!t.ok)throw new Error(`failed to load external data file: ${e}`);let n=t.headers.get("Content-Length"),r=n?parseInt(n,10):0;if(r<1073741824)return new Uint8Array(await t.arrayBuffer());{if(!t.body)throw new Error(`failed to load external data file: ${e}, no response body.`);let o=t.body.getReader(),a;try{a=new ArrayBuffer(r)}catch(d){if(d instanceof RangeError){let l=Math.ceil(r/65536);a=new WebAssembly.Memory({initial:l,maximum:l}).buffer}else throw d}let s=0;for(;;){let{done:d,value:l}=await o.read();if(d)break;let p=l.byteLength;new Uint8Array(a,s,p).set(l),s+=p}return new Uint8Array(a,0,r)}}else return e instanceof Blob?new Uint8Array(await e.arrayBuffer()):e instanceof Uint8Array?e:new Uint8Array(e)}});var Kf,jf,Bs,Ms,Ur,Zf,me,tt=G(()=>{"use strict";te();Kf=["V","I","W","E","F"],jf=(e,t)=>{console.log(`[${Kf[e]},${new Date().toISOString()}]${t}`)},Ur=(e,t)=>{Bs=e,Ms=t},Zf=(e,t)=>{let n=Jt(e),r=Jt(Bs);n>=r&&jf(n,typeof t=="function"?t():t)},me=(...e)=>{Ms&&Zf(...e)}});var Nr,Jn=G(()=>{"use strict";te();Nr=(e,t)=>new(Br(t))(e)});var Vr=G(()=>{"use strict"});var Rs,eo,to,Qf,Yf,Us,no,ro,Vs,Ws=G(()=>{"use strict";tt();Vr();Rs=new Map([[64,250],[128,200],[256,200],[512,200],[2048,230],[4096,200],[8192,50],[16384,50],[32768,50],[65536,50],[131072,50],[262144,50],[524288,50],[1048576,50],[2097152,30],[4194304,20],[8388608,10],[12582912,10],[16777216,10],[26214400,15],[33554432,22],[44236800,2],[58982400,6],[67108864,6],[134217728,6],[167772160,6]]),eo=[],to=e=>Math.ceil(Number(e)/16)*16,Qf=e=>{for(let t=0;tYf++,no=async(e,t,n,r)=>{let o=to(n),a=e.device.createBuffer({size:o,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});try{let s=e.getCommandEncoder();e.endComputePass(),s.copyBufferToBuffer(t,0,a,0,o),e.flush(),await a.mapAsync(GPUMapMode.READ);let d=a.getMappedRange();if(r){let l=r();return l.set(new Uint8Array(d,0,n)),l}else return new Uint8Array(d.slice(0,n))}finally{a.destroy()}},ro=class{constructor(t){this.backend=t;this.storageCache=new Map,this.freeBuffers=new Map,this.freeUniformBuffers=new Map,this.buffersPending=[],this.capturedPendingBuffers=new Map;for(let[n]of Rs)eo.push(n),this.freeBuffers.set(n,[]),this.freeUniformBuffers.set(n,[]);this.sessionCount=0}upload(t,n){let r=n.buffer,o=n.byteOffset,a=n.byteLength,s=to(a),d=this.storageCache.get(t);if(!d)throw new Error("gpu data for uploading does not exist");if(Number(d.originalSize)!==a)throw new Error(`inconsistent data size. gpu data size=${d.originalSize}, data size=${a}`);let l=this.backend.device.createBuffer({mappedAtCreation:!0,size:s,usage:GPUBufferUsage.MAP_WRITE|GPUBufferUsage.COPY_SRC}),p=l.getMappedRange();new Uint8Array(p).set(new Uint8Array(r,o,a)),l.unmap();let f=this.backend.device.createCommandEncoder();f.copyBufferToBuffer(l,0,d.gpuData.buffer,0,s),this.backend.device.queue.submit([f.finish()]),l.destroy(),me("verbose",()=>`[WebGPU] GpuDataManager.upload(id=${t})`)}memcpy(t,n){let r=this.storageCache.get(t);if(!r)throw new Error("source gpu data for memcpy does not exist");let o=this.storageCache.get(n);if(!o)throw new Error("destination gpu data for memcpy does not exist");if(r.originalSize!==o.originalSize)throw new Error("inconsistent source and destination gpu data size");let a=to(r.originalSize),s=this.backend.getCommandEncoder();this.backend.endComputePass(),s.copyBufferToBuffer(r.gpuData.buffer,0,o.gpuData.buffer,0,a)}registerExternalBuffer(t,n,r){let o;if(r){if(o=r[0],t===r[1])return me("verbose",()=>`[WebGPU] GpuDataManager.registerExternalBuffer(size=${n}) => id=${o}, buffer is the same, skip.`),o;if(this.backend.capturedCommandList.has(this.backend.currentSessionId))throw new Error(`Registering a different external buffer under graph capture mode is not supported yet. + Please use the previous external buffer!`)}else o=Us();return this.storageCache.set(o,{gpuData:{id:o,type:0,buffer:t},originalSize:n}),me("verbose",()=>`[WebGPU] GpuDataManager.registerExternalBuffer(size=${n}) => id=${o}, registered.`),o}unregisterExternalBuffer(t){t!==void 0&&(this.storageCache.delete(t),me("verbose",()=>`[WebGPU] GpuDataManager.unregisterExternalBuffer() => id=${t}`))}create(t,n=GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST){let r=Qf(t),o,a=(n&GPUBufferUsage.STORAGE)===GPUBufferUsage.STORAGE,s=(n&GPUBufferUsage.UNIFORM)===GPUBufferUsage.UNIFORM;if(a||s){let p=(a?this.freeBuffers:this.freeUniformBuffers).get(r);p?p.length>0?o=p.pop():o=this.backend.device.createBuffer({size:r,usage:n}):o=this.backend.device.createBuffer({size:r,usage:n})}else o=this.backend.device.createBuffer({size:r,usage:n});let d={id:Us(),type:0,buffer:o};return this.storageCache.set(d.id,{gpuData:d,originalSize:Number(t)}),me("verbose",()=>`[WebGPU] GpuDataManager.create(size=${t}) => id=${d.id}`),d}get(t){return this.storageCache.get(t)?.gpuData}release(t){let n=typeof t=="bigint"?Number(t):t,r=this.storageCache.get(n);if(!r){if(this.storageCache.size===0)return 0;throw new Error("releasing data does not exist")}return me("verbose",()=>`[WebGPU] GpuDataManager.release(id=${n}), gpuDataId=${r.gpuData.id}`),this.storageCache.delete(n),this.buffersPending.push(r.gpuData.buffer),r.originalSize}async download(t,n){let r=this.storageCache.get(Number(t));if(!r)throw new Error("data does not exist");await no(this.backend,r.gpuData.buffer,r.originalSize,n)}refreshPendingBuffers(){if(this.buffersPending.length!==0)if(this.backend.sessionStatus==="default"){for(let t of this.buffersPending){let n=Rs.get(t.size);if((t.usage&GPUBufferUsage.STORAGE)===GPUBufferUsage.STORAGE){let r=this.freeBuffers.get(t.size)||[];n===void 0||r.length>=n?t.destroy():r.push(t)}else if((t.usage&GPUBufferUsage.UNIFORM)===GPUBufferUsage.UNIFORM){let r=this.freeUniformBuffers.get(t.size)||[];n===void 0||r.length>=n?t.destroy():r.push(t)}else t.destroy()}this.buffersPending=[]}else{let t=this.capturedPendingBuffers.get(this.backend.currentSessionId);t||(t=[],this.capturedPendingBuffers.set(this.backend.currentSessionId,t));for(let n of this.buffersPending)t.push(n);this.buffersPending=[]}}dispose(){this.freeBuffers.forEach(t=>{t.forEach(n=>{n.destroy()})}),this.freeUniformBuffers.forEach(t=>{t.forEach(n=>{n.destroy()})}),this.storageCache.forEach(t=>{t.gpuData.buffer.destroy()}),this.capturedPendingBuffers.forEach(t=>{t.forEach(n=>{n.destroy()})}),this.storageCache=new Map,this.freeBuffers=new Map,this.freeUniformBuffers=new Map,this.capturedPendingBuffers=new Map}onCreateSession(){this.sessionCount+=1}onReleaseSession(t){let n=this.capturedPendingBuffers.get(t);n&&(n.forEach(r=>{r.destroy()}),this.capturedPendingBuffers.delete(t)),this.sessionCount-=1,this.sessionCount===0&&(me("warning",()=>"[WebGPU] Clearing webgpu buffer cache"),this.storageCache.forEach(r=>{r.gpuData.buffer.destroy()}),this.storageCache=new Map)}},Vs=(...e)=>new ro(...e)});var oo,re,Ce=G(()=>{"use strict";oo=class{constructor(t){Object.assign(this,t)}get cacheKey(){return this.key||(this.key=Object.getOwnPropertyNames(this).sort().map(t=>`${this[t]}`).join(";")),this.key}},re=e=>new oo(e)});var io,rt,E,kt,Wr,Ls,Gs,ae=G(()=>{"use strict";io=class{static calcMatMulShape(t,n){return t[1]!==n[0]?void 0:[t[0],n[1]]}},rt=class{static calcShape(t,n,r=!1){let o=t.length,a=n.length;if(o===0)return n;if(a===0)return t;let s=Math.max(t.length,n.length),d=new Array(s);if(r){if(o<2||a<2)return;let l=io.calcMatMulShape([t[o-2],t[o-1]],[n[a-2],n[a-1]]);if(l===void 0)return;[d[s-2],d[s-1]]=l}for(let l=r?3:1;l<=s;l++){let p=o-l<0?1:t[o-l],f=a-l<0?1:n[a-l];if(p!==f&&p>1&&f>1)return;let h=Math.max(p,f);if(p&&f)d[s-l]=Math.max(p,f);else{if(h>1)return;d[s-l]=0}}return d}static isValidBroadcast(t,n){let r=t.length,o=n.length;if(r>o)return!1;for(let a=1;a<=r;a++)if(t[r-a]!==1&&t[r-a]!==n[o-a])return!1;return!0}},E=class e{static size(t){return e.getSizeFromDimensionRange(t,0,t.length)}static convertShape(t,n=4){let r=t.length;if(r===0)return[];let o=new Array(r),a=r-1;for(;a>=0;){if(t[a]%n===0){o[a]=t[a]/n;break}if(n%t[a]!==0)throw new Error("cannot convert shape");o[a]=1,n/=t[a],a--}for(a--;a>=0;a--)o[a]=t[a];return o}static sizeFromDimension(t,n){if(n<0||n>t.length)throw new Error(`invalid dimension of ${n} for sizeFromDimension as Tensor has ${t.length} dimensions.`);return e.getSizeFromDimensionRange(t,n,t.length)}static sizeToDimension(t,n){if(n<0||n>t.length)throw new Error(`invalid dimension of ${n} for sizeToDimension as Tensor has ${t.length} dimensions.`);return e.getSizeFromDimensionRange(t,0,n)}static getSizeFromDimensionRange(t,n,r){let o=1;for(let a=n;a=0;--o)r[o]=r[o+1]*t[o+1];return r}static normalizeAxis(t,n){if(t<-n&&t>=n)throw new Error("unsupported axis for this operation.");return t<0?t+n:t}static normalizeAxes(t,n){return t.map(r=>this.normalizeAxis(r,n??t.length))}static sortBasedOnPerm(t,n){return n?n.map(r=>t[r]):t.slice().reverse()}static padShape(t,n){let r=t.length;return t.map((o,a)=>o+n[a]+n[a+r])}static areEqual(t,n){return t.length!==n.length?!1:t.every((r,o)=>r===n[o])}},kt=class e{static adjustPoolAttributes(t,n,r,o,a,s){if(!t&&r.length!==n.length-2)throw new Error("length of specified kernel shapes should be 2 less than length of input dimensions");if(t)for(let d=0;d=r.length?r.push(n[d+2]):r[d]=n[d+2];for(let d=0;d=r[d]||s[d+r.length]>=r[d])throw new Error("pads should be smaller than kernel")}}static adjustPadsBasedOnAutoPad(t,n,r,o,a,s,d){if(d){if(a.length!==2*(t.length-2))throw new Error("length of pads should be twice the length of data dimensions");if(n.length!==t.length-2)throw new Error("length of strides should be the length of data dimensions");if(o.length!==t.length-2)throw new Error("length of kernel shapes should be the length of data dimensions");for(let l=0;l{"use strict";te();ae();Et=64,so=(e,t)=>{if(t===3)throw new Error("vec3 has same alignment as vec4, use vec4 instead");switch(Number(e)){case 10:return t>1?`vec${t}`:"f16";case 1:return t>1?`vec${t}`:"f32";case 6:return t>1?`vec${t}`:"i32";case 12:return t>1?`vec${t}`:"u32";case 7:if(t>1)throw new Error("currently not supported vecX of uint64 yet");return["vec2","i32"];case 13:if(t>1)throw new Error("currently not supported vecX of uint64 yet");return["vec2","u32"];case 9:if(t!==4)throw new Error("bool must be vec4");return["u32","vec4"];case 22:return"i32";case 21:return"u32";default:throw new Error(`Unknown data type: ${e}`)}},_e=(e,t=1)=>{let n=so(e,t);return typeof n=="string"?n:n[0]},ze=(e,t=1)=>{let n=so(e,t);return typeof n=="string"?n:n[1]},H=(...e)=>{let t=[];return e.forEach(n=>{n.length!==0&&t.push({type:12,data:n},{type:12,data:E.computeStrides(n)})}),t},ge=e=>e%4===0?4:e%2===0?2:1,uo=(e="f32",t,n="0")=>!t||t===1?`${e}(${n})`:`vec${t}<${e}>(${n})`,Pt=(e,t,n)=>e==="f32"?n:t===1?`f32(${n})`:`vec${t}(${n})`,Ke=(e,t)=>t===4?`(${e}.x + ${e}.y + ${e}.z + ${e}.w)`:t===2?`(${e}.x + ${e}.y)`:t===3?`(${e}.x + ${e}.y + ${e}.z)`:e,K=(e,t,n,r)=>e.startsWith("uniforms.")&&n>4?typeof t=="string"?r==="f16"?`${e}[(${t}) / 8][(${t}) % 8 / 4][(${t}) % 8 % 4]`:`${e}[(${t}) / 4][(${t}) % 4]`:r==="f16"?`${e}[${Math.floor(t/8)}][${Math.floor(t%8/4)}][${t%8%4}]`:`${e}[${Math.floor(t/4)}][${t%4}]`:n>1?`${e}[${t}]`:e,Lr=(e,t,n,r,o)=>{let a=typeof n=="number",s=a?n:n.length,d=[...new Array(s).keys()],l=s<2?"u32":s<=4?`vec${s}`:`array`,p=so(t,o),f=typeof p=="string"?p:p[1],h=typeof p=="string"?p:p[0],y={indices:l,value:f,storage:h,tensor:t},_=R=>typeof R=="string"?R:`${R}u`,b={offsetToIndices:!1,indicesToOffset:!1,broadcastedIndicesToOffset:!1,set:!1,setByIndices:!1,get:!1,getByIndices:!1},w=a?"uniforms.":"",S=`${w}${e}_shape`,$=`${w}${e}_strides`,v="";for(let R=0;R ${y.indices} { + var indices: ${y.indices}; + var current = offset; + ${v} + return indices; + }`,C=R=>(b.offsetToIndices=!0,s<2?R:`o2i_${e}(${R})`),A=[];if(s>=2)for(let R=s-1;R>=0;R--)A.push(`${K($,R,s)} * (indices[${R}])`);let k=s<2?"":` + fn i2o_${e}(indices: ${y.indices}) -> u32 { + return ${A.join("+")}; + }`,O=R=>(b.indicesToOffset=!0,s<2?R:`i2o_${e}(${R})`),M=(...R)=>s===0?"0u":`${y.indices}(${R.map(_).join(",")})`,V=(R,Y)=>s<2?`${R}`:`${K(R,Y,s)}`,F=(R,Y,fe)=>s<2?`${R}=${fe};`:`${K(R,Y,s)}=${fe};`,j={},ne=(R,Y)=>{b.broadcastedIndicesToOffset=!0;let fe=`${Y.name}broadcastedIndicesTo${e}Offset`;if(fe in j)return`${fe}(${R})`;let Fe=[];for(let xe=s-1;xe>=0;xe--){let be=Y.indicesGet("outputIndices",xe+Y.rank-s);Fe.push(`${V($,xe)} * (${be} % ${V(S,xe)})`)}return j[fe]=`fn ${fe}(outputIndices: ${Y.type.indices}) -> u32 { + return ${Fe.length>0?Fe.join("+"):"0u"}; + }`,`${fe}(${R})`},W=(R,Y)=>(()=>{if(y.storage===y.value)return`${e}[${R}]=${Y};`;if(y.storage==="vec2"&&y.value==="i32")return`${e}[${R}]=vec2(u32(${Y}), select(0u, 0xFFFFFFFFu, ${Y} < 0));`;if(y.storage==="vec2"&&y.value==="u32")return`${e}[${R}]=vec2(u32(${Y}), 0u);`;if(y.storage==="u32"&&y.value==="vec4")return`${e}[${R}]=dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(${Y}));`;throw new Error(`not supported combination of storage type ${y.storage} and value type ${y.value} yet`)})(),J=R=>(()=>{if(y.storage===y.value)return`${e}[${R}]`;if(y.storage==="vec2"&&y.value==="i32")return`i32(${e}[${R}].x)`;if(y.storage==="vec2"&&y.value==="u32")return`u32(${e}[${R}].x)`;if(y.storage==="u32"&&y.value==="vec4")return`vec4(bool(${e}[${R}] & 0xFFu), bool(${e}[${R}] & 0xFF00u), bool(${e}[${R}] & 0xFF0000u), bool(${e}[${R}] & 0xFF000000u))`;throw new Error(`not supported combination of storage type ${y.storage} and value type ${y.value} yet`)})(),ve=s<2?"":` + fn get_${e}ByIndices(indices: ${y.indices}) -> ${f} { + return ${J(`i2o_${e}(indices)`)}; + }`,Q=s<2?"":(()=>{let R=d.map(fe=>`d${fe}: u32`).join(", "),Y=d.map(fe=>`d${fe}`).join(", ");return` + fn get_${e}(${R}) -> ${f} { + return get_${e}ByIndices(${M(Y)}); + }`})(),ee=(...R)=>{if(R.length!==s)throw new Error(`indices length must be ${s}`);let Y=R.map(_).join(",");return s===0?J("0u"):s===1?J(Y[0]):(b.get=!0,b.getByIndices=!0,b.indicesToOffset=!0,`get_${e}(${Y})`)},le=R=>s<2?J(R):(b.getByIndices=!0,b.indicesToOffset=!0,`get_${e}ByIndices(${R})`),Z=s<2?"":` + fn set_${e}ByIndices(indices: ${y.indices}, value: ${f}) { + ${W(`i2o_${e}(indices)`,"value")} + }`,pe=s<2?"":(()=>{let R=d.map(fe=>`d${fe}: u32`).join(", "),Y=d.map(fe=>`d${fe}`).join(", ");return` + fn set_${e}(${R}, value: ${f}) { + set_${e}ByIndices(${M(Y)}, value); + }`})();return{impl:()=>{let R=[],Y=!1;return b.offsetToIndices&&(R.push(T),Y=!0),b.indicesToOffset&&(R.push(k),Y=!0),b.broadcastedIndicesToOffset&&(Object.values(j).forEach(fe=>R.push(fe)),Y=!0),b.set&&(R.push(pe),Y=!0),b.setByIndices&&(R.push(Z),Y=!0),b.get&&(R.push(Q),Y=!0),b.getByIndices&&(R.push(ve),Y=!0),!a&&Y&&R.unshift(`const ${S} = ${y.indices}(${n.join(",")});`,`const ${$} = ${y.indices}(${E.computeStrides(n).join(",")});`),R.join(` +`)},type:y,offsetToIndices:C,indicesToOffset:O,broadcastedIndicesToOffset:ne,indices:M,indicesGet:V,indicesSet:F,set:(...R)=>{if(R.length!==s+1)throw new Error(`indices length must be ${s}`);let Y=R[s];if(typeof Y!="string")throw new Error("value must be string");let fe=R.slice(0,s).map(_).join(",");return s===0?W("0u",Y):s===1?W(fe[0],Y):(b.set=!0,b.setByIndices=!0,b.indicesToOffset=!0,`set_${e}(${fe}, ${Y})`)},setByOffset:W,setByIndices:(R,Y)=>s<2?W(R,Y):(b.setByIndices=!0,b.indicesToOffset=!0,`set_${e}ByIndices(${R}, ${Y});`),get:ee,getByOffset:J,getByIndices:le,usage:r,name:e,strides:$,shape:S,rank:s}},P=(e,t,n,r=1)=>Lr(e,t,n,"input",r),N=(e,t,n,r=1)=>Lr(e,t,n,"output",r),Hs=(e,t,n)=>Lr(e,t,n,"atomicOutput",1),Gr=(e,t,n,r=1)=>Lr(e,t,n,"internal",r),ao=class{constructor(t,n){this.normalizedDispatchGroup=t;this.limits=n;this.internalVariables=[];this.variables=[];this.uniforms=[];this.variableIndex=0}guardAgainstOutOfBoundsWorkgroupSizes(t){return`if (global_idx >= ${typeof t=="number"?`${t}u`:t}) { return; }`}mainStart(t=Et){let n=typeof t=="number"?t:t[0],r=typeof t=="number"?1:t[1],o=typeof t=="number"?1:t[2];if(n>this.limits.maxComputeWorkgroupSizeX||r>this.limits.maxComputeWorkgroupSizeY||o>this.limits.maxComputeWorkgroupSizeZ)throw new Error(`workgroup size [${n}, ${r}, ${o}] exceeds the maximum workgroup size [${this.limits.maxComputeWorkgroupSizeX}, ${this.limits.maxComputeWorkgroupSizeY}, ${this.limits.maxComputeWorkgroupSizeZ}].`);if(n*r*o>this.limits.maxComputeInvocationsPerWorkgroup)throw new Error(`workgroup size [${n}, ${r}, ${o}] exceeds the maximum workgroup invocations ${this.limits.maxComputeInvocationsPerWorkgroup}.`);let a=this.normalizedDispatchGroup[1]===1&&this.normalizedDispatchGroup[2]===1,s=a?`@builtin(global_invocation_id) global_id : vec3, + @builtin(workgroup_id) workgroup_id : vec3, + @builtin(local_invocation_index) local_idx : u32, + @builtin(local_invocation_id) local_id : vec3`:`@builtin(global_invocation_id) global_id : vec3, + @builtin(local_invocation_id) local_id : vec3, + @builtin(local_invocation_index) local_idx : u32, + @builtin(workgroup_id) workgroup_id : vec3, + @builtin(num_workgroups) num_workgroups : vec3`,d=a?`let global_idx = global_id.x; + let workgroup_index = workgroup_id.x;`:`let workgroup_index = workgroup_id.z * num_workgroups[0] * num_workgroups[1] + + workgroup_id.y * num_workgroups[0] + workgroup_id.x; + let global_idx = workgroup_index * ${n*r*o}u + local_idx;`;return`@compute @workgroup_size(${n}, ${r}, ${o}) + fn main(${s}) { + ${d} + `}appendVariableUniforms(t){t.rank!==0&&(t.shape.startsWith("uniforms.")&&this.uniforms.push({name:t.shape.replace("uniforms.",""),type:"u32",length:t.rank}),t.strides.startsWith("uniforms.")&&this.uniforms.push({name:t.strides.replace("uniforms.",""),type:"u32",length:t.rank}))}declareVariable(t,n){if(t.usage==="internal")throw new Error("cannot use internal variable with declareVariable(). use registerInternalVariables() instead.");this.variables.push(t),this.appendVariableUniforms(t);let r=t.usage==="input"?"read":"read_write",o=t.usage==="atomicOutput"?"atomic":t.type.storage;return`@group(0) @binding(${n}) var ${t.name}: array<${o}>;`}declareVariables(...t){return t.map(n=>this.declareVariable(n,this.variableIndex++)).join(` +`)}registerInternalVariable(t){if(t.usage!=="internal")throw new Error("cannot use input or output variable with registerInternalVariable(). use declareVariables() instead.");this.internalVariables.push(t),this.appendVariableUniforms(t)}registerInternalVariables(...t){return t.forEach(n=>this.registerInternalVariable(n)),this}registerUniform(t,n,r=1){return this.uniforms.push({name:t,type:n,length:r}),this}registerUniforms(t){return this.uniforms=this.uniforms.concat(t),this}uniformDeclaration(){if(this.uniforms.length===0)return"";let t=[];for(let{name:n,type:r,length:o}of this.uniforms)if(o&&o>4)r==="f16"?t.push(`@align(16) ${n}:array, ${Math.ceil(o/8)}>`):t.push(`${n}:array, ${Math.ceil(o/4)}>`);else{let a=o==null||o===1?r:`vec${o}<${r}>`;t.push(`${n}:${a}`)}return` + struct Uniforms { ${t.join(", ")} }; + @group(0) @binding(${this.variableIndex}) var uniforms: Uniforms;`}get additionalImplementations(){return this.uniformDeclaration()+this.variables.map(t=>t.impl()).join(` +`)+this.internalVariables.map(t=>t.impl()).join(` +`)}get variablesInfo(){if(this.uniforms.length===0)return;let t=n=>[12,10,1,6][["u32","f16","f32","i32"].indexOf(n)];return this.uniforms.map(n=>[t(n.type),n.length??1])}},Fs=(e,t)=>new ao(e,t)});var Xf,qs,Jf,eh,th,rh,Oe,Ks,js,ct=G(()=>{"use strict";te();ae();Ce();ce();Xf=(e,t)=>{if(!e||e.length!==1)throw new Error("Transpose requires 1 input.");if(t.length!==0&&t.length!==e[0].dims.length)throw new Error(`perm size ${t.length} does not match input rank ${e[0].dims.length}`)},qs=(e,t)=>t.length!==0?t:[...new Array(e).keys()].reverse(),Jf=(e,t)=>E.sortBasedOnPerm(e,qs(e.length,t)),eh=(e,t,n,r)=>{let o=`fn perm(i: ${r.type.indices}) -> ${n.type.indices} { + var a: ${n.type.indices};`;for(let a=0;a{let n=[],r=[];for(let o=0;o{let n=0;for(let r=0;r{let n=e.dataType,r=e.dims.length,o=qs(r,t),a=Jf(e.dims,o),s=e.dims,d=a,l=r<2||rh(o,e.dims),p;if(l)return p=w=>{let S=P("input",n,s,4),$=N("output",n,d,4);return` + ${w.registerUniform("output_size","u32").declareVariables(S,$)} + ${w.mainStart()} + ${w.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + output[global_idx] = input[global_idx]; + }`},{name:"TransposeCopy",shaderCache:{inputDependencies:["type"]},getRunData:()=>{let w=E.size(a);return{outputs:[{dims:a,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(w/64/4)},programUniforms:[{type:12,data:Math.ceil(w/4)}]}},getShaderSource:p};let{newShape:f,newPerm:h}=th(e.dims,o),y=E.areEqual(h,[2,3,1]),_=E.areEqual(h,[3,1,2]);if(f.length===2||y||_){s=y?[f[0],f[1]*f[2]]:_?[f[0]*f[1],f[2]]:f,d=[s[1],s[0]];let w=16;return p=S=>{let $=P("a",n,s.length),v=N("output",n,d.length);return` + ${S.registerUniform("output_size","u32").declareVariables($,v)} + var tile : array, ${w}>; + ${S.mainStart([w,w,1])} + let stride = (uniforms.output_shape[1] - 1) / ${w} + 1; + let workgroup_id_x = workgroup_index % stride; + let workgroup_id_y = workgroup_index / stride; + let input_col = workgroup_id_y * ${w}u + local_id.x; + let input_row = workgroup_id_x * ${w}u + local_id.y; + if (input_row < uniforms.a_shape[0] && input_col < uniforms.a_shape[1]) { + tile[local_id.y][local_id.x] = ${$.getByIndices(`${$.type.indices}(input_row, input_col)`)}; + } + workgroupBarrier(); + + let output_col = workgroup_id_x * ${w}u + local_id.x; + let output_row = workgroup_id_y * ${w}u + local_id.y; + if (output_row < uniforms.output_shape[0] && output_col < uniforms.output_shape[1]) { + ${v.setByIndices(`${v.type.indices}(output_row, output_col)`,"tile[local_id.x][local_id.y]")} + } + }`},{name:"TransposeShared",shaderCache:{inputDependencies:["type"]},getRunData:()=>{let S=E.size(a);return{outputs:[{dims:a,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(d[1]/w),y:Math.ceil(d[0]/w)},programUniforms:[{type:12,data:S},...H(s,d)]}},getShaderSource:p}}return p=w=>{let S=P("a",n,s.length),$=N("output",n,d.length);return` + ${w.registerUniform("output_size","u32").declareVariables(S,$)} + + ${eh(o,r,S,$)} + + ${w.mainStart()} + ${w.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let indices = ${$.offsetToIndices("global_idx")}; + let aIndices = perm(indices); + + ${$.setByOffset("global_idx",S.getByIndices("aIndices"))} + }`},{name:"Transpose",shaderCache:{hint:`${t}`,inputDependencies:["rank"]},getRunData:()=>{let w=E.size(a);return{outputs:[{dims:a,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(w/64)},programUniforms:[{type:12,data:w},...H(s,d)]}},getShaderSource:p}},Ks=(e,t)=>{Xf(e.inputs,t.perm),e.compute(Oe(e.inputs[0],t.perm))},js=e=>re({perm:e.perm})});var nh,oh,ih,ah,sh,uh,dh,lh,ch,ph,nt,Zs,Qs,Ys,Xs,Js,eu,tu,ru,nu,ou,iu=G(()=>{"use strict";te();ae();ce();Hr();ct();nh={max:"select(bestValue, candidate, candidate > bestValue)",min:"select(bestValue, candidate, candidate < bestValue)",mean:"bestValue + candidate",sum:"bestValue + candidate",prod:"bestValue * candidate",sumSquare:"bestValue + candidate * candidate",logSumExp:"bestValue + exp(candidate)",l1:"bestValue + abs(candidate)",l2:"bestValue + candidate * candidate",logSum:"bestValue + candidate"},oh={max:"select(bestValue, candidate, candidate > bestValue)",min:"select(bestValue, candidate, candidate < bestValue)",mean:"bestValue + candidate",sum:"bestValue + candidate",prod:"bestValue * candidate",sumSquare:"bestValue + candidate",logSumExp:"bestValue + candidate",l1:"bestValue + candidate",l2:"bestValue + candidate",logSum:"bestValue + candidate"},ih={max:"_A[offset]",min:"_A[offset]",mean:"0",sum:"0",prod:"1",sumSquare:"0",logSumExp:"0",l1:"0",l2:"0",logSum:"0"},ah={max:"bestValue",min:"bestValue",sum:"bestValue",prod:"bestValue",sumSquare:"bestValue",logSumExp:"log(bestValue)",l1:"bestValue",l2:"sqrt(bestValue)",logSum:"log(bestValue)"},sh=(e,t)=>{let n=[];for(let r=t-e;r{let n=[],r=e.length;for(let a=0;ae[a]);return[n,o]},dh=(e,t)=>{let n=e.length+t.length,r=[],o=0;for(let a=0;a{for(let n=0;n{let n=[];if(!lh(e,t)){for(let r=0;rn.push(r))}return n},ph=(e,t,n,r,o,a,s)=>{let d=n[0].dims,l=E.size(a),p=E.size(s),f=P("_A",n[0].dataType,d),h=N("output",o,a),y=64;l===1&&(y=256);let _=` + var aBestValues : array; + `,b=w=>` + ${w.registerUniform("reduceSize","u32").declareVariables(f,h)} + ${_} + fn DIV_CEIL(a : u32, b : u32) -> u32 { + return ((a - 1u) / b + 1u); + } + ${w.mainStart(y)} + + let outputIndex = global_idx / ${y}; + let offset = outputIndex * uniforms.reduceSize; + + var bestValue = f32(${ih[r]}); + let Length = uniforms.reduceSize; + for (var k = local_idx; k < Length; k = k + ${y}) { + let candidate = f32(${f.getByOffset("offset + k")}); + bestValue = ${nh[r]}; + } + aBestValues[local_idx] = bestValue; + workgroupBarrier(); + + var reduceSize = min(Length, ${y}u); + for (var currentSize = reduceSize / 2u; reduceSize > 1u; + currentSize = reduceSize / 2u) { + let interval = DIV_CEIL(reduceSize, 2u); + if (local_idx < currentSize) { + let candidate = aBestValues[local_idx + interval]; + bestValue = ${oh[r]}; + aBestValues[local_idx] = bestValue; + } + reduceSize = interval; + workgroupBarrier(); + } + + if (local_idx == 0u) { + ${h.setByOffset("outputIndex",`${r==="mean"?`${h.type.storage}(bestValue / f32(uniforms.reduceSize))`:`${h.type.storage}(${ah[r]})`}`)}; + } + }`;return{name:e,shaderCache:{hint:`${t};${y}`,inputDependencies:["type"]},getShaderSource:b,getRunData:()=>({outputs:[{dims:a,dataType:o}],dispatchGroup:{x:l},programUniforms:[{type:12,data:p}]})}},nt=(e,t,n,r)=>{let o=e.inputs.length===1?n:lo(e.inputs,n),a=o.axes;a.length===0&&!o.noopWithEmptyAxes&&(a=e.inputs[0].dims.map((_,b)=>b));let s=E.normalizeAxes(a,e.inputs[0].dims.length),d=s,l=e.inputs[0],p=ch(d,e.inputs[0].dims.length);p.length>0&&(l=e.compute(Oe(e.inputs[0],p),{inputs:[0],outputs:[-1]})[0],d=sh(d.length,l.dims.length));let[f,h]=uh(l.dims,d),y=f;o.keepDims&&(y=dh(f,s)),e.compute(ph(t,o.cacheKey,[l],r,e.inputs[0].dataType,y,h),{inputs:[l]})},Zs=(e,t)=>{nt(e,"ReduceMeanShared",t,"mean")},Qs=(e,t)=>{nt(e,"ReduceL1Shared",t,"l1")},Ys=(e,t)=>{nt(e,"ReduceL2Shared",t,"l2")},Xs=(e,t)=>{nt(e,"ReduceLogSumExpShared",t,"logSumExp")},Js=(e,t)=>{nt(e,"ReduceMaxShared",t,"max")},eu=(e,t)=>{nt(e,"ReduceMinShared",t,"min")},tu=(e,t)=>{nt(e,"ReduceProdShared",t,"prod")},ru=(e,t)=>{nt(e,"ReduceSumShared",t,"sum")},nu=(e,t)=>{nt(e,"ReduceSumSquareShared",t,"sumSquare")},ou=(e,t)=>{nt(e,"ReduceLogSumShared",t,"logSum")}});var ot,mh,Fr,lo,it,fh,hh,gh,yh,bh,_h,wh,vh,$h,xh,at,au,su,uu,du,lu,cu,pu,mu,fu,hu,Hr=G(()=>{"use strict";te();ae();Ce();ce();iu();ot=e=>{if(!e||e.length===0||e.length>2)throw new Error("Reduce op requires 1 or 2 inputs.");if(e.length===2&&e[1].dims.length!==1)throw new Error("Invalid axes input dims.")},mh=e=>["","",`var value = ${e.getByIndices("input_indices")};`,""],Fr=(e,t,n,r,o,a,s=!1,d=!1)=>{let l=[],p=n[0].dims,f=p.length,h=E.normalizeAxes(o,f),y=!d&&h.length===0;p.forEach((S,$)=>{y||h.indexOf($)>=0?s&&l.push(1):l.push(S)});let _=l.length,b=E.size(l);return{name:e,shaderCache:t,getShaderSource:S=>{let $=[],v=P("_A",n[0].dataType,f),T=N("output",a,_),C=r(v,T,h),A=C[2];for(let k=0,O=0;k=0?(s&&O++,A=`for(var j${k}: u32 = 0; j${k} < ${p[k]}; j${k}++) { + ${C[2].includes("last_index")?`let last_index = j${k};`:""} + ${v.indicesSet("input_indices",k,`j${k}`)} + ${A} + }`):($.push(`${v.indicesSet("input_indices",k,T.indicesGet("output_indices",O))};`),O++);return` + + ${S.registerUniform("output_size","u32").declareVariables(v,T)} + + ${S.mainStart()} + ${S.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + var input_indices: ${v.type.indices}; + let output_indices = ${T.offsetToIndices("global_idx")}; + + ${$.join(` +`)} + ${C[0]} // init ops for reduce max/min + ${C[1]} + ${A} + ${C[3]} + ${C.length===4?T.setByOffset("global_idx","value"):C.slice(4).join(` +`)} + }`},getRunData:()=>({outputs:[{dims:l,dataType:a}],dispatchGroup:{x:Math.ceil(b/64)},programUniforms:[{type:12,data:b},...H(p,l)]})}},lo=(e,t)=>{let n=[];return e[1].dims[0]>0&&e[1].getBigInt64Array().forEach(r=>n.push(Number(r))),re({axes:n,keepDims:t.keepDims,noopWithEmptyAxes:t.noopWithEmptyAxes})},it=(e,t,n,r)=>{let o=e.inputs,a=o.length===1?n:lo(o,n);e.compute(Fr(t,{hint:a.cacheKey,inputDependencies:["rank"]},[o[0]],a.noopWithEmptyAxes&&a.axes.length===0?mh:r,a.axes,o[0].dataType,a.keepDims,a.noopWithEmptyAxes),{inputs:[0]})},fh=(e,t)=>{ot(e.inputs),it(e,"ReduceLogSum",t,(r,o)=>[`var value = ${o.type.storage}(0);`,"",`value += ${r.getByIndices("input_indices")};`,"value = log(value);"])},hh=(e,t)=>{ot(e.inputs),it(e,"ReduceL1",t,(r,o)=>[`var value = ${o.type.storage}(0);`,"",`value += abs(${r.getByIndices("input_indices")});`,""])},gh=(e,t)=>{ot(e.inputs),it(e,"ReduceL2",t,(r,o)=>[`var t = ${o.type.value}(0); var value = ${o.type.value}(0);`,"",`t = ${r.getByIndices("input_indices")}; value += (t * t);`,"value = sqrt(value);"])},yh=(e,t)=>{ot(e.inputs),it(e,"ReduceLogSumExp",t,(r,o)=>[`var value = ${o.type.storage}(0);`,"",`value += exp(${r.getByIndices("input_indices")});`,"value = log(value);"])},bh=(e,t)=>{ot(e.inputs),it(e,"ReduceMax",t,(r,o,a)=>{let s=[];for(let d=0;d=0||a.length===0)&&s.push(r.indicesSet("input_indices",d,0));return[`${s.join(` +`)}`,`var value = ${r.getByIndices("input_indices")};`,`value = max(value, ${r.getByIndices("input_indices")});`,""]})},_h=(e,t)=>{ot(e.inputs),it(e,"ReduceMean",t,(r,o,a)=>{let s=1;for(let d=0;d=0||a.length===0)&&(s*=e.inputs[0].dims[d]);return["var sum = f32(0);","",`sum += f32(${r.getByIndices("input_indices")});`,`let value = ${o.type.value}(sum / ${s});`]})},wh=(e,t)=>{ot(e.inputs),it(e,"ReduceMin",t,(r,o,a)=>{let s=[];for(let d=0;d=0||a.length===0)&&s.push(`input_indices[${d}] = 0;`);return[`${s.join(` +`)}`,`var value = ${r.getByIndices("input_indices")};`,`value = min(value, ${r.getByIndices("input_indices")});`,""]})},vh=(e,t)=>{ot(e.inputs),it(e,"ReduceProd",t,(r,o)=>[`var value = ${o.type.storage}(1);`,"",`value *= ${r.getByIndices("input_indices")};`,""])},$h=(e,t)=>{ot(e.inputs),it(e,"ReduceSum",t,(r,o)=>[`var value = ${o.type.storage}(0);`,"",`value += ${r.getByIndices("input_indices")};`,""])},xh=(e,t)=>{ot(e.inputs),it(e,"ReduceSumSquare",t,(r,o)=>[`var t = ${o.type.value}(0); var value = ${o.type.value}(0);`,"",`t = ${r.getByIndices("input_indices")}; value += t * t;`,""])},at=(e,t,n)=>{if(t.length===0)return n;let r=1,o=1;for(let a=0;a1024},au=(e,t)=>{at(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?_h(e,t):Zs(e,t)},su=(e,t)=>{at(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?hh(e,t):Qs(e,t)},uu=(e,t)=>{at(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?gh(e,t):Ys(e,t)},du=(e,t)=>{at(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?yh(e,t):Xs(e,t)},lu=(e,t)=>{at(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?bh(e,t):Js(e,t)},cu=(e,t)=>{at(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?wh(e,t):eu(e,t)},pu=(e,t)=>{at(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?vh(e,t):tu(e,t)},mu=(e,t)=>{at(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?$h(e,t):ru(e,t)},fu=(e,t)=>{at(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?xh(e,t):nu(e,t)},hu=(e,t)=>{at(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?fh(e,t):ou(e,t)}});var gu,yu,bu,co,_u=G(()=>{"use strict";te();Ce();Hr();gu=e=>{if(!e||e.length===0||e.length>2)throw new Error("ArgMinMaxOp op requires 1 or 2 inputs.");if(e[0].dataType!==1)throw new Error("Invalid input type.")},yu=(e,t)=>{gu(e.inputs);let n=(r,o,a)=>{let s=[];for(let d=0;d=0||a.length===0)&&s.push(`input_indices[${d}] = 0;`);return[`${s.join(` +`)}`,`var value = ${r.getByIndices("input_indices")}; +var best_index : i32 = 0;`,`if (${r.getByIndices("input_indices")} ${t.selectLastIndex>0?"<=":"<"} value) { + value = ${r.getByIndices("input_indices")}; + best_index = i32(last_index); + }`,"",o.setByOffset("global_idx","best_index")]};e.compute(Fr("ArgMin",{hint:t.cacheKey,inputDependencies:["rank"]},[e.inputs[0]],n,[t.axis],7,t.keepDims),{inputs:[0]})},bu=(e,t)=>{gu(e.inputs);let n=(r,o,a)=>{let s=[];for(let d=0;d=0||a.length===0)&&s.push(`input_indices[${d}] = 0;`);return[`${s.join(` +`)}`,`var value = ${r.getByIndices("input_indices")}; +var best_index : i32 = 0;`,`if (${r.getByIndices("input_indices")} ${t.selectLastIndex>0?">=":">"} value) { + value = ${r.getByIndices("input_indices")}; + best_index = i32(last_index); + }`,"",o.setByOffset("global_idx","best_index")]};e.compute(Fr("argMax",{hint:t.cacheKey,inputDependencies:["rank"]},[e.inputs[0]],n,[t.axis],7,t.keepDims),{inputs:[0]})},co=e=>re(e)});var Sh,po,Th,Ch,Ih,Ut,Ah,wu,qr=G(()=>{"use strict";te();ae();Vr();ce();Sh=(e,t)=>{let n=e[0],r=e[1],o=e[2],a=e[3],s=e[4],d=e[5];if(s&&d)throw new Error("Attention cannot have both past and attention_bias");if(n.dims.length!==3)throw new Error('Input "input" must have 3 dimensions');let l=n.dims[0],p=n.dims[1],f=n.dims[2];if(o.dims.length!==1)throw new Error('Input "bias" is expected to have 1 dimensions');if(r.dims.length!==2)throw new Error('Input "weights" is expected to have 2 dimensions');if(r.dims[0]!==f)throw new Error("Input 1 dimension 0 should have same length as dimension 2 of input 0");if(o.dims[0]!==r.dims[1])throw new Error('Input "bias" dimension 0 should have same length as dimension 1 of input "weights"');let h=o.dims[0]/3,y=h,_=y;if(t.qkvHiddenSizes.length>0){if(t.qkvHiddenSizes.length!==3)throw new Error("qkv_hidden_sizes attribute should have 3 elements");for(let T of t.qkvHiddenSizes)if(T%t.numHeads!==0)throw new Error("qkv_hidden_sizes should be divisible by num_heads");h=t.qkvHiddenSizes[0],y=t.qkvHiddenSizes[1],_=t.qkvHiddenSizes[2]}let b=p;if(h!==y)throw new Error("qkv_hidden_sizes first element should be same as the second");if(o.dims[0]!==h+y+_)throw new Error('Input "bias" dimension 0 should have same length as sum of Q/K/V hidden sizes');let w=0;if(s){if(y!==_)throw new Error('Input "past" expect k_hidden_size == v_hidden_size');if(s.dims.length!==5)throw new Error('Input "past" must have 5 dimensions');if(s.dims[0]!==2)throw new Error('Input "past" first dimension must be 2');if(s.dims[1]!==l)throw new Error('Input "past" second dimension must be batch_size');if(s.dims[2]!==t.numHeads)throw new Error('Input "past" third dimension must be num_heads');if(s.dims[4]!==y/t.numHeads)throw new Error('Input "past" fifth dimension must be k_hidden_size / num_heads');t.pastPresentShareBuffer||(w=s.dims[3])}let S=b+w,$=-1,v=0;if(a)throw new Error("Mask not supported");if(s)throw new Error("past is not supported");if(d){if(d.dims.length!==4)throw new Error('Input "attention_bias" must have 4 dimensions');if(d.dims[0]!==l||d.dims[1]!==t.numHeads||d.dims[2]!==p||d.dims[3]!==S)throw new Error('Expect "attention_bias" shape (batch_size, num_heads, sequence_length, total_sequence_length)')}return{batchSize:l,sequenceLength:p,pastSequenceLength:w,kvSequenceLength:b,totalSequenceLength:S,maxSequenceLength:$,inputHiddenSize:f,hiddenSize:h,vHiddenSize:_,headSize:Math.floor(h/t.numHeads),vHeadSize:Math.floor(_/t.numHeads),numHeads:t.numHeads,isUnidirectional:!1,pastPresentShareBuffer:!1,maskFilterValue:t.maskFilterValue,maskType:v,scale:t.scale,broadcastResPosBias:!1,passPastInKv:!1,qkvFormat:1}},po=(e,t,n)=>t&&e?` + let total_sequence_length_input = u32(${t.getByOffset("0")}); + let present_sequence_length = max(total_sequence_length_input, uniforms.past_sequence_length); + let is_subsequent_prompt: bool = sequence_length > 1 && sequence_length != total_sequence_length_input; + let is_first_prompt: bool = is_subsequent_prompt == false && sequence_length == total_sequence_length_input; + total_sequence_length = u32(${e?.getByOffset("batchIdx")}) + 1; + var past_sequence_length: u32 = 0; + if (is_first_prompt == false) { + past_sequence_length = total_sequence_length - sequence_length; + } + `:` + ${n?"let past_sequence_length = uniforms.past_sequence_length":""}; + let present_sequence_length = total_sequence_length; + `,Th=(e,t,n,r,o,a,s,d)=>{let l=ge(s?1:a),p=64,f=a/l;f{let v=N("x",e.dataType,e.dims,l),T=[v],C=s?P("seq_lens",s.dataType,s.dims):void 0;C&&T.push(C);let A=d?P("total_sequence_length_input",d.dataType,d.dims):void 0;A&&T.push(A);let k=ze(e.dataType),O=[{name:"batch_size",type:"u32"},{name:"num_heads",type:"u32"},{name:"past_sequence_length",type:"u32"},{name:"sequence_length",type:"u32"},{name:"total_sequence_length",type:"u32"},{name:"elements_per_thread",type:"u32"}];return` + var thread_max: array; + var thread_sum: array; + ${$.registerUniforms(O).declareVariables(...T)} + ${$.mainStart([p,1,1])} + let batchIdx = workgroup_id.z / uniforms.num_heads; + let headIdx = workgroup_id.z % uniforms.num_heads; + let sequence_length = uniforms.sequence_length; + var total_sequence_length = uniforms.total_sequence_length; + ${po(C,A,!1)} + let local_offset = local_idx * uniforms.elements_per_thread; + let offset = (global_idx / ${p}) * uniforms.total_sequence_length + local_offset; + let seq_causal_length = ${s?"u32(past_sequence_length + workgroup_id.y + 1)":"total_sequence_length"}; + var thread_max_vector = ${b}(-3.402823e+38f); + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + thread_max_vector = max(${b}(x[offset + i]), thread_max_vector); + } + thread_max[local_idx] = ${(()=>{switch(l){case 1:return"thread_max_vector";case 2:return"max(thread_max_vector.x, thread_max_vector.y)";case 4:return"max(max(thread_max_vector.x, thread_max_vector.y), max(thread_max_vector.z, thread_max_vector.w))";default:throw new Error(`Unsupported components: ${l}`)}})()}; + workgroupBarrier(); + + var max_value = f32(-3.402823e+38f); + for (var i = 0u; i < ${p}; i++) { + max_value = max(thread_max[i], max_value); + } + + var sum_vector = ${b}(0); + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + sum_vector += exp(${b}(x[offset + i]) - max_value); + } + thread_sum[local_idx] = ${(()=>{switch(l){case 1:return"sum_vector";case 2:return"sum_vector.x + sum_vector.y";case 4:return"sum_vector.x + sum_vector.y + sum_vector.z + sum_vector.w";default:throw new Error(`Unsupported components: ${l}`)}})()}; + workgroupBarrier(); + + var sum: f32 = 0; + for (var i = 0u; i < ${p}; i++) { + sum += thread_sum[i]; + } + + if (sum == 0) { + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + x[offset + i] = ${v.type.value}(${k}(1.0) / ${k}(seq_causal_length)); + } + } else { + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + var f32input = ${b}(x[offset + i]); + x[offset + i] = ${v.type.value}(exp(f32input - max_value) / sum); + } + } + ${s?` + for (var total_seq_id: u32 = seq_causal_length; total_seq_id + local_offset < uniforms.total_sequence_length; total_seq_id++) { + x[offset + total_seq_id] = ${v.type.value}(${k}(0)); + }`:""}; + }`};return{name:"AttentionProbsSoftmax",shaderCache:{hint:`${p};${_};${l}`,inputDependencies:w},getShaderSource:S,getRunData:()=>({outputs:[],dispatchGroup:{x:Math.ceil(a/p),y:o,z:t*n},programUniforms:y})}},Ch=(e,t,n,r,o,a,s,d,l)=>{let p=s+a.kvSequenceLength,f=[a.batchSize,a.numHeads,a.sequenceLength,p],h=e>1&&r,y=a.kvNumHeads?a.kvNumHeads:a.numHeads,_=h?[a.batchSize,y,p,a.headSize]:void 0,b=a.nReps?a.nReps:1,w=a.scale===0?1/Math.sqrt(a.headSize):a.scale,S=ge(a.headSize),$=a.headSize/S,v=12,T={x:Math.ceil(p/v),y:Math.ceil(a.sequenceLength/v),z:a.batchSize*a.numHeads},C=[{type:12,data:a.sequenceLength},{type:12,data:$},{type:12,data:p},{type:12,data:a.numHeads},{type:12,data:a.headSize},{type:1,data:w},{type:12,data:s},{type:12,data:a.kvSequenceLength},{type:12,data:b}],A=h&&r&&E.size(r.dims)>0,k=["type","type"];A&&k.push("type"),o&&k.push("type"),d&&k.push("type"),l&&k.push("type");let O=[{dims:f,dataType:t.dataType,gpuDataType:0}];h&&O.push({dims:_,dataType:t.dataType,gpuDataType:0});let M=V=>{let F=P("q",t.dataType,t.dims,S),j=P("key",n.dataType,n.dims,S),ne=[F,j];if(A){let Z=P("past_key",r.dataType,r.dims,S);ne.push(Z)}o&&ne.push(P("attention_bias",o.dataType,o.dims));let W=d?P("seq_lens",d.dataType,d.dims):void 0;W&&ne.push(W);let J=l?P("total_sequence_length_input",l.dataType,l.dims):void 0;J&&ne.push(J);let ve=N("output",t.dataType,f),Q=[ve];h&&Q.push(N("present_key",t.dataType,_,S));let ee=ze(1,S),le=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"alpha",type:"f32"},{name:"past_sequence_length",type:"u32"},{name:"kv_sequence_length",type:"u32"},{name:"n_reps",type:"u32"}];return` + const TILE_SIZE = ${v}u; + + var tileQ: array<${F.type.storage}, ${v*v}>; + var tileK: array<${F.type.storage}, ${v*v}>; + ${V.registerUniforms(le).declareVariables(...ne,...Q)} + ${V.mainStart([v,v,1])} + // x holds the N and y holds the M + let headIdx = workgroup_id.z % uniforms.num_heads; + let kvHeadIdx = ${b===1?"headIdx":"headIdx / uniforms.n_reps"}; + let kv_num_heads = ${b===1?"uniforms.num_heads":"uniforms.num_heads / uniforms.n_reps"}; + let batchIdx = workgroup_id.z / uniforms.num_heads; + let m = workgroup_id.y * TILE_SIZE; + let n = workgroup_id.x * TILE_SIZE; + let sequence_length = uniforms.M; + var total_sequence_length = uniforms.N; + ${po(W,J,!0)} + let absKvHeadIdx = batchIdx * kv_num_heads + kvHeadIdx; + let qOffset = workgroup_id.z * uniforms.M * uniforms.K + m * uniforms.K; + ${A&&h?"let pastKeyOffset = absKvHeadIdx * uniforms.past_sequence_length * uniforms.K;":""}; + let kOffset = absKvHeadIdx * uniforms.kv_sequence_length * uniforms.K; + ${h?"let presentKeyOffset = absKvHeadIdx * uniforms.N * uniforms.K;":""} + var value = ${ee}(0); + for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { + if (global_id.y < uniforms.M && w + local_id.x < uniforms.K) { + tileQ[TILE_SIZE * local_id.y + local_id.x] = q[qOffset + local_id.y * uniforms.K + w + local_id.x]; + } + if (n + local_id.y < uniforms.N && w + local_id.x < uniforms.K) { + var idx = TILE_SIZE * local_id.y + local_id.x; + ${A&&h?` + if (n + local_id.y < past_sequence_length) { + tileK[idx] = past_key[pastKeyOffset + (n + local_id.y) * uniforms.K + w + local_id.x]; + } else if (n + local_id.y - past_sequence_length < uniforms.kv_sequence_length) { + tileK[idx] = key[kOffset + (n + local_id.y - past_sequence_length) * uniforms.K + w + local_id.x]; + }`:` + if (n + local_id.y < uniforms.kv_sequence_length) { + tileK[idx] = key[kOffset + (n + local_id.y) * uniforms.K + w + local_id.x]; + }`} + ${h?`if (n + local_id.y < present_sequence_length) { + present_key[presentKeyOffset + (n + local_id.y) * uniforms.K + w + local_id.x] = tileK[idx]; + }`:""} + } + workgroupBarrier(); + + for (var k: u32 = 0u; k < TILE_SIZE && w+k < uniforms.K; k++) { + value += ${ee}(tileQ[TILE_SIZE * local_id.y + k] * tileK[TILE_SIZE * local_id.x + k]); + } + + workgroupBarrier(); + } + + if (global_id.y < uniforms.M && global_id.x < total_sequence_length) { + let headOffset = workgroup_id.z * uniforms.M * uniforms.N; + let outputIdx = headOffset + global_id.y * uniforms.N + global_id.x; + var sum: f32 = ${(()=>{switch(S){case 1:return"value";case 2:return"value.x + value.y";case 4:return"value.x + value.y + value.z + value.w";default:throw new Error(`Unsupported components: ${S}`)}})()}; + output[outputIdx] = ${ve.type.value} (sum * uniforms.alpha) + ${o?"attention_bias[outputIdx]":"0.0"}; + } + }`};return{name:"AttentionProbs",shaderCache:{hint:`${S};${o!==void 0};${r!==void 0};${e}`,inputDependencies:k},getRunData:()=>({outputs:O,dispatchGroup:T,programUniforms:C}),getShaderSource:M}},Ih=(e,t,n,r,o,a,s=void 0,d=void 0)=>{let l=a+o.kvSequenceLength,p=o.nReps?o.nReps:1,f=o.vHiddenSize*p,h=e>1&&r,y=o.kvNumHeads?o.kvNumHeads:o.numHeads,_=h?[o.batchSize,y,l,o.headSize]:void 0,b=[o.batchSize,o.sequenceLength,f],w=12,S={x:Math.ceil(o.vHeadSize/w),y:Math.ceil(o.sequenceLength/w),z:o.batchSize*o.numHeads},$=[{type:12,data:o.sequenceLength},{type:12,data:l},{type:12,data:o.vHeadSize},{type:12,data:o.numHeads},{type:12,data:o.headSize},{type:12,data:f},{type:12,data:a},{type:12,data:o.kvSequenceLength},{type:12,data:p}],v=h&&r&&E.size(r.dims)>0,T=["type","type"];v&&T.push("type"),s&&T.push("type"),d&&T.push("type");let C=[{dims:b,dataType:t.dataType,gpuDataType:0}];h&&C.push({dims:_,dataType:t.dataType,gpuDataType:0});let A=k=>{let O=P("probs",t.dataType,t.dims),M=P("v",n.dataType,n.dims),V=[O,M];v&&V.push(P("past_value",r.dataType,r.dims));let F=s?P("seq_lens",s.dataType,s.dims):void 0;s&&V.push(F);let j=d?P("total_sequence_length_input",d.dataType,d.dims):void 0;d&&V.push(j);let W=[N("output",t.dataType,b)];h&&W.push(N("present_value",t.dataType,_));let J=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"v_hidden_size",type:"u32"},{name:"past_sequence_length",type:"u32"},{name:"kv_sequence_length",type:"u32"},{name:"n_reps",type:"u32"}];return` + const TILE_SIZE = ${w}u; + var tileQ: array<${O.type.value}, ${w*w}>; + var tileV: array<${O.type.value}, ${w*w}>; + ${k.registerUniforms(J).declareVariables(...V,...W)} + ${k.mainStart([w,w,1])} + let headIdx = workgroup_id.z % uniforms.num_heads; + let batchIdx = workgroup_id.z / uniforms.num_heads; + let kvHeadIdx = ${p===1?"headIdx":"headIdx / uniforms.n_reps"}; + let kv_num_heads = ${p===1?"uniforms.num_heads":"uniforms.num_heads / uniforms.n_reps"}; + let m = global_id.y; + let n = global_id.x; + let sequence_length = uniforms.M; + var total_sequence_length = uniforms.K; + ${po(F,j,!0)} + let offsetA = workgroup_id.z * uniforms.M * uniforms.K + m * uniforms.K; + let absKvHeadIdx = batchIdx * kv_num_heads + kvHeadIdx; // kvHeadIdx is relative to the batch + ${v&&h?"let pastValueOffset = absKvHeadIdx * uniforms.N * uniforms.past_sequence_length + n;":""}; + let vOffset = absKvHeadIdx * uniforms.N * uniforms.kv_sequence_length + n; + ${h?"let presentValueOffset = absKvHeadIdx * uniforms.N * uniforms.K + n;":""} + var value = ${O.type.storage}(0); + for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { + if (m < uniforms.M && w + local_id.x < uniforms.K) { + tileQ[TILE_SIZE * local_id.y + local_id.x] = probs[offsetA + w + local_id.x]; + } + if (n < uniforms.N && w + local_id.y < uniforms.K) { + var idx = TILE_SIZE * local_id.y + local_id.x; + ${v&&h?` + if (w + local_id.y < past_sequence_length) { + tileV[idx] = past_value[pastValueOffset + (w + local_id.y) * uniforms.N]; + } else if (w + local_id.y - past_sequence_length < uniforms.kv_sequence_length) { + tileV[idx] = v[vOffset + (w + local_id.y - past_sequence_length) * uniforms.N]; + } + `:` + if (w + local_id.y < uniforms.kv_sequence_length) { + tileV[idx] = v[vOffset + (w + local_id.y) * uniforms.N]; + }`} + ${h?` + if (w + local_id.y < present_sequence_length) { + present_value[presentValueOffset + (w + local_id.y) * uniforms.N] = tileV[idx]; + }`:""} + } + workgroupBarrier(); + for (var k: u32 = 0u; k < TILE_SIZE && w+k < total_sequence_length; k++) { + value += tileQ[TILE_SIZE * local_id.y + k] * tileV[TILE_SIZE * k + local_id.x]; + } + workgroupBarrier(); + } + + // we need to transpose output from BNSH_v to BSND_v + if (m < uniforms.M && n < uniforms.N) { + let outputIdx = batchIdx * uniforms.M * uniforms.v_hidden_size + m * uniforms.v_hidden_size + + headIdx * uniforms.N + n; + output[outputIdx] = value; + } + }`};return{name:"AttentionScore",shaderCache:{hint:`${r!==void 0};${e}`,inputDependencies:T},getRunData:()=>({outputs:C,dispatchGroup:S,programUniforms:$}),getShaderSource:A}},Ut=(e,t,n,r,o,a,s,d,l,p,f=void 0,h=void 0)=>{let y=Math.min(e.outputCount,1+(s?1:0)+(d?1:0)),_=y>1?p.pastSequenceLength:0,b=_+p.kvSequenceLength,w=l&&E.size(l.dims)>0?l:void 0,S=[t,n];y>1&&s&&E.size(s.dims)>0&&S.push(s),w&&S.push(w),f&&S.push(f),h&&S.push(h);let $=e.compute(Ch(y,t,n,s,w,p,_,f,h),{inputs:S,outputs:y>1?[-1,1]:[-1]})[0];e.compute(Th($,p.batchSize,p.numHeads,_,p.sequenceLength,b,f,h),{inputs:f&&h?[$,f,h]:[$],outputs:[]});let v=[$,r];y>1&&d&&E.size(d.dims)>0&&v.push(d),f&&v.push(f),h&&v.push(h),e.compute(Ih(y,$,r,d,p,_,f,h),{inputs:v,outputs:y>1?[0,2]:[0]})},Ah=(e,t)=>{let n=[t.batchSize,t.numHeads,t.sequenceLength,t.headSize],r=t.sequenceLength,o=t.inputHiddenSize,a=t.headSize,s=12,d={x:Math.ceil(t.headSize/s),y:Math.ceil(t.sequenceLength/s),z:t.batchSize*t.numHeads},l=[e.inputs[0],e.inputs[1],e.inputs[2]],p=[{type:12,data:r},{type:12,data:o},{type:12,data:a},{type:12,data:t.numHeads},{type:12,data:t.headSize},{type:12,data:t.hiddenSize},{type:12,data:t.hiddenSize+t.hiddenSize+t.vHiddenSize}],f=h=>{let y=N("output_q",l[0].dataType,n),_=N("output_k",l[0].dataType,n),b=N("output_v",l[0].dataType,n),w=P("input",l[0].dataType,l[0].dims),S=P("weight",l[1].dataType,l[1].dims),$=P("bias",l[2].dataType,l[2].dims),v=w.type.storage,T=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"hidden_size",type:"u32"},{name:"ldb",type:"u32"}];return` + const TILE_SIZE = ${s}u; + var tileInput: array<${v}, ${s*s}>; + var tileWeightQ: array<${v}, ${s*s}>; + var tileWeightK: array<${v}, ${s*s}>; + var tileWeightV: array<${v}, ${s*s}>; + ${h.registerUniforms(T).declareVariables(w,S,$,y,_,b)} + ${h.mainStart([s,s,1])} + let batchIndex = workgroup_id.z / uniforms.num_heads; + let headNumber = workgroup_id.z % uniforms.num_heads; + let m = global_id.y; + let n = global_id.x; + + let inputOffset = batchIndex * (uniforms.M * uniforms.K) + m * uniforms.K; + let biasOffsetQ = headNumber * uniforms.head_size; + let biasOffsetK = uniforms.hidden_size + biasOffsetQ; + let biasOffsetV = uniforms.hidden_size + biasOffsetK; + + var valueQ = ${v}(0); + var valueK = ${v}(0); + var valueV = ${v}(0); + for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { + if (m < uniforms.M && w + local_id.x < uniforms.K) { + tileInput[TILE_SIZE * local_id.y + local_id.x] = input[inputOffset + w + local_id.x]; + } + if (n < uniforms.N && w + local_id.y < uniforms.K) { + let offset = n + (w + local_id.y) * uniforms.ldb; + tileWeightQ[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetQ + offset]; + tileWeightK[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetK + offset]; + tileWeightV[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetV + offset]; + } + workgroupBarrier(); + for (var k: u32 = 0u; k({outputs:[{dims:n,dataType:e.inputs[0].dataType,gpuDataType:0},{dims:n,dataType:e.inputs[0].dataType,gpuDataType:0},{dims:n,dataType:e.inputs[0].dataType,gpuDataType:0}],dispatchGroup:d,programUniforms:p}),getShaderSource:f},{inputs:l,outputs:[-1,-1,-1]})},wu=(e,t)=>{let n=Sh(e.inputs,t),[r,o,a]=Ah(e,n);return Ut(e,r,o,a,e.inputs[4],void 0,void 0,void 0,e.inputs[5],n)}});var kh,Eh,Ph,vu,$u=G(()=>{"use strict";Ge();te();ae();Ce();ce();kh=(e,t)=>{if(!e||e.length!==5)throw new Error("BatchNormalization requires 5 inputs");let n=(r,o,a)=>{let s=o.length;if(s!==r.length)throw new Error(`${a}: num dimensions != ${s}`);o.forEach((d,l)=>{if(d!==r[l])throw new Error(`${a}: dim[${l}] do not match`)})};if(e[0].dims.length>1){let r=t.format==="NHWC"?t.spatial?e[0].dims.slice(-1):e[0].dims.slice(-1).concat(e[0].dims.slice(1,e[0].dims.length-1)):e[0].dims.slice(1,t.spatial?2:void 0);n(e[1].dims,r,"Invalid input scale"),n(e[2].dims,r,"Invalid input B"),n(e[3].dims,r,"Invalid input mean"),n(e[4].dims,r,"Invalid input var")}else n(e[1].dims,[1],"Invalid input scale"),n(e[2].dims,[1],"Invalid input B"),n(e[3].dims,[1],"Invalid input mean"),n(e[4].dims,[1],"Invalid input var")},Eh=(e,t)=>{let{epsilon:n,spatial:r,format:o}=t,a=e[0].dims,s=r?ge(a[a.length-1]):1,d=o==="NHWC"&&a.length>1?s:1,l=E.size(a)/s,p=r,f=p?a.length:a,h=P("x",e[0].dataType,e[0].dims,s),y=P("scale",e[1].dataType,e[1].dims,d),_=P("bias",e[2].dataType,e[2].dims,d),b=P("inputMean",e[3].dataType,e[3].dims,d),w=P("inputVar",e[4].dataType,e[4].dims,d),S=N("y",e[0].dataType,f,s),$=()=>{let T="";if(r)T=`let cOffset = ${a.length===1?"0u":o==="NHWC"?`outputIndices[${a.length-1}] / ${s}`:"outputIndices[1]"};`;else if(o==="NCHW")T=` + ${S.indicesSet("outputIndices","0","0")} + let cOffset = ${S.indicesToOffset("outputIndices")};`;else{T=`var cIndices = ${y.type.indices}(0); + cIndices[0] = outputIndices[${a.length-1}];`;for(let C=1;C` + const epsilon = ${n}; + ${T.registerUniform("outputSize","u32").declareVariables(h,y,_,b,w,S)} + ${T.mainStart()} + ${T.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + var outputIndices = ${S.offsetToIndices(`global_idx * ${s}`)}; + ${$()} + let scale = ${y.getByOffset("cOffset")}; + let bias = ${_.getByOffset("cOffset")}; + let inputMean = ${b.getByOffset("cOffset")}; + let inputVar = ${w.getByOffset("cOffset")}; + let x = ${h.getByOffset("global_idx")}; + let value = (x - inputMean) * inverseSqrt(inputVar + epsilon) * scale + bias; + ${S.setByOffset("global_idx","value")} + }`;return{name:"BatchNormalization",shaderCache:{hint:`${t.epsilon}_${t.format}_${r}_${s}`,inputDependencies:p?["rank","type","type","type","type"]:void 0},getShaderSource:v,getRunData:()=>({outputs:[{dims:e[0].dims,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(l/64)},programUniforms:p?[{type:12,data:l},...H(a)]:[{type:12,data:l}]})}},Ph=e=>re(e),vu=(e,t)=>{let{inputs:n,outputCount:r}=e,o=Ph({...t,outputCount:r});if(we.webgpu.validateInputContent&&kh(n,o),t.trainingMode)throw new Error("BatchNormalization trainingMode is not supported yet.");e.compute(Eh(n,o))}});var zh,Oh,xu,Su=G(()=>{"use strict";ae();ce();zh=e=>{if(e[0].dims.length!==3)throw new Error("input should have 3 dimensions");if(![320,640,1280].includes(e[0].dims[2]))throw new Error("number of channels should be 320, 640 or 1280");if(e[1].dims.length!==1)throw new Error("bias is expected to have 1 dimensions");if(e[0].dims[2]!==e[1].dims[0])throw new Error("last dimension of input and bias are not the same")},Oh=e=>{let t=e[0].dims,n=e[0].dims[2],r=E.size(t)/4,o=e[0].dataType,a=P("input",o,t,4),s=P("bias",o,[n],4),d=P("residual",o,t,4),l=N("output",o,t,4);return{name:"BiasAdd",getRunData:()=>({outputs:[{dims:t,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(r/64)}}),getShaderSource:f=>` + const channels = ${n}u / 4; + ${f.declareVariables(a,s,d,l)} + + ${f.mainStart()} + ${f.guardAgainstOutOfBoundsWorkgroupSizes(r)} + let value = ${a.getByOffset("global_idx")} + + ${s.getByOffset("global_idx % channels")} + ${d.getByOffset("global_idx")}; + ${l.setByOffset("global_idx","value")} + }`}},xu=e=>{zh(e.inputs),e.compute(Oh(e.inputs))}});var Dh,ye,Tu,Cu,Iu,Au,ku,Eu,Pu,zu,Ou,Bh,Du,Bu,Mu,Ru,tr,Uu,Kr,Nu,Vu,Wu,Lu,Gu,Hu,Fu,qu,Ku,ju,Zu,Qu,Yu,Xu,Ju,ed,td,rd,mo,fo,nd,od,id,Mh,Rh,ad,jr=G(()=>{"use strict";te();ae();Ce();ce();Dh=(e,t,n,r,o,a,s)=>{let d=Math.ceil(t/4),l="";typeof o=="string"?l=`${o}(a)`:l=o("a");let p=P("inputData",n,[d],4),f=N("outputData",r,[d],4),h=[{name:"vec_size",type:"u32"}];return s&&h.push(...s),` + ${e.registerUniforms(h).declareVariables(p,f)} + + ${a??""} + + ${e.mainStart()} + ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + + let a = ${p.getByOffset("global_idx")}; + ${f.setByOffset("global_idx",l)} + }`},ye=(e,t,n,r,o,a=e.dataType,s,d)=>{let l=[{type:12,data:Math.ceil(E.size(e.dims)/4)}];return s&&l.push(...s),{name:t,shaderCache:{hint:o,inputDependencies:["type"]},getShaderSource:p=>Dh(p,E.size(e.dims),e.dataType,a,n,r,d),getRunData:p=>({outputs:[{dims:e.dims,dataType:a}],dispatchGroup:{x:Math.ceil(E.size(p[0].dims)/64/4)},programUniforms:l})}},Tu=e=>{e.compute(ye(e.inputs[0],"Abs","abs"))},Cu=e=>{e.compute(ye(e.inputs[0],"Acos","acos"))},Iu=e=>{e.compute(ye(e.inputs[0],"Acosh","acosh"))},Au=e=>{e.compute(ye(e.inputs[0],"Asin","asin"))},ku=e=>{e.compute(ye(e.inputs[0],"Asinh","asinh"))},Eu=e=>{e.compute(ye(e.inputs[0],"Atan","atan"))},Pu=e=>{e.compute(ye(e.inputs[0],"Atanh","atanh"))},zu=e=>re(e),Ou=(e,t)=>{let n;switch(t.to){case 10:n="vec4";break;case 1:n="vec4";break;case 12:n="vec4";break;case 6:n="vec4";break;case 9:n="vec4";break;default:throw new RangeError(`not supported type (specified in attribute 'to' from 'Cast' operator): ${t.to}`)}e.compute(ye(e.inputs[0],"Cast",n,void 0,t.cacheKey,t.to))},Bh=e=>{let t,n,r=e.length>=2&&e[1].data!==0,o=e.length>=3&&e[2].data!==0;switch(e[0].dataType){case 1:t=r?e[1].getFloat32Array()[0]:-34028234663852886e22,n=o?e[2].getFloat32Array()[0]:34028234663852886e22;break;case 10:t=r?e[1].getUint16Array()[0]:64511,n=o?e[2].getUint16Array()[0]:31743;break;default:throw new Error("Unsupport data type")}return re({min:t,max:n})},Du=(e,t)=>{let n=t||Bh(e.inputs),r=ze(e.inputs[0].dataType);e.compute(ye(e.inputs[0],"Clip",o=>`clamp(${o}, vec4<${r}>(uniforms.min), vec4<${r}>(uniforms.max))`,void 0,n.cacheKey,void 0,[{type:e.inputs[0].dataType,data:n.min},{type:e.inputs[0].dataType,data:n.max}],[{name:"min",type:r},{name:"max",type:r}]),{inputs:[0]})},Bu=e=>{e.compute(ye(e.inputs[0],"Ceil","ceil"))},Mu=e=>{e.compute(ye(e.inputs[0],"Cos","cos"))},Ru=e=>{e.compute(ye(e.inputs[0],"Cosh","cosh"))},tr=e=>re(e),Uu=(e,t)=>{let n=ze(e.inputs[0].dataType);e.compute(ye(e.inputs[0],"Elu",r=>`elu_vf32(${r})`,` + const elu_alpha_ = ${n}(${t.alpha}); + + fn elu_f32(a: ${n}) -> ${n} { + return select((exp(a) - 1.0) * elu_alpha_, a, a >= 0.0); + } + + fn elu_vf32(v: vec4<${n}>) -> vec4<${n}> { + return vec4(elu_f32(v.x), elu_f32(v.y), elu_f32(v.z), elu_f32(v.w)); + }`,t.cacheKey))},Kr=(e="f32")=>` +const r0: ${e} = 0.3275911; +const r1: ${e} = 0.254829592; +const r2: ${e} = -0.284496736; +const r3: ${e} = 1.421413741; +const r4: ${e} = -1.453152027; +const r5: ${e} = 1.061405429; + +fn erf_vf32(v: vec4<${e}>) -> vec4<${e}> { + let absv = abs(v); + let x = 1.0 / (1.0 + r0 * absv); + return sign(v) * (1.0 - ((((r5 * x + r4) * x + r3) * x + r2) * x + r1) * x * exp(-absv * absv)); +}`,Nu=e=>{let t=ze(e.inputs[0].dataType);e.compute(ye(e.inputs[0],"Erf",n=>`erf_vf32(${n})`,Kr(t)))},Vu=e=>{e.compute(ye(e.inputs[0],"Exp","exp"))},Wu=e=>{e.compute(ye(e.inputs[0],"Floor","floor"))},Lu=e=>{let t=ze(e.inputs[0].dataType);e.compute(ye(e.inputs[0],"Gelu",n=>`0.5 * ${n} * (1.0 + erf_vf32(${n} * 0.7071067811865475))`,Kr(t)))},Gu=(e,t)=>{let n=ze(e.inputs[0].dataType);e.compute(ye(e.inputs[0],"LeakyRelu",r=>`select(leaky_relu_alpha_ * ${r}, ${r}, ${r} >= vec4<${n}>(0.0))`,`const leaky_relu_alpha_ = ${n}(${t.alpha});`,t.cacheKey))},Hu=e=>{e.compute(ye(e.inputs[0],"Not",t=>`!${t}`))},Fu=e=>{e.compute(ye(e.inputs[0],"Neg",t=>`-${t}`))},qu=e=>{e.compute(ye(e.inputs[0],"Reciprocal",t=>`1.0/${t}`))},Ku=e=>{let t=ze(e.inputs[0].dataType);e.compute(ye(e.inputs[0],"Relu",n=>`select(vec4<${t}>(0.0), ${n}, ${n} > vec4<${t}>(0.0))`))},ju=e=>{e.compute(ye(e.inputs[0],"Sigmoid",t=>`(1.0 / (1.0 + exp(-${t})))`))},Zu=e=>re(e),Qu=(e,t)=>{let n=ze(e.inputs[0].dataType);e.compute(ye(e.inputs[0],"HardSigmoid",r=>`max(vec4<${n}>(0.0), min(vec4<${n}>(1.0), ${t.alpha} * ${r} + vec4<${n}>(${t.beta})))`,void 0,t.cacheKey))},Yu=e=>{e.compute(ye(e.inputs[0],"Sin","sin"))},Xu=e=>{e.compute(ye(e.inputs[0],"Sinh","sinh"))},Ju=e=>{e.compute(ye(e.inputs[0],"Sqrt","sqrt"))},ed=e=>{e.compute(ye(e.inputs[0],"Tan","tan"))},td=e=>`sign(${e}) * (1 - exp(-2 * abs(${e}))) / (1 + exp(-2 * abs(${e})))`,rd=e=>{e.compute(ye(e.inputs[0],"Tanh",td))},mo=(e="f32")=>` +const fast_gelu_a: ${e} = 0.5; +const fast_gelu_b: ${e} = 0.7978845608028654; +const fast_gelu_c: ${e} = 0.035677408136300125; + +fn tanh_v(v: vec4<${e}>) -> vec4<${e}> { + return ${td("v")}; +} +`,fo=e=>`(fast_gelu_a + fast_gelu_a * tanh_v(${e} * (fast_gelu_c * ${e} * ${e} + fast_gelu_b))) * ${e}`,nd=e=>{let t=ze(e.inputs[0].dataType);e.compute(ye(e.inputs[0],"FastGelu",fo,mo(t),void 0,e.inputs[0].dataType))},od=(e,t)=>{let n=ze(e.inputs[0].dataType);return e.compute(ye(e.inputs[0],"ThresholdedRelu",r=>`select(vec4<${n}>(0.0), ${r}, ${r} > thresholded_relu_alpha_)`,`const thresholded_relu_alpha_ = vec4<${n}>(${t.alpha});`,t.cacheKey)),0},id=e=>{e.compute(ye(e.inputs[0],"Log","log"))},Mh=(e,t)=>` +const alpha = vec4<${e}>(${t}); +const one = ${e}(1.0); +const zero = ${e}(0.0); + +fn quick_gelu_impl(x: vec4<${e}>) -> vec4<${e}> { + let v = x *alpha; + var x1 : vec4<${e}>; + for (var i = 0; i < 4; i = i + 1) { + if (v[i] >= zero) { + x1[i] = one / (one + exp(-v[i])); + } else { + x1[i] = one - one / (one + exp(v[i])); + } + } + return x * x1; +} +`,Rh=e=>`quick_gelu_impl(${e})`,ad=(e,t)=>{let n=ze(e.inputs[0].dataType);e.compute(ye(e.inputs[0],"QuickGelu",Rh,Mh(n,t.alpha),t.cacheKey,e.inputs[0].dataType))}});var Uh,Nh,ud,dd=G(()=>{"use strict";ae();ce();jr();Uh=e=>{if(e[0].dims.length!==3)throw new Error("input should have 3 dimensions");if(![2560,5120,10240].includes(e[0].dims[2]))throw new Error("hidden state should be 2560, 5120 or 10240");if(e[1].dims.length!==1)throw new Error("bias is expected to have 1 dimensions");if(e[0].dims[2]!==e[1].dims[0])throw new Error("last dimension of input and bias are not the same")},Nh=e=>{let t=e[0].dims.slice();t[2]=t[2]/2;let n=P("input",e[0].dataType,e[0].dims,4),r=P("bias",e[0].dataType,[e[0].dims[2]],4),o=N("output",e[0].dataType,t,4),a=E.size(t)/4,s=_e(e[0].dataType);return{name:"BiasSplitGelu",getRunData:()=>({outputs:[{dims:t,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(a/64)}}),getShaderSource:l=>` + const M_SQRT2 = sqrt(2.0); + const halfChannels = ${e[0].dims[2]/4/2}u; + + ${l.declareVariables(n,r,o)} + + ${Kr(s)} + + ${l.mainStart()} + ${l.guardAgainstOutOfBoundsWorkgroupSizes(a)} + let biasIdx = global_idx % halfChannels; + let batchIndex = global_idx / halfChannels; + let inputOffset = biasIdx + batchIndex * halfChannels * 2; + let valueLeft = input[inputOffset] + bias[biasIdx]; + let valueRight = input[inputOffset + halfChannels] + bias[biasIdx + halfChannels]; + let geluRight = valueRight * 0.5 * (erf_vf32(valueRight / M_SQRT2) + 1); + + ${o.setByOffset("global_idx","valueLeft * geluRight")} + }`}},ud=e=>{Uh(e.inputs),e.compute(Nh(e.inputs))}});var Vh,Wh,st,ld,cd,pd,md,fd,hd,gd,yd,bd,_d,wd=G(()=>{"use strict";te();ae();ce();Vh=(e,t,n,r,o,a,s,d,l,p,f,h)=>{let y,_;typeof d=="string"?y=_=(v,T)=>`${d}((${v}),(${T}))`:typeof d=="function"?y=_=d:(y=d.scalar,_=d.vector);let b=N("outputData",f,r.length,4),w=P("aData",l,t.length,4),S=P("bData",p,n.length,4),$;if(o)if(a){let v=E.size(t)===1,T=E.size(n)===1,C=t.length>0&&t[t.length-1]%4===0,A=n.length>0&&n[n.length-1]%4===0;v||T?$=b.setByOffset("global_idx",_(v?`${w.type.value}(${w.getByOffset("0")}.x)`:w.getByOffset("global_idx"),T?`${S.type.value}(${S.getByOffset("0")}.x)`:S.getByOffset("global_idx"))):$=` + let outputIndices = ${b.offsetToIndices("global_idx * 4u")}; + let offsetA = ${w.broadcastedIndicesToOffset("outputIndices",b)}; + let offsetB = ${S.broadcastedIndicesToOffset("outputIndices",b)}; + ${b.setByOffset("global_idx",_(s||C?w.getByOffset("offsetA / 4u"):`${w.type.value}(${w.getByOffset("offsetA / 4u")}[offsetA % 4u])`,s||A?S.getByOffset("offsetB / 4u"):`${S.type.value}(${S.getByOffset("offsetB / 4u")}[offsetB % 4u])`))} + `}else $=b.setByOffset("global_idx",_(w.getByOffset("global_idx"),S.getByOffset("global_idx")));else{if(!a)throw new Error("no necessary to use scalar implementation for element-wise binary op implementation.");let v=(T,C,A="")=>{let k=`aData[indexA${C}][componentA${C}]`,O=`bData[indexB${C}][componentB${C}]`;return` + let outputIndices${C} = ${b.offsetToIndices(`global_idx * 4u + ${C}u`)}; + let offsetA${C} = ${w.broadcastedIndicesToOffset(`outputIndices${C}`,b)}; + let offsetB${C} = ${S.broadcastedIndicesToOffset(`outputIndices${C}`,b)}; + let indexA${C} = offsetA${C} / 4u; + let indexB${C} = offsetB${C} / 4u; + let componentA${C} = offsetA${C} % 4u; + let componentB${C} = offsetB${C} % 4u; + ${T}[${C}] = ${A}(${y(k,O)}); + `};f===9?$=` + var data = vec4(0); + ${v("data",0,"u32")} + ${v("data",1,"u32")} + ${v("data",2,"u32")} + ${v("data",3,"u32")} + outputData[global_idx] = dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(data));`:$=` + ${v("outputData[global_idx]",0)} + ${v("outputData[global_idx]",1)} + ${v("outputData[global_idx]",2)} + ${v("outputData[global_idx]",3)} + `}return` + ${e.registerUniform("vec_size","u32").declareVariables(w,S,b)} + + ${h??""} + + ${e.mainStart()} + ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + ${$} + }`},Wh=(e,t,n,r,o,a,s=n.dataType)=>{let d=n.dims.map(w=>Number(w)??1),l=r.dims.map(w=>Number(w)??1),p=!E.areEqual(d,l),f=d,h=E.size(d),y=!1,_=!1,b=[p];if(p){let w=rt.calcShape(d,l,!1);if(!w)throw new Error("Can't perform binary op on the given tensors");f=w.slice(),h=E.size(f);let S=E.size(d)===1,$=E.size(l)===1,v=d.length>0&&d[d.length-1]%4===0,T=l.length>0&&l[l.length-1]%4===0;b.push(S),b.push($),b.push(v),b.push(T);let C=1;for(let A=1;Aw.toString()).join("_"),inputDependencies:["rank","rank"]},getShaderSource:w=>Vh(w,d,l,f,y,p,_,o,n.dataType,r.dataType,s,a),getRunData:()=>({outputs:[{dims:f,dataType:s}],dispatchGroup:{x:Math.ceil(h/64/4)},programUniforms:[{type:12,data:Math.ceil(E.size(f)/4)},...H(d,l,f)]})}},st=(e,t,n,r,o,a)=>{e.compute(Wh(t,o??"",e.inputs[0],e.inputs[1],n,r,a))},ld=e=>{st(e,"Add",(t,n)=>`${t}+${n}`)},cd=e=>{st(e,"Div",(t,n)=>`${t}/${n}`)},pd=e=>{st(e,"Equal",{scalar:(t,n)=>`u32(${t}==${n})`,vector:(t,n)=>`vec4(${t}==${n})`},void 0,void 0,9)},md=e=>{st(e,"Mul",(t,n)=>`${t}*${n}`)},fd=e=>{let t=P("input",e.inputs[0].dataType,e.inputs[0].dims).type.value;st(e,"Pow",{scalar:(r,o)=>`pow_custom(${r},${o})`,vector:(r,o)=>`pow_vector_custom(${r},${o})`},` + fn pow_custom(a : ${t}, b : ${t}) -> ${t} { + if (b == ${t}(0.0)) { + return ${t}(1.0); + } else if (a < ${t}(0.0) && f32(b) != floor(f32(b))) { + return ${t}(pow(f32(a), f32(b))); // NaN + } + return select(sign(a), ${t}(1.0), round(f32(abs(b) % ${t}(2.0))) != 1.0) * ${t}(${t==="i32"?"round":""}(pow(f32(abs(a)), f32(b)))); + } + fn pow_vector_custom(a : vec4<${t}>, b : vec4<${t}>) -> vec4<${t}> { + // TODO: implement vectorized pow + return vec4<${t}>(pow_custom(a.x, b.x), pow_custom(a.y, b.y), pow_custom(a.z, b.z), pow_custom(a.w, b.w)); + } + `)},hd=e=>{st(e,"Sub",(t,n)=>`${t}-${n}`)},gd=e=>{st(e,"Greater",{scalar:(t,n)=>`u32(${t}>${n})`,vector:(t,n)=>`vec4(${t}>${n})`},void 0,void 0,9)},yd=e=>{st(e,"Less",{scalar:(t,n)=>`u32(${t}<${n})`,vector:(t,n)=>`vec4(${t}<${n})`},void 0,void 0,9)},bd=e=>{st(e,"GreaterOrEqual",{scalar:(t,n)=>`u32(${t}>=${n})`,vector:(t,n)=>`vec4(${t}>=${n})`},void 0,void 0,9)},_d=e=>{st(e,"LessOrEqual",{scalar:(t,n)=>`u32(${t}<=${n})`,vector:(t,n)=>`vec4(${t}<=${n})`},void 0,void 0,9)}});var Gh,Hh,Fh,qh,vd,$d,xd=G(()=>{"use strict";te();ae();Ce();ce();Gh=(e,t)=>{if(!e||e.length<1)throw new Error("too few inputs");let n=0,r=e[n],o=r.dataType,a=r.dims.length;e.forEach((s,d)=>{if(d!==n){if(s.dataType!==o)throw new Error("input tensors should be one type");if(s.dims.length!==a)throw new Error("input tensors should have the same shape");s.dims.forEach((l,p)=>{if(p!==t&&l!==r.dims[p])throw new Error("non concat dimensions must match")})}})},Hh=(e,t)=>` + fn calculateInputIndex(index: u32) -> u32 { + let sizeInConcatAxis = array(${t}); + for (var i: u32 = 0u; i < ${e}; i += 1u ) { + if (index < sizeInConcatAxis[i]) { + return i; + } + } + return ${e}u; + }`,Fh=(e,t)=>{let n=e.length,r=[];for(let o=0;o{let o=E.size(n),a=new Array(e.length),s=new Array(e.length),d=0,l=[],p=[],f=[{type:12,data:o}];for(let w=0;w`uniforms.sizeInConcatAxis${w}`).join(","),b=w=>` + + ${(()=>{w.registerUniform("outputSize","u32");for(let S=0;S(${_}); + ${y} -= sizeInConcatAxis[inputIndex - 1u]; + } + + ${Fh(s,h)} + }`;return{name:"Concat",shaderCache:{hint:`${t}`,inputDependencies:l},getRunData:()=>({outputs:[{dims:n,dataType:r}],dispatchGroup:{x:Math.ceil(o/64)},programUniforms:f}),getShaderSource:b}},vd=(e,t)=>{let n=e.inputs,r=n[0].dims,o=E.normalizeAxis(t.axis,r.length);Gh(n,o);let a=r.slice();a[o]=n.reduce((d,l)=>d+(l.dims.length>o?l.dims[o]:0),0);let s=n.filter(d=>E.size(d.dims)>0);e.compute(qh(s,o,a,n[0].dataType),{inputs:s})},$d=e=>re({axis:e.axis})});var je,Ze,Qe,Zr,vt=G(()=>{"use strict";te();ae();je=(e,t,n="f32")=>{switch(e.activation){case"Relu":return`value = max(value, ${t}(0.0));`;case"Sigmoid":return`value = (${t}(1.0) / (${t}(1.0) + exp(-value)));`;case"Clip":return`value = clamp(value, ${t}(${n}(uniforms.clip_min)), ${t}(${n}(uniforms.clip_max)));`;case"HardSigmoid":return`value = max(${t}(0.0), min(${t}(1.0), ${n}(uniforms.alpha) * value + ${n}(uniforms.beta)));`;case"LeakyRelu":return`value = select(${n}(uniforms.alpha) * value, value, value >= ${t}(0.0));`;case"Tanh":return`let e2x = exp(-2.0 * abs(value)); + value = sign(value) * (1.0 - e2x) / (1.0 + e2x); + `;case"":return"";default:throw new Error(`Unsupported activation ${e.activation}`)}},Ze=(e,t)=>{e.activation==="Clip"?t.push({type:1,data:e.clipMax},{type:1,data:e.clipMin}):e.activation==="HardSigmoid"?t.push({type:1,data:e.alpha},{type:1,data:e.beta}):e.activation==="LeakyRelu"&&t.push({type:1,data:e.alpha})},Qe=(e,t)=>{e.activation==="Clip"?t.push({name:"clip_max",type:"f32"},{name:"clip_min",type:"f32"}):e.activation==="HardSigmoid"?t.push({name:"alpha",type:"f32"},{name:"beta",type:"f32"}):e.activation==="LeakyRelu"&&t.push({name:"alpha",type:"f32"})},Zr=e=>{let t=e?.activation||"";if(t==="HardSigmoid"){let[n,r]=e?.activation_params||[.2,.5];return{activation:t,alpha:n,beta:r}}else if(t==="Clip"){let[n,r]=e?.activation_params||[Ls,Gs];return{activation:t,clipMax:r,clipMin:n}}else if(t==="LeakyRelu"){let[n]=e?.activation_params||[.01];return{activation:t,alpha:n}}return{activation:t}}});var Ee,Sd,Qr=G(()=>{"use strict";Ee=(e,t)=>{switch(e){case 1:return t;case 2:return`vec2<${t}>`;case 3:return`vec3<${t}>`;case 4:return`vec4<${t}>`;default:throw new Error(`${e}-component is not supported.`)}},Sd=e=>` + ${e?"value = value + getBiasByOutputCoords(coords);":""} + `});var Td,Cd=G(()=>{"use strict";Td=e=>` +fn getIndexFromCoords4D(coords : vec4, shape : vec4) -> i32 { + return dot(coords, vec4( + shape.y * shape.z * shape.w, shape.z * shape.w, shape.w, 1)); +} +fn getOutputIndexFromCoords(coords : vec4) -> i32 { + return dot(coords, vec4( + i32(${e}.x), i32(${e}.y), i32(${e}.z), 1)); +} +`});var rr,Yr,Xr=G(()=>{"use strict";te();ae();ce();vt();rr=(e,t,n,r,o)=>{let a=r-n;return` + ${Array.from({length:n}).map((s,d)=>` + if (${K(t.shape,d,t.rank)} != 1) { + ${t.indicesSet(e,d,K(o,d+a,r))} + } else { + ${t.indicesSet(e,d,0)} + }`).join("")} +`},Yr=(e,t,n,r,o=!1,a)=>{let s=e[0].dims,d=e[1].dims,l=s[s.length-2],p=d[d.length-1],f=s[s.length-1],h=ge(p),y=ge(f),_=ge(l),b=E.size(n)/h/_,w=e.length>2,S=r?r.slice(0,-2):n.slice(0,-2),v=[E.size(S),l,p],T=[{type:12,data:b},{type:12,data:l},{type:12,data:p},{type:12,data:f}];Ze(t,T),T.push(...H(S,s,d)),w&&T.push(...H(e[2].dims)),T.push(...H(v));let C=A=>{let k=Gr("batch_dims",e[0].dataType,S.length),O=P("a",e[0].dataType,s.length,y),M=P("b",e[1].dataType,d.length,h),V=N("output",e[0].dataType,v.length,h),F=_e(V.type.tensor),j=je(t,V.type.value,F),ne=[O,M],W="";if(w){let Q=o?h:1;ne.push(P("bias",e[2].dataType,e[2].dims.length,Q)),W=`${o?`value += bias[col / ${Q}];`:`value += ${V.type.value}(bias[row + i]);`}`}let J=[{name:"output_size",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"}];Qe(t,J);let ve=()=>{let Q=`var a_data: ${O.type.value};`;for(let ee=0;ee; + for (var k: u32 = 0u; k < uniforms.K; k = k + ${y}) { + ${ve()} + } + for (var i = 0u; i < ${_}u; i++) { + var value = values[i]; + ${W} + ${j} + let cur_indices = ${V.type.indices}(batch, row + i, col); + let offset = ${V.indicesToOffset("cur_indices")}; + ${V.setByOffset(`offset / ${h}`,"value")}; + } + } + `};return{name:"MatMulNaive",shaderCache:{hint:`${t.activation};${h};${y};${_};${o}`,inputDependencies:w?["rank","rank","rank"]:["rank","rank"]},getRunData:()=>({outputs:[{dims:a?a(n):n,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(b/64)},programUniforms:T}),getShaderSource:C}}});var Kh,jh,ho,Id,Zh,go,Qh,nr,Jr=G(()=>{"use strict";te();ae();ce();vt();Xr();Qr();Kh=(e,t)=>e?` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + kStart + inputRow, + globalRowStart / innerElementSize + inputCol${t?", batchIndices":""}); + `:` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + globalRow + innerRow, + kStart / innerElementSize + inputCol${t?", batchIndices":""}); + `,jh=(e,t)=>e?` + let ACached0 = mm_Asub[k * innerElementSize][localRow]; + let ACached1 = mm_Asub[k * innerElementSize + 1][localRow]; + let ACached2 = mm_Asub[k * innerElementSize + 2][localRow]; + ${t===3?"":"let ACached3 = mm_Asub[k * innerElementSize + 3][localRow];"} + for (var i = 0; i < rowPerThread; i = i + 1) { + acc[i] = BCached0 * ACached0[i] + acc[i]; + acc[i] = BCached1 * ACached1[i] + acc[i]; + acc[i] = BCached2 * ACached2[i] + acc[i]; + ${t===3?"":"acc[i] = BCached3 * ACached3[i] + acc[i];"} + }`:` + for (var i = 0; i < rowPerThread; i = i + 1) { + let ACached = mm_Asub[tileRow + i][k]; + acc[i] = BCached0 * ACached.x + acc[i]; + acc[i] = BCached1 * ACached.y + acc[i]; + acc[i] = BCached2 * ACached.z + acc[i]; + ${t===3?"":"acc[i] = BCached3 * ACached.w + acc[i];"} + }`,ho=(e,t,n="f32",r,o=!1,a=32,s=!1,d=32)=>{let l=t[1]*e[1],p=t[0]*e[0],f=o?l:a,h=o?a:l,y=f/t[0],_=a/t[1];if(!((o&&y===4&&e[1]===4||!o&&(y===3||y===4))&&f%t[0]===0&&a%t[1]===0&&e[0]===4))throw new Error(`If transposeA ${o} is true, innerElementSize ${y} and workPerThread[1] ${e[1]} must be 4. + Otherwise, innerElementSize ${y} must be 3 or 4. + tileAWidth ${f} must be divisible by workgroupSize[0]${t[0]}. tileInner ${a} must be divisible by workgroupSize[1] ${t[1]}. colPerThread ${e[0]} must be 4.`);return` +var mm_Asub: array, ${f/y}>, ${h}>; +var mm_Bsub: array, ${p/e[0]}>, ${a}>; + +const rowPerThread = ${e[1]}; +const colPerThread = ${e[0]}; +const innerElementSize = ${y}; +const tileInner = ${a}; + +@compute @workgroup_size(${t[0]}, ${t[1]}, ${t[2]}) +fn main(@builtin(local_invocation_id) localId : vec3, + @builtin(global_invocation_id) globalId : vec3, + @builtin(workgroup_id) workgroupId : vec3) { + let localRow = i32(localId.y); + let tileRow = localRow * rowPerThread; + let tileCol = i32(localId.x); + + let globalRow =i32(globalId.y) * rowPerThread; + let globalCol = i32(globalId.x); + let batch = ${s?"0":"i32(globalId.z)"}; + ${r?`let batchIndices = ${r.offsetToIndices("u32(batch)")};`:""} + let globalRowStart = i32(workgroupId.y) * ${l}; + + let num_tiles = ${s?`${Math.ceil(d/a)}`:"(uniforms.dim_inner - 1) / tileInner + 1"}; + var kStart = ${s?`i32(globalId.z) * ${d}`:"0"}; + + var acc: array, rowPerThread>; + + // Loop over shared dimension. + let tileRowB = localRow * ${_}; + for (var t = 0; t < num_tiles; t = t + 1) { + // Load one tile of A into local memory. + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + let inputRow = tileRow + innerRow; + let inputCol = tileCol; + ${Kh(o,r)} + } + + // Load one tile of B into local memory. + for (var innerRow = 0; innerRow < ${_}; innerRow = innerRow + 1) { + let inputRow = tileRowB + innerRow; + let inputCol = tileCol; + mm_Bsub[inputRow][inputCol] = mm_readB(batch, kStart + inputRow, globalCol${r?", batchIndices":""}); + } + kStart = kStart + tileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + for (var k = 0; k < tileInner / innerElementSize; k = k + 1) { + let BCached0 = mm_Bsub[k * innerElementSize][tileCol]; + let BCached1 = mm_Bsub[k * innerElementSize + 1][tileCol]; + let BCached2 = mm_Bsub[k * innerElementSize + 2][tileCol]; + ${y===3?"":"let BCached3 = mm_Bsub[k * innerElementSize + 3][tileCol];"} + + ${jh(o,y)} + } + + workgroupBarrier(); + } + + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + mm_write(batch, globalRow + innerRow, globalCol, acc[innerRow]); + } +}`},Id=(e,t)=>e?` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + kStart + inputRow, + globalRowStart + inputCol${t?", batchIndices":""}); + `:` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + globalRowStart + inputRow, + kStart + inputCol${t?", batchIndices":""}); + `,Zh=e=>e?"let ACached = mm_Asub[k][tileRow + innerRow];":"let ACached = mm_Asub[tileRow + innerRow][k];",go=(e,t,n="f32",r,o=!1,a=32,s=!1,d=32,l=!1)=>{let p=e[1]*t[1],f=e[0]*t[0],h=o?p:a,y=o?a:p;if(!(y%t[1]===0&&h%t[0]===0&&a%t[1]===0))throw new Error(`tileAHight ${y} must be divisible by workgroupSize[1]${t[1]}, tileAWidth ${h} must be divisible by workgroupSize[0]${t[0]}, tileInner ${a} must be divisible by workgroupSize[1]${t[1]}`);let _=y/t[1],b=h/t[0],w=a/t[1],S=l?` + let localRow = i32(localId.y); + let localCol = i32(localId.x); + let globalRowStart = i32(workgroupId.y) * ${p}; + let globalColStart = i32(workgroupId.x) * ${f}; + + // Loop over shared dimension. + for (var t = 0; t < num_tiles; t = t + 1) { + // Load one tile of A into local memory. + for (var inputRow = localRow; inputRow < ${y}; inputRow = inputRow + ${t[1]}) { + for (var inputCol = localCol; inputCol < ${h}; inputCol = inputCol + ${t[0]}) { + ${Id(o,r)} + } + } + // Load one tile of B into local memory. + for (var inputRow = localRow; inputRow < ${a}; inputRow = inputRow + ${t[1]}) { + for (var inputCol = localCol; inputCol < ${f}; inputCol = inputCol + ${t[0]}) { + mm_Bsub[inputRow][inputCol] = mm_readB(batch, + kStart + inputRow, + globalColStart + inputCol${r?", batchIndices":""}); + } + } + kStart = kStart + tileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + var BCached : array<${n}, colPerThread>; + for (var k = 0; k < tileInner; k = k + 1) { + for (var inner = 0; inner < colPerThread; inner = inner + 1) { + BCached[inner] = mm_Bsub[k][localCol + inner * ${t[0]}]; + } + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + let ACached = ${o?`mm_Asub[k][localRow + innerRow * ${t[1]}];`:`mm_Asub[localRow + innerRow * ${t[1]}][k];`} + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + acc[innerRow][innerCol] = acc[innerRow][innerCol] + + ACached * BCached[innerCol]; + } + } + } + workgroupBarrier(); + } + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + let gRow = globalRowStart + localRow + innerRow * ${t[1]}; + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + let gCol = globalColStart + localCol + innerCol * ${t[0]}; + mm_write(batch, gRow, gCol, acc[innerRow][innerCol]); + } + } + `:` +let tileRow = i32(localId.y) * rowPerThread; +let tileCol = i32(localId.x) * colPerThread; + +let globalRow = i32(globalId.y) * rowPerThread; +let globalCol = i32(globalId.x) * colPerThread; +let globalRowStart = i32(workgroupId.y) * ${p}; + +let tileRowA = i32(localId.y) * ${_}; +let tileColA = i32(localId.x) * ${b}; +let tileRowB = i32(localId.y) * ${w}; +// Loop over shared dimension. +for (var t = 0; t < num_tiles; t = t + 1) { + // Load one tile of A into local memory. + for (var innerRow = 0; innerRow < ${_}; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < ${b}; innerCol = innerCol + 1) { + let inputRow = tileRowA + innerRow; + let inputCol = tileColA + innerCol; + ${Id(o,r)} + } + } + + // Load one tile of B into local memory. + for (var innerRow = 0; innerRow < ${w}; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + let inputRow = tileRowB + innerRow; + let inputCol = tileCol + innerCol; + mm_Bsub[inputRow][inputCol] = mm_readB(batch, + kStart + inputRow, + globalCol + innerCol${r?", batchIndices":""}); + } + } + kStart = kStart + tileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + var BCached : array<${n}, colPerThread>; + for (var k = 0; k < tileInner; k = k + 1) { + for (var inner = 0; inner < colPerThread; inner = inner + 1) { + BCached[inner] = mm_Bsub[k][tileCol + inner]; + } + + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + ${Zh(o)} + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + acc[innerRow][innerCol] = acc[innerRow][innerCol] + ACached * BCached[innerCol]; + } + } + } + + workgroupBarrier(); +} + +for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + mm_write(batch, globalRow + innerRow, globalCol + innerCol, + acc[innerRow][innerCol]); + } +} +`;return` + var mm_Asub : array, ${y}>; + var mm_Bsub : array, ${a}>; + const rowPerThread = ${e[1]}; + const colPerThread = ${e[0]}; + const tileInner = ${a}; + +@compute @workgroup_size(${t[0]}, ${t[1]}, ${t[2]}) +fn main(@builtin(local_invocation_id) localId : vec3, + @builtin(global_invocation_id) globalId : vec3, + @builtin(workgroup_id) workgroupId : vec3) { + let batch = ${s?"0":"i32(globalId.z)"}; + ${r?`let batchIndices = ${r.offsetToIndices("u32(batch)")};`:""} + let num_tiles = ${s?`${Math.ceil(d/a)}`:"(uniforms.dim_inner - 1) / tileInner + 1"}; + var kStart = ${s?`i32(globalId.z) * ${d}`:"0"}; + + var acc : array, rowPerThread>; + ${S} + } +`},Qh=(e,t,n,r,o=!1)=>{let[a,s,d,l]=r,p=_e(r[0].type.tensor);return` + fn mm_readA(batch: i32, row: i32, colIn: i32, batchIndices: ${a.type.indices}) -> ${Ee(e,p)} { + var value = ${Ee(e,p)}(0.0); + let col = colIn * ${e}; + if(row < uniforms.dim_a_outer && col < uniforms.dim_inner) + { + var aIndices: ${s.type.indices}; + ${rr("aIndices",s,s.rank-2,a.rank,"batchIndices")} + ${s.indicesSet("aIndices",s.rank-2,"u32(row)")} + ${s.indicesSet("aIndices",s.rank-1,"u32(colIn)")} + value = ${s.getByIndices("aIndices")}; + } + return value; + } + + fn mm_readB(batch: i32, row: i32, colIn: i32, batchIndices: ${a.type.indices}) -> ${Ee(e,p)} { + var value = ${Ee(e,p)}(0.0); + let col = colIn * ${e}; + if(row < uniforms.dim_inner && col < uniforms.dim_b_outer) + { + var bIndices: ${d.type.indices}; + ${rr("bIndices",d,d.rank-2,a.rank,"batchIndices")} + ${d.indicesSet("bIndices",d.rank-2,"u32(row)")} + ${d.indicesSet("bIndices",d.rank-1,"u32(colIn)")} + value = ${d.getByIndices("bIndices")}; + } + return value; + } + + fn mm_write(batch: i32, row: i32, colIn: i32, valueIn: ${Ee(e,p)}) { + let col = colIn * ${e}; + if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) { + var value = valueIn; + let coords = vec3(batch, row, colIn); + ${t?`value = value + ${o?"bias[colIn]":`${Ee(e,p)}(bias[row])`};`:""} + ${n} + ${l.setByIndices("vec3(coords)","value")} + } + } + `},nr=(e,t,n,r,o=!1,a)=>{let s=e[0].dims,d=e[1].dims,l=s.slice(0,-2),p=d.slice(0,-2),f=r?r.slice(0,-2):n.slice(0,-2),h=E.size(f),y=s[s.length-2],_=s[s.length-1],b=d[d.length-1],w=_%4===0&&b%4===0,S=y<=8?[4,1,1]:[4,4,1],$=[8,8,1],v=[Math.ceil(b/$[0]/S[0]),Math.ceil(y/$[1]/S[1]),Math.ceil(h/$[2]/S[2])],T=w?4:1,C=[...l,y,_/T],A=C.length,k=[...p,_,b/T],O=k.length,M=[h,y,b/T],V=[{type:6,data:y},{type:6,data:b},{type:6,data:_}];Ze(t,V),V.push(...H(f,C,k));let F=["rank","rank"],j=e.length>2;j&&(V.push(...H(e[2].dims)),F.push("rank")),V.push(...H(M));let ne=W=>{let J=f.length,ve=Gr("batchDims",e[0].dataType,J,1),Q=_e(e[0].dataType),ee=P("a",e[0].dataType,A,T),le=P("b",e[1].dataType,O,T),Z=N("result",e[0].dataType,M.length,T),pe=[ee,le];if(j){let Y=o?T:1;pe.push(P("bias",e[2].dataType,e[2].dims.length,Y))}let ke=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"}];Qe(t,ke);let Se=_e(Z.type.tensor),D=je(t,Z.type.value,Se),R=Qh(T,j,D,[ve,ee,le,Z],o);return` + ${W.registerUniforms(ke).registerInternalVariables(ve).declareVariables(...pe,Z)} + ${R} + ${w?ho(S,$,Q,ve):go(S,$,Q,ve)} + `};return{name:"MatMul",shaderCache:{hint:`${S};${t.activation};${w};${o}`,inputDependencies:F},getRunData:()=>({outputs:[{dims:a?a(n):n,dataType:e[0].dataType}],dispatchGroup:{x:v[0],y:v[1],z:v[2]},programUniforms:V}),getShaderSource:ne}}});var Yh,Ad,kd=G(()=>{"use strict";te();tt();ce();vt();Qr();Cd();Jr();Yh=(e,t,n,r,o=!1,a,s=4,d=4,l=4,p="f32")=>{let f=F=>{switch(F){case 1:return"resData = x[xIndex];";case 3:return`resData = vec3<${p}>(x[xIndex], x[xIndex + 1], x[xIndex + 2]);`;case 4:return"resData = x[xIndex / 4];";default:throw new Error(`innerElementSize ${F} is not supported.`)}},h=F=>{switch(F){case 1:return"return w[row * i32(uniforms.w_shape[3]) + colIn];";case 4:return"return w[row * i32(uniforms.w_shape[3]) / 4 + colIn];";default:throw new Error(`innerElementSize ${F} is not supported.`)}},y=e?` + let coord = vec4(batch, xRow, xCol, xCh); + `:` + let coord = vec4(batch, xCh, xRow, xCol); + `,_=e?` + let coords = vec4( + batch, + row / outWidth, + row % outWidth, + col); + `:` + let coords = vec4( + batch, + row, + col / outWidth, + col % outWidth); + `,b=e?"i32(uniforms.x_shape[1])":"i32(uniforms.x_shape[2])",w=e?"i32(uniforms.x_shape[2])":"i32(uniforms.x_shape[3])",S=e?"row":"col",$=e?"col":"row",v=` + let inChannels = i32(uniforms.w_shape[2]); + let outWidth = ${e?"i32(uniforms.result_shape[2])":"i32(uniforms.result_shape[3])"}; + let outRow = ${S} / outWidth; + let outCol = ${S} % outWidth; + + let WRow = ${$} / (i32(uniforms.w_shape[1]) * inChannels); + let WCol = ${$} / inChannels % i32(uniforms.w_shape[1]); + let xRow = outRow * uniforms.stride[0] + uniforms.dilation[0] * WRow - uniforms.pad[0]; + let xCol = outCol * uniforms.stride[1] + uniforms.dilation[1] * WCol - uniforms.pad[1]; + let xCh = ${$} % inChannels; + var resData = ${Ee(s,p)}(0.0); + // The bounds checking is always needed since we use it to pad zero for + // the 'same' padding type. + if (xRow >= 0 && xRow < ${b} && xCol >= 0 && xCol < ${w}) { + ${y} + let xIndex = getIndexFromCoords4D(coord, vec4(uniforms.x_shape)); + ${f(s)} + } + return resData;`,T=e?t&&r?` + let col = colIn * ${s}; + ${v}`:` + let col = colIn * ${s}; + if (row < uniforms.dim_a_outer && col < uniforms.dim_inner) { + ${v} + } + return ${Ee(s,p)}(0.0);`:r&&n?` + let col = colIn * ${s}; + ${v}`:` + let col = colIn * ${s}; + if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) { + ${v} + } + return ${Ee(s,p)}(0.0);`,C=e?r&&n?h(d):` + let col = colIn * ${d}; + if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) { + ${h(d)} + } + return ${Ee(d,p)}(0.0);`:` + let col = colIn * ${d}; + if (row < uniforms.dim_inner && col < uniforms.dim_a_outer) { + ${h(d)} + } + return ${Ee(d,p)}(0.0);`,A=Ee(l,p),k=e?Ee(s,p):Ee(d,p),O=e?Ee(d,p):Ee(s,p),M=je(a,A,p);return` + fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${k} { + ${e?T:C} + } + + fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${O} { + ${e?C:T} + } + + fn mm_write(batch: i32, row : i32, colIn : i32, valueIn : ${A}) { + let col = colIn * ${l}; + if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) + { + var value = valueIn; + let outWidth = ${e?"i32(uniforms.result_shape[2])":"i32(uniforms.result_shape[3])"}; + ${_} + ${Sd(o)} + ${M} + setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value); + } + }`},Ad=(e,t,n,r,o,a,s,d,l)=>{let p=t.format==="NHWC",f=p?e[0].dims[3]:e[0].dims[1],h=n[0],y=p?n[2]:n[3],_=p?n[1]:n[2],b=p?n[3]:n[1],w=p&&(f%4===0||f%3===0)&&b%4===0,S=p?b:y*_,$=p?y*_:b,v=[8,8,1],T=r<=8?[4,1,1]:[4,4,1],C=[Math.ceil(S/v[0]/T[0]),Math.ceil($/v[1]/T[1]),Math.ceil(h/v[2]/T[2])];me("verbose",()=>`[conv2d_mm_webgpu] dispatch = ${C}`);let A=w?p&&f%4!==0?3:4:1,k=v[1]*T[1],O=v[0]*T[0],M=Math.max(v[0]*A,v[1]),V=r%k===0,F=o%O===0,j=a%M===0,ne=w?[A,4,4]:[1,1,1],W=[{type:6,data:r},{type:6,data:o},{type:6,data:a},{type:6,data:[t.pads[0],t.pads[1]]},{type:6,data:t.strides},{type:6,data:t.dilations}];Ze(t,W),W.push(...H(e[0].dims,e[1].dims));let J=["rank","rank"];s&&(W.push(...H(e[2].dims)),J.push("rank")),W.push(...H(n));let ve=Q=>{let ee=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"},{name:"pad",type:"i32",length:2},{name:"stride",type:"i32",length:2},{name:"dilation",type:"i32",length:2}];Qe(t,ee);let le=w?4:1,Z=_e(e[0].dataType),pe=` + fn setOutputAtIndex(flatIndex : i32, value : ${w?`vec4<${Z}>`:Z}) { + result[flatIndex] = ${w?`vec4<${Z}>`:Z}(value); + } + fn setOutputAtCoords(d0 : i32, d1 : i32, d2 : i32, d3 : i32, value : ${w?`vec4<${Z}>`:Z}) { + let flatIndex = getOutputIndexFromCoords(vec4(d0, d1, d2, d3)); + setOutputAtIndex(flatIndex ${w?"/ 4":""}, value); + }`,ke=P("x",e[0].dataType,e[0].dims.length,A===3?1:A),Se=P("w",e[1].dataType,e[1].dims.length,le),D=[ke,Se],R=N("result",e[0].dataType,n.length,le);if(s){let Y=P("bias",e[2].dataType,e[2].dims.length,le);D.push(Y),pe+=` + fn getBiasByOutputCoords(coords : vec4) -> ${w?`vec4<${Z}>`:Z} { + return bias[coords.${p?"w":"y"}${w?"/ 4":""}]; + }`}return` + ${Td("uniforms.result_strides")} + //struct Uniforms { xShape : vec4, wShape : vec4, outShape : vec4, + // outShapeStrides: vec3, filterDims : vec2, pad : vec2, stride : vec2, + // dilation : vec2, dimAOuter : i32, dimBOuter : i32, dimInner : i32 }; + ${Q.registerUniforms(ee).declareVariables(...D,R)} + ${pe} + ${Yh(p,V,F,j,s,t,ne[0],ne[1],ne[2],Z)} + ${w?ho(T,v,Z,void 0,!p,M):go(T,v,Z,void 0,!p,M,!1,void 0,d)}`};return{name:"Conv2DMatMul",shaderCache:{hint:`${t.cacheKey};${A};${w};${V};${F};${j};${k};${O};${M}`,inputDependencies:J},getRunData:()=>({outputs:[{dims:l?l(n):n,dataType:e[0].dataType}],dispatchGroup:{x:C[0],y:C[1],z:C[2]},programUniforms:W}),getShaderSource:ve}}});var Xh,Ed,en,Jh,Pd,eg,zd,Od,Dd=G(()=>{"use strict";te();tt();ae();ce();vt();Qr();Xh=e=>{let t=1;for(let n=0;ntypeof e=="number"?[e,e,e]:e,en=(e,t)=>t<=1?e:e+(e-1)*(t-1),Jh=(e,t,n,r=1)=>{let o=en(t,r);return Math.floor((e[0]*(n-1)-n+o)/2)},Pd=(e,t,n,r,o)=>{o==null&&(o=Jh(e,t[0],r[0]));let a=[0,0,0,n];for(let s=0;s<3;s++)e[s]+2*o>=t[s]&&(a[s]=Math.trunc((e[s]-t[s]+2*o)/r[s]+1));return a},eg=(e,t,n,r,o,a,s,d,l,p)=>{let f,h,y,_;if(e==="VALID"&&(e=0),typeof e=="number"){f={top:e,bottom:e,left:e,right:e,front:e,back:e};let b=Pd([t,n,r,1],[d,l,p],1,[o,a,s],e);h=b[0],y=b[1],_=b[2]}else if(Array.isArray(e)){if(!e.every((w,S,$)=>w===$[0]))throw Error(`Unsupported padding parameter: ${e}`);f={top:e[0],bottom:e[1],left:e[2],right:e[3],front:e[4],back:e[5]};let b=Pd([t,n,r,1],[d,l,p],1,[o,a,s],e[0]);h=b[0],y=b[1],_=b[2]}else if(e==="SAME_UPPER"){h=Math.ceil(t/o),y=Math.ceil(n/a),_=Math.ceil(r/s);let b=(h-1)*o+d-t,w=(y-1)*a+l-n,S=(_-1)*s+p-r,$=Math.floor(b/2),v=b-$,T=Math.floor(w/2),C=w-T,A=Math.floor(S/2),k=S-A;f={top:T,bottom:C,left:A,right:k,front:$,back:v}}else throw Error(`Unknown padding parameter: ${e}`);return{padInfo:f,outDepth:h,outHeight:y,outWidth:_}},zd=(e,t,n,r,o,a=!1,s="channelsLast")=>{let d,l,p,f,h;if(s==="channelsLast")[d,l,p,f,h]=e;else if(s==="channelsFirst")[d,h,l,p,f]=e;else throw new Error(`Unknown dataFormat ${s}`);let[y,,_,b,w]=t,[S,$,v]=Ed(n),[T,C,A]=Ed(r),k=en(_,T),O=en(b,C),M=en(w,A),{padInfo:V,outDepth:F,outHeight:j,outWidth:ne}=eg(o,l,p,f,S,$,v,k,O,M),W=a?y*h:y,J=[0,0,0,0,0];return s==="channelsFirst"?J=[d,W,F,j,ne]:s==="channelsLast"&&(J=[d,F,j,ne,W]),{batchSize:d,dataFormat:s,inDepth:l,inHeight:p,inWidth:f,inChannels:h,outDepth:F,outHeight:j,outWidth:ne,outChannels:W,padInfo:V,strideDepth:S,strideHeight:$,strideWidth:v,filterDepth:_,filterHeight:b,filterWidth:w,effectiveFilterDepth:k,effectiveFilterHeight:O,effectiveFilterWidth:M,dilationDepth:T,dilationHeight:C,dilationWidth:A,inShape:e,outShape:J,filterShape:t}},Od=(e,t,n,r,o,a)=>{let s=a==="channelsLast",d=s?e[0].dims[3]:e[0].dims[1],l=!1,p=[64,1,1],f={x:n.map((v,T)=>T)},h=[Math.ceil(Xh(f.x.map(v=>n[v]))/p[0]),1,1];me("verbose",()=>`[conv3d_naive_webgpu] dispatch = ${h}`);let y=l?s&&d%4!==0?3:4:1,_=E.size(n),b=[{type:12,data:_},{type:12,data:r},{type:12,data:o},{type:12,data:t.strides},{type:12,data:t.dilations}];Ze(t,b),b.push(...H(e[0].dims,e[1].dims));let w=["rank","rank"],S=e.length===3;S&&(b.push(...H(e[2].dims)),w.push("rank")),b.push(...H(n));let $=v=>{let T=[{name:"output_size",type:"u32"},{name:"filter_dims",type:"u32",length:r.length},{name:"pads",type:"u32",length:o.length},{name:"strides",type:"u32",length:t.strides.length},{name:"dilations",type:"u32",length:t.dilations.length}];Qe(t,T);let C=l?4:1,A=_e(e[0].dataType),k=P("x",e[0].dataType,e[0].dims.length,y===3?1:y),O=P("W",e[1].dataType,e[1].dims.length,C),M=[k,O],V=N("result",e[0].dataType,n.length,C),F="";if(S){let W=P("bias",e[2].dataType,e[2].dims.length,C);M.push(W),F+=` + fn getBiasByOutputCoords(coords : array) -> ${l?`vec4<${A}>`:A} { + return bias[${s?K("coords",4,5):K("coords",1,5)}${l?"/ 4":""}]; + }`}let j=Ee(y,A),ne=je(t,j,A);return` + ${F} + fn getX(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 { + let aIndices = array(d0, d1, d2, d3, d4); + return ${k.getByIndices("aIndices")}; + } + fn getW(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 { + let aIndices = array(d0, d1, d2, d3, d4); + return ${O.getByIndices("aIndices")}; + } + ${v.registerUniforms(T).declareVariables(...M,V)} + ${v.mainStart()} + ${v.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let coords = ${V.offsetToIndices("global_idx")}; + let batch = ${K("coords",0,k.rank)}; + let d2 = ${s?K("coords",k.rank-1,k.rank):K("coords",1,k.rank)}; + let xFRCCorner = vec3(${s?K("coords",1,k.rank):K("coords",2,k.rank)}, + ${s?K("coords",2,k.rank):K("coords",3,k.rank)}, + ${s?K("coords",3,k.rank):K("coords",4,k.rank)}) * uniforms.strides - uniforms.pads; + let xFCorner = xFRCCorner.x; + let xRCorner = xFRCCorner.y; + let xCCorner = xFRCCorner.z; + let xShapeY = ${s?K("uniforms.x_shape",1,k.rank):K("uniforms.x_shape",2,k.rank)}; + let xShapeZ = ${s?K("uniforms.x_shape",2,k.rank):K("uniforms.x_shape",3,k.rank)}; + let xShapeW = ${s?K("uniforms.x_shape",3,k.rank):K("uniforms.x_shape",4,k.rank)}; + let xShapeU = ${s?K("uniforms.x_shape",4,k.rank):K("uniforms.x_shape",1,k.rank)}; + let inputDepthNearestVec4 = (xShapeU / 4) * 4; + let inputDepthVec4Remainder = xShapeU % 4; + + var value = 0.0; + for (var wF = 0u; wF < uniforms.filter_dims[0]; wF++) { + let xF = xFCorner + wF * uniforms.dilations[0]; + if (xF < 0 || xF >= xShapeY) { + continue; + } + + for (var wR = 0u; wR < uniforms.filter_dims[1]; wR++) { + let xR = xRCorner + wR * uniforms.dilations[1]; + if (xR < 0 || xR >= xShapeZ) { + continue; + } + + for (var wC = 0u; wC < uniforms.filter_dims[2]; wC++) { + let xC = xCCorner + wC * uniforms.dilations[2]; + if (xC < 0 || xC >= xShapeW) { + continue; + } + + for (var d1 = 0u; d1 < inputDepthNearestVec4; d1 += 4) { + ${s?`let xValues = vec4( + getX(batch, xF, xR, xC, d1), + getX(batch, xF, xR, xC, d1 + 1), + getX(batch, xF, xR, xC, d1 + 2), + getX(batch, xF, xR, xC, d1 + 3)); + `:`let xValues = vec4( + getX(batch, d1, xF, xR, xC), + getX(batch, d1 + 1, xF, xR, xC), + getX(batch, d1 + 2, xF, xR, xC), + getX(batch, d1 + 3, xF, xR, xC)); + `} + let wValues = vec4( + getW(d2, d1, wF, wR, wC), + getW(d2, d1 + 1, wF, wR, wC), + getW(d2, d1 + 2, wF, wR, wC), + getW(d2, d1 + 3, wF, wR, wC)); + value += dot(xValues, wValues); + } + if (inputDepthVec4Remainder == 1) { + ${s?`value += getX(batch, xF, xR, xC, inputDepthNearestVec4) + * getW(d2, inputDepthNearestVec4, wF, wR, wC);`:`value += getX(batch, inputDepthNearestVec4, xF, xR, xC) + * getW(d2, inputDepthNearestVec4, wF, wR, wC);`} + } else if (inputDepthVec4Remainder == 2) { + ${s?`let xValues = vec2( + getX(batch, xF, xR, xC, inputDepthNearestVec4), + getX(batch, xF, xR, xC, inputDepthNearestVec4 + 1)); + `:`let xValues = vec2( + getX(batch, inputDepthNearestVec4, xF, xR, xC), + getX(batch, inputDepthNearestVec4 + 1, xF, xR, xC)); + `} + let wValues = vec2( + getW(d2, inputDepthNearestVec4, wF, wR, wC), + getW(d2, inputDepthNearestVec4 + 1, wF, wR, wC)); + value += dot(xValues, wValues); + } else if (inputDepthVec4Remainder == 3) { + ${s?`let xValues = vec3( + getX(batch, xF, xR, xC, inputDepthNearestVec4), + getX(batch, xF, xR, xC, inputDepthNearestVec4 + 1), + getX(batch, xF, xR, xC, inputDepthNearestVec4 + 2)); + `:`let xValues = vec3( + getX(batch, inputDepthNearestVec4, xF, xR, xC), + getX(batch, inputDepthNearestVec4 + 1, xF, xR, xC), + getX(batch, inputDepthNearestVec4 + 2, xF, xR, xC)); + `} + let wValues = vec3( + getW(d2, inputDepthNearestVec4, wF, wR, wC), + getW(d2, inputDepthNearestVec4 + 1, wF, wR, wC), + getW(d2, inputDepthNearestVec4 + 2, wF, wR, wC)); + value += dot(xValues, wValues); + } + } + } + } + ${S?"value = value + getBiasByOutputCoords(coords)":""}; + ${ne} + result[global_idx] = f32(value); + }`};return{name:"Conv3DNaive",shaderCache:{hint:`${t.cacheKey};${s};${y};${S}`,inputDependencies:w},getRunData:()=>({outputs:[{dims:n,dataType:e[0].dataType}],dispatchGroup:{x:h[0],y:h[1],z:h[2]},programUniforms:b}),getShaderSource:$}}});var Bd,Md,Rd=G(()=>{"use strict";te();ae();ce();vt();Bd=(e,t,n,r)=>{let o=e.length>2,a=o?"value += b[output_channel];":"",s=e[0].dims,d=e[1].dims,l=t.format==="NHWC",p=l?n[3]:n[1],f=p/t.group,h=l&&f>=4?ge(p):1,y=E.size(n)/h,_=[{type:12,data:y},{type:12,data:t.dilations},{type:12,data:[t.strides[0],t.strides[1]]},{type:12,data:[t.pads[0],t.pads[1]]},{type:12,data:f}];Ze(t,_),_.push(...H(s,[d[0],d[1],d[2],d[3]/h]));let b=o?["rank","rank","rank"]:["rank","rank"];_.push(...H([n[0],n[1],n[2],n[3]/h]));let w=S=>{let $=N("output",e[0].dataType,n.length,h),v=_e($.type.tensor),T=je(t,$.type.value,v),C=P("x",e[0].dataType,s.length),A=P("w",e[1].dataType,d.length,h),k=[C,A];o&&k.push(P("b",e[2].dataType,e[2].dims,h));let O=[{name:"output_size",type:"u32"},{name:"dilations",type:"u32",length:t.dilations.length},{name:"strides",type:"u32",length:2},{name:"pads",type:"u32",length:2},{name:"output_channels_per_group",type:"u32"}];Qe(t,O);let M=l?` + for (var wHeight: u32 = 0u; wHeight < uniforms.w_shape[0]; wHeight++) { + let xHeight = xRCCorner.x + wHeight * uniforms.dilations[0]; + + if (xHeight < 0u || xHeight >= uniforms.x_shape[1]) { + continue; + } + + for (var wWidth: u32 = 0u; wWidth < uniforms.w_shape[1]; wWidth++) { + let xWidth = xRCCorner.y + wWidth * uniforms.dilations[1]; + if (xWidth < 0u || xWidth >= uniforms.x_shape[2]) { + continue; + } + + for (var wInChannel: u32 = 0u; wInChannel < uniforms.w_shape[2]; wInChannel++) { + let input_channel = in_channel_offset + wInChannel; + let xVal = ${C.get("batch","xHeight","xWidth","input_channel")}; + let wVal = ${A.get("wHeight","wWidth","wInChannel","output_channel")}; + value += xVal * wVal; + } + } + } + `:` + for (var wInChannel: u32 = 0u; wInChannel < uniforms.w_shape[1]; wInChannel++) { + let input_channel = in_channel_offset + wInChannel; + for (var wHeight: u32 = 0u; wHeight < uniforms.w_shape[2]; wHeight++) { + let xHeight = xRCCorner.x + wHeight * uniforms.dilations[0]; + + if (xHeight < 0u || xHeight >= uniforms.x_shape[2]) { + continue; + } + + for (var wWidth: u32 = 0u; wWidth < uniforms.w_shape[3]; wWidth++) { + let xWidth = xRCCorner.y + wWidth * uniforms.dilations[1]; + if (xWidth < 0u || xWidth >= uniforms.x_shape[3]) { + continue; + } + + let xVal = ${C.get("batch","input_channel","xHeight","xWidth")}; + let wVal = ${A.get("output_channel","wInChannel","wHeight","wWidth")}; + value += xVal * wVal; + } + } + } + `;return` + ${S.registerUniforms(O).declareVariables(...k,$)} + + ${S.mainStart()} + ${S.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let outputIndices = ${$.offsetToIndices("global_idx")}; + let batch: u32 = outputIndices[0]; + let output_channel: u32 = outputIndices[${l?3:1}]; + let xRCCorner: vec2 = vec2(outputIndices[${l?1:2}], outputIndices[${l?2:3}]) * uniforms.strides - uniforms.pads; + let group_id: u32 = output_channel * ${h} / uniforms.output_channels_per_group; + var in_channel_offset = group_id * uniforms.w_shape[${l?2:1}]; + + var value: ${$.type.value} = ${$.type.value}(0); + ${M} + ${a} + ${T} + ${$.setByOffset("global_idx","value")} + }`};return{name:"GroupedConv",shaderCache:{hint:`${t.cacheKey}_${h}`,inputDependencies:b},getRunData:()=>({outputs:[{dims:r?r(n):n,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(y/64)},programUniforms:_}),getShaderSource:w}},Md=(e,t,n,r)=>{let o=e.length>2,a=ge(n[3]),s=ge(n[2]),d=E.size(n)/a/s,l=[e[0].dims[0],e[0].dims[1],e[0].dims[2],e[0].dims[3]/a],p=[e[1].dims[0],e[1].dims[1],e[1].dims[2],e[1].dims[3]/a],f=[n[0],n[1],n[2],n[3]/a],h=[{type:12,data:d},{type:6,data:[t.strides[0],t.strides[1]]},{type:6,data:[t.pads[0],t.pads[1]]}];Ze(t,h),h.push(...H(l,p,f));let y=(s-1)*t.strides[1]+p[1],_=b=>{let w=N("output",e[0].dataType,f.length,a),S=_e(w.type.tensor),$=je(t,w.type.value,S),v=P("x",e[0].dataType,l.length,a),T=P("w",e[1].dataType,p.length,a),C=[v,T];o&&C.push(P("b",e[2].dataType,e[2].dims,a));let A=o?"value += b[output_channel];":"",k=[{name:"output_size",type:"u32"},{name:"strides",type:"i32",length:2},{name:"pads",type:"i32",length:2}];return Qe(t,k),` + ${b.registerUniforms(k).declareVariables(...C,w)} + ${b.mainStart()} + ${b.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let width0 = uniforms.output_shape[3]; + let output_channel = global_idx % width0; + var index1 = global_idx / width0; + let width1 = uniforms.output_shape[2] / ${s}u; + let col = (index1 % width1) * ${s}u; + index1 = index1 / width1; + let row = index1 % uniforms.output_shape[1]; + let batch = index1 / uniforms.output_shape[1]; + + let x_corner = vec2(i32(row), i32(col)) * uniforms.strides - uniforms.pads; + + var x_vals: array<${v.type.value}, ${y}>; + var values: array<${w.type.value}, ${s}>; + let input_channel = output_channel; + // Use constant instead of uniform can give better performance for w's height/width. + for (var w_height: u32 = 0u; w_height < ${p[0]}; w_height++) { + let x_height = x_corner.x + i32(w_height); + if (x_height >= 0 && u32(x_height) < uniforms.x_shape[1]) { + for (var i = 0; i < ${y}; i++) { + let x_width = x_corner.y + i; + if (x_width >= 0 && u32(x_width) < uniforms.x_shape[2]) { + x_vals[i] = ${v.get("batch","u32(x_height)","u32(x_width)","input_channel")}; + } else { + x_vals[i] = ${v.type.value}(0); + } + } + for (var w_width: u32 = 0u; w_width < ${p[1]}; w_width++) { + let w_val = ${T.get("w_height","w_width","0","output_channel")}; + for (var i = 0u; i < ${s}u; i++) { + values[i] = fma(x_vals[i * u32(uniforms.strides[1]) + w_width], w_val, values[i]); + } + } + } + } + + for (var i = 0u; i < ${s}u; i++) { + var value = values[i]; + ${A} + ${$} + ${w.set("batch","row","col + i","output_channel","value")}; + } + }`};return{name:"GroupedConv-Vectorize",shaderCache:{hint:`${t.cacheKey};${a};${s};${y};${p[0]};${p[1]}`,inputDependencies:o?["rank","rank","type"]:["rank","rank"]},getRunData:()=>({outputs:[{dims:r?r(n):n,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(d/64)},programUniforms:h}),getShaderSource:_}}});var tg,yo,rg,bo,_o,Ud,ng,og,wo,Nd=G(()=>{"use strict";ae();kd();Dd();Jr();Rd();vt();Xr();ct();tg=(e,t,n,r,o,a)=>{let s=e[0],d=e.slice(a?1:2,a?3:4),l=d.length,p=t[0],h=t.slice(2).map((b,w)=>b+(b-1)*(n[w]-1)),_=d.map((b,w)=>b+r[w]+r[w+l]).map((b,w)=>Math.floor((b-h[w]+o[w])/o[w]));return _.splice(0,0,s),_.splice(a?3:1,0,p),_},yo=[2,3,1,0],rg=(e,t)=>{if(!e||e.length!==2&&e.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(e[0].dims.length>5)throw new Error("greater than 5D is not supported");if(e[0].dims.length!==e[1].dims.length)throw new Error("filter does not have same dimension as input");let n=e[0].dims[t.format==="NHWC"?e[0].dims.length-1:1],r=e[1].dims[1]*t.group;if(n!==r)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");if(e.length===3&&(e[2].dims.length!==1||e[1].dims[0]!==e[2].dims[0]))throw new Error("invalid bias");let o=e[0].dims.length-2;if(t.dilations.length!==o)throw new Error(`dilations should be ${o}D`);if(t.strides.length!==o)throw new Error(`strides should be ${o}D`);if(t.pads.length!==o*2)throw new Error(`pads should be ${o*2}D`);if(t.kernelShape.length!==0&&t.kernelShape.length!==e[1].dims.length-2)throw new Error("invalid kernel shape")},bo=(e,t)=>{let n=e.kernelShape.slice();n.length{let t=Zr(e),n=e.format,r=["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][e.auto_pad],o=e.dilations,a=e.group,s=e.kernel_shape,d=e.pads,l=e.strides,p=e.w_is_const();return{autoPad:r,format:n,dilations:o,group:a,kernelShape:s,pads:d,strides:l,wIsConst:p,...t,cacheKey:`${e.format};${t.activation};`}},Ud=(e,t,n,r)=>{let o=n.format==="NHWC",a=tg(t[0].dims,t[1].dims,n.dilations,n.pads,n.strides,o);if(n.group!==1){let k=[t[0]];if(o){let M=e.kernelCustomData.wT??e.compute(Oe(t[1],yo),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];n.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=M),k.push(M)}else k.push(t[1]);t.length===3&&k.push(t[2]),!e.adapterInfo.isArchitecture("ampere")&&o&&t[1].dims[0]===n.group&&t[1].dims[1]===1&&n.dilations[0]===1&&n.dilations[1]===1?e.compute(Md(k,n,a,r),{inputs:k}):e.compute(Bd(k,n,a,r),{inputs:k});return}let s=t.length===3,d=t[0].dims[o?1:2],l=t[0].dims[o?2:3],p=t[0].dims[o?3:1],f=t[1].dims[2],h=t[1].dims[3],y=a[o?1:2],_=a[o?2:3],b=a[o?3:1],w=o&&f===d&&h===l&&n.pads[0]===0&&n.pads[1]===0;if(w||f===1&&h===1&&n.dilations[0]===1&&n.dilations[1]===1&&n.strides[0]===1&&n.strides[1]===1&&n.pads[0]===0&&n.pads[1]===0){let k=a[0],O,M,V,F=[];if(o){let W=e.kernelCustomData.wT??e.compute(Oe(t[1],yo),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];if(n.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=W),w){let J=d*l*p;O=t[0].reshape([1,k,J]),M=W.reshape([1,J,b]),V=[1,k,b]}else O=t[0].reshape([k,d*l,p]),M=W.reshape([1,p,b]),V=[k,y*_,b];F.push(O),F.push(M)}else O=t[0].reshape([k,p,d*l]),M=t[1].reshape([1,b,p]),V=[k,b,y*_],F.push(M),F.push(O);s&&F.push(t[2]);let j=V[2],ne=F[0].dims[F[0].dims.length-1];j<8&&ne<8?e.compute(Yr(F,n,a,V,o,r),{inputs:F}):e.compute(nr(F,n,a,V,o,r),{inputs:F});return}let S=!0,$=e.kernelCustomData.wT??e.compute(Oe(t[1],yo),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];n.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=$);let v=[t[0],$];s&&v.push(t[2]);let T=o?y*_:b,C=o?b:y*_,A=f*h*p;e.compute(Ad(v,n,a,T,C,A,s,S,r),{inputs:v})},ng=(e,t)=>{let n=t.format==="NHWC",r=[e.inputs[0].reshape(n?[e.inputs[0].dims[0],1,e.inputs[0].dims[1],e.inputs[0].dims[2]]:[e.inputs[0].dims[0],e.inputs[0].dims[1],1,e.inputs[0].dims[2]]),e.inputs[1].reshape([e.inputs[1].dims[0],e.inputs[1].dims[1],1,e.inputs[1].dims[2]])];e.inputs.length===3&&r.push(e.inputs[2]);let o=[0,t.pads[0],0,t.pads[1]],a=[1].concat(t.strides),s=[1].concat(t.dilations),d=[1].concat(t.kernelShape),l=bo({...t,pads:o,strides:a,dilations:s,kernelShape:d},r);Ud(e,r,l,p=>n?[p[0],p[2],p[3]]:[p[0],p[1],p[3]])},og=(e,t,n)=>{let r=n.format==="NHWC"?"channelsLast":"channelsFirst",o=bo(n,t),a=n.autoPad==="NOTSET"?n.pads:n.autoPad,s=zd(t[0].dims,t[1].dims,n.strides,n.dilations,a,!1,r);e.compute(Od(t,o,s.outShape,[s.filterDepth,s.filterHeight,s.filterWidth],[s.padInfo.front,s.padInfo.top,s.padInfo.left],r))},wo=(e,t)=>{if(rg(e.inputs,t),e.inputs[0].dims.length===3)ng(e,t);else if(e.inputs[0].dims.length===5)og(e,e.inputs,t);else{let n=bo(t,e.inputs);Ud(e,e.inputs,n)}}});var Vd,Wd=G(()=>{"use strict";te();tt();ae();ce();Vd=(e,t,n)=>{let r=e.length>2,o=t.outputShape,a=t.format==="NHWC",s=t.group,d=e[1].dims,l=d[2]/s,p=d[3],f=a?ge(l):1,h=a?ge(p):1,y=a?p===1?f:h:1,_=E.size(o)/h,b=[Math.ceil(_/64),1,1];me("verbose",()=>`[conv2d_backprop_webgpu] dispatch = ${b}`);let w=["rank","rank"],S=[t.strides[0],t.strides[1]],$=[t.kernelShape[a?1:2],t.kernelShape[a?2:3]],v=[t.dilations[0],t.dilations[1]],T=[$[0]+(t.dilations[0]<=1?0:(t.kernelShape[a?1:2]-1)*(t.dilations[0]-1)),$[1]+(t.dilations[1]<=1?0:(t.kernelShape[a?2:3]-1)*(t.dilations[1]-1))],C=[T[0]-1-Math.floor((t.pads[0]+t.pads[2])/2),T[1]-1-Math.floor((t.pads[1]+t.pads[3])/2)],A=[{type:12,data:_},{type:12,data:S},{type:12,data:$},{type:12,data:v},{type:12,data:T},{type:6,data:C},{type:12,data:l},{type:12,data:p},...H(e[0].dims,e[1].dims)];r&&(A.push(...H(e[2].dims)),w.push("rank")),A.push(...H(o));let k=O=>{let M=[{name:"output_size",type:"u32"},{name:"strides",type:"u32",length:S.length},{name:"filter_dims",type:"u32",length:$.length},{name:"dilations",type:"u32",length:$.length},{name:"effective_filter_dims",type:"u32",length:T.length},{name:"pads",type:"i32",length:C.length},{name:"input_channels_per_group",type:"u32"},{name:"output_channels_per_group",type:"u32"}],V=_e(e[0].dataType),F=a?1:2,j=a?2:3,ne=a?3:1,W=P("W",e[1].dataType,e[1].dims.length,y),J=P("Dy",e[0].dataType,e[0].dims.length,f),ve=[J,W];r&&ve.push(P("bias",e[2].dataType,[o[ne]].length,h));let Q=N("result",e[0].dataType,o.length,h),ee=()=>{let Z="";if(f===1)Z+=` + let w_offset = ${W.indicesToOffset(`${W.type.indices}(u32(wRPerm), u32(wCPerm), inputChannel, wOutChannel)`)}; + let wValue = ${W.getByOffset(`w_offset / ${y}`)}; + dotProd = dotProd + xValue * wValue;`;else if(p===1)Z+=` + let wValue = ${W.getByOffset(`${W.indicesToOffset(`${W.type.indices}(u32(wRPerm), u32(wCPerm), inputChannel, wOutChannel)`)} / ${y}`)}; + dotProd = dotProd + dot(xValue, wValue);`;else for(let pe=0;pe(i32(r), i32(c)) - uniforms.pads; + let dyRCorner = dyCorner.x; + let dyCCorner = dyCorner.y; + let groupId = d1 / uniforms.output_channels_per_group; + let wOutChannel = d1 - groupId * uniforms.output_channels_per_group; + // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1). + // ? = to be determined. : = across all values in that axis. + var dotProd = ${Q.type.value}(0.0); + var wR: u32 = 0; + if (uniforms.dilations.x == 1) { + // Minimum wR >= 0 that satisfies (dyRCorner + wR) % (uniforms.strides.x) == 0 + wR = u32(((dyRCorner + i32(uniforms.strides.x) - 1) / i32(uniforms.strides.x)) * i32(uniforms.strides.x) - dyRCorner); + } + for (; wR < uniforms.effective_filter_dims.x; wR = wR + 1) { + if (wR % uniforms.dilations.x != 0) { + continue; + } + let dyR = (${V}(dyRCorner) + ${V}(wR)) / ${V}(uniforms.strides[0]); + let wRPerm = uniforms.filter_dims.x - 1 - wR / uniforms.dilations.x; + if (dyR < 0.0 || dyR >= ${V}(uniforms.Dy_shape[${F}]) || fract(dyR) > 0.0 || + wRPerm < 0) { + continue; + } + let idyR: u32 = u32(dyR); + var wC: u32 = 0; + if (uniforms.dilations.y == 1) { + // Minimum wC >= 0 that satisfies (dyCCorner + wC) % (uniforms.strides.y) == 0 + wC = u32(((dyCCorner + i32(uniforms.strides.y) - 1) / i32(uniforms.strides.y)) * i32(uniforms.strides.y) - dyCCorner); + } + + for (; wC < uniforms.effective_filter_dims.y; wC = wC + 1) { + if (wC % uniforms.dilations.y != 0) { + continue; + } + let dyC = (${V}(dyCCorner) + ${V}(wC)) / ${V}(uniforms.strides.y); + let wCPerm = uniforms.filter_dims.y - 1 - wC / uniforms.dilations.y; + if (dyC < 0.0 || dyC >= ${V}(uniforms.Dy_shape[${j}]) || + fract(dyC) > 0.0 || wCPerm < 0) { + continue; + } + let idyC: u32 = u32(dyC); + var inputChannel = groupId * uniforms.input_channels_per_group; + for (var d2: u32 = 0; d2 < uniforms.input_channels_per_group; d2 = d2 + ${f}) { + let xValue = ${a?J.getByOffset(`${J.indicesToOffset(`${J.type.indices}(batch, idyR, idyC, inputChannel)`)} / ${f}`):J.get("batch","inputChannel","idyR","idyC")}; + ${ee()} + inputChannel = inputChannel + ${f}; + } + wC = wC + uniforms.strides.y - 1; + } + wR = wR + uniforms.strides[0] - 1; + } + let value = dotProd${r?` + bias[d1 / ${h}]`:""}; + ${Q.setByOffset("global_idx","value")}; + `;return` + ${O.registerUniforms(M).declareVariables(...ve,Q)} + ${O.mainStart()} + ${O.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")}; + ${le}}`};return{name:"ConvTranspose2D",shaderCache:{hint:`${t.cacheKey};${f}${y}${h}${p===1}`,inputDependencies:w},getRunData:()=>({dispatchGroup:{x:b[0],y:b[1],z:b[2]},outputs:[{dims:n?n(o):o,dataType:e[0].dataType}],programUniforms:A}),getShaderSource:k}}});var ig,ag,sg,Ld,Gd,ug,Hd,dg,Fd,qd=G(()=>{"use strict";Wd();vt();ct();ig=(e,t,n,r,o,a)=>(e-1)*t+n+(r-1)*o+1-a,ag=(e,t,n,r,o)=>{let a=Math.floor(e/2);t==="SAME_UPPER"?(n[r]=a,n[o]=e-a):t==="SAME_LOWER"&&(n[r]=e-a,n[o]=a)},sg=(e,t,n,r,o,a,s,d,l,p)=>{let f=e.length-2,h=p.length===0;l.length{let n=e.kernelShape.slice();if(e.kernelShape.length===0||e.kernelShape.reduce((h,y)=>h*y,1)===0){n.length=0;for(let h=2;hh+y,0)===0){let h=t[0].dims.length-2;l=new Array(h).fill(1)}let p=e.strides.slice();if(p.reduce((h,y)=>h+y,0)===0){let h=t[0].dims.length-2;p=new Array(h).fill(1)}sg(d,n,l,e.autoPad,e.group,o,p,r,s,a);let f=Object.assign({},e);return Object.assign(f,{kernelShape:n,pads:o,outputPadding:s,outputShape:a,dilations:l,strides:p}),f},Gd=e=>{let t=Zr(e),n=e.format,r=["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][typeof e.autoPad>"u"?0:e.autoPad],o=e.dilations,a=e.group,s=e.kernelShape,d=e.pads,l=e.strides,p=e.wIsConst(),f=e.outputPadding,h=e.outputShape;return{autoPad:r,format:n,dilations:o,group:a,kernelShape:s,outputPadding:f,outputShape:h,pads:d,strides:l,wIsConst:p,...t,cacheKey:`${e.format};${t.activation};`}},ug=(e,t)=>{if(!e||e.length!==2&&e.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(e[0].dims.length!==4&&e[0].dims.length!==3)throw new Error("currently only support 2-dimensional conv");if(e[0].dims.length!==e[1].dims.length)throw new Error("filter does not have same dimension as input");let n=e[0].dims[t.format==="NHWC"?e[0].dims.length-1:1],r=e[1].dims[0];if(n!==r)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");let o=e[1].dims[1]*t.group;if(e.length===3&&(e[2].dims.length!==1||e[2].dims[0]!==o))throw new Error("invalid bias");let a=e[0].dims.length-2;if(t.dilations.reduce((f,h)=>f+h,0)>0&&t.dilations.length!==a)throw new Error(`dilations should be ${a}D`);if(t.strides.reduce((f,h)=>f+h,0)>0&&t.strides.length!==a)throw new Error(`strides should be ${a}D`);if(t.pads.reduce((f,h)=>f+h,0)>0&&t.pads.length!==a*2)throw new Error(`pads should be ${a*2}D`);if(t.outputPadding.length!==a&&t.outputPadding.length!==0)throw new Error(`output_padding should be ${a}D`);if(t.kernelShape.reduce((f,h)=>f+h,0)>0&&t.kernelShape.length!==0&&t.kernelShape.length!==e[1].dims.length-2)throw new Error("invalid kernel shape");if(t.outputShape.length!==0&&t.outputShape.length!==e[0].dims.length-2)throw new Error("invalid output shape")},Hd=(e,t,n,r)=>{let o=e.kernelCustomData.wT??e.compute(Oe(t[1],[2,3,0,1]),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];n.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=o);let a=[t[0],o];t.length===3&&a.push(t[2]),e.compute(Vd(a,n,r),{inputs:a})},dg=(e,t)=>{let n=t.format==="NHWC",r=[e.inputs[0].reshape(n?[e.inputs[0].dims[0],1,e.inputs[0].dims[1],e.inputs[0].dims[2]]:[e.inputs[0].dims[0],e.inputs[0].dims[1],1,e.inputs[0].dims[2]]),e.inputs[1].reshape([e.inputs[1].dims[0],e.inputs[1].dims[1],1,e.inputs[1].dims[2]])];e.inputs.length===3&&r.push(e.inputs[2]);let o=t.kernelShape;(o.length===0||o[0]===0)&&(o=[e.inputs[1].dims[2]]);let a=t.dilations;(a.length===0||a[0]===0)&&(a=[1]);let s=t.strides;(s.length===0||s[0]===0)&&(s=[1]);let d=t.pads;d.length===0&&(d=[0,0]),d=[0,d[0],0,d[1]],s=[1].concat(s),a=[1].concat(a),o=[1].concat(o);let l=t.outputPadding;l=[0].concat(l);let p=Ld({...t,pads:d,strides:s,dilations:a,kernelShape:o,outputPadding:l},r);Hd(e,r,p,f=>n?[f[0],f[2],f[3]]:[f[0],f[1],f[3]])},Fd=(e,t)=>{if(ug(e.inputs,t),e.inputs[0].dims.length===3)dg(e,t);else{let n=Ld(t,e.inputs);Hd(e,e.inputs,n)}}});var lg,Kd,jd,Zd=G(()=>{"use strict";te();ae();Ce();ce();lg=(e,t,n,r)=>{let o=E.size(t),a=t.length,s=P("input",e,a),d=N("output",e,a),l=n.dataType===6?n.getInt32Array()[0]:Number(n.getBigInt64Array()[0]),p=E.normalizeAxis(l,a),f=h=>{let y=` i32(${s.indicesGet("inputIndices","uniforms.axis")}) `,_=K("uniforms.input_shape","uniforms.axis",a),b=r.reverse?y+(r.exclusive?" + 1":""):"0",w=r.reverse?_:y+(r.exclusive?"":" + 1");return` + ${h.registerUniform("outputSize","u32").registerUniform("axis","u32").declareVariables(s,d)} + ${h.mainStart()} + ${h.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + var inputIndices = ${d.offsetToIndices("global_idx")}; + var sum = ${d.type.value}(0); + let first : i32 = ${b}; + let last : i32 = ${w}; + for (var i : i32 = first; i < last; i++) { + ${s.indicesSet("inputIndices","uniforms.axis","u32(i)")}; + sum = sum + ${s.getByIndices("inputIndices")}; + } + ${d.setByOffset("global_idx","sum")}; + }`};return{name:"CumSum",shaderCache:{hint:r.cacheKey,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:t,dataType:e}],dispatchGroup:{x:Math.ceil(o/64)},programUniforms:[{type:12,data:o},{type:12,data:p},...H(t,t)]}),getShaderSource:f}},Kd=(e,t)=>{let n=e.inputs[0].dims,r=e.inputs[0].dataType,o=e.inputs[1];e.compute(lg(r,n,o,t),{inputs:[0]})},jd=e=>{let t=e.exclusive===1,n=e.reverse===1;return re({exclusive:t,reverse:n})}});var cg,pg,mg,Qd,Yd,Xd=G(()=>{"use strict";te();ae();Ce();ce();cg=e=>{if(!e||e.length!==1)throw new Error("DepthToSpace requires 1 input.");if(e[0].dims.length!==4)throw new Error("DepthToSpace requires 4D input.")},pg=(e,t,n,r)=>{let o=[];o.push(`fn perm(i: ${r.type.indices}) -> ${n.type.indices} { + var a: ${n.type.indices};`);for(let a=0;a{let n,r,o,a,s,d,l=t.format==="NHWC",p=t.blocksize,f=t.mode==="DCR";l?([n,r,o,a]=e.dims,s=f?[n,r,o,p,p,a/p**2]:[n,r,o,a/p**2,p,p],d=f?[0,1,3,2,4,5]:[0,1,4,2,5,3]):([n,r,o,a]=[e.dims[0],e.dims[2],e.dims[3],e.dims[1]],s=f?[n,p,p,a/p**2,r,o]:[n,a/p**2,p,p,r,o],d=f?[0,3,4,1,5,2]:[0,1,4,2,5,3]);let h=e.reshape(s),y=h.dims.length,_=e.dataType,b=P("a",_,y),w=N("output",_,y),S=$=>` + ${$.registerUniform("output_size","u32").declareVariables(b,w)} + + ${pg(d,y,b,w)} + + ${$.mainStart()} + ${$.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let indices = ${w.offsetToIndices("global_idx")}; + let aIndices = perm(indices); + + ${w.setByOffset("global_idx",b.getByIndices("aIndices"))} + }`;return{name:"DepthToSpace",shaderCache:{hint:`${e.dims};${t.blocksize};${t.mode}`,inputDependencies:["rank"]},getRunData:$=>{let v=l?[n,r*p,o*p,a/p**2]:[n,a/p**2,r*p,o*p],T=E.size(v),C=h.dims,A=E.sortBasedOnPerm(C,d);return{outputs:[{dims:v,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(T/64)},programUniforms:[{type:12,data:T},...H(C,A)]}},getShaderSource:S}},Qd=(e,t)=>{cg(e.inputs),e.compute(mg(e.inputs[0],t))},Yd=e=>re({blocksize:e.blocksize,mode:e.mode,format:e.format})});var vo,tn,Jd,fg,hg,$o,xo,el,gg,tl,rl,nl=G(()=>{"use strict";te();ae();Ce();ce();vo="[a-zA-Z]|\\.\\.\\.",tn="("+vo+")+",Jd="^"+tn+"$",fg="("+tn+",)*"+tn,hg="^"+fg+"$",$o=class{constructor(t=-1){this.symbolToIndices=new Map,this.inputIndex=t}addSymbol(t,n){let r=this.symbolToIndices.get(t);r===void 0?r=[n]:r.push(n),this.symbolToIndices.set(t,r)}},xo=class{constructor(t,n){this.equation=n;this.hasEllipsis=!1,this.symbolToInfo=new Map,this.lhs=new Array,this.outputDims=[];let[r,o]=n.includes("->")?n.split("->",2):[n,""];if(!r.match(RegExp(hg)))throw new Error("Invalid LHS term");if(r.split(",").forEach((d,l)=>{let p=t[l].dims.slice();if(!d.match(RegExp(Jd)))throw new Error("Invalid LHS term");let f=this.processTerm(d,!0,p,l);this.lhs.push(f)}),o==="")o+=[...this.symbolToInfo.entries()].filter(([d,l])=>l.count===1||d==="...").map(([d])=>d).join("");else if(!o.match(RegExp(tn)))throw new Error("Invalid RHS");o.match(RegExp(vo,"g"))?.forEach(d=>{if(d==="...")this.outputDims=this.outputDims.concat(this.ellipsisDims);else{let l=this.symbolToInfo.get(d);if(l===void 0)throw new Error("Invalid RHS symbol");this.outputDims.push(l.dimValue)}}),this.rhs=this.processTerm(o,!1,this.outputDims)}addSymbol(t,n,r){let o=this.symbolToInfo.get(t);if(o!==void 0){if(o.dimValue!==n&&o.count!==1)throw new Error("Dimension mismatch");o.count++,o.inputIndices.push(r)}else o={count:1,dimValue:n,inputIndices:[r]};this.symbolToInfo.set(t,o)}processTerm(t,n,r,o=-1){let a=r.length,s=!1,d=[],l=0;if(!t.match(RegExp(Jd))&&!n&&t!=="")throw new Error("Invalid LHS term");let p=t.match(RegExp(vo,"g")),f=new $o(o);return p?.forEach((h,y)=>{if(h==="..."){if(s)throw new Error("Only one ellipsis is allowed per input term");s=!0;let _=a-p.length+1;if(_<0)throw new Error("Ellipsis out of bounds");if(d=r.slice(l,l+_),this.hasEllipsis){if(this.ellipsisDims.length!==d.length||this.ellipsisDims.toString()!==d.toString())throw new Error("Ellipsis dimensions mismatch")}else if(n)this.hasEllipsis=!0,this.ellipsisDims=d;else throw new Error("Ellipsis must be specified in the LHS");for(let b=0;be+"_max",gg=(e,t,n,r)=>{let a=e.map(f=>f.length).map((f,h)=>P(`input${h}`,t,f)),s=E.size(r),d=N("output",t,r.length),l=[...n.symbolToInfo.keys()].filter(f=>!n.rhs.symbolToIndices.has(f)),p=f=>{let h=[],y="var prod = 1.0;",_="var sum = 0.0;",b="sum += prod;",w=[],S=[],$=[],v=[],T=n.symbolToInfo.size===n.rhs.symbolToIndices.size;n.symbolToInfo.forEach((A,k)=>{if(n.rhs.symbolToIndices.has(k)){let O=n.rhs.symbolToIndices.get(k)?.[0];O!==void 0&&n.lhs.forEach((M,V)=>{if(A.inputIndices.includes(V)){let F=M.symbolToIndices.get(k);if(F===void 0)throw new Error("Invalid symbol error");F.forEach(j=>{h.push(`${a[V].indicesSet(`input${V}Indices`,j,d.indicesGet("outputIndices",O))}`)})}})}else n.lhs.forEach((O,M)=>{if(A.inputIndices.includes(M)){let V=O.symbolToIndices.get(k);if(V===void 0)throw new Error("Invalid symbol error");V.forEach(F=>{w.push(`${a[M].indicesSet(`input${M}Indices`,F,`${k}`)}`)}),v.push(`prod *= ${a[M].getByIndices(`input${M}Indices`)};`)}}),S.push(`for(var ${k}: u32 = 0; ${k} < uniforms.${el(k)}; ${k}++) {`),$.push("}")});let C=T?[...h,`let sum = ${a.map((A,k)=>A.getByIndices(`input${k}Indices`)).join(" * ")};`]:[...h,_,...S,...w,y,...v,b,...$];return` + ${f.registerUniforms(l.map(A=>({name:`${el(A)}`,type:"u32"}))).registerUniform("outputSize","u32").declareVariables(...a,d)} + + ${f.mainStart()} + ${f.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + var outputIndices = ${d.offsetToIndices("global_idx")}; + ${a.map((A,k)=>`var input${k}Indices: ${a[k].type.indices};`).join(` +`)} + ${C.join(` +`)}; + ${d.setByOffset("global_idx","sum")}; + }`};return{name:"Einsum",shaderCache:{hint:n.equation,inputDependencies:e.map(()=>"rank")},getRunData:()=>{let f=l.filter(y=>n.symbolToInfo.has(y)).map(y=>({type:12,data:n.symbolToInfo.get(y)?.dimValue||0}));f.push({type:12,data:s});let h=e.map((y,_)=>[...H(y)]).reduce((y,_)=>y.concat(_),f);return h.push(...H(r)),{outputs:[{dims:r,dataType:t}],dispatchGroup:{x:Math.ceil(s/64)},programUniforms:h}},getShaderSource:p}},tl=(e,t)=>{let n=new xo(e.inputs,t.equation),r=n.outputDims,o=e.inputs.map((a,s)=>a.dims);e.compute(gg(o,e.inputs[0].dataType,n,r))},rl=e=>{let t=e.equation.replace(/\s+/g,"");return re({equation:t})}});var yg,ol,bg,_g,il,al=G(()=>{"use strict";te();ae();ce();yg=e=>{if(!e||e.length!==2)throw new Error("Expand requires 2 input.");let t=e[0].dims,n=Array.from(e[1].getBigInt64Array(),Number),r=n.length{let n=e.length-t.length,r=[];for(let o=0;oe.length>t.length?ol(e,t):ol(t,e),_g=e=>{let t=e[0].dims,n=Array.from(e[1].getBigInt64Array(),Number),r=bg(t,n),o=e[0].dataType,a=o===9||E.size(t)===1,s=o===9||t.length>0&&t[t.length-1]%4===0?4:1,d=a||r.length>0&&r[r.length-1]%4===0?4:1,l=Math.ceil(E.size(r)/d),p=h=>{let y=P("input",o,t.length,s),_=N("output",o,r.length,d),b;if(o===9){let w=(S,$,v="")=>` + let outputIndices${$} = ${_.offsetToIndices(`outputOffset + ${$}u`)}; + let offset${$} = ${y.broadcastedIndicesToOffset(`outputIndices${$}`,_)}; + let index${$} = offset${$} / 4u; + let component${$} = offset${$} % 4u; + ${S}[${$}] = ${v}(${y.getByOffset(`index${$}`)}[component${$}]); + `;b=` + let outputOffset = global_idx * ${d}; + var data = vec4(0); + ${w("data",0,"u32")} + ${w("data",1,"u32")} + ${w("data",2,"u32")} + ${w("data",3,"u32")} + ${_.setByOffset("global_idx","data")} + }`}else b=` + let outputIndices = ${_.offsetToIndices(`global_idx * ${d}`)}; + let inputOffset = ${y.broadcastedIndicesToOffset("outputIndices",_)}; + let data = ${_.type.value}(${y.getByOffset(`inputOffset / ${s}`)}); + ${_.setByOffset("global_idx","data")} + }`;return` + ${h.registerUniform("vec_size","u32").declareVariables(y,_)} + ${h.mainStart()} + ${h.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + ${b}`},f=[{type:12,data:l},...H(t,r)];return{name:"Expand",shaderCache:{hint:`${r.length};${s}${d}`,inputDependencies:["rank"]},getShaderSource:p,getRunData:()=>({outputs:[{dims:r,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(l/64)},programUniforms:f})}},il=e=>{yg(e.inputs),e.compute(_g(e.inputs),{inputs:[0]})}});var wg,sl,ul=G(()=>{"use strict";te();ae();ce();jr();wg=e=>{let t=e[0].dataType,n=E.size(e[0].dims),r=E.size(e[1].dims),o=r%4===0,a=s=>{let d=P("x",t,[1],4),l=P("bias",t,[1],4),p=N("y",t,[1],4),f=[{name:"output_vec_size",type:"u32"},{name:"bias_size",type:"u32"}],h=_=>` + let bias${_}_offset: u32 = (global_idx * 4 + ${_}) % uniforms.bias_size; + let bias${_} = ${l.getByOffset(`bias${_}_offset / 4`)}[bias${_}_offset % 4];`,y=o?` + let bias = ${l.getByOffset("global_idx % (uniforms.bias_size / 4)")};`:`${h(0)}${h(1)}${h(2)}${h(3)} + let bias = ${d.type.value}(bias0, bias1, bias2, bias3);`;return`${s.registerUniforms(f).declareVariables(d,l,p)} + + ${mo(ze(t))} + + ${s.mainStart(Et)} + ${s.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_vec_size")} + + let x = ${d.getByOffset("global_idx")}; + ${y} + let x_in = x + bias; + ${p.setByOffset("global_idx",fo("x_in"))} + }`};return{name:"FastGeluWithBias",shaderCache:{hint:`${o}`,inputDependencies:["type","type"]},getShaderSource:a,getRunData:s=>({outputs:[{dims:s[0].dims,dataType:s[0].dataType}],programUniforms:[{type:12,data:Math.ceil(n/4)},{type:12,data:r}],dispatchGroup:{x:Math.ceil(n/Et/4)}})}},sl=e=>{e.inputs.length<2||E.size(e.inputs[1].dims)===0?nd(e):e.compute(wg(e.inputs))}});var vg,$g,dl,ll,cl=G(()=>{"use strict";te();ae();Ce();ce();vg=e=>{if(!e||e.length!==2)throw new Error("Gather requires 2 inputs.")},$g=(e,t)=>{let n=e[0].dims,r=e[1].dims,o=n.length,a=E.normalizeAxis(t.axis,o),s=n.slice(0);s.splice(a,1,...r);let d=n[a],l=e[0].dataType===9?4:1,p=Math.ceil(E.size(s)/l),f=[{type:12,data:p},{type:6,data:d},{type:12,data:a},...H(e[0].dims,e[1].dims,s)],h=y=>{let _=P("data",e[0].dataType,e[0].dims.length,l),b=P("inputIndices",e[1].dataType,e[1].dims.length),w=N("output",e[0].dataType,s.length,l),S=v=>{let T=r.length,C=`var indicesIndices${v} = ${b.type.indices}(0);`;for(let A=0;A1?`indicesIndices${v}[${A}]`:`indicesIndices${v}`} = ${s.length>1?`outputIndices${v}[uniforms.axis + ${A}]`:`outputIndices${v}`};`;C+=` + var idx${v} = ${b.getByIndices(`indicesIndices${v}`)}; + if (idx${v} < 0) { + idx${v} = idx${v} + uniforms.axisDimLimit; + } + var dataIndices${v} : ${_.type.indices}; + `;for(let A=0,k=0;A1?`dataIndices${v}[${A}]`:`dataIndices${v}`} = u32(idx${v});`,k+=T):(C+=`${o>1?`dataIndices${v}[${A}]`:`dataIndices${v}`} = ${s.length>1?`outputIndices${v}[${k}]`:`outputIndices${v}`};`,k++);return C},$;if(e[0].dataType===9){let v=(T,C,A="")=>` + let outputIndices${C} = ${w.offsetToIndices(`outputOffset + ${C}u`)}; + ${S(C)}; + let offset${C} = ${_.indicesToOffset(`dataIndices${C}`)}; + let index${C} = offset${C} / 4u; + let component${C} = offset${C} % 4u; + ${T}[${C}] = ${A}(${_.getByOffset(`index${C}`)}[component${C}]); + `;$=` + let outputOffset = global_idx * ${l}; + var value = vec4(0); + ${v("value",0,"u32")} + ${v("value",1,"u32")} + ${v("value",2,"u32")} + ${v("value",3,"u32")} + ${w.setByOffset("global_idx","value")} + `}else $=` + let outputIndices = ${w.offsetToIndices("global_idx")}; + ${S("")}; + let value = ${_.getByIndices("dataIndices")}; + ${w.setByOffset("global_idx","value")}; + `;return` + ${y.registerUniform("outputSize","u32").registerUniform("axisDimLimit","i32").registerUniform("axis","u32").declareVariables(_,b,w)} + ${y.mainStart()} + ${y.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + ${$} + }`};return{name:"Gather",shaderCache:{hint:t.cacheKey,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:s,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(p/64)},programUniforms:f}),getShaderSource:h}},dl=e=>re({axis:e.axis}),ll=(e,t)=>{let n=e.inputs;vg(n),e.compute($g(e.inputs,t))}});var xg,pl,ml,fl=G(()=>{"use strict";te();ae();ce();xg=(e,t,n,r,o,a,s,d,l)=>{let p=[{type:12,data:a},{type:12,data:r},{type:12,data:o},{type:12,data:n},{type:12,data:s},{type:12,data:d},{type:12,data:l}],f=[a];p.push(...H(t.dims,f));let h=y=>{let _=P("indices_data",t.dataType,t.dims.length),b=N("input_slice_offsets_data",12,1,1),w=[_,b],S=[{name:"output_size",type:"u32"},{name:"batch_dims",type:"u32"},{name:"input_dims",type:"u32",length:o.length},{name:"sizes_from_slice_dims_data",type:"u32",length:n.length},{name:"num_slices_per_batch",type:"u32"},{name:"input_batch_stride",type:"u32"},{name:"num_slice_dims",type:"u32"}];return` + ${y.registerUniforms(S).declareVariables(...w)} + ${y.mainStart()} + ${y.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let batch_idx = global_idx / uniforms.num_slices_per_batch; + let base_offset = batch_idx * uniforms.input_batch_stride; + + let slice_indices_base_offset = global_idx * uniforms.num_slice_dims; + var relative_slice_offset = 0; + for (var dim_idx = 0u; dim_idx < uniforms.num_slice_dims; dim_idx ++) { + var index = i32(indices_data[dim_idx + slice_indices_base_offset].x); + let input_dim_idx = uniforms.batch_dims + dim_idx; + if (index < 0) { + ${o.length===1?"index += i32(uniforms.input_dims);":"index += i32(uniforms.input_dims[input_dim_idx]);"} + } + ${n.length===1?"relative_slice_offset += index * i32(uniforms.sizes_from_slice_dims_data);":"relative_slice_offset += index * i32(uniforms.sizes_from_slice_dims_data[dim_idx]);"} + } + + input_slice_offsets_data[global_idx] = base_offset + u32(relative_slice_offset); + }`};return e.compute({name:"computeSliceOffsets",shaderCache:{hint:`${o.length}_${n.length}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:f,dataType:e.inputs[1].dataType}],dispatchGroup:{x:Math.ceil(a/64)},programUniforms:p}),getShaderSource:h},{inputs:[t],outputs:[-1]})[0]},pl=(e,t)=>{let n=e.inputs,r=n[0].dims,o=n[0].dataType,a=n[1].dims,s=a[a.length-1],d=E.sizeToDimension(a,a.length-1),l=E.sizeFromDimension(r,t.batchDims+s),p=E.sizeToDimension(r,t.batchDims),f=E.sizeFromDimension(r,t.batchDims),h=d/p,y=new Array(s),_=l;for(let C=0;Cr.length)throw new Error("last dimension of indices must not be larger than rank of input tensor");let S=a.slice(0,-1).concat(r.slice(w)),$=E.size(S),v=[{type:12,data:$},{type:12,data:l},...H(n[0].dims,b.dims,S)],T=C=>{let A=P("data",n[0].dataType,n[0].dims.length),k=P("slice_offsets",12,b.dims.length),O=N("output",n[0].dataType,S.length);return` + ${C.registerUniform("output_size","u32").registerUniform("slice_size","u32").declareVariables(A,k,O)} + ${C.mainStart()} + ${C.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let slice_offset = slice_offsets[global_idx / uniforms.slice_size]; + output[global_idx] = data[u32(slice_offset) + global_idx % uniforms.slice_size]; + }`};e.compute({name:"GatherND",shaderCache:{hint:t.cacheKey,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:S,dataType:o}],dispatchGroup:{x:Math.ceil($/64)},programUniforms:v}),getShaderSource:T},{inputs:[n[0],b]})},ml=e=>({batchDims:e.batch_dims,cacheKey:""})});var Sg,Tg,hl,gl,yl=G(()=>{"use strict";te();ae();Ce();ce();Sg=(e,t)=>{if(e.length<3||e.length>4)throw new Error("GatherBlockQuantized requires 3 or 4 inputs.");let n=E.normalizeAxis(t.quantizeAxis,e[0].dims.length),r=t.blockSize,o=e[0],a=e[2],s=e.length===4?e[3]:void 0;if(a.dims.length!==o.dims.length||!o.dims.map((d,l)=>l===n?Math.ceil(d/r)===a.dims[l]:d===a.dims[l]).reduce((d,l)=>d&&l,!0))throw new Error("Scales must have the same rank as the input tensor and the dims should match except on gatherAxis.");if(s){if(s.dataType!==o.dataType)throw new Error("Zero point must have the same data type as the input tensor.");if(s.dims.length!==a.dims.length||!s.dims.map((d,l)=>d===a.dims[l]).reduce((d,l)=>d&&l,!0))throw new Error("Zero point must have the same rank as the input tensor and the dims should match except on quantizeAxis.")}},Tg=(e,t)=>{let n=e[0].dims,r=e[1].dims,o=n.length,a=E.normalizeAxis(t.gatherAxis,o),s=E.normalizeAxis(t.quantizeAxis,o),d=n.slice(0);d.splice(a,1,...r);let l=E.size(d),p=e[2].dataType,h=e[0].dataType===22,y=[{type:12,data:l},{type:12,data:s},{type:12,data:a},{type:12,data:t.blockSize},...H(...e.map((b,w)=>b.dims),d)],_=b=>{let w=P("data",e[0].dataType,e[0].dims.length),S=P("inputIndices",e[1].dataType,e[1].dims.length),$=P("scales",e[2].dataType,e[2].dims.length),v=e.length>3?P("zeroPoint",e[3].dataType,e[3].dims.length):void 0,T=N("output",p,d.length),C=[w,S,$];v&&C.push(v);let A=[{name:"output_size",type:"u32"},{name:"quantize_axis",type:"u32"},{name:"gather_axis",type:"u32"},{name:"block_size",type:"u32"}];return` + ${b.registerUniforms(A).declareVariables(...C,T)} + ${b.mainStart()} + let output_indices = ${T.offsetToIndices("global_idx")}; + var indices_indices = ${S.type.indices}(0); + ${r.length>1?` + for (var i: u32 = 0; i < ${r.length}; i++) { + let index = ${T.indicesGet("output_indices","uniforms.gather_axis + i")}; + ${S.indicesSet("indices_indices","i","index")}; + }`:`indices_indices = ${T.indicesGet("output_indices","uniforms.gather_axis")};`}; + var data_indices = ${w.type.indices}(0); + for (var i: u32 = 0; i < uniforms.gather_axis; i++) { + let index = ${T.indicesGet("output_indices","i")}; + ${w.indicesSet("data_indices","i","index")}; + } + var index_from_indices = ${S.getByIndices("indices_indices")}; + if (index_from_indices < 0) { + index_from_indices += ${n[a]}; + } + ${w.indicesSet("data_indices","uniforms.gather_axis","u32(index_from_indices)")}; + for (var i = uniforms.gather_axis + 1; i < ${d.length}; i++) { + let index = ${T.indicesGet("output_indices",`i + ${r.length} - 1`)}; + ${w.indicesSet("data_indices","i","index")}; + } + let data_offset = ${w.indicesToOffset("data_indices")}; + let data_index = data_offset % 8; + // Convert 4-bit packed data to 8-bit packed data. + let packed_4bit_quantized_data = ${w.getByOffset("data_offset / 8")}; + let packed_8bit_quantized_data = (packed_4bit_quantized_data >> (4 * (data_index % 2))) & 0x0f0f0f0f; + let quantized_data_vec = ${h?"unpack4xI8":"unpack4xU8"}(u32(packed_8bit_quantized_data)); + let quantized_data = quantized_data_vec[data_index / 2]; + var scale_indices = data_indices; + let quantize_axis_index = ${$.indicesGet("data_indices","uniforms.quantize_axis")} / uniforms.block_size; + ${$.indicesSet("scale_indices","uniforms.quantize_axis","quantize_axis_index")}; + var scale = ${$.getByIndices("scale_indices")}; + ${v?` + let zero_point_indices = scale_indices; + let zero_point_offset = ${v.indicesToOffset("zero_point_indices")}; + let zero_point_index = zero_point_offset % 8; + let packed_4bit_zero_points = ${v.getByOffset("zero_point_offset / 8")}; + let packed_8bit_zero_points = (packed_4bit_zero_points >> (4 * (zero_point_index % 2))) & 0x0f0f0f0f; + let zero_point_vec = ${h?"unpack4xI8":"unpack4xU8"}(u32(packed_8bit_zero_points)); + let zero_point = zero_point_vec[zero_point_index / 2];`:"var zero_point = 0"}; + let dequantized_data = ${ze(p)}(quantized_data - zero_point) * scale; + ${T.setByOffset("global_idx","dequantized_data")}; + }`};return{name:"GatherBlockQuantized",shaderCache:{hint:`${t.cacheKey};${e.filter((b,w)=>w!==1).map(b=>b.dims.join("_")).join(";")}`,inputDependencies:Array.from({length:e.length},(b,w)=>"rank")},getRunData:()=>({outputs:[{dims:d,dataType:p}],dispatchGroup:{x:Math.ceil(l/64)},programUniforms:y}),getShaderSource:_}},hl=(e,t)=>{let n=e.inputs;Sg(n,t),e.compute(Tg(e.inputs,t))},gl=e=>re({blockSize:e.blockSize,gatherAxis:e.gatherAxis,quantizeAxis:e.quantizeAxis})});var Cg,Ig,bl,_l,wl=G(()=>{"use strict";te();ae();Ce();ce();Cg=e=>{if(!e||e.length!==2)throw new Error("GatherElements requires 2 inputs.");if(e[0].dims.length<1)throw new Error("GatherElements requires that the data input be rank >= 1.");if(e[0].dims.length!==e[1].dims.length)throw new Error(`GatherElements requires that the data input and + indices input tensors be of same rank.`)},Ig=(e,t)=>{let n=e[0].dims,r=e[0].dataType,o=n.length,a=e[1].dims,s=e[1].dataType,d=E.normalizeAxis(t.axis,o),l=n[d],p=a.slice(0),f=E.size(p),h=P("input",r,o),y=P("indicesInput",s,a.length),_=N("output",r,p.length),b=[{type:12,data:f},{type:6,data:l},{type:12,data:d}];return b.push(...H(n,a,p)),{name:"GatherElements",shaderCache:{inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:p,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(f/64)},programUniforms:b}),getShaderSource:$=>` + ${$.registerUniform("outputSize","u32").registerUniform("axisDimLimit","i32").registerUniform("axis","u32").declareVariables(h,y,_)} + ${$.mainStart()} + ${$.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + + let outputIndices = ${_.offsetToIndices("global_idx")}; + + var idx = ${y.getByOffset("global_idx")}; + if (idx < 0) { + idx = idx + uniforms.axisDimLimit; + } + var inputIndices = ${h.type.indices}(outputIndices); + ${h.indicesSet("inputIndices","uniforms.axis","u32(idx)")}; + let value = ${h.getByIndices("inputIndices")}; + + ${_.setByOffset("global_idx","value")}; + }`}},bl=e=>re({axis:e.axis}),_l=(e,t)=>{let n=e.inputs;Cg(n),e.compute(Ig(e.inputs,t))}});var Ag,kg,vl,$l,xl=G(()=>{"use strict";te();ae();ce();Ag=e=>{if(!e)throw new Error("Input is missing");if(e.length<2||e.length>3)throw new Error("Invaid input number.");if(e.length===3&&e[2].dims.length>2)throw new Error("Invalid input shape of C");if(e[0].dataType!==e[1].dataType||e.length===3&&e[0].dataType!==e[2].dataType)throw new Error("Input types are mismatched")},kg=(e,t)=>{let n=e[0].dims.slice(),r=e[1].dims.slice(),[o,a,s]=Wr.getShapeOfGemmResult(n,t.transA,r,t.transB,e.length===3?e[2].dims:void 0),d=[o,a];if(!d)throw new Error("Can't use gemm on the given tensors");let l=16,p=Math.ceil(a/l),f=Math.ceil(o/l),h=!0,y=E.size(d),_=[{type:12,data:h?p:y},{type:12,data:o},{type:12,data:a},{type:12,data:s},{type:1,data:t.alpha},{type:1,data:t.beta}],b=["type","type"];e.length===3&&(_.push(...H(e[2].dims)),b.push("rank")),_.push(...H(d));let w=$=>{let v="";t.transA&&t.transB?v="value += a[k * uniforms.M + m] * b[n * uniforms.K + k];":t.transA&&!t.transB?v="value += a[k * uniforms.M + m] * b[k * uniforms.N + n];":!t.transA&&t.transB?v="value += a[m * uniforms.K + k] * b[n * uniforms.K + k];":!t.transA&&!t.transB&&(v="value += a[m * uniforms.K + k] * b[k * uniforms.N + n];");let T=t.alpha===1?"":"value *= uniforms.alpha;",C=P("a",e[0].dataType,e[0].dims),A=P("b",e[1].dataType,e[1].dims),k=C.type.value,O=null,M=[C,A];e.length===3&&(O=P("c",e[2].dataType,e[2].dims.length),M.push(O));let V=N("output",e[0].dataType,d.length);M.push(V);let F=[{name:"output_size",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"},{name:"alpha",type:"f32"},{name:"beta",type:"f32"}];return` + ${$.registerUniforms(F).declareVariables(...M)} + + ${$.mainStart()} + ${$.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let m = global_idx / uniforms.N; + let n = global_idx % uniforms.N; + + var value = ${k}(0); + for (var k: u32 = 0u; k < uniforms.K; k++) { + ${v} + } + + ${T} + ${O!=null?`let cOffset = ${O.broadcastedIndicesToOffset("vec2(m, n)",V)}; value += ${k}(uniforms.beta) * ${O.getByOffset("cOffset")};`:""} + output[global_idx] = value; + }`},S=$=>{let v=P("a",e[0].dataType,e[0].dims),T=P("b",e[1].dataType,e[1].dims),C=null,A=[v,T];e.length===3&&(C=P("c",e[2].dataType,e[2].dims.length),A.push(C));let k=N("output",e[0].dataType,d.length);A.push(k);let O=[{name:"num_tile_n",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"},{name:"alpha",type:"f32"},{name:"beta",type:"f32"}],M="",V="";t.transA&&t.transB?(V=` + var col = tile_row_start + local_id.x; + var row = k_start + local_id.y; + if (col < uniforms.M && row < uniforms.K) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.M + col]; + } else { + tile_a[local_id.y][local_id.x] = ${v.type.value}(0); + } + + col = k_start + local_id.x; + row = tile_col_start + local_id.y; + if (col < uniforms.K && row < uniforms.N) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.K + col]; + } else { + tile_b[local_id.y][local_id.x] = ${T.type.value}(0); + } + `,M="value += tile_a[k][local_id.y] * tile_b[local_id.x][k];"):t.transA&&!t.transB?(V=` + var col = tile_row_start + local_id.x; + var row = k_start + local_id.y; + if (col < uniforms.M && row < uniforms.K) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.M + col]; + } else { + tile_a[local_id.y][local_id.x] = ${v.type.value}(0); + } + + col = tile_col_start + local_id.x; + row = k_start + local_id.y; + if (col < uniforms.N && row < uniforms.K) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.N + col]; + } else { + tile_b[local_id.y][local_id.x] = ${T.type.value}(0); + } + `,M="value += tile_a[k][local_id.y] * tile_b[k][local_id.x];"):!t.transA&&t.transB?(V=` + var col = k_start + local_id.x; + var row = tile_row_start + local_id.y; + if (col < uniforms.K && row < uniforms.M) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.K + col]; + } else { + tile_a[local_id.y][local_id.x] = ${v.type.value}(0); + } + + col = k_start + local_id.x; + row = tile_col_start + local_id.y; + if (col < uniforms.K && row < uniforms.N) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.K + col]; + } else { + tile_b[local_id.y][local_id.x] = ${T.type.value}(0); + } + `,M="value += tile_a[local_id.y][k] * tile_b[local_id.x][k];"):!t.transA&&!t.transB&&(V=` + var col = k_start + local_id.x; + var row = tile_row_start + local_id.y; + if (col < uniforms.K && row < uniforms.M) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.K + col]; + } else { + tile_a[local_id.y][local_id.x] = ${v.type.value}(0); + } + + col = tile_col_start + local_id.x; + row = k_start + local_id.y; + if (col < uniforms.N && row < uniforms.K) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.N + col]; + } else { + tile_b[local_id.y][local_id.x] = ${T.type.value}(0); + } + `,M="value += tile_a[local_id.y][k] * tile_b[k][local_id.x];");let F=t.alpha===1?"":"value *= uniforms.alpha;";return` + ${$.registerUniforms(O).declareVariables(...A)} + var tile_a: array, ${l}>; + var tile_b: array, ${l}>; + ${$.mainStart([l,l,1])} + let tile_col_start = (workgroup_index % uniforms.num_tile_n) * ${l}; + let tile_row_start = (workgroup_index / uniforms.num_tile_n) * ${l}; + let num_tiles = (uniforms.K - 1) / ${l} + 1; + var k_start = 0u; + var value = ${k.type.value}(0); + for (var t: u32 = 0u; t < num_tiles; t++) { + ${V} + k_start = k_start + ${l}; + workgroupBarrier(); + + for (var k: u32 = 0u; k < ${l}; k++) { + ${M} + } + workgroupBarrier(); + } + + ${F} + let m = tile_row_start + local_id.y; + let n = tile_col_start + local_id.x; + ${C!=null?`let cOffset = ${C.broadcastedIndicesToOffset("vec2(m, n)",k)}; value += ${k.type.value}(uniforms.beta) * ${C.getByOffset("cOffset")};`:""} + if (m < uniforms.M && n < uniforms.N) { + output[m * uniforms.N + n] = value; + } + }`};return h?{name:"GemmShared",shaderCache:{hint:`${t.cacheKey}`,inputDependencies:b},getRunData:()=>({outputs:[{dims:d,dataType:e[0].dataType}],dispatchGroup:{x:p*f},programUniforms:_}),getShaderSource:S}:{name:"Gemm",shaderCache:{hint:`${t.cacheKey}`,inputDependencies:b},getRunData:()=>({outputs:[{dims:d,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(y/64)},programUniforms:_}),getShaderSource:w}},vl=e=>{let t=e.transA,n=e.transB,r=e.alpha,o=e.beta;return{transA:t,transB:n,alpha:r,beta:o,cacheKey:`${e.transA};${e.transB};${e.alpha===1}`}},$l=(e,t)=>{Ag(e.inputs),e.compute(kg(e.inputs,t))}});var pt,$t,Nt,Vt,Eg,Pg,zg,Og,Dg,Bg,Mg,Rg,Sl,Tl,Cl=G(()=>{"use strict";te();ae();Ce();ce();[pt,$t,Nt,Vt]=[0,1,2,3],Eg=e=>{if(e[0].dims.length!==4)throw new Error("only 4-D tensor is supported.");if(e[0].dims.length!==e[1].dims.length)throw new Error("input dimensions must be equal to grid dimensions");if(e[0].dims.length-2!==e[1].dims[e[1].dims.length-1])throw new Error(`last dimension of grid must be equal to ${e[0].dims.length-2}`);if(e[0].dims[0]!==e[1].dims[0])throw new Error("grid batch size must match input batch size")},Pg=` + fn gs_get_cubic_coeffs(x: f32) -> vec4 { + let cubic_alpha = -0.75f; + let x_abs = abs(x); + var coeffs: vec4; + coeffs[0] = (((cubic_alpha * (x_abs + 1) - 5 * cubic_alpha) * (x_abs + 1) + 8 * cubic_alpha) * (x_abs + 1) - 4 * cubic_alpha); + coeffs[1] = (((cubic_alpha + 2) * x_abs - (cubic_alpha + 3)) * x_abs * x_abs + 1); + coeffs[2] = (((cubic_alpha + 2) * (1 - x_abs) - (cubic_alpha + 3)) * (1 - x_abs) * (1 - x_abs) + 1); + coeffs[3] = (((cubic_alpha * (2 - x_abs) - 5 * cubic_alpha) * (2 - x_abs) + 8 * cubic_alpha) * (2 - x_abs) - 4 * cubic_alpha); + return coeffs; + } +`,zg=e=>` + fn gs_bicubic_interpolate(p: mat4x4<${e}>, x: f32, y: f32) -> ${e} { + var v: vec4; + var coeffs = gs_get_cubic_coeffs(x); + for (var i = 0; i < 4; i++) { + v[i] = coeffs[0] * p[i][0] + coeffs[1] * p[i][1] + coeffs[2] * p[i][2] + coeffs[3] * p[i][3]; + } + coeffs = gs_get_cubic_coeffs(y); + let pixel = ${e}(coeffs[0] * v[0] + coeffs[1] * v[1] + coeffs[2] * v[2] + coeffs[3] * v[3]); + return pixel; + } +`,Og=e=>` + fn gs_denormalize(n: f32, length: i32) -> f32 { + ${e.alignCorners===0?` + // alignCorners: false => [-1, 1] to [-0.5, length - 0.5] + return ((n + 1.0) * f32(length) - 1.0) / 2.0; + `:` + // alignCorners: true => [-1, 1] to [0, length - 1] + return (n + 1.0) / 2.0 * (f32(length - 1)); + `} + } +`,Dg=e=>` + ${e.paddingMode==="reflection"?` + fn gs_reflect(x: i32, x_min: f32, x_max: f32) -> u32 { + var dx = 0.0; + var fx = f32(x); + let range = x_max - x_min; + if (fx < x_min) { + dx = x_min - fx; + let n = u32(dx / range); + let r = dx - f32(n) * range; + if (n % 2 == 0) { + fx = x_min + r; + } else { + fx = x_max - r; + } + } else if (fx > x_max) { + dx = fx - x_max; + let n = u32(dx / range); + let r = dx - f32(n) * range; + if (n % 2 == 0) { + fx = x_max - r; + } else { + fx = x_min + r; + } + } + return u32(fx); + }`:""} +`,Bg=(e,t,n)=>` + fn pixel_at_grid(r: i32, c: i32, H: i32, W: i32, batch: u32, channel: u32, border: vec4) -> ${t} { + var pixel = ${t}(0); + var indices = vec4(0); + indices[${pt}] = batch; + indices[${$t}] = channel;`+(()=>{switch(n.paddingMode){case"zeros":return` + if (r >= 0 && r < H && c >=0 && c < W) { + indices[${Nt}] = u32(r); + indices[${Vt}] = u32(c); + } + `;case"border":return` + indices[${Nt}] = u32(clamp(r, 0, H - 1)); + indices[${Vt}] = u32(clamp(c, 0, W - 1)); + `;case"reflection":return` + indices[${Nt}] = gs_reflect(r, border[1], border[3]); + indices[${Vt}] = gs_reflect(c, border[0], border[2]); + `;default:throw new Error(`padding mode ${n.paddingMode} is not supported`)}})()+` + return ${e.getByIndices("indices")}; + } +`,Mg=(e,t,n)=>(()=>{switch(n.mode){case"nearest":return` + let result = pixel_at_grid(i32(round(y)), i32(round(x)), H_in, W_in, indices[${pt}], indices[${$t}], border); + `;case"bilinear":return` + let x1 = i32(floor(x)); + let y1 = i32(floor(y)); + let x2 = x1 + 1; + let y2 = y1 + 1; + + let p11 = pixel_at_grid(y1, x1, H_in, W_in, indices[${pt}], indices[${$t}], border); + let p12 = pixel_at_grid(y1, x2, H_in, W_in, indices[${pt}], indices[${$t}], border); + let p21 = pixel_at_grid(y2, x1, H_in, W_in, indices[${pt}], indices[${$t}], border); + let p22 = pixel_at_grid(y2, x2, H_in, W_in, indices[${pt}], indices[${$t}], border); + + let dx2 = ${t}(f32(x2) - x); + let dx1 = ${t}(x - f32(x1)); + let dy2 = ${t}(f32(y2) - y); + let dy1 = ${t}(y - f32(y1)); + let result = dy2 * (dx2 * p11 + dx1 * p12) + dy1 * (dx2 * p21 + dx1 * p22); + `;case"bicubic":return` + let x0 = i32(floor(x)) - 1; + let y0 = i32(floor(y)) - 1; + var p: mat4x4<${t}>; + for (var h = 0; h < 4; h++) { + for (var w = 0; w < 4; w++) { + p[h][w] = pixel_at_grid(h + y0, w + x0, H_in, W_in, indices[${pt}], indices[${$t}], border); + } + } + + let dx = x - f32(x0 + 1); + let dy = y - f32(y0 + 1); + let result = gs_bicubic_interpolate(p, dx, dy); + `;default:throw new Error(`mode ${n.mode} is not supported`)}})()+`${e.setByOffset("global_idx","result")}`,Rg=(e,t)=>{let n=P("x",e[0].dataType,e[0].dims.length),r=[e[1].dims[0],e[1].dims[1],e[1].dims[2]],o=P("grid",e[1].dataType,r.length,2),a=[e[0].dims[0],e[0].dims[1],e[1].dims[1],e[1].dims[2]];t.format==="NHWC"&&(a=[e[0].dims[0],e[1].dims[1],e[1].dims[2],e[0].dims[3]],[pt,$t,Nt,Vt]=[0,3,1,2]);let s=N("output",e[0].dataType,a.length),d=n.type.value,l=E.size(a),p=[{type:12,data:l},...H(e[0].dims,r,a)],f=h=>` + ${h.registerUniform("output_size","u32").declareVariables(n,o,s)} + ${Pg} + ${zg(d)} + ${Og(t)} + ${Dg(t)} + ${Bg(n,d,t)} + + ${h.mainStart()} + ${h.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let H_in = i32(uniforms.x_shape[${Nt}]); + let W_in = i32(uniforms.x_shape[${Vt}]); + + ${t.alignCorners===0?` + let x_min = -0.5; + let x_max = f32(W_in) - 0.5; + let y_min = -0.5; + let y_max = f32(H_in) - 0.5; + `:` + let x_min = 0.0; + let x_max = f32(W_in) - 1.0; + let y_min = 0.0; + let y_max = f32(H_in) - 1.0; + `}; + let border = vec4(x_min, y_min, x_max, y_max); + + let indices = ${s.offsetToIndices("global_idx")}; + var grid_indices = vec3(indices[${pt}], indices[${Nt}], indices[${Vt}]); + let nxy = ${o.getByIndices("grid_indices")}; + var x = gs_denormalize(f32(nxy[0]), W_in); + var y = gs_denormalize(f32(nxy[1]), H_in); + + ${Mg(s,d,t)} + }`;return{name:"GridSample",shaderCache:{hint:`${t.cacheKey}`,inputDependencies:["type","type"]},getRunData:h=>{let y=E.size(a);return{outputs:[{dims:a,dataType:h[0].dataType}],dispatchGroup:{x:Math.ceil(y/64)},programUniforms:p}},getShaderSource:f}},Sl=(e,t)=>{Eg(e.inputs),e.compute(Rg(e.inputs,t))},Tl=e=>re({alignCorners:e.align_corners,mode:e.mode,paddingMode:e.padding_mode,format:e.format})});var Me,Vg,Al,Il,Wg,or,kl,So=G(()=>{"use strict";te();ae();Ce();Vr();qr();ce();ct();Me=(e,t)=>e.length>t&&e[t].dims.length>0?e[t]:void 0,Vg=(e,t)=>{let n=e[0],r=Me(e,1),o=Me(e,2),a=Me(e,3),s=Me(e,4),d=Me(e,5),l=Me(e,6),p=Me(e,7);if(n.dims.length!==3&&n.dims.length!==5)throw new Error("Input query is expected to have 3 or 5 dimensions");let f=n.dims[0],h=n.dims[1],y=n.dims.length===3?n.dims[2]:t.numHeads*n.dims[4],_=h,b=0,w=0,S=Math.floor(y/t.numHeads);if(l&&p&&E.size(l.dims)&&E.size(p.dims)){if(l.dims.length!==4)throw new Error('Input "past_key" is expected to have 4 dimensions');if(l.dims[0]!==f||l.dims[1]!==t.numHeads||l.dims[3]!==S)throw new Error('Input "past_key" shape (batch_size, num_heads, past_sequence_length, head_size)');if(p.dims[0]!==f||p.dims[1]!==t.numHeads||p.dims[3]!==S)throw new Error('Input "past_value" shape (batch_size, num_heads, past_sequence_length, head_size)');if(l.dims[2]!==p.dims[2])throw new Error('Input "past_key" and "past_value" shall have same dim 2 (past_sequence_length)');if(p.dims.length!==4)throw new Error('Input "past_value" is expected to have 4 dimensions');b=l.dims[2],w=l.dims[2]}else if(l&&E.size(l.dims)||p&&E.size(p.dims))throw new Error('Input "past_key" and "past_value" shall be both present or both absent');let $;if(r&&E.size(r.dims)>0){if(n.dims.length!==3)throw new Error('Input "query" is expected to have 3 dimensions when key is given');if(r.dims.length<3||r.dims.length>5)throw new Error('Input "key" is expected to have 3, 4, or 5 dimensions');if(n.dims[0]!==r.dims[0])throw new Error('Input "query" and "key" shall have same dim 0 (batch size)');if(r.dims.length===3){if(r.dims[2]!==n.dims[2])throw new Error('Input "query" and "key" shall have same dim 2 (hidden_size)');$=2,_=r.dims[1]}else if(r.dims.length===5){if(r.dims[2]!==t.numHeads||r.dims[3]!==2||r.dims[4]!==S)throw new Error('Expect "key" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');if(o)throw new Error('Expect "value" be none when "key" has packed kv format.');$=5,_=r.dims[1]}else{if(r.dims[1]!==t.numHeads||r.dims[3]!==S)throw new Error('Expect "key" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');$=0,_=r.dims[2]}}else{if(n.dims.length!==5)throw new Error('Input "query" is expected to have 5 dimensions when key is empty');if(n.dims[2]!==t.numHeads||n.dims[3]!==3)throw new Error('Expect "query" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');$=3}if(a&&E.size(a.dims)>0){if(a.dims.length!==1)throw new Error('Input "bias" is expected to have 1 dimension');if(r&&r.dims.length===5&&r.dims[3]===2)throw new Error("bias is not allowed for packed kv.")}let v=b+_,T=0;if(s&&E.size(s.dims)>0){T=8;let O=s.dims;throw O.length===1?O[0]===f?T=1:O[0]===3*f+2&&(T=3):O.length===2&&O[0]===f&&O[1]===v&&(T=5),T===8?new Error('Input "key_padding_mask" shape shall be (batch_size) or (batch_size, total_sequence_length)'):new Error("Mask not supported")}let C=!1,A=y;if(o&&E.size(o.dims)>0){if(o.dims.length!==3&&o.dims.length!==4)throw new Error('Input "value" is expected to have 3 or 4 dimensions');if(n.dims[0]!==o.dims[0])throw new Error('Input "query" and "value" shall have same dim 0 (batch_size)');if(o.dims.length===3){if(_!==o.dims[1])throw new Error('Input "key" and "value" shall have the same dim 1 (kv_sequence_length)');A=o.dims[2]}else{if(_!==o.dims[2])throw new Error('Input "key" and "value" shall have the same dim 2 (kv_sequence_length)');A=o.dims[1]*o.dims[3],C=!0}}let k=!1;if(s&&E.size(s.dims)>0)throw new Error("Key padding mask is not supported");if(d&&E.size(d.dims)>0){if(d.dims.length!==4)throw new Error('Input "attention_bias" is expected to have 4 dimensions');if(d.dims[0]!==f||d.dims[1]!==t.numHeads||d.dims[2]!==h||d.dims[3]!==v)throw new Error('Expect "attention_bias" shape (batch_size, num_heads, sequence_length, total_sequence_length)')}return{batchSize:f,sequenceLength:h,pastSequenceLength:b,kvSequenceLength:_,totalSequenceLength:v,maxSequenceLength:w,inputHiddenSize:0,hiddenSize:y,vHiddenSize:A,headSize:S,vHeadSize:Math.floor(A/t.numHeads),numHeads:t.numHeads,isUnidirectional:!1,pastPresentShareBuffer:!1,maskFilterValue:t.maskFilterValue,maskType:T,scale:t.scale,broadcastResPosBias:k,passPastInKv:C,qkvFormat:$}},Al=e=>re({...e}),Il=re({perm:[0,2,1,3]}),Wg=(e,t,n,r,o,a,s)=>{let d=[r,o,a],l=E.size(d),p=[{type:12,data:l},{type:12,data:s},{type:12,data:a}],f=h=>{let y=N("qkv_with_bias",t.dataType,d),_=P("qkv",t.dataType,d),b=P("bias",n.dataType,d),w=[{name:"output_size",type:"u32"},{name:"bias_offset",type:"u32"},{name:"hidden_size",type:"u32"}];return` + ${h.registerUniforms(w).declareVariables(_,b,y)} + ${h.mainStart()} + ${h.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let bias_offset_idx = (global_idx % uniforms.hidden_size) + uniforms.bias_offset; + + qkv_with_bias[global_idx] = qkv[global_idx] + bias[bias_offset_idx]; + }`};return e.compute({name:"MultiHeadAttentionAddBias",shaderCache:{inputDependencies:["type","type"]},getRunData:()=>({outputs:[{dims:d,dataType:t.dataType,gpuDataType:0}],dispatchGroup:{x:Math.ceil(l/64)},programUniforms:p}),getShaderSource:f},{inputs:[t,n],outputs:[-1]})[0]},or=(e,t,n,r,o,a,s,d)=>{let l=a;if(s&&E.size(s.dims)>0){if(r===1)throw new Error("AddBiasReshape is not implemented. Please export your model with packed QKV or KV");return l=Wg(e,a,s,t,r,n*o,d),l=l.reshape([t,r,n,o]),n===1||r===1?l:e.compute(Oe(l,Il.perm),{inputs:[l],outputs:[-1]})[0]}else return a.dims.length===3&&(l=a.reshape([t,r,n,o])),n===1||r===1?l:e.compute(Oe(l,Il.perm),{inputs:[l],outputs:[-1]})[0]},kl=(e,t)=>{let n=Vg(e.inputs,t),r=e.inputs[0],o=Me(e.inputs,1),a=Me(e.inputs,2),s=Me(e.inputs,3),d=Me(e.inputs,4),l=Me(e.inputs,5),p=Me(e.inputs,6),f=Me(e.inputs,7);if(r.dims.length===5)throw new Error("Packed QKV is not implemented");if(o?.dims.length===5)throw new Error("Packed KV is not implemented");let h=o&&a&&o.dims.length===4&&a.dims.length===4,y=or(e,n.batchSize,n.numHeads,n.sequenceLength,n.headSize,r,s,0);if(h)return Ut(e,y,o,a,d,void 0,p,f,l,n);if(!o||!a)throw new Error("key and value must be provided");let _=or(e,n.batchSize,n.numHeads,n.kvSequenceLength,n.headSize,o,s,n.hiddenSize),b=or(e,n.batchSize,n.numHeads,n.kvSequenceLength,n.vHeadSize,a,s,2*n.hiddenSize);Ut(e,y,_,b,d,void 0,p,f,l,n)}});var Lg,Gg,Hg,Fg,To,El,Pl,Co=G(()=>{"use strict";te();ae();Ce();ce();Lg=e=>{if(!e||e.length<1)throw new Error("too few inputs")},Gg=(e,t)=>{let n=[],r=t.numOutputs;return e[1].dims[0]>0&&(e[1].getBigInt64Array().forEach(o=>n.push(Number(o))),r=n.length),re({numOutputs:r,axis:t.axis,splitSizes:n})},Hg=e=>` +fn calculateOutputIndex(index: u32) -> u32 { + for (var i: u32 = 0u; i < ${e}u; i += 1u ) { + if (index < ${K("uniforms.size_in_split_axis","i",e)}) { + return i; + } + } + return ${e}u; +}`,Fg=e=>{let t=e.length,n=[];for(let r=0;r{let n=e[0].dims,r=E.size(n),o=e[0].dataType,a=E.normalizeAxis(t.axis,n.length),s=new Array(t.numOutputs),d=P("input",o,n.length),l=new Array(t.numOutputs),p=[],f=[],h=0,y=[{type:12,data:r}];for(let b=0;b` + ${b.registerUniform("input_size","u32").registerUniform("size_in_split_axis","u32",l.length).declareVariables(d,...s)} + ${Hg(l.length)} + ${Fg(s)} + + ${b.mainStart()} + ${b.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.input_size")} + + var indices = ${d.offsetToIndices("global_idx")}; + var index = ${d.indicesGet("indices",a)}; + let output_number = calculateOutputIndex(index); + if (output_number != 0) { + index -= ${K("uniforms.size_in_split_axis","output_number - 1u",l.length)}; + ${d.indicesSet("indices",a,"index")}; + } + writeBufferData(output_number, indices, global_idx); + }`;return{name:"Split",shaderCache:{hint:t.cacheKey,inputDependencies:["rank"]},getShaderSource:_,getRunData:()=>({outputs:p,dispatchGroup:{x:Math.ceil(r/64)},programUniforms:y})}},El=(e,t)=>{Lg(e.inputs);let n=e.inputs.length===1?t:Gg(e.inputs,t);e.compute(To(e.inputs,n),{inputs:[0]})},Pl=e=>{let t=e.axis,n=e.splitSizes,r=e.numOutputs<0?n.length:e.numOutputs;if(r!==n.length)throw new Error("numOutputs and splitSizes lengh must be equal");return re({axis:t,numOutputs:r,splitSizes:n})}});var qg,Kg,zl,Ol,Dl=G(()=>{"use strict";Ce();qr();So();Co();ct();qg=(e,t)=>{if(t.doRotary)throw new Error("GroupQuerryAttention do_rotary attribute is not supported");if(t.doRotary&&e.length<=7)throw new Error("cos_cache and sin_cache inputs are required if do_rotary is specified");let n=e[0],r=e[1],o=e[2],a=e[3],s=e[4];if(t.localWindowSize!==-1)throw new Error("Local attention is not supported");if(t.softcap!==0)throw new Error("Softcap is not supported");if(t.rotaryInterleaved!==0)throw new Error("Rotary interleaved is not supported");if(t.smoothSoftmax)throw new Error("Smooth softmax is not supported");if(n.dims.length!==3&&n.dims.length!==5)throw new Error("Input query is expected to have 3 or 5 dimensions");let d=!1,l=n.dims[0],p=n.dims[1],f=n.dims.length===3?d?n.dims[2]/3:n.dims[2]:t.numHeads*n.dims[4],h=p,y=0,_=!r||r.dims.length===0,b=Math.floor(_?f/(t.numHeads+2*t.kvNumHeads):f/t.numHeads);_&&(f=b*t.numHeads);let w=a&&a.dims.length!==0,S=s&&s.dims.length!==0;if(w&&a.dims.length===4&&a.dims[0]===l&&a.dims[1]!==t.kvNumHeads&&a.dims[2]===t.kvNumHeads&&a.dims[3]===b)throw new Error("BSNH pastKey/pastValue is not supported");if(w&&S){if(a.dims.length!==4)throw new Error('Input "past_key" is expected to have 4 dimensions');if(s.dims.length!==4)throw new Error('Input "past_value" is expected to have 4 dimensions');y=a.dims[2]}else if(w||S)throw new Error('Input "past_key" and "past_value" shall be both present or both absent');let v=1;if(r&&r.dims.length>0){if(n.dims.length!==3)throw new Error('Input "query" is expected to have 3 dimensions when key is given');if(r.dims.length<3||r.dims.length>5)throw new Error('Input "key" is expected to have 3, 4, or 5 dimensions');if(n.dims[0]!==r.dims[0])throw new Error('Input "query" and "key" shall have same dim 0 (batch size)');if(r.dims.length===3){if(n.dims[2]%r.dims[2]!==0)throw new Error('Dimension 2 of "query" should be a multiple of "key"');h=r.dims[1]}else if(r.dims.length===5){if(r.dims[2]!==t.numHeads||r.dims[3]!==2||r.dims[4]!==b)throw new Error('Expect "key" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');if(o)throw new Error('Expect "value" be none when "key" has packed kv format.');h=r.dims[1]}else{if(r.dims[1]!==t.numHeads||r.dims[3]!==b)throw new Error('Expect "key" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');h=r.dims[2]}}else{if(n.dims.length!==3&&n.dims.length!==5)throw new Error('Input "query" is expected to have 3 or 5 dimensions when key is empty');if(n.dims.length===5&&(n.dims[2]!==t.numHeads||n.dims[3]!==3))throw new Error('Expect "query" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');v=3}let T=0,C=!1,A=t.kvNumHeads?b*t.kvNumHeads:f;if(o&&o.dims.length>0){if(o.dims.length!==3&&o.dims.length!==4)throw new Error('Input "value" is expected to have 3 or 4 dimensions');if(n.dims[0]!==o.dims[0])throw new Error('Input "query" and "value" shall have same dim 0 (batch_size)');if(o.dims.length===3){if(h!==o.dims[1])throw new Error('Input "key" and "value" shall have the same dim 1 (kv_sequence_length)');A=o.dims[2]}else{if(h!==o.dims[2])throw new Error('Input "past_key" and "past_value" shall have the same dim 2 (kv_sequence_length)');A=o.dims[1]*o.dims[3],C=!0}}let k=e.length>4?e[5]:void 0;if(k&&k.dims.length!==1&&k.dims[0]!==l)throw new Error('Input "seqlens" is expected to have 1 dimension and the same dim 0 as batch_size');return{batchSize:l,sequenceLength:p,pastSequenceLength:y,kvSequenceLength:h,totalSequenceLength:-1,maxSequenceLength:-1,inputHiddenSize:0,hiddenSize:f,vHiddenSize:A,headSize:b,vHeadSize:Math.floor(A/t.kvNumHeads),numHeads:t.numHeads,kvNumHeads:t.kvNumHeads,nReps:t.numHeads/t.kvNumHeads,pastPresentShareBuffer:!1,maskType:T,scale:t.scale,broadcastResPosBias:!1,passPastInKv:C,qkvFormat:v}},Kg=re({perm:[0,2,1,3]}),zl=(e,t,n)=>{let r=t,o=n.kvNumHeads;return t.dims.length===3&&n.kvSequenceLength!==0&&(r=t.reshape([n.batchSize,n.kvSequenceLength,o,n.headSize]),r=e.compute(Oe(r,Kg.perm),{inputs:[r],outputs:[-1]})[0]),r},Ol=(e,t)=>{let n=qg(e.inputs,t);if(e.inputs[0].dims.length===5)throw new Error("Packed QKV is not implemented");if(e.inputs[1]?.dims.length===5)throw new Error("Packed KV is not implemented");let r=e.inputs[0],o=e.inputs[1]&&e.inputs[1].dims.length>0?e.inputs[1]:void 0,a=e.inputs[2]&&e.inputs[2].dims.length>0?e.inputs[2]:void 0,s=e.inputs[3]&&e.inputs[3].dims.length!==0?e.inputs[3]:void 0,d=e.inputs[4]&&e.inputs[4].dims.length!==0?e.inputs[4]:void 0,l=e.inputs.length>4?e.inputs[5]:void 0,p=e.inputs.length>5?e.inputs[6]:void 0,f=n.kvNumHeads?n.kvNumHeads:n.numHeads,h=re({axis:2,numOutputs:3,splitSizes:[n.numHeads*n.headSize,f*n.headSize,f*n.headSize]}),[y,_,b]=!o&&!a?e.compute(To([r],h),{inputs:[r],outputs:[-1,-1,-1]}):[r,o,a],w=or(e,n.batchSize,n.numHeads,n.sequenceLength,n.headSize,y,void 0,0);Ut(e,w,zl(e,_,n),zl(e,b,n),void 0,void 0,s,d,void 0,n,l,p)}});var Bl,jg,Zg,Ml,Rl=G(()=>{"use strict";te();ae();ct();ce();Bl=(e,t,n,r,o,a,s,d)=>{let l=ge(a),p=l===1?"f32":`vec${l}f`,f=l===1?"vec2f":`mat2x${l}f`,h=o*s,y=64;h===1&&(y=256);let _=[o,s,a/l],b=[o,s,2],w=["rank","type","type"],S=[];S.push(...H(_,b));let $=v=>{let T=P("x",t.dataType,3,l),C=P("scale",n.dataType,n.dims),A=P("bias",r.dataType,r.dims),k=N("output",1,3,2),O=[T,C,A,k];return` + var workgroup_shared : array<${f}, ${y}>; + const workgroup_size = ${y}u; + ${v.declareVariables(...O)} + ${v.mainStart(y)} + let batch = workgroup_index / uniforms.x_shape[1]; + let channel = workgroup_index % uniforms.x_shape[1]; + let hight = uniforms.x_shape[2]; + // initialize workgroup memory + var sum = ${p}(0); + var squared_sum = ${p}(0); + for (var h = local_idx; h < hight; h += workgroup_size) { + let value = ${p}(${T.get("batch","channel","h")}); + sum += value; + squared_sum += value * value; + } + workgroup_shared[local_idx] = ${f}(sum, squared_sum); + workgroupBarrier(); + + for (var currSize = workgroup_size >> 1; currSize > 0; currSize = currSize >> 1) { + if (local_idx < currSize) { + workgroup_shared[local_idx] = workgroup_shared[local_idx] + workgroup_shared[local_idx + currSize]; + } + workgroupBarrier(); + } + if (local_idx == 0) { + let sum_final = ${Ke("workgroup_shared[0][0]",l)} / f32(hight * ${l}); + let squared_sum_final = ${Ke("workgroup_shared[0][1]",l)} / f32(hight * ${l}); + + let inv_std_dev = inverseSqrt(squared_sum_final - sum_final * sum_final + f32(${d})); + let channel_scale = inv_std_dev * f32(scale[channel]); + let channel_shift = f32(bias[channel]) - sum_final * channel_scale; + output[workgroup_index] = vec2f(channel_scale, channel_shift); + } + }`};return e.compute({name:"InstanceNormComputeChannelScaleShift",shaderCache:{hint:`${l};${d};${y}`,inputDependencies:w},getRunData:()=>({outputs:[{dims:b,dataType:1}],dispatchGroup:{x:h},programUniforms:S}),getShaderSource:$},{inputs:[t,n,r],outputs:[-1]})[0]},jg=(e,t,n)=>{let r=t[0].dims,o=r,a=2,s=r[0],d=r[1],l=E.sizeFromDimension(r,a),p=ge(l),f=E.size(o)/p,h=Bl(e,t[0],t[1],t[2],s,l,d,n.epsilon),y=[s,d,l/p],_=[s,d],b=["type","none"],w=S=>{let $=P("x",t[0].dataType,y.length,p),v=P("scale_shift",1,_.length,2),T=N("output",t[0].dataType,y.length,p),C=[$,v,T];return` + ${S.registerUniform("output_size","u32").declareVariables(...C)} + ${S.mainStart()} + ${S.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let outputIndices = ${T.offsetToIndices("global_idx")}; + let batch = outputIndices[0]; + let channel = outputIndices[1]; + let scale_shift = ${v.getByIndices("vec2(batch, channel)")}; + let value = ${$.getByOffset("global_idx")} * ${T.type.value}(scale_shift.x) + ${T.type.value}(scale_shift.y); + ${T.setByOffset("global_idx","value")}; + }`};e.compute({name:"InstanceNormalization",shaderCache:{hint:`${p}`,inputDependencies:b},getRunData:()=>({outputs:[{dims:o,dataType:t[0].dataType}],dispatchGroup:{x:Math.ceil(f/64)},programUniforms:[{type:12,data:f},...H(y,_,y)]}),getShaderSource:w},{inputs:[t[0],h]})},Zg=(e,t,n)=>{let r=t[0].dims,o=r,a=r[0],s=r[r.length-1],d=E.sizeFromDimension(r,1)/s,l=ge(s),p=E.size(o)/l,f=[{type:12,data:d},{type:12,data:Math.floor(s/l)}],h=["type","type"],y=!1,_=[0,r.length-1];for(let $=0;$r[_[v]])),w=Bl(e,b,t[1],t[2],a,d,s,n.epsilon),S=$=>{let v=_e(t[0].dataType),T=l===1?"vec2f":`mat${l}x2f`,C=O=>{let M=O===0?"x":"y",V=l===1?"f32":`vec${l}f`;switch(l){case 1:return`${v}(${V}(scale.${M}))`;case 2:return`vec2<${v}>(${V}(scale[0].${M}, scale[1].${M}))`;case 4:return`vec4<${v}>(${V}(scale[0].${M}, scale[1].${M}, scale[2].${M}, scale[3].${M}))`;default:throw new Error(`Not supported compoents ${l}`)}},A=P("input",t[0].dataType,t[0].dims,l),k=N("output",t[0].dataType,o,l);return` + @group(0) @binding(0) var input : array<${A.type.storage}>; + @group(0) @binding(1) var scale_input : array<${T}>; + @group(0) @binding(2) var output : array<${k.type.storage}>; + struct Uniforms {H: u32, C : u32}; + @group(0) @binding(3) var uniforms: Uniforms; + + ${$.mainStart()} + let current_image_number = global_idx / (uniforms.C * uniforms.H); + let current_channel_number = global_idx % uniforms.C; + + let scale_offset = current_image_number * uniforms.C + current_channel_number; + let scale = scale_input[scale_offset]; + output[global_idx] = fma(input[global_idx], ${C(0)}, ${C(1)}); + }`};e.compute({name:"InstanceNormalizationNHWC",shaderCache:{hint:`${l}`,inputDependencies:h},getRunData:()=>({outputs:[{dims:o,dataType:t[0].dataType}],dispatchGroup:{x:Math.ceil(p/64)},programUniforms:f}),getShaderSource:S},{inputs:[t[0],w]})},Ml=(e,t)=>{t.format==="NHWC"?Zg(e,e.inputs,t):jg(e,e.inputs,t)}});var Qg,Yg,Ul,Nl=G(()=>{"use strict";te();ae();ce();Qg=e=>{if(!e||e.length<2)throw new Error("layerNorm requires at least 2 inputs.")},Yg=(e,t,n)=>{let r=t.simplified,o=e[0].dims,a=e[1],s=!r&&e[2],d=o,l=E.normalizeAxis(t.axis,o.length),p=E.sizeToDimension(o,l),f=E.sizeFromDimension(o,l),h=E.size(a.dims),y=s?E.size(s.dims):0;if(h!==f||s&&y!==f)throw new Error(`Size of X.shape()[axis:] == ${f}. + Size of scale and bias (if provided) must match this. + Got scale size of ${h} and bias size of ${y}`);let _=[];for(let A=0;A1,v=n>2,T=A=>{let k=_e(e[0].dataType),O=[P("x",e[0].dataType,e[0].dims,b),P("scale",a.dataType,a.dims,b)];s&&O.push(P("bias",s.dataType,s.dims,b)),O.push(N("output",e[0].dataType,d,b)),$&&O.push(N("mean_data_output",1,_)),v&&O.push(N("inv_std_output",1,_));let M=[{name:"norm_count",type:"u32"},{name:"norm_size",type:"f32"},{name:"norm_size_vectorized",type:"u32"},{name:"epsilon",type:"f32"}];return` + ${A.registerUniforms(M).declareVariables(...O)} + ${A.mainStart()} + ${A.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.norm_count")} + let offset = global_idx * uniforms.norm_size_vectorized; + var mean_vector = ${uo("f32",b)}; + var mean_square_vector = ${uo("f32",b)}; + + for (var h: u32 = 0u; h < uniforms.norm_size_vectorized; h++) { + let value = ${Pt(k,b,"x[h + offset]")}; + mean_vector += value; + mean_square_vector += value * value; + } + let mean = ${Ke("mean_vector",b)} / uniforms.norm_size; + let inv_std_dev = inverseSqrt(${Ke("mean_square_vector",b)} / uniforms.norm_size ${r?"":"- mean * mean"} + uniforms.epsilon); + + for (var j: u32 = 0; j < uniforms.norm_size_vectorized; j++) { + let f32input = ${Pt(k,b,"x[j + offset]")}; + let f32scale = ${Pt(k,b,"scale[j]")}; + output[j + offset] = ${O[0].type.value}((f32input ${r?"":"- mean"}) * inv_std_dev * f32scale + ${s?`+ ${Pt(k,b,"bias[j]")}`:""} + ); + } + + ${$?"mean_data_output[global_idx] = mean":""}; + ${v?"inv_std_output[global_idx] = inv_std_dev":""}; + }`},C=[{dims:d,dataType:e[0].dataType}];return $&&C.push({dims:_,dataType:1}),v&&C.push({dims:_,dataType:1}),{name:"LayerNormalization",shaderCache:{hint:`${b};${n};${r}`,inputDependencies:w},getRunData:()=>({outputs:C,dispatchGroup:{x:Math.ceil(p/64)},programUniforms:S}),getShaderSource:T}},Ul=(e,t)=>{Qg(e.inputs),e.compute(Yg(e.inputs,t,e.outputCount))}});var Xg,Vl,Wl=G(()=>{"use strict";ae();Xr();Jr();Xg=e=>{if(!e||e.length!==2)throw new Error("MatMul requires 2 inputs.");if(e[0].dims[e[0].dims.length-1]!==e[1].dims[e[1].dims.length-2])throw new Error("shared dimension does not match.")},Vl=e=>{Xg(e.inputs);let t=rt.calcShape(e.inputs[0].dims,e.inputs[1].dims,!0);if(!t)throw new Error("Can't use matmul on the given tensors");let n=t[t.length-1],r=e.inputs[0].dims[e.inputs[0].dims.length-1];if(n<8&&r<8)e.compute(Yr(e.inputs,{activation:""},t));else{let o=t[t.length-2],a=E.size(e.inputs[0].dims.slice(0,-2)),s=E.size(e.inputs[1].dims.slice(0,-2));if(a!==1&&o===1&&s===1){let d=e.inputs[0].reshape([1,a,r]),l=e.inputs[1].reshape([1,r,n]),p=[1,a,n],f=[d,l];e.compute(nr(f,{activation:""},t,p),{inputs:f})}else e.compute(nr(e.inputs,{activation:""},t))}}});var Jg,ey,ty,Ll,Gl,Hl=G(()=>{"use strict";te();ae();Ce();ce();Jg=(e,t)=>{if(e.length<3||e.length>4)throw new Error("MatMulNBits requires 3 or 4 inputs");let n=e[0],r=n.dims.length;if(n.dims[r-1]!==t.k)throw new Error("The last dim of input shape does not match the k value");let o=Math.floor((t.k+t.blockSize-1)/t.blockSize),a=t.blockSize/8*t.bits,s=e[1];if(!E.areEqual(s.dims,[t.n,o,a]))throw new Error("The second inputs must be 3D tensor with shape N X nBlocksPerCol X blobSize");let l=e[2].dims;if(E.size(l)!==t.n*o)throw new Error("scales input size error.");if(e.length===4){let f=e[3].dims,h=t.bits>4?t.n*o:t.n*Math.floor((o+1)/2);if(E.size(f)!==h)throw new Error("zeroPoints input size error.")}},ey=(e,t)=>{let n=e[0].dims,r=n.length,o=n[r-2],a=t.k,s=t.n,d=n.slice(0,r-2),l=E.size(d),f=e[1].dims[2]/4,h=e[0].dataType,y=ge(t.k),_=ge(f),b=ge(s),w=d.concat([o,s]),S=o>1&&s/b%2===0?2:1,$=E.size(w)/b/S,v=64,T=[],C=[l,o,a/y],A=E.convertShape(e[1].dims).slice();A.splice(-1,1,f/_),T.push(...H(C)),T.push(...H(A)),T.push(...H(e[2].dims)),e.length===4&&T.push(...H(E.convertShape(e[3].dims)));let k=[l,o,s/b];T.push(...H(k));let O=M=>{let V=C.length,F=P("a",e[0].dataType,V,y),j=P("b",12,A.length,_),ne=P("scales",e[2].dataType,e[2].dims.length),W=[F,j,ne],J=e.length===4?P("zero_points",12,e[3].dims.length):void 0;J&&W.push(J);let ve=k.length,Q=N("output",e[0].dataType,ve,b),ee=_e(e[0].dataType),le=(()=>{switch(y){case 1:return`array<${ee}, 8>`;case 2:return`mat4x2<${ee}>`;case 4:return`mat2x4<${ee}>`;default:throw new Error(`${y}-component is not supported.`)}})(),Z=()=>{let Se=` + // reuse a data + var input_offset = ${F.indicesToOffset(`${F.type.indices}(batch, row, word_offset)`)}; + var a_data: ${le}; + for (var j: u32 = 0; j < ${8/y}; j++) { + a_data[j] = ${F.getByOffset("input_offset")}; + input_offset++; + } + `;for(let D=0;D> 4) & b_mask); + b_quantized_values = ${le}(${Array.from({length:4},(R,Y)=>`${ee}(b_value_lower[${Y}]), ${ee}(b_value_upper[${Y}])`).join(", ")}); + b_dequantized_values = ${y===1?`${le}(${Array.from({length:8},(R,Y)=>`(b_quantized_values[${Y}] - ${J?`zero_point${D}`:"zero_point"}) * scale${D}`).join(", ")});`:`(b_quantized_values - ${le}(${Array(8).fill(`${J?`zero_point${D}`:"zero_point"}`).join(",")})) * scale${D};`}; + workgroup_shared[local_id.x * ${S} + ${Math.floor(D/b)}]${b>1?`[${D%b}]`:""} += ${Array.from({length:8/y},(R,Y)=>`${y===1?`a_data[${Y}] * b_dequantized_values[${Y}]`:`dot(a_data[${Y}], b_dequantized_values[${Y}])`}`).join(" + ")}; + `;return Se},pe=()=>{let Se=` + var col_index = col * ${b}; + ${J?` + let zero_point_bytes_per_col = (nBlocksPerCol + 1) / 2; + var zero_point_byte_count: u32; + var zero_point_word_index: u32; + var zero_point_byte_offset: u32; + let zero_point_nibble_offset: u32 = block & 0x1u; + var zero_point_bits_offset: u32; + var zero_point_word: u32;`:` + // The default zero point is 8 for unsigned 4-bit quantization. + let zero_point = ${ee}(8);`} + `;for(let D=0;D> 0x1u); + zero_point_word_index = zero_point_byte_count >> 0x2u; + zero_point_byte_offset = zero_point_byte_count & 0x3u; + zero_point_bits_offset = (zero_point_byte_offset << 3) + (zero_point_nibble_offset << 2); + zero_point_word = ${J.getByOffset("zero_point_word_index")} >> zero_point_bits_offset; + let zero_point${D} = ${ee}((zero_point_word) & 0xFu);`:""} + col_index += 1;`;return Se},ke=()=>{let Se=`col_index = col * ${b};`;for(let D=0;D; + var b_value_upper: vec4; + var b_quantized_values: ${le}; + var b_dequantized_values: ${le};`,Se};return` + var workgroup_shared: array<${Q.type.value}, ${S*v}>; + ${M.declareVariables(...W,Q)} + ${M.mainStart([v,1,1])} + let output_indices = ${Q.offsetToIndices(`(global_idx / ${v}) * ${S}`)}; + let col = output_indices[2]; + let row = output_indices[1]; + let batch = output_indices[0]; + let nBlocksPerCol = uniforms.b_shape[1]; + + for (var block = local_id.x; block < nBlocksPerCol; block += ${v}) { + //process one block + var word_offset: u32 = block * ${t.blockSize/y}; + ${pe()} + for (var word: u32 = 0; word < ${f}; word += ${_}) { + ${ke()} + for (var i: u32 = 0; i < ${_}; i++) { + ${Z()} + word_offset += ${8/y}; + } + } + } + workgroupBarrier(); + + if (local_id.x < ${S}) { + var output_value: ${Q.type.value} = ${Q.type.value}(0); + var workgroup_shared_offset: u32 = local_id.x; + for (var b: u32 = 0u; b < ${v}u; b++) { + output_value += workgroup_shared[workgroup_shared_offset]; + workgroup_shared_offset += ${S}; + } + ${Q.setByIndices(`${Q.type.indices}(batch, row, col + local_id.x)`,"output_value")}; + } + }`};return{name:"MatMulNBits",shaderCache:{hint:`${t.blockSize};${t.bits};${y};${_};${b};${S};${v}`,inputDependencies:Array(e.length).fill("rank")},getRunData:()=>({outputs:[{dims:w,dataType:h}],dispatchGroup:{x:$},programUniforms:T}),getShaderSource:O}},ty=(e,t)=>{let n=e[0].dims,r=n.length,o=n[r-2],a=t.k,s=t.n,d=n.slice(0,r-2),l=E.size(d),f=e[1].dims[2]/4,h=e[0].dataType,y=ge(t.k),_=ge(f),b=d.concat([o,s]),w=128,S=s%8===0?8:s%4===0?4:1,$=w/S,v=$*_*8,T=v/y,C=v/t.blockSize,A=E.size(b)/S,k=[],O=[l,o,a/y],M=E.convertShape(e[1].dims).slice();M.splice(-1,1,f/_),k.push(...H(O)),k.push(...H(M)),k.push(...H(e[2].dims)),e.length===4&&k.push(...H(E.convertShape(e[3].dims)));let V=[l,o,s];k.push(...H(V));let F=j=>{let ne=O.length,W=P("a",e[0].dataType,ne,y),J=P("b",12,M.length,_),ve=P("scales",e[2].dataType,e[2].dims.length),Q=[W,J,ve],ee=e.length===4?P("zero_points",12,e[3].dims.length):void 0;ee&&Q.push(ee);let le=V.length,Z=N("output",e[0].dataType,le),pe=_e(e[0].dataType),ke=()=>{switch(y){case 1:return` + let a_data0 = vec4<${pe}>(sub_a[word_offset], sub_a[word_offset + 1], sub_a[word_offset + 2], sub_a[word_offset + 3]); + let a_data1 = vec4<${pe}>(sub_a[word_offset + 4], sub_a[word_offset + 5], sub_a[word_offset + 6], sub_a[word_offset + 7]);`;case 2:return` + let a_data0 = vec4<${pe}>(sub_a[word_offset], sub_a[word_offset + 1]); + let a_data1 = vec4<${pe}>(sub_a[word_offset + 2], sub_a[word_offset + 3]);`;case 4:return` + let a_data0 = sub_a[word_offset]; + let a_data1 = sub_a[word_offset + 1];`;default:throw new Error(`${y}-component is not supported.`)}};return` + var sub_a: array<${W.type.value}, ${T}>; + var inter_results: array, ${S}>; + ${j.declareVariables(...Q,Z)} + ${j.mainStart([$,S,1])} + let output_indices = ${Z.offsetToIndices(`workgroup_index * ${S}`)}; + let col = output_indices[2]; + let row = output_indices[1]; + let batch = output_indices[0]; + let n_blocks_per_col = uniforms.b_shape[1]; + let num_tiles = (n_blocks_per_col - 1) / ${C} + 1; + + // Loop over shared dimension. + for (var tile: u32 = 0; tile < num_tiles; tile += 1) { + let a_col_start = tile * ${T}; + // load one tile A data into shared memory. + for (var a_offset = local_idx; a_offset < ${T}; a_offset += ${w}) + { + let a_col = a_col_start + a_offset; + if (a_col < uniforms.a_shape[2]) + { + sub_a[a_offset] = ${W.getByIndices(`${W.type.indices}(batch, row, a_col)`)}; + } else { + sub_a[a_offset] = ${W.type.value}(0); + } + } + workgroupBarrier(); + + // each thread process one block + let b_row = col + local_id.y; + let block = tile * ${C} + local_id.x; + ${ee?` + let zero_point_bytes_per_col = (n_blocks_per_col + 1) / 2; + let zero_point_byte_count = b_row * zero_point_bytes_per_col + (block >> 0x1u); + let zero_point_word_index = zero_point_byte_count >> 0x2u; + let zero_point_byte_offset = zero_point_byte_count & 0x3u; + let zero_point_nibble_offset: u32 = block & 0x1u; + let zero_point_bits_offset = (zero_point_byte_offset << 3) + (zero_point_nibble_offset << 2); + let zero_point_word = ${ee.getByOffset("zero_point_word_index")} >> zero_point_bits_offset; + let zero_point = ${pe}((zero_point_word) & 0xFu);`:` + // The default zero point is 8 for unsigned 4-bit quantization. + let zero_point = ${pe}(8);`} + let scale = ${ve.getByOffset("b_row * n_blocks_per_col + block")}; + let b_data = ${J.getByIndices(`${J.type.indices}(b_row, block, 0)`)}; + var word_offset = local_id.x * ${t.blockSize/y}; + for (var i: u32 = 0; i < ${_}; i++) { + ${ke()} + let b_value = ${_===1?"b_data":"b_data[i]"}; + let b_value_lower = unpack4xU8(b_value & 0x0F0F0F0Fu); + let b_value_upper = unpack4xU8((b_value >> 4) & 0x0F0F0F0Fu); + let b_quantized_values = mat2x4<${pe}>(${Array.from({length:4},(Se,D)=>`${pe}(b_value_lower[${D}]), ${pe}(b_value_upper[${D}])`).join(", ")}); + let b_dequantized_values = (b_quantized_values - mat2x4<${pe}>(${Array(8).fill("zero_point").join(",")})) * scale; + inter_results[local_id.y][local_id.x] += ${Array.from({length:2},(Se,D)=>`${`dot(a_data${D}, b_dequantized_values[${D}])`}`).join(" + ")}; + word_offset += ${8/y}; + } + workgroupBarrier(); + } + + if (local_idx < ${S}) { + var output_value: ${Z.type.value} = ${Z.type.value}(0); + for (var b = 0u; b < ${$}; b++) { + output_value += inter_results[local_idx][b]; + } + if (col + local_idx < uniforms.output_shape[2]) + { + ${Z.setByIndices(`${Z.type.indices}(batch, row, col + local_idx)`,"output_value")} + } + } + }`};return{name:"BlockwiseMatMulNBits32",shaderCache:{hint:`${t.blockSize};${y};${_};${$};${S}`,inputDependencies:Array(e.length).fill("rank")},getRunData:()=>({outputs:[{dims:b,dataType:h}],dispatchGroup:{x:A},programUniforms:k}),getShaderSource:F}},Ll=(e,t)=>{Jg(e.inputs,t),t.blockSize===32&&e.adapterInfo.isVendor("intel")&&e.adapterInfo.isArchitecture("gen-12lp")?e.compute(ty(e.inputs,t)):e.compute(ey(e.inputs,t))},Gl=e=>re(e)});var ry,ny,oy,iy,ay,sy,uy,dy,Fl,ql=G(()=>{"use strict";te();ae();ce();ry=e=>{if(!e||e.length<1)throw new Error("Too few inputs");if(e[0].dataType!==1&&e[0].dataType!==10)throw new Error("Input type must be float or float16.");if(e.length>=2){let t=e[0].dims.length*2===e[1].dims[0];if(e.length===4&&(t=e[3].dims[0]*2===e[1].dims[0]),!t)throw new Error("The pads should be a 1D tensor of shape [2 * input_rank] or [2 * num_axes].")}},ny=(e,t,n)=>{let r="";for(let o=t-1;o>=0;--o)r+=` + k = i32(${e.indicesGet("indices",o)}) - ${K("uniforms.pads",o,n)}; + if (k < 0) { + break; + } + if (k >= i32(${K("uniforms.x_shape",o,t)})) { + break; + } + offset += k * i32(${K("uniforms.x_strides",o,t)}); + `;return` + value = ${e.type.value}(uniforms.constant_value); + for (var i = 0; i < 1; i++) { + var offset = 0; + var k = 0; + ${r} + value = x[offset]; + } + `},oy=(e,t,n)=>{let r="";for(let o=t-1;o>=0;--o)r+=` + k = i32(${e.indicesGet("indices",o)}) - ${K("uniforms.pads",o,n)}; + if (k < 0) { + k = -k; + } + { + let _2n_1 = 2 * (i32(${K("uniforms.x_shape",o,t)}) - 1); + k = k % _2n_1; + if(k >= i32(${K("uniforms.x_shape",o,t)})) { + k = _2n_1 - k; + } + } + offset += k * i32(${K("uniforms.x_strides",o,t)}); + `;return` + var offset = 0; + var k = 0; + ${r} + value = x[offset]; + `},iy=(e,t,n)=>{let r="";for(let o=t-1;o>=0;--o)r+=` + k = i32(${e.indicesGet("indices",o)}) - ${K("uniforms.pads",o,n)}; + if (k < 0) { + k = 0; + } + if (k >= i32(${K("uniforms.x_shape",o,t)})) { + k = i32(${K("uniforms.x_shape",o,t)}) - 1; + } + offset += k * i32(${K("uniforms.x_strides",o,t)}); + `;return` + var offset = 0; + var k = 0; + ${r} + value = x[offset]; + `},ay=(e,t,n)=>{let r="";for(let o=t-1;o>=0;--o)r+=` + k = i32(${e.indicesGet("indices",o)}) - ${K("uniforms.pads",o,n)}; + if (k < 0) { + k += i32(${K("uniforms.x_shape",o,t)}]); + } + if (k >= i32(${K("uniforms.x_shape",o,t)})) { + k -= i32(${K("uniforms.x_shape",o,t)}); + } + offset += k * i32(${K("uniforms.x_strides",o,t)}); + `;return` + var offset = 0; + var k = 0; + ${r} + value = x[offset]; + `},sy=(e,t,n)=>{switch(n.mode){case 0:return ny(e,t,n.pads.length);case 1:return oy(e,t,n.pads.length);case 2:return iy(e,t,n.pads.length);case 3:return ay(e,t,n.pads.length);default:throw new Error("Invalid mode")}},uy=(e,t)=>{let n=E.padShape(e[0].dims.slice(),t.pads),r=e[0].dims,o=E.size(n),a=[{type:12,data:o},{type:6,data:t.pads}],s=e.length>=3&&e[2].data;t.mode===0&&a.push({type:s?e[2].dataType:1,data:t.value}),a.push(...H(e[0].dims,n));let d=["rank"],l=p=>{let f=N("output",e[0].dataType,n.length),h=P("x",e[0].dataType,r.length),y=h.type.value,_=sy(f,r.length,t),b=[{name:"output_size",type:"u32"},{name:"pads",type:"i32",length:t.pads.length}];return t.mode===0&&b.push({name:"constant_value",type:s?y:"f32"}),` + ${p.registerUniforms(b).declareVariables(h,f)} + ${p.mainStart()} + ${p.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let indices = ${f.offsetToIndices("global_idx")}; + + var value = ${y}(0); + ${_} + output[global_idx] = value; + }`};return{name:"Pad",shaderCache:{hint:`${t.mode}${s}`,inputDependencies:d},getRunData:()=>({outputs:[{dims:n,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(E.size(n)/64)},programUniforms:a}),getShaderSource:l}},dy=(e,t)=>{if(e.length>1){let n=e[1].getBigInt64Array(),r=e.length>=3&&e[2].data?e[2].dataType===10?e[2].getUint16Array()[0]:e[2].getFloat32Array()[0]:0,o=e[0].dims.length,a=new Int32Array(2*o).fill(0);if(e.length>=4){let d=e[3].getBigInt64Array();for(let l=0;la[Number(l)]=Number(d));let s=[];return a.forEach(d=>s.push(d)),{mode:t.mode,value:r,pads:s}}else return t},Fl=(e,t)=>{ry(e.inputs);let n=dy(e.inputs,t);e.compute(uy(e.inputs,n),{inputs:[0]})}});var rn,Kl,jl,Zl,Ql,ly,cy,Yl,Xl,Jl,ec,tc,rc,nc,oc,ic,ac,sc,uc,dc=G(()=>{"use strict";Ge();te();ae();ce();rn=e=>{if(we.webgpu.validateInputContent&&(!e||e.length!==1))throw new Error("Pool ops requires 1 input.")},Kl=(e,t,n)=>{let r=t.format==="NHWC",o=e.dims.slice();r&&o.splice(1,0,o.pop());let a=Object.hasOwnProperty.call(t,"dilations"),s=t.kernelShape.slice(),d=t.strides.slice(),l=a?t.dilations.slice():[],p=t.pads.slice();kt.adjustPoolAttributes(n,o,s,d,l,p);let f=kt.computePoolOutputShape(n,o,d,l,s,p,t.autoPad),h=Object.assign({},t);a?Object.assign(h,{kernelShape:s,strides:d,pads:p,dilations:l,cacheKey:t.cacheKey}):Object.assign(h,{kernelShape:s,strides:d,pads:p,cacheKey:t.cacheKey});let y=f.slice();return y.push(y.splice(1,1)[0]),[h,r?y:f]},jl=(e,t)=>{let n=t.format==="NHWC",r=E.size(e),o=E.size(t.kernelShape),a=[{type:12,data:r},{type:12,data:o}],s=[{name:"outputSize",type:"u32"},{name:"kernelSize",type:"u32"}];if(t.kernelShape.length<=2){let d=t.kernelShape[t.kernelShape.length-1],l=t.strides[t.strides.length-1],p=t.pads[t.pads.length/2-1],f=t.pads[t.pads.length-1],h=!!(p+f);a.push({type:12,data:d},{type:12,data:l},{type:12,data:p},{type:12,data:f}),s.push({name:"kw",type:"u32"},{name:"sw",type:"u32"},{name:"pwStart",type:"u32"},{name:"pwEnd",type:"u32"});let y=!1;if(t.kernelShape.length===2){let _=t.kernelShape[t.kernelShape.length-2],b=t.strides[t.strides.length-2],w=t.pads[t.pads.length/2-2],S=t.pads[t.pads.length-2];y=!!(w+S),a.push({type:12,data:_},{type:12,data:b},{type:12,data:w},{type:12,data:S}),s.push({name:"kh",type:"u32"},{name:"sh",type:"u32"},{name:"phStart",type:"u32"},{name:"phEnd",type:"u32"})}return[a,s,!0,h,y]}else{if(n)throw new Error("Pooling with kernelShape.length > 2 is not supported for NHWC format.");let d=E.computeStrides(t.kernelShape);a.push({type:12,data:d},{type:12,data:t.pads},{type:12,data:t.strides}),s.push({name:"kernelStrides",type:"u32",length:d.length},{name:"pads",type:"u32",length:t.pads.length},{name:"strides",type:"u32",length:t.strides.length});let l=t.pads.reduce((p,f)=>p+f);return[a,s,!!l,!1,!1]}},Zl=(e,t,n,r,o,a,s,d,l,p,f,h)=>{let y=o.format==="NHWC",_=t.type.value,b=N("output",t.type.tensor,r);if(o.kernelShape.length<=2){let w="",S="",$="",v=n-(y?2:1);if(f?w=` + for (var i: u32 = 0u; i < uniforms.kw; i++) { + xIndices[${v}] = indices[${v}] * uniforms.sw - uniforms.pwStart + i; + if (xIndices[${v}] < 0 || xIndices[${v}] + >= uniforms.x_shape[${v}]) { + pad++; + continue; + } + let x_val = x[${t.indicesToOffset("xIndices")}]; + ${a} + }`:w=` + for (var i: u32 = 0u; i < uniforms.kw; i++) { + xIndices[${v}] = indices[${v}] * uniforms.sw - uniforms.pwStart + i; + let x_val = x[${t.indicesToOffset("xIndices")}]; + ${a} + }`,o.kernelShape.length===2){let C=n-(y?3:2);h?S=` + for (var j: u32 = 0u; j < uniforms.kh; j++) { + xIndices[${C}] = indices[${C}] * uniforms.sh - uniforms.phStart + j; + if (xIndices[${C}] < 0 || xIndices[${C}] >= uniforms.x_shape[${C}]) { + pad += i32(uniforms.kw); + continue; + } + `:S=` + for (var j: u32 = 0u; j < uniforms.kh; j++) { + xIndices[${C}] = indices[${C}] * uniforms.sh - uniforms.phStart + j; + `,$=` + } + `}return` + ${e.registerUniforms(l).declareVariables(t,b)} + + ${e.mainStart()} + ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + + let indices = ${b.offsetToIndices("global_idx")}; + var xIndices = ${b.offsetToIndices("global_idx")}; + + var value = ${_}(${d}); + var pad = 0; + ${S} + ${w} + ${$} + ${s} + + output[global_idx] = value; + }`}else{if(y)throw new Error("Pooling with kernelShape.length > 2 is not supported for NHWC format.");let w=o.kernelShape.length,S=o.pads.length,$="";return p?$=` + if (xIndices[j] >= uniforms.x_shape[j]) { + pad++; + isPad = true; + break; + } + } + if (!isPad) { + let x_val = x[${t.indicesToOffset("xIndices")}]; + ${a} + }`:$=` + } + let x_val = x[${t.indicesToOffset("xIndices")}]; + ${a} + `,` + ${e.registerUniforms(l).declareVariables(t,b)} + + ${e.mainStart()} + ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + let indices = ${b.offsetToIndices("global_idx")}; + var xIndices = ${b.offsetToIndices("global_idx")}; + + var offsets: array; + + var value = ${_}(${d}); + var pad = 0; + var isPad = false; + + for (var i: u32 = 0u; i < uniforms.kernelSize; i++) { + var offset = i; + for (var j = 0u; j < ${w-1}u; j++) { + offsets[j] = offset / ${K("uniforms.kernelStrides","j",w)}; + offset -= offsets[j] * ${K("uniforms.kernelStrides","j",w)}; + } + offsets[${w-1}] = offset; + + isPad = false; + for (var j = ${n-w}u; j < ${n}u; j++) { + xIndices[j] = indices[j] * ${K("uniforms.strides",`j - ${n-w}u`,w)} + + offsets[j - ${n-w}u] - ${K("uniforms.pads","j - 2u",S)}; + ${$} + } + ${s} + + output[global_idx] = value; + }`}},Ql=e=>`${e.format};${e.ceilMode};${e.autoPad};${e.kernelShape.length}`,ly=e=>`${Ql(e)};${e.countIncludePad}`,cy=e=>`${Ql(e)};${e.storageOrder};${e.dilations}`,Yl=e=>({format:e.format,autoPad:["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][e.auto_pad],ceilMode:e.ceil_mode,kernelShape:e.kernel_shape,strides:e.strides,pads:e.pads}),Xl=(e,t,n,r)=>{let[o,a]=Kl(t,r,n),s=P("x",t.dataType,t.dims.length),d=s.type.value,l="value += x_val;",p="";o.countIncludePad?p+=`value /= ${d}(uniforms.kernelSize);`:p+=`value /= ${d}(i32(uniforms.kernelSize) - pad);`;let[f,h,y,_,b]=jl(a,o);f.push(...H(t.dims,a));let w=["rank"];return{name:e,shaderCache:{hint:`${r.cacheKey};${y};${_};${b}`,inputDependencies:w},getRunData:()=>({outputs:[{dims:a,dataType:t.dataType}],dispatchGroup:{x:Math.ceil(E.size(a)/64)},programUniforms:f}),getShaderSource:S=>Zl(S,s,t.dims.length,a.length,o,l,p,0,h,y,_,b)}},Jl=e=>{let t=e.count_include_pad!==0,n=Yl(e);if(n.ceilMode!==0)throw new Error("using ceil() in shape computation is not yet supported for AveragePool");let r={countIncludePad:t,...n,cacheKey:""};return{...r,cacheKey:ly(r)}},ec=(e,t)=>{rn(e.inputs),e.compute(Xl("AveragePool",e.inputs[0],!1,t))},tc={autoPad:"",ceilMode:0,countIncludePad:!1,kernelShape:[],strides:[],pads:[],storageOrder:0,dilations:[]},rc=e=>{let t=e.format;return{format:t,...tc,cacheKey:t}},nc=(e,t)=>{rn(e.inputs),e.compute(Xl("GlobalAveragePool",e.inputs[0],!0,t))},oc=(e,t,n,r)=>{let[o,a]=Kl(t,r,n),s=` + value = max(x_val, value); + `,d="",l=P("x",t.dataType,t.dims.length),p=["rank"],[f,h,y,_,b]=jl(a,o);return f.push(...H(t.dims,a)),{name:e,shaderCache:{hint:`${r.cacheKey};${y};${_};${b}`,inputDependencies:p},getRunData:()=>({outputs:[{dims:a,dataType:t.dataType}],dispatchGroup:{x:Math.ceil(E.size(a)/64)},programUniforms:f}),getShaderSource:w=>Zl(w,l,t.dims.length,a.length,o,s,d,t.dataType===10?-65504:-1e5,h,y,_,b)}},ic=(e,t)=>{rn(e.inputs),e.compute(oc("MaxPool",e.inputs[0],!1,t))},ac=e=>{let t=e.storage_order,n=e.dilations,r=Yl(e);if(t!==0)throw new Error("column major storage order is not yet supported for MaxPool");if(r.ceilMode!==0)throw new Error("using ceil() in shape computation is not yet supported for MaxPool");let o={storageOrder:t,dilations:n,...r,cacheKey:""};return{...o,cacheKey:cy(o)}},sc=e=>{let t=e.format;return{format:t,...tc,cacheKey:t}},uc=(e,t)=>{rn(e.inputs),e.compute(oc("GlobalMaxPool",e.inputs[0],!0,t))}});var my,fy,lc,cc,pc=G(()=>{"use strict";te();ae();Ce();ce();my=(e,t)=>{if(e.length<2||e.length>3)throw new Error("DequantizeLinear requires 2 or 3 inputs.");if(e.length===3&&e[1].dims===e[2].dims)throw new Error("x-scale and x-zero-point must have the same shape.");if(e.length===3&&e[0].dataType!==e[2].dataType)throw new Error("x and x-zero-point must have the same data type.");if(e[0].dataType===6&&e.length>2)throw new Error("In the case of dequantizing int32 there is no zero point.");if(e[1].dims.length!==0&&e[1].dims.length!==1&&e[1].dims.length!==e[0].dims.length)throw new Error("scale input must be a scalar, a 1D tensor, or have the same rank as the input tensor.");if(e.length>2){if(e[0].dataType!==e[2].dataType)throw new Error("x and x-zero-point must have the same data type.");if(e[1].dims.length!==e[2].dims.length)throw new Error("scale and zero-point inputs must have the same rank.");if(!e[1].dims.map((n,r)=>n===e[2].dims[r]).reduce((n,r)=>n&&r,!0))throw new Error("scale and zero-point inputs must have the same shape.")}if(t.blockSize>0){if(e[1].dims.length===0||e[1].dims.length===1&&e[1].dims[0]===1)throw new Error("blockSize must be set only for block quantization.");if(!e[1].dims.map((o,a)=>a===t.axis||o===e[0].dims[a]).reduce((o,a)=>o&&a,!0))throw new Error("For block qunatization, scale input shape to match the input shape except for the axis");if(e[1].dims.length!==e[0].dims.length)throw new Error("For block qunatization the scale input rank must be the same as the x rank.");let n=e[0].dims[t.axis],r=e[1].dims[t.axis];if(t.blockSizeMath.ceil(n/(r-1)-1))throw new Error("blockSize must be with in the range [ceil(dI / Si), ceil(dI / (Si - 1) - 1)].")}},fy=(e,t)=>{let n=E.normalizeAxis(t.axis,e[0].dims.length),r=e[0].dataType,o=r===3,a=e[0].dims,s=e[1].dataType,d=E.size(a),l=r===3||r===2,p=l?[Math.ceil(E.size(e[0].dims)/4)]:e[0].dims,f=e[1].dims,h=e.length>2?e[2]:void 0,y=h?l?[Math.ceil(E.size(h.dims)/4)]:h.dims:void 0,_=f.length===0||f.length===1&&f[0]===1,b=_===!1&&f.length===1,w=ge(d),S=_&&(!l||w===4),$=S?w:1,v=S&&!l?w:1,T=P("input",l?12:r,p.length,v),C=P("scale",s,f.length),A=h?P("zero_point",l?12:r,y.length):void 0,k=N("output",s,a.length,$),O=[T,C];A&&O.push(A);let M=[p,f];h&&M.push(y);let V=[{type:12,data:d/$},{type:12,data:n},{type:12,data:t.blockSize},...H(...M,a)],F=j=>{let ne=[{name:"output_size",type:"u32"},{name:"axis",type:"u32"},{name:"block_size",type:"u32"}];return` + ${j.registerUniforms(ne).declareVariables(...O,k)} + ${j.mainStart()} + ${j.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let output_indices = ${k.offsetToIndices("global_idx")}; + + // Set input x + ${l?` + let input = ${T.getByOffset("global_idx / 4")}; + let x_vec = ${o?"unpack4xI8(input)":"unpack4xU8(input)"}; + let x_value = ${$===1?"x_vec[global_idx % 4]":"x_vec"};`:`let x_value = ${T.getByOffset("global_idx")};`}; + + // Set scale input + ${_?`let scale_value= ${C.getByOffset("0")}`:b?` + let scale_index = ${k.indicesGet("output_indices","uniforms.axis")}; + let scale_value= ${C.getByOffset("scale_index")};`:` + var scale_indices: ${C.type.indices} = output_indices; + let index = ${C.indicesGet("scale_indices","uniforms.axis")} / uniforms.block_size; + ${C.indicesSet("scale_indices","uniforms.axis","index")}; + let scale_value= ${C.getByIndices("scale_indices")};`}; + + // Set zero-point input + ${A?_?l?` + let zero_point_input = ${A.getByOffset("0")}; + let zero_point_vec = ${o?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; + let zero_point_value= zero_point_vec[0]`:`let zero_point_value = ${A.getByOffset("0")}`:b?l?` + let zero_point_index = ${k.indicesGet("output_indices","uniforms.axis")}; + let zero_point_input = ${A.getByOffset("zero_point_index / 4")}; + let zero_point_vec = ${o?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; + let zero_point_value = zero_point_vec[zero_point_index % 4]`:` + let zero_point_index = ${k.indicesGet("output_indices","uniforms.axis")}; + let zero_point_value = ${A.getByOffset("zero_point_index")};`:l?` + let zero_point_offset = ${C.indicesToOffset("scale_indices")}; + let zero_point_input = ${A.getByOffset("zero_point_offset / 4")}; + let zero_point_vec = ${o?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; + let zero_point_value = zero_point_vec[zero_point_offset % 4];`:`let zero_point_value = ${A.getByIndices("scale_indices")};`:`let zero_point_value = ${l?o?"i32":"u32":T.type.value}(0);`}; + // Compute and write output + ${k.setByOffset("global_idx",`${k.type.value}(x_value - zero_point_value) * scale_value`)}; + }`};return{name:"DequantizeLinear",shaderCache:{hint:t.cacheKey,inputDependencies:A?["rank","rank","rank"]:["rank","rank"]},getShaderSource:F,getRunData:()=>({outputs:[{dims:a,dataType:s}],dispatchGroup:{x:Math.ceil(d/$/64),y:1,z:1},programUniforms:V})}},lc=(e,t)=>{my(e.inputs,t),e.compute(fy(e.inputs,t))},cc=e=>re({axis:e.axis,blockSize:e.blockSize})});var hy,gy,mc,fc=G(()=>{"use strict";Ge();te();ce();hy=(e,t,n)=>{let r=e===t,o=et&&n>0;if(r||o||a)throw new Error("Range these inputs' contents are invalid.")},gy=(e,t,n,r)=>{let o=Math.abs(Math.ceil((t-e)/n)),a=[o],s=o,d=[{type:12,data:s},{type:r,data:e},{type:r,data:n},...H(a)],l=p=>{let f=N("output",r,a.length),h=f.type.value,y=[{name:"outputSize",type:"u32"},{name:"start",type:h},{name:"delta",type:h}];return` + ${p.registerUniforms(y).declareVariables(f)} + ${p.mainStart()} + ${p.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + output[global_idx] = uniforms.start + ${h}(global_idx) * uniforms.delta; + }`};return{name:"Range",shaderCache:{hint:`${r}`},getShaderSource:l,getRunData:()=>({outputs:[{dims:a,dataType:r}],dispatchGroup:{x:Math.ceil(s/64)},programUniforms:d})}},mc=e=>{let t=0,n=0,r=0;e.inputs[0].dataType===6?(t=e.inputs[0].getInt32Array()[0],n=e.inputs[1].getInt32Array()[0],r=e.inputs[2].getInt32Array()[0]):e.inputs[0].dataType===1&&(t=e.inputs[0].getFloat32Array()[0],n=e.inputs[1].getFloat32Array()[0],r=e.inputs[2].getFloat32Array()[0]),we.webgpu.validateInputContent&&hy(t,n,r),e.compute(gy(t,n,r,e.inputs[0].dataType),{inputs:[]})}});var yy,by,hc,gc,yc=G(()=>{"use strict";te();ae();Ce();ce();yy=(e,t,n,r)=>{if(e!=="none"&&r!=="i32"&&r!=="u32"&&r!=="f32")throw new Error(`Input ${r} is not supported with reduction ${e}.`);let o=`{ + var oldValue = 0; + loop { + let newValueF32 =`,a=`; + let newValue = bitcast(newValueF32); + let res = atomicCompareExchangeWeak(&${t}, oldValue, newValue); + if res.exchanged { + break; + } + oldValue = res.old_value; + } + }`;switch(e){case"none":return`${t}=${n};`;case"add":return r==="i32"||r==="u32"?`atomicAdd(&${t}, bitcast<${r}>(${n}));`:` + ${o}bitcast<${r}>(oldValue) + (${n})${a}`;case"max":return r==="i32"||r==="u32"?`atomicMax(&${t}, bitcast<${r}>(${n}));`:` + ${o}max(bitcast(oldValue), (${n}))${a}`;case"min":return r==="i32"||r==="u32"?`atomicMin(&${t}, bitcast<${r}>(${n}));`:`${o}min(bitcast<${r}>(oldValue), (${n}))${a}`;case"mul":return`${o}(bitcast<${r}>(oldValue) * (${n}))${a}`;default:throw new Error(`Reduction ${e} is not supported.`)}},by=(e,t)=>{let n=e[0].dims,r=e[1].dims,o=n,a=1,s=Math.ceil(E.size(r)/a),d=r[r.length-1],l=E.sizeFromDimension(n,d),p=[{type:12,data:s},{type:12,data:d},{type:12,data:l},...H(e[1].dims,e[2].dims,o)],f=h=>{let y=P("indices",e[1].dataType,e[1].dims.length),_=P("updates",e[2].dataType,e[2].dims.length,a),b=t.reduction!=="none"&&t.reduction!==""?Hs("output",e[0].dataType,o.length):N("output",e[0].dataType,o.length,a);return` + ${h.registerUniform("output_size","u32").registerUniform("last_index_dimension","u32").registerUniform("num_updates_elements","u32").declareVariables(y,_,b)} + ${h.mainStart()} + ${h.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + var hasDuplicates = false; + if (${t.reduction==="none"}) { + let n = ${E.size(r)}; + for (var i = 0; i < n; i = i + 1) { + for (var j = i + 1; j < n; j = j + 1) { + var index_i = i32(indices[i].x); + var index_j = i32(indices[j].x); + if (index_i == index_j) { + hasDuplicates = true; + break; + } + } + if (hasDuplicates) { + break; + } + } + } + + var data_offset = 0u; + var indices_start = uniforms.last_index_dimension * global_idx; + if (${t.reduction==="none"} && hasDuplicates) { + if (global_idx != 0u) { + return; + } + indices_start = 0u; + } + let indices_end = indices_start + uniforms.last_index_dimension; + for (var i = indices_start; i < indices_end; i++) { + var index = i32(indices[i].x); + ${e[0].dims.length===1?` + let element_count_dim = uniforms.output_strides; + let dim_value = uniforms.output_shape;`:` + let element_count_dim = uniforms.output_strides[i - indices_start]; + let dim_value = uniforms.output_shape[i - indices_start + uniforms.last_index_dimension];`} + if (index >= 0) { + if (index >= i32(dim_value)) { + index = i32(dim_value - 1); + } + } else { + if (index < -i32(dim_value)) { + index = 0; + } else { + index += i32(dim_value); + } + } + data_offset += u32((u32(index) * element_count_dim)); + } + + for (var i = 0u; i < uniforms.num_updates_elements; i++) { + let value = updates[uniforms.num_updates_elements * global_idx + i]; + ${yy(t.reduction,"output[data_offset + i]","value",b.type.value)} + } + + }`};return{name:"ScatterND",shaderCache:{hint:`${t.cacheKey}_${t.reduction}`,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:o,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(s/64)},programUniforms:p}),getShaderSource:f}},hc=e=>re({reduction:e.reduction}),gc=(e,t)=>{e.compute(by(e.inputs,t),{inputs:[e.inputs[1],e.inputs[2]],outputs:[]})}});var _y,wy,vy,bc,$y,xy,Sy,Ty,Cy,Iy,Ay,ky,_c,Ey,Py,zy,Oy,Dy,wc,vc,$c=G(()=>{"use strict";te();ae();Ce();ce();_y=(e,t)=>{if(e.every(n=>n>0||(()=>{throw new Error("Resize requires scales input values to be positive")})),e.length>0){if(t.mode==="linear"){if(!(e.length===2||e.length===3||e.length===4&&e[0]===1&&e[1]===1||e.length===4&&e[0]===1&&e[3]===1||e.length===5&&e[0]===1&&e[1]===1))throw new Error(`For linear mode, Resize requires scales to be 2D, 3D, 4D with either two outermost or one innermost and + one outermost scale values equal to 1, or 5D with two outermost scale values equal to 1`)}else if(t.mode==="cubic"&&!(e.length===2||e.length===4&&e[0]===1&&e[1]===1||e.length===4&&e[0]===1&&e[3]===1))throw new Error("Resize requires scales input size to be 2 or 4 for cubic mode")}},wy=(e,t,n)=>{t.every(o=>o>=0&&o{throw new Error("Resize requires axes input values to be positive and less than rank")}));let r=new Array(n).fill(1);return t.forEach((o,a)=>r[o]=e[a]),r},vy=(e,t,n,r,o,a)=>{let[s,d,l]=n>10?[1,2,3]:[-1,e.length>1?1:-1,-1],p=e[0].dims.length;if(s>0&&e.length>s&&e[s].dims.length>0)e[s].getFloat32Array().forEach(f=>a.push(f));else if(t.coordinateTransformMode==="tf_crop_and_resize")throw new Error("Resize requires RoI input to be specified when coordinateTransformMode is tfCropAndResize");if(d>0&&e.length>d&&e[d].dims.length===1&&e[d].dims[0]>0){if(e[d].getFloat32Array().forEach(f=>r.push(f)),r.length!==0&&r.length!==p&&n>=18&&r.length!==t.axes.length)throw new Error("Resize requires scales input size to be same as input rank or axes size for opset 18 and up");_y(r,t),t.axes.length>0&&wy(r,t.axes,p).forEach((f,h)=>r[h]=f)}if(l>0&&e.length>l&&e[l].dims.length===1&&e[l].dims[0]>0&&(e[l].getBigInt64Array().forEach(f=>o.push(Number(f))),o.length!==0&&o.length!==p&&n>=18&&o.length!==t.axes.length))throw new Error("Resize requires sizes input size to be same as input rank or axes size for opset 18 and up");if(t.axes.length>0){if(r.length!==0&&r.length!==t.axes.length)throw new Error('Resize requires "scales" input size to be of axes rank when axes attributes is specified');if(o.length!==0&&o.length!==t.axes.length)throw new Error('Resize requires "sizes" input size to be of rank axes rank when axes attributes is specified')}if(typeof r<"u"&&typeof o<"u"&&r.length>0&&o.length>p)throw new Error("Resize requires only of scales or sizes to be specified")},bc=(e,t,n,r)=>` + // The whole part and the fractional part are calculated separately due to inaccuracy of floating + // point division. As an example, f32(21) / f32(7) may evaluate to 2.99... instead of 3, causing an + // offset-by-one error later in floor(). + let big = (${e}) * (${t}); + let whole = ${r}(big / (${n})); + let fract = ${r}(big % (${n})) / ${r}(${n}); + return whole + fract; +`,$y=(e,t)=>`fn getOriginalCoordinateFromResizedCoordinate(xResized: u32, xScale: f32, lengthResized: u32, + lengthOriginal: u32, roiStart: f32, roiEnd: f32) -> ${t} { `+(()=>{switch(e){case"asymmetric":return` + if (xScale < 1.0 || floor(xScale) != xScale) { + return ${t}(xResized) / ${t}(xScale); + } else { + ${bc("xResized","lengthOriginal","lengthResized",t)} + } + `;case"pytorch_half_pixel":return`if (lengthResized > 1) { + return (${t}(xResized) + 0.5) / ${t}(xScale) - 0.5; + } else { + return 0.0; + }`;case"tf_half_pixel_for_nn":return`return (${t}(xResized) + 0.5) / ${t}(xScale);`;case"align_corners":return`if (lengthResized == 1) { + return 0.0; + } else { + ${bc("xResized","lengthOriginal - 1","lengthResized - 1",t)} + }`;case"tf_crop_and_resize":return`if (lengthResized > 1) { + return ${t}(roiStart) * ${t}(lengthOriginal - 1) + + (${t}(xResized) * ${t}(roiEnd - roiStart) * ${t}(lengthOriginal - 1)) / + ${t}(lengthResized - 1); + } else { + return 0.5 * ${t}(roiStart + roiEnd) * ${t}(lengthOriginal - 1); + }`;case"half_pixel_symmetric":return`const outputWidth = ${t}xScale * ${t}(lengthResized); + const adjustment = ${t}(lengthResized) / outputWidth; + const center = ${t}(lengthOriginal) / 2; + const offset = center * (1 - adjustment); + return offset + ((${t}(xResized) + 0.5) / ${t}(xScale)) - 0.5;`;case"half_pixel":return`return ((${t}(xResized) + 0.5) / ${t}(xScale)) - 0.5;`;default:throw new Error(`Coordinate transform mode ${e} is not supported`)}})()+"}",xy=(e,t,n)=>`fn getNearestPixelFromOriginal(xOriginal: ${n}, isDownSample: bool) -> ${n} {`+(()=>{switch(e){case"round_prefer_ceil":return"if (fract(xOriginal) == 0.5) { return ceil(xOriginal); } else { return round(xOriginal); }";case"floor":return"return floor(xOriginal);";case"ceil":return"return ceil(xOriginal);";case"round_prefer_floor":return"if (fract(xOriginal) == 0.5) { return floor(xOriginal); } else { return round(xOriginal); }";case"simple":default:if(t<11)return"if (isDownSample) { return ceil(xOriginal); } else { return xOriginal; }";throw new Error(`Nearest mode ${e} is not supported`)}})()+"}",Sy=(e,t,n)=>{let r=new Array(n).fill(0).concat(new Array(n).fill(1)),o=e.length===0?r:e.slice();return t.length>0?(t.forEach((a,s)=>{r[a]=o[s],r[s+n]=o[t.length+s]}),r):o},Ty=(e,t,n,r)=>{let o=[];if(n.length>0)if(r.length>0){if(e.forEach(a=>o.push(a)),Math.max(...r)>e.length)throw new Error("axes is out of bound");r.forEach((a,s)=>o[a]=n[s])}else n.forEach(a=>o.push(a));else{if(t.length===0)throw new Error("Resize requires either scales or sizes.");o=e.map((a,s)=>Math.round(a*t[s]))}return o},Cy=(e,t,n)=>{let r=(()=>{switch(n.keepAspectRatioPolicy){case"not_larger":return n.axes.length>0?Math.min(...n.axes.map(a=>t[a]),Number.MAX_VALUE):Math.min(...t,Number.MAX_VALUE);case"not_smaller":return n.axes.length>0?Math.max(...n.axes.map(a=>t[a]),Number.MIN_VALUE):Math.max(...t,Number.MIN_VALUE);default:throw new Error(`Keep aspect ratio policy ${n.keepAspectRatioPolicy} is not supported`)}})();t.fill(1,0,t.length);let o=e.slice();return n.axes.length>0?(n.axes.forEach(a=>t[a]=r),n.axes.forEach(a=>o[a]=Math.round(e[a]*t[a]))):(t.fill(r,0,t.length),o.forEach((a,s)=>o[s]=Math.round(a*t[s]))),o},Iy=(e,t,n,r,o)=>` + fn calculateOriginalIndicesFromOutputIndices(output_indices: ${e.type.indices}) -> array<${e.type.value}, ${n.length}> { + var original_indices: array<${e.type.value}, ${n.length}>; + for (var i:u32 = 0; i < ${n.length}; i++) { + var output_index = ${e.indicesGet("output_indices","i")}; + var scale = ${K("uniforms.scales","i",r)}; + var roi_low = ${K("uniforms.roi","i",o)}; + var roi_hi = ${K("uniforms.roi",`i + ${t.length}`,o)}; + if (scale == 1.0) { + original_indices[i] = ${e.type.value}(output_index); + } else { + var input_shape_i = ${K("uniforms.input_shape","i",t.length)}; + var output_shape_i = ${K("uniforms.output_shape","i",n.length)}; + original_indices[i] = getOriginalCoordinateFromResizedCoordinate(output_index, scale, output_shape_i, + input_shape_i, roi_low, roi_hi); + } + } + return original_indices; + }`,Ay=(e,t,n,r,o,a,s)=>` + fn calculateInputIndicesFromOutputIndices(output_indices: ${t.type.indices}) -> ${e.type.indices} { + var input_indices: ${e.type.indices}; + for (var i:u32 = 0; i < ${r.length}; i++) { + var output_index = ${t.indicesGet("output_indices","i")}; + var input_index: u32; + var scale = ${K("uniforms.scales","i",o)}; + if (scale == 1.0) { + input_index = output_index; + } else { + var roi_low = ${K("uniforms.roi","i",a)}; + var roi_hi = ${K("uniforms.roi",`i + ${n.length}`,a)}; + var input_shape_i = ${K("uniforms.input_shape","i",n.length)}; + var output_shape_i = ${K("uniforms.output_shape","i",r.length)}; + var original_idx = getOriginalCoordinateFromResizedCoordinate(output_index, scale, output_shape_i, + input_shape_i, roi_low, roi_hi); + if (!${s} || (original_idx >= 0 && original_idx < ${t.type.value}(input_shape_i))) { + if (original_idx < 0) { + input_index = 0; + } else if (original_idx > ${t.type.value}(input_shape_i - 1)) { + input_index = input_shape_i - 1; + } else { + input_index = u32(getNearestPixelFromOriginal(original_idx, scale < 1)); + } + } else { + input_index = u32(original_idx); + } + } + ${e.indicesSet("input_indices","i","input_index")} + } + return input_indices; + }`,ky=(e,t)=>` + fn checkInputIndices(input_indices: ${e.type.indices}) -> bool { + for (var i:u32 = 0; i < ${t.length}; i++) { + var input_index = ${e.indicesGet("input_indices","i")}; + if (input_index < 0 || input_index >= ${K("uniforms.input_shape","i",t.length)}) { + return false; + } + } + return true; + }`,_c=(e,t,n,r)=>e.rank>r?` + ${e.indicesSet("input_indices",t,"channel")}; + ${e.indicesSet("input_indices",n,"batch")}; +`:"",Ey=(e,t,n,r,o)=>{let[s,d,l,p]=n.length===2?[-1,0,1,-1]:[0,2,3,1],f=e.type.value;return` + fn getInputValue(batch: u32, channel: u32, row: u32, col: u32) -> ${f} { + var input_indices: ${e.type.indices}; + ${e.indicesSet("input_indices",d,`max(0, min(row, ${n[d]} - 1))`)}; + ${e.indicesSet("input_indices",l,`max(0, min(col, ${n[l]} - 1))`)}; + ${_c(e,p,s,2)} + return ${e.getByIndices("input_indices")}; + } + + fn bilinearInterpolation(output_indices: ${t.type.indices}) -> ${f} { + var originalIndices = calculateOriginalIndicesFromOutputIndices(output_indices); + var row:${f} = originalIndices[${d}]; + var col:${f} = originalIndices[${l}]; + ${r?`if (row < 0 || row > (${n[d]} - 1) || col < 0 || col > (${n[l]} - 1)) { + return ${o}; + }`:""}; + row = max(0, min(row, ${n[d]} - 1)); + col = max(0, min(col, ${n[l]} - 1)); + var row1: u32 = u32(row); + var col1: u32 = u32(col); + var row2: u32 = u32(row + 1); + var col2: u32 = u32(col + 1); + var channel: u32 = ${n.length>2?`u32(originalIndices[${p}])`:"0"}; + var batch: u32 = ${n.length>2?`u32(originalIndices[${s}])`:"0"}; + var x11: ${f} = getInputValue(batch, channel, row1, col1); + var x12: ${f} = getInputValue(batch, channel, row1, col2); + var x21: ${f} = getInputValue(batch, channel, row2, col1); + var x22: ${f} = getInputValue(batch, channel, row2, col2); + var dx1: ${f} = abs(row - ${f}(row1)); + var dx2: ${f} = abs(${f}(row2) - row); + var dy1: ${f} = abs(col - ${f}(col1)); + var dy2: ${f} = abs(${f}(col2) - col); + if (row1 == row2) { + dx1 = 0.5; + dx2 = 0.5; + } + if (col1 == col2) { + dy1 = 0.5; + dy2 = 0.5; + } + return (x11 * dx2 * dy2 + x12 * dx2 * dy1 + x21 * dx1 * dy2 + x22 * dx1 * dy1); + }`},Py=(e,t,n,r,o,a,s,d,l,p)=>{let f=n.length===2,h=!0,[y,_]=f?[0,1]:h?[2,3]:[1,2],b=e.type.value,w=S=>{let $=S===y?"row":"col";return` + fn ${$}CubicInterpolation(input_indices: ${e.type.indices}, output_indices: ${t.type.indices}) -> ${b} { + var output_index = ${t.indicesGet("output_indices",S)}; + var originalIdx: ${b} = getOriginalCoordinateFromResizedCoordinate(output_index, ${o[S]}, + ${r[S]}, ${n[S]}, ${a[S]}, ${a[S]} + ${n.length}); + var fractOriginalIdx: ${b} = originalIdx - floor(originalIdx); + var coefs = getCubicInterpolationCoefs(fractOriginalIdx); + + if (${d} && (originalIdx < 0 || originalIdx > (${n[S]} - 1))) { + return ${l}; + } + var data: array<${b}, 4> = array<${b}, 4>(0.0, 0.0, 0.0, 0.0); + for (var i: i32 = -1; i < 3; i++) { + var ${$}: ${b} = originalIdx + ${b}(i); + if (${$} < 0 || ${$} >= ${n[S]}) { + ${p?`coefs[i + 1] = 0.0; + continue;`:d?`return ${l};`:`${$} = max(0, min(${$}, ${n[S]} - 1));`}; + } + var input_indices_copy: ${e.type.indices} = input_indices; + ${e.indicesSet("input_indices_copy",S,`u32(${$})`)}; + data[i + 1] = ${S===y?e.getByIndices("input_indices_copy"):"rowCubicInterpolation(input_indices_copy, output_indices)"}; + } + return cubicInterpolation1D(data, coefs); + }`};return` + ${w(y)}; + ${w(_)}; + fn getCubicInterpolationCoefs(s: ${b}) -> array<${b}, 4> { + var absS = abs(s); + var coeffs: array<${b}, 4> = array<${b}, 4>(0.0, 0.0, 0.0, 0.0); + var oneMinusAbsS: ${b} = 1.0 - absS; + var twoMinusAbsS: ${b} = 2.0 - absS; + var onePlusAbsS: ${b} = 1.0 + absS; + coeffs[0] = ((${s} * onePlusAbsS - 5 * ${s}) * onePlusAbsS + 8 * ${s}) * onePlusAbsS - 4 * ${s}; + coeffs[1] = ((${s} + 2) * absS - (${s} + 3)) * absS * absS + 1; + coeffs[2] = ((${s} + 2) * oneMinusAbsS - (${s} + 3)) * oneMinusAbsS * oneMinusAbsS + 1; + coeffs[3] = ((${s} * twoMinusAbsS - 5 * ${s}) * twoMinusAbsS + 8 * ${s}) * twoMinusAbsS - 4 * ${s}; + return coeffs; + } + + fn cubicInterpolation1D(x: array<${b}, 4>, coefs: array<${b}, 4>) -> ${b} { + var coefsSum: ${b} = coefs[0] + coefs[1] + coefs[2] + coefs[3]; + return (x[0] * coefs[0] + x[1] * coefs[1]+ x[2] * coefs[2]+ x[3] * coefs[3]) / coefsSum; + } + + fn bicubicInterpolation(output_indices: ${t.type.indices}) -> ${b} { + var input_indices: ${e.type.indices} = output_indices; + return colCubicInterpolation(input_indices, output_indices); + } + `},zy=(e,t,n,r,o)=>{let[s,d,l,p,f]=n.length===3?[-1,0,1,2,-1]:[0,2,3,4,1],h=e.type.value;return` + fn getInputValue(batch: u32, channel: u32, depth:u32, height: u32, width: u32) -> ${h} { + var input_indices: ${e.type.indices}; + ${e.indicesSet("input_indices",d,`max(0, min(depth, ${n[d]} - 1))`)}; + ${e.indicesSet("input_indices",l,`max(0, min(height, ${n[l]} - 1))`)}; + ${e.indicesSet("input_indices",p,`max(0, min(width, ${n[p]} - 1))`)}; + ${_c(e,f,s,3)} + return ${e.getByIndices("input_indices")}; + } + + fn trilinearInterpolation(output_indices: ${t.type.indices}) -> ${h} { + var originalIndices = calculateOriginalIndicesFromOutputIndices(output_indices); + var depth:${h} = originalIndices[${d}]; + var height:${h} = originalIndices[${l}]; + var width:${h} = originalIndices[${p}]; + ${r?`if (depth < 0 || depth > (${n[d]} - 1) || height < 0 || height > (${n[l]} - 1) || width < 0 || (width > ${n[p]} - 1)) { + return ${o}; + }`:""}; + + depth = max(0, min(depth, ${n[d]} - 1)); + height = max(0, min(height, ${n[l]} - 1)); + width = max(0, min(width, ${n[p]} - 1)); + var depth1: u32 = u32(depth); + var height1: u32 = u32(height); + var width1: u32 = u32(width); + var depth2: u32 = u32(depth + 1); + var height2: u32 = u32(height + 1); + var width2: u32 = u32(width + 1); + var channel: u32 = ${n.length>3?`u32(originalIndices[${f}])`:"0"}; + var batch: u32 = ${n.length>3?`u32(originalIndices[${s}])`:"0"}; + + var x111: ${h} = getInputValue(batch, channel, depth1, height1, width1); + var x112: ${h} = getInputValue(batch, channel, depth1, height1, width2); + var x121: ${h} = getInputValue(batch, channel, depth1, height2, width1); + var x122: ${h} = getInputValue(batch, channel, depth1, height2, width2); + var x211: ${h} = getInputValue(batch, channel, depth2, height1, width1); + var x212: ${h} = getInputValue(batch, channel, depth2, height1, width2); + var x221: ${h} = getInputValue(batch, channel, depth2, height2, width1); + var x222: ${h} = getInputValue(batch, channel, depth2, height2, width2); + var dx1: ${h} = abs(depth - ${h}(depth1)); + var dx2: ${h} = abs(${h}(depth2) - depth); + var dy1: ${h} = abs(height - ${h}(height1)); + var dy2: ${h} = abs(${h}(height2) - height); + var dz1: ${h} = abs(width - ${h}(width1)); + var dz2: ${h} = abs(${h}(width2) - width); + if (depth1 == depth2) { + dx1 = 0.5; + dx2 = 0.5; + } + if (height1 == height2) { + dy1 = 0.5; + dy2 = 0.5; + } + if (width1 == width2) { + dz1 = 0.5; + dz2 = 0.5; + } + return (x111 * dx2 * dy2 * dz2 + x112 * dx2 * dy2 * dz1 + x121 * dx2 * dy1 *dz2 + x122 * dx2 * dy1 * dz1 + + x211 * dx1 * dy2 * dz2 + x212 * dx1 * dy2 * dz1 + x221 * dx1 * dy1 *dz2 + x222 * dx1 * dy1 * dz1); + }`},Oy=(e,t,n,r,o,a)=>{let s=e.dims,d=Sy(a,t.axes,s.length),l=Ty(s,r,o,t.axes),p=r.slice();r.length===0&&(p=s.map((v,T)=>v===0?1:l[T]/v),t.keepAspectRatioPolicy!=="stretch"&&(l=Cy(s,p,t)));let f=N("output",e.dataType,l.length),h=P("input",e.dataType,s.length),y=E.size(l),_=s.length===l.length&&s.every((v,T)=>v===l[T]),b=t.coordinateTransformMode==="tf_crop_and_resize",w=t.extrapolationValue,S=h.type.value,$=v=>` + ${_?"":` + ${$y(t.coordinateTransformMode,S)}; + ${(()=>{switch(t.mode){case"nearest":return` + ${ky(h,s)}; + ${xy(t.nearestMode,n,S)}; + ${Ay(h,f,s,l,p.length,d.length,b)}; + `;case"linear":return` + ${Iy(f,s,l,p.length,d.length)}; + ${(()=>{if(s.length===2||s.length===4)return`${Ey(h,f,s,b,w)}`;if(s.length===3||s.length===5)return`${zy(h,f,s,b,w)}`;throw Error("Linear mode only supports input dims 2, 3, 4 and 5 are supported in linear mode.")})()}; + `;case"cubic":return` + ${(()=>{if(s.length===2||s.length===4)return`${Py(h,f,s,l,p,d,t.cubicCoeffA,b,t.extrapolationValue,t.excludeOutside)}`;throw Error("Cubic mode only supports input dims 2 and 4 are supported in linear mode.")})()}; + `;default:throw Error("Invalid resize mode")}})()}; + `} + ${v.registerUniform("output_size","u32").registerUniform("scales","f32",p.length).registerUniform("roi","f32",d.length).declareVariables(h,f)} + ${v.mainStart()} + ${v.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + ${_?"output[global_idx] = input[global_idx];":` + let output_indices = ${f.offsetToIndices("global_idx")}; + var input_indices: ${h.type.indices}; + ${(()=>{switch(t.mode){case"nearest":return`input_indices = calculateInputIndicesFromOutputIndices(output_indices); + if (checkInputIndices(input_indices)) { + output[global_idx] = ${h.getByIndices("input_indices")}; + } else { + output[global_idx] = ${t.extrapolationValue}; + }`;case"linear":return`output[global_idx] = ${s.length===2||s.length===4?"bilinearInterpolation":"trilinearInterpolation"}(output_indices);`;case"cubic":return"output[global_idx] = bicubicInterpolation(output_indices);";default:throw Error(`Unsupported resize mode: ${t.mode}`)}})()}; +`} + }`;return{name:"Resize",shaderCache:{hint:`${t.cacheKey}|${n}|${p.length>0?t.mode==="cubic"?p:p.length:""}|${o.length>0?o:""}|${d.length>0?d:""}|${_}|${t.mode==="nearest"?s.length:s}`,inputDependencies:["rank"]},getShaderSource:$,getRunData:()=>({outputs:[{dims:l,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(y/64)},programUniforms:[{type:12,data:y},{type:1,data:p},{type:1,data:d},...H(s,l)]})}},Dy=e=>{let t=e.customDataBuffer;return new Uint32Array(t,t.byteOffset,1)[0]},wc=(e,t)=>{let n=[],r=[],o=[],a=Dy(e);if(t.antialias!==0)throw Error("Only default value (0) for Antialias attribute is supported");vy(e.inputs,t,a,n,r,o),e.compute(Oy(e.inputs[0],t,a,n,r,o),{inputs:[0]})},vc=e=>{let t=e.antialias,n=e.axes,r=e.coordinateTransformMode,o=e.cubicCoeffA,a=e.excludeOutside!==0,s=e.extrapolationValue,d=e.keepAspectRatioPolicy,l=e.mode,p=e.nearestMode===""?"simple":e.nearestMode;return re({antialias:t,axes:n,coordinateTransformMode:r,cubicCoeffA:o,excludeOutside:a,extrapolationValue:s,keepAspectRatioPolicy:d,mode:l,nearestMode:p})}});var By,My,xc,Sc=G(()=>{"use strict";te();ae();Ce();ce();By=(e,t)=>{let[n,r,o,a]=e,{numHeads:s,rotaryEmbeddingDim:d}=t;if(n.dims.length!==3&&n.dims.length!==4)throw new Error(`Input 'x' is expected to have 3 or 4 dimensions, got ${n.dims.length}`);if(!E.areEqual(r.dims,[])&&!E.areEqual(r.dims,[1])&&r.dims.length!==2)throw new Error(`Input 'position_ids' is expected to have 0, 1, or 2 dimensions, got ${r.dims.length}`);if(o.dims.length!==2)throw new Error(`Input 'cos_cache' is expected to have 2 dimensions, got ${o.dims.length}`);if(a.dims.length!==2)throw new Error(`Input 'sin_cache' is expected to have 2 dimensions, got ${a.dims.length}`);if(!E.areEqual(o.dims,a.dims))throw new Error("Inputs 'cos_cache' and 'sin_cache' are expected to have the same shape");if(d>0&&s===0)throw new Error("num_heads must be provided if rotary_embedding_dim is specified");let l=n.dims[0],p=n.dims[n.dims.length-2],f=o.dims[0],h=E.sizeFromDimension(n.dims,1)/p,y=d===0?o.dims[1]*2:h/s;if(d>y)throw new Error("rotary_embedding_dim must be less than or equal to head_size");if(r.dims.length===2){if(l!==r.dims[0])throw new Error(`Input 'position_ids' dimension 0 should be of size batch_size, got ${r.dims[0]}`);if(p!==r.dims[1])throw new Error(`Input 'position_ids' dimension 1 should be of size sequence_length, got ${r.dims[1]}`)}if(y/2!==o.dims[1]&&d/2!==o.dims[1])throw new Error(`Input 'cos_cache' dimension 1 should be same as head_size / 2 or rotary_embedding_dim / 2, got ${o.dims[1]}`);if(p>f)throw new Error("Updating cos_cache and sin_cache in RotaryEmbedding is not currently supported")},My=(e,t)=>{let{interleaved:n,numHeads:r,rotaryEmbeddingDim:o,scale:a}=t,s=e[0].dims[0],d=E.sizeFromDimension(e[0].dims,1),l=e[0].dims[e[0].dims.length-2],p=d/l,f=e[2].dims[1],h=o===0?f*2:p/r,y=new Array(s,l,p/h,h-f),_=E.computeStrides(y),b=[{type:1,data:a},{type:12,data:y},{type:12,data:_},...e[0].dims.length===3?new Array({type:12,data:[d,p,h,1]}):[],...e[0].dims.length===4?new Array({type:12,data:[d,h,l*h,1]}):[],...H(e[0].dims,e[1].dims,e[2].dims,e[3].dims,e[0].dims)],w=S=>{let $=P("input",e[0].dataType,e[0].dims.length),v=P("position_ids",e[1].dataType,e[1].dims.length),T=P("cos_cache",e[2].dataType,e[2].dims.length),C=P("sin_cache",e[3].dataType,e[3].dims.length),A=N("output",e[0].dataType,e[0].dims.length);return S.registerUniforms([{name:"scale",type:"f32"},{name:"global_shape",type:"u32",length:y.length},{name:"global_strides",type:"u32",length:_.length},{name:"input_output_strides",type:"u32",length:_.length}]),` + ${S.declareVariables($,v,T,C,A)} + + ${S.mainStart(Et)} + let half_rotary_emb_dim = uniforms.${T.name}_shape[1]; + let bsnh = global_idx / uniforms.global_strides % uniforms.global_shape; + let size = uniforms.global_shape[0] * uniforms.global_strides[0]; + ${S.guardAgainstOutOfBoundsWorkgroupSizes("size")} + + if (bsnh[3] < half_rotary_emb_dim) { + let position_ids_idx = + ${v.broadcastedIndicesToOffset("bsnh.xy",N("",v.type.tensor,2))}; + let position_id = + u32(${v.getByOffset("position_ids_idx")}) + select(0, bsnh[1], position_ids_idx == 0); + let i = dot(bsnh, uniforms.input_output_strides) + select(0, bsnh[3], ${n}); + let j = i + select(half_rotary_emb_dim, 1, ${n}); + let re = ${$.getByOffset("i")} * ${T.get("position_id","bsnh[3]")} - + ${$.getByOffset("j")} * ${C.get("position_id","bsnh[3]")}; + ${A.setByOffset("i","re")} + let im = ${$.getByOffset("i")} * ${C.get("position_id","bsnh[3]")} + + ${$.getByOffset("j")} * ${T.get("position_id","bsnh[3]")}; + ${A.setByOffset("j","im")} + } else { + let k = dot(bsnh, uniforms.input_output_strides) + half_rotary_emb_dim; + ${A.setByOffset("k",$.getByOffset("k"))} + } + }`};return{name:"RotaryEmbedding",shaderCache:{hint:re({interleaved:n}).cacheKey,inputDependencies:["rank","rank","rank","rank"]},getShaderSource:w,getRunData:()=>({outputs:[{dims:e[0].dims,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(E.size(y)/Et)},programUniforms:b})}},xc=(e,t)=>{By(e.inputs,t),e.compute(My(e.inputs,t))}});var Ry,Uy,Tc,Cc=G(()=>{"use strict";te();ae();ce();Ry=e=>{if(!e||e.length<3)throw new Error("layerNorm requires at least 3 inputs.");let t=e[0],n=e[1],r=e[2];if(t.dataType!==n.dataType||t.dataType!==r.dataType)throw new Error("All inputs must have the same data type");if(t.dims.length!==3&&t.dims.length!==2)throw new Error("Input must be 2D or 3D");if(n.dims.length!==3&&n.dims.length!==2)throw new Error("Skip must be 2D or 3D");let o=t.dims[t.dims.length-1],a=t.dims[t.dims.length-2];if(n.dims[n.dims.length-1]!==o)throw new Error("Skip must have the same hidden size as input");if(n.dims[n.dims.length-2]!==a)throw new Error("Skip must have the same sequence length as input");if(r.dims.length!==1)throw new Error("Gamma must be 1D");if(r.dims[r.dims.length-1]!==o)throw new Error("Gamma must have the same hidden size as input");if(e.length>3){let s=e[3];if(s.dims.length!==1)throw new Error("Beta must be 1D");if(s.dims[s.dims.length-1]!==o)throw new Error("Beta must have the same hidden size as input")}if(e.length>4){let s=e[4];if(s.dims.length!==1)throw new Error("Bias must be 1D");if(s.dims[s.dims.length-1]!==o)throw new Error("Bias must have the same hidden size as input")}},Uy=(e,t,n,r)=>{let o=t.simplified,a=e[0].dims,s=E.size(a),d=a,l=s,p=a.slice(-1)[0],f=r?a.slice(0,-1).concat(1):[],h=!o&&e.length>3,y=e.length>4,_=r&&n>1,b=r&&n>2,w=n>3,S=64,$=ge(p),v=[{type:12,data:l},{type:12,data:$},{type:12,data:p},{type:1,data:t.epsilon}],T=A=>{let k=[{name:"output_size",type:"u32"},{name:"components",type:"u32"},{name:"hidden_size",type:"u32"},{name:"epsilon",type:"f32"}],O=[P("x",e[0].dataType,e[0].dims,$),P("skip",e[1].dataType,e[1].dims,$),P("gamma",e[2].dataType,e[2].dims,$)];h&&O.push(P("beta",e[3].dataType,e[3].dims,$)),y&&O.push(P("bias",e[4].dataType,e[4].dims,$)),O.push(N("output",e[0].dataType,d,$)),_&&O.push(N("mean_output",1,f)),b&&O.push(N("inv_std_output",1,f)),w&&O.push(N("input_skip_bias_sum",e[0].dataType,d,$));let M=_e(e[0].dataType),V=_e(1,$);return` + + ${A.registerUniforms(k).declareVariables(...O)} + var sum_shared : array<${V}, ${S}>; + var sum_squared_shared : array<${V}, ${S}>; + + ${A.mainStart([S,1,1])} + let ix = local_id.x; + let iy = global_id.x / ${S}; + + let hidden_size_vectorized: u32 = uniforms.hidden_size / uniforms.components; + var stride = hidden_size_vectorized / ${S}; + let offset = ix * stride + iy * hidden_size_vectorized; + let offset1d = stride * ix; + if (ix == ${S-1}) { + stride = hidden_size_vectorized - stride * ix; + } + for (var i: u32 = 0; i < stride; i++) { + let skip_value = skip[offset + i]; + let bias_value = ${y?"bias[offset1d + i]":M+"(0.0)"}; + let input_value = x[offset + i]; + let value = input_value + skip_value + bias_value; + ${w?"input_skip_bias_sum[offset + i] = value;":""} + output[offset + i] = value; + let f32_value = ${Pt(M,$,"value")}; + sum_shared[ix] += f32_value; + sum_squared_shared[ix] += f32_value * f32_value; + } + workgroupBarrier(); + + var reduce_size : u32 = ${S}; + for (var curr_size = reduce_size >> 1; curr_size > 0; curr_size = reduce_size >> 1) { + reduce_size = curr_size + (reduce_size & 1); + if (ix < curr_size) { + sum_shared[ix] += sum_shared[ix + reduce_size]; + sum_squared_shared[ix] += sum_squared_shared[ix + reduce_size]; + } + workgroupBarrier(); + } + + let sum = sum_shared[0]; + let square_sum = sum_squared_shared[0]; + let mean = ${Ke("sum",$)} / f32(uniforms.hidden_size); + let inv_std_dev = inverseSqrt(${Ke("square_sum",$)} / f32(uniforms.hidden_size) ${o?"":"- mean * mean"} + uniforms.epsilon); + ${_?"mean_output[global_idx] = mean;":""} + ${b?"inv_std_output[global_idx] = inv_std_dev;":""} + + for (var i: u32 = 0; i < stride; i++) { + output[offset + i] = (output[offset + i] ${o?"":`- ${M}(mean)`}) * + ${M}(inv_std_dev) * gamma[offset1d + i] + ${h?"+ beta[offset1d + i]":""}; + } + }`},C=[{dims:d,dataType:e[0].dataType}];return n>1&&C.push({dims:f,dataType:1}),n>2&&C.push({dims:f,dataType:1}),n>3&&C.push({dims:a,dataType:e[0].dataType}),{name:"SkipLayerNormalization",shaderCache:{hint:`${$};${_};${b};${w}`,inputDependencies:e.map((A,k)=>"type")},getShaderSource:T,getRunData:()=>({outputs:C,dispatchGroup:{x:Math.ceil(l/p)},programUniforms:v})}},Tc=(e,t)=>{Ry(e.inputs);let r=[0];e.outputCount>1&&r.push(-3),e.outputCount>2&&r.push(-3),e.outputCount>3&&r.push(3),e.compute(Uy(e.inputs,t,e.outputCount,!1),{outputs:r})}});var Ny,nn,Vy,Ic,Wy,Ly,Ac,kc,Ec=G(()=>{"use strict";te();ae();Ce();ce();Ny=(e,t)=>{if(!e||e.length<1)throw new Error("too few inputs");if(t.axes.length!==0){if(t.axes.length!==t.starts.length||t.axes.length!==t.ends.length)throw new Error("axes, starts and ends must have the same length")}else if(t.starts.length!==t.ends.length)throw new Error("starts and ends must have the same length");e.slice(1).forEach((n,r)=>{if(e[r+1].dataType!==6&&e[r+1].dataType!==7)throw new Error(`Input ${r} must be an array of int32 or int64`)})},nn=(e,t)=>{let n=[];if(e.length>t)if(e[t].dataType===7)e[t].getBigInt64Array().forEach(r=>n.push(Number(r)));else if(e[t].dataType===6)e[t].getInt32Array().forEach(r=>n.push(Number(r)));else throw new Error(`Input ${t} must be an array of int32 or int64`);return n},Vy=(e,t)=>{if(e.length>1){let n=nn(e,1),r=nn(e,2),o=nn(e,3);return o.length===0&&(o=[...Array(e[0].dims.length).keys()]),re({starts:n,ends:r,axes:o})}else return t},Ic=(e,t,n,r,o)=>{let a=e;return e<0&&(a+=n[r[t]]),o[t]<0?Math.max(0,Math.min(a,n[r[t]]-1)):Math.max(0,Math.min(a,n[r[t]]))},Wy=(e,t,n)=>`fn calculateInputIndices(output_indices: ${t.type.indices}) -> ${e.type.indices} { + var input_indices: ${e.type.indices}; + var carry = 0u; + for (var i = ${n.length}; i >= 0; i--) { + let input_shape_i = ${K("uniforms.input_shape","i",n.length)}; + let steps_i = ${K("uniforms.steps","i",n.length)}; + let signs_i = ${K("uniforms.signs","i",n.length)}; + let starts_i = ${K("uniforms.starts","i",n.length)}; + var output_index = ${t.indicesGet("output_indices","i")}; + var input_index = output_index * steps_i + starts_i + carry; + carry = input_index / input_shape_i; + input_index = input_index % input_shape_i; + if (signs_i < 0) { + input_index = input_shape_i - input_index - 1u + starts_i; + } + ${e.indicesSet("input_indices","i","input_index")}; + } + return input_indices; + }`,Ly=(e,t)=>{let n=e[0].dims,r=E.size(n),o=t.axes.length>0?E.normalizeAxes(t.axes,n.length):[...Array(n.length).keys()],a=nn(e,4);a.forEach($=>$!==0||(()=>{throw new Error("step cannot be 0")})),a.length===0&&(a=Array(o.length).fill(1));let s=t.starts.map(($,v)=>Ic($,v,n,o,a)),d=t.ends.map(($,v)=>Ic($,v,n,o,a));if(o.length!==s.length||o.length!==d.length)throw new Error("start, ends and axes should have the same number of elements");if(o.length!==n.length)for(let $=0;$Math.sign($));a.forEach(($,v,T)=>{if($<0){let C=(d[v]-s[v])/$,A=s[v],k=A+C*a[v];s[v]=k,d[v]=A,T[v]=-$}});let p=n.slice(0);o.forEach(($,v)=>{p[$]=Math.ceil((d[$]-s[$])/a[$])});let f={dims:p,dataType:e[0].dataType},h=N("output",e[0].dataType,p.length),y=P("input",e[0].dataType,e[0].dims.length),_=E.size(p),b=[{name:"outputSize",type:"u32"},{name:"starts",type:"u32",length:s.length},{name:"signs",type:"i32",length:l.length},{name:"steps",type:"u32",length:a.length}],w=[{type:12,data:_},{type:12,data:s},{type:6,data:l},{type:12,data:a},...H(e[0].dims,p)],S=$=>` + ${$.registerUniforms(b).declareVariables(y,h)} + ${Wy(y,h,n)} + ${$.mainStart()} + ${$.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + let output_indices = ${h.offsetToIndices("global_idx")}; + let input_indices = calculateInputIndices(output_indices); + ${h.setByOffset("global_idx",y.getByIndices("input_indices"))} + }`;return{name:"Slice",shaderCache:{hint:`${l.length}_${s.length}_${a.length}`,inputDependencies:["rank"]},getShaderSource:S,getRunData:()=>({outputs:[f],dispatchGroup:{x:Math.ceil(r/64)},programUniforms:w})}},Ac=(e,t)=>{Ny(e.inputs,t);let n=Vy(e.inputs,t);e.compute(Ly(e.inputs,n),{inputs:[0]})},kc=e=>{let t=e.starts,n=e.ends,r=e.axes;return re({starts:t,ends:n,axes:r})}});var Gy,Hy,Pc,zc,Oc=G(()=>{"use strict";te();ae();Ce();ct();ce();Gy=e=>{if(!e||e.length!==1)throw new Error("Softmax op requires 1 input.")},Hy=(e,t)=>{let n=e.inputs[0],r=n.dims,o=E.size(r),a=r.length,s=E.normalizeAxis(t.axis,a),d=sM),p[s]=a-1,p[a-1]=s,l=e.compute(Oe(n,p),{inputs:[n],outputs:[-1]})[0]):l=n;let f=l.dims,h=f[a-1],y=o/h,_=ge(h),b=h/_,w=64;y===1&&(w=256);let S=(O,M)=>M===4?`max(max(${O}.x, ${O}.y), max(${O}.z, ${O}.w))`:M===2?`max(${O}.x, ${O}.y)`:M===3?`max(max(${O}.x, ${O}.y), ${O}.z)`:O,$=P("x",l.dataType,l.dims,_),v=N("result",l.dataType,l.dims,_),T=$.type.value,C=_e(l.dataType)==="f32"?`var threadMax = ${T}(-3.402823e+38f);`:`var threadMax = ${T}(-65504.0h);`,A=O=>` + var rowMaxShared : ${T}; + var rowSumShared : ${T}; + var threadShared : array<${T}, ${w}>; + + fn getValue(row: i32, col: i32, row_stride: i32) -> ${T} { + let index = row * row_stride + col; + return x[index]; + } + + fn setValue(row: i32, col: i32, row_stride: i32, value: ${T}) { + let index = row * row_stride + col; + result[index] = value; + } + ${O.registerUniform("packedCols","i32").declareVariables($,v)} + ${O.mainStart(w)} + let gindex = i32(global_idx); + let lindex = i32(local_idx); + const wg = ${w}; + let row = gindex / wg; + let cols = uniforms.packedCols; + let row_stride : i32 = uniforms.packedCols; + + // find the rows max + ${C} + for (var col = lindex; col < cols; col += wg) { + let value = getValue(row, col, row_stride); + threadMax = max(threadMax, value); + } + if (lindex < cols) { + threadShared[lindex] = threadMax; + } + workgroupBarrier(); + + var reduceSize = min(cols, wg); + for (var currSize = reduceSize >> 1; currSize > 0; currSize = reduceSize >> 1) { + reduceSize = currSize + (reduceSize & 1); + if (lindex < currSize) { + threadShared[lindex] = max(threadShared[lindex], threadShared[lindex + reduceSize]); + } + workgroupBarrier(); + } + if (lindex == 0) { + rowMaxShared = ${T}(${S("threadShared[0]",_)}); + } + workgroupBarrier(); + + // find the rows sum + var threadSum = ${T}(0.0); + for (var col = lindex; col < cols; col += wg) { + let subExp = exp(getValue(row, col, row_stride) - rowMaxShared); + threadSum += subExp; + } + threadShared[lindex] = threadSum; + workgroupBarrier(); + + for (var currSize = wg >> 1; currSize > 0; currSize = currSize >> 1) { + if (lindex < currSize) { + threadShared[lindex] = threadShared[lindex] + threadShared[lindex + currSize]; + } + workgroupBarrier(); + } + if (lindex == 0) { + rowSumShared = ${T}(${Ke("threadShared[0]",_)}); + } + workgroupBarrier(); + + // calculate final value for each element in the row + for (var col = lindex; col < cols; col += wg) { + let value = exp(getValue(row, col, row_stride) - rowMaxShared) / rowSumShared; + setValue(row, col, row_stride, value); + } + }`,k=e.compute({name:"Softmax",shaderCache:{hint:`${_};${w}`,inputDependencies:["type"]},getRunData:()=>({outputs:[{dims:f,dataType:l.dataType}],dispatchGroup:{x:y},programUniforms:[{type:6,data:b}]}),getShaderSource:A},{inputs:[l],outputs:[d?-1:0]})[0];d&&e.compute(Oe(k,p),{inputs:[k]})},Pc=(e,t)=>{Gy(e.inputs),Hy(e,t)},zc=e=>re({axis:e.axis})});var Dc,Fy,qy,Ky,Bc,Mc=G(()=>{"use strict";te();ae();ce();Dc=e=>Array.from(e.getBigInt64Array(),Number),Fy=e=>{if(!e||e.length!==2)throw new Error("Tile requires 2 inputs.");if(e[0].dataType!==1&&e[0].dataType!==10&&e[0].dataType!==6&&e[0].dataType!==12)throw new Error("Tile only support float, float16, int32, and uint32 data types");if(e[1].dataType!==7)throw new Error("Tile `repeats` input should be of int64 data type");if(e[1].dims.length!==1)throw new Error("Tile `repeats` input should be 1-D");if(Dc(e[1]).length!==e[0].dims.length)throw new Error("Tile `repeats` input should have same number of elements as rank of input data tensor")},qy=(e,t)=>{let n=[];for(let r=0;r{let n=e[0].dims,r=t??Dc(e[1]),o=qy(n,r),a=E.size(o),s=e[0].dataType,d=P("input",s,n.length),l=N("output",s,o.length),p=f=>` + const inputShape = ${d.indices(...n)}; + ${f.registerUniform("output_size","u32").declareVariables(d,l)} + ${f.mainStart()} + ${f.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let output_indices = ${l.offsetToIndices("global_idx")}; + var input_indices: ${d.type.indices}; + for (var i = 0; i < ${n.length}; i++) { + let input_dim_i = ${d.indicesGet("uniforms.input_shape","i")}; + let input_dim_value = ${l.indicesGet("output_indices","i")} % input_dim_i; + + ${d.indicesSet("input_indices","i","input_dim_value")} + } + ${l.setByOffset("global_idx",d.getByIndices("input_indices"))} + }`;return{name:"Tile",shaderCache:{hint:`${r}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:o,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(a/64)},programUniforms:[{type:12,data:a},...H(e[0].dims,o)]}),getShaderSource:p}},Bc=e=>{Fy(e.inputs),e.compute(Ky(e.inputs),{inputs:[0]})}});var jy,Zy,Rc,Uc=G(()=>{"use strict";te();ae();ce();jy=(e,t,n,r,o)=>{let a=N("output_data",o,n.length,4),s=P("a_data",t[1].dataType,t[1].dims.length,4),d=P("b_data",t[2].dataType,t[2].dims.length,4),l=P("c_data",t[0].dataType,t[0].dims.length,4),p,f=(h,y,_)=>`select(${y}, ${h}, ${_})`;if(!r)p=a.setByOffset("global_idx",f(s.getByOffset("global_idx"),d.getByOffset("global_idx"),l.getByOffset("global_idx")));else{let h=(y,_,b="")=>{let w=`a_data[index_a${_}][component_a${_}]`,S=`b_data[index_b${_}][component_b${_}]`,$=`bool(c_data[index_c${_}] & (0xffu << (component_c${_} * 8)))`;return` + let output_indices${_} = ${a.offsetToIndices(`global_idx * 4u + ${_}u`)}; + let offset_a${_} = ${s.broadcastedIndicesToOffset(`output_indices${_}`,a)}; + let offset_b${_} = ${d.broadcastedIndicesToOffset(`output_indices${_}`,a)}; + let offset_c${_} = ${l.broadcastedIndicesToOffset(`output_indices${_}`,a)}; + let index_a${_} = offset_a${_} / 4u; + let index_b${_} = offset_b${_} / 4u; + let index_c${_} = offset_c${_} / 4u; + let component_a${_} = offset_a${_} % 4u; + let component_b${_} = offset_b${_} % 4u; + let component_c${_} = offset_c${_} % 4u; + ${y}[${_}] = ${b}(${f(w,S,$)}); + `};o===9?p=` + var data = vec4(0); + ${h("data",0,"u32")} + ${h("data",1,"u32")} + ${h("data",2,"u32")} + ${h("data",3,"u32")} + output_data[global_idx] = dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(data));`:p=` + ${h("output_data[global_idx]",0)} + ${h("output_data[global_idx]",1)} + ${h("output_data[global_idx]",2)} + ${h("output_data[global_idx]",3)} + `}return` + ${e.registerUniform("vec_size","u32").declareVariables(l,s,d,a)} + ${e.mainStart()} + ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + ${p} + }`},Zy=e=>{let t=e[1].dims,n=e[2].dims,r=e[0].dims,o=e[1].dataType,a=!(E.areEqual(t,n)&&E.areEqual(n,r)),s=t,d=E.size(t);if(a){let p=rt.calcShape(rt.calcShape(t,n,!1),r,!1);if(!p)throw new Error("Can't perform where op on the given tensors");s=p,d=E.size(s)}let l=Math.ceil(d/4);return{name:"Where",shaderCache:{inputDependencies:["rank","rank","rank"]},getShaderSource:p=>jy(p,e,s,a,o),getRunData:()=>({outputs:[{dims:s,dataType:o}],dispatchGroup:{x:Math.ceil(d/64/4)},programUniforms:[{type:12,data:l},...H(r,t,n,s)]})}},Rc=e=>{e.compute(Zy(e.inputs))}});var Nc,Vc=G(()=>{"use strict";_u();qr();$u();Su();dd();wd();xd();Nd();qd();Zd();Xd();nl();al();ul();cl();fl();yl();wl();xl();Cl();Dl();Rl();Nl();Wl();Hl();So();ql();dc();pc();fc();yc();Hr();$c();Sc();Cc();Ec();Oc();Co();Mc();ct();jr();Uc();Nc=new Map([["Abs",[Tu]],["Acos",[Cu]],["Acosh",[Iu]],["Add",[ld]],["ArgMax",[bu,co]],["ArgMin",[yu,co]],["Asin",[Au]],["Asinh",[ku]],["Atan",[Eu]],["Atanh",[Pu]],["Attention",[wu]],["AveragePool",[ec,Jl]],["BatchNormalization",[vu]],["BiasAdd",[xu]],["BiasSplitGelu",[ud]],["Cast",[Ou,zu]],["Ceil",[Bu]],["Clip",[Du]],["Concat",[vd,$d]],["Conv",[wo,_o]],["ConvTranspose",[Fd,Gd]],["Cos",[Mu]],["Cosh",[Ru]],["CumSum",[Kd,jd]],["DepthToSpace",[Qd,Yd]],["DequantizeLinear",[lc,cc]],["Div",[cd]],["Einsum",[tl,rl]],["Elu",[Uu,tr]],["Equal",[pd]],["Erf",[Nu]],["Exp",[Vu]],["Expand",[il]],["FastGelu",[sl]],["Floor",[Wu]],["FusedConv",[wo,_o]],["Gather",[ll,dl]],["GatherElements",[_l,bl]],["GatherBlockQuantized",[hl,gl]],["GatherND",[pl,ml]],["Gelu",[Lu]],["Gemm",[$l,vl]],["GlobalAveragePool",[nc,rc]],["GlobalMaxPool",[uc,sc]],["Greater",[gd]],["GreaterOrEqual",[bd]],["GridSample",[Sl,Tl]],["GroupQueryAttention",[Ol]],["HardSigmoid",[Qu,Zu]],["InstanceNormalization",[Ml]],["LayerNormalization",[Ul]],["LeakyRelu",[Gu,tr]],["Less",[yd]],["LessOrEqual",[_d]],["Log",[id]],["MatMul",[Vl]],["MatMulNBits",[Ll,Gl]],["MaxPool",[ic,ac]],["Mul",[md]],["MultiHeadAttention",[kl,Al]],["Neg",[Fu]],["Not",[Hu]],["Pad",[Fl]],["Pow",[fd]],["QuickGelu",[ad,tr]],["Range",[mc]],["Reciprocal",[qu]],["ReduceMin",[cu]],["ReduceMean",[au]],["ReduceMax",[lu]],["ReduceSum",[mu]],["ReduceProd",[pu]],["ReduceL1",[su]],["ReduceL2",[uu]],["ReduceLogSum",[hu]],["ReduceLogSumExp",[du]],["ReduceSumSquare",[fu]],["Relu",[Ku]],["Resize",[wc,vc]],["RotaryEmbedding",[xc]],["ScatterND",[gc,hc]],["Sigmoid",[ju]],["Sin",[Yu]],["Sinh",[Xu]],["Slice",[Ac,kc]],["SkipLayerNormalization",[Tc]],["Split",[El,Pl]],["Sqrt",[Ju]],["Softmax",[Pc,zc]],["Sub",[hd]],["Tan",[ed]],["Tanh",[rd]],["ThresholdedRelu",[od,tr]],["Tile",[Bc]],["Transpose",[Ks,js]],["Where",[Rc]]])});var on,Wc=G(()=>{"use strict";Ge();tt();ce();on=class{constructor(t){this.backend=t;this.repo=new Map,this.attributesBound=!1}getArtifact(t){return this.repo.get(t)}setArtifact(t,n){this.repo.set(t,n)}run(t,n,r,o,a){Ne(t.programInfo.name);let s=this.backend.device,d=this.backend.getComputePassEncoder();this.backend.writeTimestamp(this.backend.pendingDispatchNumber*2);let l=[];for(let f of n)l.push({binding:l.length,resource:{buffer:f.buffer}});for(let f of r)l.push({binding:l.length,resource:{buffer:f.buffer}});a&&l.push({binding:l.length,resource:a});let p=s.createBindGroup({layout:t.computePipeline.getBindGroupLayout(0),entries:l,label:t.programInfo.name});if(this.backend.sessionStatus==="capturing"){let f={kernelId:this.backend.currentKernelId,computePipeline:t.computePipeline,bindGroup:p,dispatchGroup:o};this.backend.capturedCommandList.get(this.backend.currentSessionId).push(f)}d.setPipeline(t.computePipeline),d.setBindGroup(0,p),d.dispatchWorkgroups(...o),this.backend.writeTimestamp(this.backend.pendingDispatchNumber*2+1),this.backend.pendingDispatchNumber++,(this.backend.pendingDispatchNumber>=this.backend.maxDispatchNumber||this.backend.queryType==="at-passes")&&this.backend.endComputePass(),this.backend.pendingDispatchNumber>=this.backend.maxDispatchNumber&&this.backend.flush(),Be(t.programInfo.name)}dispose(){}build(t,n){Ne(t.name);let r=this.backend.device,o=[];[{feature:"shader-f16",extension:"f16"},{feature:"subgroups",extension:"subgroups"},{feature:"subgroups-f16",extension:"subgroups_f16"}].forEach(h=>{r.features.has(h.feature)&&o.push(`enable ${h.extension};`)});let s=Fs(n,this.backend.device.limits),d=t.getShaderSource(s),l=`${o.join(` +`)} +${s.additionalImplementations} +${d}`,p=r.createShaderModule({code:l,label:t.name});me("verbose",()=>`[WebGPU] ${t.name} shader code: ${l}`);let f=r.createComputePipeline({compute:{module:p,entryPoint:"main"},layout:"auto",label:t.name});return Be(t.name),{programInfo:t,computePipeline:f,uniformVariablesInfo:s.variablesInfo}}normalizeDispatchGroupSize(t){let n=typeof t=="number"?t:t.x,r=typeof t=="number"?1:t.y||1,o=typeof t=="number"?1:t.z||1,a=this.backend.device.limits.maxComputeWorkgroupsPerDimension;if(n<=a&&r<=a&&o<=a)return[n,r,o];let s=n*r*o,d=Math.ceil(Math.sqrt(s));if(d>a){if(d=Math.ceil(Math.cbrt(s)),d>a)throw new Error("Total dispatch size exceeds WebGPU maximum.");return[d,d,d]}else return[d,d,1]}}});var Qy,Yy,Io,Ao,an,Lc=G(()=>{"use strict";Ge();te();tt();Jn();Ws();Vc();Wc();Qy=(e,t)=>{if(t.length!==e.length)throw new Error(`inputDependencies length ${t.length} is not equal to inputTensors length ${e.length}.`);let n=[];for(let r=0;r{let r=e.name;return e.shaderCache?.hint&&(r+="["+e.shaderCache.hint+"]"),r+=":"+n+`:${Qy(t,e.shaderCache?.inputDependencies??new Array(t.length).fill("dims"))}`,r},Io=class{constructor(t){t&&(this.architecture=t.architecture,this.vendor=t.vendor)}isArchitecture(t){return this.architecture===t}isVendor(t){return this.vendor===t}},Ao=class{constructor(t){this.subgroupsSupported=t.features.has("subgroups"),this.subgroupsF16Supported=t.features.has("subgroups");let n=t.limits;!this.subgroupsSupported||!n.minSubgroupSize||!n.maxSubgroupSize?this.subgroupSizeRange=void 0:this.subgroupSizeRange=[n.minSubgroupSize,n.maxSubgroupSize]}},an=class{constructor(){this.currentSessionId=null;this.currentKernelId=null;this.commandEncoder=null;this.computePassEncoder=null;this.maxDispatchNumber=16;this.pendingDispatchNumber=0;this.pendingKernels=[];this.pendingQueries=new Map;this.sessionStatus="default";this.capturedCommandList=new Map;this.capturedPendingKernels=new Map;this.sessionExternalDataMapping=new Map}get currentKernelCustomData(){if(this.currentKernelId===null)throw new Error("currentKernelCustomData(): currentKernelId is null. (should not happen)");let t=this.kernelCustomData.get(this.currentKernelId);return t||(t={},this.kernelCustomData.set(this.currentKernelId,t)),t}async initialize(t,n){this.env=t;let r=[],o={requiredLimits:{maxComputeWorkgroupStorageSize:n.limits.maxComputeWorkgroupStorageSize,maxComputeWorkgroupsPerDimension:n.limits.maxComputeWorkgroupsPerDimension,maxStorageBufferBindingSize:n.limits.maxStorageBufferBindingSize,maxBufferSize:n.limits.maxBufferSize,maxComputeInvocationsPerWorkgroup:n.limits.maxComputeInvocationsPerWorkgroup,maxComputeWorkgroupSizeX:n.limits.maxComputeWorkgroupSizeX,maxComputeWorkgroupSizeY:n.limits.maxComputeWorkgroupSizeY,maxComputeWorkgroupSizeZ:n.limits.maxComputeWorkgroupSizeZ},requiredFeatures:r},a=s=>n.features.has(s)&&r.push(s)&&!0;a("chromium-experimental-timestamp-query-inside-passes")||a("timestamp-query"),a("shader-f16"),a("subgroups")&&a("subgroups-f16"),this.device=await n.requestDevice(o),this.deviceInfo=new Ao(this.device),this.adapterInfo=new Io(n.info||await n.requestAdapterInfo()),this.gpuDataManager=Vs(this),this.programManager=new on(this),this.kernels=new Map,this.kernelPersistentData=new Map,this.kernelCustomData=new Map,Ur(t.logLevel,!!t.debug),this.device.onuncapturederror=s=>{s.error instanceof GPUValidationError&&console.error(`An uncaught WebGPU validation error was raised: ${s.error.message}`)},Object.defineProperty(this.env.webgpu,"device",{value:this.device,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(this.env.webgpu,"adapter",{value:n,writable:!1,enumerable:!0,configurable:!1}),this.setQueryType()}dispose(){typeof this.querySet<"u"&&this.querySet.destroy(),this.gpuDataManager.dispose()}getCommandEncoder(){return this.commandEncoder||(this.commandEncoder=this.device.createCommandEncoder()),this.commandEncoder}getComputePassEncoder(){if(!this.computePassEncoder){let t=this.getCommandEncoder(),n={};this.queryType==="at-passes"&&(n.timestampWrites={querySet:this.querySet,beginningOfPassWriteIndex:this.pendingDispatchNumber*2,endOfPassWriteIndex:this.pendingDispatchNumber*2+1}),this.computePassEncoder=t.beginComputePass(n)}return this.computePassEncoder}endComputePass(){this.computePassEncoder&&(this.computePassEncoder.end(),this.computePassEncoder=null)}flush(){if(!this.commandEncoder)return;Ne(),this.endComputePass();let t;this.queryType!=="none"&&(this.commandEncoder.resolveQuerySet(this.querySet,0,this.pendingDispatchNumber*2,this.queryResolveBuffer,0),t=this.device.createBuffer({size:this.pendingDispatchNumber*2*8,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),this.pendingQueries.set(t,this.pendingKernels),this.pendingKernels=[],this.commandEncoder.copyBufferToBuffer(this.queryResolveBuffer,0,t,0,this.pendingDispatchNumber*2*8)),this.device.queue.submit([this.commandEncoder.finish()]),this.gpuDataManager.refreshPendingBuffers(),this.commandEncoder=null,this.pendingDispatchNumber=0,this.queryType!=="none"&&t.mapAsync(GPUMapMode.READ).then(()=>{let n=new BigUint64Array(t.getMappedRange()),r=this.pendingQueries.get(t);for(let o=0;o"u"&&(this.queryTimeBase=_);let w=Number(_-this.queryTimeBase),S=Number(b-this.queryTimeBase);if(!Number.isSafeInteger(w)||!Number.isSafeInteger(S))throw new RangeError("incorrect timestamp range");if(this.env.webgpu.profiling?.ondata)this.env.webgpu.profiling.ondata({version:1,inputsMetadata:h.map($=>({dims:$.dims,dataType:_t($.dataType)})),outputsMetadata:y.map($=>({dims:$.dims,dataType:_t($.dataType)})),kernelId:s,kernelType:l,kernelName:p,programName:f,startTime:w,endTime:S});else{let $="";h.forEach((T,C)=>{$+=`input[${C}]: [${T.dims}] | ${_t(T.dataType)}, `});let v="";y.forEach((T,C)=>{v+=`output[${C}]: [${T.dims}] | ${_t(T.dataType)}, `}),console.log(`[profiling] kernel "${s}|${l}|${p}|${f}" ${$}${v}execution time: ${S-w} ns`)}vr("GPU",`${f}::${_}::${b}`)}t.unmap(),this.pendingQueries.delete(t)}),Be()}run(t,n,r,o,a,s){Ne(t.name);let d=[];for(let T=0;TC):r;if(h.length!==l.length)throw new Error(`Output size ${h.length} must be equal to ${l.length}.`);let y=[],_=[];for(let T=0;T=s)throw new Error(`Invalid output index: ${h[T]}`);if(h[T]===-3)continue;let C=h[T]===-1,A=h[T]===-2,k=C||A?a(l[T].dataType,l[T].dims):o(h[T],l[T].dataType,l[T].dims);if(y.push(k),k.data===0)continue;let O=this.gpuDataManager.get(k.data);if(!O)throw new Error(`no GPU data for output: ${k.data}`);if(C&&this.temporaryData.push(O),A){let M=this.kernelPersistentData.get(this.currentKernelId);M||(M=[],this.kernelPersistentData.set(this.currentKernelId,M)),M.push(O)}_.push(O)}if(d.length!==n.length||_.length!==y.length){if(_.length===0)return Be(t.name),y;throw new Error(`Program ${t.name} has zero-sized tensor(s) in inputs or outputs. This is not supported now.`)}let b;if(f){let T=0,C=[];f.forEach(M=>{let V=typeof M.data=="number"?[M.data]:M.data;if(V.length===0)return;let F=M.type===10?2:4,j,ne;M.type===10?(ne=V.length>4?16:V.length>2?8:V.length*F,j=V.length>4?16:F*V.length):(ne=V.length<=2?V.length*F:16,j=16),T=Math.ceil(T/ne)*ne,C.push(T);let W=M.type===10?8:4;T+=V.length>4?Math.ceil(V.length/W)*j:V.length*F});let A=16;T=Math.ceil(T/A)*A;let k=new ArrayBuffer(T);f.forEach((M,V)=>{let F=C[V],j=typeof M.data=="number"?[M.data]:M.data;if(M.type===6)new Int32Array(k,F,j.length).set(j);else if(M.type===12)new Uint32Array(k,F,j.length).set(j);else if(M.type===10)new Uint16Array(k,F,j.length).set(j);else if(M.type===1)new Float32Array(k,F,j.length).set(j);else throw new Error(`Unsupported uniform type: ${_t(M.type)}`)});let O=this.gpuDataManager.create(T,GPUBufferUsage.COPY_DST|GPUBufferUsage.UNIFORM);this.device.queue.writeBuffer(O.buffer,0,k,0,T),this.gpuDataManager.release(O.id),b={offset:0,size:T,buffer:O.buffer}}let w=this.programManager.normalizeDispatchGroupSize(p),S=w[1]===1&&w[2]===1,$=Yy(t,n,S),v=this.programManager.getArtifact($);if(v||(v=this.programManager.build(t,w),this.programManager.setArtifact($,v),me("info",()=>`[artifact] key: ${$}, programName: ${t.name}`)),f&&v.uniformVariablesInfo){if(f.length!==v.uniformVariablesInfo.length)throw new Error(`Uniform variables count mismatch: expect ${v.uniformVariablesInfo.length}, got ${f.length} in program "${v.programInfo.name}".`);for(let T=0;T`[ProgramManager] run "${t.name}" (key=${$}) with ${w[0]}x${w[1]}x${w[2]}`),this.queryType!=="none"||this.sessionStatus==="capturing"){let T={kernelId:this.currentKernelId,programName:v.programInfo.name,inputTensorViews:n,outputTensorViews:y};this.pendingKernels.push(T),this.sessionStatus==="capturing"&&this.capturedPendingKernels.get(this.currentSessionId).push(T)}return this.programManager.run(v,d,_,w,b),Be(t.name),y}upload(t,n){this.gpuDataManager.upload(t,n)}memcpy(t,n){this.gpuDataManager.memcpy(t,n)}async download(t,n){await this.gpuDataManager.download(t,n)}alloc(t){return this.gpuDataManager.create(t).id}free(t){return this.gpuDataManager.release(t)}createKernel(t,n,r,o){let a=Nc.get(t);if(!a)throw new Error(`kernel not implemented: ${t}`);let s={kernelType:t,kernelName:o,kernelEntry:a[0],attributes:[a[1],r]};this.kernels.set(n,s)}releaseKernel(t){let n=this.kernelPersistentData.get(t);if(n){for(let r of n)this.gpuDataManager.release(r.id);this.kernelPersistentData.delete(t)}this.kernelCustomData.delete(t),this.kernels.delete(t)}computeKernel(t,n,r){let o=this.kernels.get(t);if(!o)throw new Error(`kernel not created: ${t}`);let a=o.kernelType,s=o.kernelName,d=o.kernelEntry,l=o.attributes;if(this.currentKernelId!==null)throw new Error(`kernel "[${a}] ${s}" is not allowed to be called recursively`);this.currentKernelId=t,l[0]&&(l[1]=l[0](l[1]),l[0]=void 0),me("info",()=>`[WebGPU] Start to run kernel "[${a}] ${s}"...`);let p=this.env.debug;this.temporaryData=[];try{return p&&this.device.pushErrorScope("validation"),d(n,l[1]),0}catch(f){return r.push(Promise.resolve(`[WebGPU] Kernel "[${a}] ${s}" failed. ${f}`)),1}finally{p&&r.push(this.device.popErrorScope().then(f=>f?`GPU validation error for kernel "[${a}] ${s}": ${f.message}`:null));for(let f of this.temporaryData)this.gpuDataManager.release(f.id);this.temporaryData=[],this.currentKernelId=null}}registerBuffer(t,n,r,o){let a=this.sessionExternalDataMapping.get(t);a||(a=new Map,this.sessionExternalDataMapping.set(t,a));let s=a.get(n),d=this.gpuDataManager.registerExternalBuffer(r,o,s);return a.set(n,[d,r]),d}unregisterBuffers(t){let n=this.sessionExternalDataMapping.get(t);n&&(n.forEach(r=>this.gpuDataManager.unregisterExternalBuffer(r[0])),this.sessionExternalDataMapping.delete(t))}getBuffer(t){let n=this.gpuDataManager.get(t);if(!n)throw new Error(`no GPU data for buffer: ${t}`);return n.buffer}createDownloader(t,n,r){return async()=>{let o=await no(this,t,n);return Nr(o.buffer,r)}}writeTimestamp(t){this.queryType==="inside-passes"&&this.computePassEncoder.writeTimestamp(this.querySet,t)}setQueryType(){this.queryType="none",(this.env.webgpu.profiling?.mode==="default"||(typeof this.env.trace>"u"?this.env.wasm.trace:this.env.trace))&&(this.device.features.has("chromium-experimental-timestamp-query-inside-passes")?this.queryType="inside-passes":this.device.features.has("timestamp-query")&&(this.queryType="at-passes"),this.queryType!=="none"&&typeof this.querySet>"u"&&(this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxDispatchNumber*2}),this.queryResolveBuffer=this.device.createBuffer({size:this.maxDispatchNumber*2*8,usage:GPUBufferUsage.COPY_SRC|GPUBufferUsage.QUERY_RESOLVE})))}captureBegin(){me("info","captureBegin"),this.capturedCommandList.get(this.currentSessionId)||this.capturedCommandList.set(this.currentSessionId,[]),this.capturedPendingKernels.get(this.currentSessionId)||this.capturedPendingKernels.set(this.currentSessionId,[]),this.flush(),this.sessionStatus="capturing"}captureEnd(){me("info","captureEnd"),this.flush(),this.sessionStatus="default"}replay(){me("info","replay"),this.sessionStatus="replaying";let t=this.capturedCommandList.get(this.currentSessionId),n=this.capturedPendingKernels.get(this.currentSessionId),r=t.length;this.pendingKernels=[];for(let o=0;o=this.maxDispatchNumber||this.queryType==="at-passes")&&this.endComputePass(),this.pendingDispatchNumber>=this.maxDispatchNumber&&this.flush()}this.flush(),this.sessionStatus="default"}onCreateSession(){this.gpuDataManager.onCreateSession()}onReleaseSession(t){this.unregisterBuffers(t),this.capturedCommandList.has(t)&&this.capturedCommandList.delete(t),this.capturedPendingKernels.has(t)&&this.capturedPendingKernels.delete(t),this.gpuDataManager.onReleaseSession(t)}onRunStart(t){this.currentSessionId=t,this.setQueryType()}}});var Xy,Gc,Jy,Hc,sn,un,ko,Fc,qc=G(()=>{"use strict";tt();Xy=1,Gc=()=>Xy++,Jy=new Map([["float32",32],["float16",16],["int32",32],["uint32",32],["int64",64],["uint64",64],["int8",8],["uint8",8],["int4",4],["uint4",4]]),Hc=(e,t)=>{let n=Jy.get(e);if(!n)throw new Error("Unsupported data type.");return t.length>0?Math.ceil(t.reduce((r,o)=>r*o)*n/8):0},sn=class{constructor(t){this.sessionId=t.sessionId,this.mlContext=t.context,this.mlTensor=t.tensor,this.dataType=t.dataType,this.tensorShape=t.shape}get tensor(){return this.mlTensor}get type(){return this.dataType}get shape(){return this.tensorShape}get byteLength(){return Hc(this.dataType,this.tensorShape)}destroy(){me("verbose",()=>"[WebNN] TensorWrapper.destroy"),this.mlTensor.destroy()}write(t){this.mlContext.writeTensor(this.mlTensor,t)}async read(t){return t?this.mlContext.readTensor(this.mlTensor,t):this.mlContext.readTensor(this.mlTensor)}canReuseTensor(t,n,r){return this.mlContext===t&&this.dataType===n&&this.tensorShape.length===r.length&&this.tensorShape.every((o,a)=>o===r[a])}},un=class{constructor(t,n){this.tensorManager=t;this.wrapper=n}get tensorWrapper(){return this.wrapper}releaseTensor(){this.tensorWrapper&&(this.tensorManager.releaseTensor(this.tensorWrapper),this.wrapper=void 0)}async ensureTensor(t,n,r,o){let a=this.tensorManager.getMLContext(t);if(this.wrapper){if(this.wrapper.canReuseTensor(a,n,r))return this.wrapper.tensor;if(o){if(this.wrapper.byteLength!==Hc(n,r))throw new Error("Unable to copy data to tensor with different size.");this.activeUpload=new Uint8Array(await this.wrapper.read())}this.tensorManager.releaseTensor(this.wrapper)}let s=typeof MLTensorUsage>"u"?void 0:MLTensorUsage.READ|MLTensorUsage.WRITE;return this.wrapper=await this.tensorManager.getCachedTensor(t,n,r,s,!0,!0),o&&this.activeUpload&&(this.wrapper.write(this.activeUpload),this.activeUpload=void 0),this.wrapper.tensor}upload(t){if(this.wrapper)if(t.byteLength===this.wrapper.byteLength){this.wrapper.write(t);return}else me("verbose",()=>"Data size does not match tensor size. Releasing tensor."),this.releaseTensor();this.activeUpload?this.activeUpload.set(t):this.activeUpload=new Uint8Array(t)}async download(t){if(this.activeUpload)if(t){t instanceof ArrayBuffer?new Uint8Array(t).set(this.activeUpload):new Uint8Array(t.buffer,t.byteOffset,t.byteLength).set(this.activeUpload);return}else return this.activeUpload.buffer;if(!this.wrapper)throw new Error("Tensor has not been created.");return t?this.wrapper.read(t):this.wrapper.read()}},ko=class{constructor(t){this.backend=t;this.tensorTrackersById=new Map;this.freeTensors=[];this.externalTensors=new Set}getMLContext(t){let n=this.backend.getMLContext(t);if(!n)throw new Error("MLContext not found for session.");return n}reserveTensorId(){let t=Gc();return this.tensorTrackersById.set(t,new un(this)),t}releaseTensorId(t){let n=this.tensorTrackersById.get(t);n&&(this.tensorTrackersById.delete(t),n.tensorWrapper&&this.releaseTensor(n.tensorWrapper))}async ensureTensor(t,n,r,o,a){me("verbose",()=>`[WebNN] TensorManager.ensureTensor {tensorId: ${n}, dataType: ${r}, shape: ${o}, copyOld: ${a}}`);let s=this.tensorTrackersById.get(n);if(!s)throw new Error("Tensor not found.");return s.ensureTensor(t,r,o,a)}upload(t,n){let r=this.tensorTrackersById.get(t);if(!r)throw new Error("Tensor not found.");r.upload(n)}async download(t,n){me("verbose",()=>`[WebNN] TensorManager.download {tensorId: ${t}, dstBuffer: ${n?.byteLength}}`);let r=this.tensorTrackersById.get(t);if(!r)throw new Error("Tensor not found.");return r.download(n)}releaseTensorsForSession(t){for(let n of this.freeTensors)n.sessionId===t&&n.destroy();this.freeTensors=this.freeTensors.filter(n=>n.sessionId!==t)}registerTensor(t,n,r,o){let a=this.getMLContext(t),s=Gc(),d=new sn({sessionId:t,context:a,tensor:n,dataType:r,shape:o});return this.tensorTrackersById.set(s,new un(this,d)),this.externalTensors.add(d),s}async getCachedTensor(t,n,r,o,a,s){let d=this.getMLContext(t);for(let[p,f]of this.freeTensors.entries())if(f.canReuseTensor(d,n,r)){me("verbose",()=>`[WebNN] Reusing tensor {dataType: ${n}, shape: ${r}}`);let h=this.freeTensors.splice(p,1)[0];return h.sessionId=t,h}me("verbose",()=>`[WebNN] MLContext.createTensor {dataType: ${n}, shape: ${r}}`);let l=await d.createTensor({dataType:n,shape:r,dimensions:r,usage:o,writable:a,readable:s});return new sn({sessionId:t,context:d,tensor:l,dataType:n,shape:r})}releaseTensor(t){this.externalTensors.has(t)&&this.externalTensors.delete(t),this.freeTensors.push(t)}},Fc=(...e)=>new ko(...e)});var Eo,eb,dn,Kc=G(()=>{"use strict";te();bt();Jn();qc();tt();Eo=new Map([[1,"float32"],[10,"float16"],[6,"int32"],[12,"uint32"],[7,"int64"],[13,"uint64"],[22,"int4"],[21,"uint4"],[3,"int8"],[2,"uint8"],[9,"uint8"]]),eb=(e,t)=>{if(e===t)return!0;if(e===void 0||t===void 0)return!1;let n=Object.keys(e).sort(),r=Object.keys(t).sort();return n.length===r.length&&n.every((o,a)=>o===r[a]&&e[o]===t[o])},dn=class{constructor(t){this.tensorManager=Fc(this);this.mlContextBySessionId=new Map;this.sessionIdsByMLContext=new Map;this.mlContextCache=[];this.sessionGraphInputs=new Map;this.temporaryGraphInputs=[];this.temporarySessionTensorIds=new Map;Ur(t.logLevel,!!t.debug)}get currentSessionId(){if(this.activeSessionId===void 0)throw new Error("No active session");return this.activeSessionId}onRunStart(t){me("verbose",()=>`[WebNN] onRunStart {sessionId: ${t}}`),this.activeSessionId=t}onRunEnd(t){me("verbose",()=>`[WebNN] onRunEnd {sessionId: ${t}}`);let n=this.temporarySessionTensorIds.get(t);if(n){for(let r of n)me("verbose",()=>`[WebNN] releasing temporary tensor {tensorId: ${r}}`),this.tensorManager.releaseTensorId(r);this.temporarySessionTensorIds.delete(t),this.activeSessionId=void 0}}async createMLContext(t){if(t instanceof GPUDevice){let r=this.mlContextCache.findIndex(o=>o.gpuDevice===t);if(r!==-1)return this.mlContextCache[r].mlContext;{let o=await navigator.ml.createContext(t);return this.mlContextCache.push({gpuDevice:t,mlContext:o}),o}}else if(t===void 0){let r=this.mlContextCache.findIndex(o=>o.options===void 0&&o.gpuDevice===void 0);if(r!==-1)return this.mlContextCache[r].mlContext;{let o=await navigator.ml.createContext();return this.mlContextCache.push({mlContext:o}),o}}let n=this.mlContextCache.findIndex(r=>eb(r.options,t));if(n!==-1)return this.mlContextCache[n].mlContext;{let r=await navigator.ml.createContext(t);return this.mlContextCache.push({options:t,mlContext:r}),r}}registerMLContext(t,n){this.mlContextBySessionId.set(t,n);let r=this.sessionIdsByMLContext.get(n);r||(r=new Set,this.sessionIdsByMLContext.set(n,r)),r.add(t),this.temporaryGraphInputs.length>0&&(this.sessionGraphInputs.set(t,this.temporaryGraphInputs),this.temporaryGraphInputs=[])}onReleaseSession(t){this.sessionGraphInputs.delete(t);let n=this.mlContextBySessionId.get(t);if(!n)return;this.tensorManager.releaseTensorsForSession(t),this.mlContextBySessionId.delete(t);let r=this.sessionIdsByMLContext.get(n);if(r.delete(t),r.size===0){this.sessionIdsByMLContext.delete(n);let o=this.mlContextCache.findIndex(a=>a.mlContext===n);o!==-1&&this.mlContextCache.splice(o,1)}}getMLContext(t){return this.mlContextBySessionId.get(t)}reserveTensorId(){return this.tensorManager.reserveTensorId()}releaseTensorId(t){me("verbose",()=>`[WebNN] releaseTensorId {tensorId: ${t}}`),this.tensorManager.releaseTensorId(t)}async ensureTensor(t,n,r,o,a){let s=Eo.get(r);if(!s)throw new Error(`Unsupported ONNX data type: ${r}`);return this.tensorManager.ensureTensor(t??this.currentSessionId,n,s,o,a)}async createTemporaryTensor(t,n,r){me("verbose",()=>`[WebNN] createTemporaryTensor {onnxDataType: ${n}, shape: ${r}}`);let o=Eo.get(n);if(!o)throw new Error(`Unsupported ONNX data type: ${n}`);let a=this.tensorManager.reserveTensorId();await this.tensorManager.ensureTensor(t,a,o,r,!1);let s=this.temporarySessionTensorIds.get(t);return s?s.push(a):this.temporarySessionTensorIds.set(t,[a]),a}uploadTensor(t,n){if(!Ie().shouldTransferToMLTensor)throw new Error("Trying to upload to a MLTensor while shouldTransferToMLTensor is false");me("verbose",()=>`[WebNN] uploadTensor {tensorId: ${t}, data: ${n.byteLength}}`),this.tensorManager.upload(t,n)}async downloadTensor(t,n){return this.tensorManager.download(t,n)}createMLTensorDownloader(t,n){return async()=>{let r=await this.tensorManager.download(t);return Nr(r,n)}}registerMLTensor(t,n,r,o){let a=Eo.get(r);if(!a)throw new Error(`Unsupported ONNX data type: ${r}`);let s=this.tensorManager.registerTensor(t,n,a,o);return me("verbose",()=>`[WebNN] registerMLTensor {tensor: ${n}, dataType: ${a}, dimensions: ${o}} -> {tensorId: ${s}}`),s}registerMLConstant(t,n,r,o,a,s){if(!s)throw new Error("External mounted files are not available.");let d=t;t.startsWith("./")&&(d=t.substring(2));let l=s.get(d);if(!l)throw new Error(`File with name ${d} not found in preloaded files.`);if(n+r>l.byteLength)throw new Error("Out of bounds: data offset and length exceed the external file data size.");let p=l.slice(n,n+r).buffer,f;switch(a.dataType){case"float32":f=new Float32Array(p);break;case"float16":f=new Uint16Array(p);break;case"int32":f=new Int32Array(p);break;case"uint32":f=new Uint32Array(p);break;case"int64":f=new BigInt64Array(p);break;case"uint64":f=new BigUint64Array(p);break;case"int8":f=new Int8Array(p);break;case"int4":case"uint4":case"uint8":f=new Uint8Array(p);break;default:throw new Error(`Unsupported data type: ${a.dataType} in creating WebNN Constant from external data.`)}return me("verbose",()=>`[WebNN] registerMLConstant {dataType: ${a.dataType}, shape: ${a.shape}}}`),o.constant(a,f)}registerGraphInput(t){this.temporaryGraphInputs.push(t)}isGraphInput(t,n){let r=this.sessionGraphInputs.get(t);return r?r.includes(n):!1}flush(){}}});var jc={};Zt(jc,{init:()=>tb});var ir,Po,tb,Zc=G(()=>{"use strict";te();Lc();tt();ae();Kc();ir=class e{constructor(t,n,r,o){this.module=t;this.dataType=n;this.data=r;this.dims=o}getFloat32Array(){if(this.dataType!==1)throw new Error("Invalid data type");let t=E.size(this.dims);return t===0?new Float32Array:new Float32Array(this.module.HEAP8.buffer,this.data,t)}getBigInt64Array(){if(this.dataType!==7)throw new Error("Invalid data type");let t=E.size(this.dims);return t===0?new BigInt64Array:new BigInt64Array(this.module.HEAP8.buffer,this.data,t)}getInt32Array(){if(this.dataType!==6)throw new Error("Invalid data type");let t=E.size(this.dims);return t===0?new Int32Array:new Int32Array(this.module.HEAP8.buffer,this.data,t)}getUint16Array(){if(this.dataType!==10&&this.dataType!==4)throw new Error("Invalid data type");let t=E.size(this.dims);return t===0?new Uint16Array:new Uint16Array(this.module.HEAP8.buffer,this.data,t)}reshape(t){if(E.size(t)!==E.size(this.dims))throw new Error("Invalid new shape");return new e(this.module,this.dataType,this.data,t)}},Po=class{constructor(t,n,r){this.module=t;this.backend=n;this.customDataOffset=0;this.customDataSize=0;this.adapterInfo=n.adapterInfo,this.deviceInfo=n.deviceInfo;let o=t.PTR_SIZE,a=r/t.PTR_SIZE,s=o===4?"i32":"i64";this.opKernelContext=Number(t.getValue(o*a++,s));let d=Number(t.getValue(o*a++,s));this.outputCount=Number(t.getValue(o*a++,s)),this.customDataOffset=Number(t.getValue(o*a++,"*")),this.customDataSize=Number(t.getValue(o*a++,s));let l=[];for(let p=0;ptypeof d=="number"?this.inputs[d]:d)??this.inputs,o=n?.outputs??[],a=(d,l,p)=>new ir(this.module,l,this.output(d,p),p),s=(d,l)=>{let p=wt(d,l);if(!p)throw new Error(`Unsupported data type: ${d}`);let f=p>0?this.backend.gpuDataManager.create(p).id:0;return new ir(this.module,d,f,l)};return this.backend.run(t,r,o,a,s,this.outputCount)}output(t,n){let r=this.module.stackSave();try{let o=this.module.PTR_SIZE,a=o===4?"i32":"i64",s=this.module.stackAlloc((1+n.length)*o);this.module.setValue(s,n.length,a);for(let d=0;d{let o=t.jsepInit;if(!o)throw new Error("Failed to initialize JSEP. The WebAssembly module is not built with JSEP support.");if(e==="webgpu"){let a=new an;await a.initialize(n,r),o("webgpu",[a,s=>a.alloc(Number(s)),s=>a.free(s),(s,d,l,p=!1)=>{if(p)me("verbose",()=>`[WebGPU] jsepCopyGpuToGpu: src=${Number(s)}, dst=${Number(d)}, size=${Number(l)}`),a.memcpy(Number(s),Number(d));else{me("verbose",()=>`[WebGPU] jsepCopyCpuToGpu: dataOffset=${Number(s)}, gpuDataId=${Number(d)}, size=${Number(l)}`);let f=t.HEAPU8.subarray(Number(s>>>0),Number(s>>>0)+Number(l));a.upload(Number(d),f)}},async(s,d,l)=>{me("verbose",()=>`[WebGPU] jsepCopyGpuToCpu: gpuDataId=${s}, dataOffset=${d}, size=${l}`),await a.download(Number(s),()=>t.HEAPU8.subarray(Number(d)>>>0,Number(d+l)>>>0))},(s,d,l)=>a.createKernel(s,Number(d),l,t.UTF8ToString(t._JsepGetNodeName(Number(d)))),s=>a.releaseKernel(s),(s,d,l,p)=>{me("verbose",()=>`[WebGPU] jsepRun: sessionHandle=${l}, kernel=${s}, contextDataOffset=${d}`);let f=new Po(t,a,Number(d));return a.computeKernel(Number(s),f,p)},()=>a.captureBegin(),()=>a.captureEnd(),()=>a.replay()])}else{let a=new dn(n);o("webnn",[a,()=>a.reserveTensorId(),s=>a.releaseTensorId(s),async(s,d,l,p,f)=>a.ensureTensor(s,d,l,p,f),(s,d)=>{a.uploadTensor(s,d)},async(s,d)=>a.downloadTensor(s,d)])}}});var rb,Cr,Ir,zt,nb,Yt,Ar,kr,Qc,Er,Pr,zr,qn=G(()=>{"use strict";zs();Ds();te();bt();Dr();Xn();rb=(e,t)=>{Ie()._OrtInit(e,t)!==0&&he("Can't initialize onnxruntime.")},Cr=async e=>{rb(e.wasm.numThreads,Jt(e.logLevel))},Ir=async(e,t)=>{{let n=(Zc(),br(jc)).init;if(t==="webgpu"){if(typeof navigator>"u"||!navigator.gpu)throw new Error("WebGPU is not supported in current environment");let r=e.webgpu.adapter;if(r){if(typeof r.limits!="object"||typeof r.features!="object"||typeof r.requestDevice!="function")throw new Error("Invalid GPU adapter set in `env.webgpu.adapter`. It must be a GPUAdapter object.")}else{let o=e.webgpu.powerPreference;if(o!==void 0&&o!=="low-power"&&o!=="high-performance")throw new Error(`Invalid powerPreference setting: "${o}"`);let a=e.webgpu.forceFallbackAdapter;if(a!==void 0&&typeof a!="boolean")throw new Error(`Invalid forceFallbackAdapter setting: "${a}"`);if(r=await navigator.gpu.requestAdapter({powerPreference:o,forceFallbackAdapter:a}),!r)throw new Error('Failed to get GPU adapter. You may need to enable flag "--enable-unsafe-webgpu" if you are using Chrome.')}await n("webgpu",Ie(),e,r)}if(t==="webnn"){if(typeof navigator>"u"||!navigator.ml)throw new Error("WebNN is not supported in current environment");await n("webnn",Ie(),e)}}},zt=new Map,nb=e=>{let t=Ie(),n=t.stackSave();try{let r=t.PTR_SIZE,o=t.stackAlloc(2*r);t._OrtGetInputOutputCount(e,o,o+r)!==0&&he("Can't get session input/output count.");let s=r===4?"i32":"i64";return[Number(t.getValue(o,s)),Number(t.getValue(o+r,s))]}finally{t.stackRestore(n)}},Yt=e=>{let t=Ie(),n=t._malloc(e.byteLength);if(n===0)throw new Error(`Can't create a session. failed to allocate a buffer of size ${e.byteLength}.`);return t.HEAPU8.set(e,n),[n,e.byteLength]},Ar=async(e,t)=>{let n,r,o=Ie();Array.isArray(e)?[n,r]=e:e.buffer===o.HEAPU8.buffer?[n,r]=[e.byteOffset,e.byteLength]:[n,r]=Yt(e);let a=0,s=0,d=0,l=[],p=[],f=[];try{if([s,l]=Os(t),t?.externalData&&o.mountExternalData){let v=[];for(let T of t.externalData){let C=typeof T=="string"?T:T.path;v.push(er(typeof T=="string"?T:T.data).then(A=>{o.mountExternalData(C,A)}))}await Promise.all(v)}for(let v of t?.executionProviders??[])if((typeof v=="string"?v:v.name)==="webnn"){if(o.shouldTransferToMLTensor=!1,typeof v!="string"){let C=v,A=C?.context,k=C?.gpuDevice,O=C?.deviceType,M=C?.powerPreference;A?o.currentContext=A:k?o.currentContext=await o.jsepCreateMLContext(k):o.currentContext=await o.jsepCreateMLContext({deviceType:O,powerPreference:M})}else o.currentContext=await o.jsepCreateMLContext();break}a=await o._OrtCreateSession(n,r,s),a===0&&he("Can't create a session."),o.jsepOnCreateSession?.(),o.currentContext&&(o.jsepRegisterMLContext(a,o.currentContext),o.currentContext=void 0,o.shouldTransferToMLTensor=!0);let[h,y]=nb(a),_=!!t?.enableGraphCapture,b=[],w=[],S=[];for(let v=0;vv==="gpu-buffer"||v==="ml-tensor")&&(d=o._OrtCreateBinding(a),d===0&&he("Can't create IO binding."),$={handle:d,outputPreferredLocations:S,outputPreferredLocationsEncoded:S.map(v=>Yn(v))}),zt.set(a,[a,p,f,$,_,!1]),[a,b,w]}catch(h){throw p.forEach(y=>o._OrtFree(y)),f.forEach(y=>o._OrtFree(y)),d!==0&&o._OrtReleaseBinding(d)!==0&&he("Can't release IO binding."),a!==0&&o._OrtReleaseSession(a)!==0&&he("Can't release session."),h}finally{o._free(n),s!==0&&o._OrtReleaseSessionOptions(s)!==0&&he("Can't release session options."),l.forEach(h=>o._free(h)),o.unmountExternalData?.()}},kr=e=>{let t=Ie(),n=zt.get(e);if(!n)throw new Error(`cannot release session. invalid session id: ${e}`);let[r,o,a,s,d]=n;s&&(d&&t._OrtClearBoundOutputs(s.handle)!==0&&he("Can't clear bound outputs."),t._OrtReleaseBinding(s.handle)!==0&&he("Can't release IO binding.")),t.jsepOnReleaseSession?.(e),o.forEach(l=>t._OrtFree(l)),a.forEach(l=>t._OrtFree(l)),t._OrtReleaseSession(r)!==0&&he("Can't release session."),zt.delete(e)},Qc=async(e,t,n,r,o,a=!1)=>{if(!e){t.push(0);return}let s=Ie(),d=s.PTR_SIZE,l=e[0],p=e[1],f=e[3],h=f,y,_;if(l==="string"&&(f==="gpu-buffer"||f==="ml-tensor"))throw new Error("String tensor is not supported on GPU.");if(a&&f!=="gpu-buffer")throw new Error(`External buffer must be provided for input/output index ${o} when enableGraphCapture is true.`);if(f==="gpu-buffer"){let S=e[2].gpuBuffer;_=wt(Rt(l),p);let $=s.jsepRegisterBuffer;if(!$)throw new Error('Tensor location "gpu-buffer" is not supported without using WebGPU.');y=$(r,o,S,_)}else if(f==="ml-tensor"){let S=e[2].mlTensor;_=wt(Rt(l),p);let $=s.jsepRegisterMLTensor;if(!$)throw new Error('Tensor location "ml-tensor" is not supported without using WebNN.');y=$(r,S,Rt(l),p)}else{let S=e[2];if(Array.isArray(S)){_=d*S.length,y=s._malloc(_),n.push(y);for(let $=0;$s.setValue(w+v*d,$,d===4?"i32":"i64"));let S=s._OrtCreateTensor(Rt(l),y,_,w,p.length,Yn(h));S===0&&he(`Can't create tensor for input/output. session=${r}, index=${o}.`),t.push(S)}finally{s.stackRestore(b)}},Er=async(e,t,n,r,o,a)=>{let s=Ie(),d=s.PTR_SIZE,l=zt.get(e);if(!l)throw new Error(`cannot run inference. invalid session id: ${e}`);let p=l[0],f=l[1],h=l[2],y=l[3],_=l[4],b=l[5],w=t.length,S=r.length,$=0,v=[],T=[],C=[],A=[],k=s.stackSave(),O=s.stackAlloc(w*d),M=s.stackAlloc(w*d),V=s.stackAlloc(S*d),F=s.stackAlloc(S*d);try{[$,v]=Ps(a);for(let W=0;Wxe*be,1);le=_t(Se);let Fe=y?.outputPreferredLocations[r[W]];if(le==="string"){if(Fe==="gpu-buffer"||Fe==="ml-tensor")throw new Error("String tensor is not supported on GPU.");let xe=[];for(let be=0;be0){let xe=s.jsepGetBuffer;if(!xe)throw new Error('preferredLocation "gpu-buffer" is not supported without using WebGPU.');let be=xe(Z),Ye=wt(Se,fe);if(Ye===void 0||!Mr(le))throw new Error(`Unsupported data type: ${le}`);ee=!0,ne.push([le,Y,{gpuBuffer:be,download:s.jsepCreateDownloader(be,Ye,le),dispose:()=>{s._OrtReleaseTensor(J)!==0&&he("Can't release tensor.")}},"gpu-buffer"])}else if(Fe==="ml-tensor"&&fe>0){let xe=s.jsepEnsureTensor;if(!xe)throw new Error('preferredLocation "ml-tensor" is not supported without using WebNN.');if(wt(Se,fe)===void 0||!Rr(le))throw new Error(`Unsupported data type: ${le}`);let Ye=await xe(e,Z,Se,Y,!1);ee=!0,ne.push([le,Y,{mlTensor:Ye,download:s.jsepCreateMLTensorDownloader(Z,le),dispose:()=>{s.jsepReleaseTensorId(Z),s._OrtReleaseTensor(J)}},"ml-tensor"])}else{let xe=Br(le),be=new xe(fe);new Uint8Array(be.buffer,be.byteOffset,be.byteLength).set(s.HEAPU8.subarray(Z,Z+be.byteLength)),ne.push([le,Y,be,"cpu"])}}finally{s.stackRestore(ve),le==="string"&&Z&&s._free(Z),ee||s._OrtReleaseTensor(J),s.jsepOnRunEnd?.(p)}}return y&&!_&&(s._OrtClearBoundOutputs(y.handle)!==0&&he("Can't clear bound outputs."),zt.set(e,[p,f,h,y,_,!1])),ne}finally{s.stackRestore(k),T.forEach(j=>s._OrtReleaseTensor(j)),C.forEach(j=>s._OrtReleaseTensor(j)),A.forEach(j=>s._free(j)),$!==0&&s._OrtReleaseRunOptions($),v.forEach(j=>s._free(j))}},Pr=e=>{let t=Ie(),n=zt.get(e);if(!n)throw new Error("invalid session id");let r=n[0],o=t._OrtEndProfiling(r);o===0&&he("Can't get an profile file name."),t._OrtFree(o)},zr=e=>{let t=[];for(let n of e){let r=n[2];!Array.isArray(r)&&"buffer"in r&&t.push(r.buffer)}return t}});var Ot,He,ar,cn,pn,ln,zo,Oo,Wt,Lt,ib,Yc,Xc,Jc,ep,tp,rp,np,Do=G(()=>{"use strict";Ge();qn();bt();Sr();Ot=()=>!!we.wasm.proxy&&typeof document<"u",ar=!1,cn=!1,pn=!1,Oo=new Map,Wt=(e,t)=>{let n=Oo.get(e);n?n.push(t):Oo.set(e,[t])},Lt=()=>{if(ar||!cn||pn||!He)throw new Error("worker not ready")},ib=e=>{switch(e.data.type){case"init-wasm":ar=!1,e.data.err?(pn=!0,zo[1](e.data.err)):(cn=!0,zo[0]()),ln&&(URL.revokeObjectURL(ln),ln=void 0);break;case"init-ep":case"copy-from":case"create":case"release":case"run":case"end-profiling":{let t=Oo.get(e.data.type);e.data.err?t.shift()[1](e.data.err):t.shift()[0](e.data.out);break}default:}},Yc=async()=>{if(!cn){if(ar)throw new Error("multiple calls to 'initWasm()' detected.");if(pn)throw new Error("previous call to 'initWasm()' failed.");if(ar=!0,Ot())return new Promise((e,t)=>{He?.terminate(),As().then(([n,r])=>{try{He=r,He.onerror=a=>t(a),He.onmessage=ib,zo=[e,t];let o={type:"init-wasm",in:we};!o.in.wasm.wasmPaths&&(n||import.meta.url?.startsWith("file:"))&&(o.in.wasm.wasmPaths={wasm:new URL("ort-wasm-simd-threaded.jsep.wasm",import.meta.url).href}),He.postMessage(o),ln=n}catch(o){t(o)}},t)});try{await Tr(we.wasm),await Cr(we),cn=!0}catch(e){throw pn=!0,e}finally{ar=!1}}},Xc=async e=>{if(Ot())return Lt(),new Promise((t,n)=>{Wt("init-ep",[t,n]);let r={type:"init-ep",in:{epName:e,env:we}};He.postMessage(r)});await Ir(we,e)},Jc=async e=>Ot()?(Lt(),new Promise((t,n)=>{Wt("copy-from",[t,n]);let r={type:"copy-from",in:{buffer:e}};He.postMessage(r,[e.buffer])})):Yt(e),ep=async(e,t)=>{if(Ot()){if(t?.preferredOutputLocation)throw new Error('session option "preferredOutputLocation" is not supported for proxy.');return Lt(),new Promise((n,r)=>{Wt("create",[n,r]);let o={type:"create",in:{model:e,options:{...t}}},a=[];e instanceof Uint8Array&&a.push(e.buffer),He.postMessage(o,a)})}else return Ar(e,t)},tp=async e=>{if(Ot())return Lt(),new Promise((t,n)=>{Wt("release",[t,n]);let r={type:"release",in:e};He.postMessage(r)});kr(e)},rp=async(e,t,n,r,o,a)=>{if(Ot()){if(n.some(s=>s[3]!=="cpu"))throw new Error("input tensor on GPU is not supported for proxy.");if(o.some(s=>s))throw new Error("pre-allocated output tensor is not supported for proxy.");return Lt(),new Promise((s,d)=>{Wt("run",[s,d]);let l=n,p={type:"run",in:{sessionId:e,inputIndices:t,inputs:l,outputIndices:r,options:a}};He.postMessage(p,zr(l))})}else return Er(e,t,n,r,o,a)},np=async e=>{if(Ot())return Lt(),new Promise((t,n)=>{Wt("end-profiling",[t,n]);let r={type:"end-profiling",in:e};He.postMessage(r)});Pr(e)}});var op,ab,mn,ip=G(()=>{"use strict";Ge();Do();te();xr();Xn();op=(e,t)=>{switch(e.location){case"cpu":return[e.type,e.dims,e.data,"cpu"];case"gpu-buffer":return[e.type,e.dims,{gpuBuffer:e.gpuBuffer},"gpu-buffer"];case"ml-tensor":return[e.type,e.dims,{mlTensor:e.mlTensor},"ml-tensor"];default:throw new Error(`invalid data location: ${e.location} for ${t()}`)}},ab=e=>{switch(e[3]){case"cpu":return new qe(e[0],e[2],e[1]);case"gpu-buffer":{let t=e[0];if(!Mr(t))throw new Error(`not supported data type: ${t} for deserializing GPU tensor`);let{gpuBuffer:n,download:r,dispose:o}=e[2];return qe.fromGpuBuffer(n,{dataType:t,dims:e[1],download:r,dispose:o})}case"ml-tensor":{let t=e[0];if(!Rr(t))throw new Error(`not supported data type: ${t} for deserializing MLTensor tensor`);let{mlTensor:n,download:r,dispose:o}=e[2];return qe.fromMLTensor(n,{dataType:t,dims:e[1],download:r,dispose:o})}default:throw new Error(`invalid data location: ${e[3]}`)}},mn=class{async fetchModelAndCopyToWasmMemory(t){return Jc(await er(t))}async loadModel(t,n){Ne();let r;typeof t=="string"?r=await this.fetchModelAndCopyToWasmMemory(t):r=t,[this.sessionId,this.inputNames,this.outputNames]=await ep(r,n),Be()}async dispose(){return tp(this.sessionId)}async run(t,n,r){Ne();let o=[],a=[];Object.entries(t).forEach(y=>{let _=y[0],b=y[1],w=this.inputNames.indexOf(_);if(w===-1)throw new Error(`invalid input '${_}'`);o.push(b),a.push(w)});let s=[],d=[];Object.entries(n).forEach(y=>{let _=y[0],b=y[1],w=this.outputNames.indexOf(_);if(w===-1)throw new Error(`invalid output '${_}'`);s.push(b),d.push(w)});let l=o.map((y,_)=>op(y,()=>`input "${this.inputNames[a[_]]}"`)),p=s.map((y,_)=>y?op(y,()=>`output "${this.outputNames[d[_]]}"`):null),f=await rp(this.sessionId,a,l,d,p,r),h={};for(let y=0;yfn,initializeFlags:()=>ap,wasmBackend:()=>sb});var ap,fn,sb,up=G(()=>{"use strict";Ge();Do();ip();ap=()=>{if((typeof we.wasm.initTimeout!="number"||we.wasm.initTimeout<0)&&(we.wasm.initTimeout=0),we.wasm.simd===!1&&console.warn('Deprecated property "env.wasm.simd" is set to false. non-SIMD build is no longer provided, and this setting will be ignored.'),typeof we.wasm.proxy!="boolean"&&(we.wasm.proxy=!1),typeof we.wasm.trace!="boolean"&&(we.wasm.trace=!1),typeof we.wasm.numThreads!="number"||!Number.isInteger(we.wasm.numThreads)||we.wasm.numThreads<=0)if(typeof self<"u"&&!self.crossOriginIsolated)we.wasm.numThreads=1;else{let e=typeof navigator>"u"?Nn("node:os").cpus().length:navigator.hardwareConcurrency;we.wasm.numThreads=Math.min(4,Math.ceil((e||1)/2))}},fn=class{async init(t){ap(),await Yc(),await Xc(t)}async createInferenceSessionHandler(t,n){let r=new mn;return await r.loadModel(t,n),Promise.resolve(r)}},sb=new fn});Ge();Ge();Ge();var hs="1.21.0";var lT=Fn;{let e=(up(),br(sp)).wasmBackend;Ct("webgpu",e,5),Ct("webnn",e,5),Ct("cpu",e,10),Ct("wasm",e,10)}Object.defineProperty(we.versions,"web",{value:hs,enumerable:!0});export{Of as InferenceSession,vr as TRACE,Ne as TRACE_FUNC_BEGIN,Be as TRACE_FUNC_END,qe as Tensor,lT as default,we as env,Ct as registerBackend}; +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +//# sourceMappingURL=ort.webgpu.bundle.min.mjs.map diff --git a/analysis/qiaodou-extract/extracted/assets/qwen-color-ig8k3JUL.webp b/analysis/qiaodou-extract/extracted/assets/qwen-color-ig8k3JUL.webp new file mode 100644 index 000000000..26dfc0776 Binary files /dev/null and b/analysis/qiaodou-extract/extracted/assets/qwen-color-ig8k3JUL.webp differ diff --git a/analysis/qiaodou-extract/extracted/assets/suno baise--dMPbHiP.webp b/analysis/qiaodou-extract/extracted/assets/suno baise--dMPbHiP.webp new file mode 100644 index 000000000..adacd69d1 Binary files /dev/null and b/analysis/qiaodou-extract/extracted/assets/suno baise--dMPbHiP.webp differ diff --git a/analysis/qiaodou-extract/extracted/assets/suno-Xv1k_XXC.webp b/analysis/qiaodou-extract/extracted/assets/suno-Xv1k_XXC.webp new file mode 100644 index 000000000..b62ae4a39 Binary files /dev/null and b/analysis/qiaodou-extract/extracted/assets/suno-Xv1k_XXC.webp differ diff --git a/analysis/qiaodou-extract/extracted/assets/thumbnailWorker-Iu1AjlwR.js b/analysis/qiaodou-extract/extracted/assets/thumbnailWorker-Iu1AjlwR.js new file mode 100644 index 000000000..5b562d33f --- /dev/null +++ b/analysis/qiaodou-extract/extracted/assets/thumbnailWorker-Iu1AjlwR.js @@ -0,0 +1 @@ +(function(){"use strict";async function h(l,e,n){if(typeof createImageBitmap>"u"||typeof OffscreenCanvas>"u")throw new Error("createImageBitmap or OffscreenCanvas not supported in this worker");const s=await fetch(l);if(!s.ok)throw new Error("Failed to fetch image data");const d=await s.blob(),t=await createImageBitmap(d);try{let a=t.width,r=t.height;if(a>e||r>e){const i=Math.min(e/a,e/r);a=Math.round(a*i),r=Math.round(r*i)}const f=new OffscreenCanvas(a,r),o=f.getContext("2d");if(!o)throw new Error("Failed to get OffscreenCanvas context");o.imageSmoothingEnabled=!0,o.imageSmoothingQuality="high",o.drawImage(t,0,0,a,r);const g=await f.convertToBlob({type:"image/jpeg",quality:n});return await new Promise((i,u)=>{const c=new FileReader;c.onloadend=()=>i(c.result),c.onerror=u,c.readAsDataURL(g)})}finally{t.close()}}self.onmessage=async l=>{const e=l.data;try{if(e.type==="generate"){const n=await h(e.imageData,e.maxSize,e.quality),s={type:"result",id:e.id,thumbnailData:n};self.postMessage(s)}else if(e.type==="batch-generate"&&e.batch){const s=(await Promise.allSettled(e.batch.map(t=>h(t.imageData,t.maxSize,t.quality).then(a=>({id:t.id,thumbnailData:a})).catch(a=>({id:t.id,error:a.message}))))).map((t,a)=>{var r;return t.status==="fulfilled"?t.value:{id:e.batch[a].id,error:((r=t.reason)==null?void 0:r.message)||"Unknown error"}}),d={type:"batch-result",id:e.id,batch:s};self.postMessage(d)}}catch(n){const s={type:e.type==="generate"?"result":"batch-result",id:e.id,thumbnailData:"",error:n instanceof Error?n.message:String(n)};self.postMessage(s)}}})(); diff --git a/analysis/qiaodou-extract/extracted/assets/vidu-color-DfcYl6hz.webp b/analysis/qiaodou-extract/extracted/assets/vidu-color-DfcYl6hz.webp new file mode 100644 index 000000000..85a35e200 Binary files /dev/null and b/analysis/qiaodou-extract/extracted/assets/vidu-color-DfcYl6hz.webp differ diff --git a/analysis/qiaodou-extract/extracted/assets/zhipu-color-PY4a2Lc6.webp b/analysis/qiaodou-extract/extracted/assets/zhipu-color-PY4a2Lc6.webp new file mode 100644 index 000000000..9fb34274e Binary files /dev/null and b/analysis/qiaodou-extract/extracted/assets/zhipu-color-PY4a2Lc6.webp differ diff --git a/analysis/qiaodou-extract/manifest.json b/analysis/qiaodou-extract/manifest.json new file mode 100644 index 000000000..01120cfb4 --- /dev/null +++ b/analysis/qiaodou-extract/manifest.json @@ -0,0 +1,263 @@ +[ + { + "asset": "/assets/index-m-NWkaV-.js", + "offset": 4359604, + "nextOffset": 5205083, + "compressedBytes": 845454, + "decompressedBytes": 4047131, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/index-m-NWkaV-.js", + "status": "ok" + }, + { + "asset": "/assets/suno baise--dMPbHiP.webp", + "offset": 5205083, + "nextOffset": 5535535, + "compressedBytes": 330420, + "decompressedBytes": 5138, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/suno baise--dMPbHiP.webp", + "status": "ok" + }, + { + "asset": "/assets/thumbnailWorker-Iu1AjlwR.js", + "offset": 5535535, + "nextOffset": 5536567, + "compressedBytes": 997, + "decompressedBytes": 1572, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/thumbnailWorker-Iu1AjlwR.js", + "status": "ok" + }, + { + "asset": "/assets/gemini-color-BRjDr-0b.webp", + "offset": 5536567, + "nextOffset": 5844908, + "compressedBytes": 308307, + "decompressedBytes": 15722, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/gemini-color-BRjDr-0b.webp", + "status": "ok" + }, + { + "asset": "/assets/openai-DM5htlBi.webp", + "offset": 5844908, + "nextOffset": 6097573, + "compressedBytes": 252637, + "decompressedBytes": 15628, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/openai-DM5htlBi.webp", + "status": "ok" + }, + { + "asset": "/assets/ort-wasm-simd-threaded.jsep-D5Jk56-t.wasm", + "offset": 6097573, + "nextOffset": 10035082, + "compressedBytes": 3937460, + "decompressedBytes": 23914392, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/ort-wasm-simd-threaded.jsep-D5Jk56-t.wasm", + "status": "ok" + }, + { + "asset": "/assets/openai bai-C9wdsUvK.webp", + "offset": 10035082, + "nextOffset": 10050199, + "compressedBytes": 15085, + "decompressedBytes": 15756, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/openai bai-C9wdsUvK.webp", + "status": "ok" + }, + { + "asset": "/assets/ort.bundle.min-OfoG_cy9.mjs", + "offset": 10050199, + "nextOffset": 10148887, + "compressedBytes": 98653, + "decompressedBytes": 399902, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/ort.bundle.min-OfoG_cy9.mjs", + "status": "ok" + }, + { + "asset": "/assets/midjourney bai-4Fw3hs7F.webp", + "offset": 10148887, + "nextOffset": 10213919, + "compressedBytes": 64996, + "decompressedBytes": 15956, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/midjourney bai-4Fw3hs7F.webp", + "status": "ok" + }, + { + "asset": "/assets/midjourney-BOG0L-7m.webp", + "offset": 10213919, + "nextOffset": 10388773, + "compressedBytes": 174822, + "decompressedBytes": 15882, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/midjourney-BOG0L-7m.webp", + "status": "ok" + }, + { + "asset": "/assets/doubao-color-BfZ9o9VO.webp", + "offset": 10388773, + "nextOffset": 10592561, + "compressedBytes": 203754, + "decompressedBytes": 19890, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/doubao-color-BfZ9o9VO.webp", + "status": "ok" + }, + { + "asset": "/assets/qwen-color-ig8k3JUL.webp", + "offset": 10592561, + "nextOffset": 11246775, + "compressedBytes": 654182, + "decompressedBytes": 19066, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/qwen-color-ig8k3JUL.webp", + "status": "ok" + }, + { + "asset": "/assets/kling-color-O6Fl0YZh.webp", + "offset": 11246775, + "nextOffset": 11275612, + "compressedBytes": 28804, + "decompressedBytes": 28800, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/kling-color-O6Fl0YZh.webp", + "status": "ok" + }, + { + "asset": "/assets/minimax-color-Dx2mFylD.webp", + "offset": 11275612, + "nextOffset": 11486472, + "compressedBytes": 210825, + "decompressedBytes": 13020, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/minimax-color-Dx2mFylD.webp", + "status": "ok" + }, + { + "asset": "/assets/index-CgHmA0qR.css", + "offset": 11486472, + "nextOffset": 11511029, + "compressedBytes": 24531, + "decompressedBytes": 182008, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/index-CgHmA0qR.css", + "status": "ok" + }, + { + "asset": "/assets/ort.webgpu.bundle.min-CEayb2S6.mjs", + "offset": 11511029, + "nextOffset": 11609722, + "compressedBytes": 98651, + "decompressedBytes": 399923, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/ort.webgpu.bundle.min-CEayb2S6.mjs", + "status": "ok" + }, + { + "asset": "/assets/deepseek-color-XniBTJPh.webp", + "offset": 11609722, + "nextOffset": 11871348, + "compressedBytes": 261590, + "decompressedBytes": 20426, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/deepseek-color-XniBTJPh.webp", + "status": "ok" + }, + { + "asset": "/assets/suno-Xv1k_XXC.webp", + "offset": 11871348, + "nextOffset": 12859194, + "compressedBytes": 987820, + "decompressedBytes": 4954, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/suno-Xv1k_XXC.webp", + "status": "ok" + }, + { + "asset": "/assets/moonshot-Cy56VaSZ.webp", + "offset": 12859194, + "nextOffset": 12869861, + "compressedBytes": 10637, + "decompressedBytes": 11248, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/moonshot-Cy56VaSZ.webp", + "status": "ok" + }, + { + "asset": "/assets/grok bai-CiCMAJ0q.webp", + "offset": 12869861, + "nextOffset": 13298951, + "compressedBytes": 429060, + "decompressedBytes": 10538, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/grok bai-CiCMAJ0q.webp", + "status": "ok" + }, + { + "asset": "/assets/vidu-color-DfcYl6hz.webp", + "offset": 13298951, + "nextOffset": 14410560, + "compressedBytes": 1111577, + "decompressedBytes": 26920, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/vidu-color-DfcYl6hz.webp", + "status": "ok" + }, + { + "asset": "/assets/zhipu-color-PY4a2Lc6.webp", + "offset": 14410560, + "nextOffset": 14563629, + "compressedBytes": 153036, + "decompressedBytes": 22086, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/zhipu-color-PY4a2Lc6.webp", + "status": "ok" + }, + { + "asset": "/assets/flux bai-CYYe7fkT.webp", + "offset": 14563629, + "nextOffset": 14571059, + "compressedBytes": 7400, + "decompressedBytes": 8146, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/flux bai-CYYe7fkT.webp", + "status": "ok" + }, + { + "asset": "/assets/nanobanana-color-Re8s94pO.webp", + "offset": 14571059, + "nextOffset": 14584320, + "compressedBytes": 13223, + "decompressedBytes": 13366, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/nanobanana-color-Re8s94pO.webp", + "status": "ok" + }, + { + "asset": "/assets/jimeng-color-CtBciSlW.webp", + "offset": 14584320, + "nextOffset": 14604596, + "compressedBytes": 20242, + "decompressedBytes": 20274, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/jimeng-color-CtBciSlW.webp", + "status": "ok" + }, + { + "asset": "/assets/bytedance-color-CPzTHojG.webp", + "offset": 14604596, + "nextOffset": 14611653, + "compressedBytes": 7020, + "decompressedBytes": 7016, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/bytedance-color-CPzTHojG.webp", + "status": "ok" + }, + { + "asset": "/assets/grok-DEnnqgaa.webp", + "offset": 14611653, + "nextOffset": 15025424, + "compressedBytes": 413745, + "decompressedBytes": 10334, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/grok-DEnnqgaa.webp", + "status": "ok" + }, + { + "asset": "/assets/flux-CzJA5PDw.webp", + "offset": 15025424, + "nextOffset": 15104855, + "compressedBytes": 79405, + "decompressedBytes": 8072, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/flux-CzJA5PDw.webp", + "status": "ok" + }, + { + "asset": "/assets/moonshot baise-CDuFHouK.webp", + "offset": 15104855, + "nextOffset": 15397413, + "compressedBytes": 292522, + "decompressedBytes": 11172, + "outputPath": "/Users/lanmu/Desktop/ai-chatbot-main/analysis/qiaodou-extract/extracted/assets/moonshot baise-CDuFHouK.webp", + "status": "ok" + } +] diff --git a/analysis/qiaodou-extract/复刻导向功能结构报告.md b/analysis/qiaodou-extract/复刻导向功能结构报告.md new file mode 100644 index 000000000..8d648159b --- /dev/null +++ b/analysis/qiaodou-extract/复刻导向功能结构报告.md @@ -0,0 +1,598 @@ +# 桥豆麻衣酱 App 复刻导向功能结构报告 + +## 目标 + +这份报告不是单纯做逆向记录,而是回答一个更实际的问题: + +- 这个 App 到底由哪些核心子系统组成 +- 哪些能力最值得优先复刻到我们项目的无限画布 +- 我们当前项目已经有什么 +- 还缺什么 + +配套机器可读情报见: + +- `bundle-intel.json` +- `README.md` +- `extracted/assets/index-m-NWkaV-.js` + +## 一句话结论 + +“桥豆麻衣酱”不是一个简单的聊天壳,它更像一个: + +- `Tauri 桌面壳` +- `无限画布 / 工作流节点编辑器` +- `多供应商图像/视频/角色/分镜生产平台` +- `带本地缓存、本地导出、本地保存、本地代理能力的创作工作台` + +从提取到的前端 bundle 看,它的产品结构已经明显超过“聊天 + 生图”阶段,核心是“节点化创作系统”。 + +## 1. 结构总览 + +### A. 桌面壳与原生能力 + +前端 bundle 中直接调用的 Tauri 命令包括: + +- `download_file_bypass_cors` +- `proxy_fetch` +- `proxy_fetch_raw` +- `proxy_dashscope_request` +- `start_local_server` +- `open_folder_in_explorer` +- `export_project` +- `import_project` +- `export_categorized_project` +- `import_categorized_project` +- `read_file_as_base64` +- `write_base64_to_file` +- `write_base64_to_files_batch` +- `write_file_chunked` +- `process_large_data_rust` +- `rust_cache_get` +- `rust_cache_set` +- `rust_cache_remove` + +这说明它不是“前端页面 + 远程 API”这么简单,而是有明确的桌面工作站属性: + +- 本地文件读写 +- 本地代理请求 +- 本地导入导出 +- 本地缓存 +- 大数据处理交给 Rust + +### B. 项目与持久化层 + +前端 bundle 里能明确看到一个 IndexedDB 工程库: + +- 数据库名:`qiaodoumayi_projects` +- 版本:`2` +- Store: + - `project_meta` + - `project_payload` + - `project_assets` + +这点非常关键,它说明这个 App 的工程化不是只靠 localStorage,而是分成了: + +- 项目元信息 +- 项目完整 payload +- 项目资源资产 + +这对无限画布非常重要,因为一旦你要支持: + +- 多节点 +- 分镜 +- 图像/视频结果 +- 历史恢复 +- 复杂项目切换 + +单纯靠后端对话消息或一个大 JSON 是不够的。 + +### C. 配置与本地状态层 + +bundle 中存在大量 `qiaodoumayi_*` 配置键,能看出它的本地状态体系非常丰富。按功能大致分组如下。 + +#### 基础平台配置 + +- `qiaodoumayi_api_configs` +- `qiaodoumayi_global_key` +- `qiaodoumayi_global_base_url` +- `qiaodoumayi_active_endpoint` +- `qiaodoumayi_last_used_model` +- `qiaodoumayi_model_settings_memory` + +#### 画布与 UI 偏好 + +- `qiaodoumayi_show_canvas_grid` +- `qiaodoumayi_show_canvas_minimap` +- `qiaodoumayi_show_canvas_snap` +- `qiaodoumayi_canvas_bg_color_light` +- `qiaodoumayi_canvas_bg_color_dark` +- `qiaodoumayi_left_toolbar_collapsed` +- `qiaodoumayi_right_toolbar_collapsed` +- `qiaodoumayi_viewport_size` +- `qiaodoumayi_theme` +- `qiaodoumayi_chat_width` +- `qiaodoumayi_chat_font_size` + +#### 项目 / 内容 / 历史 + +- `qiaodoumayi_projects` +- `qiaodoumayi_project_name` +- `qiaodoumayi_history` +- `qiaodoumayi_content_store` +- `qiaodoumayi_thumbnail_store` +- `qiaodoumayi_chat_sessions` + +#### 资源库 / 提示词库 / 技能库 + +- `qiaodoumayi_prompt_library` +- `qiaodoumayi_agent_prompt_library` +- `qiaodoumayi_saved_skills` +- `qiaodoumayi_rh_app_library` +- `qiaodoumayi_pose_library_panel` + +#### 角色 / 剧本 / 视频素材相关 + +- `qiaodoumayi_characters` +- `qiaodoumayi_seedance_roles` +- `qiaodoumayi_kling_subjects` +- `qiaodoumayi_script_projects` +- `qiaodoumayi_script_current_id` + +#### 本地保存与缓存 + +- `qiaodoumayi_download_directory` +- `qiaodoumayi_saved_folder_history` +- `qiaodoumayi_cache_dir` +- `qiaodoumayi_cache_directory_config` +- `qiaodoumayi_autosave_enabled` +- `qiaodoumayi_autosave_interval_minutes` + +#### 审核与特殊服务 + +- `qiaodoumayi_seedance_moderation_url` +- `qiaodoumayi_seedance_moderation_user_id` +- `qiaodoumayi_seedance_moderation_key_hex` +- `qiaodoumayi_jimeng_super_resolution_url` +- `qiaodoumayi_jimeng_super_resolution_api_key` + +结论是:这个 App 有比较完整的“本地工作台态”,不是一个一次性生成器。 + +## 2. 工作流画布才是核心 + +### 节点系统规模 + +从 bundle 中恢复出的节点目录至少有 `34` 个节点类型。它不是简单的“图片节点 + 视频节点”,而是工作流节点系统。 + +比较关键的一批节点如下: + +- `input-image` +- `video-input` +- `text-node` +- `novel-input` +- `video-analyze` +- `storyboard-node` +- `storyboard-chart-node` +- `table-editor-node` +- `gen-image` +- `gen-video` +- `gen-music` +- `motion-control` +- `camera-movement` +- `professional-camera` +- `inpaint-crop` +- `inpaint-stitch` +- `local-save` +- `preview` +- `custom-agent` +- `rh-app` +- `rh-comfy` +- `jimeng-super-resolution` +- `create-character` +- `create-scene` +- `generate-character-image` +- `generate-character-video` +- `generate-scene-image` +- `generate-scene-video` +- `extract-characters-scenes` +- `character-description` +- `scene-description` +- `doodle-canvas` +- `canvas-node` +- `image-compare` + +### 节点中文名与默认尺寸 + +bundle 中还能直接恢复出节点显示名和默认尺寸,说明画布布局系统已经很成熟。 + +一些典型例子: + +- `storyboard-node`:`分镜节点`,默认 `600x500` +- `custom-agent`:`自定义代理`,默认 `500x800` +- `video-analyze`:`视频分析`,默认 `400x500` +- `gen-image`:`生成图片`,默认 `360x340` +- `gen-video`:`生成视频`,默认 `360x340` +- `local-save`:`本地保存`,默认 `320x380` +- `jimeng-super-resolution`:`智能超清`,默认 `320x280` +- `inpaint-crop`:`裁剪局部重绘`,默认 `340x380` +- `doodle-canvas`:`涂鸦画板`,默认 `500x300` + +这说明它的节点系统并不是运行时随便拼出来的,而是有预定义的产品级节点目录。 + +### 快速连接关系 + +bundle 中还恢复出了一个 `QUICK_CONNECT_CONFIG`,也就是“节点之间下一步建议怎么连”。 + +几条非常有价值的链路如下: + +- `text-node -> gen-image / gen-video / custom-agent` +- `input-image -> gen-image / gen-video / storyboard-node / inpaint-crop` +- `video-input -> preview / rh-app` +- `video-analyze -> storyboard-node / gen-image` +- `table-editor-node -> storyboard-node` +- `storyboard-node -> gen-image / gen-video` +- `storyboard-chart-node -> preview` +- `inpaint-stitch -> preview / local-save` +- `novel-input -> custom-agent / text-node / rh-app` + +这基本已经把它的产品思路暴露出来了: + +- 文本和图像不是终点,而是工作流入口 +- 视频分析可以进入分镜 +- 分镜又可以再生图、再生视频 +- 最后再进入预览和保存 + +这正是一个“无限画布 + 创作编排器”的产品结构。 + +## 3. 它的内容生产链路 + +### A. 图像/视频生成 + +从 bundle 中可见大量供应商和模型痕迹: + +- `OpenAI` +- `Gemini` +- `DeepSeek` +- `Doubao` +- `Jimeng` +- `Kling` +- `Vidu` +- `Zhipu` +- `Moonshot` +- `Qwen` +- `MiniMax` +- `Midjourney` +- `Suno` + +默认端点与内置端点包括: + +- `https://ai.comfly.chat` +- `https://ai.t8star.cn` +- `https://api.midjourney.com` +- `https://api.openai.com` +- `https://generativelanguage.googleapis.com` +- `https://dashscope.aliyuncs.com` + +这说明它本质上是一个“多后端编排前端”,不是单模型专用 UI。 + +### B. 角色库与分镜库 + +bundle 中能明确看到: + +- 角色库缓存:`qiaodoumayi_characters` +- 远程角色入口:`https://ai.comfly.chat/sora/v1/characters` +- 剧本工程:`qiaodoumayi_script_projects` +- 剧本当前项目:`qiaodoumayi_script_current_id` +- `storyboard-node` +- `storyboard-chart-node` +- `extract-characters-scenes` + +这说明它很重视: + +- 角色一致性 +- 从视频或文本抽结构 +- 从剧本进入画布 +- 从画布进入分镜 + +### C. 视频理解与视频工作流 + +bundle 中可见 `video-analyze` 节点,以及连接视频输入、关键帧、分镜节点的逻辑痕迹。还能看到: + +- `motion-control` +- `camera-movement` +- `professional-camera` +- `generate-character-video` +- `generate-scene-video` + +这意味着视频在它这里不是“最终结果播放器”,而是完整工作流的一部分。 + +### D. 技能 / Agent / RH 应用 + +bundle 中可见: + +- `custom-agent` +- `qiaodoumayi_saved_skills` +- `qiaodoumayi_agent_prompt_library` +- `qiaodoumayi_rh_app_library` +- `runninghub` +- `rh-app` +- `rh-comfy` + +而且还能看到对 Skill 市场的介绍性内容,这说明: + +- 它不是只有模型参数页 +- 它还有“技能 / 应用 / Agent 编排”的产品层 + +## 4. 它的本地桌面工作站特征 + +### 本地保存链路 + +bundle 中能直接看到: + +- `start_local_server` +- `qiaodoumayi_download_directory` +- `open_folder_in_explorer` + +这说明它把“生成完成后的文件落地”当成产品一等公民,而不是交给浏览器下载框完事。 + +### 本地代理链路 + +bundle 中能直接看到: + +- `proxy_fetch` +- `proxy_fetch_raw` +- `proxy_dashscope_request` +- `http://127.0.0.1:41600/proxy` +- `http://127.0.0.1:9527` +- `http://127.0.0.1:9528` +- `http://127.0.0.1:9529` +- `http://127.0.0.1:9530` + +这说明它桌面端很可能在做: + +- 统一代理请求 +- 规避前端直连限制 +- 衔接本地保存 +- 为多供应商请求做本地协调 + +### 文件导入导出 + +bundle 中明确有: + +- `export_project` +- `import_project` +- `export_categorized_project` +- `import_categorized_project` + +这意味着项目不是“只存在于当前设备当前会话”,而是支持工程级交换。 + +## 5. 审核与风控链路 + +bundle 与本机配置都表明有一条图片审核配置: + +- `qiaodoumayi_seedance_moderation_url` +- 默认值:`http://118.196.112.236:3428/api/moderation/image` + +更重要的不是这个地址本身,而是它体现出: + +- 它对图像生成/图像上传流程做了专门审核位 +- 审核是可配置项,不一定完全写死在服务端 + +如果后续你要复刻到自己的项目里,这条链路可以先抽象成: + +- `preflight moderation hook` + +而不是一开始就复刻它的具体实现。 + +## 6. 和我们当前项目的差距 + +### 我们已经有的基础 + +从当前项目代码看,我们已经有一个“可编辑无限画布”的基础框架: + +- 画布节点类型定义在 `types/canvas/index.ts` +- 画布状态与节点/边管理在 `store/canvas/index.ts` +- 画布渲染在 `components/canvas/CanvasWorkspace.tsx` +- 画布服务层在 `services/canvas/index.ts` + +当前项目已有的节点类型是: + +- `message` +- `image` +- `video` +- `text` +- `scene-fusion` +- `model3d` +- `world3d` + +并且已经具备一批图片侧能力: + +- 上传 +- 生图 +- 抠图 +- 扩图 +- 框选抠图 +- 文本编辑 +- 图层拆分 +- 场景融合 +- 3D 结果展示 + +这意味着我们不是从零开始。 + +### 当前最明显的缺口 + +和“桥豆麻衣酱”相比,我们现在缺的不是单个 API,而是“工作流层”。 + +最明显的差距有: + +#### 1. 节点目录不够完整 + +我们现在的 NodeType 还偏“媒体结果节点”,而桥豆那边已经是“生产流程节点”。 + +缺失最明显的一批: + +- `input-image` +- `video-input` +- `video-analyze` +- `storyboard-node` +- `storyboard-chart-node` +- `table-editor-node` +- `custom-agent` +- `local-save` +- `preview` +- `motion-control` +- `camera-movement` +- `professional-camera` +- `create-character` +- `create-scene` +- `generate-character-image` +- `generate-character-video` +- `generate-scene-image` +- `generate-scene-video` + +#### 2. 缺少工作流连接语义 + +我们当前画布有边,但边的语义还很轻,更多像自由连线。 + +桥豆那边已经存在: + +- 节点输入输出能力 +- 快速连接建议 +- 按节点类型组织的下一步操作 + +也就是“有图结构”,但我们还没有“有工作流协议”。 + +#### 3. 缺少工程级项目资产层 + +我们当前项目侧重后端接口和画布状态保存;桥豆那边明显还有: + +- 项目 meta +- 项目 payload +- 项目 assets +- 本地缓存 +- 本地缩略图 +- 导入导出 + +这对大项目体验差异会非常明显。 + +#### 4. 缺少角色/剧本/分镜三套资源库 + +桥豆明显把这三类做成一级能力: + +- 角色库 +- 剧本项目 +- 分镜节点 + +而我们现在更像“图像生成画布”,还不是“叙事创作画布”。 + +## 7. 最值得优先复刻的部分 + +如果目标是尽快把桥豆的核心能力迁移到我们的无限画布,我建议按下面顺序做。 + +### 第一阶段:先补工作流骨架 + +先不要一口气复刻所有节点,先补最核心的工作流层: + +- 节点注册表 +- 节点默认尺寸 +- 节点输入输出 schema +- 快速连接配置 +- 节点执行状态机 +- 结果节点与中间节点区分 + +优先节点建议: + +- `text-node` +- `input-image` +- `gen-image` +- `gen-video` +- `preview` +- `local-save` + +### 第二阶段:补分镜与视频链路 + +这是桥豆和普通画布产品差异最大的地方: + +- `video-input` +- `video-analyze` +- `storyboard-node` +- `storyboard-chart-node` +- `table-editor-node` + +有了这批节点,画布就从“结果展示面板”升级成“创作流程面板”。 + +### 第三阶段:补角色与剧本资产层 + +这部分能把产品从“工具”拉到“系统”: + +- 角色库 +- 剧本项目 +- 角色一致性生图/生视频 +- 场景节点 + +### 第四阶段:补桌面工作站能力 + +如果以后你们也走桌面端,这一层再跟进: + +- 本地保存目录 +- 本地导入导出 +- 本地代理 +- 本地缓存 + +Web 版可以先抽象接口,不需要第一天就复刻 Tauri。 + +## 8. 对我们项目最直接的落地建议 + +### 建议 1 + +把当前无限画布从“自由画板节点”升级为“节点注册表驱动”。 + +也就是新增一个统一的节点目录: + +- `type` +- `label` +- `defaultSize` +- `inputPorts` +- `outputPorts` +- `capabilities` +- `quickActions` + +### 建议 2 + +把现有 `image` / `video` 节点保留,但视为“结果节点”,再新增“流程节点”。 + +这会比强行把所有功能都塞进 `image` 节点更可持续。 + +### 建议 3 + +优先把桥豆的 `QUICK_CONNECT_CONFIG` 翻译成我们自己的配置文件。 + +因为这一步几乎不依赖后端,却能立刻让无限画布的操作逻辑接近桥豆。 + +### 建议 4 + +先抽象“审核钩子”“本地保存钩子”“代理请求钩子”,不要一开始绑定具体厂商。 + +这样后面无论是 Web、桌面版还是服务端代理版,都能接进去。 + +## 9. 现在已经产出的资产 + +你现在可以直接继续用下面这些文件: + +- `analysis/qiaodou-extract/README.md` + - 提取说明与入口文件 +- `analysis/qiaodou-extract/bundle-intel.json` + - 机器可读情报,适合继续做脚本分析 +- `analysis/qiaodou-extract/analyze_bundle.js` + - 可重复运行的 bundle 分析脚本 +- `analysis/qiaodou-extract/extracted/assets/index-m-NWkaV-.js` + - 主 bundle,适合继续按关键词深挖 + +## 最终判断 + +如果你的目标是“把桥豆麻衣酱的核心功能复刻到我们项目的无限画布”,那接下来最该复刻的不是某个单独接口,而是它这三层结构: + +- `工作流节点体系` +- `项目/资产持久化体系` +- `角色/分镜/视频分析资源体系` + +一旦这三层搭起来,具体接 OpenAI、Gemini、Kling、Jimeng、Vidu 这些后端,反而是后面的工作。 diff --git a/app/(chat)/api/chat/route.ts b/app/(chat)/api/chat/route.ts index b30d1f390..46925c7e9 100644 --- a/app/(chat)/api/chat/route.ts +++ b/app/(chat)/api/chat/route.ts @@ -47,6 +47,7 @@ import { getLanguageModelById } from "@/lib/ai/dynamic-provider"; import { resolveDetailAgentLocalMoonshotModel } from "@/lib/ai/detail-agent-model-runtime"; import { shouldForceInlineVisionInputs } from "@/lib/ai/model-compat"; import { inlineVisionImages } from "@/lib/ai/vision-inline"; +import { requestLongTaskResult } from "@/lib/client/long-task"; import { createDocument } from "@/lib/ai/tools/create-document"; import { getWeather } from "@/lib/ai/tools/get-weather"; import { requestSuggestions } from "@/lib/ai/tools/request-suggestions"; @@ -133,6 +134,7 @@ import { resolveChatMediaInput } from "@/lib/ai/context-memory/media-input"; import { resolveTargetAssets } from "@/lib/ai/context-memory/target-resolution"; import type { ResolvedChatMediaInput, + ResolvedImageRef, ResolvedTargetAssets, } from "@/lib/ai/context-memory/types"; import { ChatSDKError } from "@/lib/errors"; @@ -504,6 +506,40 @@ function writeImageGenerationStatusChunk( ); } +type AgentProgressStreamPayload = { + stage: "planning" | "clarify" | "executing" | "completed" | "failed"; + currentStep: + | "lock_target" + | "analyze" + | "select_tool" + | "execute" + | "finalize"; + title?: string; + message?: string; + toolName?: string; + capability?: string; +}; + +function writeAgentProgressChunk( + writer: StreamWriter, + payload: AgentProgressStreamPayload, + label: string, +) { + writeStructuredDataChunk( + writer, + "data-agentProgress", + { + stage: payload.stage, + currentStep: payload.currentStep, + title: String(payload.title || "").trim() || undefined, + message: String(payload.message || "").trim() || undefined, + toolName: String(payload.toolName || "").trim() || undefined, + capability: String(payload.capability || "").trim() || undefined, + }, + label, + ); +} + function writeCanvasMediaChunk( writer: StreamWriter, params: { @@ -568,6 +604,114 @@ function writeCanvasMediaChunk( ); } +type AgentTargetLockRefPreview = { + url: string; + title?: string; + nodeId?: string; + assetId?: string; + source: ResolvedImageRef["source"]; + role: ResolvedImageRef["role"]; + isSelected?: boolean; + positionLabel?: string; +}; + +type AgentTargetLockStreamPayload = { + stage: "locked" | "clarify" | "unresolved"; + resolutionMode: ResolvedTargetAssets["resolutionMode"]; + confidence: number; + reason: string; + needsClarification: boolean; + clarificationMessage?: string; + targetCount: number; + candidateCount: number; + targets: AgentTargetLockRefPreview[]; + candidates: AgentTargetLockRefPreview[]; +}; + +function sortTargetLockRefsForCanvasOrdering(refs: ResolvedImageRef[]) { + return [...refs].sort((left, right) => { + const leftY = Number(left.y ?? 0); + const rightY = Number(right.y ?? 0); + if (Math.abs(leftY - rightY) > 12) { + return leftY - rightY; + } + return Number(left.x ?? 0) - Number(right.x ?? 0); + }); +} + +function getTargetLockPositionLabel(ref: ResolvedImageRef, refs: ResolvedImageRef[]): string { + if (refs.length <= 1) return "中间"; + const xs = refs.map((item) => Number(item.x ?? 0)); + const ys = refs.map((item) => Number(item.y ?? 0)); + const minX = Math.min(...xs); + const maxX = Math.max(...xs); + const minY = Math.min(...ys); + const maxY = Math.max(...ys); + const spanX = Math.max(1, maxX - minX); + const spanY = Math.max(1, maxY - minY); + const relX = (Number(ref.x ?? 0) - minX) / spanX; + const relY = (Number(ref.y ?? 0) - minY) / spanY; + + const horizontal = relX <= 0.33 ? "左" : relX >= 0.66 ? "右" : "中"; + const vertical = relY <= 0.33 ? "上" : relY >= 0.66 ? "下" : "中"; + + if (horizontal === "中" && vertical === "中") return "中间"; + return `${vertical}${horizontal}`; +} + +function serializeAgentTargetLockRefs(refs: ResolvedImageRef[]) { + const orderedRefs = sortTargetLockRefsForCanvasOrdering(refs).slice(0, 4); + return orderedRefs.map((ref) => ({ + url: ref.url, + title: String(ref.title || "").trim() || undefined, + nodeId: ref.nodeId, + assetId: ref.assetId, + source: ref.source, + role: ref.role, + isSelected: ref.isSelected === true, + positionLabel: getTargetLockPositionLabel(ref, orderedRefs), + })) satisfies AgentTargetLockRefPreview[]; +} + +function buildAgentTargetLockPayload(params: { + requestTargetResolution: ResolvedTargetAssets; + requestResolvedMediaInput: ResolvedChatMediaInput; + needsClarification: boolean; + clarificationMessage?: string; +}): AgentTargetLockStreamPayload { + const stage = + params.needsClarification + ? "clarify" + : params.requestTargetResolution.targetRefs.length > 0 + ? "locked" + : "unresolved"; + + return { + stage, + resolutionMode: params.requestTargetResolution.resolutionMode, + confidence: Number(params.requestTargetResolution.confidence || 0), + reason: params.requestTargetResolution.reason, + needsClarification: params.needsClarification, + clarificationMessage: params.clarificationMessage?.trim() || undefined, + targetCount: params.requestTargetResolution.targetRefs.length, + candidateCount: params.requestTargetResolution.candidateRefs.length, + targets: serializeAgentTargetLockRefs(params.requestTargetResolution.targetRefs), + candidates: serializeAgentTargetLockRefs( + params.requestTargetResolution.candidateRefs.length > 0 + ? params.requestTargetResolution.candidateRefs + : params.requestResolvedMediaInput.imageRefs, + ), + }; +} + +function writeAgentTargetLockChunk( + writer: StreamWriter, + payload: AgentTargetLockStreamPayload, + label: string, +) { + writeStructuredDataChunk(writer, "data-agentTargetLock", payload, label); +} + function createSseResponse(stream: ReadableStream) { return new Response(stream.pipeThrough(new JsonToSseTransformStream()), { headers: { @@ -1017,7 +1161,10 @@ type AgentPreparedExecution = { }; type DirectAgentToolCapability = + | "analyze" + | "generic_edit" | "remove_background" + | "enhance" | "resize" | "extend" | "box_cutout" @@ -1025,7 +1172,10 @@ type DirectAgentToolCapability = | "generate_video"; type DirectAgentToolName = + | "analyzeImage" + | "editImage" | "removeBackground" + | "enhanceImage" | "resizeImage" | "extendImage" | "boxCutout" @@ -1066,8 +1216,14 @@ function mapDirectToolNameToCapability( toolName: DirectAgentToolName, ): DirectAgentToolCapability { switch (toolName) { + case "analyzeImage": + return "analyze"; + case "editImage": + return "generic_edit"; case "removeBackground": return "remove_background"; + case "enhanceImage": + return "enhance"; case "resizeImage": return "resize"; case "extendImage": @@ -1089,6 +1245,7 @@ function resolveDirectAgentToolExecution( ): ResolvedDirectAgentToolExecution | null { const mergedToolCalls = collectAgentToolCalls(execution, plan); const toolNames = mergedToolCalls.map((tool) => tool.name); + const hasToolCall = (toolName: DirectAgentToolName) => toolNames.includes(toolName); const sourceTools = toolNames.filter((toolName): toolName is DirectAgentSourceToolName => toolName === "useSelectedCanvasImage" || toolName === "useLatestResultImage" || @@ -1096,21 +1253,45 @@ function resolveDirectAgentToolExecution( ); const directToolName = - toolNames.find((toolName): toolName is DirectAgentToolName => - toolName === "removeBackground" || - toolName === "resizeImage" || - toolName === "extendImage" || - toolName === "boxCutout" || - toolName === "generateImage" || - toolName === "generateVideo", - ) || + (hasToolCall("analyzeImage") + ? "analyzeImage" + : hasToolCall("removeBackground") + ? "removeBackground" + : hasToolCall("enhanceImage") + ? "enhanceImage" + : hasToolCall("resizeImage") + ? "resizeImage" + : hasToolCall("extendImage") + ? "extendImage" + : hasToolCall("boxCutout") + ? "boxCutout" + : hasToolCall("editImage") + ? "editImage" + : hasToolCall("generateImage") + ? "generateImage" + : hasToolCall("generateVideo") + ? "generateVideo" + : null) || (() => { + if ( + execution?.preferredCapability === "analyze" || + execution?.routeIntent === "vision" || + execution?.mode === "analyze_image" + ) { + return "analyzeImage"; + } if ( execution?.preferredCapability === "remove_background" || execution?.routeSubIntent === "remove_background" ) { return "removeBackground"; } + if ( + execution?.preferredCapability === "enhance" || + execution?.routeSubIntent === "enhance" + ) { + return "enhanceImage"; + } if ( execution?.preferredCapability === "resize" || execution?.routeSubIntent === "resize" @@ -1129,6 +1310,13 @@ function resolveDirectAgentToolExecution( ) { return "boxCutout"; } + if ( + execution?.preferredCapability === "generic_edit" || + execution?.routeIntent === "image_edit" || + execution?.mode === "edit_image" + ) { + return "editImage"; + } if (execution?.mode === "generate_image") { return "generateImage"; } @@ -1153,8 +1341,14 @@ function resolveDirectAgentToolExecution( function getDirectAgentToolLabel(capability: DirectAgentToolCapability): string { switch (capability) { + case "analyze": + return "Agent工具:图片分析"; + case "generic_edit": + return "Agent工具:图片编辑"; case "remove_background": return "Agent工具:抠图"; + case "enhance": + return "Agent工具:图像增强"; case "resize": return "Agent工具:尺寸调整"; case "extend": @@ -1193,8 +1387,14 @@ function toFiniteNumber(value: unknown): number | undefined { function getDirectAgentToolSuccessMessage(capability: DirectAgentToolCapability): string { switch (capability) { + case "analyze": + return "已完成当前目标图分析,结果如下:"; + case "generic_edit": + return "已完成图片编辑,结果如下:"; case "remove_background": return "已完成抠图处理,结果如下:"; + case "enhance": + return "已完成图像增强,结果如下:"; case "resize": return "已完成尺寸调整,结果如下:"; case "extend": @@ -1214,8 +1414,14 @@ function getDirectAgentToolTargetMissingMessage( capability: DirectAgentToolCapability, ): string { switch (capability) { + case "analyze": + return "请先上传或选中一张图片,我才能继续帮你分析。"; + case "generic_edit": + return "请先上传或选中一张图片,我才能继续帮你修改。"; case "remove_background": return "请先上传或选中一张图片,我才能继续帮你执行抠图。"; + case "enhance": + return "请先上传或选中一张图片,我才能继续帮你做图像增强。"; case "resize": return "请先上传或选中一张图片,我才能继续帮你调整尺寸。"; case "extend": @@ -1244,8 +1450,14 @@ function getDirectAgentToolErrorMessage( const detail = errorDetail || errorMessage || "请稍后重试。"; switch (capability) { + case "analyze": + return `图片分析暂时失败:${detail}`; + case "generic_edit": + return `图片编辑暂时失败:${detail}`; case "remove_background": return `抠图暂时失败:${detail}`; + case "enhance": + return `图像增强暂时失败:${detail}`; case "resize": return `尺寸调整暂时失败:${detail}`; case "extend": @@ -1261,6 +1473,151 @@ function getDirectAgentToolErrorMessage( } } +async function buildDirectAgentImageAnalysisAnswer(params: { + question: string; + summary: string; + modelId?: string; +}) { + const normalizedQuestion = String(params.question || "").trim(); + const normalizedSummary = String(params.summary || "").trim(); + + if (!normalizedSummary) { + return ""; + } + + const buildFallbackAnswer = () => { + const intro = normalizedQuestion + ? "我先根据当前锁定图片给你一个直接结论:" + : "我先根据当前锁定图片做一个直接分析:"; + return [ + intro, + normalizedSummary, + normalizedQuestion + ? "如果你要,我可以继续往主体构图、风格、问题点或优化建议里再拆细。" + : "", + ] + .filter(Boolean) + .join("\n\n"); + }; + + const candidateModelIds = Array.from( + new Set( + [params.modelId] + .map((value) => String(value || "").trim()) + .filter(Boolean), + ), + ); + + for (const candidateModelId of candidateModelIds) { + try { + const model = await getLanguageModelById(candidateModelId); + if (!model) continue; + + const { text } = await generateText({ + model, + system: [ + "你是无限画布里的图片分析助手。", + "只能根据给定的图像观察摘要回答,不要编造图片中不可见的事实。", + "如果用户问题超出已知信息,要明确说信息不足,不要硬猜。", + "优先给出直接结论,再补充2到4条简洁依据或建议。", + ].join("\n"), + prompt: [ + normalizedQuestion ? `用户问题:${normalizedQuestion}` : "用户要求:请分析当前图片。", + `图像观察摘要:\n${normalizedSummary}`, + "请用中文直接回答,不要复述“根据摘要/根据图片”,也不要输出多余寒暄。", + ].join("\n\n"), + temperature: 0.2, + maxTokens: 320, + abortSignal: AbortSignal.timeout(20_000), + } as any); + + const normalizedText = String(text || "").trim(); + if (normalizedText) { + return normalizedText; + } + } catch (error) { + console.warn("[Chat API] Direct agent image analysis answer failed:", { + modelId: candidateModelId, + error, + }); + } + } + + return buildFallbackAnswer(); +} + +function buildDirectAgentExecutionPrompt(params: { + originalText: string; + optimizedPrompt?: string; + hiddenPromptPrefix?: string; + fallback?: string; +}) { + const originalText = String(params.originalText || "").trim(); + const optimizedPrompt = String(params.optimizedPrompt || "").trim(); + const hiddenPromptPrefix = String(params.hiddenPromptPrefix || ""); + + if (!optimizedPrompt) { + return `${hiddenPromptPrefix}${originalText || params.fallback || ""}`.trim(); + } + + const { normalizedOriginal, hasOriginalDemand, hasOriginalInOptimized } = + analyzeOptimizedPromptMerge(originalText, optimizedPrompt, hiddenPromptPrefix); + + return hasOriginalDemand && !hasOriginalInOptimized + ? [ + hiddenPromptPrefix.trim(), + `【核心目标(必须优先满足)】${normalizedOriginal}`, + `【执行优化细节】${optimizedPrompt}`, + ] + .filter(Boolean) + .join("\n\n") + .trim() + : `${hiddenPromptPrefix}${optimizedPrompt}`.trim(); +} + +async function executeDirectAgentEnhanceJob(params: { + requestUrl: string; + requestHeaders: Headers; + imageUrl: string; + prompt: string; + chatId: string; + messageId: string; +}) { + const endpoint = new URL("/api/enhance", params.requestUrl).toString(); + const cookieHeader = params.requestHeaders.get("cookie") || ""; + const result = await requestLongTaskResult({ + endpoint, + payload: { + imageUrl: params.imageUrl, + prompt: params.prompt, + chatId: params.chatId, + messageId: params.messageId, + }, + pollingParams: { + prompt: params.prompt, + chatId: params.chatId, + messageId: params.messageId, + sourceImageUrl: params.imageUrl, + }, + timeoutMs: 8 * 60 * 1000, + headers: cookieHeader + ? { + cookie: cookieHeader, + } + : undefined, + }); + + if (!result?.success || !result?.original_url) { + throw new Error(String(result?.error || result?.detail || "图像增强失败")); + } + + return { + originalUrl: String(result.original_url), + thumbnailUrl: String(result.thumbnail_url || result.original_url), + imageSize: "2K", + }; +} + function getChatStreamErrorMessage(error: unknown): string { const rawMessage = error instanceof Error ? String(error.message || "").trim() : String(error || "").trim(); @@ -5678,6 +6035,7 @@ export async function POST(request: Request) { context: effectiveAutoContextText || undefined, preferredModelId: preferredAgentModelId, assetIds: summaryAssetIds, + timeoutMs: fallbackSummaryTimeoutMs, }), "fallbackVisualSummary", fallbackSummaryTimeoutMs, @@ -5978,6 +6336,7 @@ export async function POST(request: Request) { context: effectiveAutoContextText || undefined, preferredModelId: preferredAgentModelId, assetIds: summaryAssetIds, + timeoutMs: summaryTimeoutMs, }), "enrichImageAnalysisSummary", summaryTimeoutMs, @@ -6406,6 +6765,30 @@ export async function POST(request: Request) { } } + const buildCurrentAgentTargetLockPayload = () => { + if (!shouldRunAgentConversation) return null; + if (composerMode !== "agent") return null; + if (effectiveContextPayload?.source !== "canvas") return null; + if (!requestResolvedMediaInput || !requestTargetResolution) return null; + + return buildAgentTargetLockPayload({ + requestTargetResolution, + requestResolvedMediaInput, + needsClarification: smartAutoNeedsClarification, + clarificationMessage: + smartAutoClarificationQuestion || smartAutoFriendlyMessage || undefined, + }); + }; + + const writeCurrentAgentTargetLockChunk = ( + writer: StreamWriter, + label: string, + ) => { + const payload = buildCurrentAgentTargetLockPayload(); + if (!payload) return; + writeAgentTargetLockChunk(writer, payload, label); + }; + const streamId = generateUUID(); await createStreamId({ streamId, chatId: id }); @@ -6447,6 +6830,7 @@ export async function POST(request: Request) { preferredModelId: preferredAgentModelId, assetIds: promptOnlySourceAssetIds.length > 0 ? promptOnlySourceAssetIds : summaryAssetIds, + timeoutMs: summaryTimeoutMs, }), "promptOnlyImageSummary", summaryTimeoutMs, @@ -6514,6 +6898,19 @@ export async function POST(request: Request) { const promptOnlyStream = createUIMessageStream({ execute: async ({ writer }) => { const messageId = generateUUID(); + writeAgentProgressChunk( + writer, + { + stage: "planning", + currentStep: "analyze", + title: "正在提炼可执行提示词", + message: "我在结合当前目标图和上下文整理更稳定的提示词。", + toolName: "promptOnly", + capability: "prompt_only", + }, + "prompt-only:progress-planning", + ); + writeCurrentAgentTargetLockChunk(writer, "prompt-only:target-lock"); writeAssistantTextChunk(writer, promptOnlyMessage, "prompt-only:reply", messageId); await saveMessages({ @@ -6548,6 +6945,19 @@ export async function POST(request: Request) { } catch (promptOnlyMemoryError) { console.warn("[Chat API] Failed to persist prompt-only response state:", promptOnlyMemoryError); } + + writeAgentProgressChunk( + writer, + { + stage: "completed", + currentStep: "finalize", + title: "提示词整理完成", + message: "已经给出可直接复用的优化提示词。", + toolName: "promptOnly", + capability: "prompt_only", + }, + "prompt-only:progress-completed", + ); }, }); @@ -6616,6 +7026,22 @@ export async function POST(request: Request) { const clarificationStream = createUIMessageStream({ execute: async ({ writer }) => { const messageId = generateUUID(); + writeAgentProgressChunk( + writer, + { + stage: "clarify", + currentStep: "lock_target", + title: "等待你确认关键信息", + message: + smartAutoClarificationQuestion || + smartAutoFriendlyMessage || + "我需要先确认目标图或执行范围,避免误处理。", + toolName: "clarification", + capability: smartAutoExecution?.preferredCapability || undefined, + }, + "clarification:progress", + ); + writeCurrentAgentTargetLockChunk(writer, "clarification:target-lock"); writer.write({ type: "data-appendMessage", data: JSON.stringify({ @@ -8374,6 +8800,208 @@ export async function POST(request: Request) { : []; const directAgentToolTargetImageUrl = directAgentToolTargetImageUrls[0] || null; + if ( + shouldRunAgentConversation && + !smartAutoNeedsClarification && + directAgentExecution?.toolName === "analyzeImage" + ) { + if (directAgentToolTargetImageUrls.length <= 0) { + const missingTargetMessage = getDirectAgentToolTargetMissingMessage("analyze"); + const missingTargetStream = createUIMessageStream({ + execute: async ({ writer }) => { + const messageId = generateUUID(); + writeCurrentAgentTargetLockChunk(writer, "agent:analyze:missing-target-lock"); + writeAssistantTextChunk( + writer, + missingTargetMessage, + "agent:analyze:missing-target", + messageId, + ); + + await saveMessages({ + messages: [ + { + id: messageId, + chatId: id, + role: "assistant", + parts: [{ type: "text", text: missingTargetMessage }], + attachments: [], + createdAt: new Date(), + videoStorageStatus: null, + temporaryVideoUrl: null, + permanentVideoUrl: null, + archivedAt: null, + videoMetadata: null, + }, + ], + }); + }, + }); + + return createSseResponse(missingTargetStream); + } + + const analysisAssistantMessageId = generateUUID(); + const analysisSummaryAssetIds = Array.from( + new Set([ + ...(requestTargetResolution?.targetAssetIds || []), + ...(requestResolvedMediaInput.selectedAssetIds || []), + ...(requestResolvedMediaInput.uploadedAssetIds || []), + ...extractMessageImageAssetIds(message.parts as any[]), + ]), + ); + + const directAnalyzeStream = createUIMessageStream({ + execute: async ({ writer }) => { + writeAgentProgressChunk( + writer, + { + stage: "planning", + currentStep: "analyze", + title: "正在分析目标图片", + message: "我会先提取稳定的视觉摘要,再整理成更直接的分析结论。", + toolName: "analyzeImage", + capability: "analyze", + }, + "agent:analyze:progress-planning", + ); + writeCurrentAgentTargetLockChunk(writer, "agent:analyze:target-lock"); + + try { + const { summarizeImageForExecutionReport } = await import("@/lib/ai/smart-analyzer"); + const analysisSummary = await summarizeImageForExecutionReport({ + text: requestTextContent, + imageUrls: directAgentToolTargetImageUrls, + context: effectiveAutoContextText || undefined, + preferredModelId: preferredAgentModelId || finalModelId, + assetIds: analysisSummaryAssetIds, + }); + + if (!analysisSummary?.trim()) { + throw new Error("当前图片暂时无法提取稳定的视觉摘要,请稍后再试。"); + } + + const analysisAnswer = await buildDirectAgentImageAnalysisAnswer({ + question: requestTextContent, + summary: analysisSummary.trim(), + modelId: finalModelId || preferredAgentModelId, + }); + const assistantText = prependImageModelBadge( + [ + getDirectAgentToolSuccessMessage("analyze"), + `图像观察:\n${analysisSummary.trim()}`, + analysisAnswer.trim() ? `分析结论:\n${analysisAnswer.trim()}` : "", + ] + .filter(Boolean) + .join("\n\n"), + getDirectAgentToolLabel("analyze"), + ); + + await saveMessages({ + messages: [ + { + id: analysisAssistantMessageId, + chatId: id, + role: "assistant", + parts: [{ type: "text", text: assistantText }], + attachments: [], + createdAt: new Date(), + videoStorageStatus: null, + temporaryVideoUrl: null, + permanentVideoUrl: null, + archivedAt: null, + videoMetadata: null, + }, + ], + }); + + try { + await persistImageWorkflowTurn({ + userId: session.user.id, + chatId: id, + projectId: contextPayload?.projectId || null, + currentIntent: "vision", + currentSubIntent: smartAutoExecution?.routeSubIntent || "analyze", + currentFocusAssetIds: requestTargetResolution?.targetAssetIds || null, + currentFocusImageUrls: + directAgentToolTargetImageUrls.length > 0 ? directAgentToolTargetImageUrls : null, + lastResolvedTargetAssetIds: requestTargetResolution?.targetAssetIds || null, + lastResolvedTargetImageUrls: + directAgentToolTargetImageUrls.length > 0 ? directAgentToolTargetImageUrls : null, + lastMessageId: analysisAssistantMessageId, + lastUserPrompt: requestTextContent, + lastSourceImageUrls: + directAgentToolTargetImageUrls.length > 0 ? directAgentToolTargetImageUrls : null, + }); + } catch (memoryError) { + console.warn("[Chat API] Failed to persist direct analyze working state:", memoryError); + } + + writeAssistantTextChunk( + writer, + assistantText, + "agent:analyze:success", + analysisAssistantMessageId, + ); + writeAgentProgressChunk( + writer, + { + stage: "completed", + currentStep: "finalize", + title: "图片分析完成", + message: "我已经整理好可直接阅读的分析结论。", + toolName: "analyzeImage", + capability: "analyze", + }, + "agent:analyze:progress-completed", + ); + } catch (directAnalyzeError) { + console.error("[Chat API] Direct agent image analysis failed:", directAnalyzeError); + const errorMessage = getDirectAgentToolErrorMessage("analyze", directAnalyzeError); + + await saveMessages({ + messages: [ + { + id: analysisAssistantMessageId, + chatId: id, + role: "assistant", + parts: [{ type: "text", text: errorMessage }], + attachments: [], + createdAt: new Date(), + videoStorageStatus: null, + temporaryVideoUrl: null, + permanentVideoUrl: null, + archivedAt: null, + videoMetadata: null, + }, + ], + }); + + writeAssistantTextChunk( + writer, + errorMessage, + "agent:analyze:error", + analysisAssistantMessageId, + ); + writeAgentProgressChunk( + writer, + { + stage: "failed", + currentStep: "analyze", + title: "图片分析失败", + message: errorMessage, + toolName: "analyzeImage", + capability: "analyze", + }, + "agent:analyze:progress-failed", + ); + } + }, + }); + + return createSseResponse(directAnalyzeStream); + } + if ( shouldRunAgentConversation && !smartAutoNeedsClarification && @@ -8383,11 +9011,36 @@ export async function POST(request: Request) { String(smartAutoOptimizedPrompt || requestTextContent || "").trim() || "生成图片"; const directImageStream = createUIMessageStream({ execute: async ({ writer }) => { + writeAgentProgressChunk( + writer, + { + stage: "planning", + currentStep: "select_tool", + title: "已选中图片生成工具", + message: "我正在整理参考图和生图参数,准备开始生成。", + toolName: "generateImage", + capability: "generate_image", + }, + "agent:generate_image:progress-select-tool", + ); + writeCurrentAgentTargetLockChunk(writer, "agent:generate_image:target-lock"); writeAssistantTextChunk( writer, "", "agent:generate_image:start", ); + writeAgentProgressChunk( + writer, + { + stage: "executing", + currentStep: "execute", + title: "正在生成图片", + message: "我会结合当前提示词和参考图生成新的画面。", + toolName: "generateImage", + capability: "generate_image", + }, + "agent:generate_image:progress-executing", + ); if (contextPayload?.source === "canvas") { writeImageGenerationStatusChunk( writer, @@ -8517,6 +9170,18 @@ export async function POST(request: Request) { "agent:generate_image:status-completed", ); } + writeAgentProgressChunk( + writer, + { + stage: "completed", + currentStep: "finalize", + title: "图片生成完成", + message: "结果已经回写到对话和画布。", + toolName: "generateImage", + capability: "generate_image", + }, + "agent:generate_image:progress-completed", + ); writeAssistantTextChunk( writer, "", @@ -8562,6 +9227,18 @@ export async function POST(request: Request) { "agent:generate_image:status-failed", ); } + writeAgentProgressChunk( + writer, + { + stage: "failed", + currentStep: "execute", + title: "图片生成失败", + message: errorMessage, + toolName: "generateImage", + capability: "generate_image", + }, + "agent:generate_image:progress-failed", + ); writeAssistantTextChunk( writer, "", @@ -8584,6 +9261,19 @@ export async function POST(request: Request) { const directVideoStream = createUIMessageStream({ execute: async ({ writer }) => { const assistantMessageId = generateUUID(); + writeAgentProgressChunk( + writer, + { + stage: "planning", + currentStep: "select_tool", + title: "已选中视频生成工具", + message: "我正在整理模式、参考图和视频参数。", + toolName: "generateVideo", + capability: "generate_video", + }, + "agent:generate_video:progress-select-tool", + ); + writeCurrentAgentTargetLockChunk(writer, "agent:generate_video:target-lock"); try { const plannedArgs = findAgentToolCallArgs( "generateVideo", @@ -8622,6 +9312,18 @@ export async function POST(request: Request) { effectiveVideoParams?.ratio === "adaptive" ? effectiveVideoParams.ratio : undefined; + writeAgentProgressChunk( + writer, + { + stage: "executing", + currentStep: "execute", + title: "正在生成视频", + message: "我正在按当前模式执行视频生成。", + toolName: "generateVideo", + capability: "generate_video", + }, + "agent:generate_video:progress-executing", + ); const result = await executeDirectVideoGeneration({ prompt: generationPrompt, mode, @@ -8722,6 +9424,18 @@ export async function POST(request: Request) { "agent:generate_video:canvas-media", ); } + writeAgentProgressChunk( + writer, + { + stage: "completed", + currentStep: "finalize", + title: "视频生成完成", + message: "结果已经写回对话和画布。", + toolName: "generateVideo", + capability: "generate_video", + }, + "agent:generate_video:progress-completed", + ); } catch (directToolError) { console.error("[Chat API] Direct agent video generation failed:", directToolError); const errorMessage = getDirectAgentToolErrorMessage( @@ -8773,6 +9487,18 @@ export async function POST(request: Request) { "agent:generate_video:error", assistantMessageId, ); + writeAgentProgressChunk( + writer, + { + stage: "failed", + currentStep: "execute", + title: "视频生成失败", + message: errorMessage, + toolName: "generateVideo", + capability: "generate_video", + }, + "agent:generate_video:progress-failed", + ); } }, }); @@ -8784,7 +9510,9 @@ export async function POST(request: Request) { shouldRunAgentConversation && !smartAutoNeedsClarification && directAgentExecution && - (directAgentExecution.toolName === "removeBackground" || + (directAgentExecution.toolName === "editImage" || + directAgentExecution.toolName === "enhanceImage" || + directAgentExecution.toolName === "removeBackground" || directAgentExecution.toolName === "resizeImage" || directAgentExecution.toolName === "extendImage" || directAgentExecution.toolName === "boxCutout") @@ -8797,6 +9525,10 @@ export async function POST(request: Request) { const missingTargetStream = createUIMessageStream({ execute: async ({ writer }) => { const messageId = generateUUID(); + writeCurrentAgentTargetLockChunk( + writer, + `agent:${directAgentToolCapability}:missing-target-lock`, + ); writeAssistantTextChunk( writer, missingTargetMessage, @@ -8828,219 +9560,336 @@ export async function POST(request: Request) { } const assistantMessageId = generateUUID(); - await saveMessages({ - messages: [ - { - id: assistantMessageId, - chatId: id, - role: "assistant", - parts: [{ type: "text", text: "处理中..." }], - attachments: [], - createdAt: new Date(), - videoStorageStatus: null, - temporaryVideoUrl: null, - permanentVideoUrl: null, - archivedAt: null, - videoMetadata: null, - }, - ], - }); - - try { - let resultOriginalUrl = ""; - let resultThumbnailUrl: string | null = null; - let resultImageSize = "2K"; - let resultAssetId: string | null = null; - - if (directAgentToolCapability === "remove_background") { - const sourceBuffer = await fetchImageBufferFromUrl(directAgentToolTargetImageUrl); - const result = await executeRmbgJob({ - userId: session.user.id, - imageBuffer: sourceBuffer, - prompt: requestTextContent || "抠图处理", - chatId: id, - messageId: assistantMessageId, - sourceImageUrl: directAgentToolTargetImageUrl, - }); - - resultOriginalUrl = result.original_url; - resultThumbnailUrl = result.thumbnail_url; - resultImageSize = "2K"; - resultAssetId = result.mediaAssetId || null; - } else if (directAgentToolCapability === "resize") { - const plannedArgs = findAgentToolCallArgs( - "resizeImage", - smartAutoExecution, - smartAutoPlan, - ); - const inferredOptions = inferResizeOptionsFromText(requestTextContent); - const canvasWidth = toFiniteNumber( - plannedArgs?.canvasWidth ?? plannedArgs?.width ?? inferredOptions.canvasWidth, - ); - const canvasHeight = toFiniteNumber( - plannedArgs?.canvasHeight ?? plannedArgs?.height ?? inferredOptions.canvasHeight, - ); - - if (!canvasWidth || !canvasHeight) { - throw new ResizeServiceError( - "请告诉我目标尺寸或比例,例如 1024x1024、4:5、16:9。", - 400, - ); - } - - const transparentBackground = - plannedArgs?.transparentBackground === true || - plannedArgs?.transparentBackground === "true" || - inferredOptions.transparentBackground === true; - const backgroundColor = - typeof plannedArgs?.backgroundColor === "string" - ? plannedArgs.backgroundColor - : inferredOptions.backgroundColor; - const mimeType = - typeof plannedArgs?.mimeType === "string" ? plannedArgs.mimeType : undefined; - const result = await executeResizeJob({ - userId: session.user.id, - imageUrl: directAgentToolTargetImageUrl, - prompt: requestTextContent || "尺寸调整处理", - chatId: id, - messageId: assistantMessageId, - sourceImageUrl: directAgentToolTargetImageUrl, - canvasWidth, - canvasHeight, - transparentBackground, - backgroundColor, - mimeType, - }); - - resultOriginalUrl = result.original_url; - resultThumbnailUrl = result.thumbnail_url; - resultImageSize = `${result.canvas_width}x${result.canvas_height}`; - resultAssetId = result.mediaAssetId || null; - } else if (directAgentToolCapability === "extend") { - const plannedArgs = findAgentToolCallArgs( - "extendImage", - smartAutoExecution, - smartAutoPlan, - ); - const inferredOptions = inferExtendOptionsFromText(requestTextContent); - const xScale = toFiniteNumber(plannedArgs?.xScale ?? inferredOptions.xScale); - const yScale = toFiniteNumber(plannedArgs?.yScale ?? inferredOptions.yScale); - const result = await executeExtendJob({ - userId: session.user.id, - imageUrl: directAgentToolTargetImageUrl, - prompt: requestTextContent || "图像拓展处理", - chatId: id, - messageId: assistantMessageId, - sourceImageUrl: directAgentToolTargetImageUrl, - ...(xScale ? { xScale } : {}), - ...(yScale ? { yScale } : {}), - }); - - resultOriginalUrl = result.original_url; - resultThumbnailUrl = result.thumbnail_url; - resultImageSize = "2K"; - resultAssetId = result.mediaAssetId || null; - } else if (directAgentToolCapability === "box_cutout") { - const plannedArgs = findAgentToolCallArgs( - "boxCutout", - smartAutoExecution, - smartAutoPlan, - ); - const cropRect = - plannedArgs?.cropRect && typeof plannedArgs.cropRect === "object" - ? (plannedArgs.cropRect as Record) - : undefined; - - if (!cropRect) { - throw new BoxCutoutServiceError( - "缺少框选区域,暂时无法执行框选抠图。", - 400, - ); - } - - const result = await executeBoxCutoutJob({ - userId: session.user.id, - imageUrl: directAgentToolTargetImageUrl, - cropRect: { - x: toFiniteNumber(cropRect.x), - y: toFiniteNumber(cropRect.y), - width: toFiniteNumber(cropRect.width), - height: toFiniteNumber(cropRect.height), + const directToolLabel = getDirectAgentToolLabel(directAgentToolCapability); + const directToolStream = createUIMessageStream({ + execute: async ({ writer }) => { + writeAgentProgressChunk( + writer, + { + stage: "planning", + currentStep: "select_tool", + title: `已选中${directToolLabel}`, + message: "我正在整理目标图和当前参数,准备开始执行。", + toolName: directAgentExecution.toolName, + capability: directAgentToolCapability, }, - paddingRatio: toFiniteNumber(plannedArgs?.paddingRatio), - prompt: requestTextContent || "框选抠图处理", - chatId: id, - messageId: assistantMessageId, - sourceNodeId: - typeof plannedArgs?.sourceNodeId === "string" - ? plannedArgs.sourceNodeId - : undefined, - }); - - resultOriginalUrl = result.original_url; - resultThumbnailUrl = result.thumbnail_url || null; - resultImageSize = "2K"; - resultAssetId = result.mediaAssetId || null; - } - - const assistantText = prependImageModelBadge( - [ - getDirectAgentToolSuccessMessage(directAgentToolCapability), - buildAgentToolImageMarkdown({ - originalUrl: resultOriginalUrl, - thumbnailUrl: resultThumbnailUrl, - imageSize: resultImageSize, - }), - ] - .filter(Boolean) - .join("\n\n"), - getDirectAgentToolLabel(directAgentToolCapability), - ); - - await updateMessageById({ - messageId: assistantMessageId, - chatId: id, - parts: [{ type: "text", text: assistantText }], - }); - - try { - const resultAssetIds = resultAssetId ? [resultAssetId] : null; - const resultImageUrls = resultOriginalUrl ? [resultOriginalUrl] : null; - await persistImageWorkflowTurn({ - userId: session.user.id, - chatId: id, - projectId: contextPayload?.projectId || null, - currentIntent: "image_edit", - currentSubIntent: directAgentToolCapability, - currentFocusAssetIds: resultAssetIds, - currentFocusImageUrls: resultImageUrls, - lastGeneratedAssetIds: resultAssetIds, - lastGeneratedImageUrls: resultImageUrls, - lastResolvedTargetAssetIds: resultAssetIds, - lastResolvedTargetImageUrls: resultImageUrls, - lastMessageId: assistantMessageId, - lastUserPrompt: requestTextContent, - lastOptimizedPrompt: smartAutoOptimizedPrompt || undefined, - lastRequestedImageCount: resultImageUrls?.length || 1, - lastImageSize: resultImageSize || undefined, - lastSourceImageUrls: directAgentToolTargetImageUrls, - lastResultImageUrls: resultImageUrls, - }); - } catch (memoryError) { - console.warn( - `[Chat API] Failed to update working state after ${directAgentToolCapability}:`, - memoryError, + `agent:${directAgentToolCapability}:progress-select-tool`, ); - } - - if (directAgentExecution.publishToCanvas && contextPayload?.source === "canvas") { - console.log( - `[Chat API] Agent publishToCanvas satisfied by assistant media auto-sync (${directAgentToolCapability})`, + writeCurrentAgentTargetLockChunk( + writer, + `agent:${directAgentToolCapability}:target-lock`, + ); + writeAgentProgressChunk( + writer, + { + stage: "executing", + currentStep: "execute", + title: `正在执行${directToolLabel}`, + message: "执行完成后我会把结果直接回写到当前对话和画布。", + toolName: directAgentExecution.toolName, + capability: directAgentToolCapability, + }, + `agent:${directAgentToolCapability}:progress-executing`, ); - } - const directToolStream = createUIMessageStream({ - execute: async ({ writer }) => { + try { + let resultOriginalUrl = ""; + let resultThumbnailUrl: string | null = null; + let resultImageSize = "2K"; + let resultAssetId: string | null = null; + + if (directAgentToolCapability === "generic_edit") { + const directEditPrompt = + buildDirectAgentExecutionPrompt({ + originalText: requestTextContent || "", + optimizedPrompt: smartAutoOptimizedPrompt, + hiddenPromptPrefix, + fallback: "在保持主体和整体构图稳定的前提下完成本轮图片编辑。", + }) || "在保持主体和整体构图稳定的前提下完成本轮图片编辑。"; + const result = await generateCanvasImage({ + prompt: directEditPrompt, + negativePrompt: effectiveImageParams?.negativePrompt, + model: finalModelId, + aspectRatio: + effectiveImageParams?.aspectRatio || defaultImageQualityParams.aspectRatio, + imageSize: + effectiveImageParams?.imageSize || defaultImageQualityParams.imageSize, + imageCount: 1, + referenceImages: directAgentToolTargetImageUrls, + debugLabel: "agent-direct-edit", + debugMeta: { + chatId: id, + projectId: contextPayload?.projectId || null, + subIntent: smartAutoExecution?.routeSubIntent || null, + }, + }); + + const firstImage = result.images[0]; + if (!firstImage?.originalUrl) { + throw new Error("图片编辑完成但未返回结果图"); + } + + resultOriginalUrl = firstImage.originalUrl; + resultThumbnailUrl = firstImage.thumbnailUrl || null; + resultImageSize = + effectiveImageParams?.imageSize || defaultImageQualityParams.imageSize || "2K"; + + const editResultMarkdown = buildAgentToolImagesMarkdown([ + { + originalUrl: resultOriginalUrl, + thumbnailUrl: resultThumbnailUrl, + imageSize: resultImageSize, + }, + ]); + await saveGeneratedImages( + editResultMarkdown, + session.user.id, + id, + assistantMessageId, + directEditPrompt, + result.modelRef || finalModelId, + { + sourceAssetIds: requestTargetResolution?.targetAssetIds || undefined, + sourceImageUrls: directAgentToolTargetImageUrls, + relationType: "edited_from", + sourceType: "edited", + projectId: contextPayload?.projectId || null, + userPrompt: requestTextContent, + optimizedPrompt: directEditPrompt, + requestedImageCount: 1, + aspectRatio: + effectiveImageParams?.aspectRatio || defaultImageQualityParams.aspectRatio, + imageSize: resultImageSize, + }, + ); + } else if (directAgentToolCapability === "enhance") { + const result = await executeDirectAgentEnhanceJob({ + requestUrl: request.url, + requestHeaders: request.headers, + imageUrl: directAgentToolTargetImageUrl, + prompt: requestTextContent || "图像增强处理", + chatId: id, + messageId: assistantMessageId, + }); + + resultOriginalUrl = result.originalUrl; + resultThumbnailUrl = result.thumbnailUrl; + resultImageSize = result.imageSize; + } else if (directAgentToolCapability === "remove_background") { + const sourceBuffer = await fetchImageBufferFromUrl(directAgentToolTargetImageUrl); + const result = await executeRmbgJob({ + userId: session.user.id, + imageBuffer: sourceBuffer, + prompt: requestTextContent || "抠图处理", + chatId: id, + messageId: assistantMessageId, + sourceImageUrl: directAgentToolTargetImageUrl, + }); + + resultOriginalUrl = result.original_url; + resultThumbnailUrl = result.thumbnail_url; + resultImageSize = "2K"; + resultAssetId = result.mediaAssetId || null; + } else if (directAgentToolCapability === "resize") { + const plannedArgs = findAgentToolCallArgs( + "resizeImage", + smartAutoExecution, + smartAutoPlan, + ); + const inferredOptions = inferResizeOptionsFromText(requestTextContent); + const canvasWidth = toFiniteNumber( + plannedArgs?.canvasWidth ?? plannedArgs?.width ?? inferredOptions.canvasWidth, + ); + const canvasHeight = toFiniteNumber( + plannedArgs?.canvasHeight ?? plannedArgs?.height ?? inferredOptions.canvasHeight, + ); + + if (!canvasWidth || !canvasHeight) { + throw new ResizeServiceError( + "请告诉我目标尺寸或比例,例如 1024x1024、4:5、16:9。", + 400, + ); + } + + const transparentBackground = + plannedArgs?.transparentBackground === true || + plannedArgs?.transparentBackground === "true" || + inferredOptions.transparentBackground === true; + const backgroundColor = + typeof plannedArgs?.backgroundColor === "string" + ? plannedArgs.backgroundColor + : inferredOptions.backgroundColor; + const mimeType = + typeof plannedArgs?.mimeType === "string" ? plannedArgs.mimeType : undefined; + const result = await executeResizeJob({ + userId: session.user.id, + imageUrl: directAgentToolTargetImageUrl, + prompt: requestTextContent || "尺寸调整处理", + chatId: id, + messageId: assistantMessageId, + sourceImageUrl: directAgentToolTargetImageUrl, + canvasWidth, + canvasHeight, + transparentBackground, + backgroundColor, + mimeType, + }); + + resultOriginalUrl = result.original_url; + resultThumbnailUrl = result.thumbnail_url; + resultImageSize = `${result.canvas_width}x${result.canvas_height}`; + resultAssetId = result.mediaAssetId || null; + } else if (directAgentToolCapability === "extend") { + const plannedArgs = findAgentToolCallArgs( + "extendImage", + smartAutoExecution, + smartAutoPlan, + ); + const inferredOptions = inferExtendOptionsFromText(requestTextContent); + const xScale = toFiniteNumber(plannedArgs?.xScale ?? inferredOptions.xScale); + const yScale = toFiniteNumber(plannedArgs?.yScale ?? inferredOptions.yScale); + const result = await executeExtendJob({ + userId: session.user.id, + imageUrl: directAgentToolTargetImageUrl, + prompt: requestTextContent || "图像拓展处理", + chatId: id, + messageId: assistantMessageId, + sourceImageUrl: directAgentToolTargetImageUrl, + ...(xScale ? { xScale } : {}), + ...(yScale ? { yScale } : {}), + }); + + resultOriginalUrl = result.original_url; + resultThumbnailUrl = result.thumbnail_url; + resultImageSize = "2K"; + resultAssetId = result.mediaAssetId || null; + } else if (directAgentToolCapability === "box_cutout") { + const plannedArgs = findAgentToolCallArgs( + "boxCutout", + smartAutoExecution, + smartAutoPlan, + ); + const cropRect = + plannedArgs?.cropRect && typeof plannedArgs.cropRect === "object" + ? (plannedArgs.cropRect as Record) + : undefined; + + if (!cropRect) { + throw new BoxCutoutServiceError( + "缺少框选区域,暂时无法执行框选抠图。", + 400, + ); + } + + const result = await executeBoxCutoutJob({ + userId: session.user.id, + imageUrl: directAgentToolTargetImageUrl, + cropRect: { + x: toFiniteNumber(cropRect.x), + y: toFiniteNumber(cropRect.y), + width: toFiniteNumber(cropRect.width), + height: toFiniteNumber(cropRect.height), + }, + paddingRatio: toFiniteNumber(plannedArgs?.paddingRatio), + prompt: requestTextContent || "框选抠图处理", + chatId: id, + messageId: assistantMessageId, + sourceNodeId: + typeof plannedArgs?.sourceNodeId === "string" + ? plannedArgs.sourceNodeId + : undefined, + }); + + resultOriginalUrl = result.original_url; + resultThumbnailUrl = result.thumbnail_url || null; + resultImageSize = "2K"; + resultAssetId = result.mediaAssetId || null; + } + + if (!resultAssetId && resultOriginalUrl) { + try { + const [resultAsset] = await getMediaAssetsByUserAndUrls({ + userId: session.user.id, + urls: [resultOriginalUrl], + }); + resultAssetId = resultAsset?.id || null; + } catch (assetLookupError) { + console.warn( + `[Chat API] Failed to lookup result asset after ${directAgentToolCapability}:`, + assetLookupError, + ); + } + } + + const assistantText = prependImageModelBadge( + [ + getDirectAgentToolSuccessMessage(directAgentToolCapability), + buildAgentToolImageMarkdown({ + originalUrl: resultOriginalUrl, + thumbnailUrl: resultThumbnailUrl, + imageSize: resultImageSize, + }), + ] + .filter(Boolean) + .join("\n\n"), + directToolLabel, + ); + + await saveMessages({ + messages: [ + { + id: assistantMessageId, + chatId: id, + role: "assistant", + parts: [{ type: "text", text: assistantText }], + attachments: [], + createdAt: new Date(), + videoStorageStatus: null, + temporaryVideoUrl: null, + permanentVideoUrl: null, + archivedAt: null, + videoMetadata: null, + }, + ], + }); + + try { + const resultAssetIds = resultAssetId ? [resultAssetId] : null; + const resultImageUrls = resultOriginalUrl ? [resultOriginalUrl] : null; + await persistImageWorkflowTurn({ + userId: session.user.id, + chatId: id, + projectId: contextPayload?.projectId || null, + currentIntent: "image_edit", + currentSubIntent: + smartAutoExecution?.routeSubIntent || directAgentToolCapability, + currentFocusAssetIds: resultAssetIds, + currentFocusImageUrls: resultImageUrls, + lastGeneratedAssetIds: resultAssetIds, + lastGeneratedImageUrls: resultImageUrls, + lastResolvedTargetAssetIds: resultAssetIds, + lastResolvedTargetImageUrls: resultImageUrls, + lastMessageId: assistantMessageId, + lastUserPrompt: requestTextContent, + lastOptimizedPrompt: smartAutoOptimizedPrompt || undefined, + lastRequestedImageCount: resultImageUrls?.length || 1, + lastImageSize: resultImageSize || undefined, + lastSourceImageUrls: directAgentToolTargetImageUrls, + lastResultImageUrls: resultImageUrls, + }); + } catch (memoryError) { + console.warn( + `[Chat API] Failed to update working state after ${directAgentToolCapability}:`, + memoryError, + ); + } + + if (directAgentExecution.publishToCanvas && contextPayload?.source === "canvas") { + console.log( + `[Chat API] Agent publishToCanvas satisfied by assistant media auto-sync (${directAgentToolCapability})`, + ); + } + writeAssistantTextChunk( writer, assistantText, @@ -9053,74 +9902,87 @@ export async function POST(request: Request) { { messageId: assistantMessageId, imageUrls: resultOriginalUrl ? [resultOriginalUrl] : [], - prompt: requestTextContent || getDirectAgentToolLabel(directAgentToolCapability), + prompt: requestTextContent || directToolLabel, sourceImageUrls: directAgentToolTargetImageUrls, }, `agent:${directAgentToolCapability}:canvas-media`, ); } - writeAssistantTextChunk( + writeAgentProgressChunk( writer, - "", - `agent:${directAgentToolCapability}:image-end`, + { + stage: "completed", + currentStep: "finalize", + title: `${directToolLabel}完成`, + message: "结果已经回写到当前对话和画布。", + toolName: directAgentExecution.toolName, + capability: directAgentToolCapability, + }, + `agent:${directAgentToolCapability}:progress-completed`, + ); + } catch (directToolError) { + console.error( + `[Chat API] Direct agent tool ${directAgentToolCapability} failed:`, + directToolError, ); - }, - }); - return createSseResponse(directToolStream); - } catch (directToolError) { - console.error( - `[Chat API] Direct agent tool ${directAgentToolCapability} failed:`, - directToolError, - ); + if ( + !(directToolError instanceof RmbgServiceError) && + !(directToolError instanceof ResizeServiceError) && + !(directToolError instanceof ExtendServiceError) && + !(directToolError instanceof BoxCutoutServiceError) + ) { + console.warn( + `[Chat API] Direct agent tool ${directAgentToolCapability} threw unexpected error type`, + ); + } - if ( - !(directToolError instanceof RmbgServiceError) && - !(directToolError instanceof ResizeServiceError) && - !(directToolError instanceof ExtendServiceError) && - !(directToolError instanceof BoxCutoutServiceError) - ) { - console.warn( - `[Chat API] Direct agent tool ${directAgentToolCapability} threw unexpected error type`, - ); - } + const errorMessage = getDirectAgentToolErrorMessage( + directAgentToolCapability, + directToolError, + ); - const errorMessage = getDirectAgentToolErrorMessage( - directAgentToolCapability, - directToolError, - ); + await saveMessages({ + messages: [ + { + id: assistantMessageId, + chatId: id, + role: "assistant", + parts: [{ type: "text", text: errorMessage }], + attachments: [], + createdAt: new Date(), + videoStorageStatus: null, + temporaryVideoUrl: null, + permanentVideoUrl: null, + archivedAt: null, + videoMetadata: null, + }, + ], + }); - try { - await updateMessageById({ - messageId: assistantMessageId, - chatId: id, - parts: [{ type: "text", text: errorMessage }], - }); - } catch (updateError) { - console.warn( - `[Chat API] Failed to persist direct-tool error message (${directAgentToolCapability}):`, - updateError, - ); - } - - const directToolErrorStream = createUIMessageStream({ - execute: async ({ writer }) => { writeAssistantTextChunk( writer, errorMessage, `agent:${directAgentToolCapability}:error`, assistantMessageId, ); - writeAssistantTextChunk( + writeAgentProgressChunk( writer, - "", - `agent:${directAgentToolCapability}:image-end-error`, + { + stage: "failed", + currentStep: "execute", + title: `${directToolLabel}失败`, + message: errorMessage, + toolName: directAgentExecution.toolName, + capability: directAgentToolCapability, + }, + `agent:${directAgentToolCapability}:progress-failed`, ); - }, - }); + } + }, + }); - return createSseResponse(directToolErrorStream); - } + return createSseResponse(directToolStream); } let finalMergedUsage: AppUsage | undefined; @@ -11031,6 +11893,19 @@ export async function POST(request: Request) { }, "protocol:request" ); + writeAgentProgressChunk( + dataStream, + { + stage: "planning", + currentStep: "analyze", + title: "正在理解你的需求", + message: "我会先结合当前图、历史结果和画布上下文整理执行方案。", + toolName: "agentConversation", + capability: smartAutoExecution?.preferredCapability || undefined, + }, + "chat-default:progress-planning", + ); + writeCurrentAgentTargetLockChunk(dataStream, "chat-default:target-lock"); for (const event of pendingProtocolDebugEvents) { writeProtocolDebugChunk( dataStream, diff --git a/app/(chat)/video-canvas/page.tsx b/app/(chat)/video-canvas/page.tsx new file mode 100644 index 000000000..1e3f80477 --- /dev/null +++ b/app/(chat)/video-canvas/page.tsx @@ -0,0 +1,60 @@ +"use client"; + +import { useEffect } from "react"; +import { useRouter, useSearchParams } from "next/navigation"; +import { Loader2 } from "lucide-react"; + +export default function VideoCanvasRedirectPage() { + const router = useRouter(); + const searchParams = useSearchParams(); + + useEffect(() => { + const shouldCreateNew = searchParams.get("new") === "1"; + + const openVideoCanvas = async () => { + if (shouldCreateNew) { + const newId = crypto.randomUUID(); + router.replace(`/canvas/${newId}?mode=video&workspaceType=video`); + return; + } + + try { + const response = await fetch("/api/canvas?workspaceType=video", { + cache: "no-store", + }); + if (response.ok) { + const result = await response.json(); + const items = result?.data || []; + if (Array.isArray(items) && items.length > 0) { + const sorted = [...items].sort((a, b) => { + const aTime = new Date(a.updatedAt || a.createdAt || 0).getTime(); + const bTime = new Date(b.updatedAt || b.createdAt || 0).getTime(); + return bTime - aTime; + }); + const latest = sorted[0]; + if (latest?.id) { + router.replace(`/canvas/${latest.id}?mode=video&workspaceType=video`); + return; + } + } + } + } catch (_error) { + // ignore and fallback + } + + const newId = crypto.randomUUID(); + router.replace(`/canvas/${newId}?mode=video&workspaceType=video`); + }; + + void openVideoCanvas(); + }, [router, searchParams]); + + return ( +
    +
    + + 正在打开视频画布... +
    +
    + ); +} diff --git a/app/api/canvas/[id]/route.ts b/app/api/canvas/[id]/route.ts index 5cb264a85..77c3b61d2 100644 --- a/app/api/canvas/[id]/route.ts +++ b/app/api/canvas/[id]/route.ts @@ -5,6 +5,14 @@ import { canvasProject } from '@/lib/db/schema'; import { syncCanvasNodesForProject } from '@/lib/db/queries'; import { eq, and } from 'drizzle-orm'; +function resolveWorkspaceType(input: unknown) { + return input === "agent" || input === "video" ? input : "canvas"; +} + +function getDefaultWorkspaceTitle(workspaceType: ReturnType) { + return workspaceType === "video" ? "未命名视频画布" : "未命名画布"; +} + // 获取单个画布 export async function GET( request: NextRequest, @@ -53,6 +61,10 @@ export async function PUT( const { id } = await params; const body = await request.json(); const { title, description, thumbnail, canvasData } = body; + const workspaceType = + body && Object.prototype.hasOwnProperty.call(body, "workspaceType") + ? resolveWorkspaceType(body.workspaceType) + : undefined; const syncedCanvasData = canvasData !== undefined ? await syncCanvasNodesForProject({ @@ -79,6 +91,7 @@ export async function PUT( if (title !== undefined) updateData.title = title; if (description !== undefined) updateData.description = description; if (thumbnail !== undefined) updateData.thumbnail = thumbnail; + if (workspaceType !== undefined) updateData.workspaceType = workspaceType; if (syncedCanvasData !== undefined) updateData.canvasData = syncedCanvasData; const [updatedProject] = await db @@ -100,8 +113,9 @@ export async function PUT( .values({ id, // 使用指定的 ID userId: session.user.id, - title: title || '未命名画布', + title: title || getDefaultWorkspaceTitle(workspaceType || "canvas"), description, + workspaceType: workspaceType || "canvas", canvasData: syncedCanvasData || { nodes: [], edges: [], diff --git a/app/api/canvas/download-zip/route.ts b/app/api/canvas/download-zip/route.ts index 5fc07c4c0..12426f233 100644 --- a/app/api/canvas/download-zip/route.ts +++ b/app/api/canvas/download-zip/route.ts @@ -32,6 +32,9 @@ function inferExt(url: string, contentType: string): string { if (type.includes("gif")) return "gif"; if (type.includes("bmp")) return "bmp"; if (type.includes("tiff")) return "tiff"; + if (type.includes("mp4")) return "mp4"; + if (type.includes("webm")) return "webm"; + if (type.includes("quicktime")) return "mov"; const cleanUrl = String(url || "").split("?")[0] || ""; const matched = cleanUrl.match(/\.([a-zA-Z0-9]{2,6})$/); diff --git a/app/api/canvas/generate/video/route.ts b/app/api/canvas/generate/video/route.ts new file mode 100644 index 000000000..aac3f4a9f --- /dev/null +++ b/app/api/canvas/generate/video/route.ts @@ -0,0 +1,112 @@ +import { NextResponse } from "next/server"; +import { auth } from "@/app/(auth)/auth"; +import { executeDirectVideoGeneration } from "@/lib/ai/tools/generate-video"; +import { filterReachableRemoteUrls } from "@/lib/net/url-access"; +import type { VideoGenerationMode, VideoRatio, VideoResolution } from "@/types/ai"; + +export const maxDuration = 300; + +interface GenerateVideoRequest { + prompt?: string; + mode?: VideoGenerationMode; + images?: string[]; + resolution?: VideoResolution; + ratio?: VideoRatio; + duration?: number; + watermark?: boolean; + cameraFixed?: boolean; + seed?: number; + returnLastFrame?: boolean; + preferredModelRef?: string; +} + +function inferMode(images: string[]): VideoGenerationMode { + if (images.length >= 3) return "reference-images"; + if (images.length >= 2) return "first-last-frame"; + if (images.length === 1) return "first-frame"; + return "text-to-video"; +} + +export async function POST(request: Request) { + try { + const session = await auth(); + if (!session?.user?.id) { + return NextResponse.json( + { success: false, error: "未登录" }, + { status: 401 } + ); + } + + const body = (await request.json().catch(() => ({}))) as GenerateVideoRequest; + const prompt = String(body.prompt || "").trim(); + if (!prompt) { + return NextResponse.json( + { success: false, error: "请输入视频提示词" }, + { status: 400 } + ); + } + + const inputImages = Array.isArray(body.images) + ? body.images.map((item) => String(item || "").trim()).filter(Boolean).slice(0, 4) + : []; + const { kept: reachableImages, dropped: unreachableImages } = + await filterReachableRemoteUrls(inputImages, { timeoutMs: 3000 }); + + if (inputImages.length > 0 && reachableImages.length === 0) { + return NextResponse.json( + { success: false, error: "参考图片链接不可访问,请重新上传后再试" }, + { status: 400 } + ); + } + + const mode = body.mode || inferMode(reachableImages); + const result = await executeDirectVideoGeneration({ + prompt, + mode, + images: reachableImages, + resolution: body.resolution, + ratio: body.ratio, + duration: + typeof body.duration === "number" && Number.isFinite(body.duration) + ? body.duration + : undefined, + watermark: body.watermark, + cameraFixed: body.cameraFixed, + seed: + typeof body.seed === "number" && Number.isFinite(body.seed) ? body.seed : undefined, + returnLastFrame: body.returnLastFrame, + preferredModelRef: + typeof body.preferredModelRef === "string" ? body.preferredModelRef : undefined, + }); + + if (!result.success || !result.videoUrl) { + return NextResponse.json( + { success: false, error: "视频生成失败,请稍后重试" }, + { status: 502 } + ); + } + + return NextResponse.json({ + success: true, + data: { + url: result.videoUrl, + metadata: result.metadata || null, + modelDisplayName: result.modelDisplayName, + modelId: result.modelId, + modelRef: result.modelRef, + mode, + images: reachableImages, + droppedImages: unreachableImages, + }, + }); + } catch (error) { + console.error("[Canvas Generate Video] Error:", error); + return NextResponse.json( + { + success: false, + error: error instanceof Error ? error.message : "生成视频失败", + }, + { status: 500 } + ); + } +} diff --git a/app/api/canvas/route.ts b/app/api/canvas/route.ts index ace961c7b..b1dce5359 100644 --- a/app/api/canvas/route.ts +++ b/app/api/canvas/route.ts @@ -5,6 +5,14 @@ import { canvasProject } from '@/lib/db/schema'; import { syncCanvasNodesForProject } from '@/lib/db/queries'; import { and, eq, desc } from 'drizzle-orm'; +function resolveWorkspaceType(input: unknown) { + return input === "agent" || input === "video" ? input : "canvas"; +} + +function getDefaultWorkspaceTitle(workspaceType: ReturnType) { + return workspaceType === "video" ? "未命名视频画布" : "未命名画布"; +} + // 获取画布列表 export async function GET(request: NextRequest) { try { @@ -13,13 +21,17 @@ export async function GET(request: NextRequest) { return NextResponse.json({ success: false, error: '未登录' }, { status: 401 }); } + const workspaceType = resolveWorkspaceType( + request.nextUrl.searchParams.get("workspaceType") + ); + const projects = await db .select() .from(canvasProject) .where( and( eq(canvasProject.userId, session.user.id), - eq(canvasProject.workspaceType, "canvas") + eq(canvasProject.workspaceType, workspaceType) ) ) .orderBy(desc(canvasProject.updatedAt)); @@ -41,13 +53,15 @@ export async function POST(request: NextRequest) { const body = await request.json(); const { title, description, canvasData } = body; + const workspaceType = resolveWorkspaceType(body?.workspaceType); const [insertedProject] = await db .insert(canvasProject) .values({ userId: session.user.id, - title: title || '未命名画布', + title: title || getDefaultWorkspaceTitle(workspaceType), description, + workspaceType, canvasData: canvasData || { nodes: [], edges: [], diff --git a/app/api/canvas/workflow/analyze/route.ts b/app/api/canvas/workflow/analyze/route.ts new file mode 100644 index 000000000..e4795b079 --- /dev/null +++ b/app/api/canvas/workflow/analyze/route.ts @@ -0,0 +1,415 @@ +import { generateText } from "ai"; +import { NextResponse } from "next/server"; +import { z } from "zod"; +import { auth } from "@/app/(auth)/auth"; +import { getLanguageModelById } from "@/lib/ai/dynamic-provider"; +import { inlineVisionImages } from "@/lib/ai/vision-inline"; +import { getAiModelAgentCodingModelId, isAiModelMultimodal } from "@/lib/db/ai-model-flags"; +import { + getAgentAiModelWithProvider, + getEnabledAiModelsWithProvider, +} from "@/lib/db/queries"; + +export const runtime = "nodejs"; +export const maxDuration = 180; + +const requestSchema = z.object({ + mode: z.enum(["video-analysis", "character-scene-extraction", "agent-plan"]), + prompt: z.string().trim().optional(), + imageUrls: z.array(z.string().trim()).optional(), + videoUrls: z.array(z.string().trim()).optional(), + nodeTitle: z.string().trim().optional(), +}); + +function sanitizeUrls(value: unknown, limit = 6) { + if (!Array.isArray(value)) return []; + return value + .map((item) => String(item || "").trim()) + .filter((url) => /^https?:\/\//i.test(url)) + .slice(0, limit); +} + +function supportsVision(model: { + supportsVision?: boolean | null; + capabilities?: unknown; + defaultParams?: unknown; +}) { + return ( + Boolean(model.supportsVision) || + isAiModelMultimodal({ + capabilities: model.capabilities, + defaultParams: model.defaultParams, + }) + ); +} + +function extractJsonBlock>(text: string): T | null { + const matched = String(text || "").match(/\{[\s\S]*\}/); + if (!matched) return null; + try { + return JSON.parse(matched[0]) as T; + } catch { + return null; + } +} + +function normalizeText(value: unknown) { + return String(value || "").trim(); +} + +function normalizeStringList(value: unknown, limit = 8) { + if (!Array.isArray(value)) return []; + return Array.from( + new Set( + value + .map((item) => String(item || "").trim()) + .filter(Boolean) + .slice(0, limit) + ) + ); +} + +function normalizeShotIdeas(value: unknown) { + if (!Array.isArray(value)) return []; + return value + .map((item, index) => { + const raw = + item && typeof item === "object" && !Array.isArray(item) + ? (item as Record) + : {}; + const title = normalizeText(raw.title || `镜头 ${index + 1}`); + const description = normalizeText(raw.description || raw.prompt || raw.summary); + if (!title && !description) return null; + return { + title: title || `镜头 ${index + 1}`, + description, + }; + }) + .filter( + (item): item is { title: string; description: string } => Boolean(item) + ) + .slice(0, 6); +} + +function normalizeCharacters(value: unknown) { + if (!Array.isArray(value)) return []; + return value + .map((item) => { + const raw = + item && typeof item === "object" && !Array.isArray(item) + ? (item as Record) + : {}; + const name = normalizeText(raw.name || raw.title); + const description = normalizeText(raw.description || raw.summary); + const prompt = normalizeText(raw.prompt); + if (!name && !description && !prompt) return null; + return { + name: name || "未命名角色", + description, + prompt, + look: normalizeText(raw.look) || undefined, + wardrobe: normalizeText(raw.wardrobe) || undefined, + signatureAction: normalizeText(raw.signatureAction) || undefined, + traits: normalizeStringList(raw.traits, 6), + }; + }) + .filter((item): item is NonNullable => Boolean(item)) + .slice(0, 8); +} + +function normalizeScenes(value: unknown) { + if (!Array.isArray(value)) return []; + return value + .map((item) => { + const raw = + item && typeof item === "object" && !Array.isArray(item) + ? (item as Record) + : {}; + const name = normalizeText(raw.name || raw.title); + const description = normalizeText(raw.description || raw.summary); + const prompt = normalizeText(raw.prompt); + if (!name && !description && !prompt) return null; + return { + name: name || "未命名场景", + description, + prompt, + mood: normalizeText(raw.mood) || undefined, + lighting: normalizeText(raw.lighting) || undefined, + props: normalizeStringList(raw.props, 6), + }; + }) + .filter((item): item is NonNullable => Boolean(item)) + .slice(0, 8); +} + +function buildVideoAnalysisPrompt(params: { + nodeTitle?: string; + prompt: string; + imageCount: number; + videoCount: number; +}) { + return [ + "你是视频画布工作流里的视频分析节点,需要为后续分镜和生成节点提供结构化输出。", + params.nodeTitle ? `当前节点:${params.nodeTitle}` : "", + `上游参考图数量:${params.imageCount}`, + `上游视频数量:${params.videoCount}`, + params.prompt ? `上游脚本/说明:\n${params.prompt}` : "上游没有额外脚本,请重点依据参考画面分析。", + "", + "请只输出 JSON,不要输出 markdown,不要输出解释。", + "JSON 结构如下:", + `{ + "summary": "一句话总结当前视频/镜头风格,不超过120字", + "highlights": ["3-5条镜头分析要点"], + "shotIdeas": [ + { "title": "镜头 1", "description": "一句话描述镜头目标、景别或动作" } + ], + "visualMotifs": ["2-4个可复用的视觉母题"], + "recommendedNextSteps": ["2-4条建议的下游动作"] +}`, + "如果没有真实视频帧,只能依据参考图和脚本推断,也要正常输出,但措辞要稳健。", + ] + .filter(Boolean) + .join("\n"); +} + +function buildCharacterScenePrompt(params: { + nodeTitle?: string; + prompt: string; + imageCount: number; +}) { + return [ + "你是视频画布工作流里的角色场景提取节点,需要从脚本、设定和参考图里提取角色与场景资产。", + params.nodeTitle ? `当前节点:${params.nodeTitle}` : "", + `参考图数量:${params.imageCount}`, + params.prompt ? `输入内容:\n${params.prompt}` : "没有额外脚本,请根据参考图提取角色和场景线索。", + "", + "请只输出 JSON,不要输出 markdown,不要输出解释。", + "JSON 结构如下:", + `{ + "summary": "一句话总结当前故事世界与资产线索", + "characters": [ + { + "name": "角色名", + "description": "角色外观与身份简介", + "look": "外貌特征", + "wardrobe": "服装/道具", + "traits": ["性格关键词"], + "signatureAction": "代表动作", + "prompt": "可直接用于生成角色图/角色视频的提示词" + } + ], + "scenes": [ + { + "name": "场景名", + "description": "空间、布景和氛围简介", + "mood": "情绪与气氛", + "lighting": "布光特征", + "props": ["核心道具"], + "prompt": "可直接用于生成场景图/场景视频的提示词" + } + ], + "relationships": ["角色与场景或角色之间的关系"], + "recommendedNextSteps": ["建议连接的后续节点动作"] +}`, + "角色和场景都要尽量具体,避免空泛形容词。", + ] + .filter(Boolean) + .join("\n"); +} + +function buildAgentPlanPrompt(params: { + nodeTitle?: string; + prompt: string; + imageCount: number; + videoCount: number; +}) { + return [ + "你是视频画布里的自定义代理节点,需要把当前创作目标拆成可执行的工作流计划。", + params.nodeTitle ? `当前节点:${params.nodeTitle}` : "", + `参考图数量:${params.imageCount}`, + `视频数量:${params.videoCount}`, + params.prompt ? `上游需求:\n${params.prompt}` : "没有额外脚本,请基于当前上下文给出稳妥计划。", + "", + "请只输出 JSON,不要输出 markdown,不要输出解释。", + "JSON 结构如下:", + `{ + "summary": "一句话说明这个代理链的目标", + "agentPlan": ["3-6个执行步骤"], + "deliverables": ["2-4个预期交付物"], + "recommendedNodes": ["建议继续连接的节点类型或能力名"] +}`, + "步骤要偏工作流视角,而不是泛泛而谈。", + ] + .filter(Boolean) + .join("\n"); +} + +export async function POST(request: Request) { + try { + const session = await auth(); + if (!session?.user?.id) { + return NextResponse.json({ success: false, error: "未登录" }, { status: 401 }); + } + + const body = await request.json().catch(() => ({})); + const parsed = requestSchema.safeParse(body); + if (!parsed.success) { + return NextResponse.json( + { success: false, error: "请求参数不合法" }, + { status: 400 } + ); + } + + const prompt = normalizeText(parsed.data.prompt); + const imageUrls = sanitizeUrls(parsed.data.imageUrls, 4); + const videoUrls = sanitizeUrls(parsed.data.videoUrls, 4); + if (!prompt && imageUrls.length === 0 && videoUrls.length === 0) { + return NextResponse.json( + { success: false, error: "请至少提供脚本、图片或视频上下文" }, + { status: 400 } + ); + } + + const [allModels, agentModel] = await Promise.all([ + getEnabledAiModelsWithProvider(false), + getAgentAiModelWithProvider(), + ]); + const compatibleModels = allModels.filter( + (item) => !item.model.isSubModel && item.model.isEnabled + ); + + let selectedModel = + imageUrls.length > 0 && + agentModel && + supportsVision(agentModel.model) + ? agentModel + : imageUrls.length > 0 + ? compatibleModels.find((item) => supportsVision(item.model)) + : agentModel || compatibleModels[0]; + + if (!selectedModel) { + selectedModel = compatibleModels[0]; + } + + if (!selectedModel) { + return NextResponse.json( + { success: false, error: "当前站点没有可用的分析模型" }, + { status: 500 } + ); + } + + const useVision = imageUrls.length > 0 && supportsVision(selectedModel.model); + const codingModelId = getAiModelAgentCodingModelId(selectedModel.model); + const model = await getLanguageModelById(selectedModel.model.id, codingModelId); + if (!model) { + return NextResponse.json( + { success: false, error: "分析模型初始化失败" }, + { status: 500 } + ); + } + + const promptText = + parsed.data.mode === "video-analysis" + ? buildVideoAnalysisPrompt({ + nodeTitle: normalizeText(parsed.data.nodeTitle), + prompt, + imageCount: imageUrls.length, + videoCount: videoUrls.length, + }) + : parsed.data.mode === "character-scene-extraction" + ? buildCharacterScenePrompt({ + nodeTitle: normalizeText(parsed.data.nodeTitle), + prompt, + imageCount: imageUrls.length, + }) + : buildAgentPlanPrompt({ + nodeTitle: normalizeText(parsed.data.nodeTitle), + prompt, + imageCount: imageUrls.length, + videoCount: videoUrls.length, + }); + + const referenceImages = useVision + ? ( + await inlineVisionImages(imageUrls, { + maxImages: 4, + maxSide: 960, + timeoutMs: 12000, + retries: 1, + loggerPrefix: "[Canvas Workflow Analyze]", + }) + ).inlineDataUrls + : []; + + const { text } = await generateText({ + model, + messages: [ + { + role: "user", + content: [ + { type: "text", text: promptText }, + ...referenceImages.map((image) => ({ type: "image" as const, image })), + ], + }, + ], + temperature: 0.2, + maxTokens: 1600, + } as any); + + const parsedJson = extractJsonBlock>(text) || {}; + const summary = + normalizeText(parsedJson.summary) || + normalizeText(text).slice(0, 160); + + if (parsed.data.mode === "video-analysis") { + return NextResponse.json({ + success: true, + data: { + summary, + highlights: normalizeStringList(parsedJson.highlights, 6), + shotIdeas: normalizeShotIdeas(parsedJson.shotIdeas), + visualMotifs: normalizeStringList(parsedJson.visualMotifs, 6), + recommendedNextSteps: normalizeStringList(parsedJson.recommendedNextSteps, 6), + model: selectedModel.model.displayName, + raw: text, + }, + }); + } + + if (parsed.data.mode === "character-scene-extraction") { + return NextResponse.json({ + success: true, + data: { + summary, + characters: normalizeCharacters(parsedJson.characters), + scenes: normalizeScenes(parsedJson.scenes), + relationships: normalizeStringList(parsedJson.relationships, 8), + recommendedNextSteps: normalizeStringList(parsedJson.recommendedNextSteps, 6), + model: selectedModel.model.displayName, + raw: text, + }, + }); + } + + return NextResponse.json({ + success: true, + data: { + summary, + agentPlan: normalizeStringList(parsedJson.agentPlan, 8), + deliverables: normalizeStringList(parsedJson.deliverables, 6), + recommendedNodes: normalizeStringList(parsedJson.recommendedNodes, 6), + model: selectedModel.model.displayName, + raw: text, + }, + }); + } catch (error) { + console.error("[Canvas Workflow Analyze] Error:", error); + return NextResponse.json( + { + success: false, + error: error instanceof Error ? error.message : "工作流分析失败", + }, + { status: 500 } + ); + } +} diff --git a/app/api/enhance/route.ts b/app/api/enhance/route.ts index b19d81458..28406f04f 100644 --- a/app/api/enhance/route.ts +++ b/app/api/enhance/route.ts @@ -552,6 +552,7 @@ export async function GET(request: NextRequest) { const prompt = searchParams.get("prompt") || "图片变清晰处理"; const chatId = searchParams.get("chatId"); const messageId = searchParams.get("messageId"); + const sourceImageUrl = searchParams.get("sourceImageUrl"); const enhanceConfig = await getSystemSetting({ key: "enhance_api_config" }); if (!enhanceConfig?.value) { @@ -603,6 +604,7 @@ export async function GET(request: NextRequest) { prompt, chatId, messageId, + sourceImageUrls: sourceImageUrl ? [sourceImageUrl] : undefined, }); return NextResponse.json(responsePayload); diff --git a/app/canvas/[id]/page.tsx b/app/canvas/[id]/page.tsx index 02865ec66..421b88f1a 100644 --- a/app/canvas/[id]/page.tsx +++ b/app/canvas/[id]/page.tsx @@ -1,9 +1,9 @@ "use client"; -import { useEffect, useLayoutEffect, useState, useCallback, use, useRef, useMemo } from "react"; +import { useEffect, useLayoutEffect, useState, useCallback, use, useRef, useMemo, type ChangeEvent } from "react"; import { useRouter, useParams, useSearchParams } from "next/navigation"; import useSWR from "swr"; -import { +import { AlertCircle, ArrowLeft, Save, @@ -13,11 +13,13 @@ import { ZoomOut, MousePointer, Hand, + GitBranch, Plus, ImagePlus, Type, Loader2, MessageCircle, + Video, Download, Upload, Wand2, @@ -31,7 +33,9 @@ import { Crosshair, Scan, } from "lucide-react"; +import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Dialog, DialogContent, @@ -67,7 +71,38 @@ import { Slider } from "@/components/ui/slider"; import { ScrollArea } from "@/components/ui/scroll-area"; import { toast } from "sonner"; import { useCanvasStore, canvasSelectors } from "@/store/canvas"; -import { canvasService, imageGenerationService } from "@/services/canvas"; +import { + canvasService, + imageGenerationService, + videoGenerationService, + workflowAnalysisService, +} from "@/services/canvas"; +import { + buildVideoWorkflowCanvasNode, + buildVideoWorkflowStarterTemplateGraph, + getVideoWorkflowNodeDefinition, + getVideoWorkflowQuickConnectOutputs, + getVideoWorkflowSectionNodes, + inferVideoWorkflowTemplateType, + VIDEO_WORKFLOW_LIBRARY_SECTIONS, + VIDEO_WORKFLOW_STARTER_TEMPLATES, + type VideoWorkflowTemplateType, +} from "@/lib/video-workflow/catalog"; +import { + buildWorkflowPrompt, + collectWorkflowMedia, + collectWorkflowStoryboardShots, + collectWorkflowStructuredData, + createWorkflowGraphContext, + getBestWorkflowPreviewMedia, + getDirectDownstreamNodes, + inferVideoGenerationModeFromMedia, + summarizeWorkflowInputs, + type WorkflowAssetRecord, + type WorkflowCharacterRecord, + type WorkflowMediaReference, + type WorkflowSceneRecord, +} from "@/lib/video-workflow/runtime"; import { AgentWorkflowPanelNew, type AgentWorkflowInputs, @@ -124,9 +159,11 @@ import type { AgentPsdTemplateCategoryTagIndex } from "@/lib/agents/psd-template import { agentProjectService } from "@/services/agent-projects"; import type { AgentPreset, + AgentGenerationProject, AgentGenerationProjectPersistedState, AgentGenerationProjectResultCollections, AgentGenerationResultModeType, + AgentGenerationProjectWorkspaceAttachment, AgentGenerationProjectWorkspaceState, AgentModeWorkspaceState, AgentWorkflowComposerContext, @@ -136,6 +173,14 @@ import type { AgentWorkflowShowcaseConfig, AgentWorkflowStepKey, } from "@/types/agent"; +import type { + CanvasEdge, + CanvasNode, + CanvasState, + CanvasWorkspaceType, + ToolType, + WorkflowNodeData, +} from "@/types/canvas"; interface PageProps { params: Promise<{ id: string }>; @@ -152,6 +197,190 @@ const SIZE_PRESETS = [ { label: "9:16", value: "9:16", width: 1024, height: 1820 }, ]; +interface VideoCanvasProjectExportPayload { + format: "video-canvas-project"; + version: 1; + exportedAt: string; + workspaceType: CanvasWorkspaceType; + project: { + id: string; + title: string; + }; + canvasData: CanvasState; +} + +const IMPORTABLE_CANVAS_NODE_TYPES = new Set([ + "message", + "image", + "video", + "text", + "workflow", + "scene-fusion", + "model3d", + "world3d", +]); + +const IMPORTABLE_CANVAS_TOOL_TYPES = new Set([ + "select", + "pan", + "draw", + "text", +]); + +function isPlainObject(value: unknown): value is Record { + return Boolean(value) && typeof value === "object" && !Array.isArray(value); +} + +function normalizeFiniteNumber(value: unknown, fallback: number) { + const numeric = Number(value); + return Number.isFinite(numeric) ? numeric : fallback; +} + +function normalizeImportedDate(value: unknown) { + const parsed = new Date(String(value || "").trim()); + return Number.isNaN(parsed.getTime()) ? new Date() : parsed; +} + +function sanitizeExportFileName(value: string) { + return ( + String(value || "") + .trim() + .replace(/[\\/:*?"<>|]+/g, "-") + .replace(/\s+/g, "-") + .slice(0, 60) || "video-canvas-project" + ); +} + +function normalizeImportedCanvasNode( + value: unknown, + index: number +): CanvasNode | null { + if (!isPlainObject(value)) { + return null; + } + + const rawType = String(value.type || "").trim() as CanvasNode["type"]; + if (!IMPORTABLE_CANVAS_NODE_TYPES.has(rawType)) { + return null; + } + + const position = isPlainObject(value.position) ? value.position : {}; + const size = isPlainObject(value.size) ? value.size : {}; + + return { + id: String(value.id || `imported-node-${index + 1}`), + type: rawType, + position: { + x: normalizeFiniteNumber(position.x, 0), + y: normalizeFiniteNumber(position.y, 0), + }, + size: { + width: Math.max(normalizeFiniteNumber(size.width, 320), 120), + height: Math.max(normalizeFiniteNumber(size.height, 240), 120), + }, + data: isPlainObject(value.data) + ? (value.data as unknown as CanvasNode["data"]) + : ({} as CanvasNode["data"]), + connections: Array.isArray(value.connections) + ? value.connections.map((item) => String(item || "").trim()).filter(Boolean) + : [], + parentId: String(value.parentId || "").trim() || undefined, + createdAt: normalizeImportedDate(value.createdAt), + updatedAt: normalizeImportedDate(value.updatedAt), + }; +} + +function normalizeImportedCanvasState(payload: unknown): { + title?: string; + workspaceType?: CanvasWorkspaceType; + canvasData: CanvasState; +} | null { + if (!isPlainObject(payload)) { + return null; + } + + const rawCanvasData = isPlainObject(payload.canvasData) + ? payload.canvasData + : payload; + if (!isPlainObject(rawCanvasData)) { + return null; + } + + const nodes = Array.isArray(rawCanvasData.nodes) + ? rawCanvasData.nodes + .map((item, index) => normalizeImportedCanvasNode(item, index)) + .filter((item): item is CanvasNode => Boolean(item)) + : []; + const nodeIds = new Set(nodes.map((node) => node.id)); + + const edges = Array.isArray(rawCanvasData.edges) + ? rawCanvasData.edges + .map((item, index) => { + if (!isPlainObject(item)) return null; + const source = String(item.source || "").trim(); + const target = String(item.target || "").trim(); + if (!source || !target || !nodeIds.has(source) || !nodeIds.has(target)) { + return null; + } + return { + id: String(item.id || `imported-edge-${index + 1}`), + source, + target, + type: + String(item.type || "").trim() === "conversation" || + String(item.type || "").trim() === "reference" + ? (String(item.type || "").trim() as CanvasEdge["type"]) + : "default", + } as CanvasEdge; + }) + .filter((item): item is CanvasEdge => item !== null) + : []; + + const viewport = isPlainObject(rawCanvasData.viewport) ? rawCanvasData.viewport : {}; + const selectedNodeIds = Array.isArray(rawCanvasData.selectedNodeIds) + ? rawCanvasData.selectedNodeIds + .map((item) => String(item || "").trim()) + .filter((item) => nodeIds.has(item)) + : []; + const toolValue = String(rawCanvasData.tool || "").trim() as ToolType; + const resolvedWorkspaceType = ["canvas", "agent", "video"].includes( + String(payload.workspaceType || (isPlainObject(payload.project) ? payload.project.workspaceType : "") || "") + ) + ? (String( + payload.workspaceType || + (isPlainObject(payload.project) ? payload.project.workspaceType : "") || + "" + ) as CanvasWorkspaceType) + : undefined; + const projectTitle = String( + (isPlainObject(payload.project) ? payload.project.title : "") || payload.title || "" + ).trim(); + + return { + title: projectTitle || undefined, + workspaceType: resolvedWorkspaceType, + canvasData: { + nodes, + edges, + selectedNodeIds, + viewport: { + x: normalizeFiniteNumber(viewport.x, 0), + y: normalizeFiniteNumber(viewport.y, 0), + zoom: Math.min(Math.max(normalizeFiniteNumber(viewport.zoom, 1), 0.1), 4), + }, + tool: IMPORTABLE_CANVAS_TOOL_TYPES.has(toolValue) ? toolValue : "select", + suppressedMediaKeys: Array.isArray(rawCanvasData.suppressedMediaKeys) + ? rawCanvasData.suppressedMediaKeys + .map((item) => String(item || "").trim()) + .filter(Boolean) + : [], + workflowState: isPlainObject(rawCanvasData.workflowState) + ? (rawCanvasData.workflowState as unknown as CanvasState["workflowState"]) + : undefined, + }, + }; +} + function hasMeaningfulWorkflowState( workflowState: AgentWorkflowPersistedState | null | undefined ) { @@ -183,6 +412,34 @@ const FLOATING_PANEL_INSET = 16; const DOCKED_PANEL_INSET = 0; const FLOATING_UI_GAP = 16; const FLOATING_BOTTOM_INSET = 20; +const WORKFLOW_AGENT_CONTEXT_START = "【视频画布同步上下文】"; +const WORKFLOW_AGENT_CONTEXT_END = "【/视频画布同步上下文】"; +const AGENT_RESULT_MODE_LABELS: Record = { + scene_generation: "场景结果", + detail_generation: "细节结果", + detail_replacement: "细节替换", + sku_replacement: "SKU 替换", +}; +const VIDEO_CANVAS_FLOATING_PILL_CLASS = + "rounded-full border border-border/60 bg-background/95 px-3.5 py-1.5 text-xs font-medium text-foreground shadow-sm backdrop-blur-xl supports-[backdrop-filter]:bg-background/80"; +const VIDEO_CANVAS_PANEL_CLASS = + "pointer-events-auto overflow-hidden rounded-[28px] border border-border/60 bg-background/94 shadow-2xl backdrop-blur-xl supports-[backdrop-filter]:bg-background/80"; +const VIDEO_CANVAS_PANEL_BADGE_CLASS = + "border-border/60 bg-background/82 text-foreground/75"; +const VIDEO_CANVAS_SUBSECTION_CLASS = + "rounded-2xl border border-border/60 bg-background/72 p-3"; +const VIDEO_CANVAS_TEMPLATE_CARD_CLASS = + "rounded-[24px] border border-border/60 bg-background/76 p-4 text-left shadow-sm transition-all hover:-translate-y-0.5 hover:border-primary/50 hover:bg-background/92 hover:shadow-lg"; +const VIDEO_CANVAS_SIDEBAR_SHELL_CLASS = + "h-full w-full overflow-hidden rounded-l-[30px] border border-r-0 border-border/60 bg-background/94 shadow-[0_30px_80px_-34px_rgba(15,23,42,0.42)] backdrop-blur-xl supports-[backdrop-filter]:bg-background/82"; +const VIDEO_CANVAS_TOOLBAR_CLASS = + "flex items-center gap-1.5 rounded-[28px] border border-border/60 bg-background/94 px-2.5 py-1.5 shadow-2xl backdrop-blur-xl supports-[backdrop-filter]:bg-background/82"; +const VIDEO_CANVAS_TOOLBAR_BUTTON_CLASS = + "h-9 w-9 rounded-xl border border-transparent text-foreground/75 hover:border-border/60 hover:bg-background/88 hover:text-foreground"; +const VIDEO_CANVAS_TOOLBAR_ACTIVE_BUTTON_CLASS = + "border-border/60 bg-background text-foreground shadow-sm hover:bg-background"; +const VIDEO_CANVAS_COMPACT_CONTROLS_CLASS = + "rounded-full border border-border/60 bg-background/92 px-2 py-1 shadow-sm backdrop-blur-xl supports-[backdrop-filter]:bg-background/80"; function buildScopedCanvasChatId(projectId: string, scope: "agent-mode") { const normalized = String(projectId || "").trim().toLowerCase().replace(/-/g, ""); @@ -425,12 +682,27 @@ export default function CanvasEditorPage({ params }: PageProps) { const id = (routeParams?.id as string) || use(params).id; const router = useRouter(); const mode = searchParams.get("mode"); + const requestedWorkspaceType = searchParams.get("workspaceType"); + const requestedAgentMode = mode === "agent"; + const isVideoMode = + !requestedAgentMode && (mode === "video" || requestedWorkspaceType === "video"); + const activeCanvasWorkspaceType: CanvasWorkspaceType = isVideoMode ? "video" : "canvas"; + const defaultCanvasTitle = isVideoMode ? "未命名视频画布" : "未命名画布"; + const workspaceLabel = isVideoMode ? "视频画布" : "画布"; + const createNewCanvasUrl = isVideoMode ? "/video-canvas?new=1" : "/canvas?new=1"; const shouldOpenBatchProcessing = searchParams.get("batch") === "1"; const goHome = useCallback(() => { if (typeof window !== "undefined") { window.location.assign("/"); } }, []); + const buildWorkspaceProjectUrl = useCallback( + (projectId: string) => + isVideoMode + ? `/canvas/${projectId}?mode=video&workspaceType=video` + : `/canvas/${projectId}`, + [isVideoMode] + ); // Store state const projectTitle = useCanvasStore((state) => state.projectTitle); @@ -440,6 +712,7 @@ export default function CanvasEditorPage({ params }: PageProps) { const canRedo = useCanvasStore(canvasSelectors.canRedo); const selectedNodeIds = useCanvasStore(canvasSelectors.selectedNodeIds); const nodes = useCanvasStore(canvasSelectors.nodes); + const edges = useCanvasStore(canvasSelectors.edges); // Store actions const setProject = useCanvasStore((state) => state.setProject); @@ -453,6 +726,7 @@ export default function CanvasEditorPage({ params }: PageProps) { const clearCanvas = useCanvasStore((state) => state.clearCanvas); const getCanvasState = useCanvasStore((state) => state.getCanvasState); const addNode = useCanvasStore((state) => state.addNode); + const addEdge = useCanvasStore((state) => state.addEdge); const selectNodes = useCanvasStore((state) => state.selectNodes); const updateNode = useCanvasStore((state) => state.updateNode); const setGenerating = useCanvasStore((state) => state.setGenerating); @@ -464,6 +738,7 @@ export default function CanvasEditorPage({ params }: PageProps) { const [isSaving, setIsSaving] = useState(false); const [isEditingTitle, setIsEditingTitle] = useState(false); const [editTitle, setEditTitle] = useState(""); + const [activeWorkflowExecutionTaskKey, setActiveWorkflowExecutionTaskKey] = useState(null); const [isPanelOpen, setIsPanelOpen] = useState(true); const [sceneFusionDialogOpen, setSceneFusionDialogOpen] = useState(false); // 面板模式: 'chat' 聊天面板, 'fileList' 文件列表 @@ -511,6 +786,8 @@ export default function CanvasEditorPage({ params }: PageProps) { const [isAgentProjectLoading, setIsAgentProjectLoading] = useState(false); const [loadedAgentProjectId, setLoadedAgentProjectId] = useState(null); const [isAgentProjectSaving, setIsAgentProjectSaving] = useState(false); + const [isSyncingAgentResultsToCanvas, setIsSyncingAgentResultsToCanvas] = useState(false); + const [isImportingVideoCanvas, setIsImportingVideoCanvas] = useState(false); const [isAgentProjectSheetOpen, setIsAgentProjectSheetOpen] = useState(false); const [isAgentProjectMenuOpen, setIsAgentProjectMenuOpen] = useState(false); const [isLoginDialogOpen, setIsLoginDialogOpen] = useState(false); @@ -571,7 +848,7 @@ export default function CanvasEditorPage({ params }: PageProps) { const autoTitleInFlightRef = useRef(null); const autoThumbnailSyncedRef = useRef(null); const lastLoadedCanvasIdRef = useRef(""); - const requestedAgentMode = mode === "agent"; + const importVideoCanvasInputRef = useRef(null); const isAgentWorkspaceEnabled = siteSettingsData?.agentEnabled !== false; const isCanvasAgentModeEnabled = siteSettingsData?.canvasAgentModeEnabled !== false; const isAgentMode = @@ -599,6 +876,502 @@ export default function CanvasEditorPage({ params }: PageProps) { const selectedImageNode = selectedNodeIds.length === 1 ? nodes.find(n => n.id === selectedNodeIds[0] && n.type === 'image') : null; + const selectedVideoWorkflowNode = useMemo( + () => + isVideoMode && selectedNodeIds.length === 1 + ? nodes.find((node) => node.id === selectedNodeIds[0]) || null + : null, + [isVideoMode, nodes, selectedNodeIds] + ); + const selectedVideoWorkflowType = useMemo( + () => inferVideoWorkflowTemplateType(selectedVideoWorkflowNode), + [selectedVideoWorkflowNode] + ); + const selectedVideoWorkflowData = useMemo( + () => + selectedVideoWorkflowNode?.type === "workflow" + ? (selectedVideoWorkflowNode.data as WorkflowNodeData) + : null, + [selectedVideoWorkflowNode] + ); + const selectedVideoWorkflowDefinition = useMemo( + () => + selectedVideoWorkflowType + ? getVideoWorkflowNodeDefinition(selectedVideoWorkflowType) + : null, + [selectedVideoWorkflowType] + ); + const selectedVideoWorkflowQuickConnects = useMemo( + () => + selectedVideoWorkflowType + ? getVideoWorkflowQuickConnectOutputs(selectedVideoWorkflowType) + : [], + [selectedVideoWorkflowType] + ); + const workflowGraph = useMemo( + () => createWorkflowGraphContext(nodes, edges), + [edges, nodes] + ); + const selectedWorkflowPrompt = useMemo( + () => + selectedVideoWorkflowNode + ? buildWorkflowPrompt(selectedVideoWorkflowNode.id, workflowGraph) + : "", + [selectedVideoWorkflowNode, workflowGraph] + ); + const selectedWorkflowMedia = useMemo( + () => + selectedVideoWorkflowNode + ? collectWorkflowMedia(selectedVideoWorkflowNode.id, workflowGraph) + : [], + [selectedVideoWorkflowNode, workflowGraph] + ); + const selectedWorkflowStoryboardShots = useMemo( + () => + selectedVideoWorkflowNode + ? collectWorkflowStoryboardShots(selectedVideoWorkflowNode.id, workflowGraph) + : [], + [selectedVideoWorkflowNode, workflowGraph] + ); + const selectedWorkflowStructuredData = useMemo( + () => + selectedVideoWorkflowNode + ? collectWorkflowStructuredData(selectedVideoWorkflowNode.id, workflowGraph) + : { + characters: [] as WorkflowCharacterRecord[], + scenes: [] as WorkflowSceneRecord[], + characterAssets: [] as WorkflowAssetRecord[], + sceneAssets: [] as WorkflowAssetRecord[], + relationships: [] as string[], + recommendedNextSteps: [] as string[], + agentPlan: [] as string[], + deliverables: [] as string[], + recommendedNodes: [] as string[], + }, + [selectedVideoWorkflowNode, workflowGraph] + ); + const selectedWorkflowInputs = useMemo( + () => + selectedVideoWorkflowNode + ? summarizeWorkflowInputs(selectedVideoWorkflowNode.id, workflowGraph) + : { promptCount: 0, imageCount: 0, videoCount: 0 }, + [selectedVideoWorkflowNode, workflowGraph] + ); + const linkedAgentWorkflowNode = useMemo(() => { + if (!agentProjectId) return null; + + return ( + nodes + .filter( + (node) => + node.type === "workflow" && + inferVideoWorkflowTemplateType(node) === "custom-agent" && + String( + ((node.data as WorkflowNodeData).metadata || {})?.linkedAgentProjectId || "" + ).trim() === agentProjectId + ) + .sort((left, right) => { + const leftSyncedAt = Number( + new Date( + String( + (((left.data as WorkflowNodeData).metadata || {}) as Record) + ?.lastAgentCanvasSyncAt || + (((left.data as WorkflowNodeData).metadata || {}) as Record) + ?.lastAgentWorkspaceSyncAt || + left.updatedAt + ) + ).getTime() + ); + const rightSyncedAt = Number( + new Date( + String( + (((right.data as WorkflowNodeData).metadata || {}) as Record) + ?.lastAgentCanvasSyncAt || + (((right.data as WorkflowNodeData).metadata || {}) as Record) + ?.lastAgentWorkspaceSyncAt || + right.updatedAt + ) + ).getTime() + ); + return rightSyncedAt - leftSyncedAt; + })[0] || null + ); + }, [agentProjectId, nodes]); + const linkedAgentWorkflowData = useMemo( + () => + linkedAgentWorkflowNode?.type === "workflow" + ? (linkedAgentWorkflowNode.data as WorkflowNodeData) + : null, + [linkedAgentWorkflowNode] + ); + const linkedAgentImportedResultUrls = useMemo(() => { + const metadata = ((linkedAgentWorkflowData?.metadata || {}) as Record) || {}; + return Array.isArray(metadata.importedAgentResultUrls) + ? metadata.importedAgentResultUrls + .map((item) => String(item || "").trim()) + .filter((item) => /^https?:\/\//i.test(item)) + : []; + }, [linkedAgentWorkflowData]); + const flattenedAgentResultEntries = useMemo( + () => + ( + [ + "scene_generation", + "detail_generation", + "detail_replacement", + "sku_replacement", + ] as AgentGenerationResultModeType[] + ).flatMap((modeType) => + normalizeResultCollectionUrls(agentProjectResultCollections[modeType]).map((url, index) => ({ + modeType, + url, + index, + label: AGENT_RESULT_MODE_LABELS[modeType], + })) + ), + [agentProjectResultCollections] + ); + const pendingAgentCanvasImportCount = useMemo(() => { + const existingUrls = new Set( + nodes + .flatMap((node) => { + if (node.type === "image" || node.type === "video") { + return [String((node.data as Record)?.src || "").trim()]; + } + return []; + }) + .filter((item) => /^https?:\/\//i.test(item)) + ); + const importedUrls = new Set(linkedAgentImportedResultUrls); + return flattenedAgentResultEntries.filter( + (item) => !existingUrls.has(item.url) && !importedUrls.has(item.url) + ).length; + }, [flattenedAgentResultEntries, linkedAgentImportedResultUrls, nodes]); + const canSyncAgentResultsToCanvas = Boolean( + requestedWorkspaceType === "video" && + isAgentMode && + linkedAgentWorkflowNode && + flattenedAgentResultEntries.length > 0 + ); + const selectedWorkflowLinkedAgentProject = useMemo(() => { + const metadata = ((selectedVideoWorkflowData?.metadata || {}) as Record) || {}; + return { + id: String(metadata.linkedAgentProjectId || "").trim(), + title: String(metadata.linkedAgentProjectTitle || "").trim(), + syncedAt: String( + metadata.lastAgentWorkspaceSyncAt || metadata.linkedAgentProjectUpdatedAt || "" + ).trim(), + }; + }, [selectedVideoWorkflowData]); + const selectedWorkflowAgentResultGroups = useMemo(() => { + const metadata = ((selectedVideoWorkflowData?.metadata || {}) as Record) || {}; + return Array.isArray(metadata.agentResultGroups) + ? metadata.agentResultGroups + .map((item) => { + const record = (item || {}) as Record; + return { + modeType: String(record.modeType || "").trim(), + label: String(record.label || "").trim(), + count: Math.max(Number(record.count || 0), 0), + importedCount: Math.max(Number(record.importedCount || 0), 0), + }; + }) + .filter((item) => item.label && item.count > 0) + : []; + }, [selectedVideoWorkflowData]); + const selectedWorkflowAgentResultAssets = useMemo< + Array<{ + modeType: string; + label: string; + assets: WorkflowMediaReference[]; + }> + >(() => { + const metadata = ((selectedVideoWorkflowData?.metadata || {}) as Record) || {}; + return Array.isArray(metadata.agentResultAssets) + ? metadata.agentResultAssets.reduce< + Array<{ + modeType: string; + label: string; + assets: WorkflowMediaReference[]; + }> + >((groups, item) => { + const record = (item || {}) as Record; + const modeType = String(record.modeType || "").trim(); + const label = String(record.label || "").trim(); + const assets = Array.isArray(record.assets) + ? record.assets.reduce((nextAssets, asset, index) => { + const assetRecord = (asset || {}) as Record; + const url = String(assetRecord.url || "").trim(); + if (!/^https?:\/\//i.test(url)) return nextAssets; + nextAssets.push({ + nodeId: selectedVideoWorkflowNode?.id || "", + kind: "image" as const, + url, + title: String(assetRecord.title || `${label || "Agent 结果"} ${index + 1}`).trim(), + prompt: selectedWorkflowPrompt, + source: "workflow-result" as const, + }); + return nextAssets; + }, []) + : []; + if (!modeType || !label || assets.length === 0) return groups; + groups.push({ + modeType, + label, + assets, + }); + return groups; + }, []) + : []; + }, [selectedVideoWorkflowData, selectedVideoWorkflowNode?.id, selectedWorkflowPrompt]); + const selectedWorkflowAgentResultCount = useMemo( + () => selectedWorkflowAgentResultGroups.reduce((total, item) => total + item.count, 0), + [selectedWorkflowAgentResultGroups] + ); + const selectedWorkflowPendingAgentResultCount = useMemo(() => { + const metadata = ((selectedVideoWorkflowData?.metadata || {}) as Record) || {}; + return Math.max(Number(metadata.pendingAgentResultCount || 0), 0); + }, [selectedVideoWorkflowData]); + const selectedStoryboardDownstreamNodes = useMemo(() => { + if (!selectedVideoWorkflowNode || selectedVideoWorkflowType !== "storyboard-node") { + return []; + } + + return getDirectDownstreamNodes(selectedVideoWorkflowNode.id, workflowGraph) + .map((node) => ({ + node, + templateType: + node.type === "workflow" ? inferVideoWorkflowTemplateType(node) : null, + })) + .filter((item) => Boolean(item.templateType)); + }, [selectedVideoWorkflowNode, selectedVideoWorkflowType, workflowGraph]); + const selectedStoryboardBatchTargets = useMemo( + () => + selectedStoryboardDownstreamNodes.filter( + (item) => + item.templateType === "gen-image" || item.templateType === "gen-video" + ), + [selectedStoryboardDownstreamNodes] + ); + const selectedStoryboardChartTargets = useMemo( + () => + selectedStoryboardDownstreamNodes.filter( + (item) => item.templateType === "storyboard-chart-node" + ), + [selectedStoryboardDownstreamNodes] + ); + const selectedStoryboardCanBatchExecute = useMemo( + () => + selectedVideoWorkflowType === "storyboard-node" && + selectedStoryboardBatchTargets.length > 0 && + (selectedWorkflowStoryboardShots.length > 0 || + Boolean(selectedWorkflowPrompt.trim())), + [ + selectedStoryboardBatchTargets.length, + selectedVideoWorkflowType, + selectedWorkflowPrompt, + selectedWorkflowStoryboardShots.length, + ] + ); + const selectedWorkflowIsActionable = useMemo( + () => + Boolean( + selectedVideoWorkflowType && + [ + "video-analyze", + "storyboard-node", + "storyboard-chart-node", + "table-editor-node", + "gen-image", + "gen-video", + "camera-movement", + "canvas-node", + "motion-control", + "doodle-canvas", + "professional-camera", + "image-compare", + "inpaint-crop", + "inpaint-stitch", + "jimeng-super-resolution", + "gen-music", + "rh-app", + "rh-comfy", + "preview", + "local-save", + "extract-characters-scenes", + "character-description", + "scene-description", + "create-character", + "create-scene", + "generate-character-image", + "generate-character-video", + "generate-scene-image", + "generate-scene-video", + "custom-agent", + ].includes(selectedVideoWorkflowType) + ), + [selectedVideoWorkflowType] + ); + const selectedWorkflowActionLabel = useMemo(() => { + switch (selectedVideoWorkflowType) { + case "video-analyze": + return "分析视频"; + case "extract-characters-scenes": + return "提取角色场景"; + case "character-description": + return "整理角色描述"; + case "scene-description": + return "整理场景描述"; + case "create-character": + return "固化角色资产"; + case "create-scene": + return "固化场景资产"; + case "storyboard-node": + return "整理分镜"; + case "storyboard-chart-node": + return "生成分镜表"; + case "table-editor-node": + return "整理表格"; + case "camera-movement": + return "测试运镜"; + case "canvas-node": + return "整理画板"; + case "motion-control": + return "生成动作控制"; + case "doodle-canvas": + return "整理涂鸦画板"; + case "professional-camera": + return "调整专业机位"; + case "gen-image": + return "生成图片"; + case "gen-video": + return "生成视频"; + case "image-compare": + return "整理对比"; + case "inpaint-crop": + return "裁剪局部重绘"; + case "inpaint-stitch": + return "拼接补画"; + case "jimeng-super-resolution": + return "超分增强"; + case "gen-music": + return "生成配乐方案"; + case "rh-app": + return "整理 RH 应用包"; + case "rh-comfy": + return "整理 Comfy 工作流"; + case "generate-character-image": + return "生成角色图"; + case "generate-character-video": + return "生成角色视频"; + case "generate-scene-image": + return "生成场景图"; + case "generate-scene-video": + return "生成场景视频"; + case "custom-agent": + return "更新代理计划"; + case "preview": + return "刷新预览"; + case "local-save": + return "下载上游结果"; + default: + return "执行节点"; + } + }, [selectedVideoWorkflowType]); + const selectedWorkflowActionHint = useMemo(() => { + switch (selectedVideoWorkflowType) { + case "video-analyze": + return "会调用现有视觉分析能力,整理镜头节奏、视觉母题和可继续拆解的镜头建议。"; + case "extract-characters-scenes": + return "会从脚本、设定和参考图中提取角色与场景线索,作为后续资产节点的输入。"; + case "character-description": + return "会把上游角色线索整理成更稳定的角色描述,方便继续生成角色图和角色视频。"; + case "scene-description": + return "会把上游场景线索整理成更稳定的场景描述,方便继续生成环境图和场景视频。"; + case "create-character": + return "会把上游角色信息固化成可复用角色资产,供角色图和角色视频节点复用。"; + case "create-scene": + return "会把上游场景信息固化成可复用场景资产,供场景图和场景视频节点复用。"; + case "storyboard-node": + return "会先整理上游脚本和素材提示,再把镜头草案派发给下游生图或生视频节点。"; + case "storyboard-chart-node": + return "会把上游分镜草案整理成结构化镜头表,方便继续检查节奏、镜头说明和生成提示。"; + case "table-editor-node": + return "会把上游脚本、角色、场景或镜头信息整理成表格结构,方便继续转成分镜或资产表。"; + case "camera-movement": + return "会围绕上游脚本和参考图生成一段运镜测试片段,同时沉淀镜头运动说明。"; + case "canvas-node": + return "会把上游素材整理成一个结构化画板节点,方便继续做对比、挑图和分支创作。"; + case "motion-control": + return "会围绕上游脚本和主体动作生成一段动作控制片段,同时沉淀运动节奏说明。"; + case "doodle-canvas": + return "会把上游创作意图整理成涂鸦/遮罩指令,方便继续接局部重绘或外部涂鸦工作流。"; + case "professional-camera": + return "会复用专业机位调整能力,对上游图片做一版机位/焦距测试图,也会沉淀镜头参数。"; + case "gen-image": + return "会复用现有生图能力,把上游脚本和参考图变成新的关键帧结果节点。"; + case "gen-video": + return "会复用现有视频生成能力,根据上游脚本和参考图产出视频结果节点。"; + case "image-compare": + return "会把上游图片或视频封面整理成对比卡,方便并排检查版本差异和风格一致性。"; + case "inpaint-crop": + return "会复用框选抠图能力,先把上游图片裁出适合局部重绘的工作区域。"; + case "inpaint-stitch": + return "会复用图像拓展能力,对上游图片做一版补边扩图,方便继续拼接或补画。"; + case "jimeng-super-resolution": + return "会复用当前图像增强链路,对上游图片做一版高清增强并生成新的结果节点。"; + case "gen-music": + return "会把上游脚本和分镜整理成配乐提示与节奏表,方便继续接音频制作或外部作曲工具。"; + case "rh-app": + return "会把当前工作流上下文整理成 RH 应用可执行包,沉淀步骤、输入和交付物。"; + case "rh-comfy": + return "会把当前工作流上下文整理成 Comfy 图谱包,沉淀节点顺序、输入资源和提示词。"; + case "generate-character-image": + return "会围绕角色资产复用现有生图能力,产出风格稳定的角色关键帧。"; + case "generate-character-video": + return "会围绕角色资产复用现有视频生成能力,产出角色镜头或动作片段。"; + case "generate-scene-image": + return "会围绕场景资产复用现有生图能力,产出环境和氛围关键帧。"; + case "generate-scene-video": + return "会围绕场景资产复用现有视频生成能力,产出环境镜头或转场片段。"; + case "custom-agent": + return "会基于当前上下文生成一版代理执行计划,也可以一键送入 Agent 工作台继续细化执行。"; + case "preview": + return "会从上游结果里抓取最近的图片或视频,回填到预览节点中。"; + case "local-save": + return "会把上游图片或视频打包下载,作为当前流程的本地保存出口。"; + default: + return ""; + } + }, [selectedVideoWorkflowType]); + const selectedWorkflowPrimaryTaskKey = selectedVideoWorkflowNode + ? `${selectedVideoWorkflowNode.id}:primary` + : null; + const selectedWorkflowBatchTaskKey = + selectedVideoWorkflowNode && selectedVideoWorkflowType === "storyboard-node" + ? `${selectedVideoWorkflowNode.id}:batch` + : null; + const selectedWorkflowAgentTaskKey = + selectedVideoWorkflowNode && selectedVideoWorkflowType === "custom-agent" + ? `${selectedVideoWorkflowNode.id}:agent` + : null; + const selectedWorkflowBranchTaskKey = + selectedVideoWorkflowNode && selectedVideoWorkflowType === "custom-agent" + ? `${selectedVideoWorkflowNode.id}:branches` + : null; + const isSelectedWorkflowPrimaryRunning = + Boolean(selectedWorkflowPrimaryTaskKey) && + activeWorkflowExecutionTaskKey === selectedWorkflowPrimaryTaskKey; + const isSelectedWorkflowBatchRunning = + Boolean(selectedWorkflowBatchTaskKey) && + activeWorkflowExecutionTaskKey === selectedWorkflowBatchTaskKey; + const isSelectedWorkflowAgentRunning = + Boolean(selectedWorkflowAgentTaskKey) && + activeWorkflowExecutionTaskKey === selectedWorkflowAgentTaskKey; + const isSelectedWorkflowBranchRunning = + Boolean(selectedWorkflowBranchTaskKey) && + activeWorkflowExecutionTaskKey === selectedWorkflowBranchTaskKey; + const isAnyWorkflowExecutionRunning = Boolean(activeWorkflowExecutionTaskKey); const resolvedPanelWidth = viewportWidth > 0 ? Math.min(FLOATING_PANEL_WIDTH, Math.max(viewportWidth - DOCKED_PANEL_INSET, 0)) @@ -868,12 +1641,25 @@ export default function CanvasEditorPage({ params }: PageProps) { // 画布不存在时,创建一个新画布 console.log('[Canvas] 画布不存在,创建新画布:', id); - useCanvasStore.getState().setProject(id, requestedAgentMode ? '智能体工作台' : '未命名画布'); + useCanvasStore.getState().setProject( + id, + requestedAgentMode ? '智能体工作台' : defaultCanvasTitle + ); setWorkflowHydrationSource("empty"); if (!requestedAgentMode) { // 保存新画布到数据库 try { - await canvasService.saveCanvasState(id, { nodes: [], edges: [], selectedNodeIds: [], viewport: { x: 0, y: 0, zoom: 1 }, tool: 'select' }); + await canvasService.saveCanvasState( + id, + { + nodes: [], + edges: [], + selectedNodeIds: [], + viewport: { x: 0, y: 0, zoom: 1 }, + tool: 'select', + }, + activeCanvasWorkspaceType + ); } catch (error) { console.error('[Canvas] 创建新画布失败:', error); } @@ -884,7 +1670,7 @@ export default function CanvasEditorPage({ params }: PageProps) { }; loadProject(); - }, [id, openLoginDialog, requestedAgentMode]); + }, [activeCanvasWorkspaceType, defaultCanvasTitle, id, openLoginDialog, requestedAgentMode]); useEffect(() => { const updateViewportWidth = () => setViewportWidth(window.innerWidth); @@ -915,6 +1701,121 @@ export default function CanvasEditorPage({ params }: PageProps) { getCanvasState, ]); + const handleExportVideoCanvasProject = useCallback(() => { + if (!isVideoMode || typeof window === "undefined") { + return; + } + + const payload: VideoCanvasProjectExportPayload = { + format: "video-canvas-project", + version: 1, + exportedAt: new Date().toISOString(), + workspaceType: activeCanvasWorkspaceType, + project: { + id, + title: projectTitle || "未命名视频画布", + }, + canvasData: buildPersistedCanvasData(), + }; + + const blob = new Blob([JSON.stringify(payload, null, 2)], { + type: "application/json;charset=utf-8", + }); + const url = URL.createObjectURL(blob); + const anchor = document.createElement("a"); + anchor.href = url; + anchor.download = `${sanitizeExportFileName( + payload.project.title || "video-canvas-project" + )}.json`; + document.body.appendChild(anchor); + anchor.click(); + anchor.remove(); + URL.revokeObjectURL(url); + toast.success("已导出当前视频画布工程"); + }, [activeCanvasWorkspaceType, buildPersistedCanvasData, id, isVideoMode, projectTitle]); + + const handleImportVideoCanvasProjectClick = useCallback(() => { + if (!isVideoMode) { + return; + } + importVideoCanvasInputRef.current?.click(); + }, [isVideoMode]); + + const handleImportVideoCanvasProjectChange = useCallback( + async (event: ChangeEvent) => { + const file = event.target.files?.[0] || null; + event.target.value = ""; + + if (!file) { + return; + } + + if ( + nodes.length > 0 && + typeof window !== "undefined" && + !window.confirm("导入会替换当前视频画布内容,是否继续?") + ) { + return; + } + + setIsImportingVideoCanvas(true); + + try { + const rawText = await file.text(); + const parsed = JSON.parse(rawText); + const normalized = normalizeImportedCanvasState(parsed); + if (!normalized) { + throw new Error("文件格式无法识别,请导入视频画布导出的 JSON。"); + } + + const nextTitle = + normalized.title || + projectTitle || + (file.name ? file.name.replace(/\.json$/i, "") : "") || + "导入的视频画布"; + + clearCanvas(); + loadCanvas(normalized.canvasData); + setProjectTitle(nextTitle); + + const [saveResult, updateResult] = await Promise.all([ + canvasService.saveCanvasState(id, normalized.canvasData, activeCanvasWorkspaceType), + canvasService.updateProject( + id, + { + title: nextTitle, + }, + activeCanvasWorkspaceType + ), + ]); + + if (!saveResult.success) { + throw new Error(saveResult.error || "导入后保存失败"); + } + + if (!updateResult.success) { + console.warn("[Canvas] import title update failed:", updateResult.error); + } + + toast.success(`已导入视频画布:${nextTitle}`); + } catch (error) { + const message = error instanceof Error ? error.message : "导入视频画布失败"; + toast.error(message); + } finally { + setIsImportingVideoCanvas(false); + } + }, + [ + activeCanvasWorkspaceType, + clearCanvas, + id, + loadCanvas, + nodes.length, + projectTitle, + setProjectTitle, + ] + ); + const buildPersistedAgentProjectState = useCallback(() => { const persistedMaterials = appearanceRecognitionEnabled ? workflowMaterials @@ -1710,13 +2611,17 @@ export default function CanvasEditorPage({ params }: PageProps) { const persistCanvasState = useCallback( async (reason: "autosave" | "delete" | "beforeunload") => { const canvasData = buildPersistedCanvasData(); - const result = await canvasService.saveCanvasState(id, canvasData); + const result = await canvasService.saveCanvasState( + id, + canvasData, + activeCanvasWorkspaceType + ); if (!result.success) { console.error(`[Canvas] ${reason} save failed:`, result.error); } return result.success; }, - [buildPersistedCanvasData, id] + [activeCanvasWorkspaceType, buildPersistedCanvasData, id] ); // 自动保存逻辑 @@ -1777,7 +2682,7 @@ export default function CanvasEditorPage({ params }: PageProps) { void fetch(`/api/canvas/${id}`, { method: "PUT", headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ canvasData }), + body: JSON.stringify({ canvasData, workspaceType: activeCanvasWorkspaceType }), keepalive: true, }); } catch (error) { @@ -1791,13 +2696,15 @@ export default function CanvasEditorPage({ params }: PageProps) { window.removeEventListener("beforeunload", handleBeforeUnload); window.removeEventListener("pagehide", handleBeforeUnload); }; - }, [buildPersistedCanvasData, id, isAgentMode, isLoading]); + }, [activeCanvasWorkspaceType, buildPersistedCanvasData, id, isAgentMode, isLoading]); // 智能命名与缩略图逻辑 useEffect(() => { if (isAgentMode) return; const hasDefaultTitle = - projectTitle === "未命名画布" || projectTitle === "新画布"; + projectTitle === defaultCanvasTitle || + projectTitle === "新画布" || + projectTitle === "新视频画布"; if (!hasDefaultTitle || nodes.length === 0) return; const imageNode = nodes.find((n) => n.type === "image" && (n.data as any)?.src); @@ -1818,7 +2725,11 @@ export default function CanvasEditorPage({ params }: PageProps) { try { if (autoThumbnailSyncedRef.current !== autoTitleKey) { - await canvasService.updateProject(id, { thumbnail: imageSrc }); + await canvasService.updateProject( + id, + { thumbnail: imageSrc }, + activeCanvasWorkspaceType + ); autoThumbnailSyncedRef.current = autoTitleKey; } @@ -1834,8 +2745,12 @@ export default function CanvasEditorPage({ params }: PageProps) { const data = await res.json(); if (data.title) { setProjectTitle(data.title); - await canvasService.updateProject(id, { title: data.title }); - toast.success(`画布已自动命名为:${data.title}`); + await canvasService.updateProject( + id, + { title: data.title }, + activeCanvasWorkspaceType + ); + toast.success(`${workspaceLabel}已自动命名为:${data.title}`); } } catch (error) { console.error("Auto title failed:", error); @@ -1849,13 +2764,26 @@ export default function CanvasEditorPage({ params }: PageProps) { // 使用防抖,避免频繁触发 const timer = setTimeout(autoTitleAndThumbnail, 5000); // 5秒后触发,给用户一点时间操作 return () => clearTimeout(timer); - }, [id, isAgentMode, nodes, projectTitle, setProjectTitle]); + }, [ + activeCanvasWorkspaceType, + defaultCanvasTitle, + id, + isAgentMode, + nodes, + projectTitle, + setProjectTitle, + workspaceLabel, + ]); // 保存画布 (手动触发保留作为备用,但UI上移除) const handleSave = useCallback(async () => { setIsSaving(true); const canvasData = buildPersistedCanvasData(); - const result = await canvasService.saveCanvasState(id, canvasData); + const result = await canvasService.saveCanvasState( + id, + canvasData, + activeCanvasWorkspaceType + ); if (result.success) { toast.success("保存成功"); @@ -1863,7 +2791,7 @@ export default function CanvasEditorPage({ params }: PageProps) { toast.error(result.error || "保存失败"); } setIsSaving(false); - }, [buildPersistedCanvasData, id]); + }, [activeCanvasWorkspaceType, buildPersistedCanvasData, id]); // 更新标题 const handleUpdateTitle = async () => { @@ -1872,7 +2800,11 @@ export default function CanvasEditorPage({ params }: PageProps) { return; } - const result = await canvasService.updateProject(id, { title: editTitle.trim() }); + const result = await canvasService.updateProject( + id, + { title: editTitle.trim() }, + activeCanvasWorkspaceType + ); if (result.success) { setProjectTitle(editTitle.trim()); } else { @@ -1881,32 +2813,3535 @@ export default function CanvasEditorPage({ params }: PageProps) { setIsEditingTitle(false); }; + const getVisibleCanvasOrigin = useCallback( + () => ({ + x: (-viewport.x + 120) / viewport.zoom, + y: (-viewport.y + 120) / viewport.zoom, + }), + [viewport.x, viewport.y, viewport.zoom] + ); + + const guessCanvasAspectRatio = useCallback((nodeId: string | null | undefined) => { + const targetNode = nodeId ? nodes.find((node) => node.id === nodeId) || null : null; + if (!targetNode) return "auto"; + const currentRatio = targetNode.size.width / Math.max(1, targetNode.size.height); + + let bestPreset = SIZE_PRESETS[0]; + let bestDelta = Number.POSITIVE_INFINITY; + SIZE_PRESETS.forEach((preset) => { + const ratio = preset.width / preset.height; + const delta = Math.abs(ratio - currentRatio); + if (delta < bestDelta) { + bestDelta = delta; + bestPreset = preset; + } + }); + + return bestPreset?.value || "auto"; + }, [nodes]); + + const guessVideoRatio = useCallback((nodeId: string | null | undefined) => { + const targetNode = nodeId ? nodes.find((node) => node.id === nodeId) || null : null; + if (!targetNode) return "16:9"; + const currentRatio = targetNode.size.width / Math.max(1, targetNode.size.height); + const ratios = [ + { value: "16:9", width: 16, height: 9 }, + { value: "4:3", width: 4, height: 3 }, + { value: "1:1", width: 1, height: 1 }, + { value: "3:4", width: 3, height: 4 }, + { value: "9:16", width: 9, height: 16 }, + { value: "21:9", width: 21, height: 9 }, + ] as const; + + let best: (typeof ratios)[number] = ratios[0]; + let bestDelta = Number.POSITIVE_INFINITY; + ratios.forEach((ratio) => { + const delta = Math.abs(ratio.width / ratio.height - currentRatio); + if (delta < bestDelta) { + bestDelta = delta; + best = ratio; + } + }); + return best.value; + }, [nodes]); + + const patchWorkflowNode = useCallback( + ( + nodeId: string, + patch: Partial & { + metadata?: Record; + } + ) => { + const targetNode = useCanvasStore + .getState() + .nodes.find((node) => node.id === nodeId && node.type === "workflow"); + if (!targetNode) return; + const currentData = targetNode.data as WorkflowNodeData; + updateNode(nodeId, { + data: { + ...currentData, + ...patch, + metadata: { + ...(currentData.metadata || {}), + ...(patch.metadata || {}), + }, + }, + }); + }, + [updateNode] + ); + + const createWorkflowOutputNode = useCallback( + (params: { + sourceNodeId: string; + anchorNodeId?: string; + edgeSourceNodeId?: string; + media: WorkflowMediaReference; + title: string; + prompt: string; + offsetX?: number; + offsetY?: number; + selectAfterCreate?: boolean; + }) => { + const anchorNodeId = params.anchorNodeId || params.sourceNodeId; + const anchorNode = nodes.find((node) => node.id === anchorNodeId); + if (!anchorNode) return null; + + const size = + params.media.kind === "video" + ? { width: 360, height: 240 } + : { width: 320, height: 320 }; + const nodeId = addNode({ + type: params.media.kind, + position: { + x: anchorNode.position.x + anchorNode.size.width + 180 + (params.offsetX || 0), + y: + anchorNode.position.y + + anchorNode.size.height / 2 - + size.height / 2 + + (params.offsetY || 0), + }, + size, + data: + params.media.kind === "video" + ? { + src: params.media.url, + status: "completed", + prompt: params.prompt, + metadata: { + sourceWorkflowNodeId: params.sourceNodeId, + }, + } + : { + src: params.media.url, + status: "completed", + title: params.title, + prompt: params.prompt, + metadata: { + sourceWorkflowNodeId: params.sourceNodeId, + }, + }, + connections: [], + }); + + addEdge({ + source: params.edgeSourceNodeId || params.sourceNodeId, + target: nodeId, + type: "default", + }); + if (params.selectAfterCreate ?? true) { + selectNodes([nodeId]); + } + return nodeId; + }, + [addEdge, addNode, nodes, selectNodes] + ); + + const syncDirectPreviewNodes = useCallback( + (sourceNodeId: string, media: WorkflowMediaReference, sourcePrompt: string) => { + getDirectDownstreamNodes(sourceNodeId, workflowGraph).forEach((node) => { + const downstreamType = inferVideoWorkflowTemplateType(node); + if (node.type !== "workflow" || downstreamType !== "preview") return; + patchWorkflowNode(node.id, { + status: "completed", + summary: `已接收${media.kind === "video" ? "视频" : "图片"}预览,可继续检查结果后再保存。`, + metadata: { + previewMediaUrl: media.url, + previewMediaKind: media.kind, + previewMediaTitle: media.title || "", + sourcePrompt, + lastExecutedAt: new Date().toISOString(), + }, + }); + }); + }, + [patchWorkflowNode, workflowGraph] + ); + + const handleSyncAgentResultsToCanvas = useCallback(async () => { + if (!linkedAgentWorkflowNode || !linkedAgentWorkflowData || !agentProjectId) { + toast.error("当前 Agent 项目还没有关联到视频画布节点。"); + return; + } + + const composeText = (parts: unknown[]) => + Array.from( + new Set( + parts + .map((item) => String(item || "").trim()) + .filter(Boolean) + ) + ).join("\n"); + const resolveBatchOffset = (index: number) => ({ + x: (index % 2) * (320 + 28), + y: Math.floor(index / 2) * (320 + 28), + }); + + const existingCanvasUrls = new Set( + nodes + .flatMap((node) => { + if (node.type === "image" || node.type === "video") { + return [String((node.data as Record)?.src || "").trim()]; + } + return []; + }) + .filter((item) => /^https?:\/\//i.test(item)) + ); + const importedUrls = new Set(linkedAgentImportedResultUrls); + const resultsToImport = flattenedAgentResultEntries.filter( + (item) => !existingCanvasUrls.has(item.url) && !importedUrls.has(item.url) + ); + const nowIso = new Date().toISOString(); + const sourceNodeId = linkedAgentWorkflowNode.id; + const sourcePrompt = + composeText([ + String(linkedAgentWorkflowData.summary || "").trim(), + String(agentWorkspaceState.input || "").trim(), + ]) || "来自 Agent 工作台的结果回流。"; + const previewResult = (resultsToImport[0] || flattenedAgentResultEntries[0] || null) + ? { + nodeId: sourceNodeId, + kind: "image" as const, + url: String((resultsToImport[0] || flattenedAgentResultEntries[0])?.url || "").trim(), + title: `${String((resultsToImport[0] || flattenedAgentResultEntries[0])?.label || "Agent 结果").trim()} ${Number((resultsToImport[0] || flattenedAgentResultEntries[0])?.index || 0) + 1}`, + prompt: composeText([ + sourcePrompt, + String((resultsToImport[0] || flattenedAgentResultEntries[0])?.label || "").trim(), + ]), + source: "workflow-result" as const, + } + : null; + const resultGroupSummaries = ( + [ + "scene_generation", + "detail_generation", + "detail_replacement", + "sku_replacement", + ] as AgentGenerationResultModeType[] + ).reduce< + Array<{ + modeType: AgentGenerationResultModeType; + label: string; + count: number; + importedCount: number; + }> + >((groups, modeType) => { + const urls = flattenedAgentResultEntries + .filter((item) => item.modeType === modeType) + .map((item) => item.url); + if (urls.length === 0) return groups; + const importedCount = urls.filter((url) => importedUrls.has(url)).length; + groups.push({ + modeType, + label: AGENT_RESULT_MODE_LABELS[modeType], + count: urls.length, + importedCount, + }); + return groups; + }, []); + + setIsSyncingAgentResultsToCanvas(true); + patchWorkflowNode(sourceNodeId, { + status: "generating", + summary: + resultsToImport.length > 0 + ? "正在把 Agent 结果同步回视频画布..." + : "当前 Agent 结果已全部回流,正在切回视频画布...", + metadata: { + lastExecutedAt: nowIso, + }, + }); + + try { + const createdNodeIds: string[] = []; + const importedMediaRecords: Array<{ + nodeId: string; + media: WorkflowMediaReference; + modeType: AgentGenerationResultModeType; + }> = []; + + resultsToImport.forEach((item, index) => { + const offset = resolveBatchOffset(index); + const promptText = composeText([ + sourcePrompt, + item.label, + ]); + const media: WorkflowMediaReference = { + nodeId: sourceNodeId, + kind: "image", + url: item.url, + title: `${item.label} ${item.index + 1}`, + prompt: promptText, + source: "workflow-result", + }; + const createdNodeId = createWorkflowOutputNode({ + sourceNodeId, + media, + title: media.title || item.label, + prompt: promptText, + offsetX: offset.x, + offsetY: offset.y, + selectAfterCreate: false, + }); + + if (!createdNodeId) { + return; + } + + const createdNode = useCanvasStore.getState().nodes.find((node) => node.id === createdNodeId); + if (createdNode) { + const currentImageData = (createdNode.data || {}) as Record; + updateNode(createdNodeId, { + data: { + src: String(currentImageData.src || media.url).trim(), + status: currentImageData.status || "completed", + title: media.title, + prompt: promptText, + metadata: { + ...((currentImageData.metadata || {}) as Record), + sourceWorkflowNodeId: sourceNodeId, + sourceAgentProjectId: agentProjectId, + sourceAgentResultModeType: item.modeType, + importedFromAgentProject: true, + }, + }, + }); + } + + createdNodeIds.push(createdNodeId); + importedMediaRecords.push({ + nodeId: createdNodeId, + media, + modeType: item.modeType, + }); + }); + + const latestNodes = useCanvasStore.getState().nodes; + const allImportedImageNodes = latestNodes.filter((node) => { + if (node.type !== "image") return false; + const metadata = (((node.data as Record)?.metadata || {}) as Record); + return ( + String(metadata.sourceWorkflowNodeId || "").trim() === sourceNodeId && + metadata.importedFromAgentProject === true && + String(metadata.sourceAgentProjectId || "").trim() === agentProjectId + ); + }); + const directOutputNodes = getDirectDownstreamNodes(sourceNodeId, workflowGraph).filter( + (node) => + node.type === "workflow" && + ["preview", "local-save"].includes(inferVideoWorkflowTemplateType(node) || "") + ); + const syncedAgentAssets = allImportedImageNodes.map((node, index) => { + const imageData = (node.data || {}) as Record; + return { + url: String(imageData.src || "").trim(), + title: String(imageData.title || `Agent 结果 ${index + 1}`).trim(), + }; + }); + directOutputNodes.forEach((node) => { + const downstreamType = inferVideoWorkflowTemplateType(node); + if (downstreamType === "preview") { + if (previewResult) { + patchWorkflowNode(node.id, { + status: "completed", + summary: `已同步 ${Math.max( + allImportedImageNodes.length, + importedMediaRecords.length + )} 个 Agent 结果,可继续检查预览。`, + metadata: { + previewMediaUrl: previewResult.url, + previewMediaKind: previewResult.kind, + previewMediaTitle: previewResult.title || "", + sourcePrompt, + lastExecutedAt: nowIso, + agentResultCount: allImportedImageNodes.length, + }, + }); + } + return; + } + + if (downstreamType === "local-save") { + patchWorkflowNode(node.id, { + status: "completed", + summary: `已接入 ${allImportedImageNodes.length} 个 Agent 结果,可直接下载打包。`, + metadata: { + sourcePrompt, + pendingAssetCount: allImportedImageNodes.length, + agentResultCount: allImportedImageNodes.length, + agentResultGroups: resultGroupSummaries, + syncedAgentAssets, + lastExecutedAt: nowIso, + }, + }); + } + }); + + if (previewResult) { + syncDirectPreviewNodes(sourceNodeId, previewResult, sourcePrompt); + } + + const mergedImportedUrls = Array.from( + new Set([ + ...linkedAgentImportedResultUrls, + ...resultsToImport.map((item) => item.url), + ]) + ); + patchWorkflowNode(sourceNodeId, { + status: "completed", + summary: + resultsToImport.length > 0 + ? `已从 Agent 工作台回流 ${resultsToImport.length} 个结果到视频画布。` + : "当前 Agent 结果已全部同步到视频画布。", + metadata: { + importedAgentResultUrls: mergedImportedUrls, + importedAgentResultCount: mergedImportedUrls.length, + pendingAgentResultCount: Math.max( + flattenedAgentResultEntries.length - mergedImportedUrls.length, + 0 + ), + agentResultAssets: resultGroupSummaries.map((item) => ({ + modeType: item.modeType, + label: item.label, + assets: flattenedAgentResultEntries + .filter((entry) => entry.modeType === item.modeType) + .map((entry) => ({ + url: entry.url, + title: `${item.label} ${entry.index + 1}`, + })), + })), + agentResultGroups: resultGroupSummaries.map((item) => ({ + ...item, + importedCount: flattenedAgentResultEntries + .filter((entry) => entry.modeType === item.modeType) + .filter((entry) => mergedImportedUrls.includes(entry.url)).length, + })), + lastAgentCanvasSyncAt: nowIso, + lastExecutedAt: nowIso, + resultMediaUrl: previewResult?.url || "", + resultMediaKind: previewResult?.kind || "", + resultMediaTitle: previewResult?.title || "", + }, + }); + + if (createdNodeIds.length > 0) { + selectNodes(createdNodeIds); + } else { + selectNodes([sourceNodeId]); + } + + updateCanvasSearchParams({ + mode: null, + }); + toast.success( + resultsToImport.length > 0 + ? `已回流 ${resultsToImport.length} 个 Agent 结果` + : "没有新的 Agent 结果需要回流" + ); + } catch (error) { + const message = error instanceof Error ? error.message : "同步 Agent 结果到视频画布失败"; + patchWorkflowNode(sourceNodeId, { + status: "failed", + summary: message, + metadata: { + lastExecutedAt: nowIso, + lastError: message, + }, + }); + toast.error(message); + } finally { + setIsSyncingAgentResultsToCanvas(false); + } + }, [ + agentProjectId, + agentWorkspaceState.input, + createWorkflowOutputNode, + flattenedAgentResultEntries, + getDirectDownstreamNodes, + linkedAgentImportedResultUrls, + linkedAgentWorkflowData, + linkedAgentWorkflowNode, + nodes, + patchWorkflowNode, + selectNodes, + syncDirectPreviewNodes, + workflowGraph, + updateCanvasSearchParams, + updateNode, + ]); + + const syncDirectStoryboardChartNodes = useCallback( + ( + sourceNodeId: string, + shots: Array<{ title: string; description: string }>, + sourcePrompt: string + ) => { + const tableColumns = [ + { key: "shot", label: "镜头" }, + { key: "title", label: "标题" }, + { key: "description", label: "镜头说明" }, + { key: "prompt", label: "生成提示" }, + ]; + const tableRows = shots.slice(0, 12).map((shot, index) => ({ + shot: `#${index + 1}`, + title: String(shot.title || `镜头 ${index + 1}`).trim(), + description: String(shot.description || "").trim(), + prompt: [sourcePrompt, shot.title, shot.description] + .map((item) => String(item || "").trim()) + .filter(Boolean) + .filter((item, itemIndex, items) => items.indexOf(item) === itemIndex) + .join("\n"), + })); + getDirectDownstreamNodes(sourceNodeId, workflowGraph).forEach((node) => { + const downstreamType = inferVideoWorkflowTemplateType(node); + if (node.type !== "workflow" || downstreamType !== "storyboard-chart-node") { + return; + } + + patchWorkflowNode(node.id, { + status: "completed", + summary: `已同步 ${shots.length} 个镜头草案,可继续连接预览节点检查节奏。`, + metadata: { + storyboardShots: shots, + batchShotCount: shots.length, + tableColumns, + tableRows, + sourcePrompt, + lastExecutedAt: new Date().toISOString(), + storyboardSourceNodeId: sourceNodeId, + }, + }); + }); + }, + [patchWorkflowNode, workflowGraph] + ); + + const downloadWorkflowAssets = useCallback((assets: WorkflowMediaReference[], folderLabel: string) => { + if (typeof document === "undefined" || assets.length === 0) { + return; + } + + const now = new Date(); + const folderName = `${folderLabel}-${now.getFullYear()}${String(now.getMonth() + 1).padStart(2, "0")}${String(now.getDate()).padStart(2, "0")}-${String(now.getHours()).padStart(2, "0")}${String(now.getMinutes()).padStart(2, "0")}${String(now.getSeconds()).padStart(2, "0")}`; + const form = document.createElement("form"); + form.method = "POST"; + form.action = "/api/canvas/download-zip"; + form.style.display = "none"; + + const payloadInput = document.createElement("input"); + payloadInput.type = "hidden"; + payloadInput.name = "payload"; + payloadInput.value = JSON.stringify({ + folderName, + files: assets.map((asset, index) => ({ + url: asset.url, + name: asset.title || `${asset.kind}-result-${index + 1}`, + })), + }); + form.appendChild(payloadInput); + document.body.appendChild(form); + form.submit(); + form.remove(); + }, []); + + const buildStoryboardShots = useCallback( + (promptText: string, mediaSummary: { imageCount: number; videoCount: number }) => { + const fragments = Array.from( + new Set( + promptText + .split(/\n+/) + .flatMap((line) => line.split(/[。!?!?;;]+/)) + .map((item) => item.trim()) + .filter(Boolean) + ) + ); + + const seeds = + fragments.length > 0 + ? fragments.slice(0, 4) + : ["围绕主体建立开场氛围", "推进主体动作与情绪", "强化关键细节", "用结尾镜头完成收束"]; + + const suffix = + mediaSummary.imageCount > 0 + ? "保持参考图中的主体与视觉风格一致。" + : mediaSummary.videoCount > 0 + ? "承接参考视频中的节奏与镜头情绪。" + : "保持整体镜头风格统一。"; + + return seeds.map((item, index) => ({ + title: `镜头 ${index + 1}`, + description: `${item}${item.endsWith("。") ? "" : "。"}${suffix}`, + })); + }, + [] + ); + + const buildStoryboardShotPrompt = useCallback( + (basePrompt: string, shot: { title?: string; description?: string }) => + Array.from( + new Set( + [basePrompt, String(shot.title || ""), String(shot.description || "")] + .map((item) => item.trim()) + .filter(Boolean) + ) + ).join("\n"), + [] + ); + + const buildWorkflowTextBlock = useCallback((parts: unknown[]) => { + return Array.from( + new Set( + parts + .map((item) => String(item || "").trim()) + .filter(Boolean) + ) + ).join("\n"); + }, []); + + const buildCharacterAssets = useCallback( + (characters: WorkflowCharacterRecord[], sourcePrompt: string) => { + return characters.slice(0, 6).map((item) => ({ + name: item.name, + description: buildWorkflowTextBlock([ + item.description, + item.look ? `外观: ${item.look}` : "", + item.wardrobe ? `服装/道具: ${item.wardrobe}` : "", + item.signatureAction ? `动作: ${item.signatureAction}` : "", + item.traits.length > 0 ? `特质: ${item.traits.join("、")}` : "", + ]), + prompt: buildWorkflowTextBlock([ + sourcePrompt, + item.prompt, + item.description, + item.look, + item.wardrobe, + item.signatureAction, + item.traits.join("、"), + ]), + })); + }, + [buildWorkflowTextBlock] + ); + + const buildSceneAssets = useCallback( + (scenes: WorkflowSceneRecord[], sourcePrompt: string) => { + return scenes.slice(0, 6).map((item) => ({ + name: item.name, + description: buildWorkflowTextBlock([ + item.description, + item.mood ? `氛围: ${item.mood}` : "", + item.lighting ? `布光: ${item.lighting}` : "", + item.props.length > 0 ? `道具: ${item.props.join("、")}` : "", + ]), + prompt: buildWorkflowTextBlock([ + sourcePrompt, + item.prompt, + item.description, + item.mood, + item.lighting, + item.props.join("、"), + ]), + })); + }, + [buildWorkflowTextBlock] + ); + + const buildCharacterDescriptionSummary = useCallback( + (characters: WorkflowCharacterRecord[], sourcePrompt: string) => { + if (characters.length === 0) return sourcePrompt.trim(); + return characters + .slice(0, 3) + .map((item) => + buildWorkflowTextBlock([ + item.name, + item.description, + item.look, + item.wardrobe, + item.signatureAction, + item.traits.join("、"), + ]) + ) + .filter(Boolean) + .join("\n\n"); + }, + [buildWorkflowTextBlock] + ); + + const buildSceneDescriptionSummary = useCallback( + (scenes: WorkflowSceneRecord[], sourcePrompt: string) => { + if (scenes.length === 0) return sourcePrompt.trim(); + return scenes + .slice(0, 3) + .map((item) => + buildWorkflowTextBlock([ + item.name, + item.description, + item.mood, + item.lighting, + item.props.join("、"), + ]) + ) + .filter(Boolean) + .join("\n\n"); + }, + [buildWorkflowTextBlock] + ); + + const buildStoryboardChartRows = useCallback( + ( + shots: Array<{ title?: string; description?: string }>, + sourcePrompt: string + ) => { + const normalizedShots = shots + .map((shot, index) => ({ + title: String(shot.title || `镜头 ${index + 1}`).trim(), + description: String(shot.description || "").trim(), + })) + .filter((shot) => shot.title || shot.description) + .slice(0, 12); + + return { + columns: [ + { key: "shot", label: "镜头" }, + { key: "title", label: "标题" }, + { key: "description", label: "镜头说明" }, + { key: "prompt", label: "生成提示" }, + ], + rows: normalizedShots.map((shot, index) => ({ + shot: `#${index + 1}`, + title: shot.title, + description: shot.description, + prompt: buildStoryboardShotPrompt(sourcePrompt, shot), + })), + }; + }, + [buildStoryboardShotPrompt] + ); + + const buildWorkflowTableState = useCallback( + (params: { + promptText: string; + shots: Array<{ title?: string; description?: string }>; + structuredData: typeof selectedWorkflowStructuredData; + }) => { + if (params.shots.length > 0) { + const chart = buildStoryboardChartRows(params.shots, params.promptText); + return { + summary: `已整理 ${chart.rows.length} 行镜头表,可继续连接分镜节点或生成节点。`, + columns: chart.columns, + rows: chart.rows, + }; + } + + if ( + params.structuredData.characterAssets.length > 0 || + params.structuredData.characters.length > 0 + ) { + const characterRows = ( + params.structuredData.characterAssets.length > 0 + ? params.structuredData.characterAssets + : params.structuredData.characters + ) + .slice(0, 8) + .map((item, index) => ({ + name: item.name || `角色 ${index + 1}`, + description: item.description || "", + prompt: item.prompt || "", + })); + + return { + summary: `已整理 ${characterRows.length} 行角色资产表,可继续固化角色或生成角色图。`, + columns: [ + { key: "name", label: "角色" }, + { key: "description", label: "描述" }, + { key: "prompt", label: "提示词" }, + ], + rows: characterRows, + }; + } + + if ( + params.structuredData.sceneAssets.length > 0 || + params.structuredData.scenes.length > 0 + ) { + const sceneRows = ( + params.structuredData.sceneAssets.length > 0 + ? params.structuredData.sceneAssets + : params.structuredData.scenes + ) + .slice(0, 8) + .map((item, index) => ({ + name: item.name || `场景 ${index + 1}`, + description: item.description || "", + prompt: item.prompt || "", + })); + + return { + summary: `已整理 ${sceneRows.length} 行场景资产表,可继续固化场景或生成场景图。`, + columns: [ + { key: "name", label: "场景" }, + { key: "description", label: "描述" }, + { key: "prompt", label: "提示词" }, + ], + rows: sceneRows, + }; + } + + const promptRows = params.promptText + .split(/\n+/) + .map((item) => item.trim()) + .filter(Boolean) + .slice(0, 8) + .map((item, index) => ({ + section: `段落 ${index + 1}`, + content: item, + })); + + return { + summary: + promptRows.length > 0 + ? `已整理 ${promptRows.length} 行脚本表,可继续转成分镜节点。` + : "上游还没有可整理成表格的内容。", + columns: [ + { key: "section", label: "段落" }, + { key: "content", label: "内容" }, + ], + rows: promptRows, + }; + }, + [buildStoryboardChartRows, selectedWorkflowStructuredData] + ); + + const buildWorkflowCompareItems = useCallback((media: WorkflowMediaReference[]) => { + return media + .filter((item) => /^https?:\/\//i.test(item.url)) + .slice(0, 4) + .map((item, index) => ({ + label: + index === 0 + ? "基准" + : item.source === "workflow-result" + ? `结果 ${index + 1}` + : `对照 ${index + 1}`, + kind: item.kind, + url: item.url, + title: + String(item.title || item.prompt || `${item.kind === "video" ? "视频" : "图片"} ${index + 1}`).trim(), + })); + }, []); + + const buildWorkflowDefaultCropRect = useCallback((promptText: string) => { + const normalizedPrompt = String(promptText || "").toLowerCase(); + const isPortraitFocus = + /人物|角色|主体|局部|特写|脸|肖像|portrait|close/.test(normalizedPrompt); + const isObjectFocus = + /产品|物体|商品|道具|item|product/.test(normalizedPrompt); + + const width = isPortraitFocus ? 0.5 : isObjectFocus ? 0.56 : 0.64; + const height = isPortraitFocus ? 0.72 : isObjectFocus ? 0.58 : 0.64; + const baseX = /左|left/.test(normalizedPrompt) + ? 0.08 + : /右|right/.test(normalizedPrompt) + ? 1 - width - 0.08 + : (1 - width) / 2; + const baseY = /上|top|天空/.test(normalizedPrompt) + ? 0.08 + : /下|bottom|地面/.test(normalizedPrompt) + ? 1 - height - 0.08 + : (1 - height) / 2; + + return { + x: Number(Math.max(0, Math.min(baseX, 1 - width)).toFixed(4)), + y: Number(Math.max(0, Math.min(baseY, 1 - height)).toFixed(4)), + width: Number(width.toFixed(4)), + height: Number(height.toFixed(4)), + }; + }, []); + + const inferWorkflowExtendScales = useCallback((promptText: string) => { + const normalizedPrompt = String(promptText || "").toLowerCase(); + const match = normalizedPrompt.match(/([1-4](?:\.\d+)?)\s*倍/); + let xScale = match ? Number(match[1]) : 1.45; + let yScale = match ? Number(match[1]) : 1.45; + + if (/左右|横向|宽屏|全景|横幅|拓宽|扩宽|panorama|wide/.test(normalizedPrompt)) { + xScale = Math.max(xScale, 1.7); + } + if (/上下|纵向|天空|地面|抬高|向上|向下|tall|vertical/.test(normalizedPrompt)) { + yScale = Math.max(yScale, 1.7); + } + if (/补边|延展|继续|stitch|outpaint|扩展/.test(normalizedPrompt)) { + xScale = Math.max(xScale, 1.6); + yScale = Math.max(yScale, 1.6); + } + + return { + xScale: Number(Math.min(Math.max(xScale, 1.1), 4).toFixed(2)), + yScale: Number(Math.min(Math.max(yScale, 1.1), 4).toFixed(2)), + }; + }, []); + + const buildWorkflowCameraPreset = useCallback((promptText: string) => { + const normalizedPrompt = String(promptText || "").toLowerCase(); + let horizontalAngle = 0; + let verticalAngle = 0; + let zoom = 5; + const notes: string[] = []; + + if (/左侧|左前|left/.test(normalizedPrompt)) { + horizontalAngle = 330; + notes.push("偏左机位"); + } else if (/右侧|右前|right/.test(normalizedPrompt)) { + horizontalAngle = 30; + notes.push("偏右机位"); + } else if (/背面|后方|rear|back/.test(normalizedPrompt)) { + horizontalAngle = 180; + notes.push("背向机位"); + } else { + notes.push("正面机位"); + } + + if (/俯拍|鸟瞰|top|overhead/.test(normalizedPrompt)) { + verticalAngle = 38; + notes.push("俯拍"); + } else if (/仰拍|低机位|low angle/.test(normalizedPrompt)) { + verticalAngle = -18; + notes.push("仰拍"); + } else if (/平视|eye level/.test(normalizedPrompt)) { + verticalAngle = 0; + notes.push("平视"); + } else { + verticalAngle = 8; + notes.push("轻微抬升"); + } + + if (/特写|close[- ]?up|近景/.test(normalizedPrompt)) { + zoom = 7.5; + notes.push("特写焦距"); + } else if (/远景|全景|wide shot|long shot/.test(normalizedPrompt)) { + zoom = 3.5; + notes.push("远景焦距"); + } else if (/中景|medium shot/.test(normalizedPrompt)) { + zoom = 5; + notes.push("中景焦距"); + } else { + zoom = 5.8; + notes.push("标准电影镜头"); + } + + return { + horizontalAngle, + verticalAngle, + zoom, + notes, + }; + }, []); + + const buildWorkflowMovementDirective = useCallback((promptText: string) => { + const normalizedPrompt = String(promptText || "").toLowerCase(); + const cameraMove = /推进|推近|push|zoom in/.test(normalizedPrompt) + ? "镜头缓慢推进,强调主体情绪和细节。" + : /拉远|拉开|pull|zoom out/.test(normalizedPrompt) + ? "镜头缓慢拉远,交代环境关系和空间层次。" + : /环绕|orbit|绕拍/.test(normalizedPrompt) + ? "镜头围绕主体轻微环绕,增强立体感与叙事张力。" + : /摇镜|pan|横移/.test(normalizedPrompt) + ? "镜头横向摇移,顺着主体视线或动作方向展开。" + : "镜头以电影化的平滑运动推进,保持主体稳定、节奏自然。"; + const motionCue = /奔跑|run|冲刺/.test(normalizedPrompt) + ? "主体动作以奔跑推进,节奏偏快。" + : /转身|turn/.test(normalizedPrompt) + ? "主体动作强调转身和视线转换。" + : /抬手|挥手|gesture/.test(normalizedPrompt) + ? "主体动作聚焦手部与上半身姿态。" + : "主体动作自然、连贯,避免突然跳帧。"; + const rhythm = /慢|slow|舒缓/.test(normalizedPrompt) + ? "节奏舒缓,过渡柔和。" + : /快|fast|激烈/.test(normalizedPrompt) + ? "节奏偏快,强调冲击力。" + : "节奏中等,适合叙事性镜头。"; + + return { + cameraMove, + motionCue, + rhythm, + cameraFixed: /固定镜头|lock|static/.test(normalizedPrompt), + }; + }, []); + + const buildWorkflowMusicPlan = useCallback( + ( + promptText: string, + shots: Array<{ title?: string; description?: string }> + ) => { + const normalizedPrompt = String(promptText || "").toLowerCase(); + const mood = /悬疑|紧张|mystery|suspense/.test(normalizedPrompt) + ? "悬疑推进" + : /浪漫|温柔|romantic|warm/.test(normalizedPrompt) + ? "温柔抒情" + : /史诗|宏大|epic/.test(normalizedPrompt) + ? "史诗展开" + : /治愈|轻松|healing|light/.test(normalizedPrompt) + ? "轻盈治愈" + : "电影感氛围"; + const instrumentation = /电子|synth|edm/.test(normalizedPrompt) + ? "电子氛围 + 节奏脉冲" + : /钢琴|piano/.test(normalizedPrompt) + ? "钢琴主旋律 + 轻弦乐" + : /弦乐|string/.test(normalizedPrompt) + ? "弦乐铺底 + 低频鼓点" + : "氛围铺底 + 轻打击乐"; + const cueSeeds = + shots.length > 0 + ? shots.slice(0, 4).map((shot, index) => ({ + cue: `Cue ${index + 1}`, + moment: String(shot.title || `镜头 ${index + 1}`).trim(), + mood, + instrumentation, + })) + : [ + { cue: "Cue 1", moment: "开场建立", mood, instrumentation }, + { cue: "Cue 2", moment: "主体推进", mood, instrumentation }, + { cue: "Cue 3", moment: "细节强化", mood, instrumentation }, + { cue: "Cue 4", moment: "结尾收束", mood, instrumentation }, + ]; + + return { + summary: `已整理 ${cueSeeds.length} 段配乐 cue sheet,可继续交给外部音频工具或作曲流程。`, + highlights: [ + `整体情绪建议:${mood}`, + `主乐器建议:${instrumentation}`, + "建议保持段落递进,避免配乐情绪和镜头节奏脱节。", + ], + columns: [ + { key: "cue", label: "Cue" }, + { key: "moment", label: "对应镜头" }, + { key: "mood", label: "情绪" }, + { key: "instrumentation", label: "配器" }, + ], + rows: cueSeeds, + }; + }, + [] + ); + + const buildWorkflowHandoffPlan = useCallback( + ( + target: "rh-app" | "rh-comfy", + params: { + promptText: string; + shots: Array<{ title?: string; description?: string }>; + structuredData: typeof selectedWorkflowStructuredData; + media: WorkflowMediaReference[]; + } + ) => { + const targetLabel = target === "rh-comfy" ? "Comfy" : "RH 应用"; + const starterSteps = + target === "rh-comfy" + ? [ + "载入输入图片与脚本提示", + "整理正负提示词与镜头控制", + "连接生图/生视频节点并输出结果", + ] + : [ + "选择对应 RH 工作台模板", + "填入脚本、镜头和角色资产", + "执行生成并回收结果", + ]; + + const stepRows = starterSteps.map((step, index) => ({ + step: `${index + 1}`, + action: step, + input: + index === 0 + ? params.media.length > 0 + ? `已挂接 ${params.media.length} 个媒体输入` + : "以上游脚本文本为主" + : index === 1 + ? `${Math.max(params.shots.length, 1)} 个镜头 / ${params.structuredData.characters.length} 个角色线索` + : "输出到预览 / 保存节点", + })); + + return { + summary: `已整理一份可投递到${targetLabel}的工作流包。`, + highlights: [ + `目标平台:${targetLabel}`, + `建议先带入 ${Math.max(params.shots.length, 1)} 个镜头和 ${params.media.length} 个素材输入。`, + "这份包更偏流程交付物,方便后续继续在外部工作流里执行。", + ], + deliverables: [ + `${targetLabel} 工作流步骤表`, + "关键提示词与镜头说明", + "上游素材与参考图清单", + ], + columns: [ + { key: "step", label: "步骤" }, + { key: "action", label: "操作" }, + { key: "input", label: "输入/说明" }, + ], + rows: stepRows, + }; + }, + [selectedWorkflowStructuredData] + ); + + const buildWorkflowCanvasBoardState = useCallback( + (media: WorkflowMediaReference[], promptText: string) => { + const boardItems = buildWorkflowCompareItems(media).slice(0, 6); + return { + summary: + boardItems.length > 0 + ? `已整理 ${boardItems.length} 个素材到画板节点,可继续做对比、分支和预览。` + : "上游暂时没有可整理进画板的素材。", + compareItems: boardItems, + columns: [ + { key: "slot", label: "槽位" }, + { key: "title", label: "素材" }, + { key: "kind", label: "类型" }, + ], + rows: boardItems.map((item, index) => ({ + slot: `Board ${index + 1}`, + title: item.title, + kind: item.kind === "video" ? "视频/封面" : "图片", + })), + highlights: [ + promptText.trim() + ? `当前画板主题:${promptText.trim().slice(0, 72)}${promptText.trim().length > 72 ? "..." : ""}` + : "当前画板主题还未明确,可继续补充一句创作目标。", + "建议把画板作为挑图、对比和后续分支创作的中转节点。", + ], + }; + }, + [buildWorkflowCompareItems] + ); + + const buildWorkflowDoodleInstructions = useCallback((promptText: string) => { + const normalizedPrompt = String(promptText || "").trim(); + const rows = [ + { + area: /左|left/.test(normalizedPrompt.toLowerCase()) ? "左侧区域" : "主体区域", + intent: /替换|replace/.test(normalizedPrompt) ? "替换元素" : "补充结构", + note: normalizedPrompt || "用涂鸦勾出主体、边缘和希望补充的视觉结构。", + }, + { + area: /背景|environment|scene/.test(normalizedPrompt.toLowerCase()) ? "背景区域" : "外围区域", + intent: /光|氛围|mood/.test(normalizedPrompt.toLowerCase()) ? "调整氛围" : "补充背景", + note: "建议用大笔触勾出背景方向、透视和光影分区。", + }, + { + area: "细节区域", + intent: "强调重点", + note: "对关键细节、轮廓或遮罩边缘做重点标注,便于后续局部重绘。", + }, + ]; + + return { + summary: "已整理一版涂鸦/遮罩指令,可继续连接局部重绘或外部绘制流程。", + highlights: [ + "先用粗笔触圈出主体,再补背景方向和细节区。", + "涂鸦节点更适合作为局部重绘、补画或外部画板的中间层。", + ], + columns: [ + { key: "area", label: "区域" }, + { key: "intent", label: "意图" }, + { key: "note", label: "操作说明" }, + ], + rows, + }; + }, []); + + const resolvePreferredCharacterPrompt = useCallback( + (sourcePrompt: string, structuredData: typeof selectedWorkflowStructuredData) => { + return buildWorkflowTextBlock([ + sourcePrompt, + structuredData.characterAssets[0]?.prompt, + structuredData.characters[0]?.prompt, + ]); + }, + [buildWorkflowTextBlock] + ); + + const resolvePreferredScenePrompt = useCallback( + (sourcePrompt: string, structuredData: typeof selectedWorkflowStructuredData) => { + return buildWorkflowTextBlock([ + sourcePrompt, + structuredData.sceneAssets[0]?.prompt, + structuredData.scenes[0]?.prompt, + ]); + }, + [buildWorkflowTextBlock] + ); + + const buildWorkflowAgentProjectTitle = useCallback( + (params: { + promptText: string; + nodeTitle?: string | null; + structuredData: typeof selectedWorkflowStructuredData; + }) => { + const rawNodeTitle = String(params.nodeTitle || "").trim(); + const normalizedNodeTitle = + rawNodeTitle && !["Agent", "自定义代理", "custom-agent"].includes(rawNodeTitle) + ? rawNodeTitle + : ""; + const characterName = + String( + params.structuredData.characterAssets[0]?.name || + params.structuredData.characters[0]?.name || + "" + ).trim(); + const sceneName = + String( + params.structuredData.sceneAssets[0]?.name || + params.structuredData.scenes[0]?.name || + "" + ).trim(); + const promptSeed = + params.promptText + .split(/\n+/) + .map((item) => item.trim()) + .find(Boolean) || "视频画布任务"; + const baseTitle = + normalizedNodeTitle || [characterName, sceneName].filter(Boolean).join(" / ") || promptSeed; + const compactTitle = baseTitle.replace(/\s+/g, " ").trim().slice(0, 40) || "视频画布任务"; + return compactTitle.includes("Agent") ? compactTitle : `${compactTitle} Agent`; + }, + [] + ); + + const buildWorkflowAgentProjectDescription = useCallback( + (params: { + promptText: string; + summary?: string | null; + structuredData: typeof selectedWorkflowStructuredData; + }) => { + return buildWorkflowTextBlock([ + params.summary, + params.structuredData.deliverables[0], + params.structuredData.recommendedNextSteps[0], + params.promptText.slice(0, 140), + ]).slice(0, 220); + }, + [buildWorkflowTextBlock] + ); + + const buildWorkflowAgentWorkspaceInput = useCallback( + (params: { + promptText: string; + storyboardShots: Array<{ title?: string; description?: string }>; + structuredData: typeof selectedWorkflowStructuredData; + }) => { + const toLines = (items: string[], limit = 6) => + Array.from( + new Set( + items + .map((item) => String(item || "").trim()) + .filter(Boolean) + ) + ).slice(0, limit); + + const buildSection = (label: string, items: string[], limit = 6) => { + const lines = toLines(items, limit); + if (lines.length === 0) return ""; + return `${label}:\n${lines.map((item, index) => `${index + 1}. ${item}`).join("\n")}`; + }; + + const buildNamedSection = ( + label: string, + items: Array>, + limit = 4 + ) => { + const lines = items + .slice(0, limit) + .map((item, index) => { + const name = String(item.name || item.title || `条目 ${index + 1}`).trim(); + const detail = buildWorkflowTextBlock([ + item.description, + item.prompt, + item.look, + item.wardrobe, + item.signatureAction, + item.mood, + item.lighting, + Array.isArray(item.traits) ? item.traits.join("、") : "", + Array.isArray(item.props) ? item.props.join("、") : "", + ]).replace(/\n+/g, " / "); + return detail ? `${name}: ${detail}` : name; + }) + .filter(Boolean); + return buildSection(label, lines, limit); + }; + + const shotLines = params.storyboardShots.slice(0, 6).map((item, index) => + buildWorkflowTextBlock([ + String(item.title || `镜头 ${index + 1}`).trim(), + String(item.description || "").trim(), + ]).replace(/\n+/g, " / ") + ); + + return [ + buildSection( + "任务目标", + [params.promptText || "请基于当前视频画布上下文继续推进创作任务。"], + 3 + ), + buildSection("分镜草案", shotLines, 6), + buildNamedSection("角色线索", [ + ...params.structuredData.characters, + ...params.structuredData.characterAssets, + ]), + buildNamedSection("场景线索", [ + ...params.structuredData.scenes, + ...params.structuredData.sceneAssets, + ]), + buildSection("代理计划", params.structuredData.agentPlan, 6), + buildSection("交付物", params.structuredData.deliverables, 6), + buildSection( + "推荐后续动作", + [...params.structuredData.recommendedNextSteps, ...params.structuredData.recommendedNodes], + 6 + ), + ] + .filter(Boolean) + .join("\n\n"); + }, + [buildWorkflowTextBlock] + ); + + const buildWorkflowAgentAttachments = useCallback( + (media: WorkflowMediaReference[]): AgentGenerationProjectWorkspaceAttachment[] => { + const seen = new Set(); + return media + .filter((item) => item.kind === "image") + .filter((item) => { + const url = String(item.url || "").trim(); + if (!url || seen.has(url)) return false; + seen.add(url); + return true; + }) + .slice(0, 8) + .map((item, index) => ({ + url: item.url, + name: item.title || `参考图 ${index + 1}`, + contentType: "image/png", + assetId: null, + })); + }, + [] + ); + + const mergeWorkflowAgentAttachments = useCallback( + ( + existing: Array, + incoming: AgentGenerationProjectWorkspaceAttachment[] + ) => { + const seen = new Set(); + return [...incoming, ...existing] + .map((item) => { + if (!item) return null; + const url = String(item.url || "").trim(); + if (!url || seen.has(url)) return null; + seen.add(url); + return { + url, + name: String(item.name || "").trim() || null, + contentType: String(item.contentType || "").trim() || null, + assetId: String(item.assetId || "").trim() || null, + }; + }) + .filter(Boolean) + .slice(0, 16) as AgentGenerationProjectWorkspaceAttachment[]; + }, + [] + ); + + const mergeWorkflowAgentInput = useCallback((existingInput: string, syncInput: string) => { + const contextBlock = + `${WORKFLOW_AGENT_CONTEXT_START}\n${syncInput.trim()}\n${WORKFLOW_AGENT_CONTEXT_END}`.trim(); + const normalizedExisting = String(existingInput || "").trim(); + if (!normalizedExisting) { + return contextBlock; + } + + const startIndex = normalizedExisting.indexOf(WORKFLOW_AGENT_CONTEXT_START); + const endIndex = normalizedExisting.indexOf(WORKFLOW_AGENT_CONTEXT_END); + + if (startIndex >= 0 && endIndex > startIndex) { + const before = normalizedExisting.slice(0, startIndex).trim(); + const after = normalizedExisting + .slice(endIndex + WORKFLOW_AGENT_CONTEXT_END.length) + .trim(); + return [before, contextBlock, after].filter(Boolean).join("\n\n"); + } + + return [contextBlock, normalizedExisting].filter(Boolean).join("\n\n"); + }, []); + + const handleOpenSelectedWorkflowInAgent = useCallback(async () => { + if (!selectedVideoWorkflowNode || selectedVideoWorkflowType !== "custom-agent") { + return; + } + + const workflowData = selectedVideoWorkflowData; + if (!workflowData) { + return; + } + + const nodeId = selectedVideoWorkflowNode.id; + const taskKey = `${nodeId}:agent`; + const nowIso = new Date().toISOString(); + const storyboardShots = selectedWorkflowStoryboardShots.slice(0, 8); + const workflowPrompt = + selectedWorkflowPrompt.trim() || + "请基于当前视频画布中的脚本、分镜、角色和场景资产继续推进创作。"; + const syncInput = buildWorkflowAgentWorkspaceInput({ + promptText: workflowPrompt, + storyboardShots, + structuredData: selectedWorkflowStructuredData, + }); + const incomingAttachments = buildWorkflowAgentAttachments(selectedWorkflowMedia); + const firstIncomingAttachmentNodeId = + incomingAttachments[0] + ? selectedWorkflowMedia.find( + (item) => + item.kind === "image" && item.url === incomingAttachments[0]?.url + )?.nodeId || null + : null; + const inferredAspectRatio = + incomingAttachments.length > 0 + ? guessCanvasAspectRatio(firstIncomingAttachmentNodeId) + : selectedWorkflowInputs.videoCount > 0 + ? guessVideoRatio( + selectedWorkflowMedia.find((item) => item.kind === "video")?.nodeId || nodeId + ) + : "auto"; + const nextProjectTitle = buildWorkflowAgentProjectTitle({ + promptText: workflowPrompt, + nodeTitle: workflowData.title, + structuredData: selectedWorkflowStructuredData, + }); + const nextProjectDescription = buildWorkflowAgentProjectDescription({ + promptText: workflowPrompt, + summary: workflowData.summary, + structuredData: selectedWorkflowStructuredData, + }); + const fallbackWorkflowState = { + ...createEmptyAgentGenerationProjectPersistedState().workflowState, + ...buildCurrentWorkflowPersistedState(), + currentStage: "mode" as const, + }; + + setActiveWorkflowExecutionTaskKey(taskKey); + patchWorkflowNode(nodeId, { + status: "generating", + summary: selectedWorkflowLinkedAgentProject.id + ? "正在同步到已关联的 Agent 项目..." + : "正在创建 Agent 项目并同步当前上下文...", + metadata: { + lastExecutedAt: nowIso, + }, + }); + + try { + let existingProject: AgentGenerationProject | null = null; + if (selectedWorkflowLinkedAgentProject.id) { + const linkedResult = await agentProjectService.getProject(selectedWorkflowLinkedAgentProject.id); + if (linkedResult.success && linkedResult.data) { + existingProject = linkedResult.data; + } else if (isUnauthorizedApiError(linkedResult.error)) { + setIsAuthenticated(false); + openLoginDialog(linkedResult.error || "当前登录状态已失效,请重新登录后继续操作。"); + throw new Error(linkedResult.error || "当前登录状态已失效,请重新登录后继续操作。"); + } + } + + const existingPersistedState = existingProject + ? normalizeAgentGenerationProjectPersistedState(existingProject.projectState) + : createEmptyAgentGenerationProjectPersistedState(); + const defaultWorkspaceState = createEmptyAgentGenerationProjectWorkspaceState(); + const nextWorkspaceState: AgentGenerationProjectWorkspaceState = { + ...defaultWorkspaceState, + ...(existingPersistedState.workspaceState || {}), + input: mergeWorkflowAgentInput( + String(existingPersistedState.workspaceState?.input || ""), + syncInput + ), + attachments: mergeWorkflowAgentAttachments( + existingPersistedState.workspaceState?.attachments || [], + incomingAttachments + ), + selectedModelId: + String(existingPersistedState.workspaceState?.selectedModelId || "").trim() || "auto", + imageParams: { + ...defaultWorkspaceState.imageParams, + ...(existingPersistedState.workspaceState?.imageParams || {}), + aspectRatio: + String(existingPersistedState.workspaceState?.imageParams?.aspectRatio || "").trim() || + inferredAspectRatio || + "auto", + }, + }; + const nextPersistedState: AgentGenerationProjectPersistedState = { + ...existingPersistedState, + workflowState: existingProject + ? { + ...(existingPersistedState.workflowState || fallbackWorkflowState), + currentStage: "mode", + } + : fallbackWorkflowState, + workspaceState: nextWorkspaceState, + resultCollections: existingPersistedState.resultCollections || {}, + deletedResultCollections: existingPersistedState.deletedResultCollections || {}, + resultImageUrls: existingPersistedState.resultImageUrls || [], + }; + + const payload = { + title: existingProject?.title || nextProjectTitle, + description: existingProject?.description || nextProjectDescription || null, + thumbnail: incomingAttachments[0]?.url || existingProject?.thumbnail || null, + projectState: nextPersistedState, + }; + + const result = existingProject + ? await agentProjectService.updateProject(existingProject.id, payload) + : await agentProjectService.createProject(payload); + + if (!result.success || !result.data) { + if (isUnauthorizedApiError(result.error)) { + setIsAuthenticated(false); + openLoginDialog(result.error || "当前登录状态已失效,请重新登录后继续操作。"); + throw new Error(result.error || "当前登录状态已失效,请重新登录后继续操作。"); + } + throw new Error(result.error || "同步 Agent 项目失败"); + } + + patchWorkflowNode(nodeId, { + status: "completed", + summary: existingProject + ? "已同步到 Agent 工作台,可继续完善提示词、参考图和执行步骤。" + : "已创建 Agent 项目并同步当前上下文,可继续在 Agent 工作台推进。", + metadata: { + linkedAgentProjectId: result.data.id, + linkedAgentProjectTitle: result.data.title || nextProjectTitle, + linkedAgentProjectUpdatedAt: String(result.data.updatedAt || nowIso), + lastAgentWorkspaceSyncAt: nowIso, + lastExecutedAt: nowIso, + }, + }); + + setIsPanelOpen(true); + setPanelMode("chat"); + updateCanvasSearchParams({ + mode: "agent", + agentProjectId: result.data.id, + }); + toast.success(existingProject ? "已同步到 Agent 工作台" : "已创建 Agent 项目"); + } catch (error) { + const message = error instanceof Error ? error.message : "打开 Agent 工作台失败"; + patchWorkflowNode(nodeId, { + status: "failed", + summary: message, + metadata: { + lastExecutedAt: nowIso, + lastError: message, + }, + }); + toast.error(message); + } finally { + setActiveWorkflowExecutionTaskKey((current) => (current === taskKey ? null : current)); + } + }, [ + buildCurrentWorkflowPersistedState, + buildWorkflowAgentAttachments, + buildWorkflowAgentProjectDescription, + buildWorkflowAgentProjectTitle, + buildWorkflowAgentWorkspaceInput, + guessCanvasAspectRatio, + guessVideoRatio, + mergeWorkflowAgentAttachments, + mergeWorkflowAgentInput, + openLoginDialog, + patchWorkflowNode, + selectedVideoWorkflowData, + selectedVideoWorkflowNode, + selectedVideoWorkflowType, + selectedWorkflowInputs.videoCount, + selectedWorkflowLinkedAgentProject.id, + selectedWorkflowMedia, + selectedWorkflowPrompt, + selectedWorkflowStoryboardShots, + selectedWorkflowStructuredData, + updateCanvasSearchParams, + ]); + + const getWorkflowBatchOutputOffset = useCallback( + (kind: WorkflowMediaReference["kind"], index: number) => { + const size = + kind === "video" + ? { width: 360, height: 240 } + : { width: 320, height: 320 }; + const columns = 2; + return { + x: (index % columns) * (size.width + 28), + y: Math.floor(index / columns) * (size.height + 28), + }; + }, + [] + ); + // 添加文本节点 - const handleAddTextNode = () => { - addNode({ - type: 'text', + const getVideoWorkflowPlacement = useCallback( + (size: { width: number; height: number }) => { + if (!isVideoMode || selectedNodeIds.length !== 1) { + const origin = getVisibleCanvasOrigin(); + return { + x: origin.x + Math.random() * 120, + y: origin.y + Math.random() * 120, + }; + } + + const sourceNode = nodes.find((node) => node.id === selectedNodeIds[0]); + if (!sourceNode) { + const origin = getVisibleCanvasOrigin(); + return { + x: origin.x + Math.random() * 120, + y: origin.y + Math.random() * 120, + }; + } + + return { + x: sourceNode.position.x + sourceNode.size.width + 180, + y: sourceNode.position.y + sourceNode.size.height / 2 - size.height / 2, + }; + }, + [getVisibleCanvasOrigin, isVideoMode, nodes, selectedNodeIds] + ); + + const createCanvasNode = useCallback( + ( + nodeConfig: Parameters[0], + options?: { + connectFromSelection?: boolean; + selectNewNode?: boolean; + } + ) => { + const connectFromSelection = options?.connectFromSelection ?? true; + const selectNewNode = options?.selectNewNode ?? true; + const nodeId = addNode(nodeConfig); + const sourceNodeId = + connectFromSelection && isVideoMode && selectedNodeIds.length === 1 + ? selectedNodeIds[0] || null + : null; + if (sourceNodeId && sourceNodeId !== nodeId) { + addEdge({ + source: sourceNodeId, + target: nodeId, + type: "default", + }); + } + if (selectNewNode) { + selectNodes([nodeId]); + } + return nodeId; + }, + [addEdge, addNode, isVideoMode, selectNodes, selectedNodeIds] + ); + + const handleAddWorkflowNode = useCallback( + (templateType: VideoWorkflowTemplateType) => { + const definition = getVideoWorkflowNodeDefinition(templateType); + if (!definition) return; + const placement = getVideoWorkflowPlacement(definition.size); + createCanvasNode(buildVideoWorkflowCanvasNode(templateType, placement)); + }, + [createCanvasNode, getVideoWorkflowPlacement] + ); + + const handleInsertVideoWorkflowTemplate = useCallback( + (templateId: string) => { + const upstreamNodeId = + isVideoMode && selectedNodeIds.length === 1 ? selectedNodeIds[0] || null : null; + const starterTemplate = + VIDEO_WORKFLOW_STARTER_TEMPLATES.find((item) => item.id === templateId) || + VIDEO_WORKFLOW_STARTER_TEMPLATES[0]; + const firstNodeType = starterTemplate.nodes[0] || "text-node"; + const firstNodeDefinition = getVideoWorkflowNodeDefinition(firstNodeType); + const origin = upstreamNodeId + ? getVideoWorkflowPlacement( + firstNodeDefinition?.size || { width: 360, height: 280 } + ) + : getVisibleCanvasOrigin(); + const { nodes: templateNodes, edges: templateEdges } = + buildVideoWorkflowStarterTemplateGraph(templateId, origin); + const createdIds = templateNodes.map((item) => + createCanvasNode(item.node, { + connectFromSelection: false, + selectNewNode: false, + }) + ); + + if (upstreamNodeId && createdIds[0] && upstreamNodeId !== createdIds[0]) { + addEdge({ + source: upstreamNodeId, + target: createdIds[0], + type: "default", + }); + } + + templateEdges.forEach((edge) => { + const sourceId = createdIds[edge.sourceIndex]; + const targetId = createdIds[edge.targetIndex]; + if (!sourceId || !targetId) return; + addEdge({ + source: sourceId, + target: targetId, + type: edge.type, + }); + }); + + if (createdIds.length > 0) { + selectNodes(createdIds); + } + }, + [ + addEdge, + createCanvasNode, + getVisibleCanvasOrigin, + getVideoWorkflowPlacement, + isVideoMode, + selectNodes, + selectedNodeIds, + ] + ); + + const handleCreateSelectedAgentResultBranches = useCallback(async () => { + if ( + !selectedVideoWorkflowNode || + selectedVideoWorkflowType !== "custom-agent" || + selectedWorkflowAgentResultAssets.length === 0 + ) { + toast.error("当前自定义代理节点还没有可展开的 Agent 结果分组。"); + return; + } + + const sourceNodeId = selectedVideoWorkflowNode.id; + const sourceNode = selectedVideoWorkflowNode; + const taskKey = `${sourceNodeId}:branches`; + const nowIso = new Date().toISOString(); + const touchedNodeIds: string[] = []; + + const findExistingBranchNode = ( + modeType: string, + branchRole: "preview" | "local-save" + ) => + nodes.find((node) => { + if (node.type !== "workflow") return false; + const templateType = inferVideoWorkflowTemplateType(node); + if (templateType !== branchRole) return false; + const metadata = (((node.data as WorkflowNodeData).metadata || {}) as Record); + return ( + String(metadata.sourceWorkflowNodeId || "").trim() === sourceNodeId && + String(metadata.agentResultModeType || "").trim() === modeType && + String(metadata.agentBranchRole || "").trim() === branchRole + ); + }) || null; + + setActiveWorkflowExecutionTaskKey(taskKey); + patchWorkflowNode(sourceNodeId, { + status: "generating", + summary: "正在按 Agent 结果分组整理下游分支...", + metadata: { + lastExecutedAt: nowIso, + }, + }); + + try { + selectedWorkflowAgentResultAssets.forEach((group, index) => { + const previewPosition = { + x: sourceNode.position.x + sourceNode.size.width + 220, + y: sourceNode.position.y + index * 220, + }; + const savePosition = { + x: previewPosition.x + 520, + y: previewPosition.y + 24, + }; + const previewNode = + findExistingBranchNode(group.modeType, "preview") || + (() => { + const nodeId = createCanvasNode( + buildVideoWorkflowCanvasNode("preview", previewPosition), + { + connectFromSelection: false, + selectNewNode: false, + } + ); + return useCanvasStore.getState().nodes.find((node) => node.id === nodeId) || null; + })(); + const saveNode = + findExistingBranchNode(group.modeType, "local-save") || + (() => { + const nodeId = createCanvasNode( + buildVideoWorkflowCanvasNode("local-save", savePosition), + { + connectFromSelection: false, + selectNewNode: false, + } + ); + return useCanvasStore.getState().nodes.find((node) => node.id === nodeId) || null; + })(); + + const firstAsset = group.assets[0] || null; + const previewNodeId = previewNode?.id || null; + const saveNodeId = saveNode?.id || null; + + if (previewNodeId) { + patchWorkflowNode(previewNodeId, { + title: `${group.label}预览`, + description: `检查 ${group.label} 结果并决定是否继续加工或保存。`, + status: "completed", + summary: `已整理 ${group.assets.length} 个 ${group.label} 结果,可直接预览。`, + metadata: { + sourceWorkflowNodeId: sourceNodeId, + sourceAgentProjectId: selectedWorkflowLinkedAgentProject.id || agentProjectId, + agentResultModeType: group.modeType, + agentResultGroupLabel: group.label, + agentBranchRole: "preview", + syncedAgentAssets: group.assets.map((asset) => ({ + url: asset.url, + title: asset.title || "", + })), + previewMediaUrl: firstAsset?.url || "", + previewMediaKind: "image", + previewMediaTitle: firstAsset?.title || "", + sourcePrompt: selectedWorkflowPrompt, + lastExecutedAt: nowIso, + }, + }); + addEdge({ + source: sourceNodeId, + target: previewNodeId, + type: "default", + }); + touchedNodeIds.push(previewNodeId); + } + + if (saveNodeId) { + patchWorkflowNode(saveNodeId, { + title: `${group.label}保存`, + description: `把 ${group.label} 结果直接整理并下载到本地。`, + status: "completed", + summary: `已整理 ${group.assets.length} 个 ${group.label} 结果,可直接打包下载。`, + metadata: { + sourceWorkflowNodeId: sourceNodeId, + sourceAgentProjectId: selectedWorkflowLinkedAgentProject.id || agentProjectId, + agentResultModeType: group.modeType, + agentResultGroupLabel: group.label, + agentBranchRole: "local-save", + syncedAgentAssets: group.assets.map((asset) => ({ + url: asset.url, + title: asset.title || "", + })), + pendingAssetCount: group.assets.length, + sourcePrompt: selectedWorkflowPrompt, + lastExecutedAt: nowIso, + }, + }); + if (previewNodeId) { + addEdge({ + source: previewNodeId, + target: saveNodeId, + type: "default", + }); + } else { + addEdge({ + source: sourceNodeId, + target: saveNodeId, + type: "default", + }); + } + touchedNodeIds.push(saveNodeId); + } + }); + + patchWorkflowNode(sourceNodeId, { + status: "completed", + summary: `已按 ${selectedWorkflowAgentResultAssets.length} 组 Agent 结果整理下游分支。`, + metadata: { + lastAgentBranchSyncAt: nowIso, + lastExecutedAt: nowIso, + branchResultModeCount: selectedWorkflowAgentResultAssets.length, + }, + }); + + if (touchedNodeIds.length > 0) { + selectNodes(Array.from(new Set(touchedNodeIds))); + } + toast.success(`已展开 ${selectedWorkflowAgentResultAssets.length} 组结果分支`); + } catch (error) { + const message = error instanceof Error ? error.message : "展开 Agent 结果分支失败"; + patchWorkflowNode(sourceNodeId, { + status: "failed", + summary: message, + metadata: { + lastExecutedAt: nowIso, + lastError: message, + }, + }); + toast.error(message); + } finally { + setActiveWorkflowExecutionTaskKey((current) => (current === taskKey ? null : current)); + } + }, [ + addEdge, + agentProjectId, + createCanvasNode, + nodes, + patchWorkflowNode, + selectNodes, + selectedVideoWorkflowNode, + selectedVideoWorkflowType, + selectedWorkflowAgentResultAssets, + selectedWorkflowLinkedAgentProject.id, + selectedWorkflowPrompt, + ]); + + const handleAddTextNode = useCallback(() => { + if (isVideoMode) { + handleAddWorkflowNode("text-node"); + return; + } + + createCanvasNode({ + type: "text", position: { x: 100 + Math.random() * 200, y: 100 + Math.random() * 200 }, size: { width: 200, height: 100 }, - data: { content: '双击编辑文本' }, - connections: [], - }); - }; - - // 添加图片节点 - const handleAddImageNode = () => { - addNode({ - type: 'image', - position: { x: 100 + Math.random() * 200, y: 100 + Math.random() * 200 }, - size: { width: 300, height: 300 }, - data: { - src: '', - status: 'pending', - title: '新图片', - prompt: '', + data: { + content: "双击编辑文本", }, connections: [], }); - }; + }, [createCanvasNode, handleAddWorkflowNode, isVideoMode]); + + // 添加图片节点 + const handleAddImageNode = useCallback(() => { + if (isVideoMode) { + handleAddWorkflowNode("input-image"); + return; + } + + createCanvasNode({ + type: "image", + position: { x: 100 + Math.random() * 200, y: 100 + Math.random() * 200 }, + size: { width: 300, height: 300 }, + data: { + src: "", + status: "pending", + title: "新图片", + prompt: "", + }, + connections: [], + }); + }, [createCanvasNode, handleAddWorkflowNode, isVideoMode]); + + const handleAddVideoNode = useCallback(() => { + if (isVideoMode) { + handleAddWorkflowNode("video-input"); + return; + } + + createCanvasNode({ + type: "video", + position: { x: 100 + Math.random() * 200, y: 100 + Math.random() * 200 }, + size: { width: 320, height: 220 }, + data: { + src: "", + status: "pending", + prompt: "", + }, + connections: [], + }); + }, [createCanvasNode, handleAddWorkflowNode, isVideoMode]); + + const handleRunStoryboardBatch = useCallback(async () => { + if (selectedVideoWorkflowType !== "storyboard-node" || !selectedVideoWorkflowNode) { + return; + } + + const nodeId = selectedVideoWorkflowNode.id; + const taskKey = `${nodeId}:batch`; + const nowIso = new Date().toISOString(); + const imageMedia = selectedWorkflowMedia.filter((item) => item.kind === "image"); + const primaryImage = imageMedia[0] || null; + const shots = + selectedWorkflowStoryboardShots.length > 0 + ? selectedWorkflowStoryboardShots + : selectedWorkflowPrompt.trim() + ? buildStoryboardShots(selectedWorkflowPrompt, { + imageCount: selectedWorkflowInputs.imageCount, + videoCount: selectedWorkflowInputs.videoCount, + }) + : []; + + if (selectedStoryboardBatchTargets.length === 0) { + toast.error("当前分镜节点右侧还没有连接生成图片或生成视频节点。"); + return; + } + + if (shots.length === 0) { + toast.error("请先整理分镜,或至少接入一段上游脚本再执行批量生成。"); + return; + } + + setActiveWorkflowExecutionTaskKey(taskKey); + + try { + patchWorkflowNode(nodeId, { + status: "generating", + summary: `正在把 ${shots.length} 个镜头派发到 ${selectedStoryboardBatchTargets.length} 个下游节点...`, + metadata: { + sourcePrompt: selectedWorkflowPrompt, + storyboardShots: shots, + batchShotCount: shots.length, + batchTargetCount: selectedStoryboardBatchTargets.length, + lastExecutedAt: nowIso, + lastBatchExecutedAt: nowIso, + }, + }); + + if (selectedStoryboardChartTargets.length > 0) { + syncDirectStoryboardChartNodes(nodeId, shots, selectedWorkflowPrompt); + } + + const allCreatedNodeIds: string[] = []; + let totalSuccessCount = 0; + let totalFailureCount = 0; + + for (const target of selectedStoryboardBatchTargets) { + const targetNodeId = target.node.id; + const targetType = target.templateType; + const targetLabel = targetType === "gen-video" ? "视频镜头" : "关键帧"; + + patchWorkflowNode(targetNodeId, { + status: "generating", + summary: `正在批量生成 ${shots.length} 个${targetLabel}...`, + metadata: { + sourcePrompt: selectedWorkflowPrompt, + storyboardShots: shots, + batchMode: targetType, + batchShotCount: shots.length, + lastExecutedAt: nowIso, + storyboardSourceNodeId: nodeId, + }, + }); + + let successCount = 0; + let failureCount = 0; + let lastMedia: WorkflowMediaReference | null = null; + const failureMessages: string[] = []; + + for (const shot of shots) { + const shotPrompt = buildStoryboardShotPrompt(selectedWorkflowPrompt, shot); + const outputIndex = successCount; + + try { + if (targetType === "gen-image") { + const result = await imageGenerationService.generateImage({ + prompt: + shotPrompt || + "基于当前分镜镜头生成一张适合后续视频工作流使用的关键帧。", + referenceImage: primaryImage?.url, + aspectRatio: guessCanvasAspectRatio(primaryImage?.nodeId || targetNodeId), + imageCount: 1, + }); + + const imageUrl = + result.data?.images?.[0]?.originalUrl || + result.data?.images?.[0]?.thumbnailUrl || + ""; + if (!result.success || !imageUrl) { + throw new Error(result.error || "图片生成失败"); + } + + const media: WorkflowMediaReference = { + nodeId: targetNodeId, + kind: "image", + url: imageUrl, + title: `${shot.title || `镜头 ${outputIndex + 1}`}-关键帧`, + prompt: shotPrompt, + source: "workflow-result", + }; + const offset = getWorkflowBatchOutputOffset(media.kind, outputIndex); + const createdNodeId = createWorkflowOutputNode({ + sourceNodeId: targetNodeId, + anchorNodeId: targetNodeId, + edgeSourceNodeId: targetNodeId, + media, + title: media.title || "生成图片", + prompt: shotPrompt, + offsetX: offset.x, + offsetY: offset.y, + selectAfterCreate: false, + }); + + if (createdNodeId) { + allCreatedNodeIds.push(createdNodeId); + } + lastMedia = media; + successCount += 1; + continue; + } + + const mode = inferVideoGenerationModeFromMedia(imageMedia); + const result = await videoGenerationService.generateVideo({ + prompt: + shotPrompt || + "基于当前分镜镜头生成一段镜头感明确、动作自然的视频片段。", + mode, + images: imageMedia.map((item) => item.url).slice(0, 4), + ratio: guessVideoRatio(primaryImage?.nodeId || targetNodeId), + duration: 5, + returnLastFrame: false, + }); + + const videoUrl = String(result.data?.url || "").trim(); + if (!result.success || !videoUrl) { + throw new Error(result.error || "视频生成失败"); + } + + const media: WorkflowMediaReference = { + nodeId: targetNodeId, + kind: "video", + url: videoUrl, + title: `${shot.title || `镜头 ${outputIndex + 1}`}-视频`, + prompt: shotPrompt, + source: "workflow-result", + }; + const offset = getWorkflowBatchOutputOffset(media.kind, outputIndex); + const createdNodeId = createWorkflowOutputNode({ + sourceNodeId: targetNodeId, + anchorNodeId: targetNodeId, + edgeSourceNodeId: targetNodeId, + media, + title: media.title || "生成视频", + prompt: shotPrompt, + offsetX: offset.x, + offsetY: offset.y, + selectAfterCreate: false, + }); + + if (createdNodeId) { + allCreatedNodeIds.push(createdNodeId); + } + lastMedia = media; + successCount += 1; + } catch (error) { + failureCount += 1; + failureMessages.push( + `${shot.title || `镜头 ${failureCount}`}: ${ + error instanceof Error ? error.message : `${targetLabel}生成失败` + }` + ); + } + } + + totalSuccessCount += successCount; + totalFailureCount += failureCount; + + if (lastMedia) { + syncDirectPreviewNodes( + targetNodeId, + lastMedia, + lastMedia.prompt || selectedWorkflowPrompt + ); + } + + patchWorkflowNode(targetNodeId, { + status: successCount > 0 ? "completed" : "failed", + summary: + successCount > 0 + ? failureCount > 0 + ? `已完成 ${successCount}/${shots.length} 个${targetLabel},其余 ${failureCount} 个失败。` + : `已批量生成 ${successCount} 个${targetLabel}。` + : `批量${targetLabel}生成失败,请检查提示词和上游素材。`, + metadata: { + sourcePrompt: selectedWorkflowPrompt, + storyboardShots: shots, + batchMode: targetType, + batchShotCount: shots.length, + batchResultCount: successCount, + batchFailedCount: failureCount, + batchErrors: failureMessages.slice(0, 4), + resultMediaUrl: lastMedia?.url || "", + resultMediaKind: lastMedia?.kind || "", + resultMediaTitle: lastMedia?.title || "", + lastExecutedAt: nowIso, + lastBatchExecutedAt: nowIso, + storyboardSourceNodeId: nodeId, + }, + }); + } + + if (allCreatedNodeIds.length > 0) { + selectNodes(allCreatedNodeIds); + } + + patchWorkflowNode(nodeId, { + status: totalSuccessCount > 0 ? "completed" : "failed", + summary: + totalSuccessCount > 0 + ? totalFailureCount > 0 + ? `已派发 ${shots.length} 个镜头,生成 ${totalSuccessCount} 个结果,${totalFailureCount} 个失败。` + : `已把 ${shots.length} 个镜头批量派发到下游节点,共生成 ${totalSuccessCount} 个结果。` + : "分镜已派发,但下游生成全部失败。", + metadata: { + sourcePrompt: selectedWorkflowPrompt, + storyboardShots: shots, + batchShotCount: shots.length, + batchTargetCount: selectedStoryboardBatchTargets.length, + batchResultCount: totalSuccessCount, + batchFailedCount: totalFailureCount, + lastExecutedAt: nowIso, + lastBatchExecutedAt: nowIso, + }, + }); + + if (totalSuccessCount > 0) { + toast.success( + totalFailureCount > 0 + ? `已生成 ${totalSuccessCount} 个结果,${totalFailureCount} 个失败` + : `已生成 ${totalSuccessCount} 个分镜结果` + ); + } else { + toast.error("分镜已派发,但下游生成全部失败"); + } + } catch (error) { + const message = error instanceof Error ? error.message : "分镜批量执行失败"; + patchWorkflowNode(nodeId, { + status: "failed", + summary: message, + metadata: { + lastExecutedAt: nowIso, + lastError: message, + }, + }); + toast.error(message); + } finally { + setActiveWorkflowExecutionTaskKey((current) => + current === taskKey ? null : current + ); + } + }, [ + buildStoryboardShotPrompt, + buildStoryboardShots, + createWorkflowOutputNode, + getWorkflowBatchOutputOffset, + guessCanvasAspectRatio, + guessVideoRatio, + imageGenerationService, + patchWorkflowNode, + selectNodes, + selectedStoryboardBatchTargets, + selectedStoryboardChartTargets.length, + selectedVideoWorkflowNode, + selectedVideoWorkflowType, + selectedWorkflowInputs.imageCount, + selectedWorkflowInputs.videoCount, + selectedWorkflowMedia, + selectedWorkflowPrompt, + selectedWorkflowStoryboardShots, + syncDirectPreviewNodes, + syncDirectStoryboardChartNodes, + videoGenerationService, + ]); + + const handleRunSelectedWorkflowNode = useCallback(async () => { + if ( + !selectedVideoWorkflowNode || + !selectedVideoWorkflowType || + !selectedWorkflowIsActionable + ) { + return; + } + + const nodeId = selectedVideoWorkflowNode.id; + const taskKey = `${nodeId}:primary`; + const imageMedia = selectedWorkflowMedia.filter((item) => item.kind === "image"); + const videoMedia = selectedWorkflowMedia.filter((item) => item.kind === "video"); + const primaryImage = imageMedia[0] || null; + const nowIso = new Date().toISOString(); + setActiveWorkflowExecutionTaskKey(taskKey); + + try { + if (selectedVideoWorkflowType === "storyboard-node") { + if (!selectedWorkflowPrompt.trim()) { + throw new Error("请先在上游接入脚本、画面描述或参考素材,再整理分镜。"); + } + + patchWorkflowNode(nodeId, { + status: "generating", + summary: "正在整理镜头草案...", + metadata: { + sourcePrompt: selectedWorkflowPrompt, + lastExecutedAt: nowIso, + }, + }); + + const shots = buildStoryboardShots(selectedWorkflowPrompt, { + imageCount: selectedWorkflowInputs.imageCount, + videoCount: selectedWorkflowInputs.videoCount, + }); + + patchWorkflowNode(nodeId, { + status: "completed", + summary: `已整理 ${shots.length} 个镜头草案,可继续连接生成图片或生成视频。`, + metadata: { + sourcePrompt: selectedWorkflowPrompt, + storyboardShots: shots, + batchShotCount: shots.length, + lastExecutedAt: nowIso, + }, + }); + syncDirectStoryboardChartNodes(nodeId, shots, selectedWorkflowPrompt); + toast.success(`已整理 ${shots.length} 个分镜草案`); + return; + } + + if (selectedVideoWorkflowType === "video-analyze") { + if (!selectedWorkflowPrompt.trim() && imageMedia.length === 0 && videoMedia.length === 0) { + throw new Error("请先接入参考视频、封面图或脚本说明,再执行视频分析。"); + } + + patchWorkflowNode(nodeId, { + status: "generating", + summary: "正在分析视频节奏和镜头结构...", + metadata: { + sourcePrompt: selectedWorkflowPrompt, + lastExecutedAt: nowIso, + }, + }); + + const result = await workflowAnalysisService.analyze({ + mode: "video-analysis", + prompt: selectedWorkflowPrompt, + imageUrls: imageMedia.map((item) => item.url).slice(0, 4), + videoUrls: videoMedia.map((item) => item.url).slice(0, 4), + nodeTitle: + (selectedVideoWorkflowNode.data as { title?: string } | undefined)?.title || + "视频分析", + }); + if (!result.success) { + throw new Error(result.error || "视频分析失败"); + } + + const highlights = + result.data?.highlights && result.data.highlights.length > 0 + ? result.data.highlights + : [ + `当前串联了 ${selectedWorkflowInputs.videoCount} 个视频素材和 ${selectedWorkflowInputs.imageCount} 个参考图。`, + selectedWorkflowPrompt.trim() + ? `上游创作意图:${selectedWorkflowPrompt.trim().slice(0, 80)}${selectedWorkflowPrompt.trim().length > 80 ? "..." : ""}` + : "上游暂未明确脚本,可先补一段镜头目标或情绪描述。", + ]; + const shotIdeas = + result.data?.shotIdeas && result.data.shotIdeas.length > 0 + ? result.data.shotIdeas + : buildStoryboardShots(selectedWorkflowPrompt, { + imageCount: selectedWorkflowInputs.imageCount, + videoCount: selectedWorkflowInputs.videoCount, + }); + + patchWorkflowNode(nodeId, { + status: "completed", + summary: + result.data?.summary || + "已整理一版结构化视频分析结果,可继续连接分镜节点或关键帧生成。", + metadata: { + analysisHighlights: highlights, + storyboardShots: shotIdeas, + batchShotCount: shotIdeas.length, + visualMotifs: result.data?.visualMotifs || [], + recommendedNextSteps: result.data?.recommendedNextSteps || [], + sourcePrompt: selectedWorkflowPrompt, + analysisModel: result.data?.model || "", + lastExecutedAt: nowIso, + }, + }); + toast.success("视频分析节点已生成结构化结果"); + return; + } + + if (selectedVideoWorkflowType === "extract-characters-scenes") { + if (!selectedWorkflowPrompt.trim() && imageMedia.length === 0) { + throw new Error("请先接入小说、脚本或参考图,再提取角色与场景。"); + } + + patchWorkflowNode(nodeId, { + status: "generating", + summary: "正在提取角色、场景与关系线索...", + metadata: { + sourcePrompt: selectedWorkflowPrompt, + lastExecutedAt: nowIso, + }, + }); + + const result = await workflowAnalysisService.analyze({ + mode: "character-scene-extraction", + prompt: selectedWorkflowPrompt, + imageUrls: imageMedia.map((item) => item.url).slice(0, 4), + nodeTitle: + (selectedVideoWorkflowNode.data as { title?: string } | undefined)?.title || + "提取角色场景", + }); + if (!result.success) { + throw new Error(result.error || "角色场景提取失败"); + } + + const characters = Array.isArray(result.data?.characters) ? result.data?.characters : []; + const scenes = Array.isArray(result.data?.scenes) ? result.data?.scenes : []; + + patchWorkflowNode(nodeId, { + status: "completed", + summary: + result.data?.summary || + `已提取 ${characters.length} 个角色和 ${scenes.length} 个场景线索。`, + metadata: { + sourcePrompt: selectedWorkflowPrompt, + characters, + scenes, + relationships: result.data?.relationships || [], + recommendedNextSteps: result.data?.recommendedNextSteps || [], + analysisModel: result.data?.model || "", + lastExecutedAt: nowIso, + }, + }); + toast.success( + `已提取 ${characters.length} 个角色和 ${scenes.length} 个场景` + ); + return; + } + + if (selectedVideoWorkflowType === "character-description") { + const descriptionText = buildCharacterDescriptionSummary( + selectedWorkflowStructuredData.characters, + selectedWorkflowPrompt + ); + if (!descriptionText.trim()) { + throw new Error("上游还没有可整理的角色线索,请先提取角色场景。"); + } + + patchWorkflowNode(nodeId, { + status: "completed", + summary: `已整理 ${Math.max( + selectedWorkflowStructuredData.characters.length, + 1 + )} 组角色描述,可继续固化角色资产。`, + metadata: { + sourcePrompt: descriptionText, + characters: selectedWorkflowStructuredData.characters, + recommendedNextSteps: selectedWorkflowStructuredData.recommendedNextSteps, + lastExecutedAt: nowIso, + }, + }); + toast.success("角色描述节点已整理完成"); + return; + } + + if (selectedVideoWorkflowType === "scene-description") { + const descriptionText = buildSceneDescriptionSummary( + selectedWorkflowStructuredData.scenes, + selectedWorkflowPrompt + ); + if (!descriptionText.trim()) { + throw new Error("上游还没有可整理的场景线索,请先提取角色场景。"); + } + + patchWorkflowNode(nodeId, { + status: "completed", + summary: `已整理 ${Math.max( + selectedWorkflowStructuredData.scenes.length, + 1 + )} 组场景描述,可继续固化场景资产。`, + metadata: { + sourcePrompt: descriptionText, + scenes: selectedWorkflowStructuredData.scenes, + recommendedNextSteps: selectedWorkflowStructuredData.recommendedNextSteps, + lastExecutedAt: nowIso, + }, + }); + toast.success("场景描述节点已整理完成"); + return; + } + + if (selectedVideoWorkflowType === "create-character") { + const characterAssets = + selectedWorkflowStructuredData.characterAssets.length > 0 + ? selectedWorkflowStructuredData.characterAssets + : buildCharacterAssets( + selectedWorkflowStructuredData.characters, + selectedWorkflowPrompt + ); + if (characterAssets.length === 0) { + throw new Error("上游还没有可固化的角色信息,请先提取角色场景。"); + } + + patchWorkflowNode(nodeId, { + status: "completed", + summary: `已固化 ${characterAssets.length} 个角色资产,可继续生成角色图或角色视频。`, + metadata: { + sourcePrompt: buildWorkflowTextBlock([ + selectedWorkflowPrompt, + characterAssets.map((item) => item.prompt).join("\n"), + ]), + characters: selectedWorkflowStructuredData.characters, + characterAssets, + recommendedNextSteps: ["连接生成角色图片", "连接生成角色视频"], + lastExecutedAt: nowIso, + }, + }); + toast.success(`已固化 ${characterAssets.length} 个角色资产`); + return; + } + + if (selectedVideoWorkflowType === "create-scene") { + const sceneAssets = + selectedWorkflowStructuredData.sceneAssets.length > 0 + ? selectedWorkflowStructuredData.sceneAssets + : buildSceneAssets( + selectedWorkflowStructuredData.scenes, + selectedWorkflowPrompt + ); + if (sceneAssets.length === 0) { + throw new Error("上游还没有可固化的场景信息,请先提取角色场景。"); + } + + patchWorkflowNode(nodeId, { + status: "completed", + summary: `已固化 ${sceneAssets.length} 个场景资产,可继续生成场景图或场景视频。`, + metadata: { + sourcePrompt: buildWorkflowTextBlock([ + selectedWorkflowPrompt, + sceneAssets.map((item) => item.prompt).join("\n"), + ]), + scenes: selectedWorkflowStructuredData.scenes, + sceneAssets, + recommendedNextSteps: ["连接生成场景图片", "连接生成场景视频"], + lastExecutedAt: nowIso, + }, + }); + toast.success(`已固化 ${sceneAssets.length} 个场景资产`); + return; + } + + if (selectedVideoWorkflowType === "storyboard-chart-node") { + const chartShots = + selectedWorkflowStoryboardShots.length > 0 + ? selectedWorkflowStoryboardShots.map((shot) => ({ + title: shot.title, + description: shot.description, + })) + : buildStoryboardShots(selectedWorkflowPrompt, { + imageCount: selectedWorkflowInputs.imageCount, + videoCount: selectedWorkflowInputs.videoCount, + }); + + if ( + chartShots.length === 0 && + !selectedWorkflowPrompt.trim() && + imageMedia.length === 0 && + videoMedia.length === 0 + ) { + throw new Error("请先接入脚本、分镜或参考素材,再生成分镜表。"); + } + + const chart = buildStoryboardChartRows(chartShots, selectedWorkflowPrompt); + + patchWorkflowNode(nodeId, { + status: "completed", + summary: `已整理 ${chart.rows.length} 行分镜视表,可继续连接预览节点检查镜头节奏。`, + metadata: { + sourcePrompt: selectedWorkflowPrompt, + storyboardShots: chartShots, + batchShotCount: chartShots.length, + tableColumns: chart.columns, + tableRows: chart.rows, + previewMediaUrl: primaryImage?.url || "", + previewMediaKind: primaryImage?.kind || "image", + previewMediaTitle: primaryImage?.title || "分镜参考", + lastExecutedAt: nowIso, + }, + }); + toast.success(`已整理 ${chart.rows.length} 行分镜视表`); + return; + } + + if (selectedVideoWorkflowType === "table-editor-node") { + const tableState = buildWorkflowTableState({ + promptText: selectedWorkflowPrompt, + shots: selectedWorkflowStoryboardShots.map((shot) => ({ + title: shot.title, + description: shot.description, + })), + structuredData: selectedWorkflowStructuredData, + }); + + if (tableState.rows.length === 0) { + throw new Error("上游还没有可整理成表格的内容,请先接入脚本、角色、场景或分镜。"); + } + + patchWorkflowNode(nodeId, { + status: "completed", + summary: tableState.summary, + metadata: { + sourcePrompt: selectedWorkflowPrompt, + tableColumns: tableState.columns, + tableRows: tableState.rows, + lastExecutedAt: nowIso, + }, + }); + toast.success(`已整理 ${tableState.rows.length} 行结构化表格`); + return; + } + + if (selectedVideoWorkflowType === "image-compare") { + const compareItems = buildWorkflowCompareItems(selectedWorkflowMedia); + if (compareItems.length < 2) { + throw new Error("请至少接入两个上游图片或视频结果,再整理对比节点。"); + } + + patchWorkflowNode(nodeId, { + status: "completed", + summary: `已整理 ${compareItems.length} 个结果用于并排对比。`, + metadata: { + sourcePrompt: selectedWorkflowPrompt, + compareItems, + previewMediaUrl: compareItems[0]?.url || "", + previewMediaKind: compareItems[0]?.kind || "image", + previewMediaTitle: compareItems[0]?.title || "对比基准", + lastExecutedAt: nowIso, + }, + }); + toast.success(`已整理 ${compareItems.length} 个结果用于对比`); + return; + } + + if (selectedVideoWorkflowType === "jimeng-super-resolution") { + if (!primaryImage?.url) { + throw new Error("请先接入一张图片,再执行超分增强。"); + } + + patchWorkflowNode(nodeId, { + status: "generating", + summary: "正在生成高清增强版本...", + metadata: { + sourcePrompt: selectedWorkflowPrompt, + sourceMediaUrl: primaryImage.url, + lastExecutedAt: nowIso, + }, + }); + + const result = await imageGenerationService.enhanceImage(primaryImage.url); + const enhancedUrl = String(result.data?.url || "").trim(); + if (!result.success || !enhancedUrl) { + throw new Error(result.error || "超分增强失败"); + } + + const promptText = buildWorkflowTextBlock([ + selectedWorkflowPrompt, + primaryImage.prompt, + "高清增强 / 超分修复", + ]); + const media: WorkflowMediaReference = { + nodeId, + kind: "image", + url: enhancedUrl, + title: `${String(primaryImage.title || "高清增强").trim() || "高清增强"}-结果`, + prompt: promptText, + source: "workflow-result", + }; + + patchWorkflowNode(nodeId, { + status: "completed", + summary: "已生成一版高清增强结果,可继续预览或下载。", + metadata: { + sourcePrompt: promptText, + resultMediaUrl: media.url, + resultMediaKind: media.kind, + resultMediaTitle: media.title, + previewMediaUrl: media.url, + previewMediaKind: media.kind, + previewMediaTitle: media.title, + sourceMediaUrl: primaryImage.url, + lastExecutedAt: nowIso, + }, + }); + createWorkflowOutputNode({ + sourceNodeId: nodeId, + media, + title: media.title || "高清增强", + prompt: promptText, + }); + syncDirectPreviewNodes(nodeId, media, promptText); + toast.success("超分增强节点已产出新结果"); + return; + } + + if (selectedVideoWorkflowType === "inpaint-crop") { + if (!primaryImage?.url) { + throw new Error("请先接入一张图片,再执行局部裁剪。"); + } + + const cropRect = buildWorkflowDefaultCropRect(selectedWorkflowPrompt); + patchWorkflowNode(nodeId, { + status: "generating", + summary: "正在裁出局部重绘工作区...", + metadata: { + sourcePrompt: selectedWorkflowPrompt, + cropRect, + sourceMediaUrl: primaryImage.url, + lastExecutedAt: nowIso, + }, + }); + + const result = await imageGenerationService.boxCutout({ + imageUrl: primaryImage.url, + cropRect, + paddingRatio: 0.08, + sourceNodeId: primaryImage.nodeId, + }); + const croppedUrl = String(result.data?.url || "").trim(); + if (!result.success || !croppedUrl) { + throw new Error(result.error || "局部裁剪失败"); + } + + const promptText = buildWorkflowTextBlock([ + selectedWorkflowPrompt, + "局部裁剪 / 重绘工作区", + ]); + const media: WorkflowMediaReference = { + nodeId, + kind: "image", + url: croppedUrl, + title: `${String(primaryImage.title || "局部裁剪").trim() || "局部裁剪"}-结果`, + prompt: promptText, + source: "workflow-result", + }; + + patchWorkflowNode(nodeId, { + status: "completed", + summary: "已裁出一块适合继续局部重绘的工作区域。", + metadata: { + sourcePrompt: promptText, + cropRect, + cropRectApplied: result.data?.cropRectApplied, + paddedCropRectApplied: result.data?.paddedCropRectApplied, + resultMediaUrl: media.url, + resultMediaKind: media.kind, + resultMediaTitle: media.title, + previewMediaUrl: media.url, + previewMediaKind: media.kind, + previewMediaTitle: media.title, + lastExecutedAt: nowIso, + }, + }); + createWorkflowOutputNode({ + sourceNodeId: nodeId, + media, + title: media.title || "局部裁剪", + prompt: promptText, + }); + syncDirectPreviewNodes(nodeId, media, promptText); + toast.success("局部裁剪节点已产出新结果"); + return; + } + + if (selectedVideoWorkflowType === "inpaint-stitch") { + if (!primaryImage?.url) { + throw new Error("请先接入一张图片,再执行拼接补画。"); + } + + const extendScales = inferWorkflowExtendScales(selectedWorkflowPrompt); + const promptText = buildWorkflowTextBlock([ + selectedWorkflowPrompt, + "拼接补画 / 背景延展", + ]); + + patchWorkflowNode(nodeId, { + status: "generating", + summary: "正在补边扩图,准备继续拼接...", + metadata: { + sourcePrompt: promptText, + extendScales, + sourceMediaUrl: primaryImage.url, + lastExecutedAt: nowIso, + }, + }); + + const result = await imageGenerationService.extendImage(primaryImage.url, { + prompt: promptText, + xScale: extendScales.xScale, + yScale: extendScales.yScale, + }); + const extendedUrl = String(result.data?.url || "").trim(); + if (!result.success || !extendedUrl) { + throw new Error(result.error || "拼接补画失败"); + } + + const media: WorkflowMediaReference = { + nodeId, + kind: "image", + url: extendedUrl, + title: `${String(primaryImage.title || "拼接补画").trim() || "拼接补画"}-结果`, + prompt: promptText, + source: "workflow-result", + }; + + patchWorkflowNode(nodeId, { + status: "completed", + summary: "已生成一版补边扩图结果,可继续预览或保存。", + metadata: { + sourcePrompt: promptText, + extendScales, + resultMediaUrl: media.url, + resultMediaKind: media.kind, + resultMediaTitle: media.title, + previewMediaUrl: media.url, + previewMediaKind: media.kind, + previewMediaTitle: media.title, + lastExecutedAt: nowIso, + }, + }); + createWorkflowOutputNode({ + sourceNodeId: nodeId, + media, + title: media.title || "拼接补画", + prompt: promptText, + }); + syncDirectPreviewNodes(nodeId, media, promptText); + toast.success("拼接补画节点已产出新结果"); + return; + } + + if (selectedVideoWorkflowType === "professional-camera") { + const cameraPreset = buildWorkflowCameraPreset(selectedWorkflowPrompt); + const cameraRows = [ + { field: "水平角度", value: `${cameraPreset.horizontalAngle}°` }, + { field: "垂直角度", value: `${cameraPreset.verticalAngle}°` }, + { field: "镜头缩放", value: `${cameraPreset.zoom}` }, + { field: "镜头备注", value: cameraPreset.notes.join(" / ") }, + ]; + + if (!primaryImage?.url) { + patchWorkflowNode(nodeId, { + status: "completed", + summary: "已整理一版专业机位参数,可继续接入参考图后生成测试图。", + metadata: { + sourcePrompt: selectedWorkflowPrompt, + analysisHighlights: cameraPreset.notes, + tableColumns: [ + { key: "field", label: "参数" }, + { key: "value", label: "设定" }, + ], + tableRows: cameraRows, + lastExecutedAt: nowIso, + }, + }); + toast.success("已整理专业机位参数"); + return; + } + + patchWorkflowNode(nodeId, { + status: "generating", + summary: "正在生成专业机位测试图...", + metadata: { + sourcePrompt: selectedWorkflowPrompt, + tableColumns: [ + { key: "field", label: "参数" }, + { key: "value", label: "设定" }, + ], + tableRows: cameraRows, + lastExecutedAt: nowIso, + }, + }); + + const result = await imageGenerationService.editAngle({ + imageUrl: primaryImage.url, + horizontalAngle: cameraPreset.horizontalAngle, + verticalAngle: cameraPreset.verticalAngle, + zoom: cameraPreset.zoom, + }); + const angleUrl = String(result.data?.url || "").trim(); + if (!result.success || !angleUrl) { + throw new Error(result.error || "专业机位测试失败"); + } + + const promptText = buildWorkflowTextBlock([ + selectedWorkflowPrompt, + result.data?.prompt, + cameraPreset.notes.join(" / "), + ]); + const media: WorkflowMediaReference = { + nodeId, + kind: "image", + url: angleUrl, + title: `${String(primaryImage.title || "专业机位").trim() || "专业机位"}-测试图`, + prompt: promptText, + source: "workflow-result", + }; + + patchWorkflowNode(nodeId, { + status: "completed", + summary: "已生成一版专业机位测试图,可继续生图或生视频。", + metadata: { + sourcePrompt: promptText, + analysisHighlights: cameraPreset.notes, + tableColumns: [ + { key: "field", label: "参数" }, + { key: "value", label: "设定" }, + ], + tableRows: cameraRows, + resultMediaUrl: media.url, + resultMediaKind: media.kind, + resultMediaTitle: media.title, + previewMediaUrl: media.url, + previewMediaKind: media.kind, + previewMediaTitle: media.title, + lastExecutedAt: nowIso, + }, + }); + createWorkflowOutputNode({ + sourceNodeId: nodeId, + media, + title: media.title || "专业机位测试图", + prompt: promptText, + }); + syncDirectPreviewNodes(nodeId, media, promptText); + toast.success("专业机位节点已产出新结果"); + return; + } + + if ( + selectedVideoWorkflowType === "camera-movement" || + selectedVideoWorkflowType === "motion-control" + ) { + const directive = buildWorkflowMovementDirective(selectedWorkflowPrompt); + const basePrompt = buildWorkflowTextBlock([ + selectedWorkflowPrompt, + directive.cameraMove, + directive.motionCue, + directive.rhythm, + selectedVideoWorkflowType === "camera-movement" + ? "强调镜头运动的电影感和空间推进。" + : "强调动作连续性和主体运动控制。", + ]); + const mode = inferVideoGenerationModeFromMedia(imageMedia); + + patchWorkflowNode(nodeId, { + status: "generating", + summary: + selectedVideoWorkflowType === "camera-movement" + ? "正在生成运镜测试片段..." + : "正在生成动作控制片段...", + metadata: { + sourcePrompt: basePrompt, + analysisHighlights: [ + directive.cameraMove, + directive.motionCue, + directive.rhythm, + ], + tableColumns: [ + { key: "field", label: "控制维度" }, + { key: "value", label: "说明" }, + ], + tableRows: [ + { field: "镜头运动", value: directive.cameraMove }, + { field: "主体动作", value: directive.motionCue }, + { field: "节奏", value: directive.rhythm }, + ], + videoGenerationMode: mode, + lastExecutedAt: nowIso, + }, + }); + + const result = await videoGenerationService.generateVideo({ + prompt: basePrompt, + mode, + images: imageMedia.map((item) => item.url).slice(0, 4), + ratio: guessVideoRatio(primaryImage?.nodeId || nodeId), + duration: 5, + cameraFixed: directive.cameraFixed, + returnLastFrame: false, + }); + const videoUrl = String(result.data?.url || "").trim(); + if (!result.success || !videoUrl) { + throw new Error( + result.error || + (selectedVideoWorkflowType === "camera-movement" + ? "运镜测试失败" + : "动作控制失败") + ); + } + + const media: WorkflowMediaReference = { + nodeId, + kind: "video", + url: videoUrl, + title: + selectedVideoWorkflowType === "camera-movement" + ? "运镜测试-结果" + : "动作控制-结果", + prompt: basePrompt, + source: "workflow-result", + }; + + patchWorkflowNode(nodeId, { + status: "completed", + summary: + selectedVideoWorkflowType === "camera-movement" + ? "已生成一段运镜测试片段。" + : "已生成一段动作控制片段。", + metadata: { + sourcePrompt: basePrompt, + analysisHighlights: [ + directive.cameraMove, + directive.motionCue, + directive.rhythm, + ], + tableColumns: [ + { key: "field", label: "控制维度" }, + { key: "value", label: "说明" }, + ], + tableRows: [ + { field: "镜头运动", value: directive.cameraMove }, + { field: "主体动作", value: directive.motionCue }, + { field: "节奏", value: directive.rhythm }, + ], + resultMediaUrl: media.url, + resultMediaKind: media.kind, + resultMediaTitle: media.title, + resultPosterUrl: String( + (result.data?.metadata as Record | undefined)?.lastFrameUrl || + (result.data?.metadata as Record | undefined)?.coverUrl || + "" + ).trim(), + videoGenerationMode: result.data?.mode || mode, + lastExecutedAt: nowIso, + }, + }); + createWorkflowOutputNode({ + sourceNodeId: nodeId, + media, + title: media.title || "控制片段", + prompt: basePrompt, + }); + syncDirectPreviewNodes(nodeId, media, basePrompt); + toast.success( + selectedVideoWorkflowType === "camera-movement" + ? "运镜测试节点已产出新结果" + : "动作控制节点已产出新结果" + ); + return; + } + + if (selectedVideoWorkflowType === "canvas-node") { + const boardState = buildWorkflowCanvasBoardState( + selectedWorkflowMedia, + selectedWorkflowPrompt + ); + if (boardState.compareItems.length === 0) { + throw new Error("请先接入图片、视频或结果节点,再整理画板。"); + } + + patchWorkflowNode(nodeId, { + status: "completed", + summary: boardState.summary, + metadata: { + sourcePrompt: selectedWorkflowPrompt, + compareItems: boardState.compareItems, + tableColumns: boardState.columns, + tableRows: boardState.rows, + analysisHighlights: boardState.highlights, + previewMediaUrl: boardState.compareItems[0]?.url || "", + previewMediaKind: boardState.compareItems[0]?.kind || "image", + previewMediaTitle: boardState.compareItems[0]?.title || "画板主图", + lastExecutedAt: nowIso, + }, + }); + toast.success("已整理画板节点"); + return; + } + + if (selectedVideoWorkflowType === "doodle-canvas") { + const doodleState = buildWorkflowDoodleInstructions(selectedWorkflowPrompt); + patchWorkflowNode(nodeId, { + status: "completed", + summary: doodleState.summary, + metadata: { + sourcePrompt: selectedWorkflowPrompt, + analysisHighlights: doodleState.highlights, + tableColumns: doodleState.columns, + tableRows: doodleState.rows, + previewMediaUrl: primaryImage?.url || "", + previewMediaKind: primaryImage?.kind || "image", + previewMediaTitle: primaryImage?.title || "涂鸦参考", + lastExecutedAt: nowIso, + }, + }); + toast.success("已整理涂鸦画板指令"); + return; + } + + if (selectedVideoWorkflowType === "gen-music") { + const musicPlan = buildWorkflowMusicPlan( + selectedWorkflowPrompt, + selectedWorkflowStoryboardShots.map((shot) => ({ + title: shot.title, + description: shot.description, + })) + ); + + patchWorkflowNode(nodeId, { + status: "completed", + summary: musicPlan.summary, + metadata: { + sourcePrompt: selectedWorkflowPrompt, + analysisHighlights: musicPlan.highlights, + tableColumns: musicPlan.columns, + tableRows: musicPlan.rows, + deliverables: ["配乐 cue sheet", "情绪与配器建议", "段落节奏建议"], + lastExecutedAt: nowIso, + }, + }); + toast.success("已整理一版配乐方案"); + return; + } + + if ( + selectedVideoWorkflowType === "rh-app" || + selectedVideoWorkflowType === "rh-comfy" + ) { + const handoffPlan = buildWorkflowHandoffPlan(selectedVideoWorkflowType, { + promptText: selectedWorkflowPrompt, + shots: selectedWorkflowStoryboardShots.map((shot) => ({ + title: shot.title, + description: shot.description, + })), + structuredData: selectedWorkflowStructuredData, + media: selectedWorkflowMedia, + }); + + patchWorkflowNode(nodeId, { + status: "completed", + summary: handoffPlan.summary, + metadata: { + sourcePrompt: selectedWorkflowPrompt, + analysisHighlights: handoffPlan.highlights, + deliverables: handoffPlan.deliverables, + tableColumns: handoffPlan.columns, + tableRows: handoffPlan.rows, + lastExecutedAt: nowIso, + }, + }); + toast.success( + selectedVideoWorkflowType === "rh-comfy" + ? "已整理 Comfy 工作流包" + : "已整理 RH 应用包" + ); + return; + } + + if ( + selectedVideoWorkflowType === "gen-image" || + selectedVideoWorkflowType === "generate-character-image" || + selectedVideoWorkflowType === "generate-scene-image" + ) { + const promptText = + selectedVideoWorkflowType === "generate-character-image" + ? resolvePreferredCharacterPrompt( + selectedWorkflowPrompt, + selectedWorkflowStructuredData + ) || + "根据角色资产生成一张适合后续视频工作流使用的角色关键帧。" + : selectedVideoWorkflowType === "generate-scene-image" + ? resolvePreferredScenePrompt( + selectedWorkflowPrompt, + selectedWorkflowStructuredData + ) || + "根据场景资产生成一张适合后续视频工作流使用的环境关键帧。" + : selectedWorkflowPrompt.trim() || + "基于上游脚本与素材生成一张适合视频工作流继续推进的关键帧。"; + + patchWorkflowNode(nodeId, { + status: "generating", + summary: + selectedVideoWorkflowType === "generate-character-image" + ? "正在生成角色关键帧..." + : selectedVideoWorkflowType === "generate-scene-image" + ? "正在生成场景关键帧..." + : "正在生成关键帧...", + metadata: { + sourcePrompt: promptText, + lastExecutedAt: nowIso, + }, + }); + + const result = await imageGenerationService.generateImage({ + prompt: promptText, + referenceImage: primaryImage?.url, + aspectRatio: guessCanvasAspectRatio(primaryImage?.nodeId), + imageCount: 1, + }); + + const imageUrl = + result.data?.images?.[0]?.originalUrl || result.data?.images?.[0]?.thumbnailUrl || ""; + if (!result.success || !imageUrl) { + throw new Error(result.error || "图片生成失败"); + } + + const media: WorkflowMediaReference = { + nodeId, + kind: "image", + url: imageUrl, + title: `${promptText.slice(0, 18) || "关键帧"}-结果图`, + prompt: promptText, + source: "workflow-result", + }; + + patchWorkflowNode(nodeId, { + status: "completed", + summary: + selectedVideoWorkflowType === "generate-character-image" + ? "已根据角色资产生成关键帧。" + : selectedVideoWorkflowType === "generate-scene-image" + ? "已根据场景资产生成关键帧。" + : primaryImage + ? "已根据上游脚本和参考图生成关键帧。" + : "已根据上游脚本生成关键帧。", + metadata: { + sourcePrompt: promptText, + resultMediaUrl: media.url, + resultMediaKind: media.kind, + resultMediaTitle: media.title, + lastExecutedAt: nowIso, + }, + }); + createWorkflowOutputNode({ + sourceNodeId: nodeId, + media, + title: media.title || "生成图片", + prompt: promptText, + }); + syncDirectPreviewNodes(nodeId, media, promptText); + toast.success("图片节点已产出新结果"); + return; + } + + if ( + selectedVideoWorkflowType === "gen-video" || + selectedVideoWorkflowType === "generate-character-video" || + selectedVideoWorkflowType === "generate-scene-video" + ) { + const promptText = + selectedVideoWorkflowType === "generate-character-video" + ? resolvePreferredCharacterPrompt( + selectedWorkflowPrompt, + selectedWorkflowStructuredData + ) || + "根据角色资产生成一段镜头感明确、动作自然的角色视频片段。" + : selectedVideoWorkflowType === "generate-scene-video" + ? resolvePreferredScenePrompt( + selectedWorkflowPrompt, + selectedWorkflowStructuredData + ) || + "根据场景资产生成一段环境氛围明确、转场自然的场景视频片段。" + : selectedWorkflowPrompt.trim() || + "基于上游脚本与参考图生成一段镜头感明确、动作自然的视频片段。"; + const mode = inferVideoGenerationModeFromMedia(imageMedia); + + patchWorkflowNode(nodeId, { + status: "generating", + summary: + selectedVideoWorkflowType === "generate-character-video" + ? "正在生成角色视频片段..." + : selectedVideoWorkflowType === "generate-scene-video" + ? "正在生成场景视频片段..." + : "正在生成视频片段...", + metadata: { + sourcePrompt: promptText, + lastExecutedAt: nowIso, + videoGenerationMode: mode, + }, + }); + + const result = await videoGenerationService.generateVideo({ + prompt: promptText, + mode, + images: imageMedia.map((item) => item.url).slice(0, 4), + ratio: guessVideoRatio(primaryImage?.nodeId || nodeId), + duration: 5, + returnLastFrame: false, + }); + + const videoUrl = String(result.data?.url || "").trim(); + if (!result.success || !videoUrl) { + throw new Error(result.error || "视频生成失败"); + } + + const media: WorkflowMediaReference = { + nodeId, + kind: "video", + url: videoUrl, + title: `${promptText.slice(0, 18) || "视频"}-结果`, + prompt: promptText, + source: "workflow-result", + }; + + patchWorkflowNode(nodeId, { + status: "completed", + summary: + selectedVideoWorkflowType === "generate-character-video" + ? "已根据角色资产生成角色视频。" + : selectedVideoWorkflowType === "generate-scene-video" + ? "已根据场景资产生成场景视频。" + : mode === "text-to-video" + ? "已根据上游脚本生成视频。" + : "已结合上游参考图生成视频。", + metadata: { + sourcePrompt: promptText, + resultMediaUrl: media.url, + resultMediaKind: media.kind, + resultMediaTitle: media.title, + resultModel: result.data?.modelDisplayName || "", + videoGenerationMode: result.data?.mode || mode, + resultPosterUrl: String( + (result.data?.metadata as Record | undefined)?.lastFrameUrl || + (result.data?.metadata as Record | undefined)?.coverUrl || + "" + ).trim(), + lastExecutedAt: nowIso, + }, + }); + createWorkflowOutputNode({ + sourceNodeId: nodeId, + media, + title: media.title || "生成视频", + prompt: promptText, + }); + syncDirectPreviewNodes(nodeId, media, promptText); + toast.success("视频节点已产出新结果"); + return; + } + + if (selectedVideoWorkflowType === "custom-agent") { + if (!selectedWorkflowPrompt.trim() && imageMedia.length === 0 && videoMedia.length === 0) { + throw new Error("请先给自定义代理节点提供脚本、参考图或视频上下文。"); + } + + patchWorkflowNode(nodeId, { + status: "generating", + summary: "正在生成代理执行计划...", + metadata: { + sourcePrompt: selectedWorkflowPrompt, + lastExecutedAt: nowIso, + }, + }); + + const result = await workflowAnalysisService.analyze({ + mode: "agent-plan", + prompt: selectedWorkflowPrompt, + imageUrls: imageMedia.map((item) => item.url).slice(0, 4), + videoUrls: videoMedia.map((item) => item.url).slice(0, 4), + nodeTitle: selectedVideoWorkflowData?.title || "自定义代理", + }); + if (!result.success) { + throw new Error(result.error || "代理计划生成失败"); + } + + patchWorkflowNode(nodeId, { + status: "completed", + summary: + result.data?.summary || + "已生成一版代理执行计划,可据此继续组织节点和连接关系。", + metadata: { + sourcePrompt: selectedWorkflowPrompt, + agentPlan: result.data?.agentPlan || [], + deliverables: result.data?.deliverables || [], + recommendedNodes: result.data?.recommendedNodes || [], + analysisModel: result.data?.model || "", + lastExecutedAt: nowIso, + }, + }); + toast.success("自定义代理节点已生成计划"); + return; + } + + if (selectedVideoWorkflowType === "preview") { + const fallbackPreviewMedia = (() => { + const metadata = ((selectedVideoWorkflowData?.metadata || {}) as Record) || {}; + const syncedAsset = Array.isArray(metadata.syncedAgentAssets) + ? ((metadata.syncedAgentAssets as Array>)[0] || null) + : null; + const previewUrl = String(metadata.previewMediaUrl || syncedAsset?.url || "").trim(); + if (!/^https?:\/\//i.test(previewUrl)) { + return null; + } + return { + nodeId, + kind: "image" as const, + url: previewUrl, + title: String(metadata.previewMediaTitle || syncedAsset?.title || "预览结果").trim(), + prompt: + selectedWorkflowPrompt || + String(metadata.sourcePrompt || "").trim(), + source: "workflow-preview" as const, + }; + })(); + const previewMedia = getBestWorkflowPreviewMedia(nodeId, workflowGraph) || fallbackPreviewMedia; + if (!previewMedia) { + throw new Error("预览节点上游还没有可预览的图片或视频。"); + } + + patchWorkflowNode(nodeId, { + status: "completed", + summary: `已刷新${previewMedia.kind === "video" ? "视频" : "图片"}预览,可继续检查结果。`, + metadata: { + previewMediaUrl: previewMedia.url, + previewMediaKind: previewMedia.kind, + previewMediaTitle: previewMedia.title || "", + sourcePrompt: + selectedWorkflowPrompt || previewMedia.prompt || "", + lastExecutedAt: nowIso, + }, + }); + toast.success("预览节点已刷新"); + return; + } + + if (selectedVideoWorkflowType === "local-save") { + const syncedAgentAssets: WorkflowMediaReference[] = Array.isArray( + ((selectedVideoWorkflowData?.metadata || {}) as Record)?.syncedAgentAssets + ) + ? ((((selectedVideoWorkflowData?.metadata || {}) as Record) + .syncedAgentAssets || []) as Array>).reduce< + WorkflowMediaReference[] + >((assets, item, index) => { + const url = String(item?.url || "").trim(); + if (!/^https?:\/\//i.test(url)) { + return assets; + } + assets.push({ + nodeId, + kind: "image", + url, + title: String(item?.title || `Agent 结果 ${index + 1}`).trim(), + prompt: selectedWorkflowPrompt, + source: "workflow-result", + }); + return assets; + }, []) + : []; + const assetsToDownload = + syncedAgentAssets.length > 0 ? syncedAgentAssets : selectedWorkflowMedia.slice(0, 24); + + if (assetsToDownload.length === 0) { + throw new Error("保存节点上游还没有可下载的图片或视频。"); + } + + patchWorkflowNode(nodeId, { + status: "generating", + summary: "正在整理下载包...", + metadata: { + lastExecutedAt: nowIso, + }, + }); + + downloadWorkflowAssets(assetsToDownload.slice(0, 24), "video-workflow-export"); + + patchWorkflowNode(nodeId, { + status: "completed", + summary: `已发起下载 ${Math.min(assetsToDownload.length, 24)} 个上游结果。`, + metadata: { + lastExecutedAt: nowIso, + lastSavedAt: nowIso, + savedAssetCount: Math.min(assetsToDownload.length, 24), + }, + }); + toast.success("已开始下载上游结果"); + } + } catch (error) { + const message = error instanceof Error ? error.message : "节点执行失败"; + patchWorkflowNode(nodeId, { + status: "failed", + summary: message, + metadata: { + lastExecutedAt: nowIso, + lastError: message, + }, + }); + toast.error(message); + } finally { + setActiveWorkflowExecutionTaskKey((current) => + current === taskKey ? null : current + ); + } + }, [ + buildCharacterAssets, + buildCharacterDescriptionSummary, + buildStoryboardChartRows, + buildWorkflowCanvasBoardState, + buildWorkflowCameraPreset, + buildWorkflowCompareItems, + buildWorkflowDefaultCropRect, + buildWorkflowDoodleInstructions, + buildWorkflowHandoffPlan, + buildWorkflowMovementDirective, + buildWorkflowMusicPlan, + buildWorkflowTableState, + buildSceneAssets, + buildSceneDescriptionSummary, + buildStoryboardShots, + buildWorkflowTextBlock, + createWorkflowOutputNode, + downloadWorkflowAssets, + guessCanvasAspectRatio, + guessVideoRatio, + inferWorkflowExtendScales, + imageGenerationService, + patchWorkflowNode, + resolvePreferredCharacterPrompt, + resolvePreferredScenePrompt, + selectedVideoWorkflowData, + selectedVideoWorkflowNode, + selectedVideoWorkflowType, + selectedWorkflowInputs.imageCount, + selectedWorkflowInputs.videoCount, + selectedWorkflowIsActionable, + selectedWorkflowMedia, + selectedWorkflowPrompt, + selectedWorkflowStructuredData, + syncDirectPreviewNodes, + syncDirectStoryboardChartNodes, + workflowAnalysisService, + workflowGraph, + ]); const handleBatchAddToCanvas = useCallback((imageUrls: string[]) => { if (!imageUrls || imageUrls.length === 0) { @@ -2115,6 +6550,10 @@ export default function CanvasEditorPage({ params }: PageProps) { if (e.key === 'h' && !e.ctrlKey && !e.metaKey) { setTool('pan'); } + // L 连线工具(仅视频画布) + if (isVideoMode && e.key === 'l' && !e.ctrlKey && !e.metaKey) { + setTool('draw'); + } // Delete 删除选中 if (e.key === 'Delete' || e.key === 'Backspace') { useCanvasStore.getState().deleteSelectedNodes(); @@ -2123,7 +6562,7 @@ export default function CanvasEditorPage({ params }: PageProps) { window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); - }, [handleSave, nodes, redo, selectNodes, selectedNodeIds, setTool, undo]); + }, [handleSave, isVideoMode, nodes, redo, selectNodes, selectedNodeIds, setTool, undo]); useEffect(() => { const html = document.documentElement; @@ -2392,6 +6831,27 @@ export default function CanvasEditorPage({ params }: PageProps) { const agentProjectNavSlot = isAgentMode ? (
    + {canSyncAgentResultsToCanvas ? ( + + ) : null} +
    {isAgentProjectLoading || isAgentProjectSaving ? ( @@ -2676,9 +7136,294 @@ export default function CanvasEditorPage({ params }: PageProps) { {/* 1. Canvas Layer (Full Screen) - 使用 key 强制在 id 变化时重新挂载 */}
    - +
    + {isVideoMode ? ( +
    +
    + 视频画布 +
    +
    + ) : null} + + {isVideoMode && nodes.length === 0 ? ( +
    + + +
    +
    + 参考工作流模板 + + 这里按参考 APP 的核心链路预置了脚本成片、图片转视频、视频拆解、角色拆解和局部重绘几条起手流程。 + +
    + + 第四阶段 + +
    +
    + + {VIDEO_WORKFLOW_STARTER_TEMPLATES.map((template) => ( + + ))} + +
    +
    + ) : null} + + {isVideoMode && + selectedVideoWorkflowDefinition && + (selectedVideoWorkflowQuickConnects.length > 0 || selectedWorkflowIsActionable) ? ( +
    + {selectedVideoWorkflowQuickConnects.length > 0 ? ( + + +
    +
    + {selectedVideoWorkflowDefinition.label} + + 参考 APP 里这个节点后面通常会接这些分支,点击后会自动放到右侧并连线。 + +
    + + Quick Connect + +
    +
    + + {selectedVideoWorkflowQuickConnects.map((item) => ( + + ))} + +
    + ) : null} + + {selectedWorkflowIsActionable ? ( + + +
    +
    + 工作流执行 + + {selectedWorkflowActionHint} + +
    + + Phase 4 + +
    +
    + +
    + + 提示词 {selectedWorkflowInputs.promptCount} + + + 图片 {selectedWorkflowInputs.imageCount} + + + 视频 {selectedWorkflowInputs.videoCount} + + {selectedVideoWorkflowType === "storyboard-node" ? ( + + 分镜 {selectedWorkflowStoryboardShots.length} + + ) : null} + {selectedVideoWorkflowType === "storyboard-node" ? ( + + 下游 {selectedStoryboardBatchTargets.length} + + ) : null} + {selectedWorkflowStructuredData.characters.length > 0 ? ( + + 角色 {selectedWorkflowStructuredData.characters.length} + + ) : null} + {selectedWorkflowStructuredData.scenes.length > 0 ? ( + + 场景 {selectedWorkflowStructuredData.scenes.length} + + ) : null} + {selectedWorkflowStructuredData.characterAssets.length > 0 ? ( + + 角色资产 {selectedWorkflowStructuredData.characterAssets.length} + + ) : null} + {selectedWorkflowStructuredData.sceneAssets.length > 0 ? ( + + 场景资产 {selectedWorkflowStructuredData.sceneAssets.length} + + ) : null} + {selectedVideoWorkflowType === "custom-agent" && + selectedWorkflowLinkedAgentProject.id ? ( + + Agent 已连接 + + ) : null} + {selectedVideoWorkflowType === "custom-agent" && + selectedWorkflowAgentResultCount > 0 ? ( + + Agent 结果 {selectedWorkflowAgentResultCount} + + ) : null} + {selectedVideoWorkflowType === "custom-agent" && + selectedWorkflowPendingAgentResultCount > 0 ? ( + + 待回流 {selectedWorkflowPendingAgentResultCount} + + ) : null} +
    + +
    +
    + 上游提示 +
    +
    + {selectedWorkflowPrompt.trim() + ? selectedWorkflowPrompt + : "当前还没有抽取到可执行提示词,先在上游接入脚本、分镜或参考素材。"} +
    +
    + + {selectedVideoWorkflowType === "custom-agent" && + selectedWorkflowLinkedAgentProject.id ? ( +
    +
    + 已关联 Agent 项目 +
    +
    + {selectedWorkflowLinkedAgentProject.title || selectedWorkflowLinkedAgentProject.id} +
    +
    + 再次点击下方按钮会把当前视频画布上下文同步进去,并直接打开该项目。 +
    +
    + ) : null} + +
    + + + {selectedVideoWorkflowType === "custom-agent" ? ( + + ) : null} + + {selectedVideoWorkflowType === "custom-agent" && + selectedWorkflowAgentResultAssets.length > 0 ? ( + + ) : null} + + {selectedStoryboardCanBatchExecute ? ( + + ) : null} +
    +
    +
    + ) : null} +
    + ) : null} + {brandEntry} {agentDisabledNotice} @@ -2688,7 +7433,12 @@ export default function CanvasEditorPage({ params }: PageProps) { @@ -2762,7 +7536,13 @@ export default function CanvasEditorPage({ params }: PageProps) { variant={tool === "pan" ? "secondary" : "ghost"} size="icon" onClick={() => setTool("pan")} - className={cn("h-9 w-9 rounded-xl", tool === "pan" && "bg-primary text-primary-foreground hover:bg-primary/90")} + className={cn( + isVideoMode ? VIDEO_CANVAS_TOOLBAR_BUTTON_CLASS : "h-9 w-9 rounded-xl", + tool === "pan" && + (isVideoMode + ? VIDEO_CANVAS_TOOLBAR_ACTIVE_BUTTON_CLASS + : "bg-primary text-primary-foreground hover:bg-primary/90") + )} > @@ -2770,7 +7550,29 @@ export default function CanvasEditorPage({ params }: PageProps) { 平移 (H) - {isAgentWorkspaceEnabled ? ( + {isVideoMode ? ( + + + + + 工作流连线 (L) + + ) : null} + + {isAgentWorkspaceEnabled && !isVideoMode ? ( @@ -2809,12 +7616,14 @@ export default function CanvasEditorPage({ params }: PageProps) { variant="ghost" size="icon" onClick={handleAddImageNode} - className="h-9 w-9 rounded-xl" + className={cn( + isVideoMode ? VIDEO_CANVAS_TOOLBAR_BUTTON_CLASS : "h-9 w-9 rounded-xl" + )} > - 添加图片 + {isVideoMode ? "添加图片输入" : "添加图片"} @@ -2823,14 +7632,104 @@ export default function CanvasEditorPage({ params }: PageProps) { variant="ghost" size="icon" onClick={handleAddTextNode} - className="h-9 w-9 rounded-xl" + className={cn( + isVideoMode ? VIDEO_CANVAS_TOOLBAR_BUTTON_CLASS : "h-9 w-9 rounded-xl" + )} > - 添加文本 + {isVideoMode ? "添加脚本节点" : "添加文本"} + {isVideoMode ? ( + + + + + 添加视频输入 + + ) : null} + + {isVideoMode ? ( + + + + + +
    +
    视频工作流节点库
    +
    + 这里按参考 APP 的节点目录整理,先把结构补齐,再逐步接入具体能力。 +
    +
    + +
    + {VIDEO_WORKFLOW_LIBRARY_SECTIONS.map((section) => { + const sectionNodes = getVideoWorkflowSectionNodes(section.id); + return ( +
    +
    +
    + {section.label} +
    +
    + {section.description} +
    +
    +
    + {sectionNodes.map((nodeDefinition) => ( + handleAddWorkflowNode(nodeDefinition.type)} + className="flex items-start gap-3 rounded-xl px-3 py-3" + > +
    +
    +
    + + {nodeDefinition.label} + + + {nodeDefinition.type} + +
    +
    + {nodeDefinition.description} +
    +
    + + ))} +
    +
    + ); + })} +
    + + + + ) : null} + @@ -2868,7 +7769,9 @@ export default function CanvasEditorPage({ params }: PageProps) { } requestImageNodeAction(selectedImageNode.id, "box-cutout"); }} - className="h-9 w-9 rounded-xl" + className={cn( + isVideoMode ? VIDEO_CANVAS_TOOLBAR_BUTTON_CLASS : "h-9 w-9 rounded-xl" + )} > @@ -2886,7 +7789,9 @@ export default function CanvasEditorPage({ params }: PageProps) { variant="ghost" size="icon" onClick={() => router.push(`/canvas/${id}/realtime`)} - className="h-9 w-9 rounded-xl" + className={cn( + isVideoMode ? VIDEO_CANVAS_TOOLBAR_BUTTON_CLASS : "h-9 w-9 rounded-xl" + )} > @@ -2901,7 +7806,9 @@ export default function CanvasEditorPage({ params }: PageProps) { variant="ghost" size="icon" onClick={() => router.push(`/canvas/${id}/model3d`)} - className="h-9 w-9 rounded-xl" + className={cn( + isVideoMode ? VIDEO_CANVAS_TOOLBAR_BUTTON_CLASS : "h-9 w-9 rounded-xl" + )} > @@ -2909,28 +7816,80 @@ export default function CanvasEditorPage({ params }: PageProps) { 3D生成 + {isVideoMode ? ( + + + + + 导出视频画布 + + ) : null} + + {isVideoMode ? ( + + + + + 导入视频画布 + + ) : null} + - 新建画布 + 新建{workspaceLabel}
    + + {/* 6. Bottom Left Compact Controls */}
    -
    +
    @@ -2953,7 +7915,10 @@ export default function CanvasEditorPage({ params }: PageProps) { size="icon" onClick={redo} disabled={!canRedo} - className="h-6 w-6 rounded-none p-0 text-muted-foreground hover:bg-transparent hover:text-foreground" + className={cn( + "h-6 w-6 p-0 text-muted-foreground hover:bg-transparent hover:text-foreground", + isVideoMode ? "rounded-full" : "rounded-none" + )} > @@ -2967,7 +7932,10 @@ export default function CanvasEditorPage({ params }: PageProps) { variant="ghost" size="icon" onClick={zoomOut} - className="h-6 w-6 rounded-none p-0 text-muted-foreground hover:bg-transparent hover:text-foreground" + className={cn( + "h-6 w-6 p-0 text-muted-foreground hover:bg-transparent hover:text-foreground", + isVideoMode ? "rounded-full" : "rounded-none" + )} > @@ -2978,7 +7946,10 @@ export default function CanvasEditorPage({ params }: PageProps) { variant="ghost" size="icon" onClick={zoomIn} - className="h-6 w-6 rounded-none p-0 text-muted-foreground hover:bg-transparent hover:text-foreground" + className={cn( + "h-6 w-6 p-0 text-muted-foreground hover:bg-transparent hover:text-foreground", + isVideoMode ? "rounded-full" : "rounded-none" + )} > diff --git a/components/agents/agent-psd-template-export-preview.tsx b/components/agents/agent-psd-template-export-preview.tsx index 2651e76db..21eea40e2 100644 --- a/components/agents/agent-psd-template-export-preview.tsx +++ b/components/agents/agent-psd-template-export-preview.tsx @@ -81,7 +81,8 @@ type DragState = }; const PREVIEW_MIN_HEIGHT = 340; -const LABEL_PLACEHOLDER = "例如:120cm / 50cm"; +const DIMENSION_UNIT = "CM"; +const LABEL_PLACEHOLDER = "例如:120"; const IMAGE_EXTENSION_REGEX = /\.(png|jpg|jpeg|webp)$/i; const DIMENSION_SUFFIX_REGEX = /-尺寸标注(?=\.)/; const DIMENSION_LINE_COLOR = "#666b73"; @@ -154,7 +155,18 @@ function getDimensionLength(annotation: DimensionAnnotation) { } function formatDimensionValue(value: number) { - return Number.isInteger(value) ? `${value}cm` : `${value.toFixed(1)}cm`; + return Number.isInteger(value) + ? `${value}${DIMENSION_UNIT}` + : `${value.toFixed(1)}${DIMENSION_UNIT}`; +} + +function normalizeDimensionInput(value: string) { + return String(value || "") + .trim() + .replace(/厘米|公分/gi, "") + .replace(/cm/gi, "") + .replace(/\s+/g, "") + .replace(/[^0-9.]/g, ""); } function extractAutoDimensionValues( @@ -282,9 +294,9 @@ function getDimensionLabel(params: { autoDimensionValues?: AutoDimensionValues | null; }) { const { annotation, annotations, autoDimensionValues } = params; - const customLabel = String(annotation.label || "").trim(); + const customLabel = normalizeDimensionInput(annotation.label); if (customLabel) { - return customLabel; + return `${customLabel}${DIMENSION_UNIT}`; } return getAutoDimensionLabel({ @@ -1274,8 +1286,8 @@ export function AgentPsdTemplateExportPreview({
    尺寸文字
    {autoDimensionValues - ? "留空时会优先使用商品尺寸信息自动显示 cm,可继续手动覆盖。" - : "当前没有拿到商品尺寸信息,请直接手动输入 cm 尺寸。"} + ? "留空时会优先使用商品尺寸信息自动显示 CM;手动时只输入数值即可。" + : "当前没有拿到商品尺寸信息,请直接输入数值,系统会自动补 CM。"}
    {getDimensionLabel({ @@ -1293,20 +1305,31 @@ export function AgentPsdTemplateExportPreview({
    ) : null}
    - - setAnnotations((current) => - current.map((annotation) => - annotation.id === selectedAnnotation.id - ? { ...annotation, label: event.target.value } - : annotation +
    + + setAnnotations((current) => + current.map((annotation) => + annotation.id === selectedAnnotation.id + ? { + ...annotation, + label: normalizeDimensionInput( + event.target.value + ), + } + : annotation + ) ) - ) - } - placeholder={LABEL_PLACEHOLDER} - value={selectedAnnotation.label} - /> + } + placeholder={LABEL_PLACEHOLDER} + value={normalizeDimensionInput(selectedAnnotation.label)} + /> + + {DIMENSION_UNIT} + +
    ) : (
    diff --git a/components/canvas/CanvasChatPanel.tsx b/components/canvas/CanvasChatPanel.tsx index 6c8ceeeed..5b6089405 100644 --- a/components/canvas/CanvasChatPanel.tsx +++ b/components/canvas/CanvasChatPanel.tsx @@ -21,7 +21,7 @@ import { type UiSurfaceSnapshot, } from "@/lib/ui-surface-protocol"; import useSWR, { useSWRConfig } from "swr"; -import { Send, Loader2, ImagePlus, Paperclip, X, Plus, History, LayoutGrid, ArrowRightToLine, RefreshCw, Globe, Box, ArrowUp, Video, Sparkles, Check, ChevronDown, ChevronUp, AlertCircle, CheckCircle2, Brain, ThumbsUp, ThumbsDown, Eye, Trash2, Download, MessageCircle } from "lucide-react"; +import { Send, Loader2, ImagePlus, Paperclip, X, Plus, History, LayoutGrid, ArrowRightToLine, RefreshCw, Globe, Box, ArrowUp, Video, Sparkles, Check, ChevronDown, ChevronUp, AlertCircle, CheckCircle2, Brain, ThumbsUp, ThumbsDown, Eye, Trash2, Download, MessageCircle, Clapperboard } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Textarea } from "@/components/ui/textarea"; import { @@ -129,6 +129,52 @@ type ImageGenerationStatusStreamPayload = { imageCount?: number; }; +type AgentTargetLockRefPreview = { + url: string; + title?: string; + nodeId?: string; + assetId?: string; + source: + | "current_message" + | "canvas_selection" + | "canvas_context" + | "history_user_upload" + | "history_assistant_result" + | "working_memory"; + role: "upload" | "selected" | "reference" | "history_result" | "working_memory"; + isSelected?: boolean; + positionLabel?: string; +}; + +type AgentTargetLockStreamPayload = { + stage?: "locked" | "clarify" | "unresolved"; + resolutionMode?: + | "explicit_selection" + | "current_upload" + | "text_reference" + | "working_memory" + | "latest_result" + | "clarification" + | "none"; + confidence?: number; + reason?: string; + needsClarification?: boolean; + clarificationMessage?: string; + targetCount?: number; + candidateCount?: number; + targets?: AgentTargetLockRefPreview[]; + candidates?: AgentTargetLockRefPreview[]; +}; + +type AgentProgressStreamPayload = { + stage?: "planning" | "clarify" | "executing" | "completed" | "failed"; + currentStep?: "lock_target" | "analyze" | "select_tool" | "execute" | "finalize"; + title?: string; + message?: string; + toolName?: string; + capability?: string; +}; + interface CanvasChatPanelProps { chatId: string; initialMessages?: ChatMessage[]; @@ -139,6 +185,7 @@ interface CanvasChatPanelProps { workflowContext?: AgentWorkflowComposerContext | null; presentation?: "panel" | "workspace"; agentEnabled?: boolean; + workspaceVariant?: "canvas" | "video"; } type VideoStoryboardStreamData = @@ -329,6 +376,59 @@ function buildPreviewImageUrl(url: string, width: number): string { }); } +function getAgentTargetLockTitle(payload?: AgentTargetLockStreamPayload | null) { + if (payload?.stage === "clarify") return "需要确认目标"; + if (payload?.stage === "locked") return "当前锁定目标"; + return "待锁定目标"; +} + +function getAgentTargetResolutionLabel(mode?: AgentTargetLockStreamPayload["resolutionMode"]) { + switch (mode) { + case "explicit_selection": + return "画布选中"; + case "current_upload": + return "当前上传"; + case "text_reference": + return "文本定位"; + case "working_memory": + return "工作记忆"; + case "latest_result": + return "最新结果"; + case "clarification": + return "待确认"; + case "none": + return "未解析"; + default: + return "自动解析"; + } +} + +const AGENT_PROGRESS_STEPS: Array<{ + key: NonNullable; + label: string; +}> = [ + { key: "lock_target", label: "锁定目标" }, + { key: "analyze", label: "理解需求" }, + { key: "select_tool", label: "选择工具" }, + { key: "execute", label: "执行处理" }, + { key: "finalize", label: "整理结果" }, +]; + +function getAgentProgressFallbackTitle(payload?: AgentProgressStreamPayload | null) { + switch (payload?.stage) { + case "clarify": + return "等待确认"; + case "executing": + return "正在处理"; + case "completed": + return "处理完成"; + case "failed": + return "处理失败"; + default: + return "正在准备"; + } +} + function normalizeMediaUrl(url: string): string { const raw = String(url || "").trim(); if (!raw) return ""; @@ -1835,12 +1935,17 @@ export function CanvasChatPanel({ workflowContext = null, presentation = "panel", agentEnabled = true, + workspaceVariant = "canvas", }: CanvasChatPanelProps) { const isWorkspacePresentation = presentation === "workspace"; + const isVideoWorkspace = workspaceVariant === "video"; + const effectiveAgentEnabled = agentEnabled && !isVideoWorkspace; const { data: session } = useSession(); const [input, setInput] = useState(""); const [attachments, setAttachments] = useState([]); - const [selectedModelId, setSelectedModelId] = useState(agentEnabled ? "auto" : ""); + const [selectedModelId, setSelectedModelId] = useState( + effectiveAgentEnabled ? "auto" : "" + ); const [isDetailGenerationMode, setIsDetailGenerationMode] = useState(false); const [detailGenerationMode, setDetailGenerationMode] = useState("classic"); const [isDetailGenerating, setIsDetailGenerating] = useState(false); @@ -1919,6 +2024,7 @@ export function CanvasChatPanel({ const pendingLaunchRef = useRef(null); const [launchAutoSendTick, setLaunchAutoSendTick] = useState(0); const hasInitializedChatStateRef = useRef(false); + const hasInitializedVideoWorkspaceRef = useRef(false); const sessionMenuRef = useRef(null); const historyScrollTimerRef = useRef | null>(null); const forceHistoryHydrationRef = useRef(null); @@ -1959,6 +2065,18 @@ export function CanvasChatPanel({ () => streamImageGenerationStateByChatId[activeChatId] || null, [activeChatId, streamImageGenerationStateByChatId] ); + const [agentTargetLockStateByChatId, setAgentTargetLockStateByChatId] = + useState>({}); + const activeAgentTargetLock = useMemo( + () => agentTargetLockStateByChatId[activeChatId] || null, + [activeChatId, agentTargetLockStateByChatId] + ); + const [agentProgressStateByChatId, setAgentProgressStateByChatId] = + useState>({}); + const activeAgentProgress = useMemo( + () => agentProgressStateByChatId[activeChatId] || null, + [activeChatId, agentProgressStateByChatId] + ); const imageParamsRef = useRef(imageParams); const videoParamsRef = useRef(videoParams); const deepThinkingEnabledRef = useRef(deepThinkingEnabled); @@ -2022,6 +2140,25 @@ export function CanvasChatPanel({ }); }, []); + const setAgentProgressStateForChat = useCallback( + (chatSessionId: string, next: AgentProgressStreamPayload | null) => { + setAgentProgressStateByChatId((prev) => ({ + ...prev, + [chatSessionId]: next, + })); + }, + [] + ); + + const clearAgentProgressStateForChat = useCallback((chatSessionId: string) => { + setAgentProgressStateByChatId((prev) => { + if (!(chatSessionId in prev)) return prev; + const next = { ...prev }; + delete next[chatSessionId]; + return next; + }); + }, []); + const shouldBlockDuplicateSend = useCallback((chatSessionId: string, signature: string) => { const now = Date.now(); const previous = getSendGuard(chatSessionId); @@ -2981,6 +3118,7 @@ export function CanvasChatPanel({ }`; const totalGeneratedImages = Number(userImageStats?.totalImages ?? NaN); const aiDetailGenerationEnabled = siteSettings?.aiDetailGenerationEnabled === true; + const canUseDetailGeneration = aiDetailGenerationEnabled && !isVideoWorkspace; const shouldShowCanvasBanner = !isDetailGenerationMode && (siteSettings?.bannerEnabled ?? true) && @@ -3094,7 +3232,7 @@ export function CanvasChatPanel({ // 所有可选模型(Agent模式 + 可视化模型) const allModels = useMemo(() => { const merged = [ - ...(agentEnabled ? [SMART_AUTO_MODEL] : []), + ...(effectiveAgentEnabled ? [SMART_AUTO_MODEL] : []), ...(multimodalAgentModel ? [multimodalAgentModel] : []), ...visualModels, ]; @@ -3106,7 +3244,7 @@ export function CanvasChatPanel({ seen.add(model.id); return true; }); - }, [SMART_AUTO_MODEL, agentEnabled, multimodalAgentModel, visualModels]); + }, [SMART_AUTO_MODEL, effectiveAgentEnabled, multimodalAgentModel, visualModels]); const imageOnlyModels = useMemo( () => visualModels.filter( @@ -3206,8 +3344,12 @@ export function CanvasChatPanel({ currentModel && isCanvasConversationOnlyModel(currentModel) ); const hasSelectedAgentPreset = Boolean(String(selectedAgentPresetId || "").trim()); + const [agentEntryMode, setAgentEntryMode] = useState<"auto" | "preset">( + hasSelectedAgentPreset ? "preset" : "auto" + ); + const isPresetAgentSelection = hasSelectedAgentPreset && agentEntryMode === "preset"; const isAgentModel = - agentEnabled && + effectiveAgentEnabled && hasSelectedAgentPreset && !isDetailGenerationMode && (!selectedModelId || selectedModelId === "auto" || isConversationModel); @@ -3222,8 +3364,9 @@ export function CanvasChatPanel({ >(null); const activeComposerMode = composerModeOverride || computedComposerMode; const agentSelectableModels = useMemo( - () => (agentEnabled ? [SMART_AUTO_MODEL, ...conversationOnlyModels] : conversationOnlyModels), - [SMART_AUTO_MODEL, agentEnabled, conversationOnlyModels] + () => + effectiveAgentEnabled ? [SMART_AUTO_MODEL, ...conversationOnlyModels] : conversationOnlyModels, + [SMART_AUTO_MODEL, effectiveAgentEnabled, conversationOnlyModels] ); const selectableModels = useMemo(() => { if (activeComposerMode === "detail") { @@ -3251,17 +3394,83 @@ export function CanvasChatPanel({ currentModel || SMART_AUTO_MODEL; const agentDisplayName = - currentModel?.displayName || selectDisplayModel?.displayName || "Agent模式"; + activeComposerMode === "agent" + ? isPresetAgentSelection + ? selectedAgentPreset?.name || "预设Agent" + : "Auto Agent" + : currentModel?.displayName || selectDisplayModel?.displayName || "Agent模式"; const videoFrameSlots = useMemo(() => { if (!isVideoModel || !videoParams) return [] as string[]; if (videoParams.mode === "first-last-frame") return ["首帧", "尾帧"] as string[]; if (videoParams.mode === "first-frame") return ["首帧"] as string[]; return [] as string[]; }, [isVideoModel, videoParams]); + const preferredVideoWorkspaceModel = useMemo(() => { + if (isVideoModel && currentModel) { + return currentModel; + } + + const lastPreferredModel = allModels.find((model) => model.id === lastVideoModelId); + if (lastPreferredModel && isCanvasVideoModel(lastPreferredModel)) { + return lastPreferredModel; + } + + return videoOnlyModels[0] || null; + }, [ + allModels, + currentModel, + isCanvasVideoModel, + isVideoModel, + lastVideoModelId, + videoOnlyModels, + ]); + const videoWorkspaceQuickActions = useMemo(() => { + const supportedModes = new Set( + preferredVideoWorkspaceModel?.videoToolCapability?.modeOptions?.map((item) => item.mode) || [ + "text-to-video", + "first-frame", + "first-last-frame", + "reference-images", + ] + ); + + return [ + { + mode: "text-to-video" as const, + title: "文生视频", + description: "直接描述主体、镜头和运动", + icon: Clapperboard, + disabled: !supportedModes.has("text-to-video"), + }, + { + mode: "first-frame" as const, + title: "主体参考", + description: "用首帧锁定主体与画风", + icon: ImagePlus, + disabled: !supportedModes.has("first-frame"), + }, + { + mode: "first-last-frame" as const, + title: "首尾帧", + description: "同时控制开场和收尾画面", + icon: ArrowRightToLine, + disabled: !supportedModes.has("first-last-frame"), + }, + { + mode: "reference-images" as const, + title: "智能多帧", + description: "多图共同约束场景一致性", + icon: LayoutGrid, + disabled: !supportedModes.has("reference-images"), + }, + ]; + }, [preferredVideoWorkspaceModel]); const activeComposerModeRef = useRef(activeComposerMode); + const agentEntryModeRef = useRef(agentEntryMode); const agentUploadSlots = useMemo(() => { if ( activeComposerMode !== "agent" || + !isPresetAgentSelection || !selectedAgentPreset || selectedAgentPreset.type === "text" ) { @@ -3276,7 +3485,7 @@ export function CanvasChatPanel({ { slotIndex: 1, label: "产品图2" }, { slotIndex: 2, label: "模特图" }, ]; - }, [activeComposerMode, selectedAgentPreset]); + }, [activeComposerMode, isPresetAgentSelection, selectedAgentPreset]); const hasAgentUploadSlots = activeComposerMode === "agent" && agentUploadSlots.length > 0; const agentRequiredUploadCount = hasAgentUploadSlots ? 3 : 0; @@ -3483,9 +3692,11 @@ export function CanvasChatPanel({ ? "视频" : activeComposerMode === "detail" ? "AI详情" - : activeComposerMode === "image" + : activeComposerMode === "image" ? "生图" - : "Agent"; + : isPresetAgentSelection + ? "预设Agent" + : "Auto Agent"; const shouldMaskAgentRuntimeModelName = activeComposerMode === "agent" || selectedModelId === "auto"; const getAgentSafeModelName = useCallback( @@ -3504,16 +3715,32 @@ export function CanvasChatPanel({ activeComposerModeRef.current = activeComposerMode; }, [activeComposerMode]); + useEffect(() => { + agentEntryModeRef.current = agentEntryMode; + }, [agentEntryMode]); + + useEffect(() => { + setAgentEntryMode(hasSelectedAgentPreset ? "preset" : "auto"); + }, [hasSelectedAgentPreset, selectedAgentPresetId]); + useEffect(() => { if (!selectedModelId && siteSettings) { - const nextModelId = agentEnabled ? "auto" : firstImageModelId || firstVideoModelId || ""; + const nextModelId = effectiveAgentEnabled + ? "auto" + : firstImageModelId || firstVideoModelId || ""; currentModelIdRef.current = nextModelId; setSelectedModelId(nextModelId); } - }, [agentEnabled, firstImageModelId, firstVideoModelId, selectedModelId, siteSettings]); + }, [ + effectiveAgentEnabled, + firstImageModelId, + firstVideoModelId, + selectedModelId, + siteSettings, + ]); useEffect(() => { - if (agentEnabled) return; + if (effectiveAgentEnabled) return; if (selectedModelId !== "auto" && activeComposerMode !== "agent") return; const fallbackModelId = firstImageModelId || firstVideoModelId || ""; @@ -3525,7 +3752,7 @@ export function CanvasChatPanel({ } }, [ activeComposerMode, - agentEnabled, + effectiveAgentEnabled, firstImageModelId, firstVideoModelId, isDetailGenerationMode, @@ -3533,10 +3760,10 @@ export function CanvasChatPanel({ ]); useEffect(() => { - if (!aiDetailGenerationEnabled && isDetailGenerationMode) { + if (!canUseDetailGeneration && isDetailGenerationMode) { setIsDetailGenerationMode(false); } - }, [aiDetailGenerationEnabled, isDetailGenerationMode]); + }, [canUseDetailGeneration, isDetailGenerationMode]); useEffect(() => { if (!modelSelectValue || modelSelectValue === selectedModelId) return; @@ -3545,8 +3772,9 @@ export function CanvasChatPanel({ }, [modelSelectValue, selectedModelId]); useEffect(() => { - if (!agentEnabled) return; + if (!effectiveAgentEnabled) return; if (activeComposerMode !== "agent") return; + if (!isPresetAgentSelection) return; if (!selectedAgentPresetId) return; if (!selectedAgentPreset?.defaultModelId) return; if (currentModelIdRef.current === selectedAgentPreset.defaultModelId) return; @@ -3558,6 +3786,8 @@ export function CanvasChatPanel({ } }, [ activeComposerMode, + effectiveAgentEnabled, + isPresetAgentSelection, isDetailGenerationMode, selectedAgentPreset, selectedAgentPresetId, @@ -3738,6 +3968,32 @@ export function CanvasChatPanel({ } }, [currentModel, isConversationModel, isDetailGenerationMode, isVideoModel]); + useEffect(() => { + if (!isVideoWorkspace) return; + if (hasInitializedVideoWorkspaceRef.current) return; + if (!preferredVideoWorkspaceModel) return; + hasInitializedVideoWorkspaceRef.current = true; + if (isDetailGenerationMode) { + setIsDetailGenerationMode(false); + } + setComposerModeOverride("video"); + if ( + !selectedModelId || + selectedModelId === "auto" || + !isCanvasVideoModel(currentModel || null) + ) { + currentModelIdRef.current = preferredVideoWorkspaceModel.id; + setSelectedModelId(preferredVideoWorkspaceModel.id); + } + }, [ + currentModel, + isCanvasVideoModel, + isDetailGenerationMode, + isVideoWorkspace, + preferredVideoWorkspaceModel, + selectedModelId, + ]); + const handleSelectGenerationMode = useCallback( (mode: "agent" | "image" | "video" | "detail") => { hiddenPromptRef.current = null; @@ -3746,7 +4002,7 @@ export function CanvasChatPanel({ setComposerModeOverride(mode); if (mode === "agent") { - if (!agentEnabled) { + if (!effectiveAgentEnabled) { return; } const preferredAgentModelId = @@ -3762,11 +4018,11 @@ export function CanvasChatPanel({ } if (mode === "detail") { - if (!aiDetailGenerationEnabled) { + if (!canUseDetailGeneration) { toast.error("AI详情生成功能未开启"); return; } - const detailModelId = agentEnabled ? "auto" : ""; + const detailModelId = effectiveAgentEnabled ? "auto" : ""; currentModelIdRef.current = detailModelId; setSelectedModelId(detailModelId); setIsDetailGenerationMode(true); @@ -3807,8 +4063,8 @@ export function CanvasChatPanel({ setIsDetailGenerationMode(false); }, [ - aiDetailGenerationEnabled, - agentEnabled, + canUseDetailGeneration, + effectiveAgentEnabled, allModels, computedComposerMode, firstImageModelId, @@ -3823,6 +4079,31 @@ export function CanvasChatPanel({ ] ); + const applyVideoWorkspacePreset = useCallback( + (mode: VideoGenerationParams["mode"]) => { + if (!preferredVideoWorkspaceModel) { + toast.error("当前没有可用的视频模型"); + return; + } + + handleSelectGenerationMode("video"); + const nextParams = normalizeVideoParamsForProvider( + { + ...(videoParamsRef.current || {}), + mode, + }, + preferredVideoWorkspaceModel.providerType, + preferredVideoWorkspaceModel.videoToolCapability + ); + handleVideoParamsChange(nextParams); + + setTimeout(() => { + (textareaRef.current as HTMLDivElement | null)?.focus(); + }, 0); + }, + [handleSelectGenerationMode, preferredVideoWorkspaceModel] + ); + const updateDetailBriefField = useCallback( (key: keyof DetailBriefForm, value: string) => { setDetailBrief((prev) => ({ ...prev, [key]: value })); @@ -4217,11 +4498,13 @@ export function CanvasChatPanel({ id: rawId, modelId: currentModelIdRef.current, composerMode: activeComposerModeRef.current, + agentEntryMode: agentEntryModeRef.current, imageParams: imageParamsRef.current, contextPayload: buildContextPayload(), lastMessage: request.messages.at(-1), }); const effectiveComposerMode = activeComposerModeRef.current || activeComposerMode; + const effectiveAgentEntryMode = agentEntryModeRef.current; const hiddenPrompt = hiddenPromptRef.current || undefined; const autoContext = autoContextRef.current || undefined; const contextPayload = buildContextPayload(); @@ -4235,7 +4518,9 @@ export function CanvasChatPanel({ id: rawId, message: request.messages.at(-1), agentPresetId: - effectiveComposerMode === "agent" && selectedAgentPreset?.id + effectiveComposerMode === "agent" && + effectiveAgentEntryMode === "preset" && + selectedAgentPreset?.id ? selectedAgentPreset.id : undefined, selectedChatModel: currentModelIdRef.current, @@ -4293,6 +4578,40 @@ export function CanvasChatPanel({ return; } + if (dataPart.type === "data-agentTargetLock") { + try { + const payload: AgentTargetLockStreamPayload = + typeof dataPart.data === "string" ? JSON.parse(dataPart.data) : dataPart.data; + if (!payload || typeof payload !== "object") return; + setAgentTargetLockStateByChatId((prev) => ({ + ...prev, + [activeChatId]: payload, + })); + } catch (e) { + console.error("[CanvasChat] Failed to parse data-agentTargetLock:", e); + } + return; + } + + if (dataPart.type === "data-agentProgress") { + try { + const payload: AgentProgressStreamPayload = + typeof dataPart.data === "string" ? JSON.parse(dataPart.data) : dataPart.data; + if (!payload || typeof payload !== "object") return; + setAgentProgressStateForChat(activeChatId, { + stage: payload.stage || "planning", + currentStep: payload.currentStep || "analyze", + title: payload.title, + message: payload.message, + toolName: payload.toolName, + capability: payload.capability, + }); + } catch (e) { + console.error("[CanvasChat] Failed to parse data-agentProgress:", e); + } + return; + } + // 处理后端返回的自定义消息 if (dataPart.type === "data-appendMessage") { try { @@ -4655,6 +4974,12 @@ export function CanvasChatPanel({ }, onError: (error) => { clearStreamImageGenerationStateForChat(activeChatId); + setAgentProgressStateForChat(activeChatId, { + stage: "failed", + currentStep: "execute", + title: "本轮请求失败", + message: error instanceof Error ? error.message : "请求失败,请稍后重试", + }); releaseSendGuard(activeChatId); const fallbackMessage = error instanceof Error ? error.message : "生成失败"; @@ -7509,7 +7834,7 @@ export function CanvasChatPanel({ return; } - if (isDetailGenerationMode && aiDetailGenerationEnabled) { + if (isDetailGenerationMode && canUseDetailGeneration) { setSendGuard(activeChatId, { inFlight: true, signature: `detail:${activeChatId}:${Date.now()}`, @@ -7630,6 +7955,7 @@ export function CanvasChatPanel({ textContent = `请基于当前工作流设定生成方案:${workflowContext.summaryText}`; } const effectiveComposerMode = activeComposerModeRef.current || activeComposerMode; + const effectiveAgentEntryMode = agentEntryModeRef.current || agentEntryMode; if (!textContent && hasAgentUploadSlots && selectedAgentPreset) { textContent = `请按「${selectedAgentPreset.name}」智能体配置顺序处理产品图1、产品图2和模特图。`; } @@ -7652,6 +7978,7 @@ export function CanvasChatPanel({ } if ( effectiveComposerMode === "agent" && + effectiveAgentEntryMode === "preset" && selectedAgentPreset?.type === "text" && selectedAgentPreset.slots?.length ) { @@ -7679,7 +8006,7 @@ export function CanvasChatPanel({ hiddenSegments.push("【注意:图片中有标注(箭头、圆圈、文字等)标记的区域是需要重点关注或修改的部分,请根据标注进行处理】"); console.log('[CanvasChat] 检测到标注图片,已生成隐藏提示'); } - if (isDetailGenerationMode && aiDetailGenerationEnabled) { + if (isDetailGenerationMode && canUseDetailGeneration) { hiddenSegments.push( [ "【AI详情生成模式】", @@ -7729,6 +8056,7 @@ export function CanvasChatPanel({ timestamp: Date.now(), }); clearStreamImageGenerationStateForChat(activeChatId); + clearAgentProgressStateForChat(activeChatId); // 使用与 multimodal-input 相同的格式发送消息 try { @@ -7760,6 +8088,7 @@ export function CanvasChatPanel({ }, [ activeChatId, activeComposerMode, + agentEntryMode, agentRequiredUploadCount, input, attachments, @@ -7778,11 +8107,12 @@ export function CanvasChatPanel({ currentModel?.providerType, selectedImageNodes, isDetailGenerationMode, - aiDetailGenerationEnabled, + canUseDetailGeneration, handleDetailGeneration, ensureImagePointsBeforeSend, getSendGuard, clearStreamImageGenerationStateForChat, + clearAgentProgressStateForChat, computedComposerMode, releaseSendGuard, setSendGuard, @@ -8255,11 +8585,21 @@ export function CanvasChatPanel({ const composerPlaceholder = isWorkspacePresentation ? isDetailGenerationMode ? "可选补充:风格、情绪氛围、禁用元素、期望生成张数(如:生成8张)" + : isVideoWorkspace + ? "描述镜头、主体和运动方式,也可以先切到首帧或首尾帧模式" + : activeComposerMode === "agent" && !isPresetAgentSelection + ? "直接告诉我你的需求,也可以上传图片让我分析、修图或继续生成" : hasAgentUploadSlots ? "可选补充本次生图要求,例如:高级感、暖灰色、近景特写、生成3张。" : "可选补充本次生成要求,例如:更高级、更生活化、暖调灯光。" : isDetailGenerationMode ? "可选补充:风格、情绪氛围、禁用元素、期望生成张数(如:生成8张)" + : isVideoWorkspace + ? isVideoModel && videoFrameSlots.length > 0 + ? `描述镜头、主体和运动方式;可从画布填充${videoFrameSlots.join(" / ")}` + : "描述视频镜头、主体、运动方式与时长,也可以切换到首帧或首尾帧模式" + : activeComposerMode === "agent" && !isPresetAgentSelection + ? "可直接对话,也可上传图片让我分析、修图、生图或继续处理上一版" : activeComposerMode === "agent" && selectedAgentPreset?.type === "text" ? "可上传图片做分析,也可直接输入文案需求" : hasAgentUploadSlots @@ -8278,8 +8618,7 @@ export function CanvasChatPanel({ const canSend = isDetailGenerationMode ? detailValidationIssues.length === 0 && !isDetailGenerating : hasInputOrAttachments && - hasEnoughAgentUploads && - (activeComposerMode !== "agent" || hasSelectedAgentPreset); + hasEnoughAgentUploads; const currentVideoImageLimit = isVideoModel ? getVideoImageLimit(videoParams, currentModel?.providerType, currentModel?.videoToolCapability) : null; @@ -8386,30 +8725,101 @@ export function CanvasChatPanel({ !isLoading && !shouldShowImageLoading; const workspaceEmptyTitle = - activeComposerMode === "agent" && !selectedAgentPresetId - ? "直接输入需求开始对话" + activeComposerMode === "agent" && !isPresetAgentSelection + ? "开始 Auto Agent 对话" : hasAgentUploadSlots && attachments.length < agentRequiredUploadCount ? `请先补齐图片槽位(${attachments.length}/${agentRequiredUploadCount})` : "准备开始生成"; const workspaceEmptyDescription = - activeComposerMode === "agent" && !selectedAgentPresetId - ? "可直接上传图片或输入需求;如需套用预设,再选择智能体即可。" + activeComposerMode === "agent" && !isPresetAgentSelection + ? hasSelectedAgentPreset + ? "当前是 Auto Agent,可直接上传图片或输入需求;如果要跑当前预设,切到“预设Agent”即可。" + : "可直接上传图片或输入需求,支持分析图片、连续修图、生图和视频协助。" : hasAgentUploadSlots && attachments.length < agentRequiredUploadCount ? "从左侧 SKU / SPU 获取图片,或在下方继续上传替换后,再点击开始生成。" : "可在下方补充要求后点击开始生成,结果会显示在这里。"; + const shouldShowAgentTargetLockCard = + !isDetailGenerationMode && + activeComposerMode === "agent" && + !isPresetAgentSelection && + Boolean(activeAgentTargetLock); + const shouldShowAgentProgressCard = + !isDetailGenerationMode && + activeComposerMode === "agent" && + !isPresetAgentSelection && + Boolean(activeAgentProgress) && + (isLoading || + activeAgentProgress?.stage === "clarify" || + activeAgentProgress?.stage === "failed"); + const agentTargetLockPreviewItems = useMemo(() => { + if (!activeAgentTargetLock) return [] as AgentTargetLockRefPreview[]; + const targets = Array.isArray(activeAgentTargetLock.targets) ? activeAgentTargetLock.targets : []; + const candidates = Array.isArray(activeAgentTargetLock.candidates) + ? activeAgentTargetLock.candidates + : []; + if (targets.length > 0) return targets.slice(0, 4); + return candidates.slice(0, 4); + }, [activeAgentTargetLock]); + const agentTargetLockTitle = getAgentTargetLockTitle(activeAgentTargetLock); + const agentTargetResolutionLabel = getAgentTargetResolutionLabel( + activeAgentTargetLock?.resolutionMode + ); + const agentProgressTitle = + activeAgentProgress?.title?.trim() || getAgentProgressFallbackTitle(activeAgentProgress); + const agentProgressMessage = + activeAgentProgress?.message?.trim() || "我正在根据当前上下文持续推进这一步。"; + const agentProgressSteps = useMemo(() => { + const currentStepIndex = Math.max( + 0, + AGENT_PROGRESS_STEPS.findIndex((step) => step.key === activeAgentProgress?.currentStep) + ); + return AGENT_PROGRESS_STEPS.map((step, index) => { + let state: "upcoming" | "current" | "completed" | "failed" = "upcoming"; + if (activeAgentProgress?.stage === "failed") { + state = index < currentStepIndex ? "completed" : index === currentStepIndex ? "failed" : "upcoming"; + } else if (activeAgentProgress?.stage === "completed") { + state = "completed"; + } else { + state = index < currentStepIndex ? "completed" : index === currentStepIndex ? "current" : "upcoming"; + } + return { + ...step, + state, + }; + }); + }, [activeAgentProgress]); const renderModelSelectContent = () => ( - +
    {selectableModels.map((model) => ( span:first-child]:hidden [&>span:last-child]:block [&>span:last-child]:w-full", + isVideoWorkspace + ? "text-foreground focus:bg-background focus:text-foreground data-[state=checked]:bg-background data-[state=checked]:text-foreground" + : "text-[#2f3640] focus:bg-[#e7ebf0] focus:text-[#1f2937] data-[state=checked]:bg-[#e7ebf0] data-[state=checked]:text-[#1f2937]" + )} > - + {model.avatarUrl ? ( ) : ( - + {model.id === "auto" ? "A" : model.displayName.slice(0, 1)} )} @@ -8432,13 +8847,27 @@ export function CanvasChatPanel({ {model.displayName} {modelSelectValue === model.id ? ( - ✓ + + ✓ + ) : null} ))} {selectableModels.length === 0 ? ( -
    暂无可用模型
    +
    + 暂无可用模型 +
    ) : null}
    @@ -8488,7 +8917,11 @@ export function CanvasChatPanel({
    {/* 全局遮罩提示 - 当处于画布选图模式时显示 */} @@ -8521,11 +8954,21 @@ export function CanvasChatPanel({ {!isWorkspacePresentation ? (
    - +

    {displayCanvasName} @@ -8536,7 +8979,12 @@ export function CanvasChatPanel({ {isSessionMenuOpen && ( -
    +
    聊天窗口记录
    {chatSessions.length === 0 ? ( @@ -8575,8 +9033,12 @@ export function CanvasChatPanel({ className={cn( "w-full text-left rounded-lg px-2.5 py-2 transition-colors", isActive - ? "bg-primary/10 text-primary" - : "hover:bg-muted" + ? isVideoWorkspace + ? "border border-primary/20 bg-primary/10 text-primary" + : "bg-primary/10 text-primary" + : isVideoWorkspace + ? "hover:bg-background" + : "hover:bg-muted" )} onClick={() => switchToSession(session.id)} > @@ -8597,7 +9059,12 @@ export function CanvasChatPanel({ ); })}
    + + {attachments.length > 0 ? ( +
    + {attachments.slice(0, 4).map((attachment, index) => ( +
    + {attachment.name { + if (event.currentTarget.src !== attachment.url) { + event.currentTarget.src = attachment.url; + } + }} + /> +
    + ))} +
    + ) : null}
    + ) : ( + <> +
    +

    + Hi + {greetingUserName ? ( + <> + , + {greetingUserName} + {greetingPeriodText} + + ) : ( + {greetingPeriodText} + )} +

    +

    + 开始创作吧! + {Number.isFinite(totalGeneratedImages) ? ( + <> + {" "}累计为你生成了{" "} + + {totalGeneratedImages.toLocaleString()} + {" "} + 张图。 + + ) : null} +

    +
    + + {canvasSkillTags.length > 0 && ( +
    +
    +

    {canvasSkillTagsTitle}

    +
    +
    + {canvasSkillTags.map((tag) => { + const isActive = selectedSkillTag?.id === tag.id; + const TagIcon = getCanvasSkillIconComponent(tag.iconName); + return ( + + ); + })} +
    +
    + )} + )}
    ) @@ -8858,7 +9402,14 @@ export function CanvasChatPanel({ : "w-full max-w-[88%] items-start" )}> {message.role === 'user' ? ( -
    +
    {(() => { const renderedUserParts: React.ReactNode[] = []; @@ -8875,7 +9426,12 @@ export function CanvasChatPanel({ renderedUserParts.push( )} {!isDetailGenerationMode && hasWorkflowContext && workflowContext && ( -
    -
    - +
    +
    + 当前工作流设定
    -
    +
    {workflowContext.summaryText}
    )} - {!isDetailGenerationMode && activeComposerMode === "agent" && selectedAgentPreset && ( -
    -
    - - {selectedAgentPreset.name} + {!isDetailGenerationMode && isVideoWorkspace && ( +
    +
    + + 视频工作台
    - {selectedAgentPreset.type === "text" ? ( +
    + 直接复用现有的视频模型、首尾帧槽位、流式分镜结果和视频节点输出。先选一个起手方式,再补充镜头描述即可。 +
    +
    + {videoWorkspaceQuickActions.map((action) => { + const Icon = action.icon; + return ( + + ); + })} +
    +
    + )} + {!isDetailGenerationMode && activeComposerMode === "agent" && ( +
    + {hasSelectedAgentPreset ? ( + <> + + + + ) : ( +
    + + Auto Agent +
    + )} + {!isPresetAgentSelection ? ( +
    + 直接对话即可,也可上传图片让我分析、修图或继续生成 +
    + ) : selectedAgentPreset?.type === "text" ? (
    可上传图片做分析,也可直接输入文案需求
    @@ -10131,11 +10782,185 @@ export function CanvasChatPanel({ ) : null}
    )} + {shouldShowAgentProgressCard && activeAgentProgress ? ( +
    +
    + + {activeAgentProgress.stage === "failed" ? ( + + ) : activeAgentProgress.stage === "clarify" ? ( + + ) : activeAgentProgress.stage === "completed" ? ( + + ) : ( + + )} + +
    +
    + + {agentProgressTitle} + + + {AGENT_PROGRESS_STEPS.find( + (step) => step.key === activeAgentProgress.currentStep + )?.label || "处理中"} + +
    +
    + {agentProgressMessage} +
    +
    + {agentProgressSteps.map((step) => ( +
    +
    + {step.state === "completed" ? ( + + ) : step.state === "failed" ? ( + + ) : step.state === "current" ? ( + + ) : ( + + )} +
    +
    + {step.label} +
    +
    + ))} +
    +
    +
    +
    + ) : null} + {shouldShowAgentTargetLockCard && activeAgentTargetLock ? ( +
    +
    + + {activeAgentTargetLock.stage === "clarify" ? ( + + ) : activeAgentTargetLock.stage === "locked" ? ( + + ) : ( + + )} + +
    +
    + + {agentTargetLockTitle} + + + {agentTargetResolutionLabel} + + {Number(activeAgentTargetLock.confidence || 0) > 0 ? ( + + 置信度 {Math.max(0, Math.round(Number(activeAgentTargetLock.confidence || 0)))}% + + ) : null} +
    +
    + {activeAgentTargetLock.reason || activeAgentTargetLock.clarificationMessage || "系统正在根据当前上下文锁定目标图。"} +
    + {activeAgentTargetLock.stage === "clarify" && + activeAgentTargetLock.clarificationMessage ? ( +
    + {activeAgentTargetLock.clarificationMessage} +
    + ) : null} +
    +
    + {agentTargetLockPreviewItems.length > 0 ? ( +
    + {agentTargetLockPreviewItems.map((item, index) => ( +
    +
    + {item.title { + if (event.currentTarget.src !== item.url) { + event.currentTarget.src = item.url; + } + }} + /> +
    +
    + {item.positionLabel || `第${index + 1}张`} +
    +
    + {item.title || (item.isSelected ? "当前选中图" : "画布候选图")} +
    +
    + ))} +
    + ) : null} +
    + ) : null}
    { // 从 contenteditable 中提取纯文本(排除附件标签文本) @@ -10336,7 +11161,13 @@ export function CanvasChatPanel({ )} {/* Bottom Toolbar */} -
    +
    @@ -10409,55 +11242,104 @@ export function CanvasChatPanel({ align="start" side="top" sideOffset={10} - className="w-[156px] rounded-xl border border-[#d6d9df] bg-[#f4f5f7]/90 p-1.5 shadow-[0_8px_18px_rgba(15,23,42,0.14)]" + className={cn( + "w-[156px] rounded-xl p-1.5", + isVideoWorkspace + ? "border border-border/60 bg-background/95 shadow-[0_18px_36px_-24px_rgba(15,23,42,0.35)] backdrop-blur-xl" + : "border border-[#d6d9df] bg-[#f4f5f7]/90 shadow-[0_8px_18px_rgba(15,23,42,0.14)]" + )} > - {agentEnabled ? ( + {effectiveAgentEnabled ? ( handleSelectGenerationMode("agent")} className={cn( - "h-8 cursor-pointer rounded-lg px-2 text-[13px] font-medium text-[#2e3238]", - activeComposerMode === "agent" ? "bg-white/80" : "hover:bg-white/70" + "h-8 cursor-pointer rounded-lg px-2 text-[13px] font-medium", + isVideoWorkspace + ? "text-foreground" + : "text-[#2e3238]", + activeComposerMode === "agent" + ? isVideoWorkspace + ? "bg-background" + : "bg-white/80" + : isVideoWorkspace + ? "hover:bg-background/80" + : "hover:bg-white/70" )} - > - - Agent - {activeComposerMode === "agent" ? : null} - + > + + Agent对话 + {activeComposerMode === "agent" ? ( + + ) : null} + ) : null} - {aiDetailGenerationEnabled ? ( + {canUseDetailGeneration ? ( handleSelectGenerationMode("detail")} className={cn( - "h-8 cursor-pointer rounded-lg px-2 text-[13px] font-medium text-[#2e3238]", - activeComposerMode === "detail" ? "bg-white/80" : "hover:bg-white/70" + "h-8 cursor-pointer rounded-lg px-2 text-[13px] font-medium", + isVideoWorkspace + ? "text-foreground" + : "text-[#2e3238]", + activeComposerMode === "detail" + ? isVideoWorkspace + ? "bg-background" + : "bg-white/80" + : isVideoWorkspace + ? "hover:bg-background/80" + : "hover:bg-white/70" )} > AI详情生成 - {activeComposerMode === "detail" ? : null} + {activeComposerMode === "detail" ? ( + + ) : null} ) : null} handleSelectGenerationMode("image")} className={cn( - "h-8 cursor-pointer rounded-lg px-2 text-[13px] font-medium text-[#2e3238]", - activeComposerMode === "image" ? "bg-white/80" : "hover:bg-white/70" + "h-8 cursor-pointer rounded-lg px-2 text-[13px] font-medium", + isVideoWorkspace + ? "text-foreground" + : "text-[#2e3238]", + activeComposerMode === "image" + ? isVideoWorkspace + ? "bg-background" + : "bg-white/80" + : isVideoWorkspace + ? "hover:bg-background/80" + : "hover:bg-white/70" )} > 图像生成 - {activeComposerMode === "image" ? : null} + {activeComposerMode === "image" ? ( + + ) : null} handleSelectGenerationMode("video")} className={cn( - "h-8 cursor-pointer rounded-lg px-2 text-[13px] font-medium text-[#2e3238]", - activeComposerMode === "video" ? "bg-white/80" : "hover:bg-white/70" + "h-8 cursor-pointer rounded-lg px-2 text-[13px] font-medium", + isVideoWorkspace + ? "text-foreground" + : "text-[#2e3238]", + activeComposerMode === "video" + ? isVideoWorkspace + ? "bg-background" + : "bg-white/80" + : isVideoWorkspace + ? "hover:bg-background/80" + : "hover:bg-white/70" )} > @@ -10467,7 +11349,12 @@ export function CanvasChatPanel({
    ) : projects.length === 0 ? ( -
    +
    -

    暂无画布历史

    +

    暂无{workspaceLabel}历史

    ) : ( @@ -128,15 +150,28 @@ export function CanvasFileListPanel({ currentId, onClose }: CanvasFileListPanelP key={project.id} onClick={() => handleSwitch(project.id)} className={cn( - "group flex items-center gap-3 p-3 rounded-xl cursor-pointer transition-all", - "hover:bg-muted/50", + "group flex cursor-pointer items-center gap-3 rounded-2xl p-3 transition-all", + isVideoWorkspace + ? "border border-border/60 bg-background/72 shadow-sm hover:-translate-y-0.5 hover:border-primary/30 hover:bg-background/88 hover:shadow-md" + : "hover:bg-muted/50", project.id === currentId - ? "bg-primary/5 ring-1 ring-primary/20" - : "bg-card" + ? isVideoWorkspace + ? "border-primary/35 bg-background ring-1 ring-primary/10" + : "bg-primary/5 ring-1 ring-primary/20" + : isVideoWorkspace + ? "" + : "bg-card" )} > {/* 缩略图 */} -
    +
    {project.thumbnail ? ( - {project.title || "未命名画布"} + {project.title || `未命名${workspaceLabel}`}

    {formatDistanceToNow(new Date(project.updatedAt), { @@ -181,7 +216,12 @@ export function CanvasFileListPanel({ currentId, onClose }: CanvasFileListPanelP + + 视频画布 + {siteSettingsData?.productPlanningEnabled !== false ? ( diff --git a/components/top-navbar.tsx b/components/top-navbar.tsx index 5bacf7009..bf3be5996 100644 --- a/components/top-navbar.tsx +++ b/components/top-navbar.tsx @@ -2,7 +2,7 @@ import { useRouter } from "next/navigation"; import Link from "next/link"; -import { Settings, ExternalLink, Briefcase, Images, Sparkles, Trophy, Building2, Crown, Medal, Award, Edit, LayoutGrid, PlayCircle, Wand2, X, BarChart3 } from "lucide-react"; +import { Settings, ExternalLink, Briefcase, Images, Sparkles, Trophy, Building2, Crown, Medal, Award, Edit, LayoutGrid, PlayCircle, Wand2, X, BarChart3, Clapperboard } from "lucide-react"; import { Button } from "@/components/ui/button"; import { useTheme } from "next-themes"; import { useState, useEffect, useRef } from "react"; @@ -141,6 +141,7 @@ export function TopNavbar({ if (trimmed === "精选榜") return "榜单"; if (trimmed === "图片编辑") return "编辑"; if (trimmed === "智能体") return "智能"; + if (trimmed === "视频画布") return "视频"; if (trimmed === "无限画布") return "画布"; if (trimmed === "我的图册") return "图册"; if (trimmed === "商品策划") return "策划"; @@ -481,6 +482,18 @@ export function TopNavbar({ )} + + {/* 无限画布 */}