@hsuite/native-connect-angular 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -0
- package/USAGE_EXAMPLES.md +476 -0
- package/assets/wallets/extension.svg +7 -0
- package/assets/wallets/hashpack.svg +6 -0
- package/assets/wallets/hsuite.svg +11 -0
- package/assets/wallets/kabila.svg +11 -0
- package/assets/wallets/walletconnect.svg +13 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/coverage-summary.json +50 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +476 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +476 -0
- package/coverage/lcov-report/lib/components/account-selector/account-actions/account-actions.component.ts.html +868 -0
- package/coverage/lcov-report/lib/components/account-selector/account-actions/index.html +116 -0
- package/coverage/lcov-report/lib/components/account-selector/account-filter/account-filter.component.ts.html +1288 -0
- package/coverage/lcov-report/lib/components/account-selector/account-filter/index.html +116 -0
- package/coverage/lcov-report/lib/components/account-selector/account-formatting.service.ts.html +685 -0
- package/coverage/lcov-report/lib/components/account-selector/account-grouping.service.ts.html +766 -0
- package/coverage/lcov-report/lib/components/account-selector/account-list/account-list.component.ts.html +1495 -0
- package/coverage/lcov-report/lib/components/account-selector/account-list/index.html +116 -0
- package/coverage/lcov-report/lib/components/account-selector/account-selector.component.ts.html +1495 -0
- package/coverage/lcov-report/lib/components/account-selector/account-selector.service.ts.html +1588 -0
- package/coverage/lcov-report/lib/components/account-selector/index.html +161 -0
- package/coverage/lcov-report/lib/components/wallet-account-display/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-account-display/wallet-account-display.component.ts.html +505 -0
- package/coverage/lcov-report/lib/components/wallet-connect-button/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +805 -0
- package/coverage/lcov-report/lib/components/wallet-connect-prompt/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +409 -0
- package/coverage/lcov-report/lib/components/wallet-connected-guard/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +304 -0
- package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +436 -0
- package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-connection-modal/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +2287 -0
- package/coverage/lcov-report/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +2275 -0
- package/coverage/lcov-report/lib/components/wallet-session-display/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-session-display/wallet-session-display.component.ts.html +676 -0
- package/coverage/lcov-report/lib/components/wallet-transaction-status/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +703 -0
- package/coverage/lcov-report/lib/directives/index.html +146 -0
- package/coverage/lcov-report/lib/directives/wallet-connected.directive.ts.html +670 -0
- package/coverage/lcov-report/lib/directives/wallet-context.directive.ts.html +547 -0
- package/coverage/lcov-report/lib/directives/wallet-events.directive.ts.html +781 -0
- package/coverage/lcov-report/lib/hsuite-wallet.module.ts.html +715 -0
- package/coverage/lcov-report/lib/index.html +116 -0
- package/coverage/lcov-report/lib/models/connection-config.model.ts.html +280 -0
- package/coverage/lcov-report/lib/models/index.html +131 -0
- package/coverage/lcov-report/lib/models/provider-types.ts.html +577 -0
- package/coverage/lcov-report/lib/providers/base-wallet-provider.ts.html +1138 -0
- package/coverage/lcov-report/lib/providers/hsuite-native/channel-client.service.ts.html +2671 -0
- package/coverage/lcov-report/lib/providers/hsuite-native/index.html +116 -0
- package/coverage/lcov-report/lib/providers/hsuite-native-provider.ts.html +2347 -0
- package/coverage/lcov-report/lib/providers/index.html +146 -0
- package/coverage/lcov-report/lib/providers/p2p-native/index.html +131 -0
- package/coverage/lcov-report/lib/providers/p2p-native/p2p-native.provider.ts.html +2254 -0
- package/coverage/lcov-report/lib/providers/p2p-native/p2p-session-manager.ts.html +2170 -0
- package/coverage/lcov-report/lib/providers/wallet-error-handler.ts.html +1132 -0
- package/coverage/lcov-report/lib/providers/walletconnect/core/index.html +176 -0
- package/coverage/lcov-report/lib/providers/walletconnect/core/session-health.ts.html +673 -0
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +1177 -0
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-provider.ts.html +2563 -0
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +904 -0
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +982 -0
- package/coverage/lcov-report/lib/providers/walletconnect/signers/hedera-signer.ts.html +1915 -0
- package/coverage/lcov-report/lib/providers/walletconnect/signers/index.html +146 -0
- package/coverage/lcov-report/lib/providers/walletconnect/signers/signer-factory.ts.html +445 -0
- package/coverage/lcov-report/lib/providers/walletconnect/signers/xrpl-signer.ts.html +1519 -0
- package/coverage/lcov-report/lib/services/index.html +191 -0
- package/coverage/lcov-report/lib/services/logger.service.ts.html +463 -0
- package/coverage/lcov-report/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1840 -0
- package/coverage/lcov-report/lib/services/transaction-builders/hedera-amount-utils.ts.html +337 -0
- package/coverage/lcov-report/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +3940 -0
- package/coverage/lcov-report/lib/services/transaction-builders/index.html +161 -0
- package/coverage/lcov-report/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +2581 -0
- package/coverage/lcov-report/lib/services/transaction.service.ts.html +1123 -0
- package/coverage/lcov-report/lib/services/unified-wallet.service.ts.html +2641 -0
- package/coverage/lcov-report/lib/services/wallet-context.service.ts.html +637 -0
- package/coverage/lcov-report/lib/services/wallet-event-bus.service.ts.html +643 -0
- package/coverage/lcov-report/lib/services/wallet-providers.service.ts.html +496 -0
- package/coverage/lcov-report/lib/transports/chrome-extension-transport.ts.html +823 -0
- package/coverage/lcov-report/lib/transports/index.html +116 -0
- package/coverage/lcov-report/lib/utils/index.html +116 -0
- package/coverage/lcov-report/lib/utils/ledger-icons.util.ts.html +319 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov.info +19252 -0
- package/coverage/lib/components/account-selector/account-actions/account-actions.component.ts.html +868 -0
- package/coverage/lib/components/account-selector/account-actions/index.html +116 -0
- package/coverage/lib/components/account-selector/account-filter/account-filter.component.ts.html +1288 -0
- package/coverage/lib/components/account-selector/account-filter/index.html +116 -0
- package/coverage/lib/components/account-selector/account-formatting.service.ts.html +685 -0
- package/coverage/lib/components/account-selector/account-grouping.service.ts.html +766 -0
- package/coverage/lib/components/account-selector/account-list/account-list.component.ts.html +1495 -0
- package/coverage/lib/components/account-selector/account-list/index.html +116 -0
- package/coverage/lib/components/account-selector/account-selector.component.ts.html +1495 -0
- package/coverage/lib/components/account-selector/account-selector.service.ts.html +1588 -0
- package/coverage/lib/components/account-selector/index.html +161 -0
- package/coverage/lib/components/wallet-account-display/index.html +116 -0
- package/coverage/lib/components/wallet-account-display/wallet-account-display.component.ts.html +505 -0
- package/coverage/lib/components/wallet-connect-button/index.html +116 -0
- package/coverage/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +805 -0
- package/coverage/lib/components/wallet-connect-prompt/index.html +116 -0
- package/coverage/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +409 -0
- package/coverage/lib/components/wallet-connected-guard/index.html +116 -0
- package/coverage/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +304 -0
- package/coverage/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +436 -0
- package/coverage/lib/components/wallet-connection-modal/connection-method-step/index.html +116 -0
- package/coverage/lib/components/wallet-connection-modal/index.html +116 -0
- package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/index.html +116 -0
- package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +2287 -0
- package/coverage/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +2275 -0
- package/coverage/lib/components/wallet-session-display/index.html +116 -0
- package/coverage/lib/components/wallet-session-display/wallet-session-display.component.ts.html +676 -0
- package/coverage/lib/components/wallet-transaction-status/index.html +116 -0
- package/coverage/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +703 -0
- package/coverage/lib/directives/index.html +146 -0
- package/coverage/lib/directives/wallet-connected.directive.ts.html +670 -0
- package/coverage/lib/directives/wallet-context.directive.ts.html +547 -0
- package/coverage/lib/directives/wallet-events.directive.ts.html +781 -0
- package/coverage/lib/hsuite-wallet.module.ts.html +715 -0
- package/coverage/lib/index.html +116 -0
- package/coverage/lib/models/connection-config.model.ts.html +280 -0
- package/coverage/lib/models/index.html +131 -0
- package/coverage/lib/models/provider-types.ts.html +577 -0
- package/coverage/lib/providers/base-wallet-provider.ts.html +1138 -0
- package/coverage/lib/providers/hsuite-native/channel-client.service.ts.html +2671 -0
- package/coverage/lib/providers/hsuite-native/index.html +116 -0
- package/coverage/lib/providers/hsuite-native-provider.ts.html +2347 -0
- package/coverage/lib/providers/index.html +146 -0
- package/coverage/lib/providers/p2p-native/index.html +131 -0
- package/coverage/lib/providers/p2p-native/p2p-native.provider.ts.html +2254 -0
- package/coverage/lib/providers/p2p-native/p2p-session-manager.ts.html +2170 -0
- package/coverage/lib/providers/wallet-error-handler.ts.html +1132 -0
- package/coverage/lib/providers/walletconnect/core/index.html +176 -0
- package/coverage/lib/providers/walletconnect/core/session-health.ts.html +673 -0
- package/coverage/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +1177 -0
- package/coverage/lib/providers/walletconnect/core/walletconnect-provider.ts.html +2563 -0
- package/coverage/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +904 -0
- package/coverage/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +982 -0
- package/coverage/lib/providers/walletconnect/signers/hedera-signer.ts.html +1915 -0
- package/coverage/lib/providers/walletconnect/signers/index.html +146 -0
- package/coverage/lib/providers/walletconnect/signers/signer-factory.ts.html +445 -0
- package/coverage/lib/providers/walletconnect/signers/xrpl-signer.ts.html +1519 -0
- package/coverage/lib/services/index.html +191 -0
- package/coverage/lib/services/logger.service.ts.html +463 -0
- package/coverage/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1840 -0
- package/coverage/lib/services/transaction-builders/hedera-amount-utils.ts.html +337 -0
- package/coverage/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +3940 -0
- package/coverage/lib/services/transaction-builders/index.html +161 -0
- package/coverage/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +2581 -0
- package/coverage/lib/services/transaction.service.ts.html +1123 -0
- package/coverage/lib/services/unified-wallet.service.ts.html +2641 -0
- package/coverage/lib/services/wallet-context.service.ts.html +637 -0
- package/coverage/lib/services/wallet-event-bus.service.ts.html +643 -0
- package/coverage/lib/services/wallet-providers.service.ts.html +496 -0
- package/coverage/lib/transports/chrome-extension-transport.ts.html +823 -0
- package/coverage/lib/transports/index.html +116 -0
- package/coverage/lib/utils/index.html +116 -0
- package/coverage/lib/utils/ledger-icons.util.ts.html +319 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/dist/README.md +48 -0
- package/dist/fesm2022/hsuite-native-connect-angular.mjs +14592 -0
- package/dist/fesm2022/hsuite-native-connect-angular.mjs.map +1 -0
- package/dist/index.d.ts +6949 -0
- package/examples/minimal-connect.ts +178 -0
- package/examples/multi-protocol.ts +495 -0
- package/examples/transaction-signing.ts +361 -0
- package/jest.config.json +45 -0
- package/karma.conf.js +42 -0
- package/ng-package.json +20 -0
- package/package.json +60 -0
- package/src/index.ts +203 -0
- package/src/lib/components/account-selector/account-actions/account-actions.component.ts +261 -0
- package/src/lib/components/account-selector/account-filter/account-filter.component.ts +401 -0
- package/src/lib/components/account-selector/account-formatting.service.ts +200 -0
- package/src/lib/components/account-selector/account-grouping.service.ts +227 -0
- package/src/lib/components/account-selector/account-list/account-list.component.ts +470 -0
- package/src/lib/components/account-selector/account-selector.component.html +135 -0
- package/src/lib/components/account-selector/account-selector.component.scss +2039 -0
- package/src/lib/components/account-selector/account-selector.component.ts +470 -0
- package/src/lib/components/account-selector/account-selector.service.ts +501 -0
- package/src/lib/components/wallet-account-display/wallet-account-display.component.html +34 -0
- package/src/lib/components/wallet-account-display/wallet-account-display.component.scss +99 -0
- package/src/lib/components/wallet-account-display/wallet-account-display.component.ts +140 -0
- package/src/lib/components/wallet-connect-button/wallet-connect-button.component.html +14 -0
- package/src/lib/components/wallet-connect-button/wallet-connect-button.component.scss +272 -0
- package/src/lib/components/wallet-connect-button/wallet-connect-button.component.ts +240 -0
- package/src/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.html +24 -0
- package/src/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.scss +50 -0
- package/src/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts +108 -0
- package/src/lib/components/wallet-connected-guard/wallet-connected-guard.component.html +24 -0
- package/src/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts +73 -0
- package/src/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.html +56 -0
- package/src/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.scss +218 -0
- package/src/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts +117 -0
- package/src/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.html +94 -0
- package/src/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.scss +272 -0
- package/src/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts +734 -0
- package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.html +197 -0
- package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.scss +678 -0
- package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts +730 -0
- package/src/lib/components/wallet-session-display/wallet-session-display.component.html +110 -0
- package/src/lib/components/wallet-session-display/wallet-session-display.component.scss +179 -0
- package/src/lib/components/wallet-session-display/wallet-session-display.component.ts +197 -0
- package/src/lib/components/wallet-transaction-status/wallet-transaction-status.component.html +65 -0
- package/src/lib/components/wallet-transaction-status/wallet-transaction-status.component.scss +254 -0
- package/src/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts +206 -0
- package/src/lib/directives/wallet-connected.directive.ts +195 -0
- package/src/lib/directives/wallet-context.directive.ts +154 -0
- package/src/lib/directives/wallet-events.directive.ts +232 -0
- package/src/lib/hsuite-wallet.module.ts +210 -0
- package/src/lib/models/connection-config.model.ts +65 -0
- package/src/lib/models/provider-types.ts +164 -0
- package/src/lib/models/unified-account.model.ts +76 -0
- package/src/lib/models/wallet-context.model.ts +121 -0
- package/src/lib/models/wallet-events.model.ts +158 -0
- package/src/lib/providers/base-wallet-provider.ts +351 -0
- package/src/lib/providers/hsuite-native/channel-client.service.spec.ts +73 -0
- package/src/lib/providers/hsuite-native/channel-client.service.ts +862 -0
- package/src/lib/providers/hsuite-native/index.ts +8 -0
- package/src/lib/providers/hsuite-native-provider.ts +754 -0
- package/src/lib/providers/mobile-native/mobile-native.provider.spec.ts +19 -0
- package/src/lib/providers/p2p-native/index.ts +30 -0
- package/src/lib/providers/p2p-native/p2p-native.provider.spec.ts +523 -0
- package/src/lib/providers/p2p-native/p2p-native.provider.ts +723 -0
- package/src/lib/providers/p2p-native/p2p-session-manager.ts +695 -0
- package/src/lib/providers/wallet-error-handler.ts +349 -0
- package/src/lib/providers/walletconnect/core/base-signer.interface.ts +122 -0
- package/src/lib/providers/walletconnect/core/session-health.ts +196 -0
- package/src/lib/providers/walletconnect/core/walletconnect-client-manager.ts +364 -0
- package/src/lib/providers/walletconnect/core/walletconnect-provider.integration.spec.ts +348 -0
- package/src/lib/providers/walletconnect/core/walletconnect-provider.ts +826 -0
- package/src/lib/providers/walletconnect/core/walletconnect-session-store.ts +273 -0
- package/src/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts +299 -0
- package/src/lib/providers/walletconnect/core/walletconnect-types.ts +48 -0
- package/src/lib/providers/walletconnect/index.ts +33 -0
- package/src/lib/providers/walletconnect/signers/hedera-signer.spec.ts +367 -0
- package/src/lib/providers/walletconnect/signers/hedera-signer.ts +610 -0
- package/src/lib/providers/walletconnect/signers/signer-factory.spec.ts +62 -0
- package/src/lib/providers/walletconnect/signers/signer-factory.ts +120 -0
- package/src/lib/providers/walletconnect/signers/xrpl-signer.spec.ts +296 -0
- package/src/lib/providers/walletconnect/signers/xrpl-signer.ts +478 -0
- package/src/lib/services/logger.service.ts +126 -0
- package/src/lib/services/transaction-builders/base-transaction-builder.service.ts +585 -0
- package/src/lib/services/transaction-builders/hedera-amount-utils.ts +84 -0
- package/src/lib/services/transaction-builders/hedera-transaction-builder.service.spec.ts +741 -0
- package/src/lib/services/transaction-builders/hedera-transaction-builder.service.ts +1285 -0
- package/src/lib/services/transaction-builders/index.ts +54 -0
- package/src/lib/services/transaction-builders/xrpl-transaction-builder.service.spec.ts +937 -0
- package/src/lib/services/transaction-builders/xrpl-transaction-builder.service.ts +832 -0
- package/src/lib/services/transaction.service.ts +346 -0
- package/src/lib/services/unified-wallet.service.spec.ts +1382 -0
- package/src/lib/services/unified-wallet.service.ts +852 -0
- package/src/lib/services/wallet-context.service.ts +184 -0
- package/src/lib/services/wallet-event-bus.service.ts +186 -0
- package/src/lib/services/wallet-providers.service.ts +137 -0
- package/src/lib/transports/chrome-extension-transport.ts +246 -0
- package/src/lib/utils/index.ts +14 -0
- package/src/lib/utils/ledger-icons.util.ts +78 -0
- package/test/test-setup.ts +21 -0
- package/test-setup.ts +63 -0
- package/tsconfig.build.json +11 -0
- package/tsconfig.json +29 -0
- package/tsconfig.spec.json +15 -0
- package/vitest.config.ts +48 -0
|
@@ -0,0 +1,2641 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for lib/services/unified-wallet.service.ts</title>
|
|
7
|
+
<meta charset="utf-8" />
|
|
8
|
+
<link rel="stylesheet" href="../../prettify.css" />
|
|
9
|
+
<link rel="stylesheet" href="../../base.css" />
|
|
10
|
+
<link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
+
<style type='text/css'>
|
|
13
|
+
.coverage-summary .sorter {
|
|
14
|
+
background-image: url(../../sort-arrow-sprite.png);
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<div class='wrapper'>
|
|
21
|
+
<div class='pad1'>
|
|
22
|
+
<h1><a href="../../index.html">All files</a> / <a href="index.html">lib/services</a> unified-wallet.service.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">12.67% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>108/852</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">0% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>0/2</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">0% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>0/1</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">12.67% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>108/852</span>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
<p class="quiet">
|
|
55
|
+
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
+
</p>
|
|
57
|
+
<template id="filterTemplate">
|
|
58
|
+
<div class="quiet">
|
|
59
|
+
Filter:
|
|
60
|
+
<input type="search" id="fileSearch">
|
|
61
|
+
</div>
|
|
62
|
+
</template>
|
|
63
|
+
</div>
|
|
64
|
+
<div class='status-line low'></div>
|
|
65
|
+
<pre><table class="coverage">
|
|
66
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
+
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
+
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
+
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
+
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
+
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
+
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
+
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
+
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
+
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
+
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
+
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
+
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
+
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
+
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
+
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
+
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
+
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
+
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
+
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
+
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
+
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
+
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
+
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
+
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
+
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
+
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
+
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
+
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
+
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
+
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
+
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
+
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
+
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
+
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
+
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
+
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
+
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
+
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
+
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
+
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
+
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
+
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
+
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
+
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
+
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
+
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
+
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
+
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
+
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
+
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
+
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
+
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
+
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
+
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
+
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
+
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
+
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
+
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
+
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
+
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
+
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
+
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
+
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
+
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
+
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
+
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
+
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
+
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
+
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
+
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
+
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
+
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
+
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
+
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
+
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
+
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
+
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
+
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
+
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
+
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
+
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
+
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
+
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
+
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
+
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
+
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
+
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
+
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
+
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
+
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
+
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
+
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
+
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
+
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
+
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
+
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
+
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
+
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
+
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
+
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
+
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
+
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
+
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
+
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
+
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
+
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
+
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
+
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
+
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
+
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
+
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
+
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
+
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
+
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
+
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
+
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
+
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
+
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
+
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
+
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
+
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
+
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
+
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
+
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
+
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
+
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
+
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
+
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
+
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
+
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
+
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
+
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
+
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
+
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
+
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
+
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
+
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
+
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
+
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
+
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
+
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
+
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
+
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
+
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
+
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
+
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
+
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
+
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
+
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
+
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
+
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
+
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
+
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
+
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
+
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
+
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
+
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
+
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
+
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
+
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
+
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
+
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
|
+
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
+
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
+
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
+
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
+
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
+
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
+
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
+
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
+
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
+
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
+
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
+
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
+
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
+
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
+
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
+
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
+
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
+
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
+
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
+
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
+
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
+
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
+
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
+
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
+
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
+
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
+
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
+
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
+
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
+
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
+
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
+
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
+
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
+
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
+
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
|
+
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
|
+
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
+
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
+
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
+
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
+
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
+
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
+
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
+
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
+
<a name='L266'></a><a href='#L266'>266</a>
|
|
332
|
+
<a name='L267'></a><a href='#L267'>267</a>
|
|
333
|
+
<a name='L268'></a><a href='#L268'>268</a>
|
|
334
|
+
<a name='L269'></a><a href='#L269'>269</a>
|
|
335
|
+
<a name='L270'></a><a href='#L270'>270</a>
|
|
336
|
+
<a name='L271'></a><a href='#L271'>271</a>
|
|
337
|
+
<a name='L272'></a><a href='#L272'>272</a>
|
|
338
|
+
<a name='L273'></a><a href='#L273'>273</a>
|
|
339
|
+
<a name='L274'></a><a href='#L274'>274</a>
|
|
340
|
+
<a name='L275'></a><a href='#L275'>275</a>
|
|
341
|
+
<a name='L276'></a><a href='#L276'>276</a>
|
|
342
|
+
<a name='L277'></a><a href='#L277'>277</a>
|
|
343
|
+
<a name='L278'></a><a href='#L278'>278</a>
|
|
344
|
+
<a name='L279'></a><a href='#L279'>279</a>
|
|
345
|
+
<a name='L280'></a><a href='#L280'>280</a>
|
|
346
|
+
<a name='L281'></a><a href='#L281'>281</a>
|
|
347
|
+
<a name='L282'></a><a href='#L282'>282</a>
|
|
348
|
+
<a name='L283'></a><a href='#L283'>283</a>
|
|
349
|
+
<a name='L284'></a><a href='#L284'>284</a>
|
|
350
|
+
<a name='L285'></a><a href='#L285'>285</a>
|
|
351
|
+
<a name='L286'></a><a href='#L286'>286</a>
|
|
352
|
+
<a name='L287'></a><a href='#L287'>287</a>
|
|
353
|
+
<a name='L288'></a><a href='#L288'>288</a>
|
|
354
|
+
<a name='L289'></a><a href='#L289'>289</a>
|
|
355
|
+
<a name='L290'></a><a href='#L290'>290</a>
|
|
356
|
+
<a name='L291'></a><a href='#L291'>291</a>
|
|
357
|
+
<a name='L292'></a><a href='#L292'>292</a>
|
|
358
|
+
<a name='L293'></a><a href='#L293'>293</a>
|
|
359
|
+
<a name='L294'></a><a href='#L294'>294</a>
|
|
360
|
+
<a name='L295'></a><a href='#L295'>295</a>
|
|
361
|
+
<a name='L296'></a><a href='#L296'>296</a>
|
|
362
|
+
<a name='L297'></a><a href='#L297'>297</a>
|
|
363
|
+
<a name='L298'></a><a href='#L298'>298</a>
|
|
364
|
+
<a name='L299'></a><a href='#L299'>299</a>
|
|
365
|
+
<a name='L300'></a><a href='#L300'>300</a>
|
|
366
|
+
<a name='L301'></a><a href='#L301'>301</a>
|
|
367
|
+
<a name='L302'></a><a href='#L302'>302</a>
|
|
368
|
+
<a name='L303'></a><a href='#L303'>303</a>
|
|
369
|
+
<a name='L304'></a><a href='#L304'>304</a>
|
|
370
|
+
<a name='L305'></a><a href='#L305'>305</a>
|
|
371
|
+
<a name='L306'></a><a href='#L306'>306</a>
|
|
372
|
+
<a name='L307'></a><a href='#L307'>307</a>
|
|
373
|
+
<a name='L308'></a><a href='#L308'>308</a>
|
|
374
|
+
<a name='L309'></a><a href='#L309'>309</a>
|
|
375
|
+
<a name='L310'></a><a href='#L310'>310</a>
|
|
376
|
+
<a name='L311'></a><a href='#L311'>311</a>
|
|
377
|
+
<a name='L312'></a><a href='#L312'>312</a>
|
|
378
|
+
<a name='L313'></a><a href='#L313'>313</a>
|
|
379
|
+
<a name='L314'></a><a href='#L314'>314</a>
|
|
380
|
+
<a name='L315'></a><a href='#L315'>315</a>
|
|
381
|
+
<a name='L316'></a><a href='#L316'>316</a>
|
|
382
|
+
<a name='L317'></a><a href='#L317'>317</a>
|
|
383
|
+
<a name='L318'></a><a href='#L318'>318</a>
|
|
384
|
+
<a name='L319'></a><a href='#L319'>319</a>
|
|
385
|
+
<a name='L320'></a><a href='#L320'>320</a>
|
|
386
|
+
<a name='L321'></a><a href='#L321'>321</a>
|
|
387
|
+
<a name='L322'></a><a href='#L322'>322</a>
|
|
388
|
+
<a name='L323'></a><a href='#L323'>323</a>
|
|
389
|
+
<a name='L324'></a><a href='#L324'>324</a>
|
|
390
|
+
<a name='L325'></a><a href='#L325'>325</a>
|
|
391
|
+
<a name='L326'></a><a href='#L326'>326</a>
|
|
392
|
+
<a name='L327'></a><a href='#L327'>327</a>
|
|
393
|
+
<a name='L328'></a><a href='#L328'>328</a>
|
|
394
|
+
<a name='L329'></a><a href='#L329'>329</a>
|
|
395
|
+
<a name='L330'></a><a href='#L330'>330</a>
|
|
396
|
+
<a name='L331'></a><a href='#L331'>331</a>
|
|
397
|
+
<a name='L332'></a><a href='#L332'>332</a>
|
|
398
|
+
<a name='L333'></a><a href='#L333'>333</a>
|
|
399
|
+
<a name='L334'></a><a href='#L334'>334</a>
|
|
400
|
+
<a name='L335'></a><a href='#L335'>335</a>
|
|
401
|
+
<a name='L336'></a><a href='#L336'>336</a>
|
|
402
|
+
<a name='L337'></a><a href='#L337'>337</a>
|
|
403
|
+
<a name='L338'></a><a href='#L338'>338</a>
|
|
404
|
+
<a name='L339'></a><a href='#L339'>339</a>
|
|
405
|
+
<a name='L340'></a><a href='#L340'>340</a>
|
|
406
|
+
<a name='L341'></a><a href='#L341'>341</a>
|
|
407
|
+
<a name='L342'></a><a href='#L342'>342</a>
|
|
408
|
+
<a name='L343'></a><a href='#L343'>343</a>
|
|
409
|
+
<a name='L344'></a><a href='#L344'>344</a>
|
|
410
|
+
<a name='L345'></a><a href='#L345'>345</a>
|
|
411
|
+
<a name='L346'></a><a href='#L346'>346</a>
|
|
412
|
+
<a name='L347'></a><a href='#L347'>347</a>
|
|
413
|
+
<a name='L348'></a><a href='#L348'>348</a>
|
|
414
|
+
<a name='L349'></a><a href='#L349'>349</a>
|
|
415
|
+
<a name='L350'></a><a href='#L350'>350</a>
|
|
416
|
+
<a name='L351'></a><a href='#L351'>351</a>
|
|
417
|
+
<a name='L352'></a><a href='#L352'>352</a>
|
|
418
|
+
<a name='L353'></a><a href='#L353'>353</a>
|
|
419
|
+
<a name='L354'></a><a href='#L354'>354</a>
|
|
420
|
+
<a name='L355'></a><a href='#L355'>355</a>
|
|
421
|
+
<a name='L356'></a><a href='#L356'>356</a>
|
|
422
|
+
<a name='L357'></a><a href='#L357'>357</a>
|
|
423
|
+
<a name='L358'></a><a href='#L358'>358</a>
|
|
424
|
+
<a name='L359'></a><a href='#L359'>359</a>
|
|
425
|
+
<a name='L360'></a><a href='#L360'>360</a>
|
|
426
|
+
<a name='L361'></a><a href='#L361'>361</a>
|
|
427
|
+
<a name='L362'></a><a href='#L362'>362</a>
|
|
428
|
+
<a name='L363'></a><a href='#L363'>363</a>
|
|
429
|
+
<a name='L364'></a><a href='#L364'>364</a>
|
|
430
|
+
<a name='L365'></a><a href='#L365'>365</a>
|
|
431
|
+
<a name='L366'></a><a href='#L366'>366</a>
|
|
432
|
+
<a name='L367'></a><a href='#L367'>367</a>
|
|
433
|
+
<a name='L368'></a><a href='#L368'>368</a>
|
|
434
|
+
<a name='L369'></a><a href='#L369'>369</a>
|
|
435
|
+
<a name='L370'></a><a href='#L370'>370</a>
|
|
436
|
+
<a name='L371'></a><a href='#L371'>371</a>
|
|
437
|
+
<a name='L372'></a><a href='#L372'>372</a>
|
|
438
|
+
<a name='L373'></a><a href='#L373'>373</a>
|
|
439
|
+
<a name='L374'></a><a href='#L374'>374</a>
|
|
440
|
+
<a name='L375'></a><a href='#L375'>375</a>
|
|
441
|
+
<a name='L376'></a><a href='#L376'>376</a>
|
|
442
|
+
<a name='L377'></a><a href='#L377'>377</a>
|
|
443
|
+
<a name='L378'></a><a href='#L378'>378</a>
|
|
444
|
+
<a name='L379'></a><a href='#L379'>379</a>
|
|
445
|
+
<a name='L380'></a><a href='#L380'>380</a>
|
|
446
|
+
<a name='L381'></a><a href='#L381'>381</a>
|
|
447
|
+
<a name='L382'></a><a href='#L382'>382</a>
|
|
448
|
+
<a name='L383'></a><a href='#L383'>383</a>
|
|
449
|
+
<a name='L384'></a><a href='#L384'>384</a>
|
|
450
|
+
<a name='L385'></a><a href='#L385'>385</a>
|
|
451
|
+
<a name='L386'></a><a href='#L386'>386</a>
|
|
452
|
+
<a name='L387'></a><a href='#L387'>387</a>
|
|
453
|
+
<a name='L388'></a><a href='#L388'>388</a>
|
|
454
|
+
<a name='L389'></a><a href='#L389'>389</a>
|
|
455
|
+
<a name='L390'></a><a href='#L390'>390</a>
|
|
456
|
+
<a name='L391'></a><a href='#L391'>391</a>
|
|
457
|
+
<a name='L392'></a><a href='#L392'>392</a>
|
|
458
|
+
<a name='L393'></a><a href='#L393'>393</a>
|
|
459
|
+
<a name='L394'></a><a href='#L394'>394</a>
|
|
460
|
+
<a name='L395'></a><a href='#L395'>395</a>
|
|
461
|
+
<a name='L396'></a><a href='#L396'>396</a>
|
|
462
|
+
<a name='L397'></a><a href='#L397'>397</a>
|
|
463
|
+
<a name='L398'></a><a href='#L398'>398</a>
|
|
464
|
+
<a name='L399'></a><a href='#L399'>399</a>
|
|
465
|
+
<a name='L400'></a><a href='#L400'>400</a>
|
|
466
|
+
<a name='L401'></a><a href='#L401'>401</a>
|
|
467
|
+
<a name='L402'></a><a href='#L402'>402</a>
|
|
468
|
+
<a name='L403'></a><a href='#L403'>403</a>
|
|
469
|
+
<a name='L404'></a><a href='#L404'>404</a>
|
|
470
|
+
<a name='L405'></a><a href='#L405'>405</a>
|
|
471
|
+
<a name='L406'></a><a href='#L406'>406</a>
|
|
472
|
+
<a name='L407'></a><a href='#L407'>407</a>
|
|
473
|
+
<a name='L408'></a><a href='#L408'>408</a>
|
|
474
|
+
<a name='L409'></a><a href='#L409'>409</a>
|
|
475
|
+
<a name='L410'></a><a href='#L410'>410</a>
|
|
476
|
+
<a name='L411'></a><a href='#L411'>411</a>
|
|
477
|
+
<a name='L412'></a><a href='#L412'>412</a>
|
|
478
|
+
<a name='L413'></a><a href='#L413'>413</a>
|
|
479
|
+
<a name='L414'></a><a href='#L414'>414</a>
|
|
480
|
+
<a name='L415'></a><a href='#L415'>415</a>
|
|
481
|
+
<a name='L416'></a><a href='#L416'>416</a>
|
|
482
|
+
<a name='L417'></a><a href='#L417'>417</a>
|
|
483
|
+
<a name='L418'></a><a href='#L418'>418</a>
|
|
484
|
+
<a name='L419'></a><a href='#L419'>419</a>
|
|
485
|
+
<a name='L420'></a><a href='#L420'>420</a>
|
|
486
|
+
<a name='L421'></a><a href='#L421'>421</a>
|
|
487
|
+
<a name='L422'></a><a href='#L422'>422</a>
|
|
488
|
+
<a name='L423'></a><a href='#L423'>423</a>
|
|
489
|
+
<a name='L424'></a><a href='#L424'>424</a>
|
|
490
|
+
<a name='L425'></a><a href='#L425'>425</a>
|
|
491
|
+
<a name='L426'></a><a href='#L426'>426</a>
|
|
492
|
+
<a name='L427'></a><a href='#L427'>427</a>
|
|
493
|
+
<a name='L428'></a><a href='#L428'>428</a>
|
|
494
|
+
<a name='L429'></a><a href='#L429'>429</a>
|
|
495
|
+
<a name='L430'></a><a href='#L430'>430</a>
|
|
496
|
+
<a name='L431'></a><a href='#L431'>431</a>
|
|
497
|
+
<a name='L432'></a><a href='#L432'>432</a>
|
|
498
|
+
<a name='L433'></a><a href='#L433'>433</a>
|
|
499
|
+
<a name='L434'></a><a href='#L434'>434</a>
|
|
500
|
+
<a name='L435'></a><a href='#L435'>435</a>
|
|
501
|
+
<a name='L436'></a><a href='#L436'>436</a>
|
|
502
|
+
<a name='L437'></a><a href='#L437'>437</a>
|
|
503
|
+
<a name='L438'></a><a href='#L438'>438</a>
|
|
504
|
+
<a name='L439'></a><a href='#L439'>439</a>
|
|
505
|
+
<a name='L440'></a><a href='#L440'>440</a>
|
|
506
|
+
<a name='L441'></a><a href='#L441'>441</a>
|
|
507
|
+
<a name='L442'></a><a href='#L442'>442</a>
|
|
508
|
+
<a name='L443'></a><a href='#L443'>443</a>
|
|
509
|
+
<a name='L444'></a><a href='#L444'>444</a>
|
|
510
|
+
<a name='L445'></a><a href='#L445'>445</a>
|
|
511
|
+
<a name='L446'></a><a href='#L446'>446</a>
|
|
512
|
+
<a name='L447'></a><a href='#L447'>447</a>
|
|
513
|
+
<a name='L448'></a><a href='#L448'>448</a>
|
|
514
|
+
<a name='L449'></a><a href='#L449'>449</a>
|
|
515
|
+
<a name='L450'></a><a href='#L450'>450</a>
|
|
516
|
+
<a name='L451'></a><a href='#L451'>451</a>
|
|
517
|
+
<a name='L452'></a><a href='#L452'>452</a>
|
|
518
|
+
<a name='L453'></a><a href='#L453'>453</a>
|
|
519
|
+
<a name='L454'></a><a href='#L454'>454</a>
|
|
520
|
+
<a name='L455'></a><a href='#L455'>455</a>
|
|
521
|
+
<a name='L456'></a><a href='#L456'>456</a>
|
|
522
|
+
<a name='L457'></a><a href='#L457'>457</a>
|
|
523
|
+
<a name='L458'></a><a href='#L458'>458</a>
|
|
524
|
+
<a name='L459'></a><a href='#L459'>459</a>
|
|
525
|
+
<a name='L460'></a><a href='#L460'>460</a>
|
|
526
|
+
<a name='L461'></a><a href='#L461'>461</a>
|
|
527
|
+
<a name='L462'></a><a href='#L462'>462</a>
|
|
528
|
+
<a name='L463'></a><a href='#L463'>463</a>
|
|
529
|
+
<a name='L464'></a><a href='#L464'>464</a>
|
|
530
|
+
<a name='L465'></a><a href='#L465'>465</a>
|
|
531
|
+
<a name='L466'></a><a href='#L466'>466</a>
|
|
532
|
+
<a name='L467'></a><a href='#L467'>467</a>
|
|
533
|
+
<a name='L468'></a><a href='#L468'>468</a>
|
|
534
|
+
<a name='L469'></a><a href='#L469'>469</a>
|
|
535
|
+
<a name='L470'></a><a href='#L470'>470</a>
|
|
536
|
+
<a name='L471'></a><a href='#L471'>471</a>
|
|
537
|
+
<a name='L472'></a><a href='#L472'>472</a>
|
|
538
|
+
<a name='L473'></a><a href='#L473'>473</a>
|
|
539
|
+
<a name='L474'></a><a href='#L474'>474</a>
|
|
540
|
+
<a name='L475'></a><a href='#L475'>475</a>
|
|
541
|
+
<a name='L476'></a><a href='#L476'>476</a>
|
|
542
|
+
<a name='L477'></a><a href='#L477'>477</a>
|
|
543
|
+
<a name='L478'></a><a href='#L478'>478</a>
|
|
544
|
+
<a name='L479'></a><a href='#L479'>479</a>
|
|
545
|
+
<a name='L480'></a><a href='#L480'>480</a>
|
|
546
|
+
<a name='L481'></a><a href='#L481'>481</a>
|
|
547
|
+
<a name='L482'></a><a href='#L482'>482</a>
|
|
548
|
+
<a name='L483'></a><a href='#L483'>483</a>
|
|
549
|
+
<a name='L484'></a><a href='#L484'>484</a>
|
|
550
|
+
<a name='L485'></a><a href='#L485'>485</a>
|
|
551
|
+
<a name='L486'></a><a href='#L486'>486</a>
|
|
552
|
+
<a name='L487'></a><a href='#L487'>487</a>
|
|
553
|
+
<a name='L488'></a><a href='#L488'>488</a>
|
|
554
|
+
<a name='L489'></a><a href='#L489'>489</a>
|
|
555
|
+
<a name='L490'></a><a href='#L490'>490</a>
|
|
556
|
+
<a name='L491'></a><a href='#L491'>491</a>
|
|
557
|
+
<a name='L492'></a><a href='#L492'>492</a>
|
|
558
|
+
<a name='L493'></a><a href='#L493'>493</a>
|
|
559
|
+
<a name='L494'></a><a href='#L494'>494</a>
|
|
560
|
+
<a name='L495'></a><a href='#L495'>495</a>
|
|
561
|
+
<a name='L496'></a><a href='#L496'>496</a>
|
|
562
|
+
<a name='L497'></a><a href='#L497'>497</a>
|
|
563
|
+
<a name='L498'></a><a href='#L498'>498</a>
|
|
564
|
+
<a name='L499'></a><a href='#L499'>499</a>
|
|
565
|
+
<a name='L500'></a><a href='#L500'>500</a>
|
|
566
|
+
<a name='L501'></a><a href='#L501'>501</a>
|
|
567
|
+
<a name='L502'></a><a href='#L502'>502</a>
|
|
568
|
+
<a name='L503'></a><a href='#L503'>503</a>
|
|
569
|
+
<a name='L504'></a><a href='#L504'>504</a>
|
|
570
|
+
<a name='L505'></a><a href='#L505'>505</a>
|
|
571
|
+
<a name='L506'></a><a href='#L506'>506</a>
|
|
572
|
+
<a name='L507'></a><a href='#L507'>507</a>
|
|
573
|
+
<a name='L508'></a><a href='#L508'>508</a>
|
|
574
|
+
<a name='L509'></a><a href='#L509'>509</a>
|
|
575
|
+
<a name='L510'></a><a href='#L510'>510</a>
|
|
576
|
+
<a name='L511'></a><a href='#L511'>511</a>
|
|
577
|
+
<a name='L512'></a><a href='#L512'>512</a>
|
|
578
|
+
<a name='L513'></a><a href='#L513'>513</a>
|
|
579
|
+
<a name='L514'></a><a href='#L514'>514</a>
|
|
580
|
+
<a name='L515'></a><a href='#L515'>515</a>
|
|
581
|
+
<a name='L516'></a><a href='#L516'>516</a>
|
|
582
|
+
<a name='L517'></a><a href='#L517'>517</a>
|
|
583
|
+
<a name='L518'></a><a href='#L518'>518</a>
|
|
584
|
+
<a name='L519'></a><a href='#L519'>519</a>
|
|
585
|
+
<a name='L520'></a><a href='#L520'>520</a>
|
|
586
|
+
<a name='L521'></a><a href='#L521'>521</a>
|
|
587
|
+
<a name='L522'></a><a href='#L522'>522</a>
|
|
588
|
+
<a name='L523'></a><a href='#L523'>523</a>
|
|
589
|
+
<a name='L524'></a><a href='#L524'>524</a>
|
|
590
|
+
<a name='L525'></a><a href='#L525'>525</a>
|
|
591
|
+
<a name='L526'></a><a href='#L526'>526</a>
|
|
592
|
+
<a name='L527'></a><a href='#L527'>527</a>
|
|
593
|
+
<a name='L528'></a><a href='#L528'>528</a>
|
|
594
|
+
<a name='L529'></a><a href='#L529'>529</a>
|
|
595
|
+
<a name='L530'></a><a href='#L530'>530</a>
|
|
596
|
+
<a name='L531'></a><a href='#L531'>531</a>
|
|
597
|
+
<a name='L532'></a><a href='#L532'>532</a>
|
|
598
|
+
<a name='L533'></a><a href='#L533'>533</a>
|
|
599
|
+
<a name='L534'></a><a href='#L534'>534</a>
|
|
600
|
+
<a name='L535'></a><a href='#L535'>535</a>
|
|
601
|
+
<a name='L536'></a><a href='#L536'>536</a>
|
|
602
|
+
<a name='L537'></a><a href='#L537'>537</a>
|
|
603
|
+
<a name='L538'></a><a href='#L538'>538</a>
|
|
604
|
+
<a name='L539'></a><a href='#L539'>539</a>
|
|
605
|
+
<a name='L540'></a><a href='#L540'>540</a>
|
|
606
|
+
<a name='L541'></a><a href='#L541'>541</a>
|
|
607
|
+
<a name='L542'></a><a href='#L542'>542</a>
|
|
608
|
+
<a name='L543'></a><a href='#L543'>543</a>
|
|
609
|
+
<a name='L544'></a><a href='#L544'>544</a>
|
|
610
|
+
<a name='L545'></a><a href='#L545'>545</a>
|
|
611
|
+
<a name='L546'></a><a href='#L546'>546</a>
|
|
612
|
+
<a name='L547'></a><a href='#L547'>547</a>
|
|
613
|
+
<a name='L548'></a><a href='#L548'>548</a>
|
|
614
|
+
<a name='L549'></a><a href='#L549'>549</a>
|
|
615
|
+
<a name='L550'></a><a href='#L550'>550</a>
|
|
616
|
+
<a name='L551'></a><a href='#L551'>551</a>
|
|
617
|
+
<a name='L552'></a><a href='#L552'>552</a>
|
|
618
|
+
<a name='L553'></a><a href='#L553'>553</a>
|
|
619
|
+
<a name='L554'></a><a href='#L554'>554</a>
|
|
620
|
+
<a name='L555'></a><a href='#L555'>555</a>
|
|
621
|
+
<a name='L556'></a><a href='#L556'>556</a>
|
|
622
|
+
<a name='L557'></a><a href='#L557'>557</a>
|
|
623
|
+
<a name='L558'></a><a href='#L558'>558</a>
|
|
624
|
+
<a name='L559'></a><a href='#L559'>559</a>
|
|
625
|
+
<a name='L560'></a><a href='#L560'>560</a>
|
|
626
|
+
<a name='L561'></a><a href='#L561'>561</a>
|
|
627
|
+
<a name='L562'></a><a href='#L562'>562</a>
|
|
628
|
+
<a name='L563'></a><a href='#L563'>563</a>
|
|
629
|
+
<a name='L564'></a><a href='#L564'>564</a>
|
|
630
|
+
<a name='L565'></a><a href='#L565'>565</a>
|
|
631
|
+
<a name='L566'></a><a href='#L566'>566</a>
|
|
632
|
+
<a name='L567'></a><a href='#L567'>567</a>
|
|
633
|
+
<a name='L568'></a><a href='#L568'>568</a>
|
|
634
|
+
<a name='L569'></a><a href='#L569'>569</a>
|
|
635
|
+
<a name='L570'></a><a href='#L570'>570</a>
|
|
636
|
+
<a name='L571'></a><a href='#L571'>571</a>
|
|
637
|
+
<a name='L572'></a><a href='#L572'>572</a>
|
|
638
|
+
<a name='L573'></a><a href='#L573'>573</a>
|
|
639
|
+
<a name='L574'></a><a href='#L574'>574</a>
|
|
640
|
+
<a name='L575'></a><a href='#L575'>575</a>
|
|
641
|
+
<a name='L576'></a><a href='#L576'>576</a>
|
|
642
|
+
<a name='L577'></a><a href='#L577'>577</a>
|
|
643
|
+
<a name='L578'></a><a href='#L578'>578</a>
|
|
644
|
+
<a name='L579'></a><a href='#L579'>579</a>
|
|
645
|
+
<a name='L580'></a><a href='#L580'>580</a>
|
|
646
|
+
<a name='L581'></a><a href='#L581'>581</a>
|
|
647
|
+
<a name='L582'></a><a href='#L582'>582</a>
|
|
648
|
+
<a name='L583'></a><a href='#L583'>583</a>
|
|
649
|
+
<a name='L584'></a><a href='#L584'>584</a>
|
|
650
|
+
<a name='L585'></a><a href='#L585'>585</a>
|
|
651
|
+
<a name='L586'></a><a href='#L586'>586</a>
|
|
652
|
+
<a name='L587'></a><a href='#L587'>587</a>
|
|
653
|
+
<a name='L588'></a><a href='#L588'>588</a>
|
|
654
|
+
<a name='L589'></a><a href='#L589'>589</a>
|
|
655
|
+
<a name='L590'></a><a href='#L590'>590</a>
|
|
656
|
+
<a name='L591'></a><a href='#L591'>591</a>
|
|
657
|
+
<a name='L592'></a><a href='#L592'>592</a>
|
|
658
|
+
<a name='L593'></a><a href='#L593'>593</a>
|
|
659
|
+
<a name='L594'></a><a href='#L594'>594</a>
|
|
660
|
+
<a name='L595'></a><a href='#L595'>595</a>
|
|
661
|
+
<a name='L596'></a><a href='#L596'>596</a>
|
|
662
|
+
<a name='L597'></a><a href='#L597'>597</a>
|
|
663
|
+
<a name='L598'></a><a href='#L598'>598</a>
|
|
664
|
+
<a name='L599'></a><a href='#L599'>599</a>
|
|
665
|
+
<a name='L600'></a><a href='#L600'>600</a>
|
|
666
|
+
<a name='L601'></a><a href='#L601'>601</a>
|
|
667
|
+
<a name='L602'></a><a href='#L602'>602</a>
|
|
668
|
+
<a name='L603'></a><a href='#L603'>603</a>
|
|
669
|
+
<a name='L604'></a><a href='#L604'>604</a>
|
|
670
|
+
<a name='L605'></a><a href='#L605'>605</a>
|
|
671
|
+
<a name='L606'></a><a href='#L606'>606</a>
|
|
672
|
+
<a name='L607'></a><a href='#L607'>607</a>
|
|
673
|
+
<a name='L608'></a><a href='#L608'>608</a>
|
|
674
|
+
<a name='L609'></a><a href='#L609'>609</a>
|
|
675
|
+
<a name='L610'></a><a href='#L610'>610</a>
|
|
676
|
+
<a name='L611'></a><a href='#L611'>611</a>
|
|
677
|
+
<a name='L612'></a><a href='#L612'>612</a>
|
|
678
|
+
<a name='L613'></a><a href='#L613'>613</a>
|
|
679
|
+
<a name='L614'></a><a href='#L614'>614</a>
|
|
680
|
+
<a name='L615'></a><a href='#L615'>615</a>
|
|
681
|
+
<a name='L616'></a><a href='#L616'>616</a>
|
|
682
|
+
<a name='L617'></a><a href='#L617'>617</a>
|
|
683
|
+
<a name='L618'></a><a href='#L618'>618</a>
|
|
684
|
+
<a name='L619'></a><a href='#L619'>619</a>
|
|
685
|
+
<a name='L620'></a><a href='#L620'>620</a>
|
|
686
|
+
<a name='L621'></a><a href='#L621'>621</a>
|
|
687
|
+
<a name='L622'></a><a href='#L622'>622</a>
|
|
688
|
+
<a name='L623'></a><a href='#L623'>623</a>
|
|
689
|
+
<a name='L624'></a><a href='#L624'>624</a>
|
|
690
|
+
<a name='L625'></a><a href='#L625'>625</a>
|
|
691
|
+
<a name='L626'></a><a href='#L626'>626</a>
|
|
692
|
+
<a name='L627'></a><a href='#L627'>627</a>
|
|
693
|
+
<a name='L628'></a><a href='#L628'>628</a>
|
|
694
|
+
<a name='L629'></a><a href='#L629'>629</a>
|
|
695
|
+
<a name='L630'></a><a href='#L630'>630</a>
|
|
696
|
+
<a name='L631'></a><a href='#L631'>631</a>
|
|
697
|
+
<a name='L632'></a><a href='#L632'>632</a>
|
|
698
|
+
<a name='L633'></a><a href='#L633'>633</a>
|
|
699
|
+
<a name='L634'></a><a href='#L634'>634</a>
|
|
700
|
+
<a name='L635'></a><a href='#L635'>635</a>
|
|
701
|
+
<a name='L636'></a><a href='#L636'>636</a>
|
|
702
|
+
<a name='L637'></a><a href='#L637'>637</a>
|
|
703
|
+
<a name='L638'></a><a href='#L638'>638</a>
|
|
704
|
+
<a name='L639'></a><a href='#L639'>639</a>
|
|
705
|
+
<a name='L640'></a><a href='#L640'>640</a>
|
|
706
|
+
<a name='L641'></a><a href='#L641'>641</a>
|
|
707
|
+
<a name='L642'></a><a href='#L642'>642</a>
|
|
708
|
+
<a name='L643'></a><a href='#L643'>643</a>
|
|
709
|
+
<a name='L644'></a><a href='#L644'>644</a>
|
|
710
|
+
<a name='L645'></a><a href='#L645'>645</a>
|
|
711
|
+
<a name='L646'></a><a href='#L646'>646</a>
|
|
712
|
+
<a name='L647'></a><a href='#L647'>647</a>
|
|
713
|
+
<a name='L648'></a><a href='#L648'>648</a>
|
|
714
|
+
<a name='L649'></a><a href='#L649'>649</a>
|
|
715
|
+
<a name='L650'></a><a href='#L650'>650</a>
|
|
716
|
+
<a name='L651'></a><a href='#L651'>651</a>
|
|
717
|
+
<a name='L652'></a><a href='#L652'>652</a>
|
|
718
|
+
<a name='L653'></a><a href='#L653'>653</a>
|
|
719
|
+
<a name='L654'></a><a href='#L654'>654</a>
|
|
720
|
+
<a name='L655'></a><a href='#L655'>655</a>
|
|
721
|
+
<a name='L656'></a><a href='#L656'>656</a>
|
|
722
|
+
<a name='L657'></a><a href='#L657'>657</a>
|
|
723
|
+
<a name='L658'></a><a href='#L658'>658</a>
|
|
724
|
+
<a name='L659'></a><a href='#L659'>659</a>
|
|
725
|
+
<a name='L660'></a><a href='#L660'>660</a>
|
|
726
|
+
<a name='L661'></a><a href='#L661'>661</a>
|
|
727
|
+
<a name='L662'></a><a href='#L662'>662</a>
|
|
728
|
+
<a name='L663'></a><a href='#L663'>663</a>
|
|
729
|
+
<a name='L664'></a><a href='#L664'>664</a>
|
|
730
|
+
<a name='L665'></a><a href='#L665'>665</a>
|
|
731
|
+
<a name='L666'></a><a href='#L666'>666</a>
|
|
732
|
+
<a name='L667'></a><a href='#L667'>667</a>
|
|
733
|
+
<a name='L668'></a><a href='#L668'>668</a>
|
|
734
|
+
<a name='L669'></a><a href='#L669'>669</a>
|
|
735
|
+
<a name='L670'></a><a href='#L670'>670</a>
|
|
736
|
+
<a name='L671'></a><a href='#L671'>671</a>
|
|
737
|
+
<a name='L672'></a><a href='#L672'>672</a>
|
|
738
|
+
<a name='L673'></a><a href='#L673'>673</a>
|
|
739
|
+
<a name='L674'></a><a href='#L674'>674</a>
|
|
740
|
+
<a name='L675'></a><a href='#L675'>675</a>
|
|
741
|
+
<a name='L676'></a><a href='#L676'>676</a>
|
|
742
|
+
<a name='L677'></a><a href='#L677'>677</a>
|
|
743
|
+
<a name='L678'></a><a href='#L678'>678</a>
|
|
744
|
+
<a name='L679'></a><a href='#L679'>679</a>
|
|
745
|
+
<a name='L680'></a><a href='#L680'>680</a>
|
|
746
|
+
<a name='L681'></a><a href='#L681'>681</a>
|
|
747
|
+
<a name='L682'></a><a href='#L682'>682</a>
|
|
748
|
+
<a name='L683'></a><a href='#L683'>683</a>
|
|
749
|
+
<a name='L684'></a><a href='#L684'>684</a>
|
|
750
|
+
<a name='L685'></a><a href='#L685'>685</a>
|
|
751
|
+
<a name='L686'></a><a href='#L686'>686</a>
|
|
752
|
+
<a name='L687'></a><a href='#L687'>687</a>
|
|
753
|
+
<a name='L688'></a><a href='#L688'>688</a>
|
|
754
|
+
<a name='L689'></a><a href='#L689'>689</a>
|
|
755
|
+
<a name='L690'></a><a href='#L690'>690</a>
|
|
756
|
+
<a name='L691'></a><a href='#L691'>691</a>
|
|
757
|
+
<a name='L692'></a><a href='#L692'>692</a>
|
|
758
|
+
<a name='L693'></a><a href='#L693'>693</a>
|
|
759
|
+
<a name='L694'></a><a href='#L694'>694</a>
|
|
760
|
+
<a name='L695'></a><a href='#L695'>695</a>
|
|
761
|
+
<a name='L696'></a><a href='#L696'>696</a>
|
|
762
|
+
<a name='L697'></a><a href='#L697'>697</a>
|
|
763
|
+
<a name='L698'></a><a href='#L698'>698</a>
|
|
764
|
+
<a name='L699'></a><a href='#L699'>699</a>
|
|
765
|
+
<a name='L700'></a><a href='#L700'>700</a>
|
|
766
|
+
<a name='L701'></a><a href='#L701'>701</a>
|
|
767
|
+
<a name='L702'></a><a href='#L702'>702</a>
|
|
768
|
+
<a name='L703'></a><a href='#L703'>703</a>
|
|
769
|
+
<a name='L704'></a><a href='#L704'>704</a>
|
|
770
|
+
<a name='L705'></a><a href='#L705'>705</a>
|
|
771
|
+
<a name='L706'></a><a href='#L706'>706</a>
|
|
772
|
+
<a name='L707'></a><a href='#L707'>707</a>
|
|
773
|
+
<a name='L708'></a><a href='#L708'>708</a>
|
|
774
|
+
<a name='L709'></a><a href='#L709'>709</a>
|
|
775
|
+
<a name='L710'></a><a href='#L710'>710</a>
|
|
776
|
+
<a name='L711'></a><a href='#L711'>711</a>
|
|
777
|
+
<a name='L712'></a><a href='#L712'>712</a>
|
|
778
|
+
<a name='L713'></a><a href='#L713'>713</a>
|
|
779
|
+
<a name='L714'></a><a href='#L714'>714</a>
|
|
780
|
+
<a name='L715'></a><a href='#L715'>715</a>
|
|
781
|
+
<a name='L716'></a><a href='#L716'>716</a>
|
|
782
|
+
<a name='L717'></a><a href='#L717'>717</a>
|
|
783
|
+
<a name='L718'></a><a href='#L718'>718</a>
|
|
784
|
+
<a name='L719'></a><a href='#L719'>719</a>
|
|
785
|
+
<a name='L720'></a><a href='#L720'>720</a>
|
|
786
|
+
<a name='L721'></a><a href='#L721'>721</a>
|
|
787
|
+
<a name='L722'></a><a href='#L722'>722</a>
|
|
788
|
+
<a name='L723'></a><a href='#L723'>723</a>
|
|
789
|
+
<a name='L724'></a><a href='#L724'>724</a>
|
|
790
|
+
<a name='L725'></a><a href='#L725'>725</a>
|
|
791
|
+
<a name='L726'></a><a href='#L726'>726</a>
|
|
792
|
+
<a name='L727'></a><a href='#L727'>727</a>
|
|
793
|
+
<a name='L728'></a><a href='#L728'>728</a>
|
|
794
|
+
<a name='L729'></a><a href='#L729'>729</a>
|
|
795
|
+
<a name='L730'></a><a href='#L730'>730</a>
|
|
796
|
+
<a name='L731'></a><a href='#L731'>731</a>
|
|
797
|
+
<a name='L732'></a><a href='#L732'>732</a>
|
|
798
|
+
<a name='L733'></a><a href='#L733'>733</a>
|
|
799
|
+
<a name='L734'></a><a href='#L734'>734</a>
|
|
800
|
+
<a name='L735'></a><a href='#L735'>735</a>
|
|
801
|
+
<a name='L736'></a><a href='#L736'>736</a>
|
|
802
|
+
<a name='L737'></a><a href='#L737'>737</a>
|
|
803
|
+
<a name='L738'></a><a href='#L738'>738</a>
|
|
804
|
+
<a name='L739'></a><a href='#L739'>739</a>
|
|
805
|
+
<a name='L740'></a><a href='#L740'>740</a>
|
|
806
|
+
<a name='L741'></a><a href='#L741'>741</a>
|
|
807
|
+
<a name='L742'></a><a href='#L742'>742</a>
|
|
808
|
+
<a name='L743'></a><a href='#L743'>743</a>
|
|
809
|
+
<a name='L744'></a><a href='#L744'>744</a>
|
|
810
|
+
<a name='L745'></a><a href='#L745'>745</a>
|
|
811
|
+
<a name='L746'></a><a href='#L746'>746</a>
|
|
812
|
+
<a name='L747'></a><a href='#L747'>747</a>
|
|
813
|
+
<a name='L748'></a><a href='#L748'>748</a>
|
|
814
|
+
<a name='L749'></a><a href='#L749'>749</a>
|
|
815
|
+
<a name='L750'></a><a href='#L750'>750</a>
|
|
816
|
+
<a name='L751'></a><a href='#L751'>751</a>
|
|
817
|
+
<a name='L752'></a><a href='#L752'>752</a>
|
|
818
|
+
<a name='L753'></a><a href='#L753'>753</a>
|
|
819
|
+
<a name='L754'></a><a href='#L754'>754</a>
|
|
820
|
+
<a name='L755'></a><a href='#L755'>755</a>
|
|
821
|
+
<a name='L756'></a><a href='#L756'>756</a>
|
|
822
|
+
<a name='L757'></a><a href='#L757'>757</a>
|
|
823
|
+
<a name='L758'></a><a href='#L758'>758</a>
|
|
824
|
+
<a name='L759'></a><a href='#L759'>759</a>
|
|
825
|
+
<a name='L760'></a><a href='#L760'>760</a>
|
|
826
|
+
<a name='L761'></a><a href='#L761'>761</a>
|
|
827
|
+
<a name='L762'></a><a href='#L762'>762</a>
|
|
828
|
+
<a name='L763'></a><a href='#L763'>763</a>
|
|
829
|
+
<a name='L764'></a><a href='#L764'>764</a>
|
|
830
|
+
<a name='L765'></a><a href='#L765'>765</a>
|
|
831
|
+
<a name='L766'></a><a href='#L766'>766</a>
|
|
832
|
+
<a name='L767'></a><a href='#L767'>767</a>
|
|
833
|
+
<a name='L768'></a><a href='#L768'>768</a>
|
|
834
|
+
<a name='L769'></a><a href='#L769'>769</a>
|
|
835
|
+
<a name='L770'></a><a href='#L770'>770</a>
|
|
836
|
+
<a name='L771'></a><a href='#L771'>771</a>
|
|
837
|
+
<a name='L772'></a><a href='#L772'>772</a>
|
|
838
|
+
<a name='L773'></a><a href='#L773'>773</a>
|
|
839
|
+
<a name='L774'></a><a href='#L774'>774</a>
|
|
840
|
+
<a name='L775'></a><a href='#L775'>775</a>
|
|
841
|
+
<a name='L776'></a><a href='#L776'>776</a>
|
|
842
|
+
<a name='L777'></a><a href='#L777'>777</a>
|
|
843
|
+
<a name='L778'></a><a href='#L778'>778</a>
|
|
844
|
+
<a name='L779'></a><a href='#L779'>779</a>
|
|
845
|
+
<a name='L780'></a><a href='#L780'>780</a>
|
|
846
|
+
<a name='L781'></a><a href='#L781'>781</a>
|
|
847
|
+
<a name='L782'></a><a href='#L782'>782</a>
|
|
848
|
+
<a name='L783'></a><a href='#L783'>783</a>
|
|
849
|
+
<a name='L784'></a><a href='#L784'>784</a>
|
|
850
|
+
<a name='L785'></a><a href='#L785'>785</a>
|
|
851
|
+
<a name='L786'></a><a href='#L786'>786</a>
|
|
852
|
+
<a name='L787'></a><a href='#L787'>787</a>
|
|
853
|
+
<a name='L788'></a><a href='#L788'>788</a>
|
|
854
|
+
<a name='L789'></a><a href='#L789'>789</a>
|
|
855
|
+
<a name='L790'></a><a href='#L790'>790</a>
|
|
856
|
+
<a name='L791'></a><a href='#L791'>791</a>
|
|
857
|
+
<a name='L792'></a><a href='#L792'>792</a>
|
|
858
|
+
<a name='L793'></a><a href='#L793'>793</a>
|
|
859
|
+
<a name='L794'></a><a href='#L794'>794</a>
|
|
860
|
+
<a name='L795'></a><a href='#L795'>795</a>
|
|
861
|
+
<a name='L796'></a><a href='#L796'>796</a>
|
|
862
|
+
<a name='L797'></a><a href='#L797'>797</a>
|
|
863
|
+
<a name='L798'></a><a href='#L798'>798</a>
|
|
864
|
+
<a name='L799'></a><a href='#L799'>799</a>
|
|
865
|
+
<a name='L800'></a><a href='#L800'>800</a>
|
|
866
|
+
<a name='L801'></a><a href='#L801'>801</a>
|
|
867
|
+
<a name='L802'></a><a href='#L802'>802</a>
|
|
868
|
+
<a name='L803'></a><a href='#L803'>803</a>
|
|
869
|
+
<a name='L804'></a><a href='#L804'>804</a>
|
|
870
|
+
<a name='L805'></a><a href='#L805'>805</a>
|
|
871
|
+
<a name='L806'></a><a href='#L806'>806</a>
|
|
872
|
+
<a name='L807'></a><a href='#L807'>807</a>
|
|
873
|
+
<a name='L808'></a><a href='#L808'>808</a>
|
|
874
|
+
<a name='L809'></a><a href='#L809'>809</a>
|
|
875
|
+
<a name='L810'></a><a href='#L810'>810</a>
|
|
876
|
+
<a name='L811'></a><a href='#L811'>811</a>
|
|
877
|
+
<a name='L812'></a><a href='#L812'>812</a>
|
|
878
|
+
<a name='L813'></a><a href='#L813'>813</a>
|
|
879
|
+
<a name='L814'></a><a href='#L814'>814</a>
|
|
880
|
+
<a name='L815'></a><a href='#L815'>815</a>
|
|
881
|
+
<a name='L816'></a><a href='#L816'>816</a>
|
|
882
|
+
<a name='L817'></a><a href='#L817'>817</a>
|
|
883
|
+
<a name='L818'></a><a href='#L818'>818</a>
|
|
884
|
+
<a name='L819'></a><a href='#L819'>819</a>
|
|
885
|
+
<a name='L820'></a><a href='#L820'>820</a>
|
|
886
|
+
<a name='L821'></a><a href='#L821'>821</a>
|
|
887
|
+
<a name='L822'></a><a href='#L822'>822</a>
|
|
888
|
+
<a name='L823'></a><a href='#L823'>823</a>
|
|
889
|
+
<a name='L824'></a><a href='#L824'>824</a>
|
|
890
|
+
<a name='L825'></a><a href='#L825'>825</a>
|
|
891
|
+
<a name='L826'></a><a href='#L826'>826</a>
|
|
892
|
+
<a name='L827'></a><a href='#L827'>827</a>
|
|
893
|
+
<a name='L828'></a><a href='#L828'>828</a>
|
|
894
|
+
<a name='L829'></a><a href='#L829'>829</a>
|
|
895
|
+
<a name='L830'></a><a href='#L830'>830</a>
|
|
896
|
+
<a name='L831'></a><a href='#L831'>831</a>
|
|
897
|
+
<a name='L832'></a><a href='#L832'>832</a>
|
|
898
|
+
<a name='L833'></a><a href='#L833'>833</a>
|
|
899
|
+
<a name='L834'></a><a href='#L834'>834</a>
|
|
900
|
+
<a name='L835'></a><a href='#L835'>835</a>
|
|
901
|
+
<a name='L836'></a><a href='#L836'>836</a>
|
|
902
|
+
<a name='L837'></a><a href='#L837'>837</a>
|
|
903
|
+
<a name='L838'></a><a href='#L838'>838</a>
|
|
904
|
+
<a name='L839'></a><a href='#L839'>839</a>
|
|
905
|
+
<a name='L840'></a><a href='#L840'>840</a>
|
|
906
|
+
<a name='L841'></a><a href='#L841'>841</a>
|
|
907
|
+
<a name='L842'></a><a href='#L842'>842</a>
|
|
908
|
+
<a name='L843'></a><a href='#L843'>843</a>
|
|
909
|
+
<a name='L844'></a><a href='#L844'>844</a>
|
|
910
|
+
<a name='L845'></a><a href='#L845'>845</a>
|
|
911
|
+
<a name='L846'></a><a href='#L846'>846</a>
|
|
912
|
+
<a name='L847'></a><a href='#L847'>847</a>
|
|
913
|
+
<a name='L848'></a><a href='#L848'>848</a>
|
|
914
|
+
<a name='L849'></a><a href='#L849'>849</a>
|
|
915
|
+
<a name='L850'></a><a href='#L850'>850</a>
|
|
916
|
+
<a name='L851'></a><a href='#L851'>851</a>
|
|
917
|
+
<a name='L852'></a><a href='#L852'>852</a>
|
|
918
|
+
<a name='L853'></a><a href='#L853'>853</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
|
|
919
|
+
<span class="cline-any cline-yes">1x</span>
|
|
920
|
+
<span class="cline-any cline-yes">1x</span>
|
|
921
|
+
<span class="cline-any cline-yes">1x</span>
|
|
922
|
+
<span class="cline-any cline-yes">1x</span>
|
|
923
|
+
<span class="cline-any cline-yes">1x</span>
|
|
924
|
+
<span class="cline-any cline-yes">1x</span>
|
|
925
|
+
<span class="cline-any cline-yes">1x</span>
|
|
926
|
+
<span class="cline-any cline-yes">1x</span>
|
|
927
|
+
<span class="cline-any cline-yes">1x</span>
|
|
928
|
+
<span class="cline-any cline-yes">1x</span>
|
|
929
|
+
<span class="cline-any cline-yes">1x</span>
|
|
930
|
+
<span class="cline-any cline-yes">1x</span>
|
|
931
|
+
<span class="cline-any cline-yes">1x</span>
|
|
932
|
+
<span class="cline-any cline-yes">1x</span>
|
|
933
|
+
<span class="cline-any cline-yes">1x</span>
|
|
934
|
+
<span class="cline-any cline-yes">1x</span>
|
|
935
|
+
<span class="cline-any cline-yes">1x</span>
|
|
936
|
+
<span class="cline-any cline-yes">1x</span>
|
|
937
|
+
<span class="cline-any cline-yes">1x</span>
|
|
938
|
+
<span class="cline-any cline-yes">1x</span>
|
|
939
|
+
<span class="cline-any cline-yes">1x</span>
|
|
940
|
+
<span class="cline-any cline-yes">1x</span>
|
|
941
|
+
<span class="cline-any cline-yes">1x</span>
|
|
942
|
+
<span class="cline-any cline-yes">1x</span>
|
|
943
|
+
<span class="cline-any cline-yes">1x</span>
|
|
944
|
+
<span class="cline-any cline-yes">1x</span>
|
|
945
|
+
<span class="cline-any cline-yes">1x</span>
|
|
946
|
+
<span class="cline-any cline-yes">1x</span>
|
|
947
|
+
<span class="cline-any cline-yes">1x</span>
|
|
948
|
+
<span class="cline-any cline-yes">1x</span>
|
|
949
|
+
<span class="cline-any cline-yes">1x</span>
|
|
950
|
+
<span class="cline-any cline-yes">1x</span>
|
|
951
|
+
<span class="cline-any cline-yes">1x</span>
|
|
952
|
+
<span class="cline-any cline-yes">1x</span>
|
|
953
|
+
<span class="cline-any cline-yes">1x</span>
|
|
954
|
+
<span class="cline-any cline-yes">1x</span>
|
|
955
|
+
<span class="cline-any cline-yes">1x</span>
|
|
956
|
+
<span class="cline-any cline-yes">1x</span>
|
|
957
|
+
<span class="cline-any cline-yes">1x</span>
|
|
958
|
+
<span class="cline-any cline-yes">1x</span>
|
|
959
|
+
<span class="cline-any cline-yes">1x</span>
|
|
960
|
+
<span class="cline-any cline-yes">1x</span>
|
|
961
|
+
<span class="cline-any cline-yes">1x</span>
|
|
962
|
+
<span class="cline-any cline-yes">1x</span>
|
|
963
|
+
<span class="cline-any cline-yes">1x</span>
|
|
964
|
+
<span class="cline-any cline-yes">1x</span>
|
|
965
|
+
<span class="cline-any cline-yes">1x</span>
|
|
966
|
+
<span class="cline-any cline-yes">1x</span>
|
|
967
|
+
<span class="cline-any cline-yes">1x</span>
|
|
968
|
+
<span class="cline-any cline-yes">1x</span>
|
|
969
|
+
<span class="cline-any cline-yes">1x</span>
|
|
970
|
+
<span class="cline-any cline-yes">1x</span>
|
|
971
|
+
<span class="cline-any cline-yes">1x</span>
|
|
972
|
+
<span class="cline-any cline-yes">1x</span>
|
|
973
|
+
<span class="cline-any cline-yes">1x</span>
|
|
974
|
+
<span class="cline-any cline-yes">1x</span>
|
|
975
|
+
<span class="cline-any cline-yes">1x</span>
|
|
976
|
+
<span class="cline-any cline-yes">1x</span>
|
|
977
|
+
<span class="cline-any cline-yes">1x</span>
|
|
978
|
+
<span class="cline-any cline-yes">1x</span>
|
|
979
|
+
<span class="cline-any cline-yes">1x</span>
|
|
980
|
+
<span class="cline-any cline-yes">1x</span>
|
|
981
|
+
<span class="cline-any cline-yes">1x</span>
|
|
982
|
+
<span class="cline-any cline-yes">1x</span>
|
|
983
|
+
<span class="cline-any cline-yes">1x</span>
|
|
984
|
+
<span class="cline-any cline-yes">1x</span>
|
|
985
|
+
<span class="cline-any cline-yes">1x</span>
|
|
986
|
+
<span class="cline-any cline-yes">1x</span>
|
|
987
|
+
<span class="cline-any cline-yes">1x</span>
|
|
988
|
+
<span class="cline-any cline-yes">1x</span>
|
|
989
|
+
<span class="cline-any cline-yes">1x</span>
|
|
990
|
+
<span class="cline-any cline-yes">1x</span>
|
|
991
|
+
<span class="cline-any cline-yes">1x</span>
|
|
992
|
+
<span class="cline-any cline-yes">1x</span>
|
|
993
|
+
<span class="cline-any cline-yes">1x</span>
|
|
994
|
+
<span class="cline-any cline-yes">1x</span>
|
|
995
|
+
<span class="cline-any cline-yes">1x</span>
|
|
996
|
+
<span class="cline-any cline-yes">1x</span>
|
|
997
|
+
<span class="cline-any cline-yes">1x</span>
|
|
998
|
+
<span class="cline-any cline-yes">1x</span>
|
|
999
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1000
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1001
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1002
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1003
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1004
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1005
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1006
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1007
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1008
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1009
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1010
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1011
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1012
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1013
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1014
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1015
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1016
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1017
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1018
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1019
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1020
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1021
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1022
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1023
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1024
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1025
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1026
|
+
<span class="cline-any cline-no"> </span>
|
|
1027
|
+
<span class="cline-any cline-no"> </span>
|
|
1028
|
+
<span class="cline-any cline-no"> </span>
|
|
1029
|
+
<span class="cline-any cline-no"> </span>
|
|
1030
|
+
<span class="cline-any cline-no"> </span>
|
|
1031
|
+
<span class="cline-any cline-no"> </span>
|
|
1032
|
+
<span class="cline-any cline-no"> </span>
|
|
1033
|
+
<span class="cline-any cline-no"> </span>
|
|
1034
|
+
<span class="cline-any cline-no"> </span>
|
|
1035
|
+
<span class="cline-any cline-no"> </span>
|
|
1036
|
+
<span class="cline-any cline-no"> </span>
|
|
1037
|
+
<span class="cline-any cline-no"> </span>
|
|
1038
|
+
<span class="cline-any cline-no"> </span>
|
|
1039
|
+
<span class="cline-any cline-no"> </span>
|
|
1040
|
+
<span class="cline-any cline-no"> </span>
|
|
1041
|
+
<span class="cline-any cline-no"> </span>
|
|
1042
|
+
<span class="cline-any cline-no"> </span>
|
|
1043
|
+
<span class="cline-any cline-no"> </span>
|
|
1044
|
+
<span class="cline-any cline-no"> </span>
|
|
1045
|
+
<span class="cline-any cline-no"> </span>
|
|
1046
|
+
<span class="cline-any cline-no"> </span>
|
|
1047
|
+
<span class="cline-any cline-no"> </span>
|
|
1048
|
+
<span class="cline-any cline-no"> </span>
|
|
1049
|
+
<span class="cline-any cline-no"> </span>
|
|
1050
|
+
<span class="cline-any cline-no"> </span>
|
|
1051
|
+
<span class="cline-any cline-no"> </span>
|
|
1052
|
+
<span class="cline-any cline-no"> </span>
|
|
1053
|
+
<span class="cline-any cline-no"> </span>
|
|
1054
|
+
<span class="cline-any cline-no"> </span>
|
|
1055
|
+
<span class="cline-any cline-no"> </span>
|
|
1056
|
+
<span class="cline-any cline-no"> </span>
|
|
1057
|
+
<span class="cline-any cline-no"> </span>
|
|
1058
|
+
<span class="cline-any cline-no"> </span>
|
|
1059
|
+
<span class="cline-any cline-no"> </span>
|
|
1060
|
+
<span class="cline-any cline-no"> </span>
|
|
1061
|
+
<span class="cline-any cline-no"> </span>
|
|
1062
|
+
<span class="cline-any cline-no"> </span>
|
|
1063
|
+
<span class="cline-any cline-no"> </span>
|
|
1064
|
+
<span class="cline-any cline-no"> </span>
|
|
1065
|
+
<span class="cline-any cline-no"> </span>
|
|
1066
|
+
<span class="cline-any cline-no"> </span>
|
|
1067
|
+
<span class="cline-any cline-no"> </span>
|
|
1068
|
+
<span class="cline-any cline-no"> </span>
|
|
1069
|
+
<span class="cline-any cline-no"> </span>
|
|
1070
|
+
<span class="cline-any cline-no"> </span>
|
|
1071
|
+
<span class="cline-any cline-no"> </span>
|
|
1072
|
+
<span class="cline-any cline-no"> </span>
|
|
1073
|
+
<span class="cline-any cline-no"> </span>
|
|
1074
|
+
<span class="cline-any cline-no"> </span>
|
|
1075
|
+
<span class="cline-any cline-no"> </span>
|
|
1076
|
+
<span class="cline-any cline-no"> </span>
|
|
1077
|
+
<span class="cline-any cline-no"> </span>
|
|
1078
|
+
<span class="cline-any cline-no"> </span>
|
|
1079
|
+
<span class="cline-any cline-no"> </span>
|
|
1080
|
+
<span class="cline-any cline-no"> </span>
|
|
1081
|
+
<span class="cline-any cline-no"> </span>
|
|
1082
|
+
<span class="cline-any cline-no"> </span>
|
|
1083
|
+
<span class="cline-any cline-no"> </span>
|
|
1084
|
+
<span class="cline-any cline-no"> </span>
|
|
1085
|
+
<span class="cline-any cline-no"> </span>
|
|
1086
|
+
<span class="cline-any cline-no"> </span>
|
|
1087
|
+
<span class="cline-any cline-no"> </span>
|
|
1088
|
+
<span class="cline-any cline-no"> </span>
|
|
1089
|
+
<span class="cline-any cline-no"> </span>
|
|
1090
|
+
<span class="cline-any cline-no"> </span>
|
|
1091
|
+
<span class="cline-any cline-no"> </span>
|
|
1092
|
+
<span class="cline-any cline-no"> </span>
|
|
1093
|
+
<span class="cline-any cline-no"> </span>
|
|
1094
|
+
<span class="cline-any cline-no"> </span>
|
|
1095
|
+
<span class="cline-any cline-no"> </span>
|
|
1096
|
+
<span class="cline-any cline-no"> </span>
|
|
1097
|
+
<span class="cline-any cline-no"> </span>
|
|
1098
|
+
<span class="cline-any cline-no"> </span>
|
|
1099
|
+
<span class="cline-any cline-no"> </span>
|
|
1100
|
+
<span class="cline-any cline-no"> </span>
|
|
1101
|
+
<span class="cline-any cline-no"> </span>
|
|
1102
|
+
<span class="cline-any cline-no"> </span>
|
|
1103
|
+
<span class="cline-any cline-no"> </span>
|
|
1104
|
+
<span class="cline-any cline-no"> </span>
|
|
1105
|
+
<span class="cline-any cline-no"> </span>
|
|
1106
|
+
<span class="cline-any cline-no"> </span>
|
|
1107
|
+
<span class="cline-any cline-no"> </span>
|
|
1108
|
+
<span class="cline-any cline-no"> </span>
|
|
1109
|
+
<span class="cline-any cline-no"> </span>
|
|
1110
|
+
<span class="cline-any cline-no"> </span>
|
|
1111
|
+
<span class="cline-any cline-no"> </span>
|
|
1112
|
+
<span class="cline-any cline-no"> </span>
|
|
1113
|
+
<span class="cline-any cline-no"> </span>
|
|
1114
|
+
<span class="cline-any cline-no"> </span>
|
|
1115
|
+
<span class="cline-any cline-no"> </span>
|
|
1116
|
+
<span class="cline-any cline-no"> </span>
|
|
1117
|
+
<span class="cline-any cline-no"> </span>
|
|
1118
|
+
<span class="cline-any cline-no"> </span>
|
|
1119
|
+
<span class="cline-any cline-no"> </span>
|
|
1120
|
+
<span class="cline-any cline-no"> </span>
|
|
1121
|
+
<span class="cline-any cline-no"> </span>
|
|
1122
|
+
<span class="cline-any cline-no"> </span>
|
|
1123
|
+
<span class="cline-any cline-no"> </span>
|
|
1124
|
+
<span class="cline-any cline-no"> </span>
|
|
1125
|
+
<span class="cline-any cline-no"> </span>
|
|
1126
|
+
<span class="cline-any cline-no"> </span>
|
|
1127
|
+
<span class="cline-any cline-no"> </span>
|
|
1128
|
+
<span class="cline-any cline-no"> </span>
|
|
1129
|
+
<span class="cline-any cline-no"> </span>
|
|
1130
|
+
<span class="cline-any cline-no"> </span>
|
|
1131
|
+
<span class="cline-any cline-no"> </span>
|
|
1132
|
+
<span class="cline-any cline-no"> </span>
|
|
1133
|
+
<span class="cline-any cline-no"> </span>
|
|
1134
|
+
<span class="cline-any cline-no"> </span>
|
|
1135
|
+
<span class="cline-any cline-no"> </span>
|
|
1136
|
+
<span class="cline-any cline-no"> </span>
|
|
1137
|
+
<span class="cline-any cline-no"> </span>
|
|
1138
|
+
<span class="cline-any cline-no"> </span>
|
|
1139
|
+
<span class="cline-any cline-no"> </span>
|
|
1140
|
+
<span class="cline-any cline-no"> </span>
|
|
1141
|
+
<span class="cline-any cline-no"> </span>
|
|
1142
|
+
<span class="cline-any cline-no"> </span>
|
|
1143
|
+
<span class="cline-any cline-no"> </span>
|
|
1144
|
+
<span class="cline-any cline-no"> </span>
|
|
1145
|
+
<span class="cline-any cline-no"> </span>
|
|
1146
|
+
<span class="cline-any cline-no"> </span>
|
|
1147
|
+
<span class="cline-any cline-no"> </span>
|
|
1148
|
+
<span class="cline-any cline-no"> </span>
|
|
1149
|
+
<span class="cline-any cline-no"> </span>
|
|
1150
|
+
<span class="cline-any cline-no"> </span>
|
|
1151
|
+
<span class="cline-any cline-no"> </span>
|
|
1152
|
+
<span class="cline-any cline-no"> </span>
|
|
1153
|
+
<span class="cline-any cline-no"> </span>
|
|
1154
|
+
<span class="cline-any cline-no"> </span>
|
|
1155
|
+
<span class="cline-any cline-no"> </span>
|
|
1156
|
+
<span class="cline-any cline-no"> </span>
|
|
1157
|
+
<span class="cline-any cline-no"> </span>
|
|
1158
|
+
<span class="cline-any cline-no"> </span>
|
|
1159
|
+
<span class="cline-any cline-no"> </span>
|
|
1160
|
+
<span class="cline-any cline-no"> </span>
|
|
1161
|
+
<span class="cline-any cline-no"> </span>
|
|
1162
|
+
<span class="cline-any cline-no"> </span>
|
|
1163
|
+
<span class="cline-any cline-no"> </span>
|
|
1164
|
+
<span class="cline-any cline-no"> </span>
|
|
1165
|
+
<span class="cline-any cline-no"> </span>
|
|
1166
|
+
<span class="cline-any cline-no"> </span>
|
|
1167
|
+
<span class="cline-any cline-no"> </span>
|
|
1168
|
+
<span class="cline-any cline-no"> </span>
|
|
1169
|
+
<span class="cline-any cline-no"> </span>
|
|
1170
|
+
<span class="cline-any cline-no"> </span>
|
|
1171
|
+
<span class="cline-any cline-no"> </span>
|
|
1172
|
+
<span class="cline-any cline-no"> </span>
|
|
1173
|
+
<span class="cline-any cline-no"> </span>
|
|
1174
|
+
<span class="cline-any cline-no"> </span>
|
|
1175
|
+
<span class="cline-any cline-no"> </span>
|
|
1176
|
+
<span class="cline-any cline-no"> </span>
|
|
1177
|
+
<span class="cline-any cline-no"> </span>
|
|
1178
|
+
<span class="cline-any cline-no"> </span>
|
|
1179
|
+
<span class="cline-any cline-no"> </span>
|
|
1180
|
+
<span class="cline-any cline-no"> </span>
|
|
1181
|
+
<span class="cline-any cline-no"> </span>
|
|
1182
|
+
<span class="cline-any cline-no"> </span>
|
|
1183
|
+
<span class="cline-any cline-no"> </span>
|
|
1184
|
+
<span class="cline-any cline-no"> </span>
|
|
1185
|
+
<span class="cline-any cline-no"> </span>
|
|
1186
|
+
<span class="cline-any cline-no"> </span>
|
|
1187
|
+
<span class="cline-any cline-no"> </span>
|
|
1188
|
+
<span class="cline-any cline-no"> </span>
|
|
1189
|
+
<span class="cline-any cline-no"> </span>
|
|
1190
|
+
<span class="cline-any cline-no"> </span>
|
|
1191
|
+
<span class="cline-any cline-no"> </span>
|
|
1192
|
+
<span class="cline-any cline-no"> </span>
|
|
1193
|
+
<span class="cline-any cline-no"> </span>
|
|
1194
|
+
<span class="cline-any cline-no"> </span>
|
|
1195
|
+
<span class="cline-any cline-no"> </span>
|
|
1196
|
+
<span class="cline-any cline-no"> </span>
|
|
1197
|
+
<span class="cline-any cline-no"> </span>
|
|
1198
|
+
<span class="cline-any cline-no"> </span>
|
|
1199
|
+
<span class="cline-any cline-no"> </span>
|
|
1200
|
+
<span class="cline-any cline-no"> </span>
|
|
1201
|
+
<span class="cline-any cline-no"> </span>
|
|
1202
|
+
<span class="cline-any cline-no"> </span>
|
|
1203
|
+
<span class="cline-any cline-no"> </span>
|
|
1204
|
+
<span class="cline-any cline-no"> </span>
|
|
1205
|
+
<span class="cline-any cline-no"> </span>
|
|
1206
|
+
<span class="cline-any cline-no"> </span>
|
|
1207
|
+
<span class="cline-any cline-no"> </span>
|
|
1208
|
+
<span class="cline-any cline-no"> </span>
|
|
1209
|
+
<span class="cline-any cline-no"> </span>
|
|
1210
|
+
<span class="cline-any cline-no"> </span>
|
|
1211
|
+
<span class="cline-any cline-no"> </span>
|
|
1212
|
+
<span class="cline-any cline-no"> </span>
|
|
1213
|
+
<span class="cline-any cline-no"> </span>
|
|
1214
|
+
<span class="cline-any cline-no"> </span>
|
|
1215
|
+
<span class="cline-any cline-no"> </span>
|
|
1216
|
+
<span class="cline-any cline-no"> </span>
|
|
1217
|
+
<span class="cline-any cline-no"> </span>
|
|
1218
|
+
<span class="cline-any cline-no"> </span>
|
|
1219
|
+
<span class="cline-any cline-no"> </span>
|
|
1220
|
+
<span class="cline-any cline-no"> </span>
|
|
1221
|
+
<span class="cline-any cline-no"> </span>
|
|
1222
|
+
<span class="cline-any cline-no"> </span>
|
|
1223
|
+
<span class="cline-any cline-no"> </span>
|
|
1224
|
+
<span class="cline-any cline-no"> </span>
|
|
1225
|
+
<span class="cline-any cline-no"> </span>
|
|
1226
|
+
<span class="cline-any cline-no"> </span>
|
|
1227
|
+
<span class="cline-any cline-no"> </span>
|
|
1228
|
+
<span class="cline-any cline-no"> </span>
|
|
1229
|
+
<span class="cline-any cline-no"> </span>
|
|
1230
|
+
<span class="cline-any cline-no"> </span>
|
|
1231
|
+
<span class="cline-any cline-no"> </span>
|
|
1232
|
+
<span class="cline-any cline-no"> </span>
|
|
1233
|
+
<span class="cline-any cline-no"> </span>
|
|
1234
|
+
<span class="cline-any cline-no"> </span>
|
|
1235
|
+
<span class="cline-any cline-no"> </span>
|
|
1236
|
+
<span class="cline-any cline-no"> </span>
|
|
1237
|
+
<span class="cline-any cline-no"> </span>
|
|
1238
|
+
<span class="cline-any cline-no"> </span>
|
|
1239
|
+
<span class="cline-any cline-no"> </span>
|
|
1240
|
+
<span class="cline-any cline-no"> </span>
|
|
1241
|
+
<span class="cline-any cline-no"> </span>
|
|
1242
|
+
<span class="cline-any cline-no"> </span>
|
|
1243
|
+
<span class="cline-any cline-no"> </span>
|
|
1244
|
+
<span class="cline-any cline-no"> </span>
|
|
1245
|
+
<span class="cline-any cline-no"> </span>
|
|
1246
|
+
<span class="cline-any cline-no"> </span>
|
|
1247
|
+
<span class="cline-any cline-no"> </span>
|
|
1248
|
+
<span class="cline-any cline-no"> </span>
|
|
1249
|
+
<span class="cline-any cline-no"> </span>
|
|
1250
|
+
<span class="cline-any cline-no"> </span>
|
|
1251
|
+
<span class="cline-any cline-no"> </span>
|
|
1252
|
+
<span class="cline-any cline-no"> </span>
|
|
1253
|
+
<span class="cline-any cline-no"> </span>
|
|
1254
|
+
<span class="cline-any cline-no"> </span>
|
|
1255
|
+
<span class="cline-any cline-no"> </span>
|
|
1256
|
+
<span class="cline-any cline-no"> </span>
|
|
1257
|
+
<span class="cline-any cline-no"> </span>
|
|
1258
|
+
<span class="cline-any cline-no"> </span>
|
|
1259
|
+
<span class="cline-any cline-no"> </span>
|
|
1260
|
+
<span class="cline-any cline-no"> </span>
|
|
1261
|
+
<span class="cline-any cline-no"> </span>
|
|
1262
|
+
<span class="cline-any cline-no"> </span>
|
|
1263
|
+
<span class="cline-any cline-no"> </span>
|
|
1264
|
+
<span class="cline-any cline-no"> </span>
|
|
1265
|
+
<span class="cline-any cline-no"> </span>
|
|
1266
|
+
<span class="cline-any cline-no"> </span>
|
|
1267
|
+
<span class="cline-any cline-no"> </span>
|
|
1268
|
+
<span class="cline-any cline-no"> </span>
|
|
1269
|
+
<span class="cline-any cline-no"> </span>
|
|
1270
|
+
<span class="cline-any cline-no"> </span>
|
|
1271
|
+
<span class="cline-any cline-no"> </span>
|
|
1272
|
+
<span class="cline-any cline-no"> </span>
|
|
1273
|
+
<span class="cline-any cline-no"> </span>
|
|
1274
|
+
<span class="cline-any cline-no"> </span>
|
|
1275
|
+
<span class="cline-any cline-no"> </span>
|
|
1276
|
+
<span class="cline-any cline-no"> </span>
|
|
1277
|
+
<span class="cline-any cline-no"> </span>
|
|
1278
|
+
<span class="cline-any cline-no"> </span>
|
|
1279
|
+
<span class="cline-any cline-no"> </span>
|
|
1280
|
+
<span class="cline-any cline-no"> </span>
|
|
1281
|
+
<span class="cline-any cline-no"> </span>
|
|
1282
|
+
<span class="cline-any cline-no"> </span>
|
|
1283
|
+
<span class="cline-any cline-no"> </span>
|
|
1284
|
+
<span class="cline-any cline-no"> </span>
|
|
1285
|
+
<span class="cline-any cline-no"> </span>
|
|
1286
|
+
<span class="cline-any cline-no"> </span>
|
|
1287
|
+
<span class="cline-any cline-no"> </span>
|
|
1288
|
+
<span class="cline-any cline-no"> </span>
|
|
1289
|
+
<span class="cline-any cline-no"> </span>
|
|
1290
|
+
<span class="cline-any cline-no"> </span>
|
|
1291
|
+
<span class="cline-any cline-no"> </span>
|
|
1292
|
+
<span class="cline-any cline-no"> </span>
|
|
1293
|
+
<span class="cline-any cline-no"> </span>
|
|
1294
|
+
<span class="cline-any cline-no"> </span>
|
|
1295
|
+
<span class="cline-any cline-no"> </span>
|
|
1296
|
+
<span class="cline-any cline-no"> </span>
|
|
1297
|
+
<span class="cline-any cline-no"> </span>
|
|
1298
|
+
<span class="cline-any cline-no"> </span>
|
|
1299
|
+
<span class="cline-any cline-no"> </span>
|
|
1300
|
+
<span class="cline-any cline-no"> </span>
|
|
1301
|
+
<span class="cline-any cline-no"> </span>
|
|
1302
|
+
<span class="cline-any cline-no"> </span>
|
|
1303
|
+
<span class="cline-any cline-no"> </span>
|
|
1304
|
+
<span class="cline-any cline-no"> </span>
|
|
1305
|
+
<span class="cline-any cline-no"> </span>
|
|
1306
|
+
<span class="cline-any cline-no"> </span>
|
|
1307
|
+
<span class="cline-any cline-no"> </span>
|
|
1308
|
+
<span class="cline-any cline-no"> </span>
|
|
1309
|
+
<span class="cline-any cline-no"> </span>
|
|
1310
|
+
<span class="cline-any cline-no"> </span>
|
|
1311
|
+
<span class="cline-any cline-no"> </span>
|
|
1312
|
+
<span class="cline-any cline-no"> </span>
|
|
1313
|
+
<span class="cline-any cline-no"> </span>
|
|
1314
|
+
<span class="cline-any cline-no"> </span>
|
|
1315
|
+
<span class="cline-any cline-no"> </span>
|
|
1316
|
+
<span class="cline-any cline-no"> </span>
|
|
1317
|
+
<span class="cline-any cline-no"> </span>
|
|
1318
|
+
<span class="cline-any cline-no"> </span>
|
|
1319
|
+
<span class="cline-any cline-no"> </span>
|
|
1320
|
+
<span class="cline-any cline-no"> </span>
|
|
1321
|
+
<span class="cline-any cline-no"> </span>
|
|
1322
|
+
<span class="cline-any cline-no"> </span>
|
|
1323
|
+
<span class="cline-any cline-no"> </span>
|
|
1324
|
+
<span class="cline-any cline-no"> </span>
|
|
1325
|
+
<span class="cline-any cline-no"> </span>
|
|
1326
|
+
<span class="cline-any cline-no"> </span>
|
|
1327
|
+
<span class="cline-any cline-no"> </span>
|
|
1328
|
+
<span class="cline-any cline-no"> </span>
|
|
1329
|
+
<span class="cline-any cline-no"> </span>
|
|
1330
|
+
<span class="cline-any cline-no"> </span>
|
|
1331
|
+
<span class="cline-any cline-no"> </span>
|
|
1332
|
+
<span class="cline-any cline-no"> </span>
|
|
1333
|
+
<span class="cline-any cline-no"> </span>
|
|
1334
|
+
<span class="cline-any cline-no"> </span>
|
|
1335
|
+
<span class="cline-any cline-no"> </span>
|
|
1336
|
+
<span class="cline-any cline-no"> </span>
|
|
1337
|
+
<span class="cline-any cline-no"> </span>
|
|
1338
|
+
<span class="cline-any cline-no"> </span>
|
|
1339
|
+
<span class="cline-any cline-no"> </span>
|
|
1340
|
+
<span class="cline-any cline-no"> </span>
|
|
1341
|
+
<span class="cline-any cline-no"> </span>
|
|
1342
|
+
<span class="cline-any cline-no"> </span>
|
|
1343
|
+
<span class="cline-any cline-no"> </span>
|
|
1344
|
+
<span class="cline-any cline-no"> </span>
|
|
1345
|
+
<span class="cline-any cline-no"> </span>
|
|
1346
|
+
<span class="cline-any cline-no"> </span>
|
|
1347
|
+
<span class="cline-any cline-no"> </span>
|
|
1348
|
+
<span class="cline-any cline-no"> </span>
|
|
1349
|
+
<span class="cline-any cline-no"> </span>
|
|
1350
|
+
<span class="cline-any cline-no"> </span>
|
|
1351
|
+
<span class="cline-any cline-no"> </span>
|
|
1352
|
+
<span class="cline-any cline-no"> </span>
|
|
1353
|
+
<span class="cline-any cline-no"> </span>
|
|
1354
|
+
<span class="cline-any cline-no"> </span>
|
|
1355
|
+
<span class="cline-any cline-no"> </span>
|
|
1356
|
+
<span class="cline-any cline-no"> </span>
|
|
1357
|
+
<span class="cline-any cline-no"> </span>
|
|
1358
|
+
<span class="cline-any cline-no"> </span>
|
|
1359
|
+
<span class="cline-any cline-no"> </span>
|
|
1360
|
+
<span class="cline-any cline-no"> </span>
|
|
1361
|
+
<span class="cline-any cline-no"> </span>
|
|
1362
|
+
<span class="cline-any cline-no"> </span>
|
|
1363
|
+
<span class="cline-any cline-no"> </span>
|
|
1364
|
+
<span class="cline-any cline-no"> </span>
|
|
1365
|
+
<span class="cline-any cline-no"> </span>
|
|
1366
|
+
<span class="cline-any cline-no"> </span>
|
|
1367
|
+
<span class="cline-any cline-no"> </span>
|
|
1368
|
+
<span class="cline-any cline-no"> </span>
|
|
1369
|
+
<span class="cline-any cline-no"> </span>
|
|
1370
|
+
<span class="cline-any cline-no"> </span>
|
|
1371
|
+
<span class="cline-any cline-no"> </span>
|
|
1372
|
+
<span class="cline-any cline-no"> </span>
|
|
1373
|
+
<span class="cline-any cline-no"> </span>
|
|
1374
|
+
<span class="cline-any cline-no"> </span>
|
|
1375
|
+
<span class="cline-any cline-no"> </span>
|
|
1376
|
+
<span class="cline-any cline-no"> </span>
|
|
1377
|
+
<span class="cline-any cline-no"> </span>
|
|
1378
|
+
<span class="cline-any cline-no"> </span>
|
|
1379
|
+
<span class="cline-any cline-no"> </span>
|
|
1380
|
+
<span class="cline-any cline-no"> </span>
|
|
1381
|
+
<span class="cline-any cline-no"> </span>
|
|
1382
|
+
<span class="cline-any cline-no"> </span>
|
|
1383
|
+
<span class="cline-any cline-no"> </span>
|
|
1384
|
+
<span class="cline-any cline-no"> </span>
|
|
1385
|
+
<span class="cline-any cline-no"> </span>
|
|
1386
|
+
<span class="cline-any cline-no"> </span>
|
|
1387
|
+
<span class="cline-any cline-no"> </span>
|
|
1388
|
+
<span class="cline-any cline-no"> </span>
|
|
1389
|
+
<span class="cline-any cline-no"> </span>
|
|
1390
|
+
<span class="cline-any cline-no"> </span>
|
|
1391
|
+
<span class="cline-any cline-no"> </span>
|
|
1392
|
+
<span class="cline-any cline-no"> </span>
|
|
1393
|
+
<span class="cline-any cline-no"> </span>
|
|
1394
|
+
<span class="cline-any cline-no"> </span>
|
|
1395
|
+
<span class="cline-any cline-no"> </span>
|
|
1396
|
+
<span class="cline-any cline-no"> </span>
|
|
1397
|
+
<span class="cline-any cline-no"> </span>
|
|
1398
|
+
<span class="cline-any cline-no"> </span>
|
|
1399
|
+
<span class="cline-any cline-no"> </span>
|
|
1400
|
+
<span class="cline-any cline-no"> </span>
|
|
1401
|
+
<span class="cline-any cline-no"> </span>
|
|
1402
|
+
<span class="cline-any cline-no"> </span>
|
|
1403
|
+
<span class="cline-any cline-no"> </span>
|
|
1404
|
+
<span class="cline-any cline-no"> </span>
|
|
1405
|
+
<span class="cline-any cline-no"> </span>
|
|
1406
|
+
<span class="cline-any cline-no"> </span>
|
|
1407
|
+
<span class="cline-any cline-no"> </span>
|
|
1408
|
+
<span class="cline-any cline-no"> </span>
|
|
1409
|
+
<span class="cline-any cline-no"> </span>
|
|
1410
|
+
<span class="cline-any cline-no"> </span>
|
|
1411
|
+
<span class="cline-any cline-no"> </span>
|
|
1412
|
+
<span class="cline-any cline-no"> </span>
|
|
1413
|
+
<span class="cline-any cline-no"> </span>
|
|
1414
|
+
<span class="cline-any cline-no"> </span>
|
|
1415
|
+
<span class="cline-any cline-no"> </span>
|
|
1416
|
+
<span class="cline-any cline-no"> </span>
|
|
1417
|
+
<span class="cline-any cline-no"> </span>
|
|
1418
|
+
<span class="cline-any cline-no"> </span>
|
|
1419
|
+
<span class="cline-any cline-no"> </span>
|
|
1420
|
+
<span class="cline-any cline-no"> </span>
|
|
1421
|
+
<span class="cline-any cline-no"> </span>
|
|
1422
|
+
<span class="cline-any cline-no"> </span>
|
|
1423
|
+
<span class="cline-any cline-no"> </span>
|
|
1424
|
+
<span class="cline-any cline-no"> </span>
|
|
1425
|
+
<span class="cline-any cline-no"> </span>
|
|
1426
|
+
<span class="cline-any cline-no"> </span>
|
|
1427
|
+
<span class="cline-any cline-no"> </span>
|
|
1428
|
+
<span class="cline-any cline-no"> </span>
|
|
1429
|
+
<span class="cline-any cline-no"> </span>
|
|
1430
|
+
<span class="cline-any cline-no"> </span>
|
|
1431
|
+
<span class="cline-any cline-no"> </span>
|
|
1432
|
+
<span class="cline-any cline-no"> </span>
|
|
1433
|
+
<span class="cline-any cline-no"> </span>
|
|
1434
|
+
<span class="cline-any cline-no"> </span>
|
|
1435
|
+
<span class="cline-any cline-no"> </span>
|
|
1436
|
+
<span class="cline-any cline-no"> </span>
|
|
1437
|
+
<span class="cline-any cline-no"> </span>
|
|
1438
|
+
<span class="cline-any cline-no"> </span>
|
|
1439
|
+
<span class="cline-any cline-no"> </span>
|
|
1440
|
+
<span class="cline-any cline-no"> </span>
|
|
1441
|
+
<span class="cline-any cline-no"> </span>
|
|
1442
|
+
<span class="cline-any cline-no"> </span>
|
|
1443
|
+
<span class="cline-any cline-no"> </span>
|
|
1444
|
+
<span class="cline-any cline-no"> </span>
|
|
1445
|
+
<span class="cline-any cline-no"> </span>
|
|
1446
|
+
<span class="cline-any cline-no"> </span>
|
|
1447
|
+
<span class="cline-any cline-no"> </span>
|
|
1448
|
+
<span class="cline-any cline-no"> </span>
|
|
1449
|
+
<span class="cline-any cline-no"> </span>
|
|
1450
|
+
<span class="cline-any cline-no"> </span>
|
|
1451
|
+
<span class="cline-any cline-no"> </span>
|
|
1452
|
+
<span class="cline-any cline-no"> </span>
|
|
1453
|
+
<span class="cline-any cline-no"> </span>
|
|
1454
|
+
<span class="cline-any cline-no"> </span>
|
|
1455
|
+
<span class="cline-any cline-no"> </span>
|
|
1456
|
+
<span class="cline-any cline-no"> </span>
|
|
1457
|
+
<span class="cline-any cline-no"> </span>
|
|
1458
|
+
<span class="cline-any cline-no"> </span>
|
|
1459
|
+
<span class="cline-any cline-no"> </span>
|
|
1460
|
+
<span class="cline-any cline-no"> </span>
|
|
1461
|
+
<span class="cline-any cline-no"> </span>
|
|
1462
|
+
<span class="cline-any cline-no"> </span>
|
|
1463
|
+
<span class="cline-any cline-no"> </span>
|
|
1464
|
+
<span class="cline-any cline-no"> </span>
|
|
1465
|
+
<span class="cline-any cline-no"> </span>
|
|
1466
|
+
<span class="cline-any cline-no"> </span>
|
|
1467
|
+
<span class="cline-any cline-no"> </span>
|
|
1468
|
+
<span class="cline-any cline-no"> </span>
|
|
1469
|
+
<span class="cline-any cline-no"> </span>
|
|
1470
|
+
<span class="cline-any cline-no"> </span>
|
|
1471
|
+
<span class="cline-any cline-no"> </span>
|
|
1472
|
+
<span class="cline-any cline-no"> </span>
|
|
1473
|
+
<span class="cline-any cline-no"> </span>
|
|
1474
|
+
<span class="cline-any cline-no"> </span>
|
|
1475
|
+
<span class="cline-any cline-no"> </span>
|
|
1476
|
+
<span class="cline-any cline-no"> </span>
|
|
1477
|
+
<span class="cline-any cline-no"> </span>
|
|
1478
|
+
<span class="cline-any cline-no"> </span>
|
|
1479
|
+
<span class="cline-any cline-no"> </span>
|
|
1480
|
+
<span class="cline-any cline-no"> </span>
|
|
1481
|
+
<span class="cline-any cline-no"> </span>
|
|
1482
|
+
<span class="cline-any cline-no"> </span>
|
|
1483
|
+
<span class="cline-any cline-no"> </span>
|
|
1484
|
+
<span class="cline-any cline-no"> </span>
|
|
1485
|
+
<span class="cline-any cline-no"> </span>
|
|
1486
|
+
<span class="cline-any cline-no"> </span>
|
|
1487
|
+
<span class="cline-any cline-no"> </span>
|
|
1488
|
+
<span class="cline-any cline-no"> </span>
|
|
1489
|
+
<span class="cline-any cline-no"> </span>
|
|
1490
|
+
<span class="cline-any cline-no"> </span>
|
|
1491
|
+
<span class="cline-any cline-no"> </span>
|
|
1492
|
+
<span class="cline-any cline-no"> </span>
|
|
1493
|
+
<span class="cline-any cline-no"> </span>
|
|
1494
|
+
<span class="cline-any cline-no"> </span>
|
|
1495
|
+
<span class="cline-any cline-no"> </span>
|
|
1496
|
+
<span class="cline-any cline-no"> </span>
|
|
1497
|
+
<span class="cline-any cline-no"> </span>
|
|
1498
|
+
<span class="cline-any cline-no"> </span>
|
|
1499
|
+
<span class="cline-any cline-no"> </span>
|
|
1500
|
+
<span class="cline-any cline-no"> </span>
|
|
1501
|
+
<span class="cline-any cline-no"> </span>
|
|
1502
|
+
<span class="cline-any cline-no"> </span>
|
|
1503
|
+
<span class="cline-any cline-no"> </span>
|
|
1504
|
+
<span class="cline-any cline-no"> </span>
|
|
1505
|
+
<span class="cline-any cline-no"> </span>
|
|
1506
|
+
<span class="cline-any cline-no"> </span>
|
|
1507
|
+
<span class="cline-any cline-no"> </span>
|
|
1508
|
+
<span class="cline-any cline-no"> </span>
|
|
1509
|
+
<span class="cline-any cline-no"> </span>
|
|
1510
|
+
<span class="cline-any cline-no"> </span>
|
|
1511
|
+
<span class="cline-any cline-no"> </span>
|
|
1512
|
+
<span class="cline-any cline-no"> </span>
|
|
1513
|
+
<span class="cline-any cline-no"> </span>
|
|
1514
|
+
<span class="cline-any cline-no"> </span>
|
|
1515
|
+
<span class="cline-any cline-no"> </span>
|
|
1516
|
+
<span class="cline-any cline-no"> </span>
|
|
1517
|
+
<span class="cline-any cline-no"> </span>
|
|
1518
|
+
<span class="cline-any cline-no"> </span>
|
|
1519
|
+
<span class="cline-any cline-no"> </span>
|
|
1520
|
+
<span class="cline-any cline-no"> </span>
|
|
1521
|
+
<span class="cline-any cline-no"> </span>
|
|
1522
|
+
<span class="cline-any cline-no"> </span>
|
|
1523
|
+
<span class="cline-any cline-no"> </span>
|
|
1524
|
+
<span class="cline-any cline-no"> </span>
|
|
1525
|
+
<span class="cline-any cline-no"> </span>
|
|
1526
|
+
<span class="cline-any cline-no"> </span>
|
|
1527
|
+
<span class="cline-any cline-no"> </span>
|
|
1528
|
+
<span class="cline-any cline-no"> </span>
|
|
1529
|
+
<span class="cline-any cline-no"> </span>
|
|
1530
|
+
<span class="cline-any cline-no"> </span>
|
|
1531
|
+
<span class="cline-any cline-no"> </span>
|
|
1532
|
+
<span class="cline-any cline-no"> </span>
|
|
1533
|
+
<span class="cline-any cline-no"> </span>
|
|
1534
|
+
<span class="cline-any cline-no"> </span>
|
|
1535
|
+
<span class="cline-any cline-no"> </span>
|
|
1536
|
+
<span class="cline-any cline-no"> </span>
|
|
1537
|
+
<span class="cline-any cline-no"> </span>
|
|
1538
|
+
<span class="cline-any cline-no"> </span>
|
|
1539
|
+
<span class="cline-any cline-no"> </span>
|
|
1540
|
+
<span class="cline-any cline-no"> </span>
|
|
1541
|
+
<span class="cline-any cline-no"> </span>
|
|
1542
|
+
<span class="cline-any cline-no"> </span>
|
|
1543
|
+
<span class="cline-any cline-no"> </span>
|
|
1544
|
+
<span class="cline-any cline-no"> </span>
|
|
1545
|
+
<span class="cline-any cline-no"> </span>
|
|
1546
|
+
<span class="cline-any cline-no"> </span>
|
|
1547
|
+
<span class="cline-any cline-no"> </span>
|
|
1548
|
+
<span class="cline-any cline-no"> </span>
|
|
1549
|
+
<span class="cline-any cline-no"> </span>
|
|
1550
|
+
<span class="cline-any cline-no"> </span>
|
|
1551
|
+
<span class="cline-any cline-no"> </span>
|
|
1552
|
+
<span class="cline-any cline-no"> </span>
|
|
1553
|
+
<span class="cline-any cline-no"> </span>
|
|
1554
|
+
<span class="cline-any cline-no"> </span>
|
|
1555
|
+
<span class="cline-any cline-no"> </span>
|
|
1556
|
+
<span class="cline-any cline-no"> </span>
|
|
1557
|
+
<span class="cline-any cline-no"> </span>
|
|
1558
|
+
<span class="cline-any cline-no"> </span>
|
|
1559
|
+
<span class="cline-any cline-no"> </span>
|
|
1560
|
+
<span class="cline-any cline-no"> </span>
|
|
1561
|
+
<span class="cline-any cline-no"> </span>
|
|
1562
|
+
<span class="cline-any cline-no"> </span>
|
|
1563
|
+
<span class="cline-any cline-no"> </span>
|
|
1564
|
+
<span class="cline-any cline-no"> </span>
|
|
1565
|
+
<span class="cline-any cline-no"> </span>
|
|
1566
|
+
<span class="cline-any cline-no"> </span>
|
|
1567
|
+
<span class="cline-any cline-no"> </span>
|
|
1568
|
+
<span class="cline-any cline-no"> </span>
|
|
1569
|
+
<span class="cline-any cline-no"> </span>
|
|
1570
|
+
<span class="cline-any cline-no"> </span>
|
|
1571
|
+
<span class="cline-any cline-no"> </span>
|
|
1572
|
+
<span class="cline-any cline-no"> </span>
|
|
1573
|
+
<span class="cline-any cline-no"> </span>
|
|
1574
|
+
<span class="cline-any cline-no"> </span>
|
|
1575
|
+
<span class="cline-any cline-no"> </span>
|
|
1576
|
+
<span class="cline-any cline-no"> </span>
|
|
1577
|
+
<span class="cline-any cline-no"> </span>
|
|
1578
|
+
<span class="cline-any cline-no"> </span>
|
|
1579
|
+
<span class="cline-any cline-no"> </span>
|
|
1580
|
+
<span class="cline-any cline-no"> </span>
|
|
1581
|
+
<span class="cline-any cline-no"> </span>
|
|
1582
|
+
<span class="cline-any cline-no"> </span>
|
|
1583
|
+
<span class="cline-any cline-no"> </span>
|
|
1584
|
+
<span class="cline-any cline-no"> </span>
|
|
1585
|
+
<span class="cline-any cline-no"> </span>
|
|
1586
|
+
<span class="cline-any cline-no"> </span>
|
|
1587
|
+
<span class="cline-any cline-no"> </span>
|
|
1588
|
+
<span class="cline-any cline-no"> </span>
|
|
1589
|
+
<span class="cline-any cline-no"> </span>
|
|
1590
|
+
<span class="cline-any cline-no"> </span>
|
|
1591
|
+
<span class="cline-any cline-no"> </span>
|
|
1592
|
+
<span class="cline-any cline-no"> </span>
|
|
1593
|
+
<span class="cline-any cline-no"> </span>
|
|
1594
|
+
<span class="cline-any cline-no"> </span>
|
|
1595
|
+
<span class="cline-any cline-no"> </span>
|
|
1596
|
+
<span class="cline-any cline-no"> </span>
|
|
1597
|
+
<span class="cline-any cline-no"> </span>
|
|
1598
|
+
<span class="cline-any cline-no"> </span>
|
|
1599
|
+
<span class="cline-any cline-no"> </span>
|
|
1600
|
+
<span class="cline-any cline-no"> </span>
|
|
1601
|
+
<span class="cline-any cline-no"> </span>
|
|
1602
|
+
<span class="cline-any cline-no"> </span>
|
|
1603
|
+
<span class="cline-any cline-no"> </span>
|
|
1604
|
+
<span class="cline-any cline-no"> </span>
|
|
1605
|
+
<span class="cline-any cline-no"> </span>
|
|
1606
|
+
<span class="cline-any cline-no"> </span>
|
|
1607
|
+
<span class="cline-any cline-no"> </span>
|
|
1608
|
+
<span class="cline-any cline-no"> </span>
|
|
1609
|
+
<span class="cline-any cline-no"> </span>
|
|
1610
|
+
<span class="cline-any cline-no"> </span>
|
|
1611
|
+
<span class="cline-any cline-no"> </span>
|
|
1612
|
+
<span class="cline-any cline-no"> </span>
|
|
1613
|
+
<span class="cline-any cline-no"> </span>
|
|
1614
|
+
<span class="cline-any cline-no"> </span>
|
|
1615
|
+
<span class="cline-any cline-no"> </span>
|
|
1616
|
+
<span class="cline-any cline-no"> </span>
|
|
1617
|
+
<span class="cline-any cline-no"> </span>
|
|
1618
|
+
<span class="cline-any cline-no"> </span>
|
|
1619
|
+
<span class="cline-any cline-no"> </span>
|
|
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-no"> </span>
|
|
1628
|
+
<span class="cline-any cline-no"> </span>
|
|
1629
|
+
<span class="cline-any cline-no"> </span>
|
|
1630
|
+
<span class="cline-any cline-no"> </span>
|
|
1631
|
+
<span class="cline-any cline-no"> </span>
|
|
1632
|
+
<span class="cline-any cline-no"> </span>
|
|
1633
|
+
<span class="cline-any cline-no"> </span>
|
|
1634
|
+
<span class="cline-any cline-no"> </span>
|
|
1635
|
+
<span class="cline-any cline-no"> </span>
|
|
1636
|
+
<span class="cline-any cline-no"> </span>
|
|
1637
|
+
<span class="cline-any cline-no"> </span>
|
|
1638
|
+
<span class="cline-any cline-no"> </span>
|
|
1639
|
+
<span class="cline-any cline-no"> </span>
|
|
1640
|
+
<span class="cline-any cline-no"> </span>
|
|
1641
|
+
<span class="cline-any cline-no"> </span>
|
|
1642
|
+
<span class="cline-any cline-no"> </span>
|
|
1643
|
+
<span class="cline-any cline-no"> </span>
|
|
1644
|
+
<span class="cline-any cline-no"> </span>
|
|
1645
|
+
<span class="cline-any cline-no"> </span>
|
|
1646
|
+
<span class="cline-any cline-no"> </span>
|
|
1647
|
+
<span class="cline-any cline-no"> </span>
|
|
1648
|
+
<span class="cline-any cline-no"> </span>
|
|
1649
|
+
<span class="cline-any cline-no"> </span>
|
|
1650
|
+
<span class="cline-any cline-no"> </span>
|
|
1651
|
+
<span class="cline-any cline-no"> </span>
|
|
1652
|
+
<span class="cline-any cline-no"> </span>
|
|
1653
|
+
<span class="cline-any cline-no"> </span>
|
|
1654
|
+
<span class="cline-any cline-no"> </span>
|
|
1655
|
+
<span class="cline-any cline-no"> </span>
|
|
1656
|
+
<span class="cline-any cline-no"> </span>
|
|
1657
|
+
<span class="cline-any cline-no"> </span>
|
|
1658
|
+
<span class="cline-any cline-no"> </span>
|
|
1659
|
+
<span class="cline-any cline-no"> </span>
|
|
1660
|
+
<span class="cline-any cline-no"> </span>
|
|
1661
|
+
<span class="cline-any cline-no"> </span>
|
|
1662
|
+
<span class="cline-any cline-no"> </span>
|
|
1663
|
+
<span class="cline-any cline-no"> </span>
|
|
1664
|
+
<span class="cline-any cline-no"> </span>
|
|
1665
|
+
<span class="cline-any cline-no"> </span>
|
|
1666
|
+
<span class="cline-any cline-no"> </span>
|
|
1667
|
+
<span class="cline-any cline-no"> </span>
|
|
1668
|
+
<span class="cline-any cline-no"> </span>
|
|
1669
|
+
<span class="cline-any cline-no"> </span>
|
|
1670
|
+
<span class="cline-any cline-no"> </span>
|
|
1671
|
+
<span class="cline-any cline-no"> </span>
|
|
1672
|
+
<span class="cline-any cline-no"> </span>
|
|
1673
|
+
<span class="cline-any cline-no"> </span>
|
|
1674
|
+
<span class="cline-any cline-no"> </span>
|
|
1675
|
+
<span class="cline-any cline-no"> </span>
|
|
1676
|
+
<span class="cline-any cline-no"> </span>
|
|
1677
|
+
<span class="cline-any cline-no"> </span>
|
|
1678
|
+
<span class="cline-any cline-no"> </span>
|
|
1679
|
+
<span class="cline-any cline-no"> </span>
|
|
1680
|
+
<span class="cline-any cline-no"> </span>
|
|
1681
|
+
<span class="cline-any cline-no"> </span>
|
|
1682
|
+
<span class="cline-any cline-no"> </span>
|
|
1683
|
+
<span class="cline-any cline-no"> </span>
|
|
1684
|
+
<span class="cline-any cline-no"> </span>
|
|
1685
|
+
<span class="cline-any cline-no"> </span>
|
|
1686
|
+
<span class="cline-any cline-no"> </span>
|
|
1687
|
+
<span class="cline-any cline-no"> </span>
|
|
1688
|
+
<span class="cline-any cline-no"> </span>
|
|
1689
|
+
<span class="cline-any cline-no"> </span>
|
|
1690
|
+
<span class="cline-any cline-no"> </span>
|
|
1691
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1696
|
+
<span class="cline-any cline-no"> </span>
|
|
1697
|
+
<span class="cline-any cline-no"> </span>
|
|
1698
|
+
<span class="cline-any cline-no"> </span>
|
|
1699
|
+
<span class="cline-any cline-no"> </span>
|
|
1700
|
+
<span class="cline-any cline-no"> </span>
|
|
1701
|
+
<span class="cline-any cline-no"> </span>
|
|
1702
|
+
<span class="cline-any cline-no"> </span>
|
|
1703
|
+
<span class="cline-any cline-no"> </span>
|
|
1704
|
+
<span class="cline-any cline-no"> </span>
|
|
1705
|
+
<span class="cline-any cline-no"> </span>
|
|
1706
|
+
<span class="cline-any cline-no"> </span>
|
|
1707
|
+
<span class="cline-any cline-no"> </span>
|
|
1708
|
+
<span class="cline-any cline-no"> </span>
|
|
1709
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1715
|
+
<span class="cline-any cline-no"> </span>
|
|
1716
|
+
<span class="cline-any cline-no"> </span>
|
|
1717
|
+
<span class="cline-any cline-no"> </span>
|
|
1718
|
+
<span class="cline-any cline-no"> </span>
|
|
1719
|
+
<span class="cline-any cline-no"> </span>
|
|
1720
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1725
|
+
<span class="cline-any cline-no"> </span>
|
|
1726
|
+
<span class="cline-any cline-no"> </span>
|
|
1727
|
+
<span class="cline-any cline-no"> </span>
|
|
1728
|
+
<span class="cline-any cline-no"> </span>
|
|
1729
|
+
<span class="cline-any cline-no"> </span>
|
|
1730
|
+
<span class="cline-any cline-no"> </span>
|
|
1731
|
+
<span class="cline-any cline-no"> </span>
|
|
1732
|
+
<span class="cline-any cline-no"> </span>
|
|
1733
|
+
<span class="cline-any cline-no"> </span>
|
|
1734
|
+
<span class="cline-any cline-no"> </span>
|
|
1735
|
+
<span class="cline-any cline-no"> </span>
|
|
1736
|
+
<span class="cline-any cline-no"> </span>
|
|
1737
|
+
<span class="cline-any cline-no"> </span>
|
|
1738
|
+
<span class="cline-any cline-no"> </span>
|
|
1739
|
+
<span class="cline-any cline-no"> </span>
|
|
1740
|
+
<span class="cline-any cline-no"> </span>
|
|
1741
|
+
<span class="cline-any cline-no"> </span>
|
|
1742
|
+
<span class="cline-any cline-no"> </span>
|
|
1743
|
+
<span class="cline-any cline-no"> </span>
|
|
1744
|
+
<span class="cline-any cline-no"> </span>
|
|
1745
|
+
<span class="cline-any cline-no"> </span>
|
|
1746
|
+
<span class="cline-any cline-no"> </span>
|
|
1747
|
+
<span class="cline-any cline-no"> </span>
|
|
1748
|
+
<span class="cline-any cline-no"> </span>
|
|
1749
|
+
<span class="cline-any cline-no"> </span>
|
|
1750
|
+
<span class="cline-any cline-no"> </span>
|
|
1751
|
+
<span class="cline-any cline-no"> </span>
|
|
1752
|
+
<span class="cline-any cline-no"> </span>
|
|
1753
|
+
<span class="cline-any cline-no"> </span>
|
|
1754
|
+
<span class="cline-any cline-no"> </span>
|
|
1755
|
+
<span class="cline-any cline-no"> </span>
|
|
1756
|
+
<span class="cline-any cline-no"> </span>
|
|
1757
|
+
<span class="cline-any cline-no"> </span>
|
|
1758
|
+
<span class="cline-any cline-no"> </span>
|
|
1759
|
+
<span class="cline-any cline-no"> </span>
|
|
1760
|
+
<span class="cline-any cline-no"> </span>
|
|
1761
|
+
<span class="cline-any cline-no"> </span>
|
|
1762
|
+
<span class="cline-any cline-no"> </span>
|
|
1763
|
+
<span class="cline-any cline-no"> </span>
|
|
1764
|
+
<span class="cline-any cline-no"> </span>
|
|
1765
|
+
<span class="cline-any cline-no"> </span>
|
|
1766
|
+
<span class="cline-any cline-no"> </span>
|
|
1767
|
+
<span class="cline-any cline-no"> </span>
|
|
1768
|
+
<span class="cline-any cline-no"> </span>
|
|
1769
|
+
<span class="cline-any cline-no"> </span>
|
|
1770
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">/**
|
|
1771
|
+
* HSuite Native Connect
|
|
1772
|
+
* Copyright 2024-2025 HSuite (https://hsuite.finance)
|
|
1773
|
+
*
|
|
1774
|
+
* SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
|
|
1775
|
+
*
|
|
1776
|
+
* This file is part of HSuite Native Connect. For commercial licensing,
|
|
1777
|
+
* visit https://hsuite.finance/licensing
|
|
1778
|
+
*/
|
|
1779
|
+
|
|
1780
|
+
/**
|
|
1781
|
+
* @file Central service for managing multiple wallet providers in Angular applications.
|
|
1782
|
+
* @module services/unified-wallet
|
|
1783
|
+
*
|
|
1784
|
+
* @description
|
|
1785
|
+
* UnifiedWalletService is the primary entry point for dApp developers to interact with
|
|
1786
|
+
* blockchain wallets. It provides a unified API that abstracts the differences between
|
|
1787
|
+
* various wallet connection protocols (HSuite Native, WalletConnect, P2P).
|
|
1788
|
+
*
|
|
1789
|
+
* Key Capabilities:
|
|
1790
|
+
* - **Multi-Provider Management**: Register and manage multiple wallet providers
|
|
1791
|
+
* - **Unified Account Access**: Aggregate accounts from all connected providers
|
|
1792
|
+
* - **Active Account Tracking**: Maintain and switch the currently active account
|
|
1793
|
+
* - **Transaction Operations**: Sign and submit transactions through any connected wallet
|
|
1794
|
+
* - **Session Management**: Handle wallet sessions with automatic reconnection
|
|
1795
|
+
*
|
|
1796
|
+
* Architecture:
|
|
1797
|
+
* ```
|
|
1798
|
+
* +-------------------------------------------------------------------+
|
|
1799
|
+
* | UnifiedWalletService |
|
|
1800
|
+
* +-------------------------------------------------------------------+
|
|
1801
|
+
* | |
|
|
1802
|
+
* | +-------------------+ +-------------------+ +----------------+ |
|
|
1803
|
+
* | | HsuiteNative | | WalletConnect | | P2PNative | |
|
|
1804
|
+
* | | Provider | | V2Provider | | Provider | |
|
|
1805
|
+
* | +-------------------+ +-------------------+ +----------------+ |
|
|
1806
|
+
* | | | | |
|
|
1807
|
+
* | +----------------------+----------------------+ |
|
|
1808
|
+
* | | |
|
|
1809
|
+
* | BaseWalletProvider |
|
|
1810
|
+
* | (common interface) |
|
|
1811
|
+
* +-------------------------------------------------------------------+
|
|
1812
|
+
* ```
|
|
1813
|
+
*/
|
|
1814
|
+
|
|
1815
|
+
import { Injectable, signal, computed, inject, effect } from '@angular/core';
|
|
1816
|
+
import { getLogger } from '@hsuite/native-connect-sdk';
|
|
1817
|
+
|
|
1818
|
+
import type { ConnectionConfig } from '../models/connection-config.model';
|
|
1819
|
+
import type { ProviderType, ConnectionStatus } from '../models/provider-types';
|
|
1820
|
+
import type { UnifiedAccount } from '../models/unified-account.model';
|
|
1821
|
+
import { BaseWalletProvider } from '../providers/base-wallet-provider';
|
|
1822
|
+
import { HsuiteNativeProvider } from '../providers/hsuite-native-provider';
|
|
1823
|
+
import { P2PNativeProvider } from '../providers/p2p-native/p2p-native.provider';
|
|
1824
|
+
import { WalletConnectV2Provider } from '../providers/walletconnect/core/walletconnect-provider';
|
|
1825
|
+
|
|
1826
|
+
import { WalletEventBus } from './wallet-event-bus.service';
|
|
1827
|
+
|
|
1828
|
+
|
|
1829
|
+
const logger = getLogger().scoped?.('UnifiedWalletService'<span class="branch-0 cbranch-no" title="branch not covered" >) ?? getLogger();</span>
|
|
1830
|
+
|
|
1831
|
+
interface ProviderSummary {
|
|
1832
|
+
id: string;
|
|
1833
|
+
name: string;
|
|
1834
|
+
providerType: string;
|
|
1835
|
+
status: ConnectionStatus;
|
|
1836
|
+
accounts: UnifiedAccount[];
|
|
1837
|
+
supportsReconnect: boolean;
|
|
1838
|
+
}
|
|
1839
|
+
|
|
1840
|
+
/**
|
|
1841
|
+
* Central service for managing wallet connections across multiple protocols.
|
|
1842
|
+
*
|
|
1843
|
+
* @description
|
|
1844
|
+
* UnifiedWalletService provides a unified interface for interacting with blockchain wallets
|
|
1845
|
+
* regardless of the underlying connection protocol. It manages multiple provider instances,
|
|
1846
|
+
* aggregates accounts, and provides transaction signing/submission capabilities.
|
|
1847
|
+
*
|
|
1848
|
+
* The service automatically registers built-in providers (HSuite Native, WalletConnect, P2P)
|
|
1849
|
+
* and supports session restoration across page reloads.
|
|
1850
|
+
*
|
|
1851
|
+
* @Component({
|
|
1852
|
+
* template: `
|
|
1853
|
+
* <div *ngIf="wallet.activeAccount() as account">
|
|
1854
|
+
* Connected: {{ account.address }}
|
|
1855
|
+
* </div>
|
|
1856
|
+
* <button (click)="connectWallet()">Connect</button>
|
|
1857
|
+
* `
|
|
1858
|
+
* })
|
|
1859
|
+
* export class MyComponent {
|
|
1860
|
+
* wallet = inject(UnifiedWalletService);
|
|
1861
|
+
*
|
|
1862
|
+
* async connectWallet() {
|
|
1863
|
+
* await this.wallet.connect('hsuite-native', {
|
|
1864
|
+
* type: 'hsuite-native',
|
|
1865
|
+
* appId: 'my-dapp',
|
|
1866
|
+
* appName: 'My dApp',
|
|
1867
|
+
* ledgerId: 'hedera',
|
|
1868
|
+
* networkId: 'testnet',
|
|
1869
|
+
* });
|
|
1870
|
+
* }
|
|
1871
|
+
* }
|
|
1872
|
+
* ```
|
|
1873
|
+
*
|
|
1874
|
+
* @publicApi
|
|
1875
|
+
*/
|
|
1876
|
+
@Injectable({ providedIn: 'root' })
|
|
1877
|
+
export <span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" >class UnifiedWalletService {</span></span>
|
|
1878
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
1879
|
+
<span class="cstat-no" title="statement not covered" > * Map of registered providers</span>
|
|
1880
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
1881
|
+
<span class="cstat-no" title="statement not covered" > private readonly providers = new Map<string, BaseWalletProvider>();</span>
|
|
1882
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1883
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
1884
|
+
<span class="cstat-no" title="statement not covered" > * Signal tracking all registered provider IDs</span>
|
|
1885
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
1886
|
+
<span class="cstat-no" title="statement not covered" > private readonly _providerIds = signal<string[]>([]);</span>
|
|
1887
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1888
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
1889
|
+
<span class="cstat-no" title="statement not covered" > * Signal for the active account (across all providers)</span>
|
|
1890
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
1891
|
+
<span class="cstat-no" title="statement not covered" > private readonly _activeAccount = signal<UnifiedAccount | null>(null);</span>
|
|
1892
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1893
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
1894
|
+
<span class="cstat-no" title="statement not covered" > * Event bus for emitting wallet events</span>
|
|
1895
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
1896
|
+
<span class="cstat-no" title="statement not covered" > private readonly eventBus = inject(WalletEventBus);</span>
|
|
1897
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1898
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
1899
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
1900
|
+
<span class="cstat-no" title="statement not covered" > * @param hsuiteProvider</span>
|
|
1901
|
+
<span class="cstat-no" title="statement not covered" > * @param walletConnectProvider</span>
|
|
1902
|
+
<span class="cstat-no" title="statement not covered" > * @param p2pNativeProvider</span>
|
|
1903
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
1904
|
+
<span class="cstat-no" title="statement not covered" > constructor(</span>
|
|
1905
|
+
<span class="cstat-no" title="statement not covered" > hsuiteProvider: HsuiteNativeProvider,</span>
|
|
1906
|
+
<span class="cstat-no" title="statement not covered" > walletConnectProvider: WalletConnectV2Provider,</span>
|
|
1907
|
+
<span class="cstat-no" title="statement not covered" > p2pNativeProvider: P2PNativeProvider,</span>
|
|
1908
|
+
<span class="cstat-no" title="statement not covered" > ) {</span>
|
|
1909
|
+
<span class="cstat-no" title="statement not covered" > // Auto-register built-in providers (injected as constructor params)</span>
|
|
1910
|
+
<span class="cstat-no" title="statement not covered" > this.registerProvider(hsuiteProvider);</span>
|
|
1911
|
+
<span class="cstat-no" title="statement not covered" > this.registerProvider(walletConnectProvider);</span>
|
|
1912
|
+
<span class="cstat-no" title="statement not covered" > this.registerProvider(p2pNativeProvider);</span>
|
|
1913
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1914
|
+
<span class="cstat-no" title="statement not covered" > // Auto-select first account from unknown restored session (after a delay to let providers restore)</span>
|
|
1915
|
+
<span class="cstat-no" title="statement not covered" > setTimeout(() => {</span>
|
|
1916
|
+
<span class="cstat-no" title="statement not covered" > const allAccounts = this.allAccounts();</span>
|
|
1917
|
+
<span class="cstat-no" title="statement not covered" > if (!this._activeAccount() && allAccounts.length > 0) {</span>
|
|
1918
|
+
<span class="cstat-no" title="statement not covered" > this.setActiveAccount(allAccounts[0]);</span>
|
|
1919
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1920
|
+
<span class="cstat-no" title="statement not covered" > // Emit session restored event</span>
|
|
1921
|
+
<span class="cstat-no" title="statement not covered" > this.eventBus.sessionRestored.emit({</span>
|
|
1922
|
+
<span class="cstat-no" title="statement not covered" > providerId: allAccounts[0].providerId,</span>
|
|
1923
|
+
<span class="cstat-no" title="statement not covered" > sessionKey: allAccounts[0].id,</span>
|
|
1924
|
+
<span class="cstat-no" title="statement not covered" > accounts: allAccounts,</span>
|
|
1925
|
+
<span class="cstat-no" title="statement not covered" > metadata: { autoRestored: true },</span>
|
|
1926
|
+
<span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
|
|
1927
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1928
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1929
|
+
<span class="cstat-no" title="statement not covered" > }, 100);</span>
|
|
1930
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1931
|
+
<span class="cstat-no" title="statement not covered" > effect(() => {</span>
|
|
1932
|
+
<span class="cstat-no" title="statement not covered" > const accounts = this.allAccounts();</span>
|
|
1933
|
+
<span class="cstat-no" title="statement not covered" > const active = this._activeAccount();</span>
|
|
1934
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1935
|
+
<span class="cstat-no" title="statement not covered" > if (accounts.length === 0) {</span>
|
|
1936
|
+
<span class="cstat-no" title="statement not covered" > if (active) {</span>
|
|
1937
|
+
<span class="cstat-no" title="statement not covered" > this.setActiveAccount(null);</span>
|
|
1938
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1939
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1940
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1941
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1942
|
+
<span class="cstat-no" title="statement not covered" > const activeStillPresent = active ? accounts.some((acct) => acct.id === active.id) : false;</span>
|
|
1943
|
+
<span class="cstat-no" title="statement not covered" > if (!activeStillPresent) {</span>
|
|
1944
|
+
<span class="cstat-no" title="statement not covered" > this.setActiveAccount(accounts[0]);</span>
|
|
1945
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1946
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1947
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1948
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1949
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
1950
|
+
<span class="cstat-no" title="statement not covered" > * Gets summaries of all registered providers including status and accounts.</span>
|
|
1951
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
1952
|
+
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
1953
|
+
<span class="cstat-no" title="statement not covered" > * Returns metadata about each registered provider, useful for building</span>
|
|
1954
|
+
<span class="cstat-no" title="statement not covered" > * wallet selection UI or debugging connection states.</span>
|
|
1955
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
1956
|
+
<span class="cstat-no" title="statement not covered" > * @returns Array of provider summaries with status and account information</span>
|
|
1957
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
1958
|
+
<span class="cstat-no" title="statement not covered" > getProviderSummaries(): ProviderSummary[] {</span>
|
|
1959
|
+
<span class="cstat-no" title="statement not covered" > return Array.from(this.providers.values()).map((provider) => ({</span>
|
|
1960
|
+
<span class="cstat-no" title="statement not covered" > id: provider.id,</span>
|
|
1961
|
+
<span class="cstat-no" title="statement not covered" > name: provider.metadata.name,</span>
|
|
1962
|
+
<span class="cstat-no" title="statement not covered" > providerType: provider.metadata.type,</span>
|
|
1963
|
+
<span class="cstat-no" title="statement not covered" > status: provider.status(),</span>
|
|
1964
|
+
<span class="cstat-no" title="statement not covered" > accounts: provider.accounts(),</span>
|
|
1965
|
+
<span class="cstat-no" title="statement not covered" > supportsReconnect: typeof (provider as any).attemptReconnect === 'function',</span>
|
|
1966
|
+
<span class="cstat-no" title="statement not covered" > }));</span>
|
|
1967
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1968
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1969
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
1970
|
+
<span class="cstat-no" title="statement not covered" > * Attempts to reconnect a provider using stored session data.</span>
|
|
1971
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
1972
|
+
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
1973
|
+
<span class="cstat-no" title="statement not covered" > * Some providers (like HSuite Native) support session persistence and can</span>
|
|
1974
|
+
<span class="cstat-no" title="statement not covered" > * automatically reconnect after page reload without user interaction.</span>
|
|
1975
|
+
<span class="cstat-no" title="statement not covered" > * This method triggers the reconnection attempt.</span>
|
|
1976
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
1977
|
+
<span class="cstat-no" title="statement not covered" > * @param providerId - The provider ID to reconnect (e.g., 'hsuite-native')</span>
|
|
1978
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
1979
|
+
<span class="cstat-no" title="statement not covered" > * @returns Promise resolving to true if reconnection succeeded, false otherwise</span>
|
|
1980
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
1981
|
+
<span class="cstat-no" title="statement not covered" > async reconnectProvider(providerId: string): Promise<boolean> {</span>
|
|
1982
|
+
<span class="cstat-no" title="statement not covered" > const provider = this.providers.get(providerId);</span>
|
|
1983
|
+
<span class="cstat-no" title="statement not covered" > if (!provider) {</span>
|
|
1984
|
+
<span class="cstat-no" title="statement not covered" > return false;</span>
|
|
1985
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1986
|
+
<span class="cstat-no" title="statement not covered" > const reconnect = (provider as unknown as { attemptReconnect?: () => Promise<boolean> })</span>
|
|
1987
|
+
<span class="cstat-no" title="statement not covered" > .attemptReconnect;</span>
|
|
1988
|
+
<span class="cstat-no" title="statement not covered" > if (typeof reconnect === 'function') {</span>
|
|
1989
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1990
|
+
<span class="cstat-no" title="statement not covered" > return await reconnect.call(provider);</span>
|
|
1991
|
+
<span class="cstat-no" title="statement not covered" > } catch (error) {</span>
|
|
1992
|
+
<span class="cstat-no" title="statement not covered" > logger.warn('Provider reconnect failed', { providerId, error });</span>
|
|
1993
|
+
<span class="cstat-no" title="statement not covered" > return false;</span>
|
|
1994
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1995
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1996
|
+
<span class="cstat-no" title="statement not covered" > return false;</span>
|
|
1997
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1998
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1999
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2000
|
+
<span class="cstat-no" title="statement not covered" > * All accounts from all connected providers (reactive)</span>
|
|
2001
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2002
|
+
<span class="cstat-no" title="statement not covered" > readonly allAccounts = computed<UnifiedAccount[]>(() => {</span>
|
|
2003
|
+
<span class="cstat-no" title="statement not covered" > const providers = Array.from(this.providers.values());</span>
|
|
2004
|
+
<span class="cstat-no" title="statement not covered" > return providers.flatMap((p) => p.accounts());</span>
|
|
2005
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2006
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2007
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2008
|
+
<span class="cstat-no" title="statement not covered" > * Currently active account (reactive)</span>
|
|
2009
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2010
|
+
<span class="cstat-no" title="statement not covered" > readonly activeAccount = computed(() => this._activeAccount());</span>
|
|
2011
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2012
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2013
|
+
<span class="cstat-no" title="statement not covered" > * List of connected providers (reactive)</span>
|
|
2014
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2015
|
+
<span class="cstat-no" title="statement not covered" > readonly connectedProviders = computed<BaseWalletProvider[]>(() => {</span>
|
|
2016
|
+
<span class="cstat-no" title="statement not covered" > return Array.from(this.providers.values()).filter((p) => p.isConnected());</span>
|
|
2017
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2018
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2019
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2020
|
+
<span class="cstat-no" title="statement not covered" > * Transport state for HSuite Native and P2P Native connections.</span>
|
|
2021
|
+
<span class="cstat-no" title="statement not covered" > * Values: 'idle' | 'nostr-only' | 'upgrading' | 'p2p-connected' | 'p2p-failed'</span>
|
|
2022
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2023
|
+
<span class="cstat-no" title="statement not covered" > * Checks both HSuite Native and P2P Native providers.</span>
|
|
2024
|
+
<span class="cstat-no" title="statement not covered" > * Returns 'idle' for non-HSuite connections (WalletConnect, etc.)</span>
|
|
2025
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2026
|
+
<span class="cstat-no" title="statement not covered" > readonly transportState = computed<string>(() => {</span>
|
|
2027
|
+
<span class="cstat-no" title="statement not covered" > // Check HSuite Native provider first</span>
|
|
2028
|
+
<span class="cstat-no" title="statement not covered" > const hsuiteProvider = this.providers.get('hsuite-native') as HsuiteNativeProvider | undefined;</span>
|
|
2029
|
+
<span class="cstat-no" title="statement not covered" > if (hsuiteProvider) {</span>
|
|
2030
|
+
<span class="cstat-no" title="statement not covered" > const status = hsuiteProvider.status();</span>
|
|
2031
|
+
<span class="cstat-no" title="statement not covered" > if (status === 'connecting' || status === 'connected') {</span>
|
|
2032
|
+
<span class="cstat-no" title="statement not covered" > return hsuiteProvider.transportState();</span>
|
|
2033
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2034
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2035
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2036
|
+
<span class="cstat-no" title="statement not covered" > // Check P2P Native provider (mobile-native)</span>
|
|
2037
|
+
<span class="cstat-no" title="statement not covered" > const p2pProvider = this.providers.get('mobile-native') as P2PNativeProvider | undefined;</span>
|
|
2038
|
+
<span class="cstat-no" title="statement not covered" > if (p2pProvider) {</span>
|
|
2039
|
+
<span class="cstat-no" title="statement not covered" > const status = p2pProvider.status();</span>
|
|
2040
|
+
<span class="cstat-no" title="statement not covered" > if (status === 'connecting' || status === 'connected') {</span>
|
|
2041
|
+
<span class="cstat-no" title="statement not covered" > return p2pProvider.transportState();</span>
|
|
2042
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2043
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2044
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2045
|
+
<span class="cstat-no" title="statement not covered" > return 'idle';</span>
|
|
2046
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2047
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2048
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2049
|
+
<span class="cstat-no" title="statement not covered" > * Registers a wallet provider instance.</span>
|
|
2050
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2051
|
+
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
2052
|
+
<span class="cstat-no" title="statement not covered" > * Adds a provider to the service's internal registry. Once registered,</span>
|
|
2053
|
+
<span class="cstat-no" title="statement not covered" > * the provider's accounts will be included in {@link allAccounts} and</span>
|
|
2054
|
+
<span class="cstat-no" title="statement not covered" > * can be used for wallet operations.</span>
|
|
2055
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2056
|
+
<span class="cstat-no" title="statement not covered" > * Built-in providers (HSuite Native, WalletConnect, P2P) are auto-registered.</span>
|
|
2057
|
+
<span class="cstat-no" title="statement not covered" > * Use this method only for custom provider implementations.</span>
|
|
2058
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2059
|
+
<span class="cstat-no" title="statement not covered" > * @param provider - The provider instance to register</span>
|
|
2060
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2061
|
+
<span class="cstat-no" title="statement not covered" > registerProvider(provider: BaseWalletProvider): void {</span>
|
|
2062
|
+
<span class="cstat-no" title="statement not covered" > if (this.providers.has(provider.id)) {</span>
|
|
2063
|
+
<span class="cstat-no" title="statement not covered" > logger.warn('Provider already registered', { providerId: provider.id });</span>
|
|
2064
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
2065
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2066
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2067
|
+
<span class="cstat-no" title="statement not covered" > this.providers.set(provider.id, provider);</span>
|
|
2068
|
+
<span class="cstat-no" title="statement not covered" > this._providerIds.set(Array.from(this.providers.keys()));</span>
|
|
2069
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2070
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2071
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2072
|
+
<span class="cstat-no" title="statement not covered" > * Unregisters a wallet provider.</span>
|
|
2073
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2074
|
+
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
2075
|
+
<span class="cstat-no" title="statement not covered" > * Removes a provider from the service's registry. The provider's accounts</span>
|
|
2076
|
+
<span class="cstat-no" title="statement not covered" > * will no longer be included in {@link allAccounts}.</span>
|
|
2077
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2078
|
+
<span class="cstat-no" title="statement not covered" > * @param providerId - The provider ID to unregister</span>
|
|
2079
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2080
|
+
<span class="cstat-no" title="statement not covered" > unregisterProvider(providerId: string): void {</span>
|
|
2081
|
+
<span class="cstat-no" title="statement not covered" > this.providers.delete(providerId);</span>
|
|
2082
|
+
<span class="cstat-no" title="statement not covered" > this._providerIds.set(Array.from(this.providers.keys()));</span>
|
|
2083
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2084
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2085
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2086
|
+
<span class="cstat-no" title="statement not covered" > * Gets a specific provider by ID.</span>
|
|
2087
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2088
|
+
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
2089
|
+
<span class="cstat-no" title="statement not covered" > * Retrieves a registered provider instance for direct interaction.</span>
|
|
2090
|
+
<span class="cstat-no" title="statement not covered" > * Useful for accessing provider-specific features not exposed through</span>
|
|
2091
|
+
<span class="cstat-no" title="statement not covered" > * the unified interface.</span>
|
|
2092
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2093
|
+
<span class="cstat-no" title="statement not covered" > * @param providerId - The provider ID (e.g., 'hsuite-native', 'walletconnect-v2')</span>
|
|
2094
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2095
|
+
<span class="cstat-no" title="statement not covered" > * @returns The provider instance or undefined if not found</span>
|
|
2096
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2097
|
+
<span class="cstat-no" title="statement not covered" > getProvider(providerId: string): BaseWalletProvider | undefined {</span>
|
|
2098
|
+
<span class="cstat-no" title="statement not covered" > return this.providers.get(providerId);</span>
|
|
2099
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2100
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2101
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2102
|
+
<span class="cstat-no" title="statement not covered" > * Gets all providers of a specific type.</span>
|
|
2103
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2104
|
+
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
2105
|
+
<span class="cstat-no" title="statement not covered" > * Filters providers by their type, useful when you need to work with</span>
|
|
2106
|
+
<span class="cstat-no" title="statement not covered" > * a specific category of wallets.</span>
|
|
2107
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2108
|
+
<span class="cstat-no" title="statement not covered" > * @param type - Provider type to filter by (e.g., 'hsuite-native', 'walletconnect-v2')</span>
|
|
2109
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2110
|
+
<span class="cstat-no" title="statement not covered" > * @returns Array of providers matching the specified type</span>
|
|
2111
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2112
|
+
<span class="cstat-no" title="statement not covered" > getProvidersByType(type: ProviderType): BaseWalletProvider[] {</span>
|
|
2113
|
+
<span class="cstat-no" title="statement not covered" > return Array.from(this.providers.values()).filter((p) => p.metadata.type === type);</span>
|
|
2114
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2115
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2116
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2117
|
+
<span class="cstat-no" title="statement not covered" > * Connects to a wallet using a specific provider.</span>
|
|
2118
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2119
|
+
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
2120
|
+
<span class="cstat-no" title="statement not covered" > * Initiates a wallet connection through the specified provider. The connection</span>
|
|
2121
|
+
<span class="cstat-no" title="statement not covered" > * flow varies by provider type:</span>
|
|
2122
|
+
<span class="cstat-no" title="statement not covered" > * - **HSuite Native**: Opens wallet window/tab or uses Nostr discovery</span>
|
|
2123
|
+
<span class="cstat-no" title="statement not covered" > * - **WalletConnect**: Displays QR code for mobile wallet scanning</span>
|
|
2124
|
+
<span class="cstat-no" title="statement not covered" > * - **P2P Native**: Displays QR code for direct P2P connection</span>
|
|
2125
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2126
|
+
<span class="cstat-no" title="statement not covered" > * Upon successful connection, emits 'connected' and 'accountsUpdated' events</span>
|
|
2127
|
+
<span class="cstat-no" title="statement not covered" > * via WalletEventBus.</span>
|
|
2128
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2129
|
+
<span class="cstat-no" title="statement not covered" > * @param providerId - The provider ID to use for connection</span>
|
|
2130
|
+
<span class="cstat-no" title="statement not covered" > * @param config - Connection configuration (varies by provider type)</span>
|
|
2131
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2132
|
+
<span class="cstat-no" title="statement not covered" > * @throws {Error} If provider is not found</span>
|
|
2133
|
+
<span class="cstat-no" title="statement not covered" > * @throws {Error} If connection fails or times out</span>
|
|
2134
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2135
|
+
<span class="cstat-no" title="statement not covered" > async connect(providerId: string, config: ConnectionConfig): Promise<void> {</span>
|
|
2136
|
+
<span class="cstat-no" title="statement not covered" > const provider = this.providers.get(providerId);</span>
|
|
2137
|
+
<span class="cstat-no" title="statement not covered" > if (!provider) {</span>
|
|
2138
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`Provider ${providerId} not found`);</span>
|
|
2139
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2140
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2141
|
+
<span class="cstat-no" title="statement not covered" > await provider.connect(config);</span>
|
|
2142
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2143
|
+
<span class="cstat-no" title="statement not covered" > const accounts = provider.accounts();</span>
|
|
2144
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2145
|
+
<span class="cstat-no" title="statement not covered" > // Emit connection event</span>
|
|
2146
|
+
<span class="cstat-no" title="statement not covered" > this.eventBus.connected.emit({</span>
|
|
2147
|
+
<span class="cstat-no" title="statement not covered" > providerId,</span>
|
|
2148
|
+
<span class="cstat-no" title="statement not covered" > providerType: provider.metadata.type as 'hsuite-native' | 'walletconnect-v2',</span>
|
|
2149
|
+
<span class="cstat-no" title="statement not covered" > accounts,</span>
|
|
2150
|
+
<span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
|
|
2151
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2152
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2153
|
+
<span class="cstat-no" title="statement not covered" > // Emit accounts updated</span>
|
|
2154
|
+
<span class="cstat-no" title="statement not covered" > this.eventBus.accountsUpdated.emit({</span>
|
|
2155
|
+
<span class="cstat-no" title="statement not covered" > providerId,</span>
|
|
2156
|
+
<span class="cstat-no" title="statement not covered" > accounts,</span>
|
|
2157
|
+
<span class="cstat-no" title="statement not covered" > totalAccounts: this.allAccounts().length,</span>
|
|
2158
|
+
<span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
|
|
2159
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2160
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2161
|
+
<span class="cstat-no" title="statement not covered" > // Auto-select first account if none is active</span>
|
|
2162
|
+
<span class="cstat-no" title="statement not covered" > if (!this._activeAccount() && provider.accounts().length > 0) {</span>
|
|
2163
|
+
<span class="cstat-no" title="statement not covered" > this.setActiveAccount(provider.accounts()[0]);</span>
|
|
2164
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2165
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2166
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2167
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2168
|
+
<span class="cstat-no" title="statement not covered" > * Disconnects a specific provider.</span>
|
|
2169
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2170
|
+
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
2171
|
+
<span class="cstat-no" title="statement not covered" > * Terminates the wallet connection for the specified provider. If the active</span>
|
|
2172
|
+
<span class="cstat-no" title="statement not covered" > * account belonged to this provider, automatically selects another available</span>
|
|
2173
|
+
<span class="cstat-no" title="statement not covered" > * account or clears the active account.</span>
|
|
2174
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2175
|
+
<span class="cstat-no" title="statement not covered" > * @param providerId - The provider ID to disconnect</span>
|
|
2176
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2177
|
+
<span class="cstat-no" title="statement not covered" > * @throws {Error} If provider is not found</span>
|
|
2178
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2179
|
+
<span class="cstat-no" title="statement not covered" > async disconnect(providerId: string): Promise<void> {</span>
|
|
2180
|
+
<span class="cstat-no" title="statement not covered" > const provider = this.providers.get(providerId);</span>
|
|
2181
|
+
<span class="cstat-no" title="statement not covered" > if (!provider) {</span>
|
|
2182
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`Provider ${providerId} not found`);</span>
|
|
2183
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2184
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2185
|
+
<span class="cstat-no" title="statement not covered" > await provider.disconnect();</span>
|
|
2186
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2187
|
+
<span class="cstat-no" title="statement not covered" > // If the active account belonged to this provider, clear it</span>
|
|
2188
|
+
<span class="cstat-no" title="statement not covered" > const active = this._activeAccount();</span>
|
|
2189
|
+
<span class="cstat-no" title="statement not covered" > if (active && active.providerId === providerId) {</span>
|
|
2190
|
+
<span class="cstat-no" title="statement not covered" > // Try to select another account from a different provider</span>
|
|
2191
|
+
<span class="cstat-no" title="statement not covered" > const accounts = this.allAccounts();</span>
|
|
2192
|
+
<span class="cstat-no" title="statement not covered" > const nextAccount = accounts.find((a) => a.providerId !== providerId);</span>
|
|
2193
|
+
<span class="cstat-no" title="statement not covered" > this.setActiveAccount(nextAccount || null);</span>
|
|
2194
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2195
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2196
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2197
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2198
|
+
<span class="cstat-no" title="statement not covered" > * Disconnects all connected providers.</span>
|
|
2199
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2200
|
+
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
2201
|
+
<span class="cstat-no" title="statement not covered" > * Terminates all wallet connections and clears the active account.</span>
|
|
2202
|
+
<span class="cstat-no" title="statement not covered" > * Useful for logout flows or cleanup operations.</span>
|
|
2203
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2204
|
+
<span class="cstat-no" title="statement not covered" > async disconnectAll(): Promise<void> {</span>
|
|
2205
|
+
<span class="cstat-no" title="statement not covered" > const disconnectPromises = Array.from(this.providers.values())</span>
|
|
2206
|
+
<span class="cstat-no" title="statement not covered" > .filter((p) => p.isConnected())</span>
|
|
2207
|
+
<span class="cstat-no" title="statement not covered" > .map((p) => p.disconnect());</span>
|
|
2208
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2209
|
+
<span class="cstat-no" title="statement not covered" > await Promise.all(disconnectPromises);</span>
|
|
2210
|
+
<span class="cstat-no" title="statement not covered" > this.setActiveAccount(null);</span>
|
|
2211
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2212
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2213
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2214
|
+
<span class="cstat-no" title="statement not covered" > * Sets the active account for wallet operations.</span>
|
|
2215
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2216
|
+
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
2217
|
+
<span class="cstat-no" title="statement not covered" > * Changes the currently active account. All subsequent signing and transaction</span>
|
|
2218
|
+
<span class="cstat-no" title="statement not covered" > * operations will use this account. Emits an 'accountChanged' event via</span>
|
|
2219
|
+
<span class="cstat-no" title="statement not covered" > * WalletEventBus.</span>
|
|
2220
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2221
|
+
<span class="cstat-no" title="statement not covered" > * @param account - The account to set as active, or null to clear</span>
|
|
2222
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2223
|
+
<span class="cstat-no" title="statement not covered" > setActiveAccount(account: UnifiedAccount | null): void {</span>
|
|
2224
|
+
<span class="cstat-no" title="statement not covered" > const previous = this._activeAccount();</span>
|
|
2225
|
+
<span class="cstat-no" title="statement not covered" > this._activeAccount.set(account);</span>
|
|
2226
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2227
|
+
<span class="cstat-no" title="statement not covered" > // Emit account change event</span>
|
|
2228
|
+
<span class="cstat-no" title="statement not covered" > this.eventBus.accountChanged.emit({</span>
|
|
2229
|
+
<span class="cstat-no" title="statement not covered" > previousAccount: previous,</span>
|
|
2230
|
+
<span class="cstat-no" title="statement not covered" > newAccount: account,</span>
|
|
2231
|
+
<span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
|
|
2232
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2233
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2234
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2235
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2236
|
+
<span class="cstat-no" title="statement not covered" > * Signs a transaction using the active account.</span>
|
|
2237
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2238
|
+
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
2239
|
+
<span class="cstat-no" title="statement not covered" > * Requests the wallet to sign the provided transaction payload using the</span>
|
|
2240
|
+
<span class="cstat-no" title="statement not covered" > * active account's private key. The transaction is not submitted to the</span>
|
|
2241
|
+
<span class="cstat-no" title="statement not covered" > * network.</span>
|
|
2242
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2243
|
+
<span class="cstat-no" title="statement not covered" > * @param payload - Serialized transaction payload to sign (format depends on ledger)</span>
|
|
2244
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2245
|
+
<span class="cstat-no" title="statement not covered" > * @returns Promise resolving to sign result with signed payload and signature</span>
|
|
2246
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2247
|
+
<span class="cstat-no" title="statement not covered" > * @throws {Error} If no active account is set</span>
|
|
2248
|
+
<span class="cstat-no" title="statement not covered" > * @throws {Error} If provider is not found</span>
|
|
2249
|
+
<span class="cstat-no" title="statement not covered" > * @throws {Error} If user rejects the signing request</span>
|
|
2250
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2251
|
+
<span class="cstat-no" title="statement not covered" > async signTransaction(payload: string): Promise<unknown> {</span>
|
|
2252
|
+
<span class="cstat-no" title="statement not covered" > const account = this._activeAccount();</span>
|
|
2253
|
+
<span class="cstat-no" title="statement not covered" > if (!account) {</span>
|
|
2254
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('No active account');</span>
|
|
2255
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2256
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2257
|
+
<span class="cstat-no" title="statement not covered" > const provider = this.providers.get(account.providerId);</span>
|
|
2258
|
+
<span class="cstat-no" title="statement not covered" > if (!provider) {</span>
|
|
2259
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`Provider ${account.providerId} not found`);</span>
|
|
2260
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2261
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2262
|
+
<span class="cstat-no" title="statement not covered" > return await provider.signTransaction({</span>
|
|
2263
|
+
<span class="cstat-no" title="statement not covered" > accountAddress: account.address,</span>
|
|
2264
|
+
<span class="cstat-no" title="statement not covered" > payload,</span>
|
|
2265
|
+
<span class="cstat-no" title="statement not covered" > ledgerId: account.ledgerId,</span>
|
|
2266
|
+
<span class="cstat-no" title="statement not covered" > networkId: account.networkId,</span>
|
|
2267
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2268
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2269
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2270
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2271
|
+
<span class="cstat-no" title="statement not covered" > * Submits a transaction using the active account.</span>
|
|
2272
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2273
|
+
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
2274
|
+
<span class="cstat-no" title="statement not covered" > * Signs and submits a transaction to the blockchain network. This is a two-step</span>
|
|
2275
|
+
<span class="cstat-no" title="statement not covered" > * operation: sign then submit. For a single-prompt flow, use</span>
|
|
2276
|
+
<span class="cstat-no" title="statement not covered" > * {@link signAndExecuteTransaction} instead.</span>
|
|
2277
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2278
|
+
<span class="cstat-no" title="statement not covered" > * Supports batch transactions when isBatch is true.</span>
|
|
2279
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2280
|
+
<span class="cstat-no" title="statement not covered" > * @param payload - Serialized transaction payload to submit</span>
|
|
2281
|
+
<span class="cstat-no" title="statement not covered" > * @param options - Optional submission options</span>
|
|
2282
|
+
<span class="cstat-no" title="statement not covered" > * @param options.isBatch - Whether this is a batch transaction</span>
|
|
2283
|
+
<span class="cstat-no" title="statement not covered" > * @param options.batchKey - Unique key for batch grouping</span>
|
|
2284
|
+
<span class="cstat-no" title="statement not covered" > * @param options.innerTransactions - Individual transactions within the batch</span>
|
|
2285
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2286
|
+
<span class="cstat-no" title="statement not covered" > * @returns Promise resolving to submit result with transaction ID and hash</span>
|
|
2287
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2288
|
+
<span class="cstat-no" title="statement not covered" > * @throws {Error} If no active account is set</span>
|
|
2289
|
+
<span class="cstat-no" title="statement not covered" > * @throws {Error} If provider is not found</span>
|
|
2290
|
+
<span class="cstat-no" title="statement not covered" > * @throws {Error} If user rejects or transaction fails</span>
|
|
2291
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2292
|
+
<span class="cstat-no" title="statement not covered" > async submitTransaction(</span>
|
|
2293
|
+
<span class="cstat-no" title="statement not covered" > payload: string,</span>
|
|
2294
|
+
<span class="cstat-no" title="statement not covered" > options?: {</span>
|
|
2295
|
+
<span class="cstat-no" title="statement not covered" > isBatch?: boolean;</span>
|
|
2296
|
+
<span class="cstat-no" title="statement not covered" > batchKey?: string;</span>
|
|
2297
|
+
<span class="cstat-no" title="statement not covered" > innerTransactions?: Array<{ payload: string; description?: string }>;</span>
|
|
2298
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2299
|
+
<span class="cstat-no" title="statement not covered" > ): Promise<unknown> {</span>
|
|
2300
|
+
<span class="cstat-no" title="statement not covered" > const account = this._activeAccount();</span>
|
|
2301
|
+
<span class="cstat-no" title="statement not covered" > if (!account) {</span>
|
|
2302
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('No active account');</span>
|
|
2303
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2304
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2305
|
+
<span class="cstat-no" title="statement not covered" > const provider = this.providers.get(account.providerId);</span>
|
|
2306
|
+
<span class="cstat-no" title="statement not covered" > if (!provider) {</span>
|
|
2307
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`Provider ${account.providerId} not found`);</span>
|
|
2308
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2309
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2310
|
+
<span class="cstat-no" title="statement not covered" > return await provider.submitTransaction({</span>
|
|
2311
|
+
<span class="cstat-no" title="statement not covered" > accountAddress: account.address,</span>
|
|
2312
|
+
<span class="cstat-no" title="statement not covered" > payload,</span>
|
|
2313
|
+
<span class="cstat-no" title="statement not covered" > ledgerId: account.ledgerId,</span>
|
|
2314
|
+
<span class="cstat-no" title="statement not covered" > networkId: account.networkId,</span>
|
|
2315
|
+
<span class="cstat-no" title="statement not covered" > ...options,</span>
|
|
2316
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2317
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2318
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2319
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2320
|
+
<span class="cstat-no" title="statement not covered" > * Signs an arbitrary message using the active account.</span>
|
|
2321
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2322
|
+
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
2323
|
+
<span class="cstat-no" title="statement not covered" > * Requests the wallet to sign a message for authentication or verification</span>
|
|
2324
|
+
<span class="cstat-no" title="statement not covered" > * purposes (e.g., DAO votes, login challenges). The message is not a</span>
|
|
2325
|
+
<span class="cstat-no" title="statement not covered" > * blockchain transaction.</span>
|
|
2326
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2327
|
+
<span class="cstat-no" title="statement not covered" > * @param message - The message to sign (plain text or base64 encoded)</span>
|
|
2328
|
+
<span class="cstat-no" title="statement not covered" > * @param encoding - Message encoding: 'utf-8' (default) or 'base64'</span>
|
|
2329
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2330
|
+
<span class="cstat-no" title="statement not covered" > * @returns Promise resolving to sign result with signature and public key</span>
|
|
2331
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2332
|
+
<span class="cstat-no" title="statement not covered" > * @throws {Error} If no active account is set</span>
|
|
2333
|
+
<span class="cstat-no" title="statement not covered" > * @throws {Error} If provider is not found</span>
|
|
2334
|
+
<span class="cstat-no" title="statement not covered" > * @throws {Error} If user rejects the signing request</span>
|
|
2335
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2336
|
+
<span class="cstat-no" title="statement not covered" > async signMessage(message: string, encoding?: 'utf-8' | 'base64'): Promise<unknown> {</span>
|
|
2337
|
+
<span class="cstat-no" title="statement not covered" > const account = this._activeAccount();</span>
|
|
2338
|
+
<span class="cstat-no" title="statement not covered" > if (!account) {</span>
|
|
2339
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('No active account');</span>
|
|
2340
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2341
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2342
|
+
<span class="cstat-no" title="statement not covered" > const provider = this.providers.get(account.providerId);</span>
|
|
2343
|
+
<span class="cstat-no" title="statement not covered" > if (!provider) {</span>
|
|
2344
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`Provider ${account.providerId} not found`);</span>
|
|
2345
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2346
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2347
|
+
<span class="cstat-no" title="statement not covered" > return await provider.signMessage({</span>
|
|
2348
|
+
<span class="cstat-no" title="statement not covered" > accountAddress: account.address,</span>
|
|
2349
|
+
<span class="cstat-no" title="statement not covered" > message,</span>
|
|
2350
|
+
<span class="cstat-no" title="statement not covered" > encoding,</span>
|
|
2351
|
+
<span class="cstat-no" title="statement not covered" > ledgerId: account.ledgerId,</span>
|
|
2352
|
+
<span class="cstat-no" title="statement not covered" > networkId: account.networkId,</span>
|
|
2353
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2354
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2355
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2356
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2357
|
+
<span class="cstat-no" title="statement not covered" > * Signs and executes a transaction in a single prompt.</span>
|
|
2358
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2359
|
+
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
2360
|
+
<span class="cstat-no" title="statement not covered" > * Performs atomic sign-and-submit in a single wallet prompt. This is the</span>
|
|
2361
|
+
<span class="cstat-no" title="statement not covered" > * **recommended method** for most transaction submissions as it:</span>
|
|
2362
|
+
<span class="cstat-no" title="statement not covered" > * - Only requires one user approval (better UX)</span>
|
|
2363
|
+
<span class="cstat-no" title="statement not covered" > * - Matches WalletConnect's `hedera_signAndExecuteTransaction` behavior</span>
|
|
2364
|
+
<span class="cstat-no" title="statement not covered" > * - Provides atomic operation (sign+submit happen together)</span>
|
|
2365
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2366
|
+
<span class="cstat-no" title="statement not covered" > * For providers that don't support native signAndExecute, this method</span>
|
|
2367
|
+
<span class="cstat-no" title="statement not covered" > * falls back to separate sign and submit calls.</span>
|
|
2368
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2369
|
+
<span class="cstat-no" title="statement not covered" > * @param payload - Serialized transaction payload</span>
|
|
2370
|
+
<span class="cstat-no" title="statement not covered" > * @param options - Optional provider-specific options</span>
|
|
2371
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2372
|
+
<span class="cstat-no" title="statement not covered" > * @returns Promise resolving to execution result with transaction ID and hash</span>
|
|
2373
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2374
|
+
<span class="cstat-no" title="statement not covered" > * @throws {Error} If no active account is set</span>
|
|
2375
|
+
<span class="cstat-no" title="statement not covered" > * @throws {Error} If provider is not found</span>
|
|
2376
|
+
<span class="cstat-no" title="statement not covered" > * @throws {Error} If user rejects or transaction fails</span>
|
|
2377
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2378
|
+
<span class="cstat-no" title="statement not covered" > async signAndExecuteTransaction(</span>
|
|
2379
|
+
<span class="cstat-no" title="statement not covered" > payload: string,</span>
|
|
2380
|
+
<span class="cstat-no" title="statement not covered" > options?: Record<string, unknown>,</span>
|
|
2381
|
+
<span class="cstat-no" title="statement not covered" > ): Promise<unknown> {</span>
|
|
2382
|
+
<span class="cstat-no" title="statement not covered" > const account = this._activeAccount();</span>
|
|
2383
|
+
<span class="cstat-no" title="statement not covered" > if (!account) {</span>
|
|
2384
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('No active account');</span>
|
|
2385
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2386
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2387
|
+
<span class="cstat-no" title="statement not covered" > const provider = this.providers.get(account.providerId);</span>
|
|
2388
|
+
<span class="cstat-no" title="statement not covered" > if (!provider) {</span>
|
|
2389
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`Provider ${account.providerId} not found`);</span>
|
|
2390
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2391
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2392
|
+
<span class="cstat-no" title="statement not covered" > // Check if provider has native signAndExecute support</span>
|
|
2393
|
+
<span class="cstat-no" title="statement not covered" > if (</span>
|
|
2394
|
+
<span class="cstat-no" title="statement not covered" > typeof (provider as any as { signAndExecuteTransaction: (payload: any) => Promise<any> })</span>
|
|
2395
|
+
<span class="cstat-no" title="statement not covered" > .signAndExecuteTransaction === 'function'</span>
|
|
2396
|
+
<span class="cstat-no" title="statement not covered" > ) {</span>
|
|
2397
|
+
<span class="cstat-no" title="statement not covered" > return await (</span>
|
|
2398
|
+
<span class="cstat-no" title="statement not covered" > provider as any as { signAndExecuteTransaction: (payload: any) => Promise<any> }</span>
|
|
2399
|
+
<span class="cstat-no" title="statement not covered" > ).signAndExecuteTransaction({</span>
|
|
2400
|
+
<span class="cstat-no" title="statement not covered" > accountAddress: account.address,</span>
|
|
2401
|
+
<span class="cstat-no" title="statement not covered" > payload,</span>
|
|
2402
|
+
<span class="cstat-no" title="statement not covered" > ledgerId: account.ledgerId,</span>
|
|
2403
|
+
<span class="cstat-no" title="statement not covered" > networkId: account.networkId,</span>
|
|
2404
|
+
<span class="cstat-no" title="statement not covered" > ...options,</span>
|
|
2405
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2406
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2407
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2408
|
+
<span class="cstat-no" title="statement not covered" > // Fallback: sign then submit</span>
|
|
2409
|
+
<span class="cstat-no" title="statement not covered" > const signResult = await provider.signTransaction({</span>
|
|
2410
|
+
<span class="cstat-no" title="statement not covered" > accountAddress: account.address,</span>
|
|
2411
|
+
<span class="cstat-no" title="statement not covered" > payload,</span>
|
|
2412
|
+
<span class="cstat-no" title="statement not covered" > ledgerId: account.ledgerId,</span>
|
|
2413
|
+
<span class="cstat-no" title="statement not covered" > networkId: account.networkId,</span>
|
|
2414
|
+
<span class="cstat-no" title="statement not covered" > ...options,</span>
|
|
2415
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2416
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2417
|
+
<span class="cstat-no" title="statement not covered" > return await provider.submitTransaction({</span>
|
|
2418
|
+
<span class="cstat-no" title="statement not covered" > accountAddress: account.address,</span>
|
|
2419
|
+
<span class="cstat-no" title="statement not covered" > payload: signResult.signedPayload || payload,</span>
|
|
2420
|
+
<span class="cstat-no" title="statement not covered" > ledgerId: account.ledgerId,</span>
|
|
2421
|
+
<span class="cstat-no" title="statement not covered" > networkId: account.networkId,</span>
|
|
2422
|
+
<span class="cstat-no" title="statement not covered" > ...options,</span>
|
|
2423
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2424
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2425
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2426
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2427
|
+
<span class="cstat-no" title="statement not covered" > * Gets all active sessions across all providers.</span>
|
|
2428
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2429
|
+
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
2430
|
+
<span class="cstat-no" title="statement not covered" > * Returns detailed session information for all connected providers. For</span>
|
|
2431
|
+
<span class="cstat-no" title="statement not covered" > * WalletConnect, each session is returned separately. For other providers,</span>
|
|
2432
|
+
<span class="cstat-no" title="statement not covered" > * a single session entry represents the connection.</span>
|
|
2433
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2434
|
+
<span class="cstat-no" title="statement not covered" > * @returns Array of session objects with provider and account information</span>
|
|
2435
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2436
|
+
<span class="cstat-no" title="statement not covered" > getActiveSessions(): Array<{</span>
|
|
2437
|
+
<span class="cstat-no" title="statement not covered" > providerId: string;</span>
|
|
2438
|
+
<span class="cstat-no" title="statement not covered" > providerType: string;</span>
|
|
2439
|
+
<span class="cstat-no" title="statement not covered" > providerName: string;</span>
|
|
2440
|
+
<span class="cstat-no" title="statement not covered" > accounts: import('../models/unified-account.model').UnifiedAccount[];</span>
|
|
2441
|
+
<span class="cstat-no" title="statement not covered" > metadata: any;</span>
|
|
2442
|
+
<span class="cstat-no" title="statement not covered" > }> {</span>
|
|
2443
|
+
<span class="cstat-no" title="statement not covered" > const sessions: Array<{</span>
|
|
2444
|
+
<span class="cstat-no" title="statement not covered" > providerId: string;</span>
|
|
2445
|
+
<span class="cstat-no" title="statement not covered" > providerType: string;</span>
|
|
2446
|
+
<span class="cstat-no" title="statement not covered" > providerName: string;</span>
|
|
2447
|
+
<span class="cstat-no" title="statement not covered" > accounts: import('../models/unified-account.model').UnifiedAccount[];</span>
|
|
2448
|
+
<span class="cstat-no" title="statement not covered" > metadata: any;</span>
|
|
2449
|
+
<span class="cstat-no" title="statement not covered" > }> = [];</span>
|
|
2450
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2451
|
+
<span class="cstat-no" title="statement not covered" > for (const provider of this.providers.values()) {</span>
|
|
2452
|
+
<span class="cstat-no" title="statement not covered" > const accounts = provider.accounts();</span>
|
|
2453
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2454
|
+
<span class="cstat-no" title="statement not covered" > if (accounts.length > 0) {</span>
|
|
2455
|
+
<span class="cstat-no" title="statement not covered" > // For WalletConnect, get detailed session info</span>
|
|
2456
|
+
<span class="cstat-no" title="statement not covered" > if (provider.id === 'walletconnect-v2' && 'getActiveSessions' in provider) {</span>
|
|
2457
|
+
<span class="cstat-no" title="statement not covered" > const wcProvider = provider as any;</span>
|
|
2458
|
+
<span class="cstat-no" title="statement not covered" > const wcSessions = (</span>
|
|
2459
|
+
<span class="cstat-no" title="statement not covered" > wcProvider as { getActiveSessions: () => unknown[] }</span>
|
|
2460
|
+
<span class="cstat-no" title="statement not covered" > ).getActiveSessions();</span>
|
|
2461
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2462
|
+
<span class="cstat-no" title="statement not covered" > for (const wcSession of wcSessions) {</span>
|
|
2463
|
+
<span class="cstat-no" title="statement not covered" > sessions.push({</span>
|
|
2464
|
+
<span class="cstat-no" title="statement not covered" > providerId: provider.id,</span>
|
|
2465
|
+
<span class="cstat-no" title="statement not covered" > providerType: provider.metadata.type,</span>
|
|
2466
|
+
<span class="cstat-no" title="statement not covered" > providerName: provider.metadata.name,</span>
|
|
2467
|
+
<span class="cstat-no" title="statement not covered" > accounts: (wcSession as { accounts?: any[] }).accounts || [],</span>
|
|
2468
|
+
<span class="cstat-no" title="statement not covered" > metadata: {</span>
|
|
2469
|
+
<span class="cstat-no" title="statement not covered" > sessionKey: (wcSession as { sessionKey?: string }).sessionKey,</span>
|
|
2470
|
+
<span class="cstat-no" title="statement not covered" > ledgerId: (wcSession as { ledgerId?: string }).ledgerId,</span>
|
|
2471
|
+
<span class="cstat-no" title="statement not covered" > networkId: (wcSession as { networkId?: string }).networkId,</span>
|
|
2472
|
+
<span class="cstat-no" title="statement not covered" > topic: (wcSession as { topic?: string }).topic,</span>
|
|
2473
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2474
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2475
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2476
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
2477
|
+
<span class="cstat-no" title="statement not covered" > // For HSuite Native and other providers, create a single session entry</span>
|
|
2478
|
+
<span class="cstat-no" title="statement not covered" > sessions.push({</span>
|
|
2479
|
+
<span class="cstat-no" title="statement not covered" > providerId: provider.id,</span>
|
|
2480
|
+
<span class="cstat-no" title="statement not covered" > providerType: provider.metadata.type,</span>
|
|
2481
|
+
<span class="cstat-no" title="statement not covered" > providerName: provider.metadata.name,</span>
|
|
2482
|
+
<span class="cstat-no" title="statement not covered" > accounts,</span>
|
|
2483
|
+
<span class="cstat-no" title="statement not covered" > metadata: {</span>
|
|
2484
|
+
<span class="cstat-no" title="statement not covered" > type: provider.metadata.type,</span>
|
|
2485
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2486
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2487
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2488
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2489
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2490
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2491
|
+
<span class="cstat-no" title="statement not covered" > return sessions;</span>
|
|
2492
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2493
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2494
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2495
|
+
<span class="cstat-no" title="statement not covered" > * Disconnects a specific session from a provider.</span>
|
|
2496
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2497
|
+
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
2498
|
+
<span class="cstat-no" title="statement not covered" > * For WalletConnect which supports multiple concurrent sessions, this allows</span>
|
|
2499
|
+
<span class="cstat-no" title="statement not covered" > * disconnecting a specific session without affecting others. For other</span>
|
|
2500
|
+
<span class="cstat-no" title="statement not covered" > * providers, this is equivalent to calling {@link disconnect}.</span>
|
|
2501
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2502
|
+
<span class="cstat-no" title="statement not covered" > * @param providerId - The provider ID</span>
|
|
2503
|
+
<span class="cstat-no" title="statement not covered" > * @param sessionKey - Optional session key (required for WalletConnect multi-session)</span>
|
|
2504
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2505
|
+
<span class="cstat-no" title="statement not covered" > * @throws {Error} If provider is not found</span>
|
|
2506
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2507
|
+
<span class="cstat-no" title="statement not covered" > async disconnectSession(providerId: string, sessionKey?: string): Promise<void> {</span>
|
|
2508
|
+
<span class="cstat-no" title="statement not covered" > const provider = this.providers.get(providerId);</span>
|
|
2509
|
+
<span class="cstat-no" title="statement not covered" > if (!provider) {</span>
|
|
2510
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`Provider ${providerId} not found`);</span>
|
|
2511
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2512
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2513
|
+
<span class="cstat-no" title="statement not covered" > // If provider supports session-level disconnect (WalletConnect), use it</span>
|
|
2514
|
+
<span class="cstat-no" title="statement not covered" > if ('disconnectSession' in provider && sessionKey) {</span>
|
|
2515
|
+
<span class="cstat-no" title="statement not covered" > const wcProvider = provider as any;</span>
|
|
2516
|
+
<span class="cstat-no" title="statement not covered" > await (wcProvider as { disconnectSession: (key: string) => Promise<void> }).disconnectSession(</span>
|
|
2517
|
+
<span class="cstat-no" title="statement not covered" > sessionKey,</span>
|
|
2518
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2519
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
2520
|
+
<span class="cstat-no" title="statement not covered" > // Otherwise, disconnect the entire provider</span>
|
|
2521
|
+
<span class="cstat-no" title="statement not covered" > await provider.disconnect();</span>
|
|
2522
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2523
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2524
|
+
<span class="cstat-no" title="statement not covered" > // Emit disconnection event</span>
|
|
2525
|
+
<span class="cstat-no" title="statement not covered" > this.eventBus.disconnected.emit({</span>
|
|
2526
|
+
<span class="cstat-no" title="statement not covered" > providerId,</span>
|
|
2527
|
+
<span class="cstat-no" title="statement not covered" > providerType: provider.metadata.type,</span>
|
|
2528
|
+
<span class="cstat-no" title="statement not covered" > sessionKey,</span>
|
|
2529
|
+
<span class="cstat-no" title="statement not covered" > reason: 'user_initiated',</span>
|
|
2530
|
+
<span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
|
|
2531
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2532
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2533
|
+
<span class="cstat-no" title="statement not covered" > // Update active account if needed</span>
|
|
2534
|
+
<span class="cstat-no" title="statement not covered" > const active = this._activeAccount();</span>
|
|
2535
|
+
<span class="cstat-no" title="statement not covered" > if (active && active.providerId === providerId) {</span>
|
|
2536
|
+
<span class="cstat-no" title="statement not covered" > const accounts = this.allAccounts();</span>
|
|
2537
|
+
<span class="cstat-no" title="statement not covered" > const nextAccount = accounts.find(</span>
|
|
2538
|
+
<span class="cstat-no" title="statement not covered" > (a) =></span>
|
|
2539
|
+
<span class="cstat-no" title="statement not covered" > a.providerId !== providerId ||</span>
|
|
2540
|
+
<span class="cstat-no" title="statement not covered" > (sessionKey && (a.metadata as { sessionKey?: string })?.sessionKey !== sessionKey),</span>
|
|
2541
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2542
|
+
<span class="cstat-no" title="statement not covered" > this.setActiveAccount(nextAccount || null);</span>
|
|
2543
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2544
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2545
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2546
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2547
|
+
<span class="cstat-no" title="statement not covered" > * Check if any provider is connected</span>
|
|
2548
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2549
|
+
<span class="cstat-no" title="statement not covered" > isAnyConnected(): boolean {</span>
|
|
2550
|
+
<span class="cstat-no" title="statement not covered" > return this.connectedProviders().length > 0;</span>
|
|
2551
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2552
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2553
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2554
|
+
<span class="cstat-no" title="statement not covered" > * Alias for isAnyConnected() - convenience method</span>
|
|
2555
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2556
|
+
<span class="cstat-no" title="statement not covered" > isConnected(): boolean {</span>
|
|
2557
|
+
<span class="cstat-no" title="statement not covered" > return this.isAnyConnected();</span>
|
|
2558
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2559
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2560
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2561
|
+
<span class="cstat-no" title="statement not covered" > * Get account by ID</span>
|
|
2562
|
+
<span class="cstat-no" title="statement not covered" > * @param accountId</span>
|
|
2563
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2564
|
+
<span class="cstat-no" title="statement not covered" > getAccountById(accountId: string): UnifiedAccount | undefined {</span>
|
|
2565
|
+
<span class="cstat-no" title="statement not covered" > return this.allAccounts().find((a) => a.id === accountId);</span>
|
|
2566
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2567
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2568
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2569
|
+
<span class="cstat-no" title="statement not covered" > * Get list of unique ledger IDs from connected accounts</span>
|
|
2570
|
+
<span class="cstat-no" title="statement not covered" > * @returns Array of ledger IDs (e.g., ['hedera', 'xrpl'])</span>
|
|
2571
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2572
|
+
<span class="cstat-no" title="statement not covered" > getConnectedLedgers(): string[] {</span>
|
|
2573
|
+
<span class="cstat-no" title="statement not covered" > const accounts = this.allAccounts();</span>
|
|
2574
|
+
<span class="cstat-no" title="statement not covered" > const ledgerIds = new Set(accounts.map((a) => a.ledgerId).filter(Boolean));</span>
|
|
2575
|
+
<span class="cstat-no" title="statement not covered" > return Array.from(ledgerIds);</span>
|
|
2576
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2577
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2578
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2579
|
+
<span class="cstat-no" title="statement not covered" > * Get accounts filtered by ledger ID</span>
|
|
2580
|
+
<span class="cstat-no" title="statement not covered" > * @param ledgerId - Ledger identifier (e.g., 'hedera', 'xrpl')</span>
|
|
2581
|
+
<span class="cstat-no" title="statement not covered" > * @returns Array of accounts for the specified ledger</span>
|
|
2582
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2583
|
+
<span class="cstat-no" title="statement not covered" > getAccountsByLedger(ledgerId: string): UnifiedAccount[] {</span>
|
|
2584
|
+
<span class="cstat-no" title="statement not covered" > return this.allAccounts().filter((a) => a.ledgerId === ledgerId);</span>
|
|
2585
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2586
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2587
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2588
|
+
<span class="cstat-no" title="statement not covered" > * Switch to an account by its ID</span>
|
|
2589
|
+
<span class="cstat-no" title="statement not covered" > * @param accountId - The account ID to switch to</span>
|
|
2590
|
+
<span class="cstat-no" title="statement not covered" > * @returns true if account was found and switched, false otherwise</span>
|
|
2591
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2592
|
+
<span class="cstat-no" title="statement not covered" > switchAccount(accountId: string): boolean {</span>
|
|
2593
|
+
<span class="cstat-no" title="statement not covered" > const account = this.getAccountById(accountId);</span>
|
|
2594
|
+
<span class="cstat-no" title="statement not covered" > if (!account) {</span>
|
|
2595
|
+
<span class="cstat-no" title="statement not covered" > logger.warn('Account not found', { accountId });</span>
|
|
2596
|
+
<span class="cstat-no" title="statement not covered" > return false;</span>
|
|
2597
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2598
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2599
|
+
<span class="cstat-no" title="statement not covered" > this.setActiveAccount(account);</span>
|
|
2600
|
+
<span class="cstat-no" title="statement not covered" > return true;</span>
|
|
2601
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2602
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2603
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2604
|
+
<span class="cstat-no" title="statement not covered" > * Get the primary account for a specific ledger</span>
|
|
2605
|
+
<span class="cstat-no" title="statement not covered" > * Returns the first account found for the specified ledger</span>
|
|
2606
|
+
<span class="cstat-no" title="statement not covered" > * @param ledgerId - Ledger identifier (e.g., 'hedera', 'xrpl')</span>
|
|
2607
|
+
<span class="cstat-no" title="statement not covered" > * @returns The first account for the ledger, or undefined</span>
|
|
2608
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2609
|
+
<span class="cstat-no" title="statement not covered" > getPrimaryAccountForLedger(ledgerId: string): UnifiedAccount | undefined {</span>
|
|
2610
|
+
<span class="cstat-no" title="statement not covered" > return this.allAccounts().find((a) => a.ledgerId === ledgerId);</span>
|
|
2611
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2612
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2613
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2614
|
+
<span class="cstat-no" title="statement not covered" > * Check if a specific ledger has connected accounts</span>
|
|
2615
|
+
<span class="cstat-no" title="statement not covered" > * @param ledgerId - Ledger identifier (e.g., 'hedera', 'xrpl')</span>
|
|
2616
|
+
<span class="cstat-no" title="statement not covered" > * @returns true if at least one account exists for the ledger</span>
|
|
2617
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2618
|
+
<span class="cstat-no" title="statement not covered" > hasAccountsForLedger(ledgerId: string): boolean {</span>
|
|
2619
|
+
<span class="cstat-no" title="statement not covered" > return this.getAccountsByLedger(ledgerId).length > 0;</span>
|
|
2620
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2621
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
2622
|
+
</pre></td></tr></table></pre>
|
|
2623
|
+
|
|
2624
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
2625
|
+
</div><!-- /wrapper -->
|
|
2626
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
2627
|
+
Code coverage generated by
|
|
2628
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
2629
|
+
at 2026-06-02T14:30:38.372Z
|
|
2630
|
+
</div>
|
|
2631
|
+
<script src="../../prettify.js"></script>
|
|
2632
|
+
<script>
|
|
2633
|
+
window.onload = function () {
|
|
2634
|
+
prettyPrint();
|
|
2635
|
+
};
|
|
2636
|
+
</script>
|
|
2637
|
+
<script src="../../sorter.js"></script>
|
|
2638
|
+
<script src="../../block-navigation.js"></script>
|
|
2639
|
+
</body>
|
|
2640
|
+
</html>
|
|
2641
|
+
|