@navios/di 0.4.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/README.md +211 -1
  2. package/coverage/clover.xml +1912 -1277
  3. package/coverage/coverage-final.json +37 -28
  4. package/coverage/docs/examples/basic-usage.mts.html +1 -1
  5. package/coverage/docs/examples/factory-pattern.mts.html +1 -1
  6. package/coverage/docs/examples/index.html +1 -1
  7. package/coverage/docs/examples/injection-tokens.mts.html +1 -1
  8. package/coverage/docs/examples/request-scope-example.mts.html +1 -1
  9. package/coverage/docs/examples/service-lifecycle.mts.html +1 -1
  10. package/coverage/index.html +71 -41
  11. package/coverage/lib/_tsup-dts-rollup.d.mts.html +682 -43
  12. package/coverage/lib/index.d.mts.html +7 -4
  13. package/coverage/lib/index.html +5 -5
  14. package/coverage/lib/testing/index.d.mts.html +91 -0
  15. package/coverage/lib/testing/index.html +116 -0
  16. package/coverage/src/base-instance-holder-manager.mts.html +589 -0
  17. package/coverage/src/container.mts.html +257 -74
  18. package/coverage/src/decorators/factory.decorator.mts.html +1 -1
  19. package/coverage/src/decorators/index.html +1 -1
  20. package/coverage/src/decorators/index.mts.html +1 -1
  21. package/coverage/src/decorators/injectable.decorator.mts.html +20 -20
  22. package/coverage/src/enums/index.html +1 -1
  23. package/coverage/src/enums/index.mts.html +1 -1
  24. package/coverage/src/enums/injectable-scope.enum.mts.html +1 -1
  25. package/coverage/src/enums/injectable-type.enum.mts.html +1 -1
  26. package/coverage/src/errors/di-error.mts.html +292 -0
  27. package/coverage/src/errors/errors.enum.mts.html +30 -21
  28. package/coverage/src/errors/factory-not-found.mts.html +31 -22
  29. package/coverage/src/errors/factory-token-not-resolved.mts.html +29 -26
  30. package/coverage/src/errors/index.html +56 -41
  31. package/coverage/src/errors/index.mts.html +15 -9
  32. package/coverage/src/errors/instance-destroying.mts.html +31 -22
  33. package/coverage/src/errors/instance-expired.mts.html +31 -22
  34. package/coverage/src/errors/instance-not-found.mts.html +31 -22
  35. package/coverage/src/errors/unknown-error.mts.html +31 -43
  36. package/coverage/src/event-emitter.mts.html +14 -14
  37. package/coverage/src/factory-context.mts.html +1 -1
  38. package/coverage/src/index.html +121 -46
  39. package/coverage/src/index.mts.html +7 -4
  40. package/coverage/src/injection-token.mts.html +28 -28
  41. package/coverage/src/injector.mts.html +1 -1
  42. package/coverage/src/instance-resolver.mts.html +1762 -0
  43. package/coverage/src/interfaces/factory.interface.mts.html +1 -1
  44. package/coverage/src/interfaces/index.html +1 -1
  45. package/coverage/src/interfaces/index.mts.html +1 -1
  46. package/coverage/src/interfaces/on-service-destroy.interface.mts.html +1 -1
  47. package/coverage/src/interfaces/on-service-init.interface.mts.html +1 -1
  48. package/coverage/src/registry.mts.html +28 -28
  49. package/coverage/src/request-context-holder.mts.html +183 -102
  50. package/coverage/src/request-context-manager.mts.html +532 -0
  51. package/coverage/src/service-instantiator.mts.html +49 -49
  52. package/coverage/src/service-invalidator.mts.html +1372 -0
  53. package/coverage/src/service-locator-event-bus.mts.html +48 -48
  54. package/coverage/src/service-locator-instance-holder.mts.html +2 -14
  55. package/coverage/src/service-locator-manager.mts.html +71 -335
  56. package/coverage/src/service-locator.mts.html +240 -2328
  57. package/coverage/src/symbols/index.html +1 -1
  58. package/coverage/src/symbols/index.mts.html +1 -1
  59. package/coverage/src/symbols/injectable-token.mts.html +1 -1
  60. package/coverage/src/testing/index.html +131 -0
  61. package/coverage/src/testing/index.mts.html +88 -0
  62. package/coverage/src/testing/test-container.mts.html +445 -0
  63. package/coverage/src/token-processor.mts.html +607 -0
  64. package/coverage/src/utils/defer.mts.html +28 -214
  65. package/coverage/src/utils/get-injectable-token.mts.html +7 -7
  66. package/coverage/src/utils/get-injectors.mts.html +99 -99
  67. package/coverage/src/utils/index.html +15 -15
  68. package/coverage/src/utils/index.mts.html +4 -7
  69. package/coverage/src/utils/types.mts.html +1 -1
  70. package/docs/injectable.md +51 -11
  71. package/docs/scopes.md +63 -29
  72. package/lib/_tsup-dts-rollup.d.mts +447 -212
  73. package/lib/_tsup-dts-rollup.d.ts +447 -212
  74. package/lib/chunk-44F3LXW5.mjs +2043 -0
  75. package/lib/chunk-44F3LXW5.mjs.map +1 -0
  76. package/lib/index.d.mts +6 -4
  77. package/lib/index.d.ts +6 -4
  78. package/lib/index.js +1199 -773
  79. package/lib/index.js.map +1 -1
  80. package/lib/index.mjs +4 -1599
  81. package/lib/index.mjs.map +1 -1
  82. package/lib/testing/index.d.mts +2 -0
  83. package/lib/testing/index.d.ts +2 -0
  84. package/lib/testing/index.js +2060 -0
  85. package/lib/testing/index.js.map +1 -0
  86. package/lib/testing/index.mjs +73 -0
  87. package/lib/testing/index.mjs.map +1 -0
  88. package/package.json +11 -1
  89. package/src/__tests__/container.spec.mts +47 -13
  90. package/src/__tests__/errors.spec.mts +53 -27
  91. package/src/__tests__/injectable.spec.mts +73 -0
  92. package/src/__tests__/request-scope.spec.mts +0 -2
  93. package/src/__tests__/service-locator-manager.spec.mts +12 -82
  94. package/src/__tests__/service-locator.spec.mts +1009 -1
  95. package/src/__type-tests__/inject.spec-d.mts +30 -7
  96. package/src/__type-tests__/injectable.spec-d.mts +76 -37
  97. package/src/base-instance-holder-manager.mts +2 -9
  98. package/src/container.mts +70 -10
  99. package/src/decorators/injectable.decorator.mts +29 -5
  100. package/src/errors/di-error.mts +69 -0
  101. package/src/errors/index.mts +9 -7
  102. package/src/injection-token.mts +1 -0
  103. package/src/injector.mts +2 -0
  104. package/src/instance-resolver.mts +559 -0
  105. package/src/request-context-holder.mts +0 -2
  106. package/src/request-context-manager.mts +149 -0
  107. package/src/service-invalidator.mts +429 -0
  108. package/src/service-locator-instance-holder.mts +0 -4
  109. package/src/service-locator-manager.mts +10 -40
  110. package/src/service-locator.mts +86 -782
  111. package/src/testing/README.md +80 -0
  112. package/src/testing/__tests__/test-container.spec.mts +173 -0
  113. package/src/testing/index.mts +1 -0
  114. package/src/testing/test-container.mts +120 -0
  115. package/src/token-processor.mts +174 -0
  116. package/src/utils/get-injectors.mts +161 -24
  117. package/src/utils/index.mts +0 -1
  118. package/src/utils/types.mts +12 -8
  119. package/tsup.config.mts +1 -1
  120. package/src/__tests__/defer.spec.mts +0 -166
  121. package/src/errors/errors.enum.mts +0 -8
  122. package/src/errors/factory-not-found.mts +0 -8
  123. package/src/errors/factory-token-not-resolved.mts +0 -10
  124. package/src/errors/instance-destroying.mts +0 -8
  125. package/src/errors/instance-expired.mts +0 -8
  126. package/src/errors/instance-not-found.mts +0 -8
  127. package/src/errors/unknown-error.mts +0 -15
  128. package/src/utils/defer.mts +0 -73
