@sapui5/sap.fe.core 1.134.0 → 1.136.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 +6 -62
- package/src/sap/fe/core/ActionRuntime.ts +14 -65
- package/src/sap/fe/core/AppComponent.js +10 -2
- package/src/sap/fe/core/AppComponent.ts +6 -0
- package/src/sap/fe/core/AppStateHandler.js +9 -7
- package/src/sap/fe/core/AppStateHandler.ts +7 -5
- package/src/sap/fe/core/BaseController.js +1 -1
- package/src/sap/fe/core/CommonUtils.js +8 -4
- package/src/sap/fe/core/CommonUtils.ts +19 -4
- package/src/sap/fe/core/ExtensionAPI.js +7 -5
- package/src/sap/fe/core/ExtensionAPI.ts +5 -3
- package/src/sap/fe/core/IRowBindingInterface.js +1 -1
- package/src/sap/fe/core/InsightsFormattersExtension.js +1 -1
- package/src/sap/fe/core/PageController.js +36 -6
- package/src/sap/fe/core/PageController.ts +30 -0
- package/src/sap/fe/core/ResourceModel.js +1 -1
- package/src/sap/fe/core/ReuseComponent.js +1 -1
- package/src/sap/fe/core/TemplateComponent.js +1 -1
- package/src/sap/fe/core/TemplateModel.js +1 -1
- package/src/sap/fe/core/UIProvider.js +2 -2
- package/src/sap/fe/core/UIProvider.ts +3 -32
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +34 -16
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +39 -18
- package/src/sap/fe/core/buildingBlocks/IBuildingBlockOwnerComponent.js +1 -1
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/AttributeModel.js +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockFormatter.js +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +2 -2
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +1 -0
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +7 -7
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +9 -9
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +1 -1
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +5 -3
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +3 -1
- package/src/sap/fe/core/controllerextensions/BusyLocker.js +1 -1
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +15 -15
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +19 -19
- package/src/sap/fe/core/controllerextensions/ContextSharing.js +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.js +74 -93
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +89 -108
- package/src/sap/fe/core/controllerextensions/Feedback.js +1 -1
- package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +355 -0
- package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +387 -0
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +1 -1
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +1 -1
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +36 -11
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +36 -10
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +1 -1
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +36 -6
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +41 -1
- package/src/sap/fe/core/controllerextensions/PageReady.js +5 -2
- package/src/sap/fe/core/controllerextensions/PageReady.ts +3 -0
- package/src/sap/fe/core/controllerextensions/Paginator.js +1 -1
- package/src/sap/fe/core/controllerextensions/Placeholder.js +1 -1
- package/src/sap/fe/core/controllerextensions/Recommendations.js +1 -1
- package/src/sap/fe/core/controllerextensions/Routing.js +9 -9
- package/src/sap/fe/core/controllerextensions/Routing.ts +4 -4
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
- package/src/sap/fe/core/controllerextensions/Share.js +1 -1
- package/src/sap/fe/core/controllerextensions/SideEffects.js +13 -6
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +13 -6
- package/src/sap/fe/core/controllerextensions/Telemetry.js +1 -1
- package/src/sap/fe/core/controllerextensions/ViewState.js +1 -1
- package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.js +14 -11
- package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.ts +20 -14
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +4 -12
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +2 -10
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +12 -2
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +12 -0
- package/src/sap/fe/core/controllerextensions/dialog/ODataStrictDialog.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +111 -89
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +140 -105
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +137 -79
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +133 -120
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +3 -3
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +4 -1
- package/src/sap/fe/core/controllerextensions/editFlow/editFlowConstants.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +26 -17
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +32 -23
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +3 -3
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +103 -23
- package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +144 -53
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.js +29 -11
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.ts +39 -15
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +24 -22
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +28 -26
- package/src/sap/fe/core/controllerextensions/editFlow/operations/actionHelper.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +6 -572
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +25 -873
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +98 -56
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +102 -80
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +5 -3
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +7 -4
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +1 -1
- package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.js +1 -1
- package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.js +1 -1
- package/src/sap/fe/core/controllerextensions/routing/NavigationReason.js +1 -1
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +1 -1
- package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.js +1 -1
- package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributorMixin.js +1 -1
- package/src/sap/fe/core/controls/Any.js +1 -1
- package/src/sap/fe/core/controls/AnyElement.js +1 -1
- package/src/sap/fe/core/controls/CommandExecution.js +1 -1
- package/src/sap/fe/core/controls/ComponentLoader.js +1 -1
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +3 -3
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +8 -1
- package/src/sap/fe/core/controls/DataWatcher.js +4 -3
- package/src/sap/fe/core/controls/DataWatcher.tsx +4 -1
- package/src/sap/fe/core/controls/FormElementWrapper.js +1 -1
- package/src/sap/fe/core/controls/HideFormGroupAutomatically.js +10 -4
- package/src/sap/fe/core/controls/HideFormGroupAutomatically.ts +13 -2
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -1
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +1 -1
- package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.js +68 -0
- package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.tsx +52 -0
- package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.js +144 -0
- package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.tsx +128 -0
- package/src/sap/fe/core/controls/inlineEditFlow/DraftExistsDialog.js +53 -0
- package/src/sap/fe/core/controls/inlineEditFlow/DraftExistsDialog.tsx +39 -0
- package/src/sap/fe/core/converters/ConverterContext.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.js +3 -2
- package/src/sap/fe/core/converters/ManifestSettings.ts +42 -20
- package/src/sap/fe/core/converters/ManifestWrapper.js +8 -2
- package/src/sap/fe/core/converters/ManifestWrapper.ts +8 -0
- package/src/sap/fe/core/converters/MetaModelConverter.js +1 -1
- package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
- package/src/sap/fe/core/converters/annotations/DataField.js +2 -2
- package/src/sap/fe/core/converters/annotations/DataField.ts +2 -1
- package/src/sap/fe/core/converters/controls/Common/Action.js +55 -6
- package/src/sap/fe/core/converters/controls/Common/Action.ts +59 -3
- package/src/sap/fe/core/converters/controls/Common/Chart.js +45 -6
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +60 -9
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/Form.js +21 -5
- package/src/sap/fe/core/converters/controls/Common/Form.ts +25 -5
- package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/Table.js +89 -1686
- package/src/sap/fe/core/converters/controls/Common/Table.ts +254 -2513
- package/src/sap/fe/core/converters/controls/Common/table/Columns.js +1701 -0
- package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +2377 -0
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +64 -15
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +76 -14
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +7 -36
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +8 -46
- package/src/sap/fe/core/converters/controls/ListReport/FilterField.js +106 -0
- package/src/sap/fe/core/converters/controls/ListReport/FilterField.ts +129 -0
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +10 -5
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +8 -3
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +5 -3
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +11 -4
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +7 -2
- package/src/sap/fe/core/converters/helpers/Aggregation.js +1 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +1 -1
- 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 +1 -1
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +30 -8
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +40 -16
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +5 -3
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +5 -1
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +1 -1
- package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +184 -0
- package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +240 -0
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +1 -1
- package/src/sap/fe/core/designtime/messagebundle.properties +11 -0
- package/src/sap/fe/core/designtime/messagebundle_ar.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_bg.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_ca.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_cnr.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_cs.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_cy.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_da.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_de.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_el.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_en.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_en_GB.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_es.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_es_MX.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_et.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_fi.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_fr.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_fr_CA.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_hi.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_hr.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_hu.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_id.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_it.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_iw.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_ja.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_kk.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_ko.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_lt.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_lv.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_mk.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_ms.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_nl.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_no.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_pl.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_pt.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_pt_PT.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_ro.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_ru.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_sh.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_sk.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_sl.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_sr.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_sv.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_th.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_tr.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_uk.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_vi.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_zh_CN.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_zh_TW.properties +7 -0
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +1 -1
- package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
- package/src/sap/fe/core/formatters/FiscalFormat.js +1 -1
- package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
- package/src/sap/fe/core/formatters/StandardFormatter.js +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter.js +27 -12
- package/src/sap/fe/core/formatters/ValueFormatter.ts +25 -11
- package/src/sap/fe/core/fpm/Component.js +1 -1
- 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/AppStartupHelper.js +25 -4
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +28 -2
- package/src/sap/fe/core/helpers/BindingHelper.js +4 -3
- package/src/sap/fe/core/helpers/BindingHelper.ts +2 -1
- package/src/sap/fe/core/helpers/BindingToolkitEvaluator.js +1 -1
- package/src/sap/fe/core/helpers/DeleteHelper.js +6 -12
- package/src/sap/fe/core/helpers/DeleteHelper.ts +4 -9
- 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 +9 -3
- package/src/sap/fe/core/helpers/FPMHelper.ts +13 -1
- package/src/sap/fe/core/helpers/HTTP503Handler.js +1 -1
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +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 +1 -1
- package/src/sap/fe/core/helpers/MessageStrip.js +1 -1
- package/src/sap/fe/core/helpers/MetaModelFunction.js +1 -1
- package/src/sap/fe/core/helpers/MetaPath.js +1 -1
- package/src/sap/fe/core/helpers/ModelHelper.js +15 -5
- package/src/sap/fe/core/helpers/ModelHelper.ts +15 -4
- package/src/sap/fe/core/helpers/PasteHelper.js +39 -40
- package/src/sap/fe/core/helpers/PasteHelper.ts +49 -51
- package/src/sap/fe/core/helpers/PromiseKeeper.js +1 -1
- package/src/sap/fe/core/helpers/RecommendationHelper.js +1 -1
- package/src/sap/fe/core/helpers/ResourceModelHelper.js +1 -1
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
- package/src/sap/fe/core/helpers/SizeHelper.js +1 -1
- package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
- package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +1 -1
- package/src/sap/fe/core/helpers/Synchronization.js +1 -1
- package/src/sap/fe/core/helpers/TitleHelper.js +1 -1
- package/src/sap/fe/core/helpers/ToES6Promise.js +1 -1
- package/src/sap/fe/core/helpers/TypeGuards.js +1 -1
- package/src/sap/fe/core/helpers/WebSocket.js +11 -2
- package/src/sap/fe/core/helpers/WebSocket.ts +8 -0
- package/src/sap/fe/core/library.js +16 -4
- package/src/sap/fe/core/library.support.js +1 -1
- package/src/sap/fe/core/library.ts +1 -0
- package/src/sap/fe/core/manifestMerger/AddNewPage.js +1 -1
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
- package/src/sap/fe/core/messagebundle.properties +41 -2
- package/src/sap/fe/core/messagebundle_ar.properties +25 -4
- package/src/sap/fe/core/messagebundle_bg.properties +25 -4
- package/src/sap/fe/core/messagebundle_ca.properties +24 -3
- package/src/sap/fe/core/messagebundle_cnr.properties +25 -4
- package/src/sap/fe/core/messagebundle_cs.properties +23 -2
- package/src/sap/fe/core/messagebundle_cy.properties +24 -3
- package/src/sap/fe/core/messagebundle_da.properties +25 -4
- package/src/sap/fe/core/messagebundle_de.properties +28 -7
- package/src/sap/fe/core/messagebundle_el.properties +23 -2
- package/src/sap/fe/core/messagebundle_en.properties +25 -4
- package/src/sap/fe/core/messagebundle_en_GB.properties +25 -4
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +26 -5
- package/src/sap/fe/core/messagebundle_es.properties +23 -2
- package/src/sap/fe/core/messagebundle_es_MX.properties +23 -2
- package/src/sap/fe/core/messagebundle_et.properties +23 -2
- package/src/sap/fe/core/messagebundle_fi.properties +23 -2
- package/src/sap/fe/core/messagebundle_fr.properties +26 -5
- package/src/sap/fe/core/messagebundle_fr_CA.properties +23 -2
- package/src/sap/fe/core/messagebundle_hi.properties +24 -3
- package/src/sap/fe/core/messagebundle_hr.properties +27 -6
- package/src/sap/fe/core/messagebundle_hu.properties +23 -2
- package/src/sap/fe/core/messagebundle_id.properties +23 -2
- package/src/sap/fe/core/messagebundle_it.properties +25 -4
- package/src/sap/fe/core/messagebundle_iw.properties +24 -3
- package/src/sap/fe/core/messagebundle_ja.properties +24 -3
- package/src/sap/fe/core/messagebundle_kk.properties +23 -2
- package/src/sap/fe/core/messagebundle_ko.properties +25 -4
- package/src/sap/fe/core/messagebundle_lt.properties +23 -2
- package/src/sap/fe/core/messagebundle_lv.properties +25 -4
- package/src/sap/fe/core/messagebundle_mk.properties +23 -2
- package/src/sap/fe/core/messagebundle_ms.properties +24 -3
- package/src/sap/fe/core/messagebundle_nl.properties +23 -2
- package/src/sap/fe/core/messagebundle_no.properties +23 -2
- package/src/sap/fe/core/messagebundle_pl.properties +25 -4
- package/src/sap/fe/core/messagebundle_pt.properties +25 -4
- package/src/sap/fe/core/messagebundle_pt_PT.properties +24 -3
- package/src/sap/fe/core/messagebundle_ro.properties +25 -4
- package/src/sap/fe/core/messagebundle_ru.properties +24 -3
- package/src/sap/fe/core/messagebundle_sh.properties +25 -4
- package/src/sap/fe/core/messagebundle_sk.properties +24 -3
- package/src/sap/fe/core/messagebundle_sl.properties +28 -7
- package/src/sap/fe/core/messagebundle_sr.properties +25 -4
- package/src/sap/fe/core/messagebundle_sv.properties +23 -2
- package/src/sap/fe/core/messagebundle_th.properties +25 -4
- package/src/sap/fe/core/messagebundle_tr.properties +23 -2
- package/src/sap/fe/core/messagebundle_uk.properties +25 -4
- package/src/sap/fe/core/messagebundle_vi.properties +25 -4
- package/src/sap/fe/core/messagebundle_zh_CN.properties +26 -5
- package/src/sap/fe/core/messagebundle_zh_TW.properties +24 -3
- package/src/sap/fe/core/rootView/Fcl.controller.js +11 -7
- package/src/sap/fe/core/rootView/Fcl.controller.ts +16 -7
- package/src/sap/fe/core/rootView/NavContainer.controller.js +3 -3
- package/src/sap/fe/core/rootView/NavContainer.controller.ts +1 -1
- package/src/sap/fe/core/rootView/RootViewBaseController.js +87 -35
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +113 -57
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +1 -1
- package/src/sap/fe/core/services/CollaborationManagerServiceFactory.js +29 -13
- package/src/sap/fe/core/services/CollaborationManagerServiceFactory.ts +27 -13
- package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.js +1 -1
- package/src/sap/fe/core/services/ContextSharingServiceFactory.js +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +8 -2
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +6 -0
- package/src/sap/fe/core/services/InlineEditServiceFactory.js +11 -5
- package/src/sap/fe/core/services/InlineEditServiceFactory.ts +9 -3
- package/src/sap/fe/core/services/NavigationServiceFactory.js +1 -1
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
- package/src/sap/fe/core/services/RoutingServiceFactory.js +14 -7
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +11 -5
- package/src/sap/fe/core/services/ShellServicesFactory.js +5 -4
- package/src/sap/fe/core/services/ShellServicesFactory.ts +5 -3
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +28 -4
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +32 -3
- package/src/sap/fe/core/services/TelemetryServiceFactory.js +1 -1
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +1 -1
- package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +1 -1
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +1 -1
- package/src/sap/fe/core/services/valueHelpService/HistoryOptOutProvider.js +1 -1
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
- package/src/sap/fe/core/services/view/TemplatingErrorPage.view.xml +1 -1
- package/src/sap/fe/core/support/AnnotationIssue.support.js +1 -1
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +1 -1
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +1 -1
- package/src/sap/fe/core/support/CommonHelper.js +1 -1
- package/src/sap/fe/core/support/Diagnostics.js +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 +1 -1
- package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -1
- package/src/sap/fe/core/templating/DataModelPathHelper.js +1 -1
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
- package/src/sap/fe/core/templating/EntitySetHelper.js +199 -59
- package/src/sap/fe/core/templating/EntitySetHelper.ts +221 -61
- 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/FilterTemplating.js +1 -1
- 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 +8 -10
- package/src/sap/fe/core/templating/SemanticObjectHelper.ts +11 -10
- package/src/sap/fe/core/templating/UIFormatters.js +5 -2
- package/src/sap/fe/core/templating/UIFormatters.ts +3 -0
- package/src/sap/fe/core/type/Date.js +1 -1
- 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 +1 -1
- package/src/sap/fe/core/type/FiscalDate.js +1 -1
- package/src/sap/fe/core/type/InputMask.js +1 -1
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.js +0 -288
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.tsx +0 -208
- package/src/sap/fe/core/controllerextensions/editFlow/ODataOperation.js +0 -404
- package/src/sap/fe/core/controllerextensions/editFlow/ODataOperation.ts +0 -502
- package/src/sap/fe/core/designtime/TextArrangementChangeAction.js +0 -100
- package/src/sap/fe/core/designtime/TextArrangementChangeAction.ts +0 -134
- package/src/sap/fe/core/operationsHelper.js +0 -192
- package/src/sap/fe/core/operationsHelper.ts +0 -277
|
@@ -1,502 +0,0 @@
|
|
|
1
|
-
import type { ActionImport, ActionParameter, Action as EdmAction } from "@sap-ux/vocabularies-types";
|
|
2
|
-
import Log from "sap/base/Log";
|
|
3
|
-
import type { ShowActionDialogParameters } from "sap/fe/core/controllerextensions/editFlow/operations/facade";
|
|
4
|
-
import FELibrary from "sap/fe/core/library";
|
|
5
|
-
import Messaging from "sap/ui/core/Messaging";
|
|
6
|
-
import type Message from "sap/ui/core/message/Message";
|
|
7
|
-
import MessageType from "sap/ui/core/message/MessageType";
|
|
8
|
-
import type View from "sap/ui/core/mvc/View";
|
|
9
|
-
import type { default as ODataV4Context } from "sap/ui/model/odata/v4/Context";
|
|
10
|
-
import type ODataContextBinding from "sap/ui/model/odata/v4/ODataContextBinding";
|
|
11
|
-
import SubmitMode from "sap/ui/model/odata/v4/SubmitMode";
|
|
12
|
-
import ActionRuntime from "../../ActionRuntime";
|
|
13
|
-
import operationsHelper, { type StrictHandlingUtilities } from "../../operationsHelper";
|
|
14
|
-
import type { ActionSideEffectsType } from "../../services/SideEffectsServiceFactory";
|
|
15
|
-
import type MessageHandler from "../MessageHandler";
|
|
16
|
-
import messageHandling from "../messageHandler/messageHandling";
|
|
17
|
-
|
|
18
|
-
const Constants = FELibrary.Constants;
|
|
19
|
-
|
|
20
|
-
export type OperationResult = {
|
|
21
|
-
returnedContext?: ODataV4Context;
|
|
22
|
-
boundContext: ODataV4Context;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
export default class ODataOperation {
|
|
26
|
-
private readonly enableStrictHandling: boolean = true;
|
|
27
|
-
|
|
28
|
-
private readonly firstIterationOperations: Promise<unknown>[] = [];
|
|
29
|
-
|
|
30
|
-
private operationParameters: ActionParameter[] = [];
|
|
31
|
-
|
|
32
|
-
private neverSubmitted = true;
|
|
33
|
-
|
|
34
|
-
private readonly apiGroupIdsToSubmit: Set<string> = new Set();
|
|
35
|
-
|
|
36
|
-
constructor(
|
|
37
|
-
private readonly operation: EdmAction | ActionImport,
|
|
38
|
-
private readonly parameters: ShowActionDialogParameters,
|
|
39
|
-
private readonly messageHandler: MessageHandler,
|
|
40
|
-
private readonly strictHandlingUtilities: StrictHandlingUtilities | undefined,
|
|
41
|
-
private readonly operationProperties: {
|
|
42
|
-
deferredSubmit?: boolean;
|
|
43
|
-
ignoreETag?: boolean;
|
|
44
|
-
replaceWithRVC?: boolean;
|
|
45
|
-
} = {}
|
|
46
|
-
) {
|
|
47
|
-
this.enableStrictHandling = this.parameters.disableStrictHandling !== true && !(this.operation as EdmAction).isFunction;
|
|
48
|
-
this.defineOperationParameters();
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Defines the parameters of the operation.
|
|
53
|
-
*/
|
|
54
|
-
private defineOperationParameters(): void {
|
|
55
|
-
if (this.operation._type === "ActionImport") {
|
|
56
|
-
this.operationParameters = this.operation.action.parameters;
|
|
57
|
-
} else {
|
|
58
|
-
//Remove the binding parameters from the parameters list
|
|
59
|
-
this.operationParameters = this.operation.isBound ? this.operation.parameters.slice(1) : this.operation.parameters;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Executes the operation.
|
|
65
|
-
* @returns The promise of the operation
|
|
66
|
-
*/
|
|
67
|
-
async execute(): Promise<PromiseSettledResult<OperationResult>[]> {
|
|
68
|
-
let result: PromiseSettledResult<OperationResult>[];
|
|
69
|
-
try {
|
|
70
|
-
if (this.parameters.aContexts.length) {
|
|
71
|
-
result = await (this.parameters.bGrouped === true ? this.executeChangeset() : this.executeSequentially());
|
|
72
|
-
} else {
|
|
73
|
-
result = await Promise.allSettled([this.executeImport()]);
|
|
74
|
-
}
|
|
75
|
-
} catch (error) {
|
|
76
|
-
Log.error("Error while executing operation " + this.parameters.actionName, error as string);
|
|
77
|
-
throw error;
|
|
78
|
-
} finally {
|
|
79
|
-
this.parameters.fnOnResponse?.();
|
|
80
|
-
}
|
|
81
|
-
return result;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Executes the import operation.
|
|
86
|
-
* @returns The promise of the operation
|
|
87
|
-
*/
|
|
88
|
-
private async executeImport(): Promise<OperationResult> {
|
|
89
|
-
let sideEffectsContextBinding: ODataContextBinding | undefined;
|
|
90
|
-
const operationContext = this.parameters.model.bindContext(`/${this.parameters.actionName}(...)`);
|
|
91
|
-
this.setParametersValue(operationContext);
|
|
92
|
-
const groupId = this.parameters.groupId ?? "actionImport";
|
|
93
|
-
const promises = [this.invoke(operationContext, groupId, null)];
|
|
94
|
-
|
|
95
|
-
if (this.parameters.additionalSideEffect) {
|
|
96
|
-
// We always need a context to trigger side-effects, so we create a context binding with a dummy path and destroy it afterwards
|
|
97
|
-
sideEffectsContextBinding = this.parameters.model.bindContext("/unBoundAction");
|
|
98
|
-
const sideEffect = {
|
|
99
|
-
context: sideEffectsContextBinding.getBoundContext(),
|
|
100
|
-
pathExpressions: this.parameters.additionalSideEffect.pathExpressions,
|
|
101
|
-
triggerActions: this.parameters.additionalSideEffect.triggerActions
|
|
102
|
-
};
|
|
103
|
-
this.requestSideEffects(sideEffect, groupId, promises);
|
|
104
|
-
}
|
|
105
|
-
this.defaultSubmit(groupId);
|
|
106
|
-
|
|
107
|
-
const currentPromiseValues = await Promise.all(promises);
|
|
108
|
-
sideEffectsContextBinding?.destroy();
|
|
109
|
-
return currentPromiseValues[0];
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Executes the operations on one changeset.
|
|
114
|
-
* @returns The promise of the operations
|
|
115
|
-
*/
|
|
116
|
-
private async executeChangeset(): Promise<PromiseSettledResult<OperationResult>[]> {
|
|
117
|
-
const operationPromises = this.parameters.aContexts.map(async (context) =>
|
|
118
|
-
this.executeBoundOperation(context, this.parameters.groupId)
|
|
119
|
-
);
|
|
120
|
-
await Promise.allSettled(this.firstIterationOperations);
|
|
121
|
-
await this.manageStrictHandlingFails();
|
|
122
|
-
return Promise.allSettled(operationPromises);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* Executes the operations sequentially.
|
|
127
|
-
* @returns The promise of the operations
|
|
128
|
-
*/
|
|
129
|
-
private async executeSequentially(): Promise<PromiseSettledResult<OperationResult>[]> {
|
|
130
|
-
const operationPromises: Promise<OperationResult>[] = [];
|
|
131
|
-
|
|
132
|
-
// serialization: executeBoundOperation to be called for each entry only after the promise returned from the one before has been resolved
|
|
133
|
-
await this.parameters.aContexts.reduce(async (promise: Promise<void>, context: ODataV4Context, id: number): Promise<void> => {
|
|
134
|
-
await promise;
|
|
135
|
-
operationPromises.push(this.executeBoundOperation(context, this.parameters.groupId ?? `apiMode${id + 1}`));
|
|
136
|
-
await Promise.allSettled(this.firstIterationOperations);
|
|
137
|
-
}, Promise.resolve());
|
|
138
|
-
await this.manageStrictHandlingFails(true);
|
|
139
|
-
return Promise.allSettled(operationPromises);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Executes the bound operation.
|
|
144
|
-
* @param targetContext The target context
|
|
145
|
-
* @param groupId The groupId of the batch
|
|
146
|
-
* @returns The promise of the operation
|
|
147
|
-
*/
|
|
148
|
-
private async executeBoundOperation(targetContext: ODataV4Context, groupId?: string): Promise<OperationResult> {
|
|
149
|
-
const operationContext = this.parameters.model.bindContext(
|
|
150
|
-
`${this.parameters.actionName}(...)`,
|
|
151
|
-
targetContext,
|
|
152
|
-
this.parameters.mBindingParameters
|
|
153
|
-
);
|
|
154
|
-
|
|
155
|
-
const promises: Promise<unknown>[] = [];
|
|
156
|
-
this.setParametersValue(operationContext);
|
|
157
|
-
const finalGroupId = groupId ?? operationContext.getUpdateGroupId();
|
|
158
|
-
const sideEffects = {
|
|
159
|
-
context: targetContext,
|
|
160
|
-
pathExpressions: this.parameters.additionalSideEffect?.pathExpressions,
|
|
161
|
-
triggerActions: this.parameters.additionalSideEffect?.triggerActions
|
|
162
|
-
};
|
|
163
|
-
//Has to be removed when the refactoring is done
|
|
164
|
-
this.parameters.requestSideEffects = this.requestSideEffects.bind(this, sideEffects, finalGroupId, promises);
|
|
165
|
-
const operationPromise = this.invoke(
|
|
166
|
-
operationContext,
|
|
167
|
-
finalGroupId,
|
|
168
|
-
this.parameters.aContexts.findIndex((context) => context === targetContext) + 1
|
|
169
|
-
);
|
|
170
|
-
|
|
171
|
-
promises.push(operationPromise);
|
|
172
|
-
|
|
173
|
-
this.requestSideEffects(sideEffects, finalGroupId, promises);
|
|
174
|
-
this.defaultSubmit(finalGroupId);
|
|
175
|
-
Promise.allSettled(promises);
|
|
176
|
-
return operationPromise;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* Enhances the side effects of the operation
|
|
181
|
-
*
|
|
182
|
-
* When a new entity is created using a DataFieldForAction, a new
|
|
183
|
-
* oDataContextBinding is created to execute the action. By default, this
|
|
184
|
-
* oDataContextBinding is relative to the OdataListBinding of the table.
|
|
185
|
-
*
|
|
186
|
-
* Because of this dependency, when a SideEffects is executed on the
|
|
187
|
-
* context into the OdataListBinding where the oDataContextBinding was bound, this SideEffects is also triggered on this
|
|
188
|
-
* oDataContextBinding. We don't manage the lifecycle of the
|
|
189
|
-
* oDataContextBinding. It means even if the draft related to the action
|
|
190
|
-
* is removed, the odataContextBinding is still there, so if a SideEffects
|
|
191
|
-
* is executed on the source target into oDataContextBinding, an error from the back end will be
|
|
192
|
-
* received because we ask to refresh a property on an unknown entity.
|
|
193
|
-
*
|
|
194
|
-
* The SideEffects are requested only if the page is still open.
|
|
195
|
-
* This avoids generating issues with ghost oDataContextBinding linked to destroyed context.
|
|
196
|
-
* @param operationContextBinding The operation
|
|
197
|
-
* @param returnedContext The returned context of this operation
|
|
198
|
-
*/
|
|
199
|
-
private enhanceSideEffects(operationContextBinding: ODataContextBinding, returnedContext: ODataV4Context | undefined): void {
|
|
200
|
-
if (returnedContext) {
|
|
201
|
-
const appComponent = this.parameters.appComponent;
|
|
202
|
-
const origin = operationContextBinding.requestSideEffects.bind(operationContextBinding);
|
|
203
|
-
operationContextBinding.requestSideEffects = async (...args: unknown[]): Promise<void> => {
|
|
204
|
-
if (
|
|
205
|
-
appComponent
|
|
206
|
-
.getRootViewController()
|
|
207
|
-
.getInstancedViews()
|
|
208
|
-
.find((pageView: View) => pageView.getBindingContext() === returnedContext)
|
|
209
|
-
) {
|
|
210
|
-
return origin(...args);
|
|
211
|
-
}
|
|
212
|
-
return Promise.resolve();
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
/**
|
|
218
|
-
* Invokes the operation on the context.
|
|
219
|
-
* @param operationContextBinding The operation context binding
|
|
220
|
-
* @param groupId The groupId of the batch
|
|
221
|
-
* @param contextIndex The index of the context
|
|
222
|
-
* @returns The promise of the operation
|
|
223
|
-
*/
|
|
224
|
-
private async invoke(
|
|
225
|
-
operationContextBinding: ODataContextBinding,
|
|
226
|
-
groupId: string,
|
|
227
|
-
contextIndex: number | null
|
|
228
|
-
): Promise<OperationResult> {
|
|
229
|
-
let returnedContext;
|
|
230
|
-
let firstIterationResolve!: Function;
|
|
231
|
-
let firstIterationReject!: Function;
|
|
232
|
-
const strictHandlingPromise = new Promise<unknown>(function (resolve, reject) {
|
|
233
|
-
firstIterationResolve = resolve;
|
|
234
|
-
firstIterationReject = reject;
|
|
235
|
-
});
|
|
236
|
-
this.firstIterationOperations.push(strictHandlingPromise);
|
|
237
|
-
if (groupId && this.isAPIMode(groupId)) {
|
|
238
|
-
this.apiGroupIdsToSubmit.add(groupId);
|
|
239
|
-
}
|
|
240
|
-
try {
|
|
241
|
-
const contextLength = this.parameters.aContexts.length ? this.parameters.aContexts.length : null;
|
|
242
|
-
const operationInvoke = operationContextBinding.invoke(
|
|
243
|
-
groupId,
|
|
244
|
-
this.operationProperties.ignoreETag,
|
|
245
|
-
this.enableStrictHandling
|
|
246
|
-
? operationsHelper.fnOnStrictHandlingFailed.bind(
|
|
247
|
-
this,
|
|
248
|
-
groupId,
|
|
249
|
-
this.parameters,
|
|
250
|
-
contextIndex,
|
|
251
|
-
operationContextBinding.getContext(),
|
|
252
|
-
contextLength,
|
|
253
|
-
this.messageHandler,
|
|
254
|
-
this.strictHandlingUtilities,
|
|
255
|
-
firstIterationResolve
|
|
256
|
-
)
|
|
257
|
-
: undefined,
|
|
258
|
-
this.operationProperties.replaceWithRVC
|
|
259
|
-
);
|
|
260
|
-
await Promise.race([operationInvoke, strictHandlingPromise]);
|
|
261
|
-
|
|
262
|
-
returnedContext = await operationInvoke;
|
|
263
|
-
this.enhanceSideEffects(operationContextBinding, returnedContext);
|
|
264
|
-
firstIterationResolve();
|
|
265
|
-
if (!this.parameters.bGrouped) {
|
|
266
|
-
//Has to be removed when the refactoring is done
|
|
267
|
-
this.update412TransitionMessages(operationContextBinding, groupId, true);
|
|
268
|
-
}
|
|
269
|
-
} catch (error) {
|
|
270
|
-
if (!this.parameters.bGrouped) {
|
|
271
|
-
this.update412TransitionMessages(operationContextBinding, groupId);
|
|
272
|
-
}
|
|
273
|
-
firstIterationReject(error);
|
|
274
|
-
throw Constants.ActionExecutionFailed;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
return {
|
|
278
|
-
returnedContext,
|
|
279
|
-
boundContext: operationContextBinding.getBoundContext()
|
|
280
|
-
};
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
/**
|
|
284
|
-
* Submits the batch related to the groupId of the operation.
|
|
285
|
-
*/
|
|
286
|
-
public submit(): void {
|
|
287
|
-
if (!this.neverSubmitted || this.apiGroupIdsToSubmit.size === 0) {
|
|
288
|
-
return;
|
|
289
|
-
}
|
|
290
|
-
for (const groupId of Array.from(this.apiGroupIdsToSubmit.values())) {
|
|
291
|
-
this.submitOnModel(groupId);
|
|
292
|
-
}
|
|
293
|
-
this.parameters.fnOnSubmitted?.();
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
/**
|
|
297
|
-
* Submits the batch at the model level related to the groupId of the operation.
|
|
298
|
-
* @param groupId The groupId of the batch
|
|
299
|
-
*/
|
|
300
|
-
private submitOnModel(groupId: string): void {
|
|
301
|
-
this.parameters.model.submitBatch(groupId);
|
|
302
|
-
this.apiGroupIdsToSubmit.delete(groupId);
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
/**
|
|
306
|
-
* Is the SubmitMode of the groupId set to API.
|
|
307
|
-
* @param groupId The groupId of the batch
|
|
308
|
-
* @returns True if the SubmitMode is set to API, false otherwise
|
|
309
|
-
*/
|
|
310
|
-
private isAPIMode(groupId?: string): boolean {
|
|
311
|
-
if (!groupId) {
|
|
312
|
-
return false;
|
|
313
|
-
}
|
|
314
|
-
if (groupId.startsWith("$auto") || groupId.startsWith("$direct") || groupId.startsWith("$single")) {
|
|
315
|
-
return false;
|
|
316
|
-
}
|
|
317
|
-
const submitMode = (
|
|
318
|
-
this.parameters.appComponent.getManifestEntry("sap.ui5")?.models[""]?.settings as
|
|
319
|
-
| { groupProperties?: Record<string, { submit: SubmitMode }> }
|
|
320
|
-
| undefined
|
|
321
|
-
)?.groupProperties?.[groupId]?.submit;
|
|
322
|
-
|
|
323
|
-
if (submitMode === undefined || [SubmitMode.Auto, SubmitMode.Direct].includes(submitMode)) {
|
|
324
|
-
return true;
|
|
325
|
-
}
|
|
326
|
-
return true;
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
/**
|
|
330
|
-
* Executes the submit of the operation if the submitMode is on API and deferredSubmit is not set to true
|
|
331
|
-
* The submitBatch is skipped if the groupId is $auto or $direct since done by the model.
|
|
332
|
-
* @param groupId The groupId of the batch
|
|
333
|
-
*/
|
|
334
|
-
private defaultSubmit(groupId?: string): void {
|
|
335
|
-
const firstSubmit = this.neverSubmitted;
|
|
336
|
-
const isAPIMode = this.isAPIMode(groupId);
|
|
337
|
-
if (!isAPIMode) {
|
|
338
|
-
// The submitBatch is skipped if the groupId is $auto or $direct since done by the model
|
|
339
|
-
this.neverSubmitted = false;
|
|
340
|
-
} else if (this.operationProperties.deferredSubmit !== true && groupId) {
|
|
341
|
-
this.neverSubmitted = false;
|
|
342
|
-
this.submitOnModel(groupId);
|
|
343
|
-
}
|
|
344
|
-
if (firstSubmit && !this.neverSubmitted) {
|
|
345
|
-
//Trigger the callback only once
|
|
346
|
-
this.parameters.fnOnSubmitted?.();
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
/**
|
|
351
|
-
* Manages the strict handling fails.
|
|
352
|
-
* @param displayErrorOrWarning True, if the warning/error messages have to be displayed, false otherwise (default)
|
|
353
|
-
* @returns The promise of the strict handling
|
|
354
|
-
*/
|
|
355
|
-
private async manageStrictHandlingFails(displayErrorOrWarning = false): Promise<void> {
|
|
356
|
-
if (this.strictHandlingUtilities && this.strictHandlingUtilities.strictHandlingPromises.length) {
|
|
357
|
-
try {
|
|
358
|
-
if (
|
|
359
|
-
(!messageHandling.hasTransitionErrorsOrWarnings() || displayErrorOrWarning) &&
|
|
360
|
-
this.strictHandlingUtilities.strictHandlingWarningMessages.length
|
|
361
|
-
) {
|
|
362
|
-
await operationsHelper.renderMessageView(
|
|
363
|
-
this.parameters,
|
|
364
|
-
this.messageHandler,
|
|
365
|
-
this.strictHandlingUtilities.strictHandlingWarningMessages,
|
|
366
|
-
this.strictHandlingUtilities,
|
|
367
|
-
this.parameters.aContexts.length > 1
|
|
368
|
-
);
|
|
369
|
-
} else {
|
|
370
|
-
for (const shPromise of this.strictHandlingUtilities.strictHandlingPromises) {
|
|
371
|
-
shPromise.resolve(false);
|
|
372
|
-
}
|
|
373
|
-
const messageModel = Messaging.getMessageModel();
|
|
374
|
-
const messagesInModel = messageModel.getData();
|
|
375
|
-
messageModel.setData(messagesInModel.concat(this.strictHandlingUtilities.strictHandlingWarningMessages));
|
|
376
|
-
}
|
|
377
|
-
} catch {
|
|
378
|
-
Log.error("Re-triggering of strict handling operations failed");
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
/**
|
|
384
|
-
* Updates the strictHandling utilities with the failed and successful transition messages.
|
|
385
|
-
* @param operation The operation context binding
|
|
386
|
-
* @param groupId GroupId of the batch
|
|
387
|
-
* @param onlySuccessMessages To update only successful transition messages
|
|
388
|
-
*/
|
|
389
|
-
private update412TransitionMessages(operation: ODataContextBinding, groupId: string, onlySuccessMessages = false): void {
|
|
390
|
-
//Has to be removed from here when the refactoring is done
|
|
391
|
-
if (this.enableStrictHandling && this.strictHandlingUtilities) {
|
|
392
|
-
const messages: Array<Message> = Messaging.getMessageModel().getData();
|
|
393
|
-
const { processedMessageIds, delaySuccessMessages, strictHandlingTransitionFails } = this.strictHandlingUtilities;
|
|
394
|
-
const unProcessedMessages = messages.reduce((acc: Message[], message) => {
|
|
395
|
-
if (!processedMessageIds.has(message.getId())) {
|
|
396
|
-
acc.push(message);
|
|
397
|
-
}
|
|
398
|
-
return acc;
|
|
399
|
-
}, []);
|
|
400
|
-
|
|
401
|
-
const newTransitionErrorMessagesId = unProcessedMessages
|
|
402
|
-
.filter(
|
|
403
|
-
(message) =>
|
|
404
|
-
message.getPersistent() === true &&
|
|
405
|
-
message.getType() !== MessageType.Success &&
|
|
406
|
-
!processedMessageIds.has(message.getId())
|
|
407
|
-
)
|
|
408
|
-
.map((message) => message.getId());
|
|
409
|
-
|
|
410
|
-
if (newTransitionErrorMessagesId.length) {
|
|
411
|
-
this.strictHandlingUtilities.processedMessageIds = new Set([
|
|
412
|
-
...Array.from(processedMessageIds),
|
|
413
|
-
...newTransitionErrorMessagesId
|
|
414
|
-
]);
|
|
415
|
-
delaySuccessMessages.push(
|
|
416
|
-
...Object.values(unProcessedMessages).filter((message) => message.getType() === MessageType.Success)
|
|
417
|
-
);
|
|
418
|
-
if (!onlySuccessMessages && this.parameters.internalModelContext) {
|
|
419
|
-
strictHandlingTransitionFails.push({
|
|
420
|
-
oAction: operation,
|
|
421
|
-
groupId
|
|
422
|
-
});
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
/**
|
|
429
|
-
* Sets the default values for the parameters of the operation.
|
|
430
|
-
* @param operationContextBinding The operation context binding
|
|
431
|
-
*/
|
|
432
|
-
private setParametersValue(operationContextBinding: ODataContextBinding): void {
|
|
433
|
-
if (this.operationParameters.length) {
|
|
434
|
-
const defaultValues = this.parameters.defaultParametersValues ?? {};
|
|
435
|
-
for (const parameter of this.operationParameters) {
|
|
436
|
-
const name = parameter.name;
|
|
437
|
-
if (!defaultValues[name]) {
|
|
438
|
-
switch (parameter.type) {
|
|
439
|
-
case "Edm.String":
|
|
440
|
-
defaultValues[name] = "";
|
|
441
|
-
break;
|
|
442
|
-
case "Edm.Boolean":
|
|
443
|
-
defaultValues[name] = false;
|
|
444
|
-
break;
|
|
445
|
-
case "Edm.Byte":
|
|
446
|
-
case "Edm.Int16":
|
|
447
|
-
case "Edm.Int32":
|
|
448
|
-
case "Edm.Int64":
|
|
449
|
-
defaultValues[name] = 0;
|
|
450
|
-
break;
|
|
451
|
-
default:
|
|
452
|
-
break;
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
operationContextBinding.setParameter(name, defaultValues[name]);
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
/**
|
|
461
|
-
* Requests the side effects for the action.
|
|
462
|
-
* @param sideEffect The side effect to be executed
|
|
463
|
-
* @param groupId The groupId of the batch
|
|
464
|
-
* @param localPromise The promise of the invoked action
|
|
465
|
-
* @returns The promise of the side effect
|
|
466
|
-
*/
|
|
467
|
-
private async requestSideEffects(
|
|
468
|
-
sideEffect: (ActionSideEffectsType & { context: ODataV4Context }) | undefined,
|
|
469
|
-
groupId: string,
|
|
470
|
-
localPromise?: Promise<unknown>[]
|
|
471
|
-
): Promise<void> {
|
|
472
|
-
const sideEffectsService = this.parameters.appComponent.getSideEffectsService();
|
|
473
|
-
let promises: Promise<unknown>[] = localPromise ?? [];
|
|
474
|
-
// trigger actions from side effects
|
|
475
|
-
if (sideEffect) {
|
|
476
|
-
promises = promises.concat(
|
|
477
|
-
(sideEffect.triggerActions ?? []).map(async (action) =>
|
|
478
|
-
sideEffectsService.executeAction(action, sideEffect.context, groupId)
|
|
479
|
-
),
|
|
480
|
-
sideEffect.pathExpressions
|
|
481
|
-
? sideEffectsService.requestSideEffects(sideEffect.pathExpressions, sideEffect.context, groupId)
|
|
482
|
-
: []
|
|
483
|
-
);
|
|
484
|
-
if (sideEffect.pathExpressions) {
|
|
485
|
-
try {
|
|
486
|
-
await Promise.all(promises);
|
|
487
|
-
if (this.parameters.operationAvailableMap && this.parameters.internalModelContext) {
|
|
488
|
-
ActionRuntime.setActionEnablement(
|
|
489
|
-
this.parameters.internalModelContext,
|
|
490
|
-
JSON.parse(this.parameters.operationAvailableMap),
|
|
491
|
-
this.parameters.selectedItems,
|
|
492
|
-
"table"
|
|
493
|
-
);
|
|
494
|
-
}
|
|
495
|
-
return;
|
|
496
|
-
} catch (error: unknown) {
|
|
497
|
-
Log.error("Error while requesting side effects", error as string);
|
|
498
|
-
}
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
}
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
-
* (c) Copyright 2009-2024 SAP SE. All rights reserved
|
|
4
|
-
*/
|
|
5
|
-
sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/MetaPath", "sap/ui/core/Component", "sap/fe/core/templating/PropertyHelper", "sap/ui/rta/plugin/annotations/AnnotationTypes"], function (Log, MetaModelConverter, MetaPath, Component, PropertyHelper, AnnotationTypes) {
|
|
6
|
-
"use strict";
|
|
7
|
-
|
|
8
|
-
var _exports = {};
|
|
9
|
-
var isUnit = PropertyHelper.isUnit;
|
|
10
|
-
var isCurrency = PropertyHelper.isCurrency;
|
|
11
|
-
var hasUnit = PropertyHelper.hasUnit;
|
|
12
|
-
var hasCurrency = PropertyHelper.hasCurrency;
|
|
13
|
-
var convertTypes = MetaModelConverter.convertTypes;
|
|
14
|
-
// OK since we are in designtime we can ignore that dependency
|
|
15
|
-
// eslint-disable-next-line @typescript-eslint/no-restricted-imports
|
|
16
|
-
const TEXT_ARRANGEMENT_LABELS = {
|
|
17
|
-
["UI.TextArrangementType/TextOnly"]: "Text Only",
|
|
18
|
-
["UI.TextArrangementType/TextFirst"]: "Text First",
|
|
19
|
-
["UI.TextArrangementType/TextLast"]: "Text Last",
|
|
20
|
-
["UI.TextArrangementType/TextSeparate"]: "ID Only"
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Collects all properties with a Text annotation from the given entity type and its navigation properties.
|
|
25
|
-
* @param entityType The entity type to start with
|
|
26
|
-
* @param properties The array to collect the properties in
|
|
27
|
-
* @param visitedEntity A map to keep track of visited entities
|
|
28
|
-
*/
|
|
29
|
-
function collectProperties(entityType, properties, visitedEntity) {
|
|
30
|
-
if (visitedEntity[entityType.fullyQualifiedName]) {
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
visitedEntity[entityType.fullyQualifiedName] = true;
|
|
34
|
-
properties.push(...entityType.entityProperties.filter(prop => {
|
|
35
|
-
return prop.annotations.Common?.Text !== undefined && !hasCurrency(prop) && !hasUnit(prop) && !isCurrency(prop) && !isUnit(prop);
|
|
36
|
-
}).map(prop => {
|
|
37
|
-
return {
|
|
38
|
-
property: prop,
|
|
39
|
-
entityType: entityType
|
|
40
|
-
};
|
|
41
|
-
}));
|
|
42
|
-
}
|
|
43
|
-
function getTextArrangementChangeAction() {
|
|
44
|
-
return {
|
|
45
|
-
changeType: "textArrangement_Test",
|
|
46
|
-
title: () => "Change Text Arrangement",
|
|
47
|
-
type: AnnotationTypes.ValueListType,
|
|
48
|
-
delegate: {
|
|
49
|
-
getAnnotationsChangeInfo: (oControl, _annotation) => {
|
|
50
|
-
const templateComponent = Component.getOwnerComponentFor(oControl);
|
|
51
|
-
if (templateComponent) {
|
|
52
|
-
const metaModel = templateComponent.getMetaModel();
|
|
53
|
-
const contextPathToUse = templateComponent.getFullContextPath();
|
|
54
|
-
// Find closest building block
|
|
55
|
-
let buildingBlock = oControl;
|
|
56
|
-
while (buildingBlock && !buildingBlock.isA("sap.fe.core.buildingBlocks.BuildingBlock")) {
|
|
57
|
-
buildingBlock = buildingBlock.getParent();
|
|
58
|
-
}
|
|
59
|
-
let metaPath = contextPathToUse;
|
|
60
|
-
if (buildingBlock) {
|
|
61
|
-
metaPath = buildingBlock.getProperty("metaPath") ?? contextPathToUse;
|
|
62
|
-
}
|
|
63
|
-
if (metaModel && contextPathToUse) {
|
|
64
|
-
let targetEntity;
|
|
65
|
-
try {
|
|
66
|
-
targetEntity = new MetaPath(convertTypes(metaModel), metaPath, contextPathToUse);
|
|
67
|
-
} catch (e) {
|
|
68
|
-
Log.warning(`No metamodel or metaPath is not reachable with ${metaPath} and ${contextPathToUse}`);
|
|
69
|
-
return null;
|
|
70
|
-
}
|
|
71
|
-
const properties = [];
|
|
72
|
-
const visitedEntity = {};
|
|
73
|
-
const defaultType = targetEntity.getClosestEntityType().annotations.UI?.TextArrangement?.toString() ?? "UI.TextArrangementType/TextFirst".toString();
|
|
74
|
-
collectProperties(targetEntity.getClosestEntityType(), properties, visitedEntity);
|
|
75
|
-
return {
|
|
76
|
-
serviceUrl: oControl.getModel()?.getServiceUrl(),
|
|
77
|
-
properties: properties.map(prop => {
|
|
78
|
-
return {
|
|
79
|
-
propertyName: prop.property.annotations.Common?.Label?.toString() ?? prop.property.name,
|
|
80
|
-
annotationPath: "/" + prop.entityType.fullyQualifiedName + "/" + prop.property.name + "@com.sap.vocabularies.Common.v1.Text@com.sap.vocabularies.UI.v1.TextArrangement",
|
|
81
|
-
currentValue: prop.property.annotations.Common?.Text?.annotations?.UI?.TextArrangement?.toString() ?? defaultType
|
|
82
|
-
};
|
|
83
|
-
}),
|
|
84
|
-
possibleValues: Object.keys(TEXT_ARRANGEMENT_LABELS).map(sKey => ({
|
|
85
|
-
key: sKey,
|
|
86
|
-
text: TEXT_ARRANGEMENT_LABELS[sKey]
|
|
87
|
-
})),
|
|
88
|
-
preSelectedProperty: "" // if the action is triggered from a control that corresponds to a property, only this one will be shown in the Dialog initially (search field populated with this string)
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
return null;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
_exports.getTextArrangementChangeAction = getTextArrangementChangeAction;
|
|
98
|
-
return _exports;
|
|
99
|
-
}, false);
|
|
100
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJURVhUX0FSUkFOR0VNRU5UX0xBQkVMUyIsImNvbGxlY3RQcm9wZXJ0aWVzIiwiZW50aXR5VHlwZSIsInByb3BlcnRpZXMiLCJ2aXNpdGVkRW50aXR5IiwiZnVsbHlRdWFsaWZpZWROYW1lIiwicHVzaCIsImVudGl0eVByb3BlcnRpZXMiLCJmaWx0ZXIiLCJwcm9wIiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJUZXh0IiwidW5kZWZpbmVkIiwiaGFzQ3VycmVuY3kiLCJoYXNVbml0IiwiaXNDdXJyZW5jeSIsImlzVW5pdCIsIm1hcCIsInByb3BlcnR5IiwiZ2V0VGV4dEFycmFuZ2VtZW50Q2hhbmdlQWN0aW9uIiwiY2hhbmdlVHlwZSIsInRpdGxlIiwidHlwZSIsIkFubm90YXRpb25UeXBlcyIsIlZhbHVlTGlzdFR5cGUiLCJkZWxlZ2F0ZSIsImdldEFubm90YXRpb25zQ2hhbmdlSW5mbyIsIm9Db250cm9sIiwiX2Fubm90YXRpb24iLCJ0ZW1wbGF0ZUNvbXBvbmVudCIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwibWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiY29udGV4dFBhdGhUb1VzZSIsImdldEZ1bGxDb250ZXh0UGF0aCIsImJ1aWxkaW5nQmxvY2siLCJpc0EiLCJnZXRQYXJlbnQiLCJtZXRhUGF0aCIsImdldFByb3BlcnR5IiwidGFyZ2V0RW50aXR5IiwiTWV0YVBhdGgiLCJjb252ZXJ0VHlwZXMiLCJlIiwiTG9nIiwid2FybmluZyIsImRlZmF1bHRUeXBlIiwiZ2V0Q2xvc2VzdEVudGl0eVR5cGUiLCJVSSIsIlRleHRBcnJhbmdlbWVudCIsInRvU3RyaW5nIiwic2VydmljZVVybCIsImdldE1vZGVsIiwiZ2V0U2VydmljZVVybCIsInByb3BlcnR5TmFtZSIsIkxhYmVsIiwibmFtZSIsImFubm90YXRpb25QYXRoIiwiY3VycmVudFZhbHVlIiwicG9zc2libGVWYWx1ZXMiLCJPYmplY3QiLCJrZXlzIiwic0tleSIsImtleSIsInRleHQiLCJwcmVTZWxlY3RlZFByb3BlcnR5IiwiX2V4cG9ydHMiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlRleHRBcnJhbmdlbWVudENoYW5nZUFjdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEVudGl0eVR5cGUsIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgeyBUZXh0QXJyYW5nZW1lbnRUeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBUZW1wbGF0ZUNvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2sgZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL0J1aWxkaW5nQmxvY2tcIjtcbmltcG9ydCB7IGNvbnZlcnRUeXBlcyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IE1ldGFQYXRoIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01ldGFQYXRoXCI7XG5pbXBvcnQgdHlwZSBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gXCJzYXAvdWkvY29yZS9Db21wb25lbnRcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG4vLyBPSyBzaW5jZSB3ZSBhcmUgaW4gZGVzaWdudGltZSB3ZSBjYW4gaWdub3JlIHRoYXQgZGVwZW5kZW5jeVxuaW1wb3J0IHsgaGFzQ3VycmVuY3ksIGhhc1VuaXQsIGlzQ3VycmVuY3ksIGlzVW5pdCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlc3RyaWN0ZWQtaW1wb3J0c1xuaW1wb3J0IEFubm90YXRpb25UeXBlcyBmcm9tIFwic2FwL3VpL3J0YS9wbHVnaW4vYW5ub3RhdGlvbnMvQW5ub3RhdGlvblR5cGVzXCI7XG5cbnR5cGUgQW5ub3RhdGlvbkNoYW5nZVJldHVyblR5cGUgPSB7XG5cdHNlcnZpY2VVcmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0cHJvcGVydGllczoge1xuXHRcdHByb3BlcnR5TmFtZTogc3RyaW5nO1xuXHRcdGFubm90YXRpb25QYXRoOiBzdHJpbmc7XG5cdFx0Y3VycmVudFZhbHVlOiBzdHJpbmc7XG5cdH1bXTtcblx0cG9zc2libGVWYWx1ZXM6IHsga2V5OiBzdHJpbmc7IHRleHQ6IHN0cmluZyB9W107XG5cdHByZVNlbGVjdGVkUHJvcGVydHk6IHN0cmluZzsgLy8gaWYgdGhlIGFjdGlvbiBpcyB0cmlnZ2VyZWQgZnJvbSBhIGNvbnRyb2wgdGhhdCBjb3JyZXNwb25kcyB0byBhIHByb3BlcnR5LCBvbmx5IHRoaXMgb25lIHdpbGwgYmUgc2hvd24gaW4gdGhlIERpYWxvZyBpbml0aWFsbHkgKHNlYXJjaCBmaWVsZCBwb3B1bGF0ZWQgd2l0aCB0aGlzIHN0cmluZylcbn07XG5cbmNvbnN0IFRFWFRfQVJSQU5HRU1FTlRfTEFCRUxTID0ge1xuXHRbVGV4dEFycmFuZ2VtZW50VHlwZS5UZXh0T25seV06IFwiVGV4dCBPbmx5XCIsXG5cdFtUZXh0QXJyYW5nZW1lbnRUeXBlLlRleHRGaXJzdF06IFwiVGV4dCBGaXJzdFwiLFxuXHRbVGV4dEFycmFuZ2VtZW50VHlwZS5UZXh0TGFzdF06IFwiVGV4dCBMYXN0XCIsXG5cdFtUZXh0QXJyYW5nZW1lbnRUeXBlLlRleHRTZXBhcmF0ZV06IFwiSUQgT25seVwiXG59O1xuXG4vKipcbiAqIENvbGxlY3RzIGFsbCBwcm9wZXJ0aWVzIHdpdGggYSBUZXh0IGFubm90YXRpb24gZnJvbSB0aGUgZ2l2ZW4gZW50aXR5IHR5cGUgYW5kIGl0cyBuYXZpZ2F0aW9uIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgZW50aXR5IHR5cGUgdG8gc3RhcnQgd2l0aFxuICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIGFycmF5IHRvIGNvbGxlY3QgdGhlIHByb3BlcnRpZXMgaW5cbiAqIEBwYXJhbSB2aXNpdGVkRW50aXR5IEEgbWFwIHRvIGtlZXAgdHJhY2sgb2YgdmlzaXRlZCBlbnRpdGllc1xuICovXG5mdW5jdGlvbiBjb2xsZWN0UHJvcGVydGllcyhcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0cHJvcGVydGllczogeyBwcm9wZXJ0eTogUHJvcGVydHk7IGVudGl0eVR5cGU6IEVudGl0eVR5cGUgfVtdLFxuXHR2aXNpdGVkRW50aXR5OiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPlxuKTogdm9pZCB7XG5cdGlmICh2aXNpdGVkRW50aXR5W2VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXSkge1xuXHRcdHJldHVybjtcblx0fVxuXHR2aXNpdGVkRW50aXR5W2VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHRydWU7XG5cdHByb3BlcnRpZXMucHVzaChcblx0XHQuLi5lbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXNcblx0XHRcdC5maWx0ZXIoKHByb3A6IFByb3BlcnR5KSA9PiB7XG5cdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0cHJvcC5hbm5vdGF0aW9ucy5Db21tb24/LlRleHQgIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHRcdCFoYXNDdXJyZW5jeShwcm9wKSAmJlxuXHRcdFx0XHRcdCFoYXNVbml0KHByb3ApICYmXG5cdFx0XHRcdFx0IWlzQ3VycmVuY3kocHJvcCkgJiZcblx0XHRcdFx0XHQhaXNVbml0KHByb3ApXG5cdFx0XHRcdCk7XG5cdFx0XHR9KVxuXHRcdFx0Lm1hcCgocHJvcDogUHJvcGVydHkpID0+IHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRwcm9wZXJ0eTogcHJvcCxcblx0XHRcdFx0XHRlbnRpdHlUeXBlOiBlbnRpdHlUeXBlXG5cdFx0XHRcdH07XG5cdFx0XHR9KVxuXHQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFRleHRBcnJhbmdlbWVudENoYW5nZUFjdGlvbigpOiB7XG5cdGNoYW5nZVR5cGU6IHN0cmluZztcblx0dGl0bGU6ICgpID0+IHN0cmluZztcblx0dHlwZTogc3RyaW5nO1xuXHRkZWxlZ2F0ZTogeyBnZXRBbm5vdGF0aW9uc0NoYW5nZUluZm86IChvQ29udHJvbDogTWFuYWdlZE9iamVjdCwgX2Fubm90YXRpb246IHN0cmluZykgPT4gQW5ub3RhdGlvbkNoYW5nZVJldHVyblR5cGUgfCBudWxsIH07XG59IHtcblx0cmV0dXJuIHtcblx0XHRjaGFuZ2VUeXBlOiBcInRleHRBcnJhbmdlbWVudF9UZXN0XCIsXG5cdFx0dGl0bGU6ICgpOiBzdHJpbmcgPT4gXCJDaGFuZ2UgVGV4dCBBcnJhbmdlbWVudFwiLFxuXHRcdHR5cGU6IEFubm90YXRpb25UeXBlcy5WYWx1ZUxpc3RUeXBlLFxuXHRcdGRlbGVnYXRlOiB7XG5cdFx0XHRnZXRBbm5vdGF0aW9uc0NoYW5nZUluZm86IChvQ29udHJvbDogTWFuYWdlZE9iamVjdCwgX2Fubm90YXRpb246IHN0cmluZyk6IEFubm90YXRpb25DaGFuZ2VSZXR1cm5UeXBlIHwgbnVsbCA9PiB7XG5cdFx0XHRcdGNvbnN0IHRlbXBsYXRlQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKG9Db250cm9sKSBhcyBUZW1wbGF0ZUNvbXBvbmVudCB8IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKHRlbXBsYXRlQ29tcG9uZW50KSB7XG5cdFx0XHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gdGVtcGxhdGVDb21wb25lbnQuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdFx0Y29uc3QgY29udGV4dFBhdGhUb1VzZSA9IHRlbXBsYXRlQ29tcG9uZW50LmdldEZ1bGxDb250ZXh0UGF0aCgpO1xuXHRcdFx0XHRcdC8vIEZpbmQgY2xvc2VzdCBidWlsZGluZyBibG9ja1xuXHRcdFx0XHRcdGxldCBidWlsZGluZ0Jsb2NrOiBNYW5hZ2VkT2JqZWN0IHwgbnVsbCA9IG9Db250cm9sO1xuXHRcdFx0XHRcdHdoaWxlIChidWlsZGluZ0Jsb2NrICYmICFidWlsZGluZ0Jsb2NrLmlzQTxCdWlsZGluZ0Jsb2NrPihcInNhcC5mZS5jb3JlLmJ1aWxkaW5nQmxvY2tzLkJ1aWxkaW5nQmxvY2tcIikpIHtcblx0XHRcdFx0XHRcdGJ1aWxkaW5nQmxvY2sgPSBidWlsZGluZ0Jsb2NrLmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRsZXQgbWV0YVBhdGggPSBjb250ZXh0UGF0aFRvVXNlITtcblx0XHRcdFx0XHRpZiAoYnVpbGRpbmdCbG9jaykge1xuXHRcdFx0XHRcdFx0bWV0YVBhdGggPSBidWlsZGluZ0Jsb2NrLmdldFByb3BlcnR5KFwibWV0YVBhdGhcIikgPz8gY29udGV4dFBhdGhUb1VzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG1ldGFNb2RlbCAmJiBjb250ZXh0UGF0aFRvVXNlKSB7XG5cdFx0XHRcdFx0XHRsZXQgdGFyZ2V0RW50aXR5OiBNZXRhUGF0aDxFbnRpdHlUeXBlPjtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdHRhcmdldEVudGl0eSA9IG5ldyBNZXRhUGF0aChjb252ZXJ0VHlwZXMobWV0YU1vZGVsKSwgbWV0YVBhdGgsIGNvbnRleHRQYXRoVG9Vc2UpO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdFx0XHRMb2cud2FybmluZyhgTm8gbWV0YW1vZGVsIG9yIG1ldGFQYXRoIGlzIG5vdCByZWFjaGFibGUgd2l0aCAke21ldGFQYXRofSBhbmQgJHtjb250ZXh0UGF0aFRvVXNlfWApO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGNvbnN0IHByb3BlcnRpZXM6IHsgcHJvcGVydHk6IFByb3BlcnR5OyBlbnRpdHlUeXBlOiBFbnRpdHlUeXBlIH1bXSA9IFtdO1xuXHRcdFx0XHRcdFx0Y29uc3QgdmlzaXRlZEVudGl0eTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcblx0XHRcdFx0XHRcdGNvbnN0IGRlZmF1bHRUeXBlID1cblx0XHRcdFx0XHRcdFx0dGFyZ2V0RW50aXR5LmdldENsb3Nlc3RFbnRpdHlUeXBlKCkuYW5ub3RhdGlvbnMuVUk/LlRleHRBcnJhbmdlbWVudD8udG9TdHJpbmcoKSA/P1xuXHRcdFx0XHRcdFx0XHRUZXh0QXJyYW5nZW1lbnRUeXBlLlRleHRGaXJzdC50b1N0cmluZygpO1xuXHRcdFx0XHRcdFx0Y29sbGVjdFByb3BlcnRpZXModGFyZ2V0RW50aXR5LmdldENsb3Nlc3RFbnRpdHlUeXBlKCksIHByb3BlcnRpZXMsIHZpc2l0ZWRFbnRpdHkpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0c2VydmljZVVybDogKG9Db250cm9sLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCB8IHVuZGVmaW5lZCk/LmdldFNlcnZpY2VVcmwoKSxcblx0XHRcdFx0XHRcdFx0cHJvcGVydGllczogcHJvcGVydGllcy5tYXAoKHByb3A6IHsgcHJvcGVydHk6IFByb3BlcnR5OyBlbnRpdHlUeXBlOiBFbnRpdHlUeXBlIH0pID0+IHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0cHJvcGVydHlOYW1lOiBwcm9wLnByb3BlcnR5LmFubm90YXRpb25zLkNvbW1vbj8uTGFiZWw/LnRvU3RyaW5nKCkgPz8gcHJvcC5wcm9wZXJ0eS5uYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0YW5ub3RhdGlvblBhdGg6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiL1wiICtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cHJvcC5lbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSArXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiL1wiICtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cHJvcC5wcm9wZXJ0eS5uYW1lICtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlRleHRAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuVGV4dEFycmFuZ2VtZW50XCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRjdXJyZW50VmFsdWU6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHByb3AucHJvcGVydHkuYW5ub3RhdGlvbnMuQ29tbW9uPy5UZXh0Py5hbm5vdGF0aW9ucz8uVUk/LlRleHRBcnJhbmdlbWVudD8udG9TdHJpbmcoKSA/PyBkZWZhdWx0VHlwZVxuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdFx0XHRwb3NzaWJsZVZhbHVlczogT2JqZWN0LmtleXMoVEVYVF9BUlJBTkdFTUVOVF9MQUJFTFMpLm1hcCgoc0tleSkgPT4gKHtcblx0XHRcdFx0XHRcdFx0XHRrZXk6IHNLZXksXG5cdFx0XHRcdFx0XHRcdFx0dGV4dDogVEVYVF9BUlJBTkdFTUVOVF9MQUJFTFNbc0tleSBhcyB1bmtub3duIGFzIGtleW9mIHR5cGVvZiBURVhUX0FSUkFOR0VNRU5UX0xBQkVMU11cblx0XHRcdFx0XHRcdFx0fSkpLFxuXHRcdFx0XHRcdFx0XHRwcmVTZWxlY3RlZFByb3BlcnR5OiBcIlwiIC8vIGlmIHRoZSBhY3Rpb24gaXMgdHJpZ2dlcmVkIGZyb20gYSBjb250cm9sIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBwcm9wZXJ0eSwgb25seSB0aGlzIG9uZSB3aWxsIGJlIHNob3duIGluIHRoZSBEaWFsb2cgaW5pdGlhbGx5IChzZWFyY2ggZmllbGQgcG9wdWxhdGVkIHdpdGggdGhpcyBzdHJpbmcpXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7RUFVQTtFQUVBO0VBY0EsTUFBTUEsdUJBQXVCLEdBQUc7SUFDL0IscUNBQWdDLFdBQVc7SUFDM0Msc0NBQWlDLFlBQVk7SUFDN0MscUNBQWdDLFdBQVc7SUFDM0MseUNBQW9DO0VBQ3JDLENBQUM7O0VBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBU0MsaUJBQWlCQSxDQUN6QkMsVUFBc0IsRUFDdEJDLFVBQTRELEVBQzVEQyxhQUFzQyxFQUMvQjtJQUNQLElBQUlBLGFBQWEsQ0FBQ0YsVUFBVSxDQUFDRyxrQkFBa0IsQ0FBQyxFQUFFO01BQ2pEO0lBQ0Q7SUFDQUQsYUFBYSxDQUFDRixVQUFVLENBQUNHLGtCQUFrQixDQUFDLEdBQUcsSUFBSTtJQUNuREYsVUFBVSxDQUFDRyxJQUFJLENBQ2QsR0FBR0osVUFBVSxDQUFDSyxnQkFBZ0IsQ0FDNUJDLE1BQU0sQ0FBRUMsSUFBYyxJQUFLO01BQzNCLE9BQ0NBLElBQUksQ0FBQ0MsV0FBVyxDQUFDQyxNQUFNLEVBQUVDLElBQUksS0FBS0MsU0FBUyxJQUMzQyxDQUFDQyxXQUFXLENBQUNMLElBQUksQ0FBQyxJQUNsQixDQUFDTSxPQUFPLENBQUNOLElBQUksQ0FBQyxJQUNkLENBQUNPLFVBQVUsQ0FBQ1AsSUFBSSxDQUFDLElBQ2pCLENBQUNRLE1BQU0sQ0FBQ1IsSUFBSSxDQUFDO0lBRWYsQ0FBQyxDQUFDLENBQ0RTLEdBQUcsQ0FBRVQsSUFBYyxJQUFLO01BQ3hCLE9BQU87UUFDTlUsUUFBUSxFQUFFVixJQUFJO1FBQ2RQLFVBQVUsRUFBRUE7TUFDYixDQUFDO0lBQ0YsQ0FBQyxDQUNILENBQUM7RUFDRjtFQUNPLFNBQVNrQiw4QkFBOEJBLENBQUEsRUFLNUM7SUFDRCxPQUFPO01BQ05DLFVBQVUsRUFBRSxzQkFBc0I7TUFDbENDLEtBQUssRUFBRUEsQ0FBQSxLQUFjLHlCQUF5QjtNQUM5Q0MsSUFBSSxFQUFFQyxlQUFlLENBQUNDLGFBQWE7TUFDbkNDLFFBQVEsRUFBRTtRQUNUQyx3QkFBd0IsRUFBRUEsQ0FBQ0MsUUFBdUIsRUFBRUMsV0FBbUIsS0FBd0M7VUFDOUcsTUFBTUMsaUJBQWlCLEdBQUdDLFNBQVMsQ0FBQ0Msb0JBQW9CLENBQUNKLFFBQVEsQ0FBa0M7VUFDbkcsSUFBSUUsaUJBQWlCLEVBQUU7WUFDdEIsTUFBTUcsU0FBUyxHQUFHSCxpQkFBaUIsQ0FBQ0ksWUFBWSxDQUFDLENBQUM7WUFDbEQsTUFBTUMsZ0JBQWdCLEdBQUdMLGlCQUFpQixDQUFDTSxrQkFBa0IsQ0FBQyxDQUFDO1lBQy9EO1lBQ0EsSUFBSUMsYUFBbUMsR0FBR1QsUUFBUTtZQUNsRCxPQUFPUyxhQUFhLElBQUksQ0FBQ0EsYUFBYSxDQUFDQyxHQUFHLENBQWdCLDBDQUEwQyxDQUFDLEVBQUU7Y0FDdEdELGFBQWEsR0FBR0EsYUFBYSxDQUFDRSxTQUFTLENBQUMsQ0FBQztZQUMxQztZQUNBLElBQUlDLFFBQVEsR0FBR0wsZ0JBQWlCO1lBQ2hDLElBQUlFLGFBQWEsRUFBRTtjQUNsQkcsUUFBUSxHQUFHSCxhQUFhLENBQUNJLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSU4sZ0JBQWdCO1lBQ3JFO1lBQ0EsSUFBSUYsU0FBUyxJQUFJRSxnQkFBZ0IsRUFBRTtjQUNsQyxJQUFJTyxZQUFrQztjQUN0QyxJQUFJO2dCQUNIQSxZQUFZLEdBQUcsSUFBSUMsUUFBUSxDQUFDQyxZQUFZLENBQUNYLFNBQVMsQ0FBQyxFQUFFTyxRQUFRLEVBQUVMLGdCQUFnQixDQUFDO2NBQ2pGLENBQUMsQ0FBQyxPQUFPVSxDQUFDLEVBQUU7Z0JBQ1hDLEdBQUcsQ0FBQ0MsT0FBTyxDQUFDLGtEQUFrRFAsUUFBUSxRQUFRTCxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNqRyxPQUFPLElBQUk7Y0FDWjtjQUNBLE1BQU1oQyxVQUE0RCxHQUFHLEVBQUU7Y0FDdkUsTUFBTUMsYUFBc0MsR0FBRyxDQUFDLENBQUM7Y0FDakQsTUFBTTRDLFdBQVcsR0FDaEJOLFlBQVksQ0FBQ08sb0JBQW9CLENBQUMsQ0FBQyxDQUFDdkMsV0FBVyxDQUFDd0MsRUFBRSxFQUFFQyxlQUFlLEVBQUVDLFFBQVEsQ0FBQyxDQUFDLElBQy9FLG1DQUE4QkEsUUFBUSxDQUFDLENBQUM7Y0FDekNuRCxpQkFBaUIsQ0FBQ3lDLFlBQVksQ0FBQ08sb0JBQW9CLENBQUMsQ0FBQyxFQUFFOUMsVUFBVSxFQUFFQyxhQUFhLENBQUM7Y0FDakYsT0FBTztnQkFDTmlELFVBQVUsRUFBR3pCLFFBQVEsQ0FBQzBCLFFBQVEsQ0FBQyxDQUFDLEVBQTZCQyxhQUFhLENBQUMsQ0FBQztnQkFDNUVwRCxVQUFVLEVBQUVBLFVBQVUsQ0FBQ2UsR0FBRyxDQUFFVCxJQUFvRCxJQUFLO2tCQUNwRixPQUFPO29CQUNOK0MsWUFBWSxFQUFFL0MsSUFBSSxDQUFDVSxRQUFRLENBQUNULFdBQVcsQ0FBQ0MsTUFBTSxFQUFFOEMsS0FBSyxFQUFFTCxRQUFRLENBQUMsQ0FBQyxJQUFJM0MsSUFBSSxDQUFDVSxRQUFRLENBQUN1QyxJQUFJO29CQUN2RkMsY0FBYyxFQUNiLEdBQUcsR0FDSGxELElBQUksQ0FBQ1AsVUFBVSxDQUFDRyxrQkFBa0IsR0FDbEMsR0FBRyxHQUNISSxJQUFJLENBQUNVLFFBQVEsQ0FBQ3VDLElBQUksR0FDbEIsaUZBQWlGO29CQUNsRkUsWUFBWSxFQUNYbkQsSUFBSSxDQUFDVSxRQUFRLENBQUNULFdBQVcsQ0FBQ0MsTUFBTSxFQUFFQyxJQUFJLEVBQUVGLFdBQVcsRUFBRXdDLEVBQUUsRUFBRUMsZUFBZSxFQUFFQyxRQUFRLENBQUMsQ0FBQyxJQUFJSjtrQkFDMUYsQ0FBQztnQkFDRixDQUFDLENBQUM7Z0JBQ0ZhLGNBQWMsRUFBRUMsTUFBTSxDQUFDQyxJQUFJLENBQUMvRCx1QkFBdUIsQ0FBQyxDQUFDa0IsR0FBRyxDQUFFOEMsSUFBSSxLQUFNO2tCQUNuRUMsR0FBRyxFQUFFRCxJQUFJO2tCQUNURSxJQUFJLEVBQUVsRSx1QkFBdUIsQ0FBQ2dFLElBQUk7Z0JBQ25DLENBQUMsQ0FBQyxDQUFDO2dCQUNIRyxtQkFBbUIsRUFBRSxFQUFFLENBQUM7Y0FDekIsQ0FBQztZQUNGO1VBQ0Q7VUFDQSxPQUFPLElBQUk7UUFDWjtNQUNEO0lBQ0QsQ0FBQztFQUNGO0VBQUNDLFFBQUEsQ0FBQWhELDhCQUFBLEdBQUFBLDhCQUFBO0VBQUEsT0FBQWdELFFBQUE7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==
|