repoburg 1.0.39 → 1.0.41

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 (227) hide show
  1. package/backend/.env +1 -7
  2. package/backend/.repoburg/orchestrations/README.md +68 -0
  3. package/backend/coverage/clover.xml +3380 -0
  4. package/backend/coverage/coverage-final.json +117 -0
  5. package/backend/coverage/lcov-report/base.css +224 -0
  6. package/backend/coverage/lcov-report/block-navigation.js +87 -0
  7. package/backend/coverage/lcov-report/favicon.png +0 -0
  8. package/backend/coverage/lcov-report/index.html +686 -0
  9. package/backend/coverage/lcov-report/prettify.css +1 -0
  10. package/backend/coverage/lcov-report/prettify.js +2 -0
  11. package/backend/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  12. package/backend/coverage/lcov-report/sorter.js +196 -0
  13. package/backend/coverage/lcov-report/src/action-execution/action-execution.module.ts.html +109 -0
  14. package/backend/coverage/lcov-report/src/action-execution/action-execution.service.ts.html +370 -0
  15. package/backend/coverage/lcov-report/src/action-execution/index.html +131 -0
  16. package/backend/coverage/lcov-report/src/ai-actions/ai-action-batch.service.ts.html +940 -0
  17. package/backend/coverage/lcov-report/src/ai-actions/ai-action-creation.service.ts.html +1195 -0
  18. package/backend/coverage/lcov-report/src/ai-actions/ai-actions.controller.ts.html +664 -0
  19. package/backend/coverage/lcov-report/src/ai-actions/ai-actions.module.ts.html +154 -0
  20. package/backend/coverage/lcov-report/src/ai-actions/ai-actions.service.ts.html +859 -0
  21. package/backend/coverage/lcov-report/src/ai-actions/index.html +176 -0
  22. package/backend/coverage/lcov-report/src/app.controller.ts.html +151 -0
  23. package/backend/coverage/lcov-report/src/app.module.ts.html +370 -0
  24. package/backend/coverage/lcov-report/src/app.service.ts.html +163 -0
  25. package/backend/coverage/lcov-report/src/application-state/application-state.controller.ts.html +265 -0
  26. package/backend/coverage/lcov-report/src/application-state/application-state.module.ts.html +124 -0
  27. package/backend/coverage/lcov-report/src/application-state/application-state.service.ts.html +394 -0
  28. package/backend/coverage/lcov-report/src/application-state/dto/index.html +146 -0
  29. package/backend/coverage/lcov-report/src/application-state/dto/set-auto-context-fetch-enabled.dto.ts.html +103 -0
  30. package/backend/coverage/lcov-report/src/application-state/dto/set-theme.dto.ts.html +106 -0
  31. package/backend/coverage/lcov-report/src/application-state/dto/set-websocket-enabled.dto.ts.html +103 -0
  32. package/backend/coverage/lcov-report/src/application-state/index.html +146 -0
  33. package/backend/coverage/lcov-report/src/context-generation/context-generation.module.ts.html +118 -0
  34. package/backend/coverage/lcov-report/src/context-generation/context-generation.service.ts.html +1348 -0
  35. package/backend/coverage/lcov-report/src/context-generation/index.html +131 -0
  36. package/backend/coverage/lcov-report/src/context-snippets/context-snippets.controller.ts.html +289 -0
  37. package/backend/coverage/lcov-report/src/context-snippets/context-snippets.module.ts.html +136 -0
  38. package/backend/coverage/lcov-report/src/context-snippets/context-snippets.service.ts.html +400 -0
  39. package/backend/coverage/lcov-report/src/context-snippets/dto/context-snippet.dto.ts.html +211 -0
  40. package/backend/coverage/lcov-report/src/context-snippets/dto/index.html +116 -0
  41. package/backend/coverage/lcov-report/src/context-snippets/index.html +146 -0
  42. package/backend/coverage/lcov-report/src/context-templates/context-templates.controller.ts.html +397 -0
  43. package/backend/coverage/lcov-report/src/context-templates/context-templates.module.ts.html +136 -0
  44. package/backend/coverage/lcov-report/src/context-templates/context-templates.service.ts.html +832 -0
  45. package/backend/coverage/lcov-report/src/context-templates/dto/context-template.dto.ts.html +358 -0
  46. package/backend/coverage/lcov-report/src/context-templates/dto/index.html +116 -0
  47. package/backend/coverage/lcov-report/src/context-templates/index.html +146 -0
  48. package/backend/coverage/lcov-report/src/core-entities/ai-action.entity.ts.html +241 -0
  49. package/backend/coverage/lcov-report/src/core-entities/application-state.entity.ts.html +115 -0
  50. package/backend/coverage/lcov-report/src/core-entities/base.entity.ts.html +145 -0
  51. package/backend/coverage/lcov-report/src/core-entities/context-snippet.entity.ts.html +130 -0
  52. package/backend/coverage/lcov-report/src/core-entities/context-template.entity.ts.html +223 -0
  53. package/backend/coverage/lcov-report/src/core-entities/custom-snippet.entity.ts.html +136 -0
  54. package/backend/coverage/lcov-report/src/core-entities/execution-log.entity.ts.html +157 -0
  55. package/backend/coverage/lcov-report/src/core-entities/index.html +281 -0
  56. package/backend/coverage/lcov-report/src/core-entities/index.ts.html +118 -0
  57. package/backend/coverage/lcov-report/src/core-entities/project.entity.ts.html +130 -0
  58. package/backend/coverage/lcov-report/src/core-entities/session-input.entity.ts.html +280 -0
  59. package/backend/coverage/lcov-report/src/core-entities/session.entity.ts.html +280 -0
  60. package/backend/coverage/lcov-report/src/core-entities/system-prompt.entity.ts.html +148 -0
  61. package/backend/coverage/lcov-report/src/custom-snippets/custom-snippets.controller.ts.html +277 -0
  62. package/backend/coverage/lcov-report/src/custom-snippets/custom-snippets.module.ts.html +124 -0
  63. package/backend/coverage/lcov-report/src/custom-snippets/custom-snippets.service.ts.html +304 -0
  64. package/backend/coverage/lcov-report/src/custom-snippets/dto/custom-snippet.dto.ts.html +205 -0
  65. package/backend/coverage/lcov-report/src/custom-snippets/dto/index.html +116 -0
  66. package/backend/coverage/lcov-report/src/custom-snippets/index.html +146 -0
  67. package/backend/coverage/lcov-report/src/events/events.gateway.ts.html +292 -0
  68. package/backend/coverage/lcov-report/src/events/events.module.ts.html +109 -0
  69. package/backend/coverage/lcov-report/src/events/index.html +131 -0
  70. package/backend/coverage/lcov-report/src/execution-logs/dto/execution-log.dto.ts.html +130 -0
  71. package/backend/coverage/lcov-report/src/execution-logs/dto/index.html +116 -0
  72. package/backend/coverage/lcov-report/src/execution-logs/execution-logs.controller.ts.html +130 -0
  73. package/backend/coverage/lcov-report/src/execution-logs/execution-logs.module.ts.html +124 -0
  74. package/backend/coverage/lcov-report/src/execution-logs/execution-logs.service.ts.html +238 -0
  75. package/backend/coverage/lcov-report/src/execution-logs/index.html +146 -0
  76. package/backend/coverage/lcov-report/src/http-exception.filter.ts.html +340 -0
  77. package/backend/coverage/lcov-report/src/index.html +191 -0
  78. package/backend/coverage/lcov-report/src/llm-response-parser/dto/ai-action.dto.ts.html +400 -0
  79. package/backend/coverage/lcov-report/src/llm-response-parser/dto/index.html +116 -0
  80. package/backend/coverage/lcov-report/src/llm-response-parser/errors/index.html +116 -0
  81. package/backend/coverage/lcov-report/src/llm-response-parser/errors/parsing.error.ts.html +118 -0
  82. package/backend/coverage/lcov-report/src/llm-response-parser/index.html +146 -0
  83. package/backend/coverage/lcov-report/src/llm-response-parser/llm-response-parser.module.ts.html +109 -0
  84. package/backend/coverage/lcov-report/src/llm-response-parser/llm-response-parser.service.ts.html +808 -0
  85. package/backend/coverage/lcov-report/src/llm-response-parser/parsing.constants.ts.html +139 -0
  86. package/backend/coverage/lcov-report/src/llm-responses/dto/index.html +116 -0
  87. package/backend/coverage/lcov-report/src/llm-responses/dto/submit-llm-response.dto.ts.html +172 -0
  88. package/backend/coverage/lcov-report/src/llm-responses/index.html +146 -0
  89. package/backend/coverage/lcov-report/src/llm-responses/llm-responses.controller.ts.html +154 -0
  90. package/backend/coverage/lcov-report/src/llm-responses/llm-responses.module.ts.html +163 -0
  91. package/backend/coverage/lcov-report/src/llm-responses/llm-responses.service.ts.html +766 -0
  92. package/backend/coverage/lcov-report/src/main.ts.html +382 -0
  93. package/backend/coverage/lcov-report/src/orchestration/dto/index.html +116 -0
  94. package/backend/coverage/lcov-report/src/orchestration/dto/orchestration.dto.ts.html +184 -0
  95. package/backend/coverage/lcov-report/src/orchestration/index.html +191 -0
  96. package/backend/coverage/lcov-report/src/orchestration/orchestration-fs.service.ts.html +478 -0
  97. package/backend/coverage/lcov-report/src/orchestration/orchestration-parser.service.ts.html +310 -0
  98. package/backend/coverage/lcov-report/src/orchestration/orchestration.controller.ts.html +436 -0
  99. package/backend/coverage/lcov-report/src/orchestration/orchestration.module.ts.html +172 -0
  100. package/backend/coverage/lcov-report/src/orchestration/orchestration.service.ts.html +1201 -0
  101. package/backend/coverage/lcov-report/src/orchestration/orchestration.types.ts.html +169 -0
  102. package/backend/coverage/lcov-report/src/projects/dto/index.html +116 -0
  103. package/backend/coverage/lcov-report/src/projects/dto/project.dto.ts.html +154 -0
  104. package/backend/coverage/lcov-report/src/projects/index.html +146 -0
  105. package/backend/coverage/lcov-report/src/projects/projects.controller.ts.html +232 -0
  106. package/backend/coverage/lcov-report/src/projects/projects.module.ts.html +124 -0
  107. package/backend/coverage/lcov-report/src/projects/projects.service.ts.html +223 -0
  108. package/backend/coverage/lcov-report/src/seeding/context-template-seeding.service.ts.html +355 -0
  109. package/backend/coverage/lcov-report/src/seeding/custom-snippet-seeding.service.ts.html +271 -0
  110. package/backend/coverage/lcov-report/src/seeding/data/context-templates/default-followup_ad-hoc-focused-context.ts.html +136 -0
  111. package/backend/coverage/lcov-report/src/seeding/data/context-templates/default-initial_condensed-project-context.ts.html +148 -0
  112. package/backend/coverage/lcov-report/src/seeding/data/context-templates/default-initial_full-project-context.ts.html +247 -0
  113. package/backend/coverage/lcov-report/src/seeding/data/context-templates/index.html +191 -0
  114. package/backend/coverage/lcov-report/src/seeding/data/context-templates/pm-context.ts.html +250 -0
  115. package/backend/coverage/lcov-report/src/seeding/data/context-templates/pr-description.ts.html +187 -0
  116. package/backend/coverage/lcov-report/src/seeding/data/context-templates/sample_focused-tree.ts.html +124 -0
  117. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/default_rglob.ts.html +94 -0
  118. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/git-diff.ts.html +94 -0
  119. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/index.html +236 -0
  120. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/rg-exclude.ts.html +94 -0
  121. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/rg-search-glob.ts.html +94 -0
  122. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/rg-search.ts.html +94 -0
  123. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/run-command.ts.html +94 -0
  124. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/tree.ts.html +94 -0
  125. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/usr-adhoc-incl.ts.html +100 -0
  126. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/usr-input-incl.ts.html +94 -0
  127. package/backend/coverage/lcov-report/src/seeding/data/system-prompts/codebase-explorer.ts.html +331 -0
  128. package/backend/coverage/lcov-report/src/seeding/data/system-prompts/default_multi-file-action-generator-with-requester.ts.html +670 -0
  129. package/backend/coverage/lcov-report/src/seeding/data/system-prompts/index.html +161 -0
  130. package/backend/coverage/lcov-report/src/seeding/data/system-prompts/multi-file-action-generator.ts.html +550 -0
  131. package/backend/coverage/lcov-report/src/seeding/data/system-prompts/packup.ts.html +184 -0
  132. package/backend/coverage/lcov-report/src/seeding/index.html +176 -0
  133. package/backend/coverage/lcov-report/src/seeding/seeding.module.ts.html +145 -0
  134. package/backend/coverage/lcov-report/src/seeding/seeding.service.ts.html +151 -0
  135. package/backend/coverage/lcov-report/src/seeding/system-prompt-seeding.service.ts.html +289 -0
  136. package/backend/coverage/lcov-report/src/session-followup/index.html +131 -0
  137. package/backend/coverage/lcov-report/src/session-followup/session-followup.module.ts.html +130 -0
  138. package/backend/coverage/lcov-report/src/session-followup/session-followup.service.ts.html +667 -0
  139. package/backend/coverage/lcov-report/src/session-inputs/dto/index.html +116 -0
  140. package/backend/coverage/lcov-report/src/session-inputs/dto/session-input.dto.ts.html +235 -0
  141. package/backend/coverage/lcov-report/src/session-inputs/index.html +161 -0
  142. package/backend/coverage/lcov-report/src/session-inputs/session-input-context.service.ts.html +751 -0
  143. package/backend/coverage/lcov-report/src/session-inputs/session-inputs.controller.ts.html +337 -0
  144. package/backend/coverage/lcov-report/src/session-inputs/session-inputs.module.ts.html +202 -0
  145. package/backend/coverage/lcov-report/src/session-inputs/session-inputs.service.ts.html +1615 -0
  146. package/backend/coverage/lcov-report/src/session-transfer/index.html +131 -0
  147. package/backend/coverage/lcov-report/src/session-transfer/session-transfer.module.ts.html +172 -0
  148. package/backend/coverage/lcov-report/src/session-transfer/session-transfer.service.ts.html +574 -0
  149. package/backend/coverage/lcov-report/src/sessions/dto/index.html +116 -0
  150. package/backend/coverage/lcov-report/src/sessions/dto/session.dto.ts.html +340 -0
  151. package/backend/coverage/lcov-report/src/sessions/index.html +146 -0
  152. package/backend/coverage/lcov-report/src/sessions/sessions.controller.ts.html +457 -0
  153. package/backend/coverage/lcov-report/src/sessions/sessions.module.ts.html +214 -0
  154. package/backend/coverage/lcov-report/src/sessions/sessions.service.ts.html +844 -0
  155. package/backend/coverage/lcov-report/src/system-prompts/dto/index.html +116 -0
  156. package/backend/coverage/lcov-report/src/system-prompts/dto/system-prompt.dto.ts.html +208 -0
  157. package/backend/coverage/lcov-report/src/system-prompts/index.html +146 -0
  158. package/backend/coverage/lcov-report/src/system-prompts/system-prompts.controller.ts.html +298 -0
  159. package/backend/coverage/lcov-report/src/system-prompts/system-prompts.module.ts.html +127 -0
  160. package/backend/coverage/lcov-report/src/system-prompts/system-prompts.service.ts.html +352 -0
  161. package/backend/coverage/lcov-report/src/timeout.interceptor.ts.html +178 -0
  162. package/backend/coverage/lcov-report/src/workspace/dto/index.html +116 -0
  163. package/backend/coverage/lcov-report/src/workspace/dto/search-workspace.dto.ts.html +193 -0
  164. package/backend/coverage/lcov-report/src/workspace/index.html +146 -0
  165. package/backend/coverage/lcov-report/src/workspace/workspace.controller.ts.html +247 -0
  166. package/backend/coverage/lcov-report/src/workspace/workspace.module.ts.html +121 -0
  167. package/backend/coverage/lcov-report/src/workspace/workspace.service.ts.html +700 -0
  168. package/backend/coverage/lcov.info +5492 -0
  169. package/backend/dist/ai-actions/ai-action-creation.service.d.ts +2 -0
  170. package/backend/dist/ai-actions/ai-action-creation.service.js +65 -0
  171. package/backend/dist/ai-actions/ai-action-creation.service.js.map +1 -1
  172. package/backend/dist/app.module.js +2 -0
  173. package/backend/dist/app.module.js.map +1 -1
  174. package/backend/dist/application-state/application-state.service.d.ts +4 -0
  175. package/backend/dist/application-state/application-state.service.js +25 -0
  176. package/backend/dist/application-state/application-state.service.js.map +1 -1
  177. package/backend/dist/context-templates/context-templates.service.d.ts +1 -0
  178. package/backend/dist/context-templates/context-templates.service.js +3 -0
  179. package/backend/dist/context-templates/context-templates.service.js.map +1 -1
  180. package/backend/dist/core-entities/session-input.entity.d.ts +1 -0
  181. package/backend/dist/core-entities/session-input.entity.js +4 -0
  182. package/backend/dist/core-entities/session-input.entity.js.map +1 -1
  183. package/backend/dist/llm-responses/llm-responses.module.js +4 -1
  184. package/backend/dist/llm-responses/llm-responses.module.js.map +1 -1
  185. package/backend/dist/llm-responses/llm-responses.service.d.ts +3 -1
  186. package/backend/dist/llm-responses/llm-responses.service.js +29 -2
  187. package/backend/dist/llm-responses/llm-responses.service.js.map +1 -1
  188. package/backend/dist/orchestration/dto/orchestration.dto.d.ts +15 -0
  189. package/backend/dist/orchestration/dto/orchestration.dto.js +58 -0
  190. package/backend/dist/orchestration/dto/orchestration.dto.js.map +1 -0
  191. package/backend/dist/orchestration/orchestration-fs.service.d.ts +18 -0
  192. package/backend/dist/orchestration/orchestration-fs.service.js +196 -0
  193. package/backend/dist/orchestration/orchestration-fs.service.js.map +1 -0
  194. package/backend/dist/orchestration/orchestration-parser.service.d.ts +16 -0
  195. package/backend/dist/orchestration/orchestration-parser.service.js +78 -0
  196. package/backend/dist/orchestration/orchestration-parser.service.js.map +1 -0
  197. package/backend/dist/orchestration/orchestration.controller.d.ts +28 -0
  198. package/backend/dist/orchestration/orchestration.controller.js +158 -0
  199. package/backend/dist/orchestration/orchestration.controller.js.map +1 -0
  200. package/backend/dist/orchestration/orchestration.module.d.ts +2 -0
  201. package/backend/dist/orchestration/orchestration.module.js +43 -0
  202. package/backend/dist/orchestration/orchestration.module.js.map +1 -0
  203. package/backend/dist/orchestration/orchestration.service.d.ts +38 -0
  204. package/backend/dist/orchestration/orchestration.service.js +301 -0
  205. package/backend/dist/orchestration/orchestration.service.js.map +1 -0
  206. package/backend/dist/orchestration/orchestration.types.d.ts +27 -0
  207. package/backend/dist/orchestration/orchestration.types.js +20 -0
  208. package/backend/dist/orchestration/orchestration.types.js.map +1 -0
  209. package/backend/dist/session-followup/session-followup.service.js +2 -1
  210. package/backend/dist/session-followup/session-followup.service.js.map +1 -1
  211. package/backend/dist/session-inputs/session-inputs.module.js +2 -0
  212. package/backend/dist/session-inputs/session-inputs.module.js.map +1 -1
  213. package/backend/dist/session-inputs/session-inputs.service.d.ts +3 -1
  214. package/backend/dist/session-inputs/session-inputs.service.js +13 -2
  215. package/backend/dist/session-inputs/session-inputs.service.js.map +1 -1
  216. package/backend/dist/tsconfig.build.tsbuildinfo +1 -1
  217. package/backend/orchestration-test-2.txt +1 -0
  218. package/backend/orchestration-test.txt +1 -0
  219. package/backend/package.json +1 -1
  220. package/daemon/dist/api/services.js +30 -2
  221. package/daemon/dist/auth/authManager.js +18 -0
  222. package/daemon/dist/index.js +1 -1
  223. package/daemon/dist/middleware/checkAuth.js +12 -0
  224. package/daemon/dist/serviceManager.js +22 -0
  225. package/orchestration-test.txt +3 -0
  226. package/package.json +1 -1
  227. package/platform-cli.js +32 -0
