expo-iap 2.8.2 → 2.8.3-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/CHANGELOG.md +0 -10
  2. package/CLAUDE.md +11 -0
  3. package/CONTRIBUTING.md +3 -4
  4. package/build/helpers/subscription.d.ts.map +1 -1
  5. package/build/helpers/subscription.js +3 -6
  6. package/build/helpers/subscription.js.map +1 -1
  7. package/build/index.d.ts.map +1 -1
  8. package/build/index.js +3 -1
  9. package/build/index.js.map +1 -1
  10. package/build/modules/android.d.ts.map +1 -1
  11. package/build/modules/android.js.map +1 -1
  12. package/build/modules/ios.d.ts.map +1 -1
  13. package/build/modules/ios.js.map +1 -1
  14. package/build/types/ExpoIapAndroid.types.d.ts +2 -2
  15. package/build/types/ExpoIapAndroid.types.d.ts.map +1 -1
  16. package/build/types/ExpoIapAndroid.types.js.map +1 -1
  17. package/build/types/ExpoIapIOS.types.d.ts +3 -3
  18. package/build/types/ExpoIapIOS.types.d.ts.map +1 -1
  19. package/build/types/ExpoIapIOS.types.js.map +1 -1
  20. package/build/useIAP.d.ts.map +1 -1
  21. package/build/useIAP.js.map +1 -1
  22. package/coverage/clover.xml +601 -0
  23. package/coverage/coverage-final.json +9 -0
  24. package/coverage/lcov-report/base.css +224 -0
  25. package/coverage/lcov-report/block-navigation.js +87 -0
  26. package/coverage/lcov-report/favicon.png +0 -0
  27. package/coverage/lcov-report/index.html +176 -0
  28. package/coverage/lcov-report/prettify.css +1 -0
  29. package/coverage/lcov-report/prettify.js +2 -0
  30. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  31. package/coverage/lcov-report/sorter.js +210 -0
  32. package/coverage/lcov-report/src/ExpoIap.types.ts.html +1243 -0
  33. package/coverage/lcov-report/src/helpers/index.html +116 -0
  34. package/coverage/lcov-report/src/helpers/subscription.ts.html +430 -0
  35. package/coverage/lcov-report/src/index.html +146 -0
  36. package/coverage/lcov-report/src/index.ts.html +2227 -0
  37. package/coverage/lcov-report/src/modules/android.ts.html +469 -0
  38. package/coverage/lcov-report/src/modules/index.html +131 -0
  39. package/coverage/lcov-report/src/modules/ios.ts.html +1411 -0
  40. package/coverage/lcov-report/src/types/ExpoIapAndroid.types.ts.html +487 -0
  41. package/coverage/lcov-report/src/types/index.html +116 -0
  42. package/coverage/lcov-report/src/useIap.ts.html +1483 -0
  43. package/coverage/lcov-report/src/utils/errorMapping.ts.html +349 -0
  44. package/coverage/lcov-report/src/utils/index.html +116 -0
  45. package/coverage/lcov.info +1115 -0
  46. package/ios/ExpoIap.podspec +6 -1
  47. package/ios/expoiap.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  48. package/ios/expoiap.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  49. package/jest.config.js +14 -17
  50. package/package.json +1 -1
  51. package/plugin/build/withIAP.js +16 -3
  52. package/plugin/src/withIAP.ts +22 -3
  53. package/plugin/tsconfig.tsbuildinfo +1 -1
  54. package/src/helpers/subscription.ts +21 -28
  55. package/src/index.ts +10 -5
  56. package/src/modules/android.ts +7 -7
  57. package/src/modules/ios.ts +7 -2
  58. package/src/types/ExpoIapAndroid.types.ts +3 -4
  59. package/src/types/ExpoIapIOS.types.ts +4 -3
  60. package/src/useIAP.ts +9 -3
