@farmslot/agent-runtime 0.8.1 → 0.9.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 (97) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +2 -2
  3. package/bin/farmslot-agent.mjs +3 -43
  4. package/dist/index.d.ts +2 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +2 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/native/affinity.test.d.ts +2 -0
  9. package/dist/native/affinity.test.d.ts.map +1 -0
  10. package/dist/native/affinity.test.js +30 -0
  11. package/dist/native/affinity.test.js.map +1 -0
  12. package/dist/native/claude.d.ts +11 -0
  13. package/dist/native/claude.d.ts.map +1 -0
  14. package/dist/native/claude.js +490 -0
  15. package/dist/native/claude.js.map +1 -0
  16. package/dist/native/client.d.ts +21 -0
  17. package/dist/native/client.d.ts.map +1 -0
  18. package/dist/native/client.js +106 -0
  19. package/dist/native/client.js.map +1 -0
  20. package/dist/native/codex.d.ts +3 -0
  21. package/dist/native/codex.d.ts.map +1 -0
  22. package/dist/native/codex.js +266 -0
  23. package/dist/native/codex.js.map +1 -0
  24. package/dist/native/durability.test.d.ts +2 -0
  25. package/dist/native/durability.test.d.ts.map +1 -0
  26. package/dist/native/durability.test.js +516 -0
  27. package/dist/native/durability.test.js.map +1 -0
  28. package/dist/native/host.d.ts +2 -0
  29. package/dist/native/host.d.ts.map +1 -0
  30. package/dist/native/host.js +90 -0
  31. package/dist/native/host.js.map +1 -0
  32. package/dist/native/index.d.ts +4 -0
  33. package/dist/native/index.d.ts.map +1 -0
  34. package/dist/native/index.js +3 -0
  35. package/dist/native/index.js.map +1 -0
  36. package/dist/native/ipc.d.ts +49 -0
  37. package/dist/native/ipc.d.ts.map +1 -0
  38. package/dist/native/ipc.js +109 -0
  39. package/dist/native/ipc.js.map +1 -0
  40. package/dist/native/manager.d.ts +43 -0
  41. package/dist/native/manager.d.ts.map +1 -0
  42. package/dist/native/manager.js +510 -0
  43. package/dist/native/manager.js.map +1 -0
  44. package/dist/native/process-tree.d.ts +15 -0
  45. package/dist/native/process-tree.d.ts.map +1 -0
  46. package/dist/native/process-tree.js +128 -0
  47. package/dist/native/process-tree.js.map +1 -0
  48. package/dist/native/process-tree.test.d.ts +2 -0
  49. package/dist/native/process-tree.test.d.ts.map +1 -0
  50. package/dist/native/process-tree.test.js +49 -0
  51. package/dist/native/process-tree.test.js.map +1 -0
  52. package/dist/native/process.d.ts +34 -0
  53. package/dist/native/process.d.ts.map +1 -0
  54. package/dist/native/process.js +223 -0
  55. package/dist/native/process.js.map +1 -0
  56. package/dist/native/service.d.ts +7 -0
  57. package/dist/native/service.d.ts.map +1 -0
  58. package/dist/native/service.js +117 -0
  59. package/dist/native/service.js.map +1 -0
  60. package/dist/native/storage.d.ts +11 -0
  61. package/dist/native/storage.d.ts.map +1 -0
  62. package/dist/native/storage.js +102 -0
  63. package/dist/native/storage.js.map +1 -0
  64. package/dist/native/supervisor.d.ts +2 -0
  65. package/dist/native/supervisor.d.ts.map +1 -0
  66. package/dist/native/supervisor.js +127 -0
  67. package/dist/native/supervisor.js.map +1 -0
  68. package/dist/native/types.d.ts +26 -0
  69. package/dist/native/types.d.ts.map +1 -0
  70. package/dist/native/types.js +2 -0
  71. package/dist/native/types.js.map +1 -0
  72. package/dist/native/workspace-files.d.ts +6 -0
  73. package/dist/native/workspace-files.d.ts.map +1 -0
  74. package/dist/native/workspace-files.js +62 -0
  75. package/dist/native/workspace-files.js.map +1 -0
  76. package/dist/native/workspace.d.ts +5 -0
  77. package/dist/native/workspace.d.ts.map +1 -0
  78. package/dist/native/workspace.js +120 -0
  79. package/dist/native/workspace.js.map +1 -0
  80. package/dist/task-init/index.d.ts +66 -0
  81. package/dist/task-init/index.d.ts.map +1 -0
  82. package/dist/task-init/index.js +120 -0
  83. package/dist/task-init/index.js.map +1 -0
  84. package/dist/task-init/task-document.d.ts +98 -0
  85. package/dist/task-init/task-document.d.ts.map +1 -0
  86. package/dist/task-init/task-document.js +184 -0
  87. package/dist/task-init/task-document.js.map +1 -0
  88. package/dist/task-init/write.d.ts +48 -0
  89. package/dist/task-init/write.d.ts.map +1 -0
  90. package/dist/task-init/write.js +70 -0
  91. package/dist/task-init/write.js.map +1 -0
  92. package/package.json +13 -4
  93. package/scripts/checklist-target.cjs +5 -3
  94. package/scripts/execution-template-cli.mjs +9 -7
  95. package/scripts/mark-checklist-step.cjs +1 -1
  96. package/scripts/task-init-cli.mjs +166 -0
  97. package/scripts/worker-terminal-contract.cjs +15 -3
