@rushstack/rush-http-build-cache-plugin 5.151.0 → 5.153.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.
- package/LICENSE +24 -0
- package/package.json +6 -6
- package/.eslintrc.js +0 -12
- package/.rush/temp/chunked-rush-logs/rush-http-build-cache-plugin._phase_build.chunks.jsonl +0 -7
- package/.rush/temp/chunked-rush-logs/rush-http-build-cache-plugin._phase_test.chunks.jsonl +0 -15
- package/.rush/temp/operation/_phase_build/all.log +0 -7
- package/.rush/temp/operation/_phase_build/log-chunks.jsonl +0 -7
- package/.rush/temp/operation/_phase_build/state.json +0 -3
- package/.rush/temp/operation/_phase_test/all.log +0 -15
- package/.rush/temp/operation/_phase_test/log-chunks.jsonl +0 -15
- package/.rush/temp/operation/_phase_test/state.json +0 -3
- package/.rush/temp/rushstack+rush-http-build-cache-plugin-_phase_build-09ba4578e86c440fbc153748b6a18b90fb360365.tar.log +0 -32
- package/.rush/temp/rushstack+rush-http-build-cache-plugin-_phase_test-bdfa659684a6b57c1ae1e0d2fa0aac93dac1c358.tar.log +0 -25
- package/.rush/temp/shrinkwrap-deps.json +0 -9
- package/config/jest.config.json +0 -14
- package/config/rig.json +0 -18
- package/coverage/HttpBuildCacheProvider.ts.html +0 -1426
- package/coverage/RushHttpBuildCachePlugin.ts.html +0 -328
- package/coverage/base.css +0 -224
- package/coverage/block-navigation.js +0 -87
- package/coverage/cobertura-coverage.xml +0 -641
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +0 -146
- package/coverage/index.ts.html +0 -106
- package/coverage/junit.xml +0 -9
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +0 -196
- package/lib/test/HttpBuildCacheProvider.test.d.ts +0 -2
- package/lib/test/HttpBuildCacheProvider.test.d.ts.map +0 -1
- package/lib/test/HttpBuildCacheProvider.test.js +0 -94
- package/lib/test/HttpBuildCacheProvider.test.js.map +0 -1
- package/rush-logs/rush-http-build-cache-plugin._phase_build.cache.log +0 -3
- package/rush-logs/rush-http-build-cache-plugin._phase_build.log +0 -7
- package/rush-logs/rush-http-build-cache-plugin._phase_test.cache.log +0 -3
- package/rush-logs/rush-http-build-cache-plugin._phase_test.log +0 -15
- package/src/HttpBuildCacheProvider.ts +0 -447
- package/src/RushHttpBuildCachePlugin.ts +0 -81
- package/src/index.ts +0 -7
- package/src/schemas/http-config.schema.json +0 -52
- package/src/test/HttpBuildCacheProvider.test.ts +0 -128
- package/temp/build/lint/_eslint-it73M-Rx.json +0 -21
- package/temp/build/typescript/file-copy.json +0 -1
- package/temp/build/typescript/ts_l9Fw4VUO.json +0 -1
- package/temp/test/jest/haste-map-8bff56e236187dbf28a94cdea7ee2158-1f8f3a8b20228094c245723445dd2c9a-e95bfd62c357a87bf3c5f47c6c3a2910 +0 -0
- package/temp/test/jest/jest-transform-cache-8bff56e236187dbf28a94cdea7ee2158-79ef2876fae7ca75eedb2aa53dc48338/33/core_3305ad7ebc3e67008b0e3d5efb3c89fa +0 -159
- package/temp/test/jest/jest-transform-cache-8bff56e236187dbf28a94cdea7ee2158-79ef2876fae7ca75eedb2aa53dc48338/3b/core_3bc9b1aaea9d0e6b8c2abd6cc99051d8 +0 -163
- package/temp/test/jest/jest-transform-cache-8bff56e236187dbf28a94cdea7ee2158-79ef2876fae7ca75eedb2aa53dc48338/66/data_662ee7a852684a50b5465ea7d1610925 +0 -14
- package/temp/test/jest/jest-transform-cache-8bff56e236187dbf28a94cdea7ee2158-79ef2876fae7ca75eedb2aa53dc48338/b7/jsonschemadraft04_b75c7627c284f64550e887c2057ef2b6 +0 -139
- package/temp/test/jest/jest-transform-cache-8bff56e236187dbf28a94cdea7ee2158-79ef2876fae7ca75eedb2aa53dc48338/b9/jsonschemadraft07_b9cfe2070b124a335100e419866f22e9 +0 -152
- package/temp/test/jest/jest-transform-cache-8bff56e236187dbf28a94cdea7ee2158-79ef2876fae7ca75eedb2aa53dc48338/d5/core_d54674276357d38b544776746c491fe4 +0 -159
- package/temp/test/jest/jest-transform-cache-8bff56e236187dbf28a94cdea7ee2158-79ef2876fae7ca75eedb2aa53dc48338/dd/core_ddf14bea0382190ed8fdfd5580a03808 +0 -163
- package/temp/test/jest/jest-transform-cache-8bff56e236187dbf28a94cdea7ee2158-79ef2876fae7ca75eedb2aa53dc48338/ef/jsonschemadraft07_ef987ddfbeb03ba4a34e7532df7928e0 +0 -152
- package/temp/test/jest/jest-transform-cache-8bff56e236187dbf28a94cdea7ee2158-79ef2876fae7ca75eedb2aa53dc48338/f3/data_f34177071494d6cb15f3fe5d39e6e64d +0 -14
- package/temp/test/jest/jest-transform-cache-8bff56e236187dbf28a94cdea7ee2158-79ef2876fae7ca75eedb2aa53dc48338/f8/jsonschemadraft04_f83be58b69304badc2bd53040f13bbfa +0 -139
- package/temp/test/jest/perf-cache-8bff56e236187dbf28a94cdea7ee2158-da39a3ee5e6b4b0d3255bfef95601890 +0 -1
- package/tsconfig.json +0 -3
|
@@ -1,1426 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
<!doctype html>
|
|
3
|
-
<html lang="en">
|
|
4
|
-
|
|
5
|
-
<head>
|
|
6
|
-
<title>Code coverage report for HttpBuildCacheProvider.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> HttpBuildCacheProvider.ts</h1>
|
|
23
|
-
<div class='clearfix'>
|
|
24
|
-
|
|
25
|
-
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">65.99% </span>
|
|
27
|
-
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>295/447</span>
|
|
29
|
-
</div>
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">56.14% </span>
|
|
34
|
-
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>32/57</span>
|
|
36
|
-
</div>
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
<div class='fl pad1y space-right2'>
|
|
40
|
-
<span class="strong">61.53% </span>
|
|
41
|
-
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>8/13</span>
|
|
43
|
-
</div>
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">65.99% </span>
|
|
48
|
-
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>295/447</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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
|
|
514
|
-
<span class="cline-any cline-yes">1x</span>
|
|
515
|
-
<span class="cline-any cline-yes">1x</span>
|
|
516
|
-
<span class="cline-any cline-yes">1x</span>
|
|
517
|
-
<span class="cline-any cline-yes">1x</span>
|
|
518
|
-
<span class="cline-any cline-yes">1x</span>
|
|
519
|
-
<span class="cline-any cline-yes">1x</span>
|
|
520
|
-
<span class="cline-any cline-yes">1x</span>
|
|
521
|
-
<span class="cline-any cline-yes">1x</span>
|
|
522
|
-
<span class="cline-any cline-yes">1x</span>
|
|
523
|
-
<span class="cline-any cline-yes">1x</span>
|
|
524
|
-
<span class="cline-any cline-yes">1x</span>
|
|
525
|
-
<span class="cline-any cline-yes">1x</span>
|
|
526
|
-
<span class="cline-any cline-yes">1x</span>
|
|
527
|
-
<span class="cline-any cline-yes">1x</span>
|
|
528
|
-
<span class="cline-any cline-yes">1x</span>
|
|
529
|
-
<span class="cline-any cline-yes">1x</span>
|
|
530
|
-
<span class="cline-any cline-yes">1x</span>
|
|
531
|
-
<span class="cline-any cline-yes">1x</span>
|
|
532
|
-
<span class="cline-any cline-yes">1x</span>
|
|
533
|
-
<span class="cline-any cline-yes">1x</span>
|
|
534
|
-
<span class="cline-any cline-yes">1x</span>
|
|
535
|
-
<span class="cline-any cline-yes">1x</span>
|
|
536
|
-
<span class="cline-any cline-yes">1x</span>
|
|
537
|
-
<span class="cline-any cline-yes">1x</span>
|
|
538
|
-
<span class="cline-any cline-yes">1x</span>
|
|
539
|
-
<span class="cline-any cline-yes">1x</span>
|
|
540
|
-
<span class="cline-any cline-yes">1x</span>
|
|
541
|
-
<span class="cline-any cline-yes">1x</span>
|
|
542
|
-
<span class="cline-any cline-yes">1x</span>
|
|
543
|
-
<span class="cline-any cline-yes">1x</span>
|
|
544
|
-
<span class="cline-any cline-yes">1x</span>
|
|
545
|
-
<span class="cline-any cline-yes">1x</span>
|
|
546
|
-
<span class="cline-any cline-yes">1x</span>
|
|
547
|
-
<span class="cline-any cline-yes">1x</span>
|
|
548
|
-
<span class="cline-any cline-yes">1x</span>
|
|
549
|
-
<span class="cline-any cline-yes">1x</span>
|
|
550
|
-
<span class="cline-any cline-yes">1x</span>
|
|
551
|
-
<span class="cline-any cline-yes">1x</span>
|
|
552
|
-
<span class="cline-any cline-yes">1x</span>
|
|
553
|
-
<span class="cline-any cline-yes">1x</span>
|
|
554
|
-
<span class="cline-any cline-yes">1x</span>
|
|
555
|
-
<span class="cline-any cline-yes">1x</span>
|
|
556
|
-
<span class="cline-any cline-yes">1x</span>
|
|
557
|
-
<span class="cline-any cline-yes">1x</span>
|
|
558
|
-
<span class="cline-any cline-yes">1x</span>
|
|
559
|
-
<span class="cline-any cline-yes">1x</span>
|
|
560
|
-
<span class="cline-any cline-yes">1x</span>
|
|
561
|
-
<span class="cline-any cline-yes">1x</span>
|
|
562
|
-
<span class="cline-any cline-yes">1x</span>
|
|
563
|
-
<span class="cline-any cline-yes">1x</span>
|
|
564
|
-
<span class="cline-any cline-yes">1x</span>
|
|
565
|
-
<span class="cline-any cline-yes">1x</span>
|
|
566
|
-
<span class="cline-any cline-yes">1x</span>
|
|
567
|
-
<span class="cline-any cline-yes">1x</span>
|
|
568
|
-
<span class="cline-any cline-yes">1x</span>
|
|
569
|
-
<span class="cline-any cline-yes">1x</span>
|
|
570
|
-
<span class="cline-any cline-yes">1x</span>
|
|
571
|
-
<span class="cline-any cline-yes">1x</span>
|
|
572
|
-
<span class="cline-any cline-yes">1x</span>
|
|
573
|
-
<span class="cline-any cline-yes">1x</span>
|
|
574
|
-
<span class="cline-any cline-yes">1x</span>
|
|
575
|
-
<span class="cline-any cline-yes">1x</span>
|
|
576
|
-
<span class="cline-any cline-yes">1x</span>
|
|
577
|
-
<span class="cline-any cline-yes">1x</span>
|
|
578
|
-
<span class="cline-any cline-yes">1x</span>
|
|
579
|
-
<span class="cline-any cline-yes">1x</span>
|
|
580
|
-
<span class="cline-any cline-yes">1x</span>
|
|
581
|
-
<span class="cline-any cline-yes">1x</span>
|
|
582
|
-
<span class="cline-any cline-yes">1x</span>
|
|
583
|
-
<span class="cline-any cline-yes">1x</span>
|
|
584
|
-
<span class="cline-any cline-no"> </span>
|
|
585
|
-
<span class="cline-any cline-no"> </span>
|
|
586
|
-
<span class="cline-any cline-yes">1x</span>
|
|
587
|
-
<span class="cline-any cline-yes">1x</span>
|
|
588
|
-
<span class="cline-any cline-yes">2x</span>
|
|
589
|
-
<span class="cline-any cline-yes">2x</span>
|
|
590
|
-
<span class="cline-any cline-yes">2x</span>
|
|
591
|
-
<span class="cline-any cline-yes">2x</span>
|
|
592
|
-
<span class="cline-any cline-yes">2x</span>
|
|
593
|
-
<span class="cline-any cline-yes">2x</span>
|
|
594
|
-
<span class="cline-any cline-yes">2x</span>
|
|
595
|
-
<span class="cline-any cline-yes">2x</span>
|
|
596
|
-
<span class="cline-any cline-yes">2x</span>
|
|
597
|
-
<span class="cline-any cline-yes">2x</span>
|
|
598
|
-
<span class="cline-any cline-yes">2x</span>
|
|
599
|
-
<span class="cline-any cline-yes">2x</span>
|
|
600
|
-
<span class="cline-any cline-yes">1x</span>
|
|
601
|
-
<span class="cline-any cline-yes">1x</span>
|
|
602
|
-
<span class="cline-any cline-yes">2x</span>
|
|
603
|
-
<span class="cline-any cline-yes">2x</span>
|
|
604
|
-
<span class="cline-any cline-yes">2x</span>
|
|
605
|
-
<span class="cline-any cline-yes">2x</span>
|
|
606
|
-
<span class="cline-any cline-yes">2x</span>
|
|
607
|
-
<span class="cline-any cline-yes">2x</span>
|
|
608
|
-
<span class="cline-any cline-yes">2x</span>
|
|
609
|
-
<span class="cline-any cline-yes">2x</span>
|
|
610
|
-
<span class="cline-any cline-yes">2x</span>
|
|
611
|
-
<span class="cline-any cline-yes">2x</span>
|
|
612
|
-
<span class="cline-any cline-yes">2x</span>
|
|
613
|
-
<span class="cline-any cline-yes">2x</span>
|
|
614
|
-
<span class="cline-any cline-yes">2x</span>
|
|
615
|
-
<span class="cline-any cline-yes">1x</span>
|
|
616
|
-
<span class="cline-any cline-yes">2x</span>
|
|
617
|
-
<span class="cline-any cline-yes">2x</span>
|
|
618
|
-
<span class="cline-any cline-yes">1x</span>
|
|
619
|
-
<span class="cline-any cline-yes">1x</span>
|
|
620
|
-
<span class="cline-any cline-yes">1x</span>
|
|
621
|
-
<span class="cline-any cline-yes">2x</span>
|
|
622
|
-
<span class="cline-any cline-yes">1x</span>
|
|
623
|
-
<span class="cline-any cline-yes">1x</span>
|
|
624
|
-
<span class="cline-any cline-no"> </span>
|
|
625
|
-
<span class="cline-any cline-no"> </span>
|
|
626
|
-
<span class="cline-any cline-no"> </span>
|
|
627
|
-
<span class="cline-any cline-no"> </span>
|
|
628
|
-
<span class="cline-any cline-no"> </span>
|
|
629
|
-
<span class="cline-any cline-no"> </span>
|
|
630
|
-
<span class="cline-any cline-no"> </span>
|
|
631
|
-
<span class="cline-any cline-no"> </span>
|
|
632
|
-
<span class="cline-any cline-no"> </span>
|
|
633
|
-
<span class="cline-any cline-no"> </span>
|
|
634
|
-
<span class="cline-any cline-no"> </span>
|
|
635
|
-
<span class="cline-any cline-no"> </span>
|
|
636
|
-
<span class="cline-any cline-no"> </span>
|
|
637
|
-
<span class="cline-any cline-no"> </span>
|
|
638
|
-
<span class="cline-any cline-no"> </span>
|
|
639
|
-
<span class="cline-any cline-no"> </span>
|
|
640
|
-
<span class="cline-any cline-no"> </span>
|
|
641
|
-
<span class="cline-any cline-no"> </span>
|
|
642
|
-
<span class="cline-any cline-no"> </span>
|
|
643
|
-
<span class="cline-any cline-no"> </span>
|
|
644
|
-
<span class="cline-any cline-no"> </span>
|
|
645
|
-
<span class="cline-any cline-no"> </span>
|
|
646
|
-
<span class="cline-any cline-no"> </span>
|
|
647
|
-
<span class="cline-any cline-no"> </span>
|
|
648
|
-
<span class="cline-any cline-no"> </span>
|
|
649
|
-
<span class="cline-any cline-no"> </span>
|
|
650
|
-
<span class="cline-any cline-no"> </span>
|
|
651
|
-
<span class="cline-any cline-no"> </span>
|
|
652
|
-
<span class="cline-any cline-yes">1x</span>
|
|
653
|
-
<span class="cline-any cline-yes">1x</span>
|
|
654
|
-
<span class="cline-any cline-no"> </span>
|
|
655
|
-
<span class="cline-any cline-no"> </span>
|
|
656
|
-
<span class="cline-any cline-no"> </span>
|
|
657
|
-
<span class="cline-any cline-no"> </span>
|
|
658
|
-
<span class="cline-any cline-no"> </span>
|
|
659
|
-
<span class="cline-any cline-no"> </span>
|
|
660
|
-
<span class="cline-any cline-no"> </span>
|
|
661
|
-
<span class="cline-any cline-no"> </span>
|
|
662
|
-
<span class="cline-any cline-no"> </span>
|
|
663
|
-
<span class="cline-any cline-no"> </span>
|
|
664
|
-
<span class="cline-any cline-no"> </span>
|
|
665
|
-
<span class="cline-any cline-no"> </span>
|
|
666
|
-
<span class="cline-any cline-yes">1x</span>
|
|
667
|
-
<span class="cline-any cline-yes">1x</span>
|
|
668
|
-
<span class="cline-any cline-no"> </span>
|
|
669
|
-
<span class="cline-any cline-no"> </span>
|
|
670
|
-
<span class="cline-any cline-no"> </span>
|
|
671
|
-
<span class="cline-any cline-no"> </span>
|
|
672
|
-
<span class="cline-any cline-no"> </span>
|
|
673
|
-
<span class="cline-any cline-no"> </span>
|
|
674
|
-
<span class="cline-any cline-no"> </span>
|
|
675
|
-
<span class="cline-any cline-no"> </span>
|
|
676
|
-
<span class="cline-any cline-no"> </span>
|
|
677
|
-
<span class="cline-any cline-no"> </span>
|
|
678
|
-
<span class="cline-any cline-no"> </span>
|
|
679
|
-
<span class="cline-any cline-no"> </span>
|
|
680
|
-
<span class="cline-any cline-no"> </span>
|
|
681
|
-
<span class="cline-any cline-no"> </span>
|
|
682
|
-
<span class="cline-any cline-no"> </span>
|
|
683
|
-
<span class="cline-any cline-no"> </span>
|
|
684
|
-
<span class="cline-any cline-no"> </span>
|
|
685
|
-
<span class="cline-any cline-no"> </span>
|
|
686
|
-
<span class="cline-any cline-no"> </span>
|
|
687
|
-
<span class="cline-any cline-no"> </span>
|
|
688
|
-
<span class="cline-any cline-no"> </span>
|
|
689
|
-
<span class="cline-any cline-no"> </span>
|
|
690
|
-
<span class="cline-any cline-no"> </span>
|
|
691
|
-
<span class="cline-any cline-no"> </span>
|
|
692
|
-
<span class="cline-any cline-no"> </span>
|
|
693
|
-
<span class="cline-any cline-no"> </span>
|
|
694
|
-
<span class="cline-any cline-no"> </span>
|
|
695
|
-
<span class="cline-any cline-no"> </span>
|
|
696
|
-
<span class="cline-any cline-no"> </span>
|
|
697
|
-
<span class="cline-any cline-no"> </span>
|
|
698
|
-
<span class="cline-any cline-no"> </span>
|
|
699
|
-
<span class="cline-any cline-no"> </span>
|
|
700
|
-
<span class="cline-any cline-yes">1x</span>
|
|
701
|
-
<span class="cline-any cline-yes">1x</span>
|
|
702
|
-
<span class="cline-any cline-no"> </span>
|
|
703
|
-
<span class="cline-any cline-no"> </span>
|
|
704
|
-
<span class="cline-any cline-no"> </span>
|
|
705
|
-
<span class="cline-any cline-no"> </span>
|
|
706
|
-
<span class="cline-any cline-no"> </span>
|
|
707
|
-
<span class="cline-any cline-no"> </span>
|
|
708
|
-
<span class="cline-any cline-no"> </span>
|
|
709
|
-
<span class="cline-any cline-no"> </span>
|
|
710
|
-
<span class="cline-any cline-no"> </span>
|
|
711
|
-
<span class="cline-any cline-no"> </span>
|
|
712
|
-
<span class="cline-any cline-yes">1x</span>
|
|
713
|
-
<span class="cline-any cline-yes">1x</span>
|
|
714
|
-
<span class="cline-any cline-yes">5x</span>
|
|
715
|
-
<span class="cline-any cline-yes">2x</span>
|
|
716
|
-
<span class="cline-any cline-yes">2x</span>
|
|
717
|
-
<span class="cline-any cline-yes">2x</span>
|
|
718
|
-
<span class="cline-any cline-no"> </span>
|
|
719
|
-
<span class="cline-any cline-no"> </span>
|
|
720
|
-
<span class="cline-any cline-yes">2x</span>
|
|
721
|
-
<span class="cline-any cline-yes">2x</span>
|
|
722
|
-
<span class="cline-any cline-yes">2x</span>
|
|
723
|
-
<span class="cline-any cline-yes">5x</span>
|
|
724
|
-
<span class="cline-any cline-yes">5x</span>
|
|
725
|
-
<span class="cline-any cline-yes">5x</span>
|
|
726
|
-
<span class="cline-any cline-yes">1x</span>
|
|
727
|
-
<span class="cline-any cline-yes">1x</span>
|
|
728
|
-
<span class="cline-any cline-yes">5x</span>
|
|
729
|
-
<span class="cline-any cline-yes">5x</span>
|
|
730
|
-
<span class="cline-any cline-yes">5x</span>
|
|
731
|
-
<span class="cline-any cline-yes">5x</span>
|
|
732
|
-
<span class="cline-any cline-yes">5x</span>
|
|
733
|
-
<span class="cline-any cline-yes">5x</span>
|
|
734
|
-
<span class="cline-any cline-yes">5x</span>
|
|
735
|
-
<span class="cline-any cline-yes">5x</span>
|
|
736
|
-
<span class="cline-any cline-yes">5x</span>
|
|
737
|
-
<span class="cline-any cline-yes">5x</span>
|
|
738
|
-
<span class="cline-any cline-yes">5x</span>
|
|
739
|
-
<span class="cline-any cline-yes">5x</span>
|
|
740
|
-
<span class="cline-any cline-yes">4x</span>
|
|
741
|
-
<span class="cline-any cline-yes">4x</span>
|
|
742
|
-
<span class="cline-any cline-yes">4x</span>
|
|
743
|
-
<span class="cline-any cline-yes">5x</span>
|
|
744
|
-
<span class="cline-any cline-no"> </span>
|
|
745
|
-
<span class="cline-any cline-no"> </span>
|
|
746
|
-
<span class="cline-any cline-yes">4x</span>
|
|
747
|
-
<span class="cline-any cline-yes">5x</span>
|
|
748
|
-
<span class="cline-any cline-no"> </span>
|
|
749
|
-
<span class="cline-any cline-no"> </span>
|
|
750
|
-
<span class="cline-any cline-no"> </span>
|
|
751
|
-
<span class="cline-any cline-no"> </span>
|
|
752
|
-
<span class="cline-any cline-yes">4x</span>
|
|
753
|
-
<span class="cline-any cline-yes">5x</span>
|
|
754
|
-
<span class="cline-any cline-yes">5x</span>
|
|
755
|
-
<span class="cline-any cline-yes">5x</span>
|
|
756
|
-
<span class="cline-any cline-yes">5x</span>
|
|
757
|
-
<span class="cline-any cline-yes">5x</span>
|
|
758
|
-
<span class="cline-any cline-yes">5x</span>
|
|
759
|
-
<span class="cline-any cline-yes">5x</span>
|
|
760
|
-
<span class="cline-any cline-yes">5x</span>
|
|
761
|
-
<span class="cline-any cline-yes">5x</span>
|
|
762
|
-
<span class="cline-any cline-yes">5x</span>
|
|
763
|
-
<span class="cline-any cline-yes">5x</span>
|
|
764
|
-
<span class="cline-any cline-yes">5x</span>
|
|
765
|
-
<span class="cline-any cline-yes">4x</span>
|
|
766
|
-
<span class="cline-any cline-yes">4x</span>
|
|
767
|
-
<span class="cline-any cline-yes">4x</span>
|
|
768
|
-
<span class="cline-any cline-yes">4x</span>
|
|
769
|
-
<span class="cline-any cline-yes">4x</span>
|
|
770
|
-
<span class="cline-any cline-yes">4x</span>
|
|
771
|
-
<span class="cline-any cline-yes">4x</span>
|
|
772
|
-
<span class="cline-any cline-yes">1x</span>
|
|
773
|
-
<span class="cline-any cline-yes">4x</span>
|
|
774
|
-
<span class="cline-any cline-yes">1x</span>
|
|
775
|
-
<span class="cline-any cline-yes">1x</span>
|
|
776
|
-
<span class="cline-any cline-yes">1x</span>
|
|
777
|
-
<span class="cline-any cline-yes">1x</span>
|
|
778
|
-
<span class="cline-any cline-yes">1x</span>
|
|
779
|
-
<span class="cline-any cline-yes">1x</span>
|
|
780
|
-
<span class="cline-any cline-yes">1x</span>
|
|
781
|
-
<span class="cline-any cline-yes">1x</span>
|
|
782
|
-
<span class="cline-any cline-yes">1x</span>
|
|
783
|
-
<span class="cline-any cline-yes">1x</span>
|
|
784
|
-
<span class="cline-any cline-yes">3x</span>
|
|
785
|
-
<span class="cline-any cline-yes">4x</span>
|
|
786
|
-
<span class="cline-any cline-yes">2x</span>
|
|
787
|
-
<span class="cline-any cline-yes">2x</span>
|
|
788
|
-
<span class="cline-any cline-yes">2x</span>
|
|
789
|
-
<span class="cline-any cline-yes">2x</span>
|
|
790
|
-
<span class="cline-any cline-yes">2x</span>
|
|
791
|
-
<span class="cline-any cline-yes">2x</span>
|
|
792
|
-
<span class="cline-any cline-yes">2x</span>
|
|
793
|
-
<span class="cline-any cline-yes">2x</span>
|
|
794
|
-
<span class="cline-any cline-yes">2x</span>
|
|
795
|
-
<span class="cline-any cline-yes">2x</span>
|
|
796
|
-
<span class="cline-any cline-yes">1x</span>
|
|
797
|
-
<span class="cline-any cline-yes">1x</span>
|
|
798
|
-
<span class="cline-any cline-yes">1x</span>
|
|
799
|
-
<span class="cline-any cline-yes">1x</span>
|
|
800
|
-
<span class="cline-any cline-no"> </span>
|
|
801
|
-
<span class="cline-any cline-yes">5x</span>
|
|
802
|
-
<span class="cline-any cline-yes">5x</span>
|
|
803
|
-
<span class="cline-any cline-yes">5x</span>
|
|
804
|
-
<span class="cline-any cline-yes">5x</span>
|
|
805
|
-
<span class="cline-any cline-yes">5x</span>
|
|
806
|
-
<span class="cline-any cline-yes">5x</span>
|
|
807
|
-
<span class="cline-any cline-yes">5x</span>
|
|
808
|
-
<span class="cline-any cline-yes">5x</span>
|
|
809
|
-
<span class="cline-any cline-yes">5x</span>
|
|
810
|
-
<span class="cline-any cline-yes">5x</span>
|
|
811
|
-
<span class="cline-any cline-yes">1x</span>
|
|
812
|
-
<span class="cline-any cline-yes">1x</span>
|
|
813
|
-
<span class="cline-any cline-yes">1x</span>
|
|
814
|
-
<span class="cline-any cline-yes">1x</span>
|
|
815
|
-
<span class="cline-any cline-yes">1x</span>
|
|
816
|
-
<span class="cline-any cline-yes">1x</span>
|
|
817
|
-
<span class="cline-any cline-yes">5x</span>
|
|
818
|
-
<span class="cline-any cline-no"> </span>
|
|
819
|
-
<span class="cline-any cline-no"> </span>
|
|
820
|
-
<span class="cline-any cline-yes">5x</span>
|
|
821
|
-
<span class="cline-any cline-yes">5x</span>
|
|
822
|
-
<span class="cline-any cline-yes">5x</span>
|
|
823
|
-
<span class="cline-any cline-yes">5x</span>
|
|
824
|
-
<span class="cline-any cline-yes">5x</span>
|
|
825
|
-
<span class="cline-any cline-yes">5x</span>
|
|
826
|
-
<span class="cline-any cline-yes">5x</span>
|
|
827
|
-
<span class="cline-any cline-yes">5x</span>
|
|
828
|
-
<span class="cline-any cline-yes">1x</span>
|
|
829
|
-
<span class="cline-any cline-yes">1x</span>
|
|
830
|
-
<span class="cline-any cline-yes">1x</span>
|
|
831
|
-
<span class="cline-any cline-yes">1x</span>
|
|
832
|
-
<span class="cline-any cline-yes">1x</span>
|
|
833
|
-
<span class="cline-any cline-yes">1x</span>
|
|
834
|
-
<span class="cline-any cline-yes">1x</span>
|
|
835
|
-
<span class="cline-any cline-yes">1x</span>
|
|
836
|
-
<span class="cline-any cline-yes">1x</span>
|
|
837
|
-
<span class="cline-any cline-yes">1x</span>
|
|
838
|
-
<span class="cline-any cline-yes">1x</span>
|
|
839
|
-
<span class="cline-any cline-yes">1x</span>
|
|
840
|
-
<span class="cline-any cline-yes">4x</span>
|
|
841
|
-
<span class="cline-any cline-yes">4x</span>
|
|
842
|
-
<span class="cline-any cline-yes">4x</span>
|
|
843
|
-
<span class="cline-any cline-yes">1x</span>
|
|
844
|
-
<span class="cline-any cline-yes">1x</span>
|
|
845
|
-
<span class="cline-any cline-yes">5x</span>
|
|
846
|
-
<span class="cline-any cline-yes">5x</span>
|
|
847
|
-
<span class="cline-any cline-yes">5x</span>
|
|
848
|
-
<span class="cline-any cline-yes">5x</span>
|
|
849
|
-
<span class="cline-any cline-yes">5x</span>
|
|
850
|
-
<span class="cline-any cline-yes">5x</span>
|
|
851
|
-
<span class="cline-any cline-yes">5x</span>
|
|
852
|
-
<span class="cline-any cline-yes">5x</span>
|
|
853
|
-
<span class="cline-any cline-yes">5x</span>
|
|
854
|
-
<span class="cline-any cline-yes">5x</span>
|
|
855
|
-
<span class="cline-any cline-yes">5x</span>
|
|
856
|
-
<span class="cline-any cline-yes">5x</span>
|
|
857
|
-
<span class="cline-any cline-no"> </span>
|
|
858
|
-
<span class="cline-any cline-no"> </span>
|
|
859
|
-
<span class="cline-any cline-no"> </span>
|
|
860
|
-
<span class="cline-any cline-no"> </span>
|
|
861
|
-
<span class="cline-any cline-no"> </span>
|
|
862
|
-
<span class="cline-any cline-yes">5x</span>
|
|
863
|
-
<span class="cline-any cline-yes">1x</span>
|
|
864
|
-
<span class="cline-any cline-yes">1x</span>
|
|
865
|
-
<span class="cline-any cline-yes">1x</span>
|
|
866
|
-
<span class="cline-any cline-yes">1x</span>
|
|
867
|
-
<span class="cline-any cline-yes">1x</span>
|
|
868
|
-
<span class="cline-any cline-yes">1x</span>
|
|
869
|
-
<span class="cline-any cline-yes">1x</span>
|
|
870
|
-
<span class="cline-any cline-no"> </span>
|
|
871
|
-
<span class="cline-any cline-no"> </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-no"> </span>
|
|
876
|
-
<span class="cline-any cline-no"> </span>
|
|
877
|
-
<span class="cline-any cline-no"> </span>
|
|
878
|
-
<span class="cline-any cline-no"> </span>
|
|
879
|
-
<span class="cline-any cline-no"> </span>
|
|
880
|
-
<span class="cline-any cline-no"> </span>
|
|
881
|
-
<span class="cline-any cline-no"> </span>
|
|
882
|
-
<span class="cline-any cline-no"> </span>
|
|
883
|
-
<span class="cline-any cline-no"> </span>
|
|
884
|
-
<span class="cline-any cline-no"> </span>
|
|
885
|
-
<span class="cline-any cline-yes">1x</span>
|
|
886
|
-
<span class="cline-any cline-yes">1x</span>
|
|
887
|
-
<span class="cline-any cline-yes">1x</span>
|
|
888
|
-
<span class="cline-any cline-yes">1x</span>
|
|
889
|
-
<span class="cline-any cline-no"> </span>
|
|
890
|
-
<span class="cline-any cline-no"> </span>
|
|
891
|
-
<span class="cline-any cline-no"> </span>
|
|
892
|
-
<span class="cline-any cline-no"> </span>
|
|
893
|
-
<span class="cline-any cline-no"> </span>
|
|
894
|
-
<span class="cline-any cline-no"> </span>
|
|
895
|
-
<span class="cline-any cline-no"> </span>
|
|
896
|
-
<span class="cline-any cline-no"> </span>
|
|
897
|
-
<span class="cline-any cline-no"> </span>
|
|
898
|
-
<span class="cline-any cline-no"> </span>
|
|
899
|
-
<span class="cline-any cline-no"> </span>
|
|
900
|
-
<span class="cline-any cline-no"> </span>
|
|
901
|
-
<span class="cline-any cline-no"> </span>
|
|
902
|
-
<span class="cline-any cline-yes">1x</span>
|
|
903
|
-
<span class="cline-any cline-yes">1x</span>
|
|
904
|
-
<span class="cline-any cline-no"> </span>
|
|
905
|
-
<span class="cline-any cline-no"> </span>
|
|
906
|
-
<span class="cline-any cline-no"> </span>
|
|
907
|
-
<span class="cline-any cline-no"> </span>
|
|
908
|
-
<span class="cline-any cline-no"> </span>
|
|
909
|
-
<span class="cline-any cline-yes">1x</span>
|
|
910
|
-
<span class="cline-any cline-yes">1x</span>
|
|
911
|
-
<span class="cline-any cline-yes">1x</span>
|
|
912
|
-
<span class="cline-any cline-yes">1x</span>
|
|
913
|
-
<span class="cline-any cline-yes">1x</span>
|
|
914
|
-
<span class="cline-any cline-yes">1x</span>
|
|
915
|
-
<span class="cline-any cline-yes">1x</span>
|
|
916
|
-
<span class="cline-any cline-yes">1x</span>
|
|
917
|
-
<span class="cline-any cline-yes">1x</span>
|
|
918
|
-
<span class="cline-any cline-yes">1x</span>
|
|
919
|
-
<span class="cline-any cline-yes">1x</span>
|
|
920
|
-
<span class="cline-any cline-yes">1x</span>
|
|
921
|
-
<span class="cline-any cline-yes">1x</span>
|
|
922
|
-
<span class="cline-any cline-yes">1x</span>
|
|
923
|
-
<span class="cline-any cline-yes">1x</span>
|
|
924
|
-
<span class="cline-any cline-no"> </span>
|
|
925
|
-
<span class="cline-any cline-no"> </span>
|
|
926
|
-
<span class="cline-any cline-no"> </span>
|
|
927
|
-
<span class="cline-any cline-yes">1x</span>
|
|
928
|
-
<span class="cline-any cline-yes">1x</span>
|
|
929
|
-
<span class="cline-any cline-yes">1x</span>
|
|
930
|
-
<span class="cline-any cline-yes">1x</span>
|
|
931
|
-
<span class="cline-any cline-yes">1x</span>
|
|
932
|
-
<span class="cline-any cline-yes">1x</span>
|
|
933
|
-
<span class="cline-any cline-yes">1x</span>
|
|
934
|
-
<span class="cline-any cline-no"> </span>
|
|
935
|
-
<span class="cline-any cline-no"> </span>
|
|
936
|
-
<span class="cline-any cline-no"> </span>
|
|
937
|
-
<span class="cline-any cline-yes">1x</span>
|
|
938
|
-
<span class="cline-any cline-yes">1x</span>
|
|
939
|
-
<span class="cline-any cline-no"> </span>
|
|
940
|
-
<span class="cline-any cline-no"> </span>
|
|
941
|
-
<span class="cline-any cline-no"> </span>
|
|
942
|
-
<span class="cline-any cline-yes">1x</span>
|
|
943
|
-
<span class="cline-any cline-yes">1x</span>
|
|
944
|
-
<span class="cline-any cline-no"> </span>
|
|
945
|
-
<span class="cline-any cline-no"> </span>
|
|
946
|
-
<span class="cline-any cline-no"> </span>
|
|
947
|
-
<span class="cline-any cline-no"> </span>
|
|
948
|
-
<span class="cline-any cline-no"> </span>
|
|
949
|
-
<span class="cline-any cline-no"> </span>
|
|
950
|
-
<span class="cline-any cline-no"> </span>
|
|
951
|
-
<span class="cline-any cline-no"> </span>
|
|
952
|
-
<span class="cline-any cline-no"> </span>
|
|
953
|
-
<span class="cline-any cline-no"> </span>
|
|
954
|
-
<span class="cline-any cline-no"> </span>
|
|
955
|
-
<span class="cline-any cline-no"> </span>
|
|
956
|
-
<span class="cline-any cline-no"> </span>
|
|
957
|
-
<span class="cline-any cline-yes">1x</span>
|
|
958
|
-
<span class="cline-any cline-yes">1x</span>
|
|
959
|
-
<span class="cline-any cline-yes">1x</span>
|
|
960
|
-
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
|
|
961
|
-
// See LICENSE in the project root for license information.
|
|
962
|
-
|
|
963
|
-
import { Executable, Async } from '@rushstack/node-core-library';
|
|
964
|
-
import type { ITerminal } from '@rushstack/terminal';
|
|
965
|
-
import {
|
|
966
|
-
type ICloudBuildCacheProvider,
|
|
967
|
-
type ICredentialCacheEntry,
|
|
968
|
-
CredentialCache,
|
|
969
|
-
type RushSession,
|
|
970
|
-
EnvironmentConfiguration
|
|
971
|
-
} from '@rushstack/rush-sdk';
|
|
972
|
-
import { WebClient, type IWebClientResponse } from '@rushstack/rush-sdk/lib/utilities/WebClient';
|
|
973
|
-
import type { SpawnSyncReturns } from 'child_process';
|
|
974
|
-
|
|
975
|
-
enum CredentialsOptions {
|
|
976
|
-
Optional,
|
|
977
|
-
Required,
|
|
978
|
-
Omit
|
|
979
|
-
}
|
|
980
|
-
|
|
981
|
-
enum FailureType {
|
|
982
|
-
None,
|
|
983
|
-
Informational,
|
|
984
|
-
Warning,
|
|
985
|
-
Error,
|
|
986
|
-
Authentication
|
|
987
|
-
}
|
|
988
|
-
|
|
989
|
-
export interface IHttpBuildCacheTokenHandler {
|
|
990
|
-
exec: string;
|
|
991
|
-
args?: string[];
|
|
992
|
-
}
|
|
993
|
-
|
|
994
|
-
/**
|
|
995
|
-
* @public
|
|
996
|
-
*/
|
|
997
|
-
export type UploadMethod = 'PUT' | 'POST' | 'PATCH';
|
|
998
|
-
|
|
999
|
-
/**
|
|
1000
|
-
* @public
|
|
1001
|
-
*/
|
|
1002
|
-
export interface IHttpBuildCacheProviderOptions {
|
|
1003
|
-
url: string;
|
|
1004
|
-
tokenHandler?: IHttpBuildCacheTokenHandler;
|
|
1005
|
-
uploadMethod?: UploadMethod;
|
|
1006
|
-
minHttpRetryDelayMs?: number;
|
|
1007
|
-
headers?: Record<string, string>;
|
|
1008
|
-
cacheKeyPrefix?: string;
|
|
1009
|
-
isCacheWriteAllowed: boolean;
|
|
1010
|
-
pluginName: string;
|
|
1011
|
-
rushJsonFolder: string;
|
|
1012
|
-
}
|
|
1013
|
-
|
|
1014
|
-
const MAX_HTTP_CACHE_ATTEMPTS: number = 3;
|
|
1015
|
-
const DEFAULT_MIN_HTTP_RETRY_DELAY_MS: number = 2500;
|
|
1016
|
-
|
|
1017
|
-
export class HttpBuildCacheProvider implements ICloudBuildCacheProvider {
|
|
1018
|
-
private readonly _pluginName: string;
|
|
1019
|
-
private readonly _rushProjectRoot: string;
|
|
1020
|
-
private readonly _environmentCredential: string | undefined;
|
|
1021
|
-
private readonly _isCacheWriteAllowedByConfiguration: boolean;
|
|
1022
|
-
private readonly _url: URL;
|
|
1023
|
-
private readonly _uploadMethod: UploadMethod;
|
|
1024
|
-
private readonly _headers: Record<string, string>;
|
|
1025
|
-
private readonly _cacheKeyPrefix: string;
|
|
1026
|
-
private readonly _tokenHandler: IHttpBuildCacheTokenHandler | undefined;
|
|
1027
|
-
private readonly _minHttpRetryDelayMs: number;
|
|
1028
|
-
private __credentialCacheId: string | undefined;
|
|
1029
|
-
|
|
1030
|
-
<span class="fstat-no" title="function not covered" > public get isCacheWriteAllowed(): boolean {</span>
|
|
1031
|
-
<span class="cstat-no" title="statement not covered" > return EnvironmentConfiguration.buildCacheWriteAllowed ?? this._isCacheWriteAllowedByConfiguration;</span>
|
|
1032
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1033
|
-
|
|
1034
|
-
public constructor(options: IHttpBuildCacheProviderOptions, rushSession: RushSession) {
|
|
1035
|
-
this._pluginName = options.pluginName;
|
|
1036
|
-
this._rushProjectRoot = options.rushJsonFolder;
|
|
1037
|
-
|
|
1038
|
-
this._environmentCredential = EnvironmentConfiguration.buildCacheCredential;
|
|
1039
|
-
this._isCacheWriteAllowedByConfiguration = options.isCacheWriteAllowed;
|
|
1040
|
-
this._url = new URL(options.url.endsWith('/') <span class="branch-0 cbranch-no" title="branch not covered" >? options.url </span>: options.url + '/');
|
|
1041
|
-
this._uploadMethod = options.uploadMethod<span class="branch-0 cbranch-no" title="branch not covered" > ?? 'PUT';</span>
|
|
1042
|
-
this._headers = options.headers<span class="branch-0 cbranch-no" title="branch not covered" > ?? {</span>};
|
|
1043
|
-
this._tokenHandler = options.tokenHandler;
|
|
1044
|
-
this._cacheKeyPrefix = options.cacheKeyPrefix<span class="branch-0 cbranch-no" title="branch not covered" > ?? '</span>';
|
|
1045
|
-
this._minHttpRetryDelayMs = options.minHttpRetryDelayMs<span class="branch-0 cbranch-no" title="branch not covered" > ?? DEFAULT_MIN_HTTP_RETRY_DELAY_MS;</span>
|
|
1046
|
-
}
|
|
1047
|
-
|
|
1048
|
-
public async tryGetCacheEntryBufferByIdAsync(
|
|
1049
|
-
terminal: ITerminal,
|
|
1050
|
-
cacheId: string
|
|
1051
|
-
): Promise<Buffer | undefined> {
|
|
1052
|
-
try {
|
|
1053
|
-
const result: boolean | Buffer = await this._makeHttpRequestAsync({
|
|
1054
|
-
terminal: terminal,
|
|
1055
|
-
relUrl: `${this._cacheKeyPrefix}${cacheId}`,
|
|
1056
|
-
method: 'GET',
|
|
1057
|
-
body: undefined,
|
|
1058
|
-
warningText: 'Could not get cache entry',
|
|
1059
|
-
readBody: true,
|
|
1060
|
-
maxAttempts: MAX_HTTP_CACHE_ATTEMPTS
|
|
1061
|
-
});
|
|
1062
|
-
|
|
1063
|
-
return Buffer.isBuffer(result) <span class="branch-0 cbranch-no" title="branch not covered" >? result </span>: undefined;
|
|
1064
|
-
} catch (e) {
|
|
1065
|
-
terminal.writeWarningLine(`Error getting cache entry: ${e}`);
|
|
1066
|
-
return undefined;
|
|
1067
|
-
}
|
|
1068
|
-
}
|
|
1069
|
-
|
|
1070
|
-
public <span class="fstat-no" title="function not covered" >async trySetCacheEntryBufferAsync(</span>
|
|
1071
|
-
<span class="cstat-no" title="statement not covered" > terminal: ITerminal,</span>
|
|
1072
|
-
<span class="cstat-no" title="statement not covered" > cacheId: string,</span>
|
|
1073
|
-
<span class="cstat-no" title="statement not covered" > objectBuffer: Buffer</span>
|
|
1074
|
-
<span class="cstat-no" title="statement not covered" > ): Promise<boolean> {</span>
|
|
1075
|
-
<span class="cstat-no" title="statement not covered" > if (!this.isCacheWriteAllowed) {</span>
|
|
1076
|
-
<span class="cstat-no" title="statement not covered" > terminal.writeErrorLine('Writing to cache is not allowed in the current configuration.');</span>
|
|
1077
|
-
<span class="cstat-no" title="statement not covered" > return false;</span>
|
|
1078
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1079
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
1080
|
-
<span class="cstat-no" title="statement not covered" > terminal.writeDebugLine('Uploading object with cacheId: ', cacheId);</span>
|
|
1081
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
1082
|
-
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1083
|
-
<span class="cstat-no" title="statement not covered" > const result: boolean | Buffer = await this._makeHttpRequestAsync({</span>
|
|
1084
|
-
<span class="cstat-no" title="statement not covered" > terminal: terminal,</span>
|
|
1085
|
-
<span class="cstat-no" title="statement not covered" > relUrl: `${this._cacheKeyPrefix}${cacheId}`,</span>
|
|
1086
|
-
<span class="cstat-no" title="statement not covered" > method: this._uploadMethod,</span>
|
|
1087
|
-
<span class="cstat-no" title="statement not covered" > body: objectBuffer,</span>
|
|
1088
|
-
<span class="cstat-no" title="statement not covered" > warningText: 'Could not write cache entry',</span>
|
|
1089
|
-
<span class="cstat-no" title="statement not covered" > readBody: false,</span>
|
|
1090
|
-
<span class="cstat-no" title="statement not covered" > maxAttempts: MAX_HTTP_CACHE_ATTEMPTS</span>
|
|
1091
|
-
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1092
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
1093
|
-
<span class="cstat-no" title="statement not covered" > return result !== false;</span>
|
|
1094
|
-
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
|
|
1095
|
-
<span class="cstat-no" title="statement not covered" > terminal.writeWarningLine(`Error uploading cache entry: ${e}`);</span>
|
|
1096
|
-
<span class="cstat-no" title="statement not covered" > return false;</span>
|
|
1097
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1098
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1099
|
-
|
|
1100
|
-
public <span class="fstat-no" title="function not covered" >async updateCachedCredentialAsync(terminal: ITerminal, credential: string): Promise<void> {</span>
|
|
1101
|
-
<span class="cstat-no" title="statement not covered" > await CredentialCache.usingAsync(</span>
|
|
1102
|
-
<span class="cstat-no" title="statement not covered" > {</span>
|
|
1103
|
-
<span class="cstat-no" title="statement not covered" > supportEditing: true</span>
|
|
1104
|
-
<span class="cstat-no" title="statement not covered" > },</span>
|
|
1105
|
-
<span class="cstat-no" title="statement not covered" > async (credentialsCache: CredentialCache) => {</span>
|
|
1106
|
-
<span class="cstat-no" title="statement not covered" > credentialsCache.setCacheEntry(this._credentialCacheId, {</span>
|
|
1107
|
-
<span class="cstat-no" title="statement not covered" > credential: credential</span>
|
|
1108
|
-
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1109
|
-
<span class="cstat-no" title="statement not covered" > await credentialsCache.saveIfModifiedAsync();</span>
|
|
1110
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1111
|
-
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1112
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1113
|
-
|
|
1114
|
-
public <span class="fstat-no" title="function not covered" >async updateCachedCredentialInteractiveAsync(terminal: ITerminal): Promise<void> {</span>
|
|
1115
|
-
<span class="cstat-no" title="statement not covered" > if (!this._tokenHandler) {</span>
|
|
1116
|
-
<span class="cstat-no" title="statement not covered" > throw new Error(</span>
|
|
1117
|
-
<span class="cstat-no" title="statement not covered" > `The interactive cloud credentials flow is not configured.\n` +</span>
|
|
1118
|
-
<span class="cstat-no" title="statement not covered" > `Set the 'tokenHandler' setting in 'common/config/rush-plugins/${this._pluginName}.json' to a command that writes your credentials to standard output and exits with code 0 ` +</span>
|
|
1119
|
-
<span class="cstat-no" title="statement not covered" > `or provide your credentials to rush using the --credential flag instead. Credentials must be the ` +</span>
|
|
1120
|
-
<span class="cstat-no" title="statement not covered" > `'Authorization' header expected by ${this._url.href}`</span>
|
|
1121
|
-
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1122
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1123
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
1124
|
-
<span class="cstat-no" title="statement not covered" > const cmd: string = `${this._tokenHandler.exec} ${(this._tokenHandler.args || []).join(' ')}`;</span>
|
|
1125
|
-
<span class="cstat-no" title="statement not covered" > terminal.writeVerboseLine(`Running '${cmd}' to get credentials`);</span>
|
|
1126
|
-
<span class="cstat-no" title="statement not covered" > const result: SpawnSyncReturns<string> = Executable.spawnSync(</span>
|
|
1127
|
-
<span class="cstat-no" title="statement not covered" > this._tokenHandler.exec,</span>
|
|
1128
|
-
<span class="cstat-no" title="statement not covered" > this._tokenHandler.args || [],</span>
|
|
1129
|
-
<span class="cstat-no" title="statement not covered" > {</span>
|
|
1130
|
-
<span class="cstat-no" title="statement not covered" > currentWorkingDirectory: this._rushProjectRoot</span>
|
|
1131
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1132
|
-
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1133
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
1134
|
-
<span class="cstat-no" title="statement not covered" > terminal.writeErrorLine(result.stderr);</span>
|
|
1135
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
1136
|
-
<span class="cstat-no" title="statement not covered" > if (result.error) {</span>
|
|
1137
|
-
<span class="cstat-no" title="statement not covered" > throw new Error(`Could not obtain credentials. The command '${cmd}' failed.`);</span>
|
|
1138
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1139
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
1140
|
-
<span class="cstat-no" title="statement not covered" > const credential: string = result.stdout.trim();</span>
|
|
1141
|
-
<span class="cstat-no" title="statement not covered" > terminal.writeVerboseLine('Got credentials');</span>
|
|
1142
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
1143
|
-
<span class="cstat-no" title="statement not covered" > await this.updateCachedCredentialAsync(terminal, credential);</span>
|
|
1144
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
1145
|
-
<span class="cstat-no" title="statement not covered" > terminal.writeLine('Updated credentials cache');</span>
|
|
1146
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1147
|
-
|
|
1148
|
-
public <span class="fstat-no" title="function not covered" >async deleteCachedCredentialsAsync(terminal: ITerminal): Promise<void> {</span>
|
|
1149
|
-
<span class="cstat-no" title="statement not covered" > await CredentialCache.usingAsync(</span>
|
|
1150
|
-
<span class="cstat-no" title="statement not covered" > {</span>
|
|
1151
|
-
<span class="cstat-no" title="statement not covered" > supportEditing: true</span>
|
|
1152
|
-
<span class="cstat-no" title="statement not covered" > },</span>
|
|
1153
|
-
<span class="cstat-no" title="statement not covered" > async (credentialsCache: CredentialCache) => {</span>
|
|
1154
|
-
<span class="cstat-no" title="statement not covered" > credentialsCache.deleteCacheEntry(this._credentialCacheId);</span>
|
|
1155
|
-
<span class="cstat-no" title="statement not covered" > await credentialsCache.saveIfModifiedAsync();</span>
|
|
1156
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1157
|
-
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1158
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1159
|
-
|
|
1160
|
-
private get _credentialCacheId(): string {
|
|
1161
|
-
if (!this.__credentialCacheId) {
|
|
1162
|
-
const cacheIdParts: string[] = [this._url.href];
|
|
1163
|
-
|
|
1164
|
-
if (this._isCacheWriteAllowedByConfiguration) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1165
|
-
<span class="cstat-no" title="statement not covered" > cacheIdParts.push('cacheWriteAllowed');</span>
|
|
1166
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1167
|
-
|
|
1168
|
-
this.__credentialCacheId = cacheIdParts.join('|');
|
|
1169
|
-
}
|
|
1170
|
-
|
|
1171
|
-
return this.__credentialCacheId;
|
|
1172
|
-
}
|
|
1173
|
-
|
|
1174
|
-
private async _makeHttpRequestAsync(options: {
|
|
1175
|
-
terminal: ITerminal;
|
|
1176
|
-
relUrl: string;
|
|
1177
|
-
method: 'GET' | UploadMethod;
|
|
1178
|
-
body: Buffer | undefined;
|
|
1179
|
-
warningText: string;
|
|
1180
|
-
readBody: boolean;
|
|
1181
|
-
maxAttempts: number;
|
|
1182
|
-
credentialOptions?: CredentialsOptions;
|
|
1183
|
-
}): Promise<Buffer | boolean> {
|
|
1184
|
-
const { terminal, relUrl, method, body, warningText, readBody, credentialOptions } = options;
|
|
1185
|
-
const safeCredentialOptions: CredentialsOptions = credentialOptions ?? CredentialsOptions.Optional;
|
|
1186
|
-
const credentials: string | undefined = await this._tryGetCredentialsAsync(safeCredentialOptions);
|
|
1187
|
-
const url: string = new URL(relUrl, this._url).href;
|
|
1188
|
-
|
|
1189
|
-
const headers: Record<string, string> = {};
|
|
1190
|
-
if (typeof credentials === 'string') <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1191
|
-
<span class="cstat-no" title="statement not covered" > headers.Authorization = credentials;</span>
|
|
1192
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1193
|
-
|
|
1194
|
-
for (const [key, value] of Object.entries(this._headers)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1195
|
-
<span class="cstat-no" title="statement not covered" > if (typeof value === 'string') {</span>
|
|
1196
|
-
<span class="cstat-no" title="statement not covered" > headers[key] = value;</span>
|
|
1197
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1198
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1199
|
-
|
|
1200
|
-
const bodyLength: number | 'unknown' = (body<span class="branch-0 cbranch-no" title="branch not covered" > as { length: number })?.length </span>|| 'unknown';
|
|
1201
|
-
|
|
1202
|
-
terminal.writeDebugLine(`[http-build-cache] request: ${method} ${url} ${bodyLength} bytes`);
|
|
1203
|
-
|
|
1204
|
-
const webClient: WebClient = new WebClient();
|
|
1205
|
-
const response: IWebClientResponse = await webClient.fetchAsync(url, {
|
|
1206
|
-
verb: method,
|
|
1207
|
-
headers: headers,
|
|
1208
|
-
body: body,
|
|
1209
|
-
redirect: 'follow',
|
|
1210
|
-
timeoutMs: 0 // Use the default timeout
|
|
1211
|
-
});
|
|
1212
|
-
|
|
1213
|
-
if (!response.ok) {
|
|
1214
|
-
const isNonCredentialResponse: boolean = response.status >= 500 && response.status < 600;
|
|
1215
|
-
|
|
1216
|
-
if (
|
|
1217
|
-
!isNonCredentialResponse &&
|
|
1218
|
-
typeof credentials !== 'string' &&
|
|
1219
|
-
safeCredentialOptions === CredentialsOptions.Optional
|
|
1220
|
-
) {
|
|
1221
|
-
// If we don't already have credentials yet, and we got a response from the server
|
|
1222
|
-
// that is a "normal" failure (4xx), then we assume that credentials are probably
|
|
1223
|
-
// required. Re-attempt the request, requiring credentials this time.
|
|
1224
|
-
//
|
|
1225
|
-
// This counts as part of the "first attempt", so it is not included in the max attempts
|
|
1226
|
-
return await this._makeHttpRequestAsync({
|
|
1227
|
-
...options,
|
|
1228
|
-
credentialOptions: CredentialsOptions.Required
|
|
1229
|
-
});
|
|
1230
|
-
}
|
|
1231
|
-
|
|
1232
|
-
if (options.maxAttempts > 1) {
|
|
1233
|
-
// Pause a bit before retrying in case the server is busy
|
|
1234
|
-
// Add some random jitter to the retry so we can spread out load on the remote service
|
|
1235
|
-
// A proper solution might add exponential back off in case the retry count is high (10 or more)
|
|
1236
|
-
const factor: number = 1.0 + Math.random(); // A random number between 1.0 and 2.0
|
|
1237
|
-
const retryDelay: number = Math.floor(factor * this._minHttpRetryDelayMs);
|
|
1238
|
-
|
|
1239
|
-
await Async.sleepAsync(retryDelay);
|
|
1240
|
-
|
|
1241
|
-
return await this._makeHttpRequestAsync({ ...options, maxAttempts: options.maxAttempts - 1 });
|
|
1242
|
-
}
|
|
1243
|
-
|
|
1244
|
-
this._reportFailure(terminal, method, response, false, warningText);
|
|
1245
|
-
return false;
|
|
1246
|
-
}
|
|
1247
|
-
<span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span>
|
|
1248
|
-
const result: Buffer | boolean = readBody ? await response.getBufferAsync() : true;
|
|
1249
|
-
|
|
1250
|
-
terminal.writeDebugLine(
|
|
1251
|
-
`[http-build-cache] actual response: ${response.status} ${url} ${
|
|
1252
|
-
result === true <span class="branch-0 cbranch-no" title="branch not covered" >? 'true' <span class="branch-0 cbranch-no" title="branch not covered" ></span>: result.length</span>
|
|
1253
|
-
} bytes`
|
|
1254
|
-
);
|
|
1255
|
-
|
|
1256
|
-
return result;
|
|
1257
|
-
}
|
|
1258
|
-
|
|
1259
|
-
private async _tryGetCredentialsAsync(options: CredentialsOptions.Required): Promise<string>;
|
|
1260
|
-
private async _tryGetCredentialsAsync(options: CredentialsOptions.Optional): Promise<string | undefined>;
|
|
1261
|
-
private async _tryGetCredentialsAsync(options: CredentialsOptions.Omit): Promise<undefined>;
|
|
1262
|
-
private async _tryGetCredentialsAsync(options: CredentialsOptions): Promise<string | undefined>;
|
|
1263
|
-
private async _tryGetCredentialsAsync(options: CredentialsOptions): Promise<string | undefined> {
|
|
1264
|
-
if (options === CredentialsOptions.Omit) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1265
|
-
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1266
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1267
|
-
|
|
1268
|
-
let credentials: string | undefined = this._environmentCredential;
|
|
1269
|
-
|
|
1270
|
-
if (credentials === undefined) {
|
|
1271
|
-
credentials = await this._tryGetCredentialsFromCacheAsync();
|
|
1272
|
-
}
|
|
1273
|
-
|
|
1274
|
-
if (typeof credentials !== 'string' && options === CredentialsOptions.Required) {
|
|
1275
|
-
throw new Error(
|
|
1276
|
-
[
|
|
1277
|
-
`Credentials for ${this._url.href} have not been provided.`,
|
|
1278
|
-
`In CI, verify that RUSH_BUILD_CACHE_CREDENTIAL contains a valid Authorization header value.`,
|
|
1279
|
-
``,
|
|
1280
|
-
`For local developers, run:`,
|
|
1281
|
-
``,
|
|
1282
|
-
` rush update-cloud-credentials --interactive`,
|
|
1283
|
-
``
|
|
1284
|
-
].join('\n')
|
|
1285
|
-
);
|
|
1286
|
-
}
|
|
1287
|
-
|
|
1288
|
-
return credentials;
|
|
1289
|
-
}
|
|
1290
|
-
|
|
1291
|
-
private async _tryGetCredentialsFromCacheAsync(): Promise<string | undefined> {
|
|
1292
|
-
let cacheEntry: ICredentialCacheEntry | undefined;
|
|
1293
|
-
|
|
1294
|
-
await CredentialCache.usingAsync(
|
|
1295
|
-
{
|
|
1296
|
-
supportEditing: false
|
|
1297
|
-
},
|
|
1298
|
-
(credentialsCache: CredentialCache) => {
|
|
1299
|
-
cacheEntry = credentialsCache.tryGetCacheEntry(this._credentialCacheId);
|
|
1300
|
-
}
|
|
1301
|
-
);
|
|
1302
|
-
|
|
1303
|
-
if (cacheEntry) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1304
|
-
<span class="cstat-no" title="statement not covered" > const expirationTime: number | undefined = cacheEntry.expires?.getTime();</span>
|
|
1305
|
-
<span class="cstat-no" title="statement not covered" > if (!expirationTime || expirationTime >= Date.now()) {</span>
|
|
1306
|
-
<span class="cstat-no" title="statement not covered" > return cacheEntry.credential;</span>
|
|
1307
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1308
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1309
|
-
}
|
|
1310
|
-
|
|
1311
|
-
private _getFailureType(
|
|
1312
|
-
requestMethod: string,
|
|
1313
|
-
response: IWebClientResponse,
|
|
1314
|
-
isRedirect: boolean
|
|
1315
|
-
): FailureType {
|
|
1316
|
-
if (response.ok) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1317
|
-
<span class="cstat-no" title="statement not covered" > return FailureType.None;</span>
|
|
1318
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1319
|
-
|
|
1320
|
-
switch (response.status) {
|
|
1321
|
-
<span class="branch-0 cbranch-no" title="branch not covered" > case 503: {</span>
|
|
1322
|
-
<span class="cstat-no" title="statement not covered" > // We select 503 specifically because this represents "service unavailable" and</span>
|
|
1323
|
-
<span class="cstat-no" title="statement not covered" > // "rate limit throttle" errors, which are transient issues.</span>
|
|
1324
|
-
<span class="cstat-no" title="statement not covered" > //</span>
|
|
1325
|
-
<span class="cstat-no" title="statement not covered" > // There are other 5xx errors, such as 501, that can occur if the request is</span>
|
|
1326
|
-
<span class="cstat-no" title="statement not covered" > // malformed, so as a general rule we want to let through other 5xx errors</span>
|
|
1327
|
-
<span class="cstat-no" title="statement not covered" > // so the user can troubleshoot.</span>
|
|
1328
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
1329
|
-
<span class="cstat-no" title="statement not covered" > // Don't fail production builds with warnings for transient issues</span>
|
|
1330
|
-
<span class="cstat-no" title="statement not covered" > return FailureType.Informational;</span>
|
|
1331
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1332
|
-
|
|
1333
|
-
<span class="branch-0 cbranch-no" title="branch not covered" > case 401:</span>
|
|
1334
|
-
<span class="branch-0 cbranch-no" title="branch not covered" > case 403:</span>
|
|
1335
|
-
<span class="branch-0 cbranch-no" title="branch not covered" > case 407: {</span>
|
|
1336
|
-
<span class="cstat-no" title="statement not covered" > if (requestMethod === 'GET' && (isRedirect || response.redirected)) {</span>
|
|
1337
|
-
<span class="cstat-no" title="statement not covered" > // Cache misses for GET requests are not errors</span>
|
|
1338
|
-
<span class="cstat-no" title="statement not covered" > // This is a workaround behavior where a server can issue a redirect and we fail to authenticate at the new location.</span>
|
|
1339
|
-
<span class="cstat-no" title="statement not covered" > // We do not want to signal this as an authentication failure because the authorization header is not passed on to redirects.</span>
|
|
1340
|
-
<span class="cstat-no" title="statement not covered" > // i.e The authentication header was accepted for the first request and therefore subsequent failures</span>
|
|
1341
|
-
<span class="cstat-no" title="statement not covered" > // where it was not present should not be attributed to the header.</span>
|
|
1342
|
-
<span class="cstat-no" title="statement not covered" > // This scenario usually comes up with services that redirect to pre-signed URLS that don't actually exist.</span>
|
|
1343
|
-
<span class="cstat-no" title="statement not covered" > // Those services then usually treat the 404 as a 403 to prevent leaking information.</span>
|
|
1344
|
-
<span class="cstat-no" title="statement not covered" > return FailureType.None;</span>
|
|
1345
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1346
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
1347
|
-
<span class="cstat-no" title="statement not covered" > return FailureType.Authentication;</span>
|
|
1348
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1349
|
-
|
|
1350
|
-
<span class="branch-0 cbranch-no" title="branch not covered" > case 404: {</span>
|
|
1351
|
-
<span class="cstat-no" title="statement not covered" > if (requestMethod === 'GET') {</span>
|
|
1352
|
-
<span class="cstat-no" title="statement not covered" > // Cache misses for GET requests are not errors</span>
|
|
1353
|
-
<span class="cstat-no" title="statement not covered" > return FailureType.None;</span>
|
|
1354
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1355
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1356
|
-
}
|
|
1357
|
-
|
|
1358
|
-
// Let dev builds succeed, let Prod builds fail
|
|
1359
|
-
return FailureType.Warning;
|
|
1360
|
-
}
|
|
1361
|
-
|
|
1362
|
-
private _reportFailure(
|
|
1363
|
-
terminal: ITerminal,
|
|
1364
|
-
requestMethod: string,
|
|
1365
|
-
response: IWebClientResponse,
|
|
1366
|
-
isRedirect: boolean,
|
|
1367
|
-
message: string
|
|
1368
|
-
): void {
|
|
1369
|
-
switch (this._getFailureType(requestMethod, response, isRedirect)) {
|
|
1370
|
-
<span class="branch-0 cbranch-no" title="branch not covered" > default: {</span>
|
|
1371
|
-
<span class="cstat-no" title="statement not covered" > terminal.writeErrorLine(`${message}: HTTP ${response.status}: ${response.statusText}`);</span>
|
|
1372
|
-
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
1373
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1374
|
-
|
|
1375
|
-
case FailureType.Warning: {
|
|
1376
|
-
terminal.writeWarningLine(`${message}: HTTP ${response.status}: ${response.statusText}`);
|
|
1377
|
-
break;
|
|
1378
|
-
}
|
|
1379
|
-
|
|
1380
|
-
<span class="branch-0 cbranch-no" title="branch not covered" > case FailureType.Informational: {</span>
|
|
1381
|
-
<span class="cstat-no" title="statement not covered" > terminal.writeLine(`${message}: HTTP ${response.status}: ${response.statusText}`);</span>
|
|
1382
|
-
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
1383
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1384
|
-
|
|
1385
|
-
<span class="branch-0 cbranch-no" title="branch not covered" > case FailureType.None: {</span>
|
|
1386
|
-
<span class="cstat-no" title="statement not covered" > terminal.writeDebugLine(`${message}: HTTP ${response.status}: ${response.statusText}`);</span>
|
|
1387
|
-
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
1388
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1389
|
-
|
|
1390
|
-
<span class="branch-0 cbranch-no" title="branch not covered" > case FailureType.Authentication: {</span>
|
|
1391
|
-
<span class="cstat-no" title="statement not covered" > throw new Error(</span>
|
|
1392
|
-
<span class="cstat-no" title="statement not covered" > [</span>
|
|
1393
|
-
<span class="cstat-no" title="statement not covered" > `${this._url.href} responded with ${response.status}: ${response.statusText}.`,</span>
|
|
1394
|
-
<span class="cstat-no" title="statement not covered" > `Credentials may be misconfigured or have expired.`,</span>
|
|
1395
|
-
<span class="cstat-no" title="statement not covered" > `In CI, verify that RUSH_BUILD_CACHE_CREDENTIAL contains a valid Authorization header value.`,</span>
|
|
1396
|
-
<span class="cstat-no" title="statement not covered" > ``,</span>
|
|
1397
|
-
<span class="cstat-no" title="statement not covered" > `For local developers, run:`,</span>
|
|
1398
|
-
<span class="cstat-no" title="statement not covered" > ``,</span>
|
|
1399
|
-
<span class="cstat-no" title="statement not covered" > ` rush update-cloud-credentials --interactive`,</span>
|
|
1400
|
-
<span class="cstat-no" title="statement not covered" > ``</span>
|
|
1401
|
-
<span class="cstat-no" title="statement not covered" > ].join('\n')</span>
|
|
1402
|
-
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1403
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1404
|
-
}
|
|
1405
|
-
}
|
|
1406
|
-
}
|
|
1407
|
-
</pre></td></tr></table></pre>
|
|
1408
|
-
|
|
1409
|
-
<div class='push'></div><!-- for sticky footer -->
|
|
1410
|
-
</div><!-- /wrapper -->
|
|
1411
|
-
<div class='footer quiet pad2 space-top1 center small'>
|
|
1412
|
-
Code coverage generated by
|
|
1413
|
-
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1414
|
-
at 2025-03-25T16:56:42.036Z
|
|
1415
|
-
</div>
|
|
1416
|
-
<script src="prettify.js"></script>
|
|
1417
|
-
<script>
|
|
1418
|
-
window.onload = function () {
|
|
1419
|
-
prettyPrint();
|
|
1420
|
-
};
|
|
1421
|
-
</script>
|
|
1422
|
-
<script src="sorter.js"></script>
|
|
1423
|
-
<script src="block-navigation.js"></script>
|
|
1424
|
-
</body>
|
|
1425
|
-
</html>
|
|
1426
|
-
|