@stratusagent/gateway 0.14.7 → 0.14.9

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 (53) hide show
  1. package/dist/agent-source.d.ts +10 -0
  2. package/dist/agent-source.d.ts.map +1 -0
  3. package/dist/agent-source.js +7 -0
  4. package/dist/agent-source.js.map +1 -0
  5. package/dist/approvals.d.ts +38 -0
  6. package/dist/approvals.d.ts.map +1 -0
  7. package/dist/approvals.js +330 -0
  8. package/dist/approvals.js.map +1 -0
  9. package/dist/credential-requests.d.ts +24 -0
  10. package/dist/credential-requests.d.ts.map +1 -0
  11. package/dist/credential-requests.js +452 -0
  12. package/dist/credential-requests.js.map +1 -0
  13. package/dist/dispatch.d.ts +34 -0
  14. package/dist/dispatch.d.ts.map +1 -0
  15. package/dist/dispatch.js +461 -0
  16. package/dist/dispatch.js.map +1 -0
  17. package/dist/index.d.ts +4 -1290
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +202 -2546
  20. package/dist/index.js.map +1 -1
  21. package/dist/lifecycle.d.ts +130 -0
  22. package/dist/lifecycle.d.ts.map +1 -0
  23. package/dist/lifecycle.js +147 -0
  24. package/dist/lifecycle.js.map +1 -0
  25. package/dist/merge-batch.d.ts +60 -0
  26. package/dist/merge-batch.d.ts.map +1 -0
  27. package/dist/merge-batch.js +59 -0
  28. package/dist/merge-batch.js.map +1 -0
  29. package/dist/recovery.d.ts +49 -0
  30. package/dist/recovery.d.ts.map +1 -0
  31. package/dist/recovery.js +487 -0
  32. package/dist/recovery.js.map +1 -0
  33. package/dist/session-keys.d.ts +101 -0
  34. package/dist/session-keys.d.ts.map +1 -0
  35. package/dist/session-keys.js +148 -0
  36. package/dist/session-keys.js.map +1 -0
  37. package/dist/steering.d.ts +24 -0
  38. package/dist/steering.d.ts.map +1 -0
  39. package/dist/steering.js +108 -0
  40. package/dist/steering.js.map +1 -0
  41. package/dist/sub-agents.d.ts +20 -0
  42. package/dist/sub-agents.d.ts.map +1 -0
  43. package/dist/sub-agents.js +263 -0
  44. package/dist/sub-agents.js.map +1 -0
  45. package/dist/turn-dispatch.d.ts +34 -0
  46. package/dist/turn-dispatch.d.ts.map +1 -0
  47. package/dist/turn-dispatch.js +179 -0
  48. package/dist/turn-dispatch.js.map +1 -0
  49. package/dist/types.d.ts +1103 -0
  50. package/dist/types.d.ts.map +1 -0
  51. package/dist/types.js +2 -0
  52. package/dist/types.js.map +1 -0
  53. package/package.json +7 -7
