@aleonnet/healthcare-scheduler 0.1.6

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 (170) hide show
  1. package/README.md +264 -0
  2. package/dist/core/EventBus.d.ts +14 -0
  3. package/dist/core/EventBus.d.ts.map +1 -0
  4. package/dist/core/EventBus.js +47 -0
  5. package/dist/core/EventBus.js.map +1 -0
  6. package/dist/core/HealthcareScheduler.d.ts +63 -0
  7. package/dist/core/HealthcareScheduler.d.ts.map +1 -0
  8. package/dist/core/HealthcareScheduler.js +269 -0
  9. package/dist/core/HealthcareScheduler.js.map +1 -0
  10. package/dist/core/types.d.ts +234 -0
  11. package/dist/core/types.d.ts.map +1 -0
  12. package/dist/core/types.js +3 -0
  13. package/dist/core/types.js.map +1 -0
  14. package/dist/database/adapters/MockAdapter.d.ts +37 -0
  15. package/dist/database/adapters/MockAdapter.d.ts.map +1 -0
  16. package/dist/database/adapters/MockAdapter.js +518 -0
  17. package/dist/database/adapters/MockAdapter.js.map +1 -0
  18. package/dist/database/adapters/SQLiteAdapter.d.ts +40 -0
  19. package/dist/database/adapters/SQLiteAdapter.d.ts.map +1 -0
  20. package/dist/database/adapters/SQLiteAdapter.js +147 -0
  21. package/dist/database/adapters/SQLiteAdapter.js.map +1 -0
  22. package/dist/database/adapters/SupabaseAdapter.d.ts +20 -0
  23. package/dist/database/adapters/SupabaseAdapter.d.ts.map +1 -0
  24. package/dist/database/adapters/SupabaseAdapter.js +310 -0
  25. package/dist/database/adapters/SupabaseAdapter.js.map +1 -0
  26. package/dist/database/interfaces.d.ts +20 -0
  27. package/dist/database/interfaces.d.ts.map +1 -0
  28. package/dist/database/interfaces.js +3 -0
  29. package/dist/database/interfaces.js.map +1 -0
  30. package/dist/database/repositories/EventsRepository.d.ts +26 -0
  31. package/dist/database/repositories/EventsRepository.d.ts.map +1 -0
  32. package/dist/database/repositories/EventsRepository.js +91 -0
  33. package/dist/database/repositories/EventsRepository.js.map +1 -0
  34. package/dist/database/repositories/ItemsRepository.d.ts +11 -0
  35. package/dist/database/repositories/ItemsRepository.d.ts.map +1 -0
  36. package/dist/database/repositories/ItemsRepository.js +44 -0
  37. package/dist/database/repositories/ItemsRepository.js.map +1 -0
  38. package/dist/database/repositories/MedicationsRepository.d.ts +40 -0
  39. package/dist/database/repositories/MedicationsRepository.d.ts.map +1 -0
  40. package/dist/database/repositories/MedicationsRepository.js +136 -0
  41. package/dist/database/repositories/MedicationsRepository.js.map +1 -0
  42. package/dist/database/repositories/OccurrencesRepository.d.ts +25 -0
  43. package/dist/database/repositories/OccurrencesRepository.d.ts.map +1 -0
  44. package/dist/database/repositories/OccurrencesRepository.js +150 -0
  45. package/dist/database/repositories/OccurrencesRepository.js.map +1 -0
  46. package/dist/database/repositories/PlansRepository.d.ts +13 -0
  47. package/dist/database/repositories/PlansRepository.d.ts.map +1 -0
  48. package/dist/database/repositories/PlansRepository.js +76 -0
  49. package/dist/database/repositories/PlansRepository.js.map +1 -0
  50. package/dist/database/repositories/index.d.ts +6 -0
  51. package/dist/database/repositories/index.d.ts.map +1 -0
  52. package/dist/database/repositories/index.js +14 -0
  53. package/dist/database/repositories/index.js.map +1 -0
  54. package/dist/database/schema.base.d.ts +3 -0
  55. package/dist/database/schema.base.d.ts.map +1 -0
  56. package/dist/database/schema.base.js +110 -0
  57. package/dist/database/schema.base.js.map +1 -0
  58. package/dist/database/sync/interfaces.d.ts +20 -0
  59. package/dist/database/sync/interfaces.d.ts.map +1 -0
  60. package/dist/database/sync/interfaces.js +3 -0
  61. package/dist/database/sync/interfaces.js.map +1 -0
  62. package/dist/index.d.ts +27 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +58 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/notifications/adapters/MockNotificationAdapter.d.ts +18 -0
  67. package/dist/notifications/adapters/MockNotificationAdapter.d.ts.map +1 -0
  68. package/dist/notifications/adapters/MockNotificationAdapter.js +109 -0
  69. package/dist/notifications/adapters/MockNotificationAdapter.js.map +1 -0
  70. package/dist/notifications/adapters/NotifeeAdapter.d.ts +46 -0
  71. package/dist/notifications/adapters/NotifeeAdapter.d.ts.map +1 -0
  72. package/dist/notifications/adapters/NotifeeAdapter.js +479 -0
  73. package/dist/notifications/adapters/NotifeeAdapter.js.map +1 -0
  74. package/dist/notifications/interfaces.d.ts +8 -0
  75. package/dist/notifications/interfaces.d.ts.map +1 -0
  76. package/dist/notifications/interfaces.js +3 -0
  77. package/dist/notifications/interfaces.js.map +1 -0
  78. package/dist/planning/buildAgenda.d.ts +22 -0
  79. package/dist/planning/buildAgenda.d.ts.map +1 -0
  80. package/dist/planning/buildAgenda.js +148 -0
  81. package/dist/planning/buildAgenda.js.map +1 -0
  82. package/dist/planning/calculateTotalDoses.d.ts +3 -0
  83. package/dist/planning/calculateTotalDoses.d.ts.map +1 -0
  84. package/dist/planning/calculateTotalDoses.js +19 -0
  85. package/dist/planning/calculateTotalDoses.js.map +1 -0
  86. package/dist/planning/expandPlan.d.ts +3 -0
  87. package/dist/planning/expandPlan.d.ts.map +1 -0
  88. package/dist/planning/expandPlan.js +200 -0
  89. package/dist/planning/expandPlan.js.map +1 -0
  90. package/dist/planning/utils.d.ts +15 -0
  91. package/dist/planning/utils.d.ts.map +1 -0
  92. package/dist/planning/utils.js +40 -0
  93. package/dist/planning/utils.js.map +1 -0
  94. package/dist/planning/windowPlanner.d.ts +6 -0
  95. package/dist/planning/windowPlanner.d.ts.map +1 -0
  96. package/dist/planning/windowPlanner.js +18 -0
  97. package/dist/planning/windowPlanner.js.map +1 -0
  98. package/dist/plugins/InventoryPlugin.d.ts +26 -0
  99. package/dist/plugins/InventoryPlugin.d.ts.map +1 -0
  100. package/dist/plugins/InventoryPlugin.js +166 -0
  101. package/dist/plugins/InventoryPlugin.js.map +1 -0
  102. package/dist/plugins/PluginRegistry.d.ts +13 -0
  103. package/dist/plugins/PluginRegistry.d.ts.map +1 -0
  104. package/dist/plugins/PluginRegistry.js +43 -0
  105. package/dist/plugins/PluginRegistry.js.map +1 -0
  106. package/dist/plugins/SyncPluginEventDriven.d.ts +32 -0
  107. package/dist/plugins/SyncPluginEventDriven.d.ts.map +1 -0
  108. package/dist/plugins/SyncPluginEventDriven.js +609 -0
  109. package/dist/plugins/SyncPluginEventDriven.js.map +1 -0
  110. package/dist/plugins/SyncPluginPolling.d.ts +24 -0
  111. package/dist/plugins/SyncPluginPolling.d.ts.map +1 -0
  112. package/dist/plugins/SyncPluginPolling.js +266 -0
  113. package/dist/plugins/SyncPluginPolling.js.map +1 -0
  114. package/dist/plugins/gamification/GamificationPlugin.d.ts +26 -0
  115. package/dist/plugins/gamification/GamificationPlugin.d.ts.map +1 -0
  116. package/dist/plugins/gamification/GamificationPlugin.js +346 -0
  117. package/dist/plugins/gamification/GamificationPlugin.js.map +1 -0
  118. package/dist/plugins/gamification/__tests__/hysteresis.spec.d.ts +2 -0
  119. package/dist/plugins/gamification/__tests__/hysteresis.spec.d.ts.map +1 -0
  120. package/dist/plugins/gamification/__tests__/hysteresis.spec.js +22 -0
  121. package/dist/plugins/gamification/__tests__/hysteresis.spec.js.map +1 -0
  122. package/dist/plugins/gamification/index.d.ts +6 -0
  123. package/dist/plugins/gamification/index.d.ts.map +1 -0
  124. package/dist/plugins/gamification/index.js +14 -0
  125. package/dist/plugins/gamification/index.js.map +1 -0
  126. package/dist/plugins/gamification/levelsConfig.example.d.ts +17 -0
  127. package/dist/plugins/gamification/levelsConfig.example.d.ts.map +1 -0
  128. package/dist/plugins/gamification/levelsConfig.example.js +18 -0
  129. package/dist/plugins/gamification/levelsConfig.example.js.map +1 -0
  130. package/dist/plugins/gamification/levelsEngine.d.ts +19 -0
  131. package/dist/plugins/gamification/levelsEngine.d.ts.map +1 -0
  132. package/dist/plugins/gamification/levelsEngine.js +50 -0
  133. package/dist/plugins/gamification/levelsEngine.js.map +1 -0
  134. package/dist/plugins/gamification/streak.d.ts +7 -0
  135. package/dist/plugins/gamification/streak.d.ts.map +1 -0
  136. package/dist/plugins/gamification/streak.js +39 -0
  137. package/dist/plugins/gamification/streak.js.map +1 -0
  138. package/dist/plugins/index.d.ts +8 -0
  139. package/dist/plugins/index.d.ts.map +1 -0
  140. package/dist/plugins/index.js +28 -0
  141. package/dist/plugins/index.js.map +1 -0
  142. package/dist/plugins/interfaces.d.ts +56 -0
  143. package/dist/plugins/interfaces.d.ts.map +1 -0
  144. package/dist/plugins/interfaces.js +3 -0
  145. package/dist/plugins/interfaces.js.map +1 -0
  146. package/dist/reconciler/WindowScheduler.d.ts +29 -0
  147. package/dist/reconciler/WindowScheduler.d.ts.map +1 -0
  148. package/dist/reconciler/WindowScheduler.js +396 -0
  149. package/dist/reconciler/WindowScheduler.js.map +1 -0
  150. package/dist/services/MedicationsServiceCompat.d.ts +24 -0
  151. package/dist/services/MedicationsServiceCompat.d.ts.map +1 -0
  152. package/dist/services/MedicationsServiceCompat.js +98 -0
  153. package/dist/services/MedicationsServiceCompat.js.map +1 -0
  154. package/dist/utils/queue.d.ts +8 -0
  155. package/dist/utils/queue.d.ts.map +1 -0
  156. package/dist/utils/queue.js +28 -0
  157. package/dist/utils/queue.js.map +1 -0
  158. package/dist/utils/timeOffset.d.ts +4 -0
  159. package/dist/utils/timeOffset.d.ts.map +1 -0
  160. package/dist/utils/timeOffset.js +61 -0
  161. package/dist/utils/timeOffset.js.map +1 -0
  162. package/dist/utils/timestamp.d.ts +6 -0
  163. package/dist/utils/timestamp.d.ts.map +1 -0
  164. package/dist/utils/timestamp.js +29 -0
  165. package/dist/utils/timestamp.js.map +1 -0
  166. package/dist/utils/timezone.d.ts +4 -0
  167. package/dist/utils/timezone.d.ts.map +1 -0
  168. package/dist/utils/timezone.js +30 -0
  169. package/dist/utils/timezone.js.map +1 -0
  170. package/package.json +55 -0
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SQLiteAdapter = void 0;
37
+ const schema_base_1 = require("../../database/schema.base");
38
+ class SQLiteAdapter {
39
+ constructor(db) {
40
+ this.initialized = false;
41
+ this.db = db;
42
+ }
43
+ static async connect(options = {}) {
44
+ const { db, dbName = 'healthcare.db', autoApplySchema = true, extraMigrations = [] } = options;
45
+ let database = db || null;
46
+ if (!database) {
47
+ const sqliteAny = await Promise.resolve().then(() => __importStar(require('expo-sqlite')));
48
+ if (!sqliteAny || typeof sqliteAny.openDatabaseAsync !== 'function') {
49
+ throw new Error('expo-sqlite not available; pass an opened db via options.db');
50
+ }
51
+ database = await sqliteAny.openDatabaseAsync(dbName);
52
+ }
53
+ const adapter = new SQLiteAdapter(database);
54
+ if (autoApplySchema) {
55
+ await adapter.applySchema(schema_base_1.BASE_SCHEMA);
56
+ for (const script of extraMigrations) {
57
+ await adapter.applySchema(script);
58
+ }
59
+ }
60
+ adapter.initialized = true;
61
+ return adapter;
62
+ }
63
+ async applySchema(sql) {
64
+ try {
65
+ await this.db.execAsync(sql);
66
+ }
67
+ catch (error) {
68
+ throw wrapDbError('applySchema', sql, [], error);
69
+ }
70
+ }
71
+ async query(sql, params = []) {
72
+ try {
73
+ return await this.db.getAllAsync(sql, params);
74
+ }
75
+ catch (error) {
76
+ throw wrapDbError('query', sql, params, error);
77
+ }
78
+ }
79
+ async execute(sql, params = []) {
80
+ try {
81
+ const result = await this.db.runAsync(sql, params);
82
+ return { changes: Number(result?.changes || 0) };
83
+ }
84
+ catch (error) {
85
+ throw wrapDbError('execute', sql, params, error);
86
+ }
87
+ }
88
+ async transaction(callback) {
89
+ try {
90
+ await this.db.withTransactionAsync(async () => {
91
+ await callback();
92
+ });
93
+ }
94
+ catch (error) {
95
+ throw wrapDbError('transaction', '[callback]', [], error);
96
+ }
97
+ }
98
+ async getFirstAsync(sql, params = []) {
99
+ try {
100
+ return await this.db.getFirstAsync(sql, params);
101
+ }
102
+ catch (error) {
103
+ throw wrapDbError('getFirstAsync', sql, params, error);
104
+ }
105
+ }
106
+ async getAllAsync(sql, params = []) {
107
+ try {
108
+ return await this.db.getAllAsync(sql, params);
109
+ }
110
+ catch (error) {
111
+ throw wrapDbError('getAllAsync', sql, params, error);
112
+ }
113
+ }
114
+ async runAsync(sql, params = []) {
115
+ try {
116
+ const result = await this.db.runAsync(sql, params);
117
+ return { changes: Number(result?.changes || 0), lastInsertRowId: result?.lastInsertRowId };
118
+ }
119
+ catch (error) {
120
+ throw wrapDbError('runAsync', sql, params, error);
121
+ }
122
+ }
123
+ async close() {
124
+ if (typeof this.db.closeAsync === 'function') {
125
+ try {
126
+ await this.db.closeAsync();
127
+ }
128
+ catch { }
129
+ }
130
+ }
131
+ }
132
+ exports.SQLiteAdapter = SQLiteAdapter;
133
+ function wrapDbError(op, sql, params, error) {
134
+ const details = {
135
+ operation: op,
136
+ sql: shortSql(sql),
137
+ params: Array.isArray(params) ? params : [],
138
+ error: String(error && error.message || error)
139
+ };
140
+ return new Error(`SQLiteAdapter error: ${JSON.stringify(details)}`);
141
+ }
142
+ function shortSql(sql) {
143
+ const s = sql.replace(/\s+/g, ' ').trim();
144
+ return s.length > 220 ? s.slice(0, 220) + '…' : s;
145
+ }
146
+ exports.default = SQLiteAdapter;
147
+ //# sourceMappingURL=SQLiteAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SQLiteAdapter.js","sourceRoot":"","sources":["../../../src/database/adapters/SQLiteAdapter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,4DAAyD;AAqBzD,MAAa,aAAa;IAIxB,YAAoB,EAAsB;QAFlC,gBAAW,GAAG,KAAK,CAAC;QAG1B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAKD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,UAAgC,EAAE;QACrD,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,eAAe,EAAE,eAAe,GAAG,IAAI,EAAE,eAAe,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;QAE/F,IAAI,QAAQ,GAA8B,EAAE,IAAI,IAAI,CAAC;QAErD,IAAI,CAAC,QAAQ,EAAE,CAAC;YAGd,MAAM,SAAS,GAAQ,wDAAa,aAAa,GAAC,CAAC;YACnD,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,CAAC,iBAAiB,KAAK,UAAU,EAAE,CAAC;gBACpE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;YACjF,CAAC;YACD,QAAQ,GAAG,MAAM,SAAS,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,QAA8B,CAAC,CAAC;QAClE,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,OAAO,CAAC,WAAW,CAAC,yBAAW,CAAC,CAAC;YACvC,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;gBACrC,MAAM,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QACD,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;QAC3B,OAAO,OAAO,CAAC;IACjB,CAAC;IAGD,KAAK,CAAC,WAAW,CAAC,GAAW;QAC3B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,WAAW,CAAC,aAAa,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAU,GAAW,EAAE,SAAgB,EAAE;QAClD,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAI,GAAG,EAAE,MAAM,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,SAAgB,EAAE;QAC3C,IAAI,CAAC;YACH,MAAM,MAAM,GAAQ,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACxD,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,WAAW,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAA6B;QAC7C,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,EAAE,CAAC,oBAAoB,CAAC,KAAK,IAAI,EAAE;gBAC5C,MAAM,QAAQ,EAAE,CAAC;YACnB,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,WAAW,CAAC,aAAa,EAAE,YAAY,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAU,GAAW,EAAE,SAAgB,EAAE;QAC1D,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,EAAE,CAAC,aAAa,CAAI,GAAG,EAAE,MAAM,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,WAAW,CAAC,eAAe,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAU,GAAW,EAAE,SAAgB,EAAE;QACxD,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAI,GAAG,EAAE,MAAM,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,WAAW,CAAC,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAW,EAAE,SAAgB,EAAE;QAC5C,IAAI,CAAC;YACH,MAAM,MAAM,GAAQ,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACxD,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;QAC7F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,WAAW,CAAC,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;YAC7C,IAAI,CAAC;gBAAC,MAAM,IAAI,CAAC,EAAE,CAAC,UAAW,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QAC/C,CAAC;IACH,CAAC;CACF;AAvGD,sCAuGC;AAED,SAAS,WAAW,CAAC,EAAU,EAAE,GAAW,EAAE,MAAa,EAAE,KAAU;IACrE,MAAM,OAAO,GAAG;QACd,SAAS,EAAE,EAAE;QACb,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC;QAClB,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;QAC3C,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC;KAC/C,CAAC;IACF,OAAO,IAAI,KAAK,CAAC,wBAAwB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,OAAO,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,kBAAe,aAAa,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { CloudSyncProvider, ChangeSet, EntityName, SyncContext } from '../sync/interfaces';
2
+ type TableMap = Record<EntityName, string>;
3
+ export interface SupabaseAdapterConfig {
4
+ supabaseClient: any;
5
+ tableMap?: Partial<TableMap>;
6
+ pageSize?: number;
7
+ }
8
+ export declare class SupabaseAdapter implements CloudSyncProvider {
9
+ private readonly cfg;
10
+ private readonly tableMap;
11
+ private readonly pageSize;
12
+ constructor(cfg: SupabaseAdapterConfig);
13
+ pushChanges(changes: Partial<Record<EntityName, ChangeSet<any>>>, ctx?: SyncContext): Promise<number>;
14
+ pullChanges(sinceISO: string, ctx?: SyncContext): Promise<Partial<Record<EntityName, ChangeSet<any>>>>;
15
+ private upsertBatch;
16
+ private softDeleteBatch;
17
+ private fetchSince;
18
+ }
19
+ export {};
20
+ //# sourceMappingURL=SupabaseAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SupabaseAdapter.d.ts","sourceRoot":"","sources":["../../../src/database/adapters/SupabaseAdapter.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGhG,KAAK,QAAQ,GAAG,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AAE3C,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,GAAG,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAYD,qBAAa,eAAgB,YAAW,iBAAiB;IAI3C,OAAO,CAAC,QAAQ,CAAC,GAAG;IAHhC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEL,GAAG,EAAE,qBAAqB;IAKjD,WAAW,CACf,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EACpD,GAAG,CAAC,EAAE,WAAW,GAChB,OAAO,CAAC,MAAM,CAAC;IA+CZ,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,GAAG,CAAC,EAAE,WAAW,GAChB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAgKzC,WAAW;YA+EX,eAAe;YAYf,UAAU;CAoBzB"}
@@ -0,0 +1,310 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SupabaseAdapter = void 0;
4
+ const timestamp_1 = require("../../utils/timestamp");
5
+ const DEFAULT_TABLE_MAP = {
6
+ items: 'items',
7
+ plans: 'plans',
8
+ occurrences: 'occurrences',
9
+ events: 'events',
10
+ medications: 'medications',
11
+ adherence_daily: 'adherence_daily',
12
+ levels_state: 'levels_state'
13
+ };
14
+ class SupabaseAdapter {
15
+ constructor(cfg) {
16
+ this.cfg = cfg;
17
+ this.tableMap = { ...DEFAULT_TABLE_MAP, ...(cfg.tableMap || {}) };
18
+ this.pageSize = Math.max(50, Math.min(1000, cfg.pageSize || 200));
19
+ }
20
+ async pushChanges(changes, ctx) {
21
+ const userId = ctx?.userId;
22
+ if (!userId) {
23
+ throw new Error('[SupabaseAdapter] userId is required for push (RLS policy)');
24
+ }
25
+ let totalPushed = 0;
26
+ const entities = [
27
+ 'items',
28
+ 'plans',
29
+ 'occurrences',
30
+ 'events',
31
+ 'medications',
32
+ 'adherence_daily',
33
+ 'levels_state'
34
+ ];
35
+ for (const entity of entities) {
36
+ const cs = changes[entity];
37
+ if (!cs)
38
+ continue;
39
+ const table = this.tableMap[entity];
40
+ const upserts = [...(cs.inserts || []), ...(cs.updates || [])].map((row) => ({
41
+ ...row,
42
+ user_id: userId,
43
+ }));
44
+ if (upserts.length) {
45
+ const pushed = await this.upsertBatch(table, upserts);
46
+ totalPushed += pushed;
47
+ }
48
+ const dels = cs.deletes || [];
49
+ if (dels.length) {
50
+ await this.softDeleteBatch(table, dels.map(d => d.id));
51
+ totalPushed += dels.length;
52
+ }
53
+ }
54
+ return totalPushed;
55
+ }
56
+ async pullChanges(sinceISO, ctx) {
57
+ const userId = ctx?.userId;
58
+ if (!userId) {
59
+ throw new Error('[SupabaseAdapter] userId is required for pull (RLS policy)');
60
+ }
61
+ const out = {};
62
+ const entities = [
63
+ 'items',
64
+ 'plans',
65
+ 'occurrences',
66
+ 'events',
67
+ 'medications',
68
+ 'adherence_daily',
69
+ 'levels_state'
70
+ ];
71
+ for (const entity of entities) {
72
+ const table = this.tableMap[entity];
73
+ const rows = await this.fetchSince(table, sinceISO, userId);
74
+ out[entity] = {
75
+ inserts: rows,
76
+ updates: [],
77
+ deletes: [],
78
+ since: sinceISO
79
+ };
80
+ }
81
+ const itemsCs = out.items;
82
+ const plansCs = out.plans;
83
+ const occCs = out.occurrences;
84
+ const evCs = out.events;
85
+ const pulledItemIds = new Set((itemsCs?.inserts || []).map((r) => String(r.id)));
86
+ const pulledPlanIds = new Set((plansCs?.inserts || []).map((r) => String(r.id)));
87
+ const pulledOccIds = new Set((occCs?.inserts || []).map((r) => String(r.id)));
88
+ const pushUnique = (cs, rows, key) => {
89
+ const existing = new Set((cs.inserts || []).map((r) => String(r[key])));
90
+ for (const row of rows) {
91
+ const k = String(row[key]);
92
+ if (!existing.has(k))
93
+ cs.inserts.push(row);
94
+ }
95
+ };
96
+ if (evCs && evCs.inserts?.length) {
97
+ const missingOccForEvents = Array.from(new Set(evCs.inserts.map((e) => String(e.occurrence_id)))).filter((id) => !pulledOccIds.has(id));
98
+ if (missingOccForEvents.length) {
99
+ console.log(`☁️ [SupabaseAdapter] Prefetching ${missingOccForEvents.length} occurrences for events`);
100
+ const occTable = this.tableMap.occurrences;
101
+ let needOcc = null;
102
+ let error = null;
103
+ try {
104
+ const qb = this.cfg.supabaseClient.from(occTable).select('*').eq('user_id', userId);
105
+ if (typeof qb.in === 'function') {
106
+ const res = await qb.in('id', missingOccForEvents);
107
+ needOcc = res.data;
108
+ error = res.error;
109
+ }
110
+ else if (typeof qb.or === 'function') {
111
+ const orExpr = missingOccForEvents.map((k) => `id.eq.${k}`).join(',');
112
+ const res = await qb.or(orExpr);
113
+ needOcc = res.data;
114
+ error = res.error;
115
+ }
116
+ else {
117
+ const res = await this.cfg.supabaseClient.from(occTable).select('*').eq('user_id', userId);
118
+ needOcc = (res.data || []).filter((r) => missingOccForEvents.includes(String(r.id)));
119
+ error = res.error;
120
+ }
121
+ }
122
+ catch (e) {
123
+ error = e;
124
+ }
125
+ if (error)
126
+ throw error;
127
+ if (needOcc?.length) {
128
+ occCs.inserts.push(...needOcc);
129
+ needOcc.forEach((o) => pulledOccIds.add(String(o.id)));
130
+ console.log(`☁️ [SupabaseAdapter] Prefetched ${needOcc.length} occurrences`);
131
+ }
132
+ }
133
+ }
134
+ if (occCs && occCs.inserts?.length) {
135
+ const missingPlanIds = Array.from(new Set(occCs.inserts.map((o) => String(o.plan_id)))).filter((id) => !pulledPlanIds.has(id));
136
+ if (missingPlanIds.length) {
137
+ console.log(`☁️ [SupabaseAdapter] Prefetching ${missingPlanIds.length} plans for occurrences`);
138
+ const plansTable = this.tableMap.plans;
139
+ let needPlans = null;
140
+ let error = null;
141
+ try {
142
+ const qb = this.cfg.supabaseClient.from(plansTable).select('*').eq('user_id', userId);
143
+ if (typeof qb.in === 'function') {
144
+ const res = await qb.in('id', missingPlanIds);
145
+ needPlans = res.data;
146
+ error = res.error;
147
+ }
148
+ else if (typeof qb.or === 'function') {
149
+ const orExpr = missingPlanIds.map((k) => `id.eq.${k}`).join(',');
150
+ const res = await qb.or(orExpr);
151
+ needPlans = res.data;
152
+ error = res.error;
153
+ }
154
+ else {
155
+ const res = await this.cfg.supabaseClient.from(plansTable).select('*').eq('user_id', userId);
156
+ needPlans = (res.data || []).filter((r) => missingPlanIds.includes(String(r.id)));
157
+ error = res.error;
158
+ }
159
+ }
160
+ catch (e) {
161
+ error = e;
162
+ }
163
+ if (error)
164
+ throw error;
165
+ if (needPlans?.length) {
166
+ plansCs.inserts.push(...needPlans);
167
+ needPlans.forEach((p) => pulledPlanIds.add(String(p.id)));
168
+ console.log(`☁️ [SupabaseAdapter] Prefetched ${needPlans.length} plans`);
169
+ }
170
+ }
171
+ }
172
+ if (plansCs && plansCs.inserts?.length) {
173
+ const missingItemIds = Array.from(new Set(plansCs.inserts.map((p) => String(p.item_id)))).filter((id) => !pulledItemIds.has(id));
174
+ if (missingItemIds.length) {
175
+ console.log(`☁️ [SupabaseAdapter] Prefetching ${missingItemIds.length} items for plans`);
176
+ const itemsTable = this.tableMap.items;
177
+ let needItems = null;
178
+ let error = null;
179
+ try {
180
+ const qb = this.cfg.supabaseClient.from(itemsTable).select('*').eq('user_id', userId);
181
+ if (typeof qb.in === 'function') {
182
+ const res = await qb.in('id', missingItemIds);
183
+ needItems = res.data;
184
+ error = res.error;
185
+ }
186
+ else if (typeof qb.or === 'function') {
187
+ const orExpr = missingItemIds.map((k) => `id.eq.${k}`).join(',');
188
+ const res = await qb.or(orExpr);
189
+ needItems = res.data;
190
+ error = res.error;
191
+ }
192
+ else {
193
+ const res = await this.cfg.supabaseClient.from(itemsTable).select('*').eq('user_id', userId);
194
+ needItems = (res.data || []).filter((r) => missingItemIds.includes(String(r.id)));
195
+ error = res.error;
196
+ }
197
+ }
198
+ catch (e) {
199
+ error = e;
200
+ }
201
+ if (error)
202
+ throw error;
203
+ if (needItems?.length) {
204
+ itemsCs.inserts.push(...needItems);
205
+ needItems.forEach((it) => pulledItemIds.add(String(it.id)));
206
+ console.log(`☁️ [SupabaseAdapter] Prefetched ${needItems.length} items`);
207
+ }
208
+ }
209
+ }
210
+ return out;
211
+ }
212
+ async upsertBatch(table, rows) {
213
+ const client = this.cfg.supabaseClient;
214
+ let totalUpserted = 0;
215
+ const isGamificationTable = table === 'adherence_daily' || table === 'levels_state';
216
+ const pkField = isGamificationTable ? 'date_local' : 'id';
217
+ const conflictKey = isGamificationTable ? 'user_id,date_local' : 'id';
218
+ for (let i = 0; i < rows.length; i += this.pageSize) {
219
+ const slice = rows.slice(i, i + this.pageSize);
220
+ const keys = slice.map(r => r[pkField]);
221
+ let remoteRows = null;
222
+ let fetchError = null;
223
+ try {
224
+ const qb = client.from(table).select(`${pkField}, updated_at`);
225
+ if (typeof qb.in === 'function') {
226
+ const { data, error } = await qb.in(pkField, keys);
227
+ remoteRows = data;
228
+ fetchError = error;
229
+ }
230
+ else if (typeof qb.or === 'function') {
231
+ const orExpr = keys.map((k) => `${pkField}.eq.${k}`).join(',');
232
+ const { data, error } = await qb.or(orExpr);
233
+ remoteRows = data;
234
+ fetchError = error;
235
+ }
236
+ else {
237
+ const { data, error } = await client.from(table).select(`${pkField}, updated_at`);
238
+ remoteRows = (data || []).filter((r) => keys.includes(r[pkField]));
239
+ fetchError = error;
240
+ }
241
+ }
242
+ catch (e) {
243
+ fetchError = e;
244
+ }
245
+ if (fetchError)
246
+ throw fetchError;
247
+ const remoteMap = new Map();
248
+ (remoteRows || []).forEach((r) => {
249
+ remoteMap.set(r[pkField], r.updated_at);
250
+ });
251
+ const toUpsert = slice.filter(local => {
252
+ const remoteUpdatedAt = remoteMap.get(local[pkField]);
253
+ if (!remoteUpdatedAt)
254
+ return true;
255
+ const localIsNewer = (0, timestamp_1.isNewer)(local.updated_at, remoteUpdatedAt);
256
+ if (!localIsNewer) {
257
+ console.log(`⏭️ [SupabaseAdapter] Skipping ${table}/${local[pkField]}: local (${local.updated_at}) <= remote (${remoteUpdatedAt})`);
258
+ }
259
+ return localIsNewer;
260
+ });
261
+ if (toUpsert.length === 0) {
262
+ console.log(`📭 [SupabaseAdapter] No records to upsert for ${table} (all filtered by last-write-wins)`);
263
+ continue;
264
+ }
265
+ console.log(`📤 [SupabaseAdapter] Upserting ${toUpsert.length}/${slice.length} records to ${table} (last-write-wins)`);
266
+ const { error } = await client.from(table).upsert(toUpsert, { onConflict: conflictKey });
267
+ if (error)
268
+ throw error;
269
+ totalUpserted += toUpsert.length;
270
+ }
271
+ return totalUpserted;
272
+ }
273
+ async softDeleteBatch(table, ids) {
274
+ const client = this.cfg.supabaseClient;
275
+ for (let i = 0; i < ids.length; i += this.pageSize) {
276
+ const slice = ids.slice(i, i + this.pageSize);
277
+ const { error } = await client
278
+ .from(table)
279
+ .update({ deleted_at: new Date().toISOString() })
280
+ .in('id', slice);
281
+ if (error)
282
+ throw error;
283
+ }
284
+ }
285
+ async fetchSince(table, sinceISO, userId) {
286
+ const client = this.cfg.supabaseClient;
287
+ let page = 0;
288
+ const acc = [];
289
+ while (true) {
290
+ const { data, error } = await client
291
+ .from(table)
292
+ .select('*')
293
+ .eq('user_id', userId)
294
+ .gt('updated_at', sinceISO)
295
+ .order('updated_at', { ascending: true })
296
+ .range(page * this.pageSize, page * this.pageSize + this.pageSize - 1);
297
+ if (error)
298
+ throw error;
299
+ if (!data || data.length === 0)
300
+ break;
301
+ acc.push(...data);
302
+ if (data.length < this.pageSize)
303
+ break;
304
+ page++;
305
+ }
306
+ return acc;
307
+ }
308
+ }
309
+ exports.SupabaseAdapter = SupabaseAdapter;
310
+ //# sourceMappingURL=SupabaseAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SupabaseAdapter.js","sourceRoot":"","sources":["../../../src/database/adapters/SupabaseAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { StorageDriver } from '../core/types';
2
+ export interface ExtendedStorageDriver extends StorageDriver {
3
+ withTransactionAsync(callback: () => Promise<void>): Promise<void>;
4
+ execAsync?(sql: string): Promise<void>;
5
+ closeAsync?(): Promise<void>;
6
+ }
7
+ export interface DatabaseConfig {
8
+ dbName: string;
9
+ location?: string;
10
+ }
11
+ export interface QueryResult<T = any> {
12
+ rows: T[];
13
+ rowsAffected?: number;
14
+ lastInsertRowId?: number;
15
+ }
16
+ export interface ExecutionResult {
17
+ changes: number;
18
+ lastInsertRowId?: number;
19
+ }
20
+ //# sourceMappingURL=interfaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/database/interfaces.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAK9C,MAAM,WAAW,qBAAsB,SAAQ,aAAa;IAI1D,oBAAoB,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAKnE,SAAS,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAKvC,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAKD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAKD,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG;IAClC,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAKD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/database/interfaces.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import { StorageDriver, Event, EventAction, EventSource } from '../../core/types';
2
+ import { EventBus } from '../../core/EventBus';
3
+ export declare class EventsRepository {
4
+ private db;
5
+ private eventBus;
6
+ constructor(db: StorageDriver, eventBus: EventBus);
7
+ recordEvent(occurrenceId: string, action: EventAction, meta?: {
8
+ source?: EventSource;
9
+ note?: string;
10
+ payload?: Record<string, any>;
11
+ }): Promise<{
12
+ id: string;
13
+ occurrenceId: string;
14
+ action: EventAction;
15
+ }>;
16
+ recordEventsBatch(occurrenceIds: string[], action: EventAction, meta?: {
17
+ source?: EventSource;
18
+ note?: string;
19
+ payload?: Record<string, any>;
20
+ }): Promise<{
21
+ count: number;
22
+ }>;
23
+ findByOccurrence(occurrenceId: string): Promise<Event[]>;
24
+ cleanupOldEvents(daysOld?: number): Promise<number>;
25
+ }
26
+ //# sourceMappingURL=EventsRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventsRepository.d.ts","sourceRoot":"","sources":["../../../src/database/repositories/EventsRepository.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAElF,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,QAAQ;gBADR,EAAE,EAAE,aAAa,EACjB,QAAQ,EAAE,QAAQ;IAUtB,WAAW,CACf,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,WAAW,EACnB,IAAI,GAAE;QACJ,MAAM,CAAC,EAAE,WAAW,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAC1B,GACL,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAE,CAAC;IAmD/D,iBAAiB,CACrB,aAAa,EAAE,MAAM,EAAE,EACvB,MAAM,EAAE,WAAW,EACnB,IAAI,GAAE;QACJ,MAAM,CAAC,EAAE,WAAW,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAC1B,GACL,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IA2DvB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAkBxD,gBAAgB,CAAC,OAAO,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,CAAC;CAe9D"}