@grafema/rfdb-client 0.2.11 → 0.3.0-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/base-client.d.ts +156 -0
- package/dist/base-client.d.ts.map +1 -0
- package/dist/base-client.js +591 -0
- package/dist/base-client.js.map +1 -0
- package/dist/client.d.ts +30 -294
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +61 -706
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/websocket-client.d.ts +41 -0
- package/dist/websocket-client.d.ts.map +1 -0
- package/dist/websocket-client.js +144 -0
- package/dist/websocket-client.js.map +1 -0
- package/package.json +2 -2
- package/ts/base-client.ts +737 -0
- package/ts/client.ts +68 -816
- package/ts/index.ts +3 -1
- package/ts/rfdb-client-locking.test.ts +897 -0
- package/ts/rfdb-websocket-client.test.ts +572 -0
- package/ts/websocket-client.ts +174 -0
package/dist/client.d.ts
CHANGED
|
@@ -4,23 +4,20 @@
|
|
|
4
4
|
* Provides the same API as GraphEngine NAPI binding but communicates
|
|
5
5
|
* with a separate rfdb-server process over Unix socket + MessagePack.
|
|
6
6
|
*/
|
|
7
|
-
import {
|
|
8
|
-
import type {
|
|
9
|
-
export declare class RFDBClient extends
|
|
7
|
+
import { BaseRFDBClient } from './base-client.js';
|
|
8
|
+
import type { RFDBCommand, WireNode, RFDBResponse, AttrQuery, HelloResponse, CommitDelta } from '@grafema/types';
|
|
9
|
+
export declare class RFDBClient extends BaseRFDBClient {
|
|
10
10
|
readonly socketPath: string;
|
|
11
|
+
readonly clientName: string;
|
|
11
12
|
private socket;
|
|
12
13
|
connected: boolean;
|
|
13
14
|
private pending;
|
|
14
15
|
private reqId;
|
|
15
16
|
private buffer;
|
|
16
|
-
private _batching;
|
|
17
|
-
private _batchNodes;
|
|
18
|
-
private _batchEdges;
|
|
19
|
-
private _batchFiles;
|
|
20
17
|
private _supportsStreaming;
|
|
21
18
|
private _pendingStreams;
|
|
22
19
|
private _streamTimers;
|
|
23
|
-
constructor(socketPath?: string);
|
|
20
|
+
constructor(socketPath?: string, clientName?: string);
|
|
24
21
|
/**
|
|
25
22
|
* Whether the connected server supports streaming responses.
|
|
26
23
|
* Set after calling hello(). Defaults to false.
|
|
@@ -39,325 +36,64 @@ export declare class RFDBClient extends EventEmitter implements IRFDBClient {
|
|
|
39
36
|
*/
|
|
40
37
|
private _handleData;
|
|
41
38
|
/**
|
|
42
|
-
* Handle decoded response
|
|
39
|
+
* Handle decoded response -- match by requestId, route streaming chunks
|
|
43
40
|
* to StreamQueue or resolve single-response Promise.
|
|
44
41
|
*/
|
|
45
42
|
private _handleResponse;
|
|
46
43
|
/**
|
|
47
44
|
* Handle a response for a streaming request.
|
|
48
|
-
* Routes chunk data to StreamQueue and manages stream lifecycle.
|
|
49
|
-
* Resets per-chunk timeout on each successful chunk arrival.
|
|
50
45
|
*/
|
|
51
46
|
private _handleStreamingResponse;
|
|
52
|
-
/**
|
|
53
|
-
* Reset the per-chunk timeout for a streaming request.
|
|
54
|
-
*/
|
|
55
47
|
private _resetStreamTimer;
|
|
56
|
-
/**
|
|
57
|
-
* Clean up all state for a completed/failed streaming request.
|
|
58
|
-
*/
|
|
59
48
|
private _cleanupStream;
|
|
60
49
|
private _parseRequestId;
|
|
61
|
-
/**
|
|
62
|
-
* Default timeout for operations (60 seconds)
|
|
63
|
-
* Flush/compact may take time for large graphs, but should not hang indefinitely
|
|
64
|
-
*/
|
|
65
50
|
private static readonly DEFAULT_TIMEOUT_MS;
|
|
66
51
|
/**
|
|
67
52
|
* Send a request and wait for response with timeout
|
|
68
53
|
*/
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Add nodes to the graph
|
|
72
|
-
* Extra properties beyond id/type/name/file/exported/metadata are merged into metadata
|
|
73
|
-
*/
|
|
74
|
-
addNodes(nodes: Array<Partial<WireNode> & {
|
|
75
|
-
id: string;
|
|
76
|
-
type?: string;
|
|
77
|
-
node_type?: string;
|
|
78
|
-
nodeType?: string;
|
|
79
|
-
}>): Promise<RFDBResponse>;
|
|
80
|
-
/**
|
|
81
|
-
* Add edges to the graph
|
|
82
|
-
* Extra properties beyond src/dst/type are merged into metadata
|
|
83
|
-
*/
|
|
84
|
-
addEdges(edges: WireEdge[], skipValidation?: boolean): Promise<RFDBResponse>;
|
|
85
|
-
/**
|
|
86
|
-
* Delete a node
|
|
87
|
-
*/
|
|
88
|
-
deleteNode(id: string): Promise<RFDBResponse>;
|
|
89
|
-
/**
|
|
90
|
-
* Delete an edge
|
|
91
|
-
*/
|
|
92
|
-
deleteEdge(src: string, dst: string, edgeType: EdgeType): Promise<RFDBResponse>;
|
|
93
|
-
/**
|
|
94
|
-
* Get a node by ID
|
|
95
|
-
*/
|
|
96
|
-
getNode(id: string): Promise<WireNode | null>;
|
|
97
|
-
/**
|
|
98
|
-
* Check if node exists
|
|
99
|
-
*/
|
|
100
|
-
nodeExists(id: string): Promise<boolean>;
|
|
101
|
-
/**
|
|
102
|
-
* Find nodes by type
|
|
103
|
-
*/
|
|
104
|
-
findByType(nodeType: NodeType): Promise<string[]>;
|
|
105
|
-
/**
|
|
106
|
-
* Find nodes by attributes
|
|
107
|
-
*/
|
|
108
|
-
findByAttr(query: Record<string, unknown>): Promise<string[]>;
|
|
109
|
-
/**
|
|
110
|
-
* Get neighbors of a node
|
|
111
|
-
*/
|
|
112
|
-
neighbors(id: string, edgeTypes?: EdgeType[]): Promise<string[]>;
|
|
113
|
-
/**
|
|
114
|
-
* Breadth-first search
|
|
115
|
-
*/
|
|
116
|
-
bfs(startIds: string[], maxDepth: number, edgeTypes?: EdgeType[]): Promise<string[]>;
|
|
117
|
-
/**
|
|
118
|
-
* Depth-first search
|
|
119
|
-
*/
|
|
120
|
-
dfs(startIds: string[], maxDepth: number, edgeTypes?: EdgeType[]): Promise<string[]>;
|
|
121
|
-
/**
|
|
122
|
-
* Reachability query - find all nodes reachable from start nodes
|
|
123
|
-
*/
|
|
124
|
-
reachability(startIds: string[], maxDepth: number, edgeTypes?: EdgeType[], backward?: boolean): Promise<string[]>;
|
|
125
|
-
/**
|
|
126
|
-
* Get outgoing edges from a node
|
|
127
|
-
* Parses metadata JSON and spreads it onto the edge object for convenience
|
|
128
|
-
*/
|
|
129
|
-
getOutgoingEdges(id: string, edgeTypes?: EdgeType[] | null): Promise<(WireEdge & Record<string, unknown>)[]>;
|
|
130
|
-
/**
|
|
131
|
-
* Get incoming edges to a node
|
|
132
|
-
* Parses metadata JSON and spreads it onto the edge object for convenience
|
|
133
|
-
*/
|
|
134
|
-
getIncomingEdges(id: string, edgeTypes?: EdgeType[] | null): Promise<(WireEdge & Record<string, unknown>)[]>;
|
|
135
|
-
/**
|
|
136
|
-
* Get node count
|
|
137
|
-
*/
|
|
138
|
-
nodeCount(): Promise<number>;
|
|
139
|
-
/**
|
|
140
|
-
* Get edge count
|
|
141
|
-
*/
|
|
142
|
-
edgeCount(): Promise<number>;
|
|
143
|
-
/**
|
|
144
|
-
* Count nodes by type
|
|
145
|
-
*/
|
|
146
|
-
countNodesByType(types?: NodeType[] | null): Promise<Record<string, number>>;
|
|
147
|
-
/**
|
|
148
|
-
* Count edges by type
|
|
149
|
-
*/
|
|
150
|
-
countEdgesByType(edgeTypes?: EdgeType[] | null): Promise<Record<string, number>>;
|
|
151
|
-
/**
|
|
152
|
-
* Flush data to disk
|
|
153
|
-
*/
|
|
154
|
-
flush(): Promise<RFDBResponse>;
|
|
54
|
+
protected _send(cmd: RFDBCommand, payload?: Record<string, unknown>, timeoutMs?: number): Promise<RFDBResponse>;
|
|
155
55
|
/**
|
|
156
|
-
*
|
|
56
|
+
* Negotiate protocol version with server.
|
|
57
|
+
* Overrides base to set streaming flag.
|
|
157
58
|
*/
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Clear the database
|
|
161
|
-
*/
|
|
162
|
-
clear(): Promise<RFDBResponse>;
|
|
59
|
+
hello(protocolVersion?: number): Promise<HelloResponse>;
|
|
163
60
|
/**
|
|
164
|
-
* Query nodes (async generator)
|
|
61
|
+
* Query nodes (async generator).
|
|
62
|
+
* Overrides base to support streaming for protocol v3+.
|
|
165
63
|
*/
|
|
166
64
|
queryNodes(query: AttrQuery): AsyncGenerator<WireNode, void, unknown>;
|
|
167
|
-
/**
|
|
168
|
-
* Build a server query object from an AttrQuery.
|
|
169
|
-
*/
|
|
170
|
-
private _buildServerQuery;
|
|
171
65
|
/**
|
|
172
66
|
* Stream nodes matching query with true streaming support.
|
|
173
|
-
*
|
|
174
|
-
* Behavior depends on server capabilities:
|
|
175
|
-
* - Server supports streaming (protocol v3): receives chunked NodesChunk
|
|
176
|
-
* responses via StreamQueue. Nodes are yielded as they arrive.
|
|
177
|
-
* - Server does NOT support streaming (fallback): delegates to queryNodes()
|
|
178
|
-
* which yields nodes one by one from bulk response.
|
|
179
|
-
*
|
|
180
|
-
* The generator can be aborted by breaking out of the loop or calling .return().
|
|
67
|
+
* Overrides base to use StreamQueue for protocol v3+.
|
|
181
68
|
*/
|
|
182
69
|
queryNodesStream(query: AttrQuery): AsyncGenerator<WireNode, void, unknown>;
|
|
183
70
|
/**
|
|
184
|
-
*
|
|
185
|
-
*/
|
|
186
|
-
getAllNodes(query?: AttrQuery): Promise<WireNode[]>;
|
|
187
|
-
/**
|
|
188
|
-
* Get all edges
|
|
189
|
-
* Parses metadata JSON and spreads it onto the edge object for convenience
|
|
71
|
+
* Create an isolated batch handle for concurrent-safe batching.
|
|
190
72
|
*/
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* Check if node is an endpoint (has no outgoing edges)
|
|
194
|
-
*/
|
|
195
|
-
isEndpoint(id: string): Promise<boolean>;
|
|
196
|
-
/**
|
|
197
|
-
* Get node identifier string
|
|
198
|
-
*/
|
|
199
|
-
getNodeIdentifier(id: string): Promise<string | null>;
|
|
200
|
-
/**
|
|
201
|
-
* Update node version
|
|
202
|
-
*/
|
|
203
|
-
updateNodeVersion(id: string, version: string): Promise<RFDBResponse>;
|
|
204
|
-
/**
|
|
205
|
-
* Declare metadata fields for server-side indexing.
|
|
206
|
-
* Call before adding nodes so the server builds indexes on flush.
|
|
207
|
-
* Returns the number of declared fields.
|
|
208
|
-
*/
|
|
209
|
-
declareFields(fields: FieldDeclaration[]): Promise<number>;
|
|
210
|
-
/**
|
|
211
|
-
* Load Datalog rules
|
|
212
|
-
*/
|
|
213
|
-
datalogLoadRules(source: string): Promise<number>;
|
|
214
|
-
/**
|
|
215
|
-
* Clear Datalog rules
|
|
216
|
-
*/
|
|
217
|
-
datalogClearRules(): Promise<RFDBResponse>;
|
|
218
|
-
/**
|
|
219
|
-
* Execute Datalog query
|
|
220
|
-
*/
|
|
221
|
-
datalogQuery(query: string): Promise<DatalogResult[]>;
|
|
222
|
-
/**
|
|
223
|
-
* Check a guarantee (Datalog rule) and return violations
|
|
224
|
-
*/
|
|
225
|
-
checkGuarantee(ruleSource: string): Promise<DatalogResult[]>;
|
|
226
|
-
/**
|
|
227
|
-
* Execute unified Datalog — handles both direct queries and rule-based programs.
|
|
228
|
-
* Auto-detects the head predicate instead of hardcoding violation(X).
|
|
229
|
-
*/
|
|
230
|
-
executeDatalog(source: string): Promise<DatalogResult[]>;
|
|
231
|
-
/**
|
|
232
|
-
* Ping the server
|
|
233
|
-
*/
|
|
234
|
-
ping(): Promise<string | false>;
|
|
235
|
-
/**
|
|
236
|
-
* Negotiate protocol version with server
|
|
237
|
-
* @param protocolVersion - Protocol version to negotiate (default: 2)
|
|
238
|
-
* @returns Server capabilities including protocolVersion, serverVersion, features
|
|
239
|
-
*/
|
|
240
|
-
hello(protocolVersion?: number): Promise<HelloResponse>;
|
|
241
|
-
/**
|
|
242
|
-
* Create a new database
|
|
243
|
-
* @param name - Database name (alphanumeric, _, -)
|
|
244
|
-
* @param ephemeral - If true, database is in-memory and auto-cleaned on disconnect
|
|
245
|
-
*/
|
|
246
|
-
createDatabase(name: string, ephemeral?: boolean): Promise<CreateDatabaseResponse>;
|
|
247
|
-
/**
|
|
248
|
-
* Open a database and set as current for this session
|
|
249
|
-
* @param name - Database name
|
|
250
|
-
* @param mode - 'rw' (read-write) or 'ro' (read-only)
|
|
251
|
-
*/
|
|
252
|
-
openDatabase(name: string, mode?: 'rw' | 'ro'): Promise<OpenDatabaseResponse>;
|
|
253
|
-
/**
|
|
254
|
-
* Close current database
|
|
255
|
-
*/
|
|
256
|
-
closeDatabase(): Promise<RFDBResponse>;
|
|
257
|
-
/**
|
|
258
|
-
* Drop (delete) a database - must not be in use
|
|
259
|
-
* @param name - Database name
|
|
260
|
-
*/
|
|
261
|
-
dropDatabase(name: string): Promise<RFDBResponse>;
|
|
262
|
-
/**
|
|
263
|
-
* List all databases
|
|
264
|
-
*/
|
|
265
|
-
listDatabases(): Promise<ListDatabasesResponse>;
|
|
266
|
-
/**
|
|
267
|
-
* Get current database for this session
|
|
268
|
-
*/
|
|
269
|
-
currentDatabase(): Promise<CurrentDatabaseResponse>;
|
|
270
|
-
/**
|
|
271
|
-
* Convert a SnapshotRef to wire format payload fields.
|
|
272
|
-
*
|
|
273
|
-
* - number -> { version: N }
|
|
274
|
-
* - { tag, value } -> { tagKey, tagValue }
|
|
275
|
-
*/
|
|
276
|
-
private _resolveSnapshotRef;
|
|
277
|
-
/**
|
|
278
|
-
* Compute diff between two snapshots.
|
|
279
|
-
* @param from - Source snapshot (version number or tag reference)
|
|
280
|
-
* @param to - Target snapshot (version number or tag reference)
|
|
281
|
-
* @returns SnapshotDiff with added/removed segments and stats
|
|
282
|
-
*/
|
|
283
|
-
diffSnapshots(from: SnapshotRef, to: SnapshotRef): Promise<SnapshotDiff>;
|
|
284
|
-
/**
|
|
285
|
-
* Tag a snapshot with key-value metadata.
|
|
286
|
-
* @param version - Snapshot version to tag
|
|
287
|
-
* @param tags - Key-value pairs to apply (e.g. { "release": "v1.0" })
|
|
288
|
-
*/
|
|
289
|
-
tagSnapshot(version: number, tags: Record<string, string>): Promise<void>;
|
|
290
|
-
/**
|
|
291
|
-
* Find a snapshot by tag key/value pair.
|
|
292
|
-
* @param tagKey - Tag key to search for
|
|
293
|
-
* @param tagValue - Tag value to match
|
|
294
|
-
* @returns Snapshot version number, or null if not found
|
|
295
|
-
*/
|
|
296
|
-
findSnapshot(tagKey: string, tagValue: string): Promise<number | null>;
|
|
297
|
-
/**
|
|
298
|
-
* List snapshots, optionally filtered by tag key.
|
|
299
|
-
* @param filterTag - Optional tag key to filter by (only snapshots with this tag)
|
|
300
|
-
* @returns Array of SnapshotInfo objects
|
|
301
|
-
*/
|
|
302
|
-
listSnapshots(filterTag?: string): Promise<SnapshotInfo[]>;
|
|
303
|
-
/**
|
|
304
|
-
* Begin a batch operation.
|
|
305
|
-
* While batching, addNodes/addEdges buffer locally instead of sending to server.
|
|
306
|
-
* Call commitBatch() to send all buffered data atomically.
|
|
307
|
-
*/
|
|
308
|
-
beginBatch(): void;
|
|
309
|
-
/**
|
|
310
|
-
* Synchronously batch a single node. Must be inside beginBatch/commitBatch.
|
|
311
|
-
* Skips async wrapper — pushes directly to batch array.
|
|
312
|
-
*/
|
|
313
|
-
batchNode(node: Partial<WireNode> & {
|
|
314
|
-
id: string;
|
|
315
|
-
type?: string;
|
|
316
|
-
node_type?: string;
|
|
317
|
-
nodeType?: string;
|
|
318
|
-
}): void;
|
|
319
|
-
/**
|
|
320
|
-
* Synchronously batch a single edge. Must be inside beginBatch/commitBatch.
|
|
321
|
-
*/
|
|
322
|
-
batchEdge(edge: WireEdge | Record<string, unknown>): void;
|
|
323
|
-
/**
|
|
324
|
-
* Commit the current batch to the server.
|
|
325
|
-
* Sends all buffered nodes/edges with the list of changed files.
|
|
326
|
-
* Server atomically replaces old data for changed files with new data.
|
|
327
|
-
*/
|
|
328
|
-
commitBatch(tags?: string[]): Promise<CommitDelta>;
|
|
329
|
-
/**
|
|
330
|
-
* Abort the current batch, discarding all buffered data.
|
|
331
|
-
*/
|
|
332
|
-
abortBatch(): void;
|
|
333
|
-
/**
|
|
334
|
-
* Check if a batch is currently in progress.
|
|
335
|
-
*/
|
|
336
|
-
isBatching(): boolean;
|
|
337
|
-
/**
|
|
338
|
-
* Find files that depend on the given changed files.
|
|
339
|
-
* Uses backward reachability to find dependent modules.
|
|
340
|
-
*
|
|
341
|
-
* Note: For large result sets, each reachable node requires a separate
|
|
342
|
-
* getNode RPC. A future server-side optimization could return file paths
|
|
343
|
-
* directly from the reachability query.
|
|
344
|
-
*/
|
|
345
|
-
findDependentFiles(changedFiles: string[]): Promise<string[]>;
|
|
73
|
+
createBatch(): BatchHandle;
|
|
346
74
|
/**
|
|
347
75
|
* Unref the socket so it doesn't keep the process alive.
|
|
348
|
-
*
|
|
349
|
-
* Call this in test environments to allow process to exit
|
|
350
|
-
* even if connections remain open.
|
|
351
76
|
*/
|
|
352
77
|
unref(): void;
|
|
353
78
|
/**
|
|
354
79
|
* Close connection
|
|
355
80
|
*/
|
|
356
81
|
close(): Promise<void>;
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Isolated batch handle for concurrent-safe batching (REG-487).
|
|
85
|
+
*/
|
|
86
|
+
export declare class BatchHandle {
|
|
87
|
+
private client;
|
|
88
|
+
private _nodes;
|
|
89
|
+
private _edges;
|
|
90
|
+
private _files;
|
|
91
|
+
constructor(client: RFDBClient);
|
|
92
|
+
addNode(node: WireNode, file?: string): void;
|
|
93
|
+
addEdge(edge: import('@grafema/types').WireEdge): void;
|
|
94
|
+
addFile(file: string): void;
|
|
95
|
+
commit(tags?: string[], deferIndex?: boolean, protectedTypes?: string[]): Promise<CommitDelta>;
|
|
96
|
+
abort(): void;
|
|
361
97
|
}
|
|
362
98
|
export default RFDBClient;
|
|
363
99
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../ts/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../ts/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,aAAa,EAEb,WAAW,EACZ,MAAM,gBAAgB,CAAC;AAOxB,qBAAa,UAAW,SAAQ,cAAc;IAC5C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,MAAM,CAAgB;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;IAGvB,OAAO,CAAC,kBAAkB,CAAkB;IAC5C,OAAO,CAAC,eAAe,CAAiD;IACxE,OAAO,CAAC,aAAa,CAAyD;gBAElE,UAAU,GAAE,MAAyB,EAAE,UAAU,GAAE,MAAkB;IAWjF;;;OAGG;IACH,IAAa,iBAAiB,IAAI,OAAO,CAExC;IAED;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA8C9B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA8B/B;;OAEG;IACH,OAAO,CAAC,WAAW;IA2BnB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAgDvB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAqChC,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAU;IAEpD;;OAEG;cACa,KAAK,CACnB,GAAG,EAAE,WAAW,EAChB,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACrC,SAAS,GAAE,MAAsC,GAChD,OAAO,CAAC,YAAY,CAAC;IA8CxB;;;OAGG;IACY,KAAK,CAAC,eAAe,GAAE,MAAU,GAAG,OAAO,CAAC,aAAa,CAAC;IAOzE;;;OAGG;IACa,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC;IAerF;;;OAGG;IACa,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC;IAwC3F;;OAEG;IACH,WAAW,IAAI,WAAW;IAI1B;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO7B;AAED;;GAEG;AACH,qBAAa,WAAW;IAKV,OAAO,CAAC,MAAM;IAJ1B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,MAAM,CAA2C;IACzD,OAAO,CAAC,MAAM,CAA0B;gBAEpB,MAAM,EAAE,UAAU;IAEtC,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAM5C,OAAO,CAAC,IAAI,EAAE,OAAO,gBAAgB,EAAE,QAAQ,GAAG,IAAI;IAItD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIrB,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAUpG,KAAK,IAAI,IAAI;CAKd;AAED,eAAe,UAAU,CAAC"}
|