@sapui5/sap.fe.core 1.102.3 → 1.105.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 +6 -6
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/ActionRuntime.js +120 -0
- package/src/sap/fe/core/ActionRuntime.ts +108 -0
- package/src/sap/fe/core/AppComponent.js +81 -35
- package/src/sap/fe/core/AppComponent.ts +68 -44
- package/src/sap/fe/core/AppStateHandler.js +82 -70
- package/src/sap/fe/core/AppStateHandler.ts +32 -37
- package/src/sap/fe/core/BaseController.js +12 -10
- package/src/sap/fe/core/BaseController.ts +15 -13
- package/src/sap/fe/core/CommonUtils.js +291 -218
- package/src/sap/fe/core/CommonUtils.ts +315 -251
- package/src/sap/fe/core/ExtensionAPI.js +25 -28
- package/src/sap/fe/core/ExtensionAPI.ts +36 -38
- package/src/sap/fe/core/PageController.js +5 -5
- package/src/sap/fe/core/PageController.ts +4 -5
- package/src/sap/fe/core/TemplateComponent.js +21 -10
- package/src/sap/fe/core/TemplateComponent.ts +9 -6
- package/src/sap/fe/core/TemplateModel.js +2 -2
- package/src/sap/fe/core/TemplateModel.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +11 -3
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +8 -2
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +197 -43
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +164 -24
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +14 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.ts +5 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +609 -230
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +275 -128
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +30 -30
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +32 -29
- package/src/sap/fe/core/controllerextensions/BusyLocker.js +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.js +761 -700
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +478 -514
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +10 -10
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +104 -75
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +71 -79
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +68 -68
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +76 -76
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +162 -102
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +177 -121
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +67 -69
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
- package/src/sap/fe/core/controllerextensions/MassEdit.js +10 -10
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +20 -27
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +21 -13
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +21 -14
- package/src/sap/fe/core/controllerextensions/PageReady.js +98 -26
- package/src/sap/fe/core/controllerextensions/PageReady.ts +98 -34
- package/src/sap/fe/core/controllerextensions/Paginator.js +31 -32
- package/src/sap/fe/core/controllerextensions/Paginator.ts +33 -34
- package/src/sap/fe/core/controllerextensions/Placeholder.js +5 -7
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
- package/src/sap/fe/core/controllerextensions/Routing.js +11 -12
- package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
- package/src/sap/fe/core/controllerextensions/Share.js +171 -140
- package/src/sap/fe/core/controllerextensions/Share.ts +117 -118
- package/src/sap/fe/core/controllerextensions/SideEffects.js +47 -51
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -60
- package/src/sap/fe/core/controllerextensions/ViewState.js +201 -132
- package/src/sap/fe/core/controllerextensions/ViewState.ts +141 -148
- 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 +13 -12
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +17 -20
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +13 -12
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +15 -15
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +57 -18
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +60 -28
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +29 -21
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1424 -940
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +799 -836
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +410 -377
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +275 -358
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +309 -0
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +320 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +752 -579
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +631 -599
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +92 -74
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +49 -52
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +78 -41
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +110 -84
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +69 -81
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +64 -73
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +18 -2
- package/src/sap/fe/core/controls/ActionParameterDialogFieldValueHelp.fragment.xml +35 -0
- package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +25 -24
- 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 +12 -26
- package/src/sap/fe/core/controls/CommandExecution.ts +11 -25
- package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -3
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +26 -26
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +25 -24
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -3
- 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 +3 -3
- package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
- package/src/sap/fe/core/controls/FileWrapper.js +9 -4
- package/src/sap/fe/core/controls/FileWrapper.ts +16 -12
- package/src/sap/fe/core/controls/FilterBar.js +7 -3
- package/src/sap/fe/core/controls/FilterBar.ts +13 -9
- package/src/sap/fe/core/controls/FormElementWrapper.js +2 -2
- 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/MultiValueParameterDelegate.js +1 -1
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +44 -19
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +2 -2
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +17 -13
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +4 -4
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +49 -49
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +54 -54
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +8 -2
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +22 -35
- 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 +48 -34
- package/src/sap/fe/core/converters/ConverterContext.ts +81 -67
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +18 -15
- 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 +74 -40
- package/src/sap/fe/core/converters/MetaModelConverter.ts +176 -140
- 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 +58 -35
- package/src/sap/fe/core/converters/annotations/DataField.ts +102 -76
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +1956 -1494
- package/src/sap/fe/core/converters/controls/Common/Action.js +78 -51
- package/src/sap/fe/core/converters/controls/Common/Action.ts +87 -52
- package/src/sap/fe/core/converters/controls/Common/Chart.js +22 -16
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +42 -43
- 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 +65 -29
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +93 -62
- package/src/sap/fe/core/converters/controls/Common/Form.js +31 -31
- package/src/sap/fe/core/converters/controls/Common/Form.ts +46 -57
- package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +49 -52
- package/src/sap/fe/core/converters/controls/Common/Table.js +251 -264
- package/src/sap/fe/core/converters/controls/Common/Table.ts +344 -370
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +119 -119
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +147 -144
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +89 -59
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +118 -71
- 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 +131 -95
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +123 -87
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +98 -87
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +121 -117
- package/src/sap/fe/core/converters/helpers/Aggregation.js +2 -4
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +12 -15
- 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 +8 -6
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +18 -10
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +136 -0
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +139 -0
- package/src/sap/fe/core/converters/helpers/ID.js +48 -46
- package/src/sap/fe/core/converters/helpers/ID.ts +26 -25
- package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
- 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 -5
- 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 +53 -75
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +59 -90
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +58 -57
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +93 -86
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +58 -44
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +87 -80
- 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 +96 -0
- package/src/sap/fe/core/formatters/StandardFormatter.ts +70 -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/TableFormatterTypes.js +1 -1
- 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/fpm/Component.js +33 -7
- package/src/sap/fe/core/fpm/Component.ts +14 -0
- package/src/sap/fe/core/helpers/AnnotationEnum.js +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js +19 -18
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +41 -43
- package/src/sap/fe/core/helpers/BindingToolkit.js +1836 -0
- package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +397 -270
- package/src/sap/fe/core/helpers/ClassSupport.js +49 -12
- package/src/sap/fe/core/helpers/ClassSupport.ts +37 -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/KeepAliveRefreshTypes.js +1 -1
- package/src/sap/fe/core/helpers/MassEditHelper.js +306 -280
- package/src/sap/fe/core/helpers/MassEditHelper.ts +380 -360
- package/src/sap/fe/core/helpers/MessageStrip.js +81 -0
- package/src/sap/fe/core/helpers/MessageStrip.ts +79 -0
- 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/helpers/Synchronization.js +1 -1
- package/src/sap/fe/core/helpers/ToES6Promise.js +32 -0
- package/src/sap/fe/core/helpers/ToES6Promise.ts +19 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.js +16 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.ts +3 -0
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js +109 -0
- package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +47 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control.js +110 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +92 -0
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js +105 -0
- package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +89 -0
- package/src/sap/fe/core/jsx-runtime/jsx.js +12 -90
- package/src/sap/fe/core/jsx-runtime/jsx.ts +24 -85
- package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +179 -0
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +150 -0
- package/src/sap/fe/core/library.js +42 -3
- package/src/sap/fe/core/library.support.js +1 -1
- 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 +39 -67
- package/src/sap/fe/core/messagebundle_ar.properties +27 -44
- package/src/sap/fe/core/messagebundle_bg.properties +27 -44
- package/src/sap/fe/core/messagebundle_ca.properties +27 -44
- package/src/sap/fe/core/messagebundle_cs.properties +27 -44
- package/src/sap/fe/core/messagebundle_cy.properties +26 -43
- package/src/sap/fe/core/messagebundle_da.properties +27 -44
- package/src/sap/fe/core/messagebundle_de.properties +25 -42
- package/src/sap/fe/core/messagebundle_el.properties +28 -45
- package/src/sap/fe/core/messagebundle_en.properties +27 -44
- package/src/sap/fe/core/messagebundle_en_GB.properties +27 -44
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +25 -42
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +26 -40
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +25 -42
- package/src/sap/fe/core/messagebundle_es.properties +27 -44
- package/src/sap/fe/core/messagebundle_es_MX.properties +27 -44
- package/src/sap/fe/core/messagebundle_et.properties +27 -44
- package/src/sap/fe/core/messagebundle_fi.properties +27 -44
- package/src/sap/fe/core/messagebundle_fr.properties +26 -43
- package/src/sap/fe/core/messagebundle_fr_CA.properties +25 -42
- package/src/sap/fe/core/messagebundle_hi.properties +27 -44
- package/src/sap/fe/core/messagebundle_hr.properties +27 -44
- package/src/sap/fe/core/messagebundle_hu.properties +27 -44
- package/src/sap/fe/core/messagebundle_id.properties +27 -44
- package/src/sap/fe/core/messagebundle_it.properties +43 -60
- package/src/sap/fe/core/messagebundle_iw.properties +27 -44
- package/src/sap/fe/core/messagebundle_ja.properties +27 -44
- package/src/sap/fe/core/messagebundle_kk.properties +27 -44
- package/src/sap/fe/core/messagebundle_ko.properties +30 -47
- package/src/sap/fe/core/messagebundle_lt.properties +27 -44
- package/src/sap/fe/core/messagebundle_lv.properties +27 -44
- package/src/sap/fe/core/messagebundle_ms.properties +27 -44
- package/src/sap/fe/core/messagebundle_nl.properties +29 -46
- package/src/sap/fe/core/messagebundle_no.properties +27 -44
- package/src/sap/fe/core/messagebundle_pl.properties +28 -45
- package/src/sap/fe/core/messagebundle_pt.properties +28 -45
- package/src/sap/fe/core/messagebundle_pt_PT.properties +27 -44
- package/src/sap/fe/core/messagebundle_ro.properties +27 -44
- package/src/sap/fe/core/messagebundle_ru.properties +27 -44
- package/src/sap/fe/core/messagebundle_sh.properties +27 -44
- package/src/sap/fe/core/messagebundle_sk.properties +27 -44
- package/src/sap/fe/core/messagebundle_sl.properties +27 -44
- package/src/sap/fe/core/messagebundle_sv.properties +27 -44
- package/src/sap/fe/core/messagebundle_th.properties +25 -42
- package/src/sap/fe/core/messagebundle_tr.properties +27 -44
- package/src/sap/fe/core/messagebundle_uk.properties +27 -44
- package/src/sap/fe/core/messagebundle_vi.properties +27 -44
- package/src/sap/fe/core/messagebundle_zh_CN.properties +27 -44
- package/src/sap/fe/core/messagebundle_zh_TW.properties +27 -44
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +3 -3
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +103 -75
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +72 -73
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +2 -2
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -2
- package/src/sap/fe/core/services/NavigationServiceFactory.js +62 -50
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +63 -52
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +3 -3
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
- package/src/sap/fe/core/services/RoutingServiceFactory.js +56 -56
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +67 -65
- package/src/sap/fe/core/services/ShellServicesFactory.js +93 -77
- package/src/sap/fe/core/services/ShellServicesFactory.ts +95 -82
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +64 -64
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +232 -200
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +145 -142
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -2
- package/src/sap/fe/core/support/AnnotationIssue.support.js +1 -1
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +1 -1
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +1 -1
- package/src/sap/fe/core/support/CommonHelper.js +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/support/InvalidAnnotationColumnKey.support.js +1 -1
- package/src/sap/fe/core/templating/CommonFormatters.js +85 -0
- package/src/sap/fe/core/templating/CommonFormatters.ts +90 -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 +23 -15
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +47 -34
- 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 +18 -17
- package/src/sap/fe/core/templating/FilterHelper.ts +18 -18
- 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 +152 -95
- package/src/sap/fe/core/templating/UIFormatters.ts +202 -128
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +2 -2
- package/src/sap/fe/core/type/Email.js +3 -3
- 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/fe/core/converters/annotations/DataField", "sap/fe/core/converters/controls/Common/Action", "sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/converters/helpers/ConfigurableObject", "sap/fe/core/converters/helpers/IssueManager", "sap/fe/core/converters/helpers/Key", "sap/fe/core/formatters/TableFormatter", "sap/fe/core/formatters/TableFormatterTypes", "sap/fe/core/helpers/
|
|
5
|
+
sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/converters/controls/Common/Action", "sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/converters/helpers/ConfigurableObject", "sap/fe/core/converters/helpers/IssueManager", "sap/fe/core/converters/helpers/Key", "sap/fe/core/formatters/TableFormatter", "sap/fe/core/formatters/TableFormatterTypes", "sap/fe/core/helpers/BindingToolkit", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/templating/DisplayModeFormatter", "sap/fe/core/templating/EntitySetHelper", "sap/fe/core/templating/PropertyHelper", "sap/fe/macros/internal/helpers/ActionHelper", "../../helpers/Aggregation", "../../helpers/DataFieldHelper", "../../helpers/ID", "../../ManifestSettings", "./Criticality", "./table/StandardActions"], function (DataField, Action, BindingHelper, ConfigurableObject, IssueManager, Key, tableFormatters, TableFormatterTypes, BindingToolkit, StableIdHelper, DataModelPathHelper, DisplayModeFormatter, EntitySetHelper, PropertyHelper, ActionHelper, Aggregation, DataFieldHelper, ID, ManifestSettings, Criticality, StandardActions) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var _exports = {};
|
|
@@ -29,7 +29,8 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
29
29
|
var CreationMode = ManifestSettings.CreationMode;
|
|
30
30
|
var AvailabilityType = ManifestSettings.AvailabilityType;
|
|
31
31
|
var ActionType = ManifestSettings.ActionType;
|
|
32
|
-
var
|
|
32
|
+
var getTableID = ID.getTableID;
|
|
33
|
+
var isReferencePropertyStaticallyHidden = DataFieldHelper.isReferencePropertyStaticallyHidden;
|
|
33
34
|
var AggregationHelper = Aggregation.AggregationHelper;
|
|
34
35
|
var isProperty = PropertyHelper.isProperty;
|
|
35
36
|
var isPathExpression = PropertyHelper.isPathExpression;
|
|
@@ -45,18 +46,18 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
45
46
|
var isPathDeletable = DataModelPathHelper.isPathDeletable;
|
|
46
47
|
var getTargetObjectPath = DataModelPathHelper.getTargetObjectPath;
|
|
47
48
|
var replaceSpecialChars = StableIdHelper.replaceSpecialChars;
|
|
48
|
-
var resolveBindingString =
|
|
49
|
-
var
|
|
50
|
-
var
|
|
51
|
-
var
|
|
52
|
-
var
|
|
53
|
-
var
|
|
54
|
-
var
|
|
55
|
-
var
|
|
56
|
-
var
|
|
57
|
-
var
|
|
58
|
-
var
|
|
59
|
-
var and =
|
|
49
|
+
var resolveBindingString = BindingToolkit.resolveBindingString;
|
|
50
|
+
var pathInModel = BindingToolkit.pathInModel;
|
|
51
|
+
var or = BindingToolkit.or;
|
|
52
|
+
var not = BindingToolkit.not;
|
|
53
|
+
var isConstant = BindingToolkit.isConstant;
|
|
54
|
+
var ifElse = BindingToolkit.ifElse;
|
|
55
|
+
var getExpressionFromAnnotation = BindingToolkit.getExpressionFromAnnotation;
|
|
56
|
+
var formatResult = BindingToolkit.formatResult;
|
|
57
|
+
var equal = BindingToolkit.equal;
|
|
58
|
+
var constant = BindingToolkit.constant;
|
|
59
|
+
var compileExpression = BindingToolkit.compileExpression;
|
|
60
|
+
var and = BindingToolkit.and;
|
|
60
61
|
var MessageType = TableFormatterTypes.MessageType;
|
|
61
62
|
var KeyHelper = Key.KeyHelper;
|
|
62
63
|
var IssueType = IssueManager.IssueType;
|
|
@@ -67,7 +68,6 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
67
68
|
var insertCustomElements = ConfigurableObject.insertCustomElements;
|
|
68
69
|
var UI = BindingHelper.UI;
|
|
69
70
|
var Entity = BindingHelper.Entity;
|
|
70
|
-
var bindingContextPathVisitor = BindingHelper.bindingContextPathVisitor;
|
|
71
71
|
var removeDuplicateActions = Action.removeDuplicateActions;
|
|
72
72
|
var isActionNavigable = Action.isActionNavigable;
|
|
73
73
|
var getActionsFromManifest = Action.getActionsFromManifest;
|
|
@@ -89,9 +89,9 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
89
89
|
|
|
90
90
|
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; } } }; }
|
|
91
91
|
|
|
92
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object);
|
|
92
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
93
93
|
|
|
94
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]
|
|
94
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
95
95
|
|
|
96
96
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
97
97
|
|
|
@@ -118,17 +118,18 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
118
118
|
/**
|
|
119
119
|
* Returns an array of all annotation-based and manifest-based table actions.
|
|
120
120
|
*
|
|
121
|
-
* @param
|
|
122
|
-
* @param
|
|
123
|
-
* @param
|
|
124
|
-
* @param
|
|
125
|
-
* @returns
|
|
121
|
+
* @param lineItemAnnotation
|
|
122
|
+
* @param visualizationPath
|
|
123
|
+
* @param converterContext
|
|
124
|
+
* @param navigationSettings
|
|
125
|
+
* @returns The complete table actions
|
|
126
126
|
*/
|
|
127
127
|
function getTableActions(lineItemAnnotation, visualizationPath, converterContext, navigationSettings) {
|
|
128
128
|
var aTableActions = getTableAnnotationActions(lineItemAnnotation, visualizationPath, converterContext);
|
|
129
129
|
var aAnnotationActions = aTableActions.tableActions;
|
|
130
130
|
var aHiddenActions = aTableActions.hiddenTableActions;
|
|
131
|
-
|
|
131
|
+
var manifestActions = getActionsFromManifest(converterContext.getManifestControlConfiguration(visualizationPath).actions, converterContext, aAnnotationActions, navigationSettings, true, aHiddenActions);
|
|
132
|
+
var actions = insertCustomElements(aAnnotationActions, manifestActions.actions, {
|
|
132
133
|
isNavigable: "overwrite",
|
|
133
134
|
enableOnSelect: "overwrite",
|
|
134
135
|
enableAutoScroll: "overwrite",
|
|
@@ -136,16 +137,20 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
136
137
|
defaultValuesExtensionFunction: "overwrite",
|
|
137
138
|
command: "overwrite"
|
|
138
139
|
});
|
|
140
|
+
return {
|
|
141
|
+
"actions": actions,
|
|
142
|
+
"commandActions": manifestActions.commandActions
|
|
143
|
+
};
|
|
139
144
|
}
|
|
140
145
|
/**
|
|
141
146
|
* Returns an array of all columns, annotation-based as well as manifest based.
|
|
142
147
|
* They are sorted and some properties can be overwritten via the manifest (check out the keys that can be overwritten).
|
|
143
148
|
*
|
|
144
|
-
* @param
|
|
145
|
-
* @param
|
|
146
|
-
* @param
|
|
147
|
-
* @param
|
|
148
|
-
* @returns
|
|
149
|
+
* @param lineItemAnnotation Collection of data fields for representation in a table or list
|
|
150
|
+
* @param visualizationPath
|
|
151
|
+
* @param converterContext
|
|
152
|
+
* @param navigationSettings
|
|
153
|
+
* @returns Returns all table columns that should be available, regardless of templating or personalization or their origin
|
|
149
154
|
*/
|
|
150
155
|
|
|
151
156
|
|
|
@@ -230,10 +235,10 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
230
235
|
};
|
|
231
236
|
var aContextDefiningProperties = [];
|
|
232
237
|
aRawContextDefiningProperties.forEach(function (contextDefiningPropertyName) {
|
|
233
|
-
var
|
|
238
|
+
var foundColumn = findColumnFromPath(contextDefiningPropertyName);
|
|
234
239
|
|
|
235
|
-
if (
|
|
236
|
-
aContextDefiningProperties.push(
|
|
240
|
+
if (foundColumn) {
|
|
241
|
+
aContextDefiningProperties.push(foundColumn.name);
|
|
237
242
|
}
|
|
238
243
|
});
|
|
239
244
|
|
|
@@ -408,11 +413,13 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
408
413
|
var columns = getTableColumns(lineItemAnnotation, visualizationPath, converterContext, navigationSettings);
|
|
409
414
|
var operationAvailableMap = getOperationAvailableMap(lineItemAnnotation, converterContext);
|
|
410
415
|
var semanticKeysAndHeaderInfoTitle = getSemanticKeysAndTitleInfo(converterContext);
|
|
416
|
+
var tableActions = getTableActions(lineItemAnnotation, visualizationPath, converterContext, navigationSettings);
|
|
411
417
|
var oVisualization = {
|
|
412
418
|
type: VisualizationType.Table,
|
|
413
419
|
annotation: getTableAnnotationConfiguration(lineItemAnnotation, visualizationPath, converterContext, tableManifestConfig, columns, presentationVariantAnnotation, viewConfiguration),
|
|
414
420
|
control: tableManifestConfig,
|
|
415
|
-
actions: removeDuplicateActions(
|
|
421
|
+
actions: removeDuplicateActions(tableActions.actions),
|
|
422
|
+
commandActions: tableActions.commandActions,
|
|
416
423
|
columns: columns,
|
|
417
424
|
operationAvailableMap: JSON.stringify(operationAvailableMap),
|
|
418
425
|
operationAvailableProperties: getOperationAvailableProperties(operationAvailableMap, converterContext),
|
|
@@ -451,60 +458,20 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
451
458
|
*
|
|
452
459
|
* @param lineItemAnnotation The instance of the line item
|
|
453
460
|
* @param converterContext The instance of the converter context
|
|
454
|
-
* @returns
|
|
461
|
+
* @returns The record containing all action names and their corresponding Core.OperationAvailable property paths
|
|
455
462
|
*/
|
|
456
463
|
|
|
457
464
|
|
|
458
465
|
_exports.createDefaultTableVisualization = createDefaultTableVisualization;
|
|
459
466
|
|
|
460
467
|
function getOperationAvailableMap(lineItemAnnotation, converterContext) {
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
var addToMap = function (key, value) {
|
|
464
|
-
if (key) {
|
|
465
|
-
operationAvailableMap[key] = value;
|
|
466
|
-
}
|
|
467
|
-
};
|
|
468
|
-
|
|
469
|
-
if (lineItemAnnotation) {
|
|
470
|
-
lineItemAnnotation.forEach(function (dataField) {
|
|
471
|
-
if (dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAction") {
|
|
472
|
-
var actionName = dataField.Action;
|
|
473
|
-
|
|
474
|
-
if ((actionName === null || actionName === void 0 ? void 0 : actionName.indexOf("/")) < 0 && !dataField.Determining) {
|
|
475
|
-
var _actionTarget$annotat, _actionTarget$annotat2, _actionTarget$paramet;
|
|
476
|
-
|
|
477
|
-
var actionTarget = dataField.ActionTarget;
|
|
478
|
-
|
|
479
|
-
if ((actionTarget === null || actionTarget === void 0 ? void 0 : (_actionTarget$annotat = actionTarget.annotations) === null || _actionTarget$annotat === void 0 ? void 0 : (_actionTarget$annotat2 = _actionTarget$annotat.Core) === null || _actionTarget$annotat2 === void 0 ? void 0 : _actionTarget$annotat2.OperationAvailable) === null) {
|
|
480
|
-
// Annotation explicitly configured with null (action advertisement related)
|
|
481
|
-
addToMap(actionName, null);
|
|
482
|
-
} else if (actionTarget !== null && actionTarget !== void 0 && (_actionTarget$paramet = actionTarget.parameters) !== null && _actionTarget$paramet !== void 0 && _actionTarget$paramet.length) {
|
|
483
|
-
var _actionTarget$annotat3, _actionTarget$annotat4, _actionTarget$annotat5, _actionTarget$annotat6;
|
|
484
|
-
|
|
485
|
-
var bindingParameterFullName = actionTarget.parameters[0].fullyQualifiedName,
|
|
486
|
-
targetExpression = annotationExpression(actionTarget === null || actionTarget === void 0 ? void 0 : (_actionTarget$annotat3 = actionTarget.annotations) === null || _actionTarget$annotat3 === void 0 ? void 0 : (_actionTarget$annotat4 = _actionTarget$annotat3.Core) === null || _actionTarget$annotat4 === void 0 ? void 0 : _actionTarget$annotat4.OperationAvailable, [], undefined, function (path) {
|
|
487
|
-
return bindingContextPathVisitor(path, converterContext, bindingParameterFullName);
|
|
488
|
-
});
|
|
489
|
-
|
|
490
|
-
if (targetExpression !== null && targetExpression !== void 0 && targetExpression.path) {
|
|
491
|
-
addToMap(actionName, targetExpression.path);
|
|
492
|
-
} else if ((actionTarget === null || actionTarget === void 0 ? void 0 : (_actionTarget$annotat5 = actionTarget.annotations) === null || _actionTarget$annotat5 === void 0 ? void 0 : (_actionTarget$annotat6 = _actionTarget$annotat5.Core) === null || _actionTarget$annotat6 === void 0 ? void 0 : _actionTarget$annotat6.OperationAvailable) !== undefined) {
|
|
493
|
-
addToMap(actionName, targetExpression);
|
|
494
|
-
}
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
});
|
|
499
|
-
}
|
|
500
|
-
|
|
501
|
-
return operationAvailableMap;
|
|
468
|
+
return ActionHelper.getOperationAvailableMap(lineItemAnnotation, "table", converterContext);
|
|
502
469
|
}
|
|
503
470
|
/**
|
|
504
471
|
* Gets updatable propertyPath for the current entityset if valid.
|
|
505
472
|
*
|
|
506
473
|
* @param converterContext The instance of the converter context
|
|
507
|
-
* @returns
|
|
474
|
+
* @returns The updatable property for the rows
|
|
508
475
|
*/
|
|
509
476
|
|
|
510
477
|
|
|
@@ -521,9 +488,9 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
521
488
|
/**
|
|
522
489
|
* Method to retrieve all property paths assigned to the Core.OperationAvailable annotation.
|
|
523
490
|
*
|
|
524
|
-
* @param
|
|
525
|
-
* @param
|
|
526
|
-
* @returns
|
|
491
|
+
* @param operationAvailableMap The record consisting of actions and their Core.OperationAvailable property paths
|
|
492
|
+
* @param converterContext The instance of the converter context
|
|
493
|
+
* @returns The CSV string of all property paths associated with the Core.OperationAvailable annotation
|
|
527
494
|
*/
|
|
528
495
|
|
|
529
496
|
|
|
@@ -632,13 +599,13 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
632
599
|
var sNavigationPath = aSplitPath[0];
|
|
633
600
|
|
|
634
601
|
if ((contextDataModelObjectPath === null || contextDataModelObjectPath === void 0 ? void 0 : (_contextDataModelObje = contextDataModelObjectPath.targetObject) === null || _contextDataModelObje === void 0 ? void 0 : _contextDataModelObje._type) === "NavigationProperty" && contextDataModelObjectPath.targetObject.partner === sNavigationPath) {
|
|
635
|
-
return
|
|
602
|
+
return pathInModel(aSplitPath.slice(1).join("/"));
|
|
636
603
|
} else {
|
|
637
604
|
return constant(true);
|
|
638
605
|
} // In case there is no navigation property, if it's an entitySet, the expression binding has to be returned:
|
|
639
606
|
|
|
640
607
|
} else if (isEntitySet) {
|
|
641
|
-
return
|
|
608
|
+
return pathInModel(sPath); // otherwise the expression binding cannot be taken into account for the selection mode evaluation:
|
|
642
609
|
} else {
|
|
643
610
|
return constant(true);
|
|
644
611
|
}
|
|
@@ -652,7 +619,7 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
652
619
|
*
|
|
653
620
|
* @param lineItemAnnotation Collection of data fields for representation in a table or list
|
|
654
621
|
* @param currentEntityType Current Entity Type
|
|
655
|
-
* @returns
|
|
622
|
+
* @returns `true` if there is at least 1 action that meets the criteria
|
|
656
623
|
*/
|
|
657
624
|
|
|
658
625
|
|
|
@@ -725,7 +692,7 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
725
692
|
* Evaluate if the path is statically deletable or updatable.
|
|
726
693
|
*
|
|
727
694
|
* @param converterContext
|
|
728
|
-
* @returns
|
|
695
|
+
* @returns The table capabilities
|
|
729
696
|
*/
|
|
730
697
|
|
|
731
698
|
|
|
@@ -758,7 +725,7 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
758
725
|
|
|
759
726
|
if (converterContext.getTemplateType() === TemplateType.ObjectPage) {
|
|
760
727
|
isParentDeletable = isPathDeletable(converterContext.getDataModelObjectPath());
|
|
761
|
-
parentEntitySetDeletable = isParentDeletable ?
|
|
728
|
+
parentEntitySetDeletable = isParentDeletable ? compileExpression(isParentDeletable, true) : isParentDeletable;
|
|
762
729
|
}
|
|
763
730
|
|
|
764
731
|
var bMassEditEnabled = !isConstant(massEditVisibilityExpression) || massEditVisibilityExpression.value !== false;
|
|
@@ -766,12 +733,12 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
766
733
|
if (selectionMode && selectionMode === SelectionMode.None && deleteButtonVisibilityExpression) {
|
|
767
734
|
if (converterContext.getTemplateType() === TemplateType.ObjectPage && bMassEditEnabled) {
|
|
768
735
|
// Mass Edit in OP is enabled only in edit mode.
|
|
769
|
-
return
|
|
736
|
+
return compileExpression(ifElse(and(UI.IsEditable, massEditVisibilityExpression), constant("Multi"), ifElse(deleteButtonVisibilityExpression, constant("Multi"), constant("None"))));
|
|
770
737
|
} else if (bMassEditEnabled) {
|
|
771
738
|
return SelectionMode.Multi;
|
|
772
739
|
}
|
|
773
740
|
|
|
774
|
-
return
|
|
741
|
+
return compileExpression(ifElse(deleteButtonVisibilityExpression, constant("Multi"), constant("None")));
|
|
775
742
|
}
|
|
776
743
|
|
|
777
744
|
if (!selectionMode || selectionMode === SelectionMode.Auto) {
|
|
@@ -783,12 +750,12 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
783
750
|
selectionMode = selectionMode === SelectionMode.Single ? SelectionMode.Single : SelectionMode.Multi;
|
|
784
751
|
}
|
|
785
752
|
|
|
786
|
-
if (hasBoundActionsAlwaysVisibleInToolBar(lineItemAnnotation, converterContext.getEntityType()) || hasCustomActionsAlwaysVisibleInToolBar(manifestActions)) {
|
|
753
|
+
if (hasBoundActionsAlwaysVisibleInToolBar(lineItemAnnotation, converterContext.getEntityType()) || hasCustomActionsAlwaysVisibleInToolBar(manifestActions.actions)) {
|
|
787
754
|
return selectionMode;
|
|
788
755
|
}
|
|
789
756
|
|
|
790
757
|
aHiddenBindingExpressions = getUIHiddenExpForActionsRequiringContext(lineItemAnnotation, converterContext.getEntityType(), converterContext.getDataModelObjectPath(), isEntitySet);
|
|
791
|
-
aVisibleBindingExpressions = getVisibleExpForCustomActionsRequiringContext(manifestActions); // No action requiring a context:
|
|
758
|
+
aVisibleBindingExpressions = getVisibleExpForCustomActionsRequiringContext(manifestActions.actions); // No action requiring a context:
|
|
792
759
|
|
|
793
760
|
if (aHiddenBindingExpressions.length === 0 && aVisibleBindingExpressions.length === 0 && (deleteButtonVisibilityExpression || bMassEditEnabled)) {
|
|
794
761
|
if (!isEntitySet) {
|
|
@@ -797,7 +764,7 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
797
764
|
// Building expression for delete and mass edit
|
|
798
765
|
var buttonVisibilityExpression = or(deleteButtonVisibilityExpression || true, // default delete visibility as true
|
|
799
766
|
massEditVisibilityExpression);
|
|
800
|
-
return
|
|
767
|
+
return compileExpression(ifElse(and(UI.IsEditable, buttonVisibilityExpression), constant(selectionMode), constant(SelectionMode.None)));
|
|
801
768
|
} else {
|
|
802
769
|
return SelectionMode.None;
|
|
803
770
|
} // EntitySet deletable:
|
|
@@ -806,7 +773,7 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
806
773
|
// example: LR scenario
|
|
807
774
|
return selectionMode;
|
|
808
775
|
} else if (targetCapabilities.isDeletable && deleteButtonVisibilityExpression) {
|
|
809
|
-
return
|
|
776
|
+
return compileExpression(ifElse(deleteButtonVisibilityExpression, constant(selectionMode), constant("None"))); // EntitySet not deletable:
|
|
810
777
|
} else {
|
|
811
778
|
return SelectionMode.None;
|
|
812
779
|
} // There are actions requiring a context:
|
|
@@ -816,16 +783,16 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
816
783
|
if (targetCapabilities.isDeletable || parentEntitySetDeletable !== "false" || bMassEditEnabled) {
|
|
817
784
|
// Use selectionMode in edit mode if delete is enabled or mass edit is visible
|
|
818
785
|
var editModebuttonVisibilityExpression = ifElse(bMassEditEnabled && !targetCapabilities.isDeletable, massEditVisibilityExpression, constant(true));
|
|
819
|
-
return
|
|
786
|
+
return compileExpression(ifElse(and(UI.IsEditable, editModebuttonVisibilityExpression), constant(selectionMode), ifElse(or.apply(void 0, _toConsumableArray(aHiddenBindingExpressions.concat(aVisibleBindingExpressions))), constant(selectionMode), constant(SelectionMode.None))));
|
|
820
787
|
} else {
|
|
821
|
-
return
|
|
788
|
+
return compileExpression(ifElse(or.apply(void 0, _toConsumableArray(aHiddenBindingExpressions.concat(aVisibleBindingExpressions))), constant(selectionMode), constant(SelectionMode.None)));
|
|
822
789
|
} //EntitySet deletable:
|
|
823
790
|
|
|
824
791
|
} else if (targetCapabilities.isDeletable || bMassEditEnabled) {
|
|
825
792
|
// Example: LR scenario
|
|
826
793
|
return selectionMode; //EntitySet not deletable:
|
|
827
794
|
} else {
|
|
828
|
-
return
|
|
795
|
+
return compileExpression(ifElse(or.apply(void 0, _toConsumableArray(aHiddenBindingExpressions.concat(aVisibleBindingExpressions)).concat([massEditVisibilityExpression])), constant(selectionMode), constant(SelectionMode.None)));
|
|
829
796
|
}
|
|
830
797
|
}
|
|
831
798
|
/**
|
|
@@ -834,7 +801,7 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
834
801
|
* @param lineItemAnnotation
|
|
835
802
|
* @param visualizationPath
|
|
836
803
|
* @param converterContext
|
|
837
|
-
* @returns
|
|
804
|
+
* @returns The table annotation actions
|
|
838
805
|
*/
|
|
839
806
|
|
|
840
807
|
|
|
@@ -859,7 +826,7 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
859
826
|
type: ActionType.DataFieldForAction,
|
|
860
827
|
annotationPath: converterContext.getEntitySetBasedAnnotationPath(dataField.fullyQualifiedName),
|
|
861
828
|
key: key,
|
|
862
|
-
visible:
|
|
829
|
+
visible: compileExpression(not(equal(getExpressionFromAnnotation((_dataField$annotation13 = dataField.annotations) === null || _dataField$annotation13 === void 0 ? void 0 : (_dataField$annotation14 = _dataField$annotation13.UI) === null || _dataField$annotation14 === void 0 ? void 0 : _dataField$annotation14.Hidden, [], undefined, converterContext.getRelativeModelPathFunction()), true))),
|
|
863
830
|
isNavigable: true
|
|
864
831
|
};
|
|
865
832
|
break;
|
|
@@ -869,7 +836,7 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
869
836
|
type: ActionType.DataFieldForIntentBasedNavigation,
|
|
870
837
|
annotationPath: converterContext.getEntitySetBasedAnnotationPath(dataField.fullyQualifiedName),
|
|
871
838
|
key: key,
|
|
872
|
-
visible:
|
|
839
|
+
visible: compileExpression(not(equal(getExpressionFromAnnotation((_dataField$annotation15 = dataField.annotations) === null || _dataField$annotation15 === void 0 ? void 0 : (_dataField$annotation16 = _dataField$annotation15.UI) === null || _dataField$annotation16 === void 0 ? void 0 : _dataField$annotation16.Hidden, [], undefined, converterContext.getRelativeModelPathFunction()), true)))
|
|
873
840
|
};
|
|
874
841
|
break;
|
|
875
842
|
|
|
@@ -900,7 +867,7 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
900
867
|
|
|
901
868
|
if (criticalityAnnotation) {
|
|
902
869
|
if (typeof criticalityAnnotation === "object") {
|
|
903
|
-
defaultHighlightRowDefinition =
|
|
870
|
+
defaultHighlightRowDefinition = getExpressionFromAnnotation(criticalityAnnotation);
|
|
904
871
|
} else {
|
|
905
872
|
// Enum Value so we get the corresponding static part
|
|
906
873
|
defaultHighlightRowDefinition = getMessageTypeFromCriticalityType(criticalityAnnotation);
|
|
@@ -910,10 +877,10 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
910
877
|
var aMissingKeys = [];
|
|
911
878
|
targetEntityType === null || targetEntityType === void 0 ? void 0 : targetEntityType.keys.forEach(function (key) {
|
|
912
879
|
if (key.name !== "IsActiveEntity") {
|
|
913
|
-
aMissingKeys.push(
|
|
880
|
+
aMissingKeys.push(pathInModel(key.name, undefined));
|
|
914
881
|
}
|
|
915
882
|
});
|
|
916
|
-
return formatResult([defaultHighlightRowDefinition,
|
|
883
|
+
return formatResult([defaultHighlightRowDefinition, pathInModel("filteredMessages", "internal"), isDraftRoot && Entity.HasActive, isDraftRoot && Entity.IsActive, "".concat(isDraftRoot)].concat(aMissingKeys), tableFormatters.rowHighlighting, targetEntityType);
|
|
917
884
|
}
|
|
918
885
|
|
|
919
886
|
function _getCreationBehaviour(lineItemAnnotation, tableManifestConfiguration, converterContext, navigationSettings, visualizationPath) {
|
|
@@ -980,7 +947,7 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
980
947
|
|
|
981
948
|
var _getRowConfigurationProperty = function (lineItemAnnotation, visualizationPath, converterContext, navigationSettings, targetPath) {
|
|
982
949
|
var pressProperty, navigationTarget;
|
|
983
|
-
var criticalityProperty = MessageType.None;
|
|
950
|
+
var criticalityProperty = constant(MessageType.None);
|
|
984
951
|
var targetEntityType = converterContext.getEntityType();
|
|
985
952
|
|
|
986
953
|
if (navigationSettings && lineItemAnnotation) {
|
|
@@ -1009,13 +976,13 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1009
976
|
}
|
|
1010
977
|
}
|
|
1011
978
|
|
|
1012
|
-
var rowNavigatedExpression = formatResult([
|
|
979
|
+
var rowNavigatedExpression = formatResult([pathInModel("/deepestPath", "internal")], tableFormatters.navigatedRow, targetEntityType);
|
|
1013
980
|
return {
|
|
1014
981
|
press: pressProperty,
|
|
1015
982
|
action: pressProperty ? "Navigation" : undefined,
|
|
1016
|
-
rowHighlighting:
|
|
1017
|
-
rowNavigated:
|
|
1018
|
-
visible:
|
|
983
|
+
rowHighlighting: compileExpression(criticalityProperty),
|
|
984
|
+
rowNavigated: compileExpression(rowNavigatedExpression),
|
|
985
|
+
visible: compileExpression(not(UI.IsInactive))
|
|
1019
986
|
};
|
|
1020
987
|
};
|
|
1021
988
|
/**
|
|
@@ -1027,7 +994,7 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1027
994
|
* @param nonSortableColumns The array of all non sortable column names.
|
|
1028
995
|
* @param converterContext The converter context.
|
|
1029
996
|
* @param tableType The table type.
|
|
1030
|
-
* @returns
|
|
997
|
+
* @returns The column from the entityType
|
|
1031
998
|
*/
|
|
1032
999
|
|
|
1033
1000
|
|
|
@@ -1036,7 +1003,7 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1036
1003
|
var nonSortableColumns = arguments.length > 3 ? arguments[3] : undefined;
|
|
1037
1004
|
var converterContext = arguments.length > 4 ? arguments[4] : undefined;
|
|
1038
1005
|
var tableType = arguments.length > 5 ? arguments[5] : undefined;
|
|
1039
|
-
var tableColumns =
|
|
1006
|
+
var tableColumns = annotationColumns; // Catch already existing columns - which were added before by LineItem Annotations
|
|
1040
1007
|
|
|
1041
1008
|
var aggregationHelper = new AggregationHelper(entityType, converterContext);
|
|
1042
1009
|
entityType.entityProperties.forEach(function (property) {
|
|
@@ -1045,7 +1012,7 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1045
1012
|
return column.name === property.name;
|
|
1046
1013
|
}); // if target type exists, it is a complex property and should be ignored
|
|
1047
1014
|
|
|
1048
|
-
if (!property.targetType && !exists) {
|
|
1015
|
+
if (!property.targetType && !exists && property.annotations.UI && !isReferencePropertyStaticallyHidden(property.annotations.UI.DataFieldDefault)) {
|
|
1049
1016
|
var relatedPropertiesInfo = collectRelatedProperties(property.name, property, converterContext, true, tableType);
|
|
1050
1017
|
var relatedPropertyNames = Object.keys(relatedPropertiesInfo.properties);
|
|
1051
1018
|
var additionalPropertyNames = Object.keys(relatedPropertiesInfo.additionalProperties);
|
|
@@ -1095,20 +1062,24 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1095
1062
|
|
|
1096
1063
|
tableColumns.push(columnInfo);
|
|
1097
1064
|
}
|
|
1098
|
-
});
|
|
1099
|
-
|
|
1065
|
+
}); // Create a propertyInfo for each related property.
|
|
1066
|
+
|
|
1067
|
+
var relatedColumns = _createRelatedColumns(columnsToBeCreated, tableColumns, nonSortableColumns, converterContext, entityType);
|
|
1068
|
+
|
|
1069
|
+
return tableColumns.concat(relatedColumns);
|
|
1100
1070
|
};
|
|
1101
1071
|
/**
|
|
1102
1072
|
* Create a column definition from a property.
|
|
1103
|
-
*
|
|
1104
|
-
* @param
|
|
1105
|
-
* @param
|
|
1106
|
-
* @param
|
|
1107
|
-
* @param
|
|
1108
|
-
* @param
|
|
1109
|
-
* @param
|
|
1110
|
-
* @param
|
|
1111
|
-
* @
|
|
1073
|
+
*
|
|
1074
|
+
* @param property Entity type property for which the column is created
|
|
1075
|
+
* @param fullPropertyPath The full path to the target property
|
|
1076
|
+
* @param relativePath The relative path to the target property based on the context
|
|
1077
|
+
* @param useDataFieldPrefix Should be prefixed with "DataField::", else it will be prefixed with "Property::"
|
|
1078
|
+
* @param availableForAdaptation Decides whether the column should be available for adaptation
|
|
1079
|
+
* @param nonSortableColumns The array of all non-sortable column names
|
|
1080
|
+
* @param aggregationHelper The aggregationHelper for the entity
|
|
1081
|
+
* @param converterContext The converter context
|
|
1082
|
+
* @returns The annotation column definition
|
|
1112
1083
|
*/
|
|
1113
1084
|
|
|
1114
1085
|
|
|
@@ -1117,7 +1088,7 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1117
1088
|
var getColumnDefinitionFromProperty = function (property, fullPropertyPath, relativePath, useDataFieldPrefix, availableForAdaptation, nonSortableColumns, aggregationHelper, converterContext) {
|
|
1118
1089
|
var _property$annotations, _property$annotations2, _property$annotations3, _annotations2, _annotations2$UI, _annotations2$UI$Data, _annotations2$UI$Data2, _annotations2$UI$Data3, _annotations2$UI$Data4, _annotations3, _annotations3$UI;
|
|
1119
1090
|
|
|
1120
|
-
var name = useDataFieldPrefix ? relativePath : "Property::"
|
|
1091
|
+
var name = useDataFieldPrefix ? relativePath : "Property::".concat(relativePath);
|
|
1121
1092
|
var key = (useDataFieldPrefix ? "DataField::" : "Property::") + replaceSpecialChars(relativePath);
|
|
1122
1093
|
var semanticObjectAnnotationPath = getSemanticObjectPath(converterContext, property);
|
|
1123
1094
|
var isHidden = ((_property$annotations = property.annotations) === null || _property$annotations === void 0 ? void 0 : (_property$annotations2 = _property$annotations.UI) === null || _property$annotations2 === void 0 ? void 0 : (_property$annotations3 = _property$annotations2.Hidden) === null || _property$annotations3 === void 0 ? void 0 : _property$annotations3.valueOf()) === true;
|
|
@@ -1204,8 +1175,8 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1204
1175
|
/**
|
|
1205
1176
|
* Returns Boolean true for valid columns, false for invalid columns.
|
|
1206
1177
|
*
|
|
1207
|
-
* @param
|
|
1208
|
-
* @returns
|
|
1178
|
+
* @param dataField Different DataField types defined in the annotations
|
|
1179
|
+
* @returns True for valid columns, false for invalid columns
|
|
1209
1180
|
* @private
|
|
1210
1181
|
*/
|
|
1211
1182
|
|
|
@@ -1234,18 +1205,16 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1234
1205
|
*
|
|
1235
1206
|
* SAP Fiori elements will evaluate either the UI.Hidden annotation defined on the annotation itself or on the target property.
|
|
1236
1207
|
*
|
|
1237
|
-
* @param
|
|
1238
|
-
* @param
|
|
1239
|
-
* @param
|
|
1240
|
-
* @
|
|
1241
|
-
* @returns {BindingExpression<string>} An expression that you can bind to the UI.
|
|
1208
|
+
* @param dataFieldModelPath The metapath referring to the annotation that is evaluated by SAP Fiori elements.
|
|
1209
|
+
* @param [formatOptions] FormatOptions optional.
|
|
1210
|
+
* @param formatOptions.isAnalytics This flag is used to check if the analytic table has GroupHeader expanded.
|
|
1211
|
+
* @returns An expression that you can bind to the UI.
|
|
1242
1212
|
*/
|
|
1243
1213
|
|
|
1244
1214
|
|
|
1245
1215
|
var _getVisibleExpression = function (dataFieldModelPath, formatOptions) {
|
|
1246
1216
|
var _targetObject$Target, _targetObject$Target$, _targetObject$annotat, _targetObject$annotat2, _propertyValue$annota, _propertyValue$annota2;
|
|
1247
1217
|
|
|
1248
|
-
var returnExpression = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
1249
1218
|
var targetObject = dataFieldModelPath.targetObject;
|
|
1250
1219
|
var propertyValue;
|
|
1251
1220
|
|
|
@@ -1283,15 +1252,15 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1283
1252
|
// - the UI.Hidden expression in the target property does not evaluate to 'true'
|
|
1284
1253
|
// - in case of Analytics it's not visible for an expanded GroupHeader
|
|
1285
1254
|
|
|
1286
|
-
|
|
1287
|
-
return returnExpression ? expression : compileBinding(expression);
|
|
1255
|
+
return and.apply(void 0, [not(equal(getExpressionFromAnnotation(targetObject === null || targetObject === void 0 ? void 0 : (_targetObject$annotat = targetObject.annotations) === null || _targetObject$annotat === void 0 ? void 0 : (_targetObject$annotat2 = _targetObject$annotat.UI) === null || _targetObject$annotat2 === void 0 ? void 0 : _targetObject$annotat2.Hidden), true)), ifElse(!!propertyValue, propertyValue && not(equal(getExpressionFromAnnotation((_propertyValue$annota = propertyValue.annotations) === null || _propertyValue$annota === void 0 ? void 0 : (_propertyValue$annota2 = _propertyValue$annota.UI) === null || _propertyValue$annota2 === void 0 ? void 0 : _propertyValue$annota2.Hidden), true)), true), or(not(isAnalyticalGroupHeaderExpanded), isAnalyticalLeaf)]);
|
|
1288
1256
|
};
|
|
1289
1257
|
/**
|
|
1290
1258
|
* Returns hidden binding expressions for a field group.
|
|
1291
|
-
*
|
|
1292
|
-
* @param
|
|
1293
|
-
* @param
|
|
1294
|
-
* @
|
|
1259
|
+
*
|
|
1260
|
+
* @param dataFieldGroup DataField defined in the annotations
|
|
1261
|
+
* @param fieldFormatOptions FormatOptions optional.
|
|
1262
|
+
* @param fieldFormatOptions.isAnalytics This flag is used to check if the analytic table has GroupHeader expanded.
|
|
1263
|
+
* @returns Compile binding of field group expressions.
|
|
1295
1264
|
* @private
|
|
1296
1265
|
*/
|
|
1297
1266
|
|
|
@@ -1309,18 +1278,19 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1309
1278
|
(_dataFieldGroup$Targe3 = dataFieldGroup.Target.$target.Data) === null || _dataFieldGroup$Targe3 === void 0 ? void 0 : _dataFieldGroup$Targe3.forEach(function (innerDataField) {
|
|
1310
1279
|
aFieldGroupHiddenExpressions.push(_getVisibleExpression({
|
|
1311
1280
|
targetObject: innerDataField
|
|
1312
|
-
}, fieldFormatOptions
|
|
1281
|
+
}, fieldFormatOptions));
|
|
1313
1282
|
});
|
|
1314
|
-
return
|
|
1283
|
+
return compileExpression(ifElse(or.apply(void 0, aFieldGroupHiddenExpressions), constant(true), constant(false)));
|
|
1315
1284
|
} else {
|
|
1316
1285
|
return undefined;
|
|
1317
1286
|
}
|
|
1318
1287
|
};
|
|
1319
1288
|
/**
|
|
1320
1289
|
* Returns the label for the property and dataField.
|
|
1321
|
-
*
|
|
1290
|
+
*
|
|
1291
|
+
* @param [property] Property or DataField defined in the annotations
|
|
1322
1292
|
* @param isGroup
|
|
1323
|
-
* @returns
|
|
1293
|
+
* @returns Label of the property or DataField
|
|
1324
1294
|
* @private
|
|
1325
1295
|
*/
|
|
1326
1296
|
|
|
@@ -1340,66 +1310,68 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1340
1310
|
if (dataFieldDefault && !dataFieldDefault.qualifier && (_dataFieldDefault$Lab = dataFieldDefault.Label) !== null && _dataFieldDefault$Lab !== void 0 && _dataFieldDefault$Lab.valueOf()) {
|
|
1341
1311
|
var _dataFieldDefault$Lab2;
|
|
1342
1312
|
|
|
1343
|
-
return
|
|
1313
|
+
return compileExpression(getExpressionFromAnnotation((_dataFieldDefault$Lab2 = dataFieldDefault.Label) === null || _dataFieldDefault$Lab2 === void 0 ? void 0 : _dataFieldDefault$Lab2.valueOf()));
|
|
1344
1314
|
}
|
|
1345
1315
|
|
|
1346
|
-
return
|
|
1316
|
+
return compileExpression(getExpressionFromAnnotation(((_property$annotations12 = property.annotations.Common) === null || _property$annotations12 === void 0 ? void 0 : (_property$annotations13 = _property$annotations12.Label) === null || _property$annotations13 === void 0 ? void 0 : _property$annotations13.valueOf()) || property.name));
|
|
1347
1317
|
} else if (isDataFieldTypes(property)) {
|
|
1348
1318
|
var _property$Label2, _property$Value, _property$Value$$targ, _property$Value$$targ2, _property$Value$$targ3, _property$Value$$targ4, _property$Value2, _property$Value2$$tar;
|
|
1349
1319
|
|
|
1350
1320
|
if (!!isGroup && property.$Type === "com.sap.vocabularies.UI.v1.DataFieldWithIntentBasedNavigation") {
|
|
1351
1321
|
var _property$Label;
|
|
1352
1322
|
|
|
1353
|
-
return
|
|
1323
|
+
return compileExpression(getExpressionFromAnnotation((_property$Label = property.Label) === null || _property$Label === void 0 ? void 0 : _property$Label.valueOf()));
|
|
1354
1324
|
}
|
|
1355
1325
|
|
|
1356
|
-
return
|
|
1326
|
+
return compileExpression(getExpressionFromAnnotation(((_property$Label2 = property.Label) === null || _property$Label2 === void 0 ? void 0 : _property$Label2.valueOf()) || ((_property$Value = property.Value) === null || _property$Value === void 0 ? void 0 : (_property$Value$$targ = _property$Value.$target) === null || _property$Value$$targ === void 0 ? void 0 : (_property$Value$$targ2 = _property$Value$$targ.annotations) === null || _property$Value$$targ2 === void 0 ? void 0 : (_property$Value$$targ3 = _property$Value$$targ2.Common) === null || _property$Value$$targ3 === void 0 ? void 0 : (_property$Value$$targ4 = _property$Value$$targ3.Label) === null || _property$Value$$targ4 === void 0 ? void 0 : _property$Value$$targ4.valueOf()) || ((_property$Value2 = property.Value) === null || _property$Value2 === void 0 ? void 0 : (_property$Value2$$tar = _property$Value2.$target) === null || _property$Value2$$tar === void 0 ? void 0 : _property$Value2$$tar.name)));
|
|
1357
1327
|
} else if (property.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation") {
|
|
1358
1328
|
var _property$Label3, _property$Target, _property$Target$$tar, _property$Target$$tar2, _property$Target$$tar3, _property$Target$$tar4, _property$Target$$tar5, _property$Target$$tar6;
|
|
1359
1329
|
|
|
1360
|
-
return
|
|
1330
|
+
return compileExpression(getExpressionFromAnnotation(((_property$Label3 = property.Label) === null || _property$Label3 === void 0 ? void 0 : _property$Label3.valueOf()) || ((_property$Target = property.Target) === null || _property$Target === void 0 ? void 0 : (_property$Target$$tar = _property$Target.$target) === null || _property$Target$$tar === void 0 ? void 0 : (_property$Target$$tar2 = _property$Target$$tar.Value) === null || _property$Target$$tar2 === void 0 ? void 0 : (_property$Target$$tar3 = _property$Target$$tar2.$target) === null || _property$Target$$tar3 === void 0 ? void 0 : (_property$Target$$tar4 = _property$Target$$tar3.annotations) === null || _property$Target$$tar4 === void 0 ? void 0 : (_property$Target$$tar5 = _property$Target$$tar4.Common) === null || _property$Target$$tar5 === void 0 ? void 0 : (_property$Target$$tar6 = _property$Target$$tar5.Label) === null || _property$Target$$tar6 === void 0 ? void 0 : _property$Target$$tar6.valueOf())));
|
|
1361
1331
|
} else {
|
|
1362
1332
|
var _property$Label4;
|
|
1363
1333
|
|
|
1364
|
-
return
|
|
1334
|
+
return compileExpression(getExpressionFromAnnotation((_property$Label4 = property.Label) === null || _property$Label4 === void 0 ? void 0 : _property$Label4.valueOf()));
|
|
1365
1335
|
}
|
|
1366
1336
|
};
|
|
1367
1337
|
|
|
1368
1338
|
var _getTooltip = function (source) {
|
|
1339
|
+
var _source$annotations, _source$annotations$C;
|
|
1340
|
+
|
|
1369
1341
|
if (!source) {
|
|
1370
1342
|
return undefined;
|
|
1371
1343
|
}
|
|
1372
1344
|
|
|
1373
|
-
if (isProperty(source)) {
|
|
1374
|
-
var _source$
|
|
1345
|
+
if (isProperty(source) || (_source$annotations = source.annotations) !== null && _source$annotations !== void 0 && (_source$annotations$C = _source$annotations.Common) !== null && _source$annotations$C !== void 0 && _source$annotations$C.QuickInfo) {
|
|
1346
|
+
var _source$annotations2, _source$annotations2$;
|
|
1375
1347
|
|
|
1376
|
-
return (_source$
|
|
1348
|
+
return (_source$annotations2 = source.annotations) !== null && _source$annotations2 !== void 0 && (_source$annotations2$ = _source$annotations2.Common) !== null && _source$annotations2$ !== void 0 && _source$annotations2$.QuickInfo ? compileExpression(getExpressionFromAnnotation(source.annotations.Common.QuickInfo.valueOf())) : undefined;
|
|
1377
1349
|
} else if (isDataFieldTypes(source)) {
|
|
1378
1350
|
var _source$Value, _source$Value$$target, _source$Value$$target2, _source$Value$$target3;
|
|
1379
1351
|
|
|
1380
|
-
return (_source$Value = source.Value) !== null && _source$Value !== void 0 && (_source$Value$$target = _source$Value.$target) !== null && _source$Value$$target !== void 0 && (_source$Value$$target2 = _source$Value$$target.annotations) !== null && _source$Value$$target2 !== void 0 && (_source$Value$$target3 = _source$Value$$target2.Common) !== null && _source$Value$$target3 !== void 0 && _source$Value$$target3.QuickInfo ?
|
|
1352
|
+
return (_source$Value = source.Value) !== null && _source$Value !== void 0 && (_source$Value$$target = _source$Value.$target) !== null && _source$Value$$target !== void 0 && (_source$Value$$target2 = _source$Value$$target.annotations) !== null && _source$Value$$target2 !== void 0 && (_source$Value$$target3 = _source$Value$$target2.Common) !== null && _source$Value$$target3 !== void 0 && _source$Value$$target3.QuickInfo ? compileExpression(getExpressionFromAnnotation(source.Value.$target.annotations.Common.QuickInfo.valueOf())) : undefined;
|
|
1381
1353
|
} else if (source.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation") {
|
|
1382
1354
|
var _source$Target, _datapointTarget$Valu, _datapointTarget$Valu2, _datapointTarget$Valu3, _datapointTarget$Valu4;
|
|
1383
1355
|
|
|
1384
1356
|
var datapointTarget = (_source$Target = source.Target) === null || _source$Target === void 0 ? void 0 : _source$Target.$target;
|
|
1385
|
-
return datapointTarget !== null && datapointTarget !== void 0 && (_datapointTarget$Valu = datapointTarget.Value) !== null && _datapointTarget$Valu !== void 0 && (_datapointTarget$Valu2 = _datapointTarget$Valu.$target) !== null && _datapointTarget$Valu2 !== void 0 && (_datapointTarget$Valu3 = _datapointTarget$Valu2.annotations) !== null && _datapointTarget$Valu3 !== void 0 && (_datapointTarget$Valu4 = _datapointTarget$Valu3.Common) !== null && _datapointTarget$Valu4 !== void 0 && _datapointTarget$Valu4.QuickInfo ?
|
|
1357
|
+
return datapointTarget !== null && datapointTarget !== void 0 && (_datapointTarget$Valu = datapointTarget.Value) !== null && _datapointTarget$Valu !== void 0 && (_datapointTarget$Valu2 = _datapointTarget$Valu.$target) !== null && _datapointTarget$Valu2 !== void 0 && (_datapointTarget$Valu3 = _datapointTarget$Valu2.annotations) !== null && _datapointTarget$Valu3 !== void 0 && (_datapointTarget$Valu4 = _datapointTarget$Valu3.Common) !== null && _datapointTarget$Valu4 !== void 0 && _datapointTarget$Valu4.QuickInfo ? compileExpression(getExpressionFromAnnotation(datapointTarget.Value.$target.annotations.Common.QuickInfo.valueOf())) : undefined;
|
|
1386
1358
|
} else {
|
|
1387
1359
|
return undefined;
|
|
1388
1360
|
}
|
|
1389
1361
|
};
|
|
1390
1362
|
|
|
1391
1363
|
function getRowStatusVisibility() {
|
|
1392
|
-
return formatResult([
|
|
1364
|
+
return formatResult([pathInModel("semanticKeyHasDraftIndicator", "internal"), pathInModel("filteredMessages", "internal")], tableFormatters.getErrorStatusTextVisibilityFormatter);
|
|
1393
1365
|
}
|
|
1394
1366
|
/**
|
|
1395
1367
|
* Creates a PropertyInfo for each identified property consumed by a LineItem.
|
|
1396
1368
|
*
|
|
1397
|
-
* @param
|
|
1369
|
+
* @param columnsToBeCreated Identified properties.
|
|
1398
1370
|
* @param existingColumns The list of columns created for LineItems and Properties of entityType.
|
|
1399
1371
|
* @param nonSortableColumns The array of column names which cannot be sorted.
|
|
1400
1372
|
* @param converterContext The converter context.
|
|
1401
1373
|
* @param entityType The entity type for the LineItem
|
|
1402
|
-
* @returns
|
|
1374
|
+
* @returns The array of columns created.
|
|
1403
1375
|
*/
|
|
1404
1376
|
|
|
1405
1377
|
|
|
@@ -1425,14 +1397,16 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1425
1397
|
// Case 2: The existing column points to a LineItem (or)
|
|
1426
1398
|
// Case 3: This is a self reference from an existing column and
|
|
1427
1399
|
// both cases require a dummy PropertyInfo for setting correct export settings.
|
|
1428
|
-
var newName = "Property::"
|
|
1400
|
+
var newName = "Property::".concat(name); // Checking whether the related property column has already been created in a previous iteration.
|
|
1429
1401
|
|
|
1430
1402
|
if (!existingColumns.some(function (column) {
|
|
1431
1403
|
return column.name === newName;
|
|
1432
1404
|
})) {
|
|
1433
1405
|
// Create a new property column with 'Property::' prefix,
|
|
1434
1406
|
// Set it to hidden as it is only consumed by Complex property infos.
|
|
1435
|
-
|
|
1407
|
+
var column = getColumnDefinitionFromProperty(property, annotationPath, name, false, false, nonSortableColumns, aggregationHelper, converterContext);
|
|
1408
|
+
column.isPartOfLineItem = relatedColumn.isPartOfLineItem;
|
|
1409
|
+
relatedColumns.push(column);
|
|
1436
1410
|
relatedPropertyNameMap[name] = newName;
|
|
1437
1411
|
}
|
|
1438
1412
|
}
|
|
@@ -1460,8 +1434,8 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1460
1434
|
* If it points to a DataField with one property or DataPoint with one property, it will use the property name
|
|
1461
1435
|
* here to be consistent with the existing flex changes.
|
|
1462
1436
|
*
|
|
1463
|
-
* @param
|
|
1464
|
-
* @returns
|
|
1437
|
+
* @param dataField Different DataField types defined in the annotations
|
|
1438
|
+
* @returns The name of annotation columns
|
|
1465
1439
|
* @private
|
|
1466
1440
|
*/
|
|
1467
1441
|
|
|
@@ -1485,10 +1459,11 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1485
1459
|
};
|
|
1486
1460
|
/**
|
|
1487
1461
|
* Determines if the data field labels have to be displayed in the table.
|
|
1488
|
-
*
|
|
1489
|
-
* @param
|
|
1490
|
-
* @param
|
|
1491
|
-
* @
|
|
1462
|
+
*
|
|
1463
|
+
* @param fieldGroupName The `DataField` name being processed.
|
|
1464
|
+
* @param visualizationPath
|
|
1465
|
+
* @param converterContext
|
|
1466
|
+
* @returns `showDataFieldsLabel` value from the manifest
|
|
1492
1467
|
* @private
|
|
1493
1468
|
*/
|
|
1494
1469
|
|
|
@@ -1504,13 +1479,14 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1504
1479
|
};
|
|
1505
1480
|
/**
|
|
1506
1481
|
* Determines the relative path of the property with respect to the root entity.
|
|
1482
|
+
*
|
|
1507
1483
|
* @param dataField The `DataField` being processed.
|
|
1508
|
-
* @returns
|
|
1484
|
+
* @returns The relative path
|
|
1509
1485
|
*/
|
|
1510
1486
|
|
|
1511
1487
|
|
|
1512
1488
|
var _getRelativePath = function (dataField) {
|
|
1513
|
-
var _Value,
|
|
1489
|
+
var _Value, _dataField$Target3;
|
|
1514
1490
|
|
|
1515
1491
|
var relativePath = "";
|
|
1516
1492
|
|
|
@@ -1524,11 +1500,13 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1524
1500
|
break;
|
|
1525
1501
|
|
|
1526
1502
|
case "com.sap.vocabularies.UI.v1.DataFieldForAnnotation":
|
|
1527
|
-
relativePath = dataField === null || dataField === void 0 ? void 0 : (
|
|
1503
|
+
relativePath = dataField === null || dataField === void 0 ? void 0 : (_dataField$Target3 = dataField.Target) === null || _dataField$Target3 === void 0 ? void 0 : _dataField$Target3.value;
|
|
1528
1504
|
break;
|
|
1529
1505
|
|
|
1530
1506
|
case "com.sap.vocabularies.UI.v1.DataFieldForAction":
|
|
1531
1507
|
case "com.sap.vocabularies.UI.v1.DataFieldForIntentBasedNavigation":
|
|
1508
|
+
case "com.sap.vocabularies.UI.v1.DataFieldForActionGroup":
|
|
1509
|
+
case "com.sap.vocabularies.UI.v1.DataFieldWithActionGroup":
|
|
1532
1510
|
relativePath = KeyHelper.generateKeyFromDataField(dataField);
|
|
1533
1511
|
break;
|
|
1534
1512
|
}
|
|
@@ -1551,36 +1529,19 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1551
1529
|
* @param dataField The data field being processed
|
|
1552
1530
|
* @param propertyPath The property path
|
|
1553
1531
|
* @param nonSortableColumns Collection of non-sortable column names as per annotation
|
|
1554
|
-
* @returns
|
|
1532
|
+
* @returns True if the column is sortable
|
|
1555
1533
|
*/
|
|
1556
1534
|
|
|
1557
1535
|
|
|
1558
1536
|
var _isColumnSortable = function (dataField, propertyPath, nonSortableColumns) {
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
if (nonSortableColumns.indexOf(propertyPath) === -1) {
|
|
1562
|
-
// Column is not marked as non-sortable via annotation
|
|
1563
|
-
switch (dataField.$Type) {
|
|
1564
|
-
case "com.sap.vocabularies.UI.v1.DataField":
|
|
1565
|
-
case "com.sap.vocabularies.UI.v1.DataFieldWithUrl":
|
|
1566
|
-
isSortable = true;
|
|
1567
|
-
break;
|
|
1568
|
-
|
|
1569
|
-
case "com.sap.vocabularies.UI.v1.DataFieldForIntentBasedNavigation":
|
|
1570
|
-
case "com.sap.vocabularies.UI.v1.DataFieldForAction":
|
|
1571
|
-
// Action columns are not sortable
|
|
1572
|
-
isSortable = false;
|
|
1573
|
-
break;
|
|
1574
|
-
}
|
|
1575
|
-
}
|
|
1576
|
-
|
|
1577
|
-
return isSortable;
|
|
1537
|
+
return nonSortableColumns.indexOf(propertyPath) === -1 && ( // Column is not marked as non-sortable via annotation
|
|
1538
|
+
dataField.$Type === "com.sap.vocabularies.UI.v1.DataField" || dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldWithUrl" || dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldWithIntentBasedNavigation" || dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldWithAction");
|
|
1578
1539
|
};
|
|
1579
1540
|
/**
|
|
1580
1541
|
* Returns whether filtering on the table is case sensitive.
|
|
1581
1542
|
*
|
|
1582
|
-
* @param
|
|
1583
|
-
* @returns
|
|
1543
|
+
* @param converterContext The instance of the converter context
|
|
1544
|
+
* @returns Returns 'false' if FilterFunctions annotation supports 'tolower', else 'true'
|
|
1584
1545
|
*/
|
|
1585
1546
|
|
|
1586
1547
|
|
|
@@ -1593,7 +1554,7 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1593
1554
|
/**
|
|
1594
1555
|
* Returns default format options for text fields in a table.
|
|
1595
1556
|
*
|
|
1596
|
-
* @returns
|
|
1557
|
+
* @returns Collection of format options with default values
|
|
1597
1558
|
*/
|
|
1598
1559
|
|
|
1599
1560
|
|
|
@@ -1673,11 +1634,12 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1673
1634
|
}
|
|
1674
1635
|
/**
|
|
1675
1636
|
* Returns default format options with draftIndicator for a column.
|
|
1637
|
+
*
|
|
1676
1638
|
* @param name
|
|
1677
1639
|
* @param semanticKeys
|
|
1678
1640
|
* @param isFieldGroupColumn
|
|
1679
1641
|
* @param dataFieldGroup
|
|
1680
|
-
* @returns
|
|
1642
|
+
* @returns Collection of format options with default values
|
|
1681
1643
|
*/
|
|
1682
1644
|
|
|
1683
1645
|
|
|
@@ -1694,18 +1656,16 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1694
1656
|
return {
|
|
1695
1657
|
hasDraftIndicator: true,
|
|
1696
1658
|
semantickeys: semanticKey.values,
|
|
1697
|
-
objectStatusTextVisibility:
|
|
1659
|
+
objectStatusTextVisibility: compileExpression(getRowStatusVisibility())
|
|
1698
1660
|
};
|
|
1661
|
+
} else if (!semanticKeyInFieldGroup.semanticKeyHasPropertyInFieldGroup) {
|
|
1662
|
+
return {};
|
|
1699
1663
|
} else {
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
FieldGroupDraftIndicatorPropertyPath: semanticKeyInFieldGroup.propertyPath,
|
|
1706
|
-
FieldGroupName: name
|
|
1707
|
-
};
|
|
1708
|
-
}
|
|
1664
|
+
// Semantic Key has a property in a FieldGroup
|
|
1665
|
+
return {
|
|
1666
|
+
FieldGroupDraftIndicatorPropertyPath: semanticKeyInFieldGroup.propertyPath,
|
|
1667
|
+
FieldGroupName: name
|
|
1668
|
+
};
|
|
1709
1669
|
}
|
|
1710
1670
|
}
|
|
1711
1671
|
|
|
@@ -1771,7 +1731,7 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1771
1731
|
*
|
|
1772
1732
|
* @param dataField
|
|
1773
1733
|
* @param semanticKeys
|
|
1774
|
-
* @returns
|
|
1734
|
+
* @returns The importance value
|
|
1775
1735
|
*/
|
|
1776
1736
|
|
|
1777
1737
|
|
|
@@ -1825,10 +1785,10 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1825
1785
|
/**
|
|
1826
1786
|
* Returns line items from metadata annotations.
|
|
1827
1787
|
*
|
|
1828
|
-
* @param
|
|
1829
|
-
* @param
|
|
1830
|
-
* @param
|
|
1831
|
-
* @returns
|
|
1788
|
+
* @param lineItemAnnotation Collection of data fields with their annotations
|
|
1789
|
+
* @param visualizationPath The visualization path
|
|
1790
|
+
* @param converterContext The converter context
|
|
1791
|
+
* @returns The columns from the annotations
|
|
1832
1792
|
*/
|
|
1833
1793
|
|
|
1834
1794
|
|
|
@@ -1847,19 +1807,33 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1847
1807
|
|
|
1848
1808
|
if (lineItemAnnotation) {
|
|
1849
1809
|
lineItemAnnotation.forEach(function (lineItem) {
|
|
1850
|
-
var _lineItem$Value, _lineItem$Value$$targ, _lineItem$Target, _lineItem$Target$$tar, _lineItem$annotations, _lineItem$annotations2, _lineItem$annotations3;
|
|
1810
|
+
var _lineItem$Value, _lineItem$Value$$targ, _lineItem$Target, _lineItem$Target$$tar, _lineItem$Target2, _lineItem$Target2$$ta, _lineItem$annotations, _lineItem$annotations2, _lineItem$annotations3;
|
|
1851
1811
|
|
|
1852
|
-
if (!_isValidColumn(lineItem)) {
|
|
1812
|
+
if (!_isValidColumn(lineItem) || isReferencePropertyStaticallyHidden(lineItem)) {
|
|
1853
1813
|
return;
|
|
1854
1814
|
}
|
|
1855
1815
|
|
|
1856
1816
|
var semanticObjectAnnotationPath = isDataFieldTypes(lineItem) && (_lineItem$Value = lineItem.Value) !== null && _lineItem$Value !== void 0 && (_lineItem$Value$$targ = _lineItem$Value.$target) !== null && _lineItem$Value$$targ !== void 0 && _lineItem$Value$$targ.fullyQualifiedName ? getSemanticObjectPath(converterContext, lineItem) : undefined;
|
|
1857
1817
|
|
|
1858
|
-
var relativePath = _getRelativePath(lineItem);
|
|
1818
|
+
var relativePath = _getRelativePath(lineItem);
|
|
1859
1819
|
|
|
1820
|
+
var relatedPropertyNames; // Determine properties which are consumed by this LineItem.
|
|
1860
1821
|
|
|
1861
1822
|
var relatedPropertiesInfo = collectRelatedPropertiesRecursively(lineItem, converterContext, tableType);
|
|
1862
|
-
var
|
|
1823
|
+
var relatedProperties = relatedPropertiesInfo.properties;
|
|
1824
|
+
|
|
1825
|
+
if (lineItem.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation" && ((_lineItem$Target = lineItem.Target) === null || _lineItem$Target === void 0 ? void 0 : (_lineItem$Target$$tar = _lineItem$Target.$target) === null || _lineItem$Target$$tar === void 0 ? void 0 : _lineItem$Target$$tar.$Type) === "com.sap.vocabularies.UI.v1.FieldGroupType") {
|
|
1826
|
+
relatedPropertyNames = Object.keys(relatedPropertiesInfo.properties).filter(function (key) {
|
|
1827
|
+
var _relatedProperties$ke, _relatedProperties$ke2, _relatedProperties$ke3;
|
|
1828
|
+
|
|
1829
|
+
var isStaticallyHidden;
|
|
1830
|
+
if ((_relatedProperties$ke = relatedProperties[key].annotations) !== null && _relatedProperties$ke !== void 0 && _relatedProperties$ke.UI) isStaticallyHidden = isReferencePropertyStaticallyHidden((_relatedProperties$ke2 = relatedProperties[key].annotations) === null || _relatedProperties$ke2 === void 0 ? void 0 : (_relatedProperties$ke3 = _relatedProperties$ke2.UI) === null || _relatedProperties$ke3 === void 0 ? void 0 : _relatedProperties$ke3.DataFieldDefault);else isStaticallyHidden = isReferencePropertyStaticallyHidden(relatedProperties[key]);
|
|
1831
|
+
return !isStaticallyHidden;
|
|
1832
|
+
});
|
|
1833
|
+
} else {
|
|
1834
|
+
relatedPropertyNames = Object.keys(relatedPropertiesInfo.properties);
|
|
1835
|
+
}
|
|
1836
|
+
|
|
1863
1837
|
var additionalPropertyNames = Object.keys(relatedPropertiesInfo.additionalProperties);
|
|
1864
1838
|
|
|
1865
1839
|
var groupPath = _sliceAtSlash(relativePath, true, false);
|
|
@@ -1879,7 +1853,7 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1879
1853
|
|
|
1880
1854
|
var fieldGroupHiddenExpressions;
|
|
1881
1855
|
|
|
1882
|
-
if (lineItem.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation" && ((_lineItem$
|
|
1856
|
+
if (lineItem.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation" && ((_lineItem$Target2 = lineItem.Target) === null || _lineItem$Target2 === void 0 ? void 0 : (_lineItem$Target2$$ta = _lineItem$Target2.$target) === null || _lineItem$Target2$$ta === void 0 ? void 0 : _lineItem$Target2$$ta.$Type) === "com.sap.vocabularies.UI.v1.FieldGroupType") {
|
|
1883
1857
|
fieldGroupHiddenExpressions = _getFieldGroupHiddenExpressions(lineItem, formatOptions);
|
|
1884
1858
|
}
|
|
1885
1859
|
|
|
@@ -1916,7 +1890,7 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1916
1890
|
// In case of text arrangement annotation with display mode as text only, exclude text property from the width calculation
|
|
1917
1891
|
visualSettings = {
|
|
1918
1892
|
widthCalculation: {
|
|
1919
|
-
excludeProperties: ["Property::"
|
|
1893
|
+
excludeProperties: ["Property::".concat(relatedPropertiesInfo.visualSettingsToBeExcluded)]
|
|
1920
1894
|
}
|
|
1921
1895
|
};
|
|
1922
1896
|
} else if (!dataType || !oTypeConfig) {
|
|
@@ -1938,7 +1912,7 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1938
1912
|
showDataFieldsLabel: showDataFieldsLabel,
|
|
1939
1913
|
relativePath: relativePath,
|
|
1940
1914
|
sortable: _isColumnSortable(lineItem, relativePath, nonSortableColumns),
|
|
1941
|
-
propertyInfos: relatedPropertyNames.length
|
|
1915
|
+
propertyInfos: relatedPropertyNames.length ? relatedPropertyNames : undefined,
|
|
1942
1916
|
additionalPropertyInfos: additionalPropertyNames.length > 0 ? additionalPropertyNames : undefined,
|
|
1943
1917
|
exportSettings: exportSettings,
|
|
1944
1918
|
width: ((_lineItem$annotations = lineItem.annotations) === null || _lineItem$annotations === void 0 ? void 0 : (_lineItem$annotations2 = _lineItem$annotations.HTML5) === null || _lineItem$annotations2 === void 0 ? void 0 : (_lineItem$annotations3 = _lineItem$annotations2.CssDefaults) === null || _lineItem$annotations3 === void 0 ? void 0 : _lineItem$annotations3.width) || undefined,
|
|
@@ -1949,7 +1923,8 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1949
1923
|
caseSensitive: isFilteringCaseSensitive(converterContext),
|
|
1950
1924
|
typeConfig: oTypeConfig,
|
|
1951
1925
|
visualSettings: visualSettings,
|
|
1952
|
-
timezoneText: exportSettings.timezone
|
|
1926
|
+
timezoneText: exportSettings.timezone,
|
|
1927
|
+
isPartOfLineItem: true
|
|
1953
1928
|
};
|
|
1954
1929
|
|
|
1955
1930
|
var sTooltip = _getTooltip(lineItem);
|
|
@@ -1960,34 +1935,29 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
1960
1935
|
|
|
1961
1936
|
annotationColumns.push(oColumn); // Collect information of related columns to be created.
|
|
1962
1937
|
|
|
1963
|
-
relatedPropertyNames.forEach(function (
|
|
1964
|
-
columnsToBeCreated[
|
|
1938
|
+
relatedPropertyNames.forEach(function (relatedPropertyName) {
|
|
1939
|
+
columnsToBeCreated[relatedPropertyName] = relatedPropertiesInfo.properties[relatedPropertyName];
|
|
1965
1940
|
}); // Create columns for additional properties identified for ALP use case.
|
|
1966
1941
|
|
|
1967
|
-
additionalPropertyNames.forEach(function (
|
|
1942
|
+
additionalPropertyNames.forEach(function (additionalPropertyName) {
|
|
1968
1943
|
// Intentional overwrite as we require only one new PropertyInfo for a related Property.
|
|
1969
|
-
columnsToBeCreated[
|
|
1944
|
+
columnsToBeCreated[additionalPropertyName] = relatedPropertiesInfo.additionalProperties[additionalPropertyName];
|
|
1970
1945
|
});
|
|
1971
1946
|
});
|
|
1972
1947
|
} // Get columns from the Properties of EntityType
|
|
1973
1948
|
|
|
1974
1949
|
|
|
1975
|
-
|
|
1976
|
-
tableColumns = tableColumns.concat(annotationColumns); // Create a propertyInfo for each related property.
|
|
1977
|
-
|
|
1978
|
-
var relatedColumns = _createRelatedColumns(columnsToBeCreated, tableColumns, nonSortableColumns, converterContext, entityType);
|
|
1979
|
-
|
|
1980
|
-
tableColumns = tableColumns.concat(relatedColumns);
|
|
1981
|
-
return tableColumns;
|
|
1950
|
+
return getColumnsFromEntityType(columnsToBeCreated, entityType, annotationColumns, nonSortableColumns, converterContext, tableType);
|
|
1982
1951
|
};
|
|
1983
1952
|
/**
|
|
1984
1953
|
* Gets the property names from the manifest and checks against existing properties already added by annotations.
|
|
1985
1954
|
* If a not yet stored property is found it adds it for sorting and filtering only to the annotationColumns.
|
|
1986
|
-
*
|
|
1987
|
-
* @param
|
|
1988
|
-
* @param
|
|
1955
|
+
*
|
|
1956
|
+
* @param properties
|
|
1957
|
+
* @param annotationColumns
|
|
1958
|
+
* @param converterContext
|
|
1989
1959
|
* @param entityType
|
|
1990
|
-
* @returns
|
|
1960
|
+
* @returns The columns from the annotations
|
|
1991
1961
|
*/
|
|
1992
1962
|
|
|
1993
1963
|
|
|
@@ -2025,10 +1995,10 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
2025
1995
|
* Manifest defined property value for custom / annotation columns
|
|
2026
1996
|
* Default property value for custom column if not overwritten in manifest.
|
|
2027
1997
|
*
|
|
2028
|
-
* @param
|
|
2029
|
-
* @param
|
|
2030
|
-
* @param
|
|
2031
|
-
* @returns
|
|
1998
|
+
* @param property The column property defined in the manifest
|
|
1999
|
+
* @param defaultValue The default value of the property
|
|
2000
|
+
* @param isAnnotationColumn Whether the column, defined in manifest, corresponds to an existing annotation column.
|
|
2001
|
+
* @returns Determined property value for the column
|
|
2032
2002
|
*/
|
|
2033
2003
|
|
|
2034
2004
|
|
|
@@ -2044,12 +2014,13 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
2044
2014
|
};
|
|
2045
2015
|
/**
|
|
2046
2016
|
* Returns table column definitions from manifest.
|
|
2017
|
+
*
|
|
2047
2018
|
* @param columns
|
|
2048
2019
|
* @param annotationColumns
|
|
2049
2020
|
* @param converterContext
|
|
2050
2021
|
* @param entityType
|
|
2051
2022
|
* @param navigationSettings
|
|
2052
|
-
* @returns
|
|
2023
|
+
* @returns The columns from the manifest
|
|
2053
2024
|
*/
|
|
2054
2025
|
|
|
2055
2026
|
|
|
@@ -2069,15 +2040,15 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
2069
2040
|
if (!(manifestColumn !== null && manifestColumn !== void 0 && manifestColumn.template) && (manifestColumn === null || manifestColumn === void 0 ? void 0 : manifestColumn.type) !== "Slot" && !isAnnotationColumn) {
|
|
2070
2041
|
var _IssueCategoryType$An;
|
|
2071
2042
|
|
|
2072
|
-
var Message = "The annotation column '"
|
|
2043
|
+
var Message = "The annotation column '".concat(key, "' referenced in the manifest is not found");
|
|
2073
2044
|
converterContext.getDiagnostics().addIssue(IssueCategory.Manifest, IssueSeverity.Low, Message, IssueCategoryType, IssueCategoryType === null || IssueCategoryType === void 0 ? void 0 : (_IssueCategoryType$An = IssueCategoryType.AnnotationColumns) === null || _IssueCategoryType$An === void 0 ? void 0 : _IssueCategoryType$An.InvalidKey);
|
|
2074
2045
|
} else {
|
|
2075
2046
|
var _manifestColumn$posit;
|
|
2076
2047
|
|
|
2077
2048
|
internalColumns[key] = {
|
|
2078
2049
|
key: key,
|
|
2079
|
-
id: "CustomColumn::"
|
|
2080
|
-
name: "CustomColumn::"
|
|
2050
|
+
id: "CustomColumn::".concat(key),
|
|
2051
|
+
name: "CustomColumn::".concat(key),
|
|
2081
2052
|
header: manifestColumn.header,
|
|
2082
2053
|
width: manifestColumn.width || undefined,
|
|
2083
2054
|
importance: _getManifestOrDefaultValue(manifestColumn === null || manifestColumn === void 0 ? void 0 : manifestColumn.importance, Importance.None, isAnnotationColumn),
|
|
@@ -2095,6 +2066,9 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
2095
2066
|
isGroupable: false,
|
|
2096
2067
|
propertyInfos: propertyInfos,
|
|
2097
2068
|
formatOptions: _getManifestOrDefaultValue(manifestColumn.formatOptions, _objectSpread(_objectSpread({}, getDefaultFormatOptionsForTable()), manifestColumn.formatOptions), isAnnotationColumn),
|
|
2069
|
+
visualSettings: {
|
|
2070
|
+
widthCalculation: null
|
|
2071
|
+
},
|
|
2098
2072
|
exportSettings: {
|
|
2099
2073
|
template: propertyInfos ? _appendCustomTemplate(propertyInfos) : undefined,
|
|
2100
2074
|
wrap: propertyInfos && propertyInfos.length > 1 ? true : false
|
|
@@ -2197,9 +2171,9 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
2197
2171
|
* Chart has a dependency to filter bar (issue with loading data). Once resolved, the check for chart should be removed here.
|
|
2198
2172
|
* Until then, hiding filter bar is now allowed if a chart is being used on LR.
|
|
2199
2173
|
*
|
|
2200
|
-
* @param
|
|
2201
|
-
* @param
|
|
2202
|
-
* @returns
|
|
2174
|
+
* @param manifestWrapper Manifest settings getter for the page
|
|
2175
|
+
* @param converterContext The instance of the converter context
|
|
2176
|
+
* @returns Boolean suggesting if a filter bar is being used on the page.
|
|
2203
2177
|
*/
|
|
2204
2178
|
|
|
2205
2179
|
|
|
@@ -2212,9 +2186,9 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
2212
2186
|
* Returns a JSON string containing the sort conditions for the presentation variant.
|
|
2213
2187
|
*
|
|
2214
2188
|
* @param converterContext The instance of the converter context
|
|
2215
|
-
* @param
|
|
2189
|
+
* @param presentationVariantAnnotation Presentation variant annotation
|
|
2216
2190
|
* @param columns Table columns processed by the converter
|
|
2217
|
-
* @returns
|
|
2191
|
+
* @returns Sort conditions for a presentation variant.
|
|
2218
2192
|
*/
|
|
2219
2193
|
|
|
2220
2194
|
|
|
@@ -2281,9 +2255,10 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
2281
2255
|
/**
|
|
2282
2256
|
* Returns a JSON string containing Presentation Variant group conditions.
|
|
2283
2257
|
*
|
|
2284
|
-
* @param
|
|
2258
|
+
* @param presentationVariantAnnotation Presentation variant annotation
|
|
2285
2259
|
* @param columns Converter processed table columns
|
|
2286
|
-
* @
|
|
2260
|
+
* @param tableType The table type.
|
|
2261
|
+
* @returns Group conditions for a Presentation variant.
|
|
2287
2262
|
*/
|
|
2288
2263
|
|
|
2289
2264
|
|
|
@@ -2312,9 +2287,9 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
2312
2287
|
/**
|
|
2313
2288
|
* Returns a JSON string containing Presentation Variant aggregate conditions.
|
|
2314
2289
|
*
|
|
2315
|
-
* @param
|
|
2290
|
+
* @param presentationVariantAnnotation Presentation variant annotation
|
|
2316
2291
|
* @param columns Converter processed table columns
|
|
2317
|
-
* @returns
|
|
2292
|
+
* @returns Group conditions for a Presentation variant.
|
|
2318
2293
|
*/
|
|
2319
2294
|
|
|
2320
2295
|
|
|
@@ -2345,7 +2320,7 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
2345
2320
|
var pageManifestSettings = converterContext.getManifestWrapper();
|
|
2346
2321
|
var hasAbsolutePath = navigationPropertyPath.length === 0,
|
|
2347
2322
|
p13nMode = getP13nMode(visualizationPath, converterContext, tableManifestConfiguration),
|
|
2348
|
-
id = navigationPropertyPath ?
|
|
2323
|
+
id = navigationPropertyPath ? getTableID(visualizationPath) : getTableID(converterContext.getContextPath(), "LineItem");
|
|
2349
2324
|
var targetCapabilities = getCapabilityRestriction(converterContext);
|
|
2350
2325
|
var navigationTargetPath = getNavigationTargetPath(converterContext, navigationPropertyPath);
|
|
2351
2326
|
var navigationSettings = pageManifestSettings.getNavigationConfiguration(navigationTargetPath);
|
|
@@ -2356,7 +2331,7 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
2356
2331
|
var deleteButtonVisibilityExpression = getDeleteVisibility(converterContext, standardActionsContext);
|
|
2357
2332
|
var createButtonVisibilityExpression = getCreateVisibility(converterContext, standardActionsContext);
|
|
2358
2333
|
var massEditButtonVisibilityExpression = getMassEditVisibility(converterContext, standardActionsContext);
|
|
2359
|
-
var isInsertUpdateTemplated = getInsertUpdateActionsTemplating(standardActionsContext, isDraftOrStickySupported(converterContext),
|
|
2334
|
+
var isInsertUpdateTemplated = getInsertUpdateActionsTemplating(standardActionsContext, isDraftOrStickySupported(converterContext), compileExpression(createButtonVisibilityExpression) === "false");
|
|
2360
2335
|
var selectionMode = getSelectionMode(lineItemAnnotation, visualizationPath, converterContext, hasAbsolutePath, targetCapabilities, deleteButtonVisibilityExpression, massEditButtonVisibilityExpression);
|
|
2361
2336
|
var threshold = navigationPropertyPath ? 10 : 30;
|
|
2362
2337
|
|
|
@@ -2447,7 +2422,7 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
2447
2422
|
* Split the visualization path into the navigation property path and annotation.
|
|
2448
2423
|
*
|
|
2449
2424
|
* @param visualizationPath
|
|
2450
|
-
* @returns
|
|
2425
|
+
* @returns The split path
|
|
2451
2426
|
*/
|
|
2452
2427
|
|
|
2453
2428
|
|
|
@@ -2480,10 +2455,10 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
2480
2455
|
var propertyNames = [];
|
|
2481
2456
|
(_selection$SelectOpti = selection.SelectOptions) === null || _selection$SelectOpti === void 0 ? void 0 : _selection$SelectOpti.forEach(function (selectOption) {
|
|
2482
2457
|
var propertyName = selectOption.PropertyName;
|
|
2483
|
-
var
|
|
2458
|
+
var propertyPath = propertyName.value;
|
|
2484
2459
|
|
|
2485
|
-
if (propertyNames.indexOf(
|
|
2486
|
-
propertyNames.push(
|
|
2460
|
+
if (propertyNames.indexOf(propertyPath) === -1) {
|
|
2461
|
+
propertyNames.push(propertyPath);
|
|
2487
2462
|
}
|
|
2488
2463
|
});
|
|
2489
2464
|
return {
|
|
@@ -2541,19 +2516,12 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
2541
2516
|
|
|
2542
2517
|
function _getTableType(tableSettings, aggregationHelper, converterContext) {
|
|
2543
2518
|
var tableType = (tableSettings === null || tableSettings === void 0 ? void 0 : tableSettings.type) || "ResponsiveTable";
|
|
2519
|
+
/* Now, we keep the configuration in the manifest, even if it leads to errors.
|
|
2520
|
+
We only change if we're not on desktop from Analytical to Responsive.
|
|
2521
|
+
*/
|
|
2544
2522
|
|
|
2545
|
-
if (
|
|
2546
|
-
|
|
2547
|
-
tableType = "GridTable";
|
|
2548
|
-
}
|
|
2549
|
-
|
|
2550
|
-
if (!(tableSettings !== null && tableSettings !== void 0 && tableSettings.type)) {
|
|
2551
|
-
if (converterContext.getManifestWrapper().isDesktop() && aggregationHelper.isAnalyticsSupported()) {
|
|
2552
|
-
tableType = "AnalyticalTable";
|
|
2553
|
-
} else {
|
|
2554
|
-
tableType = "ResponsiveTable";
|
|
2555
|
-
}
|
|
2556
|
-
}
|
|
2523
|
+
if (tableType === "AnalyticalTable" && !converterContext.getManifestWrapper().isDesktop()) {
|
|
2524
|
+
tableType = "ResponsiveTable";
|
|
2557
2525
|
}
|
|
2558
2526
|
|
|
2559
2527
|
return tableType;
|
|
@@ -2593,7 +2561,7 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
2593
2561
|
var quickSelectionVariant;
|
|
2594
2562
|
var filters;
|
|
2595
2563
|
tableSettings === null || tableSettings === void 0 ? void 0 : (_tableSettings$quickV2 = tableSettings.quickVariantSelection) === null || _tableSettings$quickV2 === void 0 ? void 0 : (_tableSettings$quickV3 = _tableSettings$quickV2.paths) === null || _tableSettings$quickV3 === void 0 ? void 0 : _tableSettings$quickV3.forEach(function (path) {
|
|
2596
|
-
quickSelectionVariant = targetEntityType.resolvePath("@"
|
|
2564
|
+
quickSelectionVariant = targetEntityType.resolvePath("@".concat(path.annotationPath));
|
|
2597
2565
|
filters = _getFilters(tableSettings, quickFilterPaths, quickSelectionVariant, path, converterContext);
|
|
2598
2566
|
});
|
|
2599
2567
|
var hideTableTitle = false;
|
|
@@ -2645,7 +2613,8 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
2645
2613
|
inlineCreationRowCount: (_tableSettings$creati6 = tableSettings.creationMode) !== null && _tableSettings$creati6 !== void 0 && _tableSettings$creati6.inlineCreationRowCount ? (_tableSettings$creati7 = tableSettings.creationMode) === null || _tableSettings$creati7 === void 0 ? void 0 : _tableSettings$creati7.inlineCreationRowCount : 2,
|
|
2646
2614
|
showRowCount: !(tableSettings !== null && tableSettings !== void 0 && (_tableSettings$quickV5 = tableSettings.quickVariantSelection) !== null && _tableSettings$quickV5 !== void 0 && _tableSettings$quickV5.showCounts) && !((_converterContext$get20 = converterContext.getManifestWrapper().getViewConfiguration()) !== null && _converterContext$get20 !== void 0 && _converterContext$get20.showCounts),
|
|
2647
2615
|
type: tableType,
|
|
2648
|
-
useCondensedTableLayout: condensedTableLayout && isCondensedTableLayoutCompliant
|
|
2616
|
+
useCondensedTableLayout: condensedTableLayout && isCondensedTableLayoutCompliant,
|
|
2617
|
+
isCompactType: converterContext.getManifestWrapper().isCompactType()
|
|
2649
2618
|
};
|
|
2650
2619
|
return _objectSpread(_objectSpread({}, oConfiguration), oFilterConfiguration);
|
|
2651
2620
|
}
|
|
@@ -2668,7 +2637,7 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
2668
2637
|
};
|
|
2669
2638
|
|
|
2670
2639
|
if (isProperty(oProperty)) {
|
|
2671
|
-
var _oTargetMapping$const, _oTargetMapping$const2, _oTargetMapping$const3, _oTargetMapping$const4, _oTargetMapping$const5, _oProperty$annotation8, _oProperty$annotation9, _oProperty$annotation10, _oProperty$annotation11, _oTargetMapping$const6, _oProperty$annotation12, _oProperty$annotation13, _oProperty$annotation14, _oProperty$annotation15, _oTargetMapping$const7,
|
|
2640
|
+
var _oTargetMapping$const, _oTargetMapping$const2, _oTargetMapping$const3, _oTargetMapping$const4, _oTargetMapping$const5, _oProperty$annotation8, _oProperty$annotation9, _oProperty$annotation10, _oProperty$annotation11, _oTargetMapping$const6, _oProperty$annotation12, _oProperty$annotation13, _oProperty$annotation14, _oProperty$annotation15, _oTargetMapping$const7, _oProperty$annotation16, _oProperty$annotation17;
|
|
2672
2641
|
|
|
2673
2642
|
propertyTypeConfig.constraints = {
|
|
2674
2643
|
scale: (_oTargetMapping$const = oTargetMapping.constraints) !== null && _oTargetMapping$const !== void 0 && _oTargetMapping$const.$Scale ? oProperty.scale : undefined,
|
|
@@ -2677,7 +2646,7 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
2677
2646
|
nullable: (_oTargetMapping$const4 = oTargetMapping.constraints) !== null && _oTargetMapping$const4 !== void 0 && _oTargetMapping$const4.$Nullable ? oProperty.nullable : undefined,
|
|
2678
2647
|
minimum: (_oTargetMapping$const5 = oTargetMapping.constraints) !== null && _oTargetMapping$const5 !== void 0 && _oTargetMapping$const5["@Org.OData.Validation.V1.Minimum/$Decimal"] && !isNaN((_oProperty$annotation8 = oProperty.annotations) === null || _oProperty$annotation8 === void 0 ? void 0 : (_oProperty$annotation9 = _oProperty$annotation8.Validation) === null || _oProperty$annotation9 === void 0 ? void 0 : _oProperty$annotation9.Minimum) ? "".concat((_oProperty$annotation10 = oProperty.annotations) === null || _oProperty$annotation10 === void 0 ? void 0 : (_oProperty$annotation11 = _oProperty$annotation10.Validation) === null || _oProperty$annotation11 === void 0 ? void 0 : _oProperty$annotation11.Minimum) : undefined,
|
|
2679
2648
|
maximum: (_oTargetMapping$const6 = oTargetMapping.constraints) !== null && _oTargetMapping$const6 !== void 0 && _oTargetMapping$const6["@Org.OData.Validation.V1.Maximum/$Decimal"] && !isNaN((_oProperty$annotation12 = oProperty.annotations) === null || _oProperty$annotation12 === void 0 ? void 0 : (_oProperty$annotation13 = _oProperty$annotation12.Validation) === null || _oProperty$annotation13 === void 0 ? void 0 : _oProperty$annotation13.Maximum) ? "".concat((_oProperty$annotation14 = oProperty.annotations) === null || _oProperty$annotation14 === void 0 ? void 0 : (_oProperty$annotation15 = _oProperty$annotation14.Validation) === null || _oProperty$annotation15 === void 0 ? void 0 : _oProperty$annotation15.Maximum) : undefined,
|
|
2680
|
-
isDigitSequence: propertyTypeConfig.type === "sap.ui.model.odata.type.String" && (_oTargetMapping$const7 = oTargetMapping.constraints) !== null && _oTargetMapping$const7 !== void 0 && _oTargetMapping$const7["@com.sap.vocabularies.Common.v1.IsDigitSequence"] && (
|
|
2649
|
+
isDigitSequence: propertyTypeConfig.type === "sap.ui.model.odata.type.String" && (_oTargetMapping$const7 = oTargetMapping.constraints) !== null && _oTargetMapping$const7 !== void 0 && _oTargetMapping$const7["@com.sap.vocabularies.Common.v1.IsDigitSequence"] && (_oProperty$annotation16 = oProperty.annotations) !== null && _oProperty$annotation16 !== void 0 && (_oProperty$annotation17 = _oProperty$annotation16.Common) !== null && _oProperty$annotation17 !== void 0 && _oProperty$annotation17.IsDigitSequence ? true : undefined
|
|
2681
2650
|
};
|
|
2682
2651
|
}
|
|
2683
2652
|
|
|
@@ -2690,6 +2659,24 @@ sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/conv
|
|
|
2690
2659
|
}
|
|
2691
2660
|
|
|
2692
2661
|
_exports.getTypeConfig = getTypeConfig;
|
|
2693
|
-
return
|
|
2662
|
+
return {
|
|
2663
|
+
getTableActions: getTableActions,
|
|
2664
|
+
getTableColumns: getTableColumns,
|
|
2665
|
+
getColumnsFromEntityType: getColumnsFromEntityType,
|
|
2666
|
+
updateLinkedProperties: updateLinkedProperties,
|
|
2667
|
+
createTableVisualization: createTableVisualization,
|
|
2668
|
+
createDefaultTableVisualization: createDefaultTableVisualization,
|
|
2669
|
+
getCapabilityRestriction: getCapabilityRestriction,
|
|
2670
|
+
getSelectionMode: getSelectionMode,
|
|
2671
|
+
getRowStatusVisibility: getRowStatusVisibility,
|
|
2672
|
+
getImportance: getImportance,
|
|
2673
|
+
getP13nMode: getP13nMode,
|
|
2674
|
+
getTableAnnotationConfiguration: getTableAnnotationConfiguration,
|
|
2675
|
+
isFilteringCaseSensitive: isFilteringCaseSensitive,
|
|
2676
|
+
splitPath: splitPath,
|
|
2677
|
+
getSelectionVariantConfiguration: getSelectionVariantConfiguration,
|
|
2678
|
+
getTableManifestConfiguration: getTableManifestConfiguration,
|
|
2679
|
+
getTypeConfig: getTypeConfig
|
|
2680
|
+
};
|
|
2694
2681
|
}, false);
|
|
2695
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRhYmxlLnRzIl0sIm5hbWVzIjpbIkNvbHVtblR5cGUiLCJnZXRUYWJsZUFjdGlvbnMiLCJsaW5lSXRlbUFubm90YXRpb24iLCJ2aXN1YWxpemF0aW9uUGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJuYXZpZ2F0aW9uU2V0dGluZ3MiLCJhVGFibGVBY3Rpb25zIiwiZ2V0VGFibGVBbm5vdGF0aW9uQWN0aW9ucyIsImFBbm5vdGF0aW9uQWN0aW9ucyIsInRhYmxlQWN0aW9ucyIsImFIaWRkZW5BY3Rpb25zIiwiaGlkZGVuVGFibGVBY3Rpb25zIiwiaW5zZXJ0Q3VzdG9tRWxlbWVudHMiLCJnZXRBY3Rpb25zRnJvbU1hbmlmZXN0IiwiZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbiIsImFjdGlvbnMiLCJpc05hdmlnYWJsZSIsImVuYWJsZU9uU2VsZWN0IiwiZW5hYmxlQXV0b1Njcm9sbCIsImVuYWJsZWQiLCJkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24iLCJjb21tYW5kIiwiZ2V0VGFibGVDb2x1bW5zIiwiYW5ub3RhdGlvbkNvbHVtbnMiLCJnZXRDb2x1bW5zRnJvbUFubm90YXRpb25zIiwibWFuaWZlc3RDb2x1bW5zIiwiZ2V0Q29sdW1uc0Zyb21NYW5pZmVzdCIsImNvbHVtbnMiLCJnZXRBbm5vdGF0aW9uRW50aXR5VHlwZSIsIndpZHRoIiwiaW1wb3J0YW5jZSIsImF2YWlsYWJpbGl0eSIsInNldHRpbmdzIiwiaG9yaXpvbnRhbEFsaWduIiwiZm9ybWF0T3B0aW9ucyIsImdldEFnZ3JlZ2F0ZURlZmluaXRpb25zRnJvbUVudGl0eVR5cGUiLCJlbnRpdHlUeXBlIiwidGFibGVDb2x1bW5zIiwiYWdncmVnYXRpb25IZWxwZXIiLCJBZ2dyZWdhdGlvbkhlbHBlciIsImZpbmRDb2x1bW5Gcm9tUGF0aCIsInBhdGgiLCJmaW5kIiwiY29sdW1uIiwiYW5ub3RhdGlvbkNvbHVtbiIsInByb3BlcnR5SW5mb3MiLCJ1bmRlZmluZWQiLCJyZWxhdGl2ZVBhdGgiLCJpc0FuYWx5dGljc1N1cHBvcnRlZCIsIm1DdXJyZW5jeU9yVW5pdFByb3BlcnRpZXMiLCJTZXQiLCJmb3JFYWNoIiwib0NvbHVtbiIsIm9UYWJsZUNvbHVtbiIsInVuaXQiLCJhZGQiLCJhQ3VzdG9tQWdncmVnYXRlQW5ub3RhdGlvbnMiLCJnZXRDdXN0b21BZ2dyZWdhdGVEZWZpbml0aW9ucyIsIm1SYXdEZWZpbml0aW9ucyIsImFubm90YXRpb24iLCJvQWdncmVnYXRlZFByb3BlcnR5IiwiX2VudGl0eVR5cGUiLCJlbnRpdHlQcm9wZXJ0aWVzIiwib1Byb3BlcnR5IiwibmFtZSIsInF1YWxpZmllciIsImFDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzIiwiYW5ub3RhdGlvbnMiLCJBZ2dyZWdhdGlvbiIsIkNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMiLCJtYXAiLCJvQ3R4RGVmUHJvcGVydHkiLCJ2YWx1ZSIsIm1SZXN1bHQiLCJhUmF3Q29udGV4dERlZmluaW5nUHJvcGVydGllcyIsImhhcyIsImlzRGF0YVBvaW50RmFrZVRhcmdldFByb3BlcnR5IiwiZGVmYXVsdEFnZ3JlZ2F0ZSIsImNvbnRleHREZWZpbmluZ1Byb3BlcnR5TmFtZSIsInB1c2giLCJsZW5ndGgiLCJjb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzIiwidXBkYXRlVGFibGVWaXN1YWxpemF0aW9uRm9yQW5hbHl0aWNzIiwidGFibGVWaXN1YWxpemF0aW9uIiwicHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24iLCJjb250cm9sIiwidHlwZSIsImFnZ3JlZ2F0ZXNEZWZpbml0aW9ucyIsImVuYWJsZUFuYWx5dGljcyIsImFnZ3JlZ2F0ZXMiLCJhbGxvd2VkVHJhbnNmb3JtYXRpb25zIiwiZ2V0QWxsb3dlZFRyYW5zZm9ybWF0aW9ucyIsImVuYWJsZUFuYWx5dGljc1NlYXJjaCIsImluZGV4T2YiLCJncm91cENvbmRpdGlvbnMiLCJnZXRHcm91cENvbmRpdGlvbnMiLCJhZ2dyZWdhdGVDb25kaXRpb25zIiwiZ2V0QWdncmVnYXRlQ29uZGl0aW9ucyIsImdldE5hdmlnYXRpb25UYXJnZXRQYXRoIiwibmF2aWdhdGlvblByb3BlcnR5UGF0aCIsIm1hbmlmZXN0V3JhcHBlciIsImdldE1hbmlmZXN0V3JhcHBlciIsImdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uIiwibmF2Q29uZmlnIiwiT2JqZWN0Iiwia2V5cyIsImRhdGFNb2RlbFBhdGgiLCJnZXREYXRhTW9kZWxPYmplY3RQYXRoIiwiY29udGV4dFBhdGgiLCJnZXRDb250ZXh0UGF0aCIsIm5hdkNvbmZpZ0ZvckNvbnRleHRQYXRoIiwidGFyZ2V0RW50aXR5U2V0Iiwic3RhcnRpbmdFbnRpdHlTZXQiLCJ1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzIiwiZmluZENvbHVtbkJ5UGF0aCIsIm9Qcm9wIiwib1VuaXQiLCJnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkiLCJvVGltZXpvbmUiLCJnZXRBc3NvY2lhdGVkVGltZXpvbmVQcm9wZXJ0eSIsInNUaW1lem9uZSIsIkNvbW1vbiIsIlRpbWV6b25lIiwib1VuaXRDb2x1bW4iLCJzVW5pdCIsIk1lYXN1cmVzIiwiSVNPQ3VycmVuY3kiLCJVbml0IiwidW5pdFRleHQiLCJvVGltZXpvbmVDb2x1bW4iLCJ0aW1lem9uZSIsInRpbWV6b25lVGV4dCIsInRvU3RyaW5nIiwiZGlzcGxheU1vZGUiLCJnZXREaXNwbGF5TW9kZSIsInRleHRBbm5vdGF0aW9uIiwiVGV4dCIsImlzUGF0aEV4cHJlc3Npb24iLCJvVGV4dENvbHVtbiIsInRleHRBcnJhbmdlbWVudCIsInRleHRQcm9wZXJ0eSIsIm1vZGUiLCJnZXRTZW1hbnRpY0tleXNBbmRUaXRsZUluZm8iLCJoZWFkZXJJbmZvVGl0bGVQYXRoIiwiVUkiLCJIZWFkZXJJbmZvIiwiVGl0bGUiLCJWYWx1ZSIsInNlbWFudGljS2V5QW5ub3RhdGlvbnMiLCJTZW1hbnRpY0tleSIsInNlbWFudGljS2V5Q29sdW1ucyIsImNyZWF0ZVRhYmxlVmlzdWFsaXphdGlvbiIsImlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnQiLCJ2aWV3Q29uZmlndXJhdGlvbiIsInRhYmxlTWFuaWZlc3RDb25maWciLCJnZXRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiIsInNwbGl0UGF0aCIsIm5hdmlnYXRpb25UYXJnZXRQYXRoIiwib3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiZ2V0T3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwic2VtYW50aWNLZXlzQW5kSGVhZGVySW5mb1RpdGxlIiwib1Zpc3VhbGl6YXRpb24iLCJWaXN1YWxpemF0aW9uVHlwZSIsIlRhYmxlIiwiZ2V0VGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbiIsInJlbW92ZUR1cGxpY2F0ZUFjdGlvbnMiLCJKU09OIiwic3RyaW5naWZ5Iiwib3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllcyIsImdldE9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXMiLCJoZWFkZXJJbmZvVGl0bGUiLCJzZW1hbnRpY0tleXMiLCJjcmVhdGVEZWZhdWx0VGFibGVWaXN1YWxpemF0aW9uIiwiZ2V0Q29sdW1uc0Zyb21FbnRpdHlUeXBlIiwiZ2V0RW50aXR5VHlwZSIsImFkZFRvTWFwIiwia2V5IiwiZGF0YUZpZWxkIiwiJFR5cGUiLCJhY3Rpb25OYW1lIiwiQWN0aW9uIiwiRGV0ZXJtaW5pbmciLCJhY3Rpb25UYXJnZXQiLCJBY3Rpb25UYXJnZXQiLCJDb3JlIiwiT3BlcmF0aW9uQXZhaWxhYmxlIiwicGFyYW1ldGVycyIsImJpbmRpbmdQYXJhbWV0ZXJGdWxsTmFtZSIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsInRhcmdldEV4cHJlc3Npb24iLCJhbm5vdGF0aW9uRXhwcmVzc2lvbiIsImJpbmRpbmdDb250ZXh0UGF0aFZpc2l0b3IiLCJnZXRDdXJyZW50RW50aXR5U2V0VXBkYXRhYmxlUGF0aCIsInJlc3RyaWN0aW9ucyIsImdldFJlc3RyaWN0aW9ucyIsImVudGl0eVNldCIsImdldEVudGl0eVNldCIsInVwZGF0YWJsZSIsImlzVXBkYXRhYmxlIiwiaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eSIsImlzQ29uc3RhbnQiLCJleHByZXNzaW9uIiwibmF2aWdhdGlvbkV4cHJlc3Npb24iLCJfdHlwZSIsInVwZGF0YWJsZVByb3BlcnR5UGF0aCIsIkNhcGFiaWxpdGllcyIsIlVwZGF0ZVJlc3RyaWN0aW9ucyIsIlVwZGF0YWJsZSIsInByb3BlcnRpZXMiLCJwcm9wZXJ0eU5hbWUiLCJzaXplIiwidGl0bGVQcm9wZXJ0eSIsIkFycmF5IiwiZnJvbSIsImpvaW4iLCJnZXRVSUhpZGRlbkV4cEZvckFjdGlvbnNSZXF1aXJpbmdDb250ZXh0IiwiY3VycmVudEVudGl0eVR5cGUiLCJjb250ZXh0RGF0YU1vZGVsT2JqZWN0UGF0aCIsImlzRW50aXR5U2V0IiwiYVVpSGlkZGVuUGF0aEV4cHJlc3Npb25zIiwiaXNCb3VuZCIsInNvdXJjZUVudGl0eVR5cGUiLCJSZXF1aXJlc0NvbnRleHQiLCJJbmxpbmUiLCJ2YWx1ZU9mIiwiSGlkZGVuIiwiZXF1YWwiLCJnZXRCaW5kaW5nRXhwRnJvbUNvbnRleHQiLCJzb3VyY2UiLCJzRXhwcmVzc2lvbiIsInZpc2libGUiLCJzUGF0aCIsInN1YnN0cmluZyIsImFTcGxpdFBhdGgiLCJzcGxpdCIsInNOYXZpZ2F0aW9uUGF0aCIsInRhcmdldE9iamVjdCIsInBhcnRuZXIiLCJiaW5kaW5nRXhwcmVzc2lvbiIsInNsaWNlIiwiY29uc3RhbnQiLCJoYXNCb3VuZEFjdGlvbnNBbHdheXNWaXNpYmxlSW5Ub29sQmFyIiwic29tZSIsImhhc0N1c3RvbUFjdGlvbnNBbHdheXNWaXNpYmxlSW5Ub29sQmFyIiwibWFuaWZlc3RBY3Rpb25zIiwiYWN0aW9uS2V5IiwiYWN0aW9uIiwicmVxdWlyZXNTZWxlY3Rpb24iLCJnZXRWaXNpYmxlRXhwRm9yQ3VzdG9tQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQiLCJhVmlzaWJsZVBhdGhFeHByZXNzaW9ucyIsInJlc29sdmVCaW5kaW5nU3RyaW5nIiwiZ2V0Q2FwYWJpbGl0eVJlc3RyaWN0aW9uIiwiaXNEZWxldGFibGUiLCJpc1BhdGhEZWxldGFibGUiLCJpc1BhdGhVcGRhdGFibGUiLCJnZXRTZWxlY3Rpb25Nb2RlIiwidGFyZ2V0Q2FwYWJpbGl0aWVzIiwiZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24iLCJtYXNzRWRpdFZpc2liaWxpdHlFeHByZXNzaW9uIiwiU2VsZWN0aW9uTW9kZSIsIk5vbmUiLCJ0YWJsZU1hbmlmZXN0U2V0dGluZ3MiLCJzZWxlY3Rpb25Nb2RlIiwidGFibGVTZXR0aW5ncyIsImFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMiLCJhVmlzaWJsZUJpbmRpbmdFeHByZXNzaW9ucyIsImlzUGFyZW50RGVsZXRhYmxlIiwicGFyZW50RW50aXR5U2V0RGVsZXRhYmxlIiwiZ2V0VGVtcGxhdGVUeXBlIiwiVGVtcGxhdGVUeXBlIiwiT2JqZWN0UGFnZSIsImNvbXBpbGVCaW5kaW5nIiwiYk1hc3NFZGl0RW5hYmxlZCIsImlmRWxzZSIsImFuZCIsIklzRWRpdGFibGUiLCJNdWx0aSIsIkF1dG8iLCJTaW5nbGUiLCJidXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiIsIm9yIiwiZWRpdE1vZGVidXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiIsImNvbmNhdCIsInRhYmxlQWN0aW9uIiwiaXNEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdCIsIktleUhlbHBlciIsImdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZCIsIkFjdGlvblR5cGUiLCJEYXRhRmllbGRGb3JBY3Rpb24iLCJhbm5vdGF0aW9uUGF0aCIsImdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgiLCJub3QiLCJnZXRSZWxhdGl2ZU1vZGVsUGF0aEZ1bmN0aW9uIiwiRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiRGVmYXVsdCIsImdldEhpZ2hsaWdodFJvd0JpbmRpbmciLCJjcml0aWNhbGl0eUFubm90YXRpb24iLCJpc0RyYWZ0Um9vdCIsInRhcmdldEVudGl0eVR5cGUiLCJkZWZhdWx0SGlnaGxpZ2h0Um93RGVmaW5pdGlvbiIsIk1lc3NhZ2VUeXBlIiwiZ2V0TWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHlUeXBlIiwiYU1pc3NpbmdLZXlzIiwiZm9ybWF0UmVzdWx0IiwiRW50aXR5IiwiSGFzQWN0aXZlIiwiSXNBY3RpdmUiLCJ0YWJsZUZvcm1hdHRlcnMiLCJyb3dIaWdobGlnaHRpbmciLCJfZ2V0Q3JlYXRpb25CZWhhdmlvdXIiLCJ0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiIsIm5hdmlnYXRpb24iLCJjcmVhdGUiLCJkZXRhaWwiLCJvcmlnaW5hbFRhYmxlU2V0dGluZ3MiLCJvdXRib3VuZCIsIm91dGJvdW5kRGV0YWlsIiwibmV3QWN0aW9uIiwidGFyZ2V0QW5ub3RhdGlvbnMiLCJEcmFmdFJvb3QiLCJOZXdBY3Rpb24iLCJTZXNzaW9uIiwiU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsImNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uUm93IiwiRXJyb3IiLCJyb3V0ZSIsImFwcGVuZCIsImNyZWF0ZUF0RW5kIiwibmF2aWdhdGVUb1RhcmdldCIsIk5ld1BhZ2UiLCJfZ2V0Um93Q29uZmlndXJhdGlvblByb3BlcnR5IiwidGFyZ2V0UGF0aCIsInByZXNzUHJvcGVydHkiLCJuYXZpZ2F0aW9uVGFyZ2V0IiwiY3JpdGljYWxpdHlQcm9wZXJ0eSIsImRpc3BsYXkiLCJ0YXJnZXQiLCJDcml0aWNhbGl0eSIsIkRyYWZ0Tm9kZSIsInJvd05hdmlnYXRlZEV4cHJlc3Npb24iLCJuYXZpZ2F0ZWRSb3ciLCJwcmVzcyIsInJvd05hdmlnYXRlZCIsIklzSW5hY3RpdmUiLCJjb2x1bW5zVG9CZUNyZWF0ZWQiLCJub25Tb3J0YWJsZUNvbHVtbnMiLCJ0YWJsZVR5cGUiLCJwcm9wZXJ0eSIsImV4aXN0cyIsInRhcmdldFR5cGUiLCJyZWxhdGVkUHJvcGVydGllc0luZm8iLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMiLCJyZWxhdGVkUHJvcGVydHlOYW1lcyIsImFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJjb2x1bW5JbmZvIiwiZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eSIsImdldEFubm90YXRpb25zQnlUZXJtIiwib0NvbHVtbkRyYWZ0SW5kaWNhdG9yIiwiZ2V0RGVmYXVsdERyYWZ0SW5kaWNhdG9yRm9yQ29sdW1uIiwiZXhwb3J0U2V0dGluZ3MiLCJ0ZW1wbGF0ZSIsImV4cG9ydFNldHRpbmdzVGVtcGxhdGUiLCJ3cmFwIiwiZXhwb3J0U2V0dGluZ3NXcmFwcGluZyIsIl9nZXRFeHBvcnREYXRhVHlwZSIsImV4cG9ydFVuaXROYW1lIiwidW5pdFByb3BlcnR5IiwiZXhwb3J0VW5pdFN0cmluZyIsImV4cG9ydFRpbWV6b25lTmFtZSIsInRpbWV6b25lUHJvcGVydHkiLCJleHBvcnRUaW1lem9uZVN0cmluZyIsImFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zIiwiZnVsbFByb3BlcnR5UGF0aCIsInVzZURhdGFGaWVsZFByZWZpeCIsImF2YWlsYWJsZUZvckFkYXB0YXRpb24iLCJyZXBsYWNlU3BlY2lhbENoYXJzIiwic2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCIsImdldFNlbWFudGljT2JqZWN0UGF0aCIsImlzSGlkZGVuIiwiZ3JvdXBQYXRoIiwiX3NsaWNlQXRTbGFzaCIsImlzR3JvdXAiLCJpc0RhdGFQb2ludEZha2VQcm9wZXJ0eSIsImV4cG9ydFR5cGUiLCJzRGF0ZUlucHV0Rm9ybWF0IiwiZGF0YVR5cGUiLCJnZXREYXRhRmllbGREYXRhVHlwZSIsInByb3BlcnR5VHlwZUNvbmZpZyIsImdldFR5cGVDb25maWciLCJzb3J0YWJsZSIsIm9UeXBlQ29uZmlnIiwiY2xhc3NOYW1lIiwib0Zvcm1hdE9wdGlvbnMiLCJvQ29uc3RyYWludHMiLCJjb25zdHJhaW50cyIsImdldFRhcmdldFZhbHVlT25EYXRhUG9pbnQiLCJpbnB1dEZvcm1hdCIsInNjYWxlIiwiZGVsaW1pdGVyIiwib1VuaXRQcm9wZXJ0eSIsIm9UaW1lem9uZVByb3BlcnR5Iiwic1VuaXRUZXh0Iiwic1RpbWV6b25lVGV4dCIsIkFubm90YXRpb24iLCJsYWJlbCIsIl9nZXRMYWJlbCIsImdyb3VwTGFiZWwiLCJncm91cCIsInNlbWFudGljT2JqZWN0UGF0aCIsIkF2YWlsYWJpbGl0eVR5cGUiLCJBZGFwdGF0aW9uIiwiRGF0YUZpZWxkRGVmYXVsdCIsIlRhcmdldCIsIiR0YXJnZXQiLCJpc0dyb3VwYWJsZSIsImlzUHJvcGVydHlHcm91cGFibGUiLCJpc0tleSIsImNhc2VTZW5zaXRpdmUiLCJpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUiLCJ0eXBlQ29uZmlnIiwidmlzdWFsU2V0dGluZ3MiLCJ3aWR0aENhbGN1bGF0aW9uIiwiZ2V0SW1wb3J0YW5jZSIsInNUb29sdGlwIiwiX2dldFRvb2x0aXAiLCJ0b29sdGlwIiwiX2lzVmFsaWRDb2x1bW4iLCJfZ2V0VmlzaWJsZUV4cHJlc3Npb24iLCJkYXRhRmllbGRNb2RlbFBhdGgiLCJyZXR1cm5FeHByZXNzaW9uIiwicHJvcGVydHlWYWx1ZSIsImlzQW5hbHl0aWNhbEdyb3VwSGVhZGVyRXhwYW5kZWQiLCJpc0FuYWx5dGljcyIsIklzRXhwYW5kZWQiLCJpc0FuYWx5dGljYWxMZWFmIiwiTm9kZUxldmVsIiwiX2dldEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyIsImRhdGFGaWVsZEdyb3VwIiwiZmllbGRGb3JtYXRPcHRpb25zIiwiYUZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyIsIkRhdGEiLCJpbm5lckRhdGFGaWVsZCIsImlzUHJvcGVydHkiLCJkYXRhRmllbGREZWZhdWx0IiwiTGFiZWwiLCJpc0RhdGFGaWVsZFR5cGVzIiwiUXVpY2tJbmZvIiwiZGF0YXBvaW50VGFyZ2V0IiwiZ2V0Um93U3RhdHVzVmlzaWJpbGl0eSIsImdldEVycm9yU3RhdHVzVGV4dFZpc2liaWxpdHlGb3JtYXR0ZXIiLCJfY3JlYXRlUmVsYXRlZENvbHVtbnMiLCJleGlzdGluZ0NvbHVtbnMiLCJyZWxhdGVkQ29sdW1ucyIsInJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXAiLCJnZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoIiwicmVsYXRlZENvbHVtbiIsIm5ld05hbWUiLCJwcm9wZXJ0eUluZm8iLCJfZ2V0QW5ub3RhdGlvbkNvbHVtbk5hbWUiLCJfZ2V0U2hvd0RhdGFGaWVsZHNMYWJlbCIsImZpZWxkR3JvdXBOYW1lIiwib0NvbHVtbnMiLCJhQ29sdW1uS2V5cyIsInNob3dEYXRhRmllbGRzTGFiZWwiLCJfZ2V0UmVsYXRpdmVQYXRoIiwiaXNMYXN0U2xhc2giLCJpc0xhc3RQYXJ0IiwiaVNsYXNoSW5kZXgiLCJsYXN0SW5kZXhPZiIsIl9pc0NvbHVtblNvcnRhYmxlIiwicHJvcGVydHlQYXRoIiwiaXNTb3J0YWJsZSIsImZpbHRlckZ1bmN0aW9ucyIsIkZpbHRlckZ1bmN0aW9ucyIsImdldEVudGl0eUNvbnRhaW5lciIsImlzQXJyYXkiLCJnZXREZWZhdWx0Rm9ybWF0T3B0aW9uc0ZvclRhYmxlIiwidGV4dExpbmVzRWRpdCIsIl9maW5kU2VtYW50aWNLZXlWYWx1ZXMiLCJhU2VtYW50aWNLZXlWYWx1ZXMiLCJiU2VtYW50aWNLZXlGb3VuZCIsImkiLCJ2YWx1ZXMiLCJzZW1hbnRpY0tleUZvdW5kIiwiX2ZpbmRQcm9wZXJ0aWVzIiwic2VtYW50aWNLZXlWYWx1ZXMiLCJmaWVsZEdyb3VwUHJvcGVydGllcyIsInNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXAiLCJzUHJvcGVydHlQYXRoIiwidG1wIiwiZmllbGRHcm91cFByb3BlcnR5UGF0aCIsIl9maW5kU2VtYW50aWNLZXlWYWx1ZXNJbkZpZWxkR3JvdXAiLCJhUHJvcGVydGllcyIsIl9wcm9wZXJ0aWVzRm91bmQiLCJpc0ZpZWxkR3JvdXBDb2x1bW4iLCJzZW1hbnRpY0tleSIsInNlbWFudGljS2V5SW5GaWVsZEdyb3VwIiwiaGFzRHJhZnRJbmRpY2F0b3IiLCJzZW1hbnRpY2tleXMiLCJvYmplY3RTdGF0dXNUZXh0VmlzaWJpbGl0eSIsIkZpZWxkR3JvdXBEcmFmdEluZGljYXRvclByb3BlcnR5UGF0aCIsIkZpZWxkR3JvdXBOYW1lIiwiX2dldEltcE51bWJlciIsIkltcG9ydGFuY2UiLCJpbmNsdWRlcyIsIl9nZXREYXRhRmllbGRJbXBvcnRhbmNlIiwiX2dldE1heEltcG9ydGFuY2UiLCJmaWVsZHMiLCJtYXhJbXBOdW1iZXIiLCJpbXBOdW1iZXIiLCJEYXRhRmllbGRXaXRoTWF4SW1wb3J0YW5jZSIsImZpZWxkIiwiZmllbGRzV2l0aEltcG9ydGFuY2UiLCJtYXBTZW1hbnRpY0tleXMiLCJmaWVsZEdyb3VwRGF0YSIsImZpZWxkR3JvdXBIYXNTZW1hbnRpY0tleSIsImZpZWxkR3JvdXBEYXRhRmllbGQiLCJIaWdoIiwiZmlsdGVyIiwiaXRlbSIsImdldE5vblNvcnRhYmxlUHJvcGVydGllc1Jlc3RyaWN0aW9ucyIsImxpbmVJdGVtIiwiY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHkiLCJzTGFiZWwiLCJmaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMiLCJ2aXN1YWxTZXR0aW5nc1RvQmVFeGNsdWRlZCIsImV4Y2x1ZGVQcm9wZXJ0aWVzIiwiRmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zIiwiaXNEYXRhRmllbGRBbHdheXNIaWRkZW4iLCJIVE1MNSIsIkNzc0RlZmF1bHRzIiwiZXhwb3J0Q29udGFjdFByb3BlcnR5IiwiZXhwb3J0U2V0dGluZ3NDb250YWN0UHJvcGVydHkiLCJfZ2V0UHJvcGVydHlOYW1lcyIsIm1hdGNoZWRQcm9wZXJ0aWVzIiwicmVzb2x2ZVBhdGgiLCJfYXBwZW5kQ3VzdG9tVGVtcGxhdGUiLCJfZ2V0TWFuaWZlc3RPckRlZmF1bHRWYWx1ZSIsImRlZmF1bHRWYWx1ZSIsImlzQW5ub3RhdGlvbkNvbHVtbiIsImludGVybmFsQ29sdW1ucyIsIm1hbmlmZXN0Q29sdW1uIiwidmFsaWRhdGVLZXkiLCJNZXNzYWdlIiwiZ2V0RGlhZ25vc3RpY3MiLCJhZGRJc3N1ZSIsIklzc3VlQ2F0ZWdvcnkiLCJNYW5pZmVzdCIsIklzc3VlU2V2ZXJpdHkiLCJMb3ciLCJJc3N1ZUNhdGVnb3J5VHlwZSIsIkFubm90YXRpb25Db2x1bW5zIiwiSW52YWxpZEtleSIsImlkIiwiaGVhZGVyIiwiSG9yaXpvbnRhbEFsaWduIiwiQmVnaW4iLCJTbG90IiwicG9zaXRpb24iLCJhbmNob3IiLCJwbGFjZW1lbnQiLCJQbGFjZW1lbnQiLCJBZnRlciIsImlzQWN0aW9uTmF2aWdhYmxlIiwiZ2V0UDEzbk1vZGUiLCJ2YXJpYW50TWFuYWdlbWVudCIsImdldFZhcmlhbnRNYW5hZ2VtZW50IiwiYVBlcnNvbmFsaXphdGlvbiIsImlzQW5hbHl0aWNhbFRhYmxlIiwiaXNSZXNwb25zaXZlVGFibGUiLCJwZXJzb25hbGl6YXRpb24iLCJzb3J0IiwiYWdncmVnYXRlIiwiTGlzdFJlcG9ydCIsIlZhcmlhbnRNYW5hZ2VtZW50VHlwZSIsIkNvbnRyb2wiLCJfaXNGaWx0ZXJCYXJIaWRkZW4iLCJpc0ZpbHRlckJhckhpZGRlbiIsImhhc011bHRpcGxlVmlzdWFsaXphdGlvbnMiLCJBbmFseXRpY2FsTGlzdFBhZ2UiLCJnZXRTb3J0Q29uZGl0aW9ucyIsIm5vblNvcnRhYmxlUHJvcGVydGllcyIsInNvcnRDb25kaXRpb25zIiwiU29ydE9yZGVyIiwic29ydGVycyIsImNvbmRpdGlvbnMiLCJjb25kaXRpb24iLCJjb25kaXRpb25Qcm9wZXJ0eSIsIlByb3BlcnR5IiwiaW5mb05hbWUiLCJjb252ZXJ0UHJvcGVydHlQYXRoc1RvSW5mb05hbWVzIiwiZGVzY2VuZGluZyIsIkRlc2NlbmRpbmciLCJwYXRocyIsImluZm9OYW1lcyIsImN1cnJlbnRQYXRoIiwiR3JvdXBCeSIsImFHcm91cEJ5IiwiYUdyb3VwTGV2ZWxzIiwiZ3JvdXBMZXZlbHMiLCJUb3RhbCIsImFUb3RhbHMiLCJ0aXRsZSIsIlR5cGVOYW1lUGx1cmFsIiwicGFnZU1hbmlmZXN0U2V0dGluZ3MiLCJoYXNBYnNvbHV0ZVBhdGgiLCJwMTNuTW9kZSIsIlRhYmxlSUQiLCJjcmVhdGlvbkJlaGF2aW91ciIsInN0YW5kYXJkQWN0aW9uc0NvbnRleHQiLCJnZW5lcmF0ZVN0YW5kYXJkQWN0aW9uc0NvbnRleHQiLCJnZXREZWxldGVWaXNpYmlsaXR5IiwiY3JlYXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24iLCJnZXRDcmVhdGVWaXNpYmlsaXR5IiwibWFzc0VkaXRCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiIsImdldE1hc3NFZGl0VmlzaWJpbGl0eSIsImlzSW5zZXJ0VXBkYXRlVGVtcGxhdGVkIiwiZ2V0SW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRpbmciLCJpc0RyYWZ0T3JTdGlja3lTdXBwb3J0ZWQiLCJ0aHJlc2hvbGQiLCJNYXhJdGVtcyIsImlzU2VhcmNoYWJsZSIsImlzUGF0aFNlYXJjaGFibGUiLCJzdGFuZGFyZEFjdGlvbnMiLCJnZXRTdGFuZGFyZEFjdGlvbkNyZWF0ZSIsImdldFN0YW5kYXJkQWN0aW9uRGVsZXRlIiwicGFzdGUiLCJnZXRTdGFuZGFyZEFjdGlvblBhc3RlIiwibWFzc0VkaXQiLCJnZXRTdGFuZGFyZEFjdGlvbk1hc3NFZGl0IiwiY3JlYXRpb25Sb3ciLCJnZXRDcmVhdGlvblJvdyIsImVudGl0eU5hbWUiLCJjb2xsZWN0aW9uIiwiZ2V0VGFyZ2V0T2JqZWN0UGF0aCIsIm5hdmlnYXRpb25QYXRoIiwicm93IiwiaXNJbkRpc3BsYXlNb2RlIiwiYXV0b0JpbmRPbkluaXQiLCJzZWFyY2hhYmxlIiwiaXNDb21wbGV4UHJvcGVydHkiLCJleHBvcnREYXRhVHlwZSIsInN1YnN0ciIsImdldFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uIiwic2VsZWN0aW9uVmFyaWFudFBhdGgiLCJyZXNvbHZlZFRhcmdldCIsImdldEVudGl0eVR5cGVBbm5vdGF0aW9uIiwic2VsZWN0aW9uIiwicHJvcGVydHlOYW1lcyIsIlNlbGVjdE9wdGlvbnMiLCJzZWxlY3RPcHRpb24iLCJQcm9wZXJ0eU5hbWUiLCJQcm9wZXJ0eVBhdGgiLCJ0ZXh0IiwiX2dldEZ1bGxTY3JlZW5CYXNlZE9uRGV2aWNlIiwiaXNJcGhvbmUiLCJlbmFibGVGdWxsU2NyZWVuIiwiSXNzdWVUeXBlIiwiRlVMTFNDUkVFTk1PREVfTk9UX09OX0xJU1RSRVBPUlQiLCJfZ2V0TXVsdGlTZWxlY3RNb2RlIiwibXVsdGlTZWxlY3RNb2RlIiwic2VsZWN0QWxsIiwidXNlSWNvblRhYkJhciIsIl9nZXRUYWJsZVR5cGUiLCJpc0Rlc2t0b3AiLCJfZ2V0RmlsdGVycyIsInF1aWNrRmlsdGVyUGF0aHMiLCJxdWlja1NlbGVjdGlvblZhcmlhbnQiLCJxdWlja0ZpbHRlcnMiLCJzaG93Q291bnRzIiwicXVpY2tWYXJpYW50U2VsZWN0aW9uIiwiX2dldEVuYWJsZUV4cG9ydCIsImVuYWJsZVBhc3RlIiwiZW5hYmxlRXhwb3J0IiwiX2dldEZpbHRlckNvbmZpZ3VyYXRpb24iLCJmaWx0ZXJzIiwiaGlkZVRhYmxlVGl0bGUiLCJoZWFkZXJWaXNpYmxlIiwiY2hlY2tDb25kZW5zZWRMYXlvdXQiLCJlbmFibGVBdXRvQ29sdW1uV2lkdGgiLCJpc1Bob25lIiwiZGF0YVN0YXRlSW5kaWNhdG9yRmlsdGVyIiwiaXNDb25kZW5zZWRMYXlvdXRDb21wbGlhbnQiLCJvRmlsdGVyQ29uZmlndXJhdGlvbiIsImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiIsImNvbmRlbnNlZFRhYmxlTGF5b3V0Iiwib0NvbmZpZ3VyYXRpb24iLCJkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIiwiZW5hYmxlTWFzc0VkaXQiLCJzZWxlY3Rpb25MaW1pdCIsImlubGluZUNyZWF0aW9uUm93Q291bnQiLCJzaG93Um93Q291bnQiLCJnZXRWaWV3Q29uZmlndXJhdGlvbiIsInVzZUNvbmRlbnNlZFRhYmxlTGF5b3V0Iiwib1RhcmdldE1hcHBpbmciLCJFRE1fVFlQRV9NQVBQSU5HIiwidW5kZXJseWluZ1R5cGUiLCIkU2NhbGUiLCJwcmVjaXNpb24iLCIkUHJlY2lzaW9uIiwibWF4TGVuZ3RoIiwiJE1heExlbmd0aCIsIm51bGxhYmxlIiwiJE51bGxhYmxlIiwibWluaW11bSIsImlzTmFOIiwiVmFsaWRhdGlvbiIsIk1pbmltdW0iLCJtYXhpbXVtIiwiTWF4aW11bSIsImlzRGlnaXRTZXF1ZW5jZSIsIklzRGlnaXRTZXF1ZW5jZSIsInBhcnNlQXNTdHJpbmciLCJlbXB0eVN0cmluZyIsInBhcnNlS2VlcHNFbXB0eVN0cmluZyJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQTZOS0EsVTs7YUFBQUEsVTtBQUFBQSxJQUFBQSxVO0FBQUFBLElBQUFBLFU7QUFBQUEsSUFBQUEsVTtLQUFBQSxVLEtBQUFBLFU7O0FBa0hMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFdBQVNDLGVBQVQsQ0FDTkMsa0JBRE0sRUFFTkMsaUJBRk0sRUFHTkMsZ0JBSE0sRUFJTkMsa0JBSk0sRUFLUztBQUNmLFFBQU1DLGFBQWEsR0FBR0MseUJBQXlCLENBQUNMLGtCQUFELEVBQXFCQyxpQkFBckIsRUFBd0NDLGdCQUF4QyxDQUEvQztBQUNBLFFBQU1JLGtCQUFrQixHQUFHRixhQUFhLENBQUNHLFlBQXpDO0FBQ0EsUUFBTUMsY0FBYyxHQUFHSixhQUFhLENBQUNLLGtCQUFyQztBQUNBLFdBQU9DLG9CQUFvQixDQUMxQkosa0JBRDBCLEVBRTFCSyxzQkFBc0IsQ0FDckJULGdCQUFnQixDQUFDVSwrQkFBakIsQ0FBaURYLGlCQUFqRCxFQUFvRVksT0FEL0MsRUFFckJYLGdCQUZxQixFQUdyQkksa0JBSHFCLEVBSXJCSCxrQkFKcUIsRUFLckIsSUFMcUIsRUFNckJLLGNBTnFCLENBRkksRUFVMUI7QUFDQ00sTUFBQUEsV0FBVyxFQUFFLFdBRGQ7QUFFQ0MsTUFBQUEsY0FBYyxFQUFF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LFNBQUQsQ0FBd0JJLFdBRnhCLGtFQUVBLGNBQXFDdUQsTUFGckMsaURBRUEscUJBQTZDaWxCLGVBRjdDLEdBR0csSUFISCxHQUlHN3BCO0FBcEI0QixPQUFqQztBQXNCQTs7QUFDRHlWLElBQUFBLGtCQUFrQixDQUFDclcsYUFBbkIsR0FBbUM7QUFDbEMwcUIsTUFBQUEsYUFBYSxFQUNaLENBQUFyVSxrQkFBa0IsU0FBbEIsSUFBQUEsa0JBQWtCLFdBQWxCLHFDQUFBQSxrQkFBa0IsQ0FBRWpULElBQXBCLGdGQUEwQk8sT0FBMUIsQ0FBa0MsNkJBQWxDLE9BQXFFLENBQXJFLElBQ0EsQ0FBQTBTLGtCQUFrQixTQUFsQixJQUFBQSxrQkFBa0IsV0FBbEIsc0NBQUFBLGtCQUFrQixDQUFFalQsSUFBcEIsa0ZBQTBCTyxPQUExQixDQUFrQyxnQ0FBbEMsT0FBd0UsQ0FEeEUsR0FFRyxLQUZILEdBR0cvQyxTQUw4QjtBQU1sQytwQixNQUFBQSxXQUFXLEVBQ1YsQ0FBQXRVLGtCQUFrQixTQUFsQixJQUFBQSxrQkFBa0IsV0FBbEIsc0NBQUFBLGtCQUFrQixDQUFFalQsSUFBcEIsa0ZBQTBCTyxPQUExQixDQUFrQyw2QkFBbEMsT0FBcUUsQ0FBckUsSUFDQSxDQUFBMFMsa0JBQWtCLFNBQWxCLElBQUFBLGtCQUFrQixXQUFsQixzQ0FBQUEsa0JBQWtCLENBQUVqVCxJQUFwQixrRkFBMEJPLE9BQTFCLENBQWtDLGdDQUFsQyxPQUF3RSxDQUR4RSxHQUVHLEVBRkgsR0FHRy9DLFNBVjhCO0FBV2xDZ3FCLE1BQUFBLHFCQUFxQixFQUFFdlUsa0JBQWtCLENBQUNqVCxJQUFuQixLQUE0QixnQ0FBNUIsR0FBK0QsSUFBL0QsR0FBc0V4QztBQVgzRCxLQUFuQztBQWFBLFdBQU95VixrQkFBUDtBQUNBIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHlUeXBlLCBQcm9wZXJ0eSwgVHlwZURlZmluaXRpb24gfSBmcm9tIFwiQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlclwiO1xuaW1wb3J0IHtcblx0Q3JpdGljYWxpdHlUeXBlLFxuXHREYXRhRmllbGQsXG5cdERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdERhdGFGaWVsZEZvckFjdGlvbixcblx0RGF0YUZpZWxkRm9yQW5ub3RhdGlvbixcblx0RGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uLFxuXHREYXRhRmllbGRUeXBlcyxcblx0RGF0YVBvaW50LFxuXHREYXRhUG9pbnRUeXBlVHlwZXMsXG5cdEVudW1WYWx1ZSxcblx0RmllbGRHcm91cFR5cGUsXG5cdExpbmVJdGVtLFxuXHRQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdFByZXNlbnRhdGlvblZhcmlhbnRUeXBlVHlwZXMsXG5cdFByb3BlcnR5UGF0aCxcblx0U2VsZWN0aW9uVmFyaWFudFR5cGUsXG5cdFNlbGVjdE9wdGlvblR5cGUsXG5cdFVJQW5ub3RhdGlvblR5cGVzXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHsgRmlsdGVyRnVuY3Rpb25zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvZ2VuZXJhdGVkL0NhcGFiaWxpdGllc1wiO1xuaW1wb3J0IHsgQ29tbW9uQW5ub3RhdGlvblRlcm1zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvZ2VuZXJhdGVkL0NvbW1vblwiO1xuaW1wb3J0IHsgU2VtYW50aWNLZXkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdHlwZXMvZ2VuZXJhdGVkL0NvbW1vblwiO1xuaW1wb3J0IHtcblx0Y29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseSxcblx0Q29tcGxleFByb3BlcnR5SW5mbyxcblx0Z2V0RGF0YUZpZWxkRGF0YVR5cGUsXG5cdGdldFNlbWFudGljT2JqZWN0UGF0aCxcblx0aXNEYXRhRmllbGRBbHdheXNIaWRkZW4sXG5cdGlzRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3QsXG5cdGlzRGF0YUZpZWxkVHlwZXNcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvYW5ub3RhdGlvbnMvRGF0YUZpZWxkXCI7XG5pbXBvcnQge1xuXHRBbm5vdGF0aW9uQWN0aW9uLFxuXHRCYXNlQWN0aW9uLFxuXHRDdXN0b21BY3Rpb24sXG5cdGdldEFjdGlvbnNGcm9tTWFuaWZlc3QsXG5cdGlzQWN0aW9uTmF2aWdhYmxlLFxuXHRyZW1vdmVEdXBsaWNhdGVBY3Rpb25zXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9BY3Rpb25cIjtcbmltcG9ydCB7IGJpbmRpbmdDb250ZXh0UGF0aFZpc2l0b3IsIEVudGl0eSwgVUkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0JpbmRpbmdIZWxwZXJcIjtcbmltcG9ydCB7IENvbmZpZ3VyYWJsZU9iamVjdCwgQ3VzdG9tRWxlbWVudCwgaW5zZXJ0Q3VzdG9tRWxlbWVudHMsIFBsYWNlbWVudCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgeyBJc3N1ZUNhdGVnb3J5LCBJc3N1ZUNhdGVnb3J5VHlwZSwgSXNzdWVTZXZlcml0eSwgSXNzdWVUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Jc3N1ZU1hbmFnZXJcIjtcbmltcG9ydCB7IEtleUhlbHBlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvS2V5XCI7XG5pbXBvcnQgdGFibGVGb3JtYXR0ZXJzIGZyb20gXCJzYXAvZmUvY29yZS9mb3JtYXR0ZXJzL1RhYmxlRm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBNZXNzYWdlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9mb3JtYXR0ZXJzL1RhYmxlRm9ybWF0dGVyVHlwZXNcIjtcbmltcG9ydCB7XG5cdGFuZCxcblx0YW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdEJpbmRpbmdFeHByZXNzaW9uLFxuXHRiaW5kaW5nRXhwcmVzc2lvbixcblx0QmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uLFxuXHRjb21waWxlQmluZGluZyxcblx0Y29uc3RhbnQsXG5cdGVxdWFsLFxuXHRFeHByZXNzaW9uLFxuXHRFeHByZXNzaW9uT3JQcmltaXRpdmUsXG5cdGZvcm1hdFJlc3VsdCxcblx0aWZFbHNlLFxuXHRpc0NvbnN0YW50LFxuXHRub3QsXG5cdG9yLFxuXHRyZXNvbHZlQmluZGluZ1N0cmluZ1xufSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgcmVwbGFjZVNwZWNpYWxDaGFycyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1N0YWJsZUlkSGVscGVyXCI7XG5pbXBvcnQge1xuXHREYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRnZXRUYXJnZXRPYmplY3RQYXRoLFxuXHRpc1BhdGhEZWxldGFibGUsXG5cdGlzUGF0aFNlYXJjaGFibGUsXG5cdGlzUGF0aFVwZGF0YWJsZVxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBEaXNwbGF5TW9kZSwgRURNX1RZUEVfTUFQUElORywgZ2V0RGlzcGxheU1vZGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EaXNwbGF5TW9kZUZvcm1hdHRlclwiO1xuaW1wb3J0IHsgZ2V0Tm9uU29ydGFibGVQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRW50aXR5U2V0SGVscGVyXCI7XG5pbXBvcnQge1xuXHRnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHksXG5cdGdldFRhcmdldFZhbHVlT25EYXRhUG9pbnQsXG5cdGlzUGF0aEV4cHJlc3Npb24sXG5cdGlzUHJvcGVydHlcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvUHJvcGVydHlIZWxwZXJcIjtcbmltcG9ydCBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCIuLi8uLi9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgeyBBZ2dyZWdhdGlvbkhlbHBlciB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL0FnZ3JlZ2F0aW9uXCI7XG5pbXBvcnQgeyBUYWJsZUlEIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvSURcIjtcbmltcG9ydCB7XG5cdEFjdGlvblR5cGUsXG5cdEF2YWlsYWJpbGl0eVR5cGUsXG5cdENyZWF0aW9uTW9kZSxcblx0Rm9ybWF0T3B0aW9uc1R5cGUsXG5cdEhvcml6b250YWxBbGlnbixcblx0SW1wb3J0YW5jZSxcblx0TWFuaWZlc3RUYWJsZUNvbHVtbixcblx0TmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0TmF2aWdhdGlvblRhcmdldENvbmZpZ3VyYXRpb24sXG5cdFNlbGVjdGlvbk1vZGUsXG5cdFRhYmxlQ29sdW1uU2V0dGluZ3MsXG5cdFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLFxuXHRUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHRUZW1wbGF0ZVR5cGUsXG5cdFZhcmlhbnRNYW5hZ2VtZW50VHlwZSxcblx0Vmlld1BhdGhDb25maWd1cmF0aW9uLFxuXHRWaXN1YWxpemF0aW9uVHlwZVxufSBmcm9tIFwiLi4vLi4vTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IE1hbmlmZXN0V3JhcHBlciBmcm9tIFwiLi4vLi4vTWFuaWZlc3RXcmFwcGVyXCI7XG5pbXBvcnQgeyBnZXRNZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eVR5cGUgfSBmcm9tIFwiLi9Dcml0aWNhbGl0eVwiO1xuaW1wb3J0IHtcblx0Z2VuZXJhdGVTdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRnZXRDcmVhdGVWaXNpYmlsaXR5LFxuXHRnZXRDcmVhdGlvblJvdyxcblx0Z2V0RGVsZXRlVmlzaWJpbGl0eSxcblx0Z2V0SW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRpbmcsXG5cdGdldE1hc3NFZGl0VmlzaWJpbGl0eSxcblx0Z2V0UmVzdHJpY3Rpb25zLFxuXHRnZXRTdGFuZGFyZEFjdGlvbkNyZWF0ZSxcblx0Z2V0U3RhbmRhcmRBY3Rpb25EZWxldGUsXG5cdGdldFN0YW5kYXJkQWN0aW9uTWFzc0VkaXQsXG5cdGdldFN0YW5kYXJkQWN0aW9uUGFzdGUsXG5cdGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZCxcblx0aXNJbkRpc3BsYXlNb2RlLFxuXHRTdGFuZGFyZEFjdGlvbkNvbmZpZ1R5cGVcbn0gZnJvbSBcIi4vdGFibGUvU3RhbmRhcmRBY3Rpb25zXCI7XG5cbmV4cG9ydCB0eXBlIFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24gPSB7XG5cdGF1dG9CaW5kT25Jbml0OiBib29sZWFuO1xuXHRjb2xsZWN0aW9uOiBzdHJpbmc7XG5cdHZhcmlhbnRNYW5hZ2VtZW50OiBWYXJpYW50TWFuYWdlbWVudFR5cGU7XG5cdGZpbHRlcklkPzogc3RyaW5nO1xuXHRpZDogc3RyaW5nO1xuXHRuYXZpZ2F0aW9uUGF0aDogc3RyaW5nO1xuXHRwMTNuTW9kZT86IHN0cmluZztcblx0cm93Pzoge1xuXHRcdGFjdGlvbj86IHN0cmluZztcblx0XHRwcmVzcz86IHN0cmluZztcblx0XHRyb3dIaWdobGlnaHRpbmc6IEJpbmRpbmdFeHByZXNzaW9uPE1lc3NhZ2VUeXBlPjtcblx0XHRyb3dOYXZpZ2F0ZWQ6IEJpbmRpbmdFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHRcdHZpc2libGU/OiBCaW5kaW5nRXhwcmVzc2lvbjxib29sZWFuPjtcblx0fTtcblx0c2VsZWN0aW9uTW9kZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRzdGFuZGFyZEFjdGlvbnM6IHtcblx0XHRhY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBTdGFuZGFyZEFjdGlvbkNvbmZpZ1R5cGU+O1xuXHRcdGlzSW5zZXJ0VXBkYXRlVGVtcGxhdGVkOiBib29sZWFuO1xuXHRcdHVwZGF0YWJsZVByb3BlcnR5UGF0aDogc3RyaW5nO1xuXHR9O1xuXHRkaXNwbGF5TW9kZT86IGJvb2xlYW47XG5cdHRocmVzaG9sZDogbnVtYmVyO1xuXHRlbnRpdHlOYW1lOiBzdHJpbmc7XG5cdHNvcnRDb25kaXRpb25zPzogc3RyaW5nO1xuXHRncm91cENvbmRpdGlvbnM/OiBzdHJpbmc7XG5cdGFnZ3JlZ2F0ZUNvbmRpdGlvbnM/OiBzdHJpbmc7XG5cblx0LyoqIENyZWF0ZSBuZXcgZW50cmllcyAqL1xuXHRjcmVhdGU6IENyZWF0ZUJlaGF2aW9yIHwgQ3JlYXRlQmVoYXZpb3JFeHRlcm5hbDtcblx0dGl0bGU6IHN0cmluZztcblx0c2VhcmNoYWJsZTogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogTmV3IGVudHJpZXMgYXJlIGNyZWF0ZWQgd2l0aGluIHRoZSBhcHAgKGRlZmF1bHQgY2FzZSlcbiAqL1xudHlwZSBDcmVhdGVCZWhhdmlvciA9IHtcblx0bW9kZTogQ3JlYXRpb25Nb2RlO1xuXHRhcHBlbmQ6IGJvb2xlYW47XG5cdG5ld0FjdGlvbj86IHN0cmluZztcblx0bmF2aWdhdGVUb1RhcmdldD86IHN0cmluZztcbn07XG5cbi8qKlxuICogTmV3IGVudHJpZXMgYXJlIGNyZWF0ZWQgYnkgbmF2aWdhdGluZyB0byBzb21lIHRhcmdldFxuICovXG50eXBlIENyZWF0ZUJlaGF2aW9yRXh0ZXJuYWwgPSB7XG5cdG1vZGU6IFwiRXh0ZXJuYWxcIjtcblx0b3V0Ym91bmQ6IHN0cmluZztcblx0b3V0Ym91bmREZXRhaWw6IE5hdmlnYXRpb25UYXJnZXRDb25maWd1cmF0aW9uW1wib3V0Ym91bmREZXRhaWxcIl07XG5cdG5hdmlnYXRpb25TZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIFRhYmxlQ2FwYWJpbGl0eVJlc3RyaWN0aW9uID0ge1xuXHRpc0RlbGV0YWJsZTogYm9vbGVhbjtcblx0aXNVcGRhdGFibGU6IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZUZpbHRlcnNDb25maWd1cmF0aW9uID0ge1xuXHRlbmFibGVkPzogc3RyaW5nIHwgYm9vbGVhbjtcblx0cGF0aHM6IFtcblx0XHR7XG5cdFx0XHRhbm5vdGF0aW9uUGF0aDogc3RyaW5nO1xuXHRcdH1cblx0XTtcblx0c2hvd0NvdW50cz86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiA9IHtcblx0cHJvcGVydHlOYW1lczogc3RyaW5nW107XG5cdHRleHQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uID0ge1xuXHRjcmVhdGVBdEVuZDogYm9vbGVhbjtcblx0Y3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGU7XG5cdGRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGE6IGJvb2xlYW47XG5cdGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHR1c2VDb25kZW5zZWRUYWJsZUxheW91dDogYm9vbGVhbjtcblx0ZW5hYmxlRXhwb3J0OiBib29sZWFuO1xuXHRoZWFkZXJWaXNpYmxlOiBib29sZWFuO1xuXHRmaWx0ZXJzPzogUmVjb3JkPHN0cmluZywgVGFibGVGaWx0ZXJzQ29uZmlndXJhdGlvbj47XG5cdHR5cGU6IFRhYmxlVHlwZTtcblx0c2VsZWN0QWxsPzogYm9vbGVhbjtcblx0c2VsZWN0aW9uTGltaXQ6IG51bWJlcjtcblx0bXVsdGlTZWxlY3RNb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGVuYWJsZVBhc3RlOiBib29sZWFuO1xuXHRlbmFibGVGdWxsU2NyZWVuOiBib29sZWFuO1xuXHRzaG93Um93Q291bnQ6IGJvb2xlYW47XG5cdGlubGluZUNyZWF0aW9uUm93Q291bnQ/OiBudW1iZXI7XG5cdGVuYWJsZU1hc3NFZGl0OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRlbmFibGVBdXRvQ29sdW1uV2lkdGg6IGJvb2xlYW47XG5cdGRhdGFTdGF0ZUluZGljYXRvckZpbHRlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVUeXBlID0gXCJHcmlkVGFibGVcIiB8IFwiUmVzcG9uc2l2ZVRhYmxlXCIgfCBcIkFuYWx5dGljYWxUYWJsZVwiO1xuXG5lbnVtIENvbHVtblR5cGUge1xuXHREZWZhdWx0ID0gXCJEZWZhdWx0XCIsIC8vIERlZmF1bHQgVHlwZVxuXHRBbm5vdGF0aW9uID0gXCJBbm5vdGF0aW9uXCIsXG5cdFNsb3QgPSBcIlNsb3RcIlxufVxuXG5leHBvcnQgdHlwZSBCYXNlVGFibGVDb2x1bW4gPSBDb25maWd1cmFibGVPYmplY3QgJiB7XG5cdGlkOiBzdHJpbmc7XG5cdHdpZHRoPzogc3RyaW5nO1xuXHRuYW1lOiBzdHJpbmc7XG5cdGF2YWlsYWJpbGl0eT86IEF2YWlsYWJpbGl0eVR5cGU7XG5cdHR5cGU6IENvbHVtblR5cGU7IC8vT3JpZ2luIG9mIHRoZSBzb3VyY2Ugd2hlcmUgd2UgYXJlIGdldHRpbmcgdGhlIHRlbXBsYXRlZCBpbmZvcm1hdGlvbiBmcm9tLFxuXHRpc05hdmlnYWJsZT86IGJvb2xlYW47XG5cdHNldHRpbmdzPzogVGFibGVDb2x1bW5TZXR0aW5ncztcblx0c2VtYW50aWNPYmplY3RQYXRoPzogc3RyaW5nO1xuXHRwcm9wZXJ0eUluZm9zPzogc3RyaW5nW107XG5cdGNhc2VTZW5zaXRpdmU/OiBib29sZWFuO1xuXHRzb3J0YWJsZTogYm9vbGVhbjtcblx0aXNHcm91cGFibGU/OiBib29sZWFuO1xuXHRob3Jpem9udGFsQWxpZ24/OiBIb3Jpem9udGFsQWxpZ247XG5cdGZvcm1hdE9wdGlvbnM6IEZvcm1hdE9wdGlvbnNUeXBlO1xuXHRpbXBvcnRhbmNlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBDdXN0b21UYWJsZUNvbHVtbiA9IEJhc2VUYWJsZUNvbHVtbiAmIHtcblx0aGVhZGVyPzogc3RyaW5nO1xuXHR0ZW1wbGF0ZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgQW5ub3RhdGlvblRhYmxlQ29sdW1uID0gQmFzZVRhYmxlQ29sdW1uICYge1xuXHRhbm5vdGF0aW9uUGF0aDogc3RyaW5nO1xuXHRyZWxhdGl2ZVBhdGg6IHN0cmluZztcblx0bGFiZWw/OiBzdHJpbmc7XG5cdHRvb2x0aXA/OiBzdHJpbmc7XG5cdGdyb3VwTGFiZWw/OiBzdHJpbmc7XG5cdGdyb3VwPzogc3RyaW5nO1xuXHRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnM/OiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+O1xuXHRzaG93RGF0YUZpZWxkc0xhYmVsPzogYm9vbGVhbjtcblx0aXNLZXk/OiBib29sZWFuO1xuXHR1bml0Pzogc3RyaW5nO1xuXHR1bml0VGV4dD86IHN0cmluZztcblx0dGltZXpvbmVUZXh0Pzogc3RyaW5nO1xuXHR0aW1lem9uZT86IHN0cmluZztcblx0ZXhwb3J0U2V0dGluZ3M/OiB7XG5cdFx0dGVtcGxhdGU/OiBzdHJpbmc7XG5cdFx0bGFiZWw/OiBzdHJpbmc7XG5cdFx0d3JhcD86IGJvb2xlYW47XG5cdFx0dHlwZT86IHN0cmluZztcblx0XHRpbnB1dEZvcm1hdD86IHN0cmluZztcblx0XHRmb3JtYXQ/OiBzdHJpbmc7XG5cdFx0c2NhbGU/OiBudW1iZXI7XG5cdFx0ZGVsaW1pdGVyPzogYm9vbGVhbjtcblx0XHR1bml0Pzogc3RyaW5nO1xuXHRcdHVuaXRQcm9wZXJ0eT86IHN0cmluZztcblx0XHR0aW1lem9uZT86IHN0cmluZztcblx0XHR0aW1lem9uZVByb3BlcnR5Pzogc3RyaW5nO1xuXHR9O1xuXHRpc0RhdGFQb2ludEZha2VUYXJnZXRQcm9wZXJ0eT86IGJvb2xlYW47XG5cdHRleHRBcnJhbmdlbWVudD86IHtcblx0XHR0ZXh0UHJvcGVydHk6IHN0cmluZztcblx0XHRtb2RlOiBEaXNwbGF5TW9kZTtcblx0fTtcblx0ZXhwb3J0Q29udGFjdFByb3BlcnR5Pzogc3RyaW5nO1xuXHRhZGRpdGlvbmFsUHJvcGVydHlJbmZvcz86IHN0cmluZ1tdO1xuXHR2aXN1YWxTZXR0aW5ncz86IFZpc3VhbFNldHRpbmdzO1xuXHR0eXBlQ29uZmlnPzogb2JqZWN0O1xufTtcblxuZXhwb3J0IHR5cGUgVmlzdWFsU2V0dGluZ3MgPSB7XG5cdHdpZHRoQ2FsY3VsYXRpb24/OiBXaWR0aENhbGN1bGF0aW9uO1xufTtcblxuZXhwb3J0IHR5cGUgV2lkdGhDYWxjdWxhdGlvbiA9IG51bGwgfCB7XG5cdG1pbldpZHRoPzogbnVtYmVyO1xuXHRtYXhXaWR0aD86IG51bWJlcjtcblx0ZGVmYXVsdFdpZHRoPzogbnVtYmVyO1xuXHRpbmNsdWRlTGFiZWw/OiBib29sZWFuO1xuXHRnYXA/OiBudW1iZXI7XG5cdC8vIG9ubHkgcmVsZXZhbnQgZm9yIGNvbXBsZXggdHlwZXNcblx0ZXhjbHVkZVByb3BlcnRpZXM/OiBzdHJpbmdbXTtcblx0dmVydGljYWxBcnJhbmdlbWVudD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZUNvbHVtbiA9IEN1c3RvbVRhYmxlQ29sdW1uIHwgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXG5leHBvcnQgdHlwZSBDdXN0b21Db2x1bW4gPSBDdXN0b21FbGVtZW50PFRhYmxlQ29sdW1uPjtcblxuZXhwb3J0IHR5cGUgQWdncmVnYXRlRGF0YSA9IHtcblx0ZGVmYXVsdEFnZ3JlZ2F0ZToge1xuXHRcdGNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXM/OiBzdHJpbmdbXTtcblx0fTtcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZVZpc3VhbGl6YXRpb24gPSB7XG5cdHR5cGU6IFZpc3VhbGl6YXRpb25UeXBlLlRhYmxlO1xuXHRhbm5vdGF0aW9uOiBUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uO1xuXHRjb250cm9sOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uO1xuXHRjb2x1bW5zOiBUYWJsZUNvbHVtbltdO1xuXHRhY3Rpb25zOiBCYXNlQWN0aW9uW107XG5cdGFnZ3JlZ2F0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBBZ2dyZWdhdGVEYXRhPjtcblx0ZW5hYmxlQW5hbHl0aWNzPzogYm9vbGVhbjtcblx0ZW5hYmxlQW5hbHl0aWNzU2VhcmNoPzogYm9vbGVhbjtcblx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBzdHJpbmc7XG5cdG9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXM6IHN0cmluZztcblx0aGVhZGVySW5mb1RpdGxlOiBzdHJpbmc7XG5cdHNlbWFudGljS2V5czogc3RyaW5nW107XG59O1xuXG50eXBlIFNvcnRlclR5cGUgPSB7XG5cdG5hbWU6IHN0cmluZztcblx0ZGVzY2VuZGluZzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgYW5ub3RhdGlvbi1iYXNlZCBhbmQgbWFuaWZlc3QtYmFzZWQgdGFibGUgYWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0xpbmVJdGVtfSBsaW5lSXRlbUFubm90YXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge05hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb259IG5hdmlnYXRpb25TZXR0aW5nc1xuICogQHJldHVybnMge0Jhc2VBY3Rpb259IFRoZSBjb21wbGV0ZSB0YWJsZSBhY3Rpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZUFjdGlvbnMoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdG5hdmlnYXRpb25TZXR0aW5ncz86IE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb25cbik6IEJhc2VBY3Rpb25bXSB7XG5cdGNvbnN0IGFUYWJsZUFjdGlvbnMgPSBnZXRUYWJsZUFubm90YXRpb25BY3Rpb25zKGxpbmVJdGVtQW5ub3RhdGlvbiwgdmlzdWFsaXphdGlvblBhdGgsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBhQW5ub3RhdGlvbkFjdGlvbnMgPSBhVGFibGVBY3Rpb25zLnRhYmxlQWN0aW9ucztcblx0Y29uc3QgYUhpZGRlbkFjdGlvbnMgPSBhVGFibGVBY3Rpb25zLmhpZGRlblRhYmxlQWN0aW9ucztcblx0cmV0dXJuIGluc2VydEN1c3RvbUVsZW1lbnRzKFxuXHRcdGFBbm5vdGF0aW9uQWN0aW9ucyxcblx0XHRnZXRBY3Rpb25zRnJvbU1hbmlmZXN0KFxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKS5hY3Rpb25zLFxuXHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdGFBbm5vdGF0aW9uQWN0aW9ucyxcblx0XHRcdG5hdmlnYXRpb25TZXR0aW5ncyxcblx0XHRcdHRydWUsXG5cdFx0XHRhSGlkZGVuQWN0aW9uc1xuXHRcdCksXG5cdFx0e1xuXHRcdFx0aXNOYXZpZ2FibGU6IFwib3ZlcndyaXRlXCIsXG5cdFx0XHRlbmFibGVPblNlbGVjdDogXCJvdmVyd3JpdGVcIixcblx0XHRcdGVuYWJsZUF1dG9TY3JvbGw6IFwib3ZlcndyaXRlXCIsXG5cdFx0XHRlbmFibGVkOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdFx0Y29tbWFuZDogXCJvdmVyd3JpdGVcIlxuXHRcdH1cblx0KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBjb2x1bW5zLCBhbm5vdGF0aW9uLWJhc2VkIGFzIHdlbGwgYXMgbWFuaWZlc3QgYmFzZWQuXG4gKiBUaGV5IGFyZSBzb3J0ZWQgYW5kIHNvbWUgcHJvcGVydGllcyBjYW4gYmUgb3ZlcndyaXR0ZW4gdmlhIHRoZSBtYW5pZmVzdCAoY2hlY2sgb3V0IHRoZSBrZXlzIHRoYXQgY2FuIGJlIG92ZXJ3cml0dGVuKS5cbiAqXG4gKiBAcGFyYW0ge0xpbmVJdGVtfSBsaW5lSXRlbUFubm90YXRpb24gQ29sbGVjdGlvbiBvZiBkYXRhIGZpZWxkcyBmb3IgcmVwcmVzZW50YXRpb24gaW4gYSB0YWJsZSBvciBsaXN0XG4gKiBAcGFyYW0ge3N0cmluZ30gdmlzdWFsaXphdGlvblBhdGhcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9ufSBuYXZpZ2F0aW9uU2V0dGluZ3NcbiAqIEByZXR1cm5zIHtUYWJsZUNvbHVtbltdfSBSZXR1cm5zIGFsbCB0YWJsZSBjb2x1bW5zIHRoYXQgc2hvdWxkIGJlIGF2YWlsYWJsZSwgcmVnYXJkbGVzcyBvZiB0ZW1wbGF0aW5nIG9yIHBlcnNvbmFsaXphdGlvbiBvciB0aGVpciBvcmlnaW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlQ29sdW1ucyhcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0bmF2aWdhdGlvblNldHRpbmdzPzogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvblxuKTogVGFibGVDb2x1bW5bXSB7XG5cdGNvbnN0IGFubm90YXRpb25Db2x1bW5zID0gZ2V0Q29sdW1uc0Zyb21Bbm5vdGF0aW9ucyhsaW5lSXRlbUFubm90YXRpb24sIHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgbWFuaWZlc3RDb2x1bW5zID0gZ2V0Q29sdW1uc0Zyb21NYW5pZmVzdChcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpLmNvbHVtbnMsXG5cdFx0YW5ub3RhdGlvbkNvbHVtbnMgYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKGxpbmVJdGVtQW5ub3RhdGlvbiksXG5cdFx0bmF2aWdhdGlvblNldHRpbmdzXG5cdCk7XG5cblx0cmV0dXJuIGluc2VydEN1c3RvbUVsZW1lbnRzKGFubm90YXRpb25Db2x1bW5zLCBtYW5pZmVzdENvbHVtbnMsIHtcblx0XHR3aWR0aDogXCJvdmVyd3JpdGVcIixcblx0XHRpbXBvcnRhbmNlOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdGlzTmF2aWdhYmxlOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdGF2YWlsYWJpbGl0eTogXCJvdmVyd3JpdGVcIixcblx0XHRzZXR0aW5nczogXCJvdmVyd3JpdGVcIixcblx0XHRob3Jpem9udGFsQWxpZ246IFwib3ZlcndyaXRlXCIsXG5cdFx0Zm9ybWF0T3B0aW9uczogXCJvdmVyd3JpdGVcIlxuXHR9KTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgY3VzdG9tIGFnZ3JlZ2F0aW9uIGRlZmluaXRpb25zIGZyb20gdGhlIGVudGl0eVR5cGUuXG4gKlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHRhcmdldCBlbnRpdHkgdHlwZS5cbiAqIEBwYXJhbSB0YWJsZUNvbHVtbnMgVGhlIGFycmF5IG9mIGNvbHVtbnMgZm9yIHRoZSBlbnRpdHkgdHlwZS5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEByZXR1cm5zIFRoZSBhZ2dyZWdhdGUgZGVmaW5pdGlvbnMgZnJvbSB0aGUgZW50aXR5VHlwZSwgb3IgdW5kZWZpbmVkIGlmIHRoZSBlbnRpdHkgZG9lc24ndCBzdXBwb3J0IGFuYWx5dGljYWwgcXVlcmllcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEFnZ3JlZ2F0ZURlZmluaXRpb25zRnJvbUVudGl0eVR5cGUgPSBmdW5jdGlvbiAoXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdHRhYmxlQ29sdW1uczogVGFibGVDb2x1bW5bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogUmVjb3JkPHN0cmluZywgQWdncmVnYXRlRGF0YT4gfCB1bmRlZmluZWQge1xuXHRjb25zdCBhZ2dyZWdhdGlvbkhlbHBlciA9IG5ldyBBZ2dyZWdhdGlvbkhlbHBlcihlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHRmdW5jdGlvbiBmaW5kQ29sdW1uRnJvbVBhdGgocGF0aDogc3RyaW5nKTogVGFibGVDb2x1bW4gfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0YWJsZUNvbHVtbnMuZmluZCgoY29sdW1uKSA9PiB7XG5cdFx0XHRjb25zdCBhbm5vdGF0aW9uQ29sdW1uID0gY29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRcdHJldHVybiBhbm5vdGF0aW9uQ29sdW1uLnByb3BlcnR5SW5mb3MgPT09IHVuZGVmaW5lZCAmJiBhbm5vdGF0aW9uQ29sdW1uLnJlbGF0aXZlUGF0aCA9PT0gcGF0aDtcblx0XHR9KTtcblx0fVxuXG5cdGlmICghYWdncmVnYXRpb25IZWxwZXIuaXNBbmFseXRpY3NTdXBwb3J0ZWQoKSkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvLyBLZWVwIGEgc2V0IG9mIGFsbCBjdXJyZW5jeS91bml0IHByb3BlcnRpZXMsIGFzIHdlIGRvbid0IHdhbnQgdG8gY29uc2lkZXIgdGhlbSBhcyBhZ2dyZWdhdGVzXG5cdC8vIFRoZXkgYXJlIGFnZ3JlZ2F0ZXMgZm9yIHRlY2huaWNhbCByZWFzb25zICh0byBtYW5hZ2UgbXVsdGktdW5pdHMgc2l0dWF0aW9ucykgYnV0IGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSBmcm9tIGEgdXNlciBzdGFuZHBvaW50XG5cdGNvbnN0IG1DdXJyZW5jeU9yVW5pdFByb3BlcnRpZXMgPSBuZXcgU2V0KCk7XG5cdHRhYmxlQ29sdW1ucy5mb3JFYWNoKChvQ29sdW1uKSA9PiB7XG5cdFx0Y29uc3Qgb1RhYmxlQ29sdW1uID0gb0NvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0aWYgKG9UYWJsZUNvbHVtbi51bml0KSB7XG5cdFx0XHRtQ3VycmVuY3lPclVuaXRQcm9wZXJ0aWVzLmFkZChvVGFibGVDb2x1bW4udW5pdCk7XG5cdFx0fVxuXHR9KTtcblxuXHRjb25zdCBhQ3VzdG9tQWdncmVnYXRlQW5ub3RhdGlvbnMgPSBhZ2dyZWdhdGlvbkhlbHBlci5nZXRDdXN0b21BZ2dyZWdhdGVEZWZpbml0aW9ucygpO1xuXHRjb25zdCBtUmF3RGVmaW5pdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuXG5cdGFDdXN0b21BZ2dyZWdhdGVBbm5vdGF0aW9ucy5mb3JFYWNoKChhbm5vdGF0aW9uKSA9PiB7XG5cdFx0Y29uc3Qgb0FnZ3JlZ2F0ZWRQcm9wZXJ0eSA9IGFnZ3JlZ2F0aW9uSGVscGVyLl9lbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuZmluZCgob1Byb3BlcnR5KSA9PiB7XG5cdFx0XHRyZXR1cm4gb1Byb3BlcnR5Lm5hbWUgPT09IGFubm90YXRpb24ucXVhbGlmaWVyO1xuXHRcdH0pO1xuXG5cdFx0aWYgKG9BZ2dyZWdhdGVkUHJvcGVydHkpIHtcblx0XHRcdGNvbnN0IGFDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzID0gYW5ub3RhdGlvbi5hbm5vdGF0aW9ucz8uQWdncmVnYXRpb24/LkNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXM7XG5cdFx0XHRtUmF3RGVmaW5pdGlvbnNbb0FnZ3JlZ2F0ZWRQcm9wZXJ0eS5uYW1lXSA9IGFDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzXG5cdFx0XHRcdD8gYUNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMubWFwKChvQ3R4RGVmUHJvcGVydHkpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBvQ3R4RGVmUHJvcGVydHkudmFsdWU7XG5cdFx0XHRcdCAgfSlcblx0XHRcdFx0OiBbXTtcblx0XHR9XG5cdH0pO1xuXHRjb25zdCBtUmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBBZ2dyZWdhdGVEYXRhPiA9IHt9O1xuXG5cdHRhYmxlQ29sdW1ucy5mb3JFYWNoKChvQ29sdW1uKSA9PiB7XG5cdFx0Y29uc3Qgb1RhYmxlQ29sdW1uID0gb0NvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0aWYgKG9UYWJsZUNvbHVtbi5wcm9wZXJ0eUluZm9zID09PSB1bmRlZmluZWQgJiYgb1RhYmxlQ29sdW1uLnJlbGF0aXZlUGF0aCkge1xuXHRcdFx0Y29uc3QgYVJhd0NvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMgPSBtUmF3RGVmaW5pdGlvbnNbb1RhYmxlQ29sdW1uLnJlbGF0aXZlUGF0aF07XG5cblx0XHRcdC8vIElnbm9yZSBhZ2dyZWdhdGVzIGNvcnJlc3BvbmRpbmcgdG8gY3VycmVuY2llcyBvciB1bml0cyBvZiBtZWFzdXJlIGFuZCBkdW1teSBjcmVhdGVkIHByb3BlcnR5IGZvciBkYXRhcG9pbnQgdGFyZ2V0IFZhbHVlXG5cdFx0XHRpZiAoXG5cdFx0XHRcdGFSYXdDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzICYmXG5cdFx0XHRcdCFtQ3VycmVuY3lPclVuaXRQcm9wZXJ0aWVzLmhhcyhvVGFibGVDb2x1bW4ubmFtZSkgJiZcblx0XHRcdFx0IW9UYWJsZUNvbHVtbi5pc0RhdGFQb2ludEZha2VUYXJnZXRQcm9wZXJ0eVxuXHRcdFx0KSB7XG5cdFx0XHRcdG1SZXN1bHRbb1RhYmxlQ29sdW1uLm5hbWVdID0ge1xuXHRcdFx0XHRcdGRlZmF1bHRBZ2dyZWdhdGU6IHt9LFxuXHRcdFx0XHRcdHJlbGF0aXZlUGF0aDogb1RhYmxlQ29sdW1uLnJlbGF0aXZlUGF0aFxuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb25zdCBhQ29udGV4dERlZmluaW5nUHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0XHRcdFx0YVJhd0NvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMuZm9yRWFjaCgoY29udGV4dERlZmluaW5nUHJvcGVydHlOYW1lKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgb0NvbHVtbiA9IGZpbmRDb2x1bW5Gcm9tUGF0aChjb250ZXh0RGVmaW5pbmdQcm9wZXJ0eU5hbWUpO1xuXHRcdFx0XHRcdGlmIChvQ29sdW1uKSB7XG5cdFx0XHRcdFx0XHRhQ29udGV4dERlZmluaW5nUHJvcGVydGllcy5wdXNoKG9Db2x1bW4ubmFtZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZiAoYUNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0bVJlc3VsdFtvVGFibGVDb2x1bW4ubmFtZV0uZGVmYXVsdEFnZ3JlZ2F0ZS5jb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzID0gYUNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdHJldHVybiBtUmVzdWx0O1xufTtcblxuLyoqXG4gKiBVcGRhdGVzIGEgdGFibGUgdmlzdWFsaXphdGlvbiBmb3IgYW5hbHl0aWNhbCB1c2UgY2FzZXMuXG4gKlxuICogQHBhcmFtIHRhYmxlVmlzdWFsaXphdGlvbiBUaGUgdmlzdWFsaXphdGlvbiB0byBiZSB1cGRhdGVkXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgZW50aXR5IHR5cGUgZGlzcGxheWVkIGluIHRoZSB0YWJsZVxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24gVGhlIHByZXNlbnRhdGlvblZhcmlhbnQgYW5ub3RhdGlvbiAoaWYgYW55KVxuICovXG5mdW5jdGlvbiB1cGRhdGVUYWJsZVZpc3VhbGl6YXRpb25Gb3JBbmFseXRpY3MoXG5cdHRhYmxlVmlzdWFsaXphdGlvbjogVGFibGVWaXN1YWxpemF0aW9uLFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj86IFByZXNlbnRhdGlvblZhcmlhbnRUeXBlVHlwZXNcbikge1xuXHRpZiAodGFibGVWaXN1YWxpemF0aW9uLmNvbnRyb2wudHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIikge1xuXHRcdGNvbnN0IGFnZ3JlZ2F0ZXNEZWZpbml0aW9ucyA9IGdldEFnZ3JlZ2F0ZURlZmluaXRpb25zRnJvbUVudGl0eVR5cGUoZW50aXR5VHlwZSwgdGFibGVWaXN1YWxpemF0aW9uLmNvbHVtbnMsIGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdFx0YWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cblx0XHRpZiAoYWdncmVnYXRlc0RlZmluaXRpb25zKSB7XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uZW5hYmxlQW5hbHl0aWNzID0gdHJ1ZTtcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5hZ2dyZWdhdGVzID0gYWdncmVnYXRlc0RlZmluaXRpb25zO1xuXG5cdFx0XHRjb25zdCBhbGxvd2VkVHJhbnNmb3JtYXRpb25zID0gYWdncmVnYXRpb25IZWxwZXIuZ2V0QWxsb3dlZFRyYW5zZm9ybWF0aW9ucygpO1xuXHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLmVuYWJsZUFuYWx5dGljc1NlYXJjaCA9IGFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMgPyBhbGxvd2VkVHJhbnNmb3JtYXRpb25zLmluZGV4T2YoXCJzZWFyY2hcIikgPj0gMCA6IHRydWU7XG5cblx0XHRcdC8vIEFkZCBncm91cCBhbmQgc29ydCBjb25kaXRpb25zIGZyb20gdGhlIHByZXNlbnRhdGlvbiB2YXJpYW50XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uYW5ub3RhdGlvbi5ncm91cENvbmRpdGlvbnMgPSBnZXRHcm91cENvbmRpdGlvbnMoXG5cdFx0XHRcdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLFxuXHRcdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uY29sdW1ucyxcblx0XHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLmNvbnRyb2wudHlwZVxuXHRcdFx0KTtcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5hbm5vdGF0aW9uLmFnZ3JlZ2F0ZUNvbmRpdGlvbnMgPSBnZXRBZ2dyZWdhdGVDb25kaXRpb25zKFxuXHRcdFx0XHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbixcblx0XHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLmNvbHVtbnNcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0dGFibGVWaXN1YWxpemF0aW9uLmNvbnRyb2wudHlwZSA9IFwiR3JpZFRhYmxlXCI7IC8vIEFuYWx5dGljYWxUYWJsZSBpc24ndCBhIHJlYWwgdHlwZSBmb3IgdGhlIE1EQzpUYWJsZSwgc28gd2UgYWx3YXlzIHN3aXRjaCBiYWNrIHRvIEdyaWRcblx0fSBlbHNlIGlmICh0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC50eXBlID09PSBcIlJlc3BvbnNpdmVUYWJsZVwiKSB7XG5cdFx0dGFibGVWaXN1YWxpemF0aW9uLmFubm90YXRpb24uZ3JvdXBDb25kaXRpb25zID0gZ2V0R3JvdXBDb25kaXRpb25zKFxuXHRcdFx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24sXG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uY29sdW1ucyxcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5jb250cm9sLnR5cGVcblx0XHQpO1xuXHR9XG59XG5cbi8qKlxuICogR2V0IHRoZSBuYXZpZ2F0aW9uIHRhcmdldCBwYXRoIGZyb20gbWFuaWZlc3Qgc2V0dGluZ3MuXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gbmF2aWdhdGlvblByb3BlcnR5UGF0aCBUaGUgbmF2aWdhdGlvbiBwYXRoIHRvIGNoZWNrIGluIHRoZSBtYW5pZmVzdCBzZXR0aW5nc1xuICogQHJldHVybnMgTmF2aWdhdGlvbiBwYXRoIGZyb20gbWFuaWZlc3Qgc2V0dGluZ3NcbiAqL1xuZnVuY3Rpb24gZ2V0TmF2aWdhdGlvblRhcmdldFBhdGgoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCwgbmF2aWdhdGlvblByb3BlcnR5UGF0aDogc3RyaW5nKSB7XG5cdGNvbnN0IG1hbmlmZXN0V3JhcHBlciA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCk7XG5cdGlmIChuYXZpZ2F0aW9uUHJvcGVydHlQYXRoICYmIG1hbmlmZXN0V3JhcHBlci5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihuYXZpZ2F0aW9uUHJvcGVydHlQYXRoKSkge1xuXHRcdGNvbnN0IG5hdkNvbmZpZyA9IG1hbmlmZXN0V3JhcHBlci5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihuYXZpZ2F0aW9uUHJvcGVydHlQYXRoKTtcblx0XHRpZiAoT2JqZWN0LmtleXMobmF2Q29uZmlnKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZXR1cm4gbmF2aWdhdGlvblByb3BlcnR5UGF0aDtcblx0XHR9XG5cdH1cblxuXHRjb25zdCBkYXRhTW9kZWxQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdGNvbnN0IGNvbnRleHRQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXRDb250ZXh0UGF0aCgpO1xuXHRjb25zdCBuYXZDb25maWdGb3JDb250ZXh0UGF0aCA9IG1hbmlmZXN0V3JhcHBlci5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihjb250ZXh0UGF0aCk7XG5cdGlmIChuYXZDb25maWdGb3JDb250ZXh0UGF0aCAmJiBPYmplY3Qua2V5cyhuYXZDb25maWdGb3JDb250ZXh0UGF0aCkubGVuZ3RoID4gMCkge1xuXHRcdHJldHVybiBjb250ZXh0UGF0aDtcblx0fVxuXG5cdHJldHVybiBkYXRhTW9kZWxQYXRoLnRhcmdldEVudGl0eVNldCA/IGRhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5U2V0Lm5hbWUgOiBkYXRhTW9kZWxQYXRoLnN0YXJ0aW5nRW50aXR5U2V0Lm5hbWU7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgJ3VuaXQnIGFuZCAndGV4dEFycmFuZ2VtZW50JyBwcm9wZXJ0aWVzIGluIGNvbHVtbnMgd2hlbiBuZWNlc3NhcnkuXG4gKlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGVudGl0eSB0eXBlIGRpc3BsYXllZCBpbiB0aGUgdGFibGVcbiAqIEBwYXJhbSB0YWJsZUNvbHVtbnMgVGhlIGNvbHVtbnMgdG8gYmUgdXBkYXRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTGlua2VkUHJvcGVydGllcyhlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCB0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10pIHtcblx0ZnVuY3Rpb24gZmluZENvbHVtbkJ5UGF0aChwYXRoOiBzdHJpbmcpOiBUYWJsZUNvbHVtbiB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRhYmxlQ29sdW1ucy5maW5kKChjb2x1bW4pID0+IHtcblx0XHRcdGNvbnN0IGFubm90YXRpb25Db2x1bW4gPSBjb2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW4ucHJvcGVydHlJbmZvcyA9PT0gdW5kZWZpbmVkICYmIGFubm90YXRpb25Db2x1bW4ucmVsYXRpdmVQYXRoID09PSBwYXRoO1xuXHRcdH0pO1xuXHR9XG5cblx0dGFibGVDb2x1bW5zLmZvckVhY2goKG9Db2x1bW4pID0+IHtcblx0XHRjb25zdCBvVGFibGVDb2x1bW4gPSBvQ29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRpZiAob1RhYmxlQ29sdW1uLnByb3BlcnR5SW5mb3MgPT09IHVuZGVmaW5lZCAmJiBvVGFibGVDb2x1bW4ucmVsYXRpdmVQYXRoKSB7XG5cdFx0XHRjb25zdCBvUHJvcGVydHkgPSBlbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuZmluZCgob1Byb3A6IFByb3BlcnR5KSA9PiBvUHJvcC5uYW1lID09PSBvVGFibGVDb2x1bW4ucmVsYXRpdmVQYXRoKTtcblx0XHRcdGlmIChvUHJvcGVydHkpIHtcblx0XHRcdFx0Y29uc3Qgb1VuaXQgPSBnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eShvUHJvcGVydHkpIHx8IGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkob1Byb3BlcnR5KTtcblx0XHRcdFx0Y29uc3Qgb1RpbWV6b25lID0gZ2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHkob1Byb3BlcnR5KTtcblx0XHRcdFx0Y29uc3Qgc1RpbWV6b25lID0gb1Byb3BlcnR5Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UaW1lem9uZTtcblx0XHRcdFx0aWYgKG9Vbml0KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1VuaXRDb2x1bW4gPSBmaW5kQ29sdW1uQnlQYXRoKG9Vbml0Lm5hbWUpO1xuXHRcdFx0XHRcdG9UYWJsZUNvbHVtbi51bml0ID0gb1VuaXRDb2x1bW4/Lm5hbWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3Qgc1VuaXQgPSBvUHJvcGVydHk/LmFubm90YXRpb25zPy5NZWFzdXJlcz8uSVNPQ3VycmVuY3kgfHwgb1Byb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQ7XG5cdFx0XHRcdFx0aWYgKHNVbml0KSB7XG5cdFx0XHRcdFx0XHRvVGFibGVDb2x1bW4udW5pdFRleHQgPSBgJHtzVW5pdH1gO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob1RpbWV6b25lKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1RpbWV6b25lQ29sdW1uID0gZmluZENvbHVtbkJ5UGF0aChvVGltZXpvbmUubmFtZSk7XG5cdFx0XHRcdFx0b1RhYmxlQ29sdW1uLnRpbWV6b25lID0gb1RpbWV6b25lQ29sdW1uPy5uYW1lO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHNUaW1lem9uZSkge1xuXHRcdFx0XHRcdG9UYWJsZUNvbHVtbi50aW1lem9uZVRleHQgPSBzVGltZXpvbmUudG9TdHJpbmcoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGRpc3BsYXlNb2RlID0gZ2V0RGlzcGxheU1vZGUob1Byb3BlcnR5KSxcblx0XHRcdFx0XHR0ZXh0QW5ub3RhdGlvbiA9IG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucy5Db21tb24/LlRleHQ7XG5cdFx0XHRcdGlmIChpc1BhdGhFeHByZXNzaW9uKHRleHRBbm5vdGF0aW9uKSAmJiBkaXNwbGF5TW9kZSAhPT0gXCJWYWx1ZVwiKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1RleHRDb2x1bW4gPSBmaW5kQ29sdW1uQnlQYXRoKHRleHRBbm5vdGF0aW9uLnBhdGgpO1xuXHRcdFx0XHRcdGlmIChvVGV4dENvbHVtbiAmJiBvVGV4dENvbHVtbi5uYW1lICE9PSBvVGFibGVDb2x1bW4ubmFtZSkge1xuXHRcdFx0XHRcdFx0b1RhYmxlQ29sdW1uLnRleHRBcnJhbmdlbWVudCA9IHtcblx0XHRcdFx0XHRcdFx0dGV4dFByb3BlcnR5OiBvVGV4dENvbHVtbi5uYW1lLFxuXHRcdFx0XHRcdFx0XHRtb2RlOiBkaXNwbGF5TW9kZVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBnZXRTZW1hbnRpY0tleXNBbmRUaXRsZUluZm8oY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCkge1xuXHRjb25zdCBoZWFkZXJJbmZvVGl0bGVQYXRoID0gKGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUoKT8uYW5ub3RhdGlvbnM/LlVJPy5IZWFkZXJJbmZvPy5UaXRsZSBhcyBEYXRhRmllbGRUeXBlcyk/LlZhbHVlXG5cdFx0Py5wYXRoO1xuXHRjb25zdCBzZW1hbnRpY0tleUFubm90YXRpb25zOiBhbnlbXSB8IHVuZGVmaW5lZCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUoKT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uU2VtYW50aWNLZXk7XG5cblx0bGV0IHNlbWFudGljS2V5Q29sdW1uczogc3RyaW5nW10gPSBbXTtcblx0aWYgKHNlbWFudGljS2V5QW5ub3RhdGlvbnMpIHtcblx0XHRzZW1hbnRpY0tleUFubm90YXRpb25zLmZvckVhY2goZnVuY3Rpb24gKG9Db2x1bW46IGFueSkge1xuXHRcdFx0c2VtYW50aWNLZXlDb2x1bW5zLnB1c2gob0NvbHVtbi52YWx1ZSk7XG5cdFx0fSk7XG5cdH1cblxuXHRyZXR1cm4geyBoZWFkZXJJbmZvVGl0bGVQYXRoLCBzZW1hbnRpY0tleUNvbHVtbnMgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRhYmxlVmlzdWFsaXphdGlvbihcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/OiBQcmVzZW50YXRpb25WYXJpYW50VHlwZVR5cGVzLFxuXHRpc0NvbmRlbnNlZFRhYmxlTGF5b3V0Q29tcGxpYW50PzogYm9vbGVhbixcblx0dmlld0NvbmZpZ3VyYXRpb24/OiBWaWV3UGF0aENvbmZpZ3VyYXRpb25cbik6IFRhYmxlVmlzdWFsaXphdGlvbiB7XG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RDb25maWcgPSBnZXRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbihcblx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0dmlzdWFsaXphdGlvblBhdGgsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRpc0NvbmRlbnNlZFRhYmxlTGF5b3V0Q29tcGxpYW50XG5cdCk7XG5cdGNvbnN0IHsgbmF2aWdhdGlvblByb3BlcnR5UGF0aCB9ID0gc3BsaXRQYXRoKHZpc3VhbGl6YXRpb25QYXRoKTtcblx0Y29uc3QgbmF2aWdhdGlvblRhcmdldFBhdGggPSBnZXROYXZpZ2F0aW9uVGFyZ2V0UGF0aChjb252ZXJ0ZXJDb250ZXh0LCBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoKTtcblx0Y29uc3QgbmF2aWdhdGlvblNldHRpbmdzID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihuYXZpZ2F0aW9uVGFyZ2V0UGF0aCk7XG5cdGNvbnN0IGNvbHVtbnMgPSBnZXRUYWJsZUNvbHVtbnMobGluZUl0ZW1Bbm5vdGF0aW9uLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCwgbmF2aWdhdGlvblNldHRpbmdzKTtcblx0Y29uc3Qgb3BlcmF0aW9uQXZhaWxhYmxlTWFwID0gZ2V0T3BlcmF0aW9uQXZhaWxhYmxlTWFwKGxpbmVJdGVtQW5ub3RhdGlvbiwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IHNlbWFudGljS2V5c0FuZEhlYWRlckluZm9UaXRsZSA9IGdldFNlbWFudGljS2V5c0FuZFRpdGxlSW5mbyhjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3Qgb1Zpc3VhbGl6YXRpb246IFRhYmxlVmlzdWFsaXphdGlvbiA9IHtcblx0XHR0eXBlOiBWaXN1YWxpemF0aW9uVHlwZS5UYWJsZSxcblx0XHRhbm5vdGF0aW9uOiBnZXRUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uKFxuXHRcdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdFx0dmlzdWFsaXphdGlvblBhdGgsXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0dGFibGVNYW5pZmVzdENvbmZpZyxcblx0XHRcdGNvbHVtbnMsXG5cdFx0XHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbixcblx0XHRcdHZpZXdDb25maWd1cmF0aW9uXG5cdFx0KSxcblx0XHRjb250cm9sOiB0YWJsZU1hbmlmZXN0Q29uZmlnLFxuXHRcdGFjdGlvbnM6IHJlbW92ZUR1cGxpY2F0ZUFjdGlvbnMoZ2V0VGFibGVBY3Rpb25zKGxpbmVJdGVtQW5ub3RhdGlvbiwgdmlzdWFsaXphdGlvblBhdGgsIGNvbnZlcnRlckNvbnRleHQsIG5hdmlnYXRpb25TZXR0aW5ncykpLFxuXHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBKU09OLnN0cmluZ2lmeShvcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdG9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXM6IGdldE9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXMob3BlcmF0aW9uQXZhaWxhYmxlTWFwLCBjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHRoZWFkZXJJbmZvVGl0bGU6IHNlbWFudGljS2V5c0FuZEhlYWRlckluZm9UaXRsZS5oZWFkZXJJbmZvVGl0bGVQYXRoLFxuXHRcdHNlbWFudGljS2V5czogc2VtYW50aWNLZXlzQW5kSGVhZGVySW5mb1RpdGxlLnNlbWFudGljS2V5Q29sdW1uc1xuXHR9O1xuXG5cdHVwZGF0ZUxpbmtlZFByb3BlcnRpZXMoY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZShsaW5lSXRlbUFubm90YXRpb24pLCBjb2x1bW5zKTtcblx0dXBkYXRlVGFibGVWaXN1YWxpemF0aW9uRm9yQW5hbHl0aWNzKFxuXHRcdG9WaXN1YWxpemF0aW9uLFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKSxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uXG5cdCk7XG5cblx0cmV0dXJuIG9WaXN1YWxpemF0aW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdFRhYmxlVmlzdWFsaXphdGlvbihjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogVGFibGVWaXN1YWxpemF0aW9uIHtcblx0Y29uc3QgdGFibGVNYW5pZmVzdENvbmZpZyA9IGdldFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uKHVuZGVmaW5lZCwgXCJcIiwgY29udmVydGVyQ29udGV4dCwgZmFsc2UpO1xuXHRjb25zdCBjb2x1bW5zID0gZ2V0Q29sdW1uc0Zyb21FbnRpdHlUeXBlKHt9LCBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKSwgW10sIFtdLCBjb252ZXJ0ZXJDb250ZXh0LCB0YWJsZU1hbmlmZXN0Q29uZmlnLnR5cGUpO1xuXHRjb25zdCBvcGVyYXRpb25BdmFpbGFibGVNYXAgPSBnZXRPcGVyYXRpb25BdmFpbGFibGVNYXAodW5kZWZpbmVkLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3Qgc2VtYW50aWNLZXlzQW5kSGVhZGVySW5mb1RpdGxlID0gZ2V0U2VtYW50aWNLZXlzQW5kVGl0bGVJbmZvKGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBvVmlzdWFsaXphdGlvbjogVGFibGVWaXN1YWxpemF0aW9uID0ge1xuXHRcdHR5cGU6IFZpc3VhbGl6YXRpb25UeXBlLlRhYmxlLFxuXHRcdGFubm90YXRpb246IGdldFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24odW5kZWZpbmVkLCBcIlwiLCBjb252ZXJ0ZXJDb250ZXh0LCB0YWJsZU1hbmlmZXN0Q29uZmlnLCBjb2x1bW5zKSxcblx0XHRjb250cm9sOiB0YWJsZU1hbmlmZXN0Q29uZmlnLFxuXHRcdGFjdGlvbnM6IFtdLFxuXHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBKU09OLnN0cmluZ2lmeShvcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdG9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXM6IGdldE9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXMob3BlcmF0aW9uQXZhaWxhYmxlTWFwLCBjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHRoZWFkZXJJbmZvVGl0bGU6IHNlbWFudGljS2V5c0FuZEhlYWRlckluZm9UaXRsZS5oZWFkZXJJbmZvVGl0bGVQYXRoLFxuXHRcdHNlbWFudGljS2V5czogc2VtYW50aWNLZXlzQW5kSGVhZGVySW5mb1RpdGxlLnNlbWFudGljS2V5Q29sdW1uc1xuXHR9O1xuXG5cdHVwZGF0ZUxpbmtlZFByb3BlcnRpZXMoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCksIGNvbHVtbnMpO1xuXHR1cGRhdGVUYWJsZVZpc3VhbGl6YXRpb25Gb3JBbmFseXRpY3Mob1Zpc3VhbGl6YXRpb24sIGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpLCBjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHRyZXR1cm4gb1Zpc3VhbGl6YXRpb247XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbWFwIG9mIENvcmUuT3BlcmF0aW9uQXZhaWxhYmxlIHByb3BlcnR5IHBhdGhzIGZvciBhbGwgRGF0YUZpZWxkRm9yQWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIFRoZSBpbnN0YW5jZSBvZiB0aGUgbGluZSBpdGVtXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gVGhlIHJlY29yZCBjb250YWluaW5nIGFsbCBhY3Rpb24gbmFtZXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgQ29yZS5PcGVyYXRpb25BdmFpbGFibGUgcHJvcGVydHkgcGF0aHNcbiAqL1xuZnVuY3Rpb24gZ2V0T3BlcmF0aW9uQXZhaWxhYmxlTWFwKGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0gfCB1bmRlZmluZWQsIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcblx0Y29uc3Qgb3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cdGNvbnN0IGFkZFRvTWFwID0gZnVuY3Rpb24gKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG5cdFx0aWYgKGtleSkge1xuXHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwW2tleV0gPSB2YWx1ZTtcblx0XHR9XG5cdH07XG5cblx0aWYgKGxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbi5mb3JFYWNoKChkYXRhRmllbGQpID0+IHtcblx0XHRcdGlmIChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbikge1xuXHRcdFx0XHRjb25zdCBhY3Rpb25OYW1lID0gZGF0YUZpZWxkLkFjdGlvbiBhcyBzdHJpbmc7XG5cdFx0XHRcdGlmIChhY3Rpb25OYW1lPy5pbmRleE9mKFwiL1wiKSA8IDAgJiYgIWRhdGFGaWVsZC5EZXRlcm1pbmluZykge1xuXHRcdFx0XHRcdGNvbnN0IGFjdGlvblRhcmdldCA9IGRhdGFGaWVsZC5BY3Rpb25UYXJnZXQ7XG5cdFx0XHRcdFx0aWYgKGFjdGlvblRhcmdldD8uYW5ub3RhdGlvbnM/LkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0Ly8gQW5ub3RhdGlvbiBleHBsaWNpdGx5IGNvbmZpZ3VyZWQgd2l0aCBudWxsIChhY3Rpb24gYWR2ZXJ0aXNlbWVudCByZWxhdGVkKVxuXHRcdFx0XHRcdFx0YWRkVG9NYXAoYWN0aW9uTmFtZSwgbnVsbCk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhY3Rpb25UYXJnZXQ/LnBhcmFtZXRlcnM/Lmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgYmluZGluZ1BhcmFtZXRlckZ1bGxOYW1lID0gYWN0aW9uVGFyZ2V0LnBhcmFtZXRlcnNbMF0uZnVsbHlRdWFsaWZpZWROYW1lLFxuXHRcdFx0XHRcdFx0XHR0YXJnZXRFeHByZXNzaW9uID0gYW5ub3RhdGlvbkV4cHJlc3Npb24oXG5cdFx0XHRcdFx0XHRcdFx0YWN0aW9uVGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29yZT8uT3BlcmF0aW9uQXZhaWxhYmxlLFxuXHRcdFx0XHRcdFx0XHRcdFtdLFxuXHRcdFx0XHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0XHQocGF0aDogc3RyaW5nKSA9PiBiaW5kaW5nQ29udGV4dFBhdGhWaXNpdG9yKHBhdGgsIGNvbnZlcnRlckNvbnRleHQsIGJpbmRpbmdQYXJhbWV0ZXJGdWxsTmFtZSlcblx0XHRcdFx0XHRcdFx0KSBhcyBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248c3RyaW5nPjtcblxuXHRcdFx0XHRcdFx0aWYgKHRhcmdldEV4cHJlc3Npb24/LnBhdGgpIHtcblx0XHRcdFx0XHRcdFx0YWRkVG9NYXAoYWN0aW9uTmFtZSwgdGFyZ2V0RXhwcmVzc2lvbi5wYXRoKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoYWN0aW9uVGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29yZT8uT3BlcmF0aW9uQXZhaWxhYmxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0YWRkVG9NYXAoYWN0aW9uTmFtZSwgdGFyZ2V0RXhwcmVzc2lvbik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRyZXR1cm4gb3BlcmF0aW9uQXZhaWxhYmxlTWFwO1xufVxuXG4vKipcbiAqIEdldHMgdXBkYXRhYmxlIHByb3BlcnR5UGF0aCBmb3IgdGhlIGN1cnJlbnQgZW50aXR5c2V0IGlmIHZhbGlkLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSB1cGRhdGFibGUgcHJvcGVydHkgZm9yIHRoZSByb3dzXG4gKi9cbmZ1bmN0aW9uIGdldEN1cnJlbnRFbnRpdHlTZXRVcGRhdGFibGVQYXRoKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBzdHJpbmcge1xuXHRjb25zdCByZXN0cmljdGlvbnMgPSBnZXRSZXN0cmljdGlvbnMoY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdGNvbnN0IHVwZGF0YWJsZSA9IHJlc3RyaWN0aW9ucy5pc1VwZGF0YWJsZTtcblx0Y29uc3QgaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eTogYW55ID0gIWlzQ29uc3RhbnQodXBkYXRhYmxlLmV4cHJlc3Npb24pICYmIHVwZGF0YWJsZS5uYXZpZ2F0aW9uRXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJVbnJlc29sdmFibGVcIjtcblx0Y29uc3QgdXBkYXRhYmxlUHJvcGVydHlQYXRoID0gKGVudGl0eVNldD8uYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5VcGRhdGVSZXN0cmljdGlvbnM/LlVwZGF0YWJsZSBhcyBhbnkpPy5wYXRoO1xuXG5cdHJldHVybiBpc09ubHlEeW5hbWljT25DdXJyZW50RW50aXR5ID8gKHVwZGF0YWJsZVByb3BlcnR5UGF0aCBhcyBzdHJpbmcpIDogXCJcIjtcbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gcmV0cmlldmUgYWxsIHByb3BlcnR5IHBhdGhzIGFzc2lnbmVkIHRvIHRoZSBDb3JlLk9wZXJhdGlvbkF2YWlsYWJsZSBhbm5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gb3BlcmF0aW9uQXZhaWxhYmxlTWFwIFRoZSByZWNvcmQgY29uc2lzdGluZyBvZiBhY3Rpb25zIGFuZCB0aGVpciBDb3JlLk9wZXJhdGlvbkF2YWlsYWJsZSBwcm9wZXJ0eSBwYXRoc1xuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBDU1Ygc3RyaW5nIG9mIGFsbCBwcm9wZXJ0eSBwYXRocyBhc3NvY2lhdGVkIHdpdGggdGhlIENvcmUuT3BlcmF0aW9uQXZhaWxhYmxlIGFubm90YXRpb25cbiAqL1xuZnVuY3Rpb24gZ2V0T3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllcyhvcGVyYXRpb25BdmFpbGFibGVNYXA6IFJlY29yZDxzdHJpbmcsIGFueT4sIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBzdHJpbmcge1xuXHRjb25zdCBwcm9wZXJ0aWVzID0gbmV3IFNldCgpO1xuXG5cdGZvciAoY29uc3QgYWN0aW9uTmFtZSBpbiBvcGVyYXRpb25BdmFpbGFibGVNYXApIHtcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBvcGVyYXRpb25BdmFpbGFibGVNYXBbYWN0aW9uTmFtZV07XG5cdFx0aWYgKHByb3BlcnR5TmFtZSA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gQW5ub3RhdGlvbiBjb25maWd1cmVkIHdpdGggZXhwbGljaXQgJ251bGwnIChhY3Rpb24gYWR2ZXJ0aXNlbWVudCByZWxldmFudClcblx0XHRcdHByb3BlcnRpZXMuYWRkKGFjdGlvbk5hbWUpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHByb3BlcnR5TmFtZSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0Ly8gQWRkIHByb3BlcnR5IHBhdGhzIGFuZCBub3QgQ29uc3RhbnQgdmFsdWVzLlxuXHRcdFx0cHJvcGVydGllcy5hZGQocHJvcGVydHlOYW1lKTtcblx0XHR9XG5cdH1cblxuXHRpZiAocHJvcGVydGllcy5zaXplKSB7XG5cdFx0Ly8gU29tZSBhY3Rpb25zIGhhdmUgYW4gb3BlcmF0aW9uIGF2YWlsYWJsZSBiYXNlZCBvbiBwcm9wZXJ0eSAtLT4gd2UgbmVlZCB0byBsb2FkIHRoZSBIZWFkZXJJbmZvLlRpdGxlIHByb3BlcnR5XG5cdFx0Ly8gc28gdGhhdCB0aGUgZGlhbG9nIG9uIHBhcnRpYWwgYWN0aW9ucyBpcyBkaXNwbGF5ZWQgcHJvcGVybHkgKEJDUCAyMTgwMjcxNDI1KVxuXHRcdGNvbnN0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKTtcblx0XHRjb25zdCB0aXRsZVByb3BlcnR5ID0gKGVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LlVJPy5IZWFkZXJJbmZvPy5UaXRsZSBhcyBEYXRhRmllbGRUeXBlcyk/LlZhbHVlPy5wYXRoO1xuXHRcdGlmICh0aXRsZVByb3BlcnR5KSB7XG5cdFx0XHRwcm9wZXJ0aWVzLmFkZCh0aXRsZVByb3BlcnR5KTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gQXJyYXkuZnJvbShwcm9wZXJ0aWVzKS5qb2luKFwiLFwiKTtcbn1cblxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIHRoZSBEYXRhRmllbGRGb3JBY3Rpb24gYW5kIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiBvZiBhIGxpbmUgaXRlbSBhbmRcbiAqIHJldHVybnMgYWxsIHRoZSBVSS5IaWRkZW4gYW5ub3RhdGlvbiBleHByZXNzaW9ucy5cbiAqXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgdXNlZCBmb3IgcmVwcmVzZW50YXRpb24gaW4gYSB0YWJsZSBvciBsaXN0XG4gKiBAcGFyYW0gY3VycmVudEVudGl0eVR5cGUgQ3VycmVudCBlbnRpdHkgdHlwZVxuICogQHBhcmFtIGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoIE9iamVjdCBwYXRoIG9mIHRoZSBkYXRhIG1vZGVsXG4gKiBAcGFyYW0gaXNFbnRpdHlTZXRcbiAqIEByZXR1cm5zIEFsbCB0aGUgYFVJLkhpZGRlbmAgcGF0aCBleHByZXNzaW9ucyBmb3VuZCBpbiB0aGUgcmVsZXZhbnQgYWN0aW9uc1xuICovXG5mdW5jdGlvbiBnZXRVSUhpZGRlbkV4cEZvckFjdGlvbnNSZXF1aXJpbmdDb250ZXh0KFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHRjdXJyZW50RW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0Y29udGV4dERhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGlzRW50aXR5U2V0OiBib29sZWFuXG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+W10ge1xuXHRjb25zdCBhVWlIaWRkZW5QYXRoRXhwcmVzc2lvbnM6IEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IFtdO1xuXHRsaW5lSXRlbUFubm90YXRpb24uZm9yRWFjaCgoZGF0YUZpZWxkKSA9PiB7XG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIGxpbmVJdGVtIGNvbnRleHQgaXMgdGhlIHNhbWUgYXMgdGhhdCBvZiB0aGUgYWN0aW9uOlxuXHRcdGlmIChcblx0XHRcdChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbiAmJlxuXHRcdFx0XHRkYXRhRmllbGQ/LkFjdGlvblRhcmdldD8uaXNCb3VuZCAmJlxuXHRcdFx0XHRjdXJyZW50RW50aXR5VHlwZSA9PT0gZGF0YUZpZWxkPy5BY3Rpb25UYXJnZXQuc291cmNlRW50aXR5VHlwZSkgfHxcblx0XHRcdChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiAmJlxuXHRcdFx0XHRkYXRhRmllbGQuUmVxdWlyZXNDb250ZXh0ICYmXG5cdFx0XHRcdGRhdGFGaWVsZD8uSW5saW5lPy52YWx1ZU9mKCkgIT09IHRydWUpXG5cdFx0KSB7XG5cdFx0XHRpZiAodHlwZW9mIGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbj8udmFsdWVPZigpID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdGFVaUhpZGRlblBhdGhFeHByZXNzaW9ucy5wdXNoKFxuXHRcdFx0XHRcdGVxdWFsKFxuXHRcdFx0XHRcdFx0Z2V0QmluZGluZ0V4cEZyb21Db250ZXh0KFxuXHRcdFx0XHRcdFx0XHRkYXRhRmllbGQgYXMgRGF0YUZpZWxkRm9yQWN0aW9uIHwgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uLFxuXHRcdFx0XHRcdFx0XHRjb250ZXh0RGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHRcdFx0XHRcdFx0aXNFbnRpdHlTZXRcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRmYWxzZVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gYVVpSGlkZGVuUGF0aEV4cHJlc3Npb25zO1xufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBjb250ZXh0IGN1cnJlbnRseSByZWZlcmVuY2VkIGJ5IHRoaXMgYmluZGluZyBieSByZW1vdmluZyB0aGUgbGFzdCBuYXZpZ2F0aW9uIHByb3BlcnR5LlxuICpcbiAqIEl0IGlzIHVzZWQgKHNwZWNpZmljYWxseSBpbiB0aGlzIGNhc2UpLCB0byB0cmFuc2Zvcm0gYSBiaW5kaW5nIG1hZGUgZm9yIGEgTmF2UHJvcCBjb250ZXh0IC9NYWluT2JqZWN0L05hdlByb3AxL05hdlByb3AyLFxuICogaW50byBhIGJpbmRpbmcgb24gdGhlIHByZXZpb3VzIGNvbnRleHQgL01haW5PYmplY3QvTmF2UHJvcDEuXG4gKlxuICogQHBhcmFtIHNvdXJjZSBEYXRhRmllbGRGb3JBY3Rpb24gfCBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gfCBDdXN0b21BY3Rpb25cbiAqIEBwYXJhbSBjb250ZXh0RGF0YU1vZGVsT2JqZWN0UGF0aCBEYXRhTW9kZWxPYmplY3RQYXRoXG4gKiBAcGFyYW0gaXNFbnRpdHlTZXRcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb25cbiAqL1xuZnVuY3Rpb24gZ2V0QmluZGluZ0V4cEZyb21Db250ZXh0KFxuXHRzb3VyY2U6IERhdGFGaWVsZEZvckFjdGlvbiB8IERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiB8IEN1c3RvbUFjdGlvbixcblx0Y29udGV4dERhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGlzRW50aXR5U2V0OiBib29sZWFuXG4pOiBFeHByZXNzaW9uPGFueT4ge1xuXHRsZXQgc0V4cHJlc3Npb246IGFueSB8IHVuZGVmaW5lZDtcblx0aWYgKFxuXHRcdChzb3VyY2UgYXMgRGF0YUZpZWxkRm9yQWN0aW9uKT8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbiB8fFxuXHRcdChzb3VyY2UgYXMgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uKT8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvblxuXHQpIHtcblx0XHRzRXhwcmVzc2lvbiA9IChzb3VyY2UgYXMgRGF0YUZpZWxkRm9yQWN0aW9uIHwgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uKT8uYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW47XG5cdH0gZWxzZSB7XG5cdFx0c0V4cHJlc3Npb24gPSAoc291cmNlIGFzIEN1c3RvbUFjdGlvbik/LnZpc2libGU7XG5cdH1cblx0bGV0IHNQYXRoOiBzdHJpbmc7XG5cdGlmIChzRXhwcmVzc2lvbj8ucGF0aCkge1xuXHRcdHNQYXRoID0gc0V4cHJlc3Npb24ucGF0aDtcblx0fSBlbHNlIHtcblx0XHRzUGF0aCA9IHNFeHByZXNzaW9uO1xuXHR9XG5cdGlmIChzUGF0aCkge1xuXHRcdGlmICgoc291cmNlIGFzIEN1c3RvbUFjdGlvbik/LnZpc2libGUpIHtcblx0XHRcdHNQYXRoID0gc1BhdGguc3Vic3RyaW5nKDEsIHNQYXRoLmxlbmd0aCAtIDEpO1xuXHRcdH1cblx0XHRpZiAoc1BhdGguaW5kZXhPZihcIi9cIikgPiAwKSB7XG5cdFx0XHQvL2NoZWNrIGlmIHRoZSBuYXZpZ2F0aW9uIHByb3BlcnR5IGlzIGNvcnJlY3Q6XG5cdFx0XHRjb25zdCBhU3BsaXRQYXRoID0gc1BhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0Y29uc3Qgc05hdmlnYXRpb25QYXRoID0gYVNwbGl0UGF0aFswXTtcblx0XHRcdGlmIChcblx0XHRcdFx0Y29udGV4dERhdGFNb2RlbE9iamVjdFBhdGg/LnRhcmdldE9iamVjdD8uX3R5cGUgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiZcblx0XHRcdFx0Y29udGV4dERhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0LnBhcnRuZXIgPT09IHNOYXZpZ2F0aW9uUGF0aFxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiBiaW5kaW5nRXhwcmVzc2lvbihhU3BsaXRQYXRoLnNsaWNlKDEpLmpvaW4oXCIvXCIpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBjb25zdGFudCh0cnVlKTtcblx0XHRcdH1cblx0XHRcdC8vIEluIGNhc2UgdGhlcmUgaXMgbm8gbmF2aWdhdGlvbiBwcm9wZXJ0eSwgaWYgaXQncyBhbiBlbnRpdHlTZXQsIHRoZSBleHByZXNzaW9uIGJpbmRpbmcgaGFzIHRvIGJlIHJldHVybmVkOlxuXHRcdH0gZWxzZSBpZiAoaXNFbnRpdHlTZXQpIHtcblx0XHRcdHJldHVybiBiaW5kaW5nRXhwcmVzc2lvbihzUGF0aCk7XG5cdFx0XHQvLyBvdGhlcndpc2UgdGhlIGV4cHJlc3Npb24gYmluZGluZyBjYW5ub3QgYmUgdGFrZW4gaW50byBhY2NvdW50IGZvciB0aGUgc2VsZWN0aW9uIG1vZGUgZXZhbHVhdGlvbjpcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGNvbnN0YW50KHRydWUpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gY29uc3RhbnQodHJ1ZSk7XG59XG5cbi8qKlxuICogTG9vcCB0aHJvdWdoIHRoZSBEYXRhRmllbGRGb3JBY3Rpb24gYW5kIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiBvZiBhIGxpbmUgaXRlbSBhbmQgY2hlY2tcbiAqIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGVtIGlzIGFsd2F5cyB2aXNpYmxlIGluIHRoZSB0YWJsZSB0b29sYmFyIChhbmQgcmVxdWlyZXMgYSBjb250ZXh0KS5cbiAqXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgZm9yIHJlcHJlc2VudGF0aW9uIGluIGEgdGFibGUgb3IgbGlzdFxuICogQHBhcmFtIGN1cnJlbnRFbnRpdHlUeXBlIEN1cnJlbnQgRW50aXR5IFR5cGVcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlcmUgaXMgYXQgbGVhc3QgMSBhY3Rpb24gdGhhdCBtZWV0cyB0aGUgY3JpdGVyaWFcbiAqL1xuZnVuY3Rpb24gaGFzQm91bmRBY3Rpb25zQWx3YXlzVmlzaWJsZUluVG9vbEJhcihsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLCBjdXJyZW50RW50aXR5VHlwZTogRW50aXR5VHlwZSk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gbGluZUl0ZW1Bbm5vdGF0aW9uLnNvbWUoKGRhdGFGaWVsZCkgPT4ge1xuXHRcdGlmIChcblx0XHRcdChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbiB8fFxuXHRcdFx0XHRkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbikgJiZcblx0XHRcdGRhdGFGaWVsZD8uSW5saW5lPy52YWx1ZU9mKCkgIT09IHRydWUgJiZcblx0XHRcdChkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSA9PT0gZmFsc2UgfHwgZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IHVuZGVmaW5lZClcblx0XHQpIHtcblx0XHRcdGlmIChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbikge1xuXHRcdFx0XHQvLyBDaGVjayBpZiB0aGUgbGluZUl0ZW0gY29udGV4dCBpcyB0aGUgc2FtZSBhcyB0aGF0IG9mIHRoZSBhY3Rpb246XG5cdFx0XHRcdHJldHVybiBkYXRhRmllbGQ/LkFjdGlvblRhcmdldD8uaXNCb3VuZCAmJiBjdXJyZW50RW50aXR5VHlwZSA9PT0gZGF0YUZpZWxkPy5BY3Rpb25UYXJnZXQuc291cmNlRW50aXR5VHlwZTtcblx0XHRcdH0gZWxzZSBpZiAoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24pIHtcblx0XHRcdFx0cmV0dXJuIGRhdGFGaWVsZC5SZXF1aXJlc0NvbnRleHQ7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIGhhc0N1c3RvbUFjdGlvbnNBbHdheXNWaXNpYmxlSW5Ub29sQmFyKG1hbmlmZXN0QWN0aW9uczogUmVjb3JkPHN0cmluZywgQ3VzdG9tQWN0aW9uPik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFuaWZlc3RBY3Rpb25zKS5zb21lKChhY3Rpb25LZXkpID0+IHtcblx0XHRjb25zdCBhY3Rpb24gPSBtYW5pZmVzdEFjdGlvbnNbYWN0aW9uS2V5XTtcblx0XHRpZiAoYWN0aW9uLnJlcXVpcmVzU2VsZWN0aW9uICYmIGFjdGlvbi52aXNpYmxlPy50b1N0cmluZygpID09PSBcInRydWVcIikge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSk7XG59XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciB0aGUgY3VzdG9tIGFjdGlvbnMgKHdpdGgga2V5IHJlcXVpcmVzU2VsZWN0aW9uKSBkZWNsYXJlZCBpbiB0aGUgbWFuaWZlc3QgZm9yIHRoZSBjdXJyZW50IGxpbmUgaXRlbSBhbmQgcmV0dXJucyBhbGwgdGhlXG4gKiB2aXNpYmxlIGtleSB2YWx1ZXMgYXMgYW4gZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gbWFuaWZlc3RBY3Rpb25zIFRoZSBhY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG4gKiBAcmV0dXJucyBBcnJheTxFeHByZXNzaW9uPGJvb2xlYW4+PiBBbGwgdGhlIHZpc2libGUgcGF0aCBleHByZXNzaW9ucyBvZiB0aGUgYWN0aW9ucyB0aGF0IG1lZXQgdGhlIGNyaXRlcmlhXG4gKi9cbmZ1bmN0aW9uIGdldFZpc2libGVFeHBGb3JDdXN0b21BY3Rpb25zUmVxdWlyaW5nQ29udGV4dChtYW5pZmVzdEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj4pOiBFeHByZXNzaW9uPGJvb2xlYW4+W10ge1xuXHRjb25zdCBhVmlzaWJsZVBhdGhFeHByZXNzaW9uczogRXhwcmVzc2lvbjxib29sZWFuPltdID0gW107XG5cdGlmIChtYW5pZmVzdEFjdGlvbnMpIHtcblx0XHRPYmplY3Qua2V5cyhtYW5pZmVzdEFjdGlvbnMpLmZvckVhY2goKGFjdGlvbktleSkgPT4ge1xuXHRcdFx0Y29uc3QgYWN0aW9uID0gbWFuaWZlc3RBY3Rpb25zW2FjdGlvbktleV07XG5cdFx0XHRpZiAoYWN0aW9uLnJlcXVpcmVzU2VsZWN0aW9uID09PSB0cnVlICYmIGFjdGlvbi52aXNpYmxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0aWYgKHR5cGVvZiBhY3Rpb24udmlzaWJsZSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdC8qVGhlIGZpbmFsIGFpbSB3b3VsZCBiZSB0byBjaGVjayBpZiB0aGUgcGF0aCBleHByZXNzaW9uIGRlcGVuZHMgb24gdGhlIHBhcmVudCBjb250ZXh0XG5cdFx0XHRcdFx0YW5kIGNvbnNpZGVycyBvbmx5IHRob3NlIGV4cHJlc3Npb25zIGZvciB0aGUgZXhwcmVzc2lvbiBldmFsdWF0aW9uLFxuXHRcdFx0XHRcdGJ1dCBjdXJyZW50bHkgbm90IHBvc3NpYmxlIGZyb20gdGhlIG1hbmlmZXN0IGFzIHRoZSB2aXNpYmxlIGtleSBpcyBib3VuZCBvbiB0aGUgcGFyZW50IGVudGl0eS5cblx0XHRcdFx0XHRUcmlja3kgdG8gZGlmZmVyZW50aWF0ZSB0aGUgcGF0aCBhcyBpdCdzIGRvbmUgZm9yIHRoZSBIaWRkZW4gYW5ub3RhdGlvbi5cblx0XHRcdFx0XHRGb3IgdGhlIHRpbWUgYmVpbmcgd2UgY29uc2lkZXIgYWxsIHRoZSBwYXRocyBvZiB0aGUgbWFuaWZlc3QqL1xuXG5cdFx0XHRcdFx0YVZpc2libGVQYXRoRXhwcmVzc2lvbnMucHVzaChyZXNvbHZlQmluZGluZ1N0cmluZyhhY3Rpb24/LnZpc2libGU/LnZhbHVlT2YoKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIGFWaXNpYmxlUGF0aEV4cHJlc3Npb25zO1xufVxuXG4vKipcbiAqIEV2YWx1YXRlIGlmIHRoZSBwYXRoIGlzIHN0YXRpY2FsbHkgZGVsZXRhYmxlIG9yIHVwZGF0YWJsZS5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMge1RhYmxlQ2FwYWJpbGl0eVJlc3RyaWN0aW9ufSBUaGUgdGFibGUgY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDYXBhYmlsaXR5UmVzdHJpY3Rpb24oY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IFRhYmxlQ2FwYWJpbGl0eVJlc3RyaWN0aW9uIHtcblx0Y29uc3QgaXNEZWxldGFibGUgPSBpc1BhdGhEZWxldGFibGUoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkpO1xuXHRjb25zdCBpc1VwZGF0YWJsZSA9IGlzUGF0aFVwZGF0YWJsZShjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSk7XG5cdHJldHVybiB7XG5cdFx0aXNEZWxldGFibGU6ICEoaXNDb25zdGFudChpc0RlbGV0YWJsZSkgJiYgaXNEZWxldGFibGUudmFsdWUgPT09IGZhbHNlKSxcblx0XHRpc1VwZGF0YWJsZTogIShpc0NvbnN0YW50KGlzVXBkYXRhYmxlKSAmJiBpc1VwZGF0YWJsZS52YWx1ZSA9PT0gZmFsc2UpXG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWxlY3Rpb25Nb2RlKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRpc0VudGl0eVNldDogYm9vbGVhbixcblx0dGFyZ2V0Q2FwYWJpbGl0aWVzOiBUYWJsZUNhcGFiaWxpdHlSZXN0cmljdGlvbixcblx0ZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24/OiBFeHByZXNzaW9uPGJvb2xlYW4+LFxuXHRtYXNzRWRpdFZpc2liaWxpdHlFeHByZXNzaW9uOiBFeHByZXNzaW9uPGJvb2xlYW4+ID0gY29uc3RhbnQoZmFsc2UpXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAoIWxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdHJldHVybiBTZWxlY3Rpb25Nb2RlLk5vbmU7XG5cdH1cblx0Y29uc3QgdGFibGVNYW5pZmVzdFNldHRpbmdzID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKTtcblx0bGV0IHNlbGVjdGlvbk1vZGUgPSB0YWJsZU1hbmlmZXN0U2V0dGluZ3MudGFibGVTZXR0aW5ncz8uc2VsZWN0aW9uTW9kZTtcblx0bGV0IGFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnM6IEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IFtdLFxuXHRcdGFWaXNpYmxlQmluZGluZ0V4cHJlc3Npb25zOiBFeHByZXNzaW9uPGJvb2xlYW4+W10gPSBbXTtcblx0Y29uc3QgbWFuaWZlc3RBY3Rpb25zID0gZ2V0QWN0aW9uc0Zyb21NYW5pZmVzdChcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpLmFjdGlvbnMsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRbXSxcblx0XHR1bmRlZmluZWQsXG5cdFx0ZmFsc2Vcblx0KTtcblx0bGV0IGlzUGFyZW50RGVsZXRhYmxlLCBwYXJlbnRFbnRpdHlTZXREZWxldGFibGU7XG5cdGlmIChjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuT2JqZWN0UGFnZSkge1xuXHRcdGlzUGFyZW50RGVsZXRhYmxlID0gaXNQYXRoRGVsZXRhYmxlKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKTtcblx0XHRwYXJlbnRFbnRpdHlTZXREZWxldGFibGUgPSBpc1BhcmVudERlbGV0YWJsZSA/IGNvbXBpbGVCaW5kaW5nKGlzUGFyZW50RGVsZXRhYmxlLCB0cnVlKSA6IGlzUGFyZW50RGVsZXRhYmxlO1xuXHR9XG5cblx0Y29uc3QgYk1hc3NFZGl0RW5hYmxlZDogYm9vbGVhbiA9ICFpc0NvbnN0YW50KG1hc3NFZGl0VmlzaWJpbGl0eUV4cHJlc3Npb24pIHx8IG1hc3NFZGl0VmlzaWJpbGl0eUV4cHJlc3Npb24udmFsdWUgIT09IGZhbHNlO1xuXHRpZiAoc2VsZWN0aW9uTW9kZSAmJiBzZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLk5vbmUgJiYgZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24pIHtcblx0XHRpZiAoY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLk9iamVjdFBhZ2UgJiYgYk1hc3NFZGl0RW5hYmxlZCkge1xuXHRcdFx0Ly8gTWFzcyBFZGl0IGluIE9QIGlzIGVuYWJsZWQgb25seSBpbiBlZGl0IG1vZGUuXG5cdFx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoXG5cdFx0XHRcdGlmRWxzZShcblx0XHRcdFx0XHRhbmQoVUkuSXNFZGl0YWJsZSwgbWFzc0VkaXRWaXNpYmlsaXR5RXhwcmVzc2lvbiksXG5cdFx0XHRcdFx0Y29uc3RhbnQoXCJNdWx0aVwiKSxcblx0XHRcdFx0XHRpZkVsc2UoZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24sIGNvbnN0YW50KFwiTXVsdGlcIiksIGNvbnN0YW50KFwiTm9uZVwiKSlcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKGJNYXNzRWRpdEVuYWJsZWQpIHtcblx0XHRcdHJldHVybiBTZWxlY3Rpb25Nb2RlLk11bHRpO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhpZkVsc2UoZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24sIGNvbnN0YW50KFwiTXVsdGlcIiksIGNvbnN0YW50KFwiTm9uZVwiKSkpO1xuXHR9XG5cdGlmICghc2VsZWN0aW9uTW9kZSB8fCBzZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLkF1dG8pIHtcblx0XHRzZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZS5NdWx0aTtcblx0fVxuXHRpZiAoYk1hc3NFZGl0RW5hYmxlZCkge1xuXHRcdC8vIE92ZXJyaWRlIGRlZmF1bHQgc2VsZWN0aW9uIG1vZGUgd2hlbiBtYXNzIGVkaXQgaXMgdmlzaWJsZVxuXHRcdHNlbGVjdGlvbk1vZGUgPSBzZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLlNpbmdsZSA/IFNlbGVjdGlvbk1vZGUuU2luZ2xlIDogU2VsZWN0aW9uTW9kZS5NdWx0aTtcblx0fVxuXG5cdGlmIChcblx0XHRoYXNCb3VuZEFjdGlvbnNBbHdheXNWaXNpYmxlSW5Ub29sQmFyKGxpbmVJdGVtQW5ub3RhdGlvbiwgY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCkpIHx8XG5cdFx0aGFzQ3VzdG9tQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIobWFuaWZlc3RBY3Rpb25zKVxuXHQpIHtcblx0XHRyZXR1cm4gc2VsZWN0aW9uTW9kZTtcblx0fVxuXHRhSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zID0gZ2V0VUlIaWRkZW5FeHBGb3JBY3Rpb25zUmVxdWlyaW5nQ29udGV4dChcblx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCksXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksXG5cdFx0aXNFbnRpdHlTZXRcblx0KTtcblx0YVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMgPSBnZXRWaXNpYmxlRXhwRm9yQ3VzdG9tQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQobWFuaWZlc3RBY3Rpb25zKTtcblxuXHQvLyBObyBhY3Rpb24gcmVxdWlyaW5nIGEgY29udGV4dDpcblx0aWYgKFxuXHRcdGFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMubGVuZ3RoID09PSAwICYmXG5cdFx0YVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMubGVuZ3RoID09PSAwICYmXG5cdFx0KGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uIHx8IGJNYXNzRWRpdEVuYWJsZWQpXG5cdCkge1xuXHRcdGlmICghaXNFbnRpdHlTZXQpIHtcblx0XHRcdC8vIEV4YW1wbGU6IE9QIGNhc2Vcblx0XHRcdGlmICh0YXJnZXRDYXBhYmlsaXRpZXMuaXNEZWxldGFibGUgfHwgcGFyZW50RW50aXR5U2V0RGVsZXRhYmxlICE9PSBcImZhbHNlXCIgfHwgYk1hc3NFZGl0RW5hYmxlZCkge1xuXHRcdFx0XHQvLyBCdWlsZGluZyBleHByZXNzaW9uIGZvciBkZWxldGUgYW5kIG1hc3MgZWRpdFxuXHRcdFx0XHRjb25zdCBidXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiA9IG9yKFxuXHRcdFx0XHRcdGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uIHx8IHRydWUsIC8vIGRlZmF1bHQgZGVsZXRlIHZpc2liaWxpdHkgYXMgdHJ1ZVxuXHRcdFx0XHRcdG1hc3NFZGl0VmlzaWJpbGl0eUV4cHJlc3Npb25cblx0XHRcdFx0KTtcblx0XHRcdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKFxuXHRcdFx0XHRcdGlmRWxzZShhbmQoVUkuSXNFZGl0YWJsZSwgYnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24pLCBjb25zdGFudChzZWxlY3Rpb25Nb2RlKSwgY29uc3RhbnQoU2VsZWN0aW9uTW9kZS5Ob25lKSlcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBTZWxlY3Rpb25Nb2RlLk5vbmU7XG5cdFx0XHR9XG5cdFx0XHQvLyBFbnRpdHlTZXQgZGVsZXRhYmxlOlxuXHRcdH0gZWxzZSBpZiAoYk1hc3NFZGl0RW5hYmxlZCkge1xuXHRcdFx0Ly8gZXhhbXBsZTogTFIgc2NlbmFyaW9cblx0XHRcdHJldHVybiBzZWxlY3Rpb25Nb2RlO1xuXHRcdH0gZWxzZSBpZiAodGFyZ2V0Q2FwYWJpbGl0aWVzLmlzRGVsZXRhYmxlICYmIGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uKSB7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoaWZFbHNlKGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uLCBjb25zdGFudChzZWxlY3Rpb25Nb2RlKSwgY29uc3RhbnQoXCJOb25lXCIpKSk7XG5cdFx0XHQvLyBFbnRpdHlTZXQgbm90IGRlbGV0YWJsZTpcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFNlbGVjdGlvbk1vZGUuTm9uZTtcblx0XHR9XG5cdFx0Ly8gVGhlcmUgYXJlIGFjdGlvbnMgcmVxdWlyaW5nIGEgY29udGV4dDpcblx0fSBlbHNlIGlmICghaXNFbnRpdHlTZXQpIHtcblx0XHQvLyBFeGFtcGxlOiBPUCBjYXNlXG5cdFx0aWYgKHRhcmdldENhcGFiaWxpdGllcy5pc0RlbGV0YWJsZSB8fCBwYXJlbnRFbnRpdHlTZXREZWxldGFibGUgIT09IFwiZmFsc2VcIiB8fCBiTWFzc0VkaXRFbmFibGVkKSB7XG5cdFx0XHQvLyBVc2Ugc2VsZWN0aW9uTW9kZSBpbiBlZGl0IG1vZGUgaWYgZGVsZXRlIGlzIGVuYWJsZWQgb3IgbWFzcyBlZGl0IGlzIHZpc2libGVcblx0XHRcdGNvbnN0IGVkaXRNb2RlYnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24gPSBpZkVsc2UoXG5cdFx0XHRcdGJNYXNzRWRpdEVuYWJsZWQgJiYgIXRhcmdldENhcGFiaWxpdGllcy5pc0RlbGV0YWJsZSxcblx0XHRcdFx0bWFzc0VkaXRWaXNpYmlsaXR5RXhwcmVzc2lvbixcblx0XHRcdFx0Y29uc3RhbnQodHJ1ZSlcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoXG5cdFx0XHRcdGlmRWxzZShcblx0XHRcdFx0XHRhbmQoVUkuSXNFZGl0YWJsZSwgZWRpdE1vZGVidXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiksXG5cdFx0XHRcdFx0Y29uc3RhbnQoc2VsZWN0aW9uTW9kZSksXG5cdFx0XHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRcdFx0b3IoLi4uYUhpZGRlbkJpbmRpbmdFeHByZXNzaW9ucy5jb25jYXQoYVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMpKSxcblx0XHRcdFx0XHRcdGNvbnN0YW50KHNlbGVjdGlvbk1vZGUpLFxuXHRcdFx0XHRcdFx0Y29uc3RhbnQoU2VsZWN0aW9uTW9kZS5Ob25lKVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKFxuXHRcdFx0XHRpZkVsc2UoXG5cdFx0XHRcdFx0b3IoLi4uYUhpZGRlbkJpbmRpbmdFeHByZXNzaW9ucy5jb25jYXQoYVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMpKSxcblx0XHRcdFx0XHRjb25zdGFudChzZWxlY3Rpb25Nb2RlKSxcblx0XHRcdFx0XHRjb25zdGFudChTZWxlY3Rpb25Nb2RlLk5vbmUpXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fVxuXHRcdC8vRW50aXR5U2V0IGRlbGV0YWJsZTpcblx0fSBlbHNlIGlmICh0YXJnZXRDYXBhYmlsaXRpZXMuaXNEZWxldGFibGUgfHwgYk1hc3NFZGl0RW5hYmxlZCkge1xuXHRcdC8vIEV4YW1wbGU6IExSIHNjZW5hcmlvXG5cdFx0cmV0dXJuIHNlbGVjdGlvbk1vZGU7XG5cdFx0Ly9FbnRpdHlTZXQgbm90IGRlbGV0YWJsZTpcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoXG5cdFx0XHRpZkVsc2UoXG5cdFx0XHRcdG9yKC4uLmFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMuY29uY2F0KGFWaXNpYmxlQmluZGluZ0V4cHJlc3Npb25zKSwgbWFzc0VkaXRWaXNpYmlsaXR5RXhwcmVzc2lvbiksXG5cdFx0XHRcdGNvbnN0YW50KHNlbGVjdGlvbk1vZGUpLFxuXHRcdFx0XHRjb25zdGFudChTZWxlY3Rpb25Nb2RlLk5vbmUpXG5cdFx0XHQpXG5cdFx0KTtcblx0fVxufVxuXG4vKipcbiAqIE1ldGhvZCB0byByZXRyaWV2ZSBhbGwgdGFibGUgYWN0aW9ucyBmcm9tIGFubm90YXRpb25zLlxuICpcbiAqIEBwYXJhbSBsaW5lSXRlbUFubm90YXRpb25cbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIHtSZWNvcmQ8QmFzZUFjdGlvbiwgQmFzZUFjdGlvbj59IFRoZSB0YWJsZSBhbm5vdGF0aW9uIGFjdGlvbnNcbiAqL1xuZnVuY3Rpb24gZ2V0VGFibGVBbm5vdGF0aW9uQWN0aW9ucyhsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLCB2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLCBjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KSB7XG5cdGNvbnN0IHRhYmxlQWN0aW9uczogQmFzZUFjdGlvbltdID0gW107XG5cdGNvbnN0IGhpZGRlblRhYmxlQWN0aW9uczogQmFzZUFjdGlvbltdID0gW107XG5cdGlmIChsaW5lSXRlbUFubm90YXRpb24pIHtcblx0XHRsaW5lSXRlbUFubm90YXRpb24uZm9yRWFjaCgoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKSA9PiB7XG5cdFx0XHRsZXQgdGFibGVBY3Rpb246IEFubm90YXRpb25BY3Rpb24gfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGlzRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3QoZGF0YUZpZWxkKSAmJlxuXHRcdFx0XHQhKGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbj8udmFsdWVPZigpID09PSB0cnVlKSAmJlxuXHRcdFx0XHQhZGF0YUZpZWxkLklubGluZSAmJlxuXHRcdFx0XHQhZGF0YUZpZWxkLkRldGVybWluaW5nXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29uc3Qga2V5ID0gS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpO1xuXHRcdFx0XHRzd2l0Y2ggKGRhdGFGaWVsZC4kVHlwZSkge1xuXHRcdFx0XHRcdGNhc2UgXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JBY3Rpb25cIjpcblx0XHRcdFx0XHRcdHRhYmxlQWN0aW9uID0ge1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBBY3Rpb25UeXBlLkRhdGFGaWVsZEZvckFjdGlvbixcblx0XHRcdFx0XHRcdFx0YW5ub3RhdGlvblBhdGg6IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChkYXRhRmllbGQuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdFx0XHRcdFx0a2V5OiBrZXksXG5cdFx0XHRcdFx0XHRcdHZpc2libGU6IGNvbXBpbGVCaW5kaW5nKFxuXHRcdFx0XHRcdFx0XHRcdG5vdChcblx0XHRcdFx0XHRcdFx0XHRcdGVxdWFsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhbm5vdGF0aW9uRXhwcmVzc2lvbihcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0W10sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0UmVsYXRpdmVNb2RlbFBhdGhGdW5jdGlvbigpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdGlzTmF2aWdhYmxlOiB0cnVlXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uXCI6XG5cdFx0XHRcdFx0XHR0YWJsZUFjdGlvbiA9IHtcblx0XHRcdFx0XHRcdFx0dHlwZTogQWN0aW9uVHlwZS5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24sXG5cdFx0XHRcdFx0XHRcdGFubm90YXRpb25QYXRoOiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgoZGF0YUZpZWxkLmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdFx0XHRcdGtleToga2V5LFxuXHRcdFx0XHRcdFx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhcblx0XHRcdFx0XHRcdFx0XHRub3QoXG5cdFx0XHRcdFx0XHRcdFx0XHRlcXVhbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0YW5ub3RhdGlvbkV4cHJlc3Npb24oXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFtdLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFJlbGF0aXZlTW9kZWxQYXRoRnVuY3Rpb24oKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbj8udmFsdWVPZigpID09PSB0cnVlKSB7XG5cdFx0XHRcdGhpZGRlblRhYmxlQWN0aW9ucy5wdXNoKHtcblx0XHRcdFx0XHR0eXBlOiBBY3Rpb25UeXBlLkRlZmF1bHQsXG5cdFx0XHRcdFx0a2V5OiBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZClcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGFibGVBY3Rpb24pIHtcblx0XHRcdFx0dGFibGVBY3Rpb25zLnB1c2godGFibGVBY3Rpb24pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0dGFibGVBY3Rpb25zOiB0YWJsZUFjdGlvbnMsXG5cdFx0aGlkZGVuVGFibGVBY3Rpb25zOiBoaWRkZW5UYWJsZUFjdGlvbnNcblx0fTtcbn1cblxuZnVuY3Rpb24gZ2V0SGlnaGxpZ2h0Um93QmluZGluZyhcblx0Y3JpdGljYWxpdHlBbm5vdGF0aW9uOiBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248Q3JpdGljYWxpdHlUeXBlPiB8IEVudW1WYWx1ZTxDcml0aWNhbGl0eVR5cGU+IHwgdW5kZWZpbmVkLFxuXHRpc0RyYWZ0Um9vdDogYm9vbGVhbixcblx0dGFyZ2V0RW50aXR5VHlwZT86IEVudGl0eVR5cGVcbik6IEV4cHJlc3Npb248TWVzc2FnZVR5cGU+IHtcblx0bGV0IGRlZmF1bHRIaWdobGlnaHRSb3dEZWZpbml0aW9uOiBNZXNzYWdlVHlwZSB8IEV4cHJlc3Npb248TWVzc2FnZVR5cGU+ID0gTWVzc2FnZVR5cGUuTm9uZTtcblx0aWYgKGNyaXRpY2FsaXR5QW5ub3RhdGlvbikge1xuXHRcdGlmICh0eXBlb2YgY3JpdGljYWxpdHlBbm5vdGF0aW9uID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRkZWZhdWx0SGlnaGxpZ2h0Um93RGVmaW5pdGlvbiA9IGFubm90YXRpb25FeHByZXNzaW9uKGNyaXRpY2FsaXR5QW5ub3RhdGlvbikgYXMgRXhwcmVzc2lvbjxNZXNzYWdlVHlwZT47XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIEVudW0gVmFsdWUgc28gd2UgZ2V0IHRoZSBjb3JyZXNwb25kaW5nIHN0YXRpYyBwYXJ0XG5cdFx0XHRkZWZhdWx0SGlnaGxpZ2h0Um93RGVmaW5pdGlvbiA9IGdldE1lc3NhZ2VUeXBlRnJvbUNyaXRpY2FsaXR5VHlwZShjcml0aWNhbGl0eUFubm90YXRpb24pO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IGFNaXNzaW5nS2V5czogYW55W10gPSBbXTtcblx0dGFyZ2V0RW50aXR5VHlwZT8ua2V5cy5mb3JFYWNoKChrZXk6IGFueSkgPT4ge1xuXHRcdGlmIChrZXkubmFtZSAhPT0gXCJJc0FjdGl2ZUVudGl0eVwiKSB7XG5cdFx0XHRhTWlzc2luZ0tleXMucHVzaChiaW5kaW5nRXhwcmVzc2lvbihrZXkubmFtZSwgdW5kZWZpbmVkKSk7XG5cdFx0fVxuXHR9KTtcblxuXHRyZXR1cm4gZm9ybWF0UmVzdWx0KFxuXHRcdFtcblx0XHRcdGRlZmF1bHRIaWdobGlnaHRSb3dEZWZpbml0aW9uLFxuXHRcdFx0YmluZGluZ0V4cHJlc3Npb24oYGZpbHRlcmVkTWVzc2FnZXNgLCBcImludGVybmFsXCIpLFxuXHRcdFx0aXNEcmFmdFJvb3QgJiYgRW50aXR5Lkhhc0FjdGl2ZSxcblx0XHRcdGlzRHJhZnRSb290ICYmIEVudGl0eS5Jc0FjdGl2ZSxcblx0XHRcdGAke2lzRHJhZnRSb290fWAsXG5cdFx0XHQuLi5hTWlzc2luZ0tleXNcblx0XHRdLFxuXHRcdHRhYmxlRm9ybWF0dGVycy5yb3dIaWdobGlnaHRpbmcsXG5cdFx0dGFyZ2V0RW50aXR5VHlwZVxuXHQpO1xufVxuXG5mdW5jdGlvbiBfZ2V0Q3JlYXRpb25CZWhhdmlvdXIoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0gfCB1bmRlZmluZWQsXG5cdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRuYXZpZ2F0aW9uU2V0dGluZ3M6IE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmdcbik6IFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb25bXCJjcmVhdGVcIl0ge1xuXHRjb25zdCBuYXZpZ2F0aW9uID0gbmF2aWdhdGlvblNldHRpbmdzPy5jcmVhdGUgfHwgbmF2aWdhdGlvblNldHRpbmdzPy5kZXRhaWw7XG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RTZXR0aW5nczogVGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpO1xuXHRjb25zdCBvcmlnaW5hbFRhYmxlU2V0dGluZ3MgPSAodGFibGVNYW5pZmVzdFNldHRpbmdzICYmIHRhYmxlTWFuaWZlc3RTZXR0aW5ncy50YWJsZVNldHRpbmdzKSB8fCB7fTtcblx0Ly8gY3Jvc3MtYXBwXG5cdGlmIChuYXZpZ2F0aW9uPy5vdXRib3VuZCAmJiBuYXZpZ2F0aW9uLm91dGJvdW5kRGV0YWlsICYmIG5hdmlnYXRpb25TZXR0aW5ncz8uY3JlYXRlKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG1vZGU6IFwiRXh0ZXJuYWxcIixcblx0XHRcdG91dGJvdW5kOiBuYXZpZ2F0aW9uLm91dGJvdW5kLFxuXHRcdFx0b3V0Ym91bmREZXRhaWw6IG5hdmlnYXRpb24ub3V0Ym91bmREZXRhaWwsXG5cdFx0XHRuYXZpZ2F0aW9uU2V0dGluZ3M6IG5hdmlnYXRpb25TZXR0aW5nc1xuXHRcdH07XG5cdH1cblxuXHRsZXQgbmV3QWN0aW9uO1xuXHRpZiAobGluZUl0ZW1Bbm5vdGF0aW9uKSB7XG5cdFx0Ly8gaW4tYXBwXG5cdFx0Y29uc3QgdGFyZ2V0QW5ub3RhdGlvbnMgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpPy5hbm5vdGF0aW9ucztcblx0XHRuZXdBY3Rpb24gPSB0YXJnZXRBbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdFJvb3Q/Lk5ld0FjdGlvbiB8fCB0YXJnZXRBbm5vdGF0aW9ucz8uU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZD8uTmV3QWN0aW9uO1xuXG5cdFx0aWYgKHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93ICYmIG5ld0FjdGlvbikge1xuXHRcdFx0Ly8gQSBjb21iaW5hdGlvbiBvZiAnQ3JlYXRpb25Sb3cnIGFuZCAnTmV3QWN0aW9uJyBkb2VzIG5vdCBtYWtlIHNlbnNlXG5cdFx0XHR0aHJvdyBFcnJvcihgQ3JlYXRpb24gbW9kZSAnJHtDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3d9JyBjYW4gbm90IGJlIHVzZWQgd2l0aCBhIGN1c3RvbSAnbmV3JyBhY3Rpb24gKCR7bmV3QWN0aW9ufSlgKTtcblx0XHR9XG5cdFx0aWYgKG5hdmlnYXRpb24/LnJvdXRlKSB7XG5cdFx0XHQvLyByb3V0ZSBzcGVjaWZpZWRcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG1vZGU6IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSxcblx0XHRcdFx0YXBwZW5kOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGVBdEVuZCxcblx0XHRcdFx0bmV3QWN0aW9uOiBuZXdBY3Rpb24/LnRvU3RyaW5nKCksXG5cdFx0XHRcdG5hdmlnYXRlVG9UYXJnZXQ6IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2UgPyBuYXZpZ2F0aW9uLnJvdXRlIDogdW5kZWZpbmVkIC8vIG5hdmlnYXRlIG9ubHkgaW4gTmV3UGFnZSBtb2RlXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXG5cdC8vIG5vIG5hdmlnYXRpb24gb3Igbm8gcm91dGUgc3BlY2lmaWVkIC0gZmFsbGJhY2sgdG8gaW5saW5lIGNyZWF0ZSBpZiBvcmlnaW5hbCBjcmVhdGlvbiBtb2RlIHdhcyAnTmV3UGFnZSdcblx0aWYgKHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2UpIHtcblx0XHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUgPSBDcmVhdGlvbk1vZGUuSW5saW5lO1xuXHRcdC8vIEluIGNhc2UgdGhlcmUgd2FzIG5vIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjcmVhdGVBdEVuZCB3ZSBmb3JjZSBpdCB0byBmYWxzZVxuXHRcdGlmIChvcmlnaW5hbFRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5jcmVhdGVBdEVuZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGVBdEVuZCA9IGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0bW9kZTogdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlLFxuXHRcdGFwcGVuZDogdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRlQXRFbmQsXG5cdFx0bmV3QWN0aW9uOiBuZXdBY3Rpb24/LnRvU3RyaW5nKClcblx0fTtcbn1cblxuY29uc3QgX2dldFJvd0NvbmZpZ3VyYXRpb25Qcm9wZXJ0eSA9IGZ1bmN0aW9uIChcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0bmF2aWdhdGlvblNldHRpbmdzOiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHR0YXJnZXRQYXRoOiBzdHJpbmdcbikge1xuXHRsZXQgcHJlc3NQcm9wZXJ0eSwgbmF2aWdhdGlvblRhcmdldDtcblx0bGV0IGNyaXRpY2FsaXR5UHJvcGVydHk6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxNZXNzYWdlVHlwZT4gPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHRjb25zdCB0YXJnZXRFbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCk7XG5cdGlmIChuYXZpZ2F0aW9uU2V0dGluZ3MgJiYgbGluZUl0ZW1Bbm5vdGF0aW9uKSB7XG5cdFx0bmF2aWdhdGlvblRhcmdldCA9IG5hdmlnYXRpb25TZXR0aW5ncy5kaXNwbGF5Py50YXJnZXQgfHwgbmF2aWdhdGlvblNldHRpbmdzLmRldGFpbD8ub3V0Ym91bmQ7XG5cdFx0aWYgKG5hdmlnYXRpb25UYXJnZXQpIHtcblx0XHRcdHByZXNzUHJvcGVydHkgPVxuXHRcdFx0XHRcIi5oYW5kbGVycy5vbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQoICRjb250cm9sbGVyICwnXCIgKyBuYXZpZ2F0aW9uVGFyZ2V0ICsgXCInLCAkeyRwYXJhbWV0ZXJzPmJpbmRpbmdDb250ZXh0fSlcIjtcblx0XHR9IGVsc2UgaWYgKHRhcmdldEVudGl0eVR5cGUpIHtcblx0XHRcdGNvbnN0IHRhcmdldEVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdFx0XHRuYXZpZ2F0aW9uVGFyZ2V0ID0gbmF2aWdhdGlvblNldHRpbmdzLmRldGFpbD8ucm91dGU7XG5cdFx0XHRpZiAobmF2aWdhdGlvblRhcmdldCkge1xuXHRcdFx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gZ2V0SGlnaGxpZ2h0Um93QmluZGluZyhcblx0XHRcdFx0XHRsaW5lSXRlbUFubm90YXRpb24uYW5ub3RhdGlvbnM/LlVJPy5Dcml0aWNhbGl0eSxcblx0XHRcdFx0XHQhIXRhcmdldEVudGl0eVNldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnRSb290IHx8ICEhdGFyZ2V0RW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdE5vZGUsXG5cdFx0XHRcdFx0dGFyZ2V0RW50aXR5VHlwZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRwcmVzc1Byb3BlcnR5ID1cblx0XHRcdFx0XHRcIkFQSS5vblRhYmxlUm93UHJlc3MoJGV2ZW50LCAkY29udHJvbGxlciwgJHskcGFyYW1ldGVycz5iaW5kaW5nQ29udGV4dH0sIHsgY2FsbEV4dGVuc2lvbjogdHJ1ZSwgdGFyZ2V0UGF0aDogJ1wiICtcblx0XHRcdFx0XHR0YXJnZXRQYXRoICtcblx0XHRcdFx0XHRcIicsIGVkaXRhYmxlIDogXCIgK1xuXHRcdFx0XHRcdCh0YXJnZXRFbnRpdHlTZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Um9vdCB8fCB0YXJnZXRFbnRpdHlTZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Tm9kZVxuXHRcdFx0XHRcdFx0PyBcIiEkeyRwYXJhbWV0ZXJzPmJpbmRpbmdDb250ZXh0fS5nZXRQcm9wZXJ0eSgnSXNBY3RpdmVFbnRpdHknKVwiXG5cdFx0XHRcdFx0XHQ6IFwidW5kZWZpbmVkXCIpICtcblx0XHRcdFx0XHRcIn0pXCI7IC8vTmVlZCB0byBhY2Nlc3MgdG8gRHJhZnRSb290IGFuZCBEcmFmdE5vZGUgISEhISEhIVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IGdldEhpZ2hsaWdodFJvd0JpbmRpbmcobGluZUl0ZW1Bbm5vdGF0aW9uLmFubm90YXRpb25zPy5VST8uQ3JpdGljYWxpdHksIGZhbHNlLCB0YXJnZXRFbnRpdHlUeXBlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Y29uc3Qgcm93TmF2aWdhdGVkRXhwcmVzc2lvbjogRXhwcmVzc2lvbjxib29sZWFuPiA9IGZvcm1hdFJlc3VsdChcblx0XHRbYmluZGluZ0V4cHJlc3Npb24oXCIvZGVlcGVzdFBhdGhcIiwgXCJpbnRlcm5hbFwiKV0sXG5cdFx0dGFibGVGb3JtYXR0ZXJzLm5hdmlnYXRlZFJvdyxcblx0XHR0YXJnZXRFbnRpdHlUeXBlXG5cdCk7XG5cdHJldHVybiB7XG5cdFx0cHJlc3M6IHByZXNzUHJvcGVydHksXG5cdFx0YWN0aW9uOiBwcmVzc1Byb3BlcnR5ID8gXCJOYXZpZ2F0aW9uXCIgOiB1bmRlZmluZWQsXG5cdFx0cm93SGlnaGxpZ2h0aW5nOiBjb21waWxlQmluZGluZyhjcml0aWNhbGl0eVByb3BlcnR5KSxcblx0XHRyb3dOYXZpZ2F0ZWQ6IGNvbXBpbGVCaW5kaW5nKHJvd05hdmlnYXRlZEV4cHJlc3Npb24pLFxuXHRcdHZpc2libGU6IGNvbXBpbGVCaW5kaW5nKG5vdChVSS5Jc0luYWN0aXZlKSlcblx0fTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGNvbHVtbnMgZnJvbSB0aGUgZW50aXR5VHlwZS5cbiAqXG4gKiBAcGFyYW0gY29sdW1uc1RvQmVDcmVhdGVkIFRoZSBjb2x1bW5zIHRvIGJlIGNyZWF0ZWQuXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgdGFyZ2V0IGVudGl0eSB0eXBlLlxuICogQHBhcmFtIGFubm90YXRpb25Db2x1bW5zIFRoZSBhcnJheSBvZiBjb2x1bW5zIGNyZWF0ZWQgYmFzZWQgb24gTGluZUl0ZW0gYW5ub3RhdGlvbnMuXG4gKiBAcGFyYW0gbm9uU29ydGFibGVDb2x1bW5zIFRoZSBhcnJheSBvZiBhbGwgbm9uIHNvcnRhYmxlIGNvbHVtbiBuYW1lcy5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGhlIHRhYmxlIHR5cGUuXG4gKiBAcmV0dXJucyB7QW5ub3RhdGlvblRhYmxlQ29sdW1uW119IFRoZSBjb2x1bW4gZnJvbSB0aGUgZW50aXR5VHlwZVxuICovXG5leHBvcnQgY29uc3QgZ2V0Q29sdW1uc0Zyb21FbnRpdHlUeXBlID0gZnVuY3Rpb24gKFxuXHRjb2x1bW5zVG9CZUNyZWF0ZWQ6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5Pixcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdID0gW10sXG5cdG5vblNvcnRhYmxlQ29sdW1uczogc3RyaW5nW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlXG4pOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSB7XG5cdGNvbnN0IHRhYmxlQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10gPSBbXTtcblx0Ly8gQ2F0Y2ggYWxyZWFkeSBleGlzdGluZyBjb2x1bW5zIC0gd2hpY2ggd2VyZSBhZGRlZCBiZWZvcmUgYnkgTGluZUl0ZW0gQW5ub3RhdGlvbnNcblx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cblx0ZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5OiBQcm9wZXJ0eSkgPT4ge1xuXHRcdC8vIENhdGNoIGFscmVhZHkgZXhpc3RpbmcgY29sdW1ucyAtIHdoaWNoIHdlcmUgYWRkZWQgYmVmb3JlIGJ5IExpbmVJdGVtIEFubm90YXRpb25zXG5cdFx0Y29uc3QgZXhpc3RzID0gYW5ub3RhdGlvbkNvbHVtbnMuc29tZSgoY29sdW1uKSA9PiB7XG5cdFx0XHRyZXR1cm4gY29sdW1uLm5hbWUgPT09IHByb3BlcnR5Lm5hbWU7XG5cdFx0fSk7XG5cblx0XHQvLyBpZiB0YXJnZXQgdHlwZSBleGlzdHMsIGl0IGlzIGEgY29tcGxleCBwcm9wZXJ0eSBhbmQgc2hvdWxkIGJlIGlnbm9yZWRcblx0XHRpZiAoIXByb3BlcnR5LnRhcmdldFR5cGUgJiYgIWV4aXN0cykge1xuXHRcdFx0Y29uc3QgcmVsYXRlZFByb3BlcnRpZXNJbmZvOiBDb21wbGV4UHJvcGVydHlJbmZvID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzKFxuXHRcdFx0XHRwcm9wZXJ0eS5uYW1lLFxuXHRcdFx0XHRwcm9wZXJ0eSxcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0dGFibGVUeXBlXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgcmVsYXRlZFByb3BlcnR5TmFtZXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXMpO1xuXHRcdFx0Y29uc3QgYWRkaXRpb25hbFByb3BlcnR5TmFtZXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXNJbmZvLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKTtcblx0XHRcdGNvbnN0IGNvbHVtbkluZm8gPSBnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5KFxuXHRcdFx0XHRwcm9wZXJ0eSxcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKHByb3BlcnR5LmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdHByb3BlcnR5Lm5hbWUsXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdG5vblNvcnRhYmxlQ29sdW1ucyxcblx0XHRcdFx0YWdncmVnYXRpb25IZWxwZXIsXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdCk7XG5cblx0XHRcdGNvbnN0IHNlbWFudGljS2V5cyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbnNCeVRlcm0oXCJDb21tb25cIiwgQ29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljS2V5LCBbXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpXG5cdFx0XHRdKVswXTtcblx0XHRcdGNvbnN0IG9Db2x1bW5EcmFmdEluZGljYXRvciA9IGdldERlZmF1bHREcmFmdEluZGljYXRvckZvckNvbHVtbihjb2x1bW5JbmZvLm5hbWUsIHNlbWFudGljS2V5cywgZmFsc2UsIG51bGwpO1xuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9Db2x1bW5EcmFmdEluZGljYXRvcikubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb2x1bW5JbmZvLmZvcm1hdE9wdGlvbnMgPSB7XG5cdFx0XHRcdFx0Li4ub0NvbHVtbkRyYWZ0SW5kaWNhdG9yXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHRpZiAocmVsYXRlZFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb2x1bW5JbmZvLnByb3BlcnR5SW5mb3MgPSByZWxhdGVkUHJvcGVydHlOYW1lcztcblx0XHRcdFx0Y29sdW1uSW5mby5leHBvcnRTZXR0aW5ncyA9IHtcblx0XHRcdFx0XHQuLi5jb2x1bW5JbmZvLmV4cG9ydFNldHRpbmdzLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3NUZW1wbGF0ZSxcblx0XHRcdFx0XHR3cmFwOiByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3NXcmFwcGluZ1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb2x1bW5JbmZvLmV4cG9ydFNldHRpbmdzLnR5cGUgPSBfZ2V0RXhwb3J0RGF0YVR5cGUocHJvcGVydHkudHlwZSwgcmVsYXRlZFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMSk7XG5cblx0XHRcdFx0aWYgKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRVbml0TmFtZSkge1xuXHRcdFx0XHRcdGNvbHVtbkluZm8uZXhwb3J0U2V0dGluZ3MudW5pdFByb3BlcnR5ID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFVuaXROYW1lO1xuXHRcdFx0XHRcdGNvbHVtbkluZm8uZXhwb3J0U2V0dGluZ3MudHlwZSA9IFwiQ3VycmVuY3lcIjsgLy8gRm9yY2UgdG8gYSBjdXJyZW5jeSBiZWNhdXNlIHRoZXJlJ3MgYSB1bml0UHJvcGVydHkgKG90aGVyd2lzZSB0aGUgdmFsdWUgaXNuJ3QgcHJvcGVybHkgZm9ybWF0dGVkIHdoZW4gZXhwb3J0ZWQpXG5cdFx0XHRcdH0gZWxzZSBpZiAocmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFVuaXRTdHJpbmcpIHtcblx0XHRcdFx0XHRjb2x1bW5JbmZvLmV4cG9ydFNldHRpbmdzLnVuaXQgPSByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0VW5pdFN0cmluZztcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFRpbWV6b25lTmFtZSkge1xuXHRcdFx0XHRcdGNvbHVtbkluZm8uZXhwb3J0U2V0dGluZ3MudGltZXpvbmVQcm9wZXJ0eSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRUaW1lem9uZU5hbWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAocmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFRpbWV6b25lU3RyaW5nKSB7XG5cdFx0XHRcdFx0Y29sdW1uSW5mby5leHBvcnRTZXR0aW5ncy50aW1lem9uZSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRUaW1lem9uZVN0cmluZztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENvbGxlY3QgaW5mb3JtYXRpb24gb2YgcmVsYXRlZCBjb2x1bW5zIHRvIGJlIGNyZWF0ZWQuXG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmZvckVhY2goKG5hbWUpID0+IHtcblx0XHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbbmFtZV0gPSByZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1tuYW1lXTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChhZGRpdGlvbmFsUHJvcGVydHlOYW1lcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNvbHVtbkluZm8uYWRkaXRpb25hbFByb3BlcnR5SW5mb3MgPSBhZGRpdGlvbmFsUHJvcGVydHlOYW1lcztcblx0XHRcdFx0Ly8gQ3JlYXRlIGNvbHVtbnMgZm9yIGFkZGl0aW9uYWwgcHJvcGVydGllcyBpZGVudGlmaWVkIGZvciBBTFAgdXNlIGNhc2UuXG5cdFx0XHRcdGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzLmZvckVhY2goKG5hbWUpID0+IHtcblx0XHRcdFx0XHQvLyBJbnRlbnRpb25hbCBvdmVyd3JpdGUgYXMgd2UgcmVxdWlyZSBvbmx5IG9uZSBuZXcgUHJvcGVydHlJbmZvIGZvciBhIHJlbGF0ZWQgUHJvcGVydHkuXG5cdFx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW25hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmFkZGl0aW9uYWxQcm9wZXJ0aWVzW25hbWVdO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdHRhYmxlQ29sdW1ucy5wdXNoKGNvbHVtbkluZm8pO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiB0YWJsZUNvbHVtbnM7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIGNvbHVtbiBkZWZpbml0aW9uIGZyb20gYSBwcm9wZXJ0eS5cbiAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IEVudGl0eSB0eXBlIHByb3BlcnR5IGZvciB3aGljaCB0aGUgY29sdW1uIGlzIGNyZWF0ZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBmdWxsUHJvcGVydHlQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHRhcmdldCBwcm9wZXJ0eVxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlUGF0aCBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgdGFyZ2V0IHByb3BlcnR5IGJhc2VkIG9uIHRoZSBjb250ZXh0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IHVzZURhdGFGaWVsZFByZWZpeCBTaG91bGQgYmUgcHJlZml4ZWQgd2l0aCBcIkRhdGFGaWVsZDo6XCIsIGVsc2UgaXQgd2lsbCBiZSBwcmVmaXhlZCB3aXRoIFwiUHJvcGVydHk6OlwiXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGF2YWlsYWJsZUZvckFkYXB0YXRpb24gRGVjaWRlcyB3aGV0aGVyIHRoZSBjb2x1bW4gc2hvdWxkIGJlIGF2YWlsYWJsZSBmb3IgYWRhcHRhdGlvblxuICogQHBhcmFtIHtzdHJpbmdbXX0gbm9uU29ydGFibGVDb2x1bW5zIFRoZSBhcnJheSBvZiBhbGwgbm9uLXNvcnRhYmxlIGNvbHVtbiBuYW1lc1xuICogQHBhcmFtIHtBZ2dyZWdhdGlvbkhlbHBlcn0gYWdncmVnYXRpb25IZWxwZXIgVGhlIGFnZ3JlZ2F0aW9uSGVscGVyIGZvciB0aGUgZW50aXR5XG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyB7QW5ub3RhdGlvblRhYmxlQ29sdW1ufSBUaGUgYW5ub3RhdGlvbiBjb2x1bW4gZGVmaW5pdGlvblxuICovXG5jb25zdCBnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5ID0gZnVuY3Rpb24gKFxuXHRwcm9wZXJ0eTogUHJvcGVydHksXG5cdGZ1bGxQcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmcsXG5cdHVzZURhdGFGaWVsZFByZWZpeDogYm9vbGVhbixcblx0YXZhaWxhYmxlRm9yQWRhcHRhdGlvbjogYm9vbGVhbixcblx0bm9uU29ydGFibGVDb2x1bW5zOiBzdHJpbmdbXSxcblx0YWdncmVnYXRpb25IZWxwZXI6IEFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4ge1xuXHRjb25zdCBuYW1lID0gdXNlRGF0YUZpZWxkUHJlZml4ID8gcmVsYXRpdmVQYXRoIDogXCJQcm9wZXJ0eTo6XCIgKyByZWxhdGl2ZVBhdGg7XG5cdGNvbnN0IGtleSA9ICh1c2VEYXRhRmllbGRQcmVmaXggPyBcIkRhdGFGaWVsZDo6XCIgOiBcIlByb3BlcnR5OjpcIikgKyByZXBsYWNlU3BlY2lhbENoYXJzKHJlbGF0aXZlUGF0aCk7XG5cdGNvbnN0IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGggPSBnZXRTZW1hbnRpY09iamVjdFBhdGgoY29udmVydGVyQ29udGV4dCwgcHJvcGVydHkpO1xuXHRjb25zdCBpc0hpZGRlbiA9IHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IHRydWU7XG5cdGNvbnN0IGdyb3VwUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkID0gcHJvcGVydHkubmFtZSA/IF9zbGljZUF0U2xhc2gocHJvcGVydHkubmFtZSwgdHJ1ZSwgZmFsc2UpIDogdW5kZWZpbmVkO1xuXHRjb25zdCBpc0dyb3VwOiBib29sZWFuID0gZ3JvdXBQYXRoICE9IHByb3BlcnR5Lm5hbWU7XG5cdGNvbnN0IGlzRGF0YVBvaW50RmFrZVByb3BlcnR5OiBib29sZWFuID0gbmFtZS5pbmRleE9mKFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFQb2ludFwiKSA+IC0xO1xuXHRjb25zdCBleHBvcnRUeXBlOiBzdHJpbmcgPSBfZ2V0RXhwb3J0RGF0YVR5cGUocHJvcGVydHkudHlwZSk7XG5cdGNvbnN0IHNEYXRlSW5wdXRGb3JtYXQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHByb3BlcnR5LnR5cGUgPT09IFwiRWRtLkRhdGVcIiA/IFwiWVlZWS1NTS1ERFwiIDogdW5kZWZpbmVkO1xuXHRjb25zdCBkYXRhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gZ2V0RGF0YUZpZWxkRGF0YVR5cGUocHJvcGVydHkpO1xuXHRjb25zdCBwcm9wZXJ0eVR5cGVDb25maWcgPSAhaXNEYXRhUG9pbnRGYWtlUHJvcGVydHkgPyBnZXRUeXBlQ29uZmlnKHByb3BlcnR5LCBkYXRhVHlwZSkgOiB1bmRlZmluZWQ7XG5cdGNvbnN0IHNlbWFudGljS2V5czogU2VtYW50aWNLZXkgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25zQnlUZXJtKFwiQ29tbW9uXCIsIENvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY0tleSwgW1xuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpXG5cdF0pWzBdO1xuXHRjb25zdCBzb3J0YWJsZSA9ICFpc0hpZGRlbiAmJiBub25Tb3J0YWJsZUNvbHVtbnMuaW5kZXhPZihyZWxhdGl2ZVBhdGgpID09PSAtMSAmJiAhaXNEYXRhUG9pbnRGYWtlUHJvcGVydHk7XG5cdGNvbnN0IG9UeXBlQ29uZmlnID0gIWlzRGF0YVBvaW50RmFrZVByb3BlcnR5XG5cdFx0PyB7XG5cdFx0XHRcdGNsYXNzTmFtZTogcHJvcGVydHkudHlwZSB8fCBkYXRhVHlwZSxcblx0XHRcdFx0b0Zvcm1hdE9wdGlvbnM6IHByb3BlcnR5VHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zLFxuXHRcdFx0XHRvQ29uc3RyYWludHM6IHByb3BlcnR5VHlwZUNvbmZpZy5jb25zdHJhaW50c1xuXHRcdCAgfVxuXHRcdDogdW5kZWZpbmVkO1xuXHRjb25zdCBleHBvcnRTZXR0aW5nczogYW55ID0gaXNEYXRhUG9pbnRGYWtlUHJvcGVydHlcblx0XHQ/IHtcblx0XHRcdFx0dGVtcGxhdGU6IGdldFRhcmdldFZhbHVlT25EYXRhUG9pbnQocHJvcGVydHkpXG5cdFx0ICB9XG5cdFx0OiB7XG5cdFx0XHRcdHR5cGU6IGV4cG9ydFR5cGUsXG5cdFx0XHRcdGlucHV0Rm9ybWF0OiBzRGF0ZUlucHV0Rm9ybWF0LFxuXHRcdFx0XHRzY2FsZTogcHJvcGVydHkuc2NhbGUsXG5cdFx0XHRcdGRlbGltaXRlcjogcHJvcGVydHkudHlwZSA9PT0gXCJFZG0uSW50NjRcIiA/IHRydWUgOiBmYWxzZVxuXHRcdCAgfTtcblxuXHRpZiAoIWlzRGF0YVBvaW50RmFrZVByb3BlcnR5KSB7XG5cdFx0Y29uc3Qgb1VuaXRQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5KHByb3BlcnR5KSB8fCBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KHByb3BlcnR5KTtcblx0XHRjb25zdCBvVGltZXpvbmVQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5KHByb3BlcnR5KTtcblx0XHRjb25zdCBzVW5pdFRleHQgPSBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeSB8fCBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5Vbml0O1xuXHRcdGNvbnN0IHNUaW1lem9uZVRleHQgPSBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGltZXpvbmU7XG5cdFx0aWYgKG9Vbml0UHJvcGVydHkpIHtcblx0XHRcdGV4cG9ydFNldHRpbmdzLnVuaXRQcm9wZXJ0eSA9IG9Vbml0UHJvcGVydHkubmFtZTtcblx0XHRcdGV4cG9ydFNldHRpbmdzLnR5cGUgPSBcIkN1cnJlbmN5XCI7IC8vIEZvcmNlIHRvIGEgY3VycmVuY3kgYmVjYXVzZSB0aGVyZSdzIGEgdW5pdFByb3BlcnR5IChvdGhlcndpc2UgdGhlIHZhbHVlIGlzbid0IHByb3Blcmx5IGZvcm1hdHRlZCB3aGVuIGV4cG9ydGVkKVxuXHRcdH0gZWxzZSBpZiAoc1VuaXRUZXh0KSB7XG5cdFx0XHRleHBvcnRTZXR0aW5ncy51bml0ID0gYCR7c1VuaXRUZXh0fWA7XG5cdFx0fVxuXHRcdGlmIChvVGltZXpvbmVQcm9wZXJ0eSkge1xuXHRcdFx0ZXhwb3J0U2V0dGluZ3MudGltZXpvbmVQcm9wZXJ0eSA9IG9UaW1lem9uZVByb3BlcnR5Lm5hbWU7XG5cdFx0fSBlbHNlIGlmIChzVGltZXpvbmVUZXh0KSB7XG5cdFx0XHRleHBvcnRTZXR0aW5ncy50aW1lem9uZSA9IHNUaW1lem9uZVRleHQudG9TdHJpbmcoKTtcblx0XHR9XG5cdH1cblxuXHRjb25zdCBvQ29sdW1uOiBhbnkgPSB7XG5cdFx0a2V5OiBrZXksXG5cdFx0dHlwZTogQ29sdW1uVHlwZS5Bbm5vdGF0aW9uLFxuXHRcdGxhYmVsOiBfZ2V0TGFiZWwocHJvcGVydHksIGlzR3JvdXApLFxuXHRcdGdyb3VwTGFiZWw6IGlzR3JvdXAgPyBfZ2V0TGFiZWwocHJvcGVydHkpIDogbnVsbCxcblx0XHRncm91cDogaXNHcm91cCA/IGdyb3VwUGF0aCA6IG51bGwsXG5cdFx0YW5ub3RhdGlvblBhdGg6IGZ1bGxQcm9wZXJ0eVBhdGgsXG5cdFx0c2VtYW50aWNPYmplY3RQYXRoOiBzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoLFxuXHRcdC8vIEEgZmFrZSBwcm9wZXJ0eSB3YXMgY3JlYXRlZCBmb3IgdGhlIFRhcmdldFZhbHVlIHVzZWQgb24gRGF0YVBvaW50cywgdGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgaGlkZGVuIGFuZCBub24gc29ydGFibGVcblx0XHRhdmFpbGFiaWxpdHk6XG5cdFx0XHQhYXZhaWxhYmxlRm9yQWRhcHRhdGlvbiB8fCBpc0hpZGRlbiB8fCBpc0RhdGFQb2ludEZha2VQcm9wZXJ0eSA/IEF2YWlsYWJpbGl0eVR5cGUuSGlkZGVuIDogQXZhaWxhYmlsaXR5VHlwZS5BZGFwdGF0aW9uLFxuXHRcdG5hbWU6IG5hbWUsXG5cdFx0cmVsYXRpdmVQYXRoOiBpc0RhdGFQb2ludEZha2VQcm9wZXJ0eVxuXHRcdFx0PyAocHJvcGVydHkgYXMgYW55KS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQ/LlRhcmdldD8uJHRhcmdldD8uVmFsdWU/LnBhdGggfHwgKHByb3BlcnR5IGFzIGFueSkuVmFsdWUucGF0aFxuXHRcdFx0OiByZWxhdGl2ZVBhdGgsXG5cdFx0c29ydGFibGU6IHNvcnRhYmxlLFxuXHRcdGlzR3JvdXBhYmxlOiBhZ2dyZWdhdGlvbkhlbHBlci5pc0FuYWx5dGljc1N1cHBvcnRlZCgpID8gYWdncmVnYXRpb25IZWxwZXIuaXNQcm9wZXJ0eUdyb3VwYWJsZShwcm9wZXJ0eSkgOiBzb3J0YWJsZSxcblx0XHRpc0tleTogcHJvcGVydHkuaXNLZXksXG5cdFx0aXNEYXRhUG9pbnRGYWtlVGFyZ2V0UHJvcGVydHk6IGlzRGF0YVBvaW50RmFrZVByb3BlcnR5LFxuXHRcdGV4cG9ydFNldHRpbmdzOiBleHBvcnRTZXR0aW5ncyxcblx0XHRjYXNlU2Vuc2l0aXZlOiBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUoY29udmVydGVyQ29udGV4dCksXG5cdFx0dHlwZUNvbmZpZzogb1R5cGVDb25maWcsXG5cdFx0dmlzdWFsU2V0dGluZ3M6IGlzRGF0YVBvaW50RmFrZVByb3BlcnR5ID8geyB3aWR0aENhbGN1bGF0aW9uOiBudWxsIH0gOiB1bmRlZmluZWQsXG5cdFx0aW1wb3J0YW5jZTogZ2V0SW1wb3J0YW5jZSgocHJvcGVydHkgYXMgYW55KS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQsIHNlbWFudGljS2V5cylcblx0fTtcblx0Y29uc3Qgc1Rvb2x0aXAgPSBfZ2V0VG9vbHRpcChwcm9wZXJ0eSk7XG5cdGlmIChzVG9vbHRpcCkge1xuXHRcdG9Db2x1bW4udG9vbHRpcCA9IHNUb29sdGlwO1xuXHR9XG5cblx0cmV0dXJuIG9Db2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIEJvb2xlYW4gdHJ1ZSBmb3IgdmFsaWQgY29sdW1ucywgZmFsc2UgZm9yIGludmFsaWQgY29sdW1ucy5cbiAqXG4gKiBAcGFyYW0ge0RhdGFGaWVsZEFic3RyYWN0VHlwZXN9IGRhdGFGaWVsZCBEaWZmZXJlbnQgRGF0YUZpZWxkIHR5cGVzIGRlZmluZWQgaW4gdGhlIGFubm90YXRpb25zXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBmb3IgdmFsaWQgY29sdW1ucywgZmFsc2UgZm9yIGludmFsaWQgY29sdW1uc1xuICogQHByaXZhdGVcbiAqL1xuY29uc3QgX2lzVmFsaWRDb2x1bW4gPSBmdW5jdGlvbiAoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKSB7XG5cdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRyZXR1cm4gISFkYXRhRmllbGQuSW5saW5lO1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdGRlZmF1bHQ6XG5cdFx0Ly8gVG9kbzogUmVwbGFjZSB3aXRoIHByb3BlciBMb2cgc3RhdGVtZW50IG9uY2UgYXZhaWxhYmxlXG5cdFx0Ly8gIHRocm93IG5ldyBFcnJvcihcIlVuaGFuZGxlZCBEYXRhRmllbGQgQWJzdHJhY3QgdHlwZTogXCIgKyBkYXRhRmllbGQuJFR5cGUpO1xuXHR9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiB0byBldmFsdWF0ZSB0aGUgdmlzaWJpbGl0eSBvZiBhIERhdGFGaWVsZCBvciBEYXRhUG9pbnQgYW5ub3RhdGlvbi5cbiAqXG4gKiBTQVAgRmlvcmkgZWxlbWVudHMgd2lsbCBldmFsdWF0ZSBlaXRoZXIgdGhlIFVJLkhpZGRlbiBhbm5vdGF0aW9uIGRlZmluZWQgb24gdGhlIGFubm90YXRpb24gaXRzZWxmIG9yIG9uIHRoZSB0YXJnZXQgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtEYXRhTW9kZWxPYmplY3RQYXRofSBkYXRhRmllbGRNb2RlbFBhdGggVGhlIG1ldGFwYXRoIHJlZmVycmluZyB0byB0aGUgYW5ub3RhdGlvbiB0aGF0IGlzIGV2YWx1YXRlZCBieSBTQVAgRmlvcmkgZWxlbWVudHMuXG4gKiBAcGFyYW0ge29iamVjdH0gW2Zvcm1hdE9wdGlvbnNdIEZvcm1hdE9wdGlvbnMgb3B0aW9uYWwuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGZvcm1hdE9wdGlvbnMuaXNBbmFseXRpY3MgVGhpcyBmbGFnIGlzIHVzZWQgdG8gY2hlY2sgaWYgdGhlIGFuYWx5dGljIHRhYmxlIGhhcyBHcm91cEhlYWRlciBleHBhbmRlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldHVybkV4cHJlc3Npb25dIFJldHVybkV4cHJlc3Npb24gb3B0aW9uYWwuXG4gKiBAcmV0dXJucyB7QmluZGluZ0V4cHJlc3Npb248c3RyaW5nPn0gQW4gZXhwcmVzc2lvbiB0aGF0IHlvdSBjYW4gYmluZCB0byB0aGUgVUkuXG4gKi9cbmV4cG9ydCBjb25zdCBfZ2V0VmlzaWJsZUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoXG5cdGRhdGFGaWVsZE1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0Zm9ybWF0T3B0aW9ucz86IGFueSxcblx0cmV0dXJuRXhwcmVzc2lvbjogYm9vbGVhbiA9IGZhbHNlXG4pOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0Y29uc3QgdGFyZ2V0T2JqZWN0OiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgRGF0YVBvaW50VHlwZVR5cGVzID0gZGF0YUZpZWxkTW9kZWxQYXRoLnRhcmdldE9iamVjdDtcblx0bGV0IHByb3BlcnR5VmFsdWU7XG5cdGlmICh0YXJnZXRPYmplY3QpIHtcblx0XHRzd2l0Y2ggKHRhcmdldE9iamVjdC4kVHlwZSkge1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZTpcblx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IHRhcmdldE9iamVjdC5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRcdFx0Ly8gaWYgaXQgaXMgYSBEYXRhRmllbGRGb3JBbm5vdGF0aW9uIHBvaW50aW5nIHRvIGEgRGF0YVBvaW50IHdlIGxvb2sgYXQgdGhlIGRhdGFQb2ludCdzIHZhbHVlXG5cdFx0XHRcdGlmICh0YXJnZXRPYmplY3Q/LlRhcmdldD8uJHRhcmdldD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGUpIHtcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdGFyZ2V0T2JqZWN0LlRhcmdldC4kdGFyZ2V0Py5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjpcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHByb3BlcnR5VmFsdWUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdGNvbnN0IGlzQW5hbHl0aWNhbEdyb3VwSGVhZGVyRXhwYW5kZWQgPSBmb3JtYXRPcHRpb25zPy5pc0FuYWx5dGljcyA/IFVJLklzRXhwYW5kZWQgOiBjb25zdGFudChmYWxzZSk7XG5cdGNvbnN0IGlzQW5hbHl0aWNhbExlYWYgPSBmb3JtYXRPcHRpb25zPy5pc0FuYWx5dGljcyA/IGVxdWFsKFVJLk5vZGVMZXZlbCwgMCkgOiBjb25zdGFudChmYWxzZSk7XG5cblx0Ly8gQSBkYXRhIGZpZWxkIGlzIHZpc2libGUgaWY6XG5cdC8vIC0gdGhlIFVJLkhpZGRlbiBleHByZXNzaW9uIGluIHRoZSBvcmlnaW5hbCBhbm5vdGF0aW9uIGRvZXMgbm90IGV2YWx1YXRlIHRvICd0cnVlJ1xuXHQvLyAtIHRoZSBVSS5IaWRkZW4gZXhwcmVzc2lvbiBpbiB0aGUgdGFyZ2V0IHByb3BlcnR5IGRvZXMgbm90IGV2YWx1YXRlIHRvICd0cnVlJ1xuXHQvLyAtIGluIGNhc2Ugb2YgQW5hbHl0aWNzIGl0J3Mgbm90IHZpc2libGUgZm9yIGFuIGV4cGFuZGVkIEdyb3VwSGVhZGVyXG5cdGNvbnN0IGV4cHJlc3Npb24gPSBhbmQoXG5cdFx0Li4uW1xuXHRcdFx0bm90KGVxdWFsKGFubm90YXRpb25FeHByZXNzaW9uKHRhcmdldE9iamVjdD8uYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4pLCB0cnVlKSksXG5cdFx0XHRpZkVsc2UoISFwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eVZhbHVlICYmIG5vdChlcXVhbChhbm5vdGF0aW9uRXhwcmVzc2lvbihwcm9wZXJ0eVZhbHVlLmFubm90YXRpb25zPy5VST8uSGlkZGVuKSwgdHJ1ZSkpLCB0cnVlKSxcblx0XHRcdG9yKG5vdChpc0FuYWx5dGljYWxHcm91cEhlYWRlckV4cGFuZGVkKSwgaXNBbmFseXRpY2FsTGVhZilcblx0XHRdXG5cdCk7XG5cdHJldHVybiByZXR1cm5FeHByZXNzaW9uID8gKGV4cHJlc3Npb24gYXMgYW55IGFzIEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4pIDogY29tcGlsZUJpbmRpbmcoZXhwcmVzc2lvbik7XG59O1xuXG4vKipcbiAqIFJldHVybnMgaGlkZGVuIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIGEgZmllbGQgZ3JvdXAuXG4gKiBAcGFyYW0ge0RhdGFGaWVsZEFic3RyYWN0VHlwZXN9IGRhdGFGaWVsZEdyb3VwIERhdGFGaWVsZCBkZWZpbmVkIGluIHRoZSBhbm5vdGF0aW9uc1xuICogQHBhcmFtIHtvYmplY3R9IGZpZWxkRm9ybWF0T3B0aW9ucyBGb3JtYXRPcHRpb25zIG9wdGlvbmFsLlxuICogQHBhcmFtIHtib29sZWFufSBmaWVsZEZvcm1hdE9wdGlvbnMuaXNBbmFseXRpY3MgVGhpcyBmbGFnIGlzIHVzZWQgdG8gY2hlY2sgaWYgdGhlIGFuYWx5dGljIHRhYmxlIGhhcyBHcm91cEhlYWRlciBleHBhbmRlZC5cbiAqIEByZXR1cm5zIHtCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+fSBDb21waWxlIGJpbmRpbmcgb2YgZmllbGQgZ3JvdXAgZXhwcmVzc2lvbnMuXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBfZ2V0RmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zID0gZnVuY3Rpb24gKFxuXHRkYXRhRmllbGRHcm91cDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0ZmllbGRGb3JtYXRPcHRpb25zOiBhbnlcbik6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4gfCB1bmRlZmluZWQge1xuXHRjb25zdCBhRmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+W10gPSBbXTtcblx0aWYgKFxuXHRcdGRhdGFGaWVsZEdyb3VwLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uICYmXG5cdFx0ZGF0YUZpZWxkR3JvdXAuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRmllbGRHcm91cFR5cGVcblx0KSB7XG5cdFx0ZGF0YUZpZWxkR3JvdXAuVGFyZ2V0LiR0YXJnZXQuRGF0YT8uZm9yRWFjaCgoaW5uZXJEYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXMpID0+IHtcblx0XHRcdGFGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMucHVzaChcblx0XHRcdFx0X2dldFZpc2libGVFeHByZXNzaW9uKHsgdGFyZ2V0T2JqZWN0OiBpbm5lckRhdGFGaWVsZCB9IGFzIERhdGFNb2RlbE9iamVjdFBhdGgsIGZpZWxkRm9ybWF0T3B0aW9ucywgdHJ1ZSlcblx0XHRcdCk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKFxuXHRcdFx0aWZFbHNlKG9yKC4uLihhRmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zIGFzIGFueSBhcyBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj5bXSkpLCBjb25zdGFudCh0cnVlKSwgY29uc3RhbnQoZmFsc2UpKVxuXHRcdCk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsYWJlbCBmb3IgdGhlIHByb3BlcnR5IGFuZCBkYXRhRmllbGQuXG4gKiBAcGFyYW0ge0RhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBQcm9wZXJ0eX0gW3Byb3BlcnR5XSBQcm9wZXJ0eSBvciBEYXRhRmllbGQgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEBwYXJhbSBpc0dyb3VwXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBMYWJlbCBvZiB0aGUgcHJvcGVydHkgb3IgRGF0YUZpZWxkXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBfZ2V0TGFiZWwgPSBmdW5jdGlvbiAocHJvcGVydHk6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBQcm9wZXJ0eSwgaXNHcm91cDogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0aWYgKCFwcm9wZXJ0eSkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0aWYgKGlzUHJvcGVydHkocHJvcGVydHkpKSB7XG5cdFx0Y29uc3QgZGF0YUZpZWxkRGVmYXVsdCA9IHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdDtcblx0XHRpZiAoZGF0YUZpZWxkRGVmYXVsdCAmJiAhZGF0YUZpZWxkRGVmYXVsdC5xdWFsaWZpZXIgJiYgZGF0YUZpZWxkRGVmYXVsdC5MYWJlbD8udmFsdWVPZigpKSB7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoYW5ub3RhdGlvbkV4cHJlc3Npb24oZGF0YUZpZWxkRGVmYXVsdC5MYWJlbD8udmFsdWVPZigpKSk7XG5cdFx0fVxuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhhbm5vdGF0aW9uRXhwcmVzc2lvbihwcm9wZXJ0eS5hbm5vdGF0aW9ucy5Db21tb24/LkxhYmVsPy52YWx1ZU9mKCkgfHwgcHJvcGVydHkubmFtZSkpO1xuXHR9IGVsc2UgaWYgKGlzRGF0YUZpZWxkVHlwZXMocHJvcGVydHkpKSB7XG5cdFx0aWYgKCEhaXNHcm91cCAmJiBwcm9wZXJ0eS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGFubm90YXRpb25FeHByZXNzaW9uKHByb3BlcnR5LkxhYmVsPy52YWx1ZU9mKCkpKTtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKFxuXHRcdFx0YW5ub3RhdGlvbkV4cHJlc3Npb24oXG5cdFx0XHRcdHByb3BlcnR5LkxhYmVsPy52YWx1ZU9mKCkgfHwgcHJvcGVydHkuVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkxhYmVsPy52YWx1ZU9mKCkgfHwgcHJvcGVydHkuVmFsdWU/LiR0YXJnZXQ/Lm5hbWVcblx0XHRcdClcblx0XHQpO1xuXHR9IGVsc2UgaWYgKHByb3BlcnR5LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uKSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKFxuXHRcdFx0YW5ub3RhdGlvbkV4cHJlc3Npb24oXG5cdFx0XHRcdHByb3BlcnR5LkxhYmVsPy52YWx1ZU9mKCkgfHwgKHByb3BlcnR5LlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQpPy5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uTGFiZWw/LnZhbHVlT2YoKVxuXHRcdFx0KVxuXHRcdCk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGFubm90YXRpb25FeHByZXNzaW9uKHByb3BlcnR5LkxhYmVsPy52YWx1ZU9mKCkpKTtcblx0fVxufTtcblxuY29uc3QgX2dldFRvb2x0aXAgPSBmdW5jdGlvbiAoc291cmNlOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAoIXNvdXJjZSkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRpZiAoaXNQcm9wZXJ0eShzb3VyY2UpKSB7XG5cdFx0cmV0dXJuIHNvdXJjZS5hbm5vdGF0aW9ucy5Db21tb24/LlF1aWNrSW5mb1xuXHRcdFx0PyBjb21waWxlQmluZGluZyhhbm5vdGF0aW9uRXhwcmVzc2lvbihzb3VyY2UuYW5ub3RhdGlvbnMuQ29tbW9uLlF1aWNrSW5mby52YWx1ZU9mKCkpKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoaXNEYXRhRmllbGRUeXBlcyhzb3VyY2UpKSB7XG5cdFx0cmV0dXJuIHNvdXJjZS5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uUXVpY2tJbmZvXG5cdFx0XHQ/IGNvbXBpbGVCaW5kaW5nKGFubm90YXRpb25FeHByZXNzaW9uKHNvdXJjZS5WYWx1ZS4kdGFyZ2V0LmFubm90YXRpb25zLkNvbW1vbi5RdWlja0luZm8udmFsdWVPZigpKSlcblx0XHRcdDogdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKHNvdXJjZS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikge1xuXHRcdGNvbnN0IGRhdGFwb2ludFRhcmdldCA9IHNvdXJjZS5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50O1xuXHRcdHJldHVybiBkYXRhcG9pbnRUYXJnZXQ/LlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5RdWlja0luZm9cblx0XHRcdD8gY29tcGlsZUJpbmRpbmcoYW5ub3RhdGlvbkV4cHJlc3Npb24oZGF0YXBvaW50VGFyZ2V0LlZhbHVlLiR0YXJnZXQuYW5ub3RhdGlvbnMuQ29tbW9uLlF1aWNrSW5mby52YWx1ZU9mKCkpKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRSb3dTdGF0dXNWaXNpYmlsaXR5KCk6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gZm9ybWF0UmVzdWx0KFxuXHRcdFtiaW5kaW5nRXhwcmVzc2lvbihgc2VtYW50aWNLZXlIYXNEcmFmdEluZGljYXRvcmAsIFwiaW50ZXJuYWxcIiksIGJpbmRpbmdFeHByZXNzaW9uKGBmaWx0ZXJlZE1lc3NhZ2VzYCwgXCJpbnRlcm5hbFwiKV0sXG5cdFx0dGFibGVGb3JtYXR0ZXJzLmdldEVycm9yU3RhdHVzVGV4dFZpc2liaWxpdHlGb3JtYXR0ZXJcblx0KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIFByb3BlcnR5SW5mbyBmb3IgZWFjaCBpZGVudGlmaWVkIHByb3BlcnR5IGNvbnN1bWVkIGJ5IGEgTGluZUl0ZW0uXG4gKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT59IGNvbHVtbnNUb0JlQ3JlYXRlZCBJZGVudGlmaWVkIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gZXhpc3RpbmdDb2x1bW5zIFRoZSBsaXN0IG9mIGNvbHVtbnMgY3JlYXRlZCBmb3IgTGluZUl0ZW1zIGFuZCBQcm9wZXJ0aWVzIG9mIGVudGl0eVR5cGUuXG4gKiBAcGFyYW0gbm9uU29ydGFibGVDb2x1bW5zIFRoZSBhcnJheSBvZiBjb2x1bW4gbmFtZXMgd2hpY2ggY2Fubm90IGJlIHNvcnRlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBlbnRpdHkgdHlwZSBmb3IgdGhlIExpbmVJdGVtXG4gKiBAcmV0dXJucyB7QW5ub3RhdGlvblRhYmxlQ29sdW1uW119IFRoZSBhcnJheSBvZiBjb2x1bW5zIGNyZWF0ZWQuXG4gKi9cbmNvbnN0IF9jcmVhdGVSZWxhdGVkQ29sdW1ucyA9IGZ1bmN0aW9uIChcblx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4sXG5cdGV4aXN0aW5nQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdG5vblNvcnRhYmxlQ29sdW1uczogc3RyaW5nW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGVcbik6IEFubm90YXRpb25UYWJsZUNvbHVtbltdIHtcblx0Y29uc3QgcmVsYXRlZENvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdID0gW107XG5cdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cblx0T2JqZWN0LmtleXMoY29sdW1uc1RvQmVDcmVhdGVkKS5mb3JFYWNoKChuYW1lKSA9PiB7XG5cdFx0Y29uc3QgcHJvcGVydHkgPSBjb2x1bW5zVG9CZUNyZWF0ZWRbbmFtZV0sXG5cdFx0XHRhbm5vdGF0aW9uUGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aChuYW1lKSxcblx0XHRcdC8vIENoZWNrIHdoZXRoZXIgdGhlIHJlbGF0ZWQgY29sdW1uIGFscmVhZHkgZXhpc3RzLlxuXHRcdFx0cmVsYXRlZENvbHVtbiA9IGV4aXN0aW5nQ29sdW1ucy5maW5kKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lID09PSBuYW1lKTtcblx0XHRpZiAocmVsYXRlZENvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBDYXNlIDE6IEtleSBjb250YWlucyBEYXRhRmllbGQgcHJlZml4IHRvIGVuc3VyZSBhbGwgcHJvcGVydHkgY29sdW1ucyBoYXZlIHRoZSBzYW1lIGtleSBmb3JtYXQuXG5cdFx0XHQvLyBOZXcgY3JlYXRlZCBwcm9wZXJ0eSBjb2x1bW4gaXMgc2V0IHRvIGhpZGRlbi5cblx0XHRcdHJlbGF0ZWRDb2x1bW5zLnB1c2goXG5cdFx0XHRcdGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdFx0YW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdG5vblNvcnRhYmxlQ29sdW1ucyxcblx0XHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdHJlbGF0ZWRDb2x1bW4uYW5ub3RhdGlvblBhdGggIT09IGFubm90YXRpb25QYXRoIHx8XG5cdFx0XHQocmVsYXRlZENvbHVtbi5wcm9wZXJ0eUluZm9zICYmIHJlbGF0ZWRDb2x1bW4ucHJvcGVydHlJbmZvcy5pbmRleE9mKG5hbWUpICE9PSAtMSlcblx0XHQpIHtcblx0XHRcdC8vIENhc2UgMjogVGhlIGV4aXN0aW5nIGNvbHVtbiBwb2ludHMgdG8gYSBMaW5lSXRlbSAob3IpXG5cdFx0XHQvLyBDYXNlIDM6IFRoaXMgaXMgYSBzZWxmIHJlZmVyZW5jZSBmcm9tIGFuIGV4aXN0aW5nIGNvbHVtbiBhbmRcblx0XHRcdC8vIGJvdGggY2FzZXMgcmVxdWlyZSBhIGR1bW15IFByb3BlcnR5SW5mbyBmb3Igc2V0dGluZyBjb3JyZWN0IGV4cG9ydCBzZXR0aW5ncy5cblxuXHRcdFx0Y29uc3QgbmV3TmFtZSA9IFwiUHJvcGVydHk6OlwiICsgbmFtZTtcblxuXHRcdFx0Ly8gQ2hlY2tpbmcgd2hldGhlciB0aGUgcmVsYXRlZCBwcm9wZXJ0eSBjb2x1bW4gaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGluIGEgcHJldmlvdXMgaXRlcmF0aW9uLlxuXHRcdFx0aWYgKCFleGlzdGluZ0NvbHVtbnMuc29tZSgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA9PT0gbmV3TmFtZSkpIHtcblx0XHRcdFx0Ly8gQ3JlYXRlIGEgbmV3IHByb3BlcnR5IGNvbHVtbiB3aXRoICdQcm9wZXJ0eTo6JyBwcmVmaXgsXG5cdFx0XHRcdC8vIFNldCBpdCB0byBoaWRkZW4gYXMgaXQgaXMgb25seSBjb25zdW1lZCBieSBDb21wbGV4IHByb3BlcnR5IGluZm9zLlxuXHRcdFx0XHRyZWxhdGVkQ29sdW1ucy5wdXNoKFxuXHRcdFx0XHRcdGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eSxcblx0XHRcdFx0XHRcdGFubm90YXRpb25QYXRoLFxuXHRcdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHRub25Tb3J0YWJsZUNvbHVtbnMsXG5cdFx0XHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXBbbmFtZV0gPSBuZXdOYW1lO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0Ly8gVGhlIHByb3BlcnR5ICduYW1lJyBoYXMgYmVlbiBwcmVmaXhlZCB3aXRoICdQcm9wZXJ0eTo6JyBmb3IgdW5pcXVlbmVzcy5cblx0Ly8gVXBkYXRlIHRoZSBzYW1lIGluIG90aGVyIHByb3BlcnR5SW5mb3NbXSByZWZlcmVuY2VzIHdoaWNoIHBvaW50IHRvIHRoaXMgcHJvcGVydHkuXG5cdGV4aXN0aW5nQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcblx0XHRjb2x1bW4ucHJvcGVydHlJbmZvcyA9IGNvbHVtbi5wcm9wZXJ0eUluZm9zPy5tYXAoKHByb3BlcnR5SW5mbykgPT4gcmVsYXRlZFByb3BlcnR5TmFtZU1hcFtwcm9wZXJ0eUluZm9dID8/IHByb3BlcnR5SW5mbyk7XG5cdFx0Y29sdW1uLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zID0gY29sdW1uLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zPy5tYXAoXG5cdFx0XHQocHJvcGVydHlJbmZvKSA9PiByZWxhdGVkUHJvcGVydHlOYW1lTWFwW3Byb3BlcnR5SW5mb10gPz8gcHJvcGVydHlJbmZvXG5cdFx0KTtcblx0fSk7XG5cblx0cmV0dXJuIHJlbGF0ZWRDb2x1bW5zO1xufTtcblxuLyoqXG4gKiBHZXR0aW5nIHRoZSBDb2x1bW4gTmFtZVxuICogSWYgaXQgcG9pbnRzIHRvIGEgRGF0YUZpZWxkIHdpdGggb25lIHByb3BlcnR5IG9yIERhdGFQb2ludCB3aXRoIG9uZSBwcm9wZXJ0eSwgaXQgd2lsbCB1c2UgdGhlIHByb3BlcnR5IG5hbWVcbiAqIGhlcmUgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSBleGlzdGluZyBmbGV4IGNoYW5nZXMuXG4gKlxuICogQHBhcmFtIHtEYXRhRmllbGRBYnN0cmFjdFR5cGVzfSBkYXRhRmllbGQgRGlmZmVyZW50IERhdGFGaWVsZCB0eXBlcyBkZWZpbmVkIGluIHRoZSBhbm5vdGF0aW9uc1xuICogQHJldHVybnMge3N0cmluZ30gVGhlIG5hbWUgb2YgYW5ub3RhdGlvbiBjb2x1bW5zXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBfZ2V0QW5ub3RhdGlvbkNvbHVtbk5hbWUgPSBmdW5jdGlvbiAoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKSB7XG5cdC8vIFRoaXMgaXMgbmVlZGVkIGFzIHdlIGhhdmUgZmxleGliaWxpdHkgY2hhbmdlcyBhbHJlYWR5IHRoYXQgd2UgaGF2ZSB0byBjaGVjayBhZ2FpbnN0XG5cdGlmIChpc0RhdGFGaWVsZFR5cGVzKGRhdGFGaWVsZCkpIHtcblx0XHRyZXR1cm4gZGF0YUZpZWxkLlZhbHVlPy5wYXRoO1xuXHR9IGVsc2UgaWYgKGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiAmJiAoZGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQpPy5WYWx1ZT8ucGF0aCkge1xuXHRcdC8vIFRoaXMgaXMgZm9yIHJlbW92aW5nIGR1cGxpY2F0ZSBwcm9wZXJ0aWVzLiBGb3IgZXhhbXBsZSwgJ1Byb2dyZXNzJyBQcm9wZXJ0eSBpcyByZW1vdmVkIGlmIGl0IGlzIGFscmVhZHkgZGVmaW5lZCBhcyBhIERhdGFQb2ludFxuXHRcdHJldHVybiAoZGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQpPy5WYWx1ZS5wYXRoO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZCk7XG5cdH1cbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YSBmaWVsZCBsYWJlbHMgaGF2ZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRhYmxlLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkR3JvdXBOYW1lIFRoZSBgRGF0YUZpZWxkYCBuYW1lIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHNob3dEYXRhRmllbGRzTGFiZWxgIHZhbHVlIGZyb20gdGhlIG1hbmlmZXN0XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBfZ2V0U2hvd0RhdGFGaWVsZHNMYWJlbCA9IGZ1bmN0aW9uIChmaWVsZEdyb3VwTmFtZTogc3RyaW5nLCB2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLCBjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogYm9vbGVhbiB7XG5cdGNvbnN0IG9Db2x1bW5zID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKT8uY29sdW1ucztcblx0Y29uc3QgYUNvbHVtbktleXMgPSBvQ29sdW1ucyAmJiBPYmplY3Qua2V5cyhvQ29sdW1ucyk7XG5cdHJldHVybiAoXG5cdFx0YUNvbHVtbktleXMgJiZcblx0XHQhIWFDb2x1bW5LZXlzLmZpbmQoZnVuY3Rpb24gKGtleTogc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4ga2V5ID09PSBmaWVsZEdyb3VwTmFtZSAmJiBvQ29sdW1uc1trZXldLnNob3dEYXRhRmllbGRzTGFiZWw7XG5cdFx0fSlcblx0KTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcHJvcGVydHkgd2l0aCByZXNwZWN0IHRvIHRoZSByb290IGVudGl0eS5cbiAqIEBwYXJhbSBkYXRhRmllbGQgVGhlIGBEYXRhRmllbGRgIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSByZWxhdGl2ZSBwYXRoXG4gKi9cbmNvbnN0IF9nZXRSZWxhdGl2ZVBhdGggPSBmdW5jdGlvbiAoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogc3RyaW5nIHtcblx0bGV0IHJlbGF0aXZlUGF0aDogc3RyaW5nID0gXCJcIjtcblxuXHRzd2l0Y2ggKGRhdGFGaWVsZC4kVHlwZSkge1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoQWN0aW9uOlxuXHRcdFx0cmVsYXRpdmVQYXRoID0gKGRhdGFGaWVsZCBhcyBEYXRhRmllbGQpPy5WYWx1ZT8ucGF0aDtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uOlxuXHRcdFx0cmVsYXRpdmVQYXRoID0gKGRhdGFGaWVsZCBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKT8uVGFyZ2V0Py52YWx1ZTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRyZWxhdGl2ZVBhdGggPSBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZCk7XG5cdFx0XHRicmVhaztcblx0fVxuXG5cdHJldHVybiByZWxhdGl2ZVBhdGg7XG59O1xuXG5jb25zdCBfc2xpY2VBdFNsYXNoID0gZnVuY3Rpb24gKHBhdGg6IHN0cmluZywgaXNMYXN0U2xhc2g6IGJvb2xlYW4sIGlzTGFzdFBhcnQ6IGJvb2xlYW4pIHtcblx0Y29uc3QgaVNsYXNoSW5kZXggPSBpc0xhc3RTbGFzaCA/IHBhdGgubGFzdEluZGV4T2YoXCIvXCIpIDogcGF0aC5pbmRleE9mKFwiL1wiKTtcblxuXHRpZiAoaVNsYXNoSW5kZXggPT09IC0xKSB7XG5cdFx0cmV0dXJuIHBhdGg7XG5cdH1cblx0cmV0dXJuIGlzTGFzdFBhcnQgPyBwYXRoLnN1YnN0cmluZyhpU2xhc2hJbmRleCArIDEsIHBhdGgubGVuZ3RoKSA6IHBhdGguc3Vic3RyaW5nKDAsIGlTbGFzaEluZGV4KTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBjb2x1bW4gaXMgc29ydGFibGUuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZCBUaGUgZGF0YSBmaWVsZCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSBwcm9wZXJ0eVBhdGggVGhlIHByb3BlcnR5IHBhdGhcbiAqIEBwYXJhbSBub25Tb3J0YWJsZUNvbHVtbnMgQ29sbGVjdGlvbiBvZiBub24tc29ydGFibGUgY29sdW1uIG5hbWVzIGFzIHBlciBhbm5vdGF0aW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgY29sdW1uIGlzIHNvcnRhYmxlXG4gKi9cbmNvbnN0IF9pc0NvbHVtblNvcnRhYmxlID0gZnVuY3Rpb24gKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcywgcHJvcGVydHlQYXRoOiBzdHJpbmcsIG5vblNvcnRhYmxlQ29sdW1uczogc3RyaW5nW10pOiBib29sZWFuIHtcblx0bGV0IGlzU29ydGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcblx0aWYgKG5vblNvcnRhYmxlQ29sdW1ucy5pbmRleE9mKHByb3BlcnR5UGF0aCkgPT09IC0xKSB7XG5cdFx0Ly8gQ29sdW1uIGlzIG5vdCBtYXJrZWQgYXMgbm9uLXNvcnRhYmxlIHZpYSBhbm5vdGF0aW9uXG5cdFx0c3dpdGNoIChkYXRhRmllbGQuJFR5cGUpIHtcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdFx0XHRpc1NvcnRhYmxlID0gdHJ1ZTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0XHRcdC8vIEFjdGlvbiBjb2x1bW5zIGFyZSBub3Qgc29ydGFibGVcblx0XHRcdFx0aXNTb3J0YWJsZSA9IGZhbHNlO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblx0cmV0dXJuIGlzU29ydGFibGU7XG59O1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBmaWx0ZXJpbmcgb24gdGhlIHRhYmxlIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyAnZmFsc2UnIGlmIEZpbHRlckZ1bmN0aW9ucyBhbm5vdGF0aW9uIHN1cHBvcnRzICd0b2xvd2VyJywgZWxzZSAndHJ1ZSdcbiAqL1xuZXhwb3J0IGNvbnN0IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSA9IGZ1bmN0aW9uIChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogYm9vbGVhbiB7XG5cdGNvbnN0IGZpbHRlckZ1bmN0aW9uczogRmlsdGVyRnVuY3Rpb25zIHwgdW5kZWZpbmVkID1cblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpPy5hbm5vdGF0aW9ucz8uQ2FwYWJpbGl0aWVzPy5GaWx0ZXJGdW5jdGlvbnMgfHxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eUNvbnRhaW5lcigpLmFubm90YXRpb25zPy5DYXBhYmlsaXRpZXM/LkZpbHRlckZ1bmN0aW9ucztcblx0cmV0dXJuIEFycmF5LmlzQXJyYXkoZmlsdGVyRnVuY3Rpb25zKSA/IChmaWx0ZXJGdW5jdGlvbnMgYXMgU3RyaW5nW10pLmluZGV4T2YoXCJ0b2xvd2VyXCIpID09PSAtMSA6IHRydWU7XG59O1xuXG4vKipcbiAqIFJldHVybnMgZGVmYXVsdCBmb3JtYXQgb3B0aW9ucyBmb3IgdGV4dCBmaWVsZHMgaW4gYSB0YWJsZS5cbiAqXG4gKiBAcmV0dXJucyB7Rm9ybWF0T3B0aW9uc1R5cGV9IENvbGxlY3Rpb24gb2YgZm9ybWF0IG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlc1xuICovXG5mdW5jdGlvbiBnZXREZWZhdWx0Rm9ybWF0T3B0aW9uc0ZvclRhYmxlKCk6IEZvcm1hdE9wdGlvbnNUeXBlIHtcblx0cmV0dXJuIHtcblx0XHR0ZXh0TGluZXNFZGl0OiA0XG5cdH07XG59XG5cbmZ1bmN0aW9uIF9maW5kU2VtYW50aWNLZXlWYWx1ZXMoc2VtYW50aWNLZXlzOiBhbnlbXSwgbmFtZTogc3RyaW5nKTogYW55IHtcblx0Y29uc3QgYVNlbWFudGljS2V5VmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRsZXQgYlNlbWFudGljS2V5Rm91bmQgPSBmYWxzZTtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzZW1hbnRpY0tleXMubGVuZ3RoOyBpKyspIHtcblx0XHRhU2VtYW50aWNLZXlWYWx1ZXMucHVzaChzZW1hbnRpY0tleXNbaV0udmFsdWUpO1xuXHRcdGlmIChzZW1hbnRpY0tleXNbaV0udmFsdWUgPT09IG5hbWUpIHtcblx0XHRcdGJTZW1hbnRpY0tleUZvdW5kID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHtcblx0XHR2YWx1ZXM6IGFTZW1hbnRpY0tleVZhbHVlcyxcblx0XHRzZW1hbnRpY0tleUZvdW5kOiBiU2VtYW50aWNLZXlGb3VuZFxuXHR9O1xufVxuXG5mdW5jdGlvbiBfZmluZFByb3BlcnRpZXMoc2VtYW50aWNLZXlWYWx1ZXM6IGFueVtdLCBmaWVsZEdyb3VwUHJvcGVydGllczogYW55W10pIHtcblx0bGV0IHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXAgPSBmYWxzZTtcblx0bGV0IHNQcm9wZXJ0eVBhdGg7XG5cdGlmIChzZW1hbnRpY0tleVZhbHVlcyAmJiBzZW1hbnRpY0tleVZhbHVlcy5sZW5ndGggPj0gMSAmJiBmaWVsZEdyb3VwUHJvcGVydGllcyAmJiBmaWVsZEdyb3VwUHJvcGVydGllcy5sZW5ndGggPj0gMSkge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc2VtYW50aWNLZXlWYWx1ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmIChbc2VtYW50aWNLZXlWYWx1ZXNbaV1dLnNvbWUoKHRtcCkgPT4gZmllbGRHcm91cFByb3BlcnRpZXMuaW5kZXhPZih0bXApID49IDApKSB7XG5cdFx0XHRcdHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXAgPSB0cnVlO1xuXHRcdFx0XHRzUHJvcGVydHlQYXRoID0gc2VtYW50aWNLZXlWYWx1ZXNbaV07XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4ge1xuXHRcdHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXA6IHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXAsXG5cdFx0ZmllbGRHcm91cFByb3BlcnR5UGF0aDogc1Byb3BlcnR5UGF0aFxuXHR9O1xufVxuXG5mdW5jdGlvbiBfZmluZFNlbWFudGljS2V5VmFsdWVzSW5GaWVsZEdyb3VwKGRhdGFGaWVsZEdyb3VwOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgbnVsbCwgc2VtYW50aWNLZXlWYWx1ZXM6IFtdKTogYW55IHtcblx0Y29uc3QgYVByb3BlcnRpZXM6IGFueVtdID0gW107XG5cdGxldCBfcHJvcGVydGllc0ZvdW5kOiB7IHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXA6IGJvb2xlYW47IGZpZWxkR3JvdXBQcm9wZXJ0eVBhdGg6IGFueSB9ID0ge1xuXHRcdHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXA6IGZhbHNlLFxuXHRcdGZpZWxkR3JvdXBQcm9wZXJ0eVBhdGg6IHVuZGVmaW5lZFxuXHR9O1xuXHRpZiAoXG5cdFx0ZGF0YUZpZWxkR3JvdXAgJiZcblx0XHRkYXRhRmllbGRHcm91cC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiAmJlxuXHRcdGRhdGFGaWVsZEdyb3VwLlRhcmdldD8uJHRhcmdldD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkZpZWxkR3JvdXBUeXBlXG5cdCkge1xuXHRcdGRhdGFGaWVsZEdyb3VwLlRhcmdldC4kdGFyZ2V0LkRhdGE/LmZvckVhY2goKGlubmVyRGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKSA9PiB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChpbm5lckRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkIHx8IGlubmVyRGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsKSAmJlxuXHRcdFx0XHRpbm5lckRhdGFGaWVsZC5WYWx1ZVxuXHRcdFx0KSB7XG5cdFx0XHRcdGFQcm9wZXJ0aWVzLnB1c2goaW5uZXJEYXRhRmllbGQuVmFsdWUucGF0aCk7XG5cdFx0XHR9XG5cdFx0XHRfcHJvcGVydGllc0ZvdW5kID0gX2ZpbmRQcm9wZXJ0aWVzKHNlbWFudGljS2V5VmFsdWVzLCBhUHJvcGVydGllcyk7XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBfcHJvcGVydGllc0ZvdW5kLnNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXAsXG5cdFx0cHJvcGVydHlQYXRoOiBfcHJvcGVydGllc0ZvdW5kLmZpZWxkR3JvdXBQcm9wZXJ0eVBhdGhcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGRlZmF1bHQgZm9ybWF0IG9wdGlvbnMgd2l0aCBkcmFmdEluZGljYXRvciBmb3IgYSBjb2x1bW4uXG4gKiBAcGFyYW0gbmFtZVxuICogQHBhcmFtIHNlbWFudGljS2V5c1xuICogQHBhcmFtIGlzRmllbGRHcm91cENvbHVtblxuICogQHBhcmFtIGRhdGFGaWVsZEdyb3VwXG4gKiBAcmV0dXJucyB7Rm9ybWF0T3B0aW9uc1R5cGV9IENvbGxlY3Rpb24gb2YgZm9ybWF0IG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlc1xuICovXG5mdW5jdGlvbiBnZXREZWZhdWx0RHJhZnRJbmRpY2F0b3JGb3JDb2x1bW4oXG5cdG5hbWU6IHN0cmluZyxcblx0c2VtYW50aWNLZXlzOiBhbnlbXSxcblx0aXNGaWVsZEdyb3VwQ29sdW1uOiBib29sZWFuLFxuXHRkYXRhRmllbGRHcm91cDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IG51bGxcbikge1xuXHRpZiAoIXNlbWFudGljS2V5cykge1xuXHRcdHJldHVybiB7fTtcblx0fVxuXHRjb25zdCBzZW1hbnRpY0tleSA9IF9maW5kU2VtYW50aWNLZXlWYWx1ZXMoc2VtYW50aWNLZXlzLCBuYW1lKTtcblx0Y29uc3Qgc2VtYW50aWNLZXlJbkZpZWxkR3JvdXAgPSBfZmluZFNlbWFudGljS2V5VmFsdWVzSW5GaWVsZEdyb3VwKGRhdGFGaWVsZEdyb3VwLCBzZW1hbnRpY0tleS52YWx1ZXMpO1xuXHRpZiAoc2VtYW50aWNLZXkuc2VtYW50aWNLZXlGb3VuZCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRoYXNEcmFmdEluZGljYXRvcjogdHJ1ZSxcblx0XHRcdHNlbWFudGlja2V5czogc2VtYW50aWNLZXkudmFsdWVzLFxuXHRcdFx0b2JqZWN0U3RhdHVzVGV4dFZpc2liaWxpdHk6IGNvbXBpbGVCaW5kaW5nKGdldFJvd1N0YXR1c1Zpc2liaWxpdHkoKSlcblx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdGlmICghc2VtYW50aWNLZXlJbkZpZWxkR3JvdXAuc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCkge1xuXHRcdFx0cmV0dXJuIHt9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBTZW1hbnRpYyBLZXkgaGFzIGEgcHJvcGVydHkgaW4gYSBGaWVsZEdyb3VwXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRGaWVsZEdyb3VwRHJhZnRJbmRpY2F0b3JQcm9wZXJ0eVBhdGg6IHNlbWFudGljS2V5SW5GaWVsZEdyb3VwLnByb3BlcnR5UGF0aCxcblx0XHRcdFx0RmllbGRHcm91cE5hbWU6IG5hbWVcblx0XHRcdH07XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIF9nZXRJbXBOdW1iZXIoZGF0YUZpZWxkOiBEYXRhRmllbGRUeXBlcyk6IG51bWJlciB7XG5cdGNvbnN0IGltcG9ydGFuY2UgPSBkYXRhRmllbGQ/LmFubm90YXRpb25zPy5VST8uSW1wb3J0YW5jZSBhcyBzdHJpbmc7XG5cblx0aWYgKGltcG9ydGFuY2UgJiYgaW1wb3J0YW5jZS5pbmNsdWRlcyhcIlVJLkltcG9ydGFuY2VUeXBlL0hpZ2hcIikpIHtcblx0XHRyZXR1cm4gMztcblx0fVxuXHRpZiAoaW1wb3J0YW5jZSAmJiBpbXBvcnRhbmNlLmluY2x1ZGVzKFwiVUkuSW1wb3J0YW5jZVR5cGUvTWVkaXVtXCIpKSB7XG5cdFx0cmV0dXJuIDI7XG5cdH1cblx0aWYgKGltcG9ydGFuY2UgJiYgaW1wb3J0YW5jZS5pbmNsdWRlcyhcIlVJLkltcG9ydGFuY2VUeXBlL0xvd1wiKSkge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cdHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBfZ2V0RGF0YUZpZWxkSW1wb3J0YW5jZShkYXRhRmllbGQ6IERhdGFGaWVsZFR5cGVzKTogSW1wb3J0YW5jZSB7XG5cdGNvbnN0IGltcG9ydGFuY2UgPSBkYXRhRmllbGQ/LmFubm90YXRpb25zPy5VST8uSW1wb3J0YW5jZSBhcyBzdHJpbmc7XG5cdHJldHVybiBpbXBvcnRhbmNlID8gKGltcG9ydGFuY2Uuc3BsaXQoXCIvXCIpWzFdIGFzIEltcG9ydGFuY2UpIDogSW1wb3J0YW5jZS5Ob25lO1xufVxuXG5mdW5jdGlvbiBfZ2V0TWF4SW1wb3J0YW5jZShmaWVsZHM6IERhdGFGaWVsZFR5cGVzW10pOiBJbXBvcnRhbmNlIHtcblx0aWYgKGZpZWxkcyAmJiBmaWVsZHMubGVuZ3RoID4gMCkge1xuXHRcdGxldCBtYXhJbXBOdW1iZXIgPSAtMTtcblx0XHRsZXQgaW1wTnVtYmVyID0gLTE7XG5cdFx0bGV0IERhdGFGaWVsZFdpdGhNYXhJbXBvcnRhbmNlO1xuXHRcdGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG5cdFx0XHRpbXBOdW1iZXIgPSBfZ2V0SW1wTnVtYmVyKGZpZWxkKTtcblx0XHRcdGlmIChpbXBOdW1iZXIgPiBtYXhJbXBOdW1iZXIpIHtcblx0XHRcdFx0bWF4SW1wTnVtYmVyID0gaW1wTnVtYmVyO1xuXHRcdFx0XHREYXRhRmllbGRXaXRoTWF4SW1wb3J0YW5jZSA9IGZpZWxkO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gX2dldERhdGFGaWVsZEltcG9ydGFuY2UoRGF0YUZpZWxkV2l0aE1heEltcG9ydGFuY2UgYXMgRGF0YUZpZWxkVHlwZXMpO1xuXHR9XG5cdHJldHVybiBJbXBvcnRhbmNlLk5vbmU7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW1wb3J0YW5jZSB2YWx1ZSBmb3IgYSBjb2x1bW4uXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZFxuICogQHBhcmFtIHNlbWFudGljS2V5c1xuICogQHJldHVybnMge0ltcG9ydGFuY2V9IFRoZSBpbXBvcnRhbmNlIHZhbHVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbXBvcnRhbmNlKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcywgc2VtYW50aWNLZXlzOiBTZW1hbnRpY0tleSk6IEltcG9ydGFuY2UgfCB1bmRlZmluZWQge1xuXHQvL0V2YWx1YXRlIGRlZmF1bHQgSW1wb3J0YW5jZSBpcyBub3Qgc2V0IGV4cGxpY2l0bHlcblx0bGV0IGZpZWxkc1dpdGhJbXBvcnRhbmNlLCBtYXBTZW1hbnRpY0tleXM6IGFueTtcblx0Ly9DaGVjayBpZiBzZW1hbnRpY0tleXMgYXJlIGRlZmluZWQgYXQgdGhlIEVudGl0eVNldCBsZXZlbFxuXHRpZiAoc2VtYW50aWNLZXlzICYmIHNlbWFudGljS2V5cy5sZW5ndGggPiAwKSB7XG5cdFx0bWFwU2VtYW50aWNLZXlzID0gc2VtYW50aWNLZXlzLm1hcChmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRyZXR1cm4ga2V5LnZhbHVlO1xuXHRcdH0pO1xuXHR9XG5cdGlmICghZGF0YUZpZWxkKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRpZiAoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uKSB7XG5cdFx0Y29uc3QgZmllbGRHcm91cERhdGEgPSAoZGF0YUZpZWxkIGFzIGFueSkuVGFyZ2V0W1wiJHRhcmdldFwiXVtcIkRhdGFcIl0gYXMgRmllbGRHcm91cFR5cGUsXG5cdFx0XHRmaWVsZEdyb3VwSGFzU2VtYW50aWNLZXkgPVxuXHRcdFx0XHRmaWVsZEdyb3VwRGF0YSAmJlxuXHRcdFx0XHQoZmllbGRHcm91cERhdGEgYXMgYW55KS5zb21lKGZ1bmN0aW9uIChmaWVsZEdyb3VwRGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKSB7XG5cdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdChmaWVsZEdyb3VwRGF0YUZpZWxkIGFzIHVua25vd24gYXMgRGF0YUZpZWxkVHlwZXMpPy5WYWx1ZT8ucGF0aCAmJlxuXHRcdFx0XHRcdFx0ZmllbGRHcm91cERhdGFGaWVsZC4kVHlwZSAhPT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiAmJlxuXHRcdFx0XHRcdFx0bWFwU2VtYW50aWNLZXlzICYmXG5cdFx0XHRcdFx0XHRtYXBTZW1hbnRpY0tleXMuaW5jbHVkZXMoKGZpZWxkR3JvdXBEYXRhRmllbGQgYXMgdW5rbm93biBhcyBEYXRhRmllbGRUeXBlcyk/LlZhbHVlPy5wYXRoKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0pO1xuXHRcdC8vSWYgYSBGaWVsZEdyb3VwIGNvbnRhaW5zIGEgc2VtYW50aWNLZXksIGltcG9ydGFuY2Ugc2V0IHRvIEhpZ2hcblx0XHRpZiAoZmllbGRHcm91cEhhc1NlbWFudGljS2V5KSB7XG5cdFx0XHRyZXR1cm4gSW1wb3J0YW5jZS5IaWdoO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvL0lmIHRoZSBEYXRhRmllbGRGb3JBbm5vdGF0aW9uIGhhcyBhbiBJbXBvcnRhbmNlIHdlIHRha2UgaXRcblx0XHRcdGlmIChkYXRhRmllbGQ/LmFubm90YXRpb25zPy5VST8uSW1wb3J0YW5jZSkge1xuXHRcdFx0XHRyZXR1cm4gX2dldERhdGFGaWVsZEltcG9ydGFuY2UoZGF0YUZpZWxkIGFzIHVua25vd24gYXMgRGF0YUZpZWxkVHlwZXMpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gZWxzZSB0aGUgaGlnaGVzdCBpbXBvcnRhbmNlIChpZiBhbnkpIGlzIHJldHVybmVkXG5cdFx0XHRmaWVsZHNXaXRoSW1wb3J0YW5jZSA9XG5cdFx0XHRcdGZpZWxkR3JvdXBEYXRhICYmXG5cdFx0XHRcdChmaWVsZEdyb3VwRGF0YSBhcyBhbnkpLmZpbHRlcihmdW5jdGlvbiAoaXRlbTogRGF0YUZpZWxkVHlwZXMpIHtcblx0XHRcdFx0XHRyZXR1cm4gaXRlbT8uYW5ub3RhdGlvbnM/LlVJPy5JbXBvcnRhbmNlO1xuXHRcdFx0XHR9KTtcblx0XHRcdHJldHVybiBfZ2V0TWF4SW1wb3J0YW5jZShmaWVsZHNXaXRoSW1wb3J0YW5jZSBhcyBEYXRhRmllbGRUeXBlc1tdKTtcblx0XHR9XG5cdFx0Ly9JZiB0aGUgY3VycmVudCBmaWVsZCBpcyBhIHNlbWFudGljS2V5LCBpbXBvcnRhbmNlIHNldCB0byBIaWdoXG5cdH1cblx0cmV0dXJuIChkYXRhRmllbGQgYXMgRGF0YUZpZWxkVHlwZXMpLlZhbHVlICYmXG5cdFx0KGRhdGFGaWVsZCBhcyBEYXRhRmllbGRUeXBlcyk/LlZhbHVlPy5wYXRoICYmXG5cdFx0bWFwU2VtYW50aWNLZXlzICYmXG5cdFx0bWFwU2VtYW50aWNLZXlzLmluY2x1ZGVzKChkYXRhRmllbGQgYXMgRGF0YUZpZWxkVHlwZXMpLlZhbHVlLnBhdGgpXG5cdFx0PyBJbXBvcnRhbmNlLkhpZ2hcblx0XHQ6IF9nZXREYXRhRmllbGRJbXBvcnRhbmNlKGRhdGFGaWVsZCBhcyB1bmtub3duIGFzIERhdGFGaWVsZFR5cGVzKTtcbn1cbi8qKlxuICogUmV0dXJucyBsaW5lIGl0ZW1zIGZyb20gbWV0YWRhdGEgYW5ub3RhdGlvbnMuXG4gKlxuICogQHBhcmFtIHtMaW5lSXRlbX0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgd2l0aCB0aGVpciBhbm5vdGF0aW9uc1xuICogQHBhcmFtIHtzdHJpbmd9IHZpc3VhbGl6YXRpb25QYXRoIFRoZSB2aXN1YWxpemF0aW9uIHBhdGhcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIHtUYWJsZUNvbHVtbltdfSBUaGUgY29sdW1ucyBmcm9tIHRoZSBhbm5vdGF0aW9uc1xuICovXG5jb25zdCBnZXRDb2x1bW5zRnJvbUFubm90YXRpb25zID0gZnVuY3Rpb24gKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBUYWJsZUNvbHVtbltdIHtcblx0Y29uc3QgZW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKSxcblx0XHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10gPSBbXSxcblx0XHRjb2x1bW5zVG9CZUNyZWF0ZWQ6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5PiA9IHt9LFxuXHRcdG5vblNvcnRhYmxlQ29sdW1uczogc3RyaW5nW10gPSBnZXROb25Tb3J0YWJsZVByb3BlcnRpZXNSZXN0cmljdGlvbnMoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKSksXG5cdFx0dGFibGVNYW5pZmVzdFNldHRpbmdzOiBUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2aXN1YWxpemF0aW9uUGF0aCksXG5cdFx0dGFibGVUeXBlOiBUYWJsZVR5cGUgPSB0YWJsZU1hbmlmZXN0U2V0dGluZ3M/LnRhYmxlU2V0dGluZ3M/LnR5cGUgfHwgXCJSZXNwb25zaXZlVGFibGVcIjtcblx0Y29uc3Qgc2VtYW50aWNLZXlzOiBTZW1hbnRpY0tleSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbnNCeVRlcm0oXCJDb21tb25cIiwgQ29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljS2V5LCBbXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKClcblx0XSlbMF07XG5cdGlmIChsaW5lSXRlbUFubm90YXRpb24pIHtcblx0XHRsaW5lSXRlbUFubm90YXRpb24uZm9yRWFjaCgobGluZUl0ZW0pID0+IHtcblx0XHRcdGlmICghX2lzVmFsaWRDb2x1bW4obGluZUl0ZW0pKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGggPVxuXHRcdFx0XHRpc0RhdGFGaWVsZFR5cGVzKGxpbmVJdGVtKSAmJiBsaW5lSXRlbS5WYWx1ZT8uJHRhcmdldD8uZnVsbHlRdWFsaWZpZWROYW1lXG5cdFx0XHRcdFx0PyBnZXRTZW1hbnRpY09iamVjdFBhdGgoY29udmVydGVyQ29udGV4dCwgbGluZUl0ZW0pXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRjb25zdCByZWxhdGl2ZVBhdGggPSBfZ2V0UmVsYXRpdmVQYXRoKGxpbmVJdGVtKTtcblx0XHRcdC8vIERldGVybWluZSBwcm9wZXJ0aWVzIHdoaWNoIGFyZSBjb25zdW1lZCBieSB0aGlzIExpbmVJdGVtLlxuXHRcdFx0Y29uc3QgcmVsYXRlZFByb3BlcnRpZXNJbmZvOiBDb21wbGV4UHJvcGVydHlJbmZvID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHkobGluZUl0ZW0sIGNvbnZlcnRlckNvbnRleHQsIHRhYmxlVHlwZSk7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBhZGRpdGlvbmFsUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXMpO1xuXHRcdFx0Y29uc3QgZ3JvdXBQYXRoOiBzdHJpbmcgPSBfc2xpY2VBdFNsYXNoKHJlbGF0aXZlUGF0aCwgdHJ1ZSwgZmFsc2UpO1xuXHRcdFx0Y29uc3QgaXNHcm91cDogYm9vbGVhbiA9IGdyb3VwUGF0aCAhPSByZWxhdGl2ZVBhdGg7XG5cdFx0XHRjb25zdCBzTGFiZWw6IHN0cmluZyB8IHVuZGVmaW5lZCA9IF9nZXRMYWJlbChsaW5lSXRlbSwgaXNHcm91cCk7XG5cdFx0XHRjb25zdCBuYW1lID0gX2dldEFubm90YXRpb25Db2x1bW5OYW1lKGxpbmVJdGVtKTtcblx0XHRcdGNvbnN0IGlzRmllbGRHcm91cENvbHVtbjogYm9vbGVhbiA9IGdyb3VwUGF0aC5pbmRleE9mKFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZpZWxkR3JvdXBcIikgPiAtMTtcblx0XHRcdGNvbnN0IHNob3dEYXRhRmllbGRzTGFiZWw6IGJvb2xlYW4gPSBpc0ZpZWxkR3JvdXBDb2x1bW5cblx0XHRcdFx0PyBfZ2V0U2hvd0RhdGFGaWVsZHNMYWJlbChuYW1lLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dClcblx0XHRcdFx0OiBmYWxzZTtcblx0XHRcdGNvbnN0IGRhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBnZXREYXRhRmllbGREYXRhVHlwZShsaW5lSXRlbSk7XG5cdFx0XHRjb25zdCBzRGF0ZUlucHV0Rm9ybWF0OiBzdHJpbmcgfCB1bmRlZmluZWQgPSBkYXRhVHlwZSA9PT0gXCJFZG0uRGF0ZVwiID8gXCJZWVlZLU1NLUREXCIgOiB1bmRlZmluZWQ7XG5cdFx0XHRjb25zdCBmb3JtYXRPcHRpb25zID0ge1xuXHRcdFx0XHQuLi5nZXREZWZhdWx0Rm9ybWF0T3B0aW9uc0ZvclRhYmxlKCksXG5cdFx0XHRcdC4uLmdldERlZmF1bHREcmFmdEluZGljYXRvckZvckNvbHVtbihuYW1lLCBzZW1hbnRpY0tleXMsIGlzRmllbGRHcm91cENvbHVtbiwgbGluZUl0ZW0pXG5cdFx0XHR9O1xuXHRcdFx0bGV0IGZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9uczogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPjtcblx0XHRcdGlmIChcblx0XHRcdFx0bGluZUl0ZW0uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiZcblx0XHRcdFx0bGluZUl0ZW0uVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRmllbGRHcm91cFR5cGVcblx0XHRcdCkge1xuXHRcdFx0XHRmaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMgPSBfZ2V0RmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zKGxpbmVJdGVtLCBmb3JtYXRPcHRpb25zKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGV4cG9ydFNldHRpbmdzOiBhbnkgPSB7XG5cdFx0XHRcdHRlbXBsYXRlOiByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3NUZW1wbGF0ZSxcblx0XHRcdFx0d3JhcDogcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFNldHRpbmdzV3JhcHBpbmcsXG5cdFx0XHRcdHR5cGU6IGRhdGFUeXBlID8gX2dldEV4cG9ydERhdGFUeXBlKGRhdGFUeXBlLCByZWxhdGVkUHJvcGVydHlOYW1lcy5sZW5ndGggPiAxKSA6IHVuZGVmaW5lZCxcblx0XHRcdFx0aW5wdXRGb3JtYXQ6IHNEYXRlSW5wdXRGb3JtYXQsXG5cdFx0XHRcdGRlbGltaXRlcjogZGF0YVR5cGUgPT09IFwiRWRtLkludDY0XCIgPyB0cnVlIDogZmFsc2Vcblx0XHRcdH07XG5cblx0XHRcdGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0VW5pdE5hbWUpIHtcblx0XHRcdFx0ZXhwb3J0U2V0dGluZ3MudW5pdFByb3BlcnR5ID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFVuaXROYW1lO1xuXHRcdFx0XHRleHBvcnRTZXR0aW5ncy50eXBlID0gXCJDdXJyZW5jeVwiOyAvLyBGb3JjZSB0byBhIGN1cnJlbmN5IGJlY2F1c2UgdGhlcmUncyBhIHVuaXRQcm9wZXJ0eSAob3RoZXJ3aXNlIHRoZSB2YWx1ZSBpc24ndCBwcm9wZXJseSBmb3JtYXR0ZWQgd2hlbiBleHBvcnRlZClcblx0XHRcdH0gZWxzZSBpZiAocmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFVuaXRTdHJpbmcpIHtcblx0XHRcdFx0ZXhwb3J0U2V0dGluZ3MudW5pdCA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRVbml0U3RyaW5nO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRUaW1lem9uZU5hbWUpIHtcblx0XHRcdFx0ZXhwb3J0U2V0dGluZ3MudGltZXpvbmVQcm9wZXJ0eSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRUaW1lem9uZU5hbWU7XG5cdFx0XHR9IGVsc2UgaWYgKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRUaW1lem9uZVN0cmluZykge1xuXHRcdFx0XHRleHBvcnRTZXR0aW5ncy50aW1lem9uZSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRUaW1lem9uZVN0cmluZztcblx0XHRcdH1cblx0XHRcdGNvbnN0IHByb3BlcnR5VHlwZUNvbmZpZyA9IGRhdGFUeXBlICYmIGdldFR5cGVDb25maWcobGluZUl0ZW0sIGRhdGFUeXBlKTtcblx0XHRcdGNvbnN0IG9UeXBlQ29uZmlnID0gcHJvcGVydHlUeXBlQ29uZmlnXG5cdFx0XHRcdD8ge1xuXHRcdFx0XHRcdFx0Y2xhc3NOYW1lOiBkYXRhVHlwZSxcblx0XHRcdFx0XHRcdG9Gb3JtYXRPcHRpb25zOiB7XG5cdFx0XHRcdFx0XHRcdC4uLmZvcm1hdE9wdGlvbnMsXG5cdFx0XHRcdFx0XHRcdC4uLnByb3BlcnR5VHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0b0NvbnN0cmFpbnRzOiBwcm9wZXJ0eVR5cGVDb25maWcuY29uc3RyYWludHNcblx0XHRcdFx0ICB9XG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0bGV0IHZpc3VhbFNldHRpbmdzOiBWaXN1YWxTZXR0aW5ncyA9IHt9O1xuXHRcdFx0aWYgKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby52aXN1YWxTZXR0aW5nc1RvQmVFeGNsdWRlZCkge1xuXHRcdFx0XHQvLyBJbiBjYXNlIG9mIHRleHQgYXJyYW5nZW1lbnQgYW5ub3RhdGlvbiB3aXRoIGRpc3BsYXkgbW9kZSBhcyB0ZXh0IG9ubHksIGV4Y2x1ZGUgdGV4dCBwcm9wZXJ0eSBmcm9tIHRoZSB3aWR0aCBjYWxjdWxhdGlvblxuXHRcdFx0XHR2aXN1YWxTZXR0aW5ncyA9IHtcblx0XHRcdFx0XHR3aWR0aENhbGN1bGF0aW9uOiB7XG5cdFx0XHRcdFx0XHRleGNsdWRlUHJvcGVydGllczogW1wiUHJvcGVydHk6OlwiICsgcmVsYXRlZFByb3BlcnRpZXNJbmZvLnZpc3VhbFNldHRpbmdzVG9CZUV4Y2x1ZGVkXVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSBpZiAoIWRhdGFUeXBlIHx8ICFvVHlwZUNvbmZpZykge1xuXHRcdFx0XHQvLyBmb3IgY2hhcnRzXG5cdFx0XHRcdHZpc3VhbFNldHRpbmdzLndpZHRoQ2FsY3VsYXRpb24gPSBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBvQ29sdW1uOiBhbnkgPSB7XG5cdFx0XHRcdGtleTogS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChsaW5lSXRlbSksXG5cdFx0XHRcdHR5cGU6IENvbHVtblR5cGUuQW5ub3RhdGlvbixcblx0XHRcdFx0bGFiZWw6IHNMYWJlbCxcblx0XHRcdFx0Z3JvdXBMYWJlbDogaXNHcm91cCA/IF9nZXRMYWJlbChsaW5lSXRlbSkgOiBudWxsLFxuXHRcdFx0XHRncm91cDogaXNHcm91cCA/IGdyb3VwUGF0aCA6IG51bGwsXG5cdFx0XHRcdEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9uczogZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zLFxuXHRcdFx0XHRhbm5vdGF0aW9uUGF0aDogY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGxpbmVJdGVtLmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdHNlbWFudGljT2JqZWN0UGF0aDogc2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0YXZhaWxhYmlsaXR5OiBpc0RhdGFGaWVsZEFsd2F5c0hpZGRlbihsaW5lSXRlbSkgPyBBdmFpbGFiaWxpdHlUeXBlLkhpZGRlbiA6IEF2YWlsYWJpbGl0eVR5cGUuRGVmYXVsdCxcblx0XHRcdFx0bmFtZTogbmFtZSxcblx0XHRcdFx0c2hvd0RhdGFGaWVsZHNMYWJlbDogc2hvd0RhdGFGaWVsZHNMYWJlbCxcblx0XHRcdFx0cmVsYXRpdmVQYXRoOiByZWxhdGl2ZVBhdGgsXG5cdFx0XHRcdHNvcnRhYmxlOiBfaXNDb2x1bW5Tb3J0YWJsZShsaW5lSXRlbSwgcmVsYXRpdmVQYXRoLCBub25Tb3J0YWJsZUNvbHVtbnMpLFxuXHRcdFx0XHRwcm9wZXJ0eUluZm9zOiByZWxhdGVkUHJvcGVydHlOYW1lcy5sZW5ndGggPiAwID8gcmVsYXRlZFByb3BlcnR5TmFtZXMgOiB1bmRlZmluZWQsXG5cdFx0XHRcdGFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zOiBhZGRpdGlvbmFsUHJvcGVydHlOYW1lcy5sZW5ndGggPiAwID8gYWRkaXRpb25hbFByb3BlcnR5TmFtZXMgOiB1bmRlZmluZWQsXG5cdFx0XHRcdGV4cG9ydFNldHRpbmdzOiBleHBvcnRTZXR0aW5ncyxcblx0XHRcdFx0d2lkdGg6IGxpbmVJdGVtLmFubm90YXRpb25zPy5IVE1MNT8uQ3NzRGVmYXVsdHM/LndpZHRoIHx8IHVuZGVmaW5lZCxcblx0XHRcdFx0aW1wb3J0YW5jZTogZ2V0SW1wb3J0YW5jZShsaW5lSXRlbSBhcyBEYXRhRmllbGRUeXBlcywgc2VtYW50aWNLZXlzKSxcblx0XHRcdFx0aXNOYXZpZ2FibGU6IHRydWUsXG5cdFx0XHRcdGZvcm1hdE9wdGlvbnM6IGZvcm1hdE9wdGlvbnMsXG5cdFx0XHRcdGV4cG9ydENvbnRhY3RQcm9wZXJ0eTogcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFNldHRpbmdzQ29udGFjdFByb3BlcnR5LFxuXHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUoY29udmVydGVyQ29udGV4dCksXG5cdFx0XHRcdHR5cGVDb25maWc6IG9UeXBlQ29uZmlnLFxuXHRcdFx0XHR2aXN1YWxTZXR0aW5nczogdmlzdWFsU2V0dGluZ3MsXG5cdFx0XHRcdHRpbWV6b25lVGV4dDogZXhwb3J0U2V0dGluZ3MudGltZXpvbmVcblx0XHRcdH07XG5cdFx0XHRjb25zdCBzVG9vbHRpcCA9IF9nZXRUb29sdGlwKGxpbmVJdGVtKTtcblx0XHRcdGlmIChzVG9vbHRpcCkge1xuXHRcdFx0XHRvQ29sdW1uLnRvb2x0aXAgPSBzVG9vbHRpcDtcblx0XHRcdH1cblxuXHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMucHVzaChvQ29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbik7XG5cblx0XHRcdC8vIENvbGxlY3QgaW5mb3JtYXRpb24gb2YgcmVsYXRlZCBjb2x1bW5zIHRvIGJlIGNyZWF0ZWQuXG5cdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lcy5mb3JFYWNoKChuYW1lKSA9PiB7XG5cdFx0XHRcdGNvbHVtbnNUb0JlQ3JlYXRlZFtuYW1lXSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzW25hbWVdO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIENyZWF0ZSBjb2x1bW5zIGZvciBhZGRpdGlvbmFsIHByb3BlcnRpZXMgaWRlbnRpZmllZCBmb3IgQUxQIHVzZSBjYXNlLlxuXHRcdFx0YWRkaXRpb25hbFByb3BlcnR5TmFtZXMuZm9yRWFjaCgobmFtZSkgPT4ge1xuXHRcdFx0XHQvLyBJbnRlbnRpb25hbCBvdmVyd3JpdGUgYXMgd2UgcmVxdWlyZSBvbmx5IG9uZSBuZXcgUHJvcGVydHlJbmZvIGZvciBhIHJlbGF0ZWQgUHJvcGVydHkuXG5cdFx0XHRcdGNvbHVtbnNUb0JlQ3JlYXRlZFtuYW1lXSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5hZGRpdGlvbmFsUHJvcGVydGllc1tuYW1lXTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0Ly8gR2V0IGNvbHVtbnMgZnJvbSB0aGUgUHJvcGVydGllcyBvZiBFbnRpdHlUeXBlXG5cdGxldCB0YWJsZUNvbHVtbnMgPSBnZXRDb2x1bW5zRnJvbUVudGl0eVR5cGUoXG5cdFx0Y29sdW1uc1RvQmVDcmVhdGVkLFxuXHRcdGVudGl0eVR5cGUsXG5cdFx0YW5ub3RhdGlvbkNvbHVtbnMsXG5cdFx0bm9uU29ydGFibGVDb2x1bW5zLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0dGFibGVUeXBlXG5cdCk7XG5cdHRhYmxlQ29sdW1ucyA9IHRhYmxlQ29sdW1ucy5jb25jYXQoYW5ub3RhdGlvbkNvbHVtbnMpO1xuXG5cdC8vIENyZWF0ZSBhIHByb3BlcnR5SW5mbyBmb3IgZWFjaCByZWxhdGVkIHByb3BlcnR5LlxuXHRjb25zdCByZWxhdGVkQ29sdW1ucyA9IF9jcmVhdGVSZWxhdGVkQ29sdW1ucyhjb2x1bW5zVG9CZUNyZWF0ZWQsIHRhYmxlQ29sdW1ucywgbm9uU29ydGFibGVDb2x1bW5zLCBjb252ZXJ0ZXJDb250ZXh0LCBlbnRpdHlUeXBlKTtcblx0dGFibGVDb2x1bW5zID0gdGFibGVDb2x1bW5zLmNvbmNhdChyZWxhdGVkQ29sdW1ucyk7XG5cblx0cmV0dXJuIHRhYmxlQ29sdW1ucztcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgcHJvcGVydHkgbmFtZXMgZnJvbSB0aGUgbWFuaWZlc3QgYW5kIGNoZWNrcyBhZ2FpbnN0IGV4aXN0aW5nIHByb3BlcnRpZXMgYWxyZWFkeSBhZGRlZCBieSBhbm5vdGF0aW9ucy5cbiAqIElmIGEgbm90IHlldCBzdG9yZWQgcHJvcGVydHkgaXMgZm91bmQgaXQgYWRkcyBpdCBmb3Igc29ydGluZyBhbmQgZmlsdGVyaW5nIG9ubHkgdG8gdGhlIGFubm90YXRpb25Db2x1bW5zLlxuICogQHBhcmFtIHtzdHJpbmdbXSB8IHVuZGVmaW5lZH0gcHJvcGVydGllc1xuICogQHBhcmFtIHtBbm5vdGF0aW9uVGFibGVDb2x1bW5bXX0gYW5ub3RhdGlvbkNvbHVtbnNcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIGVudGl0eVR5cGVcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gVGhlIGNvbHVtbnMgZnJvbSB0aGUgYW5ub3RhdGlvbnNcbiAqL1xuY29uc3QgX2dldFByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiAoXG5cdHByb3BlcnRpZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuXHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGVcbik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcblx0bGV0IG1hdGNoZWRQcm9wZXJ0aWVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblx0aWYgKHByb3BlcnRpZXMpIHtcblx0XHRtYXRjaGVkUHJvcGVydGllcyA9IHByb3BlcnRpZXMubWFwKGZ1bmN0aW9uIChwcm9wZXJ0eVBhdGgpIHtcblx0XHRcdGNvbnN0IGFubm90YXRpb25Db2x1bW4gPSBhbm5vdGF0aW9uQ29sdW1ucy5maW5kKGZ1bmN0aW9uIChhbm5vdGF0aW9uQ29sdW1uKSB7XG5cdFx0XHRcdHJldHVybiBhbm5vdGF0aW9uQ29sdW1uLnJlbGF0aXZlUGF0aCA9PT0gcHJvcGVydHlQYXRoICYmIGFubm90YXRpb25Db2x1bW4ucHJvcGVydHlJbmZvcyA9PT0gdW5kZWZpbmVkO1xuXHRcdFx0fSk7XG5cdFx0XHRpZiAoYW5ub3RhdGlvbkNvbHVtbikge1xuXHRcdFx0XHRyZXR1cm4gYW5ub3RhdGlvbkNvbHVtbi5uYW1lO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgcmVsYXRlZENvbHVtbnMgPSBfY3JlYXRlUmVsYXRlZENvbHVtbnMoXG5cdFx0XHRcdFx0eyBbcHJvcGVydHlQYXRoXTogZW50aXR5VHlwZS5yZXNvbHZlUGF0aChwcm9wZXJ0eVBhdGgpIH0sXG5cdFx0XHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMsXG5cdFx0XHRcdFx0W10sXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRlbnRpdHlUeXBlXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGFubm90YXRpb25Db2x1bW5zLnB1c2gocmVsYXRlZENvbHVtbnNbMF0pO1xuXHRcdFx0XHRyZXR1cm4gcmVsYXRlZENvbHVtbnNbMF0ubmFtZTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHJldHVybiBtYXRjaGVkUHJvcGVydGllcztcbn07XG5cbmNvbnN0IF9hcHBlbmRDdXN0b21UZW1wbGF0ZSA9IGZ1bmN0aW9uIChwcm9wZXJ0aWVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG5cdHJldHVybiBwcm9wZXJ0aWVzXG5cdFx0Lm1hcCgocHJvcGVydHkpID0+IHtcblx0XHRcdHJldHVybiBgeyR7cHJvcGVydGllcy5pbmRleE9mKHByb3BlcnR5KX19YDtcblx0XHR9KVxuXHRcdC5qb2luKGAke1wiXFxuXCJ9YCk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgdGFibGUgY29sdW1uIHByb3BlcnR5IHZhbHVlIGJhc2VkIG9uIGNlcnRhaW4gY29uZGl0aW9ucy5cbiAqXG4gKiBNYW5pZmVzdCBkZWZpbmVkIHByb3BlcnR5IHZhbHVlIGZvciBjdXN0b20gLyBhbm5vdGF0aW9uIGNvbHVtbnNcbiAqIERlZmF1bHQgcHJvcGVydHkgdmFsdWUgZm9yIGN1c3RvbSBjb2x1bW4gaWYgbm90IG92ZXJ3cml0dGVuIGluIG1hbmlmZXN0LlxuICpcbiAqIEBwYXJhbSB7YW55fSBwcm9wZXJ0eSBUaGUgY29sdW1uIHByb3BlcnR5IGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG4gKiBAcGFyYW0ge2FueX0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eVxuICogQHBhcmFtIHtib29sZWFufSBpc0Fubm90YXRpb25Db2x1bW4gV2hldGhlciB0aGUgY29sdW1uLCBkZWZpbmVkIGluIG1hbmlmZXN0LCBjb3JyZXNwb25kcyB0byBhbiBleGlzdGluZyBhbm5vdGF0aW9uIGNvbHVtbi5cbiAqIEByZXR1cm5zIHthbnl9IERldGVybWluZWQgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBjb2x1bW5cbiAqL1xuY29uc3QgX2dldE1hbmlmZXN0T3JEZWZhdWx0VmFsdWUgPSBmdW5jdGlvbiAocHJvcGVydHk6IGFueSwgZGVmYXVsdFZhbHVlOiBhbnksIGlzQW5ub3RhdGlvbkNvbHVtbjogYm9vbGVhbik6IGFueSB7XG5cdGlmIChwcm9wZXJ0eSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly8gSWYgYW5ub3RhdGlvbiBjb2x1bW4gaGFzIG5vIHByb3BlcnR5IGRlZmluZWQgaW4gbWFuaWZlc3QsXG5cdFx0Ly8gZG8gbm90IG92ZXJ3cml0ZSBpdCB3aXRoIG1hbmlmZXN0IGNvbHVtbidzIGRlZmF1bHQgdmFsdWUuXG5cdFx0cmV0dXJuIGlzQW5ub3RhdGlvbkNvbHVtbiA/IHVuZGVmaW5lZCA6IGRlZmF1bHRWYWx1ZTtcblx0fVxuXHQvLyBSZXR1cm4gd2hhdCBpcyBkZWZpbmVkIGluIG1hbmlmZXN0LlxuXHRyZXR1cm4gcHJvcGVydHk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGFibGUgY29sdW1uIGRlZmluaXRpb25zIGZyb20gbWFuaWZlc3QuXG4gKiBAcGFyYW0gY29sdW1uc1xuICogQHBhcmFtIGFubm90YXRpb25Db2x1bW5zXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIGVudGl0eVR5cGVcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uU2V0dGluZ3NcbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBDdXN0b21Db2x1bW4+fSBUaGUgY29sdW1ucyBmcm9tIHRoZSBtYW5pZmVzdFxuICovXG5jb25zdCBnZXRDb2x1bW5zRnJvbU1hbmlmZXN0ID0gZnVuY3Rpb24gKFxuXHRjb2x1bW5zOiBSZWNvcmQ8c3RyaW5nLCBNYW5pZmVzdFRhYmxlQ29sdW1uPixcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRuYXZpZ2F0aW9uU2V0dGluZ3M/OiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uXG4pOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21Db2x1bW4+IHtcblx0Y29uc3QgaW50ZXJuYWxDb2x1bW5zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21Db2x1bW4+ID0ge307XG5cblx0Zm9yIChjb25zdCBrZXkgaW4gY29sdW1ucykge1xuXHRcdGNvbnN0IG1hbmlmZXN0Q29sdW1uID0gY29sdW1uc1trZXldO1xuXHRcdC8vIFRvIGlkZW50aWZ5IHRoZSBhbm5vdGF0aW9uIGNvbHVtbiBwcm9wZXJ0eSBvdmVyd3JpdGUgdmlhIG1hbmlmZXN0IHVzZS1jYXNlLlxuXHRcdGNvbnN0IGlzQW5ub3RhdGlvbkNvbHVtbiA9IGFubm90YXRpb25Db2x1bW5zLnNvbWUoKGNvbHVtbikgPT4gY29sdW1uLmtleSA9PT0ga2V5KTtcblx0XHRLZXlIZWxwZXIudmFsaWRhdGVLZXkoa2V5KTtcblx0XHRjb25zdCBwcm9wZXJ0eUluZm9zOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCA9IF9nZXRQcm9wZXJ0eU5hbWVzKFxuXHRcdFx0bWFuaWZlc3RDb2x1bW4ucHJvcGVydGllcyxcblx0XHRcdGFubm90YXRpb25Db2x1bW5zLFxuXHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdGVudGl0eVR5cGVcblx0XHQpO1xuXHRcdGlmICghbWFuaWZlc3RDb2x1bW4/LnRlbXBsYXRlICYmIG1hbmlmZXN0Q29sdW1uPy50eXBlICE9PSBcIlNsb3RcIiAmJiAhaXNBbm5vdGF0aW9uQ29sdW1uKSB7XG5cdFx0XHRjb25zdCBNZXNzYWdlID0gXCJUaGUgYW5ub3RhdGlvbiBjb2x1bW4gJ1wiICsga2V5ICsgXCInIHJlZmVyZW5jZWQgaW4gdGhlIG1hbmlmZXN0IGlzIG5vdCBmb3VuZFwiO1xuXHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHQuZ2V0RGlhZ25vc3RpY3MoKVxuXHRcdFx0XHQuYWRkSXNzdWUoXG5cdFx0XHRcdFx0SXNzdWVDYXRlZ29yeS5NYW5pZmVzdCxcblx0XHRcdFx0XHRJc3N1ZVNldmVyaXR5Lkxvdyxcblx0XHRcdFx0XHRNZXNzYWdlLFxuXHRcdFx0XHRcdElzc3VlQ2F0ZWdvcnlUeXBlLFxuXHRcdFx0XHRcdElzc3VlQ2F0ZWdvcnlUeXBlPy5Bbm5vdGF0aW9uQ29sdW1ucz8uSW52YWxpZEtleVxuXHRcdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpbnRlcm5hbENvbHVtbnNba2V5XSA9IHtcblx0XHRcdFx0a2V5OiBrZXksXG5cdFx0XHRcdGlkOiBcIkN1c3RvbUNvbHVtbjo6XCIgKyBrZXksXG5cdFx0XHRcdG5hbWU6IFwiQ3VzdG9tQ29sdW1uOjpcIiArIGtleSxcblx0XHRcdFx0aGVhZGVyOiBtYW5pZmVzdENvbHVtbi5oZWFkZXIsXG5cdFx0XHRcdHdpZHRoOiBtYW5pZmVzdENvbHVtbi53aWR0aCB8fCB1bmRlZmluZWQsXG5cdFx0XHRcdGltcG9ydGFuY2U6IF9nZXRNYW5pZmVzdE9yRGVmYXVsdFZhbHVlKG1hbmlmZXN0Q29sdW1uPy5pbXBvcnRhbmNlLCBJbXBvcnRhbmNlLk5vbmUsIGlzQW5ub3RhdGlvbkNvbHVtbiksXG5cdFx0XHRcdGhvcml6b250YWxBbGlnbjogX2dldE1hbmlmZXN0T3JEZWZhdWx0VmFsdWUobWFuaWZlc3RDb2x1bW4/Lmhvcml6b250YWxBbGlnbiwgSG9yaXpvbnRhbEFsaWduLkJlZ2luLCBpc0Fubm90YXRpb25Db2x1bW4pLFxuXHRcdFx0XHR0eXBlOiBtYW5pZmVzdENvbHVtbi50eXBlID09PSBcIlNsb3RcIiA/IENvbHVtblR5cGUuU2xvdCA6IENvbHVtblR5cGUuRGVmYXVsdCxcblx0XHRcdFx0YXZhaWxhYmlsaXR5OiBfZ2V0TWFuaWZlc3RPckRlZmF1bHRWYWx1ZShtYW5pZmVzdENvbHVtbj8uYXZhaWxhYmlsaXR5LCBBdmFpbGFiaWxpdHlUeXBlLkRlZmF1bHQsIGlzQW5ub3RhdGlvbkNvbHVtbiksXG5cdFx0XHRcdHRlbXBsYXRlOiBtYW5pZmVzdENvbHVtbi50ZW1wbGF0ZSB8fCBcInVuZGVmaW5lZFwiLFxuXHRcdFx0XHRwb3NpdGlvbjoge1xuXHRcdFx0XHRcdGFuY2hvcjogbWFuaWZlc3RDb2x1bW4ucG9zaXRpb24/LmFuY2hvcixcblx0XHRcdFx0XHRwbGFjZW1lbnQ6IG1hbmlmZXN0Q29sdW1uLnBvc2l0aW9uID09PSB1bmRlZmluZWQgPyBQbGFjZW1lbnQuQWZ0ZXIgOiBtYW5pZmVzdENvbHVtbi5wb3NpdGlvbi5wbGFjZW1lbnRcblx0XHRcdFx0fSxcblx0XHRcdFx0aXNOYXZpZ2FibGU6IGlzQW5ub3RhdGlvbkNvbHVtbiA/IHVuZGVmaW5lZCA6IGlzQWN0aW9uTmF2aWdhYmxlKG1hbmlmZXN0Q29sdW1uLCBuYXZpZ2F0aW9uU2V0dGluZ3MsIHRydWUpLFxuXHRcdFx0XHRzZXR0aW5nczogbWFuaWZlc3RDb2x1bW4uc2V0dGluZ3MsXG5cdFx0XHRcdHNvcnRhYmxlOiBmYWxzZSxcblx0XHRcdFx0aXNHcm91cGFibGU6IGZhbHNlLFxuXHRcdFx0XHRwcm9wZXJ0eUluZm9zOiBwcm9wZXJ0eUluZm9zLFxuXHRcdFx0XHRmb3JtYXRPcHRpb25zOiBfZ2V0TWFuaWZlc3RPckRlZmF1bHRWYWx1ZShcblx0XHRcdFx0XHRtYW5pZmVzdENvbHVtbi5mb3JtYXRPcHRpb25zLFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdC4uLmdldERlZmF1bHRGb3JtYXRPcHRpb25zRm9yVGFibGUoKSxcblx0XHRcdFx0XHRcdC4uLm1hbmlmZXN0Q29sdW1uLmZvcm1hdE9wdGlvbnNcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGlzQW5ub3RhdGlvbkNvbHVtblxuXHRcdFx0XHQpLFxuXHRcdFx0XHRleHBvcnRTZXR0aW5nczoge1xuXHRcdFx0XHRcdHRlbXBsYXRlOiBwcm9wZXJ0eUluZm9zID8gX2FwcGVuZEN1c3RvbVRlbXBsYXRlKHByb3BlcnR5SW5mb3MpIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRcdHdyYXA6IHByb3BlcnR5SW5mb3MgJiYgcHJvcGVydHlJbmZvcy5sZW5ndGggPiAxID8gdHJ1ZSA6IGZhbHNlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGNhc2VTZW5zaXRpdmU6IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShjb252ZXJ0ZXJDb250ZXh0KVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGludGVybmFsQ29sdW1ucztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQMTNuTW9kZShcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb25cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IG1hbmlmZXN0V3JhcHBlcjogTWFuaWZlc3RXcmFwcGVyID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKTtcblx0Y29uc3QgdGFibGVNYW5pZmVzdFNldHRpbmdzOiBUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2aXN1YWxpemF0aW9uUGF0aCk7XG5cdGNvbnN0IHZhcmlhbnRNYW5hZ2VtZW50OiBWYXJpYW50TWFuYWdlbWVudFR5cGUgPSBtYW5pZmVzdFdyYXBwZXIuZ2V0VmFyaWFudE1hbmFnZW1lbnQoKTtcblx0Y29uc3QgYVBlcnNvbmFsaXphdGlvbjogc3RyaW5nW10gPSBbXTtcblx0Y29uc3QgaXNBbmFseXRpY2FsVGFibGUgPSB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi50eXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiO1xuXHRjb25zdCBpc1Jlc3BvbnNpdmVUYWJsZSA9IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLnR5cGUgPT09IFwiUmVzcG9uc2l2ZVRhYmxlXCI7XG5cdGlmICh0YWJsZU1hbmlmZXN0U2V0dGluZ3M/LnRhYmxlU2V0dGluZ3M/LnBlcnNvbmFsaXphdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly8gUGVyc29uYWxpemF0aW9uIGNvbmZpZ3VyZWQgaW4gbWFuaWZlc3QuXG5cdFx0Y29uc3QgcGVyc29uYWxpemF0aW9uOiBhbnkgPSB0YWJsZU1hbmlmZXN0U2V0dGluZ3MudGFibGVTZXR0aW5ncy5wZXJzb25hbGl6YXRpb247XG5cdFx0aWYgKHBlcnNvbmFsaXphdGlvbiA9PT0gdHJ1ZSkge1xuXHRcdFx0Ly8gVGFibGUgcGVyc29uYWxpemF0aW9uIGZ1bGx5IGVuYWJsZWQuXG5cdFx0XHRzd2l0Y2ggKHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLnR5cGUpIHtcblx0XHRcdFx0Y2FzZSBcIkFuYWx5dGljYWxUYWJsZVwiOlxuXHRcdFx0XHRcdHJldHVybiBcIlNvcnQsQ29sdW1uLEZpbHRlcixHcm91cCxBZ2dyZWdhdGVcIjtcblx0XHRcdFx0Y2FzZSBcIlJlc3BvbnNpdmVUYWJsZVwiOlxuXHRcdFx0XHRcdHJldHVybiBcIlNvcnQsQ29sdW1uLEZpbHRlcixHcm91cFwiO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdHJldHVybiBcIlNvcnQsQ29sdW1uLEZpbHRlclwiO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHBlcnNvbmFsaXphdGlvbiA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0Ly8gU3BlY2lmaWMgcGVyc29uYWxpemF0aW9uIG9wdGlvbnMgZW5hYmxlZCBpbiBtYW5pZmVzdC4gVXNlIHRoZW0gYXMgaXMuXG5cdFx0XHRpZiAocGVyc29uYWxpemF0aW9uLnNvcnQpIHtcblx0XHRcdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiU29ydFwiKTtcblx0XHRcdH1cblx0XHRcdGlmIChwZXJzb25hbGl6YXRpb24uY29sdW1uKSB7XG5cdFx0XHRcdGFQZXJzb25hbGl6YXRpb24ucHVzaChcIkNvbHVtblwiKTtcblx0XHRcdH1cblx0XHRcdGlmIChwZXJzb25hbGl6YXRpb24uZmlsdGVyKSB7XG5cdFx0XHRcdGFQZXJzb25hbGl6YXRpb24ucHVzaChcIkZpbHRlclwiKTtcblx0XHRcdH1cblx0XHRcdGlmIChwZXJzb25hbGl6YXRpb24uZ3JvdXAgJiYgKGlzQW5hbHl0aWNhbFRhYmxlIHx8IGlzUmVzcG9uc2l2ZVRhYmxlKSkge1xuXHRcdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJHcm91cFwiKTtcblx0XHRcdH1cblx0XHRcdGlmIChwZXJzb25hbGl6YXRpb24uYWdncmVnYXRlICYmIGlzQW5hbHl0aWNhbFRhYmxlKSB7XG5cdFx0XHRcdGFQZXJzb25hbGl6YXRpb24ucHVzaChcIkFnZ3JlZ2F0ZVwiKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBhUGVyc29uYWxpemF0aW9uLmxlbmd0aCA+IDAgPyBhUGVyc29uYWxpemF0aW9uLmpvaW4oXCIsXCIpIDogdW5kZWZpbmVkO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBObyBwZXJzb25hbGl6YXRpb24gY29uZmlndXJlZCBpbiBtYW5pZmVzdC5cblx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJTb3J0XCIpO1xuXHRcdGFQZXJzb25hbGl6YXRpb24ucHVzaChcIkNvbHVtblwiKTtcblx0XHRpZiAoY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQpIHtcblx0XHRcdGlmICh2YXJpYW50TWFuYWdlbWVudCA9PT0gVmFyaWFudE1hbmFnZW1lbnRUeXBlLkNvbnRyb2wgfHwgX2lzRmlsdGVyQmFySGlkZGVuKG1hbmlmZXN0V3JhcHBlciwgY29udmVydGVyQ29udGV4dCkpIHtcblx0XHRcdFx0Ly8gRmVhdHVyZSBwYXJpdHkgd2l0aCBWMi5cblx0XHRcdFx0Ly8gRW5hYmxlIHRhYmxlIGZpbHRlcmluZyBieSBkZWZhdWx0IG9ubHkgaW4gY2FzZSBvZiBDb250cm9sIGxldmVsIHZhcmlhbnQgbWFuYWdlbWVudC5cblx0XHRcdFx0Ly8gT3Igd2hlbiB0aGUgTFIgZmlsdGVyIGJhciBpcyBoaWRkZW4gdmlhIG1hbmlmZXN0IHNldHRpbmdcblx0XHRcdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiRmlsdGVyXCIpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJGaWx0ZXJcIik7XG5cdFx0fVxuXG5cdFx0aWYgKGlzQW5hbHl0aWNhbFRhYmxlKSB7XG5cdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJHcm91cFwiKTtcblx0XHRcdGFQZXJzb25hbGl6YXRpb24ucHVzaChcIkFnZ3JlZ2F0ZVwiKTtcblx0XHR9XG5cdFx0aWYgKGlzUmVzcG9uc2l2ZVRhYmxlKSB7XG5cdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJHcm91cFwiKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFQZXJzb25hbGl6YXRpb24uam9pbihcIixcIik7XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgQm9vbGVhbiB2YWx1ZSBzdWdnZXN0aW5nIGlmIGEgZmlsdGVyIGJhciBpcyBiZWluZyB1c2VkIG9uIHRoZSBwYWdlLlxuICpcbiAqIENoYXJ0IGhhcyBhIGRlcGVuZGVuY3kgdG8gZmlsdGVyIGJhciAoaXNzdWUgd2l0aCBsb2FkaW5nIGRhdGEpLiBPbmNlIHJlc29sdmVkLCB0aGUgY2hlY2sgZm9yIGNoYXJ0IHNob3VsZCBiZSByZW1vdmVkIGhlcmUuXG4gKiBVbnRpbCB0aGVuLCBoaWRpbmcgZmlsdGVyIGJhciBpcyBub3cgYWxsb3dlZCBpZiBhIGNoYXJ0IGlzIGJlaW5nIHVzZWQgb24gTFIuXG4gKlxuICogQHBhcmFtIHtNYW5pZmVzdFdyYXBwZXJ9IG1hbmlmZXN0V3JhcHBlciBNYW5pZmVzdCBzZXR0aW5ncyBnZXR0ZXIgZm9yIHRoZSBwYWdlXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge2Jvb2xlYW59IEJvb2xlYW4gc3VnZ2VzdGluZyBpZiBhIGZpbHRlciBiYXIgaXMgYmVpbmcgdXNlZCBvbiB0aGUgcGFnZS5cbiAqL1xuZnVuY3Rpb24gX2lzRmlsdGVyQmFySGlkZGVuKG1hbmlmZXN0V3JhcHBlcjogTWFuaWZlc3RXcmFwcGVyLCBjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogYm9vbGVhbiB7XG5cdHJldHVybiAoXG5cdFx0bWFuaWZlc3RXcmFwcGVyLmlzRmlsdGVyQmFySGlkZGVuKCkgJiZcblx0XHQhY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5oYXNNdWx0aXBsZVZpc3VhbGl6YXRpb25zKCkgJiZcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlXG5cdCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIEpTT04gc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNvcnQgY29uZGl0aW9ucyBmb3IgdGhlIHByZXNlbnRhdGlvbiB2YXJpYW50LlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSB7UHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlcyB8IHVuZGVmaW5lZH0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24gUHJlc2VudGF0aW9uIHZhcmlhbnQgYW5ub3RhdGlvblxuICogQHBhcmFtIGNvbHVtbnMgVGFibGUgY29sdW1ucyBwcm9jZXNzZWQgYnkgdGhlIGNvbnZlcnRlclxuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gU29ydCBjb25kaXRpb25zIGZvciBhIHByZXNlbnRhdGlvbiB2YXJpYW50LlxuICovXG5mdW5jdGlvbiBnZXRTb3J0Q29uZGl0aW9ucyhcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb246IFByZXNlbnRhdGlvblZhcmlhbnRUeXBlVHlwZXMgfCB1bmRlZmluZWQsXG5cdGNvbHVtbnM6IFRhYmxlQ29sdW1uW11cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdC8vIEN1cnJlbnRseSBuYXZpZ2F0aW9uIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQgYXMgc29ydGVyXG5cdGNvbnN0IG5vblNvcnRhYmxlUHJvcGVydGllcyA9IGdldE5vblNvcnRhYmxlUHJvcGVydGllc1Jlc3RyaWN0aW9ucyhjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpKTtcblx0bGV0IHNvcnRDb25kaXRpb25zOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGlmIChwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj8uU29ydE9yZGVyKSB7XG5cdFx0Y29uc3Qgc29ydGVyczogU29ydGVyVHlwZVtdID0gW107XG5cdFx0Y29uc3QgY29uZGl0aW9ucyA9IHtcblx0XHRcdHNvcnRlcnM6IHNvcnRlcnNcblx0XHR9O1xuXHRcdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLlNvcnRPcmRlci5mb3JFYWNoKChjb25kaXRpb24pID0+IHtcblx0XHRcdGNvbnN0IGNvbmRpdGlvblByb3BlcnR5ID0gY29uZGl0aW9uLlByb3BlcnR5O1xuXHRcdFx0aWYgKGNvbmRpdGlvblByb3BlcnR5ICYmIG5vblNvcnRhYmxlUHJvcGVydGllcy5pbmRleE9mKGNvbmRpdGlvblByb3BlcnR5LiR0YXJnZXQ/Lm5hbWUpID09PSAtMSkge1xuXHRcdFx0XHRjb25zdCBpbmZvTmFtZSA9IGNvbnZlcnRQcm9wZXJ0eVBhdGhzVG9JbmZvTmFtZXMoW2NvbmRpdGlvblByb3BlcnR5XSwgY29sdW1ucylbMF07XG5cdFx0XHRcdGlmIChpbmZvTmFtZSkge1xuXHRcdFx0XHRcdGNvbmRpdGlvbnMuc29ydGVycy5wdXNoKHtcblx0XHRcdFx0XHRcdG5hbWU6IGluZm9OYW1lLFxuXHRcdFx0XHRcdFx0ZGVzY2VuZGluZzogISFjb25kaXRpb24uRGVzY2VuZGluZ1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0c29ydENvbmRpdGlvbnMgPSBjb25kaXRpb25zLnNvcnRlcnMubGVuZ3RoID8gSlNPTi5zdHJpbmdpZnkoY29uZGl0aW9ucykgOiB1bmRlZmluZWQ7XG5cdH1cblx0cmV0dXJuIHNvcnRDb25kaXRpb25zO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGFycmF5IG9mIHByb3BlcnR5UGF0aCB0byBhbiBhcnJheSBvZiBwcm9wZXJ0eUluZm8gbmFtZXMuXG4gKlxuICogQHBhcmFtIHBhdGhzIHRoZSBhcnJheSB0byBiZSBjb252ZXJ0ZWRcbiAqIEBwYXJhbSBjb2x1bW5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eUluZm9zXG4gKiBAcmV0dXJucyBhbiBhcnJheSBvZiBwcm9wZXJ0eUluZm8gbmFtZXNcbiAqL1xuXG5mdW5jdGlvbiBjb252ZXJ0UHJvcGVydHlQYXRoc1RvSW5mb05hbWVzKHBhdGhzOiBQcm9wZXJ0eVBhdGhbXSwgY29sdW1uczogVGFibGVDb2x1bW5bXSk6IHN0cmluZ1tdIHtcblx0Y29uc3QgaW5mb05hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRwYXRocy5mb3JFYWNoKChjdXJyZW50UGF0aCkgPT4ge1xuXHRcdGlmIChjdXJyZW50UGF0aD8uJHRhcmdldD8ubmFtZSkge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlJbmZvID0gY29sdW1ucy5maW5kKChjb2x1bW4pID0+IHtcblx0XHRcdFx0Y29uc3QgYW5ub3RhdGlvbkNvbHVtbiA9IGNvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0XHRcdHJldHVybiAhYW5ub3RhdGlvbkNvbHVtbi5wcm9wZXJ0eUluZm9zICYmIGFubm90YXRpb25Db2x1bW4ucmVsYXRpdmVQYXRoID09PSBjdXJyZW50UGF0aD8uJHRhcmdldD8ubmFtZTtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKHByb3BlcnR5SW5mbykge1xuXHRcdFx0XHRpbmZvTmFtZXMucHVzaChwcm9wZXJ0eUluZm8ubmFtZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHRyZXR1cm4gaW5mb05hbWVzO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBKU09OIHN0cmluZyBjb250YWluaW5nIFByZXNlbnRhdGlvbiBWYXJpYW50IGdyb3VwIGNvbmRpdGlvbnMuXG4gKlxuICogQHBhcmFtIHtQcmVzZW50YXRpb25WYXJpYW50VHlwZVR5cGVzIHwgdW5kZWZpbmVkfSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiBQcmVzZW50YXRpb24gdmFyaWFudCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gY29sdW1ucyBDb252ZXJ0ZXIgcHJvY2Vzc2VkIHRhYmxlIGNvbHVtbnNcbiAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IEdyb3VwIGNvbmRpdGlvbnMgZm9yIGEgUHJlc2VudGF0aW9uIHZhcmlhbnQuXG4gKi9cbmZ1bmN0aW9uIGdldEdyb3VwQ29uZGl0aW9ucyhcblx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb246IFByZXNlbnRhdGlvblZhcmlhbnRUeXBlVHlwZXMgfCB1bmRlZmluZWQsXG5cdGNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdHRhYmxlVHlwZTogc3RyaW5nXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRsZXQgZ3JvdXBDb25kaXRpb25zOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGlmIChwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj8uR3JvdXBCeSkge1xuXHRcdGxldCBhR3JvdXBCeSA9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLkdyb3VwQnkgYXMgUHJvcGVydHlQYXRoW107XG5cdFx0aWYgKHRhYmxlVHlwZSA9PT0gXCJSZXNwb25zaXZlVGFibGVcIikge1xuXHRcdFx0YUdyb3VwQnkgPSBhR3JvdXBCeS5zbGljZSgwLCAxKTtcblx0XHR9XG5cdFx0Y29uc3QgYUdyb3VwTGV2ZWxzID0gY29udmVydFByb3BlcnR5UGF0aHNUb0luZm9OYW1lcyhhR3JvdXBCeSwgY29sdW1ucykubWFwKChpbmZvTmFtZSkgPT4ge1xuXHRcdFx0cmV0dXJuIHsgbmFtZTogaW5mb05hbWUgfTtcblx0XHR9KTtcblxuXHRcdGdyb3VwQ29uZGl0aW9ucyA9IGFHcm91cExldmVscy5sZW5ndGggPyBKU09OLnN0cmluZ2lmeSh7IGdyb3VwTGV2ZWxzOiBhR3JvdXBMZXZlbHMgfSkgOiB1bmRlZmluZWQ7XG5cdH1cblx0cmV0dXJuIGdyb3VwQ29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBQcmVzZW50YXRpb24gVmFyaWFudCBhZ2dyZWdhdGUgY29uZGl0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge1ByZXNlbnRhdGlvblZhcmlhbnRUeXBlVHlwZXMgfCB1bmRlZmluZWR9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIFByZXNlbnRhdGlvbiB2YXJpYW50IGFubm90YXRpb25cbiAqIEBwYXJhbSBjb2x1bW5zIENvbnZlcnRlciBwcm9jZXNzZWQgdGFibGUgY29sdW1uc1xuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gR3JvdXAgY29uZGl0aW9ucyBmb3IgYSBQcmVzZW50YXRpb24gdmFyaWFudC5cbiAqL1xuZnVuY3Rpb24gZ2V0QWdncmVnYXRlQ29uZGl0aW9ucyhcblx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb246IFByZXNlbnRhdGlvblZhcmlhbnRUeXBlVHlwZXMgfCB1bmRlZmluZWQsXG5cdGNvbHVtbnM6IFRhYmxlQ29sdW1uW11cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGxldCBhZ2dyZWdhdGVDb25kaXRpb25zOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGlmIChwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj8uVG90YWwpIHtcblx0XHRjb25zdCBhVG90YWxzID0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24uVG90YWwgYXMgUHJvcGVydHlQYXRoW107XG5cdFx0Y29uc3QgYWdncmVnYXRlczogUmVjb3JkPHN0cmluZywgb2JqZWN0PiA9IHt9O1xuXHRcdGNvbnZlcnRQcm9wZXJ0eVBhdGhzVG9JbmZvTmFtZXMoYVRvdGFscywgY29sdW1ucykuZm9yRWFjaCgoaW5mb05hbWUpID0+IHtcblx0XHRcdGFnZ3JlZ2F0ZXNbaW5mb05hbWVdID0ge307XG5cdFx0fSk7XG5cblx0XHRhZ2dyZWdhdGVDb25kaXRpb25zID0gSlNPTi5zdHJpbmdpZnkoYWdncmVnYXRlcyk7XG5cdH1cblxuXHRyZXR1cm4gYWdncmVnYXRlQ29uZGl0aW9ucztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24oXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0gfCB1bmRlZmluZWQsXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uLFxuXHRjb2x1bW5zOiBUYWJsZUNvbHVtbltdLFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj86IFByZXNlbnRhdGlvblZhcmlhbnRUeXBlVHlwZXMsXG5cdHZpZXdDb25maWd1cmF0aW9uPzogVmlld1BhdGhDb25maWd1cmF0aW9uXG4pOiBUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uIHtcblx0Ly8gTmVlZCB0byBnZXQgdGhlIHRhcmdldFxuXHRjb25zdCB7IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggfSA9IHNwbGl0UGF0aCh2aXN1YWxpemF0aW9uUGF0aCk7XG5cdGNvbnN0IHRpdGxlOiBhbnkgPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKS50YXJnZXRFbnRpdHlUeXBlLmFubm90YXRpb25zPy5VST8uSGVhZGVySW5mbz8uVHlwZU5hbWVQbHVyYWw7XG5cdGNvbnN0IGVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldEVudGl0eVNldDtcblx0Y29uc3QgcGFnZU1hbmlmZXN0U2V0dGluZ3M6IE1hbmlmZXN0V3JhcHBlciA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCk7XG5cdGNvbnN0IGhhc0Fic29sdXRlUGF0aCA9IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgubGVuZ3RoID09PSAwLFxuXHRcdHAxM25Nb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBnZXRQMTNuTW9kZSh2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCwgdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24pLFxuXHRcdGlkID0gbmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IFRhYmxlSUQodmlzdWFsaXphdGlvblBhdGgpIDogVGFibGVJRChjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCksIFwiTGluZUl0ZW1cIik7XG5cdGNvbnN0IHRhcmdldENhcGFiaWxpdGllcyA9IGdldENhcGFiaWxpdHlSZXN0cmljdGlvbihjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgbmF2aWdhdGlvblRhcmdldFBhdGggPSBnZXROYXZpZ2F0aW9uVGFyZ2V0UGF0aChjb252ZXJ0ZXJDb250ZXh0LCBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoKTtcblx0Y29uc3QgbmF2aWdhdGlvblNldHRpbmdzID0gcGFnZU1hbmlmZXN0U2V0dGluZ3MuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24obmF2aWdhdGlvblRhcmdldFBhdGgpO1xuXHRjb25zdCBjcmVhdGlvbkJlaGF2aW91ciA9IF9nZXRDcmVhdGlvbkJlaGF2aW91cihcblx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24sXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRuYXZpZ2F0aW9uU2V0dGluZ3MsXG5cdFx0dmlzdWFsaXphdGlvblBhdGhcblx0KTtcblx0Y29uc3Qgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCA9IGdlbmVyYXRlU3RhbmRhcmRBY3Rpb25zQ29udGV4dChcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdGNyZWF0aW9uQmVoYXZpb3VyLm1vZGUgYXMgQ3JlYXRpb25Nb2RlLFxuXHRcdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLFxuXHRcdHZpZXdDb25maWd1cmF0aW9uXG5cdCk7XG5cblx0Y29uc3QgZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24gPSBnZXREZWxldGVWaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpO1xuXHRjb25zdCBjcmVhdGVCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiA9IGdldENyZWF0ZVZpc2liaWxpdHkoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCk7XG5cdGNvbnN0IG1hc3NFZGl0QnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24gPSBnZXRNYXNzRWRpdFZpc2liaWxpdHkoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCk7XG5cdGNvbnN0IGlzSW5zZXJ0VXBkYXRlVGVtcGxhdGVkID0gZ2V0SW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRpbmcoXG5cdFx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0XHRpc0RyYWZ0T3JTdGlja3lTdXBwb3J0ZWQoY29udmVydGVyQ29udGV4dCksXG5cdFx0Y29tcGlsZUJpbmRpbmcoY3JlYXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24pID09PSBcImZhbHNlXCJcblx0KTtcblxuXHRjb25zdCBzZWxlY3Rpb25Nb2RlID0gZ2V0U2VsZWN0aW9uTW9kZShcblx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0dmlzdWFsaXphdGlvblBhdGgsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRoYXNBYnNvbHV0ZVBhdGgsXG5cdFx0dGFyZ2V0Q2FwYWJpbGl0aWVzLFxuXHRcdGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uLFxuXHRcdG1hc3NFZGl0QnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb25cblx0KTtcblx0bGV0IHRocmVzaG9sZCA9IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPyAxMCA6IDMwO1xuXHRpZiAocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/Lk1heEl0ZW1zKSB7XG5cdFx0dGhyZXNob2xkID0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24uTWF4SXRlbXMudmFsdWVPZigpIGFzIG51bWJlcjtcblx0fVxuXG5cdGNvbnN0IHZhcmlhbnRNYW5hZ2VtZW50OiBWYXJpYW50TWFuYWdlbWVudFR5cGUgPSBwYWdlTWFuaWZlc3RTZXR0aW5ncy5nZXRWYXJpYW50TWFuYWdlbWVudCgpO1xuXHRjb25zdCBpc1NlYXJjaGFibGUgPSBpc1BhdGhTZWFyY2hhYmxlKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKTtcblx0Y29uc3Qgc3RhbmRhcmRBY3Rpb25zID0ge1xuXHRcdGNyZWF0ZTogZ2V0U3RhbmRhcmRBY3Rpb25DcmVhdGUoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCksXG5cdFx0XCJkZWxldGVcIjogZ2V0U3RhbmRhcmRBY3Rpb25EZWxldGUoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCksXG5cdFx0cGFzdGU6IGdldFN0YW5kYXJkQWN0aW9uUGFzdGUoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgaXNJbnNlcnRVcGRhdGVUZW1wbGF0ZWQpLFxuXHRcdG1hc3NFZGl0OiBnZXRTdGFuZGFyZEFjdGlvbk1hc3NFZGl0KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpLFxuXHRcdGNyZWF0aW9uUm93OiBnZXRDcmVhdGlvblJvdyhjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KVxuXHR9O1xuXG5cdHJldHVybiB7XG5cdFx0aWQ6IGlkLFxuXHRcdGVudGl0eU5hbWU6IGVudGl0eVNldCA/IGVudGl0eVNldC5uYW1lIDogXCJcIixcblx0XHRjb2xsZWN0aW9uOiBnZXRUYXJnZXRPYmplY3RQYXRoKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKSxcblx0XHRuYXZpZ2F0aW9uUGF0aDogbmF2aWdhdGlvblByb3BlcnR5UGF0aCxcblx0XHRyb3c6IF9nZXRSb3dDb25maWd1cmF0aW9uUHJvcGVydHkoXG5cdFx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0XHR2aXN1YWxpemF0aW9uUGF0aCxcblx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRuYXZpZ2F0aW9uU2V0dGluZ3MsXG5cdFx0XHRuYXZpZ2F0aW9uVGFyZ2V0UGF0aFxuXHRcdCksXG5cdFx0cDEzbk1vZGU6IHAxM25Nb2RlLFxuXHRcdHN0YW5kYXJkQWN0aW9uczoge1xuXHRcdFx0YWN0aW9uczogc3RhbmRhcmRBY3Rpb25zLFxuXHRcdFx0aXNJbnNlcnRVcGRhdGVUZW1wbGF0ZWQ6IGlzSW5zZXJ0VXBkYXRlVGVtcGxhdGVkLFxuXHRcdFx0dXBkYXRhYmxlUHJvcGVydHlQYXRoOiBnZXRDdXJyZW50RW50aXR5U2V0VXBkYXRhYmxlUGF0aChjb252ZXJ0ZXJDb250ZXh0KVxuXHRcdH0sXG5cdFx0ZGlzcGxheU1vZGU6IGlzSW5EaXNwbGF5TW9kZShjb252ZXJ0ZXJDb250ZXh0LCB2aWV3Q29uZmlndXJhdGlvbiksXG5cdFx0Y3JlYXRlOiBjcmVhdGlvbkJlaGF2aW91cixcblx0XHRzZWxlY3Rpb25Nb2RlOiBzZWxlY3Rpb25Nb2RlLFxuXHRcdGF1dG9CaW5kT25Jbml0OlxuXHRcdFx0X2lzRmlsdGVyQmFySGlkZGVuKHBhZ2VNYW5pZmVzdFNldHRpbmdzLCBjb252ZXJ0ZXJDb250ZXh0KSB8fFxuXHRcdFx0KGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0ICYmXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5BbmFseXRpY2FsTGlzdFBhZ2UgJiZcblx0XHRcdFx0ISh2aWV3Q29uZmlndXJhdGlvbiAmJiBwYWdlTWFuaWZlc3RTZXR0aW5ncy5oYXNNdWx0aXBsZVZpc3VhbGl6YXRpb25zKHZpZXdDb25maWd1cmF0aW9uKSkpLFxuXHRcdHZhcmlhbnRNYW5hZ2VtZW50OiB2YXJpYW50TWFuYWdlbWVudCA9PT0gXCJDb250cm9sXCIgJiYgIXAxM25Nb2RlID8gVmFyaWFudE1hbmFnZW1lbnRUeXBlLk5vbmUgOiB2YXJpYW50TWFuYWdlbWVudCxcblx0XHR0aHJlc2hvbGQ6IHRocmVzaG9sZCxcblx0XHRzb3J0Q29uZGl0aW9uczogZ2V0U29ydENvbmRpdGlvbnMoY29udmVydGVyQ29udGV4dCwgcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24sIGNvbHVtbnMpLFxuXHRcdHRpdGxlOiB0aXRsZSxcblx0XHRzZWFyY2hhYmxlOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi50eXBlICE9PSBcIkFuYWx5dGljYWxUYWJsZVwiICYmICEoaXNDb25zdGFudChpc1NlYXJjaGFibGUpICYmIGlzU2VhcmNoYWJsZS52YWx1ZSA9PT0gZmFsc2UpXG5cdH07XG59XG5cbmZ1bmN0aW9uIF9nZXRFeHBvcnREYXRhVHlwZShkYXRhVHlwZTogc3RyaW5nLCBpc0NvbXBsZXhQcm9wZXJ0eTogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHtcblx0bGV0IGV4cG9ydERhdGFUeXBlOiBzdHJpbmcgPSBcIlN0cmluZ1wiO1xuXHRpZiAoaXNDb21wbGV4UHJvcGVydHkpIHtcblx0XHRpZiAoZGF0YVR5cGUgPT09IFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCIpIHtcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJEYXRlVGltZVwiO1xuXHRcdH1cblx0XHRyZXR1cm4gZXhwb3J0RGF0YVR5cGU7XG5cdH0gZWxzZSB7XG5cdFx0c3dpdGNoIChkYXRhVHlwZSkge1xuXHRcdFx0Y2FzZSBcIkVkbS5EZWNpbWFsXCI6XG5cdFx0XHRjYXNlIFwiRWRtLkludDMyXCI6XG5cdFx0XHRjYXNlIFwiRWRtLkludDY0XCI6XG5cdFx0XHRjYXNlIFwiRWRtLkRvdWJsZVwiOlxuXHRcdFx0Y2FzZSBcIkVkbS5CeXRlXCI6XG5cdFx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJOdW1iZXJcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiRWRtLkRhdGVPZlRpbWVcIjpcblx0XHRcdGNhc2UgXCJFZG0uRGF0ZVwiOlxuXHRcdFx0XHRleHBvcnREYXRhVHlwZSA9IFwiRGF0ZVwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJFZG0uRGF0ZVRpbWVPZmZzZXRcIjpcblx0XHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIkRhdGVUaW1lXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkVkbS5UaW1lT2ZEYXlcIjpcblx0XHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIlRpbWVcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiRWRtLkJvb2xlYW5cIjpcblx0XHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIkJvb2xlYW5cIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRleHBvcnREYXRhVHlwZSA9IFwiU3RyaW5nXCI7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBleHBvcnREYXRhVHlwZTtcbn1cblxuLyoqXG4gKiBTcGxpdCB0aGUgdmlzdWFsaXphdGlvbiBwYXRoIGludG8gdGhlIG5hdmlnYXRpb24gcHJvcGVydHkgcGF0aCBhbmQgYW5ub3RhdGlvbi5cbiAqXG4gKiBAcGFyYW0gdmlzdWFsaXphdGlvblBhdGhcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFBhdGgodmlzdWFsaXphdGlvblBhdGg6IHN0cmluZykge1xuXHRsZXQgW25hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsIGFubm90YXRpb25QYXRoXSA9IHZpc3VhbGl6YXRpb25QYXRoLnNwbGl0KFwiQFwiKTtcblxuXHRpZiAobmF2aWdhdGlvblByb3BlcnR5UGF0aC5sYXN0SW5kZXhPZihcIi9cIikgPT09IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgubGVuZ3RoIC0gMSkge1xuXHRcdC8vIERyb3AgdHJhaWxpbmcgc2xhc2hcblx0XHRuYXZpZ2F0aW9uUHJvcGVydHlQYXRoID0gbmF2aWdhdGlvblByb3BlcnR5UGF0aC5zdWJzdHIoMCwgbmF2aWdhdGlvblByb3BlcnR5UGF0aC5sZW5ndGggLSAxKTtcblx0fVxuXHRyZXR1cm4geyBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoLCBhbm5vdGF0aW9uUGF0aCB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb24oXG5cdHNlbGVjdGlvblZhcmlhbnRQYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgcmVzb2x2ZWRUYXJnZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGVBbm5vdGF0aW9uKHNlbGVjdGlvblZhcmlhbnRQYXRoKTtcblx0Y29uc3Qgc2VsZWN0aW9uOiBTZWxlY3Rpb25WYXJpYW50VHlwZSA9IHJlc29sdmVkVGFyZ2V0LmFubm90YXRpb24gYXMgU2VsZWN0aW9uVmFyaWFudFR5cGU7XG5cblx0aWYgKHNlbGVjdGlvbikge1xuXHRcdGNvbnN0IHByb3BlcnR5TmFtZXM6IHN0cmluZ1tdID0gW107XG5cdFx0c2VsZWN0aW9uLlNlbGVjdE9wdGlvbnM/LmZvckVhY2goKHNlbGVjdE9wdGlvbjogU2VsZWN0T3B0aW9uVHlwZSkgPT4ge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlOYW1lOiBhbnkgPSBzZWxlY3RPcHRpb24uUHJvcGVydHlOYW1lO1xuXHRcdFx0Y29uc3QgUHJvcGVydHlQYXRoOiBzdHJpbmcgPSBwcm9wZXJ0eU5hbWUudmFsdWU7XG5cdFx0XHRpZiAocHJvcGVydHlOYW1lcy5pbmRleE9mKFByb3BlcnR5UGF0aCkgPT09IC0xKSB7XG5cdFx0XHRcdHByb3BlcnR5TmFtZXMucHVzaChQcm9wZXJ0eVBhdGgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiB7XG5cdFx0XHR0ZXh0OiBzZWxlY3Rpb24/LlRleHQ/LnRvU3RyaW5nKCksXG5cdFx0XHRwcm9wZXJ0eU5hbWVzOiBwcm9wZXJ0eU5hbWVzXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBfZ2V0RnVsbFNjcmVlbkJhc2VkT25EZXZpY2UoXG5cdHRhYmxlU2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RTZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGlzSXBob25lOiBib29sZWFuXG4pOiBib29sZWFuIHtcblx0Ly8gSWYgZW5hYmxlRnVsbFNjcmVlbiBpcyBub3Qgc2V0LCB1c2UgYXMgZGVmYXVsdCB0cnVlIG9uIHBob25lIGFuZCBmYWxzZSBvdGhlcndpc2Vcblx0bGV0IGVuYWJsZUZ1bGxTY3JlZW4gPSB0YWJsZVNldHRpbmdzLmVuYWJsZUZ1bGxTY3JlZW4gPz8gaXNJcGhvbmU7XG5cdC8vIE1ha2Ugc3VyZSB0aGF0IGVuYWJsZUZ1bGxTY3JlZW4gaXMgbm90IHNldCBvbiBMaXN0UmVwb3J0IGZvciBkZXNrdG9wIG9yIHRhYmxldFxuXHRpZiAoIWlzSXBob25lICYmIGVuYWJsZUZ1bGxTY3JlZW4gJiYgY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQpIHtcblx0XHRlbmFibGVGdWxsU2NyZWVuID0gZmFsc2U7XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXREaWFnbm9zdGljcygpLmFkZElzc3VlKElzc3VlQ2F0ZWdvcnkuTWFuaWZlc3QsIElzc3VlU2V2ZXJpdHkuTG93LCBJc3N1ZVR5cGUuRlVMTFNDUkVFTk1PREVfTk9UX09OX0xJU1RSRVBPUlQpO1xuXHR9XG5cdHJldHVybiBlbmFibGVGdWxsU2NyZWVuO1xufVxuXG5mdW5jdGlvbiBfZ2V0TXVsdGlTZWxlY3RNb2RlKFxuXHR0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0bGV0IG11bHRpU2VsZWN0TW9kZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRpZiAodGFibGVUeXBlICE9PSBcIlJlc3BvbnNpdmVUYWJsZVwiKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRzd2l0Y2ggKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkpIHtcblx0XHRjYXNlIFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0OlxuXHRcdGNhc2UgVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZTpcblx0XHRcdG11bHRpU2VsZWN0TW9kZSA9ICF0YWJsZVNldHRpbmdzLnNlbGVjdEFsbCA/IFwiQ2xlYXJBbGxcIiA6IFwiRGVmYXVsdFwiO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBUZW1wbGF0ZVR5cGUuT2JqZWN0UGFnZTpcblx0XHRcdG11bHRpU2VsZWN0TW9kZSA9IHRhYmxlU2V0dGluZ3Muc2VsZWN0QWxsID09PSBmYWxzZSA/IFwiQ2xlYXJBbGxcIiA6IFwiRGVmYXVsdFwiO1xuXHRcdFx0aWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkudXNlSWNvblRhYkJhcigpKSB7XG5cdFx0XHRcdG11bHRpU2VsZWN0TW9kZSA9ICF0YWJsZVNldHRpbmdzLnNlbGVjdEFsbCA/IFwiQ2xlYXJBbGxcIiA6IFwiRGVmYXVsdFwiO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0fVxuXG5cdHJldHVybiBtdWx0aVNlbGVjdE1vZGU7XG59XG5cbmZ1bmN0aW9uIF9nZXRUYWJsZVR5cGUoXG5cdHRhYmxlU2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RTZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdGFnZ3JlZ2F0aW9uSGVscGVyOiBBZ2dyZWdhdGlvbkhlbHBlcixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogVGFibGVUeXBlIHtcblx0bGV0IHRhYmxlVHlwZSA9IHRhYmxlU2V0dGluZ3M/LnR5cGUgfHwgXCJSZXNwb25zaXZlVGFibGVcIjtcblx0aWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFwiT2JqZWN0UGFnZVwiKSB7XG5cdFx0aWYgKHRhYmxlU2V0dGluZ3M/LnR5cGUgPT09IFwiQW5hbHl0aWNhbFRhYmxlXCIgJiYgIWFnZ3JlZ2F0aW9uSGVscGVyLmlzQW5hbHl0aWNzU3VwcG9ydGVkKCkpIHtcblx0XHRcdHRhYmxlVHlwZSA9IFwiR3JpZFRhYmxlXCI7XG5cdFx0fVxuXHRcdGlmICghdGFibGVTZXR0aW5ncz8udHlwZSkge1xuXHRcdFx0aWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuaXNEZXNrdG9wKCkgJiYgYWdncmVnYXRpb25IZWxwZXIuaXNBbmFseXRpY3NTdXBwb3J0ZWQoKSkge1xuXHRcdFx0XHR0YWJsZVR5cGUgPSBcIkFuYWx5dGljYWxUYWJsZVwiO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGFibGVUeXBlID0gXCJSZXNwb25zaXZlVGFibGVcIjtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHRhYmxlVHlwZTtcbn1cblxuZnVuY3Rpb24gX2dldEZpbHRlcnMoXG5cdHRhYmxlU2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RTZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdHF1aWNrRmlsdGVyUGF0aHM6IHsgYW5ub3RhdGlvblBhdGg6IHN0cmluZyB9W10sXG5cdHF1aWNrU2VsZWN0aW9uVmFyaWFudDogYW55LFxuXHRwYXRoOiB7IGFubm90YXRpb25QYXRoOiBzdHJpbmcgfSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogYW55IHtcblx0aWYgKHF1aWNrU2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdHF1aWNrRmlsdGVyUGF0aHMucHVzaCh7IGFubm90YXRpb25QYXRoOiBwYXRoLmFubm90YXRpb25QYXRoIH0pO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0cXVpY2tGaWx0ZXJzOiB7XG5cdFx0XHRlbmFibGVkOlxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCA/IFwiez0gJHtwYWdlSW50ZXJuYWw+aGFzUGVuZGluZ0ZpbHRlcnN9ICE9PSB0cnVlfVwiIDogdHJ1ZSxcblx0XHRcdHNob3dDb3VudHM6IHRhYmxlU2V0dGluZ3M/LnF1aWNrVmFyaWFudFNlbGVjdGlvbj8uc2hvd0NvdW50cyxcblx0XHRcdHBhdGhzOiBxdWlja0ZpbHRlclBhdGhzXG5cdFx0fVxuXHR9O1xufVxuXG5mdW5jdGlvbiBfZ2V0RW5hYmxlRXhwb3J0KFxuXHR0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRlbmFibGVQYXN0ZTogYm9vbGVhblxuKTogYm9vbGVhbiB7XG5cdHJldHVybiB0YWJsZVNldHRpbmdzLmVuYWJsZUV4cG9ydCAhPT0gdW5kZWZpbmVkXG5cdFx0PyB0YWJsZVNldHRpbmdzLmVuYWJsZUV4cG9ydFxuXHRcdDogY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSAhPT0gXCJPYmplY3RQYWdlXCIgfHwgZW5hYmxlUGFzdGU7XG59XG5cbmZ1bmN0aW9uIF9nZXRGaWx0ZXJDb25maWd1cmF0aW9uKFxuXHR0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBhbnkge1xuXHRpZiAoIWxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdHJldHVybiB7fTtcblx0fVxuXHRjb25zdCBxdWlja0ZpbHRlclBhdGhzOiB7IGFubm90YXRpb25QYXRoOiBzdHJpbmcgfVtdID0gW107XG5cdGNvbnN0IHRhcmdldEVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKGxpbmVJdGVtQW5ub3RhdGlvbik7XG5cdGxldCBxdWlja1NlbGVjdGlvblZhcmlhbnQ6IGFueTtcblx0bGV0IGZpbHRlcnM7XG5cdHRhYmxlU2V0dGluZ3M/LnF1aWNrVmFyaWFudFNlbGVjdGlvbj8ucGF0aHM/LmZvckVhY2goKHBhdGg6IHsgYW5ub3RhdGlvblBhdGg6IHN0cmluZyB9KSA9PiB7XG5cdFx0cXVpY2tTZWxlY3Rpb25WYXJpYW50ID0gdGFyZ2V0RW50aXR5VHlwZS5yZXNvbHZlUGF0aChcIkBcIiArIHBhdGguYW5ub3RhdGlvblBhdGgpO1xuXHRcdGZpbHRlcnMgPSBfZ2V0RmlsdGVycyh0YWJsZVNldHRpbmdzLCBxdWlja0ZpbHRlclBhdGhzLCBxdWlja1NlbGVjdGlvblZhcmlhbnQsIHBhdGgsIGNvbnZlcnRlckNvbnRleHQpO1xuXHR9KTtcblxuXHRsZXQgaGlkZVRhYmxlVGl0bGUgPSBmYWxzZTtcblx0aGlkZVRhYmxlVGl0bGUgPSAhIXRhYmxlU2V0dGluZ3MucXVpY2tWYXJpYW50U2VsZWN0aW9uPy5oaWRlVGFibGVUaXRsZTtcblx0cmV0dXJuIHtcblx0XHRmaWx0ZXJzOiBmaWx0ZXJzLFxuXHRcdGhlYWRlclZpc2libGU6ICEocXVpY2tTZWxlY3Rpb25WYXJpYW50ICYmIGhpZGVUYWJsZVRpdGxlKVxuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24oXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0gfCB1bmRlZmluZWQsXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGNoZWNrQ29uZGVuc2VkTGF5b3V0ID0gZmFsc2Vcbik6IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24ge1xuXHRjb25zdCB0YWJsZU1hbmlmZXN0U2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKTtcblx0Y29uc3QgdGFibGVTZXR0aW5ncyA9ICh0YWJsZU1hbmlmZXN0U2V0dGluZ3MgJiYgdGFibGVNYW5pZmVzdFNldHRpbmdzLnRhYmxlU2V0dGluZ3MpIHx8IHt9O1xuXHRjb25zdCBjcmVhdGlvbk1vZGUgPSB0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8ubmFtZSB8fCBDcmVhdGlvbk1vZGUuTmV3UGFnZTtcblx0Y29uc3QgZW5hYmxlQXV0b0NvbHVtbldpZHRoID0gIWNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuaXNQaG9uZSgpO1xuXHRjb25zdCBlbmFibGVQYXN0ZSA9XG5cdFx0dGFibGVTZXR0aW5ncy5lbmFibGVQYXN0ZSAhPT0gdW5kZWZpbmVkID8gdGFibGVTZXR0aW5ncy5lbmFibGVQYXN0ZSA6IGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFwiT2JqZWN0UGFnZVwiOyAvLyBQYXN0ZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGV4Y2VwdGVkIGZvciBPUFxuXHRjb25zdCBkYXRhU3RhdGVJbmRpY2F0b3JGaWx0ZXIgPVxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0ID8gXCJBUEkuZGF0YVN0YXRlSW5kaWNhdG9yRmlsdGVyXCIgOiB1bmRlZmluZWQ7XG5cdGNvbnN0IGlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnQgPSBjaGVja0NvbmRlbnNlZExheW91dCAmJiBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmlzQ29uZGVuc2VkTGF5b3V0Q29tcGxpYW50KCk7XG5cdGNvbnN0IG9GaWx0ZXJDb25maWd1cmF0aW9uID0gX2dldEZpbHRlckNvbmZpZ3VyYXRpb24odGFibGVTZXR0aW5ncywgbGluZUl0ZW1Bbm5vdGF0aW9uLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uID0gdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjtcblx0Y29uc3QgZW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpO1xuXHRjb25zdCBhZ2dyZWdhdGlvbkhlbHBlciA9IG5ldyBBZ2dyZWdhdGlvbkhlbHBlcihlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgdGFibGVUeXBlOiBUYWJsZVR5cGUgPSBfZ2V0VGFibGVUeXBlKHRhYmxlU2V0dGluZ3MsIGFnZ3JlZ2F0aW9uSGVscGVyLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgY29uZGVuc2VkVGFibGVMYXlvdXQgPVxuXHRcdHRhYmxlU2V0dGluZ3MuY29uZGVuc2VkVGFibGVMYXlvdXQgIT09IHVuZGVmaW5lZCAmJiB0YWJsZVR5cGUgIT09IFwiUmVzcG9uc2l2ZVRhYmxlXCIgPyB0YWJsZVNldHRpbmdzLmNvbmRlbnNlZFRhYmxlTGF5b3V0IDogZmFsc2U7XG5cdGNvbnN0IG9Db25maWd1cmF0aW9uID0ge1xuXHRcdC8vIElmIG5vIGNyZWF0ZUF0RW5kIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIGZhbHNlIGZvciBJbmxpbmUgY3JlYXRlIGFuZCB0cnVlIG90aGVyd2lzZVxuXHRcdGNyZWF0ZUF0RW5kOlxuXHRcdFx0dGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmNyZWF0ZUF0RW5kICE9PSB1bmRlZmluZWRcblx0XHRcdFx0PyB0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uY3JlYXRlQXRFbmRcblx0XHRcdFx0OiBjcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5JbmxpbmUsXG5cdFx0Y3JlYXRpb25Nb2RlOiBjcmVhdGlvbk1vZGUsXG5cdFx0Y3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uOiBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24sXG5cdFx0ZGF0YVN0YXRlSW5kaWNhdG9yRmlsdGVyOiBkYXRhU3RhdGVJbmRpY2F0b3JGaWx0ZXIsXG5cdFx0Ly8gaWYgYSBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvbiBpcyBwcm92aWRlZCwgZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQsIGkuZS4gc2V0IHRvIGZhbHNlXG5cdFx0ZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YTogIWN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA/ICEhdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGEgOiBmYWxzZSxcblx0XHRlbmFibGVBdXRvQ29sdW1uV2lkdGg6IGVuYWJsZUF1dG9Db2x1bW5XaWR0aCxcblx0XHRlbmFibGVFeHBvcnQ6IF9nZXRFbmFibGVFeHBvcnQodGFibGVTZXR0aW5ncywgY29udmVydGVyQ29udGV4dCwgZW5hYmxlUGFzdGUpLFxuXHRcdGVuYWJsZUZ1bGxTY3JlZW46IF9nZXRGdWxsU2NyZWVuQmFzZWRPbkRldmljZSh0YWJsZVNldHRpbmdzLCBjb252ZXJ0ZXJDb250ZXh0LCBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmlzUGhvbmUoKSksXG5cdFx0ZW5hYmxlTWFzc0VkaXQ6IHRhYmxlU2V0dGluZ3M/LmVuYWJsZU1hc3NFZGl0LFxuXHRcdGVuYWJsZVBhc3RlOiBlbmFibGVQYXN0ZSxcblx0XHRoZWFkZXJWaXNpYmxlOiB0cnVlLFxuXHRcdG11bHRpU2VsZWN0TW9kZTogX2dldE11bHRpU2VsZWN0TW9kZSh0YWJsZVNldHRpbmdzLCB0YWJsZVR5cGUsIGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdHNlbGVjdGlvbkxpbWl0OiB0YWJsZVNldHRpbmdzLnNlbGVjdEFsbCA9PT0gdHJ1ZSB8fCB0YWJsZVNldHRpbmdzLnNlbGVjdGlvbkxpbWl0ID09PSAwID8gMCA6IHRhYmxlU2V0dGluZ3Muc2VsZWN0aW9uTGltaXQgfHwgMjAwLFxuXHRcdGlubGluZUNyZWF0aW9uUm93Q291bnQ6IHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5pbmxpbmVDcmVhdGlvblJvd0NvdW50ID8gdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmlubGluZUNyZWF0aW9uUm93Q291bnQgOiAyLFxuXHRcdHNob3dSb3dDb3VudDpcblx0XHRcdCF0YWJsZVNldHRpbmdzPy5xdWlja1ZhcmlhbnRTZWxlY3Rpb24/LnNob3dDb3VudHMgJiYgIWNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuZ2V0Vmlld0NvbmZpZ3VyYXRpb24oKT8uc2hvd0NvdW50cyxcblx0XHR0eXBlOiB0YWJsZVR5cGUsXG5cdFx0dXNlQ29uZGVuc2VkVGFibGVMYXlvdXQ6IGNvbmRlbnNlZFRhYmxlTGF5b3V0ICYmIGlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnRcblx0fTtcblxuXHRyZXR1cm4geyAuLi5vQ29uZmlndXJhdGlvbiwgLi4ub0ZpbHRlckNvbmZpZ3VyYXRpb24gfTtcbn1cblxuZXhwb3J0IHR5cGUgY29uZmlnVHlwZUNvbnN0cmFpbnRzID0ge1xuXHRzY2FsZT86IG51bWJlcjtcblx0cHJlY2lzaW9uPzogbnVtYmVyO1xuXHRtYXhMZW5ndGg/OiBudW1iZXI7XG5cdG51bGxhYmxlPzogYm9vbGVhbjtcblx0bWluaW11bT86IHN0cmluZztcblx0bWF4aW11bT86IHN0cmluZztcblx0aXNEaWdpdFNlcXVlbmNlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIGNvbmZpZ1R5cGVmb3JtYXRPcHRpb25zID0ge1xuXHRwYXJzZUFzU3RyaW5nPzogYm9vbGVhbjtcblx0ZW1wdHlTdHJpbmc/OiBzdHJpbmc7XG5cdHBhcnNlS2VlcHNFbXB0eVN0cmluZz86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBjb25maWdUeXBlID0ge1xuXHR0eXBlOiBzdHJpbmc7XG5cdGNvbnN0cmFpbnRzOiBjb25maWdUeXBlQ29uc3RyYWludHM7XG5cdGZvcm1hdE9wdGlvbnM6IGNvbmZpZ1R5cGVmb3JtYXRPcHRpb25zO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVDb25maWcob1Byb3BlcnR5OiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsIGRhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBhbnkge1xuXHRsZXQgb1RhcmdldE1hcHBpbmcgPSBFRE1fVFlQRV9NQVBQSU5HWyhvUHJvcGVydHkgYXMgUHJvcGVydHkpPy50eXBlXSB8fCAoZGF0YVR5cGUgPyBFRE1fVFlQRV9NQVBQSU5HW2RhdGFUeXBlXSA6IHVuZGVmaW5lZCk7XG5cdGlmICghb1RhcmdldE1hcHBpbmcgJiYgKG9Qcm9wZXJ0eSBhcyBQcm9wZXJ0eSk/LnRhcmdldFR5cGUgJiYgKG9Qcm9wZXJ0eSBhcyBQcm9wZXJ0eSkudGFyZ2V0VHlwZT8uX3R5cGUgPT09IFwiVHlwZURlZmluaXRpb25cIikge1xuXHRcdG9UYXJnZXRNYXBwaW5nID0gRURNX1RZUEVfTUFQUElOR1soKG9Qcm9wZXJ0eSBhcyBQcm9wZXJ0eSkudGFyZ2V0VHlwZSBhcyBUeXBlRGVmaW5pdGlvbikudW5kZXJseWluZ1R5cGVdO1xuXHR9XG5cdGNvbnN0IHByb3BlcnR5VHlwZUNvbmZpZzogY29uZmlnVHlwZSA9IHtcblx0XHR0eXBlOiBvVGFyZ2V0TWFwcGluZz8udHlwZSxcblx0XHRjb25zdHJhaW50czoge30sXG5cdFx0Zm9ybWF0T3B0aW9uczoge31cblx0fTtcblx0aWYgKGlzUHJvcGVydHkob1Byb3BlcnR5KSkge1xuXHRcdHByb3BlcnR5VHlwZUNvbmZpZy5jb25zdHJhaW50cyA9IHtcblx0XHRcdHNjYWxlOiBvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uJFNjYWxlID8gb1Byb3BlcnR5LnNjYWxlIDogdW5kZWZpbmVkLFxuXHRcdFx0cHJlY2lzaW9uOiBvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uJFByZWNpc2lvbiA/IG9Qcm9wZXJ0eS5wcmVjaXNpb24gOiB1bmRlZmluZWQsXG5cdFx0XHRtYXhMZW5ndGg6IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kTWF4TGVuZ3RoID8gb1Byb3BlcnR5Lm1heExlbmd0aCA6IHVuZGVmaW5lZCxcblx0XHRcdG51bGxhYmxlOiBvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uJE51bGxhYmxlID8gb1Byb3BlcnR5Lm51bGxhYmxlIDogdW5kZWZpbmVkLFxuXHRcdFx0bWluaW11bTpcblx0XHRcdFx0b1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LltcIkBPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5NaW5pbXVtLyREZWNpbWFsXCJdICYmXG5cdFx0XHRcdCFpc05hTihvUHJvcGVydHkuYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1pbmltdW0pXG5cdFx0XHRcdFx0PyBgJHtvUHJvcGVydHkuYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1pbmltdW19YFxuXHRcdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdFx0bWF4aW11bTpcblx0XHRcdFx0b1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LltcIkBPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5NYXhpbXVtLyREZWNpbWFsXCJdICYmXG5cdFx0XHRcdCFpc05hTihvUHJvcGVydHkuYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1heGltdW0pXG5cdFx0XHRcdFx0PyBgJHtvUHJvcGVydHkuYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1heGltdW19YFxuXHRcdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdFx0aXNEaWdpdFNlcXVlbmNlOlxuXHRcdFx0XHRwcm9wZXJ0eVR5cGVDb25maWcudHlwZSA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5TdHJpbmdcIiAmJlxuXHRcdFx0XHRvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0RpZ2l0U2VxdWVuY2VcIl0gJiZcblx0XHRcdFx0KG9Qcm9wZXJ0eSBhcyBQcm9wZXJ0eSkuYW5ub3RhdGlvbnM/LkNvbW1vbj8uSXNEaWdpdFNlcXVlbmNlXG5cdFx0XHRcdFx0PyB0cnVlXG5cdFx0XHRcdFx0OiB1bmRlZmluZWRcblx0XHR9O1xuXHR9XG5cdHByb3BlcnR5VHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zID0ge1xuXHRcdHBhcnNlQXNTdHJpbmc6XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5JbnRcIikgPT09IDAgfHxcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRvdWJsZVwiKSA9PT0gMFxuXHRcdFx0XHQ/IGZhbHNlXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdGVtcHR5U3RyaW5nOlxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuSW50XCIpID09PSAwIHx8XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Eb3VibGVcIikgPT09IDBcblx0XHRcdFx0PyBcIlwiXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdHBhcnNlS2VlcHNFbXB0eVN0cmluZzogcHJvcGVydHlUeXBlQ29uZmlnLnR5cGUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyaW5nXCIgPyB0cnVlIDogdW5kZWZpbmVkXG5cdH07XG5cdHJldHVybiBwcm9wZXJ0eVR5cGVDb25maWc7XG59XG4iXX0=
|
|
2682
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb2x1bW5UeXBlIiwiZ2V0VGFibGVBY3Rpb25zIiwibGluZUl0ZW1Bbm5vdGF0aW9uIiwidmlzdWFsaXphdGlvblBhdGgiLCJjb252ZXJ0ZXJDb250ZXh0IiwibmF2aWdhdGlvblNldHRpbmdzIiwiYVRhYmxlQWN0aW9ucyIsImdldFRhYmxlQW5ub3RhdGlvbkFjdGlvbnMiLCJhQW5ub3RhdGlvbkFjdGlvbnMiLCJ0YWJsZUFjdGlvbnMiLCJhSGlkZGVuQWN0aW9ucyIsImhpZGRlblRhYmxlQWN0aW9ucyIsIm1hbmlmZXN0QWN0aW9ucyIsImdldEFjdGlvbnNGcm9tTWFuaWZlc3QiLCJnZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uIiwiYWN0aW9ucyIsImluc2VydEN1c3RvbUVsZW1lbnRzIiwiaXNOYXZpZ2FibGUiLCJlbmFibGVPblNlbGVjdCIsImVuYWJsZUF1dG9TY3JvbGwiLCJlbmFibGVkIiwiZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uIiwiY29tbWFuZCIsImNvbW1hbmRBY3Rpb25zIiwiZ2V0VGFibGVDb2x1bW5zIiwiYW5ub3RhdGlvbkNvbHVtbnMiLCJnZXRDb2x1bW5zRnJvbUFubm90YXRpb25zIiwibWFuaWZlc3RDb2x1bW5zIiwiZ2V0Q29sdW1uc0Zyb21NYW5pZmVzdCIsImNvbHVtbnMiLCJnZXRBbm5vdGF0aW9uRW50aXR5VHlwZSIsIndpZHRoIiwiaW1wb3J0YW5jZSIsImF2YWlsYWJpbGl0eSIsInNldHRpbmdzIiwiaG9yaXpvbnRhbEFsaWduIiwiZm9ybWF0T3B0aW9ucyIsImdldEFnZ3JlZ2F0ZURlZmluaXRpb25zRnJvbUVudGl0eVR5cGUiLCJlbnRpdHlUeXBlIiwidGFibGVDb2x1bW5zIiwiYWdncmVnYXRpb25IZWxwZXIiLCJBZ2dyZWdhdGlvbkhlbHBlciIsImZpbmRDb2x1bW5Gcm9tUGF0aCIsInBhdGgiLCJmaW5kIiwiY29sdW1uIiwiYW5ub3RhdGlvbkNvbHVtbiIsInByb3BlcnR5SW5mb3MiLCJ1bmRlZmluZWQiLCJyZWxhdGl2ZVBhdGgiLCJpc0FuYWx5dGljc1N1cHBvcnRlZCIsIm1DdXJyZW5jeU9yVW5pdFByb3BlcnRpZXMiLCJTZXQiLCJmb3JFYWNoIiwib0NvbHVtbiIsIm9UYWJsZUNvbHVtbiIsInVuaXQiLCJhZGQiLCJhQ3VzdG9tQWdncmVnYXRlQW5ub3RhdGlvbnMiLCJnZXRDdXN0b21BZ2dyZWdhdGVEZWZpbml0aW9ucyIsIm1SYXdEZWZpbml0aW9ucyIsImFubm90YXRpb24iLCJvQWdncmVnYXRlZFByb3BlcnR5IiwiX2VudGl0eVR5cGUiLCJlbnRpdHlQcm9wZXJ0aWVzIiwib1Byb3BlcnR5IiwibmFtZSIsInF1YWxpZmllciIsImFDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzIiwiYW5ub3RhdGlvbnMiLCJBZ2dyZWdhdGlvbiIsIkNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMiLCJtYXAiLCJvQ3R4RGVmUHJvcGVydHkiLCJ2YWx1ZSIsIm1SZXN1bHQiLCJhUmF3Q29udGV4dERlZmluaW5nUHJvcGVydGllcyIsImhhcyIsImlzRGF0YVBvaW50RmFrZVRhcmdldFByb3BlcnR5IiwiZGVmYXVsdEFnZ3JlZ2F0ZSIsImNvbnRleHREZWZpbmluZ1Byb3BlcnR5TmFtZSIsImZvdW5kQ29sdW1uIiwicHVzaCIsImxlbmd0aCIsImNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMiLCJ1cGRhdGVUYWJsZVZpc3VhbGl6YXRpb25Gb3JBbmFseXRpY3MiLCJ0YWJsZVZpc3VhbGl6YXRpb24iLCJwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiIsImNvbnRyb2wiLCJ0eXBlIiwiYWdncmVnYXRlc0RlZmluaXRpb25zIiwiZW5hYmxlQW5hbHl0aWNzIiwiYWdncmVnYXRlcyIsImFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMiLCJnZXRBbGxvd2VkVHJhbnNmb3JtYXRpb25zIiwiZW5hYmxlQW5hbHl0aWNzU2VhcmNoIiwiaW5kZXhPZiIsImdyb3VwQ29uZGl0aW9ucyIsImdldEdyb3VwQ29uZGl0aW9ucyIsImFnZ3JlZ2F0ZUNvbmRpdGlvbnMiLCJnZXRBZ2dyZWdhdGVDb25kaXRpb25zIiwiZ2V0TmF2aWdhdGlvblRhcmdldFBhdGgiLCJuYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwibWFuaWZlc3RXcmFwcGVyIiwiZ2V0TWFuaWZlc3RXcmFwcGVyIiwiZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJuYXZDb25maWciLCJPYmplY3QiLCJrZXlzIiwiZGF0YU1vZGVsUGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJjb250ZXh0UGF0aCIsImdldENvbnRleHRQYXRoIiwibmF2Q29uZmlnRm9yQ29udGV4dFBhdGgiLCJ0YXJnZXRFbnRpdHlTZXQiLCJzdGFydGluZ0VudGl0eVNldCIsInVwZGF0ZUxpbmtlZFByb3BlcnRpZXMiLCJmaW5kQ29sdW1uQnlQYXRoIiwib1Byb3AiLCJvVW5pdCIsImdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSIsIm9UaW1lem9uZSIsImdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5Iiwic1RpbWV6b25lIiwiQ29tbW9uIiwiVGltZXpvbmUiLCJvVW5pdENvbHVtbiIsInNVbml0IiwiTWVhc3VyZXMiLCJJU09DdXJyZW5jeSIsIlVuaXQiLCJ1bml0VGV4dCIsIm9UaW1lem9uZUNvbHVtbiIsInRpbWV6b25lIiwidGltZXpvbmVUZXh0IiwidG9TdHJpbmciLCJkaXNwbGF5TW9kZSIsImdldERpc3BsYXlNb2RlIiwidGV4dEFubm90YXRpb24iLCJUZXh0IiwiaXNQYXRoRXhwcmVzc2lvbiIsIm9UZXh0Q29sdW1uIiwidGV4dEFycmFuZ2VtZW50IiwidGV4dFByb3BlcnR5IiwibW9kZSIsImdldFNlbWFudGljS2V5c0FuZFRpdGxlSW5mbyIsImhlYWRlckluZm9UaXRsZVBhdGgiLCJVSSIsIkhlYWRlckluZm8iLCJUaXRsZSIsIlZhbHVlIiwic2VtYW50aWNLZXlBbm5vdGF0aW9ucyIsIlNlbWFudGljS2V5Iiwic2VtYW50aWNLZXlDb2x1bW5zIiwiY3JlYXRlVGFibGVWaXN1YWxpemF0aW9uIiwiaXNDb25kZW5zZWRUYWJsZUxheW91dENvbXBsaWFudCIsInZpZXdDb25maWd1cmF0aW9uIiwidGFibGVNYW5pZmVzdENvbmZpZyIsImdldFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uIiwic3BsaXRQYXRoIiwibmF2aWdhdGlvblRhcmdldFBhdGgiLCJvcGVyYXRpb25BdmFpbGFibGVNYXAiLCJnZXRPcGVyYXRpb25BdmFpbGFibGVNYXAiLCJzZW1hbnRpY0tleXNBbmRIZWFkZXJJbmZvVGl0bGUiLCJvVmlzdWFsaXphdGlvbiIsIlZpc3VhbGl6YXRpb25UeXBlIiwiVGFibGUiLCJnZXRUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uIiwicmVtb3ZlRHVwbGljYXRlQWN0aW9ucyIsIkpTT04iLCJzdHJpbmdpZnkiLCJvcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzIiwiZ2V0T3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllcyIsImhlYWRlckluZm9UaXRsZSIsInNlbWFudGljS2V5cyIsImNyZWF0ZURlZmF1bHRUYWJsZVZpc3VhbGl6YXRpb24iLCJnZXRDb2x1bW5zRnJvbUVudGl0eVR5cGUiLCJnZXRFbnRpdHlUeXBlIiwiQWN0aW9uSGVscGVyIiwiZ2V0Q3VycmVudEVudGl0eVNldFVwZGF0YWJsZVBhdGgiLCJyZXN0cmljdGlvbnMiLCJnZXRSZXN0cmljdGlvbnMiLCJlbnRpdHlTZXQiLCJnZXRFbnRpdHlTZXQiLCJ1cGRhdGFibGUiLCJpc1VwZGF0YWJsZSIsImlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkiLCJpc0NvbnN0YW50IiwiZXhwcmVzc2lvbiIsIm5hdmlnYXRpb25FeHByZXNzaW9uIiwiX3R5cGUiLCJ1cGRhdGFibGVQcm9wZXJ0eVBhdGgiLCJDYXBhYmlsaXRpZXMiLCJVcGRhdGVSZXN0cmljdGlvbnMiLCJVcGRhdGFibGUiLCJwcm9wZXJ0aWVzIiwiYWN0aW9uTmFtZSIsInByb3BlcnR5TmFtZSIsInNpemUiLCJ0aXRsZVByb3BlcnR5IiwiQXJyYXkiLCJmcm9tIiwiam9pbiIsImdldFVJSGlkZGVuRXhwRm9yQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQiLCJjdXJyZW50RW50aXR5VHlwZSIsImNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoIiwiaXNFbnRpdHlTZXQiLCJhVWlIaWRkZW5QYXRoRXhwcmVzc2lvbnMiLCJkYXRhRmllbGQiLCIkVHlwZSIsIkFjdGlvblRhcmdldCIsImlzQm91bmQiLCJzb3VyY2VFbnRpdHlUeXBlIiwiUmVxdWlyZXNDb250ZXh0IiwiSW5saW5lIiwidmFsdWVPZiIsIkhpZGRlbiIsImVxdWFsIiwiZ2V0QmluZGluZ0V4cEZyb21Db250ZXh0Iiwic291cmNlIiwic0V4cHJlc3Npb24iLCJ2aXNpYmxlIiwic1BhdGgiLCJzdWJzdHJpbmciLCJhU3BsaXRQYXRoIiwic3BsaXQiLCJzTmF2aWdhdGlvblBhdGgiLCJ0YXJnZXRPYmplY3QiLCJwYXJ0bmVyIiwicGF0aEluTW9kZWwiLCJzbGljZSIsImNvbnN0YW50IiwiaGFzQm91bmRBY3Rpb25zQWx3YXlzVmlzaWJsZUluVG9vbEJhciIsInNvbWUiLCJoYXNDdXN0b21BY3Rpb25zQWx3YXlzVmlzaWJsZUluVG9vbEJhciIsImFjdGlvbktleSIsImFjdGlvbiIsInJlcXVpcmVzU2VsZWN0aW9uIiwiZ2V0VmlzaWJsZUV4cEZvckN1c3RvbUFjdGlvbnNSZXF1aXJpbmdDb250ZXh0IiwiYVZpc2libGVQYXRoRXhwcmVzc2lvbnMiLCJyZXNvbHZlQmluZGluZ1N0cmluZyIsImdldENhcGFiaWxpdHlSZXN0cmljdGlvbiIsImlzRGVsZXRhYmxlIiwiaXNQYXRoRGVsZXRhYmxlIiwiaXNQYXRoVXBkYXRhYmxlIiwiZ2V0U2VsZWN0aW9uTW9kZSIsInRhcmdldENhcGFiaWxpdGllcyIsImRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uIiwibWFzc0VkaXRWaXNpYmlsaXR5RXhwcmVzc2lvbiIsIlNlbGVjdGlvbk1vZGUiLCJOb25lIiwidGFibGVNYW5pZmVzdFNldHRpbmdzIiwic2VsZWN0aW9uTW9kZSIsInRhYmxlU2V0dGluZ3MiLCJhSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zIiwiYVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMiLCJpc1BhcmVudERlbGV0YWJsZSIsInBhcmVudEVudGl0eVNldERlbGV0YWJsZSIsImdldFRlbXBsYXRlVHlwZSIsIlRlbXBsYXRlVHlwZSIsIk9iamVjdFBhZ2UiLCJjb21waWxlRXhwcmVzc2lvbiIsImJNYXNzRWRpdEVuYWJsZWQiLCJpZkVsc2UiLCJhbmQiLCJJc0VkaXRhYmxlIiwiTXVsdGkiLCJBdXRvIiwiU2luZ2xlIiwiYnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24iLCJvciIsImVkaXRNb2RlYnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24iLCJjb25jYXQiLCJ0YWJsZUFjdGlvbiIsImlzRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3QiLCJEZXRlcm1pbmluZyIsImtleSIsIktleUhlbHBlciIsImdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZCIsIkFjdGlvblR5cGUiLCJEYXRhRmllbGRGb3JBY3Rpb24iLCJhbm5vdGF0aW9uUGF0aCIsImdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJub3QiLCJnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24iLCJnZXRSZWxhdGl2ZU1vZGVsUGF0aEZ1bmN0aW9uIiwiRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiRGVmYXVsdCIsImdldEhpZ2hsaWdodFJvd0JpbmRpbmciLCJjcml0aWNhbGl0eUFubm90YXRpb24iLCJpc0RyYWZ0Um9vdCIsInRhcmdldEVudGl0eVR5cGUiLCJkZWZhdWx0SGlnaGxpZ2h0Um93RGVmaW5pdGlvbiIsIk1lc3NhZ2VUeXBlIiwiZ2V0TWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHlUeXBlIiwiYU1pc3NpbmdLZXlzIiwiZm9ybWF0UmVzdWx0IiwiRW50aXR5IiwiSGFzQWN0aXZlIiwiSXNBY3RpdmUiLCJ0YWJsZUZvcm1hdHRlcnMiLCJyb3dIaWdobGlnaHRpbmciLCJfZ2V0Q3JlYXRpb25CZWhhdmlvdXIiLCJ0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiIsIm5hdmlnYXRpb24iLCJjcmVhdGUiLCJkZXRhaWwiLCJvcmlnaW5hbFRhYmxlU2V0dGluZ3MiLCJvdXRib3VuZCIsIm91dGJvdW5kRGV0YWlsIiwibmV3QWN0aW9uIiwidGFyZ2V0QW5ub3RhdGlvbnMiLCJEcmFmdFJvb3QiLCJOZXdBY3Rpb24iLCJTZXNzaW9uIiwiU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsImNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uUm93IiwiRXJyb3IiLCJyb3V0ZSIsImFwcGVuZCIsImNyZWF0ZUF0RW5kIiwibmF2aWdhdGVUb1RhcmdldCIsIk5ld1BhZ2UiLCJfZ2V0Um93Q29uZmlndXJhdGlvblByb3BlcnR5IiwidGFyZ2V0UGF0aCIsInByZXNzUHJvcGVydHkiLCJuYXZpZ2F0aW9uVGFyZ2V0IiwiY3JpdGljYWxpdHlQcm9wZXJ0eSIsImRpc3BsYXkiLCJ0YXJnZXQiLCJDcml0aWNhbGl0eSIsIkRyYWZ0Tm9kZSIsInJvd05hdmlnYXRlZEV4cHJlc3Npb24iLCJuYXZpZ2F0ZWRSb3ciLCJwcmVzcyIsInJvd05hdmlnYXRlZCIsIklzSW5hY3RpdmUiLCJjb2x1bW5zVG9CZUNyZWF0ZWQiLCJub25Tb3J0YWJsZUNvbHVtbnMiLCJ0YWJsZVR5cGUiLCJwcm9wZXJ0eSIsImV4aXN0cyIsInRhcmdldFR5cGUiLCJpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbiIsIkRhdGFGaWVsZERlZmF1bHQiLCJyZWxhdGVkUHJvcGVydGllc0luZm8iLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMiLCJyZWxhdGVkUHJvcGVydHlOYW1lcyIsImFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJjb2x1bW5JbmZvIiwiZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eSIsImdldEFubm90YXRpb25zQnlUZXJtIiwib0NvbHVtbkRyYWZ0SW5kaWNhdG9yIiwiZ2V0RGVmYXVsdERyYWZ0SW5kaWNhdG9yRm9yQ29sdW1uIiwiZXhwb3J0U2V0dGluZ3MiLCJ0ZW1wbGF0ZSIsImV4cG9ydFNldHRpbmdzVGVtcGxhdGUiLCJ3cmFwIiwiZXhwb3J0U2V0dGluZ3NXcmFwcGluZyIsIl9nZXRFeHBvcnREYXRhVHlwZSIsImV4cG9ydFVuaXROYW1lIiwidW5pdFByb3BlcnR5IiwiZXhwb3J0VW5pdFN0cmluZyIsImV4cG9ydFRpbWV6b25lTmFtZSIsInRpbWV6b25lUHJvcGVydHkiLCJleHBvcnRUaW1lem9uZVN0cmluZyIsImFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zIiwicmVsYXRlZENvbHVtbnMiLCJfY3JlYXRlUmVsYXRlZENvbHVtbnMiLCJmdWxsUHJvcGVydHlQYXRoIiwidXNlRGF0YUZpZWxkUHJlZml4IiwiYXZhaWxhYmxlRm9yQWRhcHRhdGlvbiIsInJlcGxhY2VTcGVjaWFsQ2hhcnMiLCJzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoIiwiZ2V0U2VtYW50aWNPYmplY3RQYXRoIiwiaXNIaWRkZW4iLCJncm91cFBhdGgiLCJfc2xpY2VBdFNsYXNoIiwiaXNHcm91cCIsImlzRGF0YVBvaW50RmFrZVByb3BlcnR5IiwiZXhwb3J0VHlwZSIsInNEYXRlSW5wdXRGb3JtYXQiLCJkYXRhVHlwZSIsImdldERhdGFGaWVsZERhdGFUeXBlIiwicHJvcGVydHlUeXBlQ29uZmlnIiwiZ2V0VHlwZUNvbmZpZyIsInNvcnRhYmxlIiwib1R5cGVDb25maWciLCJjbGFzc05hbWUiLCJvRm9ybWF0T3B0aW9ucyIsIm9Db25zdHJhaW50cyIsImNvbnN0cmFpbnRzIiwiZ2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludCIsImlucHV0Rm9ybWF0Iiwic2NhbGUiLCJkZWxpbWl0ZXIiLCJvVW5pdFByb3BlcnR5Iiwib1RpbWV6b25lUHJvcGVydHkiLCJzVW5pdFRleHQiLCJzVGltZXpvbmVUZXh0IiwiQW5ub3RhdGlvbiIsImxhYmVsIiwiX2dldExhYmVsIiwiZ3JvdXBMYWJlbCIsImdyb3VwIiwic2VtYW50aWNPYmplY3RQYXRoIiwiQXZhaWxhYmlsaXR5VHlwZSIsIkFkYXB0YXRpb24iLCJUYXJnZXQiLCIkdGFyZ2V0IiwiaXNHcm91cGFibGUiLCJpc1Byb3BlcnR5R3JvdXBhYmxlIiwiaXNLZXkiLCJjYXNlU2Vuc2l0aXZlIiwiaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlIiwidHlwZUNvbmZpZyIsInZpc3VhbFNldHRpbmdzIiwid2lkdGhDYWxjdWxhdGlvbiIsImdldEltcG9ydGFuY2UiLCJzVG9vbHRpcCIsIl9nZXRUb29sdGlwIiwidG9vbHRpcCIsIl9pc1ZhbGlkQ29sdW1uIiwiX2dldFZpc2libGVFeHByZXNzaW9uIiwiZGF0YUZpZWxkTW9kZWxQYXRoIiwicHJvcGVydHlWYWx1ZSIsImlzQW5hbHl0aWNhbEdyb3VwSGVhZGVyRXhwYW5kZWQiLCJpc0FuYWx5dGljcyIsIklzRXhwYW5kZWQiLCJpc0FuYWx5dGljYWxMZWFmIiwiTm9kZUxldmVsIiwiX2dldEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyIsImRhdGFGaWVsZEdyb3VwIiwiZmllbGRGb3JtYXRPcHRpb25zIiwiYUZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyIsIkRhdGEiLCJpbm5lckRhdGFGaWVsZCIsImlzUHJvcGVydHkiLCJkYXRhRmllbGREZWZhdWx0IiwiTGFiZWwiLCJpc0RhdGFGaWVsZFR5cGVzIiwiUXVpY2tJbmZvIiwiZGF0YXBvaW50VGFyZ2V0IiwiZ2V0Um93U3RhdHVzVmlzaWJpbGl0eSIsImdldEVycm9yU3RhdHVzVGV4dFZpc2liaWxpdHlGb3JtYXR0ZXIiLCJleGlzdGluZ0NvbHVtbnMiLCJyZWxhdGVkUHJvcGVydHlOYW1lTWFwIiwiZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aCIsInJlbGF0ZWRDb2x1bW4iLCJuZXdOYW1lIiwiaXNQYXJ0T2ZMaW5lSXRlbSIsInByb3BlcnR5SW5mbyIsIl9nZXRBbm5vdGF0aW9uQ29sdW1uTmFtZSIsIl9nZXRTaG93RGF0YUZpZWxkc0xhYmVsIiwiZmllbGRHcm91cE5hbWUiLCJvQ29sdW1ucyIsImFDb2x1bW5LZXlzIiwic2hvd0RhdGFGaWVsZHNMYWJlbCIsIl9nZXRSZWxhdGl2ZVBhdGgiLCJpc0xhc3RTbGFzaCIsImlzTGFzdFBhcnQiLCJpU2xhc2hJbmRleCIsImxhc3RJbmRleE9mIiwiX2lzQ29sdW1uU29ydGFibGUiLCJwcm9wZXJ0eVBhdGgiLCJmaWx0ZXJGdW5jdGlvbnMiLCJGaWx0ZXJGdW5jdGlvbnMiLCJnZXRFbnRpdHlDb250YWluZXIiLCJpc0FycmF5IiwiZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZSIsInRleHRMaW5lc0VkaXQiLCJfZmluZFNlbWFudGljS2V5VmFsdWVzIiwiYVNlbWFudGljS2V5VmFsdWVzIiwiYlNlbWFudGljS2V5Rm91bmQiLCJpIiwidmFsdWVzIiwic2VtYW50aWNLZXlGb3VuZCIsIl9maW5kUHJvcGVydGllcyIsInNlbWFudGljS2V5VmFsdWVzIiwiZmllbGRHcm91cFByb3BlcnRpZXMiLCJzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwIiwic1Byb3BlcnR5UGF0aCIsInRtcCIsImZpZWxkR3JvdXBQcm9wZXJ0eVBhdGgiLCJfZmluZFNlbWFudGljS2V5VmFsdWVzSW5GaWVsZEdyb3VwIiwiYVByb3BlcnRpZXMiLCJfcHJvcGVydGllc0ZvdW5kIiwiaXNGaWVsZEdyb3VwQ29sdW1uIiwic2VtYW50aWNLZXkiLCJzZW1hbnRpY0tleUluRmllbGRHcm91cCIsImhhc0RyYWZ0SW5kaWNhdG9yIiwic2VtYW50aWNrZXlzIiwib2JqZWN0U3RhdHVzVGV4dFZpc2liaWxpdHkiLCJGaWVsZEdyb3VwRHJhZnRJbmRpY2F0b3JQcm9wZXJ0eVBhdGgiLCJGaWVsZEdyb3VwTmFtZSIsIl9nZXRJbXBOdW1iZXIiLCJJbXBvcnRhbmNlIiwiaW5jbHVkZXMiLCJfZ2V0RGF0YUZpZWxkSW1wb3J0YW5jZSIsIl9nZXRNYXhJbXBvcnRhbmNlIiwiZmllbGRzIiwibWF4SW1wTnVtYmVyIiwiaW1wTnVtYmVyIiwiRGF0YUZpZWxkV2l0aE1heEltcG9ydGFuY2UiLCJmaWVsZCIsImZpZWxkc1dpdGhJbXBvcnRhbmNlIiwibWFwU2VtYW50aWNLZXlzIiwiZmllbGRHcm91cERhdGEiLCJmaWVsZEdyb3VwSGFzU2VtYW50aWNLZXkiLCJmaWVsZEdyb3VwRGF0YUZpZWxkIiwiSGlnaCIsImZpbHRlciIsIml0ZW0iLCJnZXROb25Tb3J0YWJsZVByb3BlcnRpZXNSZXN0cmljdGlvbnMiLCJsaW5lSXRlbSIsImNvbGxlY3RSZWxhdGVkUHJvcGVydGllc1JlY3Vyc2l2ZWx5IiwicmVsYXRlZFByb3BlcnRpZXMiLCJpc1N0YXRpY2FsbHlIaWRkZW4iLCJzTGFiZWwiLCJmaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMiLCJ2aXN1YWxTZXR0aW5nc1RvQmVFeGNsdWRlZCIsImV4Y2x1ZGVQcm9wZXJ0aWVzIiwiRmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zIiwiaXNEYXRhRmllbGRBbHdheXNIaWRkZW4iLCJIVE1MNSIsIkNzc0RlZmF1bHRzIiwiZXhwb3J0Q29udGFjdFByb3BlcnR5IiwiZXhwb3J0U2V0dGluZ3NDb250YWN0UHJvcGVydHkiLCJyZWxhdGVkUHJvcGVydHlOYW1lIiwiYWRkaXRpb25hbFByb3BlcnR5TmFtZSIsIl9nZXRQcm9wZXJ0eU5hbWVzIiwibWF0Y2hlZFByb3BlcnRpZXMiLCJyZXNvbHZlUGF0aCIsIl9hcHBlbmRDdXN0b21UZW1wbGF0ZSIsIl9nZXRNYW5pZmVzdE9yRGVmYXVsdFZhbHVlIiwiZGVmYXVsdFZhbHVlIiwiaXNBbm5vdGF0aW9uQ29sdW1uIiwiaW50ZXJuYWxDb2x1bW5zIiwibWFuaWZlc3RDb2x1bW4iLCJ2YWxpZGF0ZUtleSIsIk1lc3NhZ2UiLCJnZXREaWFnbm9zdGljcyIsImFkZElzc3VlIiwiSXNzdWVDYXRlZ29yeSIsIk1hbmlmZXN0IiwiSXNzdWVTZXZlcml0eSIsIkxvdyIsIklzc3VlQ2F0ZWdvcnlUeXBlIiwiQW5ub3RhdGlvbkNvbHVtbnMiLCJJbnZhbGlkS2V5IiwiaWQiLCJoZWFkZXIiLCJIb3Jpem9udGFsQWxpZ24iLCJCZWdpbiIsIlNsb3QiLCJwb3NpdGlvbiIsImFuY2hvciIsInBsYWNlbWVudCIsIlBsYWNlbWVudCIsIkFmdGVyIiwiaXNBY3Rpb25OYXZpZ2FibGUiLCJnZXRQMTNuTW9kZSIsInZhcmlhbnRNYW5hZ2VtZW50IiwiZ2V0VmFyaWFudE1hbmFnZW1lbnQiLCJhUGVyc29uYWxpemF0aW9uIiwiaXNBbmFseXRpY2FsVGFibGUiLCJpc1Jlc3BvbnNpdmVUYWJsZSIsInBlcnNvbmFsaXphdGlvbiIsInNvcnQiLCJhZ2dyZWdhdGUiLCJMaXN0UmVwb3J0IiwiVmFyaWFudE1hbmFnZW1lbnRUeXBlIiwiQ29udHJvbCIsIl9pc0ZpbHRlckJhckhpZGRlbiIsImlzRmlsdGVyQmFySGlkZGVuIiwiaGFzTXVsdGlwbGVWaXN1YWxpemF0aW9ucyIsIkFuYWx5dGljYWxMaXN0UGFnZSIsImdldFNvcnRDb25kaXRpb25zIiwibm9uU29ydGFibGVQcm9wZXJ0aWVzIiwic29ydENvbmRpdGlvbnMiLCJTb3J0T3JkZXIiLCJzb3J0ZXJzIiwiY29uZGl0aW9ucyIsImNvbmRpdGlvbiIsImNvbmRpdGlvblByb3BlcnR5IiwiUHJvcGVydHkiLCJpbmZvTmFtZSIsImNvbnZlcnRQcm9wZXJ0eVBhdGhzVG9JbmZvTmFtZXMiLCJkZXNjZW5kaW5nIiwiRGVzY2VuZGluZyIsInBhdGhzIiwiaW5mb05hbWVzIiwiY3VycmVudFBhdGgiLCJHcm91cEJ5IiwiYUdyb3VwQnkiLCJhR3JvdXBMZXZlbHMiLCJncm91cExldmVscyIsIlRvdGFsIiwiYVRvdGFscyIsInRpdGxlIiwiVHlwZU5hbWVQbHVyYWwiLCJwYWdlTWFuaWZlc3RTZXR0aW5ncyIsImhhc0Fic29sdXRlUGF0aCIsInAxM25Nb2RlIiwiZ2V0VGFibGVJRCIsImNyZWF0aW9uQmVoYXZpb3VyIiwic3RhbmRhcmRBY3Rpb25zQ29udGV4dCIsImdlbmVyYXRlU3RhbmRhcmRBY3Rpb25zQ29udGV4dCIsImdldERlbGV0ZVZpc2liaWxpdHkiLCJjcmVhdGVCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiIsImdldENyZWF0ZVZpc2liaWxpdHkiLCJtYXNzRWRpdEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uIiwiZ2V0TWFzc0VkaXRWaXNpYmlsaXR5IiwiaXNJbnNlcnRVcGRhdGVUZW1wbGF0ZWQiLCJnZXRJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGluZyIsImlzRHJhZnRPclN0aWNreVN1cHBvcnRlZCIsInRocmVzaG9sZCIsIk1heEl0ZW1zIiwiaXNTZWFyY2hhYmxlIiwiaXNQYXRoU2VhcmNoYWJsZSIsInN0YW5kYXJkQWN0aW9ucyIsImdldFN0YW5kYXJkQWN0aW9uQ3JlYXRlIiwiZ2V0U3RhbmRhcmRBY3Rpb25EZWxldGUiLCJwYXN0ZSIsImdldFN0YW5kYXJkQWN0aW9uUGFzdGUiLCJtYXNzRWRpdCIsImdldFN0YW5kYXJkQWN0aW9uTWFzc0VkaXQiLCJjcmVhdGlvblJvdyIsImdldENyZWF0aW9uUm93IiwiZW50aXR5TmFtZSIsImNvbGxlY3Rpb24iLCJnZXRUYXJnZXRPYmplY3RQYXRoIiwibmF2aWdhdGlvblBhdGgiLCJyb3ciLCJpc0luRGlzcGxheU1vZGUiLCJhdXRvQmluZE9uSW5pdCIsInNlYXJjaGFibGUiLCJpc0NvbXBsZXhQcm9wZXJ0eSIsImV4cG9ydERhdGFUeXBlIiwic3Vic3RyIiwiZ2V0U2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb24iLCJzZWxlY3Rpb25WYXJpYW50UGF0aCIsInJlc29sdmVkVGFyZ2V0IiwiZ2V0RW50aXR5VHlwZUFubm90YXRpb24iLCJzZWxlY3Rpb24iLCJwcm9wZXJ0eU5hbWVzIiwiU2VsZWN0T3B0aW9ucyIsInNlbGVjdE9wdGlvbiIsIlByb3BlcnR5TmFtZSIsInRleHQiLCJfZ2V0RnVsbFNjcmVlbkJhc2VkT25EZXZpY2UiLCJpc0lwaG9uZSIsImVuYWJsZUZ1bGxTY3JlZW4iLCJJc3N1ZVR5cGUiLCJGVUxMU0NSRUVOTU9ERV9OT1RfT05fTElTVFJFUE9SVCIsIl9nZXRNdWx0aVNlbGVjdE1vZGUiLCJtdWx0aVNlbGVjdE1vZGUiLCJzZWxlY3RBbGwiLCJ1c2VJY29uVGFiQmFyIiwiX2dldFRhYmxlVHlwZSIsImlzRGVza3RvcCIsIl9nZXRGaWx0ZXJzIiwicXVpY2tGaWx0ZXJQYXRocyIsInF1aWNrU2VsZWN0aW9uVmFyaWFudCIsInF1aWNrRmlsdGVycyIsInNob3dDb3VudHMiLCJxdWlja1ZhcmlhbnRTZWxlY3Rpb24iLCJfZ2V0RW5hYmxlRXhwb3J0IiwiZW5hYmxlUGFzdGUiLCJlbmFibGVFeHBvcnQiLCJfZ2V0RmlsdGVyQ29uZmlndXJhdGlvbiIsImZpbHRlcnMiLCJoaWRlVGFibGVUaXRsZSIsImhlYWRlclZpc2libGUiLCJjaGVja0NvbmRlbnNlZExheW91dCIsImVuYWJsZUF1dG9Db2x1bW5XaWR0aCIsImlzUGhvbmUiLCJkYXRhU3RhdGVJbmRpY2F0b3JGaWx0ZXIiLCJpc0NvbmRlbnNlZExheW91dENvbXBsaWFudCIsIm9GaWx0ZXJDb25maWd1cmF0aW9uIiwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwiY29uZGVuc2VkVGFibGVMYXlvdXQiLCJvQ29uZmlndXJhdGlvbiIsImRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGEiLCJlbmFibGVNYXNzRWRpdCIsInNlbGVjdGlvbkxpbWl0IiwiaW5saW5lQ3JlYXRpb25Sb3dDb3VudCIsInNob3dSb3dDb3VudCIsImdldFZpZXdDb25maWd1cmF0aW9uIiwidXNlQ29uZGVuc2VkVGFibGVMYXlvdXQiLCJpc0NvbXBhY3RUeXBlIiwib1RhcmdldE1hcHBpbmciLCJFRE1fVFlQRV9NQVBQSU5HIiwidW5kZXJseWluZ1R5cGUiLCIkU2NhbGUiLCJwcmVjaXNpb24iLCIkUHJlY2lzaW9uIiwibWF4TGVuZ3RoIiwiJE1heExlbmd0aCIsIm51bGxhYmxlIiwiJE51bGxhYmxlIiwibWluaW11bSIsImlzTmFOIiwiVmFsaWRhdGlvbiIsIk1pbmltdW0iLCJtYXhpbXVtIiwiTWF4aW11bSIsImlzRGlnaXRTZXF1ZW5jZSIsIklzRGlnaXRTZXF1ZW5jZSIsInBhcnNlQXNTdHJpbmciLCJlbXB0eVN0cmluZyIsInBhcnNlS2VlcHNFbXB0eVN0cmluZyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiVGFibGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbnRpdHlUeXBlLCBFbnVtVmFsdWUsIFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiwgUHJvcGVydHksIFByb3BlcnR5UGF0aCwgVHlwZURlZmluaXRpb24gfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgRmlsdGVyRnVuY3Rpb25zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9DYXBhYmlsaXRpZXNcIjtcbmltcG9ydCB0eXBlIHsgU2VtYW50aWNLZXkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW1vblwiO1xuaW1wb3J0IHsgQ29tbW9uQW5ub3RhdGlvblRlcm1zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25cIjtcbmltcG9ydCB0eXBlIHtcblx0Q3JpdGljYWxpdHlUeXBlLFxuXHREYXRhRmllbGQsXG5cdERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdERhdGFGaWVsZEZvckFjdGlvbixcblx0RGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uLFxuXHREYXRhRmllbGRUeXBlcyxcblx0RGF0YVBvaW50LFxuXHREYXRhUG9pbnRUeXBlVHlwZXMsXG5cdEZpZWxkR3JvdXBUeXBlLFxuXHRMaW5lSXRlbSxcblx0UHJlc2VudGF0aW9uVmFyaWFudFR5cGUsXG5cdFNlbGVjdGlvblZhcmlhbnRUeXBlLFxuXHRTZWxlY3RPcHRpb25UeXBlXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB7IFVJQW5ub3RhdGlvblR5cGVzIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IHR5cGUgeyBDb21wbGV4UHJvcGVydHlJbmZvIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvYW5ub3RhdGlvbnMvRGF0YUZpZWxkXCI7XG5pbXBvcnQge1xuXHRjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMsXG5cdGNvbGxlY3RSZWxhdGVkUHJvcGVydGllc1JlY3Vyc2l2ZWx5LFxuXHRnZXREYXRhRmllbGREYXRhVHlwZSxcblx0Z2V0U2VtYW50aWNPYmplY3RQYXRoLFxuXHRpc0RhdGFGaWVsZEFsd2F5c0hpZGRlbixcblx0aXNEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdCxcblx0aXNEYXRhRmllbGRUeXBlc1xufSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9hbm5vdGF0aW9ucy9EYXRhRmllbGRcIjtcbmltcG9ydCB0eXBlIHsgQW5ub3RhdGlvbkFjdGlvbiwgQmFzZUFjdGlvbiwgQ29tYmluZWRBY3Rpb24sIEN1c3RvbUFjdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9BY3Rpb25cIjtcbmltcG9ydCB7IGdldEFjdGlvbnNGcm9tTWFuaWZlc3QsIGlzQWN0aW9uTmF2aWdhYmxlLCByZW1vdmVEdXBsaWNhdGVBY3Rpb25zIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL0FjdGlvblwiO1xuaW1wb3J0IHsgRW50aXR5LCBVSSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQmluZGluZ0hlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBDb25maWd1cmFibGVPYmplY3QsIEN1c3RvbUVsZW1lbnQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0NvbmZpZ3VyYWJsZU9iamVjdFwiO1xuaW1wb3J0IHsgaW5zZXJ0Q3VzdG9tRWxlbWVudHMsIFBsYWNlbWVudCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgeyBJc3N1ZUNhdGVnb3J5LCBJc3N1ZUNhdGVnb3J5VHlwZSwgSXNzdWVTZXZlcml0eSwgSXNzdWVUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Jc3N1ZU1hbmFnZXJcIjtcbmltcG9ydCB7IEtleUhlbHBlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvS2V5XCI7XG5pbXBvcnQgdGFibGVGb3JtYXR0ZXJzIGZyb20gXCJzYXAvZmUvY29yZS9mb3JtYXR0ZXJzL1RhYmxlRm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBNZXNzYWdlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9mb3JtYXR0ZXJzL1RhYmxlRm9ybWF0dGVyVHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLCBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQge1xuXHRhbmQsXG5cdGNvbXBpbGVFeHByZXNzaW9uLFxuXHRjb25zdGFudCxcblx0ZXF1YWwsXG5cdGZvcm1hdFJlc3VsdCxcblx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uLFxuXHRpZkVsc2UsXG5cdGlzQ29uc3RhbnQsXG5cdG5vdCxcblx0b3IsXG5cdHBhdGhJbk1vZGVsLFxuXHRyZXNvbHZlQmluZGluZ1N0cmluZ1xufSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHsgcmVwbGFjZVNwZWNpYWxDaGFycyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1N0YWJsZUlkSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFNb2RlbE9iamVjdFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBnZXRUYXJnZXRPYmplY3RQYXRoLCBpc1BhdGhEZWxldGFibGUsIGlzUGF0aFNlYXJjaGFibGUsIGlzUGF0aFVwZGF0YWJsZSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgRGlzcGxheU1vZGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EaXNwbGF5TW9kZUZvcm1hdHRlclwiO1xuaW1wb3J0IHsgRURNX1RZUEVfTUFQUElORywgZ2V0RGlzcGxheU1vZGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EaXNwbGF5TW9kZUZvcm1hdHRlclwiO1xuaW1wb3J0IHsgZ2V0Tm9uU29ydGFibGVQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRW50aXR5U2V0SGVscGVyXCI7XG5pbXBvcnQge1xuXHRnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHksXG5cdGdldFRhcmdldFZhbHVlT25EYXRhUG9pbnQsXG5cdGlzUGF0aEV4cHJlc3Npb24sXG5cdGlzUHJvcGVydHlcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvUHJvcGVydHlIZWxwZXJcIjtcbmltcG9ydCBBY3Rpb25IZWxwZXIgZnJvbSBcInNhcC9mZS9tYWNyb3MvaW50ZXJuYWwvaGVscGVycy9BY3Rpb25IZWxwZXJcIjtcbmltcG9ydCB0eXBlIENvbnZlcnRlckNvbnRleHQgZnJvbSBcIi4uLy4uL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB7IEFnZ3JlZ2F0aW9uSGVscGVyIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvQWdncmVnYXRpb25cIjtcbmltcG9ydCB7IGlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvRGF0YUZpZWxkSGVscGVyXCI7XG5pbXBvcnQgeyBnZXRUYWJsZUlEIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvSURcIjtcbmltcG9ydCB0eXBlIHtcblx0Rm9ybWF0T3B0aW9uc1R5cGUsXG5cdE1hbmlmZXN0VGFibGVDb2x1bW4sXG5cdE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdE5hdmlnYXRpb25UYXJnZXRDb25maWd1cmF0aW9uLFxuXHRUYWJsZUNvbHVtblNldHRpbmdzLFxuXHRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbixcblx0VGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0Vmlld1BhdGhDb25maWd1cmF0aW9uXG59IGZyb20gXCIuLi8uLi9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQge1xuXHRBY3Rpb25UeXBlLFxuXHRBdmFpbGFiaWxpdHlUeXBlLFxuXHRDcmVhdGlvbk1vZGUsXG5cdEhvcml6b250YWxBbGlnbixcblx0SW1wb3J0YW5jZSxcblx0U2VsZWN0aW9uTW9kZSxcblx0VGVtcGxhdGVUeXBlLFxuXHRWYXJpYW50TWFuYWdlbWVudFR5cGUsXG5cdFZpc3VhbGl6YXRpb25UeXBlXG59IGZyb20gXCIuLi8uLi9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgdHlwZSBNYW5pZmVzdFdyYXBwZXIgZnJvbSBcIi4uLy4uL01hbmlmZXN0V3JhcHBlclwiO1xuaW1wb3J0IHsgZ2V0TWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHlUeXBlIH0gZnJvbSBcIi4vQ3JpdGljYWxpdHlcIjtcbmltcG9ydCB0eXBlIHsgU3RhbmRhcmRBY3Rpb25Db25maWdUeXBlIH0gZnJvbSBcIi4vdGFibGUvU3RhbmRhcmRBY3Rpb25zXCI7XG5pbXBvcnQge1xuXHRnZW5lcmF0ZVN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGdldENyZWF0ZVZpc2liaWxpdHksXG5cdGdldENyZWF0aW9uUm93LFxuXHRnZXREZWxldGVWaXNpYmlsaXR5LFxuXHRnZXRJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGluZyxcblx0Z2V0TWFzc0VkaXRWaXNpYmlsaXR5LFxuXHRnZXRSZXN0cmljdGlvbnMsXG5cdGdldFN0YW5kYXJkQWN0aW9uQ3JlYXRlLFxuXHRnZXRTdGFuZGFyZEFjdGlvbkRlbGV0ZSxcblx0Z2V0U3RhbmRhcmRBY3Rpb25NYXNzRWRpdCxcblx0Z2V0U3RhbmRhcmRBY3Rpb25QYXN0ZSxcblx0aXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkLFxuXHRpc0luRGlzcGxheU1vZGVcbn0gZnJvbSBcIi4vdGFibGUvU3RhbmRhcmRBY3Rpb25zXCI7XG5cbmV4cG9ydCB0eXBlIFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24gPSB7XG5cdGF1dG9CaW5kT25Jbml0OiBib29sZWFuO1xuXHRjb2xsZWN0aW9uOiBzdHJpbmc7XG5cdHZhcmlhbnRNYW5hZ2VtZW50OiBWYXJpYW50TWFuYWdlbWVudFR5cGU7XG5cdGZpbHRlcklkPzogc3RyaW5nO1xuXHRpZDogc3RyaW5nO1xuXHRuYXZpZ2F0aW9uUGF0aDogc3RyaW5nO1xuXHRwMTNuTW9kZT86IHN0cmluZztcblx0cm93Pzoge1xuXHRcdGFjdGlvbj86IHN0cmluZztcblx0XHRwcmVzcz86IHN0cmluZztcblx0XHRyb3dIaWdobGlnaHRpbmc6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xuXHRcdHJvd05hdmlnYXRlZDogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG5cdFx0dmlzaWJsZT86IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xuXHR9O1xuXHRzZWxlY3Rpb25Nb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHN0YW5kYXJkQWN0aW9uczoge1xuXHRcdGFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZT47XG5cdFx0aXNJbnNlcnRVcGRhdGVUZW1wbGF0ZWQ6IGJvb2xlYW47XG5cdFx0dXBkYXRhYmxlUHJvcGVydHlQYXRoOiBzdHJpbmc7XG5cdH07XG5cdGRpc3BsYXlNb2RlPzogYm9vbGVhbjtcblx0dGhyZXNob2xkOiBudW1iZXI7XG5cdGVudGl0eU5hbWU6IHN0cmluZztcblx0c29ydENvbmRpdGlvbnM/OiBzdHJpbmc7XG5cdGdyb3VwQ29uZGl0aW9ucz86IHN0cmluZztcblx0YWdncmVnYXRlQ29uZGl0aW9ucz86IHN0cmluZztcblxuXHQvKiogQ3JlYXRlIG5ldyBlbnRyaWVzICovXG5cdGNyZWF0ZTogQ3JlYXRlQmVoYXZpb3IgfCBDcmVhdGVCZWhhdmlvckV4dGVybmFsO1xuXHR0aXRsZTogc3RyaW5nO1xuXHRzZWFyY2hhYmxlOiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBOZXcgZW50cmllcyBhcmUgY3JlYXRlZCB3aXRoaW4gdGhlIGFwcCAoZGVmYXVsdCBjYXNlKVxuICovXG50eXBlIENyZWF0ZUJlaGF2aW9yID0ge1xuXHRtb2RlOiBDcmVhdGlvbk1vZGU7XG5cdGFwcGVuZDogYm9vbGVhbjtcblx0bmV3QWN0aW9uPzogc3RyaW5nO1xuXHRuYXZpZ2F0ZVRvVGFyZ2V0Pzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBOZXcgZW50cmllcyBhcmUgY3JlYXRlZCBieSBuYXZpZ2F0aW5nIHRvIHNvbWUgdGFyZ2V0XG4gKi9cbnR5cGUgQ3JlYXRlQmVoYXZpb3JFeHRlcm5hbCA9IHtcblx0bW9kZTogXCJFeHRlcm5hbFwiO1xuXHRvdXRib3VuZDogc3RyaW5nO1xuXHRvdXRib3VuZERldGFpbDogTmF2aWdhdGlvblRhcmdldENvbmZpZ3VyYXRpb25bXCJvdXRib3VuZERldGFpbFwiXTtcblx0bmF2aWdhdGlvblNldHRpbmdzOiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uO1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVDYXBhYmlsaXR5UmVzdHJpY3Rpb24gPSB7XG5cdGlzRGVsZXRhYmxlOiBib29sZWFuO1xuXHRpc1VwZGF0YWJsZTogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFRhYmxlRmlsdGVyc0NvbmZpZ3VyYXRpb24gPSB7XG5cdGVuYWJsZWQ/OiBzdHJpbmcgfCBib29sZWFuO1xuXHRwYXRoczogW1xuXHRcdHtcblx0XHRcdGFubm90YXRpb25QYXRoOiBzdHJpbmc7XG5cdFx0fVxuXHRdO1xuXHRzaG93Q291bnRzPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uID0ge1xuXHRwcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXTtcblx0dGV4dD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24gPSB7XG5cdGNyZWF0ZUF0RW5kOiBib29sZWFuO1xuXHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZTtcblx0ZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YTogYm9vbGVhbjtcblx0Y3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHVzZUNvbmRlbnNlZFRhYmxlTGF5b3V0OiBib29sZWFuO1xuXHRlbmFibGVFeHBvcnQ6IGJvb2xlYW47XG5cdGhlYWRlclZpc2libGU6IGJvb2xlYW47XG5cdGZpbHRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBUYWJsZUZpbHRlcnNDb25maWd1cmF0aW9uPjtcblx0dHlwZTogVGFibGVUeXBlO1xuXHRzZWxlY3RBbGw/OiBib29sZWFuO1xuXHRzZWxlY3Rpb25MaW1pdDogbnVtYmVyO1xuXHRtdWx0aVNlbGVjdE1vZGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0ZW5hYmxlUGFzdGU6IGJvb2xlYW47XG5cdGVuYWJsZUZ1bGxTY3JlZW46IGJvb2xlYW47XG5cdHNob3dSb3dDb3VudDogYm9vbGVhbjtcblx0aW5saW5lQ3JlYXRpb25Sb3dDb3VudD86IG51bWJlcjtcblx0ZW5hYmxlTWFzc0VkaXQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cdGVuYWJsZUF1dG9Db2x1bW5XaWR0aDogYm9vbGVhbjtcblx0ZGF0YVN0YXRlSW5kaWNhdG9yRmlsdGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGlzQ29tcGFjdFR5cGU/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVUeXBlID0gXCJHcmlkVGFibGVcIiB8IFwiUmVzcG9uc2l2ZVRhYmxlXCIgfCBcIkFuYWx5dGljYWxUYWJsZVwiO1xuXG5lbnVtIENvbHVtblR5cGUge1xuXHREZWZhdWx0ID0gXCJEZWZhdWx0XCIsIC8vIERlZmF1bHQgVHlwZVxuXHRBbm5vdGF0aW9uID0gXCJBbm5vdGF0aW9uXCIsXG5cdFNsb3QgPSBcIlNsb3RcIlxufVxuXG5leHBvcnQgdHlwZSBCYXNlVGFibGVDb2x1bW4gPSBDb25maWd1cmFibGVPYmplY3QgJiB7XG5cdGlkOiBzdHJpbmc7XG5cdHdpZHRoPzogc3RyaW5nO1xuXHRuYW1lOiBzdHJpbmc7XG5cdGF2YWlsYWJpbGl0eT86IEF2YWlsYWJpbGl0eVR5cGU7XG5cdHR5cGU6IENvbHVtblR5cGU7IC8vT3JpZ2luIG9mIHRoZSBzb3VyY2Ugd2hlcmUgd2UgYXJlIGdldHRpbmcgdGhlIHRlbXBsYXRlZCBpbmZvcm1hdGlvbiBmcm9tLFxuXHRpc05hdmlnYWJsZT86IGJvb2xlYW47XG5cdHNldHRpbmdzPzogVGFibGVDb2x1bW5TZXR0aW5ncztcblx0c2VtYW50aWNPYmplY3RQYXRoPzogc3RyaW5nO1xuXHRwcm9wZXJ0eUluZm9zPzogc3RyaW5nW107XG5cdGNhc2VTZW5zaXRpdmU/OiBib29sZWFuO1xuXHRzb3J0YWJsZTogYm9vbGVhbjtcblx0aXNHcm91cGFibGU/OiBib29sZWFuO1xuXHRob3Jpem9udGFsQWxpZ24/OiBIb3Jpem9udGFsQWxpZ247XG5cdGZvcm1hdE9wdGlvbnM6IEZvcm1hdE9wdGlvbnNUeXBlO1xuXHRpbXBvcnRhbmNlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBDdXN0b21UYWJsZUNvbHVtbiA9IEJhc2VUYWJsZUNvbHVtbiAmIHtcblx0aGVhZGVyPzogc3RyaW5nO1xuXHR0ZW1wbGF0ZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgQW5ub3RhdGlvblRhYmxlQ29sdW1uID0gQmFzZVRhYmxlQ29sdW1uICYge1xuXHRhbm5vdGF0aW9uUGF0aDogc3RyaW5nO1xuXHRyZWxhdGl2ZVBhdGg6IHN0cmluZztcblx0bGFiZWw/OiBzdHJpbmc7XG5cdHRvb2x0aXA/OiBzdHJpbmc7XG5cdGdyb3VwTGFiZWw/OiBzdHJpbmc7XG5cdGdyb3VwPzogc3RyaW5nO1xuXHRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnM/OiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0c2hvd0RhdGFGaWVsZHNMYWJlbD86IGJvb2xlYW47XG5cdGlzS2V5PzogYm9vbGVhbjtcblx0dW5pdD86IHN0cmluZztcblx0dW5pdFRleHQ/OiBzdHJpbmc7XG5cdHRpbWV6b25lVGV4dD86IHN0cmluZztcblx0dGltZXpvbmU/OiBzdHJpbmc7XG5cdGV4cG9ydFNldHRpbmdzPzoge1xuXHRcdHRlbXBsYXRlPzogc3RyaW5nO1xuXHRcdGxhYmVsPzogc3RyaW5nO1xuXHRcdHdyYXA/OiBib29sZWFuO1xuXHRcdHR5cGU/OiBzdHJpbmc7XG5cdFx0aW5wdXRGb3JtYXQ/OiBzdHJpbmc7XG5cdFx0Zm9ybWF0Pzogc3RyaW5nO1xuXHRcdHNjYWxlPzogbnVtYmVyO1xuXHRcdGRlbGltaXRlcj86IGJvb2xlYW47XG5cdFx0dW5pdD86IHN0cmluZztcblx0XHR1bml0UHJvcGVydHk/OiBzdHJpbmc7XG5cdFx0dGltZXpvbmU/OiBzdHJpbmc7XG5cdFx0dGltZXpvbmVQcm9wZXJ0eT86IHN0cmluZztcblx0fTtcblx0aXNEYXRhUG9pbnRGYWtlVGFyZ2V0UHJvcGVydHk/OiBib29sZWFuO1xuXHR0ZXh0QXJyYW5nZW1lbnQ/OiB7XG5cdFx0dGV4dFByb3BlcnR5OiBzdHJpbmc7XG5cdFx0bW9kZTogRGlzcGxheU1vZGU7XG5cdH07XG5cdGV4cG9ydENvbnRhY3RQcm9wZXJ0eT86IHN0cmluZztcblx0YWRkaXRpb25hbFByb3BlcnR5SW5mb3M/OiBzdHJpbmdbXTtcblx0dmlzdWFsU2V0dGluZ3M/OiBWaXN1YWxTZXR0aW5ncztcblx0dHlwZUNvbmZpZz86IG9iamVjdDtcblx0aXNQYXJ0T2ZMaW5lSXRlbT86IGJvb2xlYW47IC8vIHRlbXBvcmFyeSBpbmRpY2F0b3IgdG8gb25seSBhbGxvdyBmaWx0ZXJpbmcgb24gbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIHdoZW4gdGhleSdyZSBwYXJ0IG9mIGEgbGluZSBpdGVtXG59O1xuXG5leHBvcnQgdHlwZSBWaXN1YWxTZXR0aW5ncyA9IHtcblx0d2lkdGhDYWxjdWxhdGlvbj86IFdpZHRoQ2FsY3VsYXRpb247XG59O1xuXG5leHBvcnQgdHlwZSBXaWR0aENhbGN1bGF0aW9uID0gbnVsbCB8IHtcblx0bWluV2lkdGg/OiBudW1iZXI7XG5cdG1heFdpZHRoPzogbnVtYmVyO1xuXHRkZWZhdWx0V2lkdGg/OiBudW1iZXI7XG5cdGluY2x1ZGVMYWJlbD86IGJvb2xlYW47XG5cdGdhcD86IG51bWJlcjtcblx0Ly8gb25seSByZWxldmFudCBmb3IgY29tcGxleCB0eXBlc1xuXHRleGNsdWRlUHJvcGVydGllcz86IHN0cmluZ1tdO1xuXHR2ZXJ0aWNhbEFycmFuZ2VtZW50PzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFRhYmxlQ29sdW1uID0gQ3VzdG9tVGFibGVDb2x1bW4gfCBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cbmV4cG9ydCB0eXBlIEN1c3RvbUNvbHVtbiA9IEN1c3RvbUVsZW1lbnQ8VGFibGVDb2x1bW4+O1xuXG5leHBvcnQgdHlwZSBBZ2dyZWdhdGVEYXRhID0ge1xuXHRkZWZhdWx0QWdncmVnYXRlOiB7XG5cdFx0Y29udGV4dERlZmluaW5nUHJvcGVydGllcz86IHN0cmluZ1tdO1xuXHR9O1xuXHRyZWxhdGl2ZVBhdGg6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFRhYmxlVmlzdWFsaXphdGlvbiA9IHtcblx0dHlwZTogVmlzdWFsaXphdGlvblR5cGUuVGFibGU7XG5cdGFubm90YXRpb246IFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb247XG5cdGNvbnRyb2w6IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb247XG5cdGNvbHVtbnM6IFRhYmxlQ29sdW1uW107XG5cdGFjdGlvbnM6IEJhc2VBY3Rpb25bXTtcblx0Y29tbWFuZEFjdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BY3Rpb24+O1xuXHRhZ2dyZWdhdGVzPzogUmVjb3JkPHN0cmluZywgQWdncmVnYXRlRGF0YT47XG5cdGVuYWJsZUFuYWx5dGljcz86IGJvb2xlYW47XG5cdGVuYWJsZUFuYWx5dGljc1NlYXJjaD86IGJvb2xlYW47XG5cdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogc3RyaW5nO1xuXHRvcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzOiBzdHJpbmc7XG5cdGhlYWRlckluZm9UaXRsZTogc3RyaW5nO1xuXHRzZW1hbnRpY0tleXM6IHN0cmluZ1tdO1xufTtcblxudHlwZSBTb3J0ZXJUeXBlID0ge1xuXHRuYW1lOiBzdHJpbmc7XG5cdGRlc2NlbmRpbmc6IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGFubm90YXRpb24tYmFzZWQgYW5kIG1hbmlmZXN0LWJhc2VkIHRhYmxlIGFjdGlvbnMuXG4gKlxuICogQHBhcmFtIGxpbmVJdGVtQW5ub3RhdGlvblxuICogQHBhcmFtIHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIG5hdmlnYXRpb25TZXR0aW5nc1xuICogQHJldHVybnMgVGhlIGNvbXBsZXRlIHRhYmxlIGFjdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlQWN0aW9ucyhcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0bmF2aWdhdGlvblNldHRpbmdzPzogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvblxuKTogQ29tYmluZWRBY3Rpb24ge1xuXHRjb25zdCBhVGFibGVBY3Rpb25zID0gZ2V0VGFibGVBbm5vdGF0aW9uQWN0aW9ucyhsaW5lSXRlbUFubm90YXRpb24sIHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgYUFubm90YXRpb25BY3Rpb25zID0gYVRhYmxlQWN0aW9ucy50YWJsZUFjdGlvbnM7XG5cdGNvbnN0IGFIaWRkZW5BY3Rpb25zID0gYVRhYmxlQWN0aW9ucy5oaWRkZW5UYWJsZUFjdGlvbnM7XG5cdGNvbnN0IG1hbmlmZXN0QWN0aW9ucyA9IGdldEFjdGlvbnNGcm9tTWFuaWZlc3QoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKS5hY3Rpb25zLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0YUFubm90YXRpb25BY3Rpb25zLFxuXHRcdG5hdmlnYXRpb25TZXR0aW5ncyxcblx0XHR0cnVlLFxuXHRcdGFIaWRkZW5BY3Rpb25zXG5cdCk7XG5cdGNvbnN0IGFjdGlvbnMgPSBpbnNlcnRDdXN0b21FbGVtZW50cyhhQW5ub3RhdGlvbkFjdGlvbnMsIG1hbmlmZXN0QWN0aW9ucy5hY3Rpb25zLCB7XG5cdFx0aXNOYXZpZ2FibGU6IFwib3ZlcndyaXRlXCIsXG5cdFx0ZW5hYmxlT25TZWxlY3Q6IFwib3ZlcndyaXRlXCIsXG5cdFx0ZW5hYmxlQXV0b1Njcm9sbDogXCJvdmVyd3JpdGVcIixcblx0XHRlbmFibGVkOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbjogXCJvdmVyd3JpdGVcIixcblx0XHRjb21tYW5kOiBcIm92ZXJ3cml0ZVwiXG5cdH0pO1xuXG5cdHJldHVybiB7XG5cdFx0XCJhY3Rpb25zXCI6IGFjdGlvbnMsXG5cdFx0XCJjb21tYW5kQWN0aW9uc1wiOiBtYW5pZmVzdEFjdGlvbnMuY29tbWFuZEFjdGlvbnNcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBjb2x1bW5zLCBhbm5vdGF0aW9uLWJhc2VkIGFzIHdlbGwgYXMgbWFuaWZlc3QgYmFzZWQuXG4gKiBUaGV5IGFyZSBzb3J0ZWQgYW5kIHNvbWUgcHJvcGVydGllcyBjYW4gYmUgb3ZlcndyaXR0ZW4gdmlhIHRoZSBtYW5pZmVzdCAoY2hlY2sgb3V0IHRoZSBrZXlzIHRoYXQgY2FuIGJlIG92ZXJ3cml0dGVuKS5cbiAqXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgZm9yIHJlcHJlc2VudGF0aW9uIGluIGEgdGFibGUgb3IgbGlzdFxuICogQHBhcmFtIHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIG5hdmlnYXRpb25TZXR0aW5nc1xuICogQHJldHVybnMgUmV0dXJucyBhbGwgdGFibGUgY29sdW1ucyB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUsIHJlZ2FyZGxlc3Mgb2YgdGVtcGxhdGluZyBvciBwZXJzb25hbGl6YXRpb24gb3IgdGhlaXIgb3JpZ2luXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZUNvbHVtbnMoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdG5hdmlnYXRpb25TZXR0aW5ncz86IE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb25cbik6IFRhYmxlQ29sdW1uW10ge1xuXHRjb25zdCBhbm5vdGF0aW9uQ29sdW1ucyA9IGdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMobGluZUl0ZW1Bbm5vdGF0aW9uLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IG1hbmlmZXN0Q29sdW1ucyA9IGdldENvbHVtbnNGcm9tTWFuaWZlc3QoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKS5jb2x1bW5zLFxuXHRcdGFubm90YXRpb25Db2x1bW5zIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZShsaW5lSXRlbUFubm90YXRpb24pLFxuXHRcdG5hdmlnYXRpb25TZXR0aW5nc1xuXHQpO1xuXG5cdHJldHVybiBpbnNlcnRDdXN0b21FbGVtZW50cyhhbm5vdGF0aW9uQ29sdW1ucywgbWFuaWZlc3RDb2x1bW5zLCB7XG5cdFx0d2lkdGg6IFwib3ZlcndyaXRlXCIsXG5cdFx0aW1wb3J0YW5jZTogXCJvdmVyd3JpdGVcIixcblx0XHRpc05hdmlnYWJsZTogXCJvdmVyd3JpdGVcIixcblx0XHRhdmFpbGFiaWxpdHk6IFwib3ZlcndyaXRlXCIsXG5cdFx0c2V0dGluZ3M6IFwib3ZlcndyaXRlXCIsXG5cdFx0aG9yaXpvbnRhbEFsaWduOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdGZvcm1hdE9wdGlvbnM6IFwib3ZlcndyaXRlXCJcblx0fSk7XG59XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGN1c3RvbSBhZ2dyZWdhdGlvbiBkZWZpbml0aW9ucyBmcm9tIHRoZSBlbnRpdHlUeXBlLlxuICpcbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB0YXJnZXQgZW50aXR5IHR5cGUuXG4gKiBAcGFyYW0gdGFibGVDb2x1bW5zIFRoZSBhcnJheSBvZiBjb2x1bW5zIGZvciB0aGUgZW50aXR5IHR5cGUuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHQuXG4gKiBAcmV0dXJucyBUaGUgYWdncmVnYXRlIGRlZmluaXRpb25zIGZyb20gdGhlIGVudGl0eVR5cGUsIG9yIHVuZGVmaW5lZCBpZiB0aGUgZW50aXR5IGRvZXNuJ3Qgc3VwcG9ydCBhbmFseXRpY2FsIHF1ZXJpZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRBZ2dyZWdhdGVEZWZpbml0aW9uc0Zyb21FbnRpdHlUeXBlID0gZnVuY3Rpb24gKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHR0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IFJlY29yZDxzdHJpbmcsIEFnZ3JlZ2F0ZURhdGE+IHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cblx0ZnVuY3Rpb24gZmluZENvbHVtbkZyb21QYXRoKHBhdGg6IHN0cmluZyk6IFRhYmxlQ29sdW1uIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGFibGVDb2x1bW5zLmZpbmQoKGNvbHVtbikgPT4ge1xuXHRcdFx0Y29uc3QgYW5ub3RhdGlvbkNvbHVtbiA9IGNvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0XHRyZXR1cm4gYW5ub3RhdGlvbkNvbHVtbi5wcm9wZXJ0eUluZm9zID09PSB1bmRlZmluZWQgJiYgYW5ub3RhdGlvbkNvbHVtbi5yZWxhdGl2ZVBhdGggPT09IHBhdGg7XG5cdFx0fSk7XG5cdH1cblxuXHRpZiAoIWFnZ3JlZ2F0aW9uSGVscGVyLmlzQW5hbHl0aWNzU3VwcG9ydGVkKCkpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0Ly8gS2VlcCBhIHNldCBvZiBhbGwgY3VycmVuY3kvdW5pdCBwcm9wZXJ0aWVzLCBhcyB3ZSBkb24ndCB3YW50IHRvIGNvbnNpZGVyIHRoZW0gYXMgYWdncmVnYXRlc1xuXHQvLyBUaGV5IGFyZSBhZ2dyZWdhdGVzIGZvciB0ZWNobmljYWwgcmVhc29ucyAodG8gbWFuYWdlIG11bHRpLXVuaXRzIHNpdHVhdGlvbnMpIGJ1dCBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgZnJvbSBhIHVzZXIgc3RhbmRwb2ludFxuXHRjb25zdCBtQ3VycmVuY3lPclVuaXRQcm9wZXJ0aWVzID0gbmV3IFNldCgpO1xuXHR0YWJsZUNvbHVtbnMuZm9yRWFjaCgob0NvbHVtbikgPT4ge1xuXHRcdGNvbnN0IG9UYWJsZUNvbHVtbiA9IG9Db2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdGlmIChvVGFibGVDb2x1bW4udW5pdCkge1xuXHRcdFx0bUN1cnJlbmN5T3JVbml0UHJvcGVydGllcy5hZGQob1RhYmxlQ29sdW1uLnVuaXQpO1xuXHRcdH1cblx0fSk7XG5cblx0Y29uc3QgYUN1c3RvbUFnZ3JlZ2F0ZUFubm90YXRpb25zID0gYWdncmVnYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQWdncmVnYXRlRGVmaW5pdGlvbnMoKTtcblx0Y29uc3QgbVJhd0RlZmluaXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcblxuXHRhQ3VzdG9tQWdncmVnYXRlQW5ub3RhdGlvbnMuZm9yRWFjaCgoYW5ub3RhdGlvbikgPT4ge1xuXHRcdGNvbnN0IG9BZ2dyZWdhdGVkUHJvcGVydHkgPSBhZ2dyZWdhdGlvbkhlbHBlci5fZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLmZpbmQoKG9Qcm9wZXJ0eSkgPT4ge1xuXHRcdFx0cmV0dXJuIG9Qcm9wZXJ0eS5uYW1lID09PSBhbm5vdGF0aW9uLnF1YWxpZmllcjtcblx0XHR9KTtcblxuXHRcdGlmIChvQWdncmVnYXRlZFByb3BlcnR5KSB7XG5cdFx0XHRjb25zdCBhQ29udGV4dERlZmluaW5nUHJvcGVydGllcyA9IGFubm90YXRpb24uYW5ub3RhdGlvbnM/LkFnZ3JlZ2F0aW9uPy5Db250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzO1xuXHRcdFx0bVJhd0RlZmluaXRpb25zW29BZ2dyZWdhdGVkUHJvcGVydHkubmFtZV0gPSBhQ29udGV4dERlZmluaW5nUHJvcGVydGllc1xuXHRcdFx0XHQ/IGFDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzLm1hcCgob0N0eERlZlByb3BlcnR5KSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0N0eERlZlByb3BlcnR5LnZhbHVlO1xuXHRcdFx0XHQgIH0pXG5cdFx0XHRcdDogW107XG5cdFx0fVxuXHR9KTtcblx0Y29uc3QgbVJlc3VsdDogUmVjb3JkPHN0cmluZywgQWdncmVnYXRlRGF0YT4gPSB7fTtcblxuXHR0YWJsZUNvbHVtbnMuZm9yRWFjaCgob0NvbHVtbikgPT4ge1xuXHRcdGNvbnN0IG9UYWJsZUNvbHVtbiA9IG9Db2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdGlmIChvVGFibGVDb2x1bW4ucHJvcGVydHlJbmZvcyA9PT0gdW5kZWZpbmVkICYmIG9UYWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGgpIHtcblx0XHRcdGNvbnN0IGFSYXdDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzID0gbVJhd0RlZmluaXRpb25zW29UYWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGhdO1xuXG5cdFx0XHQvLyBJZ25vcmUgYWdncmVnYXRlcyBjb3JyZXNwb25kaW5nIHRvIGN1cnJlbmNpZXMgb3IgdW5pdHMgb2YgbWVhc3VyZSBhbmQgZHVtbXkgY3JlYXRlZCBwcm9wZXJ0eSBmb3IgZGF0YXBvaW50IHRhcmdldCBWYWx1ZVxuXHRcdFx0aWYgKFxuXHRcdFx0XHRhUmF3Q29udGV4dERlZmluaW5nUHJvcGVydGllcyAmJlxuXHRcdFx0XHQhbUN1cnJlbmN5T3JVbml0UHJvcGVydGllcy5oYXMob1RhYmxlQ29sdW1uLm5hbWUpICYmXG5cdFx0XHRcdCFvVGFibGVDb2x1bW4uaXNEYXRhUG9pbnRGYWtlVGFyZ2V0UHJvcGVydHlcblx0XHRcdCkge1xuXHRcdFx0XHRtUmVzdWx0W29UYWJsZUNvbHVtbi5uYW1lXSA9IHtcblx0XHRcdFx0XHRkZWZhdWx0QWdncmVnYXRlOiB7fSxcblx0XHRcdFx0XHRyZWxhdGl2ZVBhdGg6IG9UYWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGhcblx0XHRcdFx0fTtcblx0XHRcdFx0Y29uc3QgYUNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cdFx0XHRcdGFSYXdDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzLmZvckVhY2goKGNvbnRleHREZWZpbmluZ1Byb3BlcnR5TmFtZSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGZvdW5kQ29sdW1uID0gZmluZENvbHVtbkZyb21QYXRoKGNvbnRleHREZWZpbmluZ1Byb3BlcnR5TmFtZSk7XG5cdFx0XHRcdFx0aWYgKGZvdW5kQ29sdW1uKSB7XG5cdFx0XHRcdFx0XHRhQ29udGV4dERlZmluaW5nUHJvcGVydGllcy5wdXNoKGZvdW5kQ29sdW1uLm5hbWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYgKGFDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzLmxlbmd0aCkge1xuXHRcdFx0XHRcdG1SZXN1bHRbb1RhYmxlQ29sdW1uLm5hbWVdLmRlZmF1bHRBZ2dyZWdhdGUuY29udGV4dERlZmluaW5nUHJvcGVydGllcyA9IGFDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHRyZXR1cm4gbVJlc3VsdDtcbn07XG5cbi8qKlxuICogVXBkYXRlcyBhIHRhYmxlIHZpc3VhbGl6YXRpb24gZm9yIGFuYWx5dGljYWwgdXNlIGNhc2VzLlxuICpcbiAqIEBwYXJhbSB0YWJsZVZpc3VhbGl6YXRpb24gVGhlIHZpc3VhbGl6YXRpb24gdG8gYmUgdXBkYXRlZFxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGVudGl0eSB0eXBlIGRpc3BsYXllZCBpbiB0aGUgdGFibGVcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIFRoZSBwcmVzZW50YXRpb25WYXJpYW50IGFubm90YXRpb24gKGlmIGFueSlcbiAqL1xuZnVuY3Rpb24gdXBkYXRlVGFibGVWaXN1YWxpemF0aW9uRm9yQW5hbHl0aWNzKFxuXHR0YWJsZVZpc3VhbGl6YXRpb246IFRhYmxlVmlzdWFsaXphdGlvbixcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/OiBQcmVzZW50YXRpb25WYXJpYW50VHlwZVxuKSB7XG5cdGlmICh0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC50eXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiKSB7XG5cdFx0Y29uc3QgYWdncmVnYXRlc0RlZmluaXRpb25zID0gZ2V0QWdncmVnYXRlRGVmaW5pdGlvbnNGcm9tRW50aXR5VHlwZShlbnRpdHlUeXBlLCB0YWJsZVZpc3VhbGl6YXRpb24uY29sdW1ucywgY29udmVydGVyQ29udGV4dCksXG5cdFx0XHRhZ2dyZWdhdGlvbkhlbHBlciA9IG5ldyBBZ2dyZWdhdGlvbkhlbHBlcihlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHRcdGlmIChhZ2dyZWdhdGVzRGVmaW5pdGlvbnMpIHtcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5lbmFibGVBbmFseXRpY3MgPSB0cnVlO1xuXHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLmFnZ3JlZ2F0ZXMgPSBhZ2dyZWdhdGVzRGVmaW5pdGlvbnM7XG5cblx0XHRcdGNvbnN0IGFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMgPSBhZ2dyZWdhdGlvbkhlbHBlci5nZXRBbGxvd2VkVHJhbnNmb3JtYXRpb25zKCk7XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uZW5hYmxlQW5hbHl0aWNzU2VhcmNoID0gYWxsb3dlZFRyYW5zZm9ybWF0aW9ucyA/IGFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMuaW5kZXhPZihcInNlYXJjaFwiKSA+PSAwIDogdHJ1ZTtcblxuXHRcdFx0Ly8gQWRkIGdyb3VwIGFuZCBzb3J0IGNvbmRpdGlvbnMgZnJvbSB0aGUgcHJlc2VudGF0aW9uIHZhcmlhbnRcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5hbm5vdGF0aW9uLmdyb3VwQ29uZGl0aW9ucyA9IGdldEdyb3VwQ29uZGl0aW9ucyhcblx0XHRcdFx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24sXG5cdFx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5jb2x1bW5zLFxuXHRcdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC50eXBlXG5cdFx0XHQpO1xuXHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLmFubm90YXRpb24uYWdncmVnYXRlQ29uZGl0aW9ucyA9IGdldEFnZ3JlZ2F0ZUNvbmRpdGlvbnMoXG5cdFx0XHRcdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLFxuXHRcdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uY29sdW1uc1xuXHRcdFx0KTtcblx0XHR9XG5cblx0XHR0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC50eXBlID0gXCJHcmlkVGFibGVcIjsgLy8gQW5hbHl0aWNhbFRhYmxlIGlzbid0IGEgcmVhbCB0eXBlIGZvciB0aGUgTURDOlRhYmxlLCBzbyB3ZSBhbHdheXMgc3dpdGNoIGJhY2sgdG8gR3JpZFxuXHR9IGVsc2UgaWYgKHRhYmxlVmlzdWFsaXphdGlvbi5jb250cm9sLnR5cGUgPT09IFwiUmVzcG9uc2l2ZVRhYmxlXCIpIHtcblx0XHR0YWJsZVZpc3VhbGl6YXRpb24uYW5ub3RhdGlvbi5ncm91cENvbmRpdGlvbnMgPSBnZXRHcm91cENvbmRpdGlvbnMoXG5cdFx0XHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbixcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5jb2x1bW5zLFxuXHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLmNvbnRyb2wudHlwZVxuXHRcdCk7XG5cdH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIG5hdmlnYXRpb24gdGFyZ2V0IHBhdGggZnJvbSBtYW5pZmVzdCBzZXR0aW5ncy5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoIFRoZSBuYXZpZ2F0aW9uIHBhdGggdG8gY2hlY2sgaW4gdGhlIG1hbmlmZXN0IHNldHRpbmdzXG4gKiBAcmV0dXJucyBOYXZpZ2F0aW9uIHBhdGggZnJvbSBtYW5pZmVzdCBzZXR0aW5nc1xuICovXG5mdW5jdGlvbiBnZXROYXZpZ2F0aW9uVGFyZ2V0UGF0aChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LCBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0Y29uc3QgbWFuaWZlc3RXcmFwcGVyID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKTtcblx0aWYgKG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggJiYgbWFuaWZlc3RXcmFwcGVyLmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpKSB7XG5cdFx0Y29uc3QgbmF2Q29uZmlnID0gbWFuaWZlc3RXcmFwcGVyLmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHRcdGlmIChPYmplY3Qua2V5cyhuYXZDb25maWcpLmxlbmd0aCA+IDApIHtcblx0XHRcdHJldHVybiBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IGRhdGFNb2RlbFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0Y29uc3QgY29udGV4dFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCk7XG5cdGNvbnN0IG5hdkNvbmZpZ0ZvckNvbnRleHRQYXRoID0gbWFuaWZlc3RXcmFwcGVyLmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKGNvbnRleHRQYXRoKTtcblx0aWYgKG5hdkNvbmZpZ0ZvckNvbnRleHRQYXRoICYmIE9iamVjdC5rZXlzKG5hdkNvbmZpZ0ZvckNvbnRleHRQYXRoKS5sZW5ndGggPiAwKSB7XG5cdFx0cmV0dXJuIGNvbnRleHRQYXRoO1xuXHR9XG5cblx0cmV0dXJuIGRhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5U2V0ID8gZGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlTZXQubmFtZSA6IGRhdGFNb2RlbFBhdGguc3RhcnRpbmdFbnRpdHlTZXQubmFtZTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSAndW5pdCcgYW5kICd0ZXh0QXJyYW5nZW1lbnQnIHByb3BlcnRpZXMgaW4gY29sdW1ucyB3aGVuIG5lY2Vzc2FyeS5cbiAqXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgZW50aXR5IHR5cGUgZGlzcGxheWVkIGluIHRoZSB0YWJsZVxuICogQHBhcmFtIHRhYmxlQ29sdW1ucyBUaGUgY29sdW1ucyB0byBiZSB1cGRhdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzKGVudGl0eVR5cGU6IEVudGl0eVR5cGUsIHRhYmxlQ29sdW1uczogVGFibGVDb2x1bW5bXSkge1xuXHRmdW5jdGlvbiBmaW5kQ29sdW1uQnlQYXRoKHBhdGg6IHN0cmluZyk6IFRhYmxlQ29sdW1uIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGFibGVDb2x1bW5zLmZpbmQoKGNvbHVtbikgPT4ge1xuXHRcdFx0Y29uc3QgYW5ub3RhdGlvbkNvbHVtbiA9IGNvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0XHRyZXR1cm4gYW5ub3RhdGlvbkNvbHVtbi5wcm9wZXJ0eUluZm9zID09PSB1bmRlZmluZWQgJiYgYW5ub3RhdGlvbkNvbHVtbi5yZWxhdGl2ZVBhdGggPT09IHBhdGg7XG5cdFx0fSk7XG5cdH1cblxuXHR0YWJsZUNvbHVtbnMuZm9yRWFjaCgob0NvbHVtbikgPT4ge1xuXHRcdGNvbnN0IG9UYWJsZUNvbHVtbiA9IG9Db2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdGlmIChvVGFibGVDb2x1bW4ucHJvcGVydHlJbmZvcyA9PT0gdW5kZWZpbmVkICYmIG9UYWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGgpIHtcblx0XHRcdGNvbnN0IG9Qcm9wZXJ0eSA9IGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5maW5kKChvUHJvcDogUHJvcGVydHkpID0+IG9Qcm9wLm5hbWUgPT09IG9UYWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGgpO1xuXHRcdFx0aWYgKG9Qcm9wZXJ0eSkge1xuXHRcdFx0XHRjb25zdCBvVW5pdCA9IGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5KG9Qcm9wZXJ0eSkgfHwgZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eShvUHJvcGVydHkpO1xuXHRcdFx0XHRjb25zdCBvVGltZXpvbmUgPSBnZXRBc3NvY2lhdGVkVGltZXpvbmVQcm9wZXJ0eShvUHJvcGVydHkpO1xuXHRcdFx0XHRjb25zdCBzVGltZXpvbmUgPSBvUHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb24/LlRpbWV6b25lO1xuXHRcdFx0XHRpZiAob1VuaXQpIHtcblx0XHRcdFx0XHRjb25zdCBvVW5pdENvbHVtbiA9IGZpbmRDb2x1bW5CeVBhdGgob1VuaXQubmFtZSk7XG5cdFx0XHRcdFx0b1RhYmxlQ29sdW1uLnVuaXQgPSBvVW5pdENvbHVtbj8ubmFtZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCBzVW5pdCA9IG9Qcm9wZXJ0eT8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeSB8fCBvUHJvcGVydHk/LmFubm90YXRpb25zPy5NZWFzdXJlcz8uVW5pdDtcblx0XHRcdFx0XHRpZiAoc1VuaXQpIHtcblx0XHRcdFx0XHRcdG9UYWJsZUNvbHVtbi51bml0VGV4dCA9IGAke3NVbml0fWA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChvVGltZXpvbmUpIHtcblx0XHRcdFx0XHRjb25zdCBvVGltZXpvbmVDb2x1bW4gPSBmaW5kQ29sdW1uQnlQYXRoKG9UaW1lem9uZS5uYW1lKTtcblx0XHRcdFx0XHRvVGFibGVDb2x1bW4udGltZXpvbmUgPSBvVGltZXpvbmVDb2x1bW4/Lm5hbWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAoc1RpbWV6b25lKSB7XG5cdFx0XHRcdFx0b1RhYmxlQ29sdW1uLnRpbWV6b25lVGV4dCA9IHNUaW1lem9uZS50b1N0cmluZygpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgZGlzcGxheU1vZGUgPSBnZXREaXNwbGF5TW9kZShvUHJvcGVydHkpLFxuXHRcdFx0XHRcdHRleHRBbm5vdGF0aW9uID0gb1Byb3BlcnR5LmFubm90YXRpb25zLkNvbW1vbj8uVGV4dDtcblx0XHRcdFx0aWYgKGlzUGF0aEV4cHJlc3Npb24odGV4dEFubm90YXRpb24pICYmIGRpc3BsYXlNb2RlICE9PSBcIlZhbHVlXCIpIHtcblx0XHRcdFx0XHRjb25zdCBvVGV4dENvbHVtbiA9IGZpbmRDb2x1bW5CeVBhdGgodGV4dEFubm90YXRpb24ucGF0aCk7XG5cdFx0XHRcdFx0aWYgKG9UZXh0Q29sdW1uICYmIG9UZXh0Q29sdW1uLm5hbWUgIT09IG9UYWJsZUNvbHVtbi5uYW1lKSB7XG5cdFx0XHRcdFx0XHRvVGFibGVDb2x1bW4udGV4dEFycmFuZ2VtZW50ID0ge1xuXHRcdFx0XHRcdFx0XHR0ZXh0UHJvcGVydHk6IG9UZXh0Q29sdW1uLm5hbWUsXG5cdFx0XHRcdFx0XHRcdG1vZGU6IGRpc3BsYXlNb2RlXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59XG5cbmZ1bmN0aW9uIGdldFNlbWFudGljS2V5c0FuZFRpdGxlSW5mbyhjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KSB7XG5cdGNvbnN0IGhlYWRlckluZm9UaXRsZVBhdGggPSAoY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZSgpPy5hbm5vdGF0aW9ucz8uVUk/LkhlYWRlckluZm8/LlRpdGxlIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWVcblx0XHQ/LnBhdGg7XG5cdGNvbnN0IHNlbWFudGljS2V5QW5ub3RhdGlvbnM6IGFueVtdIHwgdW5kZWZpbmVkID0gY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZSgpPy5hbm5vdGF0aW9ucz8uQ29tbW9uPy5TZW1hbnRpY0tleTtcblxuXHRjb25zdCBzZW1hbnRpY0tleUNvbHVtbnM6IHN0cmluZ1tdID0gW107XG5cdGlmIChzZW1hbnRpY0tleUFubm90YXRpb25zKSB7XG5cdFx0c2VtYW50aWNLZXlBbm5vdGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvQ29sdW1uOiBhbnkpIHtcblx0XHRcdHNlbWFudGljS2V5Q29sdW1ucy5wdXNoKG9Db2x1bW4udmFsdWUpO1xuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIHsgaGVhZGVySW5mb1RpdGxlUGF0aCwgc2VtYW50aWNLZXlDb2x1bW5zIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUYWJsZVZpc3VhbGl6YXRpb24oXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPzogUHJlc2VudGF0aW9uVmFyaWFudFR5cGUsXG5cdGlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnQ/OiBib29sZWFuLFxuXHR2aWV3Q29uZmlndXJhdGlvbj86IFZpZXdQYXRoQ29uZmlndXJhdGlvblxuKTogVGFibGVWaXN1YWxpemF0aW9uIHtcblx0Y29uc3QgdGFibGVNYW5pZmVzdENvbmZpZyA9IGdldFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uKFxuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbixcblx0XHR2aXN1YWxpemF0aW9uUGF0aCxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdGlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnRcblx0KTtcblx0Y29uc3QgeyBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoIH0gPSBzcGxpdFBhdGgodmlzdWFsaXphdGlvblBhdGgpO1xuXHRjb25zdCBuYXZpZ2F0aW9uVGFyZ2V0UGF0aCA9IGdldE5hdmlnYXRpb25UYXJnZXRQYXRoKGNvbnZlcnRlckNvbnRleHQsIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHRjb25zdCBuYXZpZ2F0aW9uU2V0dGluZ3MgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKG5hdmlnYXRpb25UYXJnZXRQYXRoKTtcblx0Y29uc3QgY29sdW1ucyA9IGdldFRhYmxlQ29sdW1ucyhsaW5lSXRlbUFubm90YXRpb24sIHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCBuYXZpZ2F0aW9uU2V0dGluZ3MpO1xuXHRjb25zdCBvcGVyYXRpb25BdmFpbGFibGVNYXAgPSBnZXRPcGVyYXRpb25BdmFpbGFibGVNYXAobGluZUl0ZW1Bbm5vdGF0aW9uLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3Qgc2VtYW50aWNLZXlzQW5kSGVhZGVySW5mb1RpdGxlID0gZ2V0U2VtYW50aWNLZXlzQW5kVGl0bGVJbmZvKGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCB0YWJsZUFjdGlvbnMgPSBnZXRUYWJsZUFjdGlvbnMobGluZUl0ZW1Bbm5vdGF0aW9uLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCwgbmF2aWdhdGlvblNldHRpbmdzKTtcblx0Y29uc3Qgb1Zpc3VhbGl6YXRpb246IFRhYmxlVmlzdWFsaXphdGlvbiA9IHtcblx0XHR0eXBlOiBWaXN1YWxpemF0aW9uVHlwZS5UYWJsZSxcblx0XHRhbm5vdGF0aW9uOiBnZXRUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uKFxuXHRcdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdFx0dmlzdWFsaXphdGlvblBhdGgsXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0dGFibGVNYW5pZmVzdENvbmZpZyxcblx0XHRcdGNvbHVtbnMsXG5cdFx0XHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbixcblx0XHRcdHZpZXdDb25maWd1cmF0aW9uXG5cdFx0KSxcblx0XHRjb250cm9sOiB0YWJsZU1hbmlmZXN0Q29uZmlnLFxuXHRcdGFjdGlvbnM6IHJlbW92ZUR1cGxpY2F0ZUFjdGlvbnModGFibGVBY3Rpb25zLmFjdGlvbnMpLFxuXHRcdGNvbW1hbmRBY3Rpb25zOiB0YWJsZUFjdGlvbnMuY29tbWFuZEFjdGlvbnMsXG5cdFx0Y29sdW1uczogY29sdW1ucyxcblx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA6IEpTT04uc3RyaW5naWZ5KG9wZXJhdGlvbkF2YWlsYWJsZU1hcCksXG5cdFx0b3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllczogZ2V0T3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllcyhvcGVyYXRpb25BdmFpbGFibGVNYXAsIGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdGhlYWRlckluZm9UaXRsZTogc2VtYW50aWNLZXlzQW5kSGVhZGVySW5mb1RpdGxlLmhlYWRlckluZm9UaXRsZVBhdGgsXG5cdFx0c2VtYW50aWNLZXlzOiBzZW1hbnRpY0tleXNBbmRIZWFkZXJJbmZvVGl0bGUuc2VtYW50aWNLZXlDb2x1bW5zXG5cdH07XG5cblx0dXBkYXRlTGlua2VkUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKGxpbmVJdGVtQW5ub3RhdGlvbiksIGNvbHVtbnMpO1xuXHR1cGRhdGVUYWJsZVZpc3VhbGl6YXRpb25Gb3JBbmFseXRpY3MoXG5cdFx0b1Zpc3VhbGl6YXRpb24sXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZShsaW5lSXRlbUFubm90YXRpb24pLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb25cblx0KTtcblxuXHRyZXR1cm4gb1Zpc3VhbGl6YXRpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0VGFibGVWaXN1YWxpemF0aW9uKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBUYWJsZVZpc3VhbGl6YXRpb24ge1xuXHRjb25zdCB0YWJsZU1hbmlmZXN0Q29uZmlnID0gZ2V0VGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24odW5kZWZpbmVkLCBcIlwiLCBjb252ZXJ0ZXJDb250ZXh0LCBmYWxzZSk7XG5cdGNvbnN0IGNvbHVtbnMgPSBnZXRDb2x1bW5zRnJvbUVudGl0eVR5cGUoe30sIGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpLCBbXSwgW10sIGNvbnZlcnRlckNvbnRleHQsIHRhYmxlTWFuaWZlc3RDb25maWcudHlwZSk7XG5cdGNvbnN0IG9wZXJhdGlvbkF2YWlsYWJsZU1hcCA9IGdldE9wZXJhdGlvbkF2YWlsYWJsZU1hcCh1bmRlZmluZWQsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBzZW1hbnRpY0tleXNBbmRIZWFkZXJJbmZvVGl0bGUgPSBnZXRTZW1hbnRpY0tleXNBbmRUaXRsZUluZm8oY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IG9WaXN1YWxpemF0aW9uOiBUYWJsZVZpc3VhbGl6YXRpb24gPSB7XG5cdFx0dHlwZTogVmlzdWFsaXphdGlvblR5cGUuVGFibGUsXG5cdFx0YW5ub3RhdGlvbjogZ2V0VGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbih1bmRlZmluZWQsIFwiXCIsIGNvbnZlcnRlckNvbnRleHQsIHRhYmxlTWFuaWZlc3RDb25maWcsIGNvbHVtbnMpLFxuXHRcdGNvbnRyb2w6IHRhYmxlTWFuaWZlc3RDb25maWcsXG5cdFx0YWN0aW9uczogW10sXG5cdFx0Y29sdW1uczogY29sdW1ucyxcblx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA6IEpTT04uc3RyaW5naWZ5KG9wZXJhdGlvbkF2YWlsYWJsZU1hcCksXG5cdFx0b3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllczogZ2V0T3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllcyhvcGVyYXRpb25BdmFpbGFibGVNYXAsIGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdGhlYWRlckluZm9UaXRsZTogc2VtYW50aWNLZXlzQW5kSGVhZGVySW5mb1RpdGxlLmhlYWRlckluZm9UaXRsZVBhdGgsXG5cdFx0c2VtYW50aWNLZXlzOiBzZW1hbnRpY0tleXNBbmRIZWFkZXJJbmZvVGl0bGUuc2VtYW50aWNLZXlDb2x1bW5zXG5cdH07XG5cblx0dXBkYXRlTGlua2VkUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKSwgY29sdW1ucyk7XG5cdHVwZGF0ZVRhYmxlVmlzdWFsaXphdGlvbkZvckFuYWx5dGljcyhvVmlzdWFsaXphdGlvbiwgY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCksIGNvbnZlcnRlckNvbnRleHQpO1xuXG5cdHJldHVybiBvVmlzdWFsaXphdGlvbjtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBtYXAgb2YgQ29yZS5PcGVyYXRpb25BdmFpbGFibGUgcHJvcGVydHkgcGF0aHMgZm9yIGFsbCBEYXRhRmllbGRGb3JBY3Rpb25zLlxuICpcbiAqIEBwYXJhbSBsaW5lSXRlbUFubm90YXRpb24gVGhlIGluc3RhbmNlIG9mIHRoZSBsaW5lIGl0ZW1cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSByZWNvcmQgY29udGFpbmluZyBhbGwgYWN0aW9uIG5hbWVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIENvcmUuT3BlcmF0aW9uQXZhaWxhYmxlIHByb3BlcnR5IHBhdGhzXG4gKi9cbmZ1bmN0aW9uIGdldE9wZXJhdGlvbkF2YWlsYWJsZU1hcChsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLCBjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG5cdHJldHVybiBBY3Rpb25IZWxwZXIuZ2V0T3BlcmF0aW9uQXZhaWxhYmxlTWFwKGxpbmVJdGVtQW5ub3RhdGlvbiwgXCJ0YWJsZVwiLCBjb252ZXJ0ZXJDb250ZXh0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHVwZGF0YWJsZSBwcm9wZXJ0eVBhdGggZm9yIHRoZSBjdXJyZW50IGVudGl0eXNldCBpZiB2YWxpZC5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgdXBkYXRhYmxlIHByb3BlcnR5IGZvciB0aGUgcm93c1xuICovXG5mdW5jdGlvbiBnZXRDdXJyZW50RW50aXR5U2V0VXBkYXRhYmxlUGF0aChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogc3RyaW5nIHtcblx0Y29uc3QgcmVzdHJpY3Rpb25zID0gZ2V0UmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBlbnRpdHlTZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpO1xuXHRjb25zdCB1cGRhdGFibGUgPSByZXN0cmljdGlvbnMuaXNVcGRhdGFibGU7XG5cdGNvbnN0IGlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHk6IGFueSA9ICFpc0NvbnN0YW50KHVwZGF0YWJsZS5leHByZXNzaW9uKSAmJiB1cGRhdGFibGUubmF2aWdhdGlvbkV4cHJlc3Npb24uX3R5cGUgPT09IFwiVW5yZXNvbHZhYmxlXCI7XG5cdGNvbnN0IHVwZGF0YWJsZVByb3BlcnR5UGF0aCA9IChlbnRpdHlTZXQ/LmFubm90YXRpb25zLkNhcGFiaWxpdGllcz8uVXBkYXRlUmVzdHJpY3Rpb25zPy5VcGRhdGFibGUgYXMgYW55KT8ucGF0aDtcblxuXHRyZXR1cm4gaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eSA/ICh1cGRhdGFibGVQcm9wZXJ0eVBhdGggYXMgc3RyaW5nKSA6IFwiXCI7XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIHJldHJpZXZlIGFsbCBwcm9wZXJ0eSBwYXRocyBhc3NpZ25lZCB0byB0aGUgQ29yZS5PcGVyYXRpb25BdmFpbGFibGUgYW5ub3RhdGlvbi5cbiAqXG4gKiBAcGFyYW0gb3BlcmF0aW9uQXZhaWxhYmxlTWFwIFRoZSByZWNvcmQgY29uc2lzdGluZyBvZiBhY3Rpb25zIGFuZCB0aGVpciBDb3JlLk9wZXJhdGlvbkF2YWlsYWJsZSBwcm9wZXJ0eSBwYXRoc1xuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgVGhlIENTViBzdHJpbmcgb2YgYWxsIHByb3BlcnR5IHBhdGhzIGFzc29jaWF0ZWQgd2l0aCB0aGUgQ29yZS5PcGVyYXRpb25BdmFpbGFibGUgYW5ub3RhdGlvblxuICovXG5mdW5jdGlvbiBnZXRPcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzKG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogUmVjb3JkPHN0cmluZywgYW55PiwgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IHN0cmluZyB7XG5cdGNvbnN0IHByb3BlcnRpZXMgPSBuZXcgU2V0KCk7XG5cblx0Zm9yIChjb25zdCBhY3Rpb25OYW1lIGluIG9wZXJhdGlvbkF2YWlsYWJsZU1hcCkge1xuXHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IG9wZXJhdGlvbkF2YWlsYWJsZU1hcFthY3Rpb25OYW1lXTtcblx0XHRpZiAocHJvcGVydHlOYW1lID09PSBudWxsKSB7XG5cdFx0XHQvLyBBbm5vdGF0aW9uIGNvbmZpZ3VyZWQgd2l0aCBleHBsaWNpdCAnbnVsbCcgKGFjdGlvbiBhZHZlcnRpc2VtZW50IHJlbGV2YW50KVxuXHRcdFx0cHJvcGVydGllcy5hZGQoYWN0aW9uTmFtZSk7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgcHJvcGVydHlOYW1lID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHQvLyBBZGQgcHJvcGVydHkgcGF0aHMgYW5kIG5vdCBDb25zdGFudCB2YWx1ZXMuXG5cdFx0XHRwcm9wZXJ0aWVzLmFkZChwcm9wZXJ0eU5hbWUpO1xuXHRcdH1cblx0fVxuXG5cdGlmIChwcm9wZXJ0aWVzLnNpemUpIHtcblx0XHQvLyBTb21lIGFjdGlvbnMgaGF2ZSBhbiBvcGVyYXRpb24gYXZhaWxhYmxlIGJhc2VkIG9uIHByb3BlcnR5IC0tPiB3ZSBuZWVkIHRvIGxvYWQgdGhlIEhlYWRlckluZm8uVGl0bGUgcHJvcGVydHlcblx0XHQvLyBzbyB0aGF0IHRoZSBkaWFsb2cgb24gcGFydGlhbCBhY3Rpb25zIGlzIGRpc3BsYXllZCBwcm9wZXJseSAoQkNQIDIxODAyNzE0MjUpXG5cdFx0Y29uc3QgZW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpO1xuXHRcdGNvbnN0IHRpdGxlUHJvcGVydHkgPSAoZW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uVUk/LkhlYWRlckluZm8/LlRpdGxlIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWU/LnBhdGg7XG5cdFx0aWYgKHRpdGxlUHJvcGVydHkpIHtcblx0XHRcdHByb3BlcnRpZXMuYWRkKHRpdGxlUHJvcGVydHkpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBBcnJheS5mcm9tKHByb3BlcnRpZXMpLmpvaW4oXCIsXCIpO1xufVxuXG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgdGhlIERhdGFGaWVsZEZvckFjdGlvbiBhbmQgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIG9mIGEgbGluZSBpdGVtIGFuZFxuICogcmV0dXJucyBhbGwgdGhlIFVJLkhpZGRlbiBhbm5vdGF0aW9uIGV4cHJlc3Npb25zLlxuICpcbiAqIEBwYXJhbSBsaW5lSXRlbUFubm90YXRpb24gQ29sbGVjdGlvbiBvZiBkYXRhIGZpZWxkcyB1c2VkIGZvciByZXByZXNlbnRhdGlvbiBpbiBhIHRhYmxlIG9yIGxpc3RcbiAqIEBwYXJhbSBjdXJyZW50RW50aXR5VHlwZSBDdXJyZW50IGVudGl0eSB0eXBlXG4gKiBAcGFyYW0gY29udGV4dERhdGFNb2RlbE9iamVjdFBhdGggT2JqZWN0IHBhdGggb2YgdGhlIGRhdGEgbW9kZWxcbiAqIEBwYXJhbSBpc0VudGl0eVNldFxuICogQHJldHVybnMgQWxsIHRoZSBgVUkuSGlkZGVuYCBwYXRoIGV4cHJlc3Npb25zIGZvdW5kIGluIHRoZSByZWxldmFudCBhY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIGdldFVJSGlkZGVuRXhwRm9yQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sXG5cdGN1cnJlbnRFbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRjb250ZXh0RGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0aXNFbnRpdHlTZXQ6IGJvb2xlYW5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPltdIHtcblx0Y29uc3QgYVVpSGlkZGVuUGF0aEV4cHJlc3Npb25zOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IFtdO1xuXHRsaW5lSXRlbUFubm90YXRpb24uZm9yRWFjaCgoZGF0YUZpZWxkKSA9PiB7XG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIGxpbmVJdGVtIGNvbnRleHQgaXMgdGhlIHNhbWUgYXMgdGhhdCBvZiB0aGUgYWN0aW9uOlxuXHRcdGlmIChcblx0XHRcdChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbiAmJlxuXHRcdFx0XHRkYXRhRmllbGQ/LkFjdGlvblRhcmdldD8uaXNCb3VuZCAmJlxuXHRcdFx0XHRjdXJyZW50RW50aXR5VHlwZSA9PT0gZGF0YUZpZWxkPy5BY3Rpb25UYXJnZXQuc291cmNlRW50aXR5VHlwZSkgfHxcblx0XHRcdChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiAmJlxuXHRcdFx0XHRkYXRhRmllbGQuUmVxdWlyZXNDb250ZXh0ICYmXG5cdFx0XHRcdGRhdGFGaWVsZD8uSW5saW5lPy52YWx1ZU9mKCkgIT09IHRydWUpXG5cdFx0KSB7XG5cdFx0XHRpZiAodHlwZW9mIGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbj8udmFsdWVPZigpID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdGFVaUhpZGRlblBhdGhFeHByZXNzaW9ucy5wdXNoKGVxdWFsKGdldEJpbmRpbmdFeHBGcm9tQ29udGV4dChkYXRhRmllbGQsIGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoLCBpc0VudGl0eVNldCksIGZhbHNlKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGFVaUhpZGRlblBhdGhFeHByZXNzaW9ucztcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgY29udGV4dCBjdXJyZW50bHkgcmVmZXJlbmNlZCBieSB0aGlzIGJpbmRpbmcgYnkgcmVtb3ZpbmcgdGhlIGxhc3QgbmF2aWdhdGlvbiBwcm9wZXJ0eS5cbiAqXG4gKiBJdCBpcyB1c2VkIChzcGVjaWZpY2FsbHkgaW4gdGhpcyBjYXNlKSwgdG8gdHJhbnNmb3JtIGEgYmluZGluZyBtYWRlIGZvciBhIE5hdlByb3AgY29udGV4dCAvTWFpbk9iamVjdC9OYXZQcm9wMS9OYXZQcm9wMixcbiAqIGludG8gYSBiaW5kaW5nIG9uIHRoZSBwcmV2aW91cyBjb250ZXh0IC9NYWluT2JqZWN0L05hdlByb3AxLlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgRGF0YUZpZWxkRm9yQWN0aW9uIHwgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIHwgQ3VzdG9tQWN0aW9uXG4gKiBAcGFyYW0gY29udGV4dERhdGFNb2RlbE9iamVjdFBhdGggRGF0YU1vZGVsT2JqZWN0UGF0aFxuICogQHBhcmFtIGlzRW50aXR5U2V0XG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uXG4gKi9cbmZ1bmN0aW9uIGdldEJpbmRpbmdFeHBGcm9tQ29udGV4dChcblx0c291cmNlOiBEYXRhRmllbGRGb3JBY3Rpb24gfCBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gfCBDdXN0b21BY3Rpb24sXG5cdGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRpc0VudGl0eVNldDogYm9vbGVhblxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGFueT4ge1xuXHRsZXQgc0V4cHJlc3Npb246IGFueSB8IHVuZGVmaW5lZDtcblx0aWYgKFxuXHRcdChzb3VyY2UgYXMgRGF0YUZpZWxkRm9yQWN0aW9uKT8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbiB8fFxuXHRcdChzb3VyY2UgYXMgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uKT8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvblxuXHQpIHtcblx0XHRzRXhwcmVzc2lvbiA9IChzb3VyY2UgYXMgRGF0YUZpZWxkRm9yQWN0aW9uIHwgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uKT8uYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW47XG5cdH0gZWxzZSB7XG5cdFx0c0V4cHJlc3Npb24gPSAoc291cmNlIGFzIEN1c3RvbUFjdGlvbik/LnZpc2libGU7XG5cdH1cblx0bGV0IHNQYXRoOiBzdHJpbmc7XG5cdGlmIChzRXhwcmVzc2lvbj8ucGF0aCkge1xuXHRcdHNQYXRoID0gc0V4cHJlc3Npb24ucGF0aDtcblx0fSBlbHNlIHtcblx0XHRzUGF0aCA9IHNFeHByZXNzaW9uO1xuXHR9XG5cdGlmIChzUGF0aCkge1xuXHRcdGlmICgoc291cmNlIGFzIEN1c3RvbUFjdGlvbik/LnZpc2libGUpIHtcblx0XHRcdHNQYXRoID0gc1BhdGguc3Vic3RyaW5nKDEsIHNQYXRoLmxlbmd0aCAtIDEpO1xuXHRcdH1cblx0XHRpZiAoc1BhdGguaW5kZXhPZihcIi9cIikgPiAwKSB7XG5cdFx0XHQvL2NoZWNrIGlmIHRoZSBuYXZpZ2F0aW9uIHByb3BlcnR5IGlzIGNvcnJlY3Q6XG5cdFx0XHRjb25zdCBhU3BsaXRQYXRoID0gc1BhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0Y29uc3Qgc05hdmlnYXRpb25QYXRoID0gYVNwbGl0UGF0aFswXTtcblx0XHRcdGlmIChcblx0XHRcdFx0Y29udGV4dERhdGFNb2RlbE9iamVjdFBhdGg/LnRhcmdldE9iamVjdD8uX3R5cGUgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiZcblx0XHRcdFx0Y29udGV4dERhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0LnBhcnRuZXIgPT09IHNOYXZpZ2F0aW9uUGF0aFxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiBwYXRoSW5Nb2RlbChhU3BsaXRQYXRoLnNsaWNlKDEpLmpvaW4oXCIvXCIpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBjb25zdGFudCh0cnVlKTtcblx0XHRcdH1cblx0XHRcdC8vIEluIGNhc2UgdGhlcmUgaXMgbm8gbmF2aWdhdGlvbiBwcm9wZXJ0eSwgaWYgaXQncyBhbiBlbnRpdHlTZXQsIHRoZSBleHByZXNzaW9uIGJpbmRpbmcgaGFzIHRvIGJlIHJldHVybmVkOlxuXHRcdH0gZWxzZSBpZiAoaXNFbnRpdHlTZXQpIHtcblx0XHRcdHJldHVybiBwYXRoSW5Nb2RlbChzUGF0aCk7XG5cdFx0XHQvLyBvdGhlcndpc2UgdGhlIGV4cHJlc3Npb24gYmluZGluZyBjYW5ub3QgYmUgdGFrZW4gaW50byBhY2NvdW50IGZvciB0aGUgc2VsZWN0aW9uIG1vZGUgZXZhbHVhdGlvbjpcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGNvbnN0YW50KHRydWUpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gY29uc3RhbnQodHJ1ZSk7XG59XG5cbi8qKlxuICogTG9vcCB0aHJvdWdoIHRoZSBEYXRhRmllbGRGb3JBY3Rpb24gYW5kIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiBvZiBhIGxpbmUgaXRlbSBhbmQgY2hlY2tcbiAqIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGVtIGlzIGFsd2F5cyB2aXNpYmxlIGluIHRoZSB0YWJsZSB0b29sYmFyIChhbmQgcmVxdWlyZXMgYSBjb250ZXh0KS5cbiAqXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgZm9yIHJlcHJlc2VudGF0aW9uIGluIGEgdGFibGUgb3IgbGlzdFxuICogQHBhcmFtIGN1cnJlbnRFbnRpdHlUeXBlIEN1cnJlbnQgRW50aXR5IFR5cGVcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGVyZSBpcyBhdCBsZWFzdCAxIGFjdGlvbiB0aGF0IG1lZXRzIHRoZSBjcml0ZXJpYVxuICovXG5mdW5jdGlvbiBoYXNCb3VuZEFjdGlvbnNBbHdheXNWaXNpYmxlSW5Ub29sQmFyKGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sIGN1cnJlbnRFbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogYm9vbGVhbiB7XG5cdHJldHVybiBsaW5lSXRlbUFubm90YXRpb24uc29tZSgoZGF0YUZpZWxkKSA9PiB7XG5cdFx0aWYgKFxuXHRcdFx0KGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uIHx8XG5cdFx0XHRcdGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uKSAmJlxuXHRcdFx0ZGF0YUZpZWxkPy5JbmxpbmU/LnZhbHVlT2YoKSAhPT0gdHJ1ZSAmJlxuXHRcdFx0KGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbj8udmFsdWVPZigpID09PSBmYWxzZSB8fCBkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSA9PT0gdW5kZWZpbmVkKVxuXHRcdCkge1xuXHRcdFx0aWYgKGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uKSB7XG5cdFx0XHRcdC8vIENoZWNrIGlmIHRoZSBsaW5lSXRlbSBjb250ZXh0IGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgdGhlIGFjdGlvbjpcblx0XHRcdFx0cmV0dXJuIGRhdGFGaWVsZD8uQWN0aW9uVGFyZ2V0Py5pc0JvdW5kICYmIGN1cnJlbnRFbnRpdHlUeXBlID09PSBkYXRhRmllbGQ/LkFjdGlvblRhcmdldC5zb3VyY2VFbnRpdHlUeXBlO1xuXHRcdFx0fSBlbHNlIGlmIChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0XHRyZXR1cm4gZGF0YUZpZWxkLlJlcXVpcmVzQ29udGV4dDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gaGFzQ3VzdG9tQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIobWFuaWZlc3RBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BY3Rpb24+KTogYm9vbGVhbiB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYW5pZmVzdEFjdGlvbnMpLnNvbWUoKGFjdGlvbktleSkgPT4ge1xuXHRcdGNvbnN0IGFjdGlvbiA9IG1hbmlmZXN0QWN0aW9uc1thY3Rpb25LZXldO1xuXHRcdGlmIChhY3Rpb24ucmVxdWlyZXNTZWxlY3Rpb24gJiYgYWN0aW9uLnZpc2libGU/LnRvU3RyaW5nKCkgPT09IFwidHJ1ZVwiKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9KTtcbn1cblxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIHRoZSBjdXN0b20gYWN0aW9ucyAod2l0aCBrZXkgcmVxdWlyZXNTZWxlY3Rpb24pIGRlY2xhcmVkIGluIHRoZSBtYW5pZmVzdCBmb3IgdGhlIGN1cnJlbnQgbGluZSBpdGVtIGFuZCByZXR1cm5zIGFsbCB0aGVcbiAqIHZpc2libGUga2V5IHZhbHVlcyBhcyBhbiBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBtYW5pZmVzdEFjdGlvbnMgVGhlIGFjdGlvbnMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3RcbiAqIEByZXR1cm5zIEFycmF5PEV4cHJlc3Npb248Ym9vbGVhbj4+IEFsbCB0aGUgdmlzaWJsZSBwYXRoIGV4cHJlc3Npb25zIG9mIHRoZSBhY3Rpb25zIHRoYXQgbWVldCB0aGUgY3JpdGVyaWFcbiAqL1xuZnVuY3Rpb24gZ2V0VmlzaWJsZUV4cEZvckN1c3RvbUFjdGlvbnNSZXF1aXJpbmdDb250ZXh0KG1hbmlmZXN0QWN0aW9uczogUmVjb3JkPHN0cmluZywgQ3VzdG9tQWN0aW9uPik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPltdIHtcblx0Y29uc3QgYVZpc2libGVQYXRoRXhwcmVzc2lvbnM6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPltdID0gW107XG5cdGlmIChtYW5pZmVzdEFjdGlvbnMpIHtcblx0XHRPYmplY3Qua2V5cyhtYW5pZmVzdEFjdGlvbnMpLmZvckVhY2goKGFjdGlvbktleSkgPT4ge1xuXHRcdFx0Y29uc3QgYWN0aW9uID0gbWFuaWZlc3RBY3Rpb25zW2FjdGlvbktleV07XG5cdFx0XHRpZiAoYWN0aW9uLnJlcXVpcmVzU2VsZWN0aW9uID09PSB0cnVlICYmIGFjdGlvbi52aXNpYmxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0aWYgKHR5cGVvZiBhY3Rpb24udmlzaWJsZSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdC8qVGhlIGZpbmFsIGFpbSB3b3VsZCBiZSB0byBjaGVjayBpZiB0aGUgcGF0aCBleHByZXNzaW9uIGRlcGVuZHMgb24gdGhlIHBhcmVudCBjb250ZXh0XG5cdFx0XHRcdFx0YW5kIGNvbnNpZGVycyBvbmx5IHRob3NlIGV4cHJlc3Npb25zIGZvciB0aGUgZXhwcmVzc2lvbiBldmFsdWF0aW9uLFxuXHRcdFx0XHRcdGJ1dCBjdXJyZW50bHkgbm90IHBvc3NpYmxlIGZyb20gdGhlIG1hbmlmZXN0IGFzIHRoZSB2aXNpYmxlIGtleSBpcyBib3VuZCBvbiB0aGUgcGFyZW50IGVudGl0eS5cblx0XHRcdFx0XHRUcmlja3kgdG8gZGlmZmVyZW50aWF0ZSB0aGUgcGF0aCBhcyBpdCdzIGRvbmUgZm9yIHRoZSBIaWRkZW4gYW5ub3RhdGlvbi5cblx0XHRcdFx0XHRGb3IgdGhlIHRpbWUgYmVpbmcgd2UgY29uc2lkZXIgYWxsIHRoZSBwYXRocyBvZiB0aGUgbWFuaWZlc3QqL1xuXG5cdFx0XHRcdFx0YVZpc2libGVQYXRoRXhwcmVzc2lvbnMucHVzaChyZXNvbHZlQmluZGluZ1N0cmluZyhhY3Rpb24/LnZpc2libGU/LnZhbHVlT2YoKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIGFWaXNpYmxlUGF0aEV4cHJlc3Npb25zO1xufVxuXG4vKipcbiAqIEV2YWx1YXRlIGlmIHRoZSBwYXRoIGlzIHN0YXRpY2FsbHkgZGVsZXRhYmxlIG9yIHVwZGF0YWJsZS5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMgVGhlIHRhYmxlIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FwYWJpbGl0eVJlc3RyaWN0aW9uKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBUYWJsZUNhcGFiaWxpdHlSZXN0cmljdGlvbiB7XG5cdGNvbnN0IGlzRGVsZXRhYmxlID0gaXNQYXRoRGVsZXRhYmxlKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKTtcblx0Y29uc3QgaXNVcGRhdGFibGUgPSBpc1BhdGhVcGRhdGFibGUoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkpO1xuXHRyZXR1cm4ge1xuXHRcdGlzRGVsZXRhYmxlOiAhKGlzQ29uc3RhbnQoaXNEZWxldGFibGUpICYmIGlzRGVsZXRhYmxlLnZhbHVlID09PSBmYWxzZSksXG5cdFx0aXNVcGRhdGFibGU6ICEoaXNDb25zdGFudChpc1VwZGF0YWJsZSkgJiYgaXNVcGRhdGFibGUudmFsdWUgPT09IGZhbHNlKVxuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VsZWN0aW9uTW9kZShcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0aXNFbnRpdHlTZXQ6IGJvb2xlYW4sXG5cdHRhcmdldENhcGFiaWxpdGllczogVGFibGVDYXBhYmlsaXR5UmVzdHJpY3Rpb24sXG5cdGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uPzogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+LFxuXHRtYXNzRWRpdFZpc2liaWxpdHlFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBjb25zdGFudChmYWxzZSlcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmICghbGluZUl0ZW1Bbm5vdGF0aW9uKSB7XG5cdFx0cmV0dXJuIFNlbGVjdGlvbk1vZGUuTm9uZTtcblx0fVxuXHRjb25zdCB0YWJsZU1hbmlmZXN0U2V0dGluZ3MgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpO1xuXHRsZXQgc2VsZWN0aW9uTW9kZSA9IHRhYmxlTWFuaWZlc3RTZXR0aW5ncy50YWJsZVNldHRpbmdzPy5zZWxlY3Rpb25Nb2RlO1xuXHRsZXQgYUhpZGRlbkJpbmRpbmdFeHByZXNzaW9uczogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+W10gPSBbXSxcblx0XHRhVmlzaWJsZUJpbmRpbmdFeHByZXNzaW9uczogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+W10gPSBbXTtcblx0Y29uc3QgbWFuaWZlc3RBY3Rpb25zID0gZ2V0QWN0aW9uc0Zyb21NYW5pZmVzdChcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpLmFjdGlvbnMsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRbXSxcblx0XHR1bmRlZmluZWQsXG5cdFx0ZmFsc2Vcblx0KTtcblx0bGV0IGlzUGFyZW50RGVsZXRhYmxlLCBwYXJlbnRFbnRpdHlTZXREZWxldGFibGU7XG5cdGlmIChjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuT2JqZWN0UGFnZSkge1xuXHRcdGlzUGFyZW50RGVsZXRhYmxlID0gaXNQYXRoRGVsZXRhYmxlKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKTtcblx0XHRwYXJlbnRFbnRpdHlTZXREZWxldGFibGUgPSBpc1BhcmVudERlbGV0YWJsZSA/IGNvbXBpbGVFeHByZXNzaW9uKGlzUGFyZW50RGVsZXRhYmxlLCB0cnVlKSA6IGlzUGFyZW50RGVsZXRhYmxlO1xuXHR9XG5cblx0Y29uc3QgYk1hc3NFZGl0RW5hYmxlZDogYm9vbGVhbiA9ICFpc0NvbnN0YW50KG1hc3NFZGl0VmlzaWJpbGl0eUV4cHJlc3Npb24pIHx8IG1hc3NFZGl0VmlzaWJpbGl0eUV4cHJlc3Npb24udmFsdWUgIT09IGZhbHNlO1xuXHRpZiAoc2VsZWN0aW9uTW9kZSAmJiBzZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLk5vbmUgJiYgZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24pIHtcblx0XHRpZiAoY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLk9iamVjdFBhZ2UgJiYgYk1hc3NFZGl0RW5hYmxlZCkge1xuXHRcdFx0Ly8gTWFzcyBFZGl0IGluIE9QIGlzIGVuYWJsZWQgb25seSBpbiBlZGl0IG1vZGUuXG5cdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oXG5cdFx0XHRcdGlmRWxzZShcblx0XHRcdFx0XHRhbmQoVUkuSXNFZGl0YWJsZSwgbWFzc0VkaXRWaXNpYmlsaXR5RXhwcmVzc2lvbiksXG5cdFx0XHRcdFx0Y29uc3RhbnQoXCJNdWx0aVwiKSxcblx0XHRcdFx0XHRpZkVsc2UoZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24sIGNvbnN0YW50KFwiTXVsdGlcIiksIGNvbnN0YW50KFwiTm9uZVwiKSlcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKGJNYXNzRWRpdEVuYWJsZWQpIHtcblx0XHRcdHJldHVybiBTZWxlY3Rpb25Nb2RlLk11bHRpO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihpZkVsc2UoZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24sIGNvbnN0YW50KFwiTXVsdGlcIiksIGNvbnN0YW50KFwiTm9uZVwiKSkpO1xuXHR9XG5cdGlmICghc2VsZWN0aW9uTW9kZSB8fCBzZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLkF1dG8pIHtcblx0XHRzZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZS5NdWx0aTtcblx0fVxuXHRpZiAoYk1hc3NFZGl0RW5hYmxlZCkge1xuXHRcdC8vIE92ZXJyaWRlIGRlZmF1bHQgc2VsZWN0aW9uIG1vZGUgd2hlbiBtYXNzIGVkaXQgaXMgdmlzaWJsZVxuXHRcdHNlbGVjdGlvbk1vZGUgPSBzZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLlNpbmdsZSA/IFNlbGVjdGlvbk1vZGUuU2luZ2xlIDogU2VsZWN0aW9uTW9kZS5NdWx0aTtcblx0fVxuXG5cdGlmIChcblx0XHRoYXNCb3VuZEFjdGlvbnNBbHdheXNWaXNpYmxlSW5Ub29sQmFyKGxpbmVJdGVtQW5ub3RhdGlvbiwgY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCkpIHx8XG5cdFx0aGFzQ3VzdG9tQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIobWFuaWZlc3RBY3Rpb25zLmFjdGlvbnMpXG5cdCkge1xuXHRcdHJldHVybiBzZWxlY3Rpb25Nb2RlO1xuXHR9XG5cdGFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMgPSBnZXRVSUhpZGRlbkV4cEZvckFjdGlvbnNSZXF1aXJpbmdDb250ZXh0KFxuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbixcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKSxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSxcblx0XHRpc0VudGl0eVNldFxuXHQpO1xuXHRhVmlzaWJsZUJpbmRpbmdFeHByZXNzaW9ucyA9IGdldFZpc2libGVFeHBGb3JDdXN0b21BY3Rpb25zUmVxdWlyaW5nQ29udGV4dChtYW5pZmVzdEFjdGlvbnMuYWN0aW9ucyk7XG5cblx0Ly8gTm8gYWN0aW9uIHJlcXVpcmluZyBhIGNvbnRleHQ6XG5cdGlmIChcblx0XHRhSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zLmxlbmd0aCA9PT0gMCAmJlxuXHRcdGFWaXNpYmxlQmluZGluZ0V4cHJlc3Npb25zLmxlbmd0aCA9PT0gMCAmJlxuXHRcdChkZWxldGVCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiB8fCBiTWFzc0VkaXRFbmFibGVkKVxuXHQpIHtcblx0XHRpZiAoIWlzRW50aXR5U2V0KSB7XG5cdFx0XHQvLyBFeGFtcGxlOiBPUCBjYXNlXG5cdFx0XHRpZiAodGFyZ2V0Q2FwYWJpbGl0aWVzLmlzRGVsZXRhYmxlIHx8IHBhcmVudEVudGl0eVNldERlbGV0YWJsZSAhPT0gXCJmYWxzZVwiIHx8IGJNYXNzRWRpdEVuYWJsZWQpIHtcblx0XHRcdFx0Ly8gQnVpbGRpbmcgZXhwcmVzc2lvbiBmb3IgZGVsZXRlIGFuZCBtYXNzIGVkaXRcblx0XHRcdFx0Y29uc3QgYnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24gPSBvcihcblx0XHRcdFx0XHRkZWxldGVCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiB8fCB0cnVlLCAvLyBkZWZhdWx0IGRlbGV0ZSB2aXNpYmlsaXR5IGFzIHRydWVcblx0XHRcdFx0XHRtYXNzRWRpdFZpc2liaWxpdHlFeHByZXNzaW9uXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihcblx0XHRcdFx0XHRpZkVsc2UoYW5kKFVJLklzRWRpdGFibGUsIGJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uKSwgY29uc3RhbnQoc2VsZWN0aW9uTW9kZSksIGNvbnN0YW50KFNlbGVjdGlvbk1vZGUuTm9uZSkpXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gU2VsZWN0aW9uTW9kZS5Ob25lO1xuXHRcdFx0fVxuXHRcdFx0Ly8gRW50aXR5U2V0IGRlbGV0YWJsZTpcblx0XHR9IGVsc2UgaWYgKGJNYXNzRWRpdEVuYWJsZWQpIHtcblx0XHRcdC8vIGV4YW1wbGU6IExSIHNjZW5hcmlvXG5cdFx0XHRyZXR1cm4gc2VsZWN0aW9uTW9kZTtcblx0XHR9IGVsc2UgaWYgKHRhcmdldENhcGFiaWxpdGllcy5pc0RlbGV0YWJsZSAmJiBkZWxldGVCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbikge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGlmRWxzZShkZWxldGVCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiwgY29uc3RhbnQoc2VsZWN0aW9uTW9kZSksIGNvbnN0YW50KFwiTm9uZVwiKSkpO1xuXHRcdFx0Ly8gRW50aXR5U2V0IG5vdCBkZWxldGFibGU6XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBTZWxlY3Rpb25Nb2RlLk5vbmU7XG5cdFx0fVxuXHRcdC8vIFRoZXJlIGFyZSBhY3Rpb25zIHJlcXVpcmluZyBhIGNvbnRleHQ6XG5cdH0gZWxzZSBpZiAoIWlzRW50aXR5U2V0KSB7XG5cdFx0Ly8gRXhhbXBsZTogT1AgY2FzZVxuXHRcdGlmICh0YXJnZXRDYXBhYmlsaXRpZXMuaXNEZWxldGFibGUgfHwgcGFyZW50RW50aXR5U2V0RGVsZXRhYmxlICE9PSBcImZhbHNlXCIgfHwgYk1hc3NFZGl0RW5hYmxlZCkge1xuXHRcdFx0Ly8gVXNlIHNlbGVjdGlvbk1vZGUgaW4gZWRpdCBtb2RlIGlmIGRlbGV0ZSBpcyBlbmFibGVkIG9yIG1hc3MgZWRpdCBpcyB2aXNpYmxlXG5cdFx0XHRjb25zdCBlZGl0TW9kZWJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uID0gaWZFbHNlKFxuXHRcdFx0XHRiTWFzc0VkaXRFbmFibGVkICYmICF0YXJnZXRDYXBhYmlsaXRpZXMuaXNEZWxldGFibGUsXG5cdFx0XHRcdG1hc3NFZGl0VmlzaWJpbGl0eUV4cHJlc3Npb24sXG5cdFx0XHRcdGNvbnN0YW50KHRydWUpXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0XHRpZkVsc2UoXG5cdFx0XHRcdFx0YW5kKFVJLklzRWRpdGFibGUsIGVkaXRNb2RlYnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24pLFxuXHRcdFx0XHRcdGNvbnN0YW50KHNlbGVjdGlvbk1vZGUpLFxuXHRcdFx0XHRcdGlmRWxzZShcblx0XHRcdFx0XHRcdG9yKC4uLmFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMuY29uY2F0KGFWaXNpYmxlQmluZGluZ0V4cHJlc3Npb25zKSksXG5cdFx0XHRcdFx0XHRjb25zdGFudChzZWxlY3Rpb25Nb2RlKSxcblx0XHRcdFx0XHRcdGNvbnN0YW50KFNlbGVjdGlvbk1vZGUuTm9uZSlcblx0XHRcdFx0XHQpXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihcblx0XHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRcdG9yKC4uLmFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMuY29uY2F0KGFWaXNpYmxlQmluZGluZ0V4cHJlc3Npb25zKSksXG5cdFx0XHRcdFx0Y29uc3RhbnQoc2VsZWN0aW9uTW9kZSksXG5cdFx0XHRcdFx0Y29uc3RhbnQoU2VsZWN0aW9uTW9kZS5Ob25lKVxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdH1cblx0XHQvL0VudGl0eVNldCBkZWxldGFibGU6XG5cdH0gZWxzZSBpZiAodGFyZ2V0Q2FwYWJpbGl0aWVzLmlzRGVsZXRhYmxlIHx8IGJNYXNzRWRpdEVuYWJsZWQpIHtcblx0XHQvLyBFeGFtcGxlOiBMUiBzY2VuYXJpb1xuXHRcdHJldHVybiBzZWxlY3Rpb25Nb2RlO1xuXHRcdC8vRW50aXR5U2V0IG5vdCBkZWxldGFibGU6XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRvciguLi5hSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zLmNvbmNhdChhVmlzaWJsZUJpbmRpbmdFeHByZXNzaW9ucyksIG1hc3NFZGl0VmlzaWJpbGl0eUV4cHJlc3Npb24pLFxuXHRcdFx0XHRjb25zdGFudChzZWxlY3Rpb25Nb2RlKSxcblx0XHRcdFx0Y29uc3RhbnQoU2VsZWN0aW9uTW9kZS5Ob25lKVxuXHRcdFx0KVxuXHRcdCk7XG5cdH1cbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gcmV0cmlldmUgYWxsIHRhYmxlIGFjdGlvbnMgZnJvbSBhbm5vdGF0aW9ucy5cbiAqXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uXG4gKiBAcGFyYW0gdmlzdWFsaXphdGlvblBhdGhcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgdGFibGUgYW5ub3RhdGlvbiBhY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIGdldFRhYmxlQW5ub3RhdGlvbkFjdGlvbnMobGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSwgdmlzdWFsaXphdGlvblBhdGg6IHN0cmluZywgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCkge1xuXHRjb25zdCB0YWJsZUFjdGlvbnM6IEJhc2VBY3Rpb25bXSA9IFtdO1xuXHRjb25zdCBoaWRkZW5UYWJsZUFjdGlvbnM6IEJhc2VBY3Rpb25bXSA9IFtdO1xuXHRpZiAobGluZUl0ZW1Bbm5vdGF0aW9uKSB7XG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLmZvckVhY2goKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykgPT4ge1xuXHRcdFx0bGV0IHRhYmxlQWN0aW9uOiBBbm5vdGF0aW9uQWN0aW9uIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0KGRhdGFGaWVsZCkgJiZcblx0XHRcdFx0IShkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSA9PT0gdHJ1ZSkgJiZcblx0XHRcdFx0IWRhdGFGaWVsZC5JbmxpbmUgJiZcblx0XHRcdFx0IWRhdGFGaWVsZC5EZXRlcm1pbmluZ1xuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnN0IGtleSA9IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKTtcblx0XHRcdFx0c3dpdGNoIChkYXRhRmllbGQuJFR5cGUpIHtcblx0XHRcdFx0XHRjYXNlIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkRm9yQWN0aW9uXCI6XG5cdFx0XHRcdFx0XHR0YWJsZUFjdGlvbiA9IHtcblx0XHRcdFx0XHRcdFx0dHlwZTogQWN0aW9uVHlwZS5EYXRhRmllbGRGb3JBY3Rpb24sXG5cdFx0XHRcdFx0XHRcdGFubm90YXRpb25QYXRoOiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgoZGF0YUZpZWxkLmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdFx0XHRcdGtleToga2V5LFxuXHRcdFx0XHRcdFx0XHR2aXNpYmxlOiBjb21waWxlRXhwcmVzc2lvbihcblx0XHRcdFx0XHRcdFx0XHRub3QoXG5cdFx0XHRcdFx0XHRcdFx0XHRlcXVhbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRbXSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRSZWxhdGl2ZU1vZGVsUGF0aEZ1bmN0aW9uKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0aXNOYXZpZ2FibGU6IHRydWVcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25cIjpcblx0XHRcdFx0XHRcdHRhYmxlQWN0aW9uID0ge1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBBY3Rpb25UeXBlLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbixcblx0XHRcdFx0XHRcdFx0YW5ub3RhdGlvblBhdGg6IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChkYXRhRmllbGQuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdFx0XHRcdFx0a2V5OiBrZXksXG5cdFx0XHRcdFx0XHRcdHZpc2libGU6IGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0XHRcdFx0XHRcdG5vdChcblx0XHRcdFx0XHRcdFx0XHRcdGVxdWFsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24oXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFtdLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFJlbGF0aXZlTW9kZWxQYXRoRnVuY3Rpb24oKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbj8udmFsdWVPZigpID09PSB0cnVlKSB7XG5cdFx0XHRcdGhpZGRlblRhYmxlQWN0aW9ucy5wdXNoKHtcblx0XHRcdFx0XHR0eXBlOiBBY3Rpb25UeXBlLkRlZmF1bHQsXG5cdFx0XHRcdFx0a2V5OiBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZClcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGFibGVBY3Rpb24pIHtcblx0XHRcdFx0dGFibGVBY3Rpb25zLnB1c2godGFibGVBY3Rpb24pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0dGFibGVBY3Rpb25zOiB0YWJsZUFjdGlvbnMsXG5cdFx0aGlkZGVuVGFibGVBY3Rpb25zOiBoaWRkZW5UYWJsZUFjdGlvbnNcblx0fTtcbn1cblxuZnVuY3Rpb24gZ2V0SGlnaGxpZ2h0Um93QmluZGluZyhcblx0Y3JpdGljYWxpdHlBbm5vdGF0aW9uOiBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248Q3JpdGljYWxpdHlUeXBlPiB8IEVudW1WYWx1ZTxDcml0aWNhbGl0eVR5cGU+IHwgdW5kZWZpbmVkLFxuXHRpc0RyYWZ0Um9vdDogYm9vbGVhbixcblx0dGFyZ2V0RW50aXR5VHlwZT86IEVudGl0eVR5cGVcbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxNZXNzYWdlVHlwZT4ge1xuXHRsZXQgZGVmYXVsdEhpZ2hsaWdodFJvd0RlZmluaXRpb246IE1lc3NhZ2VUeXBlIHwgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPE1lc3NhZ2VUeXBlPiA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdGlmIChjcml0aWNhbGl0eUFubm90YXRpb24pIHtcblx0XHRpZiAodHlwZW9mIGNyaXRpY2FsaXR5QW5ub3RhdGlvbiA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0ZGVmYXVsdEhpZ2hsaWdodFJvd0RlZmluaXRpb24gPSBnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24oY3JpdGljYWxpdHlBbm5vdGF0aW9uKSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248TWVzc2FnZVR5cGU+O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBFbnVtIFZhbHVlIHNvIHdlIGdldCB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgcGFydFxuXHRcdFx0ZGVmYXVsdEhpZ2hsaWdodFJvd0RlZmluaXRpb24gPSBnZXRNZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eVR5cGUoY3JpdGljYWxpdHlBbm5vdGF0aW9uKTtcblx0XHR9XG5cdH1cblxuXHRjb25zdCBhTWlzc2luZ0tleXM6IGFueVtdID0gW107XG5cdHRhcmdldEVudGl0eVR5cGU/LmtleXMuZm9yRWFjaCgoa2V5OiBhbnkpID0+IHtcblx0XHRpZiAoa2V5Lm5hbWUgIT09IFwiSXNBY3RpdmVFbnRpdHlcIikge1xuXHRcdFx0YU1pc3NpbmdLZXlzLnB1c2gocGF0aEluTW9kZWwoa2V5Lm5hbWUsIHVuZGVmaW5lZCkpO1xuXHRcdH1cblx0fSk7XG5cblx0cmV0dXJuIGZvcm1hdFJlc3VsdChcblx0XHRbXG5cdFx0XHRkZWZhdWx0SGlnaGxpZ2h0Um93RGVmaW5pdGlvbixcblx0XHRcdHBhdGhJbk1vZGVsKGBmaWx0ZXJlZE1lc3NhZ2VzYCwgXCJpbnRlcm5hbFwiKSxcblx0XHRcdGlzRHJhZnRSb290ICYmIEVudGl0eS5IYXNBY3RpdmUsXG5cdFx0XHRpc0RyYWZ0Um9vdCAmJiBFbnRpdHkuSXNBY3RpdmUsXG5cdFx0XHRgJHtpc0RyYWZ0Um9vdH1gLFxuXHRcdFx0Li4uYU1pc3NpbmdLZXlzXG5cdFx0XSxcblx0XHR0YWJsZUZvcm1hdHRlcnMucm93SGlnaGxpZ2h0aW5nLFxuXHRcdHRhcmdldEVudGl0eVR5cGVcblx0KTtcbn1cblxuZnVuY3Rpb24gX2dldENyZWF0aW9uQmVoYXZpb3VyKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLFxuXHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbjogVGFibGVDb250cm9sQ29uZmlndXJhdGlvbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0bmF2aWdhdGlvblNldHRpbmdzOiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nXG4pOiBUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uW1wiY3JlYXRlXCJdIHtcblx0Y29uc3QgbmF2aWdhdGlvbiA9IG5hdmlnYXRpb25TZXR0aW5ncz8uY3JlYXRlIHx8IG5hdmlnYXRpb25TZXR0aW5ncz8uZGV0YWlsO1xuXHRjb25zdCB0YWJsZU1hbmlmZXN0U2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKTtcblx0Y29uc3Qgb3JpZ2luYWxUYWJsZVNldHRpbmdzID0gKHRhYmxlTWFuaWZlc3RTZXR0aW5ncyAmJiB0YWJsZU1hbmlmZXN0U2V0dGluZ3MudGFibGVTZXR0aW5ncykgfHwge307XG5cdC8vIGNyb3NzLWFwcFxuXHRpZiAobmF2aWdhdGlvbj8ub3V0Ym91bmQgJiYgbmF2aWdhdGlvbi5vdXRib3VuZERldGFpbCAmJiBuYXZpZ2F0aW9uU2V0dGluZ3M/LmNyZWF0ZSkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRtb2RlOiBcIkV4dGVybmFsXCIsXG5cdFx0XHRvdXRib3VuZDogbmF2aWdhdGlvbi5vdXRib3VuZCxcblx0XHRcdG91dGJvdW5kRGV0YWlsOiBuYXZpZ2F0aW9uLm91dGJvdW5kRGV0YWlsLFxuXHRcdFx0bmF2aWdhdGlvblNldHRpbmdzOiBuYXZpZ2F0aW9uU2V0dGluZ3Ncblx0XHR9O1xuXHR9XG5cblx0bGV0IG5ld0FjdGlvbjtcblx0aWYgKGxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdC8vIGluLWFwcFxuXHRcdGNvbnN0IHRhcmdldEFubm90YXRpb25zID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKT8uYW5ub3RhdGlvbnM7XG5cdFx0bmV3QWN0aW9uID0gdGFyZ2V0QW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnRSb290Py5OZXdBY3Rpb24gfHwgdGFyZ2V0QW5ub3RhdGlvbnM/LlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQ/Lk5ld0FjdGlvbjtcblxuXHRcdGlmICh0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdyAmJiBuZXdBY3Rpb24pIHtcblx0XHRcdC8vIEEgY29tYmluYXRpb24gb2YgJ0NyZWF0aW9uUm93JyBhbmQgJ05ld0FjdGlvbicgZG9lcyBub3QgbWFrZSBzZW5zZVxuXHRcdFx0dGhyb3cgRXJyb3IoYENyZWF0aW9uIG1vZGUgJyR7Q3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93fScgY2FuIG5vdCBiZSB1c2VkIHdpdGggYSBjdXN0b20gJ25ldycgYWN0aW9uICgke25ld0FjdGlvbn0pYCk7XG5cdFx0fVxuXHRcdGlmIChuYXZpZ2F0aW9uPy5yb3V0ZSkge1xuXHRcdFx0Ly8gcm91dGUgc3BlY2lmaWVkXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRtb2RlOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUsXG5cdFx0XHRcdGFwcGVuZDogdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRlQXRFbmQsXG5cdFx0XHRcdG5ld0FjdGlvbjogbmV3QWN0aW9uPy50b1N0cmluZygpLFxuXHRcdFx0XHRuYXZpZ2F0ZVRvVGFyZ2V0OiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5OZXdQYWdlID8gbmF2aWdhdGlvbi5yb3V0ZSA6IHVuZGVmaW5lZCAvLyBuYXZpZ2F0ZSBvbmx5IGluIE5ld1BhZ2UgbW9kZVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cblxuXHQvLyBubyBuYXZpZ2F0aW9uIG9yIG5vIHJvdXRlIHNwZWNpZmllZCAtIGZhbGxiYWNrIHRvIGlubGluZSBjcmVhdGUgaWYgb3JpZ2luYWwgY3JlYXRpb24gbW9kZSB3YXMgJ05ld1BhZ2UnXG5cdGlmICh0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5OZXdQYWdlKSB7XG5cdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLklubGluZTtcblx0XHQvLyBJbiBjYXNlIHRoZXJlIHdhcyBubyBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGZvciB0aGUgY3JlYXRlQXRFbmQgd2UgZm9yY2UgaXQgdG8gZmFsc2Vcblx0XHRpZiAob3JpZ2luYWxUYWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uY3JlYXRlQXRFbmQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRlQXRFbmQgPSBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdG1vZGU6IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSxcblx0XHRhcHBlbmQ6IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0ZUF0RW5kLFxuXHRcdG5ld0FjdGlvbjogbmV3QWN0aW9uPy50b1N0cmluZygpXG5cdH07XG59XG5cbmNvbnN0IF9nZXRSb3dDb25maWd1cmF0aW9uUHJvcGVydHkgPSBmdW5jdGlvbiAoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0gfCB1bmRlZmluZWQsXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdG5hdmlnYXRpb25TZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0dGFyZ2V0UGF0aDogc3RyaW5nXG4pIHtcblx0bGV0IHByZXNzUHJvcGVydHksIG5hdmlnYXRpb25UYXJnZXQ7XG5cdGxldCBjcml0aWNhbGl0eVByb3BlcnR5OiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248TWVzc2FnZVR5cGU+ID0gY29uc3RhbnQoTWVzc2FnZVR5cGUuTm9uZSk7XG5cdGNvbnN0IHRhcmdldEVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKTtcblx0aWYgKG5hdmlnYXRpb25TZXR0aW5ncyAmJiBsaW5lSXRlbUFubm90YXRpb24pIHtcblx0XHRuYXZpZ2F0aW9uVGFyZ2V0ID0gbmF2aWdhdGlvblNldHRpbmdzLmRpc3BsYXk/LnRhcmdldCB8fCBuYXZpZ2F0aW9uU2V0dGluZ3MuZGV0YWlsPy5vdXRib3VuZDtcblx0XHRpZiAobmF2aWdhdGlvblRhcmdldCkge1xuXHRcdFx0cHJlc3NQcm9wZXJ0eSA9XG5cdFx0XHRcdFwiLmhhbmRsZXJzLm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZCggJGNvbnRyb2xsZXIgLCdcIiArIG5hdmlnYXRpb25UYXJnZXQgKyBcIicsICR7JHBhcmFtZXRlcnM+YmluZGluZ0NvbnRleHR9KVwiO1xuXHRcdH0gZWxzZSBpZiAodGFyZ2V0RW50aXR5VHlwZSkge1xuXHRcdFx0Y29uc3QgdGFyZ2V0RW50aXR5U2V0ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKTtcblx0XHRcdG5hdmlnYXRpb25UYXJnZXQgPSBuYXZpZ2F0aW9uU2V0dGluZ3MuZGV0YWlsPy5yb3V0ZTtcblx0XHRcdGlmIChuYXZpZ2F0aW9uVGFyZ2V0KSB7XG5cdFx0XHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBnZXRIaWdobGlnaHRSb3dCaW5kaW5nKFxuXHRcdFx0XHRcdGxpbmVJdGVtQW5ub3RhdGlvbi5hbm5vdGF0aW9ucz8uVUk/LkNyaXRpY2FsaXR5LFxuXHRcdFx0XHRcdCEhdGFyZ2V0RW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdFJvb3QgfHwgISF0YXJnZXRFbnRpdHlTZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Tm9kZSxcblx0XHRcdFx0XHR0YXJnZXRFbnRpdHlUeXBlXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHByZXNzUHJvcGVydHkgPVxuXHRcdFx0XHRcdFwiQVBJLm9uVGFibGVSb3dQcmVzcygkZXZlbnQsICRjb250cm9sbGVyLCAkeyRwYXJhbWV0ZXJzPmJpbmRpbmdDb250ZXh0fSwgeyBjYWxsRXh0ZW5zaW9uOiB0cnVlLCB0YXJnZXRQYXRoOiAnXCIgK1xuXHRcdFx0XHRcdHRhcmdldFBhdGggK1xuXHRcdFx0XHRcdFwiJywgZWRpdGFibGUgOiBcIiArXG5cdFx0XHRcdFx0KHRhcmdldEVudGl0eVNldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnRSb290IHx8IHRhcmdldEVudGl0eVNldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnROb2RlXG5cdFx0XHRcdFx0XHQ/IFwiISR7JHBhcmFtZXRlcnM+YmluZGluZ0NvbnRleHR9LmdldFByb3BlcnR5KCdJc0FjdGl2ZUVudGl0eScpXCJcblx0XHRcdFx0XHRcdDogXCJ1bmRlZmluZWRcIikgK1xuXHRcdFx0XHRcdFwifSlcIjsgLy9OZWVkIHRvIGFjY2VzcyB0byBEcmFmdFJvb3QgYW5kIERyYWZ0Tm9kZSAhISEhISEhXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gZ2V0SGlnaGxpZ2h0Um93QmluZGluZyhsaW5lSXRlbUFubm90YXRpb24uYW5ub3RhdGlvbnM/LlVJPy5Dcml0aWNhbGl0eSwgZmFsc2UsIHRhcmdldEVudGl0eVR5cGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRjb25zdCByb3dOYXZpZ2F0ZWRFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBmb3JtYXRSZXN1bHQoXG5cdFx0W3BhdGhJbk1vZGVsKFwiL2RlZXBlc3RQYXRoXCIsIFwiaW50ZXJuYWxcIildLFxuXHRcdHRhYmxlRm9ybWF0dGVycy5uYXZpZ2F0ZWRSb3csXG5cdFx0dGFyZ2V0RW50aXR5VHlwZVxuXHQpO1xuXHRyZXR1cm4ge1xuXHRcdHByZXNzOiBwcmVzc1Byb3BlcnR5LFxuXHRcdGFjdGlvbjogcHJlc3NQcm9wZXJ0eSA/IFwiTmF2aWdhdGlvblwiIDogdW5kZWZpbmVkLFxuXHRcdHJvd0hpZ2hsaWdodGluZzogY29tcGlsZUV4cHJlc3Npb24oY3JpdGljYWxpdHlQcm9wZXJ0eSksXG5cdFx0cm93TmF2aWdhdGVkOiBjb21waWxlRXhwcmVzc2lvbihyb3dOYXZpZ2F0ZWRFeHByZXNzaW9uKSxcblx0XHR2aXNpYmxlOiBjb21waWxlRXhwcmVzc2lvbihub3QoVUkuSXNJbmFjdGl2ZSkpXG5cdH07XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBjb2x1bW5zIGZyb20gdGhlIGVudGl0eVR5cGUuXG4gKlxuICogQHBhcmFtIGNvbHVtbnNUb0JlQ3JlYXRlZCBUaGUgY29sdW1ucyB0byBiZSBjcmVhdGVkLlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHRhcmdldCBlbnRpdHkgdHlwZS5cbiAqIEBwYXJhbSBhbm5vdGF0aW9uQ29sdW1ucyBUaGUgYXJyYXkgb2YgY29sdW1ucyBjcmVhdGVkIGJhc2VkIG9uIExpbmVJdGVtIGFubm90YXRpb25zLlxuICogQHBhcmFtIG5vblNvcnRhYmxlQ29sdW1ucyBUaGUgYXJyYXkgb2YgYWxsIG5vbiBzb3J0YWJsZSBjb2x1bW4gbmFtZXMuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHQuXG4gKiBAcGFyYW0gdGFibGVUeXBlIFRoZSB0YWJsZSB0eXBlLlxuICogQHJldHVybnMgVGhlIGNvbHVtbiBmcm9tIHRoZSBlbnRpdHlUeXBlXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb2x1bW5zRnJvbUVudGl0eVR5cGUgPSBmdW5jdGlvbiAoXG5cdGNvbHVtbnNUb0JlQ3JlYXRlZDogUmVjb3JkPHN0cmluZywgUHJvcGVydHk+LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10gPSBbXSxcblx0bm9uU29ydGFibGVDb2x1bW5zOiBzdHJpbmdbXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0dGFibGVUeXBlOiBUYWJsZVR5cGVcbik6IEFubm90YXRpb25UYWJsZUNvbHVtbltdIHtcblx0Y29uc3QgdGFibGVDb2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSA9IGFubm90YXRpb25Db2x1bW5zO1xuXHQvLyBDYXRjaCBhbHJlYWR5IGV4aXN0aW5nIGNvbHVtbnMgLSB3aGljaCB3ZXJlIGFkZGVkIGJlZm9yZSBieSBMaW5lSXRlbSBBbm5vdGF0aW9uc1xuXHRjb25zdCBhZ2dyZWdhdGlvbkhlbHBlciA9IG5ldyBBZ2dyZWdhdGlvbkhlbHBlcihlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHRlbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHk6IFByb3BlcnR5KSA9PiB7XG5cdFx0Ly8gQ2F0Y2ggYWxyZWFkeSBleGlzdGluZyBjb2x1bW5zIC0gd2hpY2ggd2VyZSBhZGRlZCBiZWZvcmUgYnkgTGluZUl0ZW0gQW5ub3RhdGlvbnNcblx0XHRjb25zdCBleGlzdHMgPSBhbm5vdGF0aW9uQ29sdW1ucy5zb21lKChjb2x1bW4pID0+IHtcblx0XHRcdHJldHVybiBjb2x1bW4ubmFtZSA9PT0gcHJvcGVydHkubmFtZTtcblx0XHR9KTtcblxuXHRcdC8vIGlmIHRhcmdldCB0eXBlIGV4aXN0cywgaXQgaXMgYSBjb21wbGV4IHByb3BlcnR5IGFuZCBzaG91bGQgYmUgaWdub3JlZFxuXHRcdGlmIChcblx0XHRcdCFwcm9wZXJ0eS50YXJnZXRUeXBlICYmXG5cdFx0XHQhZXhpc3RzICYmXG5cdFx0XHRwcm9wZXJ0eS5hbm5vdGF0aW9ucy5VSSAmJlxuXHRcdFx0IWlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuKHByb3BlcnR5LmFubm90YXRpb25zLlVJLkRhdGFGaWVsZERlZmF1bHQpXG5cdFx0KSB7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm8gPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMoXG5cdFx0XHRcdHByb3BlcnR5Lm5hbWUsXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHR0YWJsZVR5cGVcblx0XHRcdCk7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBhZGRpdGlvbmFsUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXMpO1xuXHRcdFx0Y29uc3QgY29sdW1uSW5mbyA9IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgocHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdFx0cHJvcGVydHkubmFtZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0bm9uU29ydGFibGVDb2x1bW5zLFxuXHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0KTtcblxuXHRcdFx0Y29uc3Qgc2VtYW50aWNLZXlzID0gY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uc0J5VGVybShcIkNvbW1vblwiLCBDb21tb25Bbm5vdGF0aW9uVGVybXMuU2VtYW50aWNLZXksIFtcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKClcblx0XHRcdF0pWzBdO1xuXHRcdFx0Y29uc3Qgb0NvbHVtbkRyYWZ0SW5kaWNhdG9yID0gZ2V0RGVmYXVsdERyYWZ0SW5kaWNhdG9yRm9yQ29sdW1uKGNvbHVtbkluZm8ubmFtZSwgc2VtYW50aWNLZXlzLCBmYWxzZSwgbnVsbCk7XG5cdFx0XHRpZiAoT2JqZWN0LmtleXMob0NvbHVtbkRyYWZ0SW5kaWNhdG9yKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNvbHVtbkluZm8uZm9ybWF0T3B0aW9ucyA9IHtcblx0XHRcdFx0XHQuLi5vQ29sdW1uRHJhZnRJbmRpY2F0b3Jcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHRcdGlmIChyZWxhdGVkUHJvcGVydHlOYW1lcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNvbHVtbkluZm8ucHJvcGVydHlJbmZvcyA9IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzO1xuXHRcdFx0XHRjb2x1bW5JbmZvLmV4cG9ydFNldHRpbmdzID0ge1xuXHRcdFx0XHRcdC4uLmNvbHVtbkluZm8uZXhwb3J0U2V0dGluZ3MsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRTZXR0aW5nc1RlbXBsYXRlLFxuXHRcdFx0XHRcdHdyYXA6IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRTZXR0aW5nc1dyYXBwaW5nXG5cdFx0XHRcdH07XG5cdFx0XHRcdGNvbHVtbkluZm8uZXhwb3J0U2V0dGluZ3MudHlwZSA9IF9nZXRFeHBvcnREYXRhVHlwZShwcm9wZXJ0eS50eXBlLCByZWxhdGVkUHJvcGVydHlOYW1lcy5sZW5ndGggPiAxKTtcblxuXHRcdFx0XHRpZiAocmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFVuaXROYW1lKSB7XG5cdFx0XHRcdFx0Y29sdW1uSW5mby5leHBvcnRTZXR0aW5ncy51bml0UHJvcGVydHkgPSByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0VW5pdE5hbWU7XG5cdFx0XHRcdFx0Y29sdW1uSW5mby5leHBvcnRTZXR0aW5ncy50eXBlID0gXCJDdXJyZW5jeVwiOyAvLyBGb3JjZSB0byBhIGN1cnJlbmN5IGJlY2F1c2UgdGhlcmUncyBhIHVuaXRQcm9wZXJ0eSAob3RoZXJ3aXNlIHRoZSB2YWx1ZSBpc24ndCBwcm9wZXJseSBmb3JtYXR0ZWQgd2hlbiBleHBvcnRlZClcblx0XHRcdFx0fSBlbHNlIGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0VW5pdFN0cmluZykge1xuXHRcdFx0XHRcdGNvbHVtbkluZm8uZXhwb3J0U2V0dGluZ3MudW5pdCA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRVbml0U3RyaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0VGltZXpvbmVOYW1lKSB7XG5cdFx0XHRcdFx0Y29sdW1uSW5mby5leHBvcnRTZXR0aW5ncy50aW1lem9uZVByb3BlcnR5ID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFRpbWV6b25lTmFtZTtcblx0XHRcdFx0fSBlbHNlIGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0VGltZXpvbmVTdHJpbmcpIHtcblx0XHRcdFx0XHRjb2x1bW5JbmZvLmV4cG9ydFNldHRpbmdzLnRpbWV6b25lID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFRpbWV6b25lU3RyaW5nO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ29sbGVjdCBpbmZvcm1hdGlvbiBvZiByZWxhdGVkIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cblx0XHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZXMuZm9yRWFjaCgobmFtZSkgPT4ge1xuXHRcdFx0XHRcdGNvbHVtbnNUb0JlQ3JlYXRlZFtuYW1lXSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzW25hbWVdO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Y29sdW1uSW5mby5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcyA9IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzO1xuXHRcdFx0XHQvLyBDcmVhdGUgY29sdW1ucyBmb3IgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgZm9yIEFMUCB1c2UgY2FzZS5cblx0XHRcdFx0YWRkaXRpb25hbFByb3BlcnR5TmFtZXMuZm9yRWFjaCgobmFtZSkgPT4ge1xuXHRcdFx0XHRcdC8vIEludGVudGlvbmFsIG92ZXJ3cml0ZSBhcyB3ZSByZXF1aXJlIG9ubHkgb25lIG5ldyBQcm9wZXJ0eUluZm8gZm9yIGEgcmVsYXRlZCBQcm9wZXJ0eS5cblx0XHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbbmFtZV0gPSByZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXNbbmFtZV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0dGFibGVDb2x1bW5zLnB1c2goY29sdW1uSW5mbyk7XG5cdFx0fVxuXHR9KTtcblxuXHQvLyBDcmVhdGUgYSBwcm9wZXJ0eUluZm8gZm9yIGVhY2ggcmVsYXRlZCBwcm9wZXJ0eS5cblx0Y29uc3QgcmVsYXRlZENvbHVtbnMgPSBfY3JlYXRlUmVsYXRlZENvbHVtbnMoY29sdW1uc1RvQmVDcmVhdGVkLCB0YWJsZUNvbHVtbnMsIG5vblNvcnRhYmxlQ29sdW1ucywgY29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZSk7XG5cblx0cmV0dXJuIHRhYmxlQ29sdW1ucy5jb25jYXQocmVsYXRlZENvbHVtbnMpO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjb2x1bW4gZGVmaW5pdGlvbiBmcm9tIGEgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHByb3BlcnR5IEVudGl0eSB0eXBlIHByb3BlcnR5IGZvciB3aGljaCB0aGUgY29sdW1uIGlzIGNyZWF0ZWRcbiAqIEBwYXJhbSBmdWxsUHJvcGVydHlQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHRhcmdldCBwcm9wZXJ0eVxuICogQHBhcmFtIHJlbGF0aXZlUGF0aCBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgdGFyZ2V0IHByb3BlcnR5IGJhc2VkIG9uIHRoZSBjb250ZXh0XG4gKiBAcGFyYW0gdXNlRGF0YUZpZWxkUHJlZml4IFNob3VsZCBiZSBwcmVmaXhlZCB3aXRoIFwiRGF0YUZpZWxkOjpcIiwgZWxzZSBpdCB3aWxsIGJlIHByZWZpeGVkIHdpdGggXCJQcm9wZXJ0eTo6XCJcbiAqIEBwYXJhbSBhdmFpbGFibGVGb3JBZGFwdGF0aW9uIERlY2lkZXMgd2hldGhlciB0aGUgY29sdW1uIHNob3VsZCBiZSBhdmFpbGFibGUgZm9yIGFkYXB0YXRpb25cbiAqIEBwYXJhbSBub25Tb3J0YWJsZUNvbHVtbnMgVGhlIGFycmF5IG9mIGFsbCBub24tc29ydGFibGUgY29sdW1uIG5hbWVzXG4gKiBAcGFyYW0gYWdncmVnYXRpb25IZWxwZXIgVGhlIGFnZ3JlZ2F0aW9uSGVscGVyIGZvciB0aGUgZW50aXR5XG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBhbm5vdGF0aW9uIGNvbHVtbiBkZWZpbml0aW9uXG4gKi9cbmNvbnN0IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkgPSBmdW5jdGlvbiAoXG5cdHByb3BlcnR5OiBQcm9wZXJ0eSxcblx0ZnVsbFByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRyZWxhdGl2ZVBhdGg6IHN0cmluZyxcblx0dXNlRGF0YUZpZWxkUHJlZml4OiBib29sZWFuLFxuXHRhdmFpbGFibGVGb3JBZGFwdGF0aW9uOiBib29sZWFuLFxuXHRub25Tb3J0YWJsZUNvbHVtbnM6IHN0cmluZ1tdLFxuXHRhZ2dyZWdhdGlvbkhlbHBlcjogQWdncmVnYXRpb25IZWxwZXIsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IEFubm90YXRpb25UYWJsZUNvbHVtbiB7XG5cdGNvbnN0IG5hbWUgPSB1c2VEYXRhRmllbGRQcmVmaXggPyByZWxhdGl2ZVBhdGggOiBgUHJvcGVydHk6OiR7cmVsYXRpdmVQYXRofWA7XG5cdGNvbnN0IGtleSA9ICh1c2VEYXRhRmllbGRQcmVmaXggPyBcIkRhdGFGaWVsZDo6XCIgOiBcIlByb3BlcnR5OjpcIikgKyByZXBsYWNlU3BlY2lhbENoYXJzKHJlbGF0aXZlUGF0aCk7XG5cdGNvbnN0IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGggPSBnZXRTZW1hbnRpY09iamVjdFBhdGgoY29udmVydGVyQ29udGV4dCwgcHJvcGVydHkpO1xuXHRjb25zdCBpc0hpZGRlbiA9IHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IHRydWU7XG5cdGNvbnN0IGdyb3VwUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkID0gcHJvcGVydHkubmFtZSA/IF9zbGljZUF0U2xhc2gocHJvcGVydHkubmFtZSwgdHJ1ZSwgZmFsc2UpIDogdW5kZWZpbmVkO1xuXHRjb25zdCBpc0dyb3VwOiBib29sZWFuID0gZ3JvdXBQYXRoICE9IHByb3BlcnR5Lm5hbWU7XG5cdGNvbnN0IGlzRGF0YVBvaW50RmFrZVByb3BlcnR5OiBib29sZWFuID0gbmFtZS5pbmRleE9mKFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFQb2ludFwiKSA+IC0xO1xuXHRjb25zdCBleHBvcnRUeXBlOiBzdHJpbmcgPSBfZ2V0RXhwb3J0RGF0YVR5cGUocHJvcGVydHkudHlwZSk7XG5cdGNvbnN0IHNEYXRlSW5wdXRGb3JtYXQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHByb3BlcnR5LnR5cGUgPT09IFwiRWRtLkRhdGVcIiA/IFwiWVlZWS1NTS1ERFwiIDogdW5kZWZpbmVkO1xuXHRjb25zdCBkYXRhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gZ2V0RGF0YUZpZWxkRGF0YVR5cGUocHJvcGVydHkpO1xuXHRjb25zdCBwcm9wZXJ0eVR5cGVDb25maWcgPSAhaXNEYXRhUG9pbnRGYWtlUHJvcGVydHkgPyBnZXRUeXBlQ29uZmlnKHByb3BlcnR5LCBkYXRhVHlwZSkgOiB1bmRlZmluZWQ7XG5cdGNvbnN0IHNlbWFudGljS2V5czogU2VtYW50aWNLZXkgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25zQnlUZXJtKFwiQ29tbW9uXCIsIENvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY0tleSwgW1xuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpXG5cdF0pWzBdO1xuXHRjb25zdCBzb3J0YWJsZSA9ICFpc0hpZGRlbiAmJiBub25Tb3J0YWJsZUNvbHVtbnMuaW5kZXhPZihyZWxhdGl2ZVBhdGgpID09PSAtMSAmJiAhaXNEYXRhUG9pbnRGYWtlUHJvcGVydHk7XG5cdGNvbnN0IG9UeXBlQ29uZmlnID0gIWlzRGF0YVBvaW50RmFrZVByb3BlcnR5XG5cdFx0PyB7XG5cdFx0XHRcdGNsYXNzTmFtZTogcHJvcGVydHkudHlwZSB8fCBkYXRhVHlwZSxcblx0XHRcdFx0b0Zvcm1hdE9wdGlvbnM6IHByb3BlcnR5VHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zLFxuXHRcdFx0XHRvQ29uc3RyYWludHM6IHByb3BlcnR5VHlwZUNvbmZpZy5jb25zdHJhaW50c1xuXHRcdCAgfVxuXHRcdDogdW5kZWZpbmVkO1xuXHRjb25zdCBleHBvcnRTZXR0aW5nczogYW55ID0gaXNEYXRhUG9pbnRGYWtlUHJvcGVydHlcblx0XHQ/IHtcblx0XHRcdFx0dGVtcGxhdGU6IGdldFRhcmdldFZhbHVlT25EYXRhUG9pbnQocHJvcGVydHkpXG5cdFx0ICB9XG5cdFx0OiB7XG5cdFx0XHRcdHR5cGU6IGV4cG9ydFR5cGUsXG5cdFx0XHRcdGlucHV0Rm9ybWF0OiBzRGF0ZUlucHV0Rm9ybWF0LFxuXHRcdFx0XHRzY2FsZTogcHJvcGVydHkuc2NhbGUsXG5cdFx0XHRcdGRlbGltaXRlcjogcHJvcGVydHkudHlwZSA9PT0gXCJFZG0uSW50NjRcIiA/IHRydWUgOiBmYWxzZVxuXHRcdCAgfTtcblxuXHRpZiAoIWlzRGF0YVBvaW50RmFrZVByb3BlcnR5KSB7XG5cdFx0Y29uc3Qgb1VuaXRQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5KHByb3BlcnR5KSB8fCBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KHByb3BlcnR5KTtcblx0XHRjb25zdCBvVGltZXpvbmVQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5KHByb3BlcnR5KTtcblx0XHRjb25zdCBzVW5pdFRleHQgPSBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeSB8fCBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5Vbml0O1xuXHRcdGNvbnN0IHNUaW1lem9uZVRleHQgPSBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGltZXpvbmU7XG5cdFx0aWYgKG9Vbml0UHJvcGVydHkpIHtcblx0XHRcdGV4cG9ydFNldHRpbmdzLnVuaXRQcm9wZXJ0eSA9IG9Vbml0UHJvcGVydHkubmFtZTtcblx0XHRcdGV4cG9ydFNldHRpbmdzLnR5cGUgPSBcIkN1cnJlbmN5XCI7IC8vIEZvcmNlIHRvIGEgY3VycmVuY3kgYmVjYXVzZSB0aGVyZSdzIGEgdW5pdFByb3BlcnR5IChvdGhlcndpc2UgdGhlIHZhbHVlIGlzbid0IHByb3Blcmx5IGZvcm1hdHRlZCB3aGVuIGV4cG9ydGVkKVxuXHRcdH0gZWxzZSBpZiAoc1VuaXRUZXh0KSB7XG5cdFx0XHRleHBvcnRTZXR0aW5ncy51bml0ID0gYCR7c1VuaXRUZXh0fWA7XG5cdFx0fVxuXHRcdGlmIChvVGltZXpvbmVQcm9wZXJ0eSkge1xuXHRcdFx0ZXhwb3J0U2V0dGluZ3MudGltZXpvbmVQcm9wZXJ0eSA9IG9UaW1lem9uZVByb3BlcnR5Lm5hbWU7XG5cdFx0fSBlbHNlIGlmIChzVGltZXpvbmVUZXh0KSB7XG5cdFx0XHRleHBvcnRTZXR0aW5ncy50aW1lem9uZSA9IHNUaW1lem9uZVRleHQudG9TdHJpbmcoKTtcblx0XHR9XG5cdH1cblxuXHRjb25zdCBvQ29sdW1uOiBhbnkgPSB7XG5cdFx0a2V5OiBrZXksXG5cdFx0dHlwZTogQ29sdW1uVHlwZS5Bbm5vdGF0aW9uLFxuXHRcdGxhYmVsOiBfZ2V0TGFiZWwocHJvcGVydHksIGlzR3JvdXApLFxuXHRcdGdyb3VwTGFiZWw6IGlzR3JvdXAgPyBfZ2V0TGFiZWwocHJvcGVydHkpIDogbnVsbCxcblx0XHRncm91cDogaXNHcm91cCA/IGdyb3VwUGF0aCA6IG51bGwsXG5cdFx0YW5ub3RhdGlvblBhdGg6IGZ1bGxQcm9wZXJ0eVBhdGgsXG5cdFx0c2VtYW50aWNPYmplY3RQYXRoOiBzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoLFxuXHRcdC8vIEEgZmFrZSBwcm9wZXJ0eSB3YXMgY3JlYXRlZCBmb3IgdGhlIFRhcmdldFZhbHVlIHVzZWQgb24gRGF0YVBvaW50cywgdGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgaGlkZGVuIGFuZCBub24gc29ydGFibGVcblx0XHRhdmFpbGFiaWxpdHk6XG5cdFx0XHQhYXZhaWxhYmxlRm9yQWRhcHRhdGlvbiB8fCBpc0hpZGRlbiB8fCBpc0RhdGFQb2ludEZha2VQcm9wZXJ0eSA/IEF2YWlsYWJpbGl0eVR5cGUuSGlkZGVuIDogQXZhaWxhYmlsaXR5VHlwZS5BZGFwdGF0aW9uLFxuXHRcdG5hbWU6IG5hbWUsXG5cdFx0cmVsYXRpdmVQYXRoOiBpc0RhdGFQb2ludEZha2VQcm9wZXJ0eVxuXHRcdFx0PyAocHJvcGVydHkgYXMgYW55KS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQ/LlRhcmdldD8uJHRhcmdldD8uVmFsdWU/LnBhdGggfHwgKHByb3BlcnR5IGFzIGFueSkuVmFsdWUucGF0aFxuXHRcdFx0OiByZWxhdGl2ZVBhdGgsXG5cdFx0c29ydGFibGU6IHNvcnRhYmxlLFxuXHRcdGlzR3JvdXBhYmxlOiBhZ2dyZWdhdGlvbkhlbHBlci5pc0FuYWx5dGljc1N1cHBvcnRlZCgpID8gYWdncmVnYXRpb25IZWxwZXIuaXNQcm9wZXJ0eUdyb3VwYWJsZShwcm9wZXJ0eSkgOiBzb3J0YWJsZSxcblx0XHRpc0tleTogcHJvcGVydHkuaXNLZXksXG5cdFx0aXNEYXRhUG9pbnRGYWtlVGFyZ2V0UHJvcGVydHk6IGlzRGF0YVBvaW50RmFrZVByb3BlcnR5LFxuXHRcdGV4cG9ydFNldHRpbmdzOiBleHBvcnRTZXR0aW5ncyxcblx0XHRjYXNlU2Vuc2l0aXZlOiBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUoY29udmVydGVyQ29udGV4dCksXG5cdFx0dHlwZUNvbmZpZzogb1R5cGVDb25maWcsXG5cdFx0dmlzdWFsU2V0dGluZ3M6IGlzRGF0YVBvaW50RmFrZVByb3BlcnR5ID8geyB3aWR0aENhbGN1bGF0aW9uOiBudWxsIH0gOiB1bmRlZmluZWQsXG5cdFx0aW1wb3J0YW5jZTogZ2V0SW1wb3J0YW5jZSgocHJvcGVydHkgYXMgYW55KS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQsIHNlbWFudGljS2V5cylcblx0fTtcblx0Y29uc3Qgc1Rvb2x0aXAgPSBfZ2V0VG9vbHRpcChwcm9wZXJ0eSk7XG5cdGlmIChzVG9vbHRpcCkge1xuXHRcdG9Db2x1bW4udG9vbHRpcCA9IHNUb29sdGlwO1xuXHR9XG5cblx0cmV0dXJuIG9Db2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIEJvb2xlYW4gdHJ1ZSBmb3IgdmFsaWQgY29sdW1ucywgZmFsc2UgZm9yIGludmFsaWQgY29sdW1ucy5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERpZmZlcmVudCBEYXRhRmllbGQgdHlwZXMgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEByZXR1cm5zIFRydWUgZm9yIHZhbGlkIGNvbHVtbnMsIGZhbHNlIGZvciBpbnZhbGlkIGNvbHVtbnNcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IF9pc1ZhbGlkQ29sdW1uID0gZnVuY3Rpb24gKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykge1xuXHRzd2l0Y2ggKGRhdGFGaWVsZC4kVHlwZSkge1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0cmV0dXJuICEhZGF0YUZpZWxkLklubGluZTtcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRkZWZhdWx0OlxuXHRcdC8vIFRvZG86IFJlcGxhY2Ugd2l0aCBwcm9wZXIgTG9nIHN0YXRlbWVudCBvbmNlIGF2YWlsYWJsZVxuXHRcdC8vICB0aHJvdyBuZXcgRXJyb3IoXCJVbmhhbmRsZWQgRGF0YUZpZWxkIEFic3RyYWN0IHR5cGU6IFwiICsgZGF0YUZpZWxkLiRUeXBlKTtcblx0fVxufTtcbi8qKlxuICogUmV0dXJucyB0aGUgYmluZGluZyBleHByZXNzaW9uIHRvIGV2YWx1YXRlIHRoZSB2aXNpYmlsaXR5IG9mIGEgRGF0YUZpZWxkIG9yIERhdGFQb2ludCBhbm5vdGF0aW9uLlxuICpcbiAqIFNBUCBGaW9yaSBlbGVtZW50cyB3aWxsIGV2YWx1YXRlIGVpdGhlciB0aGUgVUkuSGlkZGVuIGFubm90YXRpb24gZGVmaW5lZCBvbiB0aGUgYW5ub3RhdGlvbiBpdHNlbGYgb3Igb24gdGhlIHRhcmdldCBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkTW9kZWxQYXRoIFRoZSBtZXRhcGF0aCByZWZlcnJpbmcgdG8gdGhlIGFubm90YXRpb24gdGhhdCBpcyBldmFsdWF0ZWQgYnkgU0FQIEZpb3JpIGVsZW1lbnRzLlxuICogQHBhcmFtIFtmb3JtYXRPcHRpb25zXSBGb3JtYXRPcHRpb25zIG9wdGlvbmFsLlxuICogQHBhcmFtIGZvcm1hdE9wdGlvbnMuaXNBbmFseXRpY3MgVGhpcyBmbGFnIGlzIHVzZWQgdG8gY2hlY2sgaWYgdGhlIGFuYWx5dGljIHRhYmxlIGhhcyBHcm91cEhlYWRlciBleHBhbmRlZC5cbiAqIEByZXR1cm5zIEFuIGV4cHJlc3Npb24gdGhhdCB5b3UgY2FuIGJpbmQgdG8gdGhlIFVJLlxuICovXG5leHBvcnQgY29uc3QgX2dldFZpc2libGVFeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRkYXRhRmllbGRNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGZvcm1hdE9wdGlvbnM/OiBhbnlcbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxhbnk+IHtcblx0Y29uc3QgdGFyZ2V0T2JqZWN0OiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgRGF0YVBvaW50VHlwZVR5cGVzID0gZGF0YUZpZWxkTW9kZWxQYXRoLnRhcmdldE9iamVjdDtcblx0bGV0IHByb3BlcnR5VmFsdWU7XG5cdGlmICh0YXJnZXRPYmplY3QpIHtcblx0XHRzd2l0Y2ggKHRhcmdldE9iamVjdC4kVHlwZSkge1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZTpcblx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IHRhcmdldE9iamVjdC5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRcdFx0Ly8gaWYgaXQgaXMgYSBEYXRhRmllbGRGb3JBbm5vdGF0aW9uIHBvaW50aW5nIHRvIGEgRGF0YVBvaW50IHdlIGxvb2sgYXQgdGhlIGRhdGFQb2ludCdzIHZhbHVlXG5cdFx0XHRcdGlmICh0YXJnZXRPYmplY3Q/LlRhcmdldD8uJHRhcmdldD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGUpIHtcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdGFyZ2V0T2JqZWN0LlRhcmdldC4kdGFyZ2V0Py5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjpcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHByb3BlcnR5VmFsdWUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdGNvbnN0IGlzQW5hbHl0aWNhbEdyb3VwSGVhZGVyRXhwYW5kZWQgPSBmb3JtYXRPcHRpb25zPy5pc0FuYWx5dGljcyA/IFVJLklzRXhwYW5kZWQgOiBjb25zdGFudChmYWxzZSk7XG5cdGNvbnN0IGlzQW5hbHl0aWNhbExlYWYgPSBmb3JtYXRPcHRpb25zPy5pc0FuYWx5dGljcyA/IGVxdWFsKFVJLk5vZGVMZXZlbCwgMCkgOiBjb25zdGFudChmYWxzZSk7XG5cblx0Ly8gQSBkYXRhIGZpZWxkIGlzIHZpc2libGUgaWY6XG5cdC8vIC0gdGhlIFVJLkhpZGRlbiBleHByZXNzaW9uIGluIHRoZSBvcmlnaW5hbCBhbm5vdGF0aW9uIGRvZXMgbm90IGV2YWx1YXRlIHRvICd0cnVlJ1xuXHQvLyAtIHRoZSBVSS5IaWRkZW4gZXhwcmVzc2lvbiBpbiB0aGUgdGFyZ2V0IHByb3BlcnR5IGRvZXMgbm90IGV2YWx1YXRlIHRvICd0cnVlJ1xuXHQvLyAtIGluIGNhc2Ugb2YgQW5hbHl0aWNzIGl0J3Mgbm90IHZpc2libGUgZm9yIGFuIGV4cGFuZGVkIEdyb3VwSGVhZGVyXG5cdHJldHVybiBhbmQoXG5cdFx0Li4uW1xuXHRcdFx0bm90KGVxdWFsKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbih0YXJnZXRPYmplY3Q/LmFubm90YXRpb25zPy5VST8uSGlkZGVuKSwgdHJ1ZSkpLFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHQhIXByb3BlcnR5VmFsdWUsXG5cdFx0XHRcdHByb3BlcnR5VmFsdWUgJiYgbm90KGVxdWFsKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihwcm9wZXJ0eVZhbHVlLmFubm90YXRpb25zPy5VST8uSGlkZGVuKSwgdHJ1ZSkpLFxuXHRcdFx0XHR0cnVlXG5cdFx0XHQpLFxuXHRcdFx0b3Iobm90KGlzQW5hbHl0aWNhbEdyb3VwSGVhZGVyRXhwYW5kZWQpLCBpc0FuYWx5dGljYWxMZWFmKVxuXHRcdF1cblx0KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBoaWRkZW4gYmluZGluZyBleHByZXNzaW9ucyBmb3IgYSBmaWVsZCBncm91cC5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkR3JvdXAgRGF0YUZpZWxkIGRlZmluZWQgaW4gdGhlIGFubm90YXRpb25zXG4gKiBAcGFyYW0gZmllbGRGb3JtYXRPcHRpb25zIEZvcm1hdE9wdGlvbnMgb3B0aW9uYWwuXG4gKiBAcGFyYW0gZmllbGRGb3JtYXRPcHRpb25zLmlzQW5hbHl0aWNzIFRoaXMgZmxhZyBpcyB1c2VkIHRvIGNoZWNrIGlmIHRoZSBhbmFseXRpYyB0YWJsZSBoYXMgR3JvdXBIZWFkZXIgZXhwYW5kZWQuXG4gKiBAcmV0dXJucyBDb21waWxlIGJpbmRpbmcgb2YgZmllbGQgZ3JvdXAgZXhwcmVzc2lvbnMuXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBfZ2V0RmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zID0gZnVuY3Rpb24gKFxuXHRkYXRhRmllbGRHcm91cDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0ZmllbGRGb3JtYXRPcHRpb25zOiBhbnlcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgYUZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9uczogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGFueT5bXSA9IFtdO1xuXHRpZiAoXG5cdFx0ZGF0YUZpZWxkR3JvdXAuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiZcblx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZVxuXHQpIHtcblx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQuJHRhcmdldC5EYXRhPy5mb3JFYWNoKChpbm5lckRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcykgPT4ge1xuXHRcdFx0YUZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucy5wdXNoKFxuXHRcdFx0XHRfZ2V0VmlzaWJsZUV4cHJlc3Npb24oeyB0YXJnZXRPYmplY3Q6IGlubmVyRGF0YUZpZWxkIH0gYXMgRGF0YU1vZGVsT2JqZWN0UGF0aCwgZmllbGRGb3JtYXRPcHRpb25zKVxuXHRcdFx0KTtcblx0XHR9KTtcblx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oaWZFbHNlKG9yKC4uLmFGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMpLCBjb25zdGFudCh0cnVlKSwgY29uc3RhbnQoZmFsc2UpKSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsYWJlbCBmb3IgdGhlIHByb3BlcnR5IGFuZCBkYXRhRmllbGQuXG4gKlxuICogQHBhcmFtIFtwcm9wZXJ0eV0gUHJvcGVydHkgb3IgRGF0YUZpZWxkIGRlZmluZWQgaW4gdGhlIGFubm90YXRpb25zXG4gKiBAcGFyYW0gaXNHcm91cFxuICogQHJldHVybnMgTGFiZWwgb2YgdGhlIHByb3BlcnR5IG9yIERhdGFGaWVsZFxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgX2dldExhYmVsID0gZnVuY3Rpb24gKHByb3BlcnR5OiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHksIGlzR3JvdXA6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmICghcHJvcGVydHkpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGlmIChpc1Byb3BlcnR5KHByb3BlcnR5KSkge1xuXHRcdGNvbnN0IGRhdGFGaWVsZERlZmF1bHQgPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQ7XG5cdFx0aWYgKGRhdGFGaWVsZERlZmF1bHQgJiYgIWRhdGFGaWVsZERlZmF1bHQucXVhbGlmaWVyICYmIGRhdGFGaWVsZERlZmF1bHQuTGFiZWw/LnZhbHVlT2YoKSkge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihkYXRhRmllbGREZWZhdWx0LkxhYmVsPy52YWx1ZU9mKCkpKTtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihwcm9wZXJ0eS5hbm5vdGF0aW9ucy5Db21tb24/LkxhYmVsPy52YWx1ZU9mKCkgfHwgcHJvcGVydHkubmFtZSkpO1xuXHR9IGVsc2UgaWYgKGlzRGF0YUZpZWxkVHlwZXMocHJvcGVydHkpKSB7XG5cdFx0aWYgKCEhaXNHcm91cCAmJiBwcm9wZXJ0eS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihwcm9wZXJ0eS5MYWJlbD8udmFsdWVPZigpKSk7XG5cdFx0fVxuXHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihcblx0XHRcdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihcblx0XHRcdFx0cHJvcGVydHkuTGFiZWw/LnZhbHVlT2YoKSB8fCBwcm9wZXJ0eS5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uTGFiZWw/LnZhbHVlT2YoKSB8fCBwcm9wZXJ0eS5WYWx1ZT8uJHRhcmdldD8ubmFtZVxuXHRcdFx0KVxuXHRcdCk7XG5cdH0gZWxzZSBpZiAocHJvcGVydHkuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24pIHtcblx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oXG5cdFx0XHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24oXG5cdFx0XHRcdHByb3BlcnR5LkxhYmVsPy52YWx1ZU9mKCkgfHwgKHByb3BlcnR5LlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQpPy5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uTGFiZWw/LnZhbHVlT2YoKVxuXHRcdFx0KVxuXHRcdCk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihwcm9wZXJ0eS5MYWJlbD8udmFsdWVPZigpKSk7XG5cdH1cbn07XG5cbmNvbnN0IF9nZXRUb29sdGlwID0gZnVuY3Rpb24gKHNvdXJjZTogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0aWYgKCFzb3VyY2UpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0aWYgKGlzUHJvcGVydHkoc291cmNlKSB8fCBzb3VyY2UuYW5ub3RhdGlvbnM/LkNvbW1vbj8uUXVpY2tJbmZvKSB7XG5cdFx0cmV0dXJuIHNvdXJjZS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5RdWlja0luZm9cblx0XHRcdD8gY29tcGlsZUV4cHJlc3Npb24oZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHNvdXJjZS5hbm5vdGF0aW9ucy5Db21tb24uUXVpY2tJbmZvLnZhbHVlT2YoKSkpXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmIChpc0RhdGFGaWVsZFR5cGVzKHNvdXJjZSkpIHtcblx0XHRyZXR1cm4gc291cmNlLlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5RdWlja0luZm9cblx0XHRcdD8gY29tcGlsZUV4cHJlc3Npb24oZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHNvdXJjZS5WYWx1ZS4kdGFyZ2V0LmFubm90YXRpb25zLkNvbW1vbi5RdWlja0luZm8udmFsdWVPZigpKSlcblx0XHRcdDogdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKHNvdXJjZS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikge1xuXHRcdGNvbnN0IGRhdGFwb2ludFRhcmdldCA9IHNvdXJjZS5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50O1xuXHRcdHJldHVybiBkYXRhcG9pbnRUYXJnZXQ/LlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5RdWlja0luZm9cblx0XHRcdD8gY29tcGlsZUV4cHJlc3Npb24oZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKGRhdGFwb2ludFRhcmdldC5WYWx1ZS4kdGFyZ2V0LmFubm90YXRpb25zLkNvbW1vbi5RdWlja0luZm8udmFsdWVPZigpKSlcblx0XHRcdDogdW5kZWZpbmVkO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn07XG5leHBvcnQgZnVuY3Rpb24gZ2V0Um93U3RhdHVzVmlzaWJpbGl0eSgpOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gZm9ybWF0UmVzdWx0KFxuXHRcdFtwYXRoSW5Nb2RlbChgc2VtYW50aWNLZXlIYXNEcmFmdEluZGljYXRvcmAsIFwiaW50ZXJuYWxcIiksIHBhdGhJbk1vZGVsKGBmaWx0ZXJlZE1lc3NhZ2VzYCwgXCJpbnRlcm5hbFwiKV0sXG5cdFx0dGFibGVGb3JtYXR0ZXJzLmdldEVycm9yU3RhdHVzVGV4dFZpc2liaWxpdHlGb3JtYXR0ZXJcblx0KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIFByb3BlcnR5SW5mbyBmb3IgZWFjaCBpZGVudGlmaWVkIHByb3BlcnR5IGNvbnN1bWVkIGJ5IGEgTGluZUl0ZW0uXG4gKlxuICogQHBhcmFtIGNvbHVtbnNUb0JlQ3JlYXRlZCBJZGVudGlmaWVkIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gZXhpc3RpbmdDb2x1bW5zIFRoZSBsaXN0IG9mIGNvbHVtbnMgY3JlYXRlZCBmb3IgTGluZUl0ZW1zIGFuZCBQcm9wZXJ0aWVzIG9mIGVudGl0eVR5cGUuXG4gKiBAcGFyYW0gbm9uU29ydGFibGVDb2x1bW5zIFRoZSBhcnJheSBvZiBjb2x1bW4gbmFtZXMgd2hpY2ggY2Fubm90IGJlIHNvcnRlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBlbnRpdHkgdHlwZSBmb3IgdGhlIExpbmVJdGVtXG4gKiBAcmV0dXJucyBUaGUgYXJyYXkgb2YgY29sdW1ucyBjcmVhdGVkLlxuICovXG5jb25zdCBfY3JlYXRlUmVsYXRlZENvbHVtbnMgPSBmdW5jdGlvbiAoXG5cdGNvbHVtbnNUb0JlQ3JlYXRlZDogUmVjb3JkPHN0cmluZywgUHJvcGVydHk+LFxuXHRleGlzdGluZ0NvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRub25Tb3J0YWJsZUNvbHVtbnM6IHN0cmluZ1tdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlXG4pOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSB7XG5cdGNvbnN0IHJlbGF0ZWRDb2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSA9IFtdO1xuXHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXG5cdE9iamVjdC5rZXlzKGNvbHVtbnNUb0JlQ3JlYXRlZCkuZm9yRWFjaCgobmFtZSkgPT4ge1xuXHRcdGNvbnN0IHByb3BlcnR5ID0gY29sdW1uc1RvQmVDcmVhdGVkW25hbWVdLFxuXHRcdFx0YW5ub3RhdGlvblBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFic29sdXRlQW5ub3RhdGlvblBhdGgobmFtZSksXG5cdFx0XHQvLyBDaGVjayB3aGV0aGVyIHRoZSByZWxhdGVkIGNvbHVtbiBhbHJlYWR5IGV4aXN0cy5cblx0XHRcdHJlbGF0ZWRDb2x1bW4gPSBleGlzdGluZ0NvbHVtbnMuZmluZCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA9PT0gbmFtZSk7XG5cdFx0aWYgKHJlbGF0ZWRDb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gQ2FzZSAxOiBLZXkgY29udGFpbnMgRGF0YUZpZWxkIHByZWZpeCB0byBlbnN1cmUgYWxsIHByb3BlcnR5IGNvbHVtbnMgaGF2ZSB0aGUgc2FtZSBrZXkgZm9ybWF0LlxuXHRcdFx0Ly8gTmV3IGNyZWF0ZWQgcHJvcGVydHkgY29sdW1uIGlzIHNldCB0byBoaWRkZW4uXG5cdFx0XHRyZWxhdGVkQ29sdW1ucy5wdXNoKFxuXHRcdFx0XHRnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5KFxuXHRcdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRcdGFubm90YXRpb25QYXRoLFxuXHRcdFx0XHRcdG5hbWUsXG5cdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRub25Tb3J0YWJsZUNvbHVtbnMsXG5cdFx0XHRcdFx0YWdncmVnYXRpb25IZWxwZXIsXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRyZWxhdGVkQ29sdW1uLmFubm90YXRpb25QYXRoICE9PSBhbm5vdGF0aW9uUGF0aCB8fFxuXHRcdFx0KHJlbGF0ZWRDb2x1bW4ucHJvcGVydHlJbmZvcyAmJiByZWxhdGVkQ29sdW1uLnByb3BlcnR5SW5mb3MuaW5kZXhPZihuYW1lKSAhPT0gLTEpXG5cdFx0KSB7XG5cdFx0XHQvLyBDYXNlIDI6IFRoZSBleGlzdGluZyBjb2x1bW4gcG9pbnRzIHRvIGEgTGluZUl0ZW0gKG9yKVxuXHRcdFx0Ly8gQ2FzZSAzOiBUaGlzIGlzIGEgc2VsZiByZWZlcmVuY2UgZnJvbSBhbiBleGlzdGluZyBjb2x1bW4gYW5kXG5cdFx0XHQvLyBib3RoIGNhc2VzIHJlcXVpcmUgYSBkdW1teSBQcm9wZXJ0eUluZm8gZm9yIHNldHRpbmcgY29ycmVjdCBleHBvcnQgc2V0dGluZ3MuXG5cblx0XHRcdGNvbnN0IG5ld05hbWUgPSBgUHJvcGVydHk6OiR7bmFtZX1gO1xuXG5cdFx0XHQvLyBDaGVja2luZyB3aGV0aGVyIHRoZSByZWxhdGVkIHByb3BlcnR5IGNvbHVtbiBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgaW4gYSBwcmV2aW91cyBpdGVyYXRpb24uXG5cdFx0XHRpZiAoIWV4aXN0aW5nQ29sdW1ucy5zb21lKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lID09PSBuZXdOYW1lKSkge1xuXHRcdFx0XHQvLyBDcmVhdGUgYSBuZXcgcHJvcGVydHkgY29sdW1uIHdpdGggJ1Byb3BlcnR5OjonIHByZWZpeCxcblx0XHRcdFx0Ly8gU2V0IGl0IHRvIGhpZGRlbiBhcyBpdCBpcyBvbmx5IGNvbnN1bWVkIGJ5IENvbXBsZXggcHJvcGVydHkgaW5mb3MuXG5cdFx0XHRcdGNvbnN0IGNvbHVtbiA9IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdFx0YW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRub25Tb3J0YWJsZUNvbHVtbnMsXG5cdFx0XHRcdFx0YWdncmVnYXRpb25IZWxwZXIsXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb2x1bW4uaXNQYXJ0T2ZMaW5lSXRlbSA9IHJlbGF0ZWRDb2x1bW4uaXNQYXJ0T2ZMaW5lSXRlbTtcblx0XHRcdFx0cmVsYXRlZENvbHVtbnMucHVzaChjb2x1bW4pO1xuXHRcdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lTWFwW25hbWVdID0gbmV3TmFtZTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdC8vIFRoZSBwcm9wZXJ0eSAnbmFtZScgaGFzIGJlZW4gcHJlZml4ZWQgd2l0aCAnUHJvcGVydHk6OicgZm9yIHVuaXF1ZW5lc3MuXG5cdC8vIFVwZGF0ZSB0aGUgc2FtZSBpbiBvdGhlciBwcm9wZXJ0eUluZm9zW10gcmVmZXJlbmNlcyB3aGljaCBwb2ludCB0byB0aGlzIHByb3BlcnR5LlxuXHRleGlzdGluZ0NvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG5cdFx0Y29sdW1uLnByb3BlcnR5SW5mb3MgPSBjb2x1bW4ucHJvcGVydHlJbmZvcz8ubWFwKChwcm9wZXJ0eUluZm8pID0+IHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXBbcHJvcGVydHlJbmZvXSA/PyBwcm9wZXJ0eUluZm8pO1xuXHRcdGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcyA9IGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcz8ubWFwKFxuXHRcdFx0KHByb3BlcnR5SW5mbykgPT4gcmVsYXRlZFByb3BlcnR5TmFtZU1hcFtwcm9wZXJ0eUluZm9dID8/IHByb3BlcnR5SW5mb1xuXHRcdCk7XG5cdH0pO1xuXG5cdHJldHVybiByZWxhdGVkQ29sdW1ucztcbn07XG5cbi8qKlxuICogR2V0dGluZyB0aGUgQ29sdW1uIE5hbWVcbiAqIElmIGl0IHBvaW50cyB0byBhIERhdGFGaWVsZCB3aXRoIG9uZSBwcm9wZXJ0eSBvciBEYXRhUG9pbnQgd2l0aCBvbmUgcHJvcGVydHksIGl0IHdpbGwgdXNlIHRoZSBwcm9wZXJ0eSBuYW1lXG4gKiBoZXJlIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgZXhpc3RpbmcgZmxleCBjaGFuZ2VzLlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGQgRGlmZmVyZW50IERhdGFGaWVsZCB0eXBlcyBkZWZpbmVkIGluIHRoZSBhbm5vdGF0aW9uc1xuICogQHJldHVybnMgVGhlIG5hbWUgb2YgYW5ub3RhdGlvbiBjb2x1bW5zXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBfZ2V0QW5ub3RhdGlvbkNvbHVtbk5hbWUgPSBmdW5jdGlvbiAoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKSB7XG5cdC8vIFRoaXMgaXMgbmVlZGVkIGFzIHdlIGhhdmUgZmxleGliaWxpdHkgY2hhbmdlcyBhbHJlYWR5IHRoYXQgd2UgaGF2ZSB0byBjaGVjayBhZ2FpbnN0XG5cdGlmIChpc0RhdGFGaWVsZFR5cGVzKGRhdGFGaWVsZCkpIHtcblx0XHRyZXR1cm4gZGF0YUZpZWxkLlZhbHVlPy5wYXRoO1xuXHR9IGVsc2UgaWYgKGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiAmJiAoZGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQpPy5WYWx1ZT8ucGF0aCkge1xuXHRcdC8vIFRoaXMgaXMgZm9yIHJlbW92aW5nIGR1cGxpY2F0ZSBwcm9wZXJ0aWVzLiBGb3IgZXhhbXBsZSwgJ1Byb2dyZXNzJyBQcm9wZXJ0eSBpcyByZW1vdmVkIGlmIGl0IGlzIGFscmVhZHkgZGVmaW5lZCBhcyBhIERhdGFQb2ludFxuXHRcdHJldHVybiAoZGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQpPy5WYWx1ZS5wYXRoO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZCk7XG5cdH1cbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YSBmaWVsZCBsYWJlbHMgaGF2ZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRhYmxlLlxuICpcbiAqIEBwYXJhbSBmaWVsZEdyb3VwTmFtZSBUaGUgYERhdGFGaWVsZGAgbmFtZSBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0gdmlzdWFsaXphdGlvblBhdGhcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyBgc2hvd0RhdGFGaWVsZHNMYWJlbGAgdmFsdWUgZnJvbSB0aGUgbWFuaWZlc3RcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IF9nZXRTaG93RGF0YUZpZWxkc0xhYmVsID0gZnVuY3Rpb24gKGZpZWxkR3JvdXBOYW1lOiBzdHJpbmcsIHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBib29sZWFuIHtcblx0Y29uc3Qgb0NvbHVtbnMgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpPy5jb2x1bW5zO1xuXHRjb25zdCBhQ29sdW1uS2V5cyA9IG9Db2x1bW5zICYmIE9iamVjdC5rZXlzKG9Db2x1bW5zKTtcblx0cmV0dXJuIChcblx0XHRhQ29sdW1uS2V5cyAmJlxuXHRcdCEhYUNvbHVtbktleXMuZmluZChmdW5jdGlvbiAoa2V5OiBzdHJpbmcpIHtcblx0XHRcdHJldHVybiBrZXkgPT09IGZpZWxkR3JvdXBOYW1lICYmIG9Db2x1bW5zW2tleV0uc2hvd0RhdGFGaWVsZHNMYWJlbDtcblx0XHR9KVxuXHQpO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB3aXRoIHJlc3BlY3QgdG8gdGhlIHJvb3QgZW50aXR5LlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGQgVGhlIGBEYXRhRmllbGRgIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRoXG4gKi9cbmNvbnN0IF9nZXRSZWxhdGl2ZVBhdGggPSBmdW5jdGlvbiAoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogc3RyaW5nIHtcblx0bGV0IHJlbGF0aXZlUGF0aDogc3RyaW5nID0gXCJcIjtcblxuXHRzd2l0Y2ggKGRhdGFGaWVsZC4kVHlwZSkge1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoQWN0aW9uOlxuXHRcdFx0cmVsYXRpdmVQYXRoID0gKGRhdGFGaWVsZCBhcyBEYXRhRmllbGQpPy5WYWx1ZT8ucGF0aDtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uOlxuXHRcdFx0cmVsYXRpdmVQYXRoID0gZGF0YUZpZWxkPy5UYXJnZXQ/LnZhbHVlO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbkdyb3VwOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbkdyb3VwOlxuXHRcdFx0cmVsYXRpdmVQYXRoID0gS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpO1xuXHRcdFx0YnJlYWs7XG5cdH1cblxuXHRyZXR1cm4gcmVsYXRpdmVQYXRoO1xufTtcblxuY29uc3QgX3NsaWNlQXRTbGFzaCA9IGZ1bmN0aW9uIChwYXRoOiBzdHJpbmcsIGlzTGFzdFNsYXNoOiBib29sZWFuLCBpc0xhc3RQYXJ0OiBib29sZWFuKSB7XG5cdGNvbnN0IGlTbGFzaEluZGV4ID0gaXNMYXN0U2xhc2ggPyBwYXRoLmxhc3RJbmRleE9mKFwiL1wiKSA6IHBhdGguaW5kZXhPZihcIi9cIik7XG5cblx0aWYgKGlTbGFzaEluZGV4ID09PSAtMSkge1xuXHRcdHJldHVybiBwYXRoO1xuXHR9XG5cdHJldHVybiBpc0xhc3RQYXJ0ID8gcGF0aC5zdWJzdHJpbmcoaVNsYXNoSW5kZXggKyAxLCBwYXRoLmxlbmd0aCkgOiBwYXRoLnN1YnN0cmluZygwLCBpU2xhc2hJbmRleCk7XG59O1xuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIGEgY29sdW1uIGlzIHNvcnRhYmxlLlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGQgVGhlIGRhdGEgZmllbGQgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gcHJvcGVydHlQYXRoIFRoZSBwcm9wZXJ0eSBwYXRoXG4gKiBAcGFyYW0gbm9uU29ydGFibGVDb2x1bW5zIENvbGxlY3Rpb24gb2Ygbm9uLXNvcnRhYmxlIGNvbHVtbiBuYW1lcyBhcyBwZXIgYW5ub3RhdGlvblxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY29sdW1uIGlzIHNvcnRhYmxlXG4gKi9cbmNvbnN0IF9pc0NvbHVtblNvcnRhYmxlID0gZnVuY3Rpb24gKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcywgcHJvcGVydHlQYXRoOiBzdHJpbmcsIG5vblNvcnRhYmxlQ29sdW1uczogc3RyaW5nW10pOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHRub25Tb3J0YWJsZUNvbHVtbnMuaW5kZXhPZihwcm9wZXJ0eVBhdGgpID09PSAtMSAmJiAvLyBDb2x1bW4gaXMgbm90IG1hcmtlZCBhcyBub24tc29ydGFibGUgdmlhIGFubm90YXRpb25cblx0XHQoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQgfHxcblx0XHRcdGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybCB8fFxuXHRcdFx0ZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uIHx8XG5cdFx0XHRkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb24pXG5cdCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBmaWx0ZXJpbmcgb24gdGhlIHRhYmxlIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFJldHVybnMgJ2ZhbHNlJyBpZiBGaWx0ZXJGdW5jdGlvbnMgYW5ub3RhdGlvbiBzdXBwb3J0cyAndG9sb3dlcicsIGVsc2UgJ3RydWUnXG4gKi9cbmV4cG9ydCBjb25zdCBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUgPSBmdW5jdGlvbiAoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRjb25zdCBmaWx0ZXJGdW5jdGlvbnM6IEZpbHRlckZ1bmN0aW9ucyB8IHVuZGVmaW5lZCA9XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKT8uYW5ub3RhdGlvbnM/LkNhcGFiaWxpdGllcz8uRmlsdGVyRnVuY3Rpb25zIHx8XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlDb250YWluZXIoKS5hbm5vdGF0aW9ucz8uQ2FwYWJpbGl0aWVzPy5GaWx0ZXJGdW5jdGlvbnM7XG5cdHJldHVybiBBcnJheS5pc0FycmF5KGZpbHRlckZ1bmN0aW9ucykgPyAoZmlsdGVyRnVuY3Rpb25zIGFzIFN0cmluZ1tdKS5pbmRleE9mKFwidG9sb3dlclwiKSA9PT0gLTEgOiB0cnVlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGRlZmF1bHQgZm9ybWF0IG9wdGlvbnMgZm9yIHRleHQgZmllbGRzIGluIGEgdGFibGUuXG4gKlxuICogQHJldHVybnMgQ29sbGVjdGlvbiBvZiBmb3JtYXQgb3B0aW9ucyB3aXRoIGRlZmF1bHQgdmFsdWVzXG4gKi9cbmZ1bmN0aW9uIGdldERlZmF1bHRGb3JtYXRPcHRpb25zRm9yVGFibGUoKTogRm9ybWF0T3B0aW9uc1R5cGUge1xuXHRyZXR1cm4ge1xuXHRcdHRleHRMaW5lc0VkaXQ6IDRcblx0fTtcbn1cblxuZnVuY3Rpb24gX2ZpbmRTZW1hbnRpY0tleVZhbHVlcyhzZW1hbnRpY0tleXM6IGFueVtdLCBuYW1lOiBzdHJpbmcpOiBhbnkge1xuXHRjb25zdCBhU2VtYW50aWNLZXlWYWx1ZXM6IHN0cmluZ1tdID0gW107XG5cdGxldCBiU2VtYW50aWNLZXlGb3VuZCA9IGZhbHNlO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IHNlbWFudGljS2V5cy5sZW5ndGg7IGkrKykge1xuXHRcdGFTZW1hbnRpY0tleVZhbHVlcy5wdXNoKHNlbWFudGljS2V5c1tpXS52YWx1ZSk7XG5cdFx0aWYgKHNlbWFudGljS2V5c1tpXS52YWx1ZSA9PT0gbmFtZSkge1xuXHRcdFx0YlNlbWFudGljS2V5Rm91bmQgPSB0cnVlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4ge1xuXHRcdHZhbHVlczogYVNlbWFudGljS2V5VmFsdWVzLFxuXHRcdHNlbWFudGljS2V5Rm91bmQ6IGJTZW1hbnRpY0tleUZvdW5kXG5cdH07XG59XG5cbmZ1bmN0aW9uIF9maW5kUHJvcGVydGllcyhzZW1hbnRpY0tleVZhbHVlczogYW55W10sIGZpZWxkR3JvdXBQcm9wZXJ0aWVzOiBhbnlbXSkge1xuXHRsZXQgc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCA9IGZhbHNlO1xuXHRsZXQgc1Byb3BlcnR5UGF0aDtcblx0aWYgKHNlbWFudGljS2V5VmFsdWVzICYmIHNlbWFudGljS2V5VmFsdWVzLmxlbmd0aCA+PSAxICYmIGZpZWxkR3JvdXBQcm9wZXJ0aWVzICYmIGZpZWxkR3JvdXBQcm9wZXJ0aWVzLmxlbmd0aCA+PSAxKSB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzZW1hbnRpY0tleVZhbHVlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKFtzZW1hbnRpY0tleVZhbHVlc1tpXV0uc29tZSgodG1wKSA9PiBmaWVsZEdyb3VwUHJvcGVydGllcy5pbmRleE9mKHRtcCkgPj0gMCkpIHtcblx0XHRcdFx0c2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCA9IHRydWU7XG5cdFx0XHRcdHNQcm9wZXJ0eVBhdGggPSBzZW1hbnRpY0tleVZhbHVlc1tpXTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7XG5cdFx0c2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cDogc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCxcblx0XHRmaWVsZEdyb3VwUHJvcGVydHlQYXRoOiBzUHJvcGVydHlQYXRoXG5cdH07XG59XG5cbmZ1bmN0aW9uIF9maW5kU2VtYW50aWNLZXlWYWx1ZXNJbkZpZWxkR3JvdXAoZGF0YUZpZWxkR3JvdXA6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBudWxsLCBzZW1hbnRpY0tleVZhbHVlczogW10pOiBhbnkge1xuXHRjb25zdCBhUHJvcGVydGllczogYW55W10gPSBbXTtcblx0bGV0IF9wcm9wZXJ0aWVzRm91bmQ6IHsgc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cDogYm9vbGVhbjsgZmllbGRHcm91cFByb3BlcnR5UGF0aDogYW55IH0gPSB7XG5cdFx0c2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cDogZmFsc2UsXG5cdFx0ZmllbGRHcm91cFByb3BlcnR5UGF0aDogdW5kZWZpbmVkXG5cdH07XG5cdGlmIChcblx0XHRkYXRhRmllbGRHcm91cCAmJlxuXHRcdGRhdGFGaWVsZEdyb3VwLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uICYmXG5cdFx0ZGF0YUZpZWxkR3JvdXAuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRmllbGRHcm91cFR5cGVcblx0KSB7XG5cdFx0ZGF0YUZpZWxkR3JvdXAuVGFyZ2V0LiR0YXJnZXQuRGF0YT8uZm9yRWFjaCgoaW5uZXJEYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRcdGlmIChcblx0XHRcdFx0KGlubmVyRGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQgfHwgaW5uZXJEYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmwpICYmXG5cdFx0XHRcdGlubmVyRGF0YUZpZWxkLlZhbHVlXG5cdFx0XHQpIHtcblx0XHRcdFx0YVByb3BlcnRpZXMucHVzaChpbm5lckRhdGFGaWVsZC5WYWx1ZS5wYXRoKTtcblx0XHRcdH1cblx0XHRcdF9wcm9wZXJ0aWVzRm91bmQgPSBfZmluZFByb3BlcnRpZXMoc2VtYW50aWNLZXlWYWx1ZXMsIGFQcm9wZXJ0aWVzKTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXA6IF9wcm9wZXJ0aWVzRm91bmQuc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCxcblx0XHRwcm9wZXJ0eVBhdGg6IF9wcm9wZXJ0aWVzRm91bmQuZmllbGRHcm91cFByb3BlcnR5UGF0aFxuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgZGVmYXVsdCBmb3JtYXQgb3B0aW9ucyB3aXRoIGRyYWZ0SW5kaWNhdG9yIGZvciBhIGNvbHVtbi5cbiAqXG4gKiBAcGFyYW0gbmFtZVxuICogQHBhcmFtIHNlbWFudGljS2V5c1xuICogQHBhcmFtIGlzRmllbGRHcm91cENvbHVtblxuICogQHBhcmFtIGRhdGFGaWVsZEdyb3VwXG4gKiBAcmV0dXJucyBDb2xsZWN0aW9uIG9mIGZvcm1hdCBvcHRpb25zIHdpdGggZGVmYXVsdCB2YWx1ZXNcbiAqL1xuZnVuY3Rpb24gZ2V0RGVmYXVsdERyYWZ0SW5kaWNhdG9yRm9yQ29sdW1uKFxuXHRuYW1lOiBzdHJpbmcsXG5cdHNlbWFudGljS2V5czogYW55W10sXG5cdGlzRmllbGRHcm91cENvbHVtbjogYm9vbGVhbixcblx0ZGF0YUZpZWxkR3JvdXA6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBudWxsXG4pIHtcblx0aWYgKCFzZW1hbnRpY0tleXMpIHtcblx0XHRyZXR1cm4ge307XG5cdH1cblx0Y29uc3Qgc2VtYW50aWNLZXkgPSBfZmluZFNlbWFudGljS2V5VmFsdWVzKHNlbWFudGljS2V5cywgbmFtZSk7XG5cdGNvbnN0IHNlbWFudGljS2V5SW5GaWVsZEdyb3VwID0gX2ZpbmRTZW1hbnRpY0tleVZhbHVlc0luRmllbGRHcm91cChkYXRhRmllbGRHcm91cCwgc2VtYW50aWNLZXkudmFsdWVzKTtcblx0aWYgKHNlbWFudGljS2V5LnNlbWFudGljS2V5Rm91bmQpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aGFzRHJhZnRJbmRpY2F0b3I6IHRydWUsXG5cdFx0XHRzZW1hbnRpY2tleXM6IHNlbWFudGljS2V5LnZhbHVlcyxcblx0XHRcdG9iamVjdFN0YXR1c1RleHRWaXNpYmlsaXR5OiBjb21waWxlRXhwcmVzc2lvbihnZXRSb3dTdGF0dXNWaXNpYmlsaXR5KCkpXG5cdFx0fTtcblx0fSBlbHNlIGlmICghc2VtYW50aWNLZXlJbkZpZWxkR3JvdXAuc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCkge1xuXHRcdHJldHVybiB7fTtcblx0fSBlbHNlIHtcblx0XHQvLyBTZW1hbnRpYyBLZXkgaGFzIGEgcHJvcGVydHkgaW4gYSBGaWVsZEdyb3VwXG5cdFx0cmV0dXJuIHtcblx0XHRcdEZpZWxkR3JvdXBEcmFmdEluZGljYXRvclByb3BlcnR5UGF0aDogc2VtYW50aWNLZXlJbkZpZWxkR3JvdXAucHJvcGVydHlQYXRoLFxuXHRcdFx0RmllbGRHcm91cE5hbWU6IG5hbWVcblx0XHR9O1xuXHR9XG59XG5cbmZ1bmN0aW9uIF9nZXRJbXBOdW1iZXIoZGF0YUZpZWxkOiBEYXRhRmllbGRUeXBlcyk6IG51bWJlciB7XG5cdGNvbnN0IGltcG9ydGFuY2UgPSBkYXRhRmllbGQ/LmFubm90YXRpb25zPy5VST8uSW1wb3J0YW5jZSBhcyBzdHJpbmc7XG5cblx0aWYgKGltcG9ydGFuY2UgJiYgaW1wb3J0YW5jZS5pbmNsdWRlcyhcIlVJLkltcG9ydGFuY2VUeXBlL0hpZ2hcIikpIHtcblx0XHRyZXR1cm4gMztcblx0fVxuXHRpZiAoaW1wb3J0YW5jZSAmJiBpbXBvcnRhbmNlLmluY2x1ZGVzKFwiVUkuSW1wb3J0YW5jZVR5cGUvTWVkaXVtXCIpKSB7XG5cdFx0cmV0dXJuIDI7XG5cdH1cblx0aWYgKGltcG9ydGFuY2UgJiYgaW1wb3J0YW5jZS5pbmNsdWRlcyhcIlVJLkltcG9ydGFuY2VUeXBlL0xvd1wiKSkge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cdHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBfZ2V0RGF0YUZpZWxkSW1wb3J0YW5jZShkYXRhRmllbGQ6IERhdGFGaWVsZFR5cGVzKTogSW1wb3J0YW5jZSB7XG5cdGNvbnN0IGltcG9ydGFuY2UgPSBkYXRhRmllbGQ/LmFubm90YXRpb25zPy5VST8uSW1wb3J0YW5jZSBhcyBzdHJpbmc7XG5cdHJldHVybiBpbXBvcnRhbmNlID8gKGltcG9ydGFuY2Uuc3BsaXQoXCIvXCIpWzFdIGFzIEltcG9ydGFuY2UpIDogSW1wb3J0YW5jZS5Ob25lO1xufVxuXG5mdW5jdGlvbiBfZ2V0TWF4SW1wb3J0YW5jZShmaWVsZHM6IERhdGFGaWVsZFR5cGVzW10pOiBJbXBvcnRhbmNlIHtcblx0aWYgKGZpZWxkcyAmJiBmaWVsZHMubGVuZ3RoID4gMCkge1xuXHRcdGxldCBtYXhJbXBOdW1iZXIgPSAtMTtcblx0XHRsZXQgaW1wTnVtYmVyID0gLTE7XG5cdFx0bGV0IERhdGFGaWVsZFdpdGhNYXhJbXBvcnRhbmNlO1xuXHRcdGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG5cdFx0XHRpbXBOdW1iZXIgPSBfZ2V0SW1wTnVtYmVyKGZpZWxkKTtcblx0XHRcdGlmIChpbXBOdW1iZXIgPiBtYXhJbXBOdW1iZXIpIHtcblx0XHRcdFx0bWF4SW1wTnVtYmVyID0gaW1wTnVtYmVyO1xuXHRcdFx0XHREYXRhRmllbGRXaXRoTWF4SW1wb3J0YW5jZSA9IGZpZWxkO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gX2dldERhdGFGaWVsZEltcG9ydGFuY2UoRGF0YUZpZWxkV2l0aE1heEltcG9ydGFuY2UgYXMgRGF0YUZpZWxkVHlwZXMpO1xuXHR9XG5cdHJldHVybiBJbXBvcnRhbmNlLk5vbmU7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW1wb3J0YW5jZSB2YWx1ZSBmb3IgYSBjb2x1bW4uXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZFxuICogQHBhcmFtIHNlbWFudGljS2V5c1xuICogQHJldHVybnMgVGhlIGltcG9ydGFuY2UgdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEltcG9ydGFuY2UoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLCBzZW1hbnRpY0tleXM6IFNlbWFudGljS2V5KTogSW1wb3J0YW5jZSB8IHVuZGVmaW5lZCB7XG5cdC8vRXZhbHVhdGUgZGVmYXVsdCBJbXBvcnRhbmNlIGlzIG5vdCBzZXQgZXhwbGljaXRseVxuXHRsZXQgZmllbGRzV2l0aEltcG9ydGFuY2UsIG1hcFNlbWFudGljS2V5czogYW55O1xuXHQvL0NoZWNrIGlmIHNlbWFudGljS2V5cyBhcmUgZGVmaW5lZCBhdCB0aGUgRW50aXR5U2V0IGxldmVsXG5cdGlmIChzZW1hbnRpY0tleXMgJiYgc2VtYW50aWNLZXlzLmxlbmd0aCA+IDApIHtcblx0XHRtYXBTZW1hbnRpY0tleXMgPSBzZW1hbnRpY0tleXMubWFwKGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdHJldHVybiBrZXkudmFsdWU7XG5cdFx0fSk7XG5cdH1cblx0aWYgKCFkYXRhRmllbGQpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGlmIChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24pIHtcblx0XHRjb25zdCBmaWVsZEdyb3VwRGF0YSA9IChkYXRhRmllbGQgYXMgYW55KS5UYXJnZXRbXCIkdGFyZ2V0XCJdW1wiRGF0YVwiXSBhcyBGaWVsZEdyb3VwVHlwZSxcblx0XHRcdGZpZWxkR3JvdXBIYXNTZW1hbnRpY0tleSA9XG5cdFx0XHRcdGZpZWxkR3JvdXBEYXRhICYmXG5cdFx0XHRcdChmaWVsZEdyb3VwRGF0YSBhcyBhbnkpLnNvbWUoZnVuY3Rpb24gKGZpZWxkR3JvdXBEYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpIHtcblx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0KGZpZWxkR3JvdXBEYXRhRmllbGQgYXMgdW5rbm93biBhcyBEYXRhRmllbGRUeXBlcyk/LlZhbHVlPy5wYXRoICYmXG5cdFx0XHRcdFx0XHRmaWVsZEdyb3VwRGF0YUZpZWxkLiRUeXBlICE9PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uICYmXG5cdFx0XHRcdFx0XHRtYXBTZW1hbnRpY0tleXMgJiZcblx0XHRcdFx0XHRcdG1hcFNlbWFudGljS2V5cy5pbmNsdWRlcygoZmllbGRHcm91cERhdGFGaWVsZCBhcyB1bmtub3duIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWU/LnBhdGgpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSk7XG5cdFx0Ly9JZiBhIEZpZWxkR3JvdXAgY29udGFpbnMgYSBzZW1hbnRpY0tleSwgaW1wb3J0YW5jZSBzZXQgdG8gSGlnaFxuXHRcdGlmIChmaWVsZEdyb3VwSGFzU2VtYW50aWNLZXkpIHtcblx0XHRcdHJldHVybiBJbXBvcnRhbmNlLkhpZ2g7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vSWYgdGhlIERhdGFGaWVsZEZvckFubm90YXRpb24gaGFzIGFuIEltcG9ydGFuY2Ugd2UgdGFrZSBpdFxuXHRcdFx0aWYgKGRhdGFGaWVsZD8uYW5ub3RhdGlvbnM/LlVJPy5JbXBvcnRhbmNlKSB7XG5cdFx0XHRcdHJldHVybiBfZ2V0RGF0YUZpZWxkSW1wb3J0YW5jZShkYXRhRmllbGQgYXMgdW5rbm93biBhcyBEYXRhRmllbGRUeXBlcyk7XG5cdFx0XHR9XG5cdFx0XHQvLyBlbHNlIHRoZSBoaWdoZXN0IGltcG9ydGFuY2UgKGlmIGFueSkgaXMgcmV0dXJuZWRcblx0XHRcdGZpZWxkc1dpdGhJbXBvcnRhbmNlID1cblx0XHRcdFx0ZmllbGRHcm91cERhdGEgJiZcblx0XHRcdFx0KGZpZWxkR3JvdXBEYXRhIGFzIGFueSkuZmlsdGVyKGZ1bmN0aW9uIChpdGVtOiBEYXRhRmllbGRUeXBlcykge1xuXHRcdFx0XHRcdHJldHVybiBpdGVtPy5hbm5vdGF0aW9ucz8uVUk/LkltcG9ydGFuY2U7XG5cdFx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIF9nZXRNYXhJbXBvcnRhbmNlKGZpZWxkc1dpdGhJbXBvcnRhbmNlIGFzIERhdGFGaWVsZFR5cGVzW10pO1xuXHRcdH1cblx0XHQvL0lmIHRoZSBjdXJyZW50IGZpZWxkIGlzIGEgc2VtYW50aWNLZXksIGltcG9ydGFuY2Ugc2V0IHRvIEhpZ2hcblx0fVxuXHRyZXR1cm4gKGRhdGFGaWVsZCBhcyBEYXRhRmllbGRUeXBlcykuVmFsdWUgJiZcblx0XHQoZGF0YUZpZWxkIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWU/LnBhdGggJiZcblx0XHRtYXBTZW1hbnRpY0tleXMgJiZcblx0XHRtYXBTZW1hbnRpY0tleXMuaW5jbHVkZXMoKGRhdGFGaWVsZCBhcyBEYXRhRmllbGRUeXBlcykuVmFsdWUucGF0aClcblx0XHQ/IEltcG9ydGFuY2UuSGlnaFxuXHRcdDogX2dldERhdGFGaWVsZEltcG9ydGFuY2UoZGF0YUZpZWxkIGFzIHVua25vd24gYXMgRGF0YUZpZWxkVHlwZXMpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGxpbmUgaXRlbXMgZnJvbSBtZXRhZGF0YSBhbm5vdGF0aW9ucy5cbiAqXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgd2l0aCB0aGVpciBhbm5vdGF0aW9uc1xuICogQHBhcmFtIHZpc3VhbGl6YXRpb25QYXRoIFRoZSB2aXN1YWxpemF0aW9uIHBhdGhcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgVGhlIGNvbHVtbnMgZnJvbSB0aGUgYW5ub3RhdGlvbnNcbiAqL1xuY29uc3QgZ2V0Q29sdW1uc0Zyb21Bbm5vdGF0aW9ucyA9IGZ1bmN0aW9uIChcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogVGFibGVDb2x1bW5bXSB7XG5cdGNvbnN0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKGxpbmVJdGVtQW5ub3RhdGlvbiksXG5cdFx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdID0gW10sXG5cdFx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4gPSB7fSxcblx0XHRub25Tb3J0YWJsZUNvbHVtbnM6IHN0cmluZ1tdID0gZ2V0Tm9uU29ydGFibGVQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkpLFxuXHRcdHRhYmxlTWFuaWZlc3RTZXR0aW5nczogVGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpLFxuXHRcdHRhYmxlVHlwZTogVGFibGVUeXBlID0gdGFibGVNYW5pZmVzdFNldHRpbmdzPy50YWJsZVNldHRpbmdzPy50eXBlIHx8IFwiUmVzcG9uc2l2ZVRhYmxlXCI7XG5cdGNvbnN0IHNlbWFudGljS2V5czogU2VtYW50aWNLZXkgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25zQnlUZXJtKFwiQ29tbW9uXCIsIENvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY0tleSwgW1xuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpXG5cdF0pWzBdO1xuXHRpZiAobGluZUl0ZW1Bbm5vdGF0aW9uKSB7XG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLmZvckVhY2goKGxpbmVJdGVtKSA9PiB7XG5cdFx0XHRpZiAoIV9pc1ZhbGlkQ29sdW1uKGxpbmVJdGVtKSB8fCBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihsaW5lSXRlbSkpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgc2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCA9XG5cdFx0XHRcdGlzRGF0YUZpZWxkVHlwZXMobGluZUl0ZW0pICYmIGxpbmVJdGVtLlZhbHVlPy4kdGFyZ2V0Py5mdWxseVF1YWxpZmllZE5hbWVcblx0XHRcdFx0XHQ/IGdldFNlbWFudGljT2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LCBsaW5lSXRlbSlcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IHJlbGF0aXZlUGF0aCA9IF9nZXRSZWxhdGl2ZVBhdGgobGluZUl0ZW0pO1xuXHRcdFx0bGV0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXTtcblx0XHRcdC8vIERldGVybWluZSBwcm9wZXJ0aWVzIHdoaWNoIGFyZSBjb25zdW1lZCBieSB0aGlzIExpbmVJdGVtLlxuXHRcdFx0Y29uc3QgcmVsYXRlZFByb3BlcnRpZXNJbmZvOiBDb21wbGV4UHJvcGVydHlJbmZvID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHkobGluZUl0ZW0sIGNvbnZlcnRlckNvbnRleHQsIHRhYmxlVHlwZSk7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydGllczogYW55ID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXM7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGxpbmVJdGVtLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uICYmXG5cdFx0XHRcdGxpbmVJdGVtLlRhcmdldD8uJHRhcmdldD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkZpZWxkR3JvdXBUeXBlXG5cdFx0XHQpIHtcblx0XHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZXMgPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllcykuZmlsdGVyKChrZXkpID0+IHtcblx0XHRcdFx0XHRsZXQgaXNTdGF0aWNhbGx5SGlkZGVuO1xuXHRcdFx0XHRcdGlmIChyZWxhdGVkUHJvcGVydGllc1trZXldLmFubm90YXRpb25zPy5VSSlcblx0XHRcdFx0XHRcdGlzU3RhdGljYWxseUhpZGRlbiA9IGlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuKHJlbGF0ZWRQcm9wZXJ0aWVzW2tleV0uYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0KTtcblx0XHRcdFx0XHRlbHNlIGlzU3RhdGljYWxseUhpZGRlbiA9IGlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuKHJlbGF0ZWRQcm9wZXJ0aWVzW2tleV0pO1xuXHRcdFx0XHRcdHJldHVybiAhaXNTdGF0aWNhbGx5SGlkZGVuO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVzID0gT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXMpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgYWRkaXRpb25hbFByb3BlcnR5TmFtZXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXNJbmZvLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKTtcblx0XHRcdGNvbnN0IGdyb3VwUGF0aDogc3RyaW5nID0gX3NsaWNlQXRTbGFzaChyZWxhdGl2ZVBhdGgsIHRydWUsIGZhbHNlKTtcblx0XHRcdGNvbnN0IGlzR3JvdXA6IGJvb2xlYW4gPSBncm91cFBhdGggIT0gcmVsYXRpdmVQYXRoO1xuXHRcdFx0Y29uc3Qgc0xhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBfZ2V0TGFiZWwobGluZUl0ZW0sIGlzR3JvdXApO1xuXHRcdFx0Y29uc3QgbmFtZSA9IF9nZXRBbm5vdGF0aW9uQ29sdW1uTmFtZShsaW5lSXRlbSk7XG5cdFx0XHRjb25zdCBpc0ZpZWxkR3JvdXBDb2x1bW46IGJvb2xlYW4gPSBncm91cFBhdGguaW5kZXhPZihcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5GaWVsZEdyb3VwXCIpID4gLTE7XG5cdFx0XHRjb25zdCBzaG93RGF0YUZpZWxkc0xhYmVsOiBib29sZWFuID0gaXNGaWVsZEdyb3VwQ29sdW1uXG5cdFx0XHRcdD8gX2dldFNob3dEYXRhRmllbGRzTGFiZWwobmFtZSwgdmlzdWFsaXphdGlvblBhdGgsIGNvbnZlcnRlckNvbnRleHQpXG5cdFx0XHRcdDogZmFsc2U7XG5cdFx0XHRjb25zdCBkYXRhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gZ2V0RGF0YUZpZWxkRGF0YVR5cGUobGluZUl0ZW0pO1xuXHRcdFx0Y29uc3Qgc0RhdGVJbnB1dEZvcm1hdDogc3RyaW5nIHwgdW5kZWZpbmVkID0gZGF0YVR5cGUgPT09IFwiRWRtLkRhdGVcIiA/IFwiWVlZWS1NTS1ERFwiIDogdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgZm9ybWF0T3B0aW9ucyA9IHtcblx0XHRcdFx0Li4uZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZSgpLFxuXHRcdFx0XHQuLi5nZXREZWZhdWx0RHJhZnRJbmRpY2F0b3JGb3JDb2x1bW4obmFtZSwgc2VtYW50aWNLZXlzLCBpc0ZpZWxkR3JvdXBDb2x1bW4sIGxpbmVJdGVtKVxuXHRcdFx0fTtcblx0XHRcdGxldCBmaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnM6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRsaW5lSXRlbS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiAmJlxuXHRcdFx0XHRsaW5lSXRlbS5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZVxuXHRcdFx0KSB7XG5cdFx0XHRcdGZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyA9IF9nZXRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMobGluZUl0ZW0sIGZvcm1hdE9wdGlvbnMpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgZXhwb3J0U2V0dGluZ3M6IGFueSA9IHtcblx0XHRcdFx0dGVtcGxhdGU6IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRTZXR0aW5nc1RlbXBsYXRlLFxuXHRcdFx0XHR3cmFwOiByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3NXcmFwcGluZyxcblx0XHRcdFx0dHlwZTogZGF0YVR5cGUgPyBfZ2V0RXhwb3J0RGF0YVR5cGUoZGF0YVR5cGUsIHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmxlbmd0aCA+IDEpIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRpbnB1dEZvcm1hdDogc0RhdGVJbnB1dEZvcm1hdCxcblx0XHRcdFx0ZGVsaW1pdGVyOiBkYXRhVHlwZSA9PT0gXCJFZG0uSW50NjRcIiA/IHRydWUgOiBmYWxzZVxuXHRcdFx0fTtcblxuXHRcdFx0aWYgKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRVbml0TmFtZSkge1xuXHRcdFx0XHRleHBvcnRTZXR0aW5ncy51bml0UHJvcGVydHkgPSByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0VW5pdE5hbWU7XG5cdFx0XHRcdGV4cG9ydFNldHRpbmdzLnR5cGUgPSBcIkN1cnJlbmN5XCI7IC8vIEZvcmNlIHRvIGEgY3VycmVuY3kgYmVjYXVzZSB0aGVyZSdzIGEgdW5pdFByb3BlcnR5IChvdGhlcndpc2UgdGhlIHZhbHVlIGlzbid0IHByb3Blcmx5IGZvcm1hdHRlZCB3aGVuIGV4cG9ydGVkKVxuXHRcdFx0fSBlbHNlIGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0VW5pdFN0cmluZykge1xuXHRcdFx0XHRleHBvcnRTZXR0aW5ncy51bml0ID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFVuaXRTdHJpbmc7XG5cdFx0XHR9XG5cdFx0XHRpZiAocmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFRpbWV6b25lTmFtZSkge1xuXHRcdFx0XHRleHBvcnRTZXR0aW5ncy50aW1lem9uZVByb3BlcnR5ID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFRpbWV6b25lTmFtZTtcblx0XHRcdH0gZWxzZSBpZiAocmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFRpbWV6b25lU3RyaW5nKSB7XG5cdFx0XHRcdGV4cG9ydFNldHRpbmdzLnRpbWV6b25lID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFRpbWV6b25lU3RyaW5nO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgcHJvcGVydHlUeXBlQ29uZmlnID0gZGF0YVR5cGUgJiYgZ2V0VHlwZUNvbmZpZyhsaW5lSXRlbSwgZGF0YVR5cGUpO1xuXHRcdFx0Y29uc3Qgb1R5cGVDb25maWcgPSBwcm9wZXJ0eVR5cGVDb25maWdcblx0XHRcdFx0PyB7XG5cdFx0XHRcdFx0XHRjbGFzc05hbWU6IGRhdGFUeXBlLFxuXHRcdFx0XHRcdFx0b0Zvcm1hdE9wdGlvbnM6IHtcblx0XHRcdFx0XHRcdFx0Li4uZm9ybWF0T3B0aW9ucyxcblx0XHRcdFx0XHRcdFx0Li4ucHJvcGVydHlUeXBlQ29uZmlnLmZvcm1hdE9wdGlvbnNcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRvQ29uc3RyYWludHM6IHByb3BlcnR5VHlwZUNvbmZpZy5jb25zdHJhaW50c1xuXHRcdFx0XHQgIH1cblx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRsZXQgdmlzdWFsU2V0dGluZ3M6IFZpc3VhbFNldHRpbmdzID0ge307XG5cdFx0XHRpZiAocmVsYXRlZFByb3BlcnRpZXNJbmZvLnZpc3VhbFNldHRpbmdzVG9CZUV4Y2x1ZGVkKSB7XG5cdFx0XHRcdC8vIEluIGNhc2Ugb2YgdGV4dCBhcnJhbmdlbWVudCBhbm5vdGF0aW9uIHdpdGggZGlzcGxheSBtb2RlIGFzIHRleHQgb25seSwgZXhjbHVkZSB0ZXh0IHByb3BlcnR5IGZyb20gdGhlIHdpZHRoIGNhbGN1bGF0aW9uXG5cdFx0XHRcdHZpc3VhbFNldHRpbmdzID0ge1xuXHRcdFx0XHRcdHdpZHRoQ2FsY3VsYXRpb246IHtcblx0XHRcdFx0XHRcdGV4Y2x1ZGVQcm9wZXJ0aWVzOiBbYFByb3BlcnR5Ojoke3JlbGF0ZWRQcm9wZXJ0aWVzSW5mby52aXN1YWxTZXR0aW5nc1RvQmVFeGNsdWRlZH1gXVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSBpZiAoIWRhdGFUeXBlIHx8ICFvVHlwZUNvbmZpZykge1xuXHRcdFx0XHQvLyBmb3IgY2hhcnRzXG5cdFx0XHRcdHZpc3VhbFNldHRpbmdzLndpZHRoQ2FsY3VsYXRpb24gPSBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBvQ29sdW1uOiBhbnkgPSB7XG5cdFx0XHRcdGtleTogS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChsaW5lSXRlbSksXG5cdFx0XHRcdHR5cGU6IENvbHVtblR5cGUuQW5ub3RhdGlvbixcblx0XHRcdFx0bGFiZWw6IHNMYWJlbCxcblx0XHRcdFx0Z3JvdXBMYWJlbDogaXNHcm91cCA/IF9nZXRMYWJlbChsaW5lSXRlbSkgOiBudWxsLFxuXHRcdFx0XHRncm91cDogaXNHcm91cCA/IGdyb3VwUGF0aCA6IG51bGwsXG5cdFx0XHRcdEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9uczogZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zLFxuXHRcdFx0XHRhbm5vdGF0aW9uUGF0aDogY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGxpbmVJdGVtLmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdHNlbWFudGljT2JqZWN0UGF0aDogc2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0YXZhaWxhYmlsaXR5OiBpc0RhdGFGaWVsZEFsd2F5c0hpZGRlbihsaW5lSXRlbSkgPyBBdmFpbGFiaWxpdHlUeXBlLkhpZGRlbiA6IEF2YWlsYWJpbGl0eVR5cGUuRGVmYXVsdCxcblx0XHRcdFx0bmFtZTogbmFtZSxcblx0XHRcdFx0c2hvd0RhdGFGaWVsZHNMYWJlbDogc2hvd0RhdGFGaWVsZHNMYWJlbCxcblx0XHRcdFx0cmVsYXRpdmVQYXRoOiByZWxhdGl2ZVBhdGgsXG5cdFx0XHRcdHNvcnRhYmxlOiBfaXNDb2x1bW5Tb3J0YWJsZShsaW5lSXRlbSwgcmVsYXRpdmVQYXRoLCBub25Tb3J0YWJsZUNvbHVtbnMpLFxuXHRcdFx0XHRwcm9wZXJ0eUluZm9zOiByZWxhdGVkUHJvcGVydHlOYW1lcy5sZW5ndGggPyByZWxhdGVkUHJvcGVydHlOYW1lcyA6IHVuZGVmaW5lZCxcblx0XHRcdFx0YWRkaXRpb25hbFByb3BlcnR5SW5mb3M6IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzLmxlbmd0aCA+IDAgPyBhZGRpdGlvbmFsUHJvcGVydHlOYW1lcyA6IHVuZGVmaW5lZCxcblx0XHRcdFx0ZXhwb3J0U2V0dGluZ3M6IGV4cG9ydFNldHRpbmdzLFxuXHRcdFx0XHR3aWR0aDogbGluZUl0ZW0uYW5ub3RhdGlvbnM/LkhUTUw1Py5Dc3NEZWZhdWx0cz8ud2lkdGggfHwgdW5kZWZpbmVkLFxuXHRcdFx0XHRpbXBvcnRhbmNlOiBnZXRJbXBvcnRhbmNlKGxpbmVJdGVtIGFzIERhdGFGaWVsZFR5cGVzLCBzZW1hbnRpY0tleXMpLFxuXHRcdFx0XHRpc05hdmlnYWJsZTogdHJ1ZSxcblx0XHRcdFx0Zm9ybWF0T3B0aW9uczogZm9ybWF0T3B0aW9ucyxcblx0XHRcdFx0ZXhwb3J0Q29udGFjdFByb3BlcnR5OiByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3NDb250YWN0UHJvcGVydHksXG5cdFx0XHRcdGNhc2VTZW5zaXRpdmU6IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHRcdFx0dHlwZUNvbmZpZzogb1R5cGVDb25maWcsXG5cdFx0XHRcdHZpc3VhbFNldHRpbmdzOiB2aXN1YWxTZXR0aW5ncyxcblx0XHRcdFx0dGltZXpvbmVUZXh0OiBleHBvcnRTZXR0aW5ncy50aW1lem9uZSxcblx0XHRcdFx0aXNQYXJ0T2ZMaW5lSXRlbTogdHJ1ZVxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IHNUb29sdGlwID0gX2dldFRvb2x0aXAobGluZUl0ZW0pO1xuXHRcdFx0aWYgKHNUb29sdGlwKSB7XG5cdFx0XHRcdG9Db2x1bW4udG9vbHRpcCA9IHNUb29sdGlwO1xuXHRcdFx0fVxuXG5cdFx0XHRhbm5vdGF0aW9uQ29sdW1ucy5wdXNoKG9Db2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uKTtcblxuXHRcdFx0Ly8gQ29sbGVjdCBpbmZvcm1hdGlvbiBvZiByZWxhdGVkIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cblx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmZvckVhY2goKHJlbGF0ZWRQcm9wZXJ0eU5hbWUpID0+IHtcblx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW3JlbGF0ZWRQcm9wZXJ0eU5hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbcmVsYXRlZFByb3BlcnR5TmFtZV07XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQ3JlYXRlIGNvbHVtbnMgZm9yIGFkZGl0aW9uYWwgcHJvcGVydGllcyBpZGVudGlmaWVkIGZvciBBTFAgdXNlIGNhc2UuXG5cdFx0XHRhZGRpdGlvbmFsUHJvcGVydHlOYW1lcy5mb3JFYWNoKChhZGRpdGlvbmFsUHJvcGVydHlOYW1lKSA9PiB7XG5cdFx0XHRcdC8vIEludGVudGlvbmFsIG92ZXJ3cml0ZSBhcyB3ZSByZXF1aXJlIG9ubHkgb25lIG5ldyBQcm9wZXJ0eUluZm8gZm9yIGEgcmVsYXRlZCBQcm9wZXJ0eS5cblx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW2FkZGl0aW9uYWxQcm9wZXJ0eU5hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmFkZGl0aW9uYWxQcm9wZXJ0aWVzW2FkZGl0aW9uYWxQcm9wZXJ0eU5hbWVdO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvLyBHZXQgY29sdW1ucyBmcm9tIHRoZSBQcm9wZXJ0aWVzIG9mIEVudGl0eVR5cGVcblx0cmV0dXJuIGdldENvbHVtbnNGcm9tRW50aXR5VHlwZShjb2x1bW5zVG9CZUNyZWF0ZWQsIGVudGl0eVR5cGUsIGFubm90YXRpb25Db2x1bW5zLCBub25Tb3J0YWJsZUNvbHVtbnMsIGNvbnZlcnRlckNvbnRleHQsIHRhYmxlVHlwZSk7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIHByb3BlcnR5IG5hbWVzIGZyb20gdGhlIG1hbmlmZXN0IGFuZCBjaGVja3MgYWdhaW5zdCBleGlzdGluZyBwcm9wZXJ0aWVzIGFscmVhZHkgYWRkZWQgYnkgYW5ub3RhdGlvbnMuXG4gKiBJZiBhIG5vdCB5ZXQgc3RvcmVkIHByb3BlcnR5IGlzIGZvdW5kIGl0IGFkZHMgaXQgZm9yIHNvcnRpbmcgYW5kIGZpbHRlcmluZyBvbmx5IHRvIHRoZSBhbm5vdGF0aW9uQ29sdW1ucy5cbiAqXG4gKiBAcGFyYW0gcHJvcGVydGllc1xuICogQHBhcmFtIGFubm90YXRpb25Db2x1bW5zXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIGVudGl0eVR5cGVcbiAqIEByZXR1cm5zIFRoZSBjb2x1bW5zIGZyb20gdGhlIGFubm90YXRpb25zXG4gKi9cbmNvbnN0IF9nZXRQcm9wZXJ0eU5hbWVzID0gZnVuY3Rpb24gKFxuXHRwcm9wZXJ0aWVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlXG4pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG5cdGxldCBtYXRjaGVkUHJvcGVydGllczogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cdGlmIChwcm9wZXJ0aWVzKSB7XG5cdFx0bWF0Y2hlZFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLm1hcChmdW5jdGlvbiAocHJvcGVydHlQYXRoKSB7XG5cdFx0XHRjb25zdCBhbm5vdGF0aW9uQ29sdW1uID0gYW5ub3RhdGlvbkNvbHVtbnMuZmluZChmdW5jdGlvbiAoYW5ub3RhdGlvbkNvbHVtbikge1xuXHRcdFx0XHRyZXR1cm4gYW5ub3RhdGlvbkNvbHVtbi5yZWxhdGl2ZVBhdGggPT09IHByb3BlcnR5UGF0aCAmJiBhbm5vdGF0aW9uQ29sdW1uLnByb3BlcnR5SW5mb3MgPT09IHVuZGVmaW5lZDtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKGFubm90YXRpb25Db2x1bW4pIHtcblx0XHRcdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW4ubmFtZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHJlbGF0ZWRDb2x1bW5zID0gX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zKFxuXHRcdFx0XHRcdHsgW3Byb3BlcnR5UGF0aF06IGVudGl0eVR5cGUucmVzb2x2ZVBhdGgocHJvcGVydHlQYXRoKSB9LFxuXHRcdFx0XHRcdGFubm90YXRpb25Db2x1bW5zLFxuXHRcdFx0XHRcdFtdLFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0ZW50aXR5VHlwZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRhbm5vdGF0aW9uQ29sdW1ucy5wdXNoKHJlbGF0ZWRDb2x1bW5zWzBdKTtcblx0XHRcdFx0cmV0dXJuIHJlbGF0ZWRDb2x1bW5zWzBdLm5hbWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRyZXR1cm4gbWF0Y2hlZFByb3BlcnRpZXM7XG59O1xuXG5jb25zdCBfYXBwZW5kQ3VzdG9tVGVtcGxhdGUgPSBmdW5jdGlvbiAocHJvcGVydGllczogc3RyaW5nW10pOiBzdHJpbmcge1xuXHRyZXR1cm4gcHJvcGVydGllc1xuXHRcdC5tYXAoKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRyZXR1cm4gYHske3Byb3BlcnRpZXMuaW5kZXhPZihwcm9wZXJ0eSl9fWA7XG5cdFx0fSlcblx0XHQuam9pbihgJHtcIlxcblwifWApO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHRhYmxlIGNvbHVtbiBwcm9wZXJ0eSB2YWx1ZSBiYXNlZCBvbiBjZXJ0YWluIGNvbmRpdGlvbnMuXG4gKlxuICogTWFuaWZlc3QgZGVmaW5lZCBwcm9wZXJ0eSB2YWx1ZSBmb3IgY3VzdG9tIC8gYW5ub3RhdGlvbiBjb2x1bW5zXG4gKiBEZWZhdWx0IHByb3BlcnR5IHZhbHVlIGZvciBjdXN0b20gY29sdW1uIGlmIG5vdCBvdmVyd3JpdHRlbiBpbiBtYW5pZmVzdC5cbiAqXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIGNvbHVtbiBwcm9wZXJ0eSBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdFxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgcHJvcGVydHlcbiAqIEBwYXJhbSBpc0Fubm90YXRpb25Db2x1bW4gV2hldGhlciB0aGUgY29sdW1uLCBkZWZpbmVkIGluIG1hbmlmZXN0LCBjb3JyZXNwb25kcyB0byBhbiBleGlzdGluZyBhbm5vdGF0aW9uIGNvbHVtbi5cbiAqIEByZXR1cm5zIERldGVybWluZWQgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBjb2x1bW5cbiAqL1xuY29uc3QgX2dldE1hbmlmZXN0T3JEZWZhdWx0VmFsdWUgPSBmdW5jdGlvbiAocHJvcGVydHk6IGFueSwgZGVmYXVsdFZhbHVlOiBhbnksIGlzQW5ub3RhdGlvbkNvbHVtbjogYm9vbGVhbik6IGFueSB7XG5cdGlmIChwcm9wZXJ0eSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly8gSWYgYW5ub3RhdGlvbiBjb2x1bW4gaGFzIG5vIHByb3BlcnR5IGRlZmluZWQgaW4gbWFuaWZlc3QsXG5cdFx0Ly8gZG8gbm90IG92ZXJ3cml0ZSBpdCB3aXRoIG1hbmlmZXN0IGNvbHVtbidzIGRlZmF1bHQgdmFsdWUuXG5cdFx0cmV0dXJuIGlzQW5ub3RhdGlvbkNvbHVtbiA/IHVuZGVmaW5lZCA6IGRlZmF1bHRWYWx1ZTtcblx0fVxuXHQvLyBSZXR1cm4gd2hhdCBpcyBkZWZpbmVkIGluIG1hbmlmZXN0LlxuXHRyZXR1cm4gcHJvcGVydHk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGFibGUgY29sdW1uIGRlZmluaXRpb25zIGZyb20gbWFuaWZlc3QuXG4gKlxuICogQHBhcmFtIGNvbHVtbnNcbiAqIEBwYXJhbSBhbm5vdGF0aW9uQ29sdW1uc1xuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBlbnRpdHlUeXBlXG4gKiBAcGFyYW0gbmF2aWdhdGlvblNldHRpbmdzXG4gKiBAcmV0dXJucyBUaGUgY29sdW1ucyBmcm9tIHRoZSBtYW5pZmVzdFxuICovXG5jb25zdCBnZXRDb2x1bW5zRnJvbU1hbmlmZXN0ID0gZnVuY3Rpb24gKFxuXHRjb2x1bW5zOiBSZWNvcmQ8c3RyaW5nLCBNYW5pZmVzdFRhYmxlQ29sdW1uPixcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRuYXZpZ2F0aW9uU2V0dGluZ3M/OiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uXG4pOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21Db2x1bW4+IHtcblx0Y29uc3QgaW50ZXJuYWxDb2x1bW5zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21Db2x1bW4+ID0ge307XG5cblx0Zm9yIChjb25zdCBrZXkgaW4gY29sdW1ucykge1xuXHRcdGNvbnN0IG1hbmlmZXN0Q29sdW1uID0gY29sdW1uc1trZXldO1xuXHRcdC8vIFRvIGlkZW50aWZ5IHRoZSBhbm5vdGF0aW9uIGNvbHVtbiBwcm9wZXJ0eSBvdmVyd3JpdGUgdmlhIG1hbmlmZXN0IHVzZS1jYXNlLlxuXHRcdGNvbnN0IGlzQW5ub3RhdGlvbkNvbHVtbiA9IGFubm90YXRpb25Db2x1bW5zLnNvbWUoKGNvbHVtbikgPT4gY29sdW1uLmtleSA9PT0ga2V5KTtcblx0XHRLZXlIZWxwZXIudmFsaWRhdGVLZXkoa2V5KTtcblx0XHRjb25zdCBwcm9wZXJ0eUluZm9zOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCA9IF9nZXRQcm9wZXJ0eU5hbWVzKFxuXHRcdFx0bWFuaWZlc3RDb2x1bW4ucHJvcGVydGllcyxcblx0XHRcdGFubm90YXRpb25Db2x1bW5zLFxuXHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdGVudGl0eVR5cGVcblx0XHQpO1xuXHRcdGlmICghbWFuaWZlc3RDb2x1bW4/LnRlbXBsYXRlICYmIG1hbmlmZXN0Q29sdW1uPy50eXBlICE9PSBcIlNsb3RcIiAmJiAhaXNBbm5vdGF0aW9uQ29sdW1uKSB7XG5cdFx0XHRjb25zdCBNZXNzYWdlID0gYFRoZSBhbm5vdGF0aW9uIGNvbHVtbiAnJHtrZXl9JyByZWZlcmVuY2VkIGluIHRoZSBtYW5pZmVzdCBpcyBub3QgZm91bmRgO1xuXHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHQuZ2V0RGlhZ25vc3RpY3MoKVxuXHRcdFx0XHQuYWRkSXNzdWUoXG5cdFx0XHRcdFx0SXNzdWVDYXRlZ29yeS5NYW5pZmVzdCxcblx0XHRcdFx0XHRJc3N1ZVNldmVyaXR5Lkxvdyxcblx0XHRcdFx0XHRNZXNzYWdlLFxuXHRcdFx0XHRcdElzc3VlQ2F0ZWdvcnlUeXBlLFxuXHRcdFx0XHRcdElzc3VlQ2F0ZWdvcnlUeXBlPy5Bbm5vdGF0aW9uQ29sdW1ucz8uSW52YWxpZEtleVxuXHRcdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpbnRlcm5hbENvbHVtbnNba2V5XSA9IHtcblx0XHRcdFx0a2V5OiBrZXksXG5cdFx0XHRcdGlkOiBgQ3VzdG9tQ29sdW1uOjoke2tleX1gLFxuXHRcdFx0XHRuYW1lOiBgQ3VzdG9tQ29sdW1uOjoke2tleX1gLFxuXHRcdFx0XHRoZWFkZXI6IG1hbmlmZXN0Q29sdW1uLmhlYWRlcixcblx0XHRcdFx0d2lkdGg6IG1hbmlmZXN0Q29sdW1uLndpZHRoIHx8IHVuZGVmaW5lZCxcblx0XHRcdFx0aW1wb3J0YW5jZTogX2dldE1hbmlmZXN0T3JEZWZhdWx0VmFsdWUobWFuaWZlc3RDb2x1bW4/LmltcG9ydGFuY2UsIEltcG9ydGFuY2UuTm9uZSwgaXNBbm5vdGF0aW9uQ29sdW1uKSxcblx0XHRcdFx0aG9yaXpvbnRhbEFsaWduOiBfZ2V0TWFuaWZlc3RPckRlZmF1bHRWYWx1ZShtYW5pZmVzdENvbHVtbj8uaG9yaXpvbnRhbEFsaWduLCBIb3Jpem9udGFsQWxpZ24uQmVnaW4sIGlzQW5ub3RhdGlvbkNvbHVtbiksXG5cdFx0XHRcdHR5cGU6IG1hbmlmZXN0Q29sdW1uLnR5cGUgPT09IFwiU2xvdFwiID8gQ29sdW1uVHlwZS5TbG90IDogQ29sdW1uVHlwZS5EZWZhdWx0LFxuXHRcdFx0XHRhdmFpbGFiaWxpdHk6IF9nZXRNYW5pZmVzdE9yRGVmYXVsdFZhbHVlKG1hbmlmZXN0Q29sdW1uPy5hdmFpbGFiaWxpdHksIEF2YWlsYWJpbGl0eVR5cGUuRGVmYXVsdCwgaXNBbm5vdGF0aW9uQ29sdW1uKSxcblx0XHRcdFx0dGVtcGxhdGU6IG1hbmlmZXN0Q29sdW1uLnRlbXBsYXRlIHx8IFwidW5kZWZpbmVkXCIsXG5cdFx0XHRcdHBvc2l0aW9uOiB7XG5cdFx0XHRcdFx0YW5jaG9yOiBtYW5pZmVzdENvbHVtbi5wb3NpdGlvbj8uYW5jaG9yLFxuXHRcdFx0XHRcdHBsYWNlbWVudDogbWFuaWZlc3RDb2x1bW4ucG9zaXRpb24gPT09IHVuZGVmaW5lZCA/IFBsYWNlbWVudC5BZnRlciA6IG1hbmlmZXN0Q29sdW1uLnBvc2l0aW9uLnBsYWNlbWVudFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRpc05hdmlnYWJsZTogaXNBbm5vdGF0aW9uQ29sdW1uID8gdW5kZWZpbmVkIDogaXNBY3Rpb25OYXZpZ2FibGUobWFuaWZlc3RDb2x1bW4sIG5hdmlnYXRpb25TZXR0aW5ncywgdHJ1ZSksXG5cdFx0XHRcdHNldHRpbmdzOiBtYW5pZmVzdENvbHVtbi5zZXR0aW5ncyxcblx0XHRcdFx0c29ydGFibGU6IGZhbHNlLFxuXHRcdFx0XHRpc0dyb3VwYWJsZTogZmFsc2UsXG5cdFx0XHRcdHByb3BlcnR5SW5mb3M6IHByb3BlcnR5SW5mb3MsXG5cdFx0XHRcdGZvcm1hdE9wdGlvbnM6IF9nZXRNYW5pZmVzdE9yRGVmYXVsdFZhbHVlKFxuXHRcdFx0XHRcdG1hbmlmZXN0Q29sdW1uLmZvcm1hdE9wdGlvbnMsXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Li4uZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZSgpLFxuXHRcdFx0XHRcdFx0Li4ubWFuaWZlc3RDb2x1bW4uZm9ybWF0T3B0aW9uc1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0aXNBbm5vdGF0aW9uQ29sdW1uXG5cdFx0XHRcdCksXG5cdFx0XHRcdHZpc3VhbFNldHRpbmdzOiB7IHdpZHRoQ2FsY3VsYXRpb246IG51bGwgfSxcblx0XHRcdFx0ZXhwb3J0U2V0dGluZ3M6IHtcblx0XHRcdFx0XHR0ZW1wbGF0ZTogcHJvcGVydHlJbmZvcyA/IF9hcHBlbmRDdXN0b21UZW1wbGF0ZShwcm9wZXJ0eUluZm9zKSA6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHR3cmFwOiBwcm9wZXJ0eUluZm9zICYmIHByb3BlcnR5SW5mb3MubGVuZ3RoID4gMSA/IHRydWUgOiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUoY29udmVydGVyQ29udGV4dClcblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cdHJldHVybiBpbnRlcm5hbENvbHVtbnM7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UDEzbk1vZGUoXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRjb25zdCBtYW5pZmVzdFdyYXBwZXI6IE1hbmlmZXN0V3JhcHBlciA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCk7XG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RTZXR0aW5nczogVGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpO1xuXHRjb25zdCB2YXJpYW50TWFuYWdlbWVudDogVmFyaWFudE1hbmFnZW1lbnRUeXBlID0gbWFuaWZlc3RXcmFwcGVyLmdldFZhcmlhbnRNYW5hZ2VtZW50KCk7XG5cdGNvbnN0IGFQZXJzb25hbGl6YXRpb246IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IGlzQW5hbHl0aWNhbFRhYmxlID0gdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIjtcblx0Y29uc3QgaXNSZXNwb25zaXZlVGFibGUgPSB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi50eXBlID09PSBcIlJlc3BvbnNpdmVUYWJsZVwiO1xuXHRpZiAodGFibGVNYW5pZmVzdFNldHRpbmdzPy50YWJsZVNldHRpbmdzPy5wZXJzb25hbGl6YXRpb24gIT09IHVuZGVmaW5lZCkge1xuXHRcdC8vIFBlcnNvbmFsaXphdGlvbiBjb25maWd1cmVkIGluIG1hbmlmZXN0LlxuXHRcdGNvbnN0IHBlcnNvbmFsaXphdGlvbjogYW55ID0gdGFibGVNYW5pZmVzdFNldHRpbmdzLnRhYmxlU2V0dGluZ3MucGVyc29uYWxpemF0aW9uO1xuXHRcdGlmIChwZXJzb25hbGl6YXRpb24gPT09IHRydWUpIHtcblx0XHRcdC8vIFRhYmxlIHBlcnNvbmFsaXphdGlvbiBmdWxseSBlbmFibGVkLlxuXHRcdFx0c3dpdGNoICh0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi50eXBlKSB7XG5cdFx0XHRcdGNhc2UgXCJBbmFseXRpY2FsVGFibGVcIjpcblx0XHRcdFx0XHRyZXR1cm4gXCJTb3J0LENvbHVtbixGaWx0ZXIsR3JvdXAsQWdncmVnYXRlXCI7XG5cdFx0XHRcdGNhc2UgXCJSZXNwb25zaXZlVGFibGVcIjpcblx0XHRcdFx0XHRyZXR1cm4gXCJTb3J0LENvbHVtbixGaWx0ZXIsR3JvdXBcIjtcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRyZXR1cm4gXCJTb3J0LENvbHVtbixGaWx0ZXJcIjtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBwZXJzb25hbGl6YXRpb24gPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdC8vIFNwZWNpZmljIHBlcnNvbmFsaXphdGlvbiBvcHRpb25zIGVuYWJsZWQgaW4gbWFuaWZlc3QuIFVzZSB0aGVtIGFzIGlzLlxuXHRcdFx0aWYgKHBlcnNvbmFsaXphdGlvbi5zb3J0KSB7XG5cdFx0XHRcdGFQZXJzb25hbGl6YXRpb24ucHVzaChcIlNvcnRcIik7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGVyc29uYWxpemF0aW9uLmNvbHVtbikge1xuXHRcdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJDb2x1bW5cIik7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGVyc29uYWxpemF0aW9uLmZpbHRlcikge1xuXHRcdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJGaWx0ZXJcIik7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGVyc29uYWxpemF0aW9uLmdyb3VwICYmIChpc0FuYWx5dGljYWxUYWJsZSB8fCBpc1Jlc3BvbnNpdmVUYWJsZSkpIHtcblx0XHRcdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiR3JvdXBcIik7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGVyc29uYWxpemF0aW9uLmFnZ3JlZ2F0ZSAmJiBpc0FuYWx5dGljYWxUYWJsZSkge1xuXHRcdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJBZ2dyZWdhdGVcIik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYVBlcnNvbmFsaXphdGlvbi5sZW5ndGggPiAwID8gYVBlcnNvbmFsaXphdGlvbi5qb2luKFwiLFwiKSA6IHVuZGVmaW5lZDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gTm8gcGVyc29uYWxpemF0aW9uIGNvbmZpZ3VyZWQgaW4gbWFuaWZlc3QuXG5cdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiU29ydFwiKTtcblx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJDb2x1bW5cIik7XG5cdFx0aWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0KSB7XG5cdFx0XHRpZiAodmFyaWFudE1hbmFnZW1lbnQgPT09IFZhcmlhbnRNYW5hZ2VtZW50VHlwZS5Db250cm9sIHx8IF9pc0ZpbHRlckJhckhpZGRlbihtYW5pZmVzdFdyYXBwZXIsIGNvbnZlcnRlckNvbnRleHQpKSB7XG5cdFx0XHRcdC8vIEZlYXR1cmUgcGFyaXR5IHdpdGggVjIuXG5cdFx0XHRcdC8vIEVuYWJsZSB0YWJsZSBmaWx0ZXJpbmcgYnkgZGVmYXVsdCBvbmx5IGluIGNhc2Ugb2YgQ29udHJvbCBsZXZlbCB2YXJpYW50IG1hbmFnZW1lbnQuXG5cdFx0XHRcdC8vIE9yIHdoZW4gdGhlIExSIGZpbHRlciBiYXIgaXMgaGlkZGVuIHZpYSBtYW5pZmVzdCBzZXR0aW5nXG5cdFx0XHRcdGFQZXJzb25hbGl6YXRpb24ucHVzaChcIkZpbHRlclwiKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiRmlsdGVyXCIpO1xuXHRcdH1cblxuXHRcdGlmIChpc0FuYWx5dGljYWxUYWJsZSkge1xuXHRcdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiR3JvdXBcIik7XG5cdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJBZ2dyZWdhdGVcIik7XG5cdFx0fVxuXHRcdGlmIChpc1Jlc3BvbnNpdmVUYWJsZSkge1xuXHRcdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiR3JvdXBcIik7XG5cdFx0fVxuXHRcdHJldHVybiBhUGVyc29uYWxpemF0aW9uLmpvaW4oXCIsXCIpO1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIEJvb2xlYW4gdmFsdWUgc3VnZ2VzdGluZyBpZiBhIGZpbHRlciBiYXIgaXMgYmVpbmcgdXNlZCBvbiB0aGUgcGFnZS5cbiAqXG4gKiBDaGFydCBoYXMgYSBkZXBlbmRlbmN5IHRvIGZpbHRlciBiYXIgKGlzc3VlIHdpdGggbG9hZGluZyBkYXRhKS4gT25jZSByZXNvbHZlZCwgdGhlIGNoZWNrIGZvciBjaGFydCBzaG91bGQgYmUgcmVtb3ZlZCBoZXJlLlxuICogVW50aWwgdGhlbiwgaGlkaW5nIGZpbHRlciBiYXIgaXMgbm93IGFsbG93ZWQgaWYgYSBjaGFydCBpcyBiZWluZyB1c2VkIG9uIExSLlxuICpcbiAqIEBwYXJhbSBtYW5pZmVzdFdyYXBwZXIgTWFuaWZlc3Qgc2V0dGluZ3MgZ2V0dGVyIGZvciB0aGUgcGFnZVxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgQm9vbGVhbiBzdWdnZXN0aW5nIGlmIGEgZmlsdGVyIGJhciBpcyBiZWluZyB1c2VkIG9uIHRoZSBwYWdlLlxuICovXG5mdW5jdGlvbiBfaXNGaWx0ZXJCYXJIaWRkZW4obWFuaWZlc3RXcmFwcGVyOiBNYW5pZmVzdFdyYXBwZXIsIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHRtYW5pZmVzdFdyYXBwZXIuaXNGaWx0ZXJCYXJIaWRkZW4oKSAmJlxuXHRcdCFjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmhhc011bHRpcGxlVmlzdWFsaXphdGlvbnMoKSAmJlxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5BbmFseXRpY2FsTGlzdFBhZ2Vcblx0KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyB0aGUgc29ydCBjb25kaXRpb25zIGZvciB0aGUgcHJlc2VudGF0aW9uIHZhcmlhbnQuXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIFByZXNlbnRhdGlvbiB2YXJpYW50IGFubm90YXRpb25cbiAqIEBwYXJhbSBjb2x1bW5zIFRhYmxlIGNvbHVtbnMgcHJvY2Vzc2VkIGJ5IHRoZSBjb252ZXJ0ZXJcbiAqIEByZXR1cm5zIFNvcnQgY29uZGl0aW9ucyBmb3IgYSBwcmVzZW50YXRpb24gdmFyaWFudC5cbiAqL1xuZnVuY3Rpb24gZ2V0U29ydENvbmRpdGlvbnMoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uOiBQcmVzZW50YXRpb25WYXJpYW50VHlwZSB8IHVuZGVmaW5lZCxcblx0Y29sdW1uczogVGFibGVDb2x1bW5bXVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0Ly8gQ3VycmVudGx5IG5hdmlnYXRpb24gcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZCBhcyBzb3J0ZXJcblx0Y29uc3Qgbm9uU29ydGFibGVQcm9wZXJ0aWVzID0gZ2V0Tm9uU29ydGFibGVQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkpO1xuXHRsZXQgc29ydENvbmRpdGlvbnM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0aWYgKHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPy5Tb3J0T3JkZXIpIHtcblx0XHRjb25zdCBzb3J0ZXJzOiBTb3J0ZXJUeXBlW10gPSBbXTtcblx0XHRjb25zdCBjb25kaXRpb25zID0ge1xuXHRcdFx0c29ydGVyczogc29ydGVyc1xuXHRcdH07XG5cdFx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24uU29ydE9yZGVyLmZvckVhY2goKGNvbmRpdGlvbikgPT4ge1xuXHRcdFx0Y29uc3QgY29uZGl0aW9uUHJvcGVydHkgPSBjb25kaXRpb24uUHJvcGVydHk7XG5cdFx0XHRpZiAoY29uZGl0aW9uUHJvcGVydHkgJiYgbm9uU29ydGFibGVQcm9wZXJ0aWVzLmluZGV4T2YoY29uZGl0aW9uUHJvcGVydHkuJHRhcmdldD8ubmFtZSkgPT09IC0xKSB7XG5cdFx0XHRcdGNvbnN0IGluZm9OYW1lID0gY29udmVydFByb3BlcnR5UGF0aHNUb0luZm9OYW1lcyhbY29uZGl0aW9uUHJvcGVydHldLCBjb2x1bW5zKVswXTtcblx0XHRcdFx0aWYgKGluZm9OYW1lKSB7XG5cdFx0XHRcdFx0Y29uZGl0aW9ucy5zb3J0ZXJzLnB1c2goe1xuXHRcdFx0XHRcdFx0bmFtZTogaW5mb05hbWUsXG5cdFx0XHRcdFx0XHRkZXNjZW5kaW5nOiAhIWNvbmRpdGlvbi5EZXNjZW5kaW5nXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRzb3J0Q29uZGl0aW9ucyA9IGNvbmRpdGlvbnMuc29ydGVycy5sZW5ndGggPyBKU09OLnN0cmluZ2lmeShjb25kaXRpb25zKSA6IHVuZGVmaW5lZDtcblx0fVxuXHRyZXR1cm4gc29ydENvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYXJyYXkgb2YgcHJvcGVydHlQYXRoIHRvIGFuIGFycmF5IG9mIHByb3BlcnR5SW5mbyBuYW1lcy5cbiAqXG4gKiBAcGFyYW0gcGF0aHMgdGhlIGFycmF5IHRvIGJlIGNvbnZlcnRlZFxuICogQHBhcmFtIGNvbHVtbnMgdGhlIGFycmF5IG9mIHByb3BlcnR5SW5mb3NcbiAqIEByZXR1cm5zIGFuIGFycmF5IG9mIHByb3BlcnR5SW5mbyBuYW1lc1xuICovXG5cbmZ1bmN0aW9uIGNvbnZlcnRQcm9wZXJ0eVBhdGhzVG9JbmZvTmFtZXMocGF0aHM6IFByb3BlcnR5UGF0aFtdLCBjb2x1bW5zOiBUYWJsZUNvbHVtbltdKTogc3RyaW5nW10ge1xuXHRjb25zdCBpbmZvTmFtZXM6IHN0cmluZ1tdID0gW107XG5cdHBhdGhzLmZvckVhY2goKGN1cnJlbnRQYXRoKSA9PiB7XG5cdFx0aWYgKGN1cnJlbnRQYXRoPy4kdGFyZ2V0Py5uYW1lKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eUluZm8gPSBjb2x1bW5zLmZpbmQoKGNvbHVtbikgPT4ge1xuXHRcdFx0XHRjb25zdCBhbm5vdGF0aW9uQ29sdW1uID0gY29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRcdFx0cmV0dXJuICFhbm5vdGF0aW9uQ29sdW1uLnByb3BlcnR5SW5mb3MgJiYgYW5ub3RhdGlvbkNvbHVtbi5yZWxhdGl2ZVBhdGggPT09IGN1cnJlbnRQYXRoPy4kdGFyZ2V0Py5uYW1lO1xuXHRcdFx0fSk7XG5cdFx0XHRpZiAocHJvcGVydHlJbmZvKSB7XG5cdFx0XHRcdGluZm9OYW1lcy5wdXNoKHByb3BlcnR5SW5mby5uYW1lKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdHJldHVybiBpbmZvTmFtZXM7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIEpTT04gc3RyaW5nIGNvbnRhaW5pbmcgUHJlc2VudGF0aW9uIFZhcmlhbnQgZ3JvdXAgY29uZGl0aW9ucy5cbiAqXG4gKiBAcGFyYW0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24gUHJlc2VudGF0aW9uIHZhcmlhbnQgYW5ub3RhdGlvblxuICogQHBhcmFtIGNvbHVtbnMgQ29udmVydGVyIHByb2Nlc3NlZCB0YWJsZSBjb2x1bW5zXG4gKiBAcGFyYW0gdGFibGVUeXBlIFRoZSB0YWJsZSB0eXBlLlxuICogQHJldHVybnMgR3JvdXAgY29uZGl0aW9ucyBmb3IgYSBQcmVzZW50YXRpb24gdmFyaWFudC5cbiAqL1xuZnVuY3Rpb24gZ2V0R3JvdXBDb25kaXRpb25zKFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbjogUHJlc2VudGF0aW9uVmFyaWFudFR5cGUgfCB1bmRlZmluZWQsXG5cdGNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdHRhYmxlVHlwZTogc3RyaW5nXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRsZXQgZ3JvdXBDb25kaXRpb25zOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGlmIChwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj8uR3JvdXBCeSkge1xuXHRcdGxldCBhR3JvdXBCeSA9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLkdyb3VwQnk7XG5cdFx0aWYgKHRhYmxlVHlwZSA9PT0gXCJSZXNwb25zaXZlVGFibGVcIikge1xuXHRcdFx0YUdyb3VwQnkgPSBhR3JvdXBCeS5zbGljZSgwLCAxKTtcblx0XHR9XG5cdFx0Y29uc3QgYUdyb3VwTGV2ZWxzID0gY29udmVydFByb3BlcnR5UGF0aHNUb0luZm9OYW1lcyhhR3JvdXBCeSwgY29sdW1ucykubWFwKChpbmZvTmFtZSkgPT4ge1xuXHRcdFx0cmV0dXJuIHsgbmFtZTogaW5mb05hbWUgfTtcblx0XHR9KTtcblxuXHRcdGdyb3VwQ29uZGl0aW9ucyA9IGFHcm91cExldmVscy5sZW5ndGggPyBKU09OLnN0cmluZ2lmeSh7IGdyb3VwTGV2ZWxzOiBhR3JvdXBMZXZlbHMgfSkgOiB1bmRlZmluZWQ7XG5cdH1cblx0cmV0dXJuIGdyb3VwQ29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBQcmVzZW50YXRpb24gVmFyaWFudCBhZ2dyZWdhdGUgY29uZGl0aW9ucy5cbiAqXG4gKiBAcGFyYW0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24gUHJlc2VudGF0aW9uIHZhcmlhbnQgYW5ub3RhdGlvblxuICogQHBhcmFtIGNvbHVtbnMgQ29udmVydGVyIHByb2Nlc3NlZCB0YWJsZSBjb2x1bW5zXG4gKiBAcmV0dXJucyBHcm91cCBjb25kaXRpb25zIGZvciBhIFByZXNlbnRhdGlvbiB2YXJpYW50LlxuICovXG5mdW5jdGlvbiBnZXRBZ2dyZWdhdGVDb25kaXRpb25zKFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbjogUHJlc2VudGF0aW9uVmFyaWFudFR5cGUgfCB1bmRlZmluZWQsXG5cdGNvbHVtbnM6IFRhYmxlQ29sdW1uW11cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGxldCBhZ2dyZWdhdGVDb25kaXRpb25zOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGlmIChwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj8uVG90YWwpIHtcblx0XHRjb25zdCBhVG90YWxzID0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24uVG90YWw7XG5cdFx0Y29uc3QgYWdncmVnYXRlczogUmVjb3JkPHN0cmluZywgb2JqZWN0PiA9IHt9O1xuXHRcdGNvbnZlcnRQcm9wZXJ0eVBhdGhzVG9JbmZvTmFtZXMoYVRvdGFscywgY29sdW1ucykuZm9yRWFjaCgoaW5mb05hbWUpID0+IHtcblx0XHRcdGFnZ3JlZ2F0ZXNbaW5mb05hbWVdID0ge307XG5cdFx0fSk7XG5cblx0XHRhZ2dyZWdhdGVDb25kaXRpb25zID0gSlNPTi5zdHJpbmdpZnkoYWdncmVnYXRlcyk7XG5cdH1cblxuXHRyZXR1cm4gYWdncmVnYXRlQ29uZGl0aW9ucztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24oXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0gfCB1bmRlZmluZWQsXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uLFxuXHRjb2x1bW5zOiBUYWJsZUNvbHVtbltdLFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj86IFByZXNlbnRhdGlvblZhcmlhbnRUeXBlLFxuXHR2aWV3Q29uZmlndXJhdGlvbj86IFZpZXdQYXRoQ29uZmlndXJhdGlvblxuKTogVGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbiB7XG5cdC8vIE5lZWQgdG8gZ2V0IHRoZSB0YXJnZXRcblx0Y29uc3QgeyBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoIH0gPSBzcGxpdFBhdGgodmlzdWFsaXphdGlvblBhdGgpO1xuXHRjb25zdCB0aXRsZTogYW55ID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkudGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uVUk/LkhlYWRlckluZm8/LlR5cGVOYW1lUGx1cmFsO1xuXHRjb25zdCBlbnRpdHlTZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKS50YXJnZXRFbnRpdHlTZXQ7XG5cdGNvbnN0IHBhZ2VNYW5pZmVzdFNldHRpbmdzOiBNYW5pZmVzdFdyYXBwZXIgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpO1xuXHRjb25zdCBoYXNBYnNvbHV0ZVBhdGggPSBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoLmxlbmd0aCA9PT0gMCxcblx0XHRwMTNuTW9kZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gZ2V0UDEzbk1vZGUodmlzdWFsaXphdGlvblBhdGgsIGNvbnZlcnRlckNvbnRleHQsIHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uKSxcblx0XHRpZCA9IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPyBnZXRUYWJsZUlEKHZpc3VhbGl6YXRpb25QYXRoKSA6IGdldFRhYmxlSUQoY29udmVydGVyQ29udGV4dC5nZXRDb250ZXh0UGF0aCgpLCBcIkxpbmVJdGVtXCIpO1xuXHRjb25zdCB0YXJnZXRDYXBhYmlsaXRpZXMgPSBnZXRDYXBhYmlsaXR5UmVzdHJpY3Rpb24oY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IG5hdmlnYXRpb25UYXJnZXRQYXRoID0gZ2V0TmF2aWdhdGlvblRhcmdldFBhdGgoY29udmVydGVyQ29udGV4dCwgbmF2aWdhdGlvblByb3BlcnR5UGF0aCk7XG5cdGNvbnN0IG5hdmlnYXRpb25TZXR0aW5ncyA9IHBhZ2VNYW5pZmVzdFNldHRpbmdzLmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKG5hdmlnYXRpb25UYXJnZXRQYXRoKTtcblx0Y29uc3QgY3JlYXRpb25CZWhhdmlvdXIgPSBfZ2V0Q3JlYXRpb25CZWhhdmlvdXIoXG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0bmF2aWdhdGlvblNldHRpbmdzLFxuXHRcdHZpc3VhbGl6YXRpb25QYXRoXG5cdCk7XG5cdGNvbnN0IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQgPSBnZW5lcmF0ZVN0YW5kYXJkQWN0aW9uc0NvbnRleHQoXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRjcmVhdGlvbkJlaGF2aW91ci5tb2RlIGFzIENyZWF0aW9uTW9kZSxcblx0XHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbixcblx0XHR2aWV3Q29uZmlndXJhdGlvblxuXHQpO1xuXG5cdGNvbnN0IGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uID0gZ2V0RGVsZXRlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblx0Y29uc3QgY3JlYXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24gPSBnZXRDcmVhdGVWaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpO1xuXHRjb25zdCBtYXNzRWRpdEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uID0gZ2V0TWFzc0VkaXRWaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpO1xuXHRjb25zdCBpc0luc2VydFVwZGF0ZVRlbXBsYXRlZCA9IGdldEluc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0aW5nKFxuXHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdFx0aXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkKGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdGNvbXBpbGVFeHByZXNzaW9uKGNyZWF0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uKSA9PT0gXCJmYWxzZVwiXG5cdCk7XG5cblx0Y29uc3Qgc2VsZWN0aW9uTW9kZSA9IGdldFNlbGVjdGlvbk1vZGUoXG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdHZpc3VhbGl6YXRpb25QYXRoLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0aGFzQWJzb2x1dGVQYXRoLFxuXHRcdHRhcmdldENhcGFiaWxpdGllcyxcblx0XHRkZWxldGVCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbixcblx0XHRtYXNzRWRpdEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uXG5cdCk7XG5cdGxldCB0aHJlc2hvbGQgPSBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoID8gMTAgOiAzMDtcblx0aWYgKHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPy5NYXhJdGVtcykge1xuXHRcdHRocmVzaG9sZCA9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLk1heEl0ZW1zLnZhbHVlT2YoKSBhcyBudW1iZXI7XG5cdH1cblxuXHRjb25zdCB2YXJpYW50TWFuYWdlbWVudDogVmFyaWFudE1hbmFnZW1lbnRUeXBlID0gcGFnZU1hbmlmZXN0U2V0dGluZ3MuZ2V0VmFyaWFudE1hbmFnZW1lbnQoKTtcblx0Y29uc3QgaXNTZWFyY2hhYmxlID0gaXNQYXRoU2VhcmNoYWJsZShjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSk7XG5cdGNvbnN0IHN0YW5kYXJkQWN0aW9ucyA9IHtcblx0XHRjcmVhdGU6IGdldFN0YW5kYXJkQWN0aW9uQ3JlYXRlKGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpLFxuXHRcdFwiZGVsZXRlXCI6IGdldFN0YW5kYXJkQWN0aW9uRGVsZXRlKGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpLFxuXHRcdHBhc3RlOiBnZXRTdGFuZGFyZEFjdGlvblBhc3RlKGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGlzSW5zZXJ0VXBkYXRlVGVtcGxhdGVkKSxcblx0XHRtYXNzRWRpdDogZ2V0U3RhbmRhcmRBY3Rpb25NYXNzRWRpdChjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KSxcblx0XHRjcmVhdGlvblJvdzogZ2V0Q3JlYXRpb25Sb3coY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dClcblx0fTtcblxuXHRyZXR1cm4ge1xuXHRcdGlkOiBpZCxcblx0XHRlbnRpdHlOYW1lOiBlbnRpdHlTZXQgPyBlbnRpdHlTZXQubmFtZSA6IFwiXCIsXG5cdFx0Y29sbGVjdGlvbjogZ2V0VGFyZ2V0T2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSksXG5cdFx0bmF2aWdhdGlvblBhdGg6IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsXG5cdFx0cm93OiBfZ2V0Um93Q29uZmlndXJhdGlvblByb3BlcnR5KFxuXHRcdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdFx0dmlzdWFsaXphdGlvblBhdGgsXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0bmF2aWdhdGlvblNldHRpbmdzLFxuXHRcdFx0bmF2aWdhdGlvblRhcmdldFBhdGhcblx0XHQpLFxuXHRcdHAxM25Nb2RlOiBwMTNuTW9kZSxcblx0XHRzdGFuZGFyZEFjdGlvbnM6IHtcblx0XHRcdGFjdGlvbnM6IHN0YW5kYXJkQWN0aW9ucyxcblx0XHRcdGlzSW5zZXJ0VXBkYXRlVGVtcGxhdGVkOiBpc0luc2VydFVwZGF0ZVRlbXBsYXRlZCxcblx0XHRcdHVwZGF0YWJsZVByb3BlcnR5UGF0aDogZ2V0Q3VycmVudEVudGl0eVNldFVwZGF0YWJsZVBhdGgoY29udmVydGVyQ29udGV4dClcblx0XHR9LFxuXHRcdGRpc3BsYXlNb2RlOiBpc0luRGlzcGxheU1vZGUoY29udmVydGVyQ29udGV4dCwgdmlld0NvbmZpZ3VyYXRpb24pLFxuXHRcdGNyZWF0ZTogY3JlYXRpb25CZWhhdmlvdXIsXG5cdFx0c2VsZWN0aW9uTW9kZTogc2VsZWN0aW9uTW9kZSxcblx0XHRhdXRvQmluZE9uSW5pdDpcblx0XHRcdF9pc0ZpbHRlckJhckhpZGRlbihwYWdlTWFuaWZlc3RTZXR0aW5ncywgY29udmVydGVyQ29udGV4dCkgfHxcblx0XHRcdChjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCAmJlxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlICYmXG5cdFx0XHRcdCEodmlld0NvbmZpZ3VyYXRpb24gJiYgcGFnZU1hbmlmZXN0U2V0dGluZ3MuaGFzTXVsdGlwbGVWaXN1YWxpemF0aW9ucyh2aWV3Q29uZmlndXJhdGlvbikpKSxcblx0XHR2YXJpYW50TWFuYWdlbWVudDogdmFyaWFudE1hbmFnZW1lbnQgPT09IFwiQ29udHJvbFwiICYmICFwMTNuTW9kZSA/IFZhcmlhbnRNYW5hZ2VtZW50VHlwZS5Ob25lIDogdmFyaWFudE1hbmFnZW1lbnQsXG5cdFx0dGhyZXNob2xkOiB0aHJlc2hvbGQsXG5cdFx0c29ydENvbmRpdGlvbnM6IGdldFNvcnRDb25kaXRpb25zKGNvbnZlcnRlckNvbnRleHQsIHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLCBjb2x1bW5zKSxcblx0XHR0aXRsZTogdGl0bGUsXG5cdFx0c2VhcmNoYWJsZTogdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udHlwZSAhPT0gXCJBbmFseXRpY2FsVGFibGVcIiAmJiAhKGlzQ29uc3RhbnQoaXNTZWFyY2hhYmxlKSAmJiBpc1NlYXJjaGFibGUudmFsdWUgPT09IGZhbHNlKVxuXHR9O1xufVxuXG5mdW5jdGlvbiBfZ2V0RXhwb3J0RGF0YVR5cGUoZGF0YVR5cGU6IHN0cmluZywgaXNDb21wbGV4UHJvcGVydHk6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG5cdGxldCBleHBvcnREYXRhVHlwZTogc3RyaW5nID0gXCJTdHJpbmdcIjtcblx0aWYgKGlzQ29tcGxleFByb3BlcnR5KSB7XG5cdFx0aWYgKGRhdGFUeXBlID09PSBcIkVkbS5EYXRlVGltZU9mZnNldFwiKSB7XG5cdFx0XHRleHBvcnREYXRhVHlwZSA9IFwiRGF0ZVRpbWVcIjtcblx0XHR9XG5cdFx0cmV0dXJuIGV4cG9ydERhdGFUeXBlO1xuXHR9IGVsc2Uge1xuXHRcdHN3aXRjaCAoZGF0YVR5cGUpIHtcblx0XHRcdGNhc2UgXCJFZG0uRGVjaW1hbFwiOlxuXHRcdFx0Y2FzZSBcIkVkbS5JbnQzMlwiOlxuXHRcdFx0Y2FzZSBcIkVkbS5JbnQ2NFwiOlxuXHRcdFx0Y2FzZSBcIkVkbS5Eb3VibGVcIjpcblx0XHRcdGNhc2UgXCJFZG0uQnl0ZVwiOlxuXHRcdFx0XHRleHBvcnREYXRhVHlwZSA9IFwiTnVtYmVyXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkVkbS5EYXRlT2ZUaW1lXCI6XG5cdFx0XHRjYXNlIFwiRWRtLkRhdGVcIjpcblx0XHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIkRhdGVcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCI6XG5cdFx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJEYXRlVGltZVwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJFZG0uVGltZU9mRGF5XCI6XG5cdFx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJUaW1lXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkVkbS5Cb29sZWFuXCI6XG5cdFx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJCb29sZWFuXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIlN0cmluZ1wiO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZXhwb3J0RGF0YVR5cGU7XG59XG5cbi8qKlxuICogU3BsaXQgdGhlIHZpc3VhbGl6YXRpb24gcGF0aCBpbnRvIHRoZSBuYXZpZ2F0aW9uIHByb3BlcnR5IHBhdGggYW5kIGFubm90YXRpb24uXG4gKlxuICogQHBhcmFtIHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcmV0dXJucyBUaGUgc3BsaXQgcGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRQYXRoKHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcpIHtcblx0bGV0IFtuYXZpZ2F0aW9uUHJvcGVydHlQYXRoLCBhbm5vdGF0aW9uUGF0aF0gPSB2aXN1YWxpemF0aW9uUGF0aC5zcGxpdChcIkBcIik7XG5cblx0aWYgKG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgubGFzdEluZGV4T2YoXCIvXCIpID09PSBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoLmxlbmd0aCAtIDEpIHtcblx0XHQvLyBEcm9wIHRyYWlsaW5nIHNsYXNoXG5cdFx0bmF2aWdhdGlvblByb3BlcnR5UGF0aCA9IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGguc3Vic3RyKDAsIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgubGVuZ3RoIC0gMSk7XG5cdH1cblx0cmV0dXJuIHsgbmF2aWdhdGlvblByb3BlcnR5UGF0aCwgYW5ub3RhdGlvblBhdGggfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uKFxuXHRzZWxlY3Rpb25WYXJpYW50UGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IHJlc29sdmVkVGFyZ2V0ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlQW5ub3RhdGlvbihzZWxlY3Rpb25WYXJpYW50UGF0aCk7XG5cdGNvbnN0IHNlbGVjdGlvbjogU2VsZWN0aW9uVmFyaWFudFR5cGUgPSByZXNvbHZlZFRhcmdldC5hbm5vdGF0aW9uIGFzIFNlbGVjdGlvblZhcmlhbnRUeXBlO1xuXG5cdGlmIChzZWxlY3Rpb24pIHtcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdHNlbGVjdGlvbi5TZWxlY3RPcHRpb25zPy5mb3JFYWNoKChzZWxlY3RPcHRpb246IFNlbGVjdE9wdGlvblR5cGUpID0+IHtcblx0XHRcdGNvbnN0IHByb3BlcnR5TmFtZTogYW55ID0gc2VsZWN0T3B0aW9uLlByb3BlcnR5TmFtZTtcblx0XHRcdGNvbnN0IHByb3BlcnR5UGF0aDogc3RyaW5nID0gcHJvcGVydHlOYW1lLnZhbHVlO1xuXHRcdFx0aWYgKHByb3BlcnR5TmFtZXMuaW5kZXhPZihwcm9wZXJ0eVBhdGgpID09PSAtMSkge1xuXHRcdFx0XHRwcm9wZXJ0eU5hbWVzLnB1c2gocHJvcGVydHlQYXRoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dGV4dDogc2VsZWN0aW9uPy5UZXh0Py50b1N0cmluZygpLFxuXHRcdFx0cHJvcGVydHlOYW1lczogcHJvcGVydHlOYW1lc1xuXHRcdH07XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gX2dldEZ1bGxTY3JlZW5CYXNlZE9uRGV2aWNlKFxuXHR0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRpc0lwaG9uZTogYm9vbGVhblxuKTogYm9vbGVhbiB7XG5cdC8vIElmIGVuYWJsZUZ1bGxTY3JlZW4gaXMgbm90IHNldCwgdXNlIGFzIGRlZmF1bHQgdHJ1ZSBvbiBwaG9uZSBhbmQgZmFsc2Ugb3RoZXJ3aXNlXG5cdGxldCBlbmFibGVGdWxsU2NyZWVuID0gdGFibGVTZXR0aW5ncy5lbmFibGVGdWxsU2NyZWVuID8/IGlzSXBob25lO1xuXHQvLyBNYWtlIHN1cmUgdGhhdCBlbmFibGVGdWxsU2NyZWVuIGlzIG5vdCBzZXQgb24gTGlzdFJlcG9ydCBmb3IgZGVza3RvcCBvciB0YWJsZXRcblx0aWYgKCFpc0lwaG9uZSAmJiBlbmFibGVGdWxsU2NyZWVuICYmIGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0KSB7XG5cdFx0ZW5hYmxlRnVsbFNjcmVlbiA9IGZhbHNlO1xuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGlhZ25vc3RpY3MoKS5hZGRJc3N1ZShJc3N1ZUNhdGVnb3J5Lk1hbmlmZXN0LCBJc3N1ZVNldmVyaXR5LkxvdywgSXNzdWVUeXBlLkZVTExTQ1JFRU5NT0RFX05PVF9PTl9MSVNUUkVQT1JUKTtcblx0fVxuXHRyZXR1cm4gZW5hYmxlRnVsbFNjcmVlbjtcbn1cblxuZnVuY3Rpb24gX2dldE11bHRpU2VsZWN0TW9kZShcblx0dGFibGVTZXR0aW5nczogVGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGxldCBtdWx0aVNlbGVjdE1vZGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0aWYgKHRhYmxlVHlwZSAhPT0gXCJSZXNwb25zaXZlVGFibGVcIikge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0c3dpdGNoIChjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpKSB7XG5cdFx0Y2FzZSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydDpcblx0XHRjYXNlIFRlbXBsYXRlVHlwZS5BbmFseXRpY2FsTGlzdFBhZ2U6XG5cdFx0XHRtdWx0aVNlbGVjdE1vZGUgPSAhdGFibGVTZXR0aW5ncy5zZWxlY3RBbGwgPyBcIkNsZWFyQWxsXCIgOiBcIkRlZmF1bHRcIjtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgVGVtcGxhdGVUeXBlLk9iamVjdFBhZ2U6XG5cdFx0XHRtdWx0aVNlbGVjdE1vZGUgPSB0YWJsZVNldHRpbmdzLnNlbGVjdEFsbCA9PT0gZmFsc2UgPyBcIkNsZWFyQWxsXCIgOiBcIkRlZmF1bHRcIjtcblx0XHRcdGlmIChjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLnVzZUljb25UYWJCYXIoKSkge1xuXHRcdFx0XHRtdWx0aVNlbGVjdE1vZGUgPSAhdGFibGVTZXR0aW5ncy5zZWxlY3RBbGwgPyBcIkNsZWFyQWxsXCIgOiBcIkRlZmF1bHRcIjtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdH1cblxuXHRyZXR1cm4gbXVsdGlTZWxlY3RNb2RlO1xufVxuXG5mdW5jdGlvbiBfZ2V0VGFibGVUeXBlKFxuXHR0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHRhZ2dyZWdhdGlvbkhlbHBlcjogQWdncmVnYXRpb25IZWxwZXIsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IFRhYmxlVHlwZSB7XG5cdGxldCB0YWJsZVR5cGUgPSB0YWJsZVNldHRpbmdzPy50eXBlIHx8IFwiUmVzcG9uc2l2ZVRhYmxlXCI7XG5cdC8qICBOb3csIHdlIGtlZXAgdGhlIGNvbmZpZ3VyYXRpb24gaW4gdGhlIG1hbmlmZXN0LCBldmVuIGlmIGl0IGxlYWRzIHRvIGVycm9ycy5cblx0XHRXZSBvbmx5IGNoYW5nZSBpZiB3ZSdyZSBub3Qgb24gZGVza3RvcCBmcm9tIEFuYWx5dGljYWwgdG8gUmVzcG9uc2l2ZS5cblx0ICovXG5cdGlmICh0YWJsZVR5cGUgPT09IFwiQW5hbHl0aWNhbFRhYmxlXCIgJiYgIWNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuaXNEZXNrdG9wKCkpIHtcblx0XHR0YWJsZVR5cGUgPSBcIlJlc3BvbnNpdmVUYWJsZVwiO1xuXHR9XG5cdHJldHVybiB0YWJsZVR5cGU7XG59XG5cbmZ1bmN0aW9uIF9nZXRGaWx0ZXJzKFxuXHR0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHRxdWlja0ZpbHRlclBhdGhzOiB7IGFubm90YXRpb25QYXRoOiBzdHJpbmcgfVtdLFxuXHRxdWlja1NlbGVjdGlvblZhcmlhbnQ6IGFueSxcblx0cGF0aDogeyBhbm5vdGF0aW9uUGF0aDogc3RyaW5nIH0sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IGFueSB7XG5cdGlmIChxdWlja1NlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRxdWlja0ZpbHRlclBhdGhzLnB1c2goeyBhbm5vdGF0aW9uUGF0aDogcGF0aC5hbm5vdGF0aW9uUGF0aCB9KTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHF1aWNrRmlsdGVyczoge1xuXHRcdFx0ZW5hYmxlZDpcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQgPyBcIns9ICR7cGFnZUludGVybmFsPmhhc1BlbmRpbmdGaWx0ZXJzfSAhPT0gdHJ1ZX1cIiA6IHRydWUsXG5cdFx0XHRzaG93Q291bnRzOiB0YWJsZVNldHRpbmdzPy5xdWlja1ZhcmlhbnRTZWxlY3Rpb24/LnNob3dDb3VudHMsXG5cdFx0XHRwYXRoczogcXVpY2tGaWx0ZXJQYXRoc1xuXHRcdH1cblx0fTtcbn1cblxuZnVuY3Rpb24gX2dldEVuYWJsZUV4cG9ydChcblx0dGFibGVTZXR0aW5nczogVGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0ZW5hYmxlUGFzdGU6IGJvb2xlYW5cbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gdGFibGVTZXR0aW5ncy5lbmFibGVFeHBvcnQgIT09IHVuZGVmaW5lZFxuXHRcdD8gdGFibGVTZXR0aW5ncy5lbmFibGVFeHBvcnRcblx0XHQ6IGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFwiT2JqZWN0UGFnZVwiIHx8IGVuYWJsZVBhc3RlO1xufVxuXG5mdW5jdGlvbiBfZ2V0RmlsdGVyQ29uZmlndXJhdGlvbihcblx0dGFibGVTZXR0aW5nczogVGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogYW55IHtcblx0aWYgKCFsaW5lSXRlbUFubm90YXRpb24pIHtcblx0XHRyZXR1cm4ge307XG5cdH1cblx0Y29uc3QgcXVpY2tGaWx0ZXJQYXRoczogeyBhbm5vdGF0aW9uUGF0aDogc3RyaW5nIH1bXSA9IFtdO1xuXHRjb25zdCB0YXJnZXRFbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZShsaW5lSXRlbUFubm90YXRpb24pO1xuXHRsZXQgcXVpY2tTZWxlY3Rpb25WYXJpYW50OiBhbnk7XG5cdGxldCBmaWx0ZXJzO1xuXHR0YWJsZVNldHRpbmdzPy5xdWlja1ZhcmlhbnRTZWxlY3Rpb24/LnBhdGhzPy5mb3JFYWNoKChwYXRoOiB7IGFubm90YXRpb25QYXRoOiBzdHJpbmcgfSkgPT4ge1xuXHRcdHF1aWNrU2VsZWN0aW9uVmFyaWFudCA9IHRhcmdldEVudGl0eVR5cGUucmVzb2x2ZVBhdGgoYEAke3BhdGguYW5ub3RhdGlvblBhdGh9YCk7XG5cdFx0ZmlsdGVycyA9IF9nZXRGaWx0ZXJzKHRhYmxlU2V0dGluZ3MsIHF1aWNrRmlsdGVyUGF0aHMsIHF1aWNrU2VsZWN0aW9uVmFyaWFudCwgcGF0aCwgY29udmVydGVyQ29udGV4dCk7XG5cdH0pO1xuXG5cdGxldCBoaWRlVGFibGVUaXRsZSA9IGZhbHNlO1xuXHRoaWRlVGFibGVUaXRsZSA9ICEhdGFibGVTZXR0aW5ncy5xdWlja1ZhcmlhbnRTZWxlY3Rpb24/LmhpZGVUYWJsZVRpdGxlO1xuXHRyZXR1cm4ge1xuXHRcdGZpbHRlcnM6IGZpbHRlcnMsXG5cdFx0aGVhZGVyVmlzaWJsZTogIShxdWlja1NlbGVjdGlvblZhcmlhbnQgJiYgaGlkZVRhYmxlVGl0bGUpXG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbihcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0Y2hlY2tDb25kZW5zZWRMYXlvdXQgPSBmYWxzZVxuKTogVGFibGVDb250cm9sQ29uZmlndXJhdGlvbiB7XG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RTZXR0aW5nczogVGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpO1xuXHRjb25zdCB0YWJsZVNldHRpbmdzID0gKHRhYmxlTWFuaWZlc3RTZXR0aW5ncyAmJiB0YWJsZU1hbmlmZXN0U2V0dGluZ3MudGFibGVTZXR0aW5ncykgfHwge307XG5cdGNvbnN0IGNyZWF0aW9uTW9kZSA9IHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5uYW1lIHx8IENyZWF0aW9uTW9kZS5OZXdQYWdlO1xuXHRjb25zdCBlbmFibGVBdXRvQ29sdW1uV2lkdGggPSAhY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5pc1Bob25lKCk7XG5cdGNvbnN0IGVuYWJsZVBhc3RlID1cblx0XHR0YWJsZVNldHRpbmdzLmVuYWJsZVBhc3RlICE9PSB1bmRlZmluZWQgPyB0YWJsZVNldHRpbmdzLmVuYWJsZVBhc3RlIDogY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gXCJPYmplY3RQYWdlXCI7IC8vIFBhc3RlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgZXhjZXB0ZWQgZm9yIE9QXG5cdGNvbnN0IGRhdGFTdGF0ZUluZGljYXRvckZpbHRlciA9XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQgPyBcIkFQSS5kYXRhU3RhdGVJbmRpY2F0b3JGaWx0ZXJcIiA6IHVuZGVmaW5lZDtcblx0Y29uc3QgaXNDb25kZW5zZWRUYWJsZUxheW91dENvbXBsaWFudCA9IGNoZWNrQ29uZGVuc2VkTGF5b3V0ICYmIGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuaXNDb25kZW5zZWRMYXlvdXRDb21wbGlhbnQoKTtcblx0Y29uc3Qgb0ZpbHRlckNvbmZpZ3VyYXRpb24gPSBfZ2V0RmlsdGVyQ29uZmlndXJhdGlvbih0YWJsZVNldHRpbmdzLCBsaW5lSXRlbUFubm90YXRpb24sIGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gPSB0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uO1xuXHRjb25zdCBlbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCk7XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCB0YWJsZVR5cGU6IFRhYmxlVHlwZSA9IF9nZXRUYWJsZVR5cGUodGFibGVTZXR0aW5ncywgYWdncmVnYXRpb25IZWxwZXIsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBjb25kZW5zZWRUYWJsZUxheW91dCA9XG5cdFx0dGFibGVTZXR0aW5ncy5jb25kZW5zZWRUYWJsZUxheW91dCAhPT0gdW5kZWZpbmVkICYmIHRhYmxlVHlwZSAhPT0gXCJSZXNwb25zaXZlVGFibGVcIiA/IHRhYmxlU2V0dGluZ3MuY29uZGVuc2VkVGFibGVMYXlvdXQgOiBmYWxzZTtcblx0Y29uc3Qgb0NvbmZpZ3VyYXRpb24gPSB7XG5cdFx0Ly8gSWYgbm8gY3JlYXRlQXRFbmQgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgZmFsc2UgZm9yIElubGluZSBjcmVhdGUgYW5kIHRydWUgb3RoZXJ3aXNlXG5cdFx0Y3JlYXRlQXRFbmQ6XG5cdFx0XHR0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uY3JlYXRlQXRFbmQgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQ/IHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5jcmVhdGVBdEVuZFxuXHRcdFx0XHQ6IGNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLklubGluZSxcblx0XHRjcmVhdGlvbk1vZGU6IGNyZWF0aW9uTW9kZSxcblx0XHRjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb246IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRkYXRhU3RhdGVJbmRpY2F0b3JGaWx0ZXI6IGRhdGFTdGF0ZUluZGljYXRvckZpbHRlcixcblx0XHQvLyBpZiBhIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uIGlzIHByb3ZpZGVkLCBkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCwgaS5lLiBzZXQgdG8gZmFsc2Vcblx0XHRkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhOiAhY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uID8gISF0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSA6IGZhbHNlLFxuXHRcdGVuYWJsZUF1dG9Db2x1bW5XaWR0aDogZW5hYmxlQXV0b0NvbHVtbldpZHRoLFxuXHRcdGVuYWJsZUV4cG9ydDogX2dldEVuYWJsZUV4cG9ydCh0YWJsZVNldHRpbmdzLCBjb252ZXJ0ZXJDb250ZXh0LCBlbmFibGVQYXN0ZSksXG5cdFx0ZW5hYmxlRnVsbFNjcmVlbjogX2dldEZ1bGxTY3JlZW5CYXNlZE9uRGV2aWNlKHRhYmxlU2V0dGluZ3MsIGNvbnZlcnRlckNvbnRleHQsIGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuaXNQaG9uZSgpKSxcblx0XHRlbmFibGVNYXNzRWRpdDogdGFibGVTZXR0aW5ncz8uZW5hYmxlTWFzc0VkaXQsXG5cdFx0ZW5hYmxlUGFzdGU6IGVuYWJsZVBhc3RlLFxuXHRcdGhlYWRlclZpc2libGU6IHRydWUsXG5cdFx0bXVsdGlTZWxlY3RNb2RlOiBfZ2V0TXVsdGlTZWxlY3RNb2RlKHRhYmxlU2V0dGluZ3MsIHRhYmxlVHlwZSwgY29udmVydGVyQ29udGV4dCksXG5cdFx0c2VsZWN0aW9uTGltaXQ6IHRhYmxlU2V0dGluZ3Muc2VsZWN0QWxsID09PSB0cnVlIHx8IHRhYmxlU2V0dGluZ3Muc2VsZWN0aW9uTGltaXQgPT09IDAgPyAwIDogdGFibGVTZXR0aW5ncy5zZWxlY3Rpb25MaW1pdCB8fCAyMDAsXG5cdFx0aW5saW5lQ3JlYXRpb25Sb3dDb3VudDogdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmlubGluZUNyZWF0aW9uUm93Q291bnQgPyB0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uaW5saW5lQ3JlYXRpb25Sb3dDb3VudCA6IDIsXG5cdFx0c2hvd1Jvd0NvdW50OlxuXHRcdFx0IXRhYmxlU2V0dGluZ3M/LnF1aWNrVmFyaWFudFNlbGVjdGlvbj8uc2hvd0NvdW50cyAmJiAhY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5nZXRWaWV3Q29uZmlndXJhdGlvbigpPy5zaG93Q291bnRzLFxuXHRcdHR5cGU6IHRhYmxlVHlwZSxcblx0XHR1c2VDb25kZW5zZWRUYWJsZUxheW91dDogY29uZGVuc2VkVGFibGVMYXlvdXQgJiYgaXNDb25kZW5zZWRUYWJsZUxheW91dENvbXBsaWFudCxcblx0XHRpc0NvbXBhY3RUeXBlOiBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmlzQ29tcGFjdFR5cGUoKVxuXHR9O1xuXG5cdHJldHVybiB7IC4uLm9Db25maWd1cmF0aW9uLCAuLi5vRmlsdGVyQ29uZmlndXJhdGlvbiB9O1xufVxuXG5leHBvcnQgdHlwZSBjb25maWdUeXBlQ29uc3RyYWludHMgPSB7XG5cdHNjYWxlPzogbnVtYmVyO1xuXHRwcmVjaXNpb24/OiBudW1iZXI7XG5cdG1heExlbmd0aD86IG51bWJlcjtcblx0bnVsbGFibGU/OiBib29sZWFuO1xuXHRtaW5pbXVtPzogc3RyaW5nO1xuXHRtYXhpbXVtPzogc3RyaW5nO1xuXHRpc0RpZ2l0U2VxdWVuY2U/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgY29uZmlnVHlwZWZvcm1hdE9wdGlvbnMgPSB7XG5cdHBhcnNlQXNTdHJpbmc/OiBib29sZWFuO1xuXHRlbXB0eVN0cmluZz86IHN0cmluZztcblx0cGFyc2VLZWVwc0VtcHR5U3RyaW5nPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIGNvbmZpZ1R5cGUgPSB7XG5cdHR5cGU6IHN0cmluZztcblx0Y29uc3RyYWludHM6IGNvbmZpZ1R5cGVDb25zdHJhaW50cztcblx0Zm9ybWF0T3B0aW9uczogY29uZmlnVHlwZWZvcm1hdE9wdGlvbnM7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZUNvbmZpZyhvUHJvcGVydHk6IFByb3BlcnR5IHwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcywgZGF0YVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGFueSB7XG5cdGxldCBvVGFyZ2V0TWFwcGluZyA9IEVETV9UWVBFX01BUFBJTkdbKG9Qcm9wZXJ0eSBhcyBQcm9wZXJ0eSk/LnR5cGVdIHx8IChkYXRhVHlwZSA/IEVETV9UWVBFX01BUFBJTkdbZGF0YVR5cGVdIDogdW5kZWZpbmVkKTtcblx0aWYgKCFvVGFyZ2V0TWFwcGluZyAmJiAob1Byb3BlcnR5IGFzIFByb3BlcnR5KT8udGFyZ2V0VHlwZSAmJiAob1Byb3BlcnR5IGFzIFByb3BlcnR5KS50YXJnZXRUeXBlPy5fdHlwZSA9PT0gXCJUeXBlRGVmaW5pdGlvblwiKSB7XG5cdFx0b1RhcmdldE1hcHBpbmcgPSBFRE1fVFlQRV9NQVBQSU5HWygob1Byb3BlcnR5IGFzIFByb3BlcnR5KS50YXJnZXRUeXBlIGFzIFR5cGVEZWZpbml0aW9uKS51bmRlcmx5aW5nVHlwZV07XG5cdH1cblx0Y29uc3QgcHJvcGVydHlUeXBlQ29uZmlnOiBjb25maWdUeXBlID0ge1xuXHRcdHR5cGU6IG9UYXJnZXRNYXBwaW5nPy50eXBlLFxuXHRcdGNvbnN0cmFpbnRzOiB7fSxcblx0XHRmb3JtYXRPcHRpb25zOiB7fVxuXHR9O1xuXHRpZiAoaXNQcm9wZXJ0eShvUHJvcGVydHkpKSB7XG5cdFx0cHJvcGVydHlUeXBlQ29uZmlnLmNvbnN0cmFpbnRzID0ge1xuXHRcdFx0c2NhbGU6IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kU2NhbGUgPyBvUHJvcGVydHkuc2NhbGUgOiB1bmRlZmluZWQsXG5cdFx0XHRwcmVjaXNpb246IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kUHJlY2lzaW9uID8gb1Byb3BlcnR5LnByZWNpc2lvbiA6IHVuZGVmaW5lZCxcblx0XHRcdG1heExlbmd0aDogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRNYXhMZW5ndGggPyBvUHJvcGVydHkubWF4TGVuZ3RoIDogdW5kZWZpbmVkLFxuXHRcdFx0bnVsbGFibGU6IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kTnVsbGFibGUgPyBvUHJvcGVydHkubnVsbGFibGUgOiB1bmRlZmluZWQsXG5cdFx0XHRtaW5pbXVtOlxuXHRcdFx0XHRvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uW1wiQE9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1pbmltdW0vJERlY2ltYWxcIl0gJiZcblx0XHRcdFx0IWlzTmFOKG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWluaW11bSlcblx0XHRcdFx0XHQ/IGAke29Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWluaW11bX1gXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRtYXhpbXVtOlxuXHRcdFx0XHRvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uW1wiQE9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1heGltdW0vJERlY2ltYWxcIl0gJiZcblx0XHRcdFx0IWlzTmFOKG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bSlcblx0XHRcdFx0XHQ/IGAke29Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bX1gXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRpc0RpZ2l0U2VxdWVuY2U6XG5cdFx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZy50eXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmluZ1wiICYmXG5cdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRGlnaXRTZXF1ZW5jZVwiXSAmJlxuXHRcdFx0XHRvUHJvcGVydHkuYW5ub3RhdGlvbnM/LkNvbW1vbj8uSXNEaWdpdFNlcXVlbmNlXG5cdFx0XHRcdFx0PyB0cnVlXG5cdFx0XHRcdFx0OiB1bmRlZmluZWRcblx0XHR9O1xuXHR9XG5cdHByb3BlcnR5VHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zID0ge1xuXHRcdHBhcnNlQXNTdHJpbmc6XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5JbnRcIikgPT09IDAgfHxcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRvdWJsZVwiKSA9PT0gMFxuXHRcdFx0XHQ/IGZhbHNlXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdGVtcHR5U3RyaW5nOlxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuSW50XCIpID09PSAwIHx8XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Eb3VibGVcIikgPT09IDBcblx0XHRcdFx0PyBcIlwiXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdHBhcnNlS2VlcHNFbXB0eVN0cmluZzogcHJvcGVydHlUeXBlQ29uZmlnLnR5cGUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyaW5nXCIgPyB0cnVlIDogdW5kZWZpbmVkXG5cdH07XG5cdHJldHVybiBwcm9wZXJ0eVR5cGVDb25maWc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcblx0Z2V0VGFibGVBY3Rpb25zLFxuXHRnZXRUYWJsZUNvbHVtbnMsXG5cdGdldENvbHVtbnNGcm9tRW50aXR5VHlwZSxcblx0dXBkYXRlTGlua2VkUHJvcGVydGllcyxcblx0Y3JlYXRlVGFibGVWaXN1YWxpemF0aW9uLFxuXHRjcmVhdGVEZWZhdWx0VGFibGVWaXN1YWxpemF0aW9uLFxuXHRnZXRDYXBhYmlsaXR5UmVzdHJpY3Rpb24sXG5cdGdldFNlbGVjdGlvbk1vZGUsXG5cdGdldFJvd1N0YXR1c1Zpc2liaWxpdHksXG5cdGdldEltcG9ydGFuY2UsXG5cdGdldFAxM25Nb2RlLFxuXHRnZXRUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uLFxuXHRpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUsXG5cdHNwbGl0UGF0aCxcblx0Z2V0U2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb24sXG5cdGdldFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLFxuXHRnZXRUeXBlQ29uZmlnXG59O1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01Bb05LQSxVOzthQUFBQSxVO0lBQUFBLFU7SUFBQUEsVTtJQUFBQSxVO0tBQUFBLFUsS0FBQUEsVTs7RUFvSEw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU0MsZUFBVCxDQUNOQyxrQkFETSxFQUVOQyxpQkFGTSxFQUdOQyxnQkFITSxFQUlOQyxrQkFKTSxFQUtXO0lBQ2pCLElBQU1DLGFBQWEsR0FBR0MseUJBQXlCLENBQUNMLGtCQUFELEVBQXFCQyxpQkFBckIsRUFBd0NDLGdCQUF4QyxDQUEvQztJQUNBLElBQU1JLGtCQUFrQixHQUFHRixhQUFhLENBQUNHLFlBQXpDO0lBQ0EsSUFBTUMsY0FBYyxHQUFHSixhQUFhLENBQUNLLGtCQUFyQztJQUNBLElBQU1DLGVBQWUsR0FBR0Msc0JBQXNCLENBQzdDVCxnQkFBZ0IsQ0FBQ1UsK0JBQWpCLENBQWlEWCxpQkFBakQsRUFBb0VZLE9BRHZCLEVBRTdDWCxnQkFGNkMsRUFHN0NJLGtCQUg2QyxFQUk3Q0gsa0JBSjZDLEVBSzdDLElBTDZDLEVBTTdDSyxjQU42QyxDQUE5QztJQVFBLElBQU1LLE9BQU8sR0FBR0Msb0JBQW9CLENBQUNSLGtCQUFELEVBQXFCSSxlQUFlLENBQUNHLE9BQXJDLEVBQThDO01BQ2pGRSxXQUFXLEVBQUUsV0FEb0U7TUFFakZDLGNBQWMsRUFBRSxXQUZpRTtNQUdqRkMsZ0JBQWdCLEVBQUUsV0FIK0Q7TUFJakZDLE9BQU8sRUFBRSxXQUp3RTtNQUtqRkMsOEJBQThCLEVBQUUsV0FMaUQ7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
|