@angular/compiler-cli 12.1.0-next.5 → 12.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (476) hide show
  1. package/linker/src/file_linker/emit_scopes/iife_emit_scope.js +1 -1
  2. package/linker/src/file_linker/partial_linkers/partial_component_linker_1.js +2 -3
  3. package/linker/src/file_linker/partial_linkers/partial_linker_selector.js +2 -2
  4. package/ngcc/src/dependencies/commonjs_dependency_host.js +1 -1
  5. package/ngcc/src/dependencies/dts_dependency_host.js +1 -1
  6. package/ngcc/src/dependencies/esm_dependency_host.js +1 -1
  7. package/ngcc/src/dependencies/umd_dependency_host.js +1 -1
  8. package/ngcc/src/entry_point_finder/program_based_entry_point_finder.js +1 -1
  9. package/ngcc/src/entry_point_finder/targeted_entry_point_finder.js +1 -1
  10. package/ngcc/src/execution/tasks/queues/parallel_task_queue.js +1 -1
  11. package/ngcc/src/execution/tasks/queues/serial_task_queue.js +1 -1
  12. package/ngcc/src/host/commonjs_host.js +1 -1
  13. package/ngcc/src/host/esm2015_host.js +1 -1
  14. package/ngcc/src/host/esm5_host.js +1 -1
  15. package/ngcc/src/host/umd_host.js +1 -1
  16. package/ngcc/src/packages/build_marker.d.ts +1 -1
  17. package/ngcc/src/packages/build_marker.js +1 -1
  18. package/ngcc/src/packages/configuration.d.ts +7 -0
  19. package/ngcc/src/packages/configuration.js +8 -3
  20. package/ngcc/src/packages/entry_point_manifest.js +2 -2
  21. package/ngcc/src/packages/ngcc_compiler_host.js +1 -1
  22. package/ngcc/src/rendering/commonjs_rendering_formatter.js +1 -1
  23. package/ngcc/src/rendering/esm5_rendering_formatter.js +1 -1
  24. package/ngcc/src/rendering/umd_rendering_formatter.js +1 -1
  25. package/ngcc/src/writing/new_entry_point_file_writer.js +1 -1
  26. package/package.json +2 -2
  27. package/src/ngtsc/annotations/src/component.d.ts +2 -0
  28. package/src/ngtsc/annotations/src/component.js +6 -2
  29. package/src/ngtsc/annotations/src/directive.js +1 -1
  30. package/src/ngtsc/annotations/src/ng_module.js +1 -1
  31. package/src/ngtsc/annotations/src/pipe.js +1 -1
  32. package/src/ngtsc/core/api/src/public_options.d.ts +12 -0
  33. package/src/ngtsc/core/api/src/public_options.js +1 -1
  34. package/src/ngtsc/core/src/compiler.d.ts +5 -0
  35. package/src/ngtsc/core/src/compiler.js +10 -1
  36. package/src/ngtsc/file_system/testing/src/mock_file_system_native.js +1 -1
  37. package/src/ngtsc/file_system/testing/src/mock_file_system_posix.js +1 -1
  38. package/src/ngtsc/file_system/testing/src/mock_file_system_windows.js +1 -1
  39. package/src/ngtsc/incremental/semantic_graph/src/graph.js +1 -1
  40. package/src/ngtsc/incremental/src/incremental.js +36 -6
  41. package/src/ngtsc/incremental/src/state.d.ts +5 -3
  42. package/src/ngtsc/incremental/src/state.js +1 -1
  43. package/src/ngtsc/indexer/src/template.js +1 -1
  44. package/src/ngtsc/metadata/src/dts.js +2 -3
  45. package/src/ngtsc/metadata/src/inheritance.js +2 -7
  46. package/src/ngtsc/partial_evaluator/src/builtin.js +1 -1
  47. package/src/ngtsc/partial_evaluator/src/diagnostics.js +4 -1
  48. package/src/ngtsc/partial_evaluator/src/dynamic.d.ts +19 -1
  49. package/src/ngtsc/partial_evaluator/src/dynamic.js +12 -4
  50. package/src/ngtsc/partial_evaluator/src/interpreter.d.ts +2 -0
  51. package/src/ngtsc/partial_evaluator/src/interpreter.js +48 -1
  52. package/src/ngtsc/partial_evaluator/src/ts_helpers.js +1 -1
  53. package/src/ngtsc/program.d.ts +1 -0
  54. package/src/ngtsc/program.js +26 -2
  55. package/src/ngtsc/program_driver/src/api.d.ts +20 -1
  56. package/src/ngtsc/program_driver/src/api.js +3 -2
  57. package/src/ngtsc/program_driver/src/ts_create_program_driver.d.ts +2 -2
  58. package/src/ngtsc/program_driver/src/ts_create_program_driver.js +7 -3
  59. package/src/ngtsc/reflection/src/typescript.js +4 -1
  60. package/src/ngtsc/transform/src/api.d.ts +6 -0
  61. package/src/ngtsc/transform/src/api.js +1 -1
  62. package/src/ngtsc/transform/src/compilation.d.ts +3 -0
  63. package/src/ngtsc/transform/src/compilation.js +124 -53
  64. package/src/ngtsc/transform/src/transform.js +1 -1
  65. package/src/ngtsc/typecheck/src/context.d.ts +2 -1
  66. package/src/ngtsc/typecheck/src/context.js +11 -3
  67. package/src/ngtsc/typecheck/src/template_semantics.js +1 -1
  68. package/src/ngtsc/typecheck/src/template_symbol_builder.js +36 -4
  69. package/src/ngtsc/typecheck/src/type_check_block.js +2 -2
  70. package/src/ngtsc/typecheck/src/type_check_file.js +1 -1
  71. package/src/ngtsc/typecheck/src/type_emitter.d.ts +2 -1
  72. package/src/ngtsc/typecheck/src/type_emitter.js +54 -48
  73. package/src/ngtsc/typecheck/src/type_parameter_emitter.d.ts +2 -0
  74. package/src/ngtsc/typecheck/src/type_parameter_emitter.js +21 -7
  75. package/src/ngtsc/util/src/visitor.d.ts +1 -1
  76. package/src/ngtsc/util/src/visitor.js +1 -8
  77. package/src/ngtsc/xi18n/index.d.ts +9 -0
  78. package/src/ngtsc/xi18n/index.js +22 -0
  79. package/src/ngtsc/xi18n/src/context.d.ts +26 -0
  80. package/src/ngtsc/xi18n/src/context.js +20 -0
  81. package/src/transformers/api.d.ts +0 -3
  82. package/src/transformers/api.js +1 -1
  83. package/src/transformers/i18n.d.ts +14 -0
  84. package/src/transformers/i18n.js +76 -0
  85. package/src/transformers/program.d.ts +0 -4
  86. package/src/transformers/program.js +5 -56
  87. package/src/version.js +1 -1
  88. package/compiler-cli.externs.js +0 -0
  89. package/index.mjs +0 -20
  90. package/linker/babel/babel.externs.js +0 -0
  91. package/linker/babel/index.mjs +0 -11
  92. package/linker/babel/src/ast/babel_ast_factory.mjs +0 -137
  93. package/linker/babel/src/ast/babel_ast_host.mjs +0 -154
  94. package/linker/babel/src/babel_declaration_scope.mjs +0 -52
  95. package/linker/babel/src/babel_plugin.mjs +0 -23
  96. package/linker/babel/src/es2015_linker_plugin.mjs +0 -158
  97. package/linker/babel/src/linker_plugin_options.mjs +0 -2
  98. package/linker/index.mjs +0 -7
  99. package/linker/linker.externs.js +0 -0
  100. package/linker/src/ast/ast_host.mjs +0 -9
  101. package/linker/src/ast/ast_value.mjs +0 -256
  102. package/linker/src/ast/typescript/typescript_ast_host.mjs +0 -156
  103. package/linker/src/ast/utils.mjs +0 -17
  104. package/linker/src/fatal_linker_error.mjs +0 -30
  105. package/linker/src/file_linker/declaration_scope.mjs +0 -9
  106. package/linker/src/file_linker/emit_scopes/emit_scope.mjs +0 -41
  107. package/linker/src/file_linker/emit_scopes/iife_emit_scope.mjs +0 -33
  108. package/linker/src/file_linker/file_linker.mjs +0 -70
  109. package/linker/src/file_linker/get_source_file.mjs +0 -28
  110. package/linker/src/file_linker/linker_environment.mjs +0 -23
  111. package/linker/src/file_linker/linker_options.mjs +0 -16
  112. package/linker/src/file_linker/needs_linking.mjs +0 -27
  113. package/linker/src/file_linker/partial_linkers/partial_class_metadata_linker_1.mjs +0 -29
  114. package/linker/src/file_linker/partial_linkers/partial_component_linker_1.mjs +0 -194
  115. package/linker/src/file_linker/partial_linkers/partial_directive_linker_1.mjs +0 -137
  116. package/linker/src/file_linker/partial_linkers/partial_factory_linker_1.mjs +0 -52
  117. package/linker/src/file_linker/partial_linkers/partial_injectable_linker_1.mjs +0 -56
  118. package/linker/src/file_linker/partial_linkers/partial_injector_linker_1.mjs +0 -38
  119. package/linker/src/file_linker/partial_linkers/partial_linker.mjs +0 -2
  120. package/linker/src/file_linker/partial_linkers/partial_linker_selector.mjs +0 -166
  121. package/linker/src/file_linker/partial_linkers/partial_ng_module_linker_1.mjs +0 -110
  122. package/linker/src/file_linker/partial_linkers/partial_pipe_linker_1.mjs +0 -42
  123. package/linker/src/file_linker/partial_linkers/util.mjs +0 -78
  124. package/linker/src/file_linker/translator.mjs +0 -23
  125. package/linker/src/linker_import_generator.mjs +0 -28
  126. package/ngcc/index.mjs +0 -16
  127. package/ngcc/main-ivy-ngcc.mjs +0 -12
  128. package/ngcc/main-ngcc.mjs +0 -32
  129. package/ngcc/ngcc.externs.js +0 -0
  130. package/ngcc/src/analysis/decoration_analyzer.mjs +0 -215
  131. package/ngcc/src/analysis/migration_host.mjs +0 -80
  132. package/ngcc/src/analysis/module_with_providers_analyzer.mjs +0 -178
  133. package/ngcc/src/analysis/ngcc_references_registry.mjs +0 -45
  134. package/ngcc/src/analysis/ngcc_trait_compiler.mjs +0 -70
  135. package/ngcc/src/analysis/private_declarations_analyzer.mjs +0 -47
  136. package/ngcc/src/analysis/switch_marker_analyzer.mjs +0 -34
  137. package/ngcc/src/analysis/types.mjs +0 -2
  138. package/ngcc/src/analysis/util.mjs +0 -19
  139. package/ngcc/src/command_line_options.mjs +0 -142
  140. package/ngcc/src/constants.mjs +0 -10
  141. package/ngcc/src/dependencies/commonjs_dependency_host.mjs +0 -87
  142. package/ngcc/src/dependencies/dependency_host.mjs +0 -102
  143. package/ngcc/src/dependencies/dependency_resolver.mjs +0 -151
  144. package/ngcc/src/dependencies/dts_dependency_host.mjs +0 -18
  145. package/ngcc/src/dependencies/esm_dependency_host.mjs +0 -286
  146. package/ngcc/src/dependencies/module_resolver.mjs +0 -233
  147. package/ngcc/src/dependencies/umd_dependency_host.mjs +0 -33
  148. package/ngcc/src/entry_point_finder/directory_walker_entry_point_finder.mjs +0 -42
  149. package/ngcc/src/entry_point_finder/entry_point_collector.mjs +0 -120
  150. package/ngcc/src/entry_point_finder/interface.mjs +0 -2
  151. package/ngcc/src/entry_point_finder/program_based_entry_point_finder.mjs +0 -91
  152. package/ngcc/src/entry_point_finder/targeted_entry_point_finder.mjs +0 -216
  153. package/ngcc/src/entry_point_finder/tracing_entry_point_finder.mjs +0 -63
  154. package/ngcc/src/entry_point_finder/utils.mjs +0 -176
  155. package/ngcc/src/execution/analyze_entry_points.mjs +0 -130
  156. package/ngcc/src/execution/api.mjs +0 -2
  157. package/ngcc/src/execution/cluster/api.mjs +0 -9
  158. package/ngcc/src/execution/cluster/executor.mjs +0 -27
  159. package/ngcc/src/execution/cluster/master.mjs +0 -261
  160. package/ngcc/src/execution/cluster/package_json_updater.mjs +0 -45
  161. package/ngcc/src/execution/cluster/utils.mjs +0 -59
  162. package/ngcc/src/execution/cluster/worker.mjs +0 -81
  163. package/ngcc/src/execution/create_compile_function.mjs +0 -62
  164. package/ngcc/src/execution/single_process_executor.mjs +0 -57
  165. package/ngcc/src/execution/tasks/api.mjs +0 -22
  166. package/ngcc/src/execution/tasks/completion.mjs +0 -61
  167. package/ngcc/src/execution/tasks/queues/base_task_queue.mjs +0 -78
  168. package/ngcc/src/execution/tasks/queues/parallel_task_queue.mjs +0 -53
  169. package/ngcc/src/execution/tasks/queues/serial_task_queue.mjs +0 -29
  170. package/ngcc/src/execution/tasks/utils.mjs +0 -114
  171. package/ngcc/src/host/commonjs_host.mjs +0 -220
  172. package/ngcc/src/host/commonjs_umd_utils.mjs +0 -186
  173. package/ngcc/src/host/delegating_host.mjs +0 -140
  174. package/ngcc/src/host/esm2015_host.mjs +0 -2293
  175. package/ngcc/src/host/esm5_host.mjs +0 -721
  176. package/ngcc/src/host/ngcc_host.mjs +0 -15
  177. package/ngcc/src/host/umd_host.mjs +0 -486
  178. package/ngcc/src/host/utils.mjs +0 -12
  179. package/ngcc/src/locking/async_locker.mjs +0 -76
  180. package/ngcc/src/locking/lock_file.mjs +0 -4
  181. package/ngcc/src/locking/lock_file_with_child_process/index.mjs +0 -78
  182. package/ngcc/src/locking/lock_file_with_child_process/unlocker.mjs +0 -34
  183. package/ngcc/src/locking/lock_file_with_child_process/util.mjs +0 -29
  184. package/ngcc/src/locking/sync_locker.mjs +0 -52
  185. package/ngcc/src/main.mjs +0 -134
  186. package/ngcc/src/migrations/migration.mjs +0 -2
  187. package/ngcc/src/migrations/missing_injectable_migration.mjs +0 -164
  188. package/ngcc/src/migrations/undecorated_child_migration.mjs +0 -61
  189. package/ngcc/src/migrations/undecorated_parent_migration.mjs +0 -86
  190. package/ngcc/src/migrations/utils.mjs +0 -117
  191. package/ngcc/src/ngcc_options.mjs +0 -119
  192. package/ngcc/src/packages/build_marker.mjs +0 -84
  193. package/ngcc/src/packages/bundle_program.mjs +0 -52
  194. package/ngcc/src/packages/configuration.mjs +0 -250
  195. package/ngcc/src/packages/entry_point.mjs +0 -239
  196. package/ngcc/src/packages/entry_point_bundle.mjs +0 -68
  197. package/ngcc/src/packages/entry_point_manifest.mjs +0 -162
  198. package/ngcc/src/packages/ngcc_compiler_host.mjs +0 -77
  199. package/ngcc/src/packages/patch_ts_expando_initializer.mjs +0 -166
  200. package/ngcc/src/packages/source_file_cache.mjs +0 -187
  201. package/ngcc/src/packages/transformer.mjs +0 -140
  202. package/ngcc/src/path_mappings.mjs +0 -13
  203. package/ngcc/src/rendering/commonjs_rendering_formatter.mjs +0 -65
  204. package/ngcc/src/rendering/dts_renderer.mjs +0 -139
  205. package/ngcc/src/rendering/esm5_rendering_formatter.mjs +0 -50
  206. package/ngcc/src/rendering/esm_rendering_formatter.mjs +0 -251
  207. package/ngcc/src/rendering/ngcc_import_rewriter.mjs +0 -32
  208. package/ngcc/src/rendering/renderer.mjs +0 -170
  209. package/ngcc/src/rendering/rendering_formatter.mjs +0 -2
  210. package/ngcc/src/rendering/source_maps.mjs +0 -54
  211. package/ngcc/src/rendering/umd_rendering_formatter.mjs +0 -292
  212. package/ngcc/src/rendering/utils.mjs +0 -20
  213. package/ngcc/src/utils.mjs +0 -144
  214. package/ngcc/src/writing/cleaning/cleaning_strategies.mjs +0 -61
  215. package/ngcc/src/writing/cleaning/package_cleaner.mjs +0 -67
  216. package/ngcc/src/writing/cleaning/utils.mjs +0 -16
  217. package/ngcc/src/writing/file_writer.mjs +0 -2
  218. package/ngcc/src/writing/in_place_file_writer.mjs +0 -62
  219. package/ngcc/src/writing/new_entry_point_file_writer.mjs +0 -161
  220. package/ngcc/src/writing/package_json_updater.mjs +0 -144
  221. package/src/diagnostics/translate_diagnostics.mjs +0 -47
  222. package/src/diagnostics/typescript_version.mjs +0 -79
  223. package/src/extract_i18n.mjs +0 -46
  224. package/src/language_services.mjs +0 -18
  225. package/src/main.mjs +0 -185
  226. package/src/metadata/bundle_index_host.mjs +0 -107
  227. package/src/metadata/bundler.mjs +0 -556
  228. package/src/metadata/collector.mjs +0 -701
  229. package/src/metadata/evaluator.mjs +0 -643
  230. package/src/metadata/index.mjs +0 -11
  231. package/src/metadata/index_writer.mjs +0 -44
  232. package/src/metadata/schema.mjs +0 -102
  233. package/src/metadata/symbols.mjs +0 -117
  234. package/src/ngtsc/annotations/annotations.externs.js +0 -0
  235. package/src/ngtsc/annotations/index.mjs +0 -15
  236. package/src/ngtsc/annotations/src/api.mjs +0 -9
  237. package/src/ngtsc/annotations/src/component.mjs +0 -1064
  238. package/src/ngtsc/annotations/src/diagnostics.mjs +0 -147
  239. package/src/ngtsc/annotations/src/directive.mjs +0 -692
  240. package/src/ngtsc/annotations/src/factory.mjs +0 -17
  241. package/src/ngtsc/annotations/src/injectable.mjs +0 -260
  242. package/src/ngtsc/annotations/src/metadata.mjs +0 -145
  243. package/src/ngtsc/annotations/src/ng_module.mjs +0 -565
  244. package/src/ngtsc/annotations/src/pipe.mjs +0 -151
  245. package/src/ngtsc/annotations/src/references_registry.mjs +0 -16
  246. package/src/ngtsc/annotations/src/util.mjs +0 -495
  247. package/src/ngtsc/core/api/index.mjs +0 -12
  248. package/src/ngtsc/core/api/src/adapter.mjs +0 -9
  249. package/src/ngtsc/core/api/src/interfaces.mjs +0 -9
  250. package/src/ngtsc/core/api/src/options.mjs +0 -9
  251. package/src/ngtsc/core/api/src/public_options.mjs +0 -9
  252. package/src/ngtsc/core/api.externs.js +0 -0
  253. package/src/ngtsc/core/core.externs.js +0 -0
  254. package/src/ngtsc/core/index.mjs +0 -10
  255. package/src/ngtsc/core/src/compiler.mjs +0 -908
  256. package/src/ngtsc/core/src/config.mjs +0 -15
  257. package/src/ngtsc/core/src/host.mjs +0 -229
  258. package/src/ngtsc/cycles/cycles.externs.js +0 -0
  259. package/src/ngtsc/cycles/index.mjs +0 -10
  260. package/src/ngtsc/cycles/src/analyzer.mjs +0 -60
  261. package/src/ngtsc/cycles/src/imports.mjs +0 -152
  262. package/src/ngtsc/diagnostics/diagnostics.externs.js +0 -0
  263. package/src/ngtsc/diagnostics/index.mjs +0 -11
  264. package/src/ngtsc/diagnostics/src/error.mjs +0 -51
  265. package/src/ngtsc/diagnostics/src/error_code.mjs +0 -198
  266. package/src/ngtsc/diagnostics/src/util.mjs +0 -21
  267. package/src/ngtsc/entry_point/entry_point.externs.js +0 -0
  268. package/src/ngtsc/entry_point/index.mjs +0 -12
  269. package/src/ngtsc/entry_point/src/generator.mjs +0 -35
  270. package/src/ngtsc/entry_point/src/logic.mjs +0 -35
  271. package/src/ngtsc/entry_point/src/private_export_checker.mjs +0 -122
  272. package/src/ngtsc/entry_point/src/reference_graph.mjs +0 -73
  273. package/src/ngtsc/file_system/file_system.externs.js +0 -0
  274. package/src/ngtsc/file_system/index.mjs +0 -13
  275. package/src/ngtsc/file_system/src/compiler_host.mjs +0 -64
  276. package/src/ngtsc/file_system/src/helpers.mjs +0 -99
  277. package/src/ngtsc/file_system/src/invalid_file_system.mjs +0 -95
  278. package/src/ngtsc/file_system/src/logical.mjs +0 -84
  279. package/src/ngtsc/file_system/src/node_js_file_system.mjs +0 -142
  280. package/src/ngtsc/file_system/src/types.mjs +0 -9
  281. package/src/ngtsc/file_system/src/util.mjs +0 -22
  282. package/src/ngtsc/file_system/testing/index.mjs +0 -13
  283. package/src/ngtsc/file_system/testing/src/mock_file_system.mjs +0 -293
  284. package/src/ngtsc/file_system/testing/src/mock_file_system_native.mjs +0 -57
  285. package/src/ngtsc/file_system/testing/src/mock_file_system_posix.mjs +0 -38
  286. package/src/ngtsc/file_system/testing/src/mock_file_system_windows.mjs +0 -38
  287. package/src/ngtsc/file_system/testing/src/test_helper.mjs +0 -108
  288. package/src/ngtsc/file_system/testing/testing.externs.js +0 -0
  289. package/src/ngtsc/imports/imports.externs.js +0 -0
  290. package/src/ngtsc/imports/index.mjs +0 -14
  291. package/src/ngtsc/imports/src/alias.mjs +0 -137
  292. package/src/ngtsc/imports/src/core.mjs +0 -78
  293. package/src/ngtsc/imports/src/default.mjs +0 -135
  294. package/src/ngtsc/imports/src/emitter.mjs +0 -266
  295. package/src/ngtsc/imports/src/find_export.mjs +0 -56
  296. package/src/ngtsc/imports/src/reexport.mjs +0 -9
  297. package/src/ngtsc/imports/src/references.mjs +0 -137
  298. package/src/ngtsc/imports/src/resolver.mjs +0 -24
  299. package/src/ngtsc/incremental/api.externs.js +0 -0
  300. package/src/ngtsc/incremental/api.mjs +0 -9
  301. package/src/ngtsc/incremental/incremental.externs.js +0 -0
  302. package/src/ngtsc/incremental/index.mjs +0 -12
  303. package/src/ngtsc/incremental/semantic_graph/index.mjs +0 -12
  304. package/src/ngtsc/incremental/semantic_graph/semantic_graph.externs.js +0 -0
  305. package/src/ngtsc/incremental/semantic_graph/src/api.mjs +0 -36
  306. package/src/ngtsc/incremental/semantic_graph/src/graph.mjs +0 -237
  307. package/src/ngtsc/incremental/semantic_graph/src/type_parameters.mjs +0 -40
  308. package/src/ngtsc/incremental/semantic_graph/src/util.mjs +0 -69
  309. package/src/ngtsc/incremental/src/dependency_tracking.mjs +0 -117
  310. package/src/ngtsc/incremental/src/incremental.mjs +0 -267
  311. package/src/ngtsc/incremental/src/noop.mjs +0 -13
  312. package/src/ngtsc/incremental/src/state.mjs +0 -17
  313. package/src/ngtsc/incremental/src/strategy.mjs +0 -76
  314. package/src/ngtsc/indexer/index.mjs +0 -11
  315. package/src/ngtsc/indexer/indexer.externs.js +0 -0
  316. package/src/ngtsc/indexer/src/api.mjs +0 -30
  317. package/src/ngtsc/indexer/src/context.mjs +0 -25
  318. package/src/ngtsc/indexer/src/template.mjs +0 -303
  319. package/src/ngtsc/indexer/src/transform.mjs +0 -51
  320. package/src/ngtsc/logging/index.mjs +0 -10
  321. package/src/ngtsc/logging/logging.externs.js +0 -0
  322. package/src/ngtsc/logging/src/console_logger.mjs +0 -43
  323. package/src/ngtsc/logging/src/logger.mjs +0 -15
  324. package/src/ngtsc/logging/testing/index.mjs +0 -9
  325. package/src/ngtsc/logging/testing/src/mock_logger.mjs +0 -32
  326. package/src/ngtsc/logging/testing/testing.externs.js +0 -0
  327. package/src/ngtsc/metadata/index.mjs +0 -15
  328. package/src/ngtsc/metadata/metadata.externs.js +0 -0
  329. package/src/ngtsc/metadata/src/api.mjs +0 -13
  330. package/src/ngtsc/metadata/src/dts.mjs +0 -143
  331. package/src/ngtsc/metadata/src/inheritance.mjs +0 -71
  332. package/src/ngtsc/metadata/src/property_mapping.mjs +0 -136
  333. package/src/ngtsc/metadata/src/registry.mjs +0 -80
  334. package/src/ngtsc/metadata/src/resource_registry.mjs +0 -81
  335. package/src/ngtsc/metadata/src/util.mjs +0 -200
  336. package/src/ngtsc/partial_evaluator/index.mjs +0 -12
  337. package/src/ngtsc/partial_evaluator/partial_evaluator.externs.js +0 -0
  338. package/src/ngtsc/partial_evaluator/src/builtin.mjs +0 -65
  339. package/src/ngtsc/partial_evaluator/src/diagnostics.mjs +0 -171
  340. package/src/ngtsc/partial_evaluator/src/dynamic.mjs +0 -86
  341. package/src/ngtsc/partial_evaluator/src/interface.mjs +0 -27
  342. package/src/ngtsc/partial_evaluator/src/interpreter.mjs +0 -683
  343. package/src/ngtsc/partial_evaluator/src/known_declaration.mjs +0 -43
  344. package/src/ngtsc/partial_evaluator/src/result.mjs +0 -50
  345. package/src/ngtsc/partial_evaluator/src/ts_helpers.mjs +0 -72
  346. package/src/ngtsc/perf/index.mjs +0 -11
  347. package/src/ngtsc/perf/perf.externs.js +0 -0
  348. package/src/ngtsc/perf/src/api.mjs +0 -278
  349. package/src/ngtsc/perf/src/clock.mjs +0 -15
  350. package/src/ngtsc/perf/src/noop.mjs +0 -21
  351. package/src/ngtsc/perf/src/recorder.mjs +0 -125
  352. package/src/ngtsc/program.mjs +0 -247
  353. package/src/ngtsc/program_driver/index.mjs +0 -10
  354. package/src/ngtsc/program_driver/program_driver.externs.js +0 -0
  355. package/src/ngtsc/program_driver/src/api.mjs +0 -22
  356. package/src/ngtsc/program_driver/src/ts_create_program_driver.mjs +0 -164
  357. package/src/ngtsc/reflection/index.mjs +0 -12
  358. package/src/ngtsc/reflection/reflection.externs.js +0 -0
  359. package/src/ngtsc/reflection/src/host.mjs +0 -73
  360. package/src/ngtsc/reflection/src/type_to_value.mjs +0 -243
  361. package/src/ngtsc/reflection/src/typescript.mjs +0 -608
  362. package/src/ngtsc/reflection/src/util.mjs +0 -21
  363. package/src/ngtsc/resource/index.mjs +0 -9
  364. package/src/ngtsc/resource/resource.externs.js +0 -0
  365. package/src/ngtsc/resource/src/loader.mjs +0 -242
  366. package/src/ngtsc/routing/index.mjs +0 -11
  367. package/src/ngtsc/routing/routing.externs.js +0 -0
  368. package/src/ngtsc/routing/src/analyzer.mjs +0 -69
  369. package/src/ngtsc/routing/src/lazy.mjs +0 -168
  370. package/src/ngtsc/routing/src/route.mjs +0 -51
  371. package/src/ngtsc/scope/index.mjs +0 -12
  372. package/src/ngtsc/scope/scope.externs.js +0 -0
  373. package/src/ngtsc/scope/src/api.mjs +0 -9
  374. package/src/ngtsc/scope/src/component_scope.mjs +0 -31
  375. package/src/ngtsc/scope/src/dependency.mjs +0 -134
  376. package/src/ngtsc/scope/src/local.mjs +0 -531
  377. package/src/ngtsc/scope/src/typecheck.mjs +0 -83
  378. package/src/ngtsc/shims/api.externs.js +0 -0
  379. package/src/ngtsc/shims/api.mjs +0 -2
  380. package/src/ngtsc/shims/index.mjs +0 -14
  381. package/src/ngtsc/shims/shims.externs.js +0 -0
  382. package/src/ngtsc/shims/src/adapter.mjs +0 -188
  383. package/src/ngtsc/shims/src/expando.mjs +0 -102
  384. package/src/ngtsc/shims/src/factory_generator.mjs +0 -265
  385. package/src/ngtsc/shims/src/reference_tagger.mjs +0 -67
  386. package/src/ngtsc/shims/src/summary_generator.mjs +0 -64
  387. package/src/ngtsc/shims/src/util.mjs +0 -26
  388. package/src/ngtsc/sourcemaps/index.mjs +0 -11
  389. package/src/ngtsc/sourcemaps/sourcemaps.externs.js +0 -0
  390. package/src/ngtsc/sourcemaps/src/content_origin.mjs +0 -35
  391. package/src/ngtsc/sourcemaps/src/raw_source_map.mjs +0 -2
  392. package/src/ngtsc/sourcemaps/src/segment_marker.mjs +0 -40
  393. package/src/ngtsc/sourcemaps/src/source_file.mjs +0 -459
  394. package/src/ngtsc/sourcemaps/src/source_file_loader.mjs +0 -213
  395. package/src/ngtsc/switch/index.mjs +0 -9
  396. package/src/ngtsc/switch/src/switch.mjs +0 -115
  397. package/src/ngtsc/switch/switch.externs.js +0 -0
  398. package/src/ngtsc/transform/index.mjs +0 -14
  399. package/src/ngtsc/transform/src/alias.mjs +0 -30
  400. package/src/ngtsc/transform/src/api.mjs +0 -63
  401. package/src/ngtsc/transform/src/compilation.mjs +0 -485
  402. package/src/ngtsc/transform/src/declaration.mjs +0 -182
  403. package/src/ngtsc/transform/src/trait.mjs +0 -95
  404. package/src/ngtsc/transform/src/transform.mjs +0 -298
  405. package/src/ngtsc/transform/src/utils.mjs +0 -57
  406. package/src/ngtsc/transform/transform.externs.js +0 -0
  407. package/src/ngtsc/translator/index.mjs +0 -14
  408. package/src/ngtsc/translator/src/api/ast_factory.mjs +0 -9
  409. package/src/ngtsc/translator/src/api/import_generator.mjs +0 -9
  410. package/src/ngtsc/translator/src/context.mjs +0 -24
  411. package/src/ngtsc/translator/src/import_manager.mjs +0 -48
  412. package/src/ngtsc/translator/src/translator.mjs +0 -317
  413. package/src/ngtsc/translator/src/type_translator.mjs +0 -204
  414. package/src/ngtsc/translator/src/typescript_ast_factory.mjs +0 -211
  415. package/src/ngtsc/translator/src/typescript_translator.mjs +0 -17
  416. package/src/ngtsc/translator/translator.externs.js +0 -0
  417. package/src/ngtsc/tsc_plugin.mjs +0 -98
  418. package/src/ngtsc/typecheck/api/api.externs.js +0 -0
  419. package/src/ngtsc/typecheck/api/api.mjs +0 -9
  420. package/src/ngtsc/typecheck/api/checker.mjs +0 -31
  421. package/src/ngtsc/typecheck/api/completion.mjs +0 -16
  422. package/src/ngtsc/typecheck/api/context.mjs +0 -9
  423. package/src/ngtsc/typecheck/api/index.mjs +0 -14
  424. package/src/ngtsc/typecheck/api/scope.mjs +0 -9
  425. package/src/ngtsc/typecheck/api/symbols.mjs +0 -22
  426. package/src/ngtsc/typecheck/diagnostics/diagnostics.externs.js +0 -0
  427. package/src/ngtsc/typecheck/diagnostics/index.mjs +0 -10
  428. package/src/ngtsc/typecheck/diagnostics/src/diagnostic.mjs +0 -99
  429. package/src/ngtsc/typecheck/diagnostics/src/id.mjs +0 -23
  430. package/src/ngtsc/typecheck/index.mjs +0 -12
  431. package/src/ngtsc/typecheck/src/checker.mjs +0 -591
  432. package/src/ngtsc/typecheck/src/comments.mjs +0 -159
  433. package/src/ngtsc/typecheck/src/completion.mjs +0 -155
  434. package/src/ngtsc/typecheck/src/context.mjs +0 -350
  435. package/src/ngtsc/typecheck/src/diagnostics.mjs +0 -95
  436. package/src/ngtsc/typecheck/src/dom.mjs +0 -68
  437. package/src/ngtsc/typecheck/src/environment.mjs +0 -146
  438. package/src/ngtsc/typecheck/src/expression.mjs +0 -412
  439. package/src/ngtsc/typecheck/src/line_mappings.mjs +0 -60
  440. package/src/ngtsc/typecheck/src/oob.mjs +0 -112
  441. package/src/ngtsc/typecheck/src/shim.mjs +0 -37
  442. package/src/ngtsc/typecheck/src/source.mjs +0 -74
  443. package/src/ngtsc/typecheck/src/tcb_util.mjs +0 -135
  444. package/src/ngtsc/typecheck/src/template_semantics.mjs +0 -34
  445. package/src/ngtsc/typecheck/src/template_symbol_builder.mjs +0 -472
  446. package/src/ngtsc/typecheck/src/ts_util.mjs +0 -157
  447. package/src/ngtsc/typecheck/src/type_check_block.mjs +0 -1770
  448. package/src/ngtsc/typecheck/src/type_check_file.mjs +0 -65
  449. package/src/ngtsc/typecheck/src/type_constructor.mjs +0 -227
  450. package/src/ngtsc/typecheck/src/type_emitter.mjs +0 -140
  451. package/src/ngtsc/typecheck/src/type_parameter_emitter.mjs +0 -80
  452. package/src/ngtsc/typecheck/typecheck.externs.js +0 -0
  453. package/src/ngtsc/util/src/path.mjs +0 -18
  454. package/src/ngtsc/util/src/typescript.mjs +0 -143
  455. package/src/ngtsc/util/src/visitor.mjs +0 -107
  456. package/src/ngtsc/util/util.externs.js +0 -0
  457. package/src/perform_compile.mjs +0 -275
  458. package/src/perform_watch.mjs +0 -247
  459. package/src/tooling.mjs +0 -32
  460. package/src/transformers/api.mjs +0 -27
  461. package/src/transformers/compiler_host.mjs +0 -593
  462. package/src/transformers/downlevel_decorators_transform.mjs +0 -507
  463. package/src/transformers/entry_points.mjs +0 -10
  464. package/src/transformers/inline_resources.mjs +0 -269
  465. package/src/transformers/lower_expressions.mjs +0 -336
  466. package/src/transformers/metadata_cache.mjs +0 -53
  467. package/src/transformers/metadata_reader.mjs +0 -104
  468. package/src/transformers/node_emitter.mjs +0 -606
  469. package/src/transformers/node_emitter_transform.mjs +0 -78
  470. package/src/transformers/patch_alias_reference_resolution.mjs +0 -109
  471. package/src/transformers/program.mjs +0 -935
  472. package/src/transformers/r3_metadata_transform.mjs +0 -46
  473. package/src/transformers/r3_transform.mjs +0 -29
  474. package/src/transformers/util.mjs +0 -89
  475. package/src/typescript_support.mjs +0 -57
  476. package/src/version.mjs +0 -15