@@ -0,0 +1,34 @@
1
+ import { type AgentDefinition, type AgentRunner, type AgentRuntimeContext, type Executor, type JsonObject, type Session, type SteeredMessage } from '@stratusagent/core';
2
+ import type { AgentSource } from './agent-source.ts';
3
+ import type { ShardedSessionStore } from './sessions.ts';
4
+ import type { DispatchInput, GatewayOptions } from './types.ts';
5
+ import { type RuntimeConfig, type StateEnvironment } from '@stratusagent/state';
6
+ /** What the turn dispatch closes over in `createGateway`. */
7
+ export interface TurnDispatchDeps {
8
+ options: GatewayOptions;
9
+ env: StateEnvironment;
10
+ store: ShardedSessionStore;
11
+ getSelectedExecutor: () => Executor | undefined;
12
+ defaultAgentId: () => Promise<string>;
13
+ refreshAgent: (agentId: string) => Promise<AgentSource>;
14
+ runtimeContextFor: (source: AgentSource, config: RuntimeConfig, onFallback: boolean, metadata: JsonObject | undefined, subAgent?: boolean) => AgentRuntimeContext;
15
+ runnerFor: (config: RuntimeConfig, agentId: string, subAgent?: boolean) => AgentRunner;
16
+ withWatchdog: <T>(sessionId: string, external: AbortSignal | undefined, idleEnabled: boolean, fallbackStreams: boolean, run: (signal: AbortSignal) => Promise<T>) => Promise<T>;
17
+ onTurnRuntime: <T>(sessionId: string, runtime: {
18
+ source: AgentSource;
19
+ config: RuntimeConfig;
20
+ }, work: () => Promise<T>) => Promise<T>;
21
+ runtimeForAgent: (source: AgentSource) => Promise<RuntimeConfig>;
22
+ watchdogStreamsFor: (session: Pick<Session, 'metadata'> | undefined, config: RuntimeConfig) => {
23
+ switchedToFallback: boolean;
24
+ effectiveStreams: boolean;
25
+ fallbackStreams: boolean;
26
+ };
27
+ reachesHarness: (config: RuntimeConfig, switchedToFallback: boolean) => boolean;
28
+ settleLeftForNextStart: (input: DispatchInput, turn: Promise<Session>) => Promise<Session>;
29
+ }
30
+ export declare const createTurnDispatch: ({ options, env, store, getSelectedExecutor, defaultAgentId, refreshAgent, runtimeContextFor, runnerFor, withWatchdog, onTurnRuntime, runtimeForAgent, watchdogStreamsFor, reachesHarness, settleLeftForNextStart, }: TurnDispatchDeps) => {
31
+ dispatchInternal: (input: DispatchInput, absorbedKeys?: readonly string[], subAgent?: AgentDefinition, steer?: (turnSignal: AbortSignal) => Promise<SteeredMessage | undefined>) => Promise<Session>;
32
+ };
33
+ export type TurnDispatch = ReturnType<typeof createTurnDispatch>;
34
+ //# sourceMappingURL=turn-dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-dispatch.d.ts","sourceRoot":"","sources":["../src/turn-dispatch.ts"],"names":[],"mappings":"AAWA,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,mBAAmB,EAExB,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAQhE,OAAO,EAAyB,KAAK,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvG,6DAA6D;AAC7D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,cAAc,CAAC;IACxB,GAAG,EAAE,gBAAgB,CAAC;IACtB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,mBAAmB,EAAE,MAAM,QAAQ,GAAG,SAAS,CAAC;IAChD,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IACxD,iBAAiB,EAAE,CACjB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,OAAO,EACnB,QAAQ,EAAE,UAAU,GAAG,SAAS,EAChC,QAAQ,CAAC,EAAE,OAAO,KACf,mBAAmB,CAAC;IACzB,SAAS,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,WAAW,CAAC;IACvF,YAAY,EAAE,CAAC,CAAC,EACd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW,GAAG,SAAS,EACjC,WAAW,EAAE,OAAO,EACpB,eAAe,EAAE,OAAO,EACxB,GAAG,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,KACrC,OAAO,CAAC,CAAC,CAAC,CAAC;IAChB,aAAa,EAAE,CAAC,CAAC,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,aAAa,CAAA;KAAE,EACvD,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KACnB,OAAO,CAAC,CAAC,CAAC,CAAC;IAChB,eAAe,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IACjE,kBAAkB,EAAE,CAClB,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,SAAS,EAC9C,MAAM,EAAE,aAAa,KAClB;QAAE,kBAAkB,EAAE,OAAO,CAAC;QAAC,gBAAgB,EAAE,OAAO,CAAC;QAAC,eAAe,EAAE,OAAO,CAAA;KAAE,CAAC;IAC1F,cAAc,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,OAAO,KAAK,OAAO,CAAC;IAChF,sBAAsB,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5F;AAED,eAAO,MAAM,kBAAkB,GAAI,qNAehC,gBAAgB;8BAOR,aAAa,iBACN,SAAS,MAAM,EAAE,aACpB,eAAe,UAQlB,CAAC,UAAU,EAAE,WAAW,KAAK,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,KACvE,OAAO,CAAC,OAAO,CAAC;CAoKpB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC"}
@@ -0,0 +1,179 @@
1
+ /*
2
+ * One turn on a session, below the queueing `dispatch` does: resolve the
3
+ * agent and its runtime, run it under the watchdog, and save what it left.
4
+ * `dispatchInternal` is what `dispatch`, scheduled firings, tool-call
5
+ * bindings and sub-agents call. Moved out of `createGateway` in index.ts as
6
+ * is: the statement is unchanged, inside a factory that takes what it closed
7
+ * over there, and `createGateway` calls it where it was. The one edit:
8
+ * `selectedExecutor` is a `let` set when plugins start, so it is read through
9
+ * `getSelectedExecutor()`.
10
+ */
11
+ import { abortErrorFor, CONVERSATION_METADATA_KEY, } from '@stratusagent/core';
12
+ import { isDelegatedSession, withoutDelegation } from '@stratusagent/agents';
13
+ import { crossIdentityError, EXECUTOR_METADATA_KEY, isSubAgentSession, ROLLED_OVER_TO_METADATA_KEY, SUB_AGENT_METADATA_KEY, } from "./session-keys.js";
14
+ import { assertStateCompatible } from '@stratusagent/state';
15
+ export const createTurnDispatch = ({ options, env, store, getSelectedExecutor, defaultAgentId, refreshAgent, runtimeContextFor, runnerFor, withWatchdog, onTurnRuntime, runtimeForAgent, watchdogStreamsFor, reachesHarness, settleLeftForNextStart, }) => {
16
+ /**
17
+ * `subAgent` is the narrowed definition `subAgents.run` built: the turn
18
+ * runs as that, on the parent's resolved provider, with no memory and no
19
+ * soul. Only that path passes it.
20
+ */
21
+ const dispatchInternal = async (input, absorbedKeys = [], subAgent,
22
+ /**
23
+ * See `RunInput.steer`; passed by `dispatch` for an opted-in caller.
24
+ * Handed the turn's own signal — the one the runner was given, which
25
+ * the watchdog, `abortTurns` and a restart's window abort as well as
26
+ * the callers — so it takes nothing into a turn that is already
27
+ * stopping (card 959).
28
+ */
29
+ steer) => {
30
+ // Re-read on every turn, not once at start: a newer build that stamps
31
+ // the home while this daemon is serving has formats this build does not
32
+ // understand, and a daemon that kept writing into them would be the
33
+ // downgrade the stamp exists to refuse — from the inside. Inside the
34
+ // session chain, so a turn already accepted is counted by the drain
35
+ // before anything else runs. One small file read per turn.
36
+ assertStateCompatible(env);
37
+ // A dispatch whose signal fired while it queued behind another turn
38
+ // must not touch durable state: without this check, the runner would
39
+ // load the session, append the cancelled user message, and save it as
40
+ // failed — polluting future model history with input never processed.
41
+ if (input.signal?.aborted) {
42
+ throw abortErrorFor(input.signal);
43
+ }
44
+ // A session pins its agent: when the caller names none, an existing
45
+ // conversation keeps the agent it was created with even if the
46
+ // configured default soul has changed since — only a brand-new session
47
+ // takes the current default. (Loaded here, before the watchdog, also
48
+ // because whether this turn streams depends on durable session state.)
49
+ const existing = await store.get(input.sessionId);
50
+ const agentId = input.agentId ?? existing?.agent.id ?? await defaultAgentId();
51
+ const source = await refreshAgent(agentId);
52
+ const agent = subAgent ?? source.definition;
53
+ if (subAgent !== undefined && existing) {
54
+ throw new Error(`Session ${input.sessionId} already exists; a sub-agent's session is new every time.`);
55
+ }
56
+ // An archived transcript is the record of a conversation that has moved
57
+ // on. Continuing it would revive a session the operator deliberately
58
+ // left behind, under an id nothing routes to any more.
59
+ const continuedAs = existing?.metadata?.[ROLLED_OVER_TO_METADATA_KEY];
60
+ if (typeof continuedAs === 'string') {
61
+ throw new Error(`Session ${input.sessionId} was rolled over; it is an archived transcript and the conversation continues as ${continuedAs}.`);
62
+ }
63
+ const config = await runtimeForAgent(source);
64
+ const runner = runnerFor(config, source.definition.id, subAgent !== undefined);
65
+ // Which executor the turn's tool calls run through — the built-in
66
+ // under the name `stratus run` has always recorded, a contributed one
67
+ // under its registered name — so a transcript says where a command
68
+ // ran, not only which model asked for it.
69
+ const executorRecord = getSelectedExecutor() && options.executor !== undefined ? options.executor : 'local-command';
70
+ const metadata = {
71
+ provider: config.provider,
72
+ // A contributed provider may leave the model to its own default, in
73
+ // which case there is none to record.
74
+ ...(config.provider !== 'demo' && config.model !== undefined ? { model: config.model } : {}),
75
+ ...input.metadata,
76
+ // After the caller's metadata, and reserved besides: a dispatch that
77
+ // could write it could make a transcript claim a sandbox ran what
78
+ // the host ran.
79
+ [EXECUTOR_METADATA_KEY]: executorRecord,
80
+ };
81
+ if (existing && existing.agent.id !== agent.id) {
82
+ throw crossIdentityError(input.sessionId, existing.agent.id, agent.id);
83
+ }
84
+ // A sub-agent's session is new, but may start on its parent's fallback.
85
+ const { switchedToFallback, effectiveStreams, fallbackStreams } = watchdogStreamsFor(existing ?? (subAgent !== undefined ? { metadata } : undefined), config);
86
+ // Recorded with a keyed message so a restart judges the turn by what it
87
+ // could have run on, not by whatever the config resolves to by then.
88
+ // The fallback counts: a turn can switch to it mid-run. Once a session
89
+ // has switched for good, the primary is never called again, and only
90
+ // the fallback counts.
91
+ const hostedLoop = input.idempotencyKey !== undefined && reachesHarness(config, switchedToFallback);
92
+ return settleLeftForNextStart(input, onTurnRuntime(input.sessionId, { source, config }, () => withWatchdog(input.sessionId, input.signal, effectiveStreams, fallbackStreams, async (signal) => {
93
+ // The preflight above (agent refresh, config resolution, session
94
+ // load) awaited filesystem work; the entry check has long passed.
95
+ // Recheck before the runner touches durable state, or a dispatch
96
+ // cancelled mid-preflight would still persist its user message.
97
+ if (signal.aborted) {
98
+ throw abortErrorFor(signal);
99
+ }
100
+ if (existing) {
101
+ // Refresh the stored definition before resuming, so the turn runs
102
+ // with the current instructions, tools, and credentials.
103
+ existing.agent = agent;
104
+ // A sub-session reached here is being continued from outside — a
105
+ // delegation never resumes its own child; its ids are minted once.
106
+ // The delegating turn is over, so the markers come off: what is
107
+ // now an ordinary conversation must not be closed as an orphan if
108
+ // a later turn of it parks and the daemon dies.
109
+ if (isDelegatedSession(existing) && existing.metadata) {
110
+ existing.metadata = withoutDelegation(existing.metadata);
111
+ }
112
+ // The same for a sub-agent's session, continued as the agent itself:
113
+ // the marker that denies its approvals unasked comes off with the
114
+ // delegation markers it carries.
115
+ if (isSubAgentSession(existing) && existing.metadata) {
116
+ const { [SUB_AGENT_METADATA_KEY]: _subAgent, ...rest } = withoutDelegation(existing.metadata);
117
+ existing.metadata = rest;
118
+ }
119
+ // The executor record follows the daemon, not the session's first
120
+ // turn: a restart that selected another executor runs this turn's
121
+ // commands there, and a session from before the record existed
122
+ // gets one now rather than never.
123
+ if (existing.metadata?.[EXECUTOR_METADATA_KEY] !== executorRecord) {
124
+ existing.metadata = { ...existing.metadata, [EXECUTOR_METADATA_KEY]: executorRecord };
125
+ }
126
+ // The room rides on the turn, but two readers have only the
127
+ // session's: a turn parked on approval and recovered after a
128
+ // restart, and a turn that brings no room of its own (a schedule
129
+ // firing into the thread). Both get the latest room this way, not
130
+ // the first turn's, which a channel made public since would make
131
+ // read as more private than it is. A turn from a channel that
132
+ // could not tell the room (its lookup failed) clears it instead:
133
+ // no room is the generic line, and an old one is a claim.
134
+ if (typeof input.metadata?.channel === 'string') {
135
+ const room = input.metadata[CONVERSATION_METADATA_KEY];
136
+ const { [CONVERSATION_METADATA_KEY]: _stale, ...rest } = existing.metadata ?? {};
137
+ existing.metadata = room !== undefined ? { ...rest, [CONVERSATION_METADATA_KEY]: room } : rest;
138
+ }
139
+ await store.save(existing);
140
+ // The turn's metadata rides along for the sender's trust: without
141
+ // it a resumed turn has no way to say who sent it, and a stranger
142
+ // mentioning the agent in a thread the operator opened would
143
+ // inherit the operator's label.
144
+ return runner.resume({
145
+ sessionId: input.sessionId,
146
+ userMessage: input.userMessage,
147
+ ...(input.images !== undefined ? { images: input.images } : {}),
148
+ ...(input.addressed !== undefined ? { addressed: input.addressed } : {}),
149
+ ...(input.replyOptional === true ? { replyOptional: true } : {}),
150
+ ...(input.idempotencyKey !== undefined ? { idempotencyKey: input.idempotencyKey } : {}),
151
+ ...(absorbedKeys.length > 0 ? { absorbedKeys: [...absorbedKeys] } : {}),
152
+ ...(hostedLoop ? { hostedLoop } : {}),
153
+ ...(input.metadata ? { metadata: input.metadata } : {}),
154
+ runtime: runtimeContextFor(source, config, switchedToFallback, input.metadata),
155
+ ...(steer !== undefined ? { steer: () => steer(signal) } : {}),
156
+ signal,
157
+ });
158
+ }
159
+ return runner.run({
160
+ sessionId: input.sessionId,
161
+ agent,
162
+ userMessage: input.userMessage,
163
+ ...(input.images !== undefined ? { images: input.images } : {}),
164
+ ...(input.addressed !== undefined ? { addressed: input.addressed } : {}),
165
+ ...(input.replyOptional === true ? { replyOptional: true } : {}),
166
+ ...(input.idempotencyKey !== undefined ? { idempotencyKey: input.idempotencyKey } : {}),
167
+ ...(absorbedKeys.length > 0 ? { absorbedKeys: [...absorbedKeys] } : {}),
168
+ ...(hostedLoop ? { hostedLoop } : {}),
169
+ ...(input.earlier !== undefined && input.earlier.length > 0 ? { earlier: input.earlier } : {}),
170
+ metadata,
171
+ runtime: runtimeContextFor(source, config, switchedToFallback, input.metadata, subAgent !== undefined),
172
+ ...(steer !== undefined ? { steer: () => steer(signal) } : {}),
173
+ signal,
174
+ });
175
+ })));
176
+ };
177
+ return { dispatchInternal };
178
+ };
179
+ //# sourceMappingURL=turn-dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-dispatch.js","sourceRoot":"","sources":["../src/turn-dispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,aAAa,EAIb,yBAAyB,GAK1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAI7E,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,2BAA2B,EAC3B,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,qBAAqB,EAA6C,MAAM,qBAAqB,CAAC;AAuCvG,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,EACjC,OAAO,EACP,GAAG,EACH,KAAK,EACL,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACT,YAAY,EACZ,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,sBAAsB,GACL,EAAE,EAAE;IACrB;;;;OAIG;IACH,MAAM,gBAAgB,GAAG,KAAK,EAC5B,KAAoB,EACpB,eAAkC,EAAE,EACpC,QAA0B;IAC1B;;;;;;OAMG;IACH,KAAwE,EACtD,EAAE;QACpB,sEAAsE;QACtE,wEAAwE;QACxE,oEAAoE;QACpE,qEAAqE;QACrE,oEAAoE;QACpE,2DAA2D;QAC3D,qBAAqB,CAAC,GAAG,CAAC,CAAC;QAC3B,oEAAoE;QACpE,qEAAqE;QACrE,sEAAsE;QACtE,sEAAsE;QACtE,IAAI,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YAC1B,MAAM,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QAED,oEAAoE;QACpE,+DAA+D;QAC/D,uEAAuE;QACvE,qEAAqE;QACrE,uEAAuE;QACvE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,QAAQ,EAAE,KAAK,CAAC,EAAE,IAAI,MAAM,cAAc,EAAE,CAAC;QAC9E,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC;QAC5C,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,CAAC,SAAS,2DAA2D,CAAC,CAAC;QACzG,CAAC;QAED,wEAAwE;QACxE,qEAAqE;QACrE,uDAAuD;QACvD,MAAM,WAAW,GAAG,QAAQ,EAAE,QAAQ,EAAE,CAAC,2BAA2B,CAAC,CAAC;QACtE,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,WAAW,KAAK,CAAC,SAAS,oFAAoF,WAAW,GAAG,CAC7H,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC;QAC/E,kEAAkE;QAClE,sEAAsE;QACtE,mEAAmE;QACnE,0CAA0C;QAC1C,MAAM,cAAc,GAAG,mBAAmB,EAAE,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC;QAEpH,MAAM,QAAQ,GAAe;YAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,oEAAoE;YACpE,sCAAsC;YACtC,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5F,GAAG,KAAK,CAAC,QAAQ;YACjB,qEAAqE;YACrE,kEAAkE;YAClE,gBAAgB;YAChB,CAAC,qBAAqB,CAAC,EAAE,cAAc;SACxC,CAAC;QAEF,IAAI,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,EAAE,CAAC;YAC/C,MAAM,kBAAkB,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,wEAAwE;QACxE,MAAM,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,GAAG,kBAAkB,CAClF,QAAQ,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EAC/D,MAAM,CACP,CAAC;QACF,wEAAwE;QACxE,qEAAqE;QACrE,uEAAuE;QACvE,qEAAqE;QACrE,uBAAuB;QACvB,MAAM,UAAU,GAAG,KAAK,CAAC,cAAc,KAAK,SAAS,IAAI,cAAc,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;QAEpG,OAAO,sBAAsB,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,gBAAgB,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAC5L,iEAAiE;YACjE,kEAAkE;YAClE,iEAAiE;YACjE,gEAAgE;YAChE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;YAC9B,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,kEAAkE;gBAClE,yDAAyD;gBACzD,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;gBACvB,iEAAiE;gBACjE,mEAAmE;gBACnE,gEAAgE;gBAChE,kEAAkE;gBAClE,gDAAgD;gBAChD,IAAI,kBAAkB,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBACtD,QAAQ,CAAC,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAC3D,CAAC;gBACD,qEAAqE;gBACrE,kEAAkE;gBAClE,iCAAiC;gBACjC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBACrD,MAAM,EAAE,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBAC9F,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC;gBAC3B,CAAC;gBACD,kEAAkE;gBAClE,kEAAkE;gBAClE,+DAA+D;gBAC/D,kCAAkC;gBAClC,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC,qBAAqB,CAAC,KAAK,cAAc,EAAE,CAAC;oBAClE,QAAQ,CAAC,QAAQ,GAAG,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC,qBAAqB,CAAC,EAAE,cAAc,EAAE,CAAC;gBACxF,CAAC;gBACD,4DAA4D;gBAC5D,6DAA6D;gBAC7D,iEAAiE;gBACjE,kEAAkE;gBAClE,iEAAiE;gBACjE,8DAA8D;gBAC9D,iEAAiE;gBACjE,0DAA0D;gBAC1D,IAAI,OAAO,KAAK,CAAC,QAAQ,EAAE,OAAO,KAAK,QAAQ,EAAE,CAAC;oBAChD,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC;oBACvD,MAAM,EAAE,CAAC,yBAAyB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;oBACjF,QAAQ,CAAC,QAAQ,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,yBAAyB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBACjG,CAAC;gBACD,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC3B,kEAAkE;gBAClE,kEAAkE;gBAClE,6DAA6D;gBAC7D,gCAAgC;gBAChC,OAAO,MAAM,CAAC,MAAM,CAAC;oBACnB,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;oBAC9B,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC/D,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACxE,GAAG,CAAC,KAAK,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChE,GAAG,CAAC,KAAK,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvF,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvD,OAAO,EAAE,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,KAAK,CAAC,QAAQ,CAAC;oBAC9E,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC9D,MAAM;iBACP,CAAC,CAAC;YACL,CAAC;YAED,OAAO,MAAM,CAAC,GAAG,CAAC;gBAChB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,KAAK;gBACL,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/D,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxE,GAAG,CAAC,KAAK,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChE,GAAG,CAAC,KAAK,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvF,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrC,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9F,QAAQ;gBACR,OAAO,EAAE,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,KAAK,SAAS,CAAC;gBACtG,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9D,MAAM;aACP,CAAC,CAAC;QACL,CAAC,CAAC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAC9B,CAAC,CAAC"}