repoburg 1.3.148 → 1.3.150

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 (515) hide show
  1. package/backend/dist/src/core-entities/session.entity.d.ts +1 -0
  2. package/backend/dist/src/core-entities/session.entity.js +8 -0
  3. package/backend/dist/src/core-entities/session.entity.js.map +1 -1
  4. package/backend/dist/src/interactive-chat/chat.service.js +9 -0
  5. package/backend/dist/src/interactive-chat/chat.service.js.map +1 -1
  6. package/backend/dist/src/main.js +3 -0
  7. package/backend/dist/src/main.js.map +1 -1
  8. package/backend/dist/src/sessions/dto/session.dto.d.ts +1 -0
  9. package/backend/dist/src/sessions/dto/session.dto.js +9 -0
  10. package/backend/dist/src/sessions/dto/session.dto.js.map +1 -1
  11. package/backend/dist/src/sessions/sessions.service.d.ts +1 -0
  12. package/backend/dist/src/sessions/sessions.service.js +7 -0
  13. package/backend/dist/src/sessions/sessions.service.js.map +1 -1
  14. package/backend/dist/src/sub-agents/sub-agent-runner.service.js +17 -0
  15. package/backend/dist/src/sub-agents/sub-agent-runner.service.js.map +1 -1
  16. package/backend/dist/tsconfig.build.tsbuildinfo +1 -1
  17. package/package.json +1 -1
  18. package/.claude/settings.local.json +0 -7
  19. package/.playwright-mcp/console-2026-05-12T09-54-31-560Z.log +0 -13
  20. package/.playwright-mcp/console-2026-05-12T10-04-14-892Z.log +0 -13
  21. package/.playwright-mcp/console-2026-05-12T10-50-32-398Z.log +0 -14
  22. package/.playwright-mcp/console-2026-05-12T12-50-09-889Z.log +0 -13
  23. package/.playwright-mcp/console-2026-05-12T12-58-49-817Z.log +0 -60
  24. package/.playwright-mcp/console-2026-05-13T18-41-50-654Z.log +0 -13
  25. package/.playwright-mcp/console-2026-05-13T18-54-58-000Z.log +0 -13
  26. package/.playwright-mcp/console-2026-05-13T19-13-30-875Z.log +0 -95
  27. package/.playwright-mcp/console-2026-05-13T20-09-13-456Z.log +0 -17
  28. package/.playwright-mcp/console-2026-05-13T20-21-01-662Z.log +0 -13
  29. package/.playwright-mcp/console-2026-05-13T20-22-00-038Z.log +0 -15
  30. package/.playwright-mcp/console-2026-05-13T20-26-26-665Z.log +0 -28
  31. package/.playwright-mcp/console-2026-05-13T20-35-49-544Z.log +0 -26
  32. package/.playwright-mcp/console-2026-05-13T20-38-10-958Z.log +0 -676
  33. package/.playwright-mcp/console-2026-05-14T21-27-06-074Z.log +0 -69
  34. package/.playwright-mcp/console-2026-05-14T22-13-07-470Z.log +0 -101
  35. package/.playwright-mcp/console-2026-05-14T23-58-12-858Z.log +0 -28
  36. package/.playwright-mcp/console-2026-05-15T00-15-00-760Z.log +0 -81
  37. package/.playwright-mcp/page-2026-05-12T09-54-32-920Z.yml +0 -223
  38. package/.playwright-mcp/page-2026-05-12T09-54-42-067Z.yml +0 -190
  39. package/.playwright-mcp/page-2026-05-12T09-55-12-019Z.yml +0 -389
  40. package/.playwright-mcp/page-2026-05-12T09-55-49-065Z.yml +0 -428
  41. package/.playwright-mcp/page-2026-05-12T09-56-06-607Z.yml +0 -389
  42. package/.playwright-mcp/page-2026-05-12T09-56-23-371Z.yml +0 -196
  43. package/.playwright-mcp/page-2026-05-12T09-56-55-792Z.yml +0 -389
  44. package/.playwright-mcp/page-2026-05-12T10-04-15-716Z.yml +0 -164
  45. package/.playwright-mcp/page-2026-05-12T10-04-43-994Z.yml +0 -190
  46. package/.playwright-mcp/page-2026-05-12T10-05-04-616Z.yml +0 -389
  47. package/.playwright-mcp/page-2026-05-12T10-05-27-643Z.yml +0 -428
  48. package/.playwright-mcp/page-2026-05-12T10-05-47-851Z.yml +0 -389
  49. package/.playwright-mcp/page-2026-05-12T10-06-13-429Z.yml +0 -196
  50. package/.playwright-mcp/page-2026-05-12T10-06-58-147Z.yml +0 -389
  51. package/.playwright-mcp/page-2026-05-12T10-08-20-216Z.yml +0 -428
  52. package/.playwright-mcp/page-2026-05-12T10-08-38-177Z.yml +0 -389
  53. package/.playwright-mcp/page-2026-05-12T10-09-01-851Z.yml +0 -196
  54. package/.playwright-mcp/page-2026-05-12T10-09-24-888Z.yml +0 -389
  55. package/.playwright-mcp/page-2026-05-12T10-50-33-049Z.yml +0 -212
  56. package/.playwright-mcp/page-2026-05-12T10-50-48-496Z.yml +0 -196
  57. package/.playwright-mcp/page-2026-05-12T10-51-51-308Z.yml +0 -196
  58. package/.playwright-mcp/page-2026-05-12T10-52-07-379Z.yml +0 -196
  59. package/.playwright-mcp/page-2026-05-12T12-50-10-589Z.yml +0 -143
  60. package/.playwright-mcp/page-2026-05-12T12-50-25-461Z.yml +0 -196
  61. package/.playwright-mcp/page-2026-05-12T12-51-11-190Z.yml +0 -394
  62. package/.playwright-mcp/page-2026-05-12T12-52-21-138Z.yml +0 -524
  63. package/.playwright-mcp/page-2026-05-12T12-53-42-423Z.yml +0 -431
  64. package/.playwright-mcp/page-2026-05-12T12-54-18-549Z.yml +0 -196
  65. package/.playwright-mcp/page-2026-05-12T12-54-26-818Z.yml +0 -390
  66. package/.playwright-mcp/page-2026-05-12T12-55-32-697Z.yml +0 -520
  67. package/.playwright-mcp/page-2026-05-12T12-58-50-450Z.yml +0 -164
  68. package/.playwright-mcp/page-2026-05-12T12-59-12-954Z.yml +0 -196
  69. package/.playwright-mcp/page-2026-05-12T12-59-38-479Z.yml +0 -394
  70. package/.playwright-mcp/page-2026-05-12T13-01-17-580Z.yml +0 -524
  71. package/.playwright-mcp/page-2026-05-12T13-01-58-447Z.yml +0 -271
  72. package/.playwright-mcp/page-2026-05-12T13-03-12-109Z.yml +0 -394
  73. package/.playwright-mcp/page-2026-05-13T18-41-51-436Z.yml +0 -159
  74. package/.playwright-mcp/page-2026-05-13T18-42-27-482Z.yml +0 -4814
  75. package/.playwright-mcp/page-2026-05-13T18-54-58-644Z.yml +0 -154
  76. package/.playwright-mcp/page-2026-05-13T18-56-11-217Z.yml +0 -1560
  77. package/.playwright-mcp/page-2026-05-13T18-56-32-205Z.yml +0 -1560
  78. package/.playwright-mcp/page-2026-05-13T19-13-31-457Z.yml +0 -164
  79. package/.playwright-mcp/page-2026-05-13T19-14-26-248Z.yml +0 -1560
  80. package/.playwright-mcp/page-2026-05-13T19-15-02-355Z.yml +0 -1560
  81. package/.playwright-mcp/page-2026-05-13T20-09-14-478Z.yml +0 -149
  82. package/.playwright-mcp/page-2026-05-13T20-10-49-292Z.yml +0 -4814
  83. package/.playwright-mcp/page-2026-05-13T20-21-02-852Z.yml +0 -143
  84. package/.playwright-mcp/page-2026-05-13T20-22-01-084Z.yml +0 -143
  85. package/.playwright-mcp/page-2026-05-13T20-22-09-334Z.yml +0 -1561
  86. package/.playwright-mcp/page-2026-05-13T20-26-27-690Z.yml +0 -143
  87. package/.playwright-mcp/page-2026-05-13T20-26-53-324Z.yml +0 -1561
  88. package/.playwright-mcp/page-2026-05-13T20-27-35-395Z.yml +0 -1561
  89. package/.playwright-mcp/page-2026-05-13T20-35-50-708Z.yml +0 -149
  90. package/.playwright-mcp/page-2026-05-13T20-37-41-379Z.yml +0 -0
  91. package/.playwright-mcp/page-2026-05-13T20-38-12-049Z.yml +0 -149
  92. package/.playwright-mcp/page-2026-05-13T20-38-19-708Z.yml +0 -1561
  93. package/.playwright-mcp/page-2026-05-14T21-27-07-278Z.yml +0 -164
  94. package/.playwright-mcp/page-2026-05-14T22-13-07-628Z.yml +0 -5
  95. package/.playwright-mcp/page-2026-05-14T22-13-27-676Z.yml +0 -1561
  96. package/.playwright-mcp/page-2026-05-14T23-58-13-064Z.yml +0 -3
  97. package/.playwright-mcp/page-2026-05-14T23-58-33-500Z.yml +0 -1561
  98. package/.playwright-mcp/page-2026-05-15T00-15-00-945Z.yml +0 -3
  99. package/.run/backend _ build.run.xml +0 -12
  100. package/.run/backend _ lint.run.xml +0 -12
  101. package/.run/backend _ test.run.xml +0 -12
  102. package/.run/frontend _ build.run.xml +0 -12
  103. package/.run/frontend _ lint_fix.run.xml +0 -12
  104. package/CODEMAP.md +0 -53
  105. package/backend/.repoburg/hooks/README.md +0 -53
  106. package/backend/.repoburg/hooks/eslint-hook.ts +0 -46
  107. package/backend/.repoburg/hooks/example-hook.ts +0 -62
  108. package/backend/CODEMAP.md +0 -48
  109. package/backend/README.md +0 -3
  110. package/backend/coverage/clover.xml +0 -12003
  111. package/backend/coverage/coverage-final.json +0 -313
  112. package/backend/coverage/lcov-report/base.css +0 -224
  113. package/backend/coverage/lcov-report/block-navigation.js +0 -87
  114. package/backend/coverage/lcov-report/favicon.png +0 -0
  115. package/backend/coverage/lcov-report/index.html +0 -1301
  116. package/backend/coverage/lcov-report/packages/gemini-core/examples/index.html +0 -116
  117. package/backend/coverage/lcov-report/packages/gemini-core/examples/simple.ts.html +0 -445
  118. package/backend/coverage/lcov-report/packages/gemini-core/index.html +0 -116
  119. package/backend/coverage/lcov-report/packages/gemini-core/index.ts.html +0 -127
  120. package/backend/coverage/lcov-report/packages/gemini-core/src/code_assist/codeAssist.ts.html +0 -193
  121. package/backend/coverage/lcov-report/packages/gemini-core/src/code_assist/converter.ts.html +0 -832
  122. package/backend/coverage/lcov-report/packages/gemini-core/src/code_assist/index.html +0 -206
  123. package/backend/coverage/lcov-report/packages/gemini-core/src/code_assist/oauth-credential-storage.ts.html +0 -469
  124. package/backend/coverage/lcov-report/packages/gemini-core/src/code_assist/oauth2.ts.html +0 -1705
  125. package/backend/coverage/lcov-report/packages/gemini-core/src/code_assist/server.ts.html +0 -790
  126. package/backend/coverage/lcov-report/packages/gemini-core/src/code_assist/setup.ts.html +0 -454
  127. package/backend/coverage/lcov-report/packages/gemini-core/src/code_assist/types.ts.html +0 -685
  128. package/backend/coverage/lcov-report/packages/gemini-core/src/config/config.ts.html +0 -307
  129. package/backend/coverage/lcov-report/packages/gemini-core/src/config/index.html +0 -146
  130. package/backend/coverage/lcov-report/packages/gemini-core/src/config/models.ts.html +0 -151
  131. package/backend/coverage/lcov-report/packages/gemini-core/src/config/storage.ts.html +0 -172
  132. package/backend/coverage/lcov-report/packages/gemini-core/src/core/contentGenerator.ts.html +0 -490
  133. package/backend/coverage/lcov-report/packages/gemini-core/src/core/geminiChat.ts.html +0 -1237
  134. package/backend/coverage/lcov-report/packages/gemini-core/src/core/geminiRequest.ts.html +0 -139
  135. package/backend/coverage/lcov-report/packages/gemini-core/src/core/index.html +0 -176
  136. package/backend/coverage/lcov-report/packages/gemini-core/src/core/prompts.ts.html +0 -409
  137. package/backend/coverage/lcov-report/packages/gemini-core/src/core/tokenLimits.ts.html +0 -181
  138. package/backend/coverage/lcov-report/packages/gemini-core/src/index.html +0 -116
  139. package/backend/coverage/lcov-report/packages/gemini-core/src/index.ts.html +0 -187
  140. package/backend/coverage/lcov-report/packages/gemini-core/src/mcp/token-storage/base-token-storage.ts.html +0 -229
  141. package/backend/coverage/lcov-report/packages/gemini-core/src/mcp/token-storage/file-token-storage.ts.html +0 -634
  142. package/backend/coverage/lcov-report/packages/gemini-core/src/mcp/token-storage/hybrid-token-storage.ts.html +0 -373
  143. package/backend/coverage/lcov-report/packages/gemini-core/src/mcp/token-storage/index.html +0 -191
  144. package/backend/coverage/lcov-report/packages/gemini-core/src/mcp/token-storage/index.ts.html +0 -124
  145. package/backend/coverage/lcov-report/packages/gemini-core/src/mcp/token-storage/keychain-token-storage.ts.html +0 -835
  146. package/backend/coverage/lcov-report/packages/gemini-core/src/mcp/token-storage/types.ts.html +0 -211
  147. package/backend/coverage/lcov-report/packages/gemini-core/src/utils/errors.ts.html +0 -421
  148. package/backend/coverage/lcov-report/packages/gemini-core/src/utils/index.html +0 -191
  149. package/backend/coverage/lcov-report/packages/gemini-core/src/utils/partUtils.ts.html +0 -592
  150. package/backend/coverage/lcov-report/packages/gemini-core/src/utils/quotaErrorDetection.ts.html +0 -388
  151. package/backend/coverage/lcov-report/packages/gemini-core/src/utils/retry.ts.html +0 -877
  152. package/backend/coverage/lcov-report/packages/gemini-core/src/utils/session.ts.html +0 -112
  153. package/backend/coverage/lcov-report/packages/gemini-core/src/utils/userAccountManager.ts.html +0 -502
  154. package/backend/coverage/lcov-report/packages/tokenpatch/index.html +0 -161
  155. package/backend/coverage/lcov-report/packages/tokenpatch/index.ts.html +0 -415
  156. package/backend/coverage/lcov-report/packages/tokenpatch/parser.ts.html +0 -139
  157. package/backend/coverage/lcov-report/packages/tokenpatch/patcher.ts.html +0 -1249
  158. package/backend/coverage/lcov-report/packages/tokenpatch/strategies/index.html +0 -131
  159. package/backend/coverage/lcov-report/packages/tokenpatch/strategies/tiktoken-tokenizer.ts.html +0 -187
  160. package/backend/coverage/lcov-report/packages/tokenpatch/strategies/tree-sitter-tokenizer.ts.html +0 -193
  161. package/backend/coverage/lcov-report/packages/tokenpatch/tokens.ts.html +0 -178
  162. package/backend/coverage/lcov-report/prettify.css +0 -1
  163. package/backend/coverage/lcov-report/prettify.js +0 -2
  164. package/backend/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  165. package/backend/coverage/lcov-report/sorter.js +0 -210
  166. package/backend/coverage/lcov-report/src/ai-actions/ai-action-batch.service.ts.html +0 -1549
  167. package/backend/coverage/lcov-report/src/ai-actions/ai-actions.controller.ts.html +0 -904
  168. package/backend/coverage/lcov-report/src/ai-actions/ai-actions.module.ts.html +0 -175
  169. package/backend/coverage/lcov-report/src/ai-actions/ai-actions.service.ts.html +0 -1534
  170. package/backend/coverage/lcov-report/src/ai-actions/index.html +0 -161
  171. package/backend/coverage/lcov-report/src/app.controller.ts.html +0 -151
  172. package/backend/coverage/lcov-report/src/app.module.ts.html +0 -451
  173. package/backend/coverage/lcov-report/src/app.service.ts.html +0 -163
  174. package/backend/coverage/lcov-report/src/application-state/application-state.controller.ts.html +0 -1609
  175. package/backend/coverage/lcov-report/src/application-state/application-state.module.ts.html +0 -136
  176. package/backend/coverage/lcov-report/src/application-state/application-state.service.ts.html +0 -2281
  177. package/backend/coverage/lcov-report/src/application-state/dto/index.html +0 -416
  178. package/backend/coverage/lcov-report/src/application-state/dto/set-alibaba-config.dto.ts.html +0 -109
  179. package/backend/coverage/lcov-report/src/application-state/dto/set-auto-context-fetch-enabled.dto.ts.html +0 -118
  180. package/backend/coverage/lcov-report/src/application-state/dto/set-auto-send-to-ai-studio-enabled.dto.ts.html +0 -109
  181. package/backend/coverage/lcov-report/src/application-state/dto/set-context-token-limit.dto.ts.html +0 -124
  182. package/backend/coverage/lcov-report/src/application-state/dto/set-execution-strategy.dto.ts.html +0 -121
  183. package/backend/coverage/lcov-report/src/application-state/dto/set-followup-token-limit.dto.ts.html +0 -124
  184. package/backend/coverage/lcov-report/src/application-state/dto/set-history-compression-enabled.dto.ts.html +0 -115
  185. package/backend/coverage/lcov-report/src/application-state/dto/set-llm-retry-enabled.dto.ts.html +0 -115
  186. package/backend/coverage/lcov-report/src/application-state/dto/set-llm-retry-max-attempts.dto.ts.html +0 -127
  187. package/backend/coverage/lcov-report/src/application-state/dto/set-manual-llm-enabled.dto.ts.html +0 -118
  188. package/backend/coverage/lcov-report/src/application-state/dto/set-ollama-config.dto.ts.html +0 -109
  189. package/backend/coverage/lcov-report/src/application-state/dto/set-openai-config.dto.ts.html +0 -139
  190. package/backend/coverage/lcov-report/src/application-state/dto/set-openrouter-config.dto.ts.html +0 -109
  191. package/backend/coverage/lcov-report/src/application-state/dto/set-streaming-enabled.dto.ts.html +0 -109
  192. package/backend/coverage/lcov-report/src/application-state/dto/set-syntax-validation-enabled.dto.ts.html +0 -118
  193. package/backend/coverage/lcov-report/src/application-state/dto/set-theme.dto.ts.html +0 -124
  194. package/backend/coverage/lcov-report/src/application-state/dto/set-tools-enabled.dto.ts.html +0 -118
  195. package/backend/coverage/lcov-report/src/application-state/dto/set-websocket-enabled.dto.ts.html +0 -109
  196. package/backend/coverage/lcov-report/src/application-state/dto/set-yolo-mode-message.dto.ts.html +0 -124
  197. package/backend/coverage/lcov-report/src/application-state/dto/set-yolo-mode.dto.ts.html +0 -118
  198. package/backend/coverage/lcov-report/src/application-state/dto/set-zai-config.dto.ts.html +0 -109
  199. package/backend/coverage/lcov-report/src/application-state/index.html +0 -146
  200. package/backend/coverage/lcov-report/src/common/cache/cache-invalidation.service.ts.html +0 -1297
  201. package/backend/coverage/lcov-report/src/common/cache/cache-invalidation.subscriber.ts.html +0 -712
  202. package/backend/coverage/lcov-report/src/common/cache/etag-cache.service.ts.html +0 -379
  203. package/backend/coverage/lcov-report/src/common/cache/index.html +0 -146
  204. package/backend/coverage/lcov-report/src/common/common.module.ts.html +0 -121
  205. package/backend/coverage/lcov-report/src/common/index.html +0 -116
  206. package/backend/coverage/lcov-report/src/common/interceptors/etag-cache.interceptor.ts.html +0 -337
  207. package/backend/coverage/lcov-report/src/common/interceptors/index.html +0 -116
  208. package/backend/coverage/lcov-report/src/common/middleware/cache.middleware.ts.html +0 -265
  209. package/backend/coverage/lcov-report/src/common/middleware/index.html +0 -116
  210. package/backend/coverage/lcov-report/src/context-generation/context-generation.module.ts.html +0 -118
  211. package/backend/coverage/lcov-report/src/context-generation/context-generation.service.ts.html +0 -1501
  212. package/backend/coverage/lcov-report/src/context-generation/index.html +0 -131
  213. package/backend/coverage/lcov-report/src/context-snippets/context-snippets.controller.ts.html +0 -427
  214. package/backend/coverage/lcov-report/src/context-snippets/context-snippets.module.ts.html +0 -142
  215. package/backend/coverage/lcov-report/src/context-snippets/context-snippets.service.ts.html +0 -442
  216. package/backend/coverage/lcov-report/src/context-snippets/dto/context-snippet.dto.ts.html +0 -211
  217. package/backend/coverage/lcov-report/src/context-snippets/dto/index.html +0 -116
  218. package/backend/coverage/lcov-report/src/context-snippets/index.html +0 -146
  219. package/backend/coverage/lcov-report/src/context-templates/context-templates.controller.ts.html +0 -724
  220. package/backend/coverage/lcov-report/src/context-templates/context-templates.module.ts.html +0 -142
  221. package/backend/coverage/lcov-report/src/context-templates/context-templates.service.ts.html +0 -1015
  222. package/backend/coverage/lcov-report/src/context-templates/dto/context-template.dto.ts.html +0 -511
  223. package/backend/coverage/lcov-report/src/context-templates/dto/index.html +0 -116
  224. package/backend/coverage/lcov-report/src/context-templates/index.html +0 -146
  225. package/backend/coverage/lcov-report/src/core-entities/ai-action.entity.ts.html +0 -613
  226. package/backend/coverage/lcov-report/src/core-entities/application-state.entity.ts.html +0 -124
  227. package/backend/coverage/lcov-report/src/core-entities/base.entity.ts.html +0 -211
  228. package/backend/coverage/lcov-report/src/core-entities/context-snippet.entity.ts.html +0 -190
  229. package/backend/coverage/lcov-report/src/core-entities/context-template.entity.ts.html +0 -439
  230. package/backend/coverage/lcov-report/src/core-entities/custom-snippet.entity.ts.html +0 -205
  231. package/backend/coverage/lcov-report/src/core-entities/custom-variable.entity.ts.html +0 -241
  232. package/backend/coverage/lcov-report/src/core-entities/enums.ts.html +0 -553
  233. package/backend/coverage/lcov-report/src/core-entities/execution-log.entity.ts.html +0 -208
  234. package/backend/coverage/lcov-report/src/core-entities/index.html +0 -371
  235. package/backend/coverage/lcov-report/src/core-entities/index.ts.html +0 -136
  236. package/backend/coverage/lcov-report/src/core-entities/llm-call-log.entity.ts.html +0 -388
  237. package/backend/coverage/lcov-report/src/core-entities/mcp-config.entity.ts.html +0 -256
  238. package/backend/coverage/lcov-report/src/core-entities/mcp-tool.entity.ts.html +0 -256
  239. package/backend/coverage/lcov-report/src/core-entities/project.entity.ts.html +0 -181
  240. package/backend/coverage/lcov-report/src/core-entities/session-input.entity.ts.html +0 -745
  241. package/backend/coverage/lcov-report/src/core-entities/session.entity.ts.html +0 -688
  242. package/backend/coverage/lcov-report/src/core-entities/system-prompt.entity.ts.html +0 -349
  243. package/backend/coverage/lcov-report/src/core-entities/tool-hook.entity.ts.html +0 -235
  244. package/backend/coverage/lcov-report/src/custom-snippets/custom-snippets.controller.ts.html +0 -442
  245. package/backend/coverage/lcov-report/src/custom-snippets/custom-snippets.module.ts.html +0 -124
  246. package/backend/coverage/lcov-report/src/custom-snippets/custom-snippets.service.ts.html +0 -304
  247. package/backend/coverage/lcov-report/src/custom-snippets/dto/custom-snippet.dto.ts.html +0 -205
  248. package/backend/coverage/lcov-report/src/custom-snippets/dto/index.html +0 -116
  249. package/backend/coverage/lcov-report/src/custom-snippets/index.html +0 -146
  250. package/backend/coverage/lcov-report/src/custom-variables/custom-variables.controller.ts.html +0 -463
  251. package/backend/coverage/lcov-report/src/custom-variables/custom-variables.module.ts.html +0 -124
  252. package/backend/coverage/lcov-report/src/custom-variables/custom-variables.service.ts.html +0 -310
  253. package/backend/coverage/lcov-report/src/custom-variables/dto/custom-variable.dto.ts.html +0 -244
  254. package/backend/coverage/lcov-report/src/custom-variables/dto/index.html +0 -116
  255. package/backend/coverage/lcov-report/src/custom-variables/index.html +0 -146
  256. package/backend/coverage/lcov-report/src/events/events.gateway.ts.html +0 -295
  257. package/backend/coverage/lcov-report/src/events/events.module.ts.html +0 -109
  258. package/backend/coverage/lcov-report/src/events/index.html +0 -146
  259. package/backend/coverage/lcov-report/src/events/websocket.events.ts.html +0 -466
  260. package/backend/coverage/lcov-report/src/execution-logs/dto/execution-log.dto.ts.html +0 -130
  261. package/backend/coverage/lcov-report/src/execution-logs/dto/index.html +0 -116
  262. package/backend/coverage/lcov-report/src/execution-logs/execution-logs.controller.ts.html +0 -130
  263. package/backend/coverage/lcov-report/src/execution-logs/execution-logs.module.ts.html +0 -124
  264. package/backend/coverage/lcov-report/src/execution-logs/execution-logs.service.ts.html +0 -238
  265. package/backend/coverage/lcov-report/src/execution-logs/index.html +0 -146
  266. package/backend/coverage/lcov-report/src/gemini/gemini-llm.provider.ts.html +0 -553
  267. package/backend/coverage/lcov-report/src/gemini/gemini.module.ts.html +0 -109
  268. package/backend/coverage/lcov-report/src/gemini/index.html +0 -131
  269. package/backend/coverage/lcov-report/src/global-config/dto/index.html +0 -116
  270. package/backend/coverage/lcov-report/src/global-config/dto/update-global-config.dto.ts.html +0 -367
  271. package/backend/coverage/lcov-report/src/global-config/global-config.controller.ts.html +0 -220
  272. package/backend/coverage/lcov-report/src/global-config/global-config.module.ts.html +0 -115
  273. package/backend/coverage/lcov-report/src/global-config/global-config.service.ts.html +0 -397
  274. package/backend/coverage/lcov-report/src/global-config/index.html +0 -146
  275. package/backend/coverage/lcov-report/src/http-exception.filter.ts.html +0 -340
  276. package/backend/coverage/lcov-report/src/index.html +0 -206
  277. package/backend/coverage/lcov-report/src/interactive-chat/chat.module.ts.html +0 -187
  278. package/backend/coverage/lcov-report/src/interactive-chat/chat.service.ts.html +0 -1825
  279. package/backend/coverage/lcov-report/src/interactive-chat/index.html +0 -146
  280. package/backend/coverage/lcov-report/src/interactive-chat/streaming.controller.ts.html +0 -343
  281. package/backend/coverage/lcov-report/src/llm-call-logs/dto/index.html +0 -116
  282. package/backend/coverage/lcov-report/src/llm-call-logs/dto/llm-call-log.dto.ts.html +0 -214
  283. package/backend/coverage/lcov-report/src/llm-call-logs/index.html +0 -146
  284. package/backend/coverage/lcov-report/src/llm-call-logs/llm-call-logs.controller.ts.html +0 -634
  285. package/backend/coverage/lcov-report/src/llm-call-logs/llm-call-logs.module.ts.html +0 -124
  286. package/backend/coverage/lcov-report/src/llm-call-logs/llm-call-logs.service.ts.html +0 -643
  287. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/apply-diff.handler.ts.html +0 -1090
  288. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/ask-user.handler.ts.html +0 -433
  289. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/create-file.handler.ts.html +0 -757
  290. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/delete-file.handler.ts.html +0 -586
  291. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/discard-messages.handler.ts.html +0 -1153
  292. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/apply-diff.args.dto.ts.html +0 -124
  293. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/ask-user.args.dto.ts.html +0 -103
  294. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/create-file.args.dto.ts.html +0 -124
  295. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/delete-file.args.dto.ts.html +0 -106
  296. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/execute-code.args.dto.ts.html +0 -106
  297. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/final.args.dto.ts.html +0 -118
  298. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/generate-title.args.dto.ts.html +0 -190
  299. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/get-session-history.args.dto.ts.html +0 -196
  300. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/howto.args.dto.ts.html +0 -91
  301. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/index.html +0 -356
  302. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/new-session.args.dto.ts.html +0 -106
  303. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/overwrite-file.args.dto.ts.html +0 -124
  304. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/patch.args.dto.ts.html +0 -124
  305. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/quick-edit.args.dto.ts.html +0 -214
  306. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/request-context.args.dto.ts.html +0 -202
  307. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/run-command.args.dto.ts.html +0 -151
  308. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/sanitizer.decorator.ts.html +0 -181
  309. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/dto/write-todo.args.dto.ts.html +0 -130
  310. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/execute-code.handler.ts.html +0 -631
  311. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/final.handler.ts.html +0 -469
  312. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/generate-title.handler.ts.html +0 -448
  313. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/get-messages.handler.ts.html +0 -1351
  314. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/get-session-history.handler.ts.html +0 -868
  315. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/howto.handler.ts.html +0 -481
  316. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/index.html +0 -416
  317. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/invoke-subagent.handler.ts.html +0 -580
  318. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/list-sub-agents.handler.ts.html +0 -352
  319. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/matchers/context-aware.matcher.ts.html +0 -1054
  320. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/matchers/exact.matcher.ts.html +0 -331
  321. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/matchers/hybrid.matcher.ts.html +0 -403
  322. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/matchers/index.html +0 -176
  323. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/matchers/index.ts.html +0 -100
  324. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/matchers/normalized.matcher.ts.html +0 -724
  325. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/mcp-tool-action.handler.ts.html +0 -358
  326. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/new-session.handler.ts.html +0 -379
  327. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/overwrite-file.handler.ts.html +0 -838
  328. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/patch.handler.ts.html +0 -1702
  329. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/quick-edit.handler.ts.html +0 -1459
  330. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/request-context.handler.ts.html +0 -679
  331. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/run-command.handler.ts.html +0 -964
  332. package/backend/coverage/lcov-report/src/llm-orchestration/action-handlers/write-todo.handler.ts.html +0 -625
  333. package/backend/coverage/lcov-report/src/llm-orchestration/errors/handler-validation.error.ts.html +0 -103
  334. package/backend/coverage/lcov-report/src/llm-orchestration/errors/index.html +0 -116
  335. package/backend/coverage/lcov-report/src/llm-orchestration/history-compression.service.ts.html +0 -1645
  336. package/backend/coverage/lcov-report/src/llm-orchestration/hooks/follow-up-post-execution.hook.ts.html +0 -238
  337. package/backend/coverage/lcov-report/src/llm-orchestration/hooks/frontend-notification.hook.ts.html +0 -181
  338. package/backend/coverage/lcov-report/src/llm-orchestration/hooks/index.html +0 -161
  339. package/backend/coverage/lcov-report/src/llm-orchestration/hooks/invalid-tool-feedback.hook.ts.html +0 -313
  340. package/backend/coverage/lcov-report/src/llm-orchestration/hooks/yolo-mode-post-execution.hook.ts.html +0 -466
  341. package/backend/coverage/lcov-report/src/llm-orchestration/index.html +0 -176
  342. package/backend/coverage/lcov-report/src/llm-orchestration/llm-orchestration.interfaces.ts.html +0 -319
  343. package/backend/coverage/lcov-report/src/llm-orchestration/llm-orchestration.module.ts.html +0 -706
  344. package/backend/coverage/lcov-report/src/llm-orchestration/llm-turn-processor.service.ts.html +0 -1150
  345. package/backend/coverage/lcov-report/src/llm-orchestration/parser/index.html +0 -131
  346. package/backend/coverage/lcov-report/src/llm-orchestration/parser/llm-output-parser.service.ts.html +0 -658
  347. package/backend/coverage/lcov-report/src/llm-orchestration/parser/parsing.constants.ts.html +0 -127
  348. package/backend/coverage/lcov-report/src/llm-orchestration/tool-schema.service.ts.html +0 -547
  349. package/backend/coverage/lcov-report/src/llm-provider/alibaba-llm.provider.ts.html +0 -1681
  350. package/backend/coverage/lcov-report/src/llm-provider/index.html +0 -236
  351. package/backend/coverage/lcov-report/src/llm-provider/llm-provider.controller.ts.html +0 -187
  352. package/backend/coverage/lcov-report/src/llm-provider/llm-provider.interface.ts.html +0 -361
  353. package/backend/coverage/lcov-report/src/llm-provider/llm-provider.module.ts.html +0 -175
  354. package/backend/coverage/lcov-report/src/llm-provider/ollama-llm.provider.ts.html +0 -1780
  355. package/backend/coverage/lcov-report/src/llm-provider/openai-llm.provider.ts.html +0 -1867
  356. package/backend/coverage/lcov-report/src/llm-provider/openrouter-llm.provider.ts.html +0 -1891
  357. package/backend/coverage/lcov-report/src/llm-provider/proxy-llm.provider.ts.html +0 -304
  358. package/backend/coverage/lcov-report/src/llm-provider/zai-llm.provider.ts.html +0 -1666
  359. package/backend/coverage/lcov-report/src/llm-responses/dto/index.html +0 -131
  360. package/backend/coverage/lcov-report/src/llm-responses/dto/submit-llm-response.dto.ts.html +0 -436
  361. package/backend/coverage/lcov-report/src/llm-responses/dto/sync-conversation.dto.ts.html +0 -319
  362. package/backend/coverage/lcov-report/src/llm-responses/index.html +0 -146
  363. package/backend/coverage/lcov-report/src/llm-responses/llm-responses.controller.ts.html +0 -283
  364. package/backend/coverage/lcov-report/src/llm-responses/llm-responses.module.ts.html +0 -184
  365. package/backend/coverage/lcov-report/src/llm-responses/llm-responses.service.ts.html +0 -1474
  366. package/backend/coverage/lcov-report/src/main.ts.html +0 -463
  367. package/backend/coverage/lcov-report/src/mcp/dto/batch-update-mcp-tools.dto.ts.html +0 -145
  368. package/backend/coverage/lcov-report/src/mcp/dto/create-mcp-config.dto.ts.html +0 -127
  369. package/backend/coverage/lcov-report/src/mcp/dto/index.html +0 -146
  370. package/backend/coverage/lcov-report/src/mcp/dto/update-mcp-config.dto.ts.html +0 -112
  371. package/backend/coverage/lcov-report/src/mcp/index.html +0 -146
  372. package/backend/coverage/lcov-report/src/mcp/mcp.controller.ts.html +0 -340
  373. package/backend/coverage/lcov-report/src/mcp/mcp.module.ts.html +0 -124
  374. package/backend/coverage/lcov-report/src/mcp/mcp.service.ts.html +0 -1345
  375. package/backend/coverage/lcov-report/src/message-bus/dto/index.html +0 -116
  376. package/backend/coverage/lcov-report/src/message-bus/dto/submit-message.dto.ts.html +0 -109
  377. package/backend/coverage/lcov-report/src/message-bus/index.html +0 -146
  378. package/backend/coverage/lcov-report/src/message-bus/message-bus.controller.ts.html +0 -148
  379. package/backend/coverage/lcov-report/src/message-bus/message-bus.module.ts.html +0 -115
  380. package/backend/coverage/lcov-report/src/message-bus/message-bus.service.ts.html +0 -151
  381. package/backend/coverage/lcov-report/src/projects/dto/index.html +0 -116
  382. package/backend/coverage/lcov-report/src/projects/dto/project.dto.ts.html +0 -196
  383. package/backend/coverage/lcov-report/src/projects/index.html +0 -146
  384. package/backend/coverage/lcov-report/src/projects/projects.controller.ts.html +0 -322
  385. package/backend/coverage/lcov-report/src/projects/projects.module.ts.html +0 -124
  386. package/backend/coverage/lcov-report/src/projects/projects.service.ts.html +0 -235
  387. package/backend/coverage/lcov-report/src/seeding/context-snippet-seeding.service.ts.html +0 -280
  388. package/backend/coverage/lcov-report/src/seeding/context-template-seeding.service.ts.html +0 -439
  389. package/backend/coverage/lcov-report/src/seeding/custom-snippet-seeding.service.ts.html +0 -271
  390. package/backend/coverage/lcov-report/src/seeding/custom-variable-seeding.service.ts.html +0 -271
  391. package/backend/coverage/lcov-report/src/seeding/data/context-snippets/compress.ts.html +0 -172
  392. package/backend/coverage/lcov-report/src/seeding/data/context-snippets/index.html +0 -116
  393. package/backend/coverage/lcov-report/src/seeding/data/context-templates/default-followup_ad-hoc-focused-context.ts.html +0 -157
  394. package/backend/coverage/lcov-report/src/seeding/data/context-templates/default-initial_condensed-project-context.ts.html +0 -148
  395. package/backend/coverage/lcov-report/src/seeding/data/context-templates/default-initial_full-project-context.ts.html +0 -151
  396. package/backend/coverage/lcov-report/src/seeding/data/context-templates/index.html +0 -161
  397. package/backend/coverage/lcov-report/src/seeding/data/context-templates/open-pr-command.ts.html +0 -247
  398. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/default_rglob.ts.html +0 -94
  399. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/eta-for.ts.html +0 -100
  400. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/eta-if.ts.html +0 -97
  401. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/eta-ifelse.ts.html +0 -100
  402. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/everest-playwright-auth.ts.html +0 -304
  403. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/git-diff.ts.html +0 -94
  404. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/index.html +0 -341
  405. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/it-mcp.ts.html +0 -100
  406. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/it-tools.ts.html +0 -97
  407. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/rg-exclude.ts.html +0 -94
  408. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/rg-search-glob.ts.html +0 -94
  409. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/rg-search.ts.html +0 -94
  410. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/run-command.ts.html +0 -94
  411. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/tree.ts.html +0 -94
  412. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/usr-adhoc-incl.ts.html +0 -100
  413. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/usr-cmd-output-incl.ts.html +0 -94
  414. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/usr-input-incl.ts.html +0 -94
  415. package/backend/coverage/lcov-report/src/seeding/data/custom-variables/default-auto-execute-code.ts.html +0 -94
  416. package/backend/coverage/lcov-report/src/seeding/data/custom-variables/default-plan-mode.ts.html +0 -97
  417. package/backend/coverage/lcov-report/src/seeding/data/custom-variables/index.html +0 -131
  418. package/backend/coverage/lcov-report/src/seeding/data/mcp-configs/default-configs.ts.html +0 -121
  419. package/backend/coverage/lcov-report/src/seeding/data/mcp-configs/index.html +0 -116
  420. package/backend/coverage/lcov-report/src/seeding/data/sub-agents/browser-use.ts.html +0 -115
  421. package/backend/coverage/lcov-report/src/seeding/data/sub-agents/explore-codebase.ts.html +0 -136
  422. package/backend/coverage/lcov-report/src/seeding/data/sub-agents/index.html +0 -131
  423. package/backend/coverage/lcov-report/src/seeding/data/system-prompts/browser-use-agent.ts.html +0 -190
  424. package/backend/coverage/lcov-report/src/seeding/data/system-prompts/default_native_tool_agent.ts.html +0 -421
  425. package/backend/coverage/lcov-report/src/seeding/data/system-prompts/explore-codebase-agent.ts.html +0 -265
  426. package/backend/coverage/lcov-report/src/seeding/data/system-prompts/index.html +0 -161
  427. package/backend/coverage/lcov-report/src/seeding/data/system-prompts/master-agent.ts.html +0 -388
  428. package/backend/coverage/lcov-report/src/seeding/data/tool-hooks/eslint-hook.ts.html +0 -265
  429. package/backend/coverage/lcov-report/src/seeding/data/tool-hooks/example-hook.ts.html +0 -274
  430. package/backend/coverage/lcov-report/src/seeding/data/tool-hooks/index.html +0 -146
  431. package/backend/coverage/lcov-report/src/seeding/data/tool-hooks/readme.ts.html +0 -250
  432. package/backend/coverage/lcov-report/src/seeding/index.html +0 -236
  433. package/backend/coverage/lcov-report/src/seeding/mcp-config-seeding.service.ts.html +0 -193
  434. package/backend/coverage/lcov-report/src/seeding/seeding.module.ts.html +0 -211
  435. package/backend/coverage/lcov-report/src/seeding/seeding.service.ts.html +0 -187
  436. package/backend/coverage/lcov-report/src/seeding/sub-agent-seeding.service.ts.html +0 -742
  437. package/backend/coverage/lcov-report/src/seeding/system-prompt-seeding.service.ts.html +0 -397
  438. package/backend/coverage/lcov-report/src/session-followup/index.html +0 -131
  439. package/backend/coverage/lcov-report/src/session-followup/session-followup.module.ts.html +0 -130
  440. package/backend/coverage/lcov-report/src/session-followup/session-followup.service.ts.html +0 -718
  441. package/backend/coverage/lcov-report/src/session-inputs/dto/index.html +0 -116
  442. package/backend/coverage/lcov-report/src/session-inputs/dto/session-input.dto.ts.html +0 -577
  443. package/backend/coverage/lcov-report/src/session-inputs/index.html +0 -176
  444. package/backend/coverage/lcov-report/src/session-inputs/session-input-context.service.ts.html +0 -832
  445. package/backend/coverage/lcov-report/src/session-inputs/session-input.subscriber.ts.html +0 -220
  446. package/backend/coverage/lcov-report/src/session-inputs/session-inputs.controller.ts.html +0 -685
  447. package/backend/coverage/lcov-report/src/session-inputs/session-inputs.module.ts.html +0 -229
  448. package/backend/coverage/lcov-report/src/session-inputs/session-inputs.service.ts.html +0 -1981
  449. package/backend/coverage/lcov-report/src/session-transfer/index.html +0 -131
  450. package/backend/coverage/lcov-report/src/session-transfer/session-transfer.module.ts.html +0 -160
  451. package/backend/coverage/lcov-report/src/session-transfer/session-transfer.service.ts.html +0 -883
  452. package/backend/coverage/lcov-report/src/sessions/dto/index.html +0 -116
  453. package/backend/coverage/lcov-report/src/sessions/dto/session.dto.ts.html +0 -769
  454. package/backend/coverage/lcov-report/src/sessions/index.html +0 -146
  455. package/backend/coverage/lcov-report/src/sessions/sessions.controller.ts.html +0 -1306
  456. package/backend/coverage/lcov-report/src/sessions/sessions.module.ts.html +0 -220
  457. package/backend/coverage/lcov-report/src/sessions/sessions.service.ts.html +0 -2797
  458. package/backend/coverage/lcov-report/src/sub-agents/dto/create-sub-agent.dto.ts.html +0 -355
  459. package/backend/coverage/lcov-report/src/sub-agents/dto/index.html +0 -131
  460. package/backend/coverage/lcov-report/src/sub-agents/dto/update-sub-agent.dto.ts.html +0 -295
  461. package/backend/coverage/lcov-report/src/sub-agents/index.html +0 -221
  462. package/backend/coverage/lcov-report/src/sub-agents/sub-agent-run.entity.ts.html +0 -463
  463. package/backend/coverage/lcov-report/src/sub-agents/sub-agent-runner.service.ts.html +0 -2428
  464. package/backend/coverage/lcov-report/src/sub-agents/sub-agent-runs.controller.ts.html +0 -580
  465. package/backend/coverage/lcov-report/src/sub-agents/sub-agent-runs.service.ts.html +0 -550
  466. package/backend/coverage/lcov-report/src/sub-agents/sub-agent.entity.ts.html +0 -475
  467. package/backend/coverage/lcov-report/src/sub-agents/sub-agents.controller.ts.html +0 -373
  468. package/backend/coverage/lcov-report/src/sub-agents/sub-agents.module.ts.html +0 -205
  469. package/backend/coverage/lcov-report/src/sub-agents/sub-agents.service.ts.html +0 -619
  470. package/backend/coverage/lcov-report/src/syntax-validation/index.html +0 -131
  471. package/backend/coverage/lcov-report/src/syntax-validation/syntax-validation.module.ts.html +0 -109
  472. package/backend/coverage/lcov-report/src/syntax-validation/syntax-validation.service.ts.html +0 -724
  473. package/backend/coverage/lcov-report/src/system-prompts/dto/index.html +0 -176
  474. package/backend/coverage/lcov-report/src/system-prompts/dto/set-enabled-mcp-tools.dto.ts.html +0 -157
  475. package/backend/coverage/lcov-report/src/system-prompts/dto/set-enabled-tools.dto.ts.html +0 -148
  476. package/backend/coverage/lcov-report/src/system-prompts/dto/system-prompt.dto.ts.html +0 -517
  477. package/backend/coverage/lcov-report/src/system-prompts/dto/toggle-mcp-tool.dto.ts.html +0 -121
  478. package/backend/coverage/lcov-report/src/system-prompts/dto/toggle-tool.dto.ts.html +0 -118
  479. package/backend/coverage/lcov-report/src/system-prompts/index.html +0 -146
  480. package/backend/coverage/lcov-report/src/system-prompts/system-prompts.controller.ts.html +0 -1060
  481. package/backend/coverage/lcov-report/src/system-prompts/system-prompts.module.ts.html +0 -160
  482. package/backend/coverage/lcov-report/src/system-prompts/system-prompts.service.ts.html +0 -2254
  483. package/backend/coverage/lcov-report/src/timeout.interceptor.ts.html +0 -178
  484. package/backend/coverage/lcov-report/src/tool-hooks/dto/create-tool-hook.dto.ts.html +0 -181
  485. package/backend/coverage/lcov-report/src/tool-hooks/dto/index.html +0 -131
  486. package/backend/coverage/lcov-report/src/tool-hooks/dto/update-tool-hook.dto.ts.html +0 -178
  487. package/backend/coverage/lcov-report/src/tool-hooks/index.html +0 -146
  488. package/backend/coverage/lcov-report/src/tool-hooks/tool-hooks.controller.ts.html +0 -481
  489. package/backend/coverage/lcov-report/src/tool-hooks/tool-hooks.module.ts.html +0 -127
  490. package/backend/coverage/lcov-report/src/tool-hooks/tool-hooks.service.ts.html +0 -1222
  491. package/backend/coverage/lcov-report/src/tracing.ts.html +0 -214
  492. package/backend/coverage/lcov-report/src/types/express-multer.d.ts.html +0 -130
  493. package/backend/coverage/lcov-report/src/types/index.html +0 -116
  494. package/backend/coverage/lcov-report/src/utils/ai-format-generator.ts.html +0 -253
  495. package/backend/coverage/lcov-report/src/utils/fuzzy-search.ts.html +0 -310
  496. package/backend/coverage/lcov-report/src/utils/index.html +0 -191
  497. package/backend/coverage/lcov-report/src/utils/index.ts.html +0 -100
  498. package/backend/coverage/lcov-report/src/utils/short-id.ts.html +0 -109
  499. package/backend/coverage/lcov-report/src/utils/spawn-with-kill.ts.html +0 -412
  500. package/backend/coverage/lcov-report/src/utils/trace.decorator.ts.html +0 -223
  501. package/backend/coverage/lcov-report/src/visual-editor/index.html +0 -146
  502. package/backend/coverage/lcov-report/src/visual-editor/visual-editor.controller.ts.html +0 -409
  503. package/backend/coverage/lcov-report/src/visual-editor/visual-editor.dto.ts.html +0 -130
  504. package/backend/coverage/lcov-report/src/visual-editor/visual-editor.module.ts.html +0 -118
  505. package/backend/coverage/lcov-report/src/workspace/dto/file-tree.dto.ts.html +0 -112
  506. package/backend/coverage/lcov-report/src/workspace/dto/index.html +0 -131
  507. package/backend/coverage/lcov-report/src/workspace/dto/search-workspace.dto.ts.html +0 -193
  508. package/backend/coverage/lcov-report/src/workspace/index.html +0 -146
  509. package/backend/coverage/lcov-report/src/workspace/workspace.controller.ts.html +0 -394
  510. package/backend/coverage/lcov-report/src/workspace/workspace.module.ts.html +0 -121
  511. package/backend/coverage/lcov-report/src/workspace/workspace.service.ts.html +0 -1027
  512. package/backend/coverage/lcov.info +0 -20220
  513. package/backend/packages/tokenpatch/CODEMAP.md +0 -25
  514. package/daemon/CODEMAP.md +0 -23
  515. package/visual-editor-proxy/CODEMAP.md +0 -21
