@tickernelz/paperclip-pro-adapter-claude-local 2026.925.0

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.
Files changed (206) hide show
  1. package/LICENSE +22 -0
  2. package/dist/cli/format-event.d.ts +2 -0
  3. package/dist/cli/format-event.d.ts.map +1 -0
  4. package/dist/cli/format-event.js +141 -0
  5. package/dist/cli/format-event.js.map +1 -0
  6. package/dist/cli/index.d.ts +2 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/index.js +2 -0
  9. package/dist/cli/index.js.map +1 -0
  10. package/dist/cli/quota-probe.d.ts +3 -0
  11. package/dist/cli/quota-probe.d.ts.map +1 -0
  12. package/dist/cli/quota-probe.js +106 -0
  13. package/dist/cli/quota-probe.js.map +1 -0
  14. package/dist/index.d.ts +13 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +90 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/index.test.d.ts +2 -0
  19. package/dist/index.test.d.ts.map +1 -0
  20. package/dist/index.test.js +35 -0
  21. package/dist/index.test.js.map +1 -0
  22. package/dist/server/acp.auth.test.d.ts +2 -0
  23. package/dist/server/acp.auth.test.d.ts.map +1 -0
  24. package/dist/server/acp.auth.test.js +581 -0
  25. package/dist/server/acp.auth.test.js.map +1 -0
  26. package/dist/server/acp.d.ts +68 -0
  27. package/dist/server/acp.d.ts.map +1 -0
  28. package/dist/server/acp.js +779 -0
  29. package/dist/server/acp.js.map +1 -0
  30. package/dist/server/acp.quota.test.d.ts +2 -0
  31. package/dist/server/acp.quota.test.d.ts.map +1 -0
  32. package/dist/server/acp.quota.test.js +114 -0
  33. package/dist/server/acp.quota.test.js.map +1 -0
  34. package/dist/server/acp.test.d.ts +2 -0
  35. package/dist/server/acp.test.d.ts.map +1 -0
  36. package/dist/server/acp.test.js +1153 -0
  37. package/dist/server/acp.test.js.map +1 -0
  38. package/dist/server/auth-check.d.ts +8 -0
  39. package/dist/server/auth-check.d.ts.map +1 -0
  40. package/dist/server/auth-check.js +8 -0
  41. package/dist/server/auth-check.js.map +1 -0
  42. package/dist/server/claude-config.d.ts +49 -0
  43. package/dist/server/claude-config.d.ts.map +1 -0
  44. package/dist/server/claude-config.js +279 -0
  45. package/dist/server/claude-config.js.map +1 -0
  46. package/dist/server/claude-config.test.d.ts +2 -0
  47. package/dist/server/claude-config.test.d.ts.map +1 -0
  48. package/dist/server/claude-config.test.js +197 -0
  49. package/dist/server/claude-config.test.js.map +1 -0
  50. package/dist/server/cli-capabilities.d.ts +26 -0
  51. package/dist/server/cli-capabilities.d.ts.map +1 -0
  52. package/dist/server/cli-capabilities.js +115 -0
  53. package/dist/server/cli-capabilities.js.map +1 -0
  54. package/dist/server/config-schema.d.ts +3 -0
  55. package/dist/server/config-schema.d.ts.map +1 -0
  56. package/dist/server/config-schema.js +67 -0
  57. package/dist/server/config-schema.js.map +1 -0
  58. package/dist/server/engine-availability.test.d.ts +2 -0
  59. package/dist/server/engine-availability.test.d.ts.map +1 -0
  60. package/dist/server/engine-availability.test.js +41 -0
  61. package/dist/server/engine-availability.test.js.map +1 -0
  62. package/dist/server/execute.acp-fallback.test.d.ts +2 -0
  63. package/dist/server/execute.acp-fallback.test.d.ts.map +1 -0
  64. package/dist/server/execute.acp-fallback.test.js +104 -0
  65. package/dist/server/execute.acp-fallback.test.js.map +1 -0
  66. package/dist/server/execute.d.ts +23 -0
  67. package/dist/server/execute.d.ts.map +1 -0
  68. package/dist/server/execute.js +1089 -0
  69. package/dist/server/execute.js.map +1 -0
  70. package/dist/server/execute.remote.test.d.ts +2 -0
  71. package/dist/server/execute.remote.test.d.ts.map +1 -0
  72. package/dist/server/execute.remote.test.js +484 -0
  73. package/dist/server/execute.remote.test.js.map +1 -0
  74. package/dist/server/index.d.ts +16 -0
  75. package/dist/server/index.d.ts.map +1 -0
  76. package/dist/server/index.js +84 -0
  77. package/dist/server/index.js.map +1 -0
  78. package/dist/server/models.d.ts +13 -0
  79. package/dist/server/models.d.ts.map +1 -0
  80. package/dist/server/models.js +153 -0
  81. package/dist/server/models.js.map +1 -0
  82. package/dist/server/parse.d.ts +58 -0
  83. package/dist/server/parse.d.ts.map +1 -0
  84. package/dist/server/parse.js +459 -0
  85. package/dist/server/parse.js.map +1 -0
  86. package/dist/server/parse.test.d.ts +2 -0
  87. package/dist/server/parse.test.d.ts.map +1 -0
  88. package/dist/server/parse.test.js +419 -0
  89. package/dist/server/parse.test.js.map +1 -0
  90. package/dist/server/permissions.d.ts +14 -0
  91. package/dist/server/permissions.d.ts.map +1 -0
  92. package/dist/server/permissions.js +13 -0
  93. package/dist/server/permissions.js.map +1 -0
  94. package/dist/server/permissions.test.d.ts +2 -0
  95. package/dist/server/permissions.test.d.ts.map +1 -0
  96. package/dist/server/permissions.test.js +22 -0
  97. package/dist/server/permissions.test.js.map +1 -0
  98. package/dist/server/probe-diagnostics.d.ts +102 -0
  99. package/dist/server/probe-diagnostics.d.ts.map +1 -0
  100. package/dist/server/probe-diagnostics.js +140 -0
  101. package/dist/server/probe-diagnostics.js.map +1 -0
  102. package/dist/server/probe-diagnostics.test.d.ts +2 -0
  103. package/dist/server/probe-diagnostics.test.d.ts.map +1 -0
  104. package/dist/server/probe-diagnostics.test.js +114 -0
  105. package/dist/server/probe-diagnostics.test.js.map +1 -0
  106. package/dist/server/probe-env.d.ts +42 -0
  107. package/dist/server/probe-env.d.ts.map +1 -0
  108. package/dist/server/probe-env.js +149 -0
  109. package/dist/server/probe-env.js.map +1 -0
  110. package/dist/server/probe-env.test.d.ts +2 -0
  111. package/dist/server/probe-env.test.d.ts.map +1 -0
  112. package/dist/server/probe-env.test.js +135 -0
  113. package/dist/server/probe-env.test.js.map +1 -0
  114. package/dist/server/probe-redaction.test.d.ts +2 -0
  115. package/dist/server/probe-redaction.test.d.ts.map +1 -0
  116. package/dist/server/probe-redaction.test.js +86 -0
  117. package/dist/server/probe-redaction.test.js.map +1 -0
  118. package/dist/server/prompt-cache.d.ts +17 -0
  119. package/dist/server/prompt-cache.d.ts.map +1 -0
  120. package/dist/server/prompt-cache.js +126 -0
  121. package/dist/server/prompt-cache.js.map +1 -0
  122. package/dist/server/quota-keychain.test.d.ts +2 -0
  123. package/dist/server/quota-keychain.test.d.ts.map +1 -0
  124. package/dist/server/quota-keychain.test.js +83 -0
  125. package/dist/server/quota-keychain.test.js.map +1 -0
  126. package/dist/server/quota.d.ts +30 -0
  127. package/dist/server/quota.d.ts.map +1 -0
  128. package/dist/server/quota.js +543 -0
  129. package/dist/server/quota.js.map +1 -0
  130. package/dist/server/setup-token-characterization.test.d.ts +2 -0
  131. package/dist/server/setup-token-characterization.test.d.ts.map +1 -0
  132. package/dist/server/setup-token-characterization.test.js +123 -0
  133. package/dist/server/setup-token-characterization.test.js.map +1 -0
  134. package/dist/server/setup-token-parse.d.ts +47 -0
  135. package/dist/server/setup-token-parse.d.ts.map +1 -0
  136. package/dist/server/setup-token-parse.js +506 -0
  137. package/dist/server/setup-token-parse.js.map +1 -0
  138. package/dist/server/setup-token-parse.test.d.ts +2 -0
  139. package/dist/server/setup-token-parse.test.d.ts.map +1 -0
  140. package/dist/server/setup-token-parse.test.js +587 -0
  141. package/dist/server/setup-token-parse.test.js.map +1 -0
  142. package/dist/server/setup-token-runner.d.ts +115 -0
  143. package/dist/server/setup-token-runner.d.ts.map +1 -0
  144. package/dist/server/setup-token-runner.js +317 -0
  145. package/dist/server/setup-token-runner.js.map +1 -0
  146. package/dist/server/setup-token-runner.test.d.ts +2 -0
  147. package/dist/server/setup-token-runner.test.d.ts.map +1 -0
  148. package/dist/server/setup-token-runner.test.js +336 -0
  149. package/dist/server/setup-token-runner.test.js.map +1 -0
  150. package/dist/server/skills.d.ts +8 -0
  151. package/dist/server/skills.d.ts.map +1 -0
  152. package/dist/server/skills.js +42 -0
  153. package/dist/server/skills.js.map +1 -0
  154. package/dist/server/test.d.ts +3 -0
  155. package/dist/server/test.d.ts.map +1 -0
  156. package/dist/server/test.js +434 -0
  157. package/dist/server/test.js.map +1 -0
  158. package/dist/server/test.probe.test.d.ts +2 -0
  159. package/dist/server/test.probe.test.d.ts.map +1 -0
  160. package/dist/server/test.probe.test.js +608 -0
  161. package/dist/server/test.probe.test.js.map +1 -0
  162. package/dist/server/test.remote.test.d.ts +2 -0
  163. package/dist/server/test.remote.test.d.ts.map +1 -0
  164. package/dist/server/test.remote.test.js +149 -0
  165. package/dist/server/test.remote.test.js.map +1 -0
  166. package/dist/ui/build-config.d.ts +3 -0
  167. package/dist/ui/build-config.d.ts.map +1 -0
  168. package/dist/ui/build-config.js +76 -0
  169. package/dist/ui/build-config.js.map +1 -0
  170. package/dist/ui/build-config.test.d.ts +2 -0
  171. package/dist/ui/build-config.test.d.ts.map +1 -0
  172. package/dist/ui/build-config.test.js +68 -0
  173. package/dist/ui/build-config.test.js.map +1 -0
  174. package/dist/ui/index.d.ts +3 -0
  175. package/dist/ui/index.d.ts.map +1 -0
  176. package/dist/ui/index.js +3 -0
  177. package/dist/ui/index.js.map +1 -0
  178. package/dist/ui/parse-stdout.d.ts +3 -0
  179. package/dist/ui/parse-stdout.d.ts.map +1 -0
  180. package/dist/ui/parse-stdout.js +153 -0
  181. package/dist/ui/parse-stdout.js.map +1 -0
  182. package/package.json +63 -0
  183. package/skills/agentmail/SKILL.md +70 -0
  184. package/skills/paperclip/SKILL.md +712 -0
  185. package/skills/paperclip/references/api-reference.md +1675 -0
  186. package/skills/paperclip/references/artifacts.md +158 -0
  187. package/skills/paperclip/references/cases.md +295 -0
  188. package/skills/paperclip/references/company-skills.md +266 -0
  189. package/skills/paperclip/references/issue-workspaces.md +80 -0
  190. package/skills/paperclip/references/routines.md +231 -0
  191. package/skills/paperclip/references/workflows.md +141 -0
  192. package/skills/paperclip/scripts/paperclip-upload-artifact.sh +592 -0
  193. package/skills/paperclip-board/SKILL.md +619 -0
  194. package/skills/paperclip-converting-plans-to-tasks/SKILL.md +60 -0
  195. package/skills/paperclip-create-agent/SKILL.md +179 -0
  196. package/skills/paperclip-create-agent/references/agent-instruction-templates.md +123 -0
  197. package/skills/paperclip-create-agent/references/agents/coder.md +64 -0
  198. package/skills/paperclip-create-agent/references/agents/qa.md +88 -0
  199. package/skills/paperclip-create-agent/references/agents/securityengineer.md +135 -0
  200. package/skills/paperclip-create-agent/references/agents/uxdesigner.md +115 -0
  201. package/skills/paperclip-create-agent/references/api-reference.md +110 -0
  202. package/skills/paperclip-create-agent/references/baseline-role-guide.md +168 -0
  203. package/skills/paperclip-create-agent/references/draft-review-checklist.md +95 -0
  204. package/skills/para-memory-files/SKILL.md +100 -0
  205. package/skills/para-memory-files/references/schemas.md +35 -0
  206. package/skills/slack/SKILL.md +65 -0
