@hsuite/native-connect-angular 2.1.0 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/coverage/coverage-summary.json +25 -21
- package/coverage/index.html +108 -108
- package/coverage/lcov-report/index.html +108 -108
- package/coverage/lcov-report/lib/components/account-selector/account-actions/account-actions.component.ts.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/account-actions/index.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/account-filter/account-filter.component.ts.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/account-filter/index.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/account-formatting.service.ts.html +13 -19
- package/coverage/lcov-report/lib/components/account-selector/account-grouping.service.ts.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/account-list/account-list.component.ts.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/account-list/index.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/account-selector.component.ts.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/account-selector.service.ts.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/index.html +5 -5
- package/coverage/lcov-report/lib/components/wallet-account-display/index.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-account-display/wallet-account-display.component.ts.html +10 -10
- package/coverage/lcov-report/lib/components/wallet-connect-button/index.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-connect-prompt/index.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-connected-guard/index.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/index.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-connection-modal/index.html +15 -15
- package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/index.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +84 -36
- package/coverage/lcov-report/lib/components/wallet-session-display/index.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-session-display/wallet-session-display.component.ts.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-transaction-status/index.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +1 -1
- package/coverage/lcov-report/lib/directives/index.html +1 -1
- package/coverage/lcov-report/lib/directives/wallet-connected.directive.ts.html +1 -1
- package/coverage/lcov-report/lib/directives/wallet-context.directive.ts.html +1 -1
- package/coverage/lcov-report/lib/directives/wallet-events.directive.ts.html +1 -1
- package/coverage/lcov-report/lib/hsuite-wallet.module.ts.html +1 -1
- package/coverage/lcov-report/lib/index.html +1 -1
- package/coverage/lcov-report/lib/models/connection-config.model.ts.html +1 -1
- package/coverage/lcov-report/lib/models/index.html +7 -7
- package/coverage/lcov-report/lib/models/provider-types.ts.html +11 -5
- package/coverage/lcov-report/lib/providers/base-wallet-provider.ts.html +20 -20
- package/coverage/lcov-report/lib/providers/hsuite-native/channel-client.service.ts.html +639 -636
- package/coverage/lcov-report/lib/providers/hsuite-native/index.html +19 -19
- package/coverage/lcov-report/lib/providers/hsuite-native-provider.ts.html +1 -1
- package/coverage/lcov-report/lib/providers/index.html +18 -18
- package/coverage/lcov-report/lib/providers/p2p-native/index.html +22 -22
- package/coverage/lcov-report/lib/providers/p2p-native/p2p-native.provider.ts.html +993 -993
- package/coverage/lcov-report/lib/providers/p2p-native/p2p-session-manager.ts.html +7 -4
- package/coverage/lcov-report/lib/providers/wallet-error-handler.ts.html +1 -1
- package/coverage/lcov-report/lib/providers/walletconnect/core/index.html +65 -65
- package/coverage/lcov-report/lib/providers/walletconnect/core/session-health.ts.html +240 -240
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +559 -559
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-provider.ts.html +1108 -1105
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +493 -493
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +366 -366
- package/coverage/lcov-report/lib/providers/walletconnect/signers/hedera-signer.ts.html +730 -730
- package/coverage/lcov-report/lib/providers/walletconnect/signers/index.html +43 -43
- package/coverage/lcov-report/lib/providers/walletconnect/signers/signer-factory.ts.html +234 -234
- package/coverage/lcov-report/lib/providers/walletconnect/signers/xrpl-signer.ts.html +650 -650
- package/coverage/lcov-report/lib/services/hsuite-auth.interceptor.ts.html +568 -0
- package/coverage/lcov-report/lib/services/index.html +50 -20
- package/coverage/lcov-report/lib/services/logger.service.ts.html +1 -1
- package/coverage/lcov-report/lib/services/smart-session.service.ts.html +1264 -0
- package/coverage/lcov-report/lib/services/transaction-builders/active-account-source.ts.html +250 -0
- package/coverage/lcov-report/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1 -1
- package/coverage/lcov-report/lib/services/transaction-builders/hedera-amount-utils.ts.html +155 -155
- package/coverage/lcov-report/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +2156 -2156
- package/coverage/lcov-report/lib/services/transaction-builders/index.html +58 -43
- package/coverage/lcov-report/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +1674 -1674
- package/coverage/lcov-report/lib/services/transaction.service.ts.html +4 -4
- package/coverage/lcov-report/lib/services/unified-wallet.service.ts.html +3 -3
- package/coverage/lcov-report/lib/services/wallet-context.service.ts.html +1 -1
- package/coverage/lcov-report/lib/services/wallet-event-bus.service.ts.html +249 -249
- package/coverage/lcov-report/lib/services/wallet-providers.service.ts.html +1 -1
- package/coverage/lcov-report/lib/transports/chrome-extension-transport.ts.html +1 -1
- package/coverage/lcov-report/lib/transports/index.html +1 -1
- package/coverage/lcov-report/lib/utils/index.html +36 -21
- package/coverage/lcov-report/lib/utils/ledger-icons.util.ts.html +254 -161
- package/coverage/lcov-report/lib/utils/ledger-ui-registry.ts.html +676 -0
- package/coverage/lcov.info +8567 -6896
- package/coverage/lib/components/account-selector/account-actions/account-actions.component.ts.html +1 -1
- package/coverage/lib/components/account-selector/account-actions/index.html +1 -1
- package/coverage/lib/components/account-selector/account-filter/account-filter.component.ts.html +1 -1
- package/coverage/lib/components/account-selector/account-filter/index.html +1 -1
- package/coverage/lib/components/account-selector/account-formatting.service.ts.html +13 -19
- package/coverage/lib/components/account-selector/account-grouping.service.ts.html +1 -1
- package/coverage/lib/components/account-selector/account-list/account-list.component.ts.html +1 -1
- package/coverage/lib/components/account-selector/account-list/index.html +1 -1
- package/coverage/lib/components/account-selector/account-selector.component.ts.html +1 -1
- package/coverage/lib/components/account-selector/account-selector.service.ts.html +1 -1
- package/coverage/lib/components/account-selector/index.html +5 -5
- package/coverage/lib/components/wallet-account-display/index.html +1 -1
- package/coverage/lib/components/wallet-account-display/wallet-account-display.component.ts.html +10 -10
- package/coverage/lib/components/wallet-connect-button/index.html +1 -1
- package/coverage/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +1 -1
- package/coverage/lib/components/wallet-connect-prompt/index.html +1 -1
- package/coverage/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +1 -1
- package/coverage/lib/components/wallet-connected-guard/index.html +1 -1
- package/coverage/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +1 -1
- package/coverage/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +1 -1
- package/coverage/lib/components/wallet-connection-modal/connection-method-step/index.html +1 -1
- package/coverage/lib/components/wallet-connection-modal/index.html +15 -15
- package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/index.html +1 -1
- package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +1 -1
- package/coverage/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +84 -36
- package/coverage/lib/components/wallet-session-display/index.html +1 -1
- package/coverage/lib/components/wallet-session-display/wallet-session-display.component.ts.html +1 -1
- package/coverage/lib/components/wallet-transaction-status/index.html +1 -1
- package/coverage/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +1 -1
- package/coverage/lib/directives/index.html +1 -1
- package/coverage/lib/directives/wallet-connected.directive.ts.html +1 -1
- package/coverage/lib/directives/wallet-context.directive.ts.html +1 -1
- package/coverage/lib/directives/wallet-events.directive.ts.html +1 -1
- package/coverage/lib/hsuite-wallet.module.ts.html +1 -1
- package/coverage/lib/index.html +1 -1
- package/coverage/lib/models/connection-config.model.ts.html +1 -1
- package/coverage/lib/models/index.html +7 -7
- package/coverage/lib/models/provider-types.ts.html +11 -5
- package/coverage/lib/providers/base-wallet-provider.ts.html +20 -20
- package/coverage/lib/providers/hsuite-native/channel-client.service.ts.html +639 -636
- package/coverage/lib/providers/hsuite-native/index.html +19 -19
- package/coverage/lib/providers/hsuite-native-provider.ts.html +1 -1
- package/coverage/lib/providers/index.html +18 -18
- package/coverage/lib/providers/p2p-native/index.html +22 -22
- package/coverage/lib/providers/p2p-native/p2p-native.provider.ts.html +993 -993
- package/coverage/lib/providers/p2p-native/p2p-session-manager.ts.html +7 -4
- package/coverage/lib/providers/wallet-error-handler.ts.html +1 -1
- package/coverage/lib/providers/walletconnect/core/index.html +65 -65
- package/coverage/lib/providers/walletconnect/core/session-health.ts.html +240 -240
- package/coverage/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +559 -559
- package/coverage/lib/providers/walletconnect/core/walletconnect-provider.ts.html +1108 -1105
- package/coverage/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +493 -493
- package/coverage/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +366 -366
- package/coverage/lib/providers/walletconnect/signers/hedera-signer.ts.html +730 -730
- package/coverage/lib/providers/walletconnect/signers/index.html +43 -43
- package/coverage/lib/providers/walletconnect/signers/signer-factory.ts.html +234 -234
- package/coverage/lib/providers/walletconnect/signers/xrpl-signer.ts.html +650 -650
- package/coverage/lib/services/hsuite-auth.interceptor.ts.html +568 -0
- package/coverage/lib/services/index.html +50 -20
- package/coverage/lib/services/logger.service.ts.html +1 -1
- package/coverage/lib/services/smart-session.service.ts.html +1264 -0
- package/coverage/lib/services/transaction-builders/active-account-source.ts.html +250 -0
- package/coverage/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1 -1
- package/coverage/lib/services/transaction-builders/hedera-amount-utils.ts.html +155 -155
- package/coverage/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +2156 -2156
- package/coverage/lib/services/transaction-builders/index.html +58 -43
- package/coverage/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +1674 -1674
- package/coverage/lib/services/transaction.service.ts.html +4 -4
- package/coverage/lib/services/unified-wallet.service.ts.html +3 -3
- package/coverage/lib/services/wallet-context.service.ts.html +1 -1
- package/coverage/lib/services/wallet-event-bus.service.ts.html +249 -249
- package/coverage/lib/services/wallet-providers.service.ts.html +1 -1
- package/coverage/lib/transports/chrome-extension-transport.ts.html +1 -1
- package/coverage/lib/transports/index.html +1 -1
- package/coverage/lib/utils/index.html +36 -21
- package/coverage/lib/utils/ledger-icons.util.ts.html +254 -161
- package/coverage/lib/utils/ledger-ui-registry.ts.html +676 -0
- package/dist/fesm2022/hsuite-native-connect-angular.mjs +854 -308
- package/dist/fesm2022/hsuite-native-connect-angular.mjs.map +1 -1
- package/dist/index.d.ts +456 -30
- package/package.json +4 -4
- package/src/index.ts +26 -0
- package/src/lib/components/account-selector/account-formatting.service.ts +8 -10
- package/src/lib/components/wallet-account-display/wallet-account-display.component.ts +9 -9
- package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts +34 -18
- package/src/lib/models/provider-types.ts +3 -1
- package/src/lib/models/unified-account.model.ts +4 -1
- package/src/lib/providers/hsuite-native/channel-client.service.ts +1 -0
- package/src/lib/providers/p2p-native/p2p-session-manager.ts +1 -0
- package/src/lib/providers/walletconnect/core/walletconnect-provider.ts +2 -1
- package/src/lib/services/hsuite-auth.interceptor.ts +159 -0
- package/src/lib/services/smart-session.service.ts +378 -0
- package/src/lib/services/transaction-builders/active-account-source.spec.ts +75 -0
- package/src/lib/services/transaction-builders/active-account-source.ts +55 -0
- package/src/lib/services/transaction-builders/hedera-transaction-builder.service.ts +4 -4
- package/src/lib/services/transaction-builders/index.ts +1 -0
- package/src/lib/services/transaction.service.ts +7 -3
- package/src/lib/services/unified-wallet.service.spec.ts +1 -1
- package/src/lib/services/unified-wallet.service.ts +2 -2
- package/src/lib/utils/index.ts +1 -0
- package/src/lib/utils/ledger-icons.util.ts +61 -30
- package/src/lib/utils/ledger-ui-registry.ts +197 -0
package/coverage/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html
CHANGED
|
@@ -23,30 +23,30 @@
|
|
|
23
23
|
<div class='clearfix'>
|
|
24
24
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">
|
|
26
|
+
<span class="strong">81.4% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>1046/1285</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">
|
|
33
|
+
<span class="strong">73.63% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>81/110</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
<div class='fl pad1y space-right2'>
|
|
40
|
-
<span class="strong">
|
|
40
|
+
<span class="strong">80% </span>
|
|
41
41
|
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>
|
|
42
|
+
<span class='fraction'>20/25</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">
|
|
47
|
+
<span class="strong">81.4% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>1046/1285</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
</div>
|
|
62
62
|
</template>
|
|
63
63
|
</div>
|
|
64
|
-
<div class='status-line
|
|
64
|
+
<div class='status-line high'></div>
|
|
65
65
|
<pre><table class="coverage">
|
|
66
66
|
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
67
|
<a name='L2'></a><a href='#L2'>2</a>
|
|
@@ -1348,8 +1348,876 @@
|
|
|
1348
1348
|
<a name='L1283'></a><a href='#L1283'>1283</a>
|
|
1349
1349
|
<a name='L1284'></a><a href='#L1284'>1284</a>
|
|
1350
1350
|
<a name='L1285'></a><a href='#L1285'>1285</a>
|
|
1351
|
-
<a name='L1286'></a><a href='#L1286'>1286</a></td><td class="line-coverage quiet"><span class="cline-any cline-
|
|
1351
|
+
<a name='L1286'></a><a href='#L1286'>1286</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
|
|
1352
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1353
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1354
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1355
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1356
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1357
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1358
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1359
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1360
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1361
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1362
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1363
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1364
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1365
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1366
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1367
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1368
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1369
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1370
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1371
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1372
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1373
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1374
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1375
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1376
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1377
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1378
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1379
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1380
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1381
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1382
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1383
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1384
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1385
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1386
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1387
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1388
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1389
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1390
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1391
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1392
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1393
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1394
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1395
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1396
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1397
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1398
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1399
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1400
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1401
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1402
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1403
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1404
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1405
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1406
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1407
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1408
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1409
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1410
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1411
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1412
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1413
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1414
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1415
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1416
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1417
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1418
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1419
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1420
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1421
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1422
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1423
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1424
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1425
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1426
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1427
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1428
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1429
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1430
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1431
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1432
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1433
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1434
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1435
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1436
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1437
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1438
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1439
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1440
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1441
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1442
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1443
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1444
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1445
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1446
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1447
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1448
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1449
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1450
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1451
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1452
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1453
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1454
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1455
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1456
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1457
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1458
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1459
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1460
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1461
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1462
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1463
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1464
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1465
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1466
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1467
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1468
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1469
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1470
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1471
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1472
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1473
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1474
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1475
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1476
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1477
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1478
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1479
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1480
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1481
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1482
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1483
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1484
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1485
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1486
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1487
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1488
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1489
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1490
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1491
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1492
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1493
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1494
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1495
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1496
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1497
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1498
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1499
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1500
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1501
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1502
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1503
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1504
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1505
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1506
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1507
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1508
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1509
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1510
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1511
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1512
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1513
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1514
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1515
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1516
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1517
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1518
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1519
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1520
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1521
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1522
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1523
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1524
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1525
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1526
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1527
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1528
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1529
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1530
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1531
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1532
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1533
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1534
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1535
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1536
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1537
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1538
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1539
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1540
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1541
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1542
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1543
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1544
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1545
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1546
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1547
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1548
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1549
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1550
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1551
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1552
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1553
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1554
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1555
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1556
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1557
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1558
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1559
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1560
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1561
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1562
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1563
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1564
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1565
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1566
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1567
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1568
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1569
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1570
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1571
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1572
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1573
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1574
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1575
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1576
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1577
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1578
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1579
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1580
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1581
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1582
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1583
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1584
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1585
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1586
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1587
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1588
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1589
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1590
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1591
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1592
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1593
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1594
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1595
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1596
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1597
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1598
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1599
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1600
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1601
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1602
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1603
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1604
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1605
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1606
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1607
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1608
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1609
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1610
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1611
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1612
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1613
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1614
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1615
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1616
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1617
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1618
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1619
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1620
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1621
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1622
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1623
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1624
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1625
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1626
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1627
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1628
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1629
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1630
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1631
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1632
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1633
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1634
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1635
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1636
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1637
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1638
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1639
|
+
<span class="cline-any cline-yes">43x</span>
|
|
1640
|
+
<span class="cline-any cline-yes">43x</span>
|
|
1641
|
+
<span class="cline-any cline-yes">43x</span>
|
|
1642
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1643
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1644
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1645
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1646
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1647
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1648
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1649
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1650
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1651
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1652
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1653
|
+
<span class="cline-any cline-yes">67x</span>
|
|
1654
|
+
<span class="cline-any cline-yes">40x</span>
|
|
1655
|
+
<span class="cline-any cline-yes">40x</span>
|
|
1656
|
+
<span class="cline-any cline-yes">27x</span>
|
|
1657
|
+
<span class="cline-any cline-yes">27x</span>
|
|
1658
|
+
<span class="cline-any cline-yes">67x</span>
|
|
1659
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1660
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1661
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1662
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1663
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1664
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1665
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1666
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1667
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1668
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1669
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1670
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1671
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1672
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1673
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1674
|
+
<span class="cline-any cline-no"> </span>
|
|
1675
|
+
<span class="cline-any cline-no"> </span>
|
|
1676
|
+
<span class="cline-any cline-yes">67x</span>
|
|
1677
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1678
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1679
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1680
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1681
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1682
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1683
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1684
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1685
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1686
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1687
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1688
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1689
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1690
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1691
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1692
|
+
<span class="cline-any cline-no"> </span>
|
|
1693
|
+
<span class="cline-any cline-no"> </span>
|
|
1694
|
+
<span class="cline-any cline-no"> </span>
|
|
1695
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1696
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1697
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1698
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1699
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1700
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1701
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1702
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1703
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1704
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1705
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1706
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1707
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1708
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1709
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1710
|
+
<span class="cline-any cline-no"> </span>
|
|
1711
|
+
<span class="cline-any cline-no"> </span>
|
|
1712
|
+
<span class="cline-any cline-no"> </span>
|
|
1713
|
+
<span class="cline-any cline-no"> </span>
|
|
1714
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1715
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1716
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1717
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1718
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1719
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1720
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1721
|
+
<span class="cline-any cline-no"> </span>
|
|
1722
|
+
<span class="cline-any cline-no"> </span>
|
|
1723
|
+
<span class="cline-any cline-no"> </span>
|
|
1724
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1725
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1726
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1727
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1728
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1729
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1730
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1731
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1732
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1733
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1734
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1735
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1736
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1737
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1738
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1739
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1740
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1741
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1742
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1743
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1744
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1745
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1746
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1747
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1748
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1749
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1750
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1751
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1752
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1753
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1754
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1755
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1756
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1757
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1758
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1759
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1760
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1761
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1762
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1763
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1764
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1765
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1766
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1767
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1768
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1769
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1770
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1771
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1772
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1773
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1774
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1775
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1776
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1777
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1778
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1779
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1780
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1781
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1782
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1783
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1784
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1785
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1786
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1787
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1788
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1789
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1790
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1791
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1792
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1793
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1794
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1795
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1796
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1797
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1798
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1799
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1800
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1801
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1802
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1803
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1804
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1805
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1806
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1807
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1808
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1809
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1810
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1811
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1812
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1813
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1814
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1815
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1816
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1817
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1818
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1819
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1820
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1821
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1822
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1823
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1824
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1825
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1826
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1827
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1828
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1829
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1830
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1831
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1832
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1833
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1834
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1835
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1836
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1837
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1838
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1839
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1840
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1841
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1842
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1843
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1844
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1845
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1846
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1847
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1848
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1849
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1850
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1851
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1852
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1853
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1854
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1855
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1856
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1857
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1858
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1859
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1860
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1861
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1862
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1863
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1864
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1865
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1866
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1867
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1868
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1869
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1870
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1871
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1872
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1873
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1874
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1875
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1876
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1877
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1878
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1879
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1880
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1881
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1882
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1883
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1884
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1885
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1886
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1887
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1888
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1889
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1890
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1891
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1892
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1893
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1894
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1895
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1896
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1897
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1898
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1899
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1900
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1901
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1902
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1903
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1904
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1905
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1906
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1907
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1908
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1909
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1910
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1911
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1912
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1913
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1914
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1915
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1916
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1917
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1918
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1919
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1920
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1921
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1922
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1923
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1924
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1925
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1926
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1927
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1928
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1929
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1930
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1931
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1932
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1933
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1934
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1935
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1936
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1937
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1938
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1939
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1940
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1941
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1942
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1943
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1944
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1945
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1946
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1947
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1948
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1949
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1950
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1951
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1952
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1953
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1954
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1955
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1956
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1957
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1958
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1959
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1960
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1961
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1962
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1963
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1964
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1965
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1966
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1967
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1968
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1969
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1970
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1971
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1972
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1973
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1974
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1975
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1976
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1977
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1978
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1979
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1980
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1981
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1982
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1983
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1984
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1985
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1986
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1987
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1988
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1989
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1990
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1991
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1992
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1993
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1994
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1995
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1996
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1997
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1998
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1999
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2000
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2001
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2002
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2003
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2004
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2005
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2006
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2007
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2008
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2009
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2010
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2011
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2012
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2013
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2014
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2015
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2016
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2017
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2018
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2019
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2020
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2021
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2022
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2023
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2024
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2025
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2026
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2027
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2028
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2029
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2030
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2031
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2032
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2033
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2034
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2035
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2036
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2037
|
+
<span class="cline-any cline-no"> </span>
|
|
2038
|
+
<span class="cline-any cline-no"> </span>
|
|
2039
|
+
<span class="cline-any cline-no"> </span>
|
|
2040
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2041
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2042
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2043
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2044
|
+
<span class="cline-any cline-no"> </span>
|
|
2045
|
+
<span class="cline-any cline-no"> </span>
|
|
2046
|
+
<span class="cline-any cline-no"> </span>
|
|
2047
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2048
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2049
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2050
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2051
|
+
<span class="cline-any cline-no"> </span>
|
|
2052
|
+
<span class="cline-any cline-no"> </span>
|
|
2053
|
+
<span class="cline-any cline-no"> </span>
|
|
2054
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2055
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2056
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2057
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2058
|
+
<span class="cline-any cline-no"> </span>
|
|
2059
|
+
<span class="cline-any cline-no"> </span>
|
|
2060
|
+
<span class="cline-any cline-no"> </span>
|
|
2061
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2062
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2063
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2064
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2065
|
+
<span class="cline-any cline-no"> </span>
|
|
2066
|
+
<span class="cline-any cline-no"> </span>
|
|
2067
|
+
<span class="cline-any cline-no"> </span>
|
|
2068
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2069
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2070
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2071
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2072
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2073
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2074
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2075
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2076
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2077
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2078
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2079
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2080
|
+
<span class="cline-any cline-no"> </span>
|
|
2081
|
+
<span class="cline-any cline-no"> </span>
|
|
2082
|
+
<span class="cline-any cline-no"> </span>
|
|
2083
|
+
<span class="cline-any cline-no"> </span>
|
|
2084
|
+
<span class="cline-any cline-no"> </span>
|
|
2085
|
+
<span class="cline-any cline-no"> </span>
|
|
2086
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2087
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2088
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2089
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2090
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2091
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2092
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2093
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2094
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2095
|
+
<span class="cline-any cline-no"> </span>
|
|
2096
|
+
<span class="cline-any cline-no"> </span>
|
|
2097
|
+
<span class="cline-any cline-no"> </span>
|
|
2098
|
+
<span class="cline-any cline-no"> </span>
|
|
2099
|
+
<span class="cline-any cline-no"> </span>
|
|
2100
|
+
<span class="cline-any cline-no"> </span>
|
|
2101
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2102
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2103
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2104
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2105
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2106
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2107
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2108
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2109
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2110
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2111
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2112
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2113
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2114
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2115
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2116
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2117
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2118
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2119
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2120
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2121
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2122
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2123
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2124
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2125
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2126
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2127
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2128
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2129
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2130
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2131
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2132
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2133
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2134
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2135
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2136
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2137
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2138
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2139
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2140
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2141
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2142
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2143
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2144
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2145
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2146
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2147
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2148
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2149
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2150
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2151
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2152
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2153
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2154
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2155
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2156
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2157
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2158
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2159
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2160
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2161
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2162
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2163
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2164
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2165
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2166
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2167
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2168
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2169
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2170
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2171
|
+
<span class="cline-any cline-no"> </span>
|
|
2172
|
+
<span class="cline-any cline-no"> </span>
|
|
2173
|
+
<span class="cline-any cline-no"> </span>
|
|
2174
|
+
<span class="cline-any cline-no"> </span>
|
|
2175
|
+
<span class="cline-any cline-no"> </span>
|
|
2176
|
+
<span class="cline-any cline-no"> </span>
|
|
2177
|
+
<span class="cline-any cline-no"> </span>
|
|
2178
|
+
<span class="cline-any cline-no"> </span>
|
|
2179
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2180
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2181
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2182
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2183
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2184
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2185
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2186
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2187
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2188
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2189
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2190
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2191
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2192
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2193
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2194
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2195
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2196
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2197
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2198
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2199
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1352
2200
|
<span class="cline-any cline-no"> </span>
|
|
2201
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2202
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2203
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2204
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2205
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2206
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2207
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2208
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2209
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2210
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2211
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2212
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2213
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2214
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2215
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2216
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2217
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2218
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2219
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2220
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1353
2221
|
<span class="cline-any cline-no"> </span>
|
|
1354
2222
|
<span class="cline-any cline-no"> </span>
|
|
1355
2223
|
<span class="cline-any cline-no"> </span>
|
|
@@ -1357,6 +2225,46 @@
|
|
|
1357
2225
|
<span class="cline-any cline-no"> </span>
|
|
1358
2226
|
<span class="cline-any cline-no"> </span>
|
|
1359
2227
|
<span class="cline-any cline-no"> </span>
|
|
2228
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2229
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2230
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2231
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2232
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2233
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2234
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2235
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2236
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2237
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2238
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2239
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2240
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2241
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2242
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2243
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2244
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2245
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2246
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2247
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2248
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2249
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2250
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2251
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2252
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2253
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2254
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2255
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2256
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2257
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2258
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2259
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2260
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2261
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2262
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2263
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2264
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2265
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2266
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2267
|
+
<span class="cline-any cline-yes">46x</span>
|
|
1360
2268
|
<span class="cline-any cline-no"> </span>
|
|
1361
2269
|
<span class="cline-any cline-no"> </span>
|
|
1362
2270
|
<span class="cline-any cline-no"> </span>
|
|
@@ -1436,8 +2344,63 @@
|
|
|
1436
2344
|
<span class="cline-any cline-no"> </span>
|
|
1437
2345
|
<span class="cline-any cline-no"> </span>
|
|
1438
2346
|
<span class="cline-any cline-no"> </span>
|
|
2347
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2348
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2349
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2350
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2351
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2352
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2353
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2354
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2355
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2356
|
+
<span class="cline-any cline-yes">7x</span>
|
|
2357
|
+
<span class="cline-any cline-yes">7x</span>
|
|
2358
|
+
<span class="cline-any cline-yes">7x</span>
|
|
2359
|
+
<span class="cline-any cline-yes">7x</span>
|
|
2360
|
+
<span class="cline-any cline-yes">7x</span>
|
|
2361
|
+
<span class="cline-any cline-yes">7x</span>
|
|
2362
|
+
<span class="cline-any cline-yes">7x</span>
|
|
2363
|
+
<span class="cline-any cline-yes">7x</span>
|
|
2364
|
+
<span class="cline-any cline-yes">7x</span>
|
|
2365
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1439
2366
|
<span class="cline-any cline-no"> </span>
|
|
1440
2367
|
<span class="cline-any cline-no"> </span>
|
|
2368
|
+
<span class="cline-any cline-yes">7x</span>
|
|
2369
|
+
<span class="cline-any cline-yes">7x</span>
|
|
2370
|
+
<span class="cline-any cline-yes">7x</span>
|
|
2371
|
+
<span class="cline-any cline-yes">7x</span>
|
|
2372
|
+
<span class="cline-any cline-yes">7x</span>
|
|
2373
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2374
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2375
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2376
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2377
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2378
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2379
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2380
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2381
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2382
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2383
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2384
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2385
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2386
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2387
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2388
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2389
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2390
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2391
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2392
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2393
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2394
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2395
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2396
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2397
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2398
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2399
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2400
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2401
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2402
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2403
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1441
2404
|
<span class="cline-any cline-no"> </span>
|
|
1442
2405
|
<span class="cline-any cline-no"> </span>
|
|
1443
2406
|
<span class="cline-any cline-no"> </span>
|
|
@@ -1448,6 +2411,17 @@
|
|
|
1448
2411
|
<span class="cline-any cline-no"> </span>
|
|
1449
2412
|
<span class="cline-any cline-no"> </span>
|
|
1450
2413
|
<span class="cline-any cline-no"> </span>
|
|
2414
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2415
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2416
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2417
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2418
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2419
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2420
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2421
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2422
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2423
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2424
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1451
2425
|
<span class="cline-any cline-no"> </span>
|
|
1452
2426
|
<span class="cline-any cline-no"> </span>
|
|
1453
2427
|
<span class="cline-any cline-no"> </span>
|
|
@@ -1455,6 +2429,8 @@
|
|
|
1455
2429
|
<span class="cline-any cline-no"> </span>
|
|
1456
2430
|
<span class="cline-any cline-no"> </span>
|
|
1457
2431
|
<span class="cline-any cline-no"> </span>
|
|
2432
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2433
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1458
2434
|
<span class="cline-any cline-no"> </span>
|
|
1459
2435
|
<span class="cline-any cline-no"> </span>
|
|
1460
2436
|
<span class="cline-any cline-no"> </span>
|
|
@@ -1476,7 +2452,31 @@
|
|
|
1476
2452
|
<span class="cline-any cline-no"> </span>
|
|
1477
2453
|
<span class="cline-any cline-no"> </span>
|
|
1478
2454
|
<span class="cline-any cline-no"> </span>
|
|
2455
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2456
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2457
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2458
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2459
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2460
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2461
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2462
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2463
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2464
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1479
2465
|
<span class="cline-any cline-no"> </span>
|
|
2466
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2467
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2468
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2469
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2470
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2471
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2472
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2473
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2474
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2475
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2476
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2477
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2478
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2479
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1480
2480
|
<span class="cline-any cline-no"> </span>
|
|
1481
2481
|
<span class="cline-any cline-no"> </span>
|
|
1482
2482
|
<span class="cline-any cline-no"> </span>
|
|
@@ -1492,6 +2492,8 @@
|
|
|
1492
2492
|
<span class="cline-any cline-no"> </span>
|
|
1493
2493
|
<span class="cline-any cline-no"> </span>
|
|
1494
2494
|
<span class="cline-any cline-no"> </span>
|
|
2495
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2496
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1495
2497
|
<span class="cline-any cline-no"> </span>
|
|
1496
2498
|
<span class="cline-any cline-no"> </span>
|
|
1497
2499
|
<span class="cline-any cline-no"> </span>
|
|
@@ -1502,6 +2504,8 @@
|
|
|
1502
2504
|
<span class="cline-any cline-no"> </span>
|
|
1503
2505
|
<span class="cline-any cline-no"> </span>
|
|
1504
2506
|
<span class="cline-any cline-no"> </span>
|
|
2507
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2508
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1505
2509
|
<span class="cline-any cline-no"> </span>
|
|
1506
2510
|
<span class="cline-any cline-no"> </span>
|
|
1507
2511
|
<span class="cline-any cline-no"> </span>
|
|
@@ -1509,6 +2513,8 @@
|
|
|
1509
2513
|
<span class="cline-any cline-no"> </span>
|
|
1510
2514
|
<span class="cline-any cline-no"> </span>
|
|
1511
2515
|
<span class="cline-any cline-no"> </span>
|
|
2516
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2517
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1512
2518
|
<span class="cline-any cline-no"> </span>
|
|
1513
2519
|
<span class="cline-any cline-no"> </span>
|
|
1514
2520
|
<span class="cline-any cline-no"> </span>
|
|
@@ -1520,6 +2526,8 @@
|
|
|
1520
2526
|
<span class="cline-any cline-no"> </span>
|
|
1521
2527
|
<span class="cline-any cline-no"> </span>
|
|
1522
2528
|
<span class="cline-any cline-no"> </span>
|
|
2529
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2530
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1523
2531
|
<span class="cline-any cline-no"> </span>
|
|
1524
2532
|
<span class="cline-any cline-no"> </span>
|
|
1525
2533
|
<span class="cline-any cline-no"> </span>
|
|
@@ -1534,1925 +2542,917 @@
|
|
|
1534
2542
|
<span class="cline-any cline-no"> </span>
|
|
1535
2543
|
<span class="cline-any cline-no"> </span>
|
|
1536
2544
|
<span class="cline-any cline-no"> </span>
|
|
1537
|
-
<span class="cline-any cline-
|
|
1538
|
-
<span class="cline-any cline-
|
|
1539
|
-
<span class="cline-any cline-
|
|
1540
|
-
<span class="cline-any cline-
|
|
1541
|
-
<span class="cline-any cline-
|
|
1542
|
-
<span class="cline-any cline-
|
|
1543
|
-
<span class="cline-any cline-
|
|
1544
|
-
<span class="cline-any cline-
|
|
1545
|
-
<span class="cline-any cline-
|
|
1546
|
-
<span class="cline-any cline-
|
|
1547
|
-
<span class="cline-any cline-
|
|
1548
|
-
<span class="cline-any cline-
|
|
1549
|
-
<span class="cline-any cline-
|
|
1550
|
-
<span class="cline-any cline-
|
|
1551
|
-
<span class="cline-any cline-
|
|
1552
|
-
<span class="cline-any cline-
|
|
1553
|
-
<span class="cline-any cline-
|
|
1554
|
-
<span class="cline-any cline-
|
|
1555
|
-
<span class="cline-any cline-
|
|
1556
|
-
<span class="cline-any cline-
|
|
1557
|
-
<span class="cline-any cline-
|
|
1558
|
-
<span class="cline-any cline-
|
|
1559
|
-
<span class="cline-any cline-
|
|
1560
|
-
<span class="cline-any cline-
|
|
1561
|
-
<span class="cline-any cline-
|
|
1562
|
-
<span class="cline-any cline-
|
|
1563
|
-
<span class="cline-any cline-
|
|
1564
|
-
<span class="cline-any cline-
|
|
1565
|
-
<span class="cline-any cline-
|
|
1566
|
-
<span class="cline-any cline-
|
|
1567
|
-
<span class="cline-any cline-
|
|
1568
|
-
<span class="cline-any cline-
|
|
1569
|
-
<span class="cline-any cline-
|
|
1570
|
-
<span class="cline-any cline-
|
|
1571
|
-
<span class="cline-any cline-
|
|
1572
|
-
<span class="cline-any cline-
|
|
1573
|
-
<span class="cline-any cline-
|
|
1574
|
-
<span class="cline-any cline-
|
|
1575
|
-
<span class="cline-any cline-
|
|
1576
|
-
<span class="cline-any cline-
|
|
1577
|
-
<span class="cline-any cline-
|
|
1578
|
-
<span class="cline-any cline-
|
|
1579
|
-
<span class="cline-any cline-
|
|
1580
|
-
<span class="cline-any cline-
|
|
1581
|
-
<span class="cline-any cline-
|
|
1582
|
-
<span class="cline-any cline-
|
|
1583
|
-
<span class="cline-any cline-
|
|
1584
|
-
<span class="cline-any cline-
|
|
1585
|
-
<span class="cline-any cline-
|
|
1586
|
-
<span class="cline-any cline-
|
|
1587
|
-
<span class="cline-any cline-
|
|
1588
|
-
<span class="cline-any cline-
|
|
1589
|
-
<span class="cline-any cline-
|
|
1590
|
-
<span class="cline-any cline-
|
|
1591
|
-
<span class="cline-any cline-
|
|
1592
|
-
<span class="cline-any cline-
|
|
1593
|
-
<span class="cline-any cline-
|
|
1594
|
-
<span class="cline-any cline-
|
|
1595
|
-
<span class="cline-any cline-
|
|
1596
|
-
<span class="cline-any cline-
|
|
1597
|
-
<span class="cline-any cline-
|
|
1598
|
-
<span class="cline-any cline-
|
|
1599
|
-
<span class="cline-any cline-
|
|
1600
|
-
<span class="cline-any cline-
|
|
1601
|
-
<span class="cline-any cline-
|
|
1602
|
-
<span class="cline-any cline-
|
|
1603
|
-
<span class="cline-any cline-
|
|
1604
|
-
<span class="cline-any cline-
|
|
1605
|
-
<span class="cline-any cline-
|
|
1606
|
-
<span class="cline-any cline-
|
|
1607
|
-
<span class="cline-any cline-
|
|
1608
|
-
<span class="cline-any cline-
|
|
1609
|
-
<span class="cline-any cline-
|
|
1610
|
-
<span class="cline-any cline-
|
|
1611
|
-
<span class="cline-any cline-
|
|
1612
|
-
<span class="cline-any cline-
|
|
1613
|
-
<span class="cline-any cline-
|
|
1614
|
-
<span class="cline-any cline-
|
|
1615
|
-
<span class="cline-any cline-
|
|
1616
|
-
<span class="cline-any cline-
|
|
1617
|
-
<span class="cline-any cline-
|
|
1618
|
-
<span class="cline-any cline-
|
|
1619
|
-
<span class="cline-any cline-
|
|
1620
|
-
<span class="cline-any cline-no"> </span>
|
|
1621
|
-
<span class="cline-any cline-no"> </span>
|
|
1622
|
-
<span class="cline-any cline-no"> </span>
|
|
1623
|
-
<span class="cline-any cline-no"> </span>
|
|
1624
|
-
<span class="cline-any cline-no"> </span>
|
|
1625
|
-
<span class="cline-any cline-no"> </span>
|
|
1626
|
-
<span class="cline-any cline-no"> </span>
|
|
1627
|
-
<span class="cline-any cline-
|
|
1628
|
-
<span class="cline-any cline-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
|
|
1788
|
-
|
|
1789
|
-
|
|
1790
|
-
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
|
|
1870
|
-
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
|
|
1881
|
-
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
1949
|
-
|
|
1950
|
-
<span class="
|
|
1951
|
-
<span class="cline-any cline-no"> </span>
|
|
1952
|
-
<span class="cline-any cline-no"> </span>
|
|
1953
|
-
<span class="cline-any cline-no"> </span>
|
|
1954
|
-
<span class="cline-any cline-no"> </span>
|
|
1955
|
-
<span class="cline-any cline-no"> </span>
|
|
1956
|
-
<span class="cline-any cline-no"> </span>
|
|
1957
|
-
<span class="cline-any cline-no"> </span>
|
|
1958
|
-
<span class="cline-any cline-no"> </span>
|
|
1959
|
-
<span class="cline-any cline-no"> </span>
|
|
1960
|
-
<span class="cline-any cline-no"> </span>
|
|
1961
|
-
<span class="cline-any cline-no"> </span>
|
|
1962
|
-
<span class="cline-any cline-no"> </span>
|
|
1963
|
-
<span class="cline-any cline-no"> </span>
|
|
1964
|
-
<span class="cline-any cline-no"> </span>
|
|
1965
|
-
<span class="cline-any cline-no"> </span>
|
|
1966
|
-
<span class="cline-any cline-no"> </span>
|
|
1967
|
-
<span class="cline-any cline-no"> </span>
|
|
1968
|
-
<span class="cline-any cline-no"> </span>
|
|
1969
|
-
<span class="cline-any cline-no"> </span>
|
|
1970
|
-
<span class="cline-any cline-no"> </span>
|
|
1971
|
-
<span class="cline-any cline-no"> </span>
|
|
1972
|
-
<span class="cline-any cline-no"> </span>
|
|
1973
|
-
<span class="cline-any cline-no"> </span>
|
|
1974
|
-
<span class="cline-any cline-no"> </span>
|
|
1975
|
-
<span class="cline-any cline-no"> </span>
|
|
1976
|
-
<span class="cline-any cline-no"> </span>
|
|
1977
|
-
<span class="cline-any cline-no"> </span>
|
|
1978
|
-
<span class="cline-any cline-no"> </span>
|
|
1979
|
-
<span class="cline-any cline-no"> </span>
|
|
1980
|
-
<span class="cline-any cline-no"> </span>
|
|
1981
|
-
<span class="cline-any cline-no"> </span>
|
|
1982
|
-
<span class="cline-any cline-no"> </span>
|
|
1983
|
-
<span class="cline-any cline-no"> </span>
|
|
1984
|
-
<span class="cline-any cline-no"> </span>
|
|
1985
|
-
<span class="cline-any cline-no"> </span>
|
|
1986
|
-
<span class="cline-any cline-no"> </span>
|
|
1987
|
-
<span class="cline-any cline-no"> </span>
|
|
1988
|
-
<span class="cline-any cline-no"> </span>
|
|
1989
|
-
<span class="cline-any cline-no"> </span>
|
|
1990
|
-
<span class="cline-any cline-no"> </span>
|
|
1991
|
-
<span class="cline-any cline-no"> </span>
|
|
1992
|
-
<span class="cline-any cline-no"> </span>
|
|
1993
|
-
<span class="cline-any cline-no"> </span>
|
|
1994
|
-
<span class="cline-any cline-no"> </span>
|
|
1995
|
-
<span class="cline-any cline-no"> </span>
|
|
1996
|
-
<span class="cline-any cline-no"> </span>
|
|
1997
|
-
<span class="cline-any cline-no"> </span>
|
|
1998
|
-
<span class="cline-any cline-no"> </span>
|
|
1999
|
-
<span class="cline-any cline-no"> </span>
|
|
2000
|
-
<span class="cline-any cline-no"> </span>
|
|
2001
|
-
<span class="cline-any cline-no"> </span>
|
|
2002
|
-
<span class="cline-any cline-no"> </span>
|
|
2003
|
-
<span class="cline-any cline-no"> </span>
|
|
2004
|
-
<span class="cline-any cline-no"> </span>
|
|
2005
|
-
<span class="cline-any cline-no"> </span>
|
|
2006
|
-
<span class="cline-any cline-no"> </span>
|
|
2007
|
-
<span class="cline-any cline-no"> </span>
|
|
2008
|
-
<span class="cline-any cline-no"> </span>
|
|
2009
|
-
<span class="cline-any cline-no"> </span>
|
|
2010
|
-
<span class="cline-any cline-no"> </span>
|
|
2011
|
-
<span class="cline-any cline-no"> </span>
|
|
2012
|
-
<span class="cline-any cline-no"> </span>
|
|
2013
|
-
<span class="cline-any cline-no"> </span>
|
|
2014
|
-
<span class="cline-any cline-no"> </span>
|
|
2015
|
-
<span class="cline-any cline-no"> </span>
|
|
2016
|
-
<span class="cline-any cline-no"> </span>
|
|
2017
|
-
<span class="cline-any cline-no"> </span>
|
|
2018
|
-
<span class="cline-any cline-no"> </span>
|
|
2019
|
-
<span class="cline-any cline-no"> </span>
|
|
2020
|
-
<span class="cline-any cline-no"> </span>
|
|
2021
|
-
<span class="cline-any cline-no"> </span>
|
|
2022
|
-
<span class="cline-any cline-no"> </span>
|
|
2023
|
-
<span class="cline-any cline-no"> </span>
|
|
2024
|
-
<span class="cline-any cline-no"> </span>
|
|
2025
|
-
<span class="cline-any cline-no"> </span>
|
|
2026
|
-
<span class="cline-any cline-no"> </span>
|
|
2027
|
-
<span class="cline-any cline-no"> </span>
|
|
2028
|
-
<span class="cline-any cline-no"> </span>
|
|
2029
|
-
<span class="cline-any cline-no"> </span>
|
|
2030
|
-
<span class="cline-any cline-no"> </span>
|
|
2031
|
-
<span class="cline-any cline-no"> </span>
|
|
2032
|
-
<span class="cline-any cline-no"> </span>
|
|
2033
|
-
<span class="cline-any cline-no"> </span>
|
|
2034
|
-
<span class="cline-any cline-no"> </span>
|
|
2035
|
-
<span class="cline-any cline-no"> </span>
|
|
2036
|
-
<span class="cline-any cline-no"> </span>
|
|
2037
|
-
<span class="cline-any cline-no"> </span>
|
|
2038
|
-
<span class="cline-any cline-no"> </span>
|
|
2039
|
-
<span class="cline-any cline-no"> </span>
|
|
2040
|
-
<span class="cline-any cline-no"> </span>
|
|
2041
|
-
<span class="cline-any cline-no"> </span>
|
|
2042
|
-
<span class="cline-any cline-no"> </span>
|
|
2043
|
-
<span class="cline-any cline-no"> </span>
|
|
2044
|
-
<span class="cline-any cline-no"> </span>
|
|
2045
|
-
<span class="cline-any cline-no"> </span>
|
|
2046
|
-
<span class="cline-any cline-no"> </span>
|
|
2047
|
-
<span class="cline-any cline-no"> </span>
|
|
2048
|
-
<span class="cline-any cline-no"> </span>
|
|
2049
|
-
<span class="cline-any cline-no"> </span>
|
|
2050
|
-
<span class="cline-any cline-no"> </span>
|
|
2051
|
-
<span class="cline-any cline-no"> </span>
|
|
2052
|
-
<span class="cline-any cline-no"> </span>
|
|
2053
|
-
<span class="cline-any cline-no"> </span>
|
|
2054
|
-
<span class="cline-any cline-no"> </span>
|
|
2055
|
-
<span class="cline-any cline-no"> </span>
|
|
2056
|
-
<span class="cline-any cline-no"> </span>
|
|
2057
|
-
<span class="cline-any cline-no"> </span>
|
|
2058
|
-
<span class="cline-any cline-no"> </span>
|
|
2059
|
-
<span class="cline-any cline-no"> </span>
|
|
2060
|
-
<span class="cline-any cline-no"> </span>
|
|
2061
|
-
<span class="cline-any cline-no"> </span>
|
|
2062
|
-
<span class="cline-any cline-no"> </span>
|
|
2063
|
-
<span class="cline-any cline-no"> </span>
|
|
2064
|
-
<span class="cline-any cline-no"> </span>
|
|
2065
|
-
<span class="cline-any cline-no"> </span>
|
|
2066
|
-
<span class="cline-any cline-no"> </span>
|
|
2067
|
-
<span class="cline-any cline-no"> </span>
|
|
2068
|
-
<span class="cline-any cline-no"> </span>
|
|
2069
|
-
<span class="cline-any cline-no"> </span>
|
|
2070
|
-
<span class="cline-any cline-no"> </span>
|
|
2071
|
-
<span class="cline-any cline-no"> </span>
|
|
2072
|
-
<span class="cline-any cline-no"> </span>
|
|
2073
|
-
<span class="cline-any cline-no"> </span>
|
|
2074
|
-
<span class="cline-any cline-no"> </span>
|
|
2075
|
-
<span class="cline-any cline-no"> </span>
|
|
2076
|
-
<span class="cline-any cline-no"> </span>
|
|
2077
|
-
<span class="cline-any cline-no"> </span>
|
|
2078
|
-
<span class="cline-any cline-no"> </span>
|
|
2079
|
-
<span class="cline-any cline-no"> </span>
|
|
2080
|
-
<span class="cline-any cline-no"> </span>
|
|
2081
|
-
<span class="cline-any cline-no"> </span>
|
|
2082
|
-
<span class="cline-any cline-no"> </span>
|
|
2083
|
-
<span class="cline-any cline-no"> </span>
|
|
2084
|
-
<span class="cline-any cline-no"> </span>
|
|
2085
|
-
<span class="cline-any cline-no"> </span>
|
|
2086
|
-
<span class="cline-any cline-no"> </span>
|
|
2087
|
-
<span class="cline-any cline-no"> </span>
|
|
2088
|
-
<span class="cline-any cline-no"> </span>
|
|
2089
|
-
<span class="cline-any cline-no"> </span>
|
|
2090
|
-
<span class="cline-any cline-no"> </span>
|
|
2091
|
-
<span class="cline-any cline-no"> </span>
|
|
2092
|
-
<span class="cline-any cline-no"> </span>
|
|
2093
|
-
<span class="cline-any cline-no"> </span>
|
|
2094
|
-
<span class="cline-any cline-no"> </span>
|
|
2095
|
-
<span class="cline-any cline-no"> </span>
|
|
2096
|
-
<span class="cline-any cline-no"> </span>
|
|
2097
|
-
<span class="cline-any cline-no"> </span>
|
|
2098
|
-
<span class="cline-any cline-no"> </span>
|
|
2099
|
-
<span class="cline-any cline-no"> </span>
|
|
2100
|
-
<span class="cline-any cline-no"> </span>
|
|
2101
|
-
<span class="cline-any cline-no"> </span>
|
|
2102
|
-
<span class="cline-any cline-no"> </span>
|
|
2103
|
-
<span class="cline-any cline-no"> </span>
|
|
2104
|
-
<span class="cline-any cline-no"> </span>
|
|
2105
|
-
<span class="cline-any cline-no"> </span>
|
|
2106
|
-
<span class="cline-any cline-no"> </span>
|
|
2107
|
-
<span class="cline-any cline-no"> </span>
|
|
2108
|
-
<span class="cline-any cline-no"> </span>
|
|
2109
|
-
<span class="cline-any cline-no"> </span>
|
|
2110
|
-
<span class="cline-any cline-no"> </span>
|
|
2111
|
-
<span class="cline-any cline-no"> </span>
|
|
2112
|
-
<span class="cline-any cline-no"> </span>
|
|
2113
|
-
<span class="cline-any cline-no"> </span>
|
|
2114
|
-
<span class="cline-any cline-no"> </span>
|
|
2115
|
-
<span class="cline-any cline-no"> </span>
|
|
2116
|
-
<span class="cline-any cline-no"> </span>
|
|
2117
|
-
<span class="cline-any cline-no"> </span>
|
|
2118
|
-
<span class="cline-any cline-no"> </span>
|
|
2119
|
-
<span class="cline-any cline-no"> </span>
|
|
2120
|
-
<span class="cline-any cline-no"> </span>
|
|
2121
|
-
<span class="cline-any cline-no"> </span>
|
|
2122
|
-
<span class="cline-any cline-no"> </span>
|
|
2123
|
-
<span class="cline-any cline-no"> </span>
|
|
2124
|
-
<span class="cline-any cline-no"> </span>
|
|
2125
|
-
<span class="cline-any cline-no"> </span>
|
|
2126
|
-
<span class="cline-any cline-no"> </span>
|
|
2127
|
-
<span class="cline-any cline-no"> </span>
|
|
2128
|
-
<span class="cline-any cline-no"> </span>
|
|
2129
|
-
<span class="cline-any cline-no"> </span>
|
|
2130
|
-
<span class="cline-any cline-no"> </span>
|
|
2131
|
-
<span class="cline-any cline-no"> </span>
|
|
2132
|
-
<span class="cline-any cline-no"> </span>
|
|
2133
|
-
<span class="cline-any cline-no"> </span>
|
|
2134
|
-
<span class="cline-any cline-no"> </span>
|
|
2135
|
-
<span class="cline-any cline-no"> </span>
|
|
2136
|
-
<span class="cline-any cline-no"> </span>
|
|
2137
|
-
<span class="cline-any cline-no"> </span>
|
|
2138
|
-
<span class="cline-any cline-no"> </span>
|
|
2139
|
-
<span class="cline-any cline-no"> </span>
|
|
2140
|
-
<span class="cline-any cline-no"> </span>
|
|
2141
|
-
<span class="cline-any cline-no"> </span>
|
|
2142
|
-
<span class="cline-any cline-no"> </span>
|
|
2143
|
-
<span class="cline-any cline-no"> </span>
|
|
2144
|
-
<span class="cline-any cline-no"> </span>
|
|
2145
|
-
<span class="cline-any cline-no"> </span>
|
|
2146
|
-
<span class="cline-any cline-no"> </span>
|
|
2147
|
-
<span class="cline-any cline-no"> </span>
|
|
2148
|
-
<span class="cline-any cline-no"> </span>
|
|
2149
|
-
<span class="cline-any cline-no"> </span>
|
|
2150
|
-
<span class="cline-any cline-no"> </span>
|
|
2151
|
-
<span class="cline-any cline-no"> </span>
|
|
2152
|
-
<span class="cline-any cline-no"> </span>
|
|
2153
|
-
<span class="cline-any cline-no"> </span>
|
|
2154
|
-
<span class="cline-any cline-no"> </span>
|
|
2155
|
-
<span class="cline-any cline-no"> </span>
|
|
2156
|
-
<span class="cline-any cline-no"> </span>
|
|
2157
|
-
<span class="cline-any cline-no"> </span>
|
|
2158
|
-
<span class="cline-any cline-no"> </span>
|
|
2159
|
-
<span class="cline-any cline-no"> </span>
|
|
2160
|
-
<span class="cline-any cline-no"> </span>
|
|
2161
|
-
<span class="cline-any cline-no"> </span>
|
|
2162
|
-
<span class="cline-any cline-no"> </span>
|
|
2163
|
-
<span class="cline-any cline-no"> </span>
|
|
2164
|
-
<span class="cline-any cline-no"> </span>
|
|
2165
|
-
<span class="cline-any cline-no"> </span>
|
|
2166
|
-
<span class="cline-any cline-no"> </span>
|
|
2167
|
-
<span class="cline-any cline-no"> </span>
|
|
2168
|
-
<span class="cline-any cline-no"> </span>
|
|
2169
|
-
<span class="cline-any cline-no"> </span>
|
|
2170
|
-
<span class="cline-any cline-no"> </span>
|
|
2171
|
-
<span class="cline-any cline-no"> </span>
|
|
2172
|
-
<span class="cline-any cline-no"> </span>
|
|
2173
|
-
<span class="cline-any cline-no"> </span>
|
|
2174
|
-
<span class="cline-any cline-no"> </span>
|
|
2175
|
-
<span class="cline-any cline-no"> </span>
|
|
2176
|
-
<span class="cline-any cline-no"> </span>
|
|
2177
|
-
<span class="cline-any cline-no"> </span>
|
|
2178
|
-
<span class="cline-any cline-no"> </span>
|
|
2179
|
-
<span class="cline-any cline-no"> </span>
|
|
2180
|
-
<span class="cline-any cline-no"> </span>
|
|
2181
|
-
<span class="cline-any cline-no"> </span>
|
|
2182
|
-
<span class="cline-any cline-no"> </span>
|
|
2183
|
-
<span class="cline-any cline-no"> </span>
|
|
2184
|
-
<span class="cline-any cline-no"> </span>
|
|
2185
|
-
<span class="cline-any cline-no"> </span>
|
|
2186
|
-
<span class="cline-any cline-no"> </span>
|
|
2187
|
-
<span class="cline-any cline-no"> </span>
|
|
2188
|
-
<span class="cline-any cline-no"> </span>
|
|
2189
|
-
<span class="cline-any cline-no"> </span>
|
|
2190
|
-
<span class="cline-any cline-no"> </span>
|
|
2191
|
-
<span class="cline-any cline-no"> </span>
|
|
2192
|
-
<span class="cline-any cline-no"> </span>
|
|
2193
|
-
<span class="cline-any cline-no"> </span>
|
|
2194
|
-
<span class="cline-any cline-no"> </span>
|
|
2195
|
-
<span class="cline-any cline-no"> </span>
|
|
2196
|
-
<span class="cline-any cline-no"> </span>
|
|
2197
|
-
<span class="cline-any cline-no"> </span>
|
|
2198
|
-
<span class="cline-any cline-no"> </span>
|
|
2199
|
-
<span class="cline-any cline-no"> </span>
|
|
2200
|
-
<span class="cline-any cline-no"> </span>
|
|
2201
|
-
<span class="cline-any cline-no"> </span>
|
|
2202
|
-
<span class="cline-any cline-no"> </span>
|
|
2203
|
-
<span class="cline-any cline-no"> </span>
|
|
2204
|
-
<span class="cline-any cline-no"> </span>
|
|
2205
|
-
<span class="cline-any cline-no"> </span>
|
|
2206
|
-
<span class="cline-any cline-no"> </span>
|
|
2207
|
-
<span class="cline-any cline-no"> </span>
|
|
2208
|
-
<span class="cline-any cline-no"> </span>
|
|
2209
|
-
<span class="cline-any cline-no"> </span>
|
|
2210
|
-
<span class="cline-any cline-no"> </span>
|
|
2211
|
-
<span class="cline-any cline-no"> </span>
|
|
2212
|
-
<span class="cline-any cline-no"> </span>
|
|
2213
|
-
<span class="cline-any cline-no"> </span>
|
|
2214
|
-
<span class="cline-any cline-no"> </span>
|
|
2215
|
-
<span class="cline-any cline-no"> </span>
|
|
2216
|
-
<span class="cline-any cline-no"> </span>
|
|
2217
|
-
<span class="cline-any cline-no"> </span>
|
|
2218
|
-
<span class="cline-any cline-no"> </span>
|
|
2219
|
-
<span class="cline-any cline-no"> </span>
|
|
2220
|
-
<span class="cline-any cline-no"> </span>
|
|
2221
|
-
<span class="cline-any cline-no"> </span>
|
|
2222
|
-
<span class="cline-any cline-no"> </span>
|
|
2223
|
-
<span class="cline-any cline-no"> </span>
|
|
2224
|
-
<span class="cline-any cline-no"> </span>
|
|
2225
|
-
<span class="cline-any cline-no"> </span>
|
|
2226
|
-
<span class="cline-any cline-no"> </span>
|
|
2227
|
-
<span class="cline-any cline-no"> </span>
|
|
2228
|
-
<span class="cline-any cline-no"> </span>
|
|
2229
|
-
<span class="cline-any cline-no"> </span>
|
|
2230
|
-
<span class="cline-any cline-no"> </span>
|
|
2231
|
-
<span class="cline-any cline-no"> </span>
|
|
2232
|
-
<span class="cline-any cline-no"> </span>
|
|
2233
|
-
<span class="cline-any cline-no"> </span>
|
|
2234
|
-
<span class="cline-any cline-no"> </span>
|
|
2235
|
-
<span class="cline-any cline-no"> </span>
|
|
2236
|
-
<span class="cline-any cline-no"> </span>
|
|
2237
|
-
<span class="cline-any cline-no"> </span>
|
|
2238
|
-
<span class="cline-any cline-no"> </span>
|
|
2239
|
-
<span class="cline-any cline-no"> </span>
|
|
2240
|
-
<span class="cline-any cline-no"> </span>
|
|
2241
|
-
<span class="cline-any cline-no"> </span>
|
|
2242
|
-
<span class="cline-any cline-no"> </span>
|
|
2243
|
-
<span class="cline-any cline-no"> </span>
|
|
2244
|
-
<span class="cline-any cline-no"> </span>
|
|
2245
|
-
<span class="cline-any cline-no"> </span>
|
|
2246
|
-
<span class="cline-any cline-no"> </span>
|
|
2247
|
-
<span class="cline-any cline-no"> </span>
|
|
2248
|
-
<span class="cline-any cline-no"> </span>
|
|
2249
|
-
<span class="cline-any cline-no"> </span>
|
|
2250
|
-
<span class="cline-any cline-no"> </span>
|
|
2251
|
-
<span class="cline-any cline-no"> </span>
|
|
2252
|
-
<span class="cline-any cline-no"> </span>
|
|
2253
|
-
<span class="cline-any cline-no"> </span>
|
|
2254
|
-
<span class="cline-any cline-no"> </span>
|
|
2255
|
-
<span class="cline-any cline-no"> </span>
|
|
2256
|
-
<span class="cline-any cline-no"> </span>
|
|
2257
|
-
<span class="cline-any cline-no"> </span>
|
|
2258
|
-
<span class="cline-any cline-no"> </span>
|
|
2259
|
-
<span class="cline-any cline-no"> </span>
|
|
2260
|
-
<span class="cline-any cline-no"> </span>
|
|
2261
|
-
<span class="cline-any cline-no"> </span>
|
|
2262
|
-
<span class="cline-any cline-no"> </span>
|
|
2263
|
-
<span class="cline-any cline-no"> </span>
|
|
2264
|
-
<span class="cline-any cline-no"> </span>
|
|
2265
|
-
<span class="cline-any cline-no"> </span>
|
|
2266
|
-
<span class="cline-any cline-no"> </span>
|
|
2267
|
-
<span class="cline-any cline-no"> </span>
|
|
2268
|
-
<span class="cline-any cline-no"> </span>
|
|
2269
|
-
<span class="cline-any cline-no"> </span>
|
|
2270
|
-
<span class="cline-any cline-no"> </span>
|
|
2271
|
-
<span class="cline-any cline-no"> </span>
|
|
2272
|
-
<span class="cline-any cline-no"> </span>
|
|
2273
|
-
<span class="cline-any cline-no"> </span>
|
|
2274
|
-
<span class="cline-any cline-no"> </span>
|
|
2275
|
-
<span class="cline-any cline-no"> </span>
|
|
2276
|
-
<span class="cline-any cline-no"> </span>
|
|
2277
|
-
<span class="cline-any cline-no"> </span>
|
|
2278
|
-
<span class="cline-any cline-no"> </span>
|
|
2279
|
-
<span class="cline-any cline-no"> </span>
|
|
2280
|
-
<span class="cline-any cline-no"> </span>
|
|
2281
|
-
<span class="cline-any cline-no"> </span>
|
|
2282
|
-
<span class="cline-any cline-no"> </span>
|
|
2283
|
-
<span class="cline-any cline-no"> </span>
|
|
2284
|
-
<span class="cline-any cline-no"> </span>
|
|
2285
|
-
<span class="cline-any cline-no"> </span>
|
|
2286
|
-
<span class="cline-any cline-no"> </span>
|
|
2287
|
-
<span class="cline-any cline-no"> </span>
|
|
2288
|
-
<span class="cline-any cline-no"> </span>
|
|
2289
|
-
<span class="cline-any cline-no"> </span>
|
|
2290
|
-
<span class="cline-any cline-no"> </span>
|
|
2291
|
-
<span class="cline-any cline-no"> </span>
|
|
2292
|
-
<span class="cline-any cline-no"> </span>
|
|
2293
|
-
<span class="cline-any cline-no"> </span>
|
|
2294
|
-
<span class="cline-any cline-no"> </span>
|
|
2295
|
-
<span class="cline-any cline-no"> </span>
|
|
2296
|
-
<span class="cline-any cline-no"> </span>
|
|
2297
|
-
<span class="cline-any cline-no"> </span>
|
|
2298
|
-
<span class="cline-any cline-no"> </span>
|
|
2299
|
-
<span class="cline-any cline-no"> </span>
|
|
2300
|
-
<span class="cline-any cline-no"> </span>
|
|
2301
|
-
<span class="cline-any cline-no"> </span>
|
|
2302
|
-
<span class="cline-any cline-no"> </span>
|
|
2303
|
-
<span class="cline-any cline-no"> </span>
|
|
2304
|
-
<span class="cline-any cline-no"> </span>
|
|
2305
|
-
<span class="cline-any cline-no"> </span>
|
|
2306
|
-
<span class="cline-any cline-no"> </span>
|
|
2307
|
-
<span class="cline-any cline-no"> </span>
|
|
2308
|
-
<span class="cline-any cline-no"> </span>
|
|
2309
|
-
<span class="cline-any cline-no"> </span>
|
|
2310
|
-
<span class="cline-any cline-no"> </span>
|
|
2311
|
-
<span class="cline-any cline-no"> </span>
|
|
2312
|
-
<span class="cline-any cline-no"> </span>
|
|
2313
|
-
<span class="cline-any cline-no"> </span>
|
|
2314
|
-
<span class="cline-any cline-no"> </span>
|
|
2315
|
-
<span class="cline-any cline-no"> </span>
|
|
2316
|
-
<span class="cline-any cline-no"> </span>
|
|
2317
|
-
<span class="cline-any cline-no"> </span>
|
|
2318
|
-
<span class="cline-any cline-no"> </span>
|
|
2319
|
-
<span class="cline-any cline-no"> </span>
|
|
2320
|
-
<span class="cline-any cline-no"> </span>
|
|
2321
|
-
<span class="cline-any cline-no"> </span>
|
|
2322
|
-
<span class="cline-any cline-no"> </span>
|
|
2323
|
-
<span class="cline-any cline-no"> </span>
|
|
2324
|
-
<span class="cline-any cline-no"> </span>
|
|
2325
|
-
<span class="cline-any cline-no"> </span>
|
|
2326
|
-
<span class="cline-any cline-no"> </span>
|
|
2327
|
-
<span class="cline-any cline-no"> </span>
|
|
2328
|
-
<span class="cline-any cline-no"> </span>
|
|
2329
|
-
<span class="cline-any cline-no"> </span>
|
|
2330
|
-
<span class="cline-any cline-no"> </span>
|
|
2331
|
-
<span class="cline-any cline-no"> </span>
|
|
2332
|
-
<span class="cline-any cline-no"> </span>
|
|
2333
|
-
<span class="cline-any cline-no"> </span>
|
|
2334
|
-
<span class="cline-any cline-no"> </span>
|
|
2335
|
-
<span class="cline-any cline-no"> </span>
|
|
2336
|
-
<span class="cline-any cline-no"> </span>
|
|
2337
|
-
<span class="cline-any cline-no"> </span>
|
|
2338
|
-
<span class="cline-any cline-no"> </span>
|
|
2339
|
-
<span class="cline-any cline-no"> </span>
|
|
2340
|
-
<span class="cline-any cline-no"> </span>
|
|
2341
|
-
<span class="cline-any cline-no"> </span>
|
|
2342
|
-
<span class="cline-any cline-no"> </span>
|
|
2343
|
-
<span class="cline-any cline-no"> </span>
|
|
2344
|
-
<span class="cline-any cline-no"> </span>
|
|
2345
|
-
<span class="cline-any cline-no"> </span>
|
|
2346
|
-
<span class="cline-any cline-no"> </span>
|
|
2347
|
-
<span class="cline-any cline-no"> </span>
|
|
2348
|
-
<span class="cline-any cline-no"> </span>
|
|
2349
|
-
<span class="cline-any cline-no"> </span>
|
|
2350
|
-
<span class="cline-any cline-no"> </span>
|
|
2351
|
-
<span class="cline-any cline-no"> </span>
|
|
2352
|
-
<span class="cline-any cline-no"> </span>
|
|
2353
|
-
<span class="cline-any cline-no"> </span>
|
|
2354
|
-
<span class="cline-any cline-no"> </span>
|
|
2355
|
-
<span class="cline-any cline-no"> </span>
|
|
2356
|
-
<span class="cline-any cline-no"> </span>
|
|
2357
|
-
<span class="cline-any cline-no"> </span>
|
|
2358
|
-
<span class="cline-any cline-no"> </span>
|
|
2359
|
-
<span class="cline-any cline-no"> </span>
|
|
2360
|
-
<span class="cline-any cline-no"> </span>
|
|
2361
|
-
<span class="cline-any cline-no"> </span>
|
|
2362
|
-
<span class="cline-any cline-no"> </span>
|
|
2363
|
-
<span class="cline-any cline-no"> </span>
|
|
2364
|
-
<span class="cline-any cline-no"> </span>
|
|
2365
|
-
<span class="cline-any cline-no"> </span>
|
|
2366
|
-
<span class="cline-any cline-no"> </span>
|
|
2367
|
-
<span class="cline-any cline-no"> </span>
|
|
2368
|
-
<span class="cline-any cline-no"> </span>
|
|
2369
|
-
<span class="cline-any cline-no"> </span>
|
|
2370
|
-
<span class="cline-any cline-no"> </span>
|
|
2371
|
-
<span class="cline-any cline-no"> </span>
|
|
2372
|
-
<span class="cline-any cline-no"> </span>
|
|
2373
|
-
<span class="cline-any cline-no"> </span>
|
|
2374
|
-
<span class="cline-any cline-no"> </span>
|
|
2375
|
-
<span class="cline-any cline-no"> </span>
|
|
2376
|
-
<span class="cline-any cline-no"> </span>
|
|
2377
|
-
<span class="cline-any cline-no"> </span>
|
|
2378
|
-
<span class="cline-any cline-no"> </span>
|
|
2379
|
-
<span class="cline-any cline-no"> </span>
|
|
2380
|
-
<span class="cline-any cline-no"> </span>
|
|
2381
|
-
<span class="cline-any cline-no"> </span>
|
|
2382
|
-
<span class="cline-any cline-no"> </span>
|
|
2383
|
-
<span class="cline-any cline-no"> </span>
|
|
2384
|
-
<span class="cline-any cline-no"> </span>
|
|
2385
|
-
<span class="cline-any cline-no"> </span>
|
|
2386
|
-
<span class="cline-any cline-no"> </span>
|
|
2387
|
-
<span class="cline-any cline-no"> </span>
|
|
2388
|
-
<span class="cline-any cline-no"> </span>
|
|
2389
|
-
<span class="cline-any cline-no"> </span>
|
|
2390
|
-
<span class="cline-any cline-no"> </span>
|
|
2391
|
-
<span class="cline-any cline-no"> </span>
|
|
2392
|
-
<span class="cline-any cline-no"> </span>
|
|
2393
|
-
<span class="cline-any cline-no"> </span>
|
|
2394
|
-
<span class="cline-any cline-no"> </span>
|
|
2395
|
-
<span class="cline-any cline-no"> </span>
|
|
2396
|
-
<span class="cline-any cline-no"> </span>
|
|
2397
|
-
<span class="cline-any cline-no"> </span>
|
|
2398
|
-
<span class="cline-any cline-no"> </span>
|
|
2399
|
-
<span class="cline-any cline-no"> </span>
|
|
2400
|
-
<span class="cline-any cline-no"> </span>
|
|
2401
|
-
<span class="cline-any cline-no"> </span>
|
|
2402
|
-
<span class="cline-any cline-no"> </span>
|
|
2403
|
-
<span class="cline-any cline-no"> </span>
|
|
2404
|
-
<span class="cline-any cline-no"> </span>
|
|
2405
|
-
<span class="cline-any cline-no"> </span>
|
|
2406
|
-
<span class="cline-any cline-no"> </span>
|
|
2407
|
-
<span class="cline-any cline-no"> </span>
|
|
2408
|
-
<span class="cline-any cline-no"> </span>
|
|
2409
|
-
<span class="cline-any cline-no"> </span>
|
|
2410
|
-
<span class="cline-any cline-no"> </span>
|
|
2411
|
-
<span class="cline-any cline-no"> </span>
|
|
2412
|
-
<span class="cline-any cline-no"> </span>
|
|
2413
|
-
<span class="cline-any cline-no"> </span>
|
|
2414
|
-
<span class="cline-any cline-no"> </span>
|
|
2415
|
-
<span class="cline-any cline-no"> </span>
|
|
2416
|
-
<span class="cline-any cline-no"> </span>
|
|
2417
|
-
<span class="cline-any cline-no"> </span>
|
|
2418
|
-
<span class="cline-any cline-no"> </span>
|
|
2419
|
-
<span class="cline-any cline-no"> </span>
|
|
2420
|
-
<span class="cline-any cline-no"> </span>
|
|
2421
|
-
<span class="cline-any cline-no"> </span>
|
|
2422
|
-
<span class="cline-any cline-no"> </span>
|
|
2423
|
-
<span class="cline-any cline-no"> </span>
|
|
2424
|
-
<span class="cline-any cline-no"> </span>
|
|
2425
|
-
<span class="cline-any cline-no"> </span>
|
|
2426
|
-
<span class="cline-any cline-no"> </span>
|
|
2427
|
-
<span class="cline-any cline-no"> </span>
|
|
2428
|
-
<span class="cline-any cline-no"> </span>
|
|
2429
|
-
<span class="cline-any cline-no"> </span>
|
|
2430
|
-
<span class="cline-any cline-no"> </span>
|
|
2431
|
-
<span class="cline-any cline-no"> </span>
|
|
2432
|
-
<span class="cline-any cline-no"> </span>
|
|
2433
|
-
<span class="cline-any cline-no"> </span>
|
|
2434
|
-
<span class="cline-any cline-no"> </span>
|
|
2435
|
-
<span class="cline-any cline-no"> </span>
|
|
2436
|
-
<span class="cline-any cline-no"> </span>
|
|
2437
|
-
<span class="cline-any cline-no"> </span>
|
|
2438
|
-
<span class="cline-any cline-no"> </span>
|
|
2439
|
-
<span class="cline-any cline-no"> </span>
|
|
2440
|
-
<span class="cline-any cline-no"> </span>
|
|
2441
|
-
<span class="cline-any cline-no"> </span>
|
|
2442
|
-
<span class="cline-any cline-no"> </span>
|
|
2443
|
-
<span class="cline-any cline-no"> </span>
|
|
2444
|
-
<span class="cline-any cline-no"> </span>
|
|
2445
|
-
<span class="cline-any cline-no"> </span>
|
|
2446
|
-
<span class="cline-any cline-no"> </span>
|
|
2447
|
-
<span class="cline-any cline-no"> </span>
|
|
2448
|
-
<span class="cline-any cline-no"> </span>
|
|
2449
|
-
<span class="cline-any cline-no"> </span>
|
|
2450
|
-
<span class="cline-any cline-no"> </span>
|
|
2451
|
-
<span class="cline-any cline-no"> </span>
|
|
2452
|
-
<span class="cline-any cline-no"> </span>
|
|
2453
|
-
<span class="cline-any cline-no"> </span>
|
|
2454
|
-
<span class="cline-any cline-no"> </span>
|
|
2455
|
-
<span class="cline-any cline-no"> </span>
|
|
2456
|
-
<span class="cline-any cline-no"> </span>
|
|
2457
|
-
<span class="cline-any cline-no"> </span>
|
|
2458
|
-
<span class="cline-any cline-no"> </span>
|
|
2459
|
-
<span class="cline-any cline-no"> </span>
|
|
2460
|
-
<span class="cline-any cline-no"> </span>
|
|
2461
|
-
<span class="cline-any cline-no"> </span>
|
|
2462
|
-
<span class="cline-any cline-no"> </span>
|
|
2463
|
-
<span class="cline-any cline-no"> </span>
|
|
2464
|
-
<span class="cline-any cline-no"> </span>
|
|
2465
|
-
<span class="cline-any cline-no"> </span>
|
|
2466
|
-
<span class="cline-any cline-no"> </span>
|
|
2467
|
-
<span class="cline-any cline-no"> </span>
|
|
2468
|
-
<span class="cline-any cline-no"> </span>
|
|
2469
|
-
<span class="cline-any cline-no"> </span>
|
|
2470
|
-
<span class="cline-any cline-no"> </span>
|
|
2471
|
-
<span class="cline-any cline-no"> </span>
|
|
2472
|
-
<span class="cline-any cline-no"> </span>
|
|
2473
|
-
<span class="cline-any cline-no"> </span>
|
|
2474
|
-
<span class="cline-any cline-no"> </span>
|
|
2475
|
-
<span class="cline-any cline-no"> </span>
|
|
2476
|
-
<span class="cline-any cline-no"> </span>
|
|
2477
|
-
<span class="cline-any cline-no"> </span>
|
|
2478
|
-
<span class="cline-any cline-no"> </span>
|
|
2479
|
-
<span class="cline-any cline-no"> </span>
|
|
2480
|
-
<span class="cline-any cline-no"> </span>
|
|
2481
|
-
<span class="cline-any cline-no"> </span>
|
|
2482
|
-
<span class="cline-any cline-no"> </span>
|
|
2483
|
-
<span class="cline-any cline-no"> </span>
|
|
2484
|
-
<span class="cline-any cline-no"> </span>
|
|
2485
|
-
<span class="cline-any cline-no"> </span>
|
|
2486
|
-
<span class="cline-any cline-no"> </span>
|
|
2487
|
-
<span class="cline-any cline-no"> </span>
|
|
2488
|
-
<span class="cline-any cline-no"> </span>
|
|
2489
|
-
<span class="cline-any cline-no"> </span>
|
|
2490
|
-
<span class="cline-any cline-no"> </span>
|
|
2491
|
-
<span class="cline-any cline-no"> </span>
|
|
2492
|
-
<span class="cline-any cline-no"> </span>
|
|
2493
|
-
<span class="cline-any cline-no"> </span>
|
|
2494
|
-
<span class="cline-any cline-no"> </span>
|
|
2495
|
-
<span class="cline-any cline-no"> </span>
|
|
2496
|
-
<span class="cline-any cline-no"> </span>
|
|
2497
|
-
<span class="cline-any cline-no"> </span>
|
|
2498
|
-
<span class="cline-any cline-no"> </span>
|
|
2499
|
-
<span class="cline-any cline-no"> </span>
|
|
2500
|
-
<span class="cline-any cline-no"> </span>
|
|
2501
|
-
<span class="cline-any cline-no"> </span>
|
|
2502
|
-
<span class="cline-any cline-no"> </span>
|
|
2503
|
-
<span class="cline-any cline-no"> </span>
|
|
2504
|
-
<span class="cline-any cline-no"> </span>
|
|
2505
|
-
<span class="cline-any cline-no"> </span>
|
|
2506
|
-
<span class="cline-any cline-no"> </span>
|
|
2507
|
-
<span class="cline-any cline-no"> </span>
|
|
2508
|
-
<span class="cline-any cline-no"> </span>
|
|
2509
|
-
<span class="cline-any cline-no"> </span>
|
|
2510
|
-
<span class="cline-any cline-no"> </span>
|
|
2511
|
-
<span class="cline-any cline-no"> </span>
|
|
2512
|
-
<span class="cline-any cline-no"> </span>
|
|
2513
|
-
<span class="cline-any cline-no"> </span>
|
|
2514
|
-
<span class="cline-any cline-no"> </span>
|
|
2515
|
-
<span class="cline-any cline-no"> </span>
|
|
2516
|
-
<span class="cline-any cline-no"> </span>
|
|
2517
|
-
<span class="cline-any cline-no"> </span>
|
|
2518
|
-
<span class="cline-any cline-no"> </span>
|
|
2519
|
-
<span class="cline-any cline-no"> </span>
|
|
2520
|
-
<span class="cline-any cline-no"> </span>
|
|
2521
|
-
<span class="cline-any cline-no"> </span>
|
|
2522
|
-
<span class="cline-any cline-no"> </span>
|
|
2523
|
-
<span class="cline-any cline-no"> </span>
|
|
2524
|
-
<span class="cline-any cline-no"> </span>
|
|
2525
|
-
<span class="cline-any cline-no"> </span>
|
|
2526
|
-
<span class="cline-any cline-no"> </span>
|
|
2527
|
-
<span class="cline-any cline-no"> </span>
|
|
2528
|
-
<span class="cline-any cline-no"> </span>
|
|
2529
|
-
<span class="cline-any cline-no"> </span>
|
|
2530
|
-
<span class="cline-any cline-no"> </span>
|
|
2531
|
-
<span class="cline-any cline-no"> </span>
|
|
2532
|
-
<span class="cline-any cline-no"> </span>
|
|
2533
|
-
<span class="cline-any cline-no"> </span>
|
|
2534
|
-
<span class="cline-any cline-no"> </span>
|
|
2535
|
-
<span class="cline-any cline-no"> </span>
|
|
2536
|
-
<span class="cline-any cline-no"> </span>
|
|
2537
|
-
<span class="cline-any cline-no"> </span>
|
|
2538
|
-
<span class="cline-any cline-no"> </span>
|
|
2539
|
-
<span class="cline-any cline-no"> </span>
|
|
2540
|
-
<span class="cline-any cline-no"> </span>
|
|
2541
|
-
<span class="cline-any cline-no"> </span>
|
|
2542
|
-
<span class="cline-any cline-no"> </span>
|
|
2543
|
-
<span class="cline-any cline-no"> </span>
|
|
2544
|
-
<span class="cline-any cline-no"> </span>
|
|
2545
|
-
<span class="cline-any cline-no"> </span>
|
|
2546
|
-
<span class="cline-any cline-no"> </span>
|
|
2547
|
-
<span class="cline-any cline-no"> </span>
|
|
2548
|
-
<span class="cline-any cline-no"> </span>
|
|
2549
|
-
<span class="cline-any cline-no"> </span>
|
|
2550
|
-
<span class="cline-any cline-no"> </span>
|
|
2551
|
-
<span class="cline-any cline-no"> </span>
|
|
2552
|
-
<span class="cline-any cline-no"> </span>
|
|
2553
|
-
<span class="cline-any cline-no"> </span>
|
|
2554
|
-
<span class="cline-any cline-no"> </span>
|
|
2555
|
-
<span class="cline-any cline-no"> </span>
|
|
2556
|
-
<span class="cline-any cline-no"> </span>
|
|
2557
|
-
<span class="cline-any cline-no"> </span>
|
|
2558
|
-
<span class="cline-any cline-no"> </span>
|
|
2559
|
-
<span class="cline-any cline-no"> </span>
|
|
2560
|
-
<span class="cline-any cline-no"> </span>
|
|
2561
|
-
<span class="cline-any cline-no"> </span>
|
|
2562
|
-
<span class="cline-any cline-no"> </span>
|
|
2563
|
-
<span class="cline-any cline-no"> </span>
|
|
2564
|
-
<span class="cline-any cline-no"> </span>
|
|
2565
|
-
<span class="cline-any cline-no"> </span>
|
|
2566
|
-
<span class="cline-any cline-no"> </span>
|
|
2567
|
-
<span class="cline-any cline-no"> </span>
|
|
2568
|
-
<span class="cline-any cline-no"> </span>
|
|
2569
|
-
<span class="cline-any cline-no"> </span>
|
|
2570
|
-
<span class="cline-any cline-no"> </span>
|
|
2571
|
-
<span class="cline-any cline-no"> </span>
|
|
2572
|
-
<span class="cline-any cline-no"> </span>
|
|
2573
|
-
<span class="cline-any cline-no"> </span>
|
|
2574
|
-
<span class="cline-any cline-no"> </span>
|
|
2575
|
-
<span class="cline-any cline-no"> </span>
|
|
2576
|
-
<span class="cline-any cline-no"> </span>
|
|
2577
|
-
<span class="cline-any cline-no"> </span>
|
|
2578
|
-
<span class="cline-any cline-no"> </span>
|
|
2579
|
-
<span class="cline-any cline-no"> </span>
|
|
2580
|
-
<span class="cline-any cline-no"> </span>
|
|
2581
|
-
<span class="cline-any cline-no"> </span>
|
|
2582
|
-
<span class="cline-any cline-no"> </span>
|
|
2583
|
-
<span class="cline-any cline-no"> </span>
|
|
2584
|
-
<span class="cline-any cline-no"> </span>
|
|
2585
|
-
<span class="cline-any cline-no"> </span>
|
|
2586
|
-
<span class="cline-any cline-no"> </span>
|
|
2587
|
-
<span class="cline-any cline-no"> </span>
|
|
2588
|
-
<span class="cline-any cline-no"> </span>
|
|
2589
|
-
<span class="cline-any cline-no"> </span>
|
|
2590
|
-
<span class="cline-any cline-no"> </span>
|
|
2591
|
-
<span class="cline-any cline-no"> </span>
|
|
2592
|
-
<span class="cline-any cline-no"> </span>
|
|
2593
|
-
<span class="cline-any cline-no"> </span>
|
|
2594
|
-
<span class="cline-any cline-no"> </span>
|
|
2595
|
-
<span class="cline-any cline-no"> </span>
|
|
2596
|
-
<span class="cline-any cline-no"> </span>
|
|
2597
|
-
<span class="cline-any cline-no"> </span>
|
|
2598
|
-
<span class="cline-any cline-no"> </span>
|
|
2599
|
-
<span class="cline-any cline-no"> </span>
|
|
2600
|
-
<span class="cline-any cline-no"> </span>
|
|
2601
|
-
<span class="cline-any cline-no"> </span>
|
|
2602
|
-
<span class="cline-any cline-no"> </span>
|
|
2603
|
-
<span class="cline-any cline-no"> </span>
|
|
2604
|
-
<span class="cline-any cline-no"> </span>
|
|
2605
|
-
<span class="cline-any cline-no"> </span>
|
|
2606
|
-
<span class="cline-any cline-no"> </span>
|
|
2607
|
-
<span class="cline-any cline-no"> </span>
|
|
2608
|
-
<span class="cline-any cline-no"> </span>
|
|
2609
|
-
<span class="cline-any cline-no"> </span>
|
|
2610
|
-
<span class="cline-any cline-no"> </span>
|
|
2611
|
-
<span class="cline-any cline-no"> </span>
|
|
2612
|
-
<span class="cline-any cline-no"> </span>
|
|
2613
|
-
<span class="cline-any cline-no"> </span>
|
|
2614
|
-
<span class="cline-any cline-no"> </span>
|
|
2615
|
-
<span class="cline-any cline-no"> </span>
|
|
2616
|
-
<span class="cline-any cline-no"> </span>
|
|
2617
|
-
<span class="cline-any cline-no"> </span>
|
|
2618
|
-
<span class="cline-any cline-no"> </span>
|
|
2619
|
-
<span class="cline-any cline-no"> </span>
|
|
2620
|
-
<span class="cline-any cline-no"> </span>
|
|
2621
|
-
<span class="cline-any cline-no"> </span>
|
|
2622
|
-
<span class="cline-any cline-no"> </span>
|
|
2623
|
-
<span class="cline-any cline-no"> </span>
|
|
2624
|
-
<span class="cline-any cline-no"> </span>
|
|
2625
|
-
<span class="cline-any cline-no"> </span>
|
|
2626
|
-
<span class="cline-any cline-no"> </span>
|
|
2627
|
-
<span class="cline-any cline-no"> </span>
|
|
2628
|
-
<span class="cline-any cline-no"> </span>
|
|
2629
|
-
<span class="cline-any cline-no"> </span>
|
|
2630
|
-
<span class="cline-any cline-no"> </span>
|
|
2631
|
-
<span class="cline-any cline-no"> </span>
|
|
2632
|
-
<span class="cline-any cline-no"> </span>
|
|
2633
|
-
<span class="cline-any cline-no"> </span>
|
|
2634
|
-
<span class="cline-any cline-no"> </span>
|
|
2635
|
-
<span class="cline-any cline-no"> </span>
|
|
2636
|
-
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >/**<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
|
|
2637
|
-
<span class="cstat-no" title="statement not covered" > * HSuite Native Connect</span>
|
|
2638
|
-
<span class="cstat-no" title="statement not covered" > * Copyright 2024-2025 HSuite (https://hsuite.finance)</span>
|
|
2639
|
-
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2640
|
-
<span class="cstat-no" title="statement not covered" > * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0</span>
|
|
2641
|
-
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2642
|
-
<span class="cstat-no" title="statement not covered" > * This file is part of HSuite Native Connect. For commercial licensing,</span>
|
|
2643
|
-
<span class="cstat-no" title="statement not covered" > * visit https://hsuite.finance/licensing</span>
|
|
2644
|
-
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2645
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
2646
|
-
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
2647
|
-
<span class="cstat-no" title="statement not covered" > * @file Service for building Hedera transactions using the Hashgraph SDK.</span>
|
|
2648
|
-
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2649
|
-
<span class="cstat-no" title="statement not covered" > * @module services/transaction-builders/hedera</span>
|
|
2650
|
-
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2651
|
-
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
2652
|
-
<span class="cstat-no" title="statement not covered" > * HederaTransactionBuilderService provides methods to construct various Hedera transaction</span>
|
|
2653
|
-
<span class="cstat-no" title="statement not covered" > * types and serialize them to base64 payloads ready for signing. It uses the @hashgraph/sdk</span>
|
|
2654
|
-
<span class="cstat-no" title="statement not covered" > * library for proper transaction construction and automatically freezes transactions with</span>
|
|
2655
|
-
<span class="cstat-no" title="statement not covered" > * the correct network client.</span>
|
|
2656
|
-
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2657
|
-
<span class="cstat-no" title="statement not covered" > * **Supported Transaction Types:**</span>
|
|
2658
|
-
<span class="cstat-no" title="statement not covered" > * - HBAR transfers (single and atomic multi-transfer)</span>
|
|
2659
|
-
<span class="cstat-no" title="statement not covered" > * - Fungible token transfers</span>
|
|
2660
|
-
<span class="cstat-no" title="statement not covered" > * - NFT transfers</span>
|
|
2661
|
-
<span class="cstat-no" title="statement not covered" > * - Token association/dissociation</span>
|
|
2662
|
-
<span class="cstat-no" title="statement not covered" > * - Token creation (with auto key configuration)</span>
|
|
2663
|
-
<span class="cstat-no" title="statement not covered" > * - Token minting/burning</span>
|
|
2664
|
-
<span class="cstat-no" title="statement not covered" > * - Topic creation (with auto key configuration)</span>
|
|
2665
|
-
<span class="cstat-no" title="statement not covered" > * - Topic message submission</span>
|
|
2666
|
-
<span class="cstat-no" title="statement not covered" > * - Account creation (with multisig support)</span>
|
|
2667
|
-
<span class="cstat-no" title="statement not covered" > * - Account updates</span>
|
|
2668
|
-
<span class="cstat-no" title="statement not covered" > * - Batch transactions</span>
|
|
2669
|
-
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2670
|
-
<span class="cstat-no" title="statement not covered" > * **Auto-Key Configuration:**</span>
|
|
2671
|
-
<span class="cstat-no" title="statement not covered" > * When creating entities (topics, tokens, accounts), the builder automatically</span>
|
|
2672
|
-
<span class="cstat-no" title="statement not covered" > * inherits the key structure from the active account:</span>
|
|
2673
|
-
<span class="cstat-no" title="statement not covered" > * - Single-sig accounts -> entity uses account's public key</span>
|
|
2674
|
-
<span class="cstat-no" title="statement not covered" > * - Multisig accounts -> entity uses threshold key with all signers</span>
|
|
2675
|
-
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2676
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
2677
|
-
<span class="cstat-no" title="statement not covered" >import { Injectable, inject } from '@angular/core';</span>
|
|
2678
|
-
<span class="cstat-no" title="statement not covered" >import {</span>
|
|
2679
|
-
<span class="cstat-no" title="statement not covered" > TransferTransaction,</span>
|
|
2680
|
-
<span class="cstat-no" title="statement not covered" > TokenAssociateTransaction,</span>
|
|
2681
|
-
<span class="cstat-no" title="statement not covered" > TokenDissociateTransaction,</span>
|
|
2682
|
-
<span class="cstat-no" title="statement not covered" > TokenCreateTransaction,</span>
|
|
2683
|
-
<span class="cstat-no" title="statement not covered" > TokenMintTransaction,</span>
|
|
2684
|
-
<span class="cstat-no" title="statement not covered" > TokenBurnTransaction,</span>
|
|
2685
|
-
<span class="cstat-no" title="statement not covered" > TopicCreateTransaction,</span>
|
|
2686
|
-
<span class="cstat-no" title="statement not covered" > TopicMessageSubmitTransaction,</span>
|
|
2687
|
-
<span class="cstat-no" title="statement not covered" > AccountCreateTransaction,</span>
|
|
2688
|
-
<span class="cstat-no" title="statement not covered" > AccountUpdateTransaction,</span>
|
|
2689
|
-
<span class="cstat-no" title="statement not covered" > ScheduleCreateTransaction,</span>
|
|
2690
|
-
<span class="cstat-no" title="statement not covered" > BatchTransaction,</span>
|
|
2691
|
-
<span class="cstat-no" title="statement not covered" > Transaction,</span>
|
|
2692
|
-
<span class="cstat-no" title="statement not covered" > Hbar,</span>
|
|
2693
|
-
<span class="cstat-no" title="statement not covered" > AccountId,</span>
|
|
2694
|
-
<span class="cstat-no" title="statement not covered" > TokenId,</span>
|
|
2695
|
-
<span class="cstat-no" title="statement not covered" > NftId,</span>
|
|
2696
|
-
<span class="cstat-no" title="statement not covered" > TransactionId,</span>
|
|
2697
|
-
<span class="cstat-no" title="statement not covered" > Client,</span>
|
|
2698
|
-
<span class="cstat-no" title="statement not covered" > PrivateKey,</span>
|
|
2699
|
-
<span class="cstat-no" title="statement not covered" > PublicKey,</span>
|
|
2700
|
-
<span class="cstat-no" title="statement not covered" > TokenType,</span>
|
|
2701
|
-
<span class="cstat-no" title="statement not covered" > TokenSupplyType,</span>
|
|
2702
|
-
<span class="cstat-no" title="statement not covered" > KeyList,</span>
|
|
2703
|
-
<span class="cstat-no" title="statement not covered" > Key,</span>
|
|
2704
|
-
<span class="cstat-no" title="statement not covered" >} from '@hashgraph/sdk';</span>
|
|
2705
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
2706
|
-
<span class="cstat-no" title="statement not covered" >import { LoggerService } from '../logger.service';</span>
|
|
2707
|
-
<span class="cstat-no" title="statement not covered" >import { UnifiedWalletService } from '../unified-wallet.service';</span>
|
|
2708
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
2709
|
-
<span class="cstat-no" title="statement not covered" >import { scaleHederaAmountToBaseUnits, assertSafeInteger } from './hedera-amount-utils';</span>
|
|
2710
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
2711
|
-
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
2712
|
-
<span class="cstat-no" title="statement not covered" > * Supported inner transaction types for batch transactions.</span>
|
|
2713
|
-
<span class="cstat-no" title="statement not covered" > * Excludes 'batch-transaction' since batches cannot be nested.</span>
|
|
2714
|
-
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2715
|
-
<span class="cstat-no" title="statement not covered" >export type BatchInnerTransactionType =</span>
|
|
2716
|
-
<span class="cstat-no" title="statement not covered" > | 'send-hbar'</span>
|
|
2717
|
-
<span class="cstat-no" title="statement not covered" > | 'send-token'</span>
|
|
2718
|
-
<span class="cstat-no" title="statement not covered" > | 'send-nft'</span>
|
|
2719
|
-
<span class="cstat-no" title="statement not covered" > | 'token-associate'</span>
|
|
2720
|
-
<span class="cstat-no" title="statement not covered" > | 'token-dissociate'</span>
|
|
2721
|
-
<span class="cstat-no" title="statement not covered" > | 'token-create'</span>
|
|
2722
|
-
<span class="cstat-no" title="statement not covered" > | 'token-mint'</span>
|
|
2723
|
-
<span class="cstat-no" title="statement not covered" > | 'token-burn'</span>
|
|
2724
|
-
<span class="cstat-no" title="statement not covered" > | 'topic-create'</span>
|
|
2725
|
-
<span class="cstat-no" title="statement not covered" > | 'topic-message'</span>
|
|
2726
|
-
<span class="cstat-no" title="statement not covered" > | 'account-create'</span>
|
|
2727
|
-
<span class="cstat-no" title="statement not covered" > | 'account-update';</span>
|
|
2728
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
2729
|
-
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
2730
|
-
<span class="cstat-no" title="statement not covered" > * Inner transaction descriptor for batch transactions.</span>
|
|
2731
|
-
<span class="cstat-no" title="statement not covered" > * Contains all possible fields for different transaction types.</span>
|
|
2732
|
-
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2733
|
-
<span class="cstat-no" title="statement not covered" >export interface BatchInnerTransaction {</span>
|
|
2734
|
-
<span class="cstat-no" title="statement not covered" > /** Type of transaction */</span>
|
|
2735
|
-
<span class="cstat-no" title="statement not covered" > type: BatchInnerTransactionType;</span>
|
|
2736
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
2737
|
-
<span class="cstat-no" title="statement not covered" > // Transfer fields (send-hbar, send-token, send-nft)</span>
|
|
2738
|
-
<span class="cstat-no" title="statement not covered" > /** Recipient account */</span>
|
|
2739
|
-
<span class="cstat-no" title="statement not covered" > toAccount?: string;</span>
|
|
2740
|
-
<span class="cstat-no" title="statement not covered" > /** Amount for HBAR (tinybars) or token transfers */</span>
|
|
2741
|
-
<span class="cstat-no" title="statement not covered" > amount?: number;</span>
|
|
2742
|
-
<span class="cstat-no" title="statement not covered" > /** Token ID for token operations */</span>
|
|
2743
|
-
<span class="cstat-no" title="statement not covered" > tokenId?: string;</span>
|
|
2744
|
-
<span class="cstat-no" title="statement not covered" > /** Serial number for NFT transfers */</span>
|
|
2745
|
-
<span class="cstat-no" title="statement not covered" > serialNumber?: number;</span>
|
|
2746
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
2747
|
-
<span class="cstat-no" title="statement not covered" > // Token create fields</span>
|
|
2748
|
-
<span class="cstat-no" title="statement not covered" > /** Token name for creation */</span>
|
|
2749
|
-
<span class="cstat-no" title="statement not covered" > tokenName?: string;</span>
|
|
2750
|
-
<span class="cstat-no" title="statement not covered" > /** Token symbol for creation */</span>
|
|
2751
|
-
<span class="cstat-no" title="statement not covered" > tokenSymbol?: string;</span>
|
|
2752
|
-
<span class="cstat-no" title="statement not covered" > /** Token decimals for creation */</span>
|
|
2753
|
-
<span class="cstat-no" title="statement not covered" > decimals?: number;</span>
|
|
2754
|
-
<span class="cstat-no" title="statement not covered" > /** Initial supply for fungible tokens */</span>
|
|
2755
|
-
<span class="cstat-no" title="statement not covered" > initialSupply?: number;</span>
|
|
2756
|
-
<span class="cstat-no" title="statement not covered" > /** Max supply (0 = infinite) */</span>
|
|
2757
|
-
<span class="cstat-no" title="statement not covered" > maxSupply?: number;</span>
|
|
2758
|
-
<span class="cstat-no" title="statement not covered" > /** Whether supply is finite or infinite */</span>
|
|
2759
|
-
<span class="cstat-no" title="statement not covered" > supplyType?: 'finite' | 'infinite';</span>
|
|
2760
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
2761
|
-
<span class="cstat-no" title="statement not covered" > // Token mint/burn fields</span>
|
|
2762
|
-
<span class="cstat-no" title="statement not covered" > /** Metadata for NFT minting (array for multiple NFTs) */</span>
|
|
2763
|
-
<span class="cstat-no" title="statement not covered" > metadata?: string | string[];</span>
|
|
2764
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
2765
|
-
<span class="cstat-no" title="statement not covered" > // Topic fields</span>
|
|
2766
|
-
<span class="cstat-no" title="statement not covered" > /** Topic ID for message submission */</span>
|
|
2767
|
-
<span class="cstat-no" title="statement not covered" > topicId?: string;</span>
|
|
2768
|
-
<span class="cstat-no" title="statement not covered" > /** Message content for topic submission */</span>
|
|
2769
|
-
<span class="cstat-no" title="statement not covered" > message?: string;</span>
|
|
2770
|
-
<span class="cstat-no" title="statement not covered" > /** Topic memo for creation */</span>
|
|
2771
|
-
<span class="cstat-no" title="statement not covered" > topicMemo?: string;</span>
|
|
2772
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
2773
|
-
<span class="cstat-no" title="statement not covered" > // Account fields</span>
|
|
2774
|
-
<span class="cstat-no" title="statement not covered" > /** Initial balance for account creation (tinybars) */</span>
|
|
2775
|
-
<span class="cstat-no" title="statement not covered" > initialBalance?: number;</span>
|
|
2776
|
-
<span class="cstat-no" title="statement not covered" > /** Memo for account update */</span>
|
|
2777
|
-
<span class="cstat-no" title="statement not covered" > memo?: string;</span>
|
|
2778
|
-
<span class="cstat-no" title="statement not covered" > /** Max auto associations for account */</span>
|
|
2779
|
-
<span class="cstat-no" title="statement not covered" > maxAutoAssociations?: number;</span>
|
|
2780
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
2781
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
2782
|
-
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
2783
|
-
<span class="cstat-no" title="statement not covered" > * Key configuration for entity creation transactions.</span>
|
|
2784
|
-
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2785
|
-
<span class="cstat-no" title="statement not covered" > * For single-sig accounts: provide a single publicKey string</span>
|
|
2786
|
-
<span class="cstat-no" title="statement not covered" > * For multisig accounts: provide signerPublicKeys array + threshold</span>
|
|
2787
|
-
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2788
|
-
<span class="cstat-no" title="statement not covered" >export interface HederaKeyConfig {</span>
|
|
2789
|
-
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2790
|
-
<span class="cstat-no" title="statement not covered" > * Single public key (hex/DER encoded) for single-sig accounts.</span>
|
|
2791
|
-
<span class="cstat-no" title="statement not covered" > * If provided alone, this key is used directly.</span>
|
|
2792
|
-
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2793
|
-
<span class="cstat-no" title="statement not covered" > publicKey?: string;</span>
|
|
2794
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
2795
|
-
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2796
|
-
<span class="cstat-no" title="statement not covered" > * Array of public keys for multisig (threshold key) configuration.</span>
|
|
2797
|
-
<span class="cstat-no" title="statement not covered" > * Requires threshold to be set.</span>
|
|
2798
|
-
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2799
|
-
<span class="cstat-no" title="statement not covered" > signerPublicKeys?: string[];</span>
|
|
2800
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
2801
|
-
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2802
|
-
<span class="cstat-no" title="statement not covered" > * Threshold for multisig - number of signatures required.</span>
|
|
2803
|
-
<span class="cstat-no" title="statement not covered" > * Only used when signerPublicKeys is provided.</span>
|
|
2804
|
-
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2805
|
-
<span class="cstat-no" title="statement not covered" > threshold?: number;</span>
|
|
2806
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
2807
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
2808
|
-
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
2809
|
-
<span class="cstat-no" title="statement not covered" > * Extended options for topic creation with key configuration.</span>
|
|
2810
|
-
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2811
|
-
<span class="cstat-no" title="statement not covered" >export interface TopicCreateOptions {</span>
|
|
2812
|
-
<span class="cstat-no" title="statement not covered" > /** Topic memo/description */</span>
|
|
2813
|
-
<span class="cstat-no" title="statement not covered" > memo?: string;</span>
|
|
2814
|
-
<span class="cstat-no" title="statement not covered" > /** Admin key - can update/delete the topic. Uses creator's key if not specified. */</span>
|
|
2815
|
-
<span class="cstat-no" title="statement not covered" > adminKey?: HederaKeyConfig;</span>
|
|
2816
|
-
<span class="cstat-no" title="statement not covered" > /** Submit key - required to submit messages. If not set, anyone can submit. */</span>
|
|
2817
|
-
<span class="cstat-no" title="statement not covered" > submitKey?: HederaKeyConfig;</span>
|
|
2818
|
-
<span class="cstat-no" title="statement not covered" > /** Auto-renew account for fees */</span>
|
|
2819
|
-
<span class="cstat-no" title="statement not covered" > autoRenewAccountId?: string;</span>
|
|
2820
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
2821
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
2822
|
-
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
2823
|
-
<span class="cstat-no" title="statement not covered" > * Extended options for token creation with key configuration.</span>
|
|
2824
|
-
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2825
|
-
<span class="cstat-no" title="statement not covered" >export interface TokenCreateOptions {</span>
|
|
2826
|
-
<span class="cstat-no" title="statement not covered" > /** Token name */</span>
|
|
2827
|
-
<span class="cstat-no" title="statement not covered" > name: string;</span>
|
|
2828
|
-
<span class="cstat-no" title="statement not covered" > /** Token symbol */</span>
|
|
2829
|
-
<span class="cstat-no" title="statement not covered" > symbol: string;</span>
|
|
2830
|
-
<span class="cstat-no" title="statement not covered" > /** Decimal places (0 for NFTs) */</span>
|
|
2831
|
-
<span class="cstat-no" title="statement not covered" > decimals: number;</span>
|
|
2832
|
-
<span class="cstat-no" title="statement not covered" > /** Initial supply (0 for NFTs) */</span>
|
|
2833
|
-
<span class="cstat-no" title="statement not covered" > initialSupply: number;</span>
|
|
2834
|
-
<span class="cstat-no" title="statement not covered" > /** Token type: FUNGIBLE or NFT */</span>
|
|
2835
|
-
<span class="cstat-no" title="statement not covered" > tokenType?: 'FUNGIBLE' | 'NFT';</span>
|
|
2836
|
-
<span class="cstat-no" title="statement not covered" > /** Admin key - can update/delete token */</span>
|
|
2837
|
-
<span class="cstat-no" title="statement not covered" > adminKey?: HederaKeyConfig;</span>
|
|
2838
|
-
<span class="cstat-no" title="statement not covered" > /** Supply key - can mint/burn tokens */</span>
|
|
2839
|
-
<span class="cstat-no" title="statement not covered" > supplyKey?: HederaKeyConfig;</span>
|
|
2840
|
-
<span class="cstat-no" title="statement not covered" > /** Freeze key - can freeze/unfreeze accounts */</span>
|
|
2841
|
-
<span class="cstat-no" title="statement not covered" > freezeKey?: HederaKeyConfig;</span>
|
|
2842
|
-
<span class="cstat-no" title="statement not covered" > /** Wipe key - can wipe token balance from accounts */</span>
|
|
2843
|
-
<span class="cstat-no" title="statement not covered" > wipeKey?: HederaKeyConfig;</span>
|
|
2844
|
-
<span class="cstat-no" title="statement not covered" > /** Pause key - can pause/unpause token operations */</span>
|
|
2845
|
-
<span class="cstat-no" title="statement not covered" > pauseKey?: HederaKeyConfig;</span>
|
|
2846
|
-
<span class="cstat-no" title="statement not covered" > /** KYC key - can grant/revoke KYC */</span>
|
|
2847
|
-
<span class="cstat-no" title="statement not covered" > kycKey?: HederaKeyConfig;</span>
|
|
2848
|
-
<span class="cstat-no" title="statement not covered" > /** Fee schedule key - can update custom fees */</span>
|
|
2849
|
-
<span class="cstat-no" title="statement not covered" > feeScheduleKey?: HederaKeyConfig;</span>
|
|
2850
|
-
<span class="cstat-no" title="statement not covered" > /** Token memo */</span>
|
|
2851
|
-
<span class="cstat-no" title="statement not covered" > memo?: string;</span>
|
|
2852
|
-
<span class="cstat-no" title="statement not covered" > /** Max supply (for finite tokens) */</span>
|
|
2853
|
-
<span class="cstat-no" title="statement not covered" > maxSupply?: number;</span>
|
|
2854
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
2855
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
2856
|
-
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
2857
|
-
<span class="cstat-no" title="statement not covered" > * Extended options for account creation with key configuration.</span>
|
|
2858
|
-
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2859
|
-
<span class="cstat-no" title="statement not covered" >export interface AccountCreateOptions {</span>
|
|
2860
|
-
<span class="cstat-no" title="statement not covered" > /** Initial HBAR balance */</span>
|
|
2861
|
-
<span class="cstat-no" title="statement not covered" > initialBalance: number;</span>
|
|
2862
|
-
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2863
|
-
<span class="cstat-no" title="statement not covered" > * Key configuration for the new account.</span>
|
|
2864
|
-
<span class="cstat-no" title="statement not covered" > * For single-sig: provide publicKey</span>
|
|
2865
|
-
<span class="cstat-no" title="statement not covered" > * For multisig: provide signerPublicKeys + threshold</span>
|
|
2866
|
-
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2867
|
-
<span class="cstat-no" title="statement not covered" > key?: HederaKeyConfig;</span>
|
|
2868
|
-
<span class="cstat-no" title="statement not covered" > /** Account memo */</span>
|
|
2869
|
-
<span class="cstat-no" title="statement not covered" > memo?: string;</span>
|
|
2870
|
-
<span class="cstat-no" title="statement not covered" > /** Max automatic token associations */</span>
|
|
2871
|
-
<span class="cstat-no" title="statement not covered" > maxAutomaticTokenAssociations?: number;</span>
|
|
2872
|
-
<span class="cstat-no" title="statement not covered" > /** Receiver signature required */</span>
|
|
2873
|
-
<span class="cstat-no" title="statement not covered" > receiverSignatureRequired?: boolean;</span>
|
|
2874
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
2875
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
2876
|
-
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
2877
|
-
<span class="cstat-no" title="statement not covered" > * Service for building Hedera transactions using the Hashgraph SDK.</span>
|
|
2878
|
-
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2879
|
-
<span class="cstat-no" title="statement not covered" > * @service HederaTransactionBuilderService</span>
|
|
2880
|
-
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2881
|
-
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
2882
|
-
<span class="cstat-no" title="statement not covered" > * Provides methods to construct various Hedera transaction types and serialize them</span>
|
|
2883
|
-
<span class="cstat-no" title="statement not covered" > * to base64 payloads ready for signing. Transactions are automatically frozen with</span>
|
|
2884
|
-
<span class="cstat-no" title="statement not covered" > * the correct network client (mainnet/testnet) based on the active wallet session.</span>
|
|
2885
|
-
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2886
|
-
<span class="cstat-no" title="statement not covered" > * All build methods return a base64-encoded string that can be passed to</span>
|
|
2887
|
-
<span class="cstat-no" title="statement not covered" > * UnifiedWalletService.signTransaction() or submitTransaction().</span>
|
|
2888
|
-
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2889
|
-
<span class="cstat-no" title="statement not covered" > * @providedIn root</span>
|
|
2890
|
-
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2891
|
-
<span class="cstat-no" title="statement not covered" > * @Component({ ... })</span>
|
|
2892
|
-
<span class="cstat-no" title="statement not covered" > * export class SendPage {</span>
|
|
2893
|
-
<span class="cstat-no" title="statement not covered" > * private builder = inject(HederaTransactionBuilderService);</span>
|
|
2894
|
-
<span class="cstat-no" title="statement not covered" > * private wallet = inject(UnifiedWalletService);</span>
|
|
2895
|
-
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2896
|
-
<span class="cstat-no" title="statement not covered" > * async sendHbar(to: string, amount: number) {</span>
|
|
2897
|
-
<span class="cstat-no" title="statement not covered" > * const from = this.wallet.activeAccount()?.address;</span>
|
|
2898
|
-
<span class="cstat-no" title="statement not covered" > * const payload = await this.builder.buildSendHbar(from!, to, amount);</span>
|
|
2899
|
-
<span class="cstat-no" title="statement not covered" > * return this.wallet.submitTransaction({ payload });</span>
|
|
2900
|
-
<span class="cstat-no" title="statement not covered" > * }</span>
|
|
2901
|
-
<span class="cstat-no" title="statement not covered" > * }</span>
|
|
2902
|
-
<span class="cstat-no" title="statement not covered" > * ```</span>
|
|
2903
|
-
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2904
|
-
<span class="cstat-no" title="statement not covered" >@Injectable({</span>
|
|
2905
|
-
<span class="cstat-no" title="statement not covered" > providedIn: 'root',</span>
|
|
2906
|
-
<span class="cstat-no" title="statement not covered" >})</span>
|
|
2907
|
-
<span class="cstat-no" title="statement not covered" >export class HederaTransactionBuilderService {</span>
|
|
2908
|
-
<span class="cstat-no" title="statement not covered" > private readonly wallet = inject(UnifiedWalletService);</span>
|
|
2909
|
-
<span class="cstat-no" title="statement not covered" > private readonly logger = inject(LoggerService).scoped('HederaTransactionBuilder');</span>
|
|
2910
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
2911
|
-
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2912
|
-
<span class="cstat-no" title="statement not covered" > * Gets the network ID from the active wallet account.</span>
|
|
2913
|
-
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2914
|
-
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
2915
|
-
<span class="cstat-no" title="statement not covered" > * Extracts the network identifier (e.g., 'hedera:mainnet', 'hedera:testnet')</span>
|
|
2916
|
-
<span class="cstat-no" title="statement not covered" > * from the currently active account. Used to create the appropriate Hedera</span>
|
|
2917
|
-
<span class="cstat-no" title="statement not covered" > * client for transaction freezing.</span>
|
|
2918
|
-
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2919
|
-
<span class="cstat-no" title="statement not covered" > * @returns Network ID string, or undefined if no active account</span>
|
|
2920
|
-
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2921
|
-
<span class="cstat-no" title="statement not covered" > * @throws {Error} When used in methods that require a network, if no account is active</span>
|
|
2922
|
-
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2923
|
-
<span class="cstat-no" title="statement not covered" > private getNetworkId(): string | undefined {</span>
|
|
2924
|
-
<span class="cstat-no" title="statement not covered" > const activeAccount = this.wallet.activeAccount();</span>
|
|
2925
|
-
<span class="cstat-no" title="statement not covered" > return activeAccount?.networkId;</span>
|
|
2926
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2927
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
2928
|
-
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2929
|
-
<span class="cstat-no" title="statement not covered" > * Build a Hedera Key from configuration.</span>
|
|
2930
|
-
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2931
|
-
<span class="cstat-no" title="statement not covered" > * For single-sig: returns PublicKey directly</span>
|
|
2932
|
-
<span class="cstat-no" title="statement not covered" > * For multisig: returns KeyList (threshold key) with all signer public keys</span>
|
|
2933
|
-
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2934
|
-
<span class="cstat-no" title="statement not covered" > * @param config - Key configuration (single key or threshold key)</span>
|
|
2935
|
-
<span class="cstat-no" title="statement not covered" > * @returns Hedera Key object or undefined if config is empty</span>
|
|
2936
|
-
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2937
|
-
<span class="cstat-no" title="statement not covered" > private buildKeyFromConfig(config?: HederaKeyConfig): Key | undefined {</span>
|
|
2938
|
-
<span class="cstat-no" title="statement not covered" > if (!config) {</span>
|
|
2939
|
-
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
2940
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2941
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
2942
|
-
<span class="cstat-no" title="statement not covered" > // Multisig: threshold key with multiple signers</span>
|
|
2943
|
-
<span class="cstat-no" title="statement not covered" > if (config.signerPublicKeys && config.signerPublicKeys.length > 0 && config.threshold) {</span>
|
|
2944
|
-
<span class="cstat-no" title="statement not covered" > const publicKeys = config.signerPublicKeys.map((pk) => PublicKey.fromString(pk));</span>
|
|
2945
|
-
<span class="cstat-no" title="statement not covered" > const keyList = new KeyList(publicKeys, config.threshold);</span>
|
|
2946
|
-
<span class="cstat-no" title="statement not covered" > this.logger.debug('Built threshold key', {</span>
|
|
2947
|
-
<span class="cstat-no" title="statement not covered" > signerCount: publicKeys.length,</span>
|
|
2948
|
-
<span class="cstat-no" title="statement not covered" > threshold: config.threshold,</span>
|
|
2949
|
-
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2950
|
-
<span class="cstat-no" title="statement not covered" > return keyList;</span>
|
|
2951
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2952
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
2953
|
-
<span class="cstat-no" title="statement not covered" > // Single-sig: direct public key</span>
|
|
2954
|
-
<span class="cstat-no" title="statement not covered" > if (config.publicKey) {</span>
|
|
2955
|
-
<span class="cstat-no" title="statement not covered" > const key = PublicKey.fromString(config.publicKey);</span>
|
|
2956
|
-
<span class="cstat-no" title="statement not covered" > this.logger.debug('Built single public key');</span>
|
|
2957
|
-
<span class="cstat-no" title="statement not covered" > return key;</span>
|
|
2958
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2545
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2546
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2547
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2548
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2549
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2550
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2551
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2552
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2553
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2554
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2555
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2556
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2557
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2558
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2559
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2560
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2561
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2562
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2563
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2564
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2565
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2566
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2567
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2568
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2569
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2570
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2571
|
+
<span class="cline-any cline-yes">7x</span>
|
|
2572
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2573
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2574
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2575
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2576
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2577
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2578
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2579
|
+
<span class="cline-any cline-yes">36x</span>
|
|
2580
|
+
<span class="cline-any cline-yes">36x</span>
|
|
2581
|
+
<span class="cline-any cline-yes">36x</span>
|
|
2582
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2583
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2584
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2585
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2586
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2587
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2588
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2589
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2590
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2591
|
+
<span class="cline-any cline-yes">36x</span>
|
|
2592
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2593
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2594
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2595
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2596
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2597
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2598
|
+
<span class="cline-any cline-yes">42x</span>
|
|
2599
|
+
<span class="cline-any cline-yes">42x</span>
|
|
2600
|
+
<span class="cline-any cline-yes">42x</span>
|
|
2601
|
+
<span class="cline-any cline-yes">42x</span>
|
|
2602
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2603
|
+
<span class="cline-any cline-yes">42x</span>
|
|
2604
|
+
<span class="cline-any cline-yes">40x</span>
|
|
2605
|
+
<span class="cline-any cline-yes">42x</span>
|
|
2606
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2607
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2608
|
+
<span class="cline-any cline-yes">42x</span>
|
|
2609
|
+
<span class="cline-any cline-yes">42x</span>
|
|
2610
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2611
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2612
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2613
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2614
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2615
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2616
|
+
<span class="cline-any cline-yes">43x</span>
|
|
2617
|
+
<span class="cline-any cline-yes">43x</span>
|
|
2618
|
+
<span class="cline-any cline-yes">812x</span>
|
|
2619
|
+
<span class="cline-any cline-yes">812x</span>
|
|
2620
|
+
<span class="cline-any cline-yes">43x</span>
|
|
2621
|
+
<span class="cline-any cline-yes">43x</span>
|
|
2622
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2623
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2624
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2625
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2626
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2627
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2628
|
+
<span class="cline-any cline-no"> </span>
|
|
2629
|
+
<span class="cline-any cline-no"> </span>
|
|
2630
|
+
<span class="cline-any cline-no"> </span>
|
|
2631
|
+
<span class="cline-any cline-no"> </span>
|
|
2632
|
+
<span class="cline-any cline-no"> </span>
|
|
2633
|
+
<span class="cline-any cline-no"> </span>
|
|
2634
|
+
<span class="cline-any cline-no"> </span>
|
|
2635
|
+
<span class="cline-any cline-yes">46x</span>
|
|
2636
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">/**
|
|
2637
|
+
* HSuite Native Connect
|
|
2638
|
+
* Copyright 2024-2025 HSuite (https://hsuite.finance)
|
|
2639
|
+
*
|
|
2640
|
+
* SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
|
|
2641
|
+
*
|
|
2642
|
+
* This file is part of HSuite Native Connect. For commercial licensing,
|
|
2643
|
+
* visit https://hsuite.finance/licensing
|
|
2644
|
+
*/
|
|
2645
|
+
|
|
2646
|
+
/**
|
|
2647
|
+
* @file Service for building Hedera transactions using the Hashgraph SDK.
|
|
2648
|
+
*
|
|
2649
|
+
* @module services/transaction-builders/hedera
|
|
2650
|
+
*
|
|
2651
|
+
* @description
|
|
2652
|
+
* HederaTransactionBuilderService provides methods to construct various Hedera transaction
|
|
2653
|
+
* types and serialize them to base64 payloads ready for signing. It uses the @hashgraph/sdk
|
|
2654
|
+
* library for proper transaction construction and automatically freezes transactions with
|
|
2655
|
+
* the correct network client.
|
|
2656
|
+
*
|
|
2657
|
+
* **Supported Transaction Types:**
|
|
2658
|
+
* - HBAR transfers (single and atomic multi-transfer)
|
|
2659
|
+
* - Fungible token transfers
|
|
2660
|
+
* - NFT transfers
|
|
2661
|
+
* - Token association/dissociation
|
|
2662
|
+
* - Token creation (with auto key configuration)
|
|
2663
|
+
* - Token minting/burning
|
|
2664
|
+
* - Topic creation (with auto key configuration)
|
|
2665
|
+
* - Topic message submission
|
|
2666
|
+
* - Account creation (with multisig support)
|
|
2667
|
+
* - Account updates
|
|
2668
|
+
* - Batch transactions
|
|
2669
|
+
*
|
|
2670
|
+
* **Auto-Key Configuration:**
|
|
2671
|
+
* When creating entities (topics, tokens, accounts), the builder automatically
|
|
2672
|
+
* inherits the key structure from the active account:
|
|
2673
|
+
* - Single-sig accounts -> entity uses account's public key
|
|
2674
|
+
* - Multisig accounts -> entity uses threshold key with all signers
|
|
2675
|
+
*/
|
|
2676
|
+
|
|
2677
|
+
import { Injectable, inject } from '@angular/core';
|
|
2678
|
+
import {
|
|
2679
|
+
TransferTransaction,
|
|
2680
|
+
TokenAssociateTransaction,
|
|
2681
|
+
TokenDissociateTransaction,
|
|
2682
|
+
TokenCreateTransaction,
|
|
2683
|
+
TokenMintTransaction,
|
|
2684
|
+
TokenBurnTransaction,
|
|
2685
|
+
TopicCreateTransaction,
|
|
2686
|
+
TopicMessageSubmitTransaction,
|
|
2687
|
+
AccountCreateTransaction,
|
|
2688
|
+
AccountUpdateTransaction,
|
|
2689
|
+
ScheduleCreateTransaction,
|
|
2690
|
+
BatchTransaction,
|
|
2691
|
+
Transaction,
|
|
2692
|
+
Hbar,
|
|
2693
|
+
AccountId,
|
|
2694
|
+
TokenId,
|
|
2695
|
+
NftId,
|
|
2696
|
+
TransactionId,
|
|
2697
|
+
Client,
|
|
2698
|
+
PrivateKey,
|
|
2699
|
+
PublicKey,
|
|
2700
|
+
TokenType,
|
|
2701
|
+
TokenSupplyType,
|
|
2702
|
+
KeyList,
|
|
2703
|
+
Key,
|
|
2704
|
+
} from '@hashgraph/sdk';
|
|
2705
|
+
|
|
2706
|
+
import { LoggerService } from '../logger.service';
|
|
2707
|
+
|
|
2708
|
+
import { ACTIVE_ACCOUNT_SOURCE } from './active-account-source';
|
|
2709
|
+
import { scaleHederaAmountToBaseUnits, assertSafeInteger } from './hedera-amount-utils';
|
|
2710
|
+
|
|
2711
|
+
/**
|
|
2712
|
+
* Supported inner transaction types for batch transactions.
|
|
2713
|
+
* Excludes 'batch-transaction' since batches cannot be nested.
|
|
2714
|
+
*/
|
|
2715
|
+
export type BatchInnerTransactionType =
|
|
2716
|
+
| 'send-hbar'
|
|
2717
|
+
| 'send-token'
|
|
2718
|
+
| 'send-nft'
|
|
2719
|
+
| 'token-associate'
|
|
2720
|
+
| 'token-dissociate'
|
|
2721
|
+
| 'token-create'
|
|
2722
|
+
| 'token-mint'
|
|
2723
|
+
| 'token-burn'
|
|
2724
|
+
| 'topic-create'
|
|
2725
|
+
| 'topic-message'
|
|
2726
|
+
| 'account-create'
|
|
2727
|
+
| 'account-update';
|
|
2728
|
+
|
|
2729
|
+
/**
|
|
2730
|
+
* Inner transaction descriptor for batch transactions.
|
|
2731
|
+
* Contains all possible fields for different transaction types.
|
|
2732
|
+
*/
|
|
2733
|
+
export interface BatchInnerTransaction {
|
|
2734
|
+
/** Type of transaction */
|
|
2735
|
+
type: BatchInnerTransactionType;
|
|
2736
|
+
|
|
2737
|
+
// Transfer fields (send-hbar, send-token, send-nft)
|
|
2738
|
+
/** Recipient account */
|
|
2739
|
+
toAccount?: string;
|
|
2740
|
+
/** Amount for HBAR (tinybars) or token transfers */
|
|
2741
|
+
amount?: number;
|
|
2742
|
+
/** Token ID for token operations */
|
|
2743
|
+
tokenId?: string;
|
|
2744
|
+
/** Serial number for NFT transfers */
|
|
2745
|
+
serialNumber?: number;
|
|
2746
|
+
|
|
2747
|
+
// Token create fields
|
|
2748
|
+
/** Token name for creation */
|
|
2749
|
+
tokenName?: string;
|
|
2750
|
+
/** Token symbol for creation */
|
|
2751
|
+
tokenSymbol?: string;
|
|
2752
|
+
/** Token decimals for creation */
|
|
2753
|
+
decimals?: number;
|
|
2754
|
+
/** Initial supply for fungible tokens */
|
|
2755
|
+
initialSupply?: number;
|
|
2756
|
+
/** Max supply (0 = infinite) */
|
|
2757
|
+
maxSupply?: number;
|
|
2758
|
+
/** Whether supply is finite or infinite */
|
|
2759
|
+
supplyType?: 'finite' | 'infinite';
|
|
2760
|
+
|
|
2761
|
+
// Token mint/burn fields
|
|
2762
|
+
/** Metadata for NFT minting (array for multiple NFTs) */
|
|
2763
|
+
metadata?: string | string[];
|
|
2764
|
+
|
|
2765
|
+
// Topic fields
|
|
2766
|
+
/** Topic ID for message submission */
|
|
2767
|
+
topicId?: string;
|
|
2768
|
+
/** Message content for topic submission */
|
|
2769
|
+
message?: string;
|
|
2770
|
+
/** Topic memo for creation */
|
|
2771
|
+
topicMemo?: string;
|
|
2772
|
+
|
|
2773
|
+
// Account fields
|
|
2774
|
+
/** Initial balance for account creation (tinybars) */
|
|
2775
|
+
initialBalance?: number;
|
|
2776
|
+
/** Memo for account update */
|
|
2777
|
+
memo?: string;
|
|
2778
|
+
/** Max auto associations for account */
|
|
2779
|
+
maxAutoAssociations?: number;
|
|
2780
|
+
}
|
|
2781
|
+
|
|
2782
|
+
/**
|
|
2783
|
+
* Key configuration for entity creation transactions.
|
|
2784
|
+
*
|
|
2785
|
+
* For single-sig accounts: provide a single publicKey string
|
|
2786
|
+
* For multisig accounts: provide signerPublicKeys array + threshold
|
|
2787
|
+
*/
|
|
2788
|
+
export interface HederaKeyConfig {
|
|
2789
|
+
/**
|
|
2790
|
+
* Single public key (hex/DER encoded) for single-sig accounts.
|
|
2791
|
+
* If provided alone, this key is used directly.
|
|
2792
|
+
*/
|
|
2793
|
+
publicKey?: string;
|
|
2794
|
+
|
|
2795
|
+
/**
|
|
2796
|
+
* Array of public keys for multisig (threshold key) configuration.
|
|
2797
|
+
* Requires threshold to be set.
|
|
2798
|
+
*/
|
|
2799
|
+
signerPublicKeys?: string[];
|
|
2800
|
+
|
|
2801
|
+
/**
|
|
2802
|
+
* Threshold for multisig - number of signatures required.
|
|
2803
|
+
* Only used when signerPublicKeys is provided.
|
|
2804
|
+
*/
|
|
2805
|
+
threshold?: number;
|
|
2806
|
+
}
|
|
2807
|
+
|
|
2808
|
+
/**
|
|
2809
|
+
* Extended options for topic creation with key configuration.
|
|
2810
|
+
*/
|
|
2811
|
+
export interface TopicCreateOptions {
|
|
2812
|
+
/** Topic memo/description */
|
|
2813
|
+
memo?: string;
|
|
2814
|
+
/** Admin key - can update/delete the topic. Uses creator's key if not specified. */
|
|
2815
|
+
adminKey?: HederaKeyConfig;
|
|
2816
|
+
/** Submit key - required to submit messages. If not set, anyone can submit. */
|
|
2817
|
+
submitKey?: HederaKeyConfig;
|
|
2818
|
+
/** Auto-renew account for fees */
|
|
2819
|
+
autoRenewAccountId?: string;
|
|
2820
|
+
}
|
|
2821
|
+
|
|
2822
|
+
/**
|
|
2823
|
+
* Extended options for token creation with key configuration.
|
|
2824
|
+
*/
|
|
2825
|
+
export interface TokenCreateOptions {
|
|
2826
|
+
/** Token name */
|
|
2827
|
+
name: string;
|
|
2828
|
+
/** Token symbol */
|
|
2829
|
+
symbol: string;
|
|
2830
|
+
/** Decimal places (0 for NFTs) */
|
|
2831
|
+
decimals: number;
|
|
2832
|
+
/** Initial supply (0 for NFTs) */
|
|
2833
|
+
initialSupply: number;
|
|
2834
|
+
/** Token type: FUNGIBLE or NFT */
|
|
2835
|
+
tokenType?: 'FUNGIBLE' | 'NFT';
|
|
2836
|
+
/** Admin key - can update/delete token */
|
|
2837
|
+
adminKey?: HederaKeyConfig;
|
|
2838
|
+
/** Supply key - can mint/burn tokens */
|
|
2839
|
+
supplyKey?: HederaKeyConfig;
|
|
2840
|
+
/** Freeze key - can freeze/unfreeze accounts */
|
|
2841
|
+
freezeKey?: HederaKeyConfig;
|
|
2842
|
+
/** Wipe key - can wipe token balance from accounts */
|
|
2843
|
+
wipeKey?: HederaKeyConfig;
|
|
2844
|
+
/** Pause key - can pause/unpause token operations */
|
|
2845
|
+
pauseKey?: HederaKeyConfig;
|
|
2846
|
+
/** KYC key - can grant/revoke KYC */
|
|
2847
|
+
kycKey?: HederaKeyConfig;
|
|
2848
|
+
/** Fee schedule key - can update custom fees */
|
|
2849
|
+
feeScheduleKey?: HederaKeyConfig;
|
|
2850
|
+
/** Token memo */
|
|
2851
|
+
memo?: string;
|
|
2852
|
+
/** Max supply (for finite tokens) */
|
|
2853
|
+
maxSupply?: number;
|
|
2854
|
+
}
|
|
2855
|
+
|
|
2856
|
+
/**
|
|
2857
|
+
* Extended options for account creation with key configuration.
|
|
2858
|
+
*/
|
|
2859
|
+
export interface AccountCreateOptions {
|
|
2860
|
+
/** Initial HBAR balance */
|
|
2861
|
+
initialBalance: number;
|
|
2862
|
+
/**
|
|
2863
|
+
* Key configuration for the new account.
|
|
2864
|
+
* For single-sig: provide publicKey
|
|
2865
|
+
* For multisig: provide signerPublicKeys + threshold
|
|
2866
|
+
*/
|
|
2867
|
+
key?: HederaKeyConfig;
|
|
2868
|
+
/** Account memo */
|
|
2869
|
+
memo?: string;
|
|
2870
|
+
/** Max automatic token associations */
|
|
2871
|
+
maxAutomaticTokenAssociations?: number;
|
|
2872
|
+
/** Receiver signature required */
|
|
2873
|
+
receiverSignatureRequired?: boolean;
|
|
2874
|
+
}
|
|
2875
|
+
|
|
2876
|
+
/**
|
|
2877
|
+
* Service for building Hedera transactions using the Hashgraph SDK.
|
|
2878
|
+
*
|
|
2879
|
+
* @service HederaTransactionBuilderService
|
|
2880
|
+
*
|
|
2881
|
+
* @description
|
|
2882
|
+
* Provides methods to construct various Hedera transaction types and serialize them
|
|
2883
|
+
* to base64 payloads ready for signing. Transactions are automatically frozen with
|
|
2884
|
+
* the correct network client (mainnet/testnet) based on the active wallet session.
|
|
2885
|
+
*
|
|
2886
|
+
* All build methods return a base64-encoded string that can be passed to
|
|
2887
|
+
* UnifiedWalletService.signTransaction() or submitTransaction().
|
|
2888
|
+
*
|
|
2889
|
+
* @providedIn root
|
|
2890
|
+
*
|
|
2891
|
+
* @Component({ ... })
|
|
2892
|
+
* export class SendPage {
|
|
2893
|
+
* private builder = inject(HederaTransactionBuilderService);
|
|
2894
|
+
* private wallet = inject(UnifiedWalletService);
|
|
2895
|
+
*
|
|
2896
|
+
* async sendHbar(to: string, amount: number) {
|
|
2897
|
+
* const from = this.wallet.activeAccount()?.address;
|
|
2898
|
+
* const payload = await this.builder.buildSendHbar(from!, to, amount);
|
|
2899
|
+
* return this.wallet.submitTransaction({ payload });
|
|
2900
|
+
* }
|
|
2901
|
+
* }
|
|
2902
|
+
* ```
|
|
2903
|
+
*/
|
|
2904
|
+
@Injectable({
|
|
2905
|
+
providedIn: 'root',
|
|
2906
|
+
})
|
|
2907
|
+
export class HederaTransactionBuilderService {
|
|
2908
|
+
private readonly accountSource = inject(ACTIVE_ACCOUNT_SOURCE);
|
|
2909
|
+
private readonly logger = inject(LoggerService).scoped('HederaTransactionBuilder');
|
|
2910
|
+
|
|
2911
|
+
/**
|
|
2912
|
+
* Gets the network ID from the active wallet account.
|
|
2913
|
+
*
|
|
2914
|
+
* @description
|
|
2915
|
+
* Extracts the network identifier (e.g., 'hedera:mainnet', 'hedera:testnet')
|
|
2916
|
+
* from the currently active account. Used to create the appropriate Hedera
|
|
2917
|
+
* client for transaction freezing.
|
|
2918
|
+
*
|
|
2919
|
+
* @returns Network ID string, or undefined if no active account
|
|
2920
|
+
*
|
|
2921
|
+
* @throws {Error} When used in methods that require a network, if no account is active
|
|
2922
|
+
*/
|
|
2923
|
+
private getNetworkId(): string | undefined {
|
|
2924
|
+
const activeAccount = this.accountSource.activeAccount();
|
|
2925
|
+
return activeAccount?.networkId;
|
|
2926
|
+
}
|
|
2927
|
+
|
|
2928
|
+
/**
|
|
2929
|
+
* Build a Hedera Key from configuration.
|
|
2930
|
+
*
|
|
2931
|
+
* For single-sig: returns PublicKey directly
|
|
2932
|
+
* For multisig: returns KeyList (threshold key) with all signer public keys
|
|
2933
|
+
*
|
|
2934
|
+
* @param config - Key configuration (single key or threshold key)
|
|
2935
|
+
* @returns Hedera Key object or undefined if config is empty
|
|
2936
|
+
*/
|
|
2937
|
+
private buildKeyFromConfig(config?: HederaKeyConfig): Key | undefined {
|
|
2938
|
+
if (!config) {
|
|
2939
|
+
return undefined;
|
|
2940
|
+
}
|
|
2941
|
+
|
|
2942
|
+
// Multisig: threshold key with multiple signers
|
|
2943
|
+
if (config.signerPublicKeys && config.signerPublicKeys.length > 0 && config.threshold) {
|
|
2944
|
+
const publicKeys = config.signerPublicKeys.map((pk) => PublicKey.fromString(pk));
|
|
2945
|
+
const keyList = new KeyList(publicKeys, config.threshold);
|
|
2946
|
+
this.logger.debug('Built threshold key', {
|
|
2947
|
+
signerCount: publicKeys.length,
|
|
2948
|
+
threshold: config.threshold,
|
|
2949
|
+
});
|
|
2950
|
+
return keyList;
|
|
2951
|
+
}
|
|
2952
|
+
|
|
2953
|
+
// Single-sig: direct public key
|
|
2954
|
+
if (config.publicKey) {
|
|
2955
|
+
const key = PublicKey.fromString(config.publicKey);
|
|
2956
|
+
this.logger.debug('Built single public key');
|
|
2957
|
+
return key;
|
|
2958
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > }</span>
|
|
2959
2959
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
2960
2960
|
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
2961
|
-
|
|
2962
|
-
|
|
2963
|
-
|
|
2964
|
-
|
|
2965
|
-
|
|
2966
|
-
|
|
2967
|
-
|
|
2968
|
-
|
|
2969
|
-
|
|
2970
|
-
|
|
2971
|
-
|
|
2972
|
-
|
|
2973
|
-
|
|
2974
|
-
|
|
2975
|
-
|
|
2976
|
-
<span class="
|
|
2961
|
+
}
|
|
2962
|
+
|
|
2963
|
+
/**
|
|
2964
|
+
* Get the key configuration for the active account.
|
|
2965
|
+
*
|
|
2966
|
+
* For single-sig: returns { publicKey: '...' }
|
|
2967
|
+
* For multisig: returns { signerPublicKeys: [...], threshold: N }
|
|
2968
|
+
*
|
|
2969
|
+
* This allows automatic key configuration for entity creation (topics, tokens, etc.)
|
|
2970
|
+
* so that entities inherit the same key structure as the creating account.
|
|
2971
|
+
*
|
|
2972
|
+
* @returns Key configuration or undefined if no active account
|
|
2973
|
+
*/
|
|
2974
|
+
private getActiveAccountKeyConfig(): HederaKeyConfig | undefined {
|
|
2975
|
+
const activeAccount = this.accountSource.activeAccount();
|
|
2976
|
+
if (!activeAccount) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2977
2977
|
<span class="cstat-no" title="statement not covered" > this.logger.debug('No active account for key config');</span>
|
|
2978
2978
|
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
2979
2979
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2980
|
-
|
|
2981
|
-
|
|
2982
|
-
|
|
2983
|
-
|
|
2984
|
-
|
|
2985
|
-
|
|
2986
|
-
|
|
2987
|
-
|
|
2988
|
-
|
|
2989
|
-
|
|
2990
|
-
|
|
2991
|
-
|
|
2992
|
-
|
|
2993
|
-
|
|
2994
|
-
<span class="
|
|
2980
|
+
|
|
2981
|
+
const metadata = activeAccount.metadata;
|
|
2982
|
+
|
|
2983
|
+
// Check if this is a multisig account
|
|
2984
|
+
if (metadata?.['isMultisig'] === true) {
|
|
2985
|
+
const signerPublicKeys = metadata['signerPublicKeys'] as string[] | undefined;
|
|
2986
|
+
const threshold = metadata['threshold'] as number | undefined;
|
|
2987
|
+
|
|
2988
|
+
if (signerPublicKeys && signerPublicKeys.length > 0 && threshold) {
|
|
2989
|
+
this.logger.debug('Active account is multisig', {
|
|
2990
|
+
threshold,
|
|
2991
|
+
signerCount: signerPublicKeys.length,
|
|
2992
|
+
});
|
|
2993
|
+
return { signerPublicKeys, threshold };
|
|
2994
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > }</span>
|
|
2995
2995
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
2996
2996
|
<span class="cstat-no" title="statement not covered" > this.logger.warn('Multisig account missing signer keys or threshold in metadata');</span>
|
|
2997
2997
|
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
2998
2998
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2999
|
-
|
|
3000
|
-
|
|
3001
|
-
|
|
3002
|
-
|
|
3003
|
-
|
|
3004
|
-
|
|
3005
|
-
<span class="
|
|
2999
|
+
|
|
3000
|
+
// Single-sig account - get public key from metadata
|
|
3001
|
+
const publicKey = metadata?.['publicKey'] as string | undefined;
|
|
3002
|
+
if (publicKey) {
|
|
3003
|
+
this.logger.debug('Active account is single-sig');
|
|
3004
|
+
return { publicKey };
|
|
3005
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > }</span>
|
|
3006
3006
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
3007
3007
|
<span class="cstat-no" title="statement not covered" > this.logger.debug('No public key in active account metadata');</span>
|
|
3008
3008
|
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
3009
|
-
|
|
3010
|
-
|
|
3011
|
-
|
|
3012
|
-
|
|
3013
|
-
|
|
3014
|
-
|
|
3015
|
-
|
|
3016
|
-
|
|
3017
|
-
|
|
3018
|
-
|
|
3019
|
-
|
|
3020
|
-
|
|
3021
|
-
|
|
3022
|
-
|
|
3023
|
-
|
|
3024
|
-
|
|
3025
|
-
|
|
3026
|
-
|
|
3027
|
-
|
|
3028
|
-
|
|
3029
|
-
|
|
3030
|
-
|
|
3031
|
-
|
|
3032
|
-
|
|
3033
|
-
|
|
3034
|
-
|
|
3035
|
-
|
|
3036
|
-
|
|
3037
|
-
|
|
3038
|
-
|
|
3039
|
-
|
|
3040
|
-
|
|
3041
|
-
|
|
3042
|
-
|
|
3043
|
-
|
|
3044
|
-
|
|
3045
|
-
|
|
3046
|
-
|
|
3047
|
-
|
|
3048
|
-
|
|
3049
|
-
|
|
3050
|
-
|
|
3051
|
-
|
|
3052
|
-
|
|
3053
|
-
|
|
3054
|
-
|
|
3055
|
-
|
|
3056
|
-
|
|
3057
|
-
|
|
3058
|
-
|
|
3059
|
-
|
|
3060
|
-
|
|
3061
|
-
|
|
3062
|
-
|
|
3063
|
-
|
|
3064
|
-
|
|
3065
|
-
|
|
3066
|
-
|
|
3067
|
-
|
|
3068
|
-
|
|
3069
|
-
|
|
3070
|
-
|
|
3071
|
-
|
|
3072
|
-
|
|
3073
|
-
|
|
3074
|
-
|
|
3075
|
-
|
|
3076
|
-
|
|
3077
|
-
|
|
3078
|
-
|
|
3079
|
-
|
|
3080
|
-
|
|
3081
|
-
|
|
3082
|
-
|
|
3083
|
-
|
|
3084
|
-
|
|
3085
|
-
|
|
3086
|
-
|
|
3087
|
-
|
|
3088
|
-
|
|
3089
|
-
|
|
3090
|
-
|
|
3091
|
-
|
|
3092
|
-
|
|
3093
|
-
|
|
3094
|
-
|
|
3095
|
-
|
|
3096
|
-
|
|
3097
|
-
|
|
3098
|
-
|
|
3099
|
-
|
|
3100
|
-
|
|
3101
|
-
|
|
3102
|
-
|
|
3103
|
-
|
|
3104
|
-
|
|
3105
|
-
|
|
3106
|
-
|
|
3107
|
-
|
|
3108
|
-
|
|
3109
|
-
|
|
3110
|
-
|
|
3111
|
-
|
|
3112
|
-
|
|
3113
|
-
|
|
3114
|
-
|
|
3115
|
-
|
|
3116
|
-
|
|
3117
|
-
|
|
3118
|
-
|
|
3119
|
-
|
|
3120
|
-
|
|
3121
|
-
|
|
3122
|
-
|
|
3123
|
-
|
|
3124
|
-
|
|
3125
|
-
|
|
3126
|
-
|
|
3127
|
-
|
|
3128
|
-
|
|
3129
|
-
|
|
3130
|
-
|
|
3131
|
-
|
|
3132
|
-
|
|
3133
|
-
|
|
3134
|
-
|
|
3135
|
-
|
|
3136
|
-
|
|
3137
|
-
|
|
3138
|
-
|
|
3139
|
-
|
|
3140
|
-
|
|
3141
|
-
|
|
3142
|
-
|
|
3143
|
-
|
|
3144
|
-
|
|
3145
|
-
|
|
3146
|
-
|
|
3147
|
-
|
|
3148
|
-
|
|
3149
|
-
|
|
3150
|
-
|
|
3151
|
-
|
|
3152
|
-
|
|
3153
|
-
|
|
3154
|
-
|
|
3155
|
-
|
|
3156
|
-
|
|
3157
|
-
|
|
3158
|
-
|
|
3159
|
-
|
|
3160
|
-
|
|
3161
|
-
|
|
3162
|
-
|
|
3163
|
-
|
|
3164
|
-
|
|
3165
|
-
|
|
3166
|
-
|
|
3167
|
-
|
|
3168
|
-
|
|
3169
|
-
|
|
3170
|
-
|
|
3171
|
-
|
|
3172
|
-
|
|
3173
|
-
|
|
3174
|
-
|
|
3175
|
-
|
|
3176
|
-
|
|
3177
|
-
|
|
3178
|
-
|
|
3179
|
-
|
|
3180
|
-
|
|
3181
|
-
|
|
3182
|
-
|
|
3183
|
-
|
|
3184
|
-
|
|
3185
|
-
|
|
3186
|
-
|
|
3187
|
-
|
|
3188
|
-
|
|
3189
|
-
|
|
3190
|
-
|
|
3191
|
-
|
|
3192
|
-
|
|
3193
|
-
|
|
3194
|
-
|
|
3195
|
-
|
|
3196
|
-
|
|
3197
|
-
|
|
3198
|
-
|
|
3199
|
-
|
|
3200
|
-
|
|
3201
|
-
|
|
3202
|
-
|
|
3203
|
-
|
|
3204
|
-
|
|
3205
|
-
|
|
3206
|
-
|
|
3207
|
-
|
|
3208
|
-
|
|
3209
|
-
|
|
3210
|
-
|
|
3211
|
-
|
|
3212
|
-
|
|
3213
|
-
|
|
3214
|
-
|
|
3215
|
-
|
|
3216
|
-
|
|
3217
|
-
|
|
3218
|
-
|
|
3219
|
-
|
|
3220
|
-
|
|
3221
|
-
|
|
3222
|
-
|
|
3223
|
-
|
|
3224
|
-
|
|
3225
|
-
|
|
3226
|
-
|
|
3227
|
-
|
|
3228
|
-
|
|
3229
|
-
|
|
3230
|
-
|
|
3231
|
-
|
|
3232
|
-
|
|
3233
|
-
|
|
3234
|
-
|
|
3235
|
-
|
|
3236
|
-
|
|
3237
|
-
|
|
3238
|
-
|
|
3239
|
-
|
|
3240
|
-
|
|
3241
|
-
|
|
3242
|
-
|
|
3243
|
-
|
|
3244
|
-
|
|
3245
|
-
|
|
3246
|
-
|
|
3247
|
-
|
|
3248
|
-
|
|
3249
|
-
|
|
3250
|
-
|
|
3251
|
-
|
|
3252
|
-
|
|
3253
|
-
|
|
3254
|
-
|
|
3255
|
-
|
|
3256
|
-
|
|
3257
|
-
|
|
3258
|
-
|
|
3259
|
-
|
|
3260
|
-
|
|
3261
|
-
|
|
3262
|
-
|
|
3263
|
-
|
|
3264
|
-
|
|
3265
|
-
|
|
3266
|
-
|
|
3267
|
-
|
|
3268
|
-
|
|
3269
|
-
|
|
3270
|
-
|
|
3271
|
-
|
|
3272
|
-
|
|
3273
|
-
|
|
3274
|
-
|
|
3275
|
-
|
|
3276
|
-
|
|
3277
|
-
|
|
3278
|
-
|
|
3279
|
-
|
|
3280
|
-
|
|
3281
|
-
|
|
3282
|
-
|
|
3283
|
-
|
|
3284
|
-
|
|
3285
|
-
|
|
3286
|
-
|
|
3287
|
-
|
|
3288
|
-
|
|
3289
|
-
|
|
3290
|
-
|
|
3291
|
-
|
|
3292
|
-
|
|
3293
|
-
|
|
3294
|
-
|
|
3295
|
-
|
|
3296
|
-
|
|
3297
|
-
|
|
3298
|
-
|
|
3299
|
-
|
|
3300
|
-
|
|
3301
|
-
|
|
3302
|
-
|
|
3303
|
-
|
|
3304
|
-
|
|
3305
|
-
|
|
3306
|
-
|
|
3307
|
-
|
|
3308
|
-
|
|
3309
|
-
|
|
3310
|
-
|
|
3311
|
-
|
|
3312
|
-
|
|
3313
|
-
|
|
3314
|
-
|
|
3315
|
-
|
|
3316
|
-
|
|
3317
|
-
|
|
3318
|
-
|
|
3319
|
-
|
|
3320
|
-
|
|
3321
|
-
<span class="
|
|
3009
|
+
}
|
|
3010
|
+
|
|
3011
|
+
/**
|
|
3012
|
+
* Builds a simple HBAR transfer transaction.
|
|
3013
|
+
*
|
|
3014
|
+
* @description
|
|
3015
|
+
* Creates a TransferTransaction that moves HBAR from one account to another.
|
|
3016
|
+
* The transaction is automatically frozen with the appropriate network client.
|
|
3017
|
+
*
|
|
3018
|
+
* @param fromAccount - Sender account ID (e.g., "0.0.12345")
|
|
3019
|
+
* @param toAccount - Recipient account ID
|
|
3020
|
+
* @param amount - Amount in HBAR (e.g., 1.5 for 1.5 HBAR)
|
|
3021
|
+
*
|
|
3022
|
+
* @returns Base64 encoded transaction bytes
|
|
3023
|
+
*
|
|
3024
|
+
* @throws {Error} If no active wallet session
|
|
3025
|
+
*/
|
|
3026
|
+
async buildSendHbar(fromAccount: string, toAccount: string, amount: number): Promise<string> {
|
|
3027
|
+
const transaction = new TransferTransaction()
|
|
3028
|
+
.addHbarTransfer(AccountId.fromString(fromAccount), new Hbar(-amount))
|
|
3029
|
+
.addHbarTransfer(AccountId.fromString(toAccount), new Hbar(amount));
|
|
3030
|
+
|
|
3031
|
+
return this.serializeTransaction(transaction, fromAccount);
|
|
3032
|
+
}
|
|
3033
|
+
|
|
3034
|
+
/**
|
|
3035
|
+
* Builds a fungible token transfer transaction.
|
|
3036
|
+
*
|
|
3037
|
+
* @description
|
|
3038
|
+
* Creates a TransferTransaction that moves fungible tokens between accounts.
|
|
3039
|
+
* The amount is automatically converted to the smallest unit based on decimals.
|
|
3040
|
+
*
|
|
3041
|
+
* @param fromAccount - Sender account ID
|
|
3042
|
+
* @param toAccount - Recipient account ID
|
|
3043
|
+
* @param tokenId - Token ID (e.g., "0.0.98765")
|
|
3044
|
+
* @param amount - Token amount in display units (e.g., 100 tokens)
|
|
3045
|
+
* @param decimals - Token decimals for conversion (default 0)
|
|
3046
|
+
*
|
|
3047
|
+
* @returns Base64 encoded transaction bytes
|
|
3048
|
+
*
|
|
3049
|
+
* @throws {Error} If no active wallet session
|
|
3050
|
+
*/
|
|
3051
|
+
async buildSendToken(
|
|
3052
|
+
fromAccount: string,
|
|
3053
|
+
toAccount: string,
|
|
3054
|
+
tokenId: string,
|
|
3055
|
+
amount: number,
|
|
3056
|
+
decimals = 0,
|
|
3057
|
+
): Promise<string> {
|
|
3058
|
+
const token = TokenId.fromString(tokenId);
|
|
3059
|
+
// bigint scaling avoids the silent precision loss that
|
|
3060
|
+
// `amount * Math.pow(10, decimals)` exhibits past Number.MAX_SAFE_INTEGER
|
|
3061
|
+
// (Hedera supports up to 18 decimals). Narrow once at the SDK boundary
|
|
3062
|
+
// with an explicit overflow assertion.
|
|
3063
|
+
const scaled = scaleHederaAmountToBaseUnits(amount, decimals);
|
|
3064
|
+
const actualAmount = assertSafeInteger(scaled, `buildSendToken tokenId=${tokenId}`);
|
|
3065
|
+
|
|
3066
|
+
const transaction = new TransferTransaction()
|
|
3067
|
+
.addTokenTransfer(token, AccountId.fromString(fromAccount), -actualAmount)
|
|
3068
|
+
.addTokenTransfer(token, AccountId.fromString(toAccount), actualAmount);
|
|
3069
|
+
|
|
3070
|
+
return this.serializeTransaction(transaction, fromAccount);
|
|
3071
|
+
}
|
|
3072
|
+
|
|
3073
|
+
/**
|
|
3074
|
+
* Builds an NFT transfer transaction.
|
|
3075
|
+
*
|
|
3076
|
+
* @description
|
|
3077
|
+
* Creates a TransferTransaction that moves an NFT (identified by token ID
|
|
3078
|
+
* and serial number) from one account to another.
|
|
3079
|
+
*
|
|
3080
|
+
* @param fromAccount - Sender account ID
|
|
3081
|
+
* @param toAccount - Recipient account ID
|
|
3082
|
+
* @param tokenId - NFT token ID (e.g., "0.0.98765")
|
|
3083
|
+
* @param serialNumber - NFT serial number (e.g., 1, 2, 3)
|
|
3084
|
+
*
|
|
3085
|
+
* @returns Base64 encoded transaction bytes
|
|
3086
|
+
*
|
|
3087
|
+
* @throws {Error} If no active wallet session
|
|
3088
|
+
*/
|
|
3089
|
+
async buildSendNft(
|
|
3090
|
+
fromAccount: string,
|
|
3091
|
+
toAccount: string,
|
|
3092
|
+
tokenId: string,
|
|
3093
|
+
serialNumber: number,
|
|
3094
|
+
): Promise<string> {
|
|
3095
|
+
const nftId = new NftId(TokenId.fromString(tokenId), serialNumber);
|
|
3096
|
+
|
|
3097
|
+
const transaction = new TransferTransaction().addNftTransfer(
|
|
3098
|
+
nftId,
|
|
3099
|
+
AccountId.fromString(fromAccount),
|
|
3100
|
+
AccountId.fromString(toAccount),
|
|
3101
|
+
);
|
|
3102
|
+
|
|
3103
|
+
return this.serializeTransaction(transaction, fromAccount);
|
|
3104
|
+
}
|
|
3105
|
+
|
|
3106
|
+
/**
|
|
3107
|
+
* Builds a token association transaction.
|
|
3108
|
+
*
|
|
3109
|
+
* @description
|
|
3110
|
+
* Creates a TokenAssociateTransaction that associates one or more tokens
|
|
3111
|
+
* with an account. This is required before an account can receive tokens
|
|
3112
|
+
* on Hedera.
|
|
3113
|
+
*
|
|
3114
|
+
* @param account - Account to associate tokens with
|
|
3115
|
+
* @param tokenIds - Array of token IDs to associate
|
|
3116
|
+
*
|
|
3117
|
+
* @returns Base64 encoded transaction bytes
|
|
3118
|
+
*
|
|
3119
|
+
* @throws {Error} If no active wallet session
|
|
3120
|
+
*/
|
|
3121
|
+
async buildAssociateToken(account: string, tokenIds: string[]): Promise<string> {
|
|
3122
|
+
const tokens = tokenIds.map((id) => TokenId.fromString(id));
|
|
3123
|
+
|
|
3124
|
+
const transaction = new TokenAssociateTransaction()
|
|
3125
|
+
.setAccountId(AccountId.fromString(account))
|
|
3126
|
+
.setTokenIds(tokens);
|
|
3127
|
+
|
|
3128
|
+
return this.serializeTransaction(transaction, account);
|
|
3129
|
+
}
|
|
3130
|
+
|
|
3131
|
+
/**
|
|
3132
|
+
* Builds a token dissociation transaction.
|
|
3133
|
+
*
|
|
3134
|
+
* @description
|
|
3135
|
+
* Creates a TokenDissociateTransaction that removes the association between
|
|
3136
|
+
* an account and one or more tokens. The account must have zero balance of
|
|
3137
|
+
* each token before dissociating.
|
|
3138
|
+
*
|
|
3139
|
+
* @param account - Account to dissociate tokens from
|
|
3140
|
+
* @param tokenIds - Array of token IDs to dissociate
|
|
3141
|
+
*
|
|
3142
|
+
* @returns Base64 encoded transaction bytes
|
|
3143
|
+
*
|
|
3144
|
+
* @throws {Error} If no active wallet session
|
|
3145
|
+
*/
|
|
3146
|
+
async buildDissociateToken(account: string, tokenIds: string[]): Promise<string> {
|
|
3147
|
+
const tokens = tokenIds.map((id) => TokenId.fromString(id));
|
|
3148
|
+
|
|
3149
|
+
const transaction = new TokenDissociateTransaction()
|
|
3150
|
+
.setAccountId(AccountId.fromString(account))
|
|
3151
|
+
.setTokenIds(tokens);
|
|
3152
|
+
|
|
3153
|
+
return this.serializeTransaction(transaction, account);
|
|
3154
|
+
}
|
|
3155
|
+
|
|
3156
|
+
/**
|
|
3157
|
+
* Build a scheduled transaction
|
|
3158
|
+
* @param innerTransactionBytes - Base64 encoded inner transaction
|
|
3159
|
+
* @param payerAccount - Payer account for the scheduled transaction (required)
|
|
3160
|
+
* @param memo - Optional memo
|
|
3161
|
+
* @returns Base64 encoded scheduled transaction bytes
|
|
3162
|
+
*/
|
|
3163
|
+
async buildScheduledTransaction(
|
|
3164
|
+
innerTransactionBytes: string,
|
|
3165
|
+
payerAccount: string,
|
|
3166
|
+
memo?: string,
|
|
3167
|
+
): Promise<string> {
|
|
3168
|
+
const exampleInnerTx = new TransferTransaction()
|
|
3169
|
+
.addHbarTransfer(AccountId.fromString(payerAccount), new Hbar(-1))
|
|
3170
|
+
.addHbarTransfer(AccountId.fromString('0.0.3'), new Hbar(1));
|
|
3171
|
+
|
|
3172
|
+
const transaction = new ScheduleCreateTransaction()
|
|
3173
|
+
.setScheduledTransaction(exampleInnerTx)
|
|
3174
|
+
.setPayerAccountId(AccountId.fromString(payerAccount));
|
|
3175
|
+
|
|
3176
|
+
if (memo) {
|
|
3177
|
+
transaction.setScheduleMemo(memo);
|
|
3178
|
+
}
|
|
3179
|
+
|
|
3180
|
+
return this.serializeTransaction(transaction, payerAccount);
|
|
3181
|
+
}
|
|
3182
|
+
|
|
3183
|
+
/**
|
|
3184
|
+
* Build a batch of transactions with the same payer
|
|
3185
|
+
* @param transactions - Array of base64 encoded transactions
|
|
3186
|
+
* @returns Array of base64 encoded transactions (ready for batch submission)
|
|
3187
|
+
*/
|
|
3188
|
+
async buildBatchTransactions(transactions: string[]): Promise<string[]> {
|
|
3189
|
+
return transactions;
|
|
3190
|
+
}
|
|
3191
|
+
|
|
3192
|
+
/**
|
|
3193
|
+
* Build a complex atomic transaction (multiple transfers in one transaction)
|
|
3194
|
+
* @param transfers - Array of transfer operations
|
|
3195
|
+
* @returns Base64 encoded transaction bytes
|
|
3196
|
+
*/
|
|
3197
|
+
async buildAtomicTransaction(
|
|
3198
|
+
transfers: Array<{
|
|
3199
|
+
type: 'hbar' | 'token';
|
|
3200
|
+
fromAccount: string;
|
|
3201
|
+
toAccount: string;
|
|
3202
|
+
amount: number;
|
|
3203
|
+
tokenId?: string;
|
|
3204
|
+
decimals?: number;
|
|
3205
|
+
}>,
|
|
3206
|
+
): Promise<string> {
|
|
3207
|
+
if (transfers.length === 0) {
|
|
3208
|
+
throw new Error('At least one transfer is required for an atomic transaction');
|
|
3209
|
+
}
|
|
3210
|
+
|
|
3211
|
+
const transaction = new TransferTransaction();
|
|
3212
|
+
const payerAccount = transfers[0].fromAccount;
|
|
3213
|
+
|
|
3214
|
+
for (const transfer of transfers) {
|
|
3215
|
+
if (transfer.type === 'hbar') {
|
|
3216
|
+
transaction
|
|
3217
|
+
.addHbarTransfer(AccountId.fromString(transfer.fromAccount), new Hbar(-transfer.amount))
|
|
3218
|
+
.addHbarTransfer(AccountId.fromString(transfer.toAccount), new Hbar(transfer.amount));
|
|
3219
|
+
} else if (transfer.type === 'token' && transfer.tokenId) {
|
|
3220
|
+
const token = TokenId.fromString(transfer.tokenId);
|
|
3221
|
+
const decimals = transfer.decimals || 0;
|
|
3222
|
+
const scaled = scaleHederaAmountToBaseUnits(transfer.amount, decimals);
|
|
3223
|
+
const actualAmount = assertSafeInteger(
|
|
3224
|
+
scaled,
|
|
3225
|
+
`atomicTransaction token=${transfer.tokenId}`,
|
|
3226
|
+
);
|
|
3227
|
+
|
|
3228
|
+
transaction
|
|
3229
|
+
.addTokenTransfer(token, AccountId.fromString(transfer.fromAccount), -actualAmount)
|
|
3230
|
+
.addTokenTransfer(token, AccountId.fromString(transfer.toAccount), actualAmount);
|
|
3231
|
+
}
|
|
3232
|
+
}
|
|
3233
|
+
|
|
3234
|
+
return this.serializeTransaction(transaction, payerAccount);
|
|
3235
|
+
}
|
|
3236
|
+
|
|
3237
|
+
/**
|
|
3238
|
+
* Build a token creation transaction with automatic key configuration.
|
|
3239
|
+
*
|
|
3240
|
+
* **Auto-key behavior**: If no adminKey/supplyKey is provided, the token will automatically
|
|
3241
|
+
* inherit the creating account's key structure:
|
|
3242
|
+
* - Single-sig account → token keys = account's public key
|
|
3243
|
+
* - Multisig account → token keys = threshold key with all signers
|
|
3244
|
+
*
|
|
3245
|
+
* This ensures tokens created from multisig accounts are also controlled by the multisig.
|
|
3246
|
+
*
|
|
3247
|
+
* @param treasuryAccount - Account that will hold the tokens
|
|
3248
|
+
* @param options - Token creation options (keys auto-detected if not provided)
|
|
3249
|
+
* @param optionsOrName
|
|
3250
|
+
* @param symbol
|
|
3251
|
+
* @param decimals
|
|
3252
|
+
* @param initialSupply
|
|
3253
|
+
* @param tokenType
|
|
3254
|
+
* @returns Base64 encoded transaction bytes
|
|
3255
|
+
*/
|
|
3256
|
+
async buildTokenCreate(
|
|
3257
|
+
treasuryAccount: string,
|
|
3258
|
+
optionsOrName: TokenCreateOptions | string,
|
|
3259
|
+
symbol?: string,
|
|
3260
|
+
decimals?: number,
|
|
3261
|
+
initialSupply?: number,
|
|
3262
|
+
tokenType: 'FUNGIBLE' | 'NFT' = 'FUNGIBLE',
|
|
3263
|
+
): Promise<string> {
|
|
3264
|
+
// Support both object and positional arguments
|
|
3265
|
+
const opts: TokenCreateOptions =
|
|
3266
|
+
typeof optionsOrName === 'string'
|
|
3267
|
+
? {
|
|
3268
|
+
name: optionsOrName,
|
|
3269
|
+
symbol: symbol!,
|
|
3270
|
+
decimals: decimals!,
|
|
3271
|
+
initialSupply: initialSupply!,
|
|
3272
|
+
tokenType,
|
|
3273
|
+
}
|
|
3274
|
+
: optionsOrName;
|
|
3275
|
+
|
|
3276
|
+
const transaction = new TokenCreateTransaction()
|
|
3277
|
+
.setTokenName(opts.name)
|
|
3278
|
+
.setTokenSymbol(opts.symbol)
|
|
3279
|
+
.setDecimals(opts.decimals)
|
|
3280
|
+
.setInitialSupply(opts.initialSupply)
|
|
3281
|
+
.setTreasuryAccountId(AccountId.fromString(treasuryAccount))
|
|
3282
|
+
.setTokenType(
|
|
3283
|
+
opts.tokenType === 'NFT' ? TokenType.NonFungibleUnique : TokenType.FungibleCommon,
|
|
3284
|
+
)
|
|
3285
|
+
.setSupplyType(opts.maxSupply ? TokenSupplyType.Finite : TokenSupplyType.Infinite);
|
|
3286
|
+
|
|
3287
|
+
// Set max supply if finite
|
|
3288
|
+
if (opts.maxSupply) {
|
|
3289
|
+
transaction.setMaxSupply(opts.maxSupply);
|
|
3290
|
+
}
|
|
3291
|
+
|
|
3292
|
+
// Set memo if provided
|
|
3293
|
+
if (opts.memo) {
|
|
3294
|
+
transaction.setTokenMemo(opts.memo);
|
|
3295
|
+
}
|
|
3296
|
+
|
|
3297
|
+
// Auto-detect key config from active account if not explicitly provided
|
|
3298
|
+
const autoKeyConfig = this.getActiveAccountKeyConfig();
|
|
3299
|
+
const isAutoDetected = !!autoKeyConfig;
|
|
3300
|
+
|
|
3301
|
+
// Set admin key - use provided or auto-detected
|
|
3302
|
+
const adminKeyConfig = opts.adminKey ?? autoKeyConfig;
|
|
3303
|
+
const adminKey = this.buildKeyFromConfig(adminKeyConfig);
|
|
3304
|
+
if (adminKey) {
|
|
3305
|
+
transaction.setAdminKey(adminKey);
|
|
3306
|
+
this.logger.debug('Token admin key set', { autoDetected: !opts.adminKey && isAutoDetected });
|
|
3307
|
+
}
|
|
3308
|
+
|
|
3309
|
+
// Set supply key - use provided or auto-detected
|
|
3310
|
+
const supplyKeyConfig = opts.supplyKey ?? autoKeyConfig;
|
|
3311
|
+
const supplyKey = this.buildKeyFromConfig(supplyKeyConfig);
|
|
3312
|
+
if (supplyKey) {
|
|
3313
|
+
transaction.setSupplyKey(supplyKey);
|
|
3314
|
+
this.logger.debug('Token supply key set', {
|
|
3315
|
+
autoDetected: !opts.supplyKey && isAutoDetected,
|
|
3316
|
+
});
|
|
3317
|
+
}
|
|
3318
|
+
|
|
3319
|
+
// Set freeze key - only if explicitly provided (not auto-set)
|
|
3320
|
+
const freezeKey = this.buildKeyFromConfig(opts.freezeKey);
|
|
3321
|
+
if (freezeKey) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
3322
3322
|
<span class="cstat-no" title="statement not covered" > transaction.setFreezeKey(freezeKey);</span>
|
|
3323
3323
|
<span class="cstat-no" title="statement not covered" > this.logger.debug('Token freeze key set');</span>
|
|
3324
3324
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3325
|
-
|
|
3326
|
-
|
|
3327
|
-
|
|
3328
|
-
<span class="
|
|
3325
|
+
|
|
3326
|
+
// Set wipe key - only if explicitly provided (not auto-set)
|
|
3327
|
+
const wipeKey = this.buildKeyFromConfig(opts.wipeKey);
|
|
3328
|
+
if (wipeKey) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
3329
3329
|
<span class="cstat-no" title="statement not covered" > transaction.setWipeKey(wipeKey);</span>
|
|
3330
3330
|
<span class="cstat-no" title="statement not covered" > this.logger.debug('Token wipe key set');</span>
|
|
3331
3331
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3332
|
-
|
|
3333
|
-
|
|
3334
|
-
|
|
3335
|
-
<span class="
|
|
3332
|
+
|
|
3333
|
+
// Set pause key - only if explicitly provided (not auto-set)
|
|
3334
|
+
const pauseKey = this.buildKeyFromConfig(opts.pauseKey);
|
|
3335
|
+
if (pauseKey) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
3336
3336
|
<span class="cstat-no" title="statement not covered" > transaction.setPauseKey(pauseKey);</span>
|
|
3337
3337
|
<span class="cstat-no" title="statement not covered" > this.logger.debug('Token pause key set');</span>
|
|
3338
3338
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3339
|
-
|
|
3340
|
-
|
|
3341
|
-
|
|
3342
|
-
<span class="
|
|
3339
|
+
|
|
3340
|
+
// Set KYC key - only if explicitly provided (not auto-set)
|
|
3341
|
+
const kycKey = this.buildKeyFromConfig(opts.kycKey);
|
|
3342
|
+
if (kycKey) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
3343
3343
|
<span class="cstat-no" title="statement not covered" > transaction.setKycKey(kycKey);</span>
|
|
3344
3344
|
<span class="cstat-no" title="statement not covered" > this.logger.debug('Token KYC key set');</span>
|
|
3345
3345
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3346
|
-
|
|
3347
|
-
|
|
3348
|
-
|
|
3349
|
-
<span class="
|
|
3346
|
+
|
|
3347
|
+
// Set fee schedule key - only if explicitly provided (not auto-set)
|
|
3348
|
+
const feeScheduleKey = this.buildKeyFromConfig(opts.feeScheduleKey);
|
|
3349
|
+
if (feeScheduleKey) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
3350
3350
|
<span class="cstat-no" title="statement not covered" > transaction.setFeeScheduleKey(feeScheduleKey);</span>
|
|
3351
3351
|
<span class="cstat-no" title="statement not covered" > this.logger.debug('Token fee schedule key set');</span>
|
|
3352
3352
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3353
|
-
|
|
3354
|
-
|
|
3355
|
-
|
|
3356
|
-
|
|
3357
|
-
|
|
3358
|
-
|
|
3359
|
-
|
|
3360
|
-
|
|
3361
|
-
|
|
3362
|
-
|
|
3363
|
-
|
|
3364
|
-
<span class="
|
|
3353
|
+
|
|
3354
|
+
return this.serializeTransaction(transaction, treasuryAccount);
|
|
3355
|
+
}
|
|
3356
|
+
|
|
3357
|
+
/**
|
|
3358
|
+
* Build a token mint transaction
|
|
3359
|
+
* @param tokenId - Token ID to mint
|
|
3360
|
+
* @param amount - Amount to mint
|
|
3361
|
+
* @param account - Account performing the mint
|
|
3362
|
+
* @returns Base64 encoded transaction bytes
|
|
3363
|
+
*/
|
|
3364
|
+
<span class="fstat-no" title="function not covered" > async buildTokenMint(tokenId: string, amount: number, account: string): Promise<string> {</span>
|
|
3365
3365
|
<span class="cstat-no" title="statement not covered" > const transaction = new TokenMintTransaction()</span>
|
|
3366
3366
|
<span class="cstat-no" title="statement not covered" > .setTokenId(TokenId.fromString(tokenId))</span>
|
|
3367
3367
|
<span class="cstat-no" title="statement not covered" > .setAmount(amount);</span>
|
|
3368
3368
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
3369
3369
|
<span class="cstat-no" title="statement not covered" > return this.serializeTransaction(transaction, account);</span>
|
|
3370
3370
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3371
|
-
|
|
3372
|
-
|
|
3373
|
-
|
|
3374
|
-
|
|
3375
|
-
|
|
3376
|
-
|
|
3377
|
-
|
|
3378
|
-
|
|
3379
|
-
<span class="
|
|
3371
|
+
|
|
3372
|
+
/**
|
|
3373
|
+
* Build a token burn transaction
|
|
3374
|
+
* @param tokenId - Token ID to burn
|
|
3375
|
+
* @param amount - Amount to burn
|
|
3376
|
+
* @param account - Account performing the burn
|
|
3377
|
+
* @returns Base64 encoded transaction bytes
|
|
3378
|
+
*/
|
|
3379
|
+
<span class="fstat-no" title="function not covered" > async buildTokenBurn(tokenId: string, amount: number, account: string): Promise<string> {</span>
|
|
3380
3380
|
<span class="cstat-no" title="statement not covered" > const transaction = new TokenBurnTransaction()</span>
|
|
3381
3381
|
<span class="cstat-no" title="statement not covered" > .setTokenId(TokenId.fromString(tokenId))</span>
|
|
3382
3382
|
<span class="cstat-no" title="statement not covered" > .setAmount(amount);</span>
|
|
3383
3383
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
3384
3384
|
<span class="cstat-no" title="statement not covered" > return this.serializeTransaction(transaction, account);</span>
|
|
3385
3385
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3386
|
-
|
|
3387
|
-
|
|
3388
|
-
|
|
3389
|
-
|
|
3390
|
-
|
|
3391
|
-
|
|
3392
|
-
|
|
3393
|
-
|
|
3394
|
-
|
|
3395
|
-
|
|
3396
|
-
|
|
3397
|
-
|
|
3398
|
-
|
|
3399
|
-
|
|
3400
|
-
|
|
3401
|
-
|
|
3402
|
-
|
|
3403
|
-
|
|
3404
|
-
|
|
3405
|
-
|
|
3406
|
-
|
|
3407
|
-
|
|
3408
|
-
|
|
3409
|
-
|
|
3410
|
-
|
|
3411
|
-
|
|
3412
|
-
|
|
3413
|
-
|
|
3414
|
-
|
|
3415
|
-
|
|
3416
|
-
|
|
3417
|
-
|
|
3418
|
-
|
|
3419
|
-
|
|
3420
|
-
|
|
3421
|
-
|
|
3422
|
-
|
|
3423
|
-
|
|
3424
|
-
|
|
3425
|
-
|
|
3426
|
-
|
|
3427
|
-
|
|
3428
|
-
|
|
3429
|
-
|
|
3430
|
-
|
|
3431
|
-
|
|
3432
|
-
|
|
3433
|
-
|
|
3434
|
-
|
|
3435
|
-
|
|
3436
|
-
|
|
3437
|
-
|
|
3438
|
-
|
|
3439
|
-
|
|
3440
|
-
|
|
3441
|
-
|
|
3442
|
-
|
|
3443
|
-
|
|
3444
|
-
|
|
3445
|
-
|
|
3446
|
-
|
|
3447
|
-
|
|
3448
|
-
|
|
3449
|
-
|
|
3450
|
-
|
|
3451
|
-
|
|
3452
|
-
|
|
3453
|
-
|
|
3454
|
-
|
|
3455
|
-
<span class="
|
|
3386
|
+
|
|
3387
|
+
/**
|
|
3388
|
+
* Build a topic creation transaction with automatic key configuration.
|
|
3389
|
+
*
|
|
3390
|
+
* **Auto-key behavior**: If no adminKey is provided, the topic will automatically
|
|
3391
|
+
* inherit the creating account's key structure:
|
|
3392
|
+
* - Single-sig account → topic adminKey = account's public key
|
|
3393
|
+
* - Multisig account → topic adminKey = threshold key with all signers
|
|
3394
|
+
*
|
|
3395
|
+
* This ensures topics created from multisig accounts are also controlled by the multisig.
|
|
3396
|
+
*
|
|
3397
|
+
* @param account - Account creating the topic
|
|
3398
|
+
* @param options - Topic creation options (keys auto-detected if not provided)
|
|
3399
|
+
* @returns Base64 encoded transaction bytes
|
|
3400
|
+
*/
|
|
3401
|
+
async buildTopicCreate(
|
|
3402
|
+
account: string,
|
|
3403
|
+
options?: TopicCreateOptions | string, // string treated as memo
|
|
3404
|
+
): Promise<string> {
|
|
3405
|
+
const transaction = new TopicCreateTransaction();
|
|
3406
|
+
|
|
3407
|
+
// Support both object and string (memo shorthand)
|
|
3408
|
+
const opts: TopicCreateOptions =
|
|
3409
|
+
typeof options === 'string' ? { memo: options } : (<span class="branch-0 cbranch-no" title="branch not covered" >options ?? {});</span>
|
|
3410
|
+
|
|
3411
|
+
if (opts.memo) {
|
|
3412
|
+
transaction.setTopicMemo(opts.memo);
|
|
3413
|
+
}
|
|
3414
|
+
|
|
3415
|
+
// Auto-detect key config from active account if not explicitly provided
|
|
3416
|
+
const autoKeyConfig = this.getActiveAccountKeyConfig();
|
|
3417
|
+
|
|
3418
|
+
// Set admin key - use provided or auto-detected
|
|
3419
|
+
const adminKeyConfig = opts.adminKey ?? autoKeyConfig;
|
|
3420
|
+
const adminKey = this.buildKeyFromConfig(adminKeyConfig);
|
|
3421
|
+
if (adminKey) {
|
|
3422
|
+
transaction.setAdminKey(adminKey);
|
|
3423
|
+
this.logger.debug('Topic admin key set', {
|
|
3424
|
+
isThreshold: adminKeyConfig?.<span class="branch-0 cbranch-no" title="branch not covered" >signerPublicKeys ? true : f</span>alse,
|
|
3425
|
+
autoDetected: !opts.adminKey && !!autoKeyConfig,
|
|
3426
|
+
});
|
|
3427
|
+
}
|
|
3428
|
+
|
|
3429
|
+
// Set submit key - use provided or auto-detected (same as admin by default)
|
|
3430
|
+
const submitKeyConfig = opts.submitKey ?? autoKeyConfig;
|
|
3431
|
+
const submitKey = this.buildKeyFromConfig(submitKeyConfig);
|
|
3432
|
+
if (submitKey) {
|
|
3433
|
+
transaction.setSubmitKey(submitKey);
|
|
3434
|
+
this.logger.debug('Topic submit key set', {
|
|
3435
|
+
isThreshold: submitKeyConfig?.<span class="branch-0 cbranch-no" title="branch not covered" >signerPublicKeys ? true : f</span>alse,
|
|
3436
|
+
autoDetected: !opts.submitKey && !!autoKeyConfig,
|
|
3437
|
+
});
|
|
3438
|
+
}
|
|
3439
|
+
|
|
3440
|
+
// Set auto-renew account if provided
|
|
3441
|
+
if (opts.autoRenewAccountId) {
|
|
3442
|
+
transaction.setAutoRenewAccountId(AccountId.fromString(opts.autoRenewAccountId));
|
|
3443
|
+
}
|
|
3444
|
+
|
|
3445
|
+
return this.serializeTransaction(transaction, account);
|
|
3446
|
+
}
|
|
3447
|
+
|
|
3448
|
+
/**
|
|
3449
|
+
* Build a topic message submit transaction
|
|
3450
|
+
* @param topicId - Topic ID (e.g., "0.0.12345")
|
|
3451
|
+
* @param message - Message to submit
|
|
3452
|
+
* @param account - Account submitting the message
|
|
3453
|
+
* @returns Base64 encoded transaction bytes
|
|
3454
|
+
*/
|
|
3455
|
+
<span class="fstat-no" title="function not covered" > async buildTopicMessageSubmit(</span>
|
|
3456
3456
|
<span class="cstat-no" title="statement not covered" > topicId: string,</span>
|
|
3457
3457
|
<span class="cstat-no" title="statement not covered" > message: string,</span>
|
|
3458
3458
|
<span class="cstat-no" title="statement not covered" > account: string,</span>
|
|
@@ -3461,48 +3461,48 @@
|
|
|
3461
3461
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
3462
3462
|
<span class="cstat-no" title="statement not covered" > return this.serializeTransaction(transaction, account);</span>
|
|
3463
3463
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3464
|
-
|
|
3465
|
-
|
|
3466
|
-
|
|
3467
|
-
|
|
3468
|
-
|
|
3469
|
-
|
|
3470
|
-
|
|
3471
|
-
|
|
3472
|
-
|
|
3473
|
-
|
|
3474
|
-
|
|
3475
|
-
|
|
3476
|
-
|
|
3477
|
-
|
|
3478
|
-
|
|
3479
|
-
|
|
3480
|
-
|
|
3481
|
-
|
|
3482
|
-
|
|
3483
|
-
|
|
3484
|
-
<span class="
|
|
3464
|
+
|
|
3465
|
+
/**
|
|
3466
|
+
* Build an account creation transaction with key configuration.
|
|
3467
|
+
*
|
|
3468
|
+
* For single-sig accounts: pass { publicKey: '...' }
|
|
3469
|
+
* For multisig accounts: pass { signerPublicKeys: [...], threshold: N }
|
|
3470
|
+
*
|
|
3471
|
+
* If no key is provided, a random key is generated (NOT RECOMMENDED for production).
|
|
3472
|
+
*
|
|
3473
|
+
* @param creatorAccount - Account creating the new account
|
|
3474
|
+
* @param options - Account creation options including key config
|
|
3475
|
+
* @param optionsOrBalance
|
|
3476
|
+
* @returns Base64 encoded transaction bytes
|
|
3477
|
+
*/
|
|
3478
|
+
async buildAccountCreate(
|
|
3479
|
+
creatorAccount: string,
|
|
3480
|
+
optionsOrBalance: AccountCreateOptions | number,
|
|
3481
|
+
): Promise<string> {
|
|
3482
|
+
// Support both object and number (initial balance shorthand)
|
|
3483
|
+
const opts: AccountCreateOptions =
|
|
3484
|
+
typeof optionsOrBalance === <span class="branch-0 cbranch-no" title="branch not covered" >'number'</span>
|
|
3485
3485
|
<span class="cstat-no" title="statement not covered" > ? { initialBalance: optionsOrBalance }</span>
|
|
3486
|
-
|
|
3487
|
-
|
|
3488
|
-
|
|
3489
|
-
|
|
3490
|
-
|
|
3491
|
-
|
|
3492
|
-
|
|
3493
|
-
|
|
3494
|
-
|
|
3495
|
-
|
|
3496
|
-
|
|
3497
|
-
|
|
3498
|
-
|
|
3499
|
-
|
|
3500
|
-
|
|
3501
|
-
|
|
3502
|
-
|
|
3503
|
-
|
|
3504
|
-
|
|
3505
|
-
<span class="
|
|
3486
|
+
: optionsOrBalance;
|
|
3487
|
+
|
|
3488
|
+
const transaction = new AccountCreateTransaction().setInitialBalance(
|
|
3489
|
+
new Hbar(opts.initialBalance),
|
|
3490
|
+
);
|
|
3491
|
+
|
|
3492
|
+
// Auto-detect key config from active account if not explicitly provided
|
|
3493
|
+
// This ensures accounts created from multisig wallets inherit the multisig key structure
|
|
3494
|
+
const autoKeyConfig = this.getActiveAccountKeyConfig();
|
|
3495
|
+
const keyConfig = opts.key ?? autoKeyConfig;
|
|
3496
|
+
|
|
3497
|
+
// Set account key - use provided or auto-detected
|
|
3498
|
+
const accountKey = this.buildKeyFromConfig(keyConfig);
|
|
3499
|
+
if (accountKey) {
|
|
3500
|
+
transaction.setKey(accountKey);
|
|
3501
|
+
this.logger.debug('Account key set', {
|
|
3502
|
+
isThreshold: keyConfig?.signerPublicKeys ? true : false,
|
|
3503
|
+
autoDetected: !opts.key && !!autoKeyConfig,
|
|
3504
|
+
});
|
|
3505
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > } else {</span>
|
|
3506
3506
|
<span class="cstat-no" title="statement not covered" > // Fallback: generate random key (not recommended for production)</span>
|
|
3507
3507
|
<span class="cstat-no" title="statement not covered" > const newKey = PrivateKey.generateED25519();</span>
|
|
3508
3508
|
<span class="cstat-no" title="statement not covered" > transaction.setKey(newKey.publicKey);</span>
|
|
@@ -3510,46 +3510,46 @@
|
|
|
3510
3510
|
<span class="cstat-no" title="statement not covered" > 'Generated random key for new account - provide key config for production use',</span>
|
|
3511
3511
|
<span class="cstat-no" title="statement not covered" > );</span>
|
|
3512
3512
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3513
|
-
|
|
3514
|
-
|
|
3515
|
-
|
|
3516
|
-
|
|
3517
|
-
|
|
3518
|
-
|
|
3519
|
-
|
|
3520
|
-
|
|
3521
|
-
|
|
3522
|
-
|
|
3523
|
-
|
|
3524
|
-
|
|
3525
|
-
|
|
3526
|
-
|
|
3527
|
-
|
|
3528
|
-
|
|
3529
|
-
|
|
3530
|
-
|
|
3531
|
-
|
|
3532
|
-
|
|
3533
|
-
|
|
3534
|
-
|
|
3535
|
-
|
|
3536
|
-
|
|
3537
|
-
|
|
3538
|
-
|
|
3539
|
-
|
|
3540
|
-
|
|
3541
|
-
|
|
3542
|
-
|
|
3543
|
-
|
|
3544
|
-
|
|
3545
|
-
|
|
3546
|
-
|
|
3547
|
-
|
|
3548
|
-
|
|
3549
|
-
|
|
3550
|
-
|
|
3551
|
-
|
|
3552
|
-
<span class="
|
|
3513
|
+
|
|
3514
|
+
// Set memo if provided
|
|
3515
|
+
if (opts.memo) {
|
|
3516
|
+
transaction.setAccountMemo(opts.memo);
|
|
3517
|
+
}
|
|
3518
|
+
|
|
3519
|
+
// Set max automatic token associations
|
|
3520
|
+
if (opts.maxAutomaticTokenAssociations !== undefined) {
|
|
3521
|
+
transaction.setMaxAutomaticTokenAssociations(opts.maxAutomaticTokenAssociations);
|
|
3522
|
+
}
|
|
3523
|
+
|
|
3524
|
+
// Set receiver signature required
|
|
3525
|
+
if (opts.receiverSignatureRequired !== undefined) {
|
|
3526
|
+
transaction.setReceiverSignatureRequired(opts.receiverSignatureRequired);
|
|
3527
|
+
}
|
|
3528
|
+
|
|
3529
|
+
return this.serializeTransaction(transaction, creatorAccount);
|
|
3530
|
+
}
|
|
3531
|
+
|
|
3532
|
+
/**
|
|
3533
|
+
* Build an account update transaction
|
|
3534
|
+
* @param accountId - Account to update
|
|
3535
|
+
* @param memo - New account memo
|
|
3536
|
+
* @returns Base64 encoded transaction bytes
|
|
3537
|
+
*/
|
|
3538
|
+
async buildAccountUpdate(accountId: string, memo: string): Promise<string> {
|
|
3539
|
+
const transaction = new AccountUpdateTransaction()
|
|
3540
|
+
.setAccountId(AccountId.fromString(accountId))
|
|
3541
|
+
.setAccountMemo(memo);
|
|
3542
|
+
|
|
3543
|
+
return this.serializeTransaction(transaction, accountId);
|
|
3544
|
+
}
|
|
3545
|
+
|
|
3546
|
+
/**
|
|
3547
|
+
* Build a batch transaction with multiple inner transactions
|
|
3548
|
+
* @param innerTransactions - Array of transaction descriptors
|
|
3549
|
+
* @param payerAccount - Account paying for the batch transaction
|
|
3550
|
+
* @returns Base64 encoded batch transaction bytes
|
|
3551
|
+
*/
|
|
3552
|
+
<span class="fstat-no" title="function not covered" > async buildBatchTransaction(</span>
|
|
3553
3553
|
<span class="cstat-no" title="statement not covered" > innerTransactions: Array<{</span>
|
|
3554
3554
|
<span class="cstat-no" title="statement not covered" > type: 'send-hbar' | 'send-token' | 'token-mint';</span>
|
|
3555
3555
|
<span class="cstat-no" title="statement not covered" > toAccount?: string;</span>
|
|
@@ -3629,63 +3629,63 @@
|
|
|
3629
3629
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
3630
3630
|
<span class="cstat-no" title="statement not covered" > return this.uint8ArrayToBase64(bytes);</span>
|
|
3631
3631
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3632
|
-
|
|
3633
|
-
|
|
3634
|
-
|
|
3635
|
-
|
|
3636
|
-
|
|
3637
|
-
|
|
3638
|
-
|
|
3639
|
-
|
|
3640
|
-
|
|
3641
|
-
|
|
3642
|
-
|
|
3643
|
-
|
|
3644
|
-
|
|
3645
|
-
|
|
3646
|
-
|
|
3647
|
-
|
|
3648
|
-
|
|
3649
|
-
|
|
3650
|
-
<span class="
|
|
3632
|
+
|
|
3633
|
+
/**
|
|
3634
|
+
* Build inner transactions for batch (unsigned, with batchKey set)
|
|
3635
|
+
* @param account - Account executing the batch
|
|
3636
|
+
* @param batchKey - Public key for batch transactions
|
|
3637
|
+
* @param innerTransactions - Array of transaction descriptors
|
|
3638
|
+
* @returns Array of base64 encoded unsigned inner transactions
|
|
3639
|
+
*/
|
|
3640
|
+
async buildBatchInnerTransactions(
|
|
3641
|
+
account: string,
|
|
3642
|
+
batchKey: string,
|
|
3643
|
+
innerTransactions: Array<BatchInnerTransaction>,
|
|
3644
|
+
): Promise<Array<{ payload: string; description: string }>> {
|
|
3645
|
+
const accountId = AccountId.fromString(account);
|
|
3646
|
+
const batchPublicKey = PublicKey.fromString(batchKey);
|
|
3647
|
+
|
|
3648
|
+
const networkId = this.getNetworkId();
|
|
3649
|
+
|
|
3650
|
+
if (!networkId) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
3651
3651
|
<span class="cstat-no" title="statement not covered" > throw new Error('No active wallet session. Please connect your wallet first.');</span>
|
|
3652
3652
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3653
|
-
|
|
3654
|
-
|
|
3655
|
-
|
|
3656
|
-
|
|
3657
|
-
|
|
3658
|
-
|
|
3659
|
-
|
|
3660
|
-
|
|
3661
|
-
|
|
3662
|
-
|
|
3663
|
-
|
|
3664
|
-
|
|
3665
|
-
|
|
3666
|
-
|
|
3667
|
-
|
|
3668
|
-
|
|
3669
|
-
|
|
3670
|
-
|
|
3671
|
-
|
|
3672
|
-
|
|
3673
|
-
|
|
3674
|
-
|
|
3675
|
-
|
|
3676
|
-
|
|
3677
|
-
|
|
3678
|
-
|
|
3679
|
-
|
|
3680
|
-
|
|
3681
|
-
|
|
3682
|
-
|
|
3683
|
-
|
|
3684
|
-
|
|
3685
|
-
|
|
3686
|
-
|
|
3687
|
-
|
|
3688
|
-
<span class="
|
|
3653
|
+
|
|
3654
|
+
const client = this.createClientForNetwork(networkId);
|
|
3655
|
+
const results: Array<{ payload: string; description: string }> = [];
|
|
3656
|
+
|
|
3657
|
+
for (const tx of innerTransactions) {
|
|
3658
|
+
let transaction: Transaction;
|
|
3659
|
+
let description: string;
|
|
3660
|
+
|
|
3661
|
+
try {
|
|
3662
|
+
switch (tx.type) {
|
|
3663
|
+
case 'send-hbar':
|
|
3664
|
+
transaction = new TransferTransaction()
|
|
3665
|
+
.setTransactionId(TransactionId.generate(accountId))
|
|
3666
|
+
.addHbarTransfer(accountId, Hbar.fromTinybars(-(tx.<span class="branch-0 cbranch-no" title="branch not covered" >amount || 0))</span>)
|
|
3667
|
+
.addHbarTransfer(
|
|
3668
|
+
AccountId.fromString(tx.toAccount!),
|
|
3669
|
+
Hbar.fromTinybars(tx.<span class="branch-0 cbranch-no" title="branch not covered" >amount || 0)</span>,
|
|
3670
|
+
)
|
|
3671
|
+
.setBatchKey(batchPublicKey);
|
|
3672
|
+
description = `Send ${tx.amount} tinybar to ${tx.toAccount}`;
|
|
3673
|
+
break;
|
|
3674
|
+
|
|
3675
|
+
case 'send-token':
|
|
3676
|
+
transaction = new TransferTransaction()
|
|
3677
|
+
.setTransactionId(TransactionId.generate(accountId))
|
|
3678
|
+
.addTokenTransfer(TokenId.fromString(tx.tokenId!), accountId, -(tx.<span class="branch-0 cbranch-no" title="branch not covered" >amount || 0))</span>
|
|
3679
|
+
.addTokenTransfer(
|
|
3680
|
+
TokenId.fromString(tx.tokenId!),
|
|
3681
|
+
AccountId.fromString(tx.toAccount!),
|
|
3682
|
+
tx.<span class="branch-0 cbranch-no" title="branch not covered" >amount || 0,</span>
|
|
3683
|
+
)
|
|
3684
|
+
.setBatchKey(batchPublicKey);
|
|
3685
|
+
description = `Send ${tx.amount} of token ${tx.tokenId} to ${tx.toAccount}`;
|
|
3686
|
+
break;
|
|
3687
|
+
|
|
3688
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > case 'send-nft':</span>
|
|
3689
3689
|
<span class="cstat-no" title="statement not covered" > transaction = new TransferTransaction()</span>
|
|
3690
3690
|
<span class="cstat-no" title="statement not covered" > .setTransactionId(TransactionId.generate(accountId))</span>
|
|
3691
3691
|
<span class="cstat-no" title="statement not covered" > .addNftTransfer(</span>
|
|
@@ -3696,17 +3696,17 @@
|
|
|
3696
3696
|
<span class="cstat-no" title="statement not covered" > .setBatchKey(batchPublicKey);</span>
|
|
3697
3697
|
<span class="cstat-no" title="statement not covered" > description = `Send NFT ${tx.tokenId}#${tx.serialNumber} to ${tx.toAccount}`;</span>
|
|
3698
3698
|
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3699
|
-
|
|
3700
|
-
|
|
3701
|
-
|
|
3702
|
-
|
|
3703
|
-
|
|
3704
|
-
|
|
3705
|
-
|
|
3706
|
-
|
|
3707
|
-
|
|
3708
|
-
|
|
3709
|
-
<span class="
|
|
3699
|
+
|
|
3700
|
+
case 'token-associate':
|
|
3701
|
+
transaction = new TokenAssociateTransaction()
|
|
3702
|
+
.setTransactionId(TransactionId.generate(accountId))
|
|
3703
|
+
.setAccountId(accountId)
|
|
3704
|
+
.setTokenIds([TokenId.fromString(tx.tokenId!)])
|
|
3705
|
+
.setBatchKey(batchPublicKey);
|
|
3706
|
+
description = `Associate token ${tx.tokenId}`;
|
|
3707
|
+
break;
|
|
3708
|
+
|
|
3709
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > case 'token-dissociate':</span>
|
|
3710
3710
|
<span class="cstat-no" title="statement not covered" > transaction = new TokenDissociateTransaction()</span>
|
|
3711
3711
|
<span class="cstat-no" title="statement not covered" > .setTransactionId(TransactionId.generate(accountId))</span>
|
|
3712
3712
|
<span class="cstat-no" title="statement not covered" > .setAccountId(accountId)</span>
|
|
@@ -3714,8 +3714,8 @@
|
|
|
3714
3714
|
<span class="cstat-no" title="statement not covered" > .setBatchKey(batchPublicKey);</span>
|
|
3715
3715
|
<span class="cstat-no" title="statement not covered" > description = `Dissociate token ${tx.tokenId}`;</span>
|
|
3716
3716
|
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3717
|
-
|
|
3718
|
-
<span class="
|
|
3717
|
+
|
|
3718
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > case 'token-create': {</span>
|
|
3719
3719
|
<span class="cstat-no" title="statement not covered" > const createTx = new TokenCreateTransaction()</span>
|
|
3720
3720
|
<span class="cstat-no" title="statement not covered" > .setTransactionId(TransactionId.generate(accountId))</span>
|
|
3721
3721
|
<span class="cstat-no" title="statement not covered" > .setTokenName(tx.tokenName || 'Token')</span>
|
|
@@ -3737,31 +3737,31 @@
|
|
|
3737
3737
|
<span class="cstat-no" title="statement not covered" > description = `Create token ${tx.tokenName} (${tx.tokenSymbol})`;</span>
|
|
3738
3738
|
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3739
3739
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3740
|
-
|
|
3741
|
-
|
|
3742
|
-
|
|
3743
|
-
|
|
3744
|
-
|
|
3745
|
-
|
|
3746
|
-
|
|
3747
|
-
|
|
3748
|
-
|
|
3749
|
-
<span class="
|
|
3740
|
+
|
|
3741
|
+
case 'token-mint': {
|
|
3742
|
+
const mintTx = new TokenMintTransaction()
|
|
3743
|
+
.setTransactionId(TransactionId.generate(accountId))
|
|
3744
|
+
.setTokenId(TokenId.fromString(tx.tokenId!))
|
|
3745
|
+
.setBatchKey(batchPublicKey);
|
|
3746
|
+
// Handle NFT metadata (array) vs fungible amount
|
|
3747
|
+
if (tx.metadata) {
|
|
3748
|
+
const encoder = new TextEncoder();
|
|
3749
|
+
if (Array.isArray(tx.metadata)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
3750
3750
|
<span class="cstat-no" title="statement not covered" > mintTx.setMetadata(tx.metadata.map((m) => encoder.encode(m)));</span>
|
|
3751
|
-
|
|
3752
|
-
|
|
3753
|
-
|
|
3754
|
-
|
|
3755
|
-
|
|
3756
|
-
|
|
3757
|
-
|
|
3758
|
-
|
|
3759
|
-
|
|
3760
|
-
|
|
3761
|
-
|
|
3762
|
-
|
|
3763
|
-
|
|
3764
|
-
<span class="
|
|
3751
|
+
} else {
|
|
3752
|
+
mintTx.setMetadata([encoder.encode(tx.metadata)]);
|
|
3753
|
+
}
|
|
3754
|
+
} else {
|
|
3755
|
+
mintTx.setAmount(tx.<span class="branch-0 cbranch-no" title="branch not covered" >amount || 1)</span>;
|
|
3756
|
+
}
|
|
3757
|
+
transaction = mintTx;
|
|
3758
|
+
description = tx.metadata
|
|
3759
|
+
? `Mint NFT for token ${tx.tokenId}`
|
|
3760
|
+
: `Mint ${tx.amount} of token ${tx.tokenId}`;
|
|
3761
|
+
break;
|
|
3762
|
+
}
|
|
3763
|
+
|
|
3764
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > case 'token-burn': {</span>
|
|
3765
3765
|
<span class="cstat-no" title="statement not covered" > const burnTx = new TokenBurnTransaction()</span>
|
|
3766
3766
|
<span class="cstat-no" title="statement not covered" > .setTransactionId(TransactionId.generate(accountId))</span>
|
|
3767
3767
|
<span class="cstat-no" title="statement not covered" > .setTokenId(TokenId.fromString(tx.tokenId!))</span>
|
|
@@ -3777,8 +3777,8 @@
|
|
|
3777
3777
|
<span class="cstat-no" title="statement not covered" > : `Burn ${tx.amount} of token ${tx.tokenId}`;</span>
|
|
3778
3778
|
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3779
3779
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3780
|
-
|
|
3781
|
-
<span class="
|
|
3780
|
+
|
|
3781
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > case 'topic-create': {</span>
|
|
3782
3782
|
<span class="cstat-no" title="statement not covered" > const topicTx = new TopicCreateTransaction()</span>
|
|
3783
3783
|
<span class="cstat-no" title="statement not covered" > .setTransactionId(TransactionId.generate(accountId))</span>
|
|
3784
3784
|
<span class="cstat-no" title="statement not covered" > .setBatchKey(batchPublicKey);</span>
|
|
@@ -3789,8 +3789,8 @@
|
|
|
3789
3789
|
<span class="cstat-no" title="statement not covered" > description = tx.topicMemo ? `Create topic: ${tx.topicMemo}` : 'Create topic';</span>
|
|
3790
3790
|
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3791
3791
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3792
|
-
|
|
3793
|
-
<span class="
|
|
3792
|
+
|
|
3793
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > case 'topic-message':</span>
|
|
3794
3794
|
<span class="cstat-no" title="statement not covered" > transaction = new TopicMessageSubmitTransaction()</span>
|
|
3795
3795
|
<span class="cstat-no" title="statement not covered" > .setTransactionId(TransactionId.generate(accountId))</span>
|
|
3796
3796
|
<span class="cstat-no" title="statement not covered" > .setTopicId(tx.topicId!)</span>
|
|
@@ -3798,8 +3798,8 @@
|
|
|
3798
3798
|
<span class="cstat-no" title="statement not covered" > .setBatchKey(batchPublicKey);</span>
|
|
3799
3799
|
<span class="cstat-no" title="statement not covered" > description = `Submit message to topic ${tx.topicId}`;</span>
|
|
3800
3800
|
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3801
|
-
|
|
3802
|
-
<span class="
|
|
3801
|
+
|
|
3802
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > case 'account-create': {</span>
|
|
3803
3803
|
<span class="cstat-no" title="statement not covered" > const acctTx = new AccountCreateTransaction()</span>
|
|
3804
3804
|
<span class="cstat-no" title="statement not covered" > .setTransactionId(TransactionId.generate(accountId))</span>
|
|
3805
3805
|
<span class="cstat-no" title="statement not covered" > .setInitialBalance(Hbar.fromTinybars(tx.initialBalance || 0))</span>
|
|
@@ -3811,8 +3811,8 @@
|
|
|
3811
3811
|
<span class="cstat-no" title="statement not covered" > description = `Create account with ${tx.initialBalance} tinybar`;</span>
|
|
3812
3812
|
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3813
3813
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3814
|
-
|
|
3815
|
-
<span class="
|
|
3814
|
+
|
|
3815
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > case 'account-update': {</span>
|
|
3816
3816
|
<span class="cstat-no" title="statement not covered" > const updateTx = new AccountUpdateTransaction()</span>
|
|
3817
3817
|
<span class="cstat-no" title="statement not covered" > .setTransactionId(TransactionId.generate(accountId))</span>
|
|
3818
3818
|
<span class="cstat-no" title="statement not covered" > .setAccountId(accountId)</span>
|
|
@@ -3827,89 +3827,89 @@
|
|
|
3827
3827
|
<span class="cstat-no" title="statement not covered" > description = `Update account ${account}`;</span>
|
|
3828
3828
|
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3829
3829
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3830
|
-
|
|
3831
|
-
|
|
3832
|
-
|
|
3833
|
-
|
|
3834
|
-
|
|
3835
|
-
|
|
3836
|
-
|
|
3837
|
-
|
|
3838
|
-
|
|
3839
|
-
|
|
3840
|
-
|
|
3841
|
-
|
|
3842
|
-
|
|
3843
|
-
|
|
3844
|
-
|
|
3845
|
-
|
|
3846
|
-
|
|
3847
|
-
|
|
3848
|
-
|
|
3849
|
-
|
|
3850
|
-
|
|
3851
|
-
|
|
3852
|
-
|
|
3853
|
-
|
|
3854
|
-
|
|
3855
|
-
|
|
3856
|
-
|
|
3857
|
-
|
|
3858
|
-
|
|
3859
|
-
|
|
3860
|
-
|
|
3861
|
-
|
|
3862
|
-
|
|
3863
|
-
|
|
3864
|
-
|
|
3865
|
-
|
|
3866
|
-
|
|
3867
|
-
|
|
3868
|
-
|
|
3869
|
-
|
|
3870
|
-
|
|
3871
|
-
|
|
3872
|
-
|
|
3873
|
-
|
|
3874
|
-
|
|
3875
|
-
|
|
3876
|
-
|
|
3877
|
-
|
|
3878
|
-
|
|
3879
|
-
|
|
3880
|
-
|
|
3881
|
-
|
|
3882
|
-
|
|
3883
|
-
|
|
3884
|
-
|
|
3885
|
-
|
|
3886
|
-
|
|
3887
|
-
|
|
3888
|
-
|
|
3889
|
-
|
|
3890
|
-
|
|
3891
|
-
|
|
3892
|
-
|
|
3893
|
-
|
|
3894
|
-
|
|
3895
|
-
|
|
3896
|
-
|
|
3897
|
-
|
|
3898
|
-
|
|
3899
|
-
|
|
3900
|
-
|
|
3901
|
-
|
|
3902
|
-
|
|
3903
|
-
|
|
3904
|
-
|
|
3905
|
-
|
|
3906
|
-
|
|
3907
|
-
|
|
3908
|
-
|
|
3909
|
-
|
|
3910
|
-
|
|
3911
|
-
|
|
3912
|
-
<span class="
|
|
3830
|
+
|
|
3831
|
+
default:
|
|
3832
|
+
throw new Error(`Unknown transaction type: ${(tx as any).type}`);
|
|
3833
|
+
}
|
|
3834
|
+
|
|
3835
|
+
this.logger.debug('Freezing transaction', { type: tx.type });
|
|
3836
|
+
const frozen = await transaction.freezeWith(client);
|
|
3837
|
+
|
|
3838
|
+
this.logger.debug('Frozen transaction, serializing', { type: tx.type });
|
|
3839
|
+
const bytes = frozen.toBytes();
|
|
3840
|
+
|
|
3841
|
+
this.logger.debug('Serialized transaction', { type: tx.type, length: bytes.length });
|
|
3842
|
+
|
|
3843
|
+
results.push({
|
|
3844
|
+
payload: this.uint8ArrayToBase64(bytes),
|
|
3845
|
+
description,
|
|
3846
|
+
});
|
|
3847
|
+
|
|
3848
|
+
this.logger.debug('Successfully processed transaction', { type: tx.type });
|
|
3849
|
+
} catch (error) {
|
|
3850
|
+
this.logger.error('Failed to process transaction', { type: tx.type, error });
|
|
3851
|
+
throw new Error(`Failed to build ${tx.type} transaction: ${error}`);
|
|
3852
|
+
}
|
|
3853
|
+
}
|
|
3854
|
+
|
|
3855
|
+
return results;
|
|
3856
|
+
}
|
|
3857
|
+
|
|
3858
|
+
/**
|
|
3859
|
+
* Serialize a transaction to base64 encoded bytes
|
|
3860
|
+
* @param transaction
|
|
3861
|
+
* @param payerAccountId
|
|
3862
|
+
*/
|
|
3863
|
+
private async serializeTransaction(transaction: any, payerAccountId: string): Promise<string> {
|
|
3864
|
+
const networkId = this.getNetworkId();
|
|
3865
|
+
|
|
3866
|
+
if (!networkId) {
|
|
3867
|
+
throw new Error('No active wallet session. Please connect your wallet first.');
|
|
3868
|
+
}
|
|
3869
|
+
|
|
3870
|
+
transaction.setTransactionId(TransactionId.generate(AccountId.fromString(payerAccountId)));
|
|
3871
|
+
const client = this.createClientForNetwork(networkId);
|
|
3872
|
+
const frozen = await transaction.freezeWith(client);
|
|
3873
|
+
const bytes = frozen.toBytes();
|
|
3874
|
+
|
|
3875
|
+
return this.uint8ArrayToBase64(bytes);
|
|
3876
|
+
}
|
|
3877
|
+
|
|
3878
|
+
/**
|
|
3879
|
+
* Create a Hedera client for the specified network
|
|
3880
|
+
* @param networkId
|
|
3881
|
+
*/
|
|
3882
|
+
private createClientForNetwork(networkId: string): Client {
|
|
3883
|
+
const network = networkId.split(':')[1]?.toLowerCase();
|
|
3884
|
+
|
|
3885
|
+
switch (network) {
|
|
3886
|
+
case 'mainnet':
|
|
3887
|
+
return Client.forMainnet();
|
|
3888
|
+
case 'testnet':
|
|
3889
|
+
return Client.forTestnet();
|
|
3890
|
+
default:
|
|
3891
|
+
this.logger.warn('Unknown Hedera network, defaulting to testnet', { network });
|
|
3892
|
+
return Client.forTestnet();
|
|
3893
|
+
}
|
|
3894
|
+
}
|
|
3895
|
+
|
|
3896
|
+
/**
|
|
3897
|
+
* Convert Uint8Array to base64 string
|
|
3898
|
+
* @param bytes
|
|
3899
|
+
*/
|
|
3900
|
+
private uint8ArrayToBase64(bytes: Uint8Array): string {
|
|
3901
|
+
let binary = '';
|
|
3902
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
3903
|
+
binary += String.fromCharCode(bytes[i]);
|
|
3904
|
+
}
|
|
3905
|
+
return btoa(binary);
|
|
3906
|
+
}
|
|
3907
|
+
|
|
3908
|
+
/**
|
|
3909
|
+
* Convert base64 string to Uint8Array
|
|
3910
|
+
* @param base64
|
|
3911
|
+
*/
|
|
3912
|
+
private <span class="fstat-no" title="function not covered" >base64ToUint8Array(base64: string): Uint8Array {</span>
|
|
3913
3913
|
<span class="cstat-no" title="statement not covered" > const binary = atob(base64);</span>
|
|
3914
3914
|
<span class="cstat-no" title="statement not covered" > const bytes = new Uint8Array(binary.length);</span>
|
|
3915
3915
|
<span class="cstat-no" title="statement not covered" > for (let i = 0; i < binary.length; i++) {</span>
|
|
@@ -3917,7 +3917,7 @@
|
|
|
3917
3917
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3918
3918
|
<span class="cstat-no" title="statement not covered" > return bytes;</span>
|
|
3919
3919
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3920
|
-
|
|
3920
|
+
}
|
|
3921
3921
|
</pre></td></tr></table></pre>
|
|
3922
3922
|
|
|
3923
3923
|
<div class='push'></div><!-- for sticky footer -->
|
|
@@ -3925,7 +3925,7 @@
|
|
|
3925
3925
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
3926
3926
|
Code coverage generated by
|
|
3927
3927
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
3928
|
-
at 2026-06-
|
|
3928
|
+
at 2026-06-27T21:00:37.209Z
|
|
3929
3929
|
</div>
|
|
3930
3930
|
<script src="../../../prettify.js"></script>
|
|
3931
3931
|
<script>
|