@iebh/tera-fy 2.3.9 → 2.3.11

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.3.11](https://github.com/IEBH/TERA-fy/compare/v2.3.10...v2.3.11) (2026-05-14)
4
+
5
+
6
+ ### fix
7
+
8
+ * Fix firebase peerDep ([319029e](https://github.com/IEBH/TERA-fy/commit/319029ef64798ece1fdc458270343477cc09ae54))
9
+
10
+ ## [2.3.10](https://github.com/IEBH/TERA-fy/compare/v2.3.9...v2.3.10) (2026-05-12)
11
+
12
+
13
+ ### refactor
14
+
15
+ * Tidied up Syncro data fetching + force named arguments when calling merger ([220eef3](https://github.com/IEBH/TERA-fy/commit/220eef3c0b7d12b0cae87bfc169dfa67c87858f4))
16
+
3
17
  ## [2.3.9](https://github.com/IEBH/TERA-fy/compare/v2.3.8...v2.3.9) (2026-05-09)
4
18
 
5
19
 
@@ -12,8 +12,8 @@ interface SyncroEntityConfig {
12
12
  relation?: string;
13
13
  }) => Promise<any>;
14
14
  flushState: (args: {
15
- HYPERDRIVE?: PostgresSql;
16
- supabasey: BoundSupabaseyFunction;
15
+ HYPERDRIVE: PostgresSql;
16
+ supabasey?: BoundSupabaseyFunction;
17
17
  state: any;
18
18
  id?: string;
19
19
  fsId?: string;
@@ -28,7 +28,7 @@ type SyncroConfig = Record<string, SyncroEntityConfig>;
28
28
  *
29
29
  * @property {String} singular The singular noun for the item
30
30
  * @property {Function} initState Function called to initialize state when Firestore has no existing document. Called as `({HYPERDRIVE:PostgresSql, supabasey:BoundSupabaseyFunction, id:String, relation?:string})` and expected to return the initial data object state
31
- * @property {Function} flushState Function called to flush state from Firebase to Supabase. Called the same as `initState` + `{state:Object}`
31
+ * @property {Function} flushState Function called to flush state from Firebase to Postgres. Called the same as `initState` + `{state:Object}`
32
32
  */
33
33
  declare const syncroConfig: SyncroConfig;
34
34
  export default syncroConfig;
@@ -10,46 +10,47 @@ import { nanoid } from 'nanoid';
10
10
  *
11
11
  * @property {String} singular The singular noun for the item
12
12
  * @property {Function} initState Function called to initialize state when Firestore has no existing document. Called as `({HYPERDRIVE:PostgresSql, supabasey:BoundSupabaseyFunction, id:String, relation?:string})` and expected to return the initial data object state
13
- * @property {Function} flushState Function called to flush state from Firebase to Supabase. Called the same as `initState` + `{state:Object}`
13
+ * @property {Function} flushState Function called to flush state from Firebase to Postgres. Called the same as `initState` + `{state:Object}`
14
14
  */
15
15
  const syncroConfig = {
16
16
  institutes: {
17
17
  singular: 'institute',
18
18
  async initState({ HYPERDRIVE, id }) {
19
- let institute = await HYPERDRIVE `
19
+ let rows = await HYPERDRIVE `
20
20
  SELECT data
21
21
  FROM institutes
22
22
  WHERE id = ${id}
23
23
  LIMIT 1
24
24
  `;
25
- if (institute.length > 0) {
26
- return institute[0].data; // institute is valid and already exists
25
+ if (rows.length > 0) {
26
+ return rows[0].data; // institute is valid and already exists
27
27
  }
28
28
  else {
29
29
  throw new Error(`Syncro institute "${id}" not found`);
30
30
  }
31
31
  },
32
- flushState({ supabasey, state, id }) {
33
- // FIXME: Better to reuse `env.HYPERDRIVE` instead of supabasey here in future
34
- return supabasey((supabase) => supabase.rpc('syncro_merge_data', {
35
- table_name: 'institutes',
36
- entity_id: id,
37
- new_data: state,
38
- }));
32
+ flushState({ HYPERDRIVE, state, id }) {
33
+ return HYPERDRIVE `
34
+ SELECT syncro_merge_data(
35
+ table_name => 'institutes',
36
+ entity_id => ${id}::UUID,
37
+ new_data => ${HYPERDRIVE.json(state)}::JSONB
38
+ )
39
+ `;
39
40
  },
40
41
  }, // }}}
41
42
  projects: {
42
43
  singular: 'project',
43
44
  async initState({ HYPERDRIVE, supabasey, id }) {
44
- let projects = await HYPERDRIVE `
45
+ let rows = await HYPERDRIVE `
45
46
  SELECT data
46
47
  FROM projects
47
48
  WHERE id = ${id}
48
49
  LIMIT 1
49
50
  `;
50
- if (projects.length == 0)
51
+ if (rows.length == 0)
51
52
  throw new Error(`Syncro project "${id}" not found`);
52
- const data = projects[0].data;
53
+ const data = rows[0].data;
53
54
  // MIGRATION - Move data.temp{} into Supabase files + add pointer to filename {{{
54
55
  if (data.temp // Project contains temp subkey
55
56
  && Object.values(data.temp).some((t) => typeof t == 'object') // Some of the temp keys are objects
@@ -88,13 +89,14 @@ const syncroConfig = {
88
89
  } // }}}
89
90
  return data;
90
91
  },
91
- flushState({ supabasey, state, fsId }) {
92
- // FIXME: Better to reuse `env.HYPERDRIVE` instead of supabasey here in future
93
- return supabasey((supabase) => supabase.rpc('syncro_merge_data', {
94
- table_name: 'projects',
95
- entity_id: fsId,
96
- new_data: state,
97
- }));
92
+ flushState({ HYPERDRIVE, state, fsId }) {
93
+ return HYPERDRIVE `
94
+ SELECT syncro_merge_data(
95
+ table_name => 'projects',
96
+ entity_id => ${fsId}::UUID,
97
+ new_data => ${HYPERDRIVE.json(state)}::JSONB
98
+ )
99
+ `;
98
100
  },
99
101
  }, // }}}
100
102
  project_libraries: {
@@ -154,26 +156,27 @@ const syncroConfig = {
154
156
  throw new Error(`Syncro test "${id}" not found`);
155
157
  }
156
158
  },
157
- flushState({ supabasey, state, fsId }) {
158
- // FIXME: Better to reuse `env.HYPERDRIVE` instead of supabasey here in future
159
- return supabasey((supabase) => supabase.rpc('syncro_merge_data', {
160
- table_name: 'test',
161
- entity_id: fsId,
162
- new_data: state,
163
- }));
159
+ flushState({ HYPERDRIVE, state, fsId }) {
160
+ return HYPERDRIVE `
161
+ SELECT syncro_merge_data(
162
+ table_name => 'test',
163
+ entity_id => ${fsId}::UUID,
164
+ new_data => ${HYPERDRIVE.json(state)}::JSONB
165
+ )
166
+ `;
164
167
  },
165
168
  }, // }}}
166
169
  users: {
167
170
  singular: 'user',
168
171
  async initState({ HYPERDRIVE, id }) {
169
- let user = await HYPERDRIVE `
172
+ let rows = await HYPERDRIVE `
170
173
  SELECT data
171
174
  FROM users
172
175
  WHERE id = ${id}
173
176
  LIMIT 1
174
177
  `;
175
- if (user.length > 0)
176
- return user[0].data; // User is valid and already exists
178
+ if (rows.length > 0)
179
+ return rows[0].data; // User is valid and already exists
177
180
  // User row doesn't already exist - this shouldn't happen if the user has correctly gone through the onboarding process
178
181
  // but... *shrugs*, who knows
179
182
  let newUser = await HYPERDRIVE `
@@ -194,13 +197,14 @@ const syncroConfig = {
194
197
  throw new Error(`Failed to create new user "${id}"`);
195
198
  return newUser[0].data; // Return back the data that eventually got created - allowing for database triggers, default field values etc.
196
199
  },
197
- flushState({ supabasey, state, fsId }) {
198
- // FIXME: Better to reuse `env.HYPERDRIVE` instead of supabasey here in future
199
- return supabasey((supabase) => supabase.rpc('syncro_merge_data', {
200
- table_name: 'users',
201
- entity_id: fsId,
202
- new_data: state,
203
- }));
200
+ flushState({ HYPERDRIVE, state, fsId }) {
201
+ return HYPERDRIVE `
202
+ SELECT syncro_merge_data(
203
+ table_name => 'users',
204
+ entity_id => ${fsId}::UUID,
205
+ new_data => ${HYPERDRIVE.json(state)}::JSONB
206
+ )
207
+ `;
204
208
  },
205
209
  }, // }}}
206
210
  };
@@ -1 +1 @@
1
- {"version":3,"file":"entities.js","sourceRoot":"","sources":["../../../lib/syncro/entities.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"entities.js","sourceRoot":"","sources":["../../../lib/syncro/entities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,287 @@
1
+ import { chunk } from 'lodash-es';
2
+ import { doc as FirestoreDocRef, getDoc as FirestoreGetDoc } from 'firebase/firestore';
3
+ import Syncro from './syncro.js';
4
+ import SyncroEntities from './entities.js';
5
+ /**
6
+ * @class SyncroKeyed
7
+ * TERA Isomorphic SyncroKeyed class
8
+ * Collate a single (potentially very large) single Syncro object by splitting it across multiple Syncros
9
+ * This makes the assumption that the Syncro content is a large object collection of objects - a keyed map collection
10
+ * The original impetus is to allow TERA citation libraries to be held in a Syncro object and flushed back to Supabase when editing has completed
11
+ */
12
+ export default class SyncroKeyed extends Syncro {
13
+ /**
14
+ * Config used by this instance to configure behaviour
15
+ *
16
+ * @type {Object}
17
+ * @property {Number} maxKeys The maximum number of keys a member can contain before needing to add a member
18
+ */
19
+ keyedConfig = {
20
+ maxKeys: 2,
21
+ };
22
+ /**
23
+ * Various storage about keyed path
24
+ */
25
+ keyedPath = {
26
+ getKey(path, index) {
27
+ return path + '_' + index;
28
+ },
29
+ };
30
+ /**
31
+ * Member Syncros which form part of this meta Syncro
32
+ *
33
+ * @type {Array<Syncro>}
34
+ */
35
+ members = [];
36
+ /**
37
+ * Instance constructor
38
+ *
39
+ * @param {String} path Mount path for the Syncro. Should be in the form `${ENTITY}::${ID}(::${RELATION})?_*` (must contain a '*' operator)
40
+ * @param {Object} [options] Additional instance setters (mutates instance directly)
41
+ */
42
+ constructor(path, options) {
43
+ super(path, options);
44
+ if (!/\*/.test(path))
45
+ throw new Error('SyncroKeyed paths must contain at least one asterisk as an object pagination indicator');
46
+ const { prefix, suffix } = /^(?<prefix>.+)\*(?<suffix>.*)$/.exec(path).groups;
47
+ this.keyedPath.getKey = (path, index) => `${prefix}${index}${suffix}`;
48
+ }
49
+ /**
50
+ * Destroy all Syncro members
51
+ *
52
+ * @returns {Promise} A promise which resolves when the operation has completed
53
+ */
54
+ async destroy() {
55
+ this.debug('Destroy!');
56
+ await Promise.all(this.members.map(member => member.destroy()));
57
+ this.members = [];
58
+ return []; // Return empty array cast to never[] to satisfy signature
59
+ }
60
+ /**
61
+ * Mount this SyncroKeyed instance
62
+ * i.e. Fetch all members and mount them locally creating a Proxy
63
+ *
64
+ * @returns {Promise<Syncro>} A promise which resolves as this SyncroKeyed instance when completed
65
+ */
66
+ mount() {
67
+ // Cast the result to the expected interface
68
+ const { entity, id, relation, fsCollection, fsId } = Syncro.pathSplit(this.path, { allowAsterisk: true });
69
+ return Promise.resolve()
70
+ .then(() => new Promise(resolve => {
71
+ this.members = []; // Reset member list
72
+ const seekMember = async (index) => {
73
+ const memberId = fsId.replace('*', '' + index);
74
+ this.debug('Seek keyedMember', fsCollection, '#', memberId);
75
+ const docRef = FirestoreDocRef(Syncro.firestore, fsCollection, memberId);
76
+ const doc = await FirestoreGetDoc(docRef);
77
+ if (doc.exists()) { // Found a matching entry
78
+ // Expand member lookup with the new member by its numeric index
79
+ await this.keyedMembersExpand(index);
80
+ // Queue up next member fetcher
81
+ setTimeout(() => seekMember(index + 1));
82
+ }
83
+ else { // Likely reached end of possible members
84
+ resolve();
85
+ }
86
+ };
87
+ seekMember(0); // Look for first member
88
+ }))
89
+ .then(async () => {
90
+ if (this.members.length > 0)
91
+ return;
92
+ // Create at least one member in the registry
93
+ await this.keyedMembersExpand(0);
94
+ this.debug('Populate initial SyncroKeyed state');
95
+ // Extract base data + add document and return new hook
96
+ const entityKey = entity;
97
+ if (!SyncroEntities[entityKey])
98
+ throw new Error(`Unknown Sync entity "${entity}"`);
99
+ // Go fetch the initial state object
100
+ const state = await SyncroEntities[entityKey].initState({
101
+ supabasey: Syncro.supabasey,
102
+ id, relation,
103
+ });
104
+ await this.keyedAssign(state);
105
+ })
106
+ .then(() => {
107
+ const reactive = this.getReactive(this.proxy());
108
+ // Assuming this.value should hold the reactive proxy
109
+ // If this.value is inherited and has a specific type, this might need adjustment
110
+ this.value = reactive.doc;
111
+ })
112
+ .then(() => this);
113
+ }
114
+ /**
115
+ * Return a Proxy which will map setter/getter actions to their correct member
116
+ *
117
+ * @returns {Proxy} A proxy of all combined members
118
+ */
119
+ proxy() {
120
+ return new Proxy(this, {
121
+ // Return the full list of keys
122
+ ownKeys(target) {
123
+ return target.members.flatMap(m => Object.keys(m.value || {}));
124
+ },
125
+ // Return if we have a lookup key
126
+ has(target, prop) {
127
+ // Ensure m.value exists before checking property
128
+ return target.members.some(m => m.value && prop in m.value);
129
+ },
130
+ // Scope through members until we get a hit on the key
131
+ get(target, prop) {
132
+ const targetMember = target.members.find(m => m.value && prop in m.value);
133
+ // Access value via targetMember.value if found
134
+ return targetMember ? targetMember.value[prop] : undefined;
135
+ },
136
+ // Set the member key if one already exists, otherwise overflow onto the next member
137
+ set(target, prop, value) {
138
+ const targetMember = target.members.find(m => m.value && prop in m.value);
139
+ if (targetMember && targetMember.value) {
140
+ targetMember.value[prop] = value;
141
+ }
142
+ else {
143
+ // Assuming keyedSet handles adding the value appropriately
144
+ target.keyedSet(prop, value); // Cast prop to string if keyedSet expects string
145
+ }
146
+ return true; // Proxy set must return boolean
147
+ },
148
+ // Remove a key
149
+ deleteProperty(target, prop) {
150
+ const targetMember = target.members.find(m => m.value && prop in m.value);
151
+ if (targetMember && targetMember.value) {
152
+ delete targetMember.value[prop];
153
+ return true; // Indicate success
154
+ }
155
+ return false; // Indicate key not found or failure
156
+ },
157
+ });
158
+ }
159
+ /**
160
+ * Flush all member states
161
+ *
162
+ * @param {Object} [options] Additional options to mutate behaviour
163
+ * @param {Boolean} [options.destroy=false] Instruct the server to also dispose of the Syncro state
164
+ *
165
+ * @returns {Promise} A promise which resolves when the operation has completed
166
+ */
167
+ async flush(options) {
168
+ const settings = {
169
+ destroy: false,
170
+ ...options,
171
+ };
172
+ await Promise.all(this.members.map(member => member.flush({
173
+ destroy: settings.destroy,
174
+ })));
175
+ if (settings.destroy)
176
+ await this.destroy();
177
+ return; // Return void to match signature
178
+ }
179
+ /**
180
+ * Set a given key against the next available member
181
+ * This will either pick the next available member with keys below `config.maxKeys` or extend the member array and append to it
182
+ *
183
+ * @param {String} key The key to set
184
+ * @param {*} value The value to set
185
+ *
186
+ * @returns {Promise<*>} A promise which resolves when the operation has completed with the set value
187
+ */
188
+ async keyedSet(key, value) {
189
+ const candidateMember = this.members.find(m => m.value && Object.keys(m.value).length < this.keyedConfig.maxKeys);
190
+ if (candidateMember?.value) {
191
+ candidateMember.value[key] = value;
192
+ return value;
193
+ }
194
+ else { // No candidate - need to expand then set
195
+ // Extend members
196
+ await this.keyedMembersExpand(); // Call without index to append
197
+ // Get the newly added member
198
+ // eslint-disable-next-line unicorn/prefer-at
199
+ const newMember = this.members[this.members.length - 1];
200
+ if (!newMember || !newMember.value) {
201
+ throw new Error('Failed to expand members or new member has no value object');
202
+ }
203
+ // Sanity check (check the new member's value)
204
+ if (Object.keys(newMember.value).length >= this.keyedConfig.maxKeys) {
205
+ throw new Error(`Need to append key "${key}" but newly added member (offset #${this.members.length - 1}) has size of ${Object.keys(newMember.value).length}, exceeding maxKeys ${this.keyedConfig.maxKeys}`);
206
+ }
207
+ newMember.value[key] = value;
208
+ return value;
209
+ }
210
+ }
211
+ /**
212
+ * Assign an entire in-memory object to members
213
+ * This can be thought of as the optimized equivalent of Object.assign()
214
+ * Use this when merging large objects as it can make optimizations
215
+ *
216
+ * @param {Object} state The value to merge
217
+ */
218
+ async keyedAssign(state) {
219
+ // Can we assume we have a blank state - this speeds up existing key checks significantly
220
+ // Ensure members[0] and its value exist
221
+ const isBlank = this.members.length === 1 && this.members[0]?.value && Object.keys(this.members[0].value).length === 0;
222
+ if (isBlank) {
223
+ const chunks = chunk(Object.entries(state), this.keyedConfig.maxKeys)
224
+ .map(chunk => Object.fromEntries(chunk));
225
+ await Promise.all(chunks.map(async (chunk, chunkIndex) => {
226
+ this.debug(`Assign chunk #${chunkIndex} content`, { chunk });
227
+ // Create chunk document if its missing
228
+ if (!this.members[chunkIndex])
229
+ await this.keyedMembersExpand(chunkIndex);
230
+ // Ensure the member exists and has setFirestoreState method
231
+ const member = this.members[chunkIndex];
232
+ if (member && typeof member.setFirestoreState === 'function') {
233
+ // Populate its state - Cast to any temporarily if setFirestoreState is not public/recognized
234
+ await member.setFirestoreState(chunk, { method: 'set' });
235
+ }
236
+ else {
237
+ console.warn(`Member at index ${chunkIndex} is missing or does not have setFirestoreState`);
238
+ }
239
+ }));
240
+ }
241
+ else { // Non-blank - call keyedSet() on each key of state, merging slowly
242
+ // Replace Array.fromAsync with a standard loop
243
+ for (const [key, val] of Object.entries(state)) {
244
+ await this.keyedSet(key, val);
245
+ }
246
+ }
247
+ }
248
+ /**
249
+ * Extend the member pool by one member
250
+ *
251
+ * @param {Number} [index] The index to use when expanding, if omitted the next index offset is used
252
+ * @returns {Promise} A promise which resolves when the operation has completed
253
+ */
254
+ async keyedMembersExpand(index) {
255
+ index = index ?? this.members.length; // Use provided index or next available slot
256
+ if (this.members[index]) {
257
+ // If member already exists (e.g., during initial seek), just ensure it's mounted.
258
+ // If it was called intentionally with an existing index, maybe log a warning or skip.
259
+ this.debug(`keyedMembersExpand called for existing index ${index}, ensuring mounted.`);
260
+ if (!this.members[index].value) { // If it exists but isn't mounted somehow
261
+ await this.members[index].mount({ initialState: {} });
262
+ }
263
+ return; // Exit if member already exists
264
+ }
265
+ const syncroPath = this.keyedPath.getKey(this.path, index);
266
+ // Pass empty options object {} or specify allowAsterisk: false if needed
267
+ const { fsCollection, fsId } = Syncro.pathSplit(syncroPath, {});
268
+ this.debug('Expand SyncroKeyed size to index=', index);
269
+ // Create a new Syncro member, inheriteing some details from this parent item
270
+ const syncro = new Syncro(`${fsCollection}::${fsId}`, {
271
+ debug: this.debug,
272
+ getReactive: this.getReactive,
273
+ });
274
+ // Wait for mount to complete
275
+ await syncro.mount({
276
+ initialState: {}, // Force initial state to empty object so we don't get stuck in a loop
277
+ });
278
+ // Insert at the correct index if specified, otherwise push
279
+ if (index < this.members.length) {
280
+ this.members.splice(index, 0, syncro);
281
+ }
282
+ else {
283
+ this.members.push(syncro);
284
+ }
285
+ }
286
+ }
287
+ //# sourceMappingURL=keyed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyed.js","sourceRoot":"","sources":["../../../lib/syncro/keyed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAC,MAAM,WAAW,CAAC;AAChC,OAAO,EAAC,GAAG,IAAI,eAAe,EAAE,MAAM,IAAI,eAAe,EAAC,MAAM,oBAAoB,CAAC;AACrF,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,cAAc,MAAM,eAAe,CAAC;AAgB3C;;;;;;EAME;AACF,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,MAAM;IAE9C;;;;;MAKE;IACF,WAAW,GAAG;QACb,OAAO,EAAE,CAAC;KACV,CAAC;IAGF;;MAEE;IACF,SAAS,GAAG;QACX,MAAM,CAAC,IAAY,EAAE,KAAa;YACjC,OAAO,IAAI,GAAG,GAAG,GAAG,KAAK,CAAC;QAC3B,CAAC;KACD,CAAC;IAGF;;;;MAIE;IACF,OAAO,GAAa,EAAE,CAAC;IAGvB;;;;;MAKE;IACF,YAAY,IAAY,EAAE,OAA6B;QACtD,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAErB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC,CAAC;QAEhI,MAAM,EAAC,MAAM,EAAE,MAAM,EAAC,GAAG,gCAAgC,CAAC,IAAI,CAAC,IAAI,CAAE,CAAC,MAAO,CAAC;QAC9E,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,IAAY,EAAE,KAAa,EAAU,EAAE,CAAC,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,EAAE,CAAC;IAC/F,CAAC;IAGD;;;;MAIE;IACF,KAAK,CAAC,OAAO;QACZ,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACvB,MAAM,OAAO,CAAC,GAAG,CAChB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CACzB,MAAM,CAAC,OAAO,EAAE,CAChB,CACD,CAAC;QAEF,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,OAAO,EAAa,CAAC,CAAC,0DAA0D;IACjF,CAAC;IAGD;;;;;MAKE;IACF,KAAK;QACJ,4CAA4C;QAC5C,MAAM,EAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAC,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,EAAC,aAAa,EAAE,IAAI,EAAC,CAAoB,CAAC;QAEzH,OAAO,OAAO,CAAC,OAAO,EAAE;aACtB,IAAI,CAAC,GAAE,EAAE,CAAC,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;YACtC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,oBAAoB;YAEvC,MAAM,UAAU,GAAG,KAAK,EAAE,KAAa,EAAE,EAAE;gBAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAC,KAAK,CAAC,CAAC;gBAC7C,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAE5D,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;gBAEzE,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;gBAC1C,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,yBAAyB;oBAC5C,gEAAgE;oBAChE,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;oBAErC,+BAA+B;oBAC/B,UAAU,CAAC,GAAE,EAAE,CAAC,UAAU,CAAC,KAAK,GAAC,CAAC,CAAC,CAAC,CAAC;gBACtC,CAAC;qBAAM,CAAC,CAAC,yCAAyC;oBACjD,OAAO,EAAE,CAAC;gBACX,CAAC;YACF,CAAC,CAAC;YAEF,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,wBAAwB;QACxC,CAAC,CAAC,CAAC;aACF,IAAI,CAAC,KAAK,IAAG,EAAE;YACf,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO;YAEpC,6CAA6C;YAC7C,MAAM,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;YAEjC,IAAI,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;YAEjD,uDAAuD;YACvD,MAAM,SAAS,GAAG,MAAM,CAAC;YACzB,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,GAAG,CAAC,CAAC;YAEnF,oCAAoC;YACpC,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC;gBACvD,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,EAAE,EAAE,QAAQ;aACZ,CAAC,CAAC;YAEH,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC,CAAC;aACD,IAAI,CAAC,GAAE,EAAE;YACT,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAChD,qDAAqD;YACrD,iFAAiF;YACjF,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC;QAC3B,CAAC,CAAC;aACD,IAAI,CAAC,GAAE,EAAE,CAAC,IAAI,CAAC,CAAA;IAClB,CAAC;IAGD;;;;MAIE;IACF,KAAK;QACJ,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE;YACtB,+BAA+B;YAC/B,OAAO,CAAC,MAAmB;gBAC1B,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;YAChE,CAAC;YAED,iCAAiC;YACjC,GAAG,CAAC,MAAmB,EAAE,IAAqB;gBAC7C,iDAAiD;gBACjD,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;YAC7D,CAAC;YAED,sDAAsD;YACtD,GAAG,CAAC,MAAmB,EAAE,IAAqB;gBAC7C,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;gBAC1E,+CAA+C;gBAC/C,OAAO,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC5D,CAAC;YAED,oFAAoF;YACpF,GAAG,CAAC,MAAmB,EAAE,IAAqB,EAAE,KAAU;gBACzD,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;gBAC1E,IAAI,YAAY,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;oBACxC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;gBAClC,CAAC;qBAAM,CAAC;oBACP,2DAA2D;oBAC3D,MAAM,CAAC,QAAQ,CAAC,IAAc,EAAE,KAAK,CAAC,CAAC,CAAC,iDAAiD;gBAC1F,CAAC;gBACD,OAAO,IAAI,CAAC,CAAC,gCAAgC;YAC9C,CAAC;YAED,eAAe;YACf,cAAc,CAAC,MAAmB,EAAE,IAAqB;gBACxD,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;gBAC1E,IAAI,YAAY,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;oBACxC,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAChC,OAAO,IAAI,CAAC,CAAC,mBAAmB;gBACjC,CAAC;gBACD,OAAO,KAAK,CAAC,CAAC,oCAAoC;YACnD,CAAC;SACD,CAAC,CAAC;IACJ,CAAC;IAGD;;;;;;;MAOE;IACF,KAAK,CAAC,KAAK,CAAC,OAAsB;QACjC,MAAM,QAAQ,GAAiB;YAC9B,OAAO,EAAE,KAAK;YACd,GAAG,OAAO;SACV,CAAC;QAEF,MAAM,OAAO,CAAC,GAAG,CAChB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CACzB,MAAM,CAAC,KAAK,CAAC;YACZ,OAAO,EAAE,QAAQ,CAAC,OAAO;SACzB,CAAC,CACF,CACD,CAAC;QAEF,IAAI,QAAQ,CAAC,OAAO;YAAE,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAC3C,OAAO,CAAC,iCAAiC;IAC1C,CAAC;IAGD;;;;;;;;MAQE;IACF,KAAK,CAAC,QAAQ,CAAC,GAAW,EAAE,KAAU;QACrC,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAClH,IAAI,eAAe,EAAE,KAAK,EAAE,CAAC;YAC5B,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACnC,OAAO,KAAK,CAAC;QACd,CAAC;aAAM,CAAC,CAAC,yCAAyC;YACjD,iBAAiB;YACjB,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,+BAA+B;YAEhE,6BAA6B;YAC7B,6CAA6C;YAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACxD,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;gBACpC,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;YAC/E,CAAC;YAED,8CAA8C;YAC9C,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;gBACrE,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,qCAAqC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAC,CAAC,iBAAiB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,uBAAuB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5M,CAAC;YAED,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAC7B,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAGD;;;;;;MAME;IACF,KAAK,CAAC,WAAW,CAAC,KAA0B;QAC3C,yFAAyF;QACzF,wCAAwC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;QAEvH,IAAI,OAAO,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;iBACnE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YAE1C,MAAM,OAAO,CAAC,GAAG,CAChB,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;gBACtC,IAAI,CAAC,KAAK,CAAC,iBAAiB,UAAU,UAAU,EAAE,EAAC,KAAK,EAAC,CAAC,CAAC;gBAE3D,uCAAuC;gBACvC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;oBAAE,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;gBAEzE,4DAA4D;gBAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACxC,IAAI,MAAM,IAAI,OAAQ,MAAc,CAAC,iBAAiB,KAAK,UAAU,EAAE,CAAC;oBACnF,6FAA6F;oBAC7F,MAAO,MAAc,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAC,MAAM,EAAE,KAAK,EAAC,CAAC,CAAC;gBACrD,CAAC;qBAAM,CAAC;oBACJ,OAAO,CAAC,IAAI,CAAC,mBAAmB,UAAU,gDAAgD,CAAC,CAAC;gBAChG,CAAC;YACjB,CAAC,CAAC,CACF,CAAC;QAEH,CAAC;aAAM,CAAC,CAAC,mEAAmE;YAC3E,+CAA+C;YACtC,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7C,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAClC,CAAC;QACX,CAAC;IACF,CAAC;IAGD;;;;;MAKE;IACF,KAAK,CAAC,kBAAkB,CAAC,KAAc;QACtC,KAAK,GAAG,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,4CAA4C;QAClF,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChB,kFAAkF;YAClF,sFAAsF;YACtF,IAAI,CAAC,KAAK,CAAC,gDAAgD,KAAK,qBAAqB,CAAC,CAAC;YACvF,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,yCAAyC;gBACtE,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;YAC3D,CAAC;YACD,OAAO,CAAC,gCAAgC;QAC5C,CAAC;QAEP,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3D,yEAAyE;QACzE,MAAM,EAAC,YAAY,EAAE,IAAI,EAAC,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,CAAoB,CAAC;QACjF,IAAI,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;QAEvD,6EAA6E;QAC7E,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG,YAAY,KAAK,IAAI,EAAE,EAAE;YACrD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC7B,CAAC,CAAC;QAEH,6BAA6B;QAC7B,MAAM,MAAM,CAAC,KAAK,CAAC;YAClB,YAAY,EAAE,EAAE,EAAE,sEAAsE;SACxF,CAAC,CAAC;QAEH,2DAA2D;QACrD,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACV,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;IACR,CAAC;CAED"}