obsyncd 1.0.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 +920 -0
  2. package/dist/cli/commands/init.d.ts +8 -0
  3. package/dist/cli/commands/init.d.ts.map +1 -0
  4. package/dist/cli/commands/init.js +104 -0
  5. package/dist/cli/commands/init.js.map +1 -0
  6. package/dist/cli/commands/status.d.ts +8 -0
  7. package/dist/cli/commands/status.d.ts.map +1 -0
  8. package/dist/cli/commands/status.js +117 -0
  9. package/dist/cli/commands/status.js.map +1 -0
  10. package/dist/cli/commands/sync.d.ts +13 -0
  11. package/dist/cli/commands/sync.d.ts.map +1 -0
  12. package/dist/cli/commands/sync.js +225 -0
  13. package/dist/cli/commands/sync.js.map +1 -0
  14. package/dist/cli/prompts/conflictPrompt.d.ts +10 -0
  15. package/dist/cli/prompts/conflictPrompt.d.ts.map +1 -0
  16. package/dist/cli/prompts/conflictPrompt.js +51 -0
  17. package/dist/cli/prompts/conflictPrompt.js.map +1 -0
  18. package/dist/cli/prompts/fileBrowser.d.ts +6 -0
  19. package/dist/cli/prompts/fileBrowser.d.ts.map +1 -0
  20. package/dist/cli/prompts/fileBrowser.js +91 -0
  21. package/dist/cli/prompts/fileBrowser.js.map +1 -0
  22. package/dist/cli/prompts/vaultSelector.d.ts +13 -0
  23. package/dist/cli/prompts/vaultSelector.d.ts.map +1 -0
  24. package/dist/cli/prompts/vaultSelector.js +63 -0
  25. package/dist/cli/prompts/vaultSelector.js.map +1 -0
  26. package/dist/cli/ui/colors.d.ts +50 -0
  27. package/dist/cli/ui/colors.d.ts.map +1 -0
  28. package/dist/cli/ui/colors.js +62 -0
  29. package/dist/cli/ui/colors.js.map +1 -0
  30. package/dist/cli/ui/output.d.ts +45 -0
  31. package/dist/cli/ui/output.d.ts.map +1 -0
  32. package/dist/cli/ui/output.js +116 -0
  33. package/dist/cli/ui/output.js.map +1 -0
  34. package/dist/cli/ui/spinner.d.ts +29 -0
  35. package/dist/cli/ui/spinner.d.ts.map +1 -0
  36. package/dist/cli/ui/spinner.js +80 -0
  37. package/dist/cli/ui/spinner.js.map +1 -0
  38. package/dist/cli/ui/table.d.ts +28 -0
  39. package/dist/cli/ui/table.d.ts.map +1 -0
  40. package/dist/cli/ui/table.js +123 -0
  41. package/dist/cli/ui/table.js.map +1 -0
  42. package/dist/cli/utils/terminal.d.ts +21 -0
  43. package/dist/cli/utils/terminal.d.ts.map +1 -0
  44. package/dist/cli/utils/terminal.js +59 -0
  45. package/dist/cli/utils/terminal.js.map +1 -0
  46. package/dist/cli.d.ts +3 -0
  47. package/dist/cli.d.ts.map +1 -0
  48. package/dist/cli.js +32 -0
  49. package/dist/cli.js.map +1 -0
  50. package/dist/config/index.d.ts +45 -0
  51. package/dist/config/index.d.ts.map +1 -0
  52. package/dist/config/index.js +112 -0
  53. package/dist/config/index.js.map +1 -0
  54. package/dist/index.d.ts +6 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +5 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/storage/index.d.ts +35 -0
  59. package/dist/storage/index.d.ts.map +1 -0
  60. package/dist/storage/index.js +97 -0
  61. package/dist/storage/index.js.map +1 -0
  62. package/dist/sync/changeDetector.d.ts +29 -0
  63. package/dist/sync/changeDetector.d.ts.map +1 -0
  64. package/dist/sync/changeDetector.js +259 -0
  65. package/dist/sync/changeDetector.js.map +1 -0
  66. package/dist/sync/conflictResolver.d.ts +29 -0
  67. package/dist/sync/conflictResolver.d.ts.map +1 -0
  68. package/dist/sync/conflictResolver.js +116 -0
  69. package/dist/sync/conflictResolver.js.map +1 -0
  70. package/dist/sync/directoryLister.d.ts +18 -0
  71. package/dist/sync/directoryLister.d.ts.map +1 -0
  72. package/dist/sync/directoryLister.js +39 -0
  73. package/dist/sync/directoryLister.js.map +1 -0
  74. package/dist/sync/index.d.ts +29 -0
  75. package/dist/sync/index.d.ts.map +1 -0
  76. package/dist/sync/index.js +212 -0
  77. package/dist/sync/index.js.map +1 -0
  78. package/dist/sync/manifest.d.ts +48 -0
  79. package/dist/sync/manifest.d.ts.map +1 -0
  80. package/dist/sync/manifest.js +137 -0
  81. package/dist/sync/manifest.js.map +1 -0
  82. package/dist/sync/types.d.ts +109 -0
  83. package/dist/sync/types.d.ts.map +1 -0
  84. package/dist/sync/types.js +5 -0
  85. package/dist/sync/types.js.map +1 -0
  86. package/dist/sync/watchMode.d.ts +84 -0
  87. package/dist/sync/watchMode.d.ts.map +1 -0
  88. package/dist/sync/watchMode.js +364 -0
  89. package/dist/sync/watchMode.js.map +1 -0
  90. package/dist/sync/watcher.d.ts +114 -0
  91. package/dist/sync/watcher.d.ts.map +1 -0
  92. package/dist/sync/watcher.js +293 -0
  93. package/dist/sync/watcher.js.map +1 -0
  94. package/dist/utils/index.d.ts +8 -0
  95. package/dist/utils/index.d.ts.map +1 -0
  96. package/dist/utils/index.js +25 -0
  97. package/dist/utils/index.js.map +1 -0
  98. package/dist/vault/index.d.ts +38 -0
  99. package/dist/vault/index.d.ts.map +1 -0
  100. package/dist/vault/index.js +106 -0
  101. package/dist/vault/index.js.map +1 -0
  102. package/package.json +68 -0
