@sapui5/sap.fe.core 1.120.3 → 1.121.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.js +84 -38
- package/src/sap/fe/core/ActionRuntime.ts +106 -68
- package/src/sap/fe/core/AppComponent.js +48 -8
- package/src/sap/fe/core/AppComponent.ts +73 -25
- package/src/sap/fe/core/AppStateHandler.js +140 -47
- package/src/sap/fe/core/AppStateHandler.ts +141 -43
- package/src/sap/fe/core/BaseController.js +2 -2
- package/src/sap/fe/core/BaseController.ts +9 -4
- package/src/sap/fe/core/CommonUtils.js +85 -110
- package/src/sap/fe/core/CommonUtils.ts +144 -166
- package/src/sap/fe/core/ExtensionAPI.js +52 -20
- package/src/sap/fe/core/ExtensionAPI.ts +48 -22
- package/src/sap/fe/core/InsightsFormattersExtension.js +1 -1
- package/src/sap/fe/core/PageController.js +85 -37
- package/src/sap/fe/core/PageController.ts +69 -12
- package/src/sap/fe/core/ResourceModel.js +1 -1
- package/src/sap/fe/core/TemplateComponent.js +62 -33
- package/src/sap/fe/core/TemplateComponent.ts +48 -13
- package/src/sap/fe/core/TemplateModel.js +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +119 -146
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +113 -148
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +4 -10
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +6 -7
- package/src/sap/fe/core/buildingBlocks/templating/AttributeModel.js +55 -0
- package/src/sap/fe/core/buildingBlocks/{AttributeModel.ts → templating/AttributeModel.ts} +2 -2
- package/src/sap/fe/core/buildingBlocks/{BuildingBlockFormatter.js → templating/BuildingBlockFormatter.js} +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +141 -0
- package/src/sap/fe/core/buildingBlocks/{BuildingBlockSupport.ts → templating/BuildingBlockSupport.ts} +74 -7
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +947 -0
- package/src/sap/fe/core/buildingBlocks/{BuildingBlockTemplateProcessor.ts → templating/BuildingBlockTemplateProcessor.ts} +40 -15
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +165 -0
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +174 -0
- package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlock.js +107 -0
- package/src/sap/fe/core/buildingBlocks/{RuntimeBuildingBlock.ts → templating/RuntimeBuildingBlock.ts} +34 -14
- package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.js +235 -0
- package/src/sap/fe/core/buildingBlocks/{RuntimeBuildingBlockFragment.ts → templating/RuntimeBuildingBlockFragment.ts} +60 -16
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +1 -1
- package/src/sap/fe/core/controllerextensions/BusyLocker.js +8 -8
- package/src/sap/fe/core/controllerextensions/BusyLocker.ts +33 -21
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +202 -0
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +229 -0
- package/src/sap/fe/core/controllerextensions/ContextSharing.js +53 -0
- package/src/sap/fe/core/controllerextensions/ContextSharing.ts +35 -0
- package/src/sap/fe/core/controllerextensions/EditFlow.js +236 -164
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +520 -329
- package/src/sap/fe/core/controllerextensions/Feedback.js +4 -4
- package/src/sap/fe/core/controllerextensions/Feedback.ts +8 -8
- package/src/sap/fe/core/controllerextensions/HookSupport.js +1 -1
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +2 -2
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +2 -2
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +147 -54
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +260 -115
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +74 -54
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +159 -101
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +28 -23
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +75 -42
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +41 -55
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +106 -68
- package/src/sap/fe/core/controllerextensions/PageReady.js +29 -11
- package/src/sap/fe/core/controllerextensions/PageReady.ts +72 -47
- package/src/sap/fe/core/controllerextensions/Paginator.js +2 -2
- package/src/sap/fe/core/controllerextensions/Paginator.ts +14 -14
- package/src/sap/fe/core/controllerextensions/Placeholder.js +7 -10
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +42 -28
- package/src/sap/fe/core/controllerextensions/Recommendations.js +184 -49
- package/src/sap/fe/core/controllerextensions/Recommendations.ts +199 -55
- package/src/sap/fe/core/controllerextensions/Routing.js +2 -2
- package/src/sap/fe/core/controllerextensions/Routing.ts +3 -3
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
- package/src/sap/fe/core/controllerextensions/Share.js +56 -53
- package/src/sap/fe/core/controllerextensions/Share.ts +76 -77
- package/src/sap/fe/core/controllerextensions/SideEffects.js +113 -19
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +145 -31
- package/src/sap/fe/core/controllerextensions/Telemetry.js +31 -0
- package/src/sap/fe/core/controllerextensions/Telemetry.ts +18 -0
- package/src/sap/fe/core/controllerextensions/ViewState.js +32 -38
- package/src/sap/fe/core/controllerextensions/ViewState.ts +205 -131
- package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.js +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +16 -29
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +14 -32
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +21 -11
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +37 -14
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +10 -13
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +15 -19
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +2 -3
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +8 -8
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +252 -152
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +441 -282
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +20 -30
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +103 -55
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +14 -14
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +51 -52
- package/src/sap/fe/core/controllerextensions/editFlow/editFlowConstants.js +15 -0
- package/src/sap/fe/core/controllerextensions/editFlow/editFlowConstants.ts +6 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.js +10 -12
- package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.ts +11 -18
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +112 -105
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +512 -297
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +11 -11
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +13 -11
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +174 -151
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +375 -314
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +5 -5
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +27 -23
- package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.js +126 -0
- package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.ts +134 -0
- package/src/sap/fe/core/controllerextensions/routing/NavigationReason.js +1 -1
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +38 -36
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +125 -92
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +0 -4
- package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +0 -2
- package/src/sap/fe/core/controls/Any.js +2 -2
- package/src/sap/fe/core/controls/Any.ts +8 -6
- package/src/sap/fe/core/controls/AnyElement.js +2 -2
- package/src/sap/fe/core/controls/AnyElement.ts +6 -4
- package/src/sap/fe/core/controls/CommandExecution.js +4 -6
- package/src/sap/fe/core/controls/CommandExecution.ts +9 -11
- package/src/sap/fe/core/controls/ComponentLoader.js +143 -0
- package/src/sap/fe/core/controls/ComponentLoader.ts +118 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +8 -5
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.tsx +5 -10
- package/src/sap/fe/core/controls/EventDelegateHook.js +1 -1
- package/src/sap/fe/core/controls/FilterBar.js +9 -8
- package/src/sap/fe/core/controls/FilterBar.ts +35 -27
- package/src/sap/fe/core/controls/FormElementWrapper.js +2 -2
- package/src/sap/fe/core/controls/FormElementWrapper.ts +3 -3
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +5 -6
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +11 -8
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.js +15 -6
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.tsx +31 -13
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +13 -17
- package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +45 -28
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +17 -11
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +66 -40
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +10 -16
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +44 -29
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +18 -18
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +79 -45
- package/src/sap/fe/core/converters/ConverterContext.js +14 -3
- package/src/sap/fe/core/converters/ConverterContext.ts +12 -0
- package/src/sap/fe/core/converters/ManifestSettings.js +2 -2
- package/src/sap/fe/core/converters/ManifestSettings.ts +11 -1
- package/src/sap/fe/core/converters/ManifestWrapper.js +48 -11
- package/src/sap/fe/core/converters/ManifestWrapper.ts +49 -12
- package/src/sap/fe/core/converters/MetaModelConverter.js +6 -5
- package/src/sap/fe/core/converters/MetaModelConverter.ts +6 -2
- package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
- package/src/sap/fe/core/converters/annotations/DataField.js +4 -3
- package/src/sap/fe/core/converters/annotations/DataField.ts +2 -1
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +24 -19
- package/src/sap/fe/core/converters/controls/Common/Action.js +7 -17
- package/src/sap/fe/core/converters/controls/Common/Action.ts +8 -16
- package/src/sap/fe/core/converters/controls/Common/Chart.js +11 -15
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +12 -16
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +4 -4
- package/src/sap/fe/core/converters/controls/Common/Criticality.ts +1 -1
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +138 -70
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +158 -94
- package/src/sap/fe/core/converters/controls/Common/Form.js +3 -3
- package/src/sap/fe/core/converters/controls/Common/Form.ts +1 -1
- package/src/sap/fe/core/converters/controls/Common/KPI.js +4 -4
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +1 -1
- package/src/sap/fe/core/converters/controls/Common/Table.js +217 -158
- package/src/sap/fe/core/converters/controls/Common/Table.ts +255 -179
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +35 -25
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +53 -47
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +60 -64
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +58 -61
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +26 -19
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +19 -10
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +4 -4
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +3 -3
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +24 -25
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +45 -38
- package/src/sap/fe/core/converters/helpers/Aggregation.js +1 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +200 -48
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +241 -47
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +1 -1
- package/src/sap/fe/core/converters/helpers/ID.js +1 -1
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +1 -1
- package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
- package/src/sap/fe/core/converters/helpers/Key.js +1 -1
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +2 -2
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +2 -2
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -22
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +8 -24
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +10 -13
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +4 -9
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +360 -216
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +473 -293
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +53 -6
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +52 -4
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +1 -1
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +5 -5
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
- package/src/sap/fe/core/formatters/FPMFormatter.js +3 -3
- package/src/sap/fe/core/formatters/FPMFormatter.ts +1 -1
- package/src/sap/fe/core/formatters/FiscalFormat.js +4 -4
- package/src/sap/fe/core/formatters/FiscalFormat.ts +2 -1
- package/src/sap/fe/core/formatters/KPIFormatter.js +13 -4
- package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -4
- package/src/sap/fe/core/formatters/StandardFormatter.js +2 -2
- package/src/sap/fe/core/formatters/StandardFormatter.ts +7 -7
- package/src/sap/fe/core/formatters/ValueFormatter.js +35 -7
- package/src/sap/fe/core/formatters/ValueFormatter.ts +40 -5
- package/src/sap/fe/core/fpm/Component.js +17 -6
- package/src/sap/fe/core/fpm/Component.ts +14 -3
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/AdaptiveCardExpressionCompiler.js +1 -1
- package/src/sap/fe/core/helpers/AnnotationEnum.js +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js +9 -9
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +8 -8
- package/src/sap/fe/core/helpers/BindingHelper.js +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit.js +19 -7
- package/src/sap/fe/core/helpers/BindingToolkit.ts +105 -23
- package/src/sap/fe/core/helpers/BindingToolkitEvaluator.js +1 -1
- package/src/sap/fe/core/helpers/ClassSupport.js +98 -17
- package/src/sap/fe/core/helpers/ClassSupport.ts +184 -43
- package/src/sap/fe/core/helpers/DeleteHelper.js +28 -13
- package/src/sap/fe/core/helpers/DeleteHelper.ts +48 -49
- package/src/sap/fe/core/helpers/DraftEditState.js +4 -4
- package/src/sap/fe/core/helpers/DraftEditState.ts +2 -2
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -1
- package/src/sap/fe/core/helpers/EditState.js +1 -1
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -1
- package/src/sap/fe/core/helpers/FPMHelper.js +16 -12
- package/src/sap/fe/core/helpers/FPMHelper.ts +37 -16
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +3 -3
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +1 -1
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -1
- package/src/sap/fe/core/helpers/LoaderUtils.js +1 -1
- package/src/sap/fe/core/helpers/ManifestHelper.js +48 -0
- package/src/sap/fe/core/helpers/ManifestHelper.ts +37 -0
- package/src/sap/fe/core/helpers/MessageStrip.js +5 -5
- package/src/sap/fe/core/helpers/MessageStrip.ts +3 -3
- package/src/sap/fe/core/helpers/MetaModelFunction.js +7 -5
- package/src/sap/fe/core/helpers/MetaModelFunction.ts +7 -5
- package/src/sap/fe/core/helpers/ModelHelper.js +52 -4
- package/src/sap/fe/core/helpers/ModelHelper.ts +55 -3
- package/src/sap/fe/core/helpers/PasteHelper.js +21 -17
- package/src/sap/fe/core/helpers/PasteHelper.ts +84 -68
- package/src/sap/fe/core/helpers/RecommendationHelper.js +6 -5
- package/src/sap/fe/core/helpers/RecommendationHelper.ts +14 -15
- package/src/sap/fe/core/helpers/ResourceModelHelper.js +1 -1
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +4 -4
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +17 -8
- package/src/sap/fe/core/helpers/SizeHelper.js +5 -5
- package/src/sap/fe/core/helpers/SizeHelper.ts +5 -3
- package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
- package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +146 -50
- package/src/sap/fe/core/helpers/StandardRecommendationHelper.ts +157 -61
- package/src/sap/fe/core/helpers/Synchronization.js +3 -3
- package/src/sap/fe/core/helpers/Synchronization.ts +1 -1
- package/src/sap/fe/core/helpers/TitleHelper.js +5 -2
- package/src/sap/fe/core/helpers/TitleHelper.ts +3 -0
- package/src/sap/fe/core/helpers/ToES6Promise.js +4 -3
- package/src/sap/fe/core/helpers/ToES6Promise.ts +5 -4
- package/src/sap/fe/core/helpers/TypeGuards.js +1 -1
- package/src/sap/fe/core/helpers/WebSocket.js +64 -0
- package/src/sap/fe/core/helpers/WebSocket.ts +59 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.js +1 -1
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js +37 -25
- package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +46 -17
- package/src/sap/fe/core/jsx-runtime/jsx-control.js +12 -2
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +19 -3
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js +128 -33
- package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +150 -36
- package/src/sap/fe/core/jsx-runtime/jsx.js +10 -4
- package/src/sap/fe/core/jsx-runtime/jsx.ts +11 -2
- package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +18 -6
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +17 -4
- package/src/sap/fe/core/library.js +18 -6
- package/src/sap/fe/core/library.support.js +1 -1
- package/src/sap/fe/core/library.ts +19 -3
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
- package/src/sap/fe/core/messagebundle.properties +55 -6
- package/src/sap/fe/core/messagebundle_ar.properties +102 -4
- package/src/sap/fe/core/messagebundle_bg.properties +104 -6
- package/src/sap/fe/core/messagebundle_ca.properties +30 -243
- package/src/sap/fe/core/messagebundle_cnr.properties +30 -243
- package/src/sap/fe/core/messagebundle_cs.properties +102 -4
- package/src/sap/fe/core/messagebundle_cy.properties +102 -4
- package/src/sap/fe/core/messagebundle_da.properties +102 -4
- package/src/sap/fe/core/messagebundle_de.properties +102 -4
- package/src/sap/fe/core/messagebundle_el.properties +102 -4
- package/src/sap/fe/core/messagebundle_en.properties +30 -243
- package/src/sap/fe/core/messagebundle_en_GB.properties +102 -4
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +261 -229
- package/src/sap/fe/core/messagebundle_es.properties +104 -6
- package/src/sap/fe/core/messagebundle_es_MX.properties +102 -4
- package/src/sap/fe/core/messagebundle_et.properties +102 -4
- package/src/sap/fe/core/messagebundle_fi.properties +102 -4
- package/src/sap/fe/core/messagebundle_fr.properties +109 -11
- package/src/sap/fe/core/messagebundle_fr_CA.properties +108 -10
- package/src/sap/fe/core/messagebundle_hi.properties +102 -4
- package/src/sap/fe/core/messagebundle_hr.properties +129 -31
- package/src/sap/fe/core/messagebundle_hu.properties +102 -4
- package/src/sap/fe/core/messagebundle_id.properties +102 -4
- package/src/sap/fe/core/messagebundle_it.properties +102 -4
- package/src/sap/fe/core/messagebundle_iw.properties +102 -4
- package/src/sap/fe/core/messagebundle_ja.properties +102 -4
- package/src/sap/fe/core/messagebundle_kk.properties +107 -9
- package/src/sap/fe/core/messagebundle_ko.properties +102 -4
- package/src/sap/fe/core/messagebundle_lt.properties +102 -4
- package/src/sap/fe/core/messagebundle_lv.properties +105 -7
- package/src/sap/fe/core/messagebundle_mk.properties +142 -44
- package/src/sap/fe/core/messagebundle_ms.properties +103 -5
- package/src/sap/fe/core/messagebundle_nl.properties +102 -4
- package/src/sap/fe/core/messagebundle_no.properties +102 -4
- package/src/sap/fe/core/messagebundle_pl.properties +102 -4
- package/src/sap/fe/core/messagebundle_pt.properties +102 -4
- package/src/sap/fe/core/messagebundle_pt_PT.properties +102 -4
- package/src/sap/fe/core/messagebundle_ro.properties +102 -4
- package/src/sap/fe/core/messagebundle_ru.properties +105 -7
- package/src/sap/fe/core/messagebundle_sh.properties +166 -68
- package/src/sap/fe/core/messagebundle_sk.properties +102 -4
- package/src/sap/fe/core/messagebundle_sl.properties +102 -4
- package/src/sap/fe/core/messagebundle_sr.properties +506 -0
- package/src/sap/fe/core/messagebundle_sv.properties +102 -4
- package/src/sap/fe/core/messagebundle_th.properties +102 -4
- package/src/sap/fe/core/messagebundle_tr.properties +103 -5
- package/src/sap/fe/core/messagebundle_uk.properties +102 -4
- package/src/sap/fe/core/messagebundle_vi.properties +102 -4
- package/src/sap/fe/core/messagebundle_zh_CN.properties +102 -4
- package/src/sap/fe/core/messagebundle_zh_TW.properties +102 -4
- package/src/sap/fe/core/operationsHelper.js +9 -8
- package/src/sap/fe/core/operationsHelper.ts +15 -10
- package/src/sap/fe/core/rootView/Fcl.controller.js +230 -177
- package/src/sap/fe/core/rootView/Fcl.controller.ts +251 -193
- package/src/sap/fe/core/rootView/NavContainer.controller.js +47 -31
- package/src/sap/fe/core/rootView/NavContainer.controller.ts +53 -42
- package/src/sap/fe/core/rootView/RootViewBaseController.js +57 -25
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +148 -76
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +12 -9
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +18 -14
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +9 -9
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +27 -29
- package/src/sap/fe/core/services/CollaborationManagerServiceFactory.js +1 -1
- package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.js +40 -9
- package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.ts +22 -7
- package/src/sap/fe/core/services/ContextSharingServiceFactory.js +144 -0
- package/src/sap/fe/core/services/ContextSharingServiceFactory.ts +118 -0
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +51 -7
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +38 -12
- package/src/sap/fe/core/services/NavigationServiceFactory.js +11 -7
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +47 -32
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +3 -3
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +15 -14
- package/src/sap/fe/core/services/RoutingServiceFactory.js +229 -152
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +339 -219
- package/src/sap/fe/core/services/ShellServicesFactory.js +234 -165
- package/src/sap/fe/core/services/ShellServicesFactory.ts +411 -295
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +229 -37
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +291 -40
- package/src/sap/fe/core/services/TelemetryServiceFactory.js +347 -0
- package/src/sap/fe/core/services/TelemetryServiceFactory.ts +414 -0
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +151 -137
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +263 -178
- package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +374 -0
- package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.ts +436 -0
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +810 -0
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +911 -0
- package/src/sap/fe/core/services/valueHelpService/HistoryOptOutProvider.js +173 -0
- package/src/sap/fe/core/services/valueHelpService/HistoryOptOutProvider.ts +192 -0
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
- package/src/sap/fe/core/support/AnnotationIssue.support.js +2 -2
- package/src/sap/fe/core/support/AnnotationIssue.support.ts +1 -1
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +2 -2
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.ts +1 -1
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
- package/src/sap/fe/core/support/CommonHelper.js +2 -2
- package/src/sap/fe/core/support/CommonHelper.ts +1 -1
- package/src/sap/fe/core/support/Diagnostics.js +2 -2
- package/src/sap/fe/core/support/Diagnostics.ts +1 -1
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +1 -1
- package/src/sap/fe/core/templating/ActionHelper.js +1 -1
- package/src/sap/fe/core/templating/CommonFormatters.js +1 -1
- package/src/sap/fe/core/templating/CriticalityFormatters.js +2 -2
- package/src/sap/fe/core/templating/CriticalityFormatters.ts +13 -13
- package/src/sap/fe/core/templating/DataFieldFormatters.js +15 -2
- package/src/sap/fe/core/templating/DataFieldFormatters.ts +12 -0
- package/src/sap/fe/core/templating/DataModelPathHelper.js +76 -21
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +90 -24
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
- package/src/sap/fe/core/templating/EntitySetHelper.js +1 -1
- package/src/sap/fe/core/templating/EntityTypeHelper.js +1 -1
- package/src/sap/fe/core/templating/FieldControlHelper.js +1 -1
- package/src/sap/fe/core/templating/FilterHelper.js +6 -5
- package/src/sap/fe/core/templating/FilterHelper.ts +13 -8
- package/src/sap/fe/core/templating/FilterTemplating.js +4 -5
- package/src/sap/fe/core/templating/FilterTemplating.ts +2 -2
- package/src/sap/fe/core/templating/PropertyFormatters.js +1 -1
- package/src/sap/fe/core/templating/PropertyHelper.js +1 -1
- package/src/sap/fe/core/templating/SemanticObjectHelper.js +1 -1
- package/src/sap/fe/core/templating/UIFormatters.js +50 -17
- package/src/sap/fe/core/templating/UIFormatters.ts +51 -18
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +1 -1
- package/src/sap/fe/core/type/EDM.js +1 -1
- package/src/sap/fe/core/type/Email.js +4 -4
- package/src/sap/fe/core/type/Email.ts +2 -2
- package/src/sap/fe/core/type/FiscalDate.js +4 -4
- package/src/sap/fe/core/type/FiscalDate.ts +2 -2
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +0 -55
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.js +0 -87
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.js +0 -932
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.js +0 -89
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.js +0 -178
- package/src/sap/fe/core/controllerextensions/MassEdit.js +0 -122
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +0 -154
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +0 -761
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +0 -870
- package/src/sap/fe/core/controls/MassEditSelect.js +0 -33
- package/src/sap/fe/core/controls/MassEditSelect.ts +0 -37
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +0 -67
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +0 -93
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +0 -479
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +0 -619
- package/src/sap/fe/core/formatters/TableFormatter.js +0 -269
- package/src/sap/fe/core/formatters/TableFormatter.ts +0 -308
- package/src/sap/fe/core/formatters/TableFormatterTypes.js +0 -20
- package/src/sap/fe/core/formatters/TableFormatterTypes.ts +0 -7
- package/src/sap/fe/core/helpers/MassEditHelper.js +0 -1245
- package/src/sap/fe/core/helpers/MassEditHelper.ts +0 -1540
- /package/src/sap/fe/core/buildingBlocks/{BuildingBlockFormatter.ts → templating/BuildingBlockFormatter.ts} +0 -0
package/package.json
CHANGED
package/src/sap/fe/core/.library
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
-
* (c) Copyright 2009-
|
|
3
|
+
* (c) Copyright 2009-2024 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/base/util/merge", "sap/fe/core/CommonUtils", "sap/fe/core/controls/Any", "sap/fe/core/helpers/BindingToolkit", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/ActionHelper", "sap/ui/core/message/Message", "./controls/AnyElement", "./converters/ConverterContext", "./converters/MetaModelConverter", "./converters/objectPage/HeaderAndFooterAction"], function (merge, CommonUtils, Any, BindingToolkit, ModelHelper, TypeGuards, ActionHelper, Message, AnyElement, ConverterContext, MetaModelConverter, HeaderAndFooterAction) {
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils", "sap/fe/core/controls/Any", "sap/fe/core/helpers/BindingToolkit", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/ActionHelper", "sap/ui/core/Messaging", "sap/ui/core/library", "sap/ui/core/message/Message", "./controls/AnyElement", "./converters/ConverterContext", "./converters/MetaModelConverter", "./converters/objectPage/HeaderAndFooterAction"], function (Log, merge, CommonUtils, Any, BindingToolkit, ModelHelper, TypeGuards, ActionHelper, Messaging, library, Message, AnyElement, ConverterContext, MetaModelConverter, HeaderAndFooterAction) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var getHiddenExpression = HeaderAndFooterAction.getHiddenExpression;
|
|
9
9
|
var getEditButtonEnabled = HeaderAndFooterAction.getEditButtonEnabled;
|
|
10
10
|
var convertTypes = MetaModelConverter.convertTypes;
|
|
11
|
+
var MessageType = library.MessageType;
|
|
11
12
|
var getIsActionCriticalExpression = ActionHelper.getIsActionCriticalExpression;
|
|
12
13
|
var isEntitySet = TypeGuards.isEntitySet;
|
|
13
14
|
var transformRecursively = BindingToolkit.transformRecursively;
|
|
@@ -20,16 +21,16 @@ sap.ui.define(["sap/base/util/merge", "sap/fe/core/CommonUtils", "sap/fe/core/co
|
|
|
20
21
|
/**
|
|
21
22
|
* Adds error messages for an action parameter field to the message manager.
|
|
22
23
|
*
|
|
23
|
-
* @param messageManager The active MessageManager instance
|
|
24
24
|
* @param messageParameters Information identifying an action parameter and messages referring to this parameter
|
|
25
25
|
*/
|
|
26
|
-
_addMessageForActionParameter: function (
|
|
27
|
-
|
|
26
|
+
_addMessageForActionParameter: function (messageParameters) {
|
|
27
|
+
Messaging.addMessages(messageParameters.map(messageParameter => {
|
|
28
28
|
const binding = messageParameter.actionParameterInfo.field.getBinding(messageParameter.actionParameterInfo.isMultiValue ? "items" : "value");
|
|
29
29
|
return new Message({
|
|
30
30
|
message: messageParameter.message,
|
|
31
|
-
type:
|
|
32
|
-
processor: binding === null || binding === void 0 ? void 0 : binding.getModel(),
|
|
31
|
+
type: MessageType.Error,
|
|
32
|
+
processor: (binding === null || binding === void 0 ? void 0 : binding.getModel()) ?? undefined,
|
|
33
|
+
// getModel(): null | Model ~~> processor?: MessageProcessor
|
|
33
34
|
persistent: true,
|
|
34
35
|
target: binding === null || binding === void 0 ? void 0 : binding.getResolvedPath()
|
|
35
36
|
});
|
|
@@ -40,15 +41,14 @@ sap.ui.define(["sap/base/util/merge", "sap/fe/core/CommonUtils", "sap/fe/core/co
|
|
|
40
41
|
* contained data is valid.
|
|
41
42
|
*
|
|
42
43
|
*
|
|
43
|
-
* @param messageManager The active MessageManager instance
|
|
44
44
|
* @param actionParameterInfos Information identifying an action parameter
|
|
45
45
|
* @param resourceModel The model to load text resources
|
|
46
46
|
* @returns The validation result can be true or false
|
|
47
47
|
*/
|
|
48
|
-
validateProperties: async function (
|
|
48
|
+
validateProperties: async function (actionParameterInfos, resourceModel) {
|
|
49
49
|
await Promise.allSettled(actionParameterInfos.map(actionParameterInfo => actionParameterInfo.validationPromise));
|
|
50
50
|
const requiredParameterInfos = actionParameterInfos.filter(parameterInfo => parameterInfo.field.getRequired());
|
|
51
|
-
const allMessages =
|
|
51
|
+
const allMessages = Messaging.getMessageModel().getData();
|
|
52
52
|
const emptyRequiredFields = requiredParameterInfos.filter(requiredParameterInfo => {
|
|
53
53
|
const fieldId = requiredParameterInfo.field.getId();
|
|
54
54
|
const relevantMessages = allMessages.filter(msg => msg.getControlIds().some(controlId => controlId.includes(fieldId)));
|
|
@@ -58,12 +58,18 @@ sap.ui.define(["sap/base/util/merge", "sap/fe/core/CommonUtils", "sap/fe/core/co
|
|
|
58
58
|
return requiredParameterInfo.value === undefined || !requiredParameterInfo.value.length;
|
|
59
59
|
} else {
|
|
60
60
|
const fieldValue = requiredParameterInfo.field.getValue();
|
|
61
|
+
const isFieldArray = Array.isArray(requiredParameterInfo.field.getValue());
|
|
62
|
+
if (isFieldArray) {
|
|
63
|
+
// only first value check is enough as the field value comes on [0] rest of the array includes currency and currency code
|
|
64
|
+
// both of which can or cannot be null, so we shall check only the field value
|
|
65
|
+
return fieldValue[0] === null || fieldValue[0] === "";
|
|
66
|
+
}
|
|
61
67
|
return fieldValue === undefined || fieldValue === null || fieldValue === "";
|
|
62
68
|
}
|
|
63
69
|
});
|
|
64
70
|
/* Message for missing mandatory value of the action parameter */
|
|
65
71
|
if (emptyRequiredFields.length) {
|
|
66
|
-
this._addMessageForActionParameter(
|
|
72
|
+
this._addMessageForActionParameter(emptyRequiredFields.map(actionParameterInfo => {
|
|
67
73
|
var _actionParameterInfo$;
|
|
68
74
|
return {
|
|
69
75
|
actionParameterInfo: actionParameterInfo,
|
|
@@ -87,13 +93,20 @@ sap.ui.define(["sap/base/util/merge", "sap/fe/core/CommonUtils", "sap/fe/core/co
|
|
|
87
93
|
* @param oActionOperationAvailableMap Map containing the operation availability of actions
|
|
88
94
|
* @param aSelectedContexts Array containing selected contexts of the chart
|
|
89
95
|
* @param sControl Control name
|
|
96
|
+
* @param forContextMenu Indicates if the action appears in the context menu. If false, the action appears in the table toolbar
|
|
90
97
|
* @returns The action enablement promises
|
|
91
98
|
*/
|
|
92
99
|
setActionEnablement: async function (oInternalModelContext, oActionOperationAvailableMap, aSelectedContexts, sControl) {
|
|
100
|
+
let forContextMenu = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
|
|
93
101
|
const aPromises = [];
|
|
94
102
|
for (const sAction in oActionOperationAvailableMap) {
|
|
95
103
|
let aRequestPromises = [];
|
|
96
104
|
oInternalModelContext.setProperty(sAction, false);
|
|
105
|
+
if (forContextMenu && sControl === "table") {
|
|
106
|
+
oInternalModelContext.setProperty(`dynamicActions/${sAction}/aApplicable`, []);
|
|
107
|
+
oInternalModelContext.setProperty(`dynamicActions/${sAction}/aNotApplicable`, []);
|
|
108
|
+
oInternalModelContext.setProperty(`dynamicActions/${sAction}/bEnabledForContextMenu`, false);
|
|
109
|
+
}
|
|
97
110
|
const sProperty = oActionOperationAvailableMap[sAction];
|
|
98
111
|
for (const element of aSelectedContexts) {
|
|
99
112
|
const oSelectedContext = element;
|
|
@@ -106,7 +119,7 @@ sap.ui.define(["sap/base/util/merge", "sap/fe/core/CommonUtils", "sap/fe/core/co
|
|
|
106
119
|
break;
|
|
107
120
|
}
|
|
108
121
|
} else if (sControl === "table") {
|
|
109
|
-
aRequestPromises = this._setActionEnablementForTable(oSelectedContext, oInternalModelContext, sAction, sProperty, aRequestPromises);
|
|
122
|
+
aRequestPromises = this._setActionEnablementForTable(oSelectedContext, oInternalModelContext, sAction, sProperty, aRequestPromises, forContextMenu);
|
|
110
123
|
}
|
|
111
124
|
}
|
|
112
125
|
}
|
|
@@ -117,12 +130,12 @@ sap.ui.define(["sap/base/util/merge", "sap/fe/core/CommonUtils", "sap/fe/core/co
|
|
|
117
130
|
aApplicable: [],
|
|
118
131
|
aNotApplicable: []
|
|
119
132
|
});
|
|
120
|
-
aPromises.push(CommonUtils.setContextsBasedOnOperationAvailable(oInternalModelContext, []));
|
|
133
|
+
aPromises.push(CommonUtils.setContextsBasedOnOperationAvailable(oInternalModelContext, [], forContextMenu));
|
|
121
134
|
} else if (aSelectedContexts.length && typeof sProperty === "string") {
|
|
122
135
|
// When all property values have been retrieved, set
|
|
123
136
|
// The applicable and not-applicable selected contexts for each action and
|
|
124
137
|
// The enabled property of the dynamic action in internal model context.
|
|
125
|
-
aPromises.push(CommonUtils.setContextsBasedOnOperationAvailable(oInternalModelContext, aRequestPromises));
|
|
138
|
+
aPromises.push(CommonUtils.setContextsBasedOnOperationAvailable(oInternalModelContext, aRequestPromises, forContextMenu));
|
|
126
139
|
}
|
|
127
140
|
}
|
|
128
141
|
}
|
|
@@ -201,18 +214,34 @@ sap.ui.define(["sap/base/util/merge", "sap/fe/core/CommonUtils", "sap/fe/core/co
|
|
|
201
214
|
}
|
|
202
215
|
},
|
|
203
216
|
_setActionEnablementForTable: function (oSelectedContext, oInternalModelContext, sAction, sProperty, aRequestPromises) {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
aApplicable
|
|
208
|
-
aNotApplicable
|
|
209
|
-
});
|
|
217
|
+
let forContextMenu = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
|
|
218
|
+
// Retrieve previously checked contexts in case of !forContextMenu
|
|
219
|
+
const sEnablementFieldName = forContextMenu ? "bEnabledForContextMenu" : "bEnabled",
|
|
220
|
+
aApplicable = oInternalModelContext.getProperty(`dynamicActions/${sAction}/aApplicable`) || [],
|
|
221
|
+
aNotApplicable = oInternalModelContext.getProperty(`dynamicActions/${sAction}/aNotApplicable`) || [];
|
|
222
|
+
let bActionEnabled = oInternalModelContext.getProperty(`dynamicActions/${sAction}/${sEnablementFieldName}`) || false;
|
|
223
|
+
if (!forContextMenu) {
|
|
224
|
+
oInternalModelContext.setProperty(`dynamicActions/${sAction}`, {
|
|
225
|
+
bEnabled: false,
|
|
226
|
+
aApplicable: [],
|
|
227
|
+
aNotApplicable: []
|
|
228
|
+
});
|
|
229
|
+
} else {
|
|
230
|
+
oInternalModelContext.setProperty(`dynamicActions/${sAction}`, {
|
|
231
|
+
// Do not change enabled, aApplicable and aNotApplicable property in case of context menu calculation
|
|
232
|
+
// in case of context menu, only the clicked context goes into the processing - other selected contexts must be kept in the model
|
|
233
|
+
bEnabled: oInternalModelContext.getProperty(`dynamicActions/${sAction}/bEnabled`),
|
|
234
|
+
aApplicable: oInternalModelContext.getProperty(`dynamicActions/${sAction}/aApplicable`),
|
|
235
|
+
aNotApplicable: oInternalModelContext.getProperty(`dynamicActions/${sAction}/aNotApplicable`),
|
|
236
|
+
bEnabledForContextMenu: false,
|
|
237
|
+
aApplicableForContextMenu: [],
|
|
238
|
+
aNotApplicableForContextMenu: []
|
|
239
|
+
});
|
|
240
|
+
}
|
|
210
241
|
// Note that non dynamic actions are not processed here. They are enabled because
|
|
211
242
|
// one or more are selected and the second part of the condition in the templating
|
|
212
243
|
// is then undefined and thus the button takes the default enabling, which is true!
|
|
213
|
-
const
|
|
214
|
-
aNotApplicable = [],
|
|
215
|
-
sDynamicActionEnabledPath = `${oInternalModelContext.getPath()}/dynamicActions/${sAction}/bEnabled`;
|
|
244
|
+
const sDynamicActionEnabledPath = `${oInternalModelContext.getPath()}/dynamicActions/${sAction}/${sEnablementFieldName}`;
|
|
216
245
|
if (typeof sProperty === "object" && sProperty !== null && sProperty !== undefined) {
|
|
217
246
|
if (oSelectedContext) {
|
|
218
247
|
const oContextData = oSelectedContext.getObject();
|
|
@@ -222,14 +251,11 @@ sap.ui.define(["sap/base/util/merge", "sap/fe/core/CommonUtils", "sap/fe/core/co
|
|
|
222
251
|
return oContextData ? constant(oContextData[oBindingExpression.path]) : constant(false);
|
|
223
252
|
}, true);
|
|
224
253
|
const sResult = compileExpression(oTransformedBinding);
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
} else {
|
|
229
|
-
aNotApplicable.push(oSelectedContext);
|
|
230
|
-
}
|
|
254
|
+
bActionEnabled = bActionEnabled || sResult === "true";
|
|
255
|
+
oInternalModelContext.getModel().setProperty(sDynamicActionEnabledPath, bActionEnabled);
|
|
256
|
+
(sResult === "true" ? aApplicable : aNotApplicable).push(oSelectedContext);
|
|
231
257
|
}
|
|
232
|
-
CommonUtils.setDynamicActionContexts(oInternalModelContext, sAction, aApplicable, aNotApplicable);
|
|
258
|
+
CommonUtils.setDynamicActionContexts(oInternalModelContext, sAction, aApplicable, aNotApplicable, forContextMenu);
|
|
233
259
|
} else {
|
|
234
260
|
const oContextData = oSelectedContext === null || oSelectedContext === void 0 ? void 0 : oSelectedContext.getObject();
|
|
235
261
|
if (sProperty === null && !!oContextData[`#${sAction}`]) {
|
|
@@ -250,7 +276,7 @@ sap.ui.define(["sap/base/util/merge", "sap/fe/core/CommonUtils", "sap/fe/core/co
|
|
|
250
276
|
* @param contexts Contexts in case of bound actions.
|
|
251
277
|
* @returns Boolean indicating action is critical
|
|
252
278
|
*/
|
|
253
|
-
getIsActionCritical: function (metaModel, path) {
|
|
279
|
+
getIsActionCritical: async function (metaModel, path) {
|
|
254
280
|
let contexts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
255
281
|
// default is true.
|
|
256
282
|
let isActionCriticalValue = true;
|
|
@@ -266,17 +292,37 @@ sap.ui.define(["sap/base/util/merge", "sap/fe/core/CommonUtils", "sap/fe/core/co
|
|
|
266
292
|
isActionCriticalValue = compileConstant(isActionCriticalBindingExp, false, undefined, true);
|
|
267
293
|
} else if (contexts.length > 0) {
|
|
268
294
|
// We evaluate the value of the expression via a UI5 managed object instance.
|
|
269
|
-
|
|
270
|
-
|
|
295
|
+
isActionCriticalValue = new Promise(resolve => {
|
|
296
|
+
try {
|
|
297
|
+
// Creating Binding to resolve
|
|
298
|
+
const anyObject = new Any({
|
|
299
|
+
anyBoolean: compileExpression(isActionCriticalBindingExp)
|
|
300
|
+
});
|
|
301
|
+
anyObject.setModel(contexts[0].getModel());
|
|
302
|
+
|
|
303
|
+
// Attaching change events
|
|
304
|
+
const booleanBinding = anyObject.getBinding("anyBoolean");
|
|
305
|
+
const fnChange = function () {
|
|
306
|
+
const valueExt = booleanBinding.getExternalValue();
|
|
307
|
+
anyObject.destroy();
|
|
308
|
+
resolve(valueExt);
|
|
309
|
+
};
|
|
310
|
+
booleanBinding.attachEventOnce("change", fnChange);
|
|
311
|
+
|
|
312
|
+
// setting binding context to trigger the binding resolution
|
|
313
|
+
anyObject.setBindingContext(contexts[0]);
|
|
314
|
+
} catch (err) {
|
|
315
|
+
// error while creating or resolving the binding
|
|
316
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
317
|
+
Log.error(`FE : Actions : Error while resolving IsActionCritical for ${path} : ${message}`);
|
|
318
|
+
// On the safe side, we shall return action is critical if value couldn't be determined.
|
|
319
|
+
resolve(true);
|
|
320
|
+
}
|
|
271
321
|
});
|
|
272
|
-
anyObject.setModel(contexts[0].getModel());
|
|
273
|
-
anyObject.setBindingContext(contexts[0]);
|
|
274
|
-
isActionCriticalValue = anyObject.getBinding("anyBoolean").getExternalValue();
|
|
275
|
-
anyObject.destroy();
|
|
276
322
|
}
|
|
277
323
|
return isActionCriticalValue;
|
|
278
324
|
}
|
|
279
325
|
};
|
|
280
326
|
return ActionRuntime;
|
|
281
327
|
}, false);
|
|
282
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBY3Rpb25SdW50aW1lIiwiX2FkZE1lc3NhZ2VGb3JBY3Rpb25QYXJhbWV0ZXIiLCJtZXNzYWdlTWFuYWdlciIsIm1lc3NhZ2VQYXJhbWV0ZXJzIiwiYWRkTWVzc2FnZXMiLCJtYXAiLCJtZXNzYWdlUGFyYW1ldGVyIiwiYmluZGluZyIsImFjdGlvblBhcmFtZXRlckluZm8iLCJmaWVsZCIsImdldEJpbmRpbmciLCJpc011bHRpVmFsdWUiLCJNZXNzYWdlIiwibWVzc2FnZSIsInR5cGUiLCJwcm9jZXNzb3IiLCJnZXRNb2RlbCIsInBlcnNpc3RlbnQiLCJ0YXJnZXQiLCJnZXRSZXNvbHZlZFBhdGgiLCJ2YWxpZGF0ZVByb3BlcnRpZXMiLCJhY3Rpb25QYXJhbWV0ZXJJbmZvcyIsInJlc291cmNlTW9kZWwiLCJQcm9taXNlIiwiYWxsU2V0dGxlZCIsInZhbGlkYXRpb25Qcm9taXNlIiwicmVxdWlyZWRQYXJhbWV0ZXJJbmZvcyIsImZpbHRlciIsInBhcmFtZXRlckluZm8iLCJnZXRSZXF1aXJlZCIsImFsbE1lc3NhZ2VzIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImVtcHR5UmVxdWlyZWRGaWVsZHMiLCJyZXF1aXJlZFBhcmFtZXRlckluZm8iLCJmaWVsZElkIiwiZ2V0SWQiLCJyZWxldmFudE1lc3NhZ2VzIiwibXNnIiwiZ2V0Q29udHJvbElkcyIsInNvbWUiLCJjb250cm9sSWQiLCJpbmNsdWRlcyIsImxlbmd0aCIsInZhbHVlIiwidW5kZWZpbmVkIiwiZmllbGRWYWx1ZSIsImdldFZhbHVlIiwiZ2V0VGV4dCIsImdldFBhcmVudCIsImdldEFnZ3JlZ2F0aW9uIiwiZmlyc3RJbnZhbGlkUGFyYW1ldGVyIiwiZmluZCIsImhhc0Vycm9yIiwiZ2V0VmFsdWVTdGF0ZSIsImZvY3VzIiwic2V0QWN0aW9uRW5hYmxlbWVudCIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsIm9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAiLCJhU2VsZWN0ZWRDb250ZXh0cyIsInNDb250cm9sIiwiYVByb21pc2VzIiwic0FjdGlvbiIsImFSZXF1ZXN0UHJvbWlzZXMiLCJzZXRQcm9wZXJ0eSIsInNQcm9wZXJ0eSIsImVsZW1lbnQiLCJvU2VsZWN0ZWRDb250ZXh0Iiwib0NvbnRleHREYXRhIiwiZ2V0T2JqZWN0IiwiX3NldEFjdGlvbkVuYWJsZW1lbnRGb3JUYWJsZSIsImJFbmFibGVkIiwiYUFwcGxpY2FibGUiLCJhTm90QXBwbGljYWJsZSIsInB1c2giLCJDb21tb25VdGlscyIsInNldENvbnRleHRzQmFzZWRPbk9wZXJhdGlvbkF2YWlsYWJsZSIsImFsbCIsInNldEFjdGlvbkVuYWJsZW1lbnRBZnRlclBhdGNoIiwib1ZpZXciLCJvTGlzdEJpbmRpbmciLCJvSW50ZXJuYWxNb2RlbENvbnRleHREYXRhIiwib0NvbnRyb2xzIiwiY29udHJvbHMiLCJzS2V5Iiwib1RhYmxlIiwiYnlJZCIsImlzQSIsIm9Sb3dCaW5kaW5nIiwiZ2V0Um93QmluZGluZyIsImdldEJpbmRpbmdDb250ZXh0IiwiSlNPTiIsInBhcnNlIiwiZGF0YSIsImN1c3RvbURhdGEiLCJnZXRTZWxlY3RlZENvbnRleHRzIiwidXBkYXRlRWRpdEJ1dHRvblZpc2liaWxpdHlBbmRFbmFibGVtZW50IiwiaVZpZXdMZXZlbCIsImdldFZpZXdEYXRhIiwidmlld0xldmVsIiwiaXNFZGl0YWJsZSIsImdldFByb3BlcnR5Iiwib0NvbnRleHQiLCJvQXBwQ29tcG9uZW50IiwiZ2V0QXBwQ29tcG9uZW50Iiwic01ldGFQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXRNZXRhUGF0aEZvckNvbnRleHQiLCJzRW50aXR5U2V0IiwiZ2V0Um9vdEVudGl0eVNldFBhdGgiLCJtZXRhQ29udGV4dCIsImdldE1ldGFNb2RlbCIsImdldENvbnRleHQiLCJnZXRQYXRoIiwiY29udmVydGVyQ29udGV4dCIsIkNvbnZlcnRlckNvbnRleHQiLCJjcmVhdGVDb252ZXJ0ZXJDb250ZXh0Rm9yTWFjcm8iLCJnZXREaWFnbm9zdGljcyIsIm1lcmdlIiwiZW50aXR5U2V0IiwiZ2V0RW50aXR5U2V0IiwiZW50aXR5VHlwZSIsImdldEVudGl0eVR5cGUiLCJ1cGRhdGVIaWRkZW4iLCJiVXBkYXRlSGlkZGVuIiwiaXNFbnRpdHlTZXQiLCJhbm5vdGF0aW9ucyIsIlVJIiwiVXBkYXRlSGlkZGVuIiwidmFsdWVPZiIsImlzVXBkYXRlSGlkZGVuIiwic0VkaXRFbmFibGVCaW5kaW5nIiwiZ2V0RWRpdEJ1dHRvbkVuYWJsZWQiLCJkcmFmdFJvb3RQYXRoIiwiZ2V0RHJhZnRSb290UGF0aCIsInNTdGlja3lSb290UGF0aCIsImdldFN0aWNreVJvb3RQYXRoIiwic1BhdGgiLCJvUm9vdENvbnRleHQiLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsInNIaWRkZW5FeHByZXNzaW9uIiwiY29tcGlsZUV4cHJlc3Npb24iLCJlcXVhbCIsImdldEhpZGRlbkV4cHJlc3Npb24iLCJ1cGRhdGVFZGl0TW9kZWxDb250ZXh0Iiwic0JpbmRpbmdFeHByZXNzaW9uIiwib0hpZGRlbkVsZW1lbnQiLCJBbnlFbGVtZW50IiwiYW55VGV4dCIsInNldEJpbmRpbmdDb250ZXh0IiwiYWRkRGVwZW5kZW50IiwiJCRncm91cElkIiwiYXR0YWNoQ2hhbmdlIiwib0V2ZW50Iiwib05ld1ZhbHVlIiwiZ2V0U291cmNlIiwiZ2V0RXh0ZXJuYWxWYWx1ZSIsInNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGgiLCJvVHJhbnNmb3JtZWRCaW5kaW5nIiwidHJhbnNmb3JtUmVjdXJzaXZlbHkiLCJvQmluZGluZ0V4cHJlc3Npb24iLCJjb25zdGFudCIsInBhdGgiLCJzUmVzdWx0Iiwic2V0RHluYW1pY0FjdGlvbkNvbnRleHRzIiwicmVxdWVzdFByb3BlcnR5IiwiZ2V0SXNBY3Rpb25Dcml0aWNhbCIsIm1ldGFNb2RlbCIsImNvbnRleHRzIiwiaXNBY3Rpb25Dcml0aWNhbFZhbHVlIiwiY29udmVydGVkVHlwZXMiLCJjb252ZXJ0VHlwZXMiLCJhY3Rpb25UYXJnZXRSZXNvbHV0aW9uIiwicmVzb2x2ZVBhdGgiLCJhY3Rpb25UYXJnZXQiLCJpc0FjdGlvbkNyaXRpY2FsQmluZGluZ0V4cCIsImdldElzQWN0aW9uQ3JpdGljYWxFeHByZXNzaW9uIiwiaXNDb25zdGFudCIsImNvbXBpbGVDb25zdGFudCIsImFueU9iamVjdCIsIkFueSIsImFueUJvb2xlYW4iLCJzZXRNb2RlbCIsImRlc3Ryb3kiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkFjdGlvblJ1bnRpbWUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBY3Rpb24gYXMgRWRtQWN0aW9uLCBQcmltaXRpdmVUeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IF9SZXF1ZXN0ZWRQcm9wZXJ0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvUmVzb3VyY2VNb2RlbFwiO1xuaW1wb3J0IEFueSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbHMvQW55XCI7XG5pbXBvcnQgdHlwZSB7IFBhdGhJbk1vZGVsRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgeyBjb21waWxlQ29uc3RhbnQsIGNvbXBpbGVFeHByZXNzaW9uLCBjb25zdGFudCwgZXF1YWwsIGlzQ29uc3RhbnQsIHRyYW5zZm9ybVJlY3Vyc2l2ZWx5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyBpc0VudGl0eVNldCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB7IGdldElzQWN0aW9uQ3JpdGljYWxFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvQWN0aW9uSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBMYWJlbCBmcm9tIFwic2FwL20vTGFiZWxcIjtcbmltcG9ydCB0eXBlIEV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZU1hbmFnZXIgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZU1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBGaWVsZCBmcm9tIFwic2FwL3VpL21kYy9GaWVsZFwiO1xuaW1wb3J0IHR5cGUgTXVsdGlWYWx1ZUZpZWxkIGZyb20gXCJzYXAvdWkvbWRjL011bHRpVmFsdWVGaWVsZFwiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIE11bHRpVmFsdWVGaWVsZEl0ZW0gZnJvbSBcInNhcC91aS9tZGMvZmllbGQvTXVsdGlWYWx1ZUZpZWxkSXRlbVwiO1xuaW1wb3J0IHR5cGUgUHJvcGVydHlCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvUHJvcGVydHlCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCBBbnlFbGVtZW50IGZyb20gXCIuL2NvbnRyb2xzL0FueUVsZW1lbnRcIjtcbmltcG9ydCBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCIuL2NvbnZlcnRlcnMvQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBCYXNlTWFuaWZlc3RTZXR0aW5ncyB9IGZyb20gXCIuL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzIH0gZnJvbSBcIi4vY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGdldEVkaXRCdXR0b25FbmFibGVkLCBnZXRIaWRkZW5FeHByZXNzaW9uIH0gZnJvbSBcIi4vY29udmVydGVycy9vYmplY3RQYWdlL0hlYWRlckFuZEZvb3RlckFjdGlvblwiO1xuXG50eXBlIEFjdGlvblBhcmFtZXRlciA9IHtcblx0JE5hbWU6IHN0cmluZztcblx0JGlzQ29sbGVjdGlvbjogYm9vbGVhbjtcblx0Ly8gY3VycmVudGx5IHJ1bnRpbWUgaW5mb3JtYXRpb24gaXMgd3JpdHRlbiBpbnRvIHRoZSBtZXRhbW9kZWw6XG5cdC8vIC0gaW4gdGhlIHByZXNzIGhhbmRsZXIgb2YgdGhlIGFjdGlvbiBidXR0b24gb24gdGhlIHBhcmFtZXRlciBkaWFsb2csIHRoZSB2YWx1ZSBvZiBlYWNoIHBhcmFtZXRlciBpcyBhZGRlZFxuXHQvLyAtIGluIHNldEFjdGlvblBhcmFtZXRlckRlZmF1bHRWYWx1ZSwgdGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGFuZCB0cmFuc2ZlcnJlZCB0byB0aGUgY29udGV4dCAoaW4gT0RhdGFNb2RlbCkgY3JlYXRlZCBmb3IgdGhlIGFjdGlvbiBleGVjdXRpb25cblx0Ly8gdGhpcyBpcyBxdWl0ZSBvZGQsIGFuZCBpdCB3b3VsZCBtYWtlIG11Y2ggbW9yZSBzZW5zZSB0byB0YWtlIHRoZSB2YWx1ZSBmcm9tIGFjdGlvblBhcmFtZXRlckluZm9zXG5cdC8vIC0gaG93ZXZlciwgc2V0QWN0aW9uUGFyYW1ldGVyRGVmYXVsdFZhbHVlIChvciByYXRoZXIgdGhlIHN1cnJvdW5kaW5nIF9leGVjdXRlQWN0aW9uKSBpcyBhbHNvIGNhbGxlZCBmcm9tIG90aGVyIHBsYWNlc1xuXHQvLyA9PiBmb3IgdGhlIHRpbWUgYmVpbmcsIGFkZGluZyB2YWx1ZSBoZXJlIHRvIGF2b2lkIHRzIGVycm9ycywgc3ViamVjdCB0byByZWZhY3RvcmluZ1xuXHQvLyBpbiBjYXNlIG9mIEZpZWxkLCB0aGUgdmFsdWUgaXMgc3RyaW5nLCBpbiBjYXNlIG9mIE11bHRpVmFsdWVGaWVsZCwgaXQncyBNdWx0aVZhbHVlRmllbGRJdGVtW11cblx0dmFsdWU6IHN0cmluZyB8IE11bHRpVmFsdWVGaWVsZEl0ZW1bXTtcbn07XG5cbmV4cG9ydCB0eXBlIEFjdGlvblBhcmFtZXRlckluZm8gPSB7XG5cdHBhcmFtZXRlcjogQWN0aW9uUGFyYW1ldGVyO1xuXHRmaWVsZDogRmllbGQgfCBNdWx0aVZhbHVlRmllbGQ7XG5cdGlzTXVsdGlWYWx1ZTogYm9vbGVhbjtcblx0dmFsdWU/OiBzdHJpbmcgfCBNdWx0aVZhbHVlRmllbGRJdGVtW107XG5cdHZhbGlkYXRpb25Qcm9taXNlPzogUHJvbWlzZTxzdHJpbmcgfCBNdWx0aVZhbHVlRmllbGRJdGVtW10+O1xuXHRoYXNFcnJvcjogYm9vbGVhbjtcbn07XG5cbmNvbnN0IEFjdGlvblJ1bnRpbWUgPSB7XG5cdC8qKlxuXHQgKiBBZGRzIGVycm9yIG1lc3NhZ2VzIGZvciBhbiBhY3Rpb24gcGFyYW1ldGVyIGZpZWxkIHRvIHRoZSBtZXNzYWdlIG1hbmFnZXIuXG5cdCAqXG5cdCAqIEBwYXJhbSBtZXNzYWdlTWFuYWdlciBUaGUgYWN0aXZlIE1lc3NhZ2VNYW5hZ2VyIGluc3RhbmNlXG5cdCAqIEBwYXJhbSBtZXNzYWdlUGFyYW1ldGVycyBJbmZvcm1hdGlvbiBpZGVudGlmeWluZyBhbiBhY3Rpb24gcGFyYW1ldGVyIGFuZCBtZXNzYWdlcyByZWZlcnJpbmcgdG8gdGhpcyBwYXJhbWV0ZXJcblx0ICovXG5cdF9hZGRNZXNzYWdlRm9yQWN0aW9uUGFyYW1ldGVyOiBmdW5jdGlvbiAoXG5cdFx0bWVzc2FnZU1hbmFnZXI6IE1lc3NhZ2VNYW5hZ2VyLFxuXHRcdG1lc3NhZ2VQYXJhbWV0ZXJzOiB7IGFjdGlvblBhcmFtZXRlckluZm86IEFjdGlvblBhcmFtZXRlckluZm87IG1lc3NhZ2U6IHN0cmluZyB9W11cblx0KSB7XG5cdFx0bWVzc2FnZU1hbmFnZXIuYWRkTWVzc2FnZXMoXG5cdFx0XHRtZXNzYWdlUGFyYW1ldGVycy5tYXAoKG1lc3NhZ2VQYXJhbWV0ZXIpID0+IHtcblx0XHRcdFx0Y29uc3QgYmluZGluZyA9IG1lc3NhZ2VQYXJhbWV0ZXIuYWN0aW9uUGFyYW1ldGVySW5mby5maWVsZC5nZXRCaW5kaW5nKFxuXHRcdFx0XHRcdG1lc3NhZ2VQYXJhbWV0ZXIuYWN0aW9uUGFyYW1ldGVySW5mby5pc011bHRpVmFsdWUgPyBcIml0ZW1zXCIgOiBcInZhbHVlXCJcblx0XHRcdFx0KTtcblx0XHRcdFx0cmV0dXJuIG5ldyBNZXNzYWdlKHtcblx0XHRcdFx0XHRtZXNzYWdlOiBtZXNzYWdlUGFyYW1ldGVyLm1lc3NhZ2UsXG5cdFx0XHRcdFx0dHlwZTogXCJFcnJvclwiLFxuXHRcdFx0XHRcdHByb2Nlc3NvcjogYmluZGluZz8uZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRwZXJzaXN0ZW50OiB0cnVlLFxuXHRcdFx0XHRcdHRhcmdldDogYmluZGluZz8uZ2V0UmVzb2x2ZWRQYXRoKClcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhbGwgcmVxdWlyZWQgYWN0aW9uIHBhcmFtZXRlcnMgY29udGFpbiBkYXRhIGFuZCBjaGVja3MgZm9yIGFsbCBhY3Rpb24gcGFyYW1ldGVycyBpZiB0aGVcblx0ICogY29udGFpbmVkIGRhdGEgaXMgdmFsaWQuXG5cdCAqXG5cdCAqXG5cdCAqIEBwYXJhbSBtZXNzYWdlTWFuYWdlciBUaGUgYWN0aXZlIE1lc3NhZ2VNYW5hZ2VyIGluc3RhbmNlXG5cdCAqIEBwYXJhbSBhY3Rpb25QYXJhbWV0ZXJJbmZvcyBJbmZvcm1hdGlvbiBpZGVudGlmeWluZyBhbiBhY3Rpb24gcGFyYW1ldGVyXG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIFRoZSBtb2RlbCB0byBsb2FkIHRleHQgcmVzb3VyY2VzXG5cdCAqIEByZXR1cm5zIFRoZSB2YWxpZGF0aW9uIHJlc3VsdCBjYW4gYmUgdHJ1ZSBvciBmYWxzZVxuXHQgKi9cblx0dmFsaWRhdGVQcm9wZXJ0aWVzOiBhc3luYyBmdW5jdGlvbiAoXG5cdFx0bWVzc2FnZU1hbmFnZXI6IE1lc3NhZ2VNYW5hZ2VyLFxuXHRcdGFjdGlvblBhcmFtZXRlckluZm9zOiBBY3Rpb25QYXJhbWV0ZXJJbmZvW10sXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbFxuXHQpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoYWN0aW9uUGFyYW1ldGVySW5mb3MubWFwKChhY3Rpb25QYXJhbWV0ZXJJbmZvKSA9PiBhY3Rpb25QYXJhbWV0ZXJJbmZvLnZhbGlkYXRpb25Qcm9taXNlKSk7XG5cblx0XHRjb25zdCByZXF1aXJlZFBhcmFtZXRlckluZm9zID0gYWN0aW9uUGFyYW1ldGVySW5mb3MuZmlsdGVyKChwYXJhbWV0ZXJJbmZvKSA9PiBwYXJhbWV0ZXJJbmZvLmZpZWxkLmdldFJlcXVpcmVkKCkpO1xuXHRcdGNvbnN0IGFsbE1lc3NhZ2VzID0gbWVzc2FnZU1hbmFnZXIuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdGNvbnN0IGVtcHR5UmVxdWlyZWRGaWVsZHMgPSByZXF1aXJlZFBhcmFtZXRlckluZm9zLmZpbHRlcigocmVxdWlyZWRQYXJhbWV0ZXJJbmZvKSA9PiB7XG5cdFx0XHRjb25zdCBmaWVsZElkID0gcmVxdWlyZWRQYXJhbWV0ZXJJbmZvLmZpZWxkLmdldElkKCk7XG5cdFx0XHRjb25zdCByZWxldmFudE1lc3NhZ2VzID0gYWxsTWVzc2FnZXMuZmlsdGVyKChtc2c6IE1lc3NhZ2UpID0+XG5cdFx0XHRcdG1zZy5nZXRDb250cm9sSWRzKCkuc29tZSgoY29udHJvbElkOiBzdHJpbmcpID0+IGNvbnRyb2xJZC5pbmNsdWRlcyhmaWVsZElkKSlcblx0XHRcdCk7XG5cdFx0XHRpZiAocmVsZXZhbnRNZXNzYWdlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0gZWxzZSBpZiAocmVxdWlyZWRQYXJhbWV0ZXJJbmZvLmlzTXVsdGlWYWx1ZSkge1xuXHRcdFx0XHRyZXR1cm4gcmVxdWlyZWRQYXJhbWV0ZXJJbmZvLnZhbHVlID09PSB1bmRlZmluZWQgfHwgIXJlcXVpcmVkUGFyYW1ldGVySW5mby52YWx1ZS5sZW5ndGg7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBmaWVsZFZhbHVlID0gKHJlcXVpcmVkUGFyYW1ldGVySW5mby5maWVsZCBhcyBGaWVsZCkuZ2V0VmFsdWUoKTtcblx0XHRcdFx0cmV0dXJuIGZpZWxkVmFsdWUgPT09IHVuZGVmaW5lZCB8fCBmaWVsZFZhbHVlID09PSBudWxsIHx8IGZpZWxkVmFsdWUgPT09IFwiXCI7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0LyogTWVzc2FnZSBmb3IgbWlzc2luZyBtYW5kYXRvcnkgdmFsdWUgb2YgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgKi9cblx0XHRpZiAoZW1wdHlSZXF1aXJlZEZpZWxkcy5sZW5ndGgpIHtcblx0XHRcdHRoaXMuX2FkZE1lc3NhZ2VGb3JBY3Rpb25QYXJhbWV0ZXIoXG5cdFx0XHRcdG1lc3NhZ2VNYW5hZ2VyLFxuXHRcdFx0XHRlbXB0eVJlcXVpcmVkRmllbGRzLm1hcCgoYWN0aW9uUGFyYW1ldGVySW5mbykgPT4gKHtcblx0XHRcdFx0XHRhY3Rpb25QYXJhbWV0ZXJJbmZvOiBhY3Rpb25QYXJhbWV0ZXJJbmZvLFxuXHRcdFx0XHRcdG1lc3NhZ2U6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfT1BFUkFUSU9OU19BQ1RJT05fUEFSQU1FVEVSX0RJQUxPR19NSVNTSU5HX01BTkRBVE9SWV9NU0dcIiwgW1xuXHRcdFx0XHRcdFx0KGFjdGlvblBhcmFtZXRlckluZm8uZmllbGQuZ2V0UGFyZW50KCk/LmdldEFnZ3JlZ2F0aW9uKFwibGFiZWxcIikgYXMgTGFiZWwpLmdldFRleHQoKVxuXHRcdFx0XHRcdF0pXG5cdFx0XHRcdH0pKVxuXHRcdFx0KTtcblx0XHR9XG5cdFx0LyogQ2hlY2sgdmFsdWUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMgKi9cblx0XHRjb25zdCBmaXJzdEludmFsaWRQYXJhbWV0ZXIgPSBhY3Rpb25QYXJhbWV0ZXJJbmZvcy5maW5kKFxuXHRcdFx0KHBhcmFtZXRlckluZm8pID0+XG5cdFx0XHRcdHBhcmFtZXRlckluZm8uaGFzRXJyb3IgfHwgcGFyYW1ldGVySW5mby5maWVsZC5nZXRWYWx1ZVN0YXRlKCkgPT09IFwiRXJyb3JcIiB8fCBlbXB0eVJlcXVpcmVkRmllbGRzLmluY2x1ZGVzKHBhcmFtZXRlckluZm8pXG5cdFx0KTtcblx0XHRpZiAoZmlyc3RJbnZhbGlkUGFyYW1ldGVyKSB7XG5cdFx0XHRmaXJzdEludmFsaWRQYXJhbWV0ZXIuZmllbGQuZm9jdXMoKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBhY3Rpb24gZW5hYmxlbWVudC5cblx0ICpcblx0ICogQHBhcmFtIG9JbnRlcm5hbE1vZGVsQ29udGV4dCBPYmplY3QgY29udGFpbmluZyB0aGUgY29udGV4dCBtb2RlbFxuXHQgKiBAcGFyYW0gb0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCBNYXAgY29udGFpbmluZyB0aGUgb3BlcmF0aW9uIGF2YWlsYWJpbGl0eSBvZiBhY3Rpb25zXG5cdCAqIEBwYXJhbSBhU2VsZWN0ZWRDb250ZXh0cyBBcnJheSBjb250YWluaW5nIHNlbGVjdGVkIGNvbnRleHRzIG9mIHRoZSBjaGFydFxuXHQgKiBAcGFyYW0gc0NvbnRyb2wgQ29udHJvbCBuYW1lXG5cdCAqIEByZXR1cm5zIFRoZSBhY3Rpb24gZW5hYmxlbWVudCBwcm9taXNlc1xuXHQgKi9cblx0c2V0QWN0aW9uRW5hYmxlbWVudDogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0b0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcblx0XHRhU2VsZWN0ZWRDb250ZXh0czogQ29udGV4dFtdLFxuXHRcdHNDb250cm9sOiBzdHJpbmdcblx0KSB7XG5cdFx0Y29uc3QgYVByb21pc2VzID0gW107XG5cdFx0Zm9yIChjb25zdCBzQWN0aW9uIGluIG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXApIHtcblx0XHRcdGxldCBhUmVxdWVzdFByb21pc2VzOiBQcm9taXNlPF9SZXF1ZXN0ZWRQcm9wZXJ0eT5bXSA9IFtdO1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KHNBY3Rpb24sIGZhbHNlKTtcblx0XHRcdGNvbnN0IHNQcm9wZXJ0eSA9IG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXBbc0FjdGlvbl07XG5cdFx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYVNlbGVjdGVkQ29udGV4dHMpIHtcblx0XHRcdFx0Y29uc3Qgb1NlbGVjdGVkQ29udGV4dCA9IGVsZW1lbnQ7XG5cdFx0XHRcdGlmIChvU2VsZWN0ZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QoKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRcdFx0XHRpZiAoc0NvbnRyb2wgPT09IFwiY2hhcnRcIikge1xuXHRcdFx0XHRcdFx0aWYgKChzUHJvcGVydHkgPT09IG51bGwgJiYgISFvQ29udGV4dERhdGFbYCMke3NBY3Rpb259YF0pIHx8IG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHNQcm9wZXJ0eSkpIHtcblx0XHRcdFx0XHRcdFx0Ly9sb29rIGZvciBhY3Rpb24gYWR2ZXJ0aXNlbWVudCBpZiBwcmVzZW50IGFuZCBpdHMgdmFsdWUgaXMgbm90IG51bGxcblx0XHRcdFx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KHNBY3Rpb24sIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKHNDb250cm9sID09PSBcInRhYmxlXCIpIHtcblx0XHRcdFx0XHRcdGFSZXF1ZXN0UHJvbWlzZXMgPSB0aGlzLl9zZXRBY3Rpb25FbmFibGVtZW50Rm9yVGFibGUoXG5cdFx0XHRcdFx0XHRcdG9TZWxlY3RlZENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0c0FjdGlvbixcblx0XHRcdFx0XHRcdFx0c1Byb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRhUmVxdWVzdFByb21pc2VzXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHNDb250cm9sID09PSBcInRhYmxlXCIpIHtcblx0XHRcdFx0aWYgKCFhU2VsZWN0ZWRDb250ZXh0cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7c0FjdGlvbn1gLCB7XG5cdFx0XHRcdFx0XHRiRW5hYmxlZDogZmFsc2UsXG5cdFx0XHRcdFx0XHRhQXBwbGljYWJsZTogW10sXG5cdFx0XHRcdFx0XHRhTm90QXBwbGljYWJsZTogW11cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRhUHJvbWlzZXMucHVzaChDb21tb25VdGlscy5zZXRDb250ZXh0c0Jhc2VkT25PcGVyYXRpb25BdmFpbGFibGUob0ludGVybmFsTW9kZWxDb250ZXh0LCBbXSkpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFTZWxlY3RlZENvbnRleHRzLmxlbmd0aCAmJiB0eXBlb2Ygc1Byb3BlcnR5ID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0Ly8gV2hlbiBhbGwgcHJvcGVydHkgdmFsdWVzIGhhdmUgYmVlbiByZXRyaWV2ZWQsIHNldFxuXHRcdFx0XHRcdC8vIFRoZSBhcHBsaWNhYmxlIGFuZCBub3QtYXBwbGljYWJsZSBzZWxlY3RlZCBjb250ZXh0cyBmb3IgZWFjaCBhY3Rpb24gYW5kXG5cdFx0XHRcdFx0Ly8gVGhlIGVuYWJsZWQgcHJvcGVydHkgb2YgdGhlIGR5bmFtaWMgYWN0aW9uIGluIGludGVybmFsIG1vZGVsIGNvbnRleHQuXG5cdFx0XHRcdFx0YVByb21pc2VzLnB1c2goQ29tbW9uVXRpbHMuc2V0Q29udGV4dHNCYXNlZE9uT3BlcmF0aW9uQXZhaWxhYmxlKG9JbnRlcm5hbE1vZGVsQ29udGV4dCwgYVJlcXVlc3RQcm9taXNlcykpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBQcm9taXNlLmFsbChhUHJvbWlzZXMpO1xuXHR9LFxuXHRzZXRBY3Rpb25FbmFibGVtZW50QWZ0ZXJQYXRjaDogZnVuY3Rpb24gKG9WaWV3OiBWaWV3LCBvTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIG9JbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQpIHtcblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHREYXRhID0gb0ludGVybmFsTW9kZWxDb250ZXh0Py5nZXRPYmplY3QoKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRjb25zdCBvQ29udHJvbHMgPSAob0ludGVybmFsTW9kZWxDb250ZXh0RGF0YT8uY29udHJvbHMgfHwge30pIGFzIFJlY29yZDxzdHJpbmcsIHsgY29udHJvbElkPzogc3RyaW5nIH0+O1xuXHRcdGZvciAoY29uc3Qgc0tleSBpbiBvQ29udHJvbHMpIHtcblx0XHRcdGlmIChvQ29udHJvbHNbc0tleV0gJiYgb0NvbnRyb2xzW3NLZXldLmNvbnRyb2xJZCkge1xuXHRcdFx0XHRjb25zdCBvVGFibGUgPSBvVmlldy5ieUlkKHNLZXkpO1xuXHRcdFx0XHRpZiAob1RhYmxlICYmIG9UYWJsZS5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRcdGNvbnN0IG9Sb3dCaW5kaW5nID0gb1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0XHRpZiAob1Jvd0JpbmRpbmcgPT0gb0xpc3RCaW5kaW5nKSB7XG5cdFx0XHRcdFx0XHRBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRKU09OLnBhcnNlKG9UYWJsZS5kYXRhKFwib3BlcmF0aW9uQXZhaWxhYmxlTWFwXCIpLmN1c3RvbURhdGEpLFxuXHRcdFx0XHRcdFx0XHRvVGFibGUuZ2V0U2VsZWN0ZWRDb250ZXh0cygpIGFzIENvbnRleHRbXSxcblx0XHRcdFx0XHRcdFx0XCJ0YWJsZVwiXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHR1cGRhdGVFZGl0QnV0dG9uVmlzaWJpbGl0eUFuZEVuYWJsZW1lbnQob1ZpZXc6IEZFVmlldykge1xuXHRcdGNvbnN0IGlWaWV3TGV2ZWwgPSAob1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBCYXNlTWFuaWZlc3RTZXR0aW5ncyk/LnZpZXdMZXZlbCxcblx0XHRcdGlzRWRpdGFibGUgPSBvVmlldy5nZXRNb2RlbChcInVpXCIpPy5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpO1xuXHRcdGlmICgoaVZpZXdMZXZlbCBhcyBudW1iZXIpID4gMSAmJiBpc0VkaXRhYmxlICE9PSB0cnVlKSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob1ZpZXcpO1xuXHRcdFx0Y29uc3Qgc01ldGFQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWV0YVBhdGhGb3JDb250ZXh0KG9Db250ZXh0KTtcblx0XHRcdGNvbnN0IHNFbnRpdHlTZXQgPSBNb2RlbEhlbHBlci5nZXRSb290RW50aXR5U2V0UGF0aChzTWV0YVBhdGgpO1xuXHRcdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBvQ29udGV4dFxuXHRcdFx0XHQ/LmdldE1vZGVsKClcblx0XHRcdFx0LmdldE1ldGFNb2RlbCgpXG5cdFx0XHRcdD8uZ2V0Q29udGV4dChvQ29udGV4dD8uZ2V0UGF0aCgpKTtcblx0XHRcdGNvbnN0IGNvbnZlcnRlckNvbnRleHQgPSBDb252ZXJ0ZXJDb250ZXh0Py5jcmVhdGVDb252ZXJ0ZXJDb250ZXh0Rm9yTWFjcm8oXG5cdFx0XHRcdHNFbnRpdHlTZXQsXG5cdFx0XHRcdG1ldGFDb250ZXh0LFxuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldERpYWdub3N0aWNzKCksXG5cdFx0XHRcdG1lcmdlLFxuXHRcdFx0XHR1bmRlZmluZWRcblx0XHRcdCk7XG5cdFx0XHRjb25zdCBlbnRpdHlTZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpO1xuXHRcdFx0Y29uc3QgZW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpO1xuXHRcdFx0bGV0IHVwZGF0ZUhpZGRlbjtcblx0XHRcdC8vRmluZCB0aGUgVXBkYXRlIEhpZGRlbiBvZiB0aGUgcm9vdCBlbnRpdHkgc2V0IGFuZCBiaW5kIHRoZSBwcm9wZXJ0eSB0byBBbnlFbGVtZW50LCBhbnkgY2hhbmdlcyBpbiB0aGUgcGF0aCBvZiB0aGUgcm9vdCBVcGRhdGVIaWRkZW4gd2lsbCBiZSB1cGRhdGVkIHZpYSB0aGUgcHJvcGVydHksIGludGVybmFsIG1vZGVsIGNvbnRleHQgaXMgdXBkYXRlZCBiYXNlZCBvbiB0aGUgcHJvcGVydHlcblx0XHRcdGNvbnN0IGJVcGRhdGVIaWRkZW4gPSBpc0VudGl0eVNldChlbnRpdHlTZXQpICYmIGVudGl0eVNldC5hbm5vdGF0aW9ucy5VST8uVXBkYXRlSGlkZGVuPy52YWx1ZU9mKCk7XG5cdFx0XHRpZiAoYlVwZGF0ZUhpZGRlbiAhPT0gdHJ1ZSkge1xuXHRcdFx0XHR1cGRhdGVIaWRkZW4gPSBNb2RlbEhlbHBlci5pc1VwZGF0ZUhpZGRlbihlbnRpdHlTZXQsIGVudGl0eVR5cGUpO1xuXHRcdFx0fVxuXHRcdFx0Ly9GaW5kIHRoZSBvcGVyYXRpb24gYXZhaWxhYmxlIHByb3BlcnR5IG9mIHRoZSByb290IGVkaXQgY29uZmlndXJhdGlvbiBhbmQgZmV0Y2ggdGhlIHByb3BlcnR5IHVzaW5nIEFueUVsZW1lbnRcblx0XHRcdGNvbnN0IHNFZGl0RW5hYmxlQmluZGluZyA9IGdldEVkaXRCdXR0b25FbmFibGVkKGNvbnZlcnRlckNvbnRleHQpO1xuXHRcdFx0Y29uc3QgZHJhZnRSb290UGF0aCA9IE1vZGVsSGVscGVyLmdldERyYWZ0Um9vdFBhdGgob0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgc1N0aWNreVJvb3RQYXRoID0gTW9kZWxIZWxwZXIuZ2V0U3RpY2t5Um9vdFBhdGgob0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgc1BhdGggPSBkcmFmdFJvb3RQYXRoIHx8IHNTdGlja3lSb290UGF0aDtcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRpZiAoc1BhdGgpIHtcblx0XHRcdFx0Y29uc3Qgb1Jvb3RDb250ZXh0ID0gb1ZpZXcuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChzUGF0aCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdGlmICh1cGRhdGVIaWRkZW4gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGNvbnN0IHNIaWRkZW5FeHByZXNzaW9uID0gY29tcGlsZUV4cHJlc3Npb24oZXF1YWwoZ2V0SGlkZGVuRXhwcmVzc2lvbihjb252ZXJ0ZXJDb250ZXh0LCB1cGRhdGVIaWRkZW4pLCBmYWxzZSkpO1xuXHRcdFx0XHRcdHRoaXMudXBkYXRlRWRpdE1vZGVsQ29udGV4dChzSGlkZGVuRXhwcmVzc2lvbiwgb1ZpZXcsIG9Sb290Q29udGV4dCwgXCJyb290RWRpdFZpc2libGVcIiwgb0ludGVybmFsTW9kZWxDb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoc0VkaXRFbmFibGVCaW5kaW5nKSB7XG5cdFx0XHRcdFx0dGhpcy51cGRhdGVFZGl0TW9kZWxDb250ZXh0KHNFZGl0RW5hYmxlQmluZGluZywgb1ZpZXcsIG9Sb290Q29udGV4dCwgXCJyb290RWRpdEVuYWJsZWRcIiwgb0ludGVybmFsTW9kZWxDb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHR1cGRhdGVFZGl0TW9kZWxDb250ZXh0OiBmdW5jdGlvbiAoXG5cdFx0c0JpbmRpbmdFeHByZXNzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdFx0b1ZpZXc6IFZpZXcsXG5cdFx0b1Jvb3RDb250ZXh0OiBDb250ZXh0LFxuXHRcdHNQcm9wZXJ0eTogc3RyaW5nLFxuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHRcblx0KSB7XG5cdFx0aWYgKHNCaW5kaW5nRXhwcmVzc2lvbikge1xuXHRcdFx0Y29uc3Qgb0hpZGRlbkVsZW1lbnQgPSBuZXcgQW55RWxlbWVudCh7IGFueVRleHQ6IHNCaW5kaW5nRXhwcmVzc2lvbiB9KTtcblx0XHRcdG9IaWRkZW5FbGVtZW50LnNldEJpbmRpbmdDb250ZXh0KG51bGwpO1xuXHRcdFx0b1ZpZXcuYWRkRGVwZW5kZW50KG9IaWRkZW5FbGVtZW50KTtcblx0XHRcdG9IaWRkZW5FbGVtZW50LmdldEJpbmRpbmcoXCJhbnlUZXh0XCIpO1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBvSGlkZGVuRWxlbWVudFxuXHRcdFx0XHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHQ/LmJpbmRDb250ZXh0KG9Sb290Q29udGV4dC5nZXRQYXRoKCksIG9Sb290Q29udGV4dCwgeyAkJGdyb3VwSWQ6IFwiJGF1dG8uSGVyb2VzXCIgfSlcblx0XHRcdFx0Py5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdG9IaWRkZW5FbGVtZW50LnNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0KTtcblx0XHRcdG9IaWRkZW5FbGVtZW50Py5nZXRCaW5kaW5nKFwiYW55VGV4dFwiKT8uYXR0YWNoQ2hhbmdlKChvRXZlbnQ6IEV2ZW50KSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9OZXdWYWx1ZSA9IChvRXZlbnQuZ2V0U291cmNlKCkgYXMgUHJvcGVydHlCaW5kaW5nKS5nZXRFeHRlcm5hbFZhbHVlKCk7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShzUHJvcGVydHksIG9OZXdWYWx1ZSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0X3NldEFjdGlvbkVuYWJsZW1lbnRGb3JUYWJsZTogZnVuY3Rpb24gKFxuXHRcdG9TZWxlY3RlZENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQsXG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRzQWN0aW9uOiBzdHJpbmcsXG5cdFx0c1Byb3BlcnR5OiBzdHJpbmcsXG5cdFx0YVJlcXVlc3RQcm9taXNlczogUHJvbWlzZTxfUmVxdWVzdGVkUHJvcGVydHk+W11cblx0KSB7XG5cdFx0Ly8gUmVzZXQgYWxsIHByb3BlcnRpZXMgYmVmb3JlIGNvbXB1dGF0aW9uXG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KGBkeW5hbWljQWN0aW9ucy8ke3NBY3Rpb259YCwge1xuXHRcdFx0YkVuYWJsZWQ6IGZhbHNlLFxuXHRcdFx0YUFwcGxpY2FibGU6IFtdLFxuXHRcdFx0YU5vdEFwcGxpY2FibGU6IFtdXG5cdFx0fSk7XG5cdFx0Ly8gTm90ZSB0aGF0IG5vbiBkeW5hbWljIGFjdGlvbnMgYXJlIG5vdCBwcm9jZXNzZWQgaGVyZS4gVGhleSBhcmUgZW5hYmxlZCBiZWNhdXNlXG5cdFx0Ly8gb25lIG9yIG1vcmUgYXJlIHNlbGVjdGVkIGFuZCB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlIGNvbmRpdGlvbiBpbiB0aGUgdGVtcGxhdGluZ1xuXHRcdC8vIGlzIHRoZW4gdW5kZWZpbmVkIGFuZCB0aHVzIHRoZSBidXR0b24gdGFrZXMgdGhlIGRlZmF1bHQgZW5hYmxpbmcsIHdoaWNoIGlzIHRydWUhXG5cdFx0Y29uc3QgYUFwcGxpY2FibGUgPSBbXSxcblx0XHRcdGFOb3RBcHBsaWNhYmxlID0gW10sXG5cdFx0XHRzRHluYW1pY0FjdGlvbkVuYWJsZWRQYXRoID0gYCR7b0ludGVybmFsTW9kZWxDb250ZXh0LmdldFBhdGgoKX0vZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS9iRW5hYmxlZGA7XG5cdFx0aWYgKHR5cGVvZiBzUHJvcGVydHkgPT09IFwib2JqZWN0XCIgJiYgc1Byb3BlcnR5ICE9PSBudWxsICYmIHNQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAob1NlbGVjdGVkQ29udGV4dCkge1xuXHRcdFx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvU2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdCgpIGFzIFJlY29yZDxzdHJpbmcsIFByaW1pdGl2ZVR5cGU+O1xuXHRcdFx0XHRjb25zdCBvVHJhbnNmb3JtZWRCaW5kaW5nID0gdHJhbnNmb3JtUmVjdXJzaXZlbHkoXG5cdFx0XHRcdFx0c1Byb3BlcnR5LFxuXHRcdFx0XHRcdFwiUGF0aEluTW9kZWxcIixcblx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbG9vcC1mdW5jXG5cdFx0XHRcdFx0ZnVuY3Rpb24gKG9CaW5kaW5nRXhwcmVzc2lvbjogUGF0aEluTW9kZWxFeHByZXNzaW9uPFByaW1pdGl2ZVR5cGU+KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0NvbnRleHREYXRhID8gY29uc3RhbnQob0NvbnRleHREYXRhW29CaW5kaW5nRXhwcmVzc2lvbi5wYXRoXSkgOiBjb25zdGFudChmYWxzZSk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbnN0IHNSZXN1bHQgPSBjb21waWxlRXhwcmVzc2lvbihvVHJhbnNmb3JtZWRCaW5kaW5nKTtcblx0XHRcdFx0aWYgKHNSZXN1bHQgPT09IFwidHJ1ZVwiKSB7XG5cdFx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LmdldE1vZGVsKCkuc2V0UHJvcGVydHkoc0R5bmFtaWNBY3Rpb25FbmFibGVkUGF0aCwgdHJ1ZSk7XG5cdFx0XHRcdFx0YUFwcGxpY2FibGUucHVzaChvU2VsZWN0ZWRDb250ZXh0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhTm90QXBwbGljYWJsZS5wdXNoKG9TZWxlY3RlZENvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRDb21tb25VdGlscy5zZXREeW5hbWljQWN0aW9uQ29udGV4dHMob0ludGVybmFsTW9kZWxDb250ZXh0LCBzQWN0aW9uLCBhQXBwbGljYWJsZSwgYU5vdEFwcGxpY2FibGUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvU2VsZWN0ZWRDb250ZXh0Py5nZXRPYmplY3QoKSBhcyBSZWNvcmQ8c3RyaW5nLCBQcmltaXRpdmVUeXBlPjtcblx0XHRcdGlmIChzUHJvcGVydHkgPT09IG51bGwgJiYgISFvQ29udGV4dERhdGFbYCMke3NBY3Rpb259YF0pIHtcblx0XHRcdFx0Ly9sb29rIGZvciBhY3Rpb24gYWR2ZXJ0aXNlbWVudCBpZiBwcmVzZW50IGFuZCBpdHMgdmFsdWUgaXMgbm90IG51bGxcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LmdldE1vZGVsKCkuc2V0UHJvcGVydHkoc0R5bmFtaWNBY3Rpb25FbmFibGVkUGF0aCwgdHJ1ZSk7XG5cdFx0XHR9IGVsc2UgaWYgKG9TZWxlY3RlZENvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHQvLyBDb2xsZWN0IHByb21pc2VzIHRvIHJldHJpZXZlIHNpbmdsZXRvbiBvciBub3JtYWwgcHJvcGVydHkgdmFsdWUgYXN5bmNocm9ub3VzbHlcblx0XHRcdFx0YVJlcXVlc3RQcm9taXNlcy5wdXNoKENvbW1vblV0aWxzLnJlcXVlc3RQcm9wZXJ0eShvU2VsZWN0ZWRDb250ZXh0LCBzQWN0aW9uLCBzUHJvcGVydHksIHNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGgpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGFSZXF1ZXN0UHJvbWlzZXM7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrIGlmIGFjdGlvbiBpcyBjcml0aWNhbC5cblx0ICpcblx0ICogQHBhcmFtIG1ldGFNb2RlbCBNZXRhTW9kZWxcblx0ICogQHBhcmFtIHBhdGggUGF0aCB0byB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250ZXh0cyBDb250ZXh0cyBpbiBjYXNlIG9mIGJvdW5kIGFjdGlvbnMuXG5cdCAqIEByZXR1cm5zIEJvb2xlYW4gaW5kaWNhdGluZyBhY3Rpb24gaXMgY3JpdGljYWxcblx0ICovXG5cdGdldElzQWN0aW9uQ3JpdGljYWw6IGZ1bmN0aW9uIChtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBwYXRoOiBzdHJpbmcsIGNvbnRleHRzOiBDb250ZXh0W10gPSBbXSk6IEJvb2xlYW4ge1xuXHRcdC8vIGRlZmF1bHQgaXMgdHJ1ZS5cblx0XHRsZXQgaXNBY3Rpb25Dcml0aWNhbFZhbHVlID0gdHJ1ZTtcblx0XHRjb25zdCBjb252ZXJ0ZWRUeXBlcyA9IGNvbnZlcnRUeXBlcyhtZXRhTW9kZWwpO1xuXHRcdGNvbnN0IGFjdGlvblRhcmdldFJlc29sdXRpb24gPSBjb252ZXJ0ZWRUeXBlcy5yZXNvbHZlUGF0aDxFZG1BY3Rpb24+KHBhdGgpO1xuXHRcdGNvbnN0IGFjdGlvblRhcmdldCA9IGFjdGlvblRhcmdldFJlc29sdXRpb24udGFyZ2V0O1xuXHRcdGlmICghYWN0aW9uVGFyZ2V0KSB7XG5cdFx0XHRyZXR1cm4gaXNBY3Rpb25Dcml0aWNhbFZhbHVlO1xuXHRcdH1cblxuXHRcdGNvbnN0IGlzQWN0aW9uQ3JpdGljYWxCaW5kaW5nRXhwID0gZ2V0SXNBY3Rpb25Dcml0aWNhbEV4cHJlc3Npb24oYWN0aW9uVGFyZ2V0LCBjb252ZXJ0ZWRUeXBlcyk7XG5cblx0XHRpZiAoaXNDb25zdGFudChpc0FjdGlvbkNyaXRpY2FsQmluZGluZ0V4cCkpIHtcblx0XHRcdC8vIENvbnN0YW50IGV4cHJlc3Npb24gcmVzb2x2ZXMgdG8gXCJ0cnVlXCIgb3IgXCJmYWxzZVwiLiBCdXQsIHdlIG5lZWQgYm9vbGVhbi5cblx0XHRcdGlzQWN0aW9uQ3JpdGljYWxWYWx1ZSA9IGNvbXBpbGVDb25zdGFudChpc0FjdGlvbkNyaXRpY2FsQmluZGluZ0V4cCwgZmFsc2UsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0fSBlbHNlIGlmIChjb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvLyBXZSBldmFsdWF0ZSB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gdmlhIGEgVUk1IG1hbmFnZWQgb2JqZWN0IGluc3RhbmNlLlxuXHRcdFx0Y29uc3QgYW55T2JqZWN0ID0gbmV3IEFueSh7IGFueUJvb2xlYW46IGNvbXBpbGVFeHByZXNzaW9uKGlzQWN0aW9uQ3JpdGljYWxCaW5kaW5nRXhwKSB9KTtcblx0XHRcdGFueU9iamVjdC5zZXRNb2RlbChjb250ZXh0c1swXS5nZXRNb2RlbCgpKTtcblx0XHRcdGFueU9iamVjdC5zZXRCaW5kaW5nQ29udGV4dChjb250ZXh0c1swXSk7XG5cdFx0XHRpc0FjdGlvbkNyaXRpY2FsVmFsdWUgPSBhbnlPYmplY3QuZ2V0QmluZGluZyhcImFueUJvb2xlYW5cIikuZ2V0RXh0ZXJuYWxWYWx1ZSgpO1xuXHRcdFx0YW55T2JqZWN0LmRlc3Ryb3koKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaXNBY3Rpb25Dcml0aWNhbFZhbHVlO1xuXHR9XG59O1xuZXhwb3J0IGRlZmF1bHQgQWN0aW9uUnVudGltZTtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7Ozs7O0VBc0RBLE1BQU1BLGFBQWEsR0FBRztJQUNyQjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ0MsNkJBQTZCLEVBQUUsVUFDOUJDLGNBQThCLEVBQzlCQyxpQkFBa0YsRUFDakY7TUFDREQsY0FBYyxDQUFDRSxXQUFXLENBQ3pCRCxpQkFBaUIsQ0FBQ0UsR0FBRyxDQUFFQyxnQkFBZ0IsSUFBSztRQUMzQyxNQUFNQyxPQUFPLEdBQUdELGdCQUFnQixDQUFDRSxtQkFBbUIsQ0FBQ0MsS0FBSyxDQUFDQyxVQUFVLENBQ3BFSixnQkFBZ0IsQ0FBQ0UsbUJBQW1CLENBQUNHLFlBQVksR0FBRyxPQUFPLEdBQUcsT0FBTyxDQUNyRTtRQUNELE9BQU8sSUFBSUMsT0FBTyxDQUFDO1VBQ2xCQyxPQUFPLEVBQUVQLGdCQUFnQixDQUFDTyxPQUFPO1VBQ2pDQyxJQUFJLEVBQUUsT0FBTztVQUNiQyxTQUFTLEVBQUVSLE9BQU8sYUFBUEEsT0FBTyx1QkFBUEEsT0FBTyxDQUFFUyxRQUFRLEVBQUU7VUFDOUJDLFVBQVUsRUFBRSxJQUFJO1VBQ2hCQyxNQUFNLEVBQUVYLE9BQU8sYUFBUEEsT0FBTyx1QkFB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
|
|
328
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBY3Rpb25SdW50aW1lIiwiX2FkZE1lc3NhZ2VGb3JBY3Rpb25QYXJhbWV0ZXIiLCJtZXNzYWdlUGFyYW1ldGVycyIsIk1lc3NhZ2luZyIsImFkZE1lc3NhZ2VzIiwibWFwIiwibWVzc2FnZVBhcmFtZXRlciIsImJpbmRpbmciLCJhY3Rpb25QYXJhbWV0ZXJJbmZvIiwiZmllbGQiLCJnZXRCaW5kaW5nIiwiaXNNdWx0aVZhbHVlIiwiTWVzc2FnZSIsIm1lc3NhZ2UiLCJ0eXBlIiwiTWVzc2FnZVR5cGUiLCJFcnJvciIsInByb2Nlc3NvciIsImdldE1vZGVsIiwidW5kZWZpbmVkIiwicGVyc2lzdGVudCIsInRhcmdldCIsImdldFJlc29sdmVkUGF0aCIsInZhbGlkYXRlUHJvcGVydGllcyIsImFjdGlvblBhcmFtZXRlckluZm9zIiwicmVzb3VyY2VNb2RlbCIsIlByb21pc2UiLCJhbGxTZXR0bGVkIiwidmFsaWRhdGlvblByb21pc2UiLCJyZXF1aXJlZFBhcmFtZXRlckluZm9zIiwiZmlsdGVyIiwicGFyYW1ldGVySW5mbyIsImdldFJlcXVpcmVkIiwiYWxsTWVzc2FnZXMiLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwiZW1wdHlSZXF1aXJlZEZpZWxkcyIsInJlcXVpcmVkUGFyYW1ldGVySW5mbyIsImZpZWxkSWQiLCJnZXRJZCIsInJlbGV2YW50TWVzc2FnZXMiLCJtc2ciLCJnZXRDb250cm9sSWRzIiwic29tZSIsImNvbnRyb2xJZCIsImluY2x1ZGVzIiwibGVuZ3RoIiwidmFsdWUiLCJmaWVsZFZhbHVlIiwiZ2V0VmFsdWUiLCJpc0ZpZWxkQXJyYXkiLCJBcnJheSIsImlzQXJyYXkiLCJnZXRUZXh0IiwiZ2V0UGFyZW50IiwiZ2V0QWdncmVnYXRpb24iLCJmaXJzdEludmFsaWRQYXJhbWV0ZXIiLCJmaW5kIiwiaGFzRXJyb3IiLCJnZXRWYWx1ZVN0YXRlIiwiZm9jdXMiLCJzZXRBY3Rpb25FbmFibGVtZW50Iiwib0ludGVybmFsTW9kZWxDb250ZXh0Iiwib0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsImFTZWxlY3RlZENvbnRleHRzIiwic0NvbnRyb2wiLCJmb3JDb250ZXh0TWVudSIsImFQcm9taXNlcyIsInNBY3Rpb24iLCJhUmVxdWVzdFByb21pc2VzIiwic2V0UHJvcGVydHkiLCJzUHJvcGVydHkiLCJlbGVtZW50Iiwib1NlbGVjdGVkQ29udGV4dCIsIm9Db250ZXh0RGF0YSIsImdldE9iamVjdCIsIl9zZXRBY3Rpb25FbmFibGVtZW50Rm9yVGFibGUiLCJiRW5hYmxlZCIsImFBcHBsaWNhYmxlIiwiYU5vdEFwcGxpY2FibGUiLCJwdXNoIiwiQ29tbW9uVXRpbHMiLCJzZXRDb250ZXh0c0Jhc2VkT25PcGVyYXRpb25BdmFpbGFibGUiLCJhbGwiLCJzZXRBY3Rpb25FbmFibGVtZW50QWZ0ZXJQYXRjaCIsIm9WaWV3Iiwib0xpc3RCaW5kaW5nIiwib0ludGVybmFsTW9kZWxDb250ZXh0RGF0YSIsIm9Db250cm9scyIsImNvbnRyb2xzIiwic0tleSIsIm9UYWJsZSIsImJ5SWQiLCJpc0EiLCJvUm93QmluZGluZyIsImdldFJvd0JpbmRpbmciLCJnZXRCaW5kaW5nQ29udGV4dCIsIkpTT04iLCJwYXJzZSIsImRhdGEiLCJjdXN0b21EYXRhIiwiZ2V0U2VsZWN0ZWRDb250ZXh0cyIsInVwZGF0ZUVkaXRCdXR0b25WaXNpYmlsaXR5QW5kRW5hYmxlbWVudCIsImlWaWV3TGV2ZWwiLCJnZXRWaWV3RGF0YSIsInZpZXdMZXZlbCIsImlzRWRpdGFibGUiLCJnZXRQcm9wZXJ0eSIsIm9Db250ZXh0Iiwib0FwcENvbXBvbmVudCIsImdldEFwcENvbXBvbmVudCIsInNNZXRhUGF0aCIsIk1vZGVsSGVscGVyIiwiZ2V0TWV0YVBhdGhGb3JDb250ZXh0Iiwic0VudGl0eVNldCIsImdldFJvb3RFbnRpdHlTZXRQYXRoIiwibWV0YUNvbnRleHQiLCJnZXRNZXRhTW9kZWwiLCJnZXRDb250ZXh0IiwiZ2V0UGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJDb252ZXJ0ZXJDb250ZXh0IiwiY3JlYXRlQ29udmVydGVyQ29udGV4dEZvck1hY3JvIiwiZ2V0RGlhZ25vc3RpY3MiLCJtZXJnZSIsImVudGl0eVNldCIsImdldEVudGl0eVNldCIsImVudGl0eVR5cGUiLCJnZXRFbnRpdHlUeXBlIiwidXBkYXRlSGlkZGVuIiwiYlVwZGF0ZUhpZGRlbiIsImlzRW50aXR5U2V0IiwiYW5ub3RhdGlvbnMiLCJVSSIsIlVwZGF0ZUhpZGRlbiIsInZhbHVlT2YiLCJpc1VwZGF0ZUhpZGRlbiIsInNFZGl0RW5hYmxlQmluZGluZyIsImdldEVkaXRCdXR0b25FbmFibGVkIiwiZHJhZnRSb290UGF0aCIsImdldERyYWZ0Um9vdFBhdGgiLCJzU3RpY2t5Um9vdFBhdGgiLCJnZXRTdGlja3lSb290UGF0aCIsInNQYXRoIiwib1Jvb3RDb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJzSGlkZGVuRXhwcmVzc2lvbiIsImNvbXBpbGVFeHByZXNzaW9uIiwiZXF1YWwiLCJnZXRIaWRkZW5FeHByZXNzaW9uIiwidXBkYXRlRWRpdE1vZGVsQ29udGV4dCIsInNCaW5kaW5nRXhwcmVzc2lvbiIsIm9IaWRkZW5FbGVtZW50IiwiQW55RWxlbWVudCIsImFueVRleHQiLCJzZXRCaW5kaW5nQ29udGV4dCIsImFkZERlcGVuZGVudCIsIiQkZ3JvdXBJZCIsImF0dGFjaENoYW5nZSIsIm9FdmVudCIsIm9OZXdWYWx1ZSIsImdldFNvdXJjZSIsImdldEV4dGVybmFsVmFsdWUiLCJzRW5hYmxlbWVudEZpZWxkTmFtZSIsImJBY3Rpb25FbmFibGVkIiwiYkVuYWJsZWRGb3JDb250ZXh0TWVudSIsImFBcHBsaWNhYmxlRm9yQ29udGV4dE1lbnUiLCJhTm90QXBwbGljYWJsZUZvckNvbnRleHRNZW51Iiwic0R5bmFtaWNBY3Rpb25FbmFibGVkUGF0aCIsIm9UcmFuc2Zvcm1lZEJpbmRpbmciLCJ0cmFuc2Zvcm1SZWN1cnNpdmVseSIsIm9CaW5kaW5nRXhwcmVzc2lvbiIsImNvbnN0YW50IiwicGF0aCIsInNSZXN1bHQiLCJzZXREeW5hbWljQWN0aW9uQ29udGV4dHMiLCJyZXF1ZXN0UHJvcGVydHkiLCJnZXRJc0FjdGlvbkNyaXRpY2FsIiwibWV0YU1vZGVsIiwiY29udGV4dHMiLCJpc0FjdGlvbkNyaXRpY2FsVmFsdWUiLCJjb252ZXJ0ZWRUeXBlcyIsImNvbnZlcnRUeXBlcyIsImFjdGlvblRhcmdldFJlc29sdXRpb24iLCJyZXNvbHZlUGF0aCIsImFjdGlvblRhcmdldCIsImlzQWN0aW9uQ3JpdGljYWxCaW5kaW5nRXhwIiwiZ2V0SXNBY3Rpb25Dcml0aWNhbEV4cHJlc3Npb24iLCJpc0NvbnN0YW50IiwiY29tcGlsZUNvbnN0YW50IiwicmVzb2x2ZSIsImFueU9iamVjdCIsIkFueSIsImFueUJvb2xlYW4iLCJzZXRNb2RlbCIsImJvb2xlYW5CaW5kaW5nIiwiZm5DaGFuZ2UiLCJ2YWx1ZUV4dCIsImRlc3Ryb3kiLCJhdHRhY2hFdmVudE9uY2UiLCJlcnIiLCJTdHJpbmciLCJMb2ciLCJlcnJvciJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQWN0aW9uUnVudGltZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFjdGlvbiBhcyBFZG1BY3Rpb24sIFByaW1pdGl2ZVR5cGUgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IG1lcmdlIGZyb20gXCJzYXAvYmFzZS91dGlsL21lcmdlXCI7XG5pbXBvcnQgdHlwZSB7IEZFVmlldyB9IGZyb20gXCJzYXAvZmUvY29yZS9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBfUmVxdWVzdGVkUHJvcGVydHkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCBBbnkgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xzL0FueVwiO1xuaW1wb3J0IHR5cGUgeyBQYXRoSW5Nb2RlbEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHsgY29tcGlsZUNvbnN0YW50LCBjb21waWxlRXhwcmVzc2lvbiwgY29uc3RhbnQsIGVxdWFsLCBpc0NvbnN0YW50LCB0cmFuc2Zvcm1SZWN1cnNpdmVseSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgaXNFbnRpdHlTZXQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgeyBnZXRJc0FjdGlvbkNyaXRpY2FsRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0FjdGlvbkhlbHBlclwiO1xuaW1wb3J0IHR5cGUgTGFiZWwgZnJvbSBcInNhcC9tL0xhYmVsXCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBNZXNzYWdpbmcgZnJvbSBcInNhcC91aS9jb3JlL01lc3NhZ2luZ1wiO1xuaW1wb3J0IHsgTWVzc2FnZVR5cGUgfSBmcm9tIFwic2FwL3VpL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCB0eXBlIEZpZWxkIGZyb20gXCJzYXAvdWkvbWRjL0ZpZWxkXCI7XG5pbXBvcnQgdHlwZSBNdWx0aVZhbHVlRmllbGQgZnJvbSBcInNhcC91aS9tZGMvTXVsdGlWYWx1ZUZpZWxkXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgTXVsdGlWYWx1ZUZpZWxkSXRlbSBmcm9tIFwic2FwL3VpL21kYy9maWVsZC9NdWx0aVZhbHVlRmllbGRJdGVtXCI7XG5pbXBvcnQgdHlwZSBQcm9wZXJ0eUJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9Qcm9wZXJ0eUJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IEFueUVsZW1lbnQgZnJvbSBcIi4vY29udHJvbHMvQW55RWxlbWVudFwiO1xuaW1wb3J0IENvbnZlcnRlckNvbnRleHQgZnJvbSBcIi4vY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VNYW5pZmVzdFNldHRpbmdzIH0gZnJvbSBcIi4vY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZXMgfSBmcm9tIFwiLi9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgZ2V0RWRpdEJ1dHRvbkVuYWJsZWQsIGdldEhpZGRlbkV4cHJlc3Npb24gfSBmcm9tIFwiLi9jb252ZXJ0ZXJzL29iamVjdFBhZ2UvSGVhZGVyQW5kRm9vdGVyQWN0aW9uXCI7XG5cbmV4cG9ydCB0eXBlIEFjdGlvblBhcmFtZXRlckluZm8gPSB7XG5cdHBhcmFtZXRlcjogdW5rbm93bjtcblx0ZmllbGQ6IEZpZWxkIHwgTXVsdGlWYWx1ZUZpZWxkO1xuXHRpc011bHRpVmFsdWU6IGJvb2xlYW47XG5cdHZhbHVlPzogc3RyaW5nIHwgTXVsdGlWYWx1ZUZpZWxkSXRlbVtdO1xuXHR2YWxpZGF0aW9uUHJvbWlzZT86IFByb21pc2U8c3RyaW5nIHwgTXVsdGlWYWx1ZUZpZWxkSXRlbVtdPjtcblx0aGFzRXJyb3I6IGJvb2xlYW47XG59O1xuXG5jb25zdCBBY3Rpb25SdW50aW1lID0ge1xuXHQvKipcblx0ICogQWRkcyBlcnJvciBtZXNzYWdlcyBmb3IgYW4gYWN0aW9uIHBhcmFtZXRlciBmaWVsZCB0byB0aGUgbWVzc2FnZSBtYW5hZ2VyLlxuXHQgKlxuXHQgKiBAcGFyYW0gbWVzc2FnZVBhcmFtZXRlcnMgSW5mb3JtYXRpb24gaWRlbnRpZnlpbmcgYW4gYWN0aW9uIHBhcmFtZXRlciBhbmQgbWVzc2FnZXMgcmVmZXJyaW5nIHRvIHRoaXMgcGFyYW1ldGVyXG5cdCAqL1xuXHRfYWRkTWVzc2FnZUZvckFjdGlvblBhcmFtZXRlcjogZnVuY3Rpb24gKG1lc3NhZ2VQYXJhbWV0ZXJzOiB7IGFjdGlvblBhcmFtZXRlckluZm86IEFjdGlvblBhcmFtZXRlckluZm87IG1lc3NhZ2U6IHN0cmluZyB9W10pOiB2b2lkIHtcblx0XHRNZXNzYWdpbmcuYWRkTWVzc2FnZXMoXG5cdFx0XHRtZXNzYWdlUGFyYW1ldGVycy5tYXAoKG1lc3NhZ2VQYXJhbWV0ZXIpID0+IHtcblx0XHRcdFx0Y29uc3QgYmluZGluZyA9IG1lc3NhZ2VQYXJhbWV0ZXIuYWN0aW9uUGFyYW1ldGVySW5mby5maWVsZC5nZXRCaW5kaW5nKFxuXHRcdFx0XHRcdG1lc3NhZ2VQYXJhbWV0ZXIuYWN0aW9uUGFyYW1ldGVySW5mby5pc011bHRpVmFsdWUgPyBcIml0ZW1zXCIgOiBcInZhbHVlXCJcblx0XHRcdFx0KTtcblx0XHRcdFx0cmV0dXJuIG5ldyBNZXNzYWdlKHtcblx0XHRcdFx0XHRtZXNzYWdlOiBtZXNzYWdlUGFyYW1ldGVyLm1lc3NhZ2UsXG5cdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3IsXG5cdFx0XHRcdFx0cHJvY2Vzc29yOiBiaW5kaW5nPy5nZXRNb2RlbCgpID8/IHVuZGVmaW5lZCwgLy8gZ2V0TW9kZWwoKTogbnVsbCB8IE1vZGVsIH5+PiBwcm9jZXNzb3I/OiBNZXNzYWdlUHJvY2Vzc29yXG5cdFx0XHRcdFx0cGVyc2lzdGVudDogdHJ1ZSxcblx0XHRcdFx0XHR0YXJnZXQ6IGJpbmRpbmc/LmdldFJlc29sdmVkUGF0aCgpXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHQpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYWxsIHJlcXVpcmVkIGFjdGlvbiBwYXJhbWV0ZXJzIGNvbnRhaW4gZGF0YSBhbmQgY2hlY2tzIGZvciBhbGwgYWN0aW9uIHBhcmFtZXRlcnMgaWYgdGhlXG5cdCAqIGNvbnRhaW5lZCBkYXRhIGlzIHZhbGlkLlxuXHQgKlxuXHQgKlxuXHQgKiBAcGFyYW0gYWN0aW9uUGFyYW1ldGVySW5mb3MgSW5mb3JtYXRpb24gaWRlbnRpZnlpbmcgYW4gYWN0aW9uIHBhcmFtZXRlclxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuXHQgKiBAcmV0dXJucyBUaGUgdmFsaWRhdGlvbiByZXN1bHQgY2FuIGJlIHRydWUgb3IgZmFsc2Vcblx0ICovXG5cdHZhbGlkYXRlUHJvcGVydGllczogYXN5bmMgZnVuY3Rpb24gKGFjdGlvblBhcmFtZXRlckluZm9zOiBBY3Rpb25QYXJhbWV0ZXJJbmZvW10sIHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG5cdFx0XHRhY3Rpb25QYXJhbWV0ZXJJbmZvcy5tYXAoXG5cdFx0XHRcdChhY3Rpb25QYXJhbWV0ZXJJbmZvKTogUHJvbWlzZTxzdHJpbmcgfCBNdWx0aVZhbHVlRmllbGRJdGVtW10+IHwgdW5kZWZpbmVkID0+IGFjdGlvblBhcmFtZXRlckluZm8udmFsaWRhdGlvblByb21pc2Vcblx0XHRcdClcblx0XHQpO1xuXG5cdFx0Y29uc3QgcmVxdWlyZWRQYXJhbWV0ZXJJbmZvcyA9IGFjdGlvblBhcmFtZXRlckluZm9zLmZpbHRlcigocGFyYW1ldGVySW5mbykgPT4gcGFyYW1ldGVySW5mby5maWVsZC5nZXRSZXF1aXJlZCgpKTtcblx0XHRjb25zdCBhbGxNZXNzYWdlcyA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKS5nZXREYXRhKCk7XG5cdFx0Y29uc3QgZW1wdHlSZXF1aXJlZEZpZWxkcyA9IHJlcXVpcmVkUGFyYW1ldGVySW5mb3MuZmlsdGVyKChyZXF1aXJlZFBhcmFtZXRlckluZm8pID0+IHtcblx0XHRcdGNvbnN0IGZpZWxkSWQgPSByZXF1aXJlZFBhcmFtZXRlckluZm8uZmllbGQuZ2V0SWQoKTtcblx0XHRcdGNvbnN0IHJlbGV2YW50TWVzc2FnZXMgPSBhbGxNZXNzYWdlcy5maWx0ZXIoKG1zZzogTWVzc2FnZSkgPT5cblx0XHRcdFx0bXNnLmdldENvbnRyb2xJZHMoKS5zb21lKChjb250cm9sSWQ6IHN0cmluZykgPT4gY29udHJvbElkLmluY2x1ZGVzKGZpZWxkSWQpKVxuXHRcdFx0KTtcblx0XHRcdGlmIChyZWxldmFudE1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSBlbHNlIGlmIChyZXF1aXJlZFBhcmFtZXRlckluZm8uaXNNdWx0aVZhbHVlKSB7XG5cdFx0XHRcdHJldHVybiByZXF1aXJlZFBhcmFtZXRlckluZm8udmFsdWUgPT09IHVuZGVmaW5lZCB8fCAhcmVxdWlyZWRQYXJhbWV0ZXJJbmZvLnZhbHVlLmxlbmd0aDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGZpZWxkVmFsdWUgPSAocmVxdWlyZWRQYXJhbWV0ZXJJbmZvLmZpZWxkIGFzIEZpZWxkKS5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRjb25zdCBpc0ZpZWxkQXJyYXkgPSBBcnJheS5pc0FycmF5KChyZXF1aXJlZFBhcmFtZXRlckluZm8uZmllbGQgYXMgRmllbGQpLmdldFZhbHVlKCkpO1xuXHRcdFx0XHRpZiAoaXNGaWVsZEFycmF5KSB7XG5cdFx0XHRcdFx0Ly8gb25seSBmaXJzdCB2YWx1ZSBjaGVjayBpcyBlbm91Z2ggYXMgdGhlIGZpZWxkIHZhbHVlIGNvbWVzIG9uIFswXSByZXN0IG9mIHRoZSBhcnJheSBpbmNsdWRlcyBjdXJyZW5jeSBhbmQgY3VycmVuY3kgY29kZVxuXHRcdFx0XHRcdC8vIGJvdGggb2Ygd2hpY2ggY2FuIG9yIGNhbm5vdCBiZSBudWxsLCBzbyB3ZSBzaGFsbCBjaGVjayBvbmx5IHRoZSBmaWVsZCB2YWx1ZVxuXHRcdFx0XHRcdHJldHVybiBmaWVsZFZhbHVlWzBdID09PSBudWxsIHx8IGZpZWxkVmFsdWVbMF0gPT09IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZpZWxkVmFsdWUgPT09IHVuZGVmaW5lZCB8fCBmaWVsZFZhbHVlID09PSBudWxsIHx8IGZpZWxkVmFsdWUgPT09IFwiXCI7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0LyogTWVzc2FnZSBmb3IgbWlzc2luZyBtYW5kYXRvcnkgdmFsdWUgb2YgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgKi9cblx0XHRpZiAoZW1wdHlSZXF1aXJlZEZpZWxkcy5sZW5ndGgpIHtcblx0XHRcdHRoaXMuX2FkZE1lc3NhZ2VGb3JBY3Rpb25QYXJhbWV0ZXIoXG5cdFx0XHRcdGVtcHR5UmVxdWlyZWRGaWVsZHMubWFwKChhY3Rpb25QYXJhbWV0ZXJJbmZvKSA9PiAoe1xuXHRcdFx0XHRcdGFjdGlvblBhcmFtZXRlckluZm86IGFjdGlvblBhcmFtZXRlckluZm8sXG5cdFx0XHRcdFx0bWVzc2FnZTogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19PUEVSQVRJT05TX0FDVElPTl9QQVJBTUVURVJfRElBTE9HX01JU1NJTkdfTUFOREFUT1JZX01TR1wiLCBbXG5cdFx0XHRcdFx0XHQoYWN0aW9uUGFyYW1ldGVySW5mby5maWVsZC5nZXRQYXJlbnQoKT8uZ2V0QWdncmVnYXRpb24oXCJsYWJlbFwiKSBhcyBMYWJlbCkuZ2V0VGV4dCgpXG5cdFx0XHRcdFx0XSlcblx0XHRcdFx0fSkpXG5cdFx0XHQpO1xuXHRcdH1cblx0XHQvKiBDaGVjayB2YWx1ZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycyAqL1xuXHRcdGNvbnN0IGZpcnN0SW52YWxpZFBhcmFtZXRlciA9IGFjdGlvblBhcmFtZXRlckluZm9zLmZpbmQoXG5cdFx0XHQocGFyYW1ldGVySW5mbykgPT5cblx0XHRcdFx0cGFyYW1ldGVySW5mby5oYXNFcnJvciB8fCBwYXJhbWV0ZXJJbmZvLmZpZWxkLmdldFZhbHVlU3RhdGUoKSA9PT0gXCJFcnJvclwiIHx8IGVtcHR5UmVxdWlyZWRGaWVsZHMuaW5jbHVkZXMocGFyYW1ldGVySW5mbylcblx0XHQpO1xuXHRcdGlmIChmaXJzdEludmFsaWRQYXJhbWV0ZXIpIHtcblx0XHRcdGZpcnN0SW52YWxpZFBhcmFtZXRlci5maWVsZC5mb2N1cygpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGFjdGlvbiBlbmFibGVtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0ludGVybmFsTW9kZWxDb250ZXh0IE9iamVjdCBjb250YWluaW5nIHRoZSBjb250ZXh0IG1vZGVsXG5cdCAqIEBwYXJhbSBvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwIE1hcCBjb250YWluaW5nIHRoZSBvcGVyYXRpb24gYXZhaWxhYmlsaXR5IG9mIGFjdGlvbnNcblx0ICogQHBhcmFtIGFTZWxlY3RlZENvbnRleHRzIEFycmF5IGNvbnRhaW5pbmcgc2VsZWN0ZWQgY29udGV4dHMgb2YgdGhlIGNoYXJ0XG5cdCAqIEBwYXJhbSBzQ29udHJvbCBDb250cm9sIG5hbWVcblx0ICogQHBhcmFtIGZvckNvbnRleHRNZW51IEluZGljYXRlcyBpZiB0aGUgYWN0aW9uIGFwcGVhcnMgaW4gdGhlIGNvbnRleHQgbWVudS4gSWYgZmFsc2UsIHRoZSBhY3Rpb24gYXBwZWFycyBpbiB0aGUgdGFibGUgdG9vbGJhclxuXHQgKiBAcmV0dXJucyBUaGUgYWN0aW9uIGVuYWJsZW1lbnQgcHJvbWlzZXNcblx0ICovXG5cdHNldEFjdGlvbkVuYWJsZW1lbnQ6IGFzeW5jIGZ1bmN0aW9uIChcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQ6IEludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG5cdFx0YVNlbGVjdGVkQ29udGV4dHM6IENvbnRleHRbXSxcblx0XHRzQ29udHJvbDogc3RyaW5nLFxuXHRcdGZvckNvbnRleHRNZW51ID0gZmFsc2Vcblx0KTogUHJvbWlzZTx2b2lkW10+IHtcblx0XHRjb25zdCBhUHJvbWlzZXMgPSBbXTtcblx0XHRmb3IgKGNvbnN0IHNBY3Rpb24gaW4gb0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCkge1xuXHRcdFx0bGV0IGFSZXF1ZXN0UHJvbWlzZXM6IFByb21pc2U8X1JlcXVlc3RlZFByb3BlcnR5PltdID0gW107XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoc0FjdGlvbiwgZmFsc2UpO1xuXHRcdFx0aWYgKGZvckNvbnRleHRNZW51ICYmIHNDb250cm9sID09PSBcInRhYmxlXCIpIHtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KGBkeW5hbWljQWN0aW9ucy8ke3NBY3Rpb259L2FBcHBsaWNhYmxlYCwgW10pO1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7c0FjdGlvbn0vYU5vdEFwcGxpY2FibGVgLCBbXSk7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS9iRW5hYmxlZEZvckNvbnRleHRNZW51YCwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgc1Byb3BlcnR5ID0gb0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcFtzQWN0aW9uXTtcblx0XHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBhU2VsZWN0ZWRDb250ZXh0cykge1xuXHRcdFx0XHRjb25zdCBvU2VsZWN0ZWRDb250ZXh0ID0gZWxlbWVudDtcblx0XHRcdFx0aWYgKG9TZWxlY3RlZENvbnRleHQpIHtcblx0XHRcdFx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvU2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdCgpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdFx0XHRcdGlmIChzQ29udHJvbCA9PT0gXCJjaGFydFwiKSB7XG5cdFx0XHRcdFx0XHRpZiAoKHNQcm9wZXJ0eSA9PT0gbnVsbCAmJiAhIW9Db250ZXh0RGF0YVtgIyR7c0FjdGlvbn1gXSkgfHwgb1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3Qoc1Byb3BlcnR5KSkge1xuXHRcdFx0XHRcdFx0XHQvL2xvb2sgZm9yIGFjdGlvbiBhZHZlcnRpc2VtZW50IGlmIHByZXNlbnQgYW5kIGl0cyB2YWx1ZSBpcyBub3QgbnVsbFxuXHRcdFx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoc0FjdGlvbiwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoc0NvbnRyb2wgPT09IFwidGFibGVcIikge1xuXHRcdFx0XHRcdFx0YVJlcXVlc3RQcm9taXNlcyA9IHRoaXMuX3NldEFjdGlvbkVuYWJsZW1lbnRGb3JUYWJsZShcblx0XHRcdFx0XHRcdFx0b1NlbGVjdGVkQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRzQWN0aW9uLFxuXHRcdFx0XHRcdFx0XHRzUHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdGFSZXF1ZXN0UHJvbWlzZXMsXG5cdFx0XHRcdFx0XHRcdGZvckNvbnRleHRNZW51XG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHNDb250cm9sID09PSBcInRhYmxlXCIpIHtcblx0XHRcdFx0aWYgKCFhU2VsZWN0ZWRDb250ZXh0cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7c0FjdGlvbn1gLCB7XG5cdFx0XHRcdFx0XHRiRW5hYmxlZDogZmFsc2UsXG5cdFx0XHRcdFx0XHRhQXBwbGljYWJsZTogW10sXG5cdFx0XHRcdFx0XHRhTm90QXBwbGljYWJsZTogW11cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRhUHJvbWlzZXMucHVzaChDb21tb25VdGlscy5zZXRDb250ZXh0c0Jhc2VkT25PcGVyYXRpb25BdmFpbGFibGUob0ludGVybmFsTW9kZWxDb250ZXh0LCBbXSwgZm9yQ29udGV4dE1lbnUpKTtcblx0XHRcdFx0fSBlbHNlIGlmIChhU2VsZWN0ZWRDb250ZXh0cy5sZW5ndGggJiYgdHlwZW9mIHNQcm9wZXJ0eSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdC8vIFdoZW4gYWxsIHByb3BlcnR5IHZhbHVlcyBoYXZlIGJlZW4gcmV0cmlldmVkLCBzZXRcblx0XHRcdFx0XHQvLyBUaGUgYXBwbGljYWJsZSBhbmQgbm90LWFwcGxpY2FibGUgc2VsZWN0ZWQgY29udGV4dHMgZm9yIGVhY2ggYWN0aW9uIGFuZFxuXHRcdFx0XHRcdC8vIFRoZSBlbmFibGVkIHByb3BlcnR5IG9mIHRoZSBkeW5hbWljIGFjdGlvbiBpbiBpbnRlcm5hbCBtb2RlbCBjb250ZXh0LlxuXHRcdFx0XHRcdGFQcm9taXNlcy5wdXNoKFxuXHRcdFx0XHRcdFx0Q29tbW9uVXRpbHMuc2V0Q29udGV4dHNCYXNlZE9uT3BlcmF0aW9uQXZhaWxhYmxlKG9JbnRlcm5hbE1vZGVsQ29udGV4dCwgYVJlcXVlc3RQcm9taXNlcywgZm9yQ29udGV4dE1lbnUpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoYVByb21pc2VzKTtcblx0fSxcblx0c2V0QWN0aW9uRW5hYmxlbWVudEFmdGVyUGF0Y2g6IGZ1bmN0aW9uIChcblx0XHRvVmlldzogVmlldyxcblx0XHRvTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHREYXRhID0gb0ludGVybmFsTW9kZWxDb250ZXh0Py5nZXRPYmplY3QoKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRjb25zdCBvQ29udHJvbHMgPSAob0ludGVybmFsTW9kZWxDb250ZXh0RGF0YT8uY29udHJvbHMgfHwge30pIGFzIFJlY29yZDxzdHJpbmcsIHsgY29udHJvbElkPzogc3RyaW5nIH0+O1xuXHRcdGZvciAoY29uc3Qgc0tleSBpbiBvQ29udHJvbHMpIHtcblx0XHRcdGlmIChvQ29udHJvbHNbc0tleV0gJiYgb0NvbnRyb2xzW3NLZXldLmNvbnRyb2xJZCkge1xuXHRcdFx0XHRjb25zdCBvVGFibGUgPSBvVmlldy5ieUlkKHNLZXkpO1xuXHRcdFx0XHRpZiAob1RhYmxlICYmIG9UYWJsZS5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRcdGNvbnN0IG9Sb3dCaW5kaW5nID0gb1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0XHRpZiAob1Jvd0JpbmRpbmcgPT0gb0xpc3RCaW5kaW5nKSB7XG5cdFx0XHRcdFx0XHRBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRKU09OLnBhcnNlKG9UYWJsZS5kYXRhKFwib3BlcmF0aW9uQXZhaWxhYmxlTWFwXCIpLmN1c3RvbURhdGEpLFxuXHRcdFx0XHRcdFx0XHRvVGFibGUuZ2V0U2VsZWN0ZWRDb250ZXh0cygpIGFzIENvbnRleHRbXSxcblx0XHRcdFx0XHRcdFx0XCJ0YWJsZVwiXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHR1cGRhdGVFZGl0QnV0dG9uVmlzaWJpbGl0eUFuZEVuYWJsZW1lbnQob1ZpZXc6IEZFVmlldyk6IHZvaWQge1xuXHRcdGNvbnN0IGlWaWV3TGV2ZWwgPSAob1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBCYXNlTWFuaWZlc3RTZXR0aW5ncyk/LnZpZXdMZXZlbCxcblx0XHRcdGlzRWRpdGFibGUgPSBvVmlldy5nZXRNb2RlbChcInVpXCIpPy5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpO1xuXHRcdGlmICgoaVZpZXdMZXZlbCBhcyBudW1iZXIpID4gMSAmJiBpc0VkaXRhYmxlICE9PSB0cnVlKSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG9WaWV3KTtcblx0XHRcdGNvbnN0IHNNZXRhUGF0aCA9IE1vZGVsSGVscGVyLmdldE1ldGFQYXRoRm9yQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRjb25zdCBzRW50aXR5U2V0ID0gTW9kZWxIZWxwZXIuZ2V0Um9vdEVudGl0eVNldFBhdGgoc01ldGFQYXRoKTtcblx0XHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gb0NvbnRleHRcblx0XHRcdFx0Py5nZXRNb2RlbCgpXG5cdFx0XHRcdC5nZXRNZXRhTW9kZWwoKVxuXHRcdFx0XHQ/LmdldENvbnRleHQob0NvbnRleHQ/LmdldFBhdGgoKSk7XG5cdFx0XHRjb25zdCBjb252ZXJ0ZXJDb250ZXh0ID0gQ29udmVydGVyQ29udGV4dD8uY3JlYXRlQ29udmVydGVyQ29udGV4dEZvck1hY3JvKFxuXHRcdFx0XHRzRW50aXR5U2V0LFxuXHRcdFx0XHRtZXRhQ29udGV4dCxcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXREaWFnbm9zdGljcygpLFxuXHRcdFx0XHRtZXJnZSxcblx0XHRcdFx0dW5kZWZpbmVkXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgZW50aXR5U2V0ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKTtcblx0XHRcdGNvbnN0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKTtcblx0XHRcdGxldCB1cGRhdGVIaWRkZW47XG5cdFx0XHQvL0ZpbmQgdGhlIFVwZGF0ZSBIaWRkZW4gb2YgdGhlIHJvb3QgZW50aXR5IHNldCBhbmQgYmluZCB0aGUgcHJvcGVydHkgdG8gQW55RWxlbWVudCwgYW55IGNoYW5nZXMgaW4gdGhlIHBhdGggb2YgdGhlIHJvb3QgVXBkYXRlSGlkZGVuIHdpbGwgYmUgdXBkYXRlZCB2aWEgdGhlIHByb3BlcnR5LCBpbnRlcm5hbCBtb2RlbCBjb250ZXh0IGlzIHVwZGF0ZWQgYmFzZWQgb24gdGhlIHByb3BlcnR5XG5cdFx0XHRjb25zdCBiVXBkYXRlSGlkZGVuID0gaXNFbnRpdHlTZXQoZW50aXR5U2V0KSAmJiBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuVUk/LlVwZGF0ZUhpZGRlbj8udmFsdWVPZigpO1xuXHRcdFx0aWYgKGJVcGRhdGVIaWRkZW4gIT09IHRydWUpIHtcblx0XHRcdFx0dXBkYXRlSGlkZGVuID0gTW9kZWxIZWxwZXIuaXNVcGRhdGVIaWRkZW4oZW50aXR5U2V0LCBlbnRpdHlUeXBlKTtcblx0XHRcdH1cblx0XHRcdC8vRmluZCB0aGUgb3BlcmF0aW9uIGF2YWlsYWJsZSBwcm9wZXJ0eSBvZiB0aGUgcm9vdCBlZGl0IGNvbmZpZ3VyYXRpb24gYW5kIGZldGNoIHRoZSBwcm9wZXJ0eSB1c2luZyBBbnlFbGVtZW50XG5cdFx0XHRjb25zdCBzRWRpdEVuYWJsZUJpbmRpbmcgPSBnZXRFZGl0QnV0dG9uRW5hYmxlZChjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdGNvbnN0IGRyYWZ0Um9vdFBhdGggPSBNb2RlbEhlbHBlci5nZXREcmFmdFJvb3RQYXRoKG9Db250ZXh0KTtcblx0XHRcdGNvbnN0IHNTdGlja3lSb290UGF0aCA9IE1vZGVsSGVscGVyLmdldFN0aWNreVJvb3RQYXRoKG9Db250ZXh0KTtcblx0XHRcdGNvbnN0IHNQYXRoID0gZHJhZnRSb290UGF0aCB8fCBzU3RpY2t5Um9vdFBhdGg7XG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0aWYgKHNQYXRoKSB7XG5cdFx0XHRcdGNvbnN0IG9Sb290Q29udGV4dCA9IG9WaWV3LmdldE1vZGVsKCkuYmluZENvbnRleHQoc1BhdGgpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRpZiAodXBkYXRlSGlkZGVuICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRjb25zdCBzSGlkZGVuRXhwcmVzc2lvbiA9IGNvbXBpbGVFeHByZXNzaW9uKGVxdWFsKGdldEhpZGRlbkV4cHJlc3Npb24oY29udmVydGVyQ29udGV4dCwgdXBkYXRlSGlkZGVuKSwgZmFsc2UpKTtcblx0XHRcdFx0XHR0aGlzLnVwZGF0ZUVkaXRNb2RlbENvbnRleHQoc0hpZGRlbkV4cHJlc3Npb24sIG9WaWV3LCBvUm9vdENvbnRleHQsIFwicm9vdEVkaXRWaXNpYmxlXCIsIG9JbnRlcm5hbE1vZGVsQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHNFZGl0RW5hYmxlQmluZGluZykge1xuXHRcdFx0XHRcdHRoaXMudXBkYXRlRWRpdE1vZGVsQ29udGV4dChzRWRpdEVuYWJsZUJpbmRpbmcsIG9WaWV3LCBvUm9vdENvbnRleHQsIFwicm9vdEVkaXRFbmFibGVkXCIsIG9JbnRlcm5hbE1vZGVsQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0dXBkYXRlRWRpdE1vZGVsQ29udGV4dDogZnVuY3Rpb24gKFxuXHRcdHNCaW5kaW5nRXhwcmVzc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRcdG9WaWV3OiBWaWV3LFxuXHRcdG9Sb290Q29udGV4dDogQ29udGV4dCxcblx0XHRzUHJvcGVydHk6IHN0cmluZyxcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQ6IEludGVybmFsTW9kZWxDb250ZXh0XG5cdCk6IHZvaWQge1xuXHRcdGlmIChzQmluZGluZ0V4cHJlc3Npb24pIHtcblx0XHRcdGNvbnN0IG9IaWRkZW5FbGVtZW50ID0gbmV3IEFueUVsZW1lbnQoeyBhbnlUZXh0OiBzQmluZGluZ0V4cHJlc3Npb24gfSk7XG5cdFx0XHRvSGlkZGVuRWxlbWVudC5zZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblx0XHRcdG9WaWV3LmFkZERlcGVuZGVudChvSGlkZGVuRWxlbWVudCk7XG5cdFx0XHRvSGlkZGVuRWxlbWVudC5nZXRCaW5kaW5nKFwiYW55VGV4dFwiKTtcblx0XHRcdGNvbnN0IG9Db250ZXh0ID0gb0hpZGRlbkVsZW1lbnRcblx0XHRcdFx0LmdldE1vZGVsKClcblx0XHRcdFx0Py5iaW5kQ29udGV4dChvUm9vdENvbnRleHQuZ2V0UGF0aCgpLCBvUm9vdENvbnRleHQsIHsgJCRncm91cElkOiBcIiRhdXRvLkhlcm9lc1wiIH0pXG5cdFx0XHRcdD8uZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRvSGlkZGVuRWxlbWVudC5zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRvSGlkZGVuRWxlbWVudD8uZ2V0QmluZGluZyhcImFueVRleHRcIik/LmF0dGFjaENoYW5nZSgob0V2ZW50OiBFdmVudDx7fSwgUHJvcGVydHlCaW5kaW5nPikgPT4ge1xuXHRcdFx0XHRjb25zdCBvTmV3VmFsdWUgPSBvRXZlbnQuZ2V0U291cmNlKCkuZ2V0RXh0ZXJuYWxWYWx1ZSgpO1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoc1Byb3BlcnR5LCBvTmV3VmFsdWUpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdF9zZXRBY3Rpb25FbmFibGVtZW50Rm9yVGFibGU6IGZ1bmN0aW9uIChcblx0XHRvU2VsZWN0ZWRDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkLFxuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0c0FjdGlvbjogc3RyaW5nLFxuXHRcdHNQcm9wZXJ0eTogc3RyaW5nLFxuXHRcdGFSZXF1ZXN0UHJvbWlzZXM6IFByb21pc2U8X1JlcXVlc3RlZFByb3BlcnR5PltdLFxuXHRcdGZvckNvbnRleHRNZW51ID0gZmFsc2Vcblx0KTogUHJvbWlzZTxfUmVxdWVzdGVkUHJvcGVydHk+W10ge1xuXHRcdC8vIFJldHJpZXZlIHByZXZpb3VzbHkgY2hlY2tlZCBjb250ZXh0cyBpbiBjYXNlIG9mICFmb3JDb250ZXh0TWVudVxuXHRcdGNvbnN0IHNFbmFibGVtZW50RmllbGROYW1lID0gZm9yQ29udGV4dE1lbnUgPyBcImJFbmFibGVkRm9yQ29udGV4dE1lbnVcIiA6IFwiYkVuYWJsZWRcIixcblx0XHRcdGFBcHBsaWNhYmxlOiBbQ29udGV4dCB8IHVuZGVmaW5lZF0gPSBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7c0FjdGlvbn0vYUFwcGxpY2FibGVgKSB8fCBbXSxcblx0XHRcdGFOb3RBcHBsaWNhYmxlOiBbQ29udGV4dCB8IHVuZGVmaW5lZF0gPSBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7c0FjdGlvbn0vYU5vdEFwcGxpY2FibGVgKSB8fCBbXTtcblx0XHRsZXQgYkFjdGlvbkVuYWJsZWQ6IGJvb2xlYW4gPSBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7c0FjdGlvbn0vJHtzRW5hYmxlbWVudEZpZWxkTmFtZX1gKSB8fCBmYWxzZTtcblxuXHRcdGlmICghZm9yQ29udGV4dE1lbnUpIHtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufWAsIHtcblx0XHRcdFx0YkVuYWJsZWQ6IGZhbHNlLFxuXHRcdFx0XHRhQXBwbGljYWJsZTogW10sXG5cdFx0XHRcdGFOb3RBcHBsaWNhYmxlOiBbXVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufWAsIHtcblx0XHRcdFx0Ly8gRG8gbm90IGNoYW5nZSBlbmFibGVkLCBhQXBwbGljYWJsZSBhbmQgYU5vdEFwcGxpY2FibGUgcHJvcGVydHkgaW4gY2FzZSBvZiBjb250ZXh0IG1lbnUgY2FsY3VsYXRpb25cblx0XHRcdFx0Ly8gaW4gY2FzZSBvZiBjb250ZXh0IG1lbnUsIG9ubHkgdGhlIGNsaWNrZWQgY29udGV4dCBnb2VzIGludG8gdGhlIHByb2Nlc3NpbmcgLSBvdGhlciBzZWxlY3RlZCBjb250ZXh0cyBtdXN0IGJlIGtlcHQgaW4gdGhlIG1vZGVsXG5cdFx0XHRcdGJFbmFibGVkOiBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoYGR5bmFtaWNBY3Rpb25zLyR7c0FjdGlvbn0vYkVuYWJsZWRgKSxcblx0XHRcdFx0YUFwcGxpY2FibGU6IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShgZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS9hQXBwbGljYWJsZWApLFxuXHRcdFx0XHRhTm90QXBwbGljYWJsZTogb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KGBkeW5hbWljQWN0aW9ucy8ke3NBY3Rpb259L2FOb3RBcHBsaWNhYmxlYCksXG5cdFx0XHRcdGJFbmFibGVkRm9yQ29udGV4dE1lbnU6IGZhbHNlLFxuXHRcdFx0XHRhQXBwbGljYWJsZUZvckNvbnRleHRNZW51OiBbXSxcblx0XHRcdFx0YU5vdEFwcGxpY2FibGVGb3JDb250ZXh0TWVudTogW11cblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBOb3RlIHRoYXQgbm9uIGR5bmFtaWMgYWN0aW9ucyBhcmUgbm90IHByb2Nlc3NlZCBoZXJlLiBUaGV5IGFyZSBlbmFibGVkIGJlY2F1c2Vcblx0XHQvLyBvbmUgb3IgbW9yZSBhcmUgc2VsZWN0ZWQgYW5kIHRoZSBzZWNvbmQgcGFydCBvZiB0aGUgY29uZGl0aW9uIGluIHRoZSB0ZW1wbGF0aW5nXG5cdFx0Ly8gaXMgdGhlbiB1bmRlZmluZWQgYW5kIHRodXMgdGhlIGJ1dHRvbiB0YWtlcyB0aGUgZGVmYXVsdCBlbmFibGluZywgd2hpY2ggaXMgdHJ1ZSFcblx0XHRjb25zdCBzRHluYW1pY0FjdGlvbkVuYWJsZWRQYXRoID0gYCR7b0ludGVybmFsTW9kZWxDb250ZXh0LmdldFBhdGgoKX0vZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufS8ke3NFbmFibGVtZW50RmllbGROYW1lfWA7XG5cblx0XHRpZiAodHlwZW9mIHNQcm9wZXJ0eSA9PT0gXCJvYmplY3RcIiAmJiBzUHJvcGVydHkgIT09IG51bGwgJiYgc1Byb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmIChvU2VsZWN0ZWRDb250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KCkgYXMgUmVjb3JkPHN0cmluZywgUHJpbWl0aXZlVHlwZT47XG5cdFx0XHRcdGNvbnN0IG9UcmFuc2Zvcm1lZEJpbmRpbmcgPSB0cmFuc2Zvcm1SZWN1cnNpdmVseShcblx0XHRcdFx0XHRzUHJvcGVydHksXG5cdFx0XHRcdFx0XCJQYXRoSW5Nb2RlbFwiLFxuXHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sb29wLWZ1bmNcblx0XHRcdFx0XHRmdW5jdGlvbiAob0JpbmRpbmdFeHByZXNzaW9uOiBQYXRoSW5Nb2RlbEV4cHJlc3Npb248UHJpbWl0aXZlVHlwZT4pIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQ29udGV4dERhdGEgPyBjb25zdGFudChvQ29udGV4dERhdGFbb0JpbmRpbmdFeHByZXNzaW9uLnBhdGhdKSA6IGNvbnN0YW50KGZhbHNlKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHRydWVcblx0XHRcdFx0KTtcblx0XHRcdFx0Y29uc3Qgc1Jlc3VsdCA9IGNvbXBpbGVFeHByZXNzaW9uKG9UcmFuc2Zvcm1lZEJpbmRpbmcpO1xuXHRcdFx0XHRiQWN0aW9uRW5hYmxlZCA9IGJBY3Rpb25FbmFibGVkIHx8IHNSZXN1bHQgPT09IFwidHJ1ZVwiO1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0TW9kZWwoKS5zZXRQcm9wZXJ0eShzRHluYW1pY0FjdGlvbkVuYWJsZWRQYXRoLCBiQWN0aW9uRW5hYmxlZCk7XG5cdFx0XHRcdChzUmVzdWx0ID09PSBcInRydWVcIiA/IGFBcHBsaWNhYmxlIDogYU5vdEFwcGxpY2FibGUpLnB1c2gob1NlbGVjdGVkQ29udGV4dCk7XG5cdFx0XHR9XG5cdFx0XHRDb21tb25VdGlscy5zZXREeW5hbWljQWN0aW9uQ29udGV4dHMob0ludGVybmFsTW9kZWxDb250ZXh0LCBzQWN0aW9uLCBhQXBwbGljYWJsZSwgYU5vdEFwcGxpY2FibGUsIGZvckNvbnRleHRNZW51KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb1NlbGVjdGVkQ29udGV4dD8uZ2V0T2JqZWN0KCkgYXMgUmVjb3JkPHN0cmluZywgUHJpbWl0aXZlVHlwZT47XG5cdFx0XHRpZiAoc1Byb3BlcnR5ID09PSBudWxsICYmICEhb0NvbnRleHREYXRhW2AjJHtzQWN0aW9ufWBdKSB7XG5cdFx0XHRcdC8vbG9vayBmb3IgYWN0aW9uIGFkdmVydGlzZW1lbnQgaWYgcHJlc2VudCBhbmQgaXRzIHZhbHVlIGlzIG5vdCBudWxsXG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRNb2RlbCgpLnNldFByb3BlcnR5KHNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGgsIHRydWUpO1xuXHRcdFx0fSBlbHNlIGlmIChvU2VsZWN0ZWRDb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Ly8gQ29sbGVjdCBwcm9taXNlcyB0byByZXRyaWV2ZSBzaW5nbGV0b24gb3Igbm9ybWFsIHByb3BlcnR5IHZhbHVlIGFzeW5jaHJvbm91c2x5XG5cdFx0XHRcdGFSZXF1ZXN0UHJvbWlzZXMucHVzaChDb21tb25VdGlscy5yZXF1ZXN0UHJvcGVydHkob1NlbGVjdGVkQ29udGV4dCwgc0FjdGlvbiwgc1Byb3BlcnR5LCBzRHluYW1pY0FjdGlvbkVuYWJsZWRQYXRoKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBhUmVxdWVzdFByb21pc2VzO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiBhY3Rpb24gaXMgY3JpdGljYWwuXG5cdCAqXG5cdCAqIEBwYXJhbSBtZXRhTW9kZWwgTWV0YU1vZGVsXG5cdCAqIEBwYXJhbSBwYXRoIFBhdGggdG8gdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gY29udGV4dHMgQ29udGV4dHMgaW4gY2FzZSBvZiBib3VuZCBhY3Rpb25zLlxuXHQgKiBAcmV0dXJucyBCb29sZWFuIGluZGljYXRpbmcgYWN0aW9uIGlzIGNyaXRpY2FsXG5cdCAqL1xuXHRnZXRJc0FjdGlvbkNyaXRpY2FsOiBhc3luYyBmdW5jdGlvbiAobWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCwgcGF0aDogc3RyaW5nLCBjb250ZXh0czogQ29udGV4dFtdID0gW10pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHQvLyBkZWZhdWx0IGlzIHRydWUuXG5cdFx0bGV0IGlzQWN0aW9uQ3JpdGljYWxWYWx1ZTogYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4gPSB0cnVlO1xuXHRcdGNvbnN0IGNvbnZlcnRlZFR5cGVzID0gY29udmVydFR5cGVzKG1ldGFNb2RlbCk7XG5cdFx0Y29uc3QgYWN0aW9uVGFyZ2V0UmVzb2x1dGlvbiA9IGNvbnZlcnRlZFR5cGVzLnJlc29sdmVQYXRoPEVkbUFjdGlvbj4ocGF0aCk7XG5cdFx0Y29uc3QgYWN0aW9uVGFyZ2V0ID0gYWN0aW9uVGFyZ2V0UmVzb2x1dGlvbi50YXJnZXQ7XG5cdFx0aWYgKCFhY3Rpb25UYXJnZXQpIHtcblx0XHRcdHJldHVybiBpc0FjdGlvbkNyaXRpY2FsVmFsdWU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaXNBY3Rpb25Dcml0aWNhbEJpbmRpbmdFeHAgPSBnZXRJc0FjdGlvbkNyaXRpY2FsRXhwcmVzc2lvbihhY3Rpb25UYXJnZXQsIGNvbnZlcnRlZFR5cGVzKTtcblxuXHRcdGlmIChpc0NvbnN0YW50KGlzQWN0aW9uQ3JpdGljYWxCaW5kaW5nRXhwKSkge1xuXHRcdFx0Ly8gQ29uc3RhbnQgZXhwcmVzc2lvbiByZXNvbHZlcyB0byBcInRydWVcIiBvciBcImZhbHNlXCIuIEJ1dCwgd2UgbmVlZCBib29sZWFuLlxuXHRcdFx0aXNBY3Rpb25Dcml0aWNhbFZhbHVlID0gY29tcGlsZUNvbnN0YW50KGlzQWN0aW9uQ3JpdGljYWxCaW5kaW5nRXhwLCBmYWxzZSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHR9IGVsc2UgaWYgKGNvbnRleHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdC8vIFdlIGV2YWx1YXRlIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiB2aWEgYSBVSTUgbWFuYWdlZCBvYmplY3QgaW5zdGFuY2UuXG5cdFx0XHRpc0FjdGlvbkNyaXRpY2FsVmFsdWUgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdC8vIENyZWF0aW5nIEJpbmRpbmcgdG8gcmVzb2x2ZVxuXHRcdFx0XHRcdGNvbnN0IGFueU9iamVjdCA9IG5ldyBBbnkoeyBhbnlCb29sZWFuOiBjb21waWxlRXhwcmVzc2lvbihpc0FjdGlvbkNyaXRpY2FsQmluZGluZ0V4cCkgfSk7XG5cdFx0XHRcdFx0YW55T2JqZWN0LnNldE1vZGVsKGNvbnRleHRzWzBdLmdldE1vZGVsKCkpO1xuXG5cdFx0XHRcdFx0Ly8gQXR0YWNoaW5nIGNoYW5nZSBldmVudHNcblx0XHRcdFx0XHRjb25zdCBib29sZWFuQmluZGluZyA9IGFueU9iamVjdC5nZXRCaW5kaW5nKFwiYW55Qm9vbGVhblwiKSBhcyBQcm9wZXJ0eUJpbmRpbmc7XG5cdFx0XHRcdFx0Y29uc3QgZm5DaGFuZ2UgPSBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0XHRjb25zdCB2YWx1ZUV4dCA9IGJvb2xlYW5CaW5kaW5nLmdldEV4dGVybmFsVmFsdWUoKTtcblx0XHRcdFx0XHRcdGFueU9iamVjdC5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKHZhbHVlRXh0KTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGJvb2xlYW5CaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImNoYW5nZVwiLCBmbkNoYW5nZSk7XG5cblx0XHRcdFx0XHQvLyBzZXR0aW5nIGJpbmRpbmcgY29udGV4dCB0byB0cmlnZ2VyIHRoZSBiaW5kaW5nIHJlc29sdXRpb25cblx0XHRcdFx0XHRhbnlPYmplY3Quc2V0QmluZGluZ0NvbnRleHQoY29udGV4dHNbMF0pO1xuXHRcdFx0XHR9IGNhdGNoIChlcnI6IHVua25vd24pIHtcblx0XHRcdFx0XHQvLyBlcnJvciB3aGlsZSBjcmVhdGluZyBvciByZXNvbHZpbmcgdGhlIGJpbmRpbmdcblx0XHRcdFx0XHRjb25zdCBtZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuXHRcdFx0XHRcdExvZy5lcnJvcihgRkUgOiBBY3Rpb25zIDogRXJyb3Igd2hpbGUgcmVzb2x2aW5nIElzQWN0aW9uQ3JpdGljYWwgZm9yICR7cGF0aH0gOiAke21lc3NhZ2V9YCk7XG5cdFx0XHRcdFx0Ly8gT24gdGhlIHNhZmUgc2lkZSwgd2Ugc2hhbGwgcmV0dXJuIGFjdGlvbiBpcyBjcml0aWNhbCBpZiB2YWx1ZSBjb3VsZG4ndCBiZSBkZXRlcm1pbmVkLlxuXHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiBpc0FjdGlvbkNyaXRpY2FsVmFsdWU7XG5cdH1cbn07XG5leHBvcnQgZGVmYXVsdCBBY3Rpb25SdW50aW1lO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0VBMkNBLE1BQU1BLGFBQWEsR0FBRztJQUNyQjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLDZCQUE2QixFQUFFLFVBQVVDLGlCQUFrRixFQUFRO01BQ2xJQyxTQUFTLENBQUNDLFdBQVcsQ0FDcEJGLGlCQUFpQixDQUFDRyxHQUFHLENBQUVDLGdCQUFnQixJQUFLO1FBQzNDLE1BQU1DLE9BQU8sR0FBR0QsZ0JBQWdCLENBQUNFLG1CQUFtQixDQUFDQyxLQUFLLENBQUNDLFVBQVUsQ0FDcEVKLGdCQUFnQixDQUFDRSxtQkFBbUIsQ0FBQ0csWUFBWSxHQUFHLE9BQU8sR0FBRyxPQUFPLENBQ3JFO1FBQ0QsT0FBTyxJQUFJQyxPQUFPLENBQUM7VUFDbEJDLE9BQU8sRUFBRVAsZ0JBQWdCLENBQUNPLE9BQU87VUFDakNDLElBQUksRUFBRUMsV0FBVyxDQUFDQyxLQUFLO1VBQ3ZCQyxTQUFTLEVBQUUsQ0FBQVYsT0FBTyxhQUFQQSxPQUFPLHVCQUFQQSxPQUFPLENBQUVXLFFBQVEsRUFBRSxL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
|