@musnows/scriverse 0.5.2 → 0.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.en.md CHANGED
@@ -221,6 +221,14 @@ Scriverse is currently an MVP. APIs and data structures may still change. Back u
221
221
 
222
222
  Read the [contribution guide](docs/CONTRIBUTING.md) before submitting code or documentation. Start everyday changes from the latest `develop` branch and merge them through a Pull Request targeting `develop`.
223
223
 
224
+ ## License
225
+
226
+ Copyright (C) 2026 musnows
227
+
228
+ Except for third-party components identified separately, the project is licensed from this license change onward under the [GNU Affero General Public License v3.0 only](LICENSE) (`AGPL-3.0-only`). You may use, modify, distribute, or commercialize the software, but distributed derivative versions must continue to provide their corresponding source under AGPLv3. Modified versions that interact with users over a network must also offer those users the corresponding source of that version.
229
+
230
+ Versions published before this license change remain under the license included with their respective releases.
231
+
224
232
  ## 🌟 Special Thanks
225
233
 
226
234
  Thanks to the open-source [Vditor](https://github.com/Vanessa219/vditor) project for providing the Markdown editor, instant rendering, and split preview capabilities used by Scriverse.
package/README.md CHANGED
@@ -41,7 +41,7 @@
41
41
  - 大纲与伏笔:维护章节目标、冲突、转折和伏笔的埋设、提醒与回收。
42
42
  - AI 创作助手:支持 Markdown 和流式输出,可引用章节行、附加角色与设定上下文。
43
43
  - AI 任务:结构分析、章节分析、角色抽取、时间线分析、关系分析和一致性检查。
44
- - 供应商管理:兼容 OpenAI Chat Completions 协议,可配置模型、最大输出 Token、并发数和 RPM。
44
+ - 供应商管理:兼容 OpenAI Chat Completions 与 Anthropic Messages 协议,可配置模型、最大输出 Token、并发数和 RPM。
45
45
  - 安全导出:支持 JSON、TXT 和 Markdown,导出内容不包含 AI 密钥。
46
46
 
47
47
  ## 技术栈
@@ -141,7 +141,7 @@ npm start
141
141
  配置前请先阅读 [AI 供应商兼容性与配置指南](docs/AI-PROVIDER-COMPATIBILITY.md),其中列出了已验证的服务商、基础地址、模型标识符和已知差异。
142
142
 
143
143
  1. 启动项目后,点击顶部“AI 管理”进入平台级配置。
144
- 2. 新建兼容 OpenAI Chat Completions 的供应商,填写基础地址、API 密钥、并发数、RPM 与最大输出 Token。
144
+ 2. 新建兼容 OpenAI Chat Completions 或 Anthropic Messages 的供应商,选择协议并填写基础地址、API 密钥、并发数、RPM 与最大输出 Token。
145
145
  3. 为模型填写其支持的上下文总量(Token),再添加模型。
146
146
  4. 在平台页设置全局系统提示词;它会追加在内置提示词之后。
147
147
  5. 打开一本作品,在“更多 → AI 设置”中设置该书的追加系统提示词和任务默认模型;书籍提示词会追加在全局提示词之后。
@@ -216,7 +216,8 @@ curl http://127.0.0.1:13210/api/health
216
216
  "data": {
217
217
  "status": "ok",
218
218
  "version": "0.3.3",
219
- "protocol": "openai-chat-completions"
219
+ "protocol": "openai-chat-completions",
220
+ "protocols": ["openai-chat-completions", "anthropic-messages"]
220
221
  }
221
222
  }
