@nice2dev/game-engine 1.0.21 → 1.0.23

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.
@@ -0,0 +1,530 @@
1
+ 'use strict';
2
+
3
+ /* ────────────────────────────────────────────────────────────────
4
+ Save System v2 — Cloud saves, migration, compression
5
+
6
+ Enhanced save system with:
7
+ - Multiple save slots with metadata
8
+ - LZ77-style compression for save data
9
+ - Schema versioning with automatic migration
10
+ - Cloud sync with conflict resolution
11
+ - Auto-save with configurable interval
12
+ - Save data integrity (checksums)
13
+ ──────────────────────────────────────────────────────────────── */
14
+ const DEFAULT_SAVE_CONFIG = {
15
+ schemaVersion: 1,
16
+ storageBackend: 'indexeddb',
17
+ storageKey: 'nice-game-saves',
18
+ maxSlots: 20,
19
+ compressionEnabled: true,
20
+ autoSave: {
21
+ enabled: true,
22
+ intervalMs: 60000,
23
+ maxAutoSaves: 3,
24
+ requireSafeState: true,
25
+ },
26
+ cloud: {
27
+ enabled: false,
28
+ conflictStrategy: 'newest-wins',
29
+ syncIntervalMs: 300000,
30
+ maxCloudSlots: 10,
31
+ },
32
+ };
33
+ /* ══════════════════════════════════════════════════════════════
34
+ COMPRESSION — LZ77-style + RLE for save data
35
+ ══════════════════════════════════════════════════════════════ */
36
+ /** Simple compression for JSON save data (dictionary-based) */
37
+ function compressSaveData(json) {
38
+ const encoder = new TextEncoder();
39
+ const raw = encoder.encode(json);
40
+ // For small data, skip compression
41
+ if (raw.length < 256) {
42
+ const out = new Uint8Array(1 + raw.length);
43
+ out[0] = 0; // flag: uncompressed
44
+ out.set(raw, 1);
45
+ return out;
46
+ }
47
+ // Simple dictionary compression using common JSON patterns
48
+ const dictionary = [
49
+ '":"',
50
+ '","',
51
+ '":true',
52
+ '":false',
53
+ '":null',
54
+ '":0',
55
+ '":1',
56
+ '{"',
57
+ '"}',
58
+ '["',
59
+ '"]',
60
+ '\\n',
61
+ '\\t',
62
+ ];
63
+ const chunks = [1]; // flag: compressed
64
+ // Write dictionary length
65
+ chunks.push(dictionary.length);
66
+ let i = 0;
67
+ while (i < raw.length) {
68
+ let matched = false;
69
+ // Try dictionary match
70
+ for (let d = 0; d < dictionary.length; d++) {
71
+ const dictBytes = encoder.encode(dictionary[d]);
72
+ if (i + dictBytes.length <= raw.length) {
73
+ let match = true;
74
+ for (let j = 0; j < dictBytes.length; j++) {
75
+ if (raw[i + j] !== dictBytes[j]) {
76
+ match = false;
77
+ break;
78
+ }
79
+ }
80
+ if (match) {
81
+ chunks.push(255); // escape byte = dict reference
82
+ chunks.push(d); // dict index
83
+ i += dictBytes.length;
84
+ matched = true;
85
+ break;
86
+ }
87
+ }
88
+ }
89
+ // RLE for repeated bytes
90
+ if (!matched && i + 3 < raw.length && raw[i] === raw[i + 1] && raw[i] === raw[i + 2]) {
91
+ let runLen = 1;
92
+ while (i + runLen < raw.length && raw[i + runLen] === raw[i] && runLen < 127) {
93
+ runLen++;
94
+ }
95
+ chunks.push(254); // escape byte = RLE
96
+ chunks.push(runLen);
97
+ chunks.push(raw[i]);
98
+ i += runLen;
99
+ matched = true;
100
+ }
101
+ if (!matched) {
102
+ // Literal byte
103
+ if (raw[i] === 254 || raw[i] === 255) {
104
+ chunks.push(253); // escape for literal 254/255
105
+ }
106
+ chunks.push(raw[i]);
107
+ i++;
108
+ }
109
+ }
110
+ return new Uint8Array(chunks);
111
+ }
112
+ /** Decompress save data */
113
+ function decompressSaveData(data) {
114
+ const decoder = new TextDecoder();
115
+ const encoder = new TextEncoder();
116
+ if (data[0] === 0) {
117
+ // Uncompressed
118
+ return decoder.decode(data.slice(1));
119
+ }
120
+ const dictionary = [
121
+ '":"',
122
+ '","',
123
+ '":true',
124
+ '":false',
125
+ '":null',
126
+ '":0',
127
+ '":1',
128
+ '{"',
129
+ '"}',
130
+ '["',
131
+ '"]',
132
+ '\\n',
133
+ '\\t',
134
+ ];
135
+ const dictBytes = dictionary.map((s) => encoder.encode(s));
136
+ const output = [];
137
+ let i = 2; // skip flag + dict length
138
+ while (i < data.length) {
139
+ if (data[i] === 255) {
140
+ // Dictionary reference
141
+ const dictIdx = data[i + 1];
142
+ if (dictIdx < dictBytes.length) {
143
+ for (const b of dictBytes[dictIdx]) {
144
+ output.push(b);
145
+ }
146
+ }
147
+ i += 2;
148
+ }
149
+ else if (data[i] === 254) {
150
+ // RLE
151
+ const runLen = data[i + 1];
152
+ const val = data[i + 2];
153
+ for (let j = 0; j < runLen; j++) {
154
+ output.push(val);
155
+ }
156
+ i += 3;
157
+ }
158
+ else if (data[i] === 253) {
159
+ // Escaped literal
160
+ output.push(data[i + 1]);
161
+ i += 2;
162
+ }
163
+ else {
164
+ output.push(data[i]);
165
+ i++;
166
+ }
167
+ }
168
+ return decoder.decode(new Uint8Array(output));
169
+ }
170
+ /* ══════════════════════════════════════════════════════════════
171
+ CHECKSUM — CRC32 for data integrity
172
+ ══════════════════════════════════════════════════════════════ */
173
+ const CRC32_TABLE = [];
174
+ for (let i = 0; i < 256; i++) {
175
+ let c = i;
176
+ for (let j = 0; j < 8; j++) {
177
+ c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
178
+ }
179
+ CRC32_TABLE[i] = c;
180
+ }
181
+ function crc32(data) {
182
+ let crc = 0xffffffff;
183
+ for (let i = 0; i < data.length; i++) {
184
+ crc = CRC32_TABLE[(crc ^ data[i]) & 0xff] ^ (crc >>> 8);
185
+ }
186
+ return (crc ^ 0xffffffff) >>> 0;
187
+ }
188
+ /* ══════════════════════════════════════════════════════════════
189
+ MIGRATION ENGINE
190
+ ══════════════════════════════════════════════════════════════ */
191
+ class MigrationEngine {
192
+ constructor() {
193
+ this.migrations = [];
194
+ }
195
+ register(migration) {
196
+ this.migrations.push(migration);
197
+ this.migrations.sort((a, b) => a.fromVersion - b.fromVersion);
198
+ }
199
+ /** Migrate payload from fromVersion to toVersion */
200
+ migrate(payload, fromVersion, toVersion) {
201
+ const applied = [];
202
+ let current = { ...payload };
203
+ let version = fromVersion;
204
+ if (fromVersion < toVersion) {
205
+ // Forward migration
206
+ while (version < toVersion) {
207
+ const migration = this.migrations.find((m) => m.fromVersion === version);
208
+ if (!migration) {
209
+ throw new Error(`No migration found for version ${version} → ${version + 1}`);
210
+ }
211
+ current = migration.migrate(current);
212
+ applied.push(migration.description);
213
+ version = migration.toVersion;
214
+ }
215
+ }
216
+ else if (fromVersion > toVersion) {
217
+ // Rollback (reverse order)
218
+ while (version > toVersion) {
219
+ const migration = this.migrations.find((m) => m.toVersion === version);
220
+ if (!migration || !migration.rollback) {
221
+ throw new Error(`No rollback found for version ${version} → ${version - 1}`);
222
+ }
223
+ current = migration.rollback(current);
224
+ applied.push(`Rollback: ${migration.description}`);
225
+ version = migration.fromVersion;
226
+ }
227
+ }
228
+ return { payload: current, applied };
229
+ }
230
+ getRegistered() {
231
+ return this.migrations;
232
+ }
233
+ canMigrate(from, to) {
234
+ let v = from;
235
+ if (from < to) {
236
+ while (v < to) {
237
+ const m = this.migrations.find((mm) => mm.fromVersion === v);
238
+ if (!m) {
239
+ return false;
240
+ }
241
+ v = m.toVersion;
242
+ }
243
+ }
244
+ else {
245
+ while (v > to) {
246
+ const m = this.migrations.find((mm) => mm.toVersion === v);
247
+ if (!m || !m.rollback) {
248
+ return false;
249
+ }
250
+ v = m.fromVersion;
251
+ }
252
+ }
253
+ return true;
254
+ }
255
+ }
256
+ /* ══════════════════════════════════════════════════════════════
257
+ SAVE SYSTEM V2
258
+ ══════════════════════════════════════════════════════════════ */
259
+ class SaveSystem {
260
+ constructor(eventBus, config = {}) {
261
+ this.migrationEngine = new MigrationEngine();
262
+ this.slots = new Map();
263
+ this.autoSaveTimer = null;
264
+ this.autoSaveCounter = 0;
265
+ this.safeToSave = true;
266
+ this.config = { ...DEFAULT_SAVE_CONFIG, ...config };
267
+ this.eventBus = eventBus;
268
+ this.setupEventHandlers();
269
+ }
270
+ setupEventHandlers() {
271
+ this.eventBus.on('game:safe-state', (data) => {
272
+ this.safeToSave = data.safe;
273
+ });
274
+ }
275
+ /** Register a schema migration */
276
+ registerMigration(migration) {
277
+ this.migrationEngine.register(migration);
278
+ }
279
+ /** Save game state to a slot */
280
+ save(slotId, payload, options = {}) {
281
+ const encoder = new TextEncoder();
282
+ const json = JSON.stringify(payload);
283
+ const compressed = this.config.compressionEnabled
284
+ ? compressSaveData(json)
285
+ : encoder.encode(json);
286
+ const checksum = crc32(compressed);
287
+ const now = Date.now();
288
+ const existingMeta = this.slots.get(slotId)?.meta;
289
+ const meta = {
290
+ slotId,
291
+ type: options.type ?? 'manual',
292
+ label: options.label ?? `Save ${slotId}`,
293
+ schemaVersion: this.config.schemaVersion,
294
+ createdAt: existingMeta?.createdAt ?? now,
295
+ updatedAt: now,
296
+ playtimeMs: existingMeta ? existingMeta.playtimeMs + (now - existingMeta.updatedAt) : 0,
297
+ location: options.location ?? '',
298
+ thumbnail: options.thumbnail,
299
+ sizeBytes: compressed.length,
300
+ checksum,
301
+ cloudSynced: false,
302
+ tags: options.tags ?? [],
303
+ };
304
+ this.slots.set(slotId, { meta, payload });
305
+ // Persist to storage backend
306
+ this.persistSlot(slotId, compressed, meta);
307
+ this.eventBus.emit('save:saved', { slotId, sizeBytes: compressed.length });
308
+ return {
309
+ success: true,
310
+ slotId,
311
+ sizeBytes: compressed.length,
312
+ compressed: this.config.compressionEnabled,
313
+ };
314
+ }
315
+ /** Load game state from a slot */
316
+ load(slotId) {
317
+ const data = this.slots.get(slotId);
318
+ if (!data) {
319
+ return null;
320
+ }
321
+ let payload = { ...data.payload };
322
+ let migrated = false;
323
+ // Check if migration is needed
324
+ if (data.meta.schemaVersion !== this.config.schemaVersion) {
325
+ if (this.migrationEngine.canMigrate(data.meta.schemaVersion, this.config.schemaVersion)) {
326
+ const result = this.migrationEngine.migrate(payload, data.meta.schemaVersion, this.config.schemaVersion);
327
+ payload = result.payload;
328
+ migrated = true;
329
+ this.eventBus.emit('save:migrated', {
330
+ slotId,
331
+ from: data.meta.schemaVersion,
332
+ to: this.config.schemaVersion,
333
+ steps: result.applied,
334
+ });
335
+ }
336
+ }
337
+ this.eventBus.emit('save:loaded', { slotId });
338
+ return { payload, meta: { ...data.meta }, migrated };
339
+ }
340
+ /** Delete a save slot */
341
+ delete(slotId) {
342
+ const existed = this.slots.delete(slotId);
343
+ if (existed) {
344
+ this.removeFromStorage(slotId);
345
+ this.eventBus.emit('save:deleted', { slotId });
346
+ }
347
+ return existed;
348
+ }
349
+ /** List all save slot metadata (sorted by updatedAt desc) */
350
+ listSlots() {
351
+ return Array.from(this.slots.values())
352
+ .map((s) => ({ ...s.meta }))
353
+ .sort((a, b) => b.updatedAt - a.updatedAt);
354
+ }
355
+ /** Get slot metadata without loading payload */
356
+ getSlotMeta(slotId) {
357
+ const data = this.slots.get(slotId);
358
+ return data ? { ...data.meta } : null;
359
+ }
360
+ /** Check if a slot exists */
361
+ hasSlot(slotId) {
362
+ return this.slots.has(slotId);
363
+ }
364
+ /** Start auto-save timer */
365
+ startAutoSave(getPayload, getLocation) {
366
+ if (!this.config.autoSave.enabled) {
367
+ return;
368
+ }
369
+ this.stopAutoSave();
370
+ this.autoSaveTimer = setInterval(() => {
371
+ if (this.config.autoSave.requireSafeState && !this.safeToSave) {
372
+ return;
373
+ }
374
+ const slotId = `auto-${this.autoSaveCounter % this.config.autoSave.maxAutoSaves}`;
375
+ this.autoSaveCounter++;
376
+ this.save(slotId, getPayload(), {
377
+ type: 'auto',
378
+ label: `Auto Save ${this.autoSaveCounter}`,
379
+ location: getLocation(),
380
+ });
381
+ }, this.config.autoSave.intervalMs);
382
+ }
383
+ /** Stop auto-save */
384
+ stopAutoSave() {
385
+ if (this.autoSaveTimer) {
386
+ clearInterval(this.autoSaveTimer);
387
+ this.autoSaveTimer = null;
388
+ }
389
+ }
390
+ /** Quick save (overwriting the single quick save slot) */
391
+ quickSave(payload, location) {
392
+ return this.save('quicksave', payload, { type: 'quick', label: 'Quick Save', location });
393
+ }
394
+ /** Quick load */
395
+ quickLoad() {
396
+ return this.load('quicksave');
397
+ }
398
+ /* ── Cloud Sync ─────────────────────────────────────────────── */
399
+ /** Sync local saves to cloud (stub — needs actual endpoint) */
400
+ async syncToCloud() {
401
+ if (!this.config.cloud.enabled) {
402
+ return { synced: [], conflicts: [] };
403
+ }
404
+ const synced = [];
405
+ const conflicts = [];
406
+ for (const [slotId, data] of this.slots) {
407
+ if (!data.meta.cloudSynced) {
408
+ // In production, this would POST to the cloud endpoint
409
+ // Here we simulate a successful sync
410
+ data.meta.cloudSynced = true;
411
+ data.meta.cloudTimestamp = Date.now();
412
+ synced.push(slotId);
413
+ }
414
+ }
415
+ this.eventBus.emit('save:cloud-sync', { synced, conflicts });
416
+ return { synced, conflicts };
417
+ }
418
+ /** Resolve a cloud sync conflict */
419
+ resolveConflict(conflict, strategy) {
420
+ conflict.resolvedWith = strategy;
421
+ switch (strategy) {
422
+ case 'local-wins':
423
+ return conflict.localMeta;
424
+ case 'remote-wins':
425
+ return conflict.remoteMeta;
426
+ case 'newest-wins':
427
+ return conflict.localMeta.updatedAt >= conflict.remoteMeta.updatedAt
428
+ ? conflict.localMeta
429
+ : conflict.remoteMeta;
430
+ default:
431
+ return conflict.localMeta; // merge/prompt fallback
432
+ }
433
+ }
434
+ /* ── Storage Backend ────────────────────────────────────────── */
435
+ persistSlot(slotId, _data, _meta) {
436
+ switch (this.config.storageBackend) {
437
+ case 'localstorage': {
438
+ const key = `${this.config.storageKey}:${slotId}`;
439
+ try {
440
+ const serialized = JSON.stringify({
441
+ meta: _meta,
442
+ payload: this.slots.get(slotId)?.payload,
443
+ });
444
+ localStorage.setItem(key, serialized);
445
+ }
446
+ catch {
447
+ /* quota exceeded — emit event */
448
+ this.eventBus.emit('save:error', { slotId, error: 'Storage quota exceeded' });
449
+ }
450
+ break;
451
+ }
452
+ }
453
+ }
454
+ removeFromStorage(slotId) {
455
+ if (this.config.storageBackend === 'localstorage') {
456
+ localStorage.removeItem(`${this.config.storageKey}:${slotId}`);
457
+ }
458
+ }
459
+ /** Load all slots from storage backend */
460
+ async loadFromStorage() {
461
+ if (this.config.storageBackend === 'localstorage') {
462
+ let count = 0;
463
+ const prefix = `${this.config.storageKey}:`;
464
+ for (let i = 0; i < localStorage.length; i++) {
465
+ const key = localStorage.key(i);
466
+ if (key?.startsWith(prefix)) {
467
+ try {
468
+ const raw = localStorage.getItem(key);
469
+ if (raw) {
470
+ const parsed = JSON.parse(raw);
471
+ this.slots.set(parsed.meta.slotId, parsed);
472
+ count++;
473
+ }
474
+ }
475
+ catch {
476
+ /* corrupt entry — skip */
477
+ }
478
+ }
479
+ }
480
+ return count;
481
+ }
482
+ return 0;
483
+ }
484
+ /** Export all saves as a downloadable blob */
485
+ exportAll() {
486
+ const all = Array.from(this.slots.values());
487
+ const json = JSON.stringify(all);
488
+ return new Blob([json], { type: 'application/json' });
489
+ }
490
+ /** Import saves from a blob */
491
+ async importAll(blob) {
492
+ const text = await blob.text();
493
+ let parsed;
494
+ try {
495
+ parsed = JSON.parse(text);
496
+ }
497
+ catch {
498
+ return 0;
499
+ }
500
+ if (!Array.isArray(parsed)) {
501
+ return 0;
502
+ }
503
+ let count = 0;
504
+ for (const entry of parsed) {
505
+ if (entry && typeof entry === 'object' && 'meta' in entry && 'payload' in entry) {
506
+ const saveData = entry;
507
+ this.slots.set(saveData.meta.slotId, saveData);
508
+ count++;
509
+ }
510
+ }
511
+ return count;
512
+ }
513
+ getConfig() {
514
+ return this.config;
515
+ }
516
+ getMigrationEngine() {
517
+ return this.migrationEngine;
518
+ }
519
+ destroy() {
520
+ this.stopAutoSave();
521
+ }
522
+ }
523
+
524
+ exports.DEFAULT_SAVE_CONFIG = DEFAULT_SAVE_CONFIG;
525
+ exports.MigrationEngine = MigrationEngine;
526
+ exports.SaveSystem = SaveSystem;
527
+ exports.compressSaveData = compressSaveData;
528
+ exports.crc32 = crc32;
529
+ exports.decompressSaveData = decompressSaveData;
530
+ //# sourceMappingURL=SaveSystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SaveSystem.js","sources":["../../../src/engine/SaveSystem.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAAA;;;;;;;;;;AAUmE;AAsF5D,MAAM,mBAAmB,GAAqB;AACnD,IAAA,aAAa,EAAE,CAAC;AAChB,IAAA,cAAc,EAAE,WAAW;AAC3B,IAAA,UAAU,EAAE,iBAAiB;AAC7B,IAAA,QAAQ,EAAE,EAAE;AACZ,IAAA,kBAAkB,EAAE,IAAI;AACxB,IAAA,QAAQ,EAAE;AACR,QAAA,OAAO,EAAE,IAAI;AACb,QAAA,UAAU,EAAE,KAAM;AAClB,QAAA,YAAY,EAAE,CAAC;AACf,QAAA,gBAAgB,EAAE,IAAI;AACvB,KAAA;AACD,IAAA,KAAK,EAAE;AACL,QAAA,OAAO,EAAE,KAAK;AACd,QAAA,gBAAgB,EAAE,aAAa;AAC/B,QAAA,cAAc,EAAE,MAAO;AACvB,QAAA,aAAa,EAAE,EAAE;AAClB,KAAA;;AAkBH;;AAEoE;AAEpE;AACM,SAAU,gBAAgB,CAAC,IAAY,EAAA;AAC3C,IAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE;IACjC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;;AAGhC,IAAA,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE;QACpB,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;AAC1C,QAAA,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACX,QAAA,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;AACf,QAAA,OAAO,GAAG;IACZ;;AAGA,IAAA,MAAM,UAAU,GAAG;QACjB,KAAK;QACL,KAAK;QACL,QAAQ;QACR,SAAS;QACT,QAAQ;QACR,KAAK;QACL,KAAK;QACL,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,KAAK;QACL,KAAK;KACN;AAED,IAAA,MAAM,MAAM,GAAa,CAAC,CAAC,CAAC,CAAC;;AAE7B,IAAA,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;IAE9B,IAAI,CAAC,GAAG,CAAC;AACT,IAAA,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE;QACrB,IAAI,OAAO,GAAG,KAAK;;AAGnB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAC/C,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE;gBACtC,IAAI,KAAK,GAAG,IAAI;AAChB,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACzC,oBAAA,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE;wBAC/B,KAAK,GAAG,KAAK;wBACb;oBACF;gBACF;gBACA,IAAI,KAAK,EAAE;AACT,oBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjB,oBAAA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACf,oBAAA,CAAC,IAAI,SAAS,CAAC,MAAM;oBACrB,OAAO,GAAG,IAAI;oBACd;gBACF;YACF;QACF;;AAGA,QAAA,IAAI,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE;YACpF,IAAI,MAAM,GAAG,CAAC;YACd,OAAO,CAAC,GAAG,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,MAAM,GAAG,GAAG,EAAE;AAC5E,gBAAA,MAAM,EAAE;YACV;AACA,YAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjB,YAAA,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC,IAAI,MAAM;YACX,OAAO,GAAG,IAAI;QAChB;QAEA,IAAI,CAAC,OAAO,EAAE;;AAEZ,YAAA,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;AACpC,gBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB;YACA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACnB,YAAA,CAAC,EAAE;QACL;IACF;AAEA,IAAA,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC;AAC/B;AAEA;AACM,SAAU,kBAAkB,CAAC,IAAgB,EAAA;AACjD,IAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE;AACjC,IAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE;AAEjC,IAAA,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE;;QAEjB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACtC;AAEA,IAAA,MAAM,UAAU,GAAG;QACjB,KAAK;QACL,KAAK;QACL,QAAQ;QACR,SAAS;QACT,QAAQ;QACR,KAAK;QACL,KAAK;QACL,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,KAAK;QACL,KAAK;KACN;AACD,IAAA,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAE1D,MAAM,MAAM,GAAa,EAAE;AAC3B,IAAA,IAAI,CAAC,GAAG,CAAC,CAAC;AAEV,IAAA,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;AACtB,QAAA,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;;YAEnB,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AAC3B,YAAA,IAAI,OAAO,GAAG,SAAS,CAAC,MAAM,EAAE;gBAC9B,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE;AAClC,oBAAA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBAChB;YACF;YACA,CAAC,IAAI,CAAC;QACR;AAAO,aAAA,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;;YAE1B,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AACvB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;AAC/B,gBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YAClB;YACA,CAAC,IAAI,CAAC;QACR;AAAO,aAAA,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;;YAE1B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACxB,CAAC,IAAI,CAAC;QACR;aAAO;YACL,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,YAAA,CAAC,EAAE;QACL;IACF;IAEA,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;AAC/C;AAEA;;AAEoE;AAEpE,MAAM,WAAW,GAAa,EAAE;AAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;IAC5B,IAAI,CAAC,GAAG,CAAC;AACT,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1B,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,UAAU,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;IAC9C;AACA,IAAA,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC;AACpB;AAEM,SAAU,KAAK,CAAC,IAAgB,EAAA;IACpC,IAAI,GAAG,GAAG,UAAU;AACpB,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACpC,GAAG,GAAG,WAAW,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IACzD;AACA,IAAA,OAAO,CAAC,GAAG,GAAG,UAAU,MAAM,CAAC;AACjC;AAEA;;AAEoE;MAEvD,eAAe,CAAA;AAA5B,IAAA,WAAA,GAAA;QACU,IAAA,CAAA,UAAU,GAAoB,EAAE;IAqE1C;AAnEE,IAAA,QAAQ,CAAC,SAAwB,EAAA;AAC/B,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC;IAC/D;;AAGA,IAAA,OAAO,CACL,OAAgC,EAChC,WAAmB,EACnB,SAAiB,EAAA;QAEjB,MAAM,OAAO,GAAa,EAAE;AAC5B,QAAA,IAAI,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE;QAC5B,IAAI,OAAO,GAAG,WAAW;AAEzB,QAAA,IAAI,WAAW,GAAG,SAAS,EAAE;;AAE3B,YAAA,OAAO,OAAO,GAAG,SAAS,EAAE;AAC1B,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,KAAK,OAAO,CAAC;gBACxE,IAAI,CAAC,SAAS,EAAE;oBACd,MAAM,IAAI,KAAK,CAAC,CAAA,+BAAA,EAAkC,OAAO,CAAA,GAAA,EAAM,OAAO,GAAG,CAAC,CAAA,CAAE,CAAC;gBAC/E;AACA,gBAAA,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC;AACpC,gBAAA,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;AACnC,gBAAA,OAAO,GAAG,SAAS,CAAC,SAAS;YAC/B;QACF;AAAO,aAAA,IAAI,WAAW,GAAG,SAAS,EAAE;;AAElC,YAAA,OAAO,OAAO,GAAG,SAAS,EAAE;AAC1B,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC;gBACtE,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE;oBACrC,MAAM,IAAI,KAAK,CAAC,CAAA,8BAAA,EAAiC,OAAO,CAAA,GAAA,EAAM,OAAO,GAAG,CAAC,CAAA,CAAE,CAAC;gBAC9E;AACA,gBAAA,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACrC,OAAO,CAAC,IAAI,CAAC,CAAA,UAAA,EAAa,SAAS,CAAC,WAAW,CAAA,CAAE,CAAC;AAClD,gBAAA,OAAO,GAAG,SAAS,CAAC,WAAW;YACjC;QACF;AAEA,QAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE;IACtC;IAEA,aAAa,GAAA;QACX,OAAO,IAAI,CAAC,UAAU;IACxB;IAEA,UAAU,CAAC,IAAY,EAAE,EAAU,EAAA;QACjC,IAAI,CAAC,GAAG,IAAI;AACZ,QAAA,IAAI,IAAI,GAAG,EAAE,EAAE;AACb,YAAA,OAAO,CAAC,GAAG,EAAE,EAAE;AACb,gBAAA,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,WAAW,KAAK,CAAC,CAAC;gBAC5D,IAAI,CAAC,CAAC,EAAE;AACN,oBAAA,OAAO,KAAK;gBACd;AACA,gBAAA,CAAC,GAAG,CAAC,CAAC,SAAS;YACjB;QACF;aAAO;AACL,YAAA,OAAO,CAAC,GAAG,EAAE,EAAE;AACb,gBAAA,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,SAAS,KAAK,CAAC,CAAC;gBAC1D,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE;AACrB,oBAAA,OAAO,KAAK;gBACd;AACA,gBAAA,CAAC,GAAG,CAAC,CAAC,WAAW;YACnB;QACF;AACA,QAAA,OAAO,IAAI;IACb;AACD;AAED;;AAEoE;MAEvD,UAAU,CAAA;IASrB,WAAA,CAAY,QAAkB,EAAE,MAAA,GAAoC,EAAE,EAAA;AAP9D,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,eAAe,EAAE;AAEvC,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,GAAG,EAAoB;QACnC,IAAA,CAAA,aAAa,GAA0C,IAAI;QAC3D,IAAA,CAAA,eAAe,GAAG,CAAC;QACnB,IAAA,CAAA,UAAU,GAAG,IAAI;QAGvB,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,mBAAmB,EAAE,GAAG,MAAM,EAAE;AACnD,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;QACxB,IAAI,CAAC,kBAAkB,EAAE;IAC3B;IAEQ,kBAAkB,GAAA;QACxB,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,IAAuB,KAAI;AAC9D,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI;AAC7B,QAAA,CAAC,CAAC;IACJ;;AAGA,IAAA,iBAAiB,CAAC,SAAwB,EAAA;AACxC,QAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC1C;;AAGA,IAAA,IAAI,CACF,MAAc,EACd,OAAgC,EAChC,UAMI,EAAE,EAAA;AAEN,QAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;AACpC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;AAC7B,cAAE,gBAAgB,CAAC,IAAI;AACvB,cAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;AACxB,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC;AAElC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI;AAEjD,QAAA,MAAM,IAAI,GAAiB;YACzB,MAAM;AACN,YAAA,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,QAAQ;AAC9B,YAAA,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAE;AACxC,YAAA,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa;AACxC,YAAA,SAAS,EAAE,YAAY,EAAE,SAAS,IAAI,GAAG;AACzC,YAAA,SAAS,EAAE,GAAG;AACd,YAAA,UAAU,EAAE,YAAY,GAAG,YAAY,CAAC,UAAU,IAAI,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC;AACvF,YAAA,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;YAChC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,SAAS,EAAE,UAAU,CAAC,MAAM;YAC5B,QAAQ;AACR,YAAA,WAAW,EAAE,KAAK;AAClB,YAAA,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;SACzB;AAED,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;;QAGzC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC;AAE1C,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;QAE1E,OAAO;AACL,YAAA,OAAO,EAAE,IAAI;YACb,MAAM;YACN,SAAS,EAAE,UAAU,CAAC,MAAM;AAC5B,YAAA,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB;SAC3C;IACH;;AAGA,IAAA,IAAI,CACF,MAAc,EAAA;QAEd,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;QACnC,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,IAAI;QACb;QAEA,IAAI,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;QACjC,IAAI,QAAQ,GAAG,KAAK;;AAGpB,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;AACzD,YAAA,IAAI,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE;gBACvF,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CACzC,OAAO,EACP,IAAI,CAAC,IAAI,CAAC,aAAa,EACvB,IAAI,CAAC,MAAM,CAAC,aAAa,CAC1B;AACD,gBAAA,OAAO,GAAG,MAAM,CAAC,OAAO;gBACxB,QAAQ,GAAG,IAAI;AACf,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE;oBAClC,MAAM;AACN,oBAAA,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa;AAC7B,oBAAA,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa;oBAC7B,KAAK,EAAE,MAAM,CAAC,OAAO;AACtB,iBAAA,CAAC;YACJ;QACF;QAEA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,CAAC;AAC7C,QAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE;IACtD;;AAGA,IAAA,MAAM,CAAC,MAAc,EAAA;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;QACzC,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC;YAC9B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,CAAC;QAChD;AACA,QAAA,OAAO,OAAO;IAChB;;IAGA,SAAS,GAAA;QACP,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;AAClC,aAAA,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1B,aAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;IAC9C;;AAGA,IAAA,WAAW,CAAC,MAAc,EAAA;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;AACnC,QAAA,OAAO,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI;IACvC;;AAGA,IAAA,OAAO,CAAC,MAAc,EAAA;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;IAC/B;;IAGA,aAAa,CAAC,UAAyC,EAAE,WAAyB,EAAA;QAChF,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE;YACjC;QACF;QACA,IAAI,CAAC,YAAY,EAAE;AAEnB,QAAA,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,MAAK;AACpC,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;gBAC7D;YACF;AAEA,YAAA,MAAM,MAAM,GAAG,CAAA,KAAA,EAAQ,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE;YACjF,IAAI,CAAC,eAAe,EAAE;AAEtB,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE;AAC9B,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,KAAK,EAAE,CAAA,UAAA,EAAa,IAAI,CAAC,eAAe,CAAA,CAAE;gBAC1C,QAAQ,EAAE,WAAW,EAAE;AACxB,aAAA,CAAC;QACJ,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;IACrC;;IAGA,YAAY,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC;AACjC,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;QAC3B;IACF;;IAGA,SAAS,CAAC,OAAgC,EAAE,QAAgB,EAAA;QAC1D,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;IAC1F;;IAGA,SAAS,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;IAC/B;;;AAKA,IAAA,MAAM,WAAW,GAAA;QACf,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;YAC9B,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACtC;QAEA,MAAM,MAAM,GAAa,EAAE;QAC3B,MAAM,SAAS,GAAmB,EAAE;QAEpC,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE;AACvC,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;;;AAG1B,gBAAA,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI;gBAC5B,IAAI,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE;AACrC,gBAAA,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YACrB;QACF;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC5D,QAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE;IAC9B;;IAGA,eAAe,CAAC,QAAsB,EAAE,QAA8B,EAAA;AACpE,QAAA,QAAQ,CAAC,YAAY,GAAG,QAAQ;QAChC,QAAQ,QAAQ;AACd,YAAA,KAAK,YAAY;gBACf,OAAO,QAAQ,CAAC,SAAS;AAC3B,YAAA,KAAK,aAAa;gBAChB,OAAO,QAAQ,CAAC,UAAU;AAC5B,YAAA,KAAK,aAAa;gBAChB,OAAO,QAAQ,CAAC,SAAS,CAAC,SAAS,IAAI,QAAQ,CAAC,UAAU,CAAC;sBACvD,QAAQ,CAAC;AACX,sBAAE,QAAQ,CAAC,UAAU;AACzB,YAAA;AACE,gBAAA,OAAO,QAAQ,CAAC,SAAS,CAAC;;IAEhC;;AAIQ,IAAA,WAAW,CAAC,MAAc,EAAE,KAAiB,EAAE,KAAmB,EAAA;AACxE,QAAA,QAAQ,IAAI,CAAC,MAAM,CAAC,cAAc;YAChC,KAAK,cAAc,EAAE;gBACnB,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE;AACjD,gBAAA,IAAI;AACF,oBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;AAChC,wBAAA,IAAI,EAAE,KAAK;wBACX,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO;AACzC,qBAAA,CAAC;AACF,oBAAA,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC;gBACvC;AAAE,gBAAA,MAAM;;AAEN,oBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;gBAC/E;gBACA;YACF;;IAQJ;AAEQ,IAAA,iBAAiB,CAAC,MAAc,EAAA;QACtC,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,KAAK,cAAc,EAAE;AACjD,YAAA,YAAY,CAAC,UAAU,CAAC,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAC;QAChE;IACF;;AAGA,IAAA,MAAM,eAAe,GAAA;QACnB,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,KAAK,cAAc,EAAE;YACjD,IAAI,KAAK,GAAG,CAAC;YACb,MAAM,MAAM,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAA,CAAA,CAAG;AAC3C,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC5C,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/B,gBAAA,IAAI,GAAG,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE;AAC3B,oBAAA,IAAI;wBACF,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC;wBACrC,IAAI,GAAG,EAAE;4BACP,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAa;AAC1C,4BAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AAC1C,4BAAA,KAAK,EAAE;wBACT;oBACF;AAAE,oBAAA,MAAM;;oBAER;gBACF;YACF;AACA,YAAA,OAAO,KAAK;QACd;AACA,QAAA,OAAO,CAAC;IACV;;IAGA,SAAS,GAAA;AACP,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;AAChC,QAAA,OAAO,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;IACvD;;IAGA,MAAM,SAAS,CAAC,IAAU,EAAA;AACxB,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE;AAC9B,QAAA,IAAI,MAAe;AACnB,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAC3B;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,CAAC;QACV;QACA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AAC1B,YAAA,OAAO,CAAC;QACV;QACA,IAAI,KAAK,GAAG,CAAC;AACb,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAC1B,YAAA,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAI,SAAS,IAAI,KAAK,EAAE;gBAC/E,MAAM,QAAQ,GAAG,KAAiB;AAClC,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC;AAC9C,gBAAA,KAAK,EAAE;YACT;QACF;AACA,QAAA,OAAO,KAAK;IACd;IAEA,SAAS,GAAA;QACP,OAAO,IAAI,CAAC,MAAM;IACpB;IAEA,kBAAkB,GAAA;QAChB,OAAO,IAAI,CAAC,eAAe;IAC7B;IAEA,OAAO,GAAA;QACL,IAAI,CAAC,YAAY,EAAE;IACrB;AACD;;;;;;;;;"}
package/dist/cjs/index.js CHANGED
@@ -79,7 +79,7 @@ var WebGPURenderPipeline = require('./rendering/WebGPURenderPipeline.js');
79
79
  var AudioBridge = require('./audio/AudioBridge.js');
