@interop/was-react 0.20.1 → 0.21.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 (94) hide show
  1. package/README.md +8 -2
  2. package/dist/dev/provisionDevGrants.js +1 -1
  3. package/dist/dev/provisionDevGrants.js.map +1 -1
  4. package/dist/index.d.ts +2 -1
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +9 -2
  7. package/dist/index.js.map +1 -1
  8. package/dist/session/authStore.js +1 -1
  9. package/dist/session/authStore.js.map +1 -1
  10. package/dist/storage/adopt.d.ts.map +1 -1
  11. package/dist/storage/adopt.js +2 -1
  12. package/dist/storage/adopt.js.map +1 -1
  13. package/dist/{sync → storage}/docCipher.d.ts +3 -29
  14. package/dist/storage/docCipher.d.ts.map +1 -0
  15. package/dist/{sync → storage}/docCipher.js +0 -20
  16. package/dist/storage/docCipher.js.map +1 -0
  17. package/dist/storage/entityStore.d.ts.map +1 -1
  18. package/dist/storage/entityStore.js +2 -1
  19. package/dist/storage/entityStore.js.map +1 -1
  20. package/dist/storage/localStore.d.ts +1 -1
  21. package/dist/storage/localStore.d.ts.map +1 -1
  22. package/dist/storage/localStore.js +14 -2
  23. package/dist/storage/localStore.js.map +1 -1
  24. package/dist/storage/sharedCollectionReader.d.ts +1 -1
  25. package/dist/storage/sharedCollectionReader.d.ts.map +1 -1
  26. package/dist/storage/sharedCollectionReader.js +1 -1
  27. package/dist/storage/sharedCollectionReader.js.map +1 -1
  28. package/dist/storage/storageContext.d.ts +1 -2
  29. package/dist/storage/storageContext.d.ts.map +1 -1
  30. package/dist/storage/storageContext.js.map +1 -1
  31. package/dist/storage/storageManager.d.ts +1 -1
  32. package/dist/storage/storageManager.d.ts.map +1 -1
  33. package/dist/storage/syncController.d.ts +30 -19
  34. package/dist/storage/syncController.d.ts.map +1 -1
  35. package/dist/storage/syncController.js +84 -157
  36. package/dist/storage/syncController.js.map +1 -1
  37. package/dist/storage/syncStatusStore.d.ts +8 -7
  38. package/dist/storage/syncStatusStore.d.ts.map +1 -1
  39. package/dist/storage/syncStatusStore.js.map +1 -1
  40. package/dist/storage/wasRemoteStore.js +1 -1
  41. package/dist/storage/wasRemoteStore.js.map +1 -1
  42. package/dist/storage/wasSync.d.ts +1 -1
  43. package/dist/storage/wasSync.d.ts.map +1 -1
  44. package/dist/storage/wasSync.js +1 -1
  45. package/dist/storage/wasSync.js.map +1 -1
  46. package/dist/{sync → storage}/wasSyncPort.d.ts +14 -8
  47. package/dist/storage/wasSyncPort.d.ts.map +1 -0
  48. package/dist/storage/wasSyncPort.js.map +1 -0
  49. package/dist/storage/writerId.d.ts +7 -13
  50. package/dist/storage/writerId.d.ts.map +1 -1
  51. package/dist/storage/writerId.js +30 -46
  52. package/dist/storage/writerId.js.map +1 -1
  53. package/package.json +13 -10
  54. package/dist/sync/changesQuery.d.ts +0 -44
  55. package/dist/sync/changesQuery.d.ts.map +0 -1
  56. package/dist/sync/changesQuery.js +0 -54
  57. package/dist/sync/changesQuery.js.map +0 -1
  58. package/dist/sync/docCipher.d.ts.map +0 -1
  59. package/dist/sync/docCipher.js.map +0 -1
  60. package/dist/sync/feedMasterPort.d.ts +0 -38
  61. package/dist/sync/feedMasterPort.d.ts.map +0 -1
  62. package/dist/sync/feedMasterPort.js +0 -116
  63. package/dist/sync/feedMasterPort.js.map +0 -1
  64. package/dist/sync/index.d.ts +0 -23
  65. package/dist/sync/index.d.ts.map +0 -1
  66. package/dist/sync/index.js +0 -27
  67. package/dist/sync/index.js.map +0 -1
  68. package/dist/sync/lww.d.ts +0 -50
  69. package/dist/sync/lww.d.ts.map +0 -1
  70. package/dist/sync/lww.js +0 -69
  71. package/dist/sync/lww.js.map +0 -1
  72. package/dist/sync/lwwConflictHandler.d.ts +0 -83
  73. package/dist/sync/lwwConflictHandler.d.ts.map +0 -1
  74. package/dist/sync/lwwConflictHandler.js +0 -114
  75. package/dist/sync/lwwConflictHandler.js.map +0 -1
  76. package/dist/sync/pushWrites.d.ts +0 -76
  77. package/dist/sync/pushWrites.d.ts.map +0 -1
  78. package/dist/sync/pushWrites.js +0 -221
  79. package/dist/sync/pushWrites.js.map +0 -1
  80. package/dist/sync/syncedDocSchema.d.ts +0 -22
  81. package/dist/sync/syncedDocSchema.d.ts.map +0 -1
  82. package/dist/sync/syncedDocSchema.js +0 -29
  83. package/dist/sync/syncedDocSchema.js.map +0 -1
  84. package/dist/sync/types.d.ts +0 -319
  85. package/dist/sync/types.d.ts.map +0 -1
  86. package/dist/sync/types.js +0 -58
  87. package/dist/sync/types.js.map +0 -1
  88. package/dist/sync/wasReplication.d.ts +0 -47
  89. package/dist/sync/wasReplication.d.ts.map +0 -1
  90. package/dist/sync/wasReplication.js +0 -92
  91. package/dist/sync/wasReplication.js.map +0 -1
  92. package/dist/sync/wasSyncPort.d.ts.map +0 -1
  93. package/dist/sync/wasSyncPort.js.map +0 -1
  94. /package/dist/{sync → storage}/wasSyncPort.js +0 -0
