@sapui5/sap.fe.core 1.100.0 → 1.102.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 +4 -4
- package/src/sap/fe/core/.library +2 -3
- package/src/sap/fe/core/AppComponent.js +23 -30
- package/src/sap/fe/core/AppComponent.ts +35 -40
- package/src/sap/fe/core/AppStateHandler.js +8 -8
- package/src/sap/fe/core/AppStateHandler.ts +11 -11
- package/src/sap/fe/core/BaseController.js +9 -9
- package/src/sap/fe/core/BaseController.ts +3 -4
- package/src/sap/fe/core/CommonUtils.js +122 -101
- package/src/sap/fe/core/CommonUtils.ts +239 -193
- package/src/sap/fe/core/ExtensionAPI.js +12 -13
- package/src/sap/fe/core/ExtensionAPI.ts +21 -31
- package/src/sap/fe/core/PageController.js +19 -13
- package/src/sap/fe/core/PageController.ts +40 -34
- package/src/sap/fe/core/TemplateComponent.js +198 -123
- package/src/sap/fe/core/TemplateComponent.ts +109 -121
- package/src/sap/fe/core/TemplateModel.js +7 -9
- package/src/sap/fe/core/TemplateModel.ts +3 -3
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +60 -0
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +37 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +165 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +178 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +935 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +837 -0
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +436 -0
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +431 -0
- package/src/sap/fe/core/{BusyLocker.js → controllerextensions/BusyLocker.js} +1 -1
- package/src/sap/fe/core/{BusyLocker.ts → controllerextensions/BusyLocker.ts} +7 -7
- package/src/sap/fe/core/controllerextensions/EditFlow.js +660 -288
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +513 -331
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +11 -11
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +6 -7
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +43 -25
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +132 -103
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +16 -16
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +64 -55
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +166 -99
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +187 -149
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +14 -14
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +12 -11
- package/src/sap/fe/core/controllerextensions/MassEdit.js +13 -12
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +22 -22
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +14 -26
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +20 -30
- package/src/sap/fe/core/controllerextensions/PageReady.js +25 -23
- package/src/sap/fe/core/controllerextensions/PageReady.ts +49 -47
- package/src/sap/fe/core/controllerextensions/Paginator.js +24 -15
- package/src/sap/fe/core/controllerextensions/Paginator.ts +35 -20
- package/src/sap/fe/core/controllerextensions/Placeholder.js +10 -10
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
- package/src/sap/fe/core/controllerextensions/Routing.js +11 -11
- package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
- package/src/sap/fe/core/controllerextensions/Share.js +34 -16
- package/src/sap/fe/core/controllerextensions/Share.ts +50 -32
- package/src/sap/fe/core/controllerextensions/SideEffects.js +15 -15
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +64 -65
- package/src/sap/fe/core/controllerextensions/ViewState.js +27 -31
- package/src/sap/fe/core/controllerextensions/ViewState.ts +103 -102
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +105 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +98 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +360 -0
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ActivitySync.ts +90 -132
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +146 -0
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/CollaborationCommon.ts +18 -8
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +264 -0
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/Manage.ts +35 -33
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +100 -0
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/UserDetails.fragment.xml +5 -7
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1584 -0
- package/src/sap/fe/core/{TransactionHelper.ts → controllerextensions/editFlow/TransactionHelper.ts} +190 -159
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +780 -0
- package/src/sap/fe/core/{actions → controllerextensions/editFlow}/draft.ts +329 -76
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1149 -0
- package/src/sap/fe/core/{actions → controllerextensions/editFlow}/operations.ts +169 -97
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +190 -0
- package/src/sap/fe/core/{actions → controllerextensions/editFlow}/sticky.ts +76 -12
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +592 -0
- package/src/sap/fe/core/{actions → controllerextensions/messageHandler}/messageHandling.ts +83 -60
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +940 -0
- package/src/sap/fe/core/{RouterProxy.ts → controllerextensions/routing/RouterProxy.ts} +52 -36
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +21 -18
- package/src/sap/fe/core/controls/Any.js +28 -0
- package/src/sap/fe/core/controls/Any.ts +30 -0
- package/src/sap/fe/core/controls/CommandExecution.js +50 -16
- package/src/sap/fe/core/controls/CommandExecution.ts +31 -22
- package/src/sap/fe/core/controls/ConditionalWrapper.js +136 -65
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +49 -58
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +371 -0
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +282 -0
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +74 -36
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +23 -32
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +52 -5
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +127 -67
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +127 -67
- package/src/sap/fe/core/controls/FieldWrapper.js +171 -87
- package/src/sap/fe/core/controls/FieldWrapper.ts +69 -80
- package/src/sap/fe/core/controls/FileWrapper.js +360 -0
- package/src/sap/fe/core/controls/FileWrapper.ts +202 -0
- package/src/sap/fe/core/controls/FilterBar.js +154 -119
- package/src/sap/fe/core/controls/FilterBar.ts +128 -123
- package/src/sap/fe/core/controls/FormElementWrapper.js +102 -37
- package/src/sap/fe/core/controls/FormElementWrapper.ts +43 -35
- package/src/sap/fe/core/controls/MassEditSelect.js +33 -0
- package/src/sap/fe/core/controls/MassEditSelect.ts +45 -0
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +111 -89
- package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +86 -82
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +242 -193
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +211 -204
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +152 -116
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +105 -105
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +2 -2
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +23 -28
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +41 -81
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +107 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +550 -35
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +604 -35
- package/src/sap/fe/core/converters/ManifestSettings.js +3 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +9 -2
- package/src/sap/fe/core/converters/MetaModelConverter.js +11 -40
- package/src/sap/fe/core/converters/MetaModelConverter.ts +56 -84
- package/src/sap/fe/core/converters/annotations/DataField.js +20 -5
- package/src/sap/fe/core/converters/annotations/DataField.ts +27 -6
- package/src/sap/fe/core/converters/controls/Common/Action.js +14 -21
- package/src/sap/fe/core/converters/controls/Common/Action.ts +23 -28
- package/src/sap/fe/core/converters/controls/Common/Chart.js +17 -10
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +20 -14
- package/src/sap/fe/core/converters/controls/Common/Form.js +16 -18
- package/src/sap/fe/core/converters/controls/Common/Form.ts +20 -20
- package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +2 -3
- package/src/sap/fe/core/converters/controls/Common/Table.js +389 -173
- package/src/sap/fe/core/converters/controls/Common/Table.ts +440 -244
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +26 -16
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +27 -19
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +78 -47
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +146 -107
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +6 -6
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +20 -18
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +30 -25
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +39 -34
- package/src/sap/fe/core/converters/helpers/Aggregation.js +10 -2
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +18 -13
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -2
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +6 -5
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +0 -4
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +27 -24
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +49 -40
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +33 -22
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +77 -62
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +28 -28
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +38 -45
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -3
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +8 -6
- package/src/sap/fe/core/formatters/KPIFormatter.js +3 -12
- package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -2
- package/src/sap/fe/core/formatters/TableFormatter.js +74 -13
- package/src/sap/fe/core/formatters/TableFormatter.ts +71 -16
- package/src/sap/fe/core/formatters/ValueFormatter.js +4 -4
- package/src/sap/fe/core/formatters/ValueFormatter.ts +4 -7
- package/src/sap/fe/core/fpm/Component.js +46 -17
- package/src/sap/fe/core/fpm/Component.ts +11 -16
- package/src/sap/fe/core/helpers/AppStartupHelper.js +4 -4
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +3 -3
- package/src/sap/fe/core/helpers/BindingExpression.js +10 -7
- package/src/sap/fe/core/helpers/BindingExpression.ts +37 -35
- package/src/sap/fe/core/helpers/ClassSupport.js +273 -256
- package/src/sap/fe/core/helpers/ClassSupport.ts +315 -237
- package/src/sap/fe/core/helpers/FPMHelper.js +3 -2
- package/src/sap/fe/core/helpers/FPMHelper.ts +9 -8
- package/src/sap/fe/core/helpers/MassEditHelper.js +522 -147
- package/src/sap/fe/core/helpers/MassEditHelper.ts +563 -236
- package/src/sap/fe/core/helpers/ModelHelper.js +29 -1
- package/src/sap/fe/core/helpers/ModelHelper.ts +39 -26
- package/src/sap/fe/core/helpers/PasteHelper.js +4 -4
- package/src/sap/fe/core/helpers/PasteHelper.ts +4 -3
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +3 -3
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +3 -1
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +1 -1
- package/src/sap/fe/core/helpers/StableIdHelper.js +5 -7
- package/src/sap/fe/core/helpers/StableIdHelper.ts +8 -8
- package/src/sap/fe/core/{Synchronization.js → helpers/Synchronization.js} +1 -1
- package/src/sap/fe/core/{Synchronization.ts → helpers/Synchronization.ts} +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.js +35 -5
- package/src/sap/fe/core/jsx-runtime/jsx.ts +22 -8
- package/src/sap/fe/core/library.js +13 -5
- package/src/sap/fe/core/library.ts +26 -17
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +0 -3
- package/src/sap/fe/core/messagebundle.properties +135 -180
- package/src/sap/fe/core/messagebundle_ar.properties +31 -64
- package/src/sap/fe/core/messagebundle_bg.properties +31 -64
- package/src/sap/fe/core/messagebundle_ca.properties +31 -64
- package/src/sap/fe/core/messagebundle_cs.properties +31 -64
- package/src/sap/fe/core/messagebundle_cy.properties +32 -65
- package/src/sap/fe/core/messagebundle_da.properties +31 -64
- package/src/sap/fe/core/messagebundle_de.properties +29 -62
- package/src/sap/fe/core/messagebundle_el.properties +32 -65
- package/src/sap/fe/core/messagebundle_en.properties +32 -65
- package/src/sap/fe/core/messagebundle_en_GB.properties +29 -62
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +41 -74
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +32 -65
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +20 -6
- package/src/sap/fe/core/messagebundle_es.properties +31 -64
- package/src/sap/fe/core/messagebundle_es_MX.properties +31 -64
- package/src/sap/fe/core/messagebundle_et.properties +31 -64
- package/src/sap/fe/core/messagebundle_fi.properties +29 -62
- package/src/sap/fe/core/messagebundle_fr.properties +36 -69
- package/src/sap/fe/core/messagebundle_fr_CA.properties +33 -66
- package/src/sap/fe/core/messagebundle_hi.properties +29 -62
- package/src/sap/fe/core/messagebundle_hr.properties +32 -65
- package/src/sap/fe/core/messagebundle_hu.properties +30 -63
- package/src/sap/fe/core/messagebundle_id.properties +32 -65
- package/src/sap/fe/core/messagebundle_it.properties +31 -64
- package/src/sap/fe/core/messagebundle_iw.properties +31 -64
- package/src/sap/fe/core/messagebundle_ja.properties +29 -62
- package/src/sap/fe/core/messagebundle_kk.properties +31 -64
- package/src/sap/fe/core/messagebundle_ko.properties +31 -64
- package/src/sap/fe/core/messagebundle_lt.properties +31 -64
- package/src/sap/fe/core/messagebundle_lv.properties +32 -65
- package/src/sap/fe/core/messagebundle_ms.properties +31 -64
- package/src/sap/fe/core/messagebundle_nl.properties +31 -64
- package/src/sap/fe/core/messagebundle_no.properties +31 -64
- package/src/sap/fe/core/messagebundle_pl.properties +34 -67
- package/src/sap/fe/core/messagebundle_pt.properties +32 -65
- package/src/sap/fe/core/messagebundle_pt_PT.properties +31 -64
- package/src/sap/fe/core/messagebundle_ro.properties +33 -66
- package/src/sap/fe/core/messagebundle_ru.properties +33 -66
- package/src/sap/fe/core/messagebundle_sh.properties +31 -64
- package/src/sap/fe/core/messagebundle_sk.properties +31 -64
- package/src/sap/fe/core/messagebundle_sl.properties +29 -62
- package/src/sap/fe/core/messagebundle_sv.properties +30 -63
- package/src/sap/fe/core/messagebundle_th.properties +31 -64
- package/src/sap/fe/core/messagebundle_tr.properties +31 -64
- package/src/sap/fe/core/messagebundle_uk.properties +32 -65
- package/src/sap/fe/core/messagebundle_vi.properties +31 -64
- package/src/sap/fe/core/messagebundle_zh_CN.properties +32 -65
- package/src/sap/fe/core/messagebundle_zh_TW.properties +34 -67
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +4 -4
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +5 -5
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +1 -2
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +11 -8
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +15 -13
- package/src/sap/fe/core/services/NavigationServiceFactory.js +5 -5
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +9 -5
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +4 -4
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/RoutingServiceFactory.js +105 -66
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +59 -49
- package/src/sap/fe/core/services/ShellServicesFactory.js +104 -29
- package/src/sap/fe/core/services/ShellServicesFactory.ts +64 -30
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +4 -4
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +11 -10
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +38 -51
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +43 -5
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +6 -3
- package/src/sap/fe/core/support/CommonHelper.js +1 -1
- package/src/sap/fe/core/support/CommonHelper.ts +0 -3
- package/src/sap/fe/core/templating/DataModelPathHelper.js +2 -9
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +32 -38
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +23 -3
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +27 -6
- package/src/sap/fe/core/templating/EntitySetHelper.js +1 -9
- package/src/sap/fe/core/templating/EntitySetHelper.ts +11 -13
- package/src/sap/fe/core/templating/FilterHelper.js +4 -4
- package/src/sap/fe/core/templating/FilterHelper.ts +6 -5
- package/src/sap/fe/core/templating/PropertyHelper.js +70 -33
- package/src/sap/fe/core/templating/PropertyHelper.ts +49 -27
- package/src/sap/fe/core/templating/UIFormatters.js +133 -22
- package/src/sap/fe/core/templating/UIFormatters.ts +144 -50
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +47 -0
- package/src/sap/fe/core/type/DateTimeWithTimezone.ts +23 -0
- package/src/sap/fe/core/type/Email.js +26 -8
- package/src/sap/fe/core/type/Email.ts +8 -7
- package/src/sap/fe/core/AnnotationHelper.js +0 -312
- package/src/sap/fe/core/AnnotationHelper.ts +0 -315
- package/src/sap/fe/core/RouterProxy.js +0 -926
- package/src/sap/fe/core/TransactionHelper.js +0 -1562
- package/src/sap/fe/core/actions/collaboration/ActivitySync.js +0 -392
- package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +0 -136
- package/src/sap/fe/core/actions/collaboration/Manage.js +0 -262
- package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +0 -103
- package/src/sap/fe/core/actions/draft.js +0 -523
- package/src/sap/fe/core/actions/messageHandling.js +0 -567
- package/src/sap/fe/core/actions/nonDraft.js +0 -20
- package/src/sap/fe/core/actions/nonDraft.ts +0 -12
- package/src/sap/fe/core/actions/operations.js +0 -1096
- package/src/sap/fe/core/actions/sticky.js +0 -130
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +0 -78
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +0 -65
- package/src/sap/fe/core/formatters/CriticalityFormatter.js +0 -77
- package/src/sap/fe/core/formatters/CriticalityFormatter.ts +0 -58
|
@@ -2,30 +2,535 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define([], function () {
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros/internal/valuehelp/ValueListHelper", "sap/ui/core/Core"], function (Log, ModelHelper, ValueListHelper, Core) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
|
-
/**
|
|
9
|
-
* Constructor for a new Visual Filter Container.
|
|
10
|
-
* Used for visual filters
|
|
11
|
-
*
|
|
12
|
-
* @param {string} [sId] ID for the new control, generated automatically if no ID is given
|
|
13
|
-
* @extends sap.ui.mdc.filterbar.IFilterContainer
|
|
14
|
-
* @class
|
|
15
|
-
* @private
|
|
16
|
-
* @alias sap.fe.core.controls.filterbar.VisualFilterContainer
|
|
17
|
-
*/
|
|
18
8
|
var MassEditHandlers = {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Called for property change in the transient context.
|
|
11
|
+
*
|
|
12
|
+
* @function
|
|
13
|
+
* @param {any} newValue New value of the property.
|
|
14
|
+
* @param {string} dataProperty Final context returned after the paginator action
|
|
15
|
+
* @param {string} mdcFieldId Final context returned after the paginator action
|
|
16
|
+
*/
|
|
17
|
+
contextPropertyChange: function (newValue, dataProperty, mdcFieldId) {
|
|
18
|
+
// Called for
|
|
19
|
+
// 1. Out Parameters.
|
|
20
|
+
// 2. Transient context property change.
|
|
21
|
+
var source = Core.byId(mdcFieldId);
|
|
22
|
+
var transCtx = source && source.getBindingContext();
|
|
23
|
+
var fieldInfoModel = source && source.getModel("fieldsInfo");
|
|
24
|
+
var values = fieldInfoModel.getProperty("/values/" + dataProperty) || fieldInfoModel.getProperty("/unitData/" + dataProperty) || [];
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
if (transCtx && (values.inputType === "InputWithValueHelp" || values.inputType === "InputWithUnit") && !values.valueListInfo) {
|
|
27
|
+
MassEditHandlers._setValueListInfo(transCtx, source, fieldInfoModel, dataProperty);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
var isDialogOpen = fieldInfoModel && fieldInfoModel.getProperty("/isOpen");
|
|
31
|
+
|
|
32
|
+
if (!isDialogOpen || !source.getVisible()) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
MassEditHandlers._updateSelectKey(source, dataProperty, newValue);
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Called for change in the MDC field.
|
|
41
|
+
* This is called on selection done through VHD.
|
|
42
|
+
* This is not called on change of the dropdown as we are using a custom MassEditSelect control and not general Select.
|
|
43
|
+
*
|
|
44
|
+
* @function
|
|
45
|
+
* @param {object} event Event object for change.
|
|
46
|
+
* @param {string} propertyName Property path.
|
|
47
|
+
*/
|
|
48
|
+
handleMDCFieldChange: function (event, propertyName) {
|
|
49
|
+
// Called for
|
|
50
|
+
// 1. VHD property change.
|
|
51
|
+
var source = event && event.getSource();
|
|
52
|
+
var changePromise = event && event.getParameter("promise");
|
|
53
|
+
var comboBox = source.getContent();
|
|
54
|
+
|
|
55
|
+
if (!comboBox || !propertyName) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
changePromise.then(MassEditHandlers._updateSelectKeyForMDCFieldChange.bind(MassEditHandlers, source, propertyName)).catch(function (err) {
|
|
60
|
+
Log.warning("VHD selection couldn't be populated in the mass edit field." + err);
|
|
61
|
+
});
|
|
62
|
+
},
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Called for selection change through the drop down.
|
|
66
|
+
*
|
|
67
|
+
* @function
|
|
68
|
+
* @param {object} event Event object for change.
|
|
69
|
+
*/
|
|
70
|
+
handleSelectionChange: function (event) {
|
|
71
|
+
// Called for Manual selection from dropdown(comboBox or select)
|
|
72
|
+
// 1. VHD select.
|
|
73
|
+
// 2. Any value change in the control.
|
|
74
|
+
var source = event && event.getSource();
|
|
75
|
+
var key = source.getSelectedKey();
|
|
76
|
+
var params = source && key && key.split("/");
|
|
77
|
+
var propertyName;
|
|
78
|
+
|
|
79
|
+
if (params[0] === "UseValueHelpValue") {
|
|
80
|
+
var prevItem = event.getParameter("previousSelectedItem");
|
|
81
|
+
var selectKey = prevItem.getKey();
|
|
82
|
+
propertyName = params.slice(1).join("/");
|
|
83
|
+
|
|
84
|
+
MassEditHandlers._onVHSelect(source, propertyName, selectKey);
|
|
85
|
+
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
var fieldInfoModel = source && source.getModel("fieldsInfo");
|
|
90
|
+
propertyName = MassEditHandlers._getPropertyNameFromKey(key);
|
|
91
|
+
|
|
92
|
+
MassEditHandlers._updateSuggestionForFieldsWithInParameters(fieldInfoModel, propertyName, key.startsWith("Default/") || key.startsWith("ClearFieldValue/"), true);
|
|
93
|
+
|
|
94
|
+
MassEditHandlers._updateSuggestionForFieldsWithOutParameters(fieldInfoModel, propertyName, key.startsWith("Default/") || key.startsWith("ClearFieldValue/"), false);
|
|
95
|
+
|
|
96
|
+
MassEditHandlers._updateResults(source, params, true);
|
|
97
|
+
},
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Update selections to results and the suggests in drop downs.
|
|
101
|
+
*
|
|
102
|
+
* @function
|
|
103
|
+
* @param {MDCField} source MDC field that was changed.
|
|
104
|
+
* @param {string} propertyName Property path.
|
|
105
|
+
* @param {any} value New value.
|
|
106
|
+
*/
|
|
107
|
+
_updateSelectKeyForMDCFieldChange: function (source, propertyName, value) {
|
|
108
|
+
var transCtx = source && source.getBindingContext();
|
|
109
|
+
var fieldInfoModel = source && source.getModel("fieldsInfo");
|
|
110
|
+
var values = fieldInfoModel.getProperty("/values/" + propertyName) || fieldInfoModel.getProperty("/unitData/" + propertyName) || [];
|
|
111
|
+
|
|
112
|
+
if (transCtx && (values.inputType === "InputWithValueHelp" || values.inputType === "InputWithUnit") && !values.valueListInfo) {
|
|
113
|
+
MassEditHandlers._setValueListInfo(transCtx, source, fieldInfoModel, propertyName);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
MassEditHandlers._updateSuggestionForFieldsWithOutParameters(fieldInfoModel, propertyName, false, true);
|
|
117
|
+
|
|
118
|
+
MassEditHandlers._updateSuggestionForFieldsWithInParameters(fieldInfoModel, propertyName, false, true);
|
|
119
|
+
|
|
120
|
+
var formattedValue = source.getFormFormattedValue();
|
|
121
|
+
|
|
122
|
+
MassEditHandlers._updateSelectKey(source, propertyName, value, formattedValue);
|
|
123
|
+
},
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Update suggests for all drop downs with InParameter as the propertyName.
|
|
127
|
+
*
|
|
128
|
+
* @function
|
|
129
|
+
* @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
|
|
130
|
+
* @param {string} propertyName Property path.
|
|
131
|
+
* @param {boolean} resetValues Should the values be reset to original state.
|
|
132
|
+
* @param {boolean} keepExistingSelection Should the existing selection before update remain.
|
|
133
|
+
*/
|
|
134
|
+
_updateSuggestionForFieldsWithInParameters: function (fieldInfoModel, propertyName, resetValues, keepExistingSelection) {
|
|
135
|
+
var values = fieldInfoModel.getProperty("/values");
|
|
136
|
+
var unitData = fieldInfoModel.getProperty("/unitData");
|
|
137
|
+
var fieldPaths = Object.keys(values);
|
|
138
|
+
var unitFieldPaths = Object.keys(unitData);
|
|
139
|
+
fieldPaths.forEach(MassEditHandlers._updateInParameterSuggetions.bind(MassEditHandlers, fieldInfoModel, "/values/", propertyName, resetValues, keepExistingSelection));
|
|
140
|
+
unitFieldPaths.forEach(MassEditHandlers._updateInParameterSuggetions.bind(MassEditHandlers, fieldInfoModel, "/unitData/", propertyName, resetValues, keepExistingSelection));
|
|
141
|
+
},
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Update suggests for a drop down with InParameter as the srcPropertyName.
|
|
145
|
+
*
|
|
146
|
+
* @function
|
|
147
|
+
* @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
|
|
148
|
+
* @param {string} pathPrefix Path in the runtime model.
|
|
149
|
+
* @param {string} srcPropertyName The InParameter Property path.
|
|
150
|
+
* @param {boolean} resetValues Should the values be reset to original state.
|
|
151
|
+
* @param {boolean} keepExistingSelection Should the existing selection before update remain.
|
|
152
|
+
* @param {string} propertyName Property path that needs update of suggestions.
|
|
153
|
+
*/
|
|
154
|
+
_updateInParameterSuggetions: function (fieldInfoModel, pathPrefix, srcPropertyName, resetValues, keepExistingSelection, propertyName) {
|
|
155
|
+
var valueListInfo = fieldInfoModel.getProperty(pathPrefix + propertyName + "/valueListInfo");
|
|
156
|
+
|
|
157
|
+
if (valueListInfo && srcPropertyName != propertyName) {
|
|
158
|
+
var inParameters = valueListInfo.inParameters;
|
|
159
|
+
|
|
160
|
+
if (inParameters && inParameters.length > 0 && inParameters.includes(srcPropertyName)) {
|
|
161
|
+
MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, pathPrefix + propertyName, resetValues, keepExistingSelection);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Update suggests for all OutParameter's drop downs of the propertyName.
|
|
168
|
+
*
|
|
169
|
+
* @function
|
|
170
|
+
* @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
|
|
171
|
+
* @param {string} propertyName Property path.
|
|
172
|
+
* @param {boolean} resetValues Should the values be reset to original state.
|
|
173
|
+
* @param {boolean} keepExistingSelection Should the existing selection before update remain.
|
|
174
|
+
*/
|
|
175
|
+
_updateSuggestionForFieldsWithOutParameters: function (fieldInfoModel, propertyName, resetValues, keepExistingSelection) {
|
|
176
|
+
var valueListInfo = fieldInfoModel.getProperty("/values/" + propertyName + "/valueListInfo") || fieldInfoModel.getProperty("/unitData/" + propertyName + "/valueListInfo");
|
|
177
|
+
|
|
178
|
+
if (valueListInfo && valueListInfo.outParameters) {
|
|
179
|
+
var outParameters = valueListInfo.outParameters;
|
|
180
|
+
|
|
181
|
+
MassEditHandlers._updateOutParameterSuggetions(outParameters, fieldInfoModel, resetValues, keepExistingSelection);
|
|
182
|
+
|
|
183
|
+
var pathPrefix = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/".concat(propertyName) || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/".concat(propertyName);
|
|
184
|
+
|
|
185
|
+
if (pathPrefix) {
|
|
186
|
+
MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, pathPrefix, false, true);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Update suggests for a drop down with InParameter as the srcPropertyName.
|
|
193
|
+
*
|
|
194
|
+
* @function
|
|
195
|
+
* @param {string} outParameters String arrary of OutParameter property paths.
|
|
196
|
+
* @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
|
|
197
|
+
* @param {boolean} resetValues Should the values be reset to original state.
|
|
198
|
+
* @param {boolean} keepExistingSelection Should the existing selection before update remain.
|
|
199
|
+
*/
|
|
200
|
+
_updateOutParameterSuggetions: function (outParameters, fieldInfoModel, resetValues, keepExistingSelection) {
|
|
201
|
+
var values = fieldInfoModel.getProperty("/values");
|
|
202
|
+
var unitData = fieldInfoModel.getProperty("/unitData");
|
|
203
|
+
var fieldPaths = Object.keys(values);
|
|
204
|
+
var unitFieldPaths = Object.keys(unitData);
|
|
205
|
+
outParameters.forEach(function (outParameter) {
|
|
206
|
+
if (fieldPaths.includes(outParameter)) {
|
|
207
|
+
MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, "/values/" + outParameter, resetValues, keepExistingSelection);
|
|
208
|
+
} else if (unitFieldPaths.includes(outParameter)) {
|
|
209
|
+
MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, "/unitData/" + outParameter, resetValues, keepExistingSelection);
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
},
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Update suggests for a drop down of a field.
|
|
216
|
+
*
|
|
217
|
+
* @function
|
|
218
|
+
* @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
|
|
219
|
+
* @param {string} fieldPathAbsolute Complete runtime property path.
|
|
220
|
+
* @param {boolean} resetValues Should the values be reset to original state.
|
|
221
|
+
* @param {boolean} keepExistingSelection Should the existing selection before update remain.
|
|
222
|
+
*/
|
|
223
|
+
_updateFieldPathSuggestions: function (fieldInfoModel, fieldPathAbsolute, resetValues, keepExistingSelection) {
|
|
224
|
+
var options = fieldInfoModel.getProperty(fieldPathAbsolute);
|
|
225
|
+
var defaultOptions = options.defaultOptions;
|
|
226
|
+
var selectedKey = fieldInfoModel.getProperty(fieldPathAbsolute + "/selectedKey");
|
|
227
|
+
var existingSelection = keepExistingSelection && options.find(function (option) {
|
|
228
|
+
return option.key === selectedKey;
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
if (resetValues) {
|
|
232
|
+
var selectOptions = options.selectOptions;
|
|
233
|
+
options.length = 0;
|
|
234
|
+
defaultOptions.forEach(function (defaultOption) {
|
|
235
|
+
return options.push(defaultOption);
|
|
236
|
+
});
|
|
237
|
+
selectOptions.forEach(function (selectOption) {
|
|
238
|
+
return options.push(selectOption);
|
|
239
|
+
});
|
|
240
|
+
} else {
|
|
241
|
+
options.length = 0;
|
|
242
|
+
defaultOptions.forEach(function (defaultOption) {
|
|
243
|
+
return options.push(defaultOption);
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
fieldInfoModel.setProperty(fieldPathAbsolute, options);
|
|
248
|
+
|
|
249
|
+
if (existingSelection && !options.includes(existingSelection)) {
|
|
250
|
+
options.push(existingSelection);
|
|
251
|
+
fieldInfoModel.setProperty(fieldPathAbsolute + "/selectedKey", selectedKey);
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Update In and Out Parameters in the MED.
|
|
257
|
+
*
|
|
258
|
+
* @function
|
|
259
|
+
* @param {Context} transCtx The transient context of the MED.
|
|
260
|
+
* @param {MDCField} source MDC field.
|
|
261
|
+
* @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
|
|
262
|
+
* @param {string} propertyName Property path.
|
|
263
|
+
*/
|
|
264
|
+
_setValueListInfo: function (transCtx, source, fieldInfoModel, propertyName) {
|
|
265
|
+
var propPath = fieldInfoModel.getProperty("/values/" + propertyName) && "/values/" || fieldInfoModel.getProperty("/unitData/" + propertyName) && "/unitData/";
|
|
266
|
+
|
|
267
|
+
if (fieldInfoModel.getProperty("".concat(propPath).concat(propertyName, "/valueListInfo"))) {
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
var fieldValueHelp = MassEditHandlers._getValueHelp(transCtx, source);
|
|
272
|
+
|
|
273
|
+
if (fieldValueHelp && fieldValueHelp.getDialogContent().getTable()) {
|
|
274
|
+
var inParameters = (fieldValueHelp.getInParameters() || []).map(function (inParam) {
|
|
275
|
+
return inParam.getFieldPath();
|
|
276
|
+
});
|
|
277
|
+
var outParameters = (fieldValueHelp.getInParameters() || []).map(function (outParam) {
|
|
278
|
+
return outParam.getFieldPath();
|
|
279
|
+
});
|
|
280
|
+
var info = {
|
|
281
|
+
inParameters: inParameters.map(function (inParam) {
|
|
282
|
+
return inParam.getFieldPath();
|
|
283
|
+
}),
|
|
284
|
+
outParameters: outParameters.map(function (outParam) {
|
|
285
|
+
return outParam.getFieldPath();
|
|
286
|
+
})
|
|
287
|
+
};
|
|
288
|
+
fieldInfoModel.setProperty("".concat(propPath).concat(propertyName, "/valueListInfo"), info);
|
|
289
|
+
|
|
290
|
+
if (info.outParameters.length > 0) {
|
|
291
|
+
MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, "/values/".concat(propertyName), false, true);
|
|
292
|
+
}
|
|
293
|
+
} else {
|
|
294
|
+
MassEditHandlers._requestValueList(transCtx, source, fieldInfoModel, propertyName);
|
|
295
|
+
}
|
|
296
|
+
},
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Request and update In and Out Parameters in the MED.
|
|
300
|
+
*
|
|
301
|
+
* @function
|
|
302
|
+
* @param {Context} transCtx The transient context of the MED.
|
|
303
|
+
* @param {MDCField} source MDC field.
|
|
304
|
+
* @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
|
|
305
|
+
* @param {string} propertyName Property path.
|
|
306
|
+
*/
|
|
307
|
+
_requestValueList: function (transCtx, source, fieldInfoModel, propertyName) {
|
|
308
|
+
var metaPath = ModelHelper.getMetaPathForContext(transCtx);
|
|
309
|
+
var propertyPath = metaPath && metaPath + "/" + propertyName;
|
|
310
|
+
var dependents = source === null || source === void 0 ? void 0 : source.getDependents();
|
|
311
|
+
var fieldHelp = source === null || source === void 0 ? void 0 : source.getFieldHelp();
|
|
312
|
+
var fieldValueHelp = dependents === null || dependents === void 0 ? void 0 : dependents.find(function (dependent) {
|
|
313
|
+
return dependent.getId() === fieldHelp;
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
if (!(fieldValueHelp !== null && fieldValueHelp !== void 0 && fieldValueHelp.getBindingContext())) {
|
|
317
|
+
fieldValueHelp === null || fieldValueHelp === void 0 ? void 0 : fieldValueHelp.setBindingContext(transCtx);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
var metaModel = transCtx.getModel().getMetaModel();
|
|
321
|
+
ValueListHelper.createVHUIModel(propertyPath, fieldValueHelp);
|
|
322
|
+
var valueListInfo = ValueListHelper.getValueListInfo(fieldValueHelp, metaModel, propertyPath);
|
|
323
|
+
valueListInfo.then(function (vLinfo) {
|
|
324
|
+
var propPath = fieldInfoModel.getProperty("/values/" + propertyName) && "/values/" || fieldInfoModel.getProperty("/unitData/" + propertyName) && "/unitData/";
|
|
325
|
+
var info = {
|
|
326
|
+
inParameters: vLinfo.inParameters.map(function (inParam) {
|
|
327
|
+
return inParam.getFieldPath();
|
|
328
|
+
}),
|
|
329
|
+
outParameters: vLinfo.outParameters.map(function (outParam) {
|
|
330
|
+
return outParam.getFieldPath();
|
|
331
|
+
})
|
|
332
|
+
};
|
|
333
|
+
fieldInfoModel.setProperty("".concat(propPath).concat(propertyName, "/valueListInfo"), info);
|
|
334
|
+
|
|
335
|
+
if (info.outParameters.length > 0) {
|
|
336
|
+
MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, "/values/".concat(propertyName), false, true);
|
|
337
|
+
}
|
|
338
|
+
}).catch(function () {
|
|
339
|
+
Log.warning("Mass Edit: Couldn't load valueList info for ".concat(propertyPath));
|
|
340
|
+
});
|
|
341
|
+
},
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Get field help control from MDC field.
|
|
345
|
+
*
|
|
346
|
+
* @function
|
|
347
|
+
* @param {Context} transCtx The transient context of the MED.
|
|
348
|
+
* @param {MDCField} source MDC field.
|
|
349
|
+
* @returns Field Help control.
|
|
350
|
+
*/
|
|
351
|
+
_getValueHelp: function (transCtx, source) {
|
|
352
|
+
var dependents = source === null || source === void 0 ? void 0 : source.getDependents();
|
|
353
|
+
var fieldHelp = source === null || source === void 0 ? void 0 : source.getFieldHelp();
|
|
354
|
+
var fieldValueHelp = dependents === null || dependents === void 0 ? void 0 : dependents.find(function (dependent) {
|
|
355
|
+
return dependent.getId() === fieldHelp;
|
|
356
|
+
});
|
|
357
|
+
return fieldValueHelp;
|
|
358
|
+
},
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Colled on drop down selection of VHD option.
|
|
362
|
+
*
|
|
363
|
+
* @function
|
|
364
|
+
* @param {MassEditSelect} source Custom Mass Edit Select control.
|
|
365
|
+
* @param {string} propertyName Property path.
|
|
366
|
+
* @param {string} selectKey Previous key before the VHD was selected.
|
|
367
|
+
*/
|
|
368
|
+
_onVHSelect: function (source, propertyName, selectKey) {
|
|
369
|
+
// Called for
|
|
370
|
+
// 1. VHD selected.
|
|
371
|
+
var fieldInfoModel = source && source.getModel("fieldsInfo");
|
|
372
|
+
var propPath = fieldInfoModel.getProperty("/values/" + propertyName) && "/values/" || fieldInfoModel.getProperty("/unitData/" + propertyName) && "/unitData/";
|
|
373
|
+
var transCtx = source.getBindingContext();
|
|
374
|
+
|
|
375
|
+
var fieldValueHelp = MassEditHandlers._getValueHelp(transCtx, source.getParent());
|
|
376
|
+
|
|
377
|
+
if (!(fieldValueHelp !== null && fieldValueHelp !== void 0 && fieldValueHelp.getBindingContext())) {
|
|
378
|
+
fieldValueHelp === null || fieldValueHelp === void 0 ? void 0 : fieldValueHelp.setBindingContext(transCtx);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
source.fireValueHelpRequest();
|
|
382
|
+
fieldInfoModel.setProperty(propPath + propertyName + "/selectedKey", selectKey);
|
|
383
|
+
},
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* Gets Property name from selection key.
|
|
387
|
+
*
|
|
388
|
+
* @function
|
|
389
|
+
* @param {string} key Selection key.
|
|
390
|
+
* @returns Property name.
|
|
391
|
+
*/
|
|
392
|
+
_getPropertyNameFromKey: function (key) {
|
|
393
|
+
var propertyName = "";
|
|
394
|
+
|
|
395
|
+
if (key.startsWith("Default/") || key.startsWith("ClearFieldValue/") || key.startsWith("UseValueHelpValue/")) {
|
|
396
|
+
propertyName = key.substring(key.indexOf("/") + 1);
|
|
397
|
+
} else {
|
|
398
|
+
propertyName = key.substring(0, key.lastIndexOf("/"));
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
return propertyName;
|
|
402
|
+
},
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* Update selection to Custom Mass Edit Select from MDC field.
|
|
406
|
+
*
|
|
407
|
+
* @function
|
|
408
|
+
* @param {MDCField} source MDC field.
|
|
409
|
+
* @param {string} propertyName Property path.
|
|
410
|
+
* @param {string} value Value to update.
|
|
411
|
+
* @param {string} fullText Full text to use.
|
|
412
|
+
*/
|
|
413
|
+
_updateSelectKey: function (source, propertyName, value, fullText) {
|
|
414
|
+
// Called for
|
|
415
|
+
// 1. VHD property change
|
|
416
|
+
// 2. Out Parameters.
|
|
417
|
+
// 3. Transient context property change.
|
|
418
|
+
var massEditSelect = source.getContent();
|
|
419
|
+
|
|
420
|
+
if (!massEditSelect || !propertyName) {
|
|
421
|
+
return;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
var key = massEditSelect.getSelectedKey();
|
|
425
|
+
|
|
426
|
+
if ((key.startsWith("Default/") || key.startsWith("ClearFieldValue/")) && !value) {
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
var formattedText = MassEditHandlers._valueExists(fullText) ? fullText : value;
|
|
431
|
+
var fieldInfoModel = source && source.getModel("fieldsInfo");
|
|
432
|
+
var values = fieldInfoModel.getProperty("/values/" + propertyName) || fieldInfoModel.getProperty("/unitData/" + propertyName) || [];
|
|
433
|
+
var propPath = fieldInfoModel.getProperty("/values/" + propertyName) && "/values/" || fieldInfoModel.getProperty("/unitData/" + propertyName) && "/unitData/";
|
|
434
|
+
var relatedField = values.find(function (fieldData) {
|
|
435
|
+
var _fieldData$textInfo;
|
|
436
|
+
|
|
437
|
+
return (fieldData === null || fieldData === void 0 ? void 0 : (_fieldData$textInfo = fieldData.textInfo) === null || _fieldData$textInfo === void 0 ? void 0 : _fieldData$textInfo.value) === value || fieldData.text === value;
|
|
438
|
+
});
|
|
439
|
+
|
|
440
|
+
if (relatedField) {
|
|
441
|
+
if (fullText && relatedField.textInfo && relatedField.textInfo.descriptionPath && (relatedField.text != formattedText || relatedField.textInfo.fullText != formattedText)) {
|
|
442
|
+
// Update the full text only when provided.
|
|
443
|
+
relatedField.text = formattedText;
|
|
444
|
+
relatedField.textInfo.fullText = formattedText;
|
|
445
|
+
relatedField.textInfo.description = source.getAdditionalValue();
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
if (relatedField.key === key) {
|
|
449
|
+
fieldInfoModel.setProperty(propPath + propertyName + "/selectedKey", key);
|
|
450
|
+
return;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
key = relatedField.key;
|
|
454
|
+
} else if ([undefined, null, ""].indexOf(value) === -1) {
|
|
455
|
+
key = propertyName + "/" + value;
|
|
456
|
+
var selectionInfo = {
|
|
457
|
+
text: formattedText,
|
|
458
|
+
key: key,
|
|
459
|
+
textInfo: {
|
|
460
|
+
description: source.getAdditionalValue(),
|
|
461
|
+
descriptionPath: values && values.textInfo && values.textInfo.descriptionPath,
|
|
462
|
+
fullText: formattedText,
|
|
463
|
+
textArrangement: source.getDisplay(),
|
|
464
|
+
value: source.getValue(),
|
|
465
|
+
valuePath: propertyName
|
|
466
|
+
}
|
|
467
|
+
};
|
|
468
|
+
values.push(selectionInfo);
|
|
469
|
+
values.selectOptions = values.selectOptions || [];
|
|
470
|
+
values.selectOptions.push(selectionInfo);
|
|
471
|
+
fieldInfoModel.setProperty(propPath + propertyName, values);
|
|
472
|
+
} else {
|
|
473
|
+
key = "Default/" + propertyName;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
fieldInfoModel.setProperty(propPath + propertyName + "/selectedKey", key);
|
|
477
|
+
|
|
478
|
+
MassEditHandlers._updateResults(massEditSelect);
|
|
479
|
+
},
|
|
480
|
+
|
|
481
|
+
/**
|
|
482
|
+
* Get Value from Drop down.
|
|
483
|
+
*
|
|
484
|
+
* @function
|
|
485
|
+
* @param {Control} source Drop down control.
|
|
486
|
+
* @returns {string} Value of selection.
|
|
487
|
+
*/
|
|
488
|
+
_getValue: function (source) {
|
|
489
|
+
var _getSelectedItem;
|
|
490
|
+
|
|
491
|
+
return source.getMetadata().getName() === "sap.fe.core.controls.MassEditSelect" ? (_getSelectedItem = source.getSelectedItem()) === null || _getSelectedItem === void 0 ? void 0 : _getSelectedItem.getText() : source.getValue();
|
|
492
|
+
},
|
|
493
|
+
_getValueOnEmpty: function (oSource, fieldsInfoModel, value, sPropertyName) {
|
|
494
|
+
if (!value) {
|
|
495
|
+
var values = fieldsInfoModel.getProperty("/values/".concat(sPropertyName)) || fieldsInfoModel.getProperty("/unitData/".concat(sPropertyName)) || [];
|
|
496
|
+
|
|
497
|
+
if (values.unitProperty) {
|
|
498
|
+
value = 0;
|
|
499
|
+
oSource.setValue(value);
|
|
500
|
+
} else if (values.inputType === "CheckBox") {
|
|
501
|
+
value = null;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
return value;
|
|
506
|
+
},
|
|
507
|
+
_valueExists: function (value) {
|
|
508
|
+
return value != undefined && value != null;
|
|
509
|
+
},
|
|
510
|
+
|
|
511
|
+
/**
|
|
512
|
+
* Updates selections to runtime model.
|
|
513
|
+
*
|
|
514
|
+
* @function
|
|
515
|
+
* @param {Control} oSource Drop down control.
|
|
516
|
+
* @param {Array} aParams Parts of key in runtime model.
|
|
517
|
+
* @param {boolean} updateTransCtx Should transient context be updated with the value.
|
|
518
|
+
*/
|
|
519
|
+
_updateResults: function (oSource) {
|
|
520
|
+
var aParams = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
521
|
+
var updateTransCtx = arguments.length > 2 ? arguments[2] : undefined;
|
|
522
|
+
// Called for
|
|
523
|
+
// 1. VHD property change.
|
|
524
|
+
// 2. Out parameter.
|
|
525
|
+
// 3. transient context property change.
|
|
526
|
+
var fieldsInfoModel = oSource && oSource.getModel("fieldsInfo");
|
|
527
|
+
var oFieldsInfoData = fieldsInfoModel && fieldsInfoModel.getData();
|
|
528
|
+
|
|
529
|
+
var value = MassEditHandlers._getValue(oSource);
|
|
530
|
+
|
|
531
|
+
aParams = aParams.length > 0 ? aParams : oSource && oSource.getSelectedKey() && oSource.getSelectedKey().split("/");
|
|
532
|
+
var oDataObject;
|
|
533
|
+
var sPropertyName = oSource.getId().substring(oSource.getId().lastIndexOf(":") + 1);
|
|
29
534
|
|
|
30
535
|
if (aParams[0] === "Default") {
|
|
31
536
|
oDataObject = {
|
|
@@ -33,29 +538,29 @@ sap.ui.define([], function () {
|
|
|
33
538
|
value: aParams[0]
|
|
34
539
|
};
|
|
35
540
|
} else if (aParams[0] === "ClearFieldValue") {
|
|
541
|
+
value = "";
|
|
542
|
+
value = MassEditHandlers._getValueOnEmpty(oSource, fieldsInfoModel, value, sPropertyName);
|
|
36
543
|
oDataObject = {
|
|
37
544
|
keyValue: aParams[1],
|
|
38
|
-
value:
|
|
545
|
+
value: value
|
|
39
546
|
};
|
|
40
547
|
} else if (!aParams) {
|
|
41
|
-
|
|
548
|
+
value = MassEditHandlers._getValueOnEmpty(oSource, fieldsInfoModel, value, sPropertyName);
|
|
42
549
|
oDataObject = {
|
|
43
550
|
keyValue: sPropertyName,
|
|
44
|
-
value:
|
|
551
|
+
value: value
|
|
45
552
|
};
|
|
46
553
|
} else {
|
|
47
|
-
var
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
554
|
+
var propertyName = aParams.slice(0, -1).join("/");
|
|
555
|
+
var propertyValues = fieldsInfoModel.getProperty("/values/" + propertyName) || fieldsInfoModel.getProperty("/unitData/" + propertyName) || [];
|
|
556
|
+
var relatedField = (propertyValues || []).find(function (oFieldData) {
|
|
557
|
+
var _oFieldData$textInfo;
|
|
558
|
+
|
|
559
|
+
return (oFieldData === null || oFieldData === void 0 ? void 0 : (_oFieldData$textInfo = oFieldData.textInfo) === null || _oFieldData$textInfo === void 0 ? void 0 : _oFieldData$textInfo.value) === value || oFieldData.text === value;
|
|
52
560
|
});
|
|
53
|
-
oDataObject =
|
|
54
|
-
keyValue:
|
|
55
|
-
value:
|
|
56
|
-
} : {
|
|
57
|
-
keyValue: aParams[0],
|
|
58
|
-
value: iValueIndex !== -1 ? oFieldsInfoData.values[aParams[0]][iValueIndex].text : oSource.getValue()
|
|
561
|
+
oDataObject = {
|
|
562
|
+
keyValue: propertyName,
|
|
563
|
+
value: relatedField.textInfo && MassEditHandlers._valueExists(relatedField.textInfo.value) ? relatedField.textInfo.value : relatedField.text
|
|
59
564
|
};
|
|
60
565
|
}
|
|
61
566
|
|
|
@@ -72,8 +577,18 @@ sap.ui.define([], function () {
|
|
|
72
577
|
} else {
|
|
73
578
|
oFieldsInfoData.results.push(oDataObject);
|
|
74
579
|
}
|
|
580
|
+
|
|
581
|
+
if (updateTransCtx) {
|
|
582
|
+
var transCtx = oSource.getBindingContext();
|
|
583
|
+
|
|
584
|
+
if (aParams[0] === "Default" || aParams[0] === "ClearFieldValue") {
|
|
585
|
+
transCtx.setProperty(oDataObject.keyValue, null);
|
|
586
|
+
} else if (oDataObject) {
|
|
587
|
+
transCtx.setProperty(oDataObject.keyValue, oDataObject.value);
|
|
588
|
+
}
|
|
589
|
+
}
|
|
75
590
|
}
|
|
76
591
|
};
|
|
77
592
|
return MassEditHandlers;
|
|
78
593
|
}, false);
|
|
79
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hc3NFZGl0SGFuZGxlcnMudHMiXSwibmFtZXMiOlsiTWFzc0VkaXRIYW5kbGVycyIsImhhbmRsZU1hc3NFZGl0Q2hhbmdlIiwib0V2ZW50Iiwib1NvdXJjZSIsImdldFNvdXJjZSIsImFQYXJhbXMiLCJnZXRTZWxlY3RlZEtleSIsInNwbGl0Iiwib0RpYWxvZyIsImdldFBhcmVudCIsIm9GaWVsZHNJbmZvRGF0YSIsImdldE1vZGVsIiwiZ2V0RGF0YSIsIm9EYXRhT2JqZWN0Iiwia2V5VmFsdWUiLCJ2YWx1ZSIsInNQcm9wZXJ0eU5hbWUiLCJnZXRJZCIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiZ2V0VmFsdWUiLCJhUmVsYXRlZEZpZWxkIiwidmFsdWVzIiwiZmlsdGVyIiwib0ZpZWxkRGF0YSIsInRleHQiLCJpVmFsdWVJbmRleCIsImZpbmRJbmRleCIsImRhdGEiLCJCb29sZWFuIiwidGV4dEluZm8iLCJiRXhpc3RpbmdFbGVtZW50aW5kZXgiLCJpIiwicmVzdWx0cyIsImxlbmd0aCIsInB1c2giXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU1BLGdCQUFnQixHQUFHO0FBQ3hCQyxJQUFBQSxvQkFBb0IsRUFBRSxVQUFTQyxNQUFULEVBQXNCO0FBQzNDLFVBQU1DLE9BQU8sR0FBR0QsTUFBTSxJQUFJQSxNQUFNLENBQUNFLFNBQVAsRUFBMUI7QUFDQSxVQUFNQyxPQUFPLEdBQUdGLE9BQU8sSUFBSUEsT0FBTyxDQUFDRyxjQUFSLEVBQVgsSUFBdUNILE9BQU8sQ0FBQ0csY0FBUixHQUF5QkMsS0FBekIsQ0FBK0IsR0FBL0IsQ0FBdkQ7QUFDQSxVQUFNQyxPQUFPLEdBQ1pMLE9BQU8sSUFDUEEsT0FBTyxDQUNMTSxTQURGLEdBRUVBLFNBRkYsR0FHRUEsU0FIRixHQUlFQSxTQUpGLEVBRkQ7QUFPQSxVQUFNQyxlQUFlLEdBQUdG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LEtBQXdDRCxXQUFXLENBQUNDLFFBQXhELEVBQWtFO0FBQ2pFaUIsVUFBQUEscUJBQXFCLEdBQUdDLENBQXhCO0FBQ0E7QUFDRDs7QUFDRCxVQUFJRCxxQkFBcUIsS0FBSyxDQUFDLENBQS9CLEVBQWtDO0FBQ2pDckIsUUFBQUEsZUFBZSxDQUFDdUIsT0FBaEIsQ0FBd0JGLHFCQUF4QixJQUFpRGxCLFdBQWpEO0FBQ0EsT0FGRCxNQUVPO0FBQ05ILFFBQUFBLGVBQWUsQ0FBQ3VCLE9BQWhCLENBQXdCRSxJQUF4QixDQUE2QnRCLFdBQTdCO0FBQ0E7QUFDRDtBQXhEdUIsR0FBekI7U0EyRGViLGdCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnN0cnVjdG9yIGZvciBhIG5ldyBWaXN1YWwgRmlsdGVyIENvbnRhaW5lci5cbiAqIFVzZWQgZm9yIHZpc3VhbCBmaWx0ZXJzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtzSWRdIElEIGZvciB0aGUgbmV3IGNvbnRyb2wsIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGlmIG5vIElEIGlzIGdpdmVuXG4gKiBAZXh0ZW5kcyBzYXAudWkubWRjLmZpbHRlcmJhci5JRmlsdGVyQ29udGFpbmVyXG4gKiBAY2xhc3NcbiAqIEBwcml2YXRlXG4gKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbHMuZmlsdGVyYmFyLlZpc3VhbEZpbHRlckNvbnRhaW5lclxuICovXG5jb25zdCBNYXNzRWRpdEhhbmRsZXJzID0ge1xuXHRoYW5kbGVNYXNzRWRpdENoYW5nZTogZnVuY3Rpb24ob0V2ZW50OiBhbnkpIHtcblx0XHRjb25zdCBvU291cmNlID0gb0V2ZW50ICYmIG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRjb25zdCBhUGFyYW1zID0gb1NvdXJjZSAmJiBvU291cmNlLmdldFNlbGVjdGVkS2V5KCkgJiYgb1NvdXJjZS5nZXRTZWxlY3RlZEtleSgpLnNwbGl0KFwiL1wiKTtcblx0XHRjb25zdCBvRGlhbG9nID1cblx0XHRcdG9Tb3VyY2UgJiZcblx0XHRcdG9Tb3VyY2Vcblx0XHRcdFx0LmdldFBhcmVudCgpXG5cdFx0XHRcdC5nZXRQYXJlbnQoKVxuXHRcdFx0XHQuZ2V0UGFyZW50KClcblx0XHRcdFx0LmdldFBhcmVudCgpO1xuXHRcdGNvbnN0IG9GaWVsZHNJbmZvRGF0YSA9IG9EaWFsb2cgJiYgb0RpYWxvZy5nZXRNb2RlbChcImZpZWxkc0luZm9cIikuZ2V0RGF0YSgpO1xuXHRcdGxldCBvRGF0YU9iamVjdDtcblx0XHQvL1RPRE8gLSBWYWx1ZSBIZWxwIEhhbmRsaW5nIExvYWQgVmFsdWUgSGVscCB3aGVuIHJlc3BlY3RpdmUgdmFsdWUgaXMgc2VsZWN0ZWQgaW4gY29tYm8gQm94IGluIGRpYWxvZ1xuXHRcdC8qXG5cdFx0XHRcdGlmIChhUGFyYW1zWzBdID09PSBcIlZhbHVlSGVscFwiKSB7XG5cdFx0XHRcdH0gKi9cblx0XHRpZiAoYVBhcmFtc1swXSA9PT0gXCJEZWZhdWx0XCIpIHtcblx0XHRcdG9EYXRhT2JqZWN0ID0geyBrZXlWYWx1ZTogYVBhcmFtc1sxXSwgdmFsdWU6IGFQYXJhbXNbMF0gfTtcblx0XHR9IGVsc2UgaWYgKGFQYXJhbXNbMF0gPT09IFwiQ2xlYXJGaWVsZFZhbHVlXCIpIHtcblx0XHRcdG9EYXRhT2JqZWN0ID0geyBrZXlWYWx1ZTogYVBhcmFtc1sxXSwgdmFsdWU6IFwiXCIgfTtcblx0XHR9IGVsc2UgaWYgKCFhUGFyYW1zKSB7XG5cdFx0XHRjb25zdCBzUHJvcGVydHlOYW1lID0gb1NvdXJjZS5nZXRJZCgpLnN1YnN0cmluZyhvU291cmNlLmdldElkKCkubGFzdEluZGV4T2YoXCI6XCIpICsgMSk7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHtcblx0XHRcdFx0a2V5VmFsdWU6IHNQcm9wZXJ0eU5hbWUsXG5cdFx0XHRcdHZhbHVlOiBvU291cmNlLmdldFZhbHVlKClcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGFSZWxhdGVkRmllbGQgPVxuXHRcdFx0XHRhUGFyYW1zWzBdICYmXG5cdFx0XHRcdG9GaWVsZHNJbmZvRGF0YS52YWx1ZXMgJiZcblx0XHRcdFx0b0ZpZWxkc0luZm9EYXRhLnZhbHVlc1thUGFyYW1zWzBdXS5maWx0ZXIoZnVuY3Rpb24ob0ZpZWxkRGF0YTogYW55KSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9GaWVsZERhdGEudGV4dCA9PT0gb1NvdXJjZS5nZXRWYWx1ZSgpO1xuXHRcdFx0XHR9KTtcblx0XHRcdGNvbnN0IGlWYWx1ZUluZGV4ID0gb0ZpZWxkc0luZm9EYXRhLnZhbHVlc1thUGFyYW1zWzBdXS5maW5kSW5kZXgoZnVuY3Rpb24oZGF0YTogYW55KSB7XG5cdFx0XHRcdHJldHVybiB0eXBlb2YgZGF0YS50ZXh0ID09PSBcImJvb2xlYW5cIiAmJiBkYXRhLnRleHQgPT09IEJvb2xlYW4ob1NvdXJjZS5nZXRWYWx1ZSgpKTtcblx0XHRcdH0pO1xuXHRcdFx0b0RhdGFPYmplY3QgPVxuXHRcdFx0XHRhUmVsYXRlZEZpZWxkICYmIGFSZWxhdGVkRmllbGRbMF0gJiYgYVJlbGF0ZWRGaWVsZFswXS50ZXh0SW5mb1xuXHRcdFx0XHRcdD8geyBrZXlWYWx1ZTogYVBhcmFtc1swXSwgdmFsdWU6IGFSZWxhdGVkRmllbGRbMF0udGV4dEluZm8udmFsdWUgfVxuXHRcdFx0XHRcdDoge1xuXHRcdFx0XHRcdFx0XHRrZXlWYWx1ZTogYVBhcmFtc1swXSxcblx0XHRcdFx0XHRcdFx0dmFsdWU6IGlWYWx1ZUluZGV4ICE9PSAtMSA/IG9GaWVsZHNJbmZvRGF0YS52YWx1ZXNbYVBhcmFtc1swXV1baVZhbHVlSW5kZXhdLnRleHQgOiBvU291cmNlLmdldFZhbHVlKClcblx0XHRcdFx0XHQgIH07XG5cdFx0fVxuXHRcdGxldCBiRXhpc3RpbmdFbGVtZW50aW5kZXggPSAtMTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG9GaWVsZHNJbmZvRGF0YS5yZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAob0ZpZWxkc0luZm9EYXRhLnJlc3VsdHNbaV0ua2V5VmFsdWUgPT09IG9EYXRhT2JqZWN0LmtleVZhbHVlKSB7XG5cdFx0XHRcdGJFeGlzdGluZ0VsZW1lbnRpbmRleCA9IGk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChiRXhpc3RpbmdFbGVtZW50aW5kZXggIT09IC0xKSB7XG5cdFx0XHRvRmllbGRzSW5mb0RhdGEucmVzdWx0c1tiRXhpc3RpbmdFbGVtZW50aW5kZXhdID0gb0RhdGFPYmplY3Q7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9GaWVsZHNJbmZvRGF0YS5yZXN1bHRzLnB1c2gob0RhdGFPYmplY3QpO1xuXHRcdH1cblx0fVxufTtcblxuZXhwb3J0IGRlZmF1bHQgTWFzc0VkaXRIYW5kbGVycztcbiJdfQ==
|
|
594
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hc3NFZGl0SGFuZGxlcnMudHMiXSwibmFtZXMiOlsiTWFzc0VkaXRIYW5kbGVycyIsImNvbnRleHRQcm9wZXJ0eUNoYW5nZSIsIm5ld1ZhbHVlIiwiZGF0YVByb3BlcnR5IiwibWRjRmllbGRJZCIsInNvdXJjZSIsIkNvcmUiLCJieUlkIiwidHJhbnNDdHgiLCJnZXRCaW5kaW5nQ29udGV4dCIsImZpZWxkSW5mb01vZGVsIiwiZ2V0TW9kZWwiLCJ2YWx1ZXMiLCJnZXRQcm9wZXJ0eSIsImlucHV0VHlwZSIsInZhbHVlTGlzdEluZm8iLCJfc2V0VmFsdWVMaXN0SW5mbyIsImlzRGlhbG9nT3BlbiIsImdldFZpc2libGUiLCJfdXBkYXRlU2VsZWN0S2V5IiwiaGFuZGxlTURDRmllbGRDaGFuZ2UiLCJldmVudCIsInByb3BlcnR5TmFtZSIsImdldFNvdXJjZSIsImNoYW5nZVByb21pc2UiLCJnZXRQYXJhbWV0ZXIiLCJjb21ib0JveCIsImdldENvbnRlbnQiLCJ0aGVuIiwiX3VwZGF0ZVNlbGVjdEtleUZvck1EQ0ZpZWxkQ2hhbmdlIiwiYmluZCIsImNhdGNoIiwiZXJyIiwiTG9nIiwid2FybmluZyIsImhhbmRsZVNlbGVjdGlvbkNoYW5nZSIsImtleSIsImdldFNlbGVjdGVkS2V5IiwicGFyYW1zIiwic3BsaXQiLCJwcmV2SXRlbSIsInNlbGVjdEtleSIsImdldEtleSIsInNsaWNlIiwiam9pbiIsIl9vblZIU2VsZWN0IiwiX2dldFByb3BlcnR5TmFtZUZyb21LZXkiLCJfdXBkYXRlU3VnZ2VzdGlvbkZvckZpZWxkc1dpdGhJblBhcmFtZXRlcnMiLCJzdGFydHNXaXRoIiwiX3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoT3V0UGFyYW1ldGVycyIsIl91cGRhdGVSZXN1bHRzIiwidmFsdWUiLCJmb3JtYXR0ZWRWYWx1ZSIsImdldEZvcm1Gb3JtYXR0ZWRWYWx1ZSIsInJlc2V0VmFsdWVzIiwia2VlcEV4aXN0aW5nU2VsZWN0aW9uIiwidW5pdERhdGEiLCJmaWVsZFBhdGhzIiwiT2JqZWN0Iiwia2V5cyIsInVuaXRGaWVsZFBhdGhzIiwiZm9yRWFjaCIsIl91cGRhdGVJblBhcmFtZXRlclN1Z2dldGlvbnMiLCJwYXRoUHJlZml4Iiwic3JjUHJvcGVydHlOYW1lIiwiaW5QYXJhbWV0ZXJzIiwibGVuZ3RoIiwiaW5jbHVkZXMiLCJfdXBkYXRlRmllbGRQYXRoU3VnZ2VzdGlvbnMiLCJvdXRQYXJhbWV0ZXJzIiwiX3VwZGF0ZU91dFBhcmFtZXRlclN1Z2dldGlvbnMiLCJvdXRQYXJhbWV0ZXIiLCJmaWVsZFBhdGhBYnNvbHV0ZSIsIm9wdGlvbnMiLCJkZWZhdWx0T3B0aW9ucyIsInNlbGVjdGVkS2V5IiwiZXhpc3RpbmdTZWxlY3Rpb24iLCJmaW5kIiwib3B0aW9uIiwic2VsZWN0T3B0aW9ucyIsImRlZmF1bHRPcHRpb24iLCJwdXNoIiwic2VsZWN0T3B0aW9uIiwic2V0UHJvcGVydHkiLCJwcm9wUGF0aCIsImZpZWxkVmFsdWVIZWxwIiwiX2dldFZhbHVlSGVscCIsImdldERpYWxvZ0NvbnRlbnQiLCJnZXRUYWJsZSIsImdldEluUGFyYW1ldGVycyIsIm1hcCIsImluUGFyYW0iLCJnZXRGaWVsZFBhdGgiLCJvdXRQYXJhbSIsImluZm8iLCJfcmVxdWVzdFZhbHVlTGlzdCIsIm1ldGFQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXRNZXRhUGF0aEZvckNvbnRleHQiLCJwcm9wZXJ0eVBhdGgiLCJkZXBlbmRlbnRzIiwiZ2V0RGVwZW5kZW50cyIsImZpZWxkSGVscCIsImdldEZpZWxkSGVscCIsImRlcGVuZGVudCIsImdldElkIiwic2V0QmluZGluZ0NvbnRleHQiLCJtZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJWYWx1ZUxpc3RIZWxwZXIiLCJjcmVhdGVWSFVJTW9kZWwiLCJnZXRWYWx1ZUxpc3RJbmZvIiwidkxpbmZvIiwiZ2V0UGFyZW50IiwiZmlyZVZhbHVlSGVscFJlcXVlc3QiLCJzdWJzdHJpbmciLCJpbmRleE9mIiwibGFzdEluZGV4T2YiLCJmdWxsVGV4dCIsIm1hc3NFZGl0U2VsZWN0IiwiZm9ybWF0dGVkVGV4dCIsIl92YWx1ZUV4aXN0cyIsInJlbGF0ZWRGaWVsZCIsImZpZWxkRGF0YSIsInRleHRJbmZvIiwidGV4dCIsImRlc2NyaXB0aW9uUGF0aCIsImRlc2NyaXB0aW9uIiwiZ2V0QWRkaXRpb25hbFZhbHVlIiwidW5kZWZpbmVkIiwic2VsZWN0aW9uSW5mbyIsInRleHRBcnJhbmdlbWVudCIsImdldERpc3BsYXkiLCJnZXRWYWx1ZSIsInZhbHVlUGF0aCIsIl9nZXRWYWx1ZSIsImdldE1ldGFkYXRhIiwiZ2V0TmFtZSIsImdldFNlbGVjdGVkSXRlbSIsImdldFRleHQiLCJfZ2V0VmFsdWVPbkVtcHR5Iiwib1NvdXJjZSIsImZpZWxkc0luZm9Nb2RlbCIsInNQcm9wZXJ0eU5hbWUiLCJ1bml0UHJvcGVydHkiLCJzZXRWYWx1ZSIsImFQYXJhbXMiLCJ1cGRhdGVUcmFuc0N0eCIsIm9GaWVsZHNJbmZvRGF0YSIsImdldERhdGEiLCJvRGF0YU9iamVjdCIsImtleVZhbHVlIiwicHJvcGVydHlWYWx1ZXMiLCJvRmllbGREYXRhIiwiYkV4aXN0aW5nRWxlbWVudGluZGV4IiwiaSIsInJlc3VsdHMiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFxQkEsTUFBTUEsZ0JBQXFCLEdBQUc7QUFDN0I7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDQyxJQUFBQSxxQkFBcUIsRUFBRSxVQUFVQyxRQUFWLEVBQXlCQyxZQUF6QixFQUErQ0MsVUFBL0MsRUFBbUU7QUFDekY7QUFDQTtBQUNBO0FBRUEsVUFBTUMsTUFBTSxHQUFHQyxJQUFJLENBQUNDLElBQUwsQ0FBVUgsVUFBVixDQUFmO0FBQ0EsVUFBTUksUUFBUSxHQUFHSCxNQUFNLElBQUtBLE1BQU0sQ0FBQ0ksaUJBQVAsRUFBNUI7QUFDQSxVQUFNQyxjQUFjLEdBQUdMLE1BQU0sSUFBS0EsTUFBTSxDQUFDTSxRQUFQLENBQWdCLFlBQWhCLENBQWxDO0FBQ0EsVUFB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TUFBNUMsRUFBb0R5RixDQUFDLEVBQXJELEVBQXlEO0FBQ3hELFlBQUlQLGVBQWUsQ0FBQ1EsT0FBaEIsQ0FBd0JELENBQXhCLEVBQTJCSixRQUEzQixLQUF3Q0QsV0FBVyxDQUFDQyxRQUF4RCxFQUFrRTtBQUNqRUcsVUFBQUEscUJBQXFCLEdBQUdDLENBQXhCO0FBQ0E7QUFDRDs7QUFDRCxVQUFJRCxxQkFBcUIsS0FBSyxDQUFDLENBQS9CLEVBQWtDO0FBQ2pDTixRQUFBQSxlQUFlLENBQUNRLE9BQWhCLENBQXdCRixxQkFBeEIsSUFBaURKLFdBQWpEO0FBQ0EsT0FGRCxNQUVPO0FBQ05GLFFBQUFBLGVBQWUsQ0FBQ1EsT0FBaEIsQ0FBd0IzRSxJQUF4QixDQUE2QnFFLFdBQTdCO0FBQ0E7O0FBQ0QsVUFBSUgsY0FBSixFQUFvQjtBQUNuQixZQUFNM0ksUUFBUSxHQUFHcUksT0FBTyxDQUFDcEksaUJBQVIsRUFBakI7O0FBQ0EsWUFBSXlJLE9BQU8sQ0FBQyxDQUFELENBQVAsS0FBZSxTQUFmLElBQTRCQSxPQUFPLENBQUMsQ0FBRCxDQUFQLEtBQWUsaUJBQS9DLEVBQWtFO0FBQ2pFMUksVUFBQUEsUUFBUSxDQUFDMkUsV0FBVCxDQUFxQm1FLFdBQVcsQ0FBQ0MsUUFBakMsRUFBMkMsSUFBM0M7QUFDQSxTQUZELE1BRU8sSUFBSUQsV0FBSixFQUFpQjtBQUN2QjlJLFVBQUFBLFFBQVEsQ0FBQzJFLFdBQVQsQ0FBcUJtRSxXQUFXLENBQUNDLFFBQWpDLEVBQTJDRCxXQUFXLENBQUNuRyxLQUF2RDtBQUNBO0FBQ0Q7QUFDRDtBQXBtQjRCLEdBQTlCO1NBdW1CZW5ELGdCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnN0cnVjdG9yIGZvciBhIG5ldyBWaXN1YWwgRmlsdGVyIENvbnRhaW5lci5cbiAqIFVzZWQgZm9yIHZpc3VhbCBmaWx0ZXJzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtzSWRdIElEIGZvciB0aGUgbmV3IGNvbnRyb2wsIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGlmIG5vIElEIGlzIGdpdmVuXG4gKiBAZXh0ZW5kcyBzYXAudWkubWRjLmZpbHRlcmJhci5JRmlsdGVyQ29udGFpbmVyXG4gKiBAY2xhc3NcbiAqIEBwcml2YXRlXG4gKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbHMuZmlsdGVyYmFyLlZpc3VhbEZpbHRlckNvbnRhaW5lclxuICovXG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFZhbHVlTGlzdEhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC92YWx1ZWhlbHAvVmFsdWVMaXN0SGVscGVyXCI7XG5pbXBvcnQgQ29tYm9Cb3ggZnJvbSBcInNhcC9tL0NvbWJvQm94XCI7XG5pbXBvcnQgU2VsZWN0IGZyb20gXCJzYXAvbS9TZWxlY3RcIjtcbmltcG9ydCBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IEZpZWxkIGZyb20gXCJzYXAvdWkvbWRjL0ZpZWxkXCI7XG5pbXBvcnQgSW5QYXJhbWV0ZXIgZnJvbSBcInNhcC91aS9tZGMvZmllbGQvSW5QYXJhbWV0ZXJcIjtcbmltcG9ydCBPdXRQYXJhbWV0ZXIgZnJvbSBcInNhcC91aS9tZGMvZmllbGQvT3V0UGFyYW1ldGVyXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuXG5jb25zdCBNYXNzRWRpdEhhbmRsZXJzOiBhbnkgPSB7XG5cdC8qKlxuXHQgKiBDYWxsZWQgZm9yIHByb3BlcnR5IGNoYW5nZSBpbiB0aGUgdHJhbnNpZW50IGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge2FueX0gbmV3VmFsdWUgTmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IGRhdGFQcm9wZXJ0eSBGaW5hbCBjb250ZXh0IHJldHVybmVkIGFmdGVyIHRoZSBwYWdpbmF0b3IgYWN0aW9uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtZGNGaWVsZElkIEZpbmFsIGNvbnRleHQgcmV0dXJuZWQgYWZ0ZXIgdGhlIHBhZ2luYXRvciBhY3Rpb25cblx0ICovXG5cdGNvbnRleHRQcm9wZXJ0eUNoYW5nZTogZnVuY3Rpb24gKG5ld1ZhbHVlOiBhbnksIGRhdGFQcm9wZXJ0eTogc3RyaW5nLCBtZGNGaWVsZElkOiBzdHJpbmcpIHtcblx0XHQvLyBDYWxsZWQgZm9yXG5cdFx0Ly8gMS4gT3V0IFBhcmFtZXRlcnMuXG5cdFx0Ly8gMi4gVHJhbnNpZW50IGNvbnRleHQgcHJvcGVydHkgY2hhbmdlLlxuXG5cdFx0Y29uc3Qgc291cmNlID0gQ29yZS5ieUlkKG1kY0ZpZWxkSWQpIGFzIEZpZWxkO1xuXHRcdGNvbnN0IHRyYW5zQ3R4ID0gc291cmNlICYmIChzb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KTtcblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdGNvbnN0IHZhbHVlcyA9XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXMvXCIgKyBkYXRhUHJvcGVydHkpIHx8IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KFwiL3VuaXREYXRhL1wiICsgZGF0YVByb3BlcnR5KSB8fCBbXTtcblxuXHRcdGlmICh0cmFuc0N0eCAmJiAodmFsdWVzLmlucHV0VHlwZSA9PT0gXCJJbnB1dFdpdGhWYWx1ZUhlbHBcIiB8fCB2YWx1ZXMuaW5wdXRUeXBlID09PSBcIklucHV0V2l0aFVuaXRcIikgJiYgIXZhbHVlcy52YWx1ZUxpc3RJbmZvKSB7XG5cdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl9zZXRWYWx1ZUxpc3RJbmZvKHRyYW5zQ3R4LCBzb3VyY2UsIGZpZWxkSW5mb01vZGVsLCBkYXRhUHJvcGVydHkpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGlzRGlhbG9nT3BlbiA9IGZpZWxkSW5mb01vZGVsICYmIGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KFwiL2lzT3BlblwiKTtcblx0XHRpZiAoIWlzRGlhbG9nT3BlbiB8fCAhc291cmNlLmdldFZpc2libGUoKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVNlbGVjdEtleShzb3VyY2UsIGRhdGFQcm9wZXJ0eSwgbmV3VmFsdWUpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDYWxsZWQgZm9yIGNoYW5nZSBpbiB0aGUgTURDIGZpZWxkLlxuXHQgKiBUaGlzIGlzIGNhbGxlZCBvbiBzZWxlY3Rpb24gZG9uZSB0aHJvdWdoIFZIRC5cblx0ICogVGhpcyBpcyBub3QgY2FsbGVkIG9uIGNoYW5nZSBvZiB0aGUgZHJvcGRvd24gYXMgd2UgYXJlIHVzaW5nIGEgY3VzdG9tIE1hc3NFZGl0U2VsZWN0IGNvbnRyb2wgYW5kIG5vdCBnZW5lcmFsIFNlbGVjdC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3QgZm9yIGNoYW5nZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoLlxuXHQgKi9cblx0aGFuZGxlTURDRmllbGRDaGFuZ2U6IGZ1bmN0aW9uIChldmVudDogYW55LCBwcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuXHRcdC8vIENhbGxlZCBmb3Jcblx0XHQvLyAxLiBWSEQgcHJvcGVydHkgY2hhbmdlLlxuXG5cdFx0Y29uc3Qgc291cmNlID0gZXZlbnQgJiYgZXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0Y29uc3QgY2hhbmdlUHJvbWlzZSA9IGV2ZW50ICYmIGV2ZW50LmdldFBhcmFtZXRlcihcInByb21pc2VcIik7XG5cdFx0Y29uc3QgY29tYm9Cb3ggPSBzb3VyY2UuZ2V0Q29udGVudCgpO1xuXHRcdGlmICghY29tYm9Cb3ggfHwgIXByb3BlcnR5TmFtZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNoYW5nZVByb21pc2Vcblx0XHRcdC50aGVuKE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVNlbGVjdEtleUZvck1EQ0ZpZWxkQ2hhbmdlLmJpbmQoTWFzc0VkaXRIYW5kbGVycywgc291cmNlLCBwcm9wZXJ0eU5hbWUpKVxuXHRcdFx0LmNhdGNoKChlcnI6IGFueSkgPT4ge1xuXHRcdFx0XHRMb2cud2FybmluZyhcIlZIRCBzZWxlY3Rpb24gY291bGRuJ3QgYmUgcG9wdWxhdGVkIGluIHRoZSBtYXNzIGVkaXQgZmllbGQuXCIgKyBlcnIpO1xuXHRcdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxlZCBmb3Igc2VsZWN0aW9uIGNoYW5nZSB0aHJvdWdoIHRoZSBkcm9wIGRvd24uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0IGZvciBjaGFuZ2UuXG5cdCAqL1xuXHRoYW5kbGVTZWxlY3Rpb25DaGFuZ2U6IGZ1bmN0aW9uIChldmVudDogYW55KSB7XG5cdFx0Ly8gQ2FsbGVkIGZvciBNYW51YWwgc2VsZWN0aW9uIGZyb20gZHJvcGRvd24oY29tYm9Cb3ggb3Igc2VsZWN0KVxuXHRcdC8vIDEuIFZIRCBzZWxlY3QuXG5cdFx0Ly8gMi4gQW55IHZhbHVlIGNoYW5nZSBpbiB0aGUgY29udHJvbC5cblxuXHRcdGNvbnN0IHNvdXJjZSA9IChldmVudCAmJiBldmVudC5nZXRTb3VyY2UoKSkgYXMgYW55O1xuXHRcdGNvbnN0IGtleSA9IHNvdXJjZS5nZXRTZWxlY3RlZEtleSgpIGFzIHN0cmluZztcblx0XHRjb25zdCBwYXJhbXMgPSBzb3VyY2UgJiYga2V5ICYmIGtleS5zcGxpdChcIi9cIik7XG5cdFx0bGV0IHByb3BlcnR5TmFtZTtcblxuXHRcdGlmIChwYXJhbXNbMF0gPT09IFwiVXNlVmFsdWVIZWxwVmFsdWVcIikge1xuXHRcdFx0Y29uc3QgcHJldkl0ZW0gPSBldmVudC5nZXRQYXJhbWV0ZXIoXCJwcmV2aW91c1NlbGVjdGVkSXRlbVwiKTtcblx0XHRcdGNvbnN0IHNlbGVjdEtleSA9IHByZXZJdGVtLmdldEtleSgpO1xuXHRcdFx0cHJvcGVydHlOYW1lID0gcGFyYW1zLnNsaWNlKDEpLmpvaW4oXCIvXCIpO1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fb25WSFNlbGVjdChzb3VyY2UsIHByb3BlcnR5TmFtZSwgc2VsZWN0S2V5KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdHByb3BlcnR5TmFtZSA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFByb3BlcnR5TmFtZUZyb21LZXkoa2V5KTtcblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aEluUGFyYW1ldGVycyhcblx0XHRcdGZpZWxkSW5mb01vZGVsLFxuXHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0a2V5LnN0YXJ0c1dpdGgoXCJEZWZhdWx0L1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIkNsZWFyRmllbGRWYWx1ZS9cIiksXG5cdFx0XHR0cnVlXG5cdFx0KTtcblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aE91dFBhcmFtZXRlcnMoXG5cdFx0XHRmaWVsZEluZm9Nb2RlbCxcblx0XHRcdHByb3BlcnR5TmFtZSxcblx0XHRcdGtleS5zdGFydHNXaXRoKFwiRGVmYXVsdC9cIikgfHwga2V5LnN0YXJ0c1dpdGgoXCJDbGVhckZpZWxkVmFsdWUvXCIpLFxuXHRcdFx0ZmFsc2Vcblx0XHQpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVJlc3VsdHMoc291cmNlLCBwYXJhbXMsIHRydWUpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc2VsZWN0aW9ucyB0byByZXN1bHRzIGFuZCB0aGUgc3VnZ2VzdHMgaW4gZHJvcCBkb3ducy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7TURDRmllbGR9IHNvdXJjZSBNREMgZmllbGQgdGhhdCB3YXMgY2hhbmdlZC5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoLlxuXHQgKiBAcGFyYW0ge2FueX0gdmFsdWUgTmV3IHZhbHVlLlxuXHQgKi9cblx0X3VwZGF0ZVNlbGVjdEtleUZvck1EQ0ZpZWxkQ2hhbmdlOiBmdW5jdGlvbiAoc291cmNlOiBhbnksIHByb3BlcnR5TmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG5cdFx0Y29uc3QgdHJhbnNDdHggPSBzb3VyY2UgJiYgc291cmNlLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgZmllbGRJbmZvTW9kZWwgPSBzb3VyY2UgJiYgKHNvdXJjZS5nZXRNb2RlbChcImZpZWxkc0luZm9cIikgYXMgSlNPTk1vZGVsKTtcblx0XHRjb25zdCB2YWx1ZXMgPVxuXHRcdFx0ZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzL1wiICsgcHJvcGVydHlOYW1lKSB8fCBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi91bml0RGF0YS9cIiArIHByb3BlcnR5TmFtZSkgfHwgW107XG5cblx0XHRpZiAodHJhbnNDdHggJiYgKHZhbHVlcy5pbnB1dFR5cGUgPT09IFwiSW5wdXRXaXRoVmFsdWVIZWxwXCIgfHwgdmFsdWVzLmlucHV0VHlwZSA9PT0gXCJJbnB1dFdpdGhVbml0XCIpICYmICF2YWx1ZXMudmFsdWVMaXN0SW5mbykge1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fc2V0VmFsdWVMaXN0SW5mbyh0cmFuc0N0eCwgc291cmNlLCBmaWVsZEluZm9Nb2RlbCwgcHJvcGVydHlOYW1lKTtcblx0XHR9XG5cblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aE91dFBhcmFtZXRlcnMoZmllbGRJbmZvTW9kZWwsIHByb3BlcnR5TmFtZSwgZmFsc2UsIHRydWUpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoSW5QYXJhbWV0ZXJzKGZpZWxkSW5mb01vZGVsLCBwcm9wZXJ0eU5hbWUsIGZhbHNlLCB0cnVlKTtcblxuXHRcdGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gc291cmNlLmdldEZvcm1Gb3JtYXR0ZWRWYWx1ZSgpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVNlbGVjdEtleShzb3VyY2UsIHByb3BlcnR5TmFtZSwgdmFsdWUsIGZvcm1hdHRlZFZhbHVlKTtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIHN1Z2dlc3RzIGZvciBhbGwgZHJvcCBkb3ducyB3aXRoIEluUGFyYW1ldGVyIGFzIHRoZSBwcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge0pTT05Nb2RlbH0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHtib29sZWFufSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIHtib29sZWFufSBrZWVwRXhpc3RpbmdTZWxlY3Rpb24gU2hvdWxkIHRoZSBleGlzdGluZyBzZWxlY3Rpb24gYmVmb3JlIHVwZGF0ZSByZW1haW4uXG5cdCAqL1xuXHRfdXBkYXRlU3VnZ2VzdGlvbkZvckZpZWxkc1dpdGhJblBhcmFtZXRlcnM6IGZ1bmN0aW9uIChcblx0XHRmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLFxuXHRcdHByb3BlcnR5TmFtZTogc3RyaW5nLFxuXHRcdHJlc2V0VmFsdWVzOiBib29sZWFuLFxuXHRcdGtlZXBFeGlzdGluZ1NlbGVjdGlvbjogYm9vbGVhblxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCB2YWx1ZXMgPSBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXNcIik7XG5cdFx0Y29uc3QgdW5pdERhdGEgPSBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi91bml0RGF0YVwiKTtcblx0XHRjb25zdCBmaWVsZFBhdGhzID0gT2JqZWN0LmtleXModmFsdWVzKTtcblx0XHRjb25zdCB1bml0RmllbGRQYXRocyA9IE9iamVjdC5rZXlzKHVuaXREYXRhKTtcblxuXHRcdGZpZWxkUGF0aHMuZm9yRWFjaChcblx0XHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZUluUGFyYW1ldGVyU3VnZ2V0aW9ucy5iaW5kKFxuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLFxuXHRcdFx0XHRmaWVsZEluZm9Nb2RlbCxcblx0XHRcdFx0XCIvdmFsdWVzL1wiLFxuXHRcdFx0XHRwcm9wZXJ0eU5hbWUsXG5cdFx0XHRcdHJlc2V0VmFsdWVzLFxuXHRcdFx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb25cblx0XHRcdClcblx0XHQpO1xuXHRcdHVuaXRGaWVsZFBhdGhzLmZvckVhY2goXG5cdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVJblBhcmFtZXRlclN1Z2dldGlvbnMuYmluZChcblx0XHRcdFx0TWFzc0VkaXRIYW5kbGVycyxcblx0XHRcdFx0ZmllbGRJbmZvTW9kZWwsXG5cdFx0XHRcdFwiL3VuaXREYXRhL1wiLFxuXHRcdFx0XHRwcm9wZXJ0eU5hbWUsXG5cdFx0XHRcdHJlc2V0VmFsdWVzLFxuXHRcdFx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb25cblx0XHRcdClcblx0XHQpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc3VnZ2VzdHMgZm9yIGEgZHJvcCBkb3duIHdpdGggSW5QYXJhbWV0ZXIgYXMgdGhlIHNyY1Byb3BlcnR5TmFtZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7SlNPTk1vZGVsfSBmaWVsZEluZm9Nb2RlbCBSdW50aW1lIG1vZGVsIHdpdGggcGFyYW1ldGVycyBzdG9yZSBpbmZvcm1hdGlvbi5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdGhQcmVmaXggUGF0aCBpbiB0aGUgcnVudGltZSBtb2RlbC5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNyY1Byb3BlcnR5TmFtZSBUaGUgSW5QYXJhbWV0ZXIgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHtib29sZWFufSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIHtib29sZWFufSBrZWVwRXhpc3RpbmdTZWxlY3Rpb24gU2hvdWxkIHRoZSBleGlzdGluZyBzZWxlY3Rpb24gYmVmb3JlIHVwZGF0ZSByZW1haW4uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aCB0aGF0IG5lZWRzIHVwZGF0ZSBvZiBzdWdnZXN0aW9ucy5cblx0ICovXG5cdF91cGRhdGVJblBhcmFtZXRlclN1Z2dldGlvbnM6IGZ1bmN0aW9uIChcblx0XHRmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLFxuXHRcdHBhdGhQcmVmaXg6IHN0cmluZyxcblx0XHRzcmNQcm9wZXJ0eU5hbWU6IHN0cmluZyxcblx0XHRyZXNldFZhbHVlczogYm9vbGVhbixcblx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb246IGJvb2xlYW4sXG5cdFx0cHJvcGVydHlOYW1lOiBzdHJpbmdcblx0KSB7XG5cdFx0Y29uc3QgdmFsdWVMaXN0SW5mbyA9IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KHBhdGhQcmVmaXggKyBwcm9wZXJ0eU5hbWUgKyBcIi92YWx1ZUxpc3RJbmZvXCIpO1xuXHRcdGlmICh2YWx1ZUxpc3RJbmZvICYmIHNyY1Byb3BlcnR5TmFtZSAhPSBwcm9wZXJ0eU5hbWUpIHtcblx0XHRcdGNvbnN0IGluUGFyYW1ldGVycyA9IHZhbHVlTGlzdEluZm8uaW5QYXJhbWV0ZXJzO1xuXHRcdFx0aWYgKGluUGFyYW1ldGVycyAmJiBpblBhcmFtZXRlcnMubGVuZ3RoID4gMCAmJiBpblBhcmFtZXRlcnMuaW5jbHVkZXMoc3JjUHJvcGVydHlOYW1lKSkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhmaWVsZEluZm9Nb2RlbCwgcGF0aFByZWZpeCArIHByb3BlcnR5TmFtZSwgcmVzZXRWYWx1ZXMsIGtlZXBFeGlzdGluZ1NlbGVjdGlvbik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc3VnZ2VzdHMgZm9yIGFsbCBPdXRQYXJhbWV0ZXIncyBkcm9wIGRvd25zIG9mIHRoZSBwcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge0pTT05Nb2RlbH0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHtib29sZWFufSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIHtib29sZWFufSBrZWVwRXhpc3RpbmdTZWxlY3Rpb24gU2hvdWxkIHRoZSBleGlzdGluZyBzZWxlY3Rpb24gYmVmb3JlIHVwZGF0ZSByZW1haW4uXG5cdCAqL1xuXHRfdXBkYXRlU3VnZ2VzdGlvbkZvckZpZWxkc1dpdGhPdXRQYXJhbWV0ZXJzOiBmdW5jdGlvbiAoXG5cdFx0ZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRwcm9wZXJ0eU5hbWU6IHN0cmluZyxcblx0XHRyZXNldFZhbHVlczogYm9vbGVhbixcblx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb246IGJvb2xlYW5cblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgdmFsdWVMaXN0SW5mbyA9XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXMvXCIgKyBwcm9wZXJ0eU5hbWUgKyBcIi92YWx1ZUxpc3RJbmZvXCIpIHx8XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi91bml0RGF0YS9cIiArIHByb3BlcnR5TmFtZSArIFwiL3ZhbHVlTGlzdEluZm9cIik7XG5cblx0XHRpZiAodmFsdWVMaXN0SW5mbyAmJiB2YWx1ZUxpc3RJbmZvLm91dFBhcmFtZXRlcnMpIHtcblx0XHRcdGNvbnN0IG91dFBhcmFtZXRlcnMgPSB2YWx1ZUxpc3RJbmZvLm91dFBhcmFtZXRlcnM7XG5cdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVPdXRQYXJhbWV0ZXJTdWdnZXRpb25zKG91dFBhcmFtZXRlcnMsIGZpZWxkSW5mb01vZGVsLCByZXNldFZhbHVlcywga2VlcEV4aXN0aW5nU2VsZWN0aW9uKTtcblx0XHRcdGNvbnN0IHBhdGhQcmVmaXggPVxuXHRcdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9YCkgJiYgYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9YCkgfHxcblx0XHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdW5pdERhdGEvJHtwcm9wZXJ0eU5hbWV9YCkgJiYgYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX1gKTtcblx0XHRcdGlmIChwYXRoUHJlZml4KSB7XG5cdFx0XHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZUZpZWxkUGF0aFN1Z2dlc3Rpb25zKGZpZWxkSW5mb01vZGVsLCBwYXRoUHJlZml4LCBmYWxzZSwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc3VnZ2VzdHMgZm9yIGEgZHJvcCBkb3duIHdpdGggSW5QYXJhbWV0ZXIgYXMgdGhlIHNyY1Byb3BlcnR5TmFtZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBvdXRQYXJhbWV0ZXJzIFN0cmluZyBhcnJhcnkgb2YgT3V0UGFyYW1ldGVyIHByb3BlcnR5IHBhdGhzLlxuXHQgKiBAcGFyYW0ge0pTT05Nb2RlbH0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVzZXRWYWx1ZXMgU2hvdWxkIHRoZSB2YWx1ZXMgYmUgcmVzZXQgdG8gb3JpZ2luYWwgc3RhdGUuXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uIFNob3VsZCB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIGJlZm9yZSB1cGRhdGUgcmVtYWluLlxuXHQgKi9cblx0X3VwZGF0ZU91dFBhcmFtZXRlclN1Z2dldGlvbnM6IGZ1bmN0aW9uIChcblx0XHRvdXRQYXJhbWV0ZXJzOiBzdHJpbmdbXSxcblx0XHRmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLFxuXHRcdHJlc2V0VmFsdWVzOiBib29sZWFuLFxuXHRcdGtlZXBFeGlzdGluZ1NlbGVjdGlvbjogYm9vbGVhblxuXHQpIHtcblx0XHRjb25zdCB2YWx1ZXMgPSBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXNcIik7XG5cdFx0Y29uc3QgdW5pdERhdGEgPSBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi91bml0RGF0YVwiKTtcblx0XHRjb25zdCBmaWVsZFBhdGhzID0gT2JqZWN0LmtleXModmFsdWVzKTtcblx0XHRjb25zdCB1bml0RmllbGRQYXRocyA9IE9iamVjdC5rZXlzKHVuaXREYXRhKTtcblxuXHRcdG91dFBhcmFtZXRlcnMuZm9yRWFjaCgob3V0UGFyYW1ldGVyOiBzdHJpbmcpID0+IHtcblx0XHRcdGlmIChmaWVsZFBhdGhzLmluY2x1ZGVzKG91dFBhcmFtZXRlcikpIHtcblx0XHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlRmllbGRQYXRoU3VnZ2VzdGlvbnMoZmllbGRJbmZvTW9kZWwsIFwiL3ZhbHVlcy9cIiArIG91dFBhcmFtZXRlciwgcmVzZXRWYWx1ZXMsIGtlZXBFeGlzdGluZ1NlbGVjdGlvbik7XG5cdFx0XHR9IGVsc2UgaWYgKHVuaXRGaWVsZFBhdGhzLmluY2x1ZGVzKG91dFBhcmFtZXRlcikpIHtcblx0XHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlRmllbGRQYXRoU3VnZ2VzdGlvbnMoXG5cdFx0XHRcdFx0ZmllbGRJbmZvTW9kZWwsXG5cdFx0XHRcdFx0XCIvdW5pdERhdGEvXCIgKyBvdXRQYXJhbWV0ZXIsXG5cdFx0XHRcdFx0cmVzZXRWYWx1ZXMsXG5cdFx0XHRcdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVwZGF0ZSBzdWdnZXN0cyBmb3IgYSBkcm9wIGRvd24gb2YgYSBmaWVsZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7SlNPTk1vZGVsfSBmaWVsZEluZm9Nb2RlbCBSdW50aW1lIG1vZGVsIHdpdGggcGFyYW1ldGVycyBzdG9yZSBpbmZvcm1hdGlvbi5cblx0ICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkUGF0aEFic29sdXRlIENvbXBsZXRlIHJ1bnRpbWUgcHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHtib29sZWFufSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIHtib29sZWFufSBrZWVwRXhpc3RpbmdTZWxlY3Rpb24gU2hvdWxkIHRoZSBleGlzdGluZyBzZWxlY3Rpb24gYmVmb3JlIHVwZGF0ZSByZW1haW4uXG5cdCAqL1xuXHRfdXBkYXRlRmllbGRQYXRoU3VnZ2VzdGlvbnM6IGZ1bmN0aW9uIChcblx0XHRmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLFxuXHRcdGZpZWxkUGF0aEFic29sdXRlOiBzdHJpbmcsXG5cdFx0cmVzZXRWYWx1ZXM6IGJvb2xlYW4sXG5cdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uOiBib29sZWFuXG5cdCkge1xuXHRcdGNvbnN0IG9wdGlvbnMgPSBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShmaWVsZFBhdGhBYnNvbHV0ZSk7XG5cdFx0Y29uc3QgZGVmYXVsdE9wdGlvbnMgPSBvcHRpb25zLmRlZmF1bHRPcHRpb25zO1xuXHRcdGNvbnN0IHNlbGVjdGVkS2V5ID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoZmllbGRQYXRoQWJzb2x1dGUgKyBcIi9zZWxlY3RlZEtleVwiKTtcblx0XHRjb25zdCBleGlzdGluZ1NlbGVjdGlvbiA9IGtlZXBFeGlzdGluZ1NlbGVjdGlvbiAmJiBvcHRpb25zLmZpbmQoKG9wdGlvbjogYW55KSA9PiBvcHRpb24ua2V5ID09PSBzZWxlY3RlZEtleSk7XG5cdFx0aWYgKHJlc2V0VmFsdWVzKSB7XG5cdFx0XHRjb25zdCBzZWxlY3RPcHRpb25zID0gb3B0aW9ucy5zZWxlY3RPcHRpb25zO1xuXHRcdFx0b3B0aW9ucy5sZW5ndGggPSAwO1xuXHRcdFx0ZGVmYXVsdE9wdGlvbnMuZm9yRWFjaCgoZGVmYXVsdE9wdGlvbjogYW55KSA9PiBvcHRpb25zLnB1c2goZGVmYXVsdE9wdGlvbikpO1xuXHRcdFx0c2VsZWN0T3B0aW9ucy5mb3JFYWNoKChzZWxlY3RPcHRpb246IGFueSkgPT4gb3B0aW9ucy5wdXNoKHNlbGVjdE9wdGlvbikpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvcHRpb25zLmxlbmd0aCA9IDA7XG5cdFx0XHRkZWZhdWx0T3B0aW9ucy5mb3JFYWNoKChkZWZhdWx0T3B0aW9uOiBhbnkpID0+IG9wdGlvbnMucHVzaChkZWZhdWx0T3B0aW9uKSk7XG5cdFx0fVxuXG5cdFx0ZmllbGRJbmZvTW9kZWwuc2V0UHJvcGVydHkoZmllbGRQYXRoQWJzb2x1dGUsIG9wdGlvbnMpO1xuXG5cdFx0aWYgKGV4aXN0aW5nU2VsZWN0aW9uICYmICFvcHRpb25zLmluY2x1ZGVzKGV4aXN0aW5nU2VsZWN0aW9uKSkge1xuXHRcdFx0b3B0aW9ucy5wdXNoKGV4aXN0aW5nU2VsZWN0aW9uKTtcblx0XHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KGZpZWxkUGF0aEFic29sdXRlICsgXCIvc2VsZWN0ZWRLZXlcIiwgc2VsZWN0ZWRLZXkpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIEluIGFuZCBPdXQgUGFyYW1ldGVycyBpbiB0aGUgTUVELlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtDb250ZXh0fSB0cmFuc0N0eCBUaGUgdHJhbnNpZW50IGNvbnRleHQgb2YgdGhlIE1FRC5cblx0ICogQHBhcmFtIHtNRENGaWVsZH0gc291cmNlIE1EQyBmaWVsZC5cblx0ICogQHBhcmFtIHtKU09OTW9kZWx9IGZpZWxkSW5mb01vZGVsIFJ1bnRpbWUgbW9kZWwgd2l0aCBwYXJhbWV0ZXJzIHN0b3JlIGluZm9ybWF0aW9uLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqL1xuXHRfc2V0VmFsdWVMaXN0SW5mbzogZnVuY3Rpb24gKHRyYW5zQ3R4OiBDb250ZXh0LCBzb3VyY2U6IEZpZWxkLCBmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IHByb3BQYXRoID1cblx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXMvXCIgKyBwcm9wZXJ0eU5hbWUpICYmIFwiL3ZhbHVlcy9cIikgfHxcblx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi91bml0RGF0YS9cIiArIHByb3BlcnR5TmFtZSkgJiYgXCIvdW5pdERhdGEvXCIpO1xuXG5cdFx0aWYgKGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAke3Byb3BQYXRofSR7cHJvcGVydHlOYW1lfS92YWx1ZUxpc3RJbmZvYCkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgZmllbGRWYWx1ZUhlbHAgPSBNYXNzRWRpdEhhbmRsZXJzLl9nZXRWYWx1ZUhlbHAodHJhbnNDdHgsIHNvdXJjZSk7XG5cdFx0aWYgKGZpZWxkVmFsdWVIZWxwICYmIGZpZWxkVmFsdWVIZWxwLmdldERpYWxvZ0NvbnRlbnQoKS5nZXRUYWJsZSgpKSB7XG5cdFx0XHRjb25zdCBpblBhcmFtZXRlcnMgPSAoZmllbGRWYWx1ZUhlbHAuZ2V0SW5QYXJhbWV0ZXJzKCkgfHwgW10pLm1hcCgoaW5QYXJhbTogSW5QYXJhbWV0ZXIpID0+IGluUGFyYW0uZ2V0RmllbGRQYXRoKCkpO1xuXHRcdFx0Y29uc3Qgb3V0UGFyYW1ldGVycyA9IChmaWVsZFZhbHVlSGVscC5nZXRJblBhcmFtZXRlcnMoKSB8fCBbXSkubWFwKChvdXRQYXJhbTogT3V0UGFyYW1ldGVyKSA9PiBvdXRQYXJhbS5nZXRGaWVsZFBhdGgoKSk7XG5cdFx0XHRjb25zdCBpbmZvOiBhbnkgPSB7XG5cdFx0XHRcdGluUGFyYW1ldGVyczogaW5QYXJhbWV0ZXJzLm1hcCgoaW5QYXJhbTogYW55KSA9PiBpblBhcmFtLmdldEZpZWxkUGF0aCgpKSxcblx0XHRcdFx0b3V0UGFyYW1ldGVyczogb3V0UGFyYW1ldGVycy5tYXAoKG91dFBhcmFtOiBhbnkpID0+IG91dFBhcmFtLmdldEZpZWxkUGF0aCgpKVxuXHRcdFx0fTtcblx0XHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KGAke3Byb3BQYXRofSR7cHJvcGVydHlOYW1lfS92YWx1ZUxpc3RJbmZvYCwgaW5mbyk7XG5cdFx0XHRpZiAoaW5mby5vdXRQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlRmllbGRQYXRoU3VnZ2VzdGlvbnMoZmllbGRJbmZvTW9kZWwsIGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWAsIGZhbHNlLCB0cnVlKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fcmVxdWVzdFZhbHVlTGlzdCh0cmFuc0N0eCwgc291cmNlLCBmaWVsZEluZm9Nb2RlbCwgcHJvcGVydHlOYW1lKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlcXVlc3QgYW5kIHVwZGF0ZSBJbiBhbmQgT3V0IFBhcmFtZXRlcnMgaW4gdGhlIE1FRC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7Q29udGV4dH0gdHJhbnNDdHggVGhlIHRyYW5zaWVudCBjb250ZXh0IG9mIHRoZSBNRUQuXG5cdCAqIEBwYXJhbSB7TURDRmllbGR9IHNvdXJjZSBNREMgZmllbGQuXG5cdCAqIEBwYXJhbSB7SlNPTk1vZGVsfSBmaWVsZEluZm9Nb2RlbCBSdW50aW1lIG1vZGVsIHdpdGggcGFyYW1ldGVycyBzdG9yZSBpbmZvcm1hdGlvbi5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoLlxuXHQgKi9cblx0X3JlcXVlc3RWYWx1ZUxpc3Q6IGZ1bmN0aW9uICh0cmFuc0N0eDogQ29udGV4dCwgc291cmNlOiBGaWVsZCwgZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCwgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zdCBtZXRhUGF0aCA9IE1vZGVsSGVscGVyLmdldE1ldGFQYXRoRm9yQ29udGV4dCh0cmFuc0N0eCk7XG5cdFx0Y29uc3QgcHJvcGVydHlQYXRoID0gKG1ldGFQYXRoICYmIG1ldGFQYXRoICsgXCIvXCIgKyBwcm9wZXJ0eU5hbWUpIGFzIHN0cmluZztcblx0XHRjb25zdCBkZXBlbmRlbnRzID0gKHNvdXJjZSBhcyBhbnkpPy5nZXREZXBlbmRlbnRzKCk7XG5cdFx0Y29uc3QgZmllbGRIZWxwID0gc291cmNlPy5nZXRGaWVsZEhlbHAoKTtcblx0XHRjb25zdCBmaWVsZFZhbHVlSGVscCA9IGRlcGVuZGVudHM/LmZpbmQoKGRlcGVuZGVudDogYW55KSA9PiBkZXBlbmRlbnQuZ2V0SWQoKSA9PT0gZmllbGRIZWxwKTtcblx0XHRpZiAoIWZpZWxkVmFsdWVIZWxwPy5nZXRCaW5kaW5nQ29udGV4dCgpKSB7XG5cdFx0XHRmaWVsZFZhbHVlSGVscD8uc2V0QmluZGluZ0NvbnRleHQodHJhbnNDdHgpO1xuXHRcdH1cblx0XHRjb25zdCBtZXRhTW9kZWwgPSB0cmFuc0N0eC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFZhbHVlTGlzdEhlbHBlci5jcmVhdGVWSFVJTW9kZWwocHJvcGVydHlQYXRoLCBmaWVsZFZhbHVlSGVscCk7XG5cdFx0Y29uc3QgdmFsdWVMaXN0SW5mbyA9IFZhbHVlTGlzdEhlbHBlci5nZXRWYWx1ZUxpc3RJbmZvKGZpZWxkVmFsdWVIZWxwLCBtZXRhTW9kZWwsIHByb3BlcnR5UGF0aCkgYXMgUHJvbWlzZTxhbnk+O1xuXG5cdFx0dmFsdWVMaXN0SW5mb1xuXHRcdFx0LnRoZW4oKHZMaW5mbzogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHByb3BQYXRoID1cblx0XHRcdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzL1wiICsgcHJvcGVydHlOYW1lKSAmJiBcIi92YWx1ZXMvXCIpIHx8XG5cdFx0XHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KFwiL3VuaXREYXRhL1wiICsgcHJvcGVydHlOYW1lKSAmJiBcIi91bml0RGF0YS9cIik7XG5cdFx0XHRcdGNvbnN0IGluZm86IGFueSA9IHtcblx0XHRcdFx0XHRpblBhcmFtZXRlcnM6IHZMaW5mby5pblBhcmFtZXRlcnMubWFwKChpblBhcmFtOiBhbnkpID0+IGluUGFyYW0uZ2V0RmllbGRQYXRoKCkpLFxuXHRcdFx0XHRcdG91dFBhcmFtZXRlcnM6IHZMaW5mby5vdXRQYXJhbWV0ZXJzLm1hcCgob3V0UGFyYW06IGFueSkgPT4gb3V0UGFyYW0uZ2V0RmllbGRQYXRoKCkpXG5cdFx0XHRcdH07XG5cdFx0XHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KGAke3Byb3BQYXRofSR7cHJvcGVydHlOYW1lfS92YWx1ZUxpc3RJbmZvYCwgaW5mbyk7XG5cdFx0XHRcdGlmIChpbmZvLm91dFBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZUZpZWxkUGF0aFN1Z2dlc3Rpb25zKGZpZWxkSW5mb01vZGVsLCBgL3ZhbHVlcy8ke3Byb3BlcnR5TmFtZX1gLCBmYWxzZSwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKCkgPT4ge1xuXHRcdFx0XHRMb2cud2FybmluZyhgTWFzcyBFZGl0OiBDb3VsZG4ndCBsb2FkIHZhbHVlTGlzdCBpbmZvIGZvciAke3Byb3BlcnR5UGF0aH1gKTtcblx0XHRcdH0pO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgZmllbGQgaGVscCBjb250cm9sIGZyb20gTURDIGZpZWxkLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtDb250ZXh0fSB0cmFuc0N0eCBUaGUgdHJhbnNpZW50IGNvbnRleHQgb2YgdGhlIE1FRC5cblx0ICogQHBhcmFtIHtNRENGaWVsZH0gc291cmNlIE1EQyBmaWVsZC5cblx0ICogQHJldHVybnMgRmllbGQgSGVscCBjb250cm9sLlxuXHQgKi9cblx0X2dldFZhbHVlSGVscDogZnVuY3Rpb24gKHRyYW5zQ3R4OiBDb250ZXh0LCBzb3VyY2U6IGFueSk6IGFueSB7XG5cdFx0Y29uc3QgZGVwZW5kZW50cyA9IHNvdXJjZT8uZ2V0RGVwZW5kZW50cygpO1xuXHRcdGNvbnN0IGZpZWxkSGVscCA9IHNvdXJjZT8uZ2V0RmllbGRIZWxwKCk7XG5cdFx0Y29uc3QgZmllbGRWYWx1ZUhlbHAgPSBkZXBlbmRlbnRzPy5maW5kKChkZXBlbmRlbnQ6IGFueSkgPT4gZGVwZW5kZW50LmdldElkKCkgPT09IGZpZWxkSGVscCk7XG5cdFx0cmV0dXJuIGZpZWxkVmFsdWVIZWxwO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDb2xsZWQgb24gZHJvcCBkb3duIHNlbGVjdGlvbiBvZiBWSEQgb3B0aW9uLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtNYXNzRWRpdFNlbGVjdH0gc291cmNlIEN1c3RvbSBNYXNzIEVkaXQgU2VsZWN0IGNvbnRyb2wuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdEtleSBQcmV2aW91cyBrZXkgYmVmb3JlIHRoZSBWSEQgd2FzIHNlbGVjdGVkLlxuXHQgKi9cblx0X29uVkhTZWxlY3Q6IGZ1bmN0aW9uIChzb3VyY2U6IGFueSwgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHNlbGVjdEtleTogc3RyaW5nKTogdm9pZCB7XG5cdFx0Ly8gQ2FsbGVkIGZvclxuXHRcdC8vIDEuIFZIRCBzZWxlY3RlZC5cblxuXHRcdGNvbnN0IGZpZWxkSW5mb01vZGVsID0gc291cmNlICYmIHNvdXJjZS5nZXRNb2RlbChcImZpZWxkc0luZm9cIik7XG5cdFx0Y29uc3QgcHJvcFBhdGggPVxuXHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KFwiL3ZhbHVlcy9cIiArIHByb3BlcnR5TmFtZSkgJiYgXCIvdmFsdWVzL1wiKSB8fFxuXHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KFwiL3VuaXREYXRhL1wiICsgcHJvcGVydHlOYW1lKSAmJiBcIi91bml0RGF0YS9cIik7XG5cdFx0Y29uc3QgdHJhbnNDdHggPSBzb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRjb25zdCBmaWVsZFZhbHVlSGVscCA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFZhbHVlSGVscCh0cmFuc0N0eCwgc291cmNlLmdldFBhcmVudCgpKTtcblx0XHRpZiAoIWZpZWxkVmFsdWVIZWxwPy5nZXRCaW5kaW5nQ29udGV4dCgpKSB7XG5cdFx0XHRmaWVsZFZhbHVlSGVscD8uc2V0QmluZGluZ0NvbnRleHQodHJhbnNDdHgpO1xuXHRcdH1cblx0XHRzb3VyY2UuZmlyZVZhbHVlSGVscFJlcXVlc3QoKTtcblxuXHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KHByb3BQYXRoICsgcHJvcGVydHlOYW1lICsgXCIvc2VsZWN0ZWRLZXlcIiwgc2VsZWN0S2V5KTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0cyBQcm9wZXJ0eSBuYW1lIGZyb20gc2VsZWN0aW9uIGtleS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgU2VsZWN0aW9uIGtleS5cblx0ICogQHJldHVybnMgUHJvcGVydHkgbmFtZS5cblx0ICovXG5cdF9nZXRQcm9wZXJ0eU5hbWVGcm9tS2V5OiBmdW5jdGlvbiAoa2V5OiBzdHJpbmcpIHtcblx0XHRsZXQgcHJvcGVydHlOYW1lID0gXCJcIjtcblx0XHRpZiAoa2V5LnN0YXJ0c1dpdGgoXCJEZWZhdWx0L1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIkNsZWFyRmllbGRWYWx1ZS9cIikgfHwga2V5LnN0YXJ0c1dpdGgoXCJVc2VWYWx1ZUhlbHBWYWx1ZS9cIikpIHtcblx0XHRcdHByb3BlcnR5TmFtZSA9IGtleS5zdWJzdHJpbmcoa2V5LmluZGV4T2YoXCIvXCIpICsgMSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb3BlcnR5TmFtZSA9IGtleS5zdWJzdHJpbmcoMCwga2V5Lmxhc3RJbmRleE9mKFwiL1wiKSk7XG5cdFx0fVxuXHRcdHJldHVybiBwcm9wZXJ0eU5hbWU7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVwZGF0ZSBzZWxlY3Rpb24gdG8gQ3VzdG9tIE1hc3MgRWRpdCBTZWxlY3QgZnJvbSBNREMgZmllbGQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge01EQ0ZpZWxkfSBzb3VyY2UgTURDIGZpZWxkLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBWYWx1ZSB0byB1cGRhdGUuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBmdWxsVGV4dCBGdWxsIHRleHQgdG8gdXNlLlxuXHQgKi9cblx0X3VwZGF0ZVNlbGVjdEtleTogZnVuY3Rpb24gKHNvdXJjZTogRmllbGQsIHByb3BlcnR5TmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBmdWxsVGV4dD86IGFueSk6IHZvaWQge1xuXHRcdC8vIENhbGxlZCBmb3Jcblx0XHQvLyAxLiBWSEQgcHJvcGVydHkgY2hhbmdlXG5cdFx0Ly8gMi4gT3V0IFBhcmFtZXRlcnMuXG5cdFx0Ly8gMy4gVHJhbnNpZW50IGNvbnRleHQgcHJvcGVydHkgY2hhbmdlLlxuXG5cdFx0Y29uc3QgbWFzc0VkaXRTZWxlY3QgPSAoc291cmNlLmdldENvbnRlbnQoKSBhcyBhbnkpIGFzIFNlbGVjdDtcblx0XHRpZiAoIW1hc3NFZGl0U2VsZWN0IHx8ICFwcm9wZXJ0eU5hbWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0bGV0IGtleTogc3RyaW5nID0gbWFzc0VkaXRTZWxlY3QuZ2V0U2VsZWN0ZWRLZXkoKTtcblx0XHRpZiAoKGtleS5zdGFydHNXaXRoKFwiRGVmYXVsdC9cIikgfHwga2V5LnN0YXJ0c1dpdGgoXCJDbGVhckZpZWxkVmFsdWUvXCIpKSAmJiAhdmFsdWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBmb3JtYXR0ZWRUZXh0ID0gTWFzc0VkaXRIYW5kbGVycy5fdmFsdWVFeGlzdHMoZnVsbFRleHQpID8gZnVsbFRleHQgOiB2YWx1ZTtcblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoKHNvdXJjZSBhcyBhbnkpLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdGNvbnN0IHZhbHVlcyA9XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXMvXCIgKyBwcm9wZXJ0eU5hbWUpIHx8IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KFwiL3VuaXREYXRhL1wiICsgcHJvcGVydHlOYW1lKSB8fCBbXTtcblx0XHRjb25zdCBwcm9wUGF0aCA9XG5cdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzL1wiICsgcHJvcGVydHlOYW1lKSAmJiBcIi92YWx1ZXMvXCIpIHx8XG5cdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdW5pdERhdGEvXCIgKyBwcm9wZXJ0eU5hbWUpICYmIFwiL3VuaXREYXRhL1wiKTtcblxuXHRcdGNvbnN0IHJlbGF0ZWRGaWVsZCA9IHZhbHVlcy5maW5kKChmaWVsZERhdGE6IGFueSkgPT4gZmllbGREYXRhPy50ZXh0SW5mbz8udmFsdWUgPT09IHZhbHVlIHx8IGZpZWxkRGF0YS50ZXh0ID09PSB2YWx1ZSk7XG5cblx0XHRpZiAocmVsYXRlZEZpZWxkKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGZ1bGxUZXh0ICYmXG5cdFx0XHRcdHJlbGF0ZWRGaWVsZC50ZXh0SW5mbyAmJlxuXHRcdFx0XHRyZWxhdGVkRmllbGQudGV4dEluZm8uZGVzY3JpcHRpb25QYXRoICYmXG5cdFx0XHRcdChyZWxhdGVkRmllbGQudGV4dCAhPSBmb3JtYXR0ZWRUZXh0IHx8IHJlbGF0ZWRGaWVsZC50ZXh0SW5mby5mdWxsVGV4dCAhPSBmb3JtYXR0ZWRUZXh0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIFVwZGF0ZSB0aGUgZnVsbCB0ZXh0IG9ubHkgd2hlbiBwcm92aWRlZC5cblx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHQgPSBmb3JtYXR0ZWRUZXh0O1xuXHRcdFx0XHRyZWxhdGVkRmllbGQudGV4dEluZm8uZnVsbFRleHQgPSBmb3JtYXR0ZWRUZXh0O1xuXHRcdFx0XHRyZWxhdGVkRmllbGQudGV4dEluZm8uZGVzY3JpcHRpb24gPSBzb3VyY2UuZ2V0QWRkaXRpb25hbFZhbHVlKCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocmVsYXRlZEZpZWxkLmtleSA9PT0ga2V5KSB7XG5cdFx0XHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KHByb3BQYXRoICsgcHJvcGVydHlOYW1lICsgXCIvc2VsZWN0ZWRLZXlcIiwga2V5KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0a2V5ID0gcmVsYXRlZEZpZWxkLmtleTtcblx0XHR9IGVsc2UgaWYgKFt1bmRlZmluZWQsIG51bGwsIFwiXCJdLmluZGV4T2YodmFsdWUpID09PSAtMSkge1xuXHRcdFx0a2V5ID0gcHJvcGVydHlOYW1lICsgXCIvXCIgKyB2YWx1ZTtcblx0XHRcdGNvbnN0IHNlbGVjdGlvbkluZm8gPSB7XG5cdFx0XHRcdHRleHQ6IGZvcm1hdHRlZFRleHQsXG5cdFx0XHRcdGtleSxcblx0XHRcdFx0dGV4dEluZm86IHtcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogc291cmNlLmdldEFkZGl0aW9uYWxWYWx1ZSgpLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uUGF0aDogdmFsdWVzICYmIHZhbHVlcy50ZXh0SW5mbyAmJiB2YWx1ZXMudGV4dEluZm8uZGVzY3JpcHRpb25QYXRoLFxuXHRcdFx0XHRcdGZ1bGxUZXh0OiBmb3JtYXR0ZWRUZXh0LFxuXHRcdFx0XHRcdHRleHRBcnJhbmdlbWVudDogc291cmNlLmdldERpc3BsYXkoKSxcblx0XHRcdFx0XHR2YWx1ZTogc291cmNlLmdldFZhbHVlKCksXG5cdFx0XHRcdFx0dmFsdWVQYXRoOiBwcm9wZXJ0eU5hbWVcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdHZhbHVlcy5wdXNoKHNlbGVjdGlvbkluZm8pO1xuXHRcdFx0dmFsdWVzLnNlbGVjdE9wdGlvbnMgPSB2YWx1ZXMuc2VsZWN0T3B0aW9ucyB8fCBbXTtcblx0XHRcdHZhbHVlcy5zZWxlY3RPcHRpb25zLnB1c2goc2VsZWN0aW9uSW5mbyk7XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShwcm9wUGF0aCArIHByb3BlcnR5TmFtZSwgdmFsdWVzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0a2V5ID0gXCJEZWZhdWx0L1wiICsgcHJvcGVydHlOYW1lO1xuXHRcdH1cblxuXHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KHByb3BQYXRoICsgcHJvcGVydHlOYW1lICsgXCIvc2VsZWN0ZWRLZXlcIiwga2V5KTtcblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVSZXN1bHRzKG1hc3NFZGl0U2VsZWN0KTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IFZhbHVlIGZyb20gRHJvcCBkb3duLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtDb250cm9sfSBzb3VyY2UgRHJvcCBkb3duIGNvbnRyb2wuXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFZhbHVlIG9mIHNlbGVjdGlvbi5cblx0ICovXG5cdF9nZXRWYWx1ZTogZnVuY3Rpb24gKHNvdXJjZTogQ29udHJvbCkge1xuXHRcdHJldHVybiBzb3VyY2UuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkgPT09IFwic2FwLmZlLmNvcmUuY29udHJvbHMuTWFzc0VkaXRTZWxlY3RcIlxuXHRcdFx0PyAoc291cmNlIGFzIFNlbGVjdCkuZ2V0U2VsZWN0ZWRJdGVtKCk/LmdldFRleHQoKVxuXHRcdFx0OiAoc291cmNlIGFzIENvbWJvQm94KS5nZXRWYWx1ZSgpO1xuXHR9LFxuXG5cdF9nZXRWYWx1ZU9uRW1wdHk6IGZ1bmN0aW9uIChvU291cmNlOiBhbnksIGZpZWxkc0luZm9Nb2RlbDogSlNPTk1vZGVsLCB2YWx1ZTogYW55LCBzUHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcblx0XHRpZiAoIXZhbHVlKSB7XG5cdFx0XHRjb25zdCB2YWx1ZXMgPVxuXHRcdFx0XHRmaWVsZHNJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtzUHJvcGVydHlOYW1lfWApIHx8IGZpZWxkc0luZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7c1Byb3BlcnR5TmFtZX1gKSB8fCBbXTtcblx0XHRcdGlmICh2YWx1ZXMudW5pdFByb3BlcnR5KSB7XG5cdFx0XHRcdHZhbHVlID0gMDtcblx0XHRcdFx0b1NvdXJjZS5zZXRWYWx1ZSh2YWx1ZSk7XG5cdFx0XHR9IGVsc2UgaWYgKHZhbHVlcy5pbnB1dFR5cGUgPT09IFwiQ2hlY2tCb3hcIikge1xuXHRcdFx0XHR2YWx1ZSA9IG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB2YWx1ZTtcblx0fSxcblxuXHRfdmFsdWVFeGlzdHM6IGZ1bmN0aW9uICh2YWx1ZTogYW55KSB7XG5cdFx0cmV0dXJuIHZhbHVlICE9IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPSBudWxsO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHNlbGVjdGlvbnMgdG8gcnVudGltZSBtb2RlbC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7Q29udHJvbH0gb1NvdXJjZSBEcm9wIGRvd24gY29udHJvbC5cblx0ICogQHBhcmFtIHtBcnJheX0gYVBhcmFtcyBQYXJ0cyBvZiBrZXkgaW4gcnVudGltZSBtb2RlbC5cblx0ICogQHBhcmFtIHtib29sZWFufSB1cGRhdGVUcmFuc0N0eCBTaG91bGQgdHJhbnNpZW50IGNvbnRleHQgYmUgdXBkYXRlZCB3aXRoIHRoZSB2YWx1ZS5cblx0ICovXG5cdF91cGRhdGVSZXN1bHRzOiBmdW5jdGlvbiAob1NvdXJjZTogYW55LCBhUGFyYW1zOiBBcnJheTxzdHJpbmc+ID0gW10sIHVwZGF0ZVRyYW5zQ3R4OiBib29sZWFuKSB7XG5cdFx0Ly8gQ2FsbGVkIGZvclxuXHRcdC8vIDEuIFZIRCBwcm9wZXJ0eSBjaGFuZ2UuXG5cdFx0Ly8gMi4gT3V0IHBhcmFtZXRlci5cblx0XHQvLyAzLiB0cmFuc2llbnQgY29udGV4dCBwcm9wZXJ0eSBjaGFuZ2UuXG5cdFx0Y29uc3QgZmllbGRzSW5mb01vZGVsID0gb1NvdXJjZSAmJiBvU291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKTtcblx0XHRjb25zdCBvRmllbGRzSW5mb0RhdGEgPSBmaWVsZHNJbmZvTW9kZWwgJiYgZmllbGRzSW5mb01vZGVsLmdldERhdGEoKTtcblx0XHRsZXQgdmFsdWUgPSBNYXNzRWRpdEhhbmRsZXJzLl9nZXRWYWx1ZShvU291cmNlIGFzIENvbnRyb2wpO1xuXHRcdGFQYXJhbXMgPSBhUGFyYW1zLmxlbmd0aCA+IDAgPyBhUGFyYW1zIDogb1NvdXJjZSAmJiBvU291cmNlLmdldFNlbGVjdGVkS2V5KCkgJiYgb1NvdXJjZS5nZXRTZWxlY3RlZEtleSgpLnNwbGl0KFwiL1wiKTtcblxuXHRcdGxldCBvRGF0YU9iamVjdDtcblx0XHRjb25zdCBzUHJvcGVydHlOYW1lID0gb1NvdXJjZS5nZXRJZCgpLnN1YnN0cmluZyhvU291cmNlLmdldElkKCkubGFzdEluZGV4T2YoXCI6XCIpICsgMSk7XG5cblx0XHRpZiAoYVBhcmFtc1swXSA9PT0gXCJEZWZhdWx0XCIpIHtcblx0XHRcdG9EYXRhT2JqZWN0ID0ge1xuXHRcdFx0XHRrZXlWYWx1ZTogYVBhcmFtc1sxXSxcblx0XHRcdFx0dmFsdWU6IGFQYXJhbXNbMF1cblx0XHRcdH07XG5cdFx0fSBlbHNlIGlmIChhUGFyYW1zWzBdID09PSBcIkNsZWFyRmllbGRWYWx1ZVwiKSB7XG5cdFx0XHR2YWx1ZSA9IFwiXCI7XG5cdFx0XHR2YWx1ZSA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFZhbHVlT25FbXB0eShvU291cmNlLCBmaWVsZHNJbmZvTW9kZWwsIHZhbHVlLCBzUHJvcGVydHlOYW1lKTtcblx0XHRcdG9EYXRhT2JqZWN0ID0ge1xuXHRcdFx0XHRrZXlWYWx1ZTogYVBhcmFtc1sxXSxcblx0XHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSBpZiAoIWFQYXJhbXMpIHtcblx0XHRcdHZhbHVlID0gTWFzc0VkaXRIYW5kbGVycy5fZ2V0VmFsdWVPbkVtcHR5KG9Tb3VyY2UsIGZpZWxkc0luZm9Nb2RlbCwgdmFsdWUsIHNQcm9wZXJ0eU5hbWUpO1xuXHRcdFx0b0RhdGFPYmplY3QgPSB7XG5cdFx0XHRcdGtleVZhbHVlOiBzUHJvcGVydHlOYW1lLFxuXHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IGFQYXJhbXMuc2xpY2UoMCwgLTEpLmpvaW4oXCIvXCIpO1xuXHRcdFx0Y29uc3QgcHJvcGVydHlWYWx1ZXMgPVxuXHRcdFx0XHRmaWVsZHNJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzL1wiICsgcHJvcGVydHlOYW1lKSB8fCBmaWVsZHNJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdW5pdERhdGEvXCIgKyBwcm9wZXJ0eU5hbWUpIHx8IFtdO1xuXG5cdFx0XHRjb25zdCByZWxhdGVkRmllbGQgPSAocHJvcGVydHlWYWx1ZXMgfHwgW10pLmZpbmQoZnVuY3Rpb24gKG9GaWVsZERhdGE6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0ZpZWxkRGF0YT8udGV4dEluZm8/LnZhbHVlID09PSB2YWx1ZSB8fCBvRmllbGREYXRhLnRleHQgPT09IHZhbHVlO1xuXHRcdFx0fSk7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHtcblx0XHRcdFx0a2V5VmFsdWU6IHByb3BlcnR5TmFtZSxcblx0XHRcdFx0dmFsdWU6XG5cdFx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHRJbmZvICYmIE1hc3NFZGl0SGFuZGxlcnMuX3ZhbHVlRXhpc3RzKHJlbGF0ZWRGaWVsZC50ZXh0SW5mby52YWx1ZSlcblx0XHRcdFx0XHRcdD8gcmVsYXRlZEZpZWxkLnRleHRJbmZvLnZhbHVlXG5cdFx0XHRcdFx0XHQ6IHJlbGF0ZWRGaWVsZC50ZXh0XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRsZXQgYkV4aXN0aW5nRWxlbWVudGluZGV4ID0gLTE7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBvRmllbGRzSW5mb0RhdGEucmVzdWx0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKG9GaWVsZHNJbmZvRGF0YS5yZXN1bHRzW2ldLmtleVZhbHVlID09PSBvRGF0YU9iamVjdC5rZXlWYWx1ZSkge1xuXHRcdFx0XHRiRXhpc3RpbmdFbGVtZW50aW5kZXggPSBpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoYkV4aXN0aW5nRWxlbWVudGluZGV4ICE9PSAtMSkge1xuXHRcdFx0b0ZpZWxkc0luZm9EYXRhLnJlc3VsdHNbYkV4aXN0aW5nRWxlbWVudGluZGV4XSA9IG9EYXRhT2JqZWN0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvRmllbGRzSW5mb0RhdGEucmVzdWx0cy5wdXNoKG9EYXRhT2JqZWN0KTtcblx0XHR9XG5cdFx0aWYgKHVwZGF0ZVRyYW5zQ3R4KSB7XG5cdFx0XHRjb25zdCB0cmFuc0N0eCA9IG9Tb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdGlmIChhUGFyYW1zWzBdID09PSBcIkRlZmF1bHRcIiB8fCBhUGFyYW1zWzBdID09PSBcIkNsZWFyRmllbGRWYWx1ZVwiKSB7XG5cdFx0XHRcdHRyYW5zQ3R4LnNldFByb3BlcnR5KG9EYXRhT2JqZWN0LmtleVZhbHVlLCBudWxsKTtcblx0XHRcdH0gZWxzZSBpZiAob0RhdGFPYmplY3QpIHtcblx0XHRcdFx0dHJhbnNDdHguc2V0UHJvcGVydHkob0RhdGFPYmplY3Qua2V5VmFsdWUsIG9EYXRhT2JqZWN0LnZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1hc3NFZGl0SGFuZGxlcnM7XG4iXX0=
|