@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
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/templating/PropertyHelper", "sap/fe/macros/field/FieldTemplating", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageToast", "sap/ui/core/Core", "sap/ui/core/Fragment", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/mdc/enum/EditMode", "sap/ui/model/json/JSONModel", "../controls/Any", "../converters/MetaModelConverter", "../templating/FieldControlHelper", "../templating/UIFormatters"], function (Log, CommonUtils, FELibrary, DataModelPathHelper, PropertyHelper, FieldTemplating, Button, Dialog, MessageToast, Core, Fragment, XMLPreprocessor, XMLTemplateProcessor, EditMode, JSONModel, Any, MetaModelConverter, FieldControlHelper, UIFormatters) {
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/BindingToolkit", "sap/fe/core/library", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/templating/PropertyHelper", "sap/fe/macros/field/FieldTemplating", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageToast", "sap/ui/core/Core", "sap/ui/core/Fragment", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/mdc/enum/EditMode", "sap/ui/model/json/JSONModel", "../controls/Any", "../converters/MetaModelConverter", "../templating/FieldControlHelper", "../templating/UIFormatters"], function (Log, CommonUtils, BindingToolkit, FELibrary, DataModelPathHelper, PropertyHelper, FieldTemplating, Button, Dialog, MessageToast, Core, Fragment, XMLPreprocessor, XMLTemplateProcessor, EditMode, JSONModel, Any, MetaModelConverter, FieldControlHelper, UIFormatters) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var isCollectionField = UIFormatters.isCollectionField;
|
|
@@ -14,7 +14,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
14
14
|
var setEditStyleProperties = FieldTemplating.setEditStyleProperties;
|
|
15
15
|
var getTextBinding = FieldTemplating.getTextBinding;
|
|
16
16
|
var hasValueHelpWithFixedValues = PropertyHelper.hasValueHelpWithFixedValues;
|
|
17
|
+
var hasValueHelp = PropertyHelper.hasValueHelp;
|
|
18
|
+
var hasUnit = PropertyHelper.hasUnit;
|
|
19
|
+
var hasCurrency = PropertyHelper.hasCurrency;
|
|
20
|
+
var getAssociatedUnitPropertyPath = PropertyHelper.getAssociatedUnitPropertyPath;
|
|
21
|
+
var getAssociatedUnitProperty = PropertyHelper.getAssociatedUnitProperty;
|
|
17
22
|
var enhanceDataModelPath = DataModelPathHelper.enhanceDataModelPath;
|
|
23
|
+
var pathInModel = BindingToolkit.pathInModel;
|
|
24
|
+
var or = BindingToolkit.or;
|
|
25
|
+
var not = BindingToolkit.not;
|
|
26
|
+
var ifElse = BindingToolkit.ifElse;
|
|
27
|
+
var constant = BindingToolkit.constant;
|
|
28
|
+
var compileExpression = BindingToolkit.compileExpression;
|
|
18
29
|
|
|
19
30
|
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
20
31
|
|
|
@@ -27,9 +38,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
27
38
|
* Initializes the value at final or deepest level path with a blank array.
|
|
28
39
|
* Return an empty array pointing to the final or deepest level path.
|
|
29
40
|
*
|
|
30
|
-
* @param
|
|
31
|
-
* @param
|
|
32
|
-
* @returns
|
|
41
|
+
* @param sPath Property path
|
|
42
|
+
* @param aValues Array instance where the default data needs to be added
|
|
43
|
+
* @returns The final path
|
|
33
44
|
*/
|
|
34
45
|
initLastLevelOfPropertyPath: function (sPath, aValues) {
|
|
35
46
|
var aFinalPath;
|
|
@@ -43,7 +54,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
43
54
|
sFullPath = sFullPath + sPropertyPath;
|
|
44
55
|
index++;
|
|
45
56
|
} else if (!aFinalPath[sPropertyPath]) {
|
|
46
|
-
sFullPath = sFullPath
|
|
57
|
+
sFullPath = "".concat(sFullPath, "/").concat(sPropertyPath);
|
|
47
58
|
|
|
48
59
|
if (sFullPath !== sPath) {
|
|
49
60
|
aFinalPath[sPropertyPath] = {};
|
|
@@ -59,10 +70,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
59
70
|
/**
|
|
60
71
|
* Method to get unique values for given array values.
|
|
61
72
|
*
|
|
62
|
-
* @param
|
|
63
|
-
* @param
|
|
64
|
-
* @param
|
|
65
|
-
* @returns
|
|
73
|
+
* @param sValue Property value
|
|
74
|
+
* @param index Index of the property value
|
|
75
|
+
* @param self Instance of the array
|
|
76
|
+
* @returns The unique value
|
|
66
77
|
*/
|
|
67
78
|
getUniqueValues: function (sValue, index, self) {
|
|
68
79
|
if (sValue != undefined && sValue != null) {
|
|
@@ -74,9 +85,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
74
85
|
* Gets the property value for a multi-level path (for example: _Materials/Material_Details gets the value of Material_Details under _Materials Object).
|
|
75
86
|
* Returns the propertyValue, which can be of any type (string, number, etc..).
|
|
76
87
|
*
|
|
77
|
-
* @param
|
|
78
|
-
* @param
|
|
79
|
-
* @returns
|
|
88
|
+
* @param sDataPropertyPath Property path
|
|
89
|
+
* @param oValues Object of property values
|
|
90
|
+
* @returns The property value
|
|
80
91
|
*/
|
|
81
92
|
getValueForMultiLevelPath: function (sDataPropertyPath, oValues) {
|
|
82
93
|
if (sDataPropertyPath && sDataPropertyPath.indexOf("/") > 0) {
|
|
@@ -96,9 +107,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
96
107
|
* => If propertyValue for all selected contexts is empty, then < Leave Blank > is preselected.
|
|
97
108
|
*
|
|
98
109
|
*
|
|
99
|
-
* @param
|
|
100
|
-
* @param
|
|
101
|
-
* @returns
|
|
110
|
+
* @param aContexts Contexts for mass edit
|
|
111
|
+
* @param sDataPropertyPath Data property path
|
|
112
|
+
* @returns The key path
|
|
102
113
|
*/
|
|
103
114
|
getDefaultSelectionPathComboBox: function (aContexts, sDataPropertyPath) {
|
|
104
115
|
if (sDataPropertyPath && aContexts.length > 0) {
|
|
@@ -115,11 +126,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
115
126
|
var aUniquePropertyValues = aPropertyValues.filter(MassEditHelper.getUniqueValues);
|
|
116
127
|
|
|
117
128
|
if (aUniquePropertyValues.length > 1) {
|
|
118
|
-
return "Default/"
|
|
129
|
+
return "Default/".concat(sDataPropertyPath);
|
|
119
130
|
} else if (aUniquePropertyValues.length === 0) {
|
|
120
|
-
return "Empty/"
|
|
131
|
+
return "Empty/".concat(sDataPropertyPath);
|
|
121
132
|
} else if (aUniquePropertyValues.length === 1) {
|
|
122
|
-
return sDataPropertyPath
|
|
133
|
+
return "".concat(sDataPropertyPath, "/").concat(aUniquePropertyValues[0]);
|
|
123
134
|
}
|
|
124
135
|
}
|
|
125
136
|
},
|
|
@@ -127,9 +138,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
127
138
|
/**
|
|
128
139
|
* Checks hidden annotation value [both static and path based] for table's selected context.
|
|
129
140
|
*
|
|
130
|
-
* @param
|
|
131
|
-
* @param
|
|
132
|
-
* @returns
|
|
141
|
+
* @param hiddenValue Hidden annotation value / path for field
|
|
142
|
+
* @param aContexts Contexts for mass edit
|
|
143
|
+
* @returns The hidden annotation value
|
|
133
144
|
*/
|
|
134
145
|
getHiddenValueForContexts: function (hiddenValue, aContexts) {
|
|
135
146
|
if (hiddenValue && hiddenValue.$Path) {
|
|
@@ -159,10 +170,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
159
170
|
/**
|
|
160
171
|
* Get text path for the mass edit field.
|
|
161
172
|
*
|
|
162
|
-
* @param
|
|
163
|
-
* @param
|
|
164
|
-
* @param
|
|
165
|
-
* @returns
|
|
173
|
+
* @param property Property path
|
|
174
|
+
* @param textBinding Text Binding Info
|
|
175
|
+
* @param displayMode Display mode
|
|
176
|
+
* @returns Text Property Path if it exists
|
|
166
177
|
*/
|
|
167
178
|
getTextPath: function (property, textBinding, displayMode) {
|
|
168
179
|
var descriptionPath;
|
|
@@ -185,16 +196,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
185
196
|
/**
|
|
186
197
|
* Initializes a JSON Model for properties of dialog fields [label, visiblity, dataproperty, etc.].
|
|
187
198
|
*
|
|
188
|
-
* @param
|
|
189
|
-
* @param
|
|
190
|
-
* @param
|
|
191
|
-
* @returns
|
|
199
|
+
* @param oTable Instance of Table
|
|
200
|
+
* @param aContexts Contexts for mass edit
|
|
201
|
+
* @param aDataArray Array containing data related to the dialog used by both the static and the runtime model
|
|
202
|
+
* @returns The model
|
|
192
203
|
*/
|
|
193
204
|
prepareDataForDialog: function (oTable, aContexts, aDataArray) {
|
|
194
205
|
var oMetaModel = oTable && oTable.getModel().getMetaModel(),
|
|
195
206
|
sCurrentEntitySetName = oTable.data("metaPath"),
|
|
196
207
|
aTableFields = MassEditHelper.getTableFields(oTable),
|
|
197
|
-
oEntityTypeContext = oMetaModel.getContext(sCurrentEntitySetName
|
|
208
|
+
oEntityTypeContext = oMetaModel.getContext("".concat(sCurrentEntitySetName, "/@")),
|
|
198
209
|
oEntitySetContext = oMetaModel.getContext(sCurrentEntitySetName),
|
|
199
210
|
oDataModelObjectPath = getInvolvedDataModelObjects(oEntityTypeContext);
|
|
200
211
|
var oDataFieldModel = new JSONModel();
|
|
@@ -210,11 +221,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
210
221
|
if (sDataPropertyPath) {
|
|
211
222
|
var _oDataFieldConverted$, _oDataFieldConverted$2;
|
|
212
223
|
|
|
213
|
-
var oPropertyInfo = sDataPropertyPath && oMetaModel.getObject(sCurrentEntitySetName
|
|
214
|
-
bValueHelpEnabled = sDataPropertyPath && oMetaModel.getObject(sCurrentEntitySetName + "/" + sDataPropertyPath + "@") && oMetaModel.getObject(sCurrentEntitySetName + "/" + sDataPropertyPath + "@")["@com.sap.vocabularies.Common.v1.ValueList"];
|
|
215
|
-
sUnitPropertyPath = oPropertyInfo && oPropertyInfo["@Org.OData.Measures.V1.Unit"] && oPropertyInfo["@Org.OData.Measures.V1.Unit"].$Path || oPropertyInfo && oPropertyInfo["@Org.OData.Measures.V1.ISOCurrency"] && oPropertyInfo["@Org.OData.Measures.V1.ISOCurrency"].$Path;
|
|
224
|
+
var oPropertyInfo = sDataPropertyPath && oMetaModel.getObject("".concat(sCurrentEntitySetName, "/").concat(sDataPropertyPath, "@"));
|
|
216
225
|
sLabelText = oColumnInfo.label || oPropertyInfo && oPropertyInfo["@com.sap.vocabularies.Common.v1.Label"] || oColumnInfo.dataProperty;
|
|
217
|
-
bValueHelpEnabledForUnit = sUnitPropertyPath && oMetaModel.getObject(sCurrentEntitySetName + "/" + sUnitPropertyPath + "@") && oMetaModel.getObject(sCurrentEntitySetName + "/" + sUnitPropertyPath + "@")["@com.sap.vocabularies.Common.v1.ValueList"];
|
|
218
226
|
|
|
219
227
|
if (oDataModelObjectPath) {
|
|
220
228
|
oDataModelObjectPath.targetObject = oDataModelObjectPath.targetEntityType.entityProperties.filter(function (oProperty) {
|
|
@@ -226,7 +234,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
226
234
|
oTextBinding = getTextBinding(oDataModelObjectPath, {}, true) || {};
|
|
227
235
|
var oFieldContext = oMetaModel.getContext(oColumnInfo.annotationPath),
|
|
228
236
|
oDataFieldConverted = convertMetaModelContext(oFieldContext),
|
|
229
|
-
oPropertyContext = oMetaModel.getContext(sCurrentEntitySetName
|
|
237
|
+
oPropertyContext = oMetaModel.getContext("".concat(sCurrentEntitySetName, "/").concat(sDataPropertyPath, "@")),
|
|
230
238
|
oInterface = oPropertyContext && oPropertyContext.getInterface();
|
|
231
239
|
var oDataModelPath = getInvolvedDataModelObjects(oFieldContext, oEntitySetContext);
|
|
232
240
|
|
|
@@ -241,7 +249,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
241
249
|
return oInterface.getModel();
|
|
242
250
|
},
|
|
243
251
|
getPath: function () {
|
|
244
|
-
return sCurrentEntitySetName
|
|
252
|
+
return "".concat(sCurrentEntitySetName, "/").concat(sDataPropertyPath);
|
|
245
253
|
}
|
|
246
254
|
};
|
|
247
255
|
oPropertyInfo = oDataFieldConverted._type === "Property" ? oDataFieldConverted : oDataFieldConverted && oDataFieldConverted.Value && oDataFieldConverted.Value.$target || oDataFieldConverted && oDataFieldConverted.Target && oDataFieldConverted.Target.$target; // Datafield is not included in the FieldControl calculation, needs to be implemented
|
|
@@ -252,11 +260,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
252
260
|
|
|
253
261
|
if (isImage || bHiddenField || chartProperty || isAction || isFieldGrp) {
|
|
254
262
|
return;
|
|
255
|
-
} //
|
|
263
|
+
} // ValueHelp properties
|
|
256
264
|
|
|
257
265
|
|
|
266
|
+
bValueHelpEnabled = hasValueHelp(oPropertyInfo);
|
|
267
|
+
sUnitPropertyPath = (hasCurrency(oPropertyInfo) || hasUnit(oPropertyInfo)) && getAssociatedUnitPropertyPath(oPropertyInfo) || "";
|
|
268
|
+
var unitPropertyInfo = sUnitPropertyPath && getAssociatedUnitProperty(oPropertyInfo);
|
|
269
|
+
bValueHelpEnabledForUnit = unitPropertyInfo && hasValueHelp(unitPropertyInfo); // EditMode and InputType
|
|
270
|
+
|
|
258
271
|
var propertyForFieldControl = oPropertyInfo && oPropertyInfo.Value ? oPropertyInfo.Value : oPropertyInfo;
|
|
259
|
-
var expBinding = getEditMode(propertyForFieldControl, oDataModelPath, false, false, oDataFieldConverted, true);
|
|
272
|
+
var expBinding = getEditMode(propertyForFieldControl, oDataModelPath, false, false, oDataFieldConverted, constant(true));
|
|
260
273
|
var editModeValues = Object.keys(EditMode);
|
|
261
274
|
var editModeIsStatic = !!expBinding && editModeValues.includes(expBinding);
|
|
262
275
|
var editable = !!expBinding && (editModeIsStatic && expBinding === EditMode.Editable || !editModeIsStatic);
|
|
@@ -274,10 +287,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
274
287
|
"label": sLabelText,
|
|
275
288
|
"dataProperty": sDataPropertyPath,
|
|
276
289
|
"isValueHelpEnabled": bValueHelpEnabled ? bValueHelpEnabled : false,
|
|
277
|
-
"unitProperty": sUnitPropertyPath ? sUnitPropertyPath : false,
|
|
278
|
-
"isValueHelpEnabledForUnit": bValueHelpEnabledForUnit ? bValueHelpEnabledForUnit : false,
|
|
279
|
-
"propertyPathForValueHelp": sCurrentEntitySetName
|
|
280
|
-
"propertyPathForValueHelpUnit":
|
|
290
|
+
"unitProperty": sUnitPropertyPath && !sDataPropertyPath.includes("/") ? sUnitPropertyPath : false,
|
|
291
|
+
"isValueHelpEnabledForUnit": bValueHelpEnabledForUnit && !sUnitPropertyPath.includes("/") ? bValueHelpEnabledForUnit : false,
|
|
292
|
+
"propertyPathForValueHelp": "".concat(sCurrentEntitySetName, "/").concat(sDataPropertyPath),
|
|
293
|
+
"propertyPathForValueHelpUnit": sUnitPropertyPath && "".concat(sCurrentEntitySetName, "/").concat(sUnitPropertyPath),
|
|
281
294
|
"isFieldRequired": getRequiredExpression(oPropertyInfo, oDataFieldConverted, true),
|
|
282
295
|
"defaultSelectionPath": sDataPropertyPath ? MassEditHelper.getDefaultSelectionPathComboBox(aContexts, sDataPropertyPath) : false,
|
|
283
296
|
"defaultSelectionUnitPath": sUnitPropertyPath ? MassEditHelper.getDefaultSelectionPathComboBox(aContexts, sUnitPropertyPath) : false,
|
|
@@ -323,56 +336,54 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
323
336
|
"massEditTitle": oResourceBundle.getText("C_MASS_EDIT_DIALOG_TITLE", iSelectedContexts.toString()),
|
|
324
337
|
"applyButtonText": bDisplayMode ? oResourceBundle.getText("C_MASS_EDIT_SAVE_BUTTON_TEXT") : oResourceBundle.getText("C_MASS_EDIT_APPLY_BUTTON_TEXT"),
|
|
325
338
|
"useValueHelpValue": "< Use Value Help >",
|
|
326
|
-
"cancelButtonText": oResourceBundle.getText("C_MASS_EDIT_CANCEL_BUTTON_TEXT")
|
|
339
|
+
"cancelButtonText": oResourceBundle.getText("C_MASS_EDIT_CANCEL_BUTTON_TEXT"),
|
|
340
|
+
"noFields": oResourceBundle.getText("C_MASS_EDIT_NO_EDITABLE_FIELDS"),
|
|
341
|
+
"okButtonText": oResourceBundle.getText("C_COMMON_DIALOG_OK")
|
|
327
342
|
};
|
|
328
343
|
},
|
|
329
344
|
|
|
330
345
|
/**
|
|
331
346
|
* Adds a suffix to the 'keep existing' property of the comboBox.
|
|
332
347
|
*
|
|
333
|
-
* @param
|
|
334
|
-
* @returns
|
|
348
|
+
* @param sInputType InputType of the field
|
|
349
|
+
* @returns The modified string
|
|
335
350
|
*/
|
|
336
|
-
getSuffixForKeepExisiting: function (sInputType) {
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
return sResult;
|
|
354
|
-
},
|
|
351
|
+
// getSuffixForKeepExisiting: function (sInputType: string) {
|
|
352
|
+
// let sResult = "Values";
|
|
353
|
+
// switch (sInputType) {
|
|
354
|
+
// //TODO - Add for other control types as well (Radio Button, Email, Input, MDC Fields, Image etc.)
|
|
355
|
+
// case "DatePicker":
|
|
356
|
+
// sResult = "Dates";
|
|
357
|
+
// break;
|
|
358
|
+
// case "CheckBox":
|
|
359
|
+
// sResult = "Settings";
|
|
360
|
+
// break;
|
|
361
|
+
// default:
|
|
362
|
+
// sResult = "Values";
|
|
363
|
+
// }
|
|
364
|
+
// return sResult;
|
|
365
|
+
// },
|
|
355
366
|
|
|
356
367
|
/**
|
|
357
368
|
* Adds default values to the model [Keep Existing Values, Leave Blank].
|
|
358
369
|
*
|
|
359
|
-
* @param
|
|
360
|
-
* @param
|
|
361
|
-
* @param
|
|
362
|
-
* @param
|
|
363
|
-
* @param {boolean} bUOMField
|
|
370
|
+
* @param aValues Array instance where the default data needs to be added
|
|
371
|
+
* @param oDefaultValues Default values from Application Manifest
|
|
372
|
+
* @param oPropertyInfo Property information
|
|
373
|
+
* @param bUOMField
|
|
364
374
|
*/
|
|
365
|
-
setDefaultValuesToDialog: function (aValues,
|
|
375
|
+
setDefaultValuesToDialog: function (aValues, oDefaultValues, oPropertyInfo, bUOMField) {
|
|
366
376
|
var sPropertyPath = bUOMField ? oPropertyInfo.unitProperty : oPropertyInfo.dataProperty,
|
|
367
377
|
sInputType = oPropertyInfo.inputType,
|
|
368
|
-
bPropertyRequired = oPropertyInfo.isFieldRequired;
|
|
369
|
-
var sSuffixForKeepExisting = MassEditHelper.getSuffixForKeepExisiting(sInputType);
|
|
370
|
-
aValues.defaultOptions = aValues.defaultOptions || []; //TODO - Add <<Use Value Help or control implmentation>> and related key by checking if value help is enabled for property or Unit.
|
|
371
|
-
//TODO - Add option Apply to Empty Fields only for Both Value Help and controls.
|
|
378
|
+
bPropertyRequired = oPropertyInfo.isFieldRequired; // const sSuffixForKeepExisting = MassEditHelper.getSuffixForKeepExisiting(sInputType);
|
|
372
379
|
|
|
373
|
-
var
|
|
374
|
-
|
|
375
|
-
|
|
380
|
+
var sSuffixForKeepExisting = "Values";
|
|
381
|
+
aValues.defaultOptions = aValues.defaultOptions || [];
|
|
382
|
+
var selectOptionsExist = aValues.selectOptions && aValues.selectOptions.length > 0;
|
|
383
|
+
var keepEntry = {
|
|
384
|
+
text: "".concat(oDefaultValues.keepExistingPrefix, " ").concat(sSuffixForKeepExisting, " >"),
|
|
385
|
+
key: "Default/".concat(sPropertyPath)
|
|
386
|
+
};
|
|
376
387
|
|
|
377
388
|
if (sInputType === "CheckBox") {
|
|
378
389
|
var falseEntry = {
|
|
@@ -393,51 +404,49 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
393
404
|
aValues.defaultOptions.unshift(falseEntry);
|
|
394
405
|
aValues.unshift(truthyEntry);
|
|
395
406
|
aValues.defaultOptions.unshift(truthyEntry);
|
|
396
|
-
|
|
407
|
+
aValues.unshift(keepEntry);
|
|
408
|
+
aValues.defaultOptions.unshift(keepEntry);
|
|
409
|
+
} else {
|
|
410
|
+
if (oPropertyInfo.isValueHelpEnabled || oPropertyInfo.isValueHelpEnabledForUnit && bUOMField) {
|
|
411
|
+
var vhdEntry = {
|
|
412
|
+
text: oDefaultValues.useValueHelpValue,
|
|
413
|
+
key: "UseValueHelpValue/".concat(sPropertyPath)
|
|
414
|
+
};
|
|
415
|
+
aValues.unshift(vhdEntry);
|
|
416
|
+
aValues.defaultOptions.unshift(vhdEntry);
|
|
417
|
+
}
|
|
397
418
|
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
419
|
+
if (selectOptionsExist) {
|
|
420
|
+
if (bPropertyRequired !== "true" && !bUOMField) {
|
|
421
|
+
var clearEntry = {
|
|
422
|
+
text: oDefaultValues.clearFieldValue,
|
|
423
|
+
key: "ClearFieldValue/".concat(sPropertyPath)
|
|
424
|
+
};
|
|
425
|
+
aValues.unshift(clearEntry);
|
|
426
|
+
aValues.defaultOptions.unshift(clearEntry);
|
|
427
|
+
}
|
|
406
428
|
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
429
|
+
aValues.unshift(keepEntry);
|
|
430
|
+
aValues.defaultOptions.unshift(keepEntry);
|
|
431
|
+
} else {
|
|
432
|
+
var emptyEntry = {
|
|
433
|
+
text: oDefaultValues.leaveBlankValue,
|
|
434
|
+
key: "Default/".concat(sPropertyPath)
|
|
412
435
|
};
|
|
413
|
-
aValues.unshift(
|
|
414
|
-
aValues.defaultOptions.unshift(
|
|
436
|
+
aValues.unshift(emptyEntry);
|
|
437
|
+
aValues.defaultOptions.unshift(emptyEntry);
|
|
415
438
|
}
|
|
416
|
-
} else {
|
|
417
|
-
var emptyEntry = {
|
|
418
|
-
text: oDefaultValues.leaveBlankValue,
|
|
419
|
-
key: "Empty/" + sPropertyPath
|
|
420
|
-
};
|
|
421
|
-
aValues.unshift(emptyEntry);
|
|
422
|
-
aValues.defaultOptions.unshift(emptyEntry);
|
|
423
439
|
}
|
|
424
|
-
|
|
425
|
-
var keepEntry = {
|
|
426
|
-
text: oDefaultValues.keepExistingPrefix + " " + sSuffixForKeepExisting + " >",
|
|
427
|
-
key: "Default/" + sPropertyPath
|
|
428
|
-
};
|
|
429
|
-
aValues.unshift(keepEntry);
|
|
430
|
-
aValues.defaultOptions.unshift(keepEntry);
|
|
431
440
|
},
|
|
432
441
|
|
|
433
442
|
/**
|
|
434
443
|
* Get text arrangement info for a context property.
|
|
435
444
|
*
|
|
436
|
-
* @param
|
|
437
|
-
* @param
|
|
438
|
-
* @param
|
|
439
|
-
* @param
|
|
440
|
-
* @returns
|
|
445
|
+
* @param property Property Path
|
|
446
|
+
* @param descriptionPath Path to text association of the property
|
|
447
|
+
* @param displayMode Display mode of the property and text association
|
|
448
|
+
* @param selectedContext Context to find the full text
|
|
449
|
+
* @returns The text arrangement
|
|
441
450
|
*/
|
|
442
451
|
getTextArrangementInfo: function (property, descriptionPath, displayMode, selectedContext) {
|
|
443
452
|
var value = selectedContext.getObject(property),
|
|
@@ -447,29 +456,29 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
447
456
|
if (descriptionPath && property) {
|
|
448
457
|
switch (displayMode) {
|
|
449
458
|
case "Description":
|
|
450
|
-
descriptionValue = selectedContext.getObject(descriptionPath);
|
|
459
|
+
descriptionValue = selectedContext.getObject(descriptionPath) || "";
|
|
451
460
|
fullText = descriptionValue;
|
|
452
461
|
break;
|
|
453
462
|
|
|
454
463
|
case "Value":
|
|
455
|
-
value = selectedContext.getObject(property);
|
|
464
|
+
value = selectedContext.getObject(property) || "";
|
|
456
465
|
fullText = value;
|
|
457
466
|
break;
|
|
458
467
|
|
|
459
468
|
case "ValueDescription":
|
|
460
|
-
value = selectedContext.getObject(property);
|
|
461
|
-
descriptionValue = selectedContext.getObject(descriptionPath);
|
|
462
|
-
fullText =
|
|
469
|
+
value = selectedContext.getObject(property) || "";
|
|
470
|
+
descriptionValue = selectedContext.getObject(descriptionPath) || "";
|
|
471
|
+
fullText = descriptionValue ? "".concat(value, " (").concat(descriptionValue, ")") : value;
|
|
463
472
|
break;
|
|
464
473
|
|
|
465
474
|
case "DescriptionValue":
|
|
466
|
-
value = selectedContext.getObject(property);
|
|
467
|
-
descriptionValue = selectedContext.getObject(descriptionPath);
|
|
468
|
-
fullText = descriptionValue
|
|
475
|
+
value = selectedContext.getObject(property) || "";
|
|
476
|
+
descriptionValue = selectedContext.getObject(descriptionPath) || "";
|
|
477
|
+
fullText = descriptionValue ? "".concat(descriptionValue, " (").concat(value, ")") : value;
|
|
469
478
|
break;
|
|
470
479
|
|
|
471
480
|
default:
|
|
472
|
-
Log.info("Display Property not applicable: "
|
|
481
|
+
Log.info("Display Property not applicable: ".concat(property));
|
|
473
482
|
break;
|
|
474
483
|
}
|
|
475
484
|
}
|
|
@@ -487,8 +496,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
487
496
|
/**
|
|
488
497
|
* Return the visibility valuue for the ManagedObject Any.
|
|
489
498
|
*
|
|
490
|
-
* @param
|
|
491
|
-
* @returns
|
|
499
|
+
* @param any The ManagedObject Any to be used to calculate the visible value of the binding.
|
|
500
|
+
* @returns Returns true if the mass edit field is editable.
|
|
492
501
|
*/
|
|
493
502
|
isEditable: function (any) {
|
|
494
503
|
var binding = any.getBinding("any");
|
|
@@ -499,25 +508,25 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
499
508
|
/**
|
|
500
509
|
* Calculate and update the visibility of mass edit field on change of the ManagedObject Any binding.
|
|
501
510
|
*
|
|
502
|
-
* @param
|
|
503
|
-
* @param
|
|
511
|
+
* @param oDialogDataModel Model to be used runtime.
|
|
512
|
+
* @param dataProperty Field name.
|
|
504
513
|
*/
|
|
505
514
|
onContextEditableChange: function (oDialogDataModel, dataProperty) {
|
|
506
|
-
var objectsForVisibility = oDialogDataModel.getProperty("/values/"
|
|
515
|
+
var objectsForVisibility = oDialogDataModel.getProperty("/values/".concat(dataProperty, "/objectsForVisibility")) || [];
|
|
507
516
|
var editable = objectsForVisibility.some(MassEditHelper.isEditable);
|
|
508
517
|
|
|
509
518
|
if (editable) {
|
|
510
|
-
oDialogDataModel.setProperty("/values/"
|
|
519
|
+
oDialogDataModel.setProperty("/values/".concat(dataProperty, "/visible"), editable);
|
|
511
520
|
}
|
|
512
521
|
},
|
|
513
522
|
|
|
514
523
|
/**
|
|
515
524
|
* Update Managed Object Any for visibility of the mass edit fields.
|
|
516
525
|
*
|
|
517
|
-
* @param
|
|
518
|
-
* @param
|
|
519
|
-
* @param
|
|
520
|
-
* @param
|
|
526
|
+
* @param mOToUse The ManagedObject Any to be used to calculate the visible value of the binding.
|
|
527
|
+
* @param oDialogDataModel Model to be used runtime.
|
|
528
|
+
* @param dataProperty Field name.
|
|
529
|
+
* @param values Values of the field.
|
|
521
530
|
*/
|
|
522
531
|
updateOnContextChange: function (mOToUse, oDialogDataModel, dataProperty, values) {
|
|
523
532
|
var binding = mOToUse.getBinding("any");
|
|
@@ -529,9 +538,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
529
538
|
/**
|
|
530
539
|
* Get bound object to calculate the visibility of contexts.
|
|
531
540
|
*
|
|
532
|
-
* @param
|
|
533
|
-
* @param
|
|
534
|
-
* @returns
|
|
541
|
+
* @param expBinding Binding String object.
|
|
542
|
+
* @param context Context the binding value.
|
|
543
|
+
* @returns The ManagedObject Any to be used to calculate the visible value of the binding.
|
|
535
544
|
*/
|
|
536
545
|
getBoundObject: function (expBinding, context) {
|
|
537
546
|
var mOToUse = new Any({
|
|
@@ -546,12 +555,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
546
555
|
/**
|
|
547
556
|
* Get the visibility of the field.
|
|
548
557
|
*
|
|
549
|
-
* @param
|
|
550
|
-
* @param
|
|
551
|
-
* @param
|
|
552
|
-
* @param
|
|
553
|
-
* @param
|
|
554
|
-
* @returns
|
|
558
|
+
* @param expBinding Binding String object.
|
|
559
|
+
* @param oDialogDataModel Model to be used runtime.
|
|
560
|
+
* @param dataProperty Field name.
|
|
561
|
+
* @param values Values of the field.
|
|
562
|
+
* @param context Context the binding value.
|
|
563
|
+
* @returns Returns true if the mass edit field is editable.
|
|
555
564
|
*/
|
|
556
565
|
getFieldVisiblity: function (expBinding, oDialogDataModel, dataProperty, values, context) {
|
|
557
566
|
var mOToUse = MassEditHelper.getBoundObject(expBinding, context);
|
|
@@ -569,11 +578,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
569
578
|
* => The model consists of values shown in the comboBox of the dialog (Leave Blank, Keep Existing Values, or any property value for the selected context, etc.)
|
|
570
579
|
* => The model will capture runtime changes in the results property (the value entered in the comboBox).
|
|
571
580
|
*
|
|
572
|
-
* @param
|
|
573
|
-
* @param
|
|
574
|
-
* @param
|
|
575
|
-
* @param
|
|
576
|
-
* @returns
|
|
581
|
+
* @param aContexts Contexts for mass edit
|
|
582
|
+
* @param aDataArray Array containing data related to the dialog used by both the static and the runtime model
|
|
583
|
+
* @param oDefaultValues Default values from i18n
|
|
584
|
+
* @param dialogContext Transient context for mass edit dialog.
|
|
585
|
+
* @returns The runtime model
|
|
577
586
|
*/
|
|
578
587
|
setRuntimeModelOnDialog: function (aContexts, aDataArray, oDefaultValues, dialogContext) {
|
|
579
588
|
var aValues = [];
|
|
@@ -585,21 +594,22 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
585
594
|
"unitData": aUnitData,
|
|
586
595
|
"results": aResults,
|
|
587
596
|
"readablePropertyData": aReadOnlyFieldInfo,
|
|
588
|
-
"selectedKey": undefined
|
|
597
|
+
"selectedKey": undefined,
|
|
598
|
+
"noFields": oDefaultValues.noFields
|
|
589
599
|
};
|
|
590
600
|
var oDialogDataModel = new JSONModel(oData);
|
|
591
|
-
aDataArray.forEach(function (
|
|
601
|
+
aDataArray.forEach(function (oInData) {
|
|
592
602
|
var oTextInfo;
|
|
593
603
|
var sPropertyKey;
|
|
594
604
|
var sUnitPropertyName;
|
|
595
605
|
var oDistinctValueMap = {};
|
|
596
606
|
var oDistinctUnitMap = {};
|
|
597
607
|
|
|
598
|
-
if (
|
|
599
|
-
var aFinalPath = MassEditHelper.initLastLevelOfPropertyPath(
|
|
608
|
+
if (oInData.dataProperty && oInData.dataProperty.indexOf("/") > -1) {
|
|
609
|
+
var aFinalPath = MassEditHelper.initLastLevelOfPropertyPath(oInData.dataProperty, aValues
|
|
600
610
|
/*, dialogContext */
|
|
601
611
|
);
|
|
602
|
-
var aPropertyPaths =
|
|
612
|
+
var aPropertyPaths = oInData.dataProperty.split("/");
|
|
603
613
|
|
|
604
614
|
var _iterator = _createForOfIteratorHelper(aContexts),
|
|
605
615
|
_step;
|
|
@@ -607,11 +617,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
607
617
|
try {
|
|
608
618
|
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
609
619
|
var context = _step.value;
|
|
610
|
-
var sMultiLevelPathValue = context.getObject(
|
|
611
|
-
sPropertyKey =
|
|
620
|
+
var sMultiLevelPathValue = context.getObject(oInData.dataProperty);
|
|
621
|
+
sPropertyKey = "".concat(oInData.dataProperty, "/").concat(sMultiLevelPathValue);
|
|
612
622
|
|
|
613
623
|
if (!oDistinctValueMap[sPropertyKey] && aFinalPath[aPropertyPaths[aPropertyPaths.length - 1]]) {
|
|
614
|
-
oTextInfo = MassEditHelper.getTextArrangementInfo(
|
|
624
|
+
oTextInfo = MassEditHelper.getTextArrangementInfo(oInData.dataProperty, oInData.descriptionPath, oInData.display, context);
|
|
615
625
|
aFinalPath[aPropertyPaths[aPropertyPaths.length - 1]].push({
|
|
616
626
|
"text": oTextInfo && oTextInfo.fullText || sMultiLevelPathValue,
|
|
617
627
|
"key": sPropertyKey,
|
|
@@ -630,17 +640,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
630
640
|
}
|
|
631
641
|
|
|
632
642
|
aFinalPath[aPropertyPaths[aPropertyPaths.length - 1]].textInfo = {
|
|
633
|
-
descriptionPath:
|
|
634
|
-
valuePath:
|
|
635
|
-
displayMode:
|
|
643
|
+
descriptionPath: oInData.descriptionPath,
|
|
644
|
+
valuePath: oInData.dataProperty,
|
|
645
|
+
displayMode: oInData.display
|
|
636
646
|
};
|
|
637
647
|
} else {
|
|
638
|
-
aValues[
|
|
639
|
-
aValues[
|
|
648
|
+
aValues[oInData.dataProperty] = aValues[oInData.dataProperty] || [];
|
|
649
|
+
aValues[oInData.dataProperty]["selectOptions"] = aValues[oInData.dataProperty]["selectOptions"] || [];
|
|
640
650
|
|
|
641
|
-
if (
|
|
642
|
-
aUnitData[
|
|
643
|
-
aUnitData[
|
|
651
|
+
if (oInData.unitProperty) {
|
|
652
|
+
aUnitData[oInData.unitProperty] = aUnitData[oInData.unitProperty] || [];
|
|
653
|
+
aUnitData[oInData.unitProperty]["selectOptions"] = aUnitData[oInData.unitProperty]["selectOptions"] || [];
|
|
644
654
|
}
|
|
645
655
|
|
|
646
656
|
var _iterator2 = _createForOfIteratorHelper(aContexts),
|
|
@@ -652,39 +662,39 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
652
662
|
|
|
653
663
|
var oDataObject = _context.getObject();
|
|
654
664
|
|
|
655
|
-
sPropertyKey =
|
|
665
|
+
sPropertyKey = "".concat(oInData.dataProperty, "/").concat(oDataObject[oInData.dataProperty]);
|
|
656
666
|
|
|
657
|
-
if (
|
|
658
|
-
if (
|
|
659
|
-
oTextInfo = MassEditHelper.getTextArrangementInfo(
|
|
667
|
+
if (oInData.dataProperty && oDataObject[oInData.dataProperty] && !oDistinctValueMap[sPropertyKey]) {
|
|
668
|
+
if (oInData.inputType != "CheckBox") {
|
|
669
|
+
oTextInfo = MassEditHelper.getTextArrangementInfo(oInData.dataProperty, oInData.descriptionPath, oInData.display, _context);
|
|
660
670
|
var entry = {
|
|
661
|
-
"text": oTextInfo && oTextInfo.fullText || oDataObject[
|
|
671
|
+
"text": oTextInfo && oTextInfo.fullText || oDataObject[oInData.dataProperty],
|
|
662
672
|
"key": sPropertyKey,
|
|
663
673
|
"textInfo": oTextInfo
|
|
664
674
|
};
|
|
665
|
-
aValues[
|
|
666
|
-
aValues[
|
|
675
|
+
aValues[oInData.dataProperty].push(entry);
|
|
676
|
+
aValues[oInData.dataProperty]["selectOptions"].push(entry);
|
|
667
677
|
}
|
|
668
678
|
|
|
669
|
-
oDistinctValueMap[sPropertyKey] = oDataObject[
|
|
679
|
+
oDistinctValueMap[sPropertyKey] = oDataObject[oInData.dataProperty];
|
|
670
680
|
}
|
|
671
681
|
|
|
672
|
-
if (
|
|
673
|
-
sUnitPropertyName =
|
|
682
|
+
if (oInData.unitProperty && oDataObject[oInData.unitProperty]) {
|
|
683
|
+
sUnitPropertyName = "".concat(oInData.unitProperty, "/").concat(oDataObject[oInData.unitProperty]);
|
|
674
684
|
|
|
675
685
|
if (!oDistinctUnitMap[sUnitPropertyName]) {
|
|
676
|
-
if (
|
|
677
|
-
oTextInfo = MassEditHelper.getTextArrangementInfo(
|
|
686
|
+
if (oInData.inputType != "CheckBox") {
|
|
687
|
+
oTextInfo = MassEditHelper.getTextArrangementInfo(oInData.unitProperty, oInData.descriptionPath, oInData.display, _context);
|
|
678
688
|
var unitEntry = {
|
|
679
|
-
"text": oTextInfo && oTextInfo.fullText || oDataObject[
|
|
689
|
+
"text": oTextInfo && oTextInfo.fullText || oDataObject[oInData.unitProperty],
|
|
680
690
|
"key": sUnitPropertyName,
|
|
681
691
|
"textInfo": oTextInfo
|
|
682
692
|
};
|
|
683
|
-
aUnitData[
|
|
684
|
-
aUnitData[
|
|
693
|
+
aUnitData[oInData.unitProperty].push(unitEntry);
|
|
694
|
+
aUnitData[oInData.unitProperty]["selectOptions"].push(unitEntry);
|
|
685
695
|
}
|
|
686
696
|
|
|
687
|
-
oDistinctUnitMap[sUnitPropertyName] = oDataObject[
|
|
697
|
+
oDistinctUnitMap[sUnitPropertyName] = oDataObject[oInData.unitProperty];
|
|
688
698
|
}
|
|
689
699
|
}
|
|
690
700
|
}
|
|
@@ -694,104 +704,104 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
694
704
|
_iterator2.f();
|
|
695
705
|
}
|
|
696
706
|
|
|
697
|
-
aValues[
|
|
698
|
-
descriptionPath:
|
|
699
|
-
valuePath:
|
|
700
|
-
displayMode:
|
|
707
|
+
aValues[oInData.dataProperty].textInfo = {
|
|
708
|
+
descriptionPath: oInData.descriptionPath,
|
|
709
|
+
valuePath: oInData.dataProperty,
|
|
710
|
+
displayMode: oInData.display
|
|
701
711
|
};
|
|
702
|
-
}
|
|
703
712
|
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
713
|
+
if (Object.keys(oDistinctValueMap).length === 1) {
|
|
714
|
+
dialogContext.setProperty(oInData.dataProperty, sPropertyKey && oDistinctValueMap[sPropertyKey]);
|
|
715
|
+
}
|
|
707
716
|
|
|
708
|
-
|
|
709
|
-
|
|
717
|
+
if (Object.keys(oDistinctUnitMap).length === 1) {
|
|
718
|
+
dialogContext.setProperty(oInData.unitProperty, sUnitPropertyName && oDistinctUnitMap[sUnitPropertyName]);
|
|
719
|
+
}
|
|
710
720
|
}
|
|
711
721
|
});
|
|
712
|
-
aDataArray.forEach(function (
|
|
722
|
+
aDataArray.forEach(function (oInData) {
|
|
713
723
|
var values = {};
|
|
714
724
|
|
|
715
|
-
if (
|
|
716
|
-
var sMultiLevelPropPathValue = MassEditHelper.getValueForMultiLevelPath(
|
|
725
|
+
if (oInData.dataProperty.indexOf("/") > -1) {
|
|
726
|
+
var sMultiLevelPropPathValue = MassEditHelper.getValueForMultiLevelPath(oInData.dataProperty, aValues);
|
|
717
727
|
|
|
718
728
|
if (!sMultiLevelPropPathValue) {
|
|
719
729
|
sMultiLevelPropPathValue.push({
|
|
720
730
|
text: oDefaultValues.leaveBlankValue,
|
|
721
|
-
key: "Empty/"
|
|
731
|
+
key: "Empty/".concat(oInData.dataProperty)
|
|
722
732
|
});
|
|
723
733
|
} else {
|
|
724
|
-
MassEditHelper.setDefaultValuesToDialog(sMultiLevelPropPathValue,
|
|
734
|
+
MassEditHelper.setDefaultValuesToDialog(sMultiLevelPropPathValue, oDefaultValues, oInData);
|
|
725
735
|
}
|
|
726
736
|
|
|
727
737
|
values = sMultiLevelPropPathValue;
|
|
728
|
-
} else if (aValues[
|
|
729
|
-
aValues[
|
|
730
|
-
MassEditHelper.setDefaultValuesToDialog(aValues[
|
|
731
|
-
values = aValues[
|
|
738
|
+
} else if (aValues[oInData.dataProperty]) {
|
|
739
|
+
aValues[oInData.dataProperty] = aValues[oInData.dataProperty] || [];
|
|
740
|
+
MassEditHelper.setDefaultValuesToDialog(aValues[oInData.dataProperty], oDefaultValues, oInData);
|
|
741
|
+
values = aValues[oInData.dataProperty];
|
|
732
742
|
}
|
|
733
743
|
|
|
734
|
-
if (aUnitData[
|
|
735
|
-
MassEditHelper.setDefaultValuesToDialog(aUnitData[
|
|
736
|
-
aUnitData[
|
|
737
|
-
aUnitData[
|
|
738
|
-
aUnitData[
|
|
739
|
-
} else if (
|
|
740
|
-
var bClearFieldOrBlankValueExists = aValues[
|
|
744
|
+
if (aUnitData[oInData.unitProperty] && aUnitData[oInData.unitProperty].length) {
|
|
745
|
+
MassEditHelper.setDefaultValuesToDialog(aUnitData[oInData.unitProperty], oDefaultValues, oInData, true);
|
|
746
|
+
aUnitData[oInData.unitProperty].textInfo = {};
|
|
747
|
+
aUnitData[oInData.unitProperty].selectedKey = MassEditHelper.getDefaultSelectionPathComboBox(aContexts, oInData.unitProperty);
|
|
748
|
+
aUnitData[oInData.unitProperty].inputType = oInData.inputType;
|
|
749
|
+
} else if (oInData.dataProperty && aValues[oInData.dataProperty] && !aValues[oInData.dataProperty].length || oInData.unitProperty && aUnitData[oInData.unitProperty] && !aUnitData[oInData.unitProperty].length) {
|
|
750
|
+
var bClearFieldOrBlankValueExists = aValues[oInData.dataProperty] && aValues[oInData.dataProperty].some(function (obj) {
|
|
741
751
|
return obj.text === "< Clear Values >" || obj.text === "< Leave Blank >";
|
|
742
752
|
});
|
|
743
753
|
|
|
744
|
-
if (
|
|
745
|
-
aValues[
|
|
754
|
+
if (oInData.dataProperty && !bClearFieldOrBlankValueExists) {
|
|
755
|
+
aValues[oInData.dataProperty].push({
|
|
746
756
|
text: oDefaultValues.leaveBlankValue,
|
|
747
|
-
key: "Empty/"
|
|
757
|
+
key: "Empty/".concat(oInData.dataProperty)
|
|
748
758
|
});
|
|
749
759
|
}
|
|
750
760
|
|
|
751
|
-
var bClearFieldOrBlankUnitValueExists = aUnitData[
|
|
761
|
+
var bClearFieldOrBlankUnitValueExists = aUnitData[oInData.unitProperty] && aUnitData[oInData.unitProperty].some(function (obj) {
|
|
752
762
|
return obj.text === "< Clear Values >" || obj.text === "< Leave Blank >";
|
|
753
763
|
});
|
|
754
764
|
|
|
755
|
-
if (
|
|
765
|
+
if (oInData.unitProperty) {
|
|
756
766
|
if (!bClearFieldOrBlankUnitValueExists) {
|
|
757
|
-
aUnitData[
|
|
767
|
+
aUnitData[oInData.unitProperty].push({
|
|
758
768
|
text: oDefaultValues.leaveBlankValue,
|
|
759
|
-
key: "Empty/"
|
|
769
|
+
key: "Empty/".concat(oInData.unitProperty)
|
|
760
770
|
});
|
|
761
771
|
}
|
|
762
772
|
|
|
763
|
-
aUnitData[
|
|
764
|
-
aUnitData[
|
|
765
|
-
aUnitData[
|
|
773
|
+
aUnitData[oInData.unitProperty].textInfo = {};
|
|
774
|
+
aUnitData[oInData.unitProperty].selectedKey = MassEditHelper.getDefaultSelectionPathComboBox(aContexts, oInData.unitProperty);
|
|
775
|
+
aUnitData[oInData.unitProperty].inputType = oInData.inputType;
|
|
766
776
|
}
|
|
767
777
|
}
|
|
768
778
|
|
|
769
|
-
if (
|
|
779
|
+
if (oInData.isPropertyReadOnly && typeof oInData.isPropertyReadOnly === "boolean") {
|
|
770
780
|
aReadOnlyFieldInfo.push({
|
|
771
|
-
"property":
|
|
772
|
-
value:
|
|
781
|
+
"property": oInData.dataProperty,
|
|
782
|
+
value: oInData.isPropertyReadOnly,
|
|
773
783
|
type: "Default"
|
|
774
784
|
});
|
|
775
|
-
} else if (
|
|
785
|
+
} else if (oInData.isPropertyReadOnly && oInData.isPropertyReadOnly.operands && oInData.isPropertyReadOnly.operands[0] && oInData.isPropertyReadOnly.operands[0].operand1 && oInData.isPropertyReadOnly.operands[0].operand2) {
|
|
776
786
|
// This needs to be refactored in accordance with the ReadOnlyExpression change
|
|
777
787
|
aReadOnlyFieldInfo.push({
|
|
778
|
-
"property":
|
|
779
|
-
propertyPath:
|
|
780
|
-
propertyValue:
|
|
788
|
+
"property": oInData.dataProperty,
|
|
789
|
+
propertyPath: oInData.isPropertyReadOnly.operands[0].operand1.path,
|
|
790
|
+
propertyValue: oInData.isPropertyReadOnly.operands[0].operand2.value,
|
|
781
791
|
type: "Path"
|
|
782
792
|
});
|
|
783
793
|
} // Setting visbility of the mass edit field.
|
|
784
794
|
|
|
785
795
|
|
|
786
|
-
if (
|
|
787
|
-
values.visible =
|
|
796
|
+
if (oInData.editMode) {
|
|
797
|
+
values.visible = oInData.editMode === EditMode.Editable || aContexts.some(MassEditHelper.getFieldVisiblity.bind(MassEditHelper, oInData.editMode, oDialogDataModel, oInData.dataProperty, values));
|
|
788
798
|
} else {
|
|
789
799
|
values.visible = true;
|
|
790
800
|
}
|
|
791
801
|
|
|
792
|
-
values.selectedKey = MassEditHelper.getDefaultSelectionPathComboBox(aContexts,
|
|
793
|
-
values.inputType =
|
|
794
|
-
values.unitProperty =
|
|
802
|
+
values.selectedKey = MassEditHelper.getDefaultSelectionPathComboBox(aContexts, oInData.dataProperty);
|
|
803
|
+
values.inputType = oInData.inputType;
|
|
804
|
+
values.unitProperty = oInData.unitProperty;
|
|
795
805
|
});
|
|
796
806
|
return oDialogDataModel;
|
|
797
807
|
},
|
|
@@ -799,9 +809,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
799
809
|
/**
|
|
800
810
|
* Gets transient context for dialog.
|
|
801
811
|
*
|
|
802
|
-
* @param
|
|
803
|
-
* @param
|
|
804
|
-
* @returns
|
|
812
|
+
* @param table Instance of Table.
|
|
813
|
+
* @param dialog Mass Edit Dialog.
|
|
814
|
+
* @returns Promise returning instance of dialog.
|
|
805
815
|
*/
|
|
806
816
|
getDialogContext: function (table, dialog) {
|
|
807
817
|
var transCtx = dialog && dialog.getBindingContext();
|
|
@@ -831,10 +841,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
831
841
|
/**
|
|
832
842
|
* Create the mass edit dialog.
|
|
833
843
|
*
|
|
834
|
-
* @param
|
|
835
|
-
* @param
|
|
836
|
-
* @param
|
|
837
|
-
* @returns
|
|
844
|
+
* @param oTable Instance of Table
|
|
845
|
+
* @param aContexts Contexts for mass edit
|
|
846
|
+
* @param oController Controller for the view
|
|
847
|
+
* @returns Promise returning instance of dialog.
|
|
838
848
|
*/
|
|
839
849
|
createDialog: function (oTable, aContexts, oController) {
|
|
840
850
|
var sFragmentName = "sap/fe/core/controls/massEdit/MassEditDialog",
|
|
@@ -855,24 +865,25 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
855
865
|
models: {
|
|
856
866
|
dataFieldModel: oDataFieldModel
|
|
857
867
|
}
|
|
858
|
-
})).then(function (
|
|
868
|
+
})).then(function (oCreatedFragment) {
|
|
859
869
|
return Fragment.load({
|
|
860
|
-
definition:
|
|
870
|
+
definition: oCreatedFragment
|
|
861
871
|
}).then(function (oDialogContent) {
|
|
862
872
|
var DraftStatus = FELibrary.DraftStatus;
|
|
863
873
|
var oDialog = new Dialog({
|
|
874
|
+
resizable: true,
|
|
864
875
|
title: oDefaultValues.massEditTitle,
|
|
865
876
|
content: [oDialogContent],
|
|
866
877
|
afterOpen: MassEditHelper.onDialogOpen,
|
|
867
878
|
beginButton: new Button({
|
|
868
|
-
text: oDefaultValues.
|
|
879
|
+
text: MassEditHelper.helpers.getExpBindingForApplyButtonTxt(oDefaultValues, oDataFieldModel.getObject("/")),
|
|
869
880
|
type: "Emphasized",
|
|
870
881
|
press: function (oEvent) {
|
|
871
882
|
var _oController$getView, _oController$getView$;
|
|
872
883
|
|
|
873
884
|
(_oController$getView = oController.getView()) === null || _oController$getView === void 0 ? void 0 : (_oController$getView$ = _oController$getView.getBindingContext("internal")) === null || _oController$getView$ === void 0 ? void 0 : _oController$getView$.setProperty("skipPatchHandlers", true);
|
|
874
|
-
var
|
|
875
|
-
var oModel =
|
|
885
|
+
var oInDialog = oEvent.getSource().getParent();
|
|
886
|
+
var oModel = oInDialog.getModel("fieldsInfo");
|
|
876
887
|
var aResults = oModel.getProperty("/results");
|
|
877
888
|
var aPropertyReadableInfo = oModel.getProperty("/readablePropertyData");
|
|
878
889
|
var changePromise = [];
|
|
@@ -895,7 +906,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
895
906
|
});
|
|
896
907
|
}
|
|
897
908
|
|
|
898
|
-
groupId = "$auto."
|
|
909
|
+
groupId = "$auto.".concat(idx); //index += 1;
|
|
899
910
|
|
|
900
911
|
oController._editFlow.setDraftStatus(DraftStatus.Saving); //let promiseCount = 0;
|
|
901
912
|
|
|
@@ -909,7 +920,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
909
920
|
}));
|
|
910
921
|
}
|
|
911
922
|
});
|
|
912
|
-
});
|
|
923
|
+
}); // eslint-disable-next-line promise/catch-or-return
|
|
924
|
+
|
|
913
925
|
Promise.allSettled(changePromise).then(function () {
|
|
914
926
|
var oListBinding = oTable.getRowBinding();
|
|
915
927
|
var oExtensionAPI = oController && oController.getExtensionAPI();
|
|
@@ -917,7 +929,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
917
929
|
var subtitleColumn = CommonUtils.getMessageColumn(oTable);
|
|
918
930
|
var messages = sap.ui.getCore().getMessageManager().getMessageModel().getData();
|
|
919
931
|
var boundTransitionErrorContexts = [];
|
|
920
|
-
messages.forEach(function (message
|
|
932
|
+
messages.forEach(function (message) {
|
|
921
933
|
var messageTargets = message.getTargets();
|
|
922
934
|
|
|
923
935
|
if (messageTargets && messageTargets.length === 1 && messageTargets[0].length && message.persistent === true) {
|
|
@@ -929,26 +941,24 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
929
941
|
}
|
|
930
942
|
});
|
|
931
943
|
|
|
932
|
-
if (boundTransitionErrorContexts.length === 0 && errorValues.length === 0) {
|
|
944
|
+
if (aResults.length > 0 && boundTransitionErrorContexts.length === 0 && errorValues.length === 0) {
|
|
933
945
|
oController._editFlow.setDraftStatus(DraftStatus.Saved);
|
|
934
946
|
|
|
935
947
|
var successToast = oResourceBundle.getText("C_MASS_EDIT_SUCCESS_TOAST");
|
|
936
948
|
MessageToast.show(successToast);
|
|
937
|
-
} else {
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
oController._editFlow.setDraftStatus(DraftStatus.Clear);
|
|
942
|
-
}
|
|
949
|
+
} else if (errorValues.length + boundTransitionErrorContexts.length < oTable.getSelectedContexts().length) {
|
|
950
|
+
oController._editFlow.setDraftStatus(DraftStatus.Saved);
|
|
951
|
+
} else if (errorValues.length + boundTransitionErrorContexts.length === oTable.getSelectedContexts().length) {
|
|
952
|
+
oController._editFlow.setDraftStatus(DraftStatus.Clear);
|
|
943
953
|
}
|
|
944
954
|
|
|
945
955
|
oController._editFlow.getMessageHandler().showMessages();
|
|
946
956
|
|
|
947
|
-
if (
|
|
957
|
+
if (oInDialog.isOpen()) {
|
|
948
958
|
var _oController$getView2, _oController$getView3;
|
|
949
959
|
|
|
950
|
-
|
|
951
|
-
|
|
960
|
+
oInDialog.close();
|
|
961
|
+
oInDialog.destroy();
|
|
952
962
|
(_oController$getView2 = oController.getView()) === null || _oController$getView2 === void 0 ? void 0 : (_oController$getView3 = _oController$getView2.getBindingContext("internal")) === null || _oController$getView3 === void 0 ? void 0 : _oController$getView3.setProperty("skipPatchHandlers", false);
|
|
953
963
|
}
|
|
954
964
|
});
|
|
@@ -957,10 +967,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
957
967
|
}),
|
|
958
968
|
endButton: new Button({
|
|
959
969
|
text: oDefaultValues.cancelButtonText,
|
|
970
|
+
visible: MassEditHelper.helpers.hasEditableFieldsBinding(oDataFieldModel.getObject("/"), true),
|
|
960
971
|
press: function (oEvent) {
|
|
961
|
-
var
|
|
962
|
-
|
|
963
|
-
|
|
972
|
+
var oInDialog = oEvent.getSource().getParent();
|
|
973
|
+
oInDialog.close();
|
|
974
|
+
oInDialog.destroy();
|
|
964
975
|
}
|
|
965
976
|
})
|
|
966
977
|
});
|
|
@@ -972,8 +983,24 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
|
|
|
972
983
|
});
|
|
973
984
|
}).catch(reject);
|
|
974
985
|
});
|
|
986
|
+
},
|
|
987
|
+
helpers: {
|
|
988
|
+
getBindingExpForHasEditableFields: function (fields, editable) {
|
|
989
|
+
var totalExp = fields.reduce(function (expression, field) {
|
|
990
|
+
return or(expression, pathInModel("/values/" + field.dataProperty + "/visible", "fieldsInfo"));
|
|
991
|
+
}, constant(false));
|
|
992
|
+
return editable ? totalExp : not(totalExp);
|
|
993
|
+
},
|
|
994
|
+
getExpBindingForApplyButtonTxt: function (defaultValues, fields) {
|
|
995
|
+
var editableExp = MassEditHelper.helpers.getBindingExpForHasEditableFields(fields, true);
|
|
996
|
+
var totalExp = ifElse(editableExp, constant(defaultValues.applyButtonText), constant(defaultValues.okButtonText));
|
|
997
|
+
return compileExpression(totalExp);
|
|
998
|
+
},
|
|
999
|
+
hasEditableFieldsBinding: function (fields, editable) {
|
|
1000
|
+
return compileExpression(MassEditHelper.helpers.getBindingExpForHasEditableFields(fields, editable));
|
|
1001
|
+
}
|
|
975
1002
|
}
|
|
976
1003
|
};
|
|
977
1004
|
return MassEditHelper;
|
|
978
1005
|
}, false);
|
|
979
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hc3NFZGl0SGVscGVyLnRzIl0sIm5hbWVzIjpbIk1hc3NFZGl0SGVscGVyIiwiaW5pdExhc3RMZXZlbE9mUHJvcGVydHlQYXRoIiwic1BhdGgiLCJhVmFsdWVzIiwiYUZpbmFsUGF0aCIsImluZGV4IiwiYVBhdGhzIiwic3BsaXQiLCJzRnVsbFBhdGgiLCJmb3JFYWNoIiwic1Byb3BlcnR5UGF0aCIsImdldFVuaXF1ZVZhbHVlcyIsInNWYWx1ZSIsInNlbGYiLCJ1bmRlZmluZWQiLCJpbmRleE9mIiwiZ2V0VmFsdWVGb3JNdWx0aUxldmVsUGF0aCIsInNEYXRhUHJvcGVydHlQYXRoIiwib1ZhbHVlcyIsImFQcm9wZXJ0eVBhdGhzIiwiUmVzdWx0IiwiZ2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveCIsImFDb250ZXh0cyIsImxlbmd0aCIsIm9TZWxlY3RlZENvbnRleHQiLCJhUHJvcGVydHlWYWx1ZXMiLCJvQ29udGV4dCIsIm9EYXRhT2JqZWN0IiwiZ2V0T2JqZWN0Iiwic011bHRpTGV2ZWxQYXRoQ29uZGl0aW9uIiwiaGFzT3duUHJvcGVydHkiLCJwdXNoIiwiYVVuaXF1ZVByb3BlcnR5VmFsdWVzIiwiZmlsdGVyIiwiZ2V0SGlkZGVuVmFsdWVGb3JDb250ZXh0cyIsImhpZGRlblZhbHVlIiwiJFBhdGgiLCJzb21lIiwiZ2V0SW5wdXRUeXBlIiwicHJvcGVydHlJbmZvIiwiZGF0YUZpZWxkQ29udmVydGVkIiwib0RhdGFNb2RlbFBhdGgiLCJlZGl0U3R5bGVQcm9wZXJ0aWVzIiwiaW5wdXRUeXBlIiwic2V0RWRpdFN0eWxlUHJvcGVydGllcyIsImVkaXRTdHlsZSIsImlzVmFsaWRGb3JNYXNzRWRpdCIsImlzQ29sbGVjdGlvbkZpZWxkIiwiaGFzVmFsdWVIZWxwV2l0aEZpeGVkVmFsdWVzIiwiZ2V0SXNGaWVsZEdycCIsIiRUeXBlIiwiVGFyZ2V0IiwidmFsdWUiLCJnZXRUZXh0UGF0aCIsInByb3BlcnR5IiwidGV4dEJpbmRpbmciLCJkaXNwbGF5TW9kZSIsImRlc2NyaXB0aW9uUGF0aCIsInBhdGgiLCJwYXJhbWV0ZXJzIiwicHJvcHMiLCJwcmVwYXJlRGF0YUZvckRpYWxvZyIsIm9UYWJsZSIsImFEYXRhQXJyYXkiLCJvTWV0YU1vZGVsIiwiZ2V0TW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJzQ3VycmVudEVudGl0eVNldE5hbWUiLCJkYXRhIiwiYVRhYmxlRmllbGRzIiwiZ2V0VGFibGVGaWVsZHMiLCJvRW50aXR5VHlwZUNvbnRleHQiLCJnZXRDb250ZXh0Iiwib0VudGl0eVNldENvbnRleHQiLCJvRGF0YU1vZGVsT2JqZWN0UGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsIm9EYXRhRmllbGRNb2RlbCIsIkpTT05Nb2RlbCIsIm9SZXN1bHQiLCJzTGFiZWxUZXh0IiwiYlZhbHVlSGVscEVuYWJsZWQiLCJzVW5pdFByb3BlcnR5UGF0aCIsImJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCIsIm9UZXh0QmluZGluZyIsIm9Db2x1bW5JbmZvIiwiZGF0YVByb3BlcnR5Iiwib1Byb3BlcnR5SW5mbyIsImxhYmVsIiwidGFyZ2V0T2JqZWN0IiwidGFyZ2V0RW50aXR5VHlwZSIsImVudGl0eVByb3BlcnRpZXMiLCJvUHJvcGVydHkiLCJuYW1lIiwiZ2V0VGV4dEJpbmRpbmciLCJvRmllbGRDb250ZXh0IiwiYW5ub3RhdGlvblBhdGgiLCJvRGF0YUZpZWxkQ29udmVydGVkIiwiY29udmVydE1ldGFNb2RlbENvbnRleHQiLCJvUHJvcGVydHlDb250ZXh0Iiwib0ludGVyZmFjZSIsImdldEludGVyZmFjZSIsIlZhbHVlIiwiZW5oYW5jZURhdGFNb2RlbFBhdGgiLCJiSGlkZGVuRmllbGQiLCJpc0ltYWdlIiwiY29udGV4dCIsImdldFBhdGgiLCJfdHlwZSIsIiR0YXJnZXQiLCJjaGFydFByb3BlcnR5IiwidGVybSIsImlzQWN0aW9uIiwiQWN0aW9uIiwiaXNGaWVsZEdycCIsInByb3BlcnR5Rm9yRmllbGRDb250cm9sIiwiZXhwQmluZGluZyIsImdldEVkaXRNb2RlIiwiZWRpdE1vZGVWYWx1ZXMiLCJPYmplY3QiLCJrZXlzIiwiRWRpdE1vZGUiLCJlZGl0TW9kZUlzU3RhdGljIiwiaW5jbHVkZXMiLCJlZGl0YWJsZSIsIkVkaXRhYmxlIiwiaXNSZWFkT25seSIsImlzUmVhZE9ubHlFeHByZXNzaW9uIiwiQ29tbW9uVXRpbHMiLCJjb21wdXRlRGlzcGxheU1vZGUiLCJnZXRSZXF1aXJlZEV4cHJlc3Npb24iLCJudWxsYWJsZSIsInNldERhdGEiLCJhQ29sdW1ucyIsImdldENvbHVtbnMiLCJjb2x1bW5zRGF0YSIsImdldFBhcmVudCIsImdldFRhYmxlRGVmaW5pdGlvbiIsImNvbHVtbnMiLCJtYXAiLCJvQ29sdW1uIiwic0RhdGFQcm9wZXJ0eSIsImdldERhdGFQcm9wZXJ0eSIsImFSZWFsdGVkQ29sdW1uSW5mbyIsInR5cGUiLCJnZXRIZWFkZXIiLCJnZXREZWZhdWx0VGV4dHNGb3JEaWFsb2ciLCJvUmVzb3VyY2VCdW5kbGUiLCJpU2VsZWN0ZWRDb250ZXh0cyIsImJEaXNwbGF5TW9kZSIsImdldFRleHQiLCJ0b1N0cmluZyIsImdldFN1ZmZpeEZvcktlZXBFeGlzaXRpbmciLCJzSW5wdXRUeXBlIiwic1Jlc3VsdCIsInNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZyIsIm9EZWZhdWx0VmFsdWVzIiwiYlVPTUZpZWxkIiwidW5pdFByb3BlcnR5IiwiYlByb3BlcnR5UmVxdWlyZWQiLCJpc0ZpZWxkUmVxdWlyZWQiLCJzU3VmZml4Rm9yS2VlcEV4aXN0aW5nIiwiZGVmYXVsdE9wdGlvbnMiLCJiVmFsdWVFeGlzdHNGb3JQcm9wZXJ0eVBhdGgiLCJmYWxzZUVudHJ5IiwidGV4dCIsImtleSIsInRleHRJbmZvIiwidHJ1dGh5RW50cnkiLCJ1bnNoaWZ0IiwiaXNWYWx1ZUhlbHBFbmFibGVkIiwiaXNWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCIsInZoZEVudHJ5IiwidXNlVmFsdWVIZWxwVmFsdWUiLCJjbGVhckVudHJ5IiwiY2xlYXJGaWVsZFZhbHVlIiwiZW1wdHlFbnRyeSIsImxlYXZlQmxhbmtWYWx1ZSIsImtlZXBFbnRyeSIsImtlZXBFeGlzdGluZ1ByZWZpeCIsImdldFRleHRBcnJhbmdlbWVudEluZm8iLCJzZWxlY3RlZENvbnRleHQiLCJkZXNjcmlwdGlvblZhbHVlIiwiZnVsbFRleHQiLCJMb2ciLCJpbmZvIiwiaXNFZGl0YWJsZSIsImFueSIsImJpbmRpbmciLCJnZXRCaW5kaW5nIiwiZ2V0RXh0ZXJuYWxWYWx1ZSIsIm9uQ29udGV4dEVkaXRhYmxlQ2hhbmdlIiwib0RpYWxvZ0RhdGFNb2RlbCIsIm9iamVjdHNGb3JWaXNpYmlsaXR5IiwiZ2V0UHJvcGVydHkiLCJzZXRQcm9wZXJ0eSIsInVwZGF0ZU9uQ29udGV4dENoYW5nZSIsIm1PVG9Vc2UiLCJ2YWx1ZXMiLCJhdHRhY2hDaGFuZ2UiLCJiaW5kIiwiZ2V0Qm91bmRPYmplY3QiLCJBbnkiLCJtb2RlbCIsInNldE1vZGVsIiwic2V0QmluZGluZ0NvbnRleHQiLCJnZXRGaWVsZFZpc2libGl0eSIsImlzQ29udGV4dEVkaXRhYmxlIiwic2V0UnVudGltZU1vZGVsT25EaWFsb2ciLCJkaWFsb2dDb250ZXh0IiwiYVVuaXREYXRhIiwiYVJlc3VsdHMiLCJhUmVhZE9ubHlGaWVsZEluZm8iLCJvRGF0YSIsIm9UZXh0SW5mbyIsInNQcm9wZXJ0eUtleSIsInNVbml0UHJvcGVydHlOYW1lIiwib0Rpc3RpbmN0VmFsdWVNYXAiLCJvRGlzdGluY3RVbml0TWFwIiwic011bHRpTGV2ZWxQYXRoVmFsdWUiLCJkaXNwbGF5IiwidmFsdWVQYXRoIiwiZW50cnkiLCJ1bml0RW50cnkiLCJzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWUiLCJzZWxlY3RlZEtleSIsImJDbGVhckZpZWxkT3JCbGFua1ZhbHVlRXhpc3RzIiwib2JqIiwiYkNsZWFyRmllbGRPckJsYW5rVW5pdFZhbHVlRXhpc3RzIiwiaXNQcm9wZXJ0eVJlYWRPbmx5Iiwib3BlcmFuZHMiLCJvcGVyYW5kMSIsIm9wZXJhbmQyIiwicHJvcGVydHlQYXRoIiwicHJvcGVydHlWYWx1ZSIsImVkaXRNb2RlIiwidmlzaWJsZSIsImdldERpYWxvZ0NvbnRleHQiLCJ0YWJsZSIsImRpYWxvZyIsInRyYW5zQ3R4IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJsaXN0QmluZGluZyIsImdldFJvd0JpbmRpbmciLCJ0cmFuc2llbnRMaXN0QmluZGluZyIsImJpbmRMaXN0IiwiJCR1cGRhdGVHcm91cElkIiwicmVmcmVzaEludGVybmFsIiwiY3JlYXRlIiwib25EaWFsb2dPcGVuIiwiZXZlbnQiLCJzb3VyY2UiLCJnZXRTb3VyY2UiLCJmaWVsZHNJbmZvTW9kZWwiLCJjcmVhdGVEaWFsb2ciLCJvQ29udHJvbGxlciIsInNGcmFnbWVudE5hbWUiLCJDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJvRnJhZ21lbnQiLCJYTUxUZW1wbGF0ZVByb2Nlc3NvciIsImxvYWRUZW1wbGF0ZSIsIlhNTFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJiaW5kaW5nQ29udGV4dHMiLCJkYXRhRmllbGRNb2RlbCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwibW9kZWxzIiwidGhlbiIsIkZyYWdtZW50IiwibG9hZCIsImRlZmluaXRpb24iLCJvRGlhbG9nQ29udGVudCIsIkRyYWZ0U3RhdHVzIiwiRkVMaWJyYXJ5Iiwib0RpYWxvZyIsIkRpYWxvZyIsInRpdGxlIiwibWFzc0VkaXRUaXRsZSIsImNvbnRlbnQiLCJhZnRlck9wZW4iLCJiZWdpbkJ1dHRvbiIsIkJ1dHRvbiIsImFwcGx5QnV0dG9uVGV4dCIsInByZXNzIiwib0V2ZW50IiwiZ2V0VmlldyIsIm9Nb2RlbCIsImFQcm9wZXJ0eVJlYWRhYmxlSW5mbyIsImNoYW5nZVByb21pc2UiLCJiUmVhZE9ubHlGaWVsZCIsImdyb3VwSWQiLCJlcnJvclZhbHVlcyIsImlkeCIsImtleVZhbHVlIiwiX2VkaXRGbG93Iiwic2V0RHJhZnRTdGF0dXMiLCJTYXZpbmciLCJjYXRjaCIsIm9FcnJvciIsImVycm9yIiwiYWxsU2V0dGxlZCIsIm9MaXN0QmluZGluZyIsIm9FeHRlbnNpb25BUEkiLCJnZXRFeHRlbnNpb25BUEkiLCJyZWZyZXNoIiwic3VidGl0bGVDb2x1bW4iLCJnZXRNZXNzYWdlQ29sdW1uIiwibWVzc2FnZXMiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJnZXRNZXNzYWdlTWFuYWdlciIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHRzIiwibWVzc2FnZSIsIm1lc3NhZ2VUYXJnZXRzIiwiZ2V0VGFyZ2V0cyIsInBlcnNpc3RlbnQiLCJib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHQiLCJmaW5kIiwiZ2V0VGFyZ2V0IiwiYWRkaXRpb25hbFRleHQiLCJTYXZlZCIsInN1Y2Nlc3NUb2FzdCIsIk1lc3NhZ2VUb2FzdCIsInNob3ciLCJnZXRTZWxlY3RlZENvbnRleHRzIiwiQ2xlYXIiLCJnZXRNZXNzYWdlSGFuZGxlciIsInNob3dNZXNzYWdlcyIsImlzT3BlbiIsImNsb3NlIiwiZGVzdHJveSIsImVuZEJ1dHRvbiIsImNhbmNlbEJ1dHRvblRleHQiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTBDQSxNQUFNQSxjQUFjLEdBQUc7QUFDdEI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDQyxJQUFBQSwyQkFBMkIsRUFBRSxVQUFVQyxLQUFWLEVBQXlCQyxPQUF6QixFQUFnRTtBQUM1RixVQUFJQyxVQUFKO0FBQ0EsVUFBSUMsS0FBSyxHQUFHLENBQVo7QUFDQSxVQUFNQyxNQUFNLEdBQUdKLEtBQUssQ0FBQ0ssS0FBTixDQUFZLEdBQVosQ0FBZjtBQUNBLFVBQUlDLFNBQVMsR0FBRyxFQUFoQjtBQUNBRixNQUFBQSxNQUFNLENBQUNHLE9BQVAsQ0FBZSxVQUFVQyxhQUFWLEVBQWlDO0FBQy9DLFlBQUksQ0FBQ1AsT0FBTyxDQUFDTyxhQUFELENB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Q0EsaURBQUNsRixXQUFXLENBQUNrQyxPQUFaLEVBQUQsbUZBQUMsc0JBQXVCaEQsaUJBQXZCLENBQXlDLFVBQXpDLENBQUQsZ0ZBQWdGOUMsV0FBaEYsQ0FDQyxtQkFERCxFQUVDLEtBRkQ7QUFJQTtBQUNELHFCQS9DTSxDQUFQO0FBZ0RBLG1CQW5ERDtBQW9EQTtBQTlHc0IsZUFBWCxDQUphO0FBb0gxQitJLGNBQUFBLFNBQVMsRUFBRSxJQUFJckQsTUFBSixDQUFXO0FBQ3JCeEgsZ0JBQUFBLElBQUksRUFBRVQsY0FBYyxDQUFDdUwsZ0JBREE7QUFFckJwRCxnQkFBQUEsS0FBSyxFQUFFLFVBQVVDLE1BQVYsRUFBdUI7QUFDN0Isc0JBQU1WLE9BQU8sR0FBR1UsTUFBTSxDQUFDcEMsU0FBUCxHQUFtQnBILFNBQW5CLEVBQWhCO0FBQ0E4SSxrQkFBQUEsT0FBTyxDQUFDMEQsS0FBUjtBQUNBMUQsa0JBQUFBLE9BQU8sQ0FBQzJELE9BQVI7QUFDQTtBQU5vQixlQUFYO0FBcEhlLGFBQVgsQ0FBaEI7QUE2SEEsZ0JBQU10SSxLQUFLLEdBQUc1SSxNQUFNLENBQUNHLFFBQVAsRUFBZDtBQUNBb04sWUFBQUEsT0FBTyxDQUFDMUUsUUFBUixDQUFpQlosZ0JBQWpCLEVBQW1DLFlBQW5DO0FBQ0FzRixZQUFBQSxPQUFPLENBQUMxRSxRQUFSLENBQWlCRCxLQUFqQjtBQUNBMkUsWUFBQUEsT0FBTyxDQUFDekUsaUJBQVIsQ0FBMEJJLGFBQTFCO0FBQ0FtRCxZQUFBQSxPQUFPLENBQUNrQixPQUFELENBQVA7QUFDQSxXQXBJTSxDQUFQO0FBcUlBLFNBcEpLLEVBcUpMdUIsS0FySkssQ0FxSkN4QyxNQXJKRCxDQUFQO0FBc0pBLE9BeEpNLENBQVA7QUF5SkE7QUFsOUJxQixHQUF2QjtTQXE5QmVwUSxjIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB7IEJpbmRpbmdFeHByZXNzaW9uLCBFeHByZXNzaW9uT3JQcmltaXRpdmUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nRXhwcmVzc2lvblwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgRGF0YU1vZGVsT2JqZWN0UGF0aCwgZW5oYW5jZURhdGFNb2RlbFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBoYXNWYWx1ZUhlbHBXaXRoRml4ZWRWYWx1ZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0VGV4dEJpbmRpbmcsIHNldEVkaXRTdHlsZVByb3BlcnRpZXMgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWVsZC9GaWVsZFRlbXBsYXRpbmdcIjtcbmltcG9ydCB7IEZpZWxkUHJvcGVydGllcyB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ludGVybmFsL0ZpZWxkLm1ldGFkYXRhXCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IE1lc3NhZ2VUb2FzdCBmcm9tIFwic2FwL20vTWVzc2FnZVRvYXN0XCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IEZyYWdtZW50IGZyb20gXCJzYXAvdWkvY29yZS9GcmFnbWVudFwiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCBYTUxUZW1wbGF0ZVByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvWE1MVGVtcGxhdGVQcm9jZXNzb3JcIjtcbmltcG9ydCBFZGl0TW9kZSBmcm9tIFwic2FwL3VpL21kYy9lbnVtL0VkaXRNb2RlXCI7XG5pbXBvcnQgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB7IENvcmVFeCB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcbmltcG9ydCBBbnksIHsgQW55VHlwZSB9IGZyb20gXCIuLi9jb250cm9scy9BbnlcIjtcbmltcG9ydCB7IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0LCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwiLi4vY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGlzUmVhZE9ubHlFeHByZXNzaW9uIH0gZnJvbSBcIi4uL3RlbXBsYXRpbmcvRmllbGRDb250cm9sSGVscGVyXCI7XG5pbXBvcnQgeyBnZXRFZGl0TW9kZSwgZ2V0UmVxdWlyZWRFeHByZXNzaW9uLCBpc0NvbGxlY3Rpb25GaWVsZCB9IGZyb20gXCIuLi90ZW1wbGF0aW5nL1VJRm9ybWF0dGVyc1wiO1xuaW1wb3J0IHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwiLi9Nb2RlbEhlbHBlclwiO1xuXG4vKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGhlbHBlcnMgdG8gYmUgdXNlZCBmb3IgbWFzcyBlZGl0IGZ1bmN0aW9uYWxpdHkgKi9cbnR5cGUgVGV4dEFycmFuZ2VtZW50SW5mbyA9IHtcblx0dGV4dEFycmFuZ2VtZW50OiBzdHJpbmc7XG5cdHZhbHVlUGF0aDogc3RyaW5nO1xuXHRkZXNjcmlwdGlvblBhdGg/OiBzdHJpbmc7XG5cdHZhbHVlOiBzdHJpbmc7XG5cdGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cdGZ1bGxUZXh0OiBzdHJpbmc7XG59O1xuXG50eXBlIEJpbmRpbmdJbmZvID0ge1xuXHRwYXRoPzogc3RyaW5nO1xuXHRtb2RlbD86IHN0cmluZyB8IG9iamVjdDtcblx0cGFyYW1ldGVycz86IEFycmF5PEJpbmRpbmdJbmZvPjtcbn07XG5cbmNvbnN0IE1hc3NFZGl0SGVscGVyID0ge1xuXHQvKipcblx0ICogSW5pdGlhbGl6ZXMgdGhlIHZhbHVlIGF0IGZpbmFsIG9yIGRlZXBlc3QgbGV2ZWwgcGF0aCB3aXRoIGEgYmxhbmsgYXJyYXkuXG5cdCAqIFJldHVybiBhbiBlbXB0eSBhcnJheSBwb2ludGluZyB0byB0aGUgZmluYWwgb3IgZGVlcGVzdCBsZXZlbCBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1BhdGggUHJvcGVydHkgcGF0aFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhVmFsdWVzIEFycmF5IGluc3RhbmNlIHdoZXJlIHRoZSBkZWZhdWx0IGRhdGEgbmVlZHMgdG8gYmUgYWRkZWRcblx0ICogQHJldHVybnMge0FycmF5fVxuXHQgKi9cblx0aW5pdExhc3RMZXZlbE9mUHJvcGVydHlQYXRoOiBmdW5jdGlvbiAoc1BhdGg6IHN0cmluZywgYVZhbHVlczogYW55IC8qLCB0cmFuc0N0eDogQ29udGV4dCAqLykge1xuXHRcdGxldCBhRmluYWxQYXRoOiBhbnk7XG5cdFx0bGV0IGluZGV4ID0gMDtcblx0XHRjb25zdCBhUGF0aHMgPSBzUGF0aC5zcGxpdChcIi9cIik7XG5cdFx0bGV0IHNGdWxsUGF0aCA9IFwiXCI7XG5cdFx0YVBhdGhzLmZvckVhY2goZnVuY3Rpb24gKHNQcm9wZXJ0eVBhdGg6IHN0cmluZykge1xuXHRcdFx0aWYgKCFhVmFsdWVzW3NQcm9wZXJ0eVBhdGhdICYmIGluZGV4ID09PSAwKSB7XG5cdFx0XHRcdGFWYWx1ZXNbc1Byb3BlcnR5UGF0aF0gPSB7fTtcblx0XHRcdFx0YUZpbmFsUGF0aCA9IGFWYWx1ZXNbc1Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdHNGdWxsUGF0aCA9IHNGdWxsUGF0aCArIHNQcm9wZXJ0eVBhdGg7XG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHR9IGVsc2UgaWYgKCFhRmluYWxQYXRoW3NQcm9wZXJ0eVBhdGhdKSB7XG5cdFx0XHRcdHNGdWxsUGF0aCA9IHNGdWxsUGF0aCArIFwiL1wiICsgc1Byb3BlcnR5UGF0aDtcblx0XHRcdFx0aWYgKHNGdWxsUGF0aCAhPT0gc1BhdGgpIHtcblx0XHRcdFx0XHRhRmluYWxQYXRoW3NQcm9wZXJ0eVBhdGhdID0ge307XG5cdFx0XHRcdFx0YUZpbmFsUGF0aCA9IGFGaW5hbFBhdGhbc1Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YUZpbmFsUGF0aFtzUHJvcGVydHlQYXRoXSA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGFGaW5hbFBhdGg7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBnZXQgdW5pcXVlIHZhbHVlcyBmb3IgZ2l2ZW4gYXJyYXkgdmFsdWVzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1ZhbHVlIFByb3BlcnR5IHZhbHVlXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCBvZiB0aGUgcHJvcGVydHkgdmFsdWVcblx0ICogQHBhcmFtIHtBcnJheX0gc2VsZiBJbnN0YW5jZSBvZiB0aGUgYXJyYXlcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqL1xuXHRnZXRVbmlxdWVWYWx1ZXM6IGZ1bmN0aW9uIChzVmFsdWU6IHN0cmluZywgaW5kZXg6IG51bWJlciwgc2VsZjogYW55W10pIHtcblx0XHRpZiAoc1ZhbHVlICE9IHVuZGVmaW5lZCAmJiBzVmFsdWUgIT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIHNlbGYuaW5kZXhPZihzVmFsdWUpID09PSBpbmRleDtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHByb3BlcnR5IHZhbHVlIGZvciBhIG11bHRpLWxldmVsIHBhdGggKGZvciBleGFtcGxlOiBfTWF0ZXJpYWxzL01hdGVyaWFsX0RldGFpbHMgZ2V0cyB0aGUgdmFsdWUgb2YgTWF0ZXJpYWxfRGV0YWlscyB1bmRlciBfTWF0ZXJpYWxzIE9iamVjdCkuXG5cdCAqIFJldHVybnMgdGhlIHByb3BlcnR5VmFsdWUsIHdoaWNoIGNhbiBiZSBvZiBhbnkgdHlwZSAoc3RyaW5nLCBudW1iZXIsIGV0Yy4uKS5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNEYXRhUHJvcGVydHlQYXRoIFByb3BlcnR5IHBhdGhcblx0ICogQHBhcmFtIHtvYmplY3R9IG9WYWx1ZXMgT2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlc1xuXHQgKiBAcmV0dXJucyB7Kn1cblx0ICovXG5cdGdldFZhbHVlRm9yTXVsdGlMZXZlbFBhdGg6IGZ1bmN0aW9uIChzRGF0YVByb3BlcnR5UGF0aDogc3RyaW5nLCBvVmFsdWVzOiBhbnkpIHtcblx0XHRpZiAoc0RhdGFQcm9wZXJ0eVBhdGggJiYgc0RhdGFQcm9wZXJ0eVBhdGguaW5kZXhPZihcIi9cIikgPiAwKSB7XG5cdFx0XHRjb25zdCBhUHJvcGVydHlQYXRocyA9IHNEYXRhUHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGxldCBSZXN1bHQ6IGFueTtcblx0XHRcdGFQcm9wZXJ0eVBhdGhzLmZvckVhY2goZnVuY3Rpb24gKHNQYXRoOiBzdHJpbmcpIHtcblx0XHRcdFx0UmVzdWx0ID0gb1ZhbHVlcyAmJiBvVmFsdWVzW3NQYXRoXSA/IG9WYWx1ZXNbc1BhdGhdIDogUmVzdWx0ICYmIFJlc3VsdFtzUGF0aF07XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBSZXN1bHQ7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBrZXkgcGF0aCBmb3IgdGhlIGtleSBvZiBhIGNvbWJvIGJveCB0aGF0IG11c3QgYmUgc2VsZWN0ZWQgaW5pdGlhbGx5IHdoZW4gdGhlIGRpYWxvZyBvcGVuczpcblx0ICogPT4gSWYgcHJvcGVydHlWYWx1ZSBmb3IgYWxsIHNlbGVjdGVkIGNvbnRleHRzIGlzIGRpZmZlcmVudCwgdGhlbiA8IEtlZXAgRXhpc3RpbmcgVmFsdWVzID4gaXMgcHJlc2VsZWN0ZWQuXG5cdCAqID0+IElmIHByb3BlcnR5VmFsdWUgZm9yIGFsbCBzZWxlY3RlZCBjb250ZXh0cyBpcyB0aGUgc2FtZSwgdGhlbiB0aGUgcHJvcGVydHlWYWx1ZSBpcyBwcmVzZWxlY3RlZC5cblx0ICogPT4gSWYgcHJvcGVydHlWYWx1ZSBmb3IgYWxsIHNlbGVjdGVkIGNvbnRleHRzIGlzIGVtcHR5LCB0aGVuIDwgTGVhdmUgQmxhbmsgPiBpcyBwcmVzZWxlY3RlZC5cblx0ICpcblx0ICpcblx0ICogQHBhcmFtIHtBcnJheX0gYUNvbnRleHRzIENvbnRleHRzIGZvciBtYXNzIGVkaXRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNEYXRhUHJvcGVydHlQYXRoIERhdGEgcHJvcGVydHkgcGF0aFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKi9cblx0Z2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveDogZnVuY3Rpb24gKGFDb250ZXh0czogYW55W10sIHNEYXRhUHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHRpZiAoc0RhdGFQcm9wZXJ0eVBhdGggJiYgYUNvbnRleHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IG9TZWxlY3RlZENvbnRleHQgPSBhQ29udGV4dHMsXG5cdFx0XHRcdGFQcm9wZXJ0eVZhbHVlczogYW55W10gPSBbXTtcblx0XHRcdG9TZWxlY3RlZENvbnRleHQuZm9yRWFjaChmdW5jdGlvbiAob0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRjb25zdCBvRGF0YU9iamVjdCA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRjb25zdCBzTXVsdGlMZXZlbFBhdGhDb25kaXRpb24gPVxuXHRcdFx0XHRcdHNEYXRhUHJvcGVydHlQYXRoLmluZGV4T2YoXCIvXCIpID4gLTEgJiYgb0RhdGFPYmplY3QuaGFzT3duUHJvcGVydHkoc0RhdGFQcm9wZXJ0eVBhdGguc3BsaXQoXCIvXCIpWzBdKTtcblx0XHRcdFx0aWYgKG9Db250ZXh0ICYmIChvRGF0YU9iamVjdC5oYXNPd25Qcm9wZXJ0eShzRGF0YVByb3BlcnR5UGF0aCkgfHwgc011bHRpTGV2ZWxQYXRoQ29uZGl0aW9uKSkge1xuXHRcdFx0XHRcdGFQcm9wZXJ0eVZhbHVlcy5wdXNoKG9Db250ZXh0LmdldE9iamVjdChzRGF0YVByb3BlcnR5UGF0aCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGFVbmlxdWVQcm9wZXJ0eVZhbHVlcyA9IGFQcm9wZXJ0eVZhbHVlcy5maWx0ZXIoTWFzc0VkaXRIZWxwZXIuZ2V0VW5pcXVlVmFsdWVzKTtcblx0XHRcdGlmIChhVW5pcXVlUHJvcGVydHlWYWx1ZXMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRyZXR1cm4gXCJEZWZhdWx0L1wiICsgc0RhdGFQcm9wZXJ0eVBhdGg7XG5cdFx0XHR9IGVsc2UgaWYgKGFVbmlxdWVQcm9wZXJ0eVZhbHVlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0cmV0dXJuIFwiRW1wdHkvXCIgKyBzRGF0YVByb3BlcnR5UGF0aDtcblx0XHRcdH0gZWxzZSBpZiAoYVVuaXF1ZVByb3BlcnR5VmFsdWVzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRyZXR1cm4gc0RhdGFQcm9wZXJ0eVBhdGggKyBcIi9cIiArIGFVbmlxdWVQcm9wZXJ0eVZhbHVlc1swXTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBoaWRkZW4gYW5ub3RhdGlvbiB2YWx1ZSBbYm90aCBzdGF0aWMgYW5kIHBhdGggYmFzZWRdIGZvciB0YWJsZSdzIHNlbGVjdGVkIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7Kn0gaGlkZGVuVmFsdWUgSGlkZGVuIGFubm90YXRpb24gdmFsdWUgLyBwYXRoIGZvciBmaWVsZFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhQ29udGV4dHMgQ29udGV4dHMgZm9yIG1hc3MgZWRpdFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICovXG5cdGdldEhpZGRlblZhbHVlRm9yQ29udGV4dHM6IGZ1bmN0aW9uIChoaWRkZW5WYWx1ZTogYW55LCBhQ29udGV4dHM6IGFueVtdKSB7XG5cdFx0aWYgKGhpZGRlblZhbHVlICYmIGhpZGRlblZhbHVlLiRQYXRoKSB7XG5cdFx0XHRyZXR1cm4gIWFDb250ZXh0cy5zb21lKGZ1bmN0aW9uIChvU2VsZWN0ZWRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KGhpZGRlblZhbHVlLiRQYXRoKSA9PT0gZmFsc2U7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIGhpZGRlblZhbHVlO1xuXHR9LFxuXG5cdGdldElucHV0VHlwZTogZnVuY3Rpb24gKHByb3BlcnR5SW5mbzogYW55LCBkYXRhRmllbGRDb252ZXJ0ZWQ6IGFueSwgb0RhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGVkaXRTdHlsZVByb3BlcnRpZXMgPSB7fSBhcyBGaWVsZFByb3BlcnRpZXM7XG5cdFx0bGV0IGlucHV0VHlwZSE6IHN0cmluZztcblx0XHRpZiAocHJvcGVydHlJbmZvKSB7XG5cdFx0XHRzZXRFZGl0U3R5bGVQcm9wZXJ0aWVzKGVkaXRTdHlsZVByb3BlcnRpZXMsIGRhdGFGaWVsZENvbnZlcnRlZCwgb0RhdGFNb2RlbFBhdGgsIHRydWUpO1xuXHRcdFx0aW5wdXRUeXBlID0gZWRpdFN0eWxlUHJvcGVydGllcz8uZWRpdFN0eWxlIHx8IFwiXCI7XG5cdFx0fVxuXHRcdGNvbnN0IGlzVmFsaWRGb3JNYXNzRWRpdCA9XG5cdFx0XHRpbnB1dFR5cGUgJiZcblx0XHRcdFtcIkRhdGVQaWNrZXJcIiwgXCJUaW1lUGlja2VyXCIsIFwiRGF0ZVRpbWVQaWNrZXJcIiwgXCJSYXRpbmdJbmRpY2F0b3JcIl0uaW5kZXhPZihpbnB1dFR5cGUpID09PSAtMSAmJlxuXHRcdFx0IWlzQ29sbGVjdGlvbkZpZWxkKG9EYXRhTW9kZWxQYXRoKSAmJlxuXHRcdFx0IWhhc1ZhbHVlSGVscFdpdGhGaXhlZFZhbHVlcyhwcm9wZXJ0eUluZm8pO1xuXG5cdFx0cmV0dXJuIChpc1ZhbGlkRm9yTWFzc0VkaXQgfHwgXCJcIikgJiYgaW5wdXRUeXBlO1xuXHR9LFxuXG5cdGdldElzRmllbGRHcnA6IGZ1bmN0aW9uIChkYXRhRmllbGRDb252ZXJ0ZWQ6IGFueSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAoXG5cdFx0XHRkYXRhRmllbGRDb252ZXJ0ZWQgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JBbm5vdGF0aW9uXCIgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQudmFsdWUgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQudmFsdWUuaW5kZXhPZihcIkZpZWxkR3JvdXBcIikgPiAtMVxuXHRcdCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0ZXh0IHBhdGggZm9yIHRoZSBtYXNzIGVkaXQgZmllbGQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSB7YW55fSB0ZXh0QmluZGluZyBUZXh0IEJpbmRpbmcgSW5mb1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gZGlzcGxheU1vZGUgRGlzcGxheSBtb2RlXG5cdCAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IFRleHQgUHJvcGVydHkgUGF0aCBpZiBpdCBleGlzdHNcblx0ICovXG5cdGdldFRleHRQYXRoOiBmdW5jdGlvbiAocHJvcGVydHk6IHN0cmluZywgdGV4dEJpbmRpbmc6IGFueSwgZGlzcGxheU1vZGU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IGRlc2NyaXB0aW9uUGF0aDtcblx0XHRpZiAodGV4dEJpbmRpbmcgJiYgKHRleHRCaW5kaW5nLnBhdGggfHwgKHRleHRCaW5kaW5nLnBhcmFtZXRlcnMgJiYgdGV4dEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGgpKSAmJiBwcm9wZXJ0eSkge1xuXHRcdFx0aWYgKHRleHRCaW5kaW5nLnBhdGggJiYgZGlzcGxheU1vZGUgPT09IFwiRGVzY3JpcHRpb25cIikge1xuXHRcdFx0XHRkZXNjcmlwdGlvblBhdGggPSB0ZXh0QmluZGluZy5wYXRoO1xuXHRcdFx0fSBlbHNlIGlmICh0ZXh0QmluZGluZy5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdHRleHRCaW5kaW5nLnBhcmFtZXRlcnMuZm9yRWFjaChmdW5jdGlvbiAocHJvcHM6IEJpbmRpbmdJbmZvKSB7XG5cdFx0XHRcdFx0aWYgKHByb3BzLnBhdGggJiYgcHJvcHMucGF0aCAhPT0gcHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uUGF0aCA9IHByb3BzLnBhdGg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGRlc2NyaXB0aW9uUGF0aDtcblx0fSxcblxuXHQvKipcblx0ICogSW5pdGlhbGl6ZXMgYSBKU09OIE1vZGVsIGZvciBwcm9wZXJ0aWVzIG9mIGRpYWxvZyBmaWVsZHMgW2xhYmVsLCB2aXNpYmxpdHksIGRhdGFwcm9wZXJ0eSwgZXRjLl0uXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvVGFibGUgSW5zdGFuY2Ugb2YgVGFibGVcblx0ICogQHBhcmFtIHtBcnJheX0gYUNvbnRleHRzIENvbnRleHRzIGZvciBtYXNzIGVkaXRcblx0ICogQHBhcmFtIHtBcnJheX0gYURhdGFBcnJheSBBcnJheSBjb250YWluaW5nIGRhdGEgcmVsYXRlZCB0byB0aGUgZGlhbG9nIHVzZWQgYnkgYm90aCB0aGUgc3RhdGljIGFuZCB0aGUgcnVudGltZSBtb2RlbFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fVxuXHQgKi9cblx0cHJlcGFyZURhdGFGb3JEaWFsb2c6IGZ1bmN0aW9uIChvVGFibGU6IFRhYmxlLCBhQ29udGV4dHM6IGFueVtdLCBhRGF0YUFycmF5OiBhbnlbXSkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvVGFibGUgJiYgKG9UYWJsZS5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIGFueSksXG5cdFx0XHRzQ3VycmVudEVudGl0eVNldE5hbWUgPSBvVGFibGUuZGF0YShcIm1ldGFQYXRoXCIpLFxuXHRcdFx0YVRhYmxlRmllbGRzID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGFibGVGaWVsZHMob1RhYmxlKSxcblx0XHRcdG9FbnRpdHlUeXBlQ29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0Q29udGV4dChzQ3VycmVudEVudGl0eVNldE5hbWUgKyBcIi9AXCIpLFxuXHRcdFx0b0VudGl0eVNldENvbnRleHQgPSBvTWV0YU1vZGVsLmdldENvbnRleHQoc0N1cnJlbnRFbnRpdHlTZXROYW1lKSxcblx0XHRcdG9EYXRhTW9kZWxPYmplY3RQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG9FbnRpdHlUeXBlQ29udGV4dCk7XG5cblx0XHRjb25zdCBvRGF0YUZpZWxkTW9kZWwgPSBuZXcgSlNPTk1vZGVsKCk7XG5cdFx0bGV0IG9SZXN1bHQ7XG5cdFx0bGV0IHNMYWJlbFRleHQ7XG5cdFx0bGV0IGJWYWx1ZUhlbHBFbmFibGVkO1xuXHRcdGxldCBzVW5pdFByb3BlcnR5UGF0aDtcblx0XHRsZXQgYlZhbHVlSGVscEVuYWJsZWRGb3JVbml0O1xuXHRcdGxldCBvVGV4dEJpbmRpbmc7XG5cblx0XHRhVGFibGVGaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAob0NvbHVtbkluZm86IGFueSkge1xuXHRcdFx0Y29uc3Qgc0RhdGFQcm9wZXJ0eVBhdGggPSBvQ29sdW1uSW5mby5kYXRhUHJvcGVydHk7XG5cdFx0XHRpZiAoc0RhdGFQcm9wZXJ0eVBhdGgpIHtcblx0XHRcdFx0bGV0IG9Qcm9wZXJ0eUluZm8gPSBzRGF0YVByb3BlcnR5UGF0aCAmJiBvTWV0YU1vZGVsLmdldE9iamVjdChzQ3VycmVudEVudGl0eVNldE5hbWUgKyBcIi9cIiArIHNEYXRhUHJvcGVydHlQYXRoICsgXCJAXCIpO1xuXHRcdFx0XHRiVmFsdWVIZWxwRW5hYmxlZCA9XG5cdFx0XHRcdFx0c0RhdGFQcm9wZXJ0eVBhdGggJiZcblx0XHRcdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChzQ3VycmVudEVudGl0eVNldE5hbWUgKyBcIi9cIiArIHNEYXRhUHJvcGVydHlQYXRoICsgXCJAXCIpICYmXG5cdFx0XHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3Qoc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvXCIgKyBzRGF0YVByb3BlcnR5UGF0aCArIFwiQFwiKVtcblx0XHRcdFx0XHRcdFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5WYWx1ZUxpc3RcIlxuXHRcdFx0XHRcdF07XG5cdFx0XHRcdHNVbml0UHJvcGVydHlQYXRoID1cblx0XHRcdFx0XHQob1Byb3BlcnR5SW5mbyAmJiBvUHJvcGVydHlJbmZvW1wiQE9yZy5PRGF0YS5NZWFzdXJlcy5WMS5Vbml0XCJdICYmIG9Qcm9wZXJ0eUluZm9bXCJAT3JnLk9EYXRhLk1lYXN1cmVzLlYxLlVuaXRcIl0uJFBhdGgpIHx8XG5cdFx0XHRcdFx0KG9Qcm9wZXJ0eUluZm8gJiZcblx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm9bXCJAT3JnLk9EYXRhLk1lYXN1cmVzLlYxLklTT0N1cnJlbmN5XCJdICYmXG5cdFx0XHRcdFx0XHRvUHJvcGVydHlJbmZvW1wiQE9yZy5PRGF0YS5NZWFzdXJlcy5WMS5JU09DdXJyZW5jeVwiXS4kUGF0aCk7XG5cdFx0XHRcdHNMYWJlbFRleHQgPVxuXHRcdFx0XHRcdG9Db2x1bW5JbmZvLmxhYmVsIHx8XG5cdFx0XHRcdFx0KG9Qcm9wZXJ0eUluZm8gJiYgb1Byb3BlcnR5SW5mb1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTGFiZWxcIl0pIHx8XG5cdFx0XHRcdFx0b0NvbHVtbkluZm8uZGF0YVByb3BlcnR5O1xuXHRcdFx0XHRiVmFsdWVIZWxwRW5hYmxlZEZvclVuaXQgPVxuXHRcdFx0XHRcdHNVbml0UHJvcGVydHlQYXRoICYmXG5cdFx0XHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3Qoc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvXCIgKyBzVW5pdFByb3BlcnR5UGF0aCArIFwiQFwiKSAmJlxuXHRcdFx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNDdXJyZW50RW50aXR5U2V0TmFtZSArIFwiL1wiICsgc1VuaXRQcm9wZXJ0eVBhdGggKyBcIkBcIilbXG5cdFx0XHRcdFx0XHRcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVmFsdWVMaXN0XCJcblx0XHRcdFx0XHRdO1xuXHRcdFx0XHRpZiAob0RhdGFNb2RlbE9iamVjdFBhdGgpIHtcblx0XHRcdFx0XHRvRGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgPSBvRGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuZmlsdGVyKGZ1bmN0aW9uIChcblx0XHRcdFx0XHRcdG9Qcm9wZXJ0eTogYW55XG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb1Byb3BlcnR5Lm5hbWUgPT09IHNEYXRhUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCA9IG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdFswXSB8fCB7fTtcblx0XHRcdFx0b1RleHRCaW5kaW5nID0gZ2V0VGV4dEJpbmRpbmcob0RhdGFNb2RlbE9iamVjdFBhdGgsIHt9LCB0cnVlKSB8fCB7fTtcblx0XHRcdFx0Y29uc3Qgb0ZpZWxkQ29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0Q29udGV4dChvQ29sdW1uSW5mby5hbm5vdGF0aW9uUGF0aCksXG5cdFx0XHRcdFx0b0RhdGFGaWVsZENvbnZlcnRlZCA9IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0KG9GaWVsZENvbnRleHQpLFxuXHRcdFx0XHRcdG9Qcm9wZXJ0eUNvbnRleHQgPSBvTWV0YU1vZGVsLmdldENvbnRleHQoc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvXCIgKyBzRGF0YVByb3BlcnR5UGF0aCArIFwiQFwiKSxcblx0XHRcdFx0XHRvSW50ZXJmYWNlID0gb1Byb3BlcnR5Q29udGV4dCAmJiBvUHJvcGVydHlDb250ZXh0LmdldEludGVyZmFjZSgpO1xuXG5cdFx0XHRcdGxldCBvRGF0YU1vZGVsUGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhvRmllbGRDb250ZXh0LCBvRW50aXR5U2V0Q29udGV4dCk7XG5cdFx0XHRcdGlmIChvRGF0YUZpZWxkQ29udmVydGVkPy5WYWx1ZT8ucGF0aD8ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdG9EYXRhTW9kZWxQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGgob0RhdGFNb2RlbFBhdGgsIHNEYXRhUHJvcGVydHlQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBiSGlkZGVuRmllbGQgPVxuXHRcdFx0XHRcdE1hc3NFZGl0SGVscGVyLmdldEhpZGRlblZhbHVlRm9yQ29udGV4dHMoXG5cdFx0XHRcdFx0XHRvRmllbGRDb250ZXh0ICYmIG9GaWVsZENvbnRleHQuZ2V0T2JqZWN0KClbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuXCJdLFxuXHRcdFx0XHRcdFx0YUNvbnRleHRzXG5cdFx0XHRcdFx0KSB8fCBmYWxzZTtcblx0XHRcdFx0Y29uc3QgaXNJbWFnZSA9IG9Qcm9wZXJ0eUluZm8gJiYgb1Byb3BlcnR5SW5mb1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Jc0ltYWdlVVJMXCJdO1xuXG5cdFx0XHRcdG9JbnRlcmZhY2UuY29udGV4dCA9IHtcblx0XHRcdFx0XHRnZXRNb2RlbDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9JbnRlcmZhY2UuZ2V0TW9kZWwoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGdldFBhdGg6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBzQ3VycmVudEVudGl0eVNldE5hbWUgKyBcIi9cIiArIHNEYXRhUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdFx0b1Byb3BlcnR5SW5mbyA9XG5cdFx0XHRcdFx0b0RhdGFGaWVsZENvbnZlcnRlZC5fdHlwZSA9PT0gXCJQcm9wZXJ0eVwiXG5cdFx0XHRcdFx0XHQ/IG9EYXRhRmllbGRDb252ZXJ0ZWRcblx0XHRcdFx0XHRcdDogKG9EYXRhRmllbGRDb252ZXJ0ZWQgJiYgb0RhdGFGaWVsZENvbnZlcnRlZC5WYWx1ZSAmJiBvRGF0YUZpZWxkQ29udmVydGVkLlZhbHVlLiR0YXJnZXQpIHx8XG5cdFx0XHRcdFx0XHQgIChvRGF0YUZpZWxkQ29udmVydGVkICYmIG9EYXRhRmllbGRDb252ZXJ0ZWQuVGFyZ2V0ICYmIG9EYXRhRmllbGRDb252ZXJ0ZWQuVGFyZ2V0LiR0YXJnZXQpO1xuXHRcdFx0XHQvLyBEYXRhZmllbGQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBGaWVsZENvbnRyb2wgY2FsY3VsYXRpb24sIG5lZWRzIHRvIGJlIGltcGxlbWVudGVkXG5cblx0XHRcdFx0Y29uc3QgY2hhcnRQcm9wZXJ0eSA9IG9Qcm9wZXJ0eUluZm8gJiYgb1Byb3BlcnR5SW5mby50ZXJtICYmIG9Qcm9wZXJ0eUluZm8udGVybSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5DaGFydFwiO1xuXHRcdFx0XHRjb25zdCBpc0FjdGlvbiA9ICEhb0RhdGFGaWVsZENvbnZlcnRlZC5BY3Rpb247XG5cdFx0XHRcdGNvbnN0IGlzRmllbGRHcnAgPSBNYXNzRWRpdEhlbHBlci5nZXRJc0ZpZWxkR3JwKG9EYXRhRmllbGRDb252ZXJ0ZWQpO1xuXG5cdFx0XHRcdGlmIChpc0ltYWdlIHx8IGJIaWRkZW5GaWVsZCB8fCBjaGFydFByb3BlcnR5IHx8IGlzQWN0aW9uIHx8IGlzRmllbGRHcnApIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBFZGl0TW9kZSBhbmQgSW5wdXRUeXBlXG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5Rm9yRmllbGRDb250cm9sID0gb1Byb3BlcnR5SW5mbyAmJiBvUHJvcGVydHlJbmZvLlZhbHVlID8gb1Byb3BlcnR5SW5mby5WYWx1ZSA6IG9Qcm9wZXJ0eUluZm87XG5cdFx0XHRcdGNvbnN0IGV4cEJpbmRpbmcgPSBnZXRFZGl0TW9kZShwcm9wZXJ0eUZvckZpZWxkQ29udHJvbCwgb0RhdGFNb2RlbFBhdGgsIGZhbHNlLCBmYWxzZSwgb0RhdGFGaWVsZENvbnZlcnRlZCwgdHJ1ZSk7XG5cdFx0XHRcdGNvbnN0IGVkaXRNb2RlVmFsdWVzID0gT2JqZWN0LmtleXMoRWRpdE1vZGUpO1xuXHRcdFx0XHRjb25zdCBlZGl0TW9kZUlzU3RhdGljID0gISFleHBCaW5kaW5nICYmIGVkaXRNb2RlVmFsdWVzLmluY2x1ZGVzKGV4cEJpbmRpbmcgYXMgRWRpdE1vZGUpO1xuXHRcdFx0XHRjb25zdCBlZGl0YWJsZSA9ICEhZXhwQmluZGluZyAmJiAoKGVkaXRNb2RlSXNTdGF0aWMgJiYgZXhwQmluZGluZyA9PT0gRWRpdE1vZGUuRWRpdGFibGUpIHx8ICFlZGl0TW9kZUlzU3RhdGljKTtcblxuXHRcdFx0XHRpZiAoIWVkaXRhYmxlKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgaW5wdXRUeXBlID0gTWFzc0VkaXRIZWxwZXIuZ2V0SW5wdXRUeXBlKG9Qcm9wZXJ0eUluZm8sIG9EYXRhRmllbGRDb252ZXJ0ZWQsIG9EYXRhTW9kZWxQYXRoKTtcblxuXHRcdFx0XHRpZiAoaW5wdXRUeXBlKSB7XG5cdFx0XHRcdFx0Y29uc3QgaXNSZWFkT25seSA9IGlzUmVhZE9ubHlFeHByZXNzaW9uKG9Qcm9wZXJ0eUluZm8pO1xuXHRcdFx0XHRcdGNvbnN0IGRpc3BsYXlNb2RlID0gQ29tbW9uVXRpbHMuY29tcHV0ZURpc3BsYXlNb2RlKG9Qcm9wZXJ0eUNvbnRleHQuZ2V0T2JqZWN0KCkpO1xuXHRcdFx0XHRcdG9SZXN1bHQgPSB7XG5cdFx0XHRcdFx0XHRcImxhYmVsXCI6IHNMYWJlbFRleHQsXG5cdFx0XHRcdFx0XHRcImRhdGFQcm9wZXJ0eVwiOiBzRGF0YVByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdFwiaXNWYWx1ZUhlbHBFbmFibGVkXCI6IGJWYWx1ZUhlbHBFbmFibGVkID8gYlZhbHVlSGVscEVuYWJsZWQgOiBmYWxzZSxcblx0XHRcdFx0XHRcdFwidW5pdFByb3BlcnR5XCI6IHNVbml0UHJvcGVydHlQYXRoID8gc1VuaXRQcm9wZXJ0eVBhdGggOiBmYWxzZSxcblx0XHRcdFx0XHRcdFwiaXNWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdFwiOiBiVmFsdWVIZWxwRW5hYmxlZEZvclVuaXQgPyBiVmFsdWVIZWxwRW5hYmxlZEZvclVuaXQgOiBmYWxzZSxcblx0XHRcdFx0XHRcdFwicHJvcGVydHlQYXRoRm9yVmFsdWVIZWxwXCI6IHNDdXJyZW50RW50aXR5U2V0TmFtZSArIFwiL1wiICsgc0RhdGFQcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0XHRcInByb3BlcnR5UGF0aEZvclZhbHVlSGVscFVuaXRcIjogc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvXCIgKyBzVW5pdFByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdFwiaXNGaWVsZFJlcXVpcmVkXCI6IGdldFJlcXVpcmVkRXhwcmVzc2lvbihvUHJvcGVydHlJbmZvLCBvRGF0YUZpZWxkQ29udmVydGVkLCB0cnVlKSxcblx0XHRcdFx0XHRcdFwiZGVmYXVsdFNlbGVjdGlvblBhdGhcIjogc0RhdGFQcm9wZXJ0eVBhdGhcblx0XHRcdFx0XHRcdFx0PyBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0U2VsZWN0aW9uUGF0aENvbWJvQm94KGFDb250ZXh0cywgc0RhdGFQcm9wZXJ0eVBhdGgpXG5cdFx0XHRcdFx0XHRcdDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcImRlZmF1bHRTZWxlY3Rpb25Vbml0UGF0aFwiOiBzVW5pdFByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdFx0XHQ/IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goYUNvbnRleHRzLCBzVW5pdFByb3BlcnR5UGF0aClcblx0XHRcdFx0XHRcdFx0OiBmYWxzZSxcblx0XHRcdFx0XHRcdFwiZW50aXR5U2V0XCI6IHNDdXJyZW50RW50aXR5U2V0TmFtZSxcblx0XHRcdFx0XHRcdFwiZGlzcGxheVwiOiBkaXNwbGF5TW9kZSxcblx0XHRcdFx0XHRcdFwiZGVzY3JpcHRpb25QYXRoXCI6IE1hc3NFZGl0SGVscGVyLmdldFRleHRQYXRoKHNEYXRhUHJvcGVydHlQYXRoLCBvVGV4dEJpbmRpbmcsIGRpc3BsYXlNb2RlKSxcblx0XHRcdFx0XHRcdFwibnVsbGFibGVcIjogb1Byb3BlcnR5SW5mby5udWxsYWJsZSAhPT0gdW5kZWZpbmVkID8gb1Byb3BlcnR5SW5mby5udWxsYWJsZSA6IHRydWUsXG5cdFx0XHRcdFx0XHRcImlzUHJvcGVydHlSZWFkT25seVwiOiBpc1JlYWRPbmx5ICE9PSB1bmRlZmluZWQgPyBpc1JlYWRPbmx5IDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcImlucHV0VHlwZVwiOiBpbnB1dFR5cGUsXG5cdFx0XHRcdFx0XHRcImVkaXRNb2RlXCI6IGVkaXRhYmxlID8gZXhwQmluZGluZyA6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFwidW5pdERhdGFQYXRoXCI6IHNVbml0UHJvcGVydHlQYXRoICYmIFwiZmllbGRzSW5mbz4vdW5pdERhdGEvXCIsXG5cdFx0XHRcdFx0XHRcInZhbHVlc1BhdGhcIjogXCJmaWVsZHNJbmZvPi92YWx1ZXMvXCJcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGFEYXRhQXJyYXkucHVzaChvUmVzdWx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdG9EYXRhRmllbGRNb2RlbC5zZXREYXRhKGFEYXRhQXJyYXkpO1xuXHRcdHJldHVybiBvRGF0YUZpZWxkTW9kZWw7XG5cdH0sXG5cblx0Z2V0VGFibGVGaWVsZHM6IGZ1bmN0aW9uIChvVGFibGU6IGFueSkge1xuXHRcdGNvbnN0IGFDb2x1bW5zID0gKG9UYWJsZSAmJiBvVGFibGUuZ2V0Q29sdW1ucygpKSB8fCBbXTtcblx0XHRjb25zdCBjb2x1bW5zRGF0YSA9IG9UYWJsZSAmJiBvVGFibGUuZ2V0UGFyZW50KCkuZ2V0VGFibGVEZWZpbml0aW9uKCkuY29sdW1ucztcblx0XHRyZXR1cm4gYUNvbHVtbnMubWFwKGZ1bmN0aW9uIChvQ29sdW1uOiBhbnkpIHtcblx0XHRcdGNvbnN0IHNEYXRhUHJvcGVydHkgPSBvQ29sdW1uICYmIG9Db2x1bW4uZ2V0RGF0YVByb3BlcnR5KCksXG5cdFx0XHRcdGFSZWFsdGVkQ29sdW1uSW5mbyA9XG5cdFx0XHRcdFx0Y29sdW1uc0RhdGEgJiZcblx0XHRcdFx0XHRjb2x1bW5zRGF0YS5maWx0ZXIoZnVuY3Rpb24gKG9Db2x1bW5JbmZvOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQ29sdW1uSW5mby5uYW1lID09PSBzRGF0YVByb3BlcnR5ICYmIG9Db2x1bW5JbmZvLnR5cGUgPT09IFwiQW5ub3RhdGlvblwiO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XCJkYXRhUHJvcGVydHlcIjogc0RhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XCJsYWJlbFwiOiBvQ29sdW1uLmdldEhlYWRlcigpLFxuXHRcdFx0XHRcImFubm90YXRpb25QYXRoXCI6IGFSZWFsdGVkQ29sdW1uSW5mbyAmJiBhUmVhbHRlZENvbHVtbkluZm9bMF0gJiYgYVJlYWx0ZWRDb2x1bW5JbmZvWzBdLmFubm90YXRpb25QYXRoXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHR9LFxuXG5cdGdldERlZmF1bHRUZXh0c0ZvckRpYWxvZzogZnVuY3Rpb24gKG9SZXNvdXJjZUJ1bmRsZTogYW55LCBpU2VsZWN0ZWRDb250ZXh0czogYW55LCBvVGFibGU6IGFueSkge1xuXHRcdC8vIFRoZSBjb25maXJtIGJ1dHRvbiB0ZXh0IGlzIFwiU2F2ZVwiIGZvciB0YWJsZSBpbiBEaXNwbGF5IG1vZGUgYW5kIFwiQXBwbHlcIiBmb3IgdGFibGUgaW4gZWRpdCBtb2RlLiBUaGlzIGNhbiBiZSBsYXRlciBleHBvc2VkIGlmIG5lZWRlZC5cblx0XHRjb25zdCBiRGlzcGxheU1vZGUgPSBvVGFibGUuZGF0YShcImRpc3BsYXlNb2RlUHJvcGVydHlCaW5kaW5nXCIpID09PSBcInRydWVcIjtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRcImtlZXBFeGlzdGluZ1ByZWZpeFwiOiBcIjwgS2VlcFwiLFxuXHRcdFx0XCJsZWF2ZUJsYW5rVmFsdWVcIjogXCI8IExlYXZlIEJsYW5rID5cIixcblx0XHRcdFwiY2xlYXJGaWVsZFZhbHVlXCI6IFwiPCBDbGVhciBWYWx1ZXMgPlwiLFxuXHRcdFx0XCJtYXNzRWRpdFRpdGxlXCI6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfRElBTE9HX1RJVExFXCIsIGlTZWxlY3RlZENvbnRleHRzLnRvU3RyaW5nKCkpLFxuXHRcdFx0XCJhcHBseUJ1dHRvblRleHRcIjogYkRpc3BsYXlNb2RlXG5cdFx0XHRcdD8gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9TQVZFX0JVVFRPTl9URVhUXCIpXG5cdFx0XHRcdDogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9BUFBMWV9CVVRUT05fVEVYVFwiKSxcblx0XHRcdFwidXNlVmFsdWVIZWxwVmFsdWVcIjogXCI8IFVzZSBWYWx1ZSBIZWxwID5cIixcblx0XHRcdFwiY2FuY2VsQnV0dG9uVGV4dFwiOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUFTU19FRElUX0NBTkNFTF9CVVRUT05fVEVYVFwiKVxuXHRcdH07XG5cdH0sXG5cblx0LyoqXG5cdCAqIEFkZHMgYSBzdWZmaXggdG8gdGhlICdrZWVwIGV4aXN0aW5nJyBwcm9wZXJ0eSBvZiB0aGUgY29tYm9Cb3guXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzSW5wdXRUeXBlIElucHV0VHlwZSBvZiB0aGUgZmllbGRcblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICovXG5cdGdldFN1ZmZpeEZvcktlZXBFeGlzaXRpbmc6IGZ1bmN0aW9uIChzSW5wdXRUeXBlOiBzdHJpbmcpIHtcblx0XHRsZXQgc1Jlc3VsdCA9IFwiVmFsdWVzXCI7XG5cblx0XHRzd2l0Y2ggKHNJbnB1dFR5cGUpIHtcblx0XHRcdC8vVE9ETyAtIEFkZCBmb3Igb3RoZXIgY29udHJvbCB0eXBlcyBhcyB3ZWxsIChSYWRpbyBCdXR0b24sIEVtYWlsLCBJbnB1dCwgTURDIEZpZWxkcywgSW1hZ2UgZXRjLilcblx0XHRcdGNhc2UgXCJEYXRlUGlja2VyXCI6XG5cdFx0XHRcdHNSZXN1bHQgPSBcIkRhdGVzXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkNoZWNrQm94XCI6XG5cdFx0XHRcdHNSZXN1bHQgPSBcIlNldHRpbmdzXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0c1Jlc3VsdCA9IFwiVmFsdWVzXCI7XG5cdFx0fVxuXHRcdHJldHVybiBzUmVzdWx0O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBBZGRzIGRlZmF1bHQgdmFsdWVzIHRvIHRoZSBtb2RlbCBbS2VlcCBFeGlzdGluZyBWYWx1ZXMsIExlYXZlIEJsYW5rXS5cblx0ICpcblx0ICogQHBhcmFtIHtBcnJheX0gYVZhbHVlcyBBcnJheSBpbnN0YW5jZSB3aGVyZSB0aGUgZGVmYXVsdCBkYXRhIG5lZWRzIHRvIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRGVmYXVsdFZhbHVlcyBEZWZhdWx0IHZhbHVlcyBmcm9tIEFwcGxpY2F0aW9uIE1hbmlmZXN0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvUHJvcGVydHlJbmZvIFByb3BlcnR5IGluZm9ybWF0aW9uXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYlVPTUZpZWxkXG5cdCAqL1xuXHRzZXREZWZhdWx0VmFsdWVzVG9EaWFsb2c6IGZ1bmN0aW9uIChhVmFsdWVzOiBhbnksIGFDb250ZXh0czogYW55W10sIG9EZWZhdWx0VmFsdWVzOiBhbnksIG9Qcm9wZXJ0eUluZm86IGFueSwgYlVPTUZpZWxkPzogYm9vbGVhbikge1xuXHRcdGNvbnN0IHNQcm9wZXJ0eVBhdGggPSBiVU9NRmllbGQgPyBvUHJvcGVydHlJbmZvLnVuaXRQcm9wZXJ0eSA6IG9Qcm9wZXJ0eUluZm8uZGF0YVByb3BlcnR5LFxuXHRcdFx0c0lucHV0VHlwZSA9IG9Qcm9wZXJ0eUluZm8uaW5wdXRUeXBlLFxuXHRcdFx0YlByb3BlcnR5UmVxdWlyZWQgPSBvUHJvcGVydHlJbmZvLmlzRmllbGRSZXF1aXJlZDtcblx0XHRjb25zdCBzU3VmZml4Rm9yS2VlcEV4aXN0aW5nID0gTWFzc0VkaXRIZWxwZXIuZ2V0U3VmZml4Rm9yS2VlcEV4aXNpdGluZyhzSW5wdXRUeXBlKTtcblx0XHRhVmFsdWVzLmRlZmF1bHRPcHRpb25zID0gYVZhbHVlcy5kZWZhdWx0T3B0aW9ucyB8fCBbXTtcblx0XHQvL1RPRE8gLSBBZGQgPDxVc2UgVmFsdWUgSGVscCBvciBjb250cm9sIGltcGxtZW50YXRpb24+PiBhbmQgcmVsYXRlZCBrZXkgYnkgY2hlY2tpbmcgaWYgdmFsdWUgaGVscCBpcyBlbmFibGVkIGZvciBwcm9wZXJ0eSBvciBVbml0LlxuXHRcdC8vVE9ETyAtIEFkZCBvcHRpb24gQXBwbHkgdG8gRW1wdHkgRmllbGRzIG9ubHkgZm9yIEJvdGggVmFsdWUgSGVscCBhbmQgY29udHJvbHMuXG5cdFx0Y29uc3QgYlZhbHVlRXhpc3RzRm9yUHJvcGVydHlQYXRoID0gYUNvbnRleHRzLnNvbWUoZnVuY3Rpb24gKG9TZWxlY3RlZENvbnRleHQ6IGFueSkge1xuXHRcdFx0cmV0dXJuIG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHNQcm9wZXJ0eVBhdGgpO1xuXHRcdH0pO1xuXG5cdFx0aWYgKHNJbnB1dFR5cGUgPT09IFwiQ2hlY2tCb3hcIikge1xuXHRcdFx0Y29uc3QgZmFsc2VFbnRyeSA9IHsgdGV4dDogXCJOb1wiLCBrZXk6IGAke3NQcm9wZXJ0eVBhdGh9L2ZhbHNlYCwgdGV4dEluZm86IHsgdmFsdWU6IGZhbHNlIH0gfTtcblx0XHRcdGNvbnN0IHRydXRoeUVudHJ5ID0geyB0ZXh0OiBcIlllc1wiLCBrZXk6IGAke3NQcm9wZXJ0eVBhdGh9L3RydWVgLCB0ZXh0SW5mbzogeyB2YWx1ZTogdHJ1ZSB9IH07XG5cdFx0XHRhVmFsdWVzLnVuc2hpZnQoZmFsc2VFbnRyeSk7XG5cdFx0XHRhVmFsdWVzLmRlZmF1bHRPcHRpb25zLnVuc2hpZnQoZmFsc2VFbnRyeSk7XG5cdFx0XHRhVmFsdWVzLnVuc2hpZnQodHJ1dGh5RW50cnkpO1xuXHRcdFx0YVZhbHVlcy5kZWZhdWx0T3B0aW9ucy51bnNoaWZ0KHRydXRoeUVudHJ5KTtcblx0XHR9XG5cblx0XHRpZiAob1Byb3BlcnR5SW5mby5pc1ZhbHVlSGVscEVuYWJsZWQgfHwgKG9Qcm9wZXJ0eUluZm8uaXNWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCAmJiBiVU9NRmllbGQpKSB7XG5cdFx0XHRjb25zdCB2aGRFbnRyeSA9IHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMudXNlVmFsdWVIZWxwVmFsdWUsIGtleTogXCJVc2VWYWx1ZUhlbHBWYWx1ZS9cIiArIHNQcm9wZXJ0eVBhdGggfTtcblx0XHRcdGFWYWx1ZXMudW5zaGlmdCh2aGRFbnRyeSk7XG5cdFx0XHRhVmFsdWVzLmRlZmF1bHRPcHRpb25zLnVuc2hpZnQodmhkRW50cnkpO1xuXHRcdH1cblxuXHRcdGlmIChiVmFsdWVFeGlzdHNGb3JQcm9wZXJ0eVBhdGgpIHtcblx0XHRcdGlmIChiUHJvcGVydHlSZXF1aXJlZCAhPT0gXCJ0cnVlXCIgJiYgIWJVT01GaWVsZCkge1xuXHRcdFx0XHRjb25zdCBjbGVhckVudHJ5ID0geyB0ZXh0OiBvRGVmYXVsdFZhbHVlcy5jbGVhckZpZWxkVmFsdWUsIGtleTogXCJDbGVhckZpZWxkVmFsdWUvXCIgKyBzUHJvcGVydHlQYXRoIH07XG5cdFx0XHRcdGFWYWx1ZXMudW5zaGlmdChjbGVhckVudHJ5KTtcblx0XHRcdFx0YVZhbHVlcy5kZWZhdWx0T3B0aW9ucy51bnNoaWZ0KGNsZWFyRW50cnkpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBlbXB0eUVudHJ5ID0geyB0ZXh0OiBvRGVmYXVsdFZhbHVlcy5sZWF2ZUJsYW5rVmFsdWUsIGtleTogXCJFbXB0eS9cIiArIHNQcm9wZXJ0eVBhdGggfTtcblx0XHRcdGFWYWx1ZXMudW5zaGlmdChlbXB0eUVudHJ5KTtcblx0XHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMudW5zaGlmdChlbXB0eUVudHJ5KTtcblx0XHR9XG5cdFx0Y29uc3Qga2VlcEVudHJ5ID0ge1xuXHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMua2VlcEV4aXN0aW5nUHJlZml4ICsgXCIgXCIgKyBzU3VmZml4Rm9yS2VlcEV4aXN0aW5nICsgXCIgPlwiLFxuXHRcdFx0a2V5OiBcIkRlZmF1bHQvXCIgKyBzUHJvcGVydHlQYXRoXG5cdFx0fTtcblx0XHRhVmFsdWVzLnVuc2hpZnQoa2VlcEVudHJ5KTtcblx0XHRhVmFsdWVzLmRlZmF1bHRPcHRpb25zLnVuc2hpZnQoa2VlcEVudHJ5KTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IHRleHQgYXJyYW5nZW1lbnQgaW5mbyBmb3IgYSBjb250ZXh0IHByb3BlcnR5LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgUGF0aFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb25QYXRoIFBhdGggdG8gdGV4dCBhc3NvY2lhdGlvbiBvZiB0aGUgcHJvcGVydHlcblx0ICogQHBhcmFtIHtzdHJpbmd9IGRpc3BsYXlNb2RlIERpc3BsYXkgbW9kZSBvZiB0aGUgcHJvcGVydHkgYW5kIHRleHQgYXNzb2NpYXRpb25cblx0ICogQHBhcmFtIHtDb250ZXh0fSBzZWxlY3RlZENvbnRleHQgQ29udGV4dCB0byBmaW5kIHRoZSBmdWxsIHRleHRcblx0ICogQHJldHVybnMge1RleHRBcnJhbmdlbWVudEluZm99XG5cdCAqL1xuXHRnZXRUZXh0QXJyYW5nZW1lbnRJbmZvOiBmdW5jdGlvbiAoXG5cdFx0cHJvcGVydHk6IHN0cmluZyxcblx0XHRkZXNjcmlwdGlvblBhdGg6IHN0cmluZyxcblx0XHRkaXNwbGF5TW9kZTogc3RyaW5nLFxuXHRcdHNlbGVjdGVkQ29udGV4dDogQ29udGV4dFxuXHQpOiBUZXh0QXJyYW5nZW1lbnRJbmZvIHtcblx0XHRsZXQgdmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHByb3BlcnR5KSxcblx0XHRcdGRlc2NyaXB0aW9uVmFsdWUsXG5cdFx0XHRmdWxsVGV4dDtcblx0XHRpZiAoZGVzY3JpcHRpb25QYXRoICYmIHByb3BlcnR5KSB7XG5cdFx0XHRzd2l0Y2ggKGRpc3BsYXlNb2RlKSB7XG5cdFx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblwiOlxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uVmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KGRlc2NyaXB0aW9uUGF0aCk7XG5cdFx0XHRcdFx0ZnVsbFRleHQgPSBkZXNjcmlwdGlvblZhbHVlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiVmFsdWVcIjpcblx0XHRcdFx0XHR2YWx1ZSA9IHNlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QocHJvcGVydHkpO1xuXHRcdFx0XHRcdGZ1bGxUZXh0ID0gdmFsdWU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJWYWx1ZURlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdFx0dmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHByb3BlcnR5KTtcblx0XHRcdFx0XHRkZXNjcmlwdGlvblZhbHVlID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChkZXNjcmlwdGlvblBhdGgpO1xuXHRcdFx0XHRcdGZ1bGxUZXh0ID0gdmFsdWUgKyBcIiAoXCIgKyBkZXNjcmlwdGlvblZhbHVlICsgXCIpXCI7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblZhbHVlXCI6XG5cdFx0XHRcdFx0dmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHByb3BlcnR5KTtcblx0XHRcdFx0XHRkZXNjcmlwdGlvblZhbHVlID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChkZXNjcmlwdGlvblBhdGgpO1xuXHRcdFx0XHRcdGZ1bGxUZXh0ID0gZGVzY3JpcHRpb25WYWx1ZSArIFwiIChcIiArIHZhbHVlICsgXCIpXCI7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0TG9nLmluZm8oXCJEaXNwbGF5IFByb3BlcnR5IG5vdCBhcHBsaWNhYmxlOiBcIiArIHByb3BlcnR5KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0XCJ0ZXh0QXJyYW5nZW1lbnRcIjogZGlzcGxheU1vZGUsXG5cdFx0XHRcInZhbHVlUGF0aFwiOiBwcm9wZXJ0eSxcblx0XHRcdFwiZGVzY3JpcHRpb25QYXRoXCI6IGRlc2NyaXB0aW9uUGF0aCxcblx0XHRcdFwidmFsdWVcIjogdmFsdWUsXG5cdFx0XHRcImRlc2NyaXB0aW9uXCI6IGRlc2NyaXB0aW9uVmFsdWUsXG5cdFx0XHRcImZ1bGxUZXh0XCI6IGZ1bGxUZXh0XG5cdFx0fTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJuIHRoZSB2aXNpYmlsaXR5IHZhbHV1ZSBmb3IgdGhlIE1hbmFnZWRPYmplY3QgQW55LlxuXHQgKlxuXHQgKiBAcGFyYW0ge0FueVR5cGV9IGFueSBUaGUgTWFuYWdlZE9iamVjdCBBbnkgdG8gYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHZpc2libGUgdmFsdWUgb2YgdGhlIGJpbmRpbmcuXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIG1hc3MgZWRpdCBmaWVsZCBpcyBlZGl0YWJsZS5cblx0ICovXG5cdGlzRWRpdGFibGU6IGZ1bmN0aW9uIChhbnk6IEFueVR5cGUpOiBib29sZWFuIHtcblx0XHRjb25zdCBiaW5kaW5nID0gYW55LmdldEJpbmRpbmcoXCJhbnlcIik7XG5cdFx0Y29uc3QgdmFsdWUgPSAoYmluZGluZyBhcyBhbnkpLmdldEV4dGVybmFsVmFsdWUoKTtcblx0XHRyZXR1cm4gdmFsdWUgPT09IEVkaXRNb2RlLkVkaXRhYmxlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDYWxjdWxhdGUgYW5kIHVwZGF0ZSB0aGUgdmlzaWJpbGl0eSBvZiBtYXNzIGVkaXQgZmllbGQgb24gY2hhbmdlIG9mIHRoZSBNYW5hZ2VkT2JqZWN0IEFueSBiaW5kaW5nLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0pTT05Nb2RlbH0gb0RpYWxvZ0RhdGFNb2RlbCBNb2RlbCB0byBiZSB1c2VkIHJ1bnRpbWUuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhUHJvcGVydHkgRmllbGQgbmFtZS5cblx0ICovXG5cdG9uQ29udGV4dEVkaXRhYmxlQ2hhbmdlOiBmdW5jdGlvbiAob0RpYWxvZ0RhdGFNb2RlbDogSlNPTk1vZGVsLCBkYXRhUHJvcGVydHk6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IG9iamVjdHNGb3JWaXNpYmlsaXR5ID0gb0RpYWxvZ0RhdGFNb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXMvXCIgKyBkYXRhUHJvcGVydHkgKyBcIi9vYmplY3RzRm9yVmlzaWJpbGl0eVwiKSB8fCBbXTtcblx0XHRjb25zdCBlZGl0YWJsZSA9IG9iamVjdHNGb3JWaXNpYmlsaXR5LnNvbWUoTWFzc0VkaXRIZWxwZXIuaXNFZGl0YWJsZSk7XG5cblx0XHRpZiAoZWRpdGFibGUpIHtcblx0XHRcdG9EaWFsb2dEYXRhTW9kZWwuc2V0UHJvcGVydHkoXCIvdmFsdWVzL1wiICsgZGF0YVByb3BlcnR5ICsgXCIvdmlzaWJsZVwiLCBlZGl0YWJsZSk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgTWFuYWdlZCBPYmplY3QgQW55IGZvciB2aXNpYmlsaXR5IG9mIHRoZSBtYXNzIGVkaXQgZmllbGRzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0FueVR5cGV9IG1PVG9Vc2UgVGhlIE1hbmFnZWRPYmplY3QgQW55IHRvIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB2aXNpYmxlIHZhbHVlIG9mIHRoZSBiaW5kaW5nLlxuXHQgKiBAcGFyYW0ge0pTT05Nb2RlbH0gb0RpYWxvZ0RhdGFNb2RlbCBNb2RlbCB0byBiZSB1c2VkIHJ1bnRpbWUuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhUHJvcGVydHkgRmllbGQgbmFtZS5cblx0ICogQHBhcmFtIHthbnl9IHZhbHVlcyBWYWx1ZXMgb2YgdGhlIGZpZWxkLlxuXHQgKi9cblx0dXBkYXRlT25Db250ZXh0Q2hhbmdlOiBmdW5jdGlvbiAobU9Ub1VzZTogQW55VHlwZSwgb0RpYWxvZ0RhdGFNb2RlbDogSlNPTk1vZGVsLCBkYXRhUHJvcGVydHk6IHN0cmluZywgdmFsdWVzOiBhbnkpIHtcblx0XHRjb25zdCBiaW5kaW5nID0gbU9Ub1VzZS5nZXRCaW5kaW5nKFwiYW55XCIpO1xuXG5cdFx0dmFsdWVzLm9iamVjdHNGb3JWaXNpYmlsaXR5ID0gdmFsdWVzLm9iamVjdHNGb3JWaXNpYmlsaXR5IHx8IFtdO1xuXHRcdHZhbHVlcy5vYmplY3RzRm9yVmlzaWJpbGl0eS5wdXNoKG1PVG9Vc2UpO1xuXG5cdFx0YmluZGluZy5hdHRhY2hDaGFuZ2UoTWFzc0VkaXRIZWxwZXIub25Db250ZXh0RWRpdGFibGVDaGFuZ2UuYmluZChudWxsLCBvRGlhbG9nRGF0YU1vZGVsLCBkYXRhUHJvcGVydHkpKTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IGJvdW5kIG9iamVjdCB0byBjYWxjdWxhdGUgdGhlIHZpc2liaWxpdHkgb2YgY29udGV4dHMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7QmluZGluZ0V4cHJlc3Npb248Ym9vbGVhbj4gfCBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj59IGV4cEJpbmRpbmcgQmluZGluZyBTdHJpbmcgb2JqZWN0LlxuXHQgKiBAcGFyYW0ge29iamVjdH0gY29udGV4dCBDb250ZXh0IHRoZSBiaW5kaW5nIHZhbHVlLlxuXHQgKiBAcmV0dXJucyB7QW55VHlwZX0gVGhlIE1hbmFnZWRPYmplY3QgQW55IHRvIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB2aXNpYmxlIHZhbHVlIG9mIHRoZSBiaW5kaW5nLlxuXHQgKi9cblx0Z2V0Qm91bmRPYmplY3Q6IGZ1bmN0aW9uIChleHBCaW5kaW5nOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+IHwgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPHN0cmluZz4sIGNvbnRleHQ6IENvbnRleHQpOiBBbnlUeXBlIHtcblx0XHRjb25zdCBtT1RvVXNlID0gbmV3IEFueSh7IGFueTogZXhwQmluZGluZyB9KTtcblx0XHRjb25zdCBtb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRtT1RvVXNlLnNldE1vZGVsKG1vZGVsKTtcblx0XHRtT1RvVXNlLnNldEJpbmRpbmdDb250ZXh0KGNvbnRleHQpO1xuXG5cdFx0cmV0dXJuIG1PVG9Vc2U7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZmllbGQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7QmluZGluZ0V4cHJlc3Npb248Ym9vbGVhbj4gfCBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj59IGV4cEJpbmRpbmcgQmluZGluZyBTdHJpbmcgb2JqZWN0LlxuXHQgKiBAcGFyYW0ge0pTT05Nb2RlbH0gb0RpYWxvZ0RhdGFNb2RlbCBNb2RlbCB0byBiZSB1c2VkIHJ1bnRpbWUuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhUHJvcGVydHkgRmllbGQgbmFtZS5cblx0ICogQHBhcmFtIHthbnl9IHZhbHVlcyBWYWx1ZXMgb2YgdGhlIGZpZWxkLlxuXHQgKiBAcGFyYW0ge29iamVjdH0gY29udGV4dCBDb250ZXh0IHRoZSBiaW5kaW5nIHZhbHVlLlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBtYXNzIGVkaXQgZmllbGQgaXMgZWRpdGFibGUuXG5cdCAqL1xuXHRnZXRGaWVsZFZpc2libGl0eTogZnVuY3Rpb24gKFxuXHRcdGV4cEJpbmRpbmc6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4gfCBFeHByZXNzaW9uT3JQcmltaXRpdmU8c3RyaW5nPixcblx0XHRvRGlhbG9nRGF0YU1vZGVsOiBKU09OTW9kZWwsXG5cdFx0ZGF0YVByb3BlcnR5OiBzdHJpbmcsXG5cdFx0dmFsdWVzOiBhbnksXG5cdFx0Y29udGV4dDogQ29udGV4dFxuXHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBtT1RvVXNlID0gTWFzc0VkaXRIZWxwZXIuZ2V0Qm91bmRPYmplY3QoZXhwQmluZGluZywgY29udGV4dCk7XG5cdFx0Y29uc3QgaXNDb250ZXh0RWRpdGFibGUgPSBNYXNzRWRpdEhlbHBlci5pc0VkaXRhYmxlKG1PVG9Vc2UpO1xuXG5cdFx0aWYgKCFpc0NvbnRleHRFZGl0YWJsZSkge1xuXHRcdFx0TWFzc0VkaXRIZWxwZXIudXBkYXRlT25Db250ZXh0Q2hhbmdlKG1PVG9Vc2UsIG9EaWFsb2dEYXRhTW9kZWwsIGRhdGFQcm9wZXJ0eSwgdmFsdWVzKTtcblx0XHR9XG5cdFx0cmV0dXJuIGlzQ29udGV4dEVkaXRhYmxlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyBhIHJ1bnRpbWUgbW9kZWw6XG5cdCAqID0+IFRoZSBtb2RlbCBjb25zaXN0cyBvZiB2YWx1ZXMgc2hvd24gaW4gdGhlIGNvbWJvQm94IG9mIHRoZSBkaWFsb2cgKExlYXZlIEJsYW5rLCBLZWVwIEV4aXN0aW5nIFZhbHVlcywgb3IgYW55IHByb3BlcnR5IHZhbHVlIGZvciB0aGUgc2VsZWN0ZWQgY29udGV4dCwgZXRjLilcblx0ICogPT4gVGhlIG1vZGVsIHdpbGwgY2FwdHVyZSBydW50aW1lIGNoYW5nZXMgaW4gdGhlIHJlc3VsdHMgcHJvcGVydHkgKHRoZSB2YWx1ZSBlbnRlcmVkIGluIHRoZSBjb21ib0JveCkuXG5cdCAqXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFEYXRhQXJyYXkgQXJyYXkgY29udGFpbmluZyBkYXRhIHJlbGF0ZWQgdG8gdGhlIGRpYWxvZyB1c2VkIGJ5IGJvdGggdGhlIHN0YXRpYyBhbmQgdGhlIHJ1bnRpbWUgbW9kZWxcblx0ICogQHBhcmFtIHtvYmplY3R9IG9EZWZhdWx0VmFsdWVzIERlZmF1bHQgdmFsdWVzIGZyb20gaTE4blxuXHQgKiBAcGFyYW0ge0NvbnRleHR9IGRpYWxvZ0NvbnRleHQgVHJhbnNpZW50IGNvbnRleHQgZm9yIG1hc3MgZWRpdCBkaWFsb2cuXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9XG5cdCAqL1xuXHRzZXRSdW50aW1lTW9kZWxPbkRpYWxvZzogZnVuY3Rpb24gKGFDb250ZXh0czogYW55W10sIGFEYXRhQXJyYXk6IGFueVtdLCBvRGVmYXVsdFZhbHVlczogYW55LCBkaWFsb2dDb250ZXh0OiBDb250ZXh0KSB7XG5cdFx0Y29uc3QgYVZhbHVlczogYW55W10gPSBbXTtcblx0XHRjb25zdCBhVW5pdERhdGE6IGFueVtdID0gW107XG5cdFx0Y29uc3QgYVJlc3VsdHM6IGFueVtdID0gW107XG5cdFx0Y29uc3QgYVJlYWRPbmx5RmllbGRJbmZvOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IG9EYXRhID0ge1xuXHRcdFx0XCJ2YWx1ZXNcIjogYVZhbHVlcyxcblx0XHRcdFwidW5pdERhdGFcIjogYVVuaXREYXRhLFxuXHRcdFx0XCJyZXN1bHRzXCI6IGFSZXN1bHRzLFxuXHRcdFx0XCJyZWFkYWJsZVByb3BlcnR5RGF0YVwiOiBhUmVhZE9ubHlGaWVsZEluZm8sXG5cdFx0XHRcInNlbGVjdGVkS2V5XCI6IHVuZGVmaW5lZFxuXHRcdH07XG5cdFx0Y29uc3Qgb0RpYWxvZ0RhdGFNb2RlbCA9IG5ldyBKU09OTW9kZWwob0RhdGEpO1xuXHRcdGFEYXRhQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAob0RhdGE6IGFueSkge1xuXHRcdFx0bGV0IG9UZXh0SW5mbztcblx0XHRcdGxldCBzUHJvcGVydHlLZXk7XG5cdFx0XHRsZXQgc1VuaXRQcm9wZXJ0eU5hbWU7XG5cdFx0XHRjb25zdCBvRGlzdGluY3RWYWx1ZU1hcDogYW55ID0ge307XG5cdFx0XHRjb25zdCBvRGlzdGluY3RVbml0TWFwOiBhbnkgPSB7fTtcblx0XHRcdGlmIChvRGF0YS5kYXRhUHJvcGVydHkgJiYgb0RhdGEuZGF0YVByb3BlcnR5LmluZGV4T2YoXCIvXCIpID4gLTEpIHtcblx0XHRcdFx0Y29uc3QgYUZpbmFsUGF0aCA9IE1hc3NFZGl0SGVscGVyLmluaXRMYXN0TGV2ZWxPZlByb3BlcnR5UGF0aChvRGF0YS5kYXRhUHJvcGVydHksIGFWYWx1ZXMgLyosIGRpYWxvZ0NvbnRleHQgKi8pO1xuXHRcdFx0XHRjb25zdCBhUHJvcGVydHlQYXRocyA9IG9EYXRhLmRhdGFQcm9wZXJ0eS5zcGxpdChcIi9cIik7XG5cblx0XHRcdFx0Zm9yIChjb25zdCBjb250ZXh0IG9mIGFDb250ZXh0cykge1xuXHRcdFx0XHRcdGNvbnN0IHNNdWx0aUxldmVsUGF0aFZhbHVlID0gY29udGV4dC5nZXRPYmplY3Qob0RhdGEuZGF0YVByb3BlcnR5KTtcblx0XHRcdFx0XHRzUHJvcGVydHlLZXkgPSBvRGF0YS5kYXRhUHJvcGVydHkgKyBcIi9cIiArIHNNdWx0aUxldmVsUGF0aFZhbHVlO1xuXHRcdFx0XHRcdGlmICghb0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSAmJiBhRmluYWxQYXRoW2FQcm9wZXJ0eVBhdGhzW2FQcm9wZXJ0eVBhdGhzLmxlbmd0aCAtIDFdXSkge1xuXHRcdFx0XHRcdFx0b1RleHRJbmZvID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyhcblx0XHRcdFx0XHRcdFx0b0RhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRvRGF0YS5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0XHRcdG9EYXRhLmRpc3BsYXksXG5cdFx0XHRcdFx0XHRcdGNvbnRleHRcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRhRmluYWxQYXRoW2FQcm9wZXJ0eVBhdGhzW2FQcm9wZXJ0eVBhdGhzLmxlbmd0aCAtIDFdXS5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XCJ0ZXh0XCI6IChvVGV4dEluZm8gJiYgb1RleHRJbmZvLmZ1bGxUZXh0KSB8fCBzTXVsdGlMZXZlbFBhdGhWYWx1ZSxcblx0XHRcdFx0XHRcdFx0XCJrZXlcIjogc1Byb3BlcnR5S2V5LFxuXHRcdFx0XHRcdFx0XHRcInRleHRJbmZvXCI6IG9UZXh0SW5mb1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldID0gc011bHRpTGV2ZWxQYXRoVmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIGlmIChPYmplY3Qua2V5cyhvRGlzdGluY3RWYWx1ZU1hcCkubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdC8vIFx0ZGlhbG9nQ29udGV4dC5zZXRQcm9wZXJ0eShvRGF0YS5kYXRhUHJvcGVydHksIHNQcm9wZXJ0eUtleSAmJiBvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldKTtcblx0XHRcdFx0Ly8gfVxuXG5cdFx0XHRcdGFGaW5hbFBhdGhbYVByb3BlcnR5UGF0aHNbYVByb3BlcnR5UGF0aHMubGVuZ3RoIC0gMV1dLnRleHRJbmZvID0ge1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uUGF0aDogb0RhdGEuZGVzY3JpcHRpb25QYXRoLFxuXHRcdFx0XHRcdHZhbHVlUGF0aDogb0RhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdGRpc3BsYXlNb2RlOiBvRGF0YS5kaXNwbGF5XG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0gPSBhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0gfHwgW107XG5cdFx0XHRcdGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0gPSBhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV1bXCJzZWxlY3RPcHRpb25zXCJdIHx8IFtdO1xuXHRcdFx0XHRpZiAob0RhdGEudW5pdFByb3BlcnR5KSB7XG5cdFx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0gPSBhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XSB8fCBbXTtcblx0XHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0gPSBhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0gfHwgW107XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9yIChjb25zdCBjb250ZXh0IG9mIGFDb250ZXh0cykge1xuXHRcdFx0XHRcdGNvbnN0IG9EYXRhT2JqZWN0ID0gY29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRzUHJvcGVydHlLZXkgPSBvRGF0YS5kYXRhUHJvcGVydHkgKyBcIi9cIiArIG9EYXRhT2JqZWN0W29EYXRhLmRhdGFQcm9wZXJ0eV07XG5cdFx0XHRcdFx0aWYgKG9EYXRhLmRhdGFQcm9wZXJ0eSAmJiBvRGF0YU9iamVjdFtvRGF0YS5kYXRhUHJvcGVydHldICYmICFvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldKSB7XG5cdFx0XHRcdFx0XHRpZiAob0RhdGEuaW5wdXRUeXBlICE9IFwiQ2hlY2tCb3hcIikge1xuXHRcdFx0XHRcdFx0XHRvVGV4dEluZm8gPSBNYXNzRWRpdEhlbHBlci5nZXRUZXh0QXJyYW5nZW1lbnRJbmZvKFxuXHRcdFx0XHRcdFx0XHRcdG9EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0XHRvRGF0YS5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0XHRcdFx0b0RhdGEuZGlzcGxheSxcblx0XHRcdFx0XHRcdFx0XHRjb250ZXh0XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGVudHJ5ID0ge1xuXHRcdFx0XHRcdFx0XHRcdFwidGV4dFwiOiAob1RleHRJbmZvICYmIG9UZXh0SW5mby5mdWxsVGV4dCkgfHwgb0RhdGFPYmplY3Rbb0RhdGEuZGF0YVByb3BlcnR5XSxcblx0XHRcdFx0XHRcdFx0XHRcImtleVwiOiBzUHJvcGVydHlLZXksXG5cdFx0XHRcdFx0XHRcdFx0XCJ0ZXh0SW5mb1wiOiBvVGV4dEluZm9cblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0YVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldLnB1c2goZW50cnkpO1xuXHRcdFx0XHRcdFx0XHRhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV1bXCJzZWxlY3RPcHRpb25zXCJdLnB1c2goZW50cnkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0b0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSA9IG9EYXRhT2JqZWN0W29EYXRhLmRhdGFQcm9wZXJ0eV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChvRGF0YS51bml0UHJvcGVydHkgJiYgb0RhdGFPYmplY3Rbb0RhdGEudW5pdFByb3BlcnR5XSkge1xuXHRcdFx0XHRcdFx0c1VuaXRQcm9wZXJ0eU5hbWUgPSBvRGF0YS51bml0UHJvcGVydHkgKyBcIi9cIiArIG9EYXRhT2JqZWN0W29EYXRhLnVuaXRQcm9wZXJ0eV07XG5cdFx0XHRcdFx0XHRpZiAoIW9EaXN0aW5jdFVuaXRNYXBbc1VuaXRQcm9wZXJ0eU5hbWVdKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChvRGF0YS5pbnB1dFR5cGUgIT0gXCJDaGVja0JveFwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0b1RleHRJbmZvID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyhcblx0XHRcdFx0XHRcdFx0XHRcdG9EYXRhLnVuaXRQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0XHRcdG9EYXRhLmRlc2NyaXB0aW9uUGF0aCxcblx0XHRcdFx0XHRcdFx0XHRcdG9EYXRhLmRpc3BsYXksXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCB1bml0RW50cnkgPSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcInRleHRcIjogKG9UZXh0SW5mbyAmJiBvVGV4dEluZm8uZnVsbFRleHQpIHx8IG9EYXRhT2JqZWN0W29EYXRhLnVuaXRQcm9wZXJ0eV0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcImtleVwiOiBzVW5pdFByb3BlcnR5TmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFwidGV4dEluZm9cIjogb1RleHRJbmZvXG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XS5wdXNoKHVuaXRFbnRyeSk7XG5cdFx0XHRcdFx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV1bXCJzZWxlY3RPcHRpb25zXCJdLnB1c2godW5pdEVudHJ5KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRvRGlzdGluY3RVbml0TWFwW3NVbml0UHJvcGVydHlOYW1lXSA9IG9EYXRhT2JqZWN0W29EYXRhLnVuaXRQcm9wZXJ0eV07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XS50ZXh0SW5mbyA9IHtcblx0XHRcdFx0XHRkZXNjcmlwdGlvblBhdGg6IG9EYXRhLmRlc2NyaXB0aW9uUGF0aCxcblx0XHRcdFx0XHR2YWx1ZVBhdGg6IG9EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRkaXNwbGF5TW9kZTogb0RhdGEuZGlzcGxheVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9EaXN0aW5jdFZhbHVlTWFwKS5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0ZGlhbG9nQ29udGV4dC5zZXRQcm9wZXJ0eShvRGF0YS5kYXRhUHJvcGVydHksIHNQcm9wZXJ0eUtleSAmJiBvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldKTtcblx0XHRcdH1cblx0XHRcdGlmIChPYmplY3Qua2V5cyhvRGlzdGluY3RVbml0TWFwKS5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0ZGlhbG9nQ29udGV4dC5zZXRQcm9wZXJ0eShvRGF0YS51bml0UHJvcGVydHksIHNVbml0UHJvcGVydHlOYW1lICYmIG9EaXN0aW5jdFVuaXRNYXBbc1VuaXRQcm9wZXJ0eU5hbWVdKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRhRGF0YUFycmF5LmZvckVhY2goZnVuY3Rpb24gKG9EYXRhOiBhbnkpIHtcblx0XHRcdGxldCB2YWx1ZXM6IGFueSA9IHt9O1xuXHRcdFx0aWYgKG9EYXRhLmRhdGFQcm9wZXJ0eS5pbmRleE9mKFwiL1wiKSA+IC0xKSB7XG5cdFx0XHRcdGNvbnN0IHNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZSA9IE1hc3NFZGl0SGVscGVyLmdldFZhbHVlRm9yTXVsdGlMZXZlbFBhdGgob0RhdGEuZGF0YVByb3BlcnR5LCBhVmFsdWVzKTtcblx0XHRcdFx0aWYgKCFzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWUpIHtcblx0XHRcdFx0XHRzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWUucHVzaCh7IHRleHQ6IG9EZWZhdWx0VmFsdWVzLmxlYXZlQmxhbmtWYWx1ZSwga2V5OiBcIkVtcHR5L1wiICsgb0RhdGEuZGF0YVByb3BlcnR5IH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdE1hc3NFZGl0SGVscGVyLnNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZyhzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWUsIGFDb250ZXh0cywgb0RlZmF1bHRWYWx1ZXMsIG9EYXRhKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR2YWx1ZXMgPSBzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWU7XG5cdFx0XHR9IGVsc2UgaWYgKGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XSkge1xuXHRcdFx0XHRhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0gPSBhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0gfHwgW107XG5cdFx0XHRcdE1hc3NFZGl0SGVscGVyLnNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZyhhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0sIGFDb250ZXh0cywgb0RlZmF1bHRWYWx1ZXMsIG9EYXRhKTtcblx0XHRcdFx0dmFsdWVzID0gYVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0gJiYgYVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0ubGVuZ3RoKSB7XG5cdFx0XHRcdE1hc3NFZGl0SGVscGVyLnNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZyhhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XSwgYUNvbnRleHRzLCBvRGVmYXVsdFZhbHVlcywgb0RhdGEsIHRydWUpO1xuXHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XS50ZXh0SW5mbyA9IHt9O1xuXHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XS5zZWxlY3RlZEtleSA9IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goYUNvbnRleHRzLCBvRGF0YS51bml0UHJvcGVydHkpO1xuXHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XS5pbnB1dFR5cGUgPSBvRGF0YS5pbnB1dFR5cGU7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHQob0RhdGEuZGF0YVByb3BlcnR5ICYmIGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XSAmJiAhYVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldLmxlbmd0aCkgfHxcblx0XHRcdFx0KG9EYXRhLnVuaXRQcm9wZXJ0eSAmJiBhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XSAmJiAhYVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0ubGVuZ3RoKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnN0IGJDbGVhckZpZWxkT3JCbGFua1ZhbHVlRXhpc3RzID1cblx0XHRcdFx0XHRhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0gJiZcblx0XHRcdFx0XHRhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0uc29tZShmdW5jdGlvbiAob2JqOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvYmoudGV4dCA9PT0gXCI8IENsZWFyIFZhbHVlcyA+XCIgfHwgb2JqLnRleHQgPT09IFwiPCBMZWF2ZSBCbGFuayA+XCI7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChvRGF0YS5kYXRhUHJvcGVydHkgJiYgIWJDbGVhckZpZWxkT3JCbGFua1ZhbHVlRXhpc3RzKSB7XG5cdFx0XHRcdFx0YVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldLnB1c2goeyB0ZXh0OiBvRGVmYXVsdFZhbHVlcy5sZWF2ZUJsYW5rVmFsdWUsIGtleTogXCJFbXB0eS9cIiArIG9EYXRhLmRhdGFQcm9wZXJ0eSB9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBiQ2xlYXJGaWVsZE9yQmxhbmtVbml0VmFsdWVFeGlzdHMgPVxuXHRcdFx0XHRcdGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldICYmXG5cdFx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0uc29tZShmdW5jdGlvbiAob2JqOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvYmoudGV4dCA9PT0gXCI8IENsZWFyIFZhbHVlcyA+XCIgfHwgb2JqLnRleHQgPT09IFwiPCBMZWF2ZSBCbGFuayA+XCI7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChvRGF0YS51bml0UHJvcGVydHkpIHtcblx0XHRcdFx0XHRpZiAoIWJDbGVhckZpZWxkT3JCbGFua1VuaXRWYWx1ZUV4aXN0cykge1xuXHRcdFx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0ucHVzaCh7XG5cdFx0XHRcdFx0XHRcdHRleHQ6IG9EZWZhdWx0VmFsdWVzLmxlYXZlQmxhbmtWYWx1ZSxcblx0XHRcdFx0XHRcdFx0a2V5OiBcIkVtcHR5L1wiICsgb0RhdGEudW5pdFByb3BlcnR5XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0udGV4dEluZm8gPSB7fTtcblx0XHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XS5zZWxlY3RlZEtleSA9IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goXG5cdFx0XHRcdFx0XHRhQ29udGV4dHMsXG5cdFx0XHRcdFx0XHRvRGF0YS51bml0UHJvcGVydHlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldLmlucHV0VHlwZSA9IG9EYXRhLmlucHV0VHlwZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG9EYXRhLmlzUHJvcGVydHlSZWFkT25seSAmJiB0eXBlb2Ygb0RhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5ID09PSBcImJvb2xlYW5cIikge1xuXHRcdFx0XHRhUmVhZE9ubHlGaWVsZEluZm8ucHVzaCh7IFwicHJvcGVydHlcIjogb0RhdGEuZGF0YVByb3BlcnR5LCB2YWx1ZTogb0RhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5LCB0eXBlOiBcIkRlZmF1bHRcIiB9KTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdG9EYXRhLmlzUHJvcGVydHlSZWFkT25seSAmJlxuXHRcdFx0XHRvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHMgJiZcblx0XHRcdFx0b0RhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5Lm9wZXJhbmRzWzBdICYmXG5cdFx0XHRcdG9EYXRhLmlzUHJvcGVydHlSZWFkT25seS5vcGVyYW5kc1swXS5vcGVyYW5kMSAmJlxuXHRcdFx0XHRvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDJcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBUaGlzIG5lZWRzIHRvIGJlIHJlZmFjdG9yZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBSZWFkT25seUV4cHJlc3Npb24gY2hhbmdlXG5cdFx0XHRcdGFSZWFkT25seUZpZWxkSW5mby5wdXNoKHtcblx0XHRcdFx0XHRcInByb3BlcnR5XCI6IG9EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRwcm9wZXJ0eVBhdGg6IG9EYXRhLmlzUHJvcGVydHlSZWFkT25seS5vcGVyYW5kc1swXS5vcGVyYW5kMS5wYXRoLFxuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWU6IG9EYXRhLmlzUHJvcGVydHlSZWFkT25seS5vcGVyYW5kc1swXS5vcGVyYW5kMi52YWx1ZSxcblx0XHRcdFx0XHR0eXBlOiBcIlBhdGhcIlxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0dGluZyB2aXNiaWxpdHkgb2YgdGhlIG1hc3MgZWRpdCBmaWVsZC5cblx0XHRcdGlmIChvRGF0YS5lZGl0TW9kZSkge1xuXHRcdFx0XHR2YWx1ZXMudmlzaWJsZSA9XG5cdFx0XHRcdFx0b0RhdGEuZWRpdE1vZGUgPT09IEVkaXRNb2RlLkVkaXRhYmxlIHx8XG5cdFx0XHRcdFx0YUNvbnRleHRzLnNvbWUoXG5cdFx0XHRcdFx0XHRNYXNzRWRpdEhlbHBlci5nZXRGaWVsZFZpc2libGl0eS5iaW5kKE1hc3NFZGl0SGVscGVyLCBvRGF0YS5lZGl0TW9kZSwgb0RpYWxvZ0RhdGFNb2RlbCwgb0RhdGEuZGF0YVByb3BlcnR5LCB2YWx1ZXMpXG5cdFx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhbHVlcy52aXNpYmxlID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHZhbHVlcy5zZWxlY3RlZEtleSA9IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goYUNvbnRleHRzLCBvRGF0YS5kYXRhUHJvcGVydHkpO1xuXHRcdFx0dmFsdWVzLmlucHV0VHlwZSA9IG9EYXRhLmlucHV0VHlwZTtcblx0XHRcdHZhbHVlcy51bml0UHJvcGVydHkgPSBvRGF0YS51bml0UHJvcGVydHk7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gb0RpYWxvZ0RhdGFNb2RlbDtcblx0fSxcblx0LyoqXG5cdCAqIEdldHMgdHJhbnNpZW50IGNvbnRleHQgZm9yIGRpYWxvZy5cblx0ICpcblx0ICogQHBhcmFtIHtUYWJsZX0gdGFibGUgSW5zdGFuY2Ugb2YgVGFibGUuXG5cdCAqIEBwYXJhbSB7RGlhbG9nfSBkaWFsb2cgTWFzcyBFZGl0IERpYWxvZy5cblx0ICogQHJldHVybnMge29iamVjdH0gUHJvbWlzZSByZXR1cm5pbmcgaW5zdGFuY2Ugb2YgZGlhbG9nLlxuXHQgKi9cblx0Z2V0RGlhbG9nQ29udGV4dDogZnVuY3Rpb24gKHRhYmxlOiBUYWJsZSwgZGlhbG9nPzogRGlhbG9nKTogQ29udGV4dCB7XG5cdFx0bGV0IHRyYW5zQ3R4OiBDb250ZXh0ID0gKGRpYWxvZyAmJiBkaWFsb2cuZ2V0QmluZGluZ0NvbnRleHQoKSkgYXMgQ29udGV4dDtcblxuXHRcdGlmICghdHJhbnNDdHgpIHtcblx0XHRcdGNvbnN0IG1vZGVsID0gdGFibGUuZ2V0TW9kZWwoKTtcblx0XHRcdGNvbnN0IGxpc3RCaW5kaW5nID0gdGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdFx0Y29uc3QgdHJhbnNpZW50TGlzdEJpbmRpbmcgPSBtb2RlbC5iaW5kTGlzdChsaXN0QmluZGluZy5nZXRQYXRoKCksIGxpc3RCaW5kaW5nLmdldENvbnRleHQoKSwgW10sIFtdLCB7XG5cdFx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCJzdWJtaXRMYXRlclwiXG5cdFx0XHR9KSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHRcdFx0KHRyYW5zaWVudExpc3RCaW5kaW5nIGFzIGFueSkucmVmcmVzaEludGVybmFsID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHQvKiAqL1xuXHRcdFx0fTtcblx0XHRcdHRyYW5zQ3R4ID0gdHJhbnNpZW50TGlzdEJpbmRpbmcuY3JlYXRlKHt9LCB0cnVlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJhbnNDdHg7XG5cdH0sXG5cblx0b25EaWFsb2dPcGVuOiBmdW5jdGlvbiAoZXZlbnQ6IGFueSk6IHZvaWQge1xuXHRcdGNvbnN0IHNvdXJjZSA9IGV2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IGZpZWxkc0luZm9Nb2RlbCA9IHNvdXJjZS5nZXRNb2RlbChcImZpZWxkc0luZm9cIik7XG5cdFx0ZmllbGRzSW5mb01vZGVsLnNldFByb3BlcnR5KFwiL2lzT3BlblwiLCB0cnVlKTtcblx0fSxcblxuXHQvKipcblx0ICogQ3JlYXRlIHRoZSBtYXNzIGVkaXQgZGlhbG9nLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1RhYmxlIEluc3RhbmNlIG9mIFRhYmxlXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udHJvbGxlciBDb250cm9sbGVyIGZvciB0aGUgdmlld1xuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBQcm9taXNlIHJldHVybmluZyBpbnN0YW5jZSBvZiBkaWFsb2cuXG5cdCAqL1xuXHRjcmVhdGVEaWFsb2c6IGZ1bmN0aW9uIChvVGFibGU6IFRhYmxlLCBhQ29udGV4dHM6IGFueVtdLCBvQ29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIpIHtcblx0XHRjb25zdCBzRnJhZ21lbnROYW1lID0gXCJzYXAvZmUvY29yZS9jb250cm9scy9tYXNzRWRpdC9NYXNzRWRpdERpYWxvZ1wiLFxuXHRcdFx0YURhdGFBcnJheTogYW55W10gPSBbXSxcblx0XHRcdG9SZXNvdXJjZUJ1bmRsZSA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIiksXG5cdFx0XHRvRGVmYXVsdFZhbHVlcyA9IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRUZXh0c0ZvckRpYWxvZyhvUmVzb3VyY2VCdW5kbGUsIGFDb250ZXh0cy5sZW5ndGgsIG9UYWJsZSksXG5cdFx0XHRvRGF0YUZpZWxkTW9kZWwgPSBNYXNzRWRpdEhlbHBlci5wcmVwYXJlRGF0YUZvckRpYWxvZyhvVGFibGUsIGFDb250ZXh0cywgYURhdGFBcnJheSksXG5cdFx0XHRkaWFsb2dDb250ZXh0ID0gTWFzc0VkaXRIZWxwZXIuZ2V0RGlhbG9nQ29udGV4dChvVGFibGUpLFxuXHRcdFx0b0RpYWxvZ0RhdGFNb2RlbCA9IE1hc3NFZGl0SGVscGVyLnNldFJ1bnRpbWVNb2RlbE9uRGlhbG9nKGFDb250ZXh0cywgYURhdGFBcnJheSwgb0RlZmF1bHRWYWx1ZXMsIGRpYWxvZ0NvbnRleHQpO1xuXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkKSB7XG5cdFx0XHRjb25zdCBvRnJhZ21lbnQgPSBYTUxUZW1wbGF0ZVByb2Nlc3Nvci5sb2FkVGVtcGxhdGUoc0ZyYWdtZW50TmFtZSwgXCJmcmFnbWVudFwiKTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoXG5cdFx0XHRcdFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKFxuXHRcdFx0XHRcdG9GcmFnbWVudCxcblx0XHRcdFx0XHR7IG5hbWU6IHNGcmFnbWVudE5hbWUgfSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRiaW5kaW5nQ29udGV4dHM6IHtcblx0XHRcdFx0XHRcdFx0ZGF0YUZpZWxkTW9kZWw6IG9EYXRhRmllbGRNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIilcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XHRcdFx0ZGF0YUZpZWxkTW9kZWw6IG9EYXRhRmllbGRNb2RlbFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0KVxuXHRcdFx0KVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAob0ZyYWdtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gRnJhZ21lbnQubG9hZCh7IGRlZmluaXRpb246IG9GcmFnbWVudCB9KS50aGVuKGZ1bmN0aW9uIChvRGlhbG9nQ29udGVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBEcmFmdFN0YXR1cyA9IEZFTGlicmFyeS5EcmFmdFN0YXR1cztcblx0XHRcdFx0XHRcdGNvbnN0IG9EaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdFx0XHRcdFx0dGl0bGU6IG9EZWZhdWx0VmFsdWVzLm1hc3NFZGl0VGl0bGUsXG5cdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IFtvRGlhbG9nQ29udGVudF0sXG5cdFx0XHRcdFx0XHRcdGFmdGVyT3BlbjogTWFzc0VkaXRIZWxwZXIub25EaWFsb2dPcGVuLFxuXHRcdFx0XHRcdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMuYXBwbHlCdXR0b25UZXh0LFxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdChvQ29udHJvbGxlci5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQpPy5zZXRQcm9wZXJ0eShcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJza2lwUGF0Y2hIYW5kbGVyc1wiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0RpYWxvZyA9IG9FdmVudC5nZXRTb3VyY2UoKS5nZXRQYXJlbnQoKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9EaWFsb2cuZ2V0TW9kZWwoXCJmaWVsZHNJbmZvXCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYVJlc3VsdHMgPSBvTW9kZWwuZ2V0UHJvcGVydHkoXCIvcmVzdWx0c1wiKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFQcm9wZXJ0eVJlYWRhYmxlSW5mbyA9IG9Nb2RlbC5nZXRQcm9wZXJ0eShcIi9yZWFkYWJsZVByb3BlcnR5RGF0YVwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNoYW5nZVByb21pc2U6IGFueVtdID0gW107XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgYlJlYWRPbmx5RmllbGQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBncm91cElkO1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly9sZXQgaW5kZXggPSAwO1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IGVycm9yVmFsdWVzOiBhbnlbXSA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0YUNvbnRleHRzLmZvckVhY2goZnVuY3Rpb24gKG9TZWxlY3RlZENvbnRleHQ6IGFueSwgaWR4OiBudW1iZXIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YVJlc3VsdHMuZm9yRWFjaChmdW5jdGlvbiAob1Jlc3VsdDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9UT0RPIC0gQWRkIHNhdmUgaW1wbGVtZW50YXRpb24gZm9yIFZhbHVlIEhlbHAuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFQcm9wZXJ0eVJlYWRhYmxlSW5mbykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YlJlYWRPbmx5RmllbGQgPSBhUHJvcGVydHlSZWFkYWJsZUluZm8uc29tZShmdW5jdGlvbiAob1Byb3BlcnR5SW5mbzogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvUmVzdWx0LmtleVZhbHVlID09PSBvUHJvcGVydHlJbmZvLnByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9Qcm9wZXJ0eUluZm8udHlwZSA9PT0gXCJEZWZhdWx0XCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvUHJvcGVydHlJbmZvLnZhbHVlID09PSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUHJvcGVydHlJbmZvLnR5cGUgPT09IFwiUGF0aFwiICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUHJvcGVydHlJbmZvLnByb3BlcnR5VmFsdWUgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm8ucHJvcGVydHlQYXRoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvU2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChvUHJvcGVydHlJbmZvLnByb3BlcnR5UGF0aCkgPT09XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm8ucHJvcGVydHlWYWx1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRncm91cElkID0gXCIkYXV0by5cIiArIGlkeDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvL2luZGV4ICs9IDE7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIuX2VkaXRGbG93LnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9sZXQgcHJvbWlzZUNvdW50ID0gMDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob1Jlc3VsdC5rZXlWYWx1ZSAmJiBvUmVzdWx0LnZhbHVlICE9PSBcIkRlZmF1bHRcIiAmJiAhYlJlYWRPbmx5RmllbGQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNoYW5nZVByb21pc2UucHVzaChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1NlbGVjdGVkQ29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5zZXRQcm9wZXJ0eShvUmVzdWx0LmtleVZhbHVlLCBvUmVzdWx0LnZhbHVlLCBncm91cElkKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvU2VsZWN0ZWRDb250ZXh0O1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JWYWx1ZXMucHVzaChvU2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdCgpKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIk1hc3MgRWRpdDogU29tZXRoaW5nIHdlbnQgd3JvbmcgaW4gdXBkYXRpbmcgZW50cmllcy5cIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdChQcm9taXNlIGFzIGFueSkuYWxsU2V0dGxlZChjaGFuZ2VQcm9taXNlKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0xpc3RCaW5kaW5nID0gb1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0V4dGVuc2lvbkFQSSA9IG9Db250cm9sbGVyICYmIChvQ29udHJvbGxlci5nZXRFeHRlbnNpb25BUEkoKSBhcyBhbnkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0V4dGVuc2lvbkFQSS5yZWZyZXNoKG9MaXN0QmluZGluZy5nZXRQYXRoKCkpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBzdWJ0aXRsZUNvbHVtbiA9IENvbW1vblV0aWxzLmdldE1lc3NhZ2VDb2x1bW4ob1RhYmxlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgbWVzc2FnZXMgPSBzYXAudWkuZ2V0Q29yZSgpLmdldE1lc3NhZ2VNYW5hZ2VyKCkuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHRzID0gW10gYXMgYW55O1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24gKG1lc3NhZ2U6IGFueSwgaWR4OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG1lc3NhZ2VUYXJnZXRzID0gbWVzc2FnZS5nZXRUYXJnZXRzKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VUYXJnZXRzICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VUYXJnZXRzLmxlbmd0aCA9PT0gMSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlVGFyZ2V0c1swXS5sZW5ndGggJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZS5wZXJzaXN0ZW50ID09PSB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IGJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dCA9IGFDb250ZXh0cy5maW5kKGZ1bmN0aW9uIChvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1lc3NhZ2UuZ2V0VGFyZ2V0KCkuaW5kZXhPZihvQ29udGV4dC5nZXRQYXRoKCkpICE9PSAtMTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dHMucHVzaChib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlLmFkZGl0aW9uYWxUZXh0ID0gYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyBib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHQuZ2V0T2JqZWN0KClbc3VidGl0bGVDb2x1bW5dXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dHMubGVuZ3RoID09PSAwICYmIGVycm9yVmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIuX2VkaXRGbG93LnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHN1Y2Nlc3NUb2FzdCA9IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfU1VDQ0VTU19UT0FTVFwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KHN1Y2Nlc3NUb2FzdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JWYWx1ZXMubGVuZ3RoICsgYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0cy5sZW5ndGggPFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQob1RhYmxlIGFzIGFueSkuZ2V0U2VsZWN0ZWRDb250ZXh0cygpLmxlbmd0aFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Db250cm9sbGVyLl9lZGl0Rmxvdy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlcnJvclZhbHVlcy5sZW5ndGggKyBib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHRzLmxlbmd0aCA9PT1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KG9UYWJsZSBhcyBhbnkpLmdldFNlbGVjdGVkQ29udGV4dHMoKS5sZW5ndGhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvQ29udHJvbGxlci5fZWRpdEZsb3cuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvQ29udHJvbGxlci5fZWRpdEZsb3cuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob0RpYWxvZy5pc09wZW4oKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQob0NvbnRyb2xsZXIuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0KT8uc2V0UHJvcGVydHkoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwic2tpcFBhdGNoSGFuZGxlcnNcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZmFsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRcdGVuZEJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMuY2FuY2VsQnV0dG9uVGV4dCxcblx0XHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvRGlhbG9nID0gb0V2ZW50LmdldFNvdXJjZSgpLmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRjb25zdCBtb2RlbCA9IG9UYWJsZS5nZXRNb2RlbCgpO1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5zZXRNb2RlbChvRGlhbG9nRGF0YU1vZGVsLCBcImZpZWxkc0luZm9cIik7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLnNldE1vZGVsKG1vZGVsKTtcblx0XHRcdFx0XHRcdG9EaWFsb2cuc2V0QmluZGluZ0NvbnRleHQoZGlhbG9nQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKG9EaWFsb2cpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2gocmVqZWN0KTtcblx0XHR9KTtcblx0fVxufTtcblxuZXhwb3J0IGRlZmF1bHQgTWFzc0VkaXRIZWxwZXI7XG4iXX0=
|
|
1006
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hc3NFZGl0SGVscGVyLnRzIl0sIm5hbWVzIjpbIk1hc3NFZGl0SGVscGVyIiwiaW5pdExhc3RMZXZlbE9mUHJvcGVydHlQYXRoIiwic1BhdGgiLCJhVmFsdWVzIiwiYUZpbmFsUGF0aCIsImluZGV4IiwiYVBhdGhzIiwic3BsaXQiLCJzRnVsbFBhdGgiLCJmb3JFYWNoIiwic1Byb3BlcnR5UGF0aCIsImdldFVuaXF1ZVZhbHVlcyIsInNWYWx1ZSIsInNlbGYiLCJ1bmRlZmluZWQiLCJpbmRleE9mIiwiZ2V0VmFsdWVGb3JNdWx0aUxldmVsUGF0aCIsInNEYXRhUHJvcGVydHlQYXRoIiwib1ZhbHVlcyIsImFQcm9wZXJ0eVBhdGhzIiwiUmVzdWx0IiwiZ2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveCIsImFDb250ZXh0cyIsImxlbmd0aCIsIm9TZWxlY3RlZENvbnRleHQiLCJhUHJvcGVydHlWYWx1ZXMiLCJvQ29udGV4dCIsIm9EYXRhT2JqZWN0IiwiZ2V0T2JqZWN0Iiwic011bHRpTGV2ZWxQYXRoQ29uZGl0aW9uIiwiaGFzT3duUHJvcGVydHkiLCJwdXNoIiwiYVVuaXF1ZVByb3BlcnR5VmFsdWVzIiwiZmlsdGVyIiwiZ2V0SGlkZGVuVmFsdWVGb3JDb250ZXh0cyIsImhpZGRlblZhbHVlIiwiJFBhdGgiLCJzb21lIiwiZ2V0SW5wdXRUeXBlIiwicHJvcGVydHlJbmZvIiwiZGF0YUZpZWxkQ29udmVydGVkIiwib0RhdGFNb2RlbFBhdGgiLCJlZGl0U3R5bGVQcm9wZXJ0aWVzIiwiaW5wdXRUeXBlIiwic2V0RWRpdFN0eWxlUHJvcGVydGllcyIsImVkaXRTdHlsZSIsImlzVmFsaWRGb3JNYXNzRWRpdCIsImlzQ29sbGVjdGlvbkZpZWxkIiwiaGFzVmFsdWVIZWxwV2l0aEZpeGVkVmFsdWVzIiwiZ2V0SXNGaWVsZEdycCIsIiRUeXBlIiwiVGFyZ2V0IiwidmFsdWUiLCJnZXRUZXh0UGF0aCIsInByb3BlcnR5IiwidGV4dEJpbmRpbmciLCJkaXNwbGF5TW9kZSIsImRlc2NyaXB0aW9uUGF0aCIsInBhdGgiLCJwYXJhbWV0ZXJzIiwicHJvcHMiLCJwcmVwYXJlRGF0YUZvckRpYWxvZyIsIm9UYWJsZSIsImFEYXRhQXJyYXkiLCJvTWV0YU1vZGVsIiwiZ2V0TW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJzQ3VycmVudEVudGl0eVNldE5hbWUiLCJkYXRhIiwiYVRhYmxlRmllbGRzIiwiZ2V0VGFibGVGaWVsZHMiLCJvRW50aXR5VHlwZUNvbnRleHQiLCJnZXRDb250ZXh0Iiwib0VudGl0eVNldENvbnRleHQiLCJvRGF0YU1vZGVsT2JqZWN0UGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsIm9EYXRhRmllbGRNb2RlbCIsIkpTT05Nb2RlbCIsIm9SZXN1bHQiLCJzTGFiZWxUZXh0IiwiYlZhbHVlSGVscEVuYWJsZWQiLCJzVW5pdFByb3BlcnR5UGF0aCIsImJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCIsIm9UZXh0QmluZGluZyIsIm9Db2x1bW5JbmZvIiwiZGF0YVByb3BlcnR5Iiwib1Byb3BlcnR5SW5mbyIsImxhYmVsIiwidGFyZ2V0T2JqZWN0IiwidGFyZ2V0RW50aXR5VHlwZSIsImVudGl0eVByb3BlcnRpZXMiLCJvUHJvcGVydHkiLCJuYW1lIiwiZ2V0VGV4dEJpbmRpbmciLCJvRmllbGRDb250ZXh0IiwiYW5ub3RhdGlvblBhdGgiLCJvRGF0YUZpZWxkQ29udmVydGVkIiwiY29udmVydE1ldGFNb2RlbENvbnRleHQiLCJvUHJvcGVydHlDb250ZXh0Iiwib0ludGVyZmFjZSIsImdldEludGVyZmFjZSIsIlZhbHVlIiwiZW5oYW5jZURhdGFNb2RlbFBhdGgiLCJiSGlkZGVuRmllbGQiLCJpc0ltYWdlIiwiY29udGV4dCIsImdldFBhdGgiLCJfdHlwZSIsIiR0YXJnZXQiLCJjaGFydFByb3BlcnR5IiwidGVybSIsImlzQWN0aW9uIiwiQWN0aW9uIiwiaXNGaWVsZEdycCIsImhhc1ZhbHVlSGVscCIsImhhc0N1cnJlbmN5IiwiaGFzVW5pdCIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHlQYXRoIiwidW5pdFByb3BlcnR5SW5mbyIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkiLCJwcm9wZXJ0eUZvckZpZWxkQ29udHJvbCIsImV4cEJpbmRpbmciLCJnZXRFZGl0TW9kZSIsImNvbnN0YW50IiwiZWRpdE1vZGVWYWx1ZXMiLCJPYmplY3QiLCJrZXlzIiwiRWRpdE1vZGUiLCJlZGl0TW9kZUlzU3RhdGljIiwiaW5jbHVkZXMiLCJlZGl0YWJsZSIsIkVkaXRhYmxlIiwiaXNSZWFkT25seSIsImlzUmVhZE9ubHlFeHByZXNzaW9uIiwiQ29tbW9uVXRpbHMiLCJjb21wdXRlRGlzcGxheU1vZGUiLCJnZXRSZXF1aXJlZEV4cHJlc3Npb24iLCJudWxsYWJsZSIsInNldERhdGEiLCJhQ29sdW1ucyIsImdldENvbHVtbnMiLCJjb2x1bW5zRGF0YSIsImdldFBhcmVudCIsImdldFRhYmxlRGVmaW5pdGlvbiIsImNvbHVtbnMiLCJtYXAiLCJvQ29sdW1uIiwic0RhdGFQcm9wZXJ0eSIsImdldERhdGFQcm9wZXJ0eSIsImFSZWFsdGVkQ29sdW1uSW5mbyIsInR5cGUiLCJnZXRIZWFkZXIiLCJnZXREZWZhdWx0VGV4dHNGb3JEaWFsb2ciLCJvUmVzb3VyY2VCdW5kbGUiLCJpU2VsZWN0ZWRDb250ZXh0cyIsImJEaXNwbGF5TW9kZSIsImdldFRleHQiLCJ0b1N0cmluZyIsInNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZyIsIm9EZWZhdWx0VmFsdWVzIiwiYlVPTUZpZWxkIiwidW5pdFByb3BlcnR5Iiwic0lucHV0VHlwZSIsImJQcm9wZXJ0eVJlcXVpcmVkIiwiaXNGaWVsZFJlcXVpcmVkIiwic1N1ZmZpeEZvcktlZXBFeGlzdGluZyIsImRlZmF1bHRPcHRpb25zIiwic2VsZWN0T3B0aW9uc0V4aXN0Iiwic2VsZWN0T3B0aW9ucyIsImtlZXBFbnRyeSIsInRleHQiLCJrZWVwRXhpc3RpbmdQcmVmaXgiLCJrZXkiLCJmYWxzZUVudHJ5IiwidGV4dEluZm8iLCJ0cnV0aHlFbnRyeSIsInVuc2hpZnQiLCJpc1ZhbHVlSGVscEVuYWJsZWQiLCJpc1ZhbHVlSGVscEVuYWJsZWRGb3JVbml0IiwidmhkRW50cnkiLCJ1c2VWYWx1ZUhlbHBWYWx1ZSIsImNsZWFyRW50cnkiLCJjbGVhckZpZWxkVmFsdWUiLCJlbXB0eUVudHJ5IiwibGVhdmVCbGFua1ZhbHVlIiwiZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyIsInNlbGVjdGVkQ29udGV4dCIsImRlc2NyaXB0aW9uVmFsdWUiLCJmdWxsVGV4dCIsIkxvZyIsImluZm8iLCJpc0VkaXRhYmxlIiwiYW55IiwiYmluZGluZyIsImdldEJpbmRpbmciLCJnZXRFeHRlcm5hbFZhbHVlIiwib25Db250ZXh0RWRpdGFibGVDaGFuZ2UiLCJvRGlhbG9nRGF0YU1vZGVsIiwib2JqZWN0c0ZvclZpc2liaWxpdHkiLCJnZXRQcm9wZXJ0eSIsInNldFByb3BlcnR5IiwidXBkYXRlT25Db250ZXh0Q2hhbmdlIiwibU9Ub1VzZSIsInZhbHVlcyIsImF0dGFjaENoYW5nZSIsImJpbmQiLCJnZXRCb3VuZE9iamVjdCIsIkFueSIsIm1vZGVsIiwic2V0TW9kZWwiLCJzZXRCaW5kaW5nQ29udGV4dCIsImdldEZpZWxkVmlzaWJsaXR5IiwiaXNDb250ZXh0RWRpdGFibGUiLCJzZXRSdW50aW1lTW9kZWxPbkRpYWxvZyIsImRpYWxvZ0NvbnRleHQiLCJhVW5pdERhdGEiLCJhUmVzdWx0cyIsImFSZWFkT25seUZpZWxkSW5mbyIsIm9EYXRhIiwibm9GaWVsZHMiLCJvSW5EYXRhIiwib1RleHRJbmZvIiwic1Byb3BlcnR5S2V5Iiwic1VuaXRQcm9wZXJ0eU5hbWUiLCJvRGlzdGluY3RWYWx1ZU1hcCIsIm9EaXN0aW5jdFVuaXRNYXAiLCJzTXVsdGlMZXZlbFBhdGhWYWx1ZSIsImRpc3BsYXkiLCJ2YWx1ZVBhdGgiLCJlbnRyeSIsInVuaXRFbnRyeSIsInNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZSIsInNlbGVjdGVkS2V5IiwiYkNsZWFyRmllbGRPckJsYW5rVmFsdWVFeGlzdHMiLCJvYmoiLCJiQ2xlYXJGaWVsZE9yQmxhbmtVbml0VmFsdWVFeGlzdHMiLCJpc1Byb3BlcnR5UmVhZE9ubHkiLCJvcGVyYW5kcyIsIm9wZXJhbmQxIiwib3BlcmFuZDIiLCJwcm9wZXJ0eVBhdGgiLCJwcm9wZXJ0eVZhbHVlIiwiZWRpdE1vZGUiLCJ2aXNpYmxlIiwiZ2V0RGlhbG9nQ29udGV4dCIsInRhYmxlIiwiZGlhbG9nIiwidHJhbnNDdHgiLCJnZXRCaW5kaW5nQ29udGV4dCIsImxpc3RCaW5kaW5nIiwiZ2V0Um93QmluZGluZyIsInRyYW5zaWVudExpc3RCaW5kaW5nIiwiYmluZExpc3QiLCIkJHVwZGF0ZUdyb3VwSWQiLCJyZWZyZXNoSW50ZXJuYWwiLCJjcmVhdGUiLCJvbkRpYWxvZ09wZW4iLCJldmVudCIsInNvdXJjZSIsImdldFNvdXJjZSIsImZpZWxkc0luZm9Nb2RlbCIsImNyZWF0ZURpYWxvZyIsIm9Db250cm9sbGVyIiwic0ZyYWdtZW50TmFtZSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9GcmFnbWVudCIsIlhNTFRlbXBsYXRlUHJvY2Vzc29yIiwibG9hZFRlbXBsYXRlIiwiWE1MUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsImJpbmRpbmdDb250ZXh0cyIsImRhdGFGaWVsZE1vZGVsIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJtb2RlbHMiLCJ0aGVuIiwib0NyZWF0ZWRGcmFnbWVudCIsIkZyYWdtZW50IiwibG9hZCIsImRlZmluaXRpb24iLCJvRGlhbG9nQ29udGVudCIsIkRyYWZ0U3RhdHVzIiwiRkVMaWJyYXJ5Iiwib0RpYWxvZyIsIkRpYWxvZyIsInJlc2l6YWJsZSIsInRpdGxlIiwibWFzc0VkaXRUaXRsZSIsImNvbnRlbnQiLCJhZnRlck9wZW4iLCJiZWdpbkJ1dHRvbiIsIkJ1dHRvbiIsImhlbHBlcnMiLCJnZXRFeHBCaW5kaW5nRm9yQXBwbHlCdXR0b25UeHQiLCJwcmVzcyIsIm9FdmVudCIsImdldFZpZXciLCJvSW5EaWFsb2ciLCJvTW9kZWwiLCJhUHJvcGVydHlSZWFkYWJsZUluZm8iLCJjaGFuZ2VQcm9taXNlIiwiYlJlYWRPbmx5RmllbGQiLCJncm91cElkIiwiZXJyb3JWYWx1ZXMiLCJpZHgiLCJrZXlWYWx1ZSIsIl9lZGl0RmxvdyIsInNldERyYWZ0U3RhdHVzIiwiU2F2aW5nIiwiY2F0Y2giLCJvRXJyb3IiLCJlcnJvciIsImFsbFNldHRsZWQiLCJvTGlzdEJpbmRpbmciLCJvRXh0ZW5zaW9uQVBJIiwiZ2V0RXh0ZW5zaW9uQVBJIiwicmVmcmVzaCIsInN1YnRpdGxlQ29sdW1uIiwiZ2V0TWVzc2FnZUNvbHVtbiIsIm1lc3NhZ2VzIiwic2FwIiwidWkiLCJnZXRDb3JlIiwiZ2V0TWVzc2FnZU1hbmFnZXIiLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwiYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0cyIsIm1lc3NhZ2UiLCJtZXNzYWdlVGFyZ2V0cyIsImdldFRhcmdldHMiLCJwZXJzaXN0ZW50IiwiYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0IiwiZmluZCIsImdldFRhcmdldCIsImFkZGl0aW9uYWxUZXh0IiwiU2F2ZWQiLCJzdWNjZXNzVG9hc3QiLCJNZXNzYWdlVG9hc3QiLCJzaG93IiwiZ2V0U2VsZWN0ZWRDb250ZXh0cyIsIkNsZWFyIiwiZ2V0TWVzc2FnZUhhbmRsZXIiLCJzaG93TWVzc2FnZXMiLCJpc09wZW4iLCJjbG9zZSIsImRlc3Ryb3kiLCJlbmRCdXR0b24iLCJjYW5jZWxCdXR0b25UZXh0IiwiaGFzRWRpdGFibGVGaWVsZHNCaW5kaW5nIiwiZ2V0QmluZGluZ0V4cEZvckhhc0VkaXRhYmxlRmllbGRzIiwiZmllbGRzIiwidG90YWxFeHAiLCJyZWR1Y2UiLCJleHByZXNzaW9uIiwiZmllbGQiLCJvciIsInBhdGhJbk1vZGVsIiwibm90IiwiZGVmYXVsdFZhbHVlcyIsImVkaXRhYmxlRXhwIiwiaWZFbHNlIiwiYXBwbHlCdXR0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QUFFLFVBQUNFLE1BQUQsRUFBYy9OLFFBQWQsRUFBb0M7QUFDN0QsZUFBTzRPLGlCQUFpQixDQUFDOVcsY0FBYyxDQUFDdVMsT0FBZixDQUF1QnlELGlDQUF2QixDQUF5REMsTUFBekQsRUFBaUUvTixRQUFqRSxDQUFELENBQXhCO0FBQ0E7QUFyQk87QUExOUJhLEdBQXZCO1NBbS9CZWxJLGMiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHtcblx0QmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLFxuXHRDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbixcblx0Y29tcGlsZUV4cHJlc3Npb24sXG5cdGNvbnN0YW50LFxuXHRpZkVsc2UsXG5cdG5vdCxcblx0b3IsXG5cdHBhdGhJbk1vZGVsXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IGVuaGFuY2VEYXRhTW9kZWxQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHtcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgsXG5cdGhhc0N1cnJlbmN5LFxuXHRoYXNVbml0LFxuXHRoYXNWYWx1ZUhlbHAsXG5cdGhhc1ZhbHVlSGVscFdpdGhGaXhlZFZhbHVlc1xufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0VGV4dEJpbmRpbmcsIHNldEVkaXRTdHlsZVByb3BlcnRpZXMgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWVsZC9GaWVsZFRlbXBsYXRpbmdcIjtcbmltcG9ydCB0eXBlIHsgRmllbGRQcm9wZXJ0aWVzIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvaW50ZXJuYWwvRmllbGQubWV0YWRhdGFcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZVRvYXN0IGZyb20gXCJzYXAvbS9NZXNzYWdlVG9hc3RcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IFhNTFRlbXBsYXRlUHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS9YTUxUZW1wbGF0ZVByb2Nlc3NvclwiO1xuaW1wb3J0IEVkaXRNb2RlIGZyb20gXCJzYXAvdWkvbWRjL2VudW0vRWRpdE1vZGVcIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgeyBDb3JlRXggfSBmcm9tIFwidHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IEFueVR5cGUgfSBmcm9tIFwiLi4vY29udHJvbHMvQW55XCI7XG5pbXBvcnQgQW55IGZyb20gXCIuLi9jb250cm9scy9BbnlcIjtcbmltcG9ydCB7IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0LCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwiLi4vY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGlzUmVhZE9ubHlFeHByZXNzaW9uIH0gZnJvbSBcIi4uL3RlbXBsYXRpbmcvRmllbGRDb250cm9sSGVscGVyXCI7XG5pbXBvcnQgeyBnZXRFZGl0TW9kZSwgZ2V0UmVxdWlyZWRFeHByZXNzaW9uLCBpc0NvbGxlY3Rpb25GaWVsZCB9IGZyb20gXCIuLi90ZW1wbGF0aW5nL1VJRm9ybWF0dGVyc1wiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCIuL01vZGVsSGVscGVyXCI7XG5cbi8qIFRoaXMgY2xhc3MgY29udGFpbnMgaGVscGVycyB0byBiZSB1c2VkIGZvciBtYXNzIGVkaXQgZnVuY3Rpb25hbGl0eSAqL1xudHlwZSBUZXh0QXJyYW5nZW1lbnRJbmZvID0ge1xuXHR0ZXh0QXJyYW5nZW1lbnQ6IHN0cmluZztcblx0dmFsdWVQYXRoOiBzdHJpbmc7XG5cdGRlc2NyaXB0aW9uUGF0aD86IHN0cmluZztcblx0dmFsdWU6IHN0cmluZztcblx0ZGVzY3JpcHRpb246IHN0cmluZztcblx0ZnVsbFRleHQ6IHN0cmluZztcbn07XG5cbnR5cGUgQmluZGluZ0luZm8gPSB7XG5cdHBhdGg/OiBzdHJpbmc7XG5cdG1vZGVsPzogc3RyaW5nIHwgb2JqZWN0O1xuXHRwYXJhbWV0ZXJzPzogQXJyYXk8QmluZGluZ0luZm8+O1xufTtcblxuY29uc3QgTWFzc0VkaXRIZWxwZXIgPSB7XG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyB0aGUgdmFsdWUgYXQgZmluYWwgb3IgZGVlcGVzdCBsZXZlbCBwYXRoIHdpdGggYSBibGFuayBhcnJheS5cblx0ICogUmV0dXJuIGFuIGVtcHR5IGFycmF5IHBvaW50aW5nIHRvIHRoZSBmaW5hbCBvciBkZWVwZXN0IGxldmVsIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBzUGF0aCBQcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSBhVmFsdWVzIEFycmF5IGluc3RhbmNlIHdoZXJlIHRoZSBkZWZhdWx0IGRhdGEgbmVlZHMgdG8gYmUgYWRkZWRcblx0ICogQHJldHVybnMgVGhlIGZpbmFsIHBhdGhcblx0ICovXG5cdGluaXRMYXN0TGV2ZWxPZlByb3BlcnR5UGF0aDogZnVuY3Rpb24gKHNQYXRoOiBzdHJpbmcsIGFWYWx1ZXM6IGFueSAvKiwgdHJhbnNDdHg6IENvbnRleHQgKi8pIHtcblx0XHRsZXQgYUZpbmFsUGF0aDogYW55O1xuXHRcdGxldCBpbmRleCA9IDA7XG5cdFx0Y29uc3QgYVBhdGhzID0gc1BhdGguc3BsaXQoXCIvXCIpO1xuXHRcdGxldCBzRnVsbFBhdGggPSBcIlwiO1xuXHRcdGFQYXRocy5mb3JFYWNoKGZ1bmN0aW9uIChzUHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHRcdGlmICghYVZhbHVlc1tzUHJvcGVydHlQYXRoXSAmJiBpbmRleCA9PT0gMCkge1xuXHRcdFx0XHRhVmFsdWVzW3NQcm9wZXJ0eVBhdGhdID0ge307XG5cdFx0XHRcdGFGaW5hbFBhdGggPSBhVmFsdWVzW3NQcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHRzRnVsbFBhdGggPSBzRnVsbFBhdGggKyBzUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0fSBlbHNlIGlmICghYUZpbmFsUGF0aFtzUHJvcGVydHlQYXRoXSkge1xuXHRcdFx0XHRzRnVsbFBhdGggPSBgJHtzRnVsbFBhdGh9LyR7c1Byb3BlcnR5UGF0aH1gO1xuXHRcdFx0XHRpZiAoc0Z1bGxQYXRoICE9PSBzUGF0aCkge1xuXHRcdFx0XHRcdGFGaW5hbFBhdGhbc1Byb3BlcnR5UGF0aF0gPSB7fTtcblx0XHRcdFx0XHRhRmluYWxQYXRoID0gYUZpbmFsUGF0aFtzUHJvcGVydHlQYXRoXTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhRmluYWxQYXRoW3NQcm9wZXJ0eVBhdGhdID0gW107XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gYUZpbmFsUGF0aDtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGdldCB1bmlxdWUgdmFsdWVzIGZvciBnaXZlbiBhcnJheSB2YWx1ZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBzVmFsdWUgUHJvcGVydHkgdmFsdWVcblx0ICogQHBhcmFtIGluZGV4IEluZGV4IG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZVxuXHQgKiBAcGFyYW0gc2VsZiBJbnN0YW5jZSBvZiB0aGUgYXJyYXlcblx0ICogQHJldHVybnMgVGhlIHVuaXF1ZSB2YWx1ZVxuXHQgKi9cblx0Z2V0VW5pcXVlVmFsdWVzOiBmdW5jdGlvbiAoc1ZhbHVlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIsIHNlbGY6IGFueVtdKSB7XG5cdFx0aWYgKHNWYWx1ZSAhPSB1bmRlZmluZWQgJiYgc1ZhbHVlICE9IG51bGwpIHtcblx0XHRcdHJldHVybiBzZWxmLmluZGV4T2Yoc1ZhbHVlKSA9PT0gaW5kZXg7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgYSBtdWx0aS1sZXZlbCBwYXRoIChmb3IgZXhhbXBsZTogX01hdGVyaWFscy9NYXRlcmlhbF9EZXRhaWxzIGdldHMgdGhlIHZhbHVlIG9mIE1hdGVyaWFsX0RldGFpbHMgdW5kZXIgX01hdGVyaWFscyBPYmplY3QpLlxuXHQgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eVZhbHVlLCB3aGljaCBjYW4gYmUgb2YgYW55IHR5cGUgKHN0cmluZywgbnVtYmVyLCBldGMuLikuXG5cdCAqXG5cdCAqIEBwYXJhbSBzRGF0YVByb3BlcnR5UGF0aCBQcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSBvVmFsdWVzIE9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXNcblx0ICogQHJldHVybnMgVGhlIHByb3BlcnR5IHZhbHVlXG5cdCAqL1xuXHRnZXRWYWx1ZUZvck11bHRpTGV2ZWxQYXRoOiBmdW5jdGlvbiAoc0RhdGFQcm9wZXJ0eVBhdGg6IHN0cmluZywgb1ZhbHVlczogYW55KSB7XG5cdFx0aWYgKHNEYXRhUHJvcGVydHlQYXRoICYmIHNEYXRhUHJvcGVydHlQYXRoLmluZGV4T2YoXCIvXCIpID4gMCkge1xuXHRcdFx0Y29uc3QgYVByb3BlcnR5UGF0aHMgPSBzRGF0YVByb3BlcnR5UGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHRsZXQgUmVzdWx0OiBhbnk7XG5cdFx0XHRhUHJvcGVydHlQYXRocy5mb3JFYWNoKGZ1bmN0aW9uIChzUGF0aDogc3RyaW5nKSB7XG5cdFx0XHRcdFJlc3VsdCA9IG9WYWx1ZXMgJiYgb1ZhbHVlc1tzUGF0aF0gPyBvVmFsdWVzW3NQYXRoXSA6IFJlc3VsdCAmJiBSZXN1bHRbc1BhdGhdO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gUmVzdWx0O1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogR2V0cyB0aGUga2V5IHBhdGggZm9yIHRoZSBrZXkgb2YgYSBjb21ibyBib3ggdGhhdCBtdXN0IGJlIHNlbGVjdGVkIGluaXRpYWxseSB3aGVuIHRoZSBkaWFsb2cgb3BlbnM6XG5cdCAqID0+IElmIHByb3BlcnR5VmFsdWUgZm9yIGFsbCBzZWxlY3RlZCBjb250ZXh0cyBpcyBkaWZmZXJlbnQsIHRoZW4gPCBLZWVwIEV4aXN0aW5nIFZhbHVlcyA+IGlzIHByZXNlbGVjdGVkLlxuXHQgKiA9PiBJZiBwcm9wZXJ0eVZhbHVlIGZvciBhbGwgc2VsZWN0ZWQgY29udGV4dHMgaXMgdGhlIHNhbWUsIHRoZW4gdGhlIHByb3BlcnR5VmFsdWUgaXMgcHJlc2VsZWN0ZWQuXG5cdCAqID0+IElmIHByb3BlcnR5VmFsdWUgZm9yIGFsbCBzZWxlY3RlZCBjb250ZXh0cyBpcyBlbXB0eSwgdGhlbiA8IExlYXZlIEJsYW5rID4gaXMgcHJlc2VsZWN0ZWQuXG5cdCAqXG5cdCAqXG5cdCAqIEBwYXJhbSBhQ29udGV4dHMgQ29udGV4dHMgZm9yIG1hc3MgZWRpdFxuXHQgKiBAcGFyYW0gc0RhdGFQcm9wZXJ0eVBhdGggRGF0YSBwcm9wZXJ0eSBwYXRoXG5cdCAqIEByZXR1cm5zIFRoZSBrZXkgcGF0aFxuXHQgKi9cblx0Z2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveDogZnVuY3Rpb24gKGFDb250ZXh0czogYW55W10sIHNEYXRhUHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHRpZiAoc0RhdGFQcm9wZXJ0eVBhdGggJiYgYUNvbnRleHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IG9TZWxlY3RlZENvbnRleHQgPSBhQ29udGV4dHMsXG5cdFx0XHRcdGFQcm9wZXJ0eVZhbHVlczogYW55W10gPSBbXTtcblx0XHRcdG9TZWxlY3RlZENvbnRleHQuZm9yRWFjaChmdW5jdGlvbiAob0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRjb25zdCBvRGF0YU9iamVjdCA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRjb25zdCBzTXVsdGlMZXZlbFBhdGhDb25kaXRpb24gPVxuXHRcdFx0XHRcdHNEYXRhUHJvcGVydHlQYXRoLmluZGV4T2YoXCIvXCIpID4gLTEgJiYgb0RhdGFPYmplY3QuaGFzT3duUHJvcGVydHkoc0RhdGFQcm9wZXJ0eVBhdGguc3BsaXQoXCIvXCIpWzBdKTtcblx0XHRcdFx0aWYgKG9Db250ZXh0ICYmIChvRGF0YU9iamVjdC5oYXNPd25Qcm9wZXJ0eShzRGF0YVByb3BlcnR5UGF0aCkgfHwgc011bHRpTGV2ZWxQYXRoQ29uZGl0aW9uKSkge1xuXHRcdFx0XHRcdGFQcm9wZXJ0eVZhbHVlcy5wdXNoKG9Db250ZXh0LmdldE9iamVjdChzRGF0YVByb3BlcnR5UGF0aCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGFVbmlxdWVQcm9wZXJ0eVZhbHVlcyA9IGFQcm9wZXJ0eVZhbHVlcy5maWx0ZXIoTWFzc0VkaXRIZWxwZXIuZ2V0VW5pcXVlVmFsdWVzKTtcblx0XHRcdGlmIChhVW5pcXVlUHJvcGVydHlWYWx1ZXMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRyZXR1cm4gYERlZmF1bHQvJHtzRGF0YVByb3BlcnR5UGF0aH1gO1xuXHRcdFx0fSBlbHNlIGlmIChhVW5pcXVlUHJvcGVydHlWYWx1ZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdHJldHVybiBgRW1wdHkvJHtzRGF0YVByb3BlcnR5UGF0aH1gO1xuXHRcdFx0fSBlbHNlIGlmIChhVW5pcXVlUHJvcGVydHlWYWx1ZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdHJldHVybiBgJHtzRGF0YVByb3BlcnR5UGF0aH0vJHthVW5pcXVlUHJvcGVydHlWYWx1ZXNbMF19YDtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBoaWRkZW4gYW5ub3RhdGlvbiB2YWx1ZSBbYm90aCBzdGF0aWMgYW5kIHBhdGggYmFzZWRdIGZvciB0YWJsZSdzIHNlbGVjdGVkIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBoaWRkZW5WYWx1ZSBIaWRkZW4gYW5ub3RhdGlvbiB2YWx1ZSAvIHBhdGggZm9yIGZpZWxkXG5cdCAqIEBwYXJhbSBhQ29udGV4dHMgQ29udGV4dHMgZm9yIG1hc3MgZWRpdFxuXHQgKiBAcmV0dXJucyBUaGUgaGlkZGVuIGFubm90YXRpb24gdmFsdWVcblx0ICovXG5cdGdldEhpZGRlblZhbHVlRm9yQ29udGV4dHM6IGZ1bmN0aW9uIChoaWRkZW5WYWx1ZTogYW55LCBhQ29udGV4dHM6IGFueVtdKSB7XG5cdFx0aWYgKGhpZGRlblZhbHVlICYmIGhpZGRlblZhbHVlLiRQYXRoKSB7XG5cdFx0XHRyZXR1cm4gIWFDb250ZXh0cy5zb21lKGZ1bmN0aW9uIChvU2VsZWN0ZWRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KGhpZGRlblZhbHVlLiRQYXRoKSA9PT0gZmFsc2U7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIGhpZGRlblZhbHVlO1xuXHR9LFxuXG5cdGdldElucHV0VHlwZTogZnVuY3Rpb24gKHByb3BlcnR5SW5mbzogYW55LCBkYXRhRmllbGRDb252ZXJ0ZWQ6IGFueSwgb0RhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGVkaXRTdHlsZVByb3BlcnRpZXMgPSB7fSBhcyBGaWVsZFByb3BlcnRpZXM7XG5cdFx0bGV0IGlucHV0VHlwZSE6IHN0cmluZztcblx0XHRpZiAocHJvcGVydHlJbmZvKSB7XG5cdFx0XHRzZXRFZGl0U3R5bGVQcm9wZXJ0aWVzKGVkaXRTdHlsZVByb3BlcnRpZXMsIGRhdGFGaWVsZENvbnZlcnRlZCwgb0RhdGFNb2RlbFBhdGgsIHRydWUpO1xuXHRcdFx0aW5wdXRUeXBlID0gZWRpdFN0eWxlUHJvcGVydGllcz8uZWRpdFN0eWxlIHx8IFwiXCI7XG5cdFx0fVxuXHRcdGNvbnN0IGlzVmFsaWRGb3JNYXNzRWRpdCA9XG5cdFx0XHRpbnB1dFR5cGUgJiZcblx0XHRcdFtcIkRhdGVQaWNrZXJcIiwgXCJUaW1lUGlja2VyXCIsIFwiRGF0ZVRpbWVQaWNrZXJcIiwgXCJSYXRpbmdJbmRpY2F0b3JcIl0uaW5kZXhPZihpbnB1dFR5cGUpID09PSAtMSAmJlxuXHRcdFx0IWlzQ29sbGVjdGlvbkZpZWxkKG9EYXRhTW9kZWxQYXRoKSAmJlxuXHRcdFx0IWhhc1ZhbHVlSGVscFdpdGhGaXhlZFZhbHVlcyhwcm9wZXJ0eUluZm8pO1xuXG5cdFx0cmV0dXJuIChpc1ZhbGlkRm9yTWFzc0VkaXQgfHwgXCJcIikgJiYgaW5wdXRUeXBlO1xuXHR9LFxuXG5cdGdldElzRmllbGRHcnA6IGZ1bmN0aW9uIChkYXRhRmllbGRDb252ZXJ0ZWQ6IGFueSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAoXG5cdFx0XHRkYXRhRmllbGRDb252ZXJ0ZWQgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JBbm5vdGF0aW9uXCIgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQudmFsdWUgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQudmFsdWUuaW5kZXhPZihcIkZpZWxkR3JvdXBcIikgPiAtMVxuXHRcdCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0ZXh0IHBhdGggZm9yIHRoZSBtYXNzIGVkaXQgZmllbGQuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eSBQcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSB0ZXh0QmluZGluZyBUZXh0IEJpbmRpbmcgSW5mb1xuXHQgKiBAcGFyYW0gZGlzcGxheU1vZGUgRGlzcGxheSBtb2RlXG5cdCAqIEByZXR1cm5zIFRleHQgUHJvcGVydHkgUGF0aCBpZiBpdCBleGlzdHNcblx0ICovXG5cdGdldFRleHRQYXRoOiBmdW5jdGlvbiAocHJvcGVydHk6IHN0cmluZywgdGV4dEJpbmRpbmc6IGFueSwgZGlzcGxheU1vZGU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IGRlc2NyaXB0aW9uUGF0aDtcblx0XHRpZiAodGV4dEJpbmRpbmcgJiYgKHRleHRCaW5kaW5nLnBhdGggfHwgKHRleHRCaW5kaW5nLnBhcmFtZXRlcnMgJiYgdGV4dEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGgpKSAmJiBwcm9wZXJ0eSkge1xuXHRcdFx0aWYgKHRleHRCaW5kaW5nLnBhdGggJiYgZGlzcGxheU1vZGUgPT09IFwiRGVzY3JpcHRpb25cIikge1xuXHRcdFx0XHRkZXNjcmlwdGlvblBhdGggPSB0ZXh0QmluZGluZy5wYXRoO1xuXHRcdFx0fSBlbHNlIGlmICh0ZXh0QmluZGluZy5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdHRleHRCaW5kaW5nLnBhcmFtZXRlcnMuZm9yRWFjaChmdW5jdGlvbiAocHJvcHM6IEJpbmRpbmdJbmZvKSB7XG5cdFx0XHRcdFx0aWYgKHByb3BzLnBhdGggJiYgcHJvcHMucGF0aCAhPT0gcHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uUGF0aCA9IHByb3BzLnBhdGg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGRlc2NyaXB0aW9uUGF0aDtcblx0fSxcblxuXHQvKipcblx0ICogSW5pdGlhbGl6ZXMgYSBKU09OIE1vZGVsIGZvciBwcm9wZXJ0aWVzIG9mIGRpYWxvZyBmaWVsZHMgW2xhYmVsLCB2aXNpYmxpdHksIGRhdGFwcm9wZXJ0eSwgZXRjLl0uXG5cdCAqXG5cdCAqIEBwYXJhbSBvVGFibGUgSW5zdGFuY2Ugb2YgVGFibGVcblx0ICogQHBhcmFtIGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSBhRGF0YUFycmF5IEFycmF5IGNvbnRhaW5pbmcgZGF0YSByZWxhdGVkIHRvIHRoZSBkaWFsb2cgdXNlZCBieSBib3RoIHRoZSBzdGF0aWMgYW5kIHRoZSBydW50aW1lIG1vZGVsXG5cdCAqIEByZXR1cm5zIFRoZSBtb2RlbFxuXHQgKi9cblx0cHJlcGFyZURhdGFGb3JEaWFsb2c6IGZ1bmN0aW9uIChvVGFibGU6IFRhYmxlLCBhQ29udGV4dHM6IGFueVtdLCBhRGF0YUFycmF5OiBhbnlbXSkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvVGFibGUgJiYgKG9UYWJsZS5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIGFueSksXG5cdFx0XHRzQ3VycmVudEVudGl0eVNldE5hbWUgPSBvVGFibGUuZGF0YShcIm1ldGFQYXRoXCIpLFxuXHRcdFx0YVRhYmxlRmllbGRzID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGFibGVGaWVsZHMob1RhYmxlKSxcblx0XHRcdG9FbnRpdHlUeXBlQ29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0Q29udGV4dChgJHtzQ3VycmVudEVudGl0eVNldE5hbWV9L0BgKSxcblx0XHRcdG9FbnRpdHlTZXRDb250ZXh0ID0gb01ldGFNb2RlbC5nZXRDb250ZXh0KHNDdXJyZW50RW50aXR5U2V0TmFtZSksXG5cdFx0XHRvRGF0YU1vZGVsT2JqZWN0UGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhvRW50aXR5VHlwZUNvbnRleHQpO1xuXG5cdFx0Y29uc3Qgb0RhdGFGaWVsZE1vZGVsID0gbmV3IEpTT05Nb2RlbCgpO1xuXHRcdGxldCBvUmVzdWx0O1xuXHRcdGxldCBzTGFiZWxUZXh0O1xuXHRcdGxldCBiVmFsdWVIZWxwRW5hYmxlZDtcblx0XHRsZXQgc1VuaXRQcm9wZXJ0eVBhdGg7XG5cdFx0bGV0IGJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdDtcblx0XHRsZXQgb1RleHRCaW5kaW5nO1xuXG5cdFx0YVRhYmxlRmllbGRzLmZvckVhY2goZnVuY3Rpb24gKG9Db2x1bW5JbmZvOiBhbnkpIHtcblx0XHRcdGNvbnN0IHNEYXRhUHJvcGVydHlQYXRoID0gb0NvbHVtbkluZm8uZGF0YVByb3BlcnR5O1xuXHRcdFx0aWYgKHNEYXRhUHJvcGVydHlQYXRoKSB7XG5cdFx0XHRcdGxldCBvUHJvcGVydHlJbmZvID0gc0RhdGFQcm9wZXJ0eVBhdGggJiYgb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0N1cnJlbnRFbnRpdHlTZXROYW1lfS8ke3NEYXRhUHJvcGVydHlQYXRofUBgKTtcblx0XHRcdFx0c0xhYmVsVGV4dCA9XG5cdFx0XHRcdFx0b0NvbHVtbkluZm8ubGFiZWwgfHxcblx0XHRcdFx0XHQob1Byb3BlcnR5SW5mbyAmJiBvUHJvcGVydHlJbmZvW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5MYWJlbFwiXSkgfHxcblx0XHRcdFx0XHRvQ29sdW1uSW5mby5kYXRhUHJvcGVydHk7XG5cblx0XHRcdFx0aWYgKG9EYXRhTW9kZWxPYmplY3RQYXRoKSB7XG5cdFx0XHRcdFx0b0RhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0ID0gb0RhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLmZpbHRlcihmdW5jdGlvbiAoXG5cdFx0XHRcdFx0XHRvUHJvcGVydHk6IGFueVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9Qcm9wZXJ0eS5uYW1lID09PSBzRGF0YVByb3BlcnR5UGF0aDtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvRGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgPSBvRGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3RbMF0gfHwge307XG5cdFx0XHRcdG9UZXh0QmluZGluZyA9IGdldFRleHRCaW5kaW5nKG9EYXRhTW9kZWxPYmplY3RQYXRoLCB7fSwgdHJ1ZSkgfHwge307XG5cdFx0XHRcdGNvbnN0IG9GaWVsZENvbnRleHQgPSBvTWV0YU1vZGVsLmdldENvbnRleHQob0NvbHVtbkluZm8uYW5ub3RhdGlvblBhdGgpLFxuXHRcdFx0XHRcdG9EYXRhRmllbGRDb252ZXJ0ZWQgPSBjb252ZXJ0TWV0YU1vZGVsQ29udGV4dChvRmllbGRDb250ZXh0KSxcblx0XHRcdFx0XHRvUHJvcGVydHlDb250ZXh0ID0gb01ldGFNb2RlbC5nZXRDb250ZXh0KGAke3NDdXJyZW50RW50aXR5U2V0TmFtZX0vJHtzRGF0YVByb3BlcnR5UGF0aH1AYCksXG5cdFx0XHRcdFx0b0ludGVyZmFjZSA9IG9Qcm9wZXJ0eUNvbnRleHQgJiYgb1Byb3BlcnR5Q29udGV4dC5nZXRJbnRlcmZhY2UoKTtcblxuXHRcdFx0XHRsZXQgb0RhdGFNb2RlbFBhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob0ZpZWxkQ29udGV4dCwgb0VudGl0eVNldENvbnRleHQpO1xuXHRcdFx0XHRpZiAob0RhdGFGaWVsZENvbnZlcnRlZD8uVmFsdWU/LnBhdGg/Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRvRGF0YU1vZGVsUGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoKG9EYXRhTW9kZWxQYXRoLCBzRGF0YVByb3BlcnR5UGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgYkhpZGRlbkZpZWxkID1cblx0XHRcdFx0XHRNYXNzRWRpdEhlbHBlci5nZXRIaWRkZW5WYWx1ZUZvckNvbnRleHRzKFxuXHRcdFx0XHRcdFx0b0ZpZWxkQ29udGV4dCAmJiBvRmllbGRDb250ZXh0LmdldE9iamVjdCgpW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhpZGRlblwiXSxcblx0XHRcdFx0XHRcdGFDb250ZXh0c1xuXHRcdFx0XHRcdCkgfHwgZmFsc2U7XG5cdFx0XHRcdGNvbnN0IGlzSW1hZ2UgPSBvUHJvcGVydHlJbmZvICYmIG9Qcm9wZXJ0eUluZm9bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSXNJbWFnZVVSTFwiXTtcblxuXHRcdFx0XHRvSW50ZXJmYWNlLmNvbnRleHQgPSB7XG5cdFx0XHRcdFx0Z2V0TW9kZWw6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvSW50ZXJmYWNlLmdldE1vZGVsKCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRnZXRQYXRoOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gYCR7c0N1cnJlbnRFbnRpdHlTZXROYW1lfS8ke3NEYXRhUHJvcGVydHlQYXRofWA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRvUHJvcGVydHlJbmZvID1cblx0XHRcdFx0XHRvRGF0YUZpZWxkQ29udmVydGVkLl90eXBlID09PSBcIlByb3BlcnR5XCJcblx0XHRcdFx0XHRcdD8gb0RhdGFGaWVsZENvbnZlcnRlZFxuXHRcdFx0XHRcdFx0OiAob0RhdGFGaWVsZENvbnZlcnRlZCAmJiBvRGF0YUZpZWxkQ29udmVydGVkLlZhbHVlICYmIG9EYXRhRmllbGRDb252ZXJ0ZWQuVmFsdWUuJHRhcmdldCkgfHxcblx0XHRcdFx0XHRcdCAgKG9EYXRhRmllbGRDb252ZXJ0ZWQgJiYgb0RhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQgJiYgb0RhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQuJHRhcmdldCk7XG5cdFx0XHRcdC8vIERhdGFmaWVsZCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIEZpZWxkQ29udHJvbCBjYWxjdWxhdGlvbiwgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWRcblxuXHRcdFx0XHRjb25zdCBjaGFydFByb3BlcnR5ID0gb1Byb3BlcnR5SW5mbyAmJiBvUHJvcGVydHlJbmZvLnRlcm0gJiYgb1Byb3BlcnR5SW5mby50ZXJtID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0XCI7XG5cdFx0XHRcdGNvbnN0IGlzQWN0aW9uID0gISFvRGF0YUZpZWxkQ29udmVydGVkLkFjdGlvbjtcblx0XHRcdFx0Y29uc3QgaXNGaWVsZEdycCA9IE1hc3NFZGl0SGVscGVyLmdldElzRmllbGRHcnAob0RhdGFGaWVsZENvbnZlcnRlZCk7XG5cblx0XHRcdFx0aWYgKGlzSW1hZ2UgfHwgYkhpZGRlbkZpZWxkIHx8IGNoYXJ0UHJvcGVydHkgfHwgaXNBY3Rpb24gfHwgaXNGaWVsZEdycCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFZhbHVlSGVscCBwcm9wZXJ0aWVzXG5cdFx0XHRcdGJWYWx1ZUhlbHBFbmFibGVkID0gaGFzVmFsdWVIZWxwKG9Qcm9wZXJ0eUluZm8pO1xuXHRcdFx0XHRzVW5pdFByb3BlcnR5UGF0aCA9XG5cdFx0XHRcdFx0KChoYXNDdXJyZW5jeShvUHJvcGVydHlJbmZvKSB8fCBoYXNVbml0KG9Qcm9wZXJ0eUluZm8pKSAmJiBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5UGF0aChvUHJvcGVydHlJbmZvKSkgfHwgXCJcIjtcblx0XHRcdFx0Y29uc3QgdW5pdFByb3BlcnR5SW5mbyA9IHNVbml0UHJvcGVydHlQYXRoICYmIGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkob1Byb3BlcnR5SW5mbyk7XG5cdFx0XHRcdGJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCA9IHVuaXRQcm9wZXJ0eUluZm8gJiYgaGFzVmFsdWVIZWxwKHVuaXRQcm9wZXJ0eUluZm8pO1xuXG5cdFx0XHRcdC8vIEVkaXRNb2RlIGFuZCBJbnB1dFR5cGVcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlGb3JGaWVsZENvbnRyb2wgPSBvUHJvcGVydHlJbmZvICYmIG9Qcm9wZXJ0eUluZm8uVmFsdWUgPyBvUHJvcGVydHlJbmZvLlZhbHVlIDogb1Byb3BlcnR5SW5mbztcblx0XHRcdFx0Y29uc3QgZXhwQmluZGluZyA9IGdldEVkaXRNb2RlKHByb3BlcnR5Rm9yRmllbGRDb250cm9sLCBvRGF0YU1vZGVsUGF0aCwgZmFsc2UsIGZhbHNlLCBvRGF0YUZpZWxkQ29udmVydGVkLCBjb25zdGFudCh0cnVlKSk7XG5cdFx0XHRcdGNvbnN0IGVkaXRNb2RlVmFsdWVzID0gT2JqZWN0LmtleXMoRWRpdE1vZGUpO1xuXHRcdFx0XHRjb25zdCBlZGl0TW9kZUlzU3RhdGljID0gISFleHBCaW5kaW5nICYmIGVkaXRNb2RlVmFsdWVzLmluY2x1ZGVzKGV4cEJpbmRpbmcgYXMgRWRpdE1vZGUpO1xuXHRcdFx0XHRjb25zdCBlZGl0YWJsZSA9ICEhZXhwQmluZGluZyAmJiAoKGVkaXRNb2RlSXNTdGF0aWMgJiYgZXhwQmluZGluZyA9PT0gRWRpdE1vZGUuRWRpdGFibGUpIHx8ICFlZGl0TW9kZUlzU3RhdGljKTtcblxuXHRcdFx0XHRpZiAoIWVkaXRhYmxlKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgaW5wdXRUeXBlID0gTWFzc0VkaXRIZWxwZXIuZ2V0SW5wdXRUeXBlKG9Qcm9wZXJ0eUluZm8sIG9EYXRhRmllbGRDb252ZXJ0ZWQsIG9EYXRhTW9kZWxQYXRoKTtcblxuXHRcdFx0XHRpZiAoaW5wdXRUeXBlKSB7XG5cdFx0XHRcdFx0Y29uc3QgaXNSZWFkT25seSA9IGlzUmVhZE9ubHlFeHByZXNzaW9uKG9Qcm9wZXJ0eUluZm8pO1xuXHRcdFx0XHRcdGNvbnN0IGRpc3BsYXlNb2RlID0gQ29tbW9uVXRpbHMuY29tcHV0ZURpc3BsYXlNb2RlKG9Qcm9wZXJ0eUNvbnRleHQuZ2V0T2JqZWN0KCkpO1xuXHRcdFx0XHRcdG9SZXN1bHQgPSB7XG5cdFx0XHRcdFx0XHRcImxhYmVsXCI6IHNMYWJlbFRleHQsXG5cdFx0XHRcdFx0XHRcImRhdGFQcm9wZXJ0eVwiOiBzRGF0YVByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdFwiaXNWYWx1ZUhlbHBFbmFibGVkXCI6IGJWYWx1ZUhlbHBFbmFibGVkID8gYlZhbHVlSGVscEVuYWJsZWQgOiBmYWxzZSxcblx0XHRcdFx0XHRcdFwidW5pdFByb3BlcnR5XCI6IHNVbml0UHJvcGVydHlQYXRoICYmICFzRGF0YVByb3BlcnR5UGF0aC5pbmNsdWRlcyhcIi9cIikgPyBzVW5pdFByb3BlcnR5UGF0aCA6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XCJpc1ZhbHVlSGVscEVuYWJsZWRGb3JVbml0XCI6XG5cdFx0XHRcdFx0XHRcdGJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCAmJiAhc1VuaXRQcm9wZXJ0eVBhdGguaW5jbHVkZXMoXCIvXCIpID8gYlZhbHVlSGVscEVuYWJsZWRGb3JVbml0IDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcInByb3BlcnR5UGF0aEZvclZhbHVlSGVscFwiOiBgJHtzQ3VycmVudEVudGl0eVNldE5hbWV9LyR7c0RhdGFQcm9wZXJ0eVBhdGh9YCxcblx0XHRcdFx0XHRcdFwicHJvcGVydHlQYXRoRm9yVmFsdWVIZWxwVW5pdFwiOiBzVW5pdFByb3BlcnR5UGF0aCAmJiBgJHtzQ3VycmVudEVudGl0eVNldE5hbWV9LyR7c1VuaXRQcm9wZXJ0eVBhdGh9YCxcblx0XHRcdFx0XHRcdFwiaXNGaWVsZFJlcXVpcmVkXCI6IGdldFJlcXVpcmVkRXhwcmVzc2lvbihvUHJvcGVydHlJbmZvLCBvRGF0YUZpZWxkQ29udmVydGVkLCB0cnVlKSxcblx0XHRcdFx0XHRcdFwiZGVmYXVsdFNlbGVjdGlvblBhdGhcIjogc0RhdGFQcm9wZXJ0eVBhdGhcblx0XHRcdFx0XHRcdFx0PyBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0U2VsZWN0aW9uUGF0aENvbWJvQm94KGFDb250ZXh0cywgc0RhdGFQcm9wZXJ0eVBhdGgpXG5cdFx0XHRcdFx0XHRcdDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcImRlZmF1bHRTZWxlY3Rpb25Vbml0UGF0aFwiOiBzVW5pdFByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdFx0XHQ/IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goYUNvbnRleHRzLCBzVW5pdFByb3BlcnR5UGF0aClcblx0XHRcdFx0XHRcdFx0OiBmYWxzZSxcblx0XHRcdFx0XHRcdFwiZW50aXR5U2V0XCI6IHNDdXJyZW50RW50aXR5U2V0TmFtZSxcblx0XHRcdFx0XHRcdFwiZGlzcGxheVwiOiBkaXNwbGF5TW9kZSxcblx0XHRcdFx0XHRcdFwiZGVzY3JpcHRpb25QYXRoXCI6IE1hc3NFZGl0SGVscGVyLmdldFRleHRQYXRoKHNEYXRhUHJvcGVydHlQYXRoLCBvVGV4dEJpbmRpbmcsIGRpc3BsYXlNb2RlKSxcblx0XHRcdFx0XHRcdFwibnVsbGFibGVcIjogb1Byb3BlcnR5SW5mby5udWxsYWJsZSAhPT0gdW5kZWZpbmVkID8gb1Byb3BlcnR5SW5mby5udWxsYWJsZSA6IHRydWUsXG5cdFx0XHRcdFx0XHRcImlzUHJvcGVydHlSZWFkT25seVwiOiBpc1JlYWRPbmx5ICE9PSB1bmRlZmluZWQgPyBpc1JlYWRPbmx5IDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcImlucHV0VHlwZVwiOiBpbnB1dFR5cGUsXG5cdFx0XHRcdFx0XHRcImVkaXRNb2RlXCI6IGVkaXRhYmxlID8gZXhwQmluZGluZyA6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFwidW5pdERhdGFQYXRoXCI6IHNVbml0UHJvcGVydHlQYXRoICYmIFwiZmllbGRzSW5mbz4vdW5pdERhdGEvXCIsXG5cdFx0XHRcdFx0XHRcInZhbHVlc1BhdGhcIjogXCJmaWVsZHNJbmZvPi92YWx1ZXMvXCJcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGFEYXRhQXJyYXkucHVzaChvUmVzdWx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdG9EYXRhRmllbGRNb2RlbC5zZXREYXRhKGFEYXRhQXJyYXkpO1xuXHRcdHJldHVybiBvRGF0YUZpZWxkTW9kZWw7XG5cdH0sXG5cblx0Z2V0VGFibGVGaWVsZHM6IGZ1bmN0aW9uIChvVGFibGU6IGFueSkge1xuXHRcdGNvbnN0IGFDb2x1bW5zID0gKG9UYWJsZSAmJiBvVGFibGUuZ2V0Q29sdW1ucygpKSB8fCBbXTtcblx0XHRjb25zdCBjb2x1bW5zRGF0YSA9IG9UYWJsZSAmJiBvVGFibGUuZ2V0UGFyZW50KCkuZ2V0VGFibGVEZWZpbml0aW9uKCkuY29sdW1ucztcblx0XHRyZXR1cm4gYUNvbHVtbnMubWFwKGZ1bmN0aW9uIChvQ29sdW1uOiBhbnkpIHtcblx0XHRcdGNvbnN0IHNEYXRhUHJvcGVydHkgPSBvQ29sdW1uICYmIG9Db2x1bW4uZ2V0RGF0YVByb3BlcnR5KCksXG5cdFx0XHRcdGFSZWFsdGVkQ29sdW1uSW5mbyA9XG5cdFx0XHRcdFx0Y29sdW1uc0RhdGEgJiZcblx0XHRcdFx0XHRjb2x1bW5zRGF0YS5maWx0ZXIoZnVuY3Rpb24gKG9Db2x1bW5JbmZvOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQ29sdW1uSW5mby5uYW1lID09PSBzRGF0YVByb3BlcnR5ICYmIG9Db2x1bW5JbmZvLnR5cGUgPT09IFwiQW5ub3RhdGlvblwiO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XCJkYXRhUHJvcGVydHlcIjogc0RhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XCJsYWJlbFwiOiBvQ29sdW1uLmdldEhlYWRlcigpLFxuXHRcdFx0XHRcImFubm90YXRpb25QYXRoXCI6IGFSZWFsdGVkQ29sdW1uSW5mbyAmJiBhUmVhbHRlZENvbHVtbkluZm9bMF0gJiYgYVJlYWx0ZWRDb2x1bW5JbmZvWzBdLmFubm90YXRpb25QYXRoXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHR9LFxuXG5cdGdldERlZmF1bHRUZXh0c0ZvckRpYWxvZzogZnVuY3Rpb24gKG9SZXNvdXJjZUJ1bmRsZTogYW55LCBpU2VsZWN0ZWRDb250ZXh0czogYW55LCBvVGFibGU6IGFueSkge1xuXHRcdC8vIFRoZSBjb25maXJtIGJ1dHRvbiB0ZXh0IGlzIFwiU2F2ZVwiIGZvciB0YWJsZSBpbiBEaXNwbGF5IG1vZGUgYW5kIFwiQXBwbHlcIiBmb3IgdGFibGUgaW4gZWRpdCBtb2RlLiBUaGlzIGNhbiBiZSBsYXRlciBleHBvc2VkIGlmIG5lZWRlZC5cblx0XHRjb25zdCBiRGlzcGxheU1vZGUgPSBvVGFibGUuZGF0YShcImRpc3BsYXlNb2RlUHJvcGVydHlCaW5kaW5nXCIpID09PSBcInRydWVcIjtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRcImtlZXBFeGlzdGluZ1ByZWZpeFwiOiBcIjwgS2VlcFwiLFxuXHRcdFx0XCJsZWF2ZUJsYW5rVmFsdWVcIjogXCI8IExlYXZlIEJsYW5rID5cIixcblx0XHRcdFwiY2xlYXJGaWVsZFZhbHVlXCI6IFwiPCBDbGVhciBWYWx1ZXMgPlwiLFxuXHRcdFx0XCJtYXNzRWRpdFRpdGxlXCI6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfRElBTE9HX1RJVExFXCIsIGlTZWxlY3RlZENvbnRleHRzLnRvU3RyaW5nKCkpLFxuXHRcdFx0XCJhcHBseUJ1dHRvblRleHRcIjogYkRpc3BsYXlNb2RlXG5cdFx0XHRcdD8gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9TQVZFX0JVVFRPTl9URVhUXCIpXG5cdFx0XHRcdDogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9BUFBMWV9CVVRUT05fVEVYVFwiKSxcblx0XHRcdFwidXNlVmFsdWVIZWxwVmFsdWVcIjogXCI8IFVzZSBWYWx1ZSBIZWxwID5cIixcblx0XHRcdFwiY2FuY2VsQnV0dG9uVGV4dFwiOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUFTU19FRElUX0NBTkNFTF9CVVRUT05fVEVYVFwiKSxcblx0XHRcdFwibm9GaWVsZHNcIjogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9OT19FRElUQUJMRV9GSUVMRFNcIiksXG5cdFx0XHRcIm9rQnV0dG9uVGV4dFwiOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX0RJQUxPR19PS1wiKVxuXHRcdH07XG5cdH0sXG5cblx0LyoqXG5cdCAqIEFkZHMgYSBzdWZmaXggdG8gdGhlICdrZWVwIGV4aXN0aW5nJyBwcm9wZXJ0eSBvZiB0aGUgY29tYm9Cb3guXG5cdCAqXG5cdCAqIEBwYXJhbSBzSW5wdXRUeXBlIElucHV0VHlwZSBvZiB0aGUgZmllbGRcblx0ICogQHJldHVybnMgVGhlIG1vZGlmaWVkIHN0cmluZ1xuXHQgKi9cblx0Ly8gZ2V0U3VmZml4Rm9yS2VlcEV4aXNpdGluZzogZnVuY3Rpb24gKHNJbnB1dFR5cGU6IHN0cmluZykge1xuXHQvLyBcdGxldCBzUmVzdWx0ID0gXCJWYWx1ZXNcIjtcblxuXHQvLyBcdHN3aXRjaCAoc0lucHV0VHlwZSkge1xuXHQvLyBcdFx0Ly9UT0RPIC0gQWRkIGZvciBvdGhlciBjb250cm9sIHR5cGVzIGFzIHdlbGwgKFJhZGlvIEJ1dHRvbiwgRW1haWwsIElucHV0LCBNREMgRmllbGRzLCBJbWFnZSBldGMuKVxuXHQvLyBcdFx0Y2FzZSBcIkRhdGVQaWNrZXJcIjpcblx0Ly8gXHRcdFx0c1Jlc3VsdCA9IFwiRGF0ZXNcIjtcblx0Ly8gXHRcdFx0YnJlYWs7XG5cdC8vIFx0XHRjYXNlIFwiQ2hlY2tCb3hcIjpcblx0Ly8gXHRcdFx0c1Jlc3VsdCA9IFwiU2V0dGluZ3NcIjtcblx0Ly8gXHRcdFx0YnJlYWs7XG5cdC8vIFx0XHRkZWZhdWx0OlxuXHQvLyBcdFx0XHRzUmVzdWx0ID0gXCJWYWx1ZXNcIjtcblx0Ly8gXHR9XG5cdC8vIFx0cmV0dXJuIHNSZXN1bHQ7XG5cdC8vIH0sXG5cblx0LyoqXG5cdCAqIEFkZHMgZGVmYXVsdCB2YWx1ZXMgdG8gdGhlIG1vZGVsIFtLZWVwIEV4aXN0aW5nIFZhbHVlcywgTGVhdmUgQmxhbmtdLlxuXHQgKlxuXHQgKiBAcGFyYW0gYVZhbHVlcyBBcnJheSBpbnN0YW5jZSB3aGVyZSB0aGUgZGVmYXVsdCBkYXRhIG5lZWRzIHRvIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSBvRGVmYXVsdFZhbHVlcyBEZWZhdWx0IHZhbHVlcyBmcm9tIEFwcGxpY2F0aW9uIE1hbmlmZXN0XG5cdCAqIEBwYXJhbSBvUHJvcGVydHlJbmZvIFByb3BlcnR5IGluZm9ybWF0aW9uXG5cdCAqIEBwYXJhbSBiVU9NRmllbGRcblx0ICovXG5cdHNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZzogZnVuY3Rpb24gKGFWYWx1ZXM6IGFueSwgb0RlZmF1bHRWYWx1ZXM6IGFueSwgb1Byb3BlcnR5SW5mbzogYW55LCBiVU9NRmllbGQ/OiBib29sZWFuKSB7XG5cdFx0Y29uc3Qgc1Byb3BlcnR5UGF0aCA9IGJVT01GaWVsZCA/IG9Qcm9wZXJ0eUluZm8udW5pdFByb3BlcnR5IDogb1Byb3BlcnR5SW5mby5kYXRhUHJvcGVydHksXG5cdFx0XHRzSW5wdXRUeXBlID0gb1Byb3BlcnR5SW5mby5pbnB1dFR5cGUsXG5cdFx0XHRiUHJvcGVydHlSZXF1aXJlZCA9IG9Qcm9wZXJ0eUluZm8uaXNGaWVsZFJlcXVpcmVkO1xuXHRcdC8vIGNvbnN0IHNTdWZmaXhGb3JLZWVwRXhpc3RpbmcgPSBNYXNzRWRpdEhlbHBlci5nZXRTdWZmaXhGb3JLZWVwRXhpc2l0aW5nKHNJbnB1dFR5cGUpO1xuXHRcdGNvbnN0IHNTdWZmaXhGb3JLZWVwRXhpc3RpbmcgPSBcIlZhbHVlc1wiO1xuXHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMgPSBhVmFsdWVzLmRlZmF1bHRPcHRpb25zIHx8IFtdO1xuXHRcdGNvbnN0IHNlbGVjdE9wdGlvbnNFeGlzdCA9IGFWYWx1ZXMuc2VsZWN0T3B0aW9ucyAmJiBhVmFsdWVzLnNlbGVjdE9wdGlvbnMubGVuZ3RoID4gMDtcblx0XHRjb25zdCBrZWVwRW50cnkgPSB7XG5cdFx0XHR0ZXh0OiBgJHtvRGVmYXVsdFZhbHVlcy5rZWVwRXhpc3RpbmdQcmVmaXh9ICR7c1N1ZmZpeEZvcktlZXBFeGlzdGluZ30gPmAsXG5cdFx0XHRrZXk6IGBEZWZhdWx0LyR7c1Byb3BlcnR5UGF0aH1gXG5cdFx0fTtcblxuXHRcdGlmIChzSW5wdXRUeXBlID09PSBcIkNoZWNrQm94XCIpIHtcblx0XHRcdGNvbnN0IGZhbHNlRW50cnkgPSB7IHRleHQ6IFwiTm9cIiwga2V5OiBgJHtzUHJvcGVydHlQYXRofS9mYWxzZWAsIHRleHRJbmZvOiB7IHZhbHVlOiBmYWxzZSB9IH07XG5cdFx0XHRjb25zdCB0cnV0aHlFbnRyeSA9IHsgdGV4dDogXCJZZXNcIiwga2V5OiBgJHtzUHJvcGVydHlQYXRofS90cnVlYCwgdGV4dEluZm86IHsgdmFsdWU6IHRydWUgfSB9O1xuXHRcdFx0YVZhbHVlcy51bnNoaWZ0KGZhbHNlRW50cnkpO1xuXHRcdFx0YVZhbHVlcy5kZWZhdWx0T3B0aW9ucy51bnNoaWZ0KGZhbHNlRW50cnkpO1xuXHRcdFx0YVZhbHVlcy51bnNoaWZ0KHRydXRoeUVudHJ5KTtcblx0XHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMudW5zaGlmdCh0cnV0aHlFbnRyeSk7XG5cdFx0XHRhVmFsdWVzLnVuc2hpZnQoa2VlcEVudHJ5KTtcblx0XHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMudW5zaGlmdChrZWVwRW50cnkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAob1Byb3BlcnR5SW5mby5pc1ZhbHVlSGVscEVuYWJsZWQgfHwgKG9Qcm9wZXJ0eUluZm8uaXNWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCAmJiBiVU9NRmllbGQpKSB7XG5cdFx0XHRcdGNvbnN0IHZoZEVudHJ5ID0geyB0ZXh0OiBvRGVmYXVsdFZhbHVlcy51c2VWYWx1ZUhlbHBWYWx1ZSwga2V5OiBgVXNlVmFsdWVIZWxwVmFsdWUvJHtzUHJvcGVydHlQYXRofWAgfTtcblx0XHRcdFx0YVZhbHVlcy51bnNoaWZ0KHZoZEVudHJ5KTtcblx0XHRcdFx0YVZhbHVlcy5kZWZhdWx0T3B0aW9ucy51bnNoaWZ0KHZoZEVudHJ5KTtcblx0XHRcdH1cblx0XHRcdGlmIChzZWxlY3RPcHRpb25zRXhpc3QpIHtcblx0XHRcdFx0aWYgKGJQcm9wZXJ0eVJlcXVpcmVkICE9PSBcInRydWVcIiAmJiAhYlVPTUZpZWxkKSB7XG5cdFx0XHRcdFx0Y29uc3QgY2xlYXJFbnRyeSA9IHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMuY2xlYXJGaWVsZFZhbHVlLCBrZXk6IGBDbGVhckZpZWxkVmFsdWUvJHtzUHJvcGVydHlQYXRofWAgfTtcblx0XHRcdFx0XHRhVmFsdWVzLnVuc2hpZnQoY2xlYXJFbnRyeSk7XG5cdFx0XHRcdFx0YVZhbHVlcy5kZWZhdWx0T3B0aW9ucy51bnNoaWZ0KGNsZWFyRW50cnkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFWYWx1ZXMudW5zaGlmdChrZWVwRW50cnkpO1xuXHRcdFx0XHRhVmFsdWVzLmRlZmF1bHRPcHRpb25zLnVuc2hpZnQoa2VlcEVudHJ5KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGVtcHR5RW50cnkgPSB7IHRleHQ6IG9EZWZhdWx0VmFsdWVzLmxlYXZlQmxhbmtWYWx1ZSwga2V5OiBgRGVmYXVsdC8ke3NQcm9wZXJ0eVBhdGh9YCB9O1xuXHRcdFx0XHRhVmFsdWVzLnVuc2hpZnQoZW1wdHlFbnRyeSk7XG5cdFx0XHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMudW5zaGlmdChlbXB0eUVudHJ5KTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0ZXh0IGFycmFuZ2VtZW50IGluZm8gZm9yIGEgY29udGV4dCBwcm9wZXJ0eS5cblx0ICpcblx0ICogQHBhcmFtIHByb3BlcnR5IFByb3BlcnR5IFBhdGhcblx0ICogQHBhcmFtIGRlc2NyaXB0aW9uUGF0aCBQYXRoIHRvIHRleHQgYXNzb2NpYXRpb24gb2YgdGhlIHByb3BlcnR5XG5cdCAqIEBwYXJhbSBkaXNwbGF5TW9kZSBEaXNwbGF5IG1vZGUgb2YgdGhlIHByb3BlcnR5IGFuZCB0ZXh0IGFzc29jaWF0aW9uXG5cdCAqIEBwYXJhbSBzZWxlY3RlZENvbnRleHQgQ29udGV4dCB0byBmaW5kIHRoZSBmdWxsIHRleHRcblx0ICogQHJldHVybnMgVGhlIHRleHQgYXJyYW5nZW1lbnRcblx0ICovXG5cdGdldFRleHRBcnJhbmdlbWVudEluZm86IGZ1bmN0aW9uIChcblx0XHRwcm9wZXJ0eTogc3RyaW5nLFxuXHRcdGRlc2NyaXB0aW9uUGF0aDogc3RyaW5nLFxuXHRcdGRpc3BsYXlNb2RlOiBzdHJpbmcsXG5cdFx0c2VsZWN0ZWRDb250ZXh0OiBDb250ZXh0XG5cdCk6IFRleHRBcnJhbmdlbWVudEluZm8ge1xuXHRcdGxldCB2YWx1ZSA9IHNlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QocHJvcGVydHkpLFxuXHRcdFx0ZGVzY3JpcHRpb25WYWx1ZSxcblx0XHRcdGZ1bGxUZXh0O1xuXHRcdGlmIChkZXNjcmlwdGlvblBhdGggJiYgcHJvcGVydHkpIHtcblx0XHRcdHN3aXRjaCAoZGlzcGxheU1vZGUpIHtcblx0XHRcdFx0Y2FzZSBcIkRlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdFx0ZGVzY3JpcHRpb25WYWx1ZSA9IHNlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QoZGVzY3JpcHRpb25QYXRoKSB8fCBcIlwiO1xuXHRcdFx0XHRcdGZ1bGxUZXh0ID0gZGVzY3JpcHRpb25WYWx1ZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIlZhbHVlXCI6XG5cdFx0XHRcdFx0dmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHByb3BlcnR5KSB8fCBcIlwiO1xuXHRcdFx0XHRcdGZ1bGxUZXh0ID0gdmFsdWU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJWYWx1ZURlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdFx0dmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHByb3BlcnR5KSB8fCBcIlwiO1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uVmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KGRlc2NyaXB0aW9uUGF0aCkgfHwgXCJcIjtcblx0XHRcdFx0XHRmdWxsVGV4dCA9IGRlc2NyaXB0aW9uVmFsdWUgPyBgJHt2YWx1ZX0gKCR7ZGVzY3JpcHRpb25WYWx1ZX0pYCA6IHZhbHVlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiRGVzY3JpcHRpb25WYWx1ZVwiOlxuXHRcdFx0XHRcdHZhbHVlID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChwcm9wZXJ0eSkgfHwgXCJcIjtcblx0XHRcdFx0XHRkZXNjcmlwdGlvblZhbHVlID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChkZXNjcmlwdGlvblBhdGgpIHx8IFwiXCI7XG5cdFx0XHRcdFx0ZnVsbFRleHQgPSBkZXNjcmlwdGlvblZhbHVlID8gYCR7ZGVzY3JpcHRpb25WYWx1ZX0gKCR7dmFsdWV9KWAgOiB2YWx1ZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRMb2cuaW5mbyhgRGlzcGxheSBQcm9wZXJ0eSBub3QgYXBwbGljYWJsZTogJHtwcm9wZXJ0eX1gKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0XCJ0ZXh0QXJyYW5nZW1lbnRcIjogZGlzcGxheU1vZGUsXG5cdFx0XHRcInZhbHVlUGF0aFwiOiBwcm9wZXJ0eSxcblx0XHRcdFwiZGVzY3JpcHRpb25QYXRoXCI6IGRlc2NyaXB0aW9uUGF0aCxcblx0XHRcdFwidmFsdWVcIjogdmFsdWUsXG5cdFx0XHRcImRlc2NyaXB0aW9uXCI6IGRlc2NyaXB0aW9uVmFsdWUsXG5cdFx0XHRcImZ1bGxUZXh0XCI6IGZ1bGxUZXh0XG5cdFx0fTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJuIHRoZSB2aXNpYmlsaXR5IHZhbHV1ZSBmb3IgdGhlIE1hbmFnZWRPYmplY3QgQW55LlxuXHQgKlxuXHQgKiBAcGFyYW0gYW55IFRoZSBNYW5hZ2VkT2JqZWN0IEFueSB0byBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgdmlzaWJsZSB2YWx1ZSBvZiB0aGUgYmluZGluZy5cblx0ICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHRoZSBtYXNzIGVkaXQgZmllbGQgaXMgZWRpdGFibGUuXG5cdCAqL1xuXHRpc0VkaXRhYmxlOiBmdW5jdGlvbiAoYW55OiBBbnlUeXBlKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYmluZGluZyA9IGFueS5nZXRCaW5kaW5nKFwiYW55XCIpO1xuXHRcdGNvbnN0IHZhbHVlID0gKGJpbmRpbmcgYXMgYW55KS5nZXRFeHRlcm5hbFZhbHVlKCk7XG5cdFx0cmV0dXJuIHZhbHVlID09PSBFZGl0TW9kZS5FZGl0YWJsZTtcblx0fSxcblxuXHQvKipcblx0ICogQ2FsY3VsYXRlIGFuZCB1cGRhdGUgdGhlIHZpc2liaWxpdHkgb2YgbWFzcyBlZGl0IGZpZWxkIG9uIGNoYW5nZSBvZiB0aGUgTWFuYWdlZE9iamVjdCBBbnkgYmluZGluZy5cblx0ICpcblx0ICogQHBhcmFtIG9EaWFsb2dEYXRhTW9kZWwgTW9kZWwgdG8gYmUgdXNlZCBydW50aW1lLlxuXHQgKiBAcGFyYW0gZGF0YVByb3BlcnR5IEZpZWxkIG5hbWUuXG5cdCAqL1xuXHRvbkNvbnRleHRFZGl0YWJsZUNoYW5nZTogZnVuY3Rpb24gKG9EaWFsb2dEYXRhTW9kZWw6IEpTT05Nb2RlbCwgZGF0YVByb3BlcnR5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zdCBvYmplY3RzRm9yVmlzaWJpbGl0eSA9IG9EaWFsb2dEYXRhTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtkYXRhUHJvcGVydHl9L29iamVjdHNGb3JWaXNpYmlsaXR5YCkgfHwgW107XG5cdFx0Y29uc3QgZWRpdGFibGUgPSBvYmplY3RzRm9yVmlzaWJpbGl0eS5zb21lKE1hc3NFZGl0SGVscGVyLmlzRWRpdGFibGUpO1xuXG5cdFx0aWYgKGVkaXRhYmxlKSB7XG5cdFx0XHRvRGlhbG9nRGF0YU1vZGVsLnNldFByb3BlcnR5KGAvdmFsdWVzLyR7ZGF0YVByb3BlcnR5fS92aXNpYmxlYCwgZWRpdGFibGUpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIE1hbmFnZWQgT2JqZWN0IEFueSBmb3IgdmlzaWJpbGl0eSBvZiB0aGUgbWFzcyBlZGl0IGZpZWxkcy5cblx0ICpcblx0ICogQHBhcmFtIG1PVG9Vc2UgVGhlIE1hbmFnZWRPYmplY3QgQW55IHRvIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB2aXNpYmxlIHZhbHVlIG9mIHRoZSBiaW5kaW5nLlxuXHQgKiBAcGFyYW0gb0RpYWxvZ0RhdGFNb2RlbCBNb2RlbCB0byBiZSB1c2VkIHJ1bnRpbWUuXG5cdCAqIEBwYXJhbSBkYXRhUHJvcGVydHkgRmllbGQgbmFtZS5cblx0ICogQHBhcmFtIHZhbHVlcyBWYWx1ZXMgb2YgdGhlIGZpZWxkLlxuXHQgKi9cblx0dXBkYXRlT25Db250ZXh0Q2hhbmdlOiBmdW5jdGlvbiAobU9Ub1VzZTogQW55VHlwZSwgb0RpYWxvZ0RhdGFNb2RlbDogSlNPTk1vZGVsLCBkYXRhUHJvcGVydHk6IHN0cmluZywgdmFsdWVzOiBhbnkpIHtcblx0XHRjb25zdCBiaW5kaW5nID0gbU9Ub1VzZS5nZXRCaW5kaW5nKFwiYW55XCIpO1xuXG5cdFx0dmFsdWVzLm9iamVjdHNGb3JWaXNpYmlsaXR5ID0gdmFsdWVzLm9iamVjdHNGb3JWaXNpYmlsaXR5IHx8IFtdO1xuXHRcdHZhbHVlcy5vYmplY3RzRm9yVmlzaWJpbGl0eS5wdXNoKG1PVG9Vc2UpO1xuXG5cdFx0YmluZGluZy5hdHRhY2hDaGFuZ2UoTWFzc0VkaXRIZWxwZXIub25Db250ZXh0RWRpdGFibGVDaGFuZ2UuYmluZChudWxsLCBvRGlhbG9nRGF0YU1vZGVsLCBkYXRhUHJvcGVydHkpKTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IGJvdW5kIG9iamVjdCB0byBjYWxjdWxhdGUgdGhlIHZpc2liaWxpdHkgb2YgY29udGV4dHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBleHBCaW5kaW5nIEJpbmRpbmcgU3RyaW5nIG9iamVjdC5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0aGUgYmluZGluZyB2YWx1ZS5cblx0ICogQHJldHVybnMgVGhlIE1hbmFnZWRPYmplY3QgQW55IHRvIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB2aXNpYmxlIHZhbHVlIG9mIHRoZSBiaW5kaW5nLlxuXHQgKi9cblx0Z2V0Qm91bmRPYmplY3Q6IGZ1bmN0aW9uIChleHBCaW5kaW5nOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiwgY29udGV4dDogQ29udGV4dCk6IEFueVR5cGUge1xuXHRcdGNvbnN0IG1PVG9Vc2UgPSBuZXcgQW55KHsgYW55OiBleHBCaW5kaW5nIH0pO1xuXHRcdGNvbnN0IG1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdG1PVG9Vc2Uuc2V0TW9kZWwobW9kZWwpO1xuXHRcdG1PVG9Vc2Uuc2V0QmluZGluZ0NvbnRleHQoY29udGV4dCk7XG5cblx0XHRyZXR1cm4gbU9Ub1VzZTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBmaWVsZC5cblx0ICpcblx0ICogQHBhcmFtIGV4cEJpbmRpbmcgQmluZGluZyBTdHJpbmcgb2JqZWN0LlxuXHQgKiBAcGFyYW0gb0RpYWxvZ0RhdGFNb2RlbCBNb2RlbCB0byBiZSB1c2VkIHJ1bnRpbWUuXG5cdCAqIEBwYXJhbSBkYXRhUHJvcGVydHkgRmllbGQgbmFtZS5cblx0ICogQHBhcmFtIHZhbHVlcyBWYWx1ZXMgb2YgdGhlIGZpZWxkLlxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHRoZSBiaW5kaW5nIHZhbHVlLlxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgdGhlIG1hc3MgZWRpdCBmaWVsZCBpcyBlZGl0YWJsZS5cblx0ICovXG5cdGdldEZpZWxkVmlzaWJsaXR5OiBmdW5jdGlvbiAoXG5cdFx0ZXhwQmluZGluZzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sXG5cdFx0b0RpYWxvZ0RhdGFNb2RlbDogSlNPTk1vZGVsLFxuXHRcdGRhdGFQcm9wZXJ0eTogc3RyaW5nLFxuXHRcdHZhbHVlczogYW55LFxuXHRcdGNvbnRleHQ6IENvbnRleHRcblx0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbU9Ub1VzZSA9IE1hc3NFZGl0SGVscGVyLmdldEJvdW5kT2JqZWN0KGV4cEJpbmRpbmcsIGNvbnRleHQpO1xuXHRcdGNvbnN0IGlzQ29udGV4dEVkaXRhYmxlID0gTWFzc0VkaXRIZWxwZXIuaXNFZGl0YWJsZShtT1RvVXNlKTtcblxuXHRcdGlmICghaXNDb250ZXh0RWRpdGFibGUpIHtcblx0XHRcdE1hc3NFZGl0SGVscGVyLnVwZGF0ZU9uQ29udGV4dENoYW5nZShtT1RvVXNlLCBvRGlhbG9nRGF0YU1vZGVsLCBkYXRhUHJvcGVydHksIHZhbHVlcyk7XG5cdFx0fVxuXHRcdHJldHVybiBpc0NvbnRleHRFZGl0YWJsZTtcblx0fSxcblxuXHQvKipcblx0ICogSW5pdGlhbGl6ZXMgYSBydW50aW1lIG1vZGVsOlxuXHQgKiA9PiBUaGUgbW9kZWwgY29uc2lzdHMgb2YgdmFsdWVzIHNob3duIGluIHRoZSBjb21ib0JveCBvZiB0aGUgZGlhbG9nIChMZWF2ZSBCbGFuaywgS2VlcCBFeGlzdGluZyBWYWx1ZXMsIG9yIGFueSBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHNlbGVjdGVkIGNvbnRleHQsIGV0Yy4pXG5cdCAqID0+IFRoZSBtb2RlbCB3aWxsIGNhcHR1cmUgcnVudGltZSBjaGFuZ2VzIGluIHRoZSByZXN1bHRzIHByb3BlcnR5ICh0aGUgdmFsdWUgZW50ZXJlZCBpbiB0aGUgY29tYm9Cb3gpLlxuXHQgKlxuXHQgKiBAcGFyYW0gYUNvbnRleHRzIENvbnRleHRzIGZvciBtYXNzIGVkaXRcblx0ICogQHBhcmFtIGFEYXRhQXJyYXkgQXJyYXkgY29udGFpbmluZyBkYXRhIHJlbGF0ZWQgdG8gdGhlIGRpYWxvZyB1c2VkIGJ5IGJvdGggdGhlIHN0YXRpYyBhbmQgdGhlIHJ1bnRpbWUgbW9kZWxcblx0ICogQHBhcmFtIG9EZWZhdWx0VmFsdWVzIERlZmF1bHQgdmFsdWVzIGZyb20gaTE4blxuXHQgKiBAcGFyYW0gZGlhbG9nQ29udGV4dCBUcmFuc2llbnQgY29udGV4dCBmb3IgbWFzcyBlZGl0IGRpYWxvZy5cblx0ICogQHJldHVybnMgVGhlIHJ1bnRpbWUgbW9kZWxcblx0ICovXG5cdHNldFJ1bnRpbWVNb2RlbE9uRGlhbG9nOiBmdW5jdGlvbiAoYUNvbnRleHRzOiBhbnlbXSwgYURhdGFBcnJheTogYW55W10sIG9EZWZhdWx0VmFsdWVzOiBhbnksIGRpYWxvZ0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRjb25zdCBhVmFsdWVzOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IGFVbml0RGF0YTogYW55W10gPSBbXTtcblx0XHRjb25zdCBhUmVzdWx0czogYW55W10gPSBbXTtcblx0XHRjb25zdCBhUmVhZE9ubHlGaWVsZEluZm86IGFueVtdID0gW107XG5cdFx0Y29uc3Qgb0RhdGEgPSB7XG5cdFx0XHRcInZhbHVlc1wiOiBhVmFsdWVzLFxuXHRcdFx0XCJ1bml0RGF0YVwiOiBhVW5pdERhdGEsXG5cdFx0XHRcInJlc3VsdHNcIjogYVJlc3VsdHMsXG5cdFx0XHRcInJlYWRhYmxlUHJvcGVydHlEYXRhXCI6IGFSZWFkT25seUZpZWxkSW5mbyxcblx0XHRcdFwic2VsZWN0ZWRLZXlcIjogdW5kZWZpbmVkLFxuXHRcdFx0XCJub0ZpZWxkc1wiOiBvRGVmYXVsdFZhbHVlcy5ub0ZpZWxkc1xuXHRcdH07XG5cdFx0Y29uc3Qgb0RpYWxvZ0RhdGFNb2RlbCA9IG5ldyBKU09OTW9kZWwob0RhdGEpO1xuXHRcdGFEYXRhQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAob0luRGF0YTogYW55KSB7XG5cdFx0XHRsZXQgb1RleHRJbmZvO1xuXHRcdFx0bGV0IHNQcm9wZXJ0eUtleTtcblx0XHRcdGxldCBzVW5pdFByb3BlcnR5TmFtZTtcblx0XHRcdGNvbnN0IG9EaXN0aW5jdFZhbHVlTWFwOiBhbnkgPSB7fTtcblx0XHRcdGNvbnN0IG9EaXN0aW5jdFVuaXRNYXA6IGFueSA9IHt9O1xuXHRcdFx0aWYgKG9JbkRhdGEuZGF0YVByb3BlcnR5ICYmIG9JbkRhdGEuZGF0YVByb3BlcnR5LmluZGV4T2YoXCIvXCIpID4gLTEpIHtcblx0XHRcdFx0Y29uc3QgYUZpbmFsUGF0aCA9IE1hc3NFZGl0SGVscGVyLmluaXRMYXN0TGV2ZWxPZlByb3BlcnR5UGF0aChvSW5EYXRhLmRhdGFQcm9wZXJ0eSwgYVZhbHVlcyAvKiwgZGlhbG9nQ29udGV4dCAqLyk7XG5cdFx0XHRcdGNvbnN0IGFQcm9wZXJ0eVBhdGhzID0gb0luRGF0YS5kYXRhUHJvcGVydHkuc3BsaXQoXCIvXCIpO1xuXG5cdFx0XHRcdGZvciAoY29uc3QgY29udGV4dCBvZiBhQ29udGV4dHMpIHtcblx0XHRcdFx0XHRjb25zdCBzTXVsdGlMZXZlbFBhdGhWYWx1ZSA9IGNvbnRleHQuZ2V0T2JqZWN0KG9JbkRhdGEuZGF0YVByb3BlcnR5KTtcblx0XHRcdFx0XHRzUHJvcGVydHlLZXkgPSBgJHtvSW5EYXRhLmRhdGFQcm9wZXJ0eX0vJHtzTXVsdGlMZXZlbFBhdGhWYWx1ZX1gO1xuXHRcdFx0XHRcdGlmICghb0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSAmJiBhRmluYWxQYXRoW2FQcm9wZXJ0eVBhdGhzW2FQcm9wZXJ0eVBhdGhzLmxlbmd0aCAtIDFdXSkge1xuXHRcdFx0XHRcdFx0b1RleHRJbmZvID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyhcblx0XHRcdFx0XHRcdFx0b0luRGF0YS5kYXRhUHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdG9JbkRhdGEuZGVzY3JpcHRpb25QYXRoLFxuXHRcdFx0XHRcdFx0XHRvSW5EYXRhLmRpc3BsYXksXG5cdFx0XHRcdFx0XHRcdGNvbnRleHRcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRhRmluYWxQYXRoW2FQcm9wZXJ0eVBhdGhzW2FQcm9wZXJ0eVBhdGhzLmxlbmd0aCAtIDFdXS5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XCJ0ZXh0XCI6IChvVGV4dEluZm8gJiYgb1RleHRJbmZvLmZ1bGxUZXh0KSB8fCBzTXVsdGlMZXZlbFBhdGhWYWx1ZSxcblx0XHRcdFx0XHRcdFx0XCJrZXlcIjogc1Byb3BlcnR5S2V5LFxuXHRcdFx0XHRcdFx0XHRcInRleHRJbmZvXCI6IG9UZXh0SW5mb1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldID0gc011bHRpTGV2ZWxQYXRoVmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIGlmIChPYmplY3Qua2V5cyhvRGlzdGluY3RWYWx1ZU1hcCkubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdC8vIFx0ZGlhbG9nQ29udGV4dC5zZXRQcm9wZXJ0eShvRGF0YS5kYXRhUHJvcGVydHksIHNQcm9wZXJ0eUtleSAmJiBvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldKTtcblx0XHRcdFx0Ly8gfVxuXG5cdFx0XHRcdGFGaW5hbFBhdGhbYVByb3BlcnR5UGF0aHNbYVByb3BlcnR5UGF0aHMubGVuZ3RoIC0gMV1dLnRleHRJbmZvID0ge1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uUGF0aDogb0luRGF0YS5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0dmFsdWVQYXRoOiBvSW5EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRkaXNwbGF5TW9kZTogb0luRGF0YS5kaXNwbGF5XG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XSA9IGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldIHx8IFtdO1xuXHRcdFx0XHRhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0gPSBhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0gfHwgW107XG5cdFx0XHRcdGlmIChvSW5EYXRhLnVuaXRQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV0gPSBhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldIHx8IFtdO1xuXHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV1bXCJzZWxlY3RPcHRpb25zXCJdID0gYVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0gfHwgW107XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9yIChjb25zdCBjb250ZXh0IG9mIGFDb250ZXh0cykge1xuXHRcdFx0XHRcdGNvbnN0IG9EYXRhT2JqZWN0ID0gY29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRzUHJvcGVydHlLZXkgPSBgJHtvSW5EYXRhLmRhdGFQcm9wZXJ0eX0vJHtvRGF0YU9iamVjdFtvSW5EYXRhLmRhdGFQcm9wZXJ0eV19YDtcblx0XHRcdFx0XHRpZiAob0luRGF0YS5kYXRhUHJvcGVydHkgJiYgb0RhdGFPYmplY3Rbb0luRGF0YS5kYXRhUHJvcGVydHldICYmICFvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldKSB7XG5cdFx0XHRcdFx0XHRpZiAob0luRGF0YS5pbnB1dFR5cGUgIT0gXCJDaGVja0JveFwiKSB7XG5cdFx0XHRcdFx0XHRcdG9UZXh0SW5mbyA9IE1hc3NFZGl0SGVscGVyLmdldFRleHRBcnJhbmdlbWVudEluZm8oXG5cdFx0XHRcdFx0XHRcdFx0b0luRGF0YS5kYXRhUHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdFx0b0luRGF0YS5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0XHRcdFx0b0luRGF0YS5kaXNwbGF5LFxuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHRcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgZW50cnkgPSB7XG5cdFx0XHRcdFx0XHRcdFx0XCJ0ZXh0XCI6IChvVGV4dEluZm8gJiYgb1RleHRJbmZvLmZ1bGxUZXh0KSB8fCBvRGF0YU9iamVjdFtvSW5EYXRhLmRhdGFQcm9wZXJ0eV0sXG5cdFx0XHRcdFx0XHRcdFx0XCJrZXlcIjogc1Byb3BlcnR5S2V5LFxuXHRcdFx0XHRcdFx0XHRcdFwidGV4dEluZm9cIjogb1RleHRJbmZvXG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldLnB1c2goZW50cnkpO1xuXHRcdFx0XHRcdFx0XHRhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0ucHVzaChlbnRyeSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldID0gb0RhdGFPYmplY3Rbb0luRGF0YS5kYXRhUHJvcGVydHldO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAob0luRGF0YS51bml0UHJvcGVydHkgJiYgb0RhdGFPYmplY3Rbb0luRGF0YS51bml0UHJvcGVydHldKSB7XG5cdFx0XHRcdFx0XHRzVW5pdFByb3BlcnR5TmFtZSA9IGAke29JbkRhdGEudW5pdFByb3BlcnR5fS8ke29EYXRhT2JqZWN0W29JbkRhdGEudW5pdFByb3BlcnR5XX1gO1xuXHRcdFx0XHRcdFx0aWYgKCFvRGlzdGluY3RVbml0TWFwW3NVbml0UHJvcGVydHlOYW1lXSkge1xuXHRcdFx0XHRcdFx0XHRpZiAob0luRGF0YS5pbnB1dFR5cGUgIT0gXCJDaGVja0JveFwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0b1RleHRJbmZvID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyhcblx0XHRcdFx0XHRcdFx0XHRcdG9JbkRhdGEudW5pdFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRcdFx0b0luRGF0YS5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0XHRcdFx0XHRvSW5EYXRhLmRpc3BsYXksXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCB1bml0RW50cnkgPSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcInRleHRcIjogKG9UZXh0SW5mbyAmJiBvVGV4dEluZm8uZnVsbFRleHQpIHx8IG9EYXRhT2JqZWN0W29JbkRhdGEudW5pdFByb3BlcnR5XSxcblx0XHRcdFx0XHRcdFx0XHRcdFwia2V5XCI6IHNVbml0UHJvcGVydHlOYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0XCJ0ZXh0SW5mb1wiOiBvVGV4dEluZm9cblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV0ucHVzaCh1bml0RW50cnkpO1xuXHRcdFx0XHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV1bXCJzZWxlY3RPcHRpb25zXCJdLnB1c2godW5pdEVudHJ5KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRvRGlzdGluY3RVbml0TWFwW3NVbml0UHJvcGVydHlOYW1lXSA9IG9EYXRhT2JqZWN0W29JbkRhdGEudW5pdFByb3BlcnR5XTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0YVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV0udGV4dEluZm8gPSB7XG5cdFx0XHRcdFx0ZGVzY3JpcHRpb25QYXRoOiBvSW5EYXRhLmRlc2NyaXB0aW9uUGF0aCxcblx0XHRcdFx0XHR2YWx1ZVBhdGg6IG9JbkRhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdGRpc3BsYXlNb2RlOiBvSW5EYXRhLmRpc3BsYXlcblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKE9iamVjdC5rZXlzKG9EaXN0aW5jdFZhbHVlTWFwKS5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRkaWFsb2dDb250ZXh0LnNldFByb3BlcnR5KG9JbkRhdGEuZGF0YVByb3BlcnR5LCBzUHJvcGVydHlLZXkgJiYgb0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKE9iamVjdC5rZXlzKG9EaXN0aW5jdFVuaXRNYXApLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdGRpYWxvZ0NvbnRleHQuc2V0UHJvcGVydHkob0luRGF0YS51bml0UHJvcGVydHksIHNVbml0UHJvcGVydHlOYW1lICYmIG9EaXN0aW5jdFVuaXRNYXBbc1VuaXRQcm9wZXJ0eU5hbWVdKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGFEYXRhQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAob0luRGF0YTogYW55KSB7XG5cdFx0XHRsZXQgdmFsdWVzOiBhbnkgPSB7fTtcblx0XHRcdGlmIChvSW5EYXRhLmRhdGFQcm9wZXJ0eS5pbmRleE9mKFwiL1wiKSA+IC0xKSB7XG5cdFx0XHRcdGNvbnN0IHNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZSA9IE1hc3NFZGl0SGVscGVyLmdldFZhbHVlRm9yTXVsdGlMZXZlbFBhdGgob0luRGF0YS5kYXRhUHJvcGVydHksIGFWYWx1ZXMpO1xuXHRcdFx0XHRpZiAoIXNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZSkge1xuXHRcdFx0XHRcdHNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZS5wdXNoKHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMubGVhdmVCbGFua1ZhbHVlLCBrZXk6IGBFbXB0eS8ke29JbkRhdGEuZGF0YVByb3BlcnR5fWAgfSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuc2V0RGVmYXVsdFZhbHVlc1RvRGlhbG9nKHNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZSwgb0RlZmF1bHRWYWx1ZXMsIG9JbkRhdGEpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHZhbHVlcyA9IHNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZTtcblx0XHRcdH0gZWxzZSBpZiAoYVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV0pIHtcblx0XHRcdFx0YVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV0gPSBhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XSB8fCBbXTtcblx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuc2V0RGVmYXVsdFZhbHVlc1RvRGlhbG9nKGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldLCBvRGVmYXVsdFZhbHVlcywgb0luRGF0YSk7XG5cdFx0XHRcdHZhbHVlcyA9IGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XSAmJiBhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLmxlbmd0aCkge1xuXHRcdFx0XHRNYXNzRWRpdEhlbHBlci5zZXREZWZhdWx0VmFsdWVzVG9EaWFsb2coYVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XSwgb0RlZmF1bHRWYWx1ZXMsIG9JbkRhdGEsIHRydWUpO1xuXHRcdFx0XHRhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLnRleHRJbmZvID0ge307XG5cdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV0uc2VsZWN0ZWRLZXkgPSBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0U2VsZWN0aW9uUGF0aENvbWJvQm94KFxuXHRcdFx0XHRcdGFDb250ZXh0cyxcblx0XHRcdFx0XHRvSW5EYXRhLnVuaXRQcm9wZXJ0eVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLmlucHV0VHlwZSA9IG9JbkRhdGEuaW5wdXRUeXBlO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0KG9JbkRhdGEuZGF0YVByb3BlcnR5ICYmIGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldICYmICFhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XS5sZW5ndGgpIHx8XG5cdFx0XHRcdChvSW5EYXRhLnVuaXRQcm9wZXJ0eSAmJiBhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldICYmICFhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLmxlbmd0aClcblx0XHRcdCkge1xuXHRcdFx0XHRjb25zdCBiQ2xlYXJGaWVsZE9yQmxhbmtWYWx1ZUV4aXN0cyA9XG5cdFx0XHRcdFx0YVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV0gJiZcblx0XHRcdFx0XHRhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XS5zb21lKGZ1bmN0aW9uIChvYmo6IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9iai50ZXh0ID09PSBcIjwgQ2xlYXIgVmFsdWVzID5cIiB8fCBvYmoudGV4dCA9PT0gXCI8IExlYXZlIEJsYW5rID5cIjtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKG9JbkRhdGEuZGF0YVByb3BlcnR5ICYmICFiQ2xlYXJGaWVsZE9yQmxhbmtWYWx1ZUV4aXN0cykge1xuXHRcdFx0XHRcdGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldLnB1c2goeyB0ZXh0OiBvRGVmYXVsdFZhbHVlcy5sZWF2ZUJsYW5rVmFsdWUsIGtleTogYEVtcHR5LyR7b0luRGF0YS5kYXRhUHJvcGVydHl9YCB9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBiQ2xlYXJGaWVsZE9yQmxhbmtVbml0VmFsdWVFeGlzdHMgPVxuXHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV0gJiZcblx0XHRcdFx0XHRhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLnNvbWUoZnVuY3Rpb24gKG9iajogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb2JqLnRleHQgPT09IFwiPCBDbGVhciBWYWx1ZXMgPlwiIHx8IG9iai50ZXh0ID09PSBcIjwgTGVhdmUgQmxhbmsgPlwiO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAob0luRGF0YS51bml0UHJvcGVydHkpIHtcblx0XHRcdFx0XHRpZiAoIWJDbGVhckZpZWxkT3JCbGFua1VuaXRWYWx1ZUV4aXN0cykge1xuXHRcdFx0XHRcdFx0YVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XS5wdXNoKHtcblx0XHRcdFx0XHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMubGVhdmVCbGFua1ZhbHVlLFxuXHRcdFx0XHRcdFx0XHRrZXk6IGBFbXB0eS8ke29JbkRhdGEudW5pdFByb3BlcnR5fWBcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLnRleHRJbmZvID0ge307XG5cdFx0XHRcdFx0YVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XS5zZWxlY3RlZEtleSA9IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goXG5cdFx0XHRcdFx0XHRhQ29udGV4dHMsXG5cdFx0XHRcdFx0XHRvSW5EYXRhLnVuaXRQcm9wZXJ0eVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XS5pbnB1dFR5cGUgPSBvSW5EYXRhLmlucHV0VHlwZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG9JbkRhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5ICYmIHR5cGVvZiBvSW5EYXRhLmlzUHJvcGVydHlSZWFkT25seSA9PT0gXCJib29sZWFuXCIpIHtcblx0XHRcdFx0YVJlYWRPbmx5RmllbGRJbmZvLnB1c2goeyBcInByb3BlcnR5XCI6IG9JbkRhdGEuZGF0YVByb3BlcnR5LCB2YWx1ZTogb0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHksIHR5cGU6IFwiRGVmYXVsdFwiIH0pO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0b0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkgJiZcblx0XHRcdFx0b0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHMgJiZcblx0XHRcdFx0b0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0gJiZcblx0XHRcdFx0b0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDEgJiZcblx0XHRcdFx0b0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDJcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBUaGlzIG5lZWRzIHRvIGJlIHJlZmFjdG9yZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBSZWFkT25seUV4cHJlc3Npb24gY2hhbmdlXG5cdFx0XHRcdGFSZWFkT25seUZpZWxkSW5mby5wdXNoKHtcblx0XHRcdFx0XHRcInByb3BlcnR5XCI6IG9JbkRhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdHByb3BlcnR5UGF0aDogb0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDEucGF0aCxcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlOiBvSW5EYXRhLmlzUHJvcGVydHlSZWFkT25seS5vcGVyYW5kc1swXS5vcGVyYW5kMi52YWx1ZSxcblx0XHRcdFx0XHR0eXBlOiBcIlBhdGhcIlxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0dGluZyB2aXNiaWxpdHkgb2YgdGhlIG1hc3MgZWRpdCBmaWVsZC5cblx0XHRcdGlmIChvSW5EYXRhLmVkaXRNb2RlKSB7XG5cdFx0XHRcdHZhbHVlcy52aXNpYmxlID1cblx0XHRcdFx0XHRvSW5EYXRhLmVkaXRNb2RlID09PSBFZGl0TW9kZS5FZGl0YWJsZSB8fFxuXHRcdFx0XHRcdGFDb250ZXh0cy5zb21lKFxuXHRcdFx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuZ2V0RmllbGRWaXNpYmxpdHkuYmluZChcblx0XHRcdFx0XHRcdFx0TWFzc0VkaXRIZWxwZXIsXG5cdFx0XHRcdFx0XHRcdG9JbkRhdGEuZWRpdE1vZGUsXG5cdFx0XHRcdFx0XHRcdG9EaWFsb2dEYXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdG9JbkRhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHR2YWx1ZXNcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFsdWVzLnZpc2libGUgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0dmFsdWVzLnNlbGVjdGVkS2V5ID0gTWFzc0VkaXRIZWxwZXIuZ2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveChhQ29udGV4dHMsIG9JbkRhdGEuZGF0YVByb3BlcnR5KTtcblx0XHRcdHZhbHVlcy5pbnB1dFR5cGUgPSBvSW5EYXRhLmlucHV0VHlwZTtcblx0XHRcdHZhbHVlcy51bml0UHJvcGVydHkgPSBvSW5EYXRhLnVuaXRQcm9wZXJ0eTtcblx0XHR9KTtcblxuXHRcdHJldHVybiBvRGlhbG9nRGF0YU1vZGVsO1xuXHR9LFxuXHQvKipcblx0ICogR2V0cyB0cmFuc2llbnQgY29udGV4dCBmb3IgZGlhbG9nLlxuXHQgKlxuXHQgKiBAcGFyYW0gdGFibGUgSW5zdGFuY2Ugb2YgVGFibGUuXG5cdCAqIEBwYXJhbSBkaWFsb2cgTWFzcyBFZGl0IERpYWxvZy5cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXR1cm5pbmcgaW5zdGFuY2Ugb2YgZGlhbG9nLlxuXHQgKi9cblx0Z2V0RGlhbG9nQ29udGV4dDogZnVuY3Rpb24gKHRhYmxlOiBUYWJsZSwgZGlhbG9nPzogRGlhbG9nKTogQ29udGV4dCB7XG5cdFx0bGV0IHRyYW5zQ3R4OiBDb250ZXh0ID0gKGRpYWxvZyAmJiBkaWFsb2cuZ2V0QmluZGluZ0NvbnRleHQoKSkgYXMgQ29udGV4dDtcblxuXHRcdGlmICghdHJhbnNDdHgpIHtcblx0XHRcdGNvbnN0IG1vZGVsID0gdGFibGUuZ2V0TW9kZWwoKTtcblx0XHRcdGNvbnN0IGxpc3RCaW5kaW5nID0gdGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdFx0Y29uc3QgdHJhbnNpZW50TGlzdEJpbmRpbmcgPSBtb2RlbC5iaW5kTGlzdChsaXN0QmluZGluZy5nZXRQYXRoKCksIGxpc3RCaW5kaW5nLmdldENvbnRleHQoKSwgW10sIFtdLCB7XG5cdFx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCJzdWJtaXRMYXRlclwiXG5cdFx0XHR9KSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHRcdFx0KHRyYW5zaWVudExpc3RCaW5kaW5nIGFzIGFueSkucmVmcmVzaEludGVybmFsID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHQvKiAqL1xuXHRcdFx0fTtcblx0XHRcdHRyYW5zQ3R4ID0gdHJhbnNpZW50TGlzdEJpbmRpbmcuY3JlYXRlKHt9LCB0cnVlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJhbnNDdHg7XG5cdH0sXG5cblx0b25EaWFsb2dPcGVuOiBmdW5jdGlvbiAoZXZlbnQ6IGFueSk6IHZvaWQge1xuXHRcdGNvbnN0IHNvdXJjZSA9IGV2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IGZpZWxkc0luZm9Nb2RlbCA9IHNvdXJjZS5nZXRNb2RlbChcImZpZWxkc0luZm9cIik7XG5cdFx0ZmllbGRzSW5mb01vZGVsLnNldFByb3BlcnR5KFwiL2lzT3BlblwiLCB0cnVlKTtcblx0fSxcblxuXHQvKipcblx0ICogQ3JlYXRlIHRoZSBtYXNzIGVkaXQgZGlhbG9nLlxuXHQgKlxuXHQgKiBAcGFyYW0gb1RhYmxlIEluc3RhbmNlIG9mIFRhYmxlXG5cdCAqIEBwYXJhbSBhQ29udGV4dHMgQ29udGV4dHMgZm9yIG1hc3MgZWRpdFxuXHQgKiBAcGFyYW0gb0NvbnRyb2xsZXIgQ29udHJvbGxlciBmb3IgdGhlIHZpZXdcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXR1cm5pbmcgaW5zdGFuY2Ugb2YgZGlhbG9nLlxuXHQgKi9cblx0Y3JlYXRlRGlhbG9nOiBmdW5jdGlvbiAob1RhYmxlOiBUYWJsZSwgYUNvbnRleHRzOiBhbnlbXSwgb0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyKSB7XG5cdFx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IFwic2FwL2ZlL2NvcmUvY29udHJvbHMvbWFzc0VkaXQvTWFzc0VkaXREaWFsb2dcIixcblx0XHRcdGFEYXRhQXJyYXk6IGFueVtdID0gW10sXG5cdFx0XHRvUmVzb3VyY2VCdW5kbGUgPSAoQ29yZSBhcyBDb3JlRXgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpLFxuXHRcdFx0b0RlZmF1bHRWYWx1ZXMgPSBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0VGV4dHNGb3JEaWFsb2cob1Jlc291cmNlQnVuZGxlLCBhQ29udGV4dHMubGVuZ3RoLCBvVGFibGUpLFxuXHRcdFx0b0RhdGFGaWVsZE1vZGVsID0gTWFzc0VkaXRIZWxwZXIucHJlcGFyZURhdGFGb3JEaWFsb2cob1RhYmxlLCBhQ29udGV4dHMsIGFEYXRhQXJyYXkpLFxuXHRcdFx0ZGlhbG9nQ29udGV4dCA9IE1hc3NFZGl0SGVscGVyLmdldERpYWxvZ0NvbnRleHQob1RhYmxlKSxcblx0XHRcdG9EaWFsb2dEYXRhTW9kZWwgPSBNYXNzRWRpdEhlbHBlci5zZXRSdW50aW1lTW9kZWxPbkRpYWxvZyhhQ29udGV4dHMsIGFEYXRhQXJyYXksIG9EZWZhdWx0VmFsdWVzLCBkaWFsb2dDb250ZXh0KTtcblxuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0Y29uc3Qgb0ZyYWdtZW50ID0gWE1MVGVtcGxhdGVQcm9jZXNzb3IubG9hZFRlbXBsYXRlKHNGcmFnbWVudE5hbWUsIFwiZnJhZ21lbnRcIik7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHRYTUxQcmVwcm9jZXNzb3IucHJvY2Vzcyhcblx0XHRcdFx0XHRvRnJhZ21lbnQsXG5cdFx0XHRcdFx0eyBuYW1lOiBzRnJhZ21lbnROYW1lIH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRcdGRhdGFGaWVsZE1vZGVsOiBvRGF0YUZpZWxkTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdFx0XHRcdGRhdGFGaWVsZE1vZGVsOiBvRGF0YUZpZWxkTW9kZWxcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdClcblx0XHRcdClcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9DcmVhdGVkRnJhZ21lbnQ6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBGcmFnbWVudC5sb2FkKHsgZGVmaW5pdGlvbjogb0NyZWF0ZWRGcmFnbWVudCB9KS50aGVuKGZ1bmN0aW9uIChvRGlhbG9nQ29udGVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBEcmFmdFN0YXR1cyA9IEZFTGlicmFyeS5EcmFmdFN0YXR1cztcblx0XHRcdFx0XHRcdGNvbnN0IG9EaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdFx0XHRcdFx0cmVzaXphYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHR0aXRsZTogb0RlZmF1bHRWYWx1ZXMubWFzc0VkaXRUaXRsZSxcblx0XHRcdFx0XHRcdFx0Y29udGVudDogW29EaWFsb2dDb250ZW50XSxcblx0XHRcdFx0XHRcdFx0YWZ0ZXJPcGVuOiBNYXNzRWRpdEhlbHBlci5vbkRpYWxvZ09wZW4sXG5cdFx0XHRcdFx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdFx0XHR0ZXh0OiBNYXNzRWRpdEhlbHBlci5oZWxwZXJzLmdldEV4cEJpbmRpbmdGb3JBcHBseUJ1dHRvblR4dChvRGVmYXVsdFZhbHVlcywgb0RhdGFGaWVsZE1vZGVsLmdldE9iamVjdChcIi9cIikpLFxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdChvQ29udHJvbGxlci5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQpPy5zZXRQcm9wZXJ0eShcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJza2lwUGF0Y2hIYW5kbGVyc1wiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0luRGlhbG9nID0gb0V2ZW50LmdldFNvdXJjZSgpLmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb01vZGVsID0gb0luRGlhbG9nLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFSZXN1bHRzID0gb01vZGVsLmdldFByb3BlcnR5KFwiL3Jlc3VsdHNcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhUHJvcGVydHlSZWFkYWJsZUluZm8gPSBvTW9kZWwuZ2V0UHJvcGVydHkoXCIvcmVhZGFibGVQcm9wZXJ0eURhdGFcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBjaGFuZ2VQcm9taXNlOiBhbnlbXSA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IGJSZWFkT25seUZpZWxkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgZ3JvdXBJZDtcblx0XHRcdFx0XHRcdFx0XHRcdC8vbGV0IGluZGV4ID0gMDtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGVycm9yVmFsdWVzOiBhbnlbXSA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0YUNvbnRleHRzLmZvckVhY2goZnVuY3Rpb24gKG9TZWxlY3RlZENvbnRleHQ6IGFueSwgaWR4OiBudW1iZXIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YVJlc3VsdHMuZm9yRWFjaChmdW5jdGlvbiAob1Jlc3VsdDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9UT0RPIC0gQWRkIHNhdmUgaW1wbGVtZW50YXRpb24gZm9yIFZhbHVlIEhlbHAuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFQcm9wZXJ0eVJlYWRhYmxlSW5mbykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YlJlYWRPbmx5RmllbGQgPSBhUHJvcGVydHlSZWFkYWJsZUluZm8uc29tZShmdW5jdGlvbiAob1Byb3BlcnR5SW5mbzogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvUmVzdWx0LmtleVZhbHVlID09PSBvUHJvcGVydHlJbmZvLnByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9Qcm9wZXJ0eUluZm8udHlwZSA9PT0gXCJEZWZhdWx0XCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvUHJvcGVydHlJbmZvLnZhbHVlID09PSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUHJvcGVydHlJbmZvLnR5cGUgPT09IFwiUGF0aFwiICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUHJvcGVydHlJbmZvLnByb3BlcnR5VmFsdWUgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm8ucHJvcGVydHlQYXRoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvU2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChvUHJvcGVydHlJbmZvLnByb3BlcnR5UGF0aCkgPT09XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm8ucHJvcGVydHlWYWx1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRncm91cElkID0gYCRhdXRvLiR7aWR4fWA7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9pbmRleCArPSAxO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Db250cm9sbGVyLl9lZGl0Rmxvdy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vbGV0IHByb21pc2VDb3VudCA9IDA7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9SZXN1bHQua2V5VmFsdWUgJiYgb1Jlc3VsdC52YWx1ZSAhPT0gXCJEZWZhdWx0XCIgJiYgIWJSZWFkT25seUZpZWxkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VQcm9taXNlLnB1c2goXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9TZWxlY3RlZENvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuc2V0UHJvcGVydHkob1Jlc3VsdC5rZXlWYWx1ZSwgb1Jlc3VsdC52YWx1ZSwgZ3JvdXBJZClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb1NlbGVjdGVkQ29udGV4dDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVycm9yVmFsdWVzLnB1c2gob1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QoKSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJNYXNzIEVkaXQ6IFNvbWV0aGluZyB3ZW50IHdyb25nIGluIHVwZGF0aW5nIGVudHJpZXMuXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9jYXRjaC1vci1yZXR1cm5cblx0XHRcdFx0XHRcdFx0XHRcdChQcm9taXNlIGFzIGFueSkuYWxsU2V0dGxlZChjaGFuZ2VQcm9taXNlKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0xpc3RCaW5kaW5nID0gb1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0V4dGVuc2lvbkFQSSA9IG9Db250cm9sbGVyICYmIChvQ29udHJvbGxlci5nZXRFeHRlbnNpb25BUEkoKSBhcyBhbnkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0V4dGVuc2lvbkFQSS5yZWZyZXNoKG9MaXN0QmluZGluZy5nZXRQYXRoKCkpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHN1YnRpdGxlQ29sdW1uID0gQ29tbW9uVXRpbHMuZ2V0TWVzc2FnZUNvbHVtbihvVGFibGUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG1lc3NhZ2VzID0gc2FwLnVpLmdldENvcmUoKS5nZXRNZXNzYWdlTWFuYWdlcigpLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHRzID0gW10gYXMgYW55O1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24gKG1lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgbWVzc2FnZVRhcmdldHMgPSBtZXNzYWdlLmdldFRhcmdldHMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZVRhcmdldHMgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZVRhcmdldHMubGVuZ3RoID09PSAxICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VUYXJnZXRzWzBdLmxlbmd0aCAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlLnBlcnNpc3RlbnQgPT09IHRydWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHQgPSBhQ29udGV4dHMuZmluZChmdW5jdGlvbiAob0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBtZXNzYWdlLmdldFRhcmdldCgpLmluZGV4T2Yob0NvbnRleHQuZ2V0UGF0aCgpKSAhPT0gLTE7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHRzLnB1c2goYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZS5hZGRpdGlvbmFsVGV4dCA9IGJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0LmdldE9iamVjdCgpW3N1YnRpdGxlQ29sdW1uXVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFSZXN1bHRzLmxlbmd0aCA+IDAgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dHMubGVuZ3RoID09PSAwICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlcnJvclZhbHVlcy5sZW5ndGggPT09IDBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Db250cm9sbGVyLl9lZGl0Rmxvdy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBzdWNjZXNzVG9hc3QgPSBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUFTU19FRElUX1NVQ0NFU1NfVE9BU1RcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhzdWNjZXNzVG9hc3QpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlcnJvclZhbHVlcy5sZW5ndGggKyBib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHRzLmxlbmd0aCA8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQob1RhYmxlIGFzIGFueSkuZ2V0U2VsZWN0ZWRDb250ZXh0cygpLmxlbmd0aFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIuX2VkaXRGbG93LnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JWYWx1ZXMubGVuZ3RoICsgYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0cy5sZW5ndGggPT09XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQob1RhYmxlIGFzIGFueSkuZ2V0U2VsZWN0ZWRDb250ZXh0cygpLmxlbmd0aFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIuX2VkaXRGbG93LnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIuX2VkaXRGbG93LmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9JbkRpYWxvZy5pc09wZW4oKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0luRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvSW5EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KG9Db250cm9sbGVyLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCk/LnNldFByb3BlcnR5KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcInNraXBQYXRjaEhhbmRsZXJzXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZhbHNlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0XHRcdHRleHQ6IG9EZWZhdWx0VmFsdWVzLmNhbmNlbEJ1dHRvblRleHQsXG5cdFx0XHRcdFx0XHRcdFx0dmlzaWJsZTogTWFzc0VkaXRIZWxwZXIuaGVscGVycy5oYXNFZGl0YWJsZUZpZWxkc0JpbmRpbmcob0RhdGFGaWVsZE1vZGVsLmdldE9iamVjdChcIi9cIiksIHRydWUpIGFzIGFueSxcblx0XHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvSW5EaWFsb2cgPSBvRXZlbnQuZ2V0U291cmNlKCkuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRvSW5EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0XHRcdG9JbkRpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRjb25zdCBtb2RlbCA9IG9UYWJsZS5nZXRNb2RlbCgpO1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5zZXRNb2RlbChvRGlhbG9nRGF0YU1vZGVsLCBcImZpZWxkc0luZm9cIik7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLnNldE1vZGVsKG1vZGVsKTtcblx0XHRcdFx0XHRcdG9EaWFsb2cuc2V0QmluZGluZ0NvbnRleHQoZGlhbG9nQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKG9EaWFsb2cpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2gocmVqZWN0KTtcblx0XHR9KTtcblx0fSxcblxuXHRoZWxwZXJzOiB7XG5cdFx0Z2V0QmluZGluZ0V4cEZvckhhc0VkaXRhYmxlRmllbGRzOiAoZmllbGRzOiBhbnksIGVkaXRhYmxlOiBib29sZWFuKSA9PiB7XG5cdFx0XHRjb25zdCB0b3RhbEV4cCA9IGZpZWxkcy5yZWR1Y2UoXG5cdFx0XHRcdChleHByZXNzaW9uOiBhbnksIGZpZWxkOiBhbnkpID0+XG5cdFx0XHRcdFx0b3IoXG5cdFx0XHRcdFx0XHRleHByZXNzaW9uLFxuXHRcdFx0XHRcdFx0cGF0aEluTW9kZWwoXCIvdmFsdWVzL1wiICsgZmllbGQuZGF0YVByb3BlcnR5ICsgXCIvdmlzaWJsZVwiLCBcImZpZWxkc0luZm9cIikgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+XG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0Y29uc3RhbnQoZmFsc2UpXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIGVkaXRhYmxlID8gdG90YWxFeHAgOiBub3QodG90YWxFeHApO1xuXHRcdH0sXG5cblx0XHRnZXRFeHBCaW5kaW5nRm9yQXBwbHlCdXR0b25UeHQ6IChkZWZhdWx0VmFsdWVzOiBhbnksIGZpZWxkczogYm9vbGVhbikgPT4ge1xuXHRcdFx0Y29uc3QgZWRpdGFibGVFeHAgPSBNYXNzRWRpdEhlbHBlci5oZWxwZXJzLmdldEJpbmRpbmdFeHBGb3JIYXNFZGl0YWJsZUZpZWxkcyhmaWVsZHMsIHRydWUpO1xuXHRcdFx0Y29uc3QgdG90YWxFeHAgPSBpZkVsc2UoZWRpdGFibGVFeHAsIGNvbnN0YW50KGRlZmF1bHRWYWx1ZXMuYXBwbHlCdXR0b25UZXh0KSwgY29uc3RhbnQoZGVmYXVsdFZhbHVlcy5va0J1dHRvblRleHQpKTtcblx0XHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbih0b3RhbEV4cCk7XG5cdFx0fSxcblxuXHRcdGhhc0VkaXRhYmxlRmllbGRzQmluZGluZzogKGZpZWxkczogYW55LCBlZGl0YWJsZTogYm9vbGVhbikgPT4ge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKE1hc3NFZGl0SGVscGVyLmhlbHBlcnMuZ2V0QmluZGluZ0V4cEZvckhhc0VkaXRhYmxlRmllbGRzKGZpZWxkcywgZWRpdGFibGUpKTtcblx0XHR9XG5cdH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1hc3NFZGl0SGVscGVyO1xuIl19
|