@openreplay/tracker 9.0.9 → 9.0.10

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 (77) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/cjs/app/index.js +1 -1
  3. package/cjs/index.js +1 -1
  4. package/cjs/modules/timing.d.ts +1 -0
  5. package/cjs/modules/timing.js +7 -0
  6. package/coverage/clover.xml +3426 -0
  7. package/coverage/coverage-final.json +50 -0
  8. package/coverage/lcov-report/base.css +224 -0
  9. package/coverage/lcov-report/block-navigation.js +87 -0
  10. package/coverage/lcov-report/favicon.png +0 -0
  11. package/coverage/lcov-report/index.html +206 -0
  12. package/coverage/lcov-report/main/app/guards.ts.html +229 -0
  13. package/coverage/lcov-report/main/app/index.html +221 -0
  14. package/coverage/lcov-report/main/app/index.ts.html +2182 -0
  15. package/coverage/lcov-report/main/app/logger.ts.html +277 -0
  16. package/coverage/lcov-report/main/app/messages.gen.ts.html +2827 -0
  17. package/coverage/lcov-report/main/app/nodes.ts.html +385 -0
  18. package/coverage/lcov-report/main/app/observer/iframe_observer.ts.html +148 -0
  19. package/coverage/lcov-report/main/app/observer/iframe_offsets.ts.html +289 -0
  20. package/coverage/lcov-report/main/app/observer/index.html +161 -0
  21. package/coverage/lcov-report/main/app/observer/shadow_root_observer.ts.html +142 -0
  22. package/coverage/lcov-report/main/app/observer/top_observer.ts.html +538 -0
  23. package/coverage/lcov-report/main/app/sanitizer.ts.html +394 -0
  24. package/coverage/lcov-report/main/app/session.ts.html +601 -0
  25. package/coverage/lcov-report/main/app/ticker.ts.html +250 -0
  26. package/coverage/lcov-report/main/index.html +131 -0
  27. package/coverage/lcov-report/main/index.ts.html +1213 -0
  28. package/coverage/lcov-report/main/modules/Network/beaconProxy.ts.html +391 -0
  29. package/coverage/lcov-report/main/modules/Network/fetchProxy.ts.html +1027 -0
  30. package/coverage/lcov-report/main/modules/Network/index.html +191 -0
  31. package/coverage/lcov-report/main/modules/Network/index.ts.html +244 -0
  32. package/coverage/lcov-report/main/modules/Network/networkMessage.ts.html +385 -0
  33. package/coverage/lcov-report/main/modules/Network/utils.ts.html +700 -0
  34. package/coverage/lcov-report/main/modules/Network/xhrProxy.ts.html +850 -0
  35. package/coverage/lcov-report/main/modules/attributeSender.ts.html +232 -0
  36. package/coverage/lcov-report/main/modules/axiosSpy.ts.html +709 -0
  37. package/coverage/lcov-report/main/modules/connection.ts.html +160 -0
  38. package/coverage/lcov-report/main/modules/console.ts.html +541 -0
  39. package/coverage/lcov-report/main/modules/constructedStyleSheets.ts.html +559 -0
  40. package/coverage/lcov-report/main/modules/cssrules.ts.html +418 -0
  41. package/coverage/lcov-report/main/modules/exception.ts.html +385 -0
  42. package/coverage/lcov-report/main/modules/featureFlags.ts.html +412 -0
  43. package/coverage/lcov-report/main/modules/focus.ts.html +220 -0
  44. package/coverage/lcov-report/main/modules/fonts.ts.html +289 -0
  45. package/coverage/lcov-report/main/modules/img.ts.html +433 -0
  46. package/coverage/lcov-report/main/modules/index.html +401 -0
  47. package/coverage/lcov-report/main/modules/input.ts.html +826 -0
  48. package/coverage/lcov-report/main/modules/mouse.ts.html +826 -0
  49. package/coverage/lcov-report/main/modules/network.ts.html +1123 -0
  50. package/coverage/lcov-report/main/modules/performance.ts.html +367 -0
  51. package/coverage/lcov-report/main/modules/scroll.ts.html +364 -0
  52. package/coverage/lcov-report/main/modules/selection.ts.html +202 -0
  53. package/coverage/lcov-report/main/modules/tabs.ts.html +124 -0
  54. package/coverage/lcov-report/main/modules/timing.ts.html +841 -0
  55. package/coverage/lcov-report/main/modules/userTesting/dnd.ts.html +232 -0
  56. package/coverage/lcov-report/main/modules/userTesting/index.html +161 -0
  57. package/coverage/lcov-report/main/modules/userTesting/index.ts.html +1210 -0
  58. package/coverage/lcov-report/main/modules/userTesting/recorder.ts.html +361 -0
  59. package/coverage/lcov-report/main/modules/userTesting/styles.ts.html +865 -0
  60. package/coverage/lcov-report/main/modules/viewport.ts.html +250 -0
  61. package/coverage/lcov-report/main/utils.ts.html +406 -0
  62. package/coverage/lcov-report/prettify.css +1 -0
  63. package/coverage/lcov-report/prettify.js +2 -0
  64. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  65. package/coverage/lcov-report/sorter.js +196 -0
  66. package/coverage/lcov-report/webworker/BatchWriter.ts.html +481 -0
  67. package/coverage/lcov-report/webworker/MessageEncoder.gen.ts.html +961 -0
  68. package/coverage/lcov-report/webworker/PrimitiveEncoder.ts.html +436 -0
  69. package/coverage/lcov-report/webworker/QueueSender.ts.html +505 -0
  70. package/coverage/lcov-report/webworker/index.html +176 -0
  71. package/coverage/lcov-report/webworker/index.ts.html +628 -0
  72. package/coverage/lcov.info +6631 -0
  73. package/lib/app/index.js +1 -1
  74. package/lib/index.js +1 -1
  75. package/lib/modules/timing.d.ts +1 -0
  76. package/lib/modules/timing.js +7 -0
  77. package/package.json +1 -1