80
80
  var DialogueSystem = require('./dialogue/DialogueSystem.js');
81
81
  var QuestSystem = require('./quest/QuestSystem.js');
82
- var SaveSystemV2 = require('./engine/SaveSystemV2.js');
82
+ var SaveSystem = require('./engine/SaveSystem.js');
83
83
  var GameplayAnalytics = require('./devtools/GameplayAnalytics.js');
84
84
  var ScriptAST = require('./scripting/ScriptAST.js');
85
85
  var LanguageExporter = require('./scripting/LanguageExporter.js');
@@ -113,7 +113,7 @@ var AssetStreaming = require('./performance/AssetStreaming.js');
113
113
  var ObjectPooling = require('./performance/ObjectPooling.js');
114
114
  var MemoryManagement = require('./performance/MemoryManagement.js');
115
115
  var WebGPURenderer = require('./performance/WebGPURenderer.js');
116
- var SaveSystem = require('./performance/SaveSystem.js');
116
+ var GameSaveSystem = require('./performance/GameSaveSystem.js');
117
117
  var HotReload = require('./performance/HotReload.js');
118
118
  var LocalizationRuntime = require('./performance/LocalizationRuntime.js');
119
119
  var ModSupport = require('./performance/ModSupport.js');
@@ -794,12 +794,12 @@ exports.QuestList = QuestSystem.QuestList;
794
794
  exports.QuestManager = QuestSystem.QuestManager;
