@hsuite/native-connect-angular 1.0.0 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/coverage/coverage-summary.json +53 -49
  2. package/coverage/index.html +100 -100
  3. package/coverage/lcov-report/index.html +100 -100
  4. package/coverage/lcov-report/lib/components/account-selector/account-actions/account-actions.component.ts.html +1 -1
  5. package/coverage/lcov-report/lib/components/account-selector/account-actions/index.html +1 -1
  6. package/coverage/lcov-report/lib/components/account-selector/account-filter/account-filter.component.ts.html +1 -1
  7. package/coverage/lcov-report/lib/components/account-selector/account-filter/index.html +1 -1
  8. package/coverage/lcov-report/lib/components/account-selector/account-formatting.service.ts.html +13 -19
  9. package/coverage/lcov-report/lib/components/account-selector/account-grouping.service.ts.html +1 -1
  10. package/coverage/lcov-report/lib/components/account-selector/account-list/account-list.component.ts.html +1 -1
  11. package/coverage/lcov-report/lib/components/account-selector/account-list/index.html +1 -1
  12. package/coverage/lcov-report/lib/components/account-selector/account-selector.component.ts.html +1 -1
  13. package/coverage/lcov-report/lib/components/account-selector/account-selector.service.ts.html +1 -1
  14. package/coverage/lcov-report/lib/components/account-selector/index.html +5 -5
  15. package/coverage/lcov-report/lib/components/wallet-account-display/index.html +1 -1
  16. package/coverage/lcov-report/lib/components/wallet-account-display/wallet-account-display.component.ts.html +10 -10
  17. package/coverage/lcov-report/lib/components/wallet-connect-button/index.html +21 -21
  18. package/coverage/lcov-report/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +475 -451
  19. package/coverage/lcov-report/lib/components/wallet-connect-prompt/index.html +1 -1
  20. package/coverage/lcov-report/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +1 -1
  21. package/coverage/lcov-report/lib/components/wallet-connected-guard/index.html +1 -1
  22. package/coverage/lcov-report/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +1 -1
  23. package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +148 -148
  24. package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/index.html +17 -17
  25. package/coverage/lcov-report/lib/components/wallet-connection-modal/index.html +21 -21
  26. package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/index.html +17 -17
  27. package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +838 -838
  28. package/coverage/lcov-report/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +1230 -987
  29. package/coverage/lcov-report/lib/components/wallet-session-display/index.html +1 -1
  30. package/coverage/lcov-report/lib/components/wallet-session-display/wallet-session-display.component.ts.html +1 -1
  31. package/coverage/lcov-report/lib/components/wallet-transaction-status/index.html +1 -1
  32. package/coverage/lcov-report/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +1 -1
  33. package/coverage/lcov-report/lib/directives/index.html +1 -1
  34. package/coverage/lcov-report/lib/directives/wallet-connected.directive.ts.html +1 -1
  35. package/coverage/lcov-report/lib/directives/wallet-context.directive.ts.html +1 -1
  36. package/coverage/lcov-report/lib/directives/wallet-events.directive.ts.html +1 -1
  37. package/coverage/lcov-report/lib/hsuite-wallet.module.ts.html +1 -1
  38. package/coverage/lcov-report/lib/index.html +1 -1
  39. package/coverage/lcov-report/lib/models/connection-config.model.ts.html +1 -1
  40. package/coverage/lcov-report/lib/models/index.html +7 -7
  41. package/coverage/lcov-report/lib/models/provider-types.ts.html +11 -5
  42. package/coverage/lcov-report/lib/providers/base-wallet-provider.ts.html +1 -1
  43. package/coverage/lcov-report/lib/providers/hsuite-native/channel-client.service.ts.html +9 -6
  44. package/coverage/lcov-report/lib/providers/hsuite-native/index.html +10 -10
  45. package/coverage/lcov-report/lib/providers/hsuite-native-provider.ts.html +1 -1
  46. package/coverage/lcov-report/lib/providers/index.html +1 -1
  47. package/coverage/lcov-report/lib/providers/p2p-native/index.html +7 -7
  48. package/coverage/lcov-report/lib/providers/p2p-native/p2p-native.provider.ts.html +1 -1
  49. package/coverage/lcov-report/lib/providers/p2p-native/p2p-session-manager.ts.html +7 -4
  50. package/coverage/lcov-report/lib/providers/wallet-error-handler.ts.html +1 -1
  51. package/coverage/lcov-report/lib/providers/walletconnect/core/index.html +10 -10
  52. package/coverage/lcov-report/lib/providers/walletconnect/core/session-health.ts.html +1 -1
  53. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +1 -1
  54. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-provider.ts.html +10 -7
  55. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +1 -1
  56. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +1 -1
  57. package/coverage/lcov-report/lib/providers/walletconnect/signers/hedera-signer.ts.html +1 -1
  58. package/coverage/lcov-report/lib/providers/walletconnect/signers/index.html +1 -1
  59. package/coverage/lcov-report/lib/providers/walletconnect/signers/signer-factory.ts.html +49 -49
  60. package/coverage/lcov-report/lib/providers/walletconnect/signers/xrpl-signer.ts.html +1 -1
  61. package/coverage/lcov-report/lib/services/hsuite-auth.interceptor.ts.html +568 -0
  62. package/coverage/lcov-report/lib/services/index.html +50 -20
  63. package/coverage/lcov-report/lib/services/logger.service.ts.html +4 -4
  64. package/coverage/lcov-report/lib/services/smart-session.service.ts.html +1264 -0
  65. package/coverage/lcov-report/lib/services/transaction-builders/active-account-source.ts.html +250 -0
  66. package/coverage/lcov-report/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1 -1
  67. package/coverage/lcov-report/lib/services/transaction-builders/hedera-amount-utils.ts.html +1 -1
  68. package/coverage/lcov-report/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +318 -318
  69. package/coverage/lcov-report/lib/services/transaction-builders/index.html +24 -9
  70. package/coverage/lcov-report/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +1 -1
  71. package/coverage/lcov-report/lib/services/transaction.service.ts.html +7 -10
  72. package/coverage/lcov-report/lib/services/unified-wallet.service.ts.html +9 -12
  73. package/coverage/lcov-report/lib/services/wallet-context.service.ts.html +1 -1
  74. package/coverage/lcov-report/lib/services/wallet-event-bus.service.ts.html +1 -1
  75. package/coverage/lcov-report/lib/services/wallet-providers.service.ts.html +4 -7
  76. package/coverage/lcov-report/lib/transports/chrome-extension-transport.ts.html +1 -1
  77. package/coverage/lcov-report/lib/transports/index.html +1 -1
  78. package/coverage/lcov-report/lib/utils/index.html +36 -21
  79. package/coverage/lcov-report/lib/utils/ledger-icons.util.ts.html +254 -161
  80. package/coverage/lcov-report/lib/utils/ledger-ui-registry.ts.html +676 -0
  81. package/coverage/lcov.info +3236 -2122
  82. package/coverage/lib/components/account-selector/account-actions/account-actions.component.ts.html +1 -1
  83. package/coverage/lib/components/account-selector/account-actions/index.html +1 -1
  84. package/coverage/lib/components/account-selector/account-filter/account-filter.component.ts.html +1 -1
  85. package/coverage/lib/components/account-selector/account-filter/index.html +1 -1
  86. package/coverage/lib/components/account-selector/account-formatting.service.ts.html +13 -19
  87. package/coverage/lib/components/account-selector/account-grouping.service.ts.html +1 -1
  88. package/coverage/lib/components/account-selector/account-list/account-list.component.ts.html +1 -1
  89. package/coverage/lib/components/account-selector/account-list/index.html +1 -1
  90. package/coverage/lib/components/account-selector/account-selector.component.ts.html +1 -1
  91. package/coverage/lib/components/account-selector/account-selector.service.ts.html +1 -1
  92. package/coverage/lib/components/account-selector/index.html +5 -5
  93. package/coverage/lib/components/wallet-account-display/index.html +1 -1
  94. package/coverage/lib/components/wallet-account-display/wallet-account-display.component.ts.html +10 -10
  95. package/coverage/lib/components/wallet-connect-button/index.html +21 -21
  96. package/coverage/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +475 -451
  97. package/coverage/lib/components/wallet-connect-prompt/index.html +1 -1
  98. package/coverage/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +1 -1
  99. package/coverage/lib/components/wallet-connected-guard/index.html +1 -1
  100. package/coverage/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +1 -1
  101. package/coverage/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +148 -148
  102. package/coverage/lib/components/wallet-connection-modal/connection-method-step/index.html +17 -17
  103. package/coverage/lib/components/wallet-connection-modal/index.html +21 -21
  104. package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/index.html +17 -17
  105. package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +838 -838
  106. package/coverage/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +1230 -987
  107. package/coverage/lib/components/wallet-session-display/index.html +1 -1
  108. package/coverage/lib/components/wallet-session-display/wallet-session-display.component.ts.html +1 -1
  109. package/coverage/lib/components/wallet-transaction-status/index.html +1 -1
  110. package/coverage/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +1 -1
  111. package/coverage/lib/directives/index.html +1 -1
  112. package/coverage/lib/directives/wallet-connected.directive.ts.html +1 -1
  113. package/coverage/lib/directives/wallet-context.directive.ts.html +1 -1
  114. package/coverage/lib/directives/wallet-events.directive.ts.html +1 -1
  115. package/coverage/lib/hsuite-wallet.module.ts.html +1 -1
  116. package/coverage/lib/index.html +1 -1
  117. package/coverage/lib/models/connection-config.model.ts.html +1 -1
  118. package/coverage/lib/models/index.html +7 -7
  119. package/coverage/lib/models/provider-types.ts.html +11 -5
  120. package/coverage/lib/providers/base-wallet-provider.ts.html +1 -1
  121. package/coverage/lib/providers/hsuite-native/channel-client.service.ts.html +9 -6
  122. package/coverage/lib/providers/hsuite-native/index.html +10 -10
  123. package/coverage/lib/providers/hsuite-native-provider.ts.html +1 -1
  124. package/coverage/lib/providers/index.html +1 -1
  125. package/coverage/lib/providers/p2p-native/index.html +7 -7
  126. package/coverage/lib/providers/p2p-native/p2p-native.provider.ts.html +1 -1
  127. package/coverage/lib/providers/p2p-native/p2p-session-manager.ts.html +7 -4
  128. package/coverage/lib/providers/wallet-error-handler.ts.html +1 -1
  129. package/coverage/lib/providers/walletconnect/core/index.html +10 -10
  130. package/coverage/lib/providers/walletconnect/core/session-health.ts.html +1 -1
  131. package/coverage/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +1 -1
  132. package/coverage/lib/providers/walletconnect/core/walletconnect-provider.ts.html +10 -7
  133. package/coverage/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +1 -1
  134. package/coverage/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +1 -1
  135. package/coverage/lib/providers/walletconnect/signers/hedera-signer.ts.html +1 -1
  136. package/coverage/lib/providers/walletconnect/signers/index.html +1 -1
  137. package/coverage/lib/providers/walletconnect/signers/signer-factory.ts.html +49 -49
  138. package/coverage/lib/providers/walletconnect/signers/xrpl-signer.ts.html +1 -1
  139. package/coverage/lib/services/hsuite-auth.interceptor.ts.html +568 -0
  140. package/coverage/lib/services/index.html +50 -20
  141. package/coverage/lib/services/logger.service.ts.html +4 -4
  142. package/coverage/lib/services/smart-session.service.ts.html +1264 -0
  143. package/coverage/lib/services/transaction-builders/active-account-source.ts.html +250 -0
  144. package/coverage/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1 -1
  145. package/coverage/lib/services/transaction-builders/hedera-amount-utils.ts.html +1 -1
  146. package/coverage/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +318 -318
  147. package/coverage/lib/services/transaction-builders/index.html +24 -9
  148. package/coverage/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +1 -1
  149. package/coverage/lib/services/transaction.service.ts.html +7 -10
  150. package/coverage/lib/services/unified-wallet.service.ts.html +9 -12
  151. package/coverage/lib/services/wallet-context.service.ts.html +1 -1
  152. package/coverage/lib/services/wallet-event-bus.service.ts.html +1 -1
  153. package/coverage/lib/services/wallet-providers.service.ts.html +4 -7
  154. package/coverage/lib/transports/chrome-extension-transport.ts.html +1 -1
  155. package/coverage/lib/transports/index.html +1 -1
  156. package/coverage/lib/utils/index.html +36 -21
  157. package/coverage/lib/utils/ledger-icons.util.ts.html +254 -161
  158. package/coverage/lib/utils/ledger-ui-registry.ts.html +676 -0
  159. package/dist/fesm2022/hsuite-native-connect-angular.mjs +939 -328
  160. package/dist/fesm2022/hsuite-native-connect-angular.mjs.map +1 -1
  161. package/dist/index.d.ts +489 -33
  162. package/package.json +4 -4
  163. package/src/index.ts +26 -0
  164. package/src/lib/components/account-selector/account-formatting.service.ts +8 -10
  165. package/src/lib/components/wallet-account-display/wallet-account-display.component.ts +9 -9
  166. package/src/lib/components/wallet-connect-button/wallet-connect-button.component.spec.ts +89 -0
  167. package/src/lib/components/wallet-connect-button/wallet-connect-button.component.ts +8 -0
  168. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.html +1 -6
  169. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.spec.ts +173 -0
  170. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts +118 -37
  171. package/src/lib/models/provider-types.ts +3 -1
  172. package/src/lib/models/unified-account.model.ts +4 -1
  173. package/src/lib/providers/hsuite-native/channel-client.service.ts +1 -0
  174. package/src/lib/providers/p2p-native/p2p-session-manager.ts +1 -0
  175. package/src/lib/providers/walletconnect/core/walletconnect-provider.ts +2 -1
  176. package/src/lib/services/hsuite-auth.interceptor.ts +159 -0
  177. package/src/lib/services/smart-session.service.ts +378 -0
  178. package/src/lib/services/transaction-builders/active-account-source.spec.ts +75 -0
  179. package/src/lib/services/transaction-builders/active-account-source.ts +55 -0
  180. package/src/lib/services/transaction-builders/hedera-transaction-builder.service.ts +4 -4
  181. package/src/lib/services/transaction-builders/index.ts +1 -0
  182. package/src/lib/services/transaction.service.ts +7 -4
  183. package/src/lib/services/unified-wallet.service.spec.ts +1 -1
  184. package/src/lib/services/unified-wallet.service.ts +2 -3
  185. package/src/lib/services/wallet-providers.service.ts +0 -1
  186. package/src/lib/utils/index.ts +1 -0
  187. package/src/lib/utils/ledger-icons.util.ts +61 -30
  188. package/src/lib/utils/ledger-ui-registry.ts +197 -0
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">0% </span>
26
+ <span class="strong">69.17% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/730</span>
28
+ <span class='fraction'>561/811</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">0% </span>
33
+ <span class="strong">44.44% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>0/1</span>
35
+ <span class='fraction'>20/45</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">0% </span>
40
+ <span class="strong">54.54% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>0/1</span>
42
+ <span class='fraction'>12/22</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">0% </span>
47
+ <span class="strong">69.17% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/730</span>
49
+ <span class='fraction'>561/811</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line low'></div>
64
+ <div class='status-line medium'></div>
65
65
  <pre><table class="coverage">
66
66
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
67
  <a name='L2'></a><a href='#L2'>2</a>
@@ -793,7 +793,318 @@
793
793
  <a name='L728'></a><a href='#L728'>728</a>
794
794
  <a name='L729'></a><a href='#L729'>729</a>
795
795
  <a name='L730'></a><a href='#L730'>730</a>
796
- <a name='L731'></a><a href='#L731'>731</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
878
+ <span class="cline-any cline-yes">1x</span>
879
+ <span class="cline-any cline-yes">1x</span>
880
+ <span class="cline-any cline-yes">1x</span>
881
+ <span class="cline-any cline-yes">1x</span>
882
+ <span class="cline-any cline-yes">1x</span>
883
+ <span class="cline-any cline-yes">1x</span>
884
+ <span class="cline-any cline-yes">1x</span>
885
+ <span class="cline-any cline-yes">1x</span>
886
+ <span class="cline-any cline-yes">1x</span>
887
+ <span class="cline-any cline-yes">1x</span>
888
+ <span class="cline-any cline-yes">1x</span>
889
+ <span class="cline-any cline-yes">1x</span>
890
+ <span class="cline-any cline-yes">1x</span>
891
+ <span class="cline-any cline-yes">1x</span>
892
+ <span class="cline-any cline-yes">1x</span>
893
+ <span class="cline-any cline-yes">1x</span>
894
+ <span class="cline-any cline-yes">1x</span>
895
+ <span class="cline-any cline-yes">1x</span>
896
+ <span class="cline-any cline-yes">1x</span>
897
+ <span class="cline-any cline-yes">1x</span>
898
+ <span class="cline-any cline-yes">1x</span>
899
+ <span class="cline-any cline-yes">1x</span>
900
+ <span class="cline-any cline-yes">1x</span>
901
+ <span class="cline-any cline-yes">1x</span>
902
+ <span class="cline-any cline-yes">1x</span>
903
+ <span class="cline-any cline-yes">1x</span>
904
+ <span class="cline-any cline-yes">1x</span>
905
+ <span class="cline-any cline-yes">1x</span>
906
+ <span class="cline-any cline-yes">1x</span>
907
+ <span class="cline-any cline-yes">1x</span>
908
+ <span class="cline-any cline-yes">1x</span>
909
+ <span class="cline-any cline-yes">1x</span>
910
+ <span class="cline-any cline-yes">1x</span>
911
+ <span class="cline-any cline-yes">1x</span>
912
+ <span class="cline-any cline-yes">1x</span>
913
+ <span class="cline-any cline-yes">1x</span>
914
+ <span class="cline-any cline-yes">1x</span>
915
+ <span class="cline-any cline-yes">1x</span>
916
+ <span class="cline-any cline-yes">1x</span>
917
+ <span class="cline-any cline-yes">1x</span>
918
+ <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">2x</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">10x</span>
1018
+ <span class="cline-any cline-yes">10x</span>
1019
+ <span class="cline-any cline-yes">10x</span>
1020
+ <span class="cline-any cline-yes">10x</span>
1021
+ <span class="cline-any cline-yes">10x</span>
1022
+ <span class="cline-any cline-yes">10x</span>
1023
+ <span class="cline-any cline-yes">10x</span>
1024
+ <span class="cline-any cline-yes">10x</span>
1025
+ <span class="cline-any cline-yes">10x</span>
1026
+ <span class="cline-any cline-yes">10x</span>
1027
+ <span class="cline-any cline-yes">10x</span>
1028
+ <span class="cline-any cline-yes">10x</span>
1029
+ <span class="cline-any cline-yes">10x</span>
1030
+ <span class="cline-any cline-yes">10x</span>
1031
+ <span class="cline-any cline-yes">10x</span>
1032
+ <span class="cline-any cline-yes">10x</span>
1033
+ <span class="cline-any cline-yes">10x</span>
1034
+ <span class="cline-any cline-yes">10x</span>
1035
+ <span class="cline-any cline-yes">10x</span>
1036
+ <span class="cline-any cline-yes">10x</span>
1037
+ <span class="cline-any cline-yes">10x</span>
1038
+ <span class="cline-any cline-yes">10x</span>
1039
+ <span class="cline-any cline-yes">10x</span>
1040
+ <span class="cline-any cline-yes">10x</span>
1041
+ <span class="cline-any cline-yes">10x</span>
1042
+ <span class="cline-any cline-yes">10x</span>
1043
+ <span class="cline-any cline-yes">10x</span>
1044
+ <span class="cline-any cline-yes">10x</span>
1045
+ <span class="cline-any cline-yes">10x</span>
1046
+ <span class="cline-any cline-yes">10x</span>
1047
+ <span class="cline-any cline-yes">10x</span>
1048
+ <span class="cline-any cline-yes">10x</span>
1049
+ <span class="cline-any cline-yes">10x</span>
1050
+ <span class="cline-any cline-yes">10x</span>
1051
+ <span class="cline-any cline-yes">10x</span>
1052
+ <span class="cline-any cline-yes">10x</span>
1053
+ <span class="cline-any cline-yes">10x</span>
1054
+ <span class="cline-any cline-yes">10x</span>
1055
+ <span class="cline-any cline-yes">10x</span>
1056
+ <span class="cline-any cline-yes">10x</span>
1057
+ <span class="cline-any cline-yes">10x</span>
1058
+ <span class="cline-any cline-yes">10x</span>
1059
+ <span class="cline-any cline-yes">10x</span>
1060
+ <span class="cline-any cline-yes">10x</span>
1061
+ <span class="cline-any cline-yes">10x</span>
1062
+ <span class="cline-any cline-yes">10x</span>
1063
+ <span class="cline-any cline-yes">10x</span>
1064
+ <span class="cline-any cline-yes">10x</span>
1065
+ <span class="cline-any cline-yes">10x</span>
1066
+ <span class="cline-any cline-yes">10x</span>
1067
+ <span class="cline-any cline-yes">10x</span>
1068
+ <span class="cline-any cline-yes">10x</span>
1069
+ <span class="cline-any cline-yes">10x</span>
1070
+ <span class="cline-any cline-yes">10x</span>
1071
+ <span class="cline-any cline-yes">10x</span>
1072
+ <span class="cline-any cline-yes">10x</span>
1073
+ <span class="cline-any cline-yes">10x</span>
1074
+ <span class="cline-any cline-yes">10x</span>
1075
+ <span class="cline-any cline-yes">10x</span>
1076
+ <span class="cline-any cline-yes">10x</span>
1077
+ <span class="cline-any cline-yes">10x</span>
1078
+ <span class="cline-any cline-yes">10x</span>
1079
+ <span class="cline-any cline-yes">10x</span>
1080
+ <span class="cline-any cline-yes">10x</span>
1081
+ <span class="cline-any cline-yes">10x</span>
1082
+ <span class="cline-any cline-yes">10x</span>
1083
+ <span class="cline-any cline-yes">10x</span>
1084
+ <span class="cline-any cline-yes">10x</span>
1085
+ <span class="cline-any cline-yes">10x</span>
1086
+ <span class="cline-any cline-yes">10x</span>
1087
+ <span class="cline-any cline-yes">10x</span>
1088
+ <span class="cline-any cline-yes">10x</span>
1089
+ <span class="cline-any cline-yes">10x</span>
1090
+ <span class="cline-any cline-yes">10x</span>
1091
+ <span class="cline-any cline-yes">10x</span>
1092
+ <span class="cline-any cline-yes">10x</span>
1093
+ <span class="cline-any cline-yes">10x</span>
1094
+ <span class="cline-any cline-yes">10x</span>
1095
+ <span class="cline-any cline-yes">10x</span>
1096
+ <span class="cline-any cline-yes">10x</span>
1097
+ <span class="cline-any cline-yes">10x</span>
1098
+ <span class="cline-any cline-yes">10x</span>
1099
+ <span class="cline-any cline-yes">10x</span>
1100
+ <span class="cline-any cline-yes">10x</span>
1101
+ <span class="cline-any cline-yes">10x</span>
1102
+ <span class="cline-any cline-yes">10x</span>
1103
+ <span class="cline-any cline-yes">10x</span>
1104
+ <span class="cline-any cline-yes">10x</span>
1105
+ <span class="cline-any cline-yes">10x</span>
1106
+ <span class="cline-any cline-yes">10x</span>
1107
+ <span class="cline-any cline-yes">10x</span>
797
1108
  <span class="cline-any cline-no">&nbsp;</span>
