@basementuniverse/kanbn 1.1.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/README.md +2 -0
  2. package/coverage/base.css +224 -0
  3. package/coverage/block-navigation.js +87 -0
  4. package/coverage/coverage-summary.json +31 -0
  5. package/coverage/favicon.png +0 -0
  6. package/coverage/index.html +146 -0
  7. package/coverage/kanbn/index.html +116 -0
  8. package/coverage/kanbn/index.js.html +217 -0
  9. package/coverage/kanbn/src/board.js.html +646 -0
  10. package/coverage/kanbn/src/controller/add.js.html +1729 -0
  11. package/coverage/kanbn/src/controller/archive.js.html +277 -0
  12. package/coverage/kanbn/src/controller/board.js.html +217 -0
  13. package/coverage/kanbn/src/controller/burndown.js.html +607 -0
  14. package/coverage/kanbn/src/controller/comment.js.html +397 -0
  15. package/coverage/kanbn/src/controller/edit.js.html +2920 -0
  16. package/coverage/kanbn/src/controller/find.js.html +1597 -0
  17. package/coverage/kanbn/src/controller/gantt.js.html +1342 -0
  18. package/coverage/kanbn/src/controller/help.js.html +115 -0
  19. package/coverage/kanbn/src/controller/history.js.html +400 -0
  20. package/coverage/kanbn/src/controller/index.html +431 -0
  21. package/coverage/kanbn/src/controller/init.js.html +511 -0
  22. package/coverage/kanbn/src/controller/move.js.html +514 -0
  23. package/coverage/kanbn/src/controller/remove-all.js.html +226 -0
  24. package/coverage/kanbn/src/controller/remove.js.html +307 -0
  25. package/coverage/kanbn/src/controller/rename.js.html +397 -0
  26. package/coverage/kanbn/src/controller/restore.js.html +268 -0
  27. package/coverage/kanbn/src/controller/sort.js.html +1318 -0
  28. package/coverage/kanbn/src/controller/sprint.js.html +361 -0
  29. package/coverage/kanbn/src/controller/status.js.html +310 -0
  30. package/coverage/kanbn/src/controller/task.js.html +244 -0
  31. package/coverage/kanbn/src/controller/validate.js.html +367 -0
  32. package/coverage/kanbn/src/controller/version.js.html +100 -0
  33. package/coverage/kanbn/src/index.html +191 -0
  34. package/coverage/kanbn/src/main.js.html +9787 -0
  35. package/coverage/kanbn/src/parse-index.js.html +1063 -0
  36. package/coverage/kanbn/src/parse-markdown.js.html +202 -0
  37. package/coverage/kanbn/src/parse-task.js.html +2191 -0
  38. package/coverage/kanbn/src/utility.js.html +616 -0
  39. package/coverage/lcov.info +11837 -0
  40. package/coverage/prettify.css +1 -0
  41. package/coverage/prettify.js +2 -0
  42. package/coverage/sort-arrow-sprite.png +0 -0
  43. package/coverage/sorter.js +210 -0
  44. package/coverage/tmp/coverage-214292-1787777191526-0.json +1 -0
  45. package/coverage/tmp/coverage-214293-1787777184569-0.json +1 -0
  46. package/docs/advanced-configuration.md +2 -0
  47. package/docs/commands/add.txt +10 -0
  48. package/docs/commands/board.txt +3 -1
  49. package/docs/commands/burndown.txt +2 -4
  50. package/docs/commands/edit.txt +22 -0
  51. package/docs/commands/find.txt +45 -1
  52. package/docs/commands/help.txt +1 -0
  53. package/docs/commands/move.txt +1 -1
  54. package/docs/commands/sort.txt +13 -2
  55. package/docs/commands/validate.txt +12 -0
  56. package/docs/filtering-and-sorting.md +218 -0
  57. package/docs/index-structure.md +68 -19
  58. package/docs/index.md +26 -2
  59. package/docs/migration-2.0.md +92 -0
  60. package/docs/quick-start.md +37 -1
  61. package/docs/task-structure.md +12 -3
  62. package/docs/views.md +229 -0
  63. package/example/README.md +70 -0
  64. package/example/advanced/.kanbn/index.md +26 -0
  65. package/example/advanced/.kanbn/tasks/add-rate-limiting.md +18 -0
  66. package/example/advanced/.kanbn/tasks/add-sso-support.md +15 -0
  67. package/example/advanced/.kanbn/tasks/migrate-to-new-cdn.md +14 -0
  68. package/example/advanced/.kanbn/tasks/refresh-marketing-site.md +14 -0
  69. package/example/advanced/.kanbn/tasks/rotate-api-keys.md +15 -0
  70. package/example/advanced/.kanbn/tasks/split-billing-service.md +17 -0
  71. package/example/advanced/.kanbn/tasks/upgrade-node-runtime.md +19 -0
  72. package/example/advanced/kanbn.yml +59 -0
  73. package/example/views/.kanbn/index.md +140 -0
  74. package/example/views/.kanbn/tasks/add-audit-log-export.md +18 -0
  75. package/example/views/.kanbn/tasks/add-dark-mode-toggle.md +16 -0
  76. package/example/views/.kanbn/tasks/build-webhook-retry-queue.md +15 -0
  77. package/example/views/.kanbn/tasks/fix-avatar-upload-crash.md +13 -0
  78. package/example/views/.kanbn/tasks/fix-expired-session-redirect.md +15 -0
  79. package/example/views/.kanbn/tasks/investigate-offline-mode.md +12 -0
  80. package/example/views/.kanbn/tasks/rewrite-search-indexer.md +12 -0
  81. package/example/views/.kanbn/tasks/tidy-up-settings-copy.md +12 -0
  82. package/package.json +4 -3
  83. package/routes/edit.json +2 -1
  84. package/routes/validate.json +4 -2
  85. package/skills/kanbn-plan/references/index-structure.md +1 -0
  86. package/skills/kanbn-plan/references/task-structure.md +2 -0
  87. package/src/board.js +1 -0
  88. package/src/controller/board.js +6 -0
  89. package/src/controller/edit.js +65 -12
  90. package/src/controller/gantt.js +46 -1
  91. package/src/controller/status.js +12 -0
  92. package/src/controller/task.js +1 -1
  93. package/src/controller/validate.js +78 -15
  94. package/src/main.js +324 -152
  95. package/src/parse-index.js +3 -0
  96. package/src/parse-markdown.js +3 -1
  97. package/src/parse-task.js +28 -1
  98. package/src/utility.js +26 -1
  99. /package/example/{.kanbn → basic/.kanbn}/index.md +0 -0
  100. /package/example/{.kanbn → basic/.kanbn}/tasks/add-basic-activity-feed.md +0 -0
  101. /package/example/{.kanbn → basic/.kanbn}/tasks/add-passwordless-login-option.md +0 -0
  102. /package/example/{.kanbn → basic/.kanbn}/tasks/add-usage-alert-email-thresholds.md +0 -0
  103. /package/example/{.kanbn → basic/.kanbn}/tasks/build-email-template-system.md +0 -0
  104. /package/example/{.kanbn → basic/.kanbn}/tasks/build-invoice-download-endpoint.md +0 -0
  105. /package/example/{.kanbn → basic/.kanbn}/tasks/build-tenant-settings-page.md +0 -0
  106. /package/example/{.kanbn → basic/.kanbn}/tasks/create-organization-switcher.md +0 -0
  107. /package/example/{.kanbn → basic/.kanbn}/tasks/create-sandbox-environment-provisioner.md +0 -0
  108. /package/example/{.kanbn → basic/.kanbn}/tasks/create-self-serve-cancellation-flow.md +0 -0
  109. /package/example/{.kanbn → basic/.kanbn}/tasks/define-product-pricing-strategy.md +0 -0
  110. /package/example/{.kanbn → basic/.kanbn}/tasks/design-onboarding-checklist.md +0 -0
  111. /package/example/{.kanbn → basic/.kanbn}/tasks/design-team-invite-expiry-flow.md +0 -0
  112. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-data-retention-policy-jobs.md +0 -0
  113. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-feature-flags-foundation.md +0 -0
  114. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-project-creation-wizard.md +0 -0
  115. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-stripe-webhook-signature-check.md +0 -0
  116. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-team-permissions-ui.md +0 -0
  117. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-user-signup-and-login.md +0 -0
  118. /package/example/{.kanbn → basic/.kanbn}/tasks/integrate-crm-lead-sync.md +0 -0
  119. /package/example/{.kanbn → basic/.kanbn}/tasks/legal-review-terms-and-privacy.md +0 -0
  120. /package/example/{.kanbn → basic/.kanbn}/tasks/migrate-legacy-events-to-new-schema.md +0 -0
  121. /package/example/{.kanbn → basic/.kanbn}/tasks/optimize-dashboard-first-load.md +0 -0
  122. /package/example/{.kanbn → basic/.kanbn}/tasks/prototype-report-export-scheduler.md +0 -0
  123. /package/example/{.kanbn → basic/.kanbn}/tasks/publish-internal-qa-checklist.md +0 -0
  124. /package/example/{.kanbn → basic/.kanbn}/tasks/setup-ci-pipeline.md +0 -0