222
223
  ```
@@ -229,6 +230,14 @@ curl http://127.0.0.1:13210/api/health
229
230
 
230
231
  提交代码或文档前,请阅读 [协作开发规范](docs/CONTRIBUTING.md)。所有日常变更均从最新 `develop` 派生,并通过以 `develop` 为目标分支的 Pull Request 合入。
231
232
 
233
+ ## 许可证
234
+
235
+ Copyright (C) 2026 musnows
236
+
237
+ 除另有说明的第三方组件外,本项目自本次许可证变更起采用 [GNU Affero General Public License v3.0 only](LICENSE)(`AGPL-3.0-only`)授权。你可以使用、修改、分发或商业化本软件,但分发衍生版本时必须继续以 AGPLv3 提供对应源码;如果修改后的版本通过网络与用户交互,也必须向这些用户提供该版本的对应源码。
238
+
239
+ 许可证变更前已经发布的版本继续适用其发布时附带的许可证。
240
+
232
241
  ## 🌟 Special Thanks
233
242
 
234
243
  感谢开源项目 [Vditor](https://github.com/Vanessa219/vditor),为叙界提供 Markdown 编辑器、即时渲染和分屏预览能力。
@@ -0,0 +1,216 @@
1
+ import { normalizeBaseUrl } from "./utils.js";
2
+ export const AI_PROVIDER_PROTOCOLS = ["openai-chat-completions", "anthropic-messages"];
3
+ export function normalizeProviderBaseUrl(value) {
4
+ return normalizeBaseUrl(value).replace(/\/messages$/u, "");
5
+ }
6
+ function appendVersionedResource(baseUrl, resource) {
7
+ const normalized = normalizeProviderBaseUrl(baseUrl);
8
+ return /\/v1$/u.test(normalized) ? `${normalized}/${resource}` : `${normalized}/v1/${resource}`;
9
+ }
10
+ export function providerCompletionEndpoint(baseUrl, protocol) {
11
+ const normalized = normalizeProviderBaseUrl(baseUrl);
12
+ return protocol === "anthropic-messages"
13
+ ? appendVersionedResource(normalized, "messages")
14
+ : `${normalized}/chat/completions`;
15
+ }
16
+ export function providerModelEndpoints(baseUrl, protocol) {
17
+ const normalized = normalizeProviderBaseUrl(baseUrl);
18
+ if (protocol === "openai-chat-completions")
19
+ return [`${normalized}/models`];
20
+ const primary = appendVersionedResource(normalized, "models");
21
+ const root = new URL("/v1/models", normalized).toString();
22
+ return primary === root ? [primary] : [primary, root];
23
+ }
24
+ export function providerRequestHeaders(protocol, apiKey, accept) {
25
+ return {
26
+ Authorization: `Bearer ${apiKey}`,
27
+ ...(protocol === "anthropic-messages" ? { "x-api-key": apiKey, "anthropic-version": "2023-06-01" } : {}),
28
+ "Content-Type": "application/json",
29
+ Accept: accept
30
+ };
31
+ }
32
+ function textContent(value) {
33
+ return typeof value === "string" && value.length > 0 ? [{ type: "text", text: value }] : [];
34
+ }
35
+ function parsedToolInput(value) {
36
+ if (value && typeof value === "object" && !Array.isArray(value))
37
+ return value;
38
+ if (typeof value !== "string")
39
+ return {};
40
+ try {
41
+ const parsed = JSON.parse(value);
42
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
43
+ }
44
+ catch {
45
+ return {};
46
+ }
47
+ }
48
+ function anthropicAssistantContent(message) {
49
+ if (Array.isArray(message.anthropic_content) && message.anthropic_content.length > 0) {
50
+ return structuredClone(message.anthropic_content);
51
+ }
52
+ return [
53
+ ...textContent(message.content),
54
+ ...message.tool_calls.map((toolCall) => ({
55
+ type: "tool_use",
56
+ id: toolCall.id,
57
+ name: toolCall.function.name,
58
+ input: parsedToolInput(toolCall.function.arguments)
59
+ }))
60
+ ];
61
+ }
62
+ function anthropicToolResult(message) {
63
+ let isError = false;
64
+ try {
65
+ const result = JSON.parse(message.content);
66
+ isError = result.ok === false;
67
+ }
68
+ catch {
69
+ isError = false;
70
+ }
71
+ return {
72
+ type: "tool_result",
73
+ tool_use_id: message.tool_call_id,
74
+ content: message.content,
75
+ ...(isError ? { is_error: true } : {})
76
+ };
77
+ }
78
+ function anthropicMessages(messages) {
79
+ const system = messages
80
+ .filter((message) => message.role === "system")
81
+ .map((message) => message.content)
82
+ .filter(Boolean)
83
+ .join("\n\n");
84
+ const output = [];
85
+ const append = (role, content) => {
86
+ if (content.length === 0)
87
+ return;
88
+ const previous = output.at(-1);
89
+ if (previous?.role === role)
90
+ previous.content.push(...content);
91
+ else
92
+ output.push({ role, content });
93
+ };
94
+ for (const message of messages) {
95
+ if (message.role === "system")
96
+ continue;
97
+ if (message.role === "tool") {
98
+ append("user", [anthropicToolResult(message)]);
99
+ continue;
100
+ }
101
+ if (message.role === "assistant" && "tool_calls" in message) {
102
+ append("assistant", anthropicAssistantContent(message));
103
+ continue;
104
+ }
105
+ append(message.role, textContent(message.content));
106
+ }
107
+ return { ...(system ? { system } : {}), messages: output };
108
+ }
109
+ function anthropicTools(tools) {
110
+ return tools.flatMap((tool) => {
111
+ const fn = tool.function && typeof tool.function === "object" && !Array.isArray(tool.function)
112
+ ? tool.function
113
+ : null;
114
+ if (!fn || typeof fn.name !== "string")
115
+ return [];
116
+ return [{
117
+ name: fn.name,
118
+ ...(typeof fn.description === "string" ? { description: fn.description } : {}),
119
+ input_schema: fn.parameters && typeof fn.parameters === "object" && !Array.isArray(fn.parameters)
120
+ ? fn.parameters
121
+ : { type: "object", properties: {} }
122
+ }];
123
+ });
124
+ }
125
+ export function buildCompletionRequestBody(input) {
126
+ const tools = input.toolChoice === "auto" ? input.tools ?? [] : [];
127
+ if (input.protocol === "openai-chat-completions") {
128
+ return {
129
+ model: input.model,
130
+ messages: input.messages,
131
+ ...input.parameters,
132
+ ...(tools.length > 0 ? { tools, tool_choice: "auto" } : {}),
133
+ ...(input.stream ? { stream: true, stream_options: { include_usage: true } } : {})
134
+ };
135
+ }
136
+ const translated = anthropicMessages(input.messages);
137
+ const parameters = Object.fromEntries(Object.entries(input.parameters)
138
+ .filter(([key]) => ["temperature", "top_p", "max_tokens", "thinking"].includes(key)));
139
+ return {
140
+ model: input.model,
141
+ ...translated,
142
+ ...parameters,
143
+ ...(tools.length > 0 ? { tools: anthropicTools(tools), tool_choice: { type: "auto" } } : {}),
144
+ ...(input.stream ? { stream: true } : {})
145
+ };
146
+ }
147
+ function replayableAnthropicBlock(value) {
148
+ if (!value || typeof value !== "object" || Array.isArray(value))
149
+ return null;
150
+ const block = value;
151
+ if (block.type === "text" && typeof block.text === "string")
152
+ return { type: "text", text: block.text };
153
+ if (block.type === "thinking" && typeof block.thinking === "string" && typeof block.signature === "string") {
154
+ return { type: "thinking", thinking: block.thinking, signature: block.signature };
155
+ }
156
+ if (block.type === "redacted_thinking" && typeof block.data === "string") {
157
+ return { type: "redacted_thinking", data: block.data };
158
+ }
159
+ if (block.type === "tool_use" && typeof block.id === "string" && typeof block.name === "string") {
160
+ return { type: "tool_use", id: block.id, name: block.name, input: parsedToolInput(block.input) };
161
+ }
162
+ return null;
163
+ }
164
+ function anthropicFinishReason(value) {
165
+ if (value === "max_tokens")
166
+ return "length";
167
+ return typeof value === "string" ? value : null;
168
+ }
169
+ export function parseCompletionPayload(protocol, value) {
170
+ if (protocol === "openai-chat-completions") {
171
+ return value && typeof value === "object" && !Array.isArray(value) ? value : {};
172
+ }
173
+ const response = value && typeof value === "object" && !Array.isArray(value) ? value : {};
174
+ const content = Array.isArray(response.content) ? response.content : [];
175
+ const replay = content.map(replayableAnthropicBlock).filter((block) => block !== null);
176
+ const text = content.flatMap((value) => {
177
+ const block = value && typeof value === "object" && !Array.isArray(value) ? value : {};
178
+ return block.type === "text" && typeof block.text === "string" ? [block.text] : [];
179
+ }).join("");
180
+ const reasoning = content.flatMap((value) => {
181
+ const block = value && typeof value === "object" && !Array.isArray(value) ? value : {};
182
+ if (block.type === "thinking" && typeof block.thinking === "string")
183
+ return [block.thinking];
184
+ if (block.type === "text" && typeof block.thinking === "string")
185
+ return [block.thinking];
186
+ return [];
187
+ }).join("");
188
+ const toolCalls = content.flatMap((value) => {
189
+ const block = value && typeof value === "object" && !Array.isArray(value) ? value : {};
190
+ if (block.type !== "tool_use" || typeof block.id !== "string" || typeof block.name !== "string")
191
+ return [];
192
+ return [{
193
+ id: block.id,
194
+ type: "function",
195
+ function: {
196
+ name: block.name,
197
+ arguments: parsedToolInput(block.input)
198
+ }
199
+ }];
200
+ });
201
+ return {
202
+ ...(response.usage && typeof response.usage === "object" && !Array.isArray(response.usage)
203
+ ? { usage: response.usage }
204
+ : {}),
205
+ choices: [{
206
+ finish_reason: anthropicFinishReason(response.stop_reason),
207
+ message: {
208
+ content: text || null,
209
+ reasoning_content: reasoning || null,
210
+ tool_calls: toolCalls,
211
+ anthropic_content: replay
212
+ }
213
+ }]
214
+ };
215
+ }
216
+ //# sourceMappingURL=ai-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-protocol.js","sourceRoot":"","sources":["../src/ai-protocol.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,yBAAyB,EAAE,oBAAoB,CAAU,CAAC;AAuChG,MAAM,UAAU,wBAAwB,CAAC,KAAa;IACpD,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAe,EAAE,QAAgB;IAChE,MAAM,UAAU,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;IACrD,OAAO,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,UAAU,OAAO,QAAQ,EAAE,CAAC;AAClG,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,OAAe,EAAE,QAA4B;IACtF,MAAM,UAAU,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;IACrD,OAAO,QAAQ,KAAK,oBAAoB;QACtC,CAAC,CAAC,uBAAuB,CAAC,UAAU,EAAE,UAAU,CAAC;QACjD,CAAC,CAAC,GAAG,UAAU,mBAAmB,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAe,EAAE,QAA4B;IAClF,MAAM,UAAU,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;IACrD,IAAI,QAAQ,KAAK,yBAAyB;QAAE,OAAO,CAAC,GAAG,UAAU,SAAS,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,uBAAuB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC1D,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,QAA4B,EAC5B,MAAc,EACd,MAAgD;IAEhD,OAAO;QACL,aAAa,EAAE,UAAU,MAAM,EAAE;QACjC,GAAG,CAAC,QAAQ,KAAK,oBAAoB,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,mBAAmB,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxG,cAAc,EAAE,kBAAkB;QAClC,MAAM,EAAE,MAAM;KACf,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAgC;IACnD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9F,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAgC,CAAC;IACzG,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAY,CAAC;QAC5C,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAiC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAAC,OAA0D;IAC3F,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,OAAO,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrF,OAAO,eAAe,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACpD,CAAC;IACD,OAAO;QACL,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;QAC/B,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACvC,IAAI,EAAE,UAAU;YAChB,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI;YAC5B,KAAK,EAAE,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;SACpD,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAqD;IAChF,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAA4B,CAAC;QACtE,OAAO,GAAG,MAAM,CAAC,EAAE,KAAK,KAAK,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,KAAK,CAAC;IAClB,CAAC;IACD,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,OAAO,CAAC,YAAY;QACjC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,QAA6B;IAItD,MAAM,MAAM,GAAG,QAAQ;SACpB,MAAM,CAAC,CAAC,OAAO,EAA6C,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC;SACzF,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;SACjC,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,MAAM,CAAC,CAAC;IAChB,MAAM,MAAM,GAAmF,EAAE,CAAC;IAClG,MAAM,MAAM,GAAG,CAAC,IAA0B,EAAE,OAAuC,EAAQ,EAAE;QAC3F,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,QAAQ,EAAE,IAAI,KAAK,IAAI;YAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;;YAC1D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC;IACF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ;YAAE,SAAS;QACxC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5B,MAAM,CAAC,MAAM,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC/C,SAAS;QACX,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,YAAY,IAAI,OAAO,EAAE,CAAC;YAC5D,MAAM,CAAC,WAAW,EAAE,yBAAyB,CAAC,OAAO,CAAC,CAAC,CAAC;YACxD,SAAS;QACX,CAAC;QACD,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC7D,CAAC;AAED,SAAS,cAAc,CAAC,KAAgC;IACtD,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC5F,CAAC,CAAC,IAAI,CAAC,QAAmC;YAC1C,CAAC,CAAC,IAAI,CAAC;QACT,IAAI,CAAC,EAAE,IAAI,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QAClD,OAAO,CAAC;gBACN,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,GAAG,CAAC,OAAO,EAAE,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9E,YAAY,EAAE,EAAE,CAAC,UAAU,IAAI,OAAO,EAAE,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC;oBAC/F,CAAC,CAAC,EAAE,CAAC,UAAU;oBACf,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;aACvC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAQ1C;IACC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,IAAI,KAAK,CAAC,QAAQ,KAAK,yBAAyB,EAAE,CAAC;QACjD,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,GAAG,KAAK,CAAC,UAAU;YACnB,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnF,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;SACnE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACxF,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,GAAG,UAAU;QACb,GAAG,UAAU;QACb,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5F,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAc;IAC9C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7E,MAAM,KAAK,GAAG,KAAgC,CAAC;IAC/C,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;IACvG,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3G,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;IACpF,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACzE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;IACzD,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAChG,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;IACnG,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC3C,IAAI,KAAK,KAAK,YAAY;QAAE,OAAO,QAAQ,CAAC;IAC5C,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAA4B,EAAE,KAAc;IACjF,IAAI,QAAQ,KAAK,yBAAyB,EAAE,CAAC;QAC3C,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAA0B,CAAC,CAAC,CAAC,EAAE,CAAC;IACvG,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAgC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrH,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAwC,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;IAC7H,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAgC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClH,OAAO,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrF,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1C,MAAM,KAAK,GAAG,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAgC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClH,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7F,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzF,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,MAAM,SAAS,GAAyB,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAChE,MAAM,KAAK,GAAG,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAgC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClH,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QAC3G,OAAO,CAAC;gBACN,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,IAAI,EAAE,UAAmB;gBACzB,QAAQ,EAAE;oBACR,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,SAAS,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC;iBACxC;aACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,OAAO;QACL,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;YACxF,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAgC,EAAE;YACtD,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,EAAE,CAAC;gBACR,aAAa,EAAE,qBAAqB,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAC1D,OAAO,EAAE;oBACP,OAAO,EAAE,IAAI,IAAI,IAAI;oBACrB,iBAAiB,EAAE,SAAS,IAAI,IAAI;oBACpC,UAAU,EAAE,SAAS;oBACrB,iBAAiB,EAAE,MAAM;iBAC1B;aACF,CAAC;KACH,CAAC;AACJ,CAAC"}