@procwire/transport 0.1.1

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 (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +844 -0
  3. package/dist/channel/builder.d.ts +68 -0
  4. package/dist/channel/builder.d.ts.map +1 -0
  5. package/dist/channel/builder.js +120 -0
  6. package/dist/channel/builder.js.map +1 -0
  7. package/dist/channel/index.d.ts +6 -0
  8. package/dist/channel/index.d.ts.map +1 -0
  9. package/dist/channel/index.js +6 -0
  10. package/dist/channel/index.js.map +1 -0
  11. package/dist/channel/quickstart.d.ts +94 -0
  12. package/dist/channel/quickstart.d.ts.map +1 -0
  13. package/dist/channel/quickstart.js +104 -0
  14. package/dist/channel/quickstart.js.map +1 -0
  15. package/dist/channel/request-channel.d.ts +119 -0
  16. package/dist/channel/request-channel.d.ts.map +1 -0
  17. package/dist/channel/request-channel.js +476 -0
  18. package/dist/channel/request-channel.js.map +1 -0
  19. package/dist/channel/types.d.ts +226 -0
  20. package/dist/channel/types.d.ts.map +1 -0
  21. package/dist/channel/types.js +2 -0
  22. package/dist/channel/types.js.map +1 -0
  23. package/dist/framing/index.d.ts +4 -0
  24. package/dist/framing/index.d.ts.map +1 -0
  25. package/dist/framing/index.js +4 -0
  26. package/dist/framing/index.js.map +1 -0
  27. package/dist/framing/length-prefixed.d.ts +55 -0
  28. package/dist/framing/length-prefixed.d.ts.map +1 -0
  29. package/dist/framing/length-prefixed.js +102 -0
  30. package/dist/framing/length-prefixed.js.map +1 -0
  31. package/dist/framing/line-delimited.d.ts +61 -0
  32. package/dist/framing/line-delimited.d.ts.map +1 -0
  33. package/dist/framing/line-delimited.js +94 -0
  34. package/dist/framing/line-delimited.js.map +1 -0
  35. package/dist/framing/types.d.ts +35 -0
  36. package/dist/framing/types.d.ts.map +1 -0
  37. package/dist/framing/types.js +2 -0
  38. package/dist/framing/types.js.map +1 -0
  39. package/dist/index.d.ts +24 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +26 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/process/handle.d.ts +64 -0
  44. package/dist/process/handle.d.ts.map +1 -0
  45. package/dist/process/handle.js +107 -0
  46. package/dist/process/handle.js.map +1 -0
  47. package/dist/process/index.d.ts +37 -0
  48. package/dist/process/index.d.ts.map +1 -0
  49. package/dist/process/index.js +37 -0
  50. package/dist/process/index.js.map +1 -0
  51. package/dist/process/manager.d.ts +58 -0
  52. package/dist/process/manager.d.ts.map +1 -0
  53. package/dist/process/manager.js +360 -0
  54. package/dist/process/manager.js.map +1 -0
  55. package/dist/process/types.d.ts +322 -0
  56. package/dist/process/types.d.ts.map +1 -0
  57. package/dist/process/types.js +2 -0
  58. package/dist/process/types.js.map +1 -0
  59. package/dist/protocol/index.d.ts +4 -0
  60. package/dist/protocol/index.d.ts.map +1 -0
  61. package/dist/protocol/index.js +6 -0
  62. package/dist/protocol/index.js.map +1 -0
  63. package/dist/protocol/jsonrpc.d.ts +146 -0
  64. package/dist/protocol/jsonrpc.d.ts.map +1 -0
  65. package/dist/protocol/jsonrpc.js +288 -0
  66. package/dist/protocol/jsonrpc.js.map +1 -0
  67. package/dist/protocol/simple.d.ts +139 -0
  68. package/dist/protocol/simple.d.ts.map +1 -0
  69. package/dist/protocol/simple.js +297 -0
  70. package/dist/protocol/simple.js.map +1 -0
  71. package/dist/protocol/types.d.ts +117 -0
  72. package/dist/protocol/types.d.ts.map +1 -0
  73. package/dist/protocol/types.js +2 -0
  74. package/dist/protocol/types.js.map +1 -0
  75. package/dist/serialization/index.d.ts +5 -0
  76. package/dist/serialization/index.d.ts.map +1 -0
  77. package/dist/serialization/index.js +5 -0
  78. package/dist/serialization/index.js.map +1 -0
  79. package/dist/serialization/json.d.ts +66 -0
  80. package/dist/serialization/json.d.ts.map +1 -0
  81. package/dist/serialization/json.js +66 -0
  82. package/dist/serialization/json.js.map +1 -0
  83. package/dist/serialization/raw.d.ts +38 -0
  84. package/dist/serialization/raw.d.ts.map +1 -0
  85. package/dist/serialization/raw.js +41 -0
  86. package/dist/serialization/raw.js.map +1 -0
  87. package/dist/serialization/registry.d.ts +91 -0
  88. package/dist/serialization/registry.d.ts.map +1 -0
  89. package/dist/serialization/registry.js +119 -0
  90. package/dist/serialization/registry.js.map +1 -0
  91. package/dist/serialization/types.d.ts +27 -0
  92. package/dist/serialization/types.d.ts.map +1 -0
  93. package/dist/serialization/types.js +2 -0
  94. package/dist/serialization/types.js.map +1 -0
  95. package/dist/transport/factory.d.ts +139 -0
  96. package/dist/transport/factory.d.ts.map +1 -0
  97. package/dist/transport/factory.js +162 -0
  98. package/dist/transport/factory.js.map +1 -0
  99. package/dist/transport/index.d.ts +6 -0
  100. package/dist/transport/index.d.ts.map +1 -0
  101. package/dist/transport/index.js +9 -0
  102. package/dist/transport/index.js.map +1 -0
  103. package/dist/transport/socket-server.d.ts +48 -0
  104. package/dist/transport/socket-server.d.ts.map +1 -0
  105. package/dist/transport/socket-server.js +215 -0
  106. package/dist/transport/socket-server.js.map +1 -0
  107. package/dist/transport/socket-transport.d.ts +67 -0
  108. package/dist/transport/socket-transport.d.ts.map +1 -0
  109. package/dist/transport/socket-transport.js +193 -0
  110. package/dist/transport/socket-transport.js.map +1 -0
  111. package/dist/transport/stdio-transport.d.ts +94 -0
  112. package/dist/transport/stdio-transport.d.ts.map +1 -0
  113. package/dist/transport/stdio-transport.js +234 -0
  114. package/dist/transport/stdio-transport.js.map +1 -0
  115. package/dist/transport/types.d.ts +131 -0
  116. package/dist/transport/types.d.ts.map +1 -0
  117. package/dist/transport/types.js +2 -0
  118. package/dist/transport/types.js.map +1 -0
  119. package/dist/utils/assert.d.ts +16 -0
  120. package/dist/utils/assert.d.ts.map +1 -0
  121. package/dist/utils/assert.js +31 -0
  122. package/dist/utils/assert.js.map +1 -0
  123. package/dist/utils/disposables.d.ts +38 -0
  124. package/dist/utils/disposables.d.ts.map +1 -0
  125. package/dist/utils/disposables.js +59 -0
  126. package/dist/utils/disposables.js.map +1 -0
  127. package/dist/utils/errors.d.ts +43 -0
  128. package/dist/utils/errors.d.ts.map +1 -0
  129. package/dist/utils/errors.js +69 -0
  130. package/dist/utils/errors.js.map +1 -0
  131. package/dist/utils/events.d.ts +58 -0
  132. package/dist/utils/events.d.ts.map +1 -0
  133. package/dist/utils/events.js +95 -0
  134. package/dist/utils/events.js.map +1 -0
  135. package/dist/utils/index.d.ts +8 -0
  136. package/dist/utils/index.d.ts.map +1 -0
  137. package/dist/utils/index.js +8 -0
  138. package/dist/utils/index.js.map +1 -0
  139. package/dist/utils/pipe-path.d.ts +48 -0
  140. package/dist/utils/pipe-path.d.ts.map +1 -0
  141. package/dist/utils/pipe-path.js +89 -0
  142. package/dist/utils/pipe-path.js.map +1 -0
  143. package/dist/utils/platform.d.ts +16 -0
  144. package/dist/utils/platform.d.ts.map +1 -0
  145. package/dist/utils/platform.js +22 -0
  146. package/dist/utils/platform.js.map +1 -0
  147. package/dist/utils/time.d.ts +38 -0
  148. package/dist/utils/time.d.ts.map +1 -0
  149. package/dist/utils/time.js +55 -0
  150. package/dist/utils/time.js.map +1 -0
  151. package/package.json +85 -0
@@ -0,0 +1,288 @@
1
+ import { ProtocolError } from "../utils/errors.js";
2
+ /**
3
+ * JSON-RPC 2.0 error codes.
4
+ * @see https://www.jsonrpc.org/specification#error_object
5
+ */
6
+ export const JsonRpcErrorCodes = {
7
+ /** Invalid JSON was received by the server. */
8
+ PARSE_ERROR: -32700,
9
+ /** The JSON sent is not a valid Request object. */
10
+ INVALID_REQUEST: -32600,
11
+ /** The method does not exist / is not available. */
12
+ METHOD_NOT_FOUND: -32601,
13
+ /** Invalid method parameter(s). */
14
+ INVALID_PARAMS: -32602,
15
+ /** Internal JSON-RPC error. */
16
+ INTERNAL_ERROR: -32603,
17
+ // Server errors: -32000 to -32099 are reserved for implementation-defined server errors
18
+ };
19
+ /**
20
+ * JSON-RPC 2.0 protocol implementation.
21
+ *
22
+ * Follows the JSON-RPC 2.0 specification for request/response messaging.
23
+ * Provides strict validation and automatic ID generation.
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * const protocol = new JsonRpcProtocol();
28
+ * const req = protocol.createRequest('getUser', { id: 42 });
29
+ * const res = protocol.createResponse(req.id, { name: 'Alice' });
30
+ * ```
31
+ */
32
+ export class JsonRpcProtocol {
33
+ name = "jsonrpc";
34
+ version = "2.0";
35
+ idCounter = 0;
36
+ /**
37
+ * Creates a JSON-RPC 2.0 request message.
38
+ *
39
+ * @param method - Method name (must be non-empty string)
40
+ * @param params - Optional parameters
41
+ * @param id - Optional request ID (auto-generated if not provided)
42
+ * @returns JSON-RPC request object
43
+ * @throws {ProtocolError} if method is invalid
44
+ */
45
+ createRequest(method, params, id) {
46
+ if (typeof method !== "string" || method.length === 0) {
47
+ throw new ProtocolError("Method must be a non-empty string");
48
+ }
49
+ const requestId = id ?? this.generateId();
50
+ const request = {
51
+ jsonrpc: "2.0",
52
+ id: requestId,
53
+ method,
54
+ };
55
+ if (params !== undefined) {
56
+ request.params = params;
57
+ }
58
+ return request;
59
+ }
60
+ /**
61
+ * Creates a JSON-RPC 2.0 success response message.
62
+ *
63
+ * @param id - Request ID
64
+ * @param result - Response result
65
+ * @returns JSON-RPC response object
66
+ */
67
+ createResponse(id, result) {
68
+ return {
69
+ jsonrpc: "2.0",
70
+ id,
71
+ result,
72
+ };
73
+ }
74
+ /**
75
+ * Creates a JSON-RPC 2.0 error response message.
76
+ *
77
+ * @param id - Request ID
78
+ * @param error - Error details
79
+ * @returns JSON-RPC error response object
80
+ */
81
+ createErrorResponse(id, error) {
82
+ return {
83
+ jsonrpc: "2.0",
84
+ id,
85
+ error,
86
+ };
87
+ }
88
+ /**
89
+ * Creates a JSON-RPC 2.0 notification message.
90
+ *
91
+ * @param method - Method name (must be non-empty string)
92
+ * @param params - Optional parameters
93
+ * @returns JSON-RPC notification object
94
+ * @throws {ProtocolError} if method is invalid
95
+ */
96
+ createNotification(method, params) {
97
+ if (typeof method !== "string" || method.length === 0) {
98
+ throw new ProtocolError("Method must be a non-empty string");
99
+ }
100
+ const notification = {
101
+ jsonrpc: "2.0",
102
+ method,
103
+ };
104
+ if (params !== undefined) {
105
+ notification.params = params;
106
+ }
107
+ return notification;
108
+ }
109
+ /**
110
+ * Parses incoming data as JSON-RPC 2.0 message.
111
+ * Does not throw - returns 'invalid' kind for malformed messages.
112
+ *
113
+ * @param data - Raw incoming data
114
+ * @returns ParsedMessage discriminated union
115
+ */
116
+ parseMessage(data) {
117
+ // Must be an object
118
+ if (!isObject(data)) {
119
+ return {
120
+ kind: "invalid",
121
+ error: {
122
+ code: JsonRpcErrorCodes.INVALID_REQUEST,
123
+ message: "Message must be an object",
124
+ },
125
+ raw: data,
126
+ };
127
+ }
128
+ // Must have jsonrpc: "2.0"
129
+ if (data.jsonrpc !== "2.0") {
130
+ return {
131
+ kind: "invalid",
132
+ error: {
133
+ code: JsonRpcErrorCodes.INVALID_REQUEST,
134
+ message: 'Message must have jsonrpc: "2.0"',
135
+ },
136
+ raw: data,
137
+ };
138
+ }
139
+ // Check if it's a response (has result or error, plus id)
140
+ if ("result" in data || "error" in data) {
141
+ return this.parseResponse(data);
142
+ }
143
+ // Check if it has a method (request or notification)
144
+ if ("method" in data) {
145
+ return this.parseRequestOrNotification(data);
146
+ }
147
+ // Invalid: no method, result, or error
148
+ return {
149
+ kind: "invalid",
150
+ error: {
151
+ code: JsonRpcErrorCodes.INVALID_REQUEST,
152
+ message: "Message must have method, result, or error",
153
+ },
154
+ raw: data,
155
+ };
156
+ }
157
+ /**
158
+ * Type guard for request messages.
159
+ */
160
+ isRequest(msg) {
161
+ return msg.kind === "request";
162
+ }
163
+ /**
164
+ * Type guard for response messages.
165
+ */
166
+ isResponse(msg) {
167
+ return msg.kind === "response";
168
+ }
169
+ /**
170
+ * Type guard for notification messages.
171
+ */
172
+ isNotification(msg) {
173
+ return msg.kind === "notification";
174
+ }
175
+ /**
176
+ * Parses a response message (success or error).
177
+ */
178
+ parseResponse(data) {
179
+ // Must have id
180
+ if (!("id" in data)) {
181
+ return {
182
+ kind: "invalid",
183
+ error: {
184
+ code: JsonRpcErrorCodes.INVALID_REQUEST,
185
+ message: "Response must have id",
186
+ },
187
+ raw: data,
188
+ };
189
+ }
190
+ // Validate id type
191
+ if (!isValidId(data.id)) {
192
+ return {
193
+ kind: "invalid",
194
+ error: {
195
+ code: JsonRpcErrorCodes.INVALID_REQUEST,
196
+ message: "Response id must be string or number",
197
+ },
198
+ raw: data,
199
+ };
200
+ }
201
+ const hasResult = "result" in data;
202
+ const hasError = "error" in data;
203
+ // Must have exactly one of result or error
204
+ if (hasResult && hasError) {
205
+ return {
206
+ kind: "invalid",
207
+ error: {
208
+ code: JsonRpcErrorCodes.INVALID_REQUEST,
209
+ message: "Response must have either result or error, not both",
210
+ },
211
+ raw: data,
212
+ };
213
+ }
214
+ if (!hasResult && !hasError) {
215
+ return {
216
+ kind: "invalid",
217
+ error: {
218
+ code: JsonRpcErrorCodes.INVALID_REQUEST,
219
+ message: "Response must have either result or error",
220
+ },
221
+ raw: data,
222
+ };
223
+ }
224
+ // Valid response
225
+ return {
226
+ kind: "response",
227
+ message: data,
228
+ };
229
+ }
230
+ /**
231
+ * Parses a request or notification message.
232
+ */
233
+ parseRequestOrNotification(data) {
234
+ // Validate method
235
+ if (typeof data.method !== "string" || data.method.length === 0) {
236
+ return {
237
+ kind: "invalid",
238
+ error: {
239
+ code: JsonRpcErrorCodes.INVALID_REQUEST,
240
+ message: "Method must be a non-empty string",
241
+ },
242
+ raw: data,
243
+ };
244
+ }
245
+ // If has id, it's a request
246
+ if ("id" in data) {
247
+ // Validate id type
248
+ if (!isValidId(data.id)) {
249
+ return {
250
+ kind: "invalid",
251
+ error: {
252
+ code: JsonRpcErrorCodes.INVALID_REQUEST,
253
+ message: "Request id must be string or number",
254
+ },
255
+ raw: data,
256
+ };
257
+ }
258
+ return {
259
+ kind: "request",
260
+ message: data,
261
+ };
262
+ }
263
+ // No id, it's a notification
264
+ return {
265
+ kind: "notification",
266
+ message: data,
267
+ };
268
+ }
269
+ /**
270
+ * Generates a unique request ID.
271
+ */
272
+ generateId() {
273
+ return ++this.idCounter;
274
+ }
275
+ }
276
+ /**
277
+ * Type guard to check if value is an object (non-null).
278
+ */
279
+ function isObject(value) {
280
+ return typeof value === "object" && value !== null && !Array.isArray(value);
281
+ }
282
+ /**
283
+ * Type guard to validate request ID type.
284
+ */
285
+ function isValidId(value) {
286
+ return typeof value === "string" || typeof value === "number";
287
+ }
288
+ //# sourceMappingURL=jsonrpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonrpc.js","sourceRoot":"","sources":["../../src/protocol/jsonrpc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,139 @@
1
+ import type { Protocol, ParsedMessage, RequestId, ProtocolDataError } from "./types.js";
2
+ /**
3
+ * Simple protocol request message.
4
+ */
5
+ export interface SimpleRequest {
6
+ type: "request";
7
+ id: RequestId;
8
+ method: string;
9
+ params?: unknown;
10
+ }
11
+ /**
12
+ * Simple protocol response message (success).
13
+ */
14
+ export interface SimpleResponse {
15
+ type: "response";
16
+ id: RequestId;
17
+ result?: unknown;
18
+ }
19
+ /**
20
+ * Simple protocol error response message.
21
+ */
22
+ export interface SimpleErrorResponse {
23
+ type: "response";
24
+ id: RequestId;
25
+ error: ProtocolDataError;
26
+ }
27
+ /**
28
+ * Simple protocol notification message (no response expected).
29
+ */
30
+ export interface SimpleNotification {
31
+ type: "notification";
32
+ method: string;
33
+ params?: unknown;
34
+ }
35
+ /**
36
+ * Union of all simple protocol message types for responses.
37
+ */
38
+ export type SimpleResponseMessage = SimpleResponse | SimpleErrorResponse;
39
+ /**
40
+ * Minimal protocol implementation with no JSON-RPC overhead.
41
+ *
42
+ * Provides a lightweight request/response/notification protocol
43
+ * suitable for high-performance or custom IPC scenarios.
44
+ *
45
+ * Message format:
46
+ * - Request: `{ type: 'request', id, method, params? }`
47
+ * - Response: `{ type: 'response', id, result?, error? }`
48
+ * - Notification: `{ type: 'notification', method, params? }`
49
+ *
50
+ * @example
51
+ * ```ts
52
+ * const protocol = new SimpleProtocol();
53
+ * const req = protocol.createRequest('getUser', { id: 42 });
54
+ * const res = protocol.createResponse(req.id, { name: 'Alice' });
55
+ * ```
56
+ */
57
+ export declare class SimpleProtocol implements Protocol<SimpleRequest, SimpleResponseMessage, SimpleNotification> {
58
+ readonly name = "simple";
59
+ readonly version = "1.0";
60
+ private idCounter;
61
+ /**
62
+ * Creates a simple protocol request message.
63
+ *
64
+ * @param method - Method name (must be non-empty string)
65
+ * @param params - Optional parameters
66
+ * @param id - Optional request ID (auto-generated if not provided)
67
+ * @returns Simple request object
68
+ * @throws {ProtocolError} if method is invalid
69
+ */
70
+ createRequest(method: string, params?: unknown, id?: RequestId): SimpleRequest;
71
+ /**
72
+ * Creates a simple protocol success response message.
73
+ *
74
+ * @param id - Request ID
75
+ * @param result - Response result
76
+ * @returns Simple response object
77
+ */
78
+ createResponse(id: RequestId, result: unknown): SimpleResponse;
79
+ /**
80
+ * Creates a simple protocol error response message.
81
+ *
82
+ * @param id - Request ID
83
+ * @param error - Error details
84
+ * @returns Simple error response object
85
+ */
86
+ createErrorResponse(id: RequestId, error: ProtocolDataError): SimpleErrorResponse;
87
+ /**
88
+ * Creates a simple protocol notification message.
89
+ *
90
+ * @param method - Method name (must be non-empty string)
91
+ * @param params - Optional parameters
92
+ * @returns Simple notification object
93
+ * @throws {ProtocolError} if method is invalid
94
+ */
95
+ createNotification(method: string, params?: unknown): SimpleNotification;
96
+ /**
97
+ * Parses incoming data as simple protocol message.
98
+ * Does not throw - returns 'invalid' kind for malformed messages.
99
+ *
100
+ * @param data - Raw incoming data
101
+ * @returns ParsedMessage discriminated union
102
+ */
103
+ parseMessage(data: unknown): ParsedMessage<SimpleRequest, SimpleResponseMessage, SimpleNotification>;
104
+ /**
105
+ * Type guard for request messages.
106
+ */
107
+ isRequest(msg: ParsedMessage<SimpleRequest, SimpleResponseMessage, SimpleNotification>): msg is Extract<ParsedMessage<SimpleRequest, SimpleResponseMessage, SimpleNotification>, {
108
+ kind: "request";
109
+ }>;
110
+ /**
111
+ * Type guard for response messages.
112
+ */
113
+ isResponse(msg: ParsedMessage<SimpleRequest, SimpleResponseMessage, SimpleNotification>): msg is Extract<ParsedMessage<SimpleRequest, SimpleResponseMessage, SimpleNotification>, {
114
+ kind: "response";
115
+ }>;
116
+ /**
117
+ * Type guard for notification messages.
118
+ */
119
+ isNotification(msg: ParsedMessage<SimpleRequest, SimpleResponseMessage, SimpleNotification>): msg is Extract<ParsedMessage<SimpleRequest, SimpleResponseMessage, SimpleNotification>, {
120
+ kind: "notification";
121
+ }>;
122
+ /**
123
+ * Parses a request message.
124
+ */
125
+ private parseRequest;
126
+ /**
127
+ * Parses a response message.
128
+ */
129
+ private parseResponse;
130
+ /**
131
+ * Parses a notification message.
132
+ */
133
+ private parseNotification;
134
+ /**
135
+ * Generates a unique request ID.
136
+ */
137
+ private generateId;
138
+ }
139
+ //# sourceMappingURL=simple.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple.d.ts","sourceRoot":"","sources":["../../src/protocol/simple.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAExF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,SAAS,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,SAAS,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,SAAS,CAAC;IACd,KAAK,EAAE,iBAAiB,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,cAAc,GAAG,mBAAmB,CAAC;AAEzE;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,cACX,YAAW,QAAQ,CAAC,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,CAAC;IAE7E,SAAgB,IAAI,YAAY;IAChC,SAAgB,OAAO,SAAS;IAEhC,OAAO,CAAC,SAAS,CAAK;IAEtB;;;;;;;;OAQG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,SAAS,GAAG,aAAa;IAoB9E;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAG,cAAc;IAQ9D;;;;;;OAMG;IACH,mBAAmB,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,GAAG,mBAAmB;IAQjF;;;;;;;OAOG;IACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,kBAAkB;IAiBxE;;;;;;OAMG;IACH,YAAY,CACV,IAAI,EAAE,OAAO,GACZ,aAAa,CAAC,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,CAAC;IA4C1E;;OAEG;IACH,SAAS,CACP,GAAG,EAAE,aAAa,CAAC,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,CAAC,GAC3E,GAAG,IAAI,OAAO,CACf,aAAa,CAAC,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,CAAC,EACvE;QAAE,IAAI,EAAE,SAAS,CAAA;KAAE,CACpB;IAID;;OAEG;IACH,UAAU,CACR,GAAG,EAAE,aAAa,CAAC,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,CAAC,GAC3E,GAAG,IAAI,OAAO,CACf,aAAa,CAAC,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,CAAC,EACvE;QAAE,IAAI,EAAE,UAAU,CAAA;KAAE,CACrB;IAID;;OAEG;IACH,cAAc,CACZ,GAAG,EAAE,aAAa,CAAC,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,CAAC,GAC3E,GAAG,IAAI,OAAO,CACf,aAAa,CAAC,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,CAAC,EACvE;QAAE,IAAI,EAAE,cAAc,CAAA;KAAE,CACzB;IAID;;OAEG;IACH,OAAO,CAAC,YAAY;IA6CpB;;OAEG;IACH,OAAO,CAAC,aAAa;IA6CrB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiCzB;;OAEG;IACH,OAAO,CAAC,UAAU;CAGnB"}