@angular/compiler-cli 13.0.0-next.8 → 13.0.0-rc.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.
- package/bundles/index.js +20422 -0
- package/bundles/index.js.map +6 -0
- package/bundles/linker/babel/index.js +2384 -0
- package/bundles/linker/babel/index.js.map +6 -0
- package/bundles/linker/index.js +1849 -0
- package/bundles/linker/index.js.map +6 -0
- package/bundles/ngcc/index.js +16047 -0
- package/bundles/ngcc/index.js.map +6 -0
- package/bundles/ngcc/main-ngcc.js +16135 -0
- package/bundles/ngcc/main-ngcc.js.map +6 -0
- package/bundles/ngcc/src/execution/cluster/ngcc_cluster_worker.js +13859 -0
- package/bundles/ngcc/src/execution/cluster/ngcc_cluster_worker.js.map +6 -0
- package/bundles/ngcc/src/locking/lock_file_with_child_process/ngcc_lock_unlocker.js +334 -0
- package/bundles/ngcc/src/locking/lock_file_with_child_process/ngcc_lock_unlocker.js.map +6 -0
- package/bundles/private/bazel.js +97 -0
- package/bundles/private/bazel.js.map +6 -0
- package/bundles/private/localize.js +911 -0
- package/bundles/private/localize.js.map +6 -0
- package/bundles/private/migrations.js +2183 -0
- package/bundles/private/migrations.js.map +6 -0
- package/bundles/private/tooling.js +942 -0
- package/bundles/private/tooling.js.map +6 -0
- package/bundles/src/bin/ng_xi18n.js +20472 -0
- package/bundles/src/bin/ng_xi18n.js.map +6 -0
- package/bundles/src/bin/ngc.js +20474 -0
- package/bundles/src/bin/ngc.js.map +6 -0
- package/bundles_metadata.json +1 -0
- package/import_meta_url.d.ts +14 -0
- package/index.d.ts +4 -1
- package/linker/babel/src/ast/babel_ast_factory.d.ts +1 -8
- package/linker/babel/src/ast/babel_ast_host.d.ts +1 -1
- package/linker/babel/src/babel_core.d.ts +36 -0
- package/linker/babel/src/babel_declaration_scope.d.ts +1 -1
- package/linker/babel/src/babel_plugin.d.ts +1 -8
- package/linker/babel/src/es2015_linker_plugin.d.ts +2 -2
- package/linker/src/ast/typescript/typescript_ast_host.d.ts +1 -1
- package/linker/src/file_linker/emit_scopes/emit_scope.d.ts +1 -2
- package/linker/src/file_linker/emit_scopes/iife_emit_scope.d.ts +1 -1
- package/linker/src/file_linker/partial_linkers/partial_class_metadata_linker_1.d.ts +1 -2
- package/linker/src/file_linker/partial_linkers/partial_component_linker_1.d.ts +1 -2
- package/linker/src/file_linker/partial_linkers/partial_directive_linker_1.d.ts +1 -2
- package/linker/src/file_linker/partial_linkers/partial_factory_linker_1.d.ts +1 -2
- package/linker/src/file_linker/partial_linkers/partial_injectable_linker_1.d.ts +1 -2
- package/linker/src/file_linker/partial_linkers/partial_injector_linker_1.d.ts +1 -2
- package/linker/src/file_linker/partial_linkers/partial_linker.d.ts +1 -2
- package/linker/src/file_linker/partial_linkers/partial_linker_selector.d.ts +2 -2
- package/linker/src/file_linker/partial_linkers/partial_ng_module_linker_1.d.ts +1 -2
- package/linker/src/file_linker/partial_linkers/partial_pipe_linker_1.d.ts +1 -2
- package/linker/src/file_linker/partial_linkers/util.d.ts +1 -2
- package/ngcc/index.d.ts +15 -0
- package/ngcc/src/analysis/decoration_analyzer.d.ts +1 -1
- package/ngcc/src/analysis/module_with_providers_analyzer.d.ts +1 -1
- package/ngcc/src/analysis/ngcc_references_registry.d.ts +1 -1
- package/ngcc/src/analysis/ngcc_trait_compiler.d.ts +1 -1
- package/ngcc/src/analysis/private_declarations_analyzer.d.ts +1 -1
- package/ngcc/src/analysis/switch_marker_analyzer.d.ts +1 -1
- package/ngcc/src/analysis/types.d.ts +1 -1
- package/ngcc/src/dependencies/esm_dependency_host.d.ts +1 -1
- package/ngcc/src/execution/cluster/api.d.ts +5 -1
- package/ngcc/src/execution/cluster/master.d.ts +5 -3
- package/{src/ngtsc/logging/testing/index.d.ts → ngcc/src/execution/cluster/ngcc_cluster_worker.d.ts} +2 -2
- package/ngcc/src/host/commonjs_host.d.ts +1 -1
- package/ngcc/src/host/commonjs_umd_utils.d.ts +1 -1
- package/ngcc/src/host/delegating_host.d.ts +1 -1
- package/ngcc/src/host/esm2015_host.d.ts +1 -1
- package/ngcc/src/host/esm5_host.d.ts +1 -1
- package/ngcc/src/host/ngcc_host.d.ts +1 -1
- package/ngcc/src/host/umd_host.d.ts +1 -1
- package/ngcc/src/host/utils.d.ts +1 -1
- package/ngcc/src/locking/lock_file.d.ts +1 -1
- package/ngcc/src/locking/lock_file_with_child_process/index.d.ts +2 -0
- package/ngcc/src/locking/lock_file_with_child_process/{unlocker.d.ts → ngcc_lock_unlocker.d.ts} +1 -1
- package/ngcc/src/migrations/migration.d.ts +1 -1
- package/ngcc/src/migrations/missing_injectable_migration.d.ts +1 -1
- package/ngcc/src/migrations/undecorated_child_migration.d.ts +1 -1
- package/ngcc/src/migrations/undecorated_parent_migration.d.ts +1 -1
- package/ngcc/src/migrations/utils.d.ts +1 -1
- package/ngcc/src/packages/build_marker.d.ts +1 -1
- package/ngcc/src/packages/bundle_program.d.ts +1 -1
- package/ngcc/src/packages/configuration.d.ts +41 -4
- package/ngcc/src/packages/entry_point_bundle.d.ts +1 -1
- package/ngcc/src/packages/ngcc_compiler_host.d.ts +1 -1
- package/ngcc/src/packages/source_file_cache.d.ts +1 -1
- package/ngcc/src/packages/transformer.d.ts +1 -1
- package/ngcc/src/rendering/commonjs_rendering_formatter.d.ts +1 -1
- package/ngcc/src/rendering/dts_renderer.d.ts +1 -1
- package/ngcc/src/rendering/esm5_rendering_formatter.d.ts +1 -1
- package/ngcc/src/rendering/esm_rendering_formatter.d.ts +1 -1
- package/ngcc/src/rendering/renderer.d.ts +1 -1
- package/ngcc/src/rendering/rendering_formatter.d.ts +1 -1
- package/ngcc/src/rendering/source_maps.d.ts +3 -3
- package/ngcc/src/rendering/umd_rendering_formatter.d.ts +1 -1
- package/ngcc/src/rendering/utils.d.ts +1 -1
- package/ngcc/src/utils.d.ts +1 -1
- package/package.json +52 -13
- package/private/bazel.d.ts +13 -0
- package/private/localize.d.ts +15 -0
- package/private/migrations.d.ts +16 -0
- package/{src → private}/tooling.d.ts +2 -2
- package/src/bin/ng_xi18n.d.ts +10 -0
- package/{ngcc/main-ivy-ngcc.d.ts → src/bin/ngc.d.ts} +2 -1
- package/src/diagnostics/translate_diagnostics.d.ts +1 -1
- package/src/extract_i18n.d.ts +0 -5
- package/src/main.d.ts +9 -6
- package/src/metadata/bundle_index_host.d.ts +1 -1
- package/src/metadata/bundler.d.ts +1 -1
- package/src/metadata/collector.d.ts +1 -1
- package/src/metadata/evaluator.d.ts +1 -1
- package/src/metadata/symbols.d.ts +1 -1
- package/src/ngtsc/annotations/src/component.d.ts +1 -1
- package/src/ngtsc/annotations/src/diagnostics.d.ts +1 -1
- package/src/ngtsc/annotations/src/directive.d.ts +1 -1
- package/src/ngtsc/annotations/src/ng_module.d.ts +2 -4
- package/src/ngtsc/annotations/src/pipe.d.ts +1 -1
- package/src/ngtsc/annotations/src/util.d.ts +2 -4
- package/src/ngtsc/core/api/src/adapter.d.ts +1 -1
- package/src/ngtsc/core/api/src/interfaces.d.ts +1 -12
- package/src/ngtsc/core/api/src/options.d.ts +1 -1
- package/src/ngtsc/core/api/src/public_options.d.ts +5 -1
- package/src/ngtsc/core/src/compiler.d.ts +2 -8
- package/src/ngtsc/core/src/host.d.ts +1 -1
- package/src/ngtsc/cycles/src/analyzer.d.ts +1 -1
- package/src/ngtsc/cycles/src/imports.d.ts +1 -1
- package/src/ngtsc/diagnostics/index.d.ts +4 -2
- package/src/ngtsc/diagnostics/src/docs.d.ts +14 -0
- package/src/ngtsc/diagnostics/src/error.d.ts +1 -1
- package/src/ngtsc/diagnostics/src/error_details_base_url.d.ts +16 -0
- package/src/ngtsc/diagnostics/src/util.d.ts +2 -0
- package/src/ngtsc/entry_point/src/generator.d.ts +1 -1
- package/src/ngtsc/entry_point/src/private_export_checker.d.ts +1 -1
- package/src/ngtsc/file_system/src/compiler_host.d.ts +1 -1
- package/src/ngtsc/file_system/src/logical.d.ts +1 -1
- package/src/ngtsc/file_system/src/util.d.ts +1 -1
- package/src/ngtsc/imports/src/alias.d.ts +1 -1
- package/src/ngtsc/imports/src/default.d.ts +1 -1
- package/src/ngtsc/imports/src/emitter.d.ts +1 -1
- package/src/ngtsc/imports/src/find_export.d.ts +1 -1
- package/src/ngtsc/imports/src/references.d.ts +1 -1
- package/src/ngtsc/imports/src/resolver.d.ts +1 -1
- package/src/ngtsc/incremental/api.d.ts +1 -1
- package/src/ngtsc/incremental/src/dependency_tracking.d.ts +1 -1
- package/src/ngtsc/incremental/src/incremental.d.ts +1 -1
- package/src/ngtsc/incremental/src/state.d.ts +1 -1
- package/src/ngtsc/incremental/src/strategy.d.ts +1 -1
- package/src/ngtsc/metadata/src/api.d.ts +1 -1
- package/src/ngtsc/metadata/src/dts.d.ts +1 -1
- package/src/ngtsc/metadata/src/resource_registry.d.ts +1 -1
- package/src/ngtsc/metadata/src/util.d.ts +1 -1
- package/src/ngtsc/partial_evaluator/index.d.ts +1 -0
- package/src/ngtsc/partial_evaluator/src/builtin.d.ts +1 -1
- package/src/ngtsc/partial_evaluator/src/diagnostics.d.ts +1 -1
- package/src/ngtsc/partial_evaluator/src/dynamic.d.ts +1 -1
- package/src/ngtsc/partial_evaluator/src/interface.d.ts +1 -1
- package/src/ngtsc/partial_evaluator/src/interpreter.d.ts +1 -1
- package/src/ngtsc/partial_evaluator/src/result.d.ts +1 -1
- package/src/ngtsc/partial_evaluator/src/ts_helpers.d.ts +1 -1
- package/src/ngtsc/program.d.ts +1 -1
- package/src/ngtsc/program_driver/src/api.d.ts +1 -1
- package/src/ngtsc/program_driver/src/ts_create_program_driver.d.ts +1 -1
- package/src/ngtsc/reflection/src/host.d.ts +1 -1
- package/src/ngtsc/reflection/src/type_to_value.d.ts +1 -1
- package/src/ngtsc/reflection/src/typescript.d.ts +1 -1
- package/src/ngtsc/reflection/src/util.d.ts +1 -1
- package/src/ngtsc/resource/src/loader.d.ts +1 -1
- package/src/ngtsc/scope/src/local.d.ts +1 -1
- package/src/ngtsc/scope/src/typecheck.d.ts +1 -1
- package/src/ngtsc/shims/api.d.ts +1 -1
- package/src/ngtsc/shims/src/adapter.d.ts +1 -1
- package/src/ngtsc/shims/src/expando.d.ts +1 -1
- package/src/ngtsc/shims/src/factory_generator.d.ts +1 -1
- package/src/ngtsc/shims/src/reference_tagger.d.ts +1 -1
- package/src/ngtsc/shims/src/summary_generator.d.ts +1 -1
- package/src/ngtsc/switch/src/switch.d.ts +1 -1
- package/src/ngtsc/transform/src/alias.d.ts +1 -1
- package/src/ngtsc/transform/src/api.d.ts +1 -1
- package/src/ngtsc/transform/src/compilation.d.ts +1 -1
- package/src/ngtsc/transform/src/declaration.d.ts +1 -1
- package/src/ngtsc/transform/src/trait.d.ts +1 -1
- package/src/ngtsc/transform/src/transform.d.ts +1 -1
- package/src/ngtsc/transform/src/utils.d.ts +1 -1
- package/src/ngtsc/translator/src/import_manager.d.ts +1 -1
- package/src/ngtsc/translator/src/type_translator.d.ts +1 -1
- package/src/ngtsc/translator/src/typescript_ast_factory.d.ts +1 -1
- package/src/ngtsc/translator/src/typescript_translator.d.ts +1 -1
- package/src/ngtsc/tsc_plugin.d.ts +1 -1
- package/src/ngtsc/typecheck/api/api.d.ts +1 -1
- package/src/ngtsc/typecheck/api/checker.d.ts +7 -4
- package/src/ngtsc/typecheck/api/context.d.ts +1 -1
- package/src/ngtsc/typecheck/api/scope.d.ts +1 -1
- package/src/ngtsc/typecheck/api/symbols.d.ts +1 -1
- package/src/ngtsc/typecheck/diagnostics/src/diagnostic.d.ts +1 -1
- package/src/ngtsc/typecheck/extended/api/api.d.ts +1 -1
- package/src/ngtsc/typecheck/extended/api/extended_template_checker.d.ts +1 -1
- package/src/ngtsc/typecheck/extended/checks/invalid_banana_in_box/index.d.ts +1 -1
- package/src/ngtsc/typecheck/extended/checks/nullish_coalescing_not_nullable/index.d.ts +1 -1
- package/src/ngtsc/typecheck/extended/src/extended_template_checker.d.ts +1 -1
- package/src/ngtsc/typecheck/src/checker.d.ts +4 -4
- package/src/ngtsc/typecheck/src/comments.d.ts +1 -1
- package/src/ngtsc/typecheck/src/completion.d.ts +3 -5
- package/src/ngtsc/typecheck/src/context.d.ts +1 -1
- package/src/ngtsc/typecheck/src/diagnostics.d.ts +1 -1
- package/src/ngtsc/typecheck/src/environment.d.ts +1 -1
- package/src/ngtsc/typecheck/src/expression.d.ts +1 -1
- package/src/ngtsc/typecheck/src/oob.d.ts +3 -4
- package/src/ngtsc/typecheck/src/shim.d.ts +1 -1
- package/src/ngtsc/typecheck/src/source.d.ts +1 -1
- package/src/ngtsc/typecheck/src/tcb_util.d.ts +1 -1
- package/src/ngtsc/typecheck/src/template_symbol_builder.d.ts +1 -1
- package/src/ngtsc/typecheck/src/ts_util.d.ts +1 -1
- package/src/ngtsc/typecheck/src/type_check_block.d.ts +1 -1
- package/src/ngtsc/typecheck/src/type_check_file.d.ts +1 -1
- package/src/ngtsc/typecheck/src/type_constructor.d.ts +1 -1
- package/src/ngtsc/typecheck/src/type_emitter.d.ts +1 -1
- package/src/ngtsc/typecheck/src/type_parameter_emitter.d.ts +1 -1
- package/src/ngtsc/util/src/typescript.d.ts +1 -1
- package/src/ngtsc/util/src/visitor.d.ts +1 -1
- package/src/perform_compile.d.ts +1 -2
- package/src/perform_watch.d.ts +1 -1
- package/src/transformers/api.d.ts +2 -5
- package/src/transformers/compiler_host.d.ts +1 -1
- package/src/transformers/{downlevel_decorators_transform.d.ts → downlevel_decorators_transform/downlevel_decorators_transform.d.ts} +3 -3
- package/src/{ngtsc/routing → transformers/downlevel_decorators_transform}/index.d.ts +2 -3
- package/src/transformers/{patch_alias_reference_resolution.d.ts → downlevel_decorators_transform/patch_alias_reference_resolution.d.ts} +2 -2
- package/src/transformers/i18n.d.ts +1 -1
- package/src/transformers/inline_resources.d.ts +1 -1
- package/src/transformers/lower_expressions.d.ts +1 -1
- package/src/transformers/metadata_cache.d.ts +1 -1
- package/src/transformers/node_emitter.d.ts +1 -1
- package/src/transformers/node_emitter_transform.d.ts +1 -1
- package/src/transformers/program.d.ts +1 -1
- package/src/transformers/r3_metadata_transform.d.ts +1 -1
- package/src/transformers/r3_transform.d.ts +1 -1
- package/src/transformers/util.d.ts +1 -1
- package/index.js +0 -40
- package/linker/babel/index.js +0 -25
- package/linker/babel/src/ast/babel_ast_factory.js +0 -153
- package/linker/babel/src/ast/babel_ast_host.js +0 -181
- package/linker/babel/src/babel_declaration_scope.js +0 -67
- package/linker/babel/src/babel_plugin.js +0 -38
- package/linker/babel/src/es2015_linker_plugin.js +0 -183
- package/linker/babel/src/linker_plugin_options.js +0 -13
- package/linker/index.js +0 -27
- package/linker/src/ast/ast_host.js +0 -20
- package/linker/src/ast/ast_value.js +0 -299
- package/linker/src/ast/typescript/typescript_ast_host.js +0 -183
- package/linker/src/ast/utils.js +0 -31
- package/linker/src/fatal_linker_error.js +0 -49
- package/linker/src/file_linker/declaration_scope.js +0 -20
- package/linker/src/file_linker/emit_scopes/emit_scope.js +0 -57
- package/linker/src/file_linker/emit_scopes/iife_emit_scope.js +0 -51
- package/linker/src/file_linker/file_linker.js +0 -97
- package/linker/src/file_linker/get_source_file.js +0 -42
- package/linker/src/file_linker/linker_environment.js +0 -38
- package/linker/src/file_linker/linker_options.js +0 -29
- package/linker/src/file_linker/needs_linking.js +0 -41
- package/linker/src/file_linker/partial_linkers/partial_class_metadata_linker_1.js +0 -47
- package/linker/src/file_linker/partial_linkers/partial_component_linker_1.js +0 -210
- package/linker/src/file_linker/partial_linkers/partial_directive_linker_1.js +0 -154
- package/linker/src/file_linker/partial_linkers/partial_factory_linker_1.js +0 -70
- package/linker/src/file_linker/partial_linkers/partial_injectable_linker_1.js +0 -74
- package/linker/src/file_linker/partial_linkers/partial_injector_linker_1.js +0 -56
- package/linker/src/file_linker/partial_linkers/partial_linker.js +0 -13
- package/linker/src/file_linker/partial_linkers/partial_linker_selector.js +0 -194
- package/linker/src/file_linker/partial_linkers/partial_ng_module_linker_1.js +0 -126
- package/linker/src/file_linker/partial_linkers/partial_pipe_linker_1.js +0 -59
- package/linker/src/file_linker/partial_linkers/util.js +0 -95
- package/linker/src/file_linker/translator.js +0 -40
- package/linker/src/linker_import_generator.js +0 -43
- package/ngcc/index.js +0 -33
- package/ngcc/main-ivy-ngcc.js +0 -12
- package/ngcc/main-ngcc.js +0 -54
- package/ngcc/src/analysis/decoration_analyzer.js +0 -268
- package/ngcc/src/analysis/migration_host.js +0 -108
- package/ngcc/src/analysis/module_with_providers_analyzer.js +0 -197
- package/ngcc/src/analysis/ngcc_references_registry.js +0 -65
- package/ngcc/src/analysis/ngcc_trait_compiler.js +0 -117
- package/ngcc/src/analysis/private_declarations_analyzer.js +0 -63
- package/ngcc/src/analysis/switch_marker_analyzer.js +0 -50
- package/ngcc/src/analysis/types.js +0 -15
- package/ngcc/src/analysis/util.js +0 -36
- package/ngcc/src/command_line_options.js +0 -156
- package/ngcc/src/constants.js +0 -23
- package/ngcc/src/dependencies/commonjs_dependency_host.js +0 -129
- package/ngcc/src/dependencies/dependency_host.js +0 -143
- package/ngcc/src/dependencies/dependency_resolver.js +0 -180
- package/ngcc/src/dependencies/dts_dependency_host.js +0 -35
- package/ngcc/src/dependencies/esm_dependency_host.js +0 -307
- package/ngcc/src/dependencies/module_resolver.js +0 -269
- package/ngcc/src/dependencies/umd_dependency_host.js +0 -53
- package/ngcc/src/entry_point_finder/directory_walker_entry_point_finder.js +0 -70
- package/ngcc/src/entry_point_finder/entry_point_collector.js +0 -157
- package/ngcc/src/entry_point_finder/interface.js +0 -13
- package/ngcc/src/entry_point_finder/program_based_entry_point_finder.js +0 -132
- package/ngcc/src/entry_point_finder/targeted_entry_point_finder.js +0 -268
- package/ngcc/src/entry_point_finder/tracing_entry_point_finder.js +0 -78
- package/ngcc/src/entry_point_finder/utils.js +0 -234
- package/ngcc/src/execution/analyze_entry_points.js +0 -197
- package/ngcc/src/execution/api.js +0 -13
- package/ngcc/src/execution/cluster/api.js +0 -20
- package/ngcc/src/execution/cluster/executor.js +0 -52
- package/ngcc/src/execution/cluster/master.js +0 -311
- package/ngcc/src/execution/cluster/package_json_updater.js +0 -79
- package/ngcc/src/execution/cluster/utils.js +0 -77
- package/ngcc/src/execution/cluster/worker.js +0 -123
- package/ngcc/src/execution/create_compile_function.js +0 -76
- package/ngcc/src/execution/single_process_executor.js +0 -91
- package/ngcc/src/execution/tasks/api.js +0 -35
- package/ngcc/src/execution/tasks/completion.js +0 -79
- package/ngcc/src/execution/tasks/queues/base_task_queue.js +0 -120
- package/ngcc/src/execution/tasks/queues/parallel_task_queue.js +0 -87
- package/ngcc/src/execution/tasks/queues/serial_task_queue.js +0 -49
- package/ngcc/src/execution/tasks/utils.js +0 -167
- package/ngcc/src/host/commonjs_host.js +0 -261
- package/ngcc/src/host/commonjs_umd_utils.js +0 -210
- package/ngcc/src/host/delegating_host.js +0 -156
- package/ngcc/src/host/esm2015_host.js +0 -2441
- package/ngcc/src/host/esm5_host.js +0 -745
- package/ngcc/src/host/ngcc_host.js +0 -29
- package/ngcc/src/host/umd_host.js +0 -539
- package/ngcc/src/host/utils.js +0 -26
- package/ngcc/src/locking/async_locker.js +0 -121
- package/ngcc/src/locking/lock_file.js +0 -18
- package/ngcc/src/locking/lock_file_with_child_process/index.js +0 -93
- package/ngcc/src/locking/lock_file_with_child_process/unlocker.js +0 -46
- package/ngcc/src/locking/lock_file_with_child_process/util.js +0 -43
- package/ngcc/src/locking/sync_locker.js +0 -67
- package/ngcc/src/main.js +0 -163
- package/ngcc/src/migrations/migration.js +0 -13
- package/ngcc/src/migrations/missing_injectable_migration.js +0 -227
- package/ngcc/src/migrations/undecorated_child_migration.js +0 -90
- package/ngcc/src/migrations/undecorated_parent_migration.js +0 -103
- package/ngcc/src/migrations/utils.js +0 -137
- package/ngcc/src/ngcc_options.js +0 -135
- package/ngcc/src/packages/build_marker.js +0 -124
- package/ngcc/src/packages/bundle_program.js +0 -80
- package/ngcc/src/packages/configuration.js +0 -277
- package/ngcc/src/packages/entry_point.js +0 -267
- package/ngcc/src/packages/entry_point_bundle.js +0 -96
- package/ngcc/src/packages/entry_point_manifest.js +0 -207
- package/ngcc/src/packages/ngcc_compiler_host.js +0 -101
- package/ngcc/src/packages/patch_ts_expando_initializer.js +0 -174
- package/ngcc/src/packages/source_file_cache.js +0 -207
- package/ngcc/src/packages/transformer.js +0 -157
- package/ngcc/src/path_mappings.js +0 -27
- package/ngcc/src/rendering/commonjs_rendering_formatter.js +0 -106
- package/ngcc/src/rendering/dts_renderer.js +0 -170
- package/ngcc/src/rendering/esm5_rendering_formatter.js +0 -70
- package/ngcc/src/rendering/esm_rendering_formatter.js +0 -291
- package/ngcc/src/rendering/ngcc_import_rewriter.js +0 -49
- package/ngcc/src/rendering/renderer.js +0 -204
- package/ngcc/src/rendering/rendering_formatter.js +0 -15
- package/ngcc/src/rendering/source_maps.js +0 -68
- package/ngcc/src/rendering/umd_rendering_formatter.js +0 -326
- package/ngcc/src/rendering/utils.js +0 -35
- package/ngcc/src/utils.js +0 -182
- package/ngcc/src/writing/cleaning/cleaning_strategies.js +0 -80
- package/ngcc/src/writing/cleaning/package_cleaner.js +0 -126
- package/ngcc/src/writing/cleaning/utils.js +0 -30
- package/ngcc/src/writing/file_writer.js +0 -13
- package/ngcc/src/writing/in_place_file_writer.js +0 -90
- package/ngcc/src/writing/new_entry_point_file_writer.js +0 -214
- package/ngcc/src/writing/package_json_updater.js +0 -182
- package/src/diagnostics/translate_diagnostics.js +0 -61
- package/src/diagnostics/typescript_version.js +0 -96
- package/src/extract_i18n.js +0 -62
- package/src/language_services.js +0 -34
- package/src/main.js +0 -210
- package/src/metadata/bundle_index_host.js +0 -133
- package/src/metadata/bundler.js +0 -624
- package/src/metadata/collector.js +0 -799
- package/src/metadata/evaluator.js +0 -677
- package/src/metadata/index.js +0 -24
- package/src/metadata/index_writer.js +0 -80
- package/src/metadata/schema.js +0 -136
- package/src/metadata/symbols.js +0 -149
- package/src/ngtsc/annotations/index.js +0 -35
- package/src/ngtsc/annotations/src/api.js +0 -20
- package/src/ngtsc/annotations/src/component.js +0 -1338
- package/src/ngtsc/annotations/src/diagnostics.js +0 -174
- package/src/ngtsc/annotations/src/directive.js +0 -724
- package/src/ngtsc/annotations/src/factory.js +0 -32
- package/src/ngtsc/annotations/src/injectable.js +0 -277
- package/src/ngtsc/annotations/src/metadata.js +0 -160
- package/src/ngtsc/annotations/src/ng_module.js +0 -677
- package/src/ngtsc/annotations/src/pipe.js +0 -171
- package/src/ngtsc/annotations/src/references_registry.js +0 -38
- package/src/ngtsc/annotations/src/util.js +0 -566
- package/src/ngtsc/core/api/index.js +0 -25
- package/src/ngtsc/core/api/src/adapter.js +0 -20
- package/src/ngtsc/core/api/src/interfaces.js +0 -20
- package/src/ngtsc/core/api/src/options.js +0 -20
- package/src/ngtsc/core/api/src/public_options.js +0 -20
- package/src/ngtsc/core/index.js +0 -25
- package/src/ngtsc/core/src/compiler.js +0 -1142
- package/src/ngtsc/core/src/host.js +0 -273
- package/src/ngtsc/cycles/index.js +0 -26
- package/src/ngtsc/cycles/src/analyzer.js +0 -163
- package/src/ngtsc/cycles/src/imports.js +0 -175
- package/src/ngtsc/diagnostics/index.js +0 -33
- package/src/ngtsc/diagnostics/src/error.js +0 -69
- package/src/ngtsc/diagnostics/src/error_code.js +0 -235
- package/src/ngtsc/diagnostics/src/util.js +0 -35
- package/src/ngtsc/entry_point/index.js +0 -29
- package/src/ngtsc/entry_point/src/generator.js +0 -45
- package/src/ngtsc/entry_point/src/logic.js +0 -61
- package/src/ngtsc/entry_point/src/private_export_checker.js +0 -137
- package/src/ngtsc/entry_point/src/reference_graph.js +0 -91
- package/src/ngtsc/file_system/index.js +0 -45
- package/src/ngtsc/file_system/src/compiler_host.js +0 -80
- package/src/ngtsc/file_system/src/helpers.js +0 -135
- package/src/ngtsc/file_system/src/invalid_file_system.js +0 -120
- package/src/ngtsc/file_system/src/logical.js +0 -100
- package/src/ngtsc/file_system/src/node_js_file_system.js +0 -179
- package/src/ngtsc/file_system/src/types.js +0 -20
- package/src/ngtsc/file_system/src/util.js +0 -38
- package/src/ngtsc/file_system/testing/index.d.ts +0 -13
- package/src/ngtsc/file_system/testing/index.js +0 -32
- package/src/ngtsc/file_system/testing/src/mock_file_system.d.ts +0 -72
- package/src/ngtsc/file_system/testing/src/mock_file_system.js +0 -333
- package/src/ngtsc/file_system/testing/src/mock_file_system_native.d.ts +0 -16
- package/src/ngtsc/file_system/testing/src/mock_file_system_native.js +0 -85
- package/src/ngtsc/file_system/testing/src/mock_file_system_posix.d.ts +0 -13
- package/src/ngtsc/file_system/testing/src/mock_file_system_posix.js +0 -68
- package/src/ngtsc/file_system/testing/src/mock_file_system_windows.d.ts +0 -13
- package/src/ngtsc/file_system/testing/src/mock_file_system_windows.js +0 -68
- package/src/ngtsc/file_system/testing/src/test_helper.d.ts +0 -17
- package/src/ngtsc/file_system/testing/src/test_helper.js +0 -143
- package/src/ngtsc/imports/index.js +0 -43
- package/src/ngtsc/imports/src/alias.js +0 -158
- package/src/ngtsc/imports/src/core.js +0 -98
- package/src/ngtsc/imports/src/default.js +0 -153
- package/src/ngtsc/imports/src/emitter.js +0 -317
- package/src/ngtsc/imports/src/find_export.js +0 -82
- package/src/ngtsc/imports/src/reexport.js +0 -20
- package/src/ngtsc/imports/src/references.js +0 -171
- package/src/ngtsc/imports/src/resolver.js +0 -39
- package/src/ngtsc/incremental/api.js +0 -20
- package/src/ngtsc/incremental/index.js +0 -29
- package/src/ngtsc/incremental/semantic_graph/index.js +0 -34
- package/src/ngtsc/incremental/semantic_graph/src/api.js +0 -51
- package/src/ngtsc/incremental/semantic_graph/src/graph.js +0 -302
- package/src/ngtsc/incremental/semantic_graph/src/type_parameters.js +0 -55
- package/src/ngtsc/incremental/semantic_graph/src/util.js +0 -111
- package/src/ngtsc/incremental/src/dependency_tracking.js +0 -165
- package/src/ngtsc/incremental/src/incremental.js +0 -393
- package/src/ngtsc/incremental/src/noop.js +0 -26
- package/src/ngtsc/incremental/src/state.js +0 -30
- package/src/ngtsc/incremental/src/strategy.js +0 -99
- package/src/ngtsc/indexer/index.js +0 -27
- package/src/ngtsc/indexer/src/api.js +0 -45
- package/src/ngtsc/indexer/src/context.js +0 -40
- package/src/ngtsc/indexer/src/template.js +0 -324
- package/src/ngtsc/indexer/src/transform.js +0 -66
- package/src/ngtsc/logging/index.js +0 -25
- package/src/ngtsc/logging/src/console_logger.js +0 -75
- package/src/ngtsc/logging/src/logger.js +0 -28
- package/src/ngtsc/logging/testing/index.js +0 -23
- package/src/ngtsc/logging/testing/src/mock_logger.d.ts +0 -20
- package/src/ngtsc/logging/testing/src/mock_logger.js +0 -64
- package/src/ngtsc/metadata/index.js +0 -39
- package/src/ngtsc/metadata/src/api.js +0 -26
- package/src/ngtsc/metadata/src/dts.js +0 -168
- package/src/ngtsc/metadata/src/inheritance.js +0 -122
- package/src/ngtsc/metadata/src/property_mapping.js +0 -244
- package/src/ngtsc/metadata/src/registry.js +0 -133
- package/src/ngtsc/metadata/src/resource_registry.js +0 -109
- package/src/ngtsc/metadata/src/util.js +0 -275
- package/src/ngtsc/partial_evaluator/index.js +0 -31
- package/src/ngtsc/partial_evaluator/src/builtin.js +0 -125
- package/src/ngtsc/partial_evaluator/src/diagnostics.js +0 -193
- package/src/ngtsc/partial_evaluator/src/dynamic.js +0 -109
- package/src/ngtsc/partial_evaluator/src/interface.js +0 -42
- package/src/ngtsc/partial_evaluator/src/interpreter.js +0 -780
- package/src/ngtsc/partial_evaluator/src/known_declaration.js +0 -57
- package/src/ngtsc/partial_evaluator/src/result.js +0 -72
- package/src/ngtsc/partial_evaluator/src/ts_helpers.js +0 -121
- package/src/ngtsc/perf/index.js +0 -28
- package/src/ngtsc/perf/src/api.js +0 -291
- package/src/ngtsc/perf/src/clock.js +0 -31
- package/src/ngtsc/perf/src/noop.js +0 -37
- package/src/ngtsc/perf/src/recorder.js +0 -143
- package/src/ngtsc/program.js +0 -360
- package/src/ngtsc/program_driver/index.js +0 -25
- package/src/ngtsc/program_driver/src/api.js +0 -36
- package/src/ngtsc/program_driver/src/ts_create_program_driver.js +0 -200
- package/src/ngtsc/reflection/index.js +0 -36
- package/src/ngtsc/reflection/src/host.js +0 -88
- package/src/ngtsc/reflection/src/type_to_value.js +0 -259
- package/src/ngtsc/reflection/src/typescript.js +0 -640
- package/src/ngtsc/reflection/src/util.js +0 -37
- package/src/ngtsc/resource/index.js +0 -23
- package/src/ngtsc/resource/src/loader.js +0 -285
- package/src/ngtsc/routing/index.js +0 -26
- package/src/ngtsc/routing/src/analyzer.d.ts +0 -37
- package/src/ngtsc/routing/src/analyzer.js +0 -82
- package/src/ngtsc/routing/src/lazy.d.ts +0 -19
- package/src/ngtsc/routing/src/lazy.js +0 -239
- package/src/ngtsc/routing/src/route.d.ts +0 -23
- package/src/ngtsc/routing/src/route.js +0 -77
- package/src/ngtsc/scope/index.js +0 -29
- package/src/ngtsc/scope/src/api.js +0 -20
- package/src/ngtsc/scope/src/component_scope.js +0 -69
- package/src/ngtsc/scope/src/dependency.js +0 -201
- package/src/ngtsc/scope/src/local.js +0 -665
- package/src/ngtsc/scope/src/typecheck.js +0 -120
- package/src/ngtsc/shims/api.js +0 -13
- package/src/ngtsc/shims/index.js +0 -39
- package/src/ngtsc/shims/src/adapter.js +0 -266
- package/src/ngtsc/shims/src/expando.js +0 -147
- package/src/ngtsc/shims/src/factory_generator.js +0 -292
- package/src/ngtsc/shims/src/reference_tagger.js +0 -94
- package/src/ngtsc/shims/src/summary_generator.js +0 -101
- package/src/ngtsc/shims/src/util.js +0 -41
- package/src/ngtsc/sourcemaps/index.js +0 -27
- package/src/ngtsc/sourcemaps/src/content_origin.js +0 -48
- package/src/ngtsc/sourcemaps/src/raw_source_map.js +0 -13
- package/src/ngtsc/sourcemaps/src/segment_marker.js +0 -55
- package/src/ngtsc/sourcemaps/src/source_file.js +0 -519
- package/src/ngtsc/sourcemaps/src/source_file_loader.js +0 -234
- package/src/ngtsc/switch/index.js +0 -23
- package/src/ngtsc/switch/src/switch.js +0 -141
- package/src/ngtsc/transform/index.js +0 -36
- package/src/ngtsc/transform/src/alias.js +0 -46
- package/src/ngtsc/transform/src/api.js +0 -76
- package/src/ngtsc/transform/src/compilation.js +0 -862
- package/src/ngtsc/transform/src/declaration.js +0 -234
- package/src/ngtsc/transform/src/trait.js +0 -111
- package/src/ngtsc/transform/src/transform.js +0 -333
- package/src/ngtsc/transform/src/utils.js +0 -73
- package/src/ngtsc/translator/index.js +0 -37
- package/src/ngtsc/translator/src/api/ast_factory.js +0 -20
- package/src/ngtsc/translator/src/api/import_generator.js +0 -20
- package/src/ngtsc/translator/src/context.js +0 -47
- package/src/ngtsc/translator/src/import_manager.js +0 -77
- package/src/ngtsc/translator/src/translator.js +0 -347
- package/src/ngtsc/translator/src/type_translator.js +0 -220
- package/src/ngtsc/translator/src/typescript_ast_factory.js +0 -251
- package/src/ngtsc/translator/src/typescript_translator.js +0 -34
- package/src/ngtsc/tsc_plugin.js +0 -129
- package/src/ngtsc/typecheck/api/api.js +0 -20
- package/src/ngtsc/typecheck/api/checker.js +0 -44
- package/src/ngtsc/typecheck/api/completion.js +0 -29
- package/src/ngtsc/typecheck/api/context.js +0 -20
- package/src/ngtsc/typecheck/api/index.js +0 -27
- package/src/ngtsc/typecheck/api/scope.js +0 -20
- package/src/ngtsc/typecheck/api/symbols.js +0 -35
- package/src/ngtsc/typecheck/diagnostics/index.js +0 -23
- package/src/ngtsc/typecheck/diagnostics/src/diagnostic.js +0 -141
- package/src/ngtsc/typecheck/diagnostics/src/id.js +0 -37
- package/src/ngtsc/typecheck/extended/api/api.js +0 -124
- package/src/ngtsc/typecheck/extended/api/extended_template_checker.js +0 -20
- package/src/ngtsc/typecheck/extended/api/index.js +0 -23
- package/src/ngtsc/typecheck/extended/checks/invalid_banana_in_box/index.js +0 -52
- package/src/ngtsc/typecheck/extended/checks/nullish_coalescing_not_nullable/index.js +0 -64
- package/src/ngtsc/typecheck/extended/index.js +0 -23
- package/src/ngtsc/typecheck/extended/src/extended_template_checker.js +0 -55
- package/src/ngtsc/typecheck/index.js +0 -29
- package/src/ngtsc/typecheck/src/checker.js +0 -764
- package/src/ngtsc/typecheck/src/comments.js +0 -181
- package/src/ngtsc/typecheck/src/completion.js +0 -230
- package/src/ngtsc/typecheck/src/context.js +0 -424
- package/src/ngtsc/typecheck/src/diagnostics.js +0 -114
- package/src/ngtsc/typecheck/src/dom.js +0 -87
- package/src/ngtsc/typecheck/src/environment.js +0 -160
- package/src/ngtsc/typecheck/src/expression.js +0 -417
- package/src/ngtsc/typecheck/src/line_mappings.js +0 -77
- package/src/ngtsc/typecheck/src/oob.js +0 -181
- package/src/ngtsc/typecheck/src/shim.js +0 -52
- package/src/ngtsc/typecheck/src/source.js +0 -91
- package/src/ngtsc/typecheck/src/tcb_util.js +0 -165
- package/src/ngtsc/typecheck/src/template_semantics.js +0 -52
- package/src/ngtsc/typecheck/src/template_symbol_builder.js +0 -551
- package/src/ngtsc/typecheck/src/ts_util.js +0 -202
- package/src/ngtsc/typecheck/src/type_check_block.js +0 -2212
- package/src/ngtsc/typecheck/src/type_check_file.js +0 -115
- package/src/ngtsc/typecheck/src/type_constructor.js +0 -255
- package/src/ngtsc/typecheck/src/type_emitter.js +0 -164
- package/src/ngtsc/typecheck/src/type_parameter_emitter.js +0 -115
- package/src/ngtsc/util/src/path.js +0 -33
- package/src/ngtsc/util/src/typescript.js +0 -176
- package/src/ngtsc/util/src/visitor.js +0 -119
- package/src/ngtsc/xi18n/index.js +0 -22
- package/src/ngtsc/xi18n/src/context.js +0 -20
- package/src/perform_compile.js +0 -322
- package/src/perform_watch.js +0 -263
- package/src/tooling.js +0 -47
- package/src/transformers/api.js +0 -42
- package/src/transformers/compiler_host.js +0 -623
- package/src/transformers/downlevel_decorators_transform.js +0 -611
- package/src/transformers/entry_points.js +0 -25
- package/src/transformers/i18n.js +0 -76
- package/src/transformers/inline_resources.js +0 -287
- package/src/transformers/lower_expressions.js +0 -365
- package/src/transformers/metadata_cache.js +0 -96
- package/src/transformers/metadata_reader.js +0 -120
- package/src/transformers/node_emitter.js +0 -637
- package/src/transformers/node_emitter_transform.js +0 -88
- package/src/transformers/patch_alias_reference_resolution.js +0 -129
- package/src/transformers/program.js +0 -1000
- package/src/transformers/r3_metadata_transform.js +0 -73
- package/src/transformers/r3_transform.js +0 -44
- package/src/transformers/util.js +0 -122
- package/src/typescript_support.js +0 -74
- package/src/version.js +0 -28
|
@@ -1,764 +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
|
-
(function (factory) {
|
|
9
|
-
if (typeof module === "object" && typeof module.exports === "object") {
|
|
10
|
-
var v = factory(require, exports);
|
|
11
|
-
if (v !== undefined) module.exports = v;
|
|
12
|
-
}
|
|
13
|
-
else if (typeof define === "function" && define.amd) {
|
|
14
|
-
define("@angular/compiler-cli/src/ngtsc/typecheck/src/checker", ["require", "exports", "tslib", "@angular/compiler", "@angular/compiler-cli/src/ngtsc/diagnostics", "@angular/compiler-cli/src/ngtsc/file_system", "@angular/compiler-cli/src/ngtsc/imports", "@angular/compiler-cli/src/ngtsc/perf", "@angular/compiler-cli/src/ngtsc/program_driver", "@angular/compiler-cli/src/ngtsc/reflection", "@angular/compiler-cli/src/ngtsc/shims", "@angular/compiler-cli/src/ngtsc/util/src/typescript", "@angular/compiler-cli/src/ngtsc/typecheck/api", "@angular/compiler-cli/src/ngtsc/typecheck/diagnostics", "@angular/compiler-cli/src/ngtsc/typecheck/src/completion", "@angular/compiler-cli/src/ngtsc/typecheck/src/context", "@angular/compiler-cli/src/ngtsc/typecheck/src/diagnostics", "@angular/compiler-cli/src/ngtsc/typecheck/src/shim", "@angular/compiler-cli/src/ngtsc/typecheck/src/source", "@angular/compiler-cli/src/ngtsc/typecheck/src/tcb_util", "@angular/compiler-cli/src/ngtsc/typecheck/src/template_symbol_builder"], factory);
|
|
15
|
-
}
|
|
16
|
-
})(function (require, exports) {
|
|
17
|
-
"use strict";
|
|
18
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
-
exports.TemplateTypeCheckerImpl = void 0;
|
|
20
|
-
var tslib_1 = require("tslib");
|
|
21
|
-
var compiler_1 = require("@angular/compiler");
|
|
22
|
-
var diagnostics_1 = require("@angular/compiler-cli/src/ngtsc/diagnostics");
|
|
23
|
-
var file_system_1 = require("@angular/compiler-cli/src/ngtsc/file_system");
|
|
24
|
-
var imports_1 = require("@angular/compiler-cli/src/ngtsc/imports");
|
|
25
|
-
var perf_1 = require("@angular/compiler-cli/src/ngtsc/perf");
|
|
26
|
-
var program_driver_1 = require("@angular/compiler-cli/src/ngtsc/program_driver");
|
|
27
|
-
var reflection_1 = require("@angular/compiler-cli/src/ngtsc/reflection");
|
|
28
|
-
var shims_1 = require("@angular/compiler-cli/src/ngtsc/shims");
|
|
29
|
-
var typescript_1 = require("@angular/compiler-cli/src/ngtsc/util/src/typescript");
|
|
30
|
-
var api_1 = require("@angular/compiler-cli/src/ngtsc/typecheck/api");
|
|
31
|
-
var diagnostics_2 = require("@angular/compiler-cli/src/ngtsc/typecheck/diagnostics");
|
|
32
|
-
var completion_1 = require("@angular/compiler-cli/src/ngtsc/typecheck/src/completion");
|
|
33
|
-
var context_1 = require("@angular/compiler-cli/src/ngtsc/typecheck/src/context");
|
|
34
|
-
var diagnostics_3 = require("@angular/compiler-cli/src/ngtsc/typecheck/src/diagnostics");
|
|
35
|
-
var shim_1 = require("@angular/compiler-cli/src/ngtsc/typecheck/src/shim");
|
|
36
|
-
var source_1 = require("@angular/compiler-cli/src/ngtsc/typecheck/src/source");
|
|
37
|
-
var tcb_util_1 = require("@angular/compiler-cli/src/ngtsc/typecheck/src/tcb_util");
|
|
38
|
-
var template_symbol_builder_1 = require("@angular/compiler-cli/src/ngtsc/typecheck/src/template_symbol_builder");
|
|
39
|
-
var REGISTRY = new compiler_1.DomElementSchemaRegistry();
|
|
40
|
-
/**
|
|
41
|
-
* Primary template type-checking engine, which performs type-checking using a
|
|
42
|
-
* `TypeCheckingProgramStrategy` for type-checking program maintenance, and the
|
|
43
|
-
* `ProgramTypeCheckAdapter` for generation of template type-checking code.
|
|
44
|
-
*/
|
|
45
|
-
var TemplateTypeCheckerImpl = /** @class */ (function () {
|
|
46
|
-
function TemplateTypeCheckerImpl(originalProgram, programDriver, typeCheckAdapter, config, refEmitter, reflector, compilerHost, priorBuild, componentScopeReader, typeCheckScopeRegistry, perf) {
|
|
47
|
-
this.originalProgram = originalProgram;
|
|
48
|
-
this.programDriver = programDriver;
|
|
49
|
-
this.typeCheckAdapter = typeCheckAdapter;
|
|
50
|
-
this.config = config;
|
|
51
|
-
this.refEmitter = refEmitter;
|
|
52
|
-
this.reflector = reflector;
|
|
53
|
-
this.compilerHost = compilerHost;
|
|
54
|
-
this.priorBuild = priorBuild;
|
|
55
|
-
this.componentScopeReader = componentScopeReader;
|
|
56
|
-
this.typeCheckScopeRegistry = typeCheckScopeRegistry;
|
|
57
|
-
this.perf = perf;
|
|
58
|
-
this.state = new Map();
|
|
59
|
-
/**
|
|
60
|
-
* Stores the `CompletionEngine` which powers autocompletion for each component class.
|
|
61
|
-
*
|
|
62
|
-
* Must be invalidated whenever the component's template or the `ts.Program` changes. Invalidation
|
|
63
|
-
* on template changes is performed within this `TemplateTypeCheckerImpl` instance. When the
|
|
64
|
-
* `ts.Program` changes, the `TemplateTypeCheckerImpl` as a whole is destroyed and replaced.
|
|
65
|
-
*/
|
|
66
|
-
this.completionCache = new Map();
|
|
67
|
-
/**
|
|
68
|
-
* Stores the `SymbolBuilder` which creates symbols for each component class.
|
|
69
|
-
*
|
|
70
|
-
* Must be invalidated whenever the component's template or the `ts.Program` changes. Invalidation
|
|
71
|
-
* on template changes is performed within this `TemplateTypeCheckerImpl` instance. When the
|
|
72
|
-
* `ts.Program` changes, the `TemplateTypeCheckerImpl` as a whole is destroyed and replaced.
|
|
73
|
-
*/
|
|
74
|
-
this.symbolBuilderCache = new Map();
|
|
75
|
-
/**
|
|
76
|
-
* Stores directives and pipes that are in scope for each component.
|
|
77
|
-
*
|
|
78
|
-
* Unlike other caches, the scope of a component is not affected by its template. It will be
|
|
79
|
-
* destroyed when the `ts.Program` changes and the `TemplateTypeCheckerImpl` as a whole is
|
|
80
|
-
* destroyed and replaced.
|
|
81
|
-
*/
|
|
82
|
-
this.scopeCache = new Map();
|
|
83
|
-
/**
|
|
84
|
-
* Stores potential element tags for each component (a union of DOM tags as well as directive
|
|
85
|
-
* tags).
|
|
86
|
-
*
|
|
87
|
-
* Unlike other caches, the scope of a component is not affected by its template. It will be
|
|
88
|
-
* destroyed when the `ts.Program` changes and the `TemplateTypeCheckerImpl` as a whole is
|
|
89
|
-
* destroyed and replaced.
|
|
90
|
-
*/
|
|
91
|
-
this.elementTagCache = new Map();
|
|
92
|
-
this.isComplete = false;
|
|
93
|
-
}
|
|
94
|
-
TemplateTypeCheckerImpl.prototype.getTemplate = function (component) {
|
|
95
|
-
var data = this.getLatestComponentState(component).data;
|
|
96
|
-
if (data === null) {
|
|
97
|
-
return null;
|
|
98
|
-
}
|
|
99
|
-
return data.template;
|
|
100
|
-
};
|
|
101
|
-
TemplateTypeCheckerImpl.prototype.getLatestComponentState = function (component) {
|
|
102
|
-
this.ensureShimForComponent(component);
|
|
103
|
-
var sf = component.getSourceFile();
|
|
104
|
-
var sfPath = (0, file_system_1.absoluteFromSourceFile)(sf);
|
|
105
|
-
var shimPath = shim_1.TypeCheckShimGenerator.shimFor(sfPath);
|
|
106
|
-
var fileRecord = this.getFileData(sfPath);
|
|
107
|
-
if (!fileRecord.shimData.has(shimPath)) {
|
|
108
|
-
return { data: null, tcb: null, shimPath: shimPath };
|
|
109
|
-
}
|
|
110
|
-
var templateId = fileRecord.sourceManager.getTemplateId(component);
|
|
111
|
-
var shimRecord = fileRecord.shimData.get(shimPath);
|
|
112
|
-
var id = fileRecord.sourceManager.getTemplateId(component);
|
|
113
|
-
var program = this.programDriver.getProgram();
|
|
114
|
-
var shimSf = (0, typescript_1.getSourceFileOrNull)(program, shimPath);
|
|
115
|
-
if (shimSf === null || !fileRecord.shimData.has(shimPath)) {
|
|
116
|
-
throw new Error("Error: no shim file in program: " + shimPath);
|
|
117
|
-
}
|
|
118
|
-
var tcb = (0, tcb_util_1.findTypeCheckBlock)(shimSf, id, /*isDiagnosticsRequest*/ false);
|
|
119
|
-
if (tcb === null) {
|
|
120
|
-
// Try for an inline block.
|
|
121
|
-
var inlineSf = (0, file_system_1.getSourceFileOrError)(program, sfPath);
|
|
122
|
-
tcb = (0, tcb_util_1.findTypeCheckBlock)(inlineSf, id, /*isDiagnosticsRequest*/ false);
|
|
123
|
-
}
|
|
124
|
-
var data = null;
|
|
125
|
-
if (shimRecord.templates.has(templateId)) {
|
|
126
|
-
data = shimRecord.templates.get(templateId);
|
|
127
|
-
}
|
|
128
|
-
return { data: data, tcb: tcb, shimPath: shimPath };
|
|
129
|
-
};
|
|
130
|
-
TemplateTypeCheckerImpl.prototype.isTrackedTypeCheckFile = function (filePath) {
|
|
131
|
-
return this.getFileAndShimRecordsForPath(filePath) !== null;
|
|
132
|
-
};
|
|
133
|
-
TemplateTypeCheckerImpl.prototype.getFileAndShimRecordsForPath = function (shimPath) {
|
|
134
|
-
var e_1, _a;
|
|
135
|
-
try {
|
|
136
|
-
for (var _b = (0, tslib_1.__values)(this.state.values()), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
137
|
-
var fileRecord = _c.value;
|
|
138
|
-
if (fileRecord.shimData.has(shimPath)) {
|
|
139
|
-
return { fileRecord: fileRecord, shimRecord: fileRecord.shimData.get(shimPath) };
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
144
|
-
finally {
|
|
145
|
-
try {
|
|
146
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
147
|
-
}
|
|
148
|
-
finally { if (e_1) throw e_1.error; }
|
|
149
|
-
}
|
|
150
|
-
return null;
|
|
151
|
-
};
|
|
152
|
-
TemplateTypeCheckerImpl.prototype.getTemplateMappingAtShimLocation = function (_a) {
|
|
153
|
-
var shimPath = _a.shimPath, positionInShimFile = _a.positionInShimFile;
|
|
154
|
-
var records = this.getFileAndShimRecordsForPath((0, file_system_1.absoluteFrom)(shimPath));
|
|
155
|
-
if (records === null) {
|
|
156
|
-
return null;
|
|
157
|
-
}
|
|
158
|
-
var fileRecord = records.fileRecord;
|
|
159
|
-
var shimSf = this.programDriver.getProgram().getSourceFile((0, file_system_1.absoluteFrom)(shimPath));
|
|
160
|
-
if (shimSf === undefined) {
|
|
161
|
-
return null;
|
|
162
|
-
}
|
|
163
|
-
return (0, tcb_util_1.getTemplateMapping)(shimSf, positionInShimFile, fileRecord.sourceManager, /*isDiagnosticsRequest*/ false);
|
|
164
|
-
};
|
|
165
|
-
TemplateTypeCheckerImpl.prototype.generateAllTypeCheckBlocks = function () {
|
|
166
|
-
this.ensureAllShimsForAllFiles();
|
|
167
|
-
};
|
|
168
|
-
/**
|
|
169
|
-
* Retrieve type-checking and template parse diagnostics from the given `ts.SourceFile` using the
|
|
170
|
-
* most recent type-checking program.
|
|
171
|
-
*/
|
|
172
|
-
TemplateTypeCheckerImpl.prototype.getDiagnosticsForFile = function (sf, optimizeFor) {
|
|
173
|
-
var _this = this;
|
|
174
|
-
switch (optimizeFor) {
|
|
175
|
-
case api_1.OptimizeFor.WholeProgram:
|
|
176
|
-
this.ensureAllShimsForAllFiles();
|
|
177
|
-
break;
|
|
178
|
-
case api_1.OptimizeFor.SingleFile:
|
|
179
|
-
this.ensureAllShimsForOneFile(sf);
|
|
180
|
-
break;
|
|
181
|
-
}
|
|
182
|
-
return this.perf.inPhase(perf_1.PerfPhase.TtcDiagnostics, function () {
|
|
183
|
-
var e_2, _a, e_3, _b;
|
|
184
|
-
var sfPath = (0, file_system_1.absoluteFromSourceFile)(sf);
|
|
185
|
-
var fileRecord = _this.state.get(sfPath);
|
|
186
|
-
var typeCheckProgram = _this.programDriver.getProgram();
|
|
187
|
-
var diagnostics = [];
|
|
188
|
-
if (fileRecord.hasInlines) {
|
|
189
|
-
var inlineSf = (0, file_system_1.getSourceFileOrError)(typeCheckProgram, sfPath);
|
|
190
|
-
diagnostics.push.apply(diagnostics, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(typeCheckProgram.getSemanticDiagnostics(inlineSf).map(function (diag) { return convertDiagnostic(diag, fileRecord.sourceManager); })), false));
|
|
191
|
-
}
|
|
192
|
-
try {
|
|
193
|
-
for (var _c = (0, tslib_1.__values)(fileRecord.shimData), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
194
|
-
var _e = (0, tslib_1.__read)(_d.value, 2), shimPath = _e[0], shimRecord = _e[1];
|
|
195
|
-
var shimSf = (0, file_system_1.getSourceFileOrError)(typeCheckProgram, shimPath);
|
|
196
|
-
diagnostics.push.apply(diagnostics, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(typeCheckProgram.getSemanticDiagnostics(shimSf).map(function (diag) { return convertDiagnostic(diag, fileRecord.sourceManager); })), false));
|
|
197
|
-
diagnostics.push.apply(diagnostics, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(shimRecord.genesisDiagnostics), false));
|
|
198
|
-
try {
|
|
199
|
-
for (var _f = (e_3 = void 0, (0, tslib_1.__values)(shimRecord.templates.values())), _g = _f.next(); !_g.done; _g = _f.next()) {
|
|
200
|
-
var templateData = _g.value;
|
|
201
|
-
diagnostics.push.apply(diagnostics, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(templateData.templateDiagnostics), false));
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
205
|
-
finally {
|
|
206
|
-
try {
|
|
207
|
-
if (_g && !_g.done && (_b = _f.return)) _b.call(_f);
|
|
208
|
-
}
|
|
209
|
-
finally { if (e_3) throw e_3.error; }
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
214
|
-
finally {
|
|
215
|
-
try {
|
|
216
|
-
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
217
|
-
}
|
|
218
|
-
finally { if (e_2) throw e_2.error; }
|
|
219
|
-
}
|
|
220
|
-
return diagnostics.filter(function (diag) { return diag !== null; });
|
|
221
|
-
});
|
|
222
|
-
};
|
|
223
|
-
TemplateTypeCheckerImpl.prototype.getDiagnosticsForComponent = function (component) {
|
|
224
|
-
var _this = this;
|
|
225
|
-
this.ensureShimForComponent(component);
|
|
226
|
-
return this.perf.inPhase(perf_1.PerfPhase.TtcDiagnostics, function () {
|
|
227
|
-
var e_4, _a;
|
|
228
|
-
var sf = component.getSourceFile();
|
|
229
|
-
var sfPath = (0, file_system_1.absoluteFromSourceFile)(sf);
|
|
230
|
-
var shimPath = shim_1.TypeCheckShimGenerator.shimFor(sfPath);
|
|
231
|
-
var fileRecord = _this.getFileData(sfPath);
|
|
232
|
-
if (!fileRecord.shimData.has(shimPath)) {
|
|
233
|
-
return [];
|
|
234
|
-
}
|
|
235
|
-
var templateId = fileRecord.sourceManager.getTemplateId(component);
|
|
236
|
-
var shimRecord = fileRecord.shimData.get(shimPath);
|
|
237
|
-
var typeCheckProgram = _this.programDriver.getProgram();
|
|
238
|
-
var diagnostics = [];
|
|
239
|
-
if (shimRecord.hasInlines) {
|
|
240
|
-
var inlineSf = (0, file_system_1.getSourceFileOrError)(typeCheckProgram, sfPath);
|
|
241
|
-
diagnostics.push.apply(diagnostics, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(typeCheckProgram.getSemanticDiagnostics(inlineSf).map(function (diag) { return convertDiagnostic(diag, fileRecord.sourceManager); })), false));
|
|
242
|
-
}
|
|
243
|
-
var shimSf = (0, file_system_1.getSourceFileOrError)(typeCheckProgram, shimPath);
|
|
244
|
-
diagnostics.push.apply(diagnostics, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(typeCheckProgram.getSemanticDiagnostics(shimSf).map(function (diag) { return convertDiagnostic(diag, fileRecord.sourceManager); })), false));
|
|
245
|
-
diagnostics.push.apply(diagnostics, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(shimRecord.genesisDiagnostics), false));
|
|
246
|
-
try {
|
|
247
|
-
for (var _b = (0, tslib_1.__values)(shimRecord.templates.values()), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
248
|
-
var templateData = _c.value;
|
|
249
|
-
diagnostics.push.apply(diagnostics, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(templateData.templateDiagnostics), false));
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
253
|
-
finally {
|
|
254
|
-
try {
|
|
255
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
256
|
-
}
|
|
257
|
-
finally { if (e_4) throw e_4.error; }
|
|
258
|
-
}
|
|
259
|
-
return diagnostics.filter(function (diag) {
|
|
260
|
-
return diag !== null && diag.templateId === templateId;
|
|
261
|
-
});
|
|
262
|
-
});
|
|
263
|
-
};
|
|
264
|
-
TemplateTypeCheckerImpl.prototype.getTypeCheckBlock = function (component) {
|
|
265
|
-
return this.getLatestComponentState(component).tcb;
|
|
266
|
-
};
|
|
267
|
-
TemplateTypeCheckerImpl.prototype.getGlobalCompletions = function (context, component, node) {
|
|
268
|
-
var engine = this.getOrCreateCompletionEngine(component);
|
|
269
|
-
if (engine === null) {
|
|
270
|
-
return null;
|
|
271
|
-
}
|
|
272
|
-
return this.perf.inPhase(perf_1.PerfPhase.TtcAutocompletion, function () { return engine.getGlobalCompletions(context, node); });
|
|
273
|
-
};
|
|
274
|
-
TemplateTypeCheckerImpl.prototype.getExpressionCompletionLocation = function (ast, component) {
|
|
275
|
-
var engine = this.getOrCreateCompletionEngine(component);
|
|
276
|
-
if (engine === null) {
|
|
277
|
-
return null;
|
|
278
|
-
}
|
|
279
|
-
return this.perf.inPhase(perf_1.PerfPhase.TtcAutocompletion, function () { return engine.getExpressionCompletionLocation(ast); });
|
|
280
|
-
};
|
|
281
|
-
TemplateTypeCheckerImpl.prototype.getLiteralCompletionLocation = function (node, component) {
|
|
282
|
-
var engine = this.getOrCreateCompletionEngine(component);
|
|
283
|
-
if (engine === null) {
|
|
284
|
-
return null;
|
|
285
|
-
}
|
|
286
|
-
return this.perf.inPhase(perf_1.PerfPhase.TtcAutocompletion, function () { return engine.getLiteralCompletionLocation(node); });
|
|
287
|
-
};
|
|
288
|
-
TemplateTypeCheckerImpl.prototype.invalidateClass = function (clazz) {
|
|
289
|
-
this.completionCache.delete(clazz);
|
|
290
|
-
this.symbolBuilderCache.delete(clazz);
|
|
291
|
-
this.scopeCache.delete(clazz);
|
|
292
|
-
this.elementTagCache.delete(clazz);
|
|
293
|
-
var sf = clazz.getSourceFile();
|
|
294
|
-
var sfPath = (0, file_system_1.absoluteFromSourceFile)(sf);
|
|
295
|
-
var shimPath = shim_1.TypeCheckShimGenerator.shimFor(sfPath);
|
|
296
|
-
var fileData = this.getFileData(sfPath);
|
|
297
|
-
var templateId = fileData.sourceManager.getTemplateId(clazz);
|
|
298
|
-
fileData.shimData.delete(shimPath);
|
|
299
|
-
fileData.isComplete = false;
|
|
300
|
-
this.isComplete = false;
|
|
301
|
-
};
|
|
302
|
-
TemplateTypeCheckerImpl.prototype.makeTemplateDiagnostic = function (clazz, sourceSpan, category, errorCode, message, relatedInformation) {
|
|
303
|
-
var sfPath = (0, file_system_1.absoluteFromSourceFile)(clazz.getSourceFile());
|
|
304
|
-
var fileRecord = this.state.get(sfPath);
|
|
305
|
-
var templateId = fileRecord.sourceManager.getTemplateId(clazz);
|
|
306
|
-
var mapping = fileRecord.sourceManager.getSourceMapping(templateId);
|
|
307
|
-
return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, (0, diagnostics_2.makeTemplateDiagnostic)(templateId, mapping, sourceSpan, category, (0, diagnostics_1.ngErrorCode)(errorCode), message, relatedInformation)), { __ngCode: errorCode });
|
|
308
|
-
};
|
|
309
|
-
TemplateTypeCheckerImpl.prototype.getOrCreateCompletionEngine = function (component) {
|
|
310
|
-
if (this.completionCache.has(component)) {
|
|
311
|
-
return this.completionCache.get(component);
|
|
312
|
-
}
|
|
313
|
-
var _a = this.getLatestComponentState(component), tcb = _a.tcb, data = _a.data, shimPath = _a.shimPath;
|
|
314
|
-
if (tcb === null || data === null) {
|
|
315
|
-
return null;
|
|
316
|
-
}
|
|
317
|
-
var engine = new completion_1.CompletionEngine(tcb, data, shimPath);
|
|
318
|
-
this.completionCache.set(component, engine);
|
|
319
|
-
return engine;
|
|
320
|
-
};
|
|
321
|
-
TemplateTypeCheckerImpl.prototype.maybeAdoptPriorResultsForFile = function (sf) {
|
|
322
|
-
var sfPath = (0, file_system_1.absoluteFromSourceFile)(sf);
|
|
323
|
-
if (this.state.has(sfPath)) {
|
|
324
|
-
var existingResults = this.state.get(sfPath);
|
|
325
|
-
if (existingResults.isComplete) {
|
|
326
|
-
// All data for this file has already been generated, so no need to adopt anything.
|
|
327
|
-
return;
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
var previousResults = this.priorBuild.priorTypeCheckingResultsFor(sf);
|
|
331
|
-
if (previousResults === null || !previousResults.isComplete) {
|
|
332
|
-
return;
|
|
333
|
-
}
|
|
334
|
-
this.perf.eventCount(perf_1.PerfEvent.ReuseTypeCheckFile);
|
|
335
|
-
this.state.set(sfPath, previousResults);
|
|
336
|
-
};
|
|
337
|
-
TemplateTypeCheckerImpl.prototype.ensureAllShimsForAllFiles = function () {
|
|
338
|
-
var _this = this;
|
|
339
|
-
if (this.isComplete) {
|
|
340
|
-
return;
|
|
341
|
-
}
|
|
342
|
-
this.perf.inPhase(perf_1.PerfPhase.TcbGeneration, function () {
|
|
343
|
-
var e_5, _a;
|
|
344
|
-
var host = new WholeProgramTypeCheckingHost(_this);
|
|
345
|
-
var ctx = _this.newContext(host);
|
|
346
|
-
try {
|
|
347
|
-
for (var _b = (0, tslib_1.__values)(_this.originalProgram.getSourceFiles()), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
348
|
-
var sf = _c.value;
|
|
349
|
-
if (sf.isDeclarationFile || (0, shims_1.isShim)(sf)) {
|
|
350
|
-
continue;
|
|
351
|
-
}
|
|
352
|
-
_this.maybeAdoptPriorResultsForFile(sf);
|
|
353
|
-
var sfPath = (0, file_system_1.absoluteFromSourceFile)(sf);
|
|
354
|
-
var fileData = _this.getFileData(sfPath);
|
|
355
|
-
if (fileData.isComplete) {
|
|
356
|
-
continue;
|
|
357
|
-
}
|
|
358
|
-
_this.typeCheckAdapter.typeCheck(sf, ctx);
|
|
359
|
-
fileData.isComplete = true;
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
363
|
-
finally {
|
|
364
|
-
try {
|
|
365
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
366
|
-
}
|
|
367
|
-
finally { if (e_5) throw e_5.error; }
|
|
368
|
-
}
|
|
369
|
-
_this.updateFromContext(ctx);
|
|
370
|
-
_this.isComplete = true;
|
|
371
|
-
});
|
|
372
|
-
};
|
|
373
|
-
TemplateTypeCheckerImpl.prototype.ensureAllShimsForOneFile = function (sf) {
|
|
374
|
-
var _this = this;
|
|
375
|
-
this.perf.inPhase(perf_1.PerfPhase.TcbGeneration, function () {
|
|
376
|
-
_this.maybeAdoptPriorResultsForFile(sf);
|
|
377
|
-
var sfPath = (0, file_system_1.absoluteFromSourceFile)(sf);
|
|
378
|
-
var fileData = _this.getFileData(sfPath);
|
|
379
|
-
if (fileData.isComplete) {
|
|
380
|
-
// All data for this file is present and accounted for already.
|
|
381
|
-
return;
|
|
382
|
-
}
|
|
383
|
-
var host = new SingleFileTypeCheckingHost(sfPath, fileData, _this);
|
|
384
|
-
var ctx = _this.newContext(host);
|
|
385
|
-
_this.typeCheckAdapter.typeCheck(sf, ctx);
|
|
386
|
-
fileData.isComplete = true;
|
|
387
|
-
_this.updateFromContext(ctx);
|
|
388
|
-
});
|
|
389
|
-
};
|
|
390
|
-
TemplateTypeCheckerImpl.prototype.ensureShimForComponent = function (component) {
|
|
391
|
-
var sf = component.getSourceFile();
|
|
392
|
-
var sfPath = (0, file_system_1.absoluteFromSourceFile)(sf);
|
|
393
|
-
var shimPath = shim_1.TypeCheckShimGenerator.shimFor(sfPath);
|
|
394
|
-
this.maybeAdoptPriorResultsForFile(sf);
|
|
395
|
-
var fileData = this.getFileData(sfPath);
|
|
396
|
-
if (fileData.shimData.has(shimPath)) {
|
|
397
|
-
// All data for this component is available.
|
|
398
|
-
return;
|
|
399
|
-
}
|
|
400
|
-
var host = new SingleShimTypeCheckingHost(sfPath, fileData, this, shimPath);
|
|
401
|
-
var ctx = this.newContext(host);
|
|
402
|
-
this.typeCheckAdapter.typeCheck(sf, ctx);
|
|
403
|
-
this.updateFromContext(ctx);
|
|
404
|
-
};
|
|
405
|
-
TemplateTypeCheckerImpl.prototype.newContext = function (host) {
|
|
406
|
-
var inlining = this.programDriver.supportsInlineOperations ? context_1.InliningMode.InlineOps : context_1.InliningMode.Error;
|
|
407
|
-
return new context_1.TypeCheckContextImpl(this.config, this.compilerHost, this.refEmitter, this.reflector, host, inlining, this.perf);
|
|
408
|
-
};
|
|
409
|
-
/**
|
|
410
|
-
* Remove any shim data that depends on inline operations applied to the type-checking program.
|
|
411
|
-
*
|
|
412
|
-
* This can be useful if new inlines need to be applied, and it's not possible to guarantee that
|
|
413
|
-
* they won't overwrite or corrupt existing inlines that are used by such shims.
|
|
414
|
-
*/
|
|
415
|
-
TemplateTypeCheckerImpl.prototype.clearAllShimDataUsingInlines = function () {
|
|
416
|
-
var e_6, _a, e_7, _b;
|
|
417
|
-
try {
|
|
418
|
-
for (var _c = (0, tslib_1.__values)(this.state.values()), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
419
|
-
var fileData = _d.value;
|
|
420
|
-
if (!fileData.hasInlines) {
|
|
421
|
-
continue;
|
|
422
|
-
}
|
|
423
|
-
try {
|
|
424
|
-
for (var _e = (e_7 = void 0, (0, tslib_1.__values)(fileData.shimData.entries())), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
425
|
-
var _g = (0, tslib_1.__read)(_f.value, 2), shimFile = _g[0], shimData = _g[1];
|
|
426
|
-
if (shimData.hasInlines) {
|
|
427
|
-
fileData.shimData.delete(shimFile);
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
catch (e_7_1) { e_7 = { error: e_7_1 }; }
|
|
432
|
-
finally {
|
|
433
|
-
try {
|
|
434
|
-
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
|
|
435
|
-
}
|
|
436
|
-
finally { if (e_7) throw e_7.error; }
|
|
437
|
-
}
|
|
438
|
-
fileData.hasInlines = false;
|
|
439
|
-
fileData.isComplete = false;
|
|
440
|
-
this.isComplete = false;
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
catch (e_6_1) { e_6 = { error: e_6_1 }; }
|
|
444
|
-
finally {
|
|
445
|
-
try {
|
|
446
|
-
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
447
|
-
}
|
|
448
|
-
finally { if (e_6) throw e_6.error; }
|
|
449
|
-
}
|
|
450
|
-
};
|
|
451
|
-
TemplateTypeCheckerImpl.prototype.updateFromContext = function (ctx) {
|
|
452
|
-
var _this = this;
|
|
453
|
-
var updates = ctx.finalize();
|
|
454
|
-
return this.perf.inPhase(perf_1.PerfPhase.TcbUpdateProgram, function () {
|
|
455
|
-
if (updates.size > 0) {
|
|
456
|
-
_this.perf.eventCount(perf_1.PerfEvent.UpdateTypeCheckProgram);
|
|
457
|
-
}
|
|
458
|
-
_this.programDriver.updateFiles(updates, program_driver_1.UpdateMode.Incremental);
|
|
459
|
-
_this.priorBuild.recordSuccessfulTypeCheck(_this.state);
|
|
460
|
-
_this.perf.memory(perf_1.PerfCheckpoint.TtcUpdateProgram);
|
|
461
|
-
});
|
|
462
|
-
};
|
|
463
|
-
TemplateTypeCheckerImpl.prototype.getFileData = function (path) {
|
|
464
|
-
if (!this.state.has(path)) {
|
|
465
|
-
this.state.set(path, {
|
|
466
|
-
hasInlines: false,
|
|
467
|
-
sourceManager: new source_1.TemplateSourceManager(),
|
|
468
|
-
isComplete: false,
|
|
469
|
-
shimData: new Map(),
|
|
470
|
-
});
|
|
471
|
-
}
|
|
472
|
-
return this.state.get(path);
|
|
473
|
-
};
|
|
474
|
-
TemplateTypeCheckerImpl.prototype.getSymbolOfNode = function (node, component) {
|
|
475
|
-
var builder = this.getOrCreateSymbolBuilder(component);
|
|
476
|
-
if (builder === null) {
|
|
477
|
-
return null;
|
|
478
|
-
}
|
|
479
|
-
return this.perf.inPhase(perf_1.PerfPhase.TtcSymbol, function () { return builder.getSymbol(node); });
|
|
480
|
-
};
|
|
481
|
-
TemplateTypeCheckerImpl.prototype.getOrCreateSymbolBuilder = function (component) {
|
|
482
|
-
var _this = this;
|
|
483
|
-
if (this.symbolBuilderCache.has(component)) {
|
|
484
|
-
return this.symbolBuilderCache.get(component);
|
|
485
|
-
}
|
|
486
|
-
var _a = this.getLatestComponentState(component), tcb = _a.tcb, data = _a.data, shimPath = _a.shimPath;
|
|
487
|
-
if (tcb === null || data === null) {
|
|
488
|
-
return null;
|
|
489
|
-
}
|
|
490
|
-
var builder = new template_symbol_builder_1.SymbolBuilder(shimPath, tcb, data, this.componentScopeReader, function () { return _this.programDriver.getProgram().getTypeChecker(); });
|
|
491
|
-
this.symbolBuilderCache.set(component, builder);
|
|
492
|
-
return builder;
|
|
493
|
-
};
|
|
494
|
-
TemplateTypeCheckerImpl.prototype.getDirectivesInScope = function (component) {
|
|
495
|
-
var data = this.getScopeData(component);
|
|
496
|
-
if (data === null) {
|
|
497
|
-
return null;
|
|
498
|
-
}
|
|
499
|
-
return data.directives;
|
|
500
|
-
};
|
|
501
|
-
TemplateTypeCheckerImpl.prototype.getPipesInScope = function (component) {
|
|
502
|
-
var data = this.getScopeData(component);
|
|
503
|
-
if (data === null) {
|
|
504
|
-
return null;
|
|
505
|
-
}
|
|
506
|
-
return data.pipes;
|
|
507
|
-
};
|
|
508
|
-
TemplateTypeCheckerImpl.prototype.getDirectiveMetadata = function (dir) {
|
|
509
|
-
if (!(0, reflection_1.isNamedClassDeclaration)(dir)) {
|
|
510
|
-
return null;
|
|
511
|
-
}
|
|
512
|
-
return this.typeCheckScopeRegistry.getTypeCheckDirectiveMetadata(new imports_1.Reference(dir));
|
|
513
|
-
};
|
|
514
|
-
TemplateTypeCheckerImpl.prototype.getPotentialElementTags = function (component) {
|
|
515
|
-
var e_8, _a, e_9, _b, e_10, _c;
|
|
516
|
-
if (this.elementTagCache.has(component)) {
|
|
517
|
-
return this.elementTagCache.get(component);
|
|
518
|
-
}
|
|
519
|
-
var tagMap = new Map();
|
|
520
|
-
try {
|
|
521
|
-
for (var _d = (0, tslib_1.__values)(REGISTRY.allKnownElementNames()), _e = _d.next(); !_e.done; _e = _d.next()) {
|
|
522
|
-
var tag = _e.value;
|
|
523
|
-
tagMap.set(tag, null);
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
catch (e_8_1) { e_8 = { error: e_8_1 }; }
|
|
527
|
-
finally {
|
|
528
|
-
try {
|
|
529
|
-
if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
|
|
530
|
-
}
|
|
531
|
-
finally { if (e_8) throw e_8.error; }
|
|
532
|
-
}
|
|
533
|
-
var scope = this.getScopeData(component);
|
|
534
|
-
if (scope !== null) {
|
|
535
|
-
try {
|
|
536
|
-
for (var _f = (0, tslib_1.__values)(scope.directives), _g = _f.next(); !_g.done; _g = _f.next()) {
|
|
537
|
-
var directive = _g.value;
|
|
538
|
-
try {
|
|
539
|
-
for (var _h = (e_10 = void 0, (0, tslib_1.__values)(compiler_1.CssSelector.parse(directive.selector))), _j = _h.next(); !_j.done; _j = _h.next()) {
|
|
540
|
-
var selector = _j.value;
|
|
541
|
-
if (selector.element === null || tagMap.has(selector.element)) {
|
|
542
|
-
// Skip this directive if it doesn't match an element tag, or if another directive has
|
|
543
|
-
// already been included with the same element name.
|
|
544
|
-
continue;
|
|
545
|
-
}
|
|
546
|
-
tagMap.set(selector.element, directive);
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
catch (e_10_1) { e_10 = { error: e_10_1 }; }
|
|
550
|
-
finally {
|
|
551
|
-
try {
|
|
552
|
-
if (_j && !_j.done && (_c = _h.return)) _c.call(_h);
|
|
553
|
-
}
|
|
554
|
-
finally { if (e_10) throw e_10.error; }
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
|
-
}
|
|
558
|
-
catch (e_9_1) { e_9 = { error: e_9_1 }; }
|
|
559
|
-
finally {
|
|
560
|
-
try {
|
|
561
|
-
if (_g && !_g.done && (_b = _f.return)) _b.call(_f);
|
|
562
|
-
}
|
|
563
|
-
finally { if (e_9) throw e_9.error; }
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
this.elementTagCache.set(component, tagMap);
|
|
567
|
-
return tagMap;
|
|
568
|
-
};
|
|
569
|
-
TemplateTypeCheckerImpl.prototype.getPotentialDomBindings = function (tagName) {
|
|
570
|
-
var attributes = REGISTRY.allKnownAttributesOfElement(tagName);
|
|
571
|
-
return attributes.map(function (attribute) { return ({
|
|
572
|
-
attribute: attribute,
|
|
573
|
-
property: REGISTRY.getMappedPropName(attribute),
|
|
574
|
-
}); });
|
|
575
|
-
};
|
|
576
|
-
TemplateTypeCheckerImpl.prototype.getScopeData = function (component) {
|
|
577
|
-
var e_11, _a, e_12, _b;
|
|
578
|
-
if (this.scopeCache.has(component)) {
|
|
579
|
-
return this.scopeCache.get(component);
|
|
580
|
-
}
|
|
581
|
-
if (!(0, reflection_1.isNamedClassDeclaration)(component)) {
|
|
582
|
-
throw new Error("AssertionError: components must have names");
|
|
583
|
-
}
|
|
584
|
-
var scope = this.componentScopeReader.getScopeForComponent(component);
|
|
585
|
-
if (scope === null) {
|
|
586
|
-
return null;
|
|
587
|
-
}
|
|
588
|
-
var data = {
|
|
589
|
-
directives: [],
|
|
590
|
-
pipes: [],
|
|
591
|
-
isPoisoned: scope.compilation.isPoisoned,
|
|
592
|
-
};
|
|
593
|
-
var typeChecker = this.programDriver.getProgram().getTypeChecker();
|
|
594
|
-
try {
|
|
595
|
-
for (var _c = (0, tslib_1.__values)(scope.compilation.directives), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
596
|
-
var dir = _d.value;
|
|
597
|
-
if (dir.selector === null) {
|
|
598
|
-
// Skip this directive, it can't be added to a template anyway.
|
|
599
|
-
continue;
|
|
600
|
-
}
|
|
601
|
-
var tsSymbol = typeChecker.getSymbolAtLocation(dir.ref.node.name);
|
|
602
|
-
if (!(0, typescript_1.isSymbolWithValueDeclaration)(tsSymbol)) {
|
|
603
|
-
continue;
|
|
604
|
-
}
|
|
605
|
-
var ngModule = null;
|
|
606
|
-
var moduleScopeOfDir = this.componentScopeReader.getScopeForComponent(dir.ref.node);
|
|
607
|
-
if (moduleScopeOfDir !== null) {
|
|
608
|
-
ngModule = moduleScopeOfDir.ngModule;
|
|
609
|
-
}
|
|
610
|
-
data.directives.push({
|
|
611
|
-
isComponent: dir.isComponent,
|
|
612
|
-
isStructural: dir.isStructural,
|
|
613
|
-
selector: dir.selector,
|
|
614
|
-
tsSymbol: tsSymbol,
|
|
615
|
-
ngModule: ngModule,
|
|
616
|
-
});
|
|
617
|
-
}
|
|
618
|
-
}
|
|
619
|
-
catch (e_11_1) { e_11 = { error: e_11_1 }; }
|
|
620
|
-
finally {
|
|
621
|
-
try {
|
|
622
|
-
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
623
|
-
}
|
|
624
|
-
finally { if (e_11) throw e_11.error; }
|
|
625
|
-
}
|
|
626
|
-
try {
|
|
627
|
-
for (var _e = (0, tslib_1.__values)(scope.compilation.pipes), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
628
|
-
var pipe = _f.value;
|
|
629
|
-
var tsSymbol = typeChecker.getSymbolAtLocation(pipe.ref.node.name);
|
|
630
|
-
if (tsSymbol === undefined) {
|
|
631
|
-
continue;
|
|
632
|
-
}
|
|
633
|
-
data.pipes.push({
|
|
634
|
-
name: pipe.name,
|
|
635
|
-
tsSymbol: tsSymbol,
|
|
636
|
-
});
|
|
637
|
-
}
|
|
638
|
-
}
|
|
639
|
-
catch (e_12_1) { e_12 = { error: e_12_1 }; }
|
|
640
|
-
finally {
|
|
641
|
-
try {
|
|
642
|
-
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
|
|
643
|
-
}
|
|
644
|
-
finally { if (e_12) throw e_12.error; }
|
|
645
|
-
}
|
|
646
|
-
this.scopeCache.set(component, data);
|
|
647
|
-
return data;
|
|
648
|
-
};
|
|
649
|
-
return TemplateTypeCheckerImpl;
|
|
650
|
-
}());
|
|
651
|
-
exports.TemplateTypeCheckerImpl = TemplateTypeCheckerImpl;
|
|
652
|
-
function convertDiagnostic(diag, sourceResolver) {
|
|
653
|
-
if (!(0, diagnostics_3.shouldReportDiagnostic)(diag)) {
|
|
654
|
-
return null;
|
|
655
|
-
}
|
|
656
|
-
return (0, diagnostics_3.translateDiagnostic)(diag, sourceResolver);
|
|
657
|
-
}
|
|
658
|
-
/**
|
|
659
|
-
* Drives a `TypeCheckContext` to generate type-checking code for every component in the program.
|
|
660
|
-
*/
|
|
661
|
-
var WholeProgramTypeCheckingHost = /** @class */ (function () {
|
|
662
|
-
function WholeProgramTypeCheckingHost(impl) {
|
|
663
|
-
this.impl = impl;
|
|
664
|
-
}
|
|
665
|
-
WholeProgramTypeCheckingHost.prototype.getSourceManager = function (sfPath) {
|
|
666
|
-
return this.impl.getFileData(sfPath).sourceManager;
|
|
667
|
-
};
|
|
668
|
-
WholeProgramTypeCheckingHost.prototype.shouldCheckComponent = function (node) {
|
|
669
|
-
var sfPath = (0, file_system_1.absoluteFromSourceFile)(node.getSourceFile());
|
|
670
|
-
var shimPath = shim_1.TypeCheckShimGenerator.shimFor(sfPath);
|
|
671
|
-
var fileData = this.impl.getFileData(sfPath);
|
|
672
|
-
// The component needs to be checked unless the shim which would contain it already exists.
|
|
673
|
-
return !fileData.shimData.has(shimPath);
|
|
674
|
-
};
|
|
675
|
-
WholeProgramTypeCheckingHost.prototype.recordShimData = function (sfPath, data) {
|
|
676
|
-
var fileData = this.impl.getFileData(sfPath);
|
|
677
|
-
fileData.shimData.set(data.path, data);
|
|
678
|
-
if (data.hasInlines) {
|
|
679
|
-
fileData.hasInlines = true;
|
|
680
|
-
}
|
|
681
|
-
};
|
|
682
|
-
WholeProgramTypeCheckingHost.prototype.recordComplete = function (sfPath) {
|
|
683
|
-
this.impl.getFileData(sfPath).isComplete = true;
|
|
684
|
-
};
|
|
685
|
-
return WholeProgramTypeCheckingHost;
|
|
686
|
-
}());
|
|
687
|
-
/**
|
|
688
|
-
* Drives a `TypeCheckContext` to generate type-checking code efficiently for a single input file.
|
|
689
|
-
*/
|
|
690
|
-
var SingleFileTypeCheckingHost = /** @class */ (function () {
|
|
691
|
-
function SingleFileTypeCheckingHost(sfPath, fileData, impl) {
|
|
692
|
-
this.sfPath = sfPath;
|
|
693
|
-
this.fileData = fileData;
|
|
694
|
-
this.impl = impl;
|
|
695
|
-
this.seenInlines = false;
|
|
696
|
-
}
|
|
697
|
-
SingleFileTypeCheckingHost.prototype.assertPath = function (sfPath) {
|
|
698
|
-
if (this.sfPath !== sfPath) {
|
|
699
|
-
throw new Error("AssertionError: querying TypeCheckingHost outside of assigned file");
|
|
700
|
-
}
|
|
701
|
-
};
|
|
702
|
-
SingleFileTypeCheckingHost.prototype.getSourceManager = function (sfPath) {
|
|
703
|
-
this.assertPath(sfPath);
|
|
704
|
-
return this.fileData.sourceManager;
|
|
705
|
-
};
|
|
706
|
-
SingleFileTypeCheckingHost.prototype.shouldCheckComponent = function (node) {
|
|
707
|
-
if (this.sfPath !== (0, file_system_1.absoluteFromSourceFile)(node.getSourceFile())) {
|
|
708
|
-
return false;
|
|
709
|
-
}
|
|
710
|
-
var shimPath = shim_1.TypeCheckShimGenerator.shimFor(this.sfPath);
|
|
711
|
-
// Only need to generate a TCB for the class if no shim exists for it currently.
|
|
712
|
-
return !this.fileData.shimData.has(shimPath);
|
|
713
|
-
};
|
|
714
|
-
SingleFileTypeCheckingHost.prototype.recordShimData = function (sfPath, data) {
|
|
715
|
-
this.assertPath(sfPath);
|
|
716
|
-
// Previous type-checking state may have required the use of inlines (assuming they were
|
|
717
|
-
// supported). If the current operation also requires inlines, this presents a problem:
|
|
718
|
-
// generating new inlines may invalidate any old inlines that old state depends on.
|
|
719
|
-
//
|
|
720
|
-
// Rather than resolve this issue by tracking specific dependencies on inlines, if the new state
|
|
721
|
-
// relies on inlines, any old state that relied on them is simply cleared. This happens when the
|
|
722
|
-
// first new state that uses inlines is encountered.
|
|
723
|
-
if (data.hasInlines && !this.seenInlines) {
|
|
724
|
-
this.impl.clearAllShimDataUsingInlines();
|
|
725
|
-
this.seenInlines = true;
|
|
726
|
-
}
|
|
727
|
-
this.fileData.shimData.set(data.path, data);
|
|
728
|
-
if (data.hasInlines) {
|
|
729
|
-
this.fileData.hasInlines = true;
|
|
730
|
-
}
|
|
731
|
-
};
|
|
732
|
-
SingleFileTypeCheckingHost.prototype.recordComplete = function (sfPath) {
|
|
733
|
-
this.assertPath(sfPath);
|
|
734
|
-
this.fileData.isComplete = true;
|
|
735
|
-
};
|
|
736
|
-
return SingleFileTypeCheckingHost;
|
|
737
|
-
}());
|
|
738
|
-
/**
|
|
739
|
-
* Drives a `TypeCheckContext` to generate type-checking code efficiently for only those components
|
|
740
|
-
* which map to a single shim of a single input file.
|
|
741
|
-
*/
|
|
742
|
-
var SingleShimTypeCheckingHost = /** @class */ (function (_super) {
|
|
743
|
-
(0, tslib_1.__extends)(SingleShimTypeCheckingHost, _super);
|
|
744
|
-
function SingleShimTypeCheckingHost(sfPath, fileData, impl, shimPath) {
|
|
745
|
-
var _this = _super.call(this, sfPath, fileData, impl) || this;
|
|
746
|
-
_this.shimPath = shimPath;
|
|
747
|
-
return _this;
|
|
748
|
-
}
|
|
749
|
-
SingleShimTypeCheckingHost.prototype.shouldCheckNode = function (node) {
|
|
750
|
-
if (this.sfPath !== (0, file_system_1.absoluteFromSourceFile)(node.getSourceFile())) {
|
|
751
|
-
return false;
|
|
752
|
-
}
|
|
753
|
-
// Only generate a TCB for the component if it maps to the requested shim file.
|
|
754
|
-
var shimPath = shim_1.TypeCheckShimGenerator.shimFor(this.sfPath);
|
|
755
|
-
if (shimPath !== this.shimPath) {
|
|
756
|
-
return false;
|
|
757
|
-
}
|
|
758
|
-
// Only need to generate a TCB for the class if no shim exists for it currently.
|
|
759
|
-
return !this.fileData.shimData.has(shimPath);
|
|
760
|
-
};
|
|
761
|
-
return SingleShimTypeCheckingHost;
|
|
762
|
-
}(SingleFileTypeCheckingHost));
|
|
763
|
-
});
|
|
764
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBpbGVyLWNsaS9zcmMvbmd0c2MvdHlwZWNoZWNrL3NyYy9jaGVja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRzs7Ozs7Ozs7Ozs7Ozs7SUFFSCw4Q0FBZ047SUFHaE4sMkVBQXlEO0lBRXpELDJFQUE2RztJQUM3RyxtRUFBMEQ7SUFFMUQsNkRBQThFO0lBQzlFLGlGQUErRDtJQUMvRCx5RUFBMkY7SUFFM0YsK0RBQW1DO0lBQ25DLGtGQUE0RjtJQUM1RixxRUFBa1Q7SUFDbFQscUZBQXNEO0lBRXRELHVGQUE4QztJQUM5QyxpRkFBbUg7SUFDbkgseUZBQTBFO0lBQzFFLDJFQUE4QztJQUM5QywrRUFBK0M7SUFDL0MsbUZBQTBGO0lBQzFGLGlIQUF3RDtJQUd4RCxJQUFNLFFBQVEsR0FBRyxJQUFJLG1DQUF3QixFQUFFLENBQUM7SUFDaEQ7Ozs7T0FJRztJQUNIO1FBeUNFLGlDQUNZLGVBQTJCLEVBQVcsYUFBNEIsRUFDbEUsZ0JBQXlDLEVBQVUsTUFBMEIsRUFDN0UsVUFBNEIsRUFBVSxTQUF5QixFQUMvRCxZQUEyRCxFQUMzRCxVQUEyRCxFQUNsRCxvQkFBMEMsRUFDMUMsc0JBQThDLEVBQzlDLElBQWtCO1lBUDNCLG9CQUFlLEdBQWYsZUFBZSxDQUFZO1lBQVcsa0JBQWEsR0FBYixhQUFhLENBQWU7WUFDbEUscUJBQWdCLEdBQWhCLGdCQUFnQixDQUF5QjtZQUFVLFdBQU0sR0FBTixNQUFNLENBQW9CO1lBQzdFLGVBQVUsR0FBVixVQUFVLENBQWtCO1lBQVUsY0FBUyxHQUFULFNBQVMsQ0FBZ0I7WUFDL0QsaUJBQVksR0FBWixZQUFZLENBQStDO1lBQzNELGVBQVUsR0FBVixVQUFVLENBQWlEO1lBQ2xELHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7WUFDMUMsMkJBQXNCLEdBQXRC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QUFNLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDbEMsQ0FBQztRQUNILGlDQUFDO0lBQUQsQ0FBQyxBQXJERCxJQXFEQztJQUVEOzs7T0FHRztJQUNIO1FBQXlDLDJEQUEwQjtRQUNqRSxvQ0FDSSxNQUFzQixFQUFFLFFBQThCLEVBQUUsSUFBNkIsRUFDN0UsUUFBd0I7WUFGcEMsWUFHRSxrQkFBTSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUM5QjtZQUZXLGNBQVEsR0FBUixRQUFRLENBQWdCOztRQUVwQyxDQUFDO1FBRUQsb0RBQWUsR0FBZixVQUFnQixJQUF5QjtZQUN2QyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBQSxvQ0FBc0IsRUFBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRTtnQkFDaEUsT0FBTyxLQUFLLENBQUM7YUFDZDtZQUVELCtFQUErRTtZQUMvRSxJQUFNLFFBQVEsR0FBRyw2QkFBc0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdELElBQUksUUFBUSxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQzlCLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFFRCxnRkFBZ0Y7WUFDaEYsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBQ0gsaUNBQUM7SUFBRCxDQUFDLEFBckJELENBQXlDLDBCQUEwQixHQXFCbEUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtBU1QsIENzc1NlbGVjdG9yLCBEb21FbGVtZW50U2NoZW1hUmVnaXN0cnksIExpdGVyYWxQcmltaXRpdmUsIFBhcnNlU291cmNlU3BhbiwgUHJvcGVydHlSZWFkLCBTYWZlUHJvcGVydHlSZWFkLCBUbXBsQXN0RWxlbWVudCwgVG1wbEFzdE5vZGUsIFRtcGxBc3RSZWZlcmVuY2UsIFRtcGxBc3RUZW1wbGF0ZX0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXInO1xuaW1wb3J0IHtUZXh0QXR0cmlidXRlfSBmcm9tICdAYW5ndWxhci9jb21waWxlci9zcmMvcmVuZGVyMy9yM19hc3QnO1xuaW1wb3J0ICogYXMgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQge0Vycm9yQ29kZSwgbmdFcnJvckNvZGV9IGZyb20gJy4uLy4uL2RpYWdub3N0aWNzJztcblxuaW1wb3J0IHthYnNvbHV0ZUZyb20sIGFic29sdXRlRnJvbVNvdXJjZUZpbGUsIEFic29sdXRlRnNQYXRoLCBnZXRTb3VyY2VGaWxlT3JFcnJvcn0gZnJvbSAnLi4vLi4vZmlsZV9zeXN0ZW0nO1xuaW1wb3J0IHtSZWZlcmVuY2UsIFJlZmVyZW5jZUVtaXR0ZXJ9IGZyb20gJy4uLy4uL2ltcG9ydHMnO1xuaW1wb3J0IHtJbmNyZW1lbnRhbEJ1aWxkfSBmcm9tICcuLi8uLi9pbmNyZW1lbnRhbC9hcGknO1xuaW1wb3J0IHtQZXJmQ2hlY2twb2ludCwgUGVyZkV2ZW50LCBQZXJmUGhhc2UsIFBlcmZSZWNvcmRlcn0gZnJvbSAnLi4vLi4vcGVyZic7XG5pbXBvcnQge1Byb2dyYW1Ecml2ZXIsIFVwZGF0ZU1vZGV9IGZyb20gJy4uLy4uL3Byb2dyYW1fZHJpdmVyJztcbmltcG9ydCB7Q2xhc3NEZWNsYXJhdGlvbiwgaXNOYW1lZENsYXNzRGVjbGFyYXRpb24sIFJlZmxlY3Rpb25Ib3N0fSBmcm9tICcuLi8uLi9yZWZsZWN0aW9uJztcbmltcG9ydCB7Q29tcG9uZW50U2NvcGVSZWFkZXIsIFR5cGVDaGVja1Njb3BlUmVnaXN0cnl9IGZyb20gJy4uLy4uL3Njb3BlJztcbmltcG9ydCB7aXNTaGltfSBmcm9tICcuLi8uLi9zaGltcyc7XG5pbXBvcnQge2dldFNvdXJjZUZpbGVPck51bGwsIGlzU3ltYm9sV2l0aFZhbHVlRGVjbGFyYXRpb259IGZyb20gJy4uLy4uL3V0aWwvc3JjL3R5cGVzY3JpcHQnO1xuaW1wb3J0IHtEaXJlY3RpdmVJblNjb3BlLCBFbGVtZW50U3ltYm9sLCBGdWxsVGVtcGxhdGVNYXBwaW5nLCBHbG9iYWxDb21wbGV0aW9uLCBOZ1RlbXBsYXRlRGlhZ25vc3RpYywgT3B0aW1pemVGb3IsIFBpcGVJblNjb3BlLCBQcm9ncmFtVHlwZUNoZWNrQWRhcHRlciwgU2hpbUxvY2F0aW9uLCBTeW1ib2wsIFRlbXBsYXRlRGlhZ25vc3RpYywgVGVtcGxhdGVJZCwgVGVtcGxhdGVTeW1ib2wsIFRlbXBsYXRlVHlwZUNoZWNrZXIsIFR5cGVDaGVja2FibGVEaXJlY3RpdmVNZXRhLCBUeXBlQ2hlY2tpbmdDb25maWd9IGZyb20gJy4uL2FwaSc7XG5pbXBvcnQge21ha2VUZW1wbGF0ZURpYWdub3N0aWN9IGZyb20gJy4uL2RpYWdub3N0aWNzJztcblxuaW1wb3J0IHtDb21wbGV0aW9uRW5naW5lfSBmcm9tICcuL2NvbXBsZXRpb24nO1xuaW1wb3J0IHtJbmxpbmluZ01vZGUsIFNoaW1UeXBlQ2hlY2tpbmdEYXRhLCBUZW1wbGF0ZURhdGEsIFR5cGVDaGVja0NvbnRleHRJbXBsLCBUeXBlQ2hlY2tpbmdIb3N0fSBmcm9tICcuL2NvbnRleHQnO1xuaW1wb3J0IHtzaG91bGRSZXBvcnREaWFnbm9zdGljLCB0cmFuc2xhdGVEaWFnbm9zdGljfSBmcm9tICcuL2RpYWdub3N0aWNzJztcbmltcG9ydCB7VHlwZUNoZWNrU2hpbUdlbmVyYXRvcn0gZnJvbSAnLi9zaGltJztcbmltcG9ydCB7VGVtcGxhdGVTb3VyY2VNYW5hZ2VyfSBmcm9tICcuL3NvdXJjZSc7XG5pbXBvcnQge2ZpbmRUeXBlQ2hlY2tCbG9jaywgZ2V0VGVtcGxhdGVNYXBwaW5nLCBUZW1wbGF0ZVNvdXJjZVJlc29sdmVyfSBmcm9tICcuL3RjYl91dGlsJztcbmltcG9ydCB7U3ltYm9sQnVpbGRlcn0gZnJvbSAnLi90ZW1wbGF0ZV9zeW1ib2xfYnVpbGRlcic7XG5cblxuY29uc3QgUkVHSVNUUlkgPSBuZXcgRG9tRWxlbWVudFNjaGVtYVJlZ2lzdHJ5KCk7XG4vKipcbiAqIFByaW1hcnkgdGVtcGxhdGUgdHlwZS1jaGVja2luZyBlbmdpbmUsIHdoaWNoIHBlcmZvcm1zIHR5cGUtY2hlY2tpbmcgdXNpbmcgYVxuICogYFR5cGVDaGVja2luZ1Byb2dyYW1TdHJhdGVneWAgZm9yIHR5cGUtY2hlY2tpbmcgcHJvZ3JhbSBtYWludGVuYW5jZSwgYW5kIHRoZVxuICogYFByb2dyYW1UeXBlQ2hlY2tBZGFwdGVyYCBmb3IgZ2VuZXJhdGlvbiBvZiB0ZW1wbGF0ZSB0eXBlLWNoZWNraW5nIGNvZGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZVR5cGVDaGVja2VySW1wbCBpbXBsZW1lbnRzIFRlbXBsYXRlVHlwZUNoZWNrZXIge1xuICBwcml2YXRlIHN0YXRlID0gbmV3IE1hcDxBYnNvbHV0ZUZzUGF0aCwgRmlsZVR5cGVDaGVja2luZ0RhdGE+KCk7XG5cbiAgLyoqXG4gICAqIFN0b3JlcyB0aGUgYENvbXBsZXRpb25FbmdpbmVgIHdoaWNoIHBvd2VycyBhdXRvY29tcGxldGlvbiBmb3IgZWFjaCBjb21wb25lbnQgY2xhc3MuXG4gICAqXG4gICAqIE11c3QgYmUgaW52YWxpZGF0ZWQgd2hlbmV2ZXIgdGhlIGNvbXBvbmVudCdzIHRlbXBsYXRlIG9yIHRoZSBgdHMuUHJvZ3JhbWAgY2hhbmdlcy4gSW52YWxpZGF0aW9uXG4gICAqIG9uIHRlbXBsYXRlIGNoYW5nZXMgaXMgcGVyZm9ybWVkIHdpdGhpbiB0aGlzIGBUZW1wbGF0ZVR5cGVDaGVja2VySW1wbGAgaW5zdGFuY2UuIFdoZW4gdGhlXG4gICAqIGB0cy5Qcm9ncmFtYCBjaGFuZ2VzLCB0aGUgYFRlbXBsYXRlVHlwZUNoZWNrZXJJbXBsYCBhcyBhIHdob2xlIGlzIGRlc3Ryb3llZCBhbmQgcmVwbGFjZWQuXG4gICAqL1xuICBwcml2YXRlIGNvbXBsZXRpb25DYWNoZSA9IG5ldyBNYXA8dHMuQ2xhc3NEZWNsYXJhdGlvbiwgQ29tcGxldGlvbkVuZ2luZT4oKTtcbiAgLyoqXG4gICAqIFN0b3JlcyB0aGUgYFN5bWJvbEJ1aWxkZXJgIHdoaWNoIGNyZWF0ZXMgc3ltYm9scyBmb3IgZWFjaCBjb21wb25lbnQgY2xhc3MuXG4gICAqXG4gICAqIE11c3QgYmUgaW52YWxpZGF0ZWQgd2hlbmV2ZXIgdGhlIGNvbXBvbmVudCdzIHRlbXBsYXRlIG9yIHRoZSBgdHMuUHJvZ3JhbWAgY2hhbmdlcy4gSW52YWxpZGF0aW9uXG4gICAqIG9uIHRlbXBsYXRlIGNoYW5nZXMgaXMgcGVyZm9ybWVkIHdpdGhpbiB0aGlzIGBUZW1wbGF0ZVR5cGVDaGVja2VySW1wbGAgaW5zdGFuY2UuIFdoZW4gdGhlXG4gICAqIGB0cy5Qcm9ncmFtYCBjaGFuZ2VzLCB0aGUgYFRlbXBsYXRlVHlwZUNoZWNrZXJJbXBsYCBhcyBhIHdob2xlIGlzIGRlc3Ryb3llZCBhbmQgcmVwbGFjZWQuXG4gICAqL1xuICBwcml2YXRlIHN5bWJvbEJ1aWxkZXJDYWNoZSA9IG5ldyBNYXA8dHMuQ2xhc3NEZWNsYXJhdGlvbiwgU3ltYm9sQnVpbGRlcj4oKTtcblxuICAvKipcbiAgICogU3RvcmVzIGRpcmVjdGl2ZXMgYW5kIHBpcGVzIHRoYXQgYXJlIGluIHNjb3BlIGZvciBlYWNoIGNvbXBvbmVudC5cbiAgICpcbiAgICogVW5saWtlIG90aGVyIGNhY2hlcywgdGhlIHNjb3BlIG9mIGEgY29tcG9uZW50IGlzIG5vdCBhZmZlY3RlZCBieSBpdHMgdGVtcGxhdGUuIEl0IHdpbGwgYmVcbiAgICogZGVzdHJveWVkIHdoZW4gdGhlIGB0cy5Qcm9ncmFtYCBjaGFuZ2VzIGFuZCB0aGUgYFRlbXBsYXRlVHlwZUNoZWNrZXJJbXBsYCBhcyBhIHdob2xlIGlzXG4gICAqIGRlc3Ryb3llZCBhbmQgcmVwbGFjZWQuXG4gICAqL1xuICBwcml2YXRlIHNjb3BlQ2FjaGUgPSBuZXcgTWFwPHRzLkNsYXNzRGVjbGFyYXRpb24sIFNjb3BlRGF0YT4oKTtcblxuICAvKipcbiAgICogU3RvcmVzIHBvdGVudGlhbCBlbGVtZW50IHRhZ3MgZm9yIGVhY2ggY29tcG9uZW50IChhIHVuaW9uIG9mIERPTSB0YWdzIGFzIHdlbGwgYXMgZGlyZWN0aXZlXG4gICAqIHRhZ3MpLlxuICAgKlxuICAgKiBVbmxpa2Ugb3RoZXIgY2FjaGVzLCB0aGUgc2NvcGUgb2YgYSBjb21wb25lbnQgaXMgbm90IGFmZmVjdGVkIGJ5IGl0cyB0ZW1wbGF0ZS4gSXQgd2lsbCBiZVxuICAgKiBkZXN0cm95ZWQgd2hlbiB0aGUgYHRzLlByb2dyYW1gIGNoYW5nZXMgYW5kIHRoZSBgVGVtcGxhdGVUeXBlQ2hlY2tlckltcGxgIGFzIGEgd2hvbGUgaXNcbiAgICogZGVzdHJveWVkIGFuZCByZXBsYWNlZC5cbiAgICovXG4gIHByaXZhdGUgZWxlbWVudFRhZ0NhY2hlID0gbmV3IE1hcDx0cy5DbGFzc0RlY2xhcmF0aW9uLCBNYXA8c3RyaW5nLCBEaXJlY3RpdmVJblNjb3BlfG51bGw+PigpO1xuXG4gIHByaXZhdGUgaXNDb21wbGV0ZSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgcHJpdmF0ZSBvcmlnaW5hbFByb2dyYW06IHRzLlByb2dyYW0sIHJlYWRvbmx5IHByb2dyYW1Ecml2ZXI6IFByb2dyYW1Ecml2ZXIsXG4gICAgICBwcml2YXRlIHR5cGVDaGVja0FkYXB0ZXI6IFByb2dyYW1UeXBlQ2hlY2tBZGFwdGVyLCBwcml2YXRlIGNvbmZpZzogVHlwZUNoZWNraW5nQ29uZmlnLFxuICAgICAgcHJpdmF0ZSByZWZFbWl0dGVyOiBSZWZlcmVuY2VFbWl0dGVyLCBwcml2YXRlIHJlZmxlY3RvcjogUmVmbGVjdGlvbkhvc3QsXG4gICAgICBwcml2YXRlIGNvbXBpbGVySG9zdDogUGljazx0cy5Db21waWxlckhvc3QsICdnZXRDYW5vbmljYWxGaWxlTmFtZSc+LFxuICAgICAgcHJpdmF0ZSBwcmlvckJ1aWxkOiBJbmNyZW1lbnRhbEJ1aWxkPHVua25vd24sIEZpbGVUeXBlQ2hlY2tpbmdEYXRhPixcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgY29tcG9uZW50U2NvcGVSZWFkZXI6IENvbXBvbmVudFNjb3BlUmVhZGVyLFxuICAgICAgcHJpdmF0ZSByZWFkb25seSB0eXBlQ2hlY2tTY29wZVJlZ2lzdHJ5OiBUeXBlQ2hlY2tTY29wZVJlZ2lzdHJ5LFxuICAgICAgcHJpdmF0ZSByZWFkb25seSBwZXJmOiBQZXJmUmVjb3JkZXIpIHt9XG5cbiAgZ2V0VGVtcGxhdGUoY29tcG9uZW50OiB0cy5DbGFzc0RlY2xhcmF0aW9uKTogVG1wbEFzdE5vZGVbXXxudWxsIHtcbiAgICBjb25zdCB7ZGF0YX0gPSB0aGlzLmdldExhdGVzdENvbXBvbmVudFN0YXRlKGNvbXBvbmVudCk7XG4gICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YS50ZW1wbGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGF0ZXN0Q29tcG9uZW50U3RhdGUoY29tcG9uZW50OiB0cy5DbGFzc0RlY2xhcmF0aW9uKTpcbiAgICAgIHtkYXRhOiBUZW1wbGF0ZURhdGF8bnVsbCwgdGNiOiB0cy5Ob2RlfG51bGwsIHNoaW1QYXRoOiBBYnNvbHV0ZUZzUGF0aH0ge1xuICAgIHRoaXMuZW5zdXJlU2hpbUZvckNvbXBvbmVudChjb21wb25lbnQpO1xuXG4gICAgY29uc3Qgc2YgPSBjb21wb25lbnQuZ2V0U291cmNlRmlsZSgpO1xuICAgIGNvbnN0IHNmUGF0aCA9IGFic29sdXRlRnJvbVNvdXJjZUZpbGUoc2YpO1xuICAgIGNvbnN0IHNoaW1QYXRoID0gVHlwZUNoZWNrU2hpbUdlbmVyYXRvci5zaGltRm9yKHNmUGF0aCk7XG5cbiAgICBjb25zdCBmaWxlUmVjb3JkID0gdGhpcy5nZXRGaWxlRGF0YShzZlBhdGgpO1xuXG4gICAgaWYgKCFmaWxlUmVjb3JkLnNoaW1EYXRhLmhhcyhzaGltUGF0aCkpIHtcbiAgICAgIHJldHVybiB7ZGF0YTogbnVsbCwgdGNiOiBudWxsLCBzaGltUGF0aH07XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcGxhdGVJZCA9IGZpbGVSZWNvcmQuc291cmNlTWFuYWdlci5nZXRUZW1wbGF0ZUlkKGNvbXBvbmVudCk7XG4gICAgY29uc3Qgc2hpbVJlY29yZCA9IGZpbGVSZWNvcmQuc2hpbURhdGEuZ2V0KHNoaW1QYXRoKSE7XG4gICAgY29uc3QgaWQgPSBmaWxlUmVjb3JkLnNvdXJjZU1hbmFnZXIuZ2V0VGVtcGxhdGVJZChjb21wb25lbnQpO1xuXG4gICAgY29uc3QgcHJvZ3JhbSA9IHRoaXMucHJvZ3JhbURyaXZlci5nZXRQcm9ncmFtKCk7XG4gICAgY29uc3Qgc2hpbVNmID0gZ2V0U291cmNlRmlsZU9yTnVsbChwcm9ncmFtLCBzaGltUGF0aCk7XG5cbiAgICBpZiAoc2hpbVNmID09PSBudWxsIHx8ICFmaWxlUmVjb3JkLnNoaW1EYXRhLmhhcyhzaGltUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3I6IG5vIHNoaW0gZmlsZSBpbiBwcm9ncmFtOiAke3NoaW1QYXRofWApO1xuICAgIH1cblxuICAgIGxldCB0Y2I6IHRzLk5vZGV8bnVsbCA9IGZpbmRUeXBlQ2hlY2tCbG9jayhzaGltU2YsIGlkLCAvKmlzRGlhZ25vc3RpY3NSZXF1ZXN0Ki8gZmFsc2UpO1xuXG4gICAgaWYgKHRjYiA9PT0gbnVsbCkge1xuICAgICAgLy8gVHJ5IGZvciBhbiBpbmxpbmUgYmxvY2suXG4gICAgICBjb25zdCBpbmxpbmVTZiA9IGdldFNvdXJjZUZpbGVPckVycm9yKHByb2dyYW0sIHNmUGF0aCk7XG4gICAgICB0Y2IgPSBmaW5kVHlwZUNoZWNrQmxvY2soaW5saW5lU2YsIGlkLCAvKmlzRGlhZ25vc3RpY3NSZXF1ZXN0Ki8gZmFsc2UpO1xuICAgIH1cblxuICAgIGxldCBkYXRhOiBUZW1wbGF0ZURhdGF8bnVsbCA9IG51bGw7XG4gICAgaWYgKHNoaW1SZWNvcmQudGVtcGxhdGVzLmhhcyh0ZW1wbGF0ZUlkKSkge1xuICAgICAgZGF0YSA9IHNoaW1SZWNvcmQudGVtcGxhdGVzLmdldCh0ZW1wbGF0ZUlkKSE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtkYXRhLCB0Y2IsIHNoaW1QYXRofTtcbiAgfVxuXG4gIGlzVHJhY2tlZFR5cGVDaGVja0ZpbGUoZmlsZVBhdGg6IEFic29sdXRlRnNQYXRoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RmlsZUFuZFNoaW1SZWNvcmRzRm9yUGF0aChmaWxlUGF0aCkgIT09IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldEZpbGVBbmRTaGltUmVjb3Jkc0ZvclBhdGgoc2hpbVBhdGg6IEFic29sdXRlRnNQYXRoKTpcbiAgICAgIHtmaWxlUmVjb3JkOiBGaWxlVHlwZUNoZWNraW5nRGF0YSwgc2hpbVJlY29yZDogU2hpbVR5cGVDaGVja2luZ0RhdGF9fG51bGwge1xuICAgIGZvciAoY29uc3QgZmlsZVJlY29yZCBvZiB0aGlzLnN0YXRlLnZhbHVlcygpKSB7XG4gICAgICBpZiAoZmlsZVJlY29yZC5zaGltRGF0YS5oYXMoc2hpbVBhdGgpKSB7XG4gICAgICAgIHJldHVybiB7ZmlsZVJlY29yZCwgc2hpbVJlY29yZDogZmlsZVJlY29yZC5zaGltRGF0YS5nZXQoc2hpbVBhdGgpIX07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0VGVtcGxhdGVNYXBwaW5nQXRTaGltTG9jYXRpb24oe3NoaW1QYXRoLCBwb3NpdGlvbkluU2hpbUZpbGV9OiBTaGltTG9jYXRpb24pOlxuICAgICAgRnVsbFRlbXBsYXRlTWFwcGluZ3xudWxsIHtcbiAgICBjb25zdCByZWNvcmRzID0gdGhpcy5nZXRGaWxlQW5kU2hpbVJlY29yZHNGb3JQYXRoKGFic29sdXRlRnJvbShzaGltUGF0aCkpO1xuICAgIGlmIChyZWNvcmRzID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qge2ZpbGVSZWNvcmR9ID0gcmVjb3JkcztcblxuICAgIGNvbnN0IHNoaW1TZiA9IHRoaXMucHJvZ3JhbURyaXZlci5nZXRQcm9ncmFtKCkuZ2V0U291cmNlRmlsZShhYnNvbHV0ZUZyb20oc2hpbVBhdGgpKTtcbiAgICBpZiAoc2hpbVNmID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0VGVtcGxhdGVNYXBwaW5nKFxuICAgICAgICBzaGltU2YsIHBvc2l0aW9uSW5TaGltRmlsZSwgZmlsZVJlY29yZC5zb3VyY2VNYW5hZ2VyLCAvKmlzRGlhZ25vc3RpY3NSZXF1ZXN0Ki8gZmFsc2UpO1xuICB9XG5cbiAgZ2VuZXJhdGVBbGxUeXBlQ2hlY2tCbG9ja3MoKSB7XG4gICAgdGhpcy5lbnN1cmVBbGxTaGltc0ZvckFsbEZpbGVzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdHlwZS1jaGVja2luZyBhbmQgdGVtcGxhdGUgcGFyc2UgZGlhZ25vc3RpY3MgZnJvbSB0aGUgZ2l2ZW4gYHRzLlNvdXJjZUZpbGVgIHVzaW5nIHRoZVxuICAgKiBtb3N0IHJlY2VudCB0eXBlLWNoZWNraW5nIHByb2dyYW0uXG4gICAqL1xuICBnZXREaWFnbm9zdGljc0ZvckZpbGUoc2Y6IHRzLlNvdXJjZUZpbGUsIG9wdGltaXplRm9yOiBPcHRpbWl6ZUZvcik6IHRzLkRpYWdub3N0aWNbXSB7XG4gICAgc3dpdGNoIChvcHRpbWl6ZUZvcikge1xuICAgICAgY2FzZSBPcHRpbWl6ZUZvci5XaG9sZVByb2dyYW06XG4gICAgICAgIHRoaXMuZW5zdXJlQWxsU2hpbXNGb3JBbGxGaWxlcygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgT3B0aW1pemVGb3IuU2luZ2xlRmlsZTpcbiAgICAgICAgdGhpcy5lbnN1cmVBbGxTaGltc0Zvck9uZUZpbGUoc2YpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wZXJmLmluUGhhc2UoUGVyZlBoYXNlLlR0Y0RpYWdub3N0aWNzLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZlBhdGggPSBhYnNvbHV0ZUZyb21Tb3VyY2VGaWxlKHNmKTtcbiAgICAgIGNvbnN0IGZpbGVSZWNvcmQgPSB0aGlzLnN0YXRlLmdldChzZlBhdGgpITtcblxuICAgICAgY29uc3QgdHlwZUNoZWNrUHJvZ3JhbSA9IHRoaXMucHJvZ3JhbURyaXZlci5nZXRQcm9ncmFtKCk7XG5cbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzOiAodHMuRGlhZ25vc3RpY3xudWxsKVtdID0gW107XG4gICAgICBpZiAoZmlsZVJlY29yZC5oYXNJbmxpbmVzKSB7XG4gICAgICAgIGNvbnN0IGlubGluZVNmID0gZ2V0U291cmNlRmlsZU9yRXJyb3IodHlwZUNoZWNrUHJvZ3JhbSwgc2ZQYXRoKTtcbiAgICAgICAgZGlhZ25vc3RpY3MucHVzaCguLi50eXBlQ2hlY2tQcm9ncmFtLmdldFNlbWFudGljRGlhZ25vc3RpY3MoaW5saW5lU2YpLm1hcChcbiAgICAgICAgICAgIGRpYWcgPT4gY29udmVydERpYWdub3N0aWMoZGlhZywgZmlsZVJlY29yZC5zb3VyY2VNYW5hZ2VyKSkpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IFtzaGltUGF0aCwgc2hpbVJlY29yZF0gb2YgZmlsZVJlY29yZC5zaGltRGF0YSkge1xuICAgICAgICBjb25zdCBzaGltU2YgPSBnZXRTb3VyY2VGaWxlT3JFcnJvcih0eXBlQ2hlY2tQcm9ncmFtLCBzaGltUGF0aCk7XG4gICAgICAgIGRpYWdub3N0aWNzLnB1c2goLi4udHlwZUNoZWNrUHJvZ3JhbS5nZXRTZW1hbnRpY0RpYWdub3N0aWNzKHNoaW1TZikubWFwKFxuICAgICAgICAgICAgZGlhZyA9PiBjb252ZXJ0RGlhZ25vc3RpYyhkaWFnLCBmaWxlUmVjb3JkLnNvdXJjZU1hbmFnZXIpKSk7XG4gICAgICAgIGRpYWdub3N0aWNzLnB1c2goLi4uc2hpbVJlY29yZC5nZW5lc2lzRGlhZ25vc3RpY3MpO1xuXG4gICAgICAgIGZvciAoY29uc3QgdGVtcGxhdGVEYXRhIG9mIHNoaW1SZWNvcmQudGVtcGxhdGVzLnZhbHVlcygpKSB7XG4gICAgICAgICAgZGlhZ25vc3RpY3MucHVzaCguLi50ZW1wbGF0ZURhdGEudGVtcGxhdGVEaWFnbm9zdGljcyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRpYWdub3N0aWNzLmZpbHRlcigoZGlhZzogdHMuRGlhZ25vc3RpY3xudWxsKTogZGlhZyBpcyB0cy5EaWFnbm9zdGljID0+IGRpYWcgIT09IG51bGwpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0RGlhZ25vc3RpY3NGb3JDb21wb25lbnQoY29tcG9uZW50OiB0cy5DbGFzc0RlY2xhcmF0aW9uKTogdHMuRGlhZ25vc3RpY1tdIHtcbiAgICB0aGlzLmVuc3VyZVNoaW1Gb3JDb21wb25lbnQoY29tcG9uZW50KTtcblxuICAgIHJldHVybiB0aGlzLnBlcmYuaW5QaGFzZShQZXJmUGhhc2UuVHRjRGlhZ25vc3RpY3MsICgpID0+IHtcbiAgICAgIGNvbnN0IHNmID0gY29tcG9uZW50LmdldFNvdXJjZUZpbGUoKTtcbiAgICAgIGNvbnN0IHNmUGF0aCA9IGFic29sdXRlRnJvbVNvdXJjZUZpbGUoc2YpO1xuICAgICAgY29uc3Qgc2hpbVBhdGggPSBUeXBlQ2hlY2tTaGltR2VuZXJhdG9yLnNoaW1Gb3Ioc2ZQYXRoKTtcblxuICAgICAgY29uc3QgZmlsZVJlY29yZCA9IHRoaXMuZ2V0RmlsZURhdGEoc2ZQYXRoKTtcblxuICAgICAgaWYgKCFmaWxlUmVjb3JkLnNoaW1EYXRhLmhhcyhzaGltUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0ZW1wbGF0ZUlkID0gZmlsZVJlY29yZC5zb3VyY2VNYW5hZ2VyLmdldFRlbXBsYXRlSWQoY29tcG9uZW50KTtcbiAgICAgIGNvbnN0IHNoaW1SZWNvcmQgPSBmaWxlUmVjb3JkLnNoaW1EYXRhLmdldChzaGltUGF0aCkhO1xuXG4gICAgICBjb25zdCB0eXBlQ2hlY2tQcm9ncmFtID0gdGhpcy5wcm9ncmFtRHJpdmVyLmdldFByb2dyYW0oKTtcblxuICAgICAgY29uc3QgZGlhZ25vc3RpY3M6IChUZW1wbGF0ZURpYWdub3N0aWN8bnVsbClbXSA9IFtdO1xuICAgICAgaWYgKHNoaW1SZWNvcmQuaGFzSW5saW5lcykge1xuICAgICAgICBjb25zdCBpbmxpbmVTZiA9IGdldFNvdXJjZUZpbGVPckVycm9yKHR5cGVDaGVja1Byb2dyYW0sIHNmUGF0aCk7XG4gICAgICAgIGRpYWdub3N0aWNzLnB1c2goLi4udHlwZUNoZWNrUHJvZ3JhbS5nZXRTZW1hbnRpY0RpYWdub3N0aWNzKGlubGluZVNmKS5tYXAoXG4gICAgICAgICAgICBkaWFnID0+IGNvbnZlcnREaWFnbm9zdGljKGRpYWcsIGZpbGVSZWNvcmQuc291cmNlTWFuYWdlcikpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2hpbVNmID0gZ2V0U291cmNlRmlsZU9yRXJyb3IodHlwZUNoZWNrUHJvZ3JhbSwgc2hpbVBhdGgpO1xuICAgICAgZGlhZ25vc3RpY3MucHVzaCguLi50eXBlQ2hlY2tQcm9ncmFtLmdldFNlbWFudGljRGlhZ25vc3RpY3Moc2hpbVNmKS5tYXAoXG4gICAgICAgICAgZGlhZyA9PiBjb252ZXJ0RGlhZ25vc3RpYyhkaWFnLCBmaWxlUmVjb3JkLnNvdXJjZU1hbmFnZXIpKSk7XG4gICAgICBkaWFnbm9zdGljcy5wdXNoKC4uLnNoaW1SZWNvcmQuZ2VuZXNpc0RpYWdub3N0aWNzKTtcblxuICAgICAgZm9yIChjb25zdCB0ZW1wbGF0ZURhdGEgb2Ygc2hpbVJlY29yZC50ZW1wbGF0ZXMudmFsdWVzKCkpIHtcbiAgICAgICAgZGlhZ25vc3RpY3MucHVzaCguLi50ZW1wbGF0ZURhdGEudGVtcGxhdGVEaWFnbm9zdGljcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkaWFnbm9zdGljcy5maWx0ZXIoXG4gICAgICAgICAgKGRpYWc6IFRlbXBsYXRlRGlhZ25vc3RpY3xudWxsKTogZGlhZyBpcyBUZW1wbGF0ZURpYWdub3N0aWMgPT5cbiAgICAgICAgICAgICAgZGlhZyAhPT0gbnVsbCAmJiBkaWFnLnRlbXBsYXRlSWQgPT09IHRlbXBsYXRlSWQpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0VHlwZUNoZWNrQmxvY2soY29tcG9uZW50OiB0cy5DbGFzc0RlY2xhcmF0aW9uKTogdHMuTm9kZXxudWxsIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMYXRlc3RDb21wb25lbnRTdGF0ZShjb21wb25lbnQpLnRjYjtcbiAgfVxuXG4gIGdldEdsb2JhbENvbXBsZXRpb25zKFxuICAgICAgY29udGV4dDogVG1wbEFzdFRlbXBsYXRlfG51bGwsIGNvbXBvbmVudDogdHMuQ2xhc3NEZWNsYXJhdGlvbixcbiAgICAgIG5vZGU6IEFTVHxUbXBsQXN0Tm9kZSk6IEdsb2JhbENvbXBsZXRpb258bnVsbCB7XG4gICAgY29uc3QgZW5naW5lID0gdGhpcy5nZXRPckNyZWF0ZUNvbXBsZXRpb25FbmdpbmUoY29tcG9uZW50KTtcbiAgICBpZiAoZW5naW5lID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGVyZi5pblBoYXNlKFxuICAgICAgICBQZXJmUGhhc2UuVHRjQXV0b2NvbXBsZXRpb24sICgpID0+IGVuZ2luZS5nZXRHbG9iYWxDb21wbGV0aW9ucyhjb250ZXh0LCBub2RlKSk7XG4gIH1cblxuICBnZXRFeHByZXNzaW9uQ29tcGxldGlvbkxvY2F0aW9uKFxuICAgICAgYXN0OiBQcm9wZXJ0eVJlYWR8U2FmZVByb3BlcnR5UmVhZCwgY29tcG9uZW50OiB0cy5DbGFzc0RlY2xhcmF0aW9uKTogU2hpbUxvY2F0aW9ufG51bGwge1xuICAgIGNvbnN0IGVuZ2luZSA9IHRoaXMuZ2V0T3JDcmVhdGVDb21wbGV0aW9uRW5naW5lKGNvbXBvbmVudCk7XG4gICAgaWYgKGVuZ2luZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBlcmYuaW5QaGFzZShcbiAgICAgICAgUGVyZlBoYXNlLlR0Y0F1dG9jb21wbGV0aW9uLCAoKSA9PiBlbmdpbmUuZ2V0RXhwcmVzc2lvbkNvbXBsZXRpb25Mb2NhdGlvbihhc3QpKTtcbiAgfVxuXG4gIGdldExpdGVyYWxDb21wbGV0aW9uTG9jYXRpb24oXG4gICAgICBub2RlOiBMaXRlcmFsUHJpbWl0aXZlfFRleHRBdHRyaWJ1dGUsIGNvbXBvbmVudDogdHMuQ2xhc3NEZWNsYXJhdGlvbik6IFNoaW1Mb2NhdGlvbnxudWxsIHtcbiAgICBjb25zdCBlbmdpbmUgPSB0aGlzLmdldE9yQ3JlYXRlQ29tcGxldGlvbkVuZ2luZShjb21wb25lbnQpO1xuICAgIGlmIChlbmdpbmUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wZXJmLmluUGhhc2UoXG4gICAgICAgIFBlcmZQaGFzZS5UdGNBdXRvY29tcGxldGlvbiwgKCkgPT4gZW5naW5lLmdldExpdGVyYWxDb21wbGV0aW9uTG9jYXRpb24obm9kZSkpO1xuICB9XG5cbiAgaW52YWxpZGF0ZUNsYXNzKGNsYXp6OiB0cy5DbGFzc0RlY2xhcmF0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5jb21wbGV0aW9uQ2FjaGUuZGVsZXRlKGNsYXp6KTtcbiAgICB0aGlzLnN5bWJvbEJ1aWxkZXJDYWNoZS5kZWxldGUoY2xhenopO1xuICAgIHRoaXMuc2NvcGVDYWNoZS5kZWxldGUoY2xhenopO1xuICAgIHRoaXMuZWxlbWVudFRhZ0NhY2hlLmRlbGV0ZShjbGF6eik7XG5cbiAgICBjb25zdCBzZiA9IGNsYXp6LmdldFNvdXJjZUZpbGUoKTtcbiAgICBjb25zdCBzZlBhdGggPSBhYnNvbHV0ZUZyb21Tb3VyY2VGaWxlKHNmKTtcbiAgICBjb25zdCBzaGltUGF0aCA9IFR5cGVDaGVja1NoaW1HZW5lcmF0b3Iuc2hpbUZvcihzZlBhdGgpO1xuICAgIGNvbnN0IGZpbGVEYXRhID0gdGhpcy5nZXRGaWxlRGF0YShzZlBhdGgpO1xuICAgIGNvbnN0IHRlbXBsYXRlSWQgPSBmaWxlRGF0YS5zb3VyY2VNYW5hZ2VyLmdldFRlbXBsYXRlSWQoY2xhenopO1xuXG4gICAgZmlsZURhdGEuc2hpbURhdGEuZGVsZXRlKHNoaW1QYXRoKTtcbiAgICBmaWxlRGF0YS5pc0NvbXBsZXRlID0gZmFsc2U7XG5cbiAgICB0aGlzLmlzQ29tcGxldGUgPSBmYWxzZTtcbiAgfVxuXG4gIG1ha2VUZW1wbGF0ZURpYWdub3N0aWM8VCBleHRlbmRzIEVycm9yQ29kZT4oXG4gICAgICBjbGF6ejogdHMuQ2xhc3NEZWNsYXJhdGlvbiwgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLCBjYXRlZ29yeTogdHMuRGlhZ25vc3RpY0NhdGVnb3J5LFxuICAgICAgZXJyb3JDb2RlOiBULCBtZXNzYWdlOiBzdHJpbmcsIHJlbGF0ZWRJbmZvcm1hdGlvbj86IHtcbiAgICAgICAgdGV4dDogc3RyaW5nLFxuICAgICAgICBzdGFydDogbnVtYmVyLFxuICAgICAgICBlbmQ6IG51bWJlcixcbiAgICAgICAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSxcbiAgICAgIH1bXSk6IE5nVGVtcGxhdGVEaWFnbm9zdGljPFQ+IHtcbiAgICBjb25zdCBzZlBhdGggPSBhYnNvbHV0ZUZyb21Tb3VyY2VGaWxlKGNsYXp6LmdldFNvdXJjZUZpbGUoKSk7XG4gICAgY29uc3QgZmlsZVJlY29yZCA9IHRoaXMuc3RhdGUuZ2V0KHNmUGF0aCkhO1xuICAgIGNvbnN0IHRlbXBsYXRlSWQgPSBmaWxlUmVjb3JkLnNvdXJjZU1hbmFnZXIuZ2V0VGVtcGxhdGVJZChjbGF6eik7XG4gICAgY29uc3QgbWFwcGluZyA9IGZpbGVSZWNvcmQuc291cmNlTWFuYWdlci5nZXRTb3VyY2VNYXBwaW5nKHRlbXBsYXRlSWQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1ha2VUZW1wbGF0ZURpYWdub3N0aWMoXG4gICAgICAgICAgdGVtcGxhdGVJZCwgbWFwcGluZywgc291cmNlU3BhbiwgY2F0ZWdvcnksIG5nRXJyb3JDb2RlKGVycm9yQ29kZSksIG1lc3NhZ2UsXG4gICAgICAgICAgcmVsYXRlZEluZm9ybWF0aW9uKSxcbiAgICAgIF9fbmdDb2RlOiBlcnJvckNvZGVcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPckNyZWF0ZUNvbXBsZXRpb25FbmdpbmUoY29tcG9uZW50OiB0cy5DbGFzc0RlY2xhcmF0aW9uKTogQ29tcGxldGlvbkVuZ2luZXxudWxsIHtcbiAgICBpZiAodGhpcy5jb21wbGV0aW9uQ2FjaGUuaGFzKGNvbXBvbmVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRpb25DYWNoZS5nZXQoY29tcG9uZW50KSE7XG4gICAgfVxuXG4gICAgY29uc3Qge3RjYiwgZGF0YSwgc2hpbVBhdGh9ID0gdGhpcy5nZXRMYXRlc3RDb21wb25lbnRTdGF0ZShjb21wb25lbnQpO1xuICAgIGlmICh0Y2IgPT09IG51bGwgfHwgZGF0YSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZW5naW5lID0gbmV3IENvbXBsZXRpb25FbmdpbmUodGNiLCBkYXRhLCBzaGltUGF0aCk7XG4gICAgdGhpcy5jb21wbGV0aW9uQ2FjaGUuc2V0KGNvbXBvbmVudCwgZW5naW5lKTtcbiAgICByZXR1cm4gZW5naW5lO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXliZUFkb3B0UHJpb3JSZXN1bHRzRm9yRmlsZShzZjogdHMuU291cmNlRmlsZSk6IHZvaWQge1xuICAgIGNvbnN0IHNmUGF0aCA9IGFic29sdXRlRnJvbVNvdXJjZUZpbGUoc2YpO1xuICAgIGlmICh0aGlzLnN0YXRlLmhhcyhzZlBhdGgpKSB7XG4gICAgICBjb25zdCBleGlzdGluZ1Jlc3VsdHMgPSB0aGlzLnN0YXRlLmdldChzZlBhdGgpITtcblxuICAgICAgaWYgKGV4aXN0aW5nUmVzdWx0cy5pc0NvbXBsZXRlKSB7XG4gICAgICAgIC8vIEFsbCBkYXRhIGZvciB0aGlzIGZpbGUgaGFzIGFscmVhZHkgYmVlbiBnZW5lcmF0ZWQsIHNvIG5vIG5lZWQgdG8gYWRvcHQgYW55dGhpbmcuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwcmV2aW91c1Jlc3VsdHMgPSB0aGlzLnByaW9yQnVpbGQucHJpb3JUeXBlQ2hlY2tpbmdSZXN1bHRzRm9yKHNmKTtcbiAgICBpZiAocHJldmlvdXNSZXN1bHRzID09PSBudWxsIHx8ICFwcmV2aW91c1Jlc3VsdHMuaXNDb21wbGV0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucGVyZi5ldmVudENvdW50KFBlcmZFdmVudC5SZXVzZVR5cGVDaGVja0ZpbGUpO1xuICAgIHRoaXMuc3RhdGUuc2V0KHNmUGF0aCwgcHJldmlvdXNSZXN1bHRzKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlQWxsU2hpbXNGb3JBbGxGaWxlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0NvbXBsZXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wZXJmLmluUGhhc2UoUGVyZlBoYXNlLlRjYkdlbmVyYXRpb24sICgpID0+IHtcbiAgICAgIGNvbnN0IGhvc3QgPSBuZXcgV2hvbGVQcm9ncmFtVHlwZUNoZWNraW5nSG9zdCh0aGlzKTtcbiAgICAgIGNvbnN0IGN0eCA9IHRoaXMubmV3Q29udGV4dChob3N0KTtcblxuICAgICAgZm9yIChjb25zdCBzZiBvZiB0aGlzLm9yaWdpbmFsUHJvZ3JhbS5nZXRTb3VyY2VGaWxlcygpKSB7XG4gICAgICAgIGlmIChzZi5pc0RlY2xhcmF0aW9uRmlsZSB8fCBpc1NoaW0oc2YpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1heWJlQWRvcHRQcmlvclJlc3VsdHNGb3JGaWxlKHNmKTtcblxuICAgICAgICBjb25zdCBzZlBhdGggPSBhYnNvbHV0ZUZyb21Tb3VyY2VGaWxlKHNmKTtcbiAgICAgICAgY29uc3QgZmlsZURhdGEgPSB0aGlzLmdldEZpbGVEYXRhKHNmUGF0aCk7XG4gICAgICAgIGlmIChmaWxlRGF0YS5pc0NvbXBsZXRlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnR5cGVDaGVja0FkYXB0ZXIudHlwZUNoZWNrKHNmLCBjdHgpO1xuXG4gICAgICAgIGZpbGVEYXRhLmlzQ29tcGxldGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnVwZGF0ZUZyb21Db250ZXh0KGN0eCk7XG4gICAgICB0aGlzLmlzQ29tcGxldGUgPSB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVBbGxTaGltc0Zvck9uZUZpbGUoc2Y6IHRzLlNvdXJjZUZpbGUpOiB2b2lkIHtcbiAgICB0aGlzLnBlcmYuaW5QaGFzZShQZXJmUGhhc2UuVGNiR2VuZXJhdGlvbiwgKCkgPT4ge1xuICAgICAgdGhpcy5tYXliZUFkb3B0UHJpb3JSZXN1bHRzRm9yRmlsZShzZik7XG5cbiAgICAgIGNvbnN0IHNmUGF0aCA9IGFic29sdXRlRnJvbVNvdXJjZUZpbGUoc2YpO1xuXG4gICAgICBjb25zdCBmaWxlRGF0YSA9IHRoaXMuZ2V0RmlsZURhdGEoc2ZQYXRoKTtcbiAgICAgIGlmIChmaWxlRGF0YS5pc0NvbXBsZXRlKSB7XG4gICAgICAgIC8vIEFsbCBkYXRhIGZvciB0aGlzIGZpbGUgaXMgcHJlc2VudCBhbmQgYWNjb3VudGVkIGZvciBhbHJlYWR5LlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhvc3QgPSBuZXcgU2luZ2xlRmlsZVR5cGVDaGVja2luZ0hvc3Qoc2ZQYXRoLCBmaWxlRGF0YSwgdGhpcyk7XG4gICAgICBjb25zdCBjdHggPSB0aGlzLm5ld0NvbnRleHQoaG9zdCk7XG5cbiAgICAgIHRoaXMudHlwZUNoZWNrQWRhcHRlci50eXBlQ2hlY2soc2YsIGN0eCk7XG5cbiAgICAgIGZpbGVEYXRhLmlzQ29tcGxldGUgPSB0cnVlO1xuXG4gICAgICB0aGlzLnVwZGF0ZUZyb21Db250ZXh0KGN0eCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVNoaW1Gb3JDb21wb25lbnQoY29tcG9uZW50OiB0cy5DbGFzc0RlY2xhcmF0aW9uKTogdm9pZCB7XG4gICAgY29uc3Qgc2YgPSBjb21wb25lbnQuZ2V0U291cmNlRmlsZSgpO1xuICAgIGNvbnN0IHNmUGF0aCA9IGFic29sdXRlRnJvbVNvdXJjZUZpbGUoc2YpO1xuICAgIGNvbnN0IHNoaW1QYXRoID0gVHlwZUNoZWNrU2hpbUdlbmVyYXRvci5zaGltRm9yKHNmUGF0aCk7XG5cbiAgICB0aGlzLm1heWJlQWRvcHRQcmlvclJlc3VsdHNGb3JGaWxlKHNmKTtcblxuICAgIGNvbnN0IGZpbGVEYXRhID0gdGhpcy5nZXRGaWxlRGF0YShzZlBhdGgpO1xuXG4gICAgaWYgKGZpbGVEYXRhLnNoaW1EYXRhLmhhcyhzaGltUGF0aCkpIHtcbiAgICAgIC8vIEFsbCBkYXRhIGZvciB0aGlzIGNvbXBvbmVudCBpcyBhdmFpbGFibGUuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaG9zdCA9IG5ldyBTaW5nbGVTaGltVHlwZUNoZWNraW5nSG9zdChzZlBhdGgsIGZpbGVEYXRhLCB0aGlzLCBzaGltUGF0aCk7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5uZXdDb250ZXh0KGhvc3QpO1xuXG4gICAgdGhpcy50eXBlQ2hlY2tBZGFwdGVyLnR5cGVDaGVjayhzZiwgY3R4KTtcbiAgICB0aGlzLnVwZGF0ZUZyb21Db250ZXh0KGN0eCk7XG4gIH1cblxuICBwcml2YXRlIG5ld0NvbnRleHQoaG9zdDogVHlwZUNoZWNraW5nSG9zdCk6IFR5cGVDaGVja0NvbnRleHRJbXBsIHtcbiAgICBjb25zdCBpbmxpbmluZyA9XG4gICAgICAgIHRoaXMucHJvZ3JhbURyaXZlci5zdXBwb3J0c0lubGluZU9wZXJhdGlvbnMgPyBJbmxpbmluZ01vZGUuSW5saW5lT3BzIDogSW5saW5pbmdNb2RlLkVycm9yO1xuICAgIHJldHVybiBuZXcgVHlwZUNoZWNrQ29udGV4dEltcGwoXG4gICAgICAgIHRoaXMuY29uZmlnLCB0aGlzLmNvbXBpbGVySG9zdCwgdGhpcy5yZWZFbWl0dGVyLCB0aGlzLnJlZmxlY3RvciwgaG9zdCwgaW5saW5pbmcsIHRoaXMucGVyZik7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFueSBzaGltIGRhdGEgdGhhdCBkZXBlbmRzIG9uIGlubGluZSBvcGVyYXRpb25zIGFwcGxpZWQgdG8gdGhlIHR5cGUtY2hlY2tpbmcgcHJvZ3JhbS5cbiAgICpcbiAgICogVGhpcyBjYW4gYmUgdXNlZnVsIGlmIG5ldyBpbmxpbmVzIG5lZWQgdG8gYmUgYXBwbGllZCwgYW5kIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGd1YXJhbnRlZSB0aGF0XG4gICAqIHRoZXkgd29uJ3Qgb3ZlcndyaXRlIG9yIGNvcnJ1cHQgZXhpc3RpbmcgaW5saW5lcyB0aGF0IGFyZSB1c2VkIGJ5IHN1Y2ggc2hpbXMuXG4gICAqL1xuICBjbGVhckFsbFNoaW1EYXRhVXNpbmdJbmxpbmVzKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZmlsZURhdGEgb2YgdGhpcy5zdGF0ZS52YWx1ZXMoKSkge1xuICAgICAgaWYgKCFmaWxlRGF0YS5oYXNJbmxpbmVzKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IFtzaGltRmlsZSwgc2hpbURhdGFdIG9mIGZpbGVEYXRhLnNoaW1EYXRhLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAoc2hpbURhdGEuaGFzSW5saW5lcykge1xuICAgICAgICAgIGZpbGVEYXRhLnNoaW1EYXRhLmRlbGV0ZShzaGltRmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZmlsZURhdGEuaGFzSW5saW5lcyA9IGZhbHNlO1xuICAgICAgZmlsZURhdGEuaXNDb21wbGV0ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5pc0NvbXBsZXRlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGcm9tQ29udGV4dChjdHg6IFR5cGVDaGVja0NvbnRleHRJbXBsKTogdm9pZCB7XG4gICAgY29uc3QgdXBkYXRlcyA9IGN0eC5maW5hbGl6ZSgpO1xuICAgIHJldHVybiB0aGlzLnBlcmYuaW5QaGFzZShQZXJmUGhhc2UuVGNiVXBkYXRlUHJvZ3JhbSwgKCkgPT4ge1xuICAgICAgaWYgKHVwZGF0ZXMuc2l6ZSA+IDApIHtcbiAgICAgICAgdGhpcy5wZXJmLmV2ZW50Q291bnQoUGVyZkV2ZW50LlVwZGF0ZVR5cGVDaGVja1Byb2dyYW0pO1xuICAgICAgfVxuICAgICAgdGhpcy5wcm9ncmFtRHJpdmVyLnVwZGF0ZUZpbGVzKHVwZGF0ZXMsIFVwZGF0ZU1vZGUuSW5jcmVtZW50YWwpO1xuICAgICAgdGhpcy5wcmlvckJ1aWxkLnJlY29yZFN1Y2Nlc3NmdWxUeXBlQ2hlY2sodGhpcy5zdGF0ZSk7XG4gICAgICB0aGlzLnBlcmYubWVtb3J5KFBlcmZDaGVja3BvaW50LlR0Y1VwZGF0ZVByb2dyYW0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0RmlsZURhdGEocGF0aDogQWJzb2x1dGVGc1BhdGgpOiBGaWxlVHlwZUNoZWNraW5nRGF0YSB7XG4gICAgaWYgKCF0aGlzLnN0YXRlLmhhcyhwYXRoKSkge1xuICAgICAgdGhpcy5zdGF0ZS5zZXQocGF0aCwge1xuICAgICAgICBoYXNJbmxpbmVzOiBmYWxzZSxcbiAgICAgICAgc291cmNlTWFuYWdlcjogbmV3IFRlbXBsYXRlU291cmNlTWFuYWdlcigpLFxuICAgICAgICBpc0NvbXBsZXRlOiBmYWxzZSxcbiAgICAgICAgc2hpbURhdGE6IG5ldyBNYXAoKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5nZXQocGF0aCkhO1xuICB9XG4gIGdldFN5bWJvbE9mTm9kZShub2RlOiBUbXBsQXN0VGVtcGxhdGUsIGNvbXBvbmVudDogdHMuQ2xhc3NEZWNsYXJhdGlvbik6IFRlbXBsYXRlU3ltYm9sfG51bGw7XG4gIGdldFN5bWJvbE9mTm9kZShub2RlOiBUbXBsQXN0RWxlbWVudCwgY29tcG9uZW50OiB0cy5DbGFzc0RlY2xhcmF0aW9uKTogRWxlbWVudFN5bWJvbHxudWxsO1xuICBnZXRTeW1ib2xPZk5vZGUobm9kZTogQVNUfFRtcGxBc3ROb2RlLCBjb21wb25lbnQ6IHRzLkNsYXNzRGVjbGFyYXRpb24pOiBTeW1ib2x8bnVsbCB7XG4gICAgY29uc3QgYnVpbGRlciA9IHRoaXMuZ2V0T3JDcmVhdGVTeW1ib2xCdWlsZGVyKGNvbXBvbmVudCk7XG4gICAgaWYgKGJ1aWxkZXIgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wZXJmLmluUGhhc2UoUGVyZlBoYXNlLlR0Y1N5bWJvbCwgKCkgPT4gYnVpbGRlci5nZXRTeW1ib2wobm9kZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPckNyZWF0ZVN5bWJvbEJ1aWxkZXIoY29tcG9uZW50OiB0cy5DbGFzc0RlY2xhcmF0aW9uKTogU3ltYm9sQnVpbGRlcnxudWxsIHtcbiAgICBpZiAodGhpcy5zeW1ib2xCdWlsZGVyQ2FjaGUuaGFzKGNvbXBvbmVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnN5bWJvbEJ1aWxkZXJDYWNoZS5nZXQoY29tcG9uZW50KSE7XG4gICAgfVxuXG4gICAgY29uc3Qge3RjYiwgZGF0YSwgc2hpbVBhdGh9ID0gdGhpcy5nZXRMYXRlc3RDb21wb25lbnRTdGF0ZShjb21wb25lbnQpO1xuICAgIGlmICh0Y2IgPT09IG51bGwgfHwgZGF0YSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyBTeW1ib2xCdWlsZGVyKFxuICAgICAgICBzaGltUGF0aCwgdGNiLCBkYXRhLCB0aGlzLmNvbXBvbmVudFNjb3BlUmVhZGVyLFxuICAgICAgICAoKSA9PiB0aGlzLnByb2dyYW1Ecml2ZXIuZ2V0UHJvZ3JhbSgpLmdldFR5cGVDaGVja2VyKCkpO1xuICAgIHRoaXMuc3ltYm9sQnVpbGRlckNhY2hlLnNldChjb21wb25lbnQsIGJ1aWxkZXIpO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9XG5cbiAgZ2V0RGlyZWN0aXZlc0luU2NvcGUoY29tcG9uZW50OiB0cy5DbGFzc0RlY2xhcmF0aW9uKTogRGlyZWN0aXZlSW5TY29wZVtdfG51bGwge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldFNjb3BlRGF0YShjb21wb25lbnQpO1xuICAgIGlmIChkYXRhID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGEuZGlyZWN0aXZlcztcbiAgfVxuXG4gIGdldFBpcGVzSW5TY29wZShjb21wb25lbnQ6IHRzLkNsYXNzRGVjbGFyYXRpb24pOiBQaXBlSW5TY29wZVtdfG51bGwge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldFNjb3BlRGF0YShjb21wb25lbnQpO1xuICAgIGlmIChkYXRhID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGEucGlwZXM7XG4gIH1cblxuICBnZXREaXJlY3RpdmVNZXRhZGF0YShkaXI6IHRzLkNsYXNzRGVjbGFyYXRpb24pOiBUeXBlQ2hlY2thYmxlRGlyZWN0aXZlTWV0YXxudWxsIHtcbiAgICBpZiAoIWlzTmFtZWRDbGFzc0RlY2xhcmF0aW9uKGRpcikpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50eXBlQ2hlY2tTY29wZVJlZ2lzdHJ5LmdldFR5cGVDaGVja0RpcmVjdGl2ZU1ldGFkYXRhKG5ldyBSZWZlcmVuY2UoZGlyKSk7XG4gIH1cblxuICBnZXRQb3RlbnRpYWxFbGVtZW50VGFncyhjb21wb25lbnQ6IHRzLkNsYXNzRGVjbGFyYXRpb24pOiBNYXA8c3RyaW5nLCBEaXJlY3RpdmVJblNjb3BlfG51bGw+IHtcbiAgICBpZiAodGhpcy5lbGVtZW50VGFnQ2FjaGUuaGFzKGNvbXBvbmVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRUYWdDYWNoZS5nZXQoY29tcG9uZW50KSE7XG4gICAgfVxuXG4gICAgY29uc3QgdGFnTWFwID0gbmV3IE1hcDxzdHJpbmcsIERpcmVjdGl2ZUluU2NvcGV8bnVsbD4oKTtcblxuICAgIGZvciAoY29uc3QgdGFnIG9mIFJFR0lTVFJZLmFsbEtub3duRWxlbWVudE5hbWVzKCkpIHtcbiAgICAgIHRhZ01hcC5zZXQodGFnLCBudWxsKTtcbiAgICB9XG5cbiAgICBjb25zdCBzY29wZSA9IHRoaXMuZ2V0U2NvcGVEYXRhKGNvbXBvbmVudCk7XG4gICAgaWYgKHNjb3BlICE9PSBudWxsKSB7XG4gICAgICBmb3IgKGNvbnN0IGRpcmVjdGl2ZSBvZiBzY29wZS5kaXJlY3RpdmVzKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc2VsZWN0b3Igb2YgQ3NzU2VsZWN0b3IucGFyc2UoZGlyZWN0aXZlLnNlbGVjdG9yKSkge1xuICAgICAgICAgIGlmIChzZWxlY3Rvci5lbGVtZW50ID09PSBudWxsIHx8IHRhZ01hcC5oYXMoc2VsZWN0b3IuZWxlbWVudCkpIHtcbiAgICAgICAgICAgIC8vIFNraXAgdGhpcyBkaXJlY3RpdmUgaWYgaXQgZG9lc24ndCBtYXRjaCBhbiBlbGVtZW50IHRhZywgb3IgaWYgYW5vdGhlciBkaXJlY3RpdmUgaGFzXG4gICAgICAgICAgICAvLyBhbHJlYWR5IGJlZW4gaW5jbHVkZWQgd2l0aCB0aGUgc2FtZSBlbGVtZW50IG5hbWUuXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0YWdNYXAuc2V0KHNlbGVjdG9yLmVsZW1lbnQsIGRpcmVjdGl2ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVsZW1lbnRUYWdDYWNoZS5zZXQoY29tcG9uZW50LCB0YWdNYXApO1xuICAgIHJldHVybiB0YWdNYXA7XG4gIH1cblxuICBnZXRQb3RlbnRpYWxEb21CaW5kaW5ncyh0YWdOYW1lOiBzdHJpbmcpOiB7YXR0cmlidXRlOiBzdHJpbmcsIHByb3BlcnR5OiBzdHJpbmd9W10ge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBSRUdJU1RSWS5hbGxLbm93bkF0dHJpYnV0ZXNPZkVsZW1lbnQodGFnTmFtZSk7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZXMubWFwKGF0dHJpYnV0ZSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogUkVHSVNUUlkuZ2V0TWFwcGVkUHJvcE5hbWUoYXR0cmlidXRlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTY29wZURhdGEoY29tcG9uZW50OiB0cy5DbGFzc0RlY2xhcmF0aW9uKTogU2NvcGVEYXRhfG51bGwge1xuICAgIGlmICh0aGlzLnNjb3BlQ2FjaGUuaGFzKGNvbXBvbmVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjb3BlQ2FjaGUuZ2V0KGNvbXBvbmVudCkhO1xuICAgIH1cblxuICAgIGlmICghaXNOYW1lZENsYXNzRGVjbGFyYXRpb24oY29tcG9uZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBc3NlcnRpb25FcnJvcjogY29tcG9uZW50cyBtdXN0IGhhdmUgbmFtZXNgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzY29wZSA9IHRoaXMuY29tcG9uZW50U2NvcGVSZWFkZXIuZ2V0U2NvcGVGb3JDb21wb25lbnQoY29tcG9uZW50KTtcbiAgICBpZiAoc2NvcGUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGE6IFNjb3BlRGF0YSA9IHtcbiAgICAgIGRpcmVjdGl2ZXM6IFtdLFxuICAgICAgcGlwZXM6IFtdLFxuICAgICAgaXNQb2lzb25lZDogc2NvcGUuY29tcGlsYXRpb24uaXNQb2lzb25lZCxcbiAgICB9O1xuXG4gICAgY29uc3QgdHlwZUNoZWNrZXIgPSB0aGlzLnByb2dyYW1Ecml2ZXIuZ2V0UHJvZ3JhbSgpLmdldFR5cGVDaGVja2VyKCk7XG4gICAgZm9yIChjb25zdCBkaXIgb2Ygc2NvcGUuY29tcGlsYXRpb24uZGlyZWN0aXZlcykge1xuICAgICAgaWYgKGRpci5zZWxlY3RvciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBTa2lwIHRoaXMgZGlyZWN0aXZlLCBpdCBjYW4ndCBiZSBhZGRlZCB0byBhIHRlbXBsYXRlIGFueXdheS5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCB0c1N5bWJvbCA9IHR5cGVDaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24oZGlyLnJlZi5ub2RlLm5hbWUpO1xuICAgICAgaWYgKCFpc1N5bWJvbFdpdGhWYWx1ZURlY2xhcmF0aW9uKHRzU3ltYm9sKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IG5nTW9kdWxlOiBDbGFzc0RlY2xhcmF0aW9ufG51bGwgPSBudWxsO1xuICAgICAgY29uc3QgbW9kdWxlU2NvcGVPZkRpciA9IHRoaXMuY29tcG9uZW50U2NvcGVSZWFkZXIuZ2V0U2NvcGVGb3JDb21wb25lbnQoZGlyLnJlZi5ub2RlKTtcbiAgICAgIGlmIChtb2R1bGVTY29wZU9mRGlyICE9PSBudWxsKSB7XG4gICAgICAgIG5nTW9kdWxlID0gbW9kdWxlU2NvcGVPZkRpci5uZ01vZHVsZTtcbiAgICAgIH1cblxuICAgICAgZGF0YS5kaXJlY3RpdmVzLnB1c2goe1xuICAgICAgICBpc0NvbXBvbmVudDogZGlyLmlzQ29tcG9uZW50LFxuICAgICAgICBpc1N0cnVjdHVyYWw6IGRpci5pc1N0cnVjdHVyYWwsXG4gICAgICAgIHNlbGVjdG9yOiBkaXIuc2VsZWN0b3IsXG4gICAgICAgIHRzU3ltYm9sLFxuICAgICAgICBuZ01vZHVsZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcGlwZSBvZiBzY29wZS5jb21waWxhdGlvbi5waXBlcykge1xuICAgICAgY29uc3QgdHNTeW1ib2wgPSB0eXBlQ2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKHBpcGUucmVmLm5vZGUubmFtZSk7XG4gICAgICBpZiAodHNTeW1ib2wgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGRhdGEucGlwZXMucHVzaCh7XG4gICAgICAgIG5hbWU6IHBpcGUubmFtZSxcbiAgICAgICAgdHNTeW1ib2wsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnNjb3BlQ2FjaGUuc2V0KGNvbXBvbmVudCwgZGF0YSk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29udmVydERpYWdub3N0aWMoXG4gICAgZGlhZzogdHMuRGlhZ25vc3RpYywgc291cmNlUmVzb2x2ZXI6IFRlbXBsYXRlU291cmNlUmVzb2x2ZXIpOiBUZW1wbGF0ZURpYWdub3N0aWN8bnVsbCB7XG4gIGlmICghc2hvdWxkUmVwb3J0RGlhZ25vc3RpYyhkaWFnKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiB0cmFuc2xhdGVEaWFnbm9zdGljKGRpYWcsIHNvdXJjZVJlc29sdmVyKTtcbn1cblxuLyoqXG4gKiBEYXRhIGZvciB0ZW1wbGF0ZSB0eXBlLWNoZWNraW5nIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBpbnB1dCBmaWxlIGluIHRoZSB1c2VyJ3MgcHJvZ3JhbSAod2hpY2hcbiAqIGNvbnRhaW5zIGNvbXBvbmVudHMgdG8gYmUgY2hlY2tlZCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVR5cGVDaGVja2luZ0RhdGEge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgdHlwZS1jaGVja2luZyBzaGltIHJlcXVpcmVkIGFueSBpbmxpbmUgY2hhbmdlcyB0byB0aGUgb3JpZ2luYWwgZmlsZSwgd2hpY2ggYWZmZWN0c1xuICAgKiB3aGV0aGVyIHRoZSBzaGltIGNhbiBiZSByZXVzZWQuXG4gICAqL1xuICBoYXNJbmxpbmVzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTb3VyY2UgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgbWFwcGluZyBkaWFnbm9zdGljcyBmcm9tIGlubGluZWQgdHlwZSBjaGVjayBibG9ja3MgYmFjayB0byB0aGVcbiAgICogb3JpZ2luYWwgdGVtcGxhdGUuXG4gICAqL1xuICBzb3VyY2VNYW5hZ2VyOiBUZW1wbGF0ZVNvdXJjZU1hbmFnZXI7XG5cbiAgLyoqXG4gICAqIERhdGEgZm9yIGVhY2ggc2hpbSBnZW5lcmF0ZWQgZnJvbSB0aGlzIGlucHV0IGZpbGUuXG4gICAqXG4gICAqIEEgc2luZ2xlIGlucHV0IGZpbGUgd2lsbCBnZW5lcmF0ZSBvbmUgb3IgbW9yZSBzaGltIGZpbGVzIHRoYXQgYWN0dWFsbHkgY29udGFpbiB0ZW1wbGF0ZVxuICAgKiB0eXBlLWNoZWNraW5nIGNvZGUuXG4gICAqL1xuICBzaGltRGF0YTogTWFwPEFic29sdXRlRnNQYXRoLCBTaGltVHlwZUNoZWNraW5nRGF0YT47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHRlbXBsYXRlIHR5cGUtY2hlY2tlciBpcyBjZXJ0YWluIHRoYXQgYWxsIGNvbXBvbmVudHMgZnJvbSB0aGlzIGlucHV0IGZpbGUgaGF2ZSBoYWRcbiAgICogdHlwZS1jaGVja2luZyBjb2RlIGdlbmVyYXRlZCBpbnRvIHNoaW1zLlxuICAgKi9cbiAgaXNDb21wbGV0ZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEcml2ZXMgYSBgVHlwZUNoZWNrQ29udGV4dGAgdG8gZ2VuZXJhdGUgdHlwZS1jaGVja2luZyBjb2RlIGZvciBldmVyeSBjb21wb25lbnQgaW4gdGhlIHByb2dyYW0uXG4gKi9cbmNsYXNzIFdob2xlUHJvZ3JhbVR5cGVDaGVja2luZ0hvc3QgaW1wbGVtZW50cyBUeXBlQ2hlY2tpbmdIb3N0IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBpbXBsOiBUZW1wbGF0ZVR5cGVDaGVja2VySW1wbCkge31cblxuICBnZXRTb3VyY2VNYW5hZ2VyKHNmUGF0aDogQWJzb2x1dGVGc1BhdGgpOiBUZW1wbGF0ZVNvdXJjZU1hbmFnZXIge1xuICAgIHJldHVybiB0aGlzLmltcGwuZ2V0RmlsZURhdGEoc2ZQYXRoKS5zb3VyY2VNYW5hZ2VyO1xuICB9XG5cbiAgc2hvdWxkQ2hlY2tDb21wb25lbnQobm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNmUGF0aCA9IGFic29sdXRlRnJvbVNvdXJjZUZpbGUobm9kZS5nZXRTb3VyY2VGaWxlKCkpO1xuICAgIGNvbnN0IHNoaW1QYXRoID0gVHlwZUNoZWNrU2hpbUdlbmVyYXRvci5zaGltRm9yKHNmUGF0aCk7XG4gICAgY29uc3QgZmlsZURhdGEgPSB0aGlzLmltcGwuZ2V0RmlsZURhdGEoc2ZQYXRoKTtcbiAgICAvLyBUaGUgY29tcG9uZW50IG5lZWRzIHRvIGJlIGNoZWNrZWQgdW5sZXNzIHRoZSBzaGltIHdoaWNoIHdvdWxkIGNvbnRhaW4gaXQgYWxyZWFkeSBleGlzdHMuXG4gICAgcmV0dXJuICFmaWxlRGF0YS5zaGltRGF0YS5oYXMoc2hpbVBhdGgpO1xuICB9XG5cbiAgcmVjb3JkU2hpbURhdGEoc2ZQYXRoOiBBYnNvbHV0ZUZzUGF0aCwgZGF0YTogU2hpbVR5cGVDaGVja2luZ0RhdGEpOiB2b2lkIHtcbiAgICBjb25zdCBmaWxlRGF0YSA9IHRoaXMuaW1wbC5nZXRGaWxlRGF0YShzZlBhdGgpO1xuICAgIGZpbGVEYXRhLnNoaW1EYXRhLnNldChkYXRhLnBhdGgsIGRhdGEpO1xuICAgIGlmIChkYXRhLmhhc0lubGluZXMpIHtcbiAgICAgIGZpbGVEYXRhLmhhc0lubGluZXMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJlY29yZENvbXBsZXRlKHNmUGF0aDogQWJzb2x1dGVGc1BhdGgpOiB2b2lkIHtcbiAgICB0aGlzLmltcGwuZ2V0RmlsZURhdGEoc2ZQYXRoKS5pc0NvbXBsZXRlID0gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIERyaXZlcyBhIGBUeXBlQ2hlY2tDb250ZXh0YCB0byBnZW5lcmF0ZSB0eXBlLWNoZWNraW5nIGNvZGUgZWZmaWNpZW50bHkgZm9yIGEgc2luZ2xlIGlucHV0IGZpbGUuXG4gKi9cbmNsYXNzIFNpbmdsZUZpbGVUeXBlQ2hlY2tpbmdIb3N0IGltcGxlbWVudHMgVHlwZUNoZWNraW5nSG9zdCB7XG4gIHByaXZhdGUgc2VlbklubGluZXMgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByb3RlY3RlZCBzZlBhdGg6IEFic29sdXRlRnNQYXRoLCBwcm90ZWN0ZWQgZmlsZURhdGE6IEZpbGVUeXBlQ2hlY2tpbmdEYXRhLFxuICAgICAgcHJvdGVjdGVkIGltcGw6IFRlbXBsYXRlVHlwZUNoZWNrZXJJbXBsKSB7fVxuXG4gIHByaXZhdGUgYXNzZXJ0UGF0aChzZlBhdGg6IEFic29sdXRlRnNQYXRoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2ZQYXRoICE9PSBzZlBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQXNzZXJ0aW9uRXJyb3I6IHF1ZXJ5aW5nIFR5cGVDaGVja2luZ0hvc3Qgb3V0c2lkZSBvZiBhc3NpZ25lZCBmaWxlYCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0U291cmNlTWFuYWdlcihzZlBhdGg6IEFic29sdXRlRnNQYXRoKTogVGVtcGxhdGVTb3VyY2VNYW5hZ2VyIHtcbiAgICB0aGlzLmFzc2VydFBhdGgoc2ZQYXRoKTtcbiAgICByZXR1cm4gdGhpcy5maWxlRGF0YS5zb3VyY2VNYW5hZ2VyO1xuICB9XG5cbiAgc2hvdWxkQ2hlY2tDb21wb25lbnQobm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnNmUGF0aCAhPT0gYWJzb2x1dGVGcm9tU291cmNlRmlsZShub2RlLmdldFNvdXJjZUZpbGUoKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgc2hpbVBhdGggPSBUeXBlQ2hlY2tTaGltR2VuZXJhdG9yLnNoaW1Gb3IodGhpcy5zZlBhdGgpO1xuXG4gICAgLy8gT25seSBuZWVkIHRvIGdlbmVyYXRlIGEgVENCIGZvciB0aGUgY2xhc3MgaWYgbm8gc2hpbSBleGlzdHMgZm9yIGl0IGN1cnJlbnRseS5cbiAgICByZXR1cm4gIXRoaXMuZmlsZURhdGEuc2hpbURhdGEuaGFzKHNoaW1QYXRoKTtcbiAgfVxuXG4gIHJlY29yZFNoaW1EYXRhKHNmUGF0aDogQWJzb2x1dGVGc1BhdGgsIGRhdGE6IFNoaW1UeXBlQ2hlY2tpbmdEYXRhKTogdm9pZCB7XG4gICAgdGhpcy5hc3NlcnRQYXRoKHNmUGF0aCk7XG5cbiAgICAvLyBQcmV2aW91cyB0eXBlLWNoZWNraW5nIHN0YXRlIG1heSBoYXZlIHJlcXVpcmVkIHRoZSB1c2Ugb2YgaW5saW5lcyAoYXNzdW1pbmcgdGhleSB3ZXJlXG4gICAgLy8gc3VwcG9ydGVkKS4gSWYgdGhlIGN1cnJlbnQgb3BlcmF0aW9uIGFsc28gcmVxdWlyZXMgaW5saW5lcywgdGhpcyBwcmVzZW50cyBhIHByb2JsZW06XG4gICAgLy8gZ2VuZXJhdGluZyBuZXcgaW5saW5lcyBtYXkgaW52YWxpZGF0ZSBhbnkgb2xkIGlubGluZXMgdGhhdCBvbGQgc3RhdGUgZGVwZW5kcyBvbi5cbiAgICAvL1xuICAgIC8vIFJhdGhlciB0aGFuIHJlc29sdmUgdGhpcyBpc3N1ZSBieSB0cmFja2luZyBzcGVjaWZpYyBkZXBlbmRlbmNpZXMgb24gaW5saW5lcywgaWYgdGhlIG5ldyBzdGF0ZVxuICAgIC8vIHJlbGllcyBvbiBpbmxpbmVzLCBhbnkgb2xkIHN0YXRlIHRoYXQgcmVsaWVkIG9uIHRoZW0gaXMgc2ltcGx5IGNsZWFyZWQuIFRoaXMgaGFwcGVucyB3aGVuIHRoZVxuICAgIC8vIGZpcnN0IG5ldyBzdGF0ZSB0aGF0IHVzZXMgaW5saW5lcyBpcyBlbmNvdW50ZXJlZC5cbiAgICBpZiAoZGF0YS5oYXNJbmxpbmVzICYmICF0aGlzLnNlZW5JbmxpbmVzKSB7XG4gICAgICB0aGlzLmltcGwuY2xlYXJBbGxTaGltRGF0YVVzaW5nSW5saW5lcygpO1xuICAgICAgdGhpcy5zZWVuSW5saW5lcyA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5maWxlRGF0YS5zaGltRGF0YS5zZXQoZGF0YS5wYXRoLCBkYXRhKTtcbiAgICBpZiAoZGF0YS5oYXNJbmxpbmVzKSB7XG4gICAgICB0aGlzLmZpbGVEYXRhLmhhc0lubGluZXMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJlY29yZENvbXBsZXRlKHNmUGF0aDogQWJzb2x1dGVGc1BhdGgpOiB2b2lkIHtcbiAgICB0aGlzLmFzc2VydFBhdGgoc2ZQYXRoKTtcbiAgICB0aGlzLmZpbGVEYXRhLmlzQ29tcGxldGUgPSB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogRHJpdmVzIGEgYFR5cGVDaGVja0NvbnRleHRgIHRvIGdlbmVyYXRlIHR5cGUtY2hlY2tpbmcgY29kZSBlZmZpY2llbnRseSBmb3Igb25seSB0aG9zZSBjb21wb25lbnRzXG4gKiB3aGljaCBtYXAgdG8gYSBzaW5nbGUgc2hpbSBvZiBhIHNpbmdsZSBpbnB1dCBmaWxlLlxuICovXG5jbGFzcyBTaW5nbGVTaGltVHlwZUNoZWNraW5nSG9zdCBleHRlbmRzIFNpbmdsZUZpbGVUeXBlQ2hlY2tpbmdIb3N0IHtcbiAgY29uc3RydWN0b3IoXG4gICAgICBzZlBhdGg6IEFic29sdXRlRnNQYXRoLCBmaWxlRGF0YTogRmlsZVR5cGVDaGVja2luZ0RhdGEsIGltcGw6IFRlbXBsYXRlVHlwZUNoZWNrZXJJbXBsLFxuICAgICAgcHJpdmF0ZSBzaGltUGF0aDogQWJzb2x1dGVGc1BhdGgpIHtcbiAgICBzdXBlcihzZlBhdGgsIGZpbGVEYXRhLCBpbXBsKTtcbiAgfVxuXG4gIHNob3VsZENoZWNrTm9kZShub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc2ZQYXRoICE9PSBhYnNvbHV0ZUZyb21Tb3VyY2VGaWxlKG5vZGUuZ2V0U291cmNlRmlsZSgpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIE9ubHkgZ2VuZXJhdGUgYSBUQ0IgZm9yIHRoZSBjb21wb25lbnQgaWYgaXQgbWFwcyB0byB0aGUgcmVxdWVzdGVkIHNoaW0gZmlsZS5cbiAgICBjb25zdCBzaGltUGF0aCA9IFR5cGVDaGVja1NoaW1HZW5lcmF0b3Iuc2hpbUZvcih0aGlzLnNmUGF0aCk7XG4gICAgaWYgKHNoaW1QYXRoICE9PSB0aGlzLnNoaW1QYXRoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gT25seSBuZWVkIHRvIGdlbmVyYXRlIGEgVENCIGZvciB0aGUgY2xhc3MgaWYgbm8gc2hpbSBleGlzdHMgZm9yIGl0IGN1cnJlbnRseS5cbiAgICByZXR1cm4gIXRoaXMuZmlsZURhdGEuc2hpbURhdGEuaGFzKHNoaW1QYXRoKTtcbiAgfVxufVxuXG4vKipcbiAqIENhY2hlZCBzY29wZSBpbmZvcm1hdGlvbiBmb3IgYSBjb21wb25lbnQuXG4gKi9cbmludGVyZmFjZSBTY29wZURhdGEge1xuICBkaXJlY3RpdmVzOiBEaXJlY3RpdmVJblNjb3BlW107XG4gIHBpcGVzOiBQaXBlSW5TY29wZVtdO1xuICBpc1BvaXNvbmVkOiBib29sZWFuO1xufVxuIl19
|