@mapbox/cloudfriend 6.0.0 → 7.0.0-1

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 (80) hide show
  1. package/.nyc_output/{ef96ce8d-21af-4efa-8fde-041438a648a6.json → cf34c2ae-5192-41cf-a50f-c1b5dd1c3e6d.json} +1 -1
  2. package/.nyc_output/{efe82251-5e4c-42c5-9ae2-a01d0358ec20.json → e54708e1-ab69-41ca-9448-73144a4686dc.json} +1 -1
  3. package/.nyc_output/processinfo/cf34c2ae-5192-41cf-a50f-c1b5dd1c3e6d.json +1 -0
  4. package/.nyc_output/processinfo/e54708e1-ab69-41ca-9448-73144a4686dc.json +1 -0
  5. package/.nyc_output/processinfo/index.json +1 -1
  6. package/.travis.yml +3 -2
  7. package/bin/build-template.js +1 -1
  8. package/bin/validate-template.js +1 -1
  9. package/lib/shortcuts/api.md +1 -1
  10. package/lib/shortcuts/lambda.js +2 -2
  11. package/package.json +2 -2
  12. package/requirements.dev.txt +2 -0
  13. package/test/fixtures/shortcuts/event-lambda-defaults.json +1 -1
  14. package/test/fixtures/shortcuts/event-lambda-full.json +1 -1
  15. package/test/fixtures/shortcuts/hookshot-github-secret-ref.json +4 -4
  16. package/test/fixtures/shortcuts/hookshot-github-secret-string.json +4 -4
  17. package/test/fixtures/shortcuts/hookshot-github.json +4 -4
  18. package/test/fixtures/shortcuts/hookshot-passthrough-access-log-format.json +4 -4
  19. package/test/fixtures/shortcuts/hookshot-passthrough-alarms.json +4 -4
  20. package/test/fixtures/shortcuts/hookshot-passthrough-enhanced-logging.json +4 -4
  21. package/test/fixtures/shortcuts/hookshot-passthrough-full-blown-logging.json +4 -4
  22. package/test/fixtures/shortcuts/hookshot-passthrough-logging.json +4 -4
  23. package/test/fixtures/shortcuts/hookshot-passthrough.json +4 -4
  24. package/test/fixtures/shortcuts/lambda-defaults.json +1 -1
  25. package/test/fixtures/shortcuts/lambda-full.json +1 -1
  26. package/test/fixtures/shortcuts/lambda-provided-role.json +1 -1
  27. package/test/fixtures/shortcuts/lambda-zipfile.json +1 -1
  28. package/test/fixtures/shortcuts/log-subscription-lambda-defaults.json +1 -1
  29. package/test/fixtures/shortcuts/log-subscription-lambda-no-defaults.json +1 -1
  30. package/test/fixtures/shortcuts/queue-lambda-zero.json +1 -1
  31. package/test/fixtures/shortcuts/queue-lambda.json +1 -1
  32. package/test/fixtures/shortcuts/scheduled-lambda-defaults.json +1 -1
  33. package/test/fixtures/shortcuts/scheduled-lambda-full.json +1 -1
  34. package/test/fixtures/shortcuts/stream-lambda-defaults.json +1 -1
  35. package/test/fixtures/shortcuts/stream-lambda-no-defaults.json +1 -1
  36. package/test/shortcuts.test.js +1 -1
  37. package/.nyc_output/processinfo/ef96ce8d-21af-4efa-8fde-041438a648a6.json +0 -1
  38. package/.nyc_output/processinfo/efe82251-5e4c-42c5-9ae2-a01d0358ec20.json +0 -1
  39. package/.python-version +0 -1
  40. package/coverage/base.css +0 -224
  41. package/coverage/block-navigation.js +0 -79
  42. package/coverage/cloudfriend/bin/build-template.js.html +0 -124
  43. package/coverage/cloudfriend/bin/index.html +0 -110
  44. package/coverage/cloudfriend/index.html +0 -110
  45. package/coverage/cloudfriend/index.js.html +0 -301
  46. package/coverage/cloudfriend/lib/build.js.html +0 -211
  47. package/coverage/cloudfriend/lib/conditions.js.html +0 -424
  48. package/coverage/cloudfriend/lib/index.html +0 -200
  49. package/coverage/cloudfriend/lib/intrinsic.js.html +0 -880
  50. package/coverage/cloudfriend/lib/merge.js.html +0 -472
  51. package/coverage/cloudfriend/lib/pseudo.js.html +0 -364
  52. package/coverage/cloudfriend/lib/rules.js.html +0 -343
  53. package/coverage/cloudfriend/lib/shortcuts/cross-account-role.js.html +0 -238
  54. package/coverage/cloudfriend/lib/shortcuts/event-lambda.js.html +0 -361
  55. package/coverage/cloudfriend/lib/shortcuts/glue-database.js.html +0 -280
  56. package/coverage/cloudfriend/lib/shortcuts/glue-json-table.js.html +0 -229
  57. package/coverage/cloudfriend/lib/shortcuts/glue-orc-table.js.html +0 -220
  58. package/coverage/cloudfriend/lib/shortcuts/glue-parquet-table.js.html +0 -262
  59. package/coverage/cloudfriend/lib/shortcuts/glue-presto-view.js.html +0 -352
  60. package/coverage/cloudfriend/lib/shortcuts/glue-spark-view.js.html +0 -235
  61. package/coverage/cloudfriend/lib/shortcuts/glue-table.js.html +0 -475
  62. package/coverage/cloudfriend/lib/shortcuts/hookshot.js.html +0 -1462
  63. package/coverage/cloudfriend/lib/shortcuts/index.html +0 -410
  64. package/coverage/cloudfriend/lib/shortcuts/index.js.html +0 -148
  65. package/coverage/cloudfriend/lib/shortcuts/kinesis-firehose-base.js.html +0 -412
  66. package/coverage/cloudfriend/lib/shortcuts/lambda.js.html +0 -799
  67. package/coverage/cloudfriend/lib/shortcuts/log-subscription-lambda.js.html +0 -304
  68. package/coverage/cloudfriend/lib/shortcuts/queue-lambda.js.html +0 -358
  69. package/coverage/cloudfriend/lib/shortcuts/queue.js.html +0 -613
  70. package/coverage/cloudfriend/lib/shortcuts/role.js.html +0 -376
  71. package/coverage/cloudfriend/lib/shortcuts/s3-kinesis-firehose.js.html +0 -562
  72. package/coverage/cloudfriend/lib/shortcuts/scheduled-lambda.js.html +0 -340
  73. package/coverage/cloudfriend/lib/shortcuts/service-role.js.html +0 -301
  74. package/coverage/cloudfriend/lib/shortcuts/stream-lambda.js.html +0 -373
  75. package/coverage/cloudfriend/lib/validate.js.html +0 -148
  76. package/coverage/index.html +0 -155
  77. package/coverage/prettify.css +0 -1
  78. package/coverage/prettify.js +0 -2
  79. package/coverage/sort-arrow-sprite.png +0 -0
  80. package/coverage/sorter.js +0 -170
