@sidhujag/sysweb3-keyring 2.1.3 → 2.1.4

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 (126) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +47 -47
  3. package/cjs/hardware-transaction-authority.js +36 -0
  4. package/cjs/hardware-transaction-authority.js.map +1 -0
  5. package/cjs/index.js +5 -5
  6. package/cjs/index.js.map +1 -1
  7. package/cjs/keyring-core.js +171 -220
  8. package/cjs/keyring-core.js.map +1 -1
  9. package/cjs/keyring-host.js +113 -0
  10. package/cjs/keyring-host.js.map +1 -0
  11. package/cjs/keyring-manager.js +15 -151
  12. package/cjs/keyring-manager.js.map +1 -1
  13. package/cjs/ledger/host-types.js.map +1 -1
  14. package/cjs/ledger/index.js +44 -19
  15. package/cjs/ledger/index.js.map +1 -1
  16. package/cjs/providers.js +3 -1
  17. package/cjs/providers.js.map +1 -1
  18. package/cjs/software.js +10 -56
  19. package/cjs/software.js.map +1 -1
  20. package/cjs/transactions/ethereum.js +306 -229
  21. package/cjs/transactions/ethereum.js.map +1 -1
  22. package/cjs/transactions/evm-local-signer.js +15 -0
  23. package/cjs/transactions/evm-local-signer.js.map +1 -1
  24. package/cjs/transactions/evm-submission.js +61 -65
  25. package/cjs/transactions/evm-submission.js.map +1 -1
  26. package/cjs/transactions/hardware-psbt.js +11 -8
  27. package/cjs/transactions/hardware-psbt.js.map +1 -1
  28. package/cjs/transactions/index.js +10 -2
  29. package/cjs/transactions/index.js.map +1 -1
  30. package/cjs/transactions/prepared-evm.js +10 -7
  31. package/cjs/transactions/prepared-evm.js.map +1 -1
  32. package/cjs/transactions/syscoin-core.js +282 -202
  33. package/cjs/transactions/syscoin-core.js.map +1 -1
  34. package/cjs/trezor/connect.js +19 -2
  35. package/cjs/trezor/connect.js.map +1 -1
  36. package/cjs/trezor/index.js +38 -16
  37. package/cjs/trezor/index.js.map +1 -1
  38. package/cjs/types.js.map +1 -1
  39. package/cjs/utils/owned-blockbook-account.js +45 -0
  40. package/cjs/utils/owned-blockbook-account.js.map +1 -0
  41. package/esm/current-vault-refusal.js +3 -0
  42. package/esm/current-vault-refusal.js.map +1 -0
  43. package/esm/evm-fees.js +242 -0
  44. package/esm/evm-fees.js.map +1 -0
  45. package/esm/hardware-transaction-authority.js +33 -0
  46. package/esm/hardware-transaction-authority.js.map +1 -0
  47. package/esm/initial-state.js +102 -0
  48. package/esm/initial-state.js.map +1 -0
  49. package/esm/keyring-core.js +2781 -0
  50. package/esm/keyring-core.js.map +1 -0
  51. package/esm/keyring-host.js +108 -0
  52. package/esm/keyring-host.js.map +1 -0
  53. package/esm/ledger/dmk-session.js +1 -0
  54. package/esm/ledger/dmk-session.js.map +1 -1
  55. package/esm/ledger/dmk-utxo.js +9 -3
  56. package/esm/ledger/dmk-utxo.js.map +1 -1
  57. package/esm/ledger/host-types.js.map +1 -1
  58. package/esm/ledger/index.js +44 -19
  59. package/esm/ledger/index.js.map +1 -1
  60. package/esm/network-utils.js +70 -0
  61. package/esm/network-utils.js.map +1 -0
  62. package/esm/providers.js +3 -1
  63. package/esm/providers.js.map +1 -1
  64. package/esm/software-hd-account.js +20 -0
  65. package/esm/software-hd-account.js.map +1 -0
  66. package/esm/storage-core.js +258 -0
  67. package/esm/storage-core.js.map +1 -0
  68. package/esm/transactions/ethereum.js +2753 -0
  69. package/esm/transactions/ethereum.js.map +1 -0
  70. package/esm/transactions/evm-cancellation.js +40 -0
  71. package/esm/transactions/evm-cancellation.js.map +1 -0
  72. package/esm/transactions/evm-local-signer.js +202 -0
  73. package/esm/transactions/evm-local-signer.js.map +1 -0
  74. package/esm/transactions/evm-submission.js +187 -0
  75. package/esm/transactions/evm-submission.js.map +1 -0
  76. package/esm/transactions/prepared-evm.js +194 -0
  77. package/esm/transactions/prepared-evm.js.map +1 -0
  78. package/esm/transactions/syscoin-core.js +691 -0
  79. package/esm/transactions/syscoin-core.js.map +1 -0
  80. package/esm/trezor/connect.js +19 -2
  81. package/esm/trezor/connect.js.map +1 -1
  82. package/esm/trezor/index.js +38 -16
  83. package/esm/trezor/index.js.map +1 -1
  84. package/esm/types.js.map +1 -1
  85. package/esm/utils/excluded-utxos.js +53 -0
  86. package/esm/utils/excluded-utxos.js.map +1 -0
  87. package/esm/utils/owned-blockbook-account.js +9 -0
  88. package/esm/utils/owned-blockbook-account.js.map +1 -0
  89. package/esm/utils/psbt.js +32 -0
  90. package/esm/utils/psbt.js.map +1 -0
  91. package/esm/utils/watch-descriptor.js +138 -0
  92. package/esm/utils/watch-descriptor.js.map +1 -0
  93. package/package.json +5 -11
  94. package/types/hardware-transaction-authority.d.ts +5 -0
  95. package/types/index.d.ts +3 -3
  96. package/types/keyring-core.d.ts +22 -51
  97. package/types/keyring-host.d.ts +46 -0
  98. package/types/keyring-manager.d.ts +13 -18
  99. package/types/ledger/host-types.d.ts +4 -1
  100. package/types/ledger/index.d.ts +1 -1
  101. package/types/ledger/types.d.ts +3 -2
  102. package/types/providers.d.ts +1 -1
  103. package/types/software.d.ts +6 -19
  104. package/types/transactions/ethereum.d.ts +14 -11
  105. package/types/transactions/evm-local-signer.d.ts +2 -2
  106. package/types/transactions/evm-submission.d.ts +11 -4
  107. package/types/transactions/hardware-psbt.d.ts +1 -1
  108. package/types/transactions/index.d.ts +3 -2
  109. package/types/transactions/prepared-evm.d.ts +4 -1
  110. package/types/transactions/syscoin-core.d.ts +48 -21
  111. package/types/trezor/connect.d.ts +6 -3
  112. package/types/trezor/index.d.ts +4 -3
  113. package/types/types.d.ts +95 -63
  114. package/types/utils/owned-blockbook-account.d.ts +3 -0
  115. package/cjs/hardware-wallet-manager-singleton.js +0 -34
  116. package/cjs/hardware-wallet-manager-singleton.js.map +0 -1
  117. package/cjs/storage.js +0 -20
  118. package/cjs/storage.js.map +0 -1
  119. package/cjs/transactions/syscoin.js +0 -16
  120. package/cjs/transactions/syscoin.js.map +0 -1
  121. package/cjs/utils/blockbook-cache.js +0 -76
  122. package/cjs/utils/blockbook-cache.js.map +0 -1
  123. package/types/hardware-wallet-manager-singleton.d.ts +0 -19
  124. package/types/storage.d.ts +0 -5
  125. package/types/transactions/syscoin.d.ts +0 -9
  126. package/types/utils/blockbook-cache.d.ts +0 -6
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.1.4
4
+
5
+ - Require a fixed keyring host with explicit storage and session authority. Device unlock remains an optional capability.
6
+ - Require transaction approval, exact signed-envelope validation and durable submission boundaries for EVM and UTXO sends. Ledger and Trezor signing use the same approval boundary as software signing.
7
+ - Use canonical base units for ERC-20 amounts and explicit owned endpoint verification for UTXO reads. Preserve existing vault readers and platform transports.
8
+
3
9
  ## 2.1.2
