@sidhujag/sysweb3-keyring 1.0.547 → 1.0.548

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 (210) hide show
  1. package/package.json +2 -27
  2. package/coverage/clover.xml +0 -2875
  3. package/coverage/coverage-final.json +0 -29468
  4. package/coverage/lcov-report/base.css +0 -354
  5. package/coverage/lcov-report/block-navigation.js +0 -85
  6. package/coverage/lcov-report/favicon.png +0 -0
  7. package/coverage/lcov-report/index.html +0 -320
  8. package/coverage/lcov-report/prettify.css +0 -101
  9. package/coverage/lcov-report/prettify.js +0 -1008
  10. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  11. package/coverage/lcov-report/sorter.js +0 -191
  12. package/coverage/lcov-report/src/index.html +0 -276
  13. package/coverage/lcov-report/src/index.ts.html +0 -114
  14. package/coverage/lcov-report/src/initial-state.ts.html +0 -558
  15. package/coverage/lcov-report/src/keyring-manager.ts.html +0 -6279
  16. package/coverage/lcov-report/src/ledger/bitcoin_client/index.html +0 -178
  17. package/coverage/lcov-report/src/ledger/bitcoin_client/index.ts.html +0 -144
  18. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/appClient.ts.html +0 -1560
  19. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/bip32.ts.html +0 -276
  20. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/buffertools.ts.html +0 -495
  21. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/clientCommands.ts.html +0 -1138
  22. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/index.html +0 -363
  23. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/merkelizedPsbt.ts.html +0 -289
  24. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/merkle.ts.html +0 -486
  25. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/merkleMap.ts.html +0 -240
  26. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/policy.ts.html +0 -342
  27. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/psbtv2.ts.html +0 -2388
  28. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/varint.ts.html +0 -453
  29. package/coverage/lcov-report/src/ledger/consts.ts.html +0 -177
  30. package/coverage/lcov-report/src/ledger/index.html +0 -216
  31. package/coverage/lcov-report/src/ledger/index.ts.html +0 -1371
  32. package/coverage/lcov-report/src/ledger/utils.ts.html +0 -102
  33. package/coverage/lcov-report/src/signers.ts.html +0 -591
  34. package/coverage/lcov-report/src/storage.ts.html +0 -198
  35. package/coverage/lcov-report/src/transactions/ethereum.ts.html +0 -5826
  36. package/coverage/lcov-report/src/transactions/index.html +0 -216
  37. package/coverage/lcov-report/src/transactions/index.ts.html +0 -93
  38. package/coverage/lcov-report/src/transactions/syscoin.ts.html +0 -1521
  39. package/coverage/lcov-report/src/trezor/index.html +0 -176
  40. package/coverage/lcov-report/src/trezor/index.ts.html +0 -2655
  41. package/coverage/lcov-report/src/types.ts.html +0 -1443
  42. package/coverage/lcov-report/src/utils/derivation-paths.ts.html +0 -486
  43. package/coverage/lcov-report/src/utils/index.html +0 -196
  44. package/coverage/lcov-report/src/utils/psbt.ts.html +0 -159
  45. package/coverage/lcov-report/test/helpers/constants.ts.html +0 -627
  46. package/coverage/lcov-report/test/helpers/index.html +0 -176
  47. package/coverage/lcov.info +0 -4832
  48. package/dist/package.json +0 -50
  49. package/examples/basic-usage.js +0 -140
  50. package/jest.config.js +0 -32
  51. package/readme.md +0 -201
  52. package/src/declare.d.ts +0 -7
  53. package/src/errorUtils.ts +0 -83
  54. package/src/hardware-wallet-manager.ts +0 -655
  55. package/src/index.ts +0 -12
  56. package/src/initial-state.ts +0 -108
  57. package/src/keyring-manager.ts +0 -2698
  58. package/src/ledger/bitcoin_client/index.ts +0 -19
  59. package/src/ledger/bitcoin_client/lib/appClient.ts +0 -405
  60. package/src/ledger/bitcoin_client/lib/bip32.ts +0 -61
  61. package/src/ledger/bitcoin_client/lib/buffertools.ts +0 -134
  62. package/src/ledger/bitcoin_client/lib/clientCommands.ts +0 -356
  63. package/src/ledger/bitcoin_client/lib/constants.ts +0 -12
  64. package/src/ledger/bitcoin_client/lib/merkelizedPsbt.ts +0 -65
  65. package/src/ledger/bitcoin_client/lib/merkle.ts +0 -136
  66. package/src/ledger/bitcoin_client/lib/merkleMap.ts +0 -49
  67. package/src/ledger/bitcoin_client/lib/policy.ts +0 -91
  68. package/src/ledger/bitcoin_client/lib/psbtv2.ts +0 -768
  69. package/src/ledger/bitcoin_client/lib/varint.ts +0 -120
  70. package/src/ledger/consts.ts +0 -3
  71. package/src/ledger/index.ts +0 -685
  72. package/src/ledger/types.ts +0 -74
  73. package/src/network-utils.ts +0 -99
  74. package/src/providers.ts +0 -345
  75. package/src/signers.ts +0 -158
  76. package/src/storage.ts +0 -63
  77. package/src/transactions/__tests__/integration.test.ts +0 -303
  78. package/src/transactions/__tests__/syscoin.test.ts +0 -409
  79. package/src/transactions/ethereum.ts +0 -2503
  80. package/src/transactions/index.ts +0 -2
  81. package/src/transactions/syscoin.ts +0 -542
  82. package/src/trezor/index.ts +0 -1050
  83. package/src/types.ts +0 -366
  84. package/src/utils/derivation-paths.ts +0 -133
  85. package/src/utils/psbt.ts +0 -24
  86. package/src/utils.ts +0 -191
  87. package/test/README.md +0 -158
  88. package/test/__mocks__/ledger-mock.js +0 -20
  89. package/test/__mocks__/trezor-mock.js +0 -75
  90. package/test/cleanup-summary.md +0 -167
  91. package/test/helpers/README.md +0 -78
  92. package/test/helpers/constants.ts +0 -79
  93. package/test/helpers/setup.ts +0 -714
  94. package/test/integration/import-validation.spec.ts +0 -588
  95. package/test/unit/hardware/ledger.spec.ts +0 -869
  96. package/test/unit/hardware/trezor.spec.ts +0 -828
  97. package/test/unit/keyring-manager/account-management.spec.ts +0 -970
  98. package/test/unit/keyring-manager/import-watchonly.spec.ts +0 -181
  99. package/test/unit/keyring-manager/import-wif.spec.ts +0 -126
  100. package/test/unit/keyring-manager/initialization.spec.ts +0 -782
  101. package/test/unit/keyring-manager/key-derivation.spec.ts +0 -996
  102. package/test/unit/keyring-manager/security.spec.ts +0 -505
  103. package/test/unit/keyring-manager/state-management.spec.ts +0 -375
  104. package/test/unit/network/network-management.spec.ts +0 -372
  105. package/test/unit/transactions/ethereum-transactions.spec.ts +0 -382
  106. package/test/unit/transactions/syscoin-transactions.spec.ts +0 -615
  107. package/tsconfig.json +0 -14
  108. /package/{dist/README.md → README.md} +0 -0
  109. /package/{dist/cjs → cjs}/errorUtils.js +0 -0
  110. /package/{dist/cjs → cjs}/errorUtils.js.map +0 -0
  111. /package/{dist/cjs → cjs}/hardware-wallet-manager.js +0 -0
  112. /package/{dist/cjs → cjs}/hardware-wallet-manager.js.map +0 -0
  113. /package/{dist/cjs → cjs}/index.js +0 -0
  114. /package/{dist/cjs → cjs}/index.js.map +0 -0
  115. /package/{dist/cjs → cjs}/initial-state.js +0 -0
  116. /package/{dist/cjs → cjs}/initial-state.js.map +0 -0
  117. /package/{dist/cjs → cjs}/keyring-manager.js +0 -0
  118. /package/{dist/cjs → cjs}/keyring-manager.js.map +0 -0
  119. /package/{dist/cjs → cjs}/ledger/bitcoin_client/index.js +0 -0
  120. /package/{dist/cjs → cjs}/ledger/bitcoin_client/index.js.map +0 -0
  121. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/appClient.js +0 -0
  122. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/appClient.js.map +0 -0
  123. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/bip32.js +0 -0
  124. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/bip32.js.map +0 -0
  125. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/buffertools.js +0 -0
  126. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/buffertools.js.map +0 -0
  127. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/clientCommands.js +0 -0
  128. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/clientCommands.js.map +0 -0
  129. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/constants.js +0 -0
  130. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/constants.js.map +0 -0
  131. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/merkelizedPsbt.js +0 -0
  132. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/merkelizedPsbt.js.map +0 -0
  133. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/merkle.js +0 -0
  134. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/merkle.js.map +0 -0
  135. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/merkleMap.js +0 -0
  136. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/merkleMap.js.map +0 -0
  137. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/policy.js +0 -0
  138. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/policy.js.map +0 -0
  139. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/psbtv2.js +0 -0
  140. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/psbtv2.js.map +0 -0
  141. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/varint.js +0 -0
  142. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/varint.js.map +0 -0
  143. /package/{dist/cjs → cjs}/ledger/consts.js +0 -0
  144. /package/{dist/cjs → cjs}/ledger/consts.js.map +0 -0
  145. /package/{dist/cjs → cjs}/ledger/index.js +0 -0
  146. /package/{dist/cjs → cjs}/ledger/index.js.map +0 -0
  147. /package/{dist/cjs → cjs}/ledger/types.js +0 -0
  148. /package/{dist/cjs → cjs}/ledger/types.js.map +0 -0
  149. /package/{dist/cjs → cjs}/network-utils.js +0 -0
  150. /package/{dist/cjs → cjs}/network-utils.js.map +0 -0
  151. /package/{dist/cjs → cjs}/providers.js +0 -0
  152. /package/{dist/cjs → cjs}/providers.js.map +0 -0
  153. /package/{dist/cjs → cjs}/signers.js +0 -0
  154. /package/{dist/cjs → cjs}/signers.js.map +0 -0
  155. /package/{dist/cjs → cjs}/storage.js +0 -0
  156. /package/{dist/cjs → cjs}/storage.js.map +0 -0
  157. /package/{dist/cjs → cjs}/transactions/__tests__/integration.test.js +0 -0
  158. /package/{dist/cjs → cjs}/transactions/__tests__/integration.test.js.map +0 -0
  159. /package/{dist/cjs → cjs}/transactions/__tests__/syscoin.test.js +0 -0
  160. /package/{dist/cjs → cjs}/transactions/__tests__/syscoin.test.js.map +0 -0
  161. /package/{dist/cjs → cjs}/transactions/ethereum.js +0 -0
  162. /package/{dist/cjs → cjs}/transactions/ethereum.js.map +0 -0
  163. /package/{dist/cjs → cjs}/transactions/index.js +0 -0
  164. /package/{dist/cjs → cjs}/transactions/index.js.map +0 -0
  165. /package/{dist/cjs → cjs}/transactions/syscoin.js +0 -0
  166. /package/{dist/cjs → cjs}/transactions/syscoin.js.map +0 -0
  167. /package/{dist/cjs → cjs}/trezor/index.js +0 -0
  168. /package/{dist/cjs → cjs}/trezor/index.js.map +0 -0
  169. /package/{dist/cjs → cjs}/types.js +0 -0
  170. /package/{dist/cjs → cjs}/types.js.map +0 -0
  171. /package/{dist/cjs → cjs}/utils/derivation-paths.js +0 -0
  172. /package/{dist/cjs → cjs}/utils/derivation-paths.js.map +0 -0
  173. /package/{dist/cjs → cjs}/utils/psbt.js +0 -0
  174. /package/{dist/cjs → cjs}/utils/psbt.js.map +0 -0
  175. /package/{dist/cjs → cjs}/utils.js +0 -0
  176. /package/{dist/cjs → cjs}/utils.js.map +0 -0
  177. /package/{dist/types → types}/errorUtils.d.ts +0 -0
  178. /package/{dist/types → types}/hardware-wallet-manager.d.ts +0 -0
  179. /package/{dist/types → types}/index.d.ts +0 -0
  180. /package/{dist/types → types}/initial-state.d.ts +0 -0
  181. /package/{dist/types → types}/keyring-manager.d.ts +0 -0
  182. /package/{dist/types → types}/ledger/bitcoin_client/index.d.ts +0 -0
  183. /package/{dist/types → types}/ledger/bitcoin_client/lib/appClient.d.ts +0 -0
  184. /package/{dist/types → types}/ledger/bitcoin_client/lib/bip32.d.ts +0 -0
  185. /package/{dist/types → types}/ledger/bitcoin_client/lib/buffertools.d.ts +0 -0
  186. /package/{dist/types → types}/ledger/bitcoin_client/lib/clientCommands.d.ts +0 -0
  187. /package/{dist/types → types}/ledger/bitcoin_client/lib/constants.d.ts +0 -0
  188. /package/{dist/types → types}/ledger/bitcoin_client/lib/merkelizedPsbt.d.ts +0 -0
  189. /package/{dist/types → types}/ledger/bitcoin_client/lib/merkle.d.ts +0 -0
  190. /package/{dist/types → types}/ledger/bitcoin_client/lib/merkleMap.d.ts +0 -0
  191. /package/{dist/types → types}/ledger/bitcoin_client/lib/policy.d.ts +0 -0
  192. /package/{dist/types → types}/ledger/bitcoin_client/lib/psbtv2.d.ts +0 -0
  193. /package/{dist/types → types}/ledger/bitcoin_client/lib/varint.d.ts +0 -0
  194. /package/{dist/types → types}/ledger/consts.d.ts +0 -0
  195. /package/{dist/types → types}/ledger/index.d.ts +0 -0
  196. /package/{dist/types → types}/ledger/types.d.ts +0 -0
  197. /package/{dist/types → types}/network-utils.d.ts +0 -0
  198. /package/{dist/types → types}/providers.d.ts +0 -0
  199. /package/{dist/types → types}/signers.d.ts +0 -0
  200. /package/{dist/types → types}/storage.d.ts +0 -0
  201. /package/{dist/types → types}/transactions/__tests__/integration.test.d.ts +0 -0
  202. /package/{dist/types → types}/transactions/__tests__/syscoin.test.d.ts +0 -0
  203. /package/{dist/types → types}/transactions/ethereum.d.ts +0 -0
  204. /package/{dist/types → types}/transactions/index.d.ts +0 -0
  205. /package/{dist/types → types}/transactions/syscoin.d.ts +0 -0
  206. /package/{dist/types → types}/trezor/index.d.ts +0 -0
  207. /package/{dist/types → types}/types.d.ts +0 -0
  208. /package/{dist/types → types}/utils/derivation-paths.d.ts +0 -0
  209. /package/{dist/types → types}/utils/psbt.d.ts +0 -0
  210. /package/{dist/types → types}/utils.d.ts +0 -0