795
795
  exports.QuestTracker = QuestSystem.QuestTracker;
796
796
  exports.createEmptyQuest = QuestSystem.createEmptyQuest;
797
- exports.DEFAULT_SAVE_CONFIG = SaveSystemV2.DEFAULT_SAVE_CONFIG;
798
- exports.MigrationEngine = SaveSystemV2.MigrationEngine;
799
- exports.SaveSystemV2 = SaveSystemV2.SaveSystemV2;
800
- exports.compressSaveData = SaveSystemV2.compressSaveData;
801
- exports.crc32 = SaveSystemV2.crc32;
802
- exports.decompressSaveData = SaveSystemV2.decompressSaveData;
797
+ exports.DEFAULT_SAVE_CONFIG = SaveSystem.DEFAULT_SAVE_CONFIG;
798
+ exports.MigrationEngine = SaveSystem.MigrationEngine;
799
+ exports.SaveSystem = SaveSystem.SaveSystem;
800
+ exports.compressSaveData = SaveSystem.compressSaveData;
801
+ exports.crc32 = SaveSystem.crc32;
802
+ exports.decompressSaveData = SaveSystem.decompressSaveData;
803
803
  exports.AnalyticsDashboard = GameplayAnalytics.AnalyticsDashboard;
804
804
  exports.DEFAULT_HEATMAP_CONFIG = GameplayAnalytics.DEFAULT_HEATMAP_CONFIG;
