botmux 2.33.0 → 2.34.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 (281) hide show
  1. package/README.en.md +12 -1
  2. package/README.md +45 -1
  3. package/dist/adapters/cli/claude-code.d.ts.map +1 -1
  4. package/dist/adapters/cli/claude-code.js +11 -0
  5. package/dist/adapters/cli/claude-code.js.map +1 -1
  6. package/dist/cli/bots-list-output.d.ts +21 -0
  7. package/dist/cli/bots-list-output.d.ts.map +1 -0
  8. package/dist/cli/bots-list-output.js +23 -0
  9. package/dist/cli/bots-list-output.js.map +1 -0
  10. package/dist/cli/workflow.d.ts +13 -0
  11. package/dist/cli/workflow.d.ts.map +1 -0
  12. package/dist/cli/workflow.js +781 -0
  13. package/dist/cli/workflow.js.map +1 -0
  14. package/dist/cli.js +69 -14
  15. package/dist/cli.js.map +1 -1
  16. package/dist/core/command-handler.d.ts.map +1 -1
  17. package/dist/core/command-handler.js +219 -6
  18. package/dist/core/command-handler.js.map +1 -1
  19. package/dist/core/session-manager.d.ts +6 -1
  20. package/dist/core/session-manager.d.ts.map +1 -1
  21. package/dist/core/session-manager.js +22 -12
  22. package/dist/core/session-manager.js.map +1 -1
  23. package/dist/core/worker-pool.d.ts +13 -0
  24. package/dist/core/worker-pool.d.ts.map +1 -1
  25. package/dist/core/worker-pool.js +100 -6
  26. package/dist/core/worker-pool.js.map +1 -1
  27. package/dist/daemon.d.ts +3 -0
  28. package/dist/daemon.d.ts.map +1 -1
  29. package/dist/daemon.js +884 -3
  30. package/dist/daemon.js.map +1 -1
  31. package/dist/dashboard/auth.d.ts +36 -0
  32. package/dist/dashboard/auth.d.ts.map +1 -1
  33. package/dist/dashboard/auth.js +22 -0
  34. package/dist/dashboard/auth.js.map +1 -1
  35. package/dist/dashboard/web/app.js +20 -1
  36. package/dist/dashboard/web/app.js.map +1 -1
  37. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  38. package/dist/dashboard/web/i18n.js +356 -0
  39. package/dist/dashboard/web/i18n.js.map +1 -1
  40. package/dist/dashboard/web/workflow-catalog.d.ts +2 -0
  41. package/dist/dashboard/web/workflow-catalog.d.ts.map +1 -0
  42. package/dist/dashboard/web/workflow-catalog.js +323 -0
  43. package/dist/dashboard/web/workflow-catalog.js.map +1 -0
  44. package/dist/dashboard/web/workflows.d.ts +2 -0
  45. package/dist/dashboard/web/workflows.d.ts.map +1 -0
  46. package/dist/dashboard/web/workflows.js +1618 -0
  47. package/dist/dashboard/web/workflows.js.map +1 -0
  48. package/dist/dashboard/workflow-api.d.ts +23 -0
  49. package/dist/dashboard/workflow-api.d.ts.map +1 -0
  50. package/dist/dashboard/workflow-api.js +463 -0
  51. package/dist/dashboard/workflow-api.js.map +1 -0
  52. package/dist/dashboard-web/app.js +494 -199
  53. package/dist/dashboard-web/index.html +1 -0
  54. package/dist/dashboard-web/style.css +160 -6
  55. package/dist/dashboard-web/terminal-replay.html +227 -0
  56. package/dist/dashboard.js +29 -12
  57. package/dist/dashboard.js.map +1 -1
  58. package/dist/i18n/en.d.ts.map +1 -1
  59. package/dist/i18n/en.js +12 -0
  60. package/dist/i18n/en.js.map +1 -1
  61. package/dist/i18n/zh.d.ts.map +1 -1
  62. package/dist/i18n/zh.js +12 -0
  63. package/dist/i18n/zh.js.map +1 -1
  64. package/dist/im/lark/card-handler.d.ts +3 -0
  65. package/dist/im/lark/card-handler.d.ts.map +1 -1
  66. package/dist/im/lark/card-handler.js +27 -1
  67. package/dist/im/lark/card-handler.js.map +1 -1
  68. package/dist/im/lark/client.d.ts +19 -2
  69. package/dist/im/lark/client.d.ts.map +1 -1
  70. package/dist/im/lark/client.js +21 -2
  71. package/dist/im/lark/client.js.map +1 -1
  72. package/dist/im/lark/workflow-card-handler.d.ts +50 -0
  73. package/dist/im/lark/workflow-card-handler.d.ts.map +1 -0
  74. package/dist/im/lark/workflow-card-handler.js +152 -0
  75. package/dist/im/lark/workflow-card-handler.js.map +1 -0
  76. package/dist/im/lark/workflow-cards.d.ts +46 -0
  77. package/dist/im/lark/workflow-cards.d.ts.map +1 -0
  78. package/dist/im/lark/workflow-cards.js +226 -0
  79. package/dist/im/lark/workflow-cards.js.map +1 -0
  80. package/dist/im/lark/workflow-progress-card.d.ts +76 -0
  81. package/dist/im/lark/workflow-progress-card.d.ts.map +1 -0
  82. package/dist/im/lark/workflow-progress-card.js +279 -0
  83. package/dist/im/lark/workflow-progress-card.js.map +1 -0
  84. package/dist/im/lark/workflow-slash-command.d.ts +92 -0
  85. package/dist/im/lark/workflow-slash-command.d.ts.map +1 -0
  86. package/dist/im/lark/workflow-slash-command.js +185 -0
  87. package/dist/im/lark/workflow-slash-command.js.map +1 -0
  88. package/dist/services/group-creator.d.ts.map +1 -1
  89. package/dist/services/group-creator.js +17 -4
  90. package/dist/services/group-creator.js.map +1 -1
  91. package/dist/services/groups-store.d.ts +11 -0
  92. package/dist/services/groups-store.d.ts.map +1 -1
  93. package/dist/services/groups-store.js +26 -0
  94. package/dist/services/groups-store.js.map +1 -1
  95. package/dist/services/jsonl-cursor.d.ts +12 -0
  96. package/dist/services/jsonl-cursor.d.ts.map +1 -0
  97. package/dist/services/jsonl-cursor.js +45 -0
  98. package/dist/services/jsonl-cursor.js.map +1 -0
  99. package/dist/services/schedule-store.d.ts +35 -0
  100. package/dist/services/schedule-store.d.ts.map +1 -1
  101. package/dist/services/schedule-store.js +108 -1
  102. package/dist/services/schedule-store.js.map +1 -1
  103. package/dist/skills/definitions.d.ts.map +1 -1
  104. package/dist/skills/definitions.js +399 -0
  105. package/dist/skills/definitions.js.map +1 -1
  106. package/dist/types.d.ts +4 -0
  107. package/dist/types.d.ts.map +1 -1
  108. package/dist/utils/cli-usage-limit.d.ts.map +1 -1
  109. package/dist/utils/cli-usage-limit.js +4 -0
  110. package/dist/utils/cli-usage-limit.js.map +1 -1
  111. package/dist/worker.js +118 -14
  112. package/dist/worker.js.map +1 -1
  113. package/dist/workflows/attempt-resume.d.ts +114 -0
  114. package/dist/workflows/attempt-resume.d.ts.map +1 -0
  115. package/dist/workflows/attempt-resume.js +385 -0
  116. package/dist/workflows/attempt-resume.js.map +1 -0
  117. package/dist/workflows/attempt-terminal.d.ts +21 -0
  118. package/dist/workflows/attempt-terminal.d.ts.map +1 -0
  119. package/dist/workflows/attempt-terminal.js +7 -0
  120. package/dist/workflows/attempt-terminal.js.map +1 -0
  121. package/dist/workflows/blob.d.ts +27 -0
  122. package/dist/workflows/blob.d.ts.map +1 -0
  123. package/dist/workflows/blob.js +39 -0
  124. package/dist/workflows/blob.js.map +1 -0
  125. package/dist/workflows/cancel-run.d.ts +45 -0
  126. package/dist/workflows/cancel-run.d.ts.map +1 -0
  127. package/dist/workflows/cancel-run.js +99 -0
  128. package/dist/workflows/cancel-run.js.map +1 -0
  129. package/dist/workflows/cancel.d.ts +111 -0
  130. package/dist/workflows/cancel.d.ts.map +1 -0
  131. package/dist/workflows/cancel.js +120 -0
  132. package/dist/workflows/cancel.js.map +1 -0
  133. package/dist/workflows/catalog.d.ts +60 -0
  134. package/dist/workflows/catalog.d.ts.map +1 -0
  135. package/dist/workflows/catalog.js +119 -0
  136. package/dist/workflows/catalog.js.map +1 -0
  137. package/dist/workflows/cold-attach.d.ts +30 -0
  138. package/dist/workflows/cold-attach.d.ts.map +1 -0
  139. package/dist/workflows/cold-attach.js +40 -0
  140. package/dist/workflows/cold-attach.js.map +1 -0
  141. package/dist/workflows/cold-scan.d.ts +21 -0
  142. package/dist/workflows/cold-scan.d.ts.map +1 -0
  143. package/dist/workflows/cold-scan.js +70 -0
  144. package/dist/workflows/cold-scan.js.map +1 -0
  145. package/dist/workflows/daemon-spawn.d.ts +117 -0
  146. package/dist/workflows/daemon-spawn.d.ts.map +1 -0
  147. package/dist/workflows/daemon-spawn.js +551 -0
  148. package/dist/workflows/daemon-spawn.js.map +1 -0
  149. package/dist/workflows/definition.d.ts +1309 -0
  150. package/dist/workflows/definition.d.ts.map +1 -0
  151. package/dist/workflows/definition.js +334 -0
  152. package/dist/workflows/definition.js.map +1 -0
  153. package/dist/workflows/effect-input.d.ts +4 -0
  154. package/dist/workflows/effect-input.d.ts.map +1 -0
  155. package/dist/workflows/effect-input.js +18 -0
  156. package/dist/workflows/effect-input.js.map +1 -0
  157. package/dist/workflows/events/append.d.ts +77 -0
  158. package/dist/workflows/events/append.d.ts.map +1 -0
  159. package/dist/workflows/events/append.js +214 -0
  160. package/dist/workflows/events/append.js.map +1 -0
  161. package/dist/workflows/events/idempotency.d.ts +77 -0
  162. package/dist/workflows/events/idempotency.d.ts.map +1 -0
  163. package/dist/workflows/events/idempotency.js +116 -0
  164. package/dist/workflows/events/idempotency.js.map +1 -0
  165. package/dist/workflows/events/index.d.ts +7 -0
  166. package/dist/workflows/events/index.d.ts.map +1 -0
  167. package/dist/workflows/events/index.js +7 -0
  168. package/dist/workflows/events/index.js.map +1 -0
  169. package/dist/workflows/events/payloads.d.ts +917 -0
  170. package/dist/workflows/events/payloads.d.ts.map +1 -0
  171. package/dist/workflows/events/payloads.js +337 -0
  172. package/dist/workflows/events/payloads.js.map +1 -0
  173. package/dist/workflows/events/replay.d.ts +238 -0
  174. package/dist/workflows/events/replay.d.ts.map +1 -0
  175. package/dist/workflows/events/replay.js +608 -0
  176. package/dist/workflows/events/replay.js.map +1 -0
  177. package/dist/workflows/events/schema.d.ts +5242 -0
  178. package/dist/workflows/events/schema.d.ts.map +1 -0
  179. package/dist/workflows/events/schema.js +295 -0
  180. package/dist/workflows/events/schema.js.map +1 -0
  181. package/dist/workflows/events/types.d.ts +34 -0
  182. package/dist/workflows/events/types.d.ts.map +1 -0
  183. package/dist/workflows/events/types.js +2 -0
  184. package/dist/workflows/events/types.js.map +1 -0
  185. package/dist/workflows/fanout.d.ts +36 -0
  186. package/dist/workflows/fanout.d.ts.map +1 -0
  187. package/dist/workflows/fanout.js +114 -0
  188. package/dist/workflows/fanout.js.map +1 -0
  189. package/dist/workflows/hostExecutors/botmux-schedule.d.ts +41 -0
  190. package/dist/workflows/hostExecutors/botmux-schedule.d.ts.map +1 -0
  191. package/dist/workflows/hostExecutors/botmux-schedule.js +121 -0
  192. package/dist/workflows/hostExecutors/botmux-schedule.js.map +1 -0
  193. package/dist/workflows/hostExecutors/feishu-im.d.ts +12 -0
  194. package/dist/workflows/hostExecutors/feishu-im.d.ts.map +1 -0
  195. package/dist/workflows/hostExecutors/feishu-im.js +49 -0
  196. package/dist/workflows/hostExecutors/feishu-im.js.map +1 -0
  197. package/dist/workflows/hostExecutors/feishu-reply.d.ts +24 -0
  198. package/dist/workflows/hostExecutors/feishu-reply.d.ts.map +1 -0
  199. package/dist/workflows/hostExecutors/feishu-reply.js +88 -0
  200. package/dist/workflows/hostExecutors/feishu-reply.js.map +1 -0
  201. package/dist/workflows/hostExecutors/feishu-send.d.ts +23 -0
  202. package/dist/workflows/hostExecutors/feishu-send.d.ts.map +1 -0
  203. package/dist/workflows/hostExecutors/feishu-send.js +124 -0
  204. package/dist/workflows/hostExecutors/feishu-send.js.map +1 -0
  205. package/dist/workflows/hostExecutors/index.d.ts +8 -0
  206. package/dist/workflows/hostExecutors/index.d.ts.map +1 -0
  207. package/dist/workflows/hostExecutors/index.js +8 -0
  208. package/dist/workflows/hostExecutors/index.js.map +1 -0
  209. package/dist/workflows/hostExecutors/protocol.d.ts +42 -0
  210. package/dist/workflows/hostExecutors/protocol.d.ts.map +1 -0
  211. package/dist/workflows/hostExecutors/protocol.js +181 -0
  212. package/dist/workflows/hostExecutors/protocol.js.map +1 -0
  213. package/dist/workflows/hostExecutors/registry.d.ts +10 -0
  214. package/dist/workflows/hostExecutors/registry.d.ts.map +1 -0
  215. package/dist/workflows/hostExecutors/registry.js +36 -0
  216. package/dist/workflows/hostExecutors/registry.js.map +1 -0
  217. package/dist/workflows/hostExecutors/types.d.ts +78 -0
  218. package/dist/workflows/hostExecutors/types.d.ts.map +1 -0
  219. package/dist/workflows/hostExecutors/types.js +2 -0
  220. package/dist/workflows/hostExecutors/types.js.map +1 -0
  221. package/dist/workflows/loader.d.ts +16 -0
  222. package/dist/workflows/loader.d.ts.map +1 -0
  223. package/dist/workflows/loader.js +56 -0
  224. package/dist/workflows/loader.js.map +1 -0
  225. package/dist/workflows/loop.d.ts +50 -0
  226. package/dist/workflows/loop.d.ts.map +1 -0
  227. package/dist/workflows/loop.js +350 -0
  228. package/dist/workflows/loop.js.map +1 -0
  229. package/dist/workflows/ops-projection.d.ts +168 -0
  230. package/dist/workflows/ops-projection.d.ts.map +1 -0
  231. package/dist/workflows/ops-projection.js +707 -0
  232. package/dist/workflows/ops-projection.js.map +1 -0
  233. package/dist/workflows/orchestrator.d.ts +107 -0
  234. package/dist/workflows/orchestrator.d.ts.map +1 -0
  235. package/dist/workflows/orchestrator.js +197 -0
  236. package/dist/workflows/orchestrator.js.map +1 -0
  237. package/dist/workflows/output-binding.d.ts +70 -0
  238. package/dist/workflows/output-binding.d.ts.map +1 -0
  239. package/dist/workflows/output-binding.js +265 -0
  240. package/dist/workflows/output-binding.js.map +1 -0
  241. package/dist/workflows/params.d.ts +61 -0
  242. package/dist/workflows/params.d.ts.map +1 -0
  243. package/dist/workflows/params.js +195 -0
  244. package/dist/workflows/params.js.map +1 -0
  245. package/dist/workflows/resume.d.ts +263 -0
  246. package/dist/workflows/resume.d.ts.map +1 -0
  247. package/dist/workflows/resume.js +808 -0
  248. package/dist/workflows/resume.js.map +1 -0
  249. package/dist/workflows/run-id.d.ts +2 -0
  250. package/dist/workflows/run-id.d.ts.map +1 -0
  251. package/dist/workflows/run-id.js +7 -0
  252. package/dist/workflows/run-id.js.map +1 -0
  253. package/dist/workflows/run-init.d.ts +48 -0
  254. package/dist/workflows/run-init.d.ts.map +1 -0
  255. package/dist/workflows/run-init.js +99 -0
  256. package/dist/workflows/run-init.js.map +1 -0
  257. package/dist/workflows/runs-dir.d.ts +4 -0
  258. package/dist/workflows/runs-dir.d.ts.map +1 -0
  259. package/dist/workflows/runs-dir.js +15 -0
  260. package/dist/workflows/runs-dir.js.map +1 -0
  261. package/dist/workflows/runtime.d.ts +211 -0
  262. package/dist/workflows/runtime.d.ts.map +1 -0
  263. package/dist/workflows/runtime.js +594 -0
  264. package/dist/workflows/runtime.js.map +1 -0
  265. package/dist/workflows/spawn-bot.d.ts +165 -0
  266. package/dist/workflows/spawn-bot.d.ts.map +1 -0
  267. package/dist/workflows/spawn-bot.js +215 -0
  268. package/dist/workflows/spawn-bot.js.map +1 -0
  269. package/dist/workflows/system.d.ts +49 -0
  270. package/dist/workflows/system.d.ts.map +1 -0
  271. package/dist/workflows/system.js +48 -0
  272. package/dist/workflows/system.js.map +1 -0
  273. package/dist/workflows/trigger-run.d.ts +70 -0
  274. package/dist/workflows/trigger-run.d.ts.map +1 -0
  275. package/dist/workflows/trigger-run.js +88 -0
  276. package/dist/workflows/trigger-run.js.map +1 -0
  277. package/dist/workflows/wait.d.ts +120 -0
  278. package/dist/workflows/wait.d.ts.map +1 -0
  279. package/dist/workflows/wait.js +181 -0
  280. package/dist/workflows/wait.js.map +1 -0
  281. package/package.json +3 -3