@@ -1,1560 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <title>
5
- Code coverage report for src/ledger/bitcoin_client/lib/appClient.ts
6
- </title>
7
- <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../../../../prettify.css" />
9
- <link rel="stylesheet" href="../../../../base.css" />
10
- <link
11
- rel="shortcut icon"
12
- type="image/x-icon"
13
- href="../../../../favicon.png"
14
- />
15
- <meta name="viewport" content="width=device-width, initial-scale=1" />
16
- <style type="text/css">
17
- .coverage-summary .sorter {
18
- background-image: url(../../../../sort-arrow-sprite.png);
19
- }
20
- </style>
21
- </head>
22
-
23
- <body>
24
- <div class="wrapper">
25
- <div class="pad1">
26
- <h1>
27
- <a href="../../../../index.html">All files</a> /
28
- <a href="index.html">src/ledger/bitcoin_client/lib</a> appClient.ts
29
- </h1>
30
- <div class="clearfix">
31
- <div class="fl pad1y space-right2">
32
- <span class="strong">15.72% </span>
33
- <span class="quiet">Statements</span>
34
- <span class="fraction">25/159</span>
35
- </div>
36
-
37
- <div class="fl pad1y space-right2">
38
- <span class="strong">7.69% </span>
39
- <span class="quiet">Branches</span>
40
- <span class="fraction">4/52</span>
41
- </div>
42
-
43
- <div class="fl pad1y space-right2">
44
- <span class="strong">11.76% </span>
45
- <span class="quiet">Functions</span>
46
- <span class="fraction">2/17</span>
47
- </div>
48
-
49
- <div class="fl pad1y space-right2">
50
- <span class="strong">16.12% </span>
51
- <span class="quiet">Lines</span>
52
- <span class="fraction">25/155</span>
53
- </div>
54
- </div>
55
- <p class="quiet">
56
- Press <em>n</em> or <em>j</em> to go to the next uncovered block,
57
- <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
58
- </p>
59
- <template id="filterTemplate">
60
- <div class="quiet">
61
- Filter:
62
- <input type="search" id="fileSearch" />
63
- </div>
64
- </template>
65
- </div>
66
- <div class="status-line low"></div>
67
- <pre><table class="coverage">
68
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
69
- <a name='L2'></a><a href='#L2'>2</a>
70
- <a name='L3'></a><a href='#L3'>3</a>
71
- <a name='L4'></a><a href='#L4'>4</a>
72
- <a name='L5'></a><a href='#L5'>5</a>
73
- <a name='L6'></a><a href='#L6'>6</a>
74
- <a name='L7'></a><a href='#L7'>7</a>
75
- <a name='L8'></a><a href='#L8'>8</a>
76
- <a name='L9'></a><a href='#L9'>9</a>
77
- <a name='L10'></a><a href='#L10'>10</a>
78
- <a name='L11'></a><a href='#L11'>11</a>
79
- <a name='L12'></a><a href='#L12'>12</a>
80
- <a name='L13'></a><a href='#L13'>13</a>
81
- <a name='L14'></a><a href='#L14'>14</a>
82
- <a name='L15'></a><a href='#L15'>15</a>
83
- <a name='L16'></a><a href='#L16'>16</a>
84
- <a name='L17'></a><a href='#L17'>17</a>
85
- <a name='L18'></a><a href='#L18'>18</a>
86
- <a name='L19'></a><a href='#L19'>19</a>
87
- <a name='L20'></a><a href='#L20'>20</a>
88
- <a name='L21'></a><a href='#L21'>21</a>
89
- <a name='L22'></a><a href='#L22'>22</a>
90
- <a name='L23'></a><a href='#L23'>23</a>
91
- <a name='L24'></a><a href='#L24'>24</a>
92
- <a name='L25'></a><a href='#L25'>25</a>
93
- <a name='L26'></a><a href='#L26'>26</a>
94
- <a name='L27'></a><a href='#L27'>27</a>
95
- <a name='L28'></a><a href='#L28'>28</a>
96
- <a name='L29'></a><a href='#L29'>29</a>
97
- <a name='L30'></a><a href='#L30'>30</a>
98
- <a name='L31'></a><a href='#L31'>31</a>
99
- <a name='L32'></a><a href='#L32'>32</a>
100
- <a name='L33'></a><a href='#L33'>33</a>
101
- <a name='L34'></a><a href='#L34'>34</a>
102
- <a name='L35'></a><a href='#L35'>35</a>
103
- <a name='L36'></a><a href='#L36'>36</a>
104
- <a name='L37'></a><a href='#L37'>37</a>
105
- <a name='L38'></a><a href='#L38'>38</a>
106
- <a name='L39'></a><a href='#L39'>39</a>
107
- <a name='L40'></a><a href='#L40'>40</a>
108
- <a name='L41'></a><a href='#L41'>41</a>
109
- <a name='L42'></a><a href='#L42'>42</a>
110
- <a name='L43'></a><a href='#L43'>43</a>
111
- <a name='L44'></a><a href='#L44'>44</a>
112
- <a name='L45'></a><a href='#L45'>45</a>
113
- <a name='L46'></a><a href='#L46'>46</a>
114
- <a name='L47'></a><a href='#L47'>47</a>
115
- <a name='L48'></a><a href='#L48'>48</a>
116
- <a name='L49'></a><a href='#L49'>49</a>
117
- <a name='L50'></a><a href='#L50'>50</a>
118
- <a name='L51'></a><a href='#L51'>51</a>
119
- <a name='L52'></a><a href='#L52'>52</a>
120
- <a name='L53'></a><a href='#L53'>53</a>
121
- <a name='L54'></a><a href='#L54'>54</a>
122
- <a name='L55'></a><a href='#L55'>55</a>
123
- <a name='L56'></a><a href='#L56'>56</a>
124
- <a name='L57'></a><a href='#L57'>57</a>
125
- <a name='L58'></a><a href='#L58'>58</a>
126
- <a name='L59'></a><a href='#L59'>59</a>
127
- <a name='L60'></a><a href='#L60'>60</a>
128
- <a name='L61'></a><a href='#L61'>61</a>
129
- <a name='L62'></a><a href='#L62'>62</a>
130
- <a name='L63'></a><a href='#L63'>63</a>
131
- <a name='L64'></a><a href='#L64'>64</a>
132
- <a name='L65'></a><a href='#L65'>65</a>
133
- <a name='L66'></a><a href='#L66'>66</a>
134
- <a name='L67'></a><a href='#L67'>67</a>
135
- <a name='L68'></a><a href='#L68'>68</a>
136
- <a name='L69'></a><a href='#L69'>69</a>
137
- <a name='L70'></a><a href='#L70'>70</a>
138
- <a name='L71'></a><a href='#L71'>71</a>
139
- <a name='L72'></a><a href='#L72'>72</a>
140
- <a name='L73'></a><a href='#L73'>73</a>
141
- <a name='L74'></a><a href='#L74'>74</a>
142
- <a name='L75'></a><a href='#L75'>75</a>
143
- <a name='L76'></a><a href='#L76'>76</a>
144
- <a name='L77'></a><a href='#L77'>77</a>
145
- <a name='L78'></a><a href='#L78'>78</a>
146
- <a name='L79'></a><a href='#L79'>79</a>
147
- <a name='L80'></a><a href='#L80'>80</a>
148
- <a name='L81'></a><a href='#L81'>81</a>
149
- <a name='L82'></a><a href='#L82'>82</a>
150
- <a name='L83'></a><a href='#L83'>83</a>
151
- <a name='L84'></a><a href='#L84'>84</a>
152
- <a name='L85'></a><a href='#L85'>85</a>
153
- <a name='L86'></a><a href='#L86'>86</a>
154
- <a name='L87'></a><a href='#L87'>87</a>
155
- <a name='L88'></a><a href='#L88'>88</a>
156
- <a name='L89'></a><a href='#L89'>89</a>
157
- <a name='L90'></a><a href='#L90'>90</a>
158
- <a name='L91'></a><a href='#L91'>91</a>
159
- <a name='L92'></a><a href='#L92'>92</a>
160
- <a name='L93'></a><a href='#L93'>93</a>
161
- <a name='L94'></a><a href='#L94'>94</a>
162
- <a name='L95'></a><a href='#L95'>95</a>
163
- <a name='L96'></a><a href='#L96'>96</a>
164
- <a name='L97'></a><a href='#L97'>97</a>
165
- <a name='L98'></a><a href='#L98'>98</a>
166
- <a name='L99'></a><a href='#L99'>99</a>
167
- <a name='L100'></a><a href='#L100'>100</a>
168
- <a name='L101'></a><a href='#L101'>101</a>
169
- <a name='L102'></a><a href='#L102'>102</a>
170
- <a name='L103'></a><a href='#L103'>103</a>
171
- <a name='L104'></a><a href='#L104'>104</a>
172
- <a name='L105'></a><a href='#L105'>105</a>
173
- <a name='L106'></a><a href='#L106'>106</a>
174
- <a name='L107'></a><a href='#L107'>107</a>
175
- <a name='L108'></a><a href='#L108'>108</a>
176
- <a name='L109'></a><a href='#L109'>109</a>
177
- <a name='L110'></a><a href='#L110'>110</a>
178
- <a name='L111'></a><a href='#L111'>111</a>
179
- <a name='L112'></a><a href='#L112'>112</a>
180
- <a name='L113'></a><a href='#L113'>113</a>
181
- <a name='L114'></a><a href='#L114'>114</a>
182
- <a name='L115'></a><a href='#L115'>115</a>
183
- <a name='L116'></a><a href='#L116'>116</a>
184
- <a name='L117'></a><a href='#L117'>117</a>
185
- <a name='L118'></a><a href='#L118'>118</a>
186
- <a name='L119'></a><a href='#L119'>119</a>
187
- <a name='L120'></a><a href='#L120'>120</a>
188
- <a name='L121'></a><a href='#L121'>121</a>
189
- <a name='L122'></a><a href='#L122'>122</a>
190
- <a name='L123'></a><a href='#L123'>123</a>
191
- <a name='L124'></a><a href='#L124'>124</a>
192
- <a name='L125'></a><a href='#L125'>125</a>
193
- <a name='L126'></a><a href='#L126'>126</a>
194
- <a name='L127'></a><a href='#L127'>127</a>
195
- <a name='L128'></a><a href='#L128'>128</a>
196
- <a name='L129'></a><a href='#L129'>129</a>
197
- <a name='L130'></a><a href='#L130'>130</a>
198
- <a name='L131'></a><a href='#L131'>131</a>
199
- <a name='L132'></a><a href='#L132'>132</a>
200
- <a name='L133'></a><a href='#L133'>133</a>
201
- <a name='L134'></a><a href='#L134'>134</a>
202
- <a name='L135'></a><a href='#L135'>135</a>
203
- <a name='L136'></a><a href='#L136'>136</a>
204
- <a name='L137'></a><a href='#L137'>137</a>
205
- <a name='L138'></a><a href='#L138'>138</a>
206
- <a name='L139'></a><a href='#L139'>139</a>
207
- <a name='L140'></a><a href='#L140'>140</a>
208
- <a name='L141'></a><a href='#L141'>141</a>
209
- <a name='L142'></a><a href='#L142'>142</a>
210
- <a name='L143'></a><a href='#L143'>143</a>
211
- <a name='L144'></a><a href='#L144'>144</a>
212
- <a name='L145'></a><a href='#L145'>145</a>
213
- <a name='L146'></a><a href='#L146'>146</a>
214
- <a name='L147'></a><a href='#L147'>147</a>
215
- <a name='L148'></a><a href='#L148'>148</a>
216
- <a name='L149'></a><a href='#L149'>149</a>
217
- <a name='L150'></a><a href='#L150'>150</a>
218
- <a name='L151'></a><a href='#L151'>151</a>
219
- <a name='L152'></a><a href='#L152'>152</a>
220
- <a name='L153'></a><a href='#L153'>153</a>
221
- <a name='L154'></a><a href='#L154'>154</a>
222
- <a name='L155'></a><a href='#L155'>155</a>
223
- <a name='L156'></a><a href='#L156'>156</a>
224
- <a name='L157'></a><a href='#L157'>157</a>
225
- <a name='L158'></a><a href='#L158'>158</a>
226
- <a name='L159'></a><a href='#L159'>159</a>
227
- <a name='L160'></a><a href='#L160'>160</a>
228
- <a name='L161'></a><a href='#L161'>161</a>
229
- <a name='L162'></a><a href='#L162'>162</a>
230
- <a name='L163'></a><a href='#L163'>163</a>
231
- <a name='L164'></a><a href='#L164'>164</a>
232
- <a name='L165'></a><a href='#L165'>165</a>
233
- <a name='L166'></a><a href='#L166'>166</a>
234
- <a name='L167'></a><a href='#L167'>167</a>
235
- <a name='L168'></a><a href='#L168'>168</a>
236
- <a name='L169'></a><a href='#L169'>169</a>
237
- <a name='L170'></a><a href='#L170'>170</a>
238
- <a name='L171'></a><a href='#L171'>171</a>
239
- <a name='L172'></a><a href='#L172'>172</a>
240
- <a name='L173'></a><a href='#L173'>173</a>
241
- <a name='L174'></a><a href='#L174'>174</a>
242
- <a name='L175'></a><a href='#L175'>175</a>
243
- <a name='L176'></a><a href='#L176'>176</a>
244
- <a name='L177'></a><a href='#L177'>177</a>
245
- <a name='L178'></a><a href='#L178'>178</a>
246
- <a name='L179'></a><a href='#L179'>179</a>
247
- <a name='L180'></a><a href='#L180'>180</a>
248
- <a name='L181'></a><a href='#L181'>181</a>
249
- <a name='L182'></a><a href='#L182'>182</a>
250
- <a name='L183'></a><a href='#L183'>183</a>
251
- <a name='L184'></a><a href='#L184'>184</a>
252
- <a name='L185'></a><a href='#L185'>185</a>
253
- <a name='L186'></a><a href='#L186'>186</a>
254
- <a name='L187'></a><a href='#L187'>187</a>
255
- <a name='L188'></a><a href='#L188'>188</a>
256
- <a name='L189'></a><a href='#L189'>189</a>
257
- <a name='L190'></a><a href='#L190'>190</a>
258
- <a name='L191'></a><a href='#L191'>191</a>
259
- <a name='L192'></a><a href='#L192'>192</a>
260
- <a name='L193'></a><a href='#L193'>193</a>
261
- <a name='L194'></a><a href='#L194'>194</a>
262
- <a name='L195'></a><a href='#L195'>195</a>
263
- <a name='L196'></a><a href='#L196'>196</a>
264
- <a name='L197'></a><a href='#L197'>197</a>
265
- <a name='L198'></a><a href='#L198'>198</a>
266
- <a name='L199'></a><a href='#L199'>199</a>
267
- <a name='L200'></a><a href='#L200'>200</a>
268
- <a name='L201'></a><a href='#L201'>201</a>
269
- <a name='L202'></a><a href='#L202'>202</a>
270
- <a name='L203'></a><a href='#L203'>203</a>
271
- <a name='L204'></a><a href='#L204'>204</a>
272
- <a name='L205'></a><a href='#L205'>205</a>
273
- <a name='L206'></a><a href='#L206'>206</a>
274
- <a name='L207'></a><a href='#L207'>207</a>
275
- <a name='L208'></a><a href='#L208'>208</a>
276
- <a name='L209'></a><a href='#L209'>209</a>
277
- <a name='L210'></a><a href='#L210'>210</a>
278
- <a name='L211'></a><a href='#L211'>211</a>
279
- <a name='L212'></a><a href='#L212'>212</a>
280
- <a name='L213'></a><a href='#L213'>213</a>
281
- <a name='L214'></a><a href='#L214'>214</a>
282
- <a name='L215'></a><a href='#L215'>215</a>
283
- <a name='L216'></a><a href='#L216'>216</a>
284
- <a name='L217'></a><a href='#L217'>217</a>
285
- <a name='L218'></a><a href='#L218'>218</a>
286
- <a name='L219'></a><a href='#L219'>219</a>
287
- <a name='L220'></a><a href='#L220'>220</a>
288
- <a name='L221'></a><a href='#L221'>221</a>
289
- <a name='L222'></a><a href='#L222'>222</a>
290
- <a name='L223'></a><a href='#L223'>223</a>
291
- <a name='L224'></a><a href='#L224'>224</a>
292
- <a name='L225'></a><a href='#L225'>225</a>
293
- <a name='L226'></a><a href='#L226'>226</a>
294
- <a name='L227'></a><a href='#L227'>227</a>
295
- <a name='L228'></a><a href='#L228'>228</a>
296
- <a name='L229'></a><a href='#L229'>229</a>
297
- <a name='L230'></a><a href='#L230'>230</a>
298
- <a name='L231'></a><a href='#L231'>231</a>
299
- <a name='L232'></a><a href='#L232'>232</a>
300
- <a name='L233'></a><a href='#L233'>233</a>
301
- <a name='L234'></a><a href='#L234'>234</a>
302
- <a name='L235'></a><a href='#L235'>235</a>
303
- <a name='L236'></a><a href='#L236'>236</a>
304
- <a name='L237'></a><a href='#L237'>237</a>
305
- <a name='L238'></a><a href='#L238'>238</a>
306
- <a name='L239'></a><a href='#L239'>239</a>
307
- <a name='L240'></a><a href='#L240'>240</a>
308
- <a name='L241'></a><a href='#L241'>241</a>
309
- <a name='L242'></a><a href='#L242'>242</a>
310
- <a name='L243'></a><a href='#L243'>243</a>
311
- <a name='L244'></a><a href='#L244'>244</a>
312
- <a name='L245'></a><a href='#L245'>245</a>
313
- <a name='L246'></a><a href='#L246'>246</a>
314
- <a name='L247'></a><a href='#L247'>247</a>
315
- <a name='L248'></a><a href='#L248'>248</a>
316
- <a name='L249'></a><a href='#L249'>249</a>
317
- <a name='L250'></a><a href='#L250'>250</a>
318
- <a name='L251'></a><a href='#L251'>251</a>
319
- <a name='L252'></a><a href='#L252'>252</a>
320
- <a name='L253'></a><a href='#L253'>253</a>
321
- <a name='L254'></a><a href='#L254'>254</a>
322
- <a name='L255'></a><a href='#L255'>255</a>
323
- <a name='L256'></a><a href='#L256'>256</a>
324
- <a name='L257'></a><a href='#L257'>257</a>
325
- <a name='L258'></a><a href='#L258'>258</a>
326
- <a name='L259'></a><a href='#L259'>259</a>
327
- <a name='L260'></a><a href='#L260'>260</a>
328
- <a name='L261'></a><a href='#L261'>261</a>
329
- <a name='L262'></a><a href='#L262'>262</a>
330
- <a name='L263'></a><a href='#L263'>263</a>
331
- <a name='L264'></a><a href='#L264'>264</a>
332
- <a name='L265'></a><a href='#L265'>265</a>
333
- <a name='L266'></a><a href='#L266'>266</a>
334
- <a name='L267'></a><a href='#L267'>267</a>
335
- <a name='L268'></a><a href='#L268'>268</a>
336
- <a name='L269'></a><a href='#L269'>269</a>
337
- <a name='L270'></a><a href='#L270'>270</a>
338
- <a name='L271'></a><a href='#L271'>271</a>
339
- <a name='L272'></a><a href='#L272'>272</a>
340
- <a name='L273'></a><a href='#L273'>273</a>
341
- <a name='L274'></a><a href='#L274'>274</a>
342
- <a name='L275'></a><a href='#L275'>275</a>
343
- <a name='L276'></a><a href='#L276'>276</a>
344
- <a name='L277'></a><a href='#L277'>277</a>
345
- <a name='L278'></a><a href='#L278'>278</a>
346
- <a name='L279'></a><a href='#L279'>279</a>
347
- <a name='L280'></a><a href='#L280'>280</a>
348
- <a name='L281'></a><a href='#L281'>281</a>
349
- <a name='L282'></a><a href='#L282'>282</a>
350
- <a name='L283'></a><a href='#L283'>283</a>
351
- <a name='L284'></a><a href='#L284'>284</a>
352
- <a name='L285'></a><a href='#L285'>285</a>
353
- <a name='L286'></a><a href='#L286'>286</a>
354
- <a name='L287'></a><a href='#L287'>287</a>
355
- <a name='L288'></a><a href='#L288'>288</a>
356
- <a name='L289'></a><a href='#L289'>289</a>
357
- <a name='L290'></a><a href='#L290'>290</a>
358
- <a name='L291'></a><a href='#L291'>291</a>
359
- <a name='L292'></a><a href='#L292'>292</a>
360
- <a name='L293'></a><a href='#L293'>293</a>
361
- <a name='L294'></a><a href='#L294'>294</a>
362
- <a name='L295'></a><a href='#L295'>295</a>
363
- <a name='L296'></a><a href='#L296'>296</a>
364
- <a name='L297'></a><a href='#L297'>297</a>
365
- <a name='L298'></a><a href='#L298'>298</a>
366
- <a name='L299'></a><a href='#L299'>299</a>
367
- <a name='L300'></a><a href='#L300'>300</a>
368
- <a name='L301'></a><a href='#L301'>301</a>
369
- <a name='L302'></a><a href='#L302'>302</a>
370
- <a name='L303'></a><a href='#L303'>303</a>
371
- <a name='L304'></a><a href='#L304'>304</a>
372
- <a name='L305'></a><a href='#L305'>305</a>
373
- <a name='L306'></a><a href='#L306'>306</a>
374
- <a name='L307'></a><a href='#L307'>307</a>
375
- <a name='L308'></a><a href='#L308'>308</a>
376
- <a name='L309'></a><a href='#L309'>309</a>
377
- <a name='L310'></a><a href='#L310'>310</a>
378
- <a name='L311'></a><a href='#L311'>311</a>
379
- <a name='L312'></a><a href='#L312'>312</a>
380
- <a name='L313'></a><a href='#L313'>313</a>
381
- <a name='L314'></a><a href='#L314'>314</a>
382
- <a name='L315'></a><a href='#L315'>315</a>
383
- <a name='L316'></a><a href='#L316'>316</a>
384
- <a name='L317'></a><a href='#L317'>317</a>
385
- <a name='L318'></a><a href='#L318'>318</a>
386
- <a name='L319'></a><a href='#L319'>319</a>
387
- <a name='L320'></a><a href='#L320'>320</a>
388
- <a name='L321'></a><a href='#L321'>321</a>
389
- <a name='L322'></a><a href='#L322'>322</a>
390
- <a name='L323'></a><a href='#L323'>323</a>
391
- <a name='L324'></a><a href='#L324'>324</a>
392
- <a name='L325'></a><a href='#L325'>325</a>
393
- <a name='L326'></a><a href='#L326'>326</a>
394
- <a name='L327'></a><a href='#L327'>327</a>
395
- <a name='L328'></a><a href='#L328'>328</a>
396
- <a name='L329'></a><a href='#L329'>329</a>
397
- <a name='L330'></a><a href='#L330'>330</a>
398
- <a name='L331'></a><a href='#L331'>331</a>
399
- <a name='L332'></a><a href='#L332'>332</a>
400
- <a name='L333'></a><a href='#L333'>333</a>
401
- <a name='L334'></a><a href='#L334'>334</a>
402
- <a name='L335'></a><a href='#L335'>335</a>
403
- <a name='L336'></a><a href='#L336'>336</a>
404
- <a name='L337'></a><a href='#L337'>337</a>
405
- <a name='L338'></a><a href='#L338'>338</a>
406
- <a name='L339'></a><a href='#L339'>339</a>
407
- <a name='L340'></a><a href='#L340'>340</a>
408
- <a name='L341'></a><a href='#L341'>341</a>
409
- <a name='L342'></a><a href='#L342'>342</a>
410
- <a name='L343'></a><a href='#L343'>343</a>
411
- <a name='L344'></a><a href='#L344'>344</a>
412
- <a name='L345'></a><a href='#L345'>345</a>
413
- <a name='L346'></a><a href='#L346'>346</a>
414
- <a name='L347'></a><a href='#L347'>347</a>
415
- <a name='L348'></a><a href='#L348'>348</a>
416
- <a name='L349'></a><a href='#L349'>349</a>
417
- <a name='L350'></a><a href='#L350'>350</a>
418
- <a name='L351'></a><a href='#L351'>351</a>
419
- <a name='L352'></a><a href='#L352'>352</a>
420
- <a name='L353'></a><a href='#L353'>353</a>
421
- <a name='L354'></a><a href='#L354'>354</a>
422
- <a name='L355'></a><a href='#L355'>355</a>
423
- <a name='L356'></a><a href='#L356'>356</a>
424
- <a name='L357'></a><a href='#L357'>357</a>
425
- <a name='L358'></a><a href='#L358'>358</a>
426
- <a name='L359'></a><a href='#L359'>359</a>
427
- <a name='L360'></a><a href='#L360'>360</a>
428
- <a name='L361'></a><a href='#L361'>361</a>
429
- <a name='L362'></a><a href='#L362'>362</a>
430
- <a name='L363'></a><a href='#L363'>363</a>
431
- <a name='L364'></a><a href='#L364'>364</a>
432
- <a name='L365'></a><a href='#L365'>365</a>
433
- <a name='L366'></a><a href='#L366'>366</a>
434
- <a name='L367'></a><a href='#L367'>367</a>
435
- <a name='L368'></a><a href='#L368'>368</a>
436
- <a name='L369'></a><a href='#L369'>369</a>
437
- <a name='L370'></a><a href='#L370'>370</a>
438
- <a name='L371'></a><a href='#L371'>371</a>
439
- <a name='L372'></a><a href='#L372'>372</a>
440
- <a name='L373'></a><a href='#L373'>373</a>
441
- <a name='L374'></a><a href='#L374'>374</a>
442
- <a name='L375'></a><a href='#L375'>375</a>
443
- <a name='L376'></a><a href='#L376'>376</a>
444
- <a name='L377'></a><a href='#L377'>377</a>
445
- <a name='L378'></a><a href='#L378'>378</a>
446
- <a name='L379'></a><a href='#L379'>379</a>
447
- <a name='L380'></a><a href='#L380'>380</a>
448
- <a name='L381'></a><a href='#L381'>381</a>
449
- <a name='L382'></a><a href='#L382'>382</a>
450
- <a name='L383'></a><a href='#L383'>383</a>
451
- <a name='L384'></a><a href='#L384'>384</a>
452
- <a name='L385'></a><a href='#L385'>385</a>
453
- <a name='L386'></a><a href='#L386'>386</a>
454
- <a name='L387'></a><a href='#L387'>387</a>
455
- <a name='L388'></a><a href='#L388'>388</a>
456
- <a name='L389'></a><a href='#L389'>389</a>
457
- <a name='L390'></a><a href='#L390'>390</a>
458
- <a name='L391'></a><a href='#L391'>391</a>
459
- <a name='L392'></a><a href='#L392'>392</a>
460
- <a name='L393'></a><a href='#L393'>393</a>
461
- <a name='L394'></a><a href='#L394'>394</a>
462
- <a name='L395'></a><a href='#L395'>395</a>
463
- <a name='L396'></a><a href='#L396'>396</a>
464
- <a name='L397'></a><a href='#L397'>397</a>
465
- <a name='L398'></a><a href='#L398'>398</a>
466
- <a name='L399'></a><a href='#L399'>399</a>
467
- <a name='L400'></a><a href='#L400'>400</a>
468
- <a name='L401'></a><a href='#L401'>401</a>
469
- <a name='L402'></a><a href='#L402'>402</a>
470
- <a name='L403'></a><a href='#L403'>403</a>
471
- <a name='L404'></a><a href='#L404'>404</a>
472
- <a name='L405'></a><a href='#L405'>405</a>
473
- <a name='L406'></a><a href='#L406'>406</a>
474
- <a name='L407'></a><a href='#L407'>407</a>
475
- <a name='L408'></a><a href='#L408'>408</a>
476
- <a name='L409'></a><a href='#L409'>409</a>
477
- <a name='L410'></a><a href='#L410'>410</a>
478
- <a name='L411'></a><a href='#L411'>411</a>
479
- <a name='L412'></a><a href='#L412'>412</a>
480
- <a name='L413'></a><a href='#L413'>413</a>
481
- <a name='L414'></a><a href='#L414'>414</a>
482
- <a name='L415'></a><a href='#L415'>415</a>
483
- <a name='L416'></a><a href='#L416'>416</a>
484
- <a name='L417'></a><a href='#L417'>417</a>
485
- <a name='L418'></a><a href='#L418'>418</a>
486
- <a name='L419'></a><a href='#L419'>419</a>
487
- <a name='L420'></a><a href='#L420'>420</a>
488
- <a name='L421'></a><a href='#L421'>421</a>
489
- <a name='L422'></a><a href='#L422'>422</a>
490
- <a name='L423'></a><a href='#L423'>423</a>
491
- <a name='L424'></a><a href='#L424'>424</a>
492
- <a name='L425'></a><a href='#L425'>425</a>
493
- <a name='L426'></a><a href='#L426'>426</a>
494
- <a name='L427'></a><a href='#L427'>427</a>
495
- <a name='L428'></a><a href='#L428'>428</a>
496
- <a name='L429'></a><a href='#L429'>429</a>
497
- <a name='L430'></a><a href='#L430'>430</a>
498
- <a name='L431'></a><a href='#L431'>431</a>
499
- <a name='L432'></a><a href='#L432'>432</a>
500
- <a name='L433'></a><a href='#L433'>433</a>
501
- <a name='L434'></a><a href='#L434'>434</a>
502
- <a name='L435'></a><a href='#L435'>435</a>
503
- <a name='L436'></a><a href='#L436'>436</a>
504
- <a name='L437'></a><a href='#L437'>437</a>
505
- <a name='L438'></a><a href='#L438'>438</a>
506
- <a name='L439'></a><a href='#L439'>439</a>
507
- <a name='L440'></a><a href='#L440'>440</a>
508
- <a name='L441'></a><a href='#L441'>441</a>
509
- <a name='L442'></a><a href='#L442'>442</a>
510
- <a name='L443'></a><a href='#L443'>443</a>
511
- <a name='L444'></a><a href='#L444'>444</a>
512
- <a name='L445'></a><a href='#L445'>445</a>
513
- <a name='L446'></a><a href='#L446'>446</a>
514
- <a name='L447'></a><a href='#L447'>447</a>
515
- <a name='L448'></a><a href='#L448'>448</a>
516
- <a name='L449'></a><a href='#L449'>449</a>
517
- <a name='L450'></a><a href='#L450'>450</a>
518
- <a name='L451'></a><a href='#L451'>451</a>
519
- <a name='L452'></a><a href='#L452'>452</a>
520
- <a name='L453'></a><a href='#L453'>453</a>
521
- <a name='L454'></a><a href='#L454'>454</a>
522
- <a name='L455'></a><a href='#L455'>455</a>
523
- <a name='L456'></a><a href='#L456'>456</a>
524
- <a name='L457'></a><a href='#L457'>457</a>
525
- <a name='L458'></a><a href='#L458'>458</a>
526
- <a name='L459'></a><a href='#L459'>459</a>
527
- <a name='L460'></a><a href='#L460'>460</a>
528
- <a name='L461'></a><a href='#L461'>461</a>
529
- <a name='L462'></a><a href='#L462'>462</a>
530
- <a name='L463'></a><a href='#L463'>463</a>
531
- <a name='L464'></a><a href='#L464'>464</a>
532
- <a name='L465'></a><a href='#L465'>465</a>
533
- <a name='L466'></a><a href='#L466'>466</a>
534
- <a name='L467'></a><a href='#L467'>467</a>
535
- <a name='L468'></a><a href='#L468'>468</a>
536
- <a name='L469'></a><a href='#L469'>469</a>
537
- <a name='L470'></a><a href='#L470'>470</a>
538
- <a name='L471'></a><a href='#L471'>471</a>
539
- <a name='L472'></a><a href='#L472'>472</a>
540
- <a name='L473'></a><a href='#L473'>473</a>
541
- <a name='L474'></a><a href='#L474'>474</a>
542
- <a name='L475'></a><a href='#L475'>475</a>
543
- <a name='L476'></a><a href='#L476'>476</a>
544
- <a name='L477'></a><a href='#L477'>477</a>
545
- <a name='L478'></a><a href='#L478'>478</a>
546
- <a name='L479'></a><a href='#L479'>479</a>
547
- <a name='L480'></a><a href='#L480'>480</a>
548
- <a name='L481'></a><a href='#L481'>481</a>
549
- <a name='L482'></a><a href='#L482'>482</a>
550
- <a name='L483'></a><a href='#L483'>483</a>
551
- <a name='L484'></a><a href='#L484'>484</a>
552
- <a name='L485'></a><a href='#L485'>485</a>
553
- <a name='L486'></a><a href='#L486'>486</a>
554
- <a name='L487'></a><a href='#L487'>487</a>
555
- <a name='L488'></a><a href='#L488'>488</a>
556
- <a name='L489'></a><a href='#L489'>489</a>
557
- <a name='L490'></a><a href='#L490'>490</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span>
558
- <span class="cline-any cline-yes">2x</span>
559
- <span class="cline-any cline-yes">2x</span>
560
- <span class="cline-any cline-neutral">&nbsp;</span>
561
- <span class="cline-any cline-neutral">&nbsp;</span>
562
- <span class="cline-any cline-yes">2x</span>
563
- <span class="cline-any cline-yes">2x</span>
564
- <span class="cline-any cline-yes">2x</span>
565
- <span class="cline-any cline-yes">2x</span>
566
- <span class="cline-any cline-neutral">&nbsp;</span>
567
- <span class="cline-any cline-yes">2x</span>
568
- <span class="cline-any cline-yes">2x</span>
569
- <span class="cline-any cline-yes">2x</span>
570
- <span class="cline-any cline-neutral">&nbsp;</span>
571
- <span class="cline-any cline-yes">2x</span>
572
- <span class="cline-any cline-yes">2x</span>
573
- <span class="cline-any cline-neutral">&nbsp;</span>
574
- <span class="cline-any cline-yes">2x</span>
575
- <span class="cline-any cline-neutral">&nbsp;</span>
576
- <span class="cline-any cline-yes">2x</span>
577
- <span class="cline-any cline-yes">2x</span>
578
- <span class="cline-any cline-yes">2x</span>
579
- <span class="cline-any cline-yes">2x</span>
580
- <span class="cline-any cline-yes">2x</span>
581
- <span class="cline-any cline-yes">2x</span>
582
- <span class="cline-any cline-yes">2x</span>
583
- <span class="cline-any cline-neutral">&nbsp;</span>
584
- <span class="cline-any cline-neutral">&nbsp;</span>
585
- <span class="cline-any cline-yes">2x</span>
586
- <span class="cline-any cline-yes">2x</span>
587
- <span class="cline-any cline-neutral">&nbsp;</span>
588
- <span class="cline-any cline-neutral">&nbsp;</span>
589
- <span class="cline-any cline-neutral">&nbsp;</span>
590
- <span class="cline-any cline-neutral">&nbsp;</span>
591
- <span class="cline-any cline-neutral">&nbsp;</span>
592
- <span class="cline-any cline-neutral">&nbsp;</span>
593
- <span class="cline-any cline-neutral">&nbsp;</span>
594
- <span class="cline-any cline-neutral">&nbsp;</span>
595
- <span class="cline-any cline-yes">2x</span>
596
- <span class="cline-any cline-neutral">&nbsp;</span>
597
- <span class="cline-any cline-neutral">&nbsp;</span>
598
- <span class="cline-any cline-neutral">&nbsp;</span>
599
- <span class="cline-any cline-neutral">&nbsp;</span>
600
- <span class="cline-any cline-neutral">&nbsp;</span>
601
- <span class="cline-any cline-no">&nbsp;</span>
602
- <span class="cline-any cline-no">&nbsp;</span>
603
- <span class="cline-any cline-no">&nbsp;</span>
604
- <span class="cline-any cline-neutral">&nbsp;</span>
605
- <span class="cline-any cline-neutral">&nbsp;</span>
606
- <span class="cline-any cline-neutral">&nbsp;</span>
607
- <span class="cline-any cline-neutral">&nbsp;</span>
608
- <span class="cline-any cline-neutral">&nbsp;</span>
609
- <span class="cline-any cline-neutral">&nbsp;</span>
610
- <span class="cline-any cline-neutral">&nbsp;</span>
611
- <span class="cline-any cline-neutral">&nbsp;</span>
612
- <span class="cline-any cline-neutral">&nbsp;</span>
613
- <span class="cline-any cline-neutral">&nbsp;</span>
614
- <span class="cline-any cline-neutral">&nbsp;</span>
615
- <span class="cline-any cline-neutral">&nbsp;</span>
616
- <span class="cline-any cline-neutral">&nbsp;</span>
617
- <span class="cline-any cline-no">&nbsp;</span>
618
- <span class="cline-any cline-neutral">&nbsp;</span>
619
- <span class="cline-any cline-no">&nbsp;</span>
620
- <span class="cline-any cline-neutral">&nbsp;</span>
621
- <span class="cline-any cline-neutral">&nbsp;</span>
622
- <span class="cline-any cline-neutral">&nbsp;</span>
623
- <span class="cline-any cline-neutral">&nbsp;</span>
624
- <span class="cline-any cline-no">&nbsp;</span>
625
- <span class="cline-any cline-neutral">&nbsp;</span>
626
- <span class="cline-any cline-no">&nbsp;</span>
627
- <span class="cline-any cline-neutral">&nbsp;</span>
628
- <span class="cline-any cline-no">&nbsp;</span>
629
- <span class="cline-any cline-neutral">&nbsp;</span>
630
- <span class="cline-any cline-neutral">&nbsp;</span>
631
- <span class="cline-any cline-neutral">&nbsp;</span>
632
- <span class="cline-any cline-neutral">&nbsp;</span>
633
- <span class="cline-any cline-neutral">&nbsp;</span>
634
- <span class="cline-any cline-neutral">&nbsp;</span>
635
- <span class="cline-any cline-neutral">&nbsp;</span>
636
- <span class="cline-any cline-neutral">&nbsp;</span>
637
- <span class="cline-any cline-neutral">&nbsp;</span>
638
- <span class="cline-any cline-yes">2x</span>
639
- <span class="cline-any cline-neutral">&nbsp;</span>
640
- <span class="cline-any cline-neutral">&nbsp;</span>
641
- <span class="cline-any cline-neutral">&nbsp;</span>
642
- <span class="cline-any cline-no">&nbsp;</span>
643
- <span class="cline-any cline-neutral">&nbsp;</span>
644
- <span class="cline-any cline-neutral">&nbsp;</span>
645
- <span class="cline-any cline-neutral">&nbsp;</span>
646
- <span class="cline-any cline-neutral">&nbsp;</span>
647
- <span class="cline-any cline-neutral">&nbsp;</span>
648
- <span class="cline-any cline-neutral">&nbsp;</span>
649
- <span class="cline-any cline-neutral">&nbsp;</span>
650
- <span class="cline-any cline-no">&nbsp;</span>
651
- <span class="cline-any cline-neutral">&nbsp;</span>
652
- <span class="cline-any cline-neutral">&nbsp;</span>
653
- <span class="cline-any cline-neutral">&nbsp;</span>
654
- <span class="cline-any cline-neutral">&nbsp;</span>
655
- <span class="cline-any cline-neutral">&nbsp;</span>
656
- <span class="cline-any cline-neutral">&nbsp;</span>
657
- <span class="cline-any cline-neutral">&nbsp;</span>
658
- <span class="cline-any cline-no">&nbsp;</span>
659
- <span class="cline-any cline-no">&nbsp;</span>
660
- <span class="cline-any cline-no">&nbsp;</span>
661
- <span class="cline-any cline-neutral">&nbsp;</span>
662
- <span class="cline-any cline-neutral">&nbsp;</span>
663
- <span class="cline-any cline-no">&nbsp;</span>
664
- <span class="cline-any cline-no">&nbsp;</span>
665
- <span class="cline-any cline-neutral">&nbsp;</span>
666
- <span class="cline-any cline-no">&nbsp;</span>
667
- <span class="cline-any cline-neutral">&nbsp;</span>
668
- <span class="cline-any cline-neutral">&nbsp;</span>
669
- <span class="cline-any cline-neutral">&nbsp;</span>
670
- <span class="cline-any cline-neutral">&nbsp;</span>
671
- <span class="cline-any cline-neutral">&nbsp;</span>
672
- <span class="cline-any cline-neutral">&nbsp;</span>
673
- <span class="cline-any cline-neutral">&nbsp;</span>
674
- <span class="cline-any cline-neutral">&nbsp;</span>
675
- <span class="cline-any cline-no">&nbsp;</span>
676
- <span class="cline-any cline-neutral">&nbsp;</span>
677
- <span class="cline-any cline-neutral">&nbsp;</span>
678
- <span class="cline-any cline-neutral">&nbsp;</span>
679
- <span class="cline-any cline-neutral">&nbsp;</span>
680
- <span class="cline-any cline-neutral">&nbsp;</span>
681
- <span class="cline-any cline-neutral">&nbsp;</span>
682
- <span class="cline-any cline-neutral">&nbsp;</span>
683
- <span class="cline-any cline-neutral">&nbsp;</span>
684
- <span class="cline-any cline-neutral">&nbsp;</span>
685
- <span class="cline-any cline-neutral">&nbsp;</span>
686
- <span class="cline-any cline-neutral">&nbsp;</span>
687
- <span class="cline-any cline-neutral">&nbsp;</span>
688
- <span class="cline-any cline-no">&nbsp;</span>
689
- <span class="cline-any cline-no">&nbsp;</span>
690
- <span class="cline-any cline-no">&nbsp;</span>
691
- <span class="cline-any cline-no">&nbsp;</span>
692
- <span class="cline-any cline-neutral">&nbsp;</span>
693
- <span class="cline-any cline-no">&nbsp;</span>
694
- <span class="cline-any cline-no">&nbsp;</span>
695
- <span class="cline-any cline-no">&nbsp;</span>
696
- <span class="cline-any cline-no">&nbsp;</span>
697
- <span class="cline-any cline-no">&nbsp;</span>
698
- <span class="cline-any cline-no">&nbsp;</span>
699
- <span class="cline-any cline-no">&nbsp;</span>
700
- <span class="cline-any cline-neutral">&nbsp;</span>
701
- <span class="cline-any cline-neutral">&nbsp;</span>
702
- <span class="cline-any cline-neutral">&nbsp;</span>
703
- <span class="cline-any cline-neutral">&nbsp;</span>
704
- <span class="cline-any cline-neutral">&nbsp;</span>
705
- <span class="cline-any cline-neutral">&nbsp;</span>
706
- <span class="cline-any cline-neutral">&nbsp;</span>
707
- <span class="cline-any cline-neutral">&nbsp;</span>
708
- <span class="cline-any cline-neutral">&nbsp;</span>
709
- <span class="cline-any cline-neutral">&nbsp;</span>
710
- <span class="cline-any cline-neutral">&nbsp;</span>
711
- <span class="cline-any cline-neutral">&nbsp;</span>
712
- <span class="cline-any cline-neutral">&nbsp;</span>
713
- <span class="cline-any cline-neutral">&nbsp;</span>
714
- <span class="cline-any cline-neutral">&nbsp;</span>
715
- <span class="cline-any cline-neutral">&nbsp;</span>
716
- <span class="cline-any cline-neutral">&nbsp;</span>
717
- <span class="cline-any cline-neutral">&nbsp;</span>
718
- <span class="cline-any cline-no">&nbsp;</span>
719
- <span class="cline-any cline-no">&nbsp;</span>
720
- <span class="cline-any cline-no">&nbsp;</span>
721
- <span class="cline-any cline-neutral">&nbsp;</span>
722
- <span class="cline-any cline-no">&nbsp;</span>
723
- <span class="cline-any cline-neutral">&nbsp;</span>
724
- <span class="cline-any cline-neutral">&nbsp;</span>
725
- <span class="cline-any cline-neutral">&nbsp;</span>
726
- <span class="cline-any cline-neutral">&nbsp;</span>
727
- <span class="cline-any cline-neutral">&nbsp;</span>
728
- <span class="cline-any cline-neutral">&nbsp;</span>
729
- <span class="cline-any cline-no">&nbsp;</span>
730
- <span class="cline-any cline-neutral">&nbsp;</span>
731
- <span class="cline-any cline-neutral">&nbsp;</span>
732
- <span class="cline-any cline-neutral">&nbsp;</span>
733
- <span class="cline-any cline-neutral">&nbsp;</span>
734
- <span class="cline-any cline-neutral">&nbsp;</span>
735
- <span class="cline-any cline-neutral">&nbsp;</span>
736
- <span class="cline-any cline-neutral">&nbsp;</span>
737
- <span class="cline-any cline-neutral">&nbsp;</span>
738
- <span class="cline-any cline-neutral">&nbsp;</span>
739
- <span class="cline-any cline-neutral">&nbsp;</span>
740
- <span class="cline-any cline-neutral">&nbsp;</span>
741
- <span class="cline-any cline-neutral">&nbsp;</span>
742
- <span class="cline-any cline-neutral">&nbsp;</span>
743
- <span class="cline-any cline-neutral">&nbsp;</span>
744
- <span class="cline-any cline-no">&nbsp;</span>
745
- <span class="cline-any cline-neutral">&nbsp;</span>
746
- <span class="cline-any cline-no">&nbsp;</span>
747
- <span class="cline-any cline-neutral">&nbsp;</span>
748
- <span class="cline-any cline-no">&nbsp;</span>
749
- <span class="cline-any cline-no">&nbsp;</span>
750
- <span class="cline-any cline-neutral">&nbsp;</span>
751
- <span class="cline-any cline-neutral">&nbsp;</span>
752
- <span class="cline-any cline-neutral">&nbsp;</span>
753
- <span class="cline-any cline-neutral">&nbsp;</span>
754
- <span class="cline-any cline-neutral">&nbsp;</span>
755
- <span class="cline-any cline-neutral">&nbsp;</span>
756
- <span class="cline-any cline-neutral">&nbsp;</span>
757
- <span class="cline-any cline-neutral">&nbsp;</span>
758
- <span class="cline-any cline-no">&nbsp;</span>
759
- <span class="cline-any cline-no">&nbsp;</span>
760
- <span class="cline-any cline-neutral">&nbsp;</span>
761
- <span class="cline-any cline-neutral">&nbsp;</span>
762
- <span class="cline-any cline-neutral">&nbsp;</span>
763
- <span class="cline-any cline-no">&nbsp;</span>
764
- <span class="cline-any cline-no">&nbsp;</span>
765
- <span class="cline-any cline-neutral">&nbsp;</span>
766
- <span class="cline-any cline-neutral">&nbsp;</span>
767
- <span class="cline-any cline-no">&nbsp;</span>
768
- <span class="cline-any cline-neutral">&nbsp;</span>
769
- <span class="cline-any cline-neutral">&nbsp;</span>
770
- <span class="cline-any cline-neutral">&nbsp;</span>
771
- <span class="cline-any cline-neutral">&nbsp;</span>
772
- <span class="cline-any cline-neutral">&nbsp;</span>
773
- <span class="cline-any cline-neutral">&nbsp;</span>
774
- <span class="cline-any cline-no">&nbsp;</span>
775
- <span class="cline-any cline-neutral">&nbsp;</span>
776
- <span class="cline-any cline-no">&nbsp;</span>
777
- <span class="cline-any cline-neutral">&nbsp;</span>
778
- <span class="cline-any cline-neutral">&nbsp;</span>
779
- <span class="cline-any cline-neutral">&nbsp;</span>
780
- <span class="cline-any cline-neutral">&nbsp;</span>
781
- <span class="cline-any cline-neutral">&nbsp;</span>
782
- <span class="cline-any cline-neutral">&nbsp;</span>
783
- <span class="cline-any cline-neutral">&nbsp;</span>
784
- <span class="cline-any cline-neutral">&nbsp;</span>
785
- <span class="cline-any cline-neutral">&nbsp;</span>
786
- <span class="cline-any cline-neutral">&nbsp;</span>
787
- <span class="cline-any cline-neutral">&nbsp;</span>
788
- <span class="cline-any cline-neutral">&nbsp;</span>
789
- <span class="cline-any cline-neutral">&nbsp;</span>
790
- <span class="cline-any cline-neutral">&nbsp;</span>
791
- <span class="cline-any cline-neutral">&nbsp;</span>
792
- <span class="cline-any cline-neutral">&nbsp;</span>
793
- <span class="cline-any cline-neutral">&nbsp;</span>
794
- <span class="cline-any cline-neutral">&nbsp;</span>
795
- <span class="cline-any cline-neutral">&nbsp;</span>
796
- <span class="cline-any cline-neutral">&nbsp;</span>
797
- <span class="cline-any cline-no">&nbsp;</span>
798
- <span class="cline-any cline-no">&nbsp;</span>
799
- <span class="cline-any cline-no">&nbsp;</span>
800
- <span class="cline-any cline-no">&nbsp;</span>
801
- <span class="cline-any cline-neutral">&nbsp;</span>
802
- <span class="cline-any cline-no">&nbsp;</span>
803
- <span class="cline-any cline-no">&nbsp;</span>
804
- <span class="cline-any cline-neutral">&nbsp;</span>
805
- <span class="cline-any cline-neutral">&nbsp;</span>
806
- <span class="cline-any cline-no">&nbsp;</span>
807
- <span class="cline-any cline-neutral">&nbsp;</span>
808
- <span class="cline-any cline-no">&nbsp;</span>
809
- <span class="cline-any cline-neutral">&nbsp;</span>
810
- <span class="cline-any cline-no">&nbsp;</span>
811
- <span class="cline-any cline-no">&nbsp;</span>
812
- <span class="cline-any cline-neutral">&nbsp;</span>
813
- <span class="cline-any cline-no">&nbsp;</span>
814
- <span class="cline-any cline-neutral">&nbsp;</span>
815
- <span class="cline-any cline-neutral">&nbsp;</span>
816
- <span class="cline-any cline-neutral">&nbsp;</span>
817
- <span class="cline-any cline-neutral">&nbsp;</span>
818
- <span class="cline-any cline-neutral">&nbsp;</span>
819
- <span class="cline-any cline-neutral">&nbsp;</span>
820
- <span class="cline-any cline-neutral">&nbsp;</span>
821
- <span class="cline-any cline-neutral">&nbsp;</span>
822
- <span class="cline-any cline-neutral">&nbsp;</span>
823
- <span class="cline-any cline-neutral">&nbsp;</span>
824
- <span class="cline-any cline-neutral">&nbsp;</span>
825
- <span class="cline-any cline-no">&nbsp;</span>
826
- <span class="cline-any cline-no">&nbsp;</span>
827
- <span class="cline-any cline-no">&nbsp;</span>
828
- <span class="cline-any cline-neutral">&nbsp;</span>
829
- <span class="cline-any cline-neutral">&nbsp;</span>
830
- <span class="cline-any cline-neutral">&nbsp;</span>
831
- <span class="cline-any cline-neutral">&nbsp;</span>
832
- <span class="cline-any cline-neutral">&nbsp;</span>
833
- <span class="cline-any cline-neutral">&nbsp;</span>
834
- <span class="cline-any cline-neutral">&nbsp;</span>
835
- <span class="cline-any cline-neutral">&nbsp;</span>
836
- <span class="cline-any cline-neutral">&nbsp;</span>
837
- <span class="cline-any cline-neutral">&nbsp;</span>
838
- <span class="cline-any cline-neutral">&nbsp;</span>
839
- <span class="cline-any cline-neutral">&nbsp;</span>
840
- <span class="cline-any cline-neutral">&nbsp;</span>
841
- <span class="cline-any cline-neutral">&nbsp;</span>
842
- <span class="cline-any cline-neutral">&nbsp;</span>
843
- <span class="cline-any cline-neutral">&nbsp;</span>
844
- <span class="cline-any cline-neutral">&nbsp;</span>
845
- <span class="cline-any cline-neutral">&nbsp;</span>
846
- <span class="cline-any cline-neutral">&nbsp;</span>
847
- <span class="cline-any cline-neutral">&nbsp;</span>
848
- <span class="cline-any cline-neutral">&nbsp;</span>
849
- <span class="cline-any cline-no">&nbsp;</span>
850
- <span class="cline-any cline-no">&nbsp;</span>
851
- <span class="cline-any cline-neutral">&nbsp;</span>
852
- <span class="cline-any cline-neutral">&nbsp;</span>
853
- <span class="cline-any cline-no">&nbsp;</span>
854
- <span class="cline-any cline-no">&nbsp;</span>
855
- <span class="cline-any cline-no">&nbsp;</span>
856
- <span class="cline-any cline-no">&nbsp;</span>
857
- <span class="cline-any cline-neutral">&nbsp;</span>
858
- <span class="cline-any cline-neutral">&nbsp;</span>
859
- <span class="cline-any cline-no">&nbsp;</span>
860
- <span class="cline-any cline-neutral">&nbsp;</span>
861
- <span class="cline-any cline-no">&nbsp;</span>
862
- <span class="cline-any cline-no">&nbsp;</span>
863
- <span class="cline-any cline-neutral">&nbsp;</span>
864
- <span class="cline-any cline-neutral">&nbsp;</span>
865
- <span class="cline-any cline-no">&nbsp;</span>
866
- <span class="cline-any cline-neutral">&nbsp;</span>
867
- <span class="cline-any cline-neutral">&nbsp;</span>
868
- <span class="cline-any cline-no">&nbsp;</span>
869
- <span class="cline-any cline-neutral">&nbsp;</span>
870
- <span class="cline-any cline-no">&nbsp;</span>
871
- <span class="cline-any cline-no">&nbsp;</span>
872
- <span class="cline-any cline-no">&nbsp;</span>
873
- <span class="cline-any cline-neutral">&nbsp;</span>
874
- <span class="cline-any cline-no">&nbsp;</span>
875
- <span class="cline-any cline-no">&nbsp;</span>
876
- <span class="cline-any cline-neutral">&nbsp;</span>
877
- <span class="cline-any cline-neutral">&nbsp;</span>
878
- <span class="cline-any cline-no">&nbsp;</span>
879
- <span class="cline-any cline-no">&nbsp;</span>
880
- <span class="cline-any cline-no">&nbsp;</span>
881
- <span class="cline-any cline-neutral">&nbsp;</span>
882
- <span class="cline-any cline-no">&nbsp;</span>
883
- <span class="cline-any cline-no">&nbsp;</span>
884
- <span class="cline-any cline-no">&nbsp;</span>
885
- <span class="cline-any cline-neutral">&nbsp;</span>
886
- <span class="cline-any cline-neutral">&nbsp;</span>
887
- <span class="cline-any cline-no">&nbsp;</span>
888
- <span class="cline-any cline-neutral">&nbsp;</span>
889
- <span class="cline-any cline-neutral">&nbsp;</span>
890
- <span class="cline-any cline-neutral">&nbsp;</span>
891
- <span class="cline-any cline-neutral">&nbsp;</span>
892
- <span class="cline-any cline-neutral">&nbsp;</span>
893
- <span class="cline-any cline-neutral">&nbsp;</span>
894
- <span class="cline-any cline-neutral">&nbsp;</span>
895
- <span class="cline-any cline-neutral">&nbsp;</span>
896
- <span class="cline-any cline-neutral">&nbsp;</span>
897
- <span class="cline-any cline-neutral">&nbsp;</span>
898
- <span class="cline-any cline-neutral">&nbsp;</span>
899
- <span class="cline-any cline-neutral">&nbsp;</span>
900
- <span class="cline-any cline-neutral">&nbsp;</span>
901
- <span class="cline-any cline-no">&nbsp;</span>
902
- <span class="cline-any cline-neutral">&nbsp;</span>
903
- <span class="cline-any cline-no">&nbsp;</span>
904
- <span class="cline-any cline-no">&nbsp;</span>
905
- <span class="cline-any cline-neutral">&nbsp;</span>
906
- <span class="cline-any cline-neutral">&nbsp;</span>
907
- <span class="cline-any cline-no">&nbsp;</span>
908
- <span class="cline-any cline-no">&nbsp;</span>
909
- <span class="cline-any cline-no">&nbsp;</span>
910
- <span class="cline-any cline-neutral">&nbsp;</span>
911
- <span class="cline-any cline-neutral">&nbsp;</span>
912
- <span class="cline-any cline-neutral">&nbsp;</span>
913
- <span class="cline-any cline-no">&nbsp;</span>
914
- <span class="cline-any cline-neutral">&nbsp;</span>
915
- <span class="cline-any cline-no">&nbsp;</span>
916
- <span class="cline-any cline-neutral">&nbsp;</span>
917
- <span class="cline-any cline-no">&nbsp;</span>
918
- <span class="cline-any cline-neutral">&nbsp;</span>
919
- <span class="cline-any cline-no">&nbsp;</span>
920
- <span class="cline-any cline-neutral">&nbsp;</span>
921
- <span class="cline-any cline-neutral">&nbsp;</span>
922
- <span class="cline-any cline-neutral">&nbsp;</span>
923
- <span class="cline-any cline-neutral">&nbsp;</span>
924
- <span class="cline-any cline-neutral">&nbsp;</span>
925
- <span class="cline-any cline-neutral">&nbsp;</span>
926
- <span class="cline-any cline-neutral">&nbsp;</span>
927
- <span class="cline-any cline-no">&nbsp;</span>
928
- <span class="cline-any cline-neutral">&nbsp;</span>
929
- <span class="cline-any cline-neutral">&nbsp;</span>
930
- <span class="cline-any cline-neutral">&nbsp;</span>
931
- <span class="cline-any cline-no">&nbsp;</span>
932
- <span class="cline-any cline-neutral">&nbsp;</span>
933
- <span class="cline-any cline-neutral">&nbsp;</span>
934
- <span class="cline-any cline-neutral">&nbsp;</span>
935
- <span class="cline-any cline-neutral">&nbsp;</span>
936
- <span class="cline-any cline-neutral">&nbsp;</span>
937
- <span class="cline-any cline-neutral">&nbsp;</span>
938
- <span class="cline-any cline-neutral">&nbsp;</span>
939
- <span class="cline-any cline-neutral">&nbsp;</span>
940
- <span class="cline-any cline-neutral">&nbsp;</span>
941
- <span class="cline-any cline-neutral">&nbsp;</span>
942
- <span class="cline-any cline-neutral">&nbsp;</span>
943
- <span class="cline-any cline-neutral">&nbsp;</span>
944
- <span class="cline-any cline-neutral">&nbsp;</span>
945
- <span class="cline-any cline-neutral">&nbsp;</span>
946
- <span class="cline-any cline-no">&nbsp;</span>
947
- <span class="cline-any cline-neutral">&nbsp;</span>
948
- <span class="cline-any cline-no">&nbsp;</span>
949
- <span class="cline-any cline-neutral">&nbsp;</span>
950
- <span class="cline-any cline-neutral">&nbsp;</span>
951
- <span class="cline-any cline-no">&nbsp;</span>
952
- <span class="cline-any cline-no">&nbsp;</span>
953
- <span class="cline-any cline-no">&nbsp;</span>
954
- <span class="cline-any cline-no">&nbsp;</span>
955
- <span class="cline-any cline-neutral">&nbsp;</span>
956
- <span class="cline-any cline-neutral">&nbsp;</span>
957
- <span class="cline-any cline-no">&nbsp;</span>
958
- <span class="cline-any cline-no">&nbsp;</span>
959
- <span class="cline-any cline-neutral">&nbsp;</span>
960
- <span class="cline-any cline-no">&nbsp;</span>
961
- <span class="cline-any cline-neutral">&nbsp;</span>
962
- <span class="cline-any cline-neutral">&nbsp;</span>
963
- <span class="cline-any cline-neutral">&nbsp;</span>
964
- <span class="cline-any cline-neutral">&nbsp;</span>
965
- <span class="cline-any cline-neutral">&nbsp;</span>
966
- <span class="cline-any cline-neutral">&nbsp;</span>
967
- <span class="cline-any cline-neutral">&nbsp;</span>
968
- <span class="cline-any cline-neutral">&nbsp;</span>
969
- <span class="cline-any cline-neutral">&nbsp;</span>
970
- <span class="cline-any cline-no">&nbsp;</span>
971
- <span class="cline-any cline-neutral">&nbsp;</span>
972
- <span class="cline-any cline-neutral">&nbsp;</span>
973
- <span class="cline-any cline-neutral">&nbsp;</span>
974
- <span class="cline-any cline-neutral">&nbsp;</span>
975
- <span class="cline-any cline-neutral">&nbsp;</span>
976
- <span class="cline-any cline-neutral">&nbsp;</span>
977
- <span class="cline-any cline-neutral">&nbsp;</span>
978
- <span class="cline-any cline-neutral">&nbsp;</span>
979
- <span class="cline-any cline-neutral">&nbsp;</span>
980
- <span class="cline-any cline-no">&nbsp;</span>
981
- <span class="cline-any cline-no">&nbsp;</span>
982
- <span class="cline-any cline-no">&nbsp;</span>
983
- <span class="cline-any cline-no">&nbsp;</span>
984
- <span class="cline-any cline-no">&nbsp;</span>
985
- <span class="cline-any cline-no">&nbsp;</span>
986
- <span class="cline-any cline-neutral">&nbsp;</span>
987
- <span class="cline-any cline-no">&nbsp;</span>
988
- <span class="cline-any cline-no">&nbsp;</span>
989
- <span class="cline-any cline-no">&nbsp;</span>
990
- <span class="cline-any cline-no">&nbsp;</span>
991
- <span class="cline-any cline-neutral">&nbsp;</span>
992
- <span class="cline-any cline-no">&nbsp;</span>
993
- <span class="cline-any cline-neutral">&nbsp;</span>
994
- <span class="cline-any cline-neutral">&nbsp;</span>
995
- <span class="cline-any cline-neutral">&nbsp;</span>
996
- <span class="cline-any cline-no">&nbsp;</span>
997
- <span class="cline-any cline-neutral">&nbsp;</span>
998
- <span class="cline-any cline-no">&nbsp;</span>
999
- <span class="cline-any cline-no">&nbsp;</span>
1000
- <span class="cline-any cline-neutral">&nbsp;</span>
1001
- <span class="cline-any cline-no">&nbsp;</span>
1002
- <span class="cline-any cline-no">&nbsp;</span>
1003
- <span class="cline-any cline-no">&nbsp;</span>
1004
- <span class="cline-any cline-neutral">&nbsp;</span>
1005
- <span class="cline-any cline-neutral">&nbsp;</span>
1006
- <span class="cline-any cline-no">&nbsp;</span>
1007
- <span class="cline-any cline-neutral">&nbsp;</span>
1008
- <span class="cline-any cline-neutral">&nbsp;</span>
1009
- <span class="cline-any cline-no">&nbsp;</span>
1010
- <span class="cline-any cline-no">&nbsp;</span>
1011
- <span class="cline-any cline-neutral">&nbsp;</span>
1012
- <span class="cline-any cline-neutral">&nbsp;</span>
1013
- <span class="cline-any cline-neutral">&nbsp;</span>
1014
- <span class="cline-any cline-no">&nbsp;</span>
1015
- <span class="cline-any cline-no">&nbsp;</span>
1016
- <span class="cline-any cline-no">&nbsp;</span>
1017
- <span class="cline-any cline-no">&nbsp;</span>
1018
- <span class="cline-any cline-neutral">&nbsp;</span>
1019
- <span class="cline-any cline-neutral">&nbsp;</span>
1020
- <span class="cline-any cline-neutral">&nbsp;</span>
1021
- <span class="cline-any cline-neutral">&nbsp;</span>
1022
- <span class="cline-any cline-neutral">&nbsp;</span>
1023
- <span class="cline-any cline-neutral">&nbsp;</span>
1024
- <span class="cline-any cline-neutral">&nbsp;</span>
1025
- <span class="cline-any cline-neutral">&nbsp;</span>
1026
- <span class="cline-any cline-neutral">&nbsp;</span>
1027
- <span class="cline-any cline-neutral">&nbsp;</span>
1028
- <span class="cline-any cline-neutral">&nbsp;</span>
1029
- <span class="cline-any cline-neutral">&nbsp;</span>
1030
- <span class="cline-any cline-neutral">&nbsp;</span>
1031
- <span class="cline-any cline-neutral">&nbsp;</span>
1032
- <span class="cline-any cline-neutral">&nbsp;</span>
1033
- <span class="cline-any cline-no">&nbsp;</span>
1034
- <span class="cline-any cline-neutral">&nbsp;</span>
1035
- <span class="cline-any cline-no">&nbsp;</span>
1036
- <span class="cline-any cline-neutral">&nbsp;</span>
1037
- <span class="cline-any cline-neutral">&nbsp;</span>
1038
- <span class="cline-any cline-neutral">&nbsp;</span>
1039
- <span class="cline-any cline-no">&nbsp;</span>
1040
- <span class="cline-any cline-neutral">&nbsp;</span>
1041
- <span class="cline-any cline-neutral">&nbsp;</span>
1042
- <span class="cline-any cline-neutral">&nbsp;</span>
1043
- <span class="cline-any cline-neutral">&nbsp;</span>
1044
- <span class="cline-any cline-neutral">&nbsp;</span>
1045
- <span class="cline-any cline-yes">2x</span>
1046
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import * as descriptors from '@bitcoinerlab/descriptors';
1047
- import * as secp256k1 from '@bitcoinerlab/secp256k1';
1048
- const { Descriptor } = descriptors.DescriptorsFactory(secp256k1);
1049
- import Transport from '@ledgerhq/hw-transport';
1050
- &nbsp;
1051
- import { pathElementsToBuffer, pathStringToArray } from './bip32';
1052
- import { ClientCommandInterpreter } from './clientCommands';
1053
- import { MerkelizedPsbt } from './merkelizedPsbt';
1054
- import { hashLeaf, Merkle } from './merkle';
1055
- import { WalletPolicy } from './policy';
1056
- import { PsbtV2 } from './psbtv2';
1057
- import { createVarint, parseVarint } from './varint';
1058
- import { SYSCOIN_NETWORKS } from '../../../ledger/consts';
1059
- &nbsp;
1060
- const CLA_BTC = 0xe1;
1061
- const CLA_FRAMEWORK = 0xf8;
1062
- &nbsp;
1063
- const CURRENT_PROTOCOL_VERSION = 1; // supported from version 2.1.0 of the app
1064
- &nbsp;
1065
- enum BitcoinIns {
1066
- GET_PUBKEY = 0x00,
1067
- REGISTER_WALLET = 0x02,
1068
- GET_WALLET_ADDRESS = 0x03,
1069
- SIGN_PSBT = 0x04,
1070
- GET_MASTER_FINGERPRINT = 0x05,
1071
- SIGN_MESSAGE = 0x10,
1072
- }
1073
- &nbsp;
1074
- enum FrameworkIns {
1075
- CONTINUE_INTERRUPTED = 0x01,
1076
- }
1077
- &nbsp;
1078
- /**
1079
- * This class represents a partial signature produced by the app during signing.
1080
- * It always contains the `signature` and the corresponding `pubkey` whose private key
1081
- * was used for signing; in the case of taproot script paths, it also contains the
1082
- * tapleaf hash.
1083
- */
1084
- export class PartialSignature {
1085
- readonly pubkey: Buffer;
1086
- readonly signature: Buffer;
1087
- readonly tapleafHash?: Buffer;
1088
- &nbsp;
1089
- <span class="fstat-no" title="function not covered" > constructor(p</span>ubkey: Buffer, signature: Buffer, tapleafHash?: Buffer) {
1090
- <span class="cstat-no" title="statement not covered" > this.pubkey = pubkey;</span>
1091
- <span class="cstat-no" title="statement not covered" > this.signature = signature;</span>
1092
- <span class="cstat-no" title="statement not covered" > this.tapleafHash = tapleafHash;</span>
1093
- }
1094
- }
1095
- &nbsp;
1096
- /**
1097
- * Creates an instance of `PartialSignature` from the returned raw augmented pubkey and signature.
1098
- * @param pubkeyAugm the public key, concatenated with the tapleaf hash in the case of taproot script path spend.
1099
- * @param signature the signature
1100
- * @returns an instance of `PartialSignature`.
1101
- */
1102
- function <span class="fstat-no" title="function not covered" >makePartialSignature(</span>
1103
- pubkeyAugm: Buffer,
1104
- signature: Buffer
1105
- ): PartialSignature {
1106
- <span class="cstat-no" title="statement not covered" > if (pubkeyAugm.length == 64) {</span>
1107
- // tapscript spend: concatenation of 32-bytes x-only pubkey and 32-bytes tapleaf_hash
1108
- <span class="cstat-no" title="statement not covered" > return new PartialSignature(</span>
1109
- pubkeyAugm.slice(0, 32),
1110
- signature,
1111
- pubkeyAugm.slice(32, 64)
1112
- );
1113
- } else <span class="cstat-no" title="statement not covered" >if (pubkeyAugm.length == 32 || pubkeyAugm.length == 33) {</span>
1114
- // legacy, segwit or taproot keypath spend: pubkeyAugm is just the pubkey
1115
- <span class="cstat-no" title="statement not covered" > return new PartialSignature(pubkeyAugm, signature);</span>
1116
- } else {
1117
- <span class="cstat-no" title="statement not covered" > throw new Error(</span>
1118
- `Invalid length for pubkeyAugm: ${pubkeyAugm.length} bytes.`
1119
- );
1120
- }
1121
- }
1122
- &nbsp;
1123
- /**
1124
- * This class encapsulates the APDU protocol documented at
1125
- * https://github.com/LedgerHQ/app-bitcoin-new/blob/master/doc/bitcoin.md
1126
- */
1127
- export class AppClient {
1128
- readonly transport: Transport;
1129
- &nbsp;
1130
- <span class="fstat-no" title="function not covered" > constructor(t</span>ransport: Transport) {
1131
- <span class="cstat-no" title="statement not covered" > this.transport = transport;</span>
1132
- }
1133
- &nbsp;
1134
- private <span class="fstat-no" title="function not covered" >async </span>makeRequest(
1135
- ins: BitcoinIns,
1136
- data: Buffer,
1137
- cci?: ClientCommandInterpreter
1138
- ): Promise&lt;Buffer&gt; {
1139
- let response: Buffer = <span class="cstat-no" title="statement not covered" >await this.transport.send(</span>
1140
- CLA_BTC,
1141
- ins,
1142
- 0,
1143
- CURRENT_PROTOCOL_VERSION,
1144
- data,
1145
- [0x9000, 0xe000]
1146
- );
1147
- <span class="cstat-no" title="statement not covered" > while (response.readUInt16BE(response.length - 2) === 0xe000) {</span>
1148
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!cci) {</span>
1149
- <span class="cstat-no" title="statement not covered" > throw new Error('Unexpected SW_INTERRUPTED_EXECUTION');</span>
1150
- }
1151
- &nbsp;
1152
- const hwRequest = <span class="cstat-no" title="statement not covered" >response.slice(0, -2);</span>
1153
- const commandResponse = <span class="cstat-no" title="statement not covered" >cci.execute(hwRequest);</span>
1154
- &nbsp;
1155
- <span class="cstat-no" title="statement not covered" > response = await this.transport.send(</span>
1156
- CLA_FRAMEWORK,
1157
- FrameworkIns.CONTINUE_INTERRUPTED,
1158
- 0,
1159
- 0,
1160
- commandResponse,
1161
- [0x9000, 0xe000]
1162
- );
1163
- }
1164
- <span class="cstat-no" title="statement not covered" > return response.slice(0, -2); </span>// drop the status word (can only be 0x9000 at this point)
1165
- }
1166
- &nbsp;
1167
- /**
1168
- * Returns an object containing the currently running app's name, version and the device status flags.
1169
- *
1170
- * @returns an object with app name, version and device status flags.
1171
- */
1172
- public <span class="fstat-no" title="function not covered" >async </span>getAppAndVersion(): Promise&lt;{
1173
- flags: number | Buffer;
1174
- name: string;
1175
- version: string;
1176
- }&gt; {
1177
- const r = <span class="cstat-no" title="statement not covered" >await this.transport.send(0xb0, 0x01, 0x00, 0x00);</span>
1178
- let i = <span class="cstat-no" title="statement not covered" >0;</span>
1179
- const format = <span class="cstat-no" title="statement not covered" >r[i++];</span>
1180
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (format !== 1) <span class="cstat-no" title="statement not covered" >throw new Error('Unexpected response');</span></span>
1181
- &nbsp;
1182
- const nameLength = <span class="cstat-no" title="statement not covered" >r[i++];</span>
1183
- const name = <span class="cstat-no" title="statement not covered" >r.slice(i, (i += nameLength)).toString('ascii');</span>
1184
- const versionLength = <span class="cstat-no" title="statement not covered" >r[i++];</span>
1185
- const version = <span class="cstat-no" title="statement not covered" >r.slice(i, (i += versionLength)).toString('ascii');</span>
1186
- const flagLength = <span class="cstat-no" title="statement not covered" >r[i++];</span>
1187
- const flags = <span class="cstat-no" title="statement not covered" >r.slice(i, (i += flagLength));</span>
1188
- <span class="cstat-no" title="statement not covered" > return {</span>
1189
- name,
1190
- version,
1191
- flags,
1192
- };
1193
- }
1194
- &nbsp;
1195
- /**
1196
- * Requests the BIP-32 extended pubkey to the hardware wallet.
1197
- * If `display` is `false`, only standard paths will be accepted; an error is returned if an unusual path is
1198
- * requested.
1199
- * If `display` is `true`, the requested path is shown on screen for user verification; unusual paths can be
1200
- * requested, and a warning is shown to the user in that case.
1201
- *
1202
- * @param path the requested BIP-32 path as a string
1203
- * @param display `false` to silently retrieve a pubkey for a standard path, `true` to display the path on screen
1204
- * @returns the base58-encoded serialized extended pubkey (xpub)
1205
- */
1206
- <span class="fstat-no" title="function not covered" > async </span>getExtendedPubkey(path: string, display = <span class="branch-0 cbranch-no" title="branch not covered" >false)</span>: Promise&lt;string&gt; {
1207
- const pathElements = <span class="cstat-no" title="statement not covered" >pathStringToArray(path);</span>
1208
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (pathElements.length &gt; 6) {</span>
1209
- <span class="cstat-no" title="statement not covered" > throw new Error('Path too long. At most 6 levels allowed.');</span>
1210
- }
1211
- const response = <span class="cstat-no" title="statement not covered" >await this.makeRequest(</span>
1212
- BitcoinIns.GET_PUBKEY,
1213
- Buffer.concat([
1214
- Buffer.from(display ? [1] : [0]),
1215
- pathElementsToBuffer(pathElements),
1216
- ])
1217
- );
1218
- <span class="cstat-no" title="statement not covered" > return response.toString('ascii');</span>
1219
- }
1220
- &nbsp;
1221
- /**
1222
- * Registers a `WalletPolicy`, after interactive verification from the user.
1223
- * On success, after user's approval, this function returns the id (which is the same that can be computed with
1224
- * `walletPolicy.getid()`), followed by the 32-byte hmac. The client should store the hmac to use it for future
1225
- * requests to `getWalletAddress` or `signPsbt` using this `WalletPolicy`.
1226
- *
1227
- * @param walletPolicy the `WalletPolicy` to register
1228
- * @returns a pair of two 32-byte arrays: the id of the Wallet Policy, followed by the policy hmac
1229
- */
1230
- <span class="fstat-no" title="function not covered" > async </span>registerWallet(
1231
- walletPolicy: WalletPolicy
1232
- ): Promise&lt;readonly [Buffer, Buffer]&gt; {
1233
- const clientInterpreter = <span class="cstat-no" title="statement not covered" >new ClientCommandInterpreter();</span>
1234
- &nbsp;
1235
- <span class="cstat-no" title="statement not covered" > clientInterpreter.addKnownWalletPolicy(walletPolicy);</span>
1236
- &nbsp;
1237
- const serializedWalletPolicy = <span class="cstat-no" title="statement not covered" >walletPolicy.serialize();</span>
1238
- const response = <span class="cstat-no" title="statement not covered" >await this.makeRequest(</span>
1239
- BitcoinIns.REGISTER_WALLET,
1240
- Buffer.concat([
1241
- createVarint(serializedWalletPolicy.length),
1242
- serializedWalletPolicy,
1243
- ]),
1244
- clientInterpreter
1245
- );
1246
- &nbsp;
1247
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (response.length != 64) {</span>
1248
- <span class="cstat-no" title="statement not covered" > throw Error(</span>
1249
- `Invalid response length. Expected 64 bytes, got ${response.length}`
1250
- );
1251
- }
1252
- const walletId = <span class="cstat-no" title="statement not covered" >response.subarray(0, 32);</span>
1253
- const walletHMAC = <span class="cstat-no" title="statement not covered" >response.subarray(32);</span>
1254
- &nbsp;
1255
- // sanity check: derive and validate the first address with a 3rd party
1256
- const firstAddrDevice = <span class="cstat-no" title="statement not covered" >await this.getWalletAddress(</span>
1257
- walletPolicy,
1258
- walletHMAC,
1259
- 0,
1260
- 0,
1261
- false
1262
- );
1263
- <span class="cstat-no" title="statement not covered" > await this.validateAddress(firstAddrDevice, walletPolicy, 0, 0);</span>
1264
- &nbsp;
1265
- <span class="cstat-no" title="statement not covered" > return [walletId, walletHMAC];</span>
1266
- }
1267
- &nbsp;
1268
- /**
1269
- * Returns the address of `walletPolicy` for the given `change` and `addressIndex`.
1270
- *
1271
- * @param walletPolicy the `WalletPolicy` to use
1272
- * @param walletHMAC the 32-byte hmac returned during wallet registration for a registered policy; otherwise
1273
- * `null` for a standard policy
1274
- * @param change `0` for a normal receive address, `1` for a change address
1275
- * @param addressIndex the address index to retrieve
1276
- * @param display `True` to show the address on screen, `False` to retrieve it silently
1277
- * @returns the address, as an ascii string.
1278
- */
1279
- <span class="fstat-no" title="function not covered" > async </span>getWalletAddress(
1280
- walletPolicy: WalletPolicy,
1281
- walletHMAC: Buffer | null,
1282
- change: number,
1283
- addressIndex: number,
1284
- display: boolean
1285
- ): Promise&lt;string&gt; {
1286
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (change !== 0 &amp;&amp; change !== 1)</span>
1287
- <span class="cstat-no" title="statement not covered" > throw new Error('Change can only be 0 or 1');</span>
1288
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (addressIndex &lt; 0 || !Number.isInteger(addressIndex))</span>
1289
- <span class="cstat-no" title="statement not covered" > throw new Error('Invalid address index');</span>
1290
- &nbsp;
1291
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (walletHMAC != null &amp;&amp; walletHMAC.length != 32) {</span>
1292
- <span class="cstat-no" title="statement not covered" > throw new Error('Invalid HMAC length');</span>
1293
- }
1294
- &nbsp;
1295
- const clientInterpreter = <span class="cstat-no" title="statement not covered" >new ClientCommandInterpreter();</span>
1296
- &nbsp;
1297
- <span class="cstat-no" title="statement not covered" > clientInterpreter.addKnownWalletPolicy(walletPolicy);</span>
1298
- &nbsp;
1299
- const addressIndexBuffer = <span class="cstat-no" title="statement not covered" >Buffer.alloc(4);</span>
1300
- <span class="cstat-no" title="statement not covered" > addressIndexBuffer.writeUInt32BE(addressIndex, 0);</span>
1301
- &nbsp;
1302
- const response = <span class="cstat-no" title="statement not covered" >await this.makeRequest(</span>
1303
- BitcoinIns.GET_WALLET_ADDRESS,
1304
- Buffer.concat([
1305
- Buffer.from(display ? [1] : [0]),
1306
- walletPolicy.getId(),
1307
- walletHMAC || Buffer.alloc(32, 0),
1308
- Buffer.from([change]),
1309
- addressIndexBuffer,
1310
- ]),
1311
- clientInterpreter
1312
- );
1313
- &nbsp;
1314
- const address = <span class="cstat-no" title="statement not covered" >response.toString('ascii');</span>
1315
- <span class="cstat-no" title="statement not covered" > await this.validateAddress(address, walletPolicy, change, addressIndex);</span>
1316
- <span class="cstat-no" title="statement not covered" > return address;</span>
1317
- }
1318
- &nbsp;
1319
- /**
1320
- * Signs a psbt using a (standard or registered) `WalletPolicy`. This is an interactive command, as user validation
1321
- * is necessary using the device's secure screen.
1322
- * On success, a map of input indexes and signatures is returned.
1323
- * @param psbt a base64-encoded string, or a psbt in a binary Buffer. Using the `PsbtV2` type is deprecated.
1324
- * @param walletPolicy the `WalletPolicy` to use for signing
1325
- * @param walletHMAC the 32-byte hmac obtained during wallet policy registration, or `null` for a standard policy
1326
- * @param progressCallback optionally, a callback that will be called every time a signature is produced during
1327
- * the signing process. The callback does not receive any argument, but can be used to track progress.
1328
- * @returns an array of of tuples with 2 elements containing:
1329
- * - the index of the input being signed;
1330
- * - an instance of PartialSignature
1331
- */
1332
- <span class="fstat-no" title="function not covered" > async </span>signPsbt(
1333
- psbt: PsbtV2 | string | Buffer,
1334
- walletPolicy: WalletPolicy,
1335
- walletHMAC: Buffer | null,
1336
- progressCallback?: () =&gt; void
1337
- ): Promise&lt;[number, PartialSignature][]&gt; {
1338
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof psbt === 'string') {</span>
1339
- <span class="cstat-no" title="statement not covered" > psbt = Buffer.from(psbt, 'base64');</span>
1340
- }
1341
- &nbsp;
1342
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (Buffer.isBuffer(psbt)) {</span>
1343
- const psbtObj = <span class="cstat-no" title="statement not covered" >new PsbtV2();</span>
1344
- <span class="cstat-no" title="statement not covered" > psbtObj.deserialize(psbt);</span>
1345
- <span class="cstat-no" title="statement not covered" > psbt = psbtObj;</span>
1346
- }
1347
- &nbsp;
1348
- const merkelizedPsbt = <span class="cstat-no" title="statement not covered" >new MerkelizedPsbt(psbt);</span>
1349
- &nbsp;
1350
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (walletHMAC != null &amp;&amp; walletHMAC.length != 32) {</span>
1351
- <span class="cstat-no" title="statement not covered" > throw new Error('Invalid HMAC length');</span>
1352
- }
1353
- &nbsp;
1354
- const clientInterpreter = <span class="cstat-no" title="statement not covered" >new ClientCommandInterpreter(progressCallback);</span>
1355
- &nbsp;
1356
- // prepare ClientCommandInterpreter
1357
- <span class="cstat-no" title="statement not covered" > clientInterpreter.addKnownWalletPolicy(walletPolicy);</span>
1358
- &nbsp;
1359
- <span class="cstat-no" title="statement not covered" > clientInterpreter.addKnownMapping(merkelizedPsbt.globalMerkleMap);</span>
1360
- <span class="cstat-no" title="statement not covered" > for (const map of merkelizedPsbt.inputMerkleMaps) {</span>
1361
- <span class="cstat-no" title="statement not covered" > clientInterpreter.addKnownMapping(map);</span>
1362
- }
1363
- <span class="cstat-no" title="statement not covered" > for (const map of merkelizedPsbt.outputMerkleMaps) {</span>
1364
- <span class="cstat-no" title="statement not covered" > clientInterpreter.addKnownMapping(map);</span>
1365
- }
1366
- &nbsp;
1367
- <span class="cstat-no" title="statement not covered" > clientInterpreter.addKnownList(merkelizedPsbt.inputMapCommitments);</span>
1368
- const inputMapsRoot = <span class="cstat-no" title="statement not covered" >new Merkle(</span>
1369
- merkelizedPsbt.inputMapCommitments.map(<span class="fstat-no" title="function not covered" >(m</span>) =&gt; <span class="cstat-no" title="statement not covered" >hashLeaf(m))</span>
1370
- ).getRoot();
1371
- <span class="cstat-no" title="statement not covered" > clientInterpreter.addKnownList(merkelizedPsbt.outputMapCommitments);</span>
1372
- const outputMapsRoot = <span class="cstat-no" title="statement not covered" >new Merkle(</span>
1373
- merkelizedPsbt.outputMapCommitments.map(<span class="fstat-no" title="function not covered" >(m</span>) =&gt; <span class="cstat-no" title="statement not covered" >hashLeaf(m))</span>
1374
- ).getRoot();
1375
- &nbsp;
1376
- <span class="cstat-no" title="statement not covered" > await this.makeRequest(</span>
1377
- BitcoinIns.SIGN_PSBT,
1378
- Buffer.concat([
1379
- merkelizedPsbt.getGlobalKeysValuesRoot(),
1380
- createVarint(merkelizedPsbt.getGlobalInputCount()),
1381
- inputMapsRoot,
1382
- createVarint(merkelizedPsbt.getGlobalOutputCount()),
1383
- outputMapsRoot,
1384
- walletPolicy.getId(),
1385
- walletHMAC || Buffer.alloc(32, 0),
1386
- ]),
1387
- clientInterpreter
1388
- );
1389
- &nbsp;
1390
- const yielded = <span class="cstat-no" title="statement not covered" >clientInterpreter.getYielded();</span>
1391
- &nbsp;
1392
- const ret: [number, PartialSignature][] = <span class="cstat-no" title="statement not covered" >[];</span>
1393
- <span class="cstat-no" title="statement not covered" > for (const inputAndSig of yielded) {</span>
1394
- // inputAndSig contains:
1395
- // &lt;inputIndex : varint&gt; &lt;pubkeyLen : 1 byte&gt; &lt;pubkey : pubkeyLen bytes (32 or 33)&gt; &lt;signature : variable length&gt;
1396
- const [inputIndex, inputIndexLen] = <span class="cstat-no" title="statement not covered" >parseVarint(inputAndSig, 0);</span>
1397
- const pubkeyAugmLen = <span class="cstat-no" title="statement not covered" >inputAndSig[inputIndexLen];</span>
1398
- const pubkeyAugm = <span class="cstat-no" title="statement not covered" >inputAndSig.subarray(</span>
1399
- inputIndexLen + 1,
1400
- inputIndexLen + 1 + pubkeyAugmLen
1401
- );
1402
- const signature = <span class="cstat-no" title="statement not covered" >inputAndSig.subarray(inputIndexLen + 1 + pubkeyAugmLen);</span>
1403
- &nbsp;
1404
- const partialSig = <span class="cstat-no" title="statement not covered" >makePartialSignature(pubkeyAugm, signature);</span>
1405
- &nbsp;
1406
- <span class="cstat-no" title="statement not covered" > ret.push([Number(inputIndex), partialSig]);</span>
1407
- }
1408
- <span class="cstat-no" title="statement not covered" > return ret;</span>
1409
- }
1410
- &nbsp;
1411
- /**
1412
- * Returns the fingerprint of the master public key, as per BIP-32 standard.
1413
- * @returns the master key fingerprint as a string of 8 hexadecimal digits.
1414
- */
1415
- <span class="fstat-no" title="function not covered" > async </span>getMasterFingerprint(): Promise&lt;string&gt; {
1416
- const fpr = <span class="cstat-no" title="statement not covered" >await this.makeRequest(</span>
1417
- BitcoinIns.GET_MASTER_FINGERPRINT,
1418
- Buffer.from([])
1419
- );
1420
- <span class="cstat-no" title="statement not covered" > return fpr.toString('hex');</span>
1421
- }
1422
- &nbsp;
1423
- /**
1424
- * Signs a message using the legacy Bitcoin Message Signing standard. The signed message is
1425
- * the double-sha256 hash of the concatenation of:
1426
- * - "\x18Bitcoin Signed Message:\n";
1427
- * - the length of `message`, encoded as a Bitcoin-style variable length integer;
1428
- * - `message`.
1429
- *
1430
- * @param message the serialized message to sign
1431
- * @param path the BIP-32 path of the key used to sign the message
1432
- * @returns base64-encoded signature of the message.
1433
- */
1434
- <span class="fstat-no" title="function not covered" > async </span>signMessage(message: Buffer, path: string): Promise&lt;string&gt; {
1435
- const pathElements = <span class="cstat-no" title="statement not covered" >pathStringToArray(path);</span>
1436
- &nbsp;
1437
- const clientInterpreter = <span class="cstat-no" title="statement not covered" >new ClientCommandInterpreter();</span>
1438
- &nbsp;
1439
- // prepare ClientCommandInterpreter
1440
- const nChunks = <span class="cstat-no" title="statement not covered" >Math.ceil(message.length / 64);</span>
1441
- const chunks: Buffer[] = <span class="cstat-no" title="statement not covered" >[];</span>
1442
- <span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >0;</span> i &lt; nChunks; i++) {</span>
1443
- <span class="cstat-no" title="statement not covered" > chunks.push(message.subarray(64 * i, 64 * i + 64));</span>
1444
- }
1445
- &nbsp;
1446
- <span class="cstat-no" title="statement not covered" > clientInterpreter.addKnownList(chunks);</span>
1447
- const chunksRoot = <span class="cstat-no" title="statement not covered" >new Merkle(chunks.map(<span class="fstat-no" title="function not covered" >(m</span>) =&gt; <span class="cstat-no" title="statement not covered" >hashLeaf(m))</span>).getRoot();</span>
1448
- &nbsp;
1449
- const result = <span class="cstat-no" title="statement not covered" >await this.makeRequest(</span>
1450
- BitcoinIns.SIGN_MESSAGE,
1451
- Buffer.concat([
1452
- pathElementsToBuffer(pathElements),
1453
- createVarint(message.length),
1454
- chunksRoot,
1455
- ]),
1456
- clientInterpreter
1457
- );
1458
- &nbsp;
1459
- <span class="cstat-no" title="statement not covered" > return result.toString('base64');</span>
1460
- }
1461
- &nbsp;
1462
- /* Performs any additional check on the generated address before returning it.*/
1463
- private <span class="fstat-no" title="function not covered" >async </span>validateAddress(
1464
- address: string,
1465
- walletPolicy: WalletPolicy,
1466
- change: number,
1467
- addressIndex: number
1468
- ) {
1469
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (change !== 0 &amp;&amp; change !== 1)</span>
1470
- <span class="cstat-no" title="statement not covered" > throw new Error('Change can only be 0 or 1');</span>
1471
- const isChange: boolean = <span class="cstat-no" title="statement not covered" >change === 1;</span>
1472
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (addressIndex &lt; 0 || !Number.isInteger(addressIndex))</span>
1473
- <span class="cstat-no" title="statement not covered" > throw new Error('Invalid address index');</span>
1474
- const appAndVer = <span class="cstat-no" title="statement not covered" >await this.getAppAndVersion();</span>
1475
- let network;
1476
- <span class="cstat-no" title="statement not covered" > if (appAndVer.name === 'Syscoin Test') {</span>
1477
- <span class="cstat-no" title="statement not covered" > network = SYSCOIN_NETWORKS.testnet;</span>
1478
- } else <span class="cstat-no" title="statement not covered" >if (appAndVer.name === 'Syscoin') {</span>
1479
- <span class="cstat-no" title="statement not covered" > network = SYSCOIN_NETWORKS.mainnet;</span>
1480
- } else {
1481
- <span class="cstat-no" title="statement not covered" > throw new Error(</span>
1482
- `Invalid network: ${appAndVer.name}. Expected 'Syscoin Test' or 'Syscoin'.`
1483
- );
1484
- }
1485
- let expression = <span class="cstat-no" title="statement not covered" >walletPolicy.descriptorTemplate;</span>
1486
- // Replace change:
1487
- <span class="cstat-no" title="statement not covered" > expression = expression.replace(/\/\*\*/g, `/&lt;0;1&gt;/*`);</span>
1488
- const regExpMN = <span class="cstat-no" title="statement not covered" >new RegExp(`/&lt;(\\d+);(\\d+)&gt;`, 'g');</span>
1489
- let matchMN;
1490
- <span class="cstat-no" title="statement not covered" > while ((matchMN = regExpMN.exec(expression)) !== null) {</span>
1491
- const [M, N] = <span class="cstat-no" title="statement not covered" >[parseInt(matchMN[1], 10), parseInt(matchMN[2], 10)];</span>
1492
- <span class="cstat-no" title="statement not covered" > expression = expression.replace(`/&lt;${M};${N}&gt;`, `/${isChange ? N : M}`);</span>
1493
- }
1494
- // Replace index:
1495
- <span class="cstat-no" title="statement not covered" > expression = expression.replace(/\/\*/g, `/${addressIndex}`);</span>
1496
- // Replace origin in reverse order to prevent
1497
- // misreplacements, e.g., @10 being mistaken for @1 and leaving a 0.
1498
- <span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >walletPolicy.keys.length - 1;</span> i &gt;= 0; i--)</span>
1499
- <span class="cstat-no" title="statement not covered" > expression = expression.replace(</span>
1500
- new RegExp(`@${i}`, 'g'),
1501
- walletPolicy.keys[i]
1502
- );
1503
- let thirdPartyValidationApplicable = <span class="cstat-no" title="statement not covered" >true;</span>
1504
- let thirdPartyGeneratedAddress = <span class="cstat-no" title="statement not covered" >'';</span>
1505
- <span class="cstat-no" title="statement not covered" > try {</span>
1506
- <span class="cstat-no" title="statement not covered" > thirdPartyGeneratedAddress = new Descriptor({</span>
1507
- expression,
1508
- network,
1509
- }).getAddress();
1510
- } catch (err) {
1511
- // Note: @bitcoinerlab/descriptors@1.0.x does not support Tapscript yet.
1512
- // These are the supported descriptors:
1513
- // - pkh(KEY)
1514
- // - wpkh(KEY)
1515
- // - sh(wpkh(KEY))
1516
- // - sh(SCRIPT)
1517
- // - wsh(SCRIPT)
1518
- // - sh(wsh(SCRIPT)), where
1519
- // SCRIPT is any of the (non-tapscript) fragments in: https://bitcoin.sipa.be/miniscript/
1520
- //
1521
- // Other expressions are not supported and third party validation would not be applicable:
1522
- <span class="cstat-no" title="statement not covered" > thirdPartyValidationApplicable = false;</span>
1523
- }
1524
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
1525
- thirdPartyValidationApplicable &amp;&amp;
1526
- address !== thirdPartyGeneratedAddress
1527
- )
1528
- <span class="cstat-no" title="statement not covered" > console.log(</span>
1529
- `Third party address validation mismatch: ${address} != ${thirdPartyGeneratedAddress}`
1530
- );
1531
- }
1532
- }
1533
- &nbsp;
1534
- export default AppClient;
1535
- &nbsp;</pre></td></tr></table></pre>
1536
-
1537
- <div class="push"></div>
1538
- <!-- for sticky footer -->
1539
- </div>
1540
- <!-- /wrapper -->
1541
- <div class="footer quiet pad2 space-top1 center small">
1542
- Code coverage generated by
1543
- <a
1544
- href="https://istanbul.js.org/"
1545
- target="_blank"
1546
- rel="noopener noreferrer"
1547
- >istanbul</a
1548
- >
1549
- at 2025-06-20T17:45:56.456Z
1550
- </div>
1551
- <script src="../../../../prettify.js"></script>
1552
- <script>
1553
- window.onload = function () {
1554
- prettyPrint();
1555
- };
1556
- </script>
1557
- <script src="../../../../sorter.js"></script>
1558
- <script src="../../../../block-navigation.js"></script>
1559
- </body>
1560
- </html>