@@ -1,1462 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for cloudfriend/lib/shortcuts/hookshot.js</title>
7
- <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../../../prettify.css" />
9
- <link rel="stylesheet" href="../../../base.css" />
10
- <meta name="viewport" content="width=device-width, initial-scale=1">
11
- <style type='text/css'>
12
- .coverage-summary .sorter {
13
- background-image: url(../../../sort-arrow-sprite.png);
14
- }
15
- </style>
16
- </head>
17
-
18
- <body>
19
- <div class='wrapper'>
20
- <div class='pad1'>
21
- <h1><a href="../../../index.html">All files</a> / <a href="index.html">cloudfriend/lib/shortcuts</a> hookshot.js</h1>
22
- <div class='clearfix'>
23
-
24
- <div class='fl pad1y space-right2'>
25
- <span class="strong">100% </span>
26
- <span class="quiet">Statements</span>
27
- <span class='fraction'>36/36</span>
28
- </div>
29
-
30
-
31
- <div class='fl pad1y space-right2'>
32
- <span class="strong">100% </span>
33
- <span class="quiet">Branches</span>
34
- <span class='fraction'>22/22</span>
35
- </div>
36
-
37
-
38
- <div class='fl pad1y space-right2'>
39
- <span class="strong">100% </span>
40
- <span class="quiet">Functions</span>
41
- <span class='fraction'>7/7</span>
42
- </div>
43
-
44
-
45
- <div class='fl pad1y space-right2'>
46
- <span class="strong">100% </span>
47
- <span class="quiet">Lines</span>
48
- <span class='fraction'>33/33</span>
49
- </div>
50
-
51
-
52
- </div>
53
- <p class="quiet">
54
- 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.
55
- </p>
56
- </div>
57
- <div class='status-line high'></div>
58
- <pre><table class="coverage">
59
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
60
- <a name='L2'></a><a href='#L2'>2</a>
61
- <a name='L3'></a><a href='#L3'>3</a>
62
- <a name='L4'></a><a href='#L4'>4</a>
63
- <a name='L5'></a><a href='#L5'>5</a>
64
- <a name='L6'></a><a href='#L6'>6</a>
65
- <a name='L7'></a><a href='#L7'>7</a>
66
- <a name='L8'></a><a href='#L8'>8</a>
67
- <a name='L9'></a><a href='#L9'>9</a>
68
- <a name='L10'></a><a href='#L10'>10</a>
69
- <a name='L11'></a><a href='#L11'>11</a>
70
- <a name='L12'></a><a href='#L12'>12</a>
71
- <a name='L13'></a><a href='#L13'>13</a>
72
- <a name='L14'></a><a href='#L14'>14</a>
73
- <a name='L15'></a><a href='#L15'>15</a>
74
- <a name='L16'></a><a href='#L16'>16</a>
75
- <a name='L17'></a><a href='#L17'>17</a>
76
- <a name='L18'></a><a href='#L18'>18</a>
77
- <a name='L19'></a><a href='#L19'>19</a>
78
- <a name='L20'></a><a href='#L20'>20</a>
79
- <a name='L21'></a><a href='#L21'>21</a>
80
- <a name='L22'></a><a href='#L22'>22</a>
81
- <a name='L23'></a><a href='#L23'>23</a>
82
- <a name='L24'></a><a href='#L24'>24</a>
83
- <a name='L25'></a><a href='#L25'>25</a>
84
- <a name='L26'></a><a href='#L26'>26</a>
85
- <a name='L27'></a><a href='#L27'>27</a>
86
- <a name='L28'></a><a href='#L28'>28</a>
87
- <a name='L29'></a><a href='#L29'>29</a>
88
- <a name='L30'></a><a href='#L30'>30</a>
89
- <a name='L31'></a><a href='#L31'>31</a>
90
- <a name='L32'></a><a href='#L32'>32</a>
91
- <a name='L33'></a><a href='#L33'>33</a>
92
- <a name='L34'></a><a href='#L34'>34</a>
93
- <a name='L35'></a><a href='#L35'>35</a>
94
- <a name='L36'></a><a href='#L36'>36</a>
95
- <a name='L37'></a><a href='#L37'>37</a>
96
- <a name='L38'></a><a href='#L38'>38</a>
97
- <a name='L39'></a><a href='#L39'>39</a>
98
- <a name='L40'></a><a href='#L40'>40</a>
99
- <a name='L41'></a><a href='#L41'>41</a>
100
- <a name='L42'></a><a href='#L42'>42</a>
101
- <a name='L43'></a><a href='#L43'>43</a>
102
- <a name='L44'></a><a href='#L44'>44</a>
103
- <a name='L45'></a><a href='#L45'>45</a>
104
- <a name='L46'></a><a href='#L46'>46</a>
105
- <a name='L47'></a><a href='#L47'>47</a>
106
- <a name='L48'></a><a href='#L48'>48</a>
107
- <a name='L49'></a><a href='#L49'>49</a>
108
- <a name='L50'></a><a href='#L50'>50</a>
109
- <a name='L51'></a><a href='#L51'>51</a>
110
- <a name='L52'></a><a href='#L52'>52</a>
111
- <a name='L53'></a><a href='#L53'>53</a>
112
- <a name='L54'></a><a href='#L54'>54</a>
113
- <a name='L55'></a><a href='#L55'>55</a>
114
- <a name='L56'></a><a href='#L56'>56</a>
115
- <a name='L57'></a><a href='#L57'>57</a>
116
- <a name='L58'></a><a href='#L58'>58</a>
117
- <a name='L59'></a><a href='#L59'>59</a>
118
- <a name='L60'></a><a href='#L60'>60</a>
119
- <a name='L61'></a><a href='#L61'>61</a>
120
- <a name='L62'></a><a href='#L62'>62</a>
121
- <a name='L63'></a><a href='#L63'>63</a>
122
- <a name='L64'></a><a href='#L64'>64</a>
123
- <a name='L65'></a><a href='#L65'>65</a>
124
- <a name='L66'></a><a href='#L66'>66</a>
125
- <a name='L67'></a><a href='#L67'>67</a>
126
- <a name='L68'></a><a href='#L68'>68</a>
127
- <a name='L69'></a><a href='#L69'>69</a>
128
- <a name='L70'></a><a href='#L70'>70</a>
129
- <a name='L71'></a><a href='#L71'>71</a>
130
- <a name='L72'></a><a href='#L72'>72</a>
131
- <a name='L73'></a><a href='#L73'>73</a>
132
- <a name='L74'></a><a href='#L74'>74</a>
133
- <a name='L75'></a><a href='#L75'>75</a>
134
- <a name='L76'></a><a href='#L76'>76</a>
135
- <a name='L77'></a><a href='#L77'>77</a>
136
- <a name='L78'></a><a href='#L78'>78</a>
137
- <a name='L79'></a><a href='#L79'>79</a>
138
- <a name='L80'></a><a href='#L80'>80</a>
139
- <a name='L81'></a><a href='#L81'>81</a>
140
- <a name='L82'></a><a href='#L82'>82</a>
141
- <a name='L83'></a><a href='#L83'>83</a>
142
- <a name='L84'></a><a href='#L84'>84</a>
143
- <a name='L85'></a><a href='#L85'>85</a>
144
- <a name='L86'></a><a href='#L86'>86</a>
145
- <a name='L87'></a><a href='#L87'>87</a>
146
- <a name='L88'></a><a href='#L88'>88</a>
147
- <a name='L89'></a><a href='#L89'>89</a>
148
- <a name='L90'></a><a href='#L90'>90</a>
149
- <a name='L91'></a><a href='#L91'>91</a>
150
- <a name='L92'></a><a href='#L92'>92</a>
151
- <a name='L93'></a><a href='#L93'>93</a>
152
- <a name='L94'></a><a href='#L94'>94</a>
153
- <a name='L95'></a><a href='#L95'>95</a>
154
- <a name='L96'></a><a href='#L96'>96</a>
155
- <a name='L97'></a><a href='#L97'>97</a>
156
- <a name='L98'></a><a href='#L98'>98</a>
157
- <a name='L99'></a><a href='#L99'>99</a>
158
- <a name='L100'></a><a href='#L100'>100</a>
159
- <a name='L101'></a><a href='#L101'>101</a>
160
- <a name='L102'></a><a href='#L102'>102</a>
161
- <a name='L103'></a><a href='#L103'>103</a>
162
- <a name='L104'></a><a href='#L104'>104</a>
163
- <a name='L105'></a><a href='#L105'>105</a>
164
- <a name='L106'></a><a href='#L106'>106</a>
165
- <a name='L107'></a><a href='#L107'>107</a>
166
- <a name='L108'></a><a href='#L108'>108</a>
167
- <a name='L109'></a><a href='#L109'>109</a>
168
- <a name='L110'></a><a href='#L110'>110</a>
169
- <a name='L111'></a><a href='#L111'>111</a>
170
- <a name='L112'></a><a href='#L112'>112</a>
171
- <a name='L113'></a><a href='#L113'>113</a>
172
- <a name='L114'></a><a href='#L114'>114</a>
173
- <a name='L115'></a><a href='#L115'>115</a>
174
- <a name='L116'></a><a href='#L116'>116</a>
175
- <a name='L117'></a><a href='#L117'>117</a>
176
- <a name='L118'></a><a href='#L118'>118</a>
177
- <a name='L119'></a><a href='#L119'>119</a>
178
- <a name='L120'></a><a href='#L120'>120</a>
179
- <a name='L121'></a><a href='#L121'>121</a>
180
- <a name='L122'></a><a href='#L122'>122</a>
181
- <a name='L123'></a><a href='#L123'>123</a>
182
- <a name='L124'></a><a href='#L124'>124</a>
183
- <a name='L125'></a><a href='#L125'>125</a>
184
- <a name='L126'></a><a href='#L126'>126</a>
185
- <a name='L127'></a><a href='#L127'>127</a>
186
- <a name='L128'></a><a href='#L128'>128</a>
187
- <a name='L129'></a><a href='#L129'>129</a>
188
- <a name='L130'></a><a href='#L130'>130</a>
189
- <a name='L131'></a><a href='#L131'>131</a>
190
- <a name='L132'></a><a href='#L132'>132</a>
191
- <a name='L133'></a><a href='#L133'>133</a>
192
- <a name='L134'></a><a href='#L134'>134</a>
193
- <a name='L135'></a><a href='#L135'>135</a>
194
- <a name='L136'></a><a href='#L136'>136</a>
195
- <a name='L137'></a><a href='#L137'>137</a>
196
- <a name='L138'></a><a href='#L138'>138</a>
197
- <a name='L139'></a><a href='#L139'>139</a>
198
- <a name='L140'></a><a href='#L140'>140</a>
199
- <a name='L141'></a><a href='#L141'>141</a>
200
- <a name='L142'></a><a href='#L142'>142</a>
201
- <a name='L143'></a><a href='#L143'>143</a>
202
- <a name='L144'></a><a href='#L144'>144</a>
203
- <a name='L145'></a><a href='#L145'>145</a>
204
- <a name='L146'></a><a href='#L146'>146</a>
205
- <a name='L147'></a><a href='#L147'>147</a>
206
- <a name='L148'></a><a href='#L148'>148</a>
207
- <a name='L149'></a><a href='#L149'>149</a>
208
- <a name='L150'></a><a href='#L150'>150</a>
209
- <a name='L151'></a><a href='#L151'>151</a>
210
- <a name='L152'></a><a href='#L152'>152</a>
211
- <a name='L153'></a><a href='#L153'>153</a>
212
- <a name='L154'></a><a href='#L154'>154</a>
213
- <a name='L155'></a><a href='#L155'>155</a>
214
- <a name='L156'></a><a href='#L156'>156</a>
215
- <a name='L157'></a><a href='#L157'>157</a>
216
- <a name='L158'></a><a href='#L158'>158</a>
217
- <a name='L159'></a><a href='#L159'>159</a>
218
- <a name='L160'></a><a href='#L160'>160</a>
219
- <a name='L161'></a><a href='#L161'>161</a>
220
- <a name='L162'></a><a href='#L162'>162</a>
221
- <a name='L163'></a><a href='#L163'>163</a>
222
- <a name='L164'></a><a href='#L164'>164</a>
223
- <a name='L165'></a><a href='#L165'>165</a>
224
- <a name='L166'></a><a href='#L166'>166</a>
225
- <a name='L167'></a><a href='#L167'>167</a>
226
- <a name='L168'></a><a href='#L168'>168</a>
227
- <a name='L169'></a><a href='#L169'>169</a>
228
- <a name='L170'></a><a href='#L170'>170</a>
229
- <a name='L171'></a><a href='#L171'>171</a>
230
- <a name='L172'></a><a href='#L172'>172</a>
231
- <a name='L173'></a><a href='#L173'>173</a>
232
- <a name='L174'></a><a href='#L174'>174</a>
233
- <a name='L175'></a><a href='#L175'>175</a>
234
- <a name='L176'></a><a href='#L176'>176</a>
235
- <a name='L177'></a><a href='#L177'>177</a>
236
- <a name='L178'></a><a href='#L178'>178</a>
237
- <a name='L179'></a><a href='#L179'>179</a>
238
- <a name='L180'></a><a href='#L180'>180</a>
239
- <a name='L181'></a><a href='#L181'>181</a>
240
- <a name='L182'></a><a href='#L182'>182</a>
241
- <a name='L183'></a><a href='#L183'>183</a>
242
- <a name='L184'></a><a href='#L184'>184</a>
243
- <a name='L185'></a><a href='#L185'>185</a>
244
- <a name='L186'></a><a href='#L186'>186</a>
245
- <a name='L187'></a><a href='#L187'>187</a>
246
- <a name='L188'></a><a href='#L188'>188</a>
247
- <a name='L189'></a><a href='#L189'>189</a>
248
- <a name='L190'></a><a href='#L190'>190</a>
249
- <a name='L191'></a><a href='#L191'>191</a>
250
- <a name='L192'></a><a href='#L192'>192</a>
251
- <a name='L193'></a><a href='#L193'>193</a>
252
- <a name='L194'></a><a href='#L194'>194</a>
253
- <a name='L195'></a><a href='#L195'>195</a>
254
- <a name='L196'></a><a href='#L196'>196</a>
255
- <a name='L197'></a><a href='#L197'>197</a>
256
- <a name='L198'></a><a href='#L198'>198</a>
257
- <a name='L199'></a><a href='#L199'>199</a>
258
- <a name='L200'></a><a href='#L200'>200</a>
259
- <a name='L201'></a><a href='#L201'>201</a>
260
- <a name='L202'></a><a href='#L202'>202</a>
261
- <a name='L203'></a><a href='#L203'>203</a>
262
- <a name='L204'></a><a href='#L204'>204</a>
263
- <a name='L205'></a><a href='#L205'>205</a>
264
- <a name='L206'></a><a href='#L206'>206</a>
265
- <a name='L207'></a><a href='#L207'>207</a>
266
- <a name='L208'></a><a href='#L208'>208</a>
267
- <a name='L209'></a><a href='#L209'>209</a>
268
- <a name='L210'></a><a href='#L210'>210</a>
269
- <a name='L211'></a><a href='#L211'>211</a>
270
- <a name='L212'></a><a href='#L212'>212</a>
271
- <a name='L213'></a><a href='#L213'>213</a>
272
- <a name='L214'></a><a href='#L214'>214</a>
273
- <a name='L215'></a><a href='#L215'>215</a>
274
- <a name='L216'></a><a href='#L216'>216</a>
275
- <a name='L217'></a><a href='#L217'>217</a>
276
- <a name='L218'></a><a href='#L218'>218</a>
277
- <a name='L219'></a><a href='#L219'>219</a>
278
- <a name='L220'></a><a href='#L220'>220</a>
279
- <a name='L221'></a><a href='#L221'>221</a>
280
- <a name='L222'></a><a href='#L222'>222</a>
281
- <a name='L223'></a><a href='#L223'>223</a>
282
- <a name='L224'></a><a href='#L224'>224</a>
283
- <a name='L225'></a><a href='#L225'>225</a>
284
- <a name='L226'></a><a href='#L226'>226</a>
285
- <a name='L227'></a><a href='#L227'>227</a>
286
- <a name='L228'></a><a href='#L228'>228</a>
287
- <a name='L229'></a><a href='#L229'>229</a>
288
- <a name='L230'></a><a href='#L230'>230</a>
289
- <a name='L231'></a><a href='#L231'>231</a>
290
- <a name='L232'></a><a href='#L232'>232</a>
291
- <a name='L233'></a><a href='#L233'>233</a>
292
- <a name='L234'></a><a href='#L234'>234</a>
293
- <a name='L235'></a><a href='#L235'>235</a>
294
- <a name='L236'></a><a href='#L236'>236</a>
295
- <a name='L237'></a><a href='#L237'>237</a>
296
- <a name='L238'></a><a href='#L238'>238</a>
297
- <a name='L239'></a><a href='#L239'>239</a>
298
- <a name='L240'></a><a href='#L240'>240</a>
299
- <a name='L241'></a><a href='#L241'>241</a>
300
- <a name='L242'></a><a href='#L242'>242</a>
301
- <a name='L243'></a><a href='#L243'>243</a>
302
- <a name='L244'></a><a href='#L244'>244</a>
303
- <a name='L245'></a><a href='#L245'>245</a>
304
- <a name='L246'></a><a href='#L246'>246</a>
305
- <a name='L247'></a><a href='#L247'>247</a>
306
- <a name='L248'></a><a href='#L248'>248</a>
307
- <a name='L249'></a><a href='#L249'>249</a>
308
- <a name='L250'></a><a href='#L250'>250</a>
309
- <a name='L251'></a><a href='#L251'>251</a>
310
- <a name='L252'></a><a href='#L252'>252</a>
311
- <a name='L253'></a><a href='#L253'>253</a>
312
- <a name='L254'></a><a href='#L254'>254</a>
313
- <a name='L255'></a><a href='#L255'>255</a>
314
- <a name='L256'></a><a href='#L256'>256</a>
315
- <a name='L257'></a><a href='#L257'>257</a>
316
- <a name='L258'></a><a href='#L258'>258</a>
317
- <a name='L259'></a><a href='#L259'>259</a>
318
- <a name='L260'></a><a href='#L260'>260</a>
319
- <a name='L261'></a><a href='#L261'>261</a>
320
- <a name='L262'></a><a href='#L262'>262</a>
321
- <a name='L263'></a><a href='#L263'>263</a>
322
- <a name='L264'></a><a href='#L264'>264</a>
323
- <a name='L265'></a><a href='#L265'>265</a>
324
- <a name='L266'></a><a href='#L266'>266</a>
325
- <a name='L267'></a><a href='#L267'>267</a>
326
- <a name='L268'></a><a href='#L268'>268</a>
327
- <a name='L269'></a><a href='#L269'>269</a>
328
- <a name='L270'></a><a href='#L270'>270</a>
329
- <a name='L271'></a><a href='#L271'>271</a>
330
- <a name='L272'></a><a href='#L272'>272</a>
331
- <a name='L273'></a><a href='#L273'>273</a>
332
- <a name='L274'></a><a href='#L274'>274</a>
333
- <a name='L275'></a><a href='#L275'>275</a>
334
- <a name='L276'></a><a href='#L276'>276</a>
335
- <a name='L277'></a><a href='#L277'>277</a>
336
- <a name='L278'></a><a href='#L278'>278</a>
337
- <a name='L279'></a><a href='#L279'>279</a>
338
- <a name='L280'></a><a href='#L280'>280</a>
339
- <a name='L281'></a><a href='#L281'>281</a>
340
- <a name='L282'></a><a href='#L282'>282</a>
341
- <a name='L283'></a><a href='#L283'>283</a>
342
- <a name='L284'></a><a href='#L284'>284</a>
343
- <a name='L285'></a><a href='#L285'>285</a>
344
- <a name='L286'></a><a href='#L286'>286</a>
345
- <a name='L287'></a><a href='#L287'>287</a>
346
- <a name='L288'></a><a href='#L288'>288</a>
347
- <a name='L289'></a><a href='#L289'>289</a>
348
- <a name='L290'></a><a href='#L290'>290</a>
349
- <a name='L291'></a><a href='#L291'>291</a>
350
- <a name='L292'></a><a href='#L292'>292</a>
351
- <a name='L293'></a><a href='#L293'>293</a>
352
- <a name='L294'></a><a href='#L294'>294</a>
353
- <a name='L295'></a><a href='#L295'>295</a>
354
- <a name='L296'></a><a href='#L296'>296</a>
355
- <a name='L297'></a><a href='#L297'>297</a>
356
- <a name='L298'></a><a href='#L298'>298</a>
357
- <a name='L299'></a><a href='#L299'>299</a>
358
- <a name='L300'></a><a href='#L300'>300</a>
359
- <a name='L301'></a><a href='#L301'>301</a>
360
- <a name='L302'></a><a href='#L302'>302</a>
361
- <a name='L303'></a><a href='#L303'>303</a>
362
- <a name='L304'></a><a href='#L304'>304</a>
363
- <a name='L305'></a><a href='#L305'>305</a>
364
- <a name='L306'></a><a href='#L306'>306</a>
365
- <a name='L307'></a><a href='#L307'>307</a>
366
- <a name='L308'></a><a href='#L308'>308</a>
367
- <a name='L309'></a><a href='#L309'>309</a>
368
- <a name='L310'></a><a href='#L310'>310</a>
369
- <a name='L311'></a><a href='#L311'>311</a>
370
- <a name='L312'></a><a href='#L312'>312</a>
371
- <a name='L313'></a><a href='#L313'>313</a>
372
- <a name='L314'></a><a href='#L314'>314</a>
373
- <a name='L315'></a><a href='#L315'>315</a>
374
- <a name='L316'></a><a href='#L316'>316</a>
375
- <a name='L317'></a><a href='#L317'>317</a>
376
- <a name='L318'></a><a href='#L318'>318</a>
377
- <a name='L319'></a><a href='#L319'>319</a>
378
- <a name='L320'></a><a href='#L320'>320</a>
379
- <a name='L321'></a><a href='#L321'>321</a>
380
- <a name='L322'></a><a href='#L322'>322</a>
381
- <a name='L323'></a><a href='#L323'>323</a>
382
- <a name='L324'></a><a href='#L324'>324</a>
383
- <a name='L325'></a><a href='#L325'>325</a>
384
- <a name='L326'></a><a href='#L326'>326</a>
385
- <a name='L327'></a><a href='#L327'>327</a>
386
- <a name='L328'></a><a href='#L328'>328</a>
387
- <a name='L329'></a><a href='#L329'>329</a>
388
- <a name='L330'></a><a href='#L330'>330</a>
389
- <a name='L331'></a><a href='#L331'>331</a>
390
- <a name='L332'></a><a href='#L332'>332</a>
391
- <a name='L333'></a><a href='#L333'>333</a>
392
- <a name='L334'></a><a href='#L334'>334</a>
393
- <a name='L335'></a><a href='#L335'>335</a>
394
- <a name='L336'></a><a href='#L336'>336</a>
395
- <a name='L337'></a><a href='#L337'>337</a>
396
- <a name='L338'></a><a href='#L338'>338</a>
397
- <a name='L339'></a><a href='#L339'>339</a>
398
- <a name='L340'></a><a href='#L340'>340</a>
399
- <a name='L341'></a><a href='#L341'>341</a>
400
- <a name='L342'></a><a href='#L342'>342</a>
401
- <a name='L343'></a><a href='#L343'>343</a>
402
- <a name='L344'></a><a href='#L344'>344</a>
403
- <a name='L345'></a><a href='#L345'>345</a>
404
- <a name='L346'></a><a href='#L346'>346</a>
405
- <a name='L347'></a><a href='#L347'>347</a>
406
- <a name='L348'></a><a href='#L348'>348</a>
407
- <a name='L349'></a><a href='#L349'>349</a>
408
- <a name='L350'></a><a href='#L350'>350</a>
409
- <a name='L351'></a><a href='#L351'>351</a>
410
- <a name='L352'></a><a href='#L352'>352</a>
411
- <a name='L353'></a><a href='#L353'>353</a>
412
- <a name='L354'></a><a href='#L354'>354</a>
413
- <a name='L355'></a><a href='#L355'>355</a>
414
- <a name='L356'></a><a href='#L356'>356</a>
415
- <a name='L357'></a><a href='#L357'>357</a>
416
- <a name='L358'></a><a href='#L358'>358</a>
417
- <a name='L359'></a><a href='#L359'>359</a>
418
- <a name='L360'></a><a href='#L360'>360</a>
419
- <a name='L361'></a><a href='#L361'>361</a>
420
- <a name='L362'></a><a href='#L362'>362</a>
421
- <a name='L363'></a><a href='#L363'>363</a>
422
- <a name='L364'></a><a href='#L364'>364</a>
423
- <a name='L365'></a><a href='#L365'>365</a>
424
- <a name='L366'></a><a href='#L366'>366</a>
425
- <a name='L367'></a><a href='#L367'>367</a>
426
- <a name='L368'></a><a href='#L368'>368</a>
427
- <a name='L369'></a><a href='#L369'>369</a>
428
- <a name='L370'></a><a href='#L370'>370</a>
429
- <a name='L371'></a><a href='#L371'>371</a>
430
- <a name='L372'></a><a href='#L372'>372</a>
431
- <a name='L373'></a><a href='#L373'>373</a>
432
- <a name='L374'></a><a href='#L374'>374</a>
433
- <a name='L375'></a><a href='#L375'>375</a>
434
- <a name='L376'></a><a href='#L376'>376</a>
435
- <a name='L377'></a><a href='#L377'>377</a>
436
- <a name='L378'></a><a href='#L378'>378</a>
437
- <a name='L379'></a><a href='#L379'>379</a>
438
- <a name='L380'></a><a href='#L380'>380</a>
439
- <a name='L381'></a><a href='#L381'>381</a>
440
- <a name='L382'></a><a href='#L382'>382</a>
441
- <a name='L383'></a><a href='#L383'>383</a>
442
- <a name='L384'></a><a href='#L384'>384</a>
443
- <a name='L385'></a><a href='#L385'>385</a>
444
- <a name='L386'></a><a href='#L386'>386</a>
445
- <a name='L387'></a><a href='#L387'>387</a>
446
- <a name='L388'></a><a href='#L388'>388</a>
447
- <a name='L389'></a><a href='#L389'>389</a>
448
- <a name='L390'></a><a href='#L390'>390</a>
449
- <a name='L391'></a><a href='#L391'>391</a>
450
- <a name='L392'></a><a href='#L392'>392</a>
451
- <a name='L393'></a><a href='#L393'>393</a>
452
- <a name='L394'></a><a href='#L394'>394</a>
453
- <a name='L395'></a><a href='#L395'>395</a>
454
- <a name='L396'></a><a href='#L396'>396</a>
455
- <a name='L397'></a><a href='#L397'>397</a>
456
- <a name='L398'></a><a href='#L398'>398</a>
457
- <a name='L399'></a><a href='#L399'>399</a>
458
- <a name='L400'></a><a href='#L400'>400</a>
459
- <a name='L401'></a><a href='#L401'>401</a>
460
- <a name='L402'></a><a href='#L402'>402</a>
461
- <a name='L403'></a><a href='#L403'>403</a>
462
- <a name='L404'></a><a href='#L404'>404</a>
463
- <a name='L405'></a><a href='#L405'>405</a>
464
- <a name='L406'></a><a href='#L406'>406</a>
465
- <a name='L407'></a><a href='#L407'>407</a>
466
- <a name='L408'></a><a href='#L408'>408</a>
467
- <a name='L409'></a><a href='#L409'>409</a>
468
- <a name='L410'></a><a href='#L410'>410</a>
469
- <a name='L411'></a><a href='#L411'>411</a>
470
- <a name='L412'></a><a href='#L412'>412</a>
471
- <a name='L413'></a><a href='#L413'>413</a>
472
- <a name='L414'></a><a href='#L414'>414</a>
473
- <a name='L415'></a><a href='#L415'>415</a>
474
- <a name='L416'></a><a href='#L416'>416</a>
475
- <a name='L417'></a><a href='#L417'>417</a>
476
- <a name='L418'></a><a href='#L418'>418</a>
477
- <a name='L419'></a><a href='#L419'>419</a>
478
- <a name='L420'></a><a href='#L420'>420</a>
479
- <a name='L421'></a><a href='#L421'>421</a>
480
- <a name='L422'></a><a href='#L422'>422</a>
481
- <a name='L423'></a><a href='#L423'>423</a>
482
- <a name='L424'></a><a href='#L424'>424</a>
483
- <a name='L425'></a><a href='#L425'>425</a>
484
- <a name='L426'></a><a href='#L426'>426</a>
485
- <a name='L427'></a><a href='#L427'>427</a>
486
- <a name='L428'></a><a href='#L428'>428</a>
487
- <a name='L429'></a><a href='#L429'>429</a>
488
- <a name='L430'></a><a href='#L430'>430</a>
489
- <a name='L431'></a><a href='#L431'>431</a>
490
- <a name='L432'></a><a href='#L432'>432</a>
491
- <a name='L433'></a><a href='#L433'>433</a>
492
- <a name='L434'></a><a href='#L434'>434</a>
493
- <a name='L435'></a><a href='#L435'>435</a>
494
- <a name='L436'></a><a href='#L436'>436</a>
495
- <a name='L437'></a><a href='#L437'>437</a>
496
- <a name='L438'></a><a href='#L438'>438</a>
497
- <a name='L439'></a><a href='#L439'>439</a>
498
- <a name='L440'></a><a href='#L440'>440</a>
499
- <a name='L441'></a><a href='#L441'>441</a>
500
- <a name='L442'></a><a href='#L442'>442</a>
501
- <a name='L443'></a><a href='#L443'>443</a>
502
- <a name='L444'></a><a href='#L444'>444</a>
503
- <a name='L445'></a><a href='#L445'>445</a>
504
- <a name='L446'></a><a href='#L446'>446</a>
505
- <a name='L447'></a><a href='#L447'>447</a>
506
- <a name='L448'></a><a href='#L448'>448</a>
507
- <a name='L449'></a><a href='#L449'>449</a>
508
- <a name='L450'></a><a href='#L450'>450</a>
509
- <a name='L451'></a><a href='#L451'>451</a>
510
- <a name='L452'></a><a href='#L452'>452</a>
511
- <a name='L453'></a><a href='#L453'>453</a>
512
- <a name='L454'></a><a href='#L454'>454</a>
513
- <a name='L455'></a><a href='#L455'>455</a>
514
- <a name='L456'></a><a href='#L456'>456</a>
515
- <a name='L457'></a><a href='#L457'>457</a>
516
- <a name='L458'></a><a href='#L458'>458</a>
517
- <a name='L459'></a><a href='#L459'>459</a>
518
- <a name='L460'></a><a href='#L460'>460</a>
519
- <a name='L461'></a><a href='#L461'>461</a>
520
- <a name='L462'></a><a href='#L462'>462</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
521
- <span class="cline-any cline-neutral">&nbsp;</span>
522
- <span class="cline-any cline-yes">2x</span>
523
- <span class="cline-any cline-yes">2x</span>
524
- <span class="cline-any cline-yes">2x</span>
525
- <span class="cline-any cline-yes">2x</span>
526
- <span class="cline-any cline-neutral">&nbsp;</span>
527
- <span class="cline-any cline-yes">2x</span>
528
- <span class="cline-any cline-neutral">&nbsp;</span>
529
- <span class="cline-any cline-neutral">&nbsp;</span>
530
- <span class="cline-any cline-neutral">&nbsp;</span>
531
- <span class="cline-any cline-neutral">&nbsp;</span>
532
- <span class="cline-any cline-neutral">&nbsp;</span>
533
- <span class="cline-any cline-neutral">&nbsp;</span>
534
- <span class="cline-any cline-neutral">&nbsp;</span>
535
- <span class="cline-any cline-neutral">&nbsp;</span>
536
- <span class="cline-any cline-neutral">&nbsp;</span>
537
- <span class="cline-any cline-neutral">&nbsp;</span>
538
- <span class="cline-any cline-neutral">&nbsp;</span>
539
- <span class="cline-any cline-neutral">&nbsp;</span>
540
- <span class="cline-any cline-neutral">&nbsp;</span>
541
- <span class="cline-any cline-neutral">&nbsp;</span>
542
- <span class="cline-any cline-neutral">&nbsp;</span>
543
- <span class="cline-any cline-neutral">&nbsp;</span>
544
- <span class="cline-any cline-neutral">&nbsp;</span>
545
- <span class="cline-any cline-neutral">&nbsp;</span>
546
- <span class="cline-any cline-neutral">&nbsp;</span>
547
- <span class="cline-any cline-neutral">&nbsp;</span>
548
- <span class="cline-any cline-neutral">&nbsp;</span>
549
- <span class="cline-any cline-neutral">&nbsp;</span>
550
- <span class="cline-any cline-neutral">&nbsp;</span>
551
- <span class="cline-any cline-neutral">&nbsp;</span>
552
- <span class="cline-any cline-neutral">&nbsp;</span>
553
- <span class="cline-any cline-neutral">&nbsp;</span>
554
- <span class="cline-any cline-neutral">&nbsp;</span>
555
- <span class="cline-any cline-neutral">&nbsp;</span>
556
- <span class="cline-any cline-neutral">&nbsp;</span>
557
- <span class="cline-any cline-neutral">&nbsp;</span>
558
- <span class="cline-any cline-neutral">&nbsp;</span>
559
- <span class="cline-any cline-neutral">&nbsp;</span>
560
- <span class="cline-any cline-neutral">&nbsp;</span>
561
- <span class="cline-any cline-neutral">&nbsp;</span>
562
- <span class="cline-any cline-neutral">&nbsp;</span>
563
- <span class="cline-any cline-neutral">&nbsp;</span>
564
- <span class="cline-any cline-neutral">&nbsp;</span>
565
- <span class="cline-any cline-neutral">&nbsp;</span>
566
- <span class="cline-any cline-neutral">&nbsp;</span>
567
- <span class="cline-any cline-neutral">&nbsp;</span>
568
- <span class="cline-any cline-neutral">&nbsp;</span>
569
- <span class="cline-any cline-neutral">&nbsp;</span>
570
- <span class="cline-any cline-neutral">&nbsp;</span>
571
- <span class="cline-any cline-neutral">&nbsp;</span>
572
- <span class="cline-any cline-neutral">&nbsp;</span>
573
- <span class="cline-any cline-neutral">&nbsp;</span>
574
- <span class="cline-any cline-neutral">&nbsp;</span>
575
- <span class="cline-any cline-neutral">&nbsp;</span>
576
- <span class="cline-any cline-neutral">&nbsp;</span>
577
- <span class="cline-any cline-neutral">&nbsp;</span>
578
- <span class="cline-any cline-neutral">&nbsp;</span>
579
- <span class="cline-any cline-neutral">&nbsp;</span>
580
- <span class="cline-any cline-neutral">&nbsp;</span>
581
- <span class="cline-any cline-neutral">&nbsp;</span>
582
- <span class="cline-any cline-neutral">&nbsp;</span>
583
- <span class="cline-any cline-neutral">&nbsp;</span>
584
- <span class="cline-any cline-neutral">&nbsp;</span>
585
- <span class="cline-any cline-neutral">&nbsp;</span>
586
- <span class="cline-any cline-neutral">&nbsp;</span>
587
- <span class="cline-any cline-neutral">&nbsp;</span>
588
- <span class="cline-any cline-neutral">&nbsp;</span>
589
- <span class="cline-any cline-neutral">&nbsp;</span>
590
- <span class="cline-any cline-neutral">&nbsp;</span>
591
- <span class="cline-any cline-neutral">&nbsp;</span>
592
- <span class="cline-any cline-neutral">&nbsp;</span>
593
- <span class="cline-any cline-neutral">&nbsp;</span>
594
- <span class="cline-any cline-neutral">&nbsp;</span>
595
- <span class="cline-any cline-neutral">&nbsp;</span>
596
- <span class="cline-any cline-neutral">&nbsp;</span>
597
- <span class="cline-any cline-neutral">&nbsp;</span>
598
- <span class="cline-any cline-yes">13x</span>
599
- <span class="cline-any cline-neutral">&nbsp;</span>
600
- <span class="cline-any cline-neutral">&nbsp;</span>
601
- <span class="cline-any cline-neutral">&nbsp;</span>
602
- <span class="cline-any cline-neutral">&nbsp;</span>
603
- <span class="cline-any cline-neutral">&nbsp;</span>
604
- <span class="cline-any cline-neutral">&nbsp;</span>
605
- <span class="cline-any cline-neutral">&nbsp;</span>
606
- <span class="cline-any cline-yes">12x</span>
607
- <span class="cline-any cline-neutral">&nbsp;</span>
608
- <span class="cline-any cline-neutral">&nbsp;</span>
609
- <span class="cline-any cline-neutral">&nbsp;</span>
610
- <span class="cline-any cline-yes">12x</span>
611
- <span class="cline-any cline-neutral">&nbsp;</span>
612
- <span class="cline-any cline-yes">12x</span>
613
- <span class="cline-any cline-yes">22x</span>
614
- <span class="cline-any cline-yes">2x</span>
615
- <span class="cline-any cline-neutral">&nbsp;</span>
616
- <span class="cline-any cline-yes">10x</span>
617
- <span class="cline-any cline-yes">1x</span>
618
- <span class="cline-any cline-neutral">&nbsp;</span>
619
- <span class="cline-any cline-yes">9x</span>
620
- <span class="cline-any cline-yes">2x</span>
621
- <span class="cline-any cline-neutral">&nbsp;</span>
622
- <span class="cline-any cline-yes">9x</span>
623
- <span class="cline-any cline-yes">9x</span>
624
- <span class="cline-any cline-yes">9x</span>
625
- <span class="cline-any cline-neutral">&nbsp;</span>
626
- <span class="cline-any cline-yes">9x</span>
627
- <span class="cline-any cline-neutral">&nbsp;</span>
628
- <span class="cline-any cline-neutral">&nbsp;</span>
629
- <span class="cline-any cline-neutral">&nbsp;</span>
630
- <span class="cline-any cline-neutral">&nbsp;</span>
631
- <span class="cline-any cline-neutral">&nbsp;</span>
632
- <span class="cline-any cline-neutral">&nbsp;</span>
633
- <span class="cline-any cline-neutral">&nbsp;</span>
634
- <span class="cline-any cline-neutral">&nbsp;</span>
635
- <span class="cline-any cline-neutral">&nbsp;</span>
636
- <span class="cline-any cline-neutral">&nbsp;</span>
637
- <span class="cline-any cline-neutral">&nbsp;</span>
638
- <span class="cline-any cline-neutral">&nbsp;</span>
639
- <span class="cline-any cline-neutral">&nbsp;</span>
640
- <span class="cline-any cline-neutral">&nbsp;</span>
641
- <span class="cline-any cline-neutral">&nbsp;</span>
642
- <span class="cline-any cline-neutral">&nbsp;</span>
643
- <span class="cline-any cline-neutral">&nbsp;</span>
644
- <span class="cline-any cline-neutral">&nbsp;</span>
645
- <span class="cline-any cline-neutral">&nbsp;</span>
646
- <span class="cline-any cline-neutral">&nbsp;</span>
647
- <span class="cline-any cline-neutral">&nbsp;</span>
648
- <span class="cline-any cline-neutral">&nbsp;</span>
649
- <span class="cline-any cline-neutral">&nbsp;</span>
650
- <span class="cline-any cline-neutral">&nbsp;</span>
651
- <span class="cline-any cline-neutral">&nbsp;</span>
652
- <span class="cline-any cline-neutral">&nbsp;</span>
653
- <span class="cline-any cline-neutral">&nbsp;</span>
654
- <span class="cline-any cline-neutral">&nbsp;</span>
655
- <span class="cline-any cline-neutral">&nbsp;</span>
656
- <span class="cline-any cline-neutral">&nbsp;</span>
657
- <span class="cline-any cline-neutral">&nbsp;</span>
658
- <span class="cline-any cline-neutral">&nbsp;</span>
659
- <span class="cline-any cline-neutral">&nbsp;</span>
660
- <span class="cline-any cline-neutral">&nbsp;</span>
661
- <span class="cline-any cline-neutral">&nbsp;</span>
662
- <span class="cline-any cline-neutral">&nbsp;</span>
663
- <span class="cline-any cline-neutral">&nbsp;</span>
664
- <span class="cline-any cline-neutral">&nbsp;</span>
665
- <span class="cline-any cline-neutral">&nbsp;</span>
666
- <span class="cline-any cline-neutral">&nbsp;</span>
667
- <span class="cline-any cline-neutral">&nbsp;</span>
668
- <span class="cline-any cline-neutral">&nbsp;</span>
669
- <span class="cline-any cline-neutral">&nbsp;</span>
670
- <span class="cline-any cline-neutral">&nbsp;</span>
671
- <span class="cline-any cline-neutral">&nbsp;</span>
672
- <span class="cline-any cline-neutral">&nbsp;</span>
673
- <span class="cline-any cline-neutral">&nbsp;</span>
674
- <span class="cline-any cline-neutral">&nbsp;</span>
675
- <span class="cline-any cline-neutral">&nbsp;</span>
676
- <span class="cline-any cline-neutral">&nbsp;</span>
677
- <span class="cline-any cline-neutral">&nbsp;</span>
678
- <span class="cline-any cline-neutral">&nbsp;</span>
679
- <span class="cline-any cline-neutral">&nbsp;</span>
680
- <span class="cline-any cline-neutral">&nbsp;</span>
681
- <span class="cline-any cline-neutral">&nbsp;</span>
682
- <span class="cline-any cline-neutral">&nbsp;</span>
683
- <span class="cline-any cline-neutral">&nbsp;</span>
684
- <span class="cline-any cline-neutral">&nbsp;</span>
685
- <span class="cline-any cline-neutral">&nbsp;</span>
686
- <span class="cline-any cline-neutral">&nbsp;</span>
687
- <span class="cline-any cline-neutral">&nbsp;</span>
688
- <span class="cline-any cline-neutral">&nbsp;</span>
689
- <span class="cline-any cline-neutral">&nbsp;</span>
690
- <span class="cline-any cline-neutral">&nbsp;</span>
691
- <span class="cline-any cline-neutral">&nbsp;</span>
692
- <span class="cline-any cline-neutral">&nbsp;</span>
693
- <span class="cline-any cline-neutral">&nbsp;</span>
694
- <span class="cline-any cline-neutral">&nbsp;</span>
695
- <span class="cline-any cline-neutral">&nbsp;</span>
696
- <span class="cline-any cline-neutral">&nbsp;</span>
697
- <span class="cline-any cline-neutral">&nbsp;</span>
698
- <span class="cline-any cline-neutral">&nbsp;</span>
699
- <span class="cline-any cline-neutral">&nbsp;</span>
700
- <span class="cline-any cline-neutral">&nbsp;</span>
701
- <span class="cline-any cline-neutral">&nbsp;</span>
702
- <span class="cline-any cline-neutral">&nbsp;</span>
703
- <span class="cline-any cline-neutral">&nbsp;</span>
704
- <span class="cline-any cline-neutral">&nbsp;</span>
705
- <span class="cline-any cline-yes">9x</span>
706
- <span class="cline-any cline-neutral">&nbsp;</span>
707
- <span class="cline-any cline-neutral">&nbsp;</span>
708
- <span class="cline-any cline-neutral">&nbsp;</span>
709
- <span class="cline-any cline-neutral">&nbsp;</span>
710
- <span class="cline-any cline-neutral">&nbsp;</span>
711
- <span class="cline-any cline-neutral">&nbsp;</span>
712
- <span class="cline-any cline-yes">9x</span>
713
- <span class="cline-any cline-yes">1x</span>
714
- <span class="cline-any cline-neutral">&nbsp;</span>
715
- <span class="cline-any cline-neutral">&nbsp;</span>
716
- <span class="cline-any cline-neutral">&nbsp;</span>
717
- <span class="cline-any cline-neutral">&nbsp;</span>
718
- <span class="cline-any cline-neutral">&nbsp;</span>
719
- <span class="cline-any cline-neutral">&nbsp;</span>
720
- <span class="cline-any cline-neutral">&nbsp;</span>
721
- <span class="cline-any cline-yes">1x</span>
722
- <span class="cline-any cline-neutral">&nbsp;</span>
723
- <span class="cline-any cline-neutral">&nbsp;</span>
724
- <span class="cline-any cline-neutral">&nbsp;</span>
725
- <span class="cline-any cline-neutral">&nbsp;</span>
726
- <span class="cline-any cline-neutral">&nbsp;</span>
727
- <span class="cline-any cline-yes">9x</span>
728
- <span class="cline-any cline-neutral">&nbsp;</span>
729
- <span class="cline-any cline-neutral">&nbsp;</span>
730
- <span class="cline-any cline-neutral">&nbsp;</span>
731
- <span class="cline-any cline-neutral">&nbsp;</span>
732
- <span class="cline-any cline-neutral">&nbsp;</span>
733
- <span class="cline-any cline-neutral">&nbsp;</span>
734
- <span class="cline-any cline-neutral">&nbsp;</span>
735
- <span class="cline-any cline-neutral">&nbsp;</span>
736
- <span class="cline-any cline-neutral">&nbsp;</span>
737
- <span class="cline-any cline-neutral">&nbsp;</span>
738
- <span class="cline-any cline-neutral">&nbsp;</span>
739
- <span class="cline-any cline-neutral">&nbsp;</span>
740
- <span class="cline-any cline-neutral">&nbsp;</span>
741
- <span class="cline-any cline-neutral">&nbsp;</span>
742
- <span class="cline-any cline-neutral">&nbsp;</span>
743
- <span class="cline-any cline-neutral">&nbsp;</span>
744
- <span class="cline-any cline-neutral">&nbsp;</span>
745
- <span class="cline-any cline-neutral">&nbsp;</span>
746
- <span class="cline-any cline-yes">9x</span>
747
- <span class="cline-any cline-neutral">&nbsp;</span>
748
- <span class="cline-any cline-yes">9x</span>
749
- <span class="cline-any cline-neutral">&nbsp;</span>
750
- <span class="cline-any cline-neutral">&nbsp;</span>
751
- <span class="cline-any cline-neutral">&nbsp;</span>
752
- <span class="cline-any cline-neutral">&nbsp;</span>
753
- <span class="cline-any cline-neutral">&nbsp;</span>
754
- <span class="cline-any cline-neutral">&nbsp;</span>
755
- <span class="cline-any cline-neutral">&nbsp;</span>
756
- <span class="cline-any cline-neutral">&nbsp;</span>
757
- <span class="cline-any cline-neutral">&nbsp;</span>
758
- <span class="cline-any cline-neutral">&nbsp;</span>
759
- <span class="cline-any cline-neutral">&nbsp;</span>
760
- <span class="cline-any cline-neutral">&nbsp;</span>
761
- <span class="cline-any cline-neutral">&nbsp;</span>
762
- <span class="cline-any cline-yes">6x</span>
763
- <span class="cline-any cline-neutral">&nbsp;</span>
764
- <span class="cline-any cline-neutral">&nbsp;</span>
765
- <span class="cline-any cline-neutral">&nbsp;</span>
766
- <span class="cline-any cline-neutral">&nbsp;</span>
767
- <span class="cline-any cline-neutral">&nbsp;</span>
768
- <span class="cline-any cline-neutral">&nbsp;</span>
769
- <span class="cline-any cline-neutral">&nbsp;</span>
770
- <span class="cline-any cline-neutral">&nbsp;</span>
771
- <span class="cline-any cline-neutral">&nbsp;</span>
772
- <span class="cline-any cline-neutral">&nbsp;</span>
773
- <span class="cline-any cline-neutral">&nbsp;</span>
774
- <span class="cline-any cline-neutral">&nbsp;</span>
775
- <span class="cline-any cline-neutral">&nbsp;</span>
776
- <span class="cline-any cline-neutral">&nbsp;</span>
777
- <span class="cline-any cline-neutral">&nbsp;</span>
778
- <span class="cline-any cline-neutral">&nbsp;</span>
779
- <span class="cline-any cline-neutral">&nbsp;</span>
780
- <span class="cline-any cline-yes">6x</span>
781
- <span class="cline-any cline-neutral">&nbsp;</span>
782
- <span class="cline-any cline-neutral">&nbsp;</span>
783
- <span class="cline-any cline-neutral">&nbsp;</span>
784
- <span class="cline-any cline-neutral">&nbsp;</span>
785
- <span class="cline-any cline-neutral">&nbsp;</span>
786
- <span class="cline-any cline-neutral">&nbsp;</span>
787
- <span class="cline-any cline-neutral">&nbsp;</span>
788
- <span class="cline-any cline-neutral">&nbsp;</span>
789
- <span class="cline-any cline-neutral">&nbsp;</span>
790
- <span class="cline-any cline-neutral">&nbsp;</span>
791
- <span class="cline-any cline-neutral">&nbsp;</span>
792
- <span class="cline-any cline-neutral">&nbsp;</span>
793
- <span class="cline-any cline-neutral">&nbsp;</span>
794
- <span class="cline-any cline-neutral">&nbsp;</span>
795
- <span class="cline-any cline-neutral">&nbsp;</span>
796
- <span class="cline-any cline-neutral">&nbsp;</span>
797
- <span class="cline-any cline-neutral">&nbsp;</span>
798
- <span class="cline-any cline-neutral">&nbsp;</span>
799
- <span class="cline-any cline-neutral">&nbsp;</span>
800
- <span class="cline-any cline-neutral">&nbsp;</span>
801
- <span class="cline-any cline-neutral">&nbsp;</span>
802
- <span class="cline-any cline-neutral">&nbsp;</span>
803
- <span class="cline-any cline-neutral">&nbsp;</span>
804
- <span class="cline-any cline-neutral">&nbsp;</span>
805
- <span class="cline-any cline-neutral">&nbsp;</span>
806
- <span class="cline-any cline-neutral">&nbsp;</span>
807
- <span class="cline-any cline-neutral">&nbsp;</span>
808
- <span class="cline-any cline-neutral">&nbsp;</span>
809
- <span class="cline-any cline-neutral">&nbsp;</span>
810
- <span class="cline-any cline-neutral">&nbsp;</span>
811
- <span class="cline-any cline-neutral">&nbsp;</span>
812
- <span class="cline-any cline-neutral">&nbsp;</span>
813
- <span class="cline-any cline-neutral">&nbsp;</span>
814
- <span class="cline-any cline-neutral">&nbsp;</span>
815
- <span class="cline-any cline-neutral">&nbsp;</span>
816
- <span class="cline-any cline-neutral">&nbsp;</span>
817
- <span class="cline-any cline-neutral">&nbsp;</span>
818
- <span class="cline-any cline-neutral">&nbsp;</span>
819
- <span class="cline-any cline-neutral">&nbsp;</span>
820
- <span class="cline-any cline-neutral">&nbsp;</span>
821
- <span class="cline-any cline-neutral">&nbsp;</span>
822
- <span class="cline-any cline-neutral">&nbsp;</span>
823
- <span class="cline-any cline-neutral">&nbsp;</span>
824
- <span class="cline-any cline-neutral">&nbsp;</span>
825
- <span class="cline-any cline-neutral">&nbsp;</span>
826
- <span class="cline-any cline-neutral">&nbsp;</span>
827
- <span class="cline-any cline-neutral">&nbsp;</span>
828
- <span class="cline-any cline-neutral">&nbsp;</span>
829
- <span class="cline-any cline-neutral">&nbsp;</span>
830
- <span class="cline-any cline-neutral">&nbsp;</span>
831
- <span class="cline-any cline-neutral">&nbsp;</span>
832
- <span class="cline-any cline-neutral">&nbsp;</span>
833
- <span class="cline-any cline-neutral">&nbsp;</span>
834
- <span class="cline-any cline-neutral">&nbsp;</span>
835
- <span class="cline-any cline-neutral">&nbsp;</span>
836
- <span class="cline-any cline-neutral">&nbsp;</span>
837
- <span class="cline-any cline-neutral">&nbsp;</span>
838
- <span class="cline-any cline-neutral">&nbsp;</span>
839
- <span class="cline-any cline-neutral">&nbsp;</span>
840
- <span class="cline-any cline-neutral">&nbsp;</span>
841
- <span class="cline-any cline-neutral">&nbsp;</span>
842
- <span class="cline-any cline-neutral">&nbsp;</span>
843
- <span class="cline-any cline-neutral">&nbsp;</span>
844
- <span class="cline-any cline-neutral">&nbsp;</span>
845
- <span class="cline-any cline-neutral">&nbsp;</span>
846
- <span class="cline-any cline-neutral">&nbsp;</span>
847
- <span class="cline-any cline-neutral">&nbsp;</span>
848
- <span class="cline-any cline-neutral">&nbsp;</span>
849
- <span class="cline-any cline-neutral">&nbsp;</span>
850
- <span class="cline-any cline-neutral">&nbsp;</span>
851
- <span class="cline-any cline-neutral">&nbsp;</span>
852
- <span class="cline-any cline-neutral">&nbsp;</span>
853
- <span class="cline-any cline-neutral">&nbsp;</span>
854
- <span class="cline-any cline-neutral">&nbsp;</span>
855
- <span class="cline-any cline-neutral">&nbsp;</span>
856
- <span class="cline-any cline-neutral">&nbsp;</span>
857
- <span class="cline-any cline-neutral">&nbsp;</span>
858
- <span class="cline-any cline-neutral">&nbsp;</span>
859
- <span class="cline-any cline-neutral">&nbsp;</span>
860
- <span class="cline-any cline-neutral">&nbsp;</span>
861
- <span class="cline-any cline-neutral">&nbsp;</span>
862
- <span class="cline-any cline-neutral">&nbsp;</span>
863
- <span class="cline-any cline-neutral">&nbsp;</span>
864
- <span class="cline-any cline-neutral">&nbsp;</span>
865
- <span class="cline-any cline-neutral">&nbsp;</span>
866
- <span class="cline-any cline-neutral">&nbsp;</span>
867
- <span class="cline-any cline-neutral">&nbsp;</span>
868
- <span class="cline-any cline-neutral">&nbsp;</span>
869
- <span class="cline-any cline-neutral">&nbsp;</span>
870
- <span class="cline-any cline-neutral">&nbsp;</span>
871
- <span class="cline-any cline-neutral">&nbsp;</span>
872
- <span class="cline-any cline-neutral">&nbsp;</span>
873
- <span class="cline-any cline-neutral">&nbsp;</span>
874
- <span class="cline-any cline-neutral">&nbsp;</span>
875
- <span class="cline-any cline-neutral">&nbsp;</span>
876
- <span class="cline-any cline-neutral">&nbsp;</span>
877
- <span class="cline-any cline-yes">4x</span>
878
- <span class="cline-any cline-yes">3x</span>
879
- <span class="cline-any cline-neutral">&nbsp;</span>
880
- <span class="cline-any cline-neutral">&nbsp;</span>
881
- <span class="cline-any cline-neutral">&nbsp;</span>
882
- <span class="cline-any cline-yes">3x</span>
883
- <span class="cline-any cline-neutral">&nbsp;</span>
884
- <span class="cline-any cline-neutral">&nbsp;</span>
885
- <span class="cline-any cline-neutral">&nbsp;</span>
886
- <span class="cline-any cline-neutral">&nbsp;</span>
887
- <span class="cline-any cline-neutral">&nbsp;</span>
888
- <span class="cline-any cline-neutral">&nbsp;</span>
889
- <span class="cline-any cline-neutral">&nbsp;</span>
890
- <span class="cline-any cline-neutral">&nbsp;</span>
891
- <span class="cline-any cline-neutral">&nbsp;</span>
892
- <span class="cline-any cline-neutral">&nbsp;</span>
893
- <span class="cline-any cline-neutral">&nbsp;</span>
894
- <span class="cline-any cline-neutral">&nbsp;</span>
895
- <span class="cline-any cline-neutral">&nbsp;</span>
896
- <span class="cline-any cline-neutral">&nbsp;</span>
897
- <span class="cline-any cline-neutral">&nbsp;</span>
898
- <span class="cline-any cline-neutral">&nbsp;</span>
899
- <span class="cline-any cline-neutral">&nbsp;</span>
900
- <span class="cline-any cline-neutral">&nbsp;</span>
901
- <span class="cline-any cline-neutral">&nbsp;</span>
902
- <span class="cline-any cline-neutral">&nbsp;</span>
903
- <span class="cline-any cline-neutral">&nbsp;</span>
904
- <span class="cline-any cline-neutral">&nbsp;</span>
905
- <span class="cline-any cline-neutral">&nbsp;</span>
906
- <span class="cline-any cline-neutral">&nbsp;</span>
907
- <span class="cline-any cline-neutral">&nbsp;</span>
908
- <span class="cline-any cline-neutral">&nbsp;</span>
909
- <span class="cline-any cline-neutral">&nbsp;</span>
910
- <span class="cline-any cline-neutral">&nbsp;</span>
911
- <span class="cline-any cline-neutral">&nbsp;</span>
912
- <span class="cline-any cline-neutral">&nbsp;</span>
913
- <span class="cline-any cline-neutral">&nbsp;</span>
914
- <span class="cline-any cline-neutral">&nbsp;</span>
915
- <span class="cline-any cline-neutral">&nbsp;</span>
916
- <span class="cline-any cline-neutral">&nbsp;</span>
917
- <span class="cline-any cline-neutral">&nbsp;</span>
918
- <span class="cline-any cline-neutral">&nbsp;</span>
919
- <span class="cline-any cline-neutral">&nbsp;</span>
920
- <span class="cline-any cline-neutral">&nbsp;</span>
921
- <span class="cline-any cline-neutral">&nbsp;</span>
922
- <span class="cline-any cline-neutral">&nbsp;</span>
923
- <span class="cline-any cline-neutral">&nbsp;</span>
924
- <span class="cline-any cline-neutral">&nbsp;</span>
925
- <span class="cline-any cline-neutral">&nbsp;</span>
926
- <span class="cline-any cline-neutral">&nbsp;</span>
927
- <span class="cline-any cline-neutral">&nbsp;</span>
928
- <span class="cline-any cline-neutral">&nbsp;</span>
929
- <span class="cline-any cline-neutral">&nbsp;</span>
930
- <span class="cline-any cline-neutral">&nbsp;</span>
931
- <span class="cline-any cline-neutral">&nbsp;</span>
932
- <span class="cline-any cline-neutral">&nbsp;</span>
933
- <span class="cline-any cline-neutral">&nbsp;</span>
934
- <span class="cline-any cline-neutral">&nbsp;</span>
935
- <span class="cline-any cline-neutral">&nbsp;</span>
936
- <span class="cline-any cline-yes">3x</span>
937
- <span class="cline-any cline-neutral">&nbsp;</span>
938
- <span class="cline-any cline-neutral">&nbsp;</span>
939
- <span class="cline-any cline-neutral">&nbsp;</span>
940
- <span class="cline-any cline-neutral">&nbsp;</span>
941
- <span class="cline-any cline-neutral">&nbsp;</span>
942
- <span class="cline-any cline-neutral">&nbsp;</span>
943
- <span class="cline-any cline-neutral">&nbsp;</span>
944
- <span class="cline-any cline-neutral">&nbsp;</span>
945
- <span class="cline-any cline-neutral">&nbsp;</span>
946
- <span class="cline-any cline-neutral">&nbsp;</span>
947
- <span class="cline-any cline-neutral">&nbsp;</span>
948
- <span class="cline-any cline-neutral">&nbsp;</span>
949
- <span class="cline-any cline-neutral">&nbsp;</span>
950
- <span class="cline-any cline-neutral">&nbsp;</span>
951
- <span class="cline-any cline-neutral">&nbsp;</span>
952
- <span class="cline-any cline-neutral">&nbsp;</span>
953
- <span class="cline-any cline-neutral">&nbsp;</span>
954
- <span class="cline-any cline-neutral">&nbsp;</span>
955
- <span class="cline-any cline-neutral">&nbsp;</span>
956
- <span class="cline-any cline-neutral">&nbsp;</span>
957
- <span class="cline-any cline-neutral">&nbsp;</span>
958
- <span class="cline-any cline-neutral">&nbsp;</span>
959
- <span class="cline-any cline-neutral">&nbsp;</span>
960
- <span class="cline-any cline-neutral">&nbsp;</span>
961
- <span class="cline-any cline-neutral">&nbsp;</span>
962
- <span class="cline-any cline-neutral">&nbsp;</span>
963
- <span class="cline-any cline-neutral">&nbsp;</span>
964
- <span class="cline-any cline-neutral">&nbsp;</span>
965
- <span class="cline-any cline-neutral">&nbsp;</span>
966
- <span class="cline-any cline-neutral">&nbsp;</span>
967
- <span class="cline-any cline-neutral">&nbsp;</span>
968
- <span class="cline-any cline-neutral">&nbsp;</span>
969
- <span class="cline-any cline-neutral">&nbsp;</span>
970
- <span class="cline-any cline-neutral">&nbsp;</span>
971
- <span class="cline-any cline-neutral">&nbsp;</span>
972
- <span class="cline-any cline-neutral">&nbsp;</span>
973
- <span class="cline-any cline-neutral">&nbsp;</span>
974
- <span class="cline-any cline-neutral">&nbsp;</span>
975
- <span class="cline-any cline-neutral">&nbsp;</span>
976
- <span class="cline-any cline-neutral">&nbsp;</span>
977
- <span class="cline-any cline-yes">2x</span>
978
- <span class="cline-any cline-neutral">&nbsp;</span>
979
- <span class="cline-any cline-neutral">&nbsp;</span>
980
- <span class="cline-any cline-neutral">&nbsp;</span>
981
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">'use strict';
982
- &nbsp;
983
- const crypto = require('crypto');
984
- const redent = require('redent');
985
- const Lambda = require('./lambda');
986
- const merge = require('../merge');
987
- &nbsp;
988
- const random = crypto.randomBytes(4).toString('hex');
989
- &nbsp;
990
- /**
991
- * The hookshot.Passthrough class defines resources that set up a single API Gateway
992
- * endpoint that responds to `POST` and `OPTIONS` requests. You are expected to
993
- * provide a Lambda function that will receive the request, and return some
994
- * response to the caller.
995
- *
996
- * Note that in this case, your Lambda function will receive every HTTP `POST`
997
- * request that arrives at the API Gateway URL that hookshot helped you create.
998
- * You are responsible for any authentication that should be performed against
999
- * incoming requests.
1000
- *
1001
- * Your Lambda function will receive an event object which includes the request
1002
- * method, headers, and body, as well as other data specific to the API Gateway
1003
- * endpoint created by hookshot. See [AWS documentation here](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format)
1004
- * for a full description of the incoming data.
1005
- *
1006
- * To work properly, **your lambda function must return a data object
1007
- * matching in a specific JSON format**. Again, see [AWS documentation for a full description](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-output-format).
1008
- *
1009
- * Your API Gateway endpoint will allow cross-origin resource
1010
- * sharing (CORS) required by requests from any webpage. Preflight `OPTIONS`
1011
- * requests will receive a `200` response with CORS headers. And the response
1012
- * you return from your Lambda function will be modified to include CORS headers.
1013
- *
1014
- * The generated template's `Outputs` will include the URL for the API Gateway endpoint,
1015
- * and a random string that can be used as a shared secret.
1016
- *
1017
- * @name hookshot.Passthrough
1018
- *
1019
- * @param {String} Prefix - This will be used to prefix the set of CloudFormation
1020
- * resources created by this shortcut.
1021
- * @param {String} PassthroughTo - The logical name of the Lambda function that you
1022
- * have written which will receive a request and generate a response to provide
1023
- * to the caller.
1024
- * @param {String} [LoggingLevel='OFF'] - One of `OFF`, `INFO`, or `ERROR`. Logs are delivered
1025
- * to a CloudWatch Log Group named `API-Gateway-Execution-Logs_{rest-api-id}/hookshot`.
1026
- * @param {Boolean} [DataTraceEnabled=false] - Set to `true` to enable full request/response
1027
- * logging in the API's logs.
1028
- * @param {Boolean} [MetricsEnabled=false] - Set to `true` to enable additional metrics in CloudWatch.
1029
- * @param {String} [AccessLogFormat] - A single line format of the access logs of
1030
- * data, as specified by selected `$context` variables. The format must include at
1031
- * least `$context.requestId`. [See AWS documentation for details](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-accesslogsetting.html#cfn-apigateway-stage-accesslogsetting-format).
1032
- * @param {String|Object} [WebhookSecret] - A secret string to be used to verify
1033
- * payload signatures that are delivered to the endpoint. This is optional. If
1034
- * not specified, a string will be generated for you. Implementation of
1035
- * signature verification is up to the caller.
1036
- *
1037
- * @example
1038
- * const cf = require('@mapbox/cloudfriend');
1039
- *
1040
- * const myTemplate = {
1041
- * ...
1042
- * Resources: {
1043
- * MyLambdaFunction: {
1044
- * Type: 'AWS::Lambda::Function',
1045
- * Properties: { ... }
1046
- * }
1047
- * }
1048
- * };
1049
- *
1050
- * const webhook = new cf.shortcuts.hookshot.Passthrough({
1051
- * Prefix: 'Webhook',
1052
- * PassthroughTo: 'MyLambdaFunction'
1053
- * });
1054
- *
1055
- * module.exports = cf.merge(myTemplate, webhook);
1056
- */
1057
- class Passthrough {
1058
- constructor(options) {
1059
- if (!options) throw new Error('Options required');
1060
- const {
1061
- Prefix,
1062
- PassthroughTo,
1063
- AccessLogFormat,
1064
- DataTraceEnabled = false,
1065
- MetricsEnabled = false,
1066
- WebhookSecret
1067
- } = options;
1068
- &nbsp;
1069
- let {
1070
- LoggingLevel = 'OFF'
1071
- } = options;
1072
- &nbsp;
1073
- const required = [Prefix, PassthroughTo];
1074
- if (required.some((variable) =&gt; !variable))
1075
- throw new Error('You must provide a Prefix, and PassthroughTo');
1076
- &nbsp;
1077
- if (!['OFF', 'INFO', 'ERROR'].includes(LoggingLevel))
1078
- throw new Error('LoggingLevel must be one of OFF, INFO, or ERROR');
1079
- &nbsp;
1080
- if (DataTraceEnabled)
1081
- LoggingLevel = LoggingLevel === 'OFF' ? 'ERROR' : LoggingLevel;
1082
- &nbsp;
1083
- this.Prefix = Prefix;
1084
- this.PassthroughTo = PassthroughTo;
1085
- this.WebhookSecret = options.WebhookSecret;
1086
- &nbsp;
1087
- const Resources = {
1088
- [`${Prefix}Api`]: {
1089
- Type: 'AWS::ApiGateway::RestApi',
1090
- Properties: {
1091
- Name: { 'Fn::Sub': '${AWS::StackName}-webhook' },
1092
- FailOnWarnings: true,
1093
- EndpointConfiguration: {
1094
- Types: ['REGIONAL']
1095
- }
1096
- }
1097
- },
1098
- &nbsp;
1099
- [`${Prefix}Stage`]: {
1100
- Type: 'AWS::ApiGateway::Stage',
1101
- Properties: {
1102
- DeploymentId: { Ref: `${Prefix}Deployment${random}` },
1103
- StageName: 'hookshot',
1104
- RestApiId: { Ref: `${Prefix}Api` },
1105
- MethodSettings: [
1106
- {
1107
- HttpMethod: '*',
1108
- ResourcePath: '/*',
1109
- ThrottlingBurstLimit: 20,
1110
- ThrottlingRateLimit: 5,
1111
- LoggingLevel,
1112
- DataTraceEnabled,
1113
- MetricsEnabled
1114
- }
1115
- ]
1116
- }
1117
- },
1118
- &nbsp;
1119
- [`${Prefix}Deployment${random}`]: {
1120
- Type: 'AWS::ApiGateway::Deployment',
1121
- DependsOn: `${Prefix}Method`,
1122
- Properties: {
1123
- RestApiId: { Ref: `${Prefix}Api` },
1124
- StageName: 'unused'
1125
- }
1126
- },
1127
- &nbsp;
1128
- [`${Prefix}Resource`]: {
1129
- Type: 'AWS::ApiGateway::Resource',
1130
- Properties: {
1131
- ParentId: { 'Fn::GetAtt': [`${Prefix}Api`, 'RootResourceId'] },
1132
- RestApiId: { Ref: `${Prefix}Api` },
1133
- PathPart: 'webhook'
1134
- }
1135
- },
1136
- &nbsp;
1137
- [`${Prefix}OptionsMethod`]: {
1138
- Type: 'AWS::ApiGateway::Method',
1139
- Properties: {
1140
- RestApiId: { Ref: `${Prefix}Api` },
1141
- ResourceId: { Ref: `${Prefix}Resource` },
1142
- ApiKeyRequired: false,
1143
- AuthorizationType: 'NONE',
1144
- HttpMethod: 'OPTIONS',
1145
- Integration: {
1146
- Type: 'AWS_PROXY',
1147
- IntegrationHttpMethod: 'POST',
1148
- Uri: { 'Fn::Sub': `arn:aws:apigateway:\${AWS::Region}:lambda:path/2015-03-31/functions/\${${Prefix}Function.Arn}/invocations` }
1149
- }
1150
- }
1151
- },
1152
- &nbsp;
1153
- [`${Prefix}Method`]: this.method(),
1154
- &nbsp;
1155
- [`${Prefix}Permission`]: {
1156
- Type: 'AWS::Lambda::Permission',
1157
- Properties: {
1158
- FunctionName: { Ref: `${Prefix}Function` },
1159
- Action: 'lambda:InvokeFunction',
1160
- Principal: 'apigateway.amazonaws.com',
1161
- SourceArn: { 'Fn::Sub': `arn:aws:execute-api:\${AWS::Region}:\${AWS::AccountId}:\${${Prefix}Api}/*` }
1162
- }
1163
- }
1164
- };
1165
- &nbsp;
1166
- if (!WebhookSecret) Resources[`${Prefix}Secret`] = {
1167
- Type: 'AWS::ApiGateway::ApiKey',
1168
- Properties: {
1169
- Enabled: false
1170
- }
1171
- };
1172
- &nbsp;
1173
- if (AccessLogFormat) {
1174
- Resources[`${Prefix}AccessLogs`] = {
1175
- Type: 'AWS::Logs::LogGroup',
1176
- Properties: {
1177
- LogGroupName: { 'Fn::Sub': `\${AWS::StackName}-${Prefix}-access-logs` },
1178
- RetentionInDays: 14
1179
- }
1180
- };
1181
- &nbsp;
1182
- Resources[`${Prefix}Stage`].Properties.AccessLogSetting = {
1183
- DestinationArn: { 'Fn::GetAtt': [`${Prefix}AccessLogs`, 'Arn'] },
1184
- Format: AccessLogFormat
1185
- };
1186
- }
1187
- &nbsp;
1188
- const lambda = new Lambda(
1189
- Object.assign({}, options, {
1190
- LogicalName: `${Prefix}Function`,
1191
- FunctionName: { 'Fn::Sub': `\${AWS::StackName}-${Prefix}` },
1192
- Code: { ZipFile: this.code() },
1193
- Description: { 'Fn::Sub': 'Passthrough function for ${AWS::StackName}' },
1194
- Handler: 'index.lambda',
1195
- Timeout: 30,
1196
- MemorySize: 128,
1197
- Statement: [
1198
- {
1199
- Effect: 'Allow',
1200
- Action: 'lambda:InvokeFunction',
1201
- Resource: { 'Fn::GetAtt': [PassthroughTo, 'Arn'] }
1202
- }
1203
- ]
1204
- })
1205
- );
1206
- &nbsp;
1207
- this.Resources = merge({ Resources }, lambda).Resources;
1208
- &nbsp;
1209
- this.Outputs = {
1210
- [`${Prefix}EndpointOutput`]: {
1211
- Description: 'The HTTPS endpoint used to send github webhooks',
1212
- Value: { 'Fn::Sub': `https://\${${Prefix}Api}.execute-api.\${AWS::Region}.amazonaws.com/hookshot/webhook` }
1213
- },
1214
- &nbsp;
1215
- [`${Prefix}SecretOutput`]: {
1216
- Description: 'A secret key to give Github to use when signing webhook requests',
1217
- Value: WebhookSecret ? WebhookSecret : { Ref: `${Prefix}Secret` }
1218
- }
1219
- };
1220
- }
1221
- &nbsp;
1222
- method() {
1223
- return {
1224
- Type: 'AWS::ApiGateway::Method',
1225
- Properties: {
1226
- RestApiId: { Ref: `${this.Prefix}Api` },
1227
- ResourceId: { Ref: `${this.Prefix}Resource` },
1228
- ApiKeyRequired: false,
1229
- AuthorizationType: 'NONE',
1230
- HttpMethod: 'POST',
1231
- Integration: {
1232
- Type: 'AWS_PROXY',
1233
- IntegrationHttpMethod: 'POST',
1234
- Uri: { 'Fn::Sub': `arn:aws:apigateway:\${AWS::Region}:lambda:path/2015-03-31/functions/\${${this.Prefix}Function.Arn}/invocations` }
1235
- }
1236
- }
1237
- };
1238
- }
1239
- &nbsp;
1240
- code() {
1241
- return {
1242
- 'Fn::Sub': redent(`
1243
- 'use strict';
1244
- &nbsp;
1245
- const AWS = require('aws-sdk');
1246
- const lambda = new AWS.Lambda();
1247
- &nbsp;
1248
- module.exports.lambda = (event, context, callback) =&gt; {
1249
- if (event.httpMethod === 'OPTIONS') {
1250
- const requestHeaders = event.headers['Access-Control-Request-Headers'] || event.headers['access-control-request-headers'];
1251
- const response = {
1252
- statusCode: 200,
1253
- body: '',
1254
- headers: {
1255
- 'Access-Control-Allow-Headers': requestHeaders,
1256
- 'Access-Control-Allow-Methods': 'POST, OPTIONS',
1257
- 'Access-Control-Allow-Origin': '*'
1258
- }
1259
- };
1260
- return callback(null, response);
1261
- }
1262
- &nbsp;
1263
- const lambdaParams = {
1264
- FunctionName: '\${${this.PassthroughTo}}',
1265
- Payload: JSON.stringify(event)
1266
- };
1267
- &nbsp;
1268
- lambda.invoke(lambdaParams).promise()
1269
- .then((response) =&gt; {
1270
- if (!response || !response.Payload)
1271
- return callback(new Error('Your Lambda function ${this.PassthroughTo} did not provide a payload'));
1272
- &nbsp;
1273
- var payload = JSON.parse(response.Payload);
1274
- payload.headers = payload.headers || {};
1275
- payload.headers['Access-Control-Allow-Origin'] = '*';
1276
- callback(null, payload);
1277
- })
1278
- .catch((err) =&gt; callback(err));
1279
- };
1280
- `).trim()
1281
- };
1282
- }
1283
- }
1284
- &nbsp;
1285
- /**
1286
- * The hookshot.Github class defines resources that set up a single API Gateway
1287
- * endpoint that is designed responds to POST requests sent from GitHub in
1288
- * response to various GitHub events. The hookshot system will use a shared
1289
- * secret to validate that the incoming payload did in fact originate from GitHub,
1290
- * before sending the event payload to your Lambda function for further
1291
- * processing. Any requests that did not come from GitHub or were not properly
1292
- * signed using your secret key are rejected, and will never make it to your
1293
- * Lambda function.
1294
- *
1295
- * @name hookshot.Github
1296
- *
1297
- * @property {Object} Resources - the CloudFormation resources created by this shortcut.
1298
- * @property {Object} Outputs - the CloudFormation outputs created by this
1299
- * shortcut. This includes the URL for the API Gateway endpoint, and a secret
1300
- * string. Use these two values to configure GitHub to send webhooks to your
1301
- * API Gateway endpoint.
1302
- *
1303
- * @param {String} Prefix this will be used to prefix the set of CloudFormation
1304
- * resources created by this shortcut.
1305
- * @param {String} PassthroughTo the logical name of the Lambda function that you
1306
- * have written which will receive a request and generate a response to provide
1307
- * to the caller.
1308
- * @param {String} LoggingLevel one of `OFF`, `INFO`, or `ERROR`. Logs are delivered
1309
- * to a CloudWatch LogGroup named `API-Gateway-Execution-Logs_{rest-api-id}/hookshot`
1310
- * @param {String|Object} [WebhookSecret] A secret string to be used to verify
1311
- * payload signatures that are delivered to the endpoint. This is optional. If
1312
- * not specified, a string will be generated for you. You should provide this
1313
- * value to GitHub, and signature verification will be performed before your
1314
- * Lambda function being invoked to respond to the event.
1315
- *
1316
- * @example
1317
- * const cf = require('@mapbox/cloudfriend');
1318
- *
1319
- * const myTemplate = {
1320
- * ...
1321
- * Resources: {
1322
- * MyLambdaFunction: {
1323
- * Type: 'AWS::Lambda::Function',
1324
- * Properties: { ... }
1325
- * }
1326
- * }
1327
- * };
1328
- *
1329
- * const webhook = new cf.shortcuts.hookshot.Github({
1330
- * Prefix: 'Webhook',
1331
- * PassthroughTo: 'MyLambdaFunction'
1332
- * });
1333
- *
1334
- * module.exports = cf.merge(myTemplate, webhook);
1335
- */
1336
- class Github extends Passthrough {
1337
- constructor(options = {}) {
1338
- super(options);
1339
- delete this.Resources[`${this.Prefix}OptionsMethod`];
1340
- }
1341
- &nbsp;
1342
- method() {
1343
- return {
1344
- Type: 'AWS::ApiGateway::Method',
1345
- Properties: {
1346
- RestApiId: { Ref: `${this.Prefix}Api` },
1347
- ResourceId: { Ref: `${this.Prefix}Resource` },
1348
- ApiKeyRequired: false,
1349
- AuthorizationType: 'NONE',
1350
- HttpMethod: 'POST',
1351
- Integration: {
1352
- Type: 'AWS',
1353
- IntegrationHttpMethod: 'POST',
1354
- IntegrationResponses: [
1355
- {
1356
- StatusCode: '200'
1357
- },
1358
- {
1359
- StatusCode: '500',
1360
- SelectionPattern: '^error.*'
1361
- },
1362
- {
1363
- StatusCode: '403',
1364
- SelectionPattern: '^invalid.*'
1365
- }
1366
- ],
1367
- Uri: { 'Fn::Sub': `arn:aws:apigateway:\${AWS::Region}:lambda:path/2015-03-31/functions/\${${this.Prefix}Function.Arn}/invocations` },
1368
- RequestTemplates: {
1369
- 'application/json': '{"signature":"$input.params(\'X-Hub-Signature\')","body":$input.json(\'$\')}'
1370
- }
1371
- },
1372
- MethodResponses: [
1373
- {
1374
- StatusCode: '200',
1375
- ResponseModels: {
1376
- 'application/json': 'Empty'
1377
- }
1378
- },
1379
- {
1380
- StatusCode: '500',
1381
- ResponseModels: {
1382
- 'application/json': 'Empty'
1383
- }
1384
- },
1385
- {
1386
- StatusCode: '403',
1387
- ResponseModels: {
1388
- 'application/json': 'Empty'
1389
- }
1390
- }
1391
- ]
1392
- }
1393
- };
1394
- }
1395
- &nbsp;
1396
- code() {
1397
- return {
1398
- 'Fn::Sub': [
1399
- redent(`
1400
- 'use strict';
1401
- &nbsp;
1402
- const crypto = require('crypto');
1403
- const AWS = require('aws-sdk');
1404
- const lambda = new AWS.Lambda();
1405
- const secret = '\${WebhookSecret}';
1406
- &nbsp;
1407
- module.exports.lambda = (event, context, callback) =&gt; {
1408
- const body = event.body;
1409
- const hash = 'sha1=' + crypto
1410
- .createHmac('sha1', secret)
1411
- .update(new Buffer(JSON.stringify(body)))
1412
- .digest('hex');
1413
- &nbsp;
1414
- if (event.signature !== hash)
1415
- return callback('invalid: signature does not match');
1416
- &nbsp;
1417
- if (body.zen) return callback(null, 'ignored ping request');
1418
- &nbsp;
1419
- const lambdaParams = {
1420
- FunctionName: '\${${this.PassthroughTo}}',
1421
- Payload: JSON.stringify(event.body),
1422
- InvocationType: 'Event'
1423
- };
1424
- &nbsp;
1425
- lambda.invoke(lambdaParams).promise()
1426
- .then(() =&gt; callback(null, 'success'))
1427
- .catch((err) =&gt; callback(err));
1428
- };
1429
- `).trim(),
1430
- {
1431
- WebhookSecret: this.WebhookSecret || { Ref: `${this.Prefix}Secret` }
1432
- }
1433
- ]
1434
- };
1435
- }
1436
- }
1437
- &nbsp;
1438
- module.exports = {
1439
- Passthrough,
1440
- Github
1441
- };
1442
- &nbsp;</pre></td></tr></table></pre>
1443
-
1444
- <div class='push'></div><!-- for sticky footer -->
1445
- </div><!-- /wrapper -->
1446
- <div class='footer quiet pad2 space-top1 center small'>
1447
- Code coverage generated by
1448
- <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
1449
- at Fri Oct 07 2022 14:02:07 GMT-0700 (Pacific Daylight Time)
1450
- </div>
1451
- </div>
1452
- <script src="../../../prettify.js"></script>
1453
- <script>
1454
- window.onload = function () {
1455
- prettyPrint();
1456
- };
1457
- </script>
1458
- <script src="../../../sorter.js"></script>
1459
- <script src="../../../block-navigation.js"></script>
1460
- </body>
1461
- </html>
1462
-