bitchat-node 0.1.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 (102) hide show
  1. package/README.md +223 -0
  2. package/dist/bin/bitchat.d.ts +7 -0
  3. package/dist/bin/bitchat.d.ts.map +1 -0
  4. package/dist/bin/bitchat.js +69 -0
  5. package/dist/bin/bitchat.js.map +1 -0
  6. package/dist/client.d.ts +77 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +411 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/crypto/index.d.ts +6 -0
  11. package/dist/crypto/index.d.ts.map +1 -0
  12. package/dist/crypto/index.js +6 -0
  13. package/dist/crypto/index.js.map +1 -0
  14. package/dist/crypto/noise.d.ts +72 -0
  15. package/dist/crypto/noise.d.ts.map +1 -0
  16. package/dist/crypto/noise.js +470 -0
  17. package/dist/crypto/noise.js.map +1 -0
  18. package/dist/crypto/signing.d.ts +34 -0
  19. package/dist/crypto/signing.d.ts.map +1 -0
  20. package/dist/crypto/signing.js +56 -0
  21. package/dist/crypto/signing.js.map +1 -0
  22. package/dist/index.d.ts +32 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +48 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/mesh/deduplicator.d.ts +48 -0
  27. package/dist/mesh/deduplicator.d.ts.map +1 -0
  28. package/dist/mesh/deduplicator.js +107 -0
  29. package/dist/mesh/deduplicator.js.map +1 -0
  30. package/dist/mesh/index.d.ts +6 -0
  31. package/dist/mesh/index.d.ts.map +1 -0
  32. package/dist/mesh/index.js +6 -0
  33. package/dist/mesh/index.js.map +1 -0
  34. package/dist/mesh/router.d.ts +90 -0
  35. package/dist/mesh/router.d.ts.map +1 -0
  36. package/dist/mesh/router.js +204 -0
  37. package/dist/mesh/router.js.map +1 -0
  38. package/dist/protocol/binary.d.ts +37 -0
  39. package/dist/protocol/binary.d.ts.map +1 -0
  40. package/dist/protocol/binary.js +310 -0
  41. package/dist/protocol/binary.js.map +1 -0
  42. package/dist/protocol/constants.d.ts +30 -0
  43. package/dist/protocol/constants.d.ts.map +1 -0
  44. package/dist/protocol/constants.js +37 -0
  45. package/dist/protocol/constants.js.map +1 -0
  46. package/dist/protocol/index.d.ts +8 -0
  47. package/dist/protocol/index.d.ts.map +1 -0
  48. package/dist/protocol/index.js +8 -0
  49. package/dist/protocol/index.js.map +1 -0
  50. package/dist/protocol/packets.d.ts +38 -0
  51. package/dist/protocol/packets.d.ts.map +1 -0
  52. package/dist/protocol/packets.js +177 -0
  53. package/dist/protocol/packets.js.map +1 -0
  54. package/dist/protocol/types.d.ts +134 -0
  55. package/dist/protocol/types.d.ts.map +1 -0
  56. package/dist/protocol/types.js +108 -0
  57. package/dist/protocol/types.js.map +1 -0
  58. package/dist/session/index.d.ts +5 -0
  59. package/dist/session/index.d.ts.map +1 -0
  60. package/dist/session/index.js +5 -0
  61. package/dist/session/index.js.map +1 -0
  62. package/dist/session/manager.d.ts +113 -0
  63. package/dist/session/manager.d.ts.map +1 -0
  64. package/dist/session/manager.js +371 -0
  65. package/dist/session/manager.js.map +1 -0
  66. package/dist/transport/ble.d.ts +92 -0
  67. package/dist/transport/ble.d.ts.map +1 -0
  68. package/dist/transport/ble.js +434 -0
  69. package/dist/transport/ble.js.map +1 -0
  70. package/dist/transport/index.d.ts +5 -0
  71. package/dist/transport/index.d.ts.map +1 -0
  72. package/dist/transport/index.js +5 -0
  73. package/dist/transport/index.js.map +1 -0
  74. package/dist/ui/index.d.ts +2 -0
  75. package/dist/ui/index.d.ts.map +1 -0
  76. package/dist/ui/index.js +2 -0
  77. package/dist/ui/index.js.map +1 -0
  78. package/dist/ui/server.d.ts +16 -0
  79. package/dist/ui/server.d.ts.map +1 -0
  80. package/dist/ui/server.js +510 -0
  81. package/dist/ui/server.js.map +1 -0
  82. package/package.json +79 -0
  83. package/src/bin/bitchat.ts +87 -0
  84. package/src/client.ts +519 -0
  85. package/src/crypto/index.ts +22 -0
  86. package/src/crypto/noise.ts +574 -0
  87. package/src/crypto/signing.ts +66 -0
  88. package/src/index.ts +95 -0
  89. package/src/mesh/deduplicator.ts +129 -0
  90. package/src/mesh/index.ts +6 -0
  91. package/src/mesh/router.ts +258 -0
  92. package/src/protocol/binary.ts +345 -0
  93. package/src/protocol/constants.ts +43 -0
  94. package/src/protocol/index.ts +15 -0
  95. package/src/protocol/packets.ts +223 -0
  96. package/src/protocol/types.ts +182 -0
  97. package/src/session/index.ts +9 -0
  98. package/src/session/manager.ts +476 -0
  99. package/src/transport/ble.ts +553 -0
  100. package/src/transport/index.ts +10 -0
  101. package/src/ui/index.ts +1 -0
  102. package/src/ui/server.ts +569 -0
