@modelprofile.com/flexharness 11.3.0 → 12.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/classes.flexharness.core.d.ts +4 -0
  3. package/dist_ts/classes.flexharness.core.js +69 -25
  4. package/dist_ts/classes.flexharness.imports.js +4 -3
  5. package/dist_ts/classes.flexharness.reversions.d.ts +7 -1
  6. package/dist_ts/classes.flexharness.reversions.js +43 -29
  7. package/dist_ts/classes.flexharness.sessions.js +2 -6
  8. package/dist_ts/classes.stores.js +20 -18
  9. package/dist_ts/index.d.ts +1 -0
  10. package/dist_ts/index.js +2 -1
  11. package/dist_ts/interfaces.d.ts +24 -2
  12. package/dist_ts/interfaces.flexharness.d.ts +8 -1
  13. package/dist_ts/interfaces.js +1 -1
  14. package/dist_ts/plugins.d.ts +3 -3
  15. package/dist_ts/plugins.js +3 -3
  16. package/dist_ts/utils.projectionchange.d.ts +34 -0
  17. package/dist_ts/utils.projectionchange.js +135 -0
  18. package/dist_ts/utils.storecodecs.d.ts +10 -3
  19. package/dist_ts/utils.storecodecs.js +29 -4
  20. package/dist_ts/utils.storerules.d.ts +1 -1
  21. package/dist_ts/utils.storerules.js +1 -1
  22. package/dist_ts_migration/v3_legacyflexharness.js +6 -5
  23. package/dist_ts_stores_nosqldb/classes.nosqldbstores.d.ts +5 -4
  24. package/dist_ts_stores_nosqldb/classes.nosqldbstores.js +56 -54
  25. package/dist_ts_stores_nosqldb/classes.recordstore.d.ts +176 -19
  26. package/dist_ts_stores_nosqldb/classes.recordstore.js +392 -67
  27. package/dist_ts_stores_nosqldb/index.d.ts +1 -1
  28. package/dist_ts_stores_nosqldb/index.js +2 -2
  29. package/dist_ts_stores_nosqldb/plugins.d.ts +1 -1
  30. package/dist_ts_stores_nosqldb/plugins.js +1 -1
  31. package/dist_ts_stores_testing/contract.d.ts +33 -0
  32. package/dist_ts_stores_testing/contract.js +566 -0
  33. package/dist_ts_stores_testing/fixtures.d.ts +20 -0
  34. package/dist_ts_stores_testing/fixtures.js +112 -0
  35. package/dist_ts_stores_testing/index.d.ts +2 -0
  36. package/dist_ts_stores_testing/index.js +3 -0
  37. package/dist_ts_stores_testing/plugins.d.ts +5 -0
  38. package/dist_ts_stores_testing/plugins.js +7 -0
  39. package/package.json +9 -3
  40. package/readme.md +6 -3
  41. package/ts/00_commitinfo_data.ts +1 -1
  42. package/ts/classes.flexharness.core.ts +74 -24
  43. package/ts/classes.flexharness.imports.ts +3 -2
  44. package/ts/classes.flexharness.reversions.ts +53 -28
  45. package/ts/classes.flexharness.sessions.ts +2 -5
  46. package/ts/classes.stores.ts +40 -37
  47. package/ts/index.ts +5 -0
  48. package/ts/interfaces.flexharness.ts +8 -1
  49. package/ts/interfaces.ts +27 -2
  50. package/ts/plugins.ts +12 -7
  51. package/ts/readme.md +6 -3
  52. package/ts/utils.projectionchange.ts +190 -0
  53. package/ts/utils.storecodecs.ts +42 -7
  54. package/ts/utils.storerules.ts +2 -2
  55. package/ts_migration/v3_legacyflexharness.ts +11 -6
  56. package/ts_stores_nosqldb/classes.nosqldbstores.ts +79 -71
  57. package/ts_stores_nosqldb/classes.recordstore.ts +491 -66
  58. package/ts_stores_nosqldb/index.ts +1 -0
  59. package/ts_stores_nosqldb/plugins.ts +4 -3
  60. package/ts_stores_nosqldb/readme.md +6 -2
  61. package/ts_stores_testing/contract.ts +776 -0
  62. package/ts_stores_testing/fixtures.ts +127 -0
  63. package/ts_stores_testing/index.ts +17 -0
  64. package/ts_stores_testing/plugins.ts +20 -0
  65. package/ts_stores_testing/readme.md +62 -0