@@ -0,0 +1,808 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/llm-response-parser/llm-response-parser.service.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/llm-response-parser</a> llm-response-parser.service.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">0% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>0/110</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/48</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/6</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">0% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>0/104</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></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
308
+ <span class="cline-any cline-no">&nbsp;</span>
309
+ <span class="cline-any cline-no">&nbsp;</span>
310
+ <span class="cline-any cline-no">&nbsp;</span>
311
+ <span class="cline-any cline-no">&nbsp;</span>
312
+ <span class="cline-any cline-neutral">&nbsp;</span>
313
+ <span class="cline-any cline-neutral">&nbsp;</span>
314
+ <span class="cline-any cline-neutral">&nbsp;</span>
315
+ <span class="cline-any cline-neutral">&nbsp;</span>
316
+ <span class="cline-any cline-neutral">&nbsp;</span>
317
+ <span class="cline-any cline-neutral">&nbsp;</span>
318
+ <span class="cline-any cline-neutral">&nbsp;</span>
319
+ <span class="cline-any cline-neutral">&nbsp;</span>
320
+ <span class="cline-any cline-neutral">&nbsp;</span>
321
+ <span class="cline-any cline-neutral">&nbsp;</span>
322
+ <span class="cline-any cline-neutral">&nbsp;</span>
323
+ <span class="cline-any cline-neutral">&nbsp;</span>
324
+ <span class="cline-any cline-neutral">&nbsp;</span>
325
+ <span class="cline-any cline-neutral">&nbsp;</span>
326
+ <span class="cline-any cline-neutral">&nbsp;</span>
327
+ <span class="cline-any cline-neutral">&nbsp;</span>
328
+ <span class="cline-any cline-no">&nbsp;</span>
329
+ <span class="cline-any cline-no">&nbsp;</span>
330
+ <span class="cline-any cline-neutral">&nbsp;</span>
331
+ <span class="cline-any cline-neutral">&nbsp;</span>
332
+ <span class="cline-any cline-no">&nbsp;</span>
333
+ <span class="cline-any cline-no">&nbsp;</span>
334
+ <span class="cline-any cline-no">&nbsp;</span>
335
+ <span class="cline-any cline-neutral">&nbsp;</span>
336
+ <span class="cline-any cline-neutral">&nbsp;</span>
337
+ <span class="cline-any cline-no">&nbsp;</span>
338
+ <span class="cline-any cline-neutral">&nbsp;</span>
339
+ <span class="cline-any cline-neutral">&nbsp;</span>
340
+ <span class="cline-any cline-no">&nbsp;</span>
341
+ <span class="cline-any cline-neutral">&nbsp;</span>
342
+ <span class="cline-any cline-neutral">&nbsp;</span>
343
+ <span class="cline-any cline-no">&nbsp;</span>
344
+ <span class="cline-any cline-neutral">&nbsp;</span>
345
+ <span class="cline-any cline-no">&nbsp;</span>
346
+ <span class="cline-any cline-neutral">&nbsp;</span>
347
+ <span class="cline-any cline-no">&nbsp;</span>
348
+ <span class="cline-any cline-neutral">&nbsp;</span>
349
+ <span class="cline-any cline-no">&nbsp;</span>
350
+ <span class="cline-any cline-neutral">&nbsp;</span>
351
+ <span class="cline-any cline-no">&nbsp;</span>
352
+ <span class="cline-any cline-no">&nbsp;</span>
353
+ <span class="cline-any cline-neutral">&nbsp;</span>
354
+ <span class="cline-any cline-neutral">&nbsp;</span>
355
+ <span class="cline-any cline-neutral">&nbsp;</span>
356
+ <span class="cline-any cline-neutral">&nbsp;</span>
357
+ <span class="cline-any cline-neutral">&nbsp;</span>
358
+ <span class="cline-any cline-neutral">&nbsp;</span>
359
+ <span class="cline-any cline-neutral">&nbsp;</span>
360
+ <span class="cline-any cline-neutral">&nbsp;</span>
361
+ <span class="cline-any cline-neutral">&nbsp;</span>
362
+ <span class="cline-any cline-neutral">&nbsp;</span>
363
+ <span class="cline-any cline-neutral">&nbsp;</span>
364
+ <span class="cline-any cline-neutral">&nbsp;</span>
365
+ <span class="cline-any cline-neutral">&nbsp;</span>
366
+ <span class="cline-any cline-no">&nbsp;</span>
367
+ <span class="cline-any cline-no">&nbsp;</span>
368
+ <span class="cline-any cline-neutral">&nbsp;</span>
369
+ <span class="cline-any cline-neutral">&nbsp;</span>
370
+ <span class="cline-any cline-no">&nbsp;</span>
371
+ <span class="cline-any cline-no">&nbsp;</span>
372
+ <span class="cline-any cline-no">&nbsp;</span>
373
+ <span class="cline-any cline-neutral">&nbsp;</span>
374
+ <span class="cline-any cline-no">&nbsp;</span>
375
+ <span class="cline-any cline-no">&nbsp;</span>
376
+ <span class="cline-any cline-no">&nbsp;</span>
377
+ <span class="cline-any cline-no">&nbsp;</span>
378
+ <span class="cline-any cline-neutral">&nbsp;</span>
379
+ <span class="cline-any cline-no">&nbsp;</span>
380
+ <span class="cline-any cline-neutral">&nbsp;</span>
381
+ <span class="cline-any cline-neutral">&nbsp;</span>
382
+ <span class="cline-any cline-neutral">&nbsp;</span>
383
+ <span class="cline-any cline-no">&nbsp;</span>
384
+ <span class="cline-any cline-neutral">&nbsp;</span>
385
+ <span class="cline-any cline-neutral">&nbsp;</span>
386
+ <span class="cline-any cline-neutral">&nbsp;</span>
387
+ <span class="cline-any cline-neutral">&nbsp;</span>
388
+ <span class="cline-any cline-no">&nbsp;</span>
389
+ <span class="cline-any cline-neutral">&nbsp;</span>
390
+ <span class="cline-any cline-no">&nbsp;</span>
391
+ <span class="cline-any cline-neutral">&nbsp;</span>
392
+ <span class="cline-any cline-no">&nbsp;</span>
393
+ <span class="cline-any cline-no">&nbsp;</span>
394
+ <span class="cline-any cline-no">&nbsp;</span>
395
+ <span class="cline-any cline-neutral">&nbsp;</span>
396
+ <span class="cline-any cline-neutral">&nbsp;</span>
397
+ <span class="cline-any cline-no">&nbsp;</span>
398
+ <span class="cline-any cline-no">&nbsp;</span>
399
+ <span class="cline-any cline-no">&nbsp;</span>
400
+ <span class="cline-any cline-neutral">&nbsp;</span>
401
+ <span class="cline-any cline-neutral">&nbsp;</span>
402
+ <span class="cline-any cline-neutral">&nbsp;</span>
403
+ <span class="cline-any cline-neutral">&nbsp;</span>
404
+ <span class="cline-any cline-no">&nbsp;</span>
405
+ <span class="cline-any cline-no">&nbsp;</span>
406
+ <span class="cline-any cline-neutral">&nbsp;</span>
407
+ <span class="cline-any cline-no">&nbsp;</span>
408
+ <span class="cline-any cline-neutral">&nbsp;</span>
409
+ <span class="cline-any cline-no">&nbsp;</span>
410
+ <span class="cline-any cline-no">&nbsp;</span>
411
+ <span class="cline-any cline-neutral">&nbsp;</span>
412
+ <span class="cline-any cline-neutral">&nbsp;</span>
413
+ <span class="cline-any cline-no">&nbsp;</span>
414
+ <span class="cline-any cline-neutral">&nbsp;</span>
415
+ <span class="cline-any cline-neutral">&nbsp;</span>
416
+ <span class="cline-any cline-no">&nbsp;</span>
417
+ <span class="cline-any cline-neutral">&nbsp;</span>
418
+ <span class="cline-any cline-neutral">&nbsp;</span>
419
+ <span class="cline-any cline-no">&nbsp;</span>
420
+ <span class="cline-any cline-neutral">&nbsp;</span>
421
+ <span class="cline-any cline-neutral">&nbsp;</span>
422
+ <span class="cline-any cline-neutral">&nbsp;</span>
423
+ <span class="cline-any cline-neutral">&nbsp;</span>
424
+ <span class="cline-any cline-neutral">&nbsp;</span>
425
+ <span class="cline-any cline-no">&nbsp;</span>
426
+ <span class="cline-any cline-no">&nbsp;</span>
427
+ <span class="cline-any cline-no">&nbsp;</span>
428
+ <span class="cline-any cline-no">&nbsp;</span>
429
+ <span class="cline-any cline-no">&nbsp;</span>
430
+ <span class="cline-any cline-neutral">&nbsp;</span>
431
+ <span class="cline-any cline-neutral">&nbsp;</span>
432
+ <span class="cline-any cline-no">&nbsp;</span>
433
+ <span class="cline-any cline-neutral">&nbsp;</span>
434
+ <span class="cline-any cline-neutral">&nbsp;</span>
435
+ <span class="cline-any cline-no">&nbsp;</span>
436
+ <span class="cline-any cline-neutral">&nbsp;</span>
437
+ <span class="cline-any cline-neutral">&nbsp;</span>
438
+ <span class="cline-any cline-neutral">&nbsp;</span>
439
+ <span class="cline-any cline-no">&nbsp;</span>
440
+ <span class="cline-any cline-no">&nbsp;</span>
441
+ <span class="cline-any cline-no">&nbsp;</span>
442
+ <span class="cline-any cline-neutral">&nbsp;</span>
443
+ <span class="cline-any cline-neutral">&nbsp;</span>
444
+ <span class="cline-any cline-no">&nbsp;</span>
445
+ <span class="cline-any cline-no">&nbsp;</span>
446
+ <span class="cline-any cline-no">&nbsp;</span>
447
+ <span class="cline-any cline-neutral">&nbsp;</span>
448
+ <span class="cline-any cline-neutral">&nbsp;</span>
449
+ <span class="cline-any cline-no">&nbsp;</span>
450
+ <span class="cline-any cline-neutral">&nbsp;</span>
451
+ <span class="cline-any cline-neutral">&nbsp;</span>
452
+ <span class="cline-any cline-no">&nbsp;</span>
453
+ <span class="cline-any cline-no">&nbsp;</span>
454
+ <span class="cline-any cline-neutral">&nbsp;</span>
455
+ <span class="cline-any cline-no">&nbsp;</span>
456
+ <span class="cline-any cline-neutral">&nbsp;</span>
457
+ <span class="cline-any cline-neutral">&nbsp;</span>
458
+ <span class="cline-any cline-neutral">&nbsp;</span>
459
+ <span class="cline-any cline-no">&nbsp;</span>
460
+ <span class="cline-any cline-no">&nbsp;</span>
461
+ <span class="cline-any cline-no">&nbsp;</span>
462
+ <span class="cline-any cline-no">&nbsp;</span>
463
+ <span class="cline-any cline-no">&nbsp;</span>
464
+ <span class="cline-any cline-no">&nbsp;</span>
465
+ <span class="cline-any cline-no">&nbsp;</span>
466
+ <span class="cline-any cline-neutral">&nbsp;</span>
467
+ <span class="cline-any cline-neutral">&nbsp;</span>
468
+ <span class="cline-any cline-neutral">&nbsp;</span>
469
+ <span class="cline-any cline-no">&nbsp;</span>
470
+ <span class="cline-any cline-neutral">&nbsp;</span>
471
+ <span class="cline-any cline-no">&nbsp;</span>
472
+ <span class="cline-any cline-no">&nbsp;</span>
473
+ <span class="cline-any cline-no">&nbsp;</span>
474
+ <span class="cline-any cline-no">&nbsp;</span>
475
+ <span class="cline-any cline-neutral">&nbsp;</span>
476
+ <span class="cline-any cline-neutral">&nbsp;</span>
477
+ <span class="cline-any cline-neutral">&nbsp;</span>
478
+ <span class="cline-any cline-neutral">&nbsp;</span>
479
+ <span class="cline-any cline-no">&nbsp;</span>
480
+ <span class="cline-any cline-no">&nbsp;</span>
481
+ <span class="cline-any cline-neutral">&nbsp;</span>
482
+ <span class="cline-any cline-neutral">&nbsp;</span>
483
+ <span class="cline-any cline-neutral">&nbsp;</span>
484
+ <span class="cline-any cline-no">&nbsp;</span>
485
+ <span class="cline-any cline-no">&nbsp;</span>
486
+ <span class="cline-any cline-neutral">&nbsp;</span>
487
+ <span class="cline-any cline-neutral">&nbsp;</span>
488
+ <span class="cline-any cline-neutral">&nbsp;</span>
489
+ <span class="cline-any cline-neutral">&nbsp;</span>
490
+ <span class="cline-any cline-neutral">&nbsp;</span>
491
+ <span class="cline-any cline-no">&nbsp;</span>
492
+ <span class="cline-any cline-no">&nbsp;</span>
493
+ <span class="cline-any cline-no">&nbsp;</span>
494
+ <span class="cline-any cline-no">&nbsp;</span>
495
+ <span class="cline-any cline-no">&nbsp;</span>
496
+ <span class="cline-any cline-no">&nbsp;</span>
497
+ <span class="cline-any cline-neutral">&nbsp;</span>
498
+ <span class="cline-any cline-neutral">&nbsp;</span>
499
+ <span class="cline-any cline-no">&nbsp;</span>
500
+ <span class="cline-any cline-no">&nbsp;</span>
501
+ <span class="cline-any cline-no">&nbsp;</span>
502
+ <span class="cline-any cline-no">&nbsp;</span>
503
+ <span class="cline-any cline-no">&nbsp;</span>
504
+ <span class="cline-any cline-neutral">&nbsp;</span>
505
+ <span class="cline-any cline-no">&nbsp;</span>
506
+ <span class="cline-any cline-neutral">&nbsp;</span>
507
+ <span class="cline-any cline-neutral">&nbsp;</span>
508
+ <span class="cline-any cline-neutral">&nbsp;</span>
509
+ <span class="cline-any cline-neutral">&nbsp;</span>
510
+ <span class="cline-any cline-neutral">&nbsp;</span>
511
+ <span class="cline-any cline-neutral">&nbsp;</span>
512
+ <span class="cline-any cline-neutral">&nbsp;</span>
513
+ <span class="cline-any cline-no">&nbsp;</span>
514
+ <span class="cline-any cline-no">&nbsp;</span>
515
+ <span class="cline-any cline-no">&nbsp;</span>
516
+ <span class="cline-any cline-no">&nbsp;</span>
517
+ <span class="cline-any cline-neutral">&nbsp;</span>
518
+ <span class="cline-any cline-no">&nbsp;</span>
519
+ <span class="cline-any cline-neutral">&nbsp;</span>
520
+ <span class="cline-any cline-neutral">&nbsp;</span>
521
+ <span class="cline-any cline-neutral">&nbsp;</span>
522
+ <span class="cline-any cline-neutral">&nbsp;</span>
523
+ <span class="cline-any cline-no">&nbsp;</span>
524
+ <span class="cline-any cline-neutral">&nbsp;</span>
525
+ <span class="cline-any cline-no">&nbsp;</span>
526
+ <span class="cline-any cline-neutral">&nbsp;</span>
527
+ <span class="cline-any cline-neutral">&nbsp;</span>
528
+ <span class="cline-any cline-neutral">&nbsp;</span>
529
+ <span class="cline-any cline-neutral">&nbsp;</span>
530
+ <span class="cline-any cline-neutral">&nbsp;</span>
531
+ <span class="cline-any cline-neutral">&nbsp;</span>
532
+ <span class="cline-any cline-neutral">&nbsp;</span>
533
+ <span class="cline-any cline-neutral">&nbsp;</span>
534
+ <span class="cline-any cline-no">&nbsp;</span>
535
+ <span class="cline-any cline-no">&nbsp;</span>
536
+ <span class="cline-any cline-neutral">&nbsp;</span>
537
+ <span class="cline-any cline-neutral">&nbsp;</span>
538
+ <span class="cline-any cline-neutral">&nbsp;</span>
539
+ <span class="cline-any cline-no">&nbsp;</span>
540
+ <span class="cline-any cline-no">&nbsp;</span>
541
+ <span class="cline-any cline-no">&nbsp;</span>
542
+ <span class="cline-any cline-no">&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-no">&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></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import { Injectable, Logger } from '@nestjs/common';</span>
549
+ <span class="cstat-no" title="statement not covered" >import { validate } from 'class-validator';</span>
550
+ <span class="cstat-no" title="statement not covered" >import { AIActionDto, AIActionType } from './dto/ai-action.dto';</span>
551
+ <span class="cstat-no" title="statement not covered" >import { ParsingError } from './errors/parsing.error';</span>
552
+ <span class="cstat-no" title="statement not covered" >import {</span>
553
+ ACTION_ITEM_START_TAG,
554
+ ACTION_ITEM_END_TAG,
555
+ FIELD_CODE,
556
+ FIELD_FILE_ACTION,
557
+ FIELD_ACTION_TYPE,
558
+ FIELD_ACTION_NUMBER,
559
+ FIELD_FILE_PATH,
560
+ FIELD_COMMAND_STRING,
561
+ FIELD_FILES_STRING,
562
+ FIELD_FOLDERS_STRING,
563
+ FIELD_REASON_STRING,
564
+ PARTIAL_ACTION_ITEM_END_TAG,
565
+ FIELD_PLAIN,
566
+ } from './parsing.constants';
567
+ &nbsp;
568
+ @Injectable()
569
+ export <span class="fstat-no" title="function not covered" >class <span class="cstat-no" title="statement not covered" ><span class="cstat-no" title="statement not covered" >L</span>lmResponseParserService<span class="cstat-no" title="statement not covered" > </span>{</span></span>
570
+ private readonly <span class="cstat-no" title="statement not covered" >logger = new Logger(LlmResponseParserService.name);</span>
571
+ &nbsp;
572
+ private <span class="fstat-no" title="function not covered" >mapActionType(</span>type: string): AIActionType | undefined {
573
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!type) <span class="cstat-no" title="statement not covered" >return undefined;</span></span>
574
+ const lowerType = <span class="cstat-no" title="statement not covered" >type.toLowerCase().trim();</span>
575
+ <span class="cstat-no" title="statement not covered" > switch (lowerType) {</span>
576
+ case 'create':
577
+ case 'create_file':
578
+ <span class="cstat-no" title="statement not covered" > return AIActionType.CREATE_FILE;</span>
579
+ case 'edit':
580
+ case 'edit_file':
581
+ <span class="cstat-no" title="statement not covered" > return AIActionType.EDIT_FILE;</span>
582
+ case 'delete':
583
+ case 'delete_file':
584
+ <span class="cstat-no" title="statement not covered" > return AIActionType.DELETE_FILE;</span>
585
+ case 'run_command':
586
+ <span class="cstat-no" title="statement not covered" > return AIActionType.RUN_COMMAND;</span>
587
+ case 'request_context':
588
+ <span class="cstat-no" title="statement not covered" > return AIActionType.REQUEST_CONTEXT;</span>
589
+ case 'final':
590
+ <span class="cstat-no" title="statement not covered" > return AIActionType.FINAL;</span>
591
+ default:
592
+ <span class="cstat-no" title="statement not covered" > this.logger.warn(`Unsupported action type found: "${type}"`);</span>
593
+ <span class="cstat-no" title="statement not covered" > return undefined;</span>
594
+ }
595
+ }
596
+ &nbsp;
597
+ /**
598
+ * Parses a raw LLM response string into an array of AIActionDto objects and an explanation string.
599
+ * If parsing fails, it logs a warning and returns an empty array for actions.
600
+ * Malformed individual action blocks are skipped.
601
+ * @param rawResponse The raw string response from the LLM.
602
+ * @returns A Promise resolving to an object with an array of AIActionDto objects and an explanation string.
603
+ */
604
+ <span class="fstat-no" title="function not covered" > async </span>parse(
605
+ rawResponse: string,
606
+ ): Promise&lt;{ dtos: AIActionDto[]; explanation: string | null }&gt; {
607
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!rawResponse || rawResponse.trim() === '') {</span>
608
+ <span class="cstat-no" title="statement not covered" > return { dtos: [], explanation: null };</span>
609
+ }
610
+ &nbsp;
611
+ const firstActionStart = <span class="cstat-no" title="statement not covered" >rawResponse.indexOf(ACTION_ITEM_START_TAG);</span>
612
+ let explanation: string | null = <span class="cstat-no" title="statement not covered" >null;</span>
613
+ let actionsPart = <span class="cstat-no" title="statement not covered" >rawResponse;</span>
614
+ &nbsp;
615
+ <span class="cstat-no" title="statement not covered" > if (firstActionStart &gt; 0) {</span>
616
+ <span class="cstat-no" title="statement not covered" > explanation = rawResponse.substring(0, firstActionStart).trim();</span>
617
+ <span class="cstat-no" title="statement not covered" > actionsPart = rawResponse.substring(firstActionStart);</span>
618
+ } else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span>if (firstActionStart === -1) {</span>
619
+ // No action item start tags. If no end tags either, consider it all explanation.
620
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
621
+ !rawResponse.includes(ACTION_ITEM_END_TAG) &amp;&amp;
622
+ !rawResponse.includes(PARTIAL_ACTION_ITEM_END_TAG)
623
+ ) {
624
+ <span class="cstat-no" title="statement not covered" > return { dtos: [], explanation: rawResponse.trim() };</span>
625
+ }
626
+ // Otherwise, it might be a malformed response, so let the block parser handle it.
627
+ }
628
+ &nbsp;
629
+ const actionBlocks = <span class="cstat-no" title="statement not covered" >actionsPart</span>
630
+ .split(ACTION_ITEM_START_TAG)
631
+ .filter(<span class="fstat-no" title="function not covered" >(b</span>lock) =&gt; <span class="cstat-no" title="statement not covered" >block.trim() !== '')</span>;
632
+ &nbsp;
633
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (actionBlocks.length === 0) {</span>
634
+ <span class="cstat-no" title="statement not covered" > this.logger.log('No action item blocks found in the response.');</span>
635
+ <span class="cstat-no" title="statement not covered" > return { dtos: [], explanation };</span>
636
+ }
637
+ &nbsp;
638
+ const dtos: AIActionDto[] = <span class="cstat-no" title="statement not covered" >[];</span>
639
+ <span class="cstat-no" title="statement not covered" > for (const block of actionBlocks) {</span>
640
+ <span class="cstat-no" title="statement not covered" > try {</span>
641
+ let cleanBlock: string;
642
+ &nbsp;
643
+ // Use a regex to split by either the full end tag or the partial one.
644
+ // This makes the parser more robust to truncated LLM outputs.
645
+ const endTagRegex = <span class="cstat-no" title="statement not covered" >new RegExp(`${PARTIAL_ACTION_ITEM_END_TAG}§?`);</span>
646
+ const parts = <span class="cstat-no" title="statement not covered" >block.split(endTagRegex);</span>
647
+ &nbsp;
648
+ <span class="cstat-no" title="statement not covered" > if (parts.length &gt;= 2) {</span>
649
+ // Normal case: End tag was found.
650
+ <span class="cstat-no" title="statement not covered" > cleanBlock = parts[0];</span>
651
+ } else <span class="cstat-no" title="statement not covered" >if (actionBlocks.length === 1 &amp;&amp; parts.length === 1) {</span>
652
+ // Special case: Only one action block and it's missing an end tag.
653
+ // We assume the rest of the response is the content of this single block.
654
+ <span class="cstat-no" title="statement not covered" > this.logger.log(</span>
655
+ 'Only one action block found and it is missing an end tag. Assuming end of response is end of block.',
656
+ );
657
+ <span class="cstat-no" title="statement not covered" > cleanBlock = parts[0];</span>
658
+ } else {
659
+ // Malformed block that is not the special case above.
660
+ <span class="cstat-no" title="statement not covered" > throw new ParsingError(</span>
661
+ `Malformed action block, missing an end marker like '${ACTION_ITEM_END_TAG}'.`,
662
+ );
663
+ }
664
+ &nbsp;
665
+ // Special handling for 'final' action with a 'plain' multiline field
666
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (/¦FileAction¦\s*final/.test(cleanBlock)) {</span>
667
+ const plainSeparator = <span class="cstat-no" title="statement not covered" >`¦${FIELD_PLAIN}¦`;</span>
668
+ const plainIndex = <span class="cstat-no" title="statement not covered" >cleanBlock.indexOf(plainSeparator);</span>
669
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (plainIndex !== -1) {</span>
670
+ const plainContent = <span class="cstat-no" title="statement not covered" >cleanBlock</span>
671
+ .substring(plainIndex + plainSeparator.length)
672
+ .trim();
673
+ <span class="cstat-no" title="statement not covered" > this.logger.log(</span>
674
+ `Parsed 'final' action with plain content. Returning as explanation.`,
675
+ );
676
+ <span class="cstat-no" title="statement not covered" > return { dtos: [], explanation: plainContent };</span>
677
+ }
678
+ }
679
+ &nbsp;
680
+ const actionData: { [key: string]: string } = <span class="cstat-no" title="statement not covered" >{};</span>
681
+ const codeSeparator = <span class="cstat-no" title="statement not covered" >`¦${FIELD_CODE}¦`;</span>
682
+ const codeIndex = <span class="cstat-no" title="statement not covered" >cleanBlock.indexOf(codeSeparator);</span>
683
+ &nbsp;
684
+ let metadataPart: string;
685
+ <span class="cstat-no" title="statement not covered" > if (codeIndex !== -1) {</span>
686
+ <span class="cstat-no" title="statement not covered" > metadataPart = cleanBlock.substring(0, codeIndex);</span>
687
+ let codePart = <span class="cstat-no" title="statement not covered" >cleanBlock.substring(codeIndex + codeSeparator.length);</span>
688
+ &nbsp;
689
+ // trim and extract from code block
690
+ <span class="cstat-no" title="statement not covered" > codePart = codePart.trim();</span>
691
+ // Use an anchored regex to only match if the fences are at the very start and end.
692
+ // This is more robust against code that contains ``` in string literals.
693
+ const codeMatch = <span class="cstat-no" title="statement not covered" >codePart.match(/^```(?:\w*\n)?([\s\S]*)```$/);</span>
694
+ <span class="cstat-no" title="statement not covered" > actionData[FIELD_CODE] = codeMatch ? codeMatch[1].trim() : codePart;</span>
695
+ } else {
696
+ <span class="cstat-no" title="statement not covered" > metadataPart = cleanBlock;</span>
697
+ // No code part
698
+ }
699
+ &nbsp;
700
+ const lines = <span class="cstat-no" title="statement not covered" >metadataPart.split('\n');</span>
701
+ <span class="cstat-no" title="statement not covered" > for (const line of lines) {</span>
702
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!line.trim()) <span class="cstat-no" title="statement not covered" >continue;</span></span>
703
+ const match = <span class="cstat-no" title="statement not covered" >line.match(/¦(.*?)¦\s*(.*)/);</span>
704
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (match) {</span>
705
+ const [, key, value] = <span class="cstat-no" title="statement not covered" >match;</span>
706
+ <span class="cstat-no" title="statement not covered" > actionData[key.trim()] = value.trim();</span>
707
+ }
708
+ }
709
+ &nbsp;
710
+ const dto = <span class="cstat-no" title="statement not covered" >new AIActionDto();</span>
711
+ const actionTypeRaw =
712
+ <span class="cstat-no" title="statement not covered" > actionData[FIELD_FILE_ACTION] || actionData[FIELD_ACTION_TYPE];</span>
713
+ <span class="cstat-no" title="statement not covered" > dto.action_type = this.mapActionType(actionTypeRaw);</span>
714
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!dto.action_type) {</span>
715
+ <span class="cstat-no" title="statement not covered" > throw new ParsingError(</span>
716
+ `Unsupported or missing action type: "${actionTypeRaw}"`,
717
+ );
718
+ }
719
+ &nbsp;
720
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (actionData[FIELD_ACTION_NUMBER]) {</span>
721
+ <span class="cstat-no" title="statement not covered" > dto.order_of_execution = parseInt(</span>
722
+ actionData[FIELD_ACTION_NUMBER],
723
+ 10,
724
+ );
725
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (isNaN(dto.order_of_execution)) {</span>
726
+ <span class="cstat-no" title="statement not covered" > throw new ParsingError(</span>
727
+ `Invalid ActionNumber: ${actionData[FIELD_ACTION_NUMBER]}`,
728
+ );
729
+ }
730
+ }
731
+ &nbsp;
732
+ <span class="cstat-no" title="statement not covered" > dto.file_path = actionData[FIELD_FILE_PATH];</span>
733
+ <span class="cstat-no" title="statement not covered" > dto.command_string = actionData[FIELD_COMMAND_STRING];</span>
734
+ <span class="cstat-no" title="statement not covered" > dto.content = actionData[FIELD_CODE];</span>
735
+ <span class="cstat-no" title="statement not covered" > dto.files = actionData[FIELD_FILES_STRING];</span>
736
+ <span class="cstat-no" title="statement not covered" > dto.folders = actionData[FIELD_FOLDERS_STRING];</span>
737
+ <span class="cstat-no" title="statement not covered" > dto.reason = actionData[FIELD_REASON_STRING];</span>
738
+ &nbsp;
739
+ // Manual validation for context-dependent fields
740
+ <span class="cstat-no" title="statement not covered" > try {</span>
741
+ <span class="cstat-no" title="statement not covered" > AIActionDto.validateFilePath(dto);</span>
742
+ <span class="cstat-no" title="statement not covered" > AIActionDto.validateContentForFileOps(dto);</span>
743
+ <span class="cstat-no" title="statement not covered" > AIActionDto.validateCommandString(dto);</span>
744
+ <span class="cstat-no" title="statement not covered" > AIActionDto.validateRequestContext(dto);</span>
745
+ } catch (manualValidationError) {
746
+ <span class="cstat-no" title="statement not covered" > throw new ParsingError(</span>
747
+ `Validation failed for action: ${
748
+ (manualValidationError as Error).message
749
+ }`,
750
+ manualValidationError,
751
+ );
752
+ }
753
+ &nbsp;
754
+ const errors = <span class="cstat-no" title="statement not covered" >await validate(dto);</span>
755
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (errors.length &gt; 0) {</span>
756
+ const errorMessages = <span class="cstat-no" title="statement not covered" >errors</span>
757
+ .map(<span class="fstat-no" title="function not covered" >(e</span>rr) =&gt; <span class="cstat-no" title="statement not covered" >Object.values(err.constraints || {}).join(', '))</span>
758
+ .join('; ');
759
+ <span class="cstat-no" title="statement not covered" > throw new ParsingError(</span>
760
+ `Validation failed for an action: ${errorMessages}`,
761
+ errors,
762
+ );
763
+ }
764
+ <span class="cstat-no" title="statement not covered" > dtos.push(dto);</span>
765
+ } catch (error) {
766
+ <span class="cstat-no" title="statement not covered" > this.logger.warn(</span>
767
+ `Skipping malformed action block due to error: ${error.message}`,
768
+ `Block content: ${block.substring(0, 200)}...`,
769
+ );
770
+ // Continue to the next block instead of throwing
771
+ }
772
+ }
773
+ &nbsp;
774
+ // Sort by order_of_execution if present
775
+ <span class="cstat-no" title="statement not covered" > dtos.sort(<span class="fstat-no" title="function not covered" >(a</span>, b) =&gt; {</span>
776
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
777
+ a.order_of_execution === undefined &amp;&amp;
778
+ b.order_of_execution === undefined
779
+ )
780
+ <span class="cstat-no" title="statement not covered" > return 0;</span>
781
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (a.order_of_execution === undefined) <span class="cstat-no" title="statement not covered" >return 1;</span></span>
782
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (b.order_of_execution === undefined) <span class="cstat-no" title="statement not covered" >return -1;</span></span>
783
+ <span class="cstat-no" title="statement not covered" > return a.order_of_execution - b.order_of_execution;</span>
784
+ });
785
+ &nbsp;
786
+ <span class="cstat-no" title="statement not covered" > return { dtos, explanation };</span>
787
+ }
788
+ }
789
+ &nbsp;</pre></td></tr></table></pre>
790
+
791
+ <div class='push'></div><!-- for sticky footer -->
792
+ </div><!-- /wrapper -->
793
+ <div class='footer quiet pad2 space-top1 center small'>
794
+ Code coverage generated by
795
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
796
+ at 2025-07-30T23:37:05.373Z
797
+ </div>
798
+ <script src="../../prettify.js"></script>
799
+ <script>
800
+ window.onload = function () {
801
+ prettyPrint();
802
+ };
803
+ </script>
804
+ <script src="../../sorter.js"></script>
805
+ <script src="../../block-navigation.js"></script>
806
+ </body>
807
+ </html>
808
+