@@ -0,0 +1,1597 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for kanbn/src/controller/find.js</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">kanbn/src/controller</a> find.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">81.74% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>412/504</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">76.69% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>79/103</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">100% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>14/14</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">81.74% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>412/504</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">10x</span>
571
+ <span class="cline-any cline-yes">10x</span>
572
+ <span class="cline-any cline-yes">10x</span>
573
+ <span class="cline-any cline-yes">10x</span>
574
+ <span class="cline-any cline-yes">10x</span>
575
+ <span class="cline-any cline-yes">10x</span>
576
+ <span class="cline-any cline-yes">10x</span>
577
+ <span class="cline-any cline-yes">10x</span>
578
+ <span class="cline-any cline-yes">10x</span>
579
+ <span class="cline-any cline-yes">10x</span>
580
+ <span class="cline-any cline-yes">10x</span>
581
+ <span class="cline-any cline-yes">10x</span>
582
+ <span class="cline-any cline-yes">10x</span>
583
+ <span class="cline-any cline-yes">10x</span>
584
+ <span class="cline-any cline-yes">10x</span>
585
+ <span class="cline-any cline-yes">10x</span>
586
+ <span class="cline-any cline-yes">10x</span>
587
+ <span class="cline-any cline-yes">10x</span>
588
+ <span class="cline-any cline-yes">10x</span>
589
+ <span class="cline-any cline-yes">10x</span>
590
+ <span class="cline-any cline-yes">10x</span>
591
+ <span class="cline-any cline-yes">10x</span>
592
+ <span class="cline-any cline-yes">10x</span>
593
+ <span class="cline-any cline-yes">10x</span>
594
+ <span class="cline-any cline-yes">10x</span>
595
+ <span class="cline-any cline-yes">10x</span>
596
+ <span class="cline-any cline-yes">10x</span>
597
+ <span class="cline-any cline-yes">10x</span>
598
+ <span class="cline-any cline-yes">10x</span>
599
+ <span class="cline-any cline-yes">10x</span>
600
+ <span class="cline-any cline-yes">10x</span>
601
+ <span class="cline-any cline-yes">10x</span>
602
+ <span class="cline-any cline-yes">10x</span>
603
+ <span class="cline-any cline-yes">10x</span>
604
+ <span class="cline-any cline-yes">10x</span>
605
+ <span class="cline-any cline-yes">10x</span>
606
+ <span class="cline-any cline-yes">10x</span>
607
+ <span class="cline-any cline-yes">10x</span>
608
+ <span class="cline-any cline-yes">10x</span>
609
+ <span class="cline-any cline-yes">10x</span>
610
+ <span class="cline-any cline-yes">10x</span>
611
+ <span class="cline-any cline-yes">10x</span>
612
+ <span class="cline-any cline-yes">10x</span>
613
+ <span class="cline-any cline-yes">10x</span>
614
+ <span class="cline-any cline-yes">10x</span>
615
+ <span class="cline-any cline-yes">10x</span>
616
+ <span class="cline-any cline-yes">10x</span>
617
+ <span class="cline-any cline-yes">10x</span>
618
+ <span class="cline-any cline-yes">10x</span>
619
+ <span class="cline-any cline-yes">10x</span>
620
+ <span class="cline-any cline-yes">10x</span>
621
+ <span class="cline-any cline-yes">10x</span>
622
+ <span class="cline-any cline-yes">10x</span>
623
+ <span class="cline-any cline-yes">10x</span>
624
+ <span class="cline-any cline-yes">10x</span>
625
+ <span class="cline-any cline-yes">10x</span>
626
+ <span class="cline-any cline-yes">10x</span>
627
+ <span class="cline-any cline-yes">10x</span>
628
+ <span class="cline-any cline-yes">10x</span>
629
+ <span class="cline-any cline-yes">10x</span>
630
+ <span class="cline-any cline-yes">10x</span>
631
+ <span class="cline-any cline-yes">10x</span>
632
+ <span class="cline-any cline-yes">10x</span>
633
+ <span class="cline-any cline-yes">10x</span>
634
+ <span class="cline-any cline-yes">10x</span>
635
+ <span class="cline-any cline-yes">10x</span>
636
+ <span class="cline-any cline-yes">10x</span>
637
+ <span class="cline-any cline-yes">10x</span>
638
+ <span class="cline-any cline-yes">10x</span>
639
+ <span class="cline-any cline-yes">10x</span>
640
+ <span class="cline-any cline-yes">10x</span>
641
+ <span class="cline-any cline-yes">10x</span>
642
+ <span class="cline-any cline-yes">10x</span>
643
+ <span class="cline-any cline-yes">10x</span>
644
+ <span class="cline-any cline-yes">10x</span>
645
+ <span class="cline-any cline-yes">10x</span>
646
+ <span class="cline-any cline-yes">10x</span>
647
+ <span class="cline-any cline-yes">10x</span>
648
+ <span class="cline-any cline-yes">10x</span>
649
+ <span class="cline-any cline-yes">10x</span>
650
+ <span class="cline-any cline-yes">10x</span>
651
+ <span class="cline-any cline-yes">10x</span>
652
+ <span class="cline-any cline-yes">10x</span>
653
+ <span class="cline-any cline-yes">10x</span>
654
+ <span class="cline-any cline-yes">10x</span>
655
+ <span class="cline-any cline-yes">10x</span>
656
+ <span class="cline-any cline-yes">10x</span>
657
+ <span class="cline-any cline-yes">10x</span>
658
+ <span class="cline-any cline-yes">10x</span>
659
+ <span class="cline-any cline-yes">10x</span>
660
+ <span class="cline-any cline-yes">10x</span>
661
+ <span class="cline-any cline-yes">10x</span>
662
+ <span class="cline-any cline-yes">10x</span>
663
+ <span class="cline-any cline-yes">10x</span>
664
+ <span class="cline-any cline-yes">10x</span>
665
+ <span class="cline-any cline-yes">10x</span>
666
+ <span class="cline-any cline-yes">10x</span>
667
+ <span class="cline-any cline-yes">10x</span>
668
+ <span class="cline-any cline-yes">10x</span>
669
+ <span class="cline-any cline-yes">10x</span>
670
+ <span class="cline-any cline-yes">10x</span>
671
+ <span class="cline-any cline-yes">10x</span>
672
+ <span class="cline-any cline-yes">10x</span>
673
+ <span class="cline-any cline-yes">10x</span>
674
+ <span class="cline-any cline-yes">10x</span>
675
+ <span class="cline-any cline-yes">10x</span>
676
+ <span class="cline-any cline-yes">10x</span>
677
+ <span class="cline-any cline-yes">10x</span>
678
+ <span class="cline-any cline-yes">10x</span>
679
+ <span class="cline-any cline-yes">10x</span>
680
+ <span class="cline-any cline-yes">10x</span>
681
+ <span class="cline-any cline-yes">10x</span>
682
+ <span class="cline-any cline-yes">10x</span>
683
+ <span class="cline-any cline-yes">10x</span>
684
+ <span class="cline-any cline-yes">10x</span>
685
+ <span class="cline-any cline-yes">10x</span>
686
+ <span class="cline-any cline-yes">10x</span>
687
+ <span class="cline-any cline-yes">10x</span>
688
+ <span class="cline-any cline-yes">10x</span>
689
+ <span class="cline-any cline-yes">10x</span>
690
+ <span class="cline-any cline-yes">8x</span>
691
+ <span class="cline-any cline-yes">8x</span>
692
+ <span class="cline-any cline-yes">8x</span>
693
+ <span class="cline-any cline-yes">8x</span>
694
+ <span class="cline-any cline-yes">8x</span>
695
+ <span class="cline-any cline-yes">8x</span>
696
+ <span class="cline-any cline-yes">8x</span>
697
+ <span class="cline-any cline-yes">8x</span>
698
+ <span class="cline-any cline-yes">8x</span>
699
+ <span class="cline-any cline-yes">8x</span>
700
+ <span class="cline-any cline-yes">8x</span>
701
+ <span class="cline-any cline-yes">8x</span>
702
+ <span class="cline-any cline-yes">8x</span>
703
+ <span class="cline-any cline-yes">8x</span>
704
+ <span class="cline-any cline-yes">8x</span>
705
+ <span class="cline-any cline-yes">8x</span>
706
+ <span class="cline-any cline-yes">8x</span>
707
+ <span class="cline-any cline-yes">8x</span>
708
+ <span class="cline-any cline-yes">8x</span>
709
+ <span class="cline-any cline-yes">8x</span>
710
+ <span class="cline-any cline-yes">8x</span>
711
+ <span class="cline-any cline-yes">8x</span>
712
+ <span class="cline-any cline-yes">8x</span>
713
+ <span class="cline-any cline-yes">8x</span>
714
+ <span class="cline-any cline-yes">8x</span>
715
+ <span class="cline-any cline-yes">8x</span>
716
+ <span class="cline-any cline-yes">11x</span>
717
+ <span class="cline-any cline-yes">11x</span>
718
+ <span class="cline-any cline-yes">8x</span>
719
+ <span class="cline-any cline-yes">8x</span>
720
+ <span class="cline-any cline-yes">9x</span>
721
+ <span class="cline-any cline-yes">1x</span>
722
+ <span class="cline-any cline-yes">1x</span>
723
+ <span class="cline-any cline-yes">8x</span>
724
+ <span class="cline-any cline-yes">9x</span>
725
+ <span class="cline-any cline-yes">8x</span>
726
+ <span class="cline-any cline-yes">8x</span>
727
+ <span class="cline-any cline-yes">8x</span>
728
+ <span class="cline-any cline-yes">8x</span>
729
+ <span class="cline-any cline-yes">8x</span>
730
+ <span class="cline-any cline-yes">8x</span>
731
+ <span class="cline-any cline-yes">8x</span>
732
+ <span class="cline-any cline-yes">10x</span>
733
+ <span class="cline-any cline-yes">10x</span>
734
+ <span class="cline-any cline-yes">8x</span>
735
+ <span class="cline-any cline-yes">8x</span>
736
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
740
+ <span class="cline-any cline-yes">1x</span>
741
+ <span class="cline-any cline-yes">1x</span>
742
+ <span class="cline-any cline-no">&nbsp;</span>
743
+ <span class="cline-any cline-yes">1x</span>
744
+ <span class="cline-any cline-yes">8x</span>
745
+ <span class="cline-any cline-yes">8x</span>
746
+ <span class="cline-any cline-yes">8x</span>
747
+ <span class="cline-any cline-yes">8x</span>
748
+ <span class="cline-any cline-yes">8x</span>
749
+ <span class="cline-any cline-yes">8x</span>
750
+ <span class="cline-any cline-yes">8x</span>
751
+ <span class="cline-any cline-yes">9x</span>
752
+ <span class="cline-any cline-yes">9x</span>
753
+ <span class="cline-any cline-yes">8x</span>
754
+ <span class="cline-any cline-yes">8x</span>
755
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
759
+ <span class="cline-any cline-yes">1x</span>
760
+ <span class="cline-any cline-yes">1x</span>
761
+ <span class="cline-any cline-no">&nbsp;</span>
762
+ <span class="cline-any cline-yes">1x</span>
763
+ <span class="cline-any cline-yes">8x</span>
764
+ <span class="cline-any cline-yes">8x</span>
765
+ <span class="cline-any cline-yes">8x</span>
766
+ <span class="cline-any cline-yes">8x</span>
767
+ <span class="cline-any cline-yes">8x</span>
768
+ <span class="cline-any cline-yes">8x</span>
769
+ <span class="cline-any cline-yes">8x</span>
770
+ <span class="cline-any cline-yes">8x</span>
771
+ <span class="cline-any cline-yes">8x</span>
772
+ <span class="cline-any cline-yes">8x</span>
773
+ <span class="cline-any cline-yes">8x</span>
774
+ <span class="cline-any cline-yes">8x</span>
775
+ <span class="cline-any cline-yes">8x</span>
776
+ <span class="cline-any cline-yes">8x</span>
777
+ <span class="cline-any cline-yes">8x</span>
778
+ <span class="cline-any cline-yes">10x</span>
779
+ <span class="cline-any cline-yes">10x</span>
780
+ <span class="cline-any cline-yes">10x</span>
781
+ <span class="cline-any cline-yes">10x</span>
782
+ <span class="cline-any cline-yes">10x</span>
783
+ <span class="cline-any cline-yes">10x</span>
784
+ <span class="cline-any cline-yes">10x</span>
785
+ <span class="cline-any cline-yes">13x</span>
786
+ <span class="cline-any cline-yes">13x</span>
787
+ <span class="cline-any cline-yes">1x</span>
788
+ <span class="cline-any cline-yes">13x</span>
789
+ <span class="cline-any cline-yes">13x</span>
790
+ <span class="cline-any cline-yes">13x</span>
791
+ <span class="cline-any cline-yes">13x</span>
792
+ <span class="cline-any cline-yes">13x</span>
793
+ <span class="cline-any cline-yes">2x</span>
794
+ <span class="cline-any cline-yes">13x</span>
795
+ <span class="cline-any cline-yes">11x</span>
796
+ <span class="cline-any cline-yes">1x</span>
797
+ <span class="cline-any cline-yes">11x</span>
798
+ <span class="cline-any cline-yes">10x</span>
799
+ <span class="cline-any cline-yes">10x</span>
800
+ <span class="cline-any cline-yes">1x</span>
801
+ <span class="cline-any cline-yes">1x</span>
802
+ <span class="cline-any cline-yes">10x</span>
803
+ <span class="cline-any cline-yes">10x</span>
804
+ <span class="cline-any cline-yes">11x</span>
805
+ <span class="cline-any cline-yes">13x</span>
806
+ <span class="cline-any cline-yes">13x</span>
807
+ <span class="cline-any cline-no">&nbsp;</span>
808
+ <span class="cline-any cline-yes">13x</span>
809
+ <span class="cline-any cline-yes">13x</span>
810
+ <span class="cline-any cline-yes">10x</span>
811
+ <span class="cline-any cline-yes">10x</span>
812
+ <span class="cline-any cline-yes">10x</span>
813
+ <span class="cline-any cline-yes">10x</span>
814
+ <span class="cline-any cline-yes">10x</span>
815
+ <span class="cline-any cline-yes">10x</span>
816
+ <span class="cline-any cline-yes">10x</span>
817
+ <span class="cline-any cline-yes">8x</span>
818
+ <span class="cline-any cline-yes">8x</span>
819
+ <span class="cline-any cline-yes">2x</span>
820
+ <span class="cline-any cline-yes">1x</span>
821
+ <span class="cline-any cline-yes">1x</span>
822
+ <span class="cline-any cline-yes">1x</span>
823
+ <span class="cline-any cline-yes">1x</span>
824
+ <span class="cline-any cline-yes">8x</span>
825
+ <span class="cline-any cline-yes">6x</span>
826
+ <span class="cline-any cline-yes">6x</span>
827
+ <span class="cline-any cline-yes">8x</span>
828
+ <span class="cline-any cline-yes">10x</span>
829
+ <span class="cline-any cline-yes">10x</span>
830
+ <span class="cline-any cline-yes">10x</span>
831
+ <span class="cline-any cline-yes">10x</span>
832
+ <span class="cline-any cline-yes">10x</span>
833
+ <span class="cline-any cline-yes">10x</span>
834
+ <span class="cline-any cline-yes">10x</span>
835
+ <span class="cline-any cline-yes">3x</span>
836
+ <span class="cline-any cline-yes">3x</span>
837
+ <span class="cline-any cline-no">&nbsp;</span>
838
+ <span class="cline-any cline-no">&nbsp;</span>
839
+ <span class="cline-any cline-no">&nbsp;</span>
840
+ <span class="cline-any cline-no">&nbsp;</span>
841
+ <span class="cline-any cline-no">&nbsp;</span>
842
+ <span class="cline-any cline-no">&nbsp;</span>
843
+ <span class="cline-any cline-no">&nbsp;</span>
844
+ <span class="cline-any cline-yes">3x</span>
845
+ <span class="cline-any cline-yes">3x</span>
846
+ <span class="cline-any cline-yes">3x</span>
847
+ <span class="cline-any cline-yes">2x</span>
848
+ <span class="cline-any cline-yes">2x</span>
849
+ <span class="cline-any cline-yes">1x</span>
850
+ <span class="cline-any cline-yes">1x</span>
851
+ <span class="cline-any cline-yes">1x</span>
852
+ <span class="cline-any cline-yes">3x</span>
853
+ <span class="cline-any cline-yes">10x</span>
854
+ <span class="cline-any cline-yes">10x</span>
855
+ <span class="cline-any cline-yes">10x</span>
856
+ <span class="cline-any cline-yes">10x</span>
857
+ <span class="cline-any cline-yes">10x</span>
858
+ <span class="cline-any cline-yes">10x</span>
859
+ <span class="cline-any cline-yes">10x</span>
860
+ <span class="cline-any cline-yes">2x</span>
861
+ <span class="cline-any cline-yes">2x</span>
862
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
869
+ <span class="cline-any cline-yes">2x</span>
870
+ <span class="cline-any cline-yes">2x</span>
871
+ <span class="cline-any cline-yes">2x</span>
872
+ <span class="cline-any cline-yes">1x</span>
873
+ <span class="cline-any cline-yes">1x</span>
874
+ <span class="cline-any cline-yes">1x</span>
875
+ <span class="cline-any cline-yes">1x</span>
876
+ <span class="cline-any cline-yes">1x</span>
877
+ <span class="cline-any cline-yes">2x</span>
878
+ <span class="cline-any cline-yes">10x</span>
879
+ <span class="cline-any cline-yes">10x</span>
880
+ <span class="cline-any cline-yes">21x</span>
881
+ <span class="cline-any cline-yes">21x</span>
882
+ <span class="cline-any cline-yes">21x</span>
883
+ <span class="cline-any cline-yes">1x</span>
884
+ <span class="cline-any cline-yes">1x</span>
885
+ <span class="cline-any cline-yes">1x</span>
886
+ <span class="cline-any cline-yes">20x</span>
887
+ <span class="cline-any cline-yes">20x</span>
888
+ <span class="cline-any cline-yes">20x</span>
889
+ <span class="cline-any cline-yes">20x</span>
890
+ <span class="cline-any cline-yes">20x</span>
891
+ <span class="cline-any cline-yes">21x</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-yes">20x</span>
896
+ <span class="cline-any cline-yes">21x</span>
897
+ <span class="cline-any cline-yes">1x</span>
898
+ <span class="cline-any cline-yes">1x</span>
899
+ <span class="cline-any cline-yes">1x</span>
900
+ <span class="cline-any cline-yes">19x</span>
901
+ <span class="cline-any cline-yes">19x</span>
902
+ <span class="cline-any cline-yes">21x</span>
903
+ <span class="cline-any cline-yes">1x</span>
904
+ <span class="cline-any cline-yes">1x</span>
905
+ <span class="cline-any cline-yes">1x</span>
906
+ <span class="cline-any cline-yes">1x</span>
907
+ <span class="cline-any cline-yes">1x</span>
908
+ <span class="cline-any cline-yes">1x</span>
909
+ <span class="cline-any cline-yes">1x</span>
910
+ <span class="cline-any cline-yes">1x</span>
911
+ <span class="cline-any cline-yes">19x</span>
912
+ <span class="cline-any cline-yes">19x</span>
913
+ <span class="cline-any cline-yes">19x</span>
914
+ <span class="cline-any cline-yes">21x</span>
915
+ <span class="cline-any cline-yes">400x</span>
916
+ <span class="cline-any cline-yes">8x</span>
917
+ <span class="cline-any cline-yes">8x</span>
918
+ <span class="cline-any cline-yes">400x</span>
919
+ <span class="cline-any cline-yes">19x</span>
920
+ <span class="cline-any cline-yes">19x</span>
921
+ <span class="cline-any cline-yes">21x</span>
922
+ <span class="cline-any cline-no">&nbsp;</span>
923
+ <span class="cline-any cline-no">&nbsp;</span>
924
+ <span class="cline-any cline-no">&nbsp;</span>
925
+ <span class="cline-any cline-no">&nbsp;</span>
926
+ <span class="cline-any cline-no">&nbsp;</span>
927
+ <span class="cline-any cline-yes">21x</span>
928
+ <span class="cline-any cline-yes">2x</span>
929
+ <span class="cline-any cline-yes">1x</span>
930
+ <span class="cline-any cline-yes">1x</span>
931
+ <span class="cline-any cline-yes">1x</span>
932
+ <span class="cline-any cline-yes">2x</span>
933
+ <span class="cline-any cline-yes">21x</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-yes">21x</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-no">&nbsp;</span>
945
+ <span class="cline-any cline-yes">21x</span>
946
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
950
+ <span class="cline-any cline-no">&nbsp;</span>
951
+ <span class="cline-any cline-yes">21x</span>
952
+ <span class="cline-any cline-no">&nbsp;</span>
953
+ <span class="cline-any cline-no">&nbsp;</span>
954
+ <span class="cline-any cline-no">&nbsp;</span>
955
+ <span class="cline-any cline-no">&nbsp;</span>
956
+ <span class="cline-any cline-no">&nbsp;</span>
957
+ <span class="cline-any cline-yes">18x</span>
958
+ <span class="cline-any cline-yes">18x</span>
959
+ <span class="cline-any cline-yes">21x</span>
960
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
964
+ <span class="cline-any cline-no">&nbsp;</span>
965
+ <span class="cline-any cline-yes">21x</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-yes">21x</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-yes">21x</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-yes">21x</span>
984
+ <span class="cline-any cline-yes">2x</span>
985
+ <span class="cline-any cline-yes">1x</span>
986
+ <span class="cline-any cline-yes">1x</span>
987
+ <span class="cline-any cline-yes">1x</span>
988
+ <span class="cline-any cline-yes">2x</span>
989
+ <span class="cline-any cline-yes">21x</span>
990
+ <span class="cline-any cline-no">&nbsp;</span>
991
+ <span class="cline-any cline-no">&nbsp;</span>
992
+ <span class="cline-any cline-no">&nbsp;</span>
993
+ <span class="cline-any cline-no">&nbsp;</span>
994
+ <span class="cline-any cline-no">&nbsp;</span>
995
+ <span class="cline-any cline-yes">21x</span>
996
+ <span class="cline-any cline-no">&nbsp;</span>
997
+ <span class="cline-any cline-no">&nbsp;</span>
998
+ <span class="cline-any cline-no">&nbsp;</span>
999
+ <span class="cline-any cline-no">&nbsp;</span>
1000
+ <span class="cline-any cline-no">&nbsp;</span>
1001
+ <span class="cline-any cline-yes">17x</span>
1002
+ <span class="cline-any cline-yes">17x</span>
1003
+ <span class="cline-any cline-yes">21x</span>
1004
+ <span class="cline-any cline-yes">1x</span>
1005
+ <span class="cline-any cline-yes">1x</span>
1006
+ <span class="cline-any cline-yes">1x</span>
1007
+ <span class="cline-any cline-yes">1x</span>
1008
+ <span class="cline-any cline-yes">1x</span>
1009
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
1013
+ <span class="cline-any cline-no">&nbsp;</span>
1014
+ <span class="cline-any cline-yes">1x</span>
1015
+ <span class="cline-any cline-yes">1x</span>
1016
+ <span class="cline-any cline-yes">1x</span>
1017
+ <span class="cline-any cline-yes">1x</span>
1018
+ <span class="cline-any cline-yes">1x</span>
1019
+ <span class="cline-any cline-no">&nbsp;</span>
1020
+ <span class="cline-any cline-yes">1x</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-no">&nbsp;</span>
1026
+ <span class="cline-any cline-yes">1x</span>
1027
+ <span class="cline-any cline-yes">1x</span>
1028
+ <span class="cline-any cline-yes">1x</span>
1029
+ <span class="cline-any cline-yes">1x</span>
1030
+ <span class="cline-any cline-no">&nbsp;</span>
1031
+ <span class="cline-any cline-yes">16x</span>
1032
+ <span class="cline-any cline-yes">16x</span>
1033
+ <span class="cline-any cline-yes">21x</span>
1034
+ <span class="cline-any cline-yes">8x</span>
1035
+ <span class="cline-any cline-yes">8x</span>
1036
+ <span class="cline-any cline-yes">5x</span>
1037
+ <span class="cline-any cline-yes">5x</span>
1038
+ <span class="cline-any cline-yes">5x</span>
1039
+ <span class="cline-any cline-yes">5x</span>
1040
+ <span class="cline-any cline-yes">5x</span>
1041
+ <span class="cline-any cline-yes">5x</span>
1042
+ <span class="cline-any cline-yes">5x</span>
1043
+ <span class="cline-any cline-yes">5x</span>
1044
+ <span class="cline-any cline-yes">5x</span>
1045
+ <span class="cline-any cline-yes">5x</span>
1046
+ <span class="cline-any cline-yes">5x</span>
1047
+ <span class="cline-any cline-yes">5x</span>
1048
+ <span class="cline-any cline-yes">5x</span>
1049
+ <span class="cline-any cline-yes">5x</span>
1050
+ <span class="cline-any cline-yes">5x</span>
1051
+ <span class="cline-any cline-yes">5x</span>
1052
+ <span class="cline-any cline-yes">5x</span>
1053
+ <span class="cline-any cline-yes">8x</span>
1054
+ <span class="cline-any cline-yes">8x</span>
1055
+ <span class="cline-any cline-yes">8x</span>
1056
+ <span class="cline-any cline-yes">8x</span>
1057
+ <span class="cline-any cline-yes">8x</span>
1058
+ <span class="cline-any cline-yes">8x</span>
1059
+ <span class="cline-any cline-yes">5x</span>
1060
+ <span class="cline-any cline-yes">5x</span>
1061
+ <span class="cline-any cline-yes">5x</span>
1062
+ <span class="cline-any cline-no">&nbsp;</span>
1063
+ <span class="cline-any cline-yes">5x</span>
1064
+ <span class="cline-any cline-yes">8x</span>
1065
+ <span class="cline-any cline-yes">8x</span>
1066
+ <span class="cline-any cline-yes">3x</span>
1067
+ <span class="cline-any cline-yes">8x</span>
1068
+ <span class="cline-any cline-yes">8x</span>
1069
+ <span class="cline-any cline-yes">8x</span>
1070
+ <span class="cline-any cline-yes">8x</span>
1071
+ <span class="cline-any cline-yes">8x</span>
1072
+ <span class="cline-any cline-yes">8x</span>
1073
+ <span class="cline-any cline-yes">10x</span>
1074
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const kanbn = require('../main');
1075
+ const utility = require('../utility');
1076
+ const inquirer = require('inquirer');
1077
+ const chrono = require('chrono-node');
1078
+ const yaml = require('yamljs');
1079
+ &nbsp;
1080
+ inquirer.registerPrompt('recursive', require('inquirer-recursive'));
1081
+ &nbsp;
1082
+ const searchFields = [
1083
+ {
1084
+ name: 'Id',
1085
+ field: 'id',
1086
+ type: 'string'
1087
+ },
1088
+ {
1089
+ name: 'Name',
1090
+ field: 'name',
1091
+ type: 'string'
1092
+ },
1093
+ {
1094
+ name: 'Description',
1095
+ field: 'description',
1096
+ type: 'string'
1097
+ },
1098
+ {
1099
+ name: 'Column',
1100
+ field: 'column',
1101
+ type: 'string'
1102
+ },
1103
+ {
1104
+ name: 'Created',
1105
+ field: 'created',
1106
+ type: 'date'
1107
+ },
1108
+ {
1109
+ name: 'Updated',
1110
+ field: 'updated',
1111
+ type: 'date'
1112
+ },
1113
+ {
1114
+ name: 'Started',
1115
+ field: 'started',
1116
+ type: 'date'
1117
+ },
1118
+ {
1119
+ name: 'Completed',
1120
+ field: 'completed',
1121
+ type: 'date'
1122
+ },
1123
+ {
1124
+ name: 'Due',
1125
+ field: 'due',
1126
+ type: 'date'
1127
+ },
1128
+ {
1129
+ name: 'Planned start',
1130
+ field: 'plannedStart',
1131
+ type: 'date'
1132
+ },
1133
+ {
1134
+ name: 'Planned finish',
1135
+ field: 'plannedFinish',
1136
+ type: 'date'
1137
+ },
1138
+ {
1139
+ name: 'Progress',
1140
+ field: 'progress',
1141
+ type: 'number'
1142
+ },
1143
+ {
1144
+ name: 'Sub-tasks',
1145
+ field: 'sub-task',
1146
+ type: 'string'
1147
+ },
1148
+ {
1149
+ name: 'Count sub-tasks',
1150
+ field: 'count-sub-tasks',
1151
+ type: 'number'
1152
+ },
1153
+ {
1154
+ name: 'Tags',
1155
+ field: 'tag',
1156
+ type: 'string'
1157
+ },
1158
+ {
1159
+ name: 'Count tags',
1160
+ field: 'count-tags',
1161
+ type: 'number'
1162
+ },
1163
+ {
1164
+ name: 'Relations',
1165
+ field: 'relation',
1166
+ type: 'string'
1167
+ },
1168
+ {
1169
+ name: 'Count relations',
1170
+ field: 'count-relations',
1171
+ type: 'number'
1172
+ },
1173
+ {
1174
+ name: 'Comments',
1175
+ field: 'comment',
1176
+ type: 'string'
1177
+ },
1178
+ {
1179
+ name: 'Count comments',
1180
+ field: 'count-comments',
1181
+ type: 'number'
1182
+ },
1183
+ {
1184
+ name: 'Assigned',
1185
+ field: 'assigned',
1186
+ type: 'string'
1187
+ }
1188
+ ];
1189
+ &nbsp;
1190
+ /**
1191
+ * Build search filters interactively
1192
+ * @return {Promise&lt;any&gt;}
1193
+ */
1194
+ async function interactive() {
1195
+ return await inquirer.prompt([
1196
+ {
1197
+ type: 'recursive',
1198
+ name: 'filters',
1199
+ initialMessage: 'Add a filter?',
1200
+ message: 'Add another filter?',
1201
+ default: true,
1202
+ prompts: [
1203
+ {
1204
+ type: 'rawlist',
1205
+ name: 'type',
1206
+ message: 'Filter type:',
1207
+ default: searchFields[0].name,
1208
+ choices: [
1209
+ ...searchFields.map(s =&gt; s.name),
1210
+ new inquirer.Separator(),
1211
+ 'None'
1212
+ ]
1213
+ },
1214
+ {
1215
+ type: 'input',
1216
+ name: 'value',
1217
+ message: 'Filter value:',
1218
+ default: '',
1219
+ when: answers =&gt; searchFields
1220
+ .filter(s =&gt; s.type === 'string')
1221
+ .map(s =&gt; s.name)
1222
+ .indexOf(answers.type) !== -1,
1223
+ validate: async value =&gt; {
1224
+ if (!value) {
1225
+ return 'Filter value cannot be empty';
1226
+ }
1227
+ return true;
1228
+ }
1229
+ },
1230
+ {
1231
+ type: 'input',
1232
+ name: 'value',
1233
+ message: 'Filter value:',
1234
+ default: '',
1235
+ when: answers =&gt; searchFields
1236
+ .filter(s =&gt; s.type === 'date')
1237
+ .map(s =&gt; s.name)
1238
+ .indexOf(answers.type) !== -1,
1239
+ validate: async value =&gt; {
1240
+ if (!value) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1241
+ <span class="cstat-no" title="statement not covered" > return 'Filter value cannot be empty';</span>
1242
+ <span class="cstat-no" title="statement not covered" > }</span>
1243
+ if (chrono.parseDate(value) === null) {
1244
+ return 'Unable to parse date';
1245
+ }
1246
+ <span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" > return true;</span></span>
1247
+ }
1248
+ },
1249
+ {
1250
+ type: 'input',
1251
+ name: 'value',
1252
+ message: 'Filter value:',
1253
+ default: '',
1254
+ when: answers =&gt; searchFields
1255
+ .filter(s =&gt; s.type === 'number')
1256
+ .map(s =&gt; s.name)
1257
+ .indexOf(answers.type) !== -1,
1258
+ validate: async value =&gt; {
1259
+ if (!value) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1260
+ <span class="cstat-no" title="statement not covered" > return 'Filter value cannot be empty';</span>
1261
+ <span class="cstat-no" title="statement not covered" > }</span>
1262
+ if (isNaN(value)) {
1263
+ return 'Filter value must be numeric';
1264
+ }
1265
+ <span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" > return true;</span></span>
1266
+ }
1267
+ },
1268
+ {
1269
+ type: 'confirm',
1270
+ name: 'value',
1271
+ message: 'Filter value:',
1272
+ default: true,
1273
+ when: answers =&gt; searchFields
1274
+ .filter(s =&gt; s.type === 'boolean')
1275
+ .map(s =&gt; s.name)
1276
+ .indexOf(answers.type) !== -1
1277
+ }
1278
+ ]
1279
+ }
1280
+ ]);
1281
+ }
1282
+ &nbsp;
1283
+ /**
1284
+ * Search tasks
1285
+ * @param {object} filters
1286
+ * @param {boolean} quiet
1287
+ * @param {boolean} json
1288
+ */
1289
+ function findTasks(filters, quiet, json) {
1290
+ const removeEmptyProperties = o =&gt; Object.fromEntries(Object.entries(o).filter(
1291
+ ([k, v]) =&gt; !(Array.isArray(v) <span class="branch-0 cbranch-no" title="branch not covered" >&amp;&amp; v.length == 0)</span> &amp;&amp; !!v
1292
+ ));
1293
+ kanbn
1294
+ .search(filters, quiet)
1295
+ .then(results =&gt; {
1296
+ if (quiet) {
1297
+ console.log(json ? JSON.stringify(results, null, 2) : results.join('\n'));
1298
+ } else {
1299
+ if (json) {
1300
+ console.log(JSON.stringify(results, null, 2));
1301
+ } else {
1302
+ console.log(`Found ${results.length} task${results.length === 1 ? '' : 's'}`);
1303
+ if (results.length &gt; 0) {
1304
+ console.log('---');
1305
+ }
1306
+ console.log(results.map(result =&gt; yaml.stringify(removeEmptyProperties(result), 4, 2).trim()).join('\n---\n'));
1307
+ }
1308
+ }
1309
+ })
1310
+ .catch(error =&gt; {
1311
+ <span class="cstat-no" title="statement not covered" > utility.error(error);</span>
1312
+ });
1313
+ }
1314
+ &nbsp;
1315
+ /**
1316
+ * Add a filter to the filters object without over-writing any existing filters
1317
+ * @param {object} filters The current filter object
1318
+ * @param {string} filterName The property name for the filter
1319
+ * @param {string} filterValue The filter value
1320
+ */
1321
+ function addFilterValue(filters, filterName, filterValue) {
1322
+ if (filters[filterName]) {
1323
+ if (Array.isArray(filters[filterName])) {
1324
+ filters[filterName].push(filterValue);
1325
+ } else {
1326
+ filters[filterName] = [filters[filterName], filterValue];
1327
+ }
1328
+ } else {
1329
+ filters[filterName] = filterValue;
1330
+ }
1331
+ }
1332
+ &nbsp;
1333
+ /**
1334
+ * Convert a filter or array of filters to numeric values
1335
+ * @param {object} filters The current filter object
1336
+ * @param {string} filterName The property name for the filter
1337
+ * @return {boolean} True if all values could be converted
1338
+ */
1339
+ function convertNumericFilters(filters, filterName) {
1340
+ if (Array.isArray(filters[filterName])) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1341
+ <span class="cstat-no" title="statement not covered" > for (let i = 0; i &lt; filters[filterName].length; i++) {</span>
1342
+ <span class="cstat-no" title="statement not covered" > const numericValue = parseInt(filters[filterName][i]);</span>
1343
+ <span class="cstat-no" title="statement not covered" > if (isNaN(numericValue)) {</span>
1344
+ <span class="cstat-no" title="statement not covered" > return false;</span>
1345
+ <span class="cstat-no" title="statement not covered" > }</span>
1346
+ <span class="cstat-no" title="statement not covered" > filters[filterName][i] = numericValue;</span>
1347
+ <span class="cstat-no" title="statement not covered" > }</span>
1348
+ } else {
1349
+ const numericValue = parseInt(filters[filterName]);
1350
+ if (isNaN(numericValue)) {
1351
+ return false;
1352
+ }
1353
+ filters[filterName] = numericValue;
1354
+ }
1355
+ return true;
1356
+ }
1357
+ &nbsp;
1358
+ /**
1359
+ * Convert a filter or array of filters to date values
1360
+ * @param {object} filters The current filter object
1361
+ * @param {string} filterName The property name for the filter
1362
+ * @return {boolean} True if all values could be converted
1363
+ */
1364
+ function convertDateFilters(filters, filterName) {
1365
+ if (Array.isArray(filters[filterName])) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1366
+ <span class="cstat-no" title="statement not covered" > for (let i = 0; i &lt; filters[filterName].length; i++) {</span>
1367
+ <span class="cstat-no" title="statement not covered" > const dateValue = chrono.parseDate(filters[filterName][i]);</span>
1368
+ <span class="cstat-no" title="statement not covered" > if (dateValue === null) {</span>
1369
+ <span class="cstat-no" title="statement not covered" > return false;</span>
1370
+ <span class="cstat-no" title="statement not covered" > }</span>
1371
+ <span class="cstat-no" title="statement not covered" > filters[filterName][i] = dateValue;</span>
1372
+ <span class="cstat-no" title="statement not covered" > }</span>
1373
+ } else {
1374
+ const dateValue = chrono.parseDate(filters[filterName]);
1375
+ if (dateValue === null) {
1376
+ return false;
1377
+ }
1378
+ filters[filterName] = dateValue;
1379
+ }
1380
+ return true;
1381
+ }
1382
+ &nbsp;
1383
+ module.exports = async args =&gt; {
1384
+ &nbsp;
1385
+ // Make sure kanbn has been initialised
1386
+ if (!await kanbn.initialised()) {
1387
+ utility.error('Kanbn has not been initialised in this folder\nTry running: {b}kanbn init{b}');
1388
+ return;
1389
+ }
1390
+ &nbsp;
1391
+ // Get the index and make sure it has some columns
1392
+ let index;
1393
+ try {
1394
+ index = await kanbn.getIndex();
1395
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (error) {</span>
1396
+ <span class="cstat-no" title="statement not covered" > utility.error(error);</span>
1397
+ <span class="cstat-no" title="statement not covered" > return;</span>
1398
+ <span class="cstat-no" title="statement not covered" > }</span>
1399
+ const columnNames = Object.keys(index.columns);
1400
+ if (!columnNames.length) {
1401
+ utility.error('No columns defined in the index\nTry running {b}kanbn init -c "column name"{b}');
1402
+ return;
1403
+ }
1404
+ &nbsp;
1405
+ // Add custom fields to search fields
1406
+ if ('customFields' in index.options) {
1407
+ for (let customField of index.options.customFields) {
1408
+ searchFields.push({
1409
+ name: customField.name,
1410
+ field: customField.name,
1411
+ type: customField.type
1412
+ });
1413
+ }
1414
+ }
1415
+ &nbsp;
1416
+ // Get filters from args
1417
+ const filters = {};
1418
+ for (let filterProperty of searchFields.map(s =&gt; s.field)) {
1419
+ if (args[filterProperty]) {
1420
+ filters[filterProperty] = args[filterProperty];
1421
+ }
1422
+ }
1423
+ &nbsp;
1424
+ // Check and convert numeric filters
1425
+ if ('count-sub-tasks' in filters) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1426
+ <span class="cstat-no" title="statement not covered" > if (!convertNumericFilters(filters, 'count-sub-tasks')) {</span>
1427
+ <span class="cstat-no" title="statement not covered" > utility.error('Count sub-tasks filter value must be numeric');</span>
1428
+ <span class="cstat-no" title="statement not covered" > return;</span>
1429
+ <span class="cstat-no" title="statement not covered" > }</span>
1430
+ <span class="cstat-no" title="statement not covered" > }</span>
1431
+ if ('count-tags' in filters) {
1432
+ if (!convertNumericFilters(filters, 'count-tags')) {
1433
+ utility.error('Count tags filter value must be numeric');
1434
+ return;
1435
+ }
1436
+ }
1437
+ if ('count-relations' in filters) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1438
+ <span class="cstat-no" title="statement not covered" > if (!convertNumericFilters(filters, 'count-relations')) {</span>
1439
+ <span class="cstat-no" title="statement not covered" > utility.error('Count relations filter value must be numeric');</span>
1440
+ <span class="cstat-no" title="statement not covered" > return;</span>
1441
+ <span class="cstat-no" title="statement not covered" > }</span>
1442
+ <span class="cstat-no" title="statement not covered" > }</span>
1443
+ if ('count-comments' in filters) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1444
+ <span class="cstat-no" title="statement not covered" > if (!convertNumericFilters(filters, 'count-comments')) {</span>
1445
+ <span class="cstat-no" title="statement not covered" > utility.error('Count comments filter value must be numeric');</span>
1446
+ <span class="cstat-no" title="statement not covered" > return;</span>
1447
+ <span class="cstat-no" title="statement not covered" > }</span>
1448
+ <span class="cstat-no" title="statement not covered" > }</span>
1449
+ if ('workload' in filters)<span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1450
+ <span class="cstat-no" title="statement not covered" > if (!convertNumericFilters(filters, 'workload')) {</span>
1451
+ <span class="cstat-no" title="statement not covered" > utility.error('Workload filter value must be numeric');</span>
1452
+ <span class="cstat-no" title="statement not covered" > return;</span>
1453
+ <span class="cstat-no" title="statement not covered" > }</span>
1454
+ <span class="cstat-no" title="statement not covered" > }</span>
1455
+ if ('progress' in filters)<span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1456
+ <span class="cstat-no" title="statement not covered" > if (!convertNumericFilters(filters, 'progress')) {</span>
1457
+ <span class="cstat-no" title="statement not covered" > utility.error('Progress filter value must be numeric');</span>
1458
+ <span class="cstat-no" title="statement not covered" > return;</span>
1459
+ <span class="cstat-no" title="statement not covered" > }</span>
1460
+ <span class="cstat-no" title="statement not covered" > }</span>
1461
+ &nbsp;
1462
+ // Check date filters
1463
+ if ('created' in filters) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1464
+ <span class="cstat-no" title="statement not covered" > if (!convertDateFilters(filters, 'created')) {</span>
1465
+ <span class="cstat-no" title="statement not covered" > utility.error('Unable to parse created date');</span>
1466
+ <span class="cstat-no" title="statement not covered" > return;</span>
1467
+ <span class="cstat-no" title="statement not covered" > }</span>
1468
+ <span class="cstat-no" title="statement not covered" > }</span>
1469
+ if ('updated' in filters) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1470
+ <span class="cstat-no" title="statement not covered" > if (!convertDateFilters(filters, 'updated')) {</span>
1471
+ <span class="cstat-no" title="statement not covered" > utility.error('Unable to parse updated date');</span>
1472
+ <span class="cstat-no" title="statement not covered" > return;</span>
1473
+ <span class="cstat-no" title="statement not covered" > }</span>
1474
+ <span class="cstat-no" title="statement not covered" > }</span>
1475
+ if ('started' in filters) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1476
+ <span class="cstat-no" title="statement not covered" > if (!convertDateFilters(filters, 'started')) {</span>
1477
+ <span class="cstat-no" title="statement not covered" > utility.error('Unable to parse started date');</span>
1478
+ <span class="cstat-no" title="statement not covered" > return;</span>
1479
+ <span class="cstat-no" title="statement not covered" > }</span>
1480
+ <span class="cstat-no" title="statement not covered" > }</span>
1481
+ if ('completed' in filters) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1482
+ <span class="cstat-no" title="statement not covered" > if (!convertDateFilters(filters, 'completed')) {</span>
1483
+ <span class="cstat-no" title="statement not covered" > utility.error('Unable to parse completed date');</span>
1484
+ <span class="cstat-no" title="statement not covered" > return;</span>
1485
+ <span class="cstat-no" title="statement not covered" > }</span>
1486
+ <span class="cstat-no" title="statement not covered" > }</span>
1487
+ if ('due' in filters) {
1488
+ if (!convertDateFilters(filters, 'due')) {
1489
+ utility.error('Unable to parse due date');
1490
+ return;
1491
+ }
1492
+ }
1493
+ if ('plannedStart' in filters) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1494
+ <span class="cstat-no" title="statement not covered" > if (!convertDateFilters(filters, 'plannedStart')) {</span>
1495
+ <span class="cstat-no" title="statement not covered" > utility.error('Unable to parse plannedStart date');</span>
1496
+ <span class="cstat-no" title="statement not covered" > return;</span>
1497
+ <span class="cstat-no" title="statement not covered" > }</span>
1498
+ <span class="cstat-no" title="statement not covered" > }</span>
1499
+ if ('plannedFinish' in filters) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1500
+ <span class="cstat-no" title="statement not covered" > if (!convertDateFilters(filters, 'plannedFinish')) {</span>
1501
+ <span class="cstat-no" title="statement not covered" > utility.error('Unable to parse plannedFinish date');</span>
1502
+ <span class="cstat-no" title="statement not covered" > return;</span>
1503
+ <span class="cstat-no" title="statement not covered" > }</span>
1504
+ <span class="cstat-no" title="statement not covered" > }</span>
1505
+ &nbsp;
1506
+ // Check and add custom field filters
1507
+ if ('customFields' in index.options) {
1508
+ for (let customField of index.options.customFields) {
1509
+ if (customField.name in args) {
1510
+ filters[customField.name] = args[customField.name];
1511
+ switch (customField.type) {
1512
+ <span class="branch-0 cbranch-no" title="branch not covered" > case 'boolean':</span>
1513
+ <span class="cstat-no" title="statement not covered" > if (typeof filters[customField.name] !== 'boolean') {</span>
1514
+ <span class="cstat-no" title="statement not covered" > utility.error(`Custom field "${customField.name}" value is not a boolean`);</span>
1515
+ <span class="cstat-no" title="statement not covered" > return;</span>
1516
+ <span class="cstat-no" title="statement not covered" > }</span>
1517
+ <span class="cstat-no" title="statement not covered" > break;</span>
1518
+ case 'number':
1519
+ if (!convertNumericFilters(filters, customField.name)) {
1520
+ utility.error(`Custom field "${customField.name}" value is not a number`);
1521
+ return;
1522
+ }
1523
+ <span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" > break;</span></span>
1524
+ <span class="branch-0 cbranch-no" title="branch not covered" > case 'date':</span>
1525
+ <span class="cstat-no" title="statement not covered" > if (!convertDateFilters(filters, customField.name)) {</span>
1526
+ <span class="cstat-no" title="statement not covered" > utility.error(`Unable to parse date for custom field "${customField.name}"`);</span>
1527
+ <span class="cstat-no" title="statement not covered" > return;</span>
1528
+ <span class="cstat-no" title="statement not covered" > }</span>
1529
+ <span class="cstat-no" title="statement not covered" > break;</span>
1530
+ <span class="branch-0 cbranch-no" title="branch not covered" > default: break;</span>
1531
+ }
1532
+ }
1533
+ }
1534
+ <span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" > }</span></span>
1535
+ &nbsp;
1536
+ // Build search filters interactively
1537
+ if (args.interactive) {
1538
+ interactive()
1539
+ .then(answers =&gt; {
1540
+ inquirer
1541
+ .prompt([
1542
+ {
1543
+ type: 'confirm',
1544
+ name: 'nonquiet',
1545
+ message: 'Show full task details in results?',
1546
+ default: !args.quiet
1547
+ },
1548
+ {
1549
+ type: 'confirm',
1550
+ name: 'json',
1551
+ message: 'Show results in JSON format?',
1552
+ default: !!args.json
1553
+ }
1554
+ ])
1555
+ .then(otherAnswers =&gt; {
1556
+ for (let filter of answers.filters) {
1557
+ addFilterValue(
1558
+ filters,
1559
+ searchFields.find(s =&gt; s.name === filter.type).field,
1560
+ filter.value
1561
+ );
1562
+ }
1563
+ findTasks(filters, !otherAnswers.nonquiet, otherAnswers.json);
1564
+ })
1565
+ .catch(error =&gt; {
1566
+ <span class="cstat-no" title="statement not covered" > utility.error(error);</span>
1567
+ });
1568
+ })
1569
+ .catch(error =&gt; {
1570
+ utility.error(error);
1571
+ });
1572
+ &nbsp;
1573
+ // Otherwise create task non-interactively
1574
+ } else {
1575
+ findTasks(filters, args.quiet, args.json);
1576
+ }
1577
+ };
1578
+ &nbsp;</pre></td></tr></table></pre>
1579
+
1580
+ <div class='push'></div><!-- for sticky footer -->
1581
+ </div><!-- /wrapper -->
1582
+ <div class='footer quiet pad2 space-top1 center small'>
1583
+ Code coverage generated by
1584
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1585
+ at 2026-08-26T20:46:31.702Z
1586
+ </div>
1587
+ <script src="../../../prettify.js"></script>
1588
+ <script>
1589
+ window.onload = function () {
1590
+ prettyPrint();
1591
+ };
1592
+ </script>
1593
+ <script src="../../../sorter.js"></script>
1594
+ <script src="../../../block-navigation.js"></script>
1595
+ </body>
1596
+ </html>
1597
+