@@ -3,12 +3,23 @@ import { FlexHarnessStoreCommitUncertainError, FlexHarnessStoreFormatError, Flex
3
3
  export const FLEX_RECORD_COLLECTION = 'flexharness_records';
4
4
  export const FLEX_CHUNK_COLLECTION = 'flexharness_chunks';
5
5
  export const FLEX_NAMESPACE_COLLECTION = 'flexharness_namespaces';
6
+ export const FLEX_CHANGE_COLLECTION = 'flexharness_changes';
6
7
  /**
7
8
  * UTF-16 code units a record holds inline, and the size of each chunk of a longer payload. A
8
9
  * chunk stays below 3 MiB of UTF-8, far under the 16 MiB document limit NoSQLDB and MongoDB
9
10
  * enforce, so a record and each of its chunks always fit one document.
10
11
  */
11
12
  export const FLEX_RECORD_CHUNK_CODE_UNITS = 1024 * 1024;
13
+ /**
14
+ * UTF-16 code units the changes of a log may reach however short its base, so a young record
15
+ * keeps its changes instead of compacting on nearly every save.
16
+ */
17
+ export const FLEX_RECORD_MIN_LOG_CODE_UNITS = 64 * 1024;
18
+ /**
19
+ * UTF-16 code units of changes a log record's head holds inline. The save that would exceed it
20
+ * moves them, with its own change, into one change page.
21
+ */
22
+ export const FLEX_RECORD_INLINE_CHANGE_CODE_UNITS = 16 * 1024;
12
23
  const mutationAttempts = 8;
13
24
  const mutationBackoffBaseMs = 5;
14
25
  const mutationBackoffMaxMs = 200;
@@ -18,7 +29,13 @@ const defaultOperationTimeoutMs = 30_000;
18
29
  * The head of one record. A payload up to one chunk is stored inline; a longer one lives in
19
30
  * immutable chunks named by `blobId`. `writeToken` changes on every committed write and is the
20
31
  * compare-and-swap fence. A head without payload or blob is a placeholder that reserves the
21
- * record for a chunked first write; it reads as absent.
32
+ * record for a first write longer than one chunk; it reads as absent.
33
+ *
34
+ * A log record's payload is a base, `{ base }`, always in chunks, and its head names a log,
35
+ * `logId`: the `changeCount` changes saved since the base. The head holds the latest of them in
36
+ * `recentChanges`; the earlier ones fill change pages, chained from `lastPageId` back to the log.
37
+ * A head without `logId`, also one an earlier version wrote, holds its value whole. A write that
38
+ * replaces a log names it `retiredLogId`, and the next write deletes its pages.
22
39
  */
23
40
  export class FlexRecordDocument extends plugins.SmartDataDbDoc {
24
41
  recordId;
@@ -34,6 +51,21 @@ export class FlexRecordDocument extends plugins.SmartDataDbDoc {
34
51
  /** Set before the first chunk of this record is written; the record's writes then sweep. */
35
52
  chunked;
36
53
  sweepCount;
54
+ /** The write token of the base's commit, which names the log; null without a log. */
55
+ logId;
56
+ changeCount;
57
+ /** The log's changes saved since its last page, oldest first; empty without a log. */
58
+ recentChanges;
59
+ /** The log's latest change page; null while the log has none. */
60
+ lastPageId;
61
+ /**
62
+ * UTF-16 code units of the log's changes and of its base; a log outgrows neither its base nor,
63
+ * for a shorter base, `FLEX_RECORD_MIN_LOG_CODE_UNITS`.
64
+ */
65
+ changeLength;
66
+ baseLength;
67
+ /** The log the last write replaced, whose pages the next write deletes; null without one. */
68
+ retiredLogId;
37
69
  }
38
70
  /** One immutable piece of a chunked payload, written against the head token it will replace. */
39
71
  export class FlexChunkDocument extends plugins.SmartDataDbDoc {
@@ -47,6 +79,20 @@ export class FlexChunkDocument extends plugins.SmartDataDbDoc {
47
79
  index;
48
80
  data;
49
81
  }
82
+ /**
83
+ * One immutable page of a log record's changes, oldest first, written before the head swap that
84
+ * commits it. `previousId` names the log's previous page, or the log itself for its first page.
85
+ */
86
+ export class FlexChangePageDocument extends plugins.SmartDataDbDoc {
87
+ pageId;
88
+ recordId;
89
+ domain;
90
+ ownerKey;
91
+ namespaceKey;
92
+ logId;
93
+ previousId;
94
+ changes;
95
+ }
50
96
  /**
51
97
  * One storage namespace. Every record creation in the namespace increments `creationCount` in
52
98
  * its transaction, so a concurrent fenced purge, which sets `fenced`, conflicts with it. A fenced
@@ -57,11 +103,14 @@ export class FlexNamespaceDocument extends plugins.SmartDataDbDoc {
57
103
  fenced;
58
104
  creationCount;
59
105
  }
60
- function bindModels(db) {
106
+ /** Binds the record, chunk, change page and namespace models to a database. */
107
+ export function bindFlexRecordModels(db) {
61
108
  class BoundRecord extends FlexRecordDocument {
62
109
  }
63
110
  class BoundChunk extends FlexChunkDocument {
64
111
  }
112
+ class BoundChangePage extends FlexChangePageDocument {
113
+ }
65
114
  class BoundNamespace extends FlexNamespaceDocument {
66
115
  }
67
116
  plugins.defineCollectionModel(BoundRecord, db, {
@@ -79,8 +128,15 @@ function bindModels(db) {
79
128
  'payloadSha256',
80
129
  'chunked',
81
130
  'sweepCount',
131
+ 'logId',
132
+ 'changeCount',
133
+ 'recentChanges',
134
+ 'lastPageId',
135
+ 'changeLength',
136
+ 'baseLength',
137
+ 'retiredLogId',
82
138
  ],
83
- numericFields: ['revision', 'chunkCount', 'sweepCount'],
139
+ numericFields: ['revision', 'chunkCount', 'sweepCount', 'changeCount', 'changeLength', 'baseLength'],
84
140
  identityFields: ['recordId'],
85
141
  indexes: [
86
142
  { name: 'flexharness_record_id', key: { recordId: 1 }, options: { unique: true } },
@@ -111,6 +167,26 @@ function bindModels(db) {
111
167
  { name: 'flexharness_chunk_namespace', key: { namespaceKey: 1, domain: 1 } },
112
168
  ],
113
169
  });
170
+ plugins.defineCollectionModel(BoundChangePage, db, {
171
+ collectionName: FLEX_CHANGE_COLLECTION,
172
+ persistedFields: [
173
+ 'pageId',
174
+ 'recordId',
175
+ 'domain',
176
+ 'ownerKey',
177
+ 'namespaceKey',
178
+ 'logId',
179
+ 'previousId',
180
+ 'changes',
181
+ ],
182
+ identityFields: ['pageId'],
183
+ indexes: [
184
+ { name: 'flexharness_change_page', key: { pageId: 1 }, options: { unique: true } },
185
+ { name: 'flexharness_change_log', key: { recordId: 1, logId: 1 } },
186
+ { name: 'flexharness_change_owner', key: { ownerKey: 1, domain: 1 } },
187
+ { name: 'flexharness_change_namespace', key: { namespaceKey: 1, domain: 1 } },
188
+ ],
189
+ });
114
190
  plugins.defineCollectionModel(BoundNamespace, db, {
115
191
  collectionName: FLEX_NAMESPACE_COLLECTION,
116
192
  persistedFields: ['namespaceKey', 'fenced', 'creationCount'],
@@ -120,7 +196,7 @@ function bindModels(db) {
120
196
  { name: 'flexharness_namespace_key', key: { namespaceKey: 1 }, options: { unique: true } },
121
197
  ],
122
198
  });
123
- return { records: BoundRecord, chunks: BoundChunk, namespaces: BoundNamespace };
199
+ return { records: BoundRecord, chunks: BoundChunk, changes: BoundChangePage, namespaces: BoundNamespace };
124
200
  }
125
201
  const digest = (value) => plugins.crypto.createHash('sha256').update(value, 'utf8').digest('hex');
126
202
  function splitPayload(text) {
@@ -164,12 +240,22 @@ function isUniqueConflict(error) {
164
240
  * replaced or abandoned payload are swept in a transaction that also touches the head, so a
165
241
  * concurrent deletion or writer can never lose chunks its head references. A head is created in
166
242
  * a transaction that checks its namespace document, so a fenced namespace gains no record.
243
+ *
244
+ * A log record takes a change in the head swap itself, which appends it to the head's recent
245
+ * changes, so a save costs the change rather than the record and reads and writes only the head.
246
+ * The save that would grow the recent changes past `FLEX_RECORD_INLINE_CHANGE_CODE_UNITS` writes
247
+ * them, with its own change, as one change page first and empties them in its swap. The base lives
248
+ * in chunks whatever its length, so the head the swap rewrites holds no payload. Once the changes
249
+ * would outgrow the base, or a shorter base's minimum room, a save compacts the record instead: it
250
+ * writes the base with every change applied, checked in full.
251
+ * The change pages of earlier logs are swept like chunks.
167
252
  */
168
253
  export class FlexRecordStore {
169
254
  db;
170
255
  timeoutMs;
171
256
  records;
172
257
  chunks;
258
+ changes;
173
259
  namespaces;
174
260
  preparation;
175
261
  constructor(options) {
@@ -179,7 +265,12 @@ export class FlexRecordStore {
179
265
  }
180
266
  this.db = options.db;
181
267
  this.timeoutMs = timeoutMs;
182
- ({ records: this.records, chunks: this.chunks, namespaces: this.namespaces } = bindModels(options.db));
268
+ ({
269
+ records: this.records,
270
+ chunks: this.chunks,
271
+ changes: this.changes,
272
+ namespaces: this.namespaces,
273
+ } = bindFlexRecordModels(options.db));
183
274
  }
184
275
  /** Creates or verifies the collections and their indexes once; a failed attempt is retried. */
185
276
  prepare() {
@@ -200,6 +291,7 @@ export class FlexRecordStore {
200
291
  const options = { mode: 'ensureCompatible', timeoutMs: this.timeoutMs };
201
292
  await this.records.prepareCollection(options);
202
293
  await this.chunks.prepareCollection(options);
294
+ await this.changes.prepareCollection(options);
203
295
  await this.namespaces.prepareCollection(options);
204
296
  }
205
297
  resolve(address) {
@@ -220,41 +312,101 @@ export class FlexRecordStore {
220
312
  async read(address, validate) {
221
313
  await this.prepare();
222
314
  const resolved = this.resolve(address);
223
- return this.parse(resolved, await this.readHead(resolved), validate);
315
+ const head = await this.readHead(resolved);
316
+ return head.text === undefined ? undefined : this.parse(resolved, head.text, validate);
224
317
  }
225
- async mutate(address, mutation) {
318
+ /** Reads a log record: its base with every change applied, checked in full. */
319
+ async readLog(address, log) {
320
+ await this.prepare();
321
+ return (await this.loadLog(this.resolve(address), log)).value;
322
+ }
323
+ /**
324
+ * Saves a change to a log record while its head holds the expected revision. Only the head is
325
+ * read when the record takes the change; a compaction loads the record and checks the result in
326
+ * full. A change the record takes is checked in form only, by the caller; its content is checked
327
+ * once a compaction or a read applies it.
328
+ */
329
+ async append(address, log, change) {
226
330
  await this.prepare();
227
331
  const resolved = this.resolve(address);
332
+ const text = JSON.stringify(change.value);
333
+ const revision = change.expectedRevision + 1;
228
334
  let actualRevision = 0;
229
335
  for (let attempt = 0; attempt < mutationAttempts; attempt++) {
230
336
  if (attempt > 0)
231
337
  await mutationBackoff(attempt);
338
+ const head = await this.findHead(resolved);
339
+ actualRevision = head?.revision ?? 0;
340
+ if (actualRevision !== change.expectedRevision)
341
+ throw change.conflict(actualRevision);
342
+ if (head && this.takesChange(head, text)) {
343
+ if (await this.commitChange(resolved, head, revision, text))
344
+ return;
345
+ continue;
346
+ }
347
+ const stored = await this.loadLog(resolved, log);
348
+ actualRevision = stored.document?.revision ?? 0;
349
+ if (actualRevision !== change.expectedRevision)
350
+ throw change.conflict(actualRevision);
351
+ const value = log.validate(log.apply(stored.value, change.value));
352
+ if (await this.commit(resolved, stored.document, { revision, value }, true))
353
+ return;
354
+ }
355
+ throw change.conflict(actualRevision);
356
+ }
357
+ async mutate(address, mutation) {
358
+ await this.prepare();
359
+ const resolved = this.resolve(address);
360
+ await this.swap(resolved, mutation.contention, async () => {
232
361
  const head = await this.readHead(resolved);
233
- const current = this.parse(resolved, head, mutation.validate);
234
- actualRevision = head.document?.revision ?? 0;
235
- const write = mutation.decide(current);
362
+ const current = head.text === undefined
363
+ ? undefined
364
+ : this.parse(resolved, head.text, mutation.validate);
365
+ return { document: head.document, write: mutation.decide(current) };
366
+ });
367
+ }
368
+ /**
369
+ * Replaces a record's value on a decision from its revision alone. Only the head is read: the
370
+ * stored payload and its chunks are neither loaded nor validated, since the write replaces them.
371
+ */
372
+ async replace(address, replacement) {
373
+ await this.prepare();
374
+ const resolved = this.resolve(address);
375
+ await this.swap(resolved, replacement.contention, async () => {
376
+ const document = await this.findHead(resolved) ?? undefined;
377
+ return { document, write: replacement.decide(document?.revision ?? 0) };
378
+ });
379
+ }
380
+ /** Decides and commits until a head swap wins or a decision writes nothing. */
381
+ async swap(resolved, contention, decide) {
382
+ let actualRevision = 0;
383
+ for (let attempt = 0; attempt < mutationAttempts; attempt++) {
384
+ if (attempt > 0)
385
+ await mutationBackoff(attempt);
386
+ const { document, write } = await decide();
387
+ actualRevision = document?.revision ?? 0;
236
388
  if (!write)
237
389
  return;
238
- if (await this.commit(resolved, head.document, write))
390
+ if (await this.commit(resolved, document, write))
239
391
  return;
240
392
  }
241
- throw mutation.contention(actualRevision);
393
+ throw contention(actualRevision);
242
394
  }
243
- /** Deletes one record and its chunks. */
395
+ /** Deletes one record with its chunks and change pages. */
244
396
  async delete(address) {
245
397
  await this.prepare();
246
398
  const resolved = this.resolve(address);
247
399
  await this.deleteInTransaction(resolved.path, { recordId: resolved.recordId, domain: resolved.domain });
248
400
  }
249
- /** Deletes every record and chunk one session owns in the given domains. */
401
+ /** Deletes every record, chunk and change page one session owns in the given domains. */
250
402
  async deleteOwner(storageKey, sessionId, domains) {
251
403
  await this.prepare();
252
404
  const ownerKey = digest(JSON.stringify([storageKey, sessionId]));
253
405
  await this.deleteInTransaction(`${FLEX_RECORD_COLLECTION}/${domains.join('+')}/owner/${ownerKey}`, { ownerKey, domain: { $in: [...domains] } });
254
406
  }
255
407
  /**
256
- * Deletes every record and chunk of a storage namespace in one domain, or in every domain
257
- * together with its namespace document unless a fence holds it.
408
+ * Deletes every record, chunk and change page of a storage namespace in one domain, or in every
409
+ * domain together with its namespace document unless a fence holds it.
258
410
  */
259
411
  async purgeNamespace(storageKey, domain) {
260
412
  await this.prepare();
@@ -264,16 +416,17 @@ export class FlexRecordStore {
264
416
  : (transaction) => this.namespaces.atomicDeleteMany({ namespaceKey, fenced: false }, { session: transaction }));
265
417
  }
266
418
  /**
267
- * Fences a storage namespace and deletes every record and chunk of it in one transaction. The
268
- * fence is permanent: every later record creation in the namespace is refused, and a creation
269
- * that runs concurrently either commits first and is deleted, or conflicts and is refused.
419
+ * Fences a storage namespace and deletes every record, chunk and change page of it in one
420
+ * transaction. The fence is permanent: every later record creation in the namespace is refused,
421
+ * and a creation that runs concurrently either commits first and is deleted, or conflicts and is
422
+ * refused.
270
423
  */
271
424
  async fenceNamespace(storageKey) {
272
425
  await this.prepare();
273
426
  const namespaceKey = digest(storageKey);
274
427
  await this.deleteInTransaction(`${FLEX_RECORD_COLLECTION}/all/namespace/${namespaceKey}`, { namespaceKey }, (transaction) => this.namespaces.atomicUpdate({ namespaceKey }, { $set: { fenced: true }, $setOnInsert: { creationCount: 0 } }, { upsert: true, session: transaction }));
275
428
  }
276
- /** Deletes the selected records and chunks, after `namespace` changes the namespace document. */
429
+ /** Deletes the selected records, chunks and change pages, after `namespace` changes the namespace document. */
277
430
  async deleteInTransaction(path, selector, namespace) {
278
431
  const session = this.db.createSession();
279
432
  try {
@@ -281,6 +434,7 @@ export class FlexRecordStore {
281
434
  await namespace?.(transaction);
282
435
  await this.records.atomicDeleteMany(selector, { session: transaction });
283
436
  await this.chunks.atomicDeleteMany(selector, { session: transaction });
437
+ await this.changes.atomicDeleteMany(selector, { session: transaction });
284
438
  }, { timeoutMS: this.timeoutMs });
285
439
  }
286
440
  catch (error) {
@@ -292,18 +446,20 @@ export class FlexRecordStore {
292
446
  await session.close();
293
447
  }
294
448
  }
295
- parse(resolved, head, validate) {
296
- if (head.text === undefined)
297
- return undefined;
449
+ parse(resolved, text, validate) {
298
450
  let parsed;
299
451
  try {
300
- parsed = JSON.parse(head.text);
452
+ parsed = JSON.parse(text);
301
453
  }
302
454
  catch (error) {
303
455
  throw new FlexHarnessStoreFormatError(`Malformed JSON at ${resolved.path}.`, { cause: error });
304
456
  }
457
+ return this.check(resolved, () => validate(parsed));
458
+ }
459
+ /** Runs a check of stored data and names the record in a format error it throws. */
460
+ check(resolved, check) {
305
461
  try {
306
- return validate(parsed);
462
+ return check();
307
463
  }
308
464
  catch (error) {
309
465
  if (error instanceof FlexHarnessStoreFormatError) {
@@ -336,6 +492,75 @@ export class FlexRecordStore {
336
492
  }
337
493
  throw new FlexHarnessStoreFormatError(`${resolved.path} changed during ${chunkReadAttempts} consecutive reads.`);
338
494
  }
495
+ /**
496
+ * Loads a log record with the head it was read at. A head without a log holds its value whole;
497
+ * a base must be wrapped, so a version that reads values whole fails on it.
498
+ */
499
+ async loadLog(resolved, log) {
500
+ for (let attempt = 0; attempt < chunkReadAttempts; attempt++) {
501
+ const head = await this.readHead(resolved);
502
+ const document = head.document;
503
+ if (!document || head.text === undefined)
504
+ return { document };
505
+ if (!document.logId)
506
+ return { document, value: this.parse(resolved, head.text, log.validate) };
507
+ const changes = await this.readChanges(document);
508
+ if (changes) {
509
+ return { document, value: this.fold(resolved, document, head.text, changes, log) };
510
+ }
511
+ const latest = await this.findHead(resolved);
512
+ if (latest?.writeToken === document.writeToken) {
513
+ throw new FlexHarnessStoreFormatError(`${resolved.path} references ${document.changeCount} changes of log "${document.logId}", but they are incomplete.`);
514
+ }
515
+ }
516
+ throw new FlexHarnessStoreFormatError(`${resolved.path} changed during ${chunkReadAttempts} consecutive reads.`);
517
+ }
518
+ /**
519
+ * The data of the head's changes, oldest first: its pages, found by walking back from its last
520
+ * page to its log, then its recent changes. Undefined when the pages are incomplete.
521
+ */
522
+ async readChanges(document) {
523
+ const pages = [];
524
+ if (document.lastPageId !== null) {
525
+ const stored = await this.changes.getInstances({ recordId: document.recordId, logId: document.logId }, { timeoutMS: this.timeoutMs });
526
+ const byId = new Map(stored.map((page) => [page.pageId, page]));
527
+ let pageId = document.lastPageId;
528
+ while (pageId !== document.logId) {
529
+ const page = byId.get(pageId);
530
+ if (!page || !Array.isArray(page.changes) || pages.length === stored.length)
531
+ return undefined;
532
+ pages.push(page.changes);
533
+ pageId = page.previousId;
534
+ }
535
+ }
536
+ if (!Array.isArray(document.recentChanges))
537
+ return undefined;
538
+ const changes = [...pages.reverse().flat(), ...document.recentChanges];
539
+ return changes.length === document.changeCount ? changes : undefined;
540
+ }
541
+ /** The base with every change applied, checked in full and at the head's revision. */
542
+ fold(resolved, document, text, changes, log) {
543
+ let value = this.parse(resolved, text, (wrapper) => {
544
+ if (typeof wrapper !== 'object' || wrapper === null || Array.isArray(wrapper) ||
545
+ Object.keys(wrapper).length !== 1 || !('base' in wrapper)) {
546
+ throw new FlexHarnessStoreFormatError('A log record must hold exactly { base }.');
547
+ }
548
+ return log.validate(wrapper.base);
549
+ });
550
+ if (changes.length > 0) {
551
+ for (const data of changes) {
552
+ const change = this.parse(resolved, data, log.validateChange);
553
+ const current = value;
554
+ value = this.check(resolved, () => log.apply(current, change));
555
+ }
556
+ const folded = value;
557
+ value = this.check(resolved, () => log.validate(folded));
558
+ }
559
+ if (value.revision !== document.revision) {
560
+ throw new FlexHarnessStoreFormatError(`${resolved.path} holds revision ${value.revision}, but its head names ${document.revision}.`);
561
+ }
562
+ return value;
563
+ }
339
564
  async readBlob(document) {
340
565
  const stored = await this.chunks.getInstances({ blobId: document.blobId }, { timeoutMS: this.timeoutMs });
341
566
  if (stored.length !== document.chunkCount)
@@ -346,35 +571,47 @@ export class FlexRecordStore {
346
571
  .join('');
347
572
  return digest(text) === document.payloadSha256 ? text : undefined;
348
573
  }
349
- /** Returns false when another writer swapped the head first; nothing of this write remains. */
350
- async commit(resolved, stored, write) {
351
- const text = JSON.stringify(write.value);
352
- const chunked = text.length > FLEX_RECORD_CHUNK_CODE_UNITS;
574
+ /**
575
+ * Writes the value whole, or as the base of a new log, empty, when `log` is set; a base always
576
+ * goes into chunks. Returns false when another writer swapped the head first; nothing of this
577
+ * write remains.
578
+ */
579
+ async commit(resolved, stored, write, log = false) {
580
+ const text = JSON.stringify(log ? { base: write.value } : write.value);
581
+ const chunked = log || text.length > FLEX_RECORD_CHUNK_CODE_UNITS;
353
582
  let current = stored;
354
583
  if (!current) {
355
- if (!chunked)
356
- return this.insertHead(resolved, write.revision, text);
584
+ if (text.length <= FLEX_RECORD_CHUNK_CODE_UNITS)
585
+ return this.insertHead(resolved, write.revision, text, log);
357
586
  current = await this.insertPlaceholder(resolved);
358
587
  if (!current)
359
588
  return false;
360
589
  }
361
- else if (current.chunked) {
362
- await this.sweep(current);
363
- }
364
- else if (chunked && !await this.markChunked(current)) {
365
- return false;
590
+ else {
591
+ if (current.chunked || current.retiredLogId)
592
+ await this.sweep(current);
593
+ if (chunked && !current.chunked && !await this.markChunked(current))
594
+ return false;
366
595
  }
367
596
  const blobId = chunked ? await this.writeBlob(resolved, current.writeToken, text) : null;
597
+ const writeToken = plugins.crypto.randomUUID();
368
598
  let swapped;
369
599
  try {
370
600
  const outcome = await this.records.atomicUpdate({ recordId: resolved.recordId, writeToken: current.writeToken }, {
371
601
  $set: {
372
602
  revision: write.revision,
373
- writeToken: plugins.crypto.randomUUID(),
603
+ writeToken,
374
604
  payload: chunked ? null : text,
375
605
  blobId,
376
606
  chunkCount: chunked ? splitPayload(text).length : 0,
377
607
  payloadSha256: chunked ? digest(text) : null,
608
+ logId: log ? writeToken : null,
609
+ changeCount: 0,
610
+ recentChanges: [],
611
+ lastPageId: null,
612
+ changeLength: 0,
613
+ baseLength: log ? text.length : 0,
614
+ retiredLogId: current.logId ?? null,
378
615
  },
379
616
  }, { timeoutMS: this.timeoutMs });
380
617
  swapped = outcome.matchedCount === 1;
@@ -389,6 +626,56 @@ export class FlexRecordStore {
389
626
  }
390
627
  return swapped;
391
628
  }
629
+ /**
630
+ * Whether the record takes a change: a log that stays no longer than its base, or than the
631
+ * minimum room of a shorter base. A head whose recent changes are no list takes none, so the
632
+ * compaction's read refuses it.
633
+ */
634
+ takesChange(head, text) {
635
+ return Boolean(head.logId) && Array.isArray(head.recentChanges) &&
636
+ text.length <= FLEX_RECORD_CHUNK_CODE_UNITS &&
637
+ head.changeLength + text.length <= Math.max(head.baseLength, FLEX_RECORD_MIN_LOG_CODE_UNITS);
638
+ }
639
+ /**
640
+ * Appends a change to the head's recent changes in the head swap, or, when they would grow past
641
+ * their inline room, writes them with the change as a new page and empties them in the swap.
642
+ * Returns false when another writer swapped the head first; nothing of this write remains.
643
+ */
644
+ async commitChange(resolved, head, revision, text) {
645
+ const recentLength = head.recentChanges.reduce((length, data) => length + data.length, 0);
646
+ const page = recentLength + text.length > FLEX_RECORD_INLINE_CHANGE_CODE_UNITS
647
+ ? new this.changes()
648
+ : undefined;
649
+ if (page) {
650
+ page.pageId = plugins.crypto.randomUUID();
651
+ page.recordId = resolved.recordId;
652
+ page.domain = resolved.domain;
653
+ page.ownerKey = resolved.ownerKey;
654
+ page.namespaceKey = resolved.namespaceKey;
655
+ page.logId = head.logId;
656
+ page.previousId = head.lastPageId ?? head.logId;
657
+ page.changes = [...head.recentChanges, text];
658
+ await this.changes.insert(page, { timeoutMS: this.timeoutMs });
659
+ }
660
+ const writeToken = plugins.crypto.randomUUID();
661
+ const counts = { changeCount: 1, changeLength: text.length };
662
+ let swapped;
663
+ try {
664
+ const outcome = await this.records.atomicUpdate({ recordId: resolved.recordId, writeToken: head.writeToken }, page
665
+ ? { $set: { revision, writeToken, recentChanges: [], lastPageId: page.pageId }, $inc: counts }
666
+ : { $set: { revision, writeToken }, $inc: counts, $push: { recentChanges: text } }, { timeoutMS: this.timeoutMs });
667
+ swapped = outcome.matchedCount === 1;
668
+ }
669
+ catch (error) {
670
+ if (isDefiniteRejection(error))
671
+ throw error;
672
+ throw new FlexHarnessStoreCommitUncertainError(resolved.path, 'write', { cause: error });
673
+ }
674
+ if (!swapped && page) {
675
+ await this.changes.atomicDeleteMany({ pageId: page.pageId }, { timeoutMS: this.timeoutMs });
676
+ }
677
+ return swapped;
678
+ }
392
679
  newHead(resolved) {
393
680
  const head = new this.records();
394
681
  head.recordId = resolved.recordId;
@@ -400,15 +687,40 @@ export class FlexRecordStore {
400
687
  head.chunkCount = 0;
401
688
  head.payloadSha256 = null;
402
689
  head.sweepCount = 0;
690
+ head.logId = null;
691
+ head.changeCount = 0;
692
+ head.recentChanges = [];
693
+ head.lastPageId = null;
694
+ head.changeLength = 0;
695
+ head.baseLength = 0;
696
+ head.retiredLogId = null;
403
697
  return head;
404
698
  }
405
- async insertHead(resolved, revision, text) {
699
+ /**
700
+ * Creates the record with a first payload of up to one chunk in one transaction: inline, or as
701
+ * the single chunk of a log's base. The creation never touches the head again, so a concurrent
702
+ * fenced purge conflicts with it at most once.
703
+ */
704
+ async insertHead(resolved, revision, text, log) {
406
705
  const head = this.newHead(resolved);
407
706
  head.revision = revision;
408
- head.payload = text;
409
- head.chunked = false;
707
+ let chunk;
708
+ if (log) {
709
+ chunk = this.newChunk(resolved, plugins.crypto.randomUUID(), head.writeToken, 0, text);
710
+ head.payload = null;
711
+ head.chunked = true;
712
+ head.blobId = chunk.blobId;
713
+ head.chunkCount = 1;
714
+ head.payloadSha256 = digest(text);
715
+ head.logId = head.writeToken;
716
+ head.baseLength = text.length;
717
+ }
718
+ else {
719
+ head.payload = text;
720
+ head.chunked = false;
721
+ }
410
722
  try {
411
- return await this.create(resolved, head);
723
+ return await this.create(resolved, head, chunk);
412
724
  }
413
725
  catch (error) {
414
726
  if (plugins.SmartdataSession.getCommitOutcome(error) === 'not_committed')
@@ -416,7 +728,7 @@ export class FlexRecordStore {
416
728
  throw new FlexHarnessStoreCommitUncertainError(resolved.path, 'write', { cause: error });
417
729
  }
418
730
  }
419
- /** Reserves the record for a chunked first write, so its chunks have a head token to replace. */
731
+ /** Reserves the record for a first write longer than one chunk, so its chunks have a head token to replace. */
420
732
  async insertPlaceholder(resolved) {
421
733
  const head = this.newHead(resolved);
422
734
  head.revision = 0;
@@ -425,12 +737,12 @@ export class FlexRecordStore {
425
737
  return await this.create(resolved, head) ? head : undefined;
426
738
  }
427
739
  /**
428
- * Inserts a new head unless a fence holds its namespace. The transaction also increments the
429
- * namespace document, so it conflicts with a concurrent fenced purge: whichever commits second
430
- * retries on a snapshot that holds the other. Returns false when another writer created the
431
- * record first.
740
+ * Inserts a new head, and the chunk it references if any, unless a fence holds its namespace.
741
+ * The transaction also increments the namespace document, so it conflicts with a concurrent
742
+ * fenced purge: whichever commits second retries on a snapshot that holds the other. Returns
743
+ * false when another writer created the record first.
432
744
  */
433
- async create(resolved, head) {
745
+ async create(resolved, head, chunk) {
434
746
  const session = this.db.createSession();
435
747
  try {
436
748
  await session.withTransaction(async (transaction) => {
@@ -439,6 +751,8 @@ export class FlexRecordStore {
439
751
  throw new FlexHarnessStorePurgedError(resolved.path);
440
752
  await this.namespaces.atomicUpdate({ namespaceKey: resolved.namespaceKey }, { $inc: { creationCount: 1 }, $setOnInsert: { fenced: false } }, { upsert: true, session: transaction });
441
753
  await this.records.insert(head, { session: transaction });
754
+ if (chunk)
755
+ await this.chunks.insert(chunk, { session: transaction });
442
756
  }, { timeoutMS: this.timeoutMs });
443
757
  return true;
444
758
  }
@@ -461,25 +775,31 @@ export class FlexRecordStore {
461
775
  const blobId = plugins.crypto.randomUUID();
462
776
  const pieces = splitPayload(text);
463
777
  for (let index = 0; index < pieces.length; index++) {
464
- const chunk = new this.chunks();
465
- chunk.chunkId = `${blobId}:${index}`;
466
- chunk.recordId = resolved.recordId;
467
- chunk.domain = resolved.domain;
468
- chunk.ownerKey = resolved.ownerKey;
469
- chunk.namespaceKey = resolved.namespaceKey;
470
- chunk.blobId = blobId;
471
- chunk.baseToken = baseToken;
472
- chunk.index = index;
473
- chunk.data = pieces[index];
778
+ const chunk = this.newChunk(resolved, blobId, baseToken, index, pieces[index]);
474
779
  await this.chunks.insert(chunk, { timeoutMS: this.timeoutMs });
475
780
  }
476
781
  return blobId;
477
782
  }
783
+ newChunk(resolved, blobId, baseToken, index, data) {
784
+ const chunk = new this.chunks();
785
+ chunk.chunkId = `${blobId}:${index}`;
786
+ chunk.recordId = resolved.recordId;
787
+ chunk.domain = resolved.domain;
788
+ chunk.ownerKey = resolved.ownerKey;
789
+ chunk.namespaceKey = resolved.namespaceKey;
790
+ chunk.blobId = blobId;
791
+ chunk.baseToken = baseToken;
792
+ chunk.index = index;
793
+ chunk.data = data;
794
+ return chunk;
795
+ }
478
796
  /**
479
- * Deletes the record's chunks that no head can reference any more: every blob but the current
480
- * one that was written against another head token. A writer that read the current token keeps
481
- * its chunks. Touching the head in the same transaction makes a concurrent deletion conflict,
482
- * so chunks written after a deletion are never swept by a transaction that predates it.
797
+ * Deletes the record's chunks and change pages that no head can reference any more: every blob
798
+ * but the current one that was written against another head token, and every page of the log the
799
+ * last write retired, found by its index rather than by scanning the current log's pages. A
800
+ * writer that read the current token keeps its chunks.
801
+ * Touching the head in the same transaction makes a concurrent deletion conflict, so chunks and
802
+ * pages written after a deletion are never swept by a transaction that predates it.
483
803
  */
484
804
  async sweep(current) {
485
805
  const session = this.db.createSession();
@@ -488,11 +808,16 @@ export class FlexRecordStore {
488
808
  const touched = await this.records.atomicUpdate({ recordId: current.recordId, writeToken: current.writeToken }, { $inc: { sweepCount: 1 } }, { session: transaction });
489
809
  if (touched.matchedCount !== 1)
490
810
  return;
491
- await this.chunks.atomicDeleteMany({
492
- recordId: current.recordId,
493
- baseToken: { $ne: current.writeToken },
494
- ...(current.blobId === null ? {} : { blobId: { $ne: current.blobId } }),
495
- }, { session: transaction });
811
+ if (current.chunked) {
812
+ await this.chunks.atomicDeleteMany({
813
+ recordId: current.recordId,
814
+ baseToken: { $ne: current.writeToken },
815
+ ...(current.blobId === null ? {} : { blobId: { $ne: current.blobId } }),
816
+ }, { session: transaction });
817
+ }
818
+ if (current.retiredLogId) {
819
+ await this.changes.atomicDeleteMany({ recordId: current.recordId, logId: current.retiredLogId }, { session: transaction });
820
+ }
496
821
  }, { timeoutMS: this.timeoutMs });
497
822
  }
498
823
  finally {
@@ -500,4 +825,4 @@ export class FlexRecordStore {
500
825
  }
501
826
  }
502
827
  }
503
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yZWNvcmRzdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3N0b3Jlc19ub3NxbGRiL2NsYXNzZXMucmVjb3Jkc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUNMLG9DQUFvQyxFQUNwQywyQkFBMkIsRUFDM0IsMkJBQTJCLEVBQzNCLDBCQUEwQixHQUMzQixNQUFNLGlCQUFpQixDQUFDO0FBbUN6QixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxxQkFBcUIsQ0FBQztBQUM1RCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxvQkFBb0IsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyx3QkFBd0IsQ0FBQztBQUVsRTs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUV4RCxNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQUMzQixNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQUNoQyxNQUFNLG9CQUFvQixHQUFHLEdBQUcsQ0FBQztBQUNqQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQztBQUM1QixNQUFNLHlCQUF5QixHQUFHLE1BQU0sQ0FBQztBQUV6Qzs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxPQUFPLENBQUMsY0FBc0Q7SUFDN0YsUUFBUSxDQUFVO0lBQ2xCLE1BQU0sQ0FBcUI7SUFDM0IsUUFBUSxDQUFVO0lBQ2xCLFlBQVksQ0FBVTtJQUN0QixRQUFRLENBQVU7SUFDbEIsVUFBVSxDQUFVO0lBQ3BCLE9BQU8sQ0FBaUI7SUFDeEIsTUFBTSxDQUFpQjtJQUN2QixVQUFVLENBQVU7SUFDcEIsYUFBYSxDQUFpQjtJQUNyQyw0RkFBNEY7SUFDckYsT0FBTyxDQUFXO0lBQ2xCLFVBQVUsQ0FBVTtDQUM1QjtBQUVELGdHQUFnRztBQUNoRyxNQUFNLE9BQU8saUJBQWtCLFNBQVEsT0FBTyxDQUFDLGNBQW9EO0lBQzFGLE9BQU8sQ0FBVTtJQUNqQixRQUFRLENBQVU7SUFDbEIsTUFBTSxDQUFxQjtJQUMzQixRQUFRLENBQVU7SUFDbEIsWUFBWSxDQUFVO0lBQ3RCLE1BQU0sQ0FBVTtJQUNoQixTQUFTLENBQVU7SUFDbkIsS0FBSyxDQUFVO0lBQ2YsSUFBSSxDQUFVO0NBQ3RCO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxPQUFPLENBQUMsY0FBNEQ7SUFDdEcsWUFBWSxDQUFVO0lBQ3RCLE1BQU0sQ0FBVztJQUNqQixhQUFhLENBQVU7Q0FDL0I7QUFZRCxTQUFTLFVBQVUsQ0FBQyxFQUF1QjtJQUN6QyxNQUFNLFdBQVksU0FBUSxrQkFBa0I7S0FBRztJQUMvQyxNQUFNLFVBQVcsU0FBUSxpQkFBaUI7S0FBRztJQUM3QyxNQUFNLGNBQWUsU0FBUSxxQkFBcUI7S0FBRztJQUNyRCxPQUFPLENBQUMscUJBQXFCLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRTtRQUM3QyxjQUFjLEVBQUUsc0JBQXNCO1FBQ3RDLGVBQWUsRUFBRTtZQUNmLFVBQVU7WUFDVixRQUFRO1lBQ1IsVUFBVTtZQUNWLGNBQWM7WUFDZCxVQUFVO1lBQ1YsWUFBWTtZQUNaLFNBQVM7WUFDVCxRQUFRO1lBQ1IsWUFBWTtZQUNaLGVBQWU7WUFDZixTQUFTO1lBQ1QsWUFBWTtTQUNiO1FBQ0QsYUFBYSxFQUFFLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxZQUFZLENBQUM7UUFDdkQsY0FBYyxFQUFFLENBQUMsVUFBVSxDQUFDO1FBQzVCLE9BQU8sRUFBRTtZQUNQLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLEdBQUcsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDbEYsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsR0FBRyxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDckUsRUFBRSxJQUFJLEVBQUUsOEJBQThCLEVBQUUsR0FBRyxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7U0FDOUU7S0FDRixDQUFDLENBQUM7SUFDSCxPQUFPLENBQUMscUJBQXFCLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRTtRQUM1QyxjQUFjLEVBQUUscUJBQXFCO1FBQ3JDLGVBQWUsRUFBRTtZQUNmLFNBQVM7WUFDVCxVQUFVO1lBQ1YsUUFBUTtZQUNSLFVBQVU7WUFDVixjQUFjO1lBQ2QsUUFBUTtZQUNSLFdBQVc7WUFDWCxPQUFPO1lBQ1AsTUFBTTtTQUNQO1FBQ0QsYUFBYSxFQUFFLENBQUMsT0FBTyxDQUFDO1FBQ3hCLGNBQWMsRUFBRSxDQUFDLFNBQVMsQ0FBQztRQUMzQixPQUFPLEVBQUU7WUFDUCxFQUFFLElBQUksRUFBRSxzQkFBc0IsRUFBRSxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ2hGLEVBQUUsSUFBSSxFQUFFLHdCQUF3QixFQUFFLEdBQUcsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0RCxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxHQUFHLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUQsRUFBRSxJQUFJLEVBQUUseUJBQXlCLEVBQUUsR0FBRyxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDcEUsRUFBRSxJQUFJLEVBQUUsNkJBQTZCLEVBQUUsR0FBRyxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7U0FDN0U7S0FDRixDQUFDLENBQUM7SUFDSCxPQUFPLENBQUMscUJBQXFCLENBQUMsY0FBYyxFQUFFLEVBQUUsRUFBRTtRQUNoRCxjQUFjLEVBQUUseUJBQXlCO1FBQ3pDLGVBQWUsRUFBRSxDQUFDLGNBQWMsRUFBRSxRQUFRLEVBQUUsZUFBZSxDQUFDO1FBQzVELGFBQWEsRUFBRSxDQUFDLGVBQWUsQ0FBQztRQUNoQyxjQUFjLEVBQUUsQ0FBQyxjQUFjLENBQUM7UUFDaEMsT0FBTyxFQUFFO1lBQ1AsRUFBRSxJQUFJLEVBQUUsMkJBQTJCLEVBQUUsR0FBRyxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRTtTQUMzRjtLQUNGLENBQUMsQ0FBQztJQUNILE9BQU8sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxDQUFDO0FBQ2xGLENBQUM7QUFlRCxNQUFNLE1BQU0sR0FBRyxDQUFDLEtBQWEsRUFBVSxFQUFFLENBQ3ZDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRTFFLFNBQVMsWUFBWSxDQUFDLElBQVk7SUFDaEMsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO0lBQzVCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLE9BQU8sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMzQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyw0QkFBNEIsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLElBQUksTUFBTSxJQUFJLElBQUksSUFBSSxNQUFNO1lBQUUsR0FBRyxFQUFFLENBQUM7UUFDakUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLEtBQUssR0FBRyxHQUFHLENBQUM7SUFDZCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELHdHQUF3RztBQUN4RyxTQUFTLG1CQUFtQixDQUFDLEtBQWM7SUFDekMsT0FBTyxLQUFLLFlBQVksT0FBTyxDQUFDLHlCQUF5QixJQUFJO1FBQzNELGtCQUFrQjtRQUNsQix1QkFBdUI7UUFDdkIsa0JBQWtCO1FBQ2xCLHVCQUF1QjtRQUN2QixpQkFBaUI7S0FDbEIsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLGVBQWUsQ0FBQyxPQUFlO0lBQ3RDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUscUJBQXFCLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0YsTUFBTSxPQUFPLEdBQUcsT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLEtBQWM7SUFDdEMsT0FBTyxLQUFLLFlBQVksT0FBTyxDQUFDLHlCQUF5QixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssaUJBQWlCLENBQUM7QUFDaEcsQ0FBQztBQU9EOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBQ1QsRUFBRSxDQUFzQjtJQUN4QixTQUFTLENBQVM7SUFDbEIsT0FBTyxDQUFlO0lBQ3RCLE1BQU0sQ0FBYztJQUNwQixVQUFVLENBQWtCO0lBQ3JDLFdBQVcsQ0FBaUI7SUFFcEMsWUFBWSxPQUFnQztRQUMxQyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsa0JBQWtCLElBQUkseUJBQXlCLENBQUM7UUFDMUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxHQUFHLENBQUMsSUFBSSxTQUFTLEdBQUcsT0FBTyxFQUFFLENBQUM7WUFDN0UsTUFBTSxJQUFJLDBCQUEwQixDQUFDLHlEQUF5RCxDQUFDLENBQUM7UUFDbEcsQ0FBQztRQUNELElBQUksQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekcsQ0FBQztJQUVELCtGQUErRjtJQUN4RixPQUFPO1FBQ1osSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFjLEVBQUUsRUFBRTtZQUN0RSxJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztZQUM3QixNQUFNLEtBQUssQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFTyxLQUFLLENBQUMsa0JBQWtCO1FBQzlCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDO1FBQzFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNsQixNQUFNLElBQUksMEJBQTBCLENBQ2xDLDZEQUE2RCxDQUM5RCxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksWUFBWSxDQUFDLFlBQVksS0FBSyxhQUFhLEVBQUUsQ0FBQztZQUNoRCxNQUFNLElBQUksMEJBQTBCLENBQ2xDLHdFQUF3RSxDQUN6RSxDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLEVBQUUsSUFBSSxFQUFFLGtCQUEyQixFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakYsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVPLE9BQU8sQ0FBQyxPQUEyQjtRQUN6QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNyQyxPQUFPLENBQUMsTUFBTTtZQUNkLE9BQU8sQ0FBQyxVQUFVO1lBQ2xCLE9BQU8sQ0FBQyxTQUFTLElBQUksSUFBSTtZQUN6QixPQUFPLENBQUMsT0FBTyxJQUFJLElBQUk7U0FDeEIsQ0FBQyxDQUFDLENBQUM7UUFDSixPQUFPO1lBQ0wsUUFBUTtZQUNSLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtZQUN0QixRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNqRixZQUFZLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFDeEMsSUFBSSxFQUFFLEdBQUcsc0JBQXNCLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxRQUFRLEVBQUU7U0FDaEUsQ0FBQztJQUNKLENBQUM7SUFFTSxLQUFLLENBQUMsSUFBSSxDQUNmLE9BQTJCLEVBQzNCLFFBQW9DO1FBRXBDLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVNLEtBQUssQ0FBQyxNQUFNLENBQ2pCLE9BQTJCLEVBQzNCLFFBQXFDO1FBRXJDLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLEtBQUssSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sR0FBRyxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQzVELElBQUksT0FBTyxHQUFHLENBQUM7Z0JBQUUsTUFBTSxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDOUQsY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxJQUFJLENBQUMsQ0FBQztZQUM5QyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxLQUFLO2dCQUFFLE9BQU87WUFDbkIsSUFBSSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDO2dCQUFFLE9BQU87UUFDaEUsQ0FBQztRQUNELE1BQU0sUUFBUSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQseUNBQXlDO0lBQ2xDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBMkI7UUFDN0MsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2QyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzFHLENBQUM7SUFFRCw0RUFBNEU7SUFDckUsS0FBSyxDQUFDLFdBQVcsQ0FDdEIsVUFBa0IsRUFDbEIsU0FBaUIsRUFDakIsT0FBcUM7UUFFckMsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUM1QixHQUFHLHNCQUFzQixJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsUUFBUSxFQUFFLEVBQ2xFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUM1QyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxjQUFjLENBQUMsVUFBa0IsRUFBRSxNQUEwQjtRQUN4RSxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEMsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQzVCLEdBQUcsc0JBQXNCLElBQUksTUFBTSxJQUFJLEtBQUssY0FBYyxZQUFZLEVBQUUsRUFDeEUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsRUFDcEQsTUFBTTtZQUNKLENBQUMsQ0FBQyxTQUFTO1lBQ1gsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUNqRCxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQy9CLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUN6QixDQUNKLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxjQUFjLENBQUMsVUFBa0I7UUFDNUMsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckIsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUM1QixHQUFHLHNCQUFzQixrQkFBa0IsWUFBWSxFQUFFLEVBQ3pELEVBQUUsWUFBWSxFQUFFLEVBQ2hCLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FDM0MsRUFBRSxZQUFZLEVBQUUsRUFDaEIsRUFBRSxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsWUFBWSxFQUFFLEVBQUUsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQzlELEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQ3ZDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxpR0FBaUc7SUFDekYsS0FBSyxDQUFDLG1CQUFtQixDQUMvQixJQUFZLEVBQ1osUUFHd0QsRUFDeEQsU0FBdUU7UUFFdkUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUM7WUFDSCxNQUFNLE9BQU8sQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxFQUFFO2dCQUNsRCxNQUFNLFNBQVMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUMvQixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7Z0JBQ3hFLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUN6RSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxlQUFlO2dCQUFFLE1BQU0sS0FBSyxDQUFDO1lBQ3RGLE1BQU0sSUFBSSxvQ0FBb0MsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDbkYsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQ1gsUUFBMEIsRUFDMUIsSUFBaUIsRUFDakIsUUFBb0M7UUFFcEMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUM5QyxJQUFJLE1BQWUsQ0FBQztRQUNwQixJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksMkJBQTJCLENBQUMscUJBQXFCLFFBQVEsQ0FBQyxJQUFJLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2pHLENBQUM7UUFDRCxJQUFJLENBQUM7WUFDSCxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksS0FBSyxZQUFZLDJCQUEyQixFQUFFLENBQUM7Z0JBQ2pELE1BQU0sSUFBSSwyQkFBMkIsQ0FBQyxxQkFBcUIsUUFBUSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQzVGLEtBQUssRUFBRSxLQUFLO2lCQUNiLENBQUMsQ0FBQztZQUNMLENBQUM7WUFDRCxNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRU8sUUFBUSxDQUFDLFFBQTBCO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ2xHLENBQUM7SUFFTyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQTBCO1FBQy9DLEtBQUssSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sR0FBRyxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQzdELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsUUFBUTtnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUN6QixJQUFJLFFBQVEsQ0FBQyxPQUFPLEtBQUssSUFBSTtnQkFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDM0UsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLElBQUk7Z0JBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO1lBQ2xELE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzQyxJQUFJLElBQUksS0FBSyxTQUFTO2dCQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDbEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzdDLElBQUksTUFBTSxFQUFFLFVBQVUsS0FBSyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQy9DLE1BQU0sSUFBSSwyQkFBMkIsQ0FDbkMsR0FBRyxRQUFRLENBQUMsSUFBSSxlQUFlLFFBQVEsQ0FBQyxVQUFVLG9CQUFvQixRQUFRLENBQUMsTUFBTSw2QkFBNkIsQ0FDbkgsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxJQUFJLDJCQUEyQixDQUNuQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLG1CQUFtQixpQkFBaUIscUJBQXFCLENBQzFFLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUE0QjtRQUNqRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUMzQyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTyxFQUFFLEVBQzVCLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FDOUIsQ0FBQztRQUNGLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsVUFBVTtZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQzVELE1BQU0sSUFBSSxHQUFHLE1BQU07YUFDaEIsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO2FBQy9DLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQzthQUMxQixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDWixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsK0ZBQStGO0lBQ3ZGLEtBQUssQ0FBQyxNQUFNLENBQ2xCLFFBQTBCLEVBQzFCLE1BQXNDLEVBQ3RDLEtBQXVCO1FBRXZCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsNEJBQTRCLENBQUM7UUFDM0QsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxPQUFPO2dCQUFFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNyRSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLE9BQU87Z0JBQUUsT0FBTyxLQUFLLENBQUM7UUFDN0IsQ0FBQzthQUFNLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QixDQUFDO2FBQU0sSUFBSSxPQUFPLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUN2RCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3pGLElBQUksT0FBZ0IsQ0FBQztRQUNyQixJQUFJLENBQUM7WUFDSCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUM3QyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQy9EO2dCQUNFLElBQUksRUFBRTtvQkFDSixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7b0JBQ3hCLFVBQVUsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRTtvQkFDdkMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJO29CQUM5QixNQUFNO29CQUNOLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ25ELGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtpQkFDN0M7YUFDRixFQUNELEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FDOUIsQ0FBQztZQUNGLE9BQU8sR0FBRyxPQUFPLENBQUMsWUFBWSxLQUFLLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksbUJBQW1CLENBQUMsS0FBSyxDQUFDO2dCQUFFLE1BQU0sS0FBSyxDQUFDO1lBQzVDLE1BQU0sSUFBSSxvQ0FBb0MsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzNGLENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNoQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNoRixDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVPLE9BQU8sQ0FBQyxRQUEwQjtRQUN4QyxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDbEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQzlCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUNsQyxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDMUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLEtBQUssQ0FBQyxVQUFVLENBQ3RCLFFBQTBCLEVBQzFCLFFBQWdCLEVBQ2hCLElBQVk7UUFFWixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksT0FBTyxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxLQUFLLGVBQWU7Z0JBQUUsTUFBTSxLQUFLLENBQUM7WUFDdEYsTUFBTSxJQUFJLG9DQUFvQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDM0YsQ0FBQztJQUNILENBQUM7SUFFRCxpR0FBaUc7SUFDekYsS0FBSyxDQUFDLGlCQUFpQixDQUM3QixRQUEwQjtRQUUxQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDOUQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUEwQixFQUFFLElBQXdCO1FBQ3ZFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRTtnQkFDbEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FDakQsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVksRUFBRSxFQUN2QyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FDekIsQ0FBQztnQkFDRixJQUFJLFNBQVMsRUFBRSxNQUFNO29CQUFFLE1BQU0sSUFBSSwyQkFBMkIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzVFLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQ2hDLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxZQUFZLEVBQUUsRUFDdkMsRUFBRSxJQUFJLEVBQUUsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQy9ELEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQ3ZDLENBQUM7Z0JBQ0YsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUM1RCxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDbEMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQ0UsZ0JBQWdCLENBQUMsS0FBSyxDQUFDO2dCQUN2QixPQUFPLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEtBQUssZUFBZSxFQUNwRSxDQUFDO2dCQUNELE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQTJCO1FBQ25ELE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQzdDLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFDOUQsRUFBRSxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFDM0IsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUM5QixDQUFDO1FBQ0YsT0FBTyxPQUFPLENBQUMsWUFBWSxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU8sS0FBSyxDQUFDLFNBQVMsQ0FDckIsUUFBMEIsRUFDMUIsU0FBaUIsRUFDakIsSUFBWTtRQUVaLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0MsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDbkQsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEMsS0FBSyxDQUFDLE9BQU8sR0FBRyxHQUFHLE1BQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNyQyxLQUFLLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDbkMsS0FBSyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQy9CLEtBQUssQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUNuQyxLQUFLLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7WUFDM0MsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDdEIsS0FBSyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDNUIsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDcEIsS0FBSyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0IsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBMkI7UUFDN0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUM7WUFDSCxNQUFNLE9BQU8sQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxFQUFFO2dCQUNsRCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUM3QyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQzlELEVBQUUsSUFBSSxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQzNCLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUN6QixDQUFDO2dCQUNGLElBQUksT0FBTyxDQUFDLFlBQVksS0FBSyxDQUFDO29CQUFFLE9BQU87Z0JBQ3ZDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FDaEM7b0JBQ0UsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO29CQUMxQixTQUFTLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLFVBQVUsRUFBRTtvQkFDdEMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO2lCQUN4RSxFQUNELEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUN6QixDQUFDO1lBQ0osQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7Z0JBQVMsQ0FBQztZQUNULE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0NBQ0YifQ==
828
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yZWNvcmRzdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3N0b3Jlc19ub3NxbGRiL2NsYXNzZXMucmVjb3Jkc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUNMLG9DQUFvQyxFQUNwQywyQkFBMkIsRUFDM0IsMkJBQTJCLEVBQzNCLDBCQUEwQixHQUMzQixNQUFNLGlCQUFpQixDQUFDO0FBc0V6QixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxxQkFBcUIsQ0FBQztBQUM1RCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxvQkFBb0IsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyx3QkFBd0IsQ0FBQztBQUNsRSxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxxQkFBcUIsQ0FBQztBQUU1RDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUV4RDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBRXhEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9DQUFvQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFFOUQsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFDM0IsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7QUFDaEMsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUM7QUFDakMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7QUFDNUIsTUFBTSx5QkFBeUIsR0FBRyxNQUFNLENBQUM7QUFFekM7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsT0FBTyxDQUFDLGNBQXNEO0lBQzdGLFFBQVEsQ0FBVTtJQUNsQixNQUFNLENB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