@@ -1,58 +0,0 @@
1
- /**
2
- * The typed port signals, owned by `@interop/was-client` (its sync port raises
3
- * them) and re-exported here so the names this package's consumers already
4
- * import stay put -- and so an `instanceof` check anywhere in this package
5
- * matches the very class the port throws.
6
- *
7
- * `WasSyncConflictError` marks a conditional write rejected with `412
8
- * precondition-failed` (a lost-update conflict, or a create-if-absent whose
9
- * target already exists); the push handler catches exactly it to trigger the
10
- * re-read-and-report-conflict path. `WasSyncAuthError` marks a request refused
11
- * on authorization grounds -- `401`, `403`, or the `404` a WAS server masks a
12
- * failed capability invocation as, which on the sync paths (where the invoked
13
- * collection is known to exist) means the invocation was rejected. It keeps the
14
- * offending HTTP status on `status`, which the `/meta` push path reads to tell
15
- * a masked denial from an ordinary delete race.
16
- */
17
- export { WasSyncAuthError, WasSyncConflictError } from '@interop/was-client/sync';
18
- /**
19
- * Structural equality over two opaque bodies, by canonical-free JSON string.
20
- * Decides whether the content or the metadata half changed -- which endpoint(s)
21
- * a push writes, and whether two states compare equal for conflict resolution.
22
- * Content-addressed collections never mutate `data` for a given id, and a real
23
- * metadata edit re-encrypts to fresh bytes, so this coarse comparison suffices.
24
- *
25
- * @param left {Json | undefined}
26
- * @param right {Json | undefined}
27
- * @returns {boolean}
28
- */
29
- export function bodiesEqual(left, right) {
30
- return JSON.stringify(left ?? null) === JSON.stringify(right ?? null);
31
- }
32
- /**
33
- * Copies the {@link OptionalBodyFields} that are present on `source` onto
34
- * `target`, leaving an absent field absent (never writing an explicit
35
- * `undefined`, which would surface the key in a serialized body). The single
36
- * place every wire-to-local, feed-to-master, and master-to-conflict mapping
37
- * shares, so a new optional wire field is added once.
38
- *
39
- * @param options {object}
40
- * @param options.source {OptionalBodyFields}
41
- * @param options.target {OptionalBodyFields} mutated in place
42
- * @returns {void}
43
- */
44
- export function copyOptionalBodyFields({ source, target }) {
45
- if (source.data !== undefined) {
46
- target.data = source.data;
47
- }
48
- if (source.metaVersion !== undefined) {
49
- target.metaVersion = source.metaVersion;
50
- }
51
- if (source.custom !== undefined) {
52
- target.custom = source.custom;
53
- }
54
- if (source.epoch !== undefined) {
55
- target.epoch = source.epoch;
56
- }
57
- }
58
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sync/types.ts"],"names":[],"mappings":"AAgCA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,0BAA0B,CAAA;AA2BjC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW,CACzB,IAAsB,EACtB,KAAuB;IAEvB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,CAAA;AACvE,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,sBAAsB,CAAC,EACrC,MAAM,EACN,MAAM,EAIP;IACC,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;IAC3B,CAAC;IACD,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAA;IACzC,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IAC/B,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;IAC7B,CAAC;AACH,CAAC"}
@@ -1,47 +0,0 @@
1
- /*!
2
- * Copyright (c) 2026 Interop Alliance. All rights reserved.
3
- */
4
- /**
5
- * `createWasReplication` -- wires an RxDB collection to a remote WAS Collection
6
- * through the collection-agnostic pull/push handlers. This is the single public
7
- * entry point of the sync module; the caller supplies an already-open RxDB
8
- * collection and a {@link WasSyncPort} (its only WAS dependency), and gets back
9
- * the live `RxReplicationState` to observe (`error$` / `active$`) and control
10
- * (`reSync()` / `cancel()`).
11
- *
12
- * No React and no `@interop/was-client` imports -- only RxDB (the replication
13
- * engine being wrapped) and the injected port. This is the seam that keeps the
14
- * WAS access injectable.
15
- */
16
- import { type RxReplicationState } from 'rxdb/plugins/replication';
17
- import type { RxCollection } from 'rxdb/plugins/core';
18
- import type { SyncCheckpoint, SyncedDoc, WasSyncPort } from './types.js';
19
- /**
20
- * Starts (or configures) replication of one RxDB collection against a remote WAS
21
- * Collection. Poll-based only -- no `pull.stream$` (live streaming is deferred
22
- * server-side); RxDB's own `retryTime` backoff and `error$` are the reachability
23
- * signal (the replication attempt is the probe).
24
- *
25
- * @param options {object}
26
- * @param options.rxCollection {RxCollection<SyncedDoc>} the local replica
27
- * @param options.wasPort {WasSyncPort} injected WAS access
28
- * @param options.replicationIdentifier {string} stable id (include the server
29
- * URL + collection) so RxDB can resume across reloads
30
- * @param [options.batchSize] {number} pull `limit` / push batch (default 100)
31
- * @param [options.retryTime] {number} ms backoff between failed cycles
32
- * @param [options.live] {boolean} ongoing (default true) vs one-shot
33
- * @param [options.autoStart] {boolean} start immediately (default true)
34
- * @param [options.deletedField] {string} RxDB deleted flag (default `_deleted`)
35
- * @returns {RxReplicationState<SyncedDoc, SyncCheckpoint>}
36
- */
37
- export declare function createWasReplication({ rxCollection, wasPort, replicationIdentifier, batchSize, retryTime, live, autoStart, deletedField }: {
38
- rxCollection: RxCollection<SyncedDoc>;
39
- wasPort: WasSyncPort;
40
- replicationIdentifier: string;
41
- batchSize?: number;
42
- retryTime?: number;
43
- live?: boolean;
44
- autoStart?: boolean;
45
- deletedField?: string;
46
- }): RxReplicationState<SyncedDoc, SyncCheckpoint>;
47
- //# sourceMappingURL=wasReplication.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wasReplication.d.ts","sourceRoot":"","sources":["../../src/sync/wasReplication.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;GAWG;AACH,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAA;AACjC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AA2CxE;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,YAAY,EACZ,OAAO,EACP,qBAAqB,EACrB,SAAe,EACf,SAAS,EACT,IAAW,EACX,SAAgB,EAChB,YAAyB,EAC1B,EAAE;IACD,YAAY,EAAE,YAAY,CAAC,SAAS,CAAC,CAAA;IACrC,OAAO,EAAE,WAAW,CAAA;IACpB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,GAAG,kBAAkB,CAAC,SAAS,EAAE,cAAc,CAAC,CAiBhD"}
@@ -1,92 +0,0 @@
1
- /*!
2
- * Copyright (c) 2026 Interop Alliance. All rights reserved.
3
- */
4
- /**
5
- * `createWasReplication` -- wires an RxDB collection to a remote WAS Collection
6
- * through the collection-agnostic pull/push handlers. This is the single public
7
- * entry point of the sync module; the caller supplies an already-open RxDB
8
- * collection and a {@link WasSyncPort} (its only WAS dependency), and gets back
9
- * the live `RxReplicationState` to observe (`error$` / `active$`) and control
10
- * (`reSync()` / `cancel()`).
11
- *
12
- * No React and no `@interop/was-client` imports -- only RxDB (the replication
13
- * engine being wrapped) and the injected port. This is the seam that keeps the
14
- * WAS access injectable.
15
- */
16
- import { replicateRxCollection } from 'rxdb/plugins/replication';
17
- import { createPullHandler } from './changesQuery.js';
18
- import { createPushHandler } from './pushWrites.js';
19
- /**
20
- * Builds the push write-back: patches an accepted write's acked server
21
- * revision(s) (`version` / `metaVersion`) into the local row so the next
22
- * conditional write's `If-Match` matches the server. Skips rows that are gone
23
- * or already current (a tombstoned row is invisible to `findOne` and needs no
24
- * write-back -- nothing further is pushed for a deleted id). Failures are
25
- * swallowed: the write itself succeeded, and a missed write-back only means
26
- * the acked revision is adopted from the change feed's echo on a later pull.
27
- *
28
- * @param rxCollection {RxCollection<SyncedDoc>}
29
- * @returns {(ack: PushWriteAck) => Promise<void>}
30
- */
31
- function createAckWriteBack(rxCollection) {
32
- return async function writeBack(ack) {
33
- try {
34
- const doc = await rxCollection.findOne(ack.id).exec();
35
- if (doc === null) {
36
- return;
37
- }
38
- const patch = {};
39
- if (ack.version !== undefined && doc.get('version') !== ack.version) {
40
- patch.version = ack.version;
41
- }
42
- if (ack.metaVersion !== undefined &&
43
- doc.get('metaVersion') !== ack.metaVersion) {
44
- patch.metaVersion = ack.metaVersion;
45
- }
46
- if (Object.keys(patch).length > 0) {
47
- await doc.incrementalPatch(patch);
48
- }
49
- }
50
- catch {
51
- // Best-effort: the server write was accepted; the revision echo on the
52
- // next pull corrects the row if this local patch could not be applied.
53
- }
54
- };
55
- }
56
- /**
57
- * Starts (or configures) replication of one RxDB collection against a remote WAS
58
- * Collection. Poll-based only -- no `pull.stream$` (live streaming is deferred
59
- * server-side); RxDB's own `retryTime` backoff and `error$` are the reachability
60
- * signal (the replication attempt is the probe).
61
- *
62
- * @param options {object}
63
- * @param options.rxCollection {RxCollection<SyncedDoc>} the local replica
64
- * @param options.wasPort {WasSyncPort} injected WAS access
65
- * @param options.replicationIdentifier {string} stable id (include the server
66
- * URL + collection) so RxDB can resume across reloads
67
- * @param [options.batchSize] {number} pull `limit` / push batch (default 100)
68
- * @param [options.retryTime] {number} ms backoff between failed cycles
69
- * @param [options.live] {boolean} ongoing (default true) vs one-shot
70
- * @param [options.autoStart] {boolean} start immediately (default true)
71
- * @param [options.deletedField] {string} RxDB deleted flag (default `_deleted`)
72
- * @returns {RxReplicationState<SyncedDoc, SyncCheckpoint>}
73
- */
74
- export function createWasReplication({ rxCollection, wasPort, replicationIdentifier, batchSize = 100, retryTime, live = true, autoStart = true, deletedField = '_deleted' }) {
75
- return replicateRxCollection({
76
- replicationIdentifier,
77
- collection: rxCollection,
78
- deletedField,
79
- live,
80
- autoStart,
81
- ...(retryTime !== undefined && { retryTime }),
82
- pull: {
83
- handler: createPullHandler(wasPort),
84
- batchSize
85
- },
86
- push: {
87
- handler: createPushHandler(wasPort, createAckWriteBack(rxCollection)),
88
- batchSize
89
- }
90
- });
91
- }
92
- //# sourceMappingURL=wasReplication.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wasReplication.js","sourceRoot":"","sources":["../../src/sync/wasReplication.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;GAWG;AACH,OAAO,EACL,qBAAqB,EAEtB,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAqB,MAAM,iBAAiB,CAAA;AAEtE;;;;;;;;;;;GAWG;AACH,SAAS,kBAAkB,CAAC,YAAqC;IAC/D,OAAO,KAAK,UAAU,SAAS,CAAC,GAAiB;QAC/C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;YACrD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACjB,OAAM;YACR,CAAC;YACD,MAAM,KAAK,GAAuB,EAAE,CAAA;YACpC,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;gBACpE,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAA;YAC7B,CAAC;YACD,IACE,GAAG,CAAC,WAAW,KAAK,SAAS;gBAC7B,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC,WAAW,EAC1C,CAAC;gBACD,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,CAAA;YACrC,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClC,MAAM,GAAG,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;YACnC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,uEAAuE;YACvE,uEAAuE;QACzE,CAAC;IACH,CAAC,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,oBAAoB,CAAC,EACnC,YAAY,EACZ,OAAO,EACP,qBAAqB,EACrB,SAAS,GAAG,GAAG,EACf,SAAS,EACT,IAAI,GAAG,IAAI,EACX,SAAS,GAAG,IAAI,EAChB,YAAY,GAAG,UAAU,EAU1B;IACC,OAAO,qBAAqB,CAA4B;QACtD,qBAAqB;QACrB,UAAU,EAAE,YAAY;QACxB,YAAY;QACZ,IAAI;QACJ,SAAS;QACT,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,CAAC;QAC7C,IAAI,EAAE;YACJ,OAAO,EAAE,iBAAiB,CAAC,OAAO,CAAC;YACnC,SAAS;SACV;QACD,IAAI,EAAE;YACJ,OAAO,EAAE,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,CAAC,YAAY,CAAC,CAAC;YACrE,SAAS;SACV;KACF,CAAC,CAAA;AACJ,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"wasSyncPort.d.ts","sourceRoot":"","sources":["../../src/sync/wasSyncPort.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAA;AACzD,OAAO,KAAK,EAAkB,eAAe,EAAW,MAAM,YAAY,CAAA;AAE1E;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,GAAG,EACH,OAAO,EACP,YAAY,EACZ,UAAU,EACX,EAAE;IACD,GAAG,EAAE,SAAS,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,KAAK,CAAA;CACnB,GAAG,eAAe,CAqClB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"wasSyncPort.js","sourceRoot":"","sources":["../../src/sync/wasSyncPort.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,iBAAiB,IAAI,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAIpF;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAChC,GAAG,EACH,OAAO,EACP,YAAY,EACZ,UAAU,EAMX;IACC,MAAM,IAAI,GAAG,oBAAoB,CAAC;QAChC,GAAG;QACH,OAAO;QACP,YAAY;QACZ,GAAG,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,CAAC;QAC/C,aAAa,EAAE,IAAI;KACpB,CAAC,CAAA;IACF,8EAA8E;IAC9E,4EAA4E;IAC5E,4EAA4E;IAC5E,+BAA+B;IAC/B,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;IACxB,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,6DAA6D;YAC3D,iCAAiC,CACpC,CAAA;IACH,CAAC;IAED,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,OAAO;YACjB,sEAAsE;YACtE,qEAAqE;YACrE,uDAAuD;YACvD,OAAO,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAGhC,CAAA;QACH,CAAC;QAED,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAE/C,aAAa,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;QAErD,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;KACrC,CAAA;AACH,CAAC"}
File without changes