805
805
  exports.DEFAULT_RECORDING_CONFIG = GameplayAnalytics.DEFAULT_RECORDING_CONFIG;
@@ -978,11 +978,11 @@ exports.createTrackedAllocator = MemoryManagement.createTrackedAllocator;
978
978
  exports.createPipelineDescriptor = WebGPURenderer.createPipelineDescriptor;
979
979
  exports.createWebGPURenderer = WebGPURenderer.createWebGPURenderer;
980
980
  exports.isWebGPUSupported = WebGPURenderer.isWebGPUSupported;
981
- exports.IndexedDBAdapter = SaveSystem.IndexedDBAdapter;
982
- exports.LocalStorageAdapter = SaveSystem.LocalStorageAdapter;
983
- exports.SaveSystem = SaveSystem.SaveSystem;
984
- exports.createMigration = SaveSystem.createMigration;
985
- exports.createSaveSystem = SaveSystem.createSaveSystem;
981
+ exports.GameSaveSystem = GameSaveSystem.GameSaveSystem;
982
+ exports.IndexedDBAdapter = GameSaveSystem.IndexedDBAdapter;
983
+ exports.LocalStorageAdapter = GameSaveSystem.LocalStorageAdapter;
984
+ exports.createMigration = GameSaveSystem.createMigration;
985
+ exports.createSaveSystem = GameSaveSystem.createSaveSystem;
986
986
  exports.DEFAULT_HOT_RELOAD_CONFIG = HotReload.DEFAULT_HOT_RELOAD_CONFIG;
987
987
  exports.FileWatcher = HotReload.FileWatcher;
988
988
  exports.HotReloadSystem = HotReload.HotReloadSystem;