@@ -0,0 +1,551 @@
1
+ /**
2
+ * Daemon-backed `WorkerSpawnFn` implementation.
3
+ *
4
+ * Forks `worker.js` for a single workflow step, sends the prompt via
5
+ * the `init` IPC, and resolves with the agent's final transcript when
6
+ * the worker emits `final_output` and quiesces.
7
+ *
8
+ * Why not reuse `forkWorker` from `core/worker-pool.ts`: that path is
9
+ * tightly coupled to chat / card / streaming state (DaemonSession,
10
+ * dashboardEventBus, sessionStore writes). Workflow steps don't have
11
+ * a real chat to bind to — we mint a synthetic chatId / rootMessageId
12
+ * and ignore the worker's chat-side side effects (streaming card POST,
13
+ * screenshot uploads). The bot's real `larkAppId / larkAppSecret`
14
+ * still flow through so the CLI adapter's environment matches a real
15
+ * spawn.
16
+ *
17
+ * The `WorkerProcessFactory` indirection keeps the module unit-testable:
18
+ * tests inject a scripted process that emits canned IPC frames, real
19
+ * code injects `forkWorkerJs` (defined below).
20
+ */
21
+ import { fork } from 'node:child_process';
22
+ import { createHash } from 'node:crypto';
23
+ import { appendFileSync, existsSync, mkdirSync, writeFileSync } from 'node:fs';
24
+ import { homedir } from 'node:os';
25
+ import { dirname, join } from 'node:path';
26
+ import { fileURLToPath } from 'node:url';
27
+ import { WorkflowSpawnCancelledError } from './spawn-bot.js';
28
+ import { ATTEMPT_TERMINAL_SCHEMA_VERSION, ATTEMPT_TERMINAL_SIDECAR, } from './attempt-terminal.js';
29
+ import { logger } from '../utils/logger.js';
30
+ /** Default factory: real `node:child_process.fork` against `worker.js`. */
31
+ export const forkWorkerJsFactory = {
32
+ spawn(opts) {
33
+ const child = fork(opts.workerPath, [], {
34
+ stdio: ['ignore', 'pipe', 'pipe', 'ipc'],
35
+ cwd: opts.cwd,
36
+ env: opts.env,
37
+ });
38
+ return {
39
+ send: (m) => child.send(m),
40
+ on: (event, cb) => {
41
+ child.on(event, cb);
42
+ },
43
+ kill: (sig) => {
44
+ if (!child.killed)
45
+ child.kill(sig);
46
+ },
47
+ get pid() {
48
+ return child.pid;
49
+ },
50
+ get stdout() {
51
+ return child.stdout;
52
+ },
53
+ get stderr() {
54
+ return child.stderr;
55
+ },
56
+ };
57
+ },
58
+ };
59
+ export function createWorkflowDaemonSpawn(deps) {
60
+ const factory = deps.factory ?? forkWorkerJsFactory;
61
+ const workerPath = deps.workerPath ?? defaultWorkerPath();
62
+ const defaultTimeoutMs = deps.defaultTimeoutMs ?? 5 * 60 * 1000;
63
+ const quiesceMs = deps.quiesceMs ?? 800;
64
+ const cancelGraceMs = deps.cancelGraceMs ?? 5000;
65
+ return {
66
+ runOneShot: (input) => runOneShotImpl(input, {
67
+ factory,
68
+ workerPath,
69
+ defaultTimeoutMs,
70
+ quiesceMs,
71
+ cancelGraceMs,
72
+ resolveLarkCredentials: deps.resolveLarkCredentials,
73
+ }),
74
+ };
75
+ }
76
+ // ─── Default worker.js path ──────────────────────────────────────────────
77
+ function defaultWorkerPath() {
78
+ // This module typically runs from `dist/workflows/daemon-spawn.js`;
79
+ // worker.js lives next to dist root, i.e. `<dist>/worker.js`.
80
+ // When running from source via ts-node etc., fall back to `src/worker.ts`
81
+ // (the factory is meant for production; tests should override).
82
+ const here = dirname(fileURLToPath(import.meta.url));
83
+ const candidate = join(here, '..', 'worker.js');
84
+ if (existsSync(candidate))
85
+ return candidate;
86
+ return join(here, '..', '..', 'src', 'worker.ts');
87
+ }
88
+ async function runOneShotImpl(input, deps) {
89
+ logOneShotMemory(input, 'enter');
90
+ const creds = deps.resolveLarkCredentials(input.botName);
91
+ logOneShotMemory(input, 'after-resolve-credentials');
92
+ const startedAt = Date.now();
93
+ const synthetic = syntheticIds(input);
94
+ logOneShotMemory(input, 'after-synthetic-ids');
95
+ const cwd = expandWorkflowWorkingDir(input.workingDir) ?? process.cwd();
96
+ appendAttemptLog(input, 'system', `starting workflow worker cwd=${cwd}`);
97
+ logOneShotMemory(input, 'before-worker-spawn');
98
+ const worker = deps.factory.spawn({
99
+ workerPath: deps.workerPath,
100
+ cwd,
101
+ env: {
102
+ ...process.env,
103
+ // Marker so the CLI session / skill detect a workflow-issued worker.
104
+ BOTMUX_WORKFLOW: '1',
105
+ BOTMUX_WORKFLOW_RUN_ID: input.runId,
106
+ BOTMUX_WORKFLOW_NODE_ID: input.nodeId,
107
+ // Raw PTY byte stream sink for the dashboard "terminal replay" view.
108
+ // Worker lazily opens this on first PTY chunk; absent → worker skips
109
+ // the write (older daemon → older sidecar layout still works).
110
+ ...(input.attemptLogPath
111
+ ? { BOTMUX_WORKFLOW_PTY_LOG_PATH: join(dirname(input.attemptLogPath), 'pty.log') }
112
+ : {}),
113
+ },
114
+ });
115
+ logOneShotMemory(input, `after-worker-spawn pid=${worker.pid ?? 'unknown'}`);
116
+ appendAttemptLog(input, 'system', `worker spawned pid=${worker.pid ?? 'unknown'}`);
117
+ drainWorkerDiagnostics(worker, input);
118
+ logOneShotMemory(input, 'after-drain-diagnostics');
119
+ let webPort;
120
+ const collectedOutputs = [];
121
+ let quiesceTimer;
122
+ const cliId = input.botSnapshot?.cliId ?? 'claude-code';
123
+ let cliSessionId;
124
+ const init = {
125
+ type: 'init',
126
+ sessionId: synthetic.sessionId,
127
+ chatId: synthetic.chatId,
128
+ rootMessageId: synthetic.rootMessageId,
129
+ workingDir: cwd,
130
+ cliId,
131
+ backendType: 'pty',
132
+ prompt: input.prompt,
133
+ resume: false,
134
+ larkAppId: creds.larkAppId,
135
+ larkAppSecret: creds.larkAppSecret,
136
+ botName: input.botName,
137
+ locale: 'zh',
138
+ };
139
+ logOneShotMemory(input, 'after-init-object');
140
+ return new Promise((resolve, reject) => {
141
+ let settled = false;
142
+ let sigkillTimer;
143
+ let cancelRequested = false;
144
+ let cancelOriginEventId = '';
145
+ const timeoutMs = input.timeoutMs ?? deps.defaultTimeoutMs;
146
+ const hardDeadline = setTimeout(() => {
147
+ fail(new Error(`workflow worker timeout after ${timeoutMs} ms`));
148
+ }, timeoutMs);
149
+ const cleanup = (opts = {}) => {
150
+ clearTimeout(hardDeadline);
151
+ if (quiesceTimer)
152
+ clearTimeout(quiesceTimer);
153
+ // sigkillTimer is cleared only on the worker's `exit` event so the
154
+ // grace escalation isn't cancelled by our own cleanup path.
155
+ input.cancelSignal?.removeEventListener('abort', onCancelAbort);
156
+ try {
157
+ worker.send({ type: 'close' });
158
+ }
159
+ catch {
160
+ /* worker may already be gone */
161
+ }
162
+ // Cancel path manages its own SIGINT + grace + SIGKILL. Sending
163
+ // an extra SIGTERM 250ms after abort would race with the 5s grace
164
+ // and potentially kill a CLI mid-flush. The success path still
165
+ // wants SIGTERM to make sure idle workers exit promptly.
166
+ if (!opts.skipSigterm) {
167
+ setTimeout(() => worker.kill('SIGTERM'), 250);
168
+ }
169
+ };
170
+ /**
171
+ * Cancel responsiveness (v0.1.4-a slice 2):
172
+ * 1. Tell the worker via the existing IPC `close` channel so the CLI
173
+ * can flush its current chunk and exit cleanly.
174
+ * 2. SIGINT for an unambiguous interrupt signal that CLI shells
175
+ * conventionally honor (Ctrl-C semantics).
176
+ * 3. Arm a SIGKILL fallback after `cancelGraceMs` in case the CLI
177
+ * is stuck (rare but real — e.g. mid-network call).
178
+ * 4. **Wait for the worker's `exit` event** before rejecting the
179
+ * outer Promise. This guarantees `activityCanceled` (written
180
+ * by dispatchWork on `kind: 'cancelled'`) is only appended
181
+ * after the worker process is actually gone — otherwise we'd
182
+ * mark the activity terminal while the worker could still be
183
+ * writing files or invoking tools (codex round 4 B1).
184
+ *
185
+ * success-wins: if the worker already produced final_output and the
186
+ * quiesce window is running, the `settled` guard in `finish`
187
+ * prevents this from overriding.
188
+ */
189
+ function onCancelAbort() {
190
+ if (settled || cancelRequested)
191
+ return;
192
+ cancelRequested = true;
193
+ const reason = input.cancelSignal.reason;
194
+ cancelOriginEventId = typeof reason?.cancelOriginEventId === 'string'
195
+ ? reason.cancelOriginEventId
196
+ : '';
197
+ appendAttemptLog(input, 'system', `cancel signal received origin=${cancelOriginEventId || '<missing>'}, sending close+SIGINT (grace ${deps.cancelGraceMs}ms)`);
198
+ // Cancel-wins (codex round 5 M1): once aborted, no other path may
199
+ // settle the promise before the worker exits — neither quiesce →
200
+ // success nor hardDeadline / error → failure. Disarm those timers
201
+ // here so they can't fire after the abort; `finish` and `fail` also
202
+ // short-circuit on `cancelRequested` defensively.
203
+ clearTimeout(hardDeadline);
204
+ if (quiesceTimer) {
205
+ clearTimeout(quiesceTimer);
206
+ quiesceTimer = undefined;
207
+ }
208
+ try {
209
+ worker.send({ type: 'close' });
210
+ }
211
+ catch { /* already gone */ }
212
+ try {
213
+ worker.kill('SIGINT');
214
+ }
215
+ catch { /* already gone */ }
216
+ sigkillTimer = setTimeout(() => {
217
+ appendAttemptLog(input, 'system', `cancel grace expired; escalating to SIGKILL`);
218
+ try {
219
+ worker.kill('SIGKILL');
220
+ }
221
+ catch { /* already gone */ }
222
+ }, deps.cancelGraceMs);
223
+ // NB: don't reject here. The worker's `exit` handler below
224
+ // finalizes the WorkflowSpawnCancelledError once the process is
225
+ // truly gone.
226
+ }
227
+ if (input.cancelSignal) {
228
+ if (input.cancelSignal.aborted) {
229
+ // Signal already aborted before we got here — fire on next tick
230
+ // so the spawn at least gets a chance to register handlers and
231
+ // appendAttemptLog is meaningful.
232
+ setImmediate(onCancelAbort);
233
+ }
234
+ else {
235
+ input.cancelSignal.addEventListener('abort', onCancelAbort);
236
+ }
237
+ }
238
+ function makeSessionSnapshot() {
239
+ return {
240
+ sessionId: synthetic.sessionId,
241
+ cliSessionId,
242
+ larkAppId: creds.larkAppId,
243
+ botName: input.botName,
244
+ cliId,
245
+ workingDir: cwd,
246
+ webPort,
247
+ logPath: input.attemptLogPath,
248
+ startedAt,
249
+ endedAt: Date.now(),
250
+ };
251
+ }
252
+ const fail = (err) => {
253
+ if (settled)
254
+ return;
255
+ // Cancel-wins (codex round 5 M1): once an abort has fired, all
256
+ // failure paths defer to the worker.on('exit') handler which
257
+ // rejects with WorkflowSpawnCancelledError. Otherwise a racing
258
+ // hardDeadline / worker error would surface as a generic failure
259
+ // and lose the cancel origin id.
260
+ if (cancelRequested) {
261
+ appendAttemptLog(input, 'system', `ignoring fail(${err.message}) while cancel in flight; deferring to exit handler`);
262
+ return;
263
+ }
264
+ settled = true;
265
+ cleanup();
266
+ reject(err);
267
+ };
268
+ const finish = () => {
269
+ if (settled)
270
+ return;
271
+ // Cancel-wins guard symmetric with `fail`: quiesce timer might be
272
+ // disarmed in onCancelAbort, but defend against any path that
273
+ // calls finish() directly after abort.
274
+ if (cancelRequested) {
275
+ appendAttemptLog(input, 'system', 'ignoring finish() while cancel in flight; deferring to exit handler');
276
+ return;
277
+ }
278
+ cleanup();
279
+ const last = collectedOutputs[collectedOutputs.length - 1];
280
+ if (!last) {
281
+ fail(new Error('workflow worker quiesced without final_output'));
282
+ return;
283
+ }
284
+ settled = true;
285
+ resolve({
286
+ finalTranscript: last.content,
287
+ session: {
288
+ sessionId: synthetic.sessionId,
289
+ cliSessionId,
290
+ larkAppId: creds.larkAppId,
291
+ botName: input.botName,
292
+ cliId,
293
+ workingDir: cwd,
294
+ webPort,
295
+ logPath: input.attemptLogPath,
296
+ startedAt,
297
+ endedAt: Date.now(),
298
+ },
299
+ });
300
+ };
301
+ const armQuiesce = () => {
302
+ if (quiesceTimer)
303
+ clearTimeout(quiesceTimer);
304
+ quiesceTimer = setTimeout(finish, deps.quiesceMs);
305
+ };
306
+ worker.on('message', (event) => {
307
+ switch (event.type) {
308
+ case 'ready':
309
+ if (settled)
310
+ break;
311
+ webPort = event.port;
312
+ appendAttemptLog(input, 'system', `worker ready port=${event.port}`);
313
+ writeAttemptTerminalSidecar(input, makeSessionSnapshot(), 'live');
314
+ logOneShotMemory(input, 'worker-ready-before-init-send');
315
+ try {
316
+ worker.send(init);
317
+ logOneShotMemory(input, 'worker-ready-after-init-send');
318
+ }
319
+ catch (err) {
320
+ fail(err instanceof Error ? err : new Error(String(err)));
321
+ }
322
+ // Note: init may already have been sent by tests' scripted
323
+ // factory before 'ready' lands. Re-sending is a no-op
324
+ // because `lastInitConfig` short-circuits.
325
+ break;
326
+ case 'cli_session_id':
327
+ if (typeof event.cliSessionId !== 'string' || !event.cliSessionId)
328
+ break;
329
+ cliSessionId = event.cliSessionId;
330
+ appendAttemptLog(input, 'system', `CLI session id observed ${event.cliSessionId}`);
331
+ if (!settled && webPort !== undefined) {
332
+ writeAttemptTerminalSidecar(input, makeSessionSnapshot(), 'live');
333
+ }
334
+ break;
335
+ case 'final_output':
336
+ if (settled)
337
+ break;
338
+ appendAttemptLog(input, `final_output:${event.turnId}`, event.content);
339
+ collectedOutputs.push({
340
+ content: event.content,
341
+ turnId: event.turnId,
342
+ });
343
+ armQuiesce();
344
+ break;
345
+ case 'screen_update':
346
+ if (event.status === 'idle' && collectedOutputs.length > 0) {
347
+ armQuiesce();
348
+ }
349
+ break;
350
+ case 'prompt_ready':
351
+ if (collectedOutputs.length > 0)
352
+ armQuiesce();
353
+ break;
354
+ case 'error':
355
+ appendAttemptLog(input, 'error', event.message);
356
+ fail(new Error(`worker error: ${event.message}`));
357
+ break;
358
+ case 'claude_exit':
359
+ appendAttemptLog(input, 'system', `CLI exited code=${event.code ?? 'null'} signal=${event.signal ?? 'null'}`);
360
+ if (collectedOutputs.length > 0) {
361
+ finish();
362
+ }
363
+ else {
364
+ fail(new Error(`CLI exited (code=${event.code ?? 'null'}, signal=${event.signal ?? 'null'}) before producing final_output`));
365
+ }
366
+ break;
367
+ }
368
+ });
369
+ worker.on('error', (err) => {
370
+ appendAttemptLog(input, 'error', err.message);
371
+ fail(err);
372
+ });
373
+ worker.on('exit', (code) => {
374
+ appendAttemptLog(input, 'system', `worker process exit code=${code ?? 'null'}`);
375
+ if (webPort !== undefined) {
376
+ writeAttemptTerminalSidecar(input, makeSessionSnapshot(), 'closed');
377
+ }
378
+ // Worker is gone — we don't need to SIGKILL it anymore.
379
+ if (sigkillTimer) {
380
+ clearTimeout(sigkillTimer);
381
+ sigkillTimer = undefined;
382
+ }
383
+ // Cancel path: worker has actually stopped, NOW we can settle as
384
+ // cancelled (codex round 4 B1 — activityCanceled must not land
385
+ // while the worker is still alive and possibly still writing).
386
+ if (cancelRequested && !settled) {
387
+ settled = true;
388
+ cleanup({ skipSigterm: true });
389
+ reject(new WorkflowSpawnCancelledError(cancelOriginEventId, makeSessionSnapshot()));
390
+ return;
391
+ }
392
+ // If we already resolved, the cleanup() already killed the worker;
393
+ // ignore the exit. If we're still waiting for output, treat as fail.
394
+ if (!settled && collectedOutputs.length === 0) {
395
+ fail(new Error(`worker exited (code=${code ?? 'null'}) before producing final_output`));
396
+ }
397
+ });
398
+ // Some workers send 'init' eagerly without waiting for 'ready' — for
399
+ // tests we send right away. Real worker.js requires us to wait for
400
+ // 'ready' (it allocates a port first), but it also short-circuits a
401
+ // double `init`, so a redundant send is harmless.
402
+ try {
403
+ logOneShotMemory(input, 'before-eager-init-send');
404
+ worker.send(init);
405
+ logOneShotMemory(input, 'after-eager-init-send');
406
+ }
407
+ catch {
408
+ /* worker may not be ready yet — wait for 'ready' to retry */
409
+ logOneShotMemory(input, 'eager-init-send-failed');
410
+ }
411
+ });
412
+ }
413
+ function writeAttemptTerminalSidecar(input, session, status) {
414
+ if (!input.attemptLogPath || session.webPort === undefined || session.webPort <= 0)
415
+ return;
416
+ try {
417
+ const dir = dirname(input.attemptLogPath);
418
+ mkdirSync(dir, { recursive: true });
419
+ const now = Date.now();
420
+ const sidecar = {
421
+ schemaVersion: ATTEMPT_TERMINAL_SCHEMA_VERSION,
422
+ sessionId: session.sessionId,
423
+ cliSessionId: session.cliSessionId,
424
+ webPort: session.webPort,
425
+ status,
426
+ larkAppId: session.larkAppId,
427
+ botName: session.botName,
428
+ cliId: session.cliId,
429
+ workingDir: session.workingDir,
430
+ logPath: session.logPath,
431
+ startedAt: session.startedAt,
432
+ updatedAt: now,
433
+ ...(status === 'closed' ? { closedAt: now } : {}),
434
+ };
435
+ writeFileSync(join(dir, ATTEMPT_TERMINAL_SIDECAR), JSON.stringify(sidecar, null, 2), 'utf-8');
436
+ }
437
+ catch (err) {
438
+ appendAttemptLog(input, 'system', `failed to write terminal sidecar: ${err instanceof Error ? err.message : String(err)}`);
439
+ }
440
+ }
441
+ // Per-spawn memory diagnostics. Gated by the same env flag the periodic
442
+ // daemon-level diag uses (`BOTMUX_MEMORY_DIAG_INTERVAL_MS` > 0). Default off
443
+ // in master so workflow spawn doesn't spam ~10 lines per attempt; flip the env
444
+ // on when chasing a real RSS regression and both layers light up together.
445
+ function spawnMemDiagEnabled() {
446
+ const raw = process.env.BOTMUX_MEMORY_DIAG_INTERVAL_MS;
447
+ if (!raw)
448
+ return false;
449
+ const n = Number(raw);
450
+ return Number.isFinite(n) && n > 0;
451
+ }
452
+ function logOneShotMemory(input, phase) {
453
+ if (!spawnMemDiagEnabled())
454
+ return;
455
+ const usage = process.memoryUsage();
456
+ const external = usage.external ?? 0;
457
+ const nativeOther = Math.max(0, usage.rss - usage.heapTotal - external);
458
+ logger.info(`[workflow:${input.runId}:${input.nodeId}:spawn-mem] ` +
459
+ `phase=${phase} ` +
460
+ `rss=${formatMiB(usage.rss)} ` +
461
+ `heapUsed=${formatMiB(usage.heapUsed)} ` +
462
+ `heapTotal=${formatMiB(usage.heapTotal)} ` +
463
+ `external=${formatMiB(external)} ` +
464
+ `arrayBuffers=${formatMiB(usage.arrayBuffers ?? 0)} ` +
465
+ `nativeOther~=${formatMiB(nativeOther)} ` +
466
+ `promptBytes=${Buffer.byteLength(input.prompt, 'utf-8')} ` +
467
+ `cwd=${expandWorkflowWorkingDir(input.workingDir) ?? process.cwd()}`);
468
+ }
469
+ export function expandWorkflowWorkingDir(workingDir) {
470
+ if (!workingDir)
471
+ return undefined;
472
+ if (workingDir === '~')
473
+ return homedir();
474
+ if (workingDir.startsWith('~/'))
475
+ return join(homedir(), workingDir.slice(2));
476
+ return workingDir;
477
+ }
478
+ function formatMiB(bytes) {
479
+ return `${(bytes / 1024 / 1024).toFixed(1)}MiB`;
480
+ }
481
+ function drainWorkerDiagnostics(worker, input) {
482
+ const { runId, nodeId } = input;
483
+ const prefix = `[workflow:${runId}:${nodeId}:worker]`;
484
+ worker.stdout?.on?.('data', (data) => {
485
+ for (const line of String(data).split('\n')) {
486
+ const trimmed = line.trim();
487
+ if (trimmed)
488
+ logger.info(`${prefix}:out ${truncateLogLine(trimmed)}`);
489
+ }
490
+ appendAttemptLog(input, 'stdout', String(data));
491
+ });
492
+ worker.stderr?.on?.('data', (data) => {
493
+ for (const line of String(data).split('\n')) {
494
+ const trimmed = line.trim();
495
+ if (trimmed)
496
+ logger.info(`${prefix}:err ${truncateLogLine(trimmed)}`);
497
+ }
498
+ appendAttemptLog(input, 'stderr', String(data));
499
+ });
500
+ }
501
+ function appendAttemptLog(input, channel, chunk) {
502
+ if (!input.attemptLogPath)
503
+ return;
504
+ const ts = new Date().toISOString();
505
+ const text = chunk.endsWith('\n') ? chunk : `${chunk}\n`;
506
+ const lines = text.replace(/\r/g, '').split('\n');
507
+ let out = '';
508
+ for (const line of lines) {
509
+ if (line === '')
510
+ continue;
511
+ out += `[${ts}] ${channel} ${line}\n`;
512
+ }
513
+ if (!out)
514
+ return;
515
+ try {
516
+ appendFileSync(input.attemptLogPath, out, 'utf-8');
517
+ }
518
+ catch (err) {
519
+ logger.warn(`failed to append workflow attempt log ${input.attemptLogPath}: ${err instanceof Error ? err.message : String(err)}`);
520
+ }
521
+ }
522
+ function truncateLogLine(line) {
523
+ return line.length > 2000 ? `${line.slice(0, 2000)}…[truncated]` : line;
524
+ }
525
+ /**
526
+ * Deterministically map any string id to a UUID-v4-shaped hex token.
527
+ *
528
+ * Why: Claude Code CLI ≥ 2.1.146 rejects `--session-id` values that
529
+ * aren't valid UUIDs ("Invalid session ID. Must be a valid UUID."). The
530
+ * workflow runtime mints synthetic ids by concatenating runId /
531
+ * activityId / attemptId (which embed `::` separators), so the raw form
532
+ * fails validation. We keep determinism (same input → same uuid, so the
533
+ * jsonl bridge path & resume both work) by hashing through SHA-256 and
534
+ * rewriting the version + variant nibbles to satisfy the v4 shape.
535
+ */
536
+ export function syntheticSessionUuid(rawId) {
537
+ const h = createHash('sha256').update(rawId).digest('hex');
538
+ const version = `4${h.slice(13, 16)}`;
539
+ const variantNibble = ((parseInt(h[16], 16) & 0x3) | 0x8).toString(16);
540
+ const variant = `${variantNibble}${h.slice(17, 20)}`;
541
+ return `${h.slice(0, 8)}-${h.slice(8, 12)}-${version}-${variant}-${h.slice(20, 32)}`;
542
+ }
543
+ function syntheticIds(input) {
544
+ const rawSessionId = `wf-${input.runId}-${input.activityId}-${input.attemptId}`;
545
+ return {
546
+ sessionId: syntheticSessionUuid(rawSessionId),
547
+ chatId: `wf-chat-${input.runId}`,
548
+ rootMessageId: `wf-root-${input.activityId}`,
549
+ };
550
+ }
551
+ //# sourceMappingURL=daemon-spawn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-spawn.js","sourceRoot":"","sources":["../../src/workflows/daemon-spawn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,IAAI,EAAqB,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAOzC,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAE7D,OAAO,EACL,+BAA+B,EAC/B,wBAAwB,GAGzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AA+C5C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,mBAAmB,GAAyB;IACvD,KAAK,CAAC,IAAI;QACR,MAAM,KAAK,GAAiB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE;YACpD,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;YACxC,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC,CAAC;QACH,OAAO;YACL,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAU,CAAC;YACnC,EAAE,EAAE,CAAC,KAAa,EAAE,EAAgC,EAAE,EAAE;gBACtD,KAAK,CAAC,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC;YAC/B,CAAC;YACD,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;gBACZ,IAAI,CAAC,KAAK,CAAC,MAAM;oBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrC,CAAC;YACD,IAAI,GAAG;gBACL,OAAO,KAAK,CAAC,GAAG,CAAC;YACnB,CAAC;YACD,IAAI,MAAM;gBACR,OAAO,KAAK,CAAC,MAAM,CAAC;YACtB,CAAC;YACD,IAAI,MAAM;gBACR,OAAO,KAAK,CAAC,MAAM,CAAC;YACtB,CAAC;SACc,CAAC;IACpB,CAAC;CACF,CAAC;AAqCF,MAAM,UAAU,yBAAyB,CACvC,IAA6B;IAE7B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,mBAAmB,CAAC;IACpD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,iBAAiB,EAAE,CAAC;IAC1D,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IAChE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC;IACxC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC;IAEjD,OAAO;QACL,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CACpB,cAAc,CAAC,KAAK,EAAE;YACpB,OAAO;YACP,UAAU;YACV,gBAAgB;YAChB,SAAS;YACT,aAAa;YACb,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;SACpD,CAAC;KACL,CAAC;AACJ,CAAC;AAED,4EAA4E;AAE5E,SAAS,iBAAiB;IACxB,oEAAoE;IACpE,8DAA8D;IAC9D,0EAA0E;IAC1E,gEAAgE;IAChE,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAChD,IAAI,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;AACpD,CAAC;AAaD,KAAK,UAAU,cAAc,CAC3B,KAA4B,EAC5B,IAA4B;IAE5B,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzD,gBAAgB,CAAC,KAAK,EAAE,2BAA2B,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACtC,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,wBAAwB,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACxE,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,gCAAgC,GAAG,EAAE,CAAC,CAAC;IAEzE,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QAChC,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,GAAG;QACH,GAAG,EAAE;YACH,GAAG,OAAO,CAAC,GAAG;YACd,qEAAqE;YACrE,eAAe,EAAE,GAAG;YACpB,sBAAsB,EAAE,KAAK,CAAC,KAAK;YACnC,uBAAuB,EAAE,KAAK,CAAC,MAAM;YACrC,qEAAqE;YACrE,qEAAqE;YACrE,+DAA+D;YAC/D,GAAG,CAAC,KAAK,CAAC,cAAc;gBACtB,CAAC,CAAC,EAAE,4BAA4B,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,SAAS,CAAC,EAAE;gBAClF,CAAC,CAAC,EAAE,CAAC;SACR;KACF,CAAC,CAAC;IACH,gBAAgB,CAAC,KAAK,EAAE,0BAA0B,MAAM,CAAC,GAAG,IAAI,SAAS,EAAE,CAAC,CAAC;IAC7E,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,sBAAsB,MAAM,CAAC,GAAG,IAAI,SAAS,EAAE,CAAC,CAAC;IACnF,sBAAsB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACtC,gBAAgB,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;IAEnD,IAAI,OAA2B,CAAC;IAChC,MAAM,gBAAgB,GAA+C,EAAE,CAAC;IACxE,IAAI,YAAwC,CAAC;IAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,KAAK,IAAI,aAAa,CAAC;IACxD,IAAI,YAAgC,CAAC;IAErC,MAAM,IAAI,GAAG;QACX,IAAI,EAAE,MAAe;QACrB,SAAS,EAAE,SAAS,CAAC,SAAS;QAC9B,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,aAAa,EAAE,SAAS,CAAC,aAAa;QACtC,UAAU,EAAE,GAAG;QACf,KAAK;QACL,WAAW,EAAE,KAAc;QAC3B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE,IAAa;KACtB,CAAC;IACF,gBAAgB,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC;IAE7C,OAAO,IAAI,OAAO,CAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC7D,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,YAAwC,CAAC;QAC7C,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,IAAI,mBAAmB,GAAG,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC;QAC3D,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;YACnC,IAAI,CAAC,IAAI,KAAK,CAAC,iCAAiC,SAAS,KAAK,CAAC,CAAC,CAAC;QACnE,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,MAAM,OAAO,GAAG,CAAC,OAAkC,EAAE,EAAQ,EAAE;YAC7D,YAAY,CAAC,YAAY,CAAC,CAAC;YAC3B,IAAI,YAAY;gBAAE,YAAY,CAAC,YAAY,CAAC,CAAC;YAC7C,mEAAmE;YACnE,4DAA4D;YAC5D,KAAK,CAAC,YAAY,EAAE,mBAAmB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YAChE,IAAI,CAAC;gBACH,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACjC,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;YACD,iEAAiE;YACjE,kEAAkE;YAClE,gEAAgE;YAChE,yDAAyD;YACzD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtB,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;YAChD,CAAC;QACH,CAAC,CAAC;QAEF;;;;;;;;;;;;;;;;;;WAkBG;QACH,SAAS,aAAa;YACpB,IAAI,OAAO,IAAI,eAAe;gBAAE,OAAO;YACvC,eAAe,GAAG,IAAI,CAAC;YACvB,MAAM,MAAM,GAAG,KAAK,CAAC,YAAa,CAAC,MAAuC,CAAC;YAC3E,mBAAmB,GAAG,OAAO,MAAM,EAAE,mBAAmB,KAAK,QAAQ;gBACnE,CAAC,CAAC,MAAM,CAAC,mBAAmB;gBAC5B,CAAC,CAAC,EAAE,CAAC;YACP,gBAAgB,CACd,KAAK,EACL,QAAQ,EACR,iCAAiC,mBAAmB,IAAI,WAAW,iCAAiC,IAAI,CAAC,aAAa,KAAK,CAC5H,CAAC;YACF,kEAAkE;YAClE,iEAAiE;YACjE,mEAAmE;YACnE,oEAAoE;YACpE,kDAAkD;YAClD,YAAY,CAAC,YAAY,CAAC,CAAC;YAC3B,IAAI,YAAY,EAAE,CAAC;gBACjB,YAAY,CAAC,YAAY,CAAC,CAAC;gBAC3B,YAAY,GAAG,SAAS,CAAC;YAC3B,CAAC;YACD,IAAI,CAAC;gBAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;YACpE,IAAI,CAAC;gBAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;YAC3D,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC7B,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,6CAA6C,CAAC,CAAC;gBACjF,IAAI,CAAC;oBAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;YAC9D,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YACvB,4DAA4D;YAC5D,gEAAgE;YAChE,cAAc;QAChB,CAAC;QACD,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;gBAC/B,gEAAgE;gBAChE,+DAA+D;gBAC/D,kCAAkC;gBAClC,YAAY,CAAC,aAAa,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAED,SAAS,mBAAmB;YAC1B,OAAO;gBACL,SAAS,EAAE,SAAS,CAAC,SAAS;gBAC9B,YAAY;gBACZ,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,KAAK;gBACL,UAAU,EAAE,GAAG;gBACf,OAAO;gBACP,OAAO,EAAE,KAAK,CAAC,cAAc;gBAC7B,SAAS;gBACT,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;aACpB,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,GAAU,EAAQ,EAAE;YAChC,IAAI,OAAO;gBAAE,OAAO;YACpB,+DAA+D;YAC/D,6DAA6D;YAC7D,gEAAgE;YAChE,iEAAiE;YACjE,iCAAiC;YACjC,IAAI,eAAe,EAAE,CAAC;gBACpB,gBAAgB,CACd,KAAK,EACL,QAAQ,EACR,iBAAiB,GAAG,CAAC,OAAO,qDAAqD,CAClF,CAAC;gBACF,OAAO;YACT,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;YACf,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,GAAS,EAAE;YACxB,IAAI,OAAO;gBAAE,OAAO;YACpB,kEAAkE;YAClE,8DAA8D;YAC9D,uCAAuC;YACvC,IAAI,eAAe,EAAE,CAAC;gBACpB,gBAAgB,CACd,KAAK,EACL,QAAQ,EACR,qEAAqE,CACtE,CAAC;gBACF,OAAO;YACT,CAAC;YACD,OAAO,EAAE,CAAC;YACV,MAAM,IAAI,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC3D,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,IAAI,CAAC,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC,CAAC;gBACjE,OAAO;YACT,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;YACf,OAAO,CAAC;gBACN,eAAe,EAAE,IAAI,CAAC,OAAO;gBAC7B,OAAO,EAAE;oBACP,SAAS,EAAE,SAAS,CAAC,SAAS;oBAC9B,YAAY;oBACZ,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,KAAK;oBACL,UAAU,EAAE,GAAG;oBACf,OAAO;oBACP,OAAO,EAAE,KAAK,CAAC,cAAc;oBAC7B,SAAS;oBACT,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;iBACpB;aACF,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,GAAS,EAAE;YAC5B,IAAI,YAAY;gBAAE,YAAY,CAAC,YAAY,CAAC,CAAC;YAC7C,YAAY,GAAG,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACpD,CAAC,CAAC;QAEF,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;YAC7B,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;gBACnB,KAAK,OAAO;oBACV,IAAI,OAAO;wBAAE,MAAM;oBACnB,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC;oBACrB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,qBAAqB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;oBACrE,2BAA2B,CAAC,KAAK,EAAE,mBAAmB,EAAE,EAAE,MAAM,CAAC,CAAC;oBAClE,gBAAgB,CAAC,KAAK,EAAE,+BAA+B,CAAC,CAAC;oBACzD,IAAI,CAAC;wBACH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAClB,gBAAgB,CAAC,KAAK,EAAE,8BAA8B,CAAC,CAAC;oBAC1D,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,IAAI,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC5D,CAAC;oBACD,2DAA2D;oBAC3D,uDAAuD;oBACvD,2CAA2C;oBAC3C,MAAM;gBACR,KAAK,gBAAgB;oBACnB,IAAI,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,YAAY;wBAAE,MAAM;oBACzE,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;oBAClC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,2BAA2B,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;oBACnF,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;wBACtC,2BAA2B,CAAC,KAAK,EAAE,mBAAmB,EAAE,EAAE,MAAM,CAAC,CAAC;oBACpE,CAAC;oBACD,MAAM;gBACR,KAAK,cAAc;oBACjB,IAAI,OAAO;wBAAE,MAAM;oBACnB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,KAAK,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;oBACvE,gBAAgB,CAAC,IAAI,CAAC;wBACpB,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,MAAM,EAAE,KAAK,CAAC,MAAM;qBACrB,CAAC,CAAC;oBACH,UAAU,EAAE,CAAC;oBACb,MAAM;gBACR,KAAK,eAAe;oBAClB,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC3D,UAAU,EAAE,CAAC;oBACf,CAAC;oBACD,MAAM;gBACR,KAAK,cAAc;oBACjB,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC;wBAAE,UAAU,EAAE,CAAC;oBAC9C,MAAM;gBACR,KAAK,OAAO;oBACV,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;oBAChD,IAAI,CAAC,IAAI,KAAK,CAAC,iBAAiB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;oBAClD,MAAM;gBACR,KAAK,aAAa;oBAChB,gBAAgB,CACd,KAAK,EACL,QAAQ,EACR,mBAAmB,KAAK,CAAC,IAAI,IAAI,MAAM,WAAW,KAAK,CAAC,MAAM,IAAI,MAAM,EAAE,CAC3E,CAAC;oBACF,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAChC,MAAM,EAAE,CAAC;oBACX,CAAC;yBAAM,CAAC;wBACN,IAAI,CACF,IAAI,KAAK,CACP,oBAAoB,KAAK,CAAC,IAAI,IAAI,MAAM,YAAY,KAAK,CAAC,MAAM,IAAI,MAAM,iCAAiC,CAC5G,CACF,CAAC;oBACJ,CAAC;oBACD,MAAM;YACV,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YAC9C,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,4BAA4B,IAAI,IAAI,MAAM,EAAE,CAAC,CAAC;YAChF,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,2BAA2B,CAAC,KAAK,EAAE,mBAAmB,EAAE,EAAE,QAAQ,CAAC,CAAC;YACtE,CAAC;YACD,wDAAwD;YACxD,IAAI,YAAY,EAAE,CAAC;gBACjB,YAAY,CAAC,YAAY,CAAC,CAAC;gBAC3B,YAAY,GAAG,SAAS,CAAC;YAC3B,CAAC;YACD,iEAAiE;YACjE,+DAA+D;YAC/D,+DAA+D;YAC/D,IAAI,eAAe,IAAI,CAAC,OAAO,EAAE,CAAC;gBAChC,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC/B,MAAM,CAAC,IAAI,2BAA2B,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;gBACpF,OAAO;YACT,CAAC;YACD,mEAAmE;YACnE,sEAAsE;YACtE,IAAI,CAAC,OAAO,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9C,IAAI,CACF,IAAI,KAAK,CACP,uBAAuB,IAAI,IAAI,MAAM,iCAAiC,CACvE,CACF,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,qEAAqE;QACrE,oEAAoE;QACpE,oEAAoE;QACpE,kDAAkD;QAClD,IAAI,CAAC;YACH,gBAAgB,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,gBAAgB,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,6DAA6D;YAC7D,gBAAgB,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,2BAA2B,CAClC,KAA4B,EAC5B,OAA0B,EAC1B,MAA6B;IAE7B,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC;QAAE,OAAO;IAC3F,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAC1C,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAA2B;YACtC,aAAa,EAAE,+BAA+B;YAC9C,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,MAAM;YACN,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,SAAS,EAAE,GAAG;YACd,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClD,CAAC;QACF,aAAa,CACX,IAAI,CAAC,GAAG,EAAE,wBAAwB,CAAC,EACnC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAChC,OAAO,CACR,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,gBAAgB,CACd,KAAK,EACL,QAAQ,EACR,qCAAqC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACxF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,6EAA6E;AAC7E,+EAA+E;AAC/E,2EAA2E;AAC3E,SAAS,mBAAmB;IAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC;IACvD,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,gBAAgB,CAAC,KAA4B,EAAE,KAAa;IACnE,IAAI,CAAC,mBAAmB,EAAE;QAAE,OAAO;IACnC,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC;IACxE,MAAM,CAAC,IAAI,CACT,aAAa,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,cAAc;QACtD,SAAS,KAAK,GAAG;QACjB,OAAO,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG;QAC9B,YAAY,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG;QACxC,aAAa,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG;QAC1C,YAAY,SAAS,CAAC,QAAQ,CAAC,GAAG;QAClC,gBAAgB,SAAS,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG;QACrD,gBAAgB,SAAS,CAAC,WAAW,CAAC,GAAG;QACzC,eAAe,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAC1D,OAAO,wBAAwB,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,CACrE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,UAA8B;IACrE,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAClC,IAAI,UAAU,KAAK,GAAG;QAAE,OAAO,OAAO,EAAE,CAAC;IACzC,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AAClD,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAoB,EAAE,KAA4B;IAChF,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAChC,MAAM,MAAM,GAAG,aAAa,KAAK,IAAI,MAAM,UAAU,CAAC;IACtD,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAqB,EAAE,EAAE;QACpD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,OAAO;gBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,QAAQ,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAqB,EAAE,EAAE;QACpD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,OAAO;gBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,QAAQ,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAoD,EACpD,OAAe,EACf,KAAa;IAEb,IAAI,CAAC,KAAK,CAAC,cAAc;QAAE,OAAO;IAClC,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC;IACzD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,EAAE;YAAE,SAAS;QAC1B,GAAG,IAAI,IAAI,EAAE,KAAK,OAAO,IAAI,IAAI,IAAI,CAAC;IACxC,CAAC;IACD,IAAI,CAAC,GAAG;QAAE,OAAO;IACjB,IAAI,CAAC;QACH,cAAc,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CACT,yCAAyC,KAAK,CAAC,cAAc,KAC3D,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,EAAE,CACH,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1E,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;IACtC,MAAM,aAAa,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAE,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,GAAG,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;IACrD,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,OAAO,IAAI,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AACvF,CAAC;AAED,SAAS,YAAY,CAAC,KAA4B;IAKhD,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;IAChF,OAAO;QACL,SAAS,EAAE,oBAAoB,CAAC,YAAY,CAAC;QAC7C,MAAM,EAAE,WAAW,KAAK,CAAC,KAAK,EAAE;QAChC,aAAa,EAAE,WAAW,KAAK,CAAC,UAAU,EAAE;KAC7C,CAAC;AACJ,CAAC"}