@@ -0,0 +1,1483 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/useIap.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">src</a> useIap.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">3.49% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>5/143</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">0% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>0/15</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">0% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>0/36</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">3.52% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>5/142</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 low'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
533
+ <span class="cline-any cline-yes">1x</span>
534
+ <span class="cline-any cline-yes">1x</span>
535
+ <span class="cline-any cline-neutral">&nbsp;</span>
536
+ <span class="cline-any cline-neutral">&nbsp;</span>
537
+ <span class="cline-any cline-neutral">&nbsp;</span>
538
+ <span class="cline-any cline-yes">1x</span>
539
+ <span class="cline-any cline-neutral">&nbsp;</span>
540
+ <span class="cline-any cline-neutral">&nbsp;</span>
541
+ <span class="cline-any cline-neutral">&nbsp;</span>
542
+ <span class="cline-any cline-neutral">&nbsp;</span>
543
+ <span class="cline-any cline-neutral">&nbsp;</span>
544
+ <span class="cline-any cline-neutral">&nbsp;</span>
545
+ <span class="cline-any cline-neutral">&nbsp;</span>
546
+ <span class="cline-any cline-neutral">&nbsp;</span>
547
+ <span class="cline-any cline-neutral">&nbsp;</span>
548
+ <span class="cline-any cline-neutral">&nbsp;</span>
549
+ <span class="cline-any cline-neutral">&nbsp;</span>
550
+ <span class="cline-any cline-neutral">&nbsp;</span>
551
+ <span class="cline-any cline-neutral">&nbsp;</span>
552
+ <span class="cline-any cline-neutral">&nbsp;</span>
553
+ <span class="cline-any cline-neutral">&nbsp;</span>
554
+ <span class="cline-any cline-yes">1x</span>
555
+ <span class="cline-any cline-neutral">&nbsp;</span>
556
+ <span class="cline-any cline-neutral">&nbsp;</span>
557
+ <span class="cline-any cline-neutral">&nbsp;</span>
558
+ <span class="cline-any cline-neutral">&nbsp;</span>
559
+ <span class="cline-any cline-neutral">&nbsp;</span>
560
+ <span class="cline-any cline-neutral">&nbsp;</span>
561
+ <span class="cline-any cline-neutral">&nbsp;</span>
562
+ <span class="cline-any cline-neutral">&nbsp;</span>
563
+ <span class="cline-any cline-neutral">&nbsp;</span>
564
+ <span class="cline-any cline-neutral">&nbsp;</span>
565
+ <span class="cline-any cline-neutral">&nbsp;</span>
566
+ <span class="cline-any cline-neutral">&nbsp;</span>
567
+ <span class="cline-any cline-neutral">&nbsp;</span>
568
+ <span class="cline-any cline-neutral">&nbsp;</span>
569
+ <span class="cline-any cline-neutral">&nbsp;</span>
570
+ <span class="cline-any cline-neutral">&nbsp;</span>
571
+ <span class="cline-any cline-neutral">&nbsp;</span>
572
+ <span class="cline-any cline-neutral">&nbsp;</span>
573
+ <span class="cline-any cline-neutral">&nbsp;</span>
574
+ <span class="cline-any cline-neutral">&nbsp;</span>
575
+ <span class="cline-any cline-neutral">&nbsp;</span>
576
+ <span class="cline-any cline-neutral">&nbsp;</span>
577
+ <span class="cline-any cline-neutral">&nbsp;</span>
578
+ <span class="cline-any cline-neutral">&nbsp;</span>
579
+ <span class="cline-any cline-neutral">&nbsp;</span>
580
+ <span class="cline-any cline-neutral">&nbsp;</span>
581
+ <span class="cline-any cline-neutral">&nbsp;</span>
582
+ <span class="cline-any cline-neutral">&nbsp;</span>
583
+ <span class="cline-any cline-neutral">&nbsp;</span>
584
+ <span class="cline-any cline-neutral">&nbsp;</span>
585
+ <span class="cline-any cline-neutral">&nbsp;</span>
586
+ <span class="cline-any cline-neutral">&nbsp;</span>
587
+ <span class="cline-any cline-neutral">&nbsp;</span>
588
+ <span class="cline-any cline-neutral">&nbsp;</span>
589
+ <span class="cline-any cline-neutral">&nbsp;</span>
590
+ <span class="cline-any cline-neutral">&nbsp;</span>
591
+ <span class="cline-any cline-neutral">&nbsp;</span>
592
+ <span class="cline-any cline-neutral">&nbsp;</span>
593
+ <span class="cline-any cline-neutral">&nbsp;</span>
594
+ <span class="cline-any cline-neutral">&nbsp;</span>
595
+ <span class="cline-any cline-neutral">&nbsp;</span>
596
+ <span class="cline-any cline-neutral">&nbsp;</span>
597
+ <span class="cline-any cline-neutral">&nbsp;</span>
598
+ <span class="cline-any cline-neutral">&nbsp;</span>
599
+ <span class="cline-any cline-neutral">&nbsp;</span>
600
+ <span class="cline-any cline-neutral">&nbsp;</span>
601
+ <span class="cline-any cline-neutral">&nbsp;</span>
602
+ <span class="cline-any cline-neutral">&nbsp;</span>
603
+ <span class="cline-any cline-neutral">&nbsp;</span>
604
+ <span class="cline-any cline-neutral">&nbsp;</span>
605
+ <span class="cline-any cline-neutral">&nbsp;</span>
606
+ <span class="cline-any cline-neutral">&nbsp;</span>
607
+ <span class="cline-any cline-neutral">&nbsp;</span>
608
+ <span class="cline-any cline-neutral">&nbsp;</span>
609
+ <span class="cline-any cline-neutral">&nbsp;</span>
610
+ <span class="cline-any cline-neutral">&nbsp;</span>
611
+ <span class="cline-any cline-neutral">&nbsp;</span>
612
+ <span class="cline-any cline-neutral">&nbsp;</span>
613
+ <span class="cline-any cline-neutral">&nbsp;</span>
614
+ <span class="cline-any cline-neutral">&nbsp;</span>
615
+ <span class="cline-any cline-neutral">&nbsp;</span>
616
+ <span class="cline-any cline-neutral">&nbsp;</span>
617
+ <span class="cline-any cline-neutral">&nbsp;</span>
618
+ <span class="cline-any cline-neutral">&nbsp;</span>
619
+ <span class="cline-any cline-neutral">&nbsp;</span>
620
+ <span class="cline-any cline-neutral">&nbsp;</span>
621
+ <span class="cline-any cline-neutral">&nbsp;</span>
622
+ <span class="cline-any cline-neutral">&nbsp;</span>
623
+ <span class="cline-any cline-neutral">&nbsp;</span>
624
+ <span class="cline-any cline-neutral">&nbsp;</span>
625
+ <span class="cline-any cline-neutral">&nbsp;</span>
626
+ <span class="cline-any cline-neutral">&nbsp;</span>
627
+ <span class="cline-any cline-neutral">&nbsp;</span>
628
+ <span class="cline-any cline-neutral">&nbsp;</span>
629
+ <span class="cline-any cline-neutral">&nbsp;</span>
630
+ <span class="cline-any cline-neutral">&nbsp;</span>
631
+ <span class="cline-any cline-neutral">&nbsp;</span>
632
+ <span class="cline-any cline-neutral">&nbsp;</span>
633
+ <span class="cline-any cline-neutral">&nbsp;</span>
634
+ <span class="cline-any cline-neutral">&nbsp;</span>
635
+ <span class="cline-any cline-neutral">&nbsp;</span>
636
+ <span class="cline-any cline-neutral">&nbsp;</span>
637
+ <span class="cline-any cline-neutral">&nbsp;</span>
638
+ <span class="cline-any cline-neutral">&nbsp;</span>
639
+ <span class="cline-any cline-neutral">&nbsp;</span>
640
+ <span class="cline-any cline-neutral">&nbsp;</span>
641
+ <span class="cline-any cline-neutral">&nbsp;</span>
642
+ <span class="cline-any cline-yes">1x</span>
643
+ <span class="cline-any cline-no">&nbsp;</span>
644
+ <span class="cline-any cline-no">&nbsp;</span>
645
+ <span class="cline-any cline-no">&nbsp;</span>
646
+ <span class="cline-any cline-no">&nbsp;</span>
647
+ <span class="cline-any cline-no">&nbsp;</span>
648
+ <span class="cline-any cline-neutral">&nbsp;</span>
649
+ <span class="cline-any cline-neutral">&nbsp;</span>
650
+ <span class="cline-any cline-no">&nbsp;</span>
651
+ <span class="cline-any cline-neutral">&nbsp;</span>
652
+ <span class="cline-any cline-neutral">&nbsp;</span>
653
+ <span class="cline-any cline-no">&nbsp;</span>
654
+ <span class="cline-any cline-no">&nbsp;</span>
655
+ <span class="cline-any cline-neutral">&nbsp;</span>
656
+ <span class="cline-any cline-no">&nbsp;</span>
657
+ <span class="cline-any cline-no">&nbsp;</span>
658
+ <span class="cline-any cline-no">&nbsp;</span>
659
+ <span class="cline-any cline-neutral">&nbsp;</span>
660
+ <span class="cline-any cline-neutral">&nbsp;</span>
661
+ <span class="cline-any cline-neutral">&nbsp;</span>
662
+ <span class="cline-any cline-no">&nbsp;</span>
663
+ <span class="cline-any cline-neutral">&nbsp;</span>
664
+ <span class="cline-any cline-neutral">&nbsp;</span>
665
+ <span class="cline-any cline-no">&nbsp;</span>
666
+ <span class="cline-any cline-neutral">&nbsp;</span>
667
+ <span class="cline-any cline-neutral">&nbsp;</span>
668
+ <span class="cline-any cline-neutral">&nbsp;</span>
669
+ <span class="cline-any cline-neutral">&nbsp;</span>
670
+ <span class="cline-any cline-neutral">&nbsp;</span>
671
+ <span class="cline-any cline-no">&nbsp;</span>
672
+ <span class="cline-any cline-no">&nbsp;</span>
673
+ <span class="cline-any cline-no">&nbsp;</span>
674
+ <span class="cline-any cline-no">&nbsp;</span>
675
+ <span class="cline-any cline-neutral">&nbsp;</span>
676
+ <span class="cline-any cline-no">&nbsp;</span>
677
+ <span class="cline-any cline-no">&nbsp;</span>
678
+ <span class="cline-any cline-neutral">&nbsp;</span>
679
+ <span class="cline-any cline-neutral">&nbsp;</span>
680
+ <span class="cline-any cline-no">&nbsp;</span>
681
+ <span class="cline-any cline-neutral">&nbsp;</span>
682
+ <span class="cline-any cline-neutral">&nbsp;</span>
683
+ <span class="cline-any cline-neutral">&nbsp;</span>
684
+ <span class="cline-any cline-neutral">&nbsp;</span>
685
+ <span class="cline-any cline-no">&nbsp;</span>
686
+ <span class="cline-any cline-no">&nbsp;</span>
687
+ <span class="cline-any cline-neutral">&nbsp;</span>
688
+ <span class="cline-any cline-neutral">&nbsp;</span>
689
+ <span class="cline-any cline-no">&nbsp;</span>
690
+ <span class="cline-any cline-neutral">&nbsp;</span>
691
+ <span class="cline-any cline-neutral">&nbsp;</span>
692
+ <span class="cline-any cline-neutral">&nbsp;</span>
693
+ <span class="cline-any cline-neutral">&nbsp;</span>
694
+ <span class="cline-any cline-neutral">&nbsp;</span>
695
+ <span class="cline-any cline-neutral">&nbsp;</span>
696
+ <span class="cline-any cline-no">&nbsp;</span>
697
+ <span class="cline-any cline-neutral">&nbsp;</span>
698
+ <span class="cline-any cline-no">&nbsp;</span>
699
+ <span class="cline-any cline-no">&nbsp;</span>
700
+ <span class="cline-any cline-neutral">&nbsp;</span>
701
+ <span class="cline-any cline-neutral">&nbsp;</span>
702
+ <span class="cline-any cline-no">&nbsp;</span>
703
+ <span class="cline-any cline-no">&nbsp;</span>
704
+ <span class="cline-any cline-neutral">&nbsp;</span>
705
+ <span class="cline-any cline-neutral">&nbsp;</span>
706
+ <span class="cline-any cline-no">&nbsp;</span>
707
+ <span class="cline-any cline-no">&nbsp;</span>
708
+ <span class="cline-any cline-neutral">&nbsp;</span>
709
+ <span class="cline-any cline-neutral">&nbsp;</span>
710
+ <span class="cline-any cline-no">&nbsp;</span>
711
+ <span class="cline-any cline-neutral">&nbsp;</span>
712
+ <span class="cline-any cline-no">&nbsp;</span>
713
+ <span class="cline-any cline-no">&nbsp;</span>
714
+ <span class="cline-any cline-no">&nbsp;</span>
715
+ <span class="cline-any cline-no">&nbsp;</span>
716
+ <span class="cline-any cline-neutral">&nbsp;</span>
717
+ <span class="cline-any cline-neutral">&nbsp;</span>
718
+ <span class="cline-any cline-no">&nbsp;</span>
719
+ <span class="cline-any cline-neutral">&nbsp;</span>
720
+ <span class="cline-any cline-neutral">&nbsp;</span>
721
+ <span class="cline-any cline-neutral">&nbsp;</span>
722
+ <span class="cline-any cline-no">&nbsp;</span>
723
+ <span class="cline-any cline-neutral">&nbsp;</span>
724
+ <span class="cline-any cline-neutral">&nbsp;</span>
725
+ <span class="cline-any cline-neutral">&nbsp;</span>
726
+ <span class="cline-any cline-neutral">&nbsp;</span>
727
+ <span class="cline-any cline-neutral">&nbsp;</span>
728
+ <span class="cline-any cline-no">&nbsp;</span>
729
+ <span class="cline-any cline-neutral">&nbsp;</span>
730
+ <span class="cline-any cline-no">&nbsp;</span>
731
+ <span class="cline-any cline-no">&nbsp;</span>
732
+ <span class="cline-any cline-no">&nbsp;</span>
733
+ <span class="cline-any cline-no">&nbsp;</span>
734
+ <span class="cline-any cline-neutral">&nbsp;</span>
735
+ <span class="cline-any cline-neutral">&nbsp;</span>
736
+ <span class="cline-any cline-no">&nbsp;</span>
737
+ <span class="cline-any cline-neutral">&nbsp;</span>
738
+ <span class="cline-any cline-neutral">&nbsp;</span>
739
+ <span class="cline-any cline-neutral">&nbsp;</span>
740
+ <span class="cline-any cline-no">&nbsp;</span>
741
+ <span class="cline-any cline-neutral">&nbsp;</span>
742
+ <span class="cline-any cline-neutral">&nbsp;</span>
743
+ <span class="cline-any cline-neutral">&nbsp;</span>
744
+ <span class="cline-any cline-neutral">&nbsp;</span>
745
+ <span class="cline-any cline-neutral">&nbsp;</span>
746
+ <span class="cline-any cline-no">&nbsp;</span>
747
+ <span class="cline-any cline-neutral">&nbsp;</span>
748
+ <span class="cline-any cline-neutral">&nbsp;</span>
749
+ <span class="cline-any cline-neutral">&nbsp;</span>
750
+ <span class="cline-any cline-neutral">&nbsp;</span>
751
+ <span class="cline-any cline-no">&nbsp;</span>
752
+ <span class="cline-any cline-no">&nbsp;</span>
753
+ <span class="cline-any cline-no">&nbsp;</span>
754
+ <span class="cline-any cline-no">&nbsp;</span>
755
+ <span class="cline-any cline-no">&nbsp;</span>
756
+ <span class="cline-any cline-neutral">&nbsp;</span>
757
+ <span class="cline-any cline-neutral">&nbsp;</span>
758
+ <span class="cline-any cline-no">&nbsp;</span>
759
+ <span class="cline-any cline-neutral">&nbsp;</span>
760
+ <span class="cline-any cline-neutral">&nbsp;</span>
761
+ <span class="cline-any cline-neutral">&nbsp;</span>
762
+ <span class="cline-any cline-no">&nbsp;</span>
763
+ <span class="cline-any cline-no">&nbsp;</span>
764
+ <span class="cline-any cline-neutral">&nbsp;</span>
765
+ <span class="cline-any cline-neutral">&nbsp;</span>
766
+ <span class="cline-any cline-no">&nbsp;</span>
767
+ <span class="cline-any cline-neutral">&nbsp;</span>
768
+ <span class="cline-any cline-neutral">&nbsp;</span>
769
+ <span class="cline-any cline-neutral">&nbsp;</span>
770
+ <span class="cline-any cline-neutral">&nbsp;</span>
771
+ <span class="cline-any cline-no">&nbsp;</span>
772
+ <span class="cline-any cline-neutral">&nbsp;</span>
773
+ <span class="cline-any cline-neutral">&nbsp;</span>
774
+ <span class="cline-any cline-neutral">&nbsp;</span>
775
+ <span class="cline-any cline-neutral">&nbsp;</span>
776
+ <span class="cline-any cline-neutral">&nbsp;</span>
777
+ <span class="cline-any cline-no">&nbsp;</span>
778
+ <span class="cline-any cline-no">&nbsp;</span>
779
+ <span class="cline-any cline-no">&nbsp;</span>
780
+ <span class="cline-any cline-no">&nbsp;</span>
781
+ <span class="cline-any cline-neutral">&nbsp;</span>
782
+ <span class="cline-any cline-no">&nbsp;</span>
783
+ <span class="cline-any cline-neutral">&nbsp;</span>
784
+ <span class="cline-any cline-neutral">&nbsp;</span>
785
+ <span class="cline-any cline-neutral">&nbsp;</span>
786
+ <span class="cline-any cline-no">&nbsp;</span>
787
+ <span class="cline-any cline-neutral">&nbsp;</span>
788
+ <span class="cline-any cline-no">&nbsp;</span>
789
+ <span class="cline-any cline-no">&nbsp;</span>
790
+ <span class="cline-any cline-no">&nbsp;</span>
791
+ <span class="cline-any cline-no">&nbsp;</span>
792
+ <span class="cline-any cline-neutral">&nbsp;</span>
793
+ <span class="cline-any cline-no">&nbsp;</span>
794
+ <span class="cline-any cline-neutral">&nbsp;</span>
795
+ <span class="cline-any cline-neutral">&nbsp;</span>
796
+ <span class="cline-any cline-no">&nbsp;</span>
797
+ <span class="cline-any cline-neutral">&nbsp;</span>
798
+ <span class="cline-any cline-neutral">&nbsp;</span>
799
+ <span class="cline-any cline-neutral">&nbsp;</span>
800
+ <span class="cline-any cline-neutral">&nbsp;</span>
801
+ <span class="cline-any cline-neutral">&nbsp;</span>
802
+ <span class="cline-any cline-no">&nbsp;</span>
803
+ <span class="cline-any cline-neutral">&nbsp;</span>
804
+ <span class="cline-any cline-no">&nbsp;</span>
805
+ <span class="cline-any cline-no">&nbsp;</span>
806
+ <span class="cline-any cline-neutral">&nbsp;</span>
807
+ <span class="cline-any cline-no">&nbsp;</span>
808
+ <span class="cline-any cline-no">&nbsp;</span>
809
+ <span class="cline-any cline-neutral">&nbsp;</span>
810
+ <span class="cline-any cline-neutral">&nbsp;</span>
811
+ <span class="cline-any cline-neutral">&nbsp;</span>
812
+ <span class="cline-any cline-neutral">&nbsp;</span>
813
+ <span class="cline-any cline-neutral">&nbsp;</span>
814
+ <span class="cline-any cline-no">&nbsp;</span>
815
+ <span class="cline-any cline-no">&nbsp;</span>
816
+ <span class="cline-any cline-neutral">&nbsp;</span>
817
+ <span class="cline-any cline-neutral">&nbsp;</span>
818
+ <span class="cline-any cline-no">&nbsp;</span>
819
+ <span class="cline-any cline-neutral">&nbsp;</span>
820
+ <span class="cline-any cline-neutral">&nbsp;</span>
821
+ <span class="cline-any cline-neutral">&nbsp;</span>
822
+ <span class="cline-any cline-neutral">&nbsp;</span>
823
+ <span class="cline-any cline-neutral">&nbsp;</span>
824
+ <span class="cline-any cline-neutral">&nbsp;</span>
825
+ <span class="cline-any cline-neutral">&nbsp;</span>
826
+ <span class="cline-any cline-no">&nbsp;</span>
827
+ <span class="cline-any cline-no">&nbsp;</span>
828
+ <span class="cline-any cline-neutral">&nbsp;</span>
829
+ <span class="cline-any cline-neutral">&nbsp;</span>
830
+ <span class="cline-any cline-neutral">&nbsp;</span>
831
+ <span class="cline-any cline-neutral">&nbsp;</span>
832
+ <span class="cline-any cline-no">&nbsp;</span>
833
+ <span class="cline-any cline-neutral">&nbsp;</span>
834
+ <span class="cline-any cline-no">&nbsp;</span>
835
+ <span class="cline-any cline-no">&nbsp;</span>
836
+ <span class="cline-any cline-neutral">&nbsp;</span>
837
+ <span class="cline-any cline-no">&nbsp;</span>
838
+ <span class="cline-any cline-no">&nbsp;</span>
839
+ <span class="cline-any cline-neutral">&nbsp;</span>
840
+ <span class="cline-any cline-neutral">&nbsp;</span>
841
+ <span class="cline-any cline-neutral">&nbsp;</span>
842
+ <span class="cline-any cline-neutral">&nbsp;</span>
843
+ <span class="cline-any cline-neutral">&nbsp;</span>
844
+ <span class="cline-any cline-neutral">&nbsp;</span>
845
+ <span class="cline-any cline-neutral">&nbsp;</span>
846
+ <span class="cline-any cline-neutral">&nbsp;</span>
847
+ <span class="cline-any cline-neutral">&nbsp;</span>
848
+ <span class="cline-any cline-neutral">&nbsp;</span>
849
+ <span class="cline-any cline-neutral">&nbsp;</span>
850
+ <span class="cline-any cline-no">&nbsp;</span>
851
+ <span class="cline-any cline-neutral">&nbsp;</span>
852
+ <span class="cline-any cline-no">&nbsp;</span>
853
+ <span class="cline-any cline-no">&nbsp;</span>
854
+ <span class="cline-any cline-neutral">&nbsp;</span>
855
+ <span class="cline-any cline-no">&nbsp;</span>
856
+ <span class="cline-any cline-no">&nbsp;</span>
857
+ <span class="cline-any cline-neutral">&nbsp;</span>
858
+ <span class="cline-any cline-no">&nbsp;</span>
859
+ <span class="cline-any cline-neutral">&nbsp;</span>
860
+ <span class="cline-any cline-neutral">&nbsp;</span>
861
+ <span class="cline-any cline-neutral">&nbsp;</span>
862
+ <span class="cline-any cline-neutral">&nbsp;</span>
863
+ <span class="cline-any cline-neutral">&nbsp;</span>
864
+ <span class="cline-any cline-no">&nbsp;</span>
865
+ <span class="cline-any cline-neutral">&nbsp;</span>
866
+ <span class="cline-any cline-no">&nbsp;</span>
867
+ <span class="cline-any cline-no">&nbsp;</span>
868
+ <span class="cline-any cline-no">&nbsp;</span>
869
+ <span class="cline-any cline-no">&nbsp;</span>
870
+ <span class="cline-any cline-neutral">&nbsp;</span>
871
+ <span class="cline-any cline-neutral">&nbsp;</span>
872
+ <span class="cline-any cline-no">&nbsp;</span>
873
+ <span class="cline-any cline-neutral">&nbsp;</span>
874
+ <span class="cline-any cline-neutral">&nbsp;</span>
875
+ <span class="cline-any cline-neutral">&nbsp;</span>
876
+ <span class="cline-any cline-neutral">&nbsp;</span>
877
+ <span class="cline-any cline-neutral">&nbsp;</span>
878
+ <span class="cline-any cline-no">&nbsp;</span>
879
+ <span class="cline-any cline-no">&nbsp;</span>
880
+ <span class="cline-any cline-no">&nbsp;</span>
881
+ <span class="cline-any cline-no">&nbsp;</span>
882
+ <span class="cline-any cline-no">&nbsp;</span>
883
+ <span class="cline-any cline-no">&nbsp;</span>
884
+ <span class="cline-any cline-neutral">&nbsp;</span>
885
+ <span class="cline-any cline-no">&nbsp;</span>
886
+ <span class="cline-any cline-neutral">&nbsp;</span>
887
+ <span class="cline-any cline-neutral">&nbsp;</span>
888
+ <span class="cline-any cline-neutral">&nbsp;</span>
889
+ <span class="cline-any cline-no">&nbsp;</span>
890
+ <span class="cline-any cline-neutral">&nbsp;</span>
891
+ <span class="cline-any cline-no">&nbsp;</span>
892
+ <span class="cline-any cline-neutral">&nbsp;</span>
893
+ <span class="cline-any cline-neutral">&nbsp;</span>
894
+ <span class="cline-any cline-neutral">&nbsp;</span>
895
+ <span class="cline-any cline-no">&nbsp;</span>
896
+ <span class="cline-any cline-neutral">&nbsp;</span>
897
+ <span class="cline-any cline-neutral">&nbsp;</span>
898
+ <span class="cline-any cline-neutral">&nbsp;</span>
899
+ <span class="cline-any cline-neutral">&nbsp;</span>
900
+ <span class="cline-any cline-neutral">&nbsp;</span>
901
+ <span class="cline-any cline-neutral">&nbsp;</span>
902
+ <span class="cline-any cline-neutral">&nbsp;</span>
903
+ <span class="cline-any cline-neutral">&nbsp;</span>
904
+ <span class="cline-any cline-neutral">&nbsp;</span>
905
+ <span class="cline-any cline-no">&nbsp;</span>
906
+ <span class="cline-any cline-neutral">&nbsp;</span>
907
+ <span class="cline-any cline-neutral">&nbsp;</span>
908
+ <span class="cline-any cline-neutral">&nbsp;</span>
909
+ <span class="cline-any cline-neutral">&nbsp;</span>
910
+ <span class="cline-any cline-no">&nbsp;</span>
911
+ <span class="cline-any cline-no">&nbsp;</span>
912
+ <span class="cline-any cline-no">&nbsp;</span>
913
+ <span class="cline-any cline-neutral">&nbsp;</span>
914
+ <span class="cline-any cline-no">&nbsp;</span>
915
+ <span class="cline-any cline-no">&nbsp;</span>
916
+ <span class="cline-any cline-neutral">&nbsp;</span>
917
+ <span class="cline-any cline-no">&nbsp;</span>
918
+ <span class="cline-any cline-no">&nbsp;</span>
919
+ <span class="cline-any cline-neutral">&nbsp;</span>
920
+ <span class="cline-any cline-no">&nbsp;</span>
921
+ <span class="cline-any cline-no">&nbsp;</span>
922
+ <span class="cline-any cline-neutral">&nbsp;</span>
923
+ <span class="cline-any cline-neutral">&nbsp;</span>
924
+ <span class="cline-any cline-no">&nbsp;</span>
925
+ <span class="cline-any cline-no">&nbsp;</span>
926
+ <span class="cline-any cline-neutral">&nbsp;</span>
927
+ <span class="cline-any cline-neutral">&nbsp;</span>
928
+ <span class="cline-any cline-neutral">&nbsp;</span>
929
+ <span class="cline-any cline-neutral">&nbsp;</span>
930
+ <span class="cline-any cline-no">&nbsp;</span>
931
+ <span class="cline-any cline-neutral">&nbsp;</span>
932
+ <span class="cline-any cline-no">&nbsp;</span>
933
+ <span class="cline-any cline-no">&nbsp;</span>
934
+ <span class="cline-any cline-neutral">&nbsp;</span>
935
+ <span class="cline-any cline-no">&nbsp;</span>
936
+ <span class="cline-any cline-no">&nbsp;</span>
937
+ <span class="cline-any cline-neutral">&nbsp;</span>
938
+ <span class="cline-any cline-neutral">&nbsp;</span>
939
+ <span class="cline-any cline-neutral">&nbsp;</span>
940
+ <span class="cline-any cline-neutral">&nbsp;</span>
941
+ <span class="cline-any cline-no">&nbsp;</span>
942
+ <span class="cline-any cline-neutral">&nbsp;</span>
943
+ <span class="cline-any cline-no">&nbsp;</span>
944
+ <span class="cline-any cline-neutral">&nbsp;</span>
945
+ <span class="cline-any cline-no">&nbsp;</span>
946
+ <span class="cline-any cline-neutral">&nbsp;</span>
947
+ <span class="cline-any cline-no">&nbsp;</span>
948
+ <span class="cline-any cline-no">&nbsp;</span>
949
+ <span class="cline-any cline-neutral">&nbsp;</span>
950
+ <span class="cline-any cline-neutral">&nbsp;</span>
951
+ <span class="cline-any cline-neutral">&nbsp;</span>
952
+ <span class="cline-any cline-neutral">&nbsp;</span>
953
+ <span class="cline-any cline-neutral">&nbsp;</span>
954
+ <span class="cline-any cline-neutral">&nbsp;</span>
955
+ <span class="cline-any cline-no">&nbsp;</span>
956
+ <span class="cline-any cline-no">&nbsp;</span>
957
+ <span class="cline-any cline-no">&nbsp;</span>
958
+ <span class="cline-any cline-neutral">&nbsp;</span>
959
+ <span class="cline-any cline-no">&nbsp;</span>
960
+ <span class="cline-any cline-no">&nbsp;</span>
961
+ <span class="cline-any cline-no">&nbsp;</span>
962
+ <span class="cline-any cline-no">&nbsp;</span>
963
+ <span class="cline-any cline-no">&nbsp;</span>
964
+ <span class="cline-any cline-no">&nbsp;</span>
965
+ <span class="cline-any cline-no">&nbsp;</span>
966
+ <span class="cline-any cline-neutral">&nbsp;</span>
967
+ <span class="cline-any cline-neutral">&nbsp;</span>
968
+ <span class="cline-any cline-neutral">&nbsp;</span>
969
+ <span class="cline-any cline-no">&nbsp;</span>
970
+ <span class="cline-any cline-neutral">&nbsp;</span>
971
+ <span class="cline-any cline-neutral">&nbsp;</span>
972
+ <span class="cline-any cline-neutral">&nbsp;</span>
973
+ <span class="cline-any cline-neutral">&nbsp;</span>
974
+ <span class="cline-any cline-neutral">&nbsp;</span>
975
+ <span class="cline-any cline-neutral">&nbsp;</span>
976
+ <span class="cline-any cline-neutral">&nbsp;</span>
977
+ <span class="cline-any cline-neutral">&nbsp;</span>
978
+ <span class="cline-any cline-neutral">&nbsp;</span>
979
+ <span class="cline-any cline-neutral">&nbsp;</span>
980
+ <span class="cline-any cline-neutral">&nbsp;</span>
981
+ <span class="cline-any cline-neutral">&nbsp;</span>
982
+ <span class="cline-any cline-neutral">&nbsp;</span>
983
+ <span class="cline-any cline-neutral">&nbsp;</span>
984
+ <span class="cline-any cline-neutral">&nbsp;</span>
985
+ <span class="cline-any cline-neutral">&nbsp;</span>
986
+ <span class="cline-any cline-neutral">&nbsp;</span>
987
+ <span class="cline-any cline-neutral">&nbsp;</span>
988
+ <span class="cline-any cline-neutral">&nbsp;</span>
989
+ <span class="cline-any cline-neutral">&nbsp;</span>
990
+ <span class="cline-any cline-neutral">&nbsp;</span>
991
+ <span class="cline-any cline-neutral">&nbsp;</span>
992
+ <span class="cline-any cline-neutral">&nbsp;</span>
993
+ <span class="cline-any cline-neutral">&nbsp;</span>
994
+ <span class="cline-any cline-neutral">&nbsp;</span>
995
+ <span class="cline-any cline-neutral">&nbsp;</span>
996
+ <span class="cline-any cline-neutral">&nbsp;</span>
997
+ <span class="cline-any cline-neutral">&nbsp;</span>
998
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">// External dependencies
999
+ import {useCallback, useEffect, useState, useRef} from 'react';
1000
+ import {Platform} from 'react-native';
1001
+ import {EventSubscription} from 'expo-modules-core';
1002
+ &nbsp;
1003
+ // Internal modules
1004
+ import {
1005
+ endConnection,
1006
+ initConnection,
1007
+ purchaseErrorListener,
1008
+ purchaseUpdatedListener,
1009
+ promotedProductListenerIOS,
1010
+ getAvailablePurchases,
1011
+ getPurchaseHistories,
1012
+ finishTransaction as finishTransactionInternal,
1013
+ requestPurchase as requestPurchaseInternal,
1014
+ requestProducts,
1015
+ validateReceipt as validateReceiptInternal,
1016
+ getActiveSubscriptions,
1017
+ hasActiveSubscriptions,
1018
+ type ActiveSubscription,
1019
+ } from './';
1020
+ import {
1021
+ syncIOS,
1022
+ getPromotedProductIOS,
1023
+ buyPromotedProductIOS,
1024
+ } from './modules/ios';
1025
+ &nbsp;
1026
+ // Types
1027
+ import {
1028
+ Product,
1029
+ ProductPurchase,
1030
+ Purchase,
1031
+ PurchaseError,
1032
+ PurchaseResult,
1033
+ SubscriptionProduct,
1034
+ SubscriptionPurchase,
1035
+ RequestPurchaseProps,
1036
+ RequestSubscriptionProps,
1037
+ } from './ExpoIap.types';
1038
+ &nbsp;
1039
+ type UseIap = {
1040
+ connected: boolean;
1041
+ products: Product[];
1042
+ promotedProductsIOS: ProductPurchase[];
1043
+ promotedProductIdIOS?: string;
1044
+ subscriptions: SubscriptionProduct[];
1045
+ purchaseHistories: ProductPurchase[];
1046
+ availablePurchases: ProductPurchase[];
1047
+ currentPurchase?: ProductPurchase;
1048
+ currentPurchaseError?: PurchaseError;
1049
+ promotedProductIOS?: Product;
1050
+ activeSubscriptions: ActiveSubscription[];
1051
+ clearCurrentPurchase: () =&gt; void;
1052
+ clearCurrentPurchaseError: () =&gt; void;
1053
+ finishTransaction: ({
1054
+ purchase,
1055
+ isConsumable,
1056
+ }: {
1057
+ purchase: Purchase;
1058
+ isConsumable?: boolean;
1059
+ }) =&gt; Promise&lt;PurchaseResult | boolean&gt;;
1060
+ getAvailablePurchases: (skus: string[]) =&gt; Promise&lt;void&gt;;
1061
+ getPurchaseHistories: (skus: string[]) =&gt; Promise&lt;void&gt;;
1062
+ requestProducts: (params: {
1063
+ skus: string[];
1064
+ type?: 'inapp' | 'subs';
1065
+ }) =&gt; Promise&lt;void&gt;;
1066
+ /**
1067
+ * @deprecated Use requestProducts({ skus, type: 'inapp' }) instead. This method will be removed in version 3.0.0.
1068
+ * Note: This method internally uses requestProducts, so no deprecation warning is shown.
1069
+ */
1070
+ getProducts: (skus: string[]) =&gt; Promise&lt;void&gt;;
1071
+ /**
1072
+ * @deprecated Use requestProducts({ skus, type: 'subs' }) instead. This method will be removed in version 3.0.0.
1073
+ * Note: This method internally uses requestProducts, so no deprecation warning is shown.
1074
+ */
1075
+ getSubscriptions: (skus: string[]) =&gt; Promise&lt;void&gt;;
1076
+ requestPurchase: (params: {
1077
+ request: RequestPurchaseProps | RequestSubscriptionProps;
1078
+ type?: 'inapp' | 'subs';
1079
+ }) =&gt; Promise&lt;any&gt;;
1080
+ validateReceipt: (
1081
+ sku: string,
1082
+ androidOptions?: {
1083
+ packageName: string;
1084
+ productToken: string;
1085
+ accessToken: string;
1086
+ isSub?: boolean;
1087
+ },
1088
+ ) =&gt; Promise&lt;any&gt;;
1089
+ restorePurchases: () =&gt; Promise&lt;void&gt;; // 구매 복원 함수 추가
1090
+ getPromotedProductIOS: () =&gt; Promise&lt;any | null&gt;;
1091
+ buyPromotedProductIOS: () =&gt; Promise&lt;void&gt;;
1092
+ getActiveSubscriptions: (
1093
+ subscriptionIds?: string[],
1094
+ ) =&gt; Promise&lt;ActiveSubscription[]&gt;;
1095
+ hasActiveSubscriptions: (subscriptionIds?: string[]) =&gt; Promise&lt;boolean&gt;;
1096
+ };
1097
+ &nbsp;
1098
+ export interface UseIAPOptions {
1099
+ onPurchaseSuccess?: (
1100
+ purchase: ProductPurchase | SubscriptionPurchase,
1101
+ ) =&gt; void;
1102
+ onPurchaseError?: (error: PurchaseError) =&gt; void;
1103
+ onSyncError?: (error: Error) =&gt; void;
1104
+ shouldAutoSyncPurchases?: boolean; // New option to control auto-syncing
1105
+ onPromotedProductIOS?: (product: Product) =&gt; void;
1106
+ }
1107
+ &nbsp;
1108
+ export function <span class="fstat-no" title="function not covered" >useIAP(</span>options?: UseIAPOptions): UseIap {
1109
+ const [connected, setConnected] = <span class="cstat-no" title="statement not covered" >useState&lt;boolean&gt;(false);</span>
1110
+ const [products, setProducts] = <span class="cstat-no" title="statement not covered" >useState&lt;Product[]&gt;([]);</span>
1111
+ const [promotedProductsIOS] = <span class="cstat-no" title="statement not covered" >useState&lt;ProductPurchase[]&gt;([]);</span>
1112
+ const [subscriptions, setSubscriptions] = <span class="cstat-no" title="statement not covered" >useState&lt;SubscriptionProduct[]&gt;([]);</span>
1113
+ const [purchaseHistories, setPurchaseHistories] = <span class="cstat-no" title="statement not covered" >useState&lt;ProductPurchase[]&gt;(</span>
1114
+ [],
1115
+ );
1116
+ const [availablePurchases, setAvailablePurchases] = <span class="cstat-no" title="statement not covered" >useState&lt;</span>
1117
+ ProductPurchase[]
1118
+ &gt;([]);
1119
+ const [currentPurchase, setCurrentPurchase] = <span class="cstat-no" title="statement not covered" >useState&lt;ProductPurchase&gt;();</span>
1120
+ const [promotedProductIOS, setPromotedProductIOS] = <span class="cstat-no" title="statement not covered" >useState&lt;Product&gt;();</span>
1121
+ const [currentPurchaseError, setCurrentPurchaseError] =
1122
+ <span class="cstat-no" title="statement not covered" > useState&lt;PurchaseError&gt;();</span>
1123
+ const [promotedProductIdIOS] = <span class="cstat-no" title="statement not covered" >useState&lt;string&gt;();</span>
1124
+ const [activeSubscriptions, setActiveSubscriptions] = <span class="cstat-no" title="statement not covered" >useState&lt;</span>
1125
+ ActiveSubscription[]
1126
+ &gt;([]);
1127
+ &nbsp;
1128
+ const optionsRef = <span class="cstat-no" title="statement not covered" >useRef&lt;UseIAPOptions | undefined&gt;(options);</span>
1129
+ &nbsp;
1130
+ // Helper function to merge arrays with duplicate checking
1131
+ const mergeWithDuplicateCheck = <span class="cstat-no" title="statement not covered" >useCallback(</span>
1132
+ <span class="fstat-no" title="function not covered" > &lt;T&gt;(</span>
1133
+ existingItems: T[],
1134
+ newItems: T[],
1135
+ getKey: (item: T) =&gt; string,
1136
+ ): T[] =&gt; {
1137
+ const merged = <span class="cstat-no" title="statement not covered" >[...existingItems];</span>
1138
+ <span class="cstat-no" title="statement not covered" > newItems.forEach(<span class="fstat-no" title="function not covered" >(n</span>ewItem) =&gt; {</span>
1139
+ const isDuplicate = <span class="cstat-no" title="statement not covered" >merged.some(</span>
1140
+ <span class="fstat-no" title="function not covered" > (e</span>xistingItem) =&gt; <span class="cstat-no" title="statement not covered" >getKey(existingItem) === getKey(newItem),</span>
1141
+ );
1142
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isDuplicate) {</span>
1143
+ <span class="cstat-no" title="statement not covered" > merged.push(newItem);</span>
1144
+ }
1145
+ });
1146
+ <span class="cstat-no" title="statement not covered" > return merged;</span>
1147
+ },
1148
+ [],
1149
+ );
1150
+ &nbsp;
1151
+ <span class="cstat-no" title="statement not covered" > useEffect(<span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
1152
+ <span class="cstat-no" title="statement not covered" > optionsRef.current = options;</span>
1153
+ }, [options]);
1154
+ &nbsp;
1155
+ const subscriptionsRef = <span class="cstat-no" title="statement not covered" >useRef&lt;{</span>
1156
+ purchaseUpdate?: EventSubscription;
1157
+ purchaseError?: EventSubscription;
1158
+ promotedProductsIOS?: EventSubscription;
1159
+ promotedProductIOS?: EventSubscription;
1160
+ }&gt;({});
1161
+ &nbsp;
1162
+ const subscriptionsRefState = <span class="cstat-no" title="statement not covered" >useRef&lt;SubscriptionProduct[]&gt;([]);</span>
1163
+ &nbsp;
1164
+ <span class="cstat-no" title="statement not covered" > useEffect(<span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
1165
+ <span class="cstat-no" title="statement not covered" > subscriptionsRefState.current = subscriptions;</span>
1166
+ }, [subscriptions]);
1167
+ &nbsp;
1168
+ const clearCurrentPurchase = <span class="cstat-no" title="statement not covered" >useCallback(<span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
1169
+ <span class="cstat-no" title="statement not covered" > setCurrentPurchase(undefined);</span>
1170
+ }, []);
1171
+ &nbsp;
1172
+ const clearCurrentPurchaseError = <span class="cstat-no" title="statement not covered" >useCallback(<span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
1173
+ <span class="cstat-no" title="statement not covered" > setCurrentPurchaseError(undefined);</span>
1174
+ }, []);
1175
+ &nbsp;
1176
+ const getProductsInternal = <span class="cstat-no" title="statement not covered" >useCallback(</span>
1177
+ <span class="fstat-no" title="function not covered" > async </span>(skus: string[]): Promise&lt;void&gt; =&gt; {
1178
+ <span class="cstat-no" title="statement not covered" > try {</span>
1179
+ const result = <span class="cstat-no" title="statement not covered" >await requestProducts({skus, type: 'inapp'});</span>
1180
+ <span class="cstat-no" title="statement not covered" > setProducts(<span class="fstat-no" title="function not covered" >(p</span>revProducts) =&gt;</span>
1181
+ <span class="cstat-no" title="statement not covered" > mergeWithDuplicateCheck(</span>
1182
+ prevProducts,
1183
+ result as Product[],
1184
+ <span class="fstat-no" title="function not covered" > (p</span>roduct) =&gt; <span class="cstat-no" title="statement not covered" >product.id,</span>
1185
+ ),
1186
+ );
1187
+ } catch (error) {
1188
+ <span class="cstat-no" title="statement not covered" > console.error('Error fetching products:', error);</span>
1189
+ }
1190
+ },
1191
+ [mergeWithDuplicateCheck],
1192
+ );
1193
+ &nbsp;
1194
+ const getSubscriptionsInternal = <span class="cstat-no" title="statement not covered" >useCallback(</span>
1195
+ <span class="fstat-no" title="function not covered" > async </span>(skus: string[]): Promise&lt;void&gt; =&gt; {
1196
+ <span class="cstat-no" title="statement not covered" > try {</span>
1197
+ const result = <span class="cstat-no" title="statement not covered" >await requestProducts({skus, type: 'subs'});</span>
1198
+ <span class="cstat-no" title="statement not covered" > setSubscriptions(<span class="fstat-no" title="function not covered" >(p</span>revSubscriptions) =&gt;</span>
1199
+ <span class="cstat-no" title="statement not covered" > mergeWithDuplicateCheck(</span>
1200
+ prevSubscriptions,
1201
+ result as SubscriptionProduct[],
1202
+ <span class="fstat-no" title="function not covered" > (s</span>ubscription) =&gt; <span class="cstat-no" title="statement not covered" >subscription.id,</span>
1203
+ ),
1204
+ );
1205
+ } catch (error) {
1206
+ <span class="cstat-no" title="statement not covered" > console.error('Error fetching subscriptions:', error);</span>
1207
+ }
1208
+ },
1209
+ [mergeWithDuplicateCheck],
1210
+ );
1211
+ &nbsp;
1212
+ const requestProductsInternal = <span class="cstat-no" title="statement not covered" >useCallback(</span>
1213
+ <span class="fstat-no" title="function not covered" > async </span>(params: {
1214
+ skus: string[];
1215
+ type?: 'inapp' | 'subs';
1216
+ }): Promise&lt;void&gt; =&gt; {
1217
+ <span class="cstat-no" title="statement not covered" > try {</span>
1218
+ const result = <span class="cstat-no" title="statement not covered" >await requestProducts(params);</span>
1219
+ <span class="cstat-no" title="statement not covered" > if (params.type === 'subs') {</span>
1220
+ <span class="cstat-no" title="statement not covered" > setSubscriptions(<span class="fstat-no" title="function not covered" >(p</span>revSubscriptions) =&gt;</span>
1221
+ <span class="cstat-no" title="statement not covered" > mergeWithDuplicateCheck(</span>
1222
+ prevSubscriptions,
1223
+ result as SubscriptionProduct[],
1224
+ <span class="fstat-no" title="function not covered" > (s</span>ubscription) =&gt; <span class="cstat-no" title="statement not covered" >subscription.id,</span>
1225
+ ),
1226
+ );
1227
+ } else {
1228
+ <span class="cstat-no" title="statement not covered" > setProducts(<span class="fstat-no" title="function not covered" >(p</span>revProducts) =&gt;</span>
1229
+ <span class="cstat-no" title="statement not covered" > mergeWithDuplicateCheck(</span>
1230
+ prevProducts,
1231
+ result as Product[],
1232
+ <span class="fstat-no" title="function not covered" > (p</span>roduct) =&gt; <span class="cstat-no" title="statement not covered" >product.id,</span>
1233
+ ),
1234
+ );
1235
+ }
1236
+ } catch (error) {
1237
+ <span class="cstat-no" title="statement not covered" > console.error('Error fetching products:', error);</span>
1238
+ }
1239
+ },
1240
+ [mergeWithDuplicateCheck],
1241
+ );
1242
+ &nbsp;
1243
+ const getAvailablePurchasesInternal = <span class="cstat-no" title="statement not covered" >useCallback(<span class="fstat-no" title="function not covered" >async </span>(): Promise&lt;void&gt; =&gt; {</span>
1244
+ <span class="cstat-no" title="statement not covered" > try {</span>
1245
+ const result = <span class="cstat-no" title="statement not covered" >await getAvailablePurchases();</span>
1246
+ <span class="cstat-no" title="statement not covered" > setAvailablePurchases(result);</span>
1247
+ } catch (error) {
1248
+ <span class="cstat-no" title="statement not covered" > console.error('Error fetching available purchases:', error);</span>
1249
+ }
1250
+ }, []);
1251
+ &nbsp;
1252
+ const getActiveSubscriptionsInternal = <span class="cstat-no" title="statement not covered" >useCallback(</span>
1253
+ <span class="fstat-no" title="function not covered" > async </span>(subscriptionIds?: string[]): Promise&lt;ActiveSubscription[]&gt; =&gt; {
1254
+ <span class="cstat-no" title="statement not covered" > try {</span>
1255
+ const result = <span class="cstat-no" title="statement not covered" >await getActiveSubscriptions(subscriptionIds);</span>
1256
+ <span class="cstat-no" title="statement not covered" > setActiveSubscriptions(result);</span>
1257
+ <span class="cstat-no" title="statement not covered" > return result;</span>
1258
+ } catch (error) {
1259
+ <span class="cstat-no" title="statement not covered" > console.error('Error getting active subscriptions:', error);</span>
1260
+ // Don't clear existing activeSubscriptions on error - preserve current state
1261
+ // This prevents the UI from showing empty state when there are temporary network issues
1262
+ <span class="cstat-no" title="statement not covered" > return [];</span>
1263
+ }
1264
+ },
1265
+ [],
1266
+ );
1267
+ &nbsp;
1268
+ const hasActiveSubscriptionsInternal = <span class="cstat-no" title="statement not covered" >useCallback(</span>
1269
+ <span class="fstat-no" title="function not covered" > async </span>(subscriptionIds?: string[]): Promise&lt;boolean&gt; =&gt; {
1270
+ <span class="cstat-no" title="statement not covered" > try {</span>
1271
+ <span class="cstat-no" title="statement not covered" > return await hasActiveSubscriptions(subscriptionIds);</span>
1272
+ } catch (error) {
1273
+ <span class="cstat-no" title="statement not covered" > console.error('Error checking active subscriptions:', error);</span>
1274
+ <span class="cstat-no" title="statement not covered" > return false;</span>
1275
+ }
1276
+ },
1277
+ [],
1278
+ );
1279
+ &nbsp;
1280
+ const getPurchaseHistoriesInternal = <span class="cstat-no" title="statement not covered" >useCallback(<span class="fstat-no" title="function not covered" >async </span>(): Promise&lt;void&gt; =&gt; {</span>
1281
+ <span class="cstat-no" title="statement not covered" > setPurchaseHistories(await getPurchaseHistories());</span>
1282
+ }, []);
1283
+ &nbsp;
1284
+ const finishTransaction = <span class="cstat-no" title="statement not covered" >useCallback(</span>
1285
+ <span class="fstat-no" title="function not covered" > async </span>({
1286
+ purchase,
1287
+ isConsumable,
1288
+ }: {
1289
+ purchase: ProductPurchase;
1290
+ isConsumable?: boolean;
1291
+ }): Promise&lt;PurchaseResult | boolean&gt; =&gt; {
1292
+ <span class="cstat-no" title="statement not covered" > try {</span>
1293
+ <span class="cstat-no" title="statement not covered" > return await finishTransactionInternal({</span>
1294
+ purchase,
1295
+ isConsumable,
1296
+ });
1297
+ } catch (err) {
1298
+ <span class="cstat-no" title="statement not covered" > throw err;</span>
1299
+ } finally {
1300
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (purchase.id === currentPurchase?.id) {</span>
1301
+ <span class="cstat-no" title="statement not covered" > clearCurrentPurchase();</span>
1302
+ }
1303
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (purchase.id === currentPurchaseError?.productId) {</span>
1304
+ <span class="cstat-no" title="statement not covered" > clearCurrentPurchaseError();</span>
1305
+ }
1306
+ }
1307
+ },
1308
+ [
1309
+ currentPurchase?.id,
1310
+ currentPurchaseError?.productId,
1311
+ clearCurrentPurchase,
1312
+ clearCurrentPurchaseError,
1313
+ ],
1314
+ );
1315
+ &nbsp;
1316
+ const requestPurchaseWithReset = <span class="cstat-no" title="statement not covered" >useCallback(</span>
1317
+ <span class="fstat-no" title="function not covered" > async </span>(requestObj: {request: any; type?: 'inapp' | 'subs'}) =&gt; {
1318
+ <span class="cstat-no" title="statement not covered" > clearCurrentPurchase();</span>
1319
+ <span class="cstat-no" title="statement not covered" > clearCurrentPurchaseError();</span>
1320
+ &nbsp;
1321
+ <span class="cstat-no" title="statement not covered" > try {</span>
1322
+ <span class="cstat-no" title="statement not covered" > return await requestPurchaseInternal(requestObj);</span>
1323
+ } catch (error) {
1324
+ <span class="cstat-no" title="statement not covered" > throw error;</span>
1325
+ }
1326
+ },
1327
+ [clearCurrentPurchase, clearCurrentPurchaseError],
1328
+ );
1329
+ &nbsp;
1330
+ const refreshSubscriptionStatus = <span class="cstat-no" title="statement not covered" >useCallback(</span>
1331
+ <span class="fstat-no" title="function not covered" > async </span>(productId: string) =&gt; {
1332
+ <span class="cstat-no" title="statement not covered" > try {</span>
1333
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (subscriptionsRefState.current.some(<span class="fstat-no" title="function not covered" >(s</span>ub) =&gt; <span class="cstat-no" title="statement not covered" >sub.id === productId)</span>) {</span>
1334
+ <span class="cstat-no" title="statement not covered" > await getSubscriptionsInternal([productId]);</span>
1335
+ <span class="cstat-no" title="statement not covered" > await getAvailablePurchasesInternal();</span>
1336
+ }
1337
+ } catch (error) {
1338
+ <span class="cstat-no" title="statement not covered" > console.warn('Failed to refresh subscription status:', error);</span>
1339
+ }
1340
+ },
1341
+ [getAvailablePurchasesInternal, getSubscriptionsInternal],
1342
+ );
1343
+ &nbsp;
1344
+ const restorePurchases = <span class="cstat-no" title="statement not covered" >useCallback(<span class="fstat-no" title="function not covered" >async </span>(): Promise&lt;void&gt; =&gt; {</span>
1345
+ <span class="cstat-no" title="statement not covered" > try {</span>
1346
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (Platform.OS === 'ios') {</span>
1347
+ <span class="cstat-no" title="statement not covered" > await syncIOS().catch(<span class="fstat-no" title="function not covered" >(e</span>rror) =&gt; {</span>
1348
+ <span class="cstat-no" title="statement not covered" > if (optionsRef.current?.onSyncError) {</span>
1349
+ <span class="cstat-no" title="statement not covered" > optionsRef.current.onSyncError(error);</span>
1350
+ } else {
1351
+ <span class="cstat-no" title="statement not covered" > console.warn('Error restoring purchases:', error);</span>
1352
+ }
1353
+ });
1354
+ }
1355
+ <span class="cstat-no" title="statement not covered" > await getAvailablePurchasesInternal();</span>
1356
+ } catch (error) {
1357
+ <span class="cstat-no" title="statement not covered" > console.warn('Failed to restore purchases:', error);</span>
1358
+ }
1359
+ }, [getAvailablePurchasesInternal]);
1360
+ &nbsp;
1361
+ const validateReceipt = <span class="cstat-no" title="statement not covered" >useCallback(</span>
1362
+ <span class="fstat-no" title="function not covered" > async </span>(
1363
+ sku: string,
1364
+ androidOptions?: {
1365
+ packageName: string;
1366
+ productToken: string;
1367
+ accessToken: string;
1368
+ isSub?: boolean;
1369
+ },
1370
+ ) =&gt; {
1371
+ <span class="cstat-no" title="statement not covered" > return validateReceiptInternal(sku, androidOptions);</span>
1372
+ },
1373
+ [],
1374
+ );
1375
+ &nbsp;
1376
+ const initIapWithSubscriptions = <span class="cstat-no" title="statement not covered" >useCallback(<span class="fstat-no" title="function not covered" >async </span>(): Promise&lt;void&gt; =&gt; {</span>
1377
+ const result = <span class="cstat-no" title="statement not covered" >await initConnection();</span>
1378
+ <span class="cstat-no" title="statement not covered" > setConnected(result);</span>
1379
+ &nbsp;
1380
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (result) {</span>
1381
+ <span class="cstat-no" title="statement not covered" > subscriptionsRef.current.purchaseUpdate = purchaseUpdatedListener(</span>
1382
+ <span class="fstat-no" title="function not covered" > async </span>(purchase: Purchase | SubscriptionPurchase) =&gt; {
1383
+ <span class="cstat-no" title="statement not covered" > setCurrentPurchaseError(undefined);</span>
1384
+ <span class="cstat-no" title="statement not covered" > setCurrentPurchase(purchase);</span>
1385
+ &nbsp;
1386
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if ('expirationDateIOS' in purchase) {</span>
1387
+ <span class="cstat-no" title="statement not covered" > await refreshSubscriptionStatus(purchase.id);</span>
1388
+ }
1389
+ &nbsp;
1390
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (optionsRef.current?.onPurchaseSuccess) {</span>
1391
+ <span class="cstat-no" title="statement not covered" > optionsRef.current.onPurchaseSuccess(purchase);</span>
1392
+ }
1393
+ },
1394
+ );
1395
+ &nbsp;
1396
+ <span class="cstat-no" title="statement not covered" > subscriptionsRef.current.purchaseError = purchaseErrorListener(</span>
1397
+ <span class="fstat-no" title="function not covered" > (e</span>rror: PurchaseError) =&gt; {
1398
+ <span class="cstat-no" title="statement not covered" > setCurrentPurchase(undefined);</span>
1399
+ <span class="cstat-no" title="statement not covered" > setCurrentPurchaseError(error);</span>
1400
+ &nbsp;
1401
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (optionsRef.current?.onPurchaseError) {</span>
1402
+ <span class="cstat-no" title="statement not covered" > optionsRef.current.onPurchaseError(error);</span>
1403
+ }
1404
+ },
1405
+ );
1406
+ &nbsp;
1407
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (Platform.OS === 'ios') {</span>
1408
+ // iOS promoted products listener
1409
+ <span class="cstat-no" title="statement not covered" > subscriptionsRef.current.promotedProductsIOS =</span>
1410
+ promotedProductListenerIOS(<span class="fstat-no" title="function not covered" >(p</span>roduct: Product) =&gt; {
1411
+ <span class="cstat-no" title="statement not covered" > setPromotedProductIOS(product);</span>
1412
+ &nbsp;
1413
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (optionsRef.current?.onPromotedProductIOS) {</span>
1414
+ <span class="cstat-no" title="statement not covered" > optionsRef.current.onPromotedProductIOS(product);</span>
1415
+ }
1416
+ });
1417
+ }
1418
+ }
1419
+ }, [refreshSubscriptionStatus]);
1420
+ &nbsp;
1421
+ <span class="cstat-no" title="statement not covered" > useEffect(<span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
1422
+ <span class="cstat-no" title="statement not covered" > initIapWithSubscriptions();</span>
1423
+ const currentSubscriptions = <span class="cstat-no" title="statement not covered" >subscriptionsRef.current;</span>
1424
+ &nbsp;
1425
+ <span class="cstat-no" title="statement not covered" > return <span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
1426
+ <span class="cstat-no" title="statement not covered" > currentSubscriptions.purchaseUpdate?.remove();</span>
1427
+ <span class="cstat-no" title="statement not covered" > currentSubscriptions.purchaseError?.remove();</span>
1428
+ <span class="cstat-no" title="statement not covered" > currentSubscriptions.promotedProductsIOS?.remove();</span>
1429
+ <span class="cstat-no" title="statement not covered" > currentSubscriptions.promotedProductIOS?.remove();</span>
1430
+ <span class="cstat-no" title="statement not covered" > endConnection();</span>
1431
+ <span class="cstat-no" title="statement not covered" > setConnected(false);</span>
1432
+ };
1433
+ }, [initIapWithSubscriptions]);
1434
+ &nbsp;
1435
+ <span class="cstat-no" title="statement not covered" > return {</span>
1436
+ connected,
1437
+ products,
1438
+ promotedProductsIOS,
1439
+ promotedProductIdIOS,
1440
+ subscriptions,
1441
+ purchaseHistories,
1442
+ finishTransaction,
1443
+ availablePurchases,
1444
+ currentPurchase,
1445
+ currentPurchaseError,
1446
+ promotedProductIOS,
1447
+ activeSubscriptions,
1448
+ clearCurrentPurchase,
1449
+ clearCurrentPurchaseError,
1450
+ getAvailablePurchases: getAvailablePurchasesInternal,
1451
+ getPurchaseHistories: getPurchaseHistoriesInternal,
1452
+ requestProducts: requestProductsInternal,
1453
+ requestPurchase: requestPurchaseWithReset,
1454
+ validateReceipt,
1455
+ restorePurchases,
1456
+ getProducts: getProductsInternal,
1457
+ getSubscriptions: getSubscriptionsInternal,
1458
+ getPromotedProductIOS,
1459
+ buyPromotedProductIOS,
1460
+ getActiveSubscriptions: getActiveSubscriptionsInternal,
1461
+ hasActiveSubscriptions: hasActiveSubscriptionsInternal,
1462
+ };
1463
+ }
1464
+ &nbsp;</pre></td></tr></table></pre>
1465
+
1466
+ <div class='push'></div><!-- for sticky footer -->
1467
+ </div><!-- /wrapper -->
1468
+ <div class='footer quiet pad2 space-top1 center small'>
1469
+ Code coverage generated by
1470
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1471
+ at 2025-08-18T13:52:08.864Z
1472
+ </div>
1473
+ <script src="../prettify.js"></script>
1474
+ <script>
1475
+ window.onload = function () {
1476
+ prettyPrint();
1477
+ };
1478
+ </script>
1479
+ <script src="../sorter.js"></script>
1480
+ <script src="../block-navigation.js"></script>
1481
+ </body>
1482
+ </html>
1483
+