@@ -1,1705 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for packages/gemini-core/src/code_assist/oauth2.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">packages/gemini-core/src/code_assist</a> oauth2.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">22.58% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>49/217</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">4.65% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>2/43</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">17.24% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>5/29</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">22.89% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>49/214</span>
50
- </div>
51
-
52
-
53
- </div>
54
- <p class="quiet">
55
- Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
- </p>
57
- <template id="filterTemplate">
58
- <div class="quiet">
59
- Filter:
60
- <input type="search" id="fileSearch">
61
- </div>
62
- </template>
63
- </div>
64
- <div class='status-line low'></div>
65
- <pre><table class="coverage">
66
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
- <a name='L2'></a><a href='#L2'>2</a>
68
- <a name='L3'></a><a href='#L3'>3</a>
69
- <a name='L4'></a><a href='#L4'>4</a>
70
- <a name='L5'></a><a href='#L5'>5</a>
71
- <a name='L6'></a><a href='#L6'>6</a>
72
- <a name='L7'></a><a href='#L7'>7</a>
73
- <a name='L8'></a><a href='#L8'>8</a>
74
- <a name='L9'></a><a href='#L9'>9</a>
75
- <a name='L10'></a><a href='#L10'>10</a>
76
- <a name='L11'></a><a href='#L11'>11</a>
77
- <a name='L12'></a><a href='#L12'>12</a>
78
- <a name='L13'></a><a href='#L13'>13</a>
79
- <a name='L14'></a><a href='#L14'>14</a>
80
- <a name='L15'></a><a href='#L15'>15</a>
81
- <a name='L16'></a><a href='#L16'>16</a>
82
- <a name='L17'></a><a href='#L17'>17</a>
83
- <a name='L18'></a><a href='#L18'>18</a>
84
- <a name='L19'></a><a href='#L19'>19</a>
85
- <a name='L20'></a><a href='#L20'>20</a>
86
- <a name='L21'></a><a href='#L21'>21</a>
87
- <a name='L22'></a><a href='#L22'>22</a>
88
- <a name='L23'></a><a href='#L23'>23</a>
89
- <a name='L24'></a><a href='#L24'>24</a>
90
- <a name='L25'></a><a href='#L25'>25</a>
91
- <a name='L26'></a><a href='#L26'>26</a>
92
- <a name='L27'></a><a href='#L27'>27</a>
93
- <a name='L28'></a><a href='#L28'>28</a>
94
- <a name='L29'></a><a href='#L29'>29</a>
95
- <a name='L30'></a><a href='#L30'>30</a>
96
- <a name='L31'></a><a href='#L31'>31</a>
97
- <a name='L32'></a><a href='#L32'>32</a>
98
- <a name='L33'></a><a href='#L33'>33</a>
99
- <a name='L34'></a><a href='#L34'>34</a>
100
- <a name='L35'></a><a href='#L35'>35</a>
101
- <a name='L36'></a><a href='#L36'>36</a>
102
- <a name='L37'></a><a href='#L37'>37</a>
103
- <a name='L38'></a><a href='#L38'>38</a>
104
- <a name='L39'></a><a href='#L39'>39</a>
105
- <a name='L40'></a><a href='#L40'>40</a>
106
- <a name='L41'></a><a href='#L41'>41</a>
107
- <a name='L42'></a><a href='#L42'>42</a>
108
- <a name='L43'></a><a href='#L43'>43</a>
109
- <a name='L44'></a><a href='#L44'>44</a>
110
- <a name='L45'></a><a href='#L45'>45</a>
111
- <a name='L46'></a><a href='#L46'>46</a>
112
- <a name='L47'></a><a href='#L47'>47</a>
113
- <a name='L48'></a><a href='#L48'>48</a>
114
- <a name='L49'></a><a href='#L49'>49</a>
115
- <a name='L50'></a><a href='#L50'>50</a>
116
- <a name='L51'></a><a href='#L51'>51</a>
117
- <a name='L52'></a><a href='#L52'>52</a>
118
- <a name='L53'></a><a href='#L53'>53</a>
119
- <a name='L54'></a><a href='#L54'>54</a>
120
- <a name='L55'></a><a href='#L55'>55</a>
121
- <a name='L56'></a><a href='#L56'>56</a>
122
- <a name='L57'></a><a href='#L57'>57</a>
123
- <a name='L58'></a><a href='#L58'>58</a>
124
- <a name='L59'></a><a href='#L59'>59</a>
125
- <a name='L60'></a><a href='#L60'>60</a>
126
- <a name='L61'></a><a href='#L61'>61</a>
127
- <a name='L62'></a><a href='#L62'>62</a>
128
- <a name='L63'></a><a href='#L63'>63</a>
129
- <a name='L64'></a><a href='#L64'>64</a>
130
- <a name='L65'></a><a href='#L65'>65</a>
131
- <a name='L66'></a><a href='#L66'>66</a>
132
- <a name='L67'></a><a href='#L67'>67</a>
133
- <a name='L68'></a><a href='#L68'>68</a>
134
- <a name='L69'></a><a href='#L69'>69</a>
135
- <a name='L70'></a><a href='#L70'>70</a>
136
- <a name='L71'></a><a href='#L71'>71</a>
137
- <a name='L72'></a><a href='#L72'>72</a>
138
- <a name='L73'></a><a href='#L73'>73</a>
139
- <a name='L74'></a><a href='#L74'>74</a>
140
- <a name='L75'></a><a href='#L75'>75</a>
141
- <a name='L76'></a><a href='#L76'>76</a>
142
- <a name='L77'></a><a href='#L77'>77</a>
143
- <a name='L78'></a><a href='#L78'>78</a>
144
- <a name='L79'></a><a href='#L79'>79</a>
145
- <a name='L80'></a><a href='#L80'>80</a>
146
- <a name='L81'></a><a href='#L81'>81</a>
147
- <a name='L82'></a><a href='#L82'>82</a>
148
- <a name='L83'></a><a href='#L83'>83</a>
149
- <a name='L84'></a><a href='#L84'>84</a>
150
- <a name='L85'></a><a href='#L85'>85</a>
151
- <a name='L86'></a><a href='#L86'>86</a>
152
- <a name='L87'></a><a href='#L87'>87</a>
153
- <a name='L88'></a><a href='#L88'>88</a>
154
- <a name='L89'></a><a href='#L89'>89</a>
155
- <a name='L90'></a><a href='#L90'>90</a>
156
- <a name='L91'></a><a href='#L91'>91</a>
157
- <a name='L92'></a><a href='#L92'>92</a>
158
- <a name='L93'></a><a href='#L93'>93</a>
159
- <a name='L94'></a><a href='#L94'>94</a>
160
- <a name='L95'></a><a href='#L95'>95</a>
161
- <a name='L96'></a><a href='#L96'>96</a>
162
- <a name='L97'></a><a href='#L97'>97</a>
163
- <a name='L98'></a><a href='#L98'>98</a>
164
- <a name='L99'></a><a href='#L99'>99</a>
165
- <a name='L100'></a><a href='#L100'>100</a>
166
- <a name='L101'></a><a href='#L101'>101</a>
167
- <a name='L102'></a><a href='#L102'>102</a>
168
- <a name='L103'></a><a href='#L103'>103</a>
169
- <a name='L104'></a><a href='#L104'>104</a>
170
- <a name='L105'></a><a href='#L105'>105</a>
171
- <a name='L106'></a><a href='#L106'>106</a>
172
- <a name='L107'></a><a href='#L107'>107</a>
173
- <a name='L108'></a><a href='#L108'>108</a>
174
- <a name='L109'></a><a href='#L109'>109</a>
175
- <a name='L110'></a><a href='#L110'>110</a>
176
- <a name='L111'></a><a href='#L111'>111</a>
177
- <a name='L112'></a><a href='#L112'>112</a>
178
- <a name='L113'></a><a href='#L113'>113</a>
179
- <a name='L114'></a><a href='#L114'>114</a>
180
- <a name='L115'></a><a href='#L115'>115</a>
181
- <a name='L116'></a><a href='#L116'>116</a>
182
- <a name='L117'></a><a href='#L117'>117</a>
183
- <a name='L118'></a><a href='#L118'>118</a>
184
- <a name='L119'></a><a href='#L119'>119</a>
185
- <a name='L120'></a><a href='#L120'>120</a>
186
- <a name='L121'></a><a href='#L121'>121</a>
187
- <a name='L122'></a><a href='#L122'>122</a>
188
- <a name='L123'></a><a href='#L123'>123</a>
189
- <a name='L124'></a><a href='#L124'>124</a>
190
- <a name='L125'></a><a href='#L125'>125</a>
191
- <a name='L126'></a><a href='#L126'>126</a>
192
- <a name='L127'></a><a href='#L127'>127</a>
193
- <a name='L128'></a><a href='#L128'>128</a>
194
- <a name='L129'></a><a href='#L129'>129</a>
195
- <a name='L130'></a><a href='#L130'>130</a>
196
- <a name='L131'></a><a href='#L131'>131</a>
197
- <a name='L132'></a><a href='#L132'>132</a>
198
- <a name='L133'></a><a href='#L133'>133</a>
199
- <a name='L134'></a><a href='#L134'>134</a>
200
- <a name='L135'></a><a href='#L135'>135</a>
201
- <a name='L136'></a><a href='#L136'>136</a>
202
- <a name='L137'></a><a href='#L137'>137</a>
203
- <a name='L138'></a><a href='#L138'>138</a>
204
- <a name='L139'></a><a href='#L139'>139</a>
205
- <a name='L140'></a><a href='#L140'>140</a>
206
- <a name='L141'></a><a href='#L141'>141</a>
207
- <a name='L142'></a><a href='#L142'>142</a>
208
- <a name='L143'></a><a href='#L143'>143</a>
209
- <a name='L144'></a><a href='#L144'>144</a>
210
- <a name='L145'></a><a href='#L145'>145</a>
211
- <a name='L146'></a><a href='#L146'>146</a>
212
- <a name='L147'></a><a href='#L147'>147</a>
213
- <a name='L148'></a><a href='#L148'>148</a>
214
- <a name='L149'></a><a href='#L149'>149</a>
215
- <a name='L150'></a><a href='#L150'>150</a>
216
- <a name='L151'></a><a href='#L151'>151</a>
217
- <a name='L152'></a><a href='#L152'>152</a>
218
- <a name='L153'></a><a href='#L153'>153</a>
219
- <a name='L154'></a><a href='#L154'>154</a>
220
- <a name='L155'></a><a href='#L155'>155</a>
221
- <a name='L156'></a><a href='#L156'>156</a>
222
- <a name='L157'></a><a href='#L157'>157</a>
223
- <a name='L158'></a><a href='#L158'>158</a>
224
- <a name='L159'></a><a href='#L159'>159</a>
225
- <a name='L160'></a><a href='#L160'>160</a>
226
- <a name='L161'></a><a href='#L161'>161</a>
227
- <a name='L162'></a><a href='#L162'>162</a>
228
- <a name='L163'></a><a href='#L163'>163</a>
229
- <a name='L164'></a><a href='#L164'>164</a>
230
- <a name='L165'></a><a href='#L165'>165</a>
231
- <a name='L166'></a><a href='#L166'>166</a>
232
- <a name='L167'></a><a href='#L167'>167</a>
233
- <a name='L168'></a><a href='#L168'>168</a>
234
- <a name='L169'></a><a href='#L169'>169</a>
235
- <a name='L170'></a><a href='#L170'>170</a>
236
- <a name='L171'></a><a href='#L171'>171</a>
237
- <a name='L172'></a><a href='#L172'>172</a>
238
- <a name='L173'></a><a href='#L173'>173</a>
239
- <a name='L174'></a><a href='#L174'>174</a>
240
- <a name='L175'></a><a href='#L175'>175</a>
241
- <a name='L176'></a><a href='#L176'>176</a>
242
- <a name='L177'></a><a href='#L177'>177</a>
243
- <a name='L178'></a><a href='#L178'>178</a>
244
- <a name='L179'></a><a href='#L179'>179</a>
245
- <a name='L180'></a><a href='#L180'>180</a>
246
- <a name='L181'></a><a href='#L181'>181</a>
247
- <a name='L182'></a><a href='#L182'>182</a>
248
- <a name='L183'></a><a href='#L183'>183</a>
249
- <a name='L184'></a><a href='#L184'>184</a>
250
- <a name='L185'></a><a href='#L185'>185</a>
251
- <a name='L186'></a><a href='#L186'>186</a>
252
- <a name='L187'></a><a href='#L187'>187</a>
253
- <a name='L188'></a><a href='#L188'>188</a>
254
- <a name='L189'></a><a href='#L189'>189</a>
255
- <a name='L190'></a><a href='#L190'>190</a>
256
- <a name='L191'></a><a href='#L191'>191</a>
257
- <a name='L192'></a><a href='#L192'>192</a>
258
- <a name='L193'></a><a href='#L193'>193</a>
259
- <a name='L194'></a><a href='#L194'>194</a>
260
- <a name='L195'></a><a href='#L195'>195</a>
261
- <a name='L196'></a><a href='#L196'>196</a>
262
- <a name='L197'></a><a href='#L197'>197</a>
263
- <a name='L198'></a><a href='#L198'>198</a>
264
- <a name='L199'></a><a href='#L199'>199</a>
265
- <a name='L200'></a><a href='#L200'>200</a>
266
- <a name='L201'></a><a href='#L201'>201</a>
267
- <a name='L202'></a><a href='#L202'>202</a>
268
- <a name='L203'></a><a href='#L203'>203</a>
269
- <a name='L204'></a><a href='#L204'>204</a>
270
- <a name='L205'></a><a href='#L205'>205</a>
271
- <a name='L206'></a><a href='#L206'>206</a>
272
- <a name='L207'></a><a href='#L207'>207</a>
273
- <a name='L208'></a><a href='#L208'>208</a>
274
- <a name='L209'></a><a href='#L209'>209</a>
275
- <a name='L210'></a><a href='#L210'>210</a>
276
- <a name='L211'></a><a href='#L211'>211</a>
277
- <a name='L212'></a><a href='#L212'>212</a>
278
- <a name='L213'></a><a href='#L213'>213</a>
279
- <a name='L214'></a><a href='#L214'>214</a>
280
- <a name='L215'></a><a href='#L215'>215</a>
281
- <a name='L216'></a><a href='#L216'>216</a>
282
- <a name='L217'></a><a href='#L217'>217</a>
283
- <a name='L218'></a><a href='#L218'>218</a>
284
- <a name='L219'></a><a href='#L219'>219</a>
285
- <a name='L220'></a><a href='#L220'>220</a>
286
- <a name='L221'></a><a href='#L221'>221</a>
287
- <a name='L222'></a><a href='#L222'>222</a>
288
- <a name='L223'></a><a href='#L223'>223</a>
289
- <a name='L224'></a><a href='#L224'>224</a>
290
- <a name='L225'></a><a href='#L225'>225</a>
291
- <a name='L226'></a><a href='#L226'>226</a>
292
- <a name='L227'></a><a href='#L227'>227</a>
293
- <a name='L228'></a><a href='#L228'>228</a>
294
- <a name='L229'></a><a href='#L229'>229</a>
295
- <a name='L230'></a><a href='#L230'>230</a>
296
- <a name='L231'></a><a href='#L231'>231</a>
297
- <a name='L232'></a><a href='#L232'>232</a>
298
- <a name='L233'></a><a href='#L233'>233</a>
299
- <a name='L234'></a><a href='#L234'>234</a>
300
- <a name='L235'></a><a href='#L235'>235</a>
301
- <a name='L236'></a><a href='#L236'>236</a>
302
- <a name='L237'></a><a href='#L237'>237</a>
303
- <a name='L238'></a><a href='#L238'>238</a>
304
- <a name='L239'></a><a href='#L239'>239</a>
305
- <a name='L240'></a><a href='#L240'>240</a>
306
- <a name='L241'></a><a href='#L241'>241</a>
307
- <a name='L242'></a><a href='#L242'>242</a>
308
- <a name='L243'></a><a href='#L243'>243</a>
309
- <a name='L244'></a><a href='#L244'>244</a>
310
- <a name='L245'></a><a href='#L245'>245</a>
311
- <a name='L246'></a><a href='#L246'>246</a>
312
- <a name='L247'></a><a href='#L247'>247</a>
313
- <a name='L248'></a><a href='#L248'>248</a>
314
- <a name='L249'></a><a href='#L249'>249</a>
315
- <a name='L250'></a><a href='#L250'>250</a>
316
- <a name='L251'></a><a href='#L251'>251</a>
317
- <a name='L252'></a><a href='#L252'>252</a>
318
- <a name='L253'></a><a href='#L253'>253</a>
319
- <a name='L254'></a><a href='#L254'>254</a>
320
- <a name='L255'></a><a href='#L255'>255</a>
321
- <a name='L256'></a><a href='#L256'>256</a>
322
- <a name='L257'></a><a href='#L257'>257</a>
323
- <a name='L258'></a><a href='#L258'>258</a>
324
- <a name='L259'></a><a href='#L259'>259</a>
325
- <a name='L260'></a><a href='#L260'>260</a>
326
- <a name='L261'></a><a href='#L261'>261</a>
327
- <a name='L262'></a><a href='#L262'>262</a>
328
- <a name='L263'></a><a href='#L263'>263</a>
329
- <a name='L264'></a><a href='#L264'>264</a>
330
- <a name='L265'></a><a href='#L265'>265</a>
331
- <a name='L266'></a><a href='#L266'>266</a>
332
- <a name='L267'></a><a href='#L267'>267</a>
333
- <a name='L268'></a><a href='#L268'>268</a>
334
- <a name='L269'></a><a href='#L269'>269</a>
335
- <a name='L270'></a><a href='#L270'>270</a>
336
- <a name='L271'></a><a href='#L271'>271</a>
337
- <a name='L272'></a><a href='#L272'>272</a>
338
- <a name='L273'></a><a href='#L273'>273</a>
339
- <a name='L274'></a><a href='#L274'>274</a>
340
- <a name='L275'></a><a href='#L275'>275</a>
341
- <a name='L276'></a><a href='#L276'>276</a>
342
- <a name='L277'></a><a href='#L277'>277</a>
343
- <a name='L278'></a><a href='#L278'>278</a>
344
- <a name='L279'></a><a href='#L279'>279</a>
345
- <a name='L280'></a><a href='#L280'>280</a>
346
- <a name='L281'></a><a href='#L281'>281</a>
347
- <a name='L282'></a><a href='#L282'>282</a>
348
- <a name='L283'></a><a href='#L283'>283</a>
349
- <a name='L284'></a><a href='#L284'>284</a>
350
- <a name='L285'></a><a href='#L285'>285</a>
351
- <a name='L286'></a><a href='#L286'>286</a>
352
- <a name='L287'></a><a href='#L287'>287</a>
353
- <a name='L288'></a><a href='#L288'>288</a>
354
- <a name='L289'></a><a href='#L289'>289</a>
355
- <a name='L290'></a><a href='#L290'>290</a>
356
- <a name='L291'></a><a href='#L291'>291</a>
357
- <a name='L292'></a><a href='#L292'>292</a>
358
- <a name='L293'></a><a href='#L293'>293</a>
359
- <a name='L294'></a><a href='#L294'>294</a>
360
- <a name='L295'></a><a href='#L295'>295</a>
361
- <a name='L296'></a><a href='#L296'>296</a>
362
- <a name='L297'></a><a href='#L297'>297</a>
363
- <a name='L298'></a><a href='#L298'>298</a>
364
- <a name='L299'></a><a href='#L299'>299</a>
365
- <a name='L300'></a><a href='#L300'>300</a>
366
- <a name='L301'></a><a href='#L301'>301</a>
367
- <a name='L302'></a><a href='#L302'>302</a>
368
- <a name='L303'></a><a href='#L303'>303</a>
369
- <a name='L304'></a><a href='#L304'>304</a>
370
- <a name='L305'></a><a href='#L305'>305</a>
371
- <a name='L306'></a><a href='#L306'>306</a>
372
- <a name='L307'></a><a href='#L307'>307</a>
373
- <a name='L308'></a><a href='#L308'>308</a>
374
- <a name='L309'></a><a href='#L309'>309</a>
375
- <a name='L310'></a><a href='#L310'>310</a>
376
- <a name='L311'></a><a href='#L311'>311</a>
377
- <a name='L312'></a><a href='#L312'>312</a>
378
- <a name='L313'></a><a href='#L313'>313</a>
379
- <a name='L314'></a><a href='#L314'>314</a>
380
- <a name='L315'></a><a href='#L315'>315</a>
381
- <a name='L316'></a><a href='#L316'>316</a>
382
- <a name='L317'></a><a href='#L317'>317</a>
383
- <a name='L318'></a><a href='#L318'>318</a>
384
- <a name='L319'></a><a href='#L319'>319</a>
385
- <a name='L320'></a><a href='#L320'>320</a>
386
- <a name='L321'></a><a href='#L321'>321</a>
387
- <a name='L322'></a><a href='#L322'>322</a>
388
- <a name='L323'></a><a href='#L323'>323</a>
389
- <a name='L324'></a><a href='#L324'>324</a>
390
- <a name='L325'></a><a href='#L325'>325</a>
391
- <a name='L326'></a><a href='#L326'>326</a>
392
- <a name='L327'></a><a href='#L327'>327</a>
393
- <a name='L328'></a><a href='#L328'>328</a>
394
- <a name='L329'></a><a href='#L329'>329</a>
395
- <a name='L330'></a><a href='#L330'>330</a>
396
- <a name='L331'></a><a href='#L331'>331</a>
397
- <a name='L332'></a><a href='#L332'>332</a>
398
- <a name='L333'></a><a href='#L333'>333</a>
399
- <a name='L334'></a><a href='#L334'>334</a>
400
- <a name='L335'></a><a href='#L335'>335</a>
401
- <a name='L336'></a><a href='#L336'>336</a>
402
- <a name='L337'></a><a href='#L337'>337</a>
403
- <a name='L338'></a><a href='#L338'>338</a>
404
- <a name='L339'></a><a href='#L339'>339</a>
405
- <a name='L340'></a><a href='#L340'>340</a>
406
- <a name='L341'></a><a href='#L341'>341</a>
407
- <a name='L342'></a><a href='#L342'>342</a>
408
- <a name='L343'></a><a href='#L343'>343</a>
409
- <a name='L344'></a><a href='#L344'>344</a>
410
- <a name='L345'></a><a href='#L345'>345</a>
411
- <a name='L346'></a><a href='#L346'>346</a>
412
- <a name='L347'></a><a href='#L347'>347</a>
413
- <a name='L348'></a><a href='#L348'>348</a>
414
- <a name='L349'></a><a href='#L349'>349</a>
415
- <a name='L350'></a><a href='#L350'>350</a>
416
- <a name='L351'></a><a href='#L351'>351</a>
417
- <a name='L352'></a><a href='#L352'>352</a>
418
- <a name='L353'></a><a href='#L353'>353</a>
419
- <a name='L354'></a><a href='#L354'>354</a>
420
- <a name='L355'></a><a href='#L355'>355</a>
421
- <a name='L356'></a><a href='#L356'>356</a>
422
- <a name='L357'></a><a href='#L357'>357</a>
423
- <a name='L358'></a><a href='#L358'>358</a>
424
- <a name='L359'></a><a href='#L359'>359</a>
425
- <a name='L360'></a><a href='#L360'>360</a>
426
- <a name='L361'></a><a href='#L361'>361</a>
427
- <a name='L362'></a><a href='#L362'>362</a>
428
- <a name='L363'></a><a href='#L363'>363</a>
429
- <a name='L364'></a><a href='#L364'>364</a>
430
- <a name='L365'></a><a href='#L365'>365</a>
431
- <a name='L366'></a><a href='#L366'>366</a>
432
- <a name='L367'></a><a href='#L367'>367</a>
433
- <a name='L368'></a><a href='#L368'>368</a>
434
- <a name='L369'></a><a href='#L369'>369</a>
435
- <a name='L370'></a><a href='#L370'>370</a>
436
- <a name='L371'></a><a href='#L371'>371</a>
437
- <a name='L372'></a><a href='#L372'>372</a>
438
- <a name='L373'></a><a href='#L373'>373</a>
439
- <a name='L374'></a><a href='#L374'>374</a>
440
- <a name='L375'></a><a href='#L375'>375</a>
441
- <a name='L376'></a><a href='#L376'>376</a>
442
- <a name='L377'></a><a href='#L377'>377</a>
443
- <a name='L378'></a><a href='#L378'>378</a>
444
- <a name='L379'></a><a href='#L379'>379</a>
445
- <a name='L380'></a><a href='#L380'>380</a>
446
- <a name='L381'></a><a href='#L381'>381</a>
447
- <a name='L382'></a><a href='#L382'>382</a>
448
- <a name='L383'></a><a href='#L383'>383</a>
449
- <a name='L384'></a><a href='#L384'>384</a>
450
- <a name='L385'></a><a href='#L385'>385</a>
451
- <a name='L386'></a><a href='#L386'>386</a>
452
- <a name='L387'></a><a href='#L387'>387</a>
453
- <a name='L388'></a><a href='#L388'>388</a>
454
- <a name='L389'></a><a href='#L389'>389</a>
455
- <a name='L390'></a><a href='#L390'>390</a>
456
- <a name='L391'></a><a href='#L391'>391</a>
457
- <a name='L392'></a><a href='#L392'>392</a>
458
- <a name='L393'></a><a href='#L393'>393</a>
459
- <a name='L394'></a><a href='#L394'>394</a>
460
- <a name='L395'></a><a href='#L395'>395</a>
461
- <a name='L396'></a><a href='#L396'>396</a>
462
- <a name='L397'></a><a href='#L397'>397</a>
463
- <a name='L398'></a><a href='#L398'>398</a>
464
- <a name='L399'></a><a href='#L399'>399</a>
465
- <a name='L400'></a><a href='#L400'>400</a>
466
- <a name='L401'></a><a href='#L401'>401</a>
467
- <a name='L402'></a><a href='#L402'>402</a>
468
- <a name='L403'></a><a href='#L403'>403</a>
469
- <a name='L404'></a><a href='#L404'>404</a>
470
- <a name='L405'></a><a href='#L405'>405</a>
471
- <a name='L406'></a><a href='#L406'>406</a>
472
- <a name='L407'></a><a href='#L407'>407</a>
473
- <a name='L408'></a><a href='#L408'>408</a>
474
- <a name='L409'></a><a href='#L409'>409</a>
475
- <a name='L410'></a><a href='#L410'>410</a>
476
- <a name='L411'></a><a href='#L411'>411</a>
477
- <a name='L412'></a><a href='#L412'>412</a>
478
- <a name='L413'></a><a href='#L413'>413</a>
479
- <a name='L414'></a><a href='#L414'>414</a>
480
- <a name='L415'></a><a href='#L415'>415</a>
481
- <a name='L416'></a><a href='#L416'>416</a>
482
- <a name='L417'></a><a href='#L417'>417</a>
483
- <a name='L418'></a><a href='#L418'>418</a>
484
- <a name='L419'></a><a href='#L419'>419</a>
485
- <a name='L420'></a><a href='#L420'>420</a>
486
- <a name='L421'></a><a href='#L421'>421</a>
487
- <a name='L422'></a><a href='#L422'>422</a>
488
- <a name='L423'></a><a href='#L423'>423</a>
489
- <a name='L424'></a><a href='#L424'>424</a>
490
- <a name='L425'></a><a href='#L425'>425</a>
491
- <a name='L426'></a><a href='#L426'>426</a>
492
- <a name='L427'></a><a href='#L427'>427</a>
493
- <a name='L428'></a><a href='#L428'>428</a>
494
- <a name='L429'></a><a href='#L429'>429</a>
495
- <a name='L430'></a><a href='#L430'>430</a>
496
- <a name='L431'></a><a href='#L431'>431</a>
497
- <a name='L432'></a><a href='#L432'>432</a>
498
- <a name='L433'></a><a href='#L433'>433</a>
499
- <a name='L434'></a><a href='#L434'>434</a>
500
- <a name='L435'></a><a href='#L435'>435</a>
501
- <a name='L436'></a><a href='#L436'>436</a>
502
- <a name='L437'></a><a href='#L437'>437</a>
503
- <a name='L438'></a><a href='#L438'>438</a>
504
- <a name='L439'></a><a href='#L439'>439</a>
505
- <a name='L440'></a><a href='#L440'>440</a>
506
- <a name='L441'></a><a href='#L441'>441</a>
507
- <a name='L442'></a><a href='#L442'>442</a>
508
- <a name='L443'></a><a href='#L443'>443</a>
509
- <a name='L444'></a><a href='#L444'>444</a>
510
- <a name='L445'></a><a href='#L445'>445</a>
511
- <a name='L446'></a><a href='#L446'>446</a>
512
- <a name='L447'></a><a href='#L447'>447</a>
513
- <a name='L448'></a><a href='#L448'>448</a>
514
- <a name='L449'></a><a href='#L449'>449</a>
515
- <a name='L450'></a><a href='#L450'>450</a>
516
- <a name='L451'></a><a href='#L451'>451</a>
517
- <a name='L452'></a><a href='#L452'>452</a>
518
- <a name='L453'></a><a href='#L453'>453</a>
519
- <a name='L454'></a><a href='#L454'>454</a>
520
- <a name='L455'></a><a href='#L455'>455</a>
521
- <a name='L456'></a><a href='#L456'>456</a>
522
- <a name='L457'></a><a href='#L457'>457</a>
523
- <a name='L458'></a><a href='#L458'>458</a>
524
- <a name='L459'></a><a href='#L459'>459</a>
525
- <a name='L460'></a><a href='#L460'>460</a>
526
- <a name='L461'></a><a href='#L461'>461</a>
527
- <a name='L462'></a><a href='#L462'>462</a>
528
- <a name='L463'></a><a href='#L463'>463</a>
529
- <a name='L464'></a><a href='#L464'>464</a>
530
- <a name='L465'></a><a href='#L465'>465</a>
531
- <a name='L466'></a><a href='#L466'>466</a>
532
- <a name='L467'></a><a href='#L467'>467</a>
533
- <a name='L468'></a><a href='#L468'>468</a>
534
- <a name='L469'></a><a href='#L469'>469</a>
535
- <a name='L470'></a><a href='#L470'>470</a>
536
- <a name='L471'></a><a href='#L471'>471</a>
537
- <a name='L472'></a><a href='#L472'>472</a>
538
- <a name='L473'></a><a href='#L473'>473</a>
539
- <a name='L474'></a><a href='#L474'>474</a>
540
- <a name='L475'></a><a href='#L475'>475</a>
541
- <a name='L476'></a><a href='#L476'>476</a>
542
- <a name='L477'></a><a href='#L477'>477</a>
543
- <a name='L478'></a><a href='#L478'>478</a>
544
- <a name='L479'></a><a href='#L479'>479</a>
545
- <a name='L480'></a><a href='#L480'>480</a>
546
- <a name='L481'></a><a href='#L481'>481</a>
547
- <a name='L482'></a><a href='#L482'>482</a>
548
- <a name='L483'></a><a href='#L483'>483</a>
549
- <a name='L484'></a><a href='#L484'>484</a>
550
- <a name='L485'></a><a href='#L485'>485</a>
551
- <a name='L486'></a><a href='#L486'>486</a>
552
- <a name='L487'></a><a href='#L487'>487</a>
553
- <a name='L488'></a><a href='#L488'>488</a>
554
- <a name='L489'></a><a href='#L489'>489</a>
555
- <a name='L490'></a><a href='#L490'>490</a>
556
- <a name='L491'></a><a href='#L491'>491</a>
557
- <a name='L492'></a><a href='#L492'>492</a>
558
- <a name='L493'></a><a href='#L493'>493</a>
559
- <a name='L494'></a><a href='#L494'>494</a>
560
- <a name='L495'></a><a href='#L495'>495</a>
561
- <a name='L496'></a><a href='#L496'>496</a>
562
- <a name='L497'></a><a href='#L497'>497</a>
563
- <a name='L498'></a><a href='#L498'>498</a>
564
- <a name='L499'></a><a href='#L499'>499</a>
565
- <a name='L500'></a><a href='#L500'>500</a>
566
- <a name='L501'></a><a href='#L501'>501</a>
567
- <a name='L502'></a><a href='#L502'>502</a>
568
- <a name='L503'></a><a href='#L503'>503</a>
569
- <a name='L504'></a><a href='#L504'>504</a>
570
- <a name='L505'></a><a href='#L505'>505</a>
571
- <a name='L506'></a><a href='#L506'>506</a>
572
- <a name='L507'></a><a href='#L507'>507</a>
573
- <a name='L508'></a><a href='#L508'>508</a>
574
- <a name='L509'></a><a href='#L509'>509</a>
575
- <a name='L510'></a><a href='#L510'>510</a>
576
- <a name='L511'></a><a href='#L511'>511</a>
577
- <a name='L512'></a><a href='#L512'>512</a>
578
- <a name='L513'></a><a href='#L513'>513</a>
579
- <a name='L514'></a><a href='#L514'>514</a>
580
- <a name='L515'></a><a href='#L515'>515</a>
581
- <a name='L516'></a><a href='#L516'>516</a>
582
- <a name='L517'></a><a href='#L517'>517</a>
583
- <a name='L518'></a><a href='#L518'>518</a>
584
- <a name='L519'></a><a href='#L519'>519</a>
585
- <a name='L520'></a><a href='#L520'>520</a>
586
- <a name='L521'></a><a href='#L521'>521</a>
587
- <a name='L522'></a><a href='#L522'>522</a>
588
- <a name='L523'></a><a href='#L523'>523</a>
589
- <a name='L524'></a><a href='#L524'>524</a>
590
- <a name='L525'></a><a href='#L525'>525</a>
591
- <a name='L526'></a><a href='#L526'>526</a>
592
- <a name='L527'></a><a href='#L527'>527</a>
593
- <a name='L528'></a><a href='#L528'>528</a>
594
- <a name='L529'></a><a href='#L529'>529</a>
595
- <a name='L530'></a><a href='#L530'>530</a>
596
- <a name='L531'></a><a href='#L531'>531</a>
597
- <a name='L532'></a><a href='#L532'>532</a>
598
- <a name='L533'></a><a href='#L533'>533</a>
599
- <a name='L534'></a><a href='#L534'>534</a>
600
- <a name='L535'></a><a href='#L535'>535</a>
601
- <a name='L536'></a><a href='#L536'>536</a>
602
- <a name='L537'></a><a href='#L537'>537</a>
603
- <a name='L538'></a><a href='#L538'>538</a>
604
- <a name='L539'></a><a href='#L539'>539</a>
605
- <a name='L540'></a><a href='#L540'>540</a>
606
- <a name='L541'></a><a href='#L541'>541</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
607
- <span class="cline-any cline-neutral">&nbsp;</span>
608
- <span class="cline-any cline-neutral">&nbsp;</span>
609
- <span class="cline-any cline-neutral">&nbsp;</span>
610
- <span class="cline-any cline-neutral">&nbsp;</span>
611
- <span class="cline-any cline-neutral">&nbsp;</span>
612
- <span class="cline-any cline-neutral">&nbsp;</span>
613
- <span class="cline-any cline-yes">6x</span>
614
- <span class="cline-any cline-neutral">&nbsp;</span>
615
- <span class="cline-any cline-neutral">&nbsp;</span>
616
- <span class="cline-any cline-neutral">&nbsp;</span>
617
- <span class="cline-any cline-neutral">&nbsp;</span>
618
- <span class="cline-any cline-yes">6x</span>
619
- <span class="cline-any cline-yes">6x</span>
620
- <span class="cline-any cline-yes">6x</span>
621
- <span class="cline-any cline-yes">6x</span>
622
- <span class="cline-any cline-yes">6x</span>
623
- <span class="cline-any cline-yes">6x</span>
624
- <span class="cline-any cline-neutral">&nbsp;</span>
625
- <span class="cline-any cline-yes">6x</span>
626
- <span class="cline-any cline-yes">6x</span>
627
- <span class="cline-any cline-yes">6x</span>
628
- <span class="cline-any cline-yes">6x</span>
629
- <span class="cline-any cline-yes">6x</span>
630
- <span class="cline-any cline-yes">6x</span>
631
- <span class="cline-any cline-yes">6x</span>
632
- <span class="cline-any cline-neutral">&nbsp;</span>
633
- <span class="cline-any cline-yes">6x</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-yes">6x</span>
638
- <span class="cline-any cline-neutral">&nbsp;</span>
639
- <span class="cline-any cline-neutral">&nbsp;</span>
640
- <span class="cline-any cline-neutral">&nbsp;</span>
641
- <span class="cline-any cline-neutral">&nbsp;</span>
642
- <span class="cline-any cline-neutral">&nbsp;</span>
643
- <span class="cline-any cline-neutral">&nbsp;</span>
644
- <span class="cline-any cline-neutral">&nbsp;</span>
645
- <span class="cline-any cline-yes">6x</span>
646
- <span class="cline-any cline-neutral">&nbsp;</span>
647
- <span class="cline-any cline-neutral">&nbsp;</span>
648
- <span class="cline-any cline-yes">6x</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-neutral">&nbsp;</span>
653
- <span class="cline-any cline-neutral">&nbsp;</span>
654
- <span class="cline-any cline-yes">6x</span>
655
- <span class="cline-any cline-neutral">&nbsp;</span>
656
- <span class="cline-any cline-yes">6x</span>
657
- <span class="cline-any cline-neutral">&nbsp;</span>
658
- <span class="cline-any cline-yes">6x</span>
659
- <span class="cline-any cline-neutral">&nbsp;</span>
660
- <span class="cline-any cline-neutral">&nbsp;</span>
661
- <span class="cline-any cline-neutral">&nbsp;</span>
662
- <span class="cline-any cline-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-yes">6x</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-yes">12x</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-neutral">&nbsp;</span>
678
- <span class="cline-any cline-neutral">&nbsp;</span>
679
- <span class="cline-any cline-neutral">&nbsp;</span>
680
- <span class="cline-any cline-yes">6x</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">6x</span>
685
- <span class="cline-any cline-neutral">&nbsp;</span>
686
- <span class="cline-any cline-yes">6x</span>
687
- <span class="cline-any cline-neutral">&nbsp;</span>
688
- <span class="cline-any cline-neutral">&nbsp;</span>
689
- <span class="cline-any cline-neutral">&nbsp;</span>
690
- <span class="cline-any cline-no">&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-no">&nbsp;</span>
694
- <span class="cline-any cline-no">&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-yes">6x</span>
698
- <span class="cline-any cline-no">&nbsp;</span>
699
- <span class="cline-any cline-no">&nbsp;</span>
700
- <span class="cline-any cline-neutral">&nbsp;</span>
701
- <span class="cline-any cline-no">&nbsp;</span>
702
- <span class="cline-any cline-neutral">&nbsp;</span>
703
- <span class="cline-any cline-neutral">&nbsp;</span>
704
- <span class="cline-any cline-neutral">&nbsp;</span>
705
- <span class="cline-any cline-neutral">&nbsp;</span>
706
- <span class="cline-any cline-yes">6x</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-no">&nbsp;</span>
710
- <span class="cline-any cline-no">&nbsp;</span>
711
- <span class="cline-any cline-no">&nbsp;</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-no">&nbsp;</span>
715
- <span class="cline-any cline-neutral">&nbsp;</span>
716
- <span class="cline-any cline-neutral">&nbsp;</span>
717
- <span class="cline-any cline-no">&nbsp;</span>
718
- <span class="cline-any cline-no">&nbsp;</span>
719
- <span class="cline-any cline-neutral">&nbsp;</span>
720
- <span class="cline-any cline-neutral">&nbsp;</span>
721
- <span class="cline-any cline-neutral">&nbsp;</span>
722
- <span class="cline-any cline-neutral">&nbsp;</span>
723
- <span class="cline-any cline-neutral">&nbsp;</span>
724
- <span class="cline-any cline-yes">4x</span>
725
- <span class="cline-any cline-no">&nbsp;</span>
726
- <span class="cline-any cline-no">&nbsp;</span>
727
- <span class="cline-any cline-no">&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-no">&nbsp;</span>
732
- <span class="cline-any cline-no">&nbsp;</span>
733
- <span class="cline-any cline-neutral">&nbsp;</span>
734
- <span class="cline-any cline-neutral">&nbsp;</span>
735
- <span class="cline-any cline-no">&nbsp;</span>
736
- <span class="cline-any cline-neutral">&nbsp;</span>
737
- <span class="cline-any cline-no">&nbsp;</span>
738
- <span class="cline-any cline-neutral">&nbsp;</span>
739
- <span class="cline-any cline-neutral">&nbsp;</span>
740
- <span class="cline-any cline-neutral">&nbsp;</span>
741
- <span class="cline-any cline-neutral">&nbsp;</span>
742
- <span class="cline-any cline-neutral">&nbsp;</span>
743
- <span class="cline-any cline-neutral">&nbsp;</span>
744
- <span class="cline-any cline-neutral">&nbsp;</span>
745
- <span class="cline-any cline-yes">4x</span>
746
- <span class="cline-any cline-no">&nbsp;</span>
747
- <span class="cline-any cline-no">&nbsp;</span>
748
- <span class="cline-any cline-no">&nbsp;</span>
749
- <span class="cline-any cline-no">&nbsp;</span>
750
- <span class="cline-any cline-no">&nbsp;</span>
751
- <span class="cline-any cline-no">&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-no">&nbsp;</span>
758
- <span class="cline-any cline-no">&nbsp;</span>
759
- <span class="cline-any cline-neutral">&nbsp;</span>
760
- <span class="cline-any cline-neutral">&nbsp;</span>
761
- <span class="cline-any cline-neutral">&nbsp;</span>
762
- <span class="cline-any cline-neutral">&nbsp;</span>
763
- <span class="cline-any cline-no">&nbsp;</span>
764
- <span class="cline-any cline-neutral">&nbsp;</span>
765
- <span class="cline-any cline-no">&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-no">&nbsp;</span>
771
- <span class="cline-any cline-no">&nbsp;</span>
772
- <span class="cline-any cline-neutral">&nbsp;</span>
773
- <span class="cline-any cline-neutral">&nbsp;</span>
774
- <span class="cline-any cline-neutral">&nbsp;</span>
775
- <span class="cline-any cline-no">&nbsp;</span>
776
- <span class="cline-any cline-neutral">&nbsp;</span>
777
- <span class="cline-any cline-neutral">&nbsp;</span>
778
- <span class="cline-any cline-neutral">&nbsp;</span>
779
- <span class="cline-any cline-neutral">&nbsp;</span>
780
- <span class="cline-any cline-neutral">&nbsp;</span>
781
- <span class="cline-any cline-no">&nbsp;</span>
782
- <span class="cline-any cline-no">&nbsp;</span>
783
- <span class="cline-any cline-neutral">&nbsp;</span>
784
- <span class="cline-any cline-neutral">&nbsp;</span>
785
- <span class="cline-any cline-no">&nbsp;</span>
786
- <span class="cline-any cline-neutral">&nbsp;</span>
787
- <span class="cline-any cline-neutral">&nbsp;</span>
788
- <span class="cline-any cline-no">&nbsp;</span>
789
- <span class="cline-any cline-neutral">&nbsp;</span>
790
- <span class="cline-any cline-neutral">&nbsp;</span>
791
- <span class="cline-any cline-neutral">&nbsp;</span>
792
- <span class="cline-any cline-neutral">&nbsp;</span>
793
- <span class="cline-any cline-neutral">&nbsp;</span>
794
- <span class="cline-any cline-no">&nbsp;</span>
795
- <span class="cline-any cline-neutral">&nbsp;</span>
796
- <span class="cline-any cline-neutral">&nbsp;</span>
797
- <span class="cline-any cline-neutral">&nbsp;</span>
798
- <span class="cline-any cline-no">&nbsp;</span>
799
- <span class="cline-any cline-neutral">&nbsp;</span>
800
- <span class="cline-any cline-neutral">&nbsp;</span>
801
- <span class="cline-any cline-no">&nbsp;</span>
802
- <span class="cline-any cline-no">&nbsp;</span>
803
- <span class="cline-any cline-no">&nbsp;</span>
804
- <span class="cline-any cline-no">&nbsp;</span>
805
- <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
810
- <span class="cline-any cline-neutral">&nbsp;</span>
811
- <span class="cline-any cline-neutral">&nbsp;</span>
812
- <span class="cline-any cline-neutral">&nbsp;</span>
813
- <span class="cline-any cline-no">&nbsp;</span>
814
- <span class="cline-any cline-neutral">&nbsp;</span>
815
- <span class="cline-any cline-neutral">&nbsp;</span>
816
- <span class="cline-any cline-no">&nbsp;</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-yes">6x</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">6x</span>
824
- <span class="cline-any cline-yes">6x</span>
825
- <span class="cline-any cline-neutral">&nbsp;</span>
826
- <span class="cline-any cline-yes">6x</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-no">&nbsp;</span>
831
- <span class="cline-any cline-no">&nbsp;</span>
832
- <span class="cline-any cline-no">&nbsp;</span>
833
- <span class="cline-any cline-no">&nbsp;</span>
834
- <span class="cline-any cline-neutral">&nbsp;</span>
835
- <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
839
- <span class="cline-any cline-neutral">&nbsp;</span>
840
- <span class="cline-any cline-neutral">&nbsp;</span>
841
- <span class="cline-any cline-no">&nbsp;</span>
842
- <span class="cline-any cline-no">&nbsp;</span>
843
- <span class="cline-any cline-no">&nbsp;</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-no">&nbsp;</span>
847
- <span class="cline-any cline-no">&nbsp;</span>
848
- <span class="cline-any cline-neutral">&nbsp;</span>
849
- <span class="cline-any cline-neutral">&nbsp;</span>
850
- <span class="cline-any cline-neutral">&nbsp;</span>
851
- <span class="cline-any cline-no">&nbsp;</span>
852
- <span class="cline-any cline-no">&nbsp;</span>
853
- <span class="cline-any cline-no">&nbsp;</span>
854
- <span class="cline-any cline-neutral">&nbsp;</span>
855
- <span class="cline-any cline-neutral">&nbsp;</span>
856
- <span class="cline-any cline-neutral">&nbsp;</span>
857
- <span class="cline-any cline-no">&nbsp;</span>
858
- <span class="cline-any cline-no">&nbsp;</span>
859
- <span class="cline-any cline-no">&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-no">&nbsp;</span>
863
- <span class="cline-any cline-no">&nbsp;</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-neutral">&nbsp;</span>
867
- <span class="cline-any cline-neutral">&nbsp;</span>
868
- <span class="cline-any cline-no">&nbsp;</span>
869
- <span class="cline-any cline-neutral">&nbsp;</span>
870
- <span class="cline-any cline-no">&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-no">&nbsp;</span>
875
- <span class="cline-any cline-neutral">&nbsp;</span>
876
- <span class="cline-any cline-no">&nbsp;</span>
877
- <span class="cline-any cline-neutral">&nbsp;</span>
878
- <span class="cline-any cline-neutral">&nbsp;</span>
879
- <span class="cline-any cline-neutral">&nbsp;</span>
880
- <span class="cline-any cline-no">&nbsp;</span>
881
- <span class="cline-any cline-neutral">&nbsp;</span>
882
- <span class="cline-any cline-no">&nbsp;</span>
883
- <span class="cline-any cline-neutral">&nbsp;</span>
884
- <span class="cline-any cline-neutral">&nbsp;</span>
885
- <span class="cline-any cline-neutral">&nbsp;</span>
886
- <span class="cline-any cline-neutral">&nbsp;</span>
887
- <span class="cline-any cline-no">&nbsp;</span>
888
- <span class="cline-any cline-no">&nbsp;</span>
889
- <span class="cline-any cline-no">&nbsp;</span>
890
- <span class="cline-any cline-neutral">&nbsp;</span>
891
- <span class="cline-any cline-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-no">&nbsp;</span>
897
- <span class="cline-any cline-no">&nbsp;</span>
898
- <span class="cline-any cline-no">&nbsp;</span>
899
- <span class="cline-any cline-no">&nbsp;</span>
900
- <span class="cline-any cline-no">&nbsp;</span>
901
- <span class="cline-any cline-no">&nbsp;</span>
902
- <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
907
- <span class="cline-any cline-neutral">&nbsp;</span>
908
- <span class="cline-any cline-neutral">&nbsp;</span>
909
- <span class="cline-any cline-no">&nbsp;</span>
910
- <span class="cline-any cline-no">&nbsp;</span>
911
- <span class="cline-any cline-no">&nbsp;</span>
912
- <span class="cline-any cline-no">&nbsp;</span>
913
- <span class="cline-any cline-neutral">&nbsp;</span>
914
- <span class="cline-any cline-no">&nbsp;</span>
915
- <span class="cline-any cline-neutral">&nbsp;</span>
916
- <span class="cline-any cline-no">&nbsp;</span>
917
- <span class="cline-any cline-no">&nbsp;</span>
918
- <span class="cline-any cline-neutral">&nbsp;</span>
919
- <span class="cline-any cline-neutral">&nbsp;</span>
920
- <span class="cline-any cline-neutral">&nbsp;</span>
921
- <span class="cline-any cline-neutral">&nbsp;</span>
922
- <span class="cline-any cline-no">&nbsp;</span>
923
- <span class="cline-any cline-no">&nbsp;</span>
924
- <span class="cline-any cline-neutral">&nbsp;</span>
925
- <span class="cline-any cline-no">&nbsp;</span>
926
- <span class="cline-any cline-neutral">&nbsp;</span>
927
- <span class="cline-any cline-neutral">&nbsp;</span>
928
- <span class="cline-any cline-neutral">&nbsp;</span>
929
- <span class="cline-any cline-neutral">&nbsp;</span>
930
- <span class="cline-any cline-no">&nbsp;</span>
931
- <span class="cline-any cline-no">&nbsp;</span>
932
- <span class="cline-any cline-no">&nbsp;</span>
933
- <span class="cline-any cline-neutral">&nbsp;</span>
934
- <span class="cline-any cline-neutral">&nbsp;</span>
935
- <span class="cline-any cline-neutral">&nbsp;</span>
936
- <span class="cline-any cline-no">&nbsp;</span>
937
- <span class="cline-any cline-neutral">&nbsp;</span>
938
- <span class="cline-any cline-neutral">&nbsp;</span>
939
- <span class="cline-any cline-no">&nbsp;</span>
940
- <span class="cline-any cline-no">&nbsp;</span>
941
- <span class="cline-any cline-neutral">&nbsp;</span>
942
- <span class="cline-any cline-no">&nbsp;</span>
943
- <span class="cline-any cline-neutral">&nbsp;</span>
944
- <span class="cline-any cline-neutral">&nbsp;</span>
945
- <span class="cline-any cline-neutral">&nbsp;</span>
946
- <span class="cline-any cline-neutral">&nbsp;</span>
947
- <span class="cline-any cline-neutral">&nbsp;</span>
948
- <span class="cline-any cline-neutral">&nbsp;</span>
949
- <span class="cline-any cline-no">&nbsp;</span>
950
- <span class="cline-any cline-no">&nbsp;</span>
951
- <span class="cline-any cline-no">&nbsp;</span>
952
- <span class="cline-any cline-neutral">&nbsp;</span>
953
- <span class="cline-any cline-no">&nbsp;</span>
954
- <span class="cline-any cline-no">&nbsp;</span>
955
- <span class="cline-any cline-no">&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-no">&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-no">&nbsp;</span>
971
- <span class="cline-any cline-no">&nbsp;</span>
972
- <span class="cline-any cline-neutral">&nbsp;</span>
973
- <span class="cline-any cline-no">&nbsp;</span>
974
- <span class="cline-any cline-neutral">&nbsp;</span>
975
- <span class="cline-any cline-neutral">&nbsp;</span>
976
- <span class="cline-any cline-neutral">&nbsp;</span>
977
- <span class="cline-any cline-neutral">&nbsp;</span>
978
- <span class="cline-any cline-neutral">&nbsp;</span>
979
- <span class="cline-any cline-neutral">&nbsp;</span>
980
- <span class="cline-any cline-no">&nbsp;</span>
981
- <span class="cline-any cline-neutral">&nbsp;</span>
982
- <span class="cline-any cline-neutral">&nbsp;</span>
983
- <span class="cline-any cline-neutral">&nbsp;</span>
984
- <span class="cline-any cline-no">&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-no">&nbsp;</span>
989
- <span class="cline-any cline-no">&nbsp;</span>
990
- <span class="cline-any cline-neutral">&nbsp;</span>
991
- <span class="cline-any cline-neutral">&nbsp;</span>
992
- <span class="cline-any cline-neutral">&nbsp;</span>
993
- <span class="cline-any cline-neutral">&nbsp;</span>
994
- <span class="cline-any cline-neutral">&nbsp;</span>
995
- <span class="cline-any cline-neutral">&nbsp;</span>
996
- <span class="cline-any cline-neutral">&nbsp;</span>
997
- <span class="cline-any cline-no">&nbsp;</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-yes">6x</span>
1004
- <span class="cline-any cline-no">&nbsp;</span>
1005
- <span class="cline-any cline-no">&nbsp;</span>
1006
- <span class="cline-any cline-no">&nbsp;</span>
1007
- <span class="cline-any cline-no">&nbsp;</span>
1008
- <span class="cline-any cline-no">&nbsp;</span>
1009
- <span class="cline-any cline-no">&nbsp;</span>
1010
- <span class="cline-any cline-no">&nbsp;</span>
1011
- <span class="cline-any cline-no">&nbsp;</span>
1012
- <span class="cline-any cline-neutral">&nbsp;</span>
1013
- <span class="cline-any cline-neutral">&nbsp;</span>
1014
- <span class="cline-any cline-neutral">&nbsp;</span>
1015
- <span class="cline-any cline-no">&nbsp;</span>
1016
- <span class="cline-any cline-neutral">&nbsp;</span>
1017
- <span class="cline-any cline-no">&nbsp;</span>
1018
- <span class="cline-any cline-no">&nbsp;</span>
1019
- <span class="cline-any cline-no">&nbsp;</span>
1020
- <span class="cline-any cline-no">&nbsp;</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-no">&nbsp;</span>
1028
- <span class="cline-any cline-neutral">&nbsp;</span>
1029
- <span class="cline-any cline-no">&nbsp;</span>
1030
- <span class="cline-any cline-neutral">&nbsp;</span>
1031
- <span class="cline-any cline-neutral">&nbsp;</span>
1032
- <span class="cline-any cline-neutral">&nbsp;</span>
1033
- <span class="cline-any cline-neutral">&nbsp;</span>
1034
- <span class="cline-any cline-neutral">&nbsp;</span>
1035
- <span class="cline-any cline-yes">6x</span>
1036
- <span class="cline-any cline-yes">6x</span>
1037
- <span class="cline-any cline-no">&nbsp;</span>
1038
- <span class="cline-any cline-no">&nbsp;</span>
1039
- <span class="cline-any cline-no">&nbsp;</span>
1040
- <span class="cline-any cline-no">&nbsp;</span>
1041
- <span class="cline-any cline-neutral">&nbsp;</span>
1042
- <span class="cline-any cline-no">&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-yes">6x</span>
1046
- <span class="cline-any cline-neutral">&nbsp;</span>
1047
- <span class="cline-any cline-neutral">&nbsp;</span>
1048
- <span class="cline-any cline-yes">12x</span>
1049
- <span class="cline-any cline-neutral">&nbsp;</span>
1050
- <span class="cline-any cline-yes">6x</span>
1051
- <span class="cline-any cline-yes">6x</span>
1052
- <span class="cline-any cline-yes">6x</span>
1053
- <span class="cline-any cline-yes">6x</span>
1054
- <span class="cline-any cline-neutral">&nbsp;</span>
1055
- <span class="cline-any cline-neutral">&nbsp;</span>
1056
- <span class="cline-any cline-yes">6x</span>
1057
- <span class="cline-any cline-no">&nbsp;</span>
1058
- <span class="cline-any cline-no">&nbsp;</span>
1059
- <span class="cline-any cline-neutral">&nbsp;</span>
1060
- <span class="cline-any cline-neutral">&nbsp;</span>
1061
- <span class="cline-any cline-neutral">&nbsp;</span>
1062
- <span class="cline-any cline-no">&nbsp;</span>
1063
- <span class="cline-any cline-neutral">&nbsp;</span>
1064
- <span class="cline-any cline-no">&nbsp;</span>
1065
- <span class="cline-any cline-neutral">&nbsp;</span>
1066
- <span class="cline-any cline-neutral">&nbsp;</span>
1067
- <span class="cline-any cline-yes">4x</span>
1068
- <span class="cline-any cline-neutral">&nbsp;</span>
1069
- <span class="cline-any cline-neutral">&nbsp;</span>
1070
- <span class="cline-any cline-neutral">&nbsp;</span>
1071
- <span class="cline-any cline-neutral">&nbsp;</span>
1072
- <span class="cline-any cline-neutral">&nbsp;</span>
1073
- <span class="cline-any cline-neutral">&nbsp;</span>
1074
- <span class="cline-any cline-yes">4x</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-no">&nbsp;</span>
1079
- <span class="cline-any cline-no">&nbsp;</span>
1080
- <span class="cline-any cline-neutral">&nbsp;</span>
1081
- <span class="cline-any cline-no">&nbsp;</span>
1082
- <span class="cline-any cline-no">&nbsp;</span>
1083
- <span class="cline-any cline-no">&nbsp;</span>
1084
- <span class="cline-any cline-no">&nbsp;</span>
1085
- <span class="cline-any cline-neutral">&nbsp;</span>
1086
- <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
1090
- <span class="cline-any cline-yes">6x</span>
1091
- <span class="cline-any cline-no">&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-yes">6x</span>
1095
- <span class="cline-any cline-no">&nbsp;</span>
1096
- <span class="cline-any cline-no">&nbsp;</span>
1097
- <span class="cline-any cline-no">&nbsp;</span>
1098
- <span class="cline-any cline-no">&nbsp;</span>
1099
- <span class="cline-any cline-neutral">&nbsp;</span>
1100
- <span class="cline-any cline-no">&nbsp;</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-no">&nbsp;</span>
1104
- <span class="cline-any cline-neutral">&nbsp;</span>
1105
- <span class="cline-any cline-no">&nbsp;</span>
1106
- <span class="cline-any cline-neutral">&nbsp;</span>
1107
- <span class="cline-any cline-no">&nbsp;</span>
1108
- <span class="cline-any cline-neutral">&nbsp;</span>
1109
- <span class="cline-any cline-neutral">&nbsp;</span>
1110
- <span class="cline-any cline-neutral">&nbsp;</span>
1111
- <span class="cline-any cline-neutral">&nbsp;</span>
1112
- <span class="cline-any cline-no">&nbsp;</span>
1113
- <span class="cline-any cline-no">&nbsp;</span>
1114
- <span class="cline-any cline-no">&nbsp;</span>
1115
- <span class="cline-any cline-no">&nbsp;</span>
1116
- <span class="cline-any cline-neutral">&nbsp;</span>
1117
- <span class="cline-any cline-neutral">&nbsp;</span>
1118
- <span class="cline-any cline-no">&nbsp;</span>
1119
- <span class="cline-any cline-neutral">&nbsp;</span>
1120
- <span class="cline-any cline-neutral">&nbsp;</span>
1121
- <span class="cline-any cline-neutral">&nbsp;</span>
1122
- <span class="cline-any cline-neutral">&nbsp;</span>
1123
- <span class="cline-any cline-neutral">&nbsp;</span>
1124
- <span class="cline-any cline-neutral">&nbsp;</span>
1125
- <span class="cline-any cline-neutral">&nbsp;</span>
1126
- <span class="cline-any cline-neutral">&nbsp;</span>
1127
- <span class="cline-any cline-no">&nbsp;</span>
1128
- <span class="cline-any cline-no">&nbsp;</span>
1129
- <span class="cline-any cline-neutral">&nbsp;</span>
1130
- <span class="cline-any cline-neutral">&nbsp;</span>
1131
- <span class="cline-any cline-neutral">&nbsp;</span>
1132
- <span class="cline-any cline-neutral">&nbsp;</span>
1133
- <span class="cline-any cline-no">&nbsp;</span>
1134
- <span class="cline-any cline-neutral">&nbsp;</span>
1135
- <span class="cline-any cline-neutral">&nbsp;</span>
1136
- <span class="cline-any cline-no">&nbsp;</span>
1137
- <span class="cline-any cline-no">&nbsp;</span>
1138
- <span class="cline-any cline-neutral">&nbsp;</span>
1139
- <span class="cline-any cline-no">&nbsp;</span>
1140
- <span class="cline-any cline-neutral">&nbsp;</span>
1141
- <span class="cline-any cline-neutral">&nbsp;</span>
1142
- <span class="cline-any cline-neutral">&nbsp;</span>
1143
- <span class="cline-any cline-neutral">&nbsp;</span>
1144
- <span class="cline-any cline-yes">6x</span>
1145
- <span class="cline-any cline-no">&nbsp;</span>
1146
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
1147
- * @license
1148
- * Copyright 2025 Google LLC
1149
- * SPDX-License-Identifier: Apache-2.0
1150
- */
1151
- &nbsp;
1152
- import type { Credentials } from 'google-auth-library';
1153
- import {
1154
- OAuth2Client,
1155
- Compute,
1156
- CodeChallengeMethod,
1157
- } from 'google-auth-library';
1158
- import * as http from 'node:http';
1159
- import url from 'node:url';
1160
- import * as crypto from 'node:crypto';
1161
- import * as net from 'node:net';
1162
- import * as path from 'node:path';
1163
- import { promises as fs } from 'node:fs';
1164
- import type { Config } from '../config/config';
1165
- import { getErrorMessage, FatalAuthenticationError } from '../utils/errors';
1166
- import { UserAccountManager } from '../utils/userAccountManager';
1167
- import { AuthType } from '../core/contentGenerator';
1168
- import readline from 'node:readline';
1169
- import { Storage } from '../config/storage';
1170
- import { OAuthCredentialStorage } from './oauth-credential-storage';
1171
- import { FORCE_ENCRYPTED_FILE_ENV_VAR } from '../mcp/token-storage/index';
1172
- &nbsp;
1173
- const userAccountManager = new UserAccountManager();
1174
- &nbsp;
1175
- // OAuth Client ID used to initiate OAuth2Client class.
1176
- const OAUTH_CLIENT_ID =
1177
- '681255809395-oo8ft2oprdrnp9e3aqf6av3hmdib135j.apps.googleusercontent.com';
1178
- &nbsp;
1179
- // OAuth Secret value used to initiate OAuth2Client class.
1180
- // Note: It's ok to save this in git because this is an installed application
1181
- // as described here: https://developers.google.com/identity/protocols/oauth2#installed
1182
- // "The process results in a client ID and, in some cases, a client secret,
1183
- // which you embed in the source code of your application. (In this context,
1184
- // the client secret is obviously not treated as a secret.)"
1185
- const OAUTH_CLIENT_SECRET = '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';
1186
- &nbsp;
1187
- // OAuth Scopes for Cloud Code authorization.
1188
- const OAUTH_SCOPE = [
1189
- 'https://www.googleapis.com/auth/cloud-platform',
1190
- 'https://www.googleapis.com/auth/userinfo.email',
1191
- 'https://www.googleapis.com/auth/userinfo.profile',
1192
- ];
1193
- &nbsp;
1194
- const HTTP_REDIRECT = 301;
1195
- const SIGN_IN_SUCCESS_URL =
1196
- 'https://developers.google.com/gemini-code-assist/auth_success_gemini';
1197
- const SIGN_IN_FAILURE_URL =
1198
- 'https://developers.google.com/gemini-code-assist/auth_failure_gemini';
1199
- &nbsp;
1200
- /**
1201
- * An Authentication URL for updating the credentials of a Oauth2Client
1202
- * as well as a promise that will resolve when the credentials have
1203
- * been refreshed (or which throws error when refreshing credentials failed).
1204
- */
1205
- export interface OauthWebLogin {
1206
- authUrl: string;
1207
- loginCompletePromise: Promise&lt;void&gt;;
1208
- }
1209
- &nbsp;
1210
- const oauthClientPromises = new Map&lt;AuthType, Promise&lt;OAuth2Client&gt;&gt;();
1211
- &nbsp;
1212
- function getUseEncryptedStorageFlag() {
1213
- return process.env[FORCE_ENCRYPTED_FILE_ENV_VAR] === 'true';
1214
- }
1215
- &nbsp;
1216
- async function initOauthClient(
1217
- authType: AuthType,
1218
- config: Config,
1219
- ): Promise&lt;OAuth2Client&gt; {
1220
- const client = new OAuth2Client({
1221
- clientId: OAUTH_CLIENT_ID,
1222
- clientSecret: OAUTH_CLIENT_SECRET,
1223
- });
1224
- const useEncryptedStorage = getUseEncryptedStorageFlag();
1225
- &nbsp;
1226
- <span class="missing-if-branch" title="if path not taken" >I</span>if (
1227
- process.env['GOOGLE_GENAI_USE_GCA'] &amp;&amp;
1228
- <span class="branch-1 cbranch-no" title="branch not covered" > process.env['GOOGLE_CLOUD_ACCESS_TOKEN']</span>
1229
- ) {
1230
- <span class="cstat-no" title="statement not covered" > client.setCredentials({</span>
1231
- access_token: process.env['GOOGLE_CLOUD_ACCESS_TOKEN'],
1232
- });
1233
- <span class="cstat-no" title="statement not covered" > await fetchAndCacheUserInfo(client);</span>
1234
- <span class="cstat-no" title="statement not covered" > return client;</span>
1235
- }
1236
- &nbsp;
1237
- client.on('tokens', <span class="fstat-no" title="function not covered" >async </span>(tokens: Credentials) =&gt; {
1238
- <span class="cstat-no" title="statement not covered" > if (useEncryptedStorage) {</span>
1239
- <span class="cstat-no" title="statement not covered" > await OAuthCredentialStorage.saveCredentials(tokens);</span>
1240
- } else {
1241
- <span class="cstat-no" title="statement not covered" > await cacheCredentials(tokens);</span>
1242
- }
1243
- });
1244
- &nbsp;
1245
- // If there are cached creds on disk, they always take precedence
1246
- <span class="missing-if-branch" title="if path not taken" >I</span>if (await loadCachedCredentials(client)) {
1247
- // Found valid cached credentials.
1248
- // Check if we need to retrieve Google Account ID or Email
1249
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!userAccountManager.getCachedGoogleAccount()) {</span>
1250
- <span class="cstat-no" title="statement not covered" > try {</span>
1251
- <span class="cstat-no" title="statement not covered" > await fetchAndCacheUserInfo(client);</span>
1252
- } catch (error) {
1253
- // Non-fatal, continue with existing auth.
1254
- <span class="cstat-no" title="statement not covered" > console.warn('Failed to fetch user info:', getErrorMessage(error));</span>
1255
- }
1256
- }
1257
- <span class="cstat-no" title="statement not covered" > console.log('Loaded cached credentials.');</span>
1258
- <span class="cstat-no" title="statement not covered" > return client;</span>
1259
- }
1260
- &nbsp;
1261
- // In Google Cloud Shell, we can use Application Default Credentials (ADC)
1262
- // provided via its metadata server to authenticate non-interactively using
1263
- // the identity of the user logged into Cloud Shell.
1264
- <span class="missing-if-branch" title="if path not taken" >I</span>if (authType === AuthType.CLOUD_SHELL) {
1265
- <span class="cstat-no" title="statement not covered" > try {</span>
1266
- <span class="cstat-no" title="statement not covered" > console.log("Attempting to authenticate via Cloud Shell VM's ADC.");</span>
1267
- const computeClient = <span class="cstat-no" title="statement not covered" >new Compute({</span>
1268
- // We can leave this empty, since the metadata server will provide
1269
- // the service account email.
1270
- });
1271
- <span class="cstat-no" title="statement not covered" > await computeClient.getAccessToken();</span>
1272
- <span class="cstat-no" title="statement not covered" > console.log('Authentication successful.');</span>
1273
- &nbsp;
1274
- // Do not cache creds in this case; note that Compute client will handle its own refresh
1275
- <span class="cstat-no" title="statement not covered" > return computeClient;</span>
1276
- } catch (e) {
1277
- <span class="cstat-no" title="statement not covered" > throw new Error(</span>
1278
- `Could not authenticate using Cloud Shell credentials. Please select a different authentication method or ensure you are in a properly configured environment. Error: ${getErrorMessage(
1279
- e,
1280
- )}`,
1281
- );
1282
- }
1283
- }
1284
- &nbsp;
1285
- if (config.isBrowserLaunchSuppressed()) {
1286
- let success = <span class="cstat-no" title="statement not covered" >false;</span>
1287
- const maxRetries = <span class="cstat-no" title="statement not covered" >2;</span>
1288
- <span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >0;</span> !success &amp;&amp; i &lt; maxRetries; i++) {</span>
1289
- <span class="cstat-no" title="statement not covered" > success = await authWithUserCode(client);</span>
1290
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!success) {</span>
1291
- <span class="cstat-no" title="statement not covered" > console.error(</span>
1292
- '\nFailed to authenticate with user code.',
1293
- i === maxRetries - 1 ? '' : 'Retrying...\n',
1294
- );
1295
- }
1296
- }
1297
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!success) {</span>
1298
- <span class="cstat-no" title="statement not covered" > throw new FatalAuthenticationError(</span>
1299
- 'Failed to authenticate with user code.',
1300
- );
1301
- }
1302
- } else {
1303
- const webLogin = <span class="cstat-no" title="statement not covered" >await authWithWeb(client);</span>
1304
- &nbsp;
1305
- <span class="cstat-no" title="statement not covered" > console.log(</span>
1306
- `\n\nCode Assist login required.\n` +
1307
- `Attempting to open authentication page in your browser.\n` +
1308
- `Otherwise navigate to:\n\n${webLogin.authUrl}\n\n`,
1309
- );
1310
- <span class="cstat-no" title="statement not covered" > try {</span>
1311
- const { default: open } = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >await import('</span>open');</span>
1312
- // Attempt to open the authentication URL in the default browser.
1313
- // We do not use the `wait` option here because the main script's execution
1314
- // is already paused by `loginCompletePromise`, which awaits the server callback.
1315
- const childProcess = <span class="cstat-no" title="statement not covered" >await open(webLogin.authUrl);</span>
1316
- &nbsp;
1317
- // IMPORTANT: Attach an error handler to the returned child process.
1318
- // Without this, if `open` fails to spawn a process (e.g., `xdg-open` is not found
1319
- // in a minimal Docker container), it will emit an unhandled 'error' event,
1320
- // causing the entire Node.js process to crash.
1321
- <span class="cstat-no" title="statement not covered" > childProcess.on('error', <span class="fstat-no" title="function not covered" >(e</span>rror) =&gt; {</span>
1322
- <span class="cstat-no" title="statement not covered" > console.error(</span>
1323
- 'Failed to open browser automatically. Please try running again with NO_BROWSER=true set.',
1324
- );
1325
- <span class="cstat-no" title="statement not covered" > console.error('Browser error details:', getErrorMessage(error));</span>
1326
- });
1327
- } catch (err) {
1328
- <span class="cstat-no" title="statement not covered" > console.error(</span>
1329
- 'An unexpected error occurred while trying to open the browser:',
1330
- getErrorMessage(err),
1331
- '\nThis might be due to browser compatibility issues or system configuration.',
1332
- '\nPlease try running again with NO_BROWSER=true set for manual authentication.',
1333
- );
1334
- <span class="cstat-no" title="statement not covered" > throw new FatalAuthenticationError(</span>
1335
- `Failed to open browser: ${getErrorMessage(err)}`,
1336
- );
1337
- }
1338
- <span class="cstat-no" title="statement not covered" > console.log('Waiting for authentication...');</span>
1339
- &nbsp;
1340
- // Add timeout to prevent infinite waiting when browser tab gets stuck
1341
- const authTimeout = <span class="cstat-no" title="statement not covered" >5 * 60 * 1000;</span> // 5 minutes timeout
1342
- const timeoutPromise = <span class="cstat-no" title="statement not covered" >new Promise&lt;never&gt;(<span class="fstat-no" title="function not covered" >(_</span>, reject) =&gt; {</span>
1343
- <span class="cstat-no" title="statement not covered" > setTimeout(<span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
1344
- <span class="cstat-no" title="statement not covered" > reject(</span>
1345
- new FatalAuthenticationError(
1346
- 'Authentication timed out after 5 minutes. The browser tab may have gotten stuck in a loading state. ' +
1347
- 'Please try again or use NO_BROWSER=true for manual authentication.',
1348
- ),
1349
- );
1350
- }, authTimeout);
1351
- });
1352
- &nbsp;
1353
- <span class="cstat-no" title="statement not covered" > await Promise.race([webLogin.loginCompletePromise, timeoutPromise]);</span>
1354
- }
1355
- &nbsp;
1356
- <span class="cstat-no" title="statement not covered" > return client;</span>
1357
- }
1358
- &nbsp;
1359
- export async function getOauthClient(
1360
- authType: AuthType,
1361
- config: Config,
1362
- ): Promise&lt;OAuth2Client&gt; {
1363
- if (!oauthClientPromises.has(authType)) {
1364
- oauthClientPromises.set(authType, initOauthClient(authType, config));
1365
- }
1366
- return oauthClientPromises.get(authType)!;
1367
- }
1368
- &nbsp;
1369
- async function <span class="fstat-no" title="function not covered" >authWithUserCode(</span>client: OAuth2Client): Promise&lt;boolean&gt; {
1370
- const redirectUri = <span class="cstat-no" title="statement not covered" >'https://codeassist.google.com/authcode';</span>
1371
- const codeVerifier = <span class="cstat-no" title="statement not covered" >await client.generateCodeVerifierAsync();</span>
1372
- const state = <span class="cstat-no" title="statement not covered" >crypto.randomBytes(32).toString('hex');</span>
1373
- const authUrl: string = <span class="cstat-no" title="statement not covered" >client.generateAuthUrl({</span>
1374
- redirect_uri: redirectUri,
1375
- access_type: 'offline',
1376
- scope: OAUTH_SCOPE,
1377
- code_challenge_method: CodeChallengeMethod.S256,
1378
- code_challenge: codeVerifier.codeChallenge,
1379
- state,
1380
- });
1381
- <span class="cstat-no" title="statement not covered" > console.log('Please visit the following URL to authorize the application:');</span>
1382
- <span class="cstat-no" title="statement not covered" > console.log('');</span>
1383
- <span class="cstat-no" title="statement not covered" > console.log(authUrl);</span>
1384
- <span class="cstat-no" title="statement not covered" > console.log('');</span>
1385
- &nbsp;
1386
- const code = <span class="cstat-no" title="statement not covered" >await new Promise&lt;string&gt;(<span class="fstat-no" title="function not covered" >(r</span>esolve) =&gt; {</span>
1387
- const rl = <span class="cstat-no" title="statement not covered" >readline.createInterface({</span>
1388
- input: process.stdin,
1389
- output: process.stdout,
1390
- });
1391
- <span class="cstat-no" title="statement not covered" > rl.question('Enter the authorization code: ', <span class="fstat-no" title="function not covered" >(c</span>ode) =&gt; {</span>
1392
- <span class="cstat-no" title="statement not covered" > rl.close();</span>
1393
- <span class="cstat-no" title="statement not covered" > resolve(code.trim());</span>
1394
- });
1395
- });
1396
- &nbsp;
1397
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!code) {</span>
1398
- <span class="cstat-no" title="statement not covered" > console.error('Authorization code is required.');</span>
1399
- <span class="cstat-no" title="statement not covered" > return false;</span>
1400
- }
1401
- &nbsp;
1402
- <span class="cstat-no" title="statement not covered" > try {</span>
1403
- const { tokens } = <span class="cstat-no" title="statement not covered" >await client.getToken({</span>
1404
- code,
1405
- codeVerifier: codeVerifier.codeVerifier,
1406
- redirect_uri: redirectUri,
1407
- });
1408
- <span class="cstat-no" title="statement not covered" > client.setCredentials(tokens);</span>
1409
- } catch (error) {
1410
- <span class="cstat-no" title="statement not covered" > console.error(</span>
1411
- 'Failed to authenticate with authorization code:',
1412
- getErrorMessage(error),
1413
- );
1414
- <span class="cstat-no" title="statement not covered" > return false;</span>
1415
- }
1416
- <span class="cstat-no" title="statement not covered" > return true;</span>
1417
- }
1418
- &nbsp;
1419
- async function <span class="fstat-no" title="function not covered" >authWithWeb(</span>client: OAuth2Client): Promise&lt;OauthWebLogin&gt; {
1420
- const port = <span class="cstat-no" title="statement not covered" >await getAvailablePort();</span>
1421
- // The hostname used for the HTTP server binding (e.g., '0.0.0.0' in Docker).
1422
- const host = <span class="cstat-no" title="statement not covered" >process.env['OAUTH_CALLBACK_HOST'] || 'localhost';</span>
1423
- // The `redirectUri` sent to Google's authorization server MUST use a loopback IP literal
1424
- // (i.e., 'localhost' or '127.0.0.1'). This is a strict security policy for credentials of
1425
- // type 'Desktop app' or 'Web application' (when using loopback flow) to mitigate
1426
- // authorization code interception attacks.
1427
- const redirectUri = <span class="cstat-no" title="statement not covered" >`http://localhost:${port}/oauth2callback`;</span>
1428
- const state = <span class="cstat-no" title="statement not covered" >crypto.randomBytes(32).toString('hex');</span>
1429
- const authUrl = <span class="cstat-no" title="statement not covered" >client.generateAuthUrl({</span>
1430
- redirect_uri: redirectUri,
1431
- access_type: 'offline',
1432
- scope: OAUTH_SCOPE,
1433
- state,
1434
- });
1435
- &nbsp;
1436
- const loginCompletePromise = <span class="cstat-no" title="statement not covered" >new Promise&lt;void&gt;(<span class="fstat-no" title="function not covered" >(r</span>esolve, reject) =&gt; {</span>
1437
- const server = <span class="cstat-no" title="statement not covered" >http.createServer(<span class="fstat-no" title="function not covered" >async </span>(req, res) =&gt; {</span>
1438
- <span class="cstat-no" title="statement not covered" > try {</span>
1439
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (req.url!.indexOf('/oauth2callback') === -1) {</span>
1440
- <span class="cstat-no" title="statement not covered" > res.writeHead(HTTP_REDIRECT, { Location: SIGN_IN_FAILURE_URL });</span>
1441
- <span class="cstat-no" title="statement not covered" > res.end();</span>
1442
- <span class="cstat-no" title="statement not covered" > reject(</span>
1443
- new FatalAuthenticationError(
1444
- 'OAuth callback not received. Unexpected request: ' + req.url,
1445
- ),
1446
- );
1447
- }
1448
- // acquire the code from the querystring, and close the web server.
1449
- const qs = <span class="cstat-no" title="statement not covered" >new url.URL(req.url!, 'http://localhost:3000').searchParams;</span>
1450
- <span class="cstat-no" title="statement not covered" > if (qs.get('error')) {</span>
1451
- <span class="cstat-no" title="statement not covered" > res.writeHead(HTTP_REDIRECT, { Location: SIGN_IN_FAILURE_URL });</span>
1452
- <span class="cstat-no" title="statement not covered" > res.end();</span>
1453
- &nbsp;
1454
- const errorCode = <span class="cstat-no" title="statement not covered" >qs.get('error');</span>
1455
- const errorDescription =
1456
- <span class="cstat-no" title="statement not covered" > qs.get('error_description') || 'No additional details provided';</span>
1457
- <span class="cstat-no" title="statement not covered" > reject(</span>
1458
- new FatalAuthenticationError(
1459
- `Google OAuth error: ${errorCode}. ${errorDescription}`,
1460
- ),
1461
- );
1462
- } else <span class="cstat-no" title="statement not covered" >if (qs.get('state') !== state) {</span>
1463
- <span class="cstat-no" title="statement not covered" > res.end('State mismatch. Possible CSRF attack');</span>
1464
- &nbsp;
1465
- <span class="cstat-no" title="statement not covered" > reject(</span>
1466
- new FatalAuthenticationError(
1467
- 'OAuth state mismatch. Possible CSRF attack or browser session issue.',
1468
- ),
1469
- );
1470
- } else <span class="cstat-no" title="statement not covered" >if (qs.get('code')) {</span>
1471
- <span class="cstat-no" title="statement not covered" > try {</span>
1472
- const { tokens } = <span class="cstat-no" title="statement not covered" >await client.getToken({</span>
1473
- code: qs.get('code')!,
1474
- redirect_uri: redirectUri,
1475
- });
1476
- <span class="cstat-no" title="statement not covered" > client.setCredentials(tokens);</span>
1477
- &nbsp;
1478
- // Retrieve and cache Google Account ID during authentication
1479
- <span class="cstat-no" title="statement not covered" > try {</span>
1480
- <span class="cstat-no" title="statement not covered" > await fetchAndCacheUserInfo(client);</span>
1481
- } catch (error) {
1482
- <span class="cstat-no" title="statement not covered" > console.warn(</span>
1483
- 'Failed to retrieve Google Account ID during authentication:',
1484
- getErrorMessage(error),
1485
- );
1486
- // Don't fail the auth flow if Google Account ID retrieval fails
1487
- }
1488
- &nbsp;
1489
- <span class="cstat-no" title="statement not covered" > res.writeHead(HTTP_REDIRECT, { Location: SIGN_IN_SUCCESS_URL });</span>
1490
- <span class="cstat-no" title="statement not covered" > res.end();</span>
1491
- <span class="cstat-no" title="statement not covered" > resolve();</span>
1492
- } catch (error) {
1493
- <span class="cstat-no" title="statement not covered" > res.writeHead(HTTP_REDIRECT, { Location: SIGN_IN_FAILURE_URL });</span>
1494
- <span class="cstat-no" title="statement not covered" > res.end();</span>
1495
- <span class="cstat-no" title="statement not covered" > reject(</span>
1496
- new FatalAuthenticationError(
1497
- `Failed to exchange authorization code for tokens: ${getErrorMessage(error)}`,
1498
- ),
1499
- );
1500
- }
1501
- } else {
1502
- <span class="cstat-no" title="statement not covered" > reject(</span>
1503
- new FatalAuthenticationError(
1504
- 'No authorization code received from Google OAuth. Please try authenticating again.',
1505
- ),
1506
- );
1507
- }
1508
- } catch (e) {
1509
- // Provide more specific error message for unexpected errors during OAuth flow
1510
- <span class="cstat-no" title="statement not covered" > if (e instanceof FatalAuthenticationError) {</span>
1511
- <span class="cstat-no" title="statement not covered" > reject(e);</span>
1512
- } else {
1513
- <span class="cstat-no" title="statement not covered" > reject(</span>
1514
- new FatalAuthenticationError(
1515
- `Unexpected error during OAuth authentication: ${getErrorMessage(e)}`,
1516
- ),
1517
- );
1518
- }
1519
- } finally {
1520
- <span class="cstat-no" title="statement not covered" > server.close();</span>
1521
- }
1522
- });
1523
- &nbsp;
1524
- <span class="cstat-no" title="statement not covered" > server.listen(port, host, <span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
1525
- // Server started successfully
1526
- });
1527
- &nbsp;
1528
- <span class="cstat-no" title="statement not covered" > server.on('error', <span class="fstat-no" title="function not covered" >(e</span>rr) =&gt; {</span>
1529
- <span class="cstat-no" title="statement not covered" > reject(</span>
1530
- new FatalAuthenticationError(
1531
- `OAuth callback server error: ${getErrorMessage(err)}`,
1532
- ),
1533
- );
1534
- });
1535
- });
1536
- &nbsp;
1537
- <span class="cstat-no" title="statement not covered" > return {</span>
1538
- authUrl,
1539
- loginCompletePromise,
1540
- };
1541
- }
1542
- &nbsp;
1543
- export function <span class="fstat-no" title="function not covered" >getAvailablePort(</span>): Promise&lt;number&gt; {
1544
- <span class="cstat-no" title="statement not covered" > return new Promise(<span class="fstat-no" title="function not covered" >(r</span>esolve, reject) =&gt; {</span>
1545
- let port = <span class="cstat-no" title="statement not covered" >0;</span>
1546
- <span class="cstat-no" title="statement not covered" > try {</span>
1547
- const portStr = <span class="cstat-no" title="statement not covered" >process.env['OAUTH_CALLBACK_PORT'];</span>
1548
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (portStr) {</span>
1549
- <span class="cstat-no" title="statement not covered" > port = parseInt(portStr, 10);</span>
1550
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (isNaN(port) || port &lt;= 0 || port &gt; 65535) {</span>
1551
- <span class="cstat-no" title="statement not covered" > return reject(</span>
1552
- new Error(`Invalid value for OAUTH_CALLBACK_PORT: "${portStr}"`),
1553
- );
1554
- }
1555
- <span class="cstat-no" title="statement not covered" > return resolve(port);</span>
1556
- }
1557
- const server = <span class="cstat-no" title="statement not covered" >net.createServer();</span>
1558
- <span class="cstat-no" title="statement not covered" > server.listen(0, <span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
1559
- const address = <span class="cstat-no" title="statement not covered" >server.address()! as net.AddressInfo;</span>
1560
- <span class="cstat-no" title="statement not covered" > port = address.port;</span>
1561
- });
1562
- <span class="cstat-no" title="statement not covered" > server.on('listening', <span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
1563
- <span class="cstat-no" title="statement not covered" > server.close();</span>
1564
- <span class="cstat-no" title="statement not covered" > server.unref();</span>
1565
- });
1566
- <span class="cstat-no" title="statement not covered" > server.on('error', <span class="fstat-no" title="function not covered" >(e</span>) =&gt; <span class="cstat-no" title="statement not covered" >reject(e))</span>;</span>
1567
- <span class="cstat-no" title="statement not covered" > server.on('close', <span class="fstat-no" title="function not covered" >() =</span>&gt; <span class="cstat-no" title="statement not covered" >resolve(port))</span>;</span>
1568
- } catch (e) {
1569
- <span class="cstat-no" title="statement not covered" > reject(e);</span>
1570
- }
1571
- });
1572
- }
1573
- &nbsp;
1574
- async function loadCachedCredentials(client: OAuth2Client): Promise&lt;boolean&gt; {
1575
- const useEncryptedStorage = getUseEncryptedStorageFlag();
1576
- <span class="missing-if-branch" title="if path not taken" >I</span>if (useEncryptedStorage) {
1577
- const credentials = <span class="cstat-no" title="statement not covered" >await OAuthCredentialStorage.loadCredentials();</span>
1578
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (credentials) {</span>
1579
- <span class="cstat-no" title="statement not covered" > client.setCredentials(credentials);</span>
1580
- <span class="cstat-no" title="statement not covered" > return true;</span>
1581
- }
1582
- <span class="cstat-no" title="statement not covered" > return false;</span>
1583
- }
1584
- &nbsp;
1585
- const pathsToTry = [
1586
- Storage.getOAuthCredsPath(),
1587
- process.env['GOOGLE_APPLICATION_CREDENTIALS'],
1588
- ].filter((p): p is string =&gt; !!p);
1589
- &nbsp;
1590
- for (const keyFile of pathsToTry) {
1591
- try {
1592
- const creds = await fs.readFile(keyFile, 'utf-8');
1593
- client.setCredentials(JSON.parse(creds));
1594
- &nbsp;
1595
- // This will verify locally that the credentials look good.
1596
- const { token } = await client.getAccessToken();
1597
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!token) {</span>
1598
- <span class="cstat-no" title="statement not covered" > continue;</span>
1599
- }
1600
- &nbsp;
1601
- // This will check with the server to see if it hasn't been revoked.
1602
- <span class="cstat-no" title="statement not covered" > await client.getTokenInfo(token);</span>
1603
- &nbsp;
1604
- <span class="cstat-no" title="statement not covered" > return true;</span>
1605
- } catch (error) {
1606
- // Log specific error for debugging, but continue trying other paths
1607
- console.debug(
1608
- `Failed to load credentials from ${keyFile}:`,
1609
- getErrorMessage(error),
1610
- );
1611
- }
1612
- }
1613
- &nbsp;
1614
- return false;
1615
- }
1616
- &nbsp;
1617
- async function <span class="fstat-no" title="function not covered" >cacheCredentials(</span>credentials: Credentials) {
1618
- const filePath = <span class="cstat-no" title="statement not covered" >Storage.getOAuthCredsPath();</span>
1619
- <span class="cstat-no" title="statement not covered" > await fs.mkdir(path.dirname(filePath), { recursive: true });</span>
1620
- &nbsp;
1621
- const credString = <span class="cstat-no" title="statement not covered" >JSON.stringify(credentials, null, 2);</span>
1622
- <span class="cstat-no" title="statement not covered" > await fs.writeFile(filePath, credString, { mode: 0o600 });</span>
1623
- <span class="cstat-no" title="statement not covered" > try {</span>
1624
- <span class="cstat-no" title="statement not covered" > await fs.chmod(filePath, 0o600);</span>
1625
- } catch {
1626
- /* empty */
1627
- }
1628
- }
1629
- &nbsp;
1630
- export function <span class="fstat-no" title="function not covered" >clearOauthClientCache(</span>) {
1631
- <span class="cstat-no" title="statement not covered" > oauthClientPromises.clear();</span>
1632
- }
1633
- &nbsp;
1634
- export async function <span class="fstat-no" title="function not covered" >clearCachedCredentialFile(</span>) {
1635
- <span class="cstat-no" title="statement not covered" > try {</span>
1636
- const useEncryptedStorage = <span class="cstat-no" title="statement not covered" >getUseEncryptedStorageFlag();</span>
1637
- <span class="cstat-no" title="statement not covered" > if (useEncryptedStorage) {</span>
1638
- <span class="cstat-no" title="statement not covered" > await OAuthCredentialStorage.clearCredentials();</span>
1639
- } else {
1640
- <span class="cstat-no" title="statement not covered" > await fs.rm(Storage.getOAuthCredsPath(), { force: true });</span>
1641
- }
1642
- // Clear the Google Account ID cache when credentials are cleared
1643
- <span class="cstat-no" title="statement not covered" > await userAccountManager.clearCachedGoogleAccount();</span>
1644
- // Clear the in-memory OAuth client cache to force re-authentication
1645
- <span class="cstat-no" title="statement not covered" > clearOauthClientCache();</span>
1646
- } catch (e) {
1647
- <span class="cstat-no" title="statement not covered" > console.error('Failed to clear cached credentials:', e);</span>
1648
- }
1649
- }
1650
- &nbsp;
1651
- async function <span class="fstat-no" title="function not covered" >fetchAndCacheUserInfo(</span>client: OAuth2Client): Promise&lt;void&gt; {
1652
- <span class="cstat-no" title="statement not covered" > try {</span>
1653
- const { token } = <span class="cstat-no" title="statement not covered" >await client.getAccessToken();</span>
1654
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!token) {</span>
1655
- <span class="cstat-no" title="statement not covered" > return;</span>
1656
- }
1657
- &nbsp;
1658
- const response = <span class="cstat-no" title="statement not covered" >await fetch(</span>
1659
- 'https://www.googleapis.com/oauth2/v2/userinfo',
1660
- {
1661
- headers: {
1662
- Authorization: `Bearer ${token}`,
1663
- },
1664
- },
1665
- );
1666
- &nbsp;
1667
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!response.ok) {</span>
1668
- <span class="cstat-no" title="statement not covered" > console.error(</span>
1669
- 'Failed to fetch user info:',
1670
- response.status,
1671
- response.statusText,
1672
- );
1673
- <span class="cstat-no" title="statement not covered" > return;</span>
1674
- }
1675
- &nbsp;
1676
- const userInfo = <span class="cstat-no" title="statement not covered" >await response.json();</span>
1677
- <span class="cstat-no" title="statement not covered" > await userAccountManager.cacheGoogleAccount(userInfo.email);</span>
1678
- } catch (error) {
1679
- <span class="cstat-no" title="statement not covered" > console.error('Error retrieving user info:', error);</span>
1680
- }
1681
- }
1682
- &nbsp;
1683
- // Helper to ensure test isolation
1684
- export function <span class="fstat-no" title="function not covered" >resetOauthClientForTesting(</span>) {
1685
- <span class="cstat-no" title="statement not covered" > oauthClientPromises.clear();</span>
1686
- }</pre></td></tr></table></pre>
1687
-
1688
- <div class='push'></div><!-- for sticky footer -->
1689
- </div><!-- /wrapper -->
1690
- <div class='footer quiet pad2 space-top1 center small'>
1691
- Code coverage generated by
1692
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1693
- at 2026-05-09T01:03:45.353Z
1694
- </div>
1695
- <script src="../../../../prettify.js"></script>
1696
- <script>
1697
- window.onload = function () {
1698
- prettyPrint();
1699
- };
1700
- </script>
1701
- <script src="../../../../sorter.js"></script>
1702
- <script src="../../../../block-navigation.js"></script>
1703
- </body>
1704
- </html>
1705
-