@@ -0,0 +1,2182 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for main/app/index.ts</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../prettify.css" />
9
+ <link rel="stylesheet" href="../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../index.html">All files</a> / <a href="index.html">main/app</a> index.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">0% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>0/283</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">0% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>0/159</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">0% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>0/56</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">0% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>0/272</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input oninput="onInput()" type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line low'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
466
+ <a name='L401'></a><a href='#L401'>401</a>
467
+ <a name='L402'></a><a href='#L402'>402</a>
468
+ <a name='L403'></a><a href='#L403'>403</a>
469
+ <a name='L404'></a><a href='#L404'>404</a>
470
+ <a name='L405'></a><a href='#L405'>405</a>
471
+ <a name='L406'></a><a href='#L406'>406</a>
472
+ <a name='L407'></a><a href='#L407'>407</a>
473
+ <a name='L408'></a><a href='#L408'>408</a>
474
+ <a name='L409'></a><a href='#L409'>409</a>
475
+ <a name='L410'></a><a href='#L410'>410</a>
476
+ <a name='L411'></a><a href='#L411'>411</a>
477
+ <a name='L412'></a><a href='#L412'>412</a>
478
+ <a name='L413'></a><a href='#L413'>413</a>
479
+ <a name='L414'></a><a href='#L414'>414</a>
480
+ <a name='L415'></a><a href='#L415'>415</a>
481
+ <a name='L416'></a><a href='#L416'>416</a>
482
+ <a name='L417'></a><a href='#L417'>417</a>
483
+ <a name='L418'></a><a href='#L418'>418</a>
484
+ <a name='L419'></a><a href='#L419'>419</a>
485
+ <a name='L420'></a><a href='#L420'>420</a>
486
+ <a name='L421'></a><a href='#L421'>421</a>
487
+ <a name='L422'></a><a href='#L422'>422</a>
488
+ <a name='L423'></a><a href='#L423'>423</a>
489
+ <a name='L424'></a><a href='#L424'>424</a>
490
+ <a name='L425'></a><a href='#L425'>425</a>
491
+ <a name='L426'></a><a href='#L426'>426</a>
492
+ <a name='L427'></a><a href='#L427'>427</a>
493
+ <a name='L428'></a><a href='#L428'>428</a>
494
+ <a name='L429'></a><a href='#L429'>429</a>
495
+ <a name='L430'></a><a href='#L430'>430</a>
496
+ <a name='L431'></a><a href='#L431'>431</a>
497
+ <a name='L432'></a><a href='#L432'>432</a>
498
+ <a name='L433'></a><a href='#L433'>433</a>
499
+ <a name='L434'></a><a href='#L434'>434</a>
500
+ <a name='L435'></a><a href='#L435'>435</a>
501
+ <a name='L436'></a><a href='#L436'>436</a>
502
+ <a name='L437'></a><a href='#L437'>437</a>
503
+ <a name='L438'></a><a href='#L438'>438</a>
504
+ <a name='L439'></a><a href='#L439'>439</a>
505
+ <a name='L440'></a><a href='#L440'>440</a>
506
+ <a name='L441'></a><a href='#L441'>441</a>
507
+ <a name='L442'></a><a href='#L442'>442</a>
508
+ <a name='L443'></a><a href='#L443'>443</a>
509
+ <a name='L444'></a><a href='#L444'>444</a>
510
+ <a name='L445'></a><a href='#L445'>445</a>
511
+ <a name='L446'></a><a href='#L446'>446</a>
512
+ <a name='L447'></a><a href='#L447'>447</a>
513
+ <a name='L448'></a><a href='#L448'>448</a>
514
+ <a name='L449'></a><a href='#L449'>449</a>
515
+ <a name='L450'></a><a href='#L450'>450</a>
516
+ <a name='L451'></a><a href='#L451'>451</a>
517
+ <a name='L452'></a><a href='#L452'>452</a>
518
+ <a name='L453'></a><a href='#L453'>453</a>
519
+ <a name='L454'></a><a href='#L454'>454</a>
520
+ <a name='L455'></a><a href='#L455'>455</a>
521
+ <a name='L456'></a><a href='#L456'>456</a>
522
+ <a name='L457'></a><a href='#L457'>457</a>
523
+ <a name='L458'></a><a href='#L458'>458</a>
524
+ <a name='L459'></a><a href='#L459'>459</a>
525
+ <a name='L460'></a><a href='#L460'>460</a>
526
+ <a name='L461'></a><a href='#L461'>461</a>
527
+ <a name='L462'></a><a href='#L462'>462</a>
528
+ <a name='L463'></a><a href='#L463'>463</a>
529
+ <a name='L464'></a><a href='#L464'>464</a>
530
+ <a name='L465'></a><a href='#L465'>465</a>
531
+ <a name='L466'></a><a href='#L466'>466</a>
532
+ <a name='L467'></a><a href='#L467'>467</a>
533
+ <a name='L468'></a><a href='#L468'>468</a>
534
+ <a name='L469'></a><a href='#L469'>469</a>
535
+ <a name='L470'></a><a href='#L470'>470</a>
536
+ <a name='L471'></a><a href='#L471'>471</a>
537
+ <a name='L472'></a><a href='#L472'>472</a>
538
+ <a name='L473'></a><a href='#L473'>473</a>
539
+ <a name='L474'></a><a href='#L474'>474</a>
540
+ <a name='L475'></a><a href='#L475'>475</a>
541
+ <a name='L476'></a><a href='#L476'>476</a>
542
+ <a name='L477'></a><a href='#L477'>477</a>
543
+ <a name='L478'></a><a href='#L478'>478</a>
544
+ <a name='L479'></a><a href='#L479'>479</a>
545
+ <a name='L480'></a><a href='#L480'>480</a>
546
+ <a name='L481'></a><a href='#L481'>481</a>
547
+ <a name='L482'></a><a href='#L482'>482</a>
548
+ <a name='L483'></a><a href='#L483'>483</a>
549
+ <a name='L484'></a><a href='#L484'>484</a>
550
+ <a name='L485'></a><a href='#L485'>485</a>
551
+ <a name='L486'></a><a href='#L486'>486</a>
552
+ <a name='L487'></a><a href='#L487'>487</a>
553
+ <a name='L488'></a><a href='#L488'>488</a>
554
+ <a name='L489'></a><a href='#L489'>489</a>
555
+ <a name='L490'></a><a href='#L490'>490</a>
556
+ <a name='L491'></a><a href='#L491'>491</a>
557
+ <a name='L492'></a><a href='#L492'>492</a>
558
+ <a name='L493'></a><a href='#L493'>493</a>
559
+ <a name='L494'></a><a href='#L494'>494</a>
560
+ <a name='L495'></a><a href='#L495'>495</a>
561
+ <a name='L496'></a><a href='#L496'>496</a>
562
+ <a name='L497'></a><a href='#L497'>497</a>
563
+ <a name='L498'></a><a href='#L498'>498</a>
564
+ <a name='L499'></a><a href='#L499'>499</a>
565
+ <a name='L500'></a><a href='#L500'>500</a>
566
+ <a name='L501'></a><a href='#L501'>501</a>
567
+ <a name='L502'></a><a href='#L502'>502</a>
568
+ <a name='L503'></a><a href='#L503'>503</a>
569
+ <a name='L504'></a><a href='#L504'>504</a>
570
+ <a name='L505'></a><a href='#L505'>505</a>
571
+ <a name='L506'></a><a href='#L506'>506</a>
572
+ <a name='L507'></a><a href='#L507'>507</a>
573
+ <a name='L508'></a><a href='#L508'>508</a>
574
+ <a name='L509'></a><a href='#L509'>509</a>
575
+ <a name='L510'></a><a href='#L510'>510</a>
576
+ <a name='L511'></a><a href='#L511'>511</a>
577
+ <a name='L512'></a><a href='#L512'>512</a>
578
+ <a name='L513'></a><a href='#L513'>513</a>
579
+ <a name='L514'></a><a href='#L514'>514</a>
580
+ <a name='L515'></a><a href='#L515'>515</a>
581
+ <a name='L516'></a><a href='#L516'>516</a>
582
+ <a name='L517'></a><a href='#L517'>517</a>
583
+ <a name='L518'></a><a href='#L518'>518</a>
584
+ <a name='L519'></a><a href='#L519'>519</a>
585
+ <a name='L520'></a><a href='#L520'>520</a>
586
+ <a name='L521'></a><a href='#L521'>521</a>
587
+ <a name='L522'></a><a href='#L522'>522</a>
588
+ <a name='L523'></a><a href='#L523'>523</a>
589
+ <a name='L524'></a><a href='#L524'>524</a>
590
+ <a name='L525'></a><a href='#L525'>525</a>
591
+ <a name='L526'></a><a href='#L526'>526</a>
592
+ <a name='L527'></a><a href='#L527'>527</a>
593
+ <a name='L528'></a><a href='#L528'>528</a>
594
+ <a name='L529'></a><a href='#L529'>529</a>
595
+ <a name='L530'></a><a href='#L530'>530</a>
596
+ <a name='L531'></a><a href='#L531'>531</a>
597
+ <a name='L532'></a><a href='#L532'>532</a>
598
+ <a name='L533'></a><a href='#L533'>533</a>
599
+ <a name='L534'></a><a href='#L534'>534</a>
600
+ <a name='L535'></a><a href='#L535'>535</a>
601
+ <a name='L536'></a><a href='#L536'>536</a>
602
+ <a name='L537'></a><a href='#L537'>537</a>
603
+ <a name='L538'></a><a href='#L538'>538</a>
604
+ <a name='L539'></a><a href='#L539'>539</a>
605
+ <a name='L540'></a><a href='#L540'>540</a>
606
+ <a name='L541'></a><a href='#L541'>541</a>
607
+ <a name='L542'></a><a href='#L542'>542</a>
608
+ <a name='L543'></a><a href='#L543'>543</a>
609
+ <a name='L544'></a><a href='#L544'>544</a>
610
+ <a name='L545'></a><a href='#L545'>545</a>
611
+ <a name='L546'></a><a href='#L546'>546</a>
612
+ <a name='L547'></a><a href='#L547'>547</a>
613
+ <a name='L548'></a><a href='#L548'>548</a>
614
+ <a name='L549'></a><a href='#L549'>549</a>
615
+ <a name='L550'></a><a href='#L550'>550</a>
616
+ <a name='L551'></a><a href='#L551'>551</a>
617
+ <a name='L552'></a><a href='#L552'>552</a>
618
+ <a name='L553'></a><a href='#L553'>553</a>
619
+ <a name='L554'></a><a href='#L554'>554</a>
620
+ <a name='L555'></a><a href='#L555'>555</a>
621
+ <a name='L556'></a><a href='#L556'>556</a>
622
+ <a name='L557'></a><a href='#L557'>557</a>
623
+ <a name='L558'></a><a href='#L558'>558</a>
624
+ <a name='L559'></a><a href='#L559'>559</a>
625
+ <a name='L560'></a><a href='#L560'>560</a>
626
+ <a name='L561'></a><a href='#L561'>561</a>
627
+ <a name='L562'></a><a href='#L562'>562</a>
628
+ <a name='L563'></a><a href='#L563'>563</a>
629
+ <a name='L564'></a><a href='#L564'>564</a>
630
+ <a name='L565'></a><a href='#L565'>565</a>
631
+ <a name='L566'></a><a href='#L566'>566</a>
632
+ <a name='L567'></a><a href='#L567'>567</a>
633
+ <a name='L568'></a><a href='#L568'>568</a>
634
+ <a name='L569'></a><a href='#L569'>569</a>
635
+ <a name='L570'></a><a href='#L570'>570</a>
636
+ <a name='L571'></a><a href='#L571'>571</a>
637
+ <a name='L572'></a><a href='#L572'>572</a>
638
+ <a name='L573'></a><a href='#L573'>573</a>
639
+ <a name='L574'></a><a href='#L574'>574</a>
640
+ <a name='L575'></a><a href='#L575'>575</a>
641
+ <a name='L576'></a><a href='#L576'>576</a>
642
+ <a name='L577'></a><a href='#L577'>577</a>
643
+ <a name='L578'></a><a href='#L578'>578</a>
644
+ <a name='L579'></a><a href='#L579'>579</a>
645
+ <a name='L580'></a><a href='#L580'>580</a>
646
+ <a name='L581'></a><a href='#L581'>581</a>
647
+ <a name='L582'></a><a href='#L582'>582</a>
648
+ <a name='L583'></a><a href='#L583'>583</a>
649
+ <a name='L584'></a><a href='#L584'>584</a>
650
+ <a name='L585'></a><a href='#L585'>585</a>
651
+ <a name='L586'></a><a href='#L586'>586</a>
652
+ <a name='L587'></a><a href='#L587'>587</a>
653
+ <a name='L588'></a><a href='#L588'>588</a>
654
+ <a name='L589'></a><a href='#L589'>589</a>
655
+ <a name='L590'></a><a href='#L590'>590</a>
656
+ <a name='L591'></a><a href='#L591'>591</a>
657
+ <a name='L592'></a><a href='#L592'>592</a>
658
+ <a name='L593'></a><a href='#L593'>593</a>
659
+ <a name='L594'></a><a href='#L594'>594</a>
660
+ <a name='L595'></a><a href='#L595'>595</a>
661
+ <a name='L596'></a><a href='#L596'>596</a>
662
+ <a name='L597'></a><a href='#L597'>597</a>
663
+ <a name='L598'></a><a href='#L598'>598</a>
664
+ <a name='L599'></a><a href='#L599'>599</a>
665
+ <a name='L600'></a><a href='#L600'>600</a>
666
+ <a name='L601'></a><a href='#L601'>601</a>
667
+ <a name='L602'></a><a href='#L602'>602</a>
668
+ <a name='L603'></a><a href='#L603'>603</a>
669
+ <a name='L604'></a><a href='#L604'>604</a>
670
+ <a name='L605'></a><a href='#L605'>605</a>
671
+ <a name='L606'></a><a href='#L606'>606</a>
672
+ <a name='L607'></a><a href='#L607'>607</a>
673
+ <a name='L608'></a><a href='#L608'>608</a>
674
+ <a name='L609'></a><a href='#L609'>609</a>
675
+ <a name='L610'></a><a href='#L610'>610</a>
676
+ <a name='L611'></a><a href='#L611'>611</a>
677
+ <a name='L612'></a><a href='#L612'>612</a>
678
+ <a name='L613'></a><a href='#L613'>613</a>
679
+ <a name='L614'></a><a href='#L614'>614</a>
680
+ <a name='L615'></a><a href='#L615'>615</a>
681
+ <a name='L616'></a><a href='#L616'>616</a>
682
+ <a name='L617'></a><a href='#L617'>617</a>
683
+ <a name='L618'></a><a href='#L618'>618</a>
684
+ <a name='L619'></a><a href='#L619'>619</a>
685
+ <a name='L620'></a><a href='#L620'>620</a>
686
+ <a name='L621'></a><a href='#L621'>621</a>
687
+ <a name='L622'></a><a href='#L622'>622</a>
688
+ <a name='L623'></a><a href='#L623'>623</a>
689
+ <a name='L624'></a><a href='#L624'>624</a>
690
+ <a name='L625'></a><a href='#L625'>625</a>
691
+ <a name='L626'></a><a href='#L626'>626</a>
692
+ <a name='L627'></a><a href='#L627'>627</a>
693
+ <a name='L628'></a><a href='#L628'>628</a>
694
+ <a name='L629'></a><a href='#L629'>629</a>
695
+ <a name='L630'></a><a href='#L630'>630</a>
696
+ <a name='L631'></a><a href='#L631'>631</a>
697
+ <a name='L632'></a><a href='#L632'>632</a>
698
+ <a name='L633'></a><a href='#L633'>633</a>
699
+ <a name='L634'></a><a href='#L634'>634</a>
700
+ <a name='L635'></a><a href='#L635'>635</a>
701
+ <a name='L636'></a><a href='#L636'>636</a>
702
+ <a name='L637'></a><a href='#L637'>637</a>
703
+ <a name='L638'></a><a href='#L638'>638</a>
704
+ <a name='L639'></a><a href='#L639'>639</a>
705
+ <a name='L640'></a><a href='#L640'>640</a>
706
+ <a name='L641'></a><a href='#L641'>641</a>
707
+ <a name='L642'></a><a href='#L642'>642</a>
708
+ <a name='L643'></a><a href='#L643'>643</a>
709
+ <a name='L644'></a><a href='#L644'>644</a>
710
+ <a name='L645'></a><a href='#L645'>645</a>
711
+ <a name='L646'></a><a href='#L646'>646</a>
712
+ <a name='L647'></a><a href='#L647'>647</a>
713
+ <a name='L648'></a><a href='#L648'>648</a>
714
+ <a name='L649'></a><a href='#L649'>649</a>
715
+ <a name='L650'></a><a href='#L650'>650</a>
716
+ <a name='L651'></a><a href='#L651'>651</a>
717
+ <a name='L652'></a><a href='#L652'>652</a>
718
+ <a name='L653'></a><a href='#L653'>653</a>
719
+ <a name='L654'></a><a href='#L654'>654</a>
720
+ <a name='L655'></a><a href='#L655'>655</a>
721
+ <a name='L656'></a><a href='#L656'>656</a>
722
+ <a name='L657'></a><a href='#L657'>657</a>
723
+ <a name='L658'></a><a href='#L658'>658</a>
724
+ <a name='L659'></a><a href='#L659'>659</a>
725
+ <a name='L660'></a><a href='#L660'>660</a>
726
+ <a name='L661'></a><a href='#L661'>661</a>
727
+ <a name='L662'></a><a href='#L662'>662</a>
728
+ <a name='L663'></a><a href='#L663'>663</a>
729
+ <a name='L664'></a><a href='#L664'>664</a>
730
+ <a name='L665'></a><a href='#L665'>665</a>
731
+ <a name='L666'></a><a href='#L666'>666</a>
732
+ <a name='L667'></a><a href='#L667'>667</a>
733
+ <a name='L668'></a><a href='#L668'>668</a>
734
+ <a name='L669'></a><a href='#L669'>669</a>
735
+ <a name='L670'></a><a href='#L670'>670</a>
736
+ <a name='L671'></a><a href='#L671'>671</a>
737
+ <a name='L672'></a><a href='#L672'>672</a>
738
+ <a name='L673'></a><a href='#L673'>673</a>
739
+ <a name='L674'></a><a href='#L674'>674</a>
740
+ <a name='L675'></a><a href='#L675'>675</a>
741
+ <a name='L676'></a><a href='#L676'>676</a>
742
+ <a name='L677'></a><a href='#L677'>677</a>
743
+ <a name='L678'></a><a href='#L678'>678</a>
744
+ <a name='L679'></a><a href='#L679'>679</a>
745
+ <a name='L680'></a><a href='#L680'>680</a>
746
+ <a name='L681'></a><a href='#L681'>681</a>
747
+ <a name='L682'></a><a href='#L682'>682</a>
748
+ <a name='L683'></a><a href='#L683'>683</a>
749
+ <a name='L684'></a><a href='#L684'>684</a>
750
+ <a name='L685'></a><a href='#L685'>685</a>
751
+ <a name='L686'></a><a href='#L686'>686</a>
752
+ <a name='L687'></a><a href='#L687'>687</a>
753
+ <a name='L688'></a><a href='#L688'>688</a>
754
+ <a name='L689'></a><a href='#L689'>689</a>
755
+ <a name='L690'></a><a href='#L690'>690</a>
756
+ <a name='L691'></a><a href='#L691'>691</a>
757
+ <a name='L692'></a><a href='#L692'>692</a>
758
+ <a name='L693'></a><a href='#L693'>693</a>
759
+ <a name='L694'></a><a href='#L694'>694</a>
760
+ <a name='L695'></a><a href='#L695'>695</a>
761
+ <a name='L696'></a><a href='#L696'>696</a>
762
+ <a name='L697'></a><a href='#L697'>697</a>
763
+ <a name='L698'></a><a href='#L698'>698</a>
764
+ <a name='L699'></a><a href='#L699'>699</a>
765
+ <a name='L700'></a><a href='#L700'>700</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
766
+ <span class="cline-any cline-no">&nbsp;</span>
767
+ <span class="cline-any cline-no">&nbsp;</span>
768
+ <span class="cline-any cline-no">&nbsp;</span>
769
+ <span class="cline-any cline-no">&nbsp;</span>
770
+ <span class="cline-any cline-no">&nbsp;</span>
771
+ <span class="cline-any cline-no">&nbsp;</span>
772
+ <span class="cline-any cline-no">&nbsp;</span>
773
+ <span class="cline-any cline-no">&nbsp;</span>
774
+ <span class="cline-any cline-no">&nbsp;</span>
775
+ <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
798
+ <span class="cline-any cline-neutral">&nbsp;</span>
799
+ <span class="cline-any cline-neutral">&nbsp;</span>
800
+ <span class="cline-any cline-neutral">&nbsp;</span>
801
+ <span class="cline-any cline-neutral">&nbsp;</span>
802
+ <span class="cline-any cline-neutral">&nbsp;</span>
803
+ <span class="cline-any cline-neutral">&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-no">&nbsp;</span>
808
+ <span class="cline-any cline-neutral">&nbsp;</span>
809
+ <span class="cline-any cline-neutral">&nbsp;</span>
810
+ <span class="cline-any cline-neutral">&nbsp;</span>
811
+ <span class="cline-any cline-neutral">&nbsp;</span>
812
+ <span class="cline-any cline-neutral">&nbsp;</span>
813
+ <span class="cline-any cline-neutral">&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-no">&nbsp;</span>
820
+ <span class="cline-any cline-no">&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-no">&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-neutral">&nbsp;</span>
850
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
854
+ <span class="cline-any cline-neutral">&nbsp;</span>
855
+ <span class="cline-any cline-neutral">&nbsp;</span>
856
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
860
+ <span class="cline-any cline-no">&nbsp;</span>
861
+ <span class="cline-any cline-neutral">&nbsp;</span>
862
+ <span class="cline-any cline-neutral">&nbsp;</span>
863
+ <span class="cline-any cline-no">&nbsp;</span>
864
+ <span class="cline-any cline-no">&nbsp;</span>
865
+ <span class="cline-any cline-no">&nbsp;</span>
866
+ <span class="cline-any cline-no">&nbsp;</span>
867
+ <span class="cline-any cline-no">&nbsp;</span>
868
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
872
+ <span class="cline-any cline-neutral">&nbsp;</span>
873
+ <span class="cline-any cline-neutral">&nbsp;</span>
874
+ <span class="cline-any cline-neutral">&nbsp;</span>
875
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
879
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
888
+ <span class="cline-any cline-no">&nbsp;</span>
889
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
893
+ <span class="cline-any cline-no">&nbsp;</span>
894
+ <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
902
+ <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
908
+ <span class="cline-any cline-neutral">&nbsp;</span>
909
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
914
+ <span class="cline-any cline-neutral">&nbsp;</span>
915
+ <span class="cline-any cline-neutral">&nbsp;</span>
916
+ <span class="cline-any cline-neutral">&nbsp;</span>
917
+ <span class="cline-any cline-neutral">&nbsp;</span>
918
+ <span class="cline-any cline-neutral">&nbsp;</span>
919
+ <span class="cline-any cline-neutral">&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-no">&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-no">&nbsp;</span>
931
+ <span class="cline-any cline-no">&nbsp;</span>
932
+ <span class="cline-any cline-no">&nbsp;</span>
933
+ <span class="cline-any cline-no">&nbsp;</span>
934
+ <span class="cline-any cline-no">&nbsp;</span>
935
+ <span class="cline-any cline-no">&nbsp;</span>
936
+ <span class="cline-any cline-no">&nbsp;</span>
937
+ <span class="cline-any cline-no">&nbsp;</span>
938
+ <span class="cline-any cline-no">&nbsp;</span>
939
+ <span class="cline-any cline-no">&nbsp;</span>
940
+ <span class="cline-any cline-no">&nbsp;</span>
941
+ <span class="cline-any cline-no">&nbsp;</span>
942
+ <span class="cline-any cline-no">&nbsp;</span>
943
+ <span class="cline-any cline-no">&nbsp;</span>
944
+ <span class="cline-any cline-neutral">&nbsp;</span>
945
+ <span class="cline-any cline-no">&nbsp;</span>
946
+ <span class="cline-any cline-neutral">&nbsp;</span>
947
+ <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
952
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
961
+ <span class="cline-any cline-no">&nbsp;</span>
962
+ <span class="cline-any cline-no">&nbsp;</span>
963
+ <span class="cline-any cline-neutral">&nbsp;</span>
964
+ <span class="cline-any cline-no">&nbsp;</span>
965
+ <span class="cline-any cline-no">&nbsp;</span>
966
+ <span class="cline-any cline-no">&nbsp;</span>
967
+ <span class="cline-any cline-no">&nbsp;</span>
968
+ <span class="cline-any cline-no">&nbsp;</span>
969
+ <span class="cline-any cline-no">&nbsp;</span>
970
+ <span class="cline-any cline-no">&nbsp;</span>
971
+ <span class="cline-any cline-no">&nbsp;</span>
972
+ <span class="cline-any cline-no">&nbsp;</span>
973
+ <span class="cline-any cline-no">&nbsp;</span>
974
+ <span class="cline-any cline-no">&nbsp;</span>
975
+ <span class="cline-any cline-no">&nbsp;</span>
976
+ <span class="cline-any cline-no">&nbsp;</span>
977
+ <span class="cline-any cline-no">&nbsp;</span>
978
+ <span class="cline-any cline-no">&nbsp;</span>
979
+ <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
985
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
989
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
993
+ <span class="cline-any cline-neutral">&nbsp;</span>
994
+ <span class="cline-any cline-no">&nbsp;</span>
995
+ <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
999
+ <span class="cline-any cline-neutral">&nbsp;</span>
1000
+ <span class="cline-any cline-no">&nbsp;</span>
1001
+ <span class="cline-any cline-no">&nbsp;</span>
1002
+ <span class="cline-any cline-neutral">&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-no">&nbsp;</span>
1006
+ <span class="cline-any cline-neutral">&nbsp;</span>
1007
+ <span class="cline-any cline-neutral">&nbsp;</span>
1008
+ <span class="cline-any cline-no">&nbsp;</span>
1009
+ <span class="cline-any cline-neutral">&nbsp;</span>
1010
+ <span class="cline-any cline-no">&nbsp;</span>
1011
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
1019
+ <span class="cline-any cline-no">&nbsp;</span>
1020
+ <span class="cline-any cline-neutral">&nbsp;</span>
1021
+ <span class="cline-any cline-no">&nbsp;</span>
1022
+ <span class="cline-any cline-no">&nbsp;</span>
1023
+ <span class="cline-any cline-no">&nbsp;</span>
1024
+ <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
1034
+ <span class="cline-any cline-neutral">&nbsp;</span>
1035
+ <span class="cline-any cline-neutral">&nbsp;</span>
1036
+ <span class="cline-any cline-no">&nbsp;</span>
1037
+ <span class="cline-any cline-no">&nbsp;</span>
1038
+ <span class="cline-any cline-neutral">&nbsp;</span>
1039
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
1046
+ <span class="cline-any cline-neutral">&nbsp;</span>
1047
+ <span class="cline-any cline-no">&nbsp;</span>
1048
+ <span class="cline-any cline-neutral">&nbsp;</span>
1049
+ <span class="cline-any cline-neutral">&nbsp;</span>
1050
+ <span class="cline-any cline-no">&nbsp;</span>
1051
+ <span class="cline-any cline-neutral">&nbsp;</span>
1052
+ <span class="cline-any cline-no">&nbsp;</span>
1053
+ <span class="cline-any cline-no">&nbsp;</span>
1054
+ <span class="cline-any cline-neutral">&nbsp;</span>
1055
+ <span class="cline-any cline-neutral">&nbsp;</span>
1056
+ <span class="cline-any cline-no">&nbsp;</span>
1057
+ <span class="cline-any cline-no">&nbsp;</span>
1058
+ <span class="cline-any cline-no">&nbsp;</span>
1059
+ <span class="cline-any cline-no">&nbsp;</span>
1060
+ <span class="cline-any cline-neutral">&nbsp;</span>
1061
+ <span class="cline-any cline-no">&nbsp;</span>
1062
+ <span class="cline-any cline-no">&nbsp;</span>
1063
+ <span class="cline-any cline-neutral">&nbsp;</span>
1064
+ <span class="cline-any cline-neutral">&nbsp;</span>
1065
+ <span class="cline-any cline-neutral">&nbsp;</span>
1066
+ <span class="cline-any cline-no">&nbsp;</span>
1067
+ <span class="cline-any cline-neutral">&nbsp;</span>
1068
+ <span class="cline-any cline-neutral">&nbsp;</span>
1069
+ <span class="cline-any cline-neutral">&nbsp;</span>
1070
+ <span class="cline-any cline-neutral">&nbsp;</span>
1071
+ <span class="cline-any cline-neutral">&nbsp;</span>
1072
+ <span class="cline-any cline-no">&nbsp;</span>
1073
+ <span class="cline-any cline-no">&nbsp;</span>
1074
+ <span class="cline-any cline-neutral">&nbsp;</span>
1075
+ <span class="cline-any cline-neutral">&nbsp;</span>
1076
+ <span class="cline-any cline-neutral">&nbsp;</span>
1077
+ <span class="cline-any cline-no">&nbsp;</span>
1078
+ <span class="cline-any cline-no">&nbsp;</span>
1079
+ <span class="cline-any cline-no">&nbsp;</span>
1080
+ <span class="cline-any cline-no">&nbsp;</span>
1081
+ <span class="cline-any cline-no">&nbsp;</span>
1082
+ <span class="cline-any cline-no">&nbsp;</span>
1083
+ <span class="cline-any cline-neutral">&nbsp;</span>
1084
+ <span class="cline-any cline-neutral">&nbsp;</span>
1085
+ <span class="cline-any cline-neutral">&nbsp;</span>
1086
+ <span class="cline-any cline-no">&nbsp;</span>
1087
+ <span class="cline-any cline-neutral">&nbsp;</span>
1088
+ <span class="cline-any cline-no">&nbsp;</span>
1089
+ <span class="cline-any cline-neutral">&nbsp;</span>
1090
+ <span class="cline-any cline-neutral">&nbsp;</span>
1091
+ <span class="cline-any cline-neutral">&nbsp;</span>
1092
+ <span class="cline-any cline-no">&nbsp;</span>
1093
+ <span class="cline-any cline-no">&nbsp;</span>
1094
+ <span class="cline-any cline-no">&nbsp;</span>
1095
+ <span class="cline-any cline-no">&nbsp;</span>
1096
+ <span class="cline-any cline-neutral">&nbsp;</span>
1097
+ <span class="cline-any cline-no">&nbsp;</span>
1098
+ <span class="cline-any cline-neutral">&nbsp;</span>
1099
+ <span class="cline-any cline-neutral">&nbsp;</span>
1100
+ <span class="cline-any cline-neutral">&nbsp;</span>
1101
+ <span class="cline-any cline-neutral">&nbsp;</span>
1102
+ <span class="cline-any cline-neutral">&nbsp;</span>
1103
+ <span class="cline-any cline-neutral">&nbsp;</span>
1104
+ <span class="cline-any cline-neutral">&nbsp;</span>
1105
+ <span class="cline-any cline-neutral">&nbsp;</span>
1106
+ <span class="cline-any cline-neutral">&nbsp;</span>
1107
+ <span class="cline-any cline-no">&nbsp;</span>
1108
+ <span class="cline-any cline-neutral">&nbsp;</span>
1109
+ <span class="cline-any cline-neutral">&nbsp;</span>
1110
+ <span class="cline-any cline-no">&nbsp;</span>
1111
+ <span class="cline-any cline-no">&nbsp;</span>
1112
+ <span class="cline-any cline-neutral">&nbsp;</span>
1113
+ <span class="cline-any cline-no">&nbsp;</span>
1114
+ <span class="cline-any cline-neutral">&nbsp;</span>
1115
+ <span class="cline-any cline-neutral">&nbsp;</span>
1116
+ <span class="cline-any cline-no">&nbsp;</span>
1117
+ <span class="cline-any cline-no">&nbsp;</span>
1118
+ <span class="cline-any cline-neutral">&nbsp;</span>
1119
+ <span class="cline-any cline-no">&nbsp;</span>
1120
+ <span class="cline-any cline-neutral">&nbsp;</span>
1121
+ <span class="cline-any cline-neutral">&nbsp;</span>
1122
+ <span class="cline-any cline-neutral">&nbsp;</span>
1123
+ <span class="cline-any cline-neutral">&nbsp;</span>
1124
+ <span class="cline-any cline-neutral">&nbsp;</span>
1125
+ <span class="cline-any cline-neutral">&nbsp;</span>
1126
+ <span class="cline-any cline-neutral">&nbsp;</span>
1127
+ <span class="cline-any cline-neutral">&nbsp;</span>
1128
+ <span class="cline-any cline-neutral">&nbsp;</span>
1129
+ <span class="cline-any cline-no">&nbsp;</span>
1130
+ <span class="cline-any cline-no">&nbsp;</span>
1131
+ <span class="cline-any cline-neutral">&nbsp;</span>
1132
+ <span class="cline-any cline-no">&nbsp;</span>
1133
+ <span class="cline-any cline-no">&nbsp;</span>
1134
+ <span class="cline-any cline-neutral">&nbsp;</span>
1135
+ <span class="cline-any cline-neutral">&nbsp;</span>
1136
+ <span class="cline-any cline-neutral">&nbsp;</span>
1137
+ <span class="cline-any cline-neutral">&nbsp;</span>
1138
+ <span class="cline-any cline-no">&nbsp;</span>
1139
+ <span class="cline-any cline-no">&nbsp;</span>
1140
+ <span class="cline-any cline-no">&nbsp;</span>
1141
+ <span class="cline-any cline-no">&nbsp;</span>
1142
+ <span class="cline-any cline-no">&nbsp;</span>
1143
+ <span class="cline-any cline-neutral">&nbsp;</span>
1144
+ <span class="cline-any cline-no">&nbsp;</span>
1145
+ <span class="cline-any cline-no">&nbsp;</span>
1146
+ <span class="cline-any cline-neutral">&nbsp;</span>
1147
+ <span class="cline-any cline-no">&nbsp;</span>
1148
+ <span class="cline-any cline-no">&nbsp;</span>
1149
+ <span class="cline-any cline-neutral">&nbsp;</span>
1150
+ <span class="cline-any cline-neutral">&nbsp;</span>
1151
+ <span class="cline-any cline-no">&nbsp;</span>
1152
+ <span class="cline-any cline-neutral">&nbsp;</span>
1153
+ <span class="cline-any cline-neutral">&nbsp;</span>
1154
+ <span class="cline-any cline-neutral">&nbsp;</span>
1155
+ <span class="cline-any cline-no">&nbsp;</span>
1156
+ <span class="cline-any cline-neutral">&nbsp;</span>
1157
+ <span class="cline-any cline-neutral">&nbsp;</span>
1158
+ <span class="cline-any cline-neutral">&nbsp;</span>
1159
+ <span class="cline-any cline-neutral">&nbsp;</span>
1160
+ <span class="cline-any cline-neutral">&nbsp;</span>
1161
+ <span class="cline-any cline-neutral">&nbsp;</span>
1162
+ <span class="cline-any cline-neutral">&nbsp;</span>
1163
+ <span class="cline-any cline-neutral">&nbsp;</span>
1164
+ <span class="cline-any cline-no">&nbsp;</span>
1165
+ <span class="cline-any cline-neutral">&nbsp;</span>
1166
+ <span class="cline-any cline-neutral">&nbsp;</span>
1167
+ <span class="cline-any cline-neutral">&nbsp;</span>
1168
+ <span class="cline-any cline-neutral">&nbsp;</span>
1169
+ <span class="cline-any cline-neutral">&nbsp;</span>
1170
+ <span class="cline-any cline-no">&nbsp;</span>
1171
+ <span class="cline-any cline-neutral">&nbsp;</span>
1172
+ <span class="cline-any cline-neutral">&nbsp;</span>
1173
+ <span class="cline-any cline-no">&nbsp;</span>
1174
+ <span class="cline-any cline-neutral">&nbsp;</span>
1175
+ <span class="cline-any cline-neutral">&nbsp;</span>
1176
+ <span class="cline-any cline-neutral">&nbsp;</span>
1177
+ <span class="cline-any cline-no">&nbsp;</span>
1178
+ <span class="cline-any cline-no">&nbsp;</span>
1179
+ <span class="cline-any cline-no">&nbsp;</span>
1180
+ <span class="cline-any cline-no">&nbsp;</span>
1181
+ <span class="cline-any cline-neutral">&nbsp;</span>
1182
+ <span class="cline-any cline-no">&nbsp;</span>
1183
+ <span class="cline-any cline-no">&nbsp;</span>
1184
+ <span class="cline-any cline-neutral">&nbsp;</span>
1185
+ <span class="cline-any cline-no">&nbsp;</span>
1186
+ <span class="cline-any cline-neutral">&nbsp;</span>
1187
+ <span class="cline-any cline-no">&nbsp;</span>
1188
+ <span class="cline-any cline-neutral">&nbsp;</span>
1189
+ <span class="cline-any cline-no">&nbsp;</span>
1190
+ <span class="cline-any cline-no">&nbsp;</span>
1191
+ <span class="cline-any cline-no">&nbsp;</span>
1192
+ <span class="cline-any cline-neutral">&nbsp;</span>
1193
+ <span class="cline-any cline-neutral">&nbsp;</span>
1194
+ <span class="cline-any cline-no">&nbsp;</span>
1195
+ <span class="cline-any cline-neutral">&nbsp;</span>
1196
+ <span class="cline-any cline-neutral">&nbsp;</span>
1197
+ <span class="cline-any cline-neutral">&nbsp;</span>
1198
+ <span class="cline-any cline-no">&nbsp;</span>
1199
+ <span class="cline-any cline-neutral">&nbsp;</span>
1200
+ <span class="cline-any cline-neutral">&nbsp;</span>
1201
+ <span class="cline-any cline-no">&nbsp;</span>
1202
+ <span class="cline-any cline-neutral">&nbsp;</span>
1203
+ <span class="cline-any cline-neutral">&nbsp;</span>
1204
+ <span class="cline-any cline-no">&nbsp;</span>
1205
+ <span class="cline-any cline-no">&nbsp;</span>
1206
+ <span class="cline-any cline-no">&nbsp;</span>
1207
+ <span class="cline-any cline-neutral">&nbsp;</span>
1208
+ <span class="cline-any cline-neutral">&nbsp;</span>
1209
+ <span class="cline-any cline-no">&nbsp;</span>
1210
+ <span class="cline-any cline-no">&nbsp;</span>
1211
+ <span class="cline-any cline-neutral">&nbsp;</span>
1212
+ <span class="cline-any cline-neutral">&nbsp;</span>
1213
+ <span class="cline-any cline-no">&nbsp;</span>
1214
+ <span class="cline-any cline-neutral">&nbsp;</span>
1215
+ <span class="cline-any cline-neutral">&nbsp;</span>
1216
+ <span class="cline-any cline-neutral">&nbsp;</span>
1217
+ <span class="cline-any cline-neutral">&nbsp;</span>
1218
+ <span class="cline-any cline-neutral">&nbsp;</span>
1219
+ <span class="cline-any cline-no">&nbsp;</span>
1220
+ <span class="cline-any cline-no">&nbsp;</span>
1221
+ <span class="cline-any cline-no">&nbsp;</span>
1222
+ <span class="cline-any cline-no">&nbsp;</span>
1223
+ <span class="cline-any cline-neutral">&nbsp;</span>
1224
+ <span class="cline-any cline-neutral">&nbsp;</span>
1225
+ <span class="cline-any cline-neutral">&nbsp;</span>
1226
+ <span class="cline-any cline-no">&nbsp;</span>
1227
+ <span class="cline-any cline-neutral">&nbsp;</span>
1228
+ <span class="cline-any cline-neutral">&nbsp;</span>
1229
+ <span class="cline-any cline-neutral">&nbsp;</span>
1230
+ <span class="cline-any cline-no">&nbsp;</span>
1231
+ <span class="cline-any cline-neutral">&nbsp;</span>
1232
+ <span class="cline-any cline-neutral">&nbsp;</span>
1233
+ <span class="cline-any cline-neutral">&nbsp;</span>
1234
+ <span class="cline-any cline-no">&nbsp;</span>
1235
+ <span class="cline-any cline-no">&nbsp;</span>
1236
+ <span class="cline-any cline-neutral">&nbsp;</span>
1237
+ <span class="cline-any cline-no">&nbsp;</span>
1238
+ <span class="cline-any cline-neutral">&nbsp;</span>
1239
+ <span class="cline-any cline-neutral">&nbsp;</span>
1240
+ <span class="cline-any cline-neutral">&nbsp;</span>
1241
+ <span class="cline-any cline-neutral">&nbsp;</span>
1242
+ <span class="cline-any cline-no">&nbsp;</span>
1243
+ <span class="cline-any cline-no">&nbsp;</span>
1244
+ <span class="cline-any cline-neutral">&nbsp;</span>
1245
+ <span class="cline-any cline-no">&nbsp;</span>
1246
+ <span class="cline-any cline-no">&nbsp;</span>
1247
+ <span class="cline-any cline-neutral">&nbsp;</span>
1248
+ <span class="cline-any cline-neutral">&nbsp;</span>
1249
+ <span class="cline-any cline-neutral">&nbsp;</span>
1250
+ <span class="cline-any cline-neutral">&nbsp;</span>
1251
+ <span class="cline-any cline-neutral">&nbsp;</span>
1252
+ <span class="cline-any cline-no">&nbsp;</span>
1253
+ <span class="cline-any cline-no">&nbsp;</span>
1254
+ <span class="cline-any cline-neutral">&nbsp;</span>
1255
+ <span class="cline-any cline-no">&nbsp;</span>
1256
+ <span class="cline-any cline-no">&nbsp;</span>
1257
+ <span class="cline-any cline-neutral">&nbsp;</span>
1258
+ <span class="cline-any cline-no">&nbsp;</span>
1259
+ <span class="cline-any cline-neutral">&nbsp;</span>
1260
+ <span class="cline-any cline-no">&nbsp;</span>
1261
+ <span class="cline-any cline-neutral">&nbsp;</span>
1262
+ <span class="cline-any cline-no">&nbsp;</span>
1263
+ <span class="cline-any cline-neutral">&nbsp;</span>
1264
+ <span class="cline-any cline-neutral">&nbsp;</span>
1265
+ <span class="cline-any cline-neutral">&nbsp;</span>
1266
+ <span class="cline-any cline-neutral">&nbsp;</span>
1267
+ <span class="cline-any cline-neutral">&nbsp;</span>
1268
+ <span class="cline-any cline-no">&nbsp;</span>
1269
+ <span class="cline-any cline-no">&nbsp;</span>
1270
+ <span class="cline-any cline-neutral">&nbsp;</span>
1271
+ <span class="cline-any cline-neutral">&nbsp;</span>
1272
+ <span class="cline-any cline-neutral">&nbsp;</span>
1273
+ <span class="cline-any cline-neutral">&nbsp;</span>
1274
+ <span class="cline-any cline-neutral">&nbsp;</span>
1275
+ <span class="cline-any cline-neutral">&nbsp;</span>
1276
+ <span class="cline-any cline-neutral">&nbsp;</span>
1277
+ <span class="cline-any cline-neutral">&nbsp;</span>
1278
+ <span class="cline-any cline-neutral">&nbsp;</span>
1279
+ <span class="cline-any cline-neutral">&nbsp;</span>
1280
+ <span class="cline-any cline-no">&nbsp;</span>
1281
+ <span class="cline-any cline-no">&nbsp;</span>
1282
+ <span class="cline-any cline-no">&nbsp;</span>
1283
+ <span class="cline-any cline-no">&nbsp;</span>
1284
+ <span class="cline-any cline-no">&nbsp;</span>
1285
+ <span class="cline-any cline-neutral">&nbsp;</span>
1286
+ <span class="cline-any cline-no">&nbsp;</span>
1287
+ <span class="cline-any cline-no">&nbsp;</span>
1288
+ <span class="cline-any cline-neutral">&nbsp;</span>
1289
+ <span class="cline-any cline-neutral">&nbsp;</span>
1290
+ <span class="cline-any cline-neutral">&nbsp;</span>
1291
+ <span class="cline-any cline-neutral">&nbsp;</span>
1292
+ <span class="cline-any cline-neutral">&nbsp;</span>
1293
+ <span class="cline-any cline-neutral">&nbsp;</span>
1294
+ <span class="cline-any cline-neutral">&nbsp;</span>
1295
+ <span class="cline-any cline-neutral">&nbsp;</span>
1296
+ <span class="cline-any cline-neutral">&nbsp;</span>
1297
+ <span class="cline-any cline-neutral">&nbsp;</span>
1298
+ <span class="cline-any cline-neutral">&nbsp;</span>
1299
+ <span class="cline-any cline-neutral">&nbsp;</span>
1300
+ <span class="cline-any cline-neutral">&nbsp;</span>
1301
+ <span class="cline-any cline-neutral">&nbsp;</span>
1302
+ <span class="cline-any cline-neutral">&nbsp;</span>
1303
+ <span class="cline-any cline-neutral">&nbsp;</span>
1304
+ <span class="cline-any cline-no">&nbsp;</span>
1305
+ <span class="cline-any cline-no">&nbsp;</span>
1306
+ <span class="cline-any cline-neutral">&nbsp;</span>
1307
+ <span class="cline-any cline-no">&nbsp;</span>
1308
+ <span class="cline-any cline-neutral">&nbsp;</span>
1309
+ <span class="cline-any cline-neutral">&nbsp;</span>
1310
+ <span class="cline-any cline-no">&nbsp;</span>
1311
+ <span class="cline-any cline-neutral">&nbsp;</span>
1312
+ <span class="cline-any cline-neutral">&nbsp;</span>
1313
+ <span class="cline-any cline-neutral">&nbsp;</span>
1314
+ <span class="cline-any cline-neutral">&nbsp;</span>
1315
+ <span class="cline-any cline-neutral">&nbsp;</span>
1316
+ <span class="cline-any cline-neutral">&nbsp;</span>
1317
+ <span class="cline-any cline-no">&nbsp;</span>
1318
+ <span class="cline-any cline-no">&nbsp;</span>
1319
+ <span class="cline-any cline-neutral">&nbsp;</span>
1320
+ <span class="cline-any cline-no">&nbsp;</span>
1321
+ <span class="cline-any cline-no">&nbsp;</span>
1322
+ <span class="cline-any cline-neutral">&nbsp;</span>
1323
+ <span class="cline-any cline-neutral">&nbsp;</span>
1324
+ <span class="cline-any cline-neutral">&nbsp;</span>
1325
+ <span class="cline-any cline-neutral">&nbsp;</span>
1326
+ <span class="cline-any cline-neutral">&nbsp;</span>
1327
+ <span class="cline-any cline-neutral">&nbsp;</span>
1328
+ <span class="cline-any cline-neutral">&nbsp;</span>
1329
+ <span class="cline-any cline-neutral">&nbsp;</span>
1330
+ <span class="cline-any cline-neutral">&nbsp;</span>
1331
+ <span class="cline-any cline-neutral">&nbsp;</span>
1332
+ <span class="cline-any cline-neutral">&nbsp;</span>
1333
+ <span class="cline-any cline-neutral">&nbsp;</span>
1334
+ <span class="cline-any cline-neutral">&nbsp;</span>
1335
+ <span class="cline-any cline-neutral">&nbsp;</span>
1336
+ <span class="cline-any cline-neutral">&nbsp;</span>
1337
+ <span class="cline-any cline-neutral">&nbsp;</span>
1338
+ <span class="cline-any cline-no">&nbsp;</span>
1339
+ <span class="cline-any cline-no">&nbsp;</span>
1340
+ <span class="cline-any cline-neutral">&nbsp;</span>
1341
+ <span class="cline-any cline-neutral">&nbsp;</span>
1342
+ <span class="cline-any cline-neutral">&nbsp;</span>
1343
+ <span class="cline-any cline-neutral">&nbsp;</span>
1344
+ <span class="cline-any cline-neutral">&nbsp;</span>
1345
+ <span class="cline-any cline-neutral">&nbsp;</span>
1346
+ <span class="cline-any cline-neutral">&nbsp;</span>
1347
+ <span class="cline-any cline-no">&nbsp;</span>
1348
+ <span class="cline-any cline-neutral">&nbsp;</span>
1349
+ <span class="cline-any cline-no">&nbsp;</span>
1350
+ <span class="cline-any cline-no">&nbsp;</span>
1351
+ <span class="cline-any cline-no">&nbsp;</span>
1352
+ <span class="cline-any cline-neutral">&nbsp;</span>
1353
+ <span class="cline-any cline-neutral">&nbsp;</span>
1354
+ <span class="cline-any cline-neutral">&nbsp;</span>
1355
+ <span class="cline-any cline-neutral">&nbsp;</span>
1356
+ <span class="cline-any cline-neutral">&nbsp;</span>
1357
+ <span class="cline-any cline-neutral">&nbsp;</span>
1358
+ <span class="cline-any cline-neutral">&nbsp;</span>
1359
+ <span class="cline-any cline-no">&nbsp;</span>
1360
+ <span class="cline-any cline-neutral">&nbsp;</span>
1361
+ <span class="cline-any cline-neutral">&nbsp;</span>
1362
+ <span class="cline-any cline-neutral">&nbsp;</span>
1363
+ <span class="cline-any cline-neutral">&nbsp;</span>
1364
+ <span class="cline-any cline-no">&nbsp;</span>
1365
+ <span class="cline-any cline-no">&nbsp;</span>
1366
+ <span class="cline-any cline-neutral">&nbsp;</span>
1367
+ <span class="cline-any cline-no">&nbsp;</span>
1368
+ <span class="cline-any cline-neutral">&nbsp;</span>
1369
+ <span class="cline-any cline-neutral">&nbsp;</span>
1370
+ <span class="cline-any cline-no">&nbsp;</span>
1371
+ <span class="cline-any cline-no">&nbsp;</span>
1372
+ <span class="cline-any cline-neutral">&nbsp;</span>
1373
+ <span class="cline-any cline-no">&nbsp;</span>
1374
+ <span class="cline-any cline-neutral">&nbsp;</span>
1375
+ <span class="cline-any cline-no">&nbsp;</span>
1376
+ <span class="cline-any cline-neutral">&nbsp;</span>
1377
+ <span class="cline-any cline-neutral">&nbsp;</span>
1378
+ <span class="cline-any cline-neutral">&nbsp;</span>
1379
+ <span class="cline-any cline-neutral">&nbsp;</span>
1380
+ <span class="cline-any cline-neutral">&nbsp;</span>
1381
+ <span class="cline-any cline-no">&nbsp;</span>
1382
+ <span class="cline-any cline-neutral">&nbsp;</span>
1383
+ <span class="cline-any cline-no">&nbsp;</span>
1384
+ <span class="cline-any cline-neutral">&nbsp;</span>
1385
+ <span class="cline-any cline-neutral">&nbsp;</span>
1386
+ <span class="cline-any cline-no">&nbsp;</span>
1387
+ <span class="cline-any cline-no">&nbsp;</span>
1388
+ <span class="cline-any cline-no">&nbsp;</span>
1389
+ <span class="cline-any cline-no">&nbsp;</span>
1390
+ <span class="cline-any cline-neutral">&nbsp;</span>
1391
+ <span class="cline-any cline-no">&nbsp;</span>
1392
+ <span class="cline-any cline-neutral">&nbsp;</span>
1393
+ <span class="cline-any cline-no">&nbsp;</span>
1394
+ <span class="cline-any cline-no">&nbsp;</span>
1395
+ <span class="cline-any cline-neutral">&nbsp;</span>
1396
+ <span class="cline-any cline-no">&nbsp;</span>
1397
+ <span class="cline-any cline-no">&nbsp;</span>
1398
+ <span class="cline-any cline-neutral">&nbsp;</span>
1399
+ <span class="cline-any cline-neutral">&nbsp;</span>
1400
+ <span class="cline-any cline-no">&nbsp;</span>
1401
+ <span class="cline-any cline-no">&nbsp;</span>
1402
+ <span class="cline-any cline-no">&nbsp;</span>
1403
+ <span class="cline-any cline-no">&nbsp;</span>
1404
+ <span class="cline-any cline-neutral">&nbsp;</span>
1405
+ <span class="cline-any cline-neutral">&nbsp;</span>
1406
+ <span class="cline-any cline-no">&nbsp;</span>
1407
+ <span class="cline-any cline-no">&nbsp;</span>
1408
+ <span class="cline-any cline-no">&nbsp;</span>
1409
+ <span class="cline-any cline-neutral">&nbsp;</span>
1410
+ <span class="cline-any cline-neutral">&nbsp;</span>
1411
+ <span class="cline-any cline-neutral">&nbsp;</span>
1412
+ <span class="cline-any cline-neutral">&nbsp;</span>
1413
+ <span class="cline-any cline-neutral">&nbsp;</span>
1414
+ <span class="cline-any cline-neutral">&nbsp;</span>
1415
+ <span class="cline-any cline-neutral">&nbsp;</span>
1416
+ <span class="cline-any cline-neutral">&nbsp;</span>
1417
+ <span class="cline-any cline-no">&nbsp;</span>
1418
+ <span class="cline-any cline-no">&nbsp;</span>
1419
+ <span class="cline-any cline-no">&nbsp;</span>
1420
+ <span class="cline-any cline-no">&nbsp;</span>
1421
+ <span class="cline-any cline-neutral">&nbsp;</span>
1422
+ <span class="cline-any cline-neutral">&nbsp;</span>
1423
+ <span class="cline-any cline-neutral">&nbsp;</span>
1424
+ <span class="cline-any cline-no">&nbsp;</span>
1425
+ <span class="cline-any cline-no">&nbsp;</span>
1426
+ <span class="cline-any cline-no">&nbsp;</span>
1427
+ <span class="cline-any cline-no">&nbsp;</span>
1428
+ <span class="cline-any cline-no">&nbsp;</span>
1429
+ <span class="cline-any cline-no">&nbsp;</span>
1430
+ <span class="cline-any cline-neutral">&nbsp;</span>
1431
+ <span class="cline-any cline-neutral">&nbsp;</span>
1432
+ <span class="cline-any cline-neutral">&nbsp;</span>
1433
+ <span class="cline-any cline-no">&nbsp;</span>
1434
+ <span class="cline-any cline-neutral">&nbsp;</span>
1435
+ <span class="cline-any cline-neutral">&nbsp;</span>
1436
+ <span class="cline-any cline-neutral">&nbsp;</span>
1437
+ <span class="cline-any cline-neutral">&nbsp;</span>
1438
+ <span class="cline-any cline-neutral">&nbsp;</span>
1439
+ <span class="cline-any cline-no">&nbsp;</span>
1440
+ <span class="cline-any cline-neutral">&nbsp;</span>
1441
+ <span class="cline-any cline-neutral">&nbsp;</span>
1442
+ <span class="cline-any cline-neutral">&nbsp;</span>
1443
+ <span class="cline-any cline-no">&nbsp;</span>
1444
+ <span class="cline-any cline-neutral">&nbsp;</span>
1445
+ <span class="cline-any cline-neutral">&nbsp;</span>
1446
+ <span class="cline-any cline-no">&nbsp;</span>
1447
+ <span class="cline-any cline-no">&nbsp;</span>
1448
+ <span class="cline-any cline-no">&nbsp;</span>
1449
+ <span class="cline-any cline-no">&nbsp;</span>
1450
+ <span class="cline-any cline-no">&nbsp;</span>
1451
+ <span class="cline-any cline-no">&nbsp;</span>
1452
+ <span class="cline-any cline-no">&nbsp;</span>
1453
+ <span class="cline-any cline-no">&nbsp;</span>
1454
+ <span class="cline-any cline-no">&nbsp;</span>
1455
+ <span class="cline-any cline-no">&nbsp;</span>
1456
+ <span class="cline-any cline-no">&nbsp;</span>
1457
+ <span class="cline-any cline-neutral">&nbsp;</span>
1458
+ <span class="cline-any cline-neutral">&nbsp;</span>
1459
+ <span class="cline-any cline-no">&nbsp;</span>
1460
+ <span class="cline-any cline-neutral">&nbsp;</span>
1461
+ <span class="cline-any cline-neutral">&nbsp;</span>
1462
+ <span class="cline-any cline-neutral">&nbsp;</span>
1463
+ <span class="cline-any cline-neutral">&nbsp;</span>
1464
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type Message from './messages.gen.js'
1465
+ <span class="cstat-no" title="statement not covered" >import { Timestamp, Metadata, UserID, Type as MType, TabChange, TabData } from './messages.gen.js'</span>
1466
+ <span class="cstat-no" title="statement not covered" >import { now, adjustTimeOrigin, deprecationWarn } from '../utils.js'</span>
1467
+ <span class="cstat-no" title="statement not covered" >import Nodes from './nodes.js'</span>
1468
+ <span class="cstat-no" title="statement not covered" >import Observer from './observer/top_observer.js'</span>
1469
+ <span class="cstat-no" title="statement not covered" >import Sanitizer from './sanitizer.js'</span>
1470
+ <span class="cstat-no" title="statement not covered" >import Ticker from './ticker.js'</span>
1471
+ <span class="cstat-no" title="statement not covered" >import Logger, { LogLevel } from './logger.js'</span>
1472
+ <span class="cstat-no" title="statement not covered" >import Session from './session.js'</span>
1473
+ <span class="cstat-no" title="statement not covered" >import { gzip } from 'fflate'</span>
1474
+ <span class="cstat-no" title="statement not covered" >import { deviceMemory, jsHeapSizeLimit } from '../modules/performance.js'</span>
1475
+ <span class="cstat-no" title="statement not covered" >import AttributeSender from '../modules/attributeSender.js'</span>
1476
+ import type { Options as ObserverOptions } from './observer/top_observer.js'
1477
+ import type { Options as SanitizerOptions } from './sanitizer.js'
1478
+ import type { Options as LoggerOptions } from './logger.js'
1479
+ import type { Options as SessOptions } from './session.js'
1480
+ import type { Options as NetworkOptions } from '../modules/network.js'
1481
+ &nbsp;
1482
+ import type {
1483
+ Options as WebworkerOptions,
1484
+ ToWorkerData,
1485
+ FromWorkerData,
1486
+ } from '../../common/interaction.js'
1487
+ &nbsp;
1488
+ interface TypedWorker extends Omit&lt;Worker, 'postMessage'&gt; {
1489
+ postMessage(data: ToWorkerData): void
1490
+ }
1491
+ &nbsp;
1492
+ // TODO: Unify and clearly describe options logic
1493
+ export interface StartOptions {
1494
+ userID?: string
1495
+ metadata?: Record&lt;string, string&gt;
1496
+ forceNew?: boolean
1497
+ sessionHash?: string
1498
+ }
1499
+ &nbsp;
1500
+ interface OnStartInfo {
1501
+ sessionID: string
1502
+ sessionToken: string
1503
+ userUUID: string
1504
+ }
1505
+ const CANCELED = <span class="cstat-no" title="statement not covered" >'canceled' as const</span>
1506
+ const START_ERROR = <span class="cstat-no" title="statement not covered" >':(' as const</span>
1507
+ type SuccessfulStart = OnStartInfo &amp; { success: true }
1508
+ type UnsuccessfulStart = {
1509
+ reason: typeof CANCELED | string
1510
+ success: false
1511
+ }
1512
+ &nbsp;
1513
+ type RickRoll = { source: string } &amp; (
1514
+ | { line: 'never-gonna-give-you-up' }
1515
+ | { line: 'never-gonna-let-you-down'; token: string }
1516
+ )
1517
+ &nbsp;
1518
+ const UnsuccessfulStart = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(r</span>eason: string): UnsuccessfulStart =&gt; (<span class="cstat-no" title="statement not covered" >{ reason, success: false })</span></span>
1519
+ const SuccessfulStart = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(b</span>ody: OnStartInfo): SuccessfulStart =&gt; <span class="cstat-no" title="statement not covered" >({ ...body, success: true })</span></span>
1520
+ export type StartPromiseReturn = SuccessfulStart | UnsuccessfulStart
1521
+ &nbsp;
1522
+ type StartCallback = (i: OnStartInfo) =&gt; void
1523
+ type CommitCallback = (messages: Array&lt;Message&gt;) =&gt; void
1524
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >enum A</span>ctivityState {</span>
1525
+ <span class="cstat-no" title="statement not covered" > NotActive,</span>
1526
+ <span class="cstat-no" title="statement not covered" > Starting,</span>
1527
+ <span class="cstat-no" title="statement not covered" > Active,</span>
1528
+ }
1529
+ &nbsp;
1530
+ type AppOptions = {
1531
+ revID: string
1532
+ node_id: string
1533
+ session_reset_key: string
1534
+ session_token_key: string
1535
+ session_pageno_key: string
1536
+ session_tabid_key: string
1537
+ local_uuid_key: string
1538
+ ingestPoint: string
1539
+ resourceBaseHref: string | null // resourceHref?
1540
+ //resourceURLRewriter: (url: string) =&gt; string | boolean,
1541
+ verbose: boolean
1542
+ __is_snippet: boolean
1543
+ __debug_report_edp: string | null
1544
+ __debug__?: LoggerOptions
1545
+ localStorage: Storage | null
1546
+ sessionStorage: Storage | null
1547
+ forceSingleTab?: boolean
1548
+ disableStringDict?: boolean
1549
+ &nbsp;
1550
+ // @deprecated
1551
+ onStart?: StartCallback
1552
+ network?: NetworkOptions
1553
+ } &amp; WebworkerOptions &amp;
1554
+ SessOptions
1555
+ &nbsp;
1556
+ export type Options = AppOptions &amp; ObserverOptions &amp; SanitizerOptions
1557
+ &nbsp;
1558
+ // TODO: use backendHost only
1559
+ export const <span class="cstat-no" title="statement not covered" >DEFAULT_INGEST_POINT = 'https://api.openreplay.com/ingest'</span>
1560
+ &nbsp;
1561
+ function <span class="fstat-no" title="function not covered" >getTimezone(</span>) {
1562
+ const offset = <span class="cstat-no" title="statement not covered" >new Date().getTimezoneOffset() * -1</span>
1563
+ const sign = <span class="cstat-no" title="statement not covered" >offset &gt;= 0 ? '+' : '-'</span>
1564
+ const hours = <span class="cstat-no" title="statement not covered" >Math.floor(Math.abs(offset) / 60)</span>
1565
+ const minutes = <span class="cstat-no" title="statement not covered" >Math.abs(offset) % 60</span>
1566
+ <span class="cstat-no" title="statement not covered" > return `UTC${sign}${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`</span>
1567
+ }
1568
+ &nbsp;
1569
+ <span class="cstat-no" title="statement not covered" >export default class A</span>pp {
1570
+ readonly nodes: Nodes
1571
+ readonly ticker: Ticker
1572
+ readonly projectKey: string
1573
+ readonly sanitizer: Sanitizer
1574
+ readonly debug: Logger
1575
+ readonly notify: Logger
1576
+ readonly session: Session
1577
+ readonly localStorage: Storage
1578
+ readonly sessionStorage: Storage
1579
+ private readonly <span class="cstat-no" title="statement not covered" >messages: Array&lt;Message&gt; = []</span>
1580
+ /* private */ readonly observer: Observer // non-privat for attachContextCallback
1581
+ private readonly <span class="cstat-no" title="statement not covered" >startCallbacks: Array&lt;StartCallback&gt; = []</span>
1582
+ private readonly <span class="cstat-no" title="statement not covered" >stopCallbacks: Array&lt;() =&gt; any&gt; = []</span>
1583
+ private readonly <span class="cstat-no" title="statement not covered" >commitCallbacks: Array&lt;CommitCallback&gt; = []</span>
1584
+ public readonly options: AppOptions
1585
+ public readonly networkOptions?: NetworkOptions
1586
+ private readonly revID: string
1587
+ private <span class="cstat-no" title="statement not covered" >activityState: ActivityState = ActivityState.NotActive</span>
1588
+ private readonly <span class="cstat-no" title="statement not covered" >version = 'TRACKER_VERSION' /</span>/ TODO: version compatability check inside each plugin.
1589
+ private readonly worker?: TypedWorker
1590
+ &nbsp;
1591
+ private <span class="cstat-no" title="statement not covered" >compressionThreshold = 24 * 1000</span>
1592
+ private <span class="cstat-no" title="statement not covered" >restartAttempts = 0</span>
1593
+ private readonly <span class="cstat-no" title="statement not covered" >bc: BroadcastChannel | null = null</span>
1594
+ public attributeSender: AttributeSender
1595
+ &nbsp;
1596
+ <span class="fstat-no" title="function not covered" > constructor(p</span>rojectKey: string, sessionToken: string | undefined, options: Partial&lt;Options&gt;) {
1597
+ // if (options.onStart !== undefined) {
1598
+ // deprecationWarn("'onStart' option", "tracker.start().then(/* handle session info */)")
1599
+ // } ?? maybe onStart is good
1600
+ &nbsp;
1601
+ <span class="cstat-no" title="statement not covered" > this.projectKey = projectKey</span>
1602
+ <span class="cstat-no" title="statement not covered" > this.networkOptions = options.network</span>
1603
+ <span class="cstat-no" title="statement not covered" > this.options = Object.assign(</span>
1604
+ {
1605
+ revID: '',
1606
+ node_id: '__openreplay_id',
1607
+ session_token_key: '__openreplay_token',
1608
+ session_pageno_key: '__openreplay_pageno',
1609
+ session_reset_key: '__openreplay_reset',
1610
+ session_tabid_key: '__openreplay_tabid',
1611
+ local_uuid_key: '__openreplay_uuid',
1612
+ ingestPoint: DEFAULT_INGEST_POINT,
1613
+ resourceBaseHref: null,
1614
+ verbose: false,
1615
+ __is_snippet: false,
1616
+ __debug_report_edp: null,
1617
+ localStorage: null,
1618
+ sessionStorage: null,
1619
+ disableStringDict: false,
1620
+ forceSingleTab: false,
1621
+ },
1622
+ options,
1623
+ )
1624
+ &nbsp;
1625
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.options.forceSingleTab &amp;&amp; globalThis &amp;&amp; 'BroadcastChannel' in globalThis) {</span>
1626
+ <span class="cstat-no" title="statement not covered" > this.bc = new BroadcastChannel('rick')</span>
1627
+ }
1628
+ &nbsp;
1629
+ <span class="cstat-no" title="statement not covered" > this.revID = this.options.revID</span>
1630
+ <span class="cstat-no" title="statement not covered" > this.localStorage = this.options.localStorage ?? window.localStorage</span>
1631
+ <span class="cstat-no" title="statement not covered" > this.sessionStorage = this.options.sessionStorage ?? window.sessionStorage</span>
1632
+ <span class="cstat-no" title="statement not covered" > this.sanitizer = new Sanitizer(this, options)</span>
1633
+ <span class="cstat-no" title="statement not covered" > this.nodes = new Nodes(this.options.node_id)</span>
1634
+ <span class="cstat-no" title="statement not covered" > this.observer = new Observer(this, options)</span>
1635
+ <span class="cstat-no" title="statement not covered" > this.ticker = new Ticker(this)</span>
1636
+ <span class="cstat-no" title="statement not covered" > this.ticker.attach(<span class="fstat-no" title="function not covered" >() =</span>&gt; <span class="cstat-no" title="statement not covered" >this.commit())</span></span>
1637
+ <span class="cstat-no" title="statement not covered" > this.debug = new Logger(this.options.__debug__)</span>
1638
+ <span class="cstat-no" title="statement not covered" > this.notify = new Logger(this.options.verbose ? LogLevel.Warnings : LogLevel.Silent)</span>
1639
+ <span class="cstat-no" title="statement not covered" > this.session = new Session(this, this.options)</span>
1640
+ <span class="cstat-no" title="statement not covered" > this.attributeSender = new AttributeSender(this, Boolean(this.options.disableStringDict))</span>
1641
+ <span class="cstat-no" title="statement not covered" > this.session.attachUpdateCallback(<span class="fstat-no" title="function not covered" >({</span> userID, metadata }) =&gt; {</span>
1642
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (userID != null) {</span>
1643
+ // TODO: nullable userID
1644
+ <span class="cstat-no" title="statement not covered" > this.send(UserID(userID))</span>
1645
+ }
1646
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (metadata != null) {</span>
1647
+ <span class="cstat-no" title="statement not covered" > Object.entries(metadata).forEach(<span class="fstat-no" title="function not covered" >([</span>key, value]) =&gt; <span class="cstat-no" title="statement not covered" >this.send(Metadata(key, value)))</span></span>
1648
+ }
1649
+ })
1650
+ &nbsp;
1651
+ // @deprecated (use sessionHash on start instead)
1652
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (sessionToken != null) {</span>
1653
+ <span class="cstat-no" title="statement not covered" > this.session.applySessionHash(sessionToken)</span>
1654
+ }
1655
+ &nbsp;
1656
+ <span class="cstat-no" title="statement not covered" > try {</span>
1657
+ <span class="cstat-no" title="statement not covered" > this.worker = new Worker(</span>
1658
+ URL.createObjectURL(new Blob(['WEBWORKER_BODY'], { type: 'text/javascript' })),
1659
+ )
1660
+ <span class="cstat-no" title="statement not covered" > this.worker.onerror = <span class="fstat-no" title="function not covered" >(e</span>) =&gt; {</span>
1661
+ <span class="cstat-no" title="statement not covered" > this._debug('webworker_error', e)</span>
1662
+ }
1663
+ <span class="cstat-no" title="statement not covered" > this.worker.onmessage = <span class="fstat-no" title="function not covered" >({</span> data }: MessageEvent&lt;FromWorkerData&gt;) =&gt; {</span>
1664
+ <span class="cstat-no" title="statement not covered" > if (data === 'restart') {</span>
1665
+ <span class="cstat-no" title="statement not covered" > this.stop(false)</span>
1666
+ <span class="cstat-no" title="statement not covered" > void this.start({}, true)</span>
1667
+ } else <span class="cstat-no" title="statement not covered" >if (data === 'not_init') {</span>
1668
+ <span class="cstat-no" title="statement not covered" > console.warn('WebWorker: writer not initialised. Restarting tracker')</span>
1669
+ } else <span class="cstat-no" title="statement not covered" >if (data.type === 'failure') {</span>
1670
+ <span class="cstat-no" title="statement not covered" > this.stop(false)</span>
1671
+ <span class="cstat-no" title="statement not covered" > this._debug('worker_failed', data.reason)</span>
1672
+ } else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span>if (data.type === 'compress') {</span>
1673
+ const batch = <span class="cstat-no" title="statement not covered" >data.batch</span>
1674
+ const batchSize = <span class="cstat-no" title="statement not covered" >batch.byteLength</span>
1675
+ <span class="cstat-no" title="statement not covered" > if (batchSize &gt; this.compressionThreshold) {</span>
1676
+ <span class="cstat-no" title="statement not covered" > gzip(data.batch, { mtime: 0 }, <span class="fstat-no" title="function not covered" >(e</span>rr, result) =&gt; {</span>
1677
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (err) {</span>
1678
+ <span class="cstat-no" title="statement not covered" > console.error('Openreplay compression error:', err)</span>
1679
+ <span class="cstat-no" title="statement not covered" > this.stop(false)</span>
1680
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.restartAttempts &lt; 3) {</span>
1681
+ <span class="cstat-no" title="statement not covered" > this.restartAttempts += 1</span>
1682
+ <span class="cstat-no" title="statement not covered" > void this.start({}, true)</span>
1683
+ }
1684
+ }
1685
+ // @ts-ignore
1686
+ <span class="cstat-no" title="statement not covered" > this.worker?.postMessage({ type: 'compressed', batch: result })</span>
1687
+ })
1688
+ } else {
1689
+ <span class="cstat-no" title="statement not covered" > this.worker?.postMessage({ type: 'uncompressed', batch: batch })</span>
1690
+ }
1691
+ }
1692
+ }
1693
+ const alertWorker = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
1694
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.worker) {</span>
1695
+ <span class="cstat-no" title="statement not covered" > this.worker.postMessage(null)</span>
1696
+ }
1697
+ }
1698
+ // keep better tactics, discard others?
1699
+ <span class="cstat-no" title="statement not covered" > this.attachEventListener(window, 'beforeunload', alertWorker, false)</span>
1700
+ <span class="cstat-no" title="statement not covered" > this.attachEventListener(document.body, 'mouseleave', alertWorker, false, false)</span>
1701
+ // TODO: stop session after inactivity timeout (make configurable)
1702
+ <span class="cstat-no" title="statement not covered" > this.attachEventListener(document, 'visibilitychange', alertWorker, false)</span>
1703
+ } catch (e) {
1704
+ <span class="cstat-no" title="statement not covered" > this._debug('worker_start', e)</span>
1705
+ }
1706
+ &nbsp;
1707
+ const thisTab = <span class="cstat-no" title="statement not covered" >this.session.getTabId()</span>
1708
+ &nbsp;
1709
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.session.getSessionToken() &amp;&amp; this.bc) {</span>
1710
+ <span class="cstat-no" title="statement not covered" > this.bc.postMessage({ line: 'never-gonna-give-you-up', source: thisTab })</span>
1711
+ }
1712
+ &nbsp;
1713
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.bc) {</span>
1714
+ <span class="cstat-no" title="statement not covered" > this.bc.onmessage = <span class="fstat-no" title="function not covered" >(e</span>v: MessageEvent&lt;RickRoll&gt;) =&gt; {</span>
1715
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (ev.data.source === thisTab) <span class="cstat-no" title="statement not covered" >return</span></span>
1716
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (ev.data.line === 'never-gonna-let-you-down') {</span>
1717
+ const sessionToken = <span class="cstat-no" title="statement not covered" >ev.data.token</span>
1718
+ <span class="cstat-no" title="statement not covered" > this.session.setSessionToken(sessionToken)</span>
1719
+ }
1720
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (ev.data.line === 'never-gonna-give-you-up') {</span>
1721
+ const token = <span class="cstat-no" title="statement not covered" >this.session.getSessionToken()</span>
1722
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (token &amp;&amp; this.bc) {</span>
1723
+ <span class="cstat-no" title="statement not covered" > this.bc.postMessage({</span>
1724
+ line: 'never-gonna-let-you-down',
1725
+ token,
1726
+ source: thisTab,
1727
+ })
1728
+ }
1729
+ }
1730
+ }
1731
+ }
1732
+ }
1733
+ &nbsp;
1734
+ private <span class="fstat-no" title="function not covered" >_debug(</span>context: string, e: any) {
1735
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.options.__debug_report_edp !== null) {</span>
1736
+ <span class="cstat-no" title="statement not covered" > void fetch(this.options.__debug_report_edp, {</span>
1737
+ method: 'POST',
1738
+ headers: { 'Content-Type': 'application/json' },
1739
+ body: JSON.stringify({
1740
+ context,
1741
+ // @ts-ignore
1742
+ error: `${e}`,
1743
+ }),
1744
+ })
1745
+ }
1746
+ <span class="cstat-no" title="statement not covered" > this.debug.error('OpenReplay error: ', context, e)</span>
1747
+ }
1748
+ &nbsp;
1749
+ private <span class="cstat-no" title="statement not covered" >_usingOldFetchPlugin = false</span>
1750
+ <span class="fstat-no" title="function not covered" > send(</span>message: Message, urgent = <span class="branch-0 cbranch-no" title="branch not covered" >false)</span>: void {
1751
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.activityState === ActivityState.NotActive) {</span>
1752
+ <span class="cstat-no" title="statement not covered" > return</span>
1753
+ }
1754
+ // === Back compatibility with Fetch/Axios plugins ===
1755
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (message[0] === MType.Fetch) {</span>
1756
+ <span class="cstat-no" title="statement not covered" > this._usingOldFetchPlugin = true</span>
1757
+ <span class="cstat-no" title="statement not covered" > deprecationWarn('Fetch plugin', "'network' init option", '/installation/network-options')</span>
1758
+ <span class="cstat-no" title="statement not covered" > deprecationWarn('Axios plugin', "'network' init option", '/installation/network-options')</span>
1759
+ }
1760
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this._usingOldFetchPlugin &amp;&amp; message[0] === MType.NetworkRequest) {</span>
1761
+ <span class="cstat-no" title="statement not covered" > return</span>
1762
+ }
1763
+ // ====================================================
1764
+ &nbsp;
1765
+ <span class="cstat-no" title="statement not covered" > this.messages.push(message)</span>
1766
+ // TODO: commit on start if there were `urgent` sends;
1767
+ // Clarify where urgent can be used for;
1768
+ // Clarify workflow for each type of message in case it was sent before start
1769
+ // (like Fetch before start; maybe add an option "preCapture: boolean" or sth alike)
1770
+ // Careful: `this.delay` is equal to zero before start hense all Timestamp-s will have to be updated on start
1771
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.activityState === ActivityState.Active &amp;&amp; urgent) {</span>
1772
+ <span class="cstat-no" title="statement not covered" > this.commit()</span>
1773
+ }
1774
+ }
1775
+ private <span class="fstat-no" title="function not covered" >commit(</span>): void {
1776
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.worker &amp;&amp; this.messages.length) {</span>
1777
+ <span class="cstat-no" title="statement not covered" > this.messages.unshift(TabData(this.session.getTabId()))</span>
1778
+ <span class="cstat-no" title="statement not covered" > this.messages.unshift(Timestamp(this.timestamp()))</span>
1779
+ <span class="cstat-no" title="statement not covered" > this.worker.postMessage(this.messages)</span>
1780
+ <span class="cstat-no" title="statement not covered" > this.commitCallbacks.forEach(<span class="fstat-no" title="function not covered" >(c</span>b) =&gt; <span class="cstat-no" title="statement not covered" >cb(this.messages))</span></span>
1781
+ <span class="cstat-no" title="statement not covered" > this.messages.length = 0</span>
1782
+ }
1783
+ }
1784
+ &nbsp;
1785
+ private <span class="cstat-no" title="statement not covered" >delay = 0</span>
1786
+ <span class="fstat-no" title="function not covered" > timestamp(</span>): number {
1787
+ <span class="cstat-no" title="statement not covered" > return now() + this.delay</span>
1788
+ }
1789
+ &nbsp;
1790
+ <span class="fstat-no" title="function not covered" > safe&lt;</span>T extends (this: any, ...args: any[]) =&gt; void&gt;(fn: T): T {
1791
+ const app = <span class="cstat-no" title="statement not covered" >this</span>
1792
+ <span class="cstat-no" title="statement not covered" > return <span class="fstat-no" title="function not covered" >function (this: any, .</span>..args: any[]) {</span>
1793
+ <span class="cstat-no" title="statement not covered" > try {</span>
1794
+ <span class="cstat-no" title="statement not covered" > fn.apply(this, args)</span>
1795
+ } catch (e) {
1796
+ <span class="cstat-no" title="statement not covered" > app._debug('safe_fn_call', e)</span>
1797
+ // time: this.timestamp(),
1798
+ // name: e.name,
1799
+ // message: e.message,
1800
+ // stack: e.stack
1801
+ }
1802
+ } as T // TODO: correct typing
1803
+ }
1804
+ &nbsp;
1805
+ <span class="fstat-no" title="function not covered" > attachCommitCallback(</span>cb: CommitCallback): void {
1806
+ <span class="cstat-no" title="statement not covered" > this.commitCallbacks.push(cb)</span>
1807
+ }
1808
+ <span class="fstat-no" title="function not covered" > attachStartCallback(</span>cb: StartCallback, useSafe = <span class="branch-0 cbranch-no" title="branch not covered" >false)</span>: void {
1809
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (useSafe) {</span>
1810
+ <span class="cstat-no" title="statement not covered" > cb = this.safe(cb)</span>
1811
+ }
1812
+ <span class="cstat-no" title="statement not covered" > this.startCallbacks.push(cb)</span>
1813
+ }
1814
+ <span class="fstat-no" title="function not covered" > attachStopCallback(</span>cb: () =&gt; any, useSafe = <span class="branch-0 cbranch-no" title="branch not covered" >false)</span>: void {
1815
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (useSafe) {</span>
1816
+ <span class="cstat-no" title="statement not covered" > cb = this.safe(cb)</span>
1817
+ }
1818
+ <span class="cstat-no" title="statement not covered" > this.stopCallbacks.push(cb)</span>
1819
+ }
1820
+ // Use app.nodes.attachNodeListener for registered nodes instead
1821
+ <span class="fstat-no" title="function not covered" > attachEventListener(</span>
1822
+ target: EventTarget,
1823
+ type: string,
1824
+ listener: EventListener,
1825
+ useSafe = <span class="branch-0 cbranch-no" title="branch not covered" >true,</span>
1826
+ useCapture = <span class="branch-0 cbranch-no" title="branch not covered" >true,</span>
1827
+ ): void {
1828
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (useSafe) {</span>
1829
+ <span class="cstat-no" title="statement not covered" > listener = this.safe(listener)</span>
1830
+ }
1831
+ <span class="cstat-no" title="statement not covered" > this.attachStartCallback(<span class="fstat-no" title="function not covered" >() =</span>&gt; <span class="cstat-no" title="statement not covered" >target?.addEventListener(type, listener, useCapture),</span> useSafe)</span>
1832
+ <span class="cstat-no" title="statement not covered" > this.attachStopCallback(<span class="fstat-no" title="function not covered" >() =</span>&gt; <span class="cstat-no" title="statement not covered" >target?.removeEventListener(type, listener, useCapture),</span> useSafe)</span>
1833
+ }
1834
+ &nbsp;
1835
+ // TODO: full correct semantic
1836
+ <span class="fstat-no" title="function not covered" > checkRequiredVersion(</span>version: string): boolean {
1837
+ const reqVer = <span class="cstat-no" title="statement not covered" >version.split(/[.-]/)</span>
1838
+ const ver = <span class="cstat-no" title="statement not covered" >this.version.split(/[.-]/)</span>
1839
+ <span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >0;</span> i &lt; 3; i++) {</span>
1840
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (isNaN(Number(ver[i])) || isNaN(Number(reqVer[i]))) {</span>
1841
+ <span class="cstat-no" title="statement not covered" > return false</span>
1842
+ }
1843
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (Number(ver[i]) &gt; Number(reqVer[i])) {</span>
1844
+ <span class="cstat-no" title="statement not covered" > return true</span>
1845
+ }
1846
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (Number(ver[i]) &lt; Number(reqVer[i])) {</span>
1847
+ <span class="cstat-no" title="statement not covered" > return false</span>
1848
+ }
1849
+ }
1850
+ <span class="cstat-no" title="statement not covered" > return true</span>
1851
+ }
1852
+ &nbsp;
1853
+ private <span class="fstat-no" title="function not covered" >getTrackerInfo(</span>) {
1854
+ <span class="cstat-no" title="statement not covered" > return {</span>
1855
+ userUUID: this.localStorage.getItem(this.options.local_uuid_key),
1856
+ projectKey: this.projectKey,
1857
+ revID: this.revID,
1858
+ trackerVersion: this.version,
1859
+ isSnippet: this.options.__is_snippet,
1860
+ }
1861
+ }
1862
+ <span class="fstat-no" title="function not covered" > getSessionInfo(</span>) {
1863
+ <span class="cstat-no" title="statement not covered" > return {</span>
1864
+ ...this.session.getInfo(),
1865
+ ...this.getTrackerInfo(),
1866
+ }
1867
+ }
1868
+ <span class="fstat-no" title="function not covered" > getSessionToken(</span>): string | undefined {
1869
+ <span class="cstat-no" title="statement not covered" > return this.session.getSessionToken()</span>
1870
+ }
1871
+ <span class="fstat-no" title="function not covered" > getSessionID(</span>): string | undefined {
1872
+ <span class="cstat-no" title="statement not covered" > return this.session.getInfo().sessionID || undefined</span>
1873
+ }
1874
+ &nbsp;
1875
+ <span class="fstat-no" title="function not covered" > getSessionURL(</span>options?: { withCurrentTime?: boolean }): string | undefined {
1876
+ const { projectID, sessionID, timestamp } = <span class="cstat-no" title="statement not covered" >this.session.getInfo()</span>
1877
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!projectID || !sessionID) {</span>
1878
+ <span class="cstat-no" title="statement not covered" > this.debug.error('OpenReplay error: Unable to build session URL')</span>
1879
+ <span class="cstat-no" title="statement not covered" > return undefined</span>
1880
+ }
1881
+ const ingest = <span class="cstat-no" title="statement not covered" >this.options.ingestPoint</span>
1882
+ const isSaas = <span class="cstat-no" title="statement not covered" >/api\.openreplay\.com/.test(ingest)</span>
1883
+ &nbsp;
1884
+ const projectPath = <span class="cstat-no" title="statement not covered" >isSaas ? 'https://app.openreplay.com/ingest' : ingest</span>
1885
+ &nbsp;
1886
+ const url = <span class="cstat-no" title="statement not covered" >projectPath.replace(/ingest$/, `${projectID}/session/${sessionID}`)</span>
1887
+ &nbsp;
1888
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (options?.withCurrentTime) {</span>
1889
+ const jumpTo = <span class="cstat-no" title="statement not covered" >now() - timestamp</span>
1890
+ <span class="cstat-no" title="statement not covered" > return `${url}?jumpto=${jumpTo}`</span>
1891
+ }
1892
+ &nbsp;
1893
+ <span class="cstat-no" title="statement not covered" > return url</span>
1894
+ }
1895
+ &nbsp;
1896
+ <span class="fstat-no" title="function not covered" > getHost(</span>): string {
1897
+ <span class="cstat-no" title="statement not covered" > return new URL(this.options.ingestPoint).host</span>
1898
+ }
1899
+ <span class="fstat-no" title="function not covered" > getProjectKey(</span>): string {
1900
+ <span class="cstat-no" title="statement not covered" > return this.projectKey</span>
1901
+ }
1902
+ <span class="fstat-no" title="function not covered" > getBaseHref(</span>): string {
1903
+ <span class="cstat-no" title="statement not covered" > if (typeof this.options.resourceBaseHref === 'string') {</span>
1904
+ <span class="cstat-no" title="statement not covered" > return this.options.resourceBaseHref</span>
1905
+ } else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span>if (typeof this.options.resourceBaseHref === 'object') {</span>
1906
+ //TODO: switch between types
1907
+ }
1908
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (document.baseURI) {</span>
1909
+ <span class="cstat-no" title="statement not covered" > return document.baseURI</span>
1910
+ }
1911
+ // IE only
1912
+ <span class="cstat-no" title="statement not covered" > return (</span>
1913
+ document.head?.getElementsByTagName('base')[0]?.getAttribute('href') ||
1914
+ location.origin + location.pathname
1915
+ )
1916
+ }
1917
+ <span class="fstat-no" title="function not covered" > resolveResourceURL(</span>resourceURL: string): string {
1918
+ const base = <span class="cstat-no" title="statement not covered" >new URL(this.getBaseHref())</span>
1919
+ <span class="cstat-no" title="statement not covered" > base.pathname += '/' + new URL(resourceURL).pathname</span>
1920
+ <span class="cstat-no" title="statement not covered" > base.pathname.replace(/\/+/g, '/')</span>
1921
+ <span class="cstat-no" title="statement not covered" > return base.toString()</span>
1922
+ }
1923
+ &nbsp;
1924
+ <span class="fstat-no" title="function not covered" > isServiceURL(</span>url: string): boolean {
1925
+ <span class="cstat-no" title="statement not covered" > return url.startsWith(this.options.ingestPoint)</span>
1926
+ }
1927
+ &nbsp;
1928
+ <span class="fstat-no" title="function not covered" > active(</span>): boolean {
1929
+ <span class="cstat-no" title="statement not covered" > return this.activityState === ActivityState.Active</span>
1930
+ }
1931
+ &nbsp;
1932
+ <span class="fstat-no" title="function not covered" > resetNextPageSession(</span>flag: boolean) {
1933
+ <span class="cstat-no" title="statement not covered" > if (flag) {</span>
1934
+ <span class="cstat-no" title="statement not covered" > this.sessionStorage.setItem(this.options.session_reset_key, 't')</span>
1935
+ } else {
1936
+ <span class="cstat-no" title="statement not covered" > this.sessionStorage.removeItem(this.options.session_reset_key)</span>
1937
+ }
1938
+ }
1939
+ &nbsp;
1940
+ private <span class="fstat-no" title="function not covered" >_start(</span>startOpts: StartOptions = <span class="branch-0 cbranch-no" title="branch not covered" >{},</span> resetByWorker = <span class="branch-0 cbranch-no" title="branch not covered" >false)</span>: Promise&lt;StartPromiseReturn&gt; {
1941
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.worker) {</span>
1942
+ <span class="cstat-no" title="statement not covered" > return Promise.resolve(UnsuccessfulStart('No worker found: perhaps, CSP is not set.'))</span>
1943
+ }
1944
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.activityState !== ActivityState.NotActive) {</span>
1945
+ <span class="cstat-no" title="statement not covered" > return Promise.resolve(</span>
1946
+ UnsuccessfulStart(
1947
+ 'OpenReplay: trying to call `start()` on the instance that has been started already.',
1948
+ ),
1949
+ )
1950
+ }
1951
+ <span class="cstat-no" title="statement not covered" > this.activityState = ActivityState.Starting</span>
1952
+ <span class="cstat-no" title="statement not covered" > adjustTimeOrigin()</span>
1953
+ &nbsp;
1954
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (startOpts.sessionHash) {</span>
1955
+ <span class="cstat-no" title="statement not covered" > this.session.applySessionHash(startOpts.sessionHash)</span>
1956
+ }
1957
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (startOpts.forceNew) {</span>
1958
+ // Reset session metadata only if requested directly
1959
+ <span class="cstat-no" title="statement not covered" > this.session.reset()</span>
1960
+ }
1961
+ <span class="cstat-no" title="statement not covered" > this.session.assign({</span>
1962
+ // MBTODO: maybe it would make sense to `forceNew` if the `userID` was changed
1963
+ userID: startOpts.userID,
1964
+ metadata: startOpts.metadata,
1965
+ })
1966
+ &nbsp;
1967
+ const timestamp = <span class="cstat-no" title="statement not covered" >now()</span>
1968
+ <span class="cstat-no" title="statement not covered" > this.worker.postMessage({</span>
1969
+ type: 'start',
1970
+ pageNo: this.session.incPageNo(),
1971
+ ingestPoint: this.options.ingestPoint,
1972
+ timestamp,
1973
+ url: document.URL,
1974
+ connAttemptCount: this.options.connAttemptCount,
1975
+ connAttemptGap: this.options.connAttemptGap,
1976
+ tabId: this.session.getTabId(),
1977
+ })
1978
+ &nbsp;
1979
+ const lsReset = <span class="cstat-no" title="statement not covered" >this.sessionStorage.getItem(this.options.session_reset_key) !== null</span>
1980
+ <span class="cstat-no" title="statement not covered" > this.sessionStorage.removeItem(this.options.session_reset_key)</span>
1981
+ const needNewSessionID = <span class="cstat-no" title="statement not covered" >startOpts.forceNew || lsReset || resetByWorker</span>
1982
+ const sessionToken = <span class="cstat-no" title="statement not covered" >this.session.getSessionToken()</span>
1983
+ const isNewSession = <span class="cstat-no" title="statement not covered" >needNewSessionID || !sessionToken</span>
1984
+ &nbsp;
1985
+ <span class="cstat-no" title="statement not covered" > console.log('OpenReplay: starting session', needNewSessionID, sessionToken)</span>
1986
+ <span class="cstat-no" title="statement not covered" > return window</span>
1987
+ .fetch(this.options.ingestPoint + '/v1/web/start', {
1988
+ method: 'POST',
1989
+ headers: {
1990
+ 'Content-Type': 'application/json',
1991
+ },
1992
+ body: JSON.stringify({
1993
+ ...this.getTrackerInfo(),
1994
+ timestamp,
1995
+ userID: this.session.getInfo().userID,
1996
+ token: isNewSession ? undefined : sessionToken,
1997
+ deviceMemory,
1998
+ jsHeapSizeLimit,
1999
+ timezone: getTimezone(),
2000
+ }),
2001
+ })
2002
+ .then(<span class="fstat-no" title="function not covered" >(r</span>) =&gt; {
2003
+ <span class="cstat-no" title="statement not covered" > if (r.status === 200) {</span>
2004
+ <span class="cstat-no" title="statement not covered" > return r.json()</span>
2005
+ } else {
2006
+ <span class="cstat-no" title="statement not covered" > return r</span>
2007
+ .text()
2008
+ .then(<span class="fstat-no" title="function not covered" >(t</span>ext) =&gt;
2009
+ <span class="cstat-no" title="statement not covered" > text === CANCELED</span>
2010
+ ? Promise.reject(CANCELED)
2011
+ : Promise.reject(`Server error: ${r.status}. ${text}`),
2012
+ )
2013
+ }
2014
+ })
2015
+ .then(<span class="fstat-no" title="function not covered" >(r</span>) =&gt; {
2016
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.worker) {</span>
2017
+ <span class="cstat-no" title="statement not covered" > return Promise.reject('no worker found after start request (this might not happen)')</span>
2018
+ }
2019
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.activityState === ActivityState.NotActive) {</span>
2020
+ <span class="cstat-no" title="statement not covered" > return Promise.reject('Tracker stopped during authorization')</span>
2021
+ }
2022
+ const {
2023
+ token,
2024
+ userUUID,
2025
+ projectID,
2026
+ beaconSizeLimit,
2027
+ compressionThreshold, // how big the batch should be before we decide to compress it
2028
+ delay, // derived from token
2029
+ sessionID, // derived from token
2030
+ startTimestamp, // real startTS (server time), derived from sessionID
2031
+ userBrowser,
2032
+ userCity,
2033
+ userCountry,
2034
+ userDevice,
2035
+ userOS,
2036
+ userState,
2037
+ } = <span class="cstat-no" title="statement not covered" >r</span>
2038
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
2039
+ typeof token !== 'string' ||
2040
+ typeof userUUID !== 'string' ||
2041
+ (typeof startTimestamp !== 'number' &amp;&amp; typeof startTimestamp !== 'undefined') ||
2042
+ typeof sessionID !== 'string' ||
2043
+ typeof delay !== 'number' ||
2044
+ (typeof beaconSizeLimit !== 'number' &amp;&amp; typeof beaconSizeLimit !== 'undefined')
2045
+ ) {
2046
+ <span class="cstat-no" title="statement not covered" > return Promise.reject(`Incorrect server response: ${JSON.stringify(r)}`)</span>
2047
+ }
2048
+ <span class="cstat-no" title="statement not covered" > this.delay = delay</span>
2049
+ <span class="cstat-no" title="statement not covered" > this.session.setSessionToken(token)</span>
2050
+ <span class="cstat-no" title="statement not covered" > this.session.setUserInfo({</span>
2051
+ userBrowser,
2052
+ userCity,
2053
+ userCountry,
2054
+ userDevice,
2055
+ userOS,
2056
+ userState,
2057
+ })
2058
+ <span class="cstat-no" title="statement not covered" > this.session.assign({</span>
2059
+ sessionID,
2060
+ timestamp: startTimestamp || timestamp,
2061
+ projectID,
2062
+ })
2063
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isNewSession &amp;&amp; token === sessionToken) {</span>
2064
+ <span class="cstat-no" title="statement not covered" > console.log('continuing session on new tab', this.session.getTabId())</span>
2065
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
2066
+ <span class="cstat-no" title="statement not covered" > this.send(TabChange(this.session.getTabId()))</span>
2067
+ }
2068
+ // (Re)send Metadata for the case of a new session
2069
+ <span class="cstat-no" title="statement not covered" > Object.entries(this.session.getInfo().metadata).forEach(<span class="fstat-no" title="function not covered" >([</span>key, value]) =&gt;</span>
2070
+ <span class="cstat-no" title="statement not covered" > this.send(Metadata(key, value)),</span>
2071
+ )
2072
+ <span class="cstat-no" title="statement not covered" > this.localStorage.setItem(this.options.local_uuid_key, userUUID)</span>
2073
+ &nbsp;
2074
+ <span class="cstat-no" title="statement not covered" > this.worker.postMessage({</span>
2075
+ type: 'auth',
2076
+ token,
2077
+ beaconSizeLimit,
2078
+ })
2079
+ &nbsp;
2080
+ <span class="cstat-no" title="statement not covered" > this.compressionThreshold = compressionThreshold</span>
2081
+ &nbsp;
2082
+ const onStartInfo = <span class="cstat-no" title="statement not covered" >{ sessionToken: token, userUUID, sessionID }</span>
2083
+ &nbsp;
2084
+ // TODO: start as early as possible (before receiving the token)
2085
+ <span class="cstat-no" title="statement not covered" > this.startCallbacks.forEach(<span class="fstat-no" title="function not covered" >(c</span>b) =&gt; <span class="cstat-no" title="statement not covered" >cb(onStartInfo))</span> /</span>/ MBTODO: callbacks after DOM "mounted" (observed)
2086
+ <span class="cstat-no" title="statement not covered" > this.observer.observe()</span>
2087
+ <span class="cstat-no" title="statement not covered" > this.ticker.start()</span>
2088
+ <span class="cstat-no" title="statement not covered" > this.activityState = ActivityState.Active</span>
2089
+ &nbsp;
2090
+ <span class="cstat-no" title="statement not covered" > this.notify.log('OpenReplay tracking started.')</span>
2091
+ // get rid of onStart ?
2092
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof this.options.onStart === 'function') {</span>
2093
+ <span class="cstat-no" title="statement not covered" > this.options.onStart(onStartInfo)</span>
2094
+ }
2095
+ <span class="cstat-no" title="statement not covered" > this.restartAttempts = 0</span>
2096
+ <span class="cstat-no" title="statement not covered" > return SuccessfulStart(onStartInfo)</span>
2097
+ })
2098
+ .catch(<span class="fstat-no" title="function not covered" >(r</span>eason) =&gt; {
2099
+ <span class="cstat-no" title="statement not covered" > this.stop()</span>
2100
+ <span class="cstat-no" title="statement not covered" > this.session.reset()</span>
2101
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (reason === CANCELED) {</span>
2102
+ <span class="cstat-no" title="statement not covered" > return UnsuccessfulStart(CANCELED)</span>
2103
+ }
2104
+ &nbsp;
2105
+ <span class="cstat-no" title="statement not covered" > this.notify.log('OpenReplay was unable to start. ', reason)</span>
2106
+ <span class="cstat-no" title="statement not covered" > this._debug('session_start', reason)</span>
2107
+ <span class="cstat-no" title="statement not covered" > return UnsuccessfulStart(START_ERROR)</span>
2108
+ })
2109
+ }
2110
+ &nbsp;
2111
+ /**
2112
+ * basically we ask other tabs during constructor
2113
+ * and here we just apply 10ms delay just in case
2114
+ * */
2115
+ <span class="fstat-no" title="function not covered" > start(</span>...args: Parameters&lt;App['_start']&gt;): Promise&lt;StartPromiseReturn&gt; {
2116
+ <span class="cstat-no" title="statement not covered" > if (!document.hidden) {</span>
2117
+ <span class="cstat-no" title="statement not covered" > return new Promise(<span class="fstat-no" title="function not covered" >(r</span>esolve) =&gt; {</span>
2118
+ <span class="cstat-no" title="statement not covered" > setTimeout(<span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
2119
+ <span class="cstat-no" title="statement not covered" > resolve(this._start(...args))</span>
2120
+ }, 10)
2121
+ })
2122
+ } else {
2123
+ <span class="cstat-no" title="statement not covered" > return new Promise(<span class="fstat-no" title="function not covered" >(r</span>esolve) =&gt; {</span>
2124
+ const onVisibilityChange = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
2125
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!document.hidden) {</span>
2126
+ <span class="cstat-no" title="statement not covered" > document.removeEventListener('visibilitychange', onVisibilityChange)</span>
2127
+ <span class="cstat-no" title="statement not covered" > setTimeout(<span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
2128
+ <span class="cstat-no" title="statement not covered" > resolve(this._start(...args))</span>
2129
+ }, 10)
2130
+ }
2131
+ }
2132
+ <span class="cstat-no" title="statement not covered" > document.addEventListener('visibilitychange', onVisibilityChange)</span>
2133
+ })
2134
+ }
2135
+ }
2136
+ &nbsp;
2137
+ <span class="fstat-no" title="function not covered" > forceFlushBatch(</span>) {
2138
+ <span class="cstat-no" title="statement not covered" > this.worker?.postMessage('forceFlushBatch')</span>
2139
+ }
2140
+ &nbsp;
2141
+ <span class="fstat-no" title="function not covered" > getTabId(</span>) {
2142
+ <span class="cstat-no" title="statement not covered" > return this.session.getTabId()</span>
2143
+ }
2144
+ <span class="fstat-no" title="function not covered" > stop(</span>stopWorker = <span class="branch-0 cbranch-no" title="branch not covered" >true)</span>: void {
2145
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.activityState !== ActivityState.NotActive) {</span>
2146
+ <span class="cstat-no" title="statement not covered" > try {</span>
2147
+ <span class="cstat-no" title="statement not covered" > this.attributeSender.clear()</span>
2148
+ <span class="cstat-no" title="statement not covered" > this.sanitizer.clear()</span>
2149
+ <span class="cstat-no" title="statement not covered" > this.observer.disconnect()</span>
2150
+ <span class="cstat-no" title="statement not covered" > this.nodes.clear()</span>
2151
+ <span class="cstat-no" title="statement not covered" > this.ticker.stop()</span>
2152
+ <span class="cstat-no" title="statement not covered" > this.stopCallbacks.forEach(<span class="fstat-no" title="function not covered" >(c</span>b) =&gt; <span class="cstat-no" title="statement not covered" >cb())</span></span>
2153
+ <span class="cstat-no" title="statement not covered" > this.notify.log('OpenReplay tracking stopped.')</span>
2154
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.worker &amp;&amp; stopWorker) {</span>
2155
+ <span class="cstat-no" title="statement not covered" > this.worker.postMessage('stop')</span>
2156
+ }
2157
+ } finally {
2158
+ <span class="cstat-no" title="statement not covered" > this.activityState = ActivityState.NotActive</span>
2159
+ }
2160
+ }
2161
+ }
2162
+ }
2163
+ &nbsp;</pre></td></tr></table></pre>
2164
+
2165
+ <div class='push'></div><!-- for sticky footer -->
2166
+ </div><!-- /wrapper -->
2167
+ <div class='footer quiet pad2 space-top1 center small'>
2168
+ Code coverage generated by
2169
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2170
+ at 2023-10-17T13:37:58.420Z
2171
+ </div>
2172
+ <script src="../../prettify.js"></script>
2173
+ <script>
2174
+ window.onload = function () {
2175
+ prettyPrint();
2176
+ };
2177
+ </script>
2178
+ <script src="../../sorter.js"></script>
2179
+ <script src="../../block-navigation.js"></script>
2180
+ </body>
2181
+ </html>
2182
+