@@ -0,0 +1,371 @@
1
+ /**
2
+ * Session Manager
3
+ * Manages Noise sessions with peers, handling handshakes and encryption
4
+ */
5
+ import { EventEmitter } from 'node:events';
6
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
7
+ import { homedir } from 'node:os';
8
+ import { join } from 'node:path';
9
+ import { generateKeyPair, HandshakeState as NoiseHandshake, NoiseSession, } from '../crypto/noise.js';
10
+ import { fingerprint, generateSigningKeyPair } from '../crypto/signing.js';
11
+ import { HandshakeState, PeerID } from '../protocol/types.js';
12
+ // Key persistence path
13
+ const KEY_DIR = join(homedir(), '.bitchat-node');
14
+ const KEY_FILE = join(KEY_DIR, 'identity.json');
15
+ function loadOrCreateKeys() {
16
+ try {
17
+ if (existsSync(KEY_FILE)) {
18
+ const data = JSON.parse(readFileSync(KEY_FILE, 'utf-8'));
19
+ console.log('[Keys] Loaded persistent identity from', KEY_FILE);
20
+ return {
21
+ static: {
22
+ publicKey: Buffer.from(data.noisePublicKey, 'hex'),
23
+ secretKey: Buffer.from(data.noiseSecretKey, 'hex'),
24
+ },
25
+ signing: {
26
+ publicKey: Buffer.from(data.signingPublicKey, 'hex'),
27
+ secretKey: Buffer.from(data.signingSecretKey, 'hex'),
28
+ },
29
+ };
30
+ }
31
+ }
32
+ catch (e) {
33
+ console.log('[Keys] Failed to load keys, generating new ones:', e.message);
34
+ }
35
+ // Generate new keys
36
+ const staticKP = generateKeyPair();
37
+ const signingKP = generateSigningKeyPair();
38
+ // Persist them
39
+ try {
40
+ mkdirSync(KEY_DIR, { recursive: true });
41
+ const data = {
42
+ noisePublicKey: Buffer.from(staticKP.publicKey).toString('hex'),
43
+ noiseSecretKey: Buffer.from(staticKP.secretKey).toString('hex'),
44
+ signingPublicKey: Buffer.from(signingKP.publicKey).toString('hex'),
45
+ signingSecretKey: Buffer.from(signingKP.secretKey).toString('hex'),
46
+ };
47
+ writeFileSync(KEY_FILE, JSON.stringify(data, null, 2));
48
+ console.log('[Keys] Generated and saved new identity to', KEY_FILE);
49
+ }
50
+ catch (e) {
51
+ console.log('[Keys] Warning: Failed to persist keys:', e.message);
52
+ }
53
+ return { static: staticKP, signing: signingKP };
54
+ }
55
+ const DEFAULT_CONFIG = {
56
+ autoHandshake: true,
57
+ handshakeTimeoutMs: 30000,
58
+ };
59
+ /**
60
+ * Manages Noise sessions with peers
61
+ */
62
+ export class SessionManager extends EventEmitter {
63
+ config;
64
+ // Our keys
65
+ staticKeyPair;
66
+ signingKeyPair;
67
+ myPeerID;
68
+ fingerprint;
69
+ // Session state
70
+ pendingHandshakes = new Map();
71
+ sessions = new Map();
72
+ // Peer info
73
+ peers = new Map();
74
+ // Messages queued for after handshake completion
75
+ pendingMessages = new Map();
76
+ constructor(config = {}, existingKeys) {
77
+ super();
78
+ this.config = { ...DEFAULT_CONFIG, ...config };
79
+ // Initialize with provided keys, persisted keys, or generate new ones
80
+ if (existingKeys?.static && existingKeys?.signing) {
81
+ this.staticKeyPair = existingKeys.static;
82
+ this.signingKeyPair = existingKeys.signing;
83
+ }
84
+ else {
85
+ const loaded = loadOrCreateKeys();
86
+ this.staticKeyPair = loaded.static;
87
+ this.signingKeyPair = loaded.signing;
88
+ }
89
+ // Derive peer ID from static public key
90
+ this.myPeerID = PeerID.fromPublicKey(this.staticKeyPair.publicKey);
91
+ this.fingerprint = fingerprint(this.staticKeyPair.publicKey);
92
+ console.log('[SessionManager] Identity:');
93
+ console.log(' PeerID:', this.myPeerID.toHex());
94
+ console.log(' Noise pubkey:', Buffer.from(this.staticKeyPair.publicKey).toString('hex'));
95
+ console.log(' Signing pubkey:', Buffer.from(this.signingKeyPair.publicKey).toString('hex'));
96
+ }
97
+ /**
98
+ * Check if we have an established session with a peer
99
+ */
100
+ hasSession(peerID) {
101
+ return this.sessions.has(peerID.toHex());
102
+ }
103
+ /**
104
+ * Check if we're in the middle of a handshake
105
+ */
106
+ hasHandshakeInProgress(peerID) {
107
+ return this.pendingHandshakes.has(peerID.toHex());
108
+ }
109
+ /**
110
+ * Get handshake state for a peer
111
+ */
112
+ getHandshakeState(peerID) {
113
+ if (this.sessions.has(peerID.toHex())) {
114
+ return HandshakeState.ESTABLISHED;
115
+ }
116
+ if (this.pendingHandshakes.has(peerID.toHex())) {
117
+ return HandshakeState.HANDSHAKING;
118
+ }
119
+ return HandshakeState.NONE;
120
+ }
121
+ /**
122
+ * Get established session
123
+ */
124
+ getSession(peerID) {
125
+ return this.sessions.get(peerID.toHex())?.session;
126
+ }
127
+ /**
128
+ * Initiate a handshake with a peer
129
+ */
130
+ initiateHandshake(peerID) {
131
+ const key = peerID.toHex();
132
+ // Check if already have session or handshake in progress
133
+ if (this.sessions.has(key)) {
134
+ throw new Error('Session already established');
135
+ }
136
+ if (this.pendingHandshakes.has(key)) {
137
+ throw new Error('Handshake already in progress');
138
+ }
139
+ // Create handshake state
140
+ const state = new NoiseHandshake('initiator', this.staticKeyPair);
141
+ // Write first message
142
+ const message = state.writeMessage();
143
+ // Store pending handshake
144
+ const pending = {
145
+ state,
146
+ role: 'initiator',
147
+ startedAt: Date.now(),
148
+ };
149
+ // Set timeout
150
+ pending.timeoutHandle = setTimeout(() => {
151
+ this.handleHandshakeTimeout(peerID);
152
+ }, this.config.handshakeTimeoutMs);
153
+ this.pendingHandshakes.set(key, pending);
154
+ return message;
155
+ }
156
+ /**
157
+ * Handle incoming handshake message
158
+ */
159
+ handleHandshakeMessage(peerID, message) {
160
+ const key = peerID.toHex();
161
+ let pending = this.pendingHandshakes.get(key);
162
+ if (!pending) {
163
+ // No handshake in progress - we're the responder
164
+ const state = new NoiseHandshake('responder', this.staticKeyPair);
165
+ pending = {
166
+ state,
167
+ role: 'responder',
168
+ startedAt: Date.now(),
169
+ };
170
+ // Set timeout
171
+ pending.timeoutHandle = setTimeout(() => {
172
+ this.handleHandshakeTimeout(peerID);
173
+ }, this.config.handshakeTimeoutMs);
174
+ this.pendingHandshakes.set(key, pending);
175
+ }
176
+ try {
177
+ // Process incoming message
178
+ pending.state.readMessage(message);
179
+ // Check if handshake is complete
180
+ if (pending.state.isComplete()) {
181
+ this.completeHandshake(peerID, pending);
182
+ return null;
183
+ }
184
+ // Write response
185
+ const response = pending.state.writeMessage();
186
+ // Check again after writing
187
+ if (pending.state.isComplete()) {
188
+ this.completeHandshake(peerID, pending);
189
+ }
190
+ return response;
191
+ }
192
+ catch (error) {
193
+ // Handshake failed
194
+ this.handleHandshakeFailure(peerID, error);
195
+ return null;
196
+ }
197
+ }
198
+ /**
199
+ * Complete a successful handshake
200
+ */
201
+ completeHandshake(peerID, pending) {
202
+ const key = peerID.toHex();
203
+ // Clear timeout
204
+ if (pending.timeoutHandle) {
205
+ clearTimeout(pending.timeoutHandle);
206
+ }
207
+ // Get remote public key
208
+ const remotePublicKey = pending.state.getRemoteStaticPublicKey();
209
+ if (!remotePublicKey) {
210
+ this.handleHandshakeFailure(peerID, new Error('No remote public key'));
211
+ return;
212
+ }
213
+ // Create session
214
+ const { send, receive, hash } = pending.state.split();
215
+ const session = new NoiseSession(send, receive, hash, remotePublicKey);
216
+ // Store session
217
+ this.sessions.set(key, {
218
+ session,
219
+ establishedAt: Date.now(),
220
+ remotePublicKey,
221
+ });
222
+ // Clean up pending
223
+ this.pendingHandshakes.delete(key);
224
+ // Update peer info
225
+ this.updatePeerInfo(peerID, { noisePublicKey: remotePublicKey });
226
+ // Emit event
227
+ this.emit('session:established', peerID, session);
228
+ // Send any queued messages
229
+ this.flushPendingMessages(peerID);
230
+ }
231
+ /**
232
+ * Handle handshake timeout
233
+ */
234
+ handleHandshakeTimeout(peerID) {
235
+ this.handleHandshakeFailure(peerID, new Error('Handshake timeout'));
236
+ }
237
+ /**
238
+ * Handle handshake failure
239
+ */
240
+ handleHandshakeFailure(peerID, error) {
241
+ const key = peerID.toHex();
242
+ const pending = this.pendingHandshakes.get(key);
243
+ if (pending?.timeoutHandle) {
244
+ clearTimeout(pending.timeoutHandle);
245
+ }
246
+ this.pendingHandshakes.delete(key);
247
+ this.pendingMessages.delete(key);
248
+ this.emit('session:failed', peerID, error);
249
+ }
250
+ /**
251
+ * Encrypt data for a peer
252
+ */
253
+ encrypt(peerID, plaintext) {
254
+ const session = this.sessions.get(peerID.toHex())?.session;
255
+ if (!session) {
256
+ throw new Error('No session with peer');
257
+ }
258
+ return session.encrypt(plaintext);
259
+ }
260
+ /**
261
+ * Decrypt data from a peer
262
+ */
263
+ decrypt(peerID, ciphertext) {
264
+ const session = this.sessions.get(peerID.toHex())?.session;
265
+ if (!session) {
266
+ throw new Error('No session with peer');
267
+ }
268
+ return session.decrypt(ciphertext);
269
+ }
270
+ /**
271
+ * Queue a message for after handshake completion
272
+ */
273
+ queueMessage(peerID, data) {
274
+ const key = peerID.toHex();
275
+ const queue = this.pendingMessages.get(key) ?? [];
276
+ queue.push({ data, timestamp: Date.now() });
277
+ this.pendingMessages.set(key, queue);
278
+ }
279
+ /**
280
+ * Flush pending messages for a peer
281
+ */
282
+ flushPendingMessages(peerID) {
283
+ const key = peerID.toHex();
284
+ const queue = this.pendingMessages.get(key);
285
+ if (!queue || queue.length === 0)
286
+ return;
287
+ this.pendingMessages.delete(key);
288
+ for (const { data } of queue) {
289
+ try {
290
+ const encrypted = this.encrypt(peerID, data);
291
+ this.emit('handshake:message', peerID, encrypted);
292
+ }
293
+ catch (error) {
294
+ console.error('Failed to encrypt queued message:', error);
295
+ }
296
+ }
297
+ }
298
+ /**
299
+ * Close session with a peer
300
+ */
301
+ closeSession(peerID) {
302
+ const key = peerID.toHex();
303
+ const established = this.sessions.get(key);
304
+ if (established) {
305
+ established.session.clear();
306
+ this.sessions.delete(key);
307
+ }
308
+ const pending = this.pendingHandshakes.get(key);
309
+ if (pending?.timeoutHandle) {
310
+ clearTimeout(pending.timeoutHandle);
311
+ }
312
+ this.pendingHandshakes.delete(key);
313
+ this.pendingMessages.delete(key);
314
+ this.emit('session:closed', peerID);
315
+ }
316
+ /**
317
+ * Update peer info
318
+ */
319
+ updatePeerInfo(peerID, updates) {
320
+ const key = peerID.toHex();
321
+ const existing = this.peers.get(key) ?? {
322
+ peerID,
323
+ nickname: 'anon',
324
+ isConnected: false,
325
+ isVerified: false,
326
+ lastSeen: new Date(),
327
+ handshakeState: HandshakeState.NONE,
328
+ };
329
+ this.peers.set(key, { ...existing, ...updates });
330
+ }
331
+ /**
332
+ * Get peer info
333
+ */
334
+ getPeerInfo(peerID) {
335
+ return this.peers.get(peerID.toHex());
336
+ }
337
+ /**
338
+ * Get all known peers
339
+ */
340
+ getAllPeers() {
341
+ return Array.from(this.peers.values());
342
+ }
343
+ /**
344
+ * Get all peers with established sessions
345
+ */
346
+ getConnectedPeers() {
347
+ const connectedKeys = new Set(this.sessions.keys());
348
+ return Array.from(this.peers.values()).filter((p) => connectedKeys.has(p.peerID.toHex()));
349
+ }
350
+ /**
351
+ * Clean up
352
+ */
353
+ destroy() {
354
+ // Clear all sessions
355
+ for (const [, established] of this.sessions) {
356
+ established.session.clear();
357
+ }
358
+ this.sessions.clear();
359
+ // Clear pending handshakes
360
+ for (const [, pending] of this.pendingHandshakes) {
361
+ if (pending.timeoutHandle) {
362
+ clearTimeout(pending.timeoutHandle);
363
+ }
364
+ }
365
+ this.pendingHandshakes.clear();
366
+ this.pendingMessages.clear();
367
+ this.peers.clear();
368
+ this.removeAllListeners();
369
+ }
370
+ }
371
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/session/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * BLE Transport
3
+ * Handles Bluetooth Low Energy communication for Bitchat mesh
4
+ *
5
+ * Uses noble for central mode (scanning/connecting) and
6
+ * bleno for peripheral mode (advertising/accepting)
7
+ */
8
+ import { EventEmitter } from 'node:events';
9
+ import type { Link } from '../mesh/router.js';
10
+ import type { PeerID } from '../protocol/types.js';
11
+ type Peripheral = import('@abandonware/noble').Peripheral;
12
+ type Characteristic = import('@abandonware/noble').Characteristic;
13
+ export interface BLETransportConfig {
14
+ serviceUUID: string;
15
+ characteristicUUID: string;
16
+ testnet: boolean;
17
+ enableCentral: boolean;
18
+ enablePeripheral: boolean;
19
+ scanDuplicates: boolean;
20
+ advertisingName?: string;
21
+ }
22
+ export interface BLETransportEvents {
23
+ ready: () => void;
24
+ data: (data: Uint8Array, fromLink: BLELink) => void;
25
+ 'link:connected': (link: BLELink) => void;
26
+ 'link:disconnected': (linkId: string) => void;
27
+ error: (error: Error, context: string) => void;
28
+ state: (state: string) => void;
29
+ }
30
+ /**
31
+ * BLE link implementation
32
+ */
33
+ export declare class BLELink implements Link {
34
+ readonly id: string;
35
+ private peripheral;
36
+ private characteristic;
37
+ private _peerID?;
38
+ private mtu;
39
+ constructor(peripheral: Peripheral, characteristic: Characteristic, mtu?: number);
40
+ get peerID(): PeerID | undefined;
41
+ setPeerID(peerID: PeerID): void;
42
+ send(data: Uint8Array): Promise<void>;
43
+ get isConnected(): boolean;
44
+ }
45
+ /**
46
+ * BLE Transport - handles Bluetooth mesh networking
47
+ */
48
+ export declare class BLETransport extends EventEmitter {
49
+ private config;
50
+ private noble?;
51
+ private bleno?;
52
+ private running;
53
+ private peripherals;
54
+ private links;
55
+ private subscribedCentrals;
56
+ private notifyCallback?;
57
+ constructor(config?: Partial<BLETransportConfig>);
58
+ /**
59
+ * Start the BLE transport
60
+ */
61
+ start(): Promise<void>;
62
+ /**
63
+ * Stop the BLE transport
64
+ */
65
+ stop(): Promise<void>;
66
+ /**
67
+ * Get all active links
68
+ */
69
+ getLinks(): BLELink[];
70
+ /**
71
+ * Get link by ID
72
+ */
73
+ getLink(id: string): BLELink | undefined;
74
+ /**
75
+ * Broadcast data to all connected peers
76
+ */
77
+ broadcast(data: Uint8Array): Promise<void>;
78
+ private initCentral;
79
+ private waitForPoweredOn;
80
+ private failedConnections;
81
+ private connectingPeripherals;
82
+ private onDiscover;
83
+ private onDisconnect;
84
+ private initPeripheral;
85
+ private waitForBlenoPoweredOn;
86
+ /**
87
+ * Clean up
88
+ */
89
+ destroy(): void;
90
+ }
91
+ export {};
92
+ //# sourceMappingURL=ble.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ble.d.ts","sourceRoot":"","sources":["../../src/transport/ble.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAO9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAInD,KAAK,UAAU,GAAG,OAAO,oBAAoB,EAAE,UAAU,CAAC;AAC1D,KAAK,cAAc,GAAG,OAAO,oBAAoB,EAAE,cAAc,CAAC;AAKlE,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAkBD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,IAAI,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IACpD,gBAAgB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,mBAAmB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED;;GAEG;AACH,qBAAa,OAAQ,YAAW,IAAI;IAClC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,GAAG,CAAS;gBAER,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,GAAE,MAAoB;IAO7F,IAAI,MAAM,IAAI,MAAM,GAAG,SAAS,CAE/B;IAED,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIzB,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B3C,IAAI,WAAW,IAAI,OAAO,CAEzB;CACF;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,KAAK,CAAC,CAAc;IAC5B,OAAO,CAAC,KAAK,CAAC,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,WAAW,CAA0C;IAC7D,OAAO,CAAC,KAAK,CAA8B;IAG3C,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,cAAc,CAAC,CAAyB;gBAEpC,MAAM,GAAE,OAAO,CAAC,kBAAkB,CAAM;IAgBpD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsB5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiC3B;;OAEG;IACH,QAAQ,IAAI,OAAO,EAAE;IAIrB;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAIxC;;OAEG;IACG,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;YA4BlC,WAAW;YAoBX,gBAAgB;IA2B9B,OAAO,CAAC,iBAAiB,CAA2D;IAEpF,OAAO,CAAC,qBAAqB,CAAqB;YAEpC,UAAU;IAoIxB,OAAO,CAAC,YAAY;YAQN,cAAc;YAqEd,qBAAqB;IA0BnC;;OAEG;IACH,OAAO,IAAI,IAAI;CAIhB"}