repoburg 1.3.128 → 1.3.129

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 (435) hide show
  1. package/backend/coverage/clover.xml +12003 -0
  2. package/backend/coverage/coverage-final.json +313 -0
  3. package/backend/coverage/lcov-report/base.css +224 -0
  4. package/backend/coverage/lcov-report/block-navigation.js +87 -0
  5. package/backend/coverage/lcov-report/favicon.png +0 -0
  6. package/backend/coverage/lcov-report/index.html +1301 -0
  7. package/backend/coverage/lcov-report/packages/gemini-core/examples/index.html +116 -0
  8. package/backend/coverage/lcov-report/packages/gemini-core/examples/simple.ts.html +445 -0
  9. package/backend/coverage/lcov-report/packages/gemini-core/index.html +116 -0
  10. package/backend/coverage/lcov-report/packages/gemini-core/index.ts.html +127 -0
  11. package/backend/coverage/lcov-report/packages/gemini-core/src/code_assist/codeAssist.ts.html +193 -0
  12. package/backend/coverage/lcov-report/packages/gemini-core/src/code_assist/converter.ts.html +832 -0
  13. package/backend/coverage/lcov-report/packages/gemini-core/src/code_assist/index.html +206 -0
  14. package/backend/coverage/lcov-report/packages/gemini-core/src/code_assist/oauth-credential-storage.ts.html +469 -0
  15. package/backend/coverage/lcov-report/packages/gemini-core/src/code_assist/oauth2.ts.html +1705 -0
  16. package/backend/coverage/lcov-report/packages/gemini-core/src/code_assist/server.ts.html +790 -0
  17. package/backend/coverage/lcov-report/packages/gemini-core/src/code_assist/setup.ts.html +454 -0
  18. package/backend/coverage/lcov-report/packages/gemini-core/src/code_assist/types.ts.html +685 -0
  19. package/backend/coverage/lcov-report/packages/gemini-core/src/config/config.ts.html +307 -0
  20. package/backend/coverage/lcov-report/packages/gemini-core/src/config/index.html +146 -0
  21. package/backend/coverage/lcov-report/packages/gemini-core/src/config/models.ts.html +151 -0
  22. package/backend/coverage/lcov-report/packages/gemini-core/src/config/storage.ts.html +172 -0
  23. package/backend/coverage/lcov-report/packages/gemini-core/src/core/contentGenerator.ts.html +490 -0
  24. package/backend/coverage/lcov-report/packages/gemini-core/src/core/geminiChat.ts.html +1237 -0
  25. package/backend/coverage/lcov-report/packages/gemini-core/src/core/geminiRequest.ts.html +139 -0
  26. package/backend/coverage/lcov-report/packages/gemini-core/src/core/index.html +176 -0
  27. package/backend/coverage/lcov-report/packages/gemini-core/src/core/prompts.ts.html +409 -0
  28. package/backend/coverage/lcov-report/packages/gemini-core/src/core/tokenLimits.ts.html +181 -0
  29. package/backend/coverage/lcov-report/packages/gemini-core/src/index.html +116 -0
  30. package/backend/coverage/lcov-report/packages/gemini-core/src/index.ts.html +187 -0
  31. package/backend/coverage/lcov-report/packages/gemini-core/src/mcp/token-storage/base-token-storage.ts.html +229 -0
  32. package/backend/coverage/lcov-report/packages/gemini-core/src/mcp/token-storage/file-token-storage.ts.html +634 -0
  33. package/backend/coverage/lcov-report/packages/gemini-core/src/mcp/token-storage/hybrid-token-storage.ts.html +373 -0
  34. package/backend/coverage/lcov-report/packages/gemini-core/src/mcp/token-storage/index.html +191 -0
  35. package/backend/coverage/lcov-report/packages/gemini-core/src/mcp/token-storage/index.ts.html +124 -0
  36. package/backend/coverage/lcov-report/packages/gemini-core/src/mcp/token-storage/keychain-token-storage.ts.html +835 -0
  37. package/backend/coverage/lcov-report/packages/gemini-core/src/mcp/token-storage/types.ts.html +211 -0
  38. package/backend/coverage/lcov-report/packages/gemini-core/src/utils/errors.ts.html +421 -0
  39. package/backend/coverage/lcov-report/packages/gemini-core/src/utils/index.html +191 -0
  40. package/backend/coverage/lcov-report/packages/gemini-core/src/utils/partUtils.ts.html +592 -0
  41. package/backend/coverage/lcov-report/packages/gemini-core/src/utils/quotaErrorDetection.ts.html +388 -0
  42. package/backend/coverage/lcov-report/packages/gemini-core/src/utils/retry.ts.html +877 -0
  43. package/backend/coverage/lcov-report/packages/gemini-core/src/utils/session.ts.html +112 -0
  44. package/backend/coverage/lcov-report/packages/gemini-core/src/utils/userAccountManager.ts.html +502 -0
  45. package/backend/coverage/lcov-report/packages/tokenpatch/index.html +161 -0
  46. package/backend/coverage/lcov-report/packages/tokenpatch/index.ts.html +415 -0
  47. package/backend/coverage/lcov-report/packages/tokenpatch/parser.ts.html +139 -0
  48. package/backend/coverage/lcov-report/packages/tokenpatch/patcher.ts.html +1249 -0
  49. package/backend/coverage/lcov-report/packages/tokenpatch/strategies/index.html +131 -0
  50. package/backend/coverage/lcov-report/packages/tokenpatch/strategies/tiktoken-tokenizer.ts.html +187 -0
  51. package/backend/coverage/lcov-report/packages/tokenpatch/strategies/tree-sitter-tokenizer.ts.html +193 -0
  52. package/backend/coverage/lcov-report/packages/tokenpatch/tokens.ts.html +178 -0
  53. package/backend/coverage/lcov-report/prettify.css +1 -0
  54. package/backend/coverage/lcov-report/prettify.js +2 -0
  55. package/backend/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  56. package/backend/coverage/lcov-report/sorter.js +210 -0
  57. package/backend/coverage/lcov-report/src/ai-actions/ai-action-batch.service.ts.html +1549 -0
  58. package/backend/coverage/lcov-report/src/ai-actions/ai-actions.controller.ts.html +904 -0
  59. package/backend/coverage/lcov-report/src/ai-actions/ai-actions.module.ts.html +175 -0
  60. package/backend/coverage/lcov-report/src/ai-actions/ai-actions.service.ts.html +1534 -0
  61. package/backend/coverage/lcov-report/src/ai-actions/index.html +161 -0
  62. package/backend/coverage/lcov-report/src/app.controller.ts.html +151 -0
  63. package/backend/coverage/lcov-report/src/app.module.ts.html +451 -0
  64. package/backend/coverage/lcov-report/src/app.service.ts.html +163 -0
  65. package/backend/coverage/lcov-report/src/application-state/application-state.controller.ts.html +1609 -0
  66. package/backend/coverage/lcov-report/src/application-state/application-state.module.ts.html +136 -0
  67. package/backend/coverage/lcov-report/src/application-state/application-state.service.ts.html +2281 -0
  68. package/backend/coverage/lcov-report/src/application-state/dto/index.html +416 -0
  69. package/backend/coverage/lcov-report/src/application-state/dto/set-alibaba-config.dto.ts.html +109 -0
  70. package/backend/coverage/lcov-report/src/application-state/dto/set-auto-context-fetch-enabled.dto.ts.html +118 -0
  71. package/backend/coverage/lcov-report/src/application-state/dto/set-auto-send-to-ai-studio-enabled.dto.ts.html +109 -0
  72. package/backend/coverage/lcov-report/src/application-state/dto/set-context-token-limit.dto.ts.html +124 -0
  73. package/backend/coverage/lcov-report/src/application-state/dto/set-execution-strategy.dto.ts.html +121 -0
  74. package/backend/coverage/lcov-report/src/application-state/dto/set-followup-token-limit.dto.ts.html +124 -0
  75. package/backend/coverage/lcov-report/src/application-state/dto/set-history-compression-enabled.dto.ts.html +115 -0
  76. package/backend/coverage/lcov-report/src/application-state/dto/set-llm-retry-enabled.dto.ts.html +115 -0
  77. package/backend/coverage/lcov-report/src/application-state/dto/set-llm-retry-max-attempts.dto.ts.html +127 -0
  78. package/backend/coverage/lcov-report/src/application-state/dto/set-manual-llm-enabled.dto.ts.html +118 -0
  79. package/backend/coverage/lcov-report/src/application-state/dto/set-ollama-config.dto.ts.html +109 -0
  80. package/backend/coverage/lcov-report/src/application-state/dto/set-openai-config.dto.ts.html +139 -0
  81. package/backend/coverage/lcov-report/src/application-state/dto/set-openrouter-config.dto.ts.html +109 -0
  82. package/backend/coverage/lcov-report/src/application-state/dto/set-streaming-enabled.dto.ts.html +109 -0
  83. package/backend/coverage/lcov-report/src/application-state/dto/set-syntax-validation-enabled.dto.ts.html +118 -0
  84. package/backend/coverage/lcov-report/src/application-state/dto/set-theme.dto.ts.html +124 -0
  85. package/backend/coverage/lcov-report/src/application-state/dto/set-tools-enabled.dto.ts.html +118 -0
  86. package/backend/coverage/lcov-report/src/application-state/dto/set-websocket-enabled.dto.ts.html +109 -0
  87. package/backend/coverage/lcov-report/src/application-state/dto/set-yolo-mode-message.dto.ts.html +124 -0
  88. package/backend/coverage/lcov-report/src/application-state/dto/set-yolo-mode.dto.ts.html +118 -0
  89. package/backend/coverage/lcov-report/src/application-state/dto/set-zai-config.dto.ts.html +109 -0
  90. package/backend/coverage/lcov-report/src/application-state/index.html +146 -0
  91. package/backend/coverage/lcov-report/src/common/cache/cache-invalidation.service.ts.html +1297 -0
  92. package/backend/coverage/lcov-report/src/common/cache/cache-invalidation.subscriber.ts.html +712 -0
  93. package/backend/coverage/lcov-report/src/common/cache/etag-cache.service.ts.html +379 -0
  94. package/backend/coverage/lcov-report/src/common/cache/index.html +146 -0
  95. package/backend/coverage/lcov-report/src/common/common.module.ts.html +121 -0
  96. package/backend/coverage/lcov-report/src/common/index.html +116 -0
  97. package/backend/coverage/lcov-report/src/common/interceptors/etag-cache.interceptor.ts.html +337 -0
  98. package/backend/coverage/lcov-report/src/common/interceptors/index.html +116 -0
  99. package/backend/coverage/lcov-report/src/common/middleware/cache.middleware.ts.html +265 -0
  100. package/backend/coverage/lcov-report/src/common/middleware/index.html +116 -0
  101. package/backend/coverage/lcov-report/src/context-generation/context-generation.module.ts.html +118 -0
  102. package/backend/coverage/lcov-report/src/context-generation/context-generation.service.ts.html +1501 -0
  103. package/backend/coverage/lcov-report/src/context-generation/index.html +131 -0
  104. package/backend/coverage/lcov-report/src/context-snippets/context-snippets.controller.ts.html +427 -0
  105. package/backend/coverage/lcov-report/src/context-snippets/context-snippets.module.ts.html +142 -0
  106. package/backend/coverage/lcov-report/src/context-snippets/context-snippets.service.ts.html +442 -0
  107. package/backend/coverage/lcov-report/src/context-snippets/dto/context-snippet.dto.ts.html +211 -0
  108. package/backend/coverage/lcov-report/src/context-snippets/dto/index.html +116 -0
  109. package/backend/coverage/lcov-report/src/context-snippets/index.html +146 -0
  110. package/backend/coverage/lcov-report/src/context-templates/context-templates.controller.ts.html +724 -0
  111. package/backend/coverage/lcov-report/src/context-templates/context-templates.module.ts.html +142 -0
  112. package/backend/coverage/lcov-report/src/context-templates/context-templates.service.ts.html +1015 -0
  113. package/backend/coverage/lcov-report/src/context-templates/dto/context-template.dto.ts.html +511 -0
  114. package/backend/coverage/lcov-report/src/context-templates/dto/index.html +116 -0
  115. package/backend/coverage/lcov-report/src/context-templates/index.html +146 -0
  116. package/backend/coverage/lcov-report/src/core-entities/ai-action.entity.ts.html +613 -0
  117. package/backend/coverage/lcov-report/src/core-entities/application-state.entity.ts.html +124 -0
  118. package/backend/coverage/lcov-report/src/core-entities/base.entity.ts.html +211 -0
  119. package/backend/coverage/lcov-report/src/core-entities/context-snippet.entity.ts.html +190 -0
  120. package/backend/coverage/lcov-report/src/core-entities/context-template.entity.ts.html +439 -0
  121. package/backend/coverage/lcov-report/src/core-entities/custom-snippet.entity.ts.html +205 -0
  122. package/backend/coverage/lcov-report/src/core-entities/custom-variable.entity.ts.html +241 -0
  123. package/backend/coverage/lcov-report/src/core-entities/enums.ts.html +553 -0
  124. package/backend/coverage/lcov-report/src/core-entities/execution-log.entity.ts.html +208 -0
  125. package/backend/coverage/lcov-report/src/core-entities/index.html +371 -0
  126. package/backend/coverage/lcov-report/src/core-entities/index.ts.html +136 -0
  127. package/backend/coverage/lcov-report/src/core-entities/llm-call-log.entity.ts.html +388 -0
  128. package/backend/coverage/lcov-report/src/core-entities/mcp-config.entity.ts.html +256 -0
  129. package/backend/coverage/lcov-report/src/core-entities/mcp-tool.entity.ts.html +256 -0
  130. package/backend/coverage/lcov-report/src/core-entities/project.entity.ts.html +181 -0
  131. package/backend/coverage/lcov-report/src/core-entities/session-input.entity.ts.html +745 -0
  132. package/backend/coverage/lcov-report/src/core-entities/session.entity.ts.html +688 -0
  133. package/backend/coverage/lcov-report/src/core-entities/system-prompt.entity.ts.html +349 -0
  134. package/backend/coverage/lcov-report/src/core-entities/tool-hook.entity.ts.html +235 -0
  135. package/backend/coverage/lcov-report/src/custom-snippets/custom-snippets.controller.ts.html +442 -0
  136. package/backend/coverage/lcov-report/src/custom-snippets/custom-snippets.module.ts.html +124 -0
  137. package/backend/coverage/lcov-report/src/custom-snippets/custom-snippets.service.ts.html +304 -0
  138. package/backend/coverage/lcov-report/src/custom-snippets/dto/custom-snippet.dto.ts.html +205 -0
  139. package/backend/coverage/lcov-report/src/custom-snippets/dto/index.html +116 -0
  140. package/backend/coverage/lcov-report/src/custom-snippets/index.html +146 -0
  141. package/backend/coverage/lcov-report/src/custom-variables/custom-variables.controller.ts.html +463 -0
  142. package/backend/coverage/lcov-report/src/custom-variables/custom-variables.module.ts.html +124 -0
  143. package/backend/coverage/lcov-report/src/custom-variables/custom-variables.service.ts.html +310 -0
  144. package/backend/coverage/lcov-report/src/custom-variables/dto/custom-variable.dto.ts.html +244 -0
  145. package/backend/coverage/lcov-report/src/custom-variables/dto/index.html +116 -0
  146. package/backend/coverage/lcov-report/src/custom-variables/index.html +146 -0
  147. package/backend/coverage/lcov-report/src/events/events.gateway.ts.html +295 -0
  148. package/backend/coverage/lcov-report/src/events/events.module.ts.html +109 -0
  149. package/backend/coverage/lcov-report/src/events/index.html +146 -0
  150. package/backend/coverage/lcov-report/src/events/websocket.events.ts.html +466 -0
  151. package/backend/coverage/lcov-report/src/execution-logs/dto/execution-log.dto.ts.html +130 -0
  152. package/backend/coverage/lcov-report/src/execution-logs/dto/index.html +116 -0
  153. package/backend/coverage/lcov-report/src/execution-logs/execution-logs.controller.ts.html +130 -0
  154. package/backend/coverage/lcov-report/src/execution-logs/execution-logs.module.ts.html +124 -0
  155. package/backend/coverage/lcov-report/src/execution-logs/execution-logs.service.ts.html +238 -0
  156. package/backend/coverage/lcov-report/src/execution-logs/index.html +146 -0
  157. package/backend/coverage/lcov-report/src/gemini/gemini-llm.provider.ts.html +553 -0
  158. package/backend/coverage/lcov-report/src/gemini/gemini.module.ts.html +109 -0
  159. package/backend/coverage/lcov-report/src/gemini/index.html +131 -0
  160. package/backend/coverage/lcov-report/src/global-config/dto/index.html +116 -0
  161. package/backend/coverage/lcov-report/src/global-config/dto/update-global-config.dto.ts.html +367 -0
  162. package/backend/coverage/lcov-report/src/global-config/global-config.controller.ts.html +220 -0
  163. package/backend/coverage/lcov-report/src/global-config/global-config.module.ts.html +115 -0
  164. package/backend/coverage/lcov-report/src/global-config/global-config.service.ts.html +397 -0
  165. package/backend/coverage/lcov-report/src/global-config/index.html +146 -0
  166. package/backend/coverage/lcov-report/src/http-exception.filter.ts.html +340 -0
  167. package/backend/coverage/lcov-report/src/index.html +206 -0
  168. package/backend/coverage/lcov-report/src/interactive-chat/chat.module.ts.html +187 -0
  169. package/backend/coverage/lcov-report/src/interactive-chat/chat.service.ts.html +1825 -0
  170. package/backend/coverage/lcov-report/src/interactive-chat/index.html +146 -0
  171. package/backend/coverage/lcov-report/src/interactive-chat/streaming.controller.ts.html +343 -0
  172. package/backend/coverage/lcov-report/src/llm-call-logs/dto/index.html +116 -0
  173. package/backend/coverage/lcov-report/src/llm-call-logs/dto/llm-call-log.dto.ts.html +214 -0
  174. package/backend/coverage/lcov-report/src/llm-call-logs/index.html +146 -0
  175. package/backend/coverage/lcov-report/src/llm-call-logs/llm-call-logs.controller.ts.html +634 -0
  176. package/backend/coverage/lcov-report/src/llm-call-logs/llm-call-logs.module.ts.html +124 -0
  177. package/backend/coverage/lcov-report/src/llm-call-logs/llm-call-logs.service.ts.html +643 -0
  178. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/apply-diff.handler.ts.html +1090 -0
  179. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/ask-user.handler.ts.html +433 -0
  180. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/create-file.handler.ts.html +757 -0
  181. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/delete-file.handler.ts.html +586 -0
  182. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/discard-messages.handler.ts.html +1153 -0
  183. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/apply-diff.args.dto.ts.html +124 -0
  184. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/ask-user.args.dto.ts.html +103 -0
  185. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/create-file.args.dto.ts.html +124 -0
  186. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/delete-file.args.dto.ts.html +106 -0
  187. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/execute-code.args.dto.ts.html +106 -0
  188. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/final.args.dto.ts.html +118 -0
  189. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/generate-title.args.dto.ts.html +190 -0
  190. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/get-session-history.args.dto.ts.html +196 -0
  191. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/howto.args.dto.ts.html +91 -0
  192. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/index.html +356 -0
  193. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/new-session.args.dto.ts.html +106 -0
  194. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/overwrite-file.args.dto.ts.html +124 -0
  195. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/patch.args.dto.ts.html +124 -0
  196. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/quick-edit.args.dto.ts.html +214 -0
  197. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/request-context.args.dto.ts.html +202 -0
  198. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/run-command.args.dto.ts.html +151 -0
  199. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/sanitizer.decorator.ts.html +181 -0
  200. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/write-todo.args.dto.ts.html +130 -0
  201. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/execute-code.handler.ts.html +631 -0
  202. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/final.handler.ts.html +469 -0
  203. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/generate-title.handler.ts.html +448 -0
  204. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/get-messages.handler.ts.html +1351 -0
  205. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/get-session-history.handler.ts.html +868 -0
  206. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/howto.handler.ts.html +481 -0
  207. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/index.html +416 -0
  208. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/invoke-subagent.handler.ts.html +580 -0
  209. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/list-sub-agents.handler.ts.html +352 -0
  210. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/matchers/context-aware.matcher.ts.html +1054 -0
  211. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/matchers/exact.matcher.ts.html +331 -0
  212. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/matchers/hybrid.matcher.ts.html +403 -0
  213. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/matchers/index.html +176 -0
  214. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/matchers/index.ts.html +100 -0
  215. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/matchers/normalized.matcher.ts.html +724 -0
  216. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/mcp-tool-action.handler.ts.html +358 -0
  217. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/new-session.handler.ts.html +379 -0
  218. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/overwrite-file.handler.ts.html +838 -0
  219. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/patch.handler.ts.html +1702 -0
  220. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/quick-edit.handler.ts.html +1459 -0
  221. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/request-context.handler.ts.html +679 -0
  222. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/run-command.handler.ts.html +964 -0
  223. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/write-todo.handler.ts.html +625 -0
  224. package/backend/coverage/lcov-report/src/llm-orchestration/errors/handler-validation.error.ts.html +103 -0
  225. package/backend/coverage/lcov-report/src/llm-orchestration/errors/index.html +116 -0
  226. package/backend/coverage/lcov-report/src/llm-orchestration/history-compression.service.ts.html +1645 -0
  227. package/backend/coverage/lcov-report/src/llm-orchestration/hooks/follow-up-post-execution.hook.ts.html +238 -0
  228. package/backend/coverage/lcov-report/src/llm-orchestration/hooks/frontend-notification.hook.ts.html +181 -0
  229. package/backend/coverage/lcov-report/src/llm-orchestration/hooks/index.html +161 -0
  230. package/backend/coverage/lcov-report/src/llm-orchestration/hooks/invalid-tool-feedback.hook.ts.html +313 -0
  231. package/backend/coverage/lcov-report/src/llm-orchestration/hooks/yolo-mode-post-execution.hook.ts.html +466 -0
  232. package/backend/coverage/lcov-report/src/llm-orchestration/index.html +176 -0
  233. package/backend/coverage/lcov-report/src/llm-orchestration/llm-orchestration.interfaces.ts.html +319 -0
  234. package/backend/coverage/lcov-report/src/llm-orchestration/llm-orchestration.module.ts.html +706 -0
  235. package/backend/coverage/lcov-report/src/llm-orchestration/llm-turn-processor.service.ts.html +1150 -0
  236. package/backend/coverage/lcov-report/src/llm-orchestration/parser/index.html +131 -0
  237. package/backend/coverage/lcov-report/src/llm-orchestration/parser/llm-output-parser.service.ts.html +658 -0
  238. package/backend/coverage/lcov-report/src/llm-orchestration/parser/parsing.constants.ts.html +127 -0
  239. package/backend/coverage/lcov-report/src/llm-orchestration/tool-schema.service.ts.html +547 -0
  240. package/backend/coverage/lcov-report/src/llm-provider/alibaba-llm.provider.ts.html +1681 -0
  241. package/backend/coverage/lcov-report/src/llm-provider/index.html +236 -0
  242. package/backend/coverage/lcov-report/src/llm-provider/llm-provider.controller.ts.html +187 -0
  243. package/backend/coverage/lcov-report/src/llm-provider/llm-provider.interface.ts.html +361 -0
  244. package/backend/coverage/lcov-report/src/llm-provider/llm-provider.module.ts.html +175 -0
  245. package/backend/coverage/lcov-report/src/llm-provider/ollama-llm.provider.ts.html +1780 -0
  246. package/backend/coverage/lcov-report/src/llm-provider/openai-llm.provider.ts.html +1867 -0
  247. package/backend/coverage/lcov-report/src/llm-provider/openrouter-llm.provider.ts.html +1891 -0
  248. package/backend/coverage/lcov-report/src/llm-provider/proxy-llm.provider.ts.html +304 -0
  249. package/backend/coverage/lcov-report/src/llm-provider/zai-llm.provider.ts.html +1666 -0
  250. package/backend/coverage/lcov-report/src/llm-responses/dto/index.html +131 -0
  251. package/backend/coverage/lcov-report/src/llm-responses/dto/submit-llm-response.dto.ts.html +436 -0
  252. package/backend/coverage/lcov-report/src/llm-responses/dto/sync-conversation.dto.ts.html +319 -0
  253. package/backend/coverage/lcov-report/src/llm-responses/index.html +146 -0
  254. package/backend/coverage/lcov-report/src/llm-responses/llm-responses.controller.ts.html +283 -0
  255. package/backend/coverage/lcov-report/src/llm-responses/llm-responses.module.ts.html +184 -0
  256. package/backend/coverage/lcov-report/src/llm-responses/llm-responses.service.ts.html +1474 -0
  257. package/backend/coverage/lcov-report/src/main.ts.html +463 -0
  258. package/backend/coverage/lcov-report/src/mcp/dto/batch-update-mcp-tools.dto.ts.html +145 -0
  259. package/backend/coverage/lcov-report/src/mcp/dto/create-mcp-config.dto.ts.html +127 -0
  260. package/backend/coverage/lcov-report/src/mcp/dto/index.html +146 -0
  261. package/backend/coverage/lcov-report/src/mcp/dto/update-mcp-config.dto.ts.html +112 -0
  262. package/backend/coverage/lcov-report/src/mcp/index.html +146 -0
  263. package/backend/coverage/lcov-report/src/mcp/mcp.controller.ts.html +340 -0
  264. package/backend/coverage/lcov-report/src/mcp/mcp.module.ts.html +124 -0
  265. package/backend/coverage/lcov-report/src/mcp/mcp.service.ts.html +1345 -0
  266. package/backend/coverage/lcov-report/src/message-bus/dto/index.html +116 -0
  267. package/backend/coverage/lcov-report/src/message-bus/dto/submit-message.dto.ts.html +109 -0
  268. package/backend/coverage/lcov-report/src/message-bus/index.html +146 -0
  269. package/backend/coverage/lcov-report/src/message-bus/message-bus.controller.ts.html +148 -0
  270. package/backend/coverage/lcov-report/src/message-bus/message-bus.module.ts.html +115 -0
  271. package/backend/coverage/lcov-report/src/message-bus/message-bus.service.ts.html +151 -0
  272. package/backend/coverage/lcov-report/src/projects/dto/index.html +116 -0
  273. package/backend/coverage/lcov-report/src/projects/dto/project.dto.ts.html +196 -0
  274. package/backend/coverage/lcov-report/src/projects/index.html +146 -0
  275. package/backend/coverage/lcov-report/src/projects/projects.controller.ts.html +322 -0
  276. package/backend/coverage/lcov-report/src/projects/projects.module.ts.html +124 -0
  277. package/backend/coverage/lcov-report/src/projects/projects.service.ts.html +235 -0
  278. package/backend/coverage/lcov-report/src/seeding/context-snippet-seeding.service.ts.html +280 -0
  279. package/backend/coverage/lcov-report/src/seeding/context-template-seeding.service.ts.html +439 -0
  280. package/backend/coverage/lcov-report/src/seeding/custom-snippet-seeding.service.ts.html +271 -0
  281. package/backend/coverage/lcov-report/src/seeding/custom-variable-seeding.service.ts.html +271 -0
  282. package/backend/coverage/lcov-report/src/seeding/data/context-snippets/compress.ts.html +172 -0
  283. package/backend/coverage/lcov-report/src/seeding/data/context-snippets/index.html +116 -0
  284. package/backend/coverage/lcov-report/src/seeding/data/context-templates/default-followup_ad-hoc-focused-context.ts.html +157 -0
  285. package/backend/coverage/lcov-report/src/seeding/data/context-templates/default-initial_condensed-project-context.ts.html +148 -0
  286. package/backend/coverage/lcov-report/src/seeding/data/context-templates/default-initial_full-project-context.ts.html +151 -0
  287. package/backend/coverage/lcov-report/src/seeding/data/context-templates/index.html +161 -0
  288. package/backend/coverage/lcov-report/src/seeding/data/context-templates/open-pr-command.ts.html +247 -0
  289. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/default_rglob.ts.html +94 -0
  290. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/eta-for.ts.html +100 -0
  291. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/eta-if.ts.html +97 -0
  292. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/eta-ifelse.ts.html +100 -0
  293. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/everest-playwright-auth.ts.html +304 -0
  294. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/git-diff.ts.html +94 -0
  295. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/index.html +341 -0
  296. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/it-mcp.ts.html +100 -0
  297. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/it-tools.ts.html +97 -0
  298. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/rg-exclude.ts.html +94 -0
  299. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/rg-search-glob.ts.html +94 -0
  300. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/rg-search.ts.html +94 -0
  301. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/run-command.ts.html +94 -0
  302. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/tree.ts.html +94 -0
  303. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/usr-adhoc-incl.ts.html +100 -0
  304. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/usr-cmd-output-incl.ts.html +94 -0
  305. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/usr-input-incl.ts.html +94 -0
  306. package/backend/coverage/lcov-report/src/seeding/data/custom-variables/default-auto-execute-code.ts.html +94 -0
  307. package/backend/coverage/lcov-report/src/seeding/data/custom-variables/default-plan-mode.ts.html +97 -0
  308. package/backend/coverage/lcov-report/src/seeding/data/custom-variables/index.html +131 -0
  309. package/backend/coverage/lcov-report/src/seeding/data/mcp-configs/default-configs.ts.html +121 -0
  310. package/backend/coverage/lcov-report/src/seeding/data/mcp-configs/index.html +116 -0
  311. package/backend/coverage/lcov-report/src/seeding/data/sub-agents/browser-use.ts.html +115 -0
  312. package/backend/coverage/lcov-report/src/seeding/data/sub-agents/explore-codebase.ts.html +136 -0
  313. package/backend/coverage/lcov-report/src/seeding/data/sub-agents/index.html +131 -0
  314. package/backend/coverage/lcov-report/src/seeding/data/system-prompts/browser-use-agent.ts.html +190 -0
  315. package/backend/coverage/lcov-report/src/seeding/data/system-prompts/default_native_tool_agent.ts.html +421 -0
  316. package/backend/coverage/lcov-report/src/seeding/data/system-prompts/explore-codebase-agent.ts.html +265 -0
  317. package/backend/coverage/lcov-report/src/seeding/data/system-prompts/index.html +161 -0
  318. package/backend/coverage/lcov-report/src/seeding/data/system-prompts/master-agent.ts.html +388 -0
  319. package/backend/coverage/lcov-report/src/seeding/data/tool-hooks/eslint-hook.ts.html +265 -0
  320. package/backend/coverage/lcov-report/src/seeding/data/tool-hooks/example-hook.ts.html +274 -0
  321. package/backend/coverage/lcov-report/src/seeding/data/tool-hooks/index.html +146 -0
  322. package/backend/coverage/lcov-report/src/seeding/data/tool-hooks/readme.ts.html +250 -0
  323. package/backend/coverage/lcov-report/src/seeding/index.html +236 -0
  324. package/backend/coverage/lcov-report/src/seeding/mcp-config-seeding.service.ts.html +193 -0
  325. package/backend/coverage/lcov-report/src/seeding/seeding.module.ts.html +211 -0
  326. package/backend/coverage/lcov-report/src/seeding/seeding.service.ts.html +187 -0
  327. package/backend/coverage/lcov-report/src/seeding/sub-agent-seeding.service.ts.html +742 -0
  328. package/backend/coverage/lcov-report/src/seeding/system-prompt-seeding.service.ts.html +397 -0
  329. package/backend/coverage/lcov-report/src/session-followup/index.html +131 -0
  330. package/backend/coverage/lcov-report/src/session-followup/session-followup.module.ts.html +130 -0
  331. package/backend/coverage/lcov-report/src/session-followup/session-followup.service.ts.html +718 -0
  332. package/backend/coverage/lcov-report/src/session-inputs/dto/index.html +116 -0
  333. package/backend/coverage/lcov-report/src/session-inputs/dto/session-input.dto.ts.html +577 -0
  334. package/backend/coverage/lcov-report/src/session-inputs/index.html +176 -0
  335. package/backend/coverage/lcov-report/src/session-inputs/session-input-context.service.ts.html +832 -0
  336. package/backend/coverage/lcov-report/src/session-inputs/session-input.subscriber.ts.html +220 -0
  337. package/backend/coverage/lcov-report/src/session-inputs/session-inputs.controller.ts.html +685 -0
  338. package/backend/coverage/lcov-report/src/session-inputs/session-inputs.module.ts.html +229 -0
  339. package/backend/coverage/lcov-report/src/session-inputs/session-inputs.service.ts.html +1981 -0
  340. package/backend/coverage/lcov-report/src/session-transfer/index.html +131 -0
  341. package/backend/coverage/lcov-report/src/session-transfer/session-transfer.module.ts.html +160 -0
  342. package/backend/coverage/lcov-report/src/session-transfer/session-transfer.service.ts.html +883 -0
  343. package/backend/coverage/lcov-report/src/sessions/dto/index.html +116 -0
  344. package/backend/coverage/lcov-report/src/sessions/dto/session.dto.ts.html +769 -0
  345. package/backend/coverage/lcov-report/src/sessions/index.html +146 -0
  346. package/backend/coverage/lcov-report/src/sessions/sessions.controller.ts.html +1306 -0
  347. package/backend/coverage/lcov-report/src/sessions/sessions.module.ts.html +220 -0
  348. package/backend/coverage/lcov-report/src/sessions/sessions.service.ts.html +2797 -0
  349. package/backend/coverage/lcov-report/src/sub-agents/dto/create-sub-agent.dto.ts.html +355 -0
  350. package/backend/coverage/lcov-report/src/sub-agents/dto/index.html +131 -0
  351. package/backend/coverage/lcov-report/src/sub-agents/dto/update-sub-agent.dto.ts.html +295 -0
  352. package/backend/coverage/lcov-report/src/sub-agents/index.html +221 -0
  353. package/backend/coverage/lcov-report/src/sub-agents/sub-agent-run.entity.ts.html +463 -0
  354. package/backend/coverage/lcov-report/src/sub-agents/sub-agent-runner.service.ts.html +2428 -0
  355. package/backend/coverage/lcov-report/src/sub-agents/sub-agent-runs.controller.ts.html +580 -0
  356. package/backend/coverage/lcov-report/src/sub-agents/sub-agent-runs.service.ts.html +550 -0
  357. package/backend/coverage/lcov-report/src/sub-agents/sub-agent.entity.ts.html +475 -0
  358. package/backend/coverage/lcov-report/src/sub-agents/sub-agents.controller.ts.html +373 -0
  359. package/backend/coverage/lcov-report/src/sub-agents/sub-agents.module.ts.html +205 -0
  360. package/backend/coverage/lcov-report/src/sub-agents/sub-agents.service.ts.html +619 -0
  361. package/backend/coverage/lcov-report/src/syntax-validation/index.html +131 -0
  362. package/backend/coverage/lcov-report/src/syntax-validation/syntax-validation.module.ts.html +109 -0
  363. package/backend/coverage/lcov-report/src/syntax-validation/syntax-validation.service.ts.html +724 -0
  364. package/backend/coverage/lcov-report/src/system-prompts/dto/index.html +176 -0
  365. package/backend/coverage/lcov-report/src/system-prompts/dto/set-enabled-mcp-tools.dto.ts.html +157 -0
  366. package/backend/coverage/lcov-report/src/system-prompts/dto/set-enabled-tools.dto.ts.html +148 -0
  367. package/backend/coverage/lcov-report/src/system-prompts/dto/system-prompt.dto.ts.html +517 -0
  368. package/backend/coverage/lcov-report/src/system-prompts/dto/toggle-mcp-tool.dto.ts.html +121 -0
  369. package/backend/coverage/lcov-report/src/system-prompts/dto/toggle-tool.dto.ts.html +118 -0
  370. package/backend/coverage/lcov-report/src/system-prompts/index.html +146 -0
  371. package/backend/coverage/lcov-report/src/system-prompts/system-prompts.controller.ts.html +1060 -0
  372. package/backend/coverage/lcov-report/src/system-prompts/system-prompts.module.ts.html +160 -0
  373. package/backend/coverage/lcov-report/src/system-prompts/system-prompts.service.ts.html +2254 -0
  374. package/backend/coverage/lcov-report/src/timeout.interceptor.ts.html +178 -0
  375. package/backend/coverage/lcov-report/src/tool-hooks/dto/create-tool-hook.dto.ts.html +181 -0
  376. package/backend/coverage/lcov-report/src/tool-hooks/dto/index.html +131 -0
  377. package/backend/coverage/lcov-report/src/tool-hooks/dto/update-tool-hook.dto.ts.html +178 -0
  378. package/backend/coverage/lcov-report/src/tool-hooks/index.html +146 -0
  379. package/backend/coverage/lcov-report/src/tool-hooks/tool-hooks.controller.ts.html +481 -0
  380. package/backend/coverage/lcov-report/src/tool-hooks/tool-hooks.module.ts.html +127 -0
  381. package/backend/coverage/lcov-report/src/tool-hooks/tool-hooks.service.ts.html +1222 -0
  382. package/backend/coverage/lcov-report/src/tracing.ts.html +214 -0
  383. package/backend/coverage/lcov-report/src/types/express-multer.d.ts.html +130 -0
  384. package/backend/coverage/lcov-report/src/types/index.html +116 -0
  385. package/backend/coverage/lcov-report/src/utils/ai-format-generator.ts.html +253 -0
  386. package/backend/coverage/lcov-report/src/utils/fuzzy-search.ts.html +310 -0
  387. package/backend/coverage/lcov-report/src/utils/index.html +191 -0
  388. package/backend/coverage/lcov-report/src/utils/index.ts.html +100 -0
  389. package/backend/coverage/lcov-report/src/utils/short-id.ts.html +109 -0
  390. package/backend/coverage/lcov-report/src/utils/spawn-with-kill.ts.html +412 -0
  391. package/backend/coverage/lcov-report/src/utils/trace.decorator.ts.html +223 -0
  392. package/backend/coverage/lcov-report/src/visual-editor/index.html +146 -0
  393. package/backend/coverage/lcov-report/src/visual-editor/visual-editor.controller.ts.html +409 -0
  394. package/backend/coverage/lcov-report/src/visual-editor/visual-editor.dto.ts.html +130 -0
  395. package/backend/coverage/lcov-report/src/visual-editor/visual-editor.module.ts.html +118 -0
  396. package/backend/coverage/lcov-report/src/workspace/dto/file-tree.dto.ts.html +112 -0
  397. package/backend/coverage/lcov-report/src/workspace/dto/index.html +131 -0
  398. package/backend/coverage/lcov-report/src/workspace/dto/search-workspace.dto.ts.html +193 -0
  399. package/backend/coverage/lcov-report/src/workspace/index.html +146 -0
  400. package/backend/coverage/lcov-report/src/workspace/workspace.controller.ts.html +394 -0
  401. package/backend/coverage/lcov-report/src/workspace/workspace.module.ts.html +121 -0
  402. package/backend/coverage/lcov-report/src/workspace/workspace.service.ts.html +1027 -0
  403. package/backend/coverage/lcov.info +20220 -0
  404. package/backend/dist/src/context-templates/context-templates.service.js +0 -3
  405. package/backend/dist/src/context-templates/context-templates.service.js.map +1 -1
  406. package/backend/dist/src/seeding/data/context-templates/default-initial_full-project-context.d.ts +1 -1
  407. package/backend/dist/src/seeding/data/context-templates/default-initial_full-project-context.js +4 -0
  408. package/backend/dist/src/seeding/data/context-templates/default-initial_full-project-context.js.map +1 -1
  409. package/backend/dist/src/seeding/data/sub-agents/browser-use.d.ts +1 -1
  410. package/backend/dist/src/seeding/data/sub-agents/browser-use.js +1 -1
  411. package/backend/dist/src/seeding/data/sub-agents/browser-use.js.map +1 -1
  412. package/backend/dist/src/seeding/data/system-prompts/browser-use-agent.d.ts +1 -0
  413. package/backend/dist/src/seeding/data/system-prompts/browser-use-agent.js +2 -1
  414. package/backend/dist/src/seeding/data/system-prompts/browser-use-agent.js.map +1 -1
  415. package/backend/dist/src/seeding/data/system-prompts/default_native_tool_agent.d.ts +1 -0
  416. package/backend/dist/src/seeding/data/system-prompts/default_native_tool_agent.js +2 -1
  417. package/backend/dist/src/seeding/data/system-prompts/default_native_tool_agent.js.map +1 -1
  418. package/backend/dist/src/seeding/data/system-prompts/explore-codebase-agent.d.ts +1 -0
  419. package/backend/dist/src/seeding/data/system-prompts/explore-codebase-agent.js +2 -1
  420. package/backend/dist/src/seeding/data/system-prompts/explore-codebase-agent.js.map +1 -1
  421. package/backend/dist/src/seeding/system-prompt-seeding.service.js +3 -1
  422. package/backend/dist/src/seeding/system-prompt-seeding.service.js.map +1 -1
  423. package/backend/dist/src/sub-agents/sub-agent-run.entity.d.ts +1 -1
  424. package/backend/dist/src/sub-agents/sub-agent-run.entity.js +1 -1
  425. package/backend/dist/src/sub-agents/sub-agent-run.entity.js.map +1 -1
  426. package/backend/dist/src/sub-agents/sub-agent-runner.service.d.ts +1 -0
  427. package/backend/dist/src/sub-agents/sub-agent-runner.service.js +16 -2
  428. package/backend/dist/src/sub-agents/sub-agent-runner.service.js.map +1 -1
  429. package/backend/dist/src/sub-agents/sub-agents.service.js +0 -3
  430. package/backend/dist/src/sub-agents/sub-agents.service.js.map +1 -1
  431. package/backend/dist/src/system-prompts/system-prompts.service.d.ts +2 -1
  432. package/backend/dist/src/system-prompts/system-prompts.service.js +20 -14
  433. package/backend/dist/src/system-prompts/system-prompts.service.js.map +1 -1
  434. package/backend/dist/tsconfig.build.tsbuildinfo +1 -1
  435. package/package.json +1 -1