4
10
 
5
11
  - Preserve explicit hardware transaction nonces, including zero, instead of replacing them with the pending RPC nonce.
package/README.md CHANGED
@@ -40,20 +40,12 @@ values; the built-in memory client provides this operation synchronously.
40
40
  There is no sequential or unlocked fallback. A backend shared across storage
41
41
  partitions needs its own atomic implementation or a single owner.
42
42
 
43
- ### Release order for 1.0.613
44
-
45
- Publish `@sidhujag/sysweb3-core@1.0.29` before `@sidhujag/sysweb3-keyring@1.0.613`.
46
- The updated lock entry describes that intended dependency; its integrity is
47
- intentionally absent until publication. Regenerate and verify the lockfile from
48
- the published registry artifacts before a clean registry installation. Local
49
- validation uses the built package tarballs and does not establish publication.
50
-
51
43
  ## Installation
52
44
 
53
45
  ```bash
54
- npm install @sidhujag/sysweb3-keyring
46
+ npm install @sidhujag/sysweb3-keyring syscoinjs-lib@1.0.279
55
47
  # or
56
- yarn add @sidhujag/sysweb3-keyring
48
+ yarn add @sidhujag/sysweb3-keyring syscoinjs-lib@1.0.279
57
49
  ```
58
50
 