@@ -0,0 +1,581 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { chmod, mkdtemp, rm, writeFile } from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ // A shared handle so each test can set the stub Claude hello-probe output the
6
+ // sandbox runner returns.
7
+ const { runAdapterExecutionTargetProcess, probeResult } = vi.hoisted(() => {
8
+ const probeResult = {
9
+ value: { exitCode: 1, stdout: "", stderr: "", timedOut: false },
10
+ throwError: null,
11
+ };
12
+ return {
13
+ probeResult,
14
+ runAdapterExecutionTargetProcess: vi.fn(async () => {
15
+ if (probeResult.throwError)
16
+ throw probeResult.throwError;
17
+ return {
18
+ exitCode: probeResult.value.exitCode,
19
+ signal: null,
20
+ timedOut: probeResult.value.timedOut,
21
+ stdout: probeResult.value.stdout,
22
+ stderr: probeResult.value.stderr,
23
+ pid: 321,
24
+ startedAt: new Date().toISOString(),
25
+ };
26
+ }),
27
+ };
28
+ });
29
+ vi.mock("@tickernelz/paperclip-pro-adapter-utils/execution-target", async () => {
30
+ const actual = await vi.importActual("@tickernelz/paperclip-pro-adapter-utils/execution-target");
31
+ return {
32
+ ...actual,
33
+ runAdapterExecutionTargetProcess,
34
+ };
35
+ });
36
+ import { mapClaudeAcpAuthErrorCode, probeClaudeAcpSandboxLogin, testClaudeAcpEnvironment, } from "./acp.js";
37
+ import { ADAPTER_AUTH_MISSING_CHECK_CODE } from "./auth-check.js";
38
+ const sandboxTarget = {
39
+ kind: "remote",
40
+ transport: "sandbox",
41
+ providerKey: "daytona",
42
+ remoteCwd: "/home/daytona/paperclip-workspace",
43
+ runner: {
44
+ execute: async () => ({
45
+ exitCode: 0,
46
+ signal: null,
47
+ timedOut: false,
48
+ stdout: "",
49
+ stderr: "",
50
+ pid: null,
51
+ startedAt: new Date().toISOString(),
52
+ }),
53
+ },
54
+ };
55
+ const initLine = '{"type":"system","subtype":"init","cwd":"/home/daytona/paperclip-workspace","session_id":"abc","tools":["Bash","Read"]}';
56
+ const loginRequiredStdout = [
57
+ initLine,
58
+ '{"type":"result","subtype":"error_during_execution","is_error":true,"result":"Please run `claude login` to authenticate.","session_id":"abc"}',
59
+ ].join("\n");
60
+ const helloStdout = [
61
+ initLine,
62
+ '{"type":"result","subtype":"success","is_error":false,"result":"hello","session_id":"abc"}',
63
+ ].join("\n");
64
+ // The real Claude CLI output for CLAUDE_CODE_OAUTH_TOKEN=invalid. The probe
65
+ // exits non-zero and the result event reports a 401 authentication failure with
66
+ // an "Invalid bearer token" message. A synthetic bearer marker rides along on a
67
+ // retry line, so the test can prove the raw probe text never reaches a check.
68
+ const invalidTokenMarker = "SUPERSECRETbearerMARKER";
69
+ const invalidTokenStdout = [
70
+ initLine,
71
+ `{"type":"system","subtype":"api_retry","attempt":1,"error_status":401,"error":"authentication_failed: bearer ${invalidTokenMarker} is invalid","session_id":"abc"}`,
72
+ '{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"Failed to authenticate. API Error: 401 Invalid bearer token"}]},"session_id":"abc","error":"authentication_failed"}',
73
+ '{"type":"result","subtype":"success","is_error":true,"api_error_status":401,"error":"authentication_failed","result":"Failed to authenticate. API Error: 401 Invalid bearer token","session_id":"abc"}',
74
+ ].join("\n");
75
+ afterEach(() => {
76
+ vi.clearAllMocks();
77
+ probeResult.value = { exitCode: 1, stdout: "", stderr: "", timedOut: false };
78
+ probeResult.throwError = null;
79
+ });
80
+ describe("mapClaudeAcpAuthErrorCode", () => {
81
+ it("translates the generic acpx_auth_required code into claude_auth_required", () => {
82
+ const engineResult = {
83
+ exitCode: 1,
84
+ signal: null,
85
+ timedOut: false,
86
+ errorMessage: "Claude requires login.",
87
+ errorCode: "acpx_auth_required",
88
+ errorMeta: { category: "auth", errorName: "Error" },
89
+ };
90
+ const mapped = mapClaudeAcpAuthErrorCode(engineResult);
91
+ // The user interface run gate reads claude_auth_required to show the login
92
+ // affordance on the default ACP path.
93
+ expect(mapped.errorCode).toBe("claude_auth_required");
94
+ // The mapping keeps every other field so diagnostics stay intact.
95
+ expect(mapped.errorMessage).toBe("Claude requires login.");
96
+ expect(mapped.errorMeta).toEqual({ category: "auth", errorName: "Error" });
97
+ });
98
+ it("leaves a different error code unchanged", () => {
99
+ const engineResult = {
100
+ exitCode: 1,
101
+ signal: null,
102
+ timedOut: false,
103
+ errorCode: "acpx_runtime_error",
104
+ };
105
+ expect(mapClaudeAcpAuthErrorCode(engineResult).errorCode).toBe("acpx_runtime_error");
106
+ });
107
+ it("leaves a null error code unchanged", () => {
108
+ const engineResult = {
109
+ exitCode: 0,
110
+ signal: null,
111
+ timedOut: false,
112
+ errorCode: null,
113
+ };
114
+ expect(mapClaudeAcpAuthErrorCode(engineResult).errorCode).toBeNull();
115
+ });
116
+ });
117
+ describe("probeClaudeAcpSandboxLogin", () => {
118
+ it("emits the canonical adapter_auth_missing check when the sandbox probe reports missing auth", async () => {
119
+ probeResult.value = { exitCode: 1, stdout: loginRequiredStdout, stderr: "", timedOut: false };
120
+ const checks = await probeClaudeAcpSandboxLogin({
121
+ config: { engine: "acp" },
122
+ target: sandboxTarget,
123
+ });
124
+ expect(checks.some((check) => check.code === ADAPTER_AUTH_MISSING_CHECK_CODE)).toBe(true);
125
+ // The descriptive check stays for diagnostics.
126
+ expect(checks.some((check) => check.code === "claude_hello_probe_auth_required")).toBe(true);
127
+ // A missing-auth probe is a warning, not a failure, so the environment stays
128
+ // testable and the user interface can offer login.
129
+ expect(checks.every((check) => check.level === "warn")).toBe(true);
130
+ });
131
+ it("classifies an invalid or expired token as adapter_auth_missing without leaking the token", async () => {
132
+ probeResult.value = { exitCode: 1, stdout: invalidTokenStdout, stderr: "", timedOut: false };
133
+ const checks = await probeClaudeAcpSandboxLogin({
134
+ config: { engine: "acp" },
135
+ target: sandboxTarget,
136
+ });
137
+ // An auth failure returns the canonical login gate code, not the
138
+ // probe-could-not-run code.
139
+ expect(checks.some((check) => check.code === ADAPTER_AUTH_MISSING_CHECK_CODE)).toBe(true);
140
+ expect(checks.some((check) => check.code === "claude_hello_probe_auth_required")).toBe(true);
141
+ expect(checks.some((check) => check.code === "claude_acp_login_probe_unavailable")).toBe(false);
142
+ // The raw probe text, including the bearer marker, never reaches a check.
143
+ expect(JSON.stringify(checks)).not.toContain(invalidTokenMarker);
144
+ });
145
+ it("does not flag a healthy probe whose assistant text repeats a token phrase", async () => {
146
+ // A healthy run prints an auth phrase in its answer text. The parsed result
147
+ // is a success, so the probe stays healthy and offers no login gate.
148
+ probeResult.value = {
149
+ exitCode: 0,
150
+ stdout: [
151
+ initLine,
152
+ '{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"hello — note authentication_failed means an invalid bearer token"}]},"session_id":"abc"}',
153
+ '{"type":"result","subtype":"success","is_error":false,"result":"hello","session_id":"abc"}',
154
+ ].join("\n"),
155
+ stderr: "",
156
+ timedOut: false,
157
+ };
158
+ const checks = await probeClaudeAcpSandboxLogin({
159
+ config: { engine: "acp" },
160
+ target: sandboxTarget,
161
+ });
162
+ // The parsed result is a success, so no login gate and no probe-unavailable
163
+ // check appears.
164
+ expect(checks).toEqual([]);
165
+ });
166
+ it("keeps a non-auth failed probe with a token phrase on the probe-unavailable path", async () => {
167
+ // The probe fails on a transient upstream error and prints an auth phrase in
168
+ // its assistant text. The parsed result is not an auth failure, so the probe
169
+ // stays on the neutral probe-unavailable code, not the login gate.
170
+ probeResult.value = {
171
+ exitCode: 1,
172
+ stdout: [
173
+ initLine,
174
+ '{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"authentication_failed: the bearer token is invalid"}]},"session_id":"abc"}',
175
+ '{"type":"result","subtype":"error_during_execution","is_error":true,"result":"API Error: 503 service unavailable","session_id":"abc"}',
176
+ ].join("\n"),
177
+ stderr: "",
178
+ timedOut: false,
179
+ };
180
+ const checks = await probeClaudeAcpSandboxLogin({
181
+ config: { engine: "acp" },
182
+ target: sandboxTarget,
183
+ });
184
+ expect(checks.some((check) => check.code === ADAPTER_AUTH_MISSING_CHECK_CODE)).toBe(false);
185
+ expect(checks.some((check) => check.code === "claude_acp_login_probe_unavailable")).toBe(true);
186
+ });
187
+ it("never renders an untrusted login URL with sensitive query or fragment text", async () => {
188
+ // The sandbox prints a login-required line that carries a malicious URL. The
189
+ // URL has a non-allowlisted host, a query, and a fragment, each with a
190
+ // marker. The normalizer must reject the URL, so no marker reaches a check.
191
+ probeResult.value = {
192
+ exitCode: 1,
193
+ stdout: [
194
+ initLine,
195
+ '{"type":"result","subtype":"error_during_execution","is_error":true,"result":"Please run `claude login`. Visit https://evil.example.com/claude-login?leak=SECRETQUERYmarker#SECRETFRAGmarker","session_id":"abc"}',
196
+ ].join("\n"),
197
+ stderr: "",
198
+ timedOut: false,
199
+ };
200
+ const checks = await probeClaudeAcpSandboxLogin({
201
+ config: { engine: "acp" },
202
+ target: sandboxTarget,
203
+ });
204
+ // The login-required checks still appear.
205
+ expect(checks.some((check) => check.code === "claude_hello_probe_auth_required")).toBe(true);
206
+ expect(checks.some((check) => check.code === ADAPTER_AUTH_MISSING_CHECK_CODE)).toBe(true);
207
+ const checkText = JSON.stringify(checks);
208
+ // No marker and no untrusted host reaches any check.
209
+ expect(checkText).not.toContain("SECRETQUERYmarker");
210
+ expect(checkText).not.toContain("SECRETFRAGmarker");
211
+ expect(checkText).not.toContain("evil.example.com");
212
+ // The hint falls back to the fixed `claude login` text.
213
+ const authRequired = checks.find((check) => check.code === "claude_hello_probe_auth_required");
214
+ expect(authRequired?.hint).toBe("Run `claude login` in this environment, then retry the probe.");
215
+ });
216
+ it("emits no checks when the sandbox probe reports a healthy login", async () => {
217
+ probeResult.value = { exitCode: 0, stdout: helloStdout, stderr: "", timedOut: false };
218
+ const checks = await probeClaudeAcpSandboxLogin({
219
+ config: { engine: "acp" },
220
+ target: sandboxTarget,
221
+ });
222
+ expect(checks).toEqual([]);
223
+ });
224
+ it("emits a distinct warn check, not a silent pass, when the probe cannot run", async () => {
225
+ probeResult.throwError = new Error("claude command not found");
226
+ const checks = await probeClaudeAcpSandboxLogin({
227
+ config: { engine: "acp" },
228
+ target: sandboxTarget,
229
+ });
230
+ // A probe that cannot run must not report a success. It emits a distinct
231
+ // warn check that is NOT the login affordance code.
232
+ expect(checks).toHaveLength(1);
233
+ expect(checks[0]?.code).toBe("claude_acp_login_probe_unavailable");
234
+ expect(checks[0]?.level).toBe("warn");
235
+ expect(checks.some((check) => check.code === ADAPTER_AUTH_MISSING_CHECK_CODE)).toBe(false);
236
+ });
237
+ it("emits a distinct warn check when the probe times out", async () => {
238
+ probeResult.value = { exitCode: null, stdout: "", stderr: "", timedOut: true };
239
+ const checks = await probeClaudeAcpSandboxLogin({
240
+ config: { engine: "acp" },
241
+ target: sandboxTarget,
242
+ });
243
+ expect(checks).toHaveLength(1);
244
+ expect(checks[0]?.code).toBe("claude_acp_login_probe_unavailable");
245
+ expect(checks[0]?.level).toBe("warn");
246
+ expect(checks.some((check) => check.code === ADAPTER_AUTH_MISSING_CHECK_CODE)).toBe(false);
247
+ });
248
+ it("emits a distinct warn check when the probe runs but does not complete", async () => {
249
+ // The probe ran, login is not detected, and the exit code is non-zero. This
250
+ // is not a healthy login, so it must not be a silent pass.
251
+ probeResult.value = {
252
+ exitCode: 1,
253
+ stdout: initLine,
254
+ stderr: "unexpected sandbox error",
255
+ timedOut: false,
256
+ };
257
+ const checks = await probeClaudeAcpSandboxLogin({
258
+ config: { engine: "acp" },
259
+ target: sandboxTarget,
260
+ });
261
+ expect(checks).toHaveLength(1);
262
+ expect(checks[0]?.code).toBe("claude_acp_login_probe_unavailable");
263
+ expect(checks[0]?.level).toBe("warn");
264
+ });
265
+ it("never copies a thrown probe error into a Test-result check or the log", async () => {
266
+ // A sandbox transport failure can carry a credential. Inject an opaque
267
+ // credential marker and a proxy marker through the thrown error, then assert
268
+ // no check text and no log call repeats either one.
269
+ const opaqueCredMarker = "OPAQUECREDMARKERnoshape";
270
+ const proxyMarker = "http://user:pass@proxy.corp.internal:3128";
271
+ probeResult.throwError = new Error(`transport failed with ${opaqueCredMarker} via ${proxyMarker}`);
272
+ const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => { });
273
+ const checks = await probeClaudeAcpSandboxLogin({
274
+ config: { engine: "acp" },
275
+ target: sandboxTarget,
276
+ });
277
+ const checkText = JSON.stringify(checks);
278
+ expect(checkText).not.toContain(opaqueCredMarker);
279
+ expect(checkText).not.toContain("proxy.corp.internal");
280
+ expect(checks[0]?.code).toBe("claude_acp_login_probe_unavailable");
281
+ // The log carries only the fixed context, the allowlisted classification,
282
+ // and a safe error class name. It never repeats the raw error text.
283
+ expect(warnSpy).toHaveBeenCalledTimes(1);
284
+ const loggedText = JSON.stringify(warnSpy.mock.calls);
285
+ expect(loggedText).not.toContain(opaqueCredMarker);
286
+ expect(loggedText).not.toContain("proxy.corp.internal");
287
+ expect(warnSpy.mock.calls[0]?.[1]).toMatchObject({
288
+ classification: "spawn_error",
289
+ errorClass: "Error",
290
+ });
291
+ warnSpy.mockRestore();
292
+ });
293
+ it("never copies raw probe stderr or stdout into a Test-result check or the log", async () => {
294
+ // A non-zero probe can print an opaque credential to stdout and a proxy URL
295
+ // to stderr. Inject one marker in each stream and assert neither reaches a
296
+ // check or the log.
297
+ const opaqueCredMarker = "OPAQUECREDMARKERstream";
298
+ const proxyMarker = "http://user:pass@proxy.corp.internal:3128";
299
+ probeResult.value = {
300
+ exitCode: 2,
301
+ stdout: [initLine, `note: ${opaqueCredMarker}`].join("\n"),
302
+ stderr: `fatal: proxy connect failed ${proxyMarker}`,
303
+ timedOut: false,
304
+ };
305
+ const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => { });
306
+ const checks = await probeClaudeAcpSandboxLogin({
307
+ config: { engine: "acp" },
308
+ target: sandboxTarget,
309
+ });
310
+ const checkText = JSON.stringify(checks);
311
+ expect(checkText).not.toContain(opaqueCredMarker);
312
+ expect(checkText).not.toContain("proxy.corp.internal");
313
+ expect(checks[0]?.code).toBe("claude_acp_login_probe_unavailable");
314
+ // The log carries only the fixed context, the allowlisted classification,
315
+ // and the safe exit code. It never repeats the raw stream text.
316
+ expect(warnSpy).toHaveBeenCalledTimes(1);
317
+ const loggedText = JSON.stringify(warnSpy.mock.calls);
318
+ expect(loggedText).not.toContain(opaqueCredMarker);
319
+ expect(loggedText).not.toContain("proxy.corp.internal");
320
+ expect(warnSpy.mock.calls[0]?.[1]).toMatchObject({
321
+ classification: "nonzero_exit",
322
+ exitCode: 2,
323
+ });
324
+ warnSpy.mockRestore();
325
+ });
326
+ });
327
+ describe("Claude ACP hello probe on local and SSH targets", () => {
328
+ const sshTarget = {
329
+ kind: "remote",
330
+ transport: "ssh",
331
+ remoteCwd: "/home/user/paperclip-workspace",
332
+ spec: { host: "example.com", port: 22, username: "user" },
333
+ };
334
+ // Clear the host proxy and host auth variables so a local probe reads a
335
+ // deterministic env regardless of the machine that runs the suite.
336
+ const CLEARED_HOST_ENV_KEYS = [
337
+ "HTTP_PROXY",
338
+ "HTTPS_PROXY",
339
+ "NO_PROXY",
340
+ "http_proxy",
341
+ "https_proxy",
342
+ "no_proxy",
343
+ "ANTHROPIC_API_KEY",
344
+ "CLAUDE_CODE_OAUTH_TOKEN",
345
+ "ANTHROPIC_AUTH_TOKEN",
346
+ "CLAUDE_CONFIG_DIR",
347
+ "CLAUDE_CODE_USE_BEDROCK",
348
+ "ANTHROPIC_BEDROCK_BASE_URL",
349
+ ];
350
+ let tempDir = null;
351
+ let claudePath = "";
352
+ let savedPath;
353
+ let savedEnv = {};
354
+ beforeEach(async () => {
355
+ tempDir = await mkdtemp(path.join(os.tmpdir(), "paperclip-acp-localprobe-"));
356
+ claudePath = path.join(tempDir, "claude");
357
+ await writeFile(claudePath, "#!/bin/sh\nexit 0\n");
358
+ await chmod(claudePath, 0o755);
359
+ savedPath = process.env.PATH;
360
+ process.env.PATH = tempDir;
361
+ savedEnv = {};
362
+ for (const key of CLEARED_HOST_ENV_KEYS) {
363
+ savedEnv[key] = process.env[key];
364
+ delete process.env[key];
365
+ }
366
+ });
367
+ afterEach(async () => {
368
+ process.env.PATH = savedPath;
369
+ for (const [key, value] of Object.entries(savedEnv)) {
370
+ if (value === undefined)
371
+ delete process.env[key];
372
+ else
373
+ process.env[key] = value;
374
+ }
375
+ if (tempDir)
376
+ await rm(tempDir, { recursive: true, force: true }).catch(() => undefined);
377
+ tempDir = null;
378
+ });
379
+ it("emits an explicit OAuth-token check on the ACP lane when CLAUDE_CODE_OAUTH_TOKEN is set", async () => {
380
+ probeResult.value = { exitCode: 0, stdout: helloStdout, stderr: "", timedOut: false };
381
+ const result = await testClaudeAcpEnvironment({
382
+ companyId: "company-1",
383
+ adapterType: "claude_local",
384
+ config: { engine: "acp", env: { CLAUDE_CODE_OAUTH_TOKEN: "oauth-token-secret" } },
385
+ executionTarget: null,
386
+ environmentName: null,
387
+ });
388
+ expect(result.checks.some((check) => check.code === "claude_oauth_token_configured")).toBe(true);
389
+ // Every result names the target it probed, including the host case.
390
+ expect(result.checks.some((check) => check.code === "claude_environment_target")).toBe(true);
391
+ // The token value never enters a check.
392
+ expect(JSON.stringify(result.checks)).not.toContain("oauth-token-secret");
393
+ });
394
+ it("runs on a local target and reports auth-required without the sandbox-only adapter_auth_missing", async () => {
395
+ probeResult.value = { exitCode: 1, stdout: loginRequiredStdout, stderr: "", timedOut: false };
396
+ const checks = await probeClaudeAcpSandboxLogin({ config: { engine: "acp" }, target: null });
397
+ expect(checks.some((check) => check.code === "claude_hello_probe_auth_required")).toBe(true);
398
+ expect(checks.some((check) => check.code === ADAPTER_AUTH_MISSING_CHECK_CODE)).toBe(false);
399
+ });
400
+ it("runs on an SSH target and reports auth-required without adapter_auth_missing", async () => {
401
+ probeResult.value = { exitCode: 1, stdout: loginRequiredStdout, stderr: "", timedOut: false };
402
+ const checks = await probeClaudeAcpSandboxLogin({ config: { engine: "acp" }, target: sshTarget });
403
+ expect(checks.some((check) => check.code === "claude_hello_probe_auth_required")).toBe(true);
404
+ expect(checks.some((check) => check.code === ADAPTER_AUTH_MISSING_CHECK_CODE)).toBe(false);
405
+ });
406
+ it("spawns the trusted resolved claude and drops hostile caller env on a local probe", async () => {
407
+ probeResult.value = { exitCode: 0, stdout: helloStdout, stderr: "", timedOut: false };
408
+ process.env.HTTPS_PROXY = "http://trusted-proxy:8443";
409
+ await probeClaudeAcpSandboxLogin({
410
+ config: {
411
+ engine: "acp",
412
+ env: {
413
+ ANTHROPIC_API_KEY: "keep-this-key",
414
+ NODE_OPTIONS: "--require /hostile/evil.js",
415
+ PATH: "/hostile/bin",
416
+ LD_PRELOAD: "/hostile/evil.so",
417
+ HTTP_PROXY: "http://caller-proxy:8080",
418
+ },
419
+ },
420
+ target: null,
421
+ });
422
+ expect(runAdapterExecutionTargetProcess).toHaveBeenCalledTimes(1);
423
+ const call = runAdapterExecutionTargetProcess.mock.calls[0];
424
+ const spawnedCommand = call[2];
425
+ const spawnedEnv = call[4].env;
426
+ // The trusted resolved claude executable, never the caller command path.
427
+ expect(spawnedCommand).toBe(claudePath);
428
+ // The approved key reaches the child; the hostile keys never do.
429
+ expect(spawnedEnv.ANTHROPIC_API_KEY).toBe("keep-this-key");
430
+ expect(spawnedEnv.NODE_OPTIONS).toBeUndefined();
431
+ expect(spawnedEnv.PATH).toBeUndefined();
432
+ expect(spawnedEnv.LD_PRELOAD).toBeUndefined();
433
+ expect(spawnedEnv.HTTP_PROXY).toBeUndefined();
434
+ // The trusted proxy reaches the child; the caller proxy never does.
435
+ expect(spawnedEnv.HTTPS_PROXY).toBe("http://trusted-proxy:8443");
436
+ expect(JSON.stringify(spawnedEnv)).not.toContain("caller-proxy");
437
+ });
438
+ it("reports an explicitly selected API key as normal authentication on the ACP lane", async () => {
439
+ const result = await testClaudeAcpEnvironment({
440
+ companyId: "company-1",
441
+ adapterType: "claude_local",
442
+ config: { engine: "acp", agentCommand: process.execPath, env: { ANTHROPIC_API_KEY: "selected-test-key" } },
443
+ executionTarget: null,
444
+ environmentName: null,
445
+ });
446
+ expect(result.status).toBe("pass");
447
+ expect(result.checks).toContainEqual(expect.objectContaining({
448
+ code: "claude_acp_anthropic_api_key_detected",
449
+ level: "info",
450
+ message: "Using the selected Claude API connection.",
451
+ hint: undefined,
452
+ }));
453
+ expect(JSON.stringify(result.checks)).not.toContain("selected-test-key");
454
+ });
455
+ it("runs the host login probe with the host ANTHROPIC_API_KEY on a local target", async () => {
456
+ // A local ACP run inherits the host environment, so a host ANTHROPIC_API_KEY
457
+ // authenticates the real run. The Test lane runs the login probe with the
458
+ // same host key, so the probe env matches the credential the real run
459
+ // receives. The probe then reports a real result, not a false auth-required.
460
+ process.env.ANTHROPIC_API_KEY = "sk-ant-host-key";
461
+ probeResult.value = { exitCode: 0, stdout: helloStdout, stderr: "", timedOut: false };
462
+ const result = await testClaudeAcpEnvironment({
463
+ companyId: "company-1",
464
+ adapterType: "claude_local",
465
+ config: { engine: "acp" },
466
+ executionTarget: null,
467
+ environmentName: null,
468
+ });
469
+ // The probe runs once with the host key, so it authenticates and reports no
470
+ // false auth-required and no probe-unavailable check.
471
+ expect(runAdapterExecutionTargetProcess).toHaveBeenCalledTimes(1);
472
+ const call = runAdapterExecutionTargetProcess.mock.calls[0];
473
+ const spawnedEnv = call[4].env;
474
+ expect(spawnedEnv.ANTHROPIC_API_KEY).toBe("sk-ant-host-key");
475
+ expect(result.checks.some((check) => check.code === "claude_hello_probe_auth_required")).toBe(false);
476
+ expect(result.checks.some((check) => check.code === "claude_acp_login_probe_unavailable")).toBe(false);
477
+ // The lane still reports that API-key auth is in use.
478
+ expect(result.checks).toContainEqual(expect.objectContaining({
479
+ code: "claude_acp_anthropic_api_key_detected", level: "warn",
480
+ }));
481
+ // The host key value never enters a check.
482
+ expect(JSON.stringify(result.checks)).not.toContain("sk-ant-host-key");
483
+ });
484
+ it("runs the host login probe with the host CLAUDE_CODE_OAUTH_TOKEN on a local target", async () => {
485
+ // A local ACP run inherits the host environment, so a host subscription
486
+ // OAuth token authenticates the real run. The Test lane runs the login probe
487
+ // with the same host token, so the probe env matches the credential the real
488
+ // run receives. The probe then reports a real result, not a false
489
+ // auth-required.
490
+ process.env.CLAUDE_CODE_OAUTH_TOKEN = "oauth-host-token";
491
+ probeResult.value = { exitCode: 0, stdout: helloStdout, stderr: "", timedOut: false };
492
+ const result = await testClaudeAcpEnvironment({
493
+ companyId: "company-1",
494
+ adapterType: "claude_local",
495
+ config: { engine: "acp" },
496
+ executionTarget: null,
497
+ environmentName: null,
498
+ });
499
+ // The probe runs once with the host token, so it authenticates and reports
500
+ // no false auth-required and no probe-unavailable check.
501
+ expect(runAdapterExecutionTargetProcess).toHaveBeenCalledTimes(1);
502
+ const call = runAdapterExecutionTargetProcess.mock.calls[0];
503
+ const spawnedEnv = call[4].env;
504
+ expect(spawnedEnv.CLAUDE_CODE_OAUTH_TOKEN).toBe("oauth-host-token");
505
+ expect(result.checks.some((check) => check.code === "claude_hello_probe_auth_required")).toBe(false);
506
+ expect(result.checks.some((check) => check.code === "claude_acp_login_probe_unavailable")).toBe(false);
507
+ // The lane reports that the configured OAuth token is in use.
508
+ expect(result.checks.some((check) => check.code === "claude_oauth_token_configured")).toBe(true);
509
+ // The host token value never enters a check.
510
+ expect(JSON.stringify(result.checks)).not.toContain("oauth-host-token");
511
+ });
512
+ it("runs the host login probe with the host ANTHROPIC_AUTH_TOKEN on a local target", async () => {
513
+ // A local ACP run inherits the host environment, so a host bearer auth token
514
+ // authenticates the real run. The Test lane runs the login probe with the
515
+ // same host token, so the probe env matches the credential the real run
516
+ // receives. The probe then reports a real result, not a false auth-required.
517
+ process.env.ANTHROPIC_AUTH_TOKEN = "auth-host-token";
518
+ probeResult.value = { exitCode: 0, stdout: helloStdout, stderr: "", timedOut: false };
519
+ const result = await testClaudeAcpEnvironment({
520
+ companyId: "company-1",
521
+ adapterType: "claude_local",
522
+ config: { engine: "acp" },
523
+ executionTarget: null,
524
+ environmentName: null,
525
+ });
526
+ // The probe runs once with the host token, so it authenticates and reports
527
+ // no false auth-required and no probe-unavailable check.
528
+ expect(runAdapterExecutionTargetProcess).toHaveBeenCalledTimes(1);
529
+ const call = runAdapterExecutionTargetProcess.mock.calls[0];
530
+ const spawnedEnv = call[4].env;
531
+ expect(spawnedEnv.ANTHROPIC_AUTH_TOKEN).toBe("auth-host-token");
532
+ expect(result.checks.some((check) => check.code === "claude_hello_probe_auth_required")).toBe(false);
533
+ expect(result.checks.some((check) => check.code === "claude_acp_login_probe_unavailable")).toBe(false);
534
+ // The host token value never enters a check.
535
+ expect(JSON.stringify(result.checks)).not.toContain("auth-host-token");
536
+ });
537
+ it("runs the host login probe with the host CLAUDE_CONFIG_DIR on a local target", async () => {
538
+ // A local ACP run reads the stored Claude login from the host
539
+ // CLAUDE_CONFIG_DIR. The Test lane runs the login probe with the same host
540
+ // config dir, so the probe reads the same stored login the real run uses.
541
+ // The probe then reports a real result, not a false auth-required.
542
+ process.env.CLAUDE_CONFIG_DIR = "/host/claude/config";
543
+ probeResult.value = { exitCode: 0, stdout: helloStdout, stderr: "", timedOut: false };
544
+ const result = await testClaudeAcpEnvironment({
545
+ companyId: "company-1",
546
+ adapterType: "claude_local",
547
+ config: { engine: "acp" },
548
+ executionTarget: null,
549
+ environmentName: null,
550
+ });
551
+ // The probe runs once with the host config dir, so it reads the stored login
552
+ // and reports no false auth-required and no probe-unavailable check.
553
+ expect(runAdapterExecutionTargetProcess).toHaveBeenCalledTimes(1);
554
+ const call = runAdapterExecutionTargetProcess.mock.calls[0];
555
+ const spawnedEnv = call[4].env;
556
+ expect(spawnedEnv.CLAUDE_CONFIG_DIR).toBe("/host/claude/config");
557
+ expect(result.checks.some((check) => check.code === "claude_hello_probe_auth_required")).toBe(false);
558
+ expect(result.checks.some((check) => check.code === "claude_acp_login_probe_unavailable")).toBe(false);
559
+ });
560
+ it("never seeds the host ANTHROPIC_AUTH_TOKEN or CLAUDE_CONFIG_DIR on a remote target", async () => {
561
+ // A remote target does not inherit the host environment, so the probe keeps
562
+ // the deny-by-default env and never reads a host credential. The host token
563
+ // and host config dir must never reach the remote probe env.
564
+ process.env.ANTHROPIC_AUTH_TOKEN = "auth-host-token";
565
+ process.env.CLAUDE_CONFIG_DIR = "/host/claude/config";
566
+ probeResult.value = { exitCode: 0, stdout: helloStdout, stderr: "", timedOut: false };
567
+ await testClaudeAcpEnvironment({
568
+ companyId: "company-1",
569
+ adapterType: "claude_local",
570
+ config: { engine: "acp" },
571
+ executionTarget: sshTarget,
572
+ environmentName: null,
573
+ });
574
+ expect(runAdapterExecutionTargetProcess).toHaveBeenCalledTimes(1);
575
+ const call = runAdapterExecutionTargetProcess.mock.calls[0];
576
+ const spawnedEnv = call[4].env;
577
+ expect(spawnedEnv.ANTHROPIC_AUTH_TOKEN).toBeUndefined();
578
+ expect(spawnedEnv.CLAUDE_CONFIG_DIR).toBeUndefined();
579
+ });
580
+ });
581
+ //# sourceMappingURL=acp.auth.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp.auth.test.js","sourceRoot":"","sources":["../../src/server/acp.auth.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,8EAA8E;AAC9E,0BAA0B;AAC1B,MAAM,EAAE,gCAAgC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;IACxE,MAAM,WAAW,GAGb;QACF,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC/D,UAAU,EAAE,IAAI;KACjB,CAAC;IACF,OAAO;QACL,WAAW;QACX,gCAAgC,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;YACjD,IAAI,WAAW,CAAC,UAAU;gBAAE,MAAM,WAAW,CAAC,UAAU,CAAC;YACzD,OAAO;gBACL,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,QAAQ;gBACpC,MAAM,EAAE,IAAI;gBACZ,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,QAAQ;gBACpC,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM;gBAChC,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM;gBAChC,GAAG,EAAE,GAAG;gBACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;QACJ,CAAC,CAAC;KACH,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,IAAI,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;IAC7E,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,YAAY,CAClC,0DAA0D,CAC3D,CAAC;IACF,OAAO;QACL,GAAG,MAAM;QACT,gCAAgC;KACjC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,+BAA+B,EAAE,MAAM,iBAAiB,CAAC;AAElE,MAAM,aAAa,GAA2B;IAC5C,IAAI,EAAE,QAAQ;IACd,SAAS,EAAE,SAAS;IACpB,WAAW,EAAE,SAAS;IACtB,SAAS,EAAE,mCAAmC;IAC9C,MAAM,EAAE;QACN,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YACpB,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,EAAE;YACV,GAAG,EAAE,IAAI;YACT,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;KACH;CACF,CAAC;AAEF,MAAM,QAAQ,GACZ,yHAAyH,CAAC;AAE5H,MAAM,mBAAmB,GAAG;IAC1B,QAAQ;IACR,+IAA+I;CAChJ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,WAAW,GAAG;IAClB,QAAQ;IACR,4FAA4F;CAC7F,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,4EAA4E;AAC5E,gFAAgF;AAChF,gFAAgF;AAChF,8EAA8E;AAC9E,MAAM,kBAAkB,GAAG,yBAAyB,CAAC;AACrD,MAAM,kBAAkB,GAAG;IACzB,QAAQ;IACR,gHAAgH,kBAAkB,kCAAkC;IACpK,yMAAyM;IACzM,wMAAwM;CACzM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,SAAS,CAAC,GAAG,EAAE;IACb,EAAE,CAAC,aAAa,EAAE,CAAC;IACnB,WAAW,CAAC,KAAK,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC7E,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC;AAChC,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,MAAM,YAAY,GAA2B;YAC3C,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,wBAAwB;YACtC,SAAS,EAAE,oBAAoB;YAC/B,SAAS,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE;SACpD,CAAC;QAEF,MAAM,MAAM,GAAG,yBAAyB,CAAC,YAAY,CAAC,CAAC;QAEvD,2EAA2E;QAC3E,sCAAsC;QACtC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACtD,kEAAkE;QAClE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,YAAY,GAA2B;YAC3C,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,KAAK;YACf,SAAS,EAAE,oBAAoB;SAChC,CAAC;QAEF,MAAM,CAAC,yBAAyB,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,YAAY,GAA2B;YAC3C,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,KAAK;YACf,SAAS,EAAE,IAAI;SAChB,CAAC;QAEF,MAAM,CAAC,yBAAyB,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,4FAA4F,EAAE,KAAK,IAAI,EAAE;QAC1G,WAAW,CAAC,KAAK,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAE9F,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC;YAC9C,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;YACzB,MAAM,EAAE,aAAa;SACtB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,+BAA+B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1F,+CAA+C;QAC/C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,kCAAkC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7F,6EAA6E;QAC7E,mDAAmD;QACnD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0FAA0F,EAAE,KAAK,IAAI,EAAE;QACxG,WAAW,CAAC,KAAK,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAE7F,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC;YAC9C,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;YACzB,MAAM,EAAE,aAAa;SACtB,CAAC,CAAC;QAEH,iEAAiE;QACjE,4BAA4B;QAC5B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,+BAA+B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1F,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,kCAAkC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7F,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,oCAAoC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChG,0EAA0E;QAC1E,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,4EAA4E;QAC5E,qEAAqE;QACrE,WAAW,CAAC,KAAK,GAAG;YAClB,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE;gBACN,QAAQ;gBACR,8KAA8K;gBAC9K,4FAA4F;aAC7F,CAAC,IAAI,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,KAAK;SAChB,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC;YAC9C,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;YACzB,MAAM,EAAE,aAAa;SACtB,CAAC,CAAC;QAEH,4EAA4E;QAC5E,iBAAiB;QACjB,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;QAC/F,6EAA6E;QAC7E,6EAA6E;QAC7E,mEAAmE;QACnE,WAAW,CAAC,KAAK,GAAG;YAClB,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE;gBACN,QAAQ;gBACR,gKAAgK;gBAChK,uIAAuI;aACxI,CAAC,IAAI,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,KAAK;SAChB,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC;YAC9C,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;YACzB,MAAM,EAAE,aAAa;SACtB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,+BAA+B,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3F,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,oCAAoC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC1F,6EAA6E;QAC7E,uEAAuE;QACvE,4EAA4E;QAC5E,WAAW,CAAC,KAAK,GAAG;YAClB,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE;gBACN,QAAQ;gBACR,mNAAmN;aACpN,CAAC,IAAI,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,KAAK;SAChB,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC;YAC9C,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;YACzB,MAAM,EAAE,aAAa;SACtB,CAAC,CAAC;QAEH,0CAA0C;QAC1C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,kCAAkC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7F,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,+BAA+B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1F,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACzC,qDAAqD;QACrD,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QACrD,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QACpD,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QACpD,wDAAwD;QACxD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,kCAAkC,CAAC,CAAC;QAC/F,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IACnG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,WAAW,CAAC,KAAK,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAEtF,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC;YAC9C,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;YACzB,MAAM,EAAE,aAAa;SACtB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,WAAW,CAAC,UAAU,GAAG,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAE/D,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC;YAC9C,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;YACzB,MAAM,EAAE,aAAa;SACtB,CAAC,CAAC;QAEH,yEAAyE;QACzE,oDAAoD;QACpD,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACnE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,+BAA+B,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,WAAW,CAAC,KAAK,GAAG,EAAE,QAAQ,EAAE,IAAyB,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAEpG,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC;YAC9C,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;YACzB,MAAM,EAAE,aAAa;SACtB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACnE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,+BAA+B,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,4EAA4E;QAC5E,2DAA2D;QAC3D,WAAW,CAAC,KAAK,GAAG;YAClB,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,0BAA0B;YAClC,QAAQ,EAAE,KAAK;SAChB,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC;YAC9C,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;YACzB,MAAM,EAAE,aAAa;SACtB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACnE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,uEAAuE;QACvE,6EAA6E;QAC7E,oDAAoD;QACpD,MAAM,gBAAgB,GAAG,yBAAyB,CAAC;QACnD,MAAM,WAAW,GAAG,2CAA2C,CAAC;QAChE,WAAW,CAAC,UAAU,GAAG,IAAI,KAAK,CAChC,yBAAyB,gBAAgB,QAAQ,WAAW,EAAE,CAC/D,CAAC;QACF,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEvE,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC;YAC9C,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;YACzB,MAAM,EAAE,aAAa;SACtB,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAClD,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACnE,0EAA0E;QAC1E,oEAAoE;QACpE,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACnD,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QACxD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAC/C,cAAc,EAAE,aAAa;YAC7B,UAAU,EAAE,OAAO;SACpB,CAAC,CAAC;QACH,OAAO,CAAC,WAAW,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC3F,4EAA4E;QAC5E,2EAA2E;QAC3E,oBAAoB;QACpB,MAAM,gBAAgB,GAAG,wBAAwB,CAAC;QAClD,MAAM,WAAW,GAAG,2CAA2C,CAAC;QAChE,WAAW,CAAC,KAAK,GAAG;YAClB,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC1D,MAAM,EAAE,+BAA+B,WAAW,EAAE;YACpD,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEvE,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC;YAC9C,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;YACzB,MAAM,EAAE,aAAa;SACtB,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAClD,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACnE,0EAA0E;QAC1E,gEAAgE;QAChE,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACnD,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QACxD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAC/C,cAAc,EAAE,cAAc;YAC9B,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;QACH,OAAO,CAAC,WAAW,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iDAAiD,EAAE,GAAG,EAAE;IAC/D,MAAM,SAAS,GAA2B;QACxC,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,KAAK;QAChB,SAAS,EAAE,gCAAgC;QAC3C,IAAI,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;KACrB,CAAC;IAEvC,wEAAwE;IACxE,mEAAmE;IACnE,MAAM,qBAAqB,GAAG;QAC5B,YAAY;QACZ,aAAa;QACb,UAAU;QACV,YAAY;QACZ,aAAa;QACb,UAAU;QACV,mBAAmB;QACnB,yBAAyB;QACzB,sBAAsB;QACtB,mBAAmB;QACnB,yBAAyB;QACzB,4BAA4B;KAC7B,CAAC;IACF,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,IAAI,SAA6B,CAAC;IAClC,IAAI,QAAQ,GAAuC,EAAE,CAAC;IAEtD,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,2BAA2B,CAAC,CAAC,CAAC;QAC7E,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC1C,MAAM,SAAS,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;QACnD,MAAM,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC/B,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC;QAC3B,QAAQ,GAAG,EAAE,CAAC;QACd,KAAK,MAAM,GAAG,IAAI,qBAAqB,EAAE,CAAC;YACxC,QAAQ,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjC,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC;QAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpD,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;gBAC5C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAChC,CAAC;QACD,IAAI,OAAO;YAAE,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACxF,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yFAAyF,EAAE,KAAK,IAAI,EAAE;QACvG,WAAW,CAAC,KAAK,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QACtF,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC;YAC5C,SAAS,EAAE,WAAW;YACtB,WAAW,EAAE,cAAc;YAC3B,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,EAAE;YACjF,eAAe,EAAE,IAAI;YACrB,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,+BAA+B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjG,oEAAoE;QACpE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7F,wCAAwC;QACxC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gGAAgG,EAAE,KAAK,IAAI,EAAE;QAC9G,WAAW,CAAC,KAAK,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAC9F,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7F,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,kCAAkC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7F,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,+BAA+B,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;QAC5F,WAAW,CAAC,KAAK,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAC9F,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAClG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,kCAAkC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7F,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,+BAA+B,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kFAAkF,EAAE,KAAK,IAAI,EAAE;QAChG,WAAW,CAAC,KAAK,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QACtF,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,2BAA2B,CAAC;QAEtD,MAAM,0BAA0B,CAAC;YAC/B,MAAM,EAAE;gBACN,MAAM,EAAE,KAAK;gBACb,GAAG,EAAE;oBACH,iBAAiB,EAAE,eAAe;oBAClC,YAAY,EAAE,4BAA4B;oBAC1C,IAAI,EAAE,cAAc;oBACpB,UAAU,EAAE,kBAAkB;oBAC9B,UAAU,EAAE,0BAA0B;iBACvC;aACF;YACD,MAAM,EAAE,IAAI;SACb,CAAC,CAAC;QAEH,MAAM,CAAC,gCAAgC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,IAAI,GAAG,gCAAgC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAyB,CAAC;QACpF,MAAM,cAAc,GAAG,IAAI,CAAC,CAAC,CAAW,CAAC;QACzC,MAAM,UAAU,GAAI,IAAI,CAAC,CAAC,CAAqC,CAAC,GAAG,CAAC;QACpE,yEAAyE;QACzE,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxC,iEAAiE;QACjE,MAAM,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC3D,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,aAAa,EAAE,CAAC;QAChD,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;QACxC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,aAAa,EAAE,CAAC;QAC9C,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,aAAa,EAAE,CAAC;QAC9C,oEAAoE;QACpE,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;QAC/F,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC;YAC5C,SAAS,EAAE,WAAW;YACtB,WAAW,EAAE,cAAc;YAC3B,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,EAAE;YAC1G,eAAe,EAAE,IAAI;YACrB,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,gBAAgB,CAAC;YAC3D,IAAI,EAAE,uCAAuC;YAC7C,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,2CAA2C;YACpD,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC,CAAC;QACJ,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC3F,6EAA6E;QAC7E,0EAA0E;QAC1E,sEAAsE;QACtE,6EAA6E;QAC7E,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAClD,WAAW,CAAC,KAAK,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAEtF,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC;YAC5C,SAAS,EAAE,WAAW;YACtB,WAAW,EAAE,cAAc;YAC3B,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;YACzB,eAAe,EAAE,IAAI;YACrB,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QAEH,4EAA4E;QAC5E,sDAAsD;QACtD,MAAM,CAAC,gCAAgC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,IAAI,GAAG,gCAAgC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAyB,CAAC;QACpF,MAAM,UAAU,GAAI,IAAI,CAAC,CAAC,CAAqC,CAAC,GAAG,CAAC;QACpE,MAAM,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,kCAAkC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,oCAAoC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvG,sDAAsD;QACtD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,gBAAgB,CAAC;YAC3D,IAAI,EAAE,uCAAuC,EAAE,KAAK,EAAE,MAAM;SAC7D,CAAC,CAAC,CAAC;QACJ,2CAA2C;QAC3C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;QACjG,wEAAwE;QACxE,6EAA6E;QAC7E,6EAA6E;QAC7E,kEAAkE;QAClE,iBAAiB;QACjB,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,kBAAkB,CAAC;QACzD,WAAW,CAAC,KAAK,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAEtF,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC;YAC5C,SAAS,EAAE,WAAW;YACtB,WAAW,EAAE,cAAc;YAC3B,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;YACzB,eAAe,EAAE,IAAI;YACrB,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QAEH,2EAA2E;QAC3E,yDAAyD;QACzD,MAAM,CAAC,gCAAgC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,IAAI,GAAG,gCAAgC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAyB,CAAC;QACpF,MAAM,UAAU,GAAI,IAAI,CAAC,CAAC,CAAqC,CAAC,GAAG,CAAC;QACpE,MAAM,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACpE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,kCAAkC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,oCAAoC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvG,8DAA8D;QAC9D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,+BAA+B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjG,6CAA6C;QAC7C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,KAAK,IAAI,EAAE;QAC9F,6EAA6E;QAC7E,0EAA0E;QAC1E,wEAAwE;QACxE,6EAA6E;QAC7E,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,iBAAiB,CAAC;QACrD,WAAW,CAAC,KAAK,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAEtF,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC;YAC5C,SAAS,EAAE,WAAW;YACtB,WAAW,EAAE,cAAc;YAC3B,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;YACzB,eAAe,EAAE,IAAI;YACrB,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QAEH,2EAA2E;QAC3E,yDAAyD;QACzD,MAAM,CAAC,gCAAgC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,IAAI,GAAG,gCAAgC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAyB,CAAC;QACpF,MAAM,UAAU,GAAI,IAAI,CAAC,CAAC,CAAqC,CAAC,GAAG,CAAC;QACpE,MAAM,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAChE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,kCAAkC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,oCAAoC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvG,6CAA6C;QAC7C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC3F,8DAA8D;QAC9D,2EAA2E;QAC3E,0EAA0E;QAC1E,mEAAmE;QACnE,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,qBAAqB,CAAC;QACtD,WAAW,CAAC,KAAK,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAEtF,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC;YAC5C,SAAS,EAAE,WAAW;YACtB,WAAW,EAAE,cAAc;YAC3B,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;YACzB,eAAe,EAAE,IAAI;YACrB,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QAEH,6EAA6E;QAC7E,qEAAqE;QACrE,MAAM,CAAC,gCAAgC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,IAAI,GAAG,gCAAgC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAyB,CAAC;QACpF,MAAM,UAAU,GAAI,IAAI,CAAC,CAAC,CAAqC,CAAC,GAAG,CAAC;QACpE,MAAM,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACjE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,kCAAkC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,oCAAoC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;QACjG,4EAA4E;QAC5E,4EAA4E;QAC5E,6DAA6D;QAC7D,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,iBAAiB,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,qBAAqB,CAAC;QACtD,WAAW,CAAC,KAAK,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAEtF,MAAM,wBAAwB,CAAC;YAC7B,SAAS,EAAE,WAAW;YACtB,WAAW,EAAE,cAAc;YAC3B,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;YACzB,eAAe,EAAE,SAAS;YAC1B,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QAEH,MAAM,CAAC,gCAAgC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,IAAI,GAAG,gCAAgC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAyB,CAAC;QACpF,MAAM,UAAU,GAAI,IAAI,CAAC,CAAC,CAAqC,CAAC,GAAG,CAAC;QACpE,MAAM,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,aAAa,EAAE,CAAC;QACxD,MAAM,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,aAAa,EAAE,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}