@openreplay/tracker 7.0.2-beta.2 → 7.0.3

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 (86) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/cjs/app/index.js +18 -23
  3. package/cjs/app/observer/iframe_offsets.js +4 -2
  4. package/cjs/app/observer/observer.js +1 -1
  5. package/cjs/index.js +1 -1
  6. package/cjs/modules/axiosSpy.d.ts +1 -0
  7. package/cjs/modules/axiosSpy.js +29 -5
  8. package/cjs/modules/constructedStyleSheets.js +2 -5
  9. package/cjs/modules/mouse.js +12 -21
  10. package/cjs/modules/network.js +13 -11
  11. package/cjs/utils.js +2 -1
  12. package/coverage/clover.xml +2461 -0
  13. package/coverage/coverage-final.json +38 -0
  14. package/coverage/lcov-report/base.css +224 -0
  15. package/coverage/lcov-report/block-navigation.js +87 -0
  16. package/coverage/lcov-report/favicon.png +0 -0
  17. package/coverage/lcov-report/index.html +176 -0
  18. package/coverage/lcov-report/main/app/guards.ts.html +229 -0
  19. package/coverage/lcov-report/main/app/index.html +206 -0
  20. package/coverage/lcov-report/main/app/index.ts.html +2053 -0
  21. package/coverage/lcov-report/main/app/logger.ts.html +277 -0
  22. package/coverage/lcov-report/main/app/messages.gen.ts.html +2752 -0
  23. package/coverage/lcov-report/main/app/nodes.ts.html +367 -0
  24. package/coverage/lcov-report/main/app/observer/iframe_observer.ts.html +148 -0
  25. package/coverage/lcov-report/main/app/observer/iframe_offsets.ts.html +289 -0
  26. package/coverage/lcov-report/main/app/observer/index.html +161 -0
  27. package/coverage/lcov-report/main/app/observer/observer.ts.html +1282 -0
  28. package/coverage/lcov-report/main/app/observer/shadow_root_observer.ts.html +142 -0
  29. package/coverage/lcov-report/main/app/observer/top_observer.ts.html +535 -0
  30. package/coverage/lcov-report/main/app/sanitizer.ts.html +394 -0
  31. package/coverage/lcov-report/main/app/session.ts.html +559 -0
  32. package/coverage/lcov-report/main/app/ticker.ts.html +250 -0
  33. package/coverage/lcov-report/main/index.html +131 -0
  34. package/coverage/lcov-report/main/index.ts.html +1012 -0
  35. package/coverage/lcov-report/main/modules/axiosSpy.ts.html +700 -0
  36. package/coverage/lcov-report/main/modules/connection.ts.html +160 -0
  37. package/coverage/lcov-report/main/modules/console.ts.html +508 -0
  38. package/coverage/lcov-report/main/modules/constructedStyleSheets.ts.html +559 -0
  39. package/coverage/lcov-report/main/modules/cssrules.ts.html +418 -0
  40. package/coverage/lcov-report/main/modules/exception.ts.html +385 -0
  41. package/coverage/lcov-report/main/modules/focus.ts.html +220 -0
  42. package/coverage/lcov-report/main/modules/fonts.ts.html +289 -0
  43. package/coverage/lcov-report/main/modules/img.ts.html +433 -0
  44. package/coverage/lcov-report/main/modules/index.html +371 -0
  45. package/coverage/lcov-report/main/modules/input.ts.html +811 -0
  46. package/coverage/lcov-report/main/modules/mouse.ts.html +826 -0
  47. package/coverage/lcov-report/main/modules/network.ts.html +1129 -0
  48. package/coverage/lcov-report/main/modules/performance.ts.html +367 -0
  49. package/coverage/lcov-report/main/modules/scroll.ts.html +364 -0
  50. package/coverage/lcov-report/main/modules/selection.ts.html +202 -0
  51. package/coverage/lcov-report/main/modules/tabs.ts.html +124 -0
  52. package/coverage/lcov-report/main/modules/timing.ts.html +841 -0
  53. package/coverage/lcov-report/main/modules/viewport.ts.html +250 -0
  54. package/coverage/lcov-report/main/utils.ts.html +406 -0
  55. package/coverage/lcov-report/main/vendors/finder/finder.ts.html +1381 -0
  56. package/coverage/lcov-report/main/vendors/finder/index.html +116 -0
  57. package/coverage/lcov-report/prettify.css +1 -0
  58. package/coverage/lcov-report/prettify.js +2 -0
  59. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  60. package/coverage/lcov-report/sorter.js +196 -0
  61. package/coverage/lcov-report/webworker/BatchWriter.ts.html +532 -0
  62. package/coverage/lcov-report/webworker/MessageEncoder.gen.ts.html +949 -0
  63. package/coverage/lcov-report/webworker/PrimitiveEncoder.ts.html +436 -0
  64. package/coverage/lcov-report/webworker/QueueSender.ts.html +475 -0
  65. package/coverage/lcov-report/webworker/StringDictionary.ts.html +124 -0
  66. package/coverage/lcov-report/webworker/index.html +191 -0
  67. package/coverage/lcov-report/webworker/index.ts.html +592 -0
  68. package/coverage/lcov.info +4882 -0
  69. package/jest.config.js +2 -0
  70. package/lib/app/index.js +18 -23
  71. package/lib/app/observer/iframe_offsets.js +4 -2
  72. package/lib/app/observer/observer.js +1 -1
  73. package/lib/common/tsconfig.tsbuildinfo +1 -1
  74. package/lib/index.js +1 -1
  75. package/lib/modules/axiosSpy.d.ts +1 -0
  76. package/lib/modules/axiosSpy.js +29 -5
  77. package/lib/modules/constructedStyleSheets.js +2 -5
  78. package/lib/modules/mouse.js +12 -21
  79. package/lib/modules/network.js +13 -11
  80. package/lib/utils.js +2 -1
  81. package/package.json +2 -3
  82. package/tsconfig-base.json +2 -2
  83. package/cjs/vendors/finder/finder.d.ts +0 -12
  84. package/cjs/vendors/finder/finder.js +0 -352
  85. package/lib/vendors/finder/finder.d.ts +0 -12
  86. package/lib/vendors/finder/finder.js +0 -348