@@ -0,0 +1,1645 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/llm-orchestration/history-compression.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-orchestration</a> history-compression.service.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">93.51% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>173/185</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">87.65% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>71/81</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'>17/17</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">94.18% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>162/172</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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">19x</span>
587
+ <span class="cline-any cline-neutral">&nbsp;</span>
588
+ <span class="cline-any cline-yes">19x</span>
589
+ <span class="cline-any cline-neutral">&nbsp;</span>
590
+ <span class="cline-any cline-neutral">&nbsp;</span>
591
+ <span class="cline-any cline-neutral">&nbsp;</span>
592
+ <span class="cline-any cline-neutral">&nbsp;</span>
593
+ <span class="cline-any cline-neutral">&nbsp;</span>
594
+ <span class="cline-any cline-neutral">&nbsp;</span>
595
+ <span class="cline-any cline-neutral">&nbsp;</span>
596
+ <span class="cline-any cline-neutral">&nbsp;</span>
597
+ <span class="cline-any cline-neutral">&nbsp;</span>
598
+ <span class="cline-any cline-neutral">&nbsp;</span>
599
+ <span class="cline-any cline-neutral">&nbsp;</span>
600
+ <span class="cline-any cline-neutral">&nbsp;</span>
601
+ <span class="cline-any cline-neutral">&nbsp;</span>
602
+ <span class="cline-any cline-neutral">&nbsp;</span>
603
+ <span class="cline-any cline-neutral">&nbsp;</span>
604
+ <span class="cline-any cline-neutral">&nbsp;</span>
605
+ <span class="cline-any cline-neutral">&nbsp;</span>
606
+ <span class="cline-any cline-neutral">&nbsp;</span>
607
+ <span class="cline-any cline-neutral">&nbsp;</span>
608
+ <span class="cline-any cline-neutral">&nbsp;</span>
609
+ <span class="cline-any cline-yes">19x</span>
610
+ <span class="cline-any cline-yes">70x</span>
611
+ <span class="cline-any cline-neutral">&nbsp;</span>
612
+ <span class="cline-any cline-neutral">&nbsp;</span>
613
+ <span class="cline-any cline-neutral">&nbsp;</span>
614
+ <span class="cline-any cline-neutral">&nbsp;</span>
615
+ <span class="cline-any cline-yes">70x</span>
616
+ <span class="cline-any cline-neutral">&nbsp;</span>
617
+ <span class="cline-any cline-neutral">&nbsp;</span>
618
+ <span class="cline-any cline-yes">70x</span>
619
+ <span class="cline-any cline-neutral">&nbsp;</span>
620
+ <span class="cline-any cline-neutral">&nbsp;</span>
621
+ <span class="cline-any cline-neutral">&nbsp;</span>
622
+ <span class="cline-any cline-neutral">&nbsp;</span>
623
+ <span class="cline-any cline-neutral">&nbsp;</span>
624
+ <span class="cline-any cline-neutral">&nbsp;</span>
625
+ <span class="cline-any cline-yes">70x</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-yes">70x</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-yes">67x</span>
642
+ <span class="cline-any cline-yes">67x</span>
643
+ <span class="cline-any cline-yes">1x</span>
644
+ <span class="cline-any cline-yes">1x</span>
645
+ <span class="cline-any cline-neutral">&nbsp;</span>
646
+ <span class="cline-any cline-neutral">&nbsp;</span>
647
+ <span class="cline-any cline-yes">66x</span>
648
+ <span class="cline-any cline-yes">1x</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">65x</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-yes">65x</span>
656
+ <span class="cline-any cline-yes">14x</span>
657
+ <span class="cline-any cline-neutral">&nbsp;</span>
658
+ <span class="cline-any cline-neutral">&nbsp;</span>
659
+ <span class="cline-any cline-neutral">&nbsp;</span>
660
+ <span class="cline-any cline-yes">51x</span>
661
+ <span class="cline-any cline-neutral">&nbsp;</span>
662
+ <span class="cline-any cline-neutral">&nbsp;</span>
663
+ <span class="cline-any cline-neutral">&nbsp;</span>
664
+ <span class="cline-any cline-neutral">&nbsp;</span>
665
+ <span class="cline-any cline-neutral">&nbsp;</span>
666
+ <span class="cline-any cline-neutral">&nbsp;</span>
667
+ <span class="cline-any cline-neutral">&nbsp;</span>
668
+ <span class="cline-any cline-neutral">&nbsp;</span>
669
+ <span class="cline-any cline-neutral">&nbsp;</span>
670
+ <span class="cline-any cline-neutral">&nbsp;</span>
671
+ <span class="cline-any cline-neutral">&nbsp;</span>
672
+ <span class="cline-any cline-neutral">&nbsp;</span>
673
+ <span class="cline-any cline-neutral">&nbsp;</span>
674
+ <span class="cline-any cline-neutral">&nbsp;</span>
675
+ <span class="cline-any cline-neutral">&nbsp;</span>
676
+ <span class="cline-any cline-neutral">&nbsp;</span>
677
+ <span class="cline-any cline-yes">65x</span>
678
+ <span class="cline-any cline-neutral">&nbsp;</span>
679
+ <span class="cline-any cline-neutral">&nbsp;</span>
680
+ <span class="cline-any cline-yes">65x</span>
681
+ <span class="cline-any cline-neutral">&nbsp;</span>
682
+ <span class="cline-any cline-neutral">&nbsp;</span>
683
+ <span class="cline-any cline-neutral">&nbsp;</span>
684
+ <span class="cline-any cline-yes">65x</span>
685
+ <span class="cline-any cline-yes">487x</span>
686
+ <span class="cline-any cline-yes">487x</span>
687
+ <span class="cline-any cline-yes">134x</span>
688
+ <span class="cline-any cline-yes">138x</span>
689
+ <span class="cline-any cline-yes">138x</span>
690
+ <span class="cline-any cline-neutral">&nbsp;</span>
691
+ <span class="cline-any cline-neutral">&nbsp;</span>
692
+ <span class="cline-any cline-neutral">&nbsp;</span>
693
+ <span class="cline-any cline-yes">118x</span>
694
+ <span class="cline-any cline-neutral">&nbsp;</span>
695
+ <span class="cline-any cline-neutral">&nbsp;</span>
696
+ <span class="cline-any cline-neutral">&nbsp;</span>
697
+ <span class="cline-any cline-neutral">&nbsp;</span>
698
+ <span class="cline-any cline-neutral">&nbsp;</span>
699
+ <span class="cline-any cline-neutral">&nbsp;</span>
700
+ <span class="cline-any cline-neutral">&nbsp;</span>
701
+ <span class="cline-any cline-yes">65x</span>
702
+ <span class="cline-any cline-yes">65x</span>
703
+ <span class="cline-any cline-yes">487x</span>
704
+ <span class="cline-any cline-yes">487x</span>
705
+ <span class="cline-any cline-yes">138x</span>
706
+ <span class="cline-any cline-neutral">&nbsp;</span>
707
+ <span class="cline-any cline-neutral">&nbsp;</span>
708
+ <span class="cline-any cline-neutral">&nbsp;</span>
709
+ <span class="cline-any cline-neutral">&nbsp;</span>
710
+ <span class="cline-any cline-yes">65x</span>
711
+ <span class="cline-any cline-yes">487x</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-yes">487x</span>
715
+ <span class="cline-any cline-yes">138x</span>
716
+ <span class="cline-any cline-yes">138x</span>
717
+ <span class="cline-any cline-yes">57x</span>
718
+ <span class="cline-any cline-yes">57x</span>
719
+ <span class="cline-any cline-neutral">&nbsp;</span>
720
+ <span class="cline-any cline-yes">57x</span>
721
+ <span class="cline-any cline-yes">64x</span>
722
+ <span class="cline-any cline-yes">64x</span>
723
+ <span class="cline-any cline-yes">37x</span>
724
+ <span class="cline-any cline-neutral">&nbsp;</span>
725
+ <span class="cline-any cline-neutral">&nbsp;</span>
726
+ <span class="cline-any cline-neutral">&nbsp;</span>
727
+ <span class="cline-any cline-neutral">&nbsp;</span>
728
+ <span class="cline-any cline-neutral">&nbsp;</span>
729
+ <span class="cline-any cline-neutral">&nbsp;</span>
730
+ <span class="cline-any cline-neutral">&nbsp;</span>
731
+ <span class="cline-any cline-neutral">&nbsp;</span>
732
+ <span class="cline-any cline-neutral">&nbsp;</span>
733
+ <span class="cline-any cline-neutral">&nbsp;</span>
734
+ <span class="cline-any cline-yes">487x</span>
735
+ <span class="cline-any cline-yes">134x</span>
736
+ <span class="cline-any cline-yes">138x</span>
737
+ <span class="cline-any cline-yes">138x</span>
738
+ <span class="cline-any cline-neutral">&nbsp;</span>
739
+ <span class="cline-any cline-yes">138x</span>
740
+ <span class="cline-any cline-yes">61x</span>
741
+ <span class="cline-any cline-yes">61x</span>
742
+ <span class="cline-any cline-yes">60x</span>
743
+ <span class="cline-any cline-neutral">&nbsp;</span>
744
+ <span class="cline-any cline-yes">60x</span>
745
+ <span class="cline-any cline-yes">60x</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-neutral">&nbsp;</span>
749
+ <span class="cline-any cline-yes">30x</span>
750
+ <span class="cline-any cline-neutral">&nbsp;</span>
751
+ <span class="cline-any cline-neutral">&nbsp;</span>
752
+ <span class="cline-any cline-neutral">&nbsp;</span>
753
+ <span class="cline-any cline-neutral">&nbsp;</span>
754
+ <span class="cline-any cline-neutral">&nbsp;</span>
755
+ <span class="cline-any cline-neutral">&nbsp;</span>
756
+ <span class="cline-any cline-neutral">&nbsp;</span>
757
+ <span class="cline-any cline-neutral">&nbsp;</span>
758
+ <span class="cline-any cline-neutral">&nbsp;</span>
759
+ <span class="cline-any cline-neutral">&nbsp;</span>
760
+ <span class="cline-any cline-yes">65x</span>
761
+ <span class="cline-any cline-neutral">&nbsp;</span>
762
+ <span class="cline-any cline-neutral">&nbsp;</span>
763
+ <span class="cline-any cline-neutral">&nbsp;</span>
764
+ <span class="cline-any cline-neutral">&nbsp;</span>
765
+ <span class="cline-any cline-neutral">&nbsp;</span>
766
+ <span class="cline-any cline-neutral">&nbsp;</span>
767
+ <span class="cline-any cline-neutral">&nbsp;</span>
768
+ <span class="cline-any cline-neutral">&nbsp;</span>
769
+ <span class="cline-any cline-neutral">&nbsp;</span>
770
+ <span class="cline-any cline-neutral">&nbsp;</span>
771
+ <span class="cline-any cline-neutral">&nbsp;</span>
772
+ <span class="cline-any cline-neutral">&nbsp;</span>
773
+ <span class="cline-any cline-yes">51x</span>
774
+ <span class="cline-any cline-yes">51x</span>
775
+ <span class="cline-any cline-yes">426x</span>
776
+ <span class="cline-any cline-yes">426x</span>
777
+ <span class="cline-any cline-yes">119x</span>
778
+ <span class="cline-any cline-yes">123x</span>
779
+ <span class="cline-any cline-yes">55x</span>
780
+ <span class="cline-any cline-neutral">&nbsp;</span>
781
+ <span class="cline-any cline-neutral">&nbsp;</span>
782
+ <span class="cline-any cline-neutral">&nbsp;</span>
783
+ <span class="cline-any cline-neutral">&nbsp;</span>
784
+ <span class="cline-any cline-neutral">&nbsp;</span>
785
+ <span class="cline-any cline-neutral">&nbsp;</span>
786
+ <span class="cline-any cline-yes">51x</span>
787
+ <span class="cline-any cline-yes">51x</span>
788
+ <span class="cline-any cline-yes">426x</span>
789
+ <span class="cline-any cline-yes">426x</span>
790
+ <span class="cline-any cline-yes">122x</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">51x</span>
795
+ <span class="cline-any cline-yes">51x</span>
796
+ <span class="cline-any cline-neutral">&nbsp;</span>
797
+ <span class="cline-any cline-yes">51x</span>
798
+ <span class="cline-any cline-neutral">&nbsp;</span>
799
+ <span class="cline-any cline-yes">426x</span>
800
+ <span class="cline-any cline-yes">122x</span>
801
+ <span class="cline-any cline-yes">122x</span>
802
+ <span class="cline-any cline-yes">55x</span>
803
+ <span class="cline-any cline-yes">55x</span>
804
+ <span class="cline-any cline-neutral">&nbsp;</span>
805
+ <span class="cline-any cline-yes">55x</span>
806
+ <span class="cline-any cline-neutral">&nbsp;</span>
807
+ <span class="cline-any cline-neutral">&nbsp;</span>
808
+ <span class="cline-any cline-neutral">&nbsp;</span>
809
+ <span class="cline-any cline-yes">54x</span>
810
+ <span class="cline-any cline-neutral">&nbsp;</span>
811
+ <span class="cline-any cline-yes">54x</span>
812
+ <span class="cline-any cline-yes">64x</span>
813
+ <span class="cline-any cline-yes">64x</span>
814
+ <span class="cline-any cline-neutral">&nbsp;</span>
815
+ <span class="cline-any cline-yes">64x</span>
816
+ <span class="cline-any cline-yes">28x</span>
817
+ <span class="cline-any cline-neutral">&nbsp;</span>
818
+ <span class="cline-any cline-neutral">&nbsp;</span>
819
+ <span class="cline-any cline-neutral">&nbsp;</span>
820
+ <span class="cline-any cline-neutral">&nbsp;</span>
821
+ <span class="cline-any cline-neutral">&nbsp;</span>
822
+ <span class="cline-any cline-neutral">&nbsp;</span>
823
+ <span class="cline-any cline-yes">54x</span>
824
+ <span class="cline-any cline-yes">26x</span>
825
+ <span class="cline-any cline-yes">26x</span>
826
+ <span class="cline-any cline-neutral">&nbsp;</span>
827
+ <span class="cline-any cline-neutral">&nbsp;</span>
828
+ <span class="cline-any cline-neutral">&nbsp;</span>
829
+ <span class="cline-any cline-neutral">&nbsp;</span>
830
+ <span class="cline-any cline-neutral">&nbsp;</span>
831
+ <span class="cline-any cline-neutral">&nbsp;</span>
832
+ <span class="cline-any cline-yes">400x</span>
833
+ <span class="cline-any cline-yes">119x</span>
834
+ <span class="cline-any cline-yes">119x</span>
835
+ <span class="cline-any cline-yes">123x</span>
836
+ <span class="cline-any cline-neutral">&nbsp;</span>
837
+ <span class="cline-any cline-neutral">&nbsp;</span>
838
+ <span class="cline-any cline-yes">123x</span>
839
+ <span class="cline-any cline-yes">73x</span>
840
+ <span class="cline-any cline-neutral">&nbsp;</span>
841
+ <span class="cline-any cline-neutral">&nbsp;</span>
842
+ <span class="cline-any cline-yes">50x</span>
843
+ <span class="cline-any cline-yes">50x</span>
844
+ <span class="cline-any cline-no">&nbsp;</span>
845
+ <span class="cline-any cline-neutral">&nbsp;</span>
846
+ <span class="cline-any cline-neutral">&nbsp;</span>
847
+ <span class="cline-any cline-yes">50x</span>
848
+ <span class="cline-any cline-yes">50x</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-yes">50x</span>
852
+ <span class="cline-any cline-neutral">&nbsp;</span>
853
+ <span class="cline-any cline-yes">50x</span>
854
+ <span class="cline-any cline-yes">27x</span>
855
+ <span class="cline-any cline-yes">27x</span>
856
+ <span class="cline-any cline-yes">27x</span>
857
+ <span class="cline-any cline-neutral">&nbsp;</span>
858
+ <span class="cline-any cline-neutral">&nbsp;</span>
859
+ <span class="cline-any cline-neutral">&nbsp;</span>
860
+ <span class="cline-any cline-neutral">&nbsp;</span>
861
+ <span class="cline-any cline-neutral">&nbsp;</span>
862
+ <span class="cline-any cline-neutral">&nbsp;</span>
863
+ <span class="cline-any cline-yes">23x</span>
864
+ <span class="cline-any cline-neutral">&nbsp;</span>
865
+ <span class="cline-any cline-neutral">&nbsp;</span>
866
+ <span class="cline-any cline-yes">119x</span>
867
+ <span class="cline-any cline-yes">27x</span>
868
+ <span class="cline-any cline-neutral">&nbsp;</span>
869
+ <span class="cline-any cline-neutral">&nbsp;</span>
870
+ <span class="cline-any cline-neutral">&nbsp;</span>
871
+ <span class="cline-any cline-neutral">&nbsp;</span>
872
+ <span class="cline-any cline-neutral">&nbsp;</span>
873
+ <span class="cline-any cline-neutral">&nbsp;</span>
874
+ <span class="cline-any cline-yes">373x</span>
875
+ <span class="cline-any cline-neutral">&nbsp;</span>
876
+ <span class="cline-any cline-neutral">&nbsp;</span>
877
+ <span class="cline-any cline-yes">51x</span>
878
+ <span class="cline-any cline-yes">39x</span>
879
+ <span class="cline-any cline-yes">39x</span>
880
+ <span class="cline-any cline-yes">23x</span>
881
+ <span class="cline-any cline-neutral">&nbsp;</span>
882
+ <span class="cline-any cline-yes">39x</span>
883
+ <span class="cline-any cline-yes">19x</span>
884
+ <span class="cline-any cline-neutral">&nbsp;</span>
885
+ <span class="cline-any cline-yes">39x</span>
886
+ <span class="cline-any cline-neutral">&nbsp;</span>
887
+ <span class="cline-any cline-neutral">&nbsp;</span>
888
+ <span class="cline-any cline-yes">51x</span>
889
+ <span class="cline-any cline-neutral">&nbsp;</span>
890
+ <span class="cline-any cline-neutral">&nbsp;</span>
891
+ <span class="cline-any cline-neutral">&nbsp;</span>
892
+ <span class="cline-any cline-neutral">&nbsp;</span>
893
+ <span class="cline-any cline-neutral">&nbsp;</span>
894
+ <span class="cline-any cline-neutral">&nbsp;</span>
895
+ <span class="cline-any cline-neutral">&nbsp;</span>
896
+ <span class="cline-any cline-neutral">&nbsp;</span>
897
+ <span class="cline-any cline-yes">219x</span>
898
+ <span class="cline-any cline-neutral">&nbsp;</span>
899
+ <span class="cline-any cline-neutral">&nbsp;</span>
900
+ <span class="cline-any cline-neutral">&nbsp;</span>
901
+ <span class="cline-any cline-neutral">&nbsp;</span>
902
+ <span class="cline-any cline-neutral">&nbsp;</span>
903
+ <span class="cline-any cline-neutral">&nbsp;</span>
904
+ <span class="cline-any cline-neutral">&nbsp;</span>
905
+ <span class="cline-any cline-neutral">&nbsp;</span>
906
+ <span class="cline-any cline-yes">123x</span>
907
+ <span class="cline-any cline-neutral">&nbsp;</span>
908
+ <span class="cline-any cline-neutral">&nbsp;</span>
909
+ <span class="cline-any cline-neutral">&nbsp;</span>
910
+ <span class="cline-any cline-neutral">&nbsp;</span>
911
+ <span class="cline-any cline-neutral">&nbsp;</span>
912
+ <span class="cline-any cline-neutral">&nbsp;</span>
913
+ <span class="cline-any cline-yes">111x</span>
914
+ <span class="cline-any cline-yes">111x</span>
915
+ <span class="cline-any cline-neutral">&nbsp;</span>
916
+ <span class="cline-any cline-neutral">&nbsp;</span>
917
+ <span class="cline-any cline-yes">111x</span>
918
+ <span class="cline-any cline-yes">111x</span>
919
+ <span class="cline-any cline-yes">4x</span>
920
+ <span class="cline-any cline-yes">4x</span>
921
+ <span class="cline-any cline-neutral">&nbsp;</span>
922
+ <span class="cline-any cline-no">&nbsp;</span>
923
+ <span class="cline-any cline-neutral">&nbsp;</span>
924
+ <span class="cline-any cline-neutral">&nbsp;</span>
925
+ <span class="cline-any cline-neutral">&nbsp;</span>
926
+ <span class="cline-any cline-yes">111x</span>
927
+ <span class="cline-any cline-neutral">&nbsp;</span>
928
+ <span class="cline-any cline-neutral">&nbsp;</span>
929
+ <span class="cline-any cline-neutral">&nbsp;</span>
930
+ <span class="cline-any cline-neutral">&nbsp;</span>
931
+ <span class="cline-any cline-neutral">&nbsp;</span>
932
+ <span class="cline-any cline-neutral">&nbsp;</span>
933
+ <span class="cline-any cline-neutral">&nbsp;</span>
934
+ <span class="cline-any cline-neutral">&nbsp;</span>
935
+ <span class="cline-any cline-neutral">&nbsp;</span>
936
+ <span class="cline-any cline-neutral">&nbsp;</span>
937
+ <span class="cline-any cline-yes">27x</span>
938
+ <span class="cline-any cline-yes">27x</span>
939
+ <span class="cline-any cline-neutral">&nbsp;</span>
940
+ <span class="cline-any cline-yes">27x</span>
941
+ <span class="cline-any cline-yes">1x</span>
942
+ <span class="cline-any cline-yes">1x</span>
943
+ <span class="cline-any cline-neutral">&nbsp;</span>
944
+ <span class="cline-any cline-no">&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">27x</span>
949
+ <span class="cline-any cline-neutral">&nbsp;</span>
950
+ <span class="cline-any cline-neutral">&nbsp;</span>
951
+ <span class="cline-any cline-neutral">&nbsp;</span>
952
+ <span class="cline-any cline-neutral">&nbsp;</span>
953
+ <span class="cline-any cline-yes">27x</span>
954
+ <span class="cline-any cline-neutral">&nbsp;</span>
955
+ <span class="cline-any cline-neutral">&nbsp;</span>
956
+ <span class="cline-any cline-neutral">&nbsp;</span>
957
+ <span class="cline-any cline-neutral">&nbsp;</span>
958
+ <span class="cline-any cline-neutral">&nbsp;</span>
959
+ <span class="cline-any cline-neutral">&nbsp;</span>
960
+ <span class="cline-any cline-neutral">&nbsp;</span>
961
+ <span class="cline-any cline-neutral">&nbsp;</span>
962
+ <span class="cline-any cline-neutral">&nbsp;</span>
963
+ <span class="cline-any cline-neutral">&nbsp;</span>
964
+ <span class="cline-any cline-neutral">&nbsp;</span>
965
+ <span class="cline-any cline-neutral">&nbsp;</span>
966
+ <span class="cline-any cline-neutral">&nbsp;</span>
967
+ <span class="cline-any cline-neutral">&nbsp;</span>
968
+ <span class="cline-any cline-neutral">&nbsp;</span>
969
+ <span class="cline-any cline-neutral">&nbsp;</span>
970
+ <span class="cline-any cline-neutral">&nbsp;</span>
971
+ <span class="cline-any cline-neutral">&nbsp;</span>
972
+ <span class="cline-any cline-yes">112x</span>
973
+ <span class="cline-any cline-neutral">&nbsp;</span>
974
+ <span class="cline-any cline-neutral">&nbsp;</span>
975
+ <span class="cline-any cline-neutral">&nbsp;</span>
976
+ <span class="cline-any cline-yes">112x</span>
977
+ <span class="cline-any cline-neutral">&nbsp;</span>
978
+ <span class="cline-any cline-yes">112x</span>
979
+ <span class="cline-any cline-yes">128x</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-yes">112x</span>
983
+ <span class="cline-any cline-neutral">&nbsp;</span>
984
+ <span class="cline-any cline-neutral">&nbsp;</span>
985
+ <span class="cline-any cline-neutral">&nbsp;</span>
986
+ <span class="cline-any cline-neutral">&nbsp;</span>
987
+ <span class="cline-any cline-neutral">&nbsp;</span>
988
+ <span class="cline-any cline-neutral">&nbsp;</span>
989
+ <span class="cline-any cline-neutral">&nbsp;</span>
990
+ <span class="cline-any cline-neutral">&nbsp;</span>
991
+ <span class="cline-any cline-neutral">&nbsp;</span>
992
+ <span class="cline-any cline-neutral">&nbsp;</span>
993
+ <span class="cline-any cline-neutral">&nbsp;</span>
994
+ <span class="cline-any cline-yes">301x</span>
995
+ <span class="cline-any cline-neutral">&nbsp;</span>
996
+ <span class="cline-any cline-yes">301x</span>
997
+ <span class="cline-any cline-yes">301x</span>
998
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
1002
+ <span class="cline-any cline-neutral">&nbsp;</span>
1003
+ <span class="cline-any cline-neutral">&nbsp;</span>
1004
+ <span class="cline-any cline-neutral">&nbsp;</span>
1005
+ <span class="cline-any cline-neutral">&nbsp;</span>
1006
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
1010
+ <span class="cline-any cline-yes">26x</span>
1011
+ <span class="cline-any cline-neutral">&nbsp;</span>
1012
+ <span class="cline-any cline-neutral">&nbsp;</span>
1013
+ <span class="cline-any cline-yes">26x</span>
1014
+ <span class="cline-any cline-neutral">&nbsp;</span>
1015
+ <span class="cline-any cline-yes">26x</span>
1016
+ <span class="cline-any cline-yes">35x</span>
1017
+ <span class="cline-any cline-neutral">&nbsp;</span>
1018
+ <span class="cline-any cline-neutral">&nbsp;</span>
1019
+ <span class="cline-any cline-yes">35x</span>
1020
+ <span class="cline-any cline-yes">35x</span>
1021
+ <span class="cline-any cline-neutral">&nbsp;</span>
1022
+ <span class="cline-any cline-no">&nbsp;</span>
1023
+ <span class="cline-any cline-no">&nbsp;</span>
1024
+ <span class="cline-any cline-no">&nbsp;</span>
1025
+ <span class="cline-any cline-neutral">&nbsp;</span>
1026
+ <span class="cline-any cline-no">&nbsp;</span>
1027
+ <span class="cline-any cline-neutral">&nbsp;</span>
1028
+ <span class="cline-any cline-neutral">&nbsp;</span>
1029
+ <span class="cline-any cline-yes">35x</span>
1030
+ <span class="cline-any cline-yes">35x</span>
1031
+ <span class="cline-any cline-neutral">&nbsp;</span>
1032
+ <span class="cline-any cline-yes">35x</span>
1033
+ <span class="cline-any cline-yes">35x</span>
1034
+ <span class="cline-any cline-neutral">&nbsp;</span>
1035
+ <span class="cline-any cline-neutral">&nbsp;</span>
1036
+ <span class="cline-any cline-neutral">&nbsp;</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-yes">26x</span>
1041
+ <span class="cline-any cline-neutral">&nbsp;</span>
1042
+ <span class="cline-any cline-neutral">&nbsp;</span>
1043
+ <span class="cline-any cline-neutral">&nbsp;</span>
1044
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
1049
+ <span class="cline-any cline-neutral">&nbsp;</span>
1050
+ <span class="cline-any cline-neutral">&nbsp;</span>
1051
+ <span class="cline-any cline-neutral">&nbsp;</span>
1052
+ <span class="cline-any cline-neutral">&nbsp;</span>
1053
+ <span class="cline-any cline-neutral">&nbsp;</span>
1054
+ <span class="cline-any cline-neutral">&nbsp;</span>
1055
+ <span class="cline-any cline-yes">26x</span>
1056
+ <span class="cline-any cline-yes">26x</span>
1057
+ <span class="cline-any cline-neutral">&nbsp;</span>
1058
+ <span class="cline-any cline-neutral">&nbsp;</span>
1059
+ <span class="cline-any cline-yes">26x</span>
1060
+ <span class="cline-any cline-yes">26x</span>
1061
+ <span class="cline-any cline-yes">28x</span>
1062
+ <span class="cline-any cline-neutral">&nbsp;</span>
1063
+ <span class="cline-any cline-neutral">&nbsp;</span>
1064
+ <span class="cline-any cline-yes">26x</span>
1065
+ <span class="cline-any cline-neutral">&nbsp;</span>
1066
+ <span class="cline-any cline-yes">26x</span>
1067
+ <span class="cline-any cline-neutral">&nbsp;</span>
1068
+ <span class="cline-any cline-yes">26x</span>
1069
+ <span class="cline-any cline-yes">35x</span>
1070
+ <span class="cline-any cline-neutral">&nbsp;</span>
1071
+ <span class="cline-any cline-yes">35x</span>
1072
+ <span class="cline-any cline-yes">28x</span>
1073
+ <span class="cline-any cline-neutral">&nbsp;</span>
1074
+ <span class="cline-any cline-yes">28x</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">7x</span>
1080
+ <span class="cline-any cline-neutral">&nbsp;</span>
1081
+ <span class="cline-any cline-neutral">&nbsp;</span>
1082
+ <span class="cline-any cline-neutral">&nbsp;</span>
1083
+ <span class="cline-any cline-neutral">&nbsp;</span>
1084
+ <span class="cline-any cline-yes">26x</span>
1085
+ <span class="cline-any cline-neutral">&nbsp;</span>
1086
+ <span class="cline-any cline-no">&nbsp;</span>
1087
+ <span class="cline-any cline-neutral">&nbsp;</span>
1088
+ <span class="cline-any cline-neutral">&nbsp;</span>
1089
+ <span class="cline-any cline-no">&nbsp;</span>
1090
+ <span class="cline-any cline-no">&nbsp;</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-neutral">&nbsp;</span>
1094
+ <span class="cline-any cline-neutral">&nbsp;</span>
1095
+ <span class="cline-any cline-neutral">&nbsp;</span>
1096
+ <span class="cline-any cline-neutral">&nbsp;</span>
1097
+ <span class="cline-any cline-neutral">&nbsp;</span>
1098
+ <span class="cline-any cline-neutral">&nbsp;</span>
1099
+ <span class="cline-any cline-neutral">&nbsp;</span>
1100
+ <span class="cline-any cline-yes">26x</span>
1101
+ <span class="cline-any cline-neutral">&nbsp;</span>
1102
+ <span class="cline-any cline-neutral">&nbsp;</span>
1103
+ <span class="cline-any cline-neutral">&nbsp;</span>
1104
+ <span class="cline-any cline-neutral">&nbsp;</span>
1105
+ <span class="cline-any cline-neutral">&nbsp;</span>
1106
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Injectable, Logger } from '@nestjs/common';
1107
+ import { LlmContent } from '../llm-provider/llm-provider.interface';
1108
+ import { ApplicationStateService } from '../application-state/application-state.service';
1109
+ &nbsp;
1110
+ interface FileVersionInfo {
1111
+ latestIndex: number;
1112
+ latestToolName: string;
1113
+ }
1114
+ &nbsp;
1115
+ /**
1116
+ * Service that compresses chat history by redacting older file contents
1117
+ * when the same file is referenced multiple times across ANY in-scope tool.
1118
+ *
1119
+ * In-scope tools (Level 2):
1120
+ * - request_context tool results (file content in output)
1121
+ * - create_file/overwrite_file tool call arguments (file content in input)
1122
+ * - delete_file tool call arguments (invalidates all prior file content)
1123
+ *
1124
+ * The unified index ensures cross-tool redaction: e.g., if a file is read
1125
+ * via request_context and then overwritten via overwrite_file, the older
1126
+ * request_context result is redacted.
1127
+ */
1128
+ @Injectable()
1129
+ export class HistoryCompressionService {
1130
+ private readonly logger = new Logger(HistoryCompressionService.name);
1131
+ &nbsp;
1132
+ // Regex to detect file markers in request_context output
1133
+ // Format: "// File: ./path/to/file.ts" or "// File: path/to/file.ts"
1134
+ // Captures the path after "File: " (including optional ./)
1135
+ private readonly FILE_MARKER_REGEX = /\/\/ File: (\.?[^\n]+)/g;
1136
+ &nbsp;
1137
+ // Tools that carry file content and participate in the unified version index
1138
+ private readonly FILE_CONTENT_TOOLS = [
1139
+ 'create_file',
1140
+ 'overwrite_file',
1141
+ 'delete_file',
1142
+ ];
1143
+ &nbsp;
1144
+ // Tools that have content that can be redacted in their arguments
1145
+ private readonly FILE_WRITE_TOOLS = ['create_file', 'overwrite_file'];
1146
+ &nbsp;
1147
+ constructor(
1148
+ private readonly applicationStateService: ApplicationStateService,
1149
+ ) {}
1150
+ &nbsp;
1151
+ /**
1152
+ * Compresses history by redacting older file contents using a unified
1153
+ * file version index across all in-scope tools.
1154
+ *
1155
+ * @param history The chat history to compress
1156
+ * @returns Compressed history with older file contents redacted
1157
+ */
1158
+ async compress(history: LlmContent[]): Promise&lt;LlmContent[]&gt; {
1159
+ // Check if compression is enabled
1160
+ const enabled =
1161
+ await this.applicationStateService.getHistoryCompressionEnabled();
1162
+ if (!enabled) {
1163
+ this.logger.debug('History compression is disabled');
1164
+ return history;
1165
+ }
1166
+ &nbsp;
1167
+ if (history.length === 0) {
1168
+ return history;
1169
+ }
1170
+ &nbsp;
1171
+ // Build unified file version index across all in-scope tools
1172
+ const fileIndex = this.buildUnifiedFileIndex(history);
1173
+ &nbsp;
1174
+ // If no files were found, return original history
1175
+ if (fileIndex.size === 0) {
1176
+ return history;
1177
+ }
1178
+ &nbsp;
1179
+ // Redact based on the unified index
1180
+ return this.redactBasedOnIndex(history, fileIndex);
1181
+ }
1182
+ &nbsp;
1183
+ /**
1184
+ * Builds a unified file version index by scanning ALL in-scope tools.
1185
+ *
1186
+ * Uses tool result indices for ordering so that comparisons between
1187
+ * request_context results and file-content tool calls are on equal footing.
1188
+ * For file-content tools (create_file/overwrite_file/delete_file), the
1189
+ * effective index is the index of their tool result, not the model turn.
1190
+ *
1191
+ * @param history The chat history to scan
1192
+ * @returns Map of normalized file path -&gt; {latestIndex, latestToolName}
1193
+ */
1194
+ private buildUnifiedFileIndex(
1195
+ history: LlmContent[],
1196
+ ): Map&lt;string, FileVersionInfo&gt; {
1197
+ const fileIndex = new Map&lt;string, FileVersionInfo&gt;();
1198
+ &nbsp;
1199
+ // Build tool_call_id -&gt; {historyIndex, toolName} for all in-scope tools
1200
+ const toolCallInfo = new Map&lt;
1201
+ string,
1202
+ { historyIndex: number; toolName: string }
1203
+ &gt;();
1204
+ for (let i = 0; i &lt; history.length; i++) {
1205
+ const turn = history[i];
1206
+ if (turn.role === 'model' &amp;&amp; turn.tool_calls) {
1207
+ for (const tc of turn.tool_calls) {
1208
+ const toolName = tc.function?.name;
1209
+ if (
1210
+ toolName === 'request_context' ||
1211
+ this.isFileContentTool(toolName)
1212
+ ) {
1213
+ toolCallInfo.set(tc.id, { historyIndex: i, toolName });
1214
+ }
1215
+ }
1216
+ }
1217
+ }
1218
+ &nbsp;
1219
+ // Build tool_call_id -&gt; tool result index mapping
1220
+ // Used to get effective indices for file content tools
1221
+ const toolResultIndex = new Map&lt;string, number&gt;();
1222
+ for (let i = 0; i &lt; history.length; i++) {
1223
+ const turn = history[i];
1224
+ if (turn.role === 'tool' &amp;&amp; turn.tool_call_id) {
1225
+ toolResultIndex.set(turn.tool_call_id, i);
1226
+ }
1227
+ }
1228
+ &nbsp;
1229
+ // Reverse pass: build unified index
1230
+ for (let i = history.length - 1; i &gt;= 0; i--) {
1231
+ const turn = history[i];
1232
+ &nbsp;
1233
+ // Case 1: tool result from request_context
1234
+ if (turn.role === 'tool' &amp;&amp; turn.tool_call_id) {
1235
+ const info = toolCallInfo.get(turn.tool_call_id);
1236
+ if (info &amp;&amp; info.toolName === 'request_context') {
1237
+ const text = turn.parts.map((p) =&gt; p.text).join('');
1238
+ const filePaths = this.extractFilePaths(text);
1239
+ &nbsp;
1240
+ for (const filePath of filePaths) {
1241
+ const normalized = this.normalizePath(filePath);
1242
+ if (!fileIndex.has(normalized)) {
1243
+ fileIndex.set(normalized, {
1244
+ latestIndex: i,
1245
+ latestToolName: 'request_context',
1246
+ });
1247
+ }
1248
+ }
1249
+ }
1250
+ }
1251
+ &nbsp;
1252
+ // Case 2: model turn with in-scope file tool calls
1253
+ // Use tool result index as effective index for proper ordering
1254
+ if (turn.role === 'model' &amp;&amp; turn.tool_calls) {
1255
+ for (let j = turn.tool_calls.length - 1; j &gt;= 0; j--) {
1256
+ const tc = turn.tool_calls[j];
1257
+ const toolName = tc.function?.name;
1258
+ &nbsp;
1259
+ if (this.isFileContentTool(toolName)) {
1260
+ const filePath = this.extractFilePathFromToolCall(tc);
1261
+ if (filePath) {
1262
+ const normalized = this.normalizePath(filePath);
1263
+ // Use tool result index as effective index for consistent ordering
1264
+ const effectiveIndex = toolResultIndex.get(tc.id) ?? <span class="branch-1 cbranch-no" title="branch not covered" >i;</span>
1265
+ if (
1266
+ !fileIndex.has(normalized) ||
1267
+ effectiveIndex &gt; fileIndex.get(normalized)!.latestIndex
1268
+ ) {
1269
+ fileIndex.set(normalized, {
1270
+ latestIndex: effectiveIndex,
1271
+ latestToolName: toolName!,
1272
+ });
1273
+ }
1274
+ }
1275
+ }
1276
+ }
1277
+ }
1278
+ }
1279
+ &nbsp;
1280
+ return fileIndex;
1281
+ }
1282
+ &nbsp;
1283
+ /**
1284
+ * Redacts file content in history based on the unified file version index.
1285
+ * Handles both request_context tool results and file-content tool call arguments.
1286
+ * Skips delete_file from redaction (no content to redact).
1287
+ */
1288
+ private redactBasedOnIndex(
1289
+ history: LlmContent[],
1290
+ fileIndex: Map&lt;string, FileVersionInfo&gt;,
1291
+ ): LlmContent[] {
1292
+ // Build tool_call_id -&gt; model turn index for request_context identification
1293
+ const toolCallToIndex = new Map&lt;string, number&gt;();
1294
+ for (let i = 0; i &lt; history.length; i++) {
1295
+ const turn = history[i];
1296
+ if (turn.role === 'model' &amp;&amp; turn.tool_calls) {
1297
+ for (const tc of turn.tool_calls) {
1298
+ if (tc.function?.name === 'request_context') {
1299
+ toolCallToIndex.set(tc.id, i);
1300
+ }
1301
+ }
1302
+ }
1303
+ }
1304
+ &nbsp;
1305
+ // Build tool_call_id -&gt; tool result index for effective index calculation
1306
+ const toolResultIndex = new Map&lt;string, number&gt;();
1307
+ for (let i = 0; i &lt; history.length; i++) {
1308
+ const turn = history[i];
1309
+ if (turn.role === 'tool' &amp;&amp; turn.tool_call_id) {
1310
+ toolResultIndex.set(turn.tool_call_id, i);
1311
+ }
1312
+ }
1313
+ &nbsp;
1314
+ let redactedResults = 0;
1315
+ let redactedToolCalls = 0;
1316
+ &nbsp;
1317
+ const result = history.map((turn, index) =&gt; {
1318
+ // Redact request_context tool results
1319
+ if (turn.role === 'tool' &amp;&amp; turn.tool_call_id) {
1320
+ const modelTurnIndex = toolCallToIndex.get(turn.tool_call_id);
1321
+ if (modelTurnIndex !== undefined) {
1322
+ const text = turn.parts.map((p) =&gt; p.text).join('');
1323
+ const filePaths = this.extractFilePaths(text);
1324
+ &nbsp;
1325
+ if (filePaths.length &gt; 0) {
1326
+ const filesToRedact: {
1327
+ filePath: string;
1328
+ latestToolName: string;
1329
+ }[] = [];
1330
+ &nbsp;
1331
+ for (const filePath of filePaths) {
1332
+ const normalized = this.normalizePath(filePath);
1333
+ const versionInfo = fileIndex.get(normalized);
1334
+ &nbsp;
1335
+ if (versionInfo &amp;&amp; versionInfo.latestIndex &gt; index) {
1336
+ filesToRedact.push({
1337
+ filePath,
1338
+ latestToolName: versionInfo.latestToolName,
1339
+ });
1340
+ }
1341
+ }
1342
+ &nbsp;
1343
+ if (filesToRedact.length &gt; 0) {
1344
+ redactedResults++;
1345
+ return this.redactToolResult(turn, filesToRedact);
1346
+ }
1347
+ }
1348
+ }
1349
+ }
1350
+ &nbsp;
1351
+ // Redact file-write tool call arguments (NOT delete_file - no content to redact)
1352
+ if (turn.role === 'model' &amp;&amp; turn.tool_calls) {
1353
+ let hasRedaction = false;
1354
+ const newToolCalls = turn.tool_calls.map((tc) =&gt; {
1355
+ const toolName = tc.function?.name;
1356
+ &nbsp;
1357
+ // Skip tools that don't have content to redact
1358
+ if (!this.isFileWriteTool(toolName)) {
1359
+ return tc;
1360
+ }
1361
+ &nbsp;
1362
+ const filePath = this.extractFilePathFromToolCall(tc);
1363
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!filePath) {
1364
+ <span class="cstat-no" title="statement not covered" > return tc;</span>
1365
+ }
1366
+ &nbsp;
1367
+ const normalized = this.normalizePath(filePath);
1368
+ const versionInfo = fileIndex.get(normalized);
1369
+ &nbsp;
1370
+ // Use effective index (tool result index) for comparison
1371
+ const effectiveIndex = toolResultIndex.get(tc.id) ?? <span class="branch-1 cbranch-no" title="branch not covered" >index;</span>
1372
+ &nbsp;
1373
+ if (versionInfo &amp;&amp; versionInfo.latestIndex &gt; effectiveIndex) {
1374
+ hasRedaction = true;
1375
+ redactedToolCalls++;
1376
+ return this.redactToolCallContent(
1377
+ tc,
1378
+ filePath,
1379
+ versionInfo.latestToolName,
1380
+ );
1381
+ }
1382
+ &nbsp;
1383
+ return tc;
1384
+ });
1385
+ &nbsp;
1386
+ if (hasRedaction) {
1387
+ return {
1388
+ ...turn,
1389
+ tool_calls: newToolCalls,
1390
+ };
1391
+ }
1392
+ }
1393
+ &nbsp;
1394
+ return turn;
1395
+ });
1396
+ &nbsp;
1397
+ if (redactedResults &gt; 0 || redactedToolCalls &gt; 0) {
1398
+ const parts: string[] = [];
1399
+ if (redactedResults &gt; 0) {
1400
+ parts.push(`${redactedResults} older tool result(s)`);
1401
+ }
1402
+ if (redactedToolCalls &gt; 0) {
1403
+ parts.push(`${redactedToolCalls} older tool call(s)`);
1404
+ }
1405
+ this.logger.log(`Compressed history: redacted ${parts.join(' and ')}`);
1406
+ }
1407
+ &nbsp;
1408
+ return result;
1409
+ }
1410
+ &nbsp;
1411
+ /**
1412
+ * Checks if a tool name is a file content tool in scope for compression.
1413
+ * Includes create_file, overwrite_file, and delete_file.
1414
+ * Used for index building.
1415
+ */
1416
+ private isFileContentTool(toolName: string | undefined): boolean {
1417
+ return !!toolName &amp;&amp; this.FILE_CONTENT_TOOLS.includes(toolName);
1418
+ }
1419
+ &nbsp;
1420
+ /**
1421
+ * Checks if a tool name is a file write tool with content to redact.
1422
+ * Includes create_file and overwrite_file (NOT delete_file).
1423
+ * Used for redaction.
1424
+ */
1425
+ private isFileWriteTool(toolName: string | undefined): boolean {
1426
+ return !!toolName &amp;&amp; this.FILE_WRITE_TOOLS.includes(toolName);
1427
+ }
1428
+ &nbsp;
1429
+ /**
1430
+ * Extracts file_path from a tool call's arguments.
1431
+ */
1432
+ private extractFilePathFromToolCall(toolCall: any): string | null {
1433
+ const args = toolCall.function?.arguments;
1434
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!args) <span class="cstat-no" title="statement not covered" >return null;</span>
1435
+ &nbsp;
1436
+ // Arguments might be a string (JSON) or an object
1437
+ let parsedArgs = args;
1438
+ if (typeof args === 'string') {
1439
+ try {
1440
+ parsedArgs = JSON.parse(args);
1441
+ } catch {
1442
+ <span class="cstat-no" title="statement not covered" > return null;</span>
1443
+ }
1444
+ }
1445
+ &nbsp;
1446
+ return parsedArgs.file_path || null;
1447
+ }
1448
+ &nbsp;
1449
+ /**
1450
+ * Redacts the content in a tool call's arguments.
1451
+ */
1452
+ private redactToolCallContent(
1453
+ toolCall: any,
1454
+ filePath: string,
1455
+ latestToolName: string,
1456
+ ): any {
1457
+ const args = toolCall.function?.arguments;
1458
+ let parsedArgs = args;
1459
+ &nbsp;
1460
+ if (typeof args === 'string') {
1461
+ try {
1462
+ parsedArgs = JSON.parse(args);
1463
+ } catch {
1464
+ <span class="cstat-no" title="statement not covered" > return toolCall;</span>
1465
+ }
1466
+ }
1467
+ &nbsp;
1468
+ const redactedArgs = {
1469
+ ...parsedArgs,
1470
+ content: `[Content for ${filePath} redacted - see newer ${latestToolName} for this file]`,
1471
+ };
1472
+ &nbsp;
1473
+ return {
1474
+ ...toolCall,
1475
+ function: {
1476
+ ...toolCall.function,
1477
+ arguments:
1478
+ typeof args === 'string'
1479
+ ? JSON.stringify(redactedArgs)
1480
+ : redactedArgs,
1481
+ },
1482
+ };
1483
+ }
1484
+ &nbsp;
1485
+ /**
1486
+ * Extracts file paths from request_context output.
1487
+ *
1488
+ * @param text The tool result text
1489
+ * @returns Array of file paths found in the output
1490
+ */
1491
+ private extractFilePaths(text: string): string[] {
1492
+ const paths: string[] = [];
1493
+ let match;
1494
+ &nbsp;
1495
+ // Reset regex state
1496
+ this.FILE_MARKER_REGEX.lastIndex = 0;
1497
+ &nbsp;
1498
+ while ((match = this.FILE_MARKER_REGEX.exec(text)) !== null) {
1499
+ paths.push(match[1]);
1500
+ }
1501
+ &nbsp;
1502
+ return paths;
1503
+ }
1504
+ &nbsp;
1505
+ /**
1506
+ * Normalizes a file path for comparison.
1507
+ * Removes leading "./" and trailing slashes.
1508
+ *
1509
+ * @param path The file path to normalize
1510
+ * @returns Normalized path
1511
+ */
1512
+ private normalizePath(path: string): string {
1513
+ // Remove leading dot and slash variations
1514
+ let normalized = path.replace(/^\.?\/*/, '');
1515
+ // Remove trailing slashes
1516
+ normalized = normalized.replace(/\/+$/, '');
1517
+ return normalized;
1518
+ }
1519
+ &nbsp;
1520
+ /**
1521
+ * Parses a tool result into file blocks.
1522
+ * Each block contains the file path and its content.
1523
+ *
1524
+ * @param text The tool result text
1525
+ * @returns Array of file blocks
1526
+ */
1527
+ private parseFileBlocks(
1528
+ text: string,
1529
+ ): { filePath: string; content: string }[] {
1530
+ const blocks: { filePath: string; content: string }[] = [];
1531
+ &nbsp;
1532
+ // Split by file markers, keeping the delimiter
1533
+ const parts = text.split(/(?=\/\/ File: )/g);
1534
+ &nbsp;
1535
+ for (const part of parts) {
1536
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!part.trim()) <span class="cstat-no" title="statement not covered" >continue;</span>
1537
+ &nbsp;
1538
+ // Extract file path from the first line
1539
+ const firstLineEnd = part.indexOf('\n');
1540
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (firstLineEnd === -1) {
1541
+ // No newline, just a file marker with no content
1542
+ const match = <span class="cstat-no" title="statement not covered" >part.match(/\/\/ File: (.+)/);</span>
1543
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (match) {</span>
1544
+ <span class="cstat-no" title="statement not covered" > blocks.push({ filePath: match[1].trim(), content: part });</span>
1545
+ }
1546
+ <span class="cstat-no" title="statement not covered" > continue;</span>
1547
+ }
1548
+ &nbsp;
1549
+ const firstLine = part.substring(0, firstLineEnd);
1550
+ const match = firstLine.match(/\/\/ File: (.+)/);
1551
+ &nbsp;
1552
+ if (match) {
1553
+ blocks.push({
1554
+ filePath: match[1].trim(),
1555
+ content: part,
1556
+ });
1557
+ }
1558
+ }
1559
+ &nbsp;
1560
+ return blocks;
1561
+ }
1562
+ &nbsp;
1563
+ /**
1564
+ * Redacts a tool result by replacing file content with a redaction message.
1565
+ * Preserves content for files that are not in the redaction list.
1566
+ *
1567
+ * @param turn The tool result turn to redact
1568
+ * @param filesToRedact List of files that have newer content, with the tool name of the newer version
1569
+ * @returns New turn with redacted content
1570
+ */
1571
+ private redactToolResult(
1572
+ turn: LlmContent,
1573
+ filesToRedact: { filePath: string; latestToolName: string }[],
1574
+ ): LlmContent {
1575
+ const text = turn.parts.map((p) =&gt; p.text).join('');
1576
+ const blocks = this.parseFileBlocks(text);
1577
+ &nbsp;
1578
+ // Build a map of normalized path -&gt; latestToolName for redaction messages
1579
+ const redactionInfo = new Map&lt;string, string&gt;();
1580
+ for (const f of filesToRedact) {
1581
+ redactionInfo.set(this.normalizePath(f.filePath), f.latestToolName);
1582
+ }
1583
+ &nbsp;
1584
+ const normalizedFilesToRedact = new Set(redactionInfo.keys());
1585
+ &nbsp;
1586
+ const resultParts: string[] = [];
1587
+ &nbsp;
1588
+ for (const block of blocks) {
1589
+ const normalizedBlockPath = this.normalizePath(block.filePath);
1590
+ &nbsp;
1591
+ if (normalizedFilesToRedact.has(normalizedBlockPath)) {
1592
+ const latestToolName = redactionInfo.get(normalizedBlockPath)!;
1593
+ // Redact this file
1594
+ resultParts.push(
1595
+ `[Content for ${block.filePath} redacted - see newer ${latestToolName}]`,
1596
+ );
1597
+ } else {
1598
+ // Keep original content
1599
+ resultParts.push(block.content);
1600
+ }
1601
+ }
1602
+ &nbsp;
1603
+ // If no blocks were parsed (unexpected format), fall back to simple redaction
1604
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (resultParts.length === 0) {
1605
+ const fileList =
1606
+ <span class="cstat-no" title="statement not covered" > filesToRedact.length === 1</span>
1607
+ ? filesToRedact[0].filePath
1608
+ : `${filesToRedact.length} files`;
1609
+ const latestToolName = <span class="cstat-no" title="statement not covered" >filesToRedact[0].latestToolName;</span>
1610
+ <span class="cstat-no" title="statement not covered" > return {</span>
1611
+ ...turn,
1612
+ parts: [
1613
+ {
1614
+ text: `[Content for ${fileList} redacted - see newer ${latestToolName}]`,
1615
+ },
1616
+ ],
1617
+ };
1618
+ }
1619
+ &nbsp;
1620
+ return {
1621
+ ...turn,
1622
+ parts: [{ text: resultParts.join('\n\n') }],
1623
+ };
1624
+ }
1625
+ }
1626
+ &nbsp;</pre></td></tr></table></pre>
1627
+
1628
+ <div class='push'></div><!-- for sticky footer -->
1629
+ </div><!-- /wrapper -->
1630
+ <div class='footer quiet pad2 space-top1 center small'>
1631
+ Code coverage generated by
1632
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1633
+ at 2026-05-09T01:03:45.353Z
1634
+ </div>
1635
+ <script src="../../prettify.js"></script>
1636
+ <script>
1637
+ window.onload = function () {
1638
+ prettyPrint();
1639
+ };
1640
+ </script>
1641
+ <script src="../../sorter.js"></script>
1642
+ <script src="../../block-navigation.js"></script>
1643
+ </body>
1644
+ </html>
1645
+