@nlabs/reaktor 0.8.1 → 0.9.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/.eslintrc +10 -0
- package/.prettierrc.js +4 -0
- package/README.md +1 -1
- package/coverage/actions/groups.ts.html +1039 -0
- package/coverage/actions/images.ts.html +2500 -0
- package/coverage/actions/index.html +131 -0
- package/coverage/actions/tags.ts.html +1000 -0
- package/coverage/adapters/arangoAdapter.ts.html +151 -0
- package/coverage/adapters/index.html +146 -0
- package/coverage/adapters/reaktorAdapter.ts.html +127 -0
- package/coverage/adapters/tagAdapter.ts.html +160 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/clover.xml +6 -0
- package/coverage/coverage-final.json +1 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +176 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +101 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +196 -0
- package/coverage/lcov.info +0 -0
- package/coverage/mocks/file.ts.html +118 -0
- package/coverage/mocks/group.ts.html +145 -0
- package/coverage/mocks/image.ts.html +136 -0
- package/coverage/mocks/index.html +146 -0
- package/coverage/mocks/post.ts.html +169 -0
- package/coverage/mocks/tag.ts.html +121 -0
- package/coverage/mocks/user.ts.html +268 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +196 -0
- package/coverage/types/error.ts.html +145 -0
- package/coverage/types/index.html +116 -0
- package/coverage/utils/adapterUtils.ts.html +151 -0
- package/coverage/utils/analyticsUtils.ts.html +292 -0
- package/coverage/utils/arangodbUtils.ts.html +463 -0
- package/coverage/utils/index.html +146 -0
- package/jest.setup.js +0 -0
- package/jpg:- +0 -0
- package/lib/actions/apps.d.ts +25 -0
- package/lib/actions/apps.js +252 -0
- package/lib/actions/conversations.d.ts +12 -12
- package/lib/actions/conversations.js +131 -126
- package/lib/actions/dynamodb.d.ts +8 -8
- package/lib/actions/dynamodb.js +35 -32
- package/lib/actions/email.d.ts +2 -4
- package/lib/actions/email.js +23 -53
- package/lib/actions/files.d.ts +15 -12
- package/lib/actions/files.js +188 -202
- package/lib/actions/groups.d.ts +2 -2
- package/lib/actions/groups.js +38 -36
- package/lib/actions/images.d.ts +15 -11
- package/lib/actions/images.js +236 -229
- package/lib/actions/index.d.ts +1 -0
- package/lib/actions/index.js +3 -1
- package/lib/actions/ios.js +11 -10
- package/lib/actions/locations.d.ts +2 -0
- package/lib/actions/locations.js +29 -37
- package/lib/actions/messages.d.ts +2 -2
- package/lib/actions/messages.js +10 -10
- package/lib/actions/notifications.d.ts +2 -2
- package/lib/actions/notifications.js +1 -1
- package/lib/actions/payments.d.ts +2 -2
- package/lib/actions/payments.js +27 -26
- package/lib/actions/posts.d.ts +7 -9
- package/lib/actions/posts.js +176 -156
- package/lib/actions/reactions.d.ts +5 -5
- package/lib/actions/reactions.js +30 -28
- package/lib/actions/s3.d.ts +7 -7
- package/lib/actions/s3.js +37 -32
- package/lib/actions/search.d.ts +3 -3
- package/lib/actions/search.js +11 -9
- package/lib/actions/sms.d.ts +2 -2
- package/lib/actions/sms.js +58 -34
- package/lib/actions/statistics.d.ts +2 -1
- package/lib/actions/statistics.js +21 -18
- package/lib/actions/subscription.d.ts +2 -2
- package/lib/actions/subscription.js +24 -21
- package/lib/actions/tags.d.ts +21 -23
- package/lib/actions/tags.js +129 -198
- package/lib/actions/users.d.ts +23 -20
- package/lib/actions/users.js +188 -194
- package/lib/actions/websockets.d.ts +13 -0
- package/lib/actions/websockets.js +60 -34
- package/lib/adapters/arangoAdapter.d.ts +2 -0
- package/lib/adapters/arangoAdapter.js +46 -0
- package/lib/adapters/fileAdapter.d.ts +3 -0
- package/lib/adapters/fileAdapter.js +76 -0
- package/lib/adapters/postAdapter.d.ts +2 -0
- package/lib/adapters/postAdapter.js +70 -0
- package/lib/adapters/reaktorAdapter.d.ts +6 -0
- package/lib/adapters/reaktorAdapter.js +44 -0
- package/lib/adapters/tagAdapter.d.ts +2 -0
- package/lib/adapters/tagAdapter.js +50 -0
- package/lib/adapters/userAdapter.d.ts +2 -0
- package/lib/adapters/userAdapter.js +110 -0
- package/lib/config.js +14 -15
- package/lib/lambdas/actions/websockets.js +7 -7
- package/lib/lambdas/authorizer.js +1 -1
- package/lib/lambdas/connection.js +5 -4
- package/lib/lambdas/utils/websocket.js +7 -6
- package/lib/mocks/conversation.d.ts +8 -0
- package/lib/mocks/conversation.js +35 -0
- package/lib/mocks/file.d.ts +11 -0
- package/lib/mocks/file.js +38 -0
- package/lib/mocks/group.d.ts +17 -0
- package/lib/mocks/group.js +47 -0
- package/lib/mocks/image.d.ts +3 -0
- package/lib/mocks/image.js +43 -0
- package/lib/mocks/nlabs.png +0 -0
- package/lib/mocks/post.d.ts +38 -0
- package/lib/mocks/post.js +55 -0
- package/lib/mocks/tag.d.ts +2 -0
- package/lib/mocks/tag.js +37 -0
- package/lib/mocks/user.d.ts +4 -0
- package/lib/mocks/user.js +88 -0
- package/lib/types/apps.d.ts +19 -17
- package/lib/types/apps.js +17 -1
- package/lib/types/arangodb.d.ts +19 -6
- package/lib/types/arangodb.js +1 -1
- package/lib/types/auth.d.ts +4 -4
- package/lib/types/auth.js +1 -1
- package/lib/types/connections.d.ts +2 -3
- package/lib/types/connections.js +1 -1
- package/lib/types/conversations.d.ts +21 -8
- package/lib/types/conversations.js +1 -1
- package/lib/types/email.d.ts +4 -3
- package/lib/types/email.js +1 -1
- package/lib/types/error.d.ts +20 -0
- package/lib/types/error.js +44 -0
- package/lib/types/files.d.ts +10 -10
- package/lib/types/files.js +1 -1
- package/lib/types/google.d.ts +29 -27
- package/lib/types/google.js +1 -1
- package/lib/types/groups.d.ts +6 -7
- package/lib/types/groups.js +1 -1
- package/lib/types/images.d.ts +26 -17
- package/lib/types/images.js +1 -1
- package/lib/types/locations.d.ts +4 -4
- package/lib/types/locations.js +1 -1
- package/lib/types/messages.d.ts +3 -14
- package/lib/types/messages.js +1 -1
- package/lib/types/notifications.d.ts +9 -11
- package/lib/types/notifications.js +1 -1
- package/lib/types/payments.d.ts +13 -16
- package/lib/types/payments.js +1 -1
- package/lib/types/posts.d.ts +7 -23
- package/lib/types/posts.js +1 -1
- package/lib/types/statistics.d.ts +2 -2
- package/lib/types/statistics.js +1 -1
- package/lib/types/tags.d.ts +7 -12
- package/lib/types/tags.js +1 -1
- package/lib/types/users.d.ts +10 -14
- package/lib/types/users.js +1 -1
- package/lib/types/websocket.d.ts +2 -3
- package/lib/types/websocket.js +1 -1
- package/lib/utils/adapterUtils.d.ts +1 -0
- package/lib/utils/adapterUtils.js +45 -0
- package/lib/utils/analyticsUtils.d.ts +21 -0
- package/lib/utils/analyticsUtils.js +72 -0
- package/lib/utils/arangodbUtils.d.ts +65 -0
- package/lib/utils/arangodbUtils.js +144 -0
- package/lib/utils/auth.d.ts +18 -3
- package/lib/utils/auth.js +13 -30
- package/lib/utils/index.d.ts +3 -4
- package/lib/utils/index.js +7 -9
- package/lib/utils/session.d.ts +7 -9
- package/lib/utils/session.js +11 -2
- package/package.json +12 -5
- package/lib/utils/analytics.d.ts +0 -14
- package/lib/utils/analytics.js +0 -88
- package/lib/utils/arangodb.d.ts +0 -9
- package/lib/utils/arangodb.js +0 -118
- package/lib/utils/graphql.d.ts +0 -1
- package/lib/utils/graphql.js +0 -46
- package/lib/utils/objects.d.ts +0 -3
- package/lib/utils/objects.js +0 -59
|
@@ -0,0 +1,2500 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for actions/images.ts</title>
|
|
7
|
+
<meta charset="utf-8" />
|
|
8
|
+
<link rel="stylesheet" href="../prettify.css" />
|
|
9
|
+
<link rel="stylesheet" href="../base.css" />
|
|
10
|
+
<link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
+
<style type='text/css'>
|
|
13
|
+
.coverage-summary .sorter {
|
|
14
|
+
background-image: url(../sort-arrow-sprite.png);
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<div class='wrapper'>
|
|
21
|
+
<div class='pad1'>
|
|
22
|
+
<h1><a href="../index.html">All files</a> / <a href="index.html">actions</a> images.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">86.83% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>277/319</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">63.88% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>69/108</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">89.55% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>60/67</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">86.14% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>255/296</span>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
<p class="quiet">
|
|
55
|
+
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
+
</p>
|
|
57
|
+
<template id="filterTemplate">
|
|
58
|
+
<div class="quiet">
|
|
59
|
+
Filter:
|
|
60
|
+
<input type="search" id="fileSearch">
|
|
61
|
+
</div>
|
|
62
|
+
</template>
|
|
63
|
+
</div>
|
|
64
|
+
<div class='status-line high'></div>
|
|
65
|
+
<pre><table class="coverage">
|
|
66
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
+
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
+
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
+
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
+
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
+
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
+
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
+
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
+
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
+
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
+
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
+
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
+
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
+
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
+
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
+
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
+
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
+
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
+
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
+
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
+
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
+
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
+
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
+
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
+
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
+
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
+
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
+
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
+
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
+
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
+
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
+
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
+
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
+
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
+
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
+
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
+
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
+
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
+
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
+
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
+
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
+
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
+
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
+
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
+
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
+
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
+
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
+
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
+
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
+
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
+
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
+
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
+
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
+
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
+
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
+
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
+
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
+
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
+
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
+
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
+
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
+
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
+
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
+
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
+
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
+
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
+
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
+
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
+
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
+
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
+
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
+
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
+
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
+
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
+
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
+
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
+
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
+
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
+
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
+
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
+
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
+
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
+
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
+
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
+
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
+
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
+
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
+
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
+
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
+
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
+
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
+
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
+
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
+
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
+
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
+
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
+
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
+
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
+
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
+
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
+
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
+
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
+
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
+
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
+
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
+
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
+
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
+
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
+
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
+
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
+
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
+
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
+
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
+
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
+
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
+
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
+
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
+
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
+
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
+
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
+
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
+
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
+
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
+
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
+
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
+
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
+
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
+
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
+
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
+
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
+
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
+
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
+
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
+
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
+
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
+
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
+
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
+
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
+
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
+
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
+
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
+
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
+
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
+
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
+
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
+
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
+
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
+
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
+
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
+
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
+
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
+
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
+
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
+
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
+
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
+
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
+
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
+
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
+
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
+
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
+
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
+
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
+
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
|
+
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
+
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
+
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
+
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
+
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
+
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
+
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
+
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
+
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
+
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
+
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
+
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
+
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
+
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
+
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
+
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
+
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
+
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
+
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
+
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
+
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
+
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
+
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
+
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
+
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
+
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
+
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
+
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
+
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
+
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
+
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
+
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
+
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
+
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
+
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
|
+
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
|
+
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
+
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
+
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
+
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
+
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
+
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
+
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
+
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
+
<a name='L266'></a><a href='#L266'>266</a>
|
|
332
|
+
<a name='L267'></a><a href='#L267'>267</a>
|
|
333
|
+
<a name='L268'></a><a href='#L268'>268</a>
|
|
334
|
+
<a name='L269'></a><a href='#L269'>269</a>
|
|
335
|
+
<a name='L270'></a><a href='#L270'>270</a>
|
|
336
|
+
<a name='L271'></a><a href='#L271'>271</a>
|
|
337
|
+
<a name='L272'></a><a href='#L272'>272</a>
|
|
338
|
+
<a name='L273'></a><a href='#L273'>273</a>
|
|
339
|
+
<a name='L274'></a><a href='#L274'>274</a>
|
|
340
|
+
<a name='L275'></a><a href='#L275'>275</a>
|
|
341
|
+
<a name='L276'></a><a href='#L276'>276</a>
|
|
342
|
+
<a name='L277'></a><a href='#L277'>277</a>
|
|
343
|
+
<a name='L278'></a><a href='#L278'>278</a>
|
|
344
|
+
<a name='L279'></a><a href='#L279'>279</a>
|
|
345
|
+
<a name='L280'></a><a href='#L280'>280</a>
|
|
346
|
+
<a name='L281'></a><a href='#L281'>281</a>
|
|
347
|
+
<a name='L282'></a><a href='#L282'>282</a>
|
|
348
|
+
<a name='L283'></a><a href='#L283'>283</a>
|
|
349
|
+
<a name='L284'></a><a href='#L284'>284</a>
|
|
350
|
+
<a name='L285'></a><a href='#L285'>285</a>
|
|
351
|
+
<a name='L286'></a><a href='#L286'>286</a>
|
|
352
|
+
<a name='L287'></a><a href='#L287'>287</a>
|
|
353
|
+
<a name='L288'></a><a href='#L288'>288</a>
|
|
354
|
+
<a name='L289'></a><a href='#L289'>289</a>
|
|
355
|
+
<a name='L290'></a><a href='#L290'>290</a>
|
|
356
|
+
<a name='L291'></a><a href='#L291'>291</a>
|
|
357
|
+
<a name='L292'></a><a href='#L292'>292</a>
|
|
358
|
+
<a name='L293'></a><a href='#L293'>293</a>
|
|
359
|
+
<a name='L294'></a><a href='#L294'>294</a>
|
|
360
|
+
<a name='L295'></a><a href='#L295'>295</a>
|
|
361
|
+
<a name='L296'></a><a href='#L296'>296</a>
|
|
362
|
+
<a name='L297'></a><a href='#L297'>297</a>
|
|
363
|
+
<a name='L298'></a><a href='#L298'>298</a>
|
|
364
|
+
<a name='L299'></a><a href='#L299'>299</a>
|
|
365
|
+
<a name='L300'></a><a href='#L300'>300</a>
|
|
366
|
+
<a name='L301'></a><a href='#L301'>301</a>
|
|
367
|
+
<a name='L302'></a><a href='#L302'>302</a>
|
|
368
|
+
<a name='L303'></a><a href='#L303'>303</a>
|
|
369
|
+
<a name='L304'></a><a href='#L304'>304</a>
|
|
370
|
+
<a name='L305'></a><a href='#L305'>305</a>
|
|
371
|
+
<a name='L306'></a><a href='#L306'>306</a>
|
|
372
|
+
<a name='L307'></a><a href='#L307'>307</a>
|
|
373
|
+
<a name='L308'></a><a href='#L308'>308</a>
|
|
374
|
+
<a name='L309'></a><a href='#L309'>309</a>
|
|
375
|
+
<a name='L310'></a><a href='#L310'>310</a>
|
|
376
|
+
<a name='L311'></a><a href='#L311'>311</a>
|
|
377
|
+
<a name='L312'></a><a href='#L312'>312</a>
|
|
378
|
+
<a name='L313'></a><a href='#L313'>313</a>
|
|
379
|
+
<a name='L314'></a><a href='#L314'>314</a>
|
|
380
|
+
<a name='L315'></a><a href='#L315'>315</a>
|
|
381
|
+
<a name='L316'></a><a href='#L316'>316</a>
|
|
382
|
+
<a name='L317'></a><a href='#L317'>317</a>
|
|
383
|
+
<a name='L318'></a><a href='#L318'>318</a>
|
|
384
|
+
<a name='L319'></a><a href='#L319'>319</a>
|
|
385
|
+
<a name='L320'></a><a href='#L320'>320</a>
|
|
386
|
+
<a name='L321'></a><a href='#L321'>321</a>
|
|
387
|
+
<a name='L322'></a><a href='#L322'>322</a>
|
|
388
|
+
<a name='L323'></a><a href='#L323'>323</a>
|
|
389
|
+
<a name='L324'></a><a href='#L324'>324</a>
|
|
390
|
+
<a name='L325'></a><a href='#L325'>325</a>
|
|
391
|
+
<a name='L326'></a><a href='#L326'>326</a>
|
|
392
|
+
<a name='L327'></a><a href='#L327'>327</a>
|
|
393
|
+
<a name='L328'></a><a href='#L328'>328</a>
|
|
394
|
+
<a name='L329'></a><a href='#L329'>329</a>
|
|
395
|
+
<a name='L330'></a><a href='#L330'>330</a>
|
|
396
|
+
<a name='L331'></a><a href='#L331'>331</a>
|
|
397
|
+
<a name='L332'></a><a href='#L332'>332</a>
|
|
398
|
+
<a name='L333'></a><a href='#L333'>333</a>
|
|
399
|
+
<a name='L334'></a><a href='#L334'>334</a>
|
|
400
|
+
<a name='L335'></a><a href='#L335'>335</a>
|
|
401
|
+
<a name='L336'></a><a href='#L336'>336</a>
|
|
402
|
+
<a name='L337'></a><a href='#L337'>337</a>
|
|
403
|
+
<a name='L338'></a><a href='#L338'>338</a>
|
|
404
|
+
<a name='L339'></a><a href='#L339'>339</a>
|
|
405
|
+
<a name='L340'></a><a href='#L340'>340</a>
|
|
406
|
+
<a name='L341'></a><a href='#L341'>341</a>
|
|
407
|
+
<a name='L342'></a><a href='#L342'>342</a>
|
|
408
|
+
<a name='L343'></a><a href='#L343'>343</a>
|
|
409
|
+
<a name='L344'></a><a href='#L344'>344</a>
|
|
410
|
+
<a name='L345'></a><a href='#L345'>345</a>
|
|
411
|
+
<a name='L346'></a><a href='#L346'>346</a>
|
|
412
|
+
<a name='L347'></a><a href='#L347'>347</a>
|
|
413
|
+
<a name='L348'></a><a href='#L348'>348</a>
|
|
414
|
+
<a name='L349'></a><a href='#L349'>349</a>
|
|
415
|
+
<a name='L350'></a><a href='#L350'>350</a>
|
|
416
|
+
<a name='L351'></a><a href='#L351'>351</a>
|
|
417
|
+
<a name='L352'></a><a href='#L352'>352</a>
|
|
418
|
+
<a name='L353'></a><a href='#L353'>353</a>
|
|
419
|
+
<a name='L354'></a><a href='#L354'>354</a>
|
|
420
|
+
<a name='L355'></a><a href='#L355'>355</a>
|
|
421
|
+
<a name='L356'></a><a href='#L356'>356</a>
|
|
422
|
+
<a name='L357'></a><a href='#L357'>357</a>
|
|
423
|
+
<a name='L358'></a><a href='#L358'>358</a>
|
|
424
|
+
<a name='L359'></a><a href='#L359'>359</a>
|
|
425
|
+
<a name='L360'></a><a href='#L360'>360</a>
|
|
426
|
+
<a name='L361'></a><a href='#L361'>361</a>
|
|
427
|
+
<a name='L362'></a><a href='#L362'>362</a>
|
|
428
|
+
<a name='L363'></a><a href='#L363'>363</a>
|
|
429
|
+
<a name='L364'></a><a href='#L364'>364</a>
|
|
430
|
+
<a name='L365'></a><a href='#L365'>365</a>
|
|
431
|
+
<a name='L366'></a><a href='#L366'>366</a>
|
|
432
|
+
<a name='L367'></a><a href='#L367'>367</a>
|
|
433
|
+
<a name='L368'></a><a href='#L368'>368</a>
|
|
434
|
+
<a name='L369'></a><a href='#L369'>369</a>
|
|
435
|
+
<a name='L370'></a><a href='#L370'>370</a>
|
|
436
|
+
<a name='L371'></a><a href='#L371'>371</a>
|
|
437
|
+
<a name='L372'></a><a href='#L372'>372</a>
|
|
438
|
+
<a name='L373'></a><a href='#L373'>373</a>
|
|
439
|
+
<a name='L374'></a><a href='#L374'>374</a>
|
|
440
|
+
<a name='L375'></a><a href='#L375'>375</a>
|
|
441
|
+
<a name='L376'></a><a href='#L376'>376</a>
|
|
442
|
+
<a name='L377'></a><a href='#L377'>377</a>
|
|
443
|
+
<a name='L378'></a><a href='#L378'>378</a>
|
|
444
|
+
<a name='L379'></a><a href='#L379'>379</a>
|
|
445
|
+
<a name='L380'></a><a href='#L380'>380</a>
|
|
446
|
+
<a name='L381'></a><a href='#L381'>381</a>
|
|
447
|
+
<a name='L382'></a><a href='#L382'>382</a>
|
|
448
|
+
<a name='L383'></a><a href='#L383'>383</a>
|
|
449
|
+
<a name='L384'></a><a href='#L384'>384</a>
|
|
450
|
+
<a name='L385'></a><a href='#L385'>385</a>
|
|
451
|
+
<a name='L386'></a><a href='#L386'>386</a>
|
|
452
|
+
<a name='L387'></a><a href='#L387'>387</a>
|
|
453
|
+
<a name='L388'></a><a href='#L388'>388</a>
|
|
454
|
+
<a name='L389'></a><a href='#L389'>389</a>
|
|
455
|
+
<a name='L390'></a><a href='#L390'>390</a>
|
|
456
|
+
<a name='L391'></a><a href='#L391'>391</a>
|
|
457
|
+
<a name='L392'></a><a href='#L392'>392</a>
|
|
458
|
+
<a name='L393'></a><a href='#L393'>393</a>
|
|
459
|
+
<a name='L394'></a><a href='#L394'>394</a>
|
|
460
|
+
<a name='L395'></a><a href='#L395'>395</a>
|
|
461
|
+
<a name='L396'></a><a href='#L396'>396</a>
|
|
462
|
+
<a name='L397'></a><a href='#L397'>397</a>
|
|
463
|
+
<a name='L398'></a><a href='#L398'>398</a>
|
|
464
|
+
<a name='L399'></a><a href='#L399'>399</a>
|
|
465
|
+
<a name='L400'></a><a href='#L400'>400</a>
|
|
466
|
+
<a name='L401'></a><a href='#L401'>401</a>
|
|
467
|
+
<a name='L402'></a><a href='#L402'>402</a>
|
|
468
|
+
<a name='L403'></a><a href='#L403'>403</a>
|
|
469
|
+
<a name='L404'></a><a href='#L404'>404</a>
|
|
470
|
+
<a name='L405'></a><a href='#L405'>405</a>
|
|
471
|
+
<a name='L406'></a><a href='#L406'>406</a>
|
|
472
|
+
<a name='L407'></a><a href='#L407'>407</a>
|
|
473
|
+
<a name='L408'></a><a href='#L408'>408</a>
|
|
474
|
+
<a name='L409'></a><a href='#L409'>409</a>
|
|
475
|
+
<a name='L410'></a><a href='#L410'>410</a>
|
|
476
|
+
<a name='L411'></a><a href='#L411'>411</a>
|
|
477
|
+
<a name='L412'></a><a href='#L412'>412</a>
|
|
478
|
+
<a name='L413'></a><a href='#L413'>413</a>
|
|
479
|
+
<a name='L414'></a><a href='#L414'>414</a>
|
|
480
|
+
<a name='L415'></a><a href='#L415'>415</a>
|
|
481
|
+
<a name='L416'></a><a href='#L416'>416</a>
|
|
482
|
+
<a name='L417'></a><a href='#L417'>417</a>
|
|
483
|
+
<a name='L418'></a><a href='#L418'>418</a>
|
|
484
|
+
<a name='L419'></a><a href='#L419'>419</a>
|
|
485
|
+
<a name='L420'></a><a href='#L420'>420</a>
|
|
486
|
+
<a name='L421'></a><a href='#L421'>421</a>
|
|
487
|
+
<a name='L422'></a><a href='#L422'>422</a>
|
|
488
|
+
<a name='L423'></a><a href='#L423'>423</a>
|
|
489
|
+
<a name='L424'></a><a href='#L424'>424</a>
|
|
490
|
+
<a name='L425'></a><a href='#L425'>425</a>
|
|
491
|
+
<a name='L426'></a><a href='#L426'>426</a>
|
|
492
|
+
<a name='L427'></a><a href='#L427'>427</a>
|
|
493
|
+
<a name='L428'></a><a href='#L428'>428</a>
|
|
494
|
+
<a name='L429'></a><a href='#L429'>429</a>
|
|
495
|
+
<a name='L430'></a><a href='#L430'>430</a>
|
|
496
|
+
<a name='L431'></a><a href='#L431'>431</a>
|
|
497
|
+
<a name='L432'></a><a href='#L432'>432</a>
|
|
498
|
+
<a name='L433'></a><a href='#L433'>433</a>
|
|
499
|
+
<a name='L434'></a><a href='#L434'>434</a>
|
|
500
|
+
<a name='L435'></a><a href='#L435'>435</a>
|
|
501
|
+
<a name='L436'></a><a href='#L436'>436</a>
|
|
502
|
+
<a name='L437'></a><a href='#L437'>437</a>
|
|
503
|
+
<a name='L438'></a><a href='#L438'>438</a>
|
|
504
|
+
<a name='L439'></a><a href='#L439'>439</a>
|
|
505
|
+
<a name='L440'></a><a href='#L440'>440</a>
|
|
506
|
+
<a name='L441'></a><a href='#L441'>441</a>
|
|
507
|
+
<a name='L442'></a><a href='#L442'>442</a>
|
|
508
|
+
<a name='L443'></a><a href='#L443'>443</a>
|
|
509
|
+
<a name='L444'></a><a href='#L444'>444</a>
|
|
510
|
+
<a name='L445'></a><a href='#L445'>445</a>
|
|
511
|
+
<a name='L446'></a><a href='#L446'>446</a>
|
|
512
|
+
<a name='L447'></a><a href='#L447'>447</a>
|
|
513
|
+
<a name='L448'></a><a href='#L448'>448</a>
|
|
514
|
+
<a name='L449'></a><a href='#L449'>449</a>
|
|
515
|
+
<a name='L450'></a><a href='#L450'>450</a>
|
|
516
|
+
<a name='L451'></a><a href='#L451'>451</a>
|
|
517
|
+
<a name='L452'></a><a href='#L452'>452</a>
|
|
518
|
+
<a name='L453'></a><a href='#L453'>453</a>
|
|
519
|
+
<a name='L454'></a><a href='#L454'>454</a>
|
|
520
|
+
<a name='L455'></a><a href='#L455'>455</a>
|
|
521
|
+
<a name='L456'></a><a href='#L456'>456</a>
|
|
522
|
+
<a name='L457'></a><a href='#L457'>457</a>
|
|
523
|
+
<a name='L458'></a><a href='#L458'>458</a>
|
|
524
|
+
<a name='L459'></a><a href='#L459'>459</a>
|
|
525
|
+
<a name='L460'></a><a href='#L460'>460</a>
|
|
526
|
+
<a name='L461'></a><a href='#L461'>461</a>
|
|
527
|
+
<a name='L462'></a><a href='#L462'>462</a>
|
|
528
|
+
<a name='L463'></a><a href='#L463'>463</a>
|
|
529
|
+
<a name='L464'></a><a href='#L464'>464</a>
|
|
530
|
+
<a name='L465'></a><a href='#L465'>465</a>
|
|
531
|
+
<a name='L466'></a><a href='#L466'>466</a>
|
|
532
|
+
<a name='L467'></a><a href='#L467'>467</a>
|
|
533
|
+
<a name='L468'></a><a href='#L468'>468</a>
|
|
534
|
+
<a name='L469'></a><a href='#L469'>469</a>
|
|
535
|
+
<a name='L470'></a><a href='#L470'>470</a>
|
|
536
|
+
<a name='L471'></a><a href='#L471'>471</a>
|
|
537
|
+
<a name='L472'></a><a href='#L472'>472</a>
|
|
538
|
+
<a name='L473'></a><a href='#L473'>473</a>
|
|
539
|
+
<a name='L474'></a><a href='#L474'>474</a>
|
|
540
|
+
<a name='L475'></a><a href='#L475'>475</a>
|
|
541
|
+
<a name='L476'></a><a href='#L476'>476</a>
|
|
542
|
+
<a name='L477'></a><a href='#L477'>477</a>
|
|
543
|
+
<a name='L478'></a><a href='#L478'>478</a>
|
|
544
|
+
<a name='L479'></a><a href='#L479'>479</a>
|
|
545
|
+
<a name='L480'></a><a href='#L480'>480</a>
|
|
546
|
+
<a name='L481'></a><a href='#L481'>481</a>
|
|
547
|
+
<a name='L482'></a><a href='#L482'>482</a>
|
|
548
|
+
<a name='L483'></a><a href='#L483'>483</a>
|
|
549
|
+
<a name='L484'></a><a href='#L484'>484</a>
|
|
550
|
+
<a name='L485'></a><a href='#L485'>485</a>
|
|
551
|
+
<a name='L486'></a><a href='#L486'>486</a>
|
|
552
|
+
<a name='L487'></a><a href='#L487'>487</a>
|
|
553
|
+
<a name='L488'></a><a href='#L488'>488</a>
|
|
554
|
+
<a name='L489'></a><a href='#L489'>489</a>
|
|
555
|
+
<a name='L490'></a><a href='#L490'>490</a>
|
|
556
|
+
<a name='L491'></a><a href='#L491'>491</a>
|
|
557
|
+
<a name='L492'></a><a href='#L492'>492</a>
|
|
558
|
+
<a name='L493'></a><a href='#L493'>493</a>
|
|
559
|
+
<a name='L494'></a><a href='#L494'>494</a>
|
|
560
|
+
<a name='L495'></a><a href='#L495'>495</a>
|
|
561
|
+
<a name='L496'></a><a href='#L496'>496</a>
|
|
562
|
+
<a name='L497'></a><a href='#L497'>497</a>
|
|
563
|
+
<a name='L498'></a><a href='#L498'>498</a>
|
|
564
|
+
<a name='L499'></a><a href='#L499'>499</a>
|
|
565
|
+
<a name='L500'></a><a href='#L500'>500</a>
|
|
566
|
+
<a name='L501'></a><a href='#L501'>501</a>
|
|
567
|
+
<a name='L502'></a><a href='#L502'>502</a>
|
|
568
|
+
<a name='L503'></a><a href='#L503'>503</a>
|
|
569
|
+
<a name='L504'></a><a href='#L504'>504</a>
|
|
570
|
+
<a name='L505'></a><a href='#L505'>505</a>
|
|
571
|
+
<a name='L506'></a><a href='#L506'>506</a>
|
|
572
|
+
<a name='L507'></a><a href='#L507'>507</a>
|
|
573
|
+
<a name='L508'></a><a href='#L508'>508</a>
|
|
574
|
+
<a name='L509'></a><a href='#L509'>509</a>
|
|
575
|
+
<a name='L510'></a><a href='#L510'>510</a>
|
|
576
|
+
<a name='L511'></a><a href='#L511'>511</a>
|
|
577
|
+
<a name='L512'></a><a href='#L512'>512</a>
|
|
578
|
+
<a name='L513'></a><a href='#L513'>513</a>
|
|
579
|
+
<a name='L514'></a><a href='#L514'>514</a>
|
|
580
|
+
<a name='L515'></a><a href='#L515'>515</a>
|
|
581
|
+
<a name='L516'></a><a href='#L516'>516</a>
|
|
582
|
+
<a name='L517'></a><a href='#L517'>517</a>
|
|
583
|
+
<a name='L518'></a><a href='#L518'>518</a>
|
|
584
|
+
<a name='L519'></a><a href='#L519'>519</a>
|
|
585
|
+
<a name='L520'></a><a href='#L520'>520</a>
|
|
586
|
+
<a name='L521'></a><a href='#L521'>521</a>
|
|
587
|
+
<a name='L522'></a><a href='#L522'>522</a>
|
|
588
|
+
<a name='L523'></a><a href='#L523'>523</a>
|
|
589
|
+
<a name='L524'></a><a href='#L524'>524</a>
|
|
590
|
+
<a name='L525'></a><a href='#L525'>525</a>
|
|
591
|
+
<a name='L526'></a><a href='#L526'>526</a>
|
|
592
|
+
<a name='L527'></a><a href='#L527'>527</a>
|
|
593
|
+
<a name='L528'></a><a href='#L528'>528</a>
|
|
594
|
+
<a name='L529'></a><a href='#L529'>529</a>
|
|
595
|
+
<a name='L530'></a><a href='#L530'>530</a>
|
|
596
|
+
<a name='L531'></a><a href='#L531'>531</a>
|
|
597
|
+
<a name='L532'></a><a href='#L532'>532</a>
|
|
598
|
+
<a name='L533'></a><a href='#L533'>533</a>
|
|
599
|
+
<a name='L534'></a><a href='#L534'>534</a>
|
|
600
|
+
<a name='L535'></a><a href='#L535'>535</a>
|
|
601
|
+
<a name='L536'></a><a href='#L536'>536</a>
|
|
602
|
+
<a name='L537'></a><a href='#L537'>537</a>
|
|
603
|
+
<a name='L538'></a><a href='#L538'>538</a>
|
|
604
|
+
<a name='L539'></a><a href='#L539'>539</a>
|
|
605
|
+
<a name='L540'></a><a href='#L540'>540</a>
|
|
606
|
+
<a name='L541'></a><a href='#L541'>541</a>
|
|
607
|
+
<a name='L542'></a><a href='#L542'>542</a>
|
|
608
|
+
<a name='L543'></a><a href='#L543'>543</a>
|
|
609
|
+
<a name='L544'></a><a href='#L544'>544</a>
|
|
610
|
+
<a name='L545'></a><a href='#L545'>545</a>
|
|
611
|
+
<a name='L546'></a><a href='#L546'>546</a>
|
|
612
|
+
<a name='L547'></a><a href='#L547'>547</a>
|
|
613
|
+
<a name='L548'></a><a href='#L548'>548</a>
|
|
614
|
+
<a name='L549'></a><a href='#L549'>549</a>
|
|
615
|
+
<a name='L550'></a><a href='#L550'>550</a>
|
|
616
|
+
<a name='L551'></a><a href='#L551'>551</a>
|
|
617
|
+
<a name='L552'></a><a href='#L552'>552</a>
|
|
618
|
+
<a name='L553'></a><a href='#L553'>553</a>
|
|
619
|
+
<a name='L554'></a><a href='#L554'>554</a>
|
|
620
|
+
<a name='L555'></a><a href='#L555'>555</a>
|
|
621
|
+
<a name='L556'></a><a href='#L556'>556</a>
|
|
622
|
+
<a name='L557'></a><a href='#L557'>557</a>
|
|
623
|
+
<a name='L558'></a><a href='#L558'>558</a>
|
|
624
|
+
<a name='L559'></a><a href='#L559'>559</a>
|
|
625
|
+
<a name='L560'></a><a href='#L560'>560</a>
|
|
626
|
+
<a name='L561'></a><a href='#L561'>561</a>
|
|
627
|
+
<a name='L562'></a><a href='#L562'>562</a>
|
|
628
|
+
<a name='L563'></a><a href='#L563'>563</a>
|
|
629
|
+
<a name='L564'></a><a href='#L564'>564</a>
|
|
630
|
+
<a name='L565'></a><a href='#L565'>565</a>
|
|
631
|
+
<a name='L566'></a><a href='#L566'>566</a>
|
|
632
|
+
<a name='L567'></a><a href='#L567'>567</a>
|
|
633
|
+
<a name='L568'></a><a href='#L568'>568</a>
|
|
634
|
+
<a name='L569'></a><a href='#L569'>569</a>
|
|
635
|
+
<a name='L570'></a><a href='#L570'>570</a>
|
|
636
|
+
<a name='L571'></a><a href='#L571'>571</a>
|
|
637
|
+
<a name='L572'></a><a href='#L572'>572</a>
|
|
638
|
+
<a name='L573'></a><a href='#L573'>573</a>
|
|
639
|
+
<a name='L574'></a><a href='#L574'>574</a>
|
|
640
|
+
<a name='L575'></a><a href='#L575'>575</a>
|
|
641
|
+
<a name='L576'></a><a href='#L576'>576</a>
|
|
642
|
+
<a name='L577'></a><a href='#L577'>577</a>
|
|
643
|
+
<a name='L578'></a><a href='#L578'>578</a>
|
|
644
|
+
<a name='L579'></a><a href='#L579'>579</a>
|
|
645
|
+
<a name='L580'></a><a href='#L580'>580</a>
|
|
646
|
+
<a name='L581'></a><a href='#L581'>581</a>
|
|
647
|
+
<a name='L582'></a><a href='#L582'>582</a>
|
|
648
|
+
<a name='L583'></a><a href='#L583'>583</a>
|
|
649
|
+
<a name='L584'></a><a href='#L584'>584</a>
|
|
650
|
+
<a name='L585'></a><a href='#L585'>585</a>
|
|
651
|
+
<a name='L586'></a><a href='#L586'>586</a>
|
|
652
|
+
<a name='L587'></a><a href='#L587'>587</a>
|
|
653
|
+
<a name='L588'></a><a href='#L588'>588</a>
|
|
654
|
+
<a name='L589'></a><a href='#L589'>589</a>
|
|
655
|
+
<a name='L590'></a><a href='#L590'>590</a>
|
|
656
|
+
<a name='L591'></a><a href='#L591'>591</a>
|
|
657
|
+
<a name='L592'></a><a href='#L592'>592</a>
|
|
658
|
+
<a name='L593'></a><a href='#L593'>593</a>
|
|
659
|
+
<a name='L594'></a><a href='#L594'>594</a>
|
|
660
|
+
<a name='L595'></a><a href='#L595'>595</a>
|
|
661
|
+
<a name='L596'></a><a href='#L596'>596</a>
|
|
662
|
+
<a name='L597'></a><a href='#L597'>597</a>
|
|
663
|
+
<a name='L598'></a><a href='#L598'>598</a>
|
|
664
|
+
<a name='L599'></a><a href='#L599'>599</a>
|
|
665
|
+
<a name='L600'></a><a href='#L600'>600</a>
|
|
666
|
+
<a name='L601'></a><a href='#L601'>601</a>
|
|
667
|
+
<a name='L602'></a><a href='#L602'>602</a>
|
|
668
|
+
<a name='L603'></a><a href='#L603'>603</a>
|
|
669
|
+
<a name='L604'></a><a href='#L604'>604</a>
|
|
670
|
+
<a name='L605'></a><a href='#L605'>605</a>
|
|
671
|
+
<a name='L606'></a><a href='#L606'>606</a>
|
|
672
|
+
<a name='L607'></a><a href='#L607'>607</a>
|
|
673
|
+
<a name='L608'></a><a href='#L608'>608</a>
|
|
674
|
+
<a name='L609'></a><a href='#L609'>609</a>
|
|
675
|
+
<a name='L610'></a><a href='#L610'>610</a>
|
|
676
|
+
<a name='L611'></a><a href='#L611'>611</a>
|
|
677
|
+
<a name='L612'></a><a href='#L612'>612</a>
|
|
678
|
+
<a name='L613'></a><a href='#L613'>613</a>
|
|
679
|
+
<a name='L614'></a><a href='#L614'>614</a>
|
|
680
|
+
<a name='L615'></a><a href='#L615'>615</a>
|
|
681
|
+
<a name='L616'></a><a href='#L616'>616</a>
|
|
682
|
+
<a name='L617'></a><a href='#L617'>617</a>
|
|
683
|
+
<a name='L618'></a><a href='#L618'>618</a>
|
|
684
|
+
<a name='L619'></a><a href='#L619'>619</a>
|
|
685
|
+
<a name='L620'></a><a href='#L620'>620</a>
|
|
686
|
+
<a name='L621'></a><a href='#L621'>621</a>
|
|
687
|
+
<a name='L622'></a><a href='#L622'>622</a>
|
|
688
|
+
<a name='L623'></a><a href='#L623'>623</a>
|
|
689
|
+
<a name='L624'></a><a href='#L624'>624</a>
|
|
690
|
+
<a name='L625'></a><a href='#L625'>625</a>
|
|
691
|
+
<a name='L626'></a><a href='#L626'>626</a>
|
|
692
|
+
<a name='L627'></a><a href='#L627'>627</a>
|
|
693
|
+
<a name='L628'></a><a href='#L628'>628</a>
|
|
694
|
+
<a name='L629'></a><a href='#L629'>629</a>
|
|
695
|
+
<a name='L630'></a><a href='#L630'>630</a>
|
|
696
|
+
<a name='L631'></a><a href='#L631'>631</a>
|
|
697
|
+
<a name='L632'></a><a href='#L632'>632</a>
|
|
698
|
+
<a name='L633'></a><a href='#L633'>633</a>
|
|
699
|
+
<a name='L634'></a><a href='#L634'>634</a>
|
|
700
|
+
<a name='L635'></a><a href='#L635'>635</a>
|
|
701
|
+
<a name='L636'></a><a href='#L636'>636</a>
|
|
702
|
+
<a name='L637'></a><a href='#L637'>637</a>
|
|
703
|
+
<a name='L638'></a><a href='#L638'>638</a>
|
|
704
|
+
<a name='L639'></a><a href='#L639'>639</a>
|
|
705
|
+
<a name='L640'></a><a href='#L640'>640</a>
|
|
706
|
+
<a name='L641'></a><a href='#L641'>641</a>
|
|
707
|
+
<a name='L642'></a><a href='#L642'>642</a>
|
|
708
|
+
<a name='L643'></a><a href='#L643'>643</a>
|
|
709
|
+
<a name='L644'></a><a href='#L644'>644</a>
|
|
710
|
+
<a name='L645'></a><a href='#L645'>645</a>
|
|
711
|
+
<a name='L646'></a><a href='#L646'>646</a>
|
|
712
|
+
<a name='L647'></a><a href='#L647'>647</a>
|
|
713
|
+
<a name='L648'></a><a href='#L648'>648</a>
|
|
714
|
+
<a name='L649'></a><a href='#L649'>649</a>
|
|
715
|
+
<a name='L650'></a><a href='#L650'>650</a>
|
|
716
|
+
<a name='L651'></a><a href='#L651'>651</a>
|
|
717
|
+
<a name='L652'></a><a href='#L652'>652</a>
|
|
718
|
+
<a name='L653'></a><a href='#L653'>653</a>
|
|
719
|
+
<a name='L654'></a><a href='#L654'>654</a>
|
|
720
|
+
<a name='L655'></a><a href='#L655'>655</a>
|
|
721
|
+
<a name='L656'></a><a href='#L656'>656</a>
|
|
722
|
+
<a name='L657'></a><a href='#L657'>657</a>
|
|
723
|
+
<a name='L658'></a><a href='#L658'>658</a>
|
|
724
|
+
<a name='L659'></a><a href='#L659'>659</a>
|
|
725
|
+
<a name='L660'></a><a href='#L660'>660</a>
|
|
726
|
+
<a name='L661'></a><a href='#L661'>661</a>
|
|
727
|
+
<a name='L662'></a><a href='#L662'>662</a>
|
|
728
|
+
<a name='L663'></a><a href='#L663'>663</a>
|
|
729
|
+
<a name='L664'></a><a href='#L664'>664</a>
|
|
730
|
+
<a name='L665'></a><a href='#L665'>665</a>
|
|
731
|
+
<a name='L666'></a><a href='#L666'>666</a>
|
|
732
|
+
<a name='L667'></a><a href='#L667'>667</a>
|
|
733
|
+
<a name='L668'></a><a href='#L668'>668</a>
|
|
734
|
+
<a name='L669'></a><a href='#L669'>669</a>
|
|
735
|
+
<a name='L670'></a><a href='#L670'>670</a>
|
|
736
|
+
<a name='L671'></a><a href='#L671'>671</a>
|
|
737
|
+
<a name='L672'></a><a href='#L672'>672</a>
|
|
738
|
+
<a name='L673'></a><a href='#L673'>673</a>
|
|
739
|
+
<a name='L674'></a><a href='#L674'>674</a>
|
|
740
|
+
<a name='L675'></a><a href='#L675'>675</a>
|
|
741
|
+
<a name='L676'></a><a href='#L676'>676</a>
|
|
742
|
+
<a name='L677'></a><a href='#L677'>677</a>
|
|
743
|
+
<a name='L678'></a><a href='#L678'>678</a>
|
|
744
|
+
<a name='L679'></a><a href='#L679'>679</a>
|
|
745
|
+
<a name='L680'></a><a href='#L680'>680</a>
|
|
746
|
+
<a name='L681'></a><a href='#L681'>681</a>
|
|
747
|
+
<a name='L682'></a><a href='#L682'>682</a>
|
|
748
|
+
<a name='L683'></a><a href='#L683'>683</a>
|
|
749
|
+
<a name='L684'></a><a href='#L684'>684</a>
|
|
750
|
+
<a name='L685'></a><a href='#L685'>685</a>
|
|
751
|
+
<a name='L686'></a><a href='#L686'>686</a>
|
|
752
|
+
<a name='L687'></a><a href='#L687'>687</a>
|
|
753
|
+
<a name='L688'></a><a href='#L688'>688</a>
|
|
754
|
+
<a name='L689'></a><a href='#L689'>689</a>
|
|
755
|
+
<a name='L690'></a><a href='#L690'>690</a>
|
|
756
|
+
<a name='L691'></a><a href='#L691'>691</a>
|
|
757
|
+
<a name='L692'></a><a href='#L692'>692</a>
|
|
758
|
+
<a name='L693'></a><a href='#L693'>693</a>
|
|
759
|
+
<a name='L694'></a><a href='#L694'>694</a>
|
|
760
|
+
<a name='L695'></a><a href='#L695'>695</a>
|
|
761
|
+
<a name='L696'></a><a href='#L696'>696</a>
|
|
762
|
+
<a name='L697'></a><a href='#L697'>697</a>
|
|
763
|
+
<a name='L698'></a><a href='#L698'>698</a>
|
|
764
|
+
<a name='L699'></a><a href='#L699'>699</a>
|
|
765
|
+
<a name='L700'></a><a href='#L700'>700</a>
|
|
766
|
+
<a name='L701'></a><a href='#L701'>701</a>
|
|
767
|
+
<a name='L702'></a><a href='#L702'>702</a>
|
|
768
|
+
<a name='L703'></a><a href='#L703'>703</a>
|
|
769
|
+
<a name='L704'></a><a href='#L704'>704</a>
|
|
770
|
+
<a name='L705'></a><a href='#L705'>705</a>
|
|
771
|
+
<a name='L706'></a><a href='#L706'>706</a>
|
|
772
|
+
<a name='L707'></a><a href='#L707'>707</a>
|
|
773
|
+
<a name='L708'></a><a href='#L708'>708</a>
|
|
774
|
+
<a name='L709'></a><a href='#L709'>709</a>
|
|
775
|
+
<a name='L710'></a><a href='#L710'>710</a>
|
|
776
|
+
<a name='L711'></a><a href='#L711'>711</a>
|
|
777
|
+
<a name='L712'></a><a href='#L712'>712</a>
|
|
778
|
+
<a name='L713'></a><a href='#L713'>713</a>
|
|
779
|
+
<a name='L714'></a><a href='#L714'>714</a>
|
|
780
|
+
<a name='L715'></a><a href='#L715'>715</a>
|
|
781
|
+
<a name='L716'></a><a href='#L716'>716</a>
|
|
782
|
+
<a name='L717'></a><a href='#L717'>717</a>
|
|
783
|
+
<a name='L718'></a><a href='#L718'>718</a>
|
|
784
|
+
<a name='L719'></a><a href='#L719'>719</a>
|
|
785
|
+
<a name='L720'></a><a href='#L720'>720</a>
|
|
786
|
+
<a name='L721'></a><a href='#L721'>721</a>
|
|
787
|
+
<a name='L722'></a><a href='#L722'>722</a>
|
|
788
|
+
<a name='L723'></a><a href='#L723'>723</a>
|
|
789
|
+
<a name='L724'></a><a href='#L724'>724</a>
|
|
790
|
+
<a name='L725'></a><a href='#L725'>725</a>
|
|
791
|
+
<a name='L726'></a><a href='#L726'>726</a>
|
|
792
|
+
<a name='L727'></a><a href='#L727'>727</a>
|
|
793
|
+
<a name='L728'></a><a href='#L728'>728</a>
|
|
794
|
+
<a name='L729'></a><a href='#L729'>729</a>
|
|
795
|
+
<a name='L730'></a><a href='#L730'>730</a>
|
|
796
|
+
<a name='L731'></a><a href='#L731'>731</a>
|
|
797
|
+
<a name='L732'></a><a href='#L732'>732</a>
|
|
798
|
+
<a name='L733'></a><a href='#L733'>733</a>
|
|
799
|
+
<a name='L734'></a><a href='#L734'>734</a>
|
|
800
|
+
<a name='L735'></a><a href='#L735'>735</a>
|
|
801
|
+
<a name='L736'></a><a href='#L736'>736</a>
|
|
802
|
+
<a name='L737'></a><a href='#L737'>737</a>
|
|
803
|
+
<a name='L738'></a><a href='#L738'>738</a>
|
|
804
|
+
<a name='L739'></a><a href='#L739'>739</a>
|
|
805
|
+
<a name='L740'></a><a href='#L740'>740</a>
|
|
806
|
+
<a name='L741'></a><a href='#L741'>741</a>
|
|
807
|
+
<a name='L742'></a><a href='#L742'>742</a>
|
|
808
|
+
<a name='L743'></a><a href='#L743'>743</a>
|
|
809
|
+
<a name='L744'></a><a href='#L744'>744</a>
|
|
810
|
+
<a name='L745'></a><a href='#L745'>745</a>
|
|
811
|
+
<a name='L746'></a><a href='#L746'>746</a>
|
|
812
|
+
<a name='L747'></a><a href='#L747'>747</a>
|
|
813
|
+
<a name='L748'></a><a href='#L748'>748</a>
|
|
814
|
+
<a name='L749'></a><a href='#L749'>749</a>
|
|
815
|
+
<a name='L750'></a><a href='#L750'>750</a>
|
|
816
|
+
<a name='L751'></a><a href='#L751'>751</a>
|
|
817
|
+
<a name='L752'></a><a href='#L752'>752</a>
|
|
818
|
+
<a name='L753'></a><a href='#L753'>753</a>
|
|
819
|
+
<a name='L754'></a><a href='#L754'>754</a>
|
|
820
|
+
<a name='L755'></a><a href='#L755'>755</a>
|
|
821
|
+
<a name='L756'></a><a href='#L756'>756</a>
|
|
822
|
+
<a name='L757'></a><a href='#L757'>757</a>
|
|
823
|
+
<a name='L758'></a><a href='#L758'>758</a>
|
|
824
|
+
<a name='L759'></a><a href='#L759'>759</a>
|
|
825
|
+
<a name='L760'></a><a href='#L760'>760</a>
|
|
826
|
+
<a name='L761'></a><a href='#L761'>761</a>
|
|
827
|
+
<a name='L762'></a><a href='#L762'>762</a>
|
|
828
|
+
<a name='L763'></a><a href='#L763'>763</a>
|
|
829
|
+
<a name='L764'></a><a href='#L764'>764</a>
|
|
830
|
+
<a name='L765'></a><a href='#L765'>765</a>
|
|
831
|
+
<a name='L766'></a><a href='#L766'>766</a>
|
|
832
|
+
<a name='L767'></a><a href='#L767'>767</a>
|
|
833
|
+
<a name='L768'></a><a href='#L768'>768</a>
|
|
834
|
+
<a name='L769'></a><a href='#L769'>769</a>
|
|
835
|
+
<a name='L770'></a><a href='#L770'>770</a>
|
|
836
|
+
<a name='L771'></a><a href='#L771'>771</a>
|
|
837
|
+
<a name='L772'></a><a href='#L772'>772</a>
|
|
838
|
+
<a name='L773'></a><a href='#L773'>773</a>
|
|
839
|
+
<a name='L774'></a><a href='#L774'>774</a>
|
|
840
|
+
<a name='L775'></a><a href='#L775'>775</a>
|
|
841
|
+
<a name='L776'></a><a href='#L776'>776</a>
|
|
842
|
+
<a name='L777'></a><a href='#L777'>777</a>
|
|
843
|
+
<a name='L778'></a><a href='#L778'>778</a>
|
|
844
|
+
<a name='L779'></a><a href='#L779'>779</a>
|
|
845
|
+
<a name='L780'></a><a href='#L780'>780</a>
|
|
846
|
+
<a name='L781'></a><a href='#L781'>781</a>
|
|
847
|
+
<a name='L782'></a><a href='#L782'>782</a>
|
|
848
|
+
<a name='L783'></a><a href='#L783'>783</a>
|
|
849
|
+
<a name='L784'></a><a href='#L784'>784</a>
|
|
850
|
+
<a name='L785'></a><a href='#L785'>785</a>
|
|
851
|
+
<a name='L786'></a><a href='#L786'>786</a>
|
|
852
|
+
<a name='L787'></a><a href='#L787'>787</a>
|
|
853
|
+
<a name='L788'></a><a href='#L788'>788</a>
|
|
854
|
+
<a name='L789'></a><a href='#L789'>789</a>
|
|
855
|
+
<a name='L790'></a><a href='#L790'>790</a>
|
|
856
|
+
<a name='L791'></a><a href='#L791'>791</a>
|
|
857
|
+
<a name='L792'></a><a href='#L792'>792</a>
|
|
858
|
+
<a name='L793'></a><a href='#L793'>793</a>
|
|
859
|
+
<a name='L794'></a><a href='#L794'>794</a>
|
|
860
|
+
<a name='L795'></a><a href='#L795'>795</a>
|
|
861
|
+
<a name='L796'></a><a href='#L796'>796</a>
|
|
862
|
+
<a name='L797'></a><a href='#L797'>797</a>
|
|
863
|
+
<a name='L798'></a><a href='#L798'>798</a>
|
|
864
|
+
<a name='L799'></a><a href='#L799'>799</a>
|
|
865
|
+
<a name='L800'></a><a href='#L800'>800</a>
|
|
866
|
+
<a name='L801'></a><a href='#L801'>801</a>
|
|
867
|
+
<a name='L802'></a><a href='#L802'>802</a>
|
|
868
|
+
<a name='L803'></a><a href='#L803'>803</a>
|
|
869
|
+
<a name='L804'></a><a href='#L804'>804</a>
|
|
870
|
+
<a name='L805'></a><a href='#L805'>805</a>
|
|
871
|
+
<a name='L806'></a><a href='#L806'>806</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
872
|
+
<span class="cline-any cline-neutral"> </span>
|
|
873
|
+
<span class="cline-any cline-neutral"> </span>
|
|
874
|
+
<span class="cline-any cline-neutral"> </span>
|
|
875
|
+
<span class="cline-any cline-neutral"> </span>
|
|
876
|
+
<span class="cline-any cline-yes">1x</span>
|
|
877
|
+
<span class="cline-any cline-yes">1x</span>
|
|
878
|
+
<span class="cline-any cline-yes">1x</span>
|
|
879
|
+
<span class="cline-any cline-neutral"> </span>
|
|
880
|
+
<span class="cline-any cline-neutral"> </span>
|
|
881
|
+
<span class="cline-any cline-neutral"> </span>
|
|
882
|
+
<span class="cline-any cline-neutral"> </span>
|
|
883
|
+
<span class="cline-any cline-yes">1x</span>
|
|
884
|
+
<span class="cline-any cline-yes">1x</span>
|
|
885
|
+
<span class="cline-any cline-neutral"> </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-neutral"> </span>
|
|
890
|
+
<span class="cline-any cline-neutral"> </span>
|
|
891
|
+
<span class="cline-any cline-neutral"> </span>
|
|
892
|
+
<span class="cline-any cline-neutral"> </span>
|
|
893
|
+
<span class="cline-any cline-neutral"> </span>
|
|
894
|
+
<span class="cline-any cline-neutral"> </span>
|
|
895
|
+
<span class="cline-any cline-neutral"> </span>
|
|
896
|
+
<span class="cline-any cline-neutral"> </span>
|
|
897
|
+
<span class="cline-any cline-neutral"> </span>
|
|
898
|
+
<span class="cline-any cline-neutral"> </span>
|
|
899
|
+
<span class="cline-any cline-neutral"> </span>
|
|
900
|
+
<span class="cline-any cline-neutral"> </span>
|
|
901
|
+
<span class="cline-any cline-neutral"> </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-yes">1x</span>
|
|
905
|
+
<span class="cline-any cline-neutral"> </span>
|
|
906
|
+
<span class="cline-any cline-yes">1x</span>
|
|
907
|
+
<span class="cline-any cline-yes">1x</span>
|
|
908
|
+
<span class="cline-any cline-neutral"> </span>
|
|
909
|
+
<span class="cline-any cline-yes">1x</span>
|
|
910
|
+
<span class="cline-any cline-neutral"> </span>
|
|
911
|
+
<span class="cline-any cline-neutral"> </span>
|
|
912
|
+
<span class="cline-any cline-neutral"> </span>
|
|
913
|
+
<span class="cline-any cline-neutral"> </span>
|
|
914
|
+
<span class="cline-any cline-yes">5x</span>
|
|
915
|
+
<span class="cline-any cline-neutral"> </span>
|
|
916
|
+
<span class="cline-any cline-yes">5x</span>
|
|
917
|
+
<span class="cline-any cline-neutral"> </span>
|
|
918
|
+
<span class="cline-any cline-neutral"> </span>
|
|
919
|
+
<span class="cline-any cline-neutral"> </span>
|
|
920
|
+
<span class="cline-any cline-neutral"> </span>
|
|
921
|
+
<span class="cline-any cline-neutral"> </span>
|
|
922
|
+
<span class="cline-any cline-yes">1x</span>
|
|
923
|
+
<span class="cline-any cline-yes">6x</span>
|
|
924
|
+
<span class="cline-any cline-yes">5x</span>
|
|
925
|
+
<span class="cline-any cline-yes">1x</span>
|
|
926
|
+
<span class="cline-any cline-neutral"> </span>
|
|
927
|
+
<span class="cline-any cline-neutral"> </span>
|
|
928
|
+
<span class="cline-any cline-yes">4x</span>
|
|
929
|
+
<span class="cline-any cline-neutral"> </span>
|
|
930
|
+
<span class="cline-any cline-yes">1x</span>
|
|
931
|
+
<span class="cline-any cline-neutral"> </span>
|
|
932
|
+
<span class="cline-any cline-neutral"> </span>
|
|
933
|
+
<span class="cline-any cline-neutral"> </span>
|
|
934
|
+
<span class="cline-any cline-neutral"> </span>
|
|
935
|
+
<span class="cline-any cline-yes">1x</span>
|
|
936
|
+
<span class="cline-any cline-yes">1x</span>
|
|
937
|
+
<span class="cline-any cline-neutral"> </span>
|
|
938
|
+
<span class="cline-any cline-neutral"> </span>
|
|
939
|
+
<span class="cline-any cline-yes">1x</span>
|
|
940
|
+
<span class="cline-any cline-neutral"> </span>
|
|
941
|
+
<span class="cline-any cline-neutral"> </span>
|
|
942
|
+
<span class="cline-any cline-neutral"> </span>
|
|
943
|
+
<span class="cline-any cline-yes">1x</span>
|
|
944
|
+
<span class="cline-any cline-yes">1x</span>
|
|
945
|
+
<span class="cline-any cline-neutral"> </span>
|
|
946
|
+
<span class="cline-any cline-neutral"> </span>
|
|
947
|
+
<span class="cline-any cline-yes">1x</span>
|
|
948
|
+
<span class="cline-any cline-neutral"> </span>
|
|
949
|
+
<span class="cline-any cline-neutral"> </span>
|
|
950
|
+
<span class="cline-any cline-neutral"> </span>
|
|
951
|
+
<span class="cline-any cline-neutral"> </span>
|
|
952
|
+
<span class="cline-any cline-neutral"> </span>
|
|
953
|
+
<span class="cline-any cline-yes">1x</span>
|
|
954
|
+
<span class="cline-any cline-yes">1x</span>
|
|
955
|
+
<span class="cline-any cline-neutral"> </span>
|
|
956
|
+
<span class="cline-any cline-neutral"> </span>
|
|
957
|
+
<span class="cline-any cline-yes">1x</span>
|
|
958
|
+
<span class="cline-any cline-neutral"> </span>
|
|
959
|
+
<span class="cline-any cline-neutral"> </span>
|
|
960
|
+
<span class="cline-any cline-neutral"> </span>
|
|
961
|
+
<span class="cline-any cline-neutral"> </span>
|
|
962
|
+
<span class="cline-any cline-yes">1x</span>
|
|
963
|
+
<span class="cline-any cline-neutral"> </span>
|
|
964
|
+
<span class="cline-any cline-neutral"> </span>
|
|
965
|
+
<span class="cline-any cline-neutral"> </span>
|
|
966
|
+
<span class="cline-any cline-neutral"> </span>
|
|
967
|
+
<span class="cline-any cline-neutral"> </span>
|
|
968
|
+
<span class="cline-any cline-yes">2x</span>
|
|
969
|
+
<span class="cline-any cline-yes">2x</span>
|
|
970
|
+
<span class="cline-any cline-yes">2x</span>
|
|
971
|
+
<span class="cline-any cline-yes">2x</span>
|
|
972
|
+
<span class="cline-any cline-yes">2x</span>
|
|
973
|
+
<span class="cline-any cline-neutral"> </span>
|
|
974
|
+
<span class="cline-any cline-neutral"> </span>
|
|
975
|
+
<span class="cline-any cline-neutral"> </span>
|
|
976
|
+
<span class="cline-any cline-neutral"> </span>
|
|
977
|
+
<span class="cline-any cline-neutral"> </span>
|
|
978
|
+
<span class="cline-any cline-neutral"> </span>
|
|
979
|
+
<span class="cline-any cline-neutral"> </span>
|
|
980
|
+
<span class="cline-any cline-neutral"> </span>
|
|
981
|
+
<span class="cline-any cline-neutral"> </span>
|
|
982
|
+
<span class="cline-any cline-neutral"> </span>
|
|
983
|
+
<span class="cline-any cline-neutral"> </span>
|
|
984
|
+
<span class="cline-any cline-yes">2x</span>
|
|
985
|
+
<span class="cline-any cline-yes">1x</span>
|
|
986
|
+
<span class="cline-any cline-yes">1x</span>
|
|
987
|
+
<span class="cline-any cline-neutral"> </span>
|
|
988
|
+
<span class="cline-any cline-neutral"> </span>
|
|
989
|
+
<span class="cline-any cline-neutral"> </span>
|
|
990
|
+
<span class="cline-any cline-neutral"> </span>
|
|
991
|
+
<span class="cline-any cline-neutral"> </span>
|
|
992
|
+
<span class="cline-any cline-neutral"> </span>
|
|
993
|
+
<span class="cline-any cline-neutral"> </span>
|
|
994
|
+
<span class="cline-any cline-yes">1x</span>
|
|
995
|
+
<span class="cline-any cline-yes">2x</span>
|
|
996
|
+
<span class="cline-any cline-yes">2x</span>
|
|
997
|
+
<span class="cline-any cline-yes">2x</span>
|
|
998
|
+
<span class="cline-any cline-yes">2x</span>
|
|
999
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1000
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1001
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1002
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1003
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1004
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1005
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1006
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1007
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1008
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1009
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1010
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1011
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1012
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1013
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1014
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1015
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1016
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1017
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1018
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1019
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1020
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1021
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1022
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1023
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1024
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1025
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1026
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1027
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1028
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1029
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1030
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1031
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1032
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1033
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1034
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1035
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1036
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1037
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1038
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1039
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1040
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1041
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1042
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1043
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1044
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1045
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1046
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1047
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1048
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1049
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1050
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1051
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1052
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1053
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1054
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1055
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1056
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1057
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1058
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1059
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1060
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1061
|
+
<span class="cline-any cline-no"> </span>
|
|
1062
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1063
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1064
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1065
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1066
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1067
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1068
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1069
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1070
|
+
<span class="cline-any cline-no"> </span>
|
|
1071
|
+
<span class="cline-any cline-no"> </span>
|
|
1072
|
+
<span class="cline-any cline-no"> </span>
|
|
1073
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1074
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1075
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1076
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1077
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1078
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1079
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1080
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1081
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1082
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1083
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1084
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1085
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1086
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1087
|
+
<span class="cline-any cline-no"> </span>
|
|
1088
|
+
<span class="cline-any cline-no"> </span>
|
|
1089
|
+
<span class="cline-any cline-no"> </span>
|
|
1090
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1091
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1092
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1093
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1094
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1095
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1096
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1097
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1098
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1099
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1100
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1101
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1102
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1103
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1104
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1105
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1106
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1107
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1108
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1109
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1110
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1111
|
+
<span class="cline-any cline-no"> </span>
|
|
1112
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1113
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1114
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1115
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1116
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1117
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1118
|
+
<span class="cline-any cline-no"> </span>
|
|
1119
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1120
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1121
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1122
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1123
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1124
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1125
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1126
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1127
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1128
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1129
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1130
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1131
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1132
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1133
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1134
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1135
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1136
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1137
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1138
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1139
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1140
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1141
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1142
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1143
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1144
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1145
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1146
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1147
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1148
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1149
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1150
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1151
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1152
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1153
|
+
<span class="cline-any cline-no"> </span>
|
|
1154
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1155
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1156
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1157
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1158
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1159
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1160
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1161
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1162
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1163
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1164
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1165
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1166
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1167
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1168
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1169
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1170
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1171
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1172
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1173
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1174
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1175
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1176
|
+
<span class="cline-any cline-yes">28x</span>
|
|
1177
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1178
|
+
<span class="cline-any cline-yes">28x</span>
|
|
1179
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1180
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1181
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1182
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1183
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1184
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1185
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1186
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1187
|
+
<span class="cline-any cline-yes">28x</span>
|
|
1188
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1189
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1190
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1191
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1192
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1193
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1194
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1195
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1196
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1197
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1198
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1199
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1200
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1201
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1202
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1203
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1204
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1205
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1206
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1207
|
+
<span class="cline-any cline-no"> </span>
|
|
1208
|
+
<span class="cline-any cline-no"> </span>
|
|
1209
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1210
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1211
|
+
<span class="cline-any cline-no"> </span>
|
|
1212
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1213
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1214
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1215
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1216
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1217
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1218
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1219
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1220
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1221
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1222
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1223
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1224
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1225
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1226
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1227
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1228
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1229
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1230
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1231
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1232
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1233
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1234
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1235
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1236
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1237
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1238
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1239
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1240
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1241
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1242
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1243
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1244
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1245
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1246
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1247
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1248
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1249
|
+
<span class="cline-any cline-no"> </span>
|
|
1250
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1251
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1252
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1253
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1254
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1255
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1256
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1257
|
+
<span class="cline-any cline-no"> </span>
|
|
1258
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1259
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1260
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1261
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1262
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1263
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1264
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1265
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1266
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1267
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1268
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1269
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1270
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1271
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1272
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1273
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1274
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1275
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1276
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1277
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1278
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1279
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1280
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1281
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1282
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1283
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1284
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1285
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1286
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1287
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1288
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1289
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1290
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1291
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1292
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1293
|
+
<span class="cline-any cline-no"> </span>
|
|
1294
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1295
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1296
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1297
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1298
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1299
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1300
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1301
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1302
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1303
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1304
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1305
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1306
|
+
<span class="cline-any cline-no"> </span>
|
|
1307
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1308
|
+
<span class="cline-any cline-no"> </span>
|
|
1309
|
+
<span class="cline-any cline-no"> </span>
|
|
1310
|
+
<span class="cline-any cline-no"> </span>
|
|
1311
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1312
|
+
<span class="cline-any cline-no"> </span>
|
|
1313
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1314
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1315
|
+
<span class="cline-any cline-no"> </span>
|
|
1316
|
+
<span class="cline-any cline-no"> </span>
|
|
1317
|
+
<span class="cline-any cline-no"> </span>
|
|
1318
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1319
|
+
<span class="cline-any cline-no"> </span>
|
|
1320
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1321
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1322
|
+
<span class="cline-any cline-no"> </span>
|
|
1323
|
+
<span class="cline-any cline-no"> </span>
|
|
1324
|
+
<span class="cline-any cline-no"> </span>
|
|
1325
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1326
|
+
<span class="cline-any cline-no"> </span>
|
|
1327
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1328
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1329
|
+
<span class="cline-any cline-no"> </span>
|
|
1330
|
+
<span class="cline-any cline-no"> </span>
|
|
1331
|
+
<span class="cline-any cline-no"> </span>
|
|
1332
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1333
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1334
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1335
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1336
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1337
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1338
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1339
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1340
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1341
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1342
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1343
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1344
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1345
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1346
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1347
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1348
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1349
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1350
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1351
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1352
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1353
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1354
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1355
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1356
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1357
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1358
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1359
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1360
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1361
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1362
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1363
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1364
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1365
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1366
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1367
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1368
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1369
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1370
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1371
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1372
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1373
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1374
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1375
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1376
|
+
<span class="cline-any cline-no"> </span>
|
|
1377
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1378
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1379
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1380
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1381
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1382
|
+
<span class="cline-any cline-no"> </span>
|
|
1383
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1384
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1385
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1386
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1387
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1388
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1389
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1390
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1391
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1392
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1393
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1394
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1395
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1396
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1397
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1398
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1399
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1400
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1401
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1402
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1403
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1404
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1405
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1406
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1407
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1408
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1409
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1410
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1411
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1412
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1413
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1414
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1415
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1416
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1417
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1418
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1419
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1420
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1421
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1422
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1423
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1424
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1425
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1426
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1427
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1428
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1429
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1430
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1431
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1432
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1433
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1434
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1435
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1436
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1437
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1438
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1439
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1440
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1441
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1442
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1443
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1444
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1445
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1446
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1447
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1448
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1449
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1450
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1451
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1452
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1453
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1454
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1455
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1456
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1457
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1458
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1459
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1460
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1461
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1462
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1463
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1464
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1465
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1466
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1467
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1468
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1469
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1470
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1471
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1472
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1473
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1474
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1475
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1476
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1477
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1478
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1479
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1480
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1481
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1482
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1483
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1484
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1485
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1486
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1487
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1488
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1489
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1490
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1491
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1492
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1493
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1494
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1495
|
+
<span class="cline-any cline-no"> </span>
|
|
1496
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1497
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1498
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1499
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1500
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1501
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1502
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1503
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1504
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1505
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1506
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1507
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1508
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1509
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1510
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1511
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1512
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1513
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1514
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1515
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1516
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1517
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1518
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1519
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1520
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1521
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1522
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1523
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1524
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1525
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1526
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1527
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1528
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1529
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1530
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1531
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1532
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1533
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1534
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1535
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1536
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1537
|
+
<span class="cline-any cline-no"> </span>
|
|
1538
|
+
<span class="cline-any cline-no"> </span>
|
|
1539
|
+
<span class="cline-any cline-no"> </span>
|
|
1540
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1541
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1542
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1543
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1544
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1545
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1546
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1547
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1548
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1549
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1550
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1551
|
+
<span class="cline-any cline-no"> </span>
|
|
1552
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1553
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1554
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1555
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1556
|
+
<span class="cline-any cline-no"> </span>
|
|
1557
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1558
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1559
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1560
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1561
|
+
<span class="cline-any cline-no"> </span>
|
|
1562
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1563
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1564
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1565
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1566
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1567
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1568
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1569
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1570
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1571
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1572
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1573
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1574
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1575
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1576
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1577
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1578
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1579
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1580
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1581
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1582
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1583
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1584
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1585
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1586
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1587
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1588
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1589
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1590
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1591
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1592
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1593
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1594
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1595
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1596
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1597
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1598
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1599
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1600
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1601
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1602
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1603
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1604
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1605
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1606
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1607
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1608
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1609
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1610
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1611
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1612
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1613
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1614
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1615
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1616
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1617
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1618
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1619
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1620
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1621
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1622
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1623
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1624
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1625
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1626
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1627
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1628
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1629
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1630
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1631
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1632
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1633
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1634
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1635
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1636
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1637
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1638
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1639
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1640
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1641
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1642
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1643
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1644
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1645
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1646
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1647
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1648
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1649
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1650
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1651
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1652
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1653
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1654
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1655
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1656
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1657
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1658
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1659
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1660
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1661
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1662
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1663
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1664
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1665
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1666
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1667
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1668
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1669
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1670
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1671
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1672
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1673
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1674
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1675
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1676
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">/**
|
|
1677
|
+
* Copyright (c) 2019-Present, Nitrogen Labs, Inc.
|
|
1678
|
+
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
|
|
1679
|
+
*/
|
|
1680
|
+
import {DeleteObjectsCommandInput, PutObjectCommandInput} from '@aws-sdk/client-s3';
|
|
1681
|
+
import {get as httpGet} from '@nlabs/rip-hunter';
|
|
1682
|
+
import {createHash, lowerCaseKeys, parseArangoId, parseChar, parseId, parseNum} from '@nlabs/utils';
|
|
1683
|
+
import {aql} from 'arangojs';
|
|
1684
|
+
import {AqlQuery} from 'arangojs/aql';
|
|
1685
|
+
import {EdgeCollection} from 'arangojs/collection';
|
|
1686
|
+
import {ArrayCursor} from 'arangojs/cursor';
|
|
1687
|
+
import {MimeType} from 'file-type';
|
|
1688
|
+
import gm from 'gm';
|
|
1689
|
+
import {DateTime} from 'luxon';
|
|
1690
|
+
|
|
1691
|
+
import {getGroupDetails, isGrouped} from './groups';
|
|
1692
|
+
import {s3DeleteList, s3GetSignedUrl, s3Put} from './s3';
|
|
1693
|
+
import {Config} from '../config';
|
|
1694
|
+
import type {
|
|
1695
|
+
ApiContext,
|
|
1696
|
+
ArangoDbCollection,
|
|
1697
|
+
ArangoDbLimit,
|
|
1698
|
+
GroupType,
|
|
1699
|
+
GroupUser,
|
|
1700
|
+
ImageEdgeType,
|
|
1701
|
+
ImageIdentifyType,
|
|
1702
|
+
ImageOptions,
|
|
1703
|
+
ImageType,
|
|
1704
|
+
ImageUrlData,
|
|
1705
|
+
QueryFilter
|
|
1706
|
+
} from '../types';
|
|
1707
|
+
import {logError, logException} from '../utils/analyticsUtils';
|
|
1708
|
+
import {ErrorTypes} from '../types/error';
|
|
1709
|
+
import {getDocId, getLimit, selectReactionCountByType} from '../utils/arangodbUtils';
|
|
1710
|
+
|
|
1711
|
+
const eventCategory: string = 'images';
|
|
1712
|
+
gm.subClass({imageMagick: '7+'});
|
|
1713
|
+
|
|
1714
|
+
export const parseImageOptions = (options: ImageOptions = {}) => {
|
|
1715
|
+
const {
|
|
1716
|
+
from = 0,
|
|
1717
|
+
to = 30,
|
|
1718
|
+
type = 'default'
|
|
1719
|
+
} = options;
|
|
1720
|
+
|
|
1721
|
+
return {
|
|
1722
|
+
limit: getLimit(from, to) as ArangoDbLimit,
|
|
1723
|
+
type: parseChar(type, 32)
|
|
1724
|
+
};
|
|
1725
|
+
};
|
|
1726
|
+
|
|
1727
|
+
export const getImageOptional = (fields: string[] = []) =>
|
|
1728
|
+
fields.reduce((selects: any, field: string) => {
|
|
1729
|
+
if(field.includes('Count')) {
|
|
1730
|
+
return selectReactionCountByType('images', 'i', field, selects);
|
|
1731
|
+
}
|
|
1732
|
+
|
|
1733
|
+
switch(field) {
|
|
1734
|
+
case 'reactions': {
|
|
1735
|
+
selects.queries.push(`LET reactions = (
|
|
1736
|
+
FOR image, r IN INBOUND i._id reactions
|
|
1737
|
+
COLLECT reactionName = r.value INTO reactionItems
|
|
1738
|
+
RETURN {name: reactionName, count: LENGTH(reactionItems[*].r.value)}
|
|
1739
|
+
)`);
|
|
1740
|
+
selects.objects.push('reactions:reactions');
|
|
1741
|
+
return selects;
|
|
1742
|
+
}
|
|
1743
|
+
case 'tags': {
|
|
1744
|
+
selects.queries.push(`LET tags = (
|
|
1745
|
+
FOR t, pl IN INBOUND i._id isTagged
|
|
1746
|
+
RETURN t
|
|
1747
|
+
)`);
|
|
1748
|
+
selects.objects.push('tags:tags');
|
|
1749
|
+
return selects;
|
|
1750
|
+
}
|
|
1751
|
+
case 'users': {
|
|
1752
|
+
selects.queries.push(`LET users = FIRST(
|
|
1753
|
+
FOR u IN users
|
|
1754
|
+
FILTER i.userId == u._key
|
|
1755
|
+
LIMIT 1
|
|
1756
|
+
RETURN u
|
|
1757
|
+
)`);
|
|
1758
|
+
selects.objects.push('users:users');
|
|
1759
|
+
return selects;
|
|
1760
|
+
}
|
|
1761
|
+
default: {
|
|
1762
|
+
return selects;
|
|
1763
|
+
}
|
|
1764
|
+
}
|
|
1765
|
+
}, {objects: [], queries: []});
|
|
1766
|
+
|
|
1767
|
+
export const getImagesByUser = (
|
|
1768
|
+
context: ApiContext,
|
|
1769
|
+
userId: string,
|
|
1770
|
+
from: number = 0,
|
|
1771
|
+
to: number = 30
|
|
1772
|
+
): Promise<ImageType[]> => {
|
|
1773
|
+
const action: string = 'getImagesByUser';
|
|
1774
|
+
const {database} = context;
|
|
1775
|
+
const formatUserId: string = parseId(userId);
|
|
1776
|
+
const limit: ArangoDbLimit = getLimit(from, to);
|
|
1777
|
+
const aqlQry: string = `FOR i IN images
|
|
1778
|
+
FILTER i.userId == "${formatUserId}"
|
|
1779
|
+
LET user = FIRST(
|
|
1780
|
+
FOR u IN users
|
|
1781
|
+
FILTER u._key == i.userId
|
|
1782
|
+
LIMIT 1
|
|
1783
|
+
RETURN u
|
|
1784
|
+
)
|
|
1785
|
+
${limit.aql}
|
|
1786
|
+
SORT i.added
|
|
1787
|
+
RETURN MERGE(i, {user:user})`;
|
|
1788
|
+
|
|
1789
|
+
return database.query(aqlQry)
|
|
1790
|
+
.then((cursor: ArrayCursor) => cursor.all())
|
|
1791
|
+
.catch((error: Error) => logError({
|
|
1792
|
+
action,
|
|
1793
|
+
category: eventCategory,
|
|
1794
|
+
value: ErrorTypes.DATABASE_ERROR,
|
|
1795
|
+
params: {from, to, userId}
|
|
1796
|
+
}, error, context));
|
|
1797
|
+
};
|
|
1798
|
+
|
|
1799
|
+
export const getImageCountByItem = (context: ApiContext, itemId: string): Promise<number> => {
|
|
1800
|
+
const action: string = 'getImageCountByItem';
|
|
1801
|
+
const {database} = context;
|
|
1802
|
+
const formatItemId: string = parseArangoId(itemId);
|
|
1803
|
+
const aqlQry: AqlQuery = aql`FOR i IN hasImage
|
|
1804
|
+
FILTER i._to == ${formatItemId}
|
|
1805
|
+
RETURN {count: COUNT(i)}`;
|
|
1806
|
+
|
|
1807
|
+
return database.query(aqlQry)
|
|
1808
|
+
.then((cursor: ArrayCursor) => cursor.next())
|
|
1809
|
+
.then(({count}) => count)
|
|
1810
|
+
.catch((error: Error) => logError({
|
|
1811
|
+
action,
|
|
1812
|
+
category: eventCategory,
|
|
1813
|
+
value: ErrorTypes.DATABASE_ERROR,
|
|
1814
|
+
params: {itemId}
|
|
1815
|
+
}, error, context));
|
|
1816
|
+
};
|
|
1817
|
+
|
|
1818
|
+
export const getImagesByItem = async (
|
|
1819
|
+
context: ApiContext,
|
|
1820
|
+
itemId: string,
|
|
1821
|
+
options: ImageOptions = {}
|
|
1822
|
+
): Promise<ImageType[]> => {
|
|
1823
|
+
const action: string = 'getImagesByItem';
|
|
1824
|
+
const {database, fields = []} = context;
|
|
1825
|
+
const formatItemId: string = parseArangoId(itemId);
|
|
1826
|
+
const {limit} = parseImageOptions(options);
|
|
1827
|
+
const {objects: selectObjects, queries: selectQueries} = getImageOptional(fields);
|
|
1828
|
+
const aqlQry: string = `FOR i, l IN 1..1 OUTBOUND "${formatItemId}" hasImage
|
|
1829
|
+
FILTER NOT IS_NULL(i)
|
|
1830
|
+
${selectQueries.join('\n')}
|
|
1831
|
+
SORT i.added
|
|
1832
|
+
${limit.aql}
|
|
1833
|
+
RETURN MERGE(i, {${selectObjects.join(', ')}})`;
|
|
1834
|
+
|
|
1835
|
+
return database.query(aqlQry)
|
|
1836
|
+
.then((cursor: ArrayCursor) => cursor.all())
|
|
1837
|
+
.catch((error: Error) => logError({
|
|
1838
|
+
action,
|
|
1839
|
+
category: eventCategory,
|
|
1840
|
+
value: ErrorTypes.DATABASE_ERROR,
|
|
1841
|
+
params: {itemId, options}
|
|
1842
|
+
}, error, context));
|
|
1843
|
+
};
|
|
1844
|
+
|
|
1845
|
+
export const getImagesByGroup = (
|
|
1846
|
+
context: ApiContext,
|
|
1847
|
+
params: {filters: any[], groupId: string, from: number, to: number}
|
|
1848
|
+
): Promise<ImageType[]> => {
|
|
1849
|
+
const action: string = 'getImagesByGroup';
|
|
1850
|
+
const {database, session: {userId: sessionId}} = context;
|
|
1851
|
+
const {filters, groupId, from, to} = params;
|
|
1852
|
+
const formatGroupId: string = parseId(groupId);
|
|
1853
|
+
const limit: ArangoDbLimit = getLimit(from, to);
|
|
1854
|
+
|
|
1855
|
+
filters
|
|
1856
|
+
.map((filter: QueryFilter) => {
|
|
1857
|
+
const {conditional, name, value} = filter;
|
|
1858
|
+
let formatCond: string = conditional;
|
|
1859
|
+
|
|
1860
|
+
if(conditional !== '>=' && conditional !== '<=' && conditional !== '>' && conditional !== '<') {
|
|
1861
|
+
formatCond = '==';
|
|
1862
|
+
}
|
|
1863
|
+
|
|
1864
|
+
switch(name) {
|
|
1865
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > case 'added':</span>
|
|
1866
|
+
<span class="cstat-no" title="statement not covered" > return `p.added ${formatCond} ${parseNum(value)}`;</span>
|
|
1867
|
+
default:
|
|
1868
|
+
return '';
|
|
1869
|
+
}
|
|
1870
|
+
});
|
|
1871
|
+
|
|
1872
|
+
return getGroupDetails(context, formatGroupId)
|
|
1873
|
+
.then((group: GroupType) => {
|
|
1874
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if(group.privacy === 'public') {
|
|
1875
|
+
<span class="cstat-no" title="statement not covered" > filters.push(`p.groupId == "${formatGroupId}"`);</span>
|
|
1876
|
+
const filterStr = <span class="cstat-no" title="statement not covered" >filters.join(' && ');</span>
|
|
1877
|
+
const aqlQry: string = <span class="cstat-no" title="statement not covered" >`FOR i IN</span>
|
|
1878
|
+
FLATTEN(
|
|
1879
|
+
FOR p IN posts
|
|
1880
|
+
FILTER ${filterStr}
|
|
1881
|
+
LET images = (
|
|
1882
|
+
FOR i, e IN INBOUND p._id hasImage
|
|
1883
|
+
RETURN i
|
|
1884
|
+
)
|
|
1885
|
+
SORT p.added DESC
|
|
1886
|
+
RETURN images
|
|
1887
|
+
)
|
|
1888
|
+
SORT i.added DESC
|
|
1889
|
+
${limit.aql}
|
|
1890
|
+
RETURN i`;
|
|
1891
|
+
|
|
1892
|
+
<span class="cstat-no" title="statement not covered" > return database.query(aqlQry)</span>
|
|
1893
|
+
.then(<span class="fstat-no" title="function not covered" >(c</span>ursor: ArrayCursor) => <span class="cstat-no" title="statement not covered" >cursor.all())</span>
|
|
1894
|
+
.catch(<span class="fstat-no" title="function not covered" >(e</span>rror: Error) => <span class="cstat-no" title="statement not covered" >logError({</span>
|
|
1895
|
+
action,
|
|
1896
|
+
category: eventCategory,
|
|
1897
|
+
value: ErrorTypes.DATABASE_ERROR,
|
|
1898
|
+
params
|
|
1899
|
+
}, error, context));
|
|
1900
|
+
}
|
|
1901
|
+
return isGrouped(database, sessionId, groupId)
|
|
1902
|
+
.then((grouped: GroupUser) => {
|
|
1903
|
+
if(grouped.isValid) {
|
|
1904
|
+
filters.push(`p.groupId == "${grouped.groupId}"`);
|
|
1905
|
+
const filterList: string = filters.join(' && ');
|
|
1906
|
+
const aqlQry: string = `FOR p IN post
|
|
1907
|
+
FILTER ${filterList}
|
|
1908
|
+
FOR f IN p.files
|
|
1909
|
+
FILTER f.type == "image/jpeg" || f.type == "image/png"
|
|
1910
|
+
${limit.aql}
|
|
1911
|
+
SORT p.added DESC
|
|
1912
|
+
RETURN f`;
|
|
1913
|
+
|
|
1914
|
+
return database.query(aqlQry)
|
|
1915
|
+
.then((cursor: ArrayCursor) => cursor.all())
|
|
1916
|
+
.catch(<span class="fstat-no" title="function not covered" >(e</span>rror: Error) => <span class="cstat-no" title="statement not covered" >logError({</span>
|
|
1917
|
+
action,
|
|
1918
|
+
category: eventCategory,
|
|
1919
|
+
value: ErrorTypes.DATABASE_ERROR,
|
|
1920
|
+
params
|
|
1921
|
+
}, error, context));
|
|
1922
|
+
}
|
|
1923
|
+
<span class="cstat-no" title="statement not covered" > return [];</span>
|
|
1924
|
+
});
|
|
1925
|
+
});
|
|
1926
|
+
};
|
|
1927
|
+
|
|
1928
|
+
export const getImagesByReactions = (
|
|
1929
|
+
context: ApiContext,
|
|
1930
|
+
reactions: string[] = <span class="branch-0 cbranch-no" title="branch not covered" >[],</span>
|
|
1931
|
+
options?: ImageOptions
|
|
1932
|
+
): Promise<ImageType[]> => {
|
|
1933
|
+
const action: string = 'getUsersByImage';
|
|
1934
|
+
const {database, fields = [], session: {userId: sessionId}} = context;
|
|
1935
|
+
const {limit} = parseImageOptions(options);
|
|
1936
|
+
const {objects: selectObjects, queries: selectQueries} = getImageOptional(fields);
|
|
1937
|
+
const formatSessionId: string = `users/${sessionId}`;
|
|
1938
|
+
const formatReactions: string[] = reactions.map((reactionName) => parseChar(reactionName, 32));
|
|
1939
|
+
const filterBy: string[] = [
|
|
1940
|
+
'r.type == "images"',
|
|
1941
|
+
`POSITION(${JSON.stringify(formatReactions)}, LOWER(r.name))`];
|
|
1942
|
+
|
|
1943
|
+
// Get data from database
|
|
1944
|
+
const aqlQry: string = `FOR i, r IN OUTBOUND "${formatSessionId}" hasReaction
|
|
1945
|
+
OPTIONS {vertexCollections: "images"}
|
|
1946
|
+
${selectQueries.join('\n')}
|
|
1947
|
+
FILTER ${filterBy.join(' && ')}
|
|
1948
|
+
${limit.aql}
|
|
1949
|
+
RETURN MERGE(i, {${selectObjects.join(', ')}})`;
|
|
1950
|
+
|
|
1951
|
+
return database.query(aqlQry)
|
|
1952
|
+
.then((cursor: ArrayCursor) => cursor.all())
|
|
1953
|
+
.catch((error: Error) => logError({
|
|
1954
|
+
action,
|
|
1955
|
+
category: eventCategory,
|
|
1956
|
+
value: ErrorTypes.DATABASE_ERROR,
|
|
1957
|
+
params: {reactions, options}
|
|
1958
|
+
}, error, context).then(<span class="fstat-no" title="function not covered" >() =</span>> <span class="cstat-no" title="statement not covered" >[])</span>);
|
|
1959
|
+
};
|
|
1960
|
+
|
|
1961
|
+
export const getImage = (context: ApiContext, imageId: string): Promise<ImageType> => {
|
|
1962
|
+
const action: string = 'getItem';
|
|
1963
|
+
const {database} = context;
|
|
1964
|
+
const formatImageId: string = parseId(imageId);
|
|
1965
|
+
const aqlQry: AqlQuery = aql`FOR i IN images
|
|
1966
|
+
FILTER i._key==${formatImageId}
|
|
1967
|
+
LIMIT 1
|
|
1968
|
+
RETURN i`;
|
|
1969
|
+
|
|
1970
|
+
return database.query(aqlQry)
|
|
1971
|
+
.then((cursor: ArrayCursor) => cursor.next())
|
|
1972
|
+
.catch((error: Error) => logError({
|
|
1973
|
+
action,
|
|
1974
|
+
category: eventCategory,
|
|
1975
|
+
value: ErrorTypes.DATABASE_ERROR,
|
|
1976
|
+
params: {imageId}
|
|
1977
|
+
}, error, context));
|
|
1978
|
+
};
|
|
1979
|
+
|
|
1980
|
+
export const getPathUserImages = (userId: string, imageId: string, type: string, dir: string = 'images'): string => {
|
|
1981
|
+
let filename: string = imageId;
|
|
1982
|
+
|
|
1983
|
+
switch(type) {
|
|
1984
|
+
case 'image/png':
|
|
1985
|
+
filename = `${imageId}.png`;
|
|
1986
|
+
break;
|
|
1987
|
+
default:
|
|
1988
|
+
filename = `${imageId}.jpg`;
|
|
1989
|
+
break;
|
|
1990
|
+
}
|
|
1991
|
+
|
|
1992
|
+
return `users/${userId}/${dir}/${filename}`;
|
|
1993
|
+
};
|
|
1994
|
+
|
|
1995
|
+
export const getAppImageUrl = (data: ImageUrlData): string => {
|
|
1996
|
+
const {imageId, directory = 'images', imageType = 'profile', isThumb, type, typeId} = data;
|
|
1997
|
+
const host: string = Config.get('environment') === 'prod'
|
|
1998
|
+
? `https://box.${Config.get('app.url')}`
|
|
1999
|
+
: <span class="branch-1 cbranch-no" title="branch not covered" >`https://s3.amazonaws.com/dev.${Config.get('app.url')}`;</span>
|
|
2000
|
+
const suffix: string = isThumb ? '-th' : '';
|
|
2001
|
+
|
|
2002
|
+
if(imageId) {
|
|
2003
|
+
switch(type) {
|
|
2004
|
+
case 'apps':
|
|
2005
|
+
// https://box.reaktor.io/myApp/app/images/123.jpg
|
|
2006
|
+
return `${host}/${type}/${directory}/${imageId}${suffix}.jpg`;
|
|
2007
|
+
case 'users':
|
|
2008
|
+
// https://box.reaktor.io/myApp/users/demoUser/images/123.jpg
|
|
2009
|
+
return `${host}/${type}/${typeId}/${directory}/${imageId}${suffix}.jpg`;
|
|
2010
|
+
}
|
|
2011
|
+
|
|
2012
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if(imageType === 'profile') {</span>
|
|
2013
|
+
<span class="cstat-no" title="statement not covered" > return `${host}/defaults/${type}_bk${suffix}.jpg`;</span>
|
|
2014
|
+
}
|
|
2015
|
+
|
|
2016
|
+
<span class="cstat-no" title="statement not covered" > return `${host}/defaults/${type}_wh${suffix}.jpg`;</span>
|
|
2017
|
+
}
|
|
2018
|
+
|
|
2019
|
+
return '';
|
|
2020
|
+
};
|
|
2021
|
+
|
|
2022
|
+
export const getImageUrl = async (data: ImageUrlData): Promise<string> => {
|
|
2023
|
+
const {bucket, imageId, isThumb = false, type, typeId} = data;
|
|
2024
|
+
const imgDir: string = isThumb ? 'thumbs' : 'images';
|
|
2025
|
+
|
|
2026
|
+
if(imageId) {
|
|
2027
|
+
const imageKey: string = `${type}/${typeId}/${imgDir}/${imageId}.jpg`;
|
|
2028
|
+
return await s3GetSignedUrl({Bucket: bucket, Key: imageKey, Expires: 900});
|
|
2029
|
+
}
|
|
2030
|
+
|
|
2031
|
+
return '';
|
|
2032
|
+
};
|
|
2033
|
+
|
|
2034
|
+
export const resizeSaveImage = async (
|
|
2035
|
+
context: ApiContext,
|
|
2036
|
+
imageId: string,
|
|
2037
|
+
buffer: Buffer,
|
|
2038
|
+
fileType: string = 'image/jpeg', s3Options?: PutObjectCommandInput
|
|
2039
|
+
): Promise<ImageType> => {
|
|
2040
|
+
const action: string = 'resizeSaveImage';
|
|
2041
|
+
const {session: {userId: sessionId}} = context;
|
|
2042
|
+
const imgW: number = Config.get('image.imgSize');
|
|
2043
|
+
const imgQ: number = Config.get('image.imgQuality');
|
|
2044
|
+
const format: string = (fileType.split('/'))[1];
|
|
2045
|
+
|
|
2046
|
+
const imageOptimizedBuffer: Buffer = await new Promise((resolve, reject) => {
|
|
2047
|
+
gm(buffer, 'img')
|
|
2048
|
+
.setFormat(format)
|
|
2049
|
+
.quality(imgQ)
|
|
2050
|
+
.autoOrient()
|
|
2051
|
+
.resize(imgW, imgW, '>')
|
|
2052
|
+
.stream((streamError: Error, stdout): void => {
|
|
2053
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if(streamError) {
|
|
2054
|
+
<span class="cstat-no" title="statement not covered" > reject(</span>
|
|
2055
|
+
logError({
|
|
2056
|
+
action,
|
|
2057
|
+
category: eventCategory,
|
|
2058
|
+
params: {imageId, fileType},
|
|
2059
|
+
value: ErrorTypes.IMAGE_SAVE
|
|
2060
|
+
}, streamError, context)
|
|
2061
|
+
);
|
|
2062
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
2063
|
+
}
|
|
2064
|
+
|
|
2065
|
+
let imageBuffer: Buffer = Buffer.from('');
|
|
2066
|
+
|
|
2067
|
+
stdout.on('data', (data) => {
|
|
2068
|
+
imageBuffer = Buffer.concat([imageBuffer, data]);
|
|
2069
|
+
});
|
|
2070
|
+
|
|
2071
|
+
stdout.on('end', () => resolve(imageBuffer));
|
|
2072
|
+
});
|
|
2073
|
+
});
|
|
2074
|
+
|
|
2075
|
+
try {
|
|
2076
|
+
const imageObj: PutObjectCommandInput = {
|
|
2077
|
+
ACL: 'authenticated-read',
|
|
2078
|
+
Body: imageOptimizedBuffer,
|
|
2079
|
+
Bucket: null,
|
|
2080
|
+
ContentType: fileType,
|
|
2081
|
+
...(s3Options || {}),
|
|
2082
|
+
Key: getPathUserImages(sessionId, imageId, fileType, 'images')
|
|
2083
|
+
};
|
|
2084
|
+
await s3Put(imageObj);
|
|
2085
|
+
} catch(error) {
|
|
2086
|
+
return logError({
|
|
2087
|
+
action,
|
|
2088
|
+
category: eventCategory,
|
|
2089
|
+
params: {imageId, fileType},
|
|
2090
|
+
value: ErrorTypes.IMAGE_SAVE
|
|
2091
|
+
}, error, context);
|
|
2092
|
+
}
|
|
2093
|
+
|
|
2094
|
+
const imageIdentity = await new Promise((resolve) => {
|
|
2095
|
+
gm(imageOptimizedBuffer, 'img')
|
|
2096
|
+
.identify({bufferStream: true}, (error: Error, imageData: ImageIdentifyType = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span>: any => {
|
|
2097
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if(error) {
|
|
2098
|
+
<span class="cstat-no" title="statement not covered" > return logError({</span>
|
|
2099
|
+
action,
|
|
2100
|
+
category: eventCategory,
|
|
2101
|
+
value: ErrorTypes.IMAGE_SAVE
|
|
2102
|
+
}, error, context);
|
|
2103
|
+
}
|
|
2104
|
+
|
|
2105
|
+
const formatValues = lowerCaseKeys(imageData);
|
|
2106
|
+
const {make: cameraMake, model: cameraModel, datetimeoriginal: taken}: ImageIdentifyType = formatValues;
|
|
2107
|
+
const stats = formatValues['channel statistics'];
|
|
2108
|
+
let color: string;
|
|
2109
|
+
|
|
2110
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if(stats) {
|
|
2111
|
+
let {red, green, blue, mean} = <span class="cstat-no" title="statement not covered" >stats;</span>
|
|
2112
|
+
|
|
2113
|
+
<span class="cstat-no" title="statement not covered" > if(red) {</span>
|
|
2114
|
+
<span class="cstat-no" title="statement not covered" > mean = red['standard deviation'] || red.mean;</span>
|
|
2115
|
+
<span class="cstat-no" title="statement not covered" > red = mean ? +((mean.split(' ')[0]).substring(0, 3)) : 0;</span>
|
|
2116
|
+
} else {
|
|
2117
|
+
<span class="cstat-no" title="statement not covered" > red = 0;</span>
|
|
2118
|
+
}
|
|
2119
|
+
|
|
2120
|
+
<span class="cstat-no" title="statement not covered" > if(green) {</span>
|
|
2121
|
+
<span class="cstat-no" title="statement not covered" > mean = green['standard deviation'] || green.mean;</span>
|
|
2122
|
+
<span class="cstat-no" title="statement not covered" > green = mean ? +((mean.split(' ')[0]).substring(0, 3)) : 0;</span>
|
|
2123
|
+
} else {
|
|
2124
|
+
<span class="cstat-no" title="statement not covered" > green = 0;</span>
|
|
2125
|
+
}
|
|
2126
|
+
|
|
2127
|
+
<span class="cstat-no" title="statement not covered" > if(blue) {</span>
|
|
2128
|
+
<span class="cstat-no" title="statement not covered" > mean = blue['standard deviation'] || blue.mean;</span>
|
|
2129
|
+
<span class="cstat-no" title="statement not covered" > blue = mean ? +((mean.split(' ')[0]).substring(0, 3)) : 0;</span>
|
|
2130
|
+
} else {
|
|
2131
|
+
<span class="cstat-no" title="statement not covered" > blue = 0;</span>
|
|
2132
|
+
}
|
|
2133
|
+
|
|
2134
|
+
const rgb = <span class="cstat-no" title="statement not covered" >blue | (green << 8) | (red << 16);</span>
|
|
2135
|
+
const rgbColor = <span class="cstat-no" title="statement not covered" >rgb.toString(16);</span>
|
|
2136
|
+
<span class="cstat-no" title="statement not covered" > color = rgbColor === '0' ? '000000' : rgbColor;</span>
|
|
2137
|
+
}
|
|
2138
|
+
|
|
2139
|
+
const {
|
|
2140
|
+
'JPEG-Quality': quality,
|
|
2141
|
+
Orientation: orientationData,
|
|
2142
|
+
Resolution: resolutionData,
|
|
2143
|
+
size
|
|
2144
|
+
} = imageData;
|
|
2145
|
+
let resolution;
|
|
2146
|
+
|
|
2147
|
+
if(resolutionData) {
|
|
2148
|
+
const [resolutionNumber, resolutionUnit] = resolutionData.split(' ');
|
|
2149
|
+
const resolutionValue = resolutionNumber.split('x')[0];
|
|
2150
|
+
const resolutionUnitValue = resolutionUnit === 'pixels/inch' ? <span class="branch-0 cbranch-no" title="branch not covered" >'ppi' </span>: '';
|
|
2151
|
+
resolution = `${resolutionValue} ${resolutionUnitValue}`;
|
|
2152
|
+
}
|
|
2153
|
+
|
|
2154
|
+
return resolve({
|
|
2155
|
+
color,
|
|
2156
|
+
fileSize: imageOptimizedBuffer.length,
|
|
2157
|
+
height: size?.height || <span class="branch-1 cbranch-no" title="branch not covered" >0,</span>
|
|
2158
|
+
make: cameraMake,
|
|
2159
|
+
model: cameraModel,
|
|
2160
|
+
orientation: orientationData === 'Unknown' ? <span class="branch-0 cbranch-no" title="branch not covered" >undefined </span>: orientationData?.toLowerCase(),
|
|
2161
|
+
quality: quality ? +quality : <span class="branch-1 cbranch-no" title="branch not covered" >undefined,</span>
|
|
2162
|
+
resolution,
|
|
2163
|
+
taken: taken ? <span class="branch-0 cbranch-no" title="branch not covered" >DateTime.fromMillis(taken).millisecond </span>: undefined,
|
|
2164
|
+
width: size?.width || <span class="branch-1 cbranch-no" title="branch not covered" >0</span>
|
|
2165
|
+
});
|
|
2166
|
+
});
|
|
2167
|
+
});
|
|
2168
|
+
|
|
2169
|
+
const thumbOptimizedBuffer: Buffer = await new Promise((resolve, reject) => {
|
|
2170
|
+
const thmW = Config.get('image.thmSize');
|
|
2171
|
+
const thmQ = Config.get('image.thmQuality');
|
|
2172
|
+
|
|
2173
|
+
gm(imageOptimizedBuffer, 'img')
|
|
2174
|
+
.setFormat(format)
|
|
2175
|
+
.gravity('Center')
|
|
2176
|
+
.resize(thmW, thmW, '^')
|
|
2177
|
+
.extent(thmW, thmW)
|
|
2178
|
+
.quality(thmQ)
|
|
2179
|
+
.stream((streamError: Error, thumbStdout): void => {
|
|
2180
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if(streamError) {
|
|
2181
|
+
<span class="cstat-no" title="statement not covered" > logError({</span>
|
|
2182
|
+
action,
|
|
2183
|
+
category: eventCategory,
|
|
2184
|
+
params: {imageId, fileType},
|
|
2185
|
+
value: ErrorTypes.IMAGE_SAVE
|
|
2186
|
+
}, streamError, context);
|
|
2187
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
2188
|
+
}
|
|
2189
|
+
|
|
2190
|
+
let thumbBuffer: Buffer = Buffer.from('');
|
|
2191
|
+
|
|
2192
|
+
thumbStdout.on('data', (data) => {
|
|
2193
|
+
thumbBuffer = Buffer.concat([thumbBuffer, data]);
|
|
2194
|
+
});
|
|
2195
|
+
|
|
2196
|
+
thumbStdout.on('end', () => resolve(thumbBuffer));
|
|
2197
|
+
});
|
|
2198
|
+
});
|
|
2199
|
+
|
|
2200
|
+
try {
|
|
2201
|
+
const thumbObj: PutObjectCommandInput = {
|
|
2202
|
+
ACL: 'authenticated-read',
|
|
2203
|
+
Body: thumbOptimizedBuffer,
|
|
2204
|
+
Bucket: null,
|
|
2205
|
+
ContentType: fileType,
|
|
2206
|
+
...(s3Options || {}),
|
|
2207
|
+
Key: getPathUserImages(sessionId, imageId, fileType, 'thumbs')
|
|
2208
|
+
};
|
|
2209
|
+
await s3Put(thumbObj);
|
|
2210
|
+
} catch(error) {
|
|
2211
|
+
return logError({
|
|
2212
|
+
action,
|
|
2213
|
+
category: eventCategory,
|
|
2214
|
+
value: ErrorTypes.IMAGE_SAVE
|
|
2215
|
+
}, error, context);
|
|
2216
|
+
}
|
|
2217
|
+
|
|
2218
|
+
return imageIdentity;
|
|
2219
|
+
};
|
|
2220
|
+
|
|
2221
|
+
export const addImage = (
|
|
2222
|
+
context: ApiContext,
|
|
2223
|
+
image: ImageType,
|
|
2224
|
+
s3Options?: PutObjectCommandInput
|
|
2225
|
+
): Promise<ImageType> => {
|
|
2226
|
+
const action: string = 'addImage';
|
|
2227
|
+
const {database, session: {userId: sessionId}} = context;
|
|
2228
|
+
const {imageId, description, buffer, fileType} = image;
|
|
2229
|
+
const now: number = Date.now();
|
|
2230
|
+
|
|
2231
|
+
return resizeSaveImage(context, imageId, buffer, fileType, s3Options)
|
|
2232
|
+
.then((resizedImage: any) => {
|
|
2233
|
+
const insert: ImageType = {
|
|
2234
|
+
...resizedImage,
|
|
2235
|
+
_key: imageId,
|
|
2236
|
+
added: now,
|
|
2237
|
+
description,
|
|
2238
|
+
fileType,
|
|
2239
|
+
modified: now,
|
|
2240
|
+
userId: sessionId
|
|
2241
|
+
};
|
|
2242
|
+
|
|
2243
|
+
const aqlQry: AqlQuery = aql`INSERT ${insert} IN images RETURN NEW`;
|
|
2244
|
+
|
|
2245
|
+
return database.query(aqlQry)
|
|
2246
|
+
.then((cursor: ArrayCursor) => cursor.next())
|
|
2247
|
+
.catch((error: Error) => logError({
|
|
2248
|
+
action,
|
|
2249
|
+
category: eventCategory,
|
|
2250
|
+
params: {image, s3Options},
|
|
2251
|
+
value: ErrorTypes.DATABASE_ERROR
|
|
2252
|
+
}, error, context));
|
|
2253
|
+
})
|
|
2254
|
+
.catch((error: Error) => logError({
|
|
2255
|
+
action,
|
|
2256
|
+
category: eventCategory,
|
|
2257
|
+
value: ErrorTypes.IMAGE_RESIZE
|
|
2258
|
+
}, error, context));
|
|
2259
|
+
};
|
|
2260
|
+
|
|
2261
|
+
export const addImageEdge = async (context: ApiContext, imageEdge: ImageEdgeType): Promise<object> => {
|
|
2262
|
+
const action: string = 'addImageEdge';
|
|
2263
|
+
const {database, session: {userId: sessionId}} = context;
|
|
2264
|
+
const {imageId, itemId, itemType} = imageEdge;
|
|
2265
|
+
const now: number = Date.now();
|
|
2266
|
+
const edgeCollection: EdgeCollection = database.collection('hasImage');
|
|
2267
|
+
const edgeId: string = createHash(`hasImage-${imageId}-${itemId}-${sessionId}`);
|
|
2268
|
+
const formatItemType: ArangoDbCollection = parseChar(itemType).toLowerCase() as ArangoDbCollection;
|
|
2269
|
+
const formatItemId: string = parseId(itemId);
|
|
2270
|
+
const itemDocId: string = getDocId(formatItemType, {_key: formatItemId});
|
|
2271
|
+
const formatImageId: string = parseId(imageId);
|
|
2272
|
+
const fileDocId: string = `images/${formatImageId}`;
|
|
2273
|
+
|
|
2274
|
+
const edge: any = {
|
|
2275
|
+
_from: itemDocId,
|
|
2276
|
+
_key: edgeId,
|
|
2277
|
+
_to: fileDocId,
|
|
2278
|
+
added: now,
|
|
2279
|
+
type: itemType
|
|
2280
|
+
};
|
|
2281
|
+
|
|
2282
|
+
if(itemDocId) {
|
|
2283
|
+
return edgeCollection.save(edge, {returnNew: true})
|
|
2284
|
+
.then((fileEdge) => edgeCollection.document(fileEdge))
|
|
2285
|
+
.catch((error: Error) => logError({
|
|
2286
|
+
action,
|
|
2287
|
+
category: eventCategory,
|
|
2288
|
+
params: {
|
|
2289
|
+
edge,
|
|
2290
|
+
fileDocId,
|
|
2291
|
+
imageId,
|
|
2292
|
+
itemDocId,
|
|
2293
|
+
itemId,
|
|
2294
|
+
itemType
|
|
2295
|
+
},
|
|
2296
|
+
value: ErrorTypes.DATABASE_ERROR
|
|
2297
|
+
}, error, context));
|
|
2298
|
+
}
|
|
2299
|
+
|
|
2300
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
2301
|
+
};
|
|
2302
|
+
|
|
2303
|
+
export const updateImage = async (
|
|
2304
|
+
context: ApiContext,
|
|
2305
|
+
image: ImageType,
|
|
2306
|
+
s3Options?: PutObjectCommandInput
|
|
2307
|
+
): Promise<ImageType> => {
|
|
2308
|
+
const action: string = 'updateImage';
|
|
2309
|
+
const {database, session: {userId: sessionId}} = context;
|
|
2310
|
+
const {
|
|
2311
|
+
base64 = '',
|
|
2312
|
+
buffer: imageBuffer,
|
|
2313
|
+
description = '',
|
|
2314
|
+
imageId,
|
|
2315
|
+
itemId,
|
|
2316
|
+
itemType,
|
|
2317
|
+
fileType,
|
|
2318
|
+
url = ''
|
|
2319
|
+
} = image;
|
|
2320
|
+
|
|
2321
|
+
const now: number = Date.now();
|
|
2322
|
+
const formatImageId: string = imageId || createHash(`image-${sessionId}`);
|
|
2323
|
+
const formatItemId: string = parseId(itemId);
|
|
2324
|
+
const formatItemType: ArangoDbCollection = parseChar(itemType, 16).toLowerCase() as ArangoDbCollection;
|
|
2325
|
+
const customParams: ImageType = {
|
|
2326
|
+
description,
|
|
2327
|
+
imageId: formatImageId,
|
|
2328
|
+
userId: sessionId
|
|
2329
|
+
};
|
|
2330
|
+
|
|
2331
|
+
if(base64 || imageBuffer) {
|
|
2332
|
+
let buffer: Buffer = imageBuffer;
|
|
2333
|
+
|
|
2334
|
+
if(base64) {
|
|
2335
|
+
const formatBase64: string = base64.substr(base64.indexOf(',') + 1);
|
|
2336
|
+
buffer = Buffer.from(formatBase64, 'base64');
|
|
2337
|
+
}
|
|
2338
|
+
|
|
2339
|
+
let updatedFileType = fileType;
|
|
2340
|
+
|
|
2341
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if(!fileType) {
|
|
2342
|
+
const {fileTypeFromBuffer} = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >await import('</span>file-type');</span>
|
|
2343
|
+
const {mime} = <span class="cstat-no" title="statement not covered" >await fileTypeFromBuffer(buffer);</span>
|
|
2344
|
+
<span class="cstat-no" title="statement not covered" > updatedFileType = mime as any;</span>
|
|
2345
|
+
}
|
|
2346
|
+
|
|
2347
|
+
const imgParams: ImageType = {
|
|
2348
|
+
...customParams,
|
|
2349
|
+
buffer,
|
|
2350
|
+
fileType: updatedFileType
|
|
2351
|
+
};
|
|
2352
|
+
|
|
2353
|
+
return addImage(context, imgParams, s3Options)
|
|
2354
|
+
.then((image: ImageType) => {
|
|
2355
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if(formatItemId && <span class="branch-1 cbranch-no" title="branch not covered" >formatItemType)</span> {
|
|
2356
|
+
const imageEdge: ImageEdgeType = <span class="cstat-no" title="statement not covered" >{</span>
|
|
2357
|
+
imageId: formatImageId,
|
|
2358
|
+
itemId: formatItemId,
|
|
2359
|
+
itemType: formatItemType
|
|
2360
|
+
};
|
|
2361
|
+
<span class="cstat-no" title="statement not covered" > return addImageEdge(context, imageEdge).then(<span class="fstat-no" title="function not covered" >() =</span>> <span class="cstat-no" title="statement not covered" >image)</span>;</span>
|
|
2362
|
+
}
|
|
2363
|
+
|
|
2364
|
+
return image;
|
|
2365
|
+
})
|
|
2366
|
+
.catch(<span class="fstat-no" title="function not covered" >(e</span>rror) => <span class="cstat-no" title="statement not covered" >logError({</span>
|
|
2367
|
+
action,
|
|
2368
|
+
category: eventCategory,
|
|
2369
|
+
value: ErrorTypes.IMAGE_SAVE
|
|
2370
|
+
}, error, context));
|
|
2371
|
+
} else if(url !== '') {
|
|
2372
|
+
let contentType: MimeType;
|
|
2373
|
+
|
|
2374
|
+
return httpGet(url)
|
|
2375
|
+
.then((res: Response) => {
|
|
2376
|
+
if(res.status !== 200) {
|
|
2377
|
+
return logException({
|
|
2378
|
+
action,
|
|
2379
|
+
category: eventCategory,
|
|
2380
|
+
value: ErrorTypes.IMAGE_REQUEST
|
|
2381
|
+
}, context);
|
|
2382
|
+
}
|
|
2383
|
+
|
|
2384
|
+
contentType = res.headers.get('content-type') as MimeType;
|
|
2385
|
+
|
|
2386
|
+
return res;
|
|
2387
|
+
})
|
|
2388
|
+
.then((res) => res.buffer())
|
|
2389
|
+
.then((buffer: Buffer) => {
|
|
2390
|
+
const imgParams: ImageType = {
|
|
2391
|
+
...customParams,
|
|
2392
|
+
buffer,
|
|
2393
|
+
fileType: contentType
|
|
2394
|
+
};
|
|
2395
|
+
|
|
2396
|
+
return addImage(context, imgParams, s3Options)
|
|
2397
|
+
.then((image: ImageType) => {
|
|
2398
|
+
if(formatItemId && formatItemType) {
|
|
2399
|
+
const imageEdge: ImageEdgeType = {imageId: formatImageId, itemId: formatItemId, itemType: formatItemType};
|
|
2400
|
+
return addImageEdge(context, imageEdge).then(() => image);
|
|
2401
|
+
}
|
|
2402
|
+
|
|
2403
|
+
return image;
|
|
2404
|
+
});
|
|
2405
|
+
})
|
|
2406
|
+
.catch((error: Error) => logError({
|
|
2407
|
+
action,
|
|
2408
|
+
category: eventCategory,
|
|
2409
|
+
value: 'fetch_error'
|
|
2410
|
+
}, error, context));
|
|
2411
|
+
} else if(imageId !== '') {
|
|
2412
|
+
const update: any = {
|
|
2413
|
+
description,
|
|
2414
|
+
modified: now
|
|
2415
|
+
};
|
|
2416
|
+
const aqlQry: AqlQuery = aql`UPDATE {_key: ${formatImageId}} WITH ${update} IN images RETURN NEW`;
|
|
2417
|
+
|
|
2418
|
+
return database.query(aqlQry)
|
|
2419
|
+
.then((cursor: ArrayCursor) => cursor.next())
|
|
2420
|
+
.catch((error: Error) => logError({
|
|
2421
|
+
action,
|
|
2422
|
+
category: eventCategory,
|
|
2423
|
+
params: {
|
|
2424
|
+
aqlQry,
|
|
2425
|
+
formatImageId,
|
|
2426
|
+
update
|
|
2427
|
+
},
|
|
2428
|
+
value: ErrorTypes.DATABASE_ERROR
|
|
2429
|
+
}, error, context));
|
|
2430
|
+
}
|
|
2431
|
+
|
|
2432
|
+
return null;
|
|
2433
|
+
};
|
|
2434
|
+
|
|
2435
|
+
export const deleteImage = async (context: ApiContext, imageId: string): Promise<ImageType> => {
|
|
2436
|
+
const action: string = 'delete';
|
|
2437
|
+
const {database, session: {userId: sessionId}} = context;
|
|
2438
|
+
const formatImageId = parseId(imageId);
|
|
2439
|
+
|
|
2440
|
+
try {
|
|
2441
|
+
const removeEdgeQuery = aql`FOR hi IN hasImage
|
|
2442
|
+
FILTER hi._from == ${formatImageId}
|
|
2443
|
+
REMOVE hi IN hasImage
|
|
2444
|
+
RETURN OLD`;
|
|
2445
|
+
|
|
2446
|
+
await database.query(removeEdgeQuery);
|
|
2447
|
+
|
|
2448
|
+
const aqlQuery = aql`FOR i IN images
|
|
2449
|
+
FILTER i._key == ${formatImageId} && i.userId == ${sessionId}
|
|
2450
|
+
REMOVE i IN images
|
|
2451
|
+
RETURN OLD`;
|
|
2452
|
+
|
|
2453
|
+
const image = await database.query(aqlQuery).then((cursor: ArrayCursor) => cursor.next());
|
|
2454
|
+
|
|
2455
|
+
if(image) {
|
|
2456
|
+
const {_key: imageKey} = image;
|
|
2457
|
+
const params: DeleteObjectsCommandInput = {
|
|
2458
|
+
Bucket: null,
|
|
2459
|
+
Delete: {
|
|
2460
|
+
Objects: [
|
|
2461
|
+
{Key: `users/${sessionId}/images/${imageKey}.jpg`},
|
|
2462
|
+
{Key: `users/${sessionId}/thumbs/${imageKey}.jpg`}
|
|
2463
|
+
],
|
|
2464
|
+
Quiet: true
|
|
2465
|
+
}
|
|
2466
|
+
};
|
|
2467
|
+
|
|
2468
|
+
return s3DeleteList(params).then(() => image);
|
|
2469
|
+
}
|
|
2470
|
+
|
|
2471
|
+
return null;
|
|
2472
|
+
} catch(error) {
|
|
2473
|
+
return logError({
|
|
2474
|
+
action,
|
|
2475
|
+
category: eventCategory,
|
|
2476
|
+
params: {imageId},
|
|
2477
|
+
value: ErrorTypes.DATABASE_ERROR
|
|
2478
|
+
}, error, context);
|
|
2479
|
+
}
|
|
2480
|
+
};
|
|
2481
|
+
</pre></td></tr></table></pre>
|
|
2482
|
+
|
|
2483
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
2484
|
+
</div><!-- /wrapper -->
|
|
2485
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
2486
|
+
Code coverage generated by
|
|
2487
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
2488
|
+
at 2025-01-29T02:48:08.836Z
|
|
2489
|
+
</div>
|
|
2490
|
+
<script src="../prettify.js"></script>
|
|
2491
|
+
<script>
|
|
2492
|
+
window.onload = function () {
|
|
2493
|
+
prettyPrint();
|
|
2494
|
+
};
|
|
2495
|
+
</script>
|
|
2496
|
+
<script src="../sorter.js"></script>
|
|
2497
|
+
<script src="../block-navigation.js"></script>
|
|
2498
|
+
</body>
|
|
2499
|
+
</html>
|
|
2500
|
+
|