798
1109
  <span class="cline-any cline-no">&nbsp;</span>
799
1110
  <span class="cline-any cline-no">&nbsp;</span>
@@ -826,6 +1137,27 @@
826
1137
  <span class="cline-any cline-no">&nbsp;</span>
827
1138
  <span class="cline-any cline-no">&nbsp;</span>
828
1139
  <span class="cline-any cline-no">&nbsp;</span>
1140
+ <span class="cline-any cline-yes">10x</span>
1141
+ <span class="cline-any cline-yes">10x</span>
1142
+ <span class="cline-any cline-yes">10x</span>
1143
+ <span class="cline-any cline-yes">10x</span>
1144
+ <span class="cline-any cline-yes">10x</span>
1145
+ <span class="cline-any cline-yes">20x</span>
1146
+ <span class="cline-any cline-yes">20x</span>
1147
+ <span class="cline-any cline-yes">20x</span>
1148
+ <span class="cline-any cline-yes">20x</span>
1149
+ <span class="cline-any cline-yes">20x</span>
1150
+ <span class="cline-any cline-yes">20x</span>
1151
+ <span class="cline-any cline-yes">20x</span>
1152
+ <span class="cline-any cline-yes">10x</span>
1153
+ <span class="cline-any cline-yes">10x</span>
1154
+ <span class="cline-any cline-yes">10x</span>
1155
+ <span class="cline-any cline-yes">10x</span>
1156
+ <span class="cline-any cline-yes">10x</span>
1157
+ <span class="cline-any cline-yes">10x</span>
1158
+ <span class="cline-any cline-yes">10x</span>
1159
+ <span class="cline-any cline-yes">10x</span>
1160
+ <span class="cline-any cline-yes">10x</span>
829
1161
  <span class="cline-any cline-no">&nbsp;</span>
830
1162
  <span class="cline-any cline-no">&nbsp;</span>
831
1163
  <span class="cline-any cline-no">&nbsp;</span>
@@ -848,6 +1180,10 @@
848
1180
  <span class="cline-any cline-no">&nbsp;</span>
849
1181
  <span class="cline-any cline-no">&nbsp;</span>
850
1182
  <span class="cline-any cline-no">&nbsp;</span>
1183
+ <span class="cline-any cline-yes">10x</span>
1184
+ <span class="cline-any cline-yes">10x</span>
1185
+ <span class="cline-any cline-yes">10x</span>
1186
+ <span class="cline-any cline-yes">10x</span>
851
1187
  <span class="cline-any cline-no">&nbsp;</span>
852
1188
  <span class="cline-any cline-no">&nbsp;</span>
853
1189
  <span class="cline-any cline-no">&nbsp;</span>
@@ -861,6 +1197,9 @@
861
1197
  <span class="cline-any cline-no">&nbsp;</span>
862
1198
  <span class="cline-any cline-no">&nbsp;</span>
863
1199
  <span class="cline-any cline-no">&nbsp;</span>
1200
+ <span class="cline-any cline-yes">10x</span>
1201
+ <span class="cline-any cline-yes">10x</span>
1202
+ <span class="cline-any cline-yes">10x</span>
864
1203
  <span class="cline-any cline-no">&nbsp;</span>
865
1204
  <span class="cline-any cline-no">&nbsp;</span>
866
1205
  <span class="cline-any cline-no">&nbsp;</span>
@@ -878,33 +1217,223 @@
878
1217
  <span class="cline-any cline-no">&nbsp;</span>
879
1218
  <span class="cline-any cline-no">&nbsp;</span>
880
1219
  <span class="cline-any cline-no">&nbsp;</span>
1220
+ <span class="cline-any cline-yes">10x</span>
1221
+ <span class="cline-any cline-yes">10x</span>
1222
+ <span class="cline-any cline-yes">10x</span>
1223
+ <span class="cline-any cline-yes">10x</span>
1224
+ <span class="cline-any cline-yes">10x</span>
1225
+ <span class="cline-any cline-yes">10x</span>
1226
+ <span class="cline-any cline-yes">10x</span>
1227
+ <span class="cline-any cline-yes">10x</span>
1228
+ <span class="cline-any cline-yes">10x</span>
1229
+ <span class="cline-any cline-yes">10x</span>
1230
+ <span class="cline-any cline-yes">10x</span>
1231
+ <span class="cline-any cline-yes">10x</span>
1232
+ <span class="cline-any cline-yes">10x</span>
1233
+ <span class="cline-any cline-yes">2x</span>
1234
+ <span class="cline-any cline-yes">2x</span>
1235
+ <span class="cline-any cline-yes">2x</span>
1236
+ <span class="cline-any cline-yes">2x</span>
1237
+ <span class="cline-any cline-yes">2x</span>
1238
+ <span class="cline-any cline-yes">2x</span>
1239
+ <span class="cline-any cline-yes">2x</span>
881
1240
  <span class="cline-any cline-no">&nbsp;</span>
1241
+ <span class="cline-any cline-yes">2x</span>
1242
+ <span class="cline-any cline-yes">2x</span>
1243
+ <span class="cline-any cline-yes">2x</span>
1244
+ <span class="cline-any cline-yes">2x</span>
882
1245
  <span class="cline-any cline-no">&nbsp;</span>
883
1246
  <span class="cline-any cline-no">&nbsp;</span>
1247
+ <span class="cline-any cline-yes">2x</span>
1248
+ <span class="cline-any cline-yes">2x</span>
1249
+ <span class="cline-any cline-yes">2x</span>
884
1250
  <span class="cline-any cline-no">&nbsp;</span>
885
1251
  <span class="cline-any cline-no">&nbsp;</span>
886
1252
  <span class="cline-any cline-no">&nbsp;</span>
1253
+ <span class="cline-any cline-yes">2x</span>
1254
+ <span class="cline-any cline-yes">2x</span>
1255
+ <span class="cline-any cline-yes">2x</span>
1256
+ <span class="cline-any cline-yes">2x</span>
1257
+ <span class="cline-any cline-yes">1x</span>
1258
+ <span class="cline-any cline-yes">1x</span>
1259
+ <span class="cline-any cline-yes">1x</span>
1260
+ <span class="cline-any cline-yes">10x</span>
1261
+ <span class="cline-any cline-yes">10x</span>
1262
+ <span class="cline-any cline-yes">10x</span>
1263
+ <span class="cline-any cline-yes">10x</span>
1264
+ <span class="cline-any cline-yes">10x</span>
1265
+ <span class="cline-any cline-yes">10x</span>
1266
+ <span class="cline-any cline-yes">10x</span>
1267
+ <span class="cline-any cline-yes">1x</span>
1268
+ <span class="cline-any cline-yes">1x</span>
1269
+ <span class="cline-any cline-yes">1x</span>
1270
+ <span class="cline-any cline-yes">1x</span>
1271
+ <span class="cline-any cline-yes">1x</span>
1272
+ <span class="cline-any cline-yes">1x</span>
1273
+ <span class="cline-any cline-yes">1x</span>
1274
+ <span class="cline-any cline-yes">1x</span>
1275
+ <span class="cline-any cline-yes">1x</span>
1276
+ <span class="cline-any cline-yes">1x</span>
1277
+ <span class="cline-any cline-yes">1x</span>
887
1278
  <span class="cline-any cline-no">&nbsp;</span>
1279
+ <span class="cline-any cline-yes">1x</span>
1280
+ <span class="cline-any cline-yes">1x</span>
1281
+ <span class="cline-any cline-yes">1x</span>
888
1282
  <span class="cline-any cline-no">&nbsp;</span>
1283
+ <span class="cline-any cline-yes">1x</span>
889
1284
  <span class="cline-any cline-no">&nbsp;</span>
890
1285
  <span class="cline-any cline-no">&nbsp;</span>
1286
+ <span class="cline-any cline-yes">1x</span>
891
1287
  <span class="cline-any cline-no">&nbsp;</span>
892
1288
  <span class="cline-any cline-no">&nbsp;</span>
1289
+ <span class="cline-any cline-yes">1x</span>
893
1290
  <span class="cline-any cline-no">&nbsp;</span>
894
1291
  <span class="cline-any cline-no">&nbsp;</span>
1292
+ <span class="cline-any cline-yes">1x</span>
1293
+ <span class="cline-any cline-no">&nbsp;</span>
1294
+ <span class="cline-any cline-yes">1x</span>
1295
+ <span class="cline-any cline-yes">10x</span>
1296
+ <span class="cline-any cline-yes">10x</span>
1297
+ <span class="cline-any cline-yes">10x</span>
1298
+ <span class="cline-any cline-yes">10x</span>
1299
+ <span class="cline-any cline-yes">10x</span>
1300
+ <span class="cline-any cline-yes">10x</span>
1301
+ <span class="cline-any cline-yes">10x</span>
1302
+ <span class="cline-any cline-yes">10x</span>
1303
+ <span class="cline-any cline-yes">10x</span>
1304
+ <span class="cline-any cline-yes">1x</span>
1305
+ <span class="cline-any cline-yes">1x</span>
1306
+ <span class="cline-any cline-no">&nbsp;</span>
1307
+ <span class="cline-any cline-no">&nbsp;</span>
1308
+ <span class="cline-any cline-yes">1x</span>
1309
+ <span class="cline-any cline-yes">1x</span>
1310
+ <span class="cline-any cline-no">&nbsp;</span>
1311
+ <span class="cline-any cline-yes">1x</span>
1312
+ <span class="cline-any cline-yes">10x</span>
1313
+ <span class="cline-any cline-yes">10x</span>
1314
+ <span class="cline-any cline-yes">10x</span>
1315
+ <span class="cline-any cline-yes">10x</span>
1316
+ <span class="cline-any cline-yes">10x</span>
1317
+ <span class="cline-any cline-yes">10x</span>
1318
+ <span class="cline-any cline-yes">10x</span>
1319
+ <span class="cline-any cline-yes">10x</span>
1320
+ <span class="cline-any cline-yes">10x</span>
1321
+ <span class="cline-any cline-yes">10x</span>
1322
+ <span class="cline-any cline-yes">10x</span>
1323
+ <span class="cline-any cline-yes">10x</span>
1324
+ <span class="cline-any cline-yes">10x</span>
1325
+ <span class="cline-any cline-no">&nbsp;</span>
1326
+ <span class="cline-any cline-yes">10x</span>
1327
+ <span class="cline-any cline-yes">10x</span>
1328
+ <span class="cline-any cline-yes">10x</span>
1329
+ <span class="cline-any cline-yes">10x</span>
1330
+ <span class="cline-any cline-yes">10x</span>
1331
+ <span class="cline-any cline-yes">10x</span>
1332
+ <span class="cline-any cline-yes">10x</span>
1333
+ <span class="cline-any cline-yes">10x</span>
1334
+ <span class="cline-any cline-yes">10x</span>
1335
+ <span class="cline-any cline-yes">10x</span>
1336
+ <span class="cline-any cline-yes">10x</span>
1337
+ <span class="cline-any cline-yes">10x</span>
1338
+ <span class="cline-any cline-yes">10x</span>
1339
+ <span class="cline-any cline-yes">10x</span>
1340
+ <span class="cline-any cline-yes">10x</span>
1341
+ <span class="cline-any cline-yes">7x</span>
1342
+ <span class="cline-any cline-yes">7x</span>
1343
+ <span class="cline-any cline-yes">7x</span>
1344
+ <span class="cline-any cline-yes">10x</span>
1345
+ <span class="cline-any cline-yes">10x</span>
1346
+ <span class="cline-any cline-yes">10x</span>
1347
+ <span class="cline-any cline-yes">10x</span>
1348
+ <span class="cline-any cline-yes">10x</span>
1349
+ <span class="cline-any cline-yes">10x</span>
1350
+ <span class="cline-any cline-yes">10x</span>
1351
+ <span class="cline-any cline-no">&nbsp;</span>
1352
+ <span class="cline-any cline-no">&nbsp;</span>
1353
+ <span class="cline-any cline-yes">10x</span>
1354
+ <span class="cline-any cline-yes">10x</span>
1355
+ <span class="cline-any cline-yes">10x</span>
1356
+ <span class="cline-any cline-yes">10x</span>
1357
+ <span class="cline-any cline-yes">10x</span>
1358
+ <span class="cline-any cline-yes">10x</span>
1359
+ <span class="cline-any cline-yes">10x</span>
1360
+ <span class="cline-any cline-yes">1x</span>
1361
+ <span class="cline-any cline-yes">1x</span>
1362
+ <span class="cline-any cline-yes">1x</span>
1363
+ <span class="cline-any cline-yes">1x</span>
1364
+ <span class="cline-any cline-yes">10x</span>
1365
+ <span class="cline-any cline-yes">10x</span>
1366
+ <span class="cline-any cline-yes">10x</span>
1367
+ <span class="cline-any cline-yes">10x</span>
1368
+ <span class="cline-any cline-yes">10x</span>
1369
+ <span class="cline-any cline-yes">10x</span>
1370
+ <span class="cline-any cline-yes">2x</span>
1371
+ <span class="cline-any cline-yes">2x</span>
1372
+ <span class="cline-any cline-yes">10x</span>
1373
+ <span class="cline-any cline-yes">10x</span>
1374
+ <span class="cline-any cline-yes">10x</span>
1375
+ <span class="cline-any cline-yes">10x</span>
1376
+ <span class="cline-any cline-yes">10x</span>
1377
+ <span class="cline-any cline-yes">10x</span>
1378
+ <span class="cline-any cline-yes">10x</span>
1379
+ <span class="cline-any cline-yes">10x</span>
1380
+ <span class="cline-any cline-yes">1x</span>
1381
+ <span class="cline-any cline-yes">1x</span>
1382
+ <span class="cline-any cline-yes">1x</span>
1383
+ <span class="cline-any cline-yes">1x</span>
1384
+ <span class="cline-any cline-yes">1x</span>
1385
+ <span class="cline-any cline-yes">1x</span>
895
1386
  <span class="cline-any cline-no">&nbsp;</span>
896
1387
  <span class="cline-any cline-no">&nbsp;</span>
897
1388
  <span class="cline-any cline-no">&nbsp;</span>
1389
+ <span class="cline-any cline-yes">1x</span>
1390
+ <span class="cline-any cline-yes">10x</span>
1391
+ <span class="cline-any cline-yes">10x</span>
1392
+ <span class="cline-any cline-yes">10x</span>
1393
+ <span class="cline-any cline-yes">10x</span>
1394
+ <span class="cline-any cline-yes">10x</span>
1395
+ <span class="cline-any cline-yes">10x</span>
1396
+ <span class="cline-any cline-yes">3x</span>
1397
+ <span class="cline-any cline-yes">3x</span>
1398
+ <span class="cline-any cline-yes">10x</span>
1399
+ <span class="cline-any cline-yes">10x</span>
1400
+ <span class="cline-any cline-yes">10x</span>
1401
+ <span class="cline-any cline-yes">10x</span>
1402
+ <span class="cline-any cline-yes">10x</span>
1403
+ <span class="cline-any cline-yes">10x</span>
1404
+ <span class="cline-any cline-yes">10x</span>
898
1405
  <span class="cline-any cline-no">&nbsp;</span>
899
1406
  <span class="cline-any cline-no">&nbsp;</span>
900
1407
  <span class="cline-any cline-no">&nbsp;</span>
1408
+ <span class="cline-any cline-yes">10x</span>
1409
+ <span class="cline-any cline-yes">10x</span>
1410
+ <span class="cline-any cline-yes">10x</span>
1411
+ <span class="cline-any cline-yes">10x</span>
1412
+ <span class="cline-any cline-yes">10x</span>
1413
+ <span class="cline-any cline-yes">10x</span>
901
1414
  <span class="cline-any cline-no">&nbsp;</span>
902
1415
  <span class="cline-any cline-no">&nbsp;</span>
1416
+ <span class="cline-any cline-yes">10x</span>
1417
+ <span class="cline-any cline-yes">10x</span>
1418
+ <span class="cline-any cline-yes">10x</span>
1419
+ <span class="cline-any cline-yes">10x</span>
1420
+ <span class="cline-any cline-yes">10x</span>
1421
+ <span class="cline-any cline-yes">10x</span>
1422
+ <span class="cline-any cline-yes">10x</span>
903
1423
  <span class="cline-any cline-no">&nbsp;</span>
904
1424
  <span class="cline-any cline-no">&nbsp;</span>
905
1425
  <span class="cline-any cline-no">&nbsp;</span>
906
1426
  <span class="cline-any cline-no">&nbsp;</span>
1427
+ <span class="cline-any cline-yes">10x</span>
1428
+ <span class="cline-any cline-yes">10x</span>
1429
+ <span class="cline-any cline-yes">10x</span>
1430
+ <span class="cline-any cline-yes">10x</span>
1431
+ <span class="cline-any cline-yes">10x</span>
1432
+ <span class="cline-any cline-yes">1x</span>
1433
+ <span class="cline-any cline-yes">1x</span>
1434
+ <span class="cline-any cline-yes">1x</span>
907
1435
  <span class="cline-any cline-no">&nbsp;</span>
1436
+ <span class="cline-any cline-yes">1x</span>
908
1437
  <span class="cline-any cline-no">&nbsp;</span>
909
1438
  <span class="cline-any cline-no">&nbsp;</span>
910
1439
  <span class="cline-any cline-no">&nbsp;</span>
@@ -913,11 +1442,33 @@
913
1442
  <span class="cline-any cline-no">&nbsp;</span>
914
1443
  <span class="cline-any cline-no">&nbsp;</span>
915
1444
  <span class="cline-any cline-no">&nbsp;</span>
1445
+ <span class="cline-any cline-yes">1x</span>
1446
+ <span class="cline-any cline-yes">1x</span>
1447
+ <span class="cline-any cline-yes">1x</span>
916
1448
  <span class="cline-any cline-no">&nbsp;</span>
917
1449
  <span class="cline-any cline-no">&nbsp;</span>
1450
+ <span class="cline-any cline-yes">1x</span>
1451
+ <span class="cline-any cline-yes">1x</span>
1452
+ <span class="cline-any cline-yes">1x</span>
1453
+ <span class="cline-any cline-yes">1x</span>
1454
+ <span class="cline-any cline-yes">1x</span>
918
1455
  <span class="cline-any cline-no">&nbsp;</span>
919
1456
  <span class="cline-any cline-no">&nbsp;</span>
920
1457
  <span class="cline-any cline-no">&nbsp;</span>