@@ -1,485 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright Google LLC All Rights Reserved.
4
- *
5
- * Use of this source code is governed by an MIT-style license that can be
6
- * found in the LICENSE file at https://angular.io/license
7
- */
8
- import * as ts from 'typescript';
9
- import { ErrorCode, FatalDiagnosticError } from '../../diagnostics';
10
- import { PerfEvent } from '../../perf';
11
- import { getSourceFile } from '../../util/src/typescript';
12
- import { CompilationMode, HandlerPrecedence } from './api';
13
- import { Trait, TraitState } from './trait';
14
- /**
15
- * The heart of Angular compilation.
16
- *
17
- * The `TraitCompiler` is responsible for processing all classes in the program. Any time a
18
- * `DecoratorHandler` matches a class, a "trait" is created to represent that Angular aspect of the
19
- * class (such as the class having a component definition).
20
- *
21
- * The `TraitCompiler` transitions each trait through the various phases of compilation, culminating
22
- * in the production of `CompileResult`s instructing the compiler to apply various mutations to the
23
- * class (like adding fields or type declarations).
24
- */
25
- export class TraitCompiler {
26
- constructor(handlers, reflector, perf, incrementalBuild, compileNonExportedClasses, compilationMode, dtsTransforms, semanticDepGraphUpdater) {
27
- this.handlers = handlers;
28
- this.reflector = reflector;
29
- this.perf = perf;
30
- this.incrementalBuild = incrementalBuild;
31
- this.compileNonExportedClasses = compileNonExportedClasses;
32
- this.compilationMode = compilationMode;
33
- this.dtsTransforms = dtsTransforms;
34
- this.semanticDepGraphUpdater = semanticDepGraphUpdater;
35
- /**
36
- * Maps class declarations to their `ClassRecord`, which tracks the Ivy traits being applied to
37
- * those classes.
38
- */
39
- this.classes = new Map();
40
- /**
41
- * Maps source files to any class declaration(s) within them which have been discovered to contain
42
- * Ivy traits.
43
- */
44
- this.fileToClasses = new Map();
45
- this.reexportMap = new Map();
46
- this.handlersByName = new Map();
47
- for (const handler of handlers) {
48
- this.handlersByName.set(handler.name, handler);
49
- }
50
- }
51
- analyzeSync(sf) {
52
- this.analyze(sf, false);
53
- }
54
- analyzeAsync(sf) {
55
- return this.analyze(sf, true);
56
- }
57
- analyze(sf, preanalyze) {
58
- // We shouldn't analyze declaration files.
59
- if (sf.isDeclarationFile) {
60
- return undefined;
61
- }
62
- // analyze() really wants to return `Promise<void>|void`, but TypeScript cannot narrow a return
63
- // type of 'void', so `undefined` is used instead.
64
- const promises = [];
65
- const priorWork = this.incrementalBuild.priorAnalysisFor(sf);
66
- if (priorWork !== null) {
67
- for (const priorRecord of priorWork) {
68
- this.adopt(priorRecord);
69
- }
70
- this.perf.eventCount(PerfEvent.SourceFileReuseAnalysis);
71
- this.perf.eventCount(PerfEvent.TraitReuseAnalysis, priorWork.length);
72
- // Skip the rest of analysis, as this file's prior traits are being reused.
73
- return;
74
- }
75
- const visit = (node) => {
76
- if (this.reflector.isClass(node)) {
77
- this.analyzeClass(node, preanalyze ? promises : null);
78
- }
79
- ts.forEachChild(node, visit);
80
- };
81
- visit(sf);
82
- if (preanalyze && promises.length > 0) {
83
- return Promise.all(promises).then(() => undefined);
84
- }
85
- else {
86
- return undefined;
87
- }
88
- }
89
- recordFor(clazz) {
90
- if (this.classes.has(clazz)) {
91
- return this.classes.get(clazz);
92
- }
93
- else {
94
- return null;
95
- }
96
- }
97
- recordsFor(sf) {
98
- if (!this.fileToClasses.has(sf)) {
99
- return null;
100
- }
101
- const records = [];
102
- for (const clazz of this.fileToClasses.get(sf)) {
103
- records.push(this.classes.get(clazz));
104
- }
105
- return records;
106
- }
107
- /**
108
- * Import a `ClassRecord` from a previous compilation.
109
- *
110
- * Traits from the `ClassRecord` have accurate metadata, but the `handler` is from the old program
111
- * and needs to be updated (matching is done by name). A new pending trait is created and then
112
- * transitioned to analyzed using the previous analysis. If the trait is in the errored state,
113
- * instead the errors are copied over.
114
- */
115
- adopt(priorRecord) {
116
- const record = {
117
- hasPrimaryHandler: priorRecord.hasPrimaryHandler,
118
- hasWeakHandlers: priorRecord.hasWeakHandlers,
119
- metaDiagnostics: priorRecord.metaDiagnostics,
120
- node: priorRecord.node,
121
- traits: [],
122
- };
123
- for (const priorTrait of priorRecord.traits) {
124
- const handler = this.handlersByName.get(priorTrait.handler.name);
125
- let trait = Trait.pending(handler, priorTrait.detected);
126
- if (priorTrait.state === TraitState.Analyzed || priorTrait.state === TraitState.Resolved) {
127
- const symbol = this.makeSymbolForTrait(handler, record.node, priorTrait.analysis);
128
- trait = trait.toAnalyzed(priorTrait.analysis, priorTrait.analysisDiagnostics, symbol);
129
- if (trait.analysis !== null && trait.handler.register !== undefined) {
130
- trait.handler.register(record.node, trait.analysis);
131
- }
132
- }
133
- else if (priorTrait.state === TraitState.Skipped) {
134
- trait = trait.toSkipped();
135
- }
136
- record.traits.push(trait);
137
- }
138
- this.classes.set(record.node, record);
139
- const sf = record.node.getSourceFile();
140
- if (!this.fileToClasses.has(sf)) {
141
- this.fileToClasses.set(sf, new Set());
142
- }
143
- this.fileToClasses.get(sf).add(record.node);
144
- }
145
- scanClassForTraits(clazz) {
146
- if (!this.compileNonExportedClasses && !this.reflector.isStaticallyExported(clazz)) {
147
- return null;
148
- }
149
- const decorators = this.reflector.getDecoratorsOfDeclaration(clazz);
150
- return this.detectTraits(clazz, decorators);
151
- }
152
- detectTraits(clazz, decorators) {
153
- let record = this.recordFor(clazz);
154
- let foundTraits = [];
155
- for (const handler of this.handlers) {
156
- const result = handler.detect(clazz, decorators);
157
- if (result === undefined) {
158
- continue;
159
- }
160
- const isPrimaryHandler = handler.precedence === HandlerPrecedence.PRIMARY;
161
- const isWeakHandler = handler.precedence === HandlerPrecedence.WEAK;
162
- const trait = Trait.pending(handler, result);
163
- foundTraits.push(trait);
164
- if (record === null) {
165
- // This is the first handler to match this class. This path is a fast path through which
166
- // most classes will flow.
167
- record = {
168
- node: clazz,
169
- traits: [trait],
170
- metaDiagnostics: null,
171
- hasPrimaryHandler: isPrimaryHandler,
172
- hasWeakHandlers: isWeakHandler,
173
- };
174
- this.classes.set(clazz, record);
175
- const sf = clazz.getSourceFile();
176
- if (!this.fileToClasses.has(sf)) {
177
- this.fileToClasses.set(sf, new Set());
178
- }
179
- this.fileToClasses.get(sf).add(clazz);
180
- }
181
- else {
182
- // This is at least the second handler to match this class. This is a slower path that some
183
- // classes will go through, which validates that the set of decorators applied to the class
184
- // is valid.
185
- // Validate according to rules as follows:
186
- //
187
- // * WEAK handlers are removed if a non-WEAK handler matches.
188
- // * Only one PRIMARY handler can match at a time. Any other PRIMARY handler matching a
189
- // class with an existing PRIMARY handler is an error.
190
- if (!isWeakHandler && record.hasWeakHandlers) {
191
- // The current handler is not a WEAK handler, but the class has other WEAK handlers.
192
- // Remove them.
193
- record.traits =
194
- record.traits.filter(field => field.handler.precedence !== HandlerPrecedence.WEAK);
195
- record.hasWeakHandlers = false;
196
- }
197
- else if (isWeakHandler && !record.hasWeakHandlers) {
198
- // The current handler is a WEAK handler, but the class has non-WEAK handlers already.
199
- // Drop the current one.
200
- continue;
201
- }
202
- if (isPrimaryHandler && record.hasPrimaryHandler) {
203
- // The class already has a PRIMARY handler, and another one just matched.
204
- record.metaDiagnostics = [{
205
- category: ts.DiagnosticCategory.Error,
206
- code: Number('-99' + ErrorCode.DECORATOR_COLLISION),
207
- file: getSourceFile(clazz),
208
- start: clazz.getStart(undefined, false),
209
- length: clazz.getWidth(),
210
- messageText: 'Two incompatible decorators on class',
211
- }];
212
- record.traits = foundTraits = [];
213
- break;
214
- }
215
- // Otherwise, it's safe to accept the multiple decorators here. Update some of the metadata
216
- // regarding this class.
217
- record.traits.push(trait);
218
- record.hasPrimaryHandler = record.hasPrimaryHandler || isPrimaryHandler;
219
- }
220
- }
221
- return foundTraits.length > 0 ? foundTraits : null;
222
- }
223
- makeSymbolForTrait(handler, decl, analysis) {
224
- if (analysis === null) {
225
- return null;
226
- }
227
- const symbol = handler.symbol(decl, analysis);
228
- if (symbol !== null && this.semanticDepGraphUpdater !== null) {
229
- const isPrimary = handler.precedence === HandlerPrecedence.PRIMARY;
230
- if (!isPrimary) {
231
- throw new Error(`AssertionError: ${handler.name} returned a symbol but is not a primary handler.`);
232
- }
233
- this.semanticDepGraphUpdater.registerSymbol(symbol);
234
- }
235
- return symbol;
236
- }
237
- analyzeClass(clazz, preanalyzeQueue) {
238
- const traits = this.scanClassForTraits(clazz);
239
- if (traits === null) {
240
- // There are no Ivy traits on the class, so it can safely be skipped.
241
- return;
242
- }
243
- for (const trait of traits) {
244
- const analyze = () => this.analyzeTrait(clazz, trait);
245
- let preanalysis = null;
246
- if (preanalyzeQueue !== null && trait.handler.preanalyze !== undefined) {
247
- // Attempt to run preanalysis. This could fail with a `FatalDiagnosticError`; catch it if it
248
- // does.
249
- try {
250
- preanalysis = trait.handler.preanalyze(clazz, trait.detected.metadata) || null;
251
- }
252
- catch (err) {
253
- if (err instanceof FatalDiagnosticError) {
254
- trait.toAnalyzed(null, [err.toDiagnostic()], null);
255
- return;
256
- }
257
- else {
258
- throw err;
259
- }
260
- }
261
- }
262
- if (preanalysis !== null) {
263
- preanalyzeQueue.push(preanalysis.then(analyze));
264
- }
265
- else {
266
- analyze();
267
- }
268
- }
269
- }
270
- analyzeTrait(clazz, trait, flags) {
271
- var _a, _b, _c;
272
- if (trait.state !== TraitState.Pending) {
273
- throw new Error(`Attempt to analyze trait of ${clazz.name.text} in state ${TraitState[trait.state]} (expected DETECTED)`);
274
- }
275
- this.perf.eventCount(PerfEvent.TraitAnalyze);
276
- // Attempt analysis. This could fail with a `FatalDiagnosticError`; catch it if it does.
277
- let result;
278
- try {
279
- result = trait.handler.analyze(clazz, trait.detected.metadata, flags);
280
- }
281
- catch (err) {
282
- if (err instanceof FatalDiagnosticError) {
283
- trait.toAnalyzed(null, [err.toDiagnostic()], null);
284
- return;
285
- }
286
- else {
287
- throw err;
288
- }
289
- }
290
- const symbol = this.makeSymbolForTrait(trait.handler, clazz, (_a = result.analysis) !== null && _a !== void 0 ? _a : null);
291
- if (result.analysis !== undefined && trait.handler.register !== undefined) {
292
- trait.handler.register(clazz, result.analysis);
293
- }
294
- trait = trait.toAnalyzed((_b = result.analysis) !== null && _b !== void 0 ? _b : null, (_c = result.diagnostics) !== null && _c !== void 0 ? _c : null, symbol);
295
- }
296
- resolve() {
297
- var _a, _b;
298
- const classes = Array.from(this.classes.keys());
299
- for (const clazz of classes) {
300
- const record = this.classes.get(clazz);
301
- for (let trait of record.traits) {
302
- const handler = trait.handler;
303
- switch (trait.state) {
304
- case TraitState.Skipped:
305
- continue;
306
- case TraitState.Pending:
307
- throw new Error(`Resolving a trait that hasn't been analyzed: ${clazz.name.text} / ${Object.getPrototypeOf(trait.handler).constructor.name}`);
308
- case TraitState.Resolved:
309
- throw new Error(`Resolving an already resolved trait`);
310
- }
311
- if (trait.analysis === null) {
312
- // No analysis results, cannot further process this trait.
313
- continue;
314
- }
315
- if (handler.resolve === undefined) {
316
- // No resolution of this trait needed - it's considered successful by default.
317
- trait = trait.toResolved(null, null);
318
- continue;
319
- }
320
- let result;
321
- try {
322
- result = handler.resolve(clazz, trait.analysis, trait.symbol);
323
- }
324
- catch (err) {
325
- if (err instanceof FatalDiagnosticError) {
326
- trait = trait.toResolved(null, [err.toDiagnostic()]);
327
- continue;
328
- }
329
- else {
330
- throw err;
331
- }
332
- }
333
- trait = trait.toResolved((_a = result.data) !== null && _a !== void 0 ? _a : null, (_b = result.diagnostics) !== null && _b !== void 0 ? _b : null);
334
- if (result.reexports !== undefined) {
335
- const fileName = clazz.getSourceFile().fileName;
336
- if (!this.reexportMap.has(fileName)) {
337
- this.reexportMap.set(fileName, new Map());
338
- }
339
- const fileReexports = this.reexportMap.get(fileName);
340
- for (const reexport of result.reexports) {
341
- fileReexports.set(reexport.asAlias, [reexport.fromModule, reexport.symbolName]);
342
- }
343
- }
344
- }
345
- }
346
- }
347
- /**
348
- * Generate type-checking code into the `TypeCheckContext` for any components within the given
349
- * `ts.SourceFile`.
350
- */
351
- typeCheck(sf, ctx) {
352
- if (!this.fileToClasses.has(sf)) {
353
- return;
354
- }
355
- for (const clazz of this.fileToClasses.get(sf)) {
356
- const record = this.classes.get(clazz);
357
- for (const trait of record.traits) {
358
- if (trait.state !== TraitState.Resolved) {
359
- continue;
360
- }
361
- else if (trait.handler.typeCheck === undefined) {
362
- continue;
363
- }
364
- if (trait.resolution !== null) {
365
- trait.handler.typeCheck(ctx, clazz, trait.analysis, trait.resolution);
366
- }
367
- }
368
- }
369
- }
370
- index(ctx) {
371
- for (const clazz of this.classes.keys()) {
372
- const record = this.classes.get(clazz);
373
- for (const trait of record.traits) {
374
- if (trait.state !== TraitState.Resolved) {
375
- // Skip traits that haven't been resolved successfully.
376
- continue;
377
- }
378
- else if (trait.handler.index === undefined) {
379
- // Skip traits that don't affect indexing.
380
- continue;
381
- }
382
- if (trait.resolution !== null) {
383
- trait.handler.index(ctx, clazz, trait.analysis, trait.resolution);
384
- }
385
- }
386
- }
387
- }
388
- updateResources(clazz) {
389
- if (!this.reflector.isClass(clazz) || !this.classes.has(clazz)) {
390
- return;
391
- }
392
- const record = this.classes.get(clazz);
393
- for (const trait of record.traits) {
394
- if (trait.state !== TraitState.Resolved || trait.handler.updateResources === undefined) {
395
- continue;
396
- }
397
- trait.handler.updateResources(clazz, trait.analysis, trait.resolution);
398
- }
399
- }
400
- compile(clazz, constantPool) {
401
- const original = ts.getOriginalNode(clazz);
402
- if (!this.reflector.isClass(clazz) || !this.reflector.isClass(original) ||
403
- !this.classes.has(original)) {
404
- return null;
405
- }
406
- const record = this.classes.get(original);
407
- let res = [];
408
- for (const trait of record.traits) {
409
- if (trait.state !== TraitState.Resolved || trait.analysisDiagnostics !== null ||
410
- trait.resolveDiagnostics !== null) {
411
- // Cannot compile a trait that is not resolved, or had any errors in its declaration.
412
- continue;
413
- }
414
- // `trait.resolution` is non-null asserted here because TypeScript does not recognize that
415
- // `Readonly<unknown>` is nullable (as `unknown` itself is nullable) due to the way that
416
- // `Readonly` works.
417
- let compileRes;
418
- if (this.compilationMode === CompilationMode.PARTIAL &&
419
- trait.handler.compilePartial !== undefined) {
420
- compileRes = trait.handler.compilePartial(clazz, trait.analysis, trait.resolution);
421
- }
422
- else {
423
- compileRes =
424
- trait.handler.compileFull(clazz, trait.analysis, trait.resolution, constantPool);
425
- }
426
- const compileMatchRes = compileRes;
427
- if (Array.isArray(compileMatchRes)) {
428
- for (const result of compileMatchRes) {
429
- if (!res.some(r => r.name === result.name)) {
430
- res.push(result);
431
- }
432
- }
433
- }
434
- else if (!res.some(result => result.name === compileMatchRes.name)) {
435
- res.push(compileMatchRes);
436
- }
437
- }
438
- // Look up the .d.ts transformer for the input file and record that at least one field was
439
- // generated, which will allow the .d.ts to be transformed later.
440
- this.dtsTransforms.getIvyDeclarationTransform(original.getSourceFile())
441
- .addFields(original, res);
442
- // Return the instruction to the transformer so the fields will be added.
443
- return res.length > 0 ? res : null;
444
- }
445
- decoratorsFor(node) {
446
- const original = ts.getOriginalNode(node);
447
- if (!this.reflector.isClass(original) || !this.classes.has(original)) {
448
- return [];
449
- }
450
- const record = this.classes.get(original);
451
- const decorators = [];
452
- for (const trait of record.traits) {
453
- if (trait.state !== TraitState.Resolved) {
454
- continue;
455
- }
456
- if (trait.detected.trigger !== null && ts.isDecorator(trait.detected.trigger)) {
457
- decorators.push(trait.detected.trigger);
458
- }
459
- }
460
- return decorators;
461
- }
462
- get diagnostics() {
463
- const diagnostics = [];
464
- for (const clazz of this.classes.keys()) {
465
- const record = this.classes.get(clazz);
466
- if (record.metaDiagnostics !== null) {
467
- diagnostics.push(...record.metaDiagnostics);
468
- }
469
- for (const trait of record.traits) {
470
- if ((trait.state === TraitState.Analyzed || trait.state === TraitState.Resolved) &&
471
- trait.analysisDiagnostics !== null) {
472
- diagnostics.push(...trait.analysisDiagnostics);
473
- }
474
- if (trait.state === TraitState.Resolved && trait.resolveDiagnostics !== null) {
475
- diagnostics.push(...trait.resolveDiagnostics);
476
- }
477
- }
478
- }
479
- return diagnostics;
480
- }
481
- get exportStatements() {
482
- return this.reexportMap;
483
- }
484
- }
485
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci1jbGkvc3JjL25ndHNjL3RyYW5zZm9ybS9zcmMvY29tcGlsYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBR0gsT0FBTyxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFakMsT0FBTyxFQUFDLFNBQVMsRUFBRSxvQkFBb0IsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBSWxFLE9BQU8sRUFBQyxTQUFTLEVBQWUsTUFBTSxZQUFZLENBQUM7QUFHbkQsT0FBTyxFQUFDLGFBQWEsRUFBYSxNQUFNLDJCQUEyQixDQUFDO0FBRXBFLE9BQU8sRUFBaUIsZUFBZSxFQUFpRCxpQkFBaUIsRUFBZ0IsTUFBTSxPQUFPLENBQUM7QUFFdkksT0FBTyxFQUFlLEtBQUssRUFBRSxVQUFVLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFxQ3hEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLE9BQU8sYUFBYTtJQWtCeEIsWUFDWSxRQUE0RSxFQUM1RSxTQUF5QixFQUFVLElBQWtCLEVBQ3JELGdCQUF3RCxFQUN4RCx5QkFBa0MsRUFBVSxlQUFnQyxFQUM1RSxhQUFtQyxFQUNuQyx1QkFBcUQ7UUFMckQsYUFBUSxHQUFSLFFBQVEsQ0FBb0U7UUFDNUUsY0FBUyxHQUFULFNBQVMsQ0FBZ0I7UUFBVSxTQUFJLEdBQUosSUFBSSxDQUFjO1FBQ3JELHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBd0M7UUFDeEQsOEJBQXlCLEdBQXpCLHlCQUF5QixDQUFTO1FBQVUsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQzVFLGtCQUFhLEdBQWIsYUFBYSxDQUFzQjtRQUNuQyw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQThCO1FBdkJqRTs7O1dBR0c7UUFDSyxZQUFPLEdBQUcsSUFBSSxHQUFHLEVBQWlDLENBQUM7UUFF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QUFrQixDQUFDLENBQUM7aUJBQy9DO2FBQ0Y7U0FDRjtRQUNELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFJLGdCQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7Q29uc3RhbnRQb29sfSBmcm9tICdAYW5ndWxhci9jb21waWxlcic7XG5pbXBvcnQgKiBhcyB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHtFcnJvckNvZGUsIEZhdGFsRGlhZ25vc3RpY0Vycm9yfSBmcm9tICcuLi8uLi9kaWFnbm9zdGljcyc7XG5pbXBvcnQge0luY3JlbWVudGFsQnVpbGR9IGZyb20gJy4uLy4uL2luY3JlbWVudGFsL2FwaSc7XG5pbXBvcnQge1NlbWFudGljRGVwR3JhcGhVcGRhdGVyLCBTZW1hbnRpY1N5bWJvbH0gZnJvbSAnLi4vLi4vaW5jcmVtZW50YWwvc2VtYW50aWNfZ3JhcGgnO1xuaW1wb3J0IHtJbmRleGluZ0NvbnRleHR9IGZyb20gJy4uLy4uL2luZGV4ZXInO1xuaW1wb3J0IHtQZXJmRXZlbnQsIFBlcmZSZWNvcmRlcn0gZnJvbSAnLi4vLi4vcGVyZic7XG5pbXBvcnQge0NsYXNzRGVjbGFyYXRpb24sIERlY2xhcmF0aW9uTm9kZSwgRGVjb3JhdG9yLCBSZWZsZWN0aW9uSG9zdH0gZnJvbSAnLi4vLi4vcmVmbGVjdGlvbic7XG5pbXBvcnQge1Byb2dyYW1UeXBlQ2hlY2tBZGFwdGVyLCBUeXBlQ2hlY2tDb250ZXh0fSBmcm9tICcuLi8uLi90eXBlY2hlY2svYXBpJztcbmltcG9ydCB7Z2V0U291cmNlRmlsZSwgaXNFeHBvcnRlZH0gZnJvbSAnLi4vLi4vdXRpbC9zcmMvdHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7QW5hbHlzaXNPdXRwdXQsIENvbXBpbGF0aW9uTW9kZSwgQ29tcGlsZVJlc3VsdCwgRGVjb3JhdG9ySGFuZGxlciwgSGFuZGxlckZsYWdzLCBIYW5kbGVyUHJlY2VkZW5jZSwgUmVzb2x2ZVJlc3VsdH0gZnJvbSAnLi9hcGknO1xuaW1wb3J0IHtEdHNUcmFuc2Zvcm1SZWdpc3RyeX0gZnJvbSAnLi9kZWNsYXJhdGlvbic7XG5pbXBvcnQge1BlbmRpbmdUcmFpdCwgVHJhaXQsIFRyYWl0U3RhdGV9IGZyb20gJy4vdHJhaXQnO1xuXG5cbi8qKlxuICogUmVjb3JkcyBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIGNsYXNzIHRoYXQgaGFzIG1hdGNoZWQgdHJhaXRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsYXNzUmVjb3JkIHtcbiAgLyoqXG4gICAqIFRoZSBgQ2xhc3NEZWNsYXJhdGlvbmAgb2YgdGhlIGNsYXNzIHdoaWNoIGhhcyBBbmd1bGFyIHRyYWl0cyBhcHBsaWVkLlxuICAgKi9cbiAgbm9kZTogQ2xhc3NEZWNsYXJhdGlvbjtcblxuICAvKipcbiAgICogQWxsIHRyYWl0cyB3aGljaCBtYXRjaGVkIG9uIHRoZSBjbGFzcy5cbiAgICovXG4gIHRyYWl0czogVHJhaXQ8dW5rbm93biwgdW5rbm93biwgU2VtYW50aWNTeW1ib2x8bnVsbCwgdW5rbm93bj5bXTtcblxuICAvKipcbiAgICogTWV0YS1kaWFnbm9zdGljcyBhYm91dCB0aGUgY2xhc3MsIHdoaWNoIGFyZSB1c3VhbGx5IHJlbGF0ZWQgdG8gd2hldGhlciBjZXJ0YWluIGNvbWJpbmF0aW9ucyBvZlxuICAgKiBBbmd1bGFyIGRlY29yYXRvcnMgYXJlIG5vdCBwZXJtaXR0ZWQuXG4gICAqL1xuICBtZXRhRGlhZ25vc3RpY3M6IHRzLkRpYWdub3N0aWNbXXxudWxsO1xuXG4gIC8vIFN1YnNlcXVlbnQgZmllbGRzIGFyZSBcImludGVybmFsXCIgYW5kIHVzZWQgZHVyaW5nIHRoZSBtYXRjaGluZyBvZiBgRGVjb3JhdG9ySGFuZGxlcmBzLiBUaGlzIGlzXG4gIC8vIG11dGFibGUgc3RhdGUgZHVyaW5nIHRoZSBgZGV0ZWN0YC9gYW5hbHl6ZWAgcGhhc2VzIG9mIGNvbXBpbGF0aW9uLlxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGB0cmFpdHNgIGNvbnRhaW5zIHRyYWl0cyBtYXRjaGVkIGZyb20gYERlY29yYXRvckhhbmRsZXJgcyBtYXJrZWQgYXMgYFdFQUtgLlxuICAgKi9cbiAgaGFzV2Vha0hhbmRsZXJzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGB0cmFpdHNgIGNvbnRhaW5zIGEgdHJhaXQgZnJvbSBhIGBEZWNvcmF0b3JIYW5kbGVyYCBtYXRjaGVkIGFzIGBQUklNQVJZYC5cbiAgICovXG4gIGhhc1ByaW1hcnlIYW5kbGVyOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBoZWFydCBvZiBBbmd1bGFyIGNvbXBpbGF0aW9uLlxuICpcbiAqIFRoZSBgVHJhaXRDb21waWxlcmAgaXMgcmVzcG9uc2libGUgZm9yIHByb2Nlc3NpbmcgYWxsIGNsYXNzZXMgaW4gdGhlIHByb2dyYW0uIEFueSB0aW1lIGFcbiAqIGBEZWNvcmF0b3JIYW5kbGVyYCBtYXRjaGVzIGEgY2xhc3MsIGEgXCJ0cmFpdFwiIGlzIGNyZWF0ZWQgdG8gcmVwcmVzZW50IHRoYXQgQW5ndWxhciBhc3BlY3Qgb2YgdGhlXG4gKiBjbGFzcyAoc3VjaCBhcyB0aGUgY2xhc3MgaGF2aW5nIGEgY29tcG9uZW50IGRlZmluaXRpb24pLlxuICpcbiAqIFRoZSBgVHJhaXRDb21waWxlcmAgdHJhbnNpdGlvbnMgZWFjaCB0cmFpdCB0aHJvdWdoIHRoZSB2YXJpb3VzIHBoYXNlcyBvZiBjb21waWxhdGlvbiwgY3VsbWluYXRpbmdcbiAqIGluIHRoZSBwcm9kdWN0aW9uIG9mIGBDb21waWxlUmVzdWx0YHMgaW5zdHJ1Y3RpbmcgdGhlIGNvbXBpbGVyIHRvIGFwcGx5IHZhcmlvdXMgbXV0YXRpb25zIHRvIHRoZVxuICogY2xhc3MgKGxpa2UgYWRkaW5nIGZpZWxkcyBvciB0eXBlIGRlY2xhcmF0aW9ucykuXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFpdENvbXBpbGVyIGltcGxlbWVudHMgUHJvZ3JhbVR5cGVDaGVja0FkYXB0ZXIge1xuICAvKipcbiAgICogTWFwcyBjbGFzcyBkZWNsYXJhdGlvbnMgdG8gdGhlaXIgYENsYXNzUmVjb3JkYCwgd2hpY2ggdHJhY2tzIHRoZSBJdnkgdHJhaXRzIGJlaW5nIGFwcGxpZWQgdG9cbiAgICogdGhvc2UgY2xhc3Nlcy5cbiAgICovXG4gIHByaXZhdGUgY2xhc3NlcyA9IG5ldyBNYXA8Q2xhc3NEZWNsYXJhdGlvbiwgQ2xhc3NSZWNvcmQ+KCk7XG5cbiAgLyoqXG4gICAqIE1hcHMgc291cmNlIGZpbGVzIHRvIGFueSBjbGFzcyBkZWNsYXJhdGlvbihzKSB3aXRoaW4gdGhlbSB3aGljaCBoYXZlIGJlZW4gZGlzY292ZXJlZCB0byBjb250YWluXG4gICAqIEl2eSB0cmFpdHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgZmlsZVRvQ2xhc3NlcyA9IG5ldyBNYXA8dHMuU291cmNlRmlsZSwgU2V0PENsYXNzRGVjbGFyYXRpb24+PigpO1xuXG4gIHByaXZhdGUgcmVleHBvcnRNYXAgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgW3N0cmluZywgc3RyaW5nXT4+KCk7XG5cbiAgcHJpdmF0ZSBoYW5kbGVyc0J5TmFtZSA9XG4gICAgICBuZXcgTWFwPHN0cmluZywgRGVjb3JhdG9ySGFuZGxlcjx1bmtub3duLCB1bmtub3duLCBTZW1hbnRpY1N5bWJvbHxudWxsLCB1bmtub3duPj4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByaXZhdGUgaGFuZGxlcnM6IERlY29yYXRvckhhbmRsZXI8dW5rbm93biwgdW5rbm93biwgU2VtYW50aWNTeW1ib2x8bnVsbCwgdW5rbm93bj5bXSxcbiAgICAgIHByaXZhdGUgcmVmbGVjdG9yOiBSZWZsZWN0aW9uSG9zdCwgcHJpdmF0ZSBwZXJmOiBQZXJmUmVjb3JkZXIsXG4gICAgICBwcml2YXRlIGluY3JlbWVudGFsQnVpbGQ6IEluY3JlbWVudGFsQnVpbGQ8Q2xhc3NSZWNvcmQsIHVua25vd24+LFxuICAgICAgcHJpdmF0ZSBjb21waWxlTm9uRXhwb3J0ZWRDbGFzc2VzOiBib29sZWFuLCBwcml2YXRlIGNvbXBpbGF0aW9uTW9kZTogQ29tcGlsYXRpb25Nb2RlLFxuICAgICAgcHJpdmF0ZSBkdHNUcmFuc2Zvcm1zOiBEdHNUcmFuc2Zvcm1SZWdpc3RyeSxcbiAgICAgIHByaXZhdGUgc2VtYW50aWNEZXBHcmFwaFVwZGF0ZXI6IFNlbWFudGljRGVwR3JhcGhVcGRhdGVyfG51bGwpIHtcbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcbiAgICAgIHRoaXMuaGFuZGxlcnNCeU5hbWUuc2V0KGhhbmRsZXIubmFtZSwgaGFuZGxlcik7XG4gICAgfVxuICB9XG5cbiAgYW5hbHl6ZVN5bmMoc2Y6IHRzLlNvdXJjZUZpbGUpOiB2b2lkIHtcbiAgICB0aGlzLmFuYWx5emUoc2YsIGZhbHNlKTtcbiAgfVxuXG4gIGFuYWx5emVBc3luYyhzZjogdHMuU291cmNlRmlsZSk6IFByb21pc2U8dm9pZD58dW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hbmFseXplKHNmLCB0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgYW5hbHl6ZShzZjogdHMuU291cmNlRmlsZSwgcHJlYW5hbHl6ZTogZmFsc2UpOiB2b2lkO1xuICBwcml2YXRlIGFuYWx5emUoc2Y6IHRzLlNvdXJjZUZpbGUsIHByZWFuYWx5emU6IHRydWUpOiBQcm9taXNlPHZvaWQ+fHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBhbmFseXplKHNmOiB0cy5Tb3VyY2VGaWxlLCBwcmVhbmFseXplOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPnx1bmRlZmluZWQge1xuICAgIC8vIFdlIHNob3VsZG4ndCBhbmFseXplIGRlY2xhcmF0aW9uIGZpbGVzLlxuICAgIGlmIChzZi5pc0RlY2xhcmF0aW9uRmlsZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBhbmFseXplKCkgcmVhbGx5IHdhbnRzIHRvIHJldHVybiBgUHJvbWlzZTx2b2lkPnx2b2lkYCwgYnV0IFR5cGVTY3JpcHQgY2Fubm90IG5hcnJvdyBhIHJldHVyblxuICAgIC8vIHR5cGUgb2YgJ3ZvaWQnLCBzbyBgdW5kZWZpbmVkYCBpcyB1c2VkIGluc3RlYWQuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuXG4gICAgY29uc3QgcHJpb3JXb3JrID0gdGhpcy5pbmNyZW1lbnRhbEJ1aWxkLnByaW9yQW5hbHlzaXNGb3Ioc2YpO1xuICAgIGlmIChwcmlvcldvcmsgIT09IG51bGwpIHtcbiAgICAgIGZvciAoY29uc3QgcHJpb3JSZWNvcmQgb2YgcHJpb3JXb3JrKSB7XG4gICAgICAgIHRoaXMuYWRvcHQocHJpb3JSZWNvcmQpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBlcmYuZXZlbnRDb3VudChQZXJmRXZlbnQuU291cmNlRmlsZVJldXNlQW5hbHlzaXMpO1xuICAgICAgdGhpcy5wZXJmLmV2ZW50Q291bnQoUGVyZkV2ZW50LlRyYWl0UmV1c2VBbmFseXNpcywgcHJpb3JXb3JrLmxlbmd0aCk7XG5cbiAgICAgIC8vIFNraXAgdGhlIHJlc3Qgb2YgYW5hbHlzaXMsIGFzIHRoaXMgZmlsZSdzIHByaW9yIHRyYWl0cyBhcmUgYmVpbmcgcmV1c2VkLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZpc2l0ID0gKG5vZGU6IHRzLk5vZGUpOiB2b2lkID0+IHtcbiAgICAgIGlmICh0aGlzLnJlZmxlY3Rvci5pc0NsYXNzKG5vZGUpKSB7XG4gICAgICAgIHRoaXMuYW5hbHl6ZUNsYXNzKG5vZGUsIHByZWFuYWx5emUgPyBwcm9taXNlcyA6IG51bGwpO1xuICAgICAgfVxuICAgICAgdHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KTtcbiAgICB9O1xuXG4gICAgdmlzaXQoc2YpO1xuXG4gICAgaWYgKHByZWFuYWx5emUgJiYgcHJvbWlzZXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IHVuZGVmaW5lZCBhcyB2b2lkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICByZWNvcmRGb3IoY2xheno6IENsYXNzRGVjbGFyYXRpb24pOiBDbGFzc1JlY29yZHxudWxsIHtcbiAgICBpZiAodGhpcy5jbGFzc2VzLmhhcyhjbGF6eikpIHtcbiAgICAgIHJldHVybiB0aGlzLmNsYXNzZXMuZ2V0KGNsYXp6KSE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJlY29yZHNGb3Ioc2Y6IHRzLlNvdXJjZUZpbGUpOiBDbGFzc1JlY29yZFtdfG51bGwge1xuICAgIGlmICghdGhpcy5maWxlVG9DbGFzc2VzLmhhcyhzZikpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCByZWNvcmRzOiBDbGFzc1JlY29yZFtdID0gW107XG4gICAgZm9yIChjb25zdCBjbGF6eiBvZiB0aGlzLmZpbGVUb0NsYXNzZXMuZ2V0KHNmKSEpIHtcbiAgICAgIHJlY29yZHMucHVzaCh0aGlzLmNsYXNzZXMuZ2V0KGNsYXp6KSEpO1xuICAgIH1cbiAgICByZXR1cm4gcmVjb3JkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYSBgQ2xhc3NSZWNvcmRgIGZyb20gYSBwcmV2aW91cyBjb21waWxhdGlvbi5cbiAgICpcbiAgICogVHJhaXRzIGZyb20gdGhlIGBDbGFzc1JlY29yZGAgaGF2ZSBhY2N1cmF0ZSBtZXRhZGF0YSwgYnV0IHRoZSBgaGFuZGxlcmAgaXMgZnJvbSB0aGUgb2xkIHByb2dyYW1cbiAgICogYW5kIG5lZWRzIHRvIGJlIHVwZGF0ZWQgKG1hdGNoaW5nIGlzIGRvbmUgYnkgbmFtZSkuIEEgbmV3IHBlbmRpbmcgdHJhaXQgaXMgY3JlYXRlZCBhbmQgdGhlblxuICAgKiB0cmFuc2l0aW9uZWQgdG8gYW5hbHl6ZWQgdXNpbmcgdGhlIHByZXZpb3VzIGFuYWx5c2lzLiBJZiB0aGUgdHJhaXQgaXMgaW4gdGhlIGVycm9yZWQgc3RhdGUsXG4gICAqIGluc3RlYWQgdGhlIGVycm9ycyBhcmUgY29waWVkIG92ZXIuXG4gICAqL1xuICBwcml2YXRlIGFkb3B0KHByaW9yUmVjb3JkOiBDbGFzc1JlY29yZCk6IHZvaWQge1xuICAgIGNvbnN0IHJlY29yZDogQ2xhc3NSZWNvcmQgPSB7XG4gICAgICBoYXNQcmltYXJ5SGFuZGxlcjogcHJpb3JSZWNvcmQuaGFzUHJpbWFyeUhhbmRsZXIsXG4gICAgICBoYXNXZWFrSGFuZGxlcnM6IHByaW9yUmVjb3JkLmhhc1dlYWtIYW5kbGVycyxcbiAgICAgIG1ldGFEaWFnbm9zdGljczogcHJpb3JSZWNvcmQubWV0YURpYWdub3N0aWNzLFxuICAgICAgbm9kZTogcHJpb3JSZWNvcmQubm9kZSxcbiAgICAgIHRyYWl0czogW10sXG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgcHJpb3JUcmFpdCBvZiBwcmlvclJlY29yZC50cmFpdHMpIHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzQnlOYW1lLmdldChwcmlvclRyYWl0LmhhbmRsZXIubmFtZSkhO1xuICAgICAgbGV0IHRyYWl0OiBUcmFpdDx1bmtub3duLCB1bmtub3duLCBTZW1hbnRpY1N5bWJvbHxudWxsLCB1bmtub3duPiA9XG4gICAgICAgICAgVHJhaXQucGVuZGluZyhoYW5kbGVyLCBwcmlvclRyYWl0LmRldGVjdGVkKTtcblxuICAgICAgaWYgKHByaW9yVHJhaXQuc3RhdGUgPT09IFRyYWl0U3RhdGUuQW5hbHl6ZWQgfHwgcHJpb3JUcmFpdC5zdGF0ZSA9PT0gVHJhaXRTdGF0ZS5SZXNvbHZlZCkge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSB0aGlzLm1ha2VTeW1ib2xGb3JUcmFpdChoYW5kbGVyLCByZWNvcmQubm9kZSwgcHJpb3JUcmFpdC5hbmFseXNpcyk7XG4gICAgICAgIHRyYWl0ID0gdHJhaXQudG9BbmFseXplZChwcmlvclRyYWl0LmFuYWx5c2lzLCBwcmlvclRyYWl0LmFuYWx5c2lzRGlhZ25vc3RpY3MsIHN5bWJvbCk7XG4gICAgICAgIGlmICh0cmFpdC5hbmFseXNpcyAhPT0gbnVsbCAmJiB0cmFpdC5oYW5kbGVyLnJlZ2lzdGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0cmFpdC5oYW5kbGVyLnJlZ2lzdGVyKHJlY29yZC5ub2RlLCB0cmFpdC5hbmFseXNpcyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocHJpb3JUcmFpdC5zdGF0ZSA9PT0gVHJhaXRTdGF0ZS5Ta2lwcGVkKSB7XG4gICAgICAgIHRyYWl0ID0gdHJhaXQudG9Ta2lwcGVkKCk7XG4gICAgICB9XG5cbiAgICAgIHJlY29yZC50cmFpdHMucHVzaCh0cmFpdCk7XG4gICAgfVxuXG4gICAgdGhpcy5jbGFzc2VzLnNldChyZWNvcmQubm9kZSwgcmVjb3JkKTtcbiAgICBjb25zdCBzZiA9IHJlY29yZC5ub2RlLmdldFNvdXJjZUZpbGUoKTtcbiAgICBpZiAoIXRoaXMuZmlsZVRvQ2xhc3Nlcy5oYXMoc2YpKSB7XG4gICAgICB0aGlzLmZpbGVUb0NsYXNzZXMuc2V0KHNmLCBuZXcgU2V0PENsYXNzRGVjbGFyYXRpb24+KCkpO1xuICAgIH1cbiAgICB0aGlzLmZpbGVUb0NsYXNzZXMuZ2V0KHNmKSEuYWRkKHJlY29yZC5ub2RlKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NhbkNsYXNzRm9yVHJhaXRzKGNsYXp6OiBDbGFzc0RlY2xhcmF0aW9uKTpcbiAgICAgIFBlbmRpbmdUcmFpdDx1bmtub3duLCB1bmtub3duLCBTZW1hbnRpY1N5bWJvbHxudWxsLCB1bmtub3duPltdfG51bGwge1xuICAgIGlmICghdGhpcy5jb21waWxlTm9uRXhwb3J0ZWRDbGFzc2VzICYmICF0aGlzLnJlZmxlY3Rvci5pc1N0YXRpY2FsbHlFeHBvcnRlZChjbGF6eikpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY29yYXRvcnMgPSB0aGlzLnJlZmxlY3Rvci5nZXREZWNvcmF0b3JzT2ZEZWNsYXJhdGlvbihjbGF6eik7XG5cbiAgICByZXR1cm4gdGhpcy5kZXRlY3RUcmFpdHMoY2xhenosIGRlY29yYXRvcnMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRldGVjdFRyYWl0cyhjbGF6ejogQ2xhc3NEZWNsYXJhdGlvbiwgZGVjb3JhdG9yczogRGVjb3JhdG9yW118bnVsbCk6XG4gICAgICBQZW5kaW5nVHJhaXQ8dW5rbm93biwgdW5rbm93biwgU2VtYW50aWNTeW1ib2x8bnVsbCwgdW5rbm93bj5bXXxudWxsIHtcbiAgICBsZXQgcmVjb3JkOiBDbGFzc1JlY29yZHxudWxsID0gdGhpcy5yZWNvcmRGb3IoY2xhenopO1xuICAgIGxldCBmb3VuZFRyYWl0czogUGVuZGluZ1RyYWl0PHVua25vd24sIHVua25vd24sIFNlbWFudGljU3ltYm9sfG51bGwsIHVua25vd24+W10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiB0aGlzLmhhbmRsZXJzKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBoYW5kbGVyLmRldGVjdChjbGF6eiwgZGVjb3JhdG9ycyk7XG4gICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzUHJpbWFyeUhhbmRsZXIgPSBoYW5kbGVyLnByZWNlZGVuY2UgPT09IEhhbmRsZXJQcmVjZWRlbmNlLlBSSU1BUlk7XG4gICAgICBjb25zdCBpc1dlYWtIYW5kbGVyID0gaGFuZGxlci5wcmVjZWRlbmNlID09PSBIYW5kbGVyUHJlY2VkZW5jZS5XRUFLO1xuICAgICAgY29uc3QgdHJhaXQgPSBUcmFpdC5wZW5kaW5nKGhhbmRsZXIsIHJlc3VsdCk7XG5cbiAgICAgIGZvdW5kVHJhaXRzLnB1c2godHJhaXQpO1xuXG4gICAgICBpZiAocmVjb3JkID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGhhbmRsZXIgdG8gbWF0Y2ggdGhpcyBjbGFzcy4gVGhpcyBwYXRoIGlzIGEgZmFzdCBwYXRoIHRocm91Z2ggd2hpY2hcbiAgICAgICAgLy8gbW9zdCBjbGFzc2VzIHdpbGwgZmxvdy5cbiAgICAgICAgcmVjb3JkID0ge1xuICAgICAgICAgIG5vZGU6IGNsYXp6LFxuICAgICAgICAgIHRyYWl0czogW3RyYWl0XSxcbiAgICAgICAgICBtZXRhRGlhZ25vc3RpY3M6IG51bGwsXG4gICAgICAgICAgaGFzUHJpbWFyeUhhbmRsZXI6IGlzUHJpbWFyeUhhbmRsZXIsXG4gICAgICAgICAgaGFzV2Vha0hhbmRsZXJzOiBpc1dlYWtIYW5kbGVyLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuY2xhc3Nlcy5zZXQoY2xhenosIHJlY29yZCk7XG4gICAgICAgIGNvbnN0IHNmID0gY2xhenouZ2V0U291cmNlRmlsZSgpO1xuICAgICAgICBpZiAoIXRoaXMuZmlsZVRvQ2xhc3Nlcy5oYXMoc2YpKSB7XG4gICAgICAgICAgdGhpcy5maWxlVG9DbGFzc2VzLnNldChzZiwgbmV3IFNldDxDbGFzc0RlY2xhcmF0aW9uPigpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbGVUb0NsYXNzZXMuZ2V0KHNmKSEuYWRkKGNsYXp6KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYXQgbGVhc3QgdGhlIHNlY29uZCBoYW5kbGVyIHRvIG1hdGNoIHRoaXMgY2xhc3MuIFRoaXMgaXMgYSBzbG93ZXIgcGF0aCB0aGF0IHNvbWVcbiAgICAgICAgLy8gY2xhc3NlcyB3aWxsIGdvIHRocm91Z2gsIHdoaWNoIHZhbGlkYXRlcyB0aGF0IHRoZSBzZXQgb2YgZGVjb3JhdG9ycyBhcHBsaWVkIHRvIHRoZSBjbGFzc1xuICAgICAgICAvLyBpcyB2YWxpZC5cblxuICAgICAgICAvLyBWYWxpZGF0ZSBhY2NvcmRpbmcgdG8gcnVsZXMgYXMgZm9sbG93czpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gKiBXRUFLIGhhbmRsZXJzIGFyZSByZW1vdmVkIGlmIGEgbm9uLVdFQUsgaGFuZGxlciBtYXRjaGVzLlxuICAgICAgICAvLyAqIE9ubHkgb25lIFBSSU1BUlkgaGFuZGxlciBjYW4gbWF0Y2ggYXQgYSB0aW1lLiBBbnkgb3RoZXIgUFJJTUFSWSBoYW5kbGVyIG1hdGNoaW5nIGFcbiAgICAgICAgLy8gICBjbGFzcyB3aXRoIGFuIGV4aXN0aW5nIFBSSU1BUlkgaGFuZGxlciBpcyBhbiBlcnJvci5cblxuICAgICAgICBpZiAoIWlzV2Vha0hhbmRsZXIgJiYgcmVjb3JkLmhhc1dlYWtIYW5kbGVycykge1xuICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGhhbmRsZXIgaXMgbm90IGEgV0VBSyBoYW5kbGVyLCBidXQgdGhlIGNsYXNzIGhhcyBvdGhlciBXRUFLIGhhbmRsZXJzLlxuICAgICAgICAgIC8vIFJlbW92ZSB0aGVtLlxuICAgICAgICAgIHJlY29yZC50cmFpdHMgPVxuICAgICAgICAgICAgICByZWNvcmQudHJhaXRzLmZpbHRlcihmaWVsZCA9PiBmaWVsZC5oYW5kbGVyLnByZWNlZGVuY2UgIT09IEhhbmRsZXJQcmVjZWRlbmNlLldFQUspO1xuICAgICAgICAgIHJlY29yZC5oYXNXZWFrSGFuZGxlcnMgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChpc1dlYWtIYW5kbGVyICYmICFyZWNvcmQuaGFzV2Vha0hhbmRsZXJzKSB7XG4gICAgICAgICAgLy8gVGhlIGN1cnJlbnQgaGFuZGxlciBpcyBhIFdFQUsgaGFuZGxlciwgYnV0IHRoZSBjbGFzcyBoYXMgbm9uLVdFQUsgaGFuZGxlcnMgYWxyZWFkeS5cbiAgICAgICAgICAvLyBEcm9wIHRoZSBjdXJyZW50IG9uZS5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1ByaW1hcnlIYW5kbGVyICYmIHJlY29yZC5oYXNQcmltYXJ5SGFuZGxlcikge1xuICAgICAgICAgIC8vIFRoZSBjbGFzcyBhbHJlYWR5IGhhcyBhIFBSSU1BUlkgaGFuZGxlciwgYW5kIGFub3RoZXIgb25lIGp1c3QgbWF0Y2hlZC5cbiAgICAgICAgICByZWNvcmQubWV0YURpYWdub3N0aWNzID0gW3tcbiAgICAgICAgICAgIGNhdGVnb3J5OiB0cy5EaWFnbm9zdGljQ2F0ZWdvcnkuRXJyb3IsXG4gICAgICAgICAgICBjb2RlOiBOdW1iZXIoJy05OScgKyBFcnJvckNvZGUuREVDT1JBVE9SX0NPTExJU0lPTiksXG4gICAgICAgICAgICBmaWxlOiBnZXRTb3VyY2VGaWxlKGNsYXp6KSxcbiAgICAgICAgICAgIHN0YXJ0OiBjbGF6ei5nZXRTdGFydCh1bmRlZmluZWQsIGZhbHNlKSxcbiAgICAgICAgICAgIGxlbmd0aDogY2xhenouZ2V0V2lkdGgoKSxcbiAgICAgICAgICAgIG1lc3NhZ2VUZXh0OiAnVHdvIGluY29tcGF0aWJsZSBkZWNvcmF0b3JzIG9uIGNsYXNzJyxcbiAgICAgICAgICB9XTtcbiAgICAgICAgICByZWNvcmQudHJhaXRzID0gZm91bmRUcmFpdHMgPSBbXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgaXQncyBzYWZlIHRvIGFjY2VwdCB0aGUgbXVsdGlwbGUgZGVjb3JhdG9ycyBoZXJlLiBVcGRhdGUgc29tZSBvZiB0aGUgbWV0YWRhdGFcbiAgICAgICAgLy8gcmVnYXJkaW5nIHRoaXMgY2xhc3MuXG4gICAgICAgIHJlY29yZC50cmFpdHMucHVzaCh0cmFpdCk7XG4gICAgICAgIHJlY29yZC5oYXNQcmltYXJ5SGFuZGxlciA9IHJlY29yZC5oYXNQcmltYXJ5SGFuZGxlciB8fCBpc1ByaW1hcnlIYW5kbGVyO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmb3VuZFRyYWl0cy5sZW5ndGggPiAwID8gZm91bmRUcmFpdHMgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBtYWtlU3ltYm9sRm9yVHJhaXQoXG4gICAgICBoYW5kbGVyOiBEZWNvcmF0b3JIYW5kbGVyPHVua25vd24sIHVua25vd24sIFNlbWFudGljU3ltYm9sfG51bGwsIHVua25vd24+LFxuICAgICAgZGVjbDogQ2xhc3NEZWNsYXJhdGlvbiwgYW5hbHlzaXM6IFJlYWRvbmx5PHVua25vd24+fG51bGwpOiBTZW1hbnRpY1N5bWJvbHxudWxsIHtcbiAgICBpZiAoYW5hbHlzaXMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBzeW1ib2wgPSBoYW5kbGVyLnN5bWJvbChkZWNsLCBhbmFseXNpcyk7XG4gICAgaWYgKHN5bWJvbCAhPT0gbnVsbCAmJiB0aGlzLnNlbWFudGljRGVwR3JhcGhVcGRhdGVyICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBpc1ByaW1hcnkgPSBoYW5kbGVyLnByZWNlZGVuY2UgPT09IEhhbmRsZXJQcmVjZWRlbmNlLlBSSU1BUlk7XG4gICAgICBpZiAoIWlzUHJpbWFyeSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQXNzZXJ0aW9uRXJyb3I6ICR7aGFuZGxlci5uYW1lfSByZXR1cm5lZCBhIHN5bWJvbCBidXQgaXMgbm90IGEgcHJpbWFyeSBoYW5kbGVyLmApO1xuICAgICAgfVxuICAgICAgdGhpcy5zZW1hbnRpY0RlcEdyYXBoVXBkYXRlci5yZWdpc3RlclN5bWJvbChzeW1ib2wpO1xuICAgIH1cblxuICAgIHJldHVybiBzeW1ib2w7XG4gIH1cblxuICBwcm90ZWN0ZWQgYW5hbHl6ZUNsYXNzKGNsYXp6OiBDbGFzc0RlY2xhcmF0aW9uLCBwcmVhbmFseXplUXVldWU6IFByb21pc2U8dm9pZD5bXXxudWxsKTogdm9pZCB7XG4gICAgY29uc3QgdHJhaXRzID0gdGhpcy5zY2FuQ2xhc3NGb3JUcmFpdHMoY2xhenopO1xuXG4gICAgaWYgKHRyYWl0cyA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhlcmUgYXJlIG5vIEl2eSB0cmFpdHMgb24gdGhlIGNsYXNzLCBzbyBpdCBjYW4gc2FmZWx5IGJlIHNraXBwZWQuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB0cmFpdCBvZiB0cmFpdHMpIHtcbiAgICAgIGNvbnN0IGFuYWx5emUgPSAoKSA9PiB0aGlzLmFuYWx5emVUcmFpdChjbGF6eiwgdHJhaXQpO1xuXG4gICAgICBsZXQgcHJlYW5hbHlzaXM6IFByb21pc2U8dm9pZD58bnVsbCA9IG51bGw7XG4gICAgICBpZiAocHJlYW5hbHl6ZVF1ZXVlICE9PSBudWxsICYmIHRyYWl0LmhhbmRsZXIucHJlYW5hbHl6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIEF0dGVtcHQgdG8gcnVuIHByZWFuYWx5c2lzLiBUaGlzIGNvdWxkIGZhaWwgd2l0aCBhIGBGYXRhbERpYWdub3N0aWNFcnJvcmA7IGNhdGNoIGl0IGlmIGl0XG4gICAgICAgIC8vIGRvZXMuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcHJlYW5hbHlzaXMgPSB0cmFpdC5oYW5kbGVyLnByZWFuYWx5emUoY2xhenosIHRyYWl0LmRldGVjdGVkLm1ldGFkYXRhKSB8fCBudWxsO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRmF0YWxEaWFnbm9zdGljRXJyb3IpIHtcbiAgICAgICAgICAgIHRyYWl0LnRvQW5hbHl6ZWQobnVsbCwgW2Vyci50b0RpYWdub3N0aWMoKV0sIG51bGwpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocHJlYW5hbHlzaXMgIT09IG51bGwpIHtcbiAgICAgICAgcHJlYW5hbHl6ZVF1ZXVlIS5wdXNoKHByZWFuYWx5c2lzLnRoZW4oYW5hbHl6ZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYW5hbHl6ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhbmFseXplVHJhaXQoXG4gICAgICBjbGF6ejogQ2xhc3NEZWNsYXJhdGlvbiwgdHJhaXQ6IFRyYWl0PHVua25vd24sIHVua25vd24sIFNlbWFudGljU3ltYm9sfG51bGwsIHVua25vd24+LFxuICAgICAgZmxhZ3M/OiBIYW5kbGVyRmxhZ3MpOiB2b2lkIHtcbiAgICBpZiAodHJhaXQuc3RhdGUgIT09IFRyYWl0U3RhdGUuUGVuZGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBdHRlbXB0IHRvIGFuYWx5emUgdHJhaXQgb2YgJHtjbGF6ei5uYW1lLnRleHR9IGluIHN0YXRlICR7XG4gICAgICAgICAgVHJhaXRTdGF0ZVt0cmFpdC5zdGF0ZV19IChleHBlY3RlZCBERVRFQ1RFRClgKTtcbiAgICB9XG5cbiAgICB0aGlzLnBlcmYuZXZlbnRDb3VudChQZXJmRXZlbnQuVHJhaXRBbmFseXplKTtcblxuICAgIC8vIEF0dGVtcHQgYW5hbHlzaXMuIFRoaXMgY291bGQgZmFpbCB3aXRoIGEgYEZhdGFsRGlhZ25vc3RpY0Vycm9yYDsgY2F0Y2ggaXQgaWYgaXQgZG9lcy5cbiAgICBsZXQgcmVzdWx0OiBBbmFseXNpc091dHB1dDx1bmtub3duPjtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gdHJhaXQuaGFuZGxlci5hbmFseXplKGNsYXp6LCB0cmFpdC5kZXRlY3RlZC5tZXRhZGF0YSwgZmxhZ3MpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEZhdGFsRGlhZ25vc3RpY0Vycm9yKSB7XG4gICAgICAgIHRyYWl0LnRvQW5hbHl6ZWQobnVsbCwgW2Vyci50b0RpYWdub3N0aWMoKV0sIG51bGwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3ltYm9sID0gdGhpcy5tYWtlU3ltYm9sRm9yVHJhaXQodHJhaXQuaGFuZGxlciwgY2xhenosIHJlc3VsdC5hbmFseXNpcyA/PyBudWxsKTtcbiAgICBpZiAocmVzdWx0LmFuYWx5c2lzICE9PSB1bmRlZmluZWQgJiYgdHJhaXQuaGFuZGxlci5yZWdpc3RlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cmFpdC5oYW5kbGVyLnJlZ2lzdGVyKGNsYXp6LCByZXN1bHQuYW5hbHlzaXMpO1xuICAgIH1cbiAgICB0cmFpdCA9IHRyYWl0LnRvQW5hbHl6ZWQocmVzdWx0LmFuYWx5c2lzID8/IG51bGwsIHJlc3VsdC5kaWFnbm9zdGljcyA/PyBudWxsLCBzeW1ib2wpO1xuICB9XG5cbiAgcmVzb2x2ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjbGFzc2VzID0gQXJyYXkuZnJvbSh0aGlzLmNsYXNzZXMua2V5cygpKTtcbiAgICBmb3IgKGNvbnN0IGNsYXp6IG9mIGNsYXNzZXMpIHtcbiAgICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuY2xhc3Nlcy5nZXQoY2xhenopITtcbiAgICAgIGZvciAobGV0IHRyYWl0IG9mIHJlY29yZC50cmFpdHMpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHRyYWl0LmhhbmRsZXI7XG4gICAgICAgIHN3aXRjaCAodHJhaXQuc3RhdGUpIHtcbiAgICAgICAgICBjYXNlIFRyYWl0U3RhdGUuU2tpcHBlZDpcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIGNhc2UgVHJhaXRTdGF0ZS5QZW5kaW5nOlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZXNvbHZpbmcgYSB0cmFpdCB0aGF0IGhhc24ndCBiZWVuIGFuYWx5emVkOiAke2NsYXp6Lm5hbWUudGV4dH0gLyAke1xuICAgICAgICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZih0cmFpdC5oYW5kbGVyKS5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgICAgICAgIGNhc2UgVHJhaXRTdGF0ZS5SZXNvbHZlZDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVzb2x2aW5nIGFuIGFscmVhZHkgcmVzb2x2ZWQgdHJhaXRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0cmFpdC5hbmFseXNpcyA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIE5vIGFuYWx5c2lzIHJlc3VsdHMsIGNhbm5vdCBmdXJ0aGVyIHByb2Nlc3MgdGhpcyB0cmFpdC5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYW5kbGVyLnJlc29sdmUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIE5vIHJlc29sdXRpb24gb2YgdGhpcyB0cmFpdCBuZWVkZWQgLSBpdCdzIGNvbnNpZGVyZWQgc3VjY2Vzc2Z1bCBieSBkZWZhdWx0LlxuICAgICAgICAgIHRyYWl0ID0gdHJhaXQudG9SZXNvbHZlZChudWxsLCBudWxsKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHQ6IFJlc29sdmVSZXN1bHQ8dW5rbm93bj47XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzdWx0ID0gaGFuZGxlci5yZXNvbHZlKGNsYXp6LCB0cmFpdC5hbmFseXNpcyBhcyBSZWFkb25seTx1bmtub3duPiwgdHJhaXQuc3ltYm9sKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEZhdGFsRGlhZ25vc3RpY0Vycm9yKSB7XG4gICAgICAgICAgICB0cmFpdCA9IHRyYWl0LnRvUmVzb2x2ZWQobnVsbCwgW2Vyci50b0RpYWdub3N0aWMoKV0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0cmFpdCA9IHRyYWl0LnRvUmVzb2x2ZWQocmVzdWx0LmRhdGEgPz8gbnVsbCwgcmVzdWx0LmRpYWdub3N0aWNzID8/IG51bGwpO1xuXG4gICAgICAgIGlmIChyZXN1bHQucmVleHBvcnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGNsYXp6LmdldFNvdXJjZUZpbGUoKS5maWxlTmFtZTtcbiAgICAgICAgICBpZiAoIXRoaXMucmVleHBvcnRNYXAuaGFzKGZpbGVOYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5yZWV4cG9ydE1hcC5zZXQoZmlsZU5hbWUsIG5ldyBNYXA8c3RyaW5nLCBbc3RyaW5nLCBzdHJpbmddPigpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZmlsZVJlZXhwb3J0cyA9IHRoaXMucmVleHBvcnRNYXAuZ2V0KGZpbGVOYW1lKSE7XG4gICAgICAgICAgZm9yIChjb25zdCByZWV4cG9ydCBvZiByZXN1bHQucmVleHBvcnRzKSB7XG4gICAgICAgICAgICBmaWxlUmVleHBvcnRzLnNldChyZWV4cG9ydC5hc0FsaWFzLCBbcmVleHBvcnQuZnJvbU1vZHVsZSwgcmVleHBvcnQuc3ltYm9sTmFtZV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB0eXBlLWNoZWNraW5nIGNvZGUgaW50byB0aGUgYFR5cGVDaGVja0NvbnRleHRgIGZvciBhbnkgY29tcG9uZW50cyB3aXRoaW4gdGhlIGdpdmVuXG4gICAqIGB0cy5Tb3VyY2VGaWxlYC5cbiAgICovXG4gIHR5cGVDaGVjayhzZjogdHMuU291cmNlRmlsZSwgY3R4OiBUeXBlQ2hlY2tDb250ZXh0KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmZpbGVUb0NsYXNzZXMuaGFzKHNmKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2xhenogb2YgdGhpcy5maWxlVG9DbGFzc2VzLmdldChzZikhKSB7XG4gICAgICBjb25zdCByZWNvcmQgPSB0aGlzLmNsYXNzZXMuZ2V0KGNsYXp6KSE7XG4gICAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIHJlY29yZC50cmFpdHMpIHtcbiAgICAgICAgaWYgKHRyYWl0LnN0YXRlICE9PSBUcmFpdFN0YXRlLlJlc29sdmVkKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAodHJhaXQuaGFuZGxlci50eXBlQ2hlY2sgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFpdC5yZXNvbHV0aW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgdHJhaXQuaGFuZGxlci50eXBlQ2hlY2soY3R4LCBjbGF6eiwgdHJhaXQuYW5hbHlzaXMsIHRyYWl0LnJlc29sdXRpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaW5kZXgoY3R4OiBJbmRleGluZ0NvbnRleHQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGNsYXp6IG9mIHRoaXMuY2xhc3Nlcy5rZXlzKCkpIHtcbiAgICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuY2xhc3Nlcy5nZXQoY2xhenopITtcbiAgICAgIGZvciAoY29uc3QgdHJhaXQgb2YgcmVjb3JkLnRyYWl0cykge1xuICAgICAgICBpZiAodHJhaXQuc3RhdGUgIT09IFRyYWl0U3RhdGUuUmVzb2x2ZWQpIHtcbiAgICAgICAgICAvLyBTa2lwIHRyYWl0cyB0aGF0IGhhdmVuJ3QgYmVlbiByZXNvbHZlZCBzdWNjZXNzZnVsbHkuXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAodHJhaXQuaGFuZGxlci5pbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gU2tpcCB0cmFpdHMgdGhhdCBkb24ndCBhZmZlY3QgaW5kZXhpbmcuXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHJhaXQucmVzb2x1dGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgIHRyYWl0LmhhbmRsZXIuaW5kZXgoY3R4LCBjbGF6eiwgdHJhaXQuYW5hbHlzaXMsIHRyYWl0LnJlc29sdXRpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlUmVzb3VyY2VzKGNsYXp6OiBEZWNsYXJhdGlvbk5vZGUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucmVmbGVjdG9yLmlzQ2xhc3MoY2xhenopIHx8ICF0aGlzLmNsYXNzZXMuaGFzKGNsYXp6KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZWNvcmQgPSB0aGlzLmNsYXNzZXMuZ2V0KGNsYXp6KSE7XG4gICAgZm9yIChjb25zdCB0cmFpdCBvZiByZWNvcmQudHJhaXRzKSB7XG4gICAgICBpZiAodHJhaXQuc3RhdGUgIT09IFRyYWl0U3RhdGUuUmVzb2x2ZWQgfHwgdHJhaXQuaGFuZGxlci51cGRhdGVSZXNvdXJjZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdHJhaXQuaGFuZGxlci51cGRhdGVSZXNvdXJjZXMoY2xhenosIHRyYWl0LmFuYWx5c2lzLCB0cmFpdC5yZXNvbHV0aW9uKTtcbiAgICB9XG4gIH1cblxuICBjb21waWxlKGNsYXp6OiBEZWNsYXJhdGlvbk5vZGUsIGNvbnN0YW50UG9vbDogQ29uc3RhbnRQb29sKTogQ29tcGlsZVJlc3VsdFtdfG51bGwge1xuICAgIGNvbnN0IG9yaWdpbmFsID0gdHMuZ2V0T3JpZ2luYWxOb2RlKGNsYXp6KSBhcyB0eXBlb2YgY2xheno7XG4gICAgaWYgKCF0aGlzLnJlZmxlY3Rvci5pc0NsYXNzKGNsYXp6KSB8fCAhdGhpcy5yZWZsZWN0b3IuaXNDbGFzcyhvcmlnaW5hbCkgfHxcbiAgICAgICAgIXRoaXMuY2xhc3Nlcy5oYXMob3JpZ2luYWwpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByZWNvcmQgPSB0aGlzLmNsYXNzZXMuZ2V0KG9yaWdpbmFsKSE7XG5cbiAgICBsZXQgcmVzOiBDb21waWxlUmVzdWx0W10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgdHJhaXQgb2YgcmVjb3JkLnRyYWl0cykge1xuICAgICAgaWYgKHRyYWl0LnN0YXRlICE9PSBUcmFpdFN0YXRlLlJlc29sdmVkIHx8IHRyYWl0LmFuYWx5c2lzRGlhZ25vc3RpY3MgIT09IG51bGwgfHxcbiAgICAgICAgICB0cmFpdC5yZXNvbHZlRGlhZ25vc3RpY3MgIT09IG51bGwpIHtcbiAgICAgICAgLy8gQ2Fubm90IGNvbXBpbGUgYSB0cmFpdCB0aGF0IGlzIG5vdCByZXNvbHZlZCwgb3IgaGFkIGFueSBlcnJvcnMgaW4gaXRzIGRlY2xhcmF0aW9uLlxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gYHRyYWl0LnJlc29sdXRpb25gIGlzIG5vbi1udWxsIGFzc2VydGVkIGhlcmUgYmVjYXVzZSBUeXBlU2NyaXB0IGRvZXMgbm90IHJlY29nbml6ZSB0aGF0XG4gICAgICAvLyBgUmVhZG9ubHk8dW5rbm93bj5gIGlzIG51bGxhYmxlIChhcyBgdW5rbm93bmAgaXRzZWxmIGlzIG51bGxhYmxlKSBkdWUgdG8gdGhlIHdheSB0aGF0XG4gICAgICAvLyBgUmVhZG9ubHlgIHdvcmtzLlxuXG4gICAgICBsZXQgY29tcGlsZVJlczogQ29tcGlsZVJlc3VsdHxDb21waWxlUmVzdWx0W107XG4gICAgICBpZiAodGhpcy5jb21waWxhdGlvbk1vZGUgPT09IENvbXBpbGF0aW9uTW9kZS5QQVJUSUFMICYmXG4gICAgICAgICAgdHJhaXQuaGFuZGxlci5jb21waWxlUGFydGlhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbXBpbGVSZXMgPSB0cmFpdC5oYW5kbGVyLmNvbXBpbGVQYXJ0aWFsKGNsYXp6LCB0cmFpdC5hbmFseXNpcywgdHJhaXQucmVzb2x1dGlvbiEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcGlsZVJlcyA9XG4gICAgICAgICAgICB0cmFpdC5oYW5kbGVyLmNvbXBpbGVGdWxsKGNsYXp6LCB0cmFpdC5hbmFseXNpcywgdHJhaXQucmVzb2x1dGlvbiEsIGNvbnN0YW50UG9vbCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbXBpbGVNYXRjaFJlcyA9IGNvbXBpbGVSZXM7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjb21waWxlTWF0Y2hSZXMpKSB7XG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIGNvbXBpbGVNYXRjaFJlcykge1xuICAgICAgICAgIGlmICghcmVzLnNvbWUociA9PiByLm5hbWUgPT09IHJlc3VsdC5uYW1lKSkge1xuICAgICAgICAgICAgcmVzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXJlcy5zb21lKHJlc3VsdCA9PiByZXN1bHQubmFtZSA9PT0gY29tcGlsZU1hdGNoUmVzLm5hbWUpKSB7XG4gICAgICAgIHJlcy5wdXNoKGNvbXBpbGVNYXRjaFJlcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTG9vayB1cCB0aGUgLmQudHMgdHJhbnNmb3JtZXIgZm9yIHRoZSBpbnB1dCBmaWxlIGFuZCByZWNvcmQgdGhhdCBhdCBsZWFzdCBvbmUgZmllbGQgd2FzXG4gICAgLy8gZ2VuZXJhdGVkLCB3aGljaCB3aWxsIGFsbG93IHRoZSAuZC50cyB0byBiZSB0cmFuc2Zvcm1lZCBsYXRlci5cbiAgICB0aGlzLmR0c1RyYW5zZm9ybXMuZ2V0SXZ5RGVjbGFyYXRpb25UcmFuc2Zvcm0ob3JpZ2luYWwuZ2V0U291cmNlRmlsZSgpKVxuICAgICAgICAuYWRkRmllbGRzKG9yaWdpbmFsLCByZXMpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBpbnN0cnVjdGlvbiB0byB0aGUgdHJhbnNmb3JtZXIgc28gdGhlIGZpZWxkcyB3aWxsIGJlIGFkZGVkLlxuICAgIHJldHVybiByZXMubGVuZ3RoID4gMCA/IHJlcyA6IG51bGw7XG4gIH1cblxuICBkZWNvcmF0b3JzRm9yKG5vZGU6IHRzLkRlY2xhcmF0aW9uKTogdHMuRGVjb3JhdG9yW10ge1xuICAgIGNvbnN0IG9yaWdpbmFsID0gdHMuZ2V0T3JpZ2luYWxOb2RlKG5vZGUpIGFzIHR5cGVvZiBub2RlO1xuICAgIGlmICghdGhpcy5yZWZsZWN0b3IuaXNDbGFzcyhvcmlnaW5hbCkgfHwgIXRoaXMuY2xhc3Nlcy5oYXMob3JpZ2luYWwpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5jbGFzc2VzLmdldChvcmlnaW5hbCkhO1xuICAgIGNvbnN0IGRlY29yYXRvcnM6IHRzLkRlY29yYXRvcltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIHJlY29yZC50cmFpdHMpIHtcbiAgICAgIGlmICh0cmFpdC5zdGF0ZSAhPT0gVHJhaXRTdGF0ZS5SZXNvbHZlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRyYWl0LmRldGVjdGVkLnRyaWdnZXIgIT09IG51bGwgJiYgdHMuaXNEZWNvcmF0b3IodHJhaXQuZGV0ZWN0ZWQudHJpZ2dlcikpIHtcbiAgICAgICAgZGVjb3JhdG9ycy5wdXNoKHRyYWl0LmRldGVjdGVkLnRyaWdnZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWNvcmF0b3JzO1xuICB9XG5cbiAgZ2V0IGRpYWdub3N0aWNzKCk6IFJlYWRvbmx5QXJyYXk8dHMuRGlhZ25vc3RpYz4ge1xuICAgIGNvbnN0IGRpYWdub3N0aWNzOiB0cy5EaWFnbm9zdGljW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNsYXp6IG9mIHRoaXMuY2xhc3Nlcy5rZXlzKCkpIHtcbiAgICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuY2xhc3Nlcy5nZXQoY2xhenopITtcbiAgICAgIGlmIChyZWNvcmQubWV0YURpYWdub3N0aWNzICE9PSBudWxsKSB7XG4gICAgICAgIGRpYWdub3N0aWNzLnB1c2goLi4ucmVjb3JkLm1ldGFEaWFnbm9zdGljcyk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIHJlY29yZC50cmFpdHMpIHtcbiAgICAgICAgaWYgKCh0cmFpdC5zdGF0ZSA9PT0gVHJhaXRTdGF0ZS5BbmFseXplZCB8fCB0cmFpdC5zdGF0ZSA9PT0gVHJhaXRTdGF0ZS5SZXNvbHZlZCkgJiZcbiAgICAgICAgICAgIHRyYWl0LmFuYWx5c2lzRGlhZ25vc3RpY3MgIT09IG51bGwpIHtcbiAgICAgICAgICBkaWFnbm9zdGljcy5wdXNoKC4uLnRyYWl0LmFuYWx5c2lzRGlhZ25vc3RpY3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFpdC5zdGF0ZSA9PT0gVHJhaXRTdGF0ZS5SZXNvbHZlZCAmJiB0cmFpdC5yZXNvbHZlRGlhZ25vc3RpY3MgIT09IG51bGwpIHtcbiAgICAgICAgICBkaWFnbm9zdGljcy5wdXNoKC4uLnRyYWl0LnJlc29sdmVEaWFnbm9zdGljcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRpYWdub3N0aWNzO1xuICB9XG5cbiAgZ2V0IGV4cG9ydFN0YXRlbWVudHMoKTogTWFwPHN0cmluZywgTWFwPHN0cmluZywgW3N0cmluZywgc3RyaW5nXT4+IHtcbiAgICByZXR1cm4gdGhpcy5yZWV4cG9ydE1hcDtcbiAgfVxufVxuIl19