@sapui5/sap.fe.core 1.113.0 → 1.115.0
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/package.json +1 -1
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/ActionRuntime-dbg.js +68 -5
- package/src/sap/fe/core/ActionRuntime.js +1 -1
- package/src/sap/fe/core/ActionRuntime.js.map +1 -1
- package/src/sap/fe/core/ActionRuntime.ts +120 -4
- package/src/sap/fe/core/AppComponent-dbg.js +8 -2
- package/src/sap/fe/core/AppComponent.js +1 -1
- package/src/sap/fe/core/AppComponent.js.map +1 -1
- package/src/sap/fe/core/AppComponent.ts +19 -3
- package/src/sap/fe/core/AppStateHandler-dbg.js +14 -10
- package/src/sap/fe/core/AppStateHandler.js +1 -1
- package/src/sap/fe/core/AppStateHandler.js.map +1 -1
- package/src/sap/fe/core/AppStateHandler.ts +17 -11
- package/src/sap/fe/core/BaseController-dbg.js +1 -1
- package/src/sap/fe/core/BaseController.ts +13 -2
- package/src/sap/fe/core/CommonUtils-dbg.js +74 -317
- package/src/sap/fe/core/CommonUtils.js +1 -1
- package/src/sap/fe/core/CommonUtils.js.map +1 -1
- package/src/sap/fe/core/CommonUtils.ts +96 -473
- package/src/sap/fe/core/ExtensionAPI-dbg.js +1 -1
- package/src/sap/fe/core/ExtensionAPI.ts +2 -2
- package/src/sap/fe/core/StateFilterToSelectionVariant-dbg.js +263 -0
- package/src/sap/fe/core/StateFilterToSelectionVariant.js +6 -0
- package/src/sap/fe/core/StateFilterToSelectionVariant.js.map +1 -0
- package/src/sap/fe/core/StateFilterToSelectionVariant.ts +316 -0
- package/src/sap/fe/core/TemplateComponent-dbg.js +1 -1
- package/src/sap/fe/core/TemplateComponent.ts +6 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase-dbg.js +10 -3
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js.map +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +8 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport-dbg.js +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.ts +1 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor-dbg.js +8 -8
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.js.map +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.ts +7 -7
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment-dbg.js +1 -1
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.ts +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow-dbg.js +68 -36
- package/src/sap/fe/core/controllerextensions/EditFlow.js +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +83 -43
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation-dbg.js +12 -11
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +1 -1
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +17 -21
- package/src/sap/fe/core/controllerextensions/InternalRouting-dbg.js +233 -133
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +1 -1
- package/src/sap/fe/core/controllerextensions/InternalRouting.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +260 -145
- package/src/sap/fe/core/controllerextensions/MassEdit-dbg.js +1 -1
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +3 -3
- package/src/sap/fe/core/controllerextensions/Routing-dbg.js +5 -3
- package/src/sap/fe/core/controllerextensions/Routing.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/Routing.ts +5 -4
- package/src/sap/fe/core/controllerextensions/Share-dbg.js +3 -2
- package/src/sap/fe/core/controllerextensions/Share.js +1 -1
- package/src/sap/fe/core/controllerextensions/Share.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/Share.ts +2 -1
- package/src/sap/fe/core/controllerextensions/SideEffects-dbg.js +19 -14
- package/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
- package/src/sap/fe/core/controllerextensions/SideEffects.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +25 -18
- package/src/sap/fe/core/controllerextensions/ViewState-dbg.js +40 -26
- package/src/sap/fe/core/controllerextensions/ViewState.js +1 -1
- package/src/sap/fe/core/controllerextensions/ViewState.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/ViewState.ts +59 -33
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync-dbg.js +8 -8
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +23 -25
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon-dbg.js +7 -45
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +5 -48
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog-dbg.js +2 -2
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +7 -3
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper-dbg.js +73 -90
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +88 -101
- package/src/sap/fe/core/controllerextensions/editFlow/draft-dbg.js +26 -4
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +29 -3
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup-dbg.js +13 -10
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +7 -20
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade-dbg.js +64 -4
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +91 -8
- package/src/sap/fe/core/controllerextensions/editFlow/sticky-dbg.js +2 -4
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +3 -5
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling-dbg.js +9 -9
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +1 -1
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +8 -8
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -0
- package/src/sap/fe/core/controls/CommandExecution-dbg.js +4 -9
- package/src/sap/fe/core/controls/CommandExecution.js +1 -1
- package/src/sap/fe/core/controls/CommandExecution.js.map +1 -1
- package/src/sap/fe/core/controls/CommandExecution.ts +0 -8
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block-dbg.js +335 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +6 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js.map +1 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.tsx +336 -0
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilter-dbg.js +3 -28
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +1 -1
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js.map +1 -1
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +8 -29
- package/src/sap/fe/core/controls/filterbar/adapter/SelectionVariantToStateFilters-dbg.js +435 -0
- package/src/sap/fe/core/controls/filterbar/adapter/SelectionVariantToStateFilters.js +6 -0
- package/src/sap/fe/core/controls/filterbar/adapter/SelectionVariantToStateFilters.js.map +1 -0
- package/src/sap/fe/core/controls/filterbar/adapter/SelectionVariantToStateFilters.ts +532 -0
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils-dbg.js +30 -1
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +1 -1
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js.map +1 -1
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +38 -0
- package/src/sap/fe/core/converters/ManifestSettings-dbg.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +7 -5
- package/src/sap/fe/core/converters/MetaModelConverter-dbg.js +36 -4
- package/src/sap/fe/core/converters/MetaModelConverter.js +1 -1
- package/src/sap/fe/core/converters/MetaModelConverter.js.map +1 -1
- package/src/sap/fe/core/converters/MetaModelConverter.ts +45 -4
- package/src/sap/fe/core/converters/TemplateConverter-dbg.js +2 -3
- package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
- package/src/sap/fe/core/converters/TemplateConverter.js.map +1 -1
- package/src/sap/fe/core/converters/TemplateConverter.ts +1 -6
- package/src/sap/fe/core/converters/annotations/DataField-dbg.js +18 -3
- package/src/sap/fe/core/converters/annotations/DataField.js +1 -1
- package/src/sap/fe/core/converters/annotations/DataField.js.map +1 -1
- package/src/sap/fe/core/converters/annotations/DataField.ts +18 -2
- package/src/sap/fe/core/converters/common/AnnotationConverter-dbg.js +679 -676
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +1 -1
- package/src/sap/fe/core/converters/common/AnnotationConverter.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/Chart-dbg.js +32 -20
- package/src/sap/fe/core/converters/controls/Common/Chart.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/Chart.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +30 -18
- package/src/sap/fe/core/converters/controls/Common/DataVisualization-dbg.js +4 -5
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +6 -37
- package/src/sap/fe/core/converters/controls/Common/Table-dbg.js +100 -72
- package/src/sap/fe/core/converters/controls/Common/Table.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/Table.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/Table.ts +146 -99
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions-dbg.js +37 -10
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +49 -16
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar-dbg.js +47 -18
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +1 -1
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js.map +1 -1
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +74 -20
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters-dbg.js +26 -9
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +1 -1
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js.map +1 -1
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +24 -8
- package/src/sap/fe/core/converters/helpers/Aggregation-dbg.js +28 -2
- package/src/sap/fe/core/converters/helpers/Aggregation.js +1 -1
- package/src/sap/fe/core/converters/helpers/Aggregation.js.map +1 -1
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +28 -9
- package/src/sap/fe/core/converters/helpers/InsightsHelpers-dbg.js +39 -0
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +6 -0
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.js.map +1 -0
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.ts +45 -0
- package/src/sap/fe/core/converters/templates/ListReportConverter-dbg.js +13 -15
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +1 -1
- package/src/sap/fe/core/converters/templates/ListReportConverter.js.map +1 -1
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +18 -54
- package/src/sap/fe/core/converters/templates/ObjectPageConverter-dbg.js +12 -12
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +1 -1
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js.map +1 -1
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +16 -11
- package/src/sap/fe/core/formatters/CollaborationFormatter-dbg.js +17 -33
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +1 -1
- package/src/sap/fe/core/formatters/CollaborationFormatter.js.map +1 -1
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +27 -22
- package/src/sap/fe/core/formatters/ValueFormatter-dbg.js +5 -11
- package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter.js.map +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter.ts +4 -25
- package/src/sap/fe/core/fpm/Component-dbg.js +3 -1
- package/src/sap/fe/core/fpm/Component.js +1 -1
- package/src/sap/fe/core/fpm/Component.js.map +1 -1
- package/src/sap/fe/core/fpm/Component.ts +3 -1
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit-dbg.js +74 -26
- package/src/sap/fe/core/helpers/BindingToolkit.js +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit.js.map +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit.ts +116 -33
- package/src/sap/fe/core/helpers/DeleteHelper-dbg.js +82 -37
- package/src/sap/fe/core/helpers/DeleteHelper.js +1 -1
- package/src/sap/fe/core/helpers/DeleteHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/DeleteHelper.ts +109 -56
- package/src/sap/fe/core/helpers/KeepAliveHelper-dbg.js +1 -1
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +7 -5
- package/src/sap/fe/core/helpers/MassEditHelper-dbg.js +13 -3
- package/src/sap/fe/core/helpers/MassEditHelper.js +1 -1
- package/src/sap/fe/core/helpers/MassEditHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/MassEditHelper.ts +28 -18
- package/src/sap/fe/core/helpers/MessageStrip-dbg.js +1 -1
- package/src/sap/fe/core/helpers/MessageStrip.ts +2 -1
- package/src/sap/fe/core/helpers/ModelHelper-dbg.js +1 -1
- package/src/sap/fe/core/helpers/ModelHelper.ts +3 -3
- package/src/sap/fe/core/helpers/RecommendationHelper-dbg.js +71 -0
- package/src/sap/fe/core/helpers/RecommendationHelper.js +6 -0
- package/src/sap/fe/core/helpers/RecommendationHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/RecommendationHelper.ts +94 -0
- package/src/sap/fe/core/helpers/ResourceModelHelper-dbg.js +5 -2
- package/src/sap/fe/core/helpers/ResourceModelHelper.js +1 -1
- package/src/sap/fe/core/helpers/ResourceModelHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/ResourceModelHelper.ts +5 -0
- package/src/sap/fe/core/helpers/StableIdHelper-dbg.js +24 -2
- package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
- package/src/sap/fe/core/helpers/StableIdHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/StableIdHelper.ts +23 -1
- package/src/sap/fe/core/helpers/TitleHelper-dbg.js +239 -0
- package/src/sap/fe/core/helpers/TitleHelper.js +6 -0
- package/src/sap/fe/core/helpers/TitleHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/TitleHelper.ts +295 -0
- package/src/sap/fe/core/jsx-runtime/ViewLoader-dbg.js +4 -1
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js +1 -1
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js.map +1 -1
- package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +3 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control-dbg.js +41 -17
- package/src/sap/fe/core/jsx-runtime/jsx-control.js +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx-control.js.map +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +45 -21
- package/src/sap/fe/core/jsx-runtime/jsx-dbg.js +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -0
- package/src/sap/fe/core/jsx-runtime/useMDXComponents-dbg.js +8 -4
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js.map +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +7 -2
- package/src/sap/fe/core/library-dbg.js +4 -3
- package/src/sap/fe/core/library-preload.js +91 -74
- package/src/sap/fe/core/library-preload.js.map +1 -1
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/library.js.map +1 -1
- package/src/sap/fe/core/library.ts +1 -1
- package/src/sap/fe/core/manifest.json +1 -1
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration-dbg.js +4 -3
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js.map +1 -1
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +3 -2
- package/src/sap/fe/core/messagebundle.properties +12 -8
- package/src/sap/fe/core/messagebundle_ar.properties +7 -5
- package/src/sap/fe/core/messagebundle_bg.properties +7 -5
- package/src/sap/fe/core/messagebundle_ca.properties +7 -5
- package/src/sap/fe/core/messagebundle_cs.properties +7 -5
- package/src/sap/fe/core/messagebundle_cy.properties +7 -5
- package/src/sap/fe/core/messagebundle_da.properties +7 -5
- package/src/sap/fe/core/messagebundle_de.properties +7 -5
- package/src/sap/fe/core/messagebundle_el.properties +7 -5
- package/src/sap/fe/core/messagebundle_en.properties +7 -5
- package/src/sap/fe/core/messagebundle_en_GB.properties +6 -4
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +7 -4
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +6 -4
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +7 -4
- package/src/sap/fe/core/messagebundle_es.properties +7 -5
- package/src/sap/fe/core/messagebundle_es_MX.properties +7 -5
- package/src/sap/fe/core/messagebundle_et.properties +7 -5
- package/src/sap/fe/core/messagebundle_fi.properties +7 -5
- package/src/sap/fe/core/messagebundle_fr.properties +7 -5
- package/src/sap/fe/core/messagebundle_fr_CA.properties +8 -6
- package/src/sap/fe/core/messagebundle_hi.properties +7 -5
- package/src/sap/fe/core/messagebundle_hr.properties +7 -5
- package/src/sap/fe/core/messagebundle_hu.properties +7 -5
- package/src/sap/fe/core/messagebundle_id.properties +7 -5
- package/src/sap/fe/core/messagebundle_it.properties +8 -6
- package/src/sap/fe/core/messagebundle_iw.properties +7 -5
- package/src/sap/fe/core/messagebundle_ja.properties +7 -5
- package/src/sap/fe/core/messagebundle_kk.properties +7 -5
- package/src/sap/fe/core/messagebundle_ko.properties +7 -5
- package/src/sap/fe/core/messagebundle_lt.properties +7 -5
- package/src/sap/fe/core/messagebundle_lv.properties +7 -5
- package/src/sap/fe/core/messagebundle_ms.properties +7 -5
- package/src/sap/fe/core/messagebundle_nl.properties +7 -5
- package/src/sap/fe/core/messagebundle_no.properties +7 -5
- package/src/sap/fe/core/messagebundle_pl.properties +7 -5
- package/src/sap/fe/core/messagebundle_pt.properties +7 -5
- package/src/sap/fe/core/messagebundle_pt_PT.properties +7 -5
- package/src/sap/fe/core/messagebundle_ro.properties +7 -5
- package/src/sap/fe/core/messagebundle_ru.properties +7 -5
- package/src/sap/fe/core/messagebundle_sh.properties +7 -5
- package/src/sap/fe/core/messagebundle_sk.properties +7 -5
- package/src/sap/fe/core/messagebundle_sl.properties +7 -5
- package/src/sap/fe/core/messagebundle_sv.properties +7 -5
- package/src/sap/fe/core/messagebundle_th.properties +7 -5
- package/src/sap/fe/core/messagebundle_tr.properties +7 -5
- package/src/sap/fe/core/messagebundle_uk.properties +7 -5
- package/src/sap/fe/core/messagebundle_vi.properties +7 -5
- package/src/sap/fe/core/messagebundle_zh_CN.properties +7 -5
- package/src/sap/fe/core/messagebundle_zh_TW.properties +7 -5
- package/src/sap/fe/core/operationsHelper-dbg.js +1 -1
- package/src/sap/fe/core/operationsHelper.ts +1 -1
- package/src/sap/fe/core/rootView/Fcl-dbg.controller.js +8 -2
- package/src/sap/fe/core/rootView/Fcl.controller.js +1 -1
- package/src/sap/fe/core/rootView/Fcl.controller.js.map +1 -1
- package/src/sap/fe/core/rootView/Fcl.controller.ts +8 -1
- package/src/sap/fe/core/rootView/NavContainer-dbg.controller.js +8 -2
- package/src/sap/fe/core/rootView/NavContainer.controller.js +1 -1
- package/src/sap/fe/core/rootView/NavContainer.controller.js.map +1 -1
- package/src/sap/fe/core/rootView/NavContainer.controller.ts +10 -3
- package/src/sap/fe/core/rootView/RootViewBaseController-dbg.js +16 -6
- package/src/sap/fe/core/rootView/RootViewBaseController.js +1 -1
- package/src/sap/fe/core/rootView/RootViewBaseController.js.map +1 -1
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +10 -4
- package/src/sap/fe/core/services/EnvironmentServiceFactory-dbg.js +54 -5
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +52 -6
- package/src/sap/fe/core/services/NavigationServiceFactory-dbg.js +31 -14
- package/src/sap/fe/core/services/NavigationServiceFactory.js +1 -1
- package/src/sap/fe/core/services/NavigationServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +15 -1
- package/src/sap/fe/core/services/RoutingServiceFactory-dbg.js +10 -4
- package/src/sap/fe/core/services/RoutingServiceFactory.js +1 -1
- package/src/sap/fe/core/services/RoutingServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +29 -7
- package/src/sap/fe/core/services/SideEffectsServiceFactory-dbg.js +5 -2
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +1 -1
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +9 -5
- package/src/sap/fe/core/services/TemplatedViewServiceFactory-dbg.js +1 -2
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +2 -18
- package/src/sap/fe/core/templating/CommonFormatters-dbg.js +8 -8
- package/src/sap/fe/core/templating/CommonFormatters.js.map +1 -1
- package/src/sap/fe/core/templating/CommonFormatters.ts +9 -9
- package/src/sap/fe/core/templating/CriticalityFormatters-dbg.js +1 -1
- package/src/sap/fe/core/templating/CriticalityFormatters.ts +2 -2
- package/src/sap/fe/core/templating/DataFieldFormatters-dbg.js +38 -2
- package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -1
- package/src/sap/fe/core/templating/DataFieldFormatters.js.map +1 -1
- package/src/sap/fe/core/templating/DataFieldFormatters.ts +40 -0
- package/src/sap/fe/core/templating/FieldControlHelper-dbg.js +5 -6
- package/src/sap/fe/core/templating/FieldControlHelper.js +1 -1
- package/src/sap/fe/core/templating/FieldControlHelper.js.map +1 -1
- package/src/sap/fe/core/templating/FieldControlHelper.ts +13 -11
- package/src/sap/fe/core/templating/FilterHelper-dbg.js +13 -1
- package/src/sap/fe/core/templating/FilterHelper.js +1 -1
- package/src/sap/fe/core/templating/FilterHelper.js.map +1 -1
- package/src/sap/fe/core/templating/FilterHelper.ts +13 -1
- package/src/sap/fe/core/templating/PropertyHelper-dbg.js +1 -1
- package/src/sap/fe/core/templating/PropertyHelper.ts +7 -7
- package/src/sap/fe/core/templating/UIFormatters-dbg.js +5 -6
- package/src/sap/fe/core/templating/UIFormatters.js +1 -1
- package/src/sap/fe/core/templating/UIFormatters.js.map +1 -1
- package/src/sap/fe/core/templating/UIFormatters.ts +6 -7
- package/src/sap/fe/core/type/TypeUtil-dbg.js +2 -2
- package/src/sap/fe/core/type/TypeUtil.js +1 -1
- package/src/sap/fe/core/type/TypeUtil.js.map +1 -1
- package/src/sap/fe/core/type/TypeUtil.ts +2 -2
- package/src/sap/fe/core/controllerextensions/collaboration/Manage-dbg.js +0 -243
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +0 -6
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js.map +0 -1
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +0 -283
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +0 -121
- package/src/sap/fe/core/controllerextensions/collaboration/UserDetails.fragment.xml +0 -11
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +0 -59
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler-dbg.js +0 -171
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +0 -6
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js.map +0 -1
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +0 -184
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2023 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/editFlow/operations", "sap/fe/core/controllerextensions/editFlow/sticky", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/fe/core/helpers/DeleteHelper", "sap/fe/core/helpers/FPMHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/ResourceModelHelper", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/library", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageBox", "sap/m/MessageToast", "sap/m/Popover", "sap/m/Text", "sap/m/VBox", "sap/ui/core/Core", "sap/ui/core/Fragment", "sap/ui/core/library", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model/json/JSONModel", "../../helpers/MetaModelFunction", "../../helpers/ToES6Promise"], function (Log, CommonUtils, BusyLocker, draft, operations, sticky, messageHandling, deleteHelper, FPMHelper, ModelHelper, ResourceModelHelper, StableIdHelper, FELibrary, Button, Dialog, MessageBox, MessageToast, Popover, Text, VBox, Core, Fragment, coreLibrary, XMLPreprocessor, XMLTemplateProcessor, JSONModel, MetaModelFunction, toES6Promise) {
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/editFlow/operations", "sap/fe/core/controllerextensions/editFlow/sticky", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/fe/core/helpers/DeleteHelper", "sap/fe/core/helpers/FPMHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/ResourceModelHelper", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/library", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageBox", "sap/m/MessageToast", "sap/m/Popover", "sap/m/Text", "sap/m/VBox", "sap/ui/core/Core", "sap/ui/core/Fragment", "sap/ui/core/library", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model/json/JSONModel", "../../helpers/MetaModelFunction", "../../helpers/ToES6Promise"], function (Log, ActionRuntime, CommonUtils, BusyLocker, draft, operations, sticky, messageHandling, deleteHelper, FPMHelper, ModelHelper, ResourceModelHelper, StableIdHelper, FELibrary, Button, Dialog, MessageBox, MessageToast, Popover, Text, VBox, Core, Fragment, coreLibrary, XMLPreprocessor, XMLTemplateProcessor, JSONModel, MetaModelFunction, toES6Promise) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var getRequiredPropertiesFromInsertRestrictions = MetaModelFunction.getRequiredPropertiesFromInsertRestrictions;
|
|
@@ -11,7 +11,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
11
11
|
var getResourceModel = ResourceModelHelper.getResourceModel;
|
|
12
12
|
const CreationMode = FELibrary.CreationMode;
|
|
13
13
|
const ProgrammingModel = FELibrary.ProgrammingModel;
|
|
14
|
-
|
|
14
|
+
|
|
15
|
+
//Enums for delete text calculations for delete confirm dialog.
|
|
16
|
+
const DeleteOptionTypes = deleteHelper.DeleteOptionTypes;
|
|
17
|
+
const DeleteDialogContentControl = deleteHelper.DeleteDialogContentControl;
|
|
18
|
+
|
|
15
19
|
/* Make sure that the mParameters is not the oEvent */
|
|
16
20
|
function getParameters(mParameters) {
|
|
17
21
|
if (mParameters && mParameters.getMetadata && mParameters.getMetadata().getName() === "sap.ui.base.Event") {
|
|
@@ -241,13 +245,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
241
245
|
_proto.deleteDocument = function deleteDocument(contexts, mParameters, appComponent, resourceModel, messageHandler) {
|
|
242
246
|
const resourceBundleCore = Core.getLibraryResourceBundle("sap.fe.core");
|
|
243
247
|
let aParams;
|
|
248
|
+
// delete document lock
|
|
244
249
|
this.busyLock(appComponent);
|
|
245
250
|
const contextsToDelete = Array.isArray(contexts) ? [...contexts] : [contexts];
|
|
246
251
|
return new Promise((resolve, reject) => {
|
|
247
252
|
try {
|
|
248
253
|
const draftEnabled = this._isDraftEnabled(mParameters.selectedContexts || contextsToDelete);
|
|
249
254
|
const items = [];
|
|
250
|
-
|
|
255
|
+
let options = [];
|
|
256
|
+
|
|
257
|
+
// items(texts) and options(checkBoxes and single default option) for confirm dialog.
|
|
251
258
|
if (mParameters) {
|
|
252
259
|
if (!mParameters.numberOfSelectedContexts) {
|
|
253
260
|
// non-Table
|
|
@@ -280,17 +287,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
280
287
|
nonTableTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", undefined, mParameters.entitySetName);
|
|
281
288
|
}
|
|
282
289
|
options.push({
|
|
283
|
-
type:
|
|
290
|
+
type: DeleteOptionTypes.deletableContexts,
|
|
284
291
|
contexts: contextsToDelete,
|
|
285
292
|
text: nonTableTxt,
|
|
286
293
|
selected: true,
|
|
287
|
-
control:
|
|
294
|
+
control: DeleteDialogContentControl.TEXT
|
|
288
295
|
});
|
|
289
296
|
} else {
|
|
290
297
|
// Table
|
|
291
298
|
let totalDeletable = contextsToDelete.length;
|
|
292
299
|
if (draftEnabled) {
|
|
293
|
-
totalDeletable += mParameters.draftsWithNonDeletableActive.length + mParameters.draftsWithDeletableActive.length + mParameters.unSavedContexts.length
|
|
300
|
+
totalDeletable += mParameters.draftsWithNonDeletableActive.length + mParameters.draftsWithDeletableActive.length + mParameters.unSavedContexts.length;
|
|
294
301
|
deleteHelper.updateDraftOptionsForDeletableTexts(mParameters, contextsToDelete, totalDeletable, resourceModel, items, options);
|
|
295
302
|
} else {
|
|
296
303
|
const nonDeletableText = deleteHelper.getNonDeletableText(mParameters, totalDeletable, resourceModel);
|
|
@@ -298,7 +305,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
298
305
|
items.push(nonDeletableText);
|
|
299
306
|
}
|
|
300
307
|
}
|
|
301
|
-
deleteHelper.
|
|
308
|
+
const optionsDeletableTexts = deleteHelper.getOptionsForDeletableTexts(mParameters, contextsToDelete, resourceModel);
|
|
309
|
+
options = [...options, ...optionsDeletableTexts];
|
|
302
310
|
}
|
|
303
311
|
}
|
|
304
312
|
|
|
@@ -356,6 +364,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
356
364
|
oDialog.open();
|
|
357
365
|
}
|
|
358
366
|
} finally {
|
|
367
|
+
// delete document unlock
|
|
359
368
|
this.busyUnlock(appComponent);
|
|
360
369
|
}
|
|
361
370
|
});
|
|
@@ -445,7 +454,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
445
454
|
await this._confirmDiscard(mParameters.cancelButton, isObjectModified, resourceModel);
|
|
446
455
|
}
|
|
447
456
|
if (oContext.isKeepAlive()) {
|
|
448
|
-
|
|
457
|
+
// if the context is kept alive we set it again to detach the onBeforeDestroy callback and handle navigation here
|
|
458
|
+
// the context needs to still be kept alive to be able to reset changes properly
|
|
459
|
+
oContext.setKeepAlive(true, undefined);
|
|
449
460
|
}
|
|
450
461
|
if (mParameters.beforeCancelCallBack) {
|
|
451
462
|
await mParameters.beforeCancelCallBack({
|
|
@@ -517,9 +528,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
517
528
|
if (sProgrammingModel !== ProgrammingModel.Sticky && sProgrammingModel !== ProgrammingModel.Draft) {
|
|
518
529
|
throw new Error("Save is only allowed for draft or sticky session supported services");
|
|
519
530
|
}
|
|
520
|
-
// in case of saving / activating the bound transition messages shall be removed before the PATCH/POST
|
|
521
|
-
// is sent to the backend
|
|
522
|
-
messageHandler.removeTransitionMessages();
|
|
523
531
|
try {
|
|
524
532
|
this.busyLock(appComponent);
|
|
525
533
|
const oActiveDocument = sProgrammingModel === ProgrammingModel.Draft ? await draft.activateDocument(context, appComponent, {}, messageHandler) : await sticky.activateDocument(context, appComponent);
|
|
@@ -774,28 +782,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
774
782
|
confirmationPopover.openBy(cancelButton, false);
|
|
775
783
|
});
|
|
776
784
|
};
|
|
777
|
-
_proto._onFieldChange = function _onFieldChange(oEvent, oCreateButton, messageHandler, fnValidateRequiredProperties) {
|
|
778
|
-
messageHandler.removeTransitionMessages();
|
|
779
|
-
const oField = oEvent.getSource();
|
|
780
|
-
const oFieldPromise = oEvent.getParameter("promise");
|
|
781
|
-
if (oFieldPromise) {
|
|
782
|
-
return oFieldPromise.then(function (value) {
|
|
783
|
-
// Setting value of field as '' in case of value help and validating other fields
|
|
784
|
-
oField.setValue(value);
|
|
785
|
-
fnValidateRequiredProperties();
|
|
786
|
-
return oField.getValue();
|
|
787
|
-
}).catch(function (value) {
|
|
788
|
-
if (value !== "") {
|
|
789
|
-
//disabling the continue button in case of invalid value in field
|
|
790
|
-
oCreateButton.setEnabled(false);
|
|
791
|
-
} else {
|
|
792
|
-
// validating all the fields in case of empty value in field
|
|
793
|
-
oField.setValue(value);
|
|
794
|
-
fnValidateRequiredProperties();
|
|
795
|
-
}
|
|
796
|
-
});
|
|
797
|
-
}
|
|
798
|
-
};
|
|
799
785
|
_proto._launchDialogWithKeyFields = function _launchDialogWithKeyFields(oListBinding, mFields, oModel, mParameters, appComponent, messageHandler) {
|
|
800
786
|
let oDialog;
|
|
801
787
|
const oParentControl = mParameters.parentControl;
|
|
@@ -842,60 +828,42 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
842
828
|
});
|
|
843
829
|
let aFormElements = [];
|
|
844
830
|
const mFieldValueMap = {};
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
return oFormElement.getFields()[0];
|
|
852
|
-
}).filter(function (oField) {
|
|
853
|
-
// The continue button should remain disabled in case of empty required fields.
|
|
854
|
-
return oField.getRequired() || oField.getValueState() === ValueState.Error;
|
|
855
|
-
}).map(async function (oField) {
|
|
856
|
-
const sFieldId = oField.getId();
|
|
857
|
-
if (sFieldId in mFieldValueMap) {
|
|
858
|
-
try {
|
|
859
|
-
const vValue = await mFieldValueMap[sFieldId];
|
|
860
|
-
return oField.getValue() === "" ? undefined : vValue;
|
|
861
|
-
} catch (err) {
|
|
862
|
-
return undefined;
|
|
863
|
-
}
|
|
864
|
-
}
|
|
865
|
-
return oField.getValue() === "" ? undefined : oField.getValue();
|
|
866
|
-
}));
|
|
867
|
-
bEnabled = aResults.every(function (vValue) {
|
|
868
|
-
if (Array.isArray(vValue)) {
|
|
869
|
-
vValue = vValue[0];
|
|
870
|
-
}
|
|
871
|
-
return vValue !== undefined && vValue !== null && vValue !== "";
|
|
872
|
-
});
|
|
873
|
-
} catch (err) {
|
|
874
|
-
bEnabled = false;
|
|
875
|
-
}
|
|
876
|
-
oCreateButton.setEnabled(bEnabled);
|
|
831
|
+
const messageManager = Core.getMessageManager();
|
|
832
|
+
const _removeMessagesForActionParamter = messageControlId => {
|
|
833
|
+
const allMessages = messageManager.getMessageModel().getData();
|
|
834
|
+
// also remove messages assigned to inner controls, but avoid removing messages for different paramters (with name being substring of another parameter name)
|
|
835
|
+
const relevantMessages = allMessages.filter(msg => msg.getControlIds().some(controlId => controlId.includes(messageControlId)));
|
|
836
|
+
messageManager.removeMessages(relevantMessages);
|
|
877
837
|
};
|
|
878
838
|
const oController = {
|
|
879
839
|
/*
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
handleChange:
|
|
886
|
-
const
|
|
887
|
-
|
|
840
|
+
fired on focus out from field or on selecting a value from the valuehelp.
|
|
841
|
+
the create button (Continue) is always enabled.
|
|
842
|
+
liveChange is not fired when value is added from valuehelp.
|
|
843
|
+
value validation is done for create button.
|
|
844
|
+
*/
|
|
845
|
+
handleChange: async event => {
|
|
846
|
+
const fieldId = event.getParameter("id");
|
|
847
|
+
const field = event.getSource();
|
|
848
|
+
const actionParameterInfo = actionParameterInfos.find(actionParameterInfo => actionParameterInfo.field === field);
|
|
849
|
+
_removeMessagesForActionParamter(fieldId);
|
|
850
|
+
actionParameterInfo.validationPromise = event.getParameter("promise");
|
|
851
|
+
try {
|
|
852
|
+
actionParameterInfo.value = await actionParameterInfo.validationPromise;
|
|
853
|
+
actionParameterInfo.hasError = false;
|
|
854
|
+
} catch (error) {
|
|
855
|
+
delete actionParameterInfo.value;
|
|
856
|
+
actionParameterInfo.hasError = true;
|
|
857
|
+
}
|
|
888
858
|
},
|
|
889
859
|
/*
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
handleLiveChange:
|
|
895
|
-
const
|
|
896
|
-
|
|
897
|
-
mFieldValueMap[sFieldId] = vValue;
|
|
898
|
-
validateRequiredProperties();
|
|
860
|
+
fired on key press. the create button the create button (Continue) is always enabled.
|
|
861
|
+
liveChange is not fired when value is added from valuehelp.
|
|
862
|
+
value validation is done for create button.
|
|
863
|
+
*/
|
|
864
|
+
handleLiveChange: event => {
|
|
865
|
+
const fieldId = event.getParameter("id");
|
|
866
|
+
_removeMessagesForActionParamter(fieldId);
|
|
899
867
|
}
|
|
900
868
|
};
|
|
901
869
|
const oDialogContent = await Fragment.load({
|
|
@@ -920,9 +888,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
920
888
|
beginButton: {
|
|
921
889
|
text: resourceModel.getText("C_TRANSACTION_HELPER_SAPFE_ACTION_CREATE_BUTTON"),
|
|
922
890
|
type: "Emphasized",
|
|
923
|
-
press: async
|
|
924
|
-
|
|
925
|
-
|
|
891
|
+
press: async _Event => {
|
|
892
|
+
/* Validation of mandatory and value state for action parameters */
|
|
893
|
+
if (!(await ActionRuntime.validateProperties(messageManager, actionParameterInfos, resourceModel))) {
|
|
894
|
+
return;
|
|
895
|
+
}
|
|
926
896
|
BusyLocker.lock(oDialog);
|
|
927
897
|
mParameters.bIsCreateDialog = true;
|
|
928
898
|
try {
|
|
@@ -968,8 +938,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
968
938
|
error: oError
|
|
969
939
|
};
|
|
970
940
|
closeDialog();
|
|
971
|
-
} else {
|
|
972
|
-
createButton.setEnabled(true);
|
|
973
941
|
}
|
|
974
942
|
} finally {
|
|
975
943
|
BusyLocker.unlock(oDialog);
|
|
@@ -988,6 +956,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
988
956
|
},
|
|
989
957
|
afterClose: function () {
|
|
990
958
|
var _oDialog$getBindingCo;
|
|
959
|
+
/* When the dialog is cancelled, messages need to be removed in case the same action should be executed again */
|
|
960
|
+
for (const actionParameterInfo of actionParameterInfos) {
|
|
961
|
+
const fieldId = actionParameterInfo.field.getId();
|
|
962
|
+
_removeMessagesForActionParamter(fieldId);
|
|
963
|
+
}
|
|
991
964
|
// show footer as per UX guidelines when dialog is not open
|
|
992
965
|
(_oDialog$getBindingCo = oDialog.getBindingContext("internal")) === null || _oDialog$getBindingCo === void 0 ? void 0 : _oDialog$getBindingCo.setProperty("isCreateDialogOpen", false);
|
|
993
966
|
oDialog.destroy();
|
|
@@ -995,15 +968,25 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
995
968
|
}
|
|
996
969
|
});
|
|
997
970
|
aFormElements = oDialogContent === null || oDialogContent === void 0 ? void 0 : oDialogContent.getAggregation("form").getAggregation("formContainers")[0].getAggregation("formElements");
|
|
971
|
+
const actionParameterInfos = aFormElements.map(parameterField => {
|
|
972
|
+
const field = parameterField.getFields()[0];
|
|
973
|
+
const isMultiValue = field.isA("sap.ui.mdc.MultiValueField");
|
|
974
|
+
return {
|
|
975
|
+
parameter: parameterField,
|
|
976
|
+
isMultiValue: isMultiValue,
|
|
977
|
+
field: field,
|
|
978
|
+
value: isMultiValue ? field.getItems() : field.getValue(),
|
|
979
|
+
validationPromise: undefined,
|
|
980
|
+
hasError: false
|
|
981
|
+
};
|
|
982
|
+
});
|
|
998
983
|
if (oParentControl && oParentControl.addDependent) {
|
|
999
984
|
// if there is a parent control specified add the dialog as dependent
|
|
1000
985
|
oParentControl.addDependent(oDialog);
|
|
1001
986
|
}
|
|
1002
|
-
oCreateButton = oDialog.getBeginButton();
|
|
1003
987
|
oDialog.setBindingContext(oTransientContext);
|
|
1004
988
|
try {
|
|
1005
989
|
await CommonUtils.setUserDefaults(appComponent, aImmutableFields, oTransientContext, false, mParameters.createAction, mParameters.data);
|
|
1006
|
-
validateRequiredProperties();
|
|
1007
990
|
// footer must not be visible when the dialog is open as per UX guidelines
|
|
1008
991
|
oDialog.getBindingContext("internal").setProperty("isCreateDialogOpen", true);
|
|
1009
992
|
oDialog.open();
|
|
@@ -1122,4 +1105,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1122
1105
|
const singleton = new TransactionHelper();
|
|
1123
1106
|
return singleton;
|
|
1124
1107
|
}, false);
|
|
1125
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJQcm9ncmFtbWluZ01vZGVsIiwiVmFsdWVTdGF0ZSIsImNvcmVMaWJyYXJ5IiwiZ2V0UGFyYW1ldGVycyIsIm1QYXJhbWV0ZXJzIiwiZ2V0TWV0YWRhdGEiLCJnZXROYW1lIiwiVHJhbnNhY3Rpb25IZWxwZXIiLCJidXN5TG9jayIsImFwcENvbXBvbmVudCIsImJ1c3lQYXRoIiwiQnVzeUxvY2tlciIsImxvY2siLCJnZXRNb2RlbCIsImJ1c3lVbmxvY2siLCJ1bmxvY2siLCJnZXRQcm9ncmFtbWluZ01vZGVsIiwic291cmNlIiwicGF0aCIsImlzQSIsImdldFBhdGgiLCJpc1JlbGF0aXZlIiwiZ2V0UmVzb2x2ZWRQYXRoIiwibWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiTW9kZWxIZWxwZXIiLCJpc0RyYWZ0U3VwcG9ydGVkIiwiRHJhZnQiLCJpc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJTdGlja3kiLCJOb25EcmFmdCIsInZhbGlkYXRlRG9jdW1lbnQiLCJvQ29udGV4dCIsIm9WaWV3Iiwic0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiIsImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiIsInNNb2R1bGUiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsInJlcGxhY2UiLCJzRnVuY3Rpb25OYW1lIiwibGVuZ3RoIiwibURhdGEiLCJkYXRhIiwiRlBNSGVscGVyIiwidmFsaWRhdGlvbldyYXBwZXIiLCJQcm9taXNlIiwicmVzb2x2ZSIsImNyZWF0ZURvY3VtZW50Iiwib01haW5MaXN0QmluZGluZyIsIm1JblBhcmFtZXRlcnMiLCJtZXNzYWdlSGFuZGxlciIsImZyb21Db3B5UGFzdGUiLCJvTW9kZWwiLCJvTWV0YU1vZGVsIiwic01ldGFQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRIZWFkZXJDb250ZXh0Iiwic0NyZWF0ZUhhc2giLCJnZXRSb3V0ZXJQcm94eSIsImdldEhhc2giLCJvQ29tcG9uZW50RGF0YSIsImdldENvbXBvbmVudERhdGEiLCJvU3RhcnR1cFBhcmFtZXRlcnMiLCJzdGFydHVwUGFyYW1ldGVycyIsInNOZXdBY3Rpb24iLCJfZ2V0TmV3QWN0aW9uIiwidW5kZWZpbmVkIiwibUJpbmRpbmdQYXJhbWV0ZXJzIiwiJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cyIsInNNZXNzYWdlc1BhdGgiLCJnZXRPYmplY3QiLCJzQnVzeVBhdGgiLCJnZXRUYXJnZXRFbnRpdHlTZXQiLCJnZXRDb250ZXh0IiwiYkZ1bmN0aW9uT25OYXZQcm9wIiwib05ld0RvY3VtZW50Q29udGV4dCIsIkVycm9yIiwic1Byb2dyYW1taW5nTW9kZWwiLCJidXN5TW9kZSIsImJ1c3lJZCIsImJlZm9yZUNyZWF0ZUNhbGxCYWNrIiwib1Jlc291cmNlQnVuZGxlQ29yZSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJvUmVzdWx0IiwiY2FsbEFjdGlvbiIsImNvbnRleHRzIiwic2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyIsImxhYmVsIiwiX2dldFNwZWNpZmljQ3JlYXRlQWN0aW9uRGlhbG9nTGFiZWwiLCJiaW5kaW5nUGFyYW1ldGVycyIsInBhcmVudENvbnRyb2wiLCJiSXNDcmVhdGVBY3Rpb24iLCJza2lwUGFyYW1ldGVyRGlhbG9nIiwiYklzTmV3UGFnZUNyZWF0aW9uIiwiY3JlYXRpb25Nb2RlIiwiQ3JlYXRpb25Sb3ciLCJJbmxpbmUiLCJhTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzIiwiZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzIiwic0Z1bmN0aW9uUGF0aCIsIm9GdW5jdGlvbkNvbnRleHQiLCJvRnVuY3Rpb24iLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIm9EYXRhIiwiJElzQm91bmQiLCJvcGVyYXRpb25zIiwiY2FsbEJvdW5kRnVuY3Rpb24iLCJjYWxsRnVuY3Rpb25JbXBvcnQiLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsIk9iamVjdCIsImFzc2lnbiIsIl9sYXVuY2hEaWFsb2dXaXRoS2V5RmllbGRzIiwibmV3Q29udGV4dCIsInRvRVM2UHJvbWlzZSIsImNvbnRleHRQYXRoIiwiY3JlYXRlIiwiY3JlYXRlQXRFbmQiLCJpbmFjdGl2ZSIsIm9uQWZ0ZXJDcmVhdGVDb21wbGV0aW9uIiwic2hvd01lc3NhZ2VEaWFsb2ciLCJjb250cm9sIiwiQ29uc3RhbnRzIiwiQWN0aW9uRXhlY3V0aW9uRmFpbGVkIiwiQ2FuY2VsQWN0aW9uRGlhbG9nIiwiaXNUcmFuc2llbnQiLCJkZWxldGUiLCJfaXNEcmFmdEVuYWJsZWQiLCJ2Q29udGV4dHMiLCJjb250ZXh0Rm9yRHJhZnRNb2RlbCIsImRlbGV0ZURvY3VtZW50IiwicmVzb3VyY2VNb2RlbCIsInJlc291cmNlQnVuZGxlQ29yZSIsImFQYXJhbXMiLCJjb250ZXh0c1RvRGVsZXRlIiwiQXJyYXkiLCJpc0FycmF5IiwicmVqZWN0IiwiZHJhZnRFbmFibGVkIiwic2VsZWN0ZWRDb250ZXh0cyIsIml0ZW1zIiwib3B0aW9ucyIsIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyIsImxvY2tlZENvbnRleHQiLCJmaW5kIiwiY29udGV4dCIsImNvbnRleHREYXRhIiwiSXNBY3RpdmVFbnRpdHkiLCJIYXNEcmFmdEVudGl0eSIsIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhIiwiSW5Qcm9jZXNzQnlVc2VyIiwiRHJhZnRJc0NyZWF0ZWRCeU1lIiwibG9ja2luZ1VzZXJOYW1lIiwiTWVzc2FnZUJveCIsInNob3ciLCJnZXRUZXh0IiwidGl0bGUiLCJvbkNsb3NlIiwibm9uVGFibGVUeHQiLCJkZXNjcmlwdGlvbiIsImVudGl0eVNldE5hbWUiLCJwdXNoIiwidHlwZSIsInRleHQiLCJzZWxlY3RlZCIsInRvdGFsRGVsZXRhYmxlIiwiZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZSIsImRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUiLCJ1blNhdmVkQ29udGV4dHMiLCJjcmVhdGVNb2RlQ29udGV4dHMiLCJkZWxldGVIZWxwZXIiLCJ1cGRhdGVEcmFmdE9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyIsIm5vbkRlbGV0YWJsZVRleHQiLCJnZXROb25EZWxldGFibGVUZXh0IiwidXBkYXRlT3B0aW9uc0ZvckRlbGV0YWJsZVRleHRzIiwidXBkYXRlQ29udGVudEZvckRlbGV0ZURpYWxvZyIsInZCb3giLCJWQm94Iiwic1RpdGxlIiwiZm5Db25maXJtIiwiZGVsZXRlQ29uZmlybUhhbmRsZXIiLCJkaWFsb2dDb25maXJtZWQiLCJvRGlhbG9nIiwiRGlhbG9nIiwic3RhdGUiLCJjb250ZW50IiwiYXJpYUxhYmVsbGVkQnkiLCJiZWdpbkJ1dHRvbiIsIkJ1dHRvbiIsInByZXNzIiwibWVzc2FnZUhhbmRsaW5nIiwicmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJjbG9zZSIsImVuZEJ1dHRvbiIsImFmdGVyQ2xvc2UiLCJkZXN0cm95Iiwibm9EaWFsb2ciLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsImVkaXREb2N1bWVudCIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsIm9OZXdDb250ZXh0IiwiZHJhZnQiLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsImJQcmVzZXJ2ZUNoYW5nZXMiLCJzdGlja3kiLCJlZGl0RG9jdW1lbnRJblN0aWNreVNlc3Npb24iLCJlcnIiLCJzaG93TWVzc2FnZXMiLCJjb25jdXJyZW50RWRpdEZsYWciLCJjYW5jZWxEb2N1bWVudCIsImlzTmV3T2JqZWN0IiwiaXNPYmplY3RNb2RpZmllZCIsInJldHVybmVkVmFsdWUiLCJkcmFmdERhdGFDb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJkcmFmdEFkbWluRGF0YSIsInJlcXVlc3RPYmplY3QiLCJDcmVhdGlvbkRhdGVUaW1lIiwiTGFzdENoYW5nZURhdGVUaW1lIiwic2tpcERpc2NhcmRQb3BvdmVyIiwiX2NvbmZpcm1EaXNjYXJkIiwiY2FuY2VsQnV0dG9uIiwiaXNLZWVwQWxpdmUiLCJzZXRLZWVwQWxpdmUiLCJiZWZvcmVDYW5jZWxDYWxsQmFjayIsImhhc1BlbmRpbmdDaGFuZ2VzIiwiZ2V0QmluZGluZyIsInJlc2V0Q2hhbmdlcyIsImRlbGV0ZURyYWZ0Iiwib1NpYmxpbmdDb250ZXh0Iiwic0Nhbm9uaWNhbFBhdGgiLCJyZXF1ZXN0Q2Fub25pY2FsUGF0aCIsImRpc2NhcmRlZENvbnRleHQiLCJkaXNjYXJkRG9jdW1lbnQiLCJyZWZyZXNoIiwic2F2ZURvY3VtZW50IiwiZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciIsImJpbmRpbmdzRm9yU2lkZUVmZmVjdHMiLCJvQWN0aXZlRG9jdW1lbnQiLCJhY3RpdmF0ZURvY3VtZW50IiwibWVzc2FnZXNSZWNlaXZlZCIsImdldE1lc3NhZ2VzIiwiY29uY2F0IiwiTWVzc2FnZVR5cGUiLCJTdWNjZXNzIiwiTWVzc2FnZVRvYXN0IiwiZm9yRWFjaCIsImxpc3RCaW5kaW5nIiwiQ29tbW9uVXRpbHMiLCJoYXNUcmFuc2llbnRDb250ZXh0IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5Iiwic0FjdGlvbk5hbWUiLCJjb250ZXh0VG9Qcm9jZXNzIiwic05hbWUiLCJzcGxpdCIsIm1vZGVsIiwibVNpZGVFZmZlY3RzUGFyYW1ldGVycyIsImdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMiLCJjYWxsQm91bmRBY3Rpb24iLCJwYXJhbWV0ZXJWYWx1ZXMiLCJpbnZvY2F0aW9uR3JvdXBpbmciLCJhZGRpdGlvbmFsU2lkZUVmZmVjdCIsIm9uU3VibWl0dGVkIiwib25SZXNwb25zZSIsImNvbnRyb2xJZCIsImludGVybmFsTW9kZWxDb250ZXh0Iiwib3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiYkdldEJvdW5kQ29udGV4dCIsImJPYmplY3RQYWdlIiwiZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uIiwic2VsZWN0ZWRJdGVtcyIsImNhbGxBY3Rpb25JbXBvcnQiLCJfaGFuZGxlQWN0aW9uUmVzcG9uc2UiLCJhVHJhbnNpZW50TWVzc2FnZXMiLCJhY3Rpb25OYW1lIiwic2V0UHJvcGVydHkiLCJieUlkIiwiaGFuZGxlVmFsaWRhdGlvbkVycm9yIiwib01lc3NhZ2VNYW5hZ2VyIiwiZ2V0TWVzc2FnZU1hbmFnZXIiLCJlcnJvclRvUmVtb3ZlIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImZpbHRlciIsInZhbGlkYXRpb24iLCJyZW1vdmVNZXNzYWdlcyIsIl9jcmVhdGVQb3BvdmVyIiwic2V0dGluZ3MiLCJQb3BvdmVyIiwiaXNNb2RpZmllZCIsInNldEVuYWJsZWQiLCJjb25maXJtYXRpb25Qb3BvdmVyIiwic2hvd0hlYWRlciIsInBsYWNlbWVudCIsIlRleHQiLCJjb25maXJtQnV0dG9uIiwid2lkdGgiLCJhZGRDb250ZW50IiwiYXR0YWNoQmVmb3JlT3BlbiIsInNldEluaXRpYWxGb2N1cyIsImF0dGFjaEFmdGVyQ2xvc2UiLCJvcGVuQnkiLCJfb25GaWVsZENoYW5nZSIsIm9FdmVudCIsIm9DcmVhdGVCdXR0b24iLCJmblZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzIiwib0ZpZWxkIiwiZ2V0U291cmNlIiwib0ZpZWxkUHJvbWlzZSIsImdldFBhcmFtZXRlciIsInRoZW4iLCJ2YWx1ZSIsInNldFZhbHVlIiwiZ2V0VmFsdWUiLCJjYXRjaCIsIm9MaXN0QmluZGluZyIsIm1GaWVsZHMiLCJvUGFyZW50Q29udHJvbCIsIm9UcmFuc2llbnRMaXN0QmluZGluZyIsImJpbmRMaXN0IiwiJCR1cGRhdGVHcm91cElkIiwicmVmcmVzaEludGVybmFsIiwib1RyYW5zaWVudENvbnRleHQiLCJzRnJhZ21lbnROYW1lIiwib0ZyYWdtZW50IiwiWE1MVGVtcGxhdGVQcm9jZXNzb3IiLCJsb2FkVGVtcGxhdGUiLCJnZXRSZXNvdXJjZU1vZGVsIiwiYUltbXV0YWJsZUZpZWxkcyIsInNQYXRoIiwib0VudGl0eVNldENvbnRleHQiLCJpIiwib0ltbXV0YWJsZUN0eE1vZGVsIiwiSlNPTk1vZGVsIiwib0ltbXV0YWJsZUN0eCIsImFSZXF1aXJlZFByb3BlcnRpZXMiLCJnZXRSZXF1aXJlZFByb3BlcnRpZXNGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zIiwib1JlcXVpcmVkUHJvcGVydHlQYXRoc0N0eE1vZGVsIiwib1JlcXVpcmVkUHJvcGVydHlQYXRoc0N0eCIsIm9OZXdGcmFnbWVudCIsIlhNTFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJuYW1lIiwiYmluZGluZ0NvbnRleHRzIiwiZW50aXR5U2V0IiwiZmllbGRzIiwicmVxdWlyZWRQcm9wZXJ0aWVzIiwibW9kZWxzIiwiYUZvcm1FbGVtZW50cyIsIm1GaWVsZFZhbHVlTWFwIiwidmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMiLCJiRW5hYmxlZCIsImFSZXN1bHRzIiwiYWxsIiwibWFwIiwib0Zvcm1FbGVtZW50IiwiZ2V0RmllbGRzIiwiZ2V0UmVxdWlyZWQiLCJnZXRWYWx1ZVN0YXRlIiwic0ZpZWxkSWQiLCJnZXRJZCIsInZWYWx1ZSIsImV2ZXJ5Iiwib0NvbnRyb2xsZXIiLCJoYW5kbGVDaGFuZ2UiLCJoYW5kbGVMaXZlQ2hhbmdlIiwib0RpYWxvZ0NvbnRlbnQiLCJGcmFnbWVudCIsImxvYWQiLCJkZWZpbml0aW9uIiwiY29udHJvbGxlciIsImNsb3NlRGlhbG9nIiwicmVzcG9uc2UiLCJnZW5lcmF0ZSIsImNyZWF0ZUJ1dHRvbiIsImJJc0NyZWF0ZURpYWxvZyIsImFWYWx1ZXMiLCJrZXlzIiwic0tleSIsIm9WYWx1ZSIsIm9EaWFsb2dWYWx1ZSIsImNyZWF0ZVBhcmFtZXRlcnMiLCJ0cmFuc2llbnREYXRhIiwiY3JlYXRlRGF0YSIsInNQcm9wZXJ0eVBhdGgiLCJvUHJvcGVydHkiLCIka2luZCIsIm9Qcm9taXNlIiwib1Jlc3BvbnNlIiwiYktlZXBEaWFsb2dPcGVuIiwic2V0QmluZGluZ0NvbnRleHQiLCJDcmVhdGlvbkZhaWxlZCIsImdldEJpbmRpbmdDb250ZXh0IiwiZ2V0QWdncmVnYXRpb24iLCJhZGREZXBlbmRlbnQiLCJnZXRCZWdpbkJ1dHRvbiIsInNldFVzZXJEZWZhdWx0cyIsImNyZWF0ZUFjdGlvbiIsImZuUmVzb2x2ZSIsImZuQ3JlYXRlQ29tcGxldGVkIiwiYlN1Y2Nlc3MiLCJkZXRhY2hDcmVhdGVDb21wbGV0ZWQiLCJmblNhZmVDb250ZXh0Q3JlYXRlZCIsImNyZWF0ZWQiLCJ0cmFjZSIsImNvbnRleHRFcnJvciIsImF0dGFjaENyZWF0ZUNvbXBsZXRlZCIsImtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQiLCJnZXRVcGRhdGVHcm91cElkIiwicHJlZmVycmVkTW9kZSIsInRvVXBwZXJDYXNlIiwiaW5kZXhPZiIsInNQcmVmZXJyZWRNb2RlIiwic3Vic3RyIiwiZm5HZXRMYWJlbEZyb21MaW5lSXRlbUFubm90YXRpb24iLCJpTGluZUl0ZW1JbmRleCIsImZpbmRJbmRleCIsIm9MaW5lSXRlbSIsImFMaW5lSXRlbUFjdGlvbiIsIkFjdGlvbiIsIkxhYmVsIiwic2luZ2xldG9uIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJUcmFuc2FjdGlvbkhlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBvcGVyYXRpb25zIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9vcGVyYXRpb25zXCI7XG5pbXBvcnQgc3RpY2t5IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9zdGlja3lcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2VIYW5kbGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgZGVsZXRlSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0RlbGV0ZUhlbHBlclwiO1xuaW1wb3J0IEZQTUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9GUE1IZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyBnZXRSZXNvdXJjZU1vZGVsIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUmVzb3VyY2VNb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TdGFibGVJZEhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IE1lc3NhZ2VUb2FzdCBmcm9tIFwic2FwL20vTWVzc2FnZVRvYXN0XCI7XG5pbXBvcnQgUG9wb3ZlciwgeyAkUG9wb3ZlclNldHRpbmdzIH0gZnJvbSBcInNhcC9tL1BvcG92ZXJcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgVkJveCBmcm9tIFwic2FwL20vVkJveFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBGcmFnbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRnJhZ21lbnRcIjtcbmltcG9ydCBjb3JlTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgWE1MVGVtcGxhdGVQcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL1hNTFRlbXBsYXRlUHJvY2Vzc29yXCI7XG5pbXBvcnQgdHlwZSBCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgeyBnZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMsIGdldFJlcXVpcmVkUHJvcGVydGllc0Zyb21JbnNlcnRSZXN0cmljdGlvbnMgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9NZXRhTW9kZWxGdW5jdGlvblwiO1xuaW1wb3J0IHRvRVM2UHJvbWlzZSBmcm9tIFwiLi4vLi4vaGVscGVycy9Ub0VTNlByb21pc2VcIjtcblxuY29uc3QgQ3JlYXRpb25Nb2RlID0gRkVMaWJyYXJ5LkNyZWF0aW9uTW9kZTtcbmNvbnN0IFByb2dyYW1taW5nTW9kZWwgPSBGRUxpYnJhcnkuUHJvZ3JhbW1pbmdNb2RlbDtcbmNvbnN0IFZhbHVlU3RhdGUgPSBjb3JlTGlicmFyeS5WYWx1ZVN0YXRlO1xuLyogTWFrZSBzdXJlIHRoYXQgdGhlIG1QYXJhbWV0ZXJzIGlzIG5vdCB0aGUgb0V2ZW50ICovXG5mdW5jdGlvbiBnZXRQYXJhbWV0ZXJzKG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0aWYgKG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmdldE1ldGFkYXRhICYmIG1QYXJhbWV0ZXJzLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpID09PSBcInNhcC51aS5iYXNlLkV2ZW50XCIpIHtcblx0XHRtUGFyYW1ldGVycyA9IHt9O1xuXHR9XG5cdHJldHVybiBtUGFyYW1ldGVycyB8fCB7fTtcbn1cblxuY2xhc3MgVHJhbnNhY3Rpb25IZWxwZXIge1xuXHRidXN5TG9jayhhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgYnVzeVBhdGg/OiBzdHJpbmcpIHtcblx0XHRCdXN5TG9ja2VyLmxvY2soYXBwQ29tcG9uZW50LmdldE1vZGVsKFwidWlcIiksIGJ1c3lQYXRoKTtcblx0fVxuXG5cdGJ1c3lVbmxvY2soYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsIGJ1c3lQYXRoPzogc3RyaW5nKSB7XG5cdFx0QnVzeUxvY2tlci51bmxvY2soYXBwQ29tcG9uZW50LmdldE1vZGVsKFwidWlcIiksIGJ1c3lQYXRoKTtcblx0fVxuXG5cdGdldFByb2dyYW1taW5nTW9kZWwoc291cmNlOiBPRGF0YVY0Q29udGV4dCB8IEJpbmRpbmcpOiB0eXBlb2YgUHJvZ3JhbW1pbmdNb2RlbCB7XG5cdFx0bGV0IHBhdGg6IHN0cmluZztcblx0XHRpZiAoc291cmNlLmlzQTxPRGF0YVY0Q29udGV4dD4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFwiKSkge1xuXHRcdFx0cGF0aCA9IHNvdXJjZS5nZXRQYXRoKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHBhdGggPSAoc291cmNlLmlzUmVsYXRpdmUoKSA/IHNvdXJjZS5nZXRSZXNvbHZlZFBhdGgoKSA6IHNvdXJjZS5nZXRQYXRoKCkpID8/IFwiXCI7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gc291cmNlLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdFx0aWYgKE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsLCBwYXRoKSkge1xuXHRcdFx0cmV0dXJuIFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cdFx0fSBlbHNlIGlmIChNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQobWV0YU1vZGVsKSkge1xuXHRcdFx0cmV0dXJuIFByb2dyYW1taW5nTW9kZWwuU3RpY2t5O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gUHJvZ3JhbW1pbmdNb2RlbC5Ob25EcmFmdDtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVmFsaWRhdGVzIGEgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSB2YWxpZGF0ZWRcblx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gQ2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmRhdGFdIEEgbWFwIG9mIGRhdGEgdGhhdCBzaG91bGQgYmUgdmFsaWRhdGVkXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhdGggdG8gdGhlIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0ICogQHBhcmFtIG9WaWV3IENvbnRhaW5zIHRoZSBvYmplY3Qgb2YgdGhlIGN1cnJlbnQgdmlld1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggcmVzdWx0IG9mIHRoZSBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvblxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHR2YWxpZGF0ZURvY3VtZW50KG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCwgbVBhcmFtZXRlcnM6IGFueSwgb1ZpZXc6IFZpZXcpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gPSBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5jdXN0b21WYWxpZGF0aW9uRnVuY3Rpb247XG5cdFx0aWYgKHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24pIHtcblx0XHRcdGNvbnN0IHNNb2R1bGUgPSBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLnN1YnN0cmluZygwLCBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLmxhc3RJbmRleE9mKFwiLlwiKSB8fCAtMSkucmVwbGFjZSgvXFwuL2dpLCBcIi9cIiksXG5cdFx0XHRcdHNGdW5jdGlvbk5hbWUgPSBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLnN1YnN0cmluZyhcblx0XHRcdFx0XHRzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLmxhc3RJbmRleE9mKFwiLlwiKSArIDEsXG5cdFx0XHRcdFx0c0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbi5sZW5ndGhcblx0XHRcdFx0KSxcblx0XHRcdFx0bURhdGEgPSBtUGFyYW1ldGVycy5kYXRhO1xuXHRcdFx0ZGVsZXRlIG1EYXRhW1wiQCR1aTUuY29udGV4dC5pc1RyYW5zaWVudFwiXTtcblx0XHRcdHJldHVybiBGUE1IZWxwZXIudmFsaWRhdGlvbldyYXBwZXIoc01vZHVsZSwgc0Z1bmN0aW9uTmFtZSwgbURhdGEsIG9WaWV3LCBvQ29udGV4dCk7XG5cdFx0fVxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSBvTWFpbkxpc3RCaW5kaW5nIE9EYXRhIFY0IExpc3RCaW5kaW5nIG9iamVjdFxuXHQgKiBAcGFyYW0gW21JblBhcmFtZXRlcnNdIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBbbUluUGFyYW1ldGVycy5kYXRhXSBBIG1hcCBvZiBkYXRhIHRoYXQgc2hvdWxkIGJlIHNlbnQgd2l0aGluIHRoZSBQT1NUXG5cdCAqIEBwYXJhbSBbbUluUGFyYW1ldGVycy5idXN5TW9kZV0gR2xvYmFsIChkZWZhdWx0KSwgTG9jYWwsIE5vbmUgVE9ETzogdG8gYmUgcmVmYWN0b3JlZFxuXHQgKiBAcGFyYW0gW21JblBhcmFtZXRlcnMuYnVzeUlkXSBJRCBvZiB0aGUgbG9jYWwgYnVzeSBpbmRpY2F0b3Jcblx0ICogQHBhcmFtIFttSW5QYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWRdIElmIHNldCwgdGhlIGNvbnRleHQgc3RheXMgaW4gdGhlIGxpc3QgaWYgdGhlIFBPU1QgZmFpbGVkIGFuZCBQT1NUIHdpbGwgYmUgcmVwZWF0ZWQgd2l0aCB0aGUgbmV4dCBjaGFuZ2Vcblx0ICogQHBhcmFtIFttSW5QYXJhbWV0ZXJzLmluYWN0aXZlXSBJZiBzZXQsIHRoZSBjb250ZXh0IGlzIHNldCBhcyBpbmFjdGl2ZSBmb3IgZW1wdHkgcm93c1xuXHQgKiBAcGFyYW0gW21JblBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZ10gU2tpcHMgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEBwYXJhbSBmcm9tQ29weVBhc3RlIFRydWUgaWYgdGhlIGNyZWF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBhIHBhc3RlIGFjdGlvblxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggbmV3IGJpbmRpbmcgY29udGV4dFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVEb2N1bWVudChcblx0XHRvTWFpbkxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdG1JblBhcmFtZXRlcnM6XG5cdFx0XHR8IHtcblx0XHRcdFx0XHRkYXRhPzogYW55O1xuXHRcdFx0XHRcdGJ1c3lNb2RlPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGJ1c3lJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ/OiBib29sZWFuO1xuXHRcdFx0XHRcdGluYWN0aXZlPzogYm9vbGVhbjtcblx0XHRcdCAgfVxuXHRcdFx0fCB1bmRlZmluZWQsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdGZyb21Db3B5UGFzdGU6IGJvb2xlYW5cblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dD4ge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9NYWluTGlzdEJpbmRpbmcuZ2V0TW9kZWwoKSxcblx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9NYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpIS5nZXRQYXRoKCkpLFxuXHRcdFx0c0NyZWF0ZUhhc2ggPSBhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5nZXRIYXNoKCksXG5cdFx0XHRvQ29tcG9uZW50RGF0YSA9IGFwcENvbXBvbmVudC5nZXRDb21wb25lbnREYXRhKCksXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMgPSAob0NvbXBvbmVudERhdGEgJiYgb0NvbXBvbmVudERhdGEuc3RhcnR1cFBhcmFtZXRlcnMpIHx8IHt9LFxuXHRcdFx0c05ld0FjdGlvbiA9ICFvTWFpbkxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKVxuXHRcdFx0XHQ/IHRoaXMuX2dldE5ld0FjdGlvbihvU3RhcnR1cFBhcmFtZXRlcnMsIHNDcmVhdGVIYXNoLCBvTWV0YU1vZGVsLCBzTWV0YVBhdGgpXG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdGNvbnN0IG1CaW5kaW5nUGFyYW1ldGVyczogYW55ID0geyAkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzOiB0cnVlIH07XG5cdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aGApO1xuXHRcdGxldCBzQnVzeVBhdGggPSBcIi9idXN5XCI7XG5cdFx0bGV0IHNGdW5jdGlvbk5hbWUgPVxuXHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRGVmYXVsdFZhbHVlc0Z1bmN0aW9uYCkgfHxcblx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFxuXHRcdFx0XHRgJHtNb2RlbEhlbHBlci5nZXRUYXJnZXRFbnRpdHlTZXQob01ldGFNb2RlbC5nZXRDb250ZXh0KHNNZXRhUGF0aCkpfUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRGVmYXVsdFZhbHVlc0Z1bmN0aW9uYFxuXHRcdFx0KTtcblx0XHRsZXQgYkZ1bmN0aW9uT25OYXZQcm9wO1xuXHRcdGxldCBvTmV3RG9jdW1lbnRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRpZiAoc0Z1bmN0aW9uTmFtZSkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EZWZhdWx0VmFsdWVzRnVuY3Rpb25gKSAmJlxuXHRcdFx0XHRNb2RlbEhlbHBlci5nZXRUYXJnZXRFbnRpdHlTZXQob01ldGFNb2RlbC5nZXRDb250ZXh0KHNNZXRhUGF0aCkpICE9PSBzTWV0YVBhdGhcblx0XHRcdCkge1xuXHRcdFx0XHRiRnVuY3Rpb25Pbk5hdlByb3AgPSB0cnVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YkZ1bmN0aW9uT25OYXZQcm9wID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRtQmluZGluZ1BhcmFtZXRlcnNbXCIkc2VsZWN0XCJdID0gc01lc3NhZ2VzUGF0aDtcblx0XHR9XG5cdFx0Y29uc3QgbVBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKG1JblBhcmFtZXRlcnMpO1xuXHRcdGlmICghb01haW5MaXN0QmluZGluZykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQmluZGluZyByZXF1aXJlZCBmb3IgbmV3IGRvY3VtZW50IGNyZWF0aW9uXCIpO1xuXHRcdH1cblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvTWFpbkxpc3RCaW5kaW5nKTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDcmVhdGUgZG9jdW1lbnQgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIik7XG5cdFx0fVxuXHRcdGlmIChtUGFyYW1ldGVycy5idXN5TW9kZSA9PT0gXCJMb2NhbFwiKSB7XG5cdFx0XHRzQnVzeVBhdGggPSBgL2J1c3lMb2NhbC8ke21QYXJhbWV0ZXJzLmJ1c3lJZH1gO1xuXHRcdH1cblx0XHRtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayA9IGZyb21Db3B5UGFzdGUgPyBudWxsIDogbVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2s7XG5cdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQsIHNCdXN5UGF0aCk7XG5cdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlQ29yZSA9IENvcmUuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0bGV0IG9SZXN1bHQ6IGFueTtcblxuXHRcdHRyeSB7XG5cdFx0XHRpZiAoc05ld0FjdGlvbikge1xuXHRcdFx0XHRvUmVzdWx0ID0gYXdhaXQgdGhpcy5jYWxsQWN0aW9uKFxuXHRcdFx0XHRcdHNOZXdBY3Rpb24sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y29udGV4dHM6IG9NYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpLFxuXHRcdFx0XHRcdFx0c2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZzogdHJ1ZSxcblx0XHRcdFx0XHRcdGxhYmVsOiB0aGlzLl9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsKG9NZXRhTW9kZWwsIHNNZXRhUGF0aCwgc05ld0FjdGlvbiwgb1Jlc291cmNlQnVuZGxlQ29yZSksXG5cdFx0XHRcdFx0XHRiaW5kaW5nUGFyYW1ldGVyczogbUJpbmRpbmdQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0cGFyZW50Q29udHJvbDogbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCxcblx0XHRcdFx0XHRcdGJJc0NyZWF0ZUFjdGlvbjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IG1QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2dcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBiSXNOZXdQYWdlQ3JlYXRpb24gPVxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93ICYmIG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLklubGluZTtcblx0XHRcdFx0Y29uc3QgYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyA9IGJJc05ld1BhZ2VDcmVhdGlvblxuXHRcdFx0XHRcdD8gZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzKG9NZXRhTW9kZWwsIHNNZXRhUGF0aCwgYXBwQ29tcG9uZW50KVxuXHRcdFx0XHRcdDogW107XG5cdFx0XHRcdHNGdW5jdGlvbk5hbWUgPSBmcm9tQ29weVBhc3RlID8gbnVsbCA6IHNGdW5jdGlvbk5hbWU7XG5cdFx0XHRcdGxldCBzRnVuY3Rpb25QYXRoLCBvRnVuY3Rpb25Db250ZXh0O1xuXHRcdFx0XHRpZiAoc0Z1bmN0aW9uTmFtZSkge1xuXHRcdFx0XHRcdC8vYm91bmQgdG8gdGhlIHNvdXJjZSBlbnRpdHk6XG5cdFx0XHRcdFx0aWYgKGJGdW5jdGlvbk9uTmF2UHJvcCkge1xuXHRcdFx0XHRcdFx0c0Z1bmN0aW9uUGF0aCA9XG5cdFx0XHRcdFx0XHRcdG9NYWluTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpICYmXG5cdFx0XHRcdFx0XHRcdGAke29NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob01haW5MaXN0QmluZGluZy5nZXRDb250ZXh0KCkuZ2V0UGF0aCgpKX0vJHtzRnVuY3Rpb25OYW1lfWA7XG5cdFx0XHRcdFx0XHRvRnVuY3Rpb25Db250ZXh0ID0gb01haW5MaXN0QmluZGluZy5nZXRDb250ZXh0KCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNGdW5jdGlvblBhdGggPVxuXHRcdFx0XHRcdFx0XHRvTWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSAmJlxuXHRcdFx0XHRcdFx0XHRgJHtvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9NYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpIS5nZXRQYXRoKCkpfS8ke3NGdW5jdGlvbk5hbWV9YDtcblx0XHRcdFx0XHRcdG9GdW5jdGlvbkNvbnRleHQgPSBvTWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3Qgb0Z1bmN0aW9uID0gc0Z1bmN0aW9uUGF0aCAmJiAob01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRnVuY3Rpb25QYXRoKSBhcyBhbnkpO1xuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0bGV0IG9EYXRhOiBhbnk7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGNvbnN0IG9Db250ZXh0ID1cblx0XHRcdFx0XHRcdFx0b0Z1bmN0aW9uICYmIG9GdW5jdGlvbi5nZXRPYmplY3QoKSAmJiBvRnVuY3Rpb24uZ2V0T2JqZWN0KClbMF0uJElzQm91bmRcblx0XHRcdFx0XHRcdFx0XHQ/IGF3YWl0IG9wZXJhdGlvbnMuY2FsbEJvdW5kRnVuY3Rpb24oc0Z1bmN0aW9uTmFtZSwgb0Z1bmN0aW9uQ29udGV4dCwgb01vZGVsKVxuXHRcdFx0XHRcdFx0XHRcdDogYXdhaXQgb3BlcmF0aW9ucy5jYWxsRnVuY3Rpb25JbXBvcnQoc0Z1bmN0aW9uTmFtZSwgb01vZGVsKTtcblx0XHRcdFx0XHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRvRGF0YSA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoYEVycm9yIHdoaWxlIGV4ZWN1dGluZyB0aGUgZnVuY3Rpb24gJHtzRnVuY3Rpb25OYW1lfWAsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRhdGEgPSBvRGF0YSA/IE9iamVjdC5hc3NpZ24oe30sIG9EYXRhLCBtUGFyYW1ldGVycy5kYXRhKSA6IG1QYXJhbWV0ZXJzLmRhdGE7XG5cdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmRhdGEpIHtcblx0XHRcdFx0XHRcdGRlbGV0ZSBtUGFyYW1ldGVycy5kYXRhW1wiQG9kYXRhLmNvbnRleHRcIl07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChhTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdG9SZXN1bHQgPSBhd2FpdCB0aGlzLl9sYXVuY2hEaWFsb2dXaXRoS2V5RmllbGRzKFxuXHRcdFx0XHRcdFx0XHRvTWFpbkxpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdFx0XHRhTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzLFxuXHRcdFx0XHRcdFx0XHRvTW9kZWwsXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0b05ld0RvY3VtZW50Q29udGV4dCA9IG9SZXN1bHQubmV3Q29udGV4dDtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrKSB7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IHRvRVM2UHJvbWlzZShcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayh7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0UGF0aDogb01haW5MaXN0QmluZGluZyAmJiBvTWFpbkxpc3RCaW5kaW5nLmdldFBhdGgoKVxuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdG9OZXdEb2N1bWVudENvbnRleHQgPSBvTWFpbkxpc3RCaW5kaW5nLmNyZWF0ZShcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZGF0YSxcblx0XHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmluYWN0aXZlXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5pbmFjdGl2ZSkge1xuXHRcdFx0XHRcdFx0XHRvUmVzdWx0ID0gYXdhaXQgdGhpcy5vbkFmdGVyQ3JlYXRlQ29tcGxldGlvbihvTWFpbkxpc3RCaW5kaW5nLCBvTmV3RG9jdW1lbnRDb250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBuZXcgZG9jdW1lbnRcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0b05ld0RvY3VtZW50Q29udGV4dCA9IG9OZXdEb2N1bWVudENvbnRleHQgfHwgb1Jlc3VsdDtcblxuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coeyBjb250cm9sOiBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sIH0pO1xuXHRcdFx0cmV0dXJuIG9OZXdEb2N1bWVudENvbnRleHQhO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHQvLyBUT0RPOiBjdXJyZW50bHksIHRoZSBvbmx5IGVycm9ycyBoYW5kbGVkIGhlcmUgYXJlIHJhaXNlZCBhcyBzdHJpbmcgLSBzaG91bGQgYmUgY2hhbmdlZCB0byBFcnJvciBvYmplY3RzXG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZyh7IGNvbnRyb2w6IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgfSk7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChlcnJvciA9PT0gRkVMaWJyYXJ5LkNvbnN0YW50cy5BY3Rpb25FeGVjdXRpb25GYWlsZWQgfHwgZXJyb3IgPT09IEZFTGlicmFyeS5Db25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nKSAmJlxuXHRcdFx0XHRvTmV3RG9jdW1lbnRDb250ZXh0Py5pc1RyYW5zaWVudCgpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gVGhpcyBpcyBhIHdvcmthcm91bmQgc3VnZ2VzdGVkIGJ5IG1vZGVsIGFzIENvbnRleHQuZGVsZXRlIHJlc3VsdHMgaW4gYW4gZXJyb3Jcblx0XHRcdFx0Ly8gVE9ETzogcmVtb3ZlIHRoZSAkZGlyZWN0IG9uY2UgbW9kZWwgcmVzb2x2ZXMgdGhpcyBpc3N1ZVxuXHRcdFx0XHQvLyB0aGlzIGxpbmUgc2hvd3MgdGhlIGV4cGVjdGVkIGNvbnNvbGUgZXJyb3IgVW5jYXVnaHQgKGluIHByb21pc2UpIEVycm9yOiBSZXF1ZXN0IGNhbmNlbGVkOiBQT1NUIFRyYXZlbDsgZ3JvdXA6IHN1Ym1pdExhdGVyXG5cdFx0XHRcdG9OZXdEb2N1bWVudENvbnRleHQuZGVsZXRlKFwiJGRpcmVjdFwiKTtcblx0XHRcdH1cblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50LCBzQnVzeVBhdGgpO1xuXHRcdH1cblx0fVxuXG5cdF9pc0RyYWZ0RW5hYmxlZCh2Q29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10pIHtcblx0XHRjb25zdCBjb250ZXh0Rm9yRHJhZnRNb2RlbCA9IHZDb250ZXh0c1swXTtcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0Rm9yRHJhZnRNb2RlbCk7XG5cdFx0cmV0dXJuIHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZSBvbmUgb3IgbXVsdGlwbGUgZG9jdW1lbnQocykuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSBjb250ZXh0cyBDb250ZXh0cyBFaXRoZXIgb25lIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMudGl0bGUgVGl0bGUgb2YgdGhlIG9iamVjdCB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5kZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0IHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyBOdW1iZXIgb2Ygb2JqZWN0cyBzZWxlY3RlZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMubm9EaWFsb2cgVG8gZGlzYWJsZSB0aGUgY29uZmlybWF0aW9uIGRpYWxvZ1xuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHBDb21wb25lbnRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWwgVGhlIHJlc291cmNlIG1vZGVsIHRvIGxvYWQgdGV4dCByZXNvdXJjZXNcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBkb2N1bWVudHMgYXJlIGRlbGV0ZWRcblx0ICovXG5cdGRlbGV0ZURvY3VtZW50KFxuXHRcdGNvbnRleHRzOiBPRGF0YVY0Q29udGV4dCB8IE9EYXRhVjRDb250ZXh0W10sXG5cdFx0bVBhcmFtZXRlcnM6IGFueSxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlclxuXHQpIHtcblx0XHRjb25zdCByZXNvdXJjZUJ1bmRsZUNvcmUgPSBDb3JlLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXHRcdGxldCBhUGFyYW1zO1xuXHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50KTtcblxuXHRcdGNvbnN0IGNvbnRleHRzVG9EZWxldGUgPSBBcnJheS5pc0FycmF5KGNvbnRleHRzKSA/IFsuLi5jb250ZXh0c10gOiBbY29udGV4dHNdO1xuXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGRyYWZ0RW5hYmxlZCA9IHRoaXMuX2lzRHJhZnRFbmFibGVkKG1QYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMgfHwgY29udGV4dHNUb0RlbGV0ZSk7XG5cdFx0XHRcdGNvbnN0IGl0ZW1zOiBhbnlbXSA9IFtdO1xuXHRcdFx0XHRjb25zdCBvcHRpb25zOiBhbnlbXSA9IFtdO1xuXG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycykge1xuXHRcdFx0XHRcdGlmICghbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzKSB7XG5cdFx0XHRcdFx0XHQvLyBub24tVGFibGVcblx0XHRcdFx0XHRcdGlmIChkcmFmdEVuYWJsZWQpIHtcblx0XHRcdFx0XHRcdFx0Ly8gQ2hlY2sgaWYgMSBvZiB0aGUgZHJhZnRzIGlzIGxvY2tlZCBieSBhbm90aGVyIHVzZXJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbG9ja2VkQ29udGV4dCA9IGNvbnRleHRzVG9EZWxldGUuZmluZCgoY29udGV4dCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNvbnRleHREYXRhID0gY29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dERhdGEuSXNBY3RpdmVFbnRpdHkgPT09IHRydWUgJiZcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRleHREYXRhLkhhc0RyYWZ0RW50aXR5ID09PSB0cnVlICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0RGF0YS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dERhdGEuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEuSW5Qcm9jZXNzQnlVc2VyICYmXG5cdFx0XHRcdFx0XHRcdFx0XHQhY29udGV4dERhdGEuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEuRHJhZnRJc0NyZWF0ZWRCeU1lXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdGlmIChsb2NrZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gU2hvdyBtZXNzYWdlIGJveCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBsb2NraW5nIHVzZXIgYW5kIHJldHVyblxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGxvY2tpbmdVc2VyTmFtZSA9IGxvY2tlZENvbnRleHQuZ2V0T2JqZWN0KCkuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEuSW5Qcm9jZXNzQnlVc2VyO1xuXHRcdFx0XHRcdFx0XHRcdE1lc3NhZ2VCb3guc2hvdyhcblx0XHRcdFx0XHRcdFx0XHRcdHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfU0lOR0xFX09CSkVDVF9MT0NLRURcIiwgW1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsb2NraW5nVXNlck5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdF0pLFxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aXRsZTogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19DT01NT05fREVMRVRFXCIpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvbkNsb3NlOiByZWplY3Rcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKG1QYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHRcdGxldCBub25UYWJsZVR4dCA9IFwiXCI7XG5cdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMudGl0bGUpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0YVBhcmFtcyA9IFttUGFyYW1ldGVycy50aXRsZSArIFwiIFwiLCBtUGFyYW1ldGVycy5kZXNjcmlwdGlvbl07XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0YVBhcmFtcyA9IFttUGFyYW1ldGVycy50aXRsZSwgXCJcIl07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0bm9uVGFibGVUeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9cIixcblx0XHRcdFx0XHRcdFx0XHRhUGFyYW1zLFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG5vblRhYmxlVHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9TSU5HVUxBUlwiLFxuXHRcdFx0XHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvcHRpb25zLnB1c2goe1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBcImRlbGV0YWJsZUNvbnRleHRzXCIsXG5cdFx0XHRcdFx0XHRcdGNvbnRleHRzOiBjb250ZXh0c1RvRGVsZXRlLFxuXHRcdFx0XHRcdFx0XHR0ZXh0OiBub25UYWJsZVR4dCxcblx0XHRcdFx0XHRcdFx0c2VsZWN0ZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGNvbnRyb2w6IFwidGV4dFwiXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gVGFibGVcblx0XHRcdFx0XHRcdGxldCB0b3RhbERlbGV0YWJsZSA9IGNvbnRleHRzVG9EZWxldGUubGVuZ3RoO1xuXG5cdFx0XHRcdFx0XHRpZiAoZHJhZnRFbmFibGVkKSB7XG5cdFx0XHRcdFx0XHRcdHRvdGFsRGVsZXRhYmxlICs9XG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZS5sZW5ndGggK1xuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUubGVuZ3RoICtcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoICtcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGVNb2RlQ29udGV4dHMubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHRkZWxldGVIZWxwZXIudXBkYXRlRHJhZnRPcHRpb25zRm9yRGVsZXRhYmxlVGV4dHMoXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dHNUb0RlbGV0ZSxcblx0XHRcdFx0XHRcdFx0XHR0b3RhbERlbGV0YWJsZSxcblx0XHRcdFx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1zLFxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnNcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5vbkRlbGV0YWJsZVRleHQgPSBkZWxldGVIZWxwZXIuZ2V0Tm9uRGVsZXRhYmxlVGV4dChtUGFyYW1ldGVycywgdG90YWxEZWxldGFibGUsIHJlc291cmNlTW9kZWwpO1xuXHRcdFx0XHRcdFx0XHRpZiAobm9uRGVsZXRhYmxlVGV4dCkge1xuXHRcdFx0XHRcdFx0XHRcdGl0ZW1zLnB1c2gobm9uRGVsZXRhYmxlVGV4dCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0ZGVsZXRlSGVscGVyLnVwZGF0ZU9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyhtUGFyYW1ldGVycywgY29udGV4dHNUb0RlbGV0ZSwgcmVzb3VyY2VNb2RlbCwgb3B0aW9ucyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ29udGVudCBvZiBEZWxldGUgRGlhbG9nXG5cdFx0XHRcdGRlbGV0ZUhlbHBlci51cGRhdGVDb250ZW50Rm9yRGVsZXRlRGlhbG9nKG9wdGlvbnMsIGl0ZW1zKTtcblx0XHRcdFx0Y29uc3QgdkJveCA9IG5ldyBWQm94KHsgaXRlbXM6IGl0ZW1zIH0pO1xuXHRcdFx0XHRjb25zdCBzVGl0bGUgPSByZXNvdXJjZUJ1bmRsZUNvcmUuZ2V0VGV4dChcIkNfQ09NTU9OX0RFTEVURVwiKTtcblxuXHRcdFx0XHRjb25zdCBmbkNvbmZpcm0gPSBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRhd2FpdCBkZWxldGVIZWxwZXIuZGVsZXRlQ29uZmlybUhhbmRsZXIoXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0XHRkcmFmdEVuYWJsZWRcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0bGV0IGRpYWxvZ0NvbmZpcm1lZCA9IGZhbHNlO1xuXHRcdFx0XHRjb25zdCBvRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHRcdFx0dGl0bGU6IHNUaXRsZSxcblx0XHRcdFx0XHRzdGF0ZTogXCJXYXJuaW5nXCIsXG5cdFx0XHRcdFx0Y29udGVudDogW3ZCb3hdLFxuXHRcdFx0XHRcdGFyaWFMYWJlbGxlZEJ5OiBpdGVtcyxcblx0XHRcdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHR0ZXh0OiByZXNvdXJjZUJ1bmRsZUNvcmUuZ2V0VGV4dChcIkNfQ09NTU9OX0RFTEVURVwiKSxcblx0XHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdGRpYWxvZ0NvbmZpcm1lZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0Zm5Db25maXJtKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0ZW5kQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdHRleHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfQ09NTU9OX0RJQUxPR19DQU5DRUxcIiksXG5cdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHQvLyBpZiBkaWFsb2cgaXMgY2xvc2VkIHVuY29uZmlybWVkIChlLmcuIHZpYSBcIkNhbmNlbFwiIG9yIEVzY2FwZSBidXR0b24pLCBlbnN1cmUgdG8gcmVqZWN0IHByb21pc2Vcblx0XHRcdFx0XHRcdGlmICghZGlhbG9nQ29uZmlybWVkKSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBhcyBhbnkpO1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMubm9EaWFsb2cpIHtcblx0XHRcdFx0XHRmbkNvbmZpcm0oKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvRGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdFx0XHRcdG9EaWFsb2cub3BlbigpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFZGl0cyBhIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBvVmlldyBDdXJyZW50IHZpZXdcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwQ29tcG9uZW50XG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggdGhlIG5ldyBkcmFmdCBjb250ZXh0IGluIGNhc2Ugb2YgZHJhZnQgcHJvZ3JhbW1pbmcgbW9kZWxcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgZWRpdERvY3VtZW50KFxuXHRcdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRvVmlldzogVmlldyxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXJcblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gYWN0aXZlIGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpO1xuXHRcdH1cblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IGlzIG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpO1xuXHRcdH1cblx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0Ly8gYmVmb3JlIHRyaWdnZXJpbmcgdGhlIGVkaXQgYWN0aW9uIHdlJ2xsIGhhdmUgdG8gcmVtb3ZlIGFsbCBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzXG5cdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgb05ld0NvbnRleHQgPVxuXHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdFxuXHRcdFx0XHRcdD8gYXdhaXQgZHJhZnQuY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQob0NvbnRleHQsIGFwcENvbXBvbmVudCwge1xuXHRcdFx0XHRcdFx0XHRiUHJlc2VydmVDaGFuZ2VzOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRvVmlldzogb1ZpZXdcblx0XHRcdFx0XHQgIH0gYXMgYW55KVxuXHRcdFx0XHRcdDogYXdhaXQgc3RpY2t5LmVkaXREb2N1bWVudEluU3RpY2t5U2Vzc2lvbihvQ29udGV4dCwgYXBwQ29tcG9uZW50KTtcblxuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHRcdHJldHVybiBvTmV3Q29udGV4dDtcblx0XHR9IGNhdGNoIChlcnI6IGFueSkge1xuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKHsgY29uY3VycmVudEVkaXRGbGFnOiB0cnVlIH0pO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2FuY2VsICdlZGl0JyBtb2RlIG9mIGEgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBjYW5jZWxlZCBvciBkZWxldGVkXG5cdCAqIEBwYXJhbSBbbUluUGFyYW1ldGVyc10gT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uIENhbmNlbCBCdXR0b24gb2YgdGhlIGRpc2NhcmQgcG9wb3ZlciAobWFuZGF0b3J5IGZvciBub3cpXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3ZlciBPcHRpb25hbCwgc3VwcmVzc2VzIHRoZSBkaXNjYXJkIHBvcG92ZXIgaW5jYXNlIG9mIGRyYWZ0IGFwcGxpY2F0aW9ucyB3aGlsZSBuYXZpZ2F0aW5nIG91dCBvZiBPUFxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHBDb21wb25lbnRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWwgVGhlIG1vZGVsIHRvIGxvYWQgdGV4dCByZXNvdXJjZXNcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEBwYXJhbSBpc05ld09iamVjdCBUcnVlIGlmIHdlJ3JlIHRyeWluZyB0byBjYW5jZWwgYSBuZXdseSBjcmVhdGVkIG9iamVjdFxuXHQgKiBAcGFyYW0gaXNPYmplY3RNb2RpZmllZCBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWQgYnkgdGhlIHVzZXJcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoID8/P1xuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBjYW5jZWxEb2N1bWVudChcblx0XHRvQ29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0bUluUGFyYW1ldGVyczogeyBjYW5jZWxCdXR0b246IEJ1dHRvbjsgc2tpcERpc2NhcmRQb3BvdmVyOiBib29sZWFuIH0gfCB1bmRlZmluZWQsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdFx0aXNOZXdPYmplY3Q6IGJvb2xlYW4sXG5cdFx0aXNPYmplY3RNb2RpZmllZDogYm9vbGVhblxuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0IHwgYm9vbGVhbj4ge1xuXHRcdC8vY29udGV4dCBtdXN0IGFsd2F5cyBiZSBwYXNzZWQgLSBtYW5kYXRvcnkgcGFyYW1ldGVyXG5cdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiTm8gY29udGV4dCBleGlzdHMuIFBhc3MgYSBtZWFuaW5nZnVsIGNvbnRleHRcIik7XG5cdFx0fVxuXHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRjb25zdCBtUGFyYW1ldGVycyA9IGdldFBhcmFtZXRlcnMobUluUGFyYW1ldGVycyk7XG5cdFx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5jZWwgZG9jdW1lbnQgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIik7XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHRsZXQgcmV0dXJuZWRWYWx1ZTogT0RhdGFWNENvbnRleHQgfCBib29sZWFuID0gZmFsc2U7XG5cblx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiAhaXNPYmplY3RNb2RpZmllZCkge1xuXHRcdFx0XHRjb25zdCBkcmFmdERhdGFDb250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KGAke29Db250ZXh0LmdldFBhdGgoKX0vRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFgKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0Y29uc3QgZHJhZnRBZG1pbkRhdGEgPSBhd2FpdCBkcmFmdERhdGFDb250ZXh0LnJlcXVlc3RPYmplY3QoKTtcblx0XHRcdFx0aWYgKGRyYWZ0QWRtaW5EYXRhKSB7XG5cdFx0XHRcdFx0aXNPYmplY3RNb2RpZmllZCA9IGRyYWZ0QWRtaW5EYXRhLkNyZWF0aW9uRGF0ZVRpbWUgIT09IGRyYWZ0QWRtaW5EYXRhLkxhc3RDaGFuZ2VEYXRlVGltZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCFtUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5fY29uZmlybURpc2NhcmQobVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uLCBpc09iamVjdE1vZGlmaWVkLCByZXNvdXJjZU1vZGVsKTtcblx0XHRcdH1cblx0XHRcdGlmIChvQ29udGV4dC5pc0tlZXBBbGl2ZSgpKSB7XG5cdFx0XHRcdG9Db250ZXh0LnNldEtlZXBBbGl2ZShmYWxzZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuYmVmb3JlQ2FuY2VsQ2FsbEJhY2spIHtcblx0XHRcdFx0YXdhaXQgbVBhcmFtZXRlcnMuYmVmb3JlQ2FuY2VsQ2FsbEJhY2soeyBjb250ZXh0OiBvQ29udGV4dCB9KTtcblx0XHRcdH1cblx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRpZiAoaXNOZXdPYmplY3QpIHtcblx0XHRcdFx0XHRpZiAob0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdFx0b0NvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm5lZFZhbHVlID0gYXdhaXQgZHJhZnQuZGVsZXRlRHJhZnQob0NvbnRleHQsIGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1NpYmxpbmdDb250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KGAke29Db250ZXh0LmdldFBhdGgoKX0vU2libGluZ0VudGl0eWApLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRjb25zdCBzQ2Fub25pY2FsUGF0aCA9IGF3YWl0IG9TaWJsaW5nQ29udGV4dC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpO1xuXHRcdFx0XHRcdFx0aWYgKG9Db250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRcdFx0b0NvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuZWRWYWx1ZSA9IG9Nb2RlbC5iaW5kQ29udGV4dChzQ2Fub25pY2FsUGF0aCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRcdGF3YWl0IGRyYWZ0LmRlbGV0ZURyYWZ0KG9Db250ZXh0LCBhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgZGlzY2FyZGVkQ29udGV4dCA9IGF3YWl0IHN0aWNreS5kaXNjYXJkRG9jdW1lbnQob0NvbnRleHQpO1xuXHRcdFx0XHRpZiAoZGlzY2FyZGVkQ29udGV4dCkge1xuXHRcdFx0XHRcdGlmIChkaXNjYXJkZWRDb250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRcdGRpc2NhcmRlZENvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIWlzTmV3T2JqZWN0KSB7XG5cdFx0XHRcdFx0XHRkaXNjYXJkZWRDb250ZXh0LnJlZnJlc2goKTtcblx0XHRcdFx0XHRcdHJldHVybmVkVmFsdWUgPSBkaXNjYXJkZWRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyByZW1vdmUgZXhpc3RpbmcgYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlc1xuXHRcdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHQvLyBzaG93IHVuYm91bmQgbWVzc2FnZXNcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0cmV0dXJuIHJldHVybmVkVmFsdWU7XG5cdFx0fSBjYXRjaCAoZXJyOiBhbnkpIHtcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2F2ZXMgdGhlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBzYXZlZFxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHBDb21wb25lbnRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWwgVGhlIG1vZGVsIHRvIGxvYWQgdGV4dCByZXNvdXJjZXNcblx0ICogQHBhcmFtIGV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgVHJ1ZSBpZiB3ZSBzaG91bGQgZXhlY3V0ZSBzaWRlIGVmZmVjdHMgaW4gY2FzZSBvZiBhbiBlcnJvclxuXHQgKiBAcGFyYW0gYmluZGluZ3NGb3JTaWRlRWZmZWN0cyBUaGUgbGlzdEJpbmRpbmdzIHRvIGJlIHVzZWQgZm9yIGV4ZWN1dGluZyBzaWRlIGVmZmVjdHMgb24gZXJyb3Jcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEBwYXJhbSBpc05ld09iamVjdCBUcnVlIGlmIHdlJ3JlIHRyeWluZyB0byBjYW5jZWwgYSBuZXdseSBjcmVhdGVkIG9iamVjdFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggPz8/XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIHNhdmVEb2N1bWVudChcblx0XHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRcdGV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3I6IGJvb2xlYW4sXG5cdFx0YmluZGluZ3NGb3JTaWRlRWZmZWN0czogT0RhdGFMaXN0QmluZGluZ1tdLFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0XHRpc05ld09iamVjdDogYm9vbGVhblxuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PiB7XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCk7XG5cdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSAmJiBzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiU2F2ZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uIHN1cHBvcnRlZCBzZXJ2aWNlc1wiKTtcblx0XHR9XG5cdFx0Ly8gaW4gY2FzZSBvZiBzYXZpbmcgLyBhY3RpdmF0aW5nIHRoZSBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzIHNoYWxsIGJlIHJlbW92ZWQgYmVmb3JlIHRoZSBQQVRDSC9QT1NUXG5cdFx0Ly8gaXMgc2VudCB0byB0aGUgYmFja2VuZFxuXHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdGNvbnN0IG9BY3RpdmVEb2N1bWVudCA9XG5cdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0XG5cdFx0XHRcdFx0PyBhd2FpdCBkcmFmdC5hY3RpdmF0ZURvY3VtZW50KGNvbnRleHQsIGFwcENvbXBvbmVudCwge30sIG1lc3NhZ2VIYW5kbGVyKVxuXHRcdFx0XHRcdDogYXdhaXQgc3RpY2t5LmFjdGl2YXRlRG9jdW1lbnQoY29udGV4dCwgYXBwQ29tcG9uZW50KTtcblxuXHRcdFx0Y29uc3QgbWVzc2FnZXNSZWNlaXZlZCA9IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcygpLmNvbmNhdChtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXModHJ1ZSwgdHJ1ZSkpOyAvLyBnZXQgdW5ib3VuZCBhbmQgYm91bmQgbWVzc2FnZXMgcHJlc2VudCBpbiB0aGUgbW9kZWxcblx0XHRcdGlmICghKG1lc3NhZ2VzUmVjZWl2ZWQubGVuZ3RoID09PSAxICYmIG1lc3NhZ2VzUmVjZWl2ZWRbMF0udHlwZSA9PT0gY29yZUxpYnJhcnkuTWVzc2FnZVR5cGUuU3VjY2VzcykpIHtcblx0XHRcdFx0Ly8gc2hvdyBvdXIgb2JqZWN0IGNyZWF0aW9uIHRvYXN0IG9ubHkgaWYgaXQgaXMgbm90IGNvbWluZyBmcm9tIGJhY2tlbmRcblx0XHRcdFx0TWVzc2FnZVRvYXN0LnNob3coXG5cdFx0XHRcdFx0aXNOZXdPYmplY3Rcblx0XHRcdFx0XHRcdD8gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX0NSRUFURURcIilcblx0XHRcdFx0XHRcdDogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1NBVkVEXCIpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvQWN0aXZlRG9jdW1lbnQ7XG5cdFx0fSBjYXRjaCAoZXJyOiBhbnkpIHtcblx0XHRcdGlmIChleGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yICYmIGJpbmRpbmdzRm9yU2lkZUVmZmVjdHM/Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0LyogVGhlIHNpZGVFZmZlY3RzIGFyZSBleGVjdXRlZCBvbmx5IGZvciB0YWJsZSBpdGVtcyBpbiB0cmFuc2llbnQgc3RhdGUgKi9cblx0XHRcdFx0YmluZGluZ3NGb3JTaWRlRWZmZWN0cy5mb3JFYWNoKChsaXN0QmluZGluZykgPT4ge1xuXHRcdFx0XHRcdGlmICghQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dChsaXN0QmluZGluZykpIHtcblx0XHRcdFx0XHRcdGFwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBjb250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxscyBhIGJvdW5kIG9yIHVuYm91bmQgYWN0aW9uLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHN0YXRpY1xuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlci5jYWxsQWN0aW9uXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlc10gQSBtYXAgb2YgYWN0aW9uIHBhcmFtZXRlciBuYW1lcyBhbmQgcHJvdmlkZWQgdmFsdWVzXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZ10gU2tpcHMgdGhlIHBhcmFtZXRlciBkaWFsb2cgaWYgdmFsdWVzIGFyZSBwcm92aWRlZCBmb3IgYWxsIG9mIHRoZW1cblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5jb250ZXh0c10gTWFuZGF0b3J5IGZvciBhIGJvdW5kIGFjdGlvbjogRWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMubW9kZWxdIE1hbmRhdG9yeSBmb3IgYW4gdW5ib3VuZCBhY3Rpb246IEFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIFY0IG1vZGVsXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nXSBNb2RlIGhvdyBhY3Rpb25zIGFyZSB0byBiZSBjYWxsZWQ6ICdDaGFuZ2VTZXQnIHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgJ0lzb2xhdGVkJyB0byBwdXQgdGhlbSBpbnRvIHNlcGFyYXRlIGNoYW5nZXNldHNcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5sYWJlbF0gQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHRdIElmIHNwZWNpZmllZCwgdGhlIGFjdGlvbiBwcm9taXNlIHJldHVybnMgdGhlIGJvdW5kIGNvbnRleHRcblx0ICogQHBhcmFtIG9WaWV3IENvbnRhaW5zIHRoZSBvYmplY3Qgb2YgdGhlIGN1cnJlbnQgdmlld1xuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHBDb21wb25lbnRcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiByZXNwb25zZSBvYmplY3RzIChUT0RPOiB0byBiZSBjaGFuZ2VkKVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBjYWxsQWN0aW9uKFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0bVBhcmFtZXRlcnM6IGFueSxcblx0XHRvVmlldzogVmlldyB8IG51bGwsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyXG5cdCk6IFByb21pc2U8YW55PiB7XG5cdFx0bVBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKG1QYXJhbWV0ZXJzKTtcblx0XHRsZXQgY29udGV4dFRvUHJvY2Vzcywgb01vZGVsOiBhbnk7XG5cdFx0Y29uc3QgbUJpbmRpbmdQYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMuYmluZGluZ1BhcmFtZXRlcnM7XG5cdFx0aWYgKCFzQWN0aW9uTmFtZSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiUHJvdmlkZSBuYW1lIG9mIGFjdGlvbiB0byBiZSBleGVjdXRlZFwiKTtcblx0XHR9XG5cdFx0Ly8gYWN0aW9uIGltcG9ydHMgYXJlIG5vdCBkaXJlY3RseSBvYnRhaW5lZCBmcm9tIHRoZSBtZXRhTW9kZWwgYnkgaXQgaXMgcHJlc2VudCBpbnNpZGUgdGhlIGVudGl0eUNvbnRhaW5lclxuXHRcdC8vIGFuZCB0aGUgYWNpb25zIGl0IHJlZmVycyB0byBwcmVzZW50IG91dHNpZGUgdGhlIGVudGl0eWNvbnRhaW5lciwgaGVuY2UgdG8gb2J0YWluIGtpbmQgb2YgdGhlIGFjdGlvblxuXHRcdC8vIHNwbGl0KCkgb24gaXRzIG5hbWUgd2FzIHJlcXVpcmVkXG5cdFx0Y29uc3Qgc05hbWUgPSBzQWN0aW9uTmFtZS5zcGxpdChcIi9cIilbMV07XG5cdFx0c0FjdGlvbk5hbWUgPSBzTmFtZSB8fCBzQWN0aW9uTmFtZTtcblx0XHRjb250ZXh0VG9Qcm9jZXNzID0gc05hbWUgPyB1bmRlZmluZWQgOiBtUGFyYW1ldGVycy5jb250ZXh0cztcblx0XHQvL2NoZWNraW5nIHdoZXRoZXIgdGhlIGNvbnRleHQgaXMgYW4gYXJyYXkgd2l0aCBtb3JlIHRoYW4gMCBsZW5ndGggb3Igbm90IGFuIGFycmF5KGNyZWF0ZSBhY3Rpb24pXG5cdFx0aWYgKGNvbnRleHRUb1Byb2Nlc3MgJiYgKChBcnJheS5pc0FycmF5KGNvbnRleHRUb1Byb2Nlc3MpICYmIGNvbnRleHRUb1Byb2Nlc3MubGVuZ3RoKSB8fCAhQXJyYXkuaXNBcnJheShjb250ZXh0VG9Qcm9jZXNzKSkpIHtcblx0XHRcdGNvbnRleHRUb1Byb2Nlc3MgPSBBcnJheS5pc0FycmF5KGNvbnRleHRUb1Byb2Nlc3MpID8gY29udGV4dFRvUHJvY2Vzc1swXSA6IGNvbnRleHRUb1Byb2Nlc3M7XG5cdFx0XHRvTW9kZWwgPSBjb250ZXh0VG9Qcm9jZXNzLmdldE1vZGVsKCk7XG5cdFx0fVxuXHRcdGlmIChtUGFyYW1ldGVycy5tb2RlbCkge1xuXHRcdFx0b01vZGVsID0gbVBhcmFtZXRlcnMubW9kZWw7XG5cdFx0fVxuXHRcdGlmICghb01vZGVsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJQYXNzIGEgY29udGV4dCBmb3IgYSBib3VuZCBhY3Rpb24gb3IgcGFzcyB0aGUgbW9kZWwgZm9yIGFuIHVuYm91bmQgYWN0aW9uXCIpO1xuXHRcdH1cblx0XHQvLyBnZXQgdGhlIGJpbmRpbmcgcGFyYW1ldGVycyAkc2VsZWN0IGFuZCAkZXhwYW5kIGZvciB0aGUgc2lkZSBlZmZlY3Qgb24gdGhpcyBhY3Rpb25cblx0XHQvLyBhbHNvIGdhdGhlciBhZGRpdGlvbmFsIHByb3BlcnR5IHBhdGhzIHRvIGJlIHJlcXVlc3RlZCBzdWNoIGFzIHRleHQgYXNzb2NpYXRpb25zXG5cdFx0Y29uc3QgbVNpZGVFZmZlY3RzUGFyYW1ldGVycyA9IGFwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKHNBY3Rpb25OYW1lLCBjb250ZXh0VG9Qcm9jZXNzKSB8fCB7fTtcblxuXHRcdHRyeSB7XG5cdFx0XHRsZXQgb1Jlc3VsdDogYW55O1xuXHRcdFx0aWYgKGNvbnRleHRUb1Byb2Nlc3MgJiYgb01vZGVsKSB7XG5cdFx0XHRcdG9SZXN1bHQgPSBhd2FpdCBvcGVyYXRpb25zLmNhbGxCb3VuZEFjdGlvbihzQWN0aW9uTmFtZSwgbVBhcmFtZXRlcnMuY29udGV4dHMsIG9Nb2RlbCwgYXBwQ29tcG9uZW50LCB7XG5cdFx0XHRcdFx0cGFyYW1ldGVyVmFsdWVzOiBtUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXMsXG5cdFx0XHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nOiBtUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmcsXG5cdFx0XHRcdFx0bGFiZWw6IG1QYXJhbWV0ZXJzLmxhYmVsLFxuXHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IG1QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2csXG5cdFx0XHRcdFx0bUJpbmRpbmdQYXJhbWV0ZXJzOiBtQmluZGluZ1BhcmFtZXRlcnMsXG5cdFx0XHRcdFx0ZW50aXR5U2V0TmFtZTogbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSxcblx0XHRcdFx0XHRhZGRpdGlvbmFsU2lkZUVmZmVjdDogbVNpZGVFZmZlY3RzUGFyYW1ldGVycyxcblx0XHRcdFx0XHRvblN1Ym1pdHRlZDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvblJlc3BvbnNlOiAoKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHBhcmVudENvbnRyb2w6IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdFx0Y29udHJvbElkOiBtUGFyYW1ldGVycy5jb250cm9sSWQsXG5cdFx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ6IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogbVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwLFxuXHRcdFx0XHRcdGJJc0NyZWF0ZUFjdGlvbjogbVBhcmFtZXRlcnMuYklzQ3JlYXRlQWN0aW9uLFxuXHRcdFx0XHRcdGJHZXRCb3VuZENvbnRleHQ6IG1QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHQsXG5cdFx0XHRcdFx0Yk9iamVjdFBhZ2U6IG1QYXJhbWV0ZXJzLmJPYmplY3RQYWdlLFxuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb246IG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbixcblx0XHRcdFx0XHRzZWxlY3RlZEl0ZW1zOiBtUGFyYW1ldGVycy5jb250ZXh0c1xuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9SZXN1bHQgPSBhd2FpdCBvcGVyYXRpb25zLmNhbGxBY3Rpb25JbXBvcnQoc0FjdGlvbk5hbWUsIG9Nb2RlbCwgYXBwQ29tcG9uZW50LCB7XG5cdFx0XHRcdFx0cGFyYW1ldGVyVmFsdWVzOiBtUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXMsXG5cdFx0XHRcdFx0bGFiZWw6IG1QYXJhbWV0ZXJzLmxhYmVsLFxuXHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IG1QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2csXG5cdFx0XHRcdFx0YmluZGluZ1BhcmFtZXRlcnM6IG1CaW5kaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0XHRlbnRpdHlTZXROYW1lOiBtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lLFxuXHRcdFx0XHRcdG9uU3VibWl0dGVkOiAoKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvblJlc3BvbnNlOiAoKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHBhcmVudENvbnRyb2w6IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ6IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogbVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwLFxuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRiT2JqZWN0UGFnZTogbVBhcmFtZXRlcnMuYk9iamVjdFBhZ2Vcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZUFjdGlvblJlc3BvbnNlKG1lc3NhZ2VIYW5kbGVyLCBtUGFyYW1ldGVycywgc0FjdGlvbk5hbWUpO1xuXHRcdFx0cmV0dXJuIG9SZXN1bHQ7XG5cdFx0fSBjYXRjaCAoZXJyOiBhbnkpIHtcblx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZUFjdGlvblJlc3BvbnNlKG1lc3NhZ2VIYW5kbGVyLCBtUGFyYW1ldGVycywgc0FjdGlvbk5hbWUpO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIG1lc3NhZ2VzIGZvciBhY3Rpb24gY2FsbC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyI19oYW5kbGVBY3Rpb25SZXNwb25zZVxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBQYXJhbWV0ZXJzIHRvIGJlIGNvbnNpZGVyZWQgZm9yIHRoZSBhY3Rpb24uXG5cdCAqIEBwYXJhbSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIGFmdGVyIG1lc3NhZ2UgZGlhbG9nIGlzIG9wZW5lZCBpZiByZXF1aXJlZC5cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X2hhbmRsZUFjdGlvblJlc3BvbnNlKG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlciwgbVBhcmFtZXRlcnM6IGFueSwgc0FjdGlvbk5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGFUcmFuc2llbnRNZXNzYWdlcyA9IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcyh0cnVlLCB0cnVlKTtcblx0XHRjb25zdCBhY3Rpb25OYW1lID0gbVBhcmFtZXRlcnMubGFiZWwgPyBtUGFyYW1ldGVycy5sYWJlbCA6IHNBY3Rpb25OYW1lO1xuXHRcdGlmIChhVHJhbnNpZW50TWVzc2FnZXMubGVuZ3RoID4gMCAmJiBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCkge1xuXHRcdFx0bVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJzQWN0aW9uTmFtZVwiLCBtUGFyYW1ldGVycy5sYWJlbCA/IG1QYXJhbWV0ZXJzLmxhYmVsIDogc0FjdGlvbk5hbWUpO1xuXHRcdH1cblx0XHRsZXQgY29udHJvbDtcblx0XHRpZiAobVBhcmFtZXRlcnMuY29udHJvbElkKSB7XG5cdFx0XHRjb250cm9sID0gbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbC5ieUlkKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnRyb2wgPSBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sO1xuXHRcdH1cblx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKHsgc0FjdGlvbk5hbWU6IGFjdGlvbk5hbWUsIGNvbnRyb2w6IGNvbnRyb2wgfSk7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB2YWxpZGF0aW9uIGVycm9ycyBmb3IgdGhlICdEaXNjYXJkJyBhY3Rpb24uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlciNoYW5kbGVWYWxpZGF0aW9uRXJyb3Jcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBzdGF0aWNcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0aGFuZGxlVmFsaWRhdGlvbkVycm9yKCkge1xuXHRcdGNvbnN0IG9NZXNzYWdlTWFuYWdlciA9IENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKSxcblx0XHRcdGVycm9yVG9SZW1vdmUgPSBvTWVzc2FnZU1hbmFnZXJcblx0XHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAoZXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdC8vIG9ubHkgbmVlZHMgdG8gaGFuZGxlIHZhbGlkYXRpb24gbWVzc2FnZXMsIHRlY2huaWNhbCBhbmQgcGVyc2lzdGVudCBlcnJvcnMgbmVlZHMgbm90IHRvIGJlIGNoZWNrZWQgaGVyZS5cblx0XHRcdFx0XHRpZiAoZXJyb3IudmFsaWRhdGlvbikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVycm9yO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0b01lc3NhZ2VNYW5hZ2VyLnJlbW92ZU1lc3NhZ2VzKGVycm9yVG9SZW1vdmUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgUG9wb3Zlci4gRmFjdG9yeSBtZXRob2QgdG8gbWFrZSB1bml0IHRlc3RzIGVhc2llci5cblx0ICpcblx0ICogQHBhcmFtIHNldHRpbmdzIEluaXRpYWwgcGFyYW1ldGVycyBmb3IgdGhlIHBvcG92ZXJcblx0ICogQHJldHVybnMgQSBuZXcgUG9wb3ZlclxuXHQgKi9cblx0X2NyZWF0ZVBvcG92ZXIoc2V0dGluZ3M/OiAkUG9wb3ZlclNldHRpbmdzKTogUG9wb3ZlciB7XG5cdFx0cmV0dXJuIG5ldyBQb3BvdmVyKHNldHRpbmdzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTaG93cyBhIHBvcG92ZXIgdG8gY29uZmlybSBkaXNjYXJkIGlmIG5lZWRlZC5cblx0ICpcblx0ICogQHN0YXRpY1xuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlci5fc2hvd0Rpc2NhcmRQb3BvdmVyXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAcGFyYW0gY2FuY2VsQnV0dG9uIFRoZSBjb250cm9sIHdoaWNoIHdpbGwgb3BlbiB0aGUgcG9wb3ZlclxuXHQgKiBAcGFyYW0gaXNNb2RpZmllZCBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWQgYW5kIGEgY29uZmlybWF0aW9uIHBvcG92ZXIgbXVzdCBiZSBzaG93blxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIGlmIHVzZXIgY29uZmlybXMgZGlzY2FyZCwgcmVqZWN0cyBpZiBvdGhlcndpc2UsIHJlamVjdHMgaWYgbm8gY29udHJvbCBwYXNzZWQgdG8gb3BlbiBwb3BvdmVyXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9jb25maXJtRGlzY2FyZChjYW5jZWxCdXR0b246IEJ1dHRvbiwgaXNNb2RpZmllZDogYm9vbGVhbiwgcmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIElmIHRoZSBkYXRhIGlzbid0IG1vZGlmaWVkLCBkbyBub3Qgc2hvdyBhbnkgY29uZmlybWF0aW9uIHBvcG92ZXJcblx0XHRpZiAoIWlzTW9kaWZpZWQpIHtcblx0XHRcdHRoaXMuaGFuZGxlVmFsaWRhdGlvbkVycm9yKCk7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXG5cdFx0Y2FuY2VsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpO1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRjb25zdCBjb25maXJtYXRpb25Qb3BvdmVyID0gdGhpcy5fY3JlYXRlUG9wb3Zlcih7XG5cdFx0XHRcdHNob3dIZWFkZXI6IGZhbHNlLFxuXHRcdFx0XHRwbGFjZW1lbnQ6IFwiVG9wXCJcblx0XHRcdH0pO1xuXHRcdFx0Y29uZmlybWF0aW9uUG9wb3Zlci5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblxuXHRcdFx0Ly8gQ3JlYXRlIHRoZSBjb250ZW50IG9mIHRoZSBwb3BvdmVyXG5cdFx0XHRjb25zdCB0aXRsZSA9IG5ldyBUZXh0KHtcblx0XHRcdFx0dGV4dDogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfRFJBRlRfRElTQ0FSRF9NRVNTQUdFXCIpXG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGNvbmZpcm1CdXR0b24gPSBuZXcgQnV0dG9uKHtcblx0XHRcdFx0dGV4dDogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfRFJBRlRfRElTQ0FSRF9CVVRUT05cIiksXG5cdFx0XHRcdHdpZHRoOiBcIjEwMCVcIixcblx0XHRcdFx0cHJlc3M6ICgpID0+IHtcblx0XHRcdFx0XHR0aGlzLmhhbmRsZVZhbGlkYXRpb25FcnJvcigpO1xuXHRcdFx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuZGF0YShcImNvbnRpbnVlRGlzY2FyZFwiLCB0cnVlKTtcblx0XHRcdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmNsb3NlKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGFyaWFMYWJlbGxlZEJ5OiBbdGl0bGVdXG5cdFx0XHR9KTtcblx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuYWRkQ29udGVudChuZXcgVkJveCh7IGl0ZW1zOiBbdGl0bGUsIGNvbmZpcm1CdXR0b25dIH0pKTtcblxuXHRcdFx0Ly8gQXR0YWNoIGhhbmRsZXJcblx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuYXR0YWNoQmVmb3JlT3BlbigoKSA9PiB7XG5cdFx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuc2V0SW5pdGlhbEZvY3VzKGNvbmZpcm1CdXR0b24pO1xuXHRcdFx0fSk7XG5cdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmF0dGFjaEFmdGVyQ2xvc2UoKCkgPT4ge1xuXHRcdFx0XHRjYW5jZWxCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTtcblx0XHRcdFx0aWYgKGNvbmZpcm1hdGlvblBvcG92ZXIuZGF0YShcImNvbnRpbnVlRGlzY2FyZFwiKSkge1xuXHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIub3BlbkJ5KGNhbmNlbEJ1dHRvbiwgZmFsc2UpO1xuXHRcdH0pO1xuXHR9XG5cblx0X29uRmllbGRDaGFuZ2Uob0V2ZW50OiBhbnksIG9DcmVhdGVCdXR0b246IGFueSwgbWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLCBmblZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzOiBGdW5jdGlvbikge1xuXHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdGNvbnN0IG9GaWVsZCA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRjb25zdCBvRmllbGRQcm9taXNlID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInByb21pc2VcIik7XG5cdFx0aWYgKG9GaWVsZFByb21pc2UpIHtcblx0XHRcdHJldHVybiBvRmllbGRQcm9taXNlXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uICh2YWx1ZTogYW55KSB7XG5cdFx0XHRcdFx0Ly8gU2V0dGluZyB2YWx1ZSBvZiBmaWVsZCBhcyAnJyBpbiBjYXNlIG9mIHZhbHVlIGhlbHAgYW5kIHZhbGlkYXRpbmcgb3RoZXIgZmllbGRzXG5cdFx0XHRcdFx0b0ZpZWxkLnNldFZhbHVlKHZhbHVlKTtcblx0XHRcdFx0XHRmblZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzKCk7XG5cblx0XHRcdFx0XHRyZXR1cm4gb0ZpZWxkLmdldFZhbHVlKCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAodmFsdWU6IGFueSkge1xuXHRcdFx0XHRcdGlmICh2YWx1ZSAhPT0gXCJcIikge1xuXHRcdFx0XHRcdFx0Ly9kaXNhYmxpbmcgdGhlIGNvbnRpbnVlIGJ1dHRvbiBpbiBjYXNlIG9mIGludmFsaWQgdmFsdWUgaW4gZmllbGRcblx0XHRcdFx0XHRcdG9DcmVhdGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIHZhbGlkYXRpbmcgYWxsIHRoZSBmaWVsZHMgaW4gY2FzZSBvZiBlbXB0eSB2YWx1ZSBpbiBmaWVsZFxuXHRcdFx0XHRcdFx0b0ZpZWxkLnNldFZhbHVlKHZhbHVlKTtcblx0XHRcdFx0XHRcdGZuVmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdF9sYXVuY2hEaWFsb2dXaXRoS2V5RmllbGRzKFxuXHRcdG9MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRtRmllbGRzOiBhbnksXG5cdFx0b01vZGVsOiBPRGF0YU1vZGVsLFxuXHRcdG1QYXJhbWV0ZXJzOiBhbnksXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyXG5cdCkge1xuXHRcdGxldCBvRGlhbG9nOiBEaWFsb2c7XG5cdFx0Y29uc3Qgb1BhcmVudENvbnRyb2wgPSBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sO1xuXG5cdFx0Ly8gQ3JhdGUgYSBmYWtlICh0cmFuc2llbnQpIGxpc3RCaW5kaW5nIGFuZCBjb250ZXh0LCBqdXN0IGZvciB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBkaWFsb2dcblx0XHRjb25zdCBvVHJhbnNpZW50TGlzdEJpbmRpbmcgPSBvTW9kZWwuYmluZExpc3Qob0xpc3RCaW5kaW5nLmdldFBhdGgoKSwgb0xpc3RCaW5kaW5nLmdldENvbnRleHQoKSwgW10sIFtdLCB7XG5cdFx0XHQkJHVwZGF0ZUdyb3VwSWQ6IFwic3VibWl0TGF0ZXJcIlxuXHRcdH0pO1xuXHRcdG9UcmFuc2llbnRMaXN0QmluZGluZy5yZWZyZXNoSW50ZXJuYWwgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHQvKiAqL1xuXHRcdH07XG5cdFx0Y29uc3Qgb1RyYW5zaWVudENvbnRleHQgPSBvVHJhbnNpZW50TGlzdEJpbmRpbmcuY3JlYXRlKG1QYXJhbWV0ZXJzLmRhdGEsIHRydWUpO1xuXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdGNvbnN0IHNGcmFnbWVudE5hbWUgPSBcInNhcC9mZS9jb3JlL2NvbnRyb2xzL05vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkc0RpYWxvZ1wiO1xuXHRcdFx0Y29uc3Qgb0ZyYWdtZW50ID0gWE1MVGVtcGxhdGVQcm9jZXNzb3IubG9hZFRlbXBsYXRlKHNGcmFnbWVudE5hbWUsIFwiZnJhZ21lbnRcIiksXG5cdFx0XHRcdHJlc291cmNlTW9kZWwgPSBnZXRSZXNvdXJjZU1vZGVsKG9QYXJlbnRDb250cm9sKSxcblx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0YUltbXV0YWJsZUZpZWxkczogYW55W10gPSBbXSxcblx0XHRcdFx0c1BhdGggPSAob0xpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSA/IG9MaXN0QmluZGluZy5nZXRSZXNvbHZlZFBhdGgoKSA6IG9MaXN0QmluZGluZy5nZXRQYXRoKCkpIGFzIHN0cmluZyxcblx0XHRcdFx0b0VudGl0eVNldENvbnRleHQgPSBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNQYXRoKSBhcyBDb250ZXh0LFxuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYXRoKTtcblx0XHRcdGZvciAoY29uc3QgaSBpbiBtRmllbGRzKSB7XG5cdFx0XHRcdGFJbW11dGFibGVGaWVsZHMucHVzaChvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGAke3NNZXRhUGF0aH0vJHttRmllbGRzW2ldfWApKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG9JbW11dGFibGVDdHhNb2RlbCA9IG5ldyBKU09OTW9kZWwoYUltbXV0YWJsZUZpZWxkcyk7XG5cdFx0XHRjb25zdCBvSW1tdXRhYmxlQ3R4ID0gb0ltbXV0YWJsZUN0eE1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKTtcblx0XHRcdGNvbnN0IGFSZXF1aXJlZFByb3BlcnRpZXMgPSBnZXRSZXF1aXJlZFByb3BlcnRpZXNGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zKHNNZXRhUGF0aCwgb01ldGFNb2RlbCk7XG5cdFx0XHRjb25zdCBvUmVxdWlyZWRQcm9wZXJ0eVBhdGhzQ3R4TW9kZWwgPSBuZXcgSlNPTk1vZGVsKGFSZXF1aXJlZFByb3BlcnRpZXMpO1xuXHRcdFx0Y29uc3Qgb1JlcXVpcmVkUHJvcGVydHlQYXRoc0N0eCA9IG9SZXF1aXJlZFByb3BlcnR5UGF0aHNDdHhNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cdFx0XHRjb25zdCBvTmV3RnJhZ21lbnQgPSBhd2FpdCBYTUxQcmVwcm9jZXNzb3IucHJvY2Vzcyhcblx0XHRcdFx0b0ZyYWdtZW50LFxuXHRcdFx0XHR7IG5hbWU6IHNGcmFnbWVudE5hbWUgfSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFx0XHRcdFx0ZW50aXR5U2V0OiBvRW50aXR5U2V0Q29udGV4dCxcblx0XHRcdFx0XHRcdGZpZWxkczogb0ltbXV0YWJsZUN0eCxcblx0XHRcdFx0XHRcdHJlcXVpcmVkUHJvcGVydGllczogb1JlcXVpcmVkUHJvcGVydHlQYXRoc0N0eFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IG9FbnRpdHlTZXRDb250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRcdFx0XHRmaWVsZHM6IG9JbW11dGFibGVDdHguZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdG1ldGFNb2RlbDogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdHJlcXVpcmVkUHJvcGVydGllczogb1JlcXVpcmVkUHJvcGVydHlQYXRoc0N0eE1vZGVsXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHQpO1xuXG5cdFx0XHRsZXQgYUZvcm1FbGVtZW50czogYW55W10gPSBbXTtcblx0XHRcdGNvbnN0IG1GaWVsZFZhbHVlTWFwOiBhbnkgPSB7fTtcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3Rcblx0XHRcdGxldCBvQ3JlYXRlQnV0dG9uOiBCdXR0b247XG5cblx0XHRcdGNvbnN0IHZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRsZXQgYkVuYWJsZWQgPSBmYWxzZTtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRjb25zdCBhUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdFx0XHRcdFx0YUZvcm1FbGVtZW50c1xuXHRcdFx0XHRcdFx0XHQubWFwKGZ1bmN0aW9uIChvRm9ybUVsZW1lbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvRm9ybUVsZW1lbnQuZ2V0RmllbGRzKClbMF07XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKG9GaWVsZDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVGhlIGNvbnRpbnVlIGJ1dHRvbiBzaG91bGQgcmVtYWluIGRpc2FibGVkIGluIGNhc2Ugb2YgZW1wdHkgcmVxdWlyZWQgZmllbGRzLlxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvRmllbGQuZ2V0UmVxdWlyZWQoKSB8fCBvRmllbGQuZ2V0VmFsdWVTdGF0ZSgpID09PSBWYWx1ZVN0YXRlLkVycm9yO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQubWFwKGFzeW5jIGZ1bmN0aW9uIChvRmllbGQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNGaWVsZElkID0gb0ZpZWxkLmdldElkKCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNGaWVsZElkIGluIG1GaWVsZFZhbHVlTWFwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCB2VmFsdWUgPSBhd2FpdCBtRmllbGRWYWx1ZU1hcFtzRmllbGRJZF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvRmllbGQuZ2V0VmFsdWUoKSA9PT0gXCJcIiA/IHVuZGVmaW5lZCA6IHZWYWx1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0ZpZWxkLmdldFZhbHVlKCkgPT09IFwiXCIgPyB1bmRlZmluZWQgOiBvRmllbGQuZ2V0VmFsdWUoKTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGJFbmFibGVkID0gYVJlc3VsdHMuZXZlcnkoZnVuY3Rpb24gKHZWYWx1ZTogYW55KSB7XG5cdFx0XHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh2VmFsdWUpKSB7XG5cdFx0XHRcdFx0XHRcdHZWYWx1ZSA9IHZWYWx1ZVswXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJldHVybiB2VmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2VmFsdWUgIT09IG51bGwgJiYgdlZhbHVlICE9PSBcIlwiO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0XHRiRW5hYmxlZCA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9DcmVhdGVCdXR0b24uc2V0RW5hYmxlZChiRW5hYmxlZCk7XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSB7XG5cdFx0XHRcdC8qXG5cdFx0XHRcdFx0XHRcdFx0XHRmaXJlZCBvbiBmb2N1cyBvdXQgZnJvbSBmaWVsZCBvciBvbiBzZWxlY3RpbmcgYSB2YWx1ZSBmcm9tIHRoZSB2YWx1ZWhlbHAuXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGUgY3JlYXRlIGJ1dHRvbiBpcyBlbmFibGVkIHdoZW4gYSB2YWx1ZSBpcyBhZGRlZC5cblx0XHRcdFx0XHRcdFx0XHRcdGxpdmVDaGFuZ2UgaXMgbm90IGZpcmVkIHdoZW4gdmFsdWUgaXMgYWRkZWQgZnJvbSB2YWx1ZWhlbHAuXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSB2YWxpZGF0aW9uIGlzIG5vdCBkb25lIGZvciBjcmVhdGUgYnV0dG9uIGVuYWJsZW1lbnQuXG5cdFx0XHRcdFx0XHRcdFx0Ki9cblx0XHRcdFx0aGFuZGxlQ2hhbmdlOiAob0V2ZW50OiBhbnkpID0+IHtcblx0XHRcdFx0XHRjb25zdCBzRmllbGRJZCA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJpZFwiKTtcblx0XHRcdFx0XHRtRmllbGRWYWx1ZU1hcFtzRmllbGRJZF0gPSB0aGlzLl9vbkZpZWxkQ2hhbmdlKG9FdmVudCwgb0NyZWF0ZUJ1dHRvbiwgbWVzc2FnZUhhbmRsZXIsIHZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0Lypcblx0XHRcdFx0XHRcdFx0XHRcdGZpcmVkIG9uIGtleSBwcmVzcy4gdGhlIGNyZWF0ZSBidXR0b24gaXMgZW5hYmxlZCB3aGVuIGEgdmFsdWUgaXMgYWRkZWQuXG5cdFx0XHRcdFx0XHRcdFx0XHRsaXZlQ2hhbmdlIGlzIG5vdCBmaXJlZCB3aGVuIHZhbHVlIGlzIGFkZGVkIGZyb20gdmFsdWVoZWxwLlxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUgdmFsaWRhdGlvbiBpcyBub3QgZG9uZSBmb3IgY3JlYXRlIGJ1dHRvbiBlbmFibGVtZW50LlxuXHRcdFx0XHRcdFx0XHRcdCovXG5cdFx0XHRcdGhhbmRsZUxpdmVDaGFuZ2U6IChvRXZlbnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHNGaWVsZElkID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImlkXCIpO1xuXHRcdFx0XHRcdGNvbnN0IHZWYWx1ZSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJ2YWx1ZVwiKTtcblx0XHRcdFx0XHRtRmllbGRWYWx1ZU1hcFtzRmllbGRJZF0gPSB2VmFsdWU7XG5cdFx0XHRcdFx0dmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMoKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdFx0Y29uc3Qgb0RpYWxvZ0NvbnRlbnQ6IGFueSA9IGF3YWl0IEZyYWdtZW50LmxvYWQoe1xuXHRcdFx0XHRkZWZpbml0aW9uOiBvTmV3RnJhZ21lbnQsXG5cdFx0XHRcdGNvbnRyb2xsZXI6IG9Db250cm9sbGVyXG5cdFx0XHR9KTtcblx0XHRcdGxldCBvUmVzdWx0OiBhbnk7XG5cdFx0XHRjb25zdCBjbG9zZURpYWxvZyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Ly9yZWplY3RlZC9yZXNvbHZlZCB0aGUgcHJvbWlzIHJldHVybmVkIGJ5IF9sYXVuY2hEaWFsb2dXaXRoS2V5RmllbGRzXG5cdFx0XHRcdC8vYXMgc29vbiBhcyB0aGUgZGlhbG9nIGlzIGNsb3NlZC4gV2l0aG91dCB3YWl0aW5nIGZvciB0aGUgZGlhbG9nJ3Ncblx0XHRcdFx0Ly9hbmltYXRpb24gdG8gZmluaXNoXG5cdFx0XHRcdGlmIChvUmVzdWx0LmVycm9yKSB7XG5cdFx0XHRcdFx0cmVqZWN0KG9SZXN1bHQuZXJyb3IpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlc29sdmUob1Jlc3VsdC5yZXNwb25zZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0fTtcblxuXHRcdFx0b0RpYWxvZyA9IG5ldyBEaWFsb2coZ2VuZXJhdGUoW1wiQ3JlYXRlRGlhbG9nXCIsIHNNZXRhUGF0aF0pLCB7XG5cdFx0XHRcdHRpdGxlOiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9TQVBGRV9BQ1RJT05fQ1JFQVRFXCIpLFxuXHRcdFx0XHRjb250ZW50OiBbb0RpYWxvZ0NvbnRlbnRdLFxuXHRcdFx0XHRiZWdpbkJ1dHRvbjoge1xuXHRcdFx0XHRcdHRleHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX1NBUEZFX0FDVElPTl9DUkVBVEVfQlVUVE9OXCIpLFxuXHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdHByZXNzOiBhc3luYyAob0V2ZW50OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGNyZWF0ZUJ1dHRvbiA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRcdFx0XHRcdGNyZWF0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTtcblx0XHRcdFx0XHRcdEJ1c3lMb2NrZXIubG9jayhvRGlhbG9nKTtcblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmJJc0NyZWF0ZURpYWxvZyA9IHRydWU7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhVmFsdWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXMobUZpZWxkVmFsdWVNYXApLm1hcChhc3luYyBmdW5jdGlvbiAoc0tleTogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvVmFsdWUgPSBhd2FpdCBtRmllbGRWYWx1ZU1hcFtzS2V5XTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9EaWFsb2dWYWx1ZTogYW55ID0ge307XG5cdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nVmFsdWVbc0tleV0gPSBvVmFsdWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0RpYWxvZ1ZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjaykge1xuXHRcdFx0XHRcdFx0XHRcdGF3YWl0IHRvRVM2UHJvbWlzZShcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrKHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dFBhdGg6IG9MaXN0QmluZGluZyAmJiBvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzOiBhVmFsdWVzXG5cdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0Y29uc3QgdHJhbnNpZW50RGF0YSA9IG9UcmFuc2llbnRDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjcmVhdGVEYXRhOiBhbnkgPSB7fTtcblx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXModHJhbnNpZW50RGF0YSkuZm9yRWFjaChmdW5jdGlvbiAoc1Byb3BlcnR5UGF0aDogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1Byb3BlcnR5ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofS8ke3NQcm9wZXJ0eVBhdGh9YCk7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gZW5zdXJlIG5hdmlnYXRpb24gcHJvcGVydGllcyBhcmUgbm90IHBhcnQgb2YgdGhlIHBheWxvYWQsIGRlZXAgY3JlYXRlIG5vdCBzdXBwb3J0ZWRcblx0XHRcdFx0XHRcdFx0XHRpZiAob1Byb3BlcnR5ICYmIG9Qcm9wZXJ0eS4ka2luZCA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRjcmVhdGVEYXRhW3NQcm9wZXJ0eVBhdGhdID0gdHJhbnNpZW50RGF0YVtzUHJvcGVydHlQYXRoXTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9OZXdEb2N1bWVudENvbnRleHQgPSBvTGlzdEJpbmRpbmcuY3JlYXRlKFxuXHRcdFx0XHRcdFx0XHRcdGNyZWF0ZURhdGEsXG5cdFx0XHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGVBdEVuZCxcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5pbmFjdGl2ZVxuXHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9Qcm9taXNlID0gdGhpcy5vbkFmdGVyQ3JlYXRlQ29tcGxldGlvbihvTGlzdEJpbmRpbmcsIG9OZXdEb2N1bWVudENvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHRcdFx0bGV0IG9SZXNwb25zZTogYW55ID0gYXdhaXQgb1Byb21pc2U7XG5cdFx0XHRcdFx0XHRcdGlmICghb1Jlc3BvbnNlIHx8IChvUmVzcG9uc2UgJiYgb1Jlc3BvbnNlLmJLZWVwRGlhbG9nT3BlbiAhPT0gdHJ1ZSkpIHtcblx0XHRcdFx0XHRcdFx0XHRvUmVzcG9uc2UgPSBvUmVzcG9uc2UgPz8ge307XG5cdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5zZXRCaW5kaW5nQ29udGV4dChudWxsIGFzIGFueSk7XG5cdFx0XHRcdFx0XHRcdFx0b1Jlc3BvbnNlLm5ld0NvbnRleHQgPSBvTmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRcdFx0XHRcdG9SZXN1bHQgPSB7IHJlc3BvbnNlOiBvUmVzcG9uc2UgfTtcblx0XHRcdFx0XHRcdFx0XHRjbG9zZURpYWxvZygpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHQvLyBpbiBjYXNlIG9mIGNyZWF0aW9uIGZhaWxlZCwgZGlhbG9nIHNob3VsZCBzdGF5IG9wZW4gLSB0byBhY2hpZXZlIHRoZSBzYW1lLCBub3RoaW5nIGhhcyB0byBiZSBkb25lIChsaWtlIGluIGNhc2Ugb2Ygc3VjY2VzcyB3aXRoIGJLZWVwRGlhbG9nT3Blbilcblx0XHRcdFx0XHRcdFx0aWYgKG9FcnJvciAhPT0gRkVMaWJyYXJ5LkNvbnN0YW50cy5DcmVhdGlvbkZhaWxlZCkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIG90aGVyIGVycm9ycyBhcmUgbm90IGV4cGVjdGVkXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc3VsdCA9IHsgZXJyb3I6IG9FcnJvciB9O1xuXHRcdFx0XHRcdFx0XHRcdGNsb3NlRGlhbG9nKCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Y3JlYXRlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9EaWFsb2cpO1xuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGVuZEJ1dHRvbjoge1xuXHRcdFx0XHRcdHRleHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfQ09NTU9OX0FDVElPTl9QQVJBTUVURVJfRElBTE9HX0NBTkNFTFwiKSxcblx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0b1Jlc3VsdCA9IHsgZXJyb3I6IEZFTGlicmFyeS5Db25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nIH07XG5cdFx0XHRcdFx0XHRjbG9zZURpYWxvZygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdC8vIHNob3cgZm9vdGVyIGFzIHBlciBVWCBndWlkZWxpbmVzIHdoZW4gZGlhbG9nIGlzIG5vdCBvcGVuXG5cdFx0XHRcdFx0KG9EaWFsb2cuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCk/LnNldFByb3BlcnR5KFwiaXNDcmVhdGVEaWFsb2dPcGVuXCIsIGZhbHNlKTtcblx0XHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHRvVHJhbnNpZW50TGlzdEJpbmRpbmcuZGVzdHJveSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGFzIGFueSk7XG5cdFx0XHRhRm9ybUVsZW1lbnRzID0gb0RpYWxvZ0NvbnRlbnQ/LmdldEFnZ3JlZ2F0aW9uKFwiZm9ybVwiKS5nZXRBZ2dyZWdhdGlvbihcImZvcm1Db250YWluZXJzXCIpWzBdLmdldEFnZ3JlZ2F0aW9uKFwiZm9ybUVsZW1lbnRzXCIpO1xuXHRcdFx0aWYgKG9QYXJlbnRDb250cm9sICYmIG9QYXJlbnRDb250cm9sLmFkZERlcGVuZGVudCkge1xuXHRcdFx0XHQvLyBpZiB0aGVyZSBpcyBhIHBhcmVudCBjb250cm9sIHNwZWNpZmllZCBhZGQgdGhlIGRpYWxvZyBhcyBkZXBlbmRlbnRcblx0XHRcdFx0b1BhcmVudENvbnRyb2wuYWRkRGVwZW5kZW50KG9EaWFsb2cpO1xuXHRcdFx0fVxuXHRcdFx0b0NyZWF0ZUJ1dHRvbiA9IG9EaWFsb2cuZ2V0QmVnaW5CdXR0b24oKTtcblx0XHRcdG9EaWFsb2cuc2V0QmluZGluZ0NvbnRleHQob1RyYW5zaWVudENvbnRleHQpO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgQ29tbW9uVXRpbHMuc2V0VXNlckRlZmF1bHRzKFxuXHRcdFx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdFx0XHRhSW1tdXRhYmxlRmllbGRzLFxuXHRcdFx0XHRcdG9UcmFuc2llbnRDb250ZXh0LFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0ZUFjdGlvbixcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzKCk7XG5cdFx0XHRcdC8vIGZvb3RlciBtdXN0IG5vdCBiZSB2aXNpYmxlIHdoZW4gdGhlIGRpYWxvZyBpcyBvcGVuIGFzIHBlciBVWCBndWlkZWxpbmVzXG5cdFx0XHRcdChvRGlhbG9nLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQpLnNldFByb3BlcnR5KFwiaXNDcmVhdGVEaWFsb2dPcGVuXCIsIHRydWUpO1xuXHRcdFx0XHRvRGlhbG9nLm9wZW4oKTtcblx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRvbkFmdGVyQ3JlYXRlQ29tcGxldGlvbihvTGlzdEJpbmRpbmc6IGFueSwgb05ld0RvY3VtZW50Q29udGV4dDogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0bGV0IGZuUmVzb2x2ZTogRnVuY3Rpb247XG5cdFx0Y29uc3Qgb1Byb21pc2UgPSBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuXHRcdFx0Zm5SZXNvbHZlID0gcmVzb2x2ZTtcblx0XHR9KTtcblxuXHRcdGNvbnN0IGZuQ3JlYXRlQ29tcGxldGVkID0gKG9FdmVudDogYW55KSA9PiB7XG5cdFx0XHRjb25zdCBvQ29udGV4dCA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJjb250ZXh0XCIpLFxuXHRcdFx0XHRiU3VjY2VzcyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0aWYgKG9Db250ZXh0ID09PSBvTmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdG9MaXN0QmluZGluZy5kZXRhY2hDcmVhdGVDb21wbGV0ZWQoZm5DcmVhdGVDb21wbGV0ZWQsIHRoaXMpO1xuXHRcdFx0XHRmblJlc29sdmUoYlN1Y2Nlc3MpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0Y29uc3QgZm5TYWZlQ29udGV4dENyZWF0ZWQgPSAoKSA9PiB7XG5cdFx0XHRvTmV3RG9jdW1lbnRDb250ZXh0XG5cdFx0XHRcdC5jcmVhdGVkKClcblx0XHRcdFx0LnRoZW4odW5kZWZpbmVkLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0TG9nLnRyYWNlKFwidHJhbnNpZW50IGNyZWF0aW9uIGNvbnRleHQgZGVsZXRlZFwiKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChjb250ZXh0RXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdExvZy50cmFjZShcInRyYW5zaWVudCBjcmVhdGlvbiBjb250ZXh0IGRlbGV0aW9uIGVycm9yXCIsIGNvbnRleHRFcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHRvTGlzdEJpbmRpbmcuYXR0YWNoQ3JlYXRlQ29tcGxldGVkKGZuQ3JlYXRlQ29tcGxldGVkLCB0aGlzKTtcblxuXHRcdHJldHVybiBvUHJvbWlzZS50aGVuKChiU3VjY2VzczogYm9vbGVhbikgPT4ge1xuXHRcdFx0aWYgKCFiU3VjY2Vzcykge1xuXHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQpIHtcblx0XHRcdFx0XHQvLyBDYW5jZWwgdGhlIHBlbmRpbmcgUE9TVCBhbmQgZGVsZXRlIHRoZSBjb250ZXh0IGluIHRoZSBsaXN0QmluZGluZ1xuXHRcdFx0XHRcdGZuU2FmZUNvbnRleHRDcmVhdGVkKCk7IC8vIFRvIGF2b2lkIGEgJ3JlcXVlc3QgY2FuY2VsbGVkJyBlcnJvciBpbiB0aGUgY29uc29sZVxuXHRcdFx0XHRcdG9MaXN0QmluZGluZy5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHRvTGlzdEJpbmRpbmcuZ2V0TW9kZWwoKS5yZXNldENoYW5nZXMob0xpc3RCaW5kaW5nLmdldFVwZGF0ZUdyb3VwSWQoKSk7XG5cblx0XHRcdFx0XHR0aHJvdyBGRUxpYnJhcnkuQ29uc3RhbnRzLkNyZWF0aW9uRmFpbGVkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB7IGJLZWVwRGlhbG9nT3BlbjogdHJ1ZSB9O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIG9OZXdEb2N1bWVudENvbnRleHQuY3JlYXRlZCgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgbmFtZSBvZiB0aGUgTmV3QWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHN0YXRpY1xuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlci5fZ2V0TmV3QWN0aW9uXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAcGFyYW0gb1N0YXJ0dXBQYXJhbWV0ZXJzIFN0YXJ0dXAgcGFyYW1ldGVycyBvZiB0aGUgYXBwbGljYXRpb25cblx0ICogQHBhcmFtIHNDcmVhdGVIYXNoIEhhc2ggdG8gYmUgY2hlY2tlZCBmb3IgYWN0aW9uIHR5cGVcblx0ICogQHBhcmFtIG9NZXRhTW9kZWwgVGhlIE1ldGFNb2RlbCB1c2VkIHRvIGNoZWNrIGZvciBOZXdBY3Rpb24gcGFyYW1ldGVyXG5cdCAqIEBwYXJhbSBzTWV0YVBhdGggVGhlIE1ldGFQYXRoXG5cdCAqIEByZXR1cm5zIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X2dldE5ld0FjdGlvbihvU3RhcnR1cFBhcmFtZXRlcnM6IGFueSwgc0NyZWF0ZUhhc2g6IHN0cmluZywgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsIHNNZXRhUGF0aDogc3RyaW5nKSB7XG5cdFx0bGV0IHNOZXdBY3Rpb247XG5cblx0XHRpZiAob1N0YXJ0dXBQYXJhbWV0ZXJzICYmIG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlICYmIHNDcmVhdGVIYXNoLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihcIkktQUNUSU9OPUNSRUFURVdJVEhcIikgPiAtMSkge1xuXHRcdFx0Y29uc3Qgc1ByZWZlcnJlZE1vZGUgPSBvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZVswXTtcblx0XHRcdHNOZXdBY3Rpb24gPVxuXHRcdFx0XHRzUHJlZmVycmVkTW9kZS50b1VwcGVyQ2FzZSgpLmluZGV4T2YoXCJDUkVBVEVXSVRIOlwiKSA+IC0xXG5cdFx0XHRcdFx0PyBzUHJlZmVycmVkTW9kZS5zdWJzdHIoc1ByZWZlcnJlZE1vZGUubGFzdEluZGV4T2YoXCI6XCIpICsgMSlcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzICYmXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZSAmJlxuXHRcdFx0c0NyZWF0ZUhhc2gudG9VcHBlckNhc2UoKS5pbmRleE9mKFwiSS1BQ1RJT049QVVUT0NSRUFURVdJVEhcIikgPiAtMVxuXHRcdCkge1xuXHRcdFx0Y29uc3Qgc1ByZWZlcnJlZE1vZGUgPSBvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZVswXTtcblx0XHRcdHNOZXdBY3Rpb24gPVxuXHRcdFx0XHRzUHJlZmVycmVkTW9kZS50b1VwcGVyQ2FzZSgpLmluZGV4T2YoXCJBVVRPQ1JFQVRFV0lUSDpcIikgPiAtMVxuXHRcdFx0XHRcdD8gc1ByZWZlcnJlZE1vZGUuc3Vic3RyKHNQcmVmZXJyZWRNb2RlLmxhc3RJbmRleE9mKFwiOlwiKSArIDEpXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNOZXdBY3Rpb24gPVxuXHRcdFx0XHRvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWwuZ2V0T2JqZWN0ICE9PSB1bmRlZmluZWRcblx0XHRcdFx0XHQ/IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkL05ld0FjdGlvbmApIHx8XG5cdFx0XHRcdFx0ICBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvTmV3QWN0aW9uYClcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0cmV0dXJuIHNOZXdBY3Rpb247XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBsYWJlbCBmb3IgdGhlIHRpdGxlIG9mIGEgc3BlY2lmaWMgY3JlYXRlIGFjdGlvbiBkaWFsb2csIGUuZy4gQ3JlYXRlIFNhbGVzIE9yZGVyIGZyb20gUXVvdGF0aW9uLlxuXHQgKlxuXHQgKiBUaGUgZm9sbG93aW5nIHByaW9yaXR5IGlzIGFwcGxpZWQ6XG5cdCAqIDEuIGxhYmVsIG9mIGxpbmUtaXRlbSBhbm5vdGF0aW9uLlxuXHQgKiAyLiBsYWJlbCBhbm5vdGF0ZWQgaW4gdGhlIGFjdGlvbi5cblx0ICogMy4gXCJDcmVhdGVcIiBhcyBhIGNvbnN0YW50IGZyb20gaTE4bi5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBzdGF0aWNcblx0ICogQHByaXZhdGVcblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIuX2dldFNwZWNpZmljQ3JlYXRlQWN0aW9uRGlhbG9nTGFiZWxcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsIFRoZSBNZXRhTW9kZWwgdXNlZCB0byBjaGVjayBmb3IgdGhlIE5ld0FjdGlvbiBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIHNNZXRhUGF0aCBUaGUgTWV0YVBhdGhcblx0ICogQHBhcmFtIHNOZXdBY3Rpb24gQ29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlQ29yZSBSZXNvdXJjZUJ1bmRsZSB0byBhY2Nlc3MgdGhlIGRlZmF1bHQgQ3JlYXRlIGxhYmVsXG5cdCAqIEByZXR1cm5zIFRoZSBsYWJlbCBmb3IgdGhlIENyZWF0ZSBBY3Rpb24gRGlhbG9nXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsKFxuXHRcdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRcdHNNZXRhUGF0aDogc3RyaW5nLFxuXHRcdHNOZXdBY3Rpb246IHN0cmluZyxcblx0XHRvUmVzb3VyY2VCdW5kbGVDb3JlOiBSZXNvdXJjZUJ1bmRsZVxuXHQpIHtcblx0XHRjb25zdCBmbkdldExhYmVsRnJvbUxpbmVJdGVtQW5ub3RhdGlvbiA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdGlmIChvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkxpbmVJdGVtYCkpIHtcblx0XHRcdFx0Y29uc3QgaUxpbmVJdGVtSW5kZXggPSBvTWV0YU1vZGVsXG5cdFx0XHRcdFx0LmdldE9iamVjdChgJHtzTWV0YVBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5MaW5lSXRlbWApXG5cdFx0XHRcdFx0LmZpbmRJbmRleChmdW5jdGlvbiAob0xpbmVJdGVtOiBhbnkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGFMaW5lSXRlbUFjdGlvbiA9IG9MaW5lSXRlbS5BY3Rpb24gPyBvTGluZUl0ZW0uQWN0aW9uLnNwbGl0KFwiKFwiKSA6IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdHJldHVybiBhTGluZUl0ZW1BY3Rpb24gPyBhTGluZUl0ZW1BY3Rpb25bMF0gPT09IHNOZXdBY3Rpb24gOiBmYWxzZTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIGlMaW5lSXRlbUluZGV4ID4gLTFcblx0XHRcdFx0XHQ/IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkxpbmVJdGVtYClbaUxpbmVJdGVtSW5kZXhdLkxhYmVsXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0Zm5HZXRMYWJlbEZyb21MaW5lSXRlbUFubm90YXRpb24oKSB8fFxuXHRcdFx0KG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofS8ke3NOZXdBY3Rpb259QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5MYWJlbGApKSB8fFxuXHRcdFx0KG9SZXNvdXJjZUJ1bmRsZUNvcmUgJiYgb1Jlc291cmNlQnVuZGxlQ29yZS5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfU0FQRkVfQUNUSU9OX0NSRUFURVwiKSlcblx0XHQpO1xuXHR9XG59XG5cbmNvbnN0IHNpbmdsZXRvbiA9IG5ldyBUcmFuc2FjdGlvbkhlbHBlcigpO1xuZXhwb3J0IGRlZmF1bHQgc2luZ2xldG9uO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7OztFQXlDQSxNQUFNQSxZQUFZLEdBQUdDLFNBQVMsQ0FBQ0QsWUFBWTtFQUMzQyxNQUFNRSxnQkFB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
|
|
1108
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJQcm9ncmFtbWluZ01vZGVsIiwiRGVsZXRlT3B0aW9uVHlwZXMiLCJkZWxldGVIZWxwZXIiLCJEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbCIsImdldFBhcmFtZXRlcnMiLCJtUGFyYW1ldGVycyIsImdldE1ldGFkYXRhIiwiZ2V0TmFtZSIsIlRyYW5zYWN0aW9uSGVscGVyIiwiYnVzeUxvY2siLCJhcHBDb21wb25lbnQiLCJidXN5UGF0aCIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiZ2V0TW9kZWwiLCJidXN5VW5sb2NrIiwidW5sb2NrIiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsInNvdXJjZSIsInBhdGgiLCJpc0EiLCJnZXRQYXRoIiwiaXNSZWxhdGl2ZSIsImdldFJlc29sdmVkUGF0aCIsIm1ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsIk1vZGVsSGVscGVyIiwiaXNEcmFmdFN1cHBvcnRlZCIsIkRyYWZ0IiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU3RpY2t5IiwiTm9uRHJhZnQiLCJ2YWxpZGF0ZURvY3VtZW50Iiwib0NvbnRleHQiLCJvVmlldyIsInNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJzTW9kdWxlIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJyZXBsYWNlIiwic0Z1bmN0aW9uTmFtZSIsImxlbmd0aCIsIm1EYXRhIiwiZGF0YSIsIkZQTUhlbHBlciIsInZhbGlkYXRpb25XcmFwcGVyIiwiUHJvbWlzZSIsInJlc29sdmUiLCJjcmVhdGVEb2N1bWVudCIsIm9NYWluTGlzdEJpbmRpbmciLCJtSW5QYXJhbWV0ZXJzIiwibWVzc2FnZUhhbmRsZXIiLCJmcm9tQ29weVBhc3RlIiwib01vZGVsIiwib01ldGFNb2RlbCIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0SGVhZGVyQ29udGV4dCIsInNDcmVhdGVIYXNoIiwiZ2V0Um91dGVyUHJveHkiLCJnZXRIYXNoIiwib0NvbXBvbmVudERhdGEiLCJnZXRDb21wb25lbnREYXRhIiwib1N0YXJ0dXBQYXJhbWV0ZXJzIiwic3RhcnR1cFBhcmFtZXRlcnMiLCJzTmV3QWN0aW9uIiwiX2dldE5ld0FjdGlvbiIsInVuZGVmaW5lZCIsIm1CaW5kaW5nUGFyYW1ldGVycyIsIiQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMiLCJzTWVzc2FnZXNQYXRoIiwiZ2V0T2JqZWN0Iiwic0J1c3lQYXRoIiwiZ2V0VGFyZ2V0RW50aXR5U2V0IiwiZ2V0Q29udGV4dCIsImJGdW5jdGlvbk9uTmF2UHJvcCIsIm9OZXdEb2N1bWVudENvbnRleHQiLCJFcnJvciIsInNQcm9ncmFtbWluZ01vZGVsIiwiYnVzeU1vZGUiLCJidXN5SWQiLCJiZWZvcmVDcmVhdGVDYWxsQmFjayIsIm9SZXNvdXJjZUJ1bmRsZUNvcmUiLCJDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwib1Jlc3VsdCIsImNhbGxBY3Rpb24iLCJjb250ZXh0cyIsInNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2ciLCJsYWJlbCIsIl9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsIiwiYmluZGluZ1BhcmFtZXRlcnMiLCJwYXJlbnRDb250cm9sIiwiYklzQ3JlYXRlQWN0aW9uIiwic2tpcFBhcmFtZXRlckRpYWxvZyIsImJJc05ld1BhZ2VDcmVhdGlvbiIsImNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uUm93IiwiSW5saW5lIiwiYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyIsImdldE5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyIsInNGdW5jdGlvblBhdGgiLCJvRnVuY3Rpb25Db250ZXh0Iiwib0Z1bmN0aW9uIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJvRGF0YSIsIiRJc0JvdW5kIiwib3BlcmF0aW9ucyIsImNhbGxCb3VuZEZ1bmN0aW9uIiwiY2FsbEZ1bmN0aW9uSW1wb3J0Iiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJPYmplY3QiLCJhc3NpZ24iLCJfbGF1bmNoRGlhbG9nV2l0aEtleUZpZWxkcyIsIm5ld0NvbnRleHQiLCJ0b0VTNlByb21pc2UiLCJjb250ZXh0UGF0aCIsImNyZWF0ZSIsImNyZWF0ZUF0RW5kIiwiaW5hY3RpdmUiLCJvbkFmdGVyQ3JlYXRlQ29tcGxldGlvbiIsInNob3dNZXNzYWdlRGlhbG9nIiwiY29udHJvbCIsIkNvbnN0YW50cyIsIkFjdGlvbkV4ZWN1dGlvbkZhaWxlZCIsIkNhbmNlbEFjdGlvbkRpYWxvZyIsImlzVHJhbnNpZW50IiwiZGVsZXRlIiwiX2lzRHJhZnRFbmFibGVkIiwidkNvbnRleHRzIiwiY29udGV4dEZvckRyYWZ0TW9kZWwiLCJkZWxldGVEb2N1bWVudCIsInJlc291cmNlTW9kZWwiLCJyZXNvdXJjZUJ1bmRsZUNvcmUiLCJhUGFyYW1zIiwiY29udGV4dHNUb0RlbGV0ZSIsIkFycmF5IiwiaXNBcnJheSIsInJlamVjdCIsImRyYWZ0RW5hYmxlZCIsInNlbGVjdGVkQ29udGV4dHMiLCJpdGVtcyIsIm9wdGlvbnMiLCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMiLCJsb2NrZWRDb250ZXh0IiwiZmluZCIsImNvbnRleHQiLCJjb250ZXh0RGF0YSIsIklzQWN0aXZlRW50aXR5IiwiSGFzRHJhZnRFbnRpdHkiLCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YSIsIkluUHJvY2Vzc0J5VXNlciIsIkRyYWZ0SXNDcmVhdGVkQnlNZSIsImxvY2tpbmdVc2VyTmFtZSIsIk1lc3NhZ2VCb3giLCJzaG93IiwiZ2V0VGV4dCIsInRpdGxlIiwib25DbG9zZSIsIm5vblRhYmxlVHh0IiwiZGVzY3JpcHRpb24iLCJlbnRpdHlTZXROYW1lIiwicHVzaCIsInR5cGUiLCJkZWxldGFibGVDb250ZXh0cyIsInRleHQiLCJzZWxlY3RlZCIsIlRFWFQiLCJ0b3RhbERlbGV0YWJsZSIsImRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUiLCJkcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlIiwidW5TYXZlZENvbnRleHRzIiwidXBkYXRlRHJhZnRPcHRpb25zRm9yRGVsZXRhYmxlVGV4dHMiLCJub25EZWxldGFibGVUZXh0IiwiZ2V0Tm9uRGVsZXRhYmxlVGV4dCIsIm9wdGlvbnNEZWxldGFibGVUZXh0cyIsImdldE9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyIsInVwZGF0ZUNvbnRlbnRGb3JEZWxldGVEaWFsb2ciLCJ2Qm94IiwiVkJveCIsInNUaXRsZSIsImZuQ29uZmlybSIsImRlbGV0ZUNvbmZpcm1IYW5kbGVyIiwiZGlhbG9nQ29uZmlybWVkIiwib0RpYWxvZyIsIkRpYWxvZyIsInN0YXRlIiwiY29udGVudCIsImFyaWFMYWJlbGxlZEJ5IiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJwcmVzcyIsIm1lc3NhZ2VIYW5kbGluZyIsInJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwiY2xvc2UiLCJlbmRCdXR0b24iLCJhZnRlckNsb3NlIiwiZGVzdHJveSIsIm5vRGlhbG9nIiwiYWRkU3R5bGVDbGFzcyIsIm9wZW4iLCJlZGl0RG9jdW1lbnQiLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMiLCJvTmV3Q29udGV4dCIsImRyYWZ0IiwiY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQiLCJiUHJlc2VydmVDaGFuZ2VzIiwic3RpY2t5IiwiZWRpdERvY3VtZW50SW5TdGlja3lTZXNzaW9uIiwiZXJyIiwic2hvd01lc3NhZ2VzIiwiY29uY3VycmVudEVkaXRGbGFnIiwiY2FuY2VsRG9jdW1lbnQiLCJpc05ld09iamVjdCIsImlzT2JqZWN0TW9kaWZpZWQiLCJyZXR1cm5lZFZhbHVlIiwiZHJhZnREYXRhQ29udGV4dCIsImJpbmRDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0IiwiZHJhZnRBZG1pbkRhdGEiLCJyZXF1ZXN0T2JqZWN0IiwiQ3JlYXRpb25EYXRlVGltZSIsIkxhc3RDaGFuZ2VEYXRlVGltZSIsInNraXBEaXNjYXJkUG9wb3ZlciIsIl9jb25maXJtRGlzY2FyZCIsImNhbmNlbEJ1dHRvbiIsImlzS2VlcEFsaXZlIiwic2V0S2VlcEFsaXZlIiwiYmVmb3JlQ2FuY2VsQ2FsbEJhY2siLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImdldEJpbmRpbmciLCJyZXNldENoYW5nZXMiLCJkZWxldGVEcmFmdCIsIm9TaWJsaW5nQ29udGV4dCIsInNDYW5vbmljYWxQYXRoIiwicmVxdWVzdENhbm9uaWNhbFBhdGgiLCJkaXNjYXJkZWRDb250ZXh0IiwiZGlzY2FyZERvY3VtZW50IiwicmVmcmVzaCIsInNhdmVEb2N1bWVudCIsImV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IiLCJiaW5kaW5nc0ZvclNpZGVFZmZlY3RzIiwib0FjdGl2ZURvY3VtZW50IiwiYWN0aXZhdGVEb2N1bWVudCIsIm1lc3NhZ2VzUmVjZWl2ZWQiLCJnZXRNZXNzYWdlcyIsImNvbmNhdCIsImNvcmVMaWJyYXJ5IiwiTWVzc2FnZVR5cGUiLCJTdWNjZXNzIiwiTWVzc2FnZVRvYXN0IiwiZm9yRWFjaCIsImxpc3RCaW5kaW5nIiwiQ29tbW9uVXRpbHMiLCJoYXNUcmFuc2llbnRDb250ZXh0IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5Iiwic0FjdGlvbk5hbWUiLCJjb250ZXh0VG9Qcm9jZXNzIiwic05hbWUiLCJzcGxpdCIsIm1vZGVsIiwibVNpZGVFZmZlY3RzUGFyYW1ldGVycyIsImdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMiLCJjYWxsQm91bmRBY3Rpb24iLCJwYXJhbWV0ZXJWYWx1ZXMiLCJpbnZvY2F0aW9uR3JvdXBpbmciLCJhZGRpdGlvbmFsU2lkZUVmZmVjdCIsIm9uU3VibWl0dGVkIiwib25SZXNwb25zZSIsImNvbnRyb2xJZCIsImludGVybmFsTW9kZWxDb250ZXh0Iiwib3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiYkdldEJvdW5kQ29udGV4dCIsImJPYmplY3RQYWdlIiwiZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uIiwic2VsZWN0ZWRJdGVtcyIsImNhbGxBY3Rpb25JbXBvcnQiLCJfaGFuZGxlQWN0aW9uUmVzcG9uc2UiLCJhVHJhbnNpZW50TWVzc2FnZXMiLCJhY3Rpb25OYW1lIiwic2V0UHJvcGVydHkiLCJieUlkIiwiaGFuZGxlVmFsaWRhdGlvbkVycm9yIiwib01lc3NhZ2VNYW5hZ2VyIiwiZ2V0TWVzc2FnZU1hbmFnZXIiLCJlcnJvclRvUmVtb3ZlIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImZpbHRlciIsInZhbGlkYXRpb24iLCJyZW1vdmVNZXNzYWdlcyIsIl9jcmVhdGVQb3BvdmVyIiwic2V0dGluZ3MiLCJQb3BvdmVyIiwiaXNNb2RpZmllZCIsInNldEVuYWJsZWQiLCJjb25maXJtYXRpb25Qb3BvdmVyIiwic2hvd0hlYWRlciIsInBsYWNlbWVudCIsIlRleHQiLCJjb25maXJtQnV0dG9uIiwid2lkdGgiLCJhZGRDb250ZW50IiwiYXR0YWNoQmVmb3JlT3BlbiIsInNldEluaXRpYWxGb2N1cyIsImF0dGFjaEFmdGVyQ2xvc2UiLCJvcGVuQnkiLCJvTGlzdEJpbmRpbmciLCJtRmllbGRzIiwib1BhcmVudENvbnRyb2wiLCJvVHJhbnNpZW50TGlzdEJpbmRpbmciLCJiaW5kTGlzdCIsIiQkdXBkYXRlR3JvdXBJZCIsInJlZnJlc2hJbnRlcm5hbCIsIm9UcmFuc2llbnRDb250ZXh0Iiwic0ZyYWdtZW50TmFtZSIsIm9GcmFnbWVudCIsIlhNTFRlbXBsYXRlUHJvY2Vzc29yIiwibG9hZFRlbXBsYXRlIiwiZ2V0UmVzb3VyY2VNb2RlbCIsImFJbW11dGFibGVGaWVsZHMiLCJzUGF0aCIsIm9FbnRpdHlTZXRDb250ZXh0IiwiaSIsIm9JbW11dGFibGVDdHhNb2RlbCIsIkpTT05Nb2RlbCIsIm9JbW11dGFibGVDdHgiLCJhUmVxdWlyZWRQcm9wZXJ0aWVzIiwiZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUluc2VydFJlc3RyaWN0aW9ucyIsIm9SZXF1aXJlZFByb3BlcnR5UGF0aHNDdHhNb2RlbCIsIm9SZXF1aXJlZFByb3BlcnR5UGF0aHNDdHgiLCJvTmV3RnJhZ21lbnQiLCJYTUxQcmVwcm9jZXNzb3IiLCJwcm9jZXNzIiwibmFtZSIsImJpbmRpbmdDb250ZXh0cyIsImVudGl0eVNldCIsImZpZWxkcyIsInJlcXVpcmVkUHJvcGVydGllcyIsIm1vZGVscyIsImFGb3JtRWxlbWVudHMiLCJtRmllbGRWYWx1ZU1hcCIsIm1lc3NhZ2VNYW5hZ2VyIiwiX3JlbW92ZU1lc3NhZ2VzRm9yQWN0aW9uUGFyYW10ZXIiLCJtZXNzYWdlQ29udHJvbElkIiwiYWxsTWVzc2FnZXMiLCJyZWxldmFudE1lc3NhZ2VzIiwibXNnIiwiZ2V0Q29udHJvbElkcyIsInNvbWUiLCJpbmNsdWRlcyIsIm9Db250cm9sbGVyIiwiaGFuZGxlQ2hhbmdlIiwiZXZlbnQiLCJmaWVsZElkIiwiZ2V0UGFyYW1ldGVyIiwiZmllbGQiLCJnZXRTb3VyY2UiLCJhY3Rpb25QYXJhbWV0ZXJJbmZvIiwiYWN0aW9uUGFyYW1ldGVySW5mb3MiLCJ2YWxpZGF0aW9uUHJvbWlzZSIsInZhbHVlIiwiaGFzRXJyb3IiLCJoYW5kbGVMaXZlQ2hhbmdlIiwib0RpYWxvZ0NvbnRlbnQiLCJGcmFnbWVudCIsImxvYWQiLCJkZWZpbml0aW9uIiwiY29udHJvbGxlciIsImNsb3NlRGlhbG9nIiwicmVzcG9uc2UiLCJnZW5lcmF0ZSIsIl9FdmVudCIsIkFjdGlvblJ1bnRpbWUiLCJ2YWxpZGF0ZVByb3BlcnRpZXMiLCJiSXNDcmVhdGVEaWFsb2ciLCJhVmFsdWVzIiwiYWxsIiwia2V5cyIsIm1hcCIsInNLZXkiLCJvVmFsdWUiLCJvRGlhbG9nVmFsdWUiLCJjcmVhdGVQYXJhbWV0ZXJzIiwidHJhbnNpZW50RGF0YSIsImNyZWF0ZURhdGEiLCJzUHJvcGVydHlQYXRoIiwib1Byb3BlcnR5IiwiJGtpbmQiLCJvUHJvbWlzZSIsIm9SZXNwb25zZSIsImJLZWVwRGlhbG9nT3BlbiIsInNldEJpbmRpbmdDb250ZXh0IiwiQ3JlYXRpb25GYWlsZWQiLCJnZXRJZCIsImdldEJpbmRpbmdDb250ZXh0IiwiZ2V0QWdncmVnYXRpb24iLCJwYXJhbWV0ZXJGaWVsZCIsImdldEZpZWxkcyIsImlzTXVsdGlWYWx1ZSIsInBhcmFtZXRlciIsImdldEl0ZW1zIiwiZ2V0VmFsdWUiLCJhZGREZXBlbmRlbnQiLCJzZXRVc2VyRGVmYXVsdHMiLCJjcmVhdGVBY3Rpb24iLCJmblJlc29sdmUiLCJmbkNyZWF0ZUNvbXBsZXRlZCIsIm9FdmVudCIsImJTdWNjZXNzIiwiZGV0YWNoQ3JlYXRlQ29tcGxldGVkIiwiZm5TYWZlQ29udGV4dENyZWF0ZWQiLCJjcmVhdGVkIiwidGhlbiIsInRyYWNlIiwiY2F0Y2giLCJjb250ZXh0RXJyb3IiLCJhdHRhY2hDcmVhdGVDb21wbGV0ZWQiLCJrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIiwiZ2V0VXBkYXRlR3JvdXBJZCIsInByZWZlcnJlZE1vZGUiLCJ0b1VwcGVyQ2FzZSIsImluZGV4T2YiLCJzUHJlZmVycmVkTW9kZSIsInN1YnN0ciIsImZuR2V0TGFiZWxGcm9tTGluZUl0ZW1Bbm5vdGF0aW9uIiwiaUxpbmVJdGVtSW5kZXgiLCJmaW5kSW5kZXgiLCJvTGluZUl0ZW0iLCJhTGluZUl0ZW1BY3Rpb24iLCJBY3Rpb24iLCJMYWJlbCIsInNpbmdsZXRvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiVHJhbnNhY3Rpb25IZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgUmVzb3VyY2VCdW5kbGUgZnJvbSBcInNhcC9iYXNlL2kxOG4vUmVzb3VyY2VCdW5kbGVcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IEFjdGlvblJ1bnRpbWUsIHsgQWN0aW9uUGFyYW1ldGVySW5mbyB9IGZyb20gXCJzYXAvZmUvY29yZS9BY3Rpb25SdW50aW1lXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBvcGVyYXRpb25zIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9vcGVyYXRpb25zXCI7XG5pbXBvcnQgc3RpY2t5IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9zdGlja3lcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2VIYW5kbGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgZGVsZXRlSGVscGVyLCB7IERlbGV0ZU9wdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0RlbGV0ZUhlbHBlclwiO1xuaW1wb3J0IEZQTUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9GUE1IZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyBnZXRSZXNvdXJjZU1vZGVsIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUmVzb3VyY2VNb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TdGFibGVJZEhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IE1lc3NhZ2VUb2FzdCBmcm9tIFwic2FwL20vTWVzc2FnZVRvYXN0XCI7XG5pbXBvcnQgUG9wb3ZlciwgeyAkUG9wb3ZlclNldHRpbmdzIH0gZnJvbSBcInNhcC9tL1BvcG92ZXJcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgVkJveCBmcm9tIFwic2FwL20vVkJveFwiO1xuaW1wb3J0IHR5cGUgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IEZyYWdtZW50IGZyb20gXCJzYXAvdWkvY29yZS9GcmFnbWVudFwiO1xuaW1wb3J0IGNvcmVMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCBYTUxUZW1wbGF0ZVByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvWE1MVGVtcGxhdGVQcm9jZXNzb3JcIjtcbmltcG9ydCB0eXBlIEZpZWxkIGZyb20gXCJzYXAvdWkvbWRjL0ZpZWxkXCI7XG5pbXBvcnQgdHlwZSBNdWx0aVZhbHVlRmllbGQgZnJvbSBcInNhcC91aS9tZGMvTXVsdGlWYWx1ZUZpZWxkXCI7XG5pbXBvcnQgdHlwZSBCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgeyBnZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMsIGdldFJlcXVpcmVkUHJvcGVydGllc0Zyb21JbnNlcnRSZXN0cmljdGlvbnMgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9NZXRhTW9kZWxGdW5jdGlvblwiO1xuaW1wb3J0IHRvRVM2UHJvbWlzZSBmcm9tIFwiLi4vLi4vaGVscGVycy9Ub0VTNlByb21pc2VcIjtcblxuY29uc3QgQ3JlYXRpb25Nb2RlID0gRkVMaWJyYXJ5LkNyZWF0aW9uTW9kZTtcbmNvbnN0IFByb2dyYW1taW5nTW9kZWwgPSBGRUxpYnJhcnkuUHJvZ3JhbW1pbmdNb2RlbDtcblxuLy9FbnVtcyBmb3IgZGVsZXRlIHRleHQgY2FsY3VsYXRpb25zIGZvciBkZWxldGUgY29uZmlybSBkaWFsb2cuXG5jb25zdCBEZWxldGVPcHRpb25UeXBlcyA9IGRlbGV0ZUhlbHBlci5EZWxldGVPcHRpb25UeXBlcztcbmNvbnN0IERlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sID0gZGVsZXRlSGVscGVyLkRlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sO1xuXG4vKiBNYWtlIHN1cmUgdGhhdCB0aGUgbVBhcmFtZXRlcnMgaXMgbm90IHRoZSBvRXZlbnQgKi9cbmZ1bmN0aW9uIGdldFBhcmFtZXRlcnMobVBhcmFtZXRlcnM6IGFueSkge1xuXHRpZiAobVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMuZ2V0TWV0YWRhdGEgJiYgbVBhcmFtZXRlcnMuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkgPT09IFwic2FwLnVpLmJhc2UuRXZlbnRcIikge1xuXHRcdG1QYXJhbWV0ZXJzID0ge307XG5cdH1cblx0cmV0dXJuIG1QYXJhbWV0ZXJzIHx8IHt9O1xufVxuXG5jbGFzcyBUcmFuc2FjdGlvbkhlbHBlciB7XG5cdGJ1c3lMb2NrKGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBidXN5UGF0aD86IHN0cmluZykge1xuXHRcdEJ1c3lMb2NrZXIubG9jayhhcHBDb21wb25lbnQuZ2V0TW9kZWwoXCJ1aVwiKSwgYnVzeVBhdGgpO1xuXHR9XG5cblx0YnVzeVVubG9jayhhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgYnVzeVBhdGg/OiBzdHJpbmcpIHtcblx0XHRCdXN5TG9ja2VyLnVubG9jayhhcHBDb21wb25lbnQuZ2V0TW9kZWwoXCJ1aVwiKSwgYnVzeVBhdGgpO1xuXHR9XG5cblx0Z2V0UHJvZ3JhbW1pbmdNb2RlbChzb3VyY2U6IE9EYXRhVjRDb250ZXh0IHwgQmluZGluZyk6IHR5cGVvZiBQcm9ncmFtbWluZ01vZGVsIHtcblx0XHRsZXQgcGF0aDogc3RyaW5nO1xuXHRcdGlmIChzb3VyY2UuaXNBPE9EYXRhVjRDb250ZXh0PihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCIpKSB7XG5cdFx0XHRwYXRoID0gc291cmNlLmdldFBhdGgoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cGF0aCA9IChzb3VyY2UuaXNSZWxhdGl2ZSgpID8gc291cmNlLmdldFJlc29sdmVkUGF0aCgpIDogc291cmNlLmdldFBhdGgoKSkgPz8gXCJcIjtcblx0XHR9XG5cblx0XHRjb25zdCBtZXRhTW9kZWwgPSBzb3VyY2UuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRpZiAoTW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChtZXRhTW9kZWwsIHBhdGgpKSB7XG5cdFx0XHRyZXR1cm4gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblx0XHR9IGVsc2UgaWYgKE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChtZXRhTW9kZWwpKSB7XG5cdFx0XHRyZXR1cm4gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3k7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBQcm9ncmFtbWluZ01vZGVsLk5vbkRyYWZ0O1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBWYWxpZGF0ZXMgYSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIHZhbGlkYXRlZFxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzXSBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuZGF0YV0gQSBtYXAgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSB2YWxpZGF0ZWRcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5jdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25dIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGF0aCB0byB0aGUgdmFsaWRhdGlvbiBmdW5jdGlvblxuXHQgKiBAcGFyYW0gb1ZpZXcgQ29udGFpbnMgdGhlIG9iamVjdCBvZiB0aGUgY3VycmVudCB2aWV3XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCByZXN1bHQgb2YgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdHZhbGlkYXRlRG9jdW1lbnQob0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0LCBtUGFyYW1ldGVyczogYW55LCBvVmlldzogVmlldyk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3Qgc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA9IG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjtcblx0XHRpZiAoc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbikge1xuXHRcdFx0Y29uc3Qgc01vZHVsZSA9IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24uc3Vic3RyaW5nKDAsIHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24ubGFzdEluZGV4T2YoXCIuXCIpIHx8IC0xKS5yZXBsYWNlKC9cXC4vZ2ksIFwiL1wiKSxcblx0XHRcdFx0c0Z1bmN0aW9uTmFtZSA9IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24uc3Vic3RyaW5nKFxuXHRcdFx0XHRcdHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24ubGFzdEluZGV4T2YoXCIuXCIpICsgMSxcblx0XHRcdFx0XHRzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLmxlbmd0aFxuXHRcdFx0XHQpLFxuXHRcdFx0XHRtRGF0YSA9IG1QYXJhbWV0ZXJzLmRhdGE7XG5cdFx0XHRkZWxldGUgbURhdGFbXCJAJHVpNS5jb250ZXh0LmlzVHJhbnNpZW50XCJdO1xuXHRcdFx0cmV0dXJuIEZQTUhlbHBlci52YWxpZGF0aW9uV3JhcHBlcihzTW9kdWxlLCBzRnVuY3Rpb25OYW1lLCBtRGF0YSwgb1ZpZXcsIG9Db250ZXh0KTtcblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIG9NYWluTGlzdEJpbmRpbmcgT0RhdGEgVjQgTGlzdEJpbmRpbmcgb2JqZWN0XG5cdCAqIEBwYXJhbSBbbUluUGFyYW1ldGVyc10gT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIFttSW5QYXJhbWV0ZXJzLmRhdGFdIEEgbWFwIG9mIGRhdGEgdGhhdCBzaG91bGQgYmUgc2VudCB3aXRoaW4gdGhlIFBPU1Rcblx0ICogQHBhcmFtIFttSW5QYXJhbWV0ZXJzLmJ1c3lNb2RlXSBHbG9iYWwgKGRlZmF1bHQpLCBMb2NhbCwgTm9uZSBUT0RPOiB0byBiZSByZWZhY3RvcmVkXG5cdCAqIEBwYXJhbSBbbUluUGFyYW1ldGVycy5idXN5SWRdIElEIG9mIHRoZSBsb2NhbCBidXN5IGluZGljYXRvclxuXHQgKiBAcGFyYW0gW21JblBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZF0gSWYgc2V0LCB0aGUgY29udGV4dCBzdGF5cyBpbiB0aGUgbGlzdCBpZiB0aGUgUE9TVCBmYWlsZWQgYW5kIFBPU1Qgd2lsbCBiZSByZXBlYXRlZCB3aXRoIHRoZSBuZXh0IGNoYW5nZVxuXHQgKiBAcGFyYW0gW21JblBhcmFtZXRlcnMuaW5hY3RpdmVdIElmIHNldCwgdGhlIGNvbnRleHQgaXMgc2V0IGFzIGluYWN0aXZlIGZvciBlbXB0eSByb3dzXG5cdCAqIEBwYXJhbSBbbUluUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nXSBTa2lwcyB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwIGNvbXBvbmVudFxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHBhcmFtIGZyb21Db3B5UGFzdGUgVHJ1ZSBpZiB0aGUgY3JlYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkIGJ5IGEgcGFzdGUgYWN0aW9uXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCBuZXcgYmluZGluZyBjb250ZXh0XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIGNyZWF0ZURvY3VtZW50KFxuXHRcdG9NYWluTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0bUluUGFyYW1ldGVyczpcblx0XHRcdHwge1xuXHRcdFx0XHRcdGRhdGE/OiBhbnk7XG5cdFx0XHRcdFx0YnVzeU1vZGU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0YnVzeUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZD86IGJvb2xlYW47XG5cdFx0XHRcdFx0aW5hY3RpdmU/OiBib29sZWFuO1xuXHRcdFx0ICB9XG5cdFx0XHR8IHVuZGVmaW5lZCxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdFx0ZnJvbUNvcHlQYXN0ZTogYm9vbGVhblxuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PiB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3Qgb01vZGVsID0gb01haW5MaXN0QmluZGluZy5nZXRNb2RlbCgpLFxuXHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob01haW5MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkhLmdldFBhdGgoKSksXG5cdFx0XHRzQ3JlYXRlSGFzaCA9IGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmdldEhhc2goKSxcblx0XHRcdG9Db21wb25lbnREYXRhID0gYXBwQ29tcG9uZW50LmdldENvbXBvbmVudERhdGEoKSxcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVycyA9IChvQ29tcG9uZW50RGF0YSAmJiBvQ29tcG9uZW50RGF0YS5zdGFydHVwUGFyYW1ldGVycykgfHwge30sXG5cdFx0XHRzTmV3QWN0aW9uID0gIW9NYWluTGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpXG5cdFx0XHRcdD8gdGhpcy5fZ2V0TmV3QWN0aW9uKG9TdGFydHVwUGFyYW1ldGVycywgc0NyZWF0ZUhhc2gsIG9NZXRhTW9kZWwsIHNNZXRhUGF0aClcblx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgbUJpbmRpbmdQYXJhbWV0ZXJzOiBhbnkgPSB7ICQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHM6IHRydWUgfTtcblx0XHRjb25zdCBzTWVzc2FnZXNQYXRoID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1lc3NhZ2VzLyRQYXRoYCk7XG5cdFx0bGV0IHNCdXN5UGF0aCA9IFwiL2J1c3lcIjtcblx0XHRsZXQgc0Z1bmN0aW9uTmFtZSA9XG5cdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EZWZhdWx0VmFsdWVzRnVuY3Rpb25gKSB8fFxuXHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3QoXG5cdFx0XHRcdGAke01vZGVsSGVscGVyLmdldFRhcmdldEVudGl0eVNldChvTWV0YU1vZGVsLmdldENvbnRleHQoc01ldGFQYXRoKSl9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EZWZhdWx0VmFsdWVzRnVuY3Rpb25gXG5cdFx0XHQpO1xuXHRcdGxldCBiRnVuY3Rpb25Pbk5hdlByb3A7XG5cdFx0bGV0IG9OZXdEb2N1bWVudENvbnRleHQ6IE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRcdGlmIChzRnVuY3Rpb25OYW1lKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRlZmF1bHRWYWx1ZXNGdW5jdGlvbmApICYmXG5cdFx0XHRcdE1vZGVsSGVscGVyLmdldFRhcmdldEVudGl0eVNldChvTWV0YU1vZGVsLmdldENvbnRleHQoc01ldGFQYXRoKSkgIT09IHNNZXRhUGF0aFxuXHRcdFx0KSB7XG5cdFx0XHRcdGJGdW5jdGlvbk9uTmF2UHJvcCA9IHRydWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRiRnVuY3Rpb25Pbk5hdlByb3AgPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdG1CaW5kaW5nUGFyYW1ldGVyc1tcIiRzZWxlY3RcIl0gPSBzTWVzc2FnZXNQYXRoO1xuXHRcdH1cblx0XHRjb25zdCBtUGFyYW1ldGVycyA9IGdldFBhcmFtZXRlcnMobUluUGFyYW1ldGVycyk7XG5cdFx0aWYgKCFvTWFpbkxpc3RCaW5kaW5nKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIHJlcXVpcmVkIGZvciBuZXcgZG9jdW1lbnQgY3JlYXRpb25cIik7XG5cdFx0fVxuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9NYWluTGlzdEJpbmRpbmcpO1xuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiBzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNyZWF0ZSBkb2N1bWVudCBvbmx5IGFsbG93ZWQgZm9yIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uIHN1cHBvcnRlZCBzZXJ2aWNlc1wiKTtcblx0XHR9XG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmJ1c3lNb2RlID09PSBcIkxvY2FsXCIpIHtcblx0XHRcdHNCdXN5UGF0aCA9IGAvYnVzeUxvY2FsLyR7bVBhcmFtZXRlcnMuYnVzeUlkfWA7XG5cdFx0fVxuXHRcdG1QYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrID0gZnJvbUNvcHlQYXN0ZSA/IG51bGwgOiBtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjaztcblx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCwgc0J1c3lQYXRoKTtcblx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGVDb3JlID0gQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0XHRsZXQgb1Jlc3VsdDogYW55O1xuXG5cdFx0dHJ5IHtcblx0XHRcdGlmIChzTmV3QWN0aW9uKSB7XG5cdFx0XHRcdG9SZXN1bHQgPSBhd2FpdCB0aGlzLmNhbGxBY3Rpb24oXG5cdFx0XHRcdFx0c05ld0FjdGlvbixcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjb250ZXh0czogb01haW5MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCksXG5cdFx0XHRcdFx0XHRzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nOiB0cnVlLFxuXHRcdFx0XHRcdFx0bGFiZWw6IHRoaXMuX2dldFNwZWNpZmljQ3JlYXRlQWN0aW9uRGlhbG9nTGFiZWwob01ldGFNb2RlbCwgc01ldGFQYXRoLCBzTmV3QWN0aW9uLCBvUmVzb3VyY2VCdW5kbGVDb3JlKSxcblx0XHRcdFx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzOiBtQmluZGluZ1BhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRwYXJlbnRDb250cm9sOiBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLFxuXHRcdFx0XHRcdFx0YklzQ3JlYXRlQWN0aW9uOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZzogbVBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXJcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGJJc05ld1BhZ2VDcmVhdGlvbiA9XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgJiYgbVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuSW5saW5lO1xuXHRcdFx0XHRjb25zdCBhTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzID0gYklzTmV3UGFnZUNyZWF0aW9uXG5cdFx0XHRcdFx0PyBnZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMob01ldGFNb2RlbCwgc01ldGFQYXRoLCBhcHBDb21wb25lbnQpXG5cdFx0XHRcdFx0OiBbXTtcblx0XHRcdFx0c0Z1bmN0aW9uTmFtZSA9IGZyb21Db3B5UGFzdGUgPyBudWxsIDogc0Z1bmN0aW9uTmFtZTtcblx0XHRcdFx0bGV0IHNGdW5jdGlvblBhdGgsIG9GdW5jdGlvbkNvbnRleHQ7XG5cdFx0XHRcdGlmIChzRnVuY3Rpb25OYW1lKSB7XG5cdFx0XHRcdFx0Ly9ib3VuZCB0byB0aGUgc291cmNlIGVudGl0eTpcblx0XHRcdFx0XHRpZiAoYkZ1bmN0aW9uT25OYXZQcm9wKSB7XG5cdFx0XHRcdFx0XHRzRnVuY3Rpb25QYXRoID1cblx0XHRcdFx0XHRcdFx0b01haW5MaXN0QmluZGluZy5nZXRDb250ZXh0KCkgJiZcblx0XHRcdFx0XHRcdFx0YCR7b01ldGFNb2RlbC5nZXRNZXRhUGF0aChvTWFpbkxpc3RCaW5kaW5nLmdldENvbnRleHQoKS5nZXRQYXRoKCkpfS8ke3NGdW5jdGlvbk5hbWV9YDtcblx0XHRcdFx0XHRcdG9GdW5jdGlvbkNvbnRleHQgPSBvTWFpbkxpc3RCaW5kaW5nLmdldENvbnRleHQoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c0Z1bmN0aW9uUGF0aCA9XG5cdFx0XHRcdFx0XHRcdG9NYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpICYmXG5cdFx0XHRcdFx0XHRcdGAke29NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob01haW5MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkhLmdldFBhdGgoKSl9LyR7c0Z1bmN0aW9uTmFtZX1gO1xuXHRcdFx0XHRcdFx0b0Z1bmN0aW9uQ29udGV4dCA9IG9NYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBvRnVuY3Rpb24gPSBzRnVuY3Rpb25QYXRoICYmIChvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNGdW5jdGlvblBhdGgpIGFzIGFueSk7XG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRsZXQgb0RhdGE6IGFueTtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0NvbnRleHQgPVxuXHRcdFx0XHRcdFx0XHRvRnVuY3Rpb24gJiYgb0Z1bmN0aW9uLmdldE9iamVjdCgpICYmIG9GdW5jdGlvbi5nZXRPYmplY3QoKVswXS4kSXNCb3VuZFxuXHRcdFx0XHRcdFx0XHRcdD8gYXdhaXQgb3BlcmF0aW9ucy5jYWxsQm91bmRGdW5jdGlvbihzRnVuY3Rpb25OYW1lLCBvRnVuY3Rpb25Db250ZXh0LCBvTW9kZWwpXG5cdFx0XHRcdFx0XHRcdFx0OiBhd2FpdCBvcGVyYXRpb25zLmNhbGxGdW5jdGlvbkltcG9ydChzRnVuY3Rpb25OYW1lLCBvTW9kZWwpO1xuXHRcdFx0XHRcdFx0aWYgKG9Db250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdG9EYXRhID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihgRXJyb3Igd2hpbGUgZXhlY3V0aW5nIHRoZSBmdW5jdGlvbiAke3NGdW5jdGlvbk5hbWV9YCwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdHRocm93IG9FcnJvcjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuZGF0YSA9IG9EYXRhID8gT2JqZWN0LmFzc2lnbih7fSwgb0RhdGEsIG1QYXJhbWV0ZXJzLmRhdGEpIDogbVBhcmFtZXRlcnMuZGF0YTtcblx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuZGF0YSkge1xuXHRcdFx0XHRcdFx0ZGVsZXRlIG1QYXJhbWV0ZXJzLmRhdGFbXCJAb2RhdGEuY29udGV4dFwiXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0b1Jlc3VsdCA9IGF3YWl0IHRoaXMuX2xhdW5jaERpYWxvZ1dpdGhLZXlGaWVsZHMoXG5cdFx0XHRcdFx0XHRcdG9NYWluTGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcdGFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMsXG5cdFx0XHRcdFx0XHRcdG9Nb2RlbCxcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXJcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRvTmV3RG9jdW1lbnRDb250ZXh0ID0gb1Jlc3VsdC5uZXdDb250ZXh0O1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2spIHtcblx0XHRcdFx0XHRcdFx0YXdhaXQgdG9FUzZQcm9taXNlKFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrKHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRleHRQYXRoOiBvTWFpbkxpc3RCaW5kaW5nICYmIG9NYWluTGlzdEJpbmRpbmcuZ2V0UGF0aCgpXG5cdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0b05ld0RvY3VtZW50Q29udGV4dCA9IG9NYWluTGlzdEJpbmRpbmcuY3JlYXRlKFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhLFxuXHRcdFx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGVBdEVuZCxcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuaW5hY3RpdmVcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLmluYWN0aXZlKSB7XG5cdFx0XHRcdFx0XHRcdG9SZXN1bHQgPSBhd2FpdCB0aGlzLm9uQWZ0ZXJDcmVhdGVDb21wbGV0aW9uKG9NYWluTGlzdEJpbmRpbmcsIG9OZXdEb2N1bWVudENvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIG5ldyBkb2N1bWVudFwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdHRocm93IG9FcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRvTmV3RG9jdW1lbnRDb250ZXh0ID0gb05ld0RvY3VtZW50Q29udGV4dCB8fCBvUmVzdWx0O1xuXG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZyh7IGNvbnRyb2w6IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgfSk7XG5cdFx0XHRyZXR1cm4gb05ld0RvY3VtZW50Q29udGV4dCE7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdC8vIFRPRE86IGN1cnJlbnRseSwgdGhlIG9ubHkgZXJyb3JzIGhhbmRsZWQgaGVyZSBhcmUgcmFpc2VkIGFzIHN0cmluZyAtIHNob3VsZCBiZSBjaGFuZ2VkIHRvIEVycm9yIG9iamVjdHNcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKHsgY29udHJvbDogbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCB9KTtcblx0XHRcdGlmIChcblx0XHRcdFx0KGVycm9yID09PSBGRUxpYnJhcnkuQ29uc3RhbnRzLkFjdGlvbkV4ZWN1dGlvbkZhaWxlZCB8fCBlcnJvciA9PT0gRkVMaWJyYXJ5LkNvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cpICYmXG5cdFx0XHRcdG9OZXdEb2N1bWVudENvbnRleHQ/LmlzVHJhbnNpZW50KClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBzdWdnZXN0ZWQgYnkgbW9kZWwgYXMgQ29udGV4dC5kZWxldGUgcmVzdWx0cyBpbiBhbiBlcnJvclxuXHRcdFx0XHQvLyBUT0RPOiByZW1vdmUgdGhlICRkaXJlY3Qgb25jZSBtb2RlbCByZXNvbHZlcyB0aGlzIGlzc3VlXG5cdFx0XHRcdC8vIHRoaXMgbGluZSBzaG93cyB0aGUgZXhwZWN0ZWQgY29uc29sZSBlcnJvciBVbmNhdWdodCAoaW4gcHJvbWlzZSkgRXJyb3I6IFJlcXVlc3QgY2FuY2VsZWQ6IFBPU1QgVHJhdmVsOyBncm91cDogc3VibWl0TGF0ZXJcblx0XHRcdFx0b05ld0RvY3VtZW50Q29udGV4dC5kZWxldGUoXCIkZGlyZWN0XCIpO1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQsIHNCdXN5UGF0aCk7XG5cdFx0fVxuXHR9XG5cblx0X2lzRHJhZnRFbmFibGVkKHZDb250ZXh0czogT0RhdGFWNENvbnRleHRbXSkge1xuXHRcdGNvbnN0IGNvbnRleHRGb3JEcmFmdE1vZGVsID0gdkNvbnRleHRzWzBdO1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHRGb3JEcmFmdE1vZGVsKTtcblx0XHRyZXR1cm4gc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cdH1cblxuXHQvKipcblx0ICogRGVsZXRlIG9uZSBvciBtdWx0aXBsZSBkb2N1bWVudChzKS5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIGNvbnRleHRzIENvbnRleHRzIEVpdGhlciBvbmUgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy50aXRsZSBUaXRsZSBvZiB0aGUgb2JqZWN0IHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBvYmplY3QgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIE51bWJlciBvZiBvYmplY3RzIHNlbGVjdGVkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5ub0RpYWxvZyBUbyBkaXNhYmxlIHRoZSBjb25maXJtYXRpb24gZGlhbG9nXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcENvbXBvbmVudFxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgcmVzb3VyY2UgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGRvY3VtZW50cyBhcmUgZGVsZXRlZFxuXHQgKi9cblx0ZGVsZXRlRG9jdW1lbnQoXG5cdFx0Y29udGV4dHM6IE9EYXRhVjRDb250ZXh0IHwgT0RhdGFWNENvbnRleHRbXSxcblx0XHRtUGFyYW1ldGVyczogYW55LFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyXG5cdCkge1xuXHRcdGNvbnN0IHJlc291cmNlQnVuZGxlQ29yZSA9IENvcmUuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0bGV0IGFQYXJhbXM7XG5cdFx0Ly8gZGVsZXRlIGRvY3VtZW50IGxvY2tcblx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cblx0XHRjb25zdCBjb250ZXh0c1RvRGVsZXRlID0gQXJyYXkuaXNBcnJheShjb250ZXh0cykgPyBbLi4uY29udGV4dHNdIDogW2NvbnRleHRzXTtcblxuXHRcdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBkcmFmdEVuYWJsZWQgPSB0aGlzLl9pc0RyYWZ0RW5hYmxlZChtUGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzIHx8IGNvbnRleHRzVG9EZWxldGUpO1xuXHRcdFx0XHRjb25zdCBpdGVtczogYW55W10gPSBbXTtcblx0XHRcdFx0bGV0IG9wdGlvbnM6IERlbGV0ZU9wdGlvbltdID0gW107XG5cblx0XHRcdFx0Ly8gaXRlbXModGV4dHMpIGFuZCBvcHRpb25zKGNoZWNrQm94ZXMgYW5kIHNpbmdsZSBkZWZhdWx0IG9wdGlvbikgZm9yIGNvbmZpcm0gZGlhbG9nLlxuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cykge1xuXHRcdFx0XHRcdFx0Ly8gbm9uLVRhYmxlXG5cdFx0XHRcdFx0XHRpZiAoZHJhZnRFbmFibGVkKSB7XG5cdFx0XHRcdFx0XHRcdC8vIENoZWNrIGlmIDEgb2YgdGhlIGRyYWZ0cyBpcyBsb2NrZWQgYnkgYW5vdGhlciB1c2VyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGxvY2tlZENvbnRleHQgPSBjb250ZXh0c1RvRGVsZXRlLmZpbmQoKGNvbnRleHQpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBjb250ZXh0RGF0YSA9IGNvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ID09PSB0cnVlICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0RGF0YS5IYXNEcmFmdEVudGl0eSA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dERhdGEuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEgJiZcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRleHREYXRhLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLkluUHJvY2Vzc0J5VXNlciAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0IWNvbnRleHREYXRhLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLkRyYWZ0SXNDcmVhdGVkQnlNZVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRpZiAobG9ja2VkQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFNob3cgbWVzc2FnZSBib3ggd2l0aCB0aGUgbmFtZSBvZiB0aGUgbG9ja2luZyB1c2VyIGFuZCByZXR1cm5cblx0XHRcdFx0XHRcdFx0XHRjb25zdCBsb2NraW5nVXNlck5hbWUgPSBsb2NrZWRDb250ZXh0LmdldE9iamVjdCgpLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLkluUHJvY2Vzc0J5VXNlcjtcblx0XHRcdFx0XHRcdFx0XHRNZXNzYWdlQm94LnNob3coXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX1NJTkdMRV9PQkpFQ1RfTE9DS0VEXCIsIFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0bG9ja2luZ1VzZXJOYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHRdKSxcblx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfQ09NTU9OX0RFTEVURVwiKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0b25DbG9zZTogcmVqZWN0XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtUGFyYW1ldGVycyk7XG5cdFx0XHRcdFx0XHRsZXQgbm9uVGFibGVUeHQgPSBcIlwiO1xuXHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLnRpdGxlKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5kZXNjcmlwdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdGFQYXJhbXMgPSBbbVBhcmFtZXRlcnMudGl0bGUgKyBcIiBcIiwgbVBhcmFtZXRlcnMuZGVzY3JpcHRpb25dO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGFQYXJhbXMgPSBbbVBhcmFtZXRlcnMudGl0bGUsIFwiXCJdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdG5vblRhYmxlVHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPXCIsXG5cdFx0XHRcdFx0XHRcdFx0YVBhcmFtcyxcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRub25UYWJsZVR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfU0lOR1VMQVJcIixcblx0XHRcdFx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0b3B0aW9ucy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0dHlwZTogRGVsZXRlT3B0aW9uVHlwZXMuZGVsZXRhYmxlQ29udGV4dHMsXG5cdFx0XHRcdFx0XHRcdGNvbnRleHRzOiBjb250ZXh0c1RvRGVsZXRlLFxuXHRcdFx0XHRcdFx0XHR0ZXh0OiBub25UYWJsZVR4dCxcblx0XHRcdFx0XHRcdFx0c2VsZWN0ZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGNvbnRyb2w6IERlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sLlRFWFRcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBUYWJsZVxuXHRcdFx0XHRcdFx0bGV0IHRvdGFsRGVsZXRhYmxlID0gY29udGV4dHNUb0RlbGV0ZS5sZW5ndGg7XG5cblx0XHRcdFx0XHRcdGlmIChkcmFmdEVuYWJsZWQpIHtcblx0XHRcdFx0XHRcdFx0dG90YWxEZWxldGFibGUgKz1cblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlLmxlbmd0aCArXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZS5sZW5ndGggK1xuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cy5sZW5ndGg7XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZUhlbHBlci51cGRhdGVEcmFmdE9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyhcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0XHRjb250ZXh0c1RvRGVsZXRlLFxuXHRcdFx0XHRcdFx0XHRcdHRvdGFsRGVsZXRhYmxlLFxuXHRcdFx0XHRcdFx0XHRcdHJlc291cmNlTW9kZWwsXG5cdFx0XHRcdFx0XHRcdFx0aXRlbXMsXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9uc1xuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgbm9uRGVsZXRhYmxlVGV4dCA9IGRlbGV0ZUhlbHBlci5nZXROb25EZWxldGFibGVUZXh0KG1QYXJhbWV0ZXJzLCB0b3RhbERlbGV0YWJsZSwgcmVzb3VyY2VNb2RlbCk7XG5cdFx0XHRcdFx0XHRcdGlmIChub25EZWxldGFibGVUZXh0KSB7XG5cdFx0XHRcdFx0XHRcdFx0aXRlbXMucHVzaChub25EZWxldGFibGVUZXh0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjb25zdCBvcHRpb25zRGVsZXRhYmxlVGV4dHMgPSBkZWxldGVIZWxwZXIuZ2V0T3B0aW9uc0ZvckRlbGV0YWJsZVRleHRzKFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0Y29udGV4dHNUb0RlbGV0ZSxcblx0XHRcdFx0XHRcdFx0cmVzb3VyY2VNb2RlbFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdG9wdGlvbnMgPSBbLi4ub3B0aW9ucywgLi4ub3B0aW9uc0RlbGV0YWJsZVRleHRzXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDb250ZW50IG9mIERlbGV0ZSBEaWFsb2dcblx0XHRcdFx0ZGVsZXRlSGVscGVyLnVwZGF0ZUNvbnRlbnRGb3JEZWxldGVEaWFsb2cob3B0aW9ucywgaXRlbXMpO1xuXHRcdFx0XHRjb25zdCB2Qm94ID0gbmV3IFZCb3goeyBpdGVtczogaXRlbXMgfSk7XG5cdFx0XHRcdGNvbnN0IHNUaXRsZSA9IHJlc291cmNlQnVuZGxlQ29yZS5nZXRUZXh0KFwiQ19DT01NT05fREVMRVRFXCIpO1xuXG5cdFx0XHRcdGNvbnN0IGZuQ29uZmlybSA9IGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGF3YWl0IGRlbGV0ZUhlbHBlci5kZWxldGVDb25maXJtSGFuZGxlcihcblx0XHRcdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdGRyYWZ0RW5hYmxlZFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0cmVqZWN0KCk7XG5cdFx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblxuXHRcdFx0XHRsZXQgZGlhbG9nQ29uZmlybWVkID0gZmFsc2U7XG5cdFx0XHRcdGNvbnN0IG9EaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdFx0XHR0aXRsZTogc1RpdGxlLFxuXHRcdFx0XHRcdHN0YXRlOiBcIldhcm5pbmdcIixcblx0XHRcdFx0XHRjb250ZW50OiBbdkJveF0sXG5cdFx0XHRcdFx0YXJpYUxhYmVsbGVkQnk6IGl0ZW1zLFxuXHRcdFx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdHRleHQ6IHJlc291cmNlQnVuZGxlQ29yZS5nZXRUZXh0KFwiQ19DT01NT05fREVMRVRFXCIpLFxuXHRcdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdFx0ZGlhbG9nQ29uZmlybWVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRmbkNvbmZpcm0oKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0dGV4dDogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19DT01NT05fRElBTE9HX0NBTkNFTFwiKSxcblx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHRcdC8vIGlmIGRpYWxvZyBpcyBjbG9zZWQgdW5jb25maXJtZWQgKGUuZy4gdmlhIFwiQ2FuY2VsXCIgb3IgRXNjYXBlIGJ1dHRvbiksIGVuc3VyZSB0byByZWplY3QgcHJvbWlzZVxuXHRcdFx0XHRcdFx0aWYgKCFkaWFsb2dDb25maXJtZWQpIHtcblx0XHRcdFx0XHRcdFx0cmVqZWN0KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGFzIGFueSk7XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5ub0RpYWxvZykge1xuXHRcdFx0XHRcdGZuQ29uZmlybSgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9EaWFsb2cuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0XHRcdFx0b0RpYWxvZy5vcGVuKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdC8vIGRlbGV0ZSBkb2N1bWVudCB1bmxvY2tcblx0XHRcdFx0dGhpcy5idXN5VW5sb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogRWRpdHMgYSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gb1ZpZXcgQ3VycmVudCB2aWV3XG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcENvbXBvbmVudFxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSBuZXcgZHJhZnQgY29udGV4dCBpbiBjYXNlIG9mIGRyYWZ0IHByb2dyYW1taW5nIG1vZGVsXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIGVkaXREb2N1bWVudChcblx0XHRvQ29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0b1ZpZXc6IFZpZXcsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyXG5cdCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+IHtcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQmluZGluZyBjb250ZXh0IHRvIGFjdGl2ZSBkb2N1bWVudCBpcyByZXF1aXJlZFwiKTtcblx0XHR9XG5cdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmIHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRWRpdCBpcyBvbmx5IGFsbG93ZWQgZm9yIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uIHN1cHBvcnRlZCBzZXJ2aWNlc1wiKTtcblx0XHR9XG5cdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQpO1xuXHRcdC8vIGJlZm9yZSB0cmlnZ2VyaW5nIHRoZSBlZGl0IGFjdGlvbiB3ZSdsbCBoYXZlIHRvIHJlbW92ZSBhbGwgYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlc1xuXHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG9OZXdDb250ZXh0ID1cblx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnRcblx0XHRcdFx0XHQ/IGF3YWl0IGRyYWZ0LmNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50KG9Db250ZXh0LCBhcHBDb21wb25lbnQsIHtcblx0XHRcdFx0XHRcdFx0YlByZXNlcnZlQ2hhbmdlczogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0b1ZpZXc6IG9WaWV3XG5cdFx0XHRcdFx0ICB9IGFzIGFueSlcblx0XHRcdFx0XHQ6IGF3YWl0IHN0aWNreS5lZGl0RG9jdW1lbnRJblN0aWNreVNlc3Npb24ob0NvbnRleHQsIGFwcENvbXBvbmVudCk7XG5cblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cdFx0XHRyZXR1cm4gb05ld0NvbnRleHQ7XG5cdFx0fSBjYXRjaCAoZXJyOiBhbnkpIHtcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcyh7IGNvbmN1cnJlbnRFZGl0RmxhZzogdHJ1ZSB9KTtcblx0XHRcdHRocm93IGVycjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0dGhpcy5idXN5VW5sb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENhbmNlbCAnZWRpdCcgbW9kZSBvZiBhIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgY2FuY2VsZWQgb3IgZGVsZXRlZFxuXHQgKiBAcGFyYW0gW21JblBhcmFtZXRlcnNdIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiBDYW5jZWwgQnV0dG9uIG9mIHRoZSBkaXNjYXJkIHBvcG92ZXIgKG1hbmRhdG9yeSBmb3Igbm93KVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIgT3B0aW9uYWwsIHN1cHJlc3NlcyB0aGUgZGlzY2FyZCBwb3BvdmVyIGluY2FzZSBvZiBkcmFmdCBhcHBsaWNhdGlvbnMgd2hpbGUgbmF2aWdhdGluZyBvdXQgb2YgT1Bcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwQ29tcG9uZW50XG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIFRoZSBtb2RlbCB0byBsb2FkIHRleHQgcmVzb3VyY2VzXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcGFyYW0gaXNOZXdPYmplY3QgVHJ1ZSBpZiB3ZSdyZSB0cnlpbmcgdG8gY2FuY2VsIGEgbmV3bHkgY3JlYXRlZCBvYmplY3Rcblx0ICogQHBhcmFtIGlzT2JqZWN0TW9kaWZpZWQgVHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIG1vZGlmaWVkIGJ5IHRoZSB1c2VyXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCA/Pz9cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgY2FuY2VsRG9jdW1lbnQoXG5cdFx0b0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdG1JblBhcmFtZXRlcnM6IHsgY2FuY2VsQnV0dG9uOiBCdXR0b247IHNraXBEaXNjYXJkUG9wb3ZlcjogYm9vbGVhbiB9IHwgdW5kZWZpbmVkLFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdGlzTmV3T2JqZWN0OiBib29sZWFuLFxuXHRcdGlzT2JqZWN0TW9kaWZpZWQ6IGJvb2xlYW5cblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IGJvb2xlYW4+IHtcblx0XHQvL2NvbnRleHQgbXVzdCBhbHdheXMgYmUgcGFzc2VkIC0gbWFuZGF0b3J5IHBhcmFtZXRlclxuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIk5vIGNvbnRleHQgZXhpc3RzLiBQYXNzIGEgbWVhbmluZ2Z1bCBjb250ZXh0XCIpO1xuXHRcdH1cblx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0Y29uc3QgbVBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKG1JblBhcmFtZXRlcnMpO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXG5cdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmIHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ2FuY2VsIGRvY3VtZW50IG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0bGV0IHJldHVybmVkVmFsdWU6IE9EYXRhVjRDb250ZXh0IHwgYm9vbGVhbiA9IGZhbHNlO1xuXG5cdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgIWlzT2JqZWN0TW9kaWZpZWQpIHtcblx0XHRcdFx0Y29uc3QgZHJhZnREYXRhQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChgJHtvQ29udGV4dC5nZXRQYXRoKCl9L0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhYCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdGNvbnN0IGRyYWZ0QWRtaW5EYXRhID0gYXdhaXQgZHJhZnREYXRhQ29udGV4dC5yZXF1ZXN0T2JqZWN0KCk7XG5cdFx0XHRcdGlmIChkcmFmdEFkbWluRGF0YSkge1xuXHRcdFx0XHRcdGlzT2JqZWN0TW9kaWZpZWQgPSBkcmFmdEFkbWluRGF0YS5DcmVhdGlvbkRhdGVUaW1lICE9PSBkcmFmdEFkbWluRGF0YS5MYXN0Q2hhbmdlRGF0ZVRpbWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICghbVBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyKSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuX2NvbmZpcm1EaXNjYXJkKG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiwgaXNPYmplY3RNb2RpZmllZCwgcmVzb3VyY2VNb2RlbCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0NvbnRleHQuaXNLZWVwQWxpdmUoKSkge1xuXHRcdFx0XHQvLyBpZiB0aGUgY29udGV4dCBpcyBrZXB0IGFsaXZlIHdlIHNldCBpdCBhZ2FpbiB0byBkZXRhY2ggdGhlIG9uQmVmb3JlRGVzdHJveSBjYWxsYmFjayBhbmQgaGFuZGxlIG5hdmlnYXRpb24gaGVyZVxuXHRcdFx0XHQvLyB0aGUgY29udGV4dCBuZWVkcyB0byBzdGlsbCBiZSBrZXB0IGFsaXZlIHRvIGJlIGFibGUgdG8gcmVzZXQgY2hhbmdlcyBwcm9wZXJseVxuXHRcdFx0XHRvQ29udGV4dC5zZXRLZWVwQWxpdmUodHJ1ZSwgdW5kZWZpbmVkKTtcblx0XHRcdH1cblx0XHRcdGlmIChtUGFyYW1ldGVycy5iZWZvcmVDYW5jZWxDYWxsQmFjaykge1xuXHRcdFx0XHRhd2FpdCBtUGFyYW1ldGVycy5iZWZvcmVDYW5jZWxDYWxsQmFjayh7IGNvbnRleHQ6IG9Db250ZXh0IH0pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdGlmIChpc05ld09iamVjdCkge1xuXHRcdFx0XHRcdGlmIChvQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRvQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybmVkVmFsdWUgPSBhd2FpdCBkcmFmdC5kZWxldGVEcmFmdChvQ29udGV4dCwgYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCBvU2libGluZ0NvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9TaWJsaW5nRW50aXR5YCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGNvbnN0IHNDYW5vbmljYWxQYXRoID0gYXdhaXQgb1NpYmxpbmdDb250ZXh0LnJlcXVlc3RDYW5vbmljYWxQYXRoKCk7XG5cdFx0XHRcdFx0XHRpZiAob0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdFx0XHRvQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm5lZFZhbHVlID0gb01vZGVsLmJpbmRDb250ZXh0KHNDYW5vbmljYWxQYXRoKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0YXdhaXQgZHJhZnQuZGVsZXRlRHJhZnQob0NvbnRleHQsIGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBkaXNjYXJkZWRDb250ZXh0ID0gYXdhaXQgc3RpY2t5LmRpc2NhcmREb2N1bWVudChvQ29udGV4dCk7XG5cdFx0XHRcdGlmIChkaXNjYXJkZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0aWYgKGRpc2NhcmRlZENvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdFx0ZGlzY2FyZGVkQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICghaXNOZXdPYmplY3QpIHtcblx0XHRcdFx0XHRcdGRpc2NhcmRlZENvbnRleHQucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuZWRWYWx1ZSA9IGRpc2NhcmRlZENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIHJlbW92ZSBleGlzdGluZyBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzXG5cdFx0XHRtZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdC8vIHNob3cgdW5ib3VuZCBtZXNzYWdlc1xuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHRyZXR1cm4gcmV0dXJuZWRWYWx1ZTtcblx0XHR9IGNhdGNoIChlcnI6IGFueSkge1xuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTYXZlcyB0aGUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIHNhdmVkXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcENvbXBvbmVudFxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuXHQgKiBAcGFyYW0gZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciBUcnVlIGlmIHdlIHNob3VsZCBleGVjdXRlIHNpZGUgZWZmZWN0cyBpbiBjYXNlIG9mIGFuIGVycm9yXG5cdCAqIEBwYXJhbSBiaW5kaW5nc0ZvclNpZGVFZmZlY3RzIFRoZSBsaXN0QmluZGluZ3MgdG8gYmUgdXNlZCBmb3IgZXhlY3V0aW5nIHNpZGUgZWZmZWN0cyBvbiBlcnJvclxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHBhcmFtIGlzTmV3T2JqZWN0IFRydWUgaWYgd2UncmUgdHJ5aW5nIHRvIGNhbmNlbCBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCA/Pz9cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgc2F2ZURvY3VtZW50KFxuXHRcdGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdFx0ZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcjogYm9vbGVhbixcblx0XHRiaW5kaW5nc0ZvclNpZGVFZmZlY3RzOiBPRGF0YUxpc3RCaW5kaW5nW10sXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdGlzTmV3T2JqZWN0OiBib29sZWFuXG5cdCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQ+IHtcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5ICYmIHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJTYXZlIGlzIG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHRjb25zdCBvQWN0aXZlRG9jdW1lbnQgPVxuXHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdFxuXHRcdFx0XHRcdD8gYXdhaXQgZHJhZnQuYWN0aXZhdGVEb2N1bWVudChjb250ZXh0LCBhcHBDb21wb25lbnQsIHt9LCBtZXNzYWdlSGFuZGxlcilcblx0XHRcdFx0XHQ6IGF3YWl0IHN0aWNreS5hY3RpdmF0ZURvY3VtZW50KGNvbnRleHQsIGFwcENvbXBvbmVudCk7XG5cblx0XHRcdGNvbnN0IG1lc3NhZ2VzUmVjZWl2ZWQgPSBtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXMoKS5jb25jYXQobWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKHRydWUsIHRydWUpKTsgLy8gZ2V0IHVuYm91bmQgYW5kIGJvdW5kIG1lc3NhZ2VzIHByZXNlbnQgaW4gdGhlIG1vZGVsXG5cdFx0XHRpZiAoIShtZXNzYWdlc1JlY2VpdmVkLmxlbmd0aCA9PT0gMSAmJiBtZXNzYWdlc1JlY2VpdmVkWzBdLnR5cGUgPT09IGNvcmVMaWJyYXJ5Lk1lc3NhZ2VUeXBlLlN1Y2Nlc3MpKSB7XG5cdFx0XHRcdC8vIHNob3cgb3VyIG9iamVjdCBjcmVhdGlvbiB0b2FzdCBvbmx5IGlmIGl0IGlzIG5vdCBjb21pbmcgZnJvbSBiYWNrZW5kXG5cdFx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KFxuXHRcdFx0XHRcdGlzTmV3T2JqZWN0XG5cdFx0XHRcdFx0XHQ/IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9DUkVBVEVEXCIpXG5cdFx0XHRcdFx0XHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9TQVZFRFwiKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb0FjdGl2ZURvY3VtZW50O1xuXHRcdH0gY2F0Y2ggKGVycjogYW55KSB7XG5cdFx0XHRpZiAoZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciAmJiBiaW5kaW5nc0ZvclNpZGVFZmZlY3RzPy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdC8qIFRoZSBzaWRlRWZmZWN0cyBhcmUgZXhlY3V0ZWQgb25seSBmb3IgdGFibGUgaXRlbXMgaW4gdHJhbnNpZW50IHN0YXRlICovXG5cdFx0XHRcdGJpbmRpbmdzRm9yU2lkZUVmZmVjdHMuZm9yRWFjaCgobGlzdEJpbmRpbmcpID0+IHtcblx0XHRcdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KGxpc3RCaW5kaW5nLmdldFBhdGgoKSwgY29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbHMgYSBib3VuZCBvciB1bmJvdW5kIGFjdGlvbi5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBzdGF0aWNcblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIuY2FsbEFjdGlvblxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXNdIEEgbWFwIG9mIGFjdGlvbiBwYXJhbWV0ZXIgbmFtZXMgYW5kIHByb3ZpZGVkIHZhbHVlc1xuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2ddIFNraXBzIHRoZSBwYXJhbWV0ZXIgZGlhbG9nIGlmIHZhbHVlcyBhcmUgcHJvdmlkZWQgZm9yIGFsbCBvZiB0aGVtXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuY29udGV4dHNdIE1hbmRhdG9yeSBmb3IgYSBib3VuZCBhY3Rpb246IEVpdGhlciBvbmUgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIGZvciB3aGljaCB0aGUgYWN0aW9uIGlzIHRvIGJlIGNhbGxlZFxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLm1vZGVsXSBNYW5kYXRvcnkgZm9yIGFuIHVuYm91bmQgYWN0aW9uOiBBbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbFxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZ10gTW9kZSBob3cgYWN0aW9ucyBhcmUgdG8gYmUgY2FsbGVkOiAnQ2hhbmdlU2V0JyB0byBwdXQgYWxsIGFjdGlvbiBjYWxscyBpbnRvIG9uZSBjaGFuZ2VzZXQsICdJc29sYXRlZCcgdG8gcHV0IHRoZW0gaW50byBzZXBhcmF0ZSBjaGFuZ2VzZXRzXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMubGFiZWxdIEEgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5iR2V0Qm91bmRDb250ZXh0XSBJZiBzcGVjaWZpZWQsIHRoZSBhY3Rpb24gcHJvbWlzZSByZXR1cm5zIHRoZSBib3VuZCBjb250ZXh0XG5cdCAqIEBwYXJhbSBvVmlldyBDb250YWlucyB0aGUgb2JqZWN0IG9mIHRoZSBjdXJyZW50IHZpZXdcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwQ29tcG9uZW50XG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgcmVzcG9uc2Ugb2JqZWN0cyAoVE9ETzogdG8gYmUgY2hhbmdlZClcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgY2FsbEFjdGlvbihcblx0XHRzQWN0aW9uTmFtZTogc3RyaW5nLFxuXHRcdG1QYXJhbWV0ZXJzOiBhbnksXG5cdFx0b1ZpZXc6IFZpZXcgfCBudWxsLFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlclxuXHQpOiBQcm9taXNlPGFueT4ge1xuXHRcdG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtUGFyYW1ldGVycyk7XG5cdFx0bGV0IGNvbnRleHRUb1Byb2Nlc3MsIG9Nb2RlbDogYW55O1xuXHRcdGNvbnN0IG1CaW5kaW5nUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzLmJpbmRpbmdQYXJhbWV0ZXJzO1xuXHRcdGlmICghc0FjdGlvbk5hbWUpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlByb3ZpZGUgbmFtZSBvZiBhY3Rpb24gdG8gYmUgZXhlY3V0ZWRcIik7XG5cdFx0fVxuXHRcdC8vIGFjdGlvbiBpbXBvcnRzIGFyZSBub3QgZGlyZWN0bHkgb2J0YWluZWQgZnJvbSB0aGUgbWV0YU1vZGVsIGJ5IGl0IGlzIHByZXNlbnQgaW5zaWRlIHRoZSBlbnRpdHlDb250YWluZXJcblx0XHQvLyBhbmQgdGhlIGFjaW9ucyBpdCByZWZlcnMgdG8gcHJlc2VudCBvdXRzaWRlIHRoZSBlbnRpdHljb250YWluZXIsIGhlbmNlIHRvIG9idGFpbiBraW5kIG9mIHRoZSBhY3Rpb25cblx0XHQvLyBzcGxpdCgpIG9uIGl0cyBuYW1lIHdhcyByZXF1aXJlZFxuXHRcdGNvbnN0IHNOYW1lID0gc0FjdGlvbk5hbWUuc3BsaXQoXCIvXCIpWzFdO1xuXHRcdHNBY3Rpb25OYW1lID0gc05hbWUgfHwgc0FjdGlvbk5hbWU7XG5cdFx0Y29udGV4dFRvUHJvY2VzcyA9IHNOYW1lID8gdW5kZWZpbmVkIDogbVBhcmFtZXRlcnMuY29udGV4dHM7XG5cdFx0Ly9jaGVja2luZyB3aGV0aGVyIHRoZSBjb250ZXh0IGlzIGFuIGFycmF5IHdpdGggbW9yZSB0aGFuIDAgbGVuZ3RoIG9yIG5vdCBhbiBhcnJheShjcmVhdGUgYWN0aW9uKVxuXHRcdGlmIChjb250ZXh0VG9Qcm9jZXNzICYmICgoQXJyYXkuaXNBcnJheShjb250ZXh0VG9Qcm9jZXNzKSAmJiBjb250ZXh0VG9Qcm9jZXNzLmxlbmd0aCkgfHwgIUFycmF5LmlzQXJyYXkoY29udGV4dFRvUHJvY2VzcykpKSB7XG5cdFx0XHRjb250ZXh0VG9Qcm9jZXNzID0gQXJyYXkuaXNBcnJheShjb250ZXh0VG9Qcm9jZXNzKSA/IGNvbnRleHRUb1Byb2Nlc3NbMF0gOiBjb250ZXh0VG9Qcm9jZXNzO1xuXHRcdFx0b01vZGVsID0gY29udGV4dFRvUHJvY2Vzcy5nZXRNb2RlbCgpO1xuXHRcdH1cblx0XHRpZiAobVBhcmFtZXRlcnMubW9kZWwpIHtcblx0XHRcdG9Nb2RlbCA9IG1QYXJhbWV0ZXJzLm1vZGVsO1xuXHRcdH1cblx0XHRpZiAoIW9Nb2RlbCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiUGFzcyBhIGNvbnRleHQgZm9yIGEgYm91bmQgYWN0aW9uIG9yIHBhc3MgdGhlIG1vZGVsIGZvciBhbiB1bmJvdW5kIGFjdGlvblwiKTtcblx0XHR9XG5cdFx0Ly8gZ2V0IHRoZSBiaW5kaW5nIHBhcmFtZXRlcnMgJHNlbGVjdCBhbmQgJGV4cGFuZCBmb3IgdGhlIHNpZGUgZWZmZWN0IG9uIHRoaXMgYWN0aW9uXG5cdFx0Ly8gYWxzbyBnYXRoZXIgYWRkaXRpb25hbCBwcm9wZXJ0eSBwYXRocyB0byBiZSByZXF1ZXN0ZWQgc3VjaCBhcyB0ZXh0IGFzc29jaWF0aW9uc1xuXHRcdGNvbnN0IG1TaWRlRWZmZWN0c1BhcmFtZXRlcnMgPSBhcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkuZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyhzQWN0aW9uTmFtZSwgY29udGV4dFRvUHJvY2VzcykgfHwge307XG5cblx0XHR0cnkge1xuXHRcdFx0bGV0IG9SZXN1bHQ6IGFueTtcblx0XHRcdGlmIChjb250ZXh0VG9Qcm9jZXNzICYmIG9Nb2RlbCkge1xuXHRcdFx0XHRvUmVzdWx0ID0gYXdhaXQgb3BlcmF0aW9ucy5jYWxsQm91bmRBY3Rpb24oc0FjdGlvbk5hbWUsIG1QYXJhbWV0ZXJzLmNvbnRleHRzLCBvTW9kZWwsIGFwcENvbXBvbmVudCwge1xuXHRcdFx0XHRcdHBhcmFtZXRlclZhbHVlczogbVBhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzLFxuXHRcdFx0XHRcdGludm9jYXRpb25Hcm91cGluZzogbVBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nLFxuXHRcdFx0XHRcdGxhYmVsOiBtUGFyYW1ldGVycy5sYWJlbCxcblx0XHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiBtUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nLFxuXHRcdFx0XHRcdG1CaW5kaW5nUGFyYW1ldGVyczogbUJpbmRpbmdQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdGVudGl0eVNldE5hbWU6IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUsXG5cdFx0XHRcdFx0YWRkaXRpb25hbFNpZGVFZmZlY3Q6IG1TaWRlRWZmZWN0c1BhcmFtZXRlcnMsXG5cdFx0XHRcdFx0b25TdWJtaXR0ZWQ6ICgpID0+IHtcblx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0b25SZXNwb25zZTogKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5idXN5VW5sb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRwYXJlbnRDb250cm9sOiBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLFxuXHRcdFx0XHRcdGNvbnRyb2xJZDogbVBhcmFtZXRlcnMuY29udHJvbElkLFxuXHRcdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0OiBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA6IG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCxcblx0XHRcdFx0XHRiSXNDcmVhdGVBY3Rpb246IG1QYXJhbWV0ZXJzLmJJc0NyZWF0ZUFjdGlvbixcblx0XHRcdFx0XHRiR2V0Qm91bmRDb250ZXh0OiBtUGFyYW1ldGVycy5iR2V0Qm91bmRDb250ZXh0LFxuXHRcdFx0XHRcdGJPYmplY3RQYWdlOiBtUGFyYW1ldGVycy5iT2JqZWN0UGFnZSxcblx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcjogbWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOiBtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24sXG5cdFx0XHRcdFx0c2VsZWN0ZWRJdGVtczogbVBhcmFtZXRlcnMuY29udGV4dHNcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvUmVzdWx0ID0gYXdhaXQgb3BlcmF0aW9ucy5jYWxsQWN0aW9uSW1wb3J0KHNBY3Rpb25OYW1lLCBvTW9kZWwsIGFwcENvbXBvbmVudCwge1xuXHRcdFx0XHRcdHBhcmFtZXRlclZhbHVlczogbVBhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzLFxuXHRcdFx0XHRcdGxhYmVsOiBtUGFyYW1ldGVycy5sYWJlbCxcblx0XHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiBtUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nLFxuXHRcdFx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzOiBtQmluZGluZ1BhcmFtZXRlcnMsXG5cdFx0XHRcdFx0ZW50aXR5U2V0TmFtZTogbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSxcblx0XHRcdFx0XHRvblN1Ym1pdHRlZDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0b25SZXNwb25zZTogKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5idXN5VW5sb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRwYXJlbnRDb250cm9sOiBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLFxuXHRcdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0OiBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA6IG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCxcblx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcjogbWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0Yk9iamVjdFBhZ2U6IG1QYXJhbWV0ZXJzLmJPYmplY3RQYWdlXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVBY3Rpb25SZXNwb25zZShtZXNzYWdlSGFuZGxlciwgbVBhcmFtZXRlcnMsIHNBY3Rpb25OYW1lKTtcblx0XHRcdHJldHVybiBvUmVzdWx0O1xuXHRcdH0gY2F0Y2ggKGVycjogYW55KSB7XG5cdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVBY3Rpb25SZXNwb25zZShtZXNzYWdlSGFuZGxlciwgbVBhcmFtZXRlcnMsIHNBY3Rpb25OYW1lKTtcblx0XHRcdHRocm93IGVycjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyBtZXNzYWdlcyBmb3IgYWN0aW9uIGNhbGwuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlciNfaGFuZGxlQWN0aW9uUmVzcG9uc2Vcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgUGFyYW1ldGVycyB0byBiZSBjb25zaWRlcmVkIGZvciB0aGUgYWN0aW9uLlxuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSBhZnRlciBtZXNzYWdlIGRpYWxvZyBpcyBvcGVuZWQgaWYgcmVxdWlyZWQuXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9oYW5kbGVBY3Rpb25SZXNwb25zZShtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsIG1QYXJhbWV0ZXJzOiBhbnksIHNBY3Rpb25OYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBhVHJhbnNpZW50TWVzc2FnZXMgPSBtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXModHJ1ZSwgdHJ1ZSk7XG5cdFx0Y29uc3QgYWN0aW9uTmFtZSA9IG1QYXJhbWV0ZXJzLmxhYmVsID8gbVBhcmFtZXRlcnMubGFiZWwgOiBzQWN0aW9uTmFtZTtcblx0XHRpZiAoYVRyYW5zaWVudE1lc3NhZ2VzLmxlbmd0aCA+IDAgJiYgbVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwic0FjdGlvbk5hbWVcIiwgbVBhcmFtZXRlcnMubGFiZWwgPyBtUGFyYW1ldGVycy5sYWJlbCA6IHNBY3Rpb25OYW1lKTtcblx0XHR9XG5cdFx0bGV0IGNvbnRyb2w7XG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkge1xuXHRcdFx0Y29udHJvbCA9IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wuYnlJZChtUGFyYW1ldGVycy5jb250cm9sSWQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb250cm9sID0gbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbDtcblx0XHR9XG5cdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcyh7IHNBY3Rpb25OYW1lOiBhY3Rpb25OYW1lLCBjb250cm9sOiBjb250cm9sIH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdmFsaWRhdGlvbiBlcnJvcnMgZm9yIHRoZSAnRGlzY2FyZCcgYWN0aW9uLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIjaGFuZGxlVmFsaWRhdGlvbkVycm9yXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdGhhbmRsZVZhbGlkYXRpb25FcnJvcigpIHtcblx0XHRjb25zdCBvTWVzc2FnZU1hbmFnZXIgPSBDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCksXG5cdFx0XHRlcnJvclRvUmVtb3ZlID0gb01lc3NhZ2VNYW5hZ2VyXG5cdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKGVycm9yOiBhbnkpIHtcblx0XHRcdFx0XHQvLyBvbmx5IG5lZWRzIHRvIGhhbmRsZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLCB0ZWNobmljYWwgYW5kIHBlcnNpc3RlbnQgZXJyb3JzIG5lZWRzIG5vdCB0byBiZSBjaGVja2VkIGhlcmUuXG5cdFx0XHRcdFx0aWYgKGVycm9yLnZhbGlkYXRpb24pIHtcblx0XHRcdFx0XHRcdHJldHVybiBlcnJvcjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdG9NZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhlcnJvclRvUmVtb3ZlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IFBvcG92ZXIuIEZhY3RvcnkgbWV0aG9kIHRvIG1ha2UgdW5pdCB0ZXN0cyBlYXNpZXIuXG5cdCAqXG5cdCAqIEBwYXJhbSBzZXR0aW5ncyBJbml0aWFsIHBhcmFtZXRlcnMgZm9yIHRoZSBwb3BvdmVyXG5cdCAqIEByZXR1cm5zIEEgbmV3IFBvcG92ZXJcblx0ICovXG5cdF9jcmVhdGVQb3BvdmVyKHNldHRpbmdzPzogJFBvcG92ZXJTZXR0aW5ncyk6IFBvcG92ZXIge1xuXHRcdHJldHVybiBuZXcgUG9wb3ZlcihzZXR0aW5ncyk7XG5cdH1cblxuXHQvKipcblx0ICogU2hvd3MgYSBwb3BvdmVyIHRvIGNvbmZpcm0gZGlzY2FyZCBpZiBuZWVkZWQuXG5cdCAqXG5cdCAqIEBzdGF0aWNcblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIuX3Nob3dEaXNjYXJkUG9wb3ZlclxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHBhcmFtIGNhbmNlbEJ1dHRvbiBUaGUgY29udHJvbCB3aGljaCB3aWxsIG9wZW4gdGhlIHBvcG92ZXJcblx0ICogQHBhcmFtIGlzTW9kaWZpZWQgVHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIG1vZGlmaWVkIGFuZCBhIGNvbmZpcm1hdGlvbiBwb3BvdmVyIG11c3QgYmUgc2hvd25cblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWwgVGhlIG1vZGVsIHRvIGxvYWQgdGV4dCByZXNvdXJjZXNcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBpZiB1c2VyIGNvbmZpcm1zIGRpc2NhcmQsIHJlamVjdHMgaWYgb3RoZXJ3aXNlLCByZWplY3RzIGlmIG5vIGNvbnRyb2wgcGFzc2VkIHRvIG9wZW4gcG9wb3ZlclxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfY29uZmlybURpc2NhcmQoY2FuY2VsQnV0dG9uOiBCdXR0b24sIGlzTW9kaWZpZWQ6IGJvb2xlYW4sIHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyBJZiB0aGUgZGF0YSBpc24ndCBtb2RpZmllZCwgZG8gbm90IHNob3cgYW55IGNvbmZpcm1hdGlvbiBwb3BvdmVyXG5cdFx0aWYgKCFpc01vZGlmaWVkKSB7XG5cdFx0XHR0aGlzLmhhbmRsZVZhbGlkYXRpb25FcnJvcigpO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblxuXHRcdGNhbmNlbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTtcblx0XHRyZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0Y29uc3QgY29uZmlybWF0aW9uUG9wb3ZlciA9IHRoaXMuX2NyZWF0ZVBvcG92ZXIoe1xuXHRcdFx0XHRzaG93SGVhZGVyOiBmYWxzZSxcblx0XHRcdFx0cGxhY2VtZW50OiBcIlRvcFwiXG5cdFx0XHR9KTtcblx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cblx0XHRcdC8vIENyZWF0ZSB0aGUgY29udGVudCBvZiB0aGUgcG9wb3ZlclxuXHRcdFx0Y29uc3QgdGl0bGUgPSBuZXcgVGV4dCh7XG5cdFx0XHRcdHRleHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfTUVTU0FHRVwiKVxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBjb25maXJtQnV0dG9uID0gbmV3IEJ1dHRvbih7XG5cdFx0XHRcdHRleHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfQlVUVE9OXCIpLFxuXHRcdFx0XHR3aWR0aDogXCIxMDAlXCIsXG5cdFx0XHRcdHByZXNzOiAoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5oYW5kbGVWYWxpZGF0aW9uRXJyb3IoKTtcblx0XHRcdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmRhdGEoXCJjb250aW51ZURpc2NhcmRcIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0Y29uZmlybWF0aW9uUG9wb3Zlci5jbG9zZSgpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRhcmlhTGFiZWxsZWRCeTogW3RpdGxlXVxuXHRcdFx0fSk7XG5cdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmFkZENvbnRlbnQobmV3IFZCb3goeyBpdGVtczogW3RpdGxlLCBjb25maXJtQnV0dG9uXSB9KSk7XG5cblx0XHRcdC8vIEF0dGFjaCBoYW5kbGVyXG5cdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmF0dGFjaEJlZm9yZU9wZW4oKCkgPT4ge1xuXHRcdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLnNldEluaXRpYWxGb2N1cyhjb25maXJtQnV0dG9uKTtcblx0XHRcdH0pO1xuXHRcdFx0Y29uZmlybWF0aW9uUG9wb3Zlci5hdHRhY2hBZnRlckNsb3NlKCgpID0+IHtcblx0XHRcdFx0Y2FuY2VsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7XG5cdFx0XHRcdGlmIChjb25maXJtYXRpb25Qb3BvdmVyLmRhdGEoXCJjb250aW51ZURpc2NhcmRcIikpIHtcblx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVqZWN0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLm9wZW5CeShjYW5jZWxCdXR0b24sIGZhbHNlKTtcblx0XHR9KTtcblx0fVxuXG5cdF9sYXVuY2hEaWFsb2dXaXRoS2V5RmllbGRzKFxuXHRcdG9MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRtRmllbGRzOiBhbnksXG5cdFx0b01vZGVsOiBPRGF0YU1vZGVsLFxuXHRcdG1QYXJhbWV0ZXJzOiBhbnksXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyXG5cdCkge1xuXHRcdGxldCBvRGlhbG9nOiBEaWFsb2c7XG5cdFx0Y29uc3Qgb1BhcmVudENvbnRyb2wgPSBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sO1xuXG5cdFx0Ly8gQ3JhdGUgYSBmYWtlICh0cmFuc2llbnQpIGxpc3RCaW5kaW5nIGFuZCBjb250ZXh0LCBqdXN0IGZvciB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBkaWFsb2dcblx0XHRjb25zdCBvVHJhbnNpZW50TGlzdEJpbmRpbmcgPSBvTW9kZWwuYmluZExpc3Qob0xpc3RCaW5kaW5nLmdldFBhdGgoKSwgb0xpc3RCaW5kaW5nLmdldENvbnRleHQoKSwgW10sIFtdLCB7XG5cdFx0XHQkJHVwZGF0ZUdyb3VwSWQ6IFwic3VibWl0TGF0ZXJcIlxuXHRcdH0pO1xuXHRcdG9UcmFuc2llbnRMaXN0QmluZGluZy5yZWZyZXNoSW50ZXJuYWwgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHQvKiAqL1xuXHRcdH07XG5cdFx0Y29uc3Qgb1RyYW5zaWVudENvbnRleHQgPSBvVHJhbnNpZW50TGlzdEJpbmRpbmcuY3JlYXRlKG1QYXJhbWV0ZXJzLmRhdGEsIHRydWUpO1xuXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdGNvbnN0IHNGcmFnbWVudE5hbWUgPSBcInNhcC9mZS9jb3JlL2NvbnRyb2xzL05vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkc0RpYWxvZ1wiO1xuXHRcdFx0Y29uc3Qgb0ZyYWdtZW50ID0gWE1MVGVtcGxhdGVQcm9jZXNzb3IubG9hZFRlbXBsYXRlKHNGcmFnbWVudE5hbWUsIFwiZnJhZ21lbnRcIiksXG5cdFx0XHRcdHJlc291cmNlTW9kZWwgPSBnZXRSZXNvdXJjZU1vZGVsKG9QYXJlbnRDb250cm9sKSxcblx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0YUltbXV0YWJsZUZpZWxkczogYW55W10gPSBbXSxcblx0XHRcdFx0c1BhdGggPSAob0xpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSA/IG9MaXN0QmluZGluZy5nZXRSZXNvbHZlZFBhdGgoKSA6IG9MaXN0QmluZGluZy5nZXRQYXRoKCkpIGFzIHN0cmluZyxcblx0XHRcdFx0b0VudGl0eVNldENvbnRleHQgPSBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNQYXRoKSBhcyBDb250ZXh0LFxuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYXRoKTtcblx0XHRcdGZvciAoY29uc3QgaSBpbiBtRmllbGRzKSB7XG5cdFx0XHRcdGFJbW11dGFibGVGaWVsZHMucHVzaChvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGAke3NNZXRhUGF0aH0vJHttRmllbGRzW2ldfWApKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG9JbW11dGFibGVDdHhNb2RlbCA9IG5ldyBKU09OTW9kZWwoYUltbXV0YWJsZUZpZWxkcyk7XG5cdFx0XHRjb25zdCBvSW1tdXRhYmxlQ3R4ID0gb0ltbXV0YWJsZUN0eE1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKTtcblx0XHRcdGNvbnN0IGFSZXF1aXJlZFByb3BlcnRpZXMgPSBnZXRSZXF1aXJlZFByb3BlcnRpZXNGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zKHNNZXRhUGF0aCwgb01ldGFNb2RlbCk7XG5cdFx0XHRjb25zdCBvUmVxdWlyZWRQcm9wZXJ0eVBhdGhzQ3R4TW9kZWwgPSBuZXcgSlNPTk1vZGVsKGFSZXF1aXJlZFByb3BlcnRpZXMpO1xuXHRcdFx0Y29uc3Qgb1JlcXVpcmVkUHJvcGVydHlQYXRoc0N0eCA9IG9SZXF1aXJlZFByb3BlcnR5UGF0aHNDdHhNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cdFx0XHRjb25zdCBvTmV3RnJhZ21lbnQgPSBhd2FpdCBYTUxQcmVwcm9jZXNzb3IucHJvY2Vzcyhcblx0XHRcdFx0b0ZyYWdtZW50LFxuXHRcdFx0XHR7IG5hbWU6IHNGcmFnbWVudE5hbWUgfSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFx0XHRcdFx0ZW50aXR5U2V0OiBvRW50aXR5U2V0Q29udGV4dCxcblx0XHRcdFx0XHRcdGZpZWxkczogb0ltbXV0YWJsZUN0eCxcblx0XHRcdFx0XHRcdHJlcXVpcmVkUHJvcGVydGllczogb1JlcXVpcmVkUHJvcGVydHlQYXRoc0N0eFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IG9FbnRpdHlTZXRDb250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRcdFx0XHRmaWVsZHM6IG9JbW11dGFibGVDdHguZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdG1ldGFNb2RlbDogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdHJlcXVpcmVkUHJvcGVydGllczogb1JlcXVpcmVkUHJvcGVydHlQYXRoc0N0eE1vZGVsXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHQpO1xuXHRcdFx0bGV0IGFGb3JtRWxlbWVudHM6IGFueVtdID0gW107XG5cdFx0XHRjb25zdCBtRmllbGRWYWx1ZU1hcDogYW55ID0ge307XG5cdFx0XHRjb25zdCBtZXNzYWdlTWFuYWdlciA9IENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKTtcblx0XHRcdGNvbnN0IF9yZW1vdmVNZXNzYWdlc0ZvckFjdGlvblBhcmFtdGVyID0gKG1lc3NhZ2VDb250cm9sSWQ6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRjb25zdCBhbGxNZXNzYWdlcyA9IG1lc3NhZ2VNYW5hZ2VyLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKTtcblx0XHRcdFx0Ly8gYWxzbyByZW1vdmUgbWVzc2FnZXMgYXNzaWduZWQgdG8gaW5uZXIgY29udHJvbHMsIGJ1dCBhdm9pZCByZW1vdmluZyBtZXNzYWdlcyBmb3IgZGlmZmVyZW50IHBhcmFtdGVycyAod2l0aCBuYW1lIGJlaW5nIHN1YnN0cmluZyBvZiBhbm90aGVyIHBhcmFtZXRlciBuYW1lKVxuXHRcdFx0XHRjb25zdCByZWxldmFudE1lc3NhZ2VzID0gYWxsTWVzc2FnZXMuZmlsdGVyKChtc2c6IE1lc3NhZ2UpID0+XG5cdFx0XHRcdFx0bXNnLmdldENvbnRyb2xJZHMoKS5zb21lKChjb250cm9sSWQ6IHN0cmluZykgPT4gY29udHJvbElkLmluY2x1ZGVzKG1lc3NhZ2VDb250cm9sSWQpKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRtZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhyZWxldmFudE1lc3NhZ2VzKTtcblx0XHRcdH07XG5cblx0XHRcdGNvbnN0IG9Db250cm9sbGVyID0ge1xuXHRcdFx0XHQvKlxuXHRcdFx0XHRcdGZpcmVkIG9uIGZvY3VzIG91dCBmcm9tIGZpZWxkIG9yIG9uIHNlbGVjdGluZyBhIHZhbHVlIGZyb20gdGhlIHZhbHVlaGVscC5cblx0XHRcdFx0XHR0aGUgY3JlYXRlIGJ1dHRvbiAoQ29udGludWUpIGlzIGFsd2F5cyBlbmFibGVkLlxuXHRcdFx0XHRcdGxpdmVDaGFuZ2UgaXMgbm90IGZpcmVkIHdoZW4gdmFsdWUgaXMgYWRkZWQgZnJvbSB2YWx1ZWhlbHAuXG5cdFx0XHRcdFx0dmFsdWUgdmFsaWRhdGlvbiBpcyBkb25lIGZvciBjcmVhdGUgYnV0dG9uLlxuXHRcdFx0XHQqL1xuXHRcdFx0XHRoYW5kbGVDaGFuZ2U6IGFzeW5jIChldmVudDogRXZlbnQpID0+IHtcblx0XHRcdFx0XHRjb25zdCBmaWVsZElkID0gZXZlbnQuZ2V0UGFyYW1ldGVyKFwiaWRcIik7XG5cdFx0XHRcdFx0Y29uc3QgZmllbGQgPSBldmVudC5nZXRTb3VyY2UoKTtcblx0XHRcdFx0XHRjb25zdCBhY3Rpb25QYXJhbWV0ZXJJbmZvID0gYWN0aW9uUGFyYW1ldGVySW5mb3MuZmluZChcblx0XHRcdFx0XHRcdChhY3Rpb25QYXJhbWV0ZXJJbmZvKSA9PiBhY3Rpb25QYXJhbWV0ZXJJbmZvLmZpZWxkID09PSBmaWVsZFxuXHRcdFx0XHRcdCkgYXMgQWN0aW9uUGFyYW1ldGVySW5mbztcblx0XHRcdFx0XHRfcmVtb3ZlTWVzc2FnZXNGb3JBY3Rpb25QYXJhbXRlcihmaWVsZElkKTtcblx0XHRcdFx0XHRhY3Rpb25QYXJhbWV0ZXJJbmZvLnZhbGlkYXRpb25Qcm9taXNlID0gZXZlbnQuZ2V0UGFyYW1ldGVyKFwicHJvbWlzZVwiKSBhcyBQcm9taXNlPHN0cmluZz47XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGFjdGlvblBhcmFtZXRlckluZm8udmFsdWUgPSBhd2FpdCBhY3Rpb25QYXJhbWV0ZXJJbmZvLnZhbGlkYXRpb25Qcm9taXNlO1xuXHRcdFx0XHRcdFx0YWN0aW9uUGFyYW1ldGVySW5mby5oYXNFcnJvciA9IGZhbHNlO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRkZWxldGUgYWN0aW9uUGFyYW1ldGVySW5mby52YWx1ZTtcblx0XHRcdFx0XHRcdGFjdGlvblBhcmFtZXRlckluZm8uaGFzRXJyb3IgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0Lypcblx0XHRcdFx0XHRmaXJlZCBvbiBrZXkgcHJlc3MuIHRoZSBjcmVhdGUgYnV0dG9uIHRoZSBjcmVhdGUgYnV0dG9uIChDb250aW51ZSkgaXMgYWx3YXlzIGVuYWJsZWQuXG5cdFx0XHRcdFx0bGl2ZUNoYW5nZSBpcyBub3QgZmlyZWQgd2hlbiB2YWx1ZSBpcyBhZGRlZCBmcm9tIHZhbHVlaGVscC5cblx0XHRcdFx0XHR2YWx1ZSB2YWxpZGF0aW9uIGlzIGRvbmUgZm9yIGNyZWF0ZSBidXR0b24uXG5cdFx0XHRcdCovXG5cdFx0XHRcdGhhbmRsZUxpdmVDaGFuZ2U6IChldmVudDogRXZlbnQpID0+IHtcblx0XHRcdFx0XHRjb25zdCBmaWVsZElkID0gZXZlbnQuZ2V0UGFyYW1ldGVyKFwiaWRcIik7XG5cdFx0XHRcdFx0X3JlbW92ZU1lc3NhZ2VzRm9yQWN0aW9uUGFyYW10ZXIoZmllbGRJZCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdGNvbnN0IG9EaWFsb2dDb250ZW50OiBhbnkgPSBhd2FpdCBGcmFnbWVudC5sb2FkKHtcblx0XHRcdFx0ZGVmaW5pdGlvbjogb05ld0ZyYWdtZW50LFxuXHRcdFx0XHRjb250cm9sbGVyOiBvQ29udHJvbGxlclxuXHRcdFx0fSk7XG5cdFx0XHRsZXQgb1Jlc3VsdDogYW55O1xuXHRcdFx0Y29uc3QgY2xvc2VEaWFsb2cgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdC8vcmVqZWN0ZWQvcmVzb2x2ZWQgdGhlIHByb21pcyByZXR1cm5lZCBieSBfbGF1bmNoRGlhbG9nV2l0aEtleUZpZWxkc1xuXHRcdFx0XHQvL2FzIHNvb24gYXMgdGhlIGRpYWxvZyBpcyBjbG9zZWQuIFdpdGhvdXQgd2FpdGluZyBmb3IgdGhlIGRpYWxvZydzXG5cdFx0XHRcdC8vYW5pbWF0aW9uIHRvIGZpbmlzaFxuXHRcdFx0XHRpZiAob1Jlc3VsdC5lcnJvcikge1xuXHRcdFx0XHRcdHJlamVjdChvUmVzdWx0LmVycm9yKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXNvbHZlKG9SZXN1bHQucmVzcG9uc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdH07XG5cblx0XHRcdG9EaWFsb2cgPSBuZXcgRGlhbG9nKGdlbmVyYXRlKFtcIkNyZWF0ZURpYWxvZ1wiLCBzTWV0YVBhdGhdKSwge1xuXHRcdFx0XHR0aXRsZTogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfU0FQRkVfQUNUSU9OX0NSRUFURVwiKSxcblx0XHRcdFx0Y29udGVudDogW29EaWFsb2dDb250ZW50XSxcblx0XHRcdFx0YmVnaW5CdXR0b246IHtcblx0XHRcdFx0XHR0ZXh0OiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9TQVBGRV9BQ1RJT05fQ1JFQVRFX0JVVFRPTlwiKSxcblx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblxuXHRcdFx0XHRcdHByZXNzOiBhc3luYyAoX0V2ZW50OiB1bmtub3duKSA9PiB7XG5cdFx0XHRcdFx0XHQvKiBWYWxpZGF0aW9uIG9mIG1hbmRhdG9yeSBhbmQgdmFsdWUgc3RhdGUgZm9yIGFjdGlvbiBwYXJhbWV0ZXJzICovXG5cdFx0XHRcdFx0XHRpZiAoIShhd2FpdCBBY3Rpb25SdW50aW1lLnZhbGlkYXRlUHJvcGVydGllcyhtZXNzYWdlTWFuYWdlciwgYWN0aW9uUGFyYW1ldGVySW5mb3MsIHJlc291cmNlTW9kZWwpKSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdEJ1c3lMb2NrZXIubG9jayhvRGlhbG9nKTtcblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmJJc0NyZWF0ZURpYWxvZyA9IHRydWU7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhVmFsdWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXMobUZpZWxkVmFsdWVNYXApLm1hcChhc3luYyBmdW5jdGlvbiAoc0tleTogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvVmFsdWUgPSBhd2FpdCBtRmllbGRWYWx1ZU1hcFtzS2V5XTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9EaWFsb2dWYWx1ZTogYW55ID0ge307XG5cdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nVmFsdWVbc0tleV0gPSBvVmFsdWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0RpYWxvZ1ZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjaykge1xuXHRcdFx0XHRcdFx0XHRcdGF3YWl0IHRvRVM2UHJvbWlzZShcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrKHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dFBhdGg6IG9MaXN0QmluZGluZyAmJiBvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzOiBhVmFsdWVzXG5cdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0Y29uc3QgdHJhbnNpZW50RGF0YSA9IG9UcmFuc2llbnRDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjcmVhdGVEYXRhOiBhbnkgPSB7fTtcblx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXModHJhbnNpZW50RGF0YSkuZm9yRWFjaChmdW5jdGlvbiAoc1Byb3BlcnR5UGF0aDogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1Byb3BlcnR5ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofS8ke3NQcm9wZXJ0eVBhdGh9YCk7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gZW5zdXJlIG5hdmlnYXRpb24gcHJvcGVydGllcyBhcmUgbm90IHBhcnQgb2YgdGhlIHBheWxvYWQsIGRlZXAgY3JlYXRlIG5vdCBzdXBwb3J0ZWRcblx0XHRcdFx0XHRcdFx0XHRpZiAob1Byb3BlcnR5ICYmIG9Qcm9wZXJ0eS4ka2luZCA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRjcmVhdGVEYXRhW3NQcm9wZXJ0eVBhdGhdID0gdHJhbnNpZW50RGF0YVtzUHJvcGVydHlQYXRoXTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9OZXdEb2N1bWVudENvbnRleHQgPSBvTGlzdEJpbmRpbmcuY3JlYXRlKFxuXHRcdFx0XHRcdFx0XHRcdGNyZWF0ZURhdGEsXG5cdFx0XHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGVBdEVuZCxcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5pbmFjdGl2ZVxuXHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9Qcm9taXNlID0gdGhpcy5vbkFmdGVyQ3JlYXRlQ29tcGxldGlvbihvTGlzdEJpbmRpbmcsIG9OZXdEb2N1bWVudENvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHRcdFx0bGV0IG9SZXNwb25zZTogYW55ID0gYXdhaXQgb1Byb21pc2U7XG5cdFx0XHRcdFx0XHRcdGlmICghb1Jlc3BvbnNlIHx8IChvUmVzcG9uc2UgJiYgb1Jlc3BvbnNlLmJLZWVwRGlhbG9nT3BlbiAhPT0gdHJ1ZSkpIHtcblx0XHRcdFx0XHRcdFx0XHRvUmVzcG9uc2UgPSBvUmVzcG9uc2UgPz8ge307XG5cdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5zZXRCaW5kaW5nQ29udGV4dChudWxsIGFzIGFueSk7XG5cdFx0XHRcdFx0XHRcdFx0b1Jlc3BvbnNlLm5ld0NvbnRleHQgPSBvTmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRcdFx0XHRcdG9SZXN1bHQgPSB7IHJlc3BvbnNlOiBvUmVzcG9uc2UgfTtcblx0XHRcdFx0XHRcdFx0XHRjbG9zZURpYWxvZygpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHQvLyBpbiBjYXNlIG9mIGNyZWF0aW9uIGZhaWxlZCwgZGlhbG9nIHNob3VsZCBzdGF5IG9wZW4gLSB0byBhY2hpZXZlIHRoZSBzYW1lLCBub3RoaW5nIGhhcyB0byBiZSBkb25lIChsaWtlIGluIGNhc2Ugb2Ygc3VjY2VzcyB3aXRoIGJLZWVwRGlhbG9nT3Blbilcblx0XHRcdFx0XHRcdFx0aWYgKG9FcnJvciAhPT0gRkVMaWJyYXJ5LkNvbnN0YW50cy5DcmVhdGlvbkZhaWxlZCkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIG90aGVyIGVycm9ycyBhcmUgbm90IGV4cGVjdGVkXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc3VsdCA9IHsgZXJyb3I6IG9FcnJvciB9O1xuXHRcdFx0XHRcdFx0XHRcdGNsb3NlRGlhbG9nKCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9EaWFsb2cpO1xuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGVuZEJ1dHRvbjoge1xuXHRcdFx0XHRcdHRleHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfQ09NTU9OX0FDVElPTl9QQVJBTUVURVJfRElBTE9HX0NBTkNFTFwiKSxcblx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0b1Jlc3VsdCA9IHsgZXJyb3I6IEZFTGlicmFyeS5Db25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nIH07XG5cdFx0XHRcdFx0XHRjbG9zZURpYWxvZygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdC8qIFdoZW4gdGhlIGRpYWxvZyBpcyBjYW5jZWxsZWQsIG1lc3NhZ2VzIG5lZWQgdG8gYmUgcmVtb3ZlZCBpbiBjYXNlIHRoZSBzYW1lIGFjdGlvbiBzaG91bGQgYmUgZXhlY3V0ZWQgYWdhaW4gKi9cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGFjdGlvblBhcmFtZXRlckluZm8gb2YgYWN0aW9uUGFyYW1ldGVySW5mb3MpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGZpZWxkSWQgPSBhY3Rpb25QYXJhbWV0ZXJJbmZvLmZpZWxkLmdldElkKCk7XG5cdFx0XHRcdFx0XHRfcmVtb3ZlTWVzc2FnZXNGb3JBY3Rpb25QYXJhbXRlcihmaWVsZElkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gc2hvdyBmb290ZXIgYXMgcGVyIFVYIGd1aWRlbGluZXMgd2hlbiBkaWFsb2cgaXMgbm90IG9wZW5cblx0XHRcdFx0XHQob0RpYWxvZy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0KT8uc2V0UHJvcGVydHkoXCJpc0NyZWF0ZURpYWxvZ09wZW5cIiwgZmFsc2UpO1xuXHRcdFx0XHRcdG9EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdG9UcmFuc2llbnRMaXN0QmluZGluZy5kZXN0cm95KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gYXMgYW55KTtcblx0XHRcdGFGb3JtRWxlbWVudHMgPSBvRGlhbG9nQ29udGVudD8uZ2V0QWdncmVnYXRpb24oXCJmb3JtXCIpLmdldEFnZ3JlZ2F0aW9uKFwiZm9ybUNvbnRhaW5lcnNcIilbMF0uZ2V0QWdncmVnYXRpb24oXCJmb3JtRWxlbWVudHNcIik7XG5cdFx0XHRjb25zdCBhY3Rpb25QYXJhbWV0ZXJJbmZvcyA9IGFGb3JtRWxlbWVudHMubWFwKChwYXJhbWV0ZXJGaWVsZCkgPT4ge1xuXHRcdFx0XHRjb25zdCBmaWVsZDogRmllbGQgfCBNdWx0aVZhbHVlRmllbGQgPSBwYXJhbWV0ZXJGaWVsZC5nZXRGaWVsZHMoKVswXTtcblx0XHRcdFx0Y29uc3QgaXNNdWx0aVZhbHVlID0gZmllbGQuaXNBKFwic2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGRcIik7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0cGFyYW1ldGVyOiBwYXJhbWV0ZXJGaWVsZCxcblx0XHRcdFx0XHRpc011bHRpVmFsdWU6IGlzTXVsdGlWYWx1ZSxcblx0XHRcdFx0XHRmaWVsZDogZmllbGQsXG5cdFx0XHRcdFx0dmFsdWU6IGlzTXVsdGlWYWx1ZSA/IChmaWVsZCBhcyBNdWx0aVZhbHVlRmllbGQpLmdldEl0ZW1zKCkgOiAoZmllbGQgYXMgRmllbGQpLmdldFZhbHVlKCksXG5cdFx0XHRcdFx0dmFsaWRhdGlvblByb21pc2U6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRoYXNFcnJvcjogZmFsc2Vcblx0XHRcdFx0fTtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKG9QYXJlbnRDb250cm9sICYmIG9QYXJlbnRDb250cm9sLmFkZERlcGVuZGVudCkge1xuXHRcdFx0XHQvLyBpZiB0aGVyZSBpcyBhIHBhcmVudCBjb250cm9sIHNwZWNpZmllZCBhZGQgdGhlIGRpYWxvZyBhcyBkZXBlbmRlbnRcblx0XHRcdFx0b1BhcmVudENvbnRyb2wuYWRkRGVwZW5kZW50KG9EaWFsb2cpO1xuXHRcdFx0fVxuXG5cdFx0XHRvRGlhbG9nLnNldEJpbmRpbmdDb250ZXh0KG9UcmFuc2llbnRDb250ZXh0KTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IENvbW1vblV0aWxzLnNldFVzZXJEZWZhdWx0cyhcblx0XHRcdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0YUltbXV0YWJsZUZpZWxkcyxcblx0XHRcdFx0XHRvVHJhbnNpZW50Q29udGV4dCxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGVBY3Rpb24sXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuZGF0YVxuXHRcdFx0XHQpO1xuXHRcdFx0XHQvLyBmb290ZXIgbXVzdCBub3QgYmUgdmlzaWJsZSB3aGVuIHRoZSBkaWFsb2cgaXMgb3BlbiBhcyBwZXIgVVggZ3VpZGVsaW5lc1xuXHRcdFx0XHQob0RpYWxvZy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0KS5zZXRQcm9wZXJ0eShcImlzQ3JlYXRlRGlhbG9nT3BlblwiLCB0cnVlKTtcblx0XHRcdFx0b0RpYWxvZy5vcGVuKCk7XG5cdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKTtcblx0XHRcdFx0dGhyb3cgb0Vycm9yO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0b25BZnRlckNyZWF0ZUNvbXBsZXRpb24ob0xpc3RCaW5kaW5nOiBhbnksIG9OZXdEb2N1bWVudENvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGxldCBmblJlc29sdmU6IEZ1bmN0aW9uO1xuXHRcdGNvbnN0IG9Qcm9taXNlID0gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcblx0XHRcdGZuUmVzb2x2ZSA9IHJlc29sdmU7XG5cdFx0fSk7XG5cblx0XHRjb25zdCBmbkNyZWF0ZUNvbXBsZXRlZCA9IChvRXZlbnQ6IGFueSkgPT4ge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiY29udGV4dFwiKSxcblx0XHRcdFx0YlN1Y2Nlc3MgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKTtcblx0XHRcdGlmIChvQ29udGV4dCA9PT0gb05ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRvTGlzdEJpbmRpbmcuZGV0YWNoQ3JlYXRlQ29tcGxldGVkKGZuQ3JlYXRlQ29tcGxldGVkLCB0aGlzKTtcblx0XHRcdFx0Zm5SZXNvbHZlKGJTdWNjZXNzKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdGNvbnN0IGZuU2FmZUNvbnRleHRDcmVhdGVkID0gKCkgPT4ge1xuXHRcdFx0b05ld0RvY3VtZW50Q29udGV4dFxuXHRcdFx0XHQuY3JlYXRlZCgpXG5cdFx0XHRcdC50aGVuKHVuZGVmaW5lZCwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdExvZy50cmFjZShcInRyYW5zaWVudCBjcmVhdGlvbiBjb250ZXh0IGRlbGV0ZWRcIik7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoY29udGV4dEVycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgY3JlYXRpb24gY29udGV4dCBkZWxldGlvbiBlcnJvclwiLCBjb250ZXh0RXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0b0xpc3RCaW5kaW5nLmF0dGFjaENyZWF0ZUNvbXBsZXRlZChmbkNyZWF0ZUNvbXBsZXRlZCwgdGhpcyk7XG5cblx0XHRyZXR1cm4gb1Byb21pc2UudGhlbigoYlN1Y2Nlc3M6IGJvb2xlYW4pID0+IHtcblx0XHRcdGlmICghYlN1Y2Nlc3MpIHtcblx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkKSB7XG5cdFx0XHRcdFx0Ly8gQ2FuY2VsIHRoZSBwZW5kaW5nIFBPU1QgYW5kIGRlbGV0ZSB0aGUgY29udGV4dCBpbiB0aGUgbGlzdEJpbmRpbmdcblx0XHRcdFx0XHRmblNhZmVDb250ZXh0Q3JlYXRlZCgpOyAvLyBUbyBhdm9pZCBhICdyZXF1ZXN0IGNhbmNlbGxlZCcgZXJyb3IgaW4gdGhlIGNvbnNvbGVcblx0XHRcdFx0XHRvTGlzdEJpbmRpbmcucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0b0xpc3RCaW5kaW5nLmdldE1vZGVsKCkucmVzZXRDaGFuZ2VzKG9MaXN0QmluZGluZy5nZXRVcGRhdGVHcm91cElkKCkpO1xuXG5cdFx0XHRcdFx0dGhyb3cgRkVMaWJyYXJ5LkNvbnN0YW50cy5DcmVhdGlvbkZhaWxlZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4geyBiS2VlcERpYWxvZ09wZW46IHRydWUgfTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBvTmV3RG9jdW1lbnRDb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIG5hbWUgb2YgdGhlIE5ld0FjdGlvbiB0byBiZSBleGVjdXRlZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBzdGF0aWNcblx0ICogQHByaXZhdGVcblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIuX2dldE5ld0FjdGlvblxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHBhcmFtIG9TdGFydHVwUGFyYW1ldGVycyBTdGFydHVwIHBhcmFtZXRlcnMgb2YgdGhlIGFwcGxpY2F0aW9uXG5cdCAqIEBwYXJhbSBzQ3JlYXRlSGFzaCBIYXNoIHRvIGJlIGNoZWNrZWQgZm9yIGFjdGlvbiB0eXBlXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsIFRoZSBNZXRhTW9kZWwgdXNlZCB0byBjaGVjayBmb3IgTmV3QWN0aW9uIHBhcmFtZXRlclxuXHQgKiBAcGFyYW0gc01ldGFQYXRoIFRoZSBNZXRhUGF0aFxuXHQgKiBAcmV0dXJucyBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9nZXROZXdBY3Rpb24ob1N0YXJ0dXBQYXJhbWV0ZXJzOiBhbnksIHNDcmVhdGVIYXNoOiBzdHJpbmcsIG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBzTWV0YVBhdGg6IHN0cmluZykge1xuXHRcdGxldCBzTmV3QWN0aW9uO1xuXG5cdFx0aWYgKG9TdGFydHVwUGFyYW1ldGVycyAmJiBvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZSAmJiBzQ3JlYXRlSGFzaC50b1VwcGVyQ2FzZSgpLmluZGV4T2YoXCJJLUFDVElPTj1DUkVBVEVXSVRIXCIpID4gLTEpIHtcblx0XHRcdGNvbnN0IHNQcmVmZXJyZWRNb2RlID0gb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGVbMF07XG5cdFx0XHRzTmV3QWN0aW9uID1cblx0XHRcdFx0c1ByZWZlcnJlZE1vZGUudG9VcHBlckNhc2UoKS5pbmRleE9mKFwiQ1JFQVRFV0lUSDpcIikgPiAtMVxuXHRcdFx0XHRcdD8gc1ByZWZlcnJlZE1vZGUuc3Vic3RyKHNQcmVmZXJyZWRNb2RlLmxhc3RJbmRleE9mKFwiOlwiKSArIDEpXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVycyAmJlxuXHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGUgJiZcblx0XHRcdHNDcmVhdGVIYXNoLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihcIkktQUNUSU9OPUFVVE9DUkVBVEVXSVRIXCIpID4gLTFcblx0XHQpIHtcblx0XHRcdGNvbnN0IHNQcmVmZXJyZWRNb2RlID0gb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGVbMF07XG5cdFx0XHRzTmV3QWN0aW9uID1cblx0XHRcdFx0c1ByZWZlcnJlZE1vZGUudG9VcHBlckNhc2UoKS5pbmRleE9mKFwiQVVUT0NSRUFURVdJVEg6XCIpID4gLTFcblx0XHRcdFx0XHQ/IHNQcmVmZXJyZWRNb2RlLnN1YnN0cihzUHJlZmVycmVkTW9kZS5sYXN0SW5kZXhPZihcIjpcIikgKyAxKVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzTmV3QWN0aW9uID1cblx0XHRcdFx0b01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE9iamVjdCAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdFx0PyBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZC9OZXdBY3Rpb25gKSB8fFxuXHRcdFx0XHRcdCAgb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L05ld0FjdGlvbmApXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHJldHVybiBzTmV3QWN0aW9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgbGFiZWwgZm9yIHRoZSB0aXRsZSBvZiBhIHNwZWNpZmljIGNyZWF0ZSBhY3Rpb24gZGlhbG9nLCBlLmcuIENyZWF0ZSBTYWxlcyBPcmRlciBmcm9tIFF1b3RhdGlvbi5cblx0ICpcblx0ICogVGhlIGZvbGxvd2luZyBwcmlvcml0eSBpcyBhcHBsaWVkOlxuXHQgKiAxLiBsYWJlbCBvZiBsaW5lLWl0ZW0gYW5ub3RhdGlvbi5cblx0ICogMi4gbGFiZWwgYW5ub3RhdGVkIGluIHRoZSBhY3Rpb24uXG5cdCAqIDMuIFwiQ3JlYXRlXCIgYXMgYSBjb25zdGFudCBmcm9tIGkxOG4uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAc3RhdGljXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyLl9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAcGFyYW0gb01ldGFNb2RlbCBUaGUgTWV0YU1vZGVsIHVzZWQgdG8gY2hlY2sgZm9yIHRoZSBOZXdBY3Rpb24gcGFyYW1ldGVyXG5cdCAqIEBwYXJhbSBzTWV0YVBhdGggVGhlIE1ldGFQYXRoXG5cdCAqIEBwYXJhbSBzTmV3QWN0aW9uIENvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIG9SZXNvdXJjZUJ1bmRsZUNvcmUgUmVzb3VyY2VCdW5kbGUgdG8gYWNjZXNzIHRoZSBkZWZhdWx0IENyZWF0ZSBsYWJlbFxuXHQgKiBAcmV0dXJucyBUaGUgbGFiZWwgZm9yIHRoZSBDcmVhdGUgQWN0aW9uIERpYWxvZ1xuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfZ2V0U3BlY2lmaWNDcmVhdGVBY3Rpb25EaWFsb2dMYWJlbChcblx0XHRvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0XHRzTWV0YVBhdGg6IHN0cmluZyxcblx0XHRzTmV3QWN0aW9uOiBzdHJpbmcsXG5cdFx0b1Jlc291cmNlQnVuZGxlQ29yZTogUmVzb3VyY2VCdW5kbGVcblx0KSB7XG5cdFx0Y29uc3QgZm5HZXRMYWJlbEZyb21MaW5lSXRlbUFubm90YXRpb24gPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRpZiAob01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5MaW5lSXRlbWApKSB7XG5cdFx0XHRcdGNvbnN0IGlMaW5lSXRlbUluZGV4ID0gb01ldGFNb2RlbFxuXHRcdFx0XHRcdC5nZXRPYmplY3QoYCR7c01ldGFQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuTGluZUl0ZW1gKVxuXHRcdFx0XHRcdC5maW5kSW5kZXgoZnVuY3Rpb24gKG9MaW5lSXRlbTogYW55KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBhTGluZUl0ZW1BY3Rpb24gPSBvTGluZUl0ZW0uQWN0aW9uID8gb0xpbmVJdGVtLkFjdGlvbi5zcGxpdChcIihcIikgOiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRyZXR1cm4gYUxpbmVJdGVtQWN0aW9uID8gYUxpbmVJdGVtQWN0aW9uWzBdID09PSBzTmV3QWN0aW9uIDogZmFsc2U7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBpTGluZUl0ZW1JbmRleCA+IC0xXG5cdFx0XHRcdFx0PyBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5MaW5lSXRlbWApW2lMaW5lSXRlbUluZGV4XS5MYWJlbFxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0cmV0dXJuIChcblx0XHRcdGZuR2V0TGFiZWxGcm9tTGluZUl0ZW1Bbm5vdGF0aW9uKCkgfHxcblx0XHRcdChvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vJHtzTmV3QWN0aW9ufUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTGFiZWxgKSkgfHxcblx0XHRcdChvUmVzb3VyY2VCdW5kbGVDb3JlICYmIG9SZXNvdXJjZUJ1bmRsZUNvcmUuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX1NBUEZFX0FDVElPTl9DUkVBVEVcIikpXG5cdFx0KTtcblx0fVxufVxuXG5jb25zdCBzaW5nbGV0b24gPSBuZXcgVHJhbnNhY3Rpb25IZWxwZXIoKTtcbmV4cG9ydCBkZWZhdWx0IHNpbmdsZXRvbjtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7RUE4Q0EsTUFBTUEsWUFBWSxHQUFHQyxTQUFTLENBQUNELFlBQVk7RUFDM0MsTUFBTUUsZ0JBQWdCLEdBQUdELFNBQVMsQ0FBQ0MsZ0JBQWdCOztFQUVuRDtFQUNBLE1BQU1DLGlCQUFpQixHQUFHQyxZQUFZLENBQUNELGlCQUFpQjtFQUN4RCxNQUFNRSwwQkFBMEIsR0FBR0QsWUFBWSxDQUFDQywwQkFBMEI7O0VBRTFFO0VBQ0EsU0FBU0MsYUFBYSxDQUFDQyxXQUFnQixFQUFFO0lBQ3hDLElBQUlBLFdBQVcsSUFBSUEsV0FBVyxDQUFDQyxXQUFXLElBQUlELFdBQVcsQ0FBQ0MsV0FBVyxFQUFFLENBQUNDLE9BQU8sRUFBRSxLQUFLLG1CQUFtQixFQUFFO01BQzFHRixXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCO0lBQ0EsT0FBT0EsV0FBVyxJQUFJLENBQUMsQ0FBQztFQUN6QjtFQUFDLElBRUtHLGlCQUFpQjtJQUFBO0lBQUE7SUFBQSxPQUN0QkMsUUFBUSxHQUFSLGtCQUFTQyxZQUEwQixFQUFFQyxRQUFpQixFQUFFO01BQ3ZEQyxVQUFVLENBQUNDLElBQUksQ0FBQ0gsWUFBWSxDQUFDSSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUVILFFBQVEsQ0FBQztJQUN2RCxDQUFDO0lBQUEsT0FFREksVUFBVSxHQUFWLG9CQUFXTCxZQUEwQixFQUFFQyxRQUFpQixFQUFFO01BQ3pEQyxVQUFVLENBQUNJLE1BQU0sQ0FBQ04sWUFBWSxDQUFDSSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUVILFFBQVEsQ0FBQztJQUN6RCxDQUFDO0lBQUEsT0FFRE0sbUJBQW1CLEdBQW5CLDZCQUFvQkMsTUFBZ0MsRUFB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
|