59
51
  ## Usage
@@ -61,19 +53,29 @@ yarn add @sidhujag/sysweb3-keyring
61
53
  ### Basic Setup
62
54
 
63
55
  ```javascript
64
- import { KeyringManager } from '@sidhujag/sysweb3-keyring';
56
+ import { createKeyringHost, KeyringManager } from '@sidhujag/sysweb3-keyring';
65
57
 
66
58
  // Create a vault state getter function (e.g., from Redux store)
67
59
  const vaultStateGetter = () => store.getState().vault;
68
60
 
69
- // Initialize the keyring manager
61
+ const walletHost = createKeyringHost(walletStorage);
62
+ const walletOptions = {
63
+ ledgerHost: authorizedLedgerHostPort,
64
+ captureEvmSubmission: captureReviewedSubmission,
65
+ };
70
66
  const keyringManager = await KeyringManager.createInitialized(
67
+ walletHost,
71
68
  seedPhrase,
72
69
  password,
73
- vaultStateGetter
70
+ vaultStateGetter,
71
+ walletOptions
74
72
  );
75
73
  ```
76
74
 
75
+ The application supplies fixed wallet storage and a durable submission
76
+ capability. The capability checks the active approval and persists exact
77
+ signed bytes before the SDK can broadcast them.
78
+
77
79
  ### Account Management
78
80
 
79
81
  ```javascript
@@ -108,38 +110,34 @@ const network = keyringManager.getNetwork();
108
110
  #### Syscoin (UTXO) Transactions
109
111
 
110
112
  ```javascript
111
- // Estimate transaction fee
112
- const feeEstimate =
113
- await keyringManager.syscoinTransaction.getEstimateSysTransactionFee({
114
- txOptions: {},
115
- amount: 1.0,
116
- receivingAddress: 'sys1q...',
117
- feeRate: 0.00001,
118
- token: null,
119
- });
120
-
121
- // Sign PSBT
122
- const signedPsbt = await keyringManager.syscoinTransaction.signPSBT({
123
- psbt: psbtData,
124
- isTrezor: false,
125
- isLedger: false,
126
- });
113
+ const quote = await keyringManager.syscoinTransaction.getEstimateSysTransactionFee(
114
+ { amount: reviewedAmount, receivingAddress: reviewedRecipient },
115
+ draftUtxoRead
116
+ );
127
117
 