1458
+ <span class="cline-any cline-yes">1x</span>
1459
+ <span class="cline-any cline-yes">10x</span>
1460
+ <span class="cline-any cline-yes">10x</span>
1461
+ <span class="cline-any cline-yes">10x</span>
1462
+ <span class="cline-any cline-yes">10x</span>
1463
+ <span class="cline-any cline-yes">10x</span>
1464
+ <span class="cline-any cline-yes">2x</span>
1465
+ <span class="cline-any cline-yes">2x</span>
1466
+ <span class="cline-any cline-yes">2x</span>
1467
+ <span class="cline-any cline-yes">2x</span>
1468
+ <span class="cline-any cline-yes">2x</span>
1469
+ <span class="cline-any cline-yes">1x</span>
1470
+ <span class="cline-any cline-yes">1x</span>
1471
+ <span class="cline-any cline-yes">2x</span>
921
1472
  <span class="cline-any cline-no">&nbsp;</span>
922
1473
  <span class="cline-any cline-no">&nbsp;</span>
923
1474
  <span class="cline-any cline-no">&nbsp;</span>
@@ -940,6 +1491,35 @@
940
1491
  <span class="cline-any cline-no">&nbsp;</span>
941
1492
  <span class="cline-any cline-no">&nbsp;</span>
942
1493
  <span class="cline-any cline-no">&nbsp;</span>
1494
+ <span class="cline-any cline-yes">2x</span>
1495
+ <span class="cline-any cline-yes">10x</span>
1496
+ <span class="cline-any cline-yes">10x</span>
1497
+ <span class="cline-any cline-yes">10x</span>
1498
+ <span class="cline-any cline-yes">10x</span>
1499
+ <span class="cline-any cline-yes">10x</span>
1500
+ <span class="cline-any cline-yes">1x</span>
1501
+ <span class="cline-any cline-yes">1x</span>
1502
+ <span class="cline-any cline-yes">1x</span>
1503
+ <span class="cline-any cline-yes">1x</span>
1504
+ <span class="cline-any cline-yes">1x</span>
1505
+ <span class="cline-any cline-yes">1x</span>
1506
+ <span class="cline-any cline-yes">1x</span>
1507
+ <span class="cline-any cline-yes">1x</span>
1508
+ <span class="cline-any cline-yes">1x</span>
1509
+ <span class="cline-any cline-yes">1x</span>
1510
+ <span class="cline-any cline-yes">1x</span>
1511
+ <span class="cline-any cline-yes">1x</span>
1512
+ <span class="cline-any cline-yes">1x</span>
1513
+ <span class="cline-any cline-yes">1x</span>
1514
+ <span class="cline-any cline-yes">1x</span>
1515
+ <span class="cline-any cline-yes">1x</span>
1516
+ <span class="cline-any cline-yes">1x</span>
1517
+ <span class="cline-any cline-yes">1x</span>
1518
+ <span class="cline-any cline-yes">1x</span>
1519
+ <span class="cline-any cline-yes">1x</span>
1520
+ <span class="cline-any cline-yes">1x</span>
1521
+ <span class="cline-any cline-yes">1x</span>
1522
+ <span class="cline-any cline-yes">1x</span>
943
1523
  <span class="cline-any cline-no">&nbsp;</span>
944
1524
  <span class="cline-any cline-no">&nbsp;</span>
945
1525
  <span class="cline-any cline-no">&nbsp;</span>
@@ -963,6 +1543,11 @@
963
1543
  <span class="cline-any cline-no">&nbsp;</span>
964
1544
  <span class="cline-any cline-no">&nbsp;</span>
965
1545
  <span class="cline-any cline-no">&nbsp;</span>
1546
+ <span class="cline-any cline-yes">1x</span>
1547
+ <span class="cline-any cline-yes">1x</span>
1548
+ <span class="cline-any cline-yes">1x</span>
1549
+ <span class="cline-any cline-yes">1x</span>
1550
+ <span class="cline-any cline-yes">1x</span>
966
1551
  <span class="cline-any cline-no">&nbsp;</span>
967
1552
  <span class="cline-any cline-no">&nbsp;</span>
968
1553
  <span class="cline-any cline-no">&nbsp;</span>
@@ -973,8 +1558,27 @@
973
1558
  <span class="cline-any cline-no">&nbsp;</span>
974
1559
  <span class="cline-any cline-no">&nbsp;</span>
975
1560
  <span class="cline-any cline-no">&nbsp;</span>
1561
+ <span class="cline-any cline-yes">1x</span>
1562
+ <span class="cline-any cline-yes">10x</span>
1563
+ <span class="cline-any cline-yes">10x</span>
1564
+ <span class="cline-any cline-yes">10x</span>
1565
+ <span class="cline-any cline-yes">10x</span>
1566
+ <span class="cline-any cline-yes">10x</span>
976
1567
  <span class="cline-any cline-no">&nbsp;</span>
977
1568
  <span class="cline-any cline-no">&nbsp;</span>
1569
+ <span class="cline-any cline-yes">10x</span>
1570
+ <span class="cline-any cline-yes">10x</span>
1571
+ <span class="cline-any cline-yes">10x</span>
1572
+ <span class="cline-any cline-yes">10x</span>
1573
+ <span class="cline-any cline-yes">10x</span>
1574
+ <span class="cline-any cline-yes">10x</span>
1575
+ <span class="cline-any cline-yes">10x</span>
1576
+ <span class="cline-any cline-yes">10x</span>
1577
+ <span class="cline-any cline-yes">10x</span>
1578
+ <span class="cline-any cline-yes">10x</span>
1579
+ <span class="cline-any cline-yes">10x</span>
1580
+ <span class="cline-any cline-yes">10x</span>
1581
+ <span class="cline-any cline-yes">10x</span>
978
1582
  <span class="cline-any cline-no">&nbsp;</span>
979
1583
  <span class="cline-any cline-no">&nbsp;</span>
980
1584
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1003,6 +1607,12 @@
1003
1607
  <span class="cline-any cline-no">&nbsp;</span>
1004
1608
  <span class="cline-any cline-no">&nbsp;</span>
1005
1609
  <span class="cline-any cline-no">&nbsp;</span>
1610
+ <span class="cline-any cline-yes">10x</span>
1611
+ <span class="cline-any cline-yes">10x</span>
1612
+ <span class="cline-any cline-yes">10x</span>
1613
+ <span class="cline-any cline-yes">10x</span>
1614
+ <span class="cline-any cline-yes">10x</span>
1615
+ <span class="cline-any cline-yes">10x</span>
1006
1616
  <span class="cline-any cline-no">&nbsp;</span>
1007
1617
  <span class="cline-any cline-no">&nbsp;</span>
1008
1618
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1025,700 +1635,287 @@
1025
1635
  <span class="cline-any cline-no">&nbsp;</span>
1026
1636
  <span class="cline-any cline-no">&nbsp;</span>
1027
1637
  <span class="cline-any cline-no">&nbsp;</span>
1638
+ <span class="cline-any cline-yes">10x</span>
1639
+ <span class="cline-any cline-yes">10x</span>
1640
+ <span class="cline-any cline-yes">10x</span>
1641
+ <span class="cline-any cline-yes">10x</span>
1642
+ <span class="cline-any cline-yes">10x</span>
1028
1643
  <span class="cline-any cline-no">&nbsp;</span>
1029
1644
  <span class="cline-any cline-no">&nbsp;</span>
1030
1645
  <span class="cline-any cline-no">&nbsp;</span>
1031
1646
  <span class="cline-any cline-no">&nbsp;</span>
1647
+ <span class="cline-any cline-yes">10x</span>
1648
+ <span class="cline-any cline-yes">10x</span>
1649
+ <span class="cline-any cline-yes">10x</span>
1650
+ <span class="cline-any cline-yes">10x</span>
1651
+ <span class="cline-any cline-yes">10x</span>
1032
1652
  <span class="cline-any cline-no">&nbsp;</span>
1033
1653
  <span class="cline-any cline-no">&nbsp;</span>
1034
1654
  <span class="cline-any cline-no">&nbsp;</span>
1035
1655
  <span class="cline-any cline-no">&nbsp;</span>
1656
+ <span class="cline-any cline-yes">10x</span>
1657
+ <span class="cline-any cline-yes">10x</span>
1658
+ <span class="cline-any cline-yes">10x</span>
1659
+ <span class="cline-any cline-yes">10x</span>
1660
+ <span class="cline-any cline-yes">10x</span>
1036
1661
  <span class="cline-any cline-no">&nbsp;</span>
1037
1662
  <span class="cline-any cline-no">&nbsp;</span>
1038
1663
  <span class="cline-any cline-no">&nbsp;</span>
1039
1664
  <span class="cline-any cline-no">&nbsp;</span>