@@ -0,0 +1,90 @@
1
+ import { chmodSync, unlinkSync } from 'node:fs';
2
+ import { createServer } from 'node:net';
3
+ import { join } from 'node:path';
4
+ import { authenticated, decodeRequest, object } from './ipc.js';
5
+ import { NativeSessionManager } from './manager.js';
6
+ import { privateDirectory, readJson } from './storage.js';
7
+ // The supervisor must durably register this PID before the host can bind or launch.
8
+ await new Promise((resolve, reject) => {
9
+ process.once('message', (message) => {
10
+ if (message === 'start')
11
+ resolve();
12
+ else
13
+ reject(new Error('Invalid native host startup release'));
14
+ });
15
+ process.once('disconnect', () => reject(new Error('Native supervisor stopped before host registration')));
16
+ });
17
+ const root = process.argv[2];
18
+ const identity = readJson(join(root, 'host.json'));
19
+ const manager = new NativeSessionManager(join(root, 'sessions'), identity.executionNodeId ?? 'local');
20
+ const server = createServer({ allowHalfOpen: true }, (socket) => {
21
+ socket.setEncoding('utf8');
22
+ socket.setTimeout(50_000, () => socket.destroy());
23
+ let input = '';
24
+ socket.on('error', (error) => {
25
+ // Peer loss only ends this RPC. The host and its operation remain authoritative.
26
+ if (!['EPIPE', 'ECONNRESET'].includes(error.code ?? ''))
27
+ throw error;
28
+ });
29
+ socket.on('data', (chunk) => {
30
+ input += chunk;
31
+ if (Buffer.byteLength(input) > 1024 * 1024)
32
+ socket.destroy();
33
+ });
34
+ socket.on('end', () => {
35
+ void (async () => {
36
+ try {
37
+ const envelope = object(JSON.parse(input));
38
+ if (!authenticated(envelope.token, identity.token))
39
+ throw new Error('Native IPC authentication failed');
40
+ const p = decodeRequest(envelope.request);
41
+ let value;
42
+ switch (p.method) {
43
+ case 'create':
44
+ value = await manager.create(p.owner, p.params);
45
+ break;
46
+ case 'ensure':
47
+ value = await manager.ensure(p.owner, p.params);
48
+ break;
49
+ case 'list':
50
+ value = manager.list(p.owner);
51
+ break;
52
+ case 'read':
53
+ value = manager.read(p.owner, p.id, p.after, p.limit);
54
+ break;
55
+ case 'send':
56
+ value = await manager.send(p.owner, p.id, p.commandId, p.text);
57
+ break;
58
+ case 'respond':
59
+ value = await manager.respond(p.owner, p.id, p.requestId, p.response);
60
+ break;
61
+ case 'interrupt':
62
+ value = await manager.interrupt(p.owner, p.id);
63
+ break;
64
+ case 'close':
65
+ value = await manager.close(p.owner, p.id);
66
+ break;
67
+ }
68
+ if (!socket.destroyed)
69
+ socket.end(JSON.stringify({ value: value ?? null }));
70
+ }
71
+ catch (error) {
72
+ if (!socket.destroyed)
73
+ socket.end(JSON.stringify({ error: error instanceof Error ? error.message : String(error) }));
74
+ }
75
+ })();
76
+ });
77
+ });
78
+ privateDirectory(join(identity.socket, '..'));
79
+ try {
80
+ unlinkSync(identity.socket);
81
+ }
82
+ catch (error) {
83
+ if (error.code !== 'ENOENT')
84
+ throw error;
85
+ }
86
+ server.listen(identity.socket, () => {
87
+ chmodSync(identity.socket, 0o600);
88
+ process.send?.('ready');
89
+ });
90
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/native/host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { NativeSessionClient } from './client.js';
2
+ export { NativeSessionManager, resolveNativeExecutable } from './manager.js';
3
+ export type { NativeAdapter, NativeAdapterOptions, NativeAdapterSession, NativeEventInput, } from './types.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/native/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC7E,YAAY,EACV,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { NativeSessionClient } from './client.js';
2
+ export { NativeSessionManager, resolveNativeExecutable } from './manager.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/native/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { NativeSessionCreateParams, NativeSessionEnsureParams, NativeSessionResponse } from '@farmslot/protocol';
2
+ export interface HostIdentity {
3
+ executionNodeId?: string;
4
+ supportsEnsure?: boolean;
5
+ pid: number;
6
+ token: string;
7
+ socket: string;
8
+ }
9
+ export type HostRequest = {
10
+ method: 'create';
11
+ owner: string;
12
+ params: NativeSessionCreateParams;
13
+ } | {
14
+ method: 'ensure';
15
+ owner: string;
16
+ params: NativeSessionEnsureParams;
17
+ } | {
18
+ method: 'list';
19
+ owner: string;
20
+ } | {
21
+ method: 'read';
22
+ owner: string;
23
+ id: string;
24
+ after?: number;
25
+ limit?: number;
26
+ } | {
27
+ method: 'send';
28
+ owner: string;
29
+ id: string;
30
+ commandId: string;
31
+ text: string;
32
+ } | {
33
+ method: 'respond';
34
+ owner: string;
35
+ id: string;
36
+ requestId: string;
37
+ response: NativeSessionResponse;
38
+ } | {
39
+ method: 'interrupt' | 'close';
40
+ owner: string;
41
+ id: string;
42
+ };
43
+ export declare function socketDirectory(root: string): string;
44
+ export declare function authenticated(actual: unknown, expected: string): boolean;
45
+ export declare function object(value: unknown): Record<string, unknown>;
46
+ export declare function decodeRequest(value: unknown): HostRequest;
47
+ /** One attempt only. A lost reply never causes an implicit mutation retry. */
48
+ export declare function requestHost<T>(host: HostIdentity, request: HostRequest): Promise<T>;
49
+ //# sourceMappingURL=ipc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc.d.ts","sourceRoot":"","sources":["../../src/native/ipc.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,yBAAyB,EACzB,yBAAyB,EACzB,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,YAAY;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AACD,MAAM,MAAM,WAAW,GACnB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,yBAAyB,CAAA;CAAE,GACtE;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,yBAAyB,CAAA;CAAE,GACtE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7E;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9E;IACE,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,qBAAqB,CAAC;CACjC,GACD;IAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AACjE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKpD;AACD,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMxE;AACD,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAI9D;AAKD,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAwDzD;AACD,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAyBnF"}
@@ -0,0 +1,109 @@
1
+ import { createHash, timingSafeEqual } from 'node:crypto';
2
+ import { connect } from 'node:net';
3
+ import { join } from 'node:path';
4
+ export function socketDirectory(root) {
5
+ return join('/tmp', `fsn-${process.getuid?.()}-${createHash('sha256').update(root).digest('hex').slice(0, 20)}`);
6
+ }
7
+ export function authenticated(actual, expected) {
8
+ return (typeof actual === 'string' &&
9
+ Buffer.byteLength(actual) === Buffer.byteLength(expected) &&
10
+ timingSafeEqual(Buffer.from(actual), Buffer.from(expected)));
11
+ }
12
+ export function object(value) {
13
+ if (!value || typeof value !== 'object' || Array.isArray(value))
14
+ throw new Error('Expected IPC object');
15
+ return value;
16
+ }
17
+ function string(p, key) {
18
+ if (typeof p[key] !== 'string' || !p[key].trim())
19
+ throw new Error(`Invalid IPC ${key}`);
20
+ return p[key];
21
+ }
22
+ export function decodeRequest(value) {
23
+ const p = object(value);
24
+ const owner = string(p, 'owner');
25
+ const method = p.method;
26
+ if (method === 'list')
27
+ return { method, owner };
28
+ if (method === 'create' || method === 'ensure') {
29
+ const v = object(p.params);
30
+ const params = {
31
+ runner: string(v, 'runner'),
32
+ cwd: string(v, 'cwd'),
33
+ };
34
+ if (v.model !== undefined)
35
+ params.model = string(v, 'model');
36
+ if (v.mode !== undefined) {
37
+ if (v.mode !== 'default' && v.mode !== 'plan')
38
+ throw new Error('Invalid native mode');
39
+ params.mode = v.mode;
40
+ }
41
+ if (method === 'ensure') {
42
+ if (v.resumeSessionId !== undefined)
43
+ throw new Error('Reserved sessionId is not for resume');
44
+ return { method, owner, params: { ...params, sessionId: string(v, 'sessionId') } };
45
+ }
46
+ if (v.resumeSessionId !== undefined)
47
+ params.resumeSessionId = string(v, 'resumeSessionId');
48
+ return { method, owner, params };
49
+ }
50
+ const id = string(p, 'id');
51
+ if (method === 'read') {
52
+ if ((p.after !== undefined && typeof p.after !== 'number') ||
53
+ (p.limit !== undefined && typeof p.limit !== 'number'))
54
+ throw new Error('Invalid cursor/limit');
55
+ return { method, owner, id, after: p.after, limit: p.limit };
56
+ }
57
+ if (method === 'send')
58
+ return { method, owner, id, commandId: string(p, 'commandId'), text: string(p, 'text') };
59
+ if (method === 'close' || method === 'interrupt')
60
+ return { method, owner, id };
61
+ if (method === 'respond') {
62
+ const v = object(p.response);
63
+ const response = {};
64
+ if (v.decision === 'approve' || v.decision === 'deny')
65
+ response.decision = v.decision;
66
+ if (v.answers !== undefined) {
67
+ const answers = object(v.answers);
68
+ response.answers = {};
69
+ for (const [id, values] of Object.entries(answers)) {
70
+ if (!Array.isArray(values) ||
71
+ !values.every((value) => typeof value === 'string'))
72
+ throw new Error('Invalid native answers');
73
+ response.answers[id] = values;
74
+ }
75
+ }
76
+ if (Boolean(response.decision) === Boolean(response.answers))
77
+ throw new Error('Supply a decision or answers');
78
+ return { method, owner, id, requestId: string(p, 'requestId'), response };
79
+ }
80
+ throw new Error('Unknown native host method');
81
+ }
82
+ /** One attempt only. A lost reply never causes an implicit mutation retry. */
83
+ export function requestHost(host, request) {
84
+ return new Promise((resolve, reject) => {
85
+ const socket = connect(host.socket);
86
+ let received = '';
87
+ socket.setEncoding('utf8');
88
+ socket.setTimeout(45_000, () => socket.destroy(new Error('Native host reply timed out; mutation outcome is unknown')));
89
+ socket.on('error', reject);
90
+ socket.on('connect', () => socket.end(`${JSON.stringify({ token: host.token, request })}\n`));
91
+ socket.on('data', (chunk) => {
92
+ received += chunk;
93
+ if (Buffer.byteLength(received) > 8 * 1024 * 1024)
94
+ socket.destroy(new Error('Native host reply exceeds limit'));
95
+ });
96
+ socket.on('end', () => {
97
+ try {
98
+ const result = object(JSON.parse(received));
99
+ if (typeof result.error === 'string')
100
+ throw new Error(result.error);
101
+ resolve(result.value);
102
+ }
103
+ catch (error) {
104
+ reject(error);
105
+ }
106
+ });
107
+ });
108
+ }
109
+ //# sourceMappingURL=ipc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc.js","sourceRoot":"","sources":["../../src/native/ipc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { NativeSessionCreateParams, NativeSessionEnsureParams, NativeSessionEvent, NativeSessionInfo, NativeSessionResponse, NativeSessionSendResult } from '@farmslot/protocol';
2
+ export declare function resolveNativeExecutable(binary: string, cwd: string): Promise<{
3
+ executable: string;
4
+ version: string;
5
+ }>;
6
+ /** Runs only inside the local host. Synchronous fsync orders intent before native input. */
7
+ export declare class NativeSessionManager {
8
+ private readonly root;
9
+ private readonly executionNodeId;
10
+ private sessions;
11
+ private persisted;
12
+ constructor(root: string, executionNodeId?: string);
13
+ private persist;
14
+ create(owner: string, params: NativeSessionCreateParams): Promise<NativeSessionInfo>;
15
+ ensure(owner: string, params: NativeSessionEnsureParams): Promise<NativeSessionInfo>;
16
+ private start;
17
+ private existingCreation;
18
+ private createdSession;
19
+ private append;
20
+ private owned;
21
+ private snapshot;
22
+ list(owner: string): NativeSessionInfo[];
23
+ read(owner: string, id: string, after?: number, limit?: number): {
24
+ session: NativeSessionInfo;
25
+ events: NativeSessionEvent[];
26
+ cursor: number;
27
+ hasMore: boolean;
28
+ commands: {
29
+ generation: string;
30
+ commandId: string;
31
+ state: import("@farmslot/protocol").NativeCommandState;
32
+ submitted: boolean;
33
+ accepted: boolean;
34
+ outcome?: "completed" | "failed" | "interrupted";
35
+ }[];
36
+ pendingRequests: NativeSessionEvent[];
37
+ };
38
+ send(owner: string, id: string, commandId: string, text: string): Promise<NativeSessionSendResult>;
39
+ respond(owner: string, id: string, requestId: string, response: NativeSessionResponse): Promise<void>;
40
+ interrupt(owner: string, id: string): Promise<void>;
41
+ close(owner: string, id: string): Promise<void>;
42
+ }
43
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/native/manager.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAEV,yBAAyB,EACzB,yBAAyB,EACzB,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACxB,MAAM,oBAAoB,CAAC;AAa5B,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA4BlD;AA2CD,4FAA4F;AAC5F,qBAAa,oBAAoB;IAQ7B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,eAAe;IARlC,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,SAAS,CAGb;gBAGe,IAAI,EAAE,MAAM,EACZ,eAAe,SAAU;IAoD5C,OAAO,CAAC,OAAO;IAiCf,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI9E,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAW5E,KAAK;IAgInB,OAAO,CAAC,gBAAgB;YAmBV,cAAc;IAO5B,OAAO,CAAC,MAAM;IA0Dd,OAAO,CAAC,KAAK;IAMb,OAAO,CAAC,QAAQ;IAYhB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,EAAE;IAKxC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,SAAI,EAAE,KAAK,SAAM;;;;;;;;;;;;;;;IAyBhD,IAAI,CACR,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,uBAAuB,CAAC;IAoD7B,OAAO,CACX,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,qBAAqB,GAC9B,OAAO,CAAC,IAAI,CAAC;IAiBV,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnD,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CActD"}