@@ -0,0 +1,1282 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for main/app/observer/observer.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/observer</a> observer.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/203</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/105</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/19</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/199</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></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
466
+ <span class="cline-any cline-neutral">&nbsp;</span>
467
+ <span class="cline-any cline-neutral">&nbsp;</span>
468
+ <span class="cline-any cline-neutral">&nbsp;</span>
469
+ <span class="cline-any cline-neutral">&nbsp;</span>
470
+ <span class="cline-any cline-neutral">&nbsp;</span>
471
+ <span class="cline-any cline-neutral">&nbsp;</span>
472
+ <span class="cline-any cline-neutral">&nbsp;</span>
473
+ <span class="cline-any cline-neutral">&nbsp;</span>
474
+ <span class="cline-any cline-neutral">&nbsp;</span>
475
+ <span class="cline-any cline-neutral">&nbsp;</span>
476
+ <span class="cline-any cline-neutral">&nbsp;</span>
477
+ <span class="cline-any cline-neutral">&nbsp;</span>
478
+ <span class="cline-any cline-no">&nbsp;</span>
479
+ <span class="cline-any cline-neutral">&nbsp;</span>
480
+ <span class="cline-any cline-neutral">&nbsp;</span>
481
+ <span class="cline-any cline-neutral">&nbsp;</span>
482
+ <span class="cline-any cline-neutral">&nbsp;</span>
483
+ <span class="cline-any cline-neutral">&nbsp;</span>
484
+ <span class="cline-any cline-neutral">&nbsp;</span>
485
+ <span class="cline-any cline-neutral">&nbsp;</span>
486
+ <span class="cline-any cline-neutral">&nbsp;</span>
487
+ <span class="cline-any cline-neutral">&nbsp;</span>
488
+ <span class="cline-any cline-no">&nbsp;</span>
489
+ <span class="cline-any cline-no">&nbsp;</span>
490
+ <span class="cline-any cline-neutral">&nbsp;</span>
491
+ <span class="cline-any cline-no">&nbsp;</span>
492
+ <span class="cline-any cline-no">&nbsp;</span>
493
+ <span class="cline-any cline-neutral">&nbsp;</span>
494
+ <span class="cline-any cline-no">&nbsp;</span>
495
+ <span class="cline-any cline-no">&nbsp;</span>
496
+ <span class="cline-any cline-neutral">&nbsp;</span>
497
+ <span class="cline-any cline-no">&nbsp;</span>
498
+ <span class="cline-any cline-no">&nbsp;</span>
499
+ <span class="cline-any cline-no">&nbsp;</span>
500
+ <span class="cline-any cline-no">&nbsp;</span>
501
+ <span class="cline-any cline-no">&nbsp;</span>
502
+ <span class="cline-any cline-neutral">&nbsp;</span>
503
+ <span class="cline-any cline-no">&nbsp;</span>
504
+ <span class="cline-any cline-neutral">&nbsp;</span>
505
+ <span class="cline-any cline-neutral">&nbsp;</span>
506
+ <span class="cline-any cline-neutral">&nbsp;</span>
507
+ <span class="cline-any cline-neutral">&nbsp;</span>
508
+ <span class="cline-any cline-neutral">&nbsp;</span>
509
+ <span class="cline-any cline-no">&nbsp;</span>
510
+ <span class="cline-any cline-no">&nbsp;</span>
511
+ <span class="cline-any cline-neutral">&nbsp;</span>
512
+ <span class="cline-any cline-no">&nbsp;</span>
513
+ <span class="cline-any cline-neutral">&nbsp;</span>
514
+ <span class="cline-any cline-neutral">&nbsp;</span>
515
+ <span class="cline-any cline-neutral">&nbsp;</span>
516
+ <span class="cline-any cline-neutral">&nbsp;</span>
517
+ <span class="cline-any cline-neutral">&nbsp;</span>
518
+ <span class="cline-any cline-neutral">&nbsp;</span>
519
+ <span class="cline-any cline-neutral">&nbsp;</span>
520
+ <span class="cline-any cline-neutral">&nbsp;</span>
521
+ <span class="cline-any cline-no">&nbsp;</span>
522
+ <span class="cline-any cline-no">&nbsp;</span>
523
+ <span class="cline-any cline-no">&nbsp;</span>
524
+ <span class="cline-any cline-no">&nbsp;</span>
525
+ <span class="cline-any cline-neutral">&nbsp;</span>
526
+ <span class="cline-any cline-neutral">&nbsp;</span>
527
+ <span class="cline-any cline-no">&nbsp;</span>
528
+ <span class="cline-any cline-neutral">&nbsp;</span>
529
+ <span class="cline-any cline-no">&nbsp;</span>
530
+ <span class="cline-any cline-no">&nbsp;</span>
531
+ <span class="cline-any cline-no">&nbsp;</span>
532
+ <span class="cline-any cline-no">&nbsp;</span>
533
+ <span class="cline-any cline-no">&nbsp;</span>
534
+ <span class="cline-any cline-no">&nbsp;</span>
535
+ <span class="cline-any cline-no">&nbsp;</span>
536
+ <span class="cline-any cline-neutral">&nbsp;</span>
537
+ <span class="cline-any cline-no">&nbsp;</span>
538
+ <span class="cline-any cline-neutral">&nbsp;</span>
539
+ <span class="cline-any cline-no">&nbsp;</span>
540
+ <span class="cline-any cline-no">&nbsp;</span>
541
+ <span class="cline-any cline-neutral">&nbsp;</span>
542
+ <span class="cline-any cline-no">&nbsp;</span>
543
+ <span class="cline-any cline-no">&nbsp;</span>
544
+ <span class="cline-any cline-neutral">&nbsp;</span>
545
+ <span class="cline-any cline-no">&nbsp;</span>
546
+ <span class="cline-any cline-no">&nbsp;</span>
547
+ <span class="cline-any cline-neutral">&nbsp;</span>
548
+ <span class="cline-any cline-no">&nbsp;</span>
549
+ <span class="cline-any cline-no">&nbsp;</span>
550
+ <span class="cline-any cline-neutral">&nbsp;</span>
551
+ <span class="cline-any cline-neutral">&nbsp;</span>
552
+ <span class="cline-any cline-no">&nbsp;</span>
553
+ <span class="cline-any cline-no">&nbsp;</span>
554
+ <span class="cline-any cline-neutral">&nbsp;</span>
555
+ <span class="cline-any cline-no">&nbsp;</span>
556
+ <span class="cline-any cline-neutral">&nbsp;</span>
557
+ <span class="cline-any cline-no">&nbsp;</span>
558
+ <span class="cline-any cline-no">&nbsp;</span>
559
+ <span class="cline-any cline-no">&nbsp;</span>
560
+ <span class="cline-any cline-neutral">&nbsp;</span>
561
+ <span class="cline-any cline-no">&nbsp;</span>
562
+ <span class="cline-any cline-no">&nbsp;</span>
563
+ <span class="cline-any cline-neutral">&nbsp;</span>
564
+ <span class="cline-any cline-no">&nbsp;</span>
565
+ <span class="cline-any cline-no">&nbsp;</span>
566
+ <span class="cline-any cline-no">&nbsp;</span>
567
+ <span class="cline-any cline-no">&nbsp;</span>
568
+ <span class="cline-any cline-neutral">&nbsp;</span>
569
+ <span class="cline-any cline-no">&nbsp;</span>
570
+ <span class="cline-any cline-no">&nbsp;</span>
571
+ <span class="cline-any cline-no">&nbsp;</span>
572
+ <span class="cline-any cline-neutral">&nbsp;</span>
573
+ <span class="cline-any cline-no">&nbsp;</span>
574
+ <span class="cline-any cline-no">&nbsp;</span>
575
+ <span class="cline-any cline-neutral">&nbsp;</span>
576
+ <span class="cline-any cline-no">&nbsp;</span>
577
+ <span class="cline-any cline-no">&nbsp;</span>
578
+ <span class="cline-any cline-no">&nbsp;</span>
579
+ <span class="cline-any cline-neutral">&nbsp;</span>
580
+ <span class="cline-any cline-neutral">&nbsp;</span>
581
+ <span class="cline-any cline-no">&nbsp;</span>
582
+ <span class="cline-any cline-neutral">&nbsp;</span>
583
+ <span class="cline-any cline-neutral">&nbsp;</span>
584
+ <span class="cline-any cline-neutral">&nbsp;</span>
585
+ <span class="cline-any cline-neutral">&nbsp;</span>
586
+ <span class="cline-any cline-no">&nbsp;</span>
587
+ <span class="cline-any cline-no">&nbsp;</span>
588
+ <span class="cline-any cline-no">&nbsp;</span>
589
+ <span class="cline-any cline-no">&nbsp;</span>
590
+ <span class="cline-any cline-no">&nbsp;</span>
591
+ <span class="cline-any cline-neutral">&nbsp;</span>
592
+ <span class="cline-any cline-neutral">&nbsp;</span>
593
+ <span class="cline-any cline-neutral">&nbsp;</span>
594
+ <span class="cline-any cline-no">&nbsp;</span>
595
+ <span class="cline-any cline-no">&nbsp;</span>
596
+ <span class="cline-any cline-no">&nbsp;</span>
597
+ <span class="cline-any cline-neutral">&nbsp;</span>
598
+ <span class="cline-any cline-no">&nbsp;</span>
599
+ <span class="cline-any cline-no">&nbsp;</span>
600
+ <span class="cline-any cline-no">&nbsp;</span>
601
+ <span class="cline-any cline-no">&nbsp;</span>
602
+ <span class="cline-any cline-no">&nbsp;</span>
603
+ <span class="cline-any cline-neutral">&nbsp;</span>
604
+ <span class="cline-any cline-no">&nbsp;</span>
605
+ <span class="cline-any cline-neutral">&nbsp;</span>
606
+ <span class="cline-any cline-no">&nbsp;</span>
607
+ <span class="cline-any cline-neutral">&nbsp;</span>
608
+ <span class="cline-any cline-no">&nbsp;</span>
609
+ <span class="cline-any cline-neutral">&nbsp;</span>
610
+ <span class="cline-any cline-no">&nbsp;</span>
611
+ <span class="cline-any cline-neutral">&nbsp;</span>
612
+ <span class="cline-any cline-neutral">&nbsp;</span>
613
+ <span class="cline-any cline-neutral">&nbsp;</span>
614
+ <span class="cline-any cline-neutral">&nbsp;</span>
615
+ <span class="cline-any cline-neutral">&nbsp;</span>
616
+ <span class="cline-any cline-neutral">&nbsp;</span>
617
+ <span class="cline-any cline-neutral">&nbsp;</span>
618
+ <span class="cline-any cline-no">&nbsp;</span>
619
+ <span class="cline-any cline-neutral">&nbsp;</span>
620
+ <span class="cline-any cline-no">&nbsp;</span>
621
+ <span class="cline-any cline-neutral">&nbsp;</span>
622
+ <span class="cline-any cline-neutral">&nbsp;</span>
623
+ <span class="cline-any cline-neutral">&nbsp;</span>
624
+ <span class="cline-any cline-neutral">&nbsp;</span>
625
+ <span class="cline-any cline-neutral">&nbsp;</span>
626
+ <span class="cline-any cline-neutral">&nbsp;</span>
627
+ <span class="cline-any cline-no">&nbsp;</span>
628
+ <span class="cline-any cline-neutral">&nbsp;</span>
629
+ <span class="cline-any cline-no">&nbsp;</span>
630
+ <span class="cline-any cline-no">&nbsp;</span>
631
+ <span class="cline-any cline-no">&nbsp;</span>
632
+ <span class="cline-any cline-neutral">&nbsp;</span>
633
+ <span class="cline-any cline-no">&nbsp;</span>
634
+ <span class="cline-any cline-no">&nbsp;</span>
635
+ <span class="cline-any cline-no">&nbsp;</span>
636
+ <span class="cline-any cline-neutral">&nbsp;</span>
637
+ <span class="cline-any cline-no">&nbsp;</span>
638
+ <span class="cline-any cline-no">&nbsp;</span>
639
+ <span class="cline-any cline-neutral">&nbsp;</span>
640
+ <span class="cline-any cline-no">&nbsp;</span>
641
+ <span class="cline-any cline-neutral">&nbsp;</span>
642
+ <span class="cline-any cline-neutral">&nbsp;</span>
643
+ <span class="cline-any cline-neutral">&nbsp;</span>
644
+ <span class="cline-any cline-no">&nbsp;</span>
645
+ <span class="cline-any cline-no">&nbsp;</span>
646
+ <span class="cline-any cline-no">&nbsp;</span>
647
+ <span class="cline-any cline-neutral">&nbsp;</span>
648
+ <span class="cline-any cline-no">&nbsp;</span>
649
+ <span class="cline-any cline-no">&nbsp;</span>
650
+ <span class="cline-any cline-neutral">&nbsp;</span>
651
+ <span class="cline-any cline-neutral">&nbsp;</span>
652
+ <span class="cline-any cline-neutral">&nbsp;</span>
653
+ <span class="cline-any cline-no">&nbsp;</span>
654
+ <span class="cline-any cline-no">&nbsp;</span>
655
+ <span class="cline-any cline-no">&nbsp;</span>
656
+ <span class="cline-any cline-no">&nbsp;</span>
657
+ <span class="cline-any cline-no">&nbsp;</span>
658
+ <span class="cline-any cline-neutral">&nbsp;</span>
659
+ <span class="cline-any cline-neutral">&nbsp;</span>
660
+ <span class="cline-any cline-neutral">&nbsp;</span>
661
+ <span class="cline-any cline-neutral">&nbsp;</span>
662
+ <span class="cline-any cline-no">&nbsp;</span>
663
+ <span class="cline-any cline-no">&nbsp;</span>
664
+ <span class="cline-any cline-neutral">&nbsp;</span>
665
+ <span class="cline-any cline-no">&nbsp;</span>
666
+ <span class="cline-any cline-no">&nbsp;</span>
667
+ <span class="cline-any cline-neutral">&nbsp;</span>
668
+ <span class="cline-any cline-neutral">&nbsp;</span>
669
+ <span class="cline-any cline-neutral">&nbsp;</span>
670
+ <span class="cline-any cline-neutral">&nbsp;</span>
671
+ <span class="cline-any cline-no">&nbsp;</span>
672
+ <span class="cline-any cline-neutral">&nbsp;</span>
673
+ <span class="cline-any cline-neutral">&nbsp;</span>
674
+ <span class="cline-any cline-neutral">&nbsp;</span>
675
+ <span class="cline-any cline-neutral">&nbsp;</span>
676
+ <span class="cline-any cline-neutral">&nbsp;</span>
677
+ <span class="cline-any cline-neutral">&nbsp;</span>
678
+ <span class="cline-any cline-no">&nbsp;</span>
679
+ <span class="cline-any cline-no">&nbsp;</span>
680
+ <span class="cline-any cline-neutral">&nbsp;</span>
681
+ <span class="cline-any cline-neutral">&nbsp;</span>
682
+ <span class="cline-any cline-neutral">&nbsp;</span>
683
+ <span class="cline-any cline-neutral">&nbsp;</span>
684
+ <span class="cline-any cline-no">&nbsp;</span>
685
+ <span class="cline-any cline-no">&nbsp;</span>
686
+ <span class="cline-any cline-neutral">&nbsp;</span>
687
+ <span class="cline-any cline-no">&nbsp;</span>
688
+ <span class="cline-any cline-neutral">&nbsp;</span>
689
+ <span class="cline-any cline-neutral">&nbsp;</span>
690
+ <span class="cline-any cline-no">&nbsp;</span>
691
+ <span class="cline-any cline-neutral">&nbsp;</span>
692
+ <span class="cline-any cline-neutral">&nbsp;</span>
693
+ <span class="cline-any cline-neutral">&nbsp;</span>
694
+ <span class="cline-any cline-neutral">&nbsp;</span>
695
+ <span class="cline-any cline-no">&nbsp;</span>
696
+ <span class="cline-any cline-neutral">&nbsp;</span>
697
+ <span class="cline-any cline-neutral">&nbsp;</span>
698
+ <span class="cline-any cline-neutral">&nbsp;</span>
699
+ <span class="cline-any cline-neutral">&nbsp;</span>
700
+ <span class="cline-any cline-neutral">&nbsp;</span>
701
+ <span class="cline-any cline-neutral">&nbsp;</span>
702
+ <span class="cline-any cline-neutral">&nbsp;</span>
703
+ <span class="cline-any cline-no">&nbsp;</span>
704
+ <span class="cline-any cline-no">&nbsp;</span>
705
+ <span class="cline-any cline-neutral">&nbsp;</span>
706
+ <span class="cline-any cline-no">&nbsp;</span>
707
+ <span class="cline-any cline-no">&nbsp;</span>
708
+ <span class="cline-any cline-no">&nbsp;</span>
709
+ <span class="cline-any cline-neutral">&nbsp;</span>
710
+ <span class="cline-any cline-neutral">&nbsp;</span>
711
+ <span class="cline-any cline-no">&nbsp;</span>
712
+ <span class="cline-any cline-no">&nbsp;</span>
713
+ <span class="cline-any cline-no">&nbsp;</span>
714
+ <span class="cline-any cline-neutral">&nbsp;</span>
715
+ <span class="cline-any cline-neutral">&nbsp;</span>
716
+ <span class="cline-any cline-neutral">&nbsp;</span>
717
+ <span class="cline-any cline-neutral">&nbsp;</span>
718
+ <span class="cline-any cline-neutral">&nbsp;</span>
719
+ <span class="cline-any cline-neutral">&nbsp;</span>
720
+ <span class="cline-any cline-no">&nbsp;</span>
721
+ <span class="cline-any cline-no">&nbsp;</span>
722
+ <span class="cline-any cline-neutral">&nbsp;</span>
723
+ <span class="cline-any cline-no">&nbsp;</span>
724
+ <span class="cline-any cline-neutral">&nbsp;</span>
725
+ <span class="cline-any cline-neutral">&nbsp;</span>
726
+ <span class="cline-any cline-neutral">&nbsp;</span>
727
+ <span class="cline-any cline-neutral">&nbsp;</span>
728
+ <span class="cline-any cline-neutral">&nbsp;</span>
729
+ <span class="cline-any cline-no">&nbsp;</span>
730
+ <span class="cline-any cline-no">&nbsp;</span>
731
+ <span class="cline-any cline-neutral">&nbsp;</span>
732
+ <span class="cline-any cline-neutral">&nbsp;</span>
733
+ <span class="cline-any cline-no">&nbsp;</span>
734
+ <span class="cline-any cline-no">&nbsp;</span>
735
+ <span class="cline-any cline-neutral">&nbsp;</span>
736
+ <span class="cline-any cline-no">&nbsp;</span>
737
+ <span class="cline-any cline-no">&nbsp;</span>
738
+ <span class="cline-any cline-no">&nbsp;</span>
739
+ <span class="cline-any cline-no">&nbsp;</span>
740
+ <span class="cline-any cline-neutral">&nbsp;</span>
741
+ <span class="cline-any cline-no">&nbsp;</span>
742
+ <span class="cline-any cline-no">&nbsp;</span>
743
+ <span class="cline-any cline-no">&nbsp;</span>
744
+ <span class="cline-any cline-neutral">&nbsp;</span>
745
+ <span class="cline-any cline-no">&nbsp;</span>
746
+ <span class="cline-any cline-no">&nbsp;</span>
747
+ <span class="cline-any cline-no">&nbsp;</span>
748
+ <span class="cline-any cline-neutral">&nbsp;</span>
749
+ <span class="cline-any cline-neutral">&nbsp;</span>
750
+ <span class="cline-any cline-neutral">&nbsp;</span>
751
+ <span class="cline-any cline-no">&nbsp;</span>
752
+ <span class="cline-any cline-no">&nbsp;</span>
753
+ <span class="cline-any cline-no">&nbsp;</span>
754
+ <span class="cline-any cline-no">&nbsp;</span>
755
+ <span class="cline-any cline-no">&nbsp;</span>
756
+ <span class="cline-any cline-no">&nbsp;</span>
757
+ <span class="cline-any cline-no">&nbsp;</span>
758
+ <span class="cline-any cline-neutral">&nbsp;</span>
759
+ <span class="cline-any cline-no">&nbsp;</span>
760
+ <span class="cline-any cline-neutral">&nbsp;</span>
761
+ <span class="cline-any cline-no">&nbsp;</span>
762
+ <span class="cline-any cline-no">&nbsp;</span>
763
+ <span class="cline-any cline-neutral">&nbsp;</span>
764
+ <span class="cline-any cline-no">&nbsp;</span>
765
+ <span class="cline-any cline-no">&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-neutral">&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-no">&nbsp;</span>
778
+ <span class="cline-any cline-neutral">&nbsp;</span>
779
+ <span class="cline-any cline-no">&nbsp;</span>
780
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
784
+ <span class="cline-any cline-neutral">&nbsp;</span>
785
+ <span class="cline-any cline-no">&nbsp;</span>
786
+ <span class="cline-any cline-no">&nbsp;</span>
787
+ <span class="cline-any cline-no">&nbsp;</span>
788
+ <span class="cline-any cline-neutral">&nbsp;</span>
789
+ <span class="cline-any cline-no">&nbsp;</span>
790
+ <span class="cline-any cline-neutral">&nbsp;</span>
791
+ <span class="cline-any cline-no">&nbsp;</span>
792
+ <span class="cline-any cline-no">&nbsp;</span>
793
+ <span class="cline-any cline-neutral">&nbsp;</span>
794
+ <span class="cline-any cline-no">&nbsp;</span>
795
+ <span class="cline-any cline-neutral">&nbsp;</span>
796
+ <span class="cline-any cline-no">&nbsp;</span>
797
+ <span class="cline-any cline-no">&nbsp;</span>
798
+ <span class="cline-any cline-neutral">&nbsp;</span>
799
+ <span class="cline-any cline-no">&nbsp;</span>
800
+ <span class="cline-any cline-no">&nbsp;</span>
801
+ <span class="cline-any cline-no">&nbsp;</span>
802
+ <span class="cline-any cline-no">&nbsp;</span>
803
+ <span class="cline-any cline-neutral">&nbsp;</span>
804
+ <span class="cline-any cline-no">&nbsp;</span>
805
+ <span class="cline-any cline-no">&nbsp;</span>
806
+ <span class="cline-any cline-neutral">&nbsp;</span>
807
+ <span class="cline-any cline-neutral">&nbsp;</span>
808
+ <span class="cline-any cline-no">&nbsp;</span>
809
+ <span class="cline-any cline-no">&nbsp;</span>
810
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
814
+ <span class="cline-any cline-neutral">&nbsp;</span>
815
+ <span class="cline-any cline-no">&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-no">&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-no">&nbsp;</span>
823
+ <span class="cline-any cline-no">&nbsp;</span>
824
+ <span class="cline-any cline-no">&nbsp;</span>
825
+ <span class="cline-any cline-neutral">&nbsp;</span>
826
+ <span class="cline-any cline-no">&nbsp;</span>
827
+ <span class="cline-any cline-neutral">&nbsp;</span>
828
+ <span class="cline-any cline-neutral">&nbsp;</span>
829
+ <span class="cline-any cline-neutral">&nbsp;</span>
830
+ <span class="cline-any cline-no">&nbsp;</span>
831
+ <span class="cline-any cline-no">&nbsp;</span>
832
+ <span class="cline-any cline-no">&nbsp;</span>
833
+ <span class="cline-any cline-no">&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-no">&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-no">&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-no">&nbsp;</span>
855
+ <span class="cline-any cline-no">&nbsp;</span>
856
+ <span class="cline-any cline-no">&nbsp;</span>
857
+ <span class="cline-any cline-neutral">&nbsp;</span>
858
+ <span class="cline-any cline-neutral">&nbsp;</span>
859
+ <span class="cline-any cline-neutral">&nbsp;</span>
860
+ <span class="cline-any cline-no">&nbsp;</span>
861
+ <span class="cline-any cline-no">&nbsp;</span>
862
+ <span class="cline-any cline-neutral">&nbsp;</span>
863
+ <span class="cline-any cline-neutral">&nbsp;</span>
864
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import {</span>
865
+ RemoveNodeAttribute,
866
+ SetNodeAttribute,
867
+ SetNodeAttributeURLBased,
868
+ SetCSSDataURLBased,
869
+ SetNodeData,
870
+ CreateTextNode,
871
+ CreateElementNode,
872
+ MoveNode,
873
+ RemoveNode,
874
+ UnbindNodes,
875
+ } from '../messages.gen.js'
876
+ import App from '../index.js'
877
+ <span class="cstat-no" title="statement not covered" >import {</span>
878
+ isRootNode,
879
+ isTextNode,
880
+ isElementNode,
881
+ isSVGElement,
882
+ hasTag,
883
+ isCommentNode,
884
+ } from '../guards.js'
885
+ &nbsp;
886
+ function <span class="fstat-no" title="function not covered" >isIgnored(</span>node: Node): boolean {
887
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (isCommentNode(node)) {</span>
888
+ <span class="cstat-no" title="statement not covered" > return true</span>
889
+ }
890
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (isTextNode(node)) {</span>
891
+ <span class="cstat-no" title="statement not covered" > return false</span>
892
+ }
893
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isElementNode(node)) {</span>
894
+ <span class="cstat-no" title="statement not covered" > return true</span>
895
+ }
896
+ const tag = <span class="cstat-no" title="statement not covered" >node.tagName.toUpperCase()</span>
897
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (tag === 'LINK') {</span>
898
+ const rel = <span class="cstat-no" title="statement not covered" >node.getAttribute('rel')</span>
899
+ const as = <span class="cstat-no" title="statement not covered" >node.getAttribute('as')</span>
900
+ <span class="cstat-no" title="statement not covered" > return !(rel?.includes('stylesheet') || as === 'style' || as === 'font')</span>
901
+ }
902
+ <span class="cstat-no" title="statement not covered" > return (</span>
903
+ tag === 'SCRIPT' || tag === 'NOSCRIPT' || tag === 'META' || tag === 'TITLE' || tag === 'BASE'
904
+ )
905
+ }
906
+ &nbsp;
907
+ function <span class="fstat-no" title="function not covered" >isObservable(</span>node: Node): boolean {
908
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (isRootNode(node)) {</span>
909
+ <span class="cstat-no" title="statement not covered" > return true</span>
910
+ }
911
+ <span class="cstat-no" title="statement not covered" > return !isIgnored(node)</span>
912
+ }
913
+ &nbsp;
914
+ /*
915
+ TODO:
916
+ - fix unbinding logic + send all removals first (ensure sequence is correct)
917
+ - use document as a 0-node in the upper context (should be updated in player at first)
918
+ */
919
+ &nbsp;
920
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >enum R</span>ecentsType {</span>
921
+ <span class="cstat-no" title="statement not covered" > New,</span>
922
+ <span class="cstat-no" title="statement not covered" > Removed,</span>
923
+ <span class="cstat-no" title="statement not covered" > Changed,</span>
924
+ }
925
+ &nbsp;
926
+ <span class="cstat-no" title="statement not covered" >export default abstract class O</span>bserver {
927
+ private readonly observer: MutationObserver
928
+ private readonly <span class="cstat-no" title="statement not covered" >commited: Array&lt;boolean | undefined&gt; = []</span>
929
+ private readonly <span class="cstat-no" title="statement not covered" >recents: Map&lt;number, RecentsType&gt; = new Map()</span>
930
+ private readonly <span class="cstat-no" title="statement not covered" >indexes: Array&lt;number&gt; = []</span>
931
+ private readonly <span class="cstat-no" title="statement not covered" >attributesMap: Map&lt;number, Set&lt;string&gt;&gt; = new Map()</span>
932
+ private readonly <span class="cstat-no" title="statement not covered" >textSet: Set&lt;number&gt; = new Set()</span>
933
+ <span class="fstat-no" title="function not covered" > constructor(protected readonly <span class="cstat-no" title="statement not covered" >a</span>pp: App,</span> protected readonly <span class="cstat-no" title="statement not covered" >isTopContext = <span class="branch-0 cbranch-no" title="branch not covered" >f</span>alse)</span> {
934
+ <span class="cstat-no" title="statement not covered" > this.observer = new MutationObserver(</span>
935
+ this.app.safe(<span class="fstat-no" title="function not covered" >(m</span>utations) =&gt; {
936
+ <span class="cstat-no" title="statement not covered" > for (const mutation of mutations) {</span>
937
+ // mutations order is sequential
938
+ const target = <span class="cstat-no" title="statement not covered" >mutation.target</span>
939
+ const type = <span class="cstat-no" title="statement not covered" >mutation.type</span>
940
+ &nbsp;
941
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isObservable(target)) {</span>
942
+ <span class="cstat-no" title="statement not covered" > continue</span>
943
+ }
944
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (type === 'childList') {</span>
945
+ <span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >0;</span> i &lt; mutation.removedNodes.length; i++) {</span>
946
+ // Should be the same as bindTree(mutation.removedNodes[i]), but logic needs to be be untied
947
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (isObservable(mutation.removedNodes[i])) {</span>
948
+ <span class="cstat-no" title="statement not covered" > this.bindNode(mutation.removedNodes[i])</span>
949
+ }
950
+ }
951
+ <span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >0;</span> i &lt; mutation.addedNodes.length; i++) {</span>
952
+ <span class="cstat-no" title="statement not covered" > this.bindTree(mutation.addedNodes[i])</span>
953
+ }
954
+ <span class="cstat-no" title="statement not covered" > continue</span>
955
+ }
956
+ const id = <span class="cstat-no" title="statement not covered" >this.app.nodes.getID(target)</span>
957
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (id === undefined) {</span>
958
+ <span class="cstat-no" title="statement not covered" > continue</span>
959
+ }
960
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.recents.has(id)) {</span>
961
+ <span class="cstat-no" title="statement not covered" > this.recents.set(id, RecentsType.Changed) /</span>/ TODO only when altered
962
+ }
963
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (type === 'attributes') {</span>
964
+ const name = <span class="cstat-no" title="statement not covered" >mutation.attributeName</span>
965
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (name === null) {</span>
966
+ <span class="cstat-no" title="statement not covered" > continue</span>
967
+ }
968
+ let attr = <span class="cstat-no" title="statement not covered" >this.attributesMap.get(id)</span>
969
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (attr === undefined) {</span>
970
+ <span class="cstat-no" title="statement not covered" > this.attributesMap.set(id, (attr = new Set()))</span>
971
+ }
972
+ <span class="cstat-no" title="statement not covered" > attr.add(name)</span>
973
+ <span class="cstat-no" title="statement not covered" > continue</span>
974
+ }
975
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (type === 'characterData') {</span>
976
+ <span class="cstat-no" title="statement not covered" > this.textSet.add(id)</span>
977
+ <span class="cstat-no" title="statement not covered" > continue</span>
978
+ }
979
+ }
980
+ <span class="cstat-no" title="statement not covered" > this.commitNodes()</span>
981
+ }),
982
+ )
983
+ }
984
+ private <span class="fstat-no" title="function not covered" >clear(</span>): void {
985
+ <span class="cstat-no" title="statement not covered" > this.commited.length = 0</span>
986
+ <span class="cstat-no" title="statement not covered" > this.recents.clear()</span>
987
+ <span class="cstat-no" title="statement not covered" > this.indexes.length = 1</span>
988
+ <span class="cstat-no" title="statement not covered" > this.attributesMap.clear()</span>
989
+ <span class="cstat-no" title="statement not covered" > this.textSet.clear()</span>
990
+ }
991
+ &nbsp;
992
+ private <span class="fstat-no" title="function not covered" >sendNodeAttribute(</span>id: number, node: Element, name: string, value: string | null): void {
993
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (isSVGElement(node)) {</span>
994
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (name.substr(0, 6) === 'xlink:') {</span>
995
+ <span class="cstat-no" title="statement not covered" > name = name.substr(6)</span>
996
+ }
997
+ <span class="cstat-no" title="statement not covered" > if (value === null) {</span>
998
+ <span class="cstat-no" title="statement not covered" > this.app.send(RemoveNodeAttribute(id, name))</span>
999
+ } else <span class="cstat-no" title="statement not covered" >if (name === 'href') {</span>
1000
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (value.length &gt; 1e5) {</span>
1001
+ <span class="cstat-no" title="statement not covered" > value = ''</span>
1002
+ }
1003
+ <span class="cstat-no" title="statement not covered" > this.app.send(SetNodeAttributeURLBased(id, name, value, this.app.getBaseHref()))</span>
1004
+ } else {
1005
+ <span class="cstat-no" title="statement not covered" > this.app.send(SetNodeAttribute(id, name, value))</span>
1006
+ }
1007
+ <span class="cstat-no" title="statement not covered" > return</span>
1008
+ }
1009
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
1010
+ name === 'src' ||
1011
+ name === 'srcset' ||
1012
+ name === 'integrity' ||
1013
+ name === 'crossorigin' ||
1014
+ name === 'autocomplete' ||
1015
+ name.substr(0, 2) === 'on'
1016
+ ) {
1017
+ <span class="cstat-no" title="statement not covered" > return</span>
1018
+ }
1019
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
1020
+ name === 'value' &amp;&amp;
1021
+ hasTag(node, 'input') &amp;&amp;
1022
+ node.type !== 'button' &amp;&amp;
1023
+ node.type !== 'reset' &amp;&amp;
1024
+ node.type !== 'submit'
1025
+ ) {
1026
+ <span class="cstat-no" title="statement not covered" > return</span>
1027
+ }
1028
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (value === null) {</span>
1029
+ <span class="cstat-no" title="statement not covered" > this.app.send(RemoveNodeAttribute(id, name))</span>
1030
+ <span class="cstat-no" title="statement not covered" > return</span>
1031
+ }
1032
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (name === 'style' || (name === 'href' &amp;&amp; hasTag(node, 'link'))) {</span>
1033
+ <span class="cstat-no" title="statement not covered" > this.app.send(SetNodeAttributeURLBased(id, name, value, this.app.getBaseHref()))</span>
1034
+ <span class="cstat-no" title="statement not covered" > return</span>
1035
+ }
1036
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (name === 'href' || value.length &gt; 1e5) {</span>
1037
+ <span class="cstat-no" title="statement not covered" > value = ''</span>
1038
+ }
1039
+ <span class="cstat-no" title="statement not covered" > this.app.send(SetNodeAttribute(id, name, value))</span>
1040
+ }
1041
+ &nbsp;
1042
+ private <span class="fstat-no" title="function not covered" >sendNodeData(</span>id: number, parentElement: Element, data: string): void {
1043
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (hasTag(parentElement, 'style')) {</span>
1044
+ <span class="cstat-no" title="statement not covered" > this.app.send(SetCSSDataURLBased(id, data, this.app.getBaseHref()))</span>
1045
+ <span class="cstat-no" title="statement not covered" > return</span>
1046
+ }
1047
+ <span class="cstat-no" title="statement not covered" > data = this.app.sanitizer.sanitize(id, data)</span>
1048
+ <span class="cstat-no" title="statement not covered" > this.app.send(SetNodeData(id, data))</span>
1049
+ }
1050
+ &nbsp;
1051
+ private <span class="fstat-no" title="function not covered" >bindNode(</span>node: Node): void {
1052
+ const [id, isNew] = <span class="cstat-no" title="statement not covered" >this.app.nodes.registerNode(node)</span>
1053
+ <span class="cstat-no" title="statement not covered" > if (isNew) {</span>
1054
+ <span class="cstat-no" title="statement not covered" > this.recents.set(id, RecentsType.New)</span>
1055
+ } else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span>if (this.recents.get(id) !== RecentsType.New) {</span>
1056
+ <span class="cstat-no" title="statement not covered" > this.recents.set(id, RecentsType.Removed)</span>
1057
+ }
1058
+ }
1059
+ &nbsp;
1060
+ private <span class="fstat-no" title="function not covered" >bindTree(</span>node: Node): void {
1061
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isObservable(node)) {</span>
1062
+ <span class="cstat-no" title="statement not covered" > return</span>
1063
+ }
1064
+ <span class="cstat-no" title="statement not covered" > this.bindNode(node)</span>
1065
+ const walker = <span class="cstat-no" title="statement not covered" >document.createTreeWalker(</span>
1066
+ node,
1067
+ NodeFilter.SHOW_ELEMENT + NodeFilter.SHOW_TEXT,
1068
+ {
1069
+ acceptNode: <span class="fstat-no" title="function not covered" >(n</span>ode) =&gt;
1070
+ <span class="cstat-no" title="statement not covered" > isIgnored(node) || this.app.nodes.getID(node) !== undefined</span>
1071
+ ? NodeFilter.FILTER_REJECT
1072
+ : NodeFilter.FILTER_ACCEPT,
1073
+ },
1074
+ // @ts-ignore
1075
+ false,
1076
+ )
1077
+ <span class="cstat-no" title="statement not covered" > while (walker.nextNode()) {</span>
1078
+ <span class="cstat-no" title="statement not covered" > this.bindNode(walker.currentNode)</span>
1079
+ }
1080
+ }
1081
+ &nbsp;
1082
+ private <span class="fstat-no" title="function not covered" >unbindTree(</span>node: Node) {
1083
+ const id = <span class="cstat-no" title="statement not covered" >this.app.nodes.unregisterNode(node)</span>
1084
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (id !== undefined &amp;&amp; this.recents.get(id) === RecentsType.Removed) {</span>
1085
+ // Sending RemoveNode only for parent to maintain
1086
+ <span class="cstat-no" title="statement not covered" > this.app.send(RemoveNode(id))</span>
1087
+ &nbsp;
1088
+ // Unregistering all the children in order to clear the memory
1089
+ const walker = <span class="cstat-no" title="statement not covered" >document.createTreeWalker(</span>
1090
+ node,
1091
+ NodeFilter.SHOW_ELEMENT + NodeFilter.SHOW_TEXT,
1092
+ {
1093
+ acceptNode: <span class="fstat-no" title="function not covered" >(n</span>ode) =&gt;
1094
+ <span class="cstat-no" title="statement not covered" > isIgnored(node) || this.app.nodes.getID(node) === undefined</span>
1095
+ ? NodeFilter.FILTER_REJECT
1096
+ : NodeFilter.FILTER_ACCEPT,
1097
+ },
1098
+ // @ts-ignore
1099
+ false,
1100
+ )
1101
+ &nbsp;
1102
+ let removed = <span class="cstat-no" title="statement not covered" >0</span>
1103
+ const totalBeforeRemove = <span class="cstat-no" title="statement not covered" >this.app.nodes.getNodeCount()</span>
1104
+ &nbsp;
1105
+ <span class="cstat-no" title="statement not covered" > while (walker.nextNode()) {</span>
1106
+ <span class="cstat-no" title="statement not covered" > removed += 1</span>
1107
+ <span class="cstat-no" title="statement not covered" > this.app.nodes.unregisterNode(walker.currentNode)</span>
1108
+ }
1109
+ &nbsp;
1110
+ const removedPercent = <span class="cstat-no" title="statement not covered" >Math.floor((removed / totalBeforeRemove) * 100)</span>
1111
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (removedPercent &gt; 30) {</span>
1112
+ <span class="cstat-no" title="statement not covered" > this.app.send(UnbindNodes(removedPercent))</span>
1113
+ }
1114
+ }
1115
+ }
1116
+ &nbsp;
1117
+ // A top-consumption function on the infinite lists test. (~1% of performance resources)
1118
+ private <span class="fstat-no" title="function not covered" >_commitNode(</span>id: number, node: Node): boolean {
1119
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (isRootNode(node)) {</span>
1120
+ <span class="cstat-no" title="statement not covered" > return true</span>
1121
+ }
1122
+ const parent = <span class="cstat-no" title="statement not covered" >node.parentNode</span>
1123
+ let parentID: number | undefined
1124
+ &nbsp;
1125
+ // Disable parent check for the upper context HTMLHtmlElement, because it is root there... (before)
1126
+ // TODO: get rid of "special" cases (there is an issue with CreateDocument altered behaviour though)
1127
+ // TODO: Clean the logic (though now it workd fine)
1128
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!hasTag(node, 'html') || !this.isTopContext) {</span>
1129
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (parent === null) {</span>
1130
+ // Sometimes one observation contains attribute mutations for the removimg node, which gets ignored here.
1131
+ // That shouldn't affect the visual rendering ( should it? maybe when transition applied? )
1132
+ <span class="cstat-no" title="statement not covered" > this.unbindTree(node)</span>
1133
+ <span class="cstat-no" title="statement not covered" > return false</span>
1134
+ }
1135
+ <span class="cstat-no" title="statement not covered" > parentID = this.app.nodes.getID(parent)</span>
1136
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (parentID === undefined) {</span>
1137
+ <span class="cstat-no" title="statement not covered" > this.unbindTree(node)</span>
1138
+ <span class="cstat-no" title="statement not covered" > return false</span>
1139
+ }
1140
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.commitNode(parentID)) {</span>
1141
+ <span class="cstat-no" title="statement not covered" > this.unbindTree(node)</span>
1142
+ <span class="cstat-no" title="statement not covered" > return false</span>
1143
+ }
1144
+ <span class="cstat-no" title="statement not covered" > this.app.sanitizer.handleNode(id, parentID, node)</span>
1145
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.app.sanitizer.isHidden(parentID)) {</span>
1146
+ <span class="cstat-no" title="statement not covered" > return false</span>
1147
+ }
1148
+ }
1149
+ // From here parentID === undefined if node is top context HTML node
1150
+ let sibling = <span class="cstat-no" title="statement not covered" >node.previousSibling</span>
1151
+ <span class="cstat-no" title="statement not covered" > while (sibling !== null) {</span>
1152
+ const siblingID = <span class="cstat-no" title="statement not covered" >this.app.nodes.getID(sibling)</span>
1153
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (siblingID !== undefined) {</span>
1154
+ <span class="cstat-no" title="statement not covered" > this.commitNode(siblingID)</span>
1155
+ <span class="cstat-no" title="statement not covered" > this.indexes[id] = this.indexes[siblingID] + 1</span>
1156
+ <span class="cstat-no" title="statement not covered" > break</span>
1157
+ }
1158
+ <span class="cstat-no" title="statement not covered" > sibling = sibling.previousSibling</span>
1159
+ }
1160
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (sibling === null) {</span>
1161
+ <span class="cstat-no" title="statement not covered" > this.indexes[id] = 0</span>
1162
+ }
1163
+ const recentsType = <span class="cstat-no" title="statement not covered" >this.recents.get(id)</span>
1164
+ const isNew = <span class="cstat-no" title="statement not covered" >recentsType === RecentsType.New</span>
1165
+ const index = <span class="cstat-no" title="statement not covered" >this.indexes[id]</span>
1166
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (index === undefined) {</span>
1167
+ <span class="cstat-no" title="statement not covered" > throw 'commitNode: missing node index'</span>
1168
+ }
1169
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (isNew) {</span>
1170
+ <span class="cstat-no" title="statement not covered" > if (isElementNode(node)) {</span>
1171
+ let el: Element = <span class="cstat-no" title="statement not covered" >node</span>
1172
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (parentID !== undefined) {</span>
1173
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.app.sanitizer.isHidden(id)) {</span>
1174
+ const width = <span class="cstat-no" title="statement not covered" >el.clientWidth</span>
1175
+ const height = <span class="cstat-no" title="statement not covered" >el.clientHeight</span>
1176
+ <span class="cstat-no" title="statement not covered" > el = node.cloneNode() as Element</span>
1177
+ // TODO: use ResizeObserver
1178
+ ;(<span class="cstat-no" title="statement not covered" >el as HTMLElement | SVGElement).style.width = `${width}px`</span>
1179
+ ;(<span class="cstat-no" title="statement not covered" >el as HTMLElement | SVGElement).style.height = `${height}px`</span>
1180
+ }
1181
+ &nbsp;
1182
+ <span class="cstat-no" title="statement not covered" > this.app.send(CreateElementNode(id, parentID, index, el.tagName, isSVGElement(node)))</span>
1183
+ }
1184
+ <span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >0;</span> i &lt; el.attributes.length; i++) {</span>
1185
+ const attr = <span class="cstat-no" title="statement not covered" >el.attributes[i]</span>
1186
+ <span class="cstat-no" title="statement not covered" > this.sendNodeAttribute(id, el, attr.nodeName, attr.value)</span>
1187
+ }
1188
+ } else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span>if (isTextNode(node)) {</span>
1189
+ // for text node id != 0, hence parentID !== undefined and parent is Element
1190
+ <span class="cstat-no" title="statement not covered" > this.app.send(CreateTextNode(id, parentID as number, index))</span>
1191
+ <span class="cstat-no" title="statement not covered" > this.sendNodeData(id, parent as Element, node.data)</span>
1192
+ }
1193
+ <span class="cstat-no" title="statement not covered" > return true</span>
1194
+ }
1195
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (recentsType === RecentsType.Removed &amp;&amp; parentID !== undefined) {</span>
1196
+ <span class="cstat-no" title="statement not covered" > this.app.send(MoveNode(id, parentID, index))</span>
1197
+ }
1198
+ const attr = <span class="cstat-no" title="statement not covered" >this.attributesMap.get(id)</span>
1199
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (attr !== undefined) {</span>
1200
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isElementNode(node)) {</span>
1201
+ <span class="cstat-no" title="statement not covered" > throw 'commitNode: node is not an element'</span>
1202
+ }
1203
+ <span class="cstat-no" title="statement not covered" > for (const name of attr) {</span>
1204
+ <span class="cstat-no" title="statement not covered" > this.sendNodeAttribute(id, node, name, node.getAttribute(name))</span>
1205
+ }
1206
+ }
1207
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.textSet.has(id)) {</span>
1208
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isTextNode(node)) {</span>
1209
+ <span class="cstat-no" title="statement not covered" > throw 'commitNode: node is not a text'</span>
1210
+ }
1211
+ // for text node id != 0, hence parent is Element
1212
+ <span class="cstat-no" title="statement not covered" > this.sendNodeData(id, parent as Element, node.data)</span>
1213
+ }
1214
+ <span class="cstat-no" title="statement not covered" > return true</span>
1215
+ }
1216
+ private <span class="fstat-no" title="function not covered" >commitNode(</span>id: number): boolean {
1217
+ const node = <span class="cstat-no" title="statement not covered" >this.app.nodes.getNode(id)</span>
1218
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (node === undefined) {</span>
1219
+ <span class="cstat-no" title="statement not covered" > return false</span>
1220
+ }
1221
+ const cmt = <span class="cstat-no" title="statement not covered" >this.commited[id]</span>
1222
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (cmt !== undefined) {</span>
1223
+ <span class="cstat-no" title="statement not covered" > return cmt</span>
1224
+ }
1225
+ <span class="cstat-no" title="statement not covered" > return (this.commited[id] = this._commitNode(id, node))</span>
1226
+ }
1227
+ private <span class="fstat-no" title="function not covered" >commitNodes(</span>isStart = <span class="branch-0 cbranch-no" title="branch not covered" >false)</span>: void {
1228
+ let node
1229
+ <span class="cstat-no" title="statement not covered" > this.recents.forEach(<span class="fstat-no" title="function not covered" >(t</span>ype, id) =&gt; {</span>
1230
+ <span class="cstat-no" title="statement not covered" > this.commitNode(id)</span>
1231
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (type === RecentsType.New &amp;&amp; (node = this.app.nodes.getNode(id))) {</span>
1232
+ <span class="cstat-no" title="statement not covered" > this.app.nodes.callNodeCallbacks(node, isStart)</span>
1233
+ }
1234
+ })
1235
+ <span class="cstat-no" title="statement not covered" > this.clear()</span>
1236
+ }
1237
+ &nbsp;
1238
+ // ISSSUE (nodeToBinde should be the same as node in all cases. Look at the comment about 0-node at the beginning of the file.)
1239
+ // TODO: use one observer instance for all iframes/shadowRoots (composition instiad of inheritance)
1240
+ protected <span class="fstat-no" title="function not covered" >observeRoot(</span>
1241
+ node: Node,
1242
+ beforeCommit: (id?: number) =&gt; unknown,
1243
+ nodeToBind: Node = <span class="branch-0 cbranch-no" title="branch not covered" >node,</span>
1244
+ ) {
1245
+ <span class="cstat-no" title="statement not covered" > this.observer.observe(node, {</span>
1246
+ childList: true,
1247
+ attributes: true,
1248
+ characterData: true,
1249
+ subtree: true,
1250
+ attributeOldValue: false,
1251
+ characterDataOldValue: false,
1252
+ })
1253
+ <span class="cstat-no" title="statement not covered" > this.bindTree(nodeToBind)</span>
1254
+ <span class="cstat-no" title="statement not covered" > beforeCommit(this.app.nodes.getID(node))</span>
1255
+ <span class="cstat-no" title="statement not covered" > this.commitNodes(true)</span>
1256
+ }
1257
+ &nbsp;
1258
+ <span class="fstat-no" title="function not covered" > disconnect(</span>): void {
1259
+ <span class="cstat-no" title="statement not covered" > this.observer.disconnect()</span>
1260
+ <span class="cstat-no" title="statement not covered" > this.clear()</span>
1261
+ }
1262
+ }
1263
+ &nbsp;</pre></td></tr></table></pre>
1264
+
1265
+ <div class='push'></div><!-- for sticky footer -->
1266
+ </div><!-- /wrapper -->
1267
+ <div class='footer quiet pad2 space-top1 center small'>
1268
+ Code coverage generated by
1269
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1270
+ at 2023-05-31T11:17:20.525Z
1271
+ </div>
1272
+ <script src="../../../prettify.js"></script>
1273
+ <script>
1274
+ window.onload = function () {
1275
+ prettyPrint();
1276
+ };
1277
+ </script>
1278
+ <script src="../../../sorter.js"></script>
1279
+ <script src="../../../block-navigation.js"></script>
1280
+ </body>
1281
+ </html>
1282
+