1040
- <span class="cline-any cline-no">&nbsp;</span>
1041
- <span class="cline-any cline-no">&nbsp;</span>
1042
- <span class="cline-any cline-no">&nbsp;</span>
1043
- <span class="cline-any cline-no">&nbsp;</span>
1044
- <span class="cline-any cline-no">&nbsp;</span>
1045
- <span class="cline-any cline-no">&nbsp;</span>
1046
- <span class="cline-any cline-no">&nbsp;</span>
1047
- <span class="cline-any cline-no">&nbsp;</span>
1048
- <span class="cline-any cline-no">&nbsp;</span>
1049
- <span class="cline-any cline-no">&nbsp;</span>
1050
- <span class="cline-any cline-no">&nbsp;</span>
1051
- <span class="cline-any cline-no">&nbsp;</span>
1052
- <span class="cline-any cline-no">&nbsp;</span>
1053
- <span class="cline-any cline-no">&nbsp;</span>
1054
- <span class="cline-any cline-no">&nbsp;</span>
1055
- <span class="cline-any cline-no">&nbsp;</span>
1056
- <span class="cline-any cline-no">&nbsp;</span>
1057
- <span class="cline-any cline-no">&nbsp;</span>
1058
- <span class="cline-any cline-no">&nbsp;</span>
1059
- <span class="cline-any cline-no">&nbsp;</span>
1060
- <span class="cline-any cline-no">&nbsp;</span>
1061
- <span class="cline-any cline-no">&nbsp;</span>
1062
- <span class="cline-any cline-no">&nbsp;</span>
1063
- <span class="cline-any cline-no">&nbsp;</span>
1064
- <span class="cline-any cline-no">&nbsp;</span>
1065
- <span class="cline-any cline-no">&nbsp;</span>
1066
- <span class="cline-any cline-no">&nbsp;</span>
1067
- <span class="cline-any cline-no">&nbsp;</span>
1068
- <span class="cline-any cline-no">&nbsp;</span>
1069
- <span class="cline-any cline-no">&nbsp;</span>
1070
- <span class="cline-any cline-no">&nbsp;</span>
1071
- <span class="cline-any cline-no">&nbsp;</span>
1072
- <span class="cline-any cline-no">&nbsp;</span>
1073
- <span class="cline-any cline-no">&nbsp;</span>
1074
- <span class="cline-any cline-no">&nbsp;</span>
1075
- <span class="cline-any cline-no">&nbsp;</span>
1076
- <span class="cline-any cline-no">&nbsp;</span>
1077
- <span class="cline-any cline-no">&nbsp;</span>
1078
- <span class="cline-any cline-no">&nbsp;</span>
1079
- <span class="cline-any cline-no">&nbsp;</span>
1080
- <span class="cline-any cline-no">&nbsp;</span>
1081
- <span class="cline-any cline-no">&nbsp;</span>
1082
- <span class="cline-any cline-no">&nbsp;</span>
1083
- <span class="cline-any cline-no">&nbsp;</span>
1084
- <span class="cline-any cline-no">&nbsp;</span>
1085
- <span class="cline-any cline-no">&nbsp;</span>
1086
- <span class="cline-any cline-no">&nbsp;</span>
1087
- <span class="cline-any cline-no">&nbsp;</span>
1088
- <span class="cline-any cline-no">&nbsp;</span>
1089
- <span class="cline-any cline-no">&nbsp;</span>
1090
- <span class="cline-any cline-no">&nbsp;</span>
1091
- <span class="cline-any cline-no">&nbsp;</span>
1092
- <span class="cline-any cline-no">&nbsp;</span>
1093
- <span class="cline-any cline-no">&nbsp;</span>
1094
- <span class="cline-any cline-no">&nbsp;</span>
1095
- <span class="cline-any cline-no">&nbsp;</span>
1096
- <span class="cline-any cline-no">&nbsp;</span>
1097
- <span class="cline-any cline-no">&nbsp;</span>
1098
- <span class="cline-any cline-no">&nbsp;</span>
1099
- <span class="cline-any cline-no">&nbsp;</span>
1100
- <span class="cline-any cline-no">&nbsp;</span>
1101
- <span class="cline-any cline-no">&nbsp;</span>
1102
- <span class="cline-any cline-no">&nbsp;</span>
1103
- <span class="cline-any cline-no">&nbsp;</span>
1104
- <span class="cline-any cline-no">&nbsp;</span>
1105
- <span class="cline-any cline-no">&nbsp;</span>
1106
- <span class="cline-any cline-no">&nbsp;</span>
1107
- <span class="cline-any cline-no">&nbsp;</span>
1108
- <span class="cline-any cline-no">&nbsp;</span>
1109
- <span class="cline-any cline-no">&nbsp;</span>
1110
- <span class="cline-any cline-no">&nbsp;</span>
1111
- <span class="cline-any cline-no">&nbsp;</span>
1112
- <span class="cline-any cline-no">&nbsp;</span>
1113
- <span class="cline-any cline-no">&nbsp;</span>
1114
- <span class="cline-any cline-no">&nbsp;</span>
1115
- <span class="cline-any cline-no">&nbsp;</span>
1116
- <span class="cline-any cline-no">&nbsp;</span>
1117
- <span class="cline-any cline-no">&nbsp;</span>
1118
- <span class="cline-any cline-no">&nbsp;</span>
1119
- <span class="cline-any cline-no">&nbsp;</span>
1120
- <span class="cline-any cline-no">&nbsp;</span>
1121
- <span class="cline-any cline-no">&nbsp;</span>
1122
- <span class="cline-any cline-no">&nbsp;</span>
1123
- <span class="cline-any cline-no">&nbsp;</span>
1124
- <span class="cline-any cline-no">&nbsp;</span>
1125
- <span class="cline-any cline-no">&nbsp;</span>
1126
- <span class="cline-any cline-no">&nbsp;</span>
1127
- <span class="cline-any cline-no">&nbsp;</span>
1128
- <span class="cline-any cline-no">&nbsp;</span>
1129
- <span class="cline-any cline-no">&nbsp;</span>
1130
- <span class="cline-any cline-no">&nbsp;</span>
1131
- <span class="cline-any cline-no">&nbsp;</span>
1132
- <span class="cline-any cline-no">&nbsp;</span>
1133
- <span class="cline-any cline-no">&nbsp;</span>
1134
- <span class="cline-any cline-no">&nbsp;</span>
1135
- <span class="cline-any cline-no">&nbsp;</span>
1136
- <span class="cline-any cline-no">&nbsp;</span>
1137
- <span class="cline-any cline-no">&nbsp;</span>
1138
- <span class="cline-any cline-no">&nbsp;</span>
1139
- <span class="cline-any cline-no">&nbsp;</span>
1140
- <span class="cline-any cline-no">&nbsp;</span>
1141
- <span class="cline-any cline-no">&nbsp;</span>
1142
- <span class="cline-any cline-no">&nbsp;</span>
1143
- <span class="cline-any cline-no">&nbsp;</span>
1144
- <span class="cline-any cline-no">&nbsp;</span>
1145
- <span class="cline-any cline-no">&nbsp;</span>
1146
- <span class="cline-any cline-no">&nbsp;</span>
1147
- <span class="cline-any cline-no">&nbsp;</span>
1148
- <span class="cline-any cline-no">&nbsp;</span>
1149
- <span class="cline-any cline-no">&nbsp;</span>
1150
- <span class="cline-any cline-no">&nbsp;</span>
1151
- <span class="cline-any cline-no">&nbsp;</span>
1152
- <span class="cline-any cline-no">&nbsp;</span>
1153
- <span class="cline-any cline-no">&nbsp;</span>
1154
- <span class="cline-any cline-no">&nbsp;</span>
1155
- <span class="cline-any cline-no">&nbsp;</span>
1156
- <span class="cline-any cline-no">&nbsp;</span>
1157
- <span class="cline-any cline-no">&nbsp;</span>
1158
- <span class="cline-any cline-no">&nbsp;</span>
1159
- <span class="cline-any cline-no">&nbsp;</span>
1160
- <span class="cline-any cline-no">&nbsp;</span>
1161
- <span class="cline-any cline-no">&nbsp;</span>
1162
- <span class="cline-any cline-no">&nbsp;</span>
1163
- <span class="cline-any cline-no">&nbsp;</span>
1164
- <span class="cline-any cline-no">&nbsp;</span>
1165
- <span class="cline-any cline-no">&nbsp;</span>
1166
- <span class="cline-any cline-no">&nbsp;</span>
1167
- <span class="cline-any cline-no">&nbsp;</span>
1168
- <span class="cline-any cline-no">&nbsp;</span>
1169
- <span class="cline-any cline-no">&nbsp;</span>
1170
- <span class="cline-any cline-no">&nbsp;</span>
1171
- <span class="cline-any cline-no">&nbsp;</span>
1172
- <span class="cline-any cline-no">&nbsp;</span>
1173
- <span class="cline-any cline-no">&nbsp;</span>
1174
- <span class="cline-any cline-no">&nbsp;</span>
1175
- <span class="cline-any cline-no">&nbsp;</span>
1176
- <span class="cline-any cline-no">&nbsp;</span>
1177
- <span class="cline-any cline-no">&nbsp;</span>
1178
- <span class="cline-any cline-no">&nbsp;</span>
1179
- <span class="cline-any cline-no">&nbsp;</span>
1180
- <span class="cline-any cline-no">&nbsp;</span>
1181
- <span class="cline-any cline-no">&nbsp;</span>
1182
- <span class="cline-any cline-no">&nbsp;</span>
1183
- <span class="cline-any cline-no">&nbsp;</span>
1184
- <span class="cline-any cline-no">&nbsp;</span>
1185
- <span class="cline-any cline-no">&nbsp;</span>
1186
- <span class="cline-any cline-no">&nbsp;</span>
1187
- <span class="cline-any cline-no">&nbsp;</span>
1188
- <span class="cline-any cline-no">&nbsp;</span>
1189
- <span class="cline-any cline-no">&nbsp;</span>
1190
- <span class="cline-any cline-no">&nbsp;</span>
1191
- <span class="cline-any cline-no">&nbsp;</span>
1192
- <span class="cline-any cline-no">&nbsp;</span>
1193
- <span class="cline-any cline-no">&nbsp;</span>
1194
- <span class="cline-any cline-no">&nbsp;</span>
1195
- <span class="cline-any cline-no">&nbsp;</span>
1196
- <span class="cline-any cline-no">&nbsp;</span>
1197
- <span class="cline-any cline-no">&nbsp;</span>
1198
- <span class="cline-any cline-no">&nbsp;</span>
1199
- <span class="cline-any cline-no">&nbsp;</span>
1200
- <span class="cline-any cline-no">&nbsp;</span>
1201
- <span class="cline-any cline-no">&nbsp;</span>
1202
- <span class="cline-any cline-no">&nbsp;</span>
1203
- <span class="cline-any cline-no">&nbsp;</span>
1204
- <span class="cline-any cline-no">&nbsp;</span>
1205
- <span class="cline-any cline-no">&nbsp;</span>
1206
- <span class="cline-any cline-no">&nbsp;</span>
1207
- <span class="cline-any cline-no">&nbsp;</span>
1208
- <span class="cline-any cline-no">&nbsp;</span>
1209
- <span class="cline-any cline-no">&nbsp;</span>
1210
- <span class="cline-any cline-no">&nbsp;</span>
1211
- <span class="cline-any cline-no">&nbsp;</span>
1212
- <span class="cline-any cline-no">&nbsp;</span>
1213
- <span class="cline-any cline-no">&nbsp;</span>
1214
- <span class="cline-any cline-no">&nbsp;</span>
1215
- <span class="cline-any cline-no">&nbsp;</span>
1216
- <span class="cline-any cline-no">&nbsp;</span>
1217
- <span class="cline-any cline-no">&nbsp;</span>
1218
- <span class="cline-any cline-no">&nbsp;</span>
1219
- <span class="cline-any cline-no">&nbsp;</span>
1220
- <span class="cline-any cline-no">&nbsp;</span>
1221
- <span class="cline-any cline-no">&nbsp;</span>
1222
- <span class="cline-any cline-no">&nbsp;</span>
1223
- <span class="cline-any cline-no">&nbsp;</span>
1224
- <span class="cline-any cline-no">&nbsp;</span>
1225
- <span class="cline-any cline-no">&nbsp;</span>
1226
- <span class="cline-any cline-no">&nbsp;</span>
1227
- <span class="cline-any cline-no">&nbsp;</span>
1228
- <span class="cline-any cline-no">&nbsp;</span>
1229
- <span class="cline-any cline-no">&nbsp;</span>
1230
- <span class="cline-any cline-no">&nbsp;</span>
1231
- <span class="cline-any cline-no">&nbsp;</span>
1232
- <span class="cline-any cline-no">&nbsp;</span>
1233
- <span class="cline-any cline-no">&nbsp;</span>
1234
- <span class="cline-any cline-no">&nbsp;</span>
1235
- <span class="cline-any cline-no">&nbsp;</span>
1236
- <span class="cline-any cline-no">&nbsp;</span>
1237
- <span class="cline-any cline-no">&nbsp;</span>
1238
- <span class="cline-any cline-no">&nbsp;</span>
1239
- <span class="cline-any cline-no">&nbsp;</span>
1240
- <span class="cline-any cline-no">&nbsp;</span>
1241
- <span class="cline-any cline-no">&nbsp;</span>
1242
- <span class="cline-any cline-no">&nbsp;</span>
1243
- <span class="cline-any cline-no">&nbsp;</span>
1244
- <span class="cline-any cline-no">&nbsp;</span>
1245
- <span class="cline-any cline-no">&nbsp;</span>
1246
- <span class="cline-any cline-no">&nbsp;</span>
1247
- <span class="cline-any cline-no">&nbsp;</span>
1248
- <span class="cline-any cline-no">&nbsp;</span>
1249
- <span class="cline-any cline-no">&nbsp;</span>
1250
- <span class="cline-any cline-no">&nbsp;</span>
1251
- <span class="cline-any cline-no">&nbsp;</span>
1252
- <span class="cline-any cline-no">&nbsp;</span>
1253
- <span class="cline-any cline-no">&nbsp;</span>
1254
- <span class="cline-any cline-no">&nbsp;</span>
1255
- <span class="cline-any cline-no">&nbsp;</span>
1256
- <span class="cline-any cline-no">&nbsp;</span>
1257
- <span class="cline-any cline-no">&nbsp;</span>
1258
- <span class="cline-any cline-no">&nbsp;</span>
1259
- <span class="cline-any cline-no">&nbsp;</span>
1260
- <span class="cline-any cline-no">&nbsp;</span>
1261
- <span class="cline-any cline-no">&nbsp;</span>
1262
- <span class="cline-any cline-no">&nbsp;</span>
1263
- <span class="cline-any cline-no">&nbsp;</span>
1264
- <span class="cline-any cline-no">&nbsp;</span>
1265
- <span class="cline-any cline-no">&nbsp;</span>
1266
- <span class="cline-any cline-no">&nbsp;</span>
1267
- <span class="cline-any cline-no">&nbsp;</span>
1268
- <span class="cline-any cline-no">&nbsp;</span>
1269
- <span class="cline-any cline-no">&nbsp;</span>
1270
- <span class="cline-any cline-no">&nbsp;</span>
1271
- <span class="cline-any cline-no">&nbsp;</span>
1272
- <span class="cline-any cline-no">&nbsp;</span>
1273
- <span class="cline-any cline-no">&nbsp;</span>
1274
- <span class="cline-any cline-no">&nbsp;</span>
1275
- <span class="cline-any cline-no">&nbsp;</span>
1276
- <span class="cline-any cline-no">&nbsp;</span>
1277
- <span class="cline-any cline-no">&nbsp;</span>
1278
- <span class="cline-any cline-no">&nbsp;</span>
1279
- <span class="cline-any cline-no">&nbsp;</span>
1280
- <span class="cline-any cline-no">&nbsp;</span>
1281
- <span class="cline-any cline-no">&nbsp;</span>
1282
- <span class="cline-any cline-no">&nbsp;</span>
1283
- <span class="cline-any cline-no">&nbsp;</span>
1284
- <span class="cline-any cline-no">&nbsp;</span>
1285
- <span class="cline-any cline-no">&nbsp;</span>
1286
- <span class="cline-any cline-no">&nbsp;</span>
1287
- <span class="cline-any cline-no">&nbsp;</span>
1288
- <span class="cline-any cline-no">&nbsp;</span>
1289
- <span class="cline-any cline-no">&nbsp;</span>
1290
- <span class="cline-any cline-no">&nbsp;</span>
1291
- <span class="cline-any cline-no">&nbsp;</span>
1292
- <span class="cline-any cline-no">&nbsp;</span>
1293
- <span class="cline-any cline-no">&nbsp;</span>
1294
- <span class="cline-any cline-no">&nbsp;</span>
1295
- <span class="cline-any cline-no">&nbsp;</span>
1296
- <span class="cline-any cline-no">&nbsp;</span>
1297
- <span class="cline-any cline-no">&nbsp;</span>
1298
- <span class="cline-any cline-no">&nbsp;</span>
1299
- <span class="cline-any cline-no">&nbsp;</span>
1300
- <span class="cline-any cline-no">&nbsp;</span>
1301
- <span class="cline-any cline-no">&nbsp;</span>
1302
- <span class="cline-any cline-no">&nbsp;</span>
1303
- <span class="cline-any cline-no">&nbsp;</span>
1304
- <span class="cline-any cline-no">&nbsp;</span>
1305
- <span class="cline-any cline-no">&nbsp;</span>
1306
- <span class="cline-any cline-no">&nbsp;</span>
1307
- <span class="cline-any cline-no">&nbsp;</span>
1308
- <span class="cline-any cline-no">&nbsp;</span>
1309
- <span class="cline-any cline-no">&nbsp;</span>
1310
- <span class="cline-any cline-no">&nbsp;</span>
1311
- <span class="cline-any cline-no">&nbsp;</span>
1312
- <span class="cline-any cline-no">&nbsp;</span>
1313
- <span class="cline-any cline-no">&nbsp;</span>
1314
- <span class="cline-any cline-no">&nbsp;</span>
1315
- <span class="cline-any cline-no">&nbsp;</span>
1316
- <span class="cline-any cline-no">&nbsp;</span>
1317
- <span class="cline-any cline-no">&nbsp;</span>
1318
- <span class="cline-any cline-no">&nbsp;</span>
1319
- <span class="cline-any cline-no">&nbsp;</span>
1320
- <span class="cline-any cline-no">&nbsp;</span>
1321
- <span class="cline-any cline-no">&nbsp;</span>
1322
- <span class="cline-any cline-no">&nbsp;</span>
1323
- <span class="cline-any cline-no">&nbsp;</span>
1324
- <span class="cline-any cline-no">&nbsp;</span>
1325
- <span class="cline-any cline-no">&nbsp;</span>
1326
- <span class="cline-any cline-no">&nbsp;</span>
1327
- <span class="cline-any cline-no">&nbsp;</span>
1328
- <span class="cline-any cline-no">&nbsp;</span>
1329
- <span class="cline-any cline-no">&nbsp;</span>
1330
- <span class="cline-any cline-no">&nbsp;</span>
1331
- <span class="cline-any cline-no">&nbsp;</span>
1332
- <span class="cline-any cline-no">&nbsp;</span>
1333
- <span class="cline-any cline-no">&nbsp;</span>
1334
- <span class="cline-any cline-no">&nbsp;</span>
1335
- <span class="cline-any cline-no">&nbsp;</span>
1336
- <span class="cline-any cline-no">&nbsp;</span>
1337
- <span class="cline-any cline-no">&nbsp;</span>
1338
- <span class="cline-any cline-no">&nbsp;</span>
1339
- <span class="cline-any cline-no">&nbsp;</span>
1340
- <span class="cline-any cline-no">&nbsp;</span>
1341
- <span class="cline-any cline-no">&nbsp;</span>
1342
- <span class="cline-any cline-no">&nbsp;</span>
1343
- <span class="cline-any cline-no">&nbsp;</span>
1344
- <span class="cline-any cline-no">&nbsp;</span>
1345
- <span class="cline-any cline-no">&nbsp;</span>
1346
- <span class="cline-any cline-no">&nbsp;</span>
1347
- <span class="cline-any cline-no">&nbsp;</span>
1348
- <span class="cline-any cline-no">&nbsp;</span>
1349
- <span class="cline-any cline-no">&nbsp;</span>
1350
- <span class="cline-any cline-no">&nbsp;</span>
1351
- <span class="cline-any cline-no">&nbsp;</span>
1352
- <span class="cline-any cline-no">&nbsp;</span>
1353
- <span class="cline-any cline-no">&nbsp;</span>
1354
- <span class="cline-any cline-no">&nbsp;</span>
1355
- <span class="cline-any cline-no">&nbsp;</span>
1356
- <span class="cline-any cline-no">&nbsp;</span>
1357
- <span class="cline-any cline-no">&nbsp;</span>
1358
- <span class="cline-any cline-no">&nbsp;</span>
1359
- <span class="cline-any cline-no">&nbsp;</span>
1360
- <span class="cline-any cline-no">&nbsp;</span>
1361
- <span class="cline-any cline-no">&nbsp;</span>
1362
- <span class="cline-any cline-no">&nbsp;</span>
1363
- <span class="cline-any cline-no">&nbsp;</span>
1364
- <span class="cline-any cline-no">&nbsp;</span>
1365
- <span class="cline-any cline-no">&nbsp;</span>
1366
- <span class="cline-any cline-no">&nbsp;</span>
1367
- <span class="cline-any cline-no">&nbsp;</span>
1368
- <span class="cline-any cline-no">&nbsp;</span>
1369
- <span class="cline-any cline-no">&nbsp;</span>
1370
- <span class="cline-any cline-no">&nbsp;</span>
1371
- <span class="cline-any cline-no">&nbsp;</span>
1372
- <span class="cline-any cline-no">&nbsp;</span>
1373
- <span class="cline-any cline-no">&nbsp;</span>
1374
- <span class="cline-any cline-no">&nbsp;</span>
1375
- <span class="cline-any cline-no">&nbsp;</span>
1376
- <span class="cline-any cline-no">&nbsp;</span>
1377
- <span class="cline-any cline-no">&nbsp;</span>
1378
- <span class="cline-any cline-no">&nbsp;</span>
1379
- <span class="cline-any cline-no">&nbsp;</span>
1380
- <span class="cline-any cline-no">&nbsp;</span>
1381
- <span class="cline-any cline-no">&nbsp;</span>
1382
- <span class="cline-any cline-no">&nbsp;</span>
1383
- <span class="cline-any cline-no">&nbsp;</span>
1384
- <span class="cline-any cline-no">&nbsp;</span>
1385
- <span class="cline-any cline-no">&nbsp;</span>
1386
- <span class="cline-any cline-no">&nbsp;</span>
1387
- <span class="cline-any cline-no">&nbsp;</span>
1388
- <span class="cline-any cline-no">&nbsp;</span>
1389
- <span class="cline-any cline-no">&nbsp;</span>
1390
- <span class="cline-any cline-no">&nbsp;</span>
1391
- <span class="cline-any cline-no">&nbsp;</span>
1392
- <span class="cline-any cline-no">&nbsp;</span>
1393
- <span class="cline-any cline-no">&nbsp;</span>
1394
- <span class="cline-any cline-no">&nbsp;</span>
1395
- <span class="cline-any cline-no">&nbsp;</span>
1396
- <span class="cline-any cline-no">&nbsp;</span>
1397
- <span class="cline-any cline-no">&nbsp;</span>
1398
- <span class="cline-any cline-no">&nbsp;</span>
1399
- <span class="cline-any cline-no">&nbsp;</span>
1400
- <span class="cline-any cline-no">&nbsp;</span>
1401
- <span class="cline-any cline-no">&nbsp;</span>
1402
- <span class="cline-any cline-no">&nbsp;</span>
1403
- <span class="cline-any cline-no">&nbsp;</span>
1404
- <span class="cline-any cline-no">&nbsp;</span>
1405
- <span class="cline-any cline-no">&nbsp;</span>
1406
- <span class="cline-any cline-no">&nbsp;</span>
1407
- <span class="cline-any cline-no">&nbsp;</span>
1408
- <span class="cline-any cline-no">&nbsp;</span>
1409
- <span class="cline-any cline-no">&nbsp;</span>
1410
- <span class="cline-any cline-no">&nbsp;</span>
1411
- <span class="cline-any cline-no">&nbsp;</span>
1412
- <span class="cline-any cline-no">&nbsp;</span>
1413
- <span class="cline-any cline-no">&nbsp;</span>
1414
- <span class="cline-any cline-no">&nbsp;</span>
1415
- <span class="cline-any cline-no">&nbsp;</span>
1416
- <span class="cline-any cline-no">&nbsp;</span>
1417
- <span class="cline-any cline-no">&nbsp;</span>
1418
- <span class="cline-any cline-no">&nbsp;</span>
1419
- <span class="cline-any cline-no">&nbsp;</span>
1420
- <span class="cline-any cline-no">&nbsp;</span>
1421
- <span class="cline-any cline-no">&nbsp;</span>
1422
- <span class="cline-any cline-no">&nbsp;</span>
1423
- <span class="cline-any cline-no">&nbsp;</span>
1424
- <span class="cline-any cline-no">&nbsp;</span>
1425
- <span class="cline-any cline-no">&nbsp;</span>
1426
- <span class="cline-any cline-no">&nbsp;</span>
1427
- <span class="cline-any cline-no">&nbsp;</span>
1428
- <span class="cline-any cline-no">&nbsp;</span>
1429
- <span class="cline-any cline-no">&nbsp;</span>
1430
- <span class="cline-any cline-no">&nbsp;</span>
1431
- <span class="cline-any cline-no">&nbsp;</span>
1432
- <span class="cline-any cline-no">&nbsp;</span>
1433
- <span class="cline-any cline-no">&nbsp;</span>
1434
- <span class="cline-any cline-no">&nbsp;</span>
1435
- <span class="cline-any cline-no">&nbsp;</span>
1436
- <span class="cline-any cline-no">&nbsp;</span>
1437
- <span class="cline-any cline-no">&nbsp;</span>
1438
- <span class="cline-any cline-no">&nbsp;</span>
1439
- <span class="cline-any cline-no">&nbsp;</span>
1440
- <span class="cline-any cline-no">&nbsp;</span>
1441
- <span class="cline-any cline-no">&nbsp;</span>
1442
- <span class="cline-any cline-no">&nbsp;</span>
1443
- <span class="cline-any cline-no">&nbsp;</span>
1444
- <span class="cline-any cline-no">&nbsp;</span>
1445
- <span class="cline-any cline-no">&nbsp;</span>
1446
- <span class="cline-any cline-no">&nbsp;</span>
1447
- <span class="cline-any cline-no">&nbsp;</span>
1448
- <span class="cline-any cline-no">&nbsp;</span>
1449
- <span class="cline-any cline-no">&nbsp;</span>
1450
- <span class="cline-any cline-no">&nbsp;</span>
1451
- <span class="cline-any cline-no">&nbsp;</span>
1452
- <span class="cline-any cline-no">&nbsp;</span>
1453
- <span class="cline-any cline-no">&nbsp;</span>
1454
- <span class="cline-any cline-no">&nbsp;</span>
1455
- <span class="cline-any cline-no">&nbsp;</span>
1456
- <span class="cline-any cline-no">&nbsp;</span>
1457
- <span class="cline-any cline-no">&nbsp;</span>
1458
- <span class="cline-any cline-no">&nbsp;</span>
1459
- <span class="cline-any cline-no">&nbsp;</span>
1460
- <span class="cline-any cline-no">&nbsp;</span>
1461
- <span class="cline-any cline-no">&nbsp;</span>
1462
- <span class="cline-any cline-no">&nbsp;</span>
1463
- <span class="cline-any cline-no">&nbsp;</span>
1464
- <span class="cline-any cline-no">&nbsp;</span>
1465
- <span class="cline-any cline-no">&nbsp;</span>
1466
- <span class="cline-any cline-no">&nbsp;</span>
1467
- <span class="cline-any cline-no">&nbsp;</span>
1468
- <span class="cline-any cline-no">&nbsp;</span>
1469
- <span class="cline-any cline-no">&nbsp;</span>
1470
- <span class="cline-any cline-no">&nbsp;</span>
1471
- <span class="cline-any cline-no">&nbsp;</span>
1472
- <span class="cline-any cline-no">&nbsp;</span>
1473
- <span class="cline-any cline-no">&nbsp;</span>
1474
- <span class="cline-any cline-no">&nbsp;</span>
1475
- <span class="cline-any cline-no">&nbsp;</span>
1476
- <span class="cline-any cline-no">&nbsp;</span>
1477
- <span class="cline-any cline-no">&nbsp;</span>
1478
- <span class="cline-any cline-no">&nbsp;</span>
1479
- <span class="cline-any cline-no">&nbsp;</span>
1480
- <span class="cline-any cline-no">&nbsp;</span>
1481
- <span class="cline-any cline-no">&nbsp;</span>
1482
- <span class="cline-any cline-no">&nbsp;</span>
1483
- <span class="cline-any cline-no">&nbsp;</span>
1484
- <span class="cline-any cline-no">&nbsp;</span>
1485
- <span class="cline-any cline-no">&nbsp;</span>
1486
- <span class="cline-any cline-no">&nbsp;</span>
1487
- <span class="cline-any cline-no">&nbsp;</span>
1488
- <span class="cline-any cline-no">&nbsp;</span>
1489
- <span class="cline-any cline-no">&nbsp;</span>
1490
- <span class="cline-any cline-no">&nbsp;</span>
1491
- <span class="cline-any cline-no">&nbsp;</span>
1492
- <span class="cline-any cline-no">&nbsp;</span>
1493
- <span class="cline-any cline-no">&nbsp;</span>
1494
- <span class="cline-any cline-no">&nbsp;</span>
1495
- <span class="cline-any cline-no">&nbsp;</span>
1496
- <span class="cline-any cline-no">&nbsp;</span>
1497
- <span class="cline-any cline-no">&nbsp;</span>
1498
- <span class="cline-any cline-no">&nbsp;</span>
1499
- <span class="cline-any cline-no">&nbsp;</span>
1500
- <span class="cline-any cline-no">&nbsp;</span>
1501
- <span class="cline-any cline-no">&nbsp;</span>
1502
- <span class="cline-any cline-no">&nbsp;</span>
1503
- <span class="cline-any cline-no">&nbsp;</span>
1504
- <span class="cline-any cline-no">&nbsp;</span>
1505
- <span class="cline-any cline-no">&nbsp;</span>
1506
- <span class="cline-any cline-no">&nbsp;</span>
1507
- <span class="cline-any cline-no">&nbsp;</span>
1508
- <span class="cline-any cline-no">&nbsp;</span>
1509
- <span class="cline-any cline-no">&nbsp;</span>
1510
- <span class="cline-any cline-no">&nbsp;</span>
1511
- <span class="cline-any cline-no">&nbsp;</span>
1512
- <span class="cline-any cline-no">&nbsp;</span>
1513
- <span class="cline-any cline-no">&nbsp;</span>
1514
- <span class="cline-any cline-no">&nbsp;</span>
1515
- <span class="cline-any cline-no">&nbsp;</span>
1516
- <span class="cline-any cline-no">&nbsp;</span>
1517
- <span class="cline-any cline-no">&nbsp;</span>
1518
- <span class="cline-any cline-no">&nbsp;</span>
1519
- <span class="cline-any cline-no">&nbsp;</span>
1520
- <span class="cline-any cline-no">&nbsp;</span>
1521
- <span class="cline-any cline-no">&nbsp;</span>
1522
- <span class="cline-any cline-no">&nbsp;</span>
1523
- <span class="cline-any cline-no">&nbsp;</span>
1524
- <span class="cline-any cline-no">&nbsp;</span>
1525
- <span class="cline-any cline-no">&nbsp;</span>
1526
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >/**<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
1527
- <span class="cstat-no" title="statement not covered" > * @file wallet-connection-modal.component.ts</span>
1528
- <span class="cstat-no" title="statement not covered" > * @description Multi-protocol wallet connection modal with step-by-step flow</span>
1529
- <span class="cstat-no" title="statement not covered" > *</span>
1530
- <span class="cstat-no" title="statement not covered" > * Provides a beautiful, user-friendly interface for connecting wallets across</span>
1531
- <span class="cstat-no" title="statement not covered" > * multiple protocols (HSuite Native, WalletConnect) and ledgers (Hedera, XRPL).</span>
1532
- <span class="cstat-no" title="statement not covered" > *</span>
1533
- <span class="cstat-no" title="statement not covered" > * Features:</span>
1534
- <span class="cstat-no" title="statement not covered" > * - Step-by-step connection wizard with direct selection (no Next button)</span>
1535
- <span class="cstat-no" title="statement not covered" > * - Dynamic step indicator showing only relevant steps per protocol path</span>
1536
- <span class="cstat-no" title="statement not covered" > * - Network selection (Mainnet, Testnet)</span>
1537
- <span class="cstat-no" title="statement not covered" > * - Protocol selection (HSuite Native vs WalletConnect)</span>
1538
- <span class="cstat-no" title="statement not covered" > * - Connection method selection (Desktop or Mobile QR)</span>
1539
- <span class="cstat-no" title="statement not covered" > * - Ledger selection (Hedera, XRPL) for WalletConnect</span>
1540
- <span class="cstat-no" title="statement not covered" > * - QR code display for mobile P2P connections</span>
1541
- <span class="cstat-no" title="statement not covered" > * - Beautiful animations and loading states</span>
1542
- <span class="cstat-no" title="statement not covered" > *</span>
1543
- <span class="cstat-no" title="statement not covered" > * Step Paths:</span>
1544
- <span class="cstat-no" title="statement not covered" > * - HSuite Native + Desktop: Network → Protocol → Method (3 steps)</span>
1545
- <span class="cstat-no" title="statement not covered" > * - HSuite Native + Mobile QR: Network → Protocol → Method → QR Pairing (4 steps)</span>
1546
- <span class="cstat-no" title="statement not covered" > * - WalletConnect: Network → Protocol → Ledger → Connect (4 steps)</span>
1547
- <span class="cstat-no" title="statement not covered" > */</span>
1548
- <span class="cstat-no" title="statement not covered" ></span>
1549
- <span class="cstat-no" title="statement not covered" >import { CommonModule } from '@angular/common';</span>
1550
- <span class="cstat-no" title="statement not covered" >import { Component, Input, Output, EventEmitter, signal, computed, inject } from '@angular/core';</span>
1551
- <span class="cstat-no" title="statement not covered" >import { getLogger } from '@hsuite/native-connect-sdk';</span>
1552
- <span class="cstat-no" title="statement not covered" >import { IonicModule, ModalController, Platform } from '@ionic/angular';</span>
1553
- <span class="cstat-no" title="statement not covered" ></span>
1554
- <span class="cstat-no" title="statement not covered" >import type { WalletConnectV2Config } from '../../models/provider-types';</span>
1555
- <span class="cstat-no" title="statement not covered" >import { DEFAULT_WALLET_URL } from '../../models/provider-types';</span>
1556
- <span class="cstat-no" title="statement not covered" >import { P2PNativeProvider } from '../../providers/p2p-native/p2p-native.provider';</span>
1557
- <span class="cstat-no" title="statement not covered" >import { UnifiedWalletService } from '../../services/unified-wallet.service';</span>
1558
- <span class="cstat-no" title="statement not covered" ></span>
1559
- <span class="cstat-no" title="statement not covered" >import {</span>
1560
- <span class="cstat-no" title="statement not covered" > ConnectionMethodStepComponent,</span>
1561
- <span class="cstat-no" title="statement not covered" > type ConnectionMethodOption,</span>
1562
- <span class="cstat-no" title="statement not covered" >} from './connection-method-step/connection-method-step.component';</span>
1563
- <span class="cstat-no" title="statement not covered" >import { QrPairingStepComponent } from './qr-pairing-step/qr-pairing-step.component';</span>
1564
- <span class="cstat-no" title="statement not covered" ></span>
1565
- <span class="cstat-no" title="statement not covered" >const logger = getLogger().scoped?.('WalletConnectionModal') ?? getLogger();</span>
1566
- <span class="cstat-no" title="statement not covered" ></span>
1567
- <span class="cstat-no" title="statement not covered" >/**</span>
1568
- <span class="cstat-no" title="statement not covered" > * Connection step enumeration for the wizard flow</span>
1569
- <span class="cstat-no" title="statement not covered" > */</span>
1570
- <span class="cstat-no" title="statement not covered" >enum ConnectionStep {</span>
1571
- <span class="cstat-no" title="statement not covered" > NetworkSelection = 1,</span>
1572
- <span class="cstat-no" title="statement not covered" > ProtocolSelection = 2,</span>
1573
- <span class="cstat-no" title="statement not covered" > ConnectionMethodSelection = 3,</span>
1574
- <span class="cstat-no" title="statement not covered" > LedgerSelection = 4,</span>
1575
- <span class="cstat-no" title="statement not covered" > QrPairing = 5,</span>
1576
- <span class="cstat-no" title="statement not covered" > ConnectionProgress = 6,</span>
1577
- <span class="cstat-no" title="statement not covered" >}</span>
1578
- <span class="cstat-no" title="statement not covered" ></span>
1579
- <span class="cstat-no" title="statement not covered" >/**</span>
1580
- <span class="cstat-no" title="statement not covered" > * Connection method type.</span>
1581
- <span class="cstat-no" title="statement not covered" > * - desktop: Uses extension if available, otherwise opens PWA in new tab (SDK auto-selects)</span>
1582
- <span class="cstat-no" title="statement not covered" > * - mobile-qr: Two-way QR scan for cross-device P2P connection</span>
1583
- <span class="cstat-no" title="statement not covered" > */</span>
1584
- <span class="cstat-no" title="statement not covered" >type ConnectionMethod = 'desktop' | 'mobile-qr';</span>
1585
- <span class="cstat-no" title="statement not covered" ></span>
1586
- <span class="cstat-no" title="statement not covered" >/**</span>
1587
- <span class="cstat-no" title="statement not covered" > * Network configuration options</span>
1588
- <span class="cstat-no" title="statement not covered" > */</span>
1589
- <span class="cstat-no" title="statement not covered" >interface NetworkOption {</span>
1590
- <span class="cstat-no" title="statement not covered" > id: string;</span>
1591
- <span class="cstat-no" title="statement not covered" > name: string;</span>
1592
- <span class="cstat-no" title="statement not covered" > description: string;</span>
1593
- <span class="cstat-no" title="statement not covered" > icon?: string;</span>
1594
- <span class="cstat-no" title="statement not covered" > recommended?: boolean;</span>
1595
- <span class="cstat-no" title="statement not covered" >}</span>
1596
- <span class="cstat-no" title="statement not covered" ></span>
1597
- <span class="cstat-no" title="statement not covered" >/**</span>
1598
- <span class="cstat-no" title="statement not covered" > * Protocol configuration options</span>
1599
- <span class="cstat-no" title="statement not covered" > */</span>
1600
- <span class="cstat-no" title="statement not covered" >interface ProtocolOption {</span>
1601
- <span class="cstat-no" title="statement not covered" > id: 'hsuite-native' | 'walletconnect';</span>
1602
- <span class="cstat-no" title="statement not covered" > name: string;</span>
1603
- <span class="cstat-no" title="statement not covered" > description: string;</span>
1604
- <span class="cstat-no" title="statement not covered" > icon: string;</span>
1605
- <span class="cstat-no" title="statement not covered" > features: string[];</span>
1606
- <span class="cstat-no" title="statement not covered" >}</span>
1607
- <span class="cstat-no" title="statement not covered" ></span>
1608
- <span class="cstat-no" title="statement not covered" >/**</span>
1609
- <span class="cstat-no" title="statement not covered" > * Ledger configuration options</span>
1610
- <span class="cstat-no" title="statement not covered" > */</span>
1611
- <span class="cstat-no" title="statement not covered" >interface LedgerOption {</span>
1612
- <span class="cstat-no" title="statement not covered" > id: 'hedera' | 'xrpl';</span>
1613
- <span class="cstat-no" title="statement not covered" > name: string;</span>
1614
- <span class="cstat-no" title="statement not covered" > description: string;</span>
1615
- <span class="cstat-no" title="statement not covered" > icon: string;</span>
1616
- <span class="cstat-no" title="statement not covered" >}</span>
1617
- <span class="cstat-no" title="statement not covered" ></span>
1618
- <span class="cstat-no" title="statement not covered" >/**</span>
1619
- <span class="cstat-no" title="statement not covered" > * Step configuration for dynamic step indicator.</span>
1620
- <span class="cstat-no" title="statement not covered" > * Defines the total steps and labels based on selected protocol path.</span>
1621
- <span class="cstat-no" title="statement not covered" > */</span>
1622
- <span class="cstat-no" title="statement not covered" >interface StepConfig {</span>
1623
- <span class="cstat-no" title="statement not covered" > /** Total number of steps in the current path */</span>
1624
- <span class="cstat-no" title="statement not covered" > total: number;</span>
1625
- <span class="cstat-no" title="statement not covered" > /** Labels for each step in the progress indicator */</span>
1626
- <span class="cstat-no" title="statement not covered" > labels: string[];</span>
1627
- <span class="cstat-no" title="statement not covered" >}</span>
1628
- <span class="cstat-no" title="statement not covered" ></span>
1629
- <span class="cstat-no" title="statement not covered" >/**</span>
1630
- <span class="cstat-no" title="statement not covered" > * Main wallet connection modal component.</span>
1631
- <span class="cstat-no" title="statement not covered" > * Orchestrates the multi-step connection flow.</span>
1632
- <span class="cstat-no" title="statement not covered" > */</span>
1633
- <span class="cstat-no" title="statement not covered" >@Component({</span>
1634
- <span class="cstat-no" title="statement not covered" > selector: 'hsuite-wallet-connection-modal',</span>
1635
- <span class="cstat-no" title="statement not covered" > standalone: true,</span>
1636
- <span class="cstat-no" title="statement not covered" > imports: [CommonModule, IonicModule, ConnectionMethodStepComponent, QrPairingStepComponent],</span>
1637
- <span class="cstat-no" title="statement not covered" > templateUrl: './wallet-connection-modal.component.html',</span>
1638
- <span class="cstat-no" title="statement not covered" > styleUrls: ['./wallet-connection-modal.component.scss'],</span>
1639
- <span class="cstat-no" title="statement not covered" >})</span>
1640
- <span class="cstat-no" title="statement not covered" >export class WalletConnectionModalComponent {</span>
1641
- <span class="cstat-no" title="statement not covered" > /**</span>
1642
- <span class="cstat-no" title="statement not covered" > * WalletConnect project ID (required for WalletConnect)</span>
1643
- <span class="cstat-no" title="statement not covered" > */</span>
1644
- <span class="cstat-no" title="statement not covered" > @Input() projectId?: string;</span>
1645
- <span class="cstat-no" title="statement not covered" ></span>
1646
- <span class="cstat-no" title="statement not covered" > /**</span>
1647
- <span class="cstat-no" title="statement not covered" > * App name for WalletConnect metadata</span>
1648
- <span class="cstat-no" title="statement not covered" > */</span>
1649
- <span class="cstat-no" title="statement not covered" > @Input() appName: string = 'HSuite Demo';</span>
1650
- <span class="cstat-no" title="statement not covered" ></span>
1651
- <span class="cstat-no" title="statement not covered" > /**</span>
1652
- <span class="cstat-no" title="statement not covered" > * App description for WalletConnect metadata</span>
1653
- <span class="cstat-no" title="statement not covered" > */</span>
1654
- <span class="cstat-no" title="statement not covered" > @Input() appDescription: string = 'Multi-chain wallet connection';</span>
1655
- <span class="cstat-no" title="statement not covered" ></span>
1656
- <span class="cstat-no" title="statement not covered" > /**</span>
1657
- <span class="cstat-no" title="statement not covered" > * Wallet URL for HSuite Native connection</span>
1658
- <span class="cstat-no" title="statement not covered" > */</span>
1659
- <span class="cstat-no" title="statement not covered" > @Input() walletUrl: string = DEFAULT_WALLET_URL;</span>
1660
- <span class="cstat-no" title="statement not covered" ></span>
1661
- <span class="cstat-no" title="statement not covered" > /**</span>
1662
- <span class="cstat-no" title="statement not covered" > * Event emitted when connection is successful</span>
1663
- <span class="cstat-no" title="statement not covered" > */</span>
1664
- <span class="cstat-no" title="statement not covered" > @Output() connected = new EventEmitter&lt;unknown&gt;();</span>
1665
- <span class="cstat-no" title="statement not covered" ></span>
1666
- <span class="cstat-no" title="statement not covered" > // Note: answerScannerRequested removed - new Nostr-first flow doesn't need answer scanning</span>
1667
- <span class="cstat-no" title="statement not covered" ></span>
1668
- <span class="cstat-no" title="statement not covered" > private readonly platform = inject(Platform);</span>
1669
- <span class="cstat-no" title="statement not covered" > private readonly p2pNativeProvider = inject(P2PNativeProvider);</span>
1670
- <span class="cstat-no" title="statement not covered" ></span>
1671
- <span class="cstat-no" title="statement not covered" > // Step management</span>
1672
- <span class="cstat-no" title="statement not covered" > readonly currentStep = signal&lt;ConnectionStep&gt;(ConnectionStep.NetworkSelection);</span>
1673
- <span class="cstat-no" title="statement not covered" > readonly ConnectionStep = ConnectionStep;</span>
1674
- <span class="cstat-no" title="statement not covered" ></span>
1675
- <span class="cstat-no" title="statement not covered" > // Selection state</span>
1676
- <span class="cstat-no" title="statement not covered" > readonly selectedNetwork = signal&lt;string&gt;('testnet');</span>
1677
- <span class="cstat-no" title="statement not covered" > readonly selectedProtocol = signal&lt;'hsuite-native' | 'walletconnect' | null&gt;(null);</span>
1678
- <span class="cstat-no" title="statement not covered" > readonly selectedConnectionMethod = signal&lt;ConnectionMethod | null&gt;(null);</span>
1679
- <span class="cstat-no" title="statement not covered" > readonly selectedLedger = signal&lt;'hedera' | 'xrpl' | null&gt;(null);</span>
1680
- <span class="cstat-no" title="statement not covered" ></span>
1681
- <span class="cstat-no" title="statement not covered" > // Loading state</span>
1682
- <span class="cstat-no" title="statement not covered" > readonly isConnecting = signal&lt;boolean&gt;(false);</span>
1683
- <span class="cstat-no" title="statement not covered" > readonly connectionError = signal&lt;string | null&gt;(null);</span>
1684
- <span class="cstat-no" title="statement not covered" ></span>
1685
- <span class="cstat-no" title="statement not covered" > // QR Pairing state</span>
1686
- <span class="cstat-no" title="statement not covered" > readonly pairingOffer = signal&lt;string&gt;('');</span>
1687
- <span class="cstat-no" title="statement not covered" > readonly isGeneratingOffer = signal&lt;boolean&gt;(false);</span>
1688
- <span class="cstat-no" title="statement not covered" ></span>
1689
- <span class="cstat-no" title="statement not covered" > /**</span>
1690
- <span class="cstat-no" title="statement not covered" > * Indicates we're waiting for the wallet to scan the QR and connect via Nostr.</span>
1691
- <span class="cstat-no" title="statement not covered" > */</span>
1692
- <span class="cstat-no" title="statement not covered" > readonly isWaitingForWallet = signal&lt;boolean&gt;(false);</span>
1693
- <span class="cstat-no" title="statement not covered" ></span>
1694
- <span class="cstat-no" title="statement not covered" > /**</span>
1695
- <span class="cstat-no" title="statement not covered" > * Indicates we're waiting for the wallet user to approve the session.</span>
1696
- <span class="cstat-no" title="statement not covered" > * Nostr connection is established, but session approval is pending.</span>
1697
- <span class="cstat-no" title="statement not covered" > */</span>
1698
- <span class="cstat-no" title="statement not covered" > readonly isWaitingForApproval = signal&lt;boolean&gt;(false);</span>
1699
- <span class="cstat-no" title="statement not covered" ></span>
1700
- <span class="cstat-no" title="statement not covered" > // Platform detection</span>
1701
- <span class="cstat-no" title="statement not covered" > readonly isMobile = signal&lt;boolean&gt;(this.detectMobile());</span>
1702
- <span class="cstat-no" title="statement not covered" > readonly isExtensionAvailable = signal&lt;boolean&gt;(this.detectExtension());</span>
1703
- <span class="cstat-no" title="statement not covered" ></span>
1704
- <span class="cstat-no" title="statement not covered" > // Configuration options</span>
1705
- <span class="cstat-no" title="statement not covered" > readonly networkOptions: NetworkOption[] = [</span>
1706
- <span class="cstat-no" title="statement not covered" > {</span>
1707
- <span class="cstat-no" title="statement not covered" > id: 'mainnet',</span>
1708
- <span class="cstat-no" title="statement not covered" > name: 'Mainnet',</span>
1709
- <span class="cstat-no" title="statement not covered" > description: 'Production network with real assets',</span>
1710
- <span class="cstat-no" title="statement not covered" > icon: 'shield-checkmark',</span>
1711
- <span class="cstat-no" title="statement not covered" > },</span>
1712
- <span class="cstat-no" title="statement not covered" > {</span>
1713
- <span class="cstat-no" title="statement not covered" > id: 'testnet',</span>
1714
- <span class="cstat-no" title="statement not covered" > name: 'Testnet',</span>
1715
- <span class="cstat-no" title="statement not covered" > description: 'Test network for development',</span>
1716
- <span class="cstat-no" title="statement not covered" > icon: 'flask',</span>
1717
- <span class="cstat-no" title="statement not covered" > recommended: true,</span>
1718
- <span class="cstat-no" title="statement not covered" > },</span>
1719
- <span class="cstat-no" title="statement not covered" > ];</span>
1720
- <span class="cstat-no" title="statement not covered" ></span>
1721
- <span class="cstat-no" title="statement not covered" > readonly protocolOptions = computed&lt;ProtocolOption[]&gt;(() =&gt; {</span>
1665
+ <span class="cline-any cline-yes">10x</span>
1666
+ <span class="cline-any cline-yes">10x</span>
1667
+ <span class="cline-any cline-yes">10x</span>
1668
+ <span class="cline-any cline-yes">10x</span>
1669
+ <span class="cline-any cline-yes">10x</span>
1670
+ <span class="cline-any cline-yes">10x</span>
1671
+ <span class="cline-any cline-yes">10x</span>
1672
+ <span class="cline-any cline-yes">10x</span>
1673
+ <span class="cline-any cline-yes">10x</span>
1674
+ <span class="cline-any cline-yes">10x</span>
1675
+ <span class="cline-any cline-yes">10x</span>
1676
+ <span class="cline-any cline-yes">10x</span>
1677
+ <span class="cline-any cline-yes">10x</span>
1678
+ <span class="cline-any cline-yes">10x</span>
1679
+ <span class="cline-any cline-yes">10x</span>
1680
+ <span class="cline-any cline-yes">10x</span>
1681
+ <span class="cline-any cline-yes">10x</span>
1682
+ <span class="cline-any cline-yes">10x</span>
1683
+ <span class="cline-any cline-yes">10x</span>
1684
+ <span class="cline-any cline-yes">10x</span>
1685
+ <span class="cline-any cline-yes">10x</span>
1686
+ <span class="cline-any cline-yes">10x</span>
1687
+ <span class="cline-any cline-yes">10x</span>
1688
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
1689
+ * @file wallet-connection-modal.component.ts
1690
+ * @description Multi-protocol wallet connection modal with step-by-step flow
1691
+ *
1692
+ * Provides a beautiful, user-friendly interface for connecting wallets across
1693
+ * multiple protocols (HSuite Native, WalletConnect) and ledgers (Hedera, XRPL).
1694
+ *
1695
+ * Features:
1696
+ * - Step-by-step connection wizard with direct selection (no Next button)
1697
+ * - Dynamic step indicator showing only relevant steps per protocol path
1698
+ * - Network selection (Mainnet, Testnet)
1699
+ * - Protocol selection (HSuite Native vs WalletConnect)
1700
+ * - Connection method selection (Desktop or Mobile QR)
1701
+ * - Ledger selection (Hedera, XRPL) for WalletConnect
1702
+ * - QR code display for mobile P2P connections
1703
+ * - Beautiful animations and loading states
1704
+ *
1705
+ * Step Paths:
1706
+ * - HSuite Native + Desktop: Network → Protocol → Method (3 steps)
1707
+ * - HSuite Native + Mobile QR: Network → Protocol → Method → QR Pairing (4 steps)
1708
+ * - WalletConnect: Network → Protocol → Ledger → Connect (4 steps)
1709
+ */
1710
+ &nbsp;
1711
+ import { CommonModule } from '@angular/common';
1712
+ import {
1713
+ Component,
1714
+ Input,
1715
+ Output,
1716
+ EventEmitter,
1717
+ OnInit,
1718
+ signal,
1719
+ computed,
1720
+ inject,
1721
+ } from '@angular/core';
1722
+ import { getLogger } from '@hsuite/native-connect-sdk';
1723
+ import type { SupportedLedger } from '@hsuite/native-connect-sdk';
1724
+ import { IonicModule, ModalController, Platform } from '@ionic/angular';
1725
+ &nbsp;
1726
+ import type { WalletConnectV2Config } from '../../models/provider-types';
1727
+ import { DEFAULT_WALLET_URL } from '../../models/provider-types';
1728
+ import { P2PNativeProvider } from '../../providers/p2p-native/p2p-native.provider';
1729
+ import { UnifiedWalletService } from '../../services/unified-wallet.service';
1730
+ import { registerLedgerIcons } from '../../utils/ledger-icons.util';
1731
+ import { LedgerUIRegistry } from '../../utils/ledger-ui-registry';
1732
+ &nbsp;
1733
+ import {
1734
+ ConnectionMethodStepComponent,
1735
+ type ConnectionMethodOption,
1736
+ } from './connection-method-step/connection-method-step.component';
1737
+ import { QrPairingStepComponent } from './qr-pairing-step/qr-pairing-step.component';
1738
+ &nbsp;
1739
+ const logger = getLogger().scoped?.('WalletConnectionModal'<span class="branch-0 cbranch-no" title="branch not covered" >) ?? getLogger();</span>
1740
+ &nbsp;
1741
+ /**
1742
+ * Connection step enumeration for the wizard flow
1743
+ */
1744
+ enum ConnectionStep {
1745
+ NetworkSelection = 1,
1746
+ ProtocolSelection = 2,
1747
+ ConnectionMethodSelection = 3,
1748
+ LedgerSelection = 4,
1749
+ QrPairing = 5,
1750
+ ConnectionProgress = 6,
1751
+ }
1752
+ &nbsp;
1753
+ /**
1754
+ * Connection method type.
1755
+ * - desktop: Uses extension if available, otherwise opens PWA in new tab (SDK auto-selects)
1756
+ * - mobile-qr: Two-way QR scan for cross-device P2P connection
1757
+ */
1758
+ type ConnectionMethod = 'desktop' | 'mobile-qr';
1759
+ &nbsp;
1760
+ /**
1761
+ * Network configuration options
1762
+ */
1763
+ interface NetworkOption {
1764
+ id: string;
1765
+ name: string;
1766
+ description: string;
1767
+ icon?: string;
1768
+ recommended?: boolean;
1769
+ }
1770
+ &nbsp;
1771
+ /**
1772
+ * Protocol configuration options
1773
+ */
1774
+ interface ProtocolOption {
1775
+ id: 'hsuite-native' | 'walletconnect';
1776
+ name: string;
1777
+ description: string;
1778
+ icon: string;
1779
+ features: string[];
1780
+ }
1781
+ &nbsp;
1782
+ /**
1783
+ * Ledger configuration options
1784
+ */
1785
+ interface LedgerOption {
1786
+ id: SupportedLedger;
1787
+ name: string;
1788
+ description: string;
1789
+ icon: string;
1790
+ }
1791
+ &nbsp;
1792
+ /**
1793
+ * Per-ledger copy for the WalletConnect "Choose Blockchain" step.
1794
+ *
1795
+ * Keyed by {@link SupportedLedger} (the closed set of ledgers the WalletConnect
1796
+ * provider brokers) via `satisfies`, so widening that union forces a description
1797
+ * here. Display name and icon come from {@link LedgerUIRegistry}; this map holds
1798
+ * only the connection-flow copy specific to this surface.
1799
+ */
1800
+ const LEDGER_DESCRIPTIONS = {
1801
+ hedera: 'Hedera Hashgraph network',
1802
+ xrpl: 'XRP Ledger network',
1803
+ } satisfies Record&lt;SupportedLedger, string&gt;;
1804
+ &nbsp;
1805
+ /**
1806
+ * Step configuration for dynamic step indicator.
1807
+ * Defines the total steps and labels based on selected protocol path.
1808
+ */
1809
+ interface StepConfig {
1810
+ /** Total number of steps in the current path */
1811
+ total: number;
1812
+ /** Labels for each step in the progress indicator */
1813
+ labels: string[];
1814
+ }
1815
+ &nbsp;
1816
+ /**
1817
+ * Main wallet connection modal component.
1818
+ * Orchestrates the multi-step connection flow.
1819
+ */
1820
+ @Component({
1821
+ selector: 'hsuite-wallet-connection-modal',
1822
+ standalone: true,
1823
+ imports: [CommonModule, IonicModule, ConnectionMethodStepComponent, QrPairingStepComponent],
1824
+ templateUrl: './wallet-connection-modal.component.html',
1825
+ styleUrls: ['./wallet-connection-modal.component.scss'],
1826
+ })
1827
+ export class WalletConnectionModalComponent implements OnInit {
1828
+ /**
1829
+ * WalletConnect project ID (required for WalletConnect)
1830
+ */
1831
+ @Input() projectId?: string;
1832
+ &nbsp;
1833
+ /**
1834
+ * Pins the connection network and hides the network-selection step.
1835
+ *
1836
+ * When set to `'mainnet'` or `'testnet'`, the host dApp decides the network
1837
+ * and the user is never shown the network picker — the modal opens directly
1838
+ * on protocol selection. When omitted (default), the user chooses the network
1839
+ * as the first step.
1840
+ */
1841
+ @Input() network?: 'mainnet' | 'testnet';
1842
+ &nbsp;
1843
+ /**
1844
+ * App name for WalletConnect metadata
1845
+ */
1846
+ @Input() appName: string = 'HSuite Demo';
1847
+ &nbsp;
1848
+ /**
1849
+ * App description for WalletConnect metadata
1850
+ */
1851
+ @Input() appDescription: string = 'Multi-chain wallet connection';
1852
+ &nbsp;
1853
+ /**
1854
+ * Wallet URL for HSuite Native connection
1855
+ */
1856
+ @Input() walletUrl: string = DEFAULT_WALLET_URL;
1857
+ &nbsp;
1858
+ /**
1859
+ * Event emitted when connection is successful
1860
+ */
1861
+ @Output() connected = new EventEmitter&lt;unknown&gt;();
1862
+ &nbsp;
1863
+ // Note: answerScannerRequested removed - new Nostr-first flow doesn't need answer scanning
1864
+ &nbsp;
1865
+ private readonly platform = inject(Platform);
1866
+ private readonly p2pNativeProvider = inject(P2PNativeProvider);
1867
+ &nbsp;
1868
+ // Step management
1869
+ readonly currentStep = signal&lt;ConnectionStep&gt;(ConnectionStep.NetworkSelection);
1870
+ readonly ConnectionStep = ConnectionStep;
1871
+ &nbsp;
1872
+ // Selection state
1873
+ readonly selectedNetwork = signal&lt;string&gt;('testnet');
1874
+ readonly selectedProtocol = signal&lt;'hsuite-native' | 'walletconnect' | null&gt;(null);
1875
+ readonly selectedConnectionMethod = signal&lt;ConnectionMethod | null&gt;(null);
1876
+ readonly selectedLedger = signal&lt;SupportedLedger | null&gt;(null);
1877
+ &nbsp;
1878
+ // Loading state
1879
+ readonly isConnecting = signal&lt;boolean&gt;(false);
1880
+ readonly connectionError = signal&lt;string | null&gt;(null);
1881
+ &nbsp;
1882
+ // QR Pairing state
1883
+ readonly pairingOffer = signal&lt;string&gt;('');
1884
+ readonly isGeneratingOffer = signal&lt;boolean&gt;(false);
1885
+ &nbsp;
1886
+ /**
1887
+ * Indicates we're waiting for the wallet to scan the QR and connect via Nostr.
1888
+ */
1889
+ readonly isWaitingForWallet = signal&lt;boolean&gt;(false);
1890
+ &nbsp;
1891
+ /**
1892
+ * Indicates we're waiting for the wallet user to approve the session.
1893
+ * Nostr connection is established, but session approval is pending.
1894
+ */
1895
+ readonly isWaitingForApproval = signal&lt;boolean&gt;(false);
1896
+ &nbsp;
1897
+ // Platform detection
1898
+ readonly isMobile = signal&lt;boolean&gt;(this.detectMobile());
1899
+ readonly isExtensionAvailable = signal&lt;boolean&gt;(this.detectExtension());
1900
+ &nbsp;
1901
+ // Configuration options
1902
+ readonly networkOptions: NetworkOption[] = [
1903
+ {
1904
+ id: 'mainnet',
1905
+ name: 'Mainnet',
1906
+ description: 'Production network with real assets',
1907
+ icon: 'shield-checkmark',
1908
+ },
1909
+ {
1910
+ id: 'testnet',
1911
+ name: 'Testnet',
1912
+ description: 'Test network for development',
1913
+ icon: 'flask',
1914
+ recommended: true,
1915
+ },
1916
+ ];
1917
+ &nbsp;
1918
+ readonly protocolOptions = computed&lt;ProtocolOption[]&gt;(() =&gt; {
1722
1919
  <span class="cstat-no" title="statement not covered" > const options: ProtocolOption[] = [</span>
1723
1920
  <span class="cstat-no" title="statement not covered" > {</span>
1724
1921
  <span class="cstat-no" title="statement not covered" > id: 'hsuite-native',</span>
@@ -1751,30 +1948,27 @@
1751
1948
  <span class="cstat-no" title="statement not covered" > }</span>
1752
1949
  <span class="cstat-no" title="statement not covered" ></span>
1753
1950
  <span class="cstat-no" title="statement not covered" > return options;</span>
1754
- <span class="cstat-no" title="statement not covered" > });</span>
1755
- <span class="cstat-no" title="statement not covered" ></span>
1756
- <span class="cstat-no" title="statement not covered" > readonly ledgerOptions: LedgerOption[] = [</span>
1757
- <span class="cstat-no" title="statement not covered" > {</span>
1758
- <span class="cstat-no" title="statement not covered" > id: 'hedera',</span>
1759
- <span class="cstat-no" title="statement not covered" > name: 'Hedera',</span>
1760
- <span class="cstat-no" title="statement not covered" > description: 'Hedera Hashgraph network',</span>
1761
- <span class="cstat-no" title="statement not covered" > icon: 'logo-bitcoin', // Placeholder, use actual Hedera icon</span>
1762
- <span class="cstat-no" title="statement not covered" > },</span>
1763
- <span class="cstat-no" title="statement not covered" > {</span>
1764
- <span class="cstat-no" title="statement not covered" > id: 'xrpl',</span>
1765
- <span class="cstat-no" title="statement not covered" > name: 'XRP Ledger',</span>
1766
- <span class="cstat-no" title="statement not covered" > description: 'XRP Ledger network',</span>
1767
- <span class="cstat-no" title="statement not covered" > icon: 'logo-usd', // Placeholder, use actual XRPL icon</span>
1768
- <span class="cstat-no" title="statement not covered" > },</span>
1769
- <span class="cstat-no" title="statement not covered" > ];</span>
1770
- <span class="cstat-no" title="statement not covered" ></span>
1771
- <span class="cstat-no" title="statement not covered" > /**</span>
1772
- <span class="cstat-no" title="statement not covered" > * Connection method options for HSuite Native.</span>
1773
- <span class="cstat-no" title="statement not covered" > * Simplified to two options:</span>
1774
- <span class="cstat-no" title="statement not covered" > * - HSuite Wallet (desktop): SDK auto-selects extension or PWA</span>
1775
- <span class="cstat-no" title="statement not covered" > * - Mobile Wallet (QR): Cross-device P2P connection</span>
1776
- <span class="cstat-no" title="statement not covered" > */</span>
1777
- <span class="cstat-no" title="statement not covered" > readonly connectionMethodOptions = computed&lt;ConnectionMethodOption[]&gt;(() =&gt; [</span>
1951
+ });
1952
+ &nbsp;
1953
+ readonly ledgerOptions: LedgerOption[] = (
1954
+ Object.keys(LEDGER_DESCRIPTIONS) as SupportedLedger[]
1955
+ ).map((id) =&gt; {
1956
+ const ui = LedgerUIRegistry.get(id);
1957
+ return {
1958
+ id,
1959
+ name: ui?.<span class="branch-0 cbranch-no" title="branch not covered" >displayName ?? id,</span>
1960
+ description: LEDGER_DESCRIPTIONS[id],
1961
+ icon: ui?.<span class="branch-0 cbranch-no" title="branch not covered" >iconName ?? '',</span>
1962
+ };
1963
+ });
1964
+ &nbsp;
1965
+ /**
1966
+ * Connection method options for HSuite Native.
1967
+ * Simplified to two options:
1968
+ * - HSuite Wallet (desktop): SDK auto-selects extension or PWA
1969
+ * - Mobile Wallet (QR): Cross-device P2P connection
1970
+ */
1971
+ readonly connectionMethodOptions = computed&lt;ConnectionMethodOption[]&gt;(() =&gt; [
1778
1972
  <span class="cstat-no" title="statement not covered" > {</span>
1779
1973
  <span class="cstat-no" title="statement not covered" > id: 'desktop',</span>
1780
1974
  <span class="cstat-no" title="statement not covered" > name: 'HSuite Wallet',</span>
@@ -1797,10 +1991,10 @@
1797
1991
  <span class="cstat-no" title="statement not covered" > recommended: this.isMobile(),</span>
1798
1992
  <span class="cstat-no" title="statement not covered" > features: ['Cross-device', 'P2P', 'No server needed'],</span>
1799
1993
  <span class="cstat-no" title="statement not covered" > },</span>
1800
- <span class="cstat-no" title="statement not covered" > ]);</span>
1801
- <span class="cstat-no" title="statement not covered" ></span>
1802
- <span class="cstat-no" title="statement not covered" > // Computed properties</span>
1803
- <span class="cstat-no" title="statement not covered" > readonly canProceed = computed(() =&gt; {</span>
1994
+ ]);
1995
+ &nbsp;
1996
+ // Computed properties
1997
+ readonly canProceed = computed(() =&gt; {
1804
1998
  <span class="cstat-no" title="statement not covered" > const step = this.currentStep();</span>
1805
1999
  <span class="cstat-no" title="statement not covered" > switch (step) {</span>
1806
2000
  <span class="cstat-no" title="statement not covered" > case ConnectionStep.NetworkSelection:</span>
@@ -1814,9 +2008,9 @@
1814
2008
  <span class="cstat-no" title="statement not covered" > default:</span>
1815
2009
  <span class="cstat-no" title="statement not covered" > return false;</span>
1816
2010
  <span class="cstat-no" title="statement not covered" > }</span>
1817
- <span class="cstat-no" title="statement not covered" > });</span>
1818
- <span class="cstat-no" title="statement not covered" ></span>
1819
- <span class="cstat-no" title="statement not covered" > readonly stepTitle = computed(() =&gt; {</span>
2011
+ });
2012
+ &nbsp;
2013
+ readonly stepTitle = computed(() =&gt; {
1820
2014
  <span class="cstat-no" title="statement not covered" > const step = this.currentStep();</span>
1821
2015
  <span class="cstat-no" title="statement not covered" > switch (step) {</span>
1822
2016
  <span class="cstat-no" title="statement not covered" > case ConnectionStep.NetworkSelection:</span>
@@ -1834,178 +2028,223 @@
1834
2028
  <span class="cstat-no" title="statement not covered" > default:</span>
1835
2029
  <span class="cstat-no" title="statement not covered" > return '';</span>
1836
2030
  <span class="cstat-no" title="statement not covered" > }</span>
1837
- <span class="cstat-no" title="statement not covered" > });</span>
1838
- <span class="cstat-no" title="statement not covered" ></span>
1839
- <span class="cstat-no" title="statement not covered" > /**</span>
1840
- <span class="cstat-no" title="statement not covered" > * Dynamic step configuration based on selected protocol and connection method.</span>
1841
- <span class="cstat-no" title="statement not covered" > * Returns the total number of steps and labels for the progress indicator.</span>
1842
- <span class="cstat-no" title="statement not covered" > *</span>
1843
- <span class="cstat-no" title="statement not covered" > * Step Paths:</span>
1844
- <span class="cstat-no" title="statement not covered" > * - Initial (no protocol): 3 placeholder steps</span>
1845
- <span class="cstat-no" title="statement not covered" > * - HSuite Native + Desktop: 3 steps (Network, Protocol, Method)</span>
1846
- <span class="cstat-no" title="statement not covered" > * - HSuite Native + Mobile QR: 4 steps (Network, Protocol, Method, Pair)</span>
1847
- <span class="cstat-no" title="statement not covered" > * - WalletConnect: 4 steps (Network, Protocol, Ledger, Connect)</span>
1848
- <span class="cstat-no" title="statement not covered" > */</span>
1849
- <span class="cstat-no" title="statement not covered" > readonly stepConfig = computed&lt;StepConfig&gt;(() =&gt; {</span>
1850
- <span class="cstat-no" title="statement not covered" > const protocol = this.selectedProtocol();</span>
1851
- <span class="cstat-no" title="statement not covered" > const method = this.selectedConnectionMethod();</span>
1852
- <span class="cstat-no" title="statement not covered" ></span>
1853
- <span class="cstat-no" title="statement not covered" > // Initial state: show 3 placeholder steps until protocol is selected</span>
1854
- <span class="cstat-no" title="statement not covered" > if (!protocol) {</span>
1855
- <span class="cstat-no" title="statement not covered" > return { total: 3, labels: ['Network', 'Protocol', '...'] };</span>
1856
- <span class="cstat-no" title="statement not covered" > }</span>
1857
- <span class="cstat-no" title="statement not covered" ></span>
1858
- <span class="cstat-no" title="statement not covered" > // HSuite Native path</span>
1859
- <span class="cstat-no" title="statement not covered" > if (protocol === 'hsuite-native') {</span>
1860
- <span class="cstat-no" title="statement not covered" > // If mobile QR is selected, we need 4 steps</span>
1861
- <span class="cstat-no" title="statement not covered" > if (method === 'mobile-qr') {</span>
1862
- <span class="cstat-no" title="statement not covered" > return { total: 4, labels: ['Network', 'Protocol', 'Method', 'Pair'] };</span>
1863
- <span class="cstat-no" title="statement not covered" > }</span>
1864
- <span class="cstat-no" title="statement not covered" > // Desktop connection is 3 steps (connects immediately after method selection)</span>
1865
- <span class="cstat-no" title="statement not covered" > return { total: 3, labels: ['Network', 'Protocol', 'Method'] };</span>
2031
+ });
2032
+ &nbsp;
2033
+ /**
2034
+ * Dynamic step configuration based on selected protocol and connection method.
2035
+ * Returns the total number of steps and labels for the progress indicator.
2036
+ *
2037
+ * Step Paths:
2038
+ * - Initial (no protocol): 3 placeholder steps
2039
+ * - HSuite Native + Desktop: 3 steps (Network, Protocol, Method)
2040
+ * - HSuite Native + Mobile QR: 4 steps (Network, Protocol, Method, Pair)
2041
+ * - WalletConnect: 4 steps (Network, Protocol, Ledger, Connect)
2042
+ */
2043
+ readonly stepConfig = computed&lt;StepConfig&gt;(() =&gt; {
2044
+ const protocol = this.selectedProtocol();
2045
+ const method = this.selectedConnectionMethod();
2046
+ &nbsp;
2047
+ let base: StepConfig;
2048
+ &nbsp;
2049
+ // Initial state: show 3 placeholder steps until protocol is selected
2050
+ if (!protocol) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2051
+ <span class="cstat-no" title="statement not covered" > base = { total: 3, labels: ['Network', 'Protocol', '...'] };</span>
2052
+ } else if (protocol === 'hsuite-native') {
2053
+ // HSuite Native path
2054
+ base =
2055
+ method === <span class="branch-0 cbranch-no" title="branch not covered" >'mobile-qr'</span>
2056
+ <span class="cstat-no" title="statement not covered" > ? // Mobile QR needs 4 steps</span>
2057
+ <span class="cstat-no" title="statement not covered" > { total: 4, labels: ['Network', 'Protocol', 'Method', 'Pair'] }</span>
2058
+ : // Desktop connects immediately after method selection (3 steps)
2059
+ { total: 3, labels: ['Network', 'Protocol', 'Method'] };
2060
+ <span class="branch-0 cbranch-no" title="branch not covered" > } else {</span>
2061
+ <span class="cstat-no" title="statement not covered" > // WalletConnect path: 4 steps</span>
2062
+ <span class="cstat-no" title="statement not covered" > base = { total: 4, labels: ['Network', 'Protocol', 'Ledger', 'Connect'] };</span>
1866
2063
  <span class="cstat-no" title="statement not covered" > }</span>
1867
- <span class="cstat-no" title="statement not covered" ></span>
1868
- <span class="cstat-no" title="statement not covered" > // WalletConnect path: 4 steps</span>
1869
- <span class="cstat-no" title="statement not covered" > return { total: 4, labels: ['Network', 'Protocol', 'Ledger', 'Connect'] };</span>
1870
- <span class="cstat-no" title="statement not covered" > });</span>
1871
- <span class="cstat-no" title="statement not covered" ></span>
1872
- <span class="cstat-no" title="statement not covered" > /**</span>
1873
- <span class="cstat-no" title="statement not covered" > * Maps the internal ConnectionStep enum to display position (1-based).</span>
1874
- <span class="cstat-no" title="statement not covered" > * Different protocol paths have different step mappings.</span>
1875
- <span class="cstat-no" title="statement not covered" > */</span>
1876
- <span class="cstat-no" title="statement not covered" > readonly displayStep = computed&lt;number&gt;(() =&gt; {</span>
1877
- <span class="cstat-no" title="statement not covered" > const step = this.currentStep();</span>
1878
- <span class="cstat-no" title="statement not covered" > // Protocol could be used for protocol-specific step mapping in the future</span>
1879
- <span class="cstat-no" title="statement not covered" > const _protocol = this.selectedProtocol();</span>
1880
- <span class="cstat-no" title="statement not covered" ></span>
1881
- <span class="cstat-no" title="statement not covered" > // Map internal step to display position based on protocol path</span>
1882
- <span class="cstat-no" title="statement not covered" > switch (step) {</span>
1883
- <span class="cstat-no" title="statement not covered" > case ConnectionStep.NetworkSelection:</span>
2064
+ &nbsp;
2065
+ // When the network is pinned by the host dApp the network step is never
2066
+ // shown drop it from the indicator so the numbering stays accurate.
2067
+ if (this.network) {
2068
+ return { total: base.total - 1, labels: base.labels.slice(1) };
2069
+ }
2070
+ return base;
2071
+ });
2072
+ &nbsp;
2073
+ /**
2074
+ * Maps the internal ConnectionStep enum to display position (1-based).
2075
+ * Different protocol paths have different step mappings.
2076
+ */
2077
+ readonly displayStep = computed&lt;number&gt;(() =&gt; {
2078
+ const step = this.currentStep();
2079
+ // Protocol could be used for protocol-specific step mapping in the future
2080
+ const _protocol = this.selectedProtocol();
2081
+ &nbsp;
2082
+ // When the network is pinned the network step is removed, so every
2083
+ // subsequent step shifts down one position in the indicator.
2084
+ const networkOffset = this.network ? <span class="branch-0 cbranch-no" title="branch not covered" >1 : 0;</span>
2085
+ &nbsp;
2086
+ // Map internal step to display position based on protocol path
2087
+ switch (step) {
2088
+ <span class="branch-0 cbranch-no" title="branch not covered" > case ConnectionStep.NetworkSelection:</span>
1884
2089
  <span class="cstat-no" title="statement not covered" > return 1;</span>
1885
- <span class="cstat-no" title="statement not covered" > case ConnectionStep.ProtocolSelection:</span>
1886
- <span class="cstat-no" title="statement not covered" > return 2;</span>
1887
- <span class="cstat-no" title="statement not covered" > case ConnectionStep.ConnectionMethodSelection:</span>
1888
- <span class="cstat-no" title="statement not covered" > return 3;</span>
1889
- <span class="cstat-no" title="statement not covered" > case ConnectionStep.LedgerSelection:</span>
2090
+ case ConnectionStep.ProtocolSelection:
2091
+ return 2 - networkOffset;
2092
+ <span class="branch-0 cbranch-no" title="branch not covered" > case ConnectionStep.ConnectionMethodSelection:</span>
2093
+ <span class="cstat-no" title="statement not covered" > return 3 - networkOffset;</span>
2094
+ <span class="branch-0 cbranch-no" title="branch not covered" > case ConnectionStep.LedgerSelection:</span>
1890
2095
  <span class="cstat-no" title="statement not covered" > // WalletConnect ledger selection is step 3</span>
1891
- <span class="cstat-no" title="statement not covered" > return 3;</span>
1892
- <span class="cstat-no" title="statement not covered" > case ConnectionStep.QrPairing:</span>
2096
+ <span class="cstat-no" title="statement not covered" > return 3 - networkOffset;</span>
2097
+ <span class="branch-0 cbranch-no" title="branch not covered" > case ConnectionStep.QrPairing:</span>
1893
2098
  <span class="cstat-no" title="statement not covered" > // QR pairing is step 4 for both paths that use it</span>
1894
- <span class="cstat-no" title="statement not covered" > return 4;</span>
1895
- <span class="cstat-no" title="statement not covered" > case ConnectionStep.ConnectionProgress:</span>
2099
+ <span class="cstat-no" title="statement not covered" > return 4 - networkOffset;</span>
2100
+ <span class="branch-0 cbranch-no" title="branch not covered" > case ConnectionStep.ConnectionProgress:</span>
1896
2101
  <span class="cstat-no" title="statement not covered" > // Connection progress is always the last step</span>
1897
2102
  <span class="cstat-no" title="statement not covered" > return this.stepConfig().total;</span>
1898
- <span class="cstat-no" title="statement not covered" > default:</span>
2103
+ <span class="branch-0 cbranch-no" title="branch not covered" > default:</span>
1899
2104
  <span class="cstat-no" title="statement not covered" > return 1;</span>
2105
+ }
2106
+ });
2107
+ &nbsp;
2108
+ /**
2109
+ * Whether a back affordance should be offered for the current step.
2110
+ * The first reachable step has no back target — that is protocol selection
2111
+ * when the network is pinned, otherwise network selection. The connection
2112
+ * progress step manages its own retry navigation instead.
2113
+ */
2114
+ readonly canGoBack = computed&lt;boolean&gt;(() =&gt; {
2115
+ const step = this.currentStep();
2116
+ if (step === ConnectionStep.ConnectionProgress) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2117
+ <span class="cstat-no" title="statement not covered" > return false;</span>
1900
2118
  <span class="cstat-no" title="statement not covered" > }</span>
1901
- <span class="cstat-no" title="statement not covered" > });</span>
1902
- <span class="cstat-no" title="statement not covered" ></span>
1903
- <span class="cstat-no" title="statement not covered" > /**</span>
1904
- <span class="cstat-no" title="statement not covered" > *</span>
1905
- <span class="cstat-no" title="statement not covered" > * @param modalController</span>
1906
- <span class="cstat-no" title="statement not covered" > * @param unifiedWalletService</span>
1907
- <span class="cstat-no" title="statement not covered" > */</span>
1908
- <span class="cstat-no" title="statement not covered" > constructor(</span>
1909
- <span class="cstat-no" title="statement not covered" > private modalController: ModalController,</span>
1910
- <span class="cstat-no" title="statement not covered" > private unifiedWalletService: UnifiedWalletService,</span>
1911
- <span class="cstat-no" title="statement not covered" > ) {</span>
1912
- <span class="cstat-no" title="statement not covered" > // Set up mobile provider connection callback</span>
1913
- <span class="cstat-no" title="statement not covered" > this.p2pNativeProvider.onPeerConnected(() =&gt; {</span>
2119
+ const firstStep = this.network
2120
+ ? <span class="branch-0 cbranch-no" title="branch not covered" >ConnectionStep.ProtocolSelection</span>
2121
+ <span class="cstat-no" title="statement not covered" > : ConnectionStep.NetworkSelection;</span>
2122
+ return step &gt; firstStep;
2123
+ });
2124
+ &nbsp;
2125
+ /**
2126
+ *
2127
+ * @param modalController
2128
+ * @param unifiedWalletService
2129
+ */
2130
+ constructor(
2131
+ private modalController: ModalController,
2132
+ private unifiedWalletService: UnifiedWalletService,
2133
+ ) {
2134
+ // Set up mobile provider connection callback
2135
+ this.p2pNativeProvider.onPeerConnected(() =&gt; {
1914
2136
  <span class="cstat-no" title="statement not covered" > this.onMobileConnected();</span>
1915
- <span class="cstat-no" title="statement not covered" > });</span>
1916
- <span class="cstat-no" title="statement not covered" > }</span>
1917
- <span class="cstat-no" title="statement not covered" ></span>
1918
- <span class="cstat-no" title="statement not covered" > /**</span>
1919
- <span class="cstat-no" title="statement not covered" > * Select a network option (internal, use selectNetworkAndProceed for UI)</span>
1920
- <span class="cstat-no" title="statement not covered" > * @param networkId</span>
1921
- <span class="cstat-no" title="statement not covered" > */</span>
1922
- <span class="cstat-no" title="statement not covered" > selectNetwork(networkId: string): void {</span>
1923
- <span class="cstat-no" title="statement not covered" > this.selectedNetwork.set(networkId);</span>
1924
- <span class="cstat-no" title="statement not covered" > }</span>
1925
- <span class="cstat-no" title="statement not covered" ></span>
1926
- <span class="cstat-no" title="statement not covered" > /**</span>
1927
- <span class="cstat-no" title="statement not covered" > * Select a network and automatically proceed to the next step.</span>
1928
- <span class="cstat-no" title="statement not covered" > * This enables direct selection behavior without requiring a "Next" button.</span>
1929
- <span class="cstat-no" title="statement not covered" > * @param networkId - The network ID to select ('mainnet' or 'testnet')</span>
1930
- <span class="cstat-no" title="statement not covered" > */</span>
1931
- <span class="cstat-no" title="statement not covered" > selectNetworkAndProceed(networkId: string): void {</span>
2137
+ });
2138
+ &nbsp;
2139
+ // Register the shared ledger brand logos so &lt;ion-icon&gt; can resolve them by name.
2140
+ registerLedgerIcons();
2141
+ }
2142
+ &nbsp;
2143
+ /**
2144
+ * Apply the pinned network (if any) before the first render.
2145
+ *
2146
+ * When the host dApp provides a {@link network}, lock the selection to it and
2147
+ * skip straight to protocol selection so the user never sees — and cannot
2148
+ * change — the network. With no input, the modal opens on network selection.
2149
+ */
2150
+ ngOnInit(): void {
2151
+ if (this.network) {
2152
+ this.selectedNetwork.set(this.network);
2153
+ this.currentStep.set(ConnectionStep.ProtocolSelection);
2154
+ }
2155
+ }
2156
+ &nbsp;
2157
+ /**
2158
+ * Select a network option (internal, use selectNetworkAndProceed for UI)
2159
+ * @param networkId
2160
+ */
2161
+ <span class="fstat-no" title="function not covered" > selectNetwork(networkId: string): void {</span>
1932
2162
  <span class="cstat-no" title="statement not covered" > this.selectedNetwork.set(networkId);</span>
1933
- <span class="cstat-no" title="statement not covered" > // Auto-advance to protocol selection</span>
1934
- <span class="cstat-no" title="statement not covered" > this.currentStep.set(ConnectionStep.ProtocolSelection);</span>
1935
2163
  <span class="cstat-no" title="statement not covered" > }</span>
1936
- <span class="cstat-no" title="statement not covered" ></span>
1937
- <span class="cstat-no" title="statement not covered" > /**</span>
1938
- <span class="cstat-no" title="statement not covered" > * Select a protocol option (internal, use selectProtocolAndProceed for UI)</span>
1939
- <span class="cstat-no" title="statement not covered" > * @param protocolId</span>
1940
- <span class="cstat-no" title="statement not covered" > */</span>
1941
- <span class="cstat-no" title="statement not covered" > selectProtocol(protocolId: 'hsuite-native' | 'walletconnect'): void {</span>
1942
- <span class="cstat-no" title="statement not covered" > this.selectedProtocol.set(protocolId);</span>
1943
- <span class="cstat-no" title="statement not covered" > }</span>
1944
- <span class="cstat-no" title="statement not covered" ></span>
1945
- <span class="cstat-no" title="statement not covered" > /**</span>
1946
- <span class="cstat-no" title="statement not covered" > * Select a protocol and automatically proceed to the appropriate next step.</span>
1947
- <span class="cstat-no" title="statement not covered" > * - HSuite Native → Connection Method Selection</span>
1948
- <span class="cstat-no" title="statement not covered" > * - WalletConnect → Ledger Selection</span>
1949
- <span class="cstat-no" title="statement not covered" > * @param protocolId - The protocol ID to select</span>
1950
- <span class="cstat-no" title="statement not covered" > */</span>
1951
- <span class="cstat-no" title="statement not covered" > selectProtocolAndProceed(protocolId: 'hsuite-native' | 'walletconnect'): void {</span>
1952
- <span class="cstat-no" title="statement not covered" > this.selectedProtocol.set(protocolId);</span>
1953
- <span class="cstat-no" title="statement not covered" ></span>
1954
- <span class="cstat-no" title="statement not covered" > if (protocolId === 'hsuite-native') {</span>
1955
- <span class="cstat-no" title="statement not covered" > // HSuite Native: Go to connection method selection</span>
1956
- <span class="cstat-no" title="statement not covered" > this.currentStep.set(ConnectionStep.ConnectionMethodSelection);</span>
1957
- <span class="cstat-no" title="statement not covered" > } else {</span>
2164
+ &nbsp;
2165
+ /**
2166
+ * Select a network and automatically proceed to the next step.
2167
+ * This enables direct selection behavior without requiring a "Next" button.
2168
+ * @param networkId - The network ID to select ('mainnet' or 'testnet')
2169
+ */
2170
+ selectNetworkAndProceed(networkId: string): void {
2171
+ this.selectedNetwork.set(networkId);
2172
+ // Auto-advance to protocol selection
2173
+ this.currentStep.set(ConnectionStep.ProtocolSelection);
2174
+ }
2175
+ &nbsp;
2176
+ /**
2177
+ * Select a protocol option (internal, use selectProtocolAndProceed for UI)
2178
+ * @param protocolId
2179
+ */
2180
+ selectProtocol(protocolId: 'hsuite-native' | 'walletconnect'): void {
2181
+ this.selectedProtocol.set(protocolId);
2182
+ }
2183
+ &nbsp;
2184
+ /**
2185
+ * Select a protocol and automatically proceed to the appropriate next step.
2186
+ * - HSuite Native → Connection Method Selection
2187
+ * - WalletConnect → Ledger Selection
2188
+ * @param protocolId - The protocol ID to select
2189
+ */
2190
+ selectProtocolAndProceed(protocolId: 'hsuite-native' | 'walletconnect'): void {
2191
+ this.selectedProtocol.set(protocolId);
2192
+ &nbsp;
2193
+ if (protocolId === 'hsuite-native') {
2194
+ // HSuite Native: Go to connection method selection
2195
+ this.currentStep.set(ConnectionStep.ConnectionMethodSelection);
2196
+ <span class="branch-0 cbranch-no" title="branch not covered" > } else {</span>
1958
2197
  <span class="cstat-no" title="statement not covered" > // WalletConnect: Go to ledger selection</span>
1959
2198
  <span class="cstat-no" title="statement not covered" > this.currentStep.set(ConnectionStep.LedgerSelection);</span>
1960
2199
  <span class="cstat-no" title="statement not covered" > }</span>
1961
- <span class="cstat-no" title="statement not covered" > }</span>
1962
- <span class="cstat-no" title="statement not covered" ></span>
1963
- <span class="cstat-no" title="statement not covered" > /**</span>
1964
- <span class="cstat-no" title="statement not covered" > * Select a connection method (internal)</span>
1965
- <span class="cstat-no" title="statement not covered" > * @param methodId</span>
1966
- <span class="cstat-no" title="statement not covered" > */</span>
1967
- <span class="cstat-no" title="statement not covered" > selectConnectionMethod(methodId: string): void {</span>
1968
- <span class="cstat-no" title="statement not covered" > this.selectedConnectionMethod.set(methodId as ConnectionMethod);</span>
1969
- <span class="cstat-no" title="statement not covered" > }</span>
1970
- <span class="cstat-no" title="statement not covered" ></span>
1971
- <span class="cstat-no" title="statement not covered" > /**</span>
1972
- <span class="cstat-no" title="statement not covered" > * Handle connection method selection from step component.</span>
1973
- <span class="cstat-no" title="statement not covered" > * Automatically proceeds to connect or QR pairing based on method.</span>
1974
- <span class="cstat-no" title="statement not covered" > * @param methodId</span>
1975
- <span class="cstat-no" title="statement not covered" > */</span>
1976
- <span class="cstat-no" title="statement not covered" > onConnectionMethodSelected(methodId: string): void {</span>
2200
+ }
2201
+ &nbsp;
2202
+ /**
2203
+ * Select a connection method (internal)
2204
+ * @param methodId
2205
+ */
2206
+ selectConnectionMethod(methodId: string): void {
2207
+ this.selectedConnectionMethod.set(methodId as ConnectionMethod);
2208
+ }
2209
+ &nbsp;
2210
+ /**
2211
+ * Handle connection method selection from step component.
2212
+ * Automatically proceeds to connect or QR pairing based on method.
2213
+ * @param methodId
2214
+ */
2215
+ <span class="fstat-no" title="function not covered" > onConnectionMethodSelected(methodId: string): void {</span>
1977
2216
  <span class="cstat-no" title="statement not covered" > this.selectConnectionMethod(methodId);</span>
1978
2217
  <span class="cstat-no" title="statement not covered" > void this.next();</span>
1979
2218
  <span class="cstat-no" title="statement not covered" > }</span>
1980
- <span class="cstat-no" title="statement not covered" ></span>
1981
- <span class="cstat-no" title="statement not covered" > /**</span>
1982
- <span class="cstat-no" title="statement not covered" > * Select a ledger option (internal, use selectLedgerAndConnect for UI)</span>
1983
- <span class="cstat-no" title="statement not covered" > * @param ledgerId</span>
1984
- <span class="cstat-no" title="statement not covered" > */</span>
1985
- <span class="cstat-no" title="statement not covered" > selectLedger(ledgerId: 'hedera' | 'xrpl'): void {</span>
2219
+ &nbsp;
2220
+ /**
2221
+ * Select a ledger option (internal, use selectLedgerAndConnect for UI)
2222
+ * @param ledgerId
2223
+ */
2224
+ <span class="fstat-no" title="function not covered" > selectLedger(ledgerId: SupportedLedger): void {</span>
1986
2225
  <span class="cstat-no" title="statement not covered" > this.selectedLedger.set(ledgerId);</span>
1987
2226
  <span class="cstat-no" title="statement not covered" > }</span>
1988
- <span class="cstat-no" title="statement not covered" ></span>
1989
- <span class="cstat-no" title="statement not covered" > /**</span>
1990
- <span class="cstat-no" title="statement not covered" > * Select a ledger and automatically initiate connection.</span>
1991
- <span class="cstat-no" title="statement not covered" > * This enables direct selection behavior for WalletConnect ledger step.</span>
1992
- <span class="cstat-no" title="statement not covered" > * @param ledgerId - The ledger ID to select ('hedera' or 'xrpl')</span>
1993
- <span class="cstat-no" title="statement not covered" > */</span>
1994
- <span class="cstat-no" title="statement not covered" > selectLedgerAndConnect(ledgerId: 'hedera' | 'xrpl'): void {</span>
2227
+ &nbsp;
2228
+ /**
2229
+ * Select a ledger and automatically initiate connection.
2230
+ * This enables direct selection behavior for WalletConnect ledger step.
2231
+ * @param ledgerId - The ledger ID to select ('hedera' or 'xrpl')
2232
+ */
2233
+ <span class="fstat-no" title="function not covered" > selectLedgerAndConnect(ledgerId: SupportedLedger): void {</span>
1995
2234
  <span class="cstat-no" title="statement not covered" > this.selectedLedger.set(ledgerId);</span>
1996
2235
  <span class="cstat-no" title="statement not covered" > // Auto-connect with the selected ledger</span>
1997
2236
  <span class="cstat-no" title="statement not covered" > void this.connect();</span>
1998
2237
  <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" > /**</span>
2001
- <span class="cstat-no" title="statement not covered" > * Proceed to the next step in the wizard</span>
2002
- <span class="cstat-no" title="statement not covered" > */</span>
2003
- <span class="cstat-no" title="statement not covered" > async next(): Promise&lt;void&gt; {</span>
2004
- <span class="cstat-no" title="statement not covered" > const currentStep = this.currentStep();</span>
2005
- <span class="cstat-no" title="statement not covered" ></span>
2006
- <span class="cstat-no" title="statement not covered" > if (currentStep === ConnectionStep.NetworkSelection) {</span>
2238
+ &nbsp;
2239
+ /**
2240
+ * Proceed to the next step in the wizard
2241
+ */
2242
+ async next(): Promise&lt;void&gt; {
2243
+ const currentStep = this.currentStep();
2244
+ &nbsp;
2245
+ if (currentStep === ConnectionStep.NetworkSelection) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2007
2246
  <span class="cstat-no" title="statement not covered" > this.currentStep.set(ConnectionStep.ProtocolSelection);</span>
2008
- <span class="cstat-no" title="statement not covered" > } else if (currentStep === ConnectionStep.ProtocolSelection) {</span>
2247
+ } else if (currentStep === ConnectionStep.ProtocolSelection) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2009
2248
  <span class="cstat-no" title="statement not covered" > const protocol = this.selectedProtocol();</span>
2010
2249
  <span class="cstat-no" title="statement not covered" > if (protocol === 'hsuite-native') {</span>
2011
2250
  <span class="cstat-no" title="statement not covered" > // HSuite Native: Show connection method selection</span>
@@ -2014,29 +2253,33 @@
2014
2253
  <span class="cstat-no" title="statement not covered" > // WalletConnect: Show ledger selection</span>
2015
2254
  <span class="cstat-no" title="statement not covered" > this.currentStep.set(ConnectionStep.LedgerSelection);</span>
2016
2255
  <span class="cstat-no" title="statement not covered" > }</span>
2017
- <span class="cstat-no" title="statement not covered" > } else if (currentStep === ConnectionStep.ConnectionMethodSelection) {</span>
2018
- <span class="cstat-no" title="statement not covered" > const method = this.selectedConnectionMethod();</span>
2019
- <span class="cstat-no" title="statement not covered" > if (method === 'mobile-qr') {</span>
2256
+ } else if (currentStep === ConnectionStep.ConnectionMethodSelection) {
2257
+ const method = this.selectedConnectionMethod();
2258
+ if (method === 'mobile-qr') <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2020
2259
  <span class="cstat-no" title="statement not covered" > // Mobile QR: Show QR pairing step</span>
2021
2260
  <span class="cstat-no" title="statement not covered" > await this.initiateQrPairing();</span>
2022
- <span class="cstat-no" title="statement not covered" > } else {</span>
2023
- <span class="cstat-no" title="statement not covered" > // Desktop: Connect directly (SDK auto-selects extension or PWA)</span>
2024
- <span class="cstat-no" title="statement not covered" > await this.connect();</span>
2025
- <span class="cstat-no" title="statement not covered" > }</span>
2026
- <span class="cstat-no" title="statement not covered" > } else if (currentStep === ConnectionStep.LedgerSelection) {</span>
2261
+ } else {
2262
+ // Desktop: Connect directly (SDK auto-selects extension or PWA)
2263
+ await this.connect();
2264
+ }
2265
+ <span class="branch-0 cbranch-no" title="branch not covered" > } else if (currentStep === ConnectionStep.LedgerSelection) {</span>
2027
2266
  <span class="cstat-no" title="statement not covered" > // Connect with selected ledger</span>
2028
2267
  <span class="cstat-no" title="statement not covered" > await this.connect();</span>
2029
2268
  <span class="cstat-no" title="statement not covered" > }</span>
2030
- <span class="cstat-no" title="statement not covered" > }</span>
2031
- <span class="cstat-no" title="statement not covered" ></span>
2032
- <span class="cstat-no" title="statement not covered" > /**</span>
2033
- <span class="cstat-no" title="statement not covered" > * Go back to the previous step</span>
2034
- <span class="cstat-no" title="statement not covered" > */</span>
2035
- <span class="cstat-no" title="statement not covered" > back(): void {</span>
2036
- <span class="cstat-no" title="statement not covered" > const currentStep = this.currentStep();</span>
2037
- <span class="cstat-no" title="statement not covered" > if (currentStep === ConnectionStep.ProtocolSelection) {</span>
2038
- <span class="cstat-no" title="statement not covered" > this.currentStep.set(ConnectionStep.NetworkSelection);</span>
2039
- <span class="cstat-no" title="statement not covered" > } else if (currentStep === ConnectionStep.ConnectionMethodSelection) {</span>
2269
+ }
2270
+ &nbsp;
2271
+ /**
2272
+ * Go back to the previous step
2273
+ */
2274
+ back(): void {
2275
+ const currentStep = this.currentStep();
2276
+ if (currentStep === ConnectionStep.ProtocolSelection) {
2277
+ // When the network is pinned, protocol selection is the first reachable
2278
+ // step there is no network step to return to.
2279
+ if (!this.network) {
2280
+ this.currentStep.set(ConnectionStep.NetworkSelection);
2281
+ }
2282
+ <span class="branch-0 cbranch-no" title="branch not covered" > } else if (currentStep === ConnectionStep.ConnectionMethodSelection) {</span>
2040
2283
  <span class="cstat-no" title="statement not covered" > this.currentStep.set(ConnectionStep.ProtocolSelection);</span>
2041
2284
  <span class="cstat-no" title="statement not covered" > } else if (currentStep === ConnectionStep.LedgerSelection) {</span>
2042
2285
  <span class="cstat-no" title="statement not covered" > this.currentStep.set(ConnectionStep.ProtocolSelection);</span>
@@ -2059,35 +2302,35 @@
2059
2302
  <span class="cstat-no" title="statement not covered" > this.connectionError.set(null);</span>
2060
2303
  <span class="cstat-no" title="statement not covered" > this.isConnecting.set(false);</span>
2061
2304
  <span class="cstat-no" title="statement not covered" > }</span>
2062
- <span class="cstat-no" title="statement not covered" > }</span>
2063
- <span class="cstat-no" title="statement not covered" ></span>
2064
- <span class="cstat-no" title="statement not covered" > /**</span>
2065
- <span class="cstat-no" title="statement not covered" > * Connect to the selected protocol and ledger</span>
2066
- <span class="cstat-no" title="statement not covered" > */</span>
2067
- <span class="cstat-no" title="statement not covered" > private async connect(): Promise&lt;void&gt; {</span>
2068
- <span class="cstat-no" title="statement not covered" > this.currentStep.set(ConnectionStep.ConnectionProgress);</span>
2069
- <span class="cstat-no" title="statement not covered" > this.isConnecting.set(true);</span>
2070
- <span class="cstat-no" title="statement not covered" > this.connectionError.set(null);</span>
2071
- <span class="cstat-no" title="statement not covered" ></span>
2072
- <span class="cstat-no" title="statement not covered" > try {</span>
2073
- <span class="cstat-no" title="statement not covered" > const protocol = this.selectedProtocol();</span>
2074
- <span class="cstat-no" title="statement not covered" > const network = this.selectedNetwork();</span>
2075
- <span class="cstat-no" title="statement not covered" ></span>
2076
- <span class="cstat-no" title="statement not covered" > if (protocol === 'hsuite-native') {</span>
2077
- <span class="cstat-no" title="statement not covered" > // Connect to HSuite Native (multi-chain by default)</span>
2078
- <span class="cstat-no" title="statement not covered" > // Use the input walletUrl and pass targetWindow metadata for consistent window naming</span>
2079
- <span class="cstat-no" title="statement not covered" > await this.unifiedWalletService.connect('hsuite-native', {</span>
2080
- <span class="cstat-no" title="statement not covered" > type: 'hsuite-native',</span>
2081
- <span class="cstat-no" title="statement not covered" > appId: 'hsuite-demo',</span>
2082
- <span class="cstat-no" title="statement not covered" > appName: this.appName,</span>
2083
- <span class="cstat-no" title="statement not covered" > ledgerId: 'multi-chain',</span>
2084
- <span class="cstat-no" title="statement not covered" > networkId: network || 'testnet',</span>
2085
- <span class="cstat-no" title="statement not covered" > walletUrl: this.walletUrl,</span>
2086
- <span class="cstat-no" title="statement not covered" > metadata: {</span>
2087
- <span class="cstat-no" title="statement not covered" > targetWindow: 'hsuite-wallet',</span>
2088
- <span class="cstat-no" title="statement not covered" > },</span>
2089
- <span class="cstat-no" title="statement not covered" > });</span>
2090
- <span class="cstat-no" title="statement not covered" > } else if (protocol === 'walletconnect') {</span>
2305
+ }
2306
+ &nbsp;
2307
+ /**
2308
+ * Connect to the selected protocol and ledger
2309
+ */
2310
+ private async connect(): Promise&lt;void&gt; {
2311
+ this.currentStep.set(ConnectionStep.ConnectionProgress);
2312
+ this.isConnecting.set(true);
2313
+ this.connectionError.set(null);
2314
+ &nbsp;
2315
+ try {
2316
+ const protocol = this.selectedProtocol();
2317
+ const network = this.selectedNetwork();
2318
+ &nbsp;
2319
+ if (protocol === 'hsuite-native') {
2320
+ // Connect to HSuite Native (multi-chain by default)
2321
+ // Use the input walletUrl and pass targetWindow metadata for consistent window naming
2322
+ await this.unifiedWalletService.connect('hsuite-native', {
2323
+ type: 'hsuite-native',
2324
+ appId: 'hsuite-demo',
2325
+ appName: this.appName,
2326
+ ledgerId: 'multi-chain',
2327
+ networkId: <span class="branch-0 cbranch-no" title="branch not covered" >network || 'testnet',</span>
2328
+ walletUrl: this.walletUrl,
2329
+ metadata: {
2330
+ targetWindow: 'hsuite-wallet',
2331
+ },
2332
+ });
2333
+ <span class="branch-0 cbranch-no" title="branch not covered" > } else if (protocol === 'walletconnect') {</span>
2091
2334
  <span class="cstat-no" title="statement not covered" > // Connect to WalletConnect (ledger-specific)</span>
2092
2335
  <span class="cstat-no" title="statement not covered" > const ledger = this.selectedLedger();</span>
2093
2336
  <span class="cstat-no" title="statement not covered" > if (!ledger) {</span>
@@ -2111,11 +2354,11 @@
2111
2354
  <span class="cstat-no" title="statement not covered" ></span>
2112
2355
  <span class="cstat-no" title="statement not covered" > await this.unifiedWalletService.connect('walletconnect-v2', config);</span>
2113
2356
  <span class="cstat-no" title="statement not covered" > }</span>
2114
- <span class="cstat-no" title="statement not covered" ></span>
2115
- <span class="cstat-no" title="statement not covered" > // Success! Emit event and close modal</span>
2116
- <span class="cstat-no" title="statement not covered" > this.connected.emit({ protocol, network });</span>
2117
- <span class="cstat-no" title="statement not covered" > await this.modalController.dismiss({ connected: true });</span>
2118
- <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
2357
+ &nbsp;
2358
+ // Success! Emit event and close modal
2359
+ this.connected.emit({ protocol, network });
2360
+ await this.modalController.dismiss({ connected: true });
2361
+ <span class="branch-0 cbranch-no" title="branch not covered" > } catch (error) {</span>
2119
2362
  <span class="cstat-no" title="statement not covered" > logger.error('Connection failed', {</span>
2120
2363
  <span class="cstat-no" title="statement not covered" > error: error instanceof Error ? error.message : String(error),</span>
2121
2364
  <span class="cstat-no" title="statement not covered" > });</span>
@@ -2126,27 +2369,27 @@
2126
2369
  <span class="cstat-no" title="statement not covered" > // Stay on ConnectionProgress to show the error and "Try Again" button</span>
2127
2370
  <span class="cstat-no" title="statement not covered" > // Don't auto-navigate away - let user click "Try Again" which calls back()</span>
2128
2371
  <span class="cstat-no" title="statement not covered" > }</span>
2129
- <span class="cstat-no" title="statement not covered" > }</span>
2130
- <span class="cstat-no" title="statement not covered" ></span>
2131
- <span class="cstat-no" title="statement not covered" > /**</span>
2132
- <span class="cstat-no" title="statement not covered" > * Close the modal without connecting</span>
2133
- <span class="cstat-no" title="statement not covered" > */</span>
2134
- <span class="cstat-no" title="statement not covered" > async dismiss(): Promise&lt;void&gt; {</span>
2372
+ }
2373
+ &nbsp;
2374
+ /**
2375
+ * Close the modal without connecting
2376
+ */
2377
+ <span class="fstat-no" title="function not covered" > async dismiss(): Promise&lt;void&gt; {</span>
2135
2378
  <span class="cstat-no" title="statement not covered" > await this.modalController.dismiss({ connected: false });</span>
2136
2379
  <span class="cstat-no" title="statement not covered" > }</span>
2137
- <span class="cstat-no" title="statement not covered" ></span>
2138
- <span class="cstat-no" title="statement not covered" > // ========== QR Pairing Methods ==========</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" > * Initiate QR pairing flow for mobile connection (Nostr-first protocol).</span>
2142
- <span class="cstat-no" title="statement not covered" > *</span>
2143
- <span class="cstat-no" title="statement not covered" > * Flow:</span>
2144
- <span class="cstat-no" title="statement not covered" > * 1. Generate session invite QR code</span>
2145
- <span class="cstat-no" title="statement not covered" > * 2. Wait for wallet to scan and connect via Nostr</span>
2146
- <span class="cstat-no" title="statement not covered" > * 3. Wait for wallet user to approve session</span>
2147
- <span class="cstat-no" title="statement not covered" > * 4. P2P upgrade happens automatically in background</span>
2148
- <span class="cstat-no" title="statement not covered" > */</span>
2149
- <span class="cstat-no" title="statement not covered" > private async initiateQrPairing(): Promise&lt;void&gt; {</span>
2380
+ &nbsp;
2381
+ // ========== QR Pairing Methods ==========
2382
+ &nbsp;
2383
+ /**
2384
+ * Initiate QR pairing flow for mobile connection (Nostr-first protocol).
2385
+ *
2386
+ * Flow:
2387
+ * 1. Generate session invite QR code
2388
+ * 2. Wait for wallet to scan and connect via Nostr
2389
+ * 3. Wait for wallet user to approve session
2390
+ * 4. P2P upgrade happens automatically in background
2391
+ */
2392
+ <span class="fstat-no" title="function not covered" > private async initiateQrPairing(): Promise&lt;void&gt; {</span>
2150
2393
  <span class="cstat-no" title="statement not covered" > this.currentStep.set(ConnectionStep.QrPairing);</span>
2151
2394
  <span class="cstat-no" title="statement not covered" > this.isGeneratingOffer.set(true);</span>
2152
2395
  <span class="cstat-no" title="statement not covered" > this.connectionError.set(null);</span>
@@ -2175,12 +2418,12 @@
2175
2418
  <span class="cstat-no" title="statement not covered" > this.isGeneratingOffer.set(false);</span>
2176
2419
  <span class="cstat-no" title="statement not covered" > }</span>
2177
2420
  <span class="cstat-no" title="statement not covered" > }</span>
2178
- <span class="cstat-no" title="statement not covered" ></span>
2179
- <span class="cstat-no" title="statement not covered" > /**</span>
2180
- <span class="cstat-no" title="statement not covered" > * Wait for wallet to connect via Nostr and approve the session.</span>
2181
- <span class="cstat-no" title="statement not covered" > * This is the new single-QR flow - no answer scanning needed.</span>
2182
- <span class="cstat-no" title="statement not covered" > */</span>
2183
- <span class="cstat-no" title="statement not covered" > private async waitForWalletApproval(): Promise&lt;void&gt; {</span>
2421
+ &nbsp;
2422
+ /**
2423
+ * Wait for wallet to connect via Nostr and approve the session.
2424
+ * This is the new single-QR flow - no answer scanning needed.
2425
+ */
2426
+ <span class="fstat-no" title="function not covered" > private async waitForWalletApproval(): Promise&lt;void&gt; {</span>
2184
2427
  <span class="cstat-no" title="statement not covered" > try {</span>
2185
2428
  <span class="cstat-no" title="statement not covered" > // This blocks until wallet scans QR, connects via Nostr, and user approves</span>
2186
2429
  <span class="cstat-no" title="statement not covered" > const session = await this.p2pNativeProvider.waitForSessionApproval();</span>
@@ -2203,56 +2446,56 @@
2203
2446
  <span class="cstat-no" title="statement not covered" > this.isWaitingForApproval.set(false);</span>
2204
2447
  <span class="cstat-no" title="statement not covered" > }</span>
2205
2448
  <span class="cstat-no" title="statement not covered" > }</span>
2206
- <span class="cstat-no" title="statement not covered" ></span>
2207
- <span class="cstat-no" title="statement not covered" > /**</span>
2208
- <span class="cstat-no" title="statement not covered" > * Handle QR code expiry</span>
2209
- <span class="cstat-no" title="statement not covered" > */</span>
2210
- <span class="cstat-no" title="statement not covered" > onQrExpired(): void {</span>
2449
+ &nbsp;
2450
+ /**
2451
+ * Handle QR code expiry
2452
+ */
2453
+ <span class="fstat-no" title="function not covered" > onQrExpired(): void {</span>
2211
2454
  <span class="cstat-no" title="statement not covered" > logger.debug('QR code expired');</span>
2212
2455
  <span class="cstat-no" title="statement not covered" > this.pairingOffer.set('');</span>
2213
2456
  <span class="cstat-no" title="statement not covered" > this.isWaitingForWallet.set(false);</span>
2214
2457
  <span class="cstat-no" title="statement not covered" > }</span>
2215
- <span class="cstat-no" title="statement not covered" ></span>
2216
- <span class="cstat-no" title="statement not covered" > /**</span>
2217
- <span class="cstat-no" title="statement not covered" > * Refresh the QR pairing offer</span>
2218
- <span class="cstat-no" title="statement not covered" > */</span>
2219
- <span class="cstat-no" title="statement not covered" > async onQrRefresh(): Promise&lt;void&gt; {</span>
2458
+ &nbsp;
2459
+ /**
2460
+ * Refresh the QR pairing offer
2461
+ */
2462
+ <span class="fstat-no" title="function not covered" > async onQrRefresh(): Promise&lt;void&gt; {</span>
2220
2463
  <span class="cstat-no" title="statement not covered" > this.isWaitingForWallet.set(false);</span>
2221
2464
  <span class="cstat-no" title="statement not covered" > this.isWaitingForApproval.set(false);</span>
2222
2465
  <span class="cstat-no" title="statement not covered" > await this.initiateQrPairing();</span>
2223
2466
  <span class="cstat-no" title="statement not covered" > }</span>
2224
- <span class="cstat-no" title="statement not covered" ></span>
2225
- <span class="cstat-no" title="statement not covered" > /**</span>
2226
- <span class="cstat-no" title="statement not covered" > * Handle successful mobile connection</span>
2227
- <span class="cstat-no" title="statement not covered" > */</span>
2228
- <span class="cstat-no" title="statement not covered" > private onMobileConnected(): void {</span>
2467
+ &nbsp;
2468
+ /**
2469
+ * Handle successful mobile connection
2470
+ */
2471
+ private <span class="fstat-no" title="function not covered" >onMobileConnected(): void {</span>
2229
2472
  <span class="cstat-no" title="statement not covered" > logger.info('Mobile wallet connected');</span>
2230
2473
  <span class="cstat-no" title="statement not covered" > this.connected.emit({ protocol: 'mobile-native', method: 'qr' });</span>
2231
2474
  <span class="cstat-no" title="statement not covered" > void this.modalController.dismiss({ connected: true });</span>
2232
2475
  <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" > // ========== Platform Detection ==========</span>
2235
- <span class="cstat-no" title="statement not covered" ></span>
2236
- <span class="cstat-no" title="statement not covered" > /**</span>
2237
- <span class="cstat-no" title="statement not covered" > * Detect if running on mobile device</span>
2238
- <span class="cstat-no" title="statement not covered" > */</span>
2239
- <span class="cstat-no" title="statement not covered" > private detectMobile(): boolean {</span>
2240
- <span class="cstat-no" title="statement not covered" > return this.platform.is('mobile') || this.platform.is('android') || this.platform.is('ios');</span>
2241
- <span class="cstat-no" title="statement not covered" > }</span>
2242
- <span class="cstat-no" title="statement not covered" ></span>
2243
- <span class="cstat-no" title="statement not covered" > /**</span>
2244
- <span class="cstat-no" title="statement not covered" > * Detect if HSuite extension is available.</span>
2245
- <span class="cstat-no" title="statement not covered" > * Checks for the flag injected by the extension's content script.</span>
2246
- <span class="cstat-no" title="statement not covered" > */</span>
2247
- <span class="cstat-no" title="statement not covered" > private detectExtension(): boolean {</span>
2248
- <span class="cstat-no" title="statement not covered" > if (typeof window === 'undefined') return false;</span>
2249
- <span class="cstat-no" title="statement not covered" > // Check for HSuite extension marker (injected by extension's inject-flags.ts)</span>
2250
- <span class="cstat-no" title="statement not covered" > return (</span>
2251
- <span class="cstat-no" title="statement not covered" > (window as unknown as { __HSUITE_WALLET_EXTENSION__?: boolean })</span>
2252
- <span class="cstat-no" title="statement not covered" > .__HSUITE_WALLET_EXTENSION__ === true</span>
2253
- <span class="cstat-no" title="statement not covered" > );</span>
2254
- <span class="cstat-no" title="statement not covered" > }</span>
2255
- <span class="cstat-no" title="statement not covered" >}</span>
2476
+ &nbsp;
2477
+ // ========== Platform Detection ==========
2478
+ &nbsp;
2479
+ /**
2480
+ * Detect if running on mobile device
2481
+ */
2482
+ private detectMobile(): boolean {
2483
+ return this.platform.is('mobile') || this.platform.is('android') || this.platform.is('ios');
2484
+ }
2485
+ &nbsp;
2486
+ /**
2487
+ * Detect if HSuite extension is available.
2488
+ * Checks for the flag injected by the extension's content script.
2489
+ */
2490
+ private detectExtension(): boolean {
2491
+ if (typeof window === 'undefined') <span class="branch-0 cbranch-no" title="branch not covered" >return false;</span>
2492
+ // Check for HSuite extension marker (injected by extension's inject-flags.ts)
2493
+ return (
2494
+ (window as unknown as { __HSUITE_WALLET_EXTENSION__?: boolean })
2495
+ .__HSUITE_WALLET_EXTENSION__ === true
2496
+ );
2497
+ }
2498
+ }
2256
2499
  &nbsp;</pre></td></tr></table></pre>
2257
2500
 
2258
2501
  <div class='push'></div><!-- for sticky footer -->
@@ -2260,7 +2503,7 @@
2260
2503
  <div class='footer quiet pad2 space-top1 center small'>
2261
2504
  Code coverage generated by
2262
2505
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2263
- at 2026-06-02T14:30:38.257Z
2506
+ at 2026-06-27T21:00:37.138Z
2264
2507
  </div>
2265
2508
  <script src="../../../prettify.js"></script>
2266
2509
  <script>