@@ -0,0 +1,364 @@
1
+ /**
2
+ * WatchModeSync - Orchestrates continuous file watching and automatic synchronization.
3
+ * Coordinates between FileWatcher and SyncEngine for real-time vault synchronization.
4
+ */
5
+ import path from 'path';
6
+ import { EventEmitter } from 'events';
7
+ import { v4 as uuidv4 } from 'uuid';
8
+ import { SyncEngine } from './index.js';
9
+ import { BatchFileWatcher } from './watcher.js';
10
+ export class WatchModeSync extends EventEmitter {
11
+ watcher = null;
12
+ syncEngine;
13
+ options;
14
+ state = 'idle';
15
+ syncCount = 0;
16
+ totalFilesSynced = 0;
17
+ lastSyncTime = null;
18
+ lastSyncResult = null;
19
+ currentError = null;
20
+ isSyncing = false;
21
+ pendingSyncRequest = false;
22
+ session = null;
23
+ maxWaitTimer = null;
24
+ pendingChangesCount = 0;
25
+ constructor(options) {
26
+ super();
27
+ this.syncEngine = new SyncEngine();
28
+ this.options = {
29
+ source: path.resolve(options.source),
30
+ destination: path.resolve(options.destination),
31
+ conflictResolution: options.conflictResolution ?? 'newest',
32
+ remoteMode: options.remoteMode ?? false,
33
+ debounceMs: options.debounceMs ?? 300,
34
+ batchDelayMs: options.batchDelayMs ?? 500,
35
+ maxWaitMs: options.maxWaitMs ?? 5000,
36
+ initialSync: options.initialSync ?? true,
37
+ onSync: options.onSync,
38
+ onError: options.onError,
39
+ onStatusChange: options.onStatusChange,
40
+ };
41
+ }
42
+ /**
43
+ * Start watch mode synchronization
44
+ */
45
+ async start() {
46
+ if (this.state === 'watching' || this.state === 'syncing') {
47
+ throw new Error('Watch mode is already running');
48
+ }
49
+ // Initialize session
50
+ this.session = {
51
+ sessionId: uuidv4(),
52
+ startTime: new Date(),
53
+ endTime: null,
54
+ syncCount: 0,
55
+ errorCount: 0,
56
+ syncHistory: [],
57
+ };
58
+ // Reset state
59
+ this.syncCount = 0;
60
+ this.totalFilesSynced = 0;
61
+ this.lastSyncTime = null;
62
+ this.lastSyncResult = null;
63
+ this.currentError = null;
64
+ // Perform initial sync if enabled
65
+ if (this.options.initialSync) {
66
+ this.setState('syncing');
67
+ try {
68
+ await this.performSync('Initial sync');
69
+ }
70
+ catch (error) {
71
+ this.handleError(error instanceof Error ? error : new Error(String(error)));
72
+ throw error;
73
+ }
74
+ }
75
+ // Create and start the file watcher
76
+ this.watcher = new BatchFileWatcher({
77
+ debounceMs: this.options.debounceMs,
78
+ batchDelayMs: this.options.batchDelayMs,
79
+ ignorePatterns: [
80
+ '.obsidian/**',
81
+ '.trash/**',
82
+ '.git/**',
83
+ '.obsync/**',
84
+ '.DS_Store',
85
+ 'Thumbs.db',
86
+ '*.tmp',
87
+ '*.temp',
88
+ ],
89
+ });
90
+ // Listen for batched changes
91
+ this.watcher.on('batch', (events) => {
92
+ this.handleBatchChanges(events);
93
+ });
94
+ // Listen for individual changes for UI updates
95
+ this.watcher.on('change', () => {
96
+ this.pendingChangesCount++;
97
+ this.emitStatusChange();
98
+ // Set max wait timer if not already set
99
+ if (!this.maxWaitTimer && !this.isSyncing) {
100
+ this.maxWaitTimer = setTimeout(() => {
101
+ this.maxWaitTimer = null;
102
+ if (this.pendingChangesCount > 0) {
103
+ this.triggerSync('Max wait timeout');
104
+ }
105
+ }, this.options.maxWaitMs);
106
+ }
107
+ });
108
+ this.watcher.on('error', (error) => {
109
+ this.handleError(error);
110
+ });
111
+ // Wait for watcher to be ready
112
+ await new Promise((resolve, reject) => {
113
+ const timeout = setTimeout(() => {
114
+ reject(new Error('Watcher initialization timeout'));
115
+ }, 10000);
116
+ this.watcher.once('ready', () => {
117
+ clearTimeout(timeout);
118
+ resolve();
119
+ });
120
+ // Start watching both directories
121
+ this.watcher.watchMultiple([this.options.source, this.options.destination]);
122
+ });
123
+ this.setState('watching');
124
+ this.emitEvent({ type: 'status_change', timestamp: new Date(), data: this.getStatus() });
125
+ }
126
+ /**
127
+ * Stop watch mode synchronization
128
+ */
129
+ async stop() {
130
+ if (this.state === 'stopped' || this.state === 'idle') {
131
+ return;
132
+ }
133
+ // Clear max wait timer
134
+ if (this.maxWaitTimer) {
135
+ clearTimeout(this.maxWaitTimer);
136
+ this.maxWaitTimer = null;
137
+ }
138
+ // Stop the watcher
139
+ if (this.watcher) {
140
+ await this.watcher.stop();
141
+ this.watcher = null;
142
+ }
143
+ // Update session
144
+ if (this.session) {
145
+ this.session.endTime = new Date();
146
+ }
147
+ this.setState('stopped');
148
+ this.emitEvent({ type: 'status_change', timestamp: new Date(), data: this.getStatus() });
149
+ }
150
+ /**
151
+ * Pause watch mode (stop watching but keep state)
152
+ */
153
+ async pause() {
154
+ if (this.watcher) {
155
+ await this.watcher.stop();
156
+ this.watcher = null;
157
+ }
158
+ this.setState('idle');
159
+ this.emitStatusChange();
160
+ }
161
+ /**
162
+ * Resume watch mode after pause
163
+ */
164
+ async resume() {
165
+ if (this.state !== 'idle') {
166
+ throw new Error('Can only resume from idle state');
167
+ }
168
+ // Recreate watcher
169
+ this.watcher = new BatchFileWatcher({
170
+ debounceMs: this.options.debounceMs,
171
+ batchDelayMs: this.options.batchDelayMs,
172
+ });
173
+ this.watcher.on('batch', (events) => {
174
+ this.handleBatchChanges(events);
175
+ });
176
+ this.watcher.on('change', () => {
177
+ this.pendingChangesCount++;
178
+ this.emitStatusChange();
179
+ });
180
+ this.watcher.on('error', (error) => {
181
+ this.handleError(error);
182
+ });
183
+ await new Promise((resolve, reject) => {
184
+ const timeout = setTimeout(() => {
185
+ reject(new Error('Watcher initialization timeout'));
186
+ }, 10000);
187
+ this.watcher.once('ready', () => {
188
+ clearTimeout(timeout);
189
+ resolve();
190
+ });
191
+ this.watcher.watchMultiple([this.options.source, this.options.destination]);
192
+ });
193
+ this.setState('watching');
194
+ this.emitStatusChange();
195
+ }
196
+ /**
197
+ * Force an immediate sync
198
+ */
199
+ async forceSync() {
200
+ return this.performSync('Manual trigger');
201
+ }
202
+ /**
203
+ * Get current status
204
+ */
205
+ getStatus() {
206
+ return {
207
+ state: this.state,
208
+ isActive: this.state === 'watching' || this.state === 'syncing',
209
+ pendingChanges: this.pendingChangesCount,
210
+ lastSyncTime: this.lastSyncTime,
211
+ lastSyncResult: this.lastSyncResult,
212
+ syncCount: this.syncCount,
213
+ totalFilesSynced: this.totalFilesSynced,
214
+ currentError: this.currentError,
215
+ watchedPaths: [this.options.source, this.options.destination],
216
+ };
217
+ }
218
+ /**
219
+ * Get current session information
220
+ */
221
+ getSession() {
222
+ return this.session;
223
+ }
224
+ /**
225
+ * Handle batched file changes
226
+ */
227
+ handleBatchChanges(events) {
228
+ if (events.length === 0)
229
+ return;
230
+ // Clear pending changes count since we're processing them
231
+ this.pendingChangesCount = 0;
232
+ this.emitStatusChange();
233
+ // Clear max wait timer
234
+ if (this.maxWaitTimer) {
235
+ clearTimeout(this.maxWaitTimer);
236
+ this.maxWaitTimer = null;
237
+ }
238
+ this.triggerSync(`${events.length} file(s) changed`);
239
+ }
240
+ /**
241
+ * Trigger a sync operation
242
+ */
243
+ triggerSync(reason) {
244
+ if (this.isSyncing) {
245
+ this.pendingSyncRequest = true;
246
+ return;
247
+ }
248
+ this.performSync(reason).catch((error) => {
249
+ this.handleError(error instanceof Error ? error : new Error(String(error)));
250
+ });
251
+ }
252
+ /**
253
+ * Perform the actual sync operation
254
+ */
255
+ async performSync(_reason) {
256
+ if (this.isSyncing) {
257
+ throw new Error('Sync already in progress');
258
+ }
259
+ this.isSyncing = true;
260
+ const previousState = this.state;
261
+ this.setState('syncing');
262
+ this.emitEvent({ type: 'sync_start', timestamp: new Date() });
263
+ const startTime = Date.now();
264
+ try {
265
+ const result = await this.syncEngine.sync({
266
+ source: this.options.source,
267
+ destination: this.options.destination,
268
+ conflictResolution: this.options.conflictResolution,
269
+ dryRun: false,
270
+ remoteMode: this.options.remoteMode,
271
+ });
272
+ const duration = Date.now() - startTime;
273
+ // Update state
274
+ this.syncCount++;
275
+ this.lastSyncTime = new Date();
276
+ this.lastSyncResult = result;
277
+ this.totalFilesSynced += result.filesAdded + result.filesUpdated + result.filesDeleted;
278
+ this.currentError = null;
279
+ // Update session
280
+ if (this.session) {
281
+ this.session.syncCount++;
282
+ this.session.syncHistory.push({
283
+ timestamp: new Date(),
284
+ result,
285
+ duration,
286
+ });
287
+ }
288
+ // Emit events
289
+ this.emitEvent({ type: 'sync_complete', timestamp: new Date(), data: result });
290
+ this.options.onSync?.(result);
291
+ this.isSyncing = false;
292
+ // Check for pending sync request
293
+ if (this.pendingSyncRequest) {
294
+ this.pendingSyncRequest = false;
295
+ // Schedule another sync
296
+ setImmediate(() => {
297
+ this.triggerSync('Pending changes');
298
+ });
299
+ }
300
+ else {
301
+ // Restore to watching state if we were watching before
302
+ if (previousState === 'watching' || this.watcher) {
303
+ this.setState('watching');
304
+ }
305
+ else {
306
+ this.setState('idle');
307
+ }
308
+ }
309
+ return result;
310
+ }
311
+ catch (error) {
312
+ this.isSyncing = false;
313
+ this.pendingSyncRequest = false;
314
+ const err = error instanceof Error ? error : new Error(String(error));
315
+ this.handleError(err);
316
+ // Update session
317
+ if (this.session) {
318
+ this.session.errorCount++;
319
+ }
320
+ this.emitEvent({ type: 'sync_error', timestamp: new Date(), data: err });
321
+ throw err;
322
+ }
323
+ }
324
+ /**
325
+ * Handle errors
326
+ */
327
+ handleError(error) {
328
+ this.currentError = error;
329
+ this.setState('error');
330
+ this.options.onError?.(error);
331
+ this.emit('error', error);
332
+ }
333
+ /**
334
+ * Set state and emit status change
335
+ */
336
+ setState(newState) {
337
+ if (this.state !== newState) {
338
+ this.state = newState;
339
+ this.emitStatusChange();
340
+ }
341
+ }
342
+ /**
343
+ * Emit status change event
344
+ */
345
+ emitStatusChange() {
346
+ const status = this.getStatus();
347
+ this.options.onStatusChange?.(status);
348
+ this.emit('statusChange', status);
349
+ }
350
+ /**
351
+ * Emit an event
352
+ */
353
+ emitEvent(event) {
354
+ this.emit('event', event);
355
+ this.emit(event.type, event.data);
356
+ }
357
+ }
358
+ /**
359
+ * Create a watch mode sync instance with default options
360
+ */
361
+ export function createWatchModeSync(options) {
362
+ return new WatchModeSync(options);
363
+ }
364
+ //# sourceMappingURL=watchMode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watchMode.js","sourceRoot":"","sources":["../../src/sync/watchMode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * FileWatcher - Watches directories for file changes with debouncing.
3
+ * Uses chokidar for cross-platform file watching.
4
+ */
5
+ import { EventEmitter } from 'events';
6
+ export interface WatcherOptions {
7
+ /** Debounce delay in milliseconds (default: 300) */
8
+ debounceMs?: number;
9
+ /** Patterns to ignore (glob patterns) */
10
+ ignorePatterns?: string[];
11
+ /** Whether to ignore initial scan events (default: true) */
12
+ ignoreInitial?: boolean;
13
+ /** Whether to use polling (slower but more compatible) */
14
+ usePolling?: boolean;
15
+ /** Polling interval in milliseconds (only if usePolling is true) */
16
+ pollInterval?: number;
17
+ /** Depth to watch (undefined = infinite) */
18
+ depth?: number;
19
+ }
20
+ export interface FileChangeEvent {
21
+ type: 'add' | 'change' | 'unlink';
22
+ path: string;
23
+ relativePath: string;
24
+ watchedPath: string;
25
+ }
26
+ export interface WatcherStatus {
27
+ isWatching: boolean;
28
+ watchedPaths: string[];
29
+ pendingChanges: number;
30
+ lastEventTime: Date | null;
31
+ }
32
+ export declare class FileWatcher extends EventEmitter {
33
+ private watchers;
34
+ private pendingChanges;
35
+ private debounceTimers;
36
+ private debounceMs;
37
+ private ignorePatterns;
38
+ private ignoreMatchers;
39
+ private ignoreInitial;
40
+ private usePolling;
41
+ private pollInterval;
42
+ private depth;
43
+ private isReady;
44
+ private lastEventTime;
45
+ private isStopped;
46
+ constructor(options?: WatcherOptions);
47
+ /**
48
+ * Start watching a directory for file changes
49
+ */
50
+ watch(watchPath: string): void;
51
+ /**
52
+ * Watch multiple directories
53
+ */
54
+ watchMultiple(paths: string[]): void;
55
+ /**
56
+ * Stop watching a specific directory
57
+ */
58
+ unwatch(watchPath: string): Promise<void>;
59
+ /**
60
+ * Stop watching all directories and clean up
61
+ */
62
+ stop(): Promise<void>;
63
+ /**
64
+ * Get current watcher status
65
+ */
66
+ getStatus(): WatcherStatus;
67
+ /**
68
+ * Check if all watchers are ready
69
+ */
70
+ areAllWatchersReady(): boolean;
71
+ /**
72
+ * Force flush all pending changes immediately
73
+ */
74
+ flushPendingChanges(): FileChangeEvent[];
75
+ /**
76
+ * Get count of pending changes
77
+ */
78
+ getPendingCount(): number;
79
+ /**
80
+ * Handle file system events with debouncing
81
+ */
82
+ private handleEvent;
83
+ /**
84
+ * Check if a path should be ignored (for the ignored option passed to chokidar)
85
+ */
86
+ private shouldIgnore;
87
+ /**
88
+ * Check if an event should be skipped (for internal filtering)
89
+ */
90
+ private shouldSkipEvent;
91
+ }
92
+ /**
93
+ * Create a debounced batch watcher that collects multiple changes
94
+ * and emits them as a batch after a delay
95
+ */
96
+ export declare class BatchFileWatcher extends FileWatcher {
97
+ private batchTimer;
98
+ private batchedChanges;
99
+ private batchDelayMs;
100
+ constructor(options?: WatcherOptions & {
101
+ batchDelayMs?: number;
102
+ });
103
+ private scheduleBatchEmit;
104
+ /**
105
+ * Get current batch
106
+ */
107
+ getCurrentBatch(): FileChangeEvent[];
108
+ /**
109
+ * Force emit current batch immediately
110
+ */
111
+ flushBatch(): FileChangeEvent[];
112
+ stop(): Promise<void>;
113
+ }
114
+ //# sourceMappingURL=watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/sync/watcher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,4DAA4D;IAC5D,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,IAAI,GAAG,IAAI,CAAC;CAC5B;AAGD,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,cAAc,CAA2C;IACjE,OAAO,CAAC,cAAc,CAA0C;IAChE,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,cAAc,CAAW;IACjC,OAAO,CAAC,cAAc,CAAgC;IACtD,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,SAAS,CAAkB;gBAEvB,OAAO,GAAE,cAAmB;IAuBxC;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IA8C9B;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAMpC;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B/C;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB3B;;OAEG;IACH,SAAS,IAAI,aAAa;IAS1B;;OAEG;IACH,mBAAmB,IAAI,OAAO;IAK9B;;OAEG;IACH,mBAAmB,IAAI,eAAe,EAAE;IAaxC;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,OAAO,CAAC,WAAW;IAqDnB;;OAEG;IACH,OAAO,CAAC,YAAY;IAYpB;;OAEG;IACH,OAAO,CAAC,eAAe;CAYxB;AAED;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,cAAc,CAA2C;IACjE,OAAO,CAAC,YAAY,CAAS;gBAEjB,OAAO,GAAE,cAAc,GAAG;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAO;IAYpE,OAAO,CAAC,iBAAiB;IAgBzB;;OAEG;IACH,eAAe,IAAI,eAAe,EAAE;IAIpC;;OAEG;IACH,UAAU,IAAI,eAAe,EAAE;IAWzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAU5B"}