128
- // Get addresses
129
- const receivingAddress = await keyringManager.updateReceivingAddress();
130
- const changeAddress = await keyringManager.getNewChangeAddress();
118
+ // Review the exact PSBT and capture its approval before signing.
119
+ const signedPsbt = await keyringManager.syscoinTransaction.signPSBT(
120
+ { psbt: reviewedPsbt },
121
+ approvedUtxoRead
122
+ );
123
+
124
+ const receivingAddress = await keyringManager.updateReceivingAddress(accountUtxoRead);
125
+ const changeAddress = await keyringManager.getNewChangeAddress(accountUtxoRead);
131
126
  ```
132
127
 
128
+ Each UTXO read owner supplies a bounded endpoint-specific `fetch`, an abort
129
+ signal and a synchronous account, network and session guard. A signing owner
130
+ also binds the approved PSBT to that context.
131
+
133
132
  #### Ethereum (EVM) Transactions
134
133
 
135
134
  ```javascript
136
- // Send transaction
137
- const txHash = await keyringManager.ethereumTransaction.sendTransaction({
138
- to: '0x...',
139
- value: '1000000000000000000', // 1 ETH in wei
140
- gasLimit: '21000',
141
- gasPrice: '20000000000', // 20 gwei
142
- });
135
+ // Submit a fully specified transaction after approval.
136
+ const submitted = await keyringManager.ethereumTransaction.sendFormattedTransaction(
137
+ reviewedTransaction,
138
+ undefined,
139
+ { mode: 'reviewed-native', assertCurrent: assertReviewCurrent }
140
+ );
143
141
 
144
142
  // Sign message
