@sapui5/sap.fe.core 1.102.0 → 1.103.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 +5 -5
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AppComponent.js +62 -26
- package/src/sap/fe/core/AppComponent.ts +56 -40
- package/src/sap/fe/core/AppStateHandler.js +10 -10
- package/src/sap/fe/core/AppStateHandler.ts +9 -9
- package/src/sap/fe/core/BaseController.js +11 -9
- package/src/sap/fe/core/BaseController.ts +15 -13
- package/src/sap/fe/core/CommonUtils.js +236 -109
- package/src/sap/fe/core/CommonUtils.ts +252 -136
- package/src/sap/fe/core/ExtensionAPI.js +24 -27
- package/src/sap/fe/core/ExtensionAPI.ts +36 -38
- package/src/sap/fe/core/PageController.js +4 -4
- package/src/sap/fe/core/PageController.ts +4 -5
- package/src/sap/fe/core/TemplateComponent.js +1 -1
- package/src/sap/fe/core/TemplateComponent.ts +6 -6
- package/src/sap/fe/core/TemplateModel.js +1 -1
- package/src/sap/fe/core/TemplateModel.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +1 -1
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +8 -8
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +11 -10
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +27 -27
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +28 -26
- package/src/sap/fe/core/controllerextensions/EditFlow.js +129 -118
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +154 -141
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +9 -9
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +31 -26
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +34 -35
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +70 -70
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +77 -77
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +84 -78
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +105 -101
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +66 -68
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
- package/src/sap/fe/core/controllerextensions/MassEdit.js +8 -8
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +19 -26
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +20 -12
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +29 -14
- package/src/sap/fe/core/controllerextensions/PageReady.js +97 -25
- package/src/sap/fe/core/controllerextensions/PageReady.ts +94 -34
- package/src/sap/fe/core/controllerextensions/Paginator.js +21 -22
- package/src/sap/fe/core/controllerextensions/Paginator.ts +24 -25
- package/src/sap/fe/core/controllerextensions/Placeholder.js +4 -6
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
- package/src/sap/fe/core/controllerextensions/Routing.js +10 -11
- package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
- package/src/sap/fe/core/controllerextensions/Share.js +22 -22
- package/src/sap/fe/core/controllerextensions/Share.ts +30 -29
- package/src/sap/fe/core/controllerextensions/SideEffects.js +46 -50
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -60
- package/src/sap/fe/core/controllerextensions/ViewState.js +65 -62
- package/src/sap/fe/core/controllerextensions/ViewState.ts +68 -63
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -7
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +6 -6
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +12 -17
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -2
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +4 -4
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +7 -9
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +18 -19
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +184 -137
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +253 -206
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +113 -121
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +148 -158
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +198 -148
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +223 -159
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +24 -26
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +35 -33
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +78 -44
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +90 -60
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +52 -55
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +55 -58
- package/src/sap/fe/core/controls/Any.js +9 -5
- package/src/sap/fe/core/controls/Any.ts +10 -4
- package/src/sap/fe/core/controls/CommandExecution.js +11 -25
- package/src/sap/fe/core/controls/CommandExecution.ts +11 -25
- package/src/sap/fe/core/controls/ConditionalWrapper.js +2 -2
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +22 -22
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +25 -24
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -2
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +2 -2
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -3
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +5 -5
- package/src/sap/fe/core/controls/FieldWrapper.js +2 -2
- package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
- package/src/sap/fe/core/controls/FileWrapper.js +2 -2
- package/src/sap/fe/core/controls/FileWrapper.ts +11 -11
- package/src/sap/fe/core/controls/FilterBar.js +6 -2
- package/src/sap/fe/core/controls/FilterBar.ts +13 -9
- package/src/sap/fe/core/controls/FormElementWrapper.js +1 -1
- package/src/sap/fe/core/controls/FormElementWrapper.ts +2 -2
- package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
- package/src/sap/fe/core/controls/MassEditSelect.ts +0 -4
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +3 -3
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +16 -12
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -3
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +47 -47
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +52 -52
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +8 -2
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +89 -88
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +107 -106
- package/src/sap/fe/core/converters/ConverterContext.js +26 -33
- package/src/sap/fe/core/converters/ConverterContext.ts +51 -60
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +14 -14
- package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
- package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
- package/src/sap/fe/core/converters/MetaModelConverter.js +50 -32
- package/src/sap/fe/core/converters/MetaModelConverter.ts +145 -127
- package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
- package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
- package/src/sap/fe/core/converters/annotations/DataField.js +54 -34
- package/src/sap/fe/core/converters/annotations/DataField.ts +97 -75
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +1911 -1495
- package/src/sap/fe/core/converters/controls/Common/Action.js +50 -41
- package/src/sap/fe/core/converters/controls/Common/Action.ts +56 -46
- package/src/sap/fe/core/converters/controls/Common/Chart.js +14 -14
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +23 -26
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
- package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +28 -28
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +40 -36
- package/src/sap/fe/core/converters/controls/Common/Form.js +25 -27
- package/src/sap/fe/core/converters/controls/Common/Form.ts +37 -45
- package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +35 -39
- package/src/sap/fe/core/converters/controls/Common/Table.js +174 -183
- package/src/sap/fe/core/converters/controls/Common/Table.ts +237 -250
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +119 -119
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +144 -141
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +45 -41
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +64 -57
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +67 -64
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +69 -66
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +73 -72
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +98 -96
- package/src/sap/fe/core/converters/helpers/Aggregation.js +2 -4
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +10 -13
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -31
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +30 -29
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -4
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +9 -9
- package/src/sap/fe/core/converters/helpers/ID.js +46 -46
- package/src/sap/fe/core/converters/helpers/ID.ts +25 -25
- package/src/sap/fe/core/converters/helpers/Key.js +7 -7
- package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -4
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +46 -62
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +54 -82
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +30 -29
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +40 -40
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +39 -38
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +52 -61
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -4
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +4 -4
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
- package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
- package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
- package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
- package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
- package/src/sap/fe/core/formatters/StandardFormatter.js +89 -0
- package/src/sap/fe/core/formatters/StandardFormatter.ts +64 -0
- package/src/sap/fe/core/formatters/TableFormatter.js +11 -11
- package/src/sap/fe/core/formatters/TableFormatter.ts +12 -12
- package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
- package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
- package/src/sap/fe/core/helpers/AppStartupHelper.js +15 -15
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +37 -40
- package/src/sap/fe/core/helpers/BindingToolkit.js +1809 -0
- package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +365 -264
- package/src/sap/fe/core/helpers/ClassSupport.js +20 -11
- package/src/sap/fe/core/helpers/ClassSupport.ts +14 -10
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
- package/src/sap/fe/core/helpers/EditState.js +1 -6
- package/src/sap/fe/core/helpers/EditState.ts +5 -10
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
- package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
- package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
- package/src/sap/fe/core/helpers/FPMHelper.ts +2 -2
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
- package/src/sap/fe/core/helpers/MassEditHelper.js +281 -254
- package/src/sap/fe/core/helpers/MassEditHelper.ts +337 -289
- package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
- package/src/sap/fe/core/helpers/ModelHelper.ts +34 -32
- package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
- package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
- package/src/sap/fe/core/helpers/StableIdHelper.js +12 -12
- package/src/sap/fe/core/helpers/StableIdHelper.ts +12 -12
- package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.ts +8 -8
- package/src/sap/fe/core/library.js +42 -3
- package/src/sap/fe/core/library.ts +38 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
- package/src/sap/fe/core/messagebundle.properties +49 -35
- package/src/sap/fe/core/messagebundle_ar.properties +13 -5
- package/src/sap/fe/core/messagebundle_bg.properties +13 -5
- package/src/sap/fe/core/messagebundle_ca.properties +13 -5
- package/src/sap/fe/core/messagebundle_cs.properties +13 -5
- package/src/sap/fe/core/messagebundle_cy.properties +14 -6
- package/src/sap/fe/core/messagebundle_da.properties +13 -5
- package/src/sap/fe/core/messagebundle_de.properties +15 -7
- package/src/sap/fe/core/messagebundle_el.properties +14 -6
- package/src/sap/fe/core/messagebundle_en.properties +9 -1
- package/src/sap/fe/core/messagebundle_en_GB.properties +11 -3
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +7 -1
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +9 -1
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +44 -85
- package/src/sap/fe/core/messagebundle_es.properties +13 -5
- package/src/sap/fe/core/messagebundle_es_MX.properties +13 -5
- package/src/sap/fe/core/messagebundle_et.properties +13 -5
- package/src/sap/fe/core/messagebundle_fi.properties +14 -6
- package/src/sap/fe/core/messagebundle_fr.properties +14 -6
- package/src/sap/fe/core/messagebundle_fr_CA.properties +14 -6
- package/src/sap/fe/core/messagebundle_hi.properties +14 -6
- package/src/sap/fe/core/messagebundle_hr.properties +14 -6
- package/src/sap/fe/core/messagebundle_hu.properties +13 -5
- package/src/sap/fe/core/messagebundle_id.properties +13 -5
- package/src/sap/fe/core/messagebundle_it.properties +33 -25
- package/src/sap/fe/core/messagebundle_iw.properties +13 -5
- package/src/sap/fe/core/messagebundle_ja.properties +14 -6
- package/src/sap/fe/core/messagebundle_kk.properties +13 -5
- package/src/sap/fe/core/messagebundle_ko.properties +13 -5
- package/src/sap/fe/core/messagebundle_lt.properties +13 -5
- package/src/sap/fe/core/messagebundle_lv.properties +14 -6
- package/src/sap/fe/core/messagebundle_ms.properties +13 -5
- package/src/sap/fe/core/messagebundle_nl.properties +13 -5
- package/src/sap/fe/core/messagebundle_no.properties +13 -5
- package/src/sap/fe/core/messagebundle_pl.properties +13 -5
- package/src/sap/fe/core/messagebundle_pt.properties +13 -5
- package/src/sap/fe/core/messagebundle_pt_PT.properties +14 -6
- package/src/sap/fe/core/messagebundle_ro.properties +13 -5
- package/src/sap/fe/core/messagebundle_ru.properties +13 -5
- package/src/sap/fe/core/messagebundle_sh.properties +13 -5
- package/src/sap/fe/core/messagebundle_sk.properties +13 -5
- package/src/sap/fe/core/messagebundle_sl.properties +17 -9
- package/src/sap/fe/core/messagebundle_sv.properties +14 -6
- package/src/sap/fe/core/messagebundle_th.properties +13 -5
- package/src/sap/fe/core/messagebundle_tr.properties +13 -5
- package/src/sap/fe/core/messagebundle_uk.properties +13 -5
- package/src/sap/fe/core/messagebundle_vi.properties +13 -5
- package/src/sap/fe/core/messagebundle_zh_CN.properties +14 -6
- package/src/sap/fe/core/messagebundle_zh_TW.properties +13 -5
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +2 -2
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +14 -14
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -2
- package/src/sap/fe/core/services/NavigationServiceFactory.js +53 -44
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +54 -46
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -2
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
- package/src/sap/fe/core/services/RoutingServiceFactory.js +55 -55
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +67 -65
- package/src/sap/fe/core/services/ShellServicesFactory.js +72 -76
- package/src/sap/fe/core/services/ShellServicesFactory.ts +76 -82
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +61 -61
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +20 -15
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +26 -21
- package/src/sap/fe/core/support/CommonHelper.js +3 -2
- package/src/sap/fe/core/support/CommonHelper.ts +9 -13
- package/src/sap/fe/core/support/Diagnostics.js +1 -1
- package/src/sap/fe/core/support/Diagnostics.ts +5 -5
- package/src/sap/fe/core/templating/CommonFormatters.js +84 -0
- package/src/sap/fe/core/templating/CommonFormatters.ts +86 -0
- package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
- package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
- package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
- package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
- package/src/sap/fe/core/templating/DataModelPathHelper.js +16 -15
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +42 -32
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -3
- package/src/sap/fe/core/templating/EntitySetHelper.js +7 -7
- package/src/sap/fe/core/templating/EntitySetHelper.ts +6 -8
- package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
- package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
- package/src/sap/fe/core/templating/FilterHelper.js +10 -9
- package/src/sap/fe/core/templating/FilterHelper.ts +13 -13
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
- package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
- package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
- package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
- package/src/sap/fe/core/templating/PropertyHelper.js +25 -25
- package/src/sap/fe/core/templating/PropertyHelper.ts +25 -26
- package/src/sap/fe/core/templating/UIFormatters.js +148 -93
- package/src/sap/fe/core/templating/UIFormatters.ts +196 -124
- package/src/sap/fe/core/type/Email.js +2 -2
- package/src/sap/fe/core/type/Email.ts +2 -2
- package/src/sap/fe/core/helpers/BindingExpression.js +0 -1732
|
@@ -1,1732 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
-
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
|
-
*/
|
|
5
|
-
sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
6
|
-
"use strict";
|
|
7
|
-
|
|
8
|
-
var _exports = {};
|
|
9
|
-
var resolveEnumValue = AnnotationEnum.resolveEnumValue;
|
|
10
|
-
|
|
11
|
-
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
12
|
-
|
|
13
|
-
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
14
|
-
|
|
15
|
-
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
16
|
-
|
|
17
|
-
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
18
|
-
|
|
19
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
20
|
-
|
|
21
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
22
|
-
|
|
23
|
-
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
24
|
-
|
|
25
|
-
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
26
|
-
|
|
27
|
-
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
28
|
-
|
|
29
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
30
|
-
|
|
31
|
-
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
32
|
-
|
|
33
|
-
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
34
|
-
|
|
35
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
36
|
-
|
|
37
|
-
var unresolveableExpression = {
|
|
38
|
-
_type: "Unresolvable"
|
|
39
|
-
};
|
|
40
|
-
_exports.unresolveableExpression = unresolveableExpression;
|
|
41
|
-
|
|
42
|
-
function escapeXmlAttribute(inputString) {
|
|
43
|
-
return inputString.replace(/'/g, "\\'");
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
function hasUnresolveableExpression() {
|
|
47
|
-
for (var _len = arguments.length, expressions = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
48
|
-
expressions[_key] = arguments[_key];
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
return expressions.find(function (expr) {
|
|
52
|
-
return expr._type === "Unresolvable";
|
|
53
|
-
}) !== undefined;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Check two expressions for (deep) equality.
|
|
57
|
-
*
|
|
58
|
-
* @param a
|
|
59
|
-
* @param b
|
|
60
|
-
* @returns {boolean} `true` if the two expressions are equal
|
|
61
|
-
*/
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
_exports.hasUnresolveableExpression = hasUnresolveableExpression;
|
|
65
|
-
|
|
66
|
-
function _checkExpressionsAreEqual(a, b) {
|
|
67
|
-
if (a._type !== b._type) {
|
|
68
|
-
return false;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
switch (a._type) {
|
|
72
|
-
case "Unresolvable":
|
|
73
|
-
return false;
|
|
74
|
-
// Unresolvable is never equal to anything even itself
|
|
75
|
-
|
|
76
|
-
case "Constant":
|
|
77
|
-
case "EmbeddedBinding":
|
|
78
|
-
case "EmbeddedExpressionBinding":
|
|
79
|
-
return a.value === b.value;
|
|
80
|
-
|
|
81
|
-
case "Not":
|
|
82
|
-
return _checkExpressionsAreEqual(a.operand, b.operand);
|
|
83
|
-
|
|
84
|
-
case "Truthy":
|
|
85
|
-
return _checkExpressionsAreEqual(a.operand, b.operand);
|
|
86
|
-
|
|
87
|
-
case "Set":
|
|
88
|
-
return a.operator === b.operator && a.operands.length === b.operands.length && a.operands.every(function (expression) {
|
|
89
|
-
return b.operands.some(function (otherExpression) {
|
|
90
|
-
return _checkExpressionsAreEqual(expression, otherExpression);
|
|
91
|
-
});
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
case "IfElse":
|
|
95
|
-
return _checkExpressionsAreEqual(a.condition, b.condition) && _checkExpressionsAreEqual(a.onTrue, b.onTrue) && _checkExpressionsAreEqual(a.onFalse, b.onFalse);
|
|
96
|
-
|
|
97
|
-
case "Comparison":
|
|
98
|
-
return a.operator === b.operator && _checkExpressionsAreEqual(a.operand1, b.operand1) && _checkExpressionsAreEqual(a.operand2, b.operand2);
|
|
99
|
-
|
|
100
|
-
case "Concat":
|
|
101
|
-
var aExpressions = a.expressions;
|
|
102
|
-
var bExpressions = b.expressions;
|
|
103
|
-
|
|
104
|
-
if (aExpressions.length !== bExpressions.length) {
|
|
105
|
-
return false;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
return aExpressions.every(function (expression, index) {
|
|
109
|
-
return _checkExpressionsAreEqual(expression, bExpressions[index]);
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
case "Length":
|
|
113
|
-
return _checkExpressionsAreEqual(a.bindingExpression, b.bindingExpression);
|
|
114
|
-
|
|
115
|
-
case "Binding":
|
|
116
|
-
return a.modelName === b.modelName && a.path === b.path && a.targetEntitySet === b.targetEntitySet;
|
|
117
|
-
|
|
118
|
-
case "DefaultBinding":
|
|
119
|
-
return a.modelName === b.modelName && a.path === b.path;
|
|
120
|
-
|
|
121
|
-
case "Formatter":
|
|
122
|
-
return a.fn === b.fn && a.parameters.length === b.parameters.length && a.parameters.every(function (value, index) {
|
|
123
|
-
return _checkExpressionsAreEqual(b.parameters[index], value);
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
case "ComplexType":
|
|
127
|
-
return a.type === b.type && a.bindingParameters.length === b.bindingParameters.length && a.bindingParameters.every(function (value, index) {
|
|
128
|
-
return _checkExpressionsAreEqual(b.bindingParameters[index], value);
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
case "Function":
|
|
132
|
-
var otherFunction = b;
|
|
133
|
-
|
|
134
|
-
if (a.obj === undefined || otherFunction.obj === undefined) {
|
|
135
|
-
return a.obj === otherFunction;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
return a.fn === otherFunction.fn && _checkExpressionsAreEqual(a.obj, otherFunction.obj) && a.parameters.length === otherFunction.parameters.length && a.parameters.every(function (value, index) {
|
|
139
|
-
return _checkExpressionsAreEqual(otherFunction.parameters[index], value);
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
case "Ref":
|
|
143
|
-
return a.ref === b.ref;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
return false;
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Converts a nested SetExpression by inlining operands of type SetExpression with the same operator.
|
|
150
|
-
*
|
|
151
|
-
* @param expression The expression to flatten
|
|
152
|
-
* @returns {SetExpression} A new SetExpression with the same operator
|
|
153
|
-
*/
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
_exports._checkExpressionsAreEqual = _checkExpressionsAreEqual;
|
|
157
|
-
|
|
158
|
-
function flattenSetExpression(expression) {
|
|
159
|
-
return expression.operands.reduce(function (result, operand) {
|
|
160
|
-
var candidatesForFlattening = operand._type === "Set" && operand.operator === expression.operator ? operand.operands : [operand];
|
|
161
|
-
candidatesForFlattening.forEach(function (candidate) {
|
|
162
|
-
if (result.operands.every(function (e) {
|
|
163
|
-
return !_checkExpressionsAreEqual(e, candidate);
|
|
164
|
-
})) {
|
|
165
|
-
result.operands.push(candidate);
|
|
166
|
-
}
|
|
167
|
-
});
|
|
168
|
-
return result;
|
|
169
|
-
}, {
|
|
170
|
-
_type: "Set",
|
|
171
|
-
operator: expression.operator,
|
|
172
|
-
operands: []
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* Detects whether an array of boolean expressions contains an expression and its negation.
|
|
177
|
-
*
|
|
178
|
-
* @param expressions Array of expressions
|
|
179
|
-
* @returns {boolean} `true` if the set of expressions contains an expression and its negation
|
|
180
|
-
*/
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
function hasOppositeExpressions(expressions) {
|
|
184
|
-
var negatedExpressions = expressions.map(not);
|
|
185
|
-
return expressions.some(function (expression, index) {
|
|
186
|
-
for (var i = index + 1; i < negatedExpressions.length; i++) {
|
|
187
|
-
if (_checkExpressionsAreEqual(expression, negatedExpressions[i])) {
|
|
188
|
-
return true;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
return false;
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* Logical `and` expression.
|
|
197
|
-
*
|
|
198
|
-
* The expression is simplified to false if this can be decided statically (that is, if one operand is a constant
|
|
199
|
-
* false or if the expression contains an operand and its negation).
|
|
200
|
-
*
|
|
201
|
-
* @param operands Expressions to connect by `and`
|
|
202
|
-
* @returns {Expression<boolean>} Expression evaluating to boolean
|
|
203
|
-
*/
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
function and() {
|
|
207
|
-
for (var _len2 = arguments.length, operands = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
208
|
-
operands[_key2] = arguments[_key2];
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
var expressions = flattenSetExpression({
|
|
212
|
-
_type: "Set",
|
|
213
|
-
operator: "&&",
|
|
214
|
-
operands: operands.map(wrapPrimitive)
|
|
215
|
-
}).operands;
|
|
216
|
-
|
|
217
|
-
if (hasUnresolveableExpression.apply(void 0, _toConsumableArray(expressions))) {
|
|
218
|
-
return unresolveableExpression;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
var isStaticFalse = false;
|
|
222
|
-
var nonTrivialExpression = expressions.filter(function (expression) {
|
|
223
|
-
if (isFalse(expression)) {
|
|
224
|
-
isStaticFalse = true;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
return !isConstant(expression);
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
if (isStaticFalse) {
|
|
231
|
-
return constant(false);
|
|
232
|
-
} else if (nonTrivialExpression.length === 0) {
|
|
233
|
-
// Resolve the constant then
|
|
234
|
-
var isValid = expressions.reduce(function (result, expression) {
|
|
235
|
-
return result && isTrue(expression);
|
|
236
|
-
}, true);
|
|
237
|
-
return constant(isValid);
|
|
238
|
-
} else if (nonTrivialExpression.length === 1) {
|
|
239
|
-
return nonTrivialExpression[0];
|
|
240
|
-
} else if (hasOppositeExpressions(nonTrivialExpression)) {
|
|
241
|
-
return constant(false);
|
|
242
|
-
} else {
|
|
243
|
-
return {
|
|
244
|
-
_type: "Set",
|
|
245
|
-
operator: "&&",
|
|
246
|
-
operands: nonTrivialExpression
|
|
247
|
-
};
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* Logical `or` expression.
|
|
252
|
-
*
|
|
253
|
-
* The expression is simplified to true if this can be decided statically (that is, if one operand is a constant
|
|
254
|
-
* true or if the expression contains an operand and its negation).
|
|
255
|
-
*
|
|
256
|
-
* @param operands Expressions to connect by `or`
|
|
257
|
-
* @returns {Expression<boolean>} Expression evaluating to boolean
|
|
258
|
-
*/
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
_exports.and = and;
|
|
262
|
-
|
|
263
|
-
function or() {
|
|
264
|
-
for (var _len3 = arguments.length, operands = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
|
|
265
|
-
operands[_key3] = arguments[_key3];
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
var expressions = flattenSetExpression({
|
|
269
|
-
_type: "Set",
|
|
270
|
-
operator: "||",
|
|
271
|
-
operands: operands.map(wrapPrimitive)
|
|
272
|
-
}).operands;
|
|
273
|
-
|
|
274
|
-
if (hasUnresolveableExpression.apply(void 0, _toConsumableArray(expressions))) {
|
|
275
|
-
return unresolveableExpression;
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
var isStaticTrue = false;
|
|
279
|
-
var nonTrivialExpression = expressions.filter(function (expression) {
|
|
280
|
-
if (isTrue(expression)) {
|
|
281
|
-
isStaticTrue = true;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
return !isConstant(expression) || expression.value;
|
|
285
|
-
});
|
|
286
|
-
|
|
287
|
-
if (isStaticTrue) {
|
|
288
|
-
return constant(true);
|
|
289
|
-
} else if (nonTrivialExpression.length === 0) {
|
|
290
|
-
// Resolve the constant then
|
|
291
|
-
var isValid = expressions.reduce(function (result, expression) {
|
|
292
|
-
return result && isTrue(expression);
|
|
293
|
-
}, true);
|
|
294
|
-
return constant(isValid);
|
|
295
|
-
} else if (nonTrivialExpression.length === 1) {
|
|
296
|
-
return nonTrivialExpression[0];
|
|
297
|
-
} else if (hasOppositeExpressions(nonTrivialExpression)) {
|
|
298
|
-
return constant(true);
|
|
299
|
-
} else {
|
|
300
|
-
return {
|
|
301
|
-
_type: "Set",
|
|
302
|
-
operator: "||",
|
|
303
|
-
operands: nonTrivialExpression
|
|
304
|
-
};
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
/**
|
|
308
|
-
* Logical `not` operator.
|
|
309
|
-
*
|
|
310
|
-
* @param operand The expression to reverse
|
|
311
|
-
* @returns {Expression<boolean>} The resulting expression that evaluates to boolean
|
|
312
|
-
*/
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
_exports.or = or;
|
|
316
|
-
|
|
317
|
-
function not(operand) {
|
|
318
|
-
operand = wrapPrimitive(operand);
|
|
319
|
-
|
|
320
|
-
if (hasUnresolveableExpression(operand)) {
|
|
321
|
-
return unresolveableExpression;
|
|
322
|
-
} else if (isConstant(operand)) {
|
|
323
|
-
return constant(!operand.value);
|
|
324
|
-
} else if (typeof operand === "object" && operand._type === "Set" && operand.operator === "||" && operand.operands.every(function (expression) {
|
|
325
|
-
return isConstant(expression) || isComparison(expression);
|
|
326
|
-
})) {
|
|
327
|
-
return and.apply(void 0, _toConsumableArray(operand.operands.map(function (expression) {
|
|
328
|
-
return not(expression);
|
|
329
|
-
})));
|
|
330
|
-
} else if (typeof operand === "object" && operand._type === "Set" && operand.operator === "&&" && operand.operands.every(function (expression) {
|
|
331
|
-
return isConstant(expression) || isComparison(expression);
|
|
332
|
-
})) {
|
|
333
|
-
return or.apply(void 0, _toConsumableArray(operand.operands.map(function (expression) {
|
|
334
|
-
return not(expression);
|
|
335
|
-
})));
|
|
336
|
-
} else if (isComparison(operand)) {
|
|
337
|
-
// Create the reverse comparison
|
|
338
|
-
switch (operand.operator) {
|
|
339
|
-
case "!==":
|
|
340
|
-
return _objectSpread(_objectSpread({}, operand), {}, {
|
|
341
|
-
operator: "==="
|
|
342
|
-
});
|
|
343
|
-
|
|
344
|
-
case "<":
|
|
345
|
-
return _objectSpread(_objectSpread({}, operand), {}, {
|
|
346
|
-
operator: ">="
|
|
347
|
-
});
|
|
348
|
-
|
|
349
|
-
case "<=":
|
|
350
|
-
return _objectSpread(_objectSpread({}, operand), {}, {
|
|
351
|
-
operator: ">"
|
|
352
|
-
});
|
|
353
|
-
|
|
354
|
-
case "===":
|
|
355
|
-
return _objectSpread(_objectSpread({}, operand), {}, {
|
|
356
|
-
operator: "!=="
|
|
357
|
-
});
|
|
358
|
-
|
|
359
|
-
case ">":
|
|
360
|
-
return _objectSpread(_objectSpread({}, operand), {}, {
|
|
361
|
-
operator: "<="
|
|
362
|
-
});
|
|
363
|
-
|
|
364
|
-
case ">=":
|
|
365
|
-
return _objectSpread(_objectSpread({}, operand), {}, {
|
|
366
|
-
operator: "<"
|
|
367
|
-
});
|
|
368
|
-
}
|
|
369
|
-
} else if (operand._type === "Not") {
|
|
370
|
-
return operand.operand;
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
return {
|
|
374
|
-
_type: "Not",
|
|
375
|
-
operand: operand
|
|
376
|
-
};
|
|
377
|
-
}
|
|
378
|
-
/**
|
|
379
|
-
* Evaluates whether a binding expression is equal to true with a loose equality.
|
|
380
|
-
*
|
|
381
|
-
* @param operand The expression to check
|
|
382
|
-
* @returns {Expression<boolean>} The resulting expression that evaluates to boolean
|
|
383
|
-
*/
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
_exports.not = not;
|
|
387
|
-
|
|
388
|
-
function isTruthy(operand) {
|
|
389
|
-
if (isConstant(operand)) {
|
|
390
|
-
return constant(!!operand.value);
|
|
391
|
-
} else {
|
|
392
|
-
return {
|
|
393
|
-
_type: "Truthy",
|
|
394
|
-
operand: operand
|
|
395
|
-
};
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
/**
|
|
399
|
-
* Creates a binding expression that will be evaluated by the corresponding model.
|
|
400
|
-
*
|
|
401
|
-
* @template TargetType
|
|
402
|
-
* @param path The path on the model
|
|
403
|
-
* @param [modelName] The name of the model
|
|
404
|
-
* @param [visitedNavigationPaths] The paths from the root entitySet
|
|
405
|
-
* @param [pathVisitor] A function to modify the resulting path
|
|
406
|
-
* @returns {BindingExpressionExpression<TargetType>} The default binding expression
|
|
407
|
-
*/
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
_exports.isTruthy = isTruthy;
|
|
411
|
-
|
|
412
|
-
function bindingExpression(path, modelName) {
|
|
413
|
-
var visitedNavigationPaths = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
414
|
-
var pathVisitor = arguments.length > 3 ? arguments[3] : undefined;
|
|
415
|
-
|
|
416
|
-
if (path === undefined) {
|
|
417
|
-
return unresolveableExpression;
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
var targetPath;
|
|
421
|
-
|
|
422
|
-
if (pathVisitor) {
|
|
423
|
-
targetPath = pathVisitor(path);
|
|
424
|
-
|
|
425
|
-
if (targetPath === undefined) {
|
|
426
|
-
return unresolveableExpression;
|
|
427
|
-
}
|
|
428
|
-
} else {
|
|
429
|
-
var localPath = visitedNavigationPaths.concat();
|
|
430
|
-
localPath.push(path);
|
|
431
|
-
targetPath = localPath.join("/");
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
return {
|
|
435
|
-
_type: "Binding",
|
|
436
|
-
modelName: modelName,
|
|
437
|
-
path: targetPath
|
|
438
|
-
};
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
_exports.bindingExpression = bindingExpression;
|
|
442
|
-
|
|
443
|
-
/**
|
|
444
|
-
* Creates a constant expression based on a primitive value.
|
|
445
|
-
*
|
|
446
|
-
* @template T
|
|
447
|
-
* @param value The constant to wrap in an expression
|
|
448
|
-
* @returns {ConstantExpression<T>} The constant expression
|
|
449
|
-
*/
|
|
450
|
-
function constant(value) {
|
|
451
|
-
var constantValue;
|
|
452
|
-
|
|
453
|
-
if (typeof value === "object" && value !== null && value !== undefined) {
|
|
454
|
-
if (Array.isArray(value)) {
|
|
455
|
-
constantValue = value.map(wrapPrimitive);
|
|
456
|
-
} else if (isPrimitiveObject(value)) {
|
|
457
|
-
constantValue = value.valueOf();
|
|
458
|
-
} else {
|
|
459
|
-
constantValue = Object.entries(value).reduce(function (plainExpression, _ref) {
|
|
460
|
-
var _ref2 = _slicedToArray(_ref, 2),
|
|
461
|
-
key = _ref2[0],
|
|
462
|
-
val = _ref2[1];
|
|
463
|
-
|
|
464
|
-
var wrappedValue = wrapPrimitive(val);
|
|
465
|
-
|
|
466
|
-
if (wrappedValue._type !== "Constant" || wrappedValue.value !== undefined) {
|
|
467
|
-
plainExpression[key] = wrappedValue;
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
return plainExpression;
|
|
471
|
-
}, {});
|
|
472
|
-
}
|
|
473
|
-
} else {
|
|
474
|
-
constantValue = value;
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
return {
|
|
478
|
-
_type: "Constant",
|
|
479
|
-
value: constantValue
|
|
480
|
-
};
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
_exports.constant = constant;
|
|
484
|
-
|
|
485
|
-
function resolveBindingString(value, targetType) {
|
|
486
|
-
if (value !== undefined && typeof value === "string" && value.startsWith("{")) {
|
|
487
|
-
if (value.startsWith("{=")) {
|
|
488
|
-
// Expression binding, we can just remove the outer binding things
|
|
489
|
-
return {
|
|
490
|
-
_type: "EmbeddedExpressionBinding",
|
|
491
|
-
value: value
|
|
492
|
-
};
|
|
493
|
-
} else {
|
|
494
|
-
return {
|
|
495
|
-
_type: "EmbeddedBinding",
|
|
496
|
-
value: value
|
|
497
|
-
};
|
|
498
|
-
}
|
|
499
|
-
} else if (targetType === "boolean" && typeof value === "string" && (value === "true" || value === "false")) {
|
|
500
|
-
return constant(value === "true");
|
|
501
|
-
} else {
|
|
502
|
-
return constant(value);
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
/**
|
|
506
|
-
* A named reference.
|
|
507
|
-
*
|
|
508
|
-
* @see fn
|
|
509
|
-
*
|
|
510
|
-
* @param reference Reference
|
|
511
|
-
* @returns {ReferenceExpression} The object reference binding part
|
|
512
|
-
*/
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
_exports.resolveBindingString = resolveBindingString;
|
|
516
|
-
|
|
517
|
-
function ref(reference) {
|
|
518
|
-
return {
|
|
519
|
-
_type: "Ref",
|
|
520
|
-
ref: reference
|
|
521
|
-
};
|
|
522
|
-
}
|
|
523
|
-
/**
|
|
524
|
-
* Determine whether the type is an expression.
|
|
525
|
-
*
|
|
526
|
-
* Every object having a property named `_type` of some value is considered an expression, even if there is actually
|
|
527
|
-
* no such expression type supported.
|
|
528
|
-
*
|
|
529
|
-
* @param something Type to check
|
|
530
|
-
* @returns {boolean} `true` if the type is considered to be an expression
|
|
531
|
-
*/
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
_exports.ref = ref;
|
|
535
|
-
|
|
536
|
-
function isExpression(something) {
|
|
537
|
-
return something !== null && typeof something === "object" && something._type !== undefined;
|
|
538
|
-
}
|
|
539
|
-
/**
|
|
540
|
-
* Wrap a primitive into a constant expression if it is not already an expression.
|
|
541
|
-
*
|
|
542
|
-
* @template T
|
|
543
|
-
* @param something The object to wrap in a Constant expression
|
|
544
|
-
* @returns {Expression<T>} Either the original object or the wrapped one depending on the case
|
|
545
|
-
*/
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
function wrapPrimitive(something) {
|
|
549
|
-
if (isExpression(something)) {
|
|
550
|
-
return something;
|
|
551
|
-
}
|
|
552
|
-
|
|
553
|
-
return constant(something);
|
|
554
|
-
}
|
|
555
|
-
/**
|
|
556
|
-
* Checks if the expression or value provided is constant or not.
|
|
557
|
-
*
|
|
558
|
-
* @template T The target type
|
|
559
|
-
* @param maybeConstant The expression or primitive value that is to be checked
|
|
560
|
-
* @returns {boolean} `true` if it is constant
|
|
561
|
-
*/
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
function isConstant(maybeConstant) {
|
|
565
|
-
return typeof maybeConstant !== "object" || maybeConstant._type === "Constant";
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
_exports.isConstant = isConstant;
|
|
569
|
-
|
|
570
|
-
function isTrue(expression) {
|
|
571
|
-
return isConstant(expression) && expression.value === true;
|
|
572
|
-
}
|
|
573
|
-
|
|
574
|
-
function isFalse(expression) {
|
|
575
|
-
return isConstant(expression) && expression.value === false;
|
|
576
|
-
}
|
|
577
|
-
/**
|
|
578
|
-
* Checks if the expression or value provided is binding or not.
|
|
579
|
-
*
|
|
580
|
-
* @template T The target type
|
|
581
|
-
* @param maybeBinding The expression or primitive value that is to be checked
|
|
582
|
-
* @returns {boolean} `true` if it is binding
|
|
583
|
-
*/
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
function isBinding(maybeBinding) {
|
|
587
|
-
return typeof maybeBinding === "object" && maybeBinding._type === "Binding";
|
|
588
|
-
}
|
|
589
|
-
/**
|
|
590
|
-
* Checks if the expression provided is a comparison or not.
|
|
591
|
-
*
|
|
592
|
-
* @template T The target type
|
|
593
|
-
* @param expression The expression
|
|
594
|
-
* @returns {boolean} `true` if the expression is a ComparisonExpression
|
|
595
|
-
*/
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
_exports.isBinding = isBinding;
|
|
599
|
-
|
|
600
|
-
function isComparison(expression) {
|
|
601
|
-
return expression._type === "Comparison";
|
|
602
|
-
}
|
|
603
|
-
|
|
604
|
-
function isPrimitiveObject(objectType) {
|
|
605
|
-
switch (objectType.constructor.name) {
|
|
606
|
-
case "String":
|
|
607
|
-
case "Number":
|
|
608
|
-
case "Boolean":
|
|
609
|
-
return true;
|
|
610
|
-
|
|
611
|
-
default:
|
|
612
|
-
return false;
|
|
613
|
-
}
|
|
614
|
-
}
|
|
615
|
-
/**
|
|
616
|
-
* Check if the passed annotation annotationValue is a ComplexAnnotationExpression.
|
|
617
|
-
*
|
|
618
|
-
* @template T The target type
|
|
619
|
-
* @param annotationValue The annotation annotationValue to evaluate
|
|
620
|
-
* @returns {boolean} `true` if the object is a {ComplexAnnotationExpression}
|
|
621
|
-
*/
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
function isComplexAnnotationExpression(annotationValue) {
|
|
625
|
-
return typeof annotationValue === "object" && !isPrimitiveObject(annotationValue);
|
|
626
|
-
}
|
|
627
|
-
/**
|
|
628
|
-
* Generate the corresponding annotationValue for a given annotation annotationValue.
|
|
629
|
-
*
|
|
630
|
-
* @template T The target type
|
|
631
|
-
* @param annotationValue The source annotation annotationValue
|
|
632
|
-
* @param visitedNavigationPaths The path from the root entity set
|
|
633
|
-
* @param defaultValue Default value if the annotationValue is undefined
|
|
634
|
-
* @param pathVisitor A function to modify the resulting path
|
|
635
|
-
* @returns {Expression<T>} The annotationValue equivalent to that annotation annotationValue
|
|
636
|
-
*/
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
function annotationExpression(annotationValue) {
|
|
640
|
-
var visitedNavigationPaths = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
641
|
-
var defaultValue = arguments.length > 2 ? arguments[2] : undefined;
|
|
642
|
-
var pathVisitor = arguments.length > 3 ? arguments[3] : undefined;
|
|
643
|
-
|
|
644
|
-
if (annotationValue === undefined) {
|
|
645
|
-
return wrapPrimitive(defaultValue);
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
if (!isComplexAnnotationExpression(annotationValue)) {
|
|
649
|
-
return constant(annotationValue);
|
|
650
|
-
}
|
|
651
|
-
|
|
652
|
-
switch (annotationValue.type) {
|
|
653
|
-
case "Path":
|
|
654
|
-
return bindingExpression(annotationValue.path, undefined, visitedNavigationPaths, pathVisitor);
|
|
655
|
-
|
|
656
|
-
case "If":
|
|
657
|
-
return annotationIfExpression(annotationValue.If, visitedNavigationPaths, pathVisitor);
|
|
658
|
-
|
|
659
|
-
case "Not":
|
|
660
|
-
return not(parseAnnotationCondition(annotationValue.Not, visitedNavigationPaths, pathVisitor));
|
|
661
|
-
|
|
662
|
-
case "Eq":
|
|
663
|
-
return equal(parseAnnotationCondition(annotationValue.Eq[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Eq[1], visitedNavigationPaths, pathVisitor));
|
|
664
|
-
|
|
665
|
-
case "Ne":
|
|
666
|
-
return notEqual(parseAnnotationCondition(annotationValue.Ne[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Ne[1], visitedNavigationPaths, pathVisitor));
|
|
667
|
-
|
|
668
|
-
case "Gt":
|
|
669
|
-
return greaterThan(parseAnnotationCondition(annotationValue.Gt[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Gt[1], visitedNavigationPaths, pathVisitor));
|
|
670
|
-
|
|
671
|
-
case "Ge":
|
|
672
|
-
return greaterOrEqual(parseAnnotationCondition(annotationValue.Ge[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Ge[1], visitedNavigationPaths, pathVisitor));
|
|
673
|
-
|
|
674
|
-
case "Lt":
|
|
675
|
-
return lessThan(parseAnnotationCondition(annotationValue.Lt[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Lt[1], visitedNavigationPaths, pathVisitor));
|
|
676
|
-
|
|
677
|
-
case "Le":
|
|
678
|
-
return lessOrEqual(parseAnnotationCondition(annotationValue.Le[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Le[1], visitedNavigationPaths, pathVisitor));
|
|
679
|
-
|
|
680
|
-
case "Or":
|
|
681
|
-
return or.apply(void 0, _toConsumableArray(annotationValue.Or.map(function (orCondition) {
|
|
682
|
-
return parseAnnotationCondition(orCondition, visitedNavigationPaths, pathVisitor);
|
|
683
|
-
})));
|
|
684
|
-
|
|
685
|
-
case "And":
|
|
686
|
-
return and.apply(void 0, _toConsumableArray(annotationValue.And.map(function (andCondition) {
|
|
687
|
-
return parseAnnotationCondition(andCondition, visitedNavigationPaths, pathVisitor);
|
|
688
|
-
})));
|
|
689
|
-
|
|
690
|
-
case "Apply":
|
|
691
|
-
return annotationApplyExpression(annotationValue, visitedNavigationPaths, pathVisitor);
|
|
692
|
-
}
|
|
693
|
-
|
|
694
|
-
return unresolveableExpression;
|
|
695
|
-
}
|
|
696
|
-
/**
|
|
697
|
-
* Parse the annotation condition into an expression.
|
|
698
|
-
*
|
|
699
|
-
* @template T The target type
|
|
700
|
-
* @param annotationValue The condition or value from the annotation
|
|
701
|
-
* @param visitedNavigationPaths The path from the root entity set
|
|
702
|
-
* @param pathVisitor A function to modify the resulting path
|
|
703
|
-
* @returns {Expression<T>} An equivalent expression
|
|
704
|
-
*/
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
_exports.annotationExpression = annotationExpression;
|
|
708
|
-
|
|
709
|
-
function parseAnnotationCondition(annotationValue) {
|
|
710
|
-
var visitedNavigationPaths = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
711
|
-
var pathVisitor = arguments.length > 2 ? arguments[2] : undefined;
|
|
712
|
-
|
|
713
|
-
if (annotationValue === null || typeof annotationValue !== "object") {
|
|
714
|
-
return constant(annotationValue);
|
|
715
|
-
} else if (annotationValue.hasOwnProperty("$Or")) {
|
|
716
|
-
return or.apply(void 0, _toConsumableArray(annotationValue.$Or.map(function (orCondition) {
|
|
717
|
-
return parseAnnotationCondition(orCondition, visitedNavigationPaths, pathVisitor);
|
|
718
|
-
})));
|
|
719
|
-
} else if (annotationValue.hasOwnProperty("$And")) {
|
|
720
|
-
return and.apply(void 0, _toConsumableArray(annotationValue.$And.map(function (andCondition) {
|
|
721
|
-
return parseAnnotationCondition(andCondition, visitedNavigationPaths, pathVisitor);
|
|
722
|
-
})));
|
|
723
|
-
} else if (annotationValue.hasOwnProperty("$Not")) {
|
|
724
|
-
return not(parseAnnotationCondition(annotationValue.$Not[0], visitedNavigationPaths, pathVisitor));
|
|
725
|
-
} else if (annotationValue.hasOwnProperty("$Eq")) {
|
|
726
|
-
return equal(parseAnnotationCondition(annotationValue.$Eq[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.$Eq[1], visitedNavigationPaths, pathVisitor));
|
|
727
|
-
} else if (annotationValue.hasOwnProperty("$Ne")) {
|
|
728
|
-
return notEqual(parseAnnotationCondition(annotationValue.$Ne[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.$Ne[1], visitedNavigationPaths, pathVisitor));
|
|
729
|
-
} else if (annotationValue.hasOwnProperty("$Gt")) {
|
|
730
|
-
return greaterThan(parseAnnotationCondition(annotationValue.$Gt[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.$Gt[1], visitedNavigationPaths, pathVisitor));
|
|
731
|
-
} else if (annotationValue.hasOwnProperty("$Ge")) {
|
|
732
|
-
return greaterOrEqual(parseAnnotationCondition(annotationValue.$Ge[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.$Ge[1], visitedNavigationPaths, pathVisitor));
|
|
733
|
-
} else if (annotationValue.hasOwnProperty("$Lt")) {
|
|
734
|
-
return lessThan(parseAnnotationCondition(annotationValue.$Lt[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.$Lt[1], visitedNavigationPaths, pathVisitor));
|
|
735
|
-
} else if (annotationValue.hasOwnProperty("$Le")) {
|
|
736
|
-
return lessOrEqual(parseAnnotationCondition(annotationValue.$Le[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.$Le[1], visitedNavigationPaths, pathVisitor));
|
|
737
|
-
} else if (annotationValue.hasOwnProperty("$Path")) {
|
|
738
|
-
return bindingExpression(annotationValue.$Path, undefined, visitedNavigationPaths, pathVisitor);
|
|
739
|
-
} else if (annotationValue.hasOwnProperty("$Apply")) {
|
|
740
|
-
return annotationExpression({
|
|
741
|
-
type: "Apply",
|
|
742
|
-
Function: annotationValue.$Function,
|
|
743
|
-
Apply: annotationValue.$Apply
|
|
744
|
-
}, visitedNavigationPaths, undefined, pathVisitor);
|
|
745
|
-
} else if (annotationValue.hasOwnProperty("$If")) {
|
|
746
|
-
return annotationExpression({
|
|
747
|
-
type: "If",
|
|
748
|
-
If: annotationValue.$If
|
|
749
|
-
}, visitedNavigationPaths, undefined, pathVisitor);
|
|
750
|
-
} else if (annotationValue.hasOwnProperty("$EnumMember")) {
|
|
751
|
-
return constant(resolveEnumValue(annotationValue.$EnumMember));
|
|
752
|
-
}
|
|
753
|
-
|
|
754
|
-
return constant(false);
|
|
755
|
-
}
|
|
756
|
-
/**
|
|
757
|
-
* Process the {IfAnnotationExpressionValue} into an expression.
|
|
758
|
-
*
|
|
759
|
-
* @template T The target type
|
|
760
|
-
* @param annotationValue An If expression returning the type T
|
|
761
|
-
* @param visitedNavigationPaths The path from the root entity set
|
|
762
|
-
* @param pathVisitor A function to modify the resulting path
|
|
763
|
-
* @returns {Expression<T>} The equivalent ifElse expression
|
|
764
|
-
*/
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
function annotationIfExpression(annotationValue) {
|
|
768
|
-
var visitedNavigationPaths = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
769
|
-
var pathVisitor = arguments.length > 2 ? arguments[2] : undefined;
|
|
770
|
-
return ifElse(parseAnnotationCondition(annotationValue[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue[1], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue[2], visitedNavigationPaths, pathVisitor));
|
|
771
|
-
}
|
|
772
|
-
|
|
773
|
-
_exports.annotationIfExpression = annotationIfExpression;
|
|
774
|
-
|
|
775
|
-
function annotationApplyExpression(applyExpression) {
|
|
776
|
-
var visitedNavigationPaths = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
777
|
-
var pathVisitor = arguments.length > 2 ? arguments[2] : undefined;
|
|
778
|
-
|
|
779
|
-
switch (applyExpression.Function) {
|
|
780
|
-
case "odata.concat":
|
|
781
|
-
return concat.apply(void 0, _toConsumableArray(applyExpression.Apply.map(function (applyParam) {
|
|
782
|
-
var applyParamConverted = applyParam;
|
|
783
|
-
|
|
784
|
-
if (applyParam.hasOwnProperty("$Path")) {
|
|
785
|
-
applyParamConverted = {
|
|
786
|
-
type: "Path",
|
|
787
|
-
path: applyParam.$Path
|
|
788
|
-
};
|
|
789
|
-
} else if (applyParam.hasOwnProperty("$If")) {
|
|
790
|
-
applyParamConverted = {
|
|
791
|
-
type: "If",
|
|
792
|
-
If: applyParam.$If
|
|
793
|
-
};
|
|
794
|
-
} else if (applyParam.hasOwnProperty("$Apply")) {
|
|
795
|
-
applyParamConverted = {
|
|
796
|
-
type: "Apply",
|
|
797
|
-
Function: applyParam.$Function,
|
|
798
|
-
Apply: applyParam.$Apply
|
|
799
|
-
};
|
|
800
|
-
}
|
|
801
|
-
|
|
802
|
-
return annotationExpression(applyParamConverted, visitedNavigationPaths, undefined, pathVisitor);
|
|
803
|
-
})));
|
|
804
|
-
}
|
|
805
|
-
|
|
806
|
-
return unresolveableExpression;
|
|
807
|
-
}
|
|
808
|
-
/**
|
|
809
|
-
* Generic helper for the comparison operations (equal, notEqual, ...).
|
|
810
|
-
*
|
|
811
|
-
* @template T The target type
|
|
812
|
-
* @param operator The operator to apply
|
|
813
|
-
* @param leftOperand The operand on the left side of the operator
|
|
814
|
-
* @param rightOperand The operand on the right side of the operator
|
|
815
|
-
* @returns {Expression<boolean>} An expression representing the comparison
|
|
816
|
-
*/
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
_exports.annotationApplyExpression = annotationApplyExpression;
|
|
820
|
-
|
|
821
|
-
function comparison(operator, leftOperand, rightOperand) {
|
|
822
|
-
var leftExpression = wrapPrimitive(leftOperand);
|
|
823
|
-
var rightExpression = wrapPrimitive(rightOperand);
|
|
824
|
-
|
|
825
|
-
if (hasUnresolveableExpression(leftExpression, rightExpression)) {
|
|
826
|
-
return unresolveableExpression;
|
|
827
|
-
}
|
|
828
|
-
|
|
829
|
-
if (isConstant(leftExpression) && isConstant(rightExpression)) {
|
|
830
|
-
switch (operator) {
|
|
831
|
-
case "!==":
|
|
832
|
-
return constant(leftExpression.value !== rightExpression.value);
|
|
833
|
-
|
|
834
|
-
case "<":
|
|
835
|
-
return constant(leftExpression.value < rightExpression.value);
|
|
836
|
-
|
|
837
|
-
case "<=":
|
|
838
|
-
return constant(leftExpression.value <= rightExpression.value);
|
|
839
|
-
|
|
840
|
-
case ">":
|
|
841
|
-
return constant(leftExpression.value > rightExpression.value);
|
|
842
|
-
|
|
843
|
-
case ">=":
|
|
844
|
-
return constant(leftExpression.value >= rightExpression.value);
|
|
845
|
-
|
|
846
|
-
case "===":
|
|
847
|
-
return constant(leftExpression.value === rightExpression.value);
|
|
848
|
-
}
|
|
849
|
-
} else {
|
|
850
|
-
return {
|
|
851
|
-
_type: "Comparison",
|
|
852
|
-
operator: operator,
|
|
853
|
-
operand1: leftExpression,
|
|
854
|
-
operand2: rightExpression
|
|
855
|
-
};
|
|
856
|
-
}
|
|
857
|
-
}
|
|
858
|
-
|
|
859
|
-
function length(expression) {
|
|
860
|
-
if (expression._type === "Unresolvable") {
|
|
861
|
-
return expression;
|
|
862
|
-
}
|
|
863
|
-
|
|
864
|
-
return {
|
|
865
|
-
_type: "Length",
|
|
866
|
-
bindingExpression: expression
|
|
867
|
-
};
|
|
868
|
-
}
|
|
869
|
-
/**
|
|
870
|
-
* Comparison: "equal" (===).
|
|
871
|
-
*
|
|
872
|
-
* @template T The target type
|
|
873
|
-
* @param leftOperand The operand on the left side
|
|
874
|
-
* @param rightOperand The operand on the right side of the comparison
|
|
875
|
-
* @returns {Expression<boolean>} An expression representing the comparison
|
|
876
|
-
*/
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
_exports.length = length;
|
|
880
|
-
|
|
881
|
-
function equal(leftOperand, rightOperand) {
|
|
882
|
-
var _reduce;
|
|
883
|
-
|
|
884
|
-
var leftExpression = wrapPrimitive(leftOperand);
|
|
885
|
-
var rightExpression = wrapPrimitive(rightOperand);
|
|
886
|
-
|
|
887
|
-
if (hasUnresolveableExpression(leftExpression, rightExpression)) {
|
|
888
|
-
return unresolveableExpression;
|
|
889
|
-
}
|
|
890
|
-
|
|
891
|
-
if (_checkExpressionsAreEqual(leftExpression, rightExpression)) {
|
|
892
|
-
return constant(true);
|
|
893
|
-
}
|
|
894
|
-
|
|
895
|
-
function reduce(left, right) {
|
|
896
|
-
if (left._type === "Comparison" && isTrue(right)) {
|
|
897
|
-
// compare(a, b) === true ~~> compare(a, b)
|
|
898
|
-
return left;
|
|
899
|
-
} else if (left._type === "Comparison" && isFalse(right)) {
|
|
900
|
-
// compare(a, b) === false ~~> !compare(a, b)
|
|
901
|
-
return not(left);
|
|
902
|
-
} else if (left._type === "IfElse" && _checkExpressionsAreEqual(left.onTrue, right)) {
|
|
903
|
-
// (if (x) { a } else { b }) === a ~~> x || (b === a)
|
|
904
|
-
return or(left.condition, equal(left.onFalse, right));
|
|
905
|
-
} else if (left._type === "IfElse" && _checkExpressionsAreEqual(left.onFalse, right)) {
|
|
906
|
-
// (if (x) { a } else { b }) === b ~~> !x || (a === b)
|
|
907
|
-
return or(not(left.condition), equal(left.onTrue, right));
|
|
908
|
-
} else if (left._type === "IfElse" && isConstant(left.onTrue) && isConstant(left.onFalse) && isConstant(right) && !_checkExpressionsAreEqual(left.onTrue, right) && !_checkExpressionsAreEqual(left.onFalse, right)) {
|
|
909
|
-
return constant(false);
|
|
910
|
-
}
|
|
911
|
-
|
|
912
|
-
return undefined;
|
|
913
|
-
} // exploit symmetry: a === b <~> b === a
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
var reduced = (_reduce = reduce(leftExpression, rightExpression)) !== null && _reduce !== void 0 ? _reduce : reduce(rightExpression, leftExpression);
|
|
917
|
-
return reduced !== null && reduced !== void 0 ? reduced : comparison("===", leftExpression, rightExpression);
|
|
918
|
-
}
|
|
919
|
-
/**
|
|
920
|
-
* Comparison: "not equal" (!==).
|
|
921
|
-
*
|
|
922
|
-
* @template T The target type
|
|
923
|
-
* @param leftOperand The operand on the left side
|
|
924
|
-
* @param rightOperand The operand on the right side of the comparison
|
|
925
|
-
* @returns {Expression<boolean>} An expression representing the comparison
|
|
926
|
-
*/
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
_exports.equal = equal;
|
|
930
|
-
|
|
931
|
-
function notEqual(leftOperand, rightOperand) {
|
|
932
|
-
return not(equal(leftOperand, rightOperand));
|
|
933
|
-
}
|
|
934
|
-
/**
|
|
935
|
-
* Comparison: "greater or equal" (>=).
|
|
936
|
-
*
|
|
937
|
-
* @template T The target type
|
|
938
|
-
* @param leftOperand The operand on the left side
|
|
939
|
-
* @param rightOperand The operand on the right side of the comparison
|
|
940
|
-
* @returns {Expression<boolean>} An expression representing the comparison
|
|
941
|
-
*/
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
_exports.notEqual = notEqual;
|
|
945
|
-
|
|
946
|
-
function greaterOrEqual(leftOperand, rightOperand) {
|
|
947
|
-
return comparison(">=", leftOperand, rightOperand);
|
|
948
|
-
}
|
|
949
|
-
/**
|
|
950
|
-
* Comparison: "greater than" (>).
|
|
951
|
-
*
|
|
952
|
-
* @template T The target type
|
|
953
|
-
* @param leftOperand The operand on the left side
|
|
954
|
-
* @param rightOperand The operand on the right side of the comparison
|
|
955
|
-
* @returns {Expression<boolean>} An expression representing the comparison
|
|
956
|
-
*/
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
_exports.greaterOrEqual = greaterOrEqual;
|
|
960
|
-
|
|
961
|
-
function greaterThan(leftOperand, rightOperand) {
|
|
962
|
-
return comparison(">", leftOperand, rightOperand);
|
|
963
|
-
}
|
|
964
|
-
/**
|
|
965
|
-
* Comparison: "less or equal" (<=).
|
|
966
|
-
*
|
|
967
|
-
* @template T The target type
|
|
968
|
-
* @param leftOperand The operand on the left side
|
|
969
|
-
* @param rightOperand The operand on the right side of the comparison
|
|
970
|
-
* @returns {Expression<boolean>} An expression representing the comparison
|
|
971
|
-
*/
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
_exports.greaterThan = greaterThan;
|
|
975
|
-
|
|
976
|
-
function lessOrEqual(leftOperand, rightOperand) {
|
|
977
|
-
return comparison("<=", leftOperand, rightOperand);
|
|
978
|
-
}
|
|
979
|
-
/**
|
|
980
|
-
* Comparison: "less than" (<).
|
|
981
|
-
*
|
|
982
|
-
* @template T The target type
|
|
983
|
-
* @param leftOperand The operand on the left side
|
|
984
|
-
* @param rightOperand The operand on the right side of the comparison
|
|
985
|
-
* @returns {Expression<boolean>} An expression representing the comparison
|
|
986
|
-
*/
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
_exports.lessOrEqual = lessOrEqual;
|
|
990
|
-
|
|
991
|
-
function lessThan(leftOperand, rightOperand) {
|
|
992
|
-
return comparison("<", leftOperand, rightOperand);
|
|
993
|
-
}
|
|
994
|
-
/**
|
|
995
|
-
* If-then-else expression.
|
|
996
|
-
*
|
|
997
|
-
* Evaluates to onTrue if the condition evaluates to true, else evaluates to onFalse.
|
|
998
|
-
*
|
|
999
|
-
* @template T The target type
|
|
1000
|
-
* @param condition The condition to evaluate
|
|
1001
|
-
* @param onTrue Expression result if the condition evaluates to true
|
|
1002
|
-
* @param onFalse Expression result if the condition evaluates to false
|
|
1003
|
-
* @returns {Expression<T>} The expression that represents this conditional check
|
|
1004
|
-
*/
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
_exports.lessThan = lessThan;
|
|
1008
|
-
|
|
1009
|
-
function ifElse(condition, onTrue, onFalse) {
|
|
1010
|
-
var conditionExpression = wrapPrimitive(condition);
|
|
1011
|
-
var onTrueExpression = wrapPrimitive(onTrue);
|
|
1012
|
-
var onFalseExpression = wrapPrimitive(onFalse);
|
|
1013
|
-
|
|
1014
|
-
if (hasUnresolveableExpression(conditionExpression, onTrueExpression, onFalseExpression)) {
|
|
1015
|
-
return unresolveableExpression;
|
|
1016
|
-
} // swap branches if the condition is a negation
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
if (conditionExpression._type === "Not") {
|
|
1020
|
-
// ifElse(not(X), a, b) --> ifElse(X, b, a)
|
|
1021
|
-
var _ref3 = [onFalseExpression, onTrueExpression];
|
|
1022
|
-
onTrueExpression = _ref3[0];
|
|
1023
|
-
onFalseExpression = _ref3[1];
|
|
1024
|
-
conditionExpression = not(conditionExpression);
|
|
1025
|
-
} // inline nested if-else expressions: onTrue branch
|
|
1026
|
-
// ifElse(X, ifElse(X, a, b), c) ==> ifElse(X, a, c)
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
if (onTrueExpression._type === "IfElse" && _checkExpressionsAreEqual(conditionExpression, onTrueExpression.condition)) {
|
|
1030
|
-
onTrueExpression = onTrueExpression.onTrue;
|
|
1031
|
-
} // inline nested if-else expressions: onFalse branch
|
|
1032
|
-
// ifElse(X, a, ifElse(X, b, c)) ==> ifElse(X, a, c)
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
if (onFalseExpression._type === "IfElse" && _checkExpressionsAreEqual(conditionExpression, onFalseExpression.condition)) {
|
|
1036
|
-
onFalseExpression = onFalseExpression.onFalse;
|
|
1037
|
-
} // (if true then a else b) ~~> a
|
|
1038
|
-
// (if false then a else b) ~~> b
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
if (isConstant(conditionExpression)) {
|
|
1042
|
-
return conditionExpression.value ? onTrueExpression : onFalseExpression;
|
|
1043
|
-
} // if (isConstantBoolean(onTrueExpression) || isConstantBoolean(onFalseExpression)) {
|
|
1044
|
-
// return or(and(condition, onTrueExpression as Expression<boolean>), and(not(condition), onFalseExpression as Expression<boolean>)) as Expression<T>
|
|
1045
|
-
// }
|
|
1046
|
-
// (if X then a else a) ~~> a
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
if (_checkExpressionsAreEqual(onTrueExpression, onFalseExpression)) {
|
|
1050
|
-
return onTrueExpression;
|
|
1051
|
-
} // if X then a else false ~~> X && a
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
if (isFalse(onFalseExpression)) {
|
|
1055
|
-
return and(conditionExpression, onTrueExpression);
|
|
1056
|
-
} // if X then a else true ~~> !X || a
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
if (isTrue(onFalseExpression)) {
|
|
1060
|
-
return or(not(conditionExpression), onTrueExpression);
|
|
1061
|
-
} // if X then false else a ~~> !X && a
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
if (isFalse(onTrueExpression)) {
|
|
1065
|
-
return and(not(conditionExpression), onFalseExpression);
|
|
1066
|
-
} // if X then true else a ~~> X || a
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
if (isTrue(onTrueExpression)) {
|
|
1070
|
-
return or(conditionExpression, onFalseExpression);
|
|
1071
|
-
}
|
|
1072
|
-
|
|
1073
|
-
return {
|
|
1074
|
-
_type: "IfElse",
|
|
1075
|
-
condition: conditionExpression,
|
|
1076
|
-
onTrue: onTrueExpression,
|
|
1077
|
-
onFalse: onFalseExpression
|
|
1078
|
-
};
|
|
1079
|
-
}
|
|
1080
|
-
/**
|
|
1081
|
-
* Checks whether the current expression has a reference to the default model (undefined).
|
|
1082
|
-
*
|
|
1083
|
-
* @param expression The expression to evaluate
|
|
1084
|
-
* @returns {boolean} `true` if there is a reference to the default context
|
|
1085
|
-
*/
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
_exports.ifElse = ifElse;
|
|
1089
|
-
|
|
1090
|
-
function hasReferenceToDefaultContext(expression) {
|
|
1091
|
-
switch (expression._type) {
|
|
1092
|
-
case "Constant":
|
|
1093
|
-
case "Formatter":
|
|
1094
|
-
case "ComplexType":
|
|
1095
|
-
return false;
|
|
1096
|
-
|
|
1097
|
-
case "Set":
|
|
1098
|
-
return expression.operands.some(hasReferenceToDefaultContext);
|
|
1099
|
-
|
|
1100
|
-
case "Binding":
|
|
1101
|
-
return expression.modelName === undefined;
|
|
1102
|
-
|
|
1103
|
-
case "Comparison":
|
|
1104
|
-
return hasReferenceToDefaultContext(expression.operand1) || hasReferenceToDefaultContext(expression.operand2);
|
|
1105
|
-
|
|
1106
|
-
case "DefaultBinding":
|
|
1107
|
-
return true;
|
|
1108
|
-
|
|
1109
|
-
case "IfElse":
|
|
1110
|
-
return hasReferenceToDefaultContext(expression.condition) || hasReferenceToDefaultContext(expression.onTrue) || hasReferenceToDefaultContext(expression.onFalse);
|
|
1111
|
-
|
|
1112
|
-
case "Not":
|
|
1113
|
-
case "Truthy":
|
|
1114
|
-
return hasReferenceToDefaultContext(expression.operand);
|
|
1115
|
-
|
|
1116
|
-
default:
|
|
1117
|
-
return false;
|
|
1118
|
-
}
|
|
1119
|
-
}
|
|
1120
|
-
|
|
1121
|
-
/**
|
|
1122
|
-
* Calls a formatter function to process the parameters.
|
|
1123
|
-
* If requireContext is set to true and no context is passed a default context will be added automatically.
|
|
1124
|
-
*
|
|
1125
|
-
* @template T
|
|
1126
|
-
* @template U
|
|
1127
|
-
* @param parameters The list of parameter that should match the type and number of the formatter function
|
|
1128
|
-
* @param formatterFunction The function to call
|
|
1129
|
-
* @param [contextEntityType] The context entity type to consider
|
|
1130
|
-
* @returns {Expression<T>} The corresponding expression
|
|
1131
|
-
*/
|
|
1132
|
-
function formatResult(parameters, formatterFunction, contextEntityType) {
|
|
1133
|
-
var parameterExpressions = parameters.map(wrapPrimitive);
|
|
1134
|
-
|
|
1135
|
-
if (hasUnresolveableExpression.apply(void 0, _toConsumableArray(parameterExpressions))) {
|
|
1136
|
-
return unresolveableExpression;
|
|
1137
|
-
}
|
|
1138
|
-
|
|
1139
|
-
if (!!contextEntityType) {
|
|
1140
|
-
// Otherwise, if the context is required and no context is provided make sure to add the default binding
|
|
1141
|
-
if (!parameterExpressions.some(hasReferenceToDefaultContext)) {
|
|
1142
|
-
contextEntityType.keys.forEach(function (key) {
|
|
1143
|
-
return parameterExpressions.push(bindingExpression(key.name, ""));
|
|
1144
|
-
});
|
|
1145
|
-
}
|
|
1146
|
-
} // FormatterName can be of format sap.fe.core.xxx#methodName to have multiple formatter in one class
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
var _formatterFunction$__ = formatterFunction.__functionName.split("#"),
|
|
1150
|
-
_formatterFunction$__2 = _slicedToArray(_formatterFunction$__, 2),
|
|
1151
|
-
formatterClass = _formatterFunction$__2[0],
|
|
1152
|
-
formatterName = _formatterFunction$__2[1];
|
|
1153
|
-
|
|
1154
|
-
if (!!formatterName && formatterName.length > 0) {
|
|
1155
|
-
parameterExpressions.unshift(constant(formatterName));
|
|
1156
|
-
}
|
|
1157
|
-
|
|
1158
|
-
return {
|
|
1159
|
-
_type: "Formatter",
|
|
1160
|
-
fn: formatterClass,
|
|
1161
|
-
parameters: parameterExpressions
|
|
1162
|
-
};
|
|
1163
|
-
}
|
|
1164
|
-
/**
|
|
1165
|
-
* Calls a complex type to process the parameters.
|
|
1166
|
-
* If requireContext is set to true and no context is passed a default context will be added automatically.
|
|
1167
|
-
*
|
|
1168
|
-
* @template T
|
|
1169
|
-
* @template U
|
|
1170
|
-
* @param parameters The list of parameter that should match the type for the compplex type
|
|
1171
|
-
* @param type The complex type to use
|
|
1172
|
-
* @param [contextEntityType] The context entity type to consider
|
|
1173
|
-
* @returns {Expression<T>} The corresponding expression
|
|
1174
|
-
*/
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
_exports.formatResult = formatResult;
|
|
1178
|
-
|
|
1179
|
-
function addTypeInformation(parameters, type, contextEntityType, oFormatOptions) {
|
|
1180
|
-
var _parameters$, _parameters$$type;
|
|
1181
|
-
|
|
1182
|
-
var parameterExpressions = parameters.map(wrapPrimitive);
|
|
1183
|
-
|
|
1184
|
-
if (hasUnresolveableExpression.apply(void 0, _toConsumableArray(parameterExpressions))) {
|
|
1185
|
-
return unresolveableExpression;
|
|
1186
|
-
} // If there is only one parameter and it is a constant and we don't expect the context then return the constant
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
if (parameterExpressions.length === 1 && isConstant(parameterExpressions[0]) && !contextEntityType) {
|
|
1190
|
-
return parameterExpressions[0];
|
|
1191
|
-
} else if (!!contextEntityType) {
|
|
1192
|
-
// Otherwise, if the context is required and no context is provided make sure to add the default binding
|
|
1193
|
-
if (!parameterExpressions.some(hasReferenceToDefaultContext)) {
|
|
1194
|
-
contextEntityType.keys.forEach(function (key) {
|
|
1195
|
-
return parameterExpressions.push(bindingExpression(key.name, ""));
|
|
1196
|
-
});
|
|
1197
|
-
}
|
|
1198
|
-
}
|
|
1199
|
-
|
|
1200
|
-
if (!oFormatOptions && ((_parameters$ = parameters[0]) === null || _parameters$ === void 0 ? void 0 : (_parameters$$type = _parameters$.type) === null || _parameters$$type === void 0 ? void 0 : _parameters$$type.indexOf("sap.ui.model.odata.type.Int")) === 0) {
|
|
1201
|
-
oFormatOptions = {
|
|
1202
|
-
parseAsString: false,
|
|
1203
|
-
emptyString: ""
|
|
1204
|
-
};
|
|
1205
|
-
}
|
|
1206
|
-
|
|
1207
|
-
return {
|
|
1208
|
-
_type: "ComplexType",
|
|
1209
|
-
type: type,
|
|
1210
|
-
formatOptions: oFormatOptions || {},
|
|
1211
|
-
parameters: {},
|
|
1212
|
-
bindingParameters: parameterExpressions
|
|
1213
|
-
};
|
|
1214
|
-
}
|
|
1215
|
-
/**
|
|
1216
|
-
* Function call, optionally with arguments.
|
|
1217
|
-
*
|
|
1218
|
-
* @param func Function name or reference to function
|
|
1219
|
-
* @param parameters Arguments
|
|
1220
|
-
* @param on Object to call the function on
|
|
1221
|
-
* @returns {FunctionExpression<T>} Expression representing the function call (not the result of the function call!)
|
|
1222
|
-
*/
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
_exports.addTypeInformation = addTypeInformation;
|
|
1226
|
-
|
|
1227
|
-
function fn(func, parameters, on) {
|
|
1228
|
-
var functionName = typeof func === "string" ? func : func.__functionName;
|
|
1229
|
-
return {
|
|
1230
|
-
_type: "Function",
|
|
1231
|
-
obj: on !== undefined ? wrapPrimitive(on) : undefined,
|
|
1232
|
-
fn: functionName,
|
|
1233
|
-
parameters: parameters.map(wrapPrimitive)
|
|
1234
|
-
};
|
|
1235
|
-
}
|
|
1236
|
-
/**
|
|
1237
|
-
* Shortcut function to determine if a binding value is null, undefined or empty.
|
|
1238
|
-
*
|
|
1239
|
-
* @param expression
|
|
1240
|
-
* @returns A boolean expression evaluating the fact that the current element is empty
|
|
1241
|
-
*/
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
_exports.fn = fn;
|
|
1245
|
-
|
|
1246
|
-
function isEmpty(expression) {
|
|
1247
|
-
if (expression._type === "Concat") {
|
|
1248
|
-
return or.apply(void 0, _toConsumableArray(expression.expressions.map(isEmpty)));
|
|
1249
|
-
}
|
|
1250
|
-
|
|
1251
|
-
return or(equal(expression, ""), equal(expression, undefined), equal(expression, null));
|
|
1252
|
-
}
|
|
1253
|
-
|
|
1254
|
-
_exports.isEmpty = isEmpty;
|
|
1255
|
-
|
|
1256
|
-
function concat() {
|
|
1257
|
-
for (var _len4 = arguments.length, inExpressions = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
|
|
1258
|
-
inExpressions[_key4] = arguments[_key4];
|
|
1259
|
-
}
|
|
1260
|
-
|
|
1261
|
-
var expressions = inExpressions.map(wrapPrimitive);
|
|
1262
|
-
|
|
1263
|
-
if (hasUnresolveableExpression.apply(void 0, _toConsumableArray(expressions))) {
|
|
1264
|
-
return unresolveableExpression;
|
|
1265
|
-
}
|
|
1266
|
-
|
|
1267
|
-
if (expressions.every(isConstant)) {
|
|
1268
|
-
return constant(expressions.reduce(function (concatenated, value) {
|
|
1269
|
-
return concatenated + value.value.toString();
|
|
1270
|
-
}, ""));
|
|
1271
|
-
}
|
|
1272
|
-
|
|
1273
|
-
return {
|
|
1274
|
-
_type: "Concat",
|
|
1275
|
-
expressions: expressions
|
|
1276
|
-
};
|
|
1277
|
-
}
|
|
1278
|
-
|
|
1279
|
-
_exports.concat = concat;
|
|
1280
|
-
|
|
1281
|
-
function transformRecursively(inExpression, expressionType, transformFunction) {
|
|
1282
|
-
var includeAllExpression = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
1283
|
-
var expression = inExpression;
|
|
1284
|
-
|
|
1285
|
-
switch (expression._type) {
|
|
1286
|
-
case "Function":
|
|
1287
|
-
case "Formatter":
|
|
1288
|
-
expression.parameters = expression.parameters.map(function (parameter) {
|
|
1289
|
-
return transformRecursively(parameter, expressionType, transformFunction, includeAllExpression);
|
|
1290
|
-
});
|
|
1291
|
-
break;
|
|
1292
|
-
|
|
1293
|
-
case "Concat":
|
|
1294
|
-
expression.expressions = expression.expressions.map(function (subExpression) {
|
|
1295
|
-
return transformRecursively(subExpression, expressionType, transformFunction, includeAllExpression);
|
|
1296
|
-
});
|
|
1297
|
-
break;
|
|
1298
|
-
|
|
1299
|
-
case "ComplexType":
|
|
1300
|
-
expression.bindingParameters = expression.bindingParameters.map(function (bindingParameter) {
|
|
1301
|
-
return transformRecursively(bindingParameter, expressionType, transformFunction, includeAllExpression);
|
|
1302
|
-
});
|
|
1303
|
-
break;
|
|
1304
|
-
|
|
1305
|
-
case "IfElse":
|
|
1306
|
-
var onTrue = transformRecursively(expression.onTrue, expressionType, transformFunction, includeAllExpression);
|
|
1307
|
-
var onFalse = transformRecursively(expression.onFalse, expressionType, transformFunction, includeAllExpression);
|
|
1308
|
-
var condition = expression.condition;
|
|
1309
|
-
|
|
1310
|
-
if (includeAllExpression) {
|
|
1311
|
-
condition = transformRecursively(expression.condition, expressionType, transformFunction, includeAllExpression);
|
|
1312
|
-
}
|
|
1313
|
-
|
|
1314
|
-
expression = ifElse(condition, onTrue, onFalse);
|
|
1315
|
-
break;
|
|
1316
|
-
|
|
1317
|
-
case "Not":
|
|
1318
|
-
if (includeAllExpression) {
|
|
1319
|
-
var operand = transformRecursively(expression.operand, expressionType, transformFunction, includeAllExpression);
|
|
1320
|
-
expression = not(operand);
|
|
1321
|
-
}
|
|
1322
|
-
|
|
1323
|
-
break;
|
|
1324
|
-
|
|
1325
|
-
case "Truthy":
|
|
1326
|
-
break;
|
|
1327
|
-
|
|
1328
|
-
case "Set":
|
|
1329
|
-
if (includeAllExpression) {
|
|
1330
|
-
expression.operands = expression.operands.map(function (operand) {
|
|
1331
|
-
return transformRecursively(operand, expressionType, transformFunction, includeAllExpression);
|
|
1332
|
-
});
|
|
1333
|
-
}
|
|
1334
|
-
|
|
1335
|
-
break;
|
|
1336
|
-
|
|
1337
|
-
case "Comparison":
|
|
1338
|
-
if (includeAllExpression) {
|
|
1339
|
-
var operand1 = transformRecursively(expression.operand1, expressionType, transformFunction, includeAllExpression);
|
|
1340
|
-
var operand2 = transformRecursively(expression.operand2, expressionType, transformFunction, includeAllExpression);
|
|
1341
|
-
expression = comparison(expression.operator, operand1, operand2);
|
|
1342
|
-
}
|
|
1343
|
-
|
|
1344
|
-
break;
|
|
1345
|
-
|
|
1346
|
-
case "DefaultBinding":
|
|
1347
|
-
case "Ref":
|
|
1348
|
-
case "Length":
|
|
1349
|
-
case "Binding":
|
|
1350
|
-
case "Constant":
|
|
1351
|
-
// Do nothing
|
|
1352
|
-
break;
|
|
1353
|
-
}
|
|
1354
|
-
|
|
1355
|
-
if (expressionType === expression._type) {
|
|
1356
|
-
expression = transformFunction(inExpression);
|
|
1357
|
-
}
|
|
1358
|
-
|
|
1359
|
-
return expression;
|
|
1360
|
-
}
|
|
1361
|
-
|
|
1362
|
-
_exports.transformRecursively = transformRecursively;
|
|
1363
|
-
|
|
1364
|
-
var needParenthesis = function (expr) {
|
|
1365
|
-
return !isConstant(expr) && !isBinding(expr) && isExpression(expr) && expr._type !== "IfElse" && expr._type !== "Function";
|
|
1366
|
-
};
|
|
1367
|
-
/**
|
|
1368
|
-
* Compiles a constant object to a string.
|
|
1369
|
-
* @param expr
|
|
1370
|
-
* @param isNullable
|
|
1371
|
-
* @returns {string} The compiled string
|
|
1372
|
-
*/
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
function compileConstantObject(expr) {
|
|
1376
|
-
var isNullable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
1377
|
-
|
|
1378
|
-
if (isNullable && Object.keys(expr.value).length === 0) {
|
|
1379
|
-
return "";
|
|
1380
|
-
} // Objects
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
var o = expr.value;
|
|
1384
|
-
var properties = [];
|
|
1385
|
-
Object.keys(o).forEach(function (key) {
|
|
1386
|
-
var value = o[key];
|
|
1387
|
-
var childResult = compileBinding(value, true, false, true);
|
|
1388
|
-
|
|
1389
|
-
if (childResult && childResult.length > 0) {
|
|
1390
|
-
properties.push("".concat(key, ": ").concat(childResult));
|
|
1391
|
-
}
|
|
1392
|
-
});
|
|
1393
|
-
return "{".concat(properties.join(", "), "}");
|
|
1394
|
-
}
|
|
1395
|
-
/**
|
|
1396
|
-
* Compiles a Constant Binding Expression.
|
|
1397
|
-
* @param expr
|
|
1398
|
-
* @param embeddedInBinding
|
|
1399
|
-
* @param isNullable
|
|
1400
|
-
* @returns {string} The compiled string
|
|
1401
|
-
*/
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
function compileConstant(expr, embeddedInBinding) {
|
|
1405
|
-
var isNullable = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
1406
|
-
|
|
1407
|
-
if (expr.value === null) {
|
|
1408
|
-
return "null";
|
|
1409
|
-
}
|
|
1410
|
-
|
|
1411
|
-
if (expr.value === undefined) {
|
|
1412
|
-
return "undefined";
|
|
1413
|
-
}
|
|
1414
|
-
|
|
1415
|
-
if (typeof expr.value === "object") {
|
|
1416
|
-
if (Array.isArray(expr.value)) {
|
|
1417
|
-
var entries = expr.value.map(function (expression) {
|
|
1418
|
-
return compileBinding(expression, true);
|
|
1419
|
-
});
|
|
1420
|
-
return "[".concat(entries.join(", "), "]");
|
|
1421
|
-
} else {
|
|
1422
|
-
return compileConstantObject(expr, isNullable);
|
|
1423
|
-
}
|
|
1424
|
-
}
|
|
1425
|
-
|
|
1426
|
-
if (embeddedInBinding) {
|
|
1427
|
-
switch (typeof expr.value) {
|
|
1428
|
-
case "number":
|
|
1429
|
-
case "bigint":
|
|
1430
|
-
case "boolean":
|
|
1431
|
-
return expr.value.toString();
|
|
1432
|
-
|
|
1433
|
-
case "string":
|
|
1434
|
-
return "'".concat(escapeXmlAttribute(expr.value.toString()), "'");
|
|
1435
|
-
|
|
1436
|
-
default:
|
|
1437
|
-
return "";
|
|
1438
|
-
}
|
|
1439
|
-
} else {
|
|
1440
|
-
return expr.value.toString();
|
|
1441
|
-
}
|
|
1442
|
-
}
|
|
1443
|
-
/**
|
|
1444
|
-
* Generates the binding string for a Binding expression.
|
|
1445
|
-
*
|
|
1446
|
-
* @param expressionForBinding The expression to compile
|
|
1447
|
-
* @param embeddedInBinding Whether the expression to compile is embedded into another expression
|
|
1448
|
-
* @param embeddedSeparator The binding value evaluator ($ or % depending on whether we want to force the type or not)
|
|
1449
|
-
* @returns {BindingExpression<T>} The corresponding expression binding
|
|
1450
|
-
*/
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
function compileBindingForBinding(expressionForBinding, embeddedInBinding, embeddedSeparator) {
|
|
1454
|
-
if (expressionForBinding.type || expressionForBinding.parameters || expressionForBinding.targetType || expressionForBinding.formatOptions || expressionForBinding.constraints) {
|
|
1455
|
-
// This is now a complex binding definition, let's prepare for it
|
|
1456
|
-
var complexBindingDefinition = {
|
|
1457
|
-
path: compileBindingPath(expressionForBinding),
|
|
1458
|
-
type: expressionForBinding.type,
|
|
1459
|
-
targetType: expressionForBinding.targetType,
|
|
1460
|
-
parameters: expressionForBinding.parameters,
|
|
1461
|
-
formatOptions: expressionForBinding.formatOptions,
|
|
1462
|
-
constraints: expressionForBinding.constraints
|
|
1463
|
-
};
|
|
1464
|
-
var outBinding = compileBinding(complexBindingDefinition);
|
|
1465
|
-
|
|
1466
|
-
if (embeddedInBinding) {
|
|
1467
|
-
outBinding = "".concat(embeddedSeparator) + outBinding;
|
|
1468
|
-
}
|
|
1469
|
-
|
|
1470
|
-
return outBinding;
|
|
1471
|
-
} else if (embeddedInBinding) {
|
|
1472
|
-
return "".concat(embeddedSeparator, "{").concat(compileBindingPath(expressionForBinding), "}");
|
|
1473
|
-
} else {
|
|
1474
|
-
return "{".concat(compileBindingPath(expressionForBinding), "}");
|
|
1475
|
-
}
|
|
1476
|
-
}
|
|
1477
|
-
|
|
1478
|
-
function compileComplexTypeExpression(expression) {
|
|
1479
|
-
if (expression.bindingParameters.length === 1) {
|
|
1480
|
-
return "{".concat(compilePathParameter(expression.bindingParameters[0], true), ", type: '").concat(expression.type, "'}");
|
|
1481
|
-
}
|
|
1482
|
-
|
|
1483
|
-
var outputEnd; // this code is based on sap.ui.model.odata.v4._AnnotationHelperExpression.fetchCurrencyOrUnit
|
|
1484
|
-
|
|
1485
|
-
switch (expression.type) {
|
|
1486
|
-
case "sap.ui.model.odata.type.Unit":
|
|
1487
|
-
outputEnd = ",{mode:'OneTime',path:'/##@@requestUnitsOfMeasure',targetType:'any'}],type:'sap.ui.model.odata.type.Unit'";
|
|
1488
|
-
break;
|
|
1489
|
-
|
|
1490
|
-
case "sap.ui.model.odata.type.Currency":
|
|
1491
|
-
outputEnd = ",{mode:'OneTime',path:'/##@@requestCurrencyCodes',targetType:'any'}],type:'sap.ui.model.odata.type.Currency'";
|
|
1492
|
-
break;
|
|
1493
|
-
|
|
1494
|
-
default:
|
|
1495
|
-
outputEnd = "], type: '".concat(expression.type, "'");
|
|
1496
|
-
}
|
|
1497
|
-
|
|
1498
|
-
if (hasElements(expression.formatOptions)) {
|
|
1499
|
-
outputEnd += ", formatOptions: ".concat(compileBinding(expression.formatOptions));
|
|
1500
|
-
}
|
|
1501
|
-
|
|
1502
|
-
if (hasElements(expression.parameters)) {
|
|
1503
|
-
outputEnd += ", parameters: ".concat(compileBinding(expression.parameters));
|
|
1504
|
-
}
|
|
1505
|
-
|
|
1506
|
-
outputEnd += "}";
|
|
1507
|
-
return "{mode:'TwoWay', parts:[".concat(expression.bindingParameters.map(function (param) {
|
|
1508
|
-
return compilePathParameter(param);
|
|
1509
|
-
}).join(",")).concat(outputEnd);
|
|
1510
|
-
}
|
|
1511
|
-
/**
|
|
1512
|
-
* Wrap the compiled binding string as required dependening on its context.
|
|
1513
|
-
*
|
|
1514
|
-
* @param expression The compiled expression
|
|
1515
|
-
* @param embeddedInBinding True if the compiled expression is to be embedded in a binding
|
|
1516
|
-
* @param parenthesisRequired True if the embedded binding needs to be wrapped in parethesis so that it is evaluated as one
|
|
1517
|
-
* @returns {BindingExpression<string>} Finalized compiled expression
|
|
1518
|
-
*/
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
function wrapBindingExpression(expression, embeddedInBinding) {
|
|
1522
|
-
var parenthesisRequired = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
1523
|
-
|
|
1524
|
-
if (embeddedInBinding) {
|
|
1525
|
-
if (parenthesisRequired) {
|
|
1526
|
-
return "(".concat(expression, ")");
|
|
1527
|
-
} else {
|
|
1528
|
-
return expression;
|
|
1529
|
-
}
|
|
1530
|
-
} else {
|
|
1531
|
-
return "{= ".concat(expression, "}");
|
|
1532
|
-
}
|
|
1533
|
-
}
|
|
1534
|
-
/**
|
|
1535
|
-
* Compile an expression into an expression binding.
|
|
1536
|
-
*
|
|
1537
|
-
* @template T The target type
|
|
1538
|
-
* @param expression The expression to compile
|
|
1539
|
-
* @param embeddedInBinding Whether the expression to compile is embedded into another expression
|
|
1540
|
-
* @param keepTargetType Keep the target type of the embedded bindings instead of casting them to any
|
|
1541
|
-
* @param isNullable Whether binding expression can resolve to empty string or not
|
|
1542
|
-
* @returns {BindingExpression<T>} The corresponding expression binding
|
|
1543
|
-
*/
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
function compileBinding(expression) {
|
|
1547
|
-
var embeddedInBinding = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
1548
|
-
var keepTargetType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
1549
|
-
var isNullable = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
1550
|
-
var expr = wrapPrimitive(expression);
|
|
1551
|
-
var embeddedSeparator = keepTargetType ? "$" : "%";
|
|
1552
|
-
|
|
1553
|
-
switch (expr._type) {
|
|
1554
|
-
case "Unresolvable":
|
|
1555
|
-
return undefined;
|
|
1556
|
-
|
|
1557
|
-
case "Constant":
|
|
1558
|
-
return compileConstant(expr, embeddedInBinding, isNullable);
|
|
1559
|
-
|
|
1560
|
-
case "Ref":
|
|
1561
|
-
return expr.ref || "null";
|
|
1562
|
-
|
|
1563
|
-
case "Function":
|
|
1564
|
-
var argumentString = "".concat(expr.parameters.map(function (arg) {
|
|
1565
|
-
return compileBinding(arg, true);
|
|
1566
|
-
}).join(", "));
|
|
1567
|
-
return expr.obj === undefined ? "".concat(expr.fn, "(").concat(argumentString, ")") : "".concat(compileBinding(expr.obj, true), ".").concat(expr.fn, "(").concat(argumentString, ")");
|
|
1568
|
-
|
|
1569
|
-
case "EmbeddedExpressionBinding":
|
|
1570
|
-
return embeddedInBinding ? "(".concat(expr.value.substr(2, expr.value.length - 3), ")") : "".concat(expr.value);
|
|
1571
|
-
|
|
1572
|
-
case "EmbeddedBinding":
|
|
1573
|
-
return embeddedInBinding ? "".concat(embeddedSeparator).concat(expr.value) : "".concat(expr.value);
|
|
1574
|
-
|
|
1575
|
-
case "DefaultBinding":
|
|
1576
|
-
case "Binding":
|
|
1577
|
-
return compileBindingForBinding(expr, embeddedInBinding, embeddedSeparator);
|
|
1578
|
-
|
|
1579
|
-
case "Comparison":
|
|
1580
|
-
var comparisonExpression = compileComparisonExpression(expr);
|
|
1581
|
-
return wrapBindingExpression(comparisonExpression, embeddedInBinding);
|
|
1582
|
-
|
|
1583
|
-
case "IfElse":
|
|
1584
|
-
var ifElseExpression = "".concat(compileBinding(expr.condition, true), " ? ").concat(compileBinding(expr.onTrue, true), " : ").concat(compileBinding(expr.onFalse, true));
|
|
1585
|
-
return wrapBindingExpression(ifElseExpression, embeddedInBinding, true);
|
|
1586
|
-
|
|
1587
|
-
case "Set":
|
|
1588
|
-
var setExpression = expr.operands.map(function (operand) {
|
|
1589
|
-
return compileBinding(operand, true);
|
|
1590
|
-
}).join(" ".concat(expr.operator, " "));
|
|
1591
|
-
return wrapBindingExpression(setExpression, embeddedInBinding, true);
|
|
1592
|
-
|
|
1593
|
-
case "Concat":
|
|
1594
|
-
var concatExpression = expr.expressions.map(function (nestedExpression) {
|
|
1595
|
-
return compileBinding(nestedExpression, true, true);
|
|
1596
|
-
}).join(" + ");
|
|
1597
|
-
return wrapBindingExpression(concatExpression, embeddedInBinding);
|
|
1598
|
-
|
|
1599
|
-
case "Length":
|
|
1600
|
-
var lengthExpression = "".concat(compileBinding(expr.bindingExpression, true), ".length");
|
|
1601
|
-
return wrapBindingExpression(lengthExpression, embeddedInBinding);
|
|
1602
|
-
|
|
1603
|
-
case "Not":
|
|
1604
|
-
var notExpression = "!".concat(compileBinding(expr.operand, true));
|
|
1605
|
-
return wrapBindingExpression(notExpression, embeddedInBinding);
|
|
1606
|
-
|
|
1607
|
-
case "Truthy":
|
|
1608
|
-
var truthyExpression = "!!".concat(compileBinding(expr.operand, true));
|
|
1609
|
-
return wrapBindingExpression(truthyExpression, embeddedInBinding);
|
|
1610
|
-
|
|
1611
|
-
case "Formatter":
|
|
1612
|
-
var formatterExpression = compileFormatterExpression(expr);
|
|
1613
|
-
return embeddedInBinding ? "$".concat(formatterExpression) : formatterExpression;
|
|
1614
|
-
|
|
1615
|
-
case "ComplexType":
|
|
1616
|
-
var complexTypeExpression = compileComplexTypeExpression(expr);
|
|
1617
|
-
return embeddedInBinding ? "$".concat(complexTypeExpression) : complexTypeExpression;
|
|
1618
|
-
|
|
1619
|
-
default:
|
|
1620
|
-
return "";
|
|
1621
|
-
}
|
|
1622
|
-
}
|
|
1623
|
-
/**
|
|
1624
|
-
* Compile a comparison expression.
|
|
1625
|
-
*
|
|
1626
|
-
* @param expression The comparison expression.
|
|
1627
|
-
* @returns The compiled expression. Needs wrapping before it can be used as an expression binding.
|
|
1628
|
-
*/
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
_exports.compileBinding = compileBinding;
|
|
1632
|
-
|
|
1633
|
-
function compileComparisonExpression(expression) {
|
|
1634
|
-
function compileOperand(operand) {
|
|
1635
|
-
var _compileBinding;
|
|
1636
|
-
|
|
1637
|
-
var compiledOperand = (_compileBinding = compileBinding(operand, true)) !== null && _compileBinding !== void 0 ? _compileBinding : "undefined";
|
|
1638
|
-
return wrapBindingExpression(compiledOperand, true, needParenthesis(operand));
|
|
1639
|
-
}
|
|
1640
|
-
|
|
1641
|
-
return "".concat(compileOperand(expression.operand1), " ").concat(expression.operator, " ").concat(compileOperand(expression.operand2));
|
|
1642
|
-
}
|
|
1643
|
-
/**
|
|
1644
|
-
* Compile a formatter expression.
|
|
1645
|
-
*
|
|
1646
|
-
* @param expression The formatter expression.
|
|
1647
|
-
* @returns The compiled expression.
|
|
1648
|
-
*/
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
function compileFormatterExpression(expression) {
|
|
1652
|
-
if (expression.parameters.length === 1) {
|
|
1653
|
-
return "{".concat(compilePathParameter(expression.parameters[0], true), ", formatter: '").concat(expression.fn, "'}");
|
|
1654
|
-
} else {
|
|
1655
|
-
var parts = expression.parameters.map(function (param) {
|
|
1656
|
-
return compilePathParameter(param);
|
|
1657
|
-
});
|
|
1658
|
-
return "{parts: [".concat(parts.join(", "), "], formatter: '").concat(expression.fn, "'}");
|
|
1659
|
-
}
|
|
1660
|
-
}
|
|
1661
|
-
/**
|
|
1662
|
-
* Compile the path parameter of a formatter call.
|
|
1663
|
-
*
|
|
1664
|
-
* @param expression The binding part to evaluate
|
|
1665
|
-
* @param singlePath Whether there is one or multiple path to consider
|
|
1666
|
-
* @returns {string} The string snippet to include in the overall binding definition
|
|
1667
|
-
*/
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
function compilePathParameter(expression) {
|
|
1671
|
-
var singlePath = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
1672
|
-
var outValue = "";
|
|
1673
|
-
|
|
1674
|
-
if (expression._type === "Constant") {
|
|
1675
|
-
switch (typeof expression.value) {
|
|
1676
|
-
case "number":
|
|
1677
|
-
case "bigint":
|
|
1678
|
-
outValue = "value: ".concat(expression.value.toString());
|
|
1679
|
-
break;
|
|
1680
|
-
|
|
1681
|
-
case "string":
|
|
1682
|
-
outValue = "value: '".concat(escapeXmlAttribute(expression.value.toString()), "'");
|
|
1683
|
-
break;
|
|
1684
|
-
|
|
1685
|
-
case "boolean":
|
|
1686
|
-
outValue = "value: '".concat(expression.value.toString(), "'");
|
|
1687
|
-
break;
|
|
1688
|
-
|
|
1689
|
-
default:
|
|
1690
|
-
outValue = "value: ''";
|
|
1691
|
-
break;
|
|
1692
|
-
}
|
|
1693
|
-
} else if (expression._type === "DefaultBinding" || expression._type === "Binding") {
|
|
1694
|
-
outValue = "path: '".concat(compileBindingPath(expression), "'");
|
|
1695
|
-
outValue += expression.type ? ", type: '".concat(expression.type, "'") : ", targetType: 'any'";
|
|
1696
|
-
|
|
1697
|
-
if (hasElements(expression.constraints)) {
|
|
1698
|
-
outValue += ", constraints: ".concat(compileBinding(expression.constraints));
|
|
1699
|
-
}
|
|
1700
|
-
|
|
1701
|
-
if (hasElements(expression.formatOptions)) {
|
|
1702
|
-
outValue += ", formatOptions: ".concat(compileBinding(expression.formatOptions));
|
|
1703
|
-
}
|
|
1704
|
-
|
|
1705
|
-
if (hasElements(expression.parameters)) {
|
|
1706
|
-
outValue += ", parameters: ".concat(compileBinding(expression.parameters));
|
|
1707
|
-
}
|
|
1708
|
-
} else {
|
|
1709
|
-
return "";
|
|
1710
|
-
}
|
|
1711
|
-
|
|
1712
|
-
return singlePath ? outValue : "{".concat(outValue, "}");
|
|
1713
|
-
}
|
|
1714
|
-
|
|
1715
|
-
function hasElements(obj) {
|
|
1716
|
-
return obj && Object.keys(obj).length > 0;
|
|
1717
|
-
}
|
|
1718
|
-
/**
|
|
1719
|
-
* Compile a binding expression path.
|
|
1720
|
-
*
|
|
1721
|
-
* @param expression The expression to compile.
|
|
1722
|
-
* @returns The compiled path.
|
|
1723
|
-
*/
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
function compileBindingPath(expression) {
|
|
1727
|
-
return "".concat(expression.modelName ? expression.modelName + ">" : "").concat(expression.path);
|
|
1728
|
-
}
|
|
1729
|
-
|
|
1730
|
-
return _exports;
|
|
1731
|
-
}, false);
|
|
1732
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJpbmRpbmdFeHByZXNzaW9uLnRzIl0sIm5hbWVzIjpbInVucmVzb2x2ZWFibGVFeHByZXNzaW9uIiwiX3R5cGUiLCJlc2NhcGVYbWxBdHRyaWJ1dGUiLCJpbnB1dFN0cmluZyIsInJlcGxhY2UiLCJoYXNVbnJlc29sdmVhYmxlRXhwcmVzc2lvbiIsImV4cHJlc3Npb25zIiwiZmluZCIsImV4cHIiLCJ1bmRlZmluZWQiLCJfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsIiwiYSIsImIiLCJ2YWx1ZSIsIm9wZXJhbmQiLCJvcGVyYXRvciIsIm9wZXJhbmRzIiwibGVuZ3RoIiwiZXZlcnkiLCJleHByZXNzaW9uIiwic29tZSIsIm90aGVyRXhwcmVzc2lvbiIsImNvbmRpdGlvbiIsIm9uVHJ1ZSIsIm9uRmFsc2UiLCJvcGVyYW5kMSIsIm9wZXJhbmQyIiwiYUV4cHJlc3Npb25zIiwiYkV4cHJlc3Npb25zIiwiaW5kZXgiLCJiaW5kaW5nRXhwcmVzc2lvbiIsIm1vZGVsTmFtZSIsInBhdGgiLCJ0YXJnZXRFbnRpdHlTZXQiLCJmbiIsInBhcmFtZXRlcnMiLCJ0eXBlIiwiYmluZGluZ1BhcmFtZXRlcnMiLCJvdGhlckZ1bmN0aW9uIiwib2JqIiwicmVmIiwiZmxhdHRlblNldEV4cHJlc3Npb24iLCJyZWR1Y2UiLCJyZXN1bHQiLCJjYW5kaWRhdGVzRm9yRmxhdHRlbmluZyIsImZvckVhY2giLCJjYW5kaWRhdGUiLCJlIiwicHVzaCIsImhhc09wcG9zaXRlRXhwcmVzc2lvbnMiLCJuZWdhdGVkRXhwcmVzc2lvbnMiLCJtYXAiLCJub3QiLCJpIiwiYW5kIiwid3JhcFByaW1pdGl2ZSIsImlzU3RhdGljRmFsc2UiLCJub25Ucml2aWFsRXhwcmVzc2lvbiIsImZpbHRlciIsImlzRmFsc2UiLCJpc0NvbnN0YW50IiwiY29uc3RhbnQiLCJpc1ZhbGlkIiwiaXNUcnVlIiwib3IiLCJpc1N0YXRpY1RydWUiLCJpc0NvbXBhcmlzb24iLCJpc1RydXRoeSIsInZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMiLCJwYXRoVmlzaXRvciIsInRhcmdldFBhdGgiLCJsb2NhbFBhdGgiLCJjb25jYXQiLCJqb2luIiwiY29uc3RhbnRWYWx1ZSIsIkFycmF5IiwiaXNBcnJheSIsImlzUHJpbWl0aXZlT2JqZWN0IiwidmFsdWVPZiIsIk9iamVjdCIsImVudHJpZXMiLCJwbGFpbkV4cHJlc3Npb24iLCJrZXkiLCJ2YWwiLCJ3cmFwcGVkVmFsdWUiLCJyZXNvbHZlQmluZGluZ1N0cmluZyIsInRhcmdldFR5cGUiLCJzdGFydHNXaXRoIiwicmVmZXJlbmNlIiwiaXNFeHByZXNzaW9uIiwic29tZXRoaW5nIiwibWF5YmVDb25zdGFudCIsImlzQmluZGluZyIsIm1heWJlQmluZGluZyIsIm9iamVjdFR5cGUiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJpc0NvbXBsZXhBbm5vdGF0aW9uRXhwcmVzc2lvbiIsImFubm90YXRpb25WYWx1ZSIsImFubm90YXRpb25FeHByZXNzaW9uIiwiZGVmYXVsdFZhbHVlIiwiYW5ub3RhdGlvbklmRXhwcmVzc2lvbiIsIklmIiwicGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uIiwiTm90IiwiZXF1YWwiLCJFcSIsIm5vdEVxdWFsIiwiTmUiLCJncmVhdGVyVGhhbiIsIkd0IiwiZ3JlYXRlck9yRXF1YWwiLCJHZSIsImxlc3NUaGFuIiwiTHQiLCJsZXNzT3JFcXVhbCIsIkxlIiwiT3IiLCJvckNvbmRpdGlvbiIsIkFuZCIsImFuZENvbmRpdGlvbiIsImFubm90YXRpb25BcHBseUV4cHJlc3Npb24iLCJoYXNPd25Qcm9wZXJ0eSIsIiRPciIsIiRBbmQiLCIkTm90IiwiJEVxIiwiJE5lIiwiJEd0IiwiJEdlIiwiJEx0IiwiJExlIiwiJFBhdGgiLCJGdW5jdGlvbiIsIiRGdW5jdGlvbiIsIkFwcGx5IiwiJEFwcGx5IiwiJElmIiwicmVzb2x2ZUVudW1WYWx1ZSIsIiRFbnVtTWVtYmVyIiwiaWZFbHNlIiwiYXBwbHlFeHByZXNzaW9uIiwiYXBwbHlQYXJhbSIsImFwcGx5UGFyYW1Db252ZXJ0ZWQiLCJjb21wYXJpc29uIiwibGVmdE9wZXJhbmQiLCJyaWdodE9wZXJhbmQiLCJsZWZ0RXhwcmVzc2lvbiIsInJpZ2h0RXhwcmVzc2lvbiIsImxlZnQiLCJyaWdodCIsInJlZHVjZWQiLCJjb25kaXRpb25FeHByZXNzaW9uIiwib25UcnVlRXhwcmVzc2lvbiIsIm9uRmFsc2VFeHByZXNzaW9uIiwiaGFzUmVmZXJlbmNlVG9EZWZhdWx0Q29udGV4dCIsImZvcm1hdFJlc3VsdCIsImZvcm1hdHRlckZ1bmN0aW9uIiwiY29udGV4dEVudGl0eVR5cGUiLCJwYXJhbWV0ZXJFeHByZXNzaW9ucyIsImtleXMiLCJfX2Z1bmN0aW9uTmFtZSIsInNwbGl0IiwiZm9ybWF0dGVyQ2xhc3MiLCJmb3JtYXR0ZXJOYW1lIiwidW5zaGlmdCIsImFkZFR5cGVJbmZvcm1hdGlvbiIsIm9Gb3JtYXRPcHRpb25zIiwiaW5kZXhPZiIsInBhcnNlQXNTdHJpbmciLCJlbXB0eVN0cmluZyIsImZvcm1hdE9wdGlvbnMiLCJmdW5jIiwib24iLCJmdW5jdGlvbk5hbWUiLCJpc0VtcHR5IiwiaW5FeHByZXNzaW9ucyIsImNvbmNhdGVuYXRlZCIsInRvU3RyaW5nIiwidHJhbnNmb3JtUmVjdXJzaXZlbHkiLCJpbkV4cHJlc3Npb24iLCJleHByZXNzaW9uVHlwZSIsInRyYW5zZm9ybUZ1bmN0aW9uIiwiaW5jbHVkZUFsbEV4cHJlc3Npb24iLCJwYXJhbWV0ZXIiLCJzdWJFeHByZXNzaW9uIiwiYmluZGluZ1BhcmFtZXRlciIsIm5lZWRQYXJlbnRoZXNpcyIsImNvbXBpbGVDb25zdGFudE9iamVjdCIsImlzTnVsbGFibGUiLCJvIiwicHJvcGVydGllcyIsImNoaWxkUmVzdWx0IiwiY29tcGlsZUJpbmRpbmciLCJjb21waWxlQ29uc3RhbnQiLCJlbWJlZGRlZEluQmluZGluZyIsImNvbXBpbGVCaW5kaW5nRm9yQmluZGluZyIsImV4cHJlc3Npb25Gb3JCaW5kaW5nIiwiZW1iZWRkZWRTZXBhcmF0b3IiLCJjb25zdHJhaW50cyIsImNvbXBsZXhCaW5kaW5nRGVmaW5pdGlvbiIsImNvbXBpbGVCaW5kaW5nUGF0aCIsIm91dEJpbmRpbmciLCJjb21waWxlQ29tcGxleFR5cGVFeHByZXNzaW9uIiwiY29tcGlsZVBhdGhQYXJhbWV0ZXIiLCJvdXRwdXRFbmQiLCJoYXNFbGVtZW50cyIsInBhcmFtIiwid3JhcEJpbmRpbmdFeHByZXNzaW9uIiwicGFyZW50aGVzaXNSZXF1aXJlZCIsImtlZXBUYXJnZXRUeXBlIiwiYXJndW1lbnRTdHJpbmciLCJhcmciLCJzdWJzdHIiLCJjb21wYXJpc29uRXhwcmVzc2lvbiIsImNvbXBpbGVDb21wYXJpc29uRXhwcmVzc2lvbiIsImlmRWxzZUV4cHJlc3Npb24iLCJzZXRFeHByZXNzaW9uIiwiY29uY2F0RXhwcmVzc2lvbiIsIm5lc3RlZEV4cHJlc3Npb24iLCJsZW5ndGhFeHByZXNzaW9uIiwibm90RXhwcmVzc2lvbiIsInRydXRoeUV4cHJlc3Npb24iLCJmb3JtYXR0ZXJFeHByZXNzaW9uIiwiY29tcGlsZUZvcm1hdHRlckV4cHJlc3Npb24iLCJjb21wbGV4VHlwZUV4cHJlc3Npb24iLCJjb21waWxlT3BlcmFuZCIsImNvbXBpbGVkT3BlcmFuZCIsInBhcnRzIiwic2luZ2xlUGF0aCIsIm91dFZhbHVlIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnTE8sTUFBTUEsdUJBQXVELEdBQUc7QUFDdEVDLElBQUFBLEtBQUssRUFBRTtBQUQrRCxHQUFoRTs7O0FBSVAsV0FBU0Msa0JBQVQsQ0FBNEJDLFdBQTVCLEVBQWlEO0FBQ2hELFdBQU9BLFdBQVcsQ0FBQ0MsT0FBWixDQUFvQixJQUFwQixFQUEwQixLQUExQixDQUFQO0FBQ0E7O0FBRU0sV0FBU0MsMEJBQVQsR0FBZ0Y7QUFBQSxzQ0FBekNDLFdBQXlDO0FBQXpDQSxNQUFBQSxXQUF5QztBQUFBOztBQUN0RixXQUFPQSxXQUFXLENBQUNDLElBQVosQ0FBaUIsVUFBQ0MsSUFBRDtBQUFB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LFVBQVUsQ0FBQ2dCLFVBQVosQ0FBZixFQUF3QztBQUN2Q21NLFFBQUFBLFFBQVEsNEJBQXFCckMsY0FBYyxDQUFDOUssVUFBVSxDQUFDZ0IsVUFBWixDQUFuQyxDQUFSO0FBQ0E7QUFDRCxLQWRNLE1BY0E7QUFDTixhQUFPLEVBQVA7QUFDQTs7QUFDRCxXQUFPa00sVUFBVSxHQUFHQyxRQUFILGNBQWtCQSxRQUFsQixNQUFqQjtBQUNBOztBQUVELFdBQVN4QixXQUFULENBQXFCdkssR0FBckIsRUFBK0I7QUFDOUIsV0FBT0EsR0FBRyxJQUFJd0MsTUFBTSxDQUFDaUYsSUFBUCxDQUFZekgsR0FBWixFQUFpQnRCLE1BQWpCLEdBQTBCLENBQXhDO0FBQ0E7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLFdBQVN3TCxrQkFBVCxDQUFxRHRMLFVBQXJELEVBQXlJO0FBQ3hJLHFCQUFVQSxVQUFVLENBQUNZLFNBQVgsR0FBdUJaLFVBQVUsQ0FBQ1ksU0FBWCxHQUF1QixHQUE5QyxHQUFvRCxFQUE5RCxTQUFtRVosVUFBVSxDQUFDYSxJQUE5RTtBQUNBIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRBbmRBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0QW5kQ29uZGl0aW9uYWxFeHByZXNzaW9uLFxuXHRDb25kaXRpb25hbENoZWNrT3JWYWx1ZSxcblx0RW50aXR5VHlwZSxcblx0RXFBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0RXFDb25kaXRpb25hbEV4cHJlc3Npb24sXG5cdEdlQW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdEdlQ29uZGl0aW9uYWxFeHByZXNzaW9uLFxuXHRHdEFubm90YXRpb25FeHByZXNzaW9uLFxuXHRHdENvbmRpdGlvbmFsRXhwcmVzc2lvbixcblx0SWZBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0SWZBbm5vdGF0aW9uRXhwcmVzc2lvblZhbHVlLFxuXHRMZUFubm90YXRpb25FeHByZXNzaW9uLFxuXHRMZUNvbmRpdGlvbmFsRXhwcmVzc2lvbixcblx0THRBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0THRDb25kaXRpb25hbEV4cHJlc3Npb24sXG5cdE5lQW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdE5lQ29uZGl0aW9uYWxFeHByZXNzaW9uLFxuXHROb3RBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0Tm90Q29uZGl0aW9uYWxFeHByZXNzaW9uLFxuXHRPckFubm90YXRpb25FeHByZXNzaW9uLFxuXHRPckNvbmRpdGlvbmFsRXhwcmVzc2lvbixcblx0UGF0aENvbmRpdGlvbkV4cHJlc3Npb24sXG5cdFByb3BlcnR5QW5ub3RhdGlvblZhbHVlXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHsgRW50aXR5U2V0IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvQ29udmVydGVyXCI7XG5pbXBvcnQgeyBBcHBseUFubm90YXRpb25FeHByZXNzaW9uLCBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24gfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdHlwZXMvRWRtXCI7XG5pbXBvcnQgeyByZXNvbHZlRW51bVZhbHVlIH0gZnJvbSBcIi4vQW5ub3RhdGlvbkVudW1cIjtcblxudHlwZSBQcmltaXRpdmVUeXBlID0gc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50IHwgYm9vbGVhbiB8IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbnR5cGUgQmFzZUV4cHJlc3Npb248VD4gPSB7XG5cdF90eXBlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBDb25zdGFudEV4cHJlc3Npb248VD4gPSBCYXNlRXhwcmVzc2lvbjxUPiAmIHtcblx0X3R5cGU6IFwiQ29uc3RhbnRcIjtcblx0dmFsdWU6IFQ7XG59O1xuXG50eXBlIFNldE9wZXJhdG9yID0gXCImJlwiIHwgXCJ8fFwiO1xuZXhwb3J0IHR5cGUgU2V0RXhwcmVzc2lvbiA9IEJhc2VFeHByZXNzaW9uPGJvb2xlYW4+ICYge1xuXHRfdHlwZTogXCJTZXRcIjtcblx0b3BlcmF0b3I6IFNldE9wZXJhdG9yO1xuXHRvcGVyYW5kczogRXhwcmVzc2lvbjxib29sZWFuPltdO1xufTtcblxuZXhwb3J0IHR5cGUgTm90RXhwcmVzc2lvbiA9IEJhc2VFeHByZXNzaW9uPGJvb2xlYW4+ICYge1xuXHRfdHlwZTogXCJOb3RcIjtcblx0b3BlcmFuZDogRXhwcmVzc2lvbjxib29sZWFuPjtcbn07XG5cbmV4cG9ydCB0eXBlIFRydXRoeUV4cHJlc3Npb24gPSBCYXNlRXhwcmVzc2lvbjxib29sZWFuPiAmIHtcblx0X3R5cGU6IFwiVHJ1dGh5XCI7XG5cdG9wZXJhbmQ6IEV4cHJlc3Npb248c3RyaW5nPjtcbn07XG5cbmV4cG9ydCB0eXBlIFJlZmVyZW5jZUV4cHJlc3Npb24gPSBCYXNlRXhwcmVzc2lvbjxvYmplY3Q+ICYge1xuXHRfdHlwZTogXCJSZWZcIjtcblx0cmVmOiBzdHJpbmcgfCBudWxsO1xufTtcblxuZXhwb3J0IHR5cGUgRm9ybWF0dGVyRXhwcmVzc2lvbjxUPiA9IEJhc2VFeHByZXNzaW9uPFQ+ICYge1xuXHRfdHlwZTogXCJGb3JtYXR0ZXJcIjtcblx0Zm46IHN0cmluZztcblx0cGFyYW1ldGVyczogRXhwcmVzc2lvbjxhbnk+W107XG59O1xuXG5leHBvcnQgdHlwZSBDb21wbGV4VHlwZUV4cHJlc3Npb248VD4gPSBCYXNlRXhwcmVzc2lvbjxUPiAmIHtcblx0X3R5cGU6IFwiQ29tcGxleFR5cGVcIjtcblx0dHlwZTogc3RyaW5nO1xuXHRmb3JtYXRPcHRpb25zOiBvYmplY3Q7XG5cdHBhcmFtZXRlcnM6IG9iamVjdDtcblx0YmluZGluZ1BhcmFtZXRlcnM6IEV4cHJlc3Npb248YW55PltdO1xufTtcblxuZXhwb3J0IHR5cGUgRnVuY3Rpb25FeHByZXNzaW9uPFQ+ID0gQmFzZUV4cHJlc3Npb248VD4gJiB7XG5cdF90eXBlOiBcIkZ1bmN0aW9uXCI7XG5cdG9iaj86IEV4cHJlc3Npb248b2JqZWN0Pjtcblx0Zm46IHN0cmluZztcblx0cGFyYW1ldGVyczogRXhwcmVzc2lvbjxhbnk+W107XG59O1xuXG5leHBvcnQgdHlwZSBDb25jYXRFeHByZXNzaW9uID0gQmFzZUV4cHJlc3Npb248c3RyaW5nPiAmIHtcblx0X3R5cGU6IFwiQ29uY2F0XCI7XG5cdGV4cHJlc3Npb25zOiBFeHByZXNzaW9uPHN0cmluZz5bXTtcbn07XG5cbmV4cG9ydCB0eXBlIExlbmd0aEV4cHJlc3Npb24gPSBCYXNlRXhwcmVzc2lvbjxzdHJpbmc+ICYge1xuXHRfdHlwZTogXCJMZW5ndGhcIjtcblx0YmluZGluZ0V4cHJlc3Npb246IEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxhbnk+O1xufTtcblxuZXhwb3J0IHR5cGUgVW5yZXNvbHZlYWJsZUJpbmRpbmdFeHByZXNzaW9uID0gQmFzZUV4cHJlc3Npb248c3RyaW5nPiAmIHtcblx0X3R5cGU6IFwiVW5yZXNvbHZhYmxlXCI7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvblxuICovXG5leHBvcnQgdHlwZSBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VD4gPSBCYXNlRXhwcmVzc2lvbjxUPiAmIHtcblx0X3R5cGU6IFwiQmluZGluZ1wiO1xuXHRtb2RlbE5hbWU/OiBzdHJpbmc7XG5cdHBhdGg6IHN0cmluZztcblx0dGFyZ2V0RW50aXR5U2V0PzogRW50aXR5U2V0O1xuXHR0eXBlPzogc3RyaW5nO1xuXHRjb25zdHJhaW50cz86IGFueTtcblx0cGFyYW1ldGVycz86IGFueTtcblx0dGFyZ2V0VHlwZT86IHN0cmluZztcblx0Zm9ybWF0T3B0aW9ucz86IGFueTtcbn07XG5cbmV4cG9ydCB0eXBlIERlZmF1bHRCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VD4gPSBCYXNlRXhwcmVzc2lvbjxUPiAmIHtcblx0X3R5cGU6IFwiRGVmYXVsdEJpbmRpbmdcIjtcblx0bW9kZWxOYW1lPzogc3RyaW5nO1xuXHRwYXRoOiBzdHJpbmc7XG5cdHR5cGU/OiBzdHJpbmc7XG5cdGNvbnN0cmFpbnRzPzogb2JqZWN0O1xuXHRwYXJhbWV0ZXJzPzogYW55O1xuXHR0YXJnZXRUeXBlPzogc3RyaW5nO1xuXHRmb3JtYXRPcHRpb25zPzogb2JqZWN0O1xufTtcblxuZXhwb3J0IHR5cGUgRW1iZWRkZWRCaW5kaW5nRXhwcmVzc2lvbjxUPiA9IEJhc2VFeHByZXNzaW9uPFQ+ICYge1xuXHRfdHlwZTogXCJFbWJlZGRlZEJpbmRpbmdcIjtcblx0dmFsdWU6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEVtYmVkZGVkRXhwcmVzc2lvbkJpbmRpbmdFeHByZXNzaW9uPFQ+ID0gQmFzZUV4cHJlc3Npb248VD4gJiB7XG5cdF90eXBlOiBcIkVtYmVkZGVkRXhwcmVzc2lvbkJpbmRpbmdcIjtcblx0dmFsdWU6IHN0cmluZztcbn07XG5cbnR5cGUgQ29tcGFyaXNvbk9wZXJhdG9yID0gXCI9PT1cIiB8IFwiIT09XCIgfCBcIj49XCIgfCBcIj5cIiB8IFwiPD1cIiB8IFwiPFwiO1xuZXhwb3J0IHR5cGUgQ29tcGFyaXNvbkV4cHJlc3Npb24gPSBCYXNlRXhwcmVzc2lvbjxib29sZWFuPiAmIHtcblx0X3R5cGU6IFwiQ29tcGFyaXNvblwiO1xuXHRvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yO1xuXHRvcGVyYW5kMTogRXhwcmVzc2lvbjxhbnk+O1xuXHRvcGVyYW5kMjogRXhwcmVzc2lvbjxhbnk+O1xufTtcblxuZXhwb3J0IHR5cGUgSWZFbHNlRXhwcmVzc2lvbjxUPiA9IEJhc2VFeHByZXNzaW9uPFQ+ICYge1xuXHRfdHlwZTogXCJJZkVsc2VcIjtcblx0Y29uZGl0aW9uOiBFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHRvblRydWU6IEV4cHJlc3Npb248VD47XG5cdG9uRmFsc2U6IEV4cHJlc3Npb248VD47XG59O1xuXG4vKipcbiAqIEFuIGV4cHJlc3Npb24gdGhhdCBldmFsdWF0ZXMgdG8gdHlwZSBULlxuICpcbiAqIEB0eXBlZGVmIEV4cHJlc3Npb25cbiAqL1xuZXhwb3J0IHR5cGUgRXhwcmVzc2lvbjxUPiA9XG5cdHwgVW5yZXNvbHZlYWJsZUJpbmRpbmdFeHByZXNzaW9uXG5cdHwgQ29uc3RhbnRFeHByZXNzaW9uPFQ+XG5cdHwgU2V0RXhwcmVzc2lvblxuXHR8IE5vdEV4cHJlc3Npb25cblx0fCBUcnV0aHlFeHByZXNzaW9uXG5cdHwgQ29uY2F0RXhwcmVzc2lvblxuXHR8IExlbmd0aEV4cHJlc3Npb25cblx0fCBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VD5cblx0fCBFbWJlZGRlZEJpbmRpbmdFeHByZXNzaW9uPFQ+XG5cdHwgRW1iZWRkZWRFeHByZXNzaW9uQmluZGluZ0V4cHJlc3Npb248VD5cblx0fCBEZWZhdWx0QmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFQ+XG5cdHwgQ29tcGFyaXNvbkV4cHJlc3Npb25cblx0fCBJZkVsc2VFeHByZXNzaW9uPFQ+XG5cdHwgRm9ybWF0dGVyRXhwcmVzc2lvbjxUPlxuXHR8IENvbXBsZXhUeXBlRXhwcmVzc2lvbjxUPlxuXHR8IFJlZmVyZW5jZUV4cHJlc3Npb25cblx0fCBGdW5jdGlvbkV4cHJlc3Npb248VD47XG5cbi8qKlxuICogQW4gZXhwcmVzc2lvbiB0aGF0IGV2YWx1YXRlcyB0byB0eXBlIFQsIG9yIGEgY29uc3RhbnQgdmFsdWUgb2YgdHlwZSBUXG4gKi9cbmV4cG9ydCB0eXBlIEV4cHJlc3Npb25PclByaW1pdGl2ZTxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4gPSBFeHByZXNzaW9uPFQ+IHwgVDtcblxuZXhwb3J0IGNvbnN0IHVucmVzb2x2ZWFibGVFeHByZXNzaW9uOiBVbnJlc29sdmVhYmxlQmluZGluZ0V4cHJlc3Npb24gPSB7XG5cdF90eXBlOiBcIlVucmVzb2x2YWJsZVwiXG59O1xuXG5mdW5jdGlvbiBlc2NhcGVYbWxBdHRyaWJ1dGUoaW5wdXRTdHJpbmc6IHN0cmluZykge1xuXHRyZXR1cm4gaW5wdXRTdHJpbmcucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24oLi4uZXhwcmVzc2lvbnM6IEV4cHJlc3Npb248YW55PltdKTogYm9vbGVhbiB7XG5cdHJldHVybiBleHByZXNzaW9ucy5maW5kKChleHByKSA9PiBleHByLl90eXBlID09PSBcIlVucmVzb2x2YWJsZVwiKSAhPT0gdW5kZWZpbmVkO1xufVxuLyoqXG4gKiBDaGVjayB0d28gZXhwcmVzc2lvbnMgZm9yIChkZWVwKSBlcXVhbGl0eS5cbiAqXG4gKiBAcGFyYW0gYVxuICogQHBhcmFtIGJcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHR3byBleHByZXNzaW9ucyBhcmUgZXF1YWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWw8VD4oYTogRXhwcmVzc2lvbjxUPiwgYjogRXhwcmVzc2lvbjxUPik6IGJvb2xlYW4ge1xuXHRpZiAoYS5fdHlwZSAhPT0gYi5fdHlwZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHN3aXRjaCAoYS5fdHlwZSkge1xuXHRcdGNhc2UgXCJVbnJlc29sdmFibGVcIjpcblx0XHRcdHJldHVybiBmYWxzZTsgLy8gVW5yZXNvbHZhYmxlIGlzIG5ldmVyIGVxdWFsIHRvIGFueXRoaW5nIGV2ZW4gaXRzZWxmXG5cdFx0Y2FzZSBcIkNvbnN0YW50XCI6XG5cdFx0Y2FzZSBcIkVtYmVkZGVkQmluZGluZ1wiOlxuXHRcdGNhc2UgXCJFbWJlZGRlZEV4cHJlc3Npb25CaW5kaW5nXCI6XG5cdFx0XHRyZXR1cm4gYS52YWx1ZSA9PT0gKGIgYXMgQ29uc3RhbnRFeHByZXNzaW9uPFQ+KS52YWx1ZTtcblxuXHRcdGNhc2UgXCJOb3RcIjpcblx0XHRcdHJldHVybiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGEub3BlcmFuZCwgKGIgYXMgTm90RXhwcmVzc2lvbikub3BlcmFuZCk7XG5cdFx0Y2FzZSBcIlRydXRoeVwiOlxuXHRcdFx0cmV0dXJuIF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoYS5vcGVyYW5kLCAoYiBhcyBUcnV0aHlFeHByZXNzaW9uKS5vcGVyYW5kKTtcblx0XHRjYXNlIFwiU2V0XCI6XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRhLm9wZXJhdG9yID09PSAoYiBhcyBTZXRFeHByZXNzaW9uKS5vcGVyYXRvciAmJlxuXHRcdFx0XHRhLm9wZXJhbmRzLmxlbmd0aCA9PT0gKGIgYXMgU2V0RXhwcmVzc2lvbikub3BlcmFuZHMubGVuZ3RoICYmXG5cdFx0XHRcdGEub3BlcmFuZHMuZXZlcnkoKGV4cHJlc3Npb24pID0+XG5cdFx0XHRcdFx0KGIgYXMgU2V0RXhwcmVzc2lvbikub3BlcmFuZHMuc29tZSgob3RoZXJFeHByZXNzaW9uKSA9PiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGV4cHJlc3Npb24sIG90aGVyRXhwcmVzc2lvbikpXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cblx0XHRjYXNlIFwiSWZFbHNlXCI6XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGEuY29uZGl0aW9uLCAoYiBhcyBJZkVsc2VFeHByZXNzaW9uPFQ+KS5jb25kaXRpb24pICYmXG5cdFx0XHRcdF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoYS5vblRydWUsIChiIGFzIElmRWxzZUV4cHJlc3Npb248VD4pLm9uVHJ1ZSkgJiZcblx0XHRcdFx0X2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChhLm9uRmFsc2UsIChiIGFzIElmRWxzZUV4cHJlc3Npb248VD4pLm9uRmFsc2UpXG5cdFx0XHQpO1xuXG5cdFx0Y2FzZSBcIkNvbXBhcmlzb25cIjpcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdGEub3BlcmF0b3IgPT09IChiIGFzIENvbXBhcmlzb25FeHByZXNzaW9uKS5vcGVyYXRvciAmJlxuXHRcdFx0XHRfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGEub3BlcmFuZDEsIChiIGFzIENvbXBhcmlzb25FeHByZXNzaW9uKS5vcGVyYW5kMSkgJiZcblx0XHRcdFx0X2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChhLm9wZXJhbmQyLCAoYiBhcyBDb21wYXJpc29uRXhwcmVzc2lvbikub3BlcmFuZDIpXG5cdFx0XHQpO1xuXG5cdFx0Y2FzZSBcIkNvbmNhdFwiOlxuXHRcdFx0Y29uc3QgYUV4cHJlc3Npb25zID0gYS5leHByZXNzaW9ucztcblx0XHRcdGNvbnN0IGJFeHByZXNzaW9ucyA9IChiIGFzIENvbmNhdEV4cHJlc3Npb24pLmV4cHJlc3Npb25zO1xuXHRcdFx0aWYgKGFFeHByZXNzaW9ucy5sZW5ndGggIT09IGJFeHByZXNzaW9ucy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGFFeHByZXNzaW9ucy5ldmVyeSgoZXhwcmVzc2lvbiwgaW5kZXgpID0+IHtcblx0XHRcdFx0cmV0dXJuIF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoZXhwcmVzc2lvbiwgYkV4cHJlc3Npb25zW2luZGV4XSk7XG5cdFx0XHR9KTtcblxuXHRcdGNhc2UgXCJMZW5ndGhcIjpcblx0XHRcdHJldHVybiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGEuYmluZGluZ0V4cHJlc3Npb24sIChiIGFzIExlbmd0aEV4cHJlc3Npb24pLmJpbmRpbmdFeHByZXNzaW9uKTtcblxuXHRcdGNhc2UgXCJCaW5kaW5nXCI6XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRhLm1vZGVsTmFtZSA9PT0gKGIgYXMgQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFQ+KS5tb2RlbE5hbWUgJiZcblx0XHRcdFx0YS5wYXRoID09PSAoYiBhcyBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VD4pLnBhdGggJiZcblx0XHRcdFx0YS50YXJnZXRFbnRpdHlTZXQgPT09IChiIGFzIEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUPikudGFyZ2V0RW50aXR5U2V0XG5cdFx0XHQpO1xuXG5cdFx0Y2FzZSBcIkRlZmF1bHRCaW5kaW5nXCI6XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRhLm1vZGVsTmFtZSA9PT0gKGIgYXMgRGVmYXVsdEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUPikubW9kZWxOYW1lICYmXG5cdFx0XHRcdGEucGF0aCA9PT0gKGIgYXMgRGVmYXVsdEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUPikucGF0aFxuXHRcdFx0KTtcblxuXHRcdGNhc2UgXCJGb3JtYXR0ZXJcIjpcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdGEuZm4gPT09IChiIGFzIEZvcm1hdHRlckV4cHJlc3Npb248VD4pLmZuICYmXG5cdFx0XHRcdGEucGFyYW1ldGVycy5sZW5ndGggPT09IChiIGFzIEZvcm1hdHRlckV4cHJlc3Npb248VD4pLnBhcmFtZXRlcnMubGVuZ3RoICYmXG5cdFx0XHRcdGEucGFyYW1ldGVycy5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKChiIGFzIEZvcm1hdHRlckV4cHJlc3Npb248VD4pLnBhcmFtZXRlcnNbaW5kZXhdLCB2YWx1ZSkpXG5cdFx0XHQpO1xuXHRcdGNhc2UgXCJDb21wbGV4VHlwZVwiOlxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0YS50eXBlID09PSAoYiBhcyBDb21wbGV4VHlwZUV4cHJlc3Npb248VD4pLnR5cGUgJiZcblx0XHRcdFx0YS5iaW5kaW5nUGFyYW1ldGVycy5sZW5ndGggPT09IChiIGFzIENvbXBsZXhUeXBlRXhwcmVzc2lvbjxUPikuYmluZGluZ1BhcmFtZXRlcnMubGVuZ3RoICYmXG5cdFx0XHRcdGEuYmluZGluZ1BhcmFtZXRlcnMuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT5cblx0XHRcdFx0XHRfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKChiIGFzIENvbXBsZXhUeXBlRXhwcmVzc2lvbjxUPikuYmluZGluZ1BhcmFtZXRlcnNbaW5kZXhdLCB2YWx1ZSlcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHRjYXNlIFwiRnVuY3Rpb25cIjpcblx0XHRcdGNvbnN0IG90aGVyRnVuY3Rpb24gPSBiIGFzIEZ1bmN0aW9uRXhwcmVzc2lvbjxUPjtcblx0XHRcdGlmIChhLm9iaiA9PT0gdW5kZWZpbmVkIHx8IG90aGVyRnVuY3Rpb24ub2JqID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIGEub2JqID09PSBvdGhlckZ1bmN0aW9uO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRhLmZuID09PSBvdGhlckZ1bmN0aW9uLmZuICYmXG5cdFx0XHRcdF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoYS5vYmosIG90aGVyRnVuY3Rpb24ub2JqKSAmJlxuXHRcdFx0XHRhLnBhcmFtZXRlcnMubGVuZ3RoID09PSBvdGhlckZ1bmN0aW9uLnBhcmFtZXRlcnMubGVuZ3RoICYmXG5cdFx0XHRcdGEucGFyYW1ldGVycy5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKG90aGVyRnVuY3Rpb24ucGFyYW1ldGVyc1tpbmRleF0sIHZhbHVlKSlcblx0XHRcdCk7XG5cblx0XHRjYXNlIFwiUmVmXCI6XG5cdFx0XHRyZXR1cm4gYS5yZWYgPT09IChiIGFzIFJlZmVyZW5jZUV4cHJlc3Npb24pLnJlZjtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBuZXN0ZWQgU2V0RXhwcmVzc2lvbiBieSBpbmxpbmluZyBvcGVyYW5kcyBvZiB0eXBlIFNldEV4cHJlc3Npb24gd2l0aCB0aGUgc2FtZSBvcGVyYXRvci5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB0byBmbGF0dGVuXG4gKiBAcmV0dXJucyB7U2V0RXhwcmVzc2lvbn0gQSBuZXcgU2V0RXhwcmVzc2lvbiB3aXRoIHRoZSBzYW1lIG9wZXJhdG9yXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5TZXRFeHByZXNzaW9uKGV4cHJlc3Npb246IFNldEV4cHJlc3Npb24pOiBTZXRFeHByZXNzaW9uIHtcblx0cmV0dXJuIGV4cHJlc3Npb24ub3BlcmFuZHMucmVkdWNlKFxuXHRcdChyZXN1bHQ6IFNldEV4cHJlc3Npb24sIG9wZXJhbmQpID0+IHtcblx0XHRcdGNvbnN0IGNhbmRpZGF0ZXNGb3JGbGF0dGVuaW5nID1cblx0XHRcdFx0b3BlcmFuZC5fdHlwZSA9PT0gXCJTZXRcIiAmJiBvcGVyYW5kLm9wZXJhdG9yID09PSBleHByZXNzaW9uLm9wZXJhdG9yID8gb3BlcmFuZC5vcGVyYW5kcyA6IFtvcGVyYW5kXTtcblx0XHRcdGNhbmRpZGF0ZXNGb3JGbGF0dGVuaW5nLmZvckVhY2goKGNhbmRpZGF0ZSkgPT4ge1xuXHRcdFx0XHRpZiAocmVzdWx0Lm9wZXJhbmRzLmV2ZXJ5KChlKSA9PiAhX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChlLCBjYW5kaWRhdGUpKSkge1xuXHRcdFx0XHRcdHJlc3VsdC5vcGVyYW5kcy5wdXNoKGNhbmRpZGF0ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9LFxuXHRcdHsgX3R5cGU6IFwiU2V0XCIsIG9wZXJhdG9yOiBleHByZXNzaW9uLm9wZXJhdG9yLCBvcGVyYW5kczogW10gfVxuXHQpO1xufVxuXG4vKipcbiAqIERldGVjdHMgd2hldGhlciBhbiBhcnJheSBvZiBib29sZWFuIGV4cHJlc3Npb25zIGNvbnRhaW5zIGFuIGV4cHJlc3Npb24gYW5kIGl0cyBuZWdhdGlvbi5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbnMgQXJyYXkgb2YgZXhwcmVzc2lvbnNcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHNldCBvZiBleHByZXNzaW9ucyBjb250YWlucyBhbiBleHByZXNzaW9uIGFuZCBpdHMgbmVnYXRpb25cbiAqL1xuZnVuY3Rpb24gaGFzT3Bwb3NpdGVFeHByZXNzaW9ucyhleHByZXNzaW9uczogRXhwcmVzc2lvbjxib29sZWFuPltdKTogYm9vbGVhbiB7XG5cdGNvbnN0IG5lZ2F0ZWRFeHByZXNzaW9ucyA9IGV4cHJlc3Npb25zLm1hcChub3QpO1xuXHRyZXR1cm4gZXhwcmVzc2lvbnMuc29tZSgoZXhwcmVzc2lvbiwgaW5kZXgpID0+IHtcblx0XHRmb3IgKGxldCBpID0gaW5kZXggKyAxOyBpIDwgbmVnYXRlZEV4cHJlc3Npb25zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChleHByZXNzaW9uLCBuZWdhdGVkRXhwcmVzc2lvbnNbaV0pKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0pO1xufVxuXG4vKipcbiAqIExvZ2ljYWwgYGFuZGAgZXhwcmVzc2lvbi5cbiAqXG4gKiBUaGUgZXhwcmVzc2lvbiBpcyBzaW1wbGlmaWVkIHRvIGZhbHNlIGlmIHRoaXMgY2FuIGJlIGRlY2lkZWQgc3RhdGljYWxseSAodGhhdCBpcywgaWYgb25lIG9wZXJhbmQgaXMgYSBjb25zdGFudFxuICogZmFsc2Ugb3IgaWYgdGhlIGV4cHJlc3Npb24gY29udGFpbnMgYW4gb3BlcmFuZCBhbmQgaXRzIG5lZ2F0aW9uKS5cbiAqXG4gKiBAcGFyYW0gb3BlcmFuZHMgRXhwcmVzc2lvbnMgdG8gY29ubmVjdCBieSBgYW5kYFxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj59IEV4cHJlc3Npb24gZXZhbHVhdGluZyB0byBib29sZWFuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbmQoLi4ub3BlcmFuZHM6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxib29sZWFuPltdKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGV4cHJlc3Npb25zID0gZmxhdHRlblNldEV4cHJlc3Npb24oe1xuXHRcdF90eXBlOiBcIlNldFwiLFxuXHRcdG9wZXJhdG9yOiBcIiYmXCIsXG5cdFx0b3BlcmFuZHM6IG9wZXJhbmRzLm1hcCh3cmFwUHJpbWl0aXZlKVxuXHR9KS5vcGVyYW5kcztcblxuXHRpZiAoaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24oLi4uZXhwcmVzc2lvbnMpKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdGxldCBpc1N0YXRpY0ZhbHNlID0gZmFsc2U7XG5cdGNvbnN0IG5vblRyaXZpYWxFeHByZXNzaW9uID0gZXhwcmVzc2lvbnMuZmlsdGVyKChleHByZXNzaW9uKSA9PiB7XG5cdFx0aWYgKGlzRmFsc2UoZXhwcmVzc2lvbikpIHtcblx0XHRcdGlzU3RhdGljRmFsc2UgPSB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gIWlzQ29uc3RhbnQoZXhwcmVzc2lvbik7XG5cdH0pO1xuXHRpZiAoaXNTdGF0aWNGYWxzZSkge1xuXHRcdHJldHVybiBjb25zdGFudChmYWxzZSk7XG5cdH0gZWxzZSBpZiAobm9uVHJpdmlhbEV4cHJlc3Npb24ubGVuZ3RoID09PSAwKSB7XG5cdFx0Ly8gUmVzb2x2ZSB0aGUgY29uc3RhbnQgdGhlblxuXHRcdGNvbnN0IGlzVmFsaWQgPSBleHByZXNzaW9ucy5yZWR1Y2UoKHJlc3VsdCwgZXhwcmVzc2lvbikgPT4gcmVzdWx0ICYmIGlzVHJ1ZShleHByZXNzaW9uKSwgdHJ1ZSk7XG5cdFx0cmV0dXJuIGNvbnN0YW50KGlzVmFsaWQpO1xuXHR9IGVsc2UgaWYgKG5vblRyaXZpYWxFeHByZXNzaW9uLmxlbmd0aCA9PT0gMSkge1xuXHRcdHJldHVybiBub25Ucml2aWFsRXhwcmVzc2lvblswXTtcblx0fSBlbHNlIGlmIChoYXNPcHBvc2l0ZUV4cHJlc3Npb25zKG5vblRyaXZpYWxFeHByZXNzaW9uKSkge1xuXHRcdHJldHVybiBjb25zdGFudChmYWxzZSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdF90eXBlOiBcIlNldFwiLFxuXHRcdFx0b3BlcmF0b3I6IFwiJiZcIixcblx0XHRcdG9wZXJhbmRzOiBub25Ucml2aWFsRXhwcmVzc2lvblxuXHRcdH07XG5cdH1cbn1cblxuLyoqXG4gKiBMb2dpY2FsIGBvcmAgZXhwcmVzc2lvbi5cbiAqXG4gKiBUaGUgZXhwcmVzc2lvbiBpcyBzaW1wbGlmaWVkIHRvIHRydWUgaWYgdGhpcyBjYW4gYmUgZGVjaWRlZCBzdGF0aWNhbGx5ICh0aGF0IGlzLCBpZiBvbmUgb3BlcmFuZCBpcyBhIGNvbnN0YW50XG4gKiB0cnVlIG9yIGlmIHRoZSBleHByZXNzaW9uIGNvbnRhaW5zIGFuIG9wZXJhbmQgYW5kIGl0cyBuZWdhdGlvbikuXG4gKlxuICogQHBhcmFtIG9wZXJhbmRzIEV4cHJlc3Npb25zIHRvIGNvbm5lY3QgYnkgYG9yYFxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj59IEV4cHJlc3Npb24gZXZhbHVhdGluZyB0byBib29sZWFuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvciguLi5vcGVyYW5kczogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+W10pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgZXhwcmVzc2lvbnMgPSBmbGF0dGVuU2V0RXhwcmVzc2lvbih7XG5cdFx0X3R5cGU6IFwiU2V0XCIsXG5cdFx0b3BlcmF0b3I6IFwifHxcIixcblx0XHRvcGVyYW5kczogb3BlcmFuZHMubWFwKHdyYXBQcmltaXRpdmUpXG5cdH0pLm9wZXJhbmRzO1xuXHRpZiAoaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24oLi4uZXhwcmVzc2lvbnMpKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdGxldCBpc1N0YXRpY1RydWUgPSBmYWxzZTtcblx0Y29uc3Qgbm9uVHJpdmlhbEV4cHJlc3Npb24gPSBleHByZXNzaW9ucy5maWx0ZXIoKGV4cHJlc3Npb24pID0+IHtcblx0XHRpZiAoaXNUcnVlKGV4cHJlc3Npb24pKSB7XG5cdFx0XHRpc1N0YXRpY1RydWUgPSB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gIWlzQ29uc3RhbnQoZXhwcmVzc2lvbikgfHwgZXhwcmVzc2lvbi52YWx1ZTtcblx0fSk7XG5cdGlmIChpc1N0YXRpY1RydWUpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQodHJ1ZSk7XG5cdH0gZWxzZSBpZiAobm9uVHJpdmlhbEV4cHJlc3Npb24ubGVuZ3RoID09PSAwKSB7XG5cdFx0Ly8gUmVzb2x2ZSB0aGUgY29uc3RhbnQgdGhlblxuXHRcdGNvbnN0IGlzVmFsaWQgPSBleHByZXNzaW9ucy5yZWR1Y2UoKHJlc3VsdCwgZXhwcmVzc2lvbikgPT4gcmVzdWx0ICYmIGlzVHJ1ZShleHByZXNzaW9uKSwgdHJ1ZSk7XG5cdFx0cmV0dXJuIGNvbnN0YW50KGlzVmFsaWQpO1xuXHR9IGVsc2UgaWYgKG5vblRyaXZpYWxFeHByZXNzaW9uLmxlbmd0aCA9PT0gMSkge1xuXHRcdHJldHVybiBub25Ucml2aWFsRXhwcmVzc2lvblswXTtcblx0fSBlbHNlIGlmIChoYXNPcHBvc2l0ZUV4cHJlc3Npb25zKG5vblRyaXZpYWxFeHByZXNzaW9uKSkge1xuXHRcdHJldHVybiBjb25zdGFudCh0cnVlKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0X3R5cGU6IFwiU2V0XCIsXG5cdFx0XHRvcGVyYXRvcjogXCJ8fFwiLFxuXHRcdFx0b3BlcmFuZHM6IG5vblRyaXZpYWxFeHByZXNzaW9uXG5cdFx0fTtcblx0fVxufVxuXG4vKipcbiAqIExvZ2ljYWwgYG5vdGAgb3BlcmF0b3IuXG4gKlxuICogQHBhcmFtIG9wZXJhbmQgVGhlIGV4cHJlc3Npb24gdG8gcmV2ZXJzZVxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj59IFRoZSByZXN1bHRpbmcgZXhwcmVzc2lvbiB0aGF0IGV2YWx1YXRlcyB0byBib29sZWFuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3Qob3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+KTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdG9wZXJhbmQgPSB3cmFwUHJpbWl0aXZlKG9wZXJhbmQpO1xuXHRpZiAoaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24ob3BlcmFuZCkpIHtcblx0XHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG5cdH0gZWxzZSBpZiAoaXNDb25zdGFudChvcGVyYW5kKSkge1xuXHRcdHJldHVybiBjb25zdGFudCghb3BlcmFuZC52YWx1ZSk7XG5cdH0gZWxzZSBpZiAoXG5cdFx0dHlwZW9mIG9wZXJhbmQgPT09IFwib2JqZWN0XCIgJiZcblx0XHRvcGVyYW5kLl90eXBlID09PSBcIlNldFwiICYmXG5cdFx0b3BlcmFuZC5vcGVyYXRvciA9PT0gXCJ8fFwiICYmXG5cdFx0b3BlcmFuZC5vcGVyYW5kcy5ldmVyeSgoZXhwcmVzc2lvbikgPT4gaXNDb25zdGFudChleHByZXNzaW9uKSB8fCBpc0NvbXBhcmlzb24oZXhwcmVzc2lvbikpXG5cdCkge1xuXHRcdHJldHVybiBhbmQoLi4ub3BlcmFuZC5vcGVyYW5kcy5tYXAoKGV4cHJlc3Npb24pID0+IG5vdChleHByZXNzaW9uKSkpO1xuXHR9IGVsc2UgaWYgKFxuXHRcdHR5cGVvZiBvcGVyYW5kID09PSBcIm9iamVjdFwiICYmXG5cdFx0b3BlcmFuZC5fdHlwZSA9PT0gXCJTZXRcIiAmJlxuXHRcdG9wZXJhbmQub3BlcmF0b3IgPT09IFwiJiZcIiAmJlxuXHRcdG9wZXJhbmQub3BlcmFuZHMuZXZlcnkoKGV4cHJlc3Npb24pID0+IGlzQ29uc3RhbnQoZXhwcmVzc2lvbikgfHwgaXNDb21wYXJpc29uKGV4cHJlc3Npb24pKVxuXHQpIHtcblx0XHRyZXR1cm4gb3IoLi4ub3BlcmFuZC5vcGVyYW5kcy5tYXAoKGV4cHJlc3Npb24pID0+IG5vdChleHByZXNzaW9uKSkpO1xuXHR9IGVsc2UgaWYgKGlzQ29tcGFyaXNvbihvcGVyYW5kKSkge1xuXHRcdC8vIENyZWF0ZSB0aGUgcmV2ZXJzZSBjb21wYXJpc29uXG5cdFx0c3dpdGNoIChvcGVyYW5kLm9wZXJhdG9yKSB7XG5cdFx0XHRjYXNlIFwiIT09XCI6XG5cdFx0XHRcdHJldHVybiB7IC4uLm9wZXJhbmQsIG9wZXJhdG9yOiBcIj09PVwiIH07XG5cdFx0XHRjYXNlIFwiPFwiOlxuXHRcdFx0XHRyZXR1cm4geyAuLi5vcGVyYW5kLCBvcGVyYXRvcjogXCI+PVwiIH07XG5cdFx0XHRjYXNlIFwiPD1cIjpcblx0XHRcdFx0cmV0dXJuIHsgLi4ub3BlcmFuZCwgb3BlcmF0b3I6IFwiPlwiIH07XG5cdFx0XHRjYXNlIFwiPT09XCI6XG5cdFx0XHRcdHJldHVybiB7IC4uLm9wZXJhbmQsIG9wZXJhdG9yOiBcIiE9PVwiIH07XG5cdFx0XHRjYXNlIFwiPlwiOlxuXHRcdFx0XHRyZXR1cm4geyAuLi5vcGVyYW5kLCBvcGVyYXRvcjogXCI8PVwiIH07XG5cdFx0XHRjYXNlIFwiPj1cIjpcblx0XHRcdFx0cmV0dXJuIHsgLi4ub3BlcmFuZCwgb3BlcmF0b3I6IFwiPFwiIH07XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG9wZXJhbmQuX3R5cGUgPT09IFwiTm90XCIpIHtcblx0XHRyZXR1cm4gb3BlcmFuZC5vcGVyYW5kO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRfdHlwZTogXCJOb3RcIixcblx0XHRvcGVyYW5kOiBvcGVyYW5kXG5cdH07XG59XG5cbi8qKlxuICogRXZhbHVhdGVzIHdoZXRoZXIgYSBiaW5kaW5nIGV4cHJlc3Npb24gaXMgZXF1YWwgdG8gdHJ1ZSB3aXRoIGEgbG9vc2UgZXF1YWxpdHkuXG4gKlxuICogQHBhcmFtIG9wZXJhbmQgVGhlIGV4cHJlc3Npb24gdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBUaGUgcmVzdWx0aW5nIGV4cHJlc3Npb24gdGhhdCBldmFsdWF0ZXMgdG8gYm9vbGVhblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUcnV0aHkob3BlcmFuZDogRXhwcmVzc2lvbjxzdHJpbmc+KTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGlmIChpc0NvbnN0YW50KG9wZXJhbmQpKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KCEhb3BlcmFuZC52YWx1ZSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdF90eXBlOiBcIlRydXRoeVwiLFxuXHRcdFx0b3BlcmFuZDogb3BlcmFuZFxuXHRcdH07XG5cdH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgYmluZGluZyBleHByZXNzaW9uIHRoYXQgd2lsbCBiZSBldmFsdWF0ZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgbW9kZWwuXG4gKlxuICogQHRlbXBsYXRlIFRhcmdldFR5cGVcbiAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIG9uIHRoZSBtb2RlbFxuICogQHBhcmFtIFttb2RlbE5hbWVdIFRoZSBuYW1lIG9mIHRoZSBtb2RlbFxuICogQHBhcmFtIFt2aXNpdGVkTmF2aWdhdGlvblBhdGhzXSBUaGUgcGF0aHMgZnJvbSB0aGUgcm9vdCBlbnRpdHlTZXRcbiAqIEBwYXJhbSBbcGF0aFZpc2l0b3JdIEEgZnVuY3Rpb24gdG8gbW9kaWZ5IHRoZSByZXN1bHRpbmcgcGF0aFxuICogQHJldHVybnMge0JpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUYXJnZXRUeXBlPn0gVGhlIGRlZmF1bHQgYmluZGluZyBleHByZXNzaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5kaW5nRXhwcmVzc2lvbjxUYXJnZXRUeXBlIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0bW9kZWxOYW1lPzogc3RyaW5nLFxuXHR2aXNpdGVkTmF2aWdhdGlvblBhdGhzOiBzdHJpbmdbXSA9IFtdLFxuXHRwYXRoVmlzaXRvcj86IEZ1bmN0aW9uXG4pOiBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VGFyZ2V0VHlwZT4gfCBVbnJlc29sdmVhYmxlQmluZGluZ0V4cHJlc3Npb24ge1xuXHRpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdGxldCB0YXJnZXRQYXRoO1xuXHRpZiAocGF0aFZpc2l0b3IpIHtcblx0XHR0YXJnZXRQYXRoID0gcGF0aFZpc2l0b3IocGF0aCk7XG5cdFx0aWYgKHRhcmdldFBhdGggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRjb25zdCBsb2NhbFBhdGggPSB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLmNvbmNhdCgpO1xuXHRcdGxvY2FsUGF0aC5wdXNoKHBhdGgpO1xuXHRcdHRhcmdldFBhdGggPSBsb2NhbFBhdGguam9pbihcIi9cIik7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRfdHlwZTogXCJCaW5kaW5nXCIsXG5cdFx0bW9kZWxOYW1lOiBtb2RlbE5hbWUsXG5cdFx0cGF0aDogdGFyZ2V0UGF0aFxuXHR9O1xufVxuXG50eXBlIFBsYWluRXhwcmVzc2lvbk9iamVjdCA9IHsgW2luZGV4OiBzdHJpbmddOiBFeHByZXNzaW9uPGFueT4gfTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBiYXNlZCBvbiBhIHByaW1pdGl2ZSB2YWx1ZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHZhbHVlIFRoZSBjb25zdGFudCB0byB3cmFwIGluIGFuIGV4cHJlc3Npb25cbiAqIEByZXR1cm5zIHtDb25zdGFudEV4cHJlc3Npb248VD59IFRoZSBjb25zdGFudCBleHByZXNzaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdGFudDxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4odmFsdWU6IFQpOiBDb25zdGFudEV4cHJlc3Npb248VD4ge1xuXHRsZXQgY29uc3RhbnRWYWx1ZTogVDtcblxuXHRpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRcdGNvbnN0YW50VmFsdWUgPSB2YWx1ZS5tYXAod3JhcFByaW1pdGl2ZSkgYXMgVDtcblx0XHR9IGVsc2UgaWYgKGlzUHJpbWl0aXZlT2JqZWN0KHZhbHVlKSkge1xuXHRcdFx0Y29uc3RhbnRWYWx1ZSA9IHZhbHVlLnZhbHVlT2YoKSBhcyBUO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdGFudFZhbHVlID0gT2JqZWN0LmVudHJpZXModmFsdWUpLnJlZHVjZSgocGxhaW5FeHByZXNzaW9uLCBba2V5LCB2YWxdKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHdyYXBwZWRWYWx1ZSA9IHdyYXBQcmltaXRpdmUodmFsKTtcblx0XHRcdFx0aWYgKHdyYXBwZWRWYWx1ZS5fdHlwZSAhPT0gXCJDb25zdGFudFwiIHx8IHdyYXBwZWRWYWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0cGxhaW5FeHByZXNzaW9uW2tleV0gPSB3cmFwcGVkVmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHBsYWluRXhwcmVzc2lvbjtcblx0XHRcdH0sIHt9IGFzIFBsYWluRXhwcmVzc2lvbk9iamVjdCkgYXMgVDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Y29uc3RhbnRWYWx1ZSA9IHZhbHVlO1xuXHR9XG5cblx0cmV0dXJuIHsgX3R5cGU6IFwiQ29uc3RhbnRcIiwgdmFsdWU6IGNvbnN0YW50VmFsdWUgfTtcbn1cblxudHlwZSBFdmFsdWF0aW9uVHlwZSA9IFwiYm9vbGVhblwiO1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCaW5kaW5nU3RyaW5nPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0dmFsdWU6IHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIsXG5cdHRhcmdldFR5cGU/OiBFdmFsdWF0aW9uVHlwZVxuKTogQ29uc3RhbnRFeHByZXNzaW9uPFQ+IHwgRW1iZWRkZWRCaW5kaW5nRXhwcmVzc2lvbjxUPiB8IEVtYmVkZGVkRXhwcmVzc2lvbkJpbmRpbmdFeHByZXNzaW9uPFQ+IHtcblx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLnN0YXJ0c1dpdGgoXCJ7XCIpKSB7XG5cdFx0aWYgKHZhbHVlLnN0YXJ0c1dpdGgoXCJ7PVwiKSkge1xuXHRcdFx0Ly8gRXhwcmVzc2lvbiBiaW5kaW5nLCB3ZSBjYW4ganVzdCByZW1vdmUgdGhlIG91dGVyIGJpbmRpbmcgdGhpbmdzXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRfdHlwZTogXCJFbWJlZGRlZEV4cHJlc3Npb25CaW5kaW5nXCIsXG5cdFx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0X3R5cGU6IFwiRW1iZWRkZWRCaW5kaW5nXCIsXG5cdFx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdFx0fTtcblx0XHR9XG5cdH0gZWxzZSBpZiAodGFyZ2V0VHlwZSA9PT0gXCJib29sZWFuXCIgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmICh2YWx1ZSA9PT0gXCJ0cnVlXCIgfHwgdmFsdWUgPT09IFwiZmFsc2VcIikpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQodmFsdWUgPT09IFwidHJ1ZVwiKSBhcyBDb25zdGFudEV4cHJlc3Npb248VD47XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KHZhbHVlKSBhcyBDb25zdGFudEV4cHJlc3Npb248VD47XG5cdH1cbn1cblxuLyoqXG4gKiBBIG5hbWVkIHJlZmVyZW5jZS5cbiAqXG4gKiBAc2VlIGZuXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZSBSZWZlcmVuY2VcbiAqIEByZXR1cm5zIHtSZWZlcmVuY2VFeHByZXNzaW9ufSBUaGUgb2JqZWN0IHJlZmVyZW5jZSBiaW5kaW5nIHBhcnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZihyZWZlcmVuY2U6IHN0cmluZyB8IG51bGwpOiBSZWZlcmVuY2VFeHByZXNzaW9uIHtcblx0cmV0dXJuIHsgX3R5cGU6IFwiUmVmXCIsIHJlZjogcmVmZXJlbmNlIH07XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHR5cGUgaXMgYW4gZXhwcmVzc2lvbi5cbiAqXG4gKiBFdmVyeSBvYmplY3QgaGF2aW5nIGEgcHJvcGVydHkgbmFtZWQgYF90eXBlYCBvZiBzb21lIHZhbHVlIGlzIGNvbnNpZGVyZWQgYW4gZXhwcmVzc2lvbiwgZXZlbiBpZiB0aGVyZSBpcyBhY3R1YWxseVxuICogbm8gc3VjaCBleHByZXNzaW9uIHR5cGUgc3VwcG9ydGVkLlxuICpcbiAqIEBwYXJhbSBzb21ldGhpbmcgVHlwZSB0byBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdHlwZSBpcyBjb25zaWRlcmVkIHRvIGJlIGFuIGV4cHJlc3Npb25cbiAqL1xuZnVuY3Rpb24gaXNFeHByZXNzaW9uPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihzb21ldGhpbmc6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPik6IHNvbWV0aGluZyBpcyBFeHByZXNzaW9uPFQ+IHtcblx0cmV0dXJuIHNvbWV0aGluZyAhPT0gbnVsbCAmJiB0eXBlb2Ygc29tZXRoaW5nID09PSBcIm9iamVjdFwiICYmIChzb21ldGhpbmcgYXMgQmFzZUV4cHJlc3Npb248VD4pLl90eXBlICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogV3JhcCBhIHByaW1pdGl2ZSBpbnRvIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBpZiBpdCBpcyBub3QgYWxyZWFkeSBhbiBleHByZXNzaW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0gc29tZXRoaW5nIFRoZSBvYmplY3QgdG8gd3JhcCBpbiBhIENvbnN0YW50IGV4cHJlc3Npb25cbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPFQ+fSBFaXRoZXIgdGhlIG9yaWdpbmFsIG9iamVjdCBvciB0aGUgd3JhcHBlZCBvbmUgZGVwZW5kaW5nIG9uIHRoZSBjYXNlXG4gKi9cbmZ1bmN0aW9uIHdyYXBQcmltaXRpdmU8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KHNvbWV0aGluZzogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+KTogRXhwcmVzc2lvbjxUPiB7XG5cdGlmIChpc0V4cHJlc3Npb24oc29tZXRoaW5nKSkge1xuXHRcdHJldHVybiBzb21ldGhpbmc7XG5cdH1cblxuXHRyZXR1cm4gY29uc3RhbnQoc29tZXRoaW5nKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGV4cHJlc3Npb24gb3IgdmFsdWUgcHJvdmlkZWQgaXMgY29uc3RhbnQgb3Igbm90LlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtICBtYXliZUNvbnN0YW50IFRoZSBleHByZXNzaW9uIG9yIHByaW1pdGl2ZSB2YWx1ZSB0aGF0IGlzIHRvIGJlIGNoZWNrZWRcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgaXQgaXMgY29uc3RhbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29uc3RhbnQ8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KG1heWJlQ29uc3RhbnQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPik6IG1heWJlQ29uc3RhbnQgaXMgQ29uc3RhbnRFeHByZXNzaW9uPFQ+IHtcblx0cmV0dXJuIHR5cGVvZiBtYXliZUNvbnN0YW50ICE9PSBcIm9iamVjdFwiIHx8IChtYXliZUNvbnN0YW50IGFzIEJhc2VFeHByZXNzaW9uPFQ+KS5fdHlwZSA9PT0gXCJDb25zdGFudFwiO1xufVxuXG5mdW5jdGlvbiBpc1RydWUoZXhwcmVzc2lvbjogRXhwcmVzc2lvbjxQcmltaXRpdmVUeXBlPikge1xuXHRyZXR1cm4gaXNDb25zdGFudChleHByZXNzaW9uKSAmJiBleHByZXNzaW9uLnZhbHVlID09PSB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc0ZhbHNlKGV4cHJlc3Npb246IEV4cHJlc3Npb248UHJpbWl0aXZlVHlwZT4pIHtcblx0cmV0dXJuIGlzQ29uc3RhbnQoZXhwcmVzc2lvbikgJiYgZXhwcmVzc2lvbi52YWx1ZSA9PT0gZmFsc2U7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBleHByZXNzaW9uIG9yIHZhbHVlIHByb3ZpZGVkIGlzIGJpbmRpbmcgb3Igbm90LlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtICBtYXliZUJpbmRpbmcgVGhlIGV4cHJlc3Npb24gb3IgcHJpbWl0aXZlIHZhbHVlIHRoYXQgaXMgdG8gYmUgY2hlY2tlZFxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiBpdCBpcyBiaW5kaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0JpbmRpbmc8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KG1heWJlQmluZGluZzogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+KTogbWF5YmVCaW5kaW5nIGlzIEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUPiB7XG5cdHJldHVybiB0eXBlb2YgbWF5YmVCaW5kaW5nID09PSBcIm9iamVjdFwiICYmIChtYXliZUJpbmRpbmcgYXMgQmFzZUV4cHJlc3Npb248VD4pLl90eXBlID09PSBcIkJpbmRpbmdcIjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGV4cHJlc3Npb24gcHJvdmlkZWQgaXMgYSBjb21wYXJpc29uIG9yIG5vdC5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBleHByZXNzaW9uIGlzIGEgQ29tcGFyaXNvbkV4cHJlc3Npb25cbiAqL1xuZnVuY3Rpb24gaXNDb21wYXJpc29uPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihleHByZXNzaW9uOiBFeHByZXNzaW9uPFQ+KTogZXhwcmVzc2lvbiBpcyBDb21wYXJpc29uRXhwcmVzc2lvbiB7XG5cdHJldHVybiBleHByZXNzaW9uLl90eXBlID09PSBcIkNvbXBhcmlzb25cIjtcbn1cblxudHlwZSBDb21wbGV4QW5ub3RhdGlvbkV4cHJlc3Npb248UD4gPVxuXHR8IFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPlxuXHR8IEFwcGx5QW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBJZkFubm90YXRpb25FeHByZXNzaW9uPFA+XG5cdHwgT3JBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPlxuXHR8IEFuZEFubm90YXRpb25FeHByZXNzaW9uPFA+XG5cdHwgTmVBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPlxuXHR8IEVxQW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBOb3RBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPlxuXHR8IEd0QW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBHZUFubm90YXRpb25FeHByZXNzaW9uPFA+XG5cdHwgTGVBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPlxuXHR8IEx0QW5ub3RhdGlvbkV4cHJlc3Npb248UD47XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlT2JqZWN0KG9iamVjdFR5cGU6IG9iamVjdCk6IGJvb2xlYW4ge1xuXHRzd2l0Y2ggKG9iamVjdFR5cGUuY29uc3RydWN0b3IubmFtZSkge1xuXHRcdGNhc2UgXCJTdHJpbmdcIjpcblx0XHRjYXNlIFwiTnVtYmVyXCI6XG5cdFx0Y2FzZSBcIkJvb2xlYW5cIjpcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn1cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHBhc3NlZCBhbm5vdGF0aW9uIGFubm90YXRpb25WYWx1ZSBpcyBhIENvbXBsZXhBbm5vdGF0aW9uRXhwcmVzc2lvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSAgYW5ub3RhdGlvblZhbHVlIFRoZSBhbm5vdGF0aW9uIGFubm90YXRpb25WYWx1ZSB0byBldmFsdWF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgb2JqZWN0IGlzIGEge0NvbXBsZXhBbm5vdGF0aW9uRXhwcmVzc2lvbn1cbiAqL1xuZnVuY3Rpb24gaXNDb21wbGV4QW5ub3RhdGlvbkV4cHJlc3Npb248VD4oYW5ub3RhdGlvblZhbHVlOiBQcm9wZXJ0eUFubm90YXRpb25WYWx1ZTxUPik6IGFubm90YXRpb25WYWx1ZSBpcyBDb21wbGV4QW5ub3RhdGlvbkV4cHJlc3Npb248VD4ge1xuXHRyZXR1cm4gdHlwZW9mIGFubm90YXRpb25WYWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAhaXNQcmltaXRpdmVPYmplY3QoYW5ub3RhdGlvblZhbHVlIGFzIG9iamVjdCk7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgdGhlIGNvcnJlc3BvbmRpbmcgYW5ub3RhdGlvblZhbHVlIGZvciBhIGdpdmVuIGFubm90YXRpb24gYW5ub3RhdGlvblZhbHVlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGFubm90YXRpb25WYWx1ZSBUaGUgc291cmNlIGFubm90YXRpb24gYW5ub3RhdGlvblZhbHVlXG4gKiBAcGFyYW0gdmlzaXRlZE5hdmlnYXRpb25QYXRocyBUaGUgcGF0aCBmcm9tIHRoZSByb290IGVudGl0eSBzZXRcbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgRGVmYXVsdCB2YWx1ZSBpZiB0aGUgYW5ub3RhdGlvblZhbHVlIGlzIHVuZGVmaW5lZFxuICogQHBhcmFtIHBhdGhWaXNpdG9yIEEgZnVuY3Rpb24gdG8gbW9kaWZ5IHRoZSByZXN1bHRpbmcgcGF0aFxuICogQHJldHVybnMge0V4cHJlc3Npb248VD59IFRoZSBhbm5vdGF0aW9uVmFsdWUgZXF1aXZhbGVudCB0byB0aGF0IGFubm90YXRpb24gYW5ub3RhdGlvblZhbHVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbm5vdGF0aW9uRXhwcmVzc2lvbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdGFubm90YXRpb25WYWx1ZTogUHJvcGVydHlBbm5vdGF0aW9uVmFsdWU8VD4sXG5cdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHM6IHN0cmluZ1tdID0gW10sXG5cdGRlZmF1bHRWYWx1ZT86IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPixcblx0cGF0aFZpc2l0b3I/OiBGdW5jdGlvblxuKTogRXhwcmVzc2lvbjxUPiB7XG5cdGlmIChhbm5vdGF0aW9uVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiB3cmFwUHJpbWl0aXZlKGRlZmF1bHRWYWx1ZSBhcyBUKTtcblx0fVxuXG5cdGlmICghaXNDb21wbGV4QW5ub3RhdGlvbkV4cHJlc3Npb24oYW5ub3RhdGlvblZhbHVlKSkge1xuXHRcdHJldHVybiBjb25zdGFudChhbm5vdGF0aW9uVmFsdWUpO1xuXHR9XG5cblx0c3dpdGNoIChhbm5vdGF0aW9uVmFsdWUudHlwZSkge1xuXHRcdGNhc2UgXCJQYXRoXCI6XG5cdFx0XHRyZXR1cm4gYmluZGluZ0V4cHJlc3Npb24oYW5ub3RhdGlvblZhbHVlLnBhdGgsIHVuZGVmaW5lZCwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpO1xuXHRcdGNhc2UgXCJJZlwiOlxuXHRcdFx0cmV0dXJuIGFubm90YXRpb25JZkV4cHJlc3Npb24oYW5ub3RhdGlvblZhbHVlLklmLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcik7XG5cdFx0Y2FzZSBcIk5vdFwiOlxuXHRcdFx0cmV0dXJuIG5vdChwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlLk5vdCwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpKSBhcyBFeHByZXNzaW9uPFQ+O1xuXHRcdGNhc2UgXCJFcVwiOlxuXHRcdFx0cmV0dXJuIGVxdWFsKFxuXHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlLkVxWzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uVmFsdWUuRXFbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHRcdGNhc2UgXCJOZVwiOlxuXHRcdFx0cmV0dXJuIG5vdEVxdWFsKFxuXHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlLk5lWzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uVmFsdWUuTmVbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHRcdGNhc2UgXCJHdFwiOlxuXHRcdFx0cmV0dXJuIGdyZWF0ZXJUaGFuKFxuXHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlLkd0WzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uVmFsdWUuR3RbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHRcdGNhc2UgXCJHZVwiOlxuXHRcdFx0cmV0dXJuIGdyZWF0ZXJPckVxdWFsKFxuXHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlLkdlWzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uVmFsdWUuR2VbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHRcdGNhc2UgXCJMdFwiOlxuXHRcdFx0cmV0dXJuIGxlc3NUaGFuKFxuXHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlLkx0WzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uVmFsdWUuTHRbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHRcdGNhc2UgXCJMZVwiOlxuXHRcdFx0cmV0dXJuIGxlc3NPckVxdWFsKFxuXHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlLkxlWzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uVmFsdWUuTGVbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHRcdGNhc2UgXCJPclwiOlxuXHRcdFx0cmV0dXJuIG9yKFxuXHRcdFx0XHQuLi4oYW5ub3RhdGlvblZhbHVlLk9yLm1hcChmdW5jdGlvbiAob3JDb25kaXRpb24pIHtcblx0XHRcdFx0XHRyZXR1cm4gcGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKG9yQ29uZGl0aW9uLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcik7XG5cdFx0XHRcdH0pIGFzIEV4cHJlc3Npb248Ym9vbGVhbj5bXSlcblx0XHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRjYXNlIFwiQW5kXCI6XG5cdFx0XHRyZXR1cm4gYW5kKFxuXHRcdFx0XHQuLi4oYW5ub3RhdGlvblZhbHVlLkFuZC5tYXAoZnVuY3Rpb24gKGFuZENvbmRpdGlvbikge1xuXHRcdFx0XHRcdHJldHVybiBwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5kQ29uZGl0aW9uLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcik7XG5cdFx0XHRcdH0pIGFzIEV4cHJlc3Npb248Ym9vbGVhbj5bXSlcblx0XHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRjYXNlIFwiQXBwbHlcIjpcblx0XHRcdHJldHVybiBhbm5vdGF0aW9uQXBwbHlFeHByZXNzaW9uKFxuXHRcdFx0XHRhbm5vdGF0aW9uVmFsdWUgYXMgQXBwbHlBbm5vdGF0aW9uRXhwcmVzc2lvbjxzdHJpbmc+LFxuXHRcdFx0XHR2aXNpdGVkTmF2aWdhdGlvblBhdGhzLFxuXHRcdFx0XHRwYXRoVmlzaXRvclxuXHRcdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9XG5cdHJldHVybiB1bnJlc29sdmVhYmxlRXhwcmVzc2lvbjtcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgYW5ub3RhdGlvbiBjb25kaXRpb24gaW50byBhbiBleHByZXNzaW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGFubm90YXRpb25WYWx1ZSBUaGUgY29uZGl0aW9uIG9yIHZhbHVlIGZyb20gdGhlIGFubm90YXRpb25cbiAqIEBwYXJhbSB2aXNpdGVkTmF2aWdhdGlvblBhdGhzIFRoZSBwYXRoIGZyb20gdGhlIHJvb3QgZW50aXR5IHNldFxuICogQHBhcmFtIHBhdGhWaXNpdG9yIEEgZnVuY3Rpb24gdG8gbW9kaWZ5IHRoZSByZXN1bHRpbmcgcGF0aFxuICogQHJldHVybnMge0V4cHJlc3Npb248VD59IEFuIGVxdWl2YWxlbnQgZXhwcmVzc2lvblxuICovXG5mdW5jdGlvbiBwYXJzZUFubm90YXRpb25Db25kaXRpb248VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRhbm5vdGF0aW9uVmFsdWU6IENvbmRpdGlvbmFsQ2hlY2tPclZhbHVlLFxuXHR2aXNpdGVkTmF2aWdhdGlvblBhdGhzOiBzdHJpbmdbXSA9IFtdLFxuXHRwYXRoVmlzaXRvcj86IEZ1bmN0aW9uXG4pOiBFeHByZXNzaW9uPFQ+IHtcblx0aWYgKGFubm90YXRpb25WYWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgYW5ub3RhdGlvblZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KGFubm90YXRpb25WYWx1ZSBhcyBUKTtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkT3JcIikpIHtcblx0XHRyZXR1cm4gb3IoXG5cdFx0XHQuLi4oKGFubm90YXRpb25WYWx1ZSBhcyBPckNvbmRpdGlvbmFsRXhwcmVzc2lvbikuJE9yLm1hcChmdW5jdGlvbiAob3JDb25kaXRpb24pIHtcblx0XHRcdFx0cmV0dXJuIHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihvckNvbmRpdGlvbiwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpO1xuXHRcdFx0fSkgYXMgdW5rbm93biBhcyBFeHByZXNzaW9uPGJvb2xlYW4+W10pXG5cdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRBbmRcIikpIHtcblx0XHRyZXR1cm4gYW5kKFxuXHRcdFx0Li4uKChhbm5vdGF0aW9uVmFsdWUgYXMgQW5kQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kQW5kLm1hcChmdW5jdGlvbiAoYW5kQ29uZGl0aW9uKSB7XG5cdFx0XHRcdHJldHVybiBwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5kQ29uZGl0aW9uLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcik7XG5cdFx0XHR9KSBhcyB1bmtub3duIGFzIEV4cHJlc3Npb248Ym9vbGVhbj5bXSlcblx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJE5vdFwiKSkge1xuXHRcdHJldHVybiBub3QoXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBOb3RDb25kaXRpb25hbEV4cHJlc3Npb24pLiROb3RbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkRXFcIikpIHtcblx0XHRyZXR1cm4gZXF1YWwoXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBFcUNvbmRpdGlvbmFsRXhwcmVzc2lvbikuJEVxWzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBFcUNvbmRpdGlvbmFsRXhwcmVzc2lvbikuJEVxWzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJE5lXCIpKSB7XG5cdFx0cmV0dXJuIG5vdEVxdWFsKFxuXHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgTmVDb25kaXRpb25hbEV4cHJlc3Npb24pLiROZVswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgTmVDb25kaXRpb25hbEV4cHJlc3Npb24pLiROZVsxXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRHdFwiKSkge1xuXHRcdHJldHVybiBncmVhdGVyVGhhbihcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIEd0Q29uZGl0aW9uYWxFeHByZXNzaW9uKS4kR3RbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIEd0Q29uZGl0aW9uYWxFeHByZXNzaW9uKS4kR3RbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkR2VcIikpIHtcblx0XHRyZXR1cm4gZ3JlYXRlck9yRXF1YWwoXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBHZUNvbmRpdGlvbmFsRXhwcmVzc2lvbikuJEdlWzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBHZUNvbmRpdGlvbmFsRXhwcmVzc2lvbikuJEdlWzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJEx0XCIpKSB7XG5cdFx0cmV0dXJuIGxlc3NUaGFuKFxuXHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgTHRDb25kaXRpb25hbEV4cHJlc3Npb24pLiRMdFswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgTHRDb25kaXRpb25hbEV4cHJlc3Npb24pLiRMdFsxXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRMZVwiKSkge1xuXHRcdHJldHVybiBsZXNzT3JFcXVhbChcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIExlQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kTGVbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIExlQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kTGVbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkUGF0aFwiKSkge1xuXHRcdHJldHVybiBiaW5kaW5nRXhwcmVzc2lvbigoYW5ub3RhdGlvblZhbHVlIGFzIFBhdGhDb25kaXRpb25FeHByZXNzaW9uPFQ+KS4kUGF0aCwgdW5kZWZpbmVkLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcik7XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJEFwcGx5XCIpKSB7XG5cdFx0cmV0dXJuIGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0e1xuXHRcdFx0XHR0eXBlOiBcIkFwcGx5XCIsXG5cdFx0XHRcdEZ1bmN0aW9uOiAoYW5ub3RhdGlvblZhbHVlIGFzIGFueSkuJEZ1bmN0aW9uLFxuXHRcdFx0XHRBcHBseTogKGFubm90YXRpb25WYWx1ZSBhcyBhbnkpLiRBcHBseVxuXHRcdFx0fSBhcyBULFxuXHRcdFx0dmlzaXRlZE5hdmlnYXRpb25QYXRocyxcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdHBhdGhWaXNpdG9yXG5cdFx0KTtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkSWZcIikpIHtcblx0XHRyZXR1cm4gYW5ub3RhdGlvbkV4cHJlc3Npb24oXG5cdFx0XHR7XG5cdFx0XHRcdHR5cGU6IFwiSWZcIixcblx0XHRcdFx0SWY6IChhbm5vdGF0aW9uVmFsdWUgYXMgYW55KS4kSWZcblx0XHRcdH0gYXMgVCxcblx0XHRcdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRwYXRoVmlzaXRvclxuXHRcdCk7XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJEVudW1NZW1iZXJcIikpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQocmVzb2x2ZUVudW1WYWx1ZSgoYW5ub3RhdGlvblZhbHVlIGFzIGFueSkuJEVudW1NZW1iZXIpIGFzIFQpO1xuXHR9XG5cdHJldHVybiBjb25zdGFudChmYWxzZSBhcyBUKTtcbn1cblxuLyoqXG4gKiBQcm9jZXNzIHRoZSB7SWZBbm5vdGF0aW9uRXhwcmVzc2lvblZhbHVlfSBpbnRvIGFuIGV4cHJlc3Npb24uXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gYW5ub3RhdGlvblZhbHVlIEFuIElmIGV4cHJlc3Npb24gcmV0dXJuaW5nIHRoZSB0eXBlIFRcbiAqIEBwYXJhbSB2aXNpdGVkTmF2aWdhdGlvblBhdGhzIFRoZSBwYXRoIGZyb20gdGhlIHJvb3QgZW50aXR5IHNldFxuICogQHBhcmFtIHBhdGhWaXNpdG9yIEEgZnVuY3Rpb24gdG8gbW9kaWZ5IHRoZSByZXN1bHRpbmcgcGF0aFxuICogQHJldHVybnMge0V4cHJlc3Npb248VD59IFRoZSBlcXVpdmFsZW50IGlmRWxzZSBleHByZXNzaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbm5vdGF0aW9uSWZFeHByZXNzaW9uPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0YW5ub3RhdGlvblZhbHVlOiBJZkFubm90YXRpb25FeHByZXNzaW9uVmFsdWU8VD4sXG5cdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHM6IHN0cmluZ1tdID0gW10sXG5cdHBhdGhWaXNpdG9yPzogRnVuY3Rpb25cbik6IEV4cHJlc3Npb248VD4ge1xuXHRyZXR1cm4gaWZFbHNlKFxuXHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uVmFsdWVbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlWzFdIGFzIGFueSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uVmFsdWVbMl0gYXMgYW55LCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFubm90YXRpb25BcHBseUV4cHJlc3Npb24oXG5cdGFwcGx5RXhwcmVzc2lvbjogQXBwbHlBbm5vdGF0aW9uRXhwcmVzc2lvbjxzdHJpbmc+LFxuXHR2aXNpdGVkTmF2aWdhdGlvblBhdGhzOiBzdHJpbmdbXSA9IFtdLFxuXHRwYXRoVmlzaXRvcj86IEZ1bmN0aW9uXG4pOiBFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRzd2l0Y2ggKGFwcGx5RXhwcmVzc2lvbi5GdW5jdGlvbikge1xuXHRcdGNhc2UgXCJvZGF0YS5jb25jYXRcIjpcblx0XHRcdHJldHVybiBjb25jYXQoXG5cdFx0XHRcdC4uLmFwcGx5RXhwcmVzc2lvbi5BcHBseS5tYXAoKGFwcGx5UGFyYW06IGFueSkgPT4ge1xuXHRcdFx0XHRcdGxldCBhcHBseVBhcmFtQ29udmVydGVkID0gYXBwbHlQYXJhbTtcblx0XHRcdFx0XHRpZiAoYXBwbHlQYXJhbS5oYXNPd25Qcm9wZXJ0eShcIiRQYXRoXCIpKSB7XG5cdFx0XHRcdFx0XHRhcHBseVBhcmFtQ29udmVydGVkID0ge1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBcIlBhdGhcIixcblx0XHRcdFx0XHRcdFx0cGF0aDogYXBwbHlQYXJhbS4kUGF0aFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGFwcGx5UGFyYW0uaGFzT3duUHJvcGVydHkoXCIkSWZcIikpIHtcblx0XHRcdFx0XHRcdGFwcGx5UGFyYW1Db252ZXJ0ZWQgPSB7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IFwiSWZcIixcblx0XHRcdFx0XHRcdFx0SWY6IGFwcGx5UGFyYW0uJElmXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYXBwbHlQYXJhbS5oYXNPd25Qcm9wZXJ0eShcIiRBcHBseVwiKSkge1xuXHRcdFx0XHRcdFx0YXBwbHlQYXJhbUNvbnZlcnRlZCA9IHtcblx0XHRcdFx0XHRcdFx0dHlwZTogXCJBcHBseVwiLFxuXHRcdFx0XHRcdFx0XHRGdW5jdGlvbjogYXBwbHlQYXJhbS4kRnVuY3Rpb24sXG5cdFx0XHRcdFx0XHRcdEFwcGx5OiBhcHBseVBhcmFtLiRBcHBseVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIGFubm90YXRpb25FeHByZXNzaW9uKGFwcGx5UGFyYW1Db252ZXJ0ZWQsIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHVuZGVmaW5lZCwgcGF0aFZpc2l0b3IpO1xuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0fVxuXHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG59XG5cbi8qKlxuICogR2VuZXJpYyBoZWxwZXIgZm9yIHRoZSBjb21wYXJpc29uIG9wZXJhdGlvbnMgKGVxdWFsLCBub3RFcXVhbCwgLi4uKS5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSBvcGVyYXRvciBUaGUgb3BlcmF0b3IgdG8gYXBwbHlcbiAqIEBwYXJhbSBsZWZ0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBvcGVyYXRvclxuICogQHBhcmFtIHJpZ2h0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgb3BlcmF0b3JcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBBbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY29tcGFyaXNvblxuICovXG5mdW5jdGlvbiBjb21wYXJpc29uPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0b3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcblx0bGVmdE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPixcblx0cmlnaHRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBsZWZ0RXhwcmVzc2lvbiA9IHdyYXBQcmltaXRpdmUobGVmdE9wZXJhbmQpO1xuXHRjb25zdCByaWdodEV4cHJlc3Npb24gPSB3cmFwUHJpbWl0aXZlKHJpZ2h0T3BlcmFuZCk7XG5cdGlmIChoYXNVbnJlc29sdmVhYmxlRXhwcmVzc2lvbihsZWZ0RXhwcmVzc2lvbiwgcmlnaHRFeHByZXNzaW9uKSkge1xuXHRcdHJldHVybiB1bnJlc29sdmVhYmxlRXhwcmVzc2lvbjtcblx0fVxuXHRpZiAoaXNDb25zdGFudChsZWZ0RXhwcmVzc2lvbikgJiYgaXNDb25zdGFudChyaWdodEV4cHJlc3Npb24pKSB7XG5cdFx0c3dpdGNoIChvcGVyYXRvcikge1xuXHRcdFx0Y2FzZSBcIiE9PVwiOlxuXHRcdFx0XHRyZXR1cm4gY29uc3RhbnQobGVmdEV4cHJlc3Npb24udmFsdWUgIT09IHJpZ2h0RXhwcmVzc2lvbi52YWx1ZSk7XG5cdFx0XHRjYXNlIFwiPFwiOlxuXHRcdFx0XHRyZXR1cm4gY29uc3RhbnQobGVmdEV4cHJlc3Npb24udmFsdWUgPCByaWdodEV4cHJlc3Npb24udmFsdWUpO1xuXHRcdFx0Y2FzZSBcIjw9XCI6XG5cdFx0XHRcdHJldHVybiBjb25zdGFudChsZWZ0RXhwcmVzc2lvbi52YWx1ZSA8PSByaWdodEV4cHJlc3Npb24udmFsdWUpO1xuXHRcdFx0Y2FzZSBcIj5cIjpcblx0XHRcdFx0cmV0dXJuIGNvbnN0YW50KGxlZnRFeHByZXNzaW9uLnZhbHVlID4gcmlnaHRFeHByZXNzaW9uLnZhbHVlKTtcblx0XHRcdGNhc2UgXCI+PVwiOlxuXHRcdFx0XHRyZXR1cm4gY29uc3RhbnQobGVmdEV4cHJlc3Npb24udmFsdWUgPj0gcmlnaHRFeHByZXNzaW9uLnZhbHVlKTtcblx0XHRcdGNhc2UgXCI9PT1cIjpcblx0XHRcdFx0cmV0dXJuIGNvbnN0YW50KGxlZnRFeHByZXNzaW9uLnZhbHVlID09PSByaWdodEV4cHJlc3Npb24udmFsdWUpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0X3R5cGU6IFwiQ29tcGFyaXNvblwiLFxuXHRcdFx0b3BlcmF0b3I6IG9wZXJhdG9yLFxuXHRcdFx0b3BlcmFuZDE6IGxlZnRFeHByZXNzaW9uLFxuXHRcdFx0b3BlcmFuZDI6IHJpZ2h0RXhwcmVzc2lvblxuXHRcdH07XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxlbmd0aChleHByZXNzaW9uOiBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248YW55PiB8IFVucmVzb2x2ZWFibGVCaW5kaW5nRXhwcmVzc2lvbik6IEV4cHJlc3Npb248bnVtYmVyPiB7XG5cdGlmIChleHByZXNzaW9uLl90eXBlID09PSBcIlVucmVzb2x2YWJsZVwiKSB7XG5cdFx0cmV0dXJuIGV4cHJlc3Npb247XG5cdH1cblx0cmV0dXJuIHtcblx0XHRfdHlwZTogXCJMZW5ndGhcIixcblx0XHRiaW5kaW5nRXhwcmVzc2lvbjogZXhwcmVzc2lvblxuXHR9O1xufVxuXG4vKipcbiAqIENvbXBhcmlzb246IFwiZXF1YWxcIiAoPT09KS5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSBsZWZ0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgbGVmdCBzaWRlXG4gKiBAcGFyYW0gcmlnaHRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBjb21wYXJpc29uXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPn0gQW4gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGNvbXBhcmlzb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVxdWFsPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0bGVmdE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPixcblx0cmlnaHRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBsZWZ0RXhwcmVzc2lvbiA9IHdyYXBQcmltaXRpdmUobGVmdE9wZXJhbmQpO1xuXHRjb25zdCByaWdodEV4cHJlc3Npb24gPSB3cmFwUHJpbWl0aXZlKHJpZ2h0T3BlcmFuZCk7XG5cdGlmIChoYXNVbnJlc29sdmVhYmxlRXhwcmVzc2lvbihsZWZ0RXhwcmVzc2lvbiwgcmlnaHRFeHByZXNzaW9uKSkge1xuXHRcdHJldHVybiB1bnJlc29sdmVhYmxlRXhwcmVzc2lvbjtcblx0fVxuXHRpZiAoX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChsZWZ0RXhwcmVzc2lvbiwgcmlnaHRFeHByZXNzaW9uKSkge1xuXHRcdHJldHVybiBjb25zdGFudCh0cnVlKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHJlZHVjZShsZWZ0OiBFeHByZXNzaW9uPFQ+LCByaWdodDogRXhwcmVzc2lvbjxUPikge1xuXHRcdGlmIChsZWZ0Ll90eXBlID09PSBcIkNvbXBhcmlzb25cIiAmJiBpc1RydWUocmlnaHQpKSB7XG5cdFx0XHQvLyBjb21wYXJlKGEsIGIpID09PSB0cnVlIH5+PiBjb21wYXJlKGEsIGIpXG5cdFx0XHRyZXR1cm4gbGVmdDtcblx0XHR9IGVsc2UgaWYgKGxlZnQuX3R5cGUgPT09IFwiQ29tcGFyaXNvblwiICYmIGlzRmFsc2UocmlnaHQpKSB7XG5cdFx0XHQvLyBjb21wYXJlKGEsIGIpID09PSBmYWxzZSB+fj4gIWNvbXBhcmUoYSwgYilcblx0XHRcdHJldHVybiBub3QobGVmdCk7XG5cdFx0fSBlbHNlIGlmIChsZWZ0Ll90eXBlID09PSBcIklmRWxzZVwiICYmIF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwobGVmdC5vblRydWUsIHJpZ2h0KSkge1xuXHRcdFx0Ly8gKGlmICh4KSB7IGEgfSBlbHNlIHsgYiB9KSA9PT0gYSB+fj4geCB8fCAoYiA9PT0gYSlcblx0XHRcdHJldHVybiBvcihsZWZ0LmNvbmRpdGlvbiwgZXF1YWwobGVmdC5vbkZhbHNlLCByaWdodCkpO1xuXHRcdH0gZWxzZSBpZiAobGVmdC5fdHlwZSA9PT0gXCJJZkVsc2VcIiAmJiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGxlZnQub25GYWxzZSwgcmlnaHQpKSB7XG5cdFx0XHQvLyAoaWYgKHgpIHsgYSB9IGVsc2UgeyBiIH0pID09PSBiIH5+PiAheCB8fCAoYSA9PT0gYilcblx0XHRcdHJldHVybiBvcihub3QobGVmdC5jb25kaXRpb24pLCBlcXVhbChsZWZ0Lm9uVHJ1ZSwgcmlnaHQpKTtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0bGVmdC5fdHlwZSA9PT0gXCJJZkVsc2VcIiAmJlxuXHRcdFx0aXNDb25zdGFudChsZWZ0Lm9uVHJ1ZSkgJiZcblx0XHRcdGlzQ29uc3RhbnQobGVmdC5vbkZhbHNlKSAmJlxuXHRcdFx0aXNDb25zdGFudChyaWdodCkgJiZcblx0XHRcdCFfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGxlZnQub25UcnVlLCByaWdodCkgJiZcblx0XHRcdCFfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGxlZnQub25GYWxzZSwgcmlnaHQpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gY29uc3RhbnQoZmFsc2UpO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0Ly8gZXhwbG9pdCBzeW1tZXRyeTogYSA9PT0gYiA8fj4gYiA9PT0gYVxuXHRjb25zdCByZWR1Y2VkID0gcmVkdWNlKGxlZnRFeHByZXNzaW9uLCByaWdodEV4cHJlc3Npb24pID8/IHJlZHVjZShyaWdodEV4cHJlc3Npb24sIGxlZnRFeHByZXNzaW9uKTtcblx0cmV0dXJuIHJlZHVjZWQgPz8gY29tcGFyaXNvbihcIj09PVwiLCBsZWZ0RXhwcmVzc2lvbiwgcmlnaHRFeHByZXNzaW9uKTtcbn1cblxuLyoqXG4gKiBDb21wYXJpc29uOiBcIm5vdCBlcXVhbFwiICghPT0pLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGxlZnRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSBsZWZ0IHNpZGVcbiAqIEBwYXJhbSByaWdodE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGNvbXBhcmlzb25cbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBBbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY29tcGFyaXNvblxuICovXG5leHBvcnQgZnVuY3Rpb24gbm90RXF1YWw8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRsZWZ0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRyaWdodE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPlxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBub3QoZXF1YWwobGVmdE9wZXJhbmQsIHJpZ2h0T3BlcmFuZCkpO1xufVxuXG4vKipcbiAqIENvbXBhcmlzb246IFwiZ3JlYXRlciBvciBlcXVhbFwiICg+PSkuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gbGVmdE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIGxlZnQgc2lkZVxuICogQHBhcmFtIHJpZ2h0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgY29tcGFyaXNvblxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj59IEFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjb21wYXJpc29uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncmVhdGVyT3JFcXVhbDxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdGxlZnRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4sXG5cdHJpZ2h0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+XG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGNvbXBhcmlzb24oXCI+PVwiLCBsZWZ0T3BlcmFuZCwgcmlnaHRPcGVyYW5kKTtcbn1cblxuLyoqXG4gKiBDb21wYXJpc29uOiBcImdyZWF0ZXIgdGhhblwiICg+KS5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSBsZWZ0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgbGVmdCBzaWRlXG4gKiBAcGFyYW0gcmlnaHRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBjb21wYXJpc29uXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPn0gQW4gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGNvbXBhcmlzb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyZWF0ZXJUaGFuPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0bGVmdE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPixcblx0cmlnaHRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gY29tcGFyaXNvbihcIj5cIiwgbGVmdE9wZXJhbmQsIHJpZ2h0T3BlcmFuZCk7XG59XG5cbi8qKlxuICogQ29tcGFyaXNvbjogXCJsZXNzIG9yIGVxdWFsXCIgKDw9KS5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSBsZWZ0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgbGVmdCBzaWRlXG4gKiBAcGFyYW0gcmlnaHRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBjb21wYXJpc29uXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPn0gQW4gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGNvbXBhcmlzb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxlc3NPckVxdWFsPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0bGVmdE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPixcblx0cmlnaHRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gY29tcGFyaXNvbihcIjw9XCIsIGxlZnRPcGVyYW5kLCByaWdodE9wZXJhbmQpO1xufVxuXG4vKipcbiAqIENvbXBhcmlzb246IFwibGVzcyB0aGFuXCIgKDwpLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGxlZnRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSBsZWZ0IHNpZGVcbiAqIEBwYXJhbSByaWdodE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGNvbXBhcmlzb25cbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBBbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY29tcGFyaXNvblxuICovXG5leHBvcnQgZnVuY3Rpb24gbGVzc1RoYW48VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRsZWZ0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRyaWdodE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPlxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBjb21wYXJpc29uKFwiPFwiLCBsZWZ0T3BlcmFuZCwgcmlnaHRPcGVyYW5kKTtcbn1cblxuLyoqXG4gKiBJZi10aGVuLWVsc2UgZXhwcmVzc2lvbi5cbiAqXG4gKiBFdmFsdWF0ZXMgdG8gb25UcnVlIGlmIHRoZSBjb25kaXRpb24gZXZhbHVhdGVzIHRvIHRydWUsIGVsc2UgZXZhbHVhdGVzIHRvIG9uRmFsc2UuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gY29uZGl0aW9uIFRoZSBjb25kaXRpb24gdG8gZXZhbHVhdGVcbiAqIEBwYXJhbSBvblRydWUgRXhwcmVzc2lvbiByZXN1bHQgaWYgdGhlIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gdHJ1ZVxuICogQHBhcmFtIG9uRmFsc2UgRXhwcmVzc2lvbiByZXN1bHQgaWYgdGhlIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gZmFsc2VcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPFQ+fSBUaGUgZXhwcmVzc2lvbiB0aGF0IHJlcHJlc2VudHMgdGhpcyBjb25kaXRpb25hbCBjaGVja1xuICovXG5leHBvcnQgZnVuY3Rpb24gaWZFbHNlPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0Y29uZGl0aW9uOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj4sXG5cdG9uVHJ1ZTogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRvbkZhbHNlOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD5cbik6IEV4cHJlc3Npb248VD4ge1xuXHRsZXQgY29uZGl0aW9uRXhwcmVzc2lvbiA9IHdyYXBQcmltaXRpdmUoY29uZGl0aW9uKTtcblx0bGV0IG9uVHJ1ZUV4cHJlc3Npb24gPSB3cmFwUHJpbWl0aXZlKG9uVHJ1ZSk7XG5cdGxldCBvbkZhbHNlRXhwcmVzc2lvbiA9IHdyYXBQcmltaXRpdmUob25GYWxzZSk7XG5cblx0aWYgKGhhc1VucmVzb2x2ZWFibGVFeHByZXNzaW9uKGNvbmRpdGlvbkV4cHJlc3Npb24sIG9uVHJ1ZUV4cHJlc3Npb24sIG9uRmFsc2VFeHByZXNzaW9uKSkge1xuXHRcdHJldHVybiB1bnJlc29sdmVhYmxlRXhwcmVzc2lvbjtcblx0fVxuXHQvLyBzd2FwIGJyYW5jaGVzIGlmIHRoZSBjb25kaXRpb24gaXMgYSBuZWdhdGlvblxuXHRpZiAoY29uZGl0aW9uRXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJOb3RcIikge1xuXHRcdC8vIGlmRWxzZShub3QoWCksIGEsIGIpIC0tPiBpZkVsc2UoWCwgYiwgYSlcblx0XHRbb25UcnVlRXhwcmVzc2lvbiwgb25GYWxzZUV4cHJlc3Npb25dID0gW29uRmFsc2VFeHByZXNzaW9uLCBvblRydWVFeHByZXNzaW9uXTtcblx0XHRjb25kaXRpb25FeHByZXNzaW9uID0gbm90KGNvbmRpdGlvbkV4cHJlc3Npb24pO1xuXHR9XG5cblx0Ly8gaW5saW5lIG5lc3RlZCBpZi1lbHNlIGV4cHJlc3Npb25zOiBvblRydWUgYnJhbmNoXG5cdC8vIGlmRWxzZShYLCBpZkVsc2UoWCwgYSwgYiksIGMpID09PiBpZkVsc2UoWCwgYSwgYylcblx0aWYgKG9uVHJ1ZUV4cHJlc3Npb24uX3R5cGUgPT09IFwiSWZFbHNlXCIgJiYgX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChjb25kaXRpb25FeHByZXNzaW9uLCBvblRydWVFeHByZXNzaW9uLmNvbmRpdGlvbikpIHtcblx0XHRvblRydWVFeHByZXNzaW9uID0gb25UcnVlRXhwcmVzc2lvbi5vblRydWU7XG5cdH1cblxuXHQvLyBpbmxpbmUgbmVzdGVkIGlmLWVsc2UgZXhwcmVzc2lvbnM6IG9uRmFsc2UgYnJhbmNoXG5cdC8vIGlmRWxzZShYLCBhLCBpZkVsc2UoWCwgYiwgYykpID09PiBpZkVsc2UoWCwgYSwgYylcblx0aWYgKG9uRmFsc2VFeHByZXNzaW9uLl90eXBlID09PSBcIklmRWxzZVwiICYmIF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoY29uZGl0aW9uRXhwcmVzc2lvbiwgb25GYWxzZUV4cHJlc3Npb24uY29uZGl0aW9uKSkge1xuXHRcdG9uRmFsc2VFeHByZXNzaW9uID0gb25GYWxzZUV4cHJlc3Npb24ub25GYWxzZTtcblx0fVxuXG5cdC8vIChpZiB0cnVlIHRoZW4gYSBlbHNlIGIpICB+fj4gYVxuXHQvLyAoaWYgZmFsc2UgdGhlbiBhIGVsc2UgYikgfn4+IGJcblx0aWYgKGlzQ29uc3RhbnQoY29uZGl0aW9uRXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4gY29uZGl0aW9uRXhwcmVzc2lvbi52YWx1ZSA/IG9uVHJ1ZUV4cHJlc3Npb24gOiBvbkZhbHNlRXhwcmVzc2lvbjtcblx0fVxuXG5cdC8vIGlmIChpc0NvbnN0YW50Qm9vbGVhbihvblRydWVFeHByZXNzaW9uKSB8fCBpc0NvbnN0YW50Qm9vbGVhbihvbkZhbHNlRXhwcmVzc2lvbikpIHtcblx0Ly8gXHRyZXR1cm4gb3IoYW5kKGNvbmRpdGlvbiwgb25UcnVlRXhwcmVzc2lvbiBhcyBFeHByZXNzaW9uPGJvb2xlYW4+KSwgYW5kKG5vdChjb25kaXRpb24pLCBvbkZhbHNlRXhwcmVzc2lvbiBhcyBFeHByZXNzaW9uPGJvb2xlYW4+KSkgYXMgRXhwcmVzc2lvbjxUPlxuXHQvLyB9XG5cdC8vIChpZiBYIHRoZW4gYSBlbHNlIGEpIH5+PiBhXG5cdGlmIChfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKG9uVHJ1ZUV4cHJlc3Npb24sIG9uRmFsc2VFeHByZXNzaW9uKSkge1xuXHRcdHJldHVybiBvblRydWVFeHByZXNzaW9uO1xuXHR9XG5cblx0Ly8gaWYgWCB0aGVuIGEgZWxzZSBmYWxzZSB+fj4gWCAmJiBhXG5cdGlmIChpc0ZhbHNlKG9uRmFsc2VFeHByZXNzaW9uKSkge1xuXHRcdHJldHVybiBhbmQoY29uZGl0aW9uRXhwcmVzc2lvbiwgb25UcnVlRXhwcmVzc2lvbiBhcyBFeHByZXNzaW9uPGJvb2xlYW4+KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9XG5cblx0Ly8gaWYgWCB0aGVuIGEgZWxzZSB0cnVlIH5+PiAhWCB8fCBhXG5cdGlmIChpc1RydWUob25GYWxzZUV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIG9yKG5vdChjb25kaXRpb25FeHByZXNzaW9uKSwgb25UcnVlRXhwcmVzc2lvbiBhcyBFeHByZXNzaW9uPGJvb2xlYW4+KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9XG5cblx0Ly8gaWYgWCB0aGVuIGZhbHNlIGVsc2UgYSB+fj4gIVggJiYgYVxuXHRpZiAoaXNGYWxzZShvblRydWVFeHByZXNzaW9uKSkge1xuXHRcdHJldHVybiBhbmQobm90KGNvbmRpdGlvbkV4cHJlc3Npb24pLCBvbkZhbHNlRXhwcmVzc2lvbiBhcyBFeHByZXNzaW9uPGJvb2xlYW4+KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9XG5cblx0Ly8gaWYgWCB0aGVuIHRydWUgZWxzZSBhIH5+PiBYIHx8IGFcblx0aWYgKGlzVHJ1ZShvblRydWVFeHByZXNzaW9uKSkge1xuXHRcdHJldHVybiBvcihjb25kaXRpb25FeHByZXNzaW9uLCBvbkZhbHNlRXhwcmVzc2lvbiBhcyBFeHByZXNzaW9uPGJvb2xlYW4+KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRfdHlwZTogXCJJZkVsc2VcIixcblx0XHRjb25kaXRpb246IGNvbmRpdGlvbkV4cHJlc3Npb24sXG5cdFx0b25UcnVlOiBvblRydWVFeHByZXNzaW9uLFxuXHRcdG9uRmFsc2U6IG9uRmFsc2VFeHByZXNzaW9uXG5cdH07XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBoYXMgYSByZWZlcmVuY2UgdG8gdGhlIGRlZmF1bHQgbW9kZWwgKHVuZGVmaW5lZCkuXG4gKlxuICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gdG8gZXZhbHVhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlcmUgaXMgYSByZWZlcmVuY2UgdG8gdGhlIGRlZmF1bHQgY29udGV4dFxuICovXG5mdW5jdGlvbiBoYXNSZWZlcmVuY2VUb0RlZmF1bHRDb250ZXh0KGV4cHJlc3Npb246IEV4cHJlc3Npb248YW55Pik6IGJvb2xlYW4ge1xuXHRzd2l0Y2ggKGV4cHJlc3Npb24uX3R5cGUpIHtcblx0XHRjYXNlIFwiQ29uc3RhbnRcIjpcblx0XHRjYXNlIFwiRm9ybWF0dGVyXCI6XG5cdFx0Y2FzZSBcIkNvbXBsZXhUeXBlXCI6XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0Y2FzZSBcIlNldFwiOlxuXHRcdFx0cmV0dXJuIGV4cHJlc3Npb24ub3BlcmFuZHMuc29tZShoYXNSZWZlcmVuY2VUb0RlZmF1bHRDb250ZXh0KTtcblx0XHRjYXNlIFwiQmluZGluZ1wiOlxuXHRcdFx0cmV0dXJuIGV4cHJlc3Npb24ubW9kZWxOYW1lID09PSB1bmRlZmluZWQ7XG5cdFx0Y2FzZSBcIkNvbXBhcmlzb25cIjpcblx0XHRcdHJldHVybiBoYXNSZWZlcmVuY2VUb0RlZmF1bHRDb250ZXh0KGV4cHJlc3Npb24ub3BlcmFuZDEpIHx8IGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQoZXhwcmVzc2lvbi5vcGVyYW5kMik7XG5cdFx0Y2FzZSBcIkRlZmF1bHRCaW5kaW5nXCI6XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRjYXNlIFwiSWZFbHNlXCI6XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRoYXNSZWZlcmVuY2VUb0RlZmF1bHRDb250ZXh0KGV4cHJlc3Npb24uY29uZGl0aW9uKSB8fFxuXHRcdFx0XHRoYXNSZWZlcmVuY2VUb0RlZmF1bHRDb250ZXh0KGV4cHJlc3Npb24ub25UcnVlKSB8fFxuXHRcdFx0XHRoYXNSZWZlcmVuY2VUb0RlZmF1bHRDb250ZXh0KGV4cHJlc3Npb24ub25GYWxzZSlcblx0XHRcdCk7XG5cdFx0Y2FzZSBcIk5vdFwiOlxuXHRcdGNhc2UgXCJUcnV0aHlcIjpcblx0XHRcdHJldHVybiBoYXNSZWZlcmVuY2VUb0RlZmF1bHRDb250ZXh0KGV4cHJlc3Npb24ub3BlcmFuZCk7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG50eXBlIEZuPFQ+ID0gKCguLi5wYXJhbXM6IGFueSkgPT4gVCkgJiB7XG5cdF9fZnVuY3Rpb25OYW1lOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIFdyYXBwZWRUdXBsZVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtaWdub3JlXG50eXBlIFdyYXBwZWRUdXBsZTxUPiA9IHsgW0sgaW4ga2V5b2YgVF06IFdyYXBwZWRUdXBsZTxUW0tdPiB8IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUW0tdPiB9O1xuXG4vLyBTbywgdGhpcyB3b3JrcyBidXQgSSBjYW5ub3QgZ2V0IGl0IHRvIGNvbXBpbGUgOkQsIGJ1dCBpdCBzdGlsbCBkb2VzIHdoYXQgaXMgZXhwZWN0ZWQuLi5cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHJlZmVyZW5jZSBvciBhIGZ1bmN0aW9uIG5hbWUuXG4gKi9cbnR5cGUgRnVuY3Rpb25Pck5hbWU8VD4gPSBGbjxUPiB8IHN0cmluZztcblxuLyoqXG4gKiBGdW5jdGlvbiBwYXJhbWV0ZXJzLCBlaXRoZXIgZGVyaXZlZCBmcm9tIHRoZSBmdW5jdGlvbiBvciBhbiB1bnR5cGVkIGFycmF5LlxuICovXG50eXBlIEZ1bmN0aW9uUGFyYW1ldGVyczxULCBGIGV4dGVuZHMgRnVuY3Rpb25Pck5hbWU8VD4+ID0gRiBleHRlbmRzIEZuPFQ+ID8gUGFyYW1ldGVyczxGPiA6IGFueVtdO1xuXG4vKipcbiAqIENhbGxzIGEgZm9ybWF0dGVyIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIHBhcmFtZXRlcnMuXG4gKiBJZiByZXF1aXJlQ29udGV4dCBpcyBzZXQgdG8gdHJ1ZSBhbmQgbm8gY29udGV4dCBpcyBwYXNzZWQgYSBkZWZhdWx0IGNvbnRleHQgd2lsbCBiZSBhZGRlZCBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgVVxuICogQHBhcmFtIHBhcmFtZXRlcnMgVGhlIGxpc3Qgb2YgcGFyYW1ldGVyIHRoYXQgc2hvdWxkIG1hdGNoIHRoZSB0eXBlIGFuZCBudW1iZXIgb2YgdGhlIGZvcm1hdHRlciBmdW5jdGlvblxuICogQHBhcmFtIGZvcm1hdHRlckZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byBjYWxsXG4gKiBAcGFyYW0gW2NvbnRleHRFbnRpdHlUeXBlXSBUaGUgY29udGV4dCBlbnRpdHkgdHlwZSB0byBjb25zaWRlclxuICogQHJldHVybnMge0V4cHJlc3Npb248VD59IFRoZSBjb3JyZXNwb25kaW5nIGV4cHJlc3Npb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFJlc3VsdDxULCBVIGV4dGVuZHMgRm48VD4+KFxuXHRwYXJhbWV0ZXJzOiBXcmFwcGVkVHVwbGU8UGFyYW1ldGVyczxVPj4sXG5cdGZvcm1hdHRlckZ1bmN0aW9uOiBVLFxuXHRjb250ZXh0RW50aXR5VHlwZT86IEVudGl0eVR5cGVcbik6IEV4cHJlc3Npb248VD4ge1xuXHRjb25zdCBwYXJhbWV0ZXJFeHByZXNzaW9ucyA9IChwYXJhbWV0ZXJzIGFzIGFueVtdKS5tYXAod3JhcFByaW1pdGl2ZSk7XG5cblx0aWYgKGhhc1VucmVzb2x2ZWFibGVFeHByZXNzaW9uKC4uLnBhcmFtZXRlckV4cHJlc3Npb25zKSkge1xuXHRcdHJldHVybiB1bnJlc29sdmVhYmxlRXhwcmVzc2lvbjtcblx0fVxuXHRpZiAoISFjb250ZXh0RW50aXR5VHlwZSkge1xuXHRcdC8vIE90aGVyd2lzZSwgaWYgdGhlIGNvbnRleHQgaXMgcmVxdWlyZWQgYW5kIG5vIGNvbnRleHQgaXMgcHJvdmlkZWQgbWFrZSBzdXJlIHRvIGFkZCB0aGUgZGVmYXVsdCBiaW5kaW5nXG5cdFx0aWYgKCFwYXJhbWV0ZXJFeHByZXNzaW9ucy5zb21lKGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQpKSB7XG5cdFx0XHRjb250ZXh0RW50aXR5VHlwZS5rZXlzLmZvckVhY2goKGtleSkgPT4gcGFyYW1ldGVyRXhwcmVzc2lvbnMucHVzaChiaW5kaW5nRXhwcmVzc2lvbihrZXkubmFtZSwgXCJcIikpKTtcblx0XHR9XG5cdH1cblxuXHQvLyBGb3JtYXR0ZXJOYW1lIGNhbiBiZSBvZiBmb3JtYXQgc2FwLmZlLmNvcmUueHh4I21ldGhvZE5hbWUgdG8gaGF2ZSBtdWx0aXBsZSBmb3JtYXR0ZXIgaW4gb25lIGNsYXNzXG5cdGNvbnN0IFtmb3JtYXR0ZXJDbGFzcywgZm9ybWF0dGVyTmFtZV0gPSBmb3JtYXR0ZXJGdW5jdGlvbi5fX2Z1bmN0aW9uTmFtZS5zcGxpdChcIiNcIik7XG5cblx0aWYgKCEhZm9ybWF0dGVyTmFtZSAmJiBmb3JtYXR0ZXJOYW1lLmxlbmd0aCA+IDApIHtcblx0XHRwYXJhbWV0ZXJFeHByZXNzaW9ucy51bnNoaWZ0KGNvbnN0YW50KGZvcm1hdHRlck5hbWUpKTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0X3R5cGU6IFwiRm9ybWF0dGVyXCIsXG5cdFx0Zm46IGZvcm1hdHRlckNsYXNzLFxuXHRcdHBhcmFtZXRlcnM6IHBhcmFtZXRlckV4cHJlc3Npb25zXG5cdH07XG59XG5cbi8qKlxuICogQ2FsbHMgYSBjb21wbGV4IHR5cGUgIHRvIHByb2Nlc3MgdGhlIHBhcmFtZXRlcnMuXG4gKiBJZiByZXF1aXJlQ29udGV4dCBpcyBzZXQgdG8gdHJ1ZSBhbmQgbm8gY29udGV4dCBpcyBwYXNzZWQgYSBkZWZhdWx0IGNvbnRleHQgd2lsbCBiZSBhZGRlZCBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgVVxuICogQHBhcmFtIHBhcmFtZXRlcnMgVGhlIGxpc3Qgb2YgcGFyYW1ldGVyIHRoYXQgc2hvdWxkIG1hdGNoIHRoZSB0eXBlIGZvciB0aGUgY29tcHBsZXggdHlwZVxuICogQHBhcmFtIHR5cGUgVGhlIGNvbXBsZXggdHlwZSB0byB1c2VcbiAqIEBwYXJhbSBbY29udGV4dEVudGl0eVR5cGVdIFRoZSBjb250ZXh0IGVudGl0eSB0eXBlIHRvIGNvbnNpZGVyXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxUPn0gVGhlIGNvcnJlc3BvbmRpbmcgZXhwcmVzc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkVHlwZUluZm9ybWF0aW9uPFQsIFUgZXh0ZW5kcyBGbjxUPj4oXG5cdHBhcmFtZXRlcnM6IFdyYXBwZWRUdXBsZTxQYXJhbWV0ZXJzPFU+Pixcblx0dHlwZTogc3RyaW5nLFxuXHRjb250ZXh0RW50aXR5VHlwZT86IEVudGl0eVR5cGUsXG5cdG9Gb3JtYXRPcHRpb25zPzogYW55XG4pOiBFeHByZXNzaW9uPFQ+IHtcblx0Y29uc3QgcGFyYW1ldGVyRXhwcmVzc2lvbnMgPSAocGFyYW1ldGVycyBhcyBhbnlbXSkubWFwKHdyYXBQcmltaXRpdmUpO1xuXHRpZiAoaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24oLi4ucGFyYW1ldGVyRXhwcmVzc2lvbnMpKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdC8vIElmIHRoZXJlIGlzIG9ubHkgb25lIHBhcmFtZXRlciBhbmQgaXQgaXMgYSBjb25zdGFudCBhbmQgd2UgZG9uJ3QgZXhwZWN0IHRoZSBjb250ZXh0IHRoZW4gcmV0dXJuIHRoZSBjb25zdGFudFxuXHRpZiAocGFyYW1ldGVyRXhwcmVzc2lvbnMubGVuZ3RoID09PSAxICYmIGlzQ29uc3RhbnQocGFyYW1ldGVyRXhwcmVzc2lvbnNbMF0pICYmICFjb250ZXh0RW50aXR5VHlwZSkge1xuXHRcdHJldHVybiBwYXJhbWV0ZXJFeHByZXNzaW9uc1swXTtcblx0fSBlbHNlIGlmICghIWNvbnRleHRFbnRpdHlUeXBlKSB7XG5cdFx0Ly8gT3RoZXJ3aXNlLCBpZiB0aGUgY29udGV4dCBpcyByZXF1aXJlZCBhbmQgbm8gY29udGV4dCBpcyBwcm92aWRlZCBtYWtlIHN1cmUgdG8gYWRkIHRoZSBkZWZhdWx0IGJpbmRpbmdcblx0XHRpZiAoIXBhcmFtZXRlckV4cHJlc3Npb25zLnNvbWUoaGFzUmVmZXJlbmNlVG9EZWZhdWx0Q29udGV4dCkpIHtcblx0XHRcdGNvbnRleHRFbnRpdHlUeXBlLmtleXMuZm9yRWFjaCgoa2V5KSA9PiBwYXJhbWV0ZXJFeHByZXNzaW9ucy5wdXNoKGJpbmRpbmdFeHByZXNzaW9uKGtleS5uYW1lLCBcIlwiKSkpO1xuXHRcdH1cblx0fVxuXHRpZiAoIW9Gb3JtYXRPcHRpb25zICYmIChwYXJhbWV0ZXJzWzBdIGFzIGFueSk/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5JbnRcIikgPT09IDApIHtcblx0XHRvRm9ybWF0T3B0aW9ucyA9IHsgcGFyc2VBc1N0cmluZzogZmFsc2UsIGVtcHR5U3RyaW5nOiBcIlwiIH07XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdF90eXBlOiBcIkNvbXBsZXhUeXBlXCIsXG5cdFx0dHlwZTogdHlwZSxcblx0XHRmb3JtYXRPcHRpb25zOiBvRm9ybWF0T3B0aW9ucyB8fCB7fSxcblx0XHRwYXJhbWV0ZXJzOiB7fSxcblx0XHRiaW5kaW5nUGFyYW1ldGVyczogcGFyYW1ldGVyRXhwcmVzc2lvbnNcblx0fTtcbn1cbi8qKlxuICogRnVuY3Rpb24gY2FsbCwgb3B0aW9uYWxseSB3aXRoIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZnVuYyBGdW5jdGlvbiBuYW1lIG9yIHJlZmVyZW5jZSB0byBmdW5jdGlvblxuICogQHBhcmFtIHBhcmFtZXRlcnMgQXJndW1lbnRzXG4gKiBAcGFyYW0gb24gT2JqZWN0IHRvIGNhbGwgdGhlIGZ1bmN0aW9uIG9uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb25FeHByZXNzaW9uPFQ+fSBFeHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgZnVuY3Rpb24gY2FsbCAobm90IHRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwhKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZm48VCwgVSBleHRlbmRzIEZ1bmN0aW9uT3JOYW1lPFQ+Pihcblx0ZnVuYzogVSxcblx0cGFyYW1ldGVyczogV3JhcHBlZFR1cGxlPEZ1bmN0aW9uUGFyYW1ldGVyczxULCBVPj4sXG5cdG9uPzogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPG9iamVjdD5cbik6IEZ1bmN0aW9uRXhwcmVzc2lvbjxUPiB7XG5cdGNvbnN0IGZ1bmN0aW9uTmFtZSA9IHR5cGVvZiBmdW5jID09PSBcInN0cmluZ1wiID8gZnVuYyA6IChmdW5jIGFzIEZuPFQ+KS5fX2Z1bmN0aW9uTmFtZTtcblx0cmV0dXJuIHtcblx0XHRfdHlwZTogXCJGdW5jdGlvblwiLFxuXHRcdG9iajogb24gIT09IHVuZGVmaW5lZCA/IHdyYXBQcmltaXRpdmUob24pIDogdW5kZWZpbmVkLFxuXHRcdGZuOiBmdW5jdGlvbk5hbWUsXG5cdFx0cGFyYW1ldGVyczogKHBhcmFtZXRlcnMgYXMgYW55W10pLm1hcCh3cmFwUHJpbWl0aXZlKVxuXHR9O1xufVxuXG4vKipcbiAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIGJpbmRpbmcgdmFsdWUgaXMgbnVsbCwgdW5kZWZpbmVkIG9yIGVtcHR5LlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gZXhwcmVzc2lvbiBldmFsdWF0aW5nIHRoZSBmYWN0IHRoYXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBlbXB0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eShleHByZXNzaW9uOiBFeHByZXNzaW9uPHN0cmluZz4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0aWYgKGV4cHJlc3Npb24uX3R5cGUgPT09IFwiQ29uY2F0XCIpIHtcblx0XHRyZXR1cm4gb3IoLi4uZXhwcmVzc2lvbi5leHByZXNzaW9ucy5tYXAoaXNFbXB0eSkpO1xuXHR9XG5cdHJldHVybiBvcihlcXVhbChleHByZXNzaW9uLCBcIlwiKSwgZXF1YWwoZXhwcmVzc2lvbiwgdW5kZWZpbmVkKSwgZXF1YWwoZXhwcmVzc2lvbiwgbnVsbCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0KC4uLmluRXhwcmVzc2lvbnM6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxzdHJpbmc+W10pOiBFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBleHByZXNzaW9ucyA9IGluRXhwcmVzc2lvbnMubWFwKHdyYXBQcmltaXRpdmUpO1xuXHRpZiAoaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24oLi4uZXhwcmVzc2lvbnMpKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdGlmIChleHByZXNzaW9ucy5ldmVyeShpc0NvbnN0YW50KSkge1xuXHRcdHJldHVybiBjb25zdGFudChcblx0XHRcdGV4cHJlc3Npb25zLnJlZHVjZSgoY29uY2F0ZW5hdGVkOiBzdHJpbmcsIHZhbHVlKSA9PiB7XG5cdFx0XHRcdHJldHVybiBjb25jYXRlbmF0ZWQgKyAodmFsdWUgYXMgQ29uc3RhbnRFeHByZXNzaW9uPGFueT4pLnZhbHVlLnRvU3RyaW5nKCk7XG5cdFx0XHR9LCBcIlwiKVxuXHRcdCk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRfdHlwZTogXCJDb25jYXRcIixcblx0XHRleHByZXNzaW9uczogZXhwcmVzc2lvbnNcblx0fTtcbn1cblxuZXhwb3J0IHR5cGUgVHJhbnNmb3JtRnVuY3Rpb24gPSA8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGUgfCB1bmtub3duPihleHByZXNzaW9uUGFydDogYW55KSA9PiBFeHByZXNzaW9uPFQ+O1xuZXhwb3J0IHR5cGUgRXhwcmVzc2lvblR5cGUgPSBQaWNrPEV4cHJlc3Npb248YW55PiwgXCJfdHlwZVwiPltcIl90eXBlXCJdO1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybVJlY3Vyc2l2ZWx5PFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlIHwgdW5rbm93bj4oXG5cdGluRXhwcmVzc2lvbjogRXhwcmVzc2lvbjxUPixcblx0ZXhwcmVzc2lvblR5cGU6IEV4cHJlc3Npb25UeXBlLFxuXHR0cmFuc2Zvcm1GdW5jdGlvbjogVHJhbnNmb3JtRnVuY3Rpb24sXG5cdGluY2x1ZGVBbGxFeHByZXNzaW9uID0gZmFsc2Vcbik6IEV4cHJlc3Npb248VD4ge1xuXHRsZXQgZXhwcmVzc2lvbiA9IGluRXhwcmVzc2lvbjtcblx0c3dpdGNoIChleHByZXNzaW9uLl90eXBlKSB7XG5cdFx0Y2FzZSBcIkZ1bmN0aW9uXCI6XG5cdFx0Y2FzZSBcIkZvcm1hdHRlclwiOlxuXHRcdFx0ZXhwcmVzc2lvbi5wYXJhbWV0ZXJzID0gZXhwcmVzc2lvbi5wYXJhbWV0ZXJzLm1hcCgocGFyYW1ldGVyKSA9PlxuXHRcdFx0XHR0cmFuc2Zvcm1SZWN1cnNpdmVseShwYXJhbWV0ZXIsIGV4cHJlc3Npb25UeXBlLCB0cmFuc2Zvcm1GdW5jdGlvbiwgaW5jbHVkZUFsbEV4cHJlc3Npb24pXG5cdFx0XHQpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkNvbmNhdFwiOlxuXHRcdFx0ZXhwcmVzc2lvbi5leHByZXNzaW9ucyA9IGV4cHJlc3Npb24uZXhwcmVzc2lvbnMubWFwKChzdWJFeHByZXNzaW9uKSA9PlxuXHRcdFx0XHR0cmFuc2Zvcm1SZWN1cnNpdmVseShzdWJFeHByZXNzaW9uLCBleHByZXNzaW9uVHlwZSwgdHJhbnNmb3JtRnVuY3Rpb24sIGluY2x1ZGVBbGxFeHByZXNzaW9uKVxuXHRcdFx0KTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJDb21wbGV4VHlwZVwiOlxuXHRcdFx0ZXhwcmVzc2lvbi5iaW5kaW5nUGFyYW1ldGVycyA9IGV4cHJlc3Npb24uYmluZGluZ1BhcmFtZXRlcnMubWFwKChiaW5kaW5nUGFyYW1ldGVyKSA9PlxuXHRcdFx0XHR0cmFuc2Zvcm1SZWN1cnNpdmVseShiaW5kaW5nUGFyYW1ldGVyLCBleHByZXNzaW9uVHlwZSwgdHJhbnNmb3JtRnVuY3Rpb24sIGluY2x1ZGVBbGxFeHByZXNzaW9uKVxuXHRcdFx0KTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJJZkVsc2VcIjpcblx0XHRcdGNvbnN0IG9uVHJ1ZSA9IHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KGV4cHJlc3Npb24ub25UcnVlLCBleHByZXNzaW9uVHlwZSwgdHJhbnNmb3JtRnVuY3Rpb24sIGluY2x1ZGVBbGxFeHByZXNzaW9uKTtcblx0XHRcdGNvbnN0IG9uRmFsc2UgPSB0cmFuc2Zvcm1SZWN1cnNpdmVseShleHByZXNzaW9uLm9uRmFsc2UsIGV4cHJlc3Npb25UeXBlLCB0cmFuc2Zvcm1GdW5jdGlvbiwgaW5jbHVkZUFsbEV4cHJlc3Npb24pO1xuXHRcdFx0bGV0IGNvbmRpdGlvbiA9IGV4cHJlc3Npb24uY29uZGl0aW9uO1xuXHRcdFx0aWYgKGluY2x1ZGVBbGxFeHByZXNzaW9uKSB7XG5cdFx0XHRcdGNvbmRpdGlvbiA9IHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KGV4cHJlc3Npb24uY29uZGl0aW9uLCBleHByZXNzaW9uVHlwZSwgdHJhbnNmb3JtRnVuY3Rpb24sIGluY2x1ZGVBbGxFeHByZXNzaW9uKTtcblx0XHRcdH1cblx0XHRcdGV4cHJlc3Npb24gPSBpZkVsc2UoY29uZGl0aW9uLCBvblRydWUsIG9uRmFsc2UpIGFzIEV4cHJlc3Npb248VD47XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiTm90XCI6XG5cdFx0XHRpZiAoaW5jbHVkZUFsbEV4cHJlc3Npb24pIHtcblx0XHRcdFx0Y29uc3Qgb3BlcmFuZCA9IHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KGV4cHJlc3Npb24ub3BlcmFuZCwgZXhwcmVzc2lvblR5cGUsIHRyYW5zZm9ybUZ1bmN0aW9uLCBpbmNsdWRlQWxsRXhwcmVzc2lvbik7XG5cdFx0XHRcdGV4cHJlc3Npb24gPSBub3Qob3BlcmFuZCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJUcnV0aHlcIjpcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJTZXRcIjpcblx0XHRcdGlmIChpbmNsdWRlQWxsRXhwcmVzc2lvbikge1xuXHRcdFx0XHRleHByZXNzaW9uLm9wZXJhbmRzID0gZXhwcmVzc2lvbi5vcGVyYW5kcy5tYXAoKG9wZXJhbmQpID0+XG5cdFx0XHRcdFx0dHJhbnNmb3JtUmVjdXJzaXZlbHkob3BlcmFuZCwgZXhwcmVzc2lvblR5cGUsIHRyYW5zZm9ybUZ1bmN0aW9uLCBpbmNsdWRlQWxsRXhwcmVzc2lvbilcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJDb21wYXJpc29uXCI6XG5cdFx0XHRpZiAoaW5jbHVkZUFsbEV4cHJlc3Npb24pIHtcblx0XHRcdFx0Y29uc3Qgb3BlcmFuZDEgPSB0cmFuc2Zvcm1SZWN1cnNpdmVseShleHByZXNzaW9uLm9wZXJhbmQxLCBleHByZXNzaW9uVHlwZSwgdHJhbnNmb3JtRnVuY3Rpb24sIGluY2x1ZGVBbGxFeHByZXNzaW9uKTtcblx0XHRcdFx0Y29uc3Qgb3BlcmFuZDIgPSB0cmFuc2Zvcm1SZWN1cnNpdmVseShleHByZXNzaW9uLm9wZXJhbmQyLCBleHByZXNzaW9uVHlwZSwgdHJhbnNmb3JtRnVuY3Rpb24sIGluY2x1ZGVBbGxFeHByZXNzaW9uKTtcblx0XHRcdFx0ZXhwcmVzc2lvbiA9IGNvbXBhcmlzb24oZXhwcmVzc2lvbi5vcGVyYXRvciwgb3BlcmFuZDEsIG9wZXJhbmQyKSBhcyBFeHByZXNzaW9uPFQ+O1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkRlZmF1bHRCaW5kaW5nXCI6XG5cdFx0Y2FzZSBcIlJlZlwiOlxuXHRcdGNhc2UgXCJMZW5ndGhcIjpcblx0XHRjYXNlIFwiQmluZGluZ1wiOlxuXHRcdGNhc2UgXCJDb25zdGFudFwiOlxuXHRcdFx0Ly8gRG8gbm90aGluZ1xuXHRcdFx0YnJlYWs7XG5cdH1cblx0aWYgKGV4cHJlc3Npb25UeXBlID09PSBleHByZXNzaW9uLl90eXBlKSB7XG5cdFx0ZXhwcmVzc2lvbiA9IHRyYW5zZm9ybUZ1bmN0aW9uKGluRXhwcmVzc2lvbik7XG5cdH1cblx0cmV0dXJuIGV4cHJlc3Npb247XG59XG5cbmV4cG9ydCB0eXBlIEJpbmRpbmdFeHByZXNzaW9uPFQ+ID0gVCB8IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuY29uc3QgbmVlZFBhcmVudGhlc2lzID0gZnVuY3Rpb24gPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihleHByOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4pOiBib29sZWFuIHtcblx0cmV0dXJuICFpc0NvbnN0YW50KGV4cHIpICYmICFpc0JpbmRpbmcoZXhwcikgJiYgaXNFeHByZXNzaW9uKGV4cHIpICYmIGV4cHIuX3R5cGUgIT09IFwiSWZFbHNlXCIgJiYgZXhwci5fdHlwZSAhPT0gXCJGdW5jdGlvblwiO1xufTtcblxuLyoqXG4gKiBDb21waWxlcyBhIGNvbnN0YW50IG9iamVjdCB0byBhIHN0cmluZy5cbiAqIEBwYXJhbSBleHByXG4gKiBAcGFyYW0gaXNOdWxsYWJsZVxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbXBpbGVkIHN0cmluZ1xuICovXG5mdW5jdGlvbiBjb21waWxlQ29uc3RhbnRPYmplY3Q8VD4oZXhwcjogQ29uc3RhbnRFeHByZXNzaW9uPG9iamVjdD4sIGlzTnVsbGFibGUgPSBmYWxzZSkge1xuXHRpZiAoaXNOdWxsYWJsZSAmJiBPYmplY3Qua2V5cyhleHByLnZhbHVlKS5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm4gXCJcIjtcblx0fVxuXHQvLyBPYmplY3RzXG5cdGNvbnN0IG8gPSBleHByLnZhbHVlIGFzIFBsYWluRXhwcmVzc2lvbk9iamVjdDtcblx0Y29uc3QgcHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0T2JqZWN0LmtleXMobykuZm9yRWFjaCgoa2V5KSA9PiB7XG5cdFx0Y29uc3QgdmFsdWUgPSBvW2tleV07XG5cdFx0Y29uc3QgY2hpbGRSZXN1bHQgPSBjb21waWxlQmluZGluZyh2YWx1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUpO1xuXHRcdGlmIChjaGlsZFJlc3VsdCAmJiBjaGlsZFJlc3VsdC5sZW5ndGggPiAwKSB7XG5cdFx0XHRwcm9wZXJ0aWVzLnB1c2goYCR7a2V5fTogJHtjaGlsZFJlc3VsdH1gKTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gYHske3Byb3BlcnRpZXMuam9pbihcIiwgXCIpfX1gO1xufVxuXG4vKipcbiAqIENvbXBpbGVzIGEgQ29uc3RhbnQgQmluZGluZyBFeHByZXNzaW9uLlxuICogQHBhcmFtIGV4cHJcbiAqIEBwYXJhbSBlbWJlZGRlZEluQmluZGluZ1xuICogQHBhcmFtIGlzTnVsbGFibGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21waWxlZCBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gY29tcGlsZUNvbnN0YW50PFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihleHByOiBDb25zdGFudEV4cHJlc3Npb248VD4sIGVtYmVkZGVkSW5CaW5kaW5nOiBib29sZWFuLCBpc051bGxhYmxlID0gZmFsc2UpIHtcblx0aWYgKGV4cHIudmFsdWUgPT09IG51bGwpIHtcblx0XHRyZXR1cm4gXCJudWxsXCI7XG5cdH1cblx0aWYgKGV4cHIudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBcInVuZGVmaW5lZFwiO1xuXHR9XG5cdGlmICh0eXBlb2YgZXhwci52YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KGV4cHIudmFsdWUpKSB7XG5cdFx0XHRjb25zdCBlbnRyaWVzID0gZXhwci52YWx1ZS5tYXAoKGV4cHJlc3Npb24pID0+IGNvbXBpbGVCaW5kaW5nKGV4cHJlc3Npb24sIHRydWUpKTtcblx0XHRcdHJldHVybiBgWyR7ZW50cmllcy5qb2luKFwiLCBcIil9XWA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBjb21waWxlQ29uc3RhbnRPYmplY3QoZXhwciBhcyBDb25zdGFudEV4cHJlc3Npb248b2JqZWN0PiwgaXNOdWxsYWJsZSk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKGVtYmVkZGVkSW5CaW5kaW5nKSB7XG5cdFx0c3dpdGNoICh0eXBlb2YgZXhwci52YWx1ZSkge1xuXHRcdFx0Y2FzZSBcIm51bWJlclwiOlxuXHRcdFx0Y2FzZSBcImJpZ2ludFwiOlxuXHRcdFx0Y2FzZSBcImJvb2xlYW5cIjpcblx0XHRcdFx0cmV0dXJuIGV4cHIudmFsdWUudG9TdHJpbmcoKTtcblx0XHRcdGNhc2UgXCJzdHJpbmdcIjpcblx0XHRcdFx0cmV0dXJuIGAnJHtlc2NhcGVYbWxBdHRyaWJ1dGUoZXhwci52YWx1ZS50b1N0cmluZygpKX0nYDtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBcIlwiO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZXhwci52YWx1ZS50b1N0cmluZygpO1xuXHR9XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBiaW5kaW5nIHN0cmluZyBmb3IgYSBCaW5kaW5nIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIGV4cHJlc3Npb25Gb3JCaW5kaW5nIFRoZSBleHByZXNzaW9uIHRvIGNvbXBpbGVcbiAqIEBwYXJhbSBlbWJlZGRlZEluQmluZGluZyBXaGV0aGVyIHRoZSBleHByZXNzaW9uIHRvIGNvbXBpbGUgaXMgZW1iZWRkZWQgaW50byBhbm90aGVyIGV4cHJlc3Npb25cbiAqIEBwYXJhbSBlbWJlZGRlZFNlcGFyYXRvciBUaGUgYmluZGluZyB2YWx1ZSBldmFsdWF0b3IgKCQgb3IgJSBkZXBlbmRpbmcgb24gd2hldGhlciB3ZSB3YW50IHRvIGZvcmNlIHRoZSB0eXBlIG9yIG5vdClcbiAqIEByZXR1cm5zIHtCaW5kaW5nRXhwcmVzc2lvbjxUPn0gVGhlIGNvcnJlc3BvbmRpbmcgZXhwcmVzc2lvbiBiaW5kaW5nXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVCaW5kaW5nRm9yQmluZGluZzxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdGV4cHJlc3Npb25Gb3JCaW5kaW5nOiBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VD4gfCBEZWZhdWx0QmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFQ+LFxuXHRlbWJlZGRlZEluQmluZGluZzogYm9vbGVhbixcblx0ZW1iZWRkZWRTZXBhcmF0b3I6IHN0cmluZ1xuKSB7XG5cdGlmIChcblx0XHRleHByZXNzaW9uRm9yQmluZGluZy50eXBlIHx8XG5cdFx0ZXhwcmVzc2lvbkZvckJpbmRpbmcucGFyYW1ldGVycyB8fFxuXHRcdGV4cHJlc3Npb25Gb3JCaW5kaW5nLnRhcmdldFR5cGUgfHxcblx0XHRleHByZXNzaW9uRm9yQmluZGluZy5mb3JtYXRPcHRpb25zIHx8XG5cdFx0ZXhwcmVzc2lvbkZvckJpbmRpbmcuY29uc3RyYWludHNcblx0KSB7XG5cdFx0Ly8gVGhpcyBpcyBub3cgYSBjb21wbGV4IGJpbmRpbmcgZGVmaW5pdGlvbiwgbGV0J3MgcHJlcGFyZSBmb3IgaXRcblx0XHRjb25zdCBjb21wbGV4QmluZGluZ0RlZmluaXRpb24gPSB7XG5cdFx0XHRwYXRoOiBjb21waWxlQmluZGluZ1BhdGgoZXhwcmVzc2lvbkZvckJpbmRpbmcpLFxuXHRcdFx0dHlwZTogZXhwcmVzc2lvbkZvckJpbmRpbmcudHlwZSxcblx0XHRcdHRhcmdldFR5cGU6IGV4cHJlc3Npb25Gb3JCaW5kaW5nLnRhcmdldFR5cGUsXG5cdFx0XHRwYXJhbWV0ZXJzOiBleHByZXNzaW9uRm9yQmluZGluZy5wYXJhbWV0ZXJzLFxuXHRcdFx0Zm9ybWF0T3B0aW9uczogZXhwcmVzc2lvbkZvckJpbmRpbmcuZm9ybWF0T3B0aW9ucyxcblx0XHRcdGNvbnN0cmFpbnRzOiBleHByZXNzaW9uRm9yQmluZGluZy5jb25zdHJhaW50c1xuXHRcdH07XG5cdFx0bGV0IG91dEJpbmRpbmcgPSBjb21waWxlQmluZGluZyhjb21wbGV4QmluZGluZ0RlZmluaXRpb24pO1xuXHRcdGlmIChlbWJlZGRlZEluQmluZGluZykge1xuXHRcdFx0b3V0QmluZGluZyA9IGAke2VtYmVkZGVkU2VwYXJhdG9yfWAgKyBvdXRCaW5kaW5nO1xuXHRcdH1cblx0XHRyZXR1cm4gb3V0QmluZGluZztcblx0fSBlbHNlIGlmIChlbWJlZGRlZEluQmluZGluZykge1xuXHRcdHJldHVybiBgJHtlbWJlZGRlZFNlcGFyYXRvcn17JHtjb21waWxlQmluZGluZ1BhdGgoZXhwcmVzc2lvbkZvckJpbmRpbmcpfX1gO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBgeyR7Y29tcGlsZUJpbmRpbmdQYXRoKGV4cHJlc3Npb25Gb3JCaW5kaW5nKX19YDtcblx0fVxufVxuXG5mdW5jdGlvbiBjb21waWxlQ29tcGxleFR5cGVFeHByZXNzaW9uPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihleHByZXNzaW9uOiBDb21wbGV4VHlwZUV4cHJlc3Npb248VD4pIHtcblx0aWYgKGV4cHJlc3Npb24uYmluZGluZ1BhcmFtZXRlcnMubGVuZ3RoID09PSAxKSB7XG5cdFx0cmV0dXJuIGB7JHtjb21waWxlUGF0aFBhcmFtZXRlcihleHByZXNzaW9uLmJpbmRpbmdQYXJhbWV0ZXJzWzBdLCB0cnVlKX0sIHR5cGU6ICcke2V4cHJlc3Npb24udHlwZX0nfWA7XG5cdH1cblxuXHRsZXQgb3V0cHV0RW5kO1xuXHQvLyB0aGlzIGNvZGUgaXMgYmFzZWQgb24gc2FwLnVpLm1vZGVsLm9kYXRhLnY0Ll9Bbm5vdGF0aW9uSGVscGVyRXhwcmVzc2lvbi5mZXRjaEN1cnJlbmN5T3JVbml0XG5cdHN3aXRjaCAoZXhwcmVzc2lvbi50eXBlKSB7XG5cdFx0Y2FzZSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlVuaXRcIjpcblx0XHRcdG91dHB1dEVuZCA9IGAse21vZGU6J09uZVRpbWUnLHBhdGg6Jy8jI0BAcmVxdWVzdFVuaXRzT2ZNZWFzdXJlJyx0YXJnZXRUeXBlOidhbnknfV0sdHlwZTonc2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuVW5pdCdgO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkN1cnJlbmN5XCI6XG5cdFx0XHRvdXRwdXRFbmQgPSBgLHttb2RlOidPbmVUaW1lJyxwYXRoOicvIyNAQHJlcXVlc3RDdXJyZW5jeUNvZGVzJyx0YXJnZXRUeXBlOidhbnknfV0sdHlwZTonc2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuQ3VycmVuY3knYDtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRvdXRwdXRFbmQgPSBgXSwgdHlwZTogJyR7ZXhwcmVzc2lvbi50eXBlfSdgO1xuXHR9XG5cdGlmIChoYXNFbGVtZW50cyhleHByZXNzaW9uLmZvcm1hdE9wdGlvbnMpKSB7XG5cdFx0b3V0cHV0RW5kICs9IGAsIGZvcm1hdE9wdGlvbnM6ICR7Y29tcGlsZUJpbmRpbmcoZXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zKX1gO1xuXHR9XG5cdGlmIChoYXNFbGVtZW50cyhleHByZXNzaW9uLnBhcmFtZXRlcnMpKSB7XG5cdFx0b3V0cHV0RW5kICs9IGAsIHBhcmFtZXRlcnM6ICR7Y29tcGlsZUJpbmRpbmcoZXhwcmVzc2lvbi5wYXJhbWV0ZXJzKX1gO1xuXHR9XG5cdG91dHB1dEVuZCArPSBcIn1cIjtcblxuXHRyZXR1cm4gYHttb2RlOidUd29XYXknLCBwYXJ0czpbJHtleHByZXNzaW9uLmJpbmRpbmdQYXJhbWV0ZXJzLm1hcCgocGFyYW06IGFueSkgPT4gY29tcGlsZVBhdGhQYXJhbWV0ZXIocGFyYW0pKS5qb2luKFwiLFwiKX0ke291dHB1dEVuZH1gO1xufVxuXG4vKipcbiAqIFdyYXAgdGhlIGNvbXBpbGVkIGJpbmRpbmcgc3RyaW5nIGFzIHJlcXVpcmVkIGRlcGVuZGVuaW5nIG9uIGl0cyBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBjb21waWxlZCBleHByZXNzaW9uXG4gKiBAcGFyYW0gZW1iZWRkZWRJbkJpbmRpbmcgVHJ1ZSBpZiB0aGUgY29tcGlsZWQgZXhwcmVzc2lvbiBpcyB0byBiZSBlbWJlZGRlZCBpbiBhIGJpbmRpbmdcbiAqIEBwYXJhbSBwYXJlbnRoZXNpc1JlcXVpcmVkIFRydWUgaWYgdGhlIGVtYmVkZGVkIGJpbmRpbmcgbmVlZHMgdG8gYmUgd3JhcHBlZCBpbiBwYXJldGhlc2lzIHNvIHRoYXQgaXQgaXMgZXZhbHVhdGVkIGFzIG9uZVxuICogQHJldHVybnMge0JpbmRpbmdFeHByZXNzaW9uPHN0cmluZz59IEZpbmFsaXplZCBjb21waWxlZCBleHByZXNzaW9uXG4gKi9cbmZ1bmN0aW9uIHdyYXBCaW5kaW5nRXhwcmVzc2lvbihleHByZXNzaW9uOiBzdHJpbmcsIGVtYmVkZGVkSW5CaW5kaW5nOiBib29sZWFuLCBwYXJlbnRoZXNpc1JlcXVpcmVkID0gZmFsc2UpOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0aWYgKGVtYmVkZGVkSW5CaW5kaW5nKSB7XG5cdFx0aWYgKHBhcmVudGhlc2lzUmVxdWlyZWQpIHtcblx0XHRcdHJldHVybiBgKCR7ZXhwcmVzc2lvbn0pYDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGV4cHJlc3Npb247XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBgez0gJHtleHByZXNzaW9ufX1gO1xuXHR9XG59XG5cbi8qKlxuICogQ29tcGlsZSBhbiBleHByZXNzaW9uIGludG8gYW4gZXhwcmVzc2lvbiBiaW5kaW5nLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gdG8gY29tcGlsZVxuICogQHBhcmFtIGVtYmVkZGVkSW5CaW5kaW5nIFdoZXRoZXIgdGhlIGV4cHJlc3Npb24gdG8gY29tcGlsZSBpcyBlbWJlZGRlZCBpbnRvIGFub3RoZXIgZXhwcmVzc2lvblxuICogQHBhcmFtIGtlZXBUYXJnZXRUeXBlIEtlZXAgdGhlIHRhcmdldCB0eXBlIG9mIHRoZSBlbWJlZGRlZCBiaW5kaW5ncyBpbnN0ZWFkIG9mIGNhc3RpbmcgdGhlbSB0byBhbnlcbiAqIEBwYXJhbSBpc051bGxhYmxlIFdoZXRoZXIgYmluZGluZyBleHByZXNzaW9uIGNhbiByZXNvbHZlIHRvIGVtcHR5IHN0cmluZyBvciBub3RcbiAqIEByZXR1cm5zIHtCaW5kaW5nRXhwcmVzc2lvbjxUPn0gVGhlIGNvcnJlc3BvbmRpbmcgZXhwcmVzc2lvbiBiaW5kaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21waWxlQmluZGluZzxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdGV4cHJlc3Npb246IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPixcblx0ZW1iZWRkZWRJbkJpbmRpbmcgPSBmYWxzZSxcblx0a2VlcFRhcmdldFR5cGUgPSBmYWxzZSxcblx0aXNOdWxsYWJsZSA9IGZhbHNlXG4pOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0Y29uc3QgZXhwciA9IHdyYXBQcmltaXRpdmUoZXhwcmVzc2lvbik7XG5cdGNvbnN0IGVtYmVkZGVkU2VwYXJhdG9yID0ga2VlcFRhcmdldFR5cGUgPyBcIiRcIiA6IFwiJVwiO1xuXG5cdHN3aXRjaCAoZXhwci5fdHlwZSkge1xuXHRcdGNhc2UgXCJVbnJlc29sdmFibGVcIjpcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHRjYXNlIFwiQ29uc3RhbnRcIjpcblx0XHRcdHJldHVybiBjb21waWxlQ29uc3RhbnQoZXhwciwgZW1iZWRkZWRJbkJpbmRpbmcsIGlzTnVsbGFibGUpO1xuXG5cdFx0Y2FzZSBcIlJlZlwiOlxuXHRcdFx0cmV0dXJuIGV4cHIucmVmIHx8IFwibnVsbFwiO1xuXG5cdFx0Y2FzZSBcIkZ1bmN0aW9uXCI6XG5cdFx0XHRjb25zdCBhcmd1bWVudFN0cmluZyA9IGAke2V4cHIucGFyYW1ldGVycy5tYXAoKGFyZykgPT4gY29tcGlsZUJpbmRpbmcoYXJnLCB0cnVlKSkuam9pbihcIiwgXCIpfWA7XG5cdFx0XHRyZXR1cm4gZXhwci5vYmogPT09IHVuZGVmaW5lZFxuXHRcdFx0XHQ/IGAke2V4cHIuZm59KCR7YXJndW1lbnRTdHJpbmd9KWBcblx0XHRcdFx0OiBgJHtjb21waWxlQmluZGluZyhleHByLm9iaiwgdHJ1ZSl9LiR7ZXhwci5mbn0oJHthcmd1bWVudFN0cmluZ30pYDtcblxuXHRcdGNhc2UgXCJFbWJlZGRlZEV4cHJlc3Npb25CaW5kaW5nXCI6XG5cdFx0XHRyZXR1cm4gZW1iZWRkZWRJbkJpbmRpbmcgPyBgKCR7ZXhwci52YWx1ZS5zdWJzdHIoMiwgZXhwci52YWx1ZS5sZW5ndGggLSAzKX0pYCA6IGAke2V4cHIudmFsdWV9YDtcblxuXHRcdGNhc2UgXCJFbWJlZGRlZEJpbmRpbmdcIjpcblx0XHRcdHJldHVybiBlbWJlZGRlZEluQmluZGluZyA/IGAke2VtYmVkZGVkU2VwYXJhdG9yfSR7ZXhwci52YWx1ZX1gIDogYCR7ZXhwci52YWx1ZX1gO1xuXG5cdFx0Y2FzZSBcIkRlZmF1bHRCaW5kaW5nXCI6XG5cdFx0Y2FzZSBcIkJpbmRpbmdcIjpcblx0XHRcdHJldHVybiBjb21waWxlQmluZGluZ0ZvckJpbmRpbmcoZXhwciwgZW1iZWRkZWRJbkJpbmRpbmcsIGVtYmVkZGVkU2VwYXJhdG9yKTtcblxuXHRcdGNhc2UgXCJDb21wYXJpc29uXCI6XG5cdFx0XHRjb25zdCBjb21wYXJpc29uRXhwcmVzc2lvbiA9IGNvbXBpbGVDb21wYXJpc29uRXhwcmVzc2lvbihleHByKTtcblx0XHRcdHJldHVybiB3cmFwQmluZGluZ0V4cHJlc3Npb24oY29tcGFyaXNvbkV4cHJlc3Npb24sIGVtYmVkZGVkSW5CaW5kaW5nKTtcblxuXHRcdGNhc2UgXCJJZkVsc2VcIjpcblx0XHRcdGNvbnN0IGlmRWxzZUV4cHJlc3Npb24gPSBgJHtjb21waWxlQmluZGluZyhleHByLmNvbmRpdGlvbiwgdHJ1ZSl9ID8gJHtjb21waWxlQmluZGluZyhleHByLm9uVHJ1ZSwgdHJ1ZSl9IDogJHtjb21waWxlQmluZGluZyhcblx0XHRcdFx0ZXhwci5vbkZhbHNlLFxuXHRcdFx0XHR0cnVlXG5cdFx0XHQpfWA7XG5cdFx0XHRyZXR1cm4gd3JhcEJpbmRpbmdFeHByZXNzaW9uKGlmRWxzZUV4cHJlc3Npb24sIGVtYmVkZGVkSW5CaW5kaW5nLCB0cnVlKTtcblxuXHRcdGNhc2UgXCJTZXRcIjpcblx0XHRcdGNvbnN0IHNldEV4cHJlc3Npb24gPSBleHByLm9wZXJhbmRzLm1hcCgob3BlcmFuZCkgPT4gY29tcGlsZUJpbmRpbmcob3BlcmFuZCwgdHJ1ZSkpLmpvaW4oYCAke2V4cHIub3BlcmF0b3J9IGApO1xuXHRcdFx0cmV0dXJuIHdyYXBCaW5kaW5nRXhwcmVzc2lvbihzZXRFeHByZXNzaW9uLCBlbWJlZGRlZEluQmluZGluZywgdHJ1ZSk7XG5cblx0XHRjYXNlIFwiQ29uY2F0XCI6XG5cdFx0XHRjb25zdCBjb25jYXRFeHByZXNzaW9uID0gZXhwci5leHByZXNzaW9ucy5tYXAoKG5lc3RlZEV4cHJlc3Npb24pID0+IGNvbXBpbGVCaW5kaW5nKG5lc3RlZEV4cHJlc3Npb24sIHRydWUsIHRydWUpKS5qb2luKFwiICsgXCIpO1xuXHRcdFx0cmV0dXJuIHdyYXBCaW5kaW5nRXhwcmVzc2lvbihjb25jYXRFeHByZXNzaW9uLCBlbWJlZGRlZEluQmluZGluZyk7XG5cblx0XHRjYXNlIFwiTGVuZ3RoXCI6XG5cdFx0XHRjb25zdCBsZW5ndGhFeHByZXNzaW9uID0gYCR7Y29tcGlsZUJpbmRpbmcoZXhwci5iaW5kaW5nRXhwcmVzc2lvbiwgdHJ1ZSl9Lmxlbmd0aGA7XG5cdFx0XHRyZXR1cm4gd3JhcEJpbmRpbmdFeHByZXNzaW9uKGxlbmd0aEV4cHJlc3Npb24sIGVtYmVkZGVkSW5CaW5kaW5nKTtcblxuXHRcdGNhc2UgXCJOb3RcIjpcblx0XHRcdGNvbnN0IG5vdEV4cHJlc3Npb24gPSBgISR7Y29tcGlsZUJpbmRpbmcoZXhwci5vcGVyYW5kLCB0cnVlKX1gO1xuXHRcdFx0cmV0dXJuIHdyYXBCaW5kaW5nRXhwcmVzc2lvbihub3RFeHByZXNzaW9uLCBlbWJlZGRlZEluQmluZGluZyk7XG5cblx0XHRjYXNlIFwiVHJ1dGh5XCI6XG5cdFx0XHRjb25zdCB0cnV0aHlFeHByZXNzaW9uID0gYCEhJHtjb21waWxlQmluZGluZyhleHByLm9wZXJhbmQsIHRydWUpfWA7XG5cdFx0XHRyZXR1cm4gd3JhcEJpbmRpbmdFeHByZXNzaW9uKHRydXRoeUV4cHJlc3Npb24sIGVtYmVkZGVkSW5CaW5kaW5nKTtcblxuXHRcdGNhc2UgXCJGb3JtYXR0ZXJcIjpcblx0XHRcdGNvbnN0IGZvcm1hdHRlckV4cHJlc3Npb24gPSBjb21waWxlRm9ybWF0dGVyRXhwcmVzc2lvbihleHByKTtcblx0XHRcdHJldHVybiBlbWJlZGRlZEluQmluZGluZyA/IGBcXCQke2Zvcm1hdHRlckV4cHJlc3Npb259YCA6IGZvcm1hdHRlckV4cHJlc3Npb247XG5cblx0XHRjYXNlIFwiQ29tcGxleFR5cGVcIjpcblx0XHRcdGNvbnN0IGNvbXBsZXhUeXBlRXhwcmVzc2lvbiA9IGNvbXBpbGVDb21wbGV4VHlwZUV4cHJlc3Npb24oZXhwcik7XG5cdFx0XHRyZXR1cm4gZW1iZWRkZWRJbkJpbmRpbmcgPyBgXFwkJHtjb21wbGV4VHlwZUV4cHJlc3Npb259YCA6IGNvbXBsZXhUeXBlRXhwcmVzc2lvbjtcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHRyZXR1cm4gXCJcIjtcblx0fVxufVxuXG4vKipcbiAqIENvbXBpbGUgYSBjb21wYXJpc29uIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGNvbXBhcmlzb24gZXhwcmVzc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBjb21waWxlZCBleHByZXNzaW9uLiBOZWVkcyB3cmFwcGluZyBiZWZvcmUgaXQgY2FuIGJlIHVzZWQgYXMgYW4gZXhwcmVzc2lvbiBiaW5kaW5nLlxuICovXG5mdW5jdGlvbiBjb21waWxlQ29tcGFyaXNvbkV4cHJlc3Npb24oZXhwcmVzc2lvbjogQ29tcGFyaXNvbkV4cHJlc3Npb24pIHtcblx0ZnVuY3Rpb24gY29tcGlsZU9wZXJhbmQob3BlcmFuZDogRXhwcmVzc2lvbjxhbnk+KSB7XG5cdFx0Y29uc3QgY29tcGlsZWRPcGVyYW5kID0gY29tcGlsZUJpbmRpbmcob3BlcmFuZCwgdHJ1ZSkgPz8gXCJ1bmRlZmluZWRcIjtcblx0XHRyZXR1cm4gd3JhcEJpbmRpbmdFeHByZXNzaW9uKGNvbXBpbGVkT3BlcmFuZCwgdHJ1ZSwgbmVlZFBhcmVudGhlc2lzKG9wZXJhbmQpKTtcblx0fVxuXG5cdHJldHVybiBgJHtjb21waWxlT3BlcmFuZChleHByZXNzaW9uLm9wZXJhbmQxKX0gJHtleHByZXNzaW9uLm9wZXJhdG9yfSAke2NvbXBpbGVPcGVyYW5kKGV4cHJlc3Npb24ub3BlcmFuZDIpfWA7XG59XG5cbi8qKlxuICogQ29tcGlsZSBhIGZvcm1hdHRlciBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBmb3JtYXR0ZXIgZXhwcmVzc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBjb21waWxlZCBleHByZXNzaW9uLlxuICovXG5mdW5jdGlvbiBjb21waWxlRm9ybWF0dGVyRXhwcmVzc2lvbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oZXhwcmVzc2lvbjogRm9ybWF0dGVyRXhwcmVzc2lvbjxUPikge1xuXHRpZiAoZXhwcmVzc2lvbi5wYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMSkge1xuXHRcdHJldHVybiBgeyR7Y29tcGlsZVBhdGhQYXJhbWV0ZXIoZXhwcmVzc2lvbi5wYXJhbWV0ZXJzWzBdLCB0cnVlKX0sIGZvcm1hdHRlcjogJyR7ZXhwcmVzc2lvbi5mbn0nfWA7XG5cdH0gZWxzZSB7XG5cdFx0Y29uc3QgcGFydHMgPSBleHByZXNzaW9uLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4gY29tcGlsZVBhdGhQYXJhbWV0ZXIocGFyYW0pKTtcblx0XHRyZXR1cm4gYHtwYXJ0czogWyR7cGFydHMuam9pbihcIiwgXCIpfV0sIGZvcm1hdHRlcjogJyR7ZXhwcmVzc2lvbi5mbn0nfWA7XG5cdH1cbn1cblxuLyoqXG4gKiBDb21waWxlIHRoZSBwYXRoIHBhcmFtZXRlciBvZiBhIGZvcm1hdHRlciBjYWxsLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBiaW5kaW5nIHBhcnQgdG8gZXZhbHVhdGVcbiAqIEBwYXJhbSBzaW5nbGVQYXRoIFdoZXRoZXIgdGhlcmUgaXMgb25lIG9yIG11bHRpcGxlIHBhdGggdG8gY29uc2lkZXJcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBzdHJpbmcgc25pcHBldCB0byBpbmNsdWRlIGluIHRoZSBvdmVyYWxsIGJpbmRpbmcgZGVmaW5pdGlvblxuICovXG5mdW5jdGlvbiBjb21waWxlUGF0aFBhcmFtZXRlcihleHByZXNzaW9uOiBFeHByZXNzaW9uPGFueT4sIHNpbmdsZVBhdGggPSBmYWxzZSk6IHN0cmluZyB7XG5cdGxldCBvdXRWYWx1ZSA9IFwiXCI7XG5cdGlmIChleHByZXNzaW9uLl90eXBlID09PSBcIkNvbnN0YW50XCIpIHtcblx0XHRzd2l0Y2ggKHR5cGVvZiBleHByZXNzaW9uLnZhbHVlKSB7XG5cdFx0XHRjYXNlIFwibnVtYmVyXCI6XG5cdFx0XHRjYXNlIFwiYmlnaW50XCI6XG5cdFx0XHRcdG91dFZhbHVlID0gYHZhbHVlOiAke2V4cHJlc3Npb24udmFsdWUudG9TdHJpbmcoKX1gO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJzdHJpbmdcIjpcblx0XHRcdFx0b3V0VmFsdWUgPSBgdmFsdWU6ICcke2VzY2FwZVhtbEF0dHJpYnV0ZShleHByZXNzaW9uLnZhbHVlLnRvU3RyaW5nKCkpfSdgO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJib29sZWFuXCI6XG5cdFx0XHRcdG91dFZhbHVlID0gYHZhbHVlOiAnJHtleHByZXNzaW9uLnZhbHVlLnRvU3RyaW5nKCl9J2A7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0b3V0VmFsdWUgPSBcInZhbHVlOiAnJ1wiO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJEZWZhdWx0QmluZGluZ1wiIHx8IGV4cHJlc3Npb24uX3R5cGUgPT09IFwiQmluZGluZ1wiKSB7XG5cdFx0b3V0VmFsdWUgPSBgcGF0aDogJyR7Y29tcGlsZUJpbmRpbmdQYXRoKGV4cHJlc3Npb24pfSdgO1xuXG5cdFx0b3V0VmFsdWUgKz0gZXhwcmVzc2lvbi50eXBlID8gYCwgdHlwZTogJyR7ZXhwcmVzc2lvbi50eXBlfSdgIDogYCwgdGFyZ2V0VHlwZTogJ2FueSdgO1xuXG5cdFx0aWYgKGhhc0VsZW1lbnRzKGV4cHJlc3Npb24uY29uc3RyYWludHMpKSB7XG5cdFx0XHRvdXRWYWx1ZSArPSBgLCBjb25zdHJhaW50czogJHtjb21waWxlQmluZGluZyhleHByZXNzaW9uLmNvbnN0cmFpbnRzKX1gO1xuXHRcdH1cblx0XHRpZiAoaGFzRWxlbWVudHMoZXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zKSkge1xuXHRcdFx0b3V0VmFsdWUgKz0gYCwgZm9ybWF0T3B0aW9uczogJHtjb21waWxlQmluZGluZyhleHByZXNzaW9uLmZvcm1hdE9wdGlvbnMpfWA7XG5cdFx0fVxuXHRcdGlmIChoYXNFbGVtZW50cyhleHByZXNzaW9uLnBhcmFtZXRlcnMpKSB7XG5cdFx0XHRvdXRWYWx1ZSArPSBgLCBwYXJhbWV0ZXJzOiAke2NvbXBpbGVCaW5kaW5nKGV4cHJlc3Npb24ucGFyYW1ldGVycyl9YDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cblx0cmV0dXJuIHNpbmdsZVBhdGggPyBvdXRWYWx1ZSA6IGB7JHtvdXRWYWx1ZX19YDtcbn1cblxuZnVuY3Rpb24gaGFzRWxlbWVudHMob2JqOiBhbnkpIHtcblx0cmV0dXJuIG9iaiAmJiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA+IDA7XG59XG5cbi8qKlxuICogQ29tcGlsZSBhIGJpbmRpbmcgZXhwcmVzc2lvbiBwYXRoLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uIHRvIGNvbXBpbGUuXG4gKiBAcmV0dXJucyBUaGUgY29tcGlsZWQgcGF0aC5cbiAqL1xuZnVuY3Rpb24gY29tcGlsZUJpbmRpbmdQYXRoPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihleHByZXNzaW9uOiBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VD4gfCBEZWZhdWx0QmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFQ+KSB7XG5cdHJldHVybiBgJHtleHByZXNzaW9uLm1vZGVsTmFtZSA/IGV4cHJlc3Npb24ubW9kZWxOYW1lICsgXCI+XCIgOiBcIlwifSR7ZXhwcmVzc2lvbi5wYXRofWA7XG59XG4iXX0=
|