@@ -0,0 +1,1762 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/instance-resolver.mts</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> instance-resolver.mts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">94.14% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>354/376</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">90.8% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>79/87</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">100% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>16/16</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">94.14% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>354/376</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></td><td class="line-coverage quiet"><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-neutral">&nbsp;</span>
643
+ <span class="cline-any cline-neutral">&nbsp;</span>
644
+ <span class="cline-any cline-neutral">&nbsp;</span>
645
+ <span class="cline-any cline-yes">1x</span>
646
+ <span class="cline-any cline-yes">1x</span>
647
+ <span class="cline-any cline-yes">1x</span>
648
+ <span class="cline-any cline-neutral">&nbsp;</span>
649
+ <span class="cline-any cline-neutral">&nbsp;</span>
650
+ <span class="cline-any cline-neutral">&nbsp;</span>
651
+ <span class="cline-any cline-neutral">&nbsp;</span>
652
+ <span class="cline-any cline-yes">1x</span>
653
+ <span class="cline-any cline-neutral">&nbsp;</span>
654
+ <span class="cline-any cline-neutral">&nbsp;</span>
655
+ <span class="cline-any cline-neutral">&nbsp;</span>
656
+ <span class="cline-any cline-neutral">&nbsp;</span>
657
+ <span class="cline-any cline-neutral">&nbsp;</span>
658
+ <span class="cline-any cline-yes">1x</span>
659
+ <span class="cline-any cline-yes">1x</span>
660
+ <span class="cline-any cline-yes">143x</span>
661
+ <span class="cline-any cline-yes">143x</span>
662
+ <span class="cline-any cline-yes">143x</span>
663
+ <span class="cline-any cline-yes">143x</span>
664
+ <span class="cline-any cline-yes">143x</span>
665
+ <span class="cline-any cline-yes">143x</span>
666
+ <span class="cline-any cline-yes">143x</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-yes">1x</span>
672
+ <span class="cline-any cline-yes">337x</span>
673
+ <span class="cline-any cline-yes">337x</span>
674
+ <span class="cline-any cline-yes">337x</span>
675
+ <span class="cline-any cline-yes">337x</span>
676
+ <span class="cline-any cline-yes">337x</span>
677
+ <span class="cline-any cline-yes">337x</span>
678
+ <span class="cline-any cline-yes">337x</span>
679
+ <span class="cline-any cline-yes">337x</span>
680
+ <span class="cline-any cline-yes">337x</span>
681
+ <span class="cline-any cline-yes">3x</span>
682
+ <span class="cline-any cline-yes">3x</span>
683
+ <span class="cline-any cline-neutral">&nbsp;</span>
684
+ <span class="cline-any cline-yes">331x</span>
685
+ <span class="cline-any cline-yes">331x</span>
686
+ <span class="cline-any cline-yes">331x</span>
687
+ <span class="cline-any cline-yes">331x</span>
688
+ <span class="cline-any cline-yes">331x</span>
689
+ <span class="cline-any cline-yes">331x</span>
690
+ <span class="cline-any cline-neutral">&nbsp;</span>
691
+ <span class="cline-any cline-yes">331x</span>
692
+ <span class="cline-any cline-yes">331x</span>
693
+ <span class="cline-any cline-yes">331x</span>
694
+ <span class="cline-any cline-yes">331x</span>
695
+ <span class="cline-any cline-yes">331x</span>
696
+ <span class="cline-any cline-yes">331x</span>
697
+ <span class="cline-any cline-yes">337x</span>
698
+ <span class="cline-any cline-yes">2x</span>
699
+ <span class="cline-any cline-yes">2x</span>
700
+ <span class="cline-any cline-yes">326x</span>
701
+ <span class="cline-any cline-yes">337x</span>
702
+ <span class="cline-any cline-neutral">&nbsp;</span>
703
+ <span class="cline-any cline-neutral">&nbsp;</span>
704
+ <span class="cline-any cline-neutral">&nbsp;</span>
705
+ <span class="cline-any cline-neutral">&nbsp;</span>
706
+ <span class="cline-any cline-yes">1x</span>
707
+ <span class="cline-any cline-neutral">&nbsp;</span>
708
+ <span class="cline-any cline-neutral">&nbsp;</span>
709
+ <span class="cline-any cline-neutral">&nbsp;</span>
710
+ <span class="cline-any cline-yes">99x</span>
711
+ <span class="cline-any cline-yes">99x</span>
712
+ <span class="cline-any cline-neutral">&nbsp;</span>
713
+ <span class="cline-any cline-neutral">&nbsp;</span>
714
+ <span class="cline-any cline-neutral">&nbsp;</span>
715
+ <span class="cline-any cline-neutral">&nbsp;</span>
716
+ <span class="cline-any cline-yes">99x</span>
717
+ <span class="cline-any cline-yes">99x</span>
718
+ <span class="cline-any cline-yes">99x</span>
719
+ <span class="cline-any cline-yes">99x</span>
720
+ <span class="cline-any cline-yes">99x</span>
721
+ <span class="cline-any cline-no">&nbsp;</span>
722
+ <span class="cline-any cline-no">&nbsp;</span>
723
+ <span class="cline-any cline-yes">98x</span>
724
+ <span class="cline-any cline-yes">98x</span>
725
+ <span class="cline-any cline-yes">98x</span>
726
+ <span class="cline-any cline-yes">98x</span>
727
+ <span class="cline-any cline-neutral">&nbsp;</span>
728
+ <span class="cline-any cline-neutral">&nbsp;</span>
729
+ <span class="cline-any cline-yes">99x</span>
730
+ <span class="cline-any cline-yes">35x</span>
731
+ <span class="cline-any cline-yes">35x</span>
732
+ <span class="cline-any cline-yes">9x</span>
733
+ <span class="cline-any cline-yes">9x</span>
734
+ <span class="cline-any cline-yes">35x</span>
735
+ <span class="cline-any cline-neutral">&nbsp;</span>
736
+ <span class="cline-any cline-neutral">&nbsp;</span>
737
+ <span class="cline-any cline-yes">89x</span>
738
+ <span class="cline-any cline-yes">99x</span>
739
+ <span class="cline-any cline-yes">43x</span>
740
+ <span class="cline-any cline-yes">43x</span>
741
+ <span class="cline-any cline-yes">46x</span>
742
+ <span class="cline-any cline-yes">99x</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-neutral">&nbsp;</span>
747
+ <span class="cline-any cline-neutral">&nbsp;</span>
748
+ <span class="cline-any cline-yes">1x</span>
749
+ <span class="cline-any cline-yes">351x</span>
750
+ <span class="cline-any cline-yes">351x</span>
751
+ <span class="cline-any cline-neutral">&nbsp;</span>
752
+ <span class="cline-any cline-neutral">&nbsp;</span>
753
+ <span class="cline-any cline-neutral">&nbsp;</span>
754
+ <span class="cline-any cline-neutral">&nbsp;</span>
755
+ <span class="cline-any cline-neutral">&nbsp;</span>
756
+ <span class="cline-any cline-neutral">&nbsp;</span>
757
+ <span class="cline-any cline-neutral">&nbsp;</span>
758
+ <span class="cline-any cline-neutral">&nbsp;</span>
759
+ <span class="cline-any cline-neutral">&nbsp;</span>
760
+ <span class="cline-any cline-neutral">&nbsp;</span>
761
+ <span class="cline-any cline-neutral">&nbsp;</span>
762
+ <span class="cline-any cline-yes">351x</span>
763
+ <span class="cline-any cline-yes">351x</span>
764
+ <span class="cline-any cline-yes">351x</span>
765
+ <span class="cline-any cline-yes">351x</span>
766
+ <span class="cline-any cline-yes">3x</span>
767
+ <span class="cline-any cline-yes">3x</span>
768
+ <span class="cline-any cline-yes">347x</span>
769
+ <span class="cline-any cline-yes">16x</span>
770
+ <span class="cline-any cline-yes">16x</span>
771
+ <span class="cline-any cline-yes">347x</span>
772
+ <span class="cline-any cline-yes">16x</span>
773
+ <span class="cline-any cline-yes">16x</span>
774
+ <span class="cline-any cline-yes">16x</span>
775
+ <span class="cline-any cline-yes">16x</span>
776
+ <span class="cline-any cline-yes">14x</span>
777
+ <span class="cline-any cline-yes">14x</span>
778
+ <span class="cline-any cline-yes">331x</span>
779
+ <span class="cline-any cline-yes">331x</span>
780
+ <span class="cline-any cline-yes">331x</span>
781
+ <span class="cline-any cline-yes">331x</span>
782
+ <span class="cline-any cline-neutral">&nbsp;</span>
783
+ <span class="cline-any cline-yes">331x</span>
784
+ <span class="cline-any cline-yes">331x</span>
785
+ <span class="cline-any cline-yes">325x</span>
786
+ <span class="cline-any cline-yes">22x</span>
787
+ <span class="cline-any cline-yes">309x</span>
788
+ <span class="cline-any cline-yes">351x</span>
789
+ <span class="cline-any cline-yes">351x</span>
790
+ <span class="cline-any cline-neutral">&nbsp;</span>
791
+ <span class="cline-any cline-neutral">&nbsp;</span>
792
+ <span class="cline-any cline-neutral">&nbsp;</span>
793
+ <span class="cline-any cline-neutral">&nbsp;</span>
794
+ <span class="cline-any cline-yes">1x</span>
795
+ <span class="cline-any cline-yes">331x</span>
796
+ <span class="cline-any cline-yes">331x</span>
797
+ <span class="cline-any cline-yes">331x</span>
798
+ <span class="cline-any cline-yes">331x</span>
799
+ <span class="cline-any cline-yes">331x</span>
800
+ <span class="cline-any cline-neutral">&nbsp;</span>
801
+ <span class="cline-any cline-yes">331x</span>
802
+ <span class="cline-any cline-yes">331x</span>
803
+ <span class="cline-any cline-yes">331x</span>
804
+ <span class="cline-any cline-yes">331x</span>
805
+ <span class="cline-any cline-yes">331x</span>
806
+ <span class="cline-any cline-yes">331x</span>
807
+ <span class="cline-any cline-yes">38x</span>
808
+ <span class="cline-any cline-yes">38x</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-yes">293x</span>
812
+ <span class="cline-any cline-yes">293x</span>
813
+ <span class="cline-any cline-yes">293x</span>
814
+ <span class="cline-any cline-yes">293x</span>
815
+ <span class="cline-any cline-yes">293x</span>
816
+ <span class="cline-any cline-yes">293x</span>
817
+ <span class="cline-any cline-yes">331x</span>
818
+ <span class="cline-any cline-no">&nbsp;</span>
819
+ <span class="cline-any cline-no">&nbsp;</span>
820
+ <span class="cline-any cline-neutral">&nbsp;</span>
821
+ <span class="cline-any cline-yes">293x</span>
822
+ <span class="cline-any cline-yes">293x</span>
823
+ <span class="cline-any cline-yes">331x</span>
824
+ <span class="cline-any cline-neutral">&nbsp;</span>
825
+ <span class="cline-any cline-neutral">&nbsp;</span>
826
+ <span class="cline-any cline-neutral">&nbsp;</span>
827
+ <span class="cline-any cline-neutral">&nbsp;</span>
828
+ <span class="cline-any cline-neutral">&nbsp;</span>
829
+ <span class="cline-any cline-yes">1x</span>
830
+ <span class="cline-any cline-yes">331x</span>
831
+ <span class="cline-any cline-yes">331x</span>
832
+ <span class="cline-any cline-yes">331x</span>
833
+ <span class="cline-any cline-neutral">&nbsp;</span>
834
+ <span class="cline-any cline-neutral">&nbsp;</span>
835
+ <span class="cline-any cline-yes">331x</span>
836
+ <span class="cline-any cline-neutral">&nbsp;</span>
837
+ <span class="cline-any cline-yes">331x</span>
838
+ <span class="cline-any cline-yes">331x</span>
839
+ <span class="cline-any cline-yes">331x</span>
840
+ <span class="cline-any cline-yes">331x</span>
841
+ <span class="cline-any cline-yes">331x</span>
842
+ <span class="cline-any cline-yes">331x</span>
843
+ <span class="cline-any cline-yes">8x</span>
844
+ <span class="cline-any cline-yes">8x</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-yes">323x</span>
848
+ <span class="cline-any cline-yes">331x</span>
849
+ <span class="cline-any cline-neutral">&nbsp;</span>
850
+ <span class="cline-any cline-neutral">&nbsp;</span>
851
+ <span class="cline-any cline-neutral">&nbsp;</span>
852
+ <span class="cline-any cline-neutral">&nbsp;</span>
853
+ <span class="cline-any cline-yes">1x</span>
854
+ <span class="cline-any cline-yes">331x</span>
855
+ <span class="cline-any cline-yes">331x</span>
856
+ <span class="cline-any cline-yes">331x</span>
857
+ <span class="cline-any cline-neutral">&nbsp;</span>
858
+ <span class="cline-any cline-neutral">&nbsp;</span>
859
+ <span class="cline-any cline-yes">331x</span>
860
+ <span class="cline-any cline-yes">331x</span>
861
+ <span class="cline-any cline-yes">5x</span>
862
+ <span class="cline-any cline-yes">5x</span>
863
+ <span class="cline-any cline-neutral">&nbsp;</span>
864
+ <span class="cline-any cline-yes">326x</span>
865
+ <span class="cline-any cline-yes">328x</span>
866
+ <span class="cline-any cline-yes">291x</span>
867
+ <span class="cline-any cline-yes">291x</span>
868
+ <span class="cline-any cline-neutral">&nbsp;</span>
869
+ <span class="cline-any cline-yes">278x</span>
870
+ <span class="cline-any cline-yes">2x</span>
871
+ <span class="cline-any cline-yes">2x</span>
872
+ <span class="cline-any cline-yes">2x</span>
873
+ <span class="cline-any cline-yes">2x</span>
874
+ <span class="cline-any cline-yes">2x</span>
875
+ <span class="cline-any cline-yes">2x</span>
876
+ <span class="cline-any cline-yes">2x</span>
877
+ <span class="cline-any cline-yes">2x</span>
878
+ <span class="cline-any cline-yes">2x</span>
879
+ <span class="cline-any cline-neutral">&nbsp;</span>
880
+ <span class="cline-any cline-yes">33x</span>
881
+ <span class="cline-any cline-yes">79x</span>
882
+ <span class="cline-any cline-yes">27x</span>
883
+ <span class="cline-any cline-yes">27x</span>
884
+ <span class="cline-any cline-neutral">&nbsp;</span>
885
+ <span class="cline-any cline-yes">6x</span>
886
+ <span class="cline-any cline-yes">331x</span>
887
+ <span class="cline-any cline-neutral">&nbsp;</span>
888
+ <span class="cline-any cline-neutral">&nbsp;</span>
889
+ <span class="cline-any cline-neutral">&nbsp;</span>
890
+ <span class="cline-any cline-neutral">&nbsp;</span>
891
+ <span class="cline-any cline-yes">1x</span>
892
+ <span class="cline-any cline-yes">323x</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-yes">323x</span>
896
+ <span class="cline-any cline-yes">323x</span>
897
+ <span class="cline-any cline-neutral">&nbsp;</span>
898
+ <span class="cline-any cline-yes">323x</span>
899
+ <span class="cline-any cline-yes">30x</span>
900
+ <span class="cline-any cline-yes">30x</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-yes">293x</span>
904
+ <span class="cline-any cline-yes">323x</span>
905
+ <span class="cline-any cline-no">&nbsp;</span>
906
+ <span class="cline-any cline-no">&nbsp;</span>
907
+ <span class="cline-any cline-no">&nbsp;</span>
908
+ <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
912
+ <span class="cline-any cline-yes">323x</span>
913
+ <span class="cline-any cline-yes">293x</span>
914
+ <span class="cline-any cline-neutral">&nbsp;</span>
915
+ <span class="cline-any cline-yes">323x</span>
916
+ <span class="cline-any cline-no">&nbsp;</span>
917
+ <span class="cline-any cline-yes">323x</span>
918
+ <span class="cline-any cline-yes">323x</span>
919
+ <span class="cline-any cline-neutral">&nbsp;</span>
920
+ <span class="cline-any cline-neutral">&nbsp;</span>
921
+ <span class="cline-any cline-neutral">&nbsp;</span>
922
+ <span class="cline-any cline-neutral">&nbsp;</span>
923
+ <span class="cline-any cline-yes">1x</span>
924
+ <span class="cline-any cline-yes">620x</span>
925
+ <span class="cline-any cline-yes">620x</span>
926
+ <span class="cline-any cline-yes">620x</span>
927
+ <span class="cline-any cline-yes">620x</span>
928
+ <span class="cline-any cline-yes">294x</span>
929
+ <span class="cline-any cline-yes">291x</span>
930
+ <span class="cline-any cline-neutral">&nbsp;</span>
931
+ <span class="cline-any cline-yes">620x</span>
932
+ <span class="cline-any cline-no">&nbsp;</span>
933
+ <span class="cline-any cline-neutral">&nbsp;</span>
934
+ <span class="cline-any cline-yes">620x</span>
935
+ <span class="cline-any cline-no">&nbsp;</span>
936
+ <span class="cline-any cline-neutral">&nbsp;</span>
937
+ <span class="cline-any cline-yes">620x</span>
938
+ <span class="cline-any cline-yes">326x</span>
939
+ <span class="cline-any cline-neutral">&nbsp;</span>
940
+ <span class="cline-any cline-yes">620x</span>
941
+ <span class="cline-any cline-no">&nbsp;</span>
942
+ <span class="cline-any cline-yes">620x</span>
943
+ <span class="cline-any cline-yes">620x</span>
944
+ <span class="cline-any cline-neutral">&nbsp;</span>
945
+ <span class="cline-any cline-neutral">&nbsp;</span>
946
+ <span class="cline-any cline-neutral">&nbsp;</span>
947
+ <span class="cline-any cline-neutral">&nbsp;</span>
948
+ <span class="cline-any cline-yes">1x</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-yes">293x</span>
953
+ <span class="cline-any cline-yes">293x</span>
954
+ <span class="cline-any cline-yes">293x</span>
955
+ <span class="cline-any cline-neutral">&nbsp;</span>
956
+ <span class="cline-any cline-neutral">&nbsp;</span>
957
+ <span class="cline-any cline-neutral">&nbsp;</span>
958
+ <span class="cline-any cline-neutral">&nbsp;</span>
959
+ <span class="cline-any cline-yes">293x</span>
960
+ <span class="cline-any cline-yes">293x</span>
961
+ <span class="cline-any cline-yes">293x</span>
962
+ <span class="cline-any cline-yes">293x</span>
963
+ <span class="cline-any cline-yes">293x</span>
964
+ <span class="cline-any cline-yes">293x</span>
965
+ <span class="cline-any cline-yes">293x</span>
966
+ <span class="cline-any cline-yes">293x</span>
967
+ <span class="cline-any cline-yes">293x</span>
968
+ <span class="cline-any cline-yes">293x</span>
969
+ <span class="cline-any cline-yes">293x</span>
970
+ <span class="cline-any cline-yes">293x</span>
971
+ <span class="cline-any cline-yes">293x</span>
972
+ <span class="cline-any cline-no">&nbsp;</span>
973
+ <span class="cline-any cline-no">&nbsp;</span>
974
+ <span class="cline-any cline-yes">293x</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-yes">1x</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-yes">293x</span>
989
+ <span class="cline-any cline-yes">293x</span>
990
+ <span class="cline-any cline-yes">293x</span>
991
+ <span class="cline-any cline-yes">293x</span>
992
+ <span class="cline-any cline-yes">293x</span>
993
+ <span class="cline-any cline-yes">293x</span>
994
+ <span class="cline-any cline-yes">293x</span>
995
+ <span class="cline-any cline-yes">293x</span>
996
+ <span class="cline-any cline-yes">293x</span>
997
+ <span class="cline-any cline-yes">293x</span>
998
+ <span class="cline-any cline-yes">293x</span>
999
+ <span class="cline-any cline-neutral">&nbsp;</span>
1000
+ <span class="cline-any cline-neutral">&nbsp;</span>
1001
+ <span class="cline-any cline-yes">293x</span>
1002
+ <span class="cline-any cline-yes">293x</span>
1003
+ <span class="cline-any cline-yes">293x</span>
1004
+ <span class="cline-any cline-yes">293x</span>
1005
+ <span class="cline-any cline-yes">293x</span>
1006
+ <span class="cline-any cline-yes">293x</span>
1007
+ <span class="cline-any cline-neutral">&nbsp;</span>
1008
+ <span class="cline-any cline-neutral">&nbsp;</span>
1009
+ <span class="cline-any cline-yes">293x</span>
1010
+ <span class="cline-any cline-yes">293x</span>
1011
+ <span class="cline-any cline-yes">293x</span>
1012
+ <span class="cline-any cline-yes">293x</span>
1013
+ <span class="cline-any cline-yes">293x</span>
1014
+ <span class="cline-any cline-yes">293x</span>
1015
+ <span class="cline-any cline-yes">293x</span>
1016
+ <span class="cline-any cline-yes">293x</span>
1017
+ <span class="cline-any cline-yes">293x</span>
1018
+ <span class="cline-any cline-yes">293x</span>
1019
+ <span class="cline-any cline-yes">293x</span>
1020
+ <span class="cline-any cline-yes">293x</span>
1021
+ <span class="cline-any cline-yes">293x</span>
1022
+ <span class="cline-any cline-yes">293x</span>
1023
+ <span class="cline-any cline-yes">293x</span>
1024
+ <span class="cline-any cline-no">&nbsp;</span>
1025
+ <span class="cline-any cline-no">&nbsp;</span>
1026
+ <span class="cline-any cline-no">&nbsp;</span>
1027
+ <span class="cline-any cline-no">&nbsp;</span>
1028
+ <span class="cline-any cline-no">&nbsp;</span>
1029
+ <span class="cline-any cline-no">&nbsp;</span>
1030
+ <span class="cline-any cline-no">&nbsp;</span>
1031
+ <span class="cline-any cline-yes">293x</span>
1032
+ <span class="cline-any cline-neutral">&nbsp;</span>
1033
+ <span class="cline-any cline-yes">293x</span>
1034
+ <span class="cline-any cline-neutral">&nbsp;</span>
1035
+ <span class="cline-any cline-yes">293x</span>
1036
+ <span class="cline-any cline-yes">293x</span>
1037
+ <span class="cline-any cline-neutral">&nbsp;</span>
1038
+ <span class="cline-any cline-neutral">&nbsp;</span>
1039
+ <span class="cline-any cline-neutral">&nbsp;</span>
1040
+ <span class="cline-any cline-neutral">&nbsp;</span>
1041
+ <span class="cline-any cline-yes">1x</span>
1042
+ <span class="cline-any cline-yes">293x</span>
1043
+ <span class="cline-any cline-yes">293x</span>
1044
+ <span class="cline-any cline-yes">293x</span>
1045
+ <span class="cline-any cline-neutral">&nbsp;</span>
1046
+ <span class="cline-any cline-neutral">&nbsp;</span>
1047
+ <span class="cline-any cline-neutral">&nbsp;</span>
1048
+ <span class="cline-any cline-yes">293x</span>
1049
+ <span class="cline-any cline-yes">293x</span>
1050
+ <span class="cline-any cline-yes">293x</span>
1051
+ <span class="cline-any cline-yes">293x</span>
1052
+ <span class="cline-any cline-yes">293x</span>
1053
+ <span class="cline-any cline-yes">293x</span>
1054
+ <span class="cline-any cline-yes">293x</span>
1055
+ <span class="cline-any cline-yes">293x</span>
1056
+ <span class="cline-any cline-neutral">&nbsp;</span>
1057
+ <span class="cline-any cline-yes">293x</span>
1058
+ <span class="cline-any cline-yes">3x</span>
1059
+ <span class="cline-any cline-yes">3x</span>
1060
+ <span class="cline-any cline-yes">3x</span>
1061
+ <span class="cline-any cline-yes">3x</span>
1062
+ <span class="cline-any cline-yes">3x</span>
1063
+ <span class="cline-any cline-yes">3x</span>
1064
+ <span class="cline-any cline-yes">3x</span>
1065
+ <span class="cline-any cline-yes">293x</span>
1066
+ <span class="cline-any cline-yes">290x</span>
1067
+ <span class="cline-any cline-yes">290x</span>
1068
+ <span class="cline-any cline-yes">290x</span>
1069
+ <span class="cline-any cline-yes">290x</span>
1070
+ <span class="cline-any cline-yes">290x</span>
1071
+ <span class="cline-any cline-yes">290x</span>
1072
+ <span class="cline-any cline-yes">290x</span>
1073
+ <span class="cline-any cline-yes">290x</span>
1074
+ <span class="cline-any cline-yes">293x</span>
1075
+ <span class="cline-any cline-neutral">&nbsp;</span>
1076
+ <span class="cline-any cline-neutral">&nbsp;</span>
1077
+ <span class="cline-any cline-neutral">&nbsp;</span>
1078
+ <span class="cline-any cline-neutral">&nbsp;</span>
1079
+ <span class="cline-any cline-yes">1x</span>
1080
+ <span class="cline-any cline-yes">290x</span>
1081
+ <span class="cline-any cline-yes">290x</span>
1082
+ <span class="cline-any cline-yes">290x</span>
1083
+ <span class="cline-any cline-neutral">&nbsp;</span>
1084
+ <span class="cline-any cline-neutral">&nbsp;</span>
1085
+ <span class="cline-any cline-neutral">&nbsp;</span>
1086
+ <span class="cline-any cline-yes">290x</span>
1087
+ <span class="cline-any cline-yes">290x</span>
1088
+ <span class="cline-any cline-yes">290x</span>
1089
+ <span class="cline-any cline-yes">290x</span>
1090
+ <span class="cline-any cline-yes">290x</span>
1091
+ <span class="cline-any cline-neutral">&nbsp;</span>
1092
+ <span class="cline-any cline-neutral">&nbsp;</span>
1093
+ <span class="cline-any cline-yes">290x</span>
1094
+ <span class="cline-any cline-yes">41x</span>
1095
+ <span class="cline-any cline-yes">44x</span>
1096
+ <span class="cline-any cline-yes">44x</span>
1097
+ <span class="cline-any cline-yes">12x</span>
1098
+ <span class="cline-any cline-yes">12x</span>
1099
+ <span class="cline-any cline-yes">12x</span>
1100
+ <span class="cline-any cline-yes">12x</span>
1101
+ <span class="cline-any cline-yes">44x</span>
1102
+ <span class="cline-any cline-yes">44x</span>
1103
+ <span class="cline-any cline-yes">41x</span>
1104
+ <span class="cline-any cline-yes">41x</span>
1105
+ <span class="cline-any cline-neutral">&nbsp;</span>
1106
+ <span class="cline-any cline-neutral">&nbsp;</span>
1107
+ <span class="cline-any cline-yes">290x</span>
1108
+ <span class="cline-any cline-yes">290x</span>
1109
+ <span class="cline-any cline-yes">290x</span>
1110
+ <span class="cline-any cline-yes">290x</span>
1111
+ <span class="cline-any cline-yes">290x</span>
1112
+ <span class="cline-any cline-neutral">&nbsp;</span>
1113
+ <span class="cline-any cline-neutral">&nbsp;</span>
1114
+ <span class="cline-any cline-neutral">&nbsp;</span>
1115
+ <span class="cline-any cline-neutral">&nbsp;</span>
1116
+ <span class="cline-any cline-yes">1x</span>
1117
+ <span class="cline-any cline-yes">3x</span>
1118
+ <span class="cline-any cline-yes">3x</span>
1119
+ <span class="cline-any cline-yes">3x</span>
1120
+ <span class="cline-any cline-yes">3x</span>
1121
+ <span class="cline-any cline-yes">3x</span>
1122
+ <span class="cline-any cline-yes">3x</span>
1123
+ <span class="cline-any cline-yes">3x</span>
1124
+ <span class="cline-any cline-yes">3x</span>
1125
+ <span class="cline-any cline-yes">3x</span>
1126
+ <span class="cline-any cline-yes">3x</span>
1127
+ <span class="cline-any cline-neutral">&nbsp;</span>
1128
+ <span class="cline-any cline-yes">3x</span>
1129
+ <span class="cline-any cline-yes">3x</span>
1130
+ <span class="cline-any cline-yes">3x</span>
1131
+ <span class="cline-any cline-neutral">&nbsp;</span>
1132
+ <span class="cline-any cline-yes">3x</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-yes">2x</span>
1136
+ <span class="cline-any cline-yes">2x</span>
1137
+ <span class="cline-any cline-yes">2x</span>
1138
+ <span class="cline-any cline-neutral">&nbsp;</span>
1139
+ <span class="cline-any cline-yes">3x</span>
1140
+ <span class="cline-any cline-yes">3x</span>
1141
+ <span class="cline-any cline-neutral">&nbsp;</span>
1142
+ <span class="cline-any cline-neutral">&nbsp;</span>
1143
+ <span class="cline-any cline-neutral">&nbsp;</span>
1144
+ <span class="cline-any cline-neutral">&nbsp;</span>
1145
+ <span class="cline-any cline-yes">1x</span>
1146
+ <span class="cline-any cline-yes">293x</span>
1147
+ <span class="cline-any cline-yes">293x</span>
1148
+ <span class="cline-any cline-yes">293x</span>
1149
+ <span class="cline-any cline-yes">293x</span>
1150
+ <span class="cline-any cline-yes">293x</span>
1151
+ <span class="cline-any cline-yes">293x</span>
1152
+ <span class="cline-any cline-yes">293x</span>
1153
+ <span class="cline-any cline-yes">245x</span>
1154
+ <span class="cline-any cline-yes">245x</span>
1155
+ <span class="cline-any cline-yes">245x</span>
1156
+ <span class="cline-any cline-yes">245x</span>
1157
+ <span class="cline-any cline-yes">245x</span>
1158
+ <span class="cline-any cline-neutral">&nbsp;</span>
1159
+ <span class="cline-any cline-yes">293x</span>
1160
+ <span class="cline-any cline-yes">27x</span>
1161
+ <span class="cline-any cline-yes">27x</span>
1162
+ <span class="cline-any cline-yes">27x</span>
1163
+ <span class="cline-any cline-yes">27x</span>
1164
+ <span class="cline-any cline-yes">27x</span>
1165
+ <span class="cline-any cline-yes">27x</span>
1166
+ <span class="cline-any cline-yes">27x</span>
1167
+ <span class="cline-any cline-neutral">&nbsp;</span>
1168
+ <span class="cline-any cline-yes">293x</span>
1169
+ <span class="cline-any cline-neutral">&nbsp;</span>
1170
+ <span class="cline-any cline-yes">21x</span>
1171
+ <span class="cline-any cline-yes">293x</span>
1172
+ <span class="cline-any cline-yes">293x</span>
1173
+ <span class="cline-any cline-neutral">&nbsp;</span>
1174
+ <span class="cline-any cline-neutral">&nbsp;</span>
1175
+ <span class="cline-any cline-neutral">&nbsp;</span>
1176
+ <span class="cline-any cline-neutral">&nbsp;</span>
1177
+ <span class="cline-any cline-yes">1x</span>
1178
+ <span class="cline-any cline-neutral">&nbsp;</span>
1179
+ <span class="cline-any cline-neutral">&nbsp;</span>
1180
+ <span class="cline-any cline-yes">309x</span>
1181
+ <span class="cline-any cline-yes">309x</span>
1182
+ <span class="cline-any cline-yes">309x</span>
1183
+ <span class="cline-any cline-yes">1x</span>
1184
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/* eslint-disable @typescript-eslint/no-explicit-any */
1185
+ /* eslint-disable @typescript-eslint/no-empty-object-type */
1186
+ import type { z, ZodObject, ZodOptional } from 'zod/v4'
1187
+ &nbsp;
1188
+ import type { FactoryContext } from './factory-context.mjs'
1189
+ import type {
1190
+ AnyInjectableType,
1191
+ BaseInjectionTokenSchemaType,
1192
+ InjectionTokenSchemaType,
1193
+ InjectionTokenType,
1194
+ OptionalInjectionTokenSchemaType,
1195
+ } from './injection-token.mjs'
1196
+ import type { Registry } from './registry.mjs'
1197
+ import type { RequestContextHolder } from './request-context-holder.mjs'
1198
+ import type { ServiceInstantiator } from './service-instantiator.mjs'
1199
+ import type { ServiceLocatorInstanceHolder } from './service-locator-instance-holder.mjs'
1200
+ import type { ServiceLocatorManager } from './service-locator-manager.mjs'
1201
+ import type { ServiceLocator } from './service-locator.mjs'
1202
+ import type { TokenProcessor } from './token-processor.mjs'
1203
+ &nbsp;
1204
+ import { InjectableScope } from './enums/index.mjs'
1205
+ import { DIError, DIErrorCode } from './errors/index.mjs'
1206
+ import {
1207
+ BoundInjectionToken,
1208
+ FactoryInjectionToken,
1209
+ InjectionToken,
1210
+ } from './injection-token.mjs'
1211
+ import { ServiceLocatorInstanceHolderStatus } from './service-locator-instance-holder.mjs'
1212
+ &nbsp;
1213
+ /**
1214
+ * InstanceResolver handles instance resolution, creation, and lifecycle management.
1215
+ * Extracted from ServiceLocator to improve separation of concerns.
1216
+ */
1217
+ export class InstanceResolver {
1218
+ constructor(
1219
+ private readonly registry: Registry,
1220
+ private readonly manager: ServiceLocatorManager,
1221
+ private readonly serviceInstantiator: ServiceInstantiator,
1222
+ private readonly tokenProcessor: TokenProcessor,
1223
+ private readonly logger: Console | null = null,
1224
+ private readonly serviceLocator: ServiceLocator,
1225
+ ) {}
1226
+ &nbsp;
1227
+ /**
1228
+ * Resolves an instance for the given token and arguments.
1229
+ */
1230
+ async resolveInstance(
1231
+ token: AnyInjectableType,
1232
+ args?: any,
1233
+ requestContext?: RequestContextHolder,
1234
+ ): Promise&lt;[undefined, any] | [DIError]&gt; {
1235
+ const [err, data] = await this.resolveTokenAndPrepareInstanceName(
1236
+ token,
1237
+ args,
1238
+ )
1239
+ if (err) {
1240
+ return [err]
1241
+ }
1242
+ &nbsp;
1243
+ const {
1244
+ instanceName,
1245
+ validatedArgs,
1246
+ actualToken: _actualToken,
1247
+ realToken,
1248
+ } = data
1249
+ &nbsp;
1250
+ const [error, holder] = await this.retrieveOrCreateInstanceByInstanceName(
1251
+ instanceName,
1252
+ realToken,
1253
+ validatedArgs,
1254
+ requestContext,
1255
+ )
1256
+ if (error) {
1257
+ return [error]
1258
+ }
1259
+ return [undefined, holder.instance]
1260
+ }
1261
+ &nbsp;
1262
+ /**
1263
+ * Gets a synchronous instance (for sync operations).
1264
+ */
1265
+ getSyncInstance&lt;
1266
+ Instance,
1267
+ Schema extends InjectionTokenSchemaType | undefined,
1268
+ &gt;(
1269
+ token: AnyInjectableType,
1270
+ args: Schema extends ZodObject
1271
+ ? z.input&lt;Schema&gt;
1272
+ : Schema extends ZodOptional&lt;ZodObject&gt;
1273
+ ? z.input&lt;Schema&gt; | undefined
1274
+ : undefined,
1275
+ currentRequestContext: RequestContextHolder | null,
1276
+ ): Instance | null {
1277
+ const [err, { actualToken, validatedArgs }] =
1278
+ this.tokenProcessor.validateAndResolveTokenArgs(token, args)
1279
+ if (err) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1280
+ <span class="cstat-no" title="statement not covered" > return null</span>
1281
+ <span class="cstat-no" title="statement not covered" > }</span>
1282
+ const instanceName = this.tokenProcessor.generateInstanceName(
1283
+ actualToken,
1284
+ validatedArgs,
1285
+ )
1286
+ &nbsp;
1287
+ // Try request context first
1288
+ if (currentRequestContext) {
1289
+ const requestHolder = currentRequestContext.get(instanceName)
1290
+ if (requestHolder) {
1291
+ return requestHolder.instance as Instance
1292
+ }
1293
+ }
1294
+ &nbsp;
1295
+ // Try singleton manager
1296
+ const [error, holder] = this.manager.get(instanceName)
1297
+ if (error) {
1298
+ return null
1299
+ }
1300
+ return holder.instance as Instance
1301
+ }
1302
+ &nbsp;
1303
+ /**
1304
+ * Internal method to resolve token args and create instance name.
1305
+ * Handles factory token resolution and validation.
1306
+ */
1307
+ private async resolveTokenAndPrepareInstanceName(
1308
+ token: AnyInjectableType,
1309
+ args?: any,
1310
+ ): Promise&lt;
1311
+ | [
1312
+ undefined,
1313
+ {
1314
+ instanceName: string
1315
+ validatedArgs: any
1316
+ actualToken: InjectionTokenType
1317
+ realToken: InjectionToken&lt;any, any&gt;
1318
+ },
1319
+ ]
1320
+ | [DIError]
1321
+ &gt; {
1322
+ const [err, { actualToken, validatedArgs }] =
1323
+ this.tokenProcessor.validateAndResolveTokenArgs(token, args)
1324
+ if (err instanceof DIError &amp;&amp; err.code === DIErrorCode.UnknownError) {
1325
+ return [err]
1326
+ } else if (
1327
+ err instanceof DIError &amp;&amp;
1328
+ err.code === DIErrorCode.FactoryTokenNotResolved &amp;&amp;
1329
+ actualToken instanceof FactoryInjectionToken
1330
+ ) {
1331
+ this.logger?.log(
1332
+ `[InstanceResolver]#resolveTokenAndPrepareInstanceName() Factory token not resolved, resolving it`,
1333
+ )
1334
+ await actualToken.resolve(this.createFactoryContext())
1335
+ return this.resolveTokenAndPrepareInstanceName(token)
1336
+ }
1337
+ const instanceName = this.tokenProcessor.generateInstanceName(
1338
+ actualToken,
1339
+ validatedArgs,
1340
+ )
1341
+ // Determine the real token (the actual InjectionToken that will be used for resolution)
1342
+ const realToken =
1343
+ actualToken instanceof BoundInjectionToken ||
1344
+ actualToken instanceof FactoryInjectionToken
1345
+ ? actualToken.token
1346
+ : actualToken
1347
+ return [undefined, { instanceName, validatedArgs, actualToken, realToken }]
1348
+ }
1349
+ &nbsp;
1350
+ /**
1351
+ * Gets an instance by its instance name, handling all the logic after instance name creation.
1352
+ */
1353
+ private async retrieveOrCreateInstanceByInstanceName(
1354
+ instanceName: string,
1355
+ realToken: InjectionToken&lt;any, any&gt;,
1356
+ realArgs: any,
1357
+ requestContext?: RequestContextHolder,
1358
+ ): Promise&lt;[undefined, ServiceLocatorInstanceHolder&lt;any&gt;] | [DIError]&gt; {
1359
+ // Try to get existing instance (handles both request-scoped and singleton)
1360
+ const existingHolder = await this.tryGetExistingInstance(
1361
+ instanceName,
1362
+ realToken,
1363
+ requestContext,
1364
+ )
1365
+ if (existingHolder) {
1366
+ return existingHolder
1367
+ }
1368
+ &nbsp;
1369
+ // No existing instance found, create a new one
1370
+ const result = await this.createNewInstance(
1371
+ instanceName,
1372
+ realToken,
1373
+ realArgs,
1374
+ requestContext,
1375
+ )
1376
+ if (result[0]) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1377
+ <span class="cstat-no" title="statement not covered" > return [result[0]]</span>
1378
+ <span class="cstat-no" title="statement not covered" > }</span>
1379
+ &nbsp;
1380
+ const [, holder] = result
1381
+ return this.waitForInstanceReady(holder)
1382
+ }
1383
+ &nbsp;
1384
+ /**
1385
+ * Attempts to retrieve an existing instance, handling request-scoped and singleton instances.
1386
+ * Returns null if no instance exists and a new one should be created.
1387
+ */
1388
+ private async tryGetExistingInstance(
1389
+ instanceName: string,
1390
+ realToken: InjectionToken&lt;any, any&gt;,
1391
+ requestContext?: RequestContextHolder,
1392
+ ): Promise&lt;
1393
+ [undefined, ServiceLocatorInstanceHolder&lt;any&gt;] | [DIError] | null
1394
+ &gt; {
1395
+ // Check request-scoped instances first
1396
+ const requestResult = await this.tryGetRequestScopedInstance(
1397
+ instanceName,
1398
+ realToken,
1399
+ requestContext,
1400
+ )
1401
+ if (requestResult) {
1402
+ return requestResult
1403
+ }
1404
+ &nbsp;
1405
+ // Check singleton instances
1406
+ return this.tryGetSingletonInstance(instanceName)
1407
+ }
1408
+ &nbsp;
1409
+ /**
1410
+ * Attempts to get a request-scoped instance if applicable.
1411
+ */
1412
+ private async tryGetRequestScopedInstance(
1413
+ instanceName: string,
1414
+ realToken: InjectionToken&lt;any, any&gt;,
1415
+ requestContext?: RequestContextHolder,
1416
+ ): Promise&lt;
1417
+ [undefined, ServiceLocatorInstanceHolder&lt;any&gt;] | [DIError] | null
1418
+ &gt; {
1419
+ if (!this.registry.has(realToken)) {
1420
+ return null
1421
+ }
1422
+ &nbsp;
1423
+ const record = this.registry.get(realToken)
1424
+ if (record.scope !== InjectableScope.Request) {
1425
+ return null
1426
+ }
1427
+ &nbsp;
1428
+ if (!requestContext) {
1429
+ this.logger?.log(
1430
+ `[InstanceResolver] No current request context available for request-scoped service ${instanceName}`,
1431
+ )
1432
+ return [
1433
+ DIError.unknown(
1434
+ `No current request context available for request-scoped service ${instanceName}`,
1435
+ ),
1436
+ ]
1437
+ }
1438
+ &nbsp;
1439
+ const requestHolder = requestContext.get(instanceName)
1440
+ if (!requestHolder) {
1441
+ return null
1442
+ }
1443
+ &nbsp;
1444
+ return this.waitForInstanceReady(requestHolder)
1445
+ }
1446
+ &nbsp;
1447
+ /**
1448
+ * Attempts to get a singleton instance from the manager.
1449
+ */
1450
+ private async tryGetSingletonInstance(
1451
+ instanceName: string,
1452
+ ): Promise&lt;
1453
+ [undefined, ServiceLocatorInstanceHolder&lt;any&gt;] | [DIError] | null
1454
+ &gt; {
1455
+ const [error, holder] = this.manager.get(instanceName)
1456
+ &nbsp;
1457
+ if (!error) {
1458
+ return this.waitForInstanceReady(holder)
1459
+ }
1460
+ &nbsp;
1461
+ // Handle recovery scenarios
1462
+ switch (error.code) {
1463
+ <span class="branch-0 cbranch-no" title="branch not covered" > case DIErrorCode.InstanceDestroying:</span>
1464
+ <span class="cstat-no" title="statement not covered" > this.logger?.log(</span>
1465
+ <span class="cstat-no" title="statement not covered" > `[InstanceResolver] Instance ${instanceName} is being destroyed, waiting...`,</span>
1466
+ <span class="cstat-no" title="statement not covered" > )</span>
1467
+ <span class="cstat-no" title="statement not covered" > await holder?.destroyPromise</span>
1468
+ // Retry after destruction is complete
1469
+ <span class="cstat-no" title="statement not covered" > return this.tryGetSingletonInstance(instanceName)</span>
1470
+ &nbsp;
1471
+ case DIErrorCode.InstanceNotFound:
1472
+ return null // Instance doesn't exist, should create new one
1473
+ &nbsp;
1474
+ <span class="branch-0 cbranch-no" title="branch not covered" > default:</span>
1475
+ <span class="cstat-no" title="statement not covered" > return [error]</span>
1476
+ }
1477
+ }
1478
+ &nbsp;
1479
+ /**
1480
+ * Waits for an instance holder to be ready and returns the appropriate result.
1481
+ */
1482
+ private async waitForInstanceReady&lt;T&gt;(
1483
+ holder: ServiceLocatorInstanceHolder&lt;T&gt;,
1484
+ ): Promise&lt;[undefined, ServiceLocatorInstanceHolder&lt;T&gt;] | [DIError]&gt; {
1485
+ switch (holder.status) {
1486
+ case ServiceLocatorInstanceHolderStatus.Creating:
1487
+ await holder.creationPromise
1488
+ return this.waitForInstanceReady(holder)
1489
+ &nbsp;
1490
+ <span class="branch-0 cbranch-no" title="branch not covered" > case ServiceLocatorInstanceHolderStatus.Destroying:</span>
1491
+ <span class="cstat-no" title="statement not covered" > return [DIError.instanceDestroying(holder.name)]</span>
1492
+ &nbsp;
1493
+ <span class="branch-0 cbranch-no" title="branch not covered" > case ServiceLocatorInstanceHolderStatus.Error:</span>
1494
+ <span class="cstat-no" title="statement not covered" > return [holder.instance as DIError]</span>
1495
+ &nbsp;
1496
+ case ServiceLocatorInstanceHolderStatus.Created:
1497
+ return [undefined, holder]
1498
+ &nbsp;
1499
+ <span class="branch-0 cbranch-no" title="branch not covered" > default:</span>
1500
+ <span class="cstat-no" title="statement not covered" > return [DIError.instanceNotFound('unknown')]</span>
1501
+ }
1502
+ }
1503
+ &nbsp;
1504
+ /**
1505
+ * Creates a new instance for the given token and arguments.
1506
+ */
1507
+ private async createNewInstance&lt;
1508
+ Instance,
1509
+ Schema extends InjectionTokenSchemaType | undefined,
1510
+ &gt;(
1511
+ instanceName: string,
1512
+ realToken: InjectionToken&lt;Instance, Schema&gt;,
1513
+ args: Schema extends ZodObject
1514
+ ? z.output&lt;Schema&gt;
1515
+ : Schema extends ZodOptional&lt;ZodObject&gt;
1516
+ ? z.output&lt;Schema&gt; | undefined
1517
+ : undefined,
1518
+ requestContext?: RequestContextHolder,
1519
+ ): Promise&lt;[undefined, ServiceLocatorInstanceHolder&lt;Instance&gt;] | [DIError]&gt; {
1520
+ this.logger?.log(
1521
+ `[InstanceResolver]#createNewInstance() Creating instance for ${instanceName}`,
1522
+ )
1523
+ if (this.registry.has(realToken)) {
1524
+ return this.instantiateServiceFromRegistry&lt;Instance, Schema, any&gt;(
1525
+ instanceName,
1526
+ realToken,
1527
+ args,
1528
+ requestContext,
1529
+ )
1530
+ <span class="branch-0 cbranch-no" title="branch not covered" > } else {</span>
1531
+ <span class="cstat-no" title="statement not covered" > return [DIError.factoryNotFound(realToken.name.toString())]</span>
1532
+ <span class="cstat-no" title="statement not covered" > }</span>
1533
+ }
1534
+ &nbsp;
1535
+ /**
1536
+ * Instantiates a service from the registry using the service instantiator.
1537
+ */
1538
+ private instantiateServiceFromRegistry&lt;
1539
+ Instance,
1540
+ Schema extends InjectionTokenSchemaType | undefined,
1541
+ Args extends Schema extends BaseInjectionTokenSchemaType
1542
+ ? z.output&lt;Schema&gt;
1543
+ : Schema extends OptionalInjectionTokenSchemaType
1544
+ ? z.output&lt;Schema&gt; | undefined
1545
+ : undefined,
1546
+ &gt;(
1547
+ instanceName: string,
1548
+ token: InjectionToken&lt;Instance, Schema&gt;,
1549
+ args: Args,
1550
+ requestContext?: RequestContextHolder,
1551
+ ): Promise&lt;[undefined, ServiceLocatorInstanceHolder&lt;Instance&gt;]&gt; {
1552
+ this.logger?.log(
1553
+ `[InstanceResolver]#instantiateServiceFromRegistry(): Creating instance for ${instanceName} from abstract factory`,
1554
+ )
1555
+ const ctx = this.createFactoryContext()
1556
+ let record = this.registry.get&lt;Instance, Schema&gt;(token)
1557
+ let { scope, type } = record
1558
+ &nbsp;
1559
+ // Use createCreatingHolder from manager
1560
+ const [deferred, holder] = this.manager.createCreatingHolder&lt;Instance&gt;(
1561
+ instanceName,
1562
+ type,
1563
+ scope,
1564
+ ctx.deps,
1565
+ )
1566
+ &nbsp;
1567
+ // Start the instantiation process
1568
+ this.serviceInstantiator
1569
+ .instantiateService(ctx, record, args)
1570
+ .then(async ([error, instance]) =&gt; {
1571
+ await this.handleInstantiationResult(
1572
+ instanceName,
1573
+ holder,
1574
+ ctx,
1575
+ deferred,
1576
+ scope,
1577
+ error,
1578
+ instance,
1579
+ requestContext,
1580
+ )
1581
+ })
1582
+ .catch(async (error) =&gt; {
1583
+ <span class="cstat-no" title="statement not covered" > await this.handleInstantiationError(</span>
1584
+ <span class="cstat-no" title="statement not covered" > instanceName,</span>
1585
+ <span class="cstat-no" title="statement not covered" > holder,</span>
1586
+ <span class="cstat-no" title="statement not covered" > deferred,</span>
1587
+ <span class="cstat-no" title="statement not covered" > scope,</span>
1588
+ <span class="cstat-no" title="statement not covered" > error,</span>
1589
+ <span class="cstat-no" title="statement not covered" > )</span>
1590
+ })
1591
+ &nbsp;
1592
+ this.storeInstanceByScope(scope, instanceName, holder, requestContext)
1593
+ // @ts-expect-error TS2322 This is correct type
1594
+ return [undefined, holder]
1595
+ }
1596
+ &nbsp;
1597
+ /**
1598
+ * Handles the result of service instantiation.
1599
+ */
1600
+ private async handleInstantiationResult(
1601
+ instanceName: string,
1602
+ holder: ServiceLocatorInstanceHolder&lt;any&gt;,
1603
+ ctx: FactoryContext &amp; {
1604
+ deps: Set&lt;string&gt;
1605
+ getDestroyListeners: () =&gt; (() =&gt; void)[]
1606
+ },
1607
+ deferred: any,
1608
+ scope: InjectableScope,
1609
+ error: any,
1610
+ instance: any,
1611
+ _requestContext?: RequestContextHolder,
1612
+ ): Promise&lt;void&gt; {
1613
+ holder.destroyListeners = ctx.getDestroyListeners()
1614
+ holder.creationPromise = null
1615
+ &nbsp;
1616
+ if (error) {
1617
+ await this.handleInstantiationError(
1618
+ instanceName,
1619
+ holder,
1620
+ deferred,
1621
+ scope,
1622
+ error,
1623
+ )
1624
+ } else {
1625
+ await this.handleInstantiationSuccess(
1626
+ instanceName,
1627
+ holder,
1628
+ ctx,
1629
+ deferred,
1630
+ instance,
1631
+ )
1632
+ }
1633
+ }
1634
+ &nbsp;
1635
+ /**
1636
+ * Handles successful service instantiation.
1637
+ */
1638
+ private async handleInstantiationSuccess(
1639
+ instanceName: string,
1640
+ holder: ServiceLocatorInstanceHolder&lt;any&gt;,
1641
+ ctx: FactoryContext &amp; {
1642
+ deps: Set&lt;string&gt;
1643
+ getDestroyListeners: () =&gt; (() =&gt; void)[]
1644
+ },
1645
+ deferred: any,
1646
+ instance: any,
1647
+ ): Promise&lt;void&gt; {
1648
+ holder.instance = instance
1649
+ holder.status = ServiceLocatorInstanceHolderStatus.Created
1650
+ &nbsp;
1651
+ // Set up dependency invalidation listeners
1652
+ if (ctx.deps.size &gt; 0) {
1653
+ ctx.deps.forEach((dependency: string) =&gt; {
1654
+ holder.destroyListeners.push(
1655
+ this.serviceLocator.getEventBus().on(dependency, 'destroy', () =&gt; {
1656
+ this.logger?.log(
1657
+ `[InstanceResolver] Dependency ${dependency} destroyed, invalidating ${instanceName}`,
1658
+ )
1659
+ this.serviceLocator.getServiceInvalidator().invalidate(instanceName)
1660
+ }),
1661
+ )
1662
+ })
1663
+ }
1664
+ &nbsp;
1665
+ // Note: Event emission would need access to the event bus
1666
+ this.logger?.log(
1667
+ `[InstanceResolver] Instance ${instanceName} created successfully`,
1668
+ )
1669
+ deferred.resolve([undefined, instance])
1670
+ }
1671
+ &nbsp;
1672
+ /**
1673
+ * Handles service instantiation errors.
1674
+ */
1675
+ private async handleInstantiationError(
1676
+ instanceName: string,
1677
+ holder: ServiceLocatorInstanceHolder&lt;any&gt;,
1678
+ deferred: any,
1679
+ scope: InjectableScope,
1680
+ error: any,
1681
+ ): Promise&lt;void&gt; {
1682
+ this.logger?.error(
1683
+ `[InstanceResolver] Error creating instance for ${instanceName}`,
1684
+ error,
1685
+ )
1686
+ &nbsp;
1687
+ holder.status = ServiceLocatorInstanceHolderStatus.Error
1688
+ holder.instance = error
1689
+ holder.creationPromise = null
1690
+ &nbsp;
1691
+ if (scope === InjectableScope.Singleton) {
1692
+ this.logger?.log(
1693
+ `[InstanceResolver] Singleton ${instanceName} failed, will be invalidated`,
1694
+ )
1695
+ this.serviceLocator.getServiceInvalidator().invalidate(instanceName)
1696
+ }
1697
+ &nbsp;
1698
+ deferred.reject(error)
1699
+ }
1700
+ &nbsp;
1701
+ /**
1702
+ * Stores an instance holder based on its scope.
1703
+ */
1704
+ private storeInstanceByScope(
1705
+ scope: InjectableScope,
1706
+ instanceName: string,
1707
+ holder: ServiceLocatorInstanceHolder&lt;any&gt;,
1708
+ requestContext?: RequestContextHolder,
1709
+ ): void {
1710
+ switch (scope) {
1711
+ case InjectableScope.Singleton:
1712
+ this.logger?.debug(
1713
+ `[InstanceResolver] Setting singleton instance for ${instanceName}`,
1714
+ )
1715
+ this.manager.set(instanceName, holder)
1716
+ break
1717
+ &nbsp;
1718
+ case InjectableScope.Request:
1719
+ if (requestContext) {
1720
+ this.logger?.debug(
1721
+ `[InstanceResolver] Setting request-scoped instance for ${instanceName}`,
1722
+ )
1723
+ requestContext.addInstance(instanceName, holder.instance, holder)
1724
+ }
1725
+ break
1726
+ &nbsp;
1727
+ case InjectableScope.Transient:
1728
+ // Transient instances are not stored anywhere
1729
+ break
1730
+ }
1731
+ }
1732
+ &nbsp;
1733
+ /**
1734
+ * Creates a factory context for dependency injection during service instantiation.
1735
+ */
1736
+ private createFactoryContext(): FactoryContext &amp; {
1737
+ getDestroyListeners: () =&gt; (() =&gt; void)[]
1738
+ deps: Set&lt;string&gt;
1739
+ } {
1740
+ return this.tokenProcessor.createFactoryContext(this.serviceLocator)
1741
+ }
1742
+ }
1743
+ &nbsp;</pre></td></tr></table></pre>
1744
+
1745
+ <div class='push'></div><!-- for sticky footer -->
1746
+ </div><!-- /wrapper -->
1747
+ <div class='footer quiet pad2 space-top1 center small'>
1748
+ Code coverage generated by
1749
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1750
+ at 2025-09-21T17:47:07.632Z
1751
+ </div>
1752
+ <script src="../prettify.js"></script>
1753
+ <script>
1754
+ window.onload = function () {
1755
+ prettyPrint();
1756
+ };
1757
+ </script>
1758
+ <script src="../sorter.js"></script>
1759
+ <script src="../block-navigation.js"></script>
1760
+ </body>
1761
+ </html>
1762
+