145
143
  const signature = await keyringManager.ethereumTransaction.signPersonalMessage([
@@ -212,7 +210,7 @@ const vaultStateGetter = () => ({
212
210
  });
213
211
 
214
212
  // The keyring manager will call this function to get current state
215
- const keyringManager = new KeyringManager();
213
+ const keyringManager = new KeyringManager(walletHost, walletOptions);
216
214
  keyringManager.setVaultStateGetter(vaultStateGetter);
217
215
  ```
218
216
 
@@ -231,7 +229,7 @@ The stateless design means:
231
229
 
232
230
  Main class for keyring operations:
233
231
 
234
- - `createInitialized(seedPhrase, password, vaultStateGetter)` - Create and initialize keyring
232
+ - `createInitialized(host, seedPhrase, password, vaultStateGetter, options)` - Create and initialize keyring
235
233
  - `addNewAccount(label?)` - Create new HD account
236
234
  - `setActiveAccount(id, type)` - Switch active account
237
235
  - `importAccount(privateKey, label?)` - Import account from private key
@@ -244,12 +242,11 @@ Main class for keyring operations:
244
242
  - `syscoinTransaction` - UTXO transaction operations
245
243
  - `ethereumTransaction` - EVM transaction operations
246
244
 
247
- For application-specific approval rules, pass an optional third argument to
248
- `ethereumTransaction.sendFormattedTransaction(params, isLegacy, { assertCurrent })`.
245
+ The formatted-send options require an explicit mode and an approval guard.
249
246
  The guard must return `undefined` synchronously or throw to deny the operation.
250
- It supplements the SDK's account, network and session checks and is rechecked
251
- after asynchronous preparation, immediately before signing, and before broadcast.
252
- It is not called after a broadcast acknowledgement to reclassify a sent transaction.
247
+ The SDK combines it with account, network and session checks at signing and
248
+ broadcast. Once broadcast is acknowledged, the transaction remains recorded
249
+ even if the approval has since expired.
253
250
 
254
251
  ### Hardware Wallet Support
255
252
 
@@ -339,7 +336,10 @@ const host = createLedgerDmkHost({
339
336
  });
340
337
 
341
338
  // Wallet authority: use a secured semantic port to that page, not a raw APDU port.
342
- const wallet = new KeyringManager(undefined, authorizedLedgerHostPort);
339
+ const wallet = new KeyringManager(walletHost, {
340
+ ledgerHost: authorizedLedgerHostPort,
341
+ captureEvmSubmission: captureReviewedSubmission,
342
+ });
343
343
  ```
344
344
 
345
345
  Use only the ESM host entry with a browser bundler and its required platform
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.captureHardwareTransactionAuthority = captureHardwareTransactionAuthority;
4
+ const retiredApproval = () => Object.assign(new Error('Hardware signing approval is no longer current'), {
5
+ name: 'AbortError',
6
+ code: 'HARDWARE_REQUEST_CANCELLED',
7
+ transactionNotBroadcast: true,
8
+ });
9
+ function captureHardwareTransactionAuthority(authority) {
10
+ const { assertCurrent: check, signal } = authority ?? {};
11
+ if (typeof check !== 'function' ||
12
+ typeof signal?.aborted !== 'boolean' ||
13
+ typeof signal.addEventListener !== 'function' ||
14
+ typeof signal.removeEventListener !== 'function')
15
+ throw retiredApproval();
16
+ const assertCurrent = () => {
17
+ if (signal.aborted)
18
+ throw retiredApproval();
19
+ let result;
20
+ try {
21
+ result = check();
22
+ }
23
+ catch {
24
+ throw retiredApproval();
25
+ }
26
+ if (result !== undefined) {
27
+ void Promise.resolve(result).catch(() => undefined);
28
+ throw retiredApproval();
29
+ }
30
+ if (signal.aborted)
31
+ throw retiredApproval();
32
+ };
33
+ assertCurrent();
34
+ return Object.freeze({ assertCurrent, signal });
35
+ }
36
+ //# sourceMappingURL=hardware-transaction-authority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hardware-transaction-authority.js","sourceRoot":"","sources":["../../src/hardware-transaction-authority.ts"],"names":[],"mappings":";;AAYA,kFA4BC;AAnCD,MAAM,eAAe,GAAG,GAAG,EAAE,CAC3B,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gDAAgD,CAAC,EAAE;IACzE,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,4BAA4B;IAClC,uBAAuB,EAAE,IAAI;CAC9B,CAAC,CAAC;AAEL,SAAgB,mCAAmC,CACjD,SAAuC;IAEvC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,IAAI,EAAE,CAAC;IACzD,IACE,OAAO,KAAK,KAAK,UAAU;QAC3B,OAAO,MAAM,EAAE,OAAO,KAAK,SAAS;QACpC,OAAO,MAAM,CAAC,gBAAgB,KAAK,UAAU;QAC7C,OAAO,MAAM,CAAC,mBAAmB,KAAK,UAAU;QAEhD,MAAM,eAAe,EAAE,CAAC;IAE1B,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,IAAI,MAAM,CAAC,OAAO;YAAE,MAAM,eAAe,EAAE,CAAC;QAC5C,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,KAAK,EAAE,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,KAAK,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACpD,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,MAAM,CAAC,OAAO;YAAE,MAAM,eAAe,EAAE,CAAC;IAC9C,CAAC,CAAC;IACF,aAAa,EAAE,CAAC;IAChB,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC;AAClD,CAAC"}
package/cjs/index.js CHANGED
@@ -14,13 +14,16 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.descriptorChecksum = exports.deriveDescriptorAddress = exports.invalidateBlockbookAccountCache = exports.PsbtUtils = exports.MAX_PRIVATE_RECORD_LABEL_BYTES = exports.MAX_PRIVATE_RECORD_BYTES = void 0;
17
+ exports.descriptorChecksum = exports.deriveDescriptorAddress = exports.PsbtUtils = exports.MAX_PRIVATE_RECORD_LABEL_BYTES = exports.MAX_PRIVATE_RECORD_BYTES = exports.createKeyringHost = exports.VaultAuthenticationError = void 0;
18
18
  __exportStar(require("./transactions"), exports);
19
19
  __exportStar(require("./types"), exports);
20
- __exportStar(require("./storage"), exports);
20
+ var storage_core_1 = require("./storage-core");
21
+ Object.defineProperty(exports, "VaultAuthenticationError", { enumerable: true, get: function () { return storage_core_1.VaultAuthenticationError; } });
21
22
  __exportStar(require("./signers"), exports);
22
23
  __exportStar(require("./initial-state"), exports);
23
24
  __exportStar(require("./keyring-manager"), exports);
25
+ var keyring_host_1 = require("./keyring-host");
26
+ Object.defineProperty(exports, "createKeyringHost", { enumerable: true, get: function () { return keyring_host_1.createKeyringHost; } });
24
27
  var private_records_1 = require("./private-records");
25
28
  Object.defineProperty(exports, "MAX_PRIVATE_RECORD_BYTES", { enumerable: true, get: function () { return private_records_1.MAX_PRIVATE_RECORD_BYTES; } });
26
29
  Object.defineProperty(exports, "MAX_PRIVATE_RECORD_LABEL_BYTES", { enumerable: true, get: function () { return private_records_1.MAX_PRIVATE_RECORD_LABEL_BYTES; } });
@@ -28,11 +31,8 @@ __exportStar(require("./providers"), exports);
28
31
  __exportStar(require("./utils/derivation-paths"), exports);
29
32
  __exportStar(require("./network-utils"), exports);
30
33
  __exportStar(require("./hardware-wallet-manager"), exports);
31
- __exportStar(require("./hardware-wallet-manager-singleton"), exports);
32
34
  var psbt_1 = require("./utils/psbt");
33
35
  Object.defineProperty(exports, "PsbtUtils", { enumerable: true, get: function () { return psbt_1.PsbtUtils; } });
34
- var blockbook_cache_1 = require("./utils/blockbook-cache");
35
- Object.defineProperty(exports, "invalidateBlockbookAccountCache", { enumerable: true, get: function () { return blockbook_cache_1.invalidateBlockbookAccountCache; } });
36
36
  var watch_descriptor_1 = require("./utils/watch-descriptor");
37
37
  Object.defineProperty(exports, "deriveDescriptorAddress", { enumerable: true, get: function () { return watch_descriptor_1.deriveDescriptorAddress; } });
38
38
  Object.defineProperty(exports, "descriptorChecksum", { enumerable: true, get: function () { return watch_descriptor_1.descriptorChecksum; } });
package/cjs/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,0CAAwB;AACxB,4CAA0B;AAC1B,4CAA0B;AAC1B,kDAAgC;AAChC,oDAAkC;AAClC,qDAG2B;AAFzB,2HAAA,wBAAwB,OAAA;AACxB,iIAAA,8BAA8B,OAAA;AAOhC,8CAA4B;AAC5B,2DAAyC;AACzC,kDAAgC;AAChC,4DAA0C;AAC1C,sEAAoD;AACpD,qCAAyC;AAAhC,iGAAA,SAAS,OAAA;AAClB,2DAA0E;AAAjE,kIAAA,+BAA+B,OAAA;AACxC,6DAGkC;AAFhC,2HAAA,uBAAuB,OAAA;AACvB,sHAAA,kBAAkB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,0CAAwB;AACxB,+CAA0D;AAAjD,wHAAA,wBAAwB,OAAA;AACjC,4CAA0B;AAC1B,kDAAgC;AAChC,oDAAkC;AAClC,+CAAmD;AAA1C,iHAAA,iBAAiB,OAAA;AAE1B,qDAG2B;AAFzB,2HAAA,wBAAwB,OAAA;AACxB,iIAAA,8BAA8B,OAAA;AAOhC,8CAA4B;AAC5B,2DAAyC;AACzC,kDAAgC;AAChC,4DAA0C;AAC1C,qCAAyC;AAAhC,iGAAA,SAAS,OAAA;AAClB,6DAGkC;AAFhC,2HAAA,uBAAuB,OAAA;AACvB,sHAAA,kBAAkB,OAAA"}