@sapui5/sap.fe.core 1.108.2 → 1.110.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/README.md +5 -1
- package/package.json +11 -9
- package/src/.eslintrc +7 -0
- package/src/sap/fe/core/.library +39 -37
- package/src/sap/fe/core/.supportrc +3 -3
- package/src/sap/fe/core/ActionRuntime.js +72 -27
- package/src/sap/fe/core/ActionRuntime.ts +104 -21
- package/src/sap/fe/core/AppComponent.js +102 -120
- package/src/sap/fe/core/AppComponent.ts +148 -45
- package/src/sap/fe/core/AppStateHandler.js +105 -91
- package/src/sap/fe/core/AppStateHandler.ts +85 -23
- package/src/sap/fe/core/BaseController.js +5 -20
- package/src/sap/fe/core/BaseController.ts +11 -2
- package/src/sap/fe/core/CommonUtils.js +770 -1079
- package/src/sap/fe/core/CommonUtils.ts +750 -491
- package/src/sap/fe/core/ExtensionAPI.js +69 -96
- package/src/sap/fe/core/ExtensionAPI.ts +15 -17
- package/src/sap/fe/core/PageController.js +21 -46
- package/src/sap/fe/core/PageController.ts +11 -2
- package/src/sap/fe/core/TemplateComponent.js +6 -51
- package/src/sap/fe/core/TemplateComponent.ts +27 -16
- package/src/sap/fe/core/TemplateModel.js +18 -24
- package/src/sap/fe/core/TemplateModel.ts +25 -6
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +8 -23
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +5 -4
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +146 -180
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +144 -57
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js +43 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.ts +11 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +436 -556
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +288 -157
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +215 -202
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +93 -51
- package/src/sap/fe/core/controllerextensions/BusyLocker.js +11 -26
- package/src/sap/fe/core/controllerextensions/EditFlow.js +407 -596
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +163 -56
- package/src/sap/fe/core/controllerextensions/Feedback.js +70 -0
- package/src/sap/fe/core/controllerextensions/Feedback.ts +64 -0
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +12 -23
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +1 -1
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +127 -182
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +65 -32
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +96 -198
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +4 -5
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +134 -291
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +21 -12
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +111 -214
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +44 -44
- package/src/sap/fe/core/controllerextensions/MassEdit.js +24 -44
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +3 -2
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +39 -52
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +26 -7
- package/src/sap/fe/core/controllerextensions/PageReady.js +81 -119
- package/src/sap/fe/core/controllerextensions/PageReady.ts +36 -15
- package/src/sap/fe/core/controllerextensions/Paginator.js +16 -51
- package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -3
- package/src/sap/fe/core/controllerextensions/Placeholder.js +7 -33
- package/src/sap/fe/core/controllerextensions/Routing.js +24 -32
- package/src/sap/fe/core/controllerextensions/Routing.ts +6 -1
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
- package/src/sap/fe/core/controllerextensions/Share.js +53 -98
- package/src/sap/fe/core/controllerextensions/Share.ts +6 -3
- package/src/sap/fe/core/controllerextensions/SideEffects.js +103 -174
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +37 -22
- package/src/sap/fe/core/controllerextensions/ViewState.js +341 -276
- package/src/sap/fe/core/controllerextensions/ViewState.ts +236 -84
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +6 -22
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -2
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +66 -88
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +64 -17
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +28 -34
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +22 -1
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +69 -65
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +31 -12
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +15 -13
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +273 -906
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +142 -420
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +49 -115
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +12 -7
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +70 -89
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +313 -320
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +582 -683
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +507 -386
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +111 -102
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +102 -79
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +689 -154
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +866 -31
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +24 -101
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +5 -5
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +91 -217
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +3 -20
- package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +1 -0
- package/src/sap/fe/core/controls/ActionPartial.fragment.xml +46 -46
- package/src/sap/fe/core/controls/Any.js +1 -1
- package/src/sap/fe/core/controls/AnyElement.js +1 -1
- package/src/sap/fe/core/controls/CommandExecution.js +4 -26
- package/src/sap/fe/core/controls/ConditionalWrapper.js +16 -33
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +16 -2
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +41 -94
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +1 -1
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +5 -34
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +5 -7
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +7 -7
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +56 -58
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +53 -33
- package/src/sap/fe/core/controls/FieldWrapper.js +6 -49
- package/src/sap/fe/core/controls/FileWrapper.js +51 -136
- package/src/sap/fe/core/controls/FileWrapper.ts +25 -29
- package/src/sap/fe/core/controls/FilterBar.js +19 -54
- package/src/sap/fe/core/controls/FormElementWrapper.js +1 -22
- package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -5
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +2 -2
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +24 -46
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +14 -41
- package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +4 -4
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +26 -67
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -20
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +12 -48
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +17 -46
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +3 -3
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +1 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +6 -78
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +4 -4
- package/src/sap/fe/core/converters/ConverterContext.js +44 -98
- package/src/sap/fe/core/converters/ConverterContext.ts +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -20
- package/src/sap/fe/core/converters/ManifestSettings.ts +16 -9
- package/src/sap/fe/core/converters/ManifestWrapper.js +97 -158
- package/src/sap/fe/core/converters/ManifestWrapper.ts +4 -0
- package/src/sap/fe/core/converters/MetaModelConverter.js +28 -167
- package/src/sap/fe/core/converters/MetaModelConverter.ts +9 -3
- package/src/sap/fe/core/converters/TemplateConverter.js +10 -22
- package/src/sap/fe/core/converters/TemplateConverter.ts +10 -7
- package/src/sap/fe/core/converters/annotations/DataField.js +88 -132
- package/src/sap/fe/core/converters/annotations/DataField.ts +90 -38
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +57 -379
- package/src/sap/fe/core/converters/controls/Common/Action.js +45 -115
- package/src/sap/fe/core/converters/controls/Common/Action.ts +17 -5
- package/src/sap/fe/core/converters/controls/Common/Chart.js +20 -73
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +21 -14
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +1 -9
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +40 -94
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +44 -31
- package/src/sap/fe/core/converters/controls/Common/Form.js +26 -63
- package/src/sap/fe/core/converters/controls/Common/Form.ts +24 -10
- package/src/sap/fe/core/converters/controls/Common/KPI.js +13 -63
- package/src/sap/fe/core/converters/controls/Common/Table.js +368 -707
- package/src/sap/fe/core/converters/controls/Common/Table.ts +308 -197
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +54 -109
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +15 -9
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +69 -210
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +23 -16
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +12 -80
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +3 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -19
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +45 -136
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +10 -10
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +82 -173
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +48 -22
- package/src/sap/fe/core/converters/helpers/Aggregation.js +24 -66
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +3 -7
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +9 -19
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +0 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +20 -48
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +5 -1
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +12 -51
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +13 -11
- package/src/sap/fe/core/converters/helpers/ID.js +3 -17
- package/src/sap/fe/core/converters/helpers/ID.ts +2 -3
- package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -6
- package/src/sap/fe/core/converters/helpers/Key.js +10 -19
- package/src/sap/fe/core/converters/helpers/Key.ts +3 -3
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +2 -20
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +2 -37
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +126 -131
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +112 -31
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +67 -131
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +58 -27
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +106 -183
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +73 -104
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +74 -67
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +77 -69
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +20 -29
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +21 -0
- package/src/sap/fe/core/formatters/FPMFormatter.js +3 -7
- package/src/sap/fe/core/formatters/KPIFormatter.js +5 -13
- package/src/sap/fe/core/formatters/StandardFormatter.js +3 -18
- package/src/sap/fe/core/formatters/StandardFormatter.ts +3 -2
- package/src/sap/fe/core/formatters/TableFormatter.js +87 -53
- package/src/sap/fe/core/formatters/TableFormatter.ts +96 -9
- package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -4
- package/src/sap/fe/core/formatters/ValueFormatter.js +1 -37
- package/src/sap/fe/core/fpm/Component.js +2 -17
- package/src/sap/fe/core/helpers/AnnotationEnum.js +10 -20
- package/src/sap/fe/core/helpers/AnnotationEnum.ts +6 -6
- package/src/sap/fe/core/helpers/AppStartupHelper.js +16 -52
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit.js +106 -364
- package/src/sap/fe/core/helpers/BindingToolkit.ts +30 -7
- package/src/sap/fe/core/helpers/ClassSupport.js +16 -97
- package/src/sap/fe/core/helpers/ClassSupport.ts +7 -4
- package/src/sap/fe/core/helpers/DeleteHelper.js +621 -0
- package/src/sap/fe/core/helpers/DeleteHelper.ts +796 -0
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -12
- package/src/sap/fe/core/helpers/EditState.js +2 -5
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -10
- package/src/sap/fe/core/helpers/FPMHelper.js +3 -8
- package/src/sap/fe/core/helpers/FPMHelper.ts +2 -1
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +8 -38
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -5
- package/src/sap/fe/core/helpers/LoaderUtils.js +1 -7
- package/src/sap/fe/core/helpers/MassEditHelper.js +177 -289
- package/src/sap/fe/core/helpers/MassEditHelper.ts +124 -91
- package/src/sap/fe/core/helpers/MessageStrip.js +12 -28
- package/src/sap/fe/core/helpers/MessageStrip.ts +7 -7
- package/src/sap/fe/core/helpers/ModelHelper.js +62 -103
- package/src/sap/fe/core/helpers/ModelHelper.ts +58 -20
- package/src/sap/fe/core/helpers/PasteHelper.js +28 -51
- package/src/sap/fe/core/helpers/PasteHelper.ts +10 -9
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +112 -136
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +111 -111
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +5 -11
- package/src/sap/fe/core/helpers/SideEffectsHelper.js +26 -32
- package/src/sap/fe/core/helpers/StableIdHelper.js +166 -218
- package/src/sap/fe/core/helpers/StableIdHelper.ts +175 -191
- package/src/sap/fe/core/helpers/Synchronization.js +1 -8
- package/src/sap/fe/core/helpers/ToES6Promise.js +1 -4
- package/src/sap/fe/core/helpers/TypeGuards.js +22 -0
- package/src/sap/fe/core/helpers/TypeGuards.ts +9 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.js +1 -3
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js +3 -23
- package/src/sap/fe/core/jsx-runtime/jsx-control.js +3 -23
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +2 -1
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js +4 -16
- package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.js +2 -5
- package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +4 -27
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +1 -1
- package/src/sap/fe/core/library.js +9 -48
- package/src/sap/fe/core/library.support.js +3 -2
- package/src/sap/fe/core/library.support.ts +3 -1
- package/src/sap/fe/core/library.ts +3 -8
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +74 -39
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +71 -26
- package/src/sap/fe/core/messagebundle.properties +113 -67
- package/src/sap/fe/core/messagebundle_ar.properties +20 -3
- package/src/sap/fe/core/messagebundle_bg.properties +22 -5
- package/src/sap/fe/core/messagebundle_ca.properties +21 -4
- package/src/sap/fe/core/messagebundle_cs.properties +21 -4
- package/src/sap/fe/core/messagebundle_cy.properties +22 -5
- package/src/sap/fe/core/messagebundle_da.properties +20 -3
- package/src/sap/fe/core/messagebundle_de.properties +38 -21
- package/src/sap/fe/core/messagebundle_el.properties +20 -3
- package/src/sap/fe/core/messagebundle_en.properties +38 -21
- package/src/sap/fe/core/messagebundle_en_GB.properties +20 -3
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +41 -28
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +41 -24
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +42 -29
- package/src/sap/fe/core/messagebundle_es.properties +40 -23
- package/src/sap/fe/core/messagebundle_es_MX.properties +20 -3
- package/src/sap/fe/core/messagebundle_et.properties +20 -3
- package/src/sap/fe/core/messagebundle_fi.properties +20 -3
- package/src/sap/fe/core/messagebundle_fr.properties +21 -4
- package/src/sap/fe/core/messagebundle_fr_CA.properties +22 -5
- package/src/sap/fe/core/messagebundle_hi.properties +20 -3
- package/src/sap/fe/core/messagebundle_hr.properties +22 -5
- package/src/sap/fe/core/messagebundle_hu.properties +20 -3
- package/src/sap/fe/core/messagebundle_id.properties +20 -3
- package/src/sap/fe/core/messagebundle_it.properties +23 -6
- package/src/sap/fe/core/messagebundle_iw.properties +20 -3
- package/src/sap/fe/core/messagebundle_ja.properties +22 -5
- package/src/sap/fe/core/messagebundle_kk.properties +21 -4
- package/src/sap/fe/core/messagebundle_ko.properties +20 -3
- package/src/sap/fe/core/messagebundle_lt.properties +20 -3
- package/src/sap/fe/core/messagebundle_lv.properties +20 -3
- package/src/sap/fe/core/messagebundle_ms.properties +20 -3
- package/src/sap/fe/core/messagebundle_nl.properties +20 -3
- package/src/sap/fe/core/messagebundle_no.properties +20 -3
- package/src/sap/fe/core/messagebundle_pl.properties +21 -4
- package/src/sap/fe/core/messagebundle_pt.properties +20 -3
- package/src/sap/fe/core/messagebundle_pt_PT.properties +20 -3
- package/src/sap/fe/core/messagebundle_ro.properties +20 -3
- package/src/sap/fe/core/messagebundle_ru.properties +20 -3
- package/src/sap/fe/core/messagebundle_sh.properties +20 -3
- package/src/sap/fe/core/messagebundle_sk.properties +20 -3
- package/src/sap/fe/core/messagebundle_sl.properties +26 -9
- package/src/sap/fe/core/messagebundle_sv.properties +20 -3
- package/src/sap/fe/core/messagebundle_th.properties +21 -4
- package/src/sap/fe/core/messagebundle_tr.properties +20 -3
- package/src/sap/fe/core/messagebundle_uk.properties +23 -6
- package/src/sap/fe/core/messagebundle_vi.properties +20 -3
- package/src/sap/fe/core/messagebundle_zh_CN.properties +20 -3
- package/src/sap/fe/core/messagebundle_zh_TW.properties +20 -3
- package/src/sap/fe/core/operationsHelper.js +74 -101
- package/src/sap/fe/core/operationsHelper.ts +113 -44
- package/src/sap/fe/core/rootView/Fcl.controller.js +151 -228
- package/src/sap/fe/core/rootView/Fcl.controller.ts +90 -15
- package/src/sap/fe/core/rootView/Fcl.view.xml +1 -8
- package/src/sap/fe/core/rootView/NavContainer.controller.js +41 -78
- package/src/sap/fe/core/rootView/NavContainer.controller.ts +32 -38
- package/src/sap/fe/core/rootView/RootViewBaseController.js +110 -181
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +37 -17
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -18
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +13 -52
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -22
- package/src/sap/fe/core/services/NavigationServiceFactory.js +45 -87
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +17 -10
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +4 -28
- package/src/sap/fe/core/services/RoutingServiceFactory.js +92 -250
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +8 -12
- package/src/sap/fe/core/services/ShellServicesFactory.js +122 -251
- package/src/sap/fe/core/services/ShellServicesFactory.ts +19 -4
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +188 -273
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +143 -154
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +37 -135
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +59 -94
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -16
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
- package/src/sap/fe/core/support/AnnotationIssue.support.js +6 -9
- package/src/sap/fe/core/support/AnnotationIssue.support.ts +4 -4
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +6 -9
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.ts +3 -3
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +6 -9
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +3 -3
- package/src/sap/fe/core/support/CommonHelper.js +7 -16
- package/src/sap/fe/core/support/Diagnostics.js +1 -10
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +6 -9
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +3 -3
- package/src/sap/fe/core/templating/CommonFormatters.js +1 -15
- package/src/sap/fe/core/templating/CriticalityFormatters.js +4 -20
- package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -20
- package/src/sap/fe/core/templating/DataModelPathHelper.js +49 -121
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +41 -31
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +8 -15
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +7 -7
- package/src/sap/fe/core/templating/EntitySetHelper.js +6 -31
- package/src/sap/fe/core/templating/FieldControlHelper.js +4 -21
- package/src/sap/fe/core/templating/FieldControlHelper.ts +1 -1
- package/src/sap/fe/core/templating/FilterHelper.js +40 -111
- package/src/sap/fe/core/templating/FilterHelper.ts +20 -16
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -19
- package/src/sap/fe/core/templating/FilterTemplating.ts +1 -1
- package/src/sap/fe/core/templating/PropertyFormatters.js +1 -34
- package/src/sap/fe/core/templating/PropertyHelper.js +120 -163
- package/src/sap/fe/core/templating/PropertyHelper.ts +69 -33
- package/src/sap/fe/core/templating/SemanticObjectHelper.js +46 -0
- package/src/sap/fe/core/templating/SemanticObjectHelper.ts +34 -0
- package/src/sap/fe/core/templating/UIFormatters.js +40 -180
- package/src/sap/fe/core/templating/UIFormatters.ts +37 -43
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +3 -14
- package/src/sap/fe/core/type/Email.js +1 -10
- package/src/sap/fe/core/type/TypeUtil.js +1 -11
- package/ui5.yaml +0 -1
- package/src/sap/fe/core/controls/ActionParameterDialogFieldValueHelp.fragment.xml +0 -35
- package/src/sap/fe/core/helpers/LRMessageStrip.js +0 -234
- package/src/sap/fe/core/helpers/LRMessageStrip.ts +0 -216
|
@@ -2,21 +2,19 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "sap/fe/core/buildingBlocks/AttributeModel", "sap/fe/core/helpers/BindingToolkit", "sap/fe/macros/ResourceModel", "sap/ui/base/BindingParser", "sap/ui/core/util/XMLPreprocessor", "./TraceInfo"], function (Log, deepClone, uid, AttributeModel, BindingToolkit, ResourceModel, BindingParser, XMLPreprocessor, TraceInfo) {
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "sap/fe/core/buildingBlocks/AttributeModel", "sap/fe/core/converters/helpers/ConfigurableObject", "sap/fe/core/helpers/BindingToolkit", "sap/fe/core/helpers/TypeGuards", "sap/fe/macros/ResourceModel", "sap/ui/base/BindingParser", "sap/ui/core/util/XMLPreprocessor", "./TraceInfo"], function (Log, deepClone, uid, AttributeModel, ConfigurableObject, BindingToolkit, TypeGuards, ResourceModel, BindingParser, XMLPreprocessor, TraceInfo) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
function _forOf(target, body, check) {
|
|
9
9
|
if (typeof target[_iteratorSymbol] === "function") {
|
|
10
10
|
var iterator = target[_iteratorSymbol](),
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
step,
|
|
12
|
+
pact,
|
|
13
|
+
reject;
|
|
15
14
|
function _cycle(result) {
|
|
16
15
|
try {
|
|
17
16
|
while (!(step = iterator.next()).done && (!check || !check())) {
|
|
18
17
|
result = body(step.value);
|
|
19
|
-
|
|
20
18
|
if (result && result.then) {
|
|
21
19
|
if (_isSettledPact(result)) {
|
|
22
20
|
result = result.v;
|
|
@@ -26,7 +24,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
26
24
|
}
|
|
27
25
|
}
|
|
28
26
|
}
|
|
29
|
-
|
|
30
27
|
if (pact) {
|
|
31
28
|
_settle(pact, 1, result);
|
|
32
29
|
} else {
|
|
@@ -36,9 +33,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
36
33
|
_settle(pact || (pact = new _Pact()), 2, e);
|
|
37
34
|
}
|
|
38
35
|
}
|
|
39
|
-
|
|
40
36
|
_cycle();
|
|
41
|
-
|
|
42
37
|
if (iterator.return) {
|
|
43
38
|
var _fixup = function (value) {
|
|
44
39
|
try {
|
|
@@ -46,49 +41,38 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
46
41
|
iterator.return();
|
|
47
42
|
}
|
|
48
43
|
} catch (e) {}
|
|
49
|
-
|
|
50
44
|
return value;
|
|
51
45
|
};
|
|
52
|
-
|
|
53
46
|
if (pact && pact.then) {
|
|
54
47
|
return pact.then(_fixup, function (e) {
|
|
55
48
|
throw _fixup(e);
|
|
56
49
|
});
|
|
57
50
|
}
|
|
58
|
-
|
|
59
51
|
_fixup();
|
|
60
52
|
}
|
|
61
|
-
|
|
62
53
|
return pact;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
|
|
54
|
+
}
|
|
55
|
+
// No support for Symbol.iterator
|
|
66
56
|
if (!("length" in target)) {
|
|
67
57
|
throw new TypeError("Object is not iterable");
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
|
|
58
|
+
}
|
|
59
|
+
// Handle live collections properly
|
|
71
60
|
var values = [];
|
|
72
|
-
|
|
73
61
|
for (var i = 0; i < target.length; i++) {
|
|
74
62
|
values.push(target[i]);
|
|
75
63
|
}
|
|
76
|
-
|
|
77
64
|
return _forTo(values, function (i) {
|
|
78
65
|
return body(values[i]);
|
|
79
66
|
}, check);
|
|
80
67
|
}
|
|
81
|
-
|
|
82
68
|
function _forTo(array, body, check) {
|
|
83
69
|
var i = -1,
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
70
|
+
pact,
|
|
71
|
+
reject;
|
|
87
72
|
function _cycle(result) {
|
|
88
73
|
try {
|
|
89
74
|
while (++i < array.length && (!check || !check())) {
|
|
90
75
|
result = body(i);
|
|
91
|
-
|
|
92
76
|
if (result && result.then) {
|
|
93
77
|
if (_isSettledPact(result)) {
|
|
94
78
|
result = result.v;
|
|
@@ -98,7 +82,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
98
82
|
}
|
|
99
83
|
}
|
|
100
84
|
}
|
|
101
|
-
|
|
102
85
|
if (pact) {
|
|
103
86
|
_settle(pact, 1, result);
|
|
104
87
|
} else {
|
|
@@ -108,27 +91,17 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
108
91
|
_settle(pact || (pact = new _Pact()), 2, e);
|
|
109
92
|
}
|
|
110
93
|
}
|
|
111
|
-
|
|
112
94
|
_cycle();
|
|
113
|
-
|
|
114
95
|
return pact;
|
|
115
96
|
}
|
|
116
|
-
|
|
117
97
|
var _iteratorSymbol = /*#__PURE__*/typeof Symbol !== "undefined" ? Symbol.iterator || (Symbol.iterator = Symbol("Symbol.iterator")) : "@@iterator";
|
|
118
|
-
|
|
119
98
|
var _templateObject, _templateObject2, _templateObject3, _templateObject4;
|
|
120
|
-
|
|
121
99
|
var _exports = {};
|
|
100
|
+
var isFunctionArray = TypeGuards.isFunctionArray;
|
|
101
|
+
var isContext = TypeGuards.isContext;
|
|
102
|
+
var isBindingToolkitExpression = BindingToolkit.isBindingToolkitExpression;
|
|
122
103
|
var compileExpression = BindingToolkit.compileExpression;
|
|
123
|
-
|
|
124
|
-
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; } } }; }
|
|
125
|
-
|
|
126
|
-
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; }
|
|
127
|
-
|
|
128
|
-
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; }
|
|
129
|
-
|
|
130
|
-
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; }
|
|
131
|
-
|
|
104
|
+
var Placement = ConfigurableObject.Placement;
|
|
132
105
|
function _settle(pact, state, value) {
|
|
133
106
|
if (!pact.s) {
|
|
134
107
|
if (value instanceof _Pact) {
|
|
@@ -136,56 +109,45 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
136
109
|
if (state & 1) {
|
|
137
110
|
state = value.s;
|
|
138
111
|
}
|
|
139
|
-
|
|
140
112
|
value = value.v;
|
|
141
113
|
} else {
|
|
142
114
|
value.o = _settle.bind(null, pact, state);
|
|
143
115
|
return;
|
|
144
116
|
}
|
|
145
117
|
}
|
|
146
|
-
|
|
147
118
|
if (value && value.then) {
|
|
148
119
|
value.then(_settle.bind(null, pact, state), _settle.bind(null, pact, 2));
|
|
149
120
|
return;
|
|
150
121
|
}
|
|
151
|
-
|
|
152
122
|
pact.s = state;
|
|
153
123
|
pact.v = value;
|
|
154
124
|
var observer = pact.o;
|
|
155
|
-
|
|
156
125
|
if (observer) {
|
|
157
126
|
observer(pact);
|
|
158
127
|
}
|
|
159
128
|
}
|
|
160
129
|
}
|
|
161
|
-
|
|
162
130
|
var _Pact = /*#__PURE__*/function () {
|
|
163
131
|
function _Pact() {}
|
|
164
|
-
|
|
165
132
|
_Pact.prototype.then = function (onFulfilled, onRejected) {
|
|
166
133
|
var result = new _Pact();
|
|
167
134
|
var state = this.s;
|
|
168
|
-
|
|
169
135
|
if (state) {
|
|
170
136
|
var callback = state & 1 ? onFulfilled : onRejected;
|
|
171
|
-
|
|
172
137
|
if (callback) {
|
|
173
138
|
try {
|
|
174
139
|
_settle(result, 1, callback(this.v));
|
|
175
140
|
} catch (e) {
|
|
176
141
|
_settle(result, 2, e);
|
|
177
142
|
}
|
|
178
|
-
|
|
179
143
|
return result;
|
|
180
144
|
} else {
|
|
181
145
|
return this;
|
|
182
146
|
}
|
|
183
147
|
}
|
|
184
|
-
|
|
185
148
|
this.o = function (_this) {
|
|
186
149
|
try {
|
|
187
150
|
var value = _this.v;
|
|
188
|
-
|
|
189
151
|
if (_this.s & 1) {
|
|
190
152
|
_settle(result, 1, onFulfilled ? onFulfilled(value) : value);
|
|
191
153
|
} else if (onRejected) {
|
|
@@ -197,38 +159,28 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
197
159
|
_settle(result, 2, e);
|
|
198
160
|
}
|
|
199
161
|
};
|
|
200
|
-
|
|
201
162
|
return result;
|
|
202
163
|
};
|
|
203
|
-
|
|
204
164
|
return _Pact;
|
|
205
165
|
}();
|
|
206
|
-
|
|
207
166
|
function _isSettledPact(thenable) {
|
|
208
167
|
return thenable instanceof _Pact && thenable.s & 1;
|
|
209
168
|
}
|
|
210
|
-
|
|
211
169
|
function _for(test, update, body) {
|
|
212
170
|
var stage;
|
|
213
|
-
|
|
214
171
|
for (;;) {
|
|
215
172
|
var shouldContinue = test();
|
|
216
|
-
|
|
217
173
|
if (_isSettledPact(shouldContinue)) {
|
|
218
174
|
shouldContinue = shouldContinue.v;
|
|
219
175
|
}
|
|
220
|
-
|
|
221
176
|
if (!shouldContinue) {
|
|
222
177
|
return result;
|
|
223
178
|
}
|
|
224
|
-
|
|
225
179
|
if (shouldContinue.then) {
|
|
226
180
|
stage = 0;
|
|
227
181
|
break;
|
|
228
182
|
}
|
|
229
|
-
|
|
230
183
|
var result = body();
|
|
231
|
-
|
|
232
184
|
if (result && result.then) {
|
|
233
185
|
if (_isSettledPact(result)) {
|
|
234
186
|
result = result.s;
|
|
@@ -237,64 +189,47 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
237
189
|
break;
|
|
238
190
|
}
|
|
239
191
|
}
|
|
240
|
-
|
|
241
192
|
if (update) {
|
|
242
193
|
var updateValue = update();
|
|
243
|
-
|
|
244
194
|
if (updateValue && updateValue.then && !_isSettledPact(updateValue)) {
|
|
245
195
|
stage = 2;
|
|
246
196
|
break;
|
|
247
197
|
}
|
|
248
198
|
}
|
|
249
199
|
}
|
|
250
|
-
|
|
251
200
|
var pact = new _Pact();
|
|
252
|
-
|
|
253
201
|
var reject = _settle.bind(null, pact, 2);
|
|
254
|
-
|
|
255
202
|
(stage === 0 ? shouldContinue.then(_resumeAfterTest) : stage === 1 ? result.then(_resumeAfterBody) : updateValue.then(_resumeAfterUpdate)).then(void 0, reject);
|
|
256
203
|
return pact;
|
|
257
|
-
|
|
258
204
|
function _resumeAfterBody(value) {
|
|
259
205
|
result = value;
|
|
260
|
-
|
|
261
206
|
do {
|
|
262
207
|
if (update) {
|
|
263
208
|
updateValue = update();
|
|
264
|
-
|
|
265
209
|
if (updateValue && updateValue.then && !_isSettledPact(updateValue)) {
|
|
266
210
|
updateValue.then(_resumeAfterUpdate).then(void 0, reject);
|
|
267
211
|
return;
|
|
268
212
|
}
|
|
269
213
|
}
|
|
270
|
-
|
|
271
214
|
shouldContinue = test();
|
|
272
|
-
|
|
273
215
|
if (!shouldContinue || _isSettledPact(shouldContinue) && !shouldContinue.v) {
|
|
274
216
|
_settle(pact, 1, result);
|
|
275
|
-
|
|
276
217
|
return;
|
|
277
218
|
}
|
|
278
|
-
|
|
279
219
|
if (shouldContinue.then) {
|
|
280
220
|
shouldContinue.then(_resumeAfterTest).then(void 0, reject);
|
|
281
221
|
return;
|
|
282
222
|
}
|
|
283
|
-
|
|
284
223
|
result = body();
|
|
285
|
-
|
|
286
224
|
if (_isSettledPact(result)) {
|
|
287
225
|
result = result.v;
|
|
288
226
|
}
|
|
289
227
|
} while (!result || !result.then);
|
|
290
|
-
|
|
291
228
|
result.then(_resumeAfterBody).then(void 0, reject);
|
|
292
229
|
}
|
|
293
|
-
|
|
294
230
|
function _resumeAfterTest(shouldContinue) {
|
|
295
231
|
if (shouldContinue) {
|
|
296
232
|
result = body();
|
|
297
|
-
|
|
298
233
|
if (result && result.then) {
|
|
299
234
|
result.then(_resumeAfterBody).then(void 0, reject);
|
|
300
235
|
} else {
|
|
@@ -304,7 +239,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
304
239
|
_settle(pact, 1, result);
|
|
305
240
|
}
|
|
306
241
|
}
|
|
307
|
-
|
|
308
242
|
function _resumeAfterUpdate() {
|
|
309
243
|
if (shouldContinue = test()) {
|
|
310
244
|
if (shouldContinue.then) {
|
|
@@ -317,45 +251,39 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
317
251
|
}
|
|
318
252
|
}
|
|
319
253
|
}
|
|
320
|
-
|
|
321
254
|
function _catch(body, recover) {
|
|
322
255
|
try {
|
|
323
256
|
var result = body();
|
|
324
257
|
} catch (e) {
|
|
325
258
|
return recover(e);
|
|
326
259
|
}
|
|
327
|
-
|
|
328
260
|
if (result && result.then) {
|
|
329
261
|
return result.then(void 0, recover);
|
|
330
262
|
}
|
|
331
|
-
|
|
332
263
|
return result;
|
|
333
264
|
}
|
|
334
|
-
|
|
335
265
|
function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
|
|
336
|
-
|
|
337
266
|
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
338
|
-
|
|
339
267
|
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
340
|
-
|
|
341
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
342
|
-
|
|
343
268
|
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
344
|
-
|
|
345
269
|
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
346
|
-
|
|
270
|
+
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; }
|
|
271
|
+
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; }
|
|
272
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
273
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
274
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
275
|
+
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; } } }; }
|
|
276
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
347
277
|
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
348
|
-
|
|
349
278
|
var processBuildingBlock = function (buildingBlockDefinition, oNode, oVisitor) {
|
|
350
279
|
var isPublic = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
351
|
-
|
|
352
280
|
try {
|
|
353
|
-
var sFragmentName = buildingBlockDefinition.fragment || "".concat(buildingBlockDefinition.namespace, ".").concat(buildingBlockDefinition.name);
|
|
281
|
+
var sFragmentName = buildingBlockDefinition.fragment || "".concat(buildingBlockDefinition.namespace, ".").concat(buildingBlockDefinition.xmlTag || buildingBlockDefinition.name);
|
|
354
282
|
var sName = "this";
|
|
355
283
|
var mContexts = {};
|
|
356
284
|
var oMetadataContexts = {};
|
|
357
|
-
var oSettings = oVisitor.getSettings();
|
|
358
|
-
|
|
285
|
+
var oSettings = oVisitor.getSettings();
|
|
286
|
+
// TODO 0001 Move this elsewhere this is weird :)
|
|
359
287
|
if (oSettings.models["sap.fe.i18n"]) {
|
|
360
288
|
oSettings.models["sap.fe.i18n"].getResourceBundle().then(function (oResourceBundle) {
|
|
361
289
|
ResourceModel.setApplicationI18nBundle(oResourceBundle);
|
|
@@ -363,303 +291,288 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
363
291
|
Log.error(error);
|
|
364
292
|
});
|
|
365
293
|
}
|
|
294
|
+
var oMetadata = prepareMetadata(buildingBlockDefinition.metadata, buildingBlockDefinition.isOpen, buildingBlockDefinition.apiVersion);
|
|
366
295
|
|
|
367
|
-
|
|
368
|
-
|
|
296
|
+
//Inject storage for macros
|
|
369
297
|
if (!oSettings[sFragmentName]) {
|
|
370
298
|
oSettings[sFragmentName] = {};
|
|
371
|
-
}
|
|
372
|
-
|
|
299
|
+
}
|
|
373
300
|
|
|
301
|
+
// First of all we need to visit the attributes to resolve the properties and the metadata contexts
|
|
374
302
|
return Promise.resolve(processProperties(oMetadata, oNode, isPublic, oVisitor, buildingBlockDefinition.apiVersion)).then(function (propertyValues) {
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
if
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
delete oSettings["_macroInfo"];
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
var oInstance;
|
|
394
|
-
var oControlConfig = {};
|
|
395
|
-
|
|
396
|
-
if (oSettings.models.viewData) {
|
|
397
|
-
// Only used in the Field macro and even then maybe not really useful
|
|
398
|
-
oControlConfig = oSettings.models.viewData.getProperty("/controlConfiguration");
|
|
303
|
+
var _processContexts = processContexts(oMetadata, oSettings, oNode, isPublic, oVisitor, mContexts, oMetadataContexts),
|
|
304
|
+
mMissingContext = _processContexts.mMissingContext,
|
|
305
|
+
extraPropertyValues = _processContexts.propertyValues;
|
|
306
|
+
propertyValues = Object.assign(propertyValues, extraPropertyValues);
|
|
307
|
+
var initialKeys = Object.keys(propertyValues);
|
|
308
|
+
var _temp18 = _catch(function () {
|
|
309
|
+
// Aggregation and complex type support
|
|
310
|
+
return Promise.resolve(processChildren(oNode, oVisitor, oMetadata, isPublic, propertyValues, buildingBlockDefinition.apiVersion)).then(function (oAggregations) {
|
|
311
|
+
function _temp17() {
|
|
312
|
+
if (oPreviousMacroInfo) {
|
|
313
|
+
//restore macro info if available
|
|
314
|
+
oSettings["_macroInfo"] = oPreviousMacroInfo;
|
|
315
|
+
} else {
|
|
316
|
+
delete oSettings["_macroInfo"];
|
|
399
317
|
}
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
var
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
318
|
+
}
|
|
319
|
+
var oInstance;
|
|
320
|
+
var oControlConfig = {};
|
|
321
|
+
if (oSettings.models.viewData) {
|
|
322
|
+
// Only used in the Field macro and even then maybe not really useful
|
|
323
|
+
oControlConfig = oSettings.models.viewData.getProperty("/controlConfiguration");
|
|
324
|
+
}
|
|
325
|
+
var processedPropertyValues = propertyValues;
|
|
326
|
+
if (isV1MacroDef(buildingBlockDefinition) && buildingBlockDefinition.create) {
|
|
327
|
+
processedPropertyValues = buildingBlockDefinition.create.call(buildingBlockDefinition, propertyValues, oControlConfig, oSettings, oAggregations, isPublic);
|
|
328
|
+
Object.keys(oMetadata.metadataContexts).forEach(function (sMetadataName) {
|
|
329
|
+
if (oMetadata.metadataContexts[sMetadataName].computed === true) {
|
|
330
|
+
mContexts[sMetadataName] = processedPropertyValues[sMetadataName];
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
Object.keys(mMissingContext).forEach(function (sContextName) {
|
|
334
|
+
if (processedPropertyValues.hasOwnProperty(sContextName)) {
|
|
335
|
+
mContexts[sContextName] = processedPropertyValues[sContextName];
|
|
336
|
+
}
|
|
337
|
+
});
|
|
338
|
+
} else if (buildingBlockDefinition.apiVersion === 2) {
|
|
339
|
+
Object.keys(propertyValues).forEach(function (propName) {
|
|
340
|
+
var _buildingBlockDefinit;
|
|
341
|
+
var oData = propertyValues[propName];
|
|
342
|
+
//check for additional processing function to validate / overwrite parameters
|
|
343
|
+
var originalDefinition = buildingBlockDefinition === null || buildingBlockDefinition === void 0 ? void 0 : (_buildingBlockDefinit = buildingBlockDefinition.metadata) === null || _buildingBlockDefinit === void 0 ? void 0 : _buildingBlockDefinit.properties[propName];
|
|
344
|
+
if (originalDefinition !== null && originalDefinition !== void 0 && originalDefinition.validate) {
|
|
345
|
+
oData = originalDefinition.validate(oData) || oData;
|
|
346
|
+
}
|
|
347
|
+
if (oData && oData.isA && oData.isA(SAP_UI_MODEL_CONTEXT) && !oData.getModel().isA("sap.ui.model.odata.v4.ODataMetaModel")) {
|
|
348
|
+
propertyValues[propName] = oData.getObject();
|
|
349
|
+
}
|
|
350
|
+
});
|
|
351
|
+
var BuildingBlockClass = buildingBlockDefinition;
|
|
352
|
+
propertyValues.isPublic = isPublic;
|
|
353
|
+
oInstance = new BuildingBlockClass(_objectSpread(_objectSpread({}, propertyValues), oAggregations), oControlConfig, oSettings
|
|
354
|
+
/*, oControlConfig, oSettings, oAggregations, isPublic*/);
|
|
355
|
+
|
|
356
|
+
processedPropertyValues = oInstance.getProperties();
|
|
357
|
+
Object.keys(oMetadata.metadataContexts).forEach(function (sContextName) {
|
|
358
|
+
if (processedPropertyValues.hasOwnProperty(sContextName)) {
|
|
359
|
+
var targetObject = processedPropertyValues[sContextName];
|
|
360
|
+
if (typeof targetObject === "object" && !isContext(targetObject)) {
|
|
361
|
+
var sAttributeValue = storeValue(targetObject);
|
|
362
|
+
var sContextPath = "".concat(sAttributeValue);
|
|
363
|
+
oSettings.models.converterContext.setProperty(sContextPath, targetObject);
|
|
364
|
+
var newContext = oSettings.models.converterContext.createBindingContext(sContextPath);
|
|
365
|
+
delete myStore[sAttributeValue];
|
|
366
|
+
mContexts[sContextName] = newContext;
|
|
367
|
+
} else if (!mContexts.hasOwnProperty(sContextName) && targetObject !== undefined) {
|
|
368
|
+
mContexts[sContextName] = targetObject;
|
|
443
369
|
}
|
|
444
|
-
});
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
var oAttributesModel = new AttributeModel(oNode, processedPropertyValues, buildingBlockDefinition);
|
|
448
|
-
mContexts[sName] = oAttributesModel.createBindingContext("/");
|
|
449
|
-
var oPreviousMacroInfo; // Keep track
|
|
450
|
-
|
|
451
|
-
if (TraceInfo.isTraceInfoActive()) {
|
|
452
|
-
var oTraceInfo = TraceInfo.traceMacroCalls(sFragmentName, oMetadata, mContexts, oNode, oVisitor);
|
|
453
|
-
|
|
454
|
-
if (oTraceInfo) {
|
|
455
|
-
oPreviousMacroInfo = oSettings["_macroInfo"];
|
|
456
|
-
oSettings["_macroInfo"] = oTraceInfo.macroInfo;
|
|
457
370
|
}
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
var oAttributesModel = new AttributeModel(oNode, processedPropertyValues, buildingBlockDefinition);
|
|
374
|
+
mContexts[sName] = oAttributesModel.createBindingContext("/");
|
|
375
|
+
var oPreviousMacroInfo;
|
|
376
|
+
|
|
377
|
+
// Keep track
|
|
378
|
+
if (TraceInfo.isTraceInfoActive()) {
|
|
379
|
+
var oTraceInfo = TraceInfo.traceMacroCalls(sFragmentName, oMetadata, mContexts, oNode, oVisitor);
|
|
380
|
+
if (oTraceInfo && oTraceInfo.macroInfo) {
|
|
381
|
+
oPreviousMacroInfo = oSettings["_macroInfo"];
|
|
382
|
+
oSettings["_macroInfo"] = oTraceInfo.macroInfo;
|
|
458
383
|
}
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
var oData = myStore[myStoreKey];
|
|
481
|
-
var sContextPath = "".concat(myStoreKey);
|
|
482
|
-
oSettings.models.converterContext.setProperty(sContextPath, oData);
|
|
483
|
-
delete myStore[myStoreKey];
|
|
484
|
-
}
|
|
384
|
+
}
|
|
385
|
+
validateMacroSignature(sFragmentName, oMetadata, mContexts, oNode);
|
|
386
|
+
var oContextVisitor = oVisitor.with(mContexts, buildingBlockDefinition.isOpen !== undefined ? !buildingBlockDefinition.isOpen : true);
|
|
387
|
+
var oParent = oNode.parentNode;
|
|
388
|
+
var iChildIndex;
|
|
389
|
+
var oPromise;
|
|
390
|
+
var processCustomData = true;
|
|
391
|
+
var _temp16 = function () {
|
|
392
|
+
if (oParent) {
|
|
393
|
+
iChildIndex = Array.from(oParent.children).indexOf(oNode);
|
|
394
|
+
if (isV1MacroDef(buildingBlockDefinition) && buildingBlockDefinition.getTemplate || buildingBlockDefinition.apiVersion === 2 && !buildingBlockDefinition.fragment) {
|
|
395
|
+
var templateString;
|
|
396
|
+
var addDefaultNamespace = false;
|
|
397
|
+
if (buildingBlockDefinition.apiVersion === 2 && oInstance !== undefined) {
|
|
398
|
+
templateString = oInstance.getTemplate(oNode);
|
|
399
|
+
if (buildingBlockDefinition.isRuntime === true) {
|
|
400
|
+
for (var myStoreKey in myStore) {
|
|
401
|
+
var oData = myStore[myStoreKey];
|
|
402
|
+
var sContextPath = "".concat(myStoreKey);
|
|
403
|
+
oSettings.models.converterContext.setProperty(sContextPath, oData);
|
|
404
|
+
delete myStore[myStoreKey];
|
|
485
405
|
}
|
|
486
|
-
|
|
487
|
-
addDefaultNamespace = true;
|
|
488
|
-
} else if (buildingBlockDefinition.getTemplate) {
|
|
489
|
-
oTemplate = buildingBlockDefinition.getTemplate(processedPropertyValues);
|
|
490
406
|
}
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
407
|
+
addDefaultNamespace = true;
|
|
408
|
+
} else if (buildingBlockDefinition.getTemplate) {
|
|
409
|
+
templateString = buildingBlockDefinition.getTemplate(processedPropertyValues);
|
|
410
|
+
}
|
|
411
|
+
var hasError = "";
|
|
412
|
+
if (templateString) {
|
|
413
|
+
var _oNode;
|
|
414
|
+
var hasParseError = false;
|
|
415
|
+
var parsedTemplate = parseXMLString(templateString, addDefaultNamespace);
|
|
416
|
+
// For safety purpose we try to detect trailing text in between XML Tags
|
|
417
|
+
var _iterator5 = _createForOfIteratorHelper(parsedTemplate),
|
|
418
|
+
_step5;
|
|
419
|
+
try {
|
|
420
|
+
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
|
|
421
|
+
var _element = _step5.value;
|
|
422
|
+
var iter = document.createNodeIterator(_element, NodeFilter.SHOW_TEXT);
|
|
499
423
|
var textnode = iter.nextNode();
|
|
500
|
-
|
|
424
|
+
if (_element.localName === "parsererror") {
|
|
425
|
+
hasParseError = true;
|
|
426
|
+
}
|
|
501
427
|
while (textnode) {
|
|
502
428
|
if (textnode.textContent && textnode.textContent.trim().length > 0) {
|
|
503
429
|
hasError = textnode.textContent;
|
|
504
430
|
}
|
|
505
|
-
|
|
506
431
|
textnode = iter.nextNode();
|
|
507
432
|
}
|
|
508
433
|
}
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
// If there is trailing text we create a standard error and display it.
|
|
527
|
-
Log.error("Error while processing building block ".concat(buildingBlockDefinition.name));
|
|
528
|
-
var oErrorText = createErrorXML(["Error while processing building block ".concat(buildingBlockDefinition.name), "Trailing text was found in the XML: ".concat(hasError)], oTemplate.outerHTML);
|
|
529
|
-
oTemplate = parseXMLString(oErrorText, true);
|
|
434
|
+
} catch (err) {
|
|
435
|
+
_iterator5.e(err);
|
|
436
|
+
} finally {
|
|
437
|
+
_iterator5.f();
|
|
438
|
+
}
|
|
439
|
+
if (hasParseError) {
|
|
440
|
+
// If there is a parseerror while processing the XML it means the XML itself is malformed, as such we rerun the template process
|
|
441
|
+
// Setting isTraceMode true will make it so that each xml` expression is checked for validity from XML perspective
|
|
442
|
+
// If an error is found it's returned instead of the normal fragment
|
|
443
|
+
Log.error("Error while processing building block ".concat(buildingBlockDefinition.xmlTag || buildingBlockDefinition.name));
|
|
444
|
+
try {
|
|
445
|
+
var _oInstance;
|
|
446
|
+
isTraceMode = true;
|
|
447
|
+
var initialTemplate = (_oInstance = oInstance) !== null && _oInstance !== void 0 && _oInstance.getTemplate ? oInstance.getTemplate(oNode) : buildingBlockDefinition.getTemplate(processedPropertyValues);
|
|
448
|
+
parsedTemplate = parseXMLString(initialTemplate, true);
|
|
449
|
+
} finally {
|
|
450
|
+
isTraceMode = false;
|
|
530
451
|
}
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
oNode.remove();
|
|
539
|
-
oPromise = Promise.resolve();
|
|
452
|
+
} else if (hasError.length > 0) {
|
|
453
|
+
// If there is trailing text we create a standard error and display it.
|
|
454
|
+
Log.error("Error while processing building block ".concat(buildingBlockDefinition.xmlTag || buildingBlockDefinition.name));
|
|
455
|
+
var oErrorText = createErrorXML(["Error while processing building block ".concat(buildingBlockDefinition.xmlTag || buildingBlockDefinition.name), "Trailing text was found in the XML: ".concat(hasError)], parsedTemplate.map(function (template) {
|
|
456
|
+
return template.outerHTML;
|
|
457
|
+
}).join("\n"));
|
|
458
|
+
parsedTemplate = parseXMLString(oErrorText, true);
|
|
540
459
|
}
|
|
460
|
+
(_oNode = oNode).replaceWith.apply(_oNode, _toConsumableArray(parsedTemplate));
|
|
461
|
+
oNode = oParent.children[iChildIndex];
|
|
462
|
+
processSlots(oAggregations, oMetadata.aggregations, oNode, processCustomData);
|
|
463
|
+
processCustomData = false;
|
|
464
|
+
oPromise = oContextVisitor.visitNode(oNode);
|
|
541
465
|
} else {
|
|
542
|
-
|
|
466
|
+
oNode.remove();
|
|
467
|
+
oPromise = Promise.resolve();
|
|
543
468
|
}
|
|
544
|
-
|
|
545
|
-
return Promise.resolve(oPromise).then(function () {
|
|
546
|
-
var oMacroElement = oParent.children[iChildIndex];
|
|
547
|
-
processSlots(oAggregations, oMetadata.aggregations, oMacroElement, processCustomData);
|
|
548
|
-
|
|
549
|
-
if (oMacroElement !== undefined) {
|
|
550
|
-
var oRemainingSlots = oMacroElement.querySelectorAll("slot");
|
|
551
|
-
oRemainingSlots.forEach(function (oSlotElement) {
|
|
552
|
-
oSlotElement.remove();
|
|
553
|
-
});
|
|
554
|
-
}
|
|
555
|
-
});
|
|
556
|
-
}
|
|
557
|
-
}();
|
|
558
|
-
|
|
559
|
-
return _temp16 && _temp16.then ? _temp16.then(_temp17) : _temp17(_temp16);
|
|
560
|
-
});
|
|
561
|
-
}, function (e) {
|
|
562
|
-
// In case there is a generic error (usually code error), we retrieve the current context information and create a dedicated error message
|
|
563
|
-
var traceDetails = {
|
|
564
|
-
initialProperties: {},
|
|
565
|
-
resolvedProperties: {},
|
|
566
|
-
missingContexts: mMissingContext
|
|
567
|
-
};
|
|
568
|
-
|
|
569
|
-
var _iterator = _createForOfIteratorHelper(initialKeys),
|
|
570
|
-
_step;
|
|
571
|
-
|
|
572
|
-
try {
|
|
573
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
574
|
-
var _propertyName = _step.value;
|
|
575
|
-
var _propertyValue = propertyValues[_propertyName];
|
|
576
|
-
|
|
577
|
-
if (_propertyValue && _propertyValue.isA && _propertyValue.isA(SAP_UI_MODEL_CONTEXT)) {
|
|
578
|
-
traceDetails.initialProperties[_propertyName] = {
|
|
579
|
-
path: _propertyValue.getPath(),
|
|
580
|
-
value: _propertyValue.getObject()
|
|
581
|
-
};
|
|
582
469
|
} else {
|
|
583
|
-
|
|
470
|
+
oPromise = oContextVisitor.insertFragment(sFragmentName, oNode);
|
|
584
471
|
}
|
|
472
|
+
return Promise.resolve(oPromise).then(function () {
|
|
473
|
+
var oMacroElement = oParent.children[iChildIndex];
|
|
474
|
+
processSlots(oAggregations, oMetadata.aggregations, oMacroElement, processCustomData);
|
|
475
|
+
if (oMacroElement !== undefined) {
|
|
476
|
+
var oRemainingSlots = oMacroElement.querySelectorAll("slot");
|
|
477
|
+
oRemainingSlots.forEach(function (oSlotElement) {
|
|
478
|
+
oSlotElement.remove();
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
}();
|
|
484
|
+
return _temp16 && _temp16.then ? _temp16.then(_temp17) : _temp17(_temp16);
|
|
485
|
+
});
|
|
486
|
+
}, function (e) {
|
|
487
|
+
var _oNode2;
|
|
488
|
+
// In case there is a generic error (usually code error), we retrieve the current context information and create a dedicated error message
|
|
489
|
+
var traceDetails = {
|
|
490
|
+
initialProperties: {},
|
|
491
|
+
resolvedProperties: {},
|
|
492
|
+
missingContexts: mMissingContext
|
|
493
|
+
};
|
|
494
|
+
var _iterator6 = _createForOfIteratorHelper(initialKeys),
|
|
495
|
+
_step6;
|
|
496
|
+
try {
|
|
497
|
+
for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
|
|
498
|
+
var _propertyName = _step6.value;
|
|
499
|
+
var _propertyValue = propertyValues[_propertyName];
|
|
500
|
+
if (isContext(_propertyValue)) {
|
|
501
|
+
traceDetails.initialProperties[_propertyName] = {
|
|
502
|
+
path: _propertyValue.getPath(),
|
|
503
|
+
value: _propertyValue.getObject()
|
|
504
|
+
};
|
|
505
|
+
} else {
|
|
506
|
+
traceDetails.initialProperties[_propertyName] = _propertyValue;
|
|
585
507
|
}
|
|
586
|
-
} catch (err) {
|
|
587
|
-
_iterator.e(err);
|
|
588
|
-
} finally {
|
|
589
|
-
_iterator.f();
|
|
590
508
|
}
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
}
|
|
509
|
+
} catch (err) {
|
|
510
|
+
_iterator6.e(err);
|
|
511
|
+
} finally {
|
|
512
|
+
_iterator6.f();
|
|
513
|
+
}
|
|
514
|
+
for (var propertyName in propertyValues) {
|
|
515
|
+
var propertyValue = propertyValues[propertyName];
|
|
516
|
+
if (!initialKeys.includes(propertyName)) {
|
|
517
|
+
if (isContext(propertyValue)) {
|
|
518
|
+
traceDetails.resolvedProperties[propertyName] = {
|
|
519
|
+
path: propertyValue.getPath(),
|
|
520
|
+
value: propertyValue.getObject()
|
|
521
|
+
};
|
|
522
|
+
} else {
|
|
523
|
+
traceDetails.resolvedProperties[propertyName] = propertyValue;
|
|
604
524
|
}
|
|
605
525
|
}
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
oNode.replaceWith(oTemplate);
|
|
612
|
-
});
|
|
613
|
-
|
|
614
|
-
if (_temp18 && _temp18.then) return _temp18.then(function () {});
|
|
526
|
+
}
|
|
527
|
+
Log.error(e, e);
|
|
528
|
+
var oError = createErrorXML(["Error while processing building block ".concat(buildingBlockDefinition.name)], oNode.outerHTML, traceDetails, e.stack);
|
|
529
|
+
var oTemplate = parseXMLString(oError, true);
|
|
530
|
+
(_oNode2 = oNode).replaceWith.apply(_oNode2, _toConsumableArray(oTemplate));
|
|
615
531
|
});
|
|
532
|
+
if (_temp18 && _temp18.then) return _temp18.then(function () {});
|
|
616
533
|
});
|
|
617
534
|
} catch (e) {
|
|
618
535
|
return Promise.reject(e);
|
|
619
536
|
}
|
|
620
537
|
};
|
|
621
|
-
|
|
622
538
|
var processChildren = function (oNode, oVisitor, oMetadata, isPublic, propertyValues, apiVersion) {
|
|
623
539
|
try {
|
|
624
540
|
var oAggregations = {};
|
|
625
|
-
|
|
626
541
|
var _temp10 = function () {
|
|
627
542
|
if (oNode.firstElementChild !== null) {
|
|
628
543
|
function _temp11() {
|
|
629
544
|
_oFirstElementChild = oNode.firstElementChild;
|
|
630
|
-
|
|
631
545
|
var _temp6 = _for(function () {
|
|
632
546
|
return _oFirstElementChild !== null;
|
|
633
547
|
}, void 0, function () {
|
|
634
548
|
function _temp5() {
|
|
635
549
|
_oFirstElementChild = oNextChild;
|
|
636
550
|
}
|
|
637
|
-
|
|
638
551
|
var oNextChild = _oFirstElementChild.nextElementSibling;
|
|
639
552
|
var sChildName = _oFirstElementChild.localName;
|
|
640
553
|
var sAggregationName = sChildName;
|
|
641
|
-
|
|
642
554
|
if (sAggregationName[0].toUpperCase() === sAggregationName[0]) {
|
|
643
555
|
// not a sub aggregation, go back to default Aggregation
|
|
644
556
|
sAggregationName = oMetadata.defaultAggregation || "";
|
|
645
557
|
}
|
|
646
|
-
|
|
647
558
|
var _temp4 = function () {
|
|
648
559
|
if (Object.keys(oMetadata.aggregations).indexOf(sAggregationName) !== -1 && (!isPublic || oMetadata.aggregations[sAggregationName].isPublic === true)) {
|
|
649
560
|
var _temp13 = function () {
|
|
650
561
|
if (apiVersion === 2) {
|
|
651
562
|
var aggregationDefinition = oMetadata.aggregations[sAggregationName];
|
|
652
|
-
|
|
653
563
|
var _temp14 = function () {
|
|
654
564
|
if (!aggregationDefinition.slot && _oFirstElementChild !== null && _oFirstElementChild.children.length > 0) {
|
|
655
565
|
return Promise.resolve(oVisitor.visitNode(_oFirstElementChild)).then(function () {
|
|
656
566
|
var childDefinition = _oFirstElementChild.firstElementChild;
|
|
657
|
-
|
|
658
567
|
while (childDefinition) {
|
|
659
|
-
var oNewChild = document.createElementNS(oNode.namespaceURI, childDefinition.getAttribute("key"));
|
|
660
568
|
var nextChild = childDefinition.nextElementSibling;
|
|
661
|
-
|
|
662
|
-
|
|
569
|
+
if (!aggregationDefinition.hasVirtualNode) {
|
|
570
|
+
var childWrapper = document.createElementNS(oNode.namespaceURI, childDefinition.getAttribute("key"));
|
|
571
|
+
childWrapper.appendChild(childDefinition);
|
|
572
|
+
oAggregations[childDefinition.getAttribute("key")] = childWrapper;
|
|
573
|
+
} else {
|
|
574
|
+
oAggregations[childDefinition.getAttribute("key")] = childDefinition;
|
|
575
|
+
}
|
|
663
576
|
childDefinition.removeAttribute("key");
|
|
664
577
|
childDefinition = nextChild;
|
|
665
578
|
}
|
|
@@ -670,14 +583,12 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
670
583
|
var oNewChild = document.createElementNS(oNode.namespaceURI, sAggregationName);
|
|
671
584
|
oAggregations[sAggregationName] = oNewChild;
|
|
672
585
|
}
|
|
673
|
-
|
|
674
586
|
oAggregations[sAggregationName].appendChild(_oFirstElementChild);
|
|
675
587
|
} else {
|
|
676
588
|
oAggregations[sAggregationName] = _oFirstElementChild;
|
|
677
589
|
}
|
|
678
590
|
}
|
|
679
591
|
}();
|
|
680
|
-
|
|
681
592
|
if (_temp14 && _temp14.then) return _temp14.then(function () {});
|
|
682
593
|
} else {
|
|
683
594
|
return Promise.resolve(oVisitor.visitNode(_oFirstElementChild)).then(function () {
|
|
@@ -685,7 +596,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
685
596
|
});
|
|
686
597
|
}
|
|
687
598
|
}();
|
|
688
|
-
|
|
689
599
|
if (_temp13 && _temp13.then) return _temp13.then(function () {});
|
|
690
600
|
} else {
|
|
691
601
|
var _temp15 = function () {
|
|
@@ -693,85 +603,108 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
693
603
|
return Promise.resolve(oVisitor.visitNode(_oFirstElementChild)).then(function () {
|
|
694
604
|
if (oMetadata.properties[sAggregationName].type === "object") {
|
|
695
605
|
// Object Type properties
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
606
|
+
var aggregationPropertyValues = {};
|
|
607
|
+
var attributeNames = _oFirstElementChild.getAttributeNames();
|
|
608
|
+
var _iterator2 = _createForOfIteratorHelper(attributeNames),
|
|
609
|
+
_step2;
|
|
610
|
+
try {
|
|
611
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
612
|
+
var attributeName = _step2.value;
|
|
613
|
+
aggregationPropertyValues[attributeName] = _oFirstElementChild.getAttribute(attributeName);
|
|
614
|
+
}
|
|
615
|
+
} catch (err) {
|
|
616
|
+
_iterator2.e(err);
|
|
617
|
+
} finally {
|
|
618
|
+
_iterator2.f();
|
|
701
619
|
}
|
|
620
|
+
if (_oFirstElementChild.children.length) {
|
|
621
|
+
//retrieve one level subObject properties
|
|
622
|
+
for (var childIndex = 0; childIndex < _oFirstElementChild.children.length; childIndex++) {
|
|
623
|
+
var subChild = _oFirstElementChild.children[childIndex];
|
|
624
|
+
var subObjectKey = subChild.localName;
|
|
625
|
+
var subObject = {};
|
|
626
|
+
var subChildAttributeNames = subChild.getAttributeNames();
|
|
627
|
+
var _iterator3 = _createForOfIteratorHelper(subChildAttributeNames),
|
|
628
|
+
_step3;
|
|
629
|
+
try {
|
|
630
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
631
|
+
var subChildAttributeName = _step3.value;
|
|
632
|
+
subObject[subChildAttributeName] = subChild.getAttribute(subChildAttributeName);
|
|
633
|
+
}
|
|
634
|
+
} catch (err) {
|
|
635
|
+
_iterator3.e(err);
|
|
636
|
+
} finally {
|
|
637
|
+
_iterator3.f();
|
|
638
|
+
}
|
|
639
|
+
aggregationPropertyValues[subObjectKey] = subObject;
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
propertyValues[sAggregationName] = aggregationPropertyValues;
|
|
702
643
|
} else if (oMetadata.properties[sAggregationName].type === "array") {
|
|
703
644
|
if (_oFirstElementChild !== null && _oFirstElementChild.children.length > 0) {
|
|
704
645
|
var children = _oFirstElementChild.children;
|
|
705
646
|
var oOutObjects = [];
|
|
706
|
-
|
|
707
647
|
for (var childIdx = 0; childIdx < children.length; childIdx++) {
|
|
708
|
-
var childDefinition = children[childIdx];
|
|
709
|
-
|
|
648
|
+
var childDefinition = children[childIdx];
|
|
649
|
+
// non keyed child, just add it to the aggregation
|
|
710
650
|
var myChild = {};
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
651
|
+
var _attributeNames = childDefinition.getAttributeNames();
|
|
652
|
+
var _iterator4 = _createForOfIteratorHelper(_attributeNames),
|
|
653
|
+
_step4;
|
|
654
|
+
try {
|
|
655
|
+
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
656
|
+
var _attributeName = _step4.value;
|
|
657
|
+
myChild[_attributeName] = childDefinition.getAttribute(_attributeName);
|
|
658
|
+
}
|
|
659
|
+
} catch (err) {
|
|
660
|
+
_iterator4.e(err);
|
|
661
|
+
} finally {
|
|
662
|
+
_iterator4.f();
|
|
715
663
|
}
|
|
716
|
-
|
|
717
664
|
oOutObjects.push(myChild);
|
|
718
665
|
}
|
|
719
|
-
|
|
720
666
|
propertyValues[sAggregationName] = oOutObjects;
|
|
721
667
|
}
|
|
722
668
|
}
|
|
723
669
|
});
|
|
724
670
|
}
|
|
725
671
|
}();
|
|
726
|
-
|
|
727
672
|
if (_temp15 && _temp15.then) return _temp15.then(function () {});
|
|
728
673
|
}
|
|
729
674
|
}();
|
|
730
|
-
|
|
731
675
|
return _temp4 && _temp4.then ? _temp4.then(_temp5) : _temp5(_temp4);
|
|
732
676
|
});
|
|
733
|
-
|
|
734
677
|
if (_temp6 && _temp6.then) return _temp6.then(function () {});
|
|
735
678
|
}
|
|
736
|
-
|
|
737
679
|
var _oFirstElementChild = oNode.firstElementChild;
|
|
738
|
-
|
|
739
680
|
if (apiVersion === 2) {
|
|
740
681
|
while (_oFirstElementChild !== null) {
|
|
741
682
|
var sChildName = _oFirstElementChild.localName;
|
|
742
683
|
var sAggregationName = sChildName;
|
|
743
|
-
|
|
744
684
|
if (sAggregationName[0].toUpperCase() === sAggregationName[0]) {
|
|
745
685
|
// not a sub aggregation, go back to default Aggregation
|
|
746
686
|
sAggregationName = oMetadata.defaultAggregation || "";
|
|
747
687
|
}
|
|
748
|
-
|
|
749
688
|
var aggregationDefinition = oMetadata.aggregations[sAggregationName];
|
|
750
|
-
|
|
751
689
|
if (aggregationDefinition !== undefined && !aggregationDefinition.slot) {
|
|
752
|
-
var parsedAggregation = parseAggregation(_oFirstElementChild);
|
|
753
|
-
|
|
754
|
-
|
|
690
|
+
var parsedAggregation = parseAggregation(_oFirstElementChild, aggregationDefinition.processAggregations);
|
|
691
|
+
propertyValues[sAggregationName] = parsedAggregation;
|
|
755
692
|
for (var parsedAggregationKey in parsedAggregation) {
|
|
756
693
|
oMetadata.aggregations[parsedAggregationKey] = parsedAggregation[parsedAggregationKey];
|
|
757
694
|
}
|
|
758
695
|
}
|
|
759
|
-
|
|
760
696
|
_oFirstElementChild = _oFirstElementChild.nextElementSibling;
|
|
761
697
|
}
|
|
762
698
|
}
|
|
763
|
-
|
|
764
699
|
var _temp12 = function () {
|
|
765
700
|
if (apiVersion !== 2) {
|
|
766
701
|
// If there are aggregation we need to visit the childNodes to resolve templating instructions
|
|
767
702
|
return Promise.resolve(oVisitor.visitChildNodes(oNode)).then(function () {});
|
|
768
703
|
}
|
|
769
704
|
}();
|
|
770
|
-
|
|
771
705
|
return _temp12 && _temp12.then ? _temp12.then(_temp11) : _temp11(_temp12);
|
|
772
706
|
}
|
|
773
707
|
}();
|
|
774
|
-
|
|
775
708
|
return Promise.resolve(_temp10 && _temp10.then ? _temp10.then(function () {
|
|
776
709
|
return oAggregations;
|
|
777
710
|
}) : oAggregations);
|
|
@@ -779,67 +712,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
779
712
|
return Promise.reject(e);
|
|
780
713
|
}
|
|
781
714
|
};
|
|
782
|
-
|
|
783
|
-
/**
|
|
784
|
-
* Parse the incoming XML node and try to resolve the binding contexts defined inside.
|
|
785
|
-
*
|
|
786
|
-
* @param oMetadata The metadata for the building block
|
|
787
|
-
* @param oSettings The settings object
|
|
788
|
-
* @param oNode The XML node to parse
|
|
789
|
-
* @param isPublic Whether the building block is used in a public context or not
|
|
790
|
-
* @param oVisitor The visitor instance
|
|
791
|
-
* @param mContexts The contexts to be used
|
|
792
|
-
* @param oMetadataContexts The metadata contexts to be used
|
|
793
|
-
*/
|
|
794
|
-
var processContexts = function (oMetadata, oSettings, oNode, isPublic, oVisitor, mContexts, oMetadataContexts) {
|
|
795
|
-
try {
|
|
796
|
-
oSettings.currentContextPath = oSettings.bindingContexts.contextPath;
|
|
797
|
-
var mMissingContext = {};
|
|
798
|
-
var propertyValues = {};
|
|
799
|
-
var oDefinitionContexts = oMetadata.metadataContexts;
|
|
800
|
-
var aDefinitionContextsKeys = Object.keys(oDefinitionContexts); // Since the metaPath and other property can be relative to the contextPath we need to evaluate the current contextPath first
|
|
801
|
-
|
|
802
|
-
var contextPathIndex = aDefinitionContextsKeys.indexOf("contextPath");
|
|
803
|
-
|
|
804
|
-
if (contextPathIndex !== -1) {
|
|
805
|
-
// If it is defined we extract it and reinsert it in the first position of the array
|
|
806
|
-
var contextPathDefinition = aDefinitionContextsKeys.splice(contextPathIndex, 1);
|
|
807
|
-
aDefinitionContextsKeys.splice(0, 0, contextPathDefinition[0]);
|
|
808
|
-
}
|
|
809
|
-
|
|
810
|
-
for (var _i = 0, _aDefinitionContextsK = aDefinitionContextsKeys; _i < _aDefinitionContextsK.length; _i++) {
|
|
811
|
-
var sAttributeName = _aDefinitionContextsK[_i];
|
|
812
|
-
var bDoNotResolve = isPublic && oDefinitionContexts[sAttributeName].isPublic === false && oNode.hasAttribute(sAttributeName);
|
|
813
|
-
|
|
814
|
-
var oMetadataContext = _getMetadataContext(oSettings, oNode, sAttributeName, oVisitor, bDoNotResolve, oMetadata.isOpen);
|
|
815
|
-
|
|
816
|
-
if (oMetadataContext) {
|
|
817
|
-
oMetadataContext.name = sAttributeName;
|
|
818
|
-
addSingleContext(mContexts, oVisitor, oMetadataContext, oMetadataContexts);
|
|
819
|
-
|
|
820
|
-
if ((sAttributeName === "entitySet" || sAttributeName === "contextPath") && !oSettings.bindingContexts.hasOwnProperty(sAttributeName)) {
|
|
821
|
-
oSettings.bindingContexts[sAttributeName] = mContexts[sAttributeName];
|
|
822
|
-
}
|
|
823
|
-
|
|
824
|
-
if (sAttributeName === "contextPath") {
|
|
825
|
-
oSettings.currentContextPath = mContexts[sAttributeName];
|
|
826
|
-
}
|
|
827
|
-
|
|
828
|
-
propertyValues[sAttributeName] = mContexts[sAttributeName];
|
|
829
|
-
} else {
|
|
830
|
-
mMissingContext[sAttributeName] = true;
|
|
831
|
-
}
|
|
832
|
-
}
|
|
833
|
-
|
|
834
|
-
return Promise.resolve({
|
|
835
|
-
mMissingContext: mMissingContext,
|
|
836
|
-
propertyValues: propertyValues
|
|
837
|
-
});
|
|
838
|
-
} catch (e) {
|
|
839
|
-
return Promise.reject(e);
|
|
840
|
-
}
|
|
841
|
-
};
|
|
842
|
-
|
|
843
715
|
/**
|
|
844
716
|
* Parse the incoming XML node and try to resolve the properties defined there.
|
|
845
717
|
*
|
|
@@ -851,18 +723,17 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
851
723
|
*/
|
|
852
724
|
var processProperties = function (oMetadata, oNode, isPublic, oVisitor, apiVersion) {
|
|
853
725
|
try {
|
|
854
|
-
var oDefinitionProperties = oMetadata.properties;
|
|
726
|
+
var oDefinitionProperties = oMetadata.properties;
|
|
855
727
|
|
|
728
|
+
// Retrieve properties values
|
|
856
729
|
var aDefinitionPropertiesKeys = Object.keys(oDefinitionProperties);
|
|
857
730
|
var propertyValues = {};
|
|
858
|
-
|
|
859
731
|
var _temp22 = _forOf(aDefinitionPropertiesKeys, function (sKeyValue) {
|
|
860
732
|
if (oDefinitionProperties[sKeyValue].type === "object") {
|
|
861
733
|
propertyValues[sKeyValue] = deepClone(oDefinitionProperties[sKeyValue].defaultValue || {}); // To avoid values being reused across macros
|
|
862
734
|
} else {
|
|
863
735
|
propertyValues[sKeyValue] = oDefinitionProperties[sKeyValue].defaultValue;
|
|
864
736
|
}
|
|
865
|
-
|
|
866
737
|
var _temp20 = function () {
|
|
867
738
|
if (oNode.hasAttribute(sKeyValue) && isPublic && oDefinitionProperties[sKeyValue].isPublic === false) {
|
|
868
739
|
Log.error("Property ".concat(sKeyValue, " was ignored as it is not intended for public usage"));
|
|
@@ -871,33 +742,29 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
871
742
|
if (oNode.hasAttribute(sKeyValue)) {
|
|
872
743
|
return Promise.resolve(oVisitor.visitAttribute(oNode, oNode.attributes.getNamedItem(sKeyValue))).then(function () {
|
|
873
744
|
var vValue = oNode.getAttribute(sKeyValue);
|
|
874
|
-
|
|
875
|
-
|
|
745
|
+
if (vValue !== undefined && vValue !== null) {
|
|
746
|
+
var resolvedValue = vValue;
|
|
876
747
|
if (apiVersion === 2 && typeof vValue === "string" && !vValue.startsWith("{")) {
|
|
877
748
|
switch (oDefinitionProperties[sKeyValue].type) {
|
|
878
749
|
case "boolean":
|
|
879
|
-
|
|
750
|
+
resolvedValue = vValue === "true";
|
|
880
751
|
break;
|
|
881
|
-
|
|
882
752
|
case "number":
|
|
883
|
-
|
|
753
|
+
resolvedValue = Number(vValue);
|
|
884
754
|
break;
|
|
885
755
|
}
|
|
886
756
|
}
|
|
887
|
-
|
|
888
|
-
propertyValues[sKeyValue] =
|
|
757
|
+
vValue = vValue === null ? undefined : vValue;
|
|
758
|
+
propertyValues[sKeyValue] = resolvedValue;
|
|
889
759
|
}
|
|
890
760
|
});
|
|
891
761
|
}
|
|
892
762
|
}();
|
|
893
|
-
|
|
894
763
|
if (_temp23 && _temp23.then) return _temp23.then(function () {});
|
|
895
764
|
}
|
|
896
765
|
}();
|
|
897
|
-
|
|
898
766
|
if (_temp20 && _temp20.then) return _temp20.then(function () {});
|
|
899
767
|
});
|
|
900
|
-
|
|
901
768
|
return Promise.resolve(_temp22 && _temp22.then ? _temp22.then(function () {
|
|
902
769
|
return propertyValues;
|
|
903
770
|
}) : propertyValues);
|
|
@@ -905,11 +772,21 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
905
772
|
return Promise.reject(e);
|
|
906
773
|
}
|
|
907
774
|
};
|
|
908
|
-
|
|
775
|
+
/**
|
|
776
|
+
* Parse the incoming XML node and try to resolve the binding contexts defined inside.
|
|
777
|
+
*
|
|
778
|
+
* @param oMetadata The metadata for the building block
|
|
779
|
+
* @param oSettings The settings object
|
|
780
|
+
* @param oNode The XML node to parse
|
|
781
|
+
* @param isPublic Whether the building block is used in a public context or not
|
|
782
|
+
* @param oVisitor The visitor instance
|
|
783
|
+
* @param mContexts The contexts to be used
|
|
784
|
+
* @param oMetadataContexts The metadata contexts to be used
|
|
785
|
+
* @returns The processed and missing contexts
|
|
786
|
+
*/
|
|
909
787
|
var LOGGER_SCOPE = "sap.fe.core.buildingBlocks.BuildingBlockRuntime";
|
|
910
788
|
var DOMParserInstance = new DOMParser();
|
|
911
789
|
var isTraceMode = false;
|
|
912
|
-
|
|
913
790
|
/**
|
|
914
791
|
* Typeguard for checking if a building block use API 1.
|
|
915
792
|
*
|
|
@@ -919,49 +796,56 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
919
796
|
function isV1MacroDef(buildingBlockDefinition) {
|
|
920
797
|
return buildingBlockDefinition.apiVersion === undefined || buildingBlockDefinition.apiVersion === 1;
|
|
921
798
|
}
|
|
922
|
-
|
|
923
799
|
function validateMacroMetadataContext(sName, mContexts, oContextSettings, sKey) {
|
|
924
800
|
var oContext = mContexts[sKey];
|
|
925
801
|
var oContextObject = oContext === null || oContext === void 0 ? void 0 : oContext.getObject();
|
|
926
|
-
|
|
927
802
|
if (oContextSettings.required === true && (!oContext || oContextObject === null)) {
|
|
928
803
|
throw new Error("".concat(sName, ": Required metadataContext '").concat(sKey, "' is missing"));
|
|
929
804
|
} else if (oContextObject) {
|
|
930
805
|
// If context object has $kind property, $Type should not be checked
|
|
931
806
|
// Therefore remove from context settings
|
|
932
|
-
if (oContextObject.hasOwnProperty("$kind") && oContextSettings.$kind) {
|
|
807
|
+
if (oContextObject.hasOwnProperty("$kind") && oContextObject.$kind !== undefined && oContextSettings.$kind !== undefined) {
|
|
933
808
|
// Check if the $kind is part of the allowed ones
|
|
934
|
-
if (oContextSettings.$kind.indexOf(oContextObject
|
|
809
|
+
if (oContextSettings.$kind.indexOf(oContextObject.$kind) === -1) {
|
|
935
810
|
throw new Error("".concat(sName, ": '").concat(sKey, "' must be '$kind' '").concat(oContextSettings["$kind"], "' but is '").concat(oContextObject.$kind, "': ").concat(oContext.getPath()));
|
|
936
811
|
}
|
|
937
|
-
} else if (oContextObject.hasOwnProperty("$Type") && oContextSettings.$Type) {
|
|
812
|
+
} else if (oContextObject.hasOwnProperty("$Type") && oContextObject.$Type !== undefined && oContextSettings.$Type) {
|
|
938
813
|
// Check only $Type
|
|
939
|
-
if (oContextSettings.$Type.indexOf(oContextObject
|
|
814
|
+
if (oContextSettings.$Type.indexOf(oContextObject.$Type) === -1) {
|
|
940
815
|
throw new Error("".concat(sName, ": '").concat(sKey, "' must be '$Type' '").concat(oContextSettings["$Type"], "' but is '").concat(oContextObject.$Type, "': ").concat(oContext.getPath()));
|
|
941
816
|
}
|
|
942
817
|
}
|
|
943
818
|
}
|
|
944
819
|
}
|
|
945
|
-
|
|
946
820
|
function validateMacroSignature(sName, oMetadata, mContexts, oNode) {
|
|
947
821
|
var aMetadataContextKeys = oMetadata.metadataContexts && Object.keys(oMetadata.metadataContexts) || [],
|
|
948
|
-
|
|
949
|
-
|
|
822
|
+
aProperties = oMetadata.properties && Object.keys(oMetadata.properties) || [],
|
|
823
|
+
oAttributeNames = {};
|
|
950
824
|
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
825
|
+
// collect all attributes to find unchecked properties
|
|
826
|
+
var attributeNames = oNode.getAttributeNames();
|
|
827
|
+
var _iterator = _createForOfIteratorHelper(attributeNames),
|
|
828
|
+
_step;
|
|
829
|
+
try {
|
|
830
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
831
|
+
var attributeName = _step.value;
|
|
832
|
+
oAttributeNames[attributeName] = true;
|
|
833
|
+
}
|
|
955
834
|
|
|
835
|
+
//Check metadataContexts
|
|
836
|
+
} catch (err) {
|
|
837
|
+
_iterator.e(err);
|
|
838
|
+
} finally {
|
|
839
|
+
_iterator.f();
|
|
840
|
+
}
|
|
956
841
|
aMetadataContextKeys.forEach(function (sKey) {
|
|
957
842
|
var oContextSettings = oMetadata.metadataContexts[sKey];
|
|
958
843
|
validateMacroMetadataContext(sName, mContexts, oContextSettings, sKey);
|
|
959
844
|
delete oAttributeNames[sKey];
|
|
960
|
-
});
|
|
961
|
-
|
|
845
|
+
});
|
|
846
|
+
//Check properties
|
|
962
847
|
aProperties.forEach(function (sKey) {
|
|
963
848
|
var oPropertySettings = oMetadata.properties[sKey];
|
|
964
|
-
|
|
965
849
|
if (!oNode.hasAttribute(sKey)) {
|
|
966
850
|
if (oPropertySettings.required && !oPropertySettings.hasOwnProperty("defaultValue")) {
|
|
967
851
|
throw new Error("".concat(sName, ": ") + "Required property '".concat(sKey, "' is missing"));
|
|
@@ -969,8 +853,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
969
853
|
} else {
|
|
970
854
|
delete oAttributeNames[sKey];
|
|
971
855
|
}
|
|
972
|
-
});
|
|
856
|
+
});
|
|
973
857
|
|
|
858
|
+
// Unchecked properties
|
|
974
859
|
Object.keys(oAttributeNames).forEach(function (sKey) {
|
|
975
860
|
// no check for properties which start with underscore "_" or contain a colon ":" (different namespace), e.g. xmlns:trace, trace:macroID, unittest:id
|
|
976
861
|
if (sKey.indexOf(":") < 0 && !sKey.startsWith("xmlns")) {
|
|
@@ -978,31 +863,34 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
978
863
|
}
|
|
979
864
|
});
|
|
980
865
|
}
|
|
981
|
-
|
|
982
866
|
_exports.validateMacroSignature = validateMacroSignature;
|
|
983
867
|
var SAP_UI_CORE_ELEMENT = "sap.ui.core.Element";
|
|
984
868
|
var SAP_UI_MODEL_CONTEXT = "sap.ui.model.Context";
|
|
869
|
+
|
|
985
870
|
/**
|
|
986
871
|
* Ensures that the metadata for the building block are properly defined.
|
|
987
872
|
*
|
|
988
873
|
* @param buildingBlockMetadata The metadata received from the input
|
|
989
874
|
* @param isOpen Whether the building block is open or not
|
|
875
|
+
* @param apiVersion
|
|
990
876
|
* @returns A set of completed metadata for further processing
|
|
991
877
|
*/
|
|
992
|
-
|
|
993
878
|
function prepareMetadata(buildingBlockMetadata) {
|
|
994
879
|
var isOpen = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
995
|
-
|
|
880
|
+
var apiVersion = arguments.length > 2 ? arguments[2] : undefined;
|
|
996
881
|
if (buildingBlockMetadata) {
|
|
997
882
|
var oProperties = {};
|
|
998
883
|
var oAggregations = {
|
|
999
|
-
|
|
884
|
+
dependents: {
|
|
1000
885
|
type: SAP_UI_CORE_ELEMENT
|
|
1001
886
|
},
|
|
1002
|
-
|
|
887
|
+
customData: {
|
|
1003
888
|
type: SAP_UI_CORE_ELEMENT
|
|
1004
889
|
}
|
|
1005
890
|
};
|
|
891
|
+
if (apiVersion === 2) {
|
|
892
|
+
oAggregations.dependents.slot = "dependents";
|
|
893
|
+
}
|
|
1006
894
|
var oMetadataContexts = {};
|
|
1007
895
|
var foundDefaultAggregation;
|
|
1008
896
|
Object.keys(buildingBlockMetadata.properties).forEach(function (sPropertyName) {
|
|
@@ -1011,24 +899,23 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
1011
899
|
} else {
|
|
1012
900
|
oMetadataContexts[sPropertyName] = buildingBlockMetadata.properties[sPropertyName];
|
|
1013
901
|
}
|
|
1014
|
-
});
|
|
1015
|
-
|
|
902
|
+
});
|
|
903
|
+
// Merge events into properties as they are handled identically
|
|
1016
904
|
if (buildingBlockMetadata.events !== undefined) {
|
|
1017
905
|
Object.keys(buildingBlockMetadata.events).forEach(function (sEventName) {
|
|
1018
|
-
oProperties[sEventName] =
|
|
906
|
+
oProperties[sEventName] = _objectSpread({
|
|
907
|
+
type: "Function"
|
|
908
|
+
}, buildingBlockMetadata.events[sEventName]);
|
|
1019
909
|
});
|
|
1020
910
|
}
|
|
1021
|
-
|
|
1022
911
|
if (buildingBlockMetadata.aggregations !== undefined) {
|
|
1023
912
|
Object.keys(buildingBlockMetadata.aggregations).forEach(function (sPropertyName) {
|
|
1024
913
|
oAggregations[sPropertyName] = buildingBlockMetadata.aggregations[sPropertyName];
|
|
1025
|
-
|
|
1026
914
|
if (oAggregations[sPropertyName].isDefault) {
|
|
1027
915
|
foundDefaultAggregation = sPropertyName;
|
|
1028
916
|
}
|
|
1029
917
|
});
|
|
1030
918
|
}
|
|
1031
|
-
|
|
1032
919
|
return {
|
|
1033
920
|
properties: oProperties,
|
|
1034
921
|
aggregations: oAggregations,
|
|
@@ -1040,10 +927,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
1040
927
|
return {
|
|
1041
928
|
metadataContexts: {},
|
|
1042
929
|
aggregations: {
|
|
1043
|
-
|
|
930
|
+
dependents: {
|
|
1044
931
|
type: SAP_UI_CORE_ELEMENT
|
|
1045
932
|
},
|
|
1046
|
-
|
|
933
|
+
customData: {
|
|
1047
934
|
type: SAP_UI_CORE_ELEMENT
|
|
1048
935
|
}
|
|
1049
936
|
},
|
|
@@ -1052,49 +939,42 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
1052
939
|
};
|
|
1053
940
|
}
|
|
1054
941
|
}
|
|
942
|
+
|
|
1055
943
|
/**
|
|
1056
944
|
* Checks the absolute or context paths and returns an appropriate MetaContext.
|
|
1057
945
|
*
|
|
1058
946
|
* @param oSettings Additional settings
|
|
1059
947
|
* @param sAttributeValue The attribute value
|
|
1060
|
-
* @returns
|
|
948
|
+
* @returns The meta data context object
|
|
1061
949
|
*/
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
950
|
function _checkAbsoluteAndContextPaths(oSettings, sAttributeValue) {
|
|
1065
951
|
var sMetaPath;
|
|
1066
|
-
|
|
1067
952
|
if (sAttributeValue && sAttributeValue.startsWith("/")) {
|
|
1068
953
|
// absolute path - we just use this one
|
|
1069
954
|
sMetaPath = sAttributeValue;
|
|
1070
955
|
} else {
|
|
1071
956
|
var sContextPath = oSettings.currentContextPath.getPath();
|
|
1072
|
-
|
|
1073
957
|
if (!sContextPath.endsWith("/")) {
|
|
1074
958
|
sContextPath += "/";
|
|
1075
959
|
}
|
|
1076
|
-
|
|
1077
960
|
sMetaPath = sContextPath + sAttributeValue;
|
|
1078
961
|
}
|
|
1079
|
-
|
|
1080
962
|
return {
|
|
1081
963
|
model: "metaModel",
|
|
1082
964
|
path: sMetaPath
|
|
1083
965
|
};
|
|
1084
966
|
}
|
|
967
|
+
|
|
1085
968
|
/**
|
|
1086
969
|
* This method helps to create the metadata context in case it is not yet available in the store.
|
|
1087
970
|
*
|
|
1088
971
|
* @param oSettings Additional settings
|
|
1089
972
|
* @param sAttributeName The attribute name
|
|
1090
973
|
* @param sAttributeValue The attribute value
|
|
1091
|
-
* @returns
|
|
974
|
+
* @returns The meta data context object
|
|
1092
975
|
*/
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
976
|
function _createInitialMetadataContext(oSettings, sAttributeName, sAttributeValue) {
|
|
1096
977
|
var returnContext;
|
|
1097
|
-
|
|
1098
978
|
if (sAttributeValue.startsWith("/uid--")) {
|
|
1099
979
|
var oData = myStore[sAttributeValue];
|
|
1100
980
|
oSettings.models.converterContext.setProperty(sAttributeValue, oData);
|
|
@@ -1117,17 +997,13 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
1117
997
|
path: oSettings.bindingContexts.entitySet ? oSettings.bindingContexts.entitySet.getPath(sAttributeValue) : sAttributeValue
|
|
1118
998
|
};
|
|
1119
999
|
}
|
|
1120
|
-
|
|
1121
1000
|
return returnContext;
|
|
1122
1001
|
}
|
|
1123
|
-
|
|
1124
1002
|
function _getMetadataContext(oSettings, oNode, sAttributeName, oVisitor, bDoNotResolve, isOpen) {
|
|
1125
1003
|
var oMetadataContext;
|
|
1126
|
-
|
|
1127
1004
|
if (!bDoNotResolve && oNode.hasAttribute(sAttributeName)) {
|
|
1128
1005
|
var sAttributeValue = oNode.getAttribute(sAttributeName);
|
|
1129
1006
|
oMetadataContext = BindingParser.complexParser(sAttributeValue);
|
|
1130
|
-
|
|
1131
1007
|
if (!oMetadataContext) {
|
|
1132
1008
|
oMetadataContext = _createInitialMetadataContext(oSettings, sAttributeName, sAttributeValue);
|
|
1133
1009
|
}
|
|
@@ -1148,89 +1024,117 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
1148
1024
|
return undefined;
|
|
1149
1025
|
}
|
|
1150
1026
|
}
|
|
1151
|
-
|
|
1152
1027
|
return oMetadataContext;
|
|
1153
1028
|
}
|
|
1154
|
-
|
|
1155
|
-
|
|
1029
|
+
function processContexts(oMetadata, oSettings, oNode, isPublic, oVisitor, mContexts, oMetadataContexts) {
|
|
1030
|
+
oSettings.currentContextPath = oSettings.bindingContexts.contextPath;
|
|
1031
|
+
var mMissingContext = {};
|
|
1032
|
+
var propertyValues = {};
|
|
1033
|
+
var oDefinitionContexts = oMetadata.metadataContexts;
|
|
1034
|
+
var aDefinitionContextsKeys = Object.keys(oDefinitionContexts);
|
|
1035
|
+
// Since the metaPath and other property can be relative to the contextPath we need to evaluate the current contextPath first
|
|
1036
|
+
var contextPathIndex = aDefinitionContextsKeys.indexOf("contextPath");
|
|
1037
|
+
if (contextPathIndex !== -1) {
|
|
1038
|
+
// If it is defined we extract it and reinsert it in the first position of the array
|
|
1039
|
+
var contextPathDefinition = aDefinitionContextsKeys.splice(contextPathIndex, 1);
|
|
1040
|
+
aDefinitionContextsKeys.splice(0, 0, contextPathDefinition[0]);
|
|
1041
|
+
}
|
|
1042
|
+
for (var _i = 0, _aDefinitionContextsK = aDefinitionContextsKeys; _i < _aDefinitionContextsK.length; _i++) {
|
|
1043
|
+
var sAttributeName = _aDefinitionContextsK[_i];
|
|
1044
|
+
var bDoNotResolve = isPublic && oDefinitionContexts[sAttributeName].isPublic === false && oNode.hasAttribute(sAttributeName);
|
|
1045
|
+
var oMetadataContext = _getMetadataContext(oSettings, oNode, sAttributeName, oVisitor, bDoNotResolve, oMetadata.isOpen);
|
|
1046
|
+
if (oMetadataContext) {
|
|
1047
|
+
oMetadataContext.name = sAttributeName;
|
|
1048
|
+
addSingleContext(mContexts, oVisitor, oMetadataContext, oMetadataContexts);
|
|
1049
|
+
if ((sAttributeName === "entitySet" || sAttributeName === "contextPath") && !oSettings.bindingContexts.hasOwnProperty(sAttributeName)) {
|
|
1050
|
+
oSettings.bindingContexts[sAttributeName] = mContexts[sAttributeName];
|
|
1051
|
+
}
|
|
1052
|
+
if (sAttributeName === "contextPath") {
|
|
1053
|
+
oSettings.currentContextPath = mContexts[sAttributeName];
|
|
1054
|
+
}
|
|
1055
|
+
propertyValues[sAttributeName] = mContexts[sAttributeName];
|
|
1056
|
+
} else {
|
|
1057
|
+
mMissingContext[sAttributeName] = true;
|
|
1058
|
+
}
|
|
1059
|
+
}
|
|
1060
|
+
return {
|
|
1061
|
+
mMissingContext: mMissingContext,
|
|
1062
|
+
propertyValues: propertyValues
|
|
1063
|
+
};
|
|
1064
|
+
}
|
|
1065
|
+
function parseAggregation(oAggregation, processAggregations) {
|
|
1156
1066
|
var oOutObjects = {};
|
|
1157
|
-
|
|
1158
1067
|
if (oAggregation && oAggregation.children.length > 0) {
|
|
1159
1068
|
var children = oAggregation.children;
|
|
1160
|
-
|
|
1161
1069
|
for (var childIdx = 0; childIdx < children.length; childIdx++) {
|
|
1162
1070
|
var childDefinition = children[childIdx];
|
|
1163
1071
|
var childKey = childDefinition.getAttribute("key") || childDefinition.getAttribute("id");
|
|
1164
|
-
|
|
1165
1072
|
if (childKey) {
|
|
1166
1073
|
childKey = "InlineXML_".concat(childKey);
|
|
1167
1074
|
childDefinition.setAttribute("key", childKey);
|
|
1168
|
-
|
|
1075
|
+
var aggregationObject = {
|
|
1169
1076
|
key: childKey,
|
|
1170
1077
|
position: {
|
|
1171
|
-
placement: childDefinition.getAttribute("placement"),
|
|
1172
|
-
anchor: childDefinition.getAttribute("anchor")
|
|
1078
|
+
placement: childDefinition.getAttribute("placement") || Placement.After,
|
|
1079
|
+
anchor: childDefinition.getAttribute("anchor") || undefined
|
|
1173
1080
|
},
|
|
1174
1081
|
type: "Slot"
|
|
1175
1082
|
};
|
|
1083
|
+
if (processAggregations) {
|
|
1084
|
+
aggregationObject = processAggregations(childDefinition, aggregationObject);
|
|
1085
|
+
}
|
|
1086
|
+
oOutObjects[aggregationObject.key] = aggregationObject;
|
|
1176
1087
|
}
|
|
1177
1088
|
}
|
|
1178
1089
|
}
|
|
1179
|
-
|
|
1180
1090
|
return oOutObjects;
|
|
1181
1091
|
}
|
|
1182
|
-
|
|
1183
1092
|
function processSlots(oAggregations, oMetadataAggregations, oNode) {
|
|
1184
1093
|
var processCustomData = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
1185
|
-
|
|
1186
1094
|
if (Object.keys(oAggregations).length > 0) {
|
|
1187
1095
|
Object.keys(oAggregations).forEach(function (sAggregationName) {
|
|
1188
1096
|
var oAggregationElement = oAggregations[sAggregationName];
|
|
1189
|
-
|
|
1190
1097
|
if (oNode !== null && oNode !== undefined && oAggregationElement) {
|
|
1191
1098
|
// slots can have :: as keys which is not a valid aggregation name therefore replacing them
|
|
1192
|
-
var oNewChild = document.createElementNS(oNode.namespaceURI, sAggregationName.replace(/:/gi, "_"));
|
|
1193
1099
|
var oElementChild = oAggregationElement.firstElementChild;
|
|
1194
|
-
|
|
1195
|
-
while (oElementChild) {
|
|
1196
|
-
var oNextChild = oElementChild.nextElementSibling;
|
|
1197
|
-
oNewChild.appendChild(oElementChild);
|
|
1198
|
-
oElementChild = oNextChild;
|
|
1199
|
-
}
|
|
1200
|
-
|
|
1201
1100
|
if (sAggregationName !== "customData" && sAggregationName !== "dependents") {
|
|
1202
1101
|
var sSlotName = oMetadataAggregations[sAggregationName] !== undefined && oMetadataAggregations[sAggregationName].slot || sAggregationName;
|
|
1203
1102
|
var oTargetElement = oNode.querySelector("slot[name='".concat(sSlotName, "']"));
|
|
1204
|
-
|
|
1205
1103
|
if (oTargetElement !== null) {
|
|
1206
|
-
|
|
1104
|
+
var oNewChild = prepareAggregationElememnt(oNode, sAggregationName, oElementChild);
|
|
1105
|
+
oTargetElement.replaceWith.apply(oTargetElement, _toConsumableArray(oNewChild.children)); // Somehow TS doesn't like this but the documentation says is should work
|
|
1207
1106
|
}
|
|
1208
|
-
} else if (processCustomData &&
|
|
1209
|
-
oNode
|
|
1107
|
+
} else if (processCustomData && oElementChild !== null) {
|
|
1108
|
+
var _oNewChild = prepareAggregationElememnt(oNode, sAggregationName, oElementChild);
|
|
1109
|
+
oNode.appendChild(_oNewChild);
|
|
1210
1110
|
}
|
|
1211
1111
|
}
|
|
1212
1112
|
});
|
|
1213
1113
|
}
|
|
1214
1114
|
}
|
|
1215
|
-
|
|
1115
|
+
function prepareAggregationElememnt(oNode, sAggregationName, oElementChild) {
|
|
1116
|
+
var oNewChild = document.createElementNS(oNode.namespaceURI, sAggregationName.replace(/:/gi, "_"));
|
|
1117
|
+
while (oElementChild) {
|
|
1118
|
+
var oNextChild = oElementChild.nextElementSibling;
|
|
1119
|
+
oNewChild.appendChild(oElementChild);
|
|
1120
|
+
oElementChild = oNextChild;
|
|
1121
|
+
}
|
|
1122
|
+
return oNewChild;
|
|
1123
|
+
}
|
|
1216
1124
|
function addSingleContext(mContexts, oVisitor, oCtx, oMetadataContexts) {
|
|
1217
1125
|
var sKey = oCtx.name || oCtx.model || undefined;
|
|
1218
|
-
|
|
1219
1126
|
if (oMetadataContexts[sKey]) {
|
|
1220
1127
|
return; // do not add twice
|
|
1221
1128
|
}
|
|
1222
1129
|
|
|
1223
1130
|
try {
|
|
1224
1131
|
var sContextPath = oCtx.path;
|
|
1225
|
-
|
|
1226
1132
|
if (oCtx.model != null) {
|
|
1227
1133
|
sContextPath = "".concat(oCtx.model, ">").concat(sContextPath);
|
|
1228
1134
|
}
|
|
1229
|
-
|
|
1230
1135
|
var mSetting = oVisitor.getSettings();
|
|
1231
|
-
|
|
1232
1136
|
if (oCtx.model === "converterContext" && oCtx.path.length > 0) {
|
|
1233
|
-
mContexts[sKey] = mSetting.models[oCtx.model].getContext(oCtx.path
|
|
1137
|
+
mContexts[sKey] = mSetting.models[oCtx.model].getContext(oCtx.path /*, mSetting.bindingContexts[oCtx.model]*/); // add the context to the visitor
|
|
1234
1138
|
} else if (!mSetting.bindingContexts[oCtx.model] && mSetting.models[oCtx.model]) {
|
|
1235
1139
|
mContexts[sKey] = mSetting.models[oCtx.model].getContext(oCtx.path); // add the context to the visitor
|
|
1236
1140
|
} else {
|
|
@@ -1238,61 +1142,53 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
1238
1142
|
}
|
|
1239
1143
|
|
|
1240
1144
|
oMetadataContexts[sKey] = mContexts[sKey]; // make it available inside metadataContexts JSON object
|
|
1241
|
-
} catch (ex) {
|
|
1145
|
+
} catch (ex) {
|
|
1146
|
+
//console.error(ex);
|
|
1242
1147
|
// ignore the context as this can only be the case if the model is not ready, i.e. not a preprocessing model but maybe a model for
|
|
1243
1148
|
// providing afterwards
|
|
1244
1149
|
// TODO 0002 not yet implemented
|
|
1245
1150
|
//mContexts["_$error"].oModel.setProperty("/" + sKey, ex);
|
|
1246
1151
|
}
|
|
1247
1152
|
}
|
|
1153
|
+
|
|
1248
1154
|
/**
|
|
1249
1155
|
* Register a building block definition to be used inside the xml template processor.
|
|
1250
1156
|
*
|
|
1251
1157
|
* @param buildingBlockDefinition The building block definition
|
|
1252
1158
|
*/
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
1159
|
function registerBuildingBlock(buildingBlockDefinition) {
|
|
1256
1160
|
XMLPreprocessor.plugIn(function (oNode, oVisitor) {
|
|
1257
1161
|
return processBuildingBlock(buildingBlockDefinition, oNode, oVisitor);
|
|
1258
1162
|
}, buildingBlockDefinition.namespace, buildingBlockDefinition.xmlTag || buildingBlockDefinition.name);
|
|
1259
|
-
|
|
1260
1163
|
if (buildingBlockDefinition.publicNamespace) {
|
|
1261
1164
|
XMLPreprocessor.plugIn(function (oNode, oVisitor) {
|
|
1262
1165
|
return processBuildingBlock(buildingBlockDefinition, oNode, oVisitor, true);
|
|
1263
1166
|
}, buildingBlockDefinition.publicNamespace, buildingBlockDefinition.xmlTag || buildingBlockDefinition.name);
|
|
1264
1167
|
}
|
|
1265
1168
|
}
|
|
1266
|
-
|
|
1267
1169
|
_exports.registerBuildingBlock = registerBuildingBlock;
|
|
1268
|
-
|
|
1269
1170
|
function createErrorXML(errorMessages, xmlFragment, additionalData, stack) {
|
|
1270
1171
|
var errorLabels = errorMessages.map(function (errorMessage) {
|
|
1271
1172
|
return xml(_templateObject || (_templateObject = _taggedTemplateLiteral(["<m:Label text=\"", "\"/>"])), escapeXMLAttributeValue(errorMessage));
|
|
1272
1173
|
});
|
|
1273
1174
|
var errorStack = "";
|
|
1274
|
-
|
|
1275
1175
|
if (stack) {
|
|
1276
1176
|
var stackFormatted = btoa("<pre>".concat(stack, "</pre>"));
|
|
1277
1177
|
errorStack = xml(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["<m:FormattedText htmlText=\"", "\" />"])), "{= BBF.base64Decode('".concat(stackFormatted, "') }"));
|
|
1278
1178
|
}
|
|
1279
|
-
|
|
1280
1179
|
var additionalText = "";
|
|
1281
|
-
|
|
1282
1180
|
if (additionalData) {
|
|
1283
1181
|
additionalText = xml(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["<m:VBox>\n\t\t\t\t\t\t<m:Label text=\"Trace Info\"/>\n\t\t\t\t\t\t<code:CodeEditor type=\"json\" value=\"", "\" height=\"300px\" />\n\t\t\t\t\t</m:VBox>"])), "{= BBF.base64Decode('".concat(btoa(JSON.stringify(additionalData, null, 4)), "') }"));
|
|
1284
1182
|
}
|
|
1285
|
-
|
|
1286
1183
|
return xml(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["<m:VBox xmlns:m=\"sap.m\" xmlns:code=\"sap.ui.codeeditor\" core:require=\"{BBF:'sap/fe/core/buildingBlocks/BuildingBlockFormatter'}\">\n\t\t\t\t", "\n\t\t\t\t", "\n\t\t\t\t<grid:CSSGrid gridTemplateRows=\"fr\" gridTemplateColumns=\"repeat(2,1fr)\" gridGap=\"1rem\" xmlns:grid=\"sap.ui.layout.cssgrid\" >\n\t\t\t\t\t<m:VBox>\n\t\t\t\t\t\t<m:Label text=\"How the building block was called\"/>\n\t\t\t\t\t\t<code:CodeEditor type=\"xml\" value=\"", "\" height=\"300px\" />\n\t\t\t\t\t</m:VBox>\n\t\t\t\t\t", "\n\t\t\t\t</grid:CSSGrid>\n\t\t\t</m:VBox>"])), errorLabels, errorStack, "{= BBF.base64Decode('".concat(btoa(xmlFragment.replaceAll(">", ">")), "') }"), additionalText);
|
|
1287
1184
|
}
|
|
1288
|
-
|
|
1289
1185
|
var myStore = {};
|
|
1290
|
-
|
|
1291
1186
|
function storeValue(values) {
|
|
1292
1187
|
var propertyUID = "/uid--".concat(uid());
|
|
1293
1188
|
myStore[propertyUID] = values;
|
|
1294
1189
|
return propertyUID;
|
|
1295
1190
|
}
|
|
1191
|
+
|
|
1296
1192
|
/**
|
|
1297
1193
|
* Parse an XML string and return the associated document.
|
|
1298
1194
|
*
|
|
@@ -1300,52 +1196,46 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
1300
1196
|
* @param addDefaultNamespaces Whether or not we should add default namespace
|
|
1301
1197
|
* @returns The XML document.
|
|
1302
1198
|
*/
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
1199
|
function parseXMLString(xmlString) {
|
|
1200
|
+
var _output2, _output3;
|
|
1306
1201
|
var addDefaultNamespaces = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
1307
|
-
|
|
1308
1202
|
if (addDefaultNamespaces) {
|
|
1309
1203
|
xmlString = "<template\n\t\t\t\t\t\txmlns:template=\"http://schemas.sap.com/sapui5/extension/sap.ui.core.template/1\"\n\t\t\t\t\t\txmlns:m=\"sap.m\"\n\t\t\t\t\t\txmlns:macros=\"sap.fe.macros\"\n\t\t\t\t\t\txmlns:core=\"sap.ui.core\"\n\t\t\t\t\t\txmlns:mdc=\"sap.ui.mdc\"\n\t\t\t\t\t\txmlns:customData=\"http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1\">".concat(xmlString, "</template>");
|
|
1310
1204
|
}
|
|
1311
|
-
|
|
1312
1205
|
var xmlDocument = DOMParserInstance.parseFromString(xmlString, "text/xml");
|
|
1313
1206
|
var output = xmlDocument.firstElementChild;
|
|
1314
|
-
|
|
1315
1207
|
while (((_output = output) === null || _output === void 0 ? void 0 : _output.localName) === "template") {
|
|
1316
1208
|
var _output;
|
|
1317
|
-
|
|
1318
1209
|
output = output.firstElementChild;
|
|
1319
1210
|
}
|
|
1320
|
-
|
|
1321
|
-
return
|
|
1211
|
+
var children = (_output2 = output) !== null && _output2 !== void 0 && _output2.parentElement ? (_output3 = output) === null || _output3 === void 0 ? void 0 : _output3.parentElement.children : [output];
|
|
1212
|
+
return Array.from(children);
|
|
1322
1213
|
}
|
|
1214
|
+
|
|
1323
1215
|
/**
|
|
1324
1216
|
* Escape an XML attribute value.
|
|
1325
1217
|
*
|
|
1326
1218
|
* @param value The attribute value to escape.
|
|
1327
1219
|
* @returns The escaped string.
|
|
1328
1220
|
*/
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
1221
|
_exports.parseXMLString = parseXMLString;
|
|
1332
|
-
|
|
1333
1222
|
function escapeXMLAttributeValue(value) {
|
|
1334
1223
|
return value === null || value === void 0 ? void 0 : value.replace(/&/g, "&").replace(/</g, "<").replace(/"/g, """).replace(/'/g, "'");
|
|
1335
1224
|
}
|
|
1336
|
-
|
|
1337
1225
|
_exports.escapeXMLAttributeValue = escapeXMLAttributeValue;
|
|
1338
|
-
|
|
1339
1226
|
function renderInTraceMode(outStr) {
|
|
1227
|
+
var _xmlResult$;
|
|
1340
1228
|
var xmlResult = parseXMLString(outStr, true);
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
var errorMessage = xmlResult.innerText || xmlResult.innerHTML;
|
|
1229
|
+
if (xmlResult.length > 0 !== undefined && ((_xmlResult$ = xmlResult[0]) === null || _xmlResult$ === void 0 ? void 0 : _xmlResult$.localName) === "parsererror") {
|
|
1230
|
+
var errorMessage = xmlResult[0].innerText || xmlResult[0].innerHTML;
|
|
1344
1231
|
return createErrorXML([errorMessage.split("\n")[0]], outStr);
|
|
1345
1232
|
} else {
|
|
1346
1233
|
return outStr;
|
|
1347
1234
|
}
|
|
1348
1235
|
}
|
|
1236
|
+
function isBuildingBlockBase(bb) {
|
|
1237
|
+
return (bb === null || bb === void 0 ? void 0 : bb.getTemplate) !== undefined;
|
|
1238
|
+
}
|
|
1349
1239
|
/**
|
|
1350
1240
|
* Create a string representation of the template literal while handling special object case.
|
|
1351
1241
|
*
|
|
@@ -1353,40 +1243,34 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
1353
1243
|
* @param values The values part of the template literal
|
|
1354
1244
|
* @returns The XML string document representing the string that was used.
|
|
1355
1245
|
*/
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
1246
|
var xml = function (strings) {
|
|
1359
1247
|
var outStr = "";
|
|
1360
1248
|
var i;
|
|
1361
|
-
|
|
1362
1249
|
for (var _len = arguments.length, values = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
1363
1250
|
values[_key - 1] = arguments[_key];
|
|
1364
1251
|
}
|
|
1365
|
-
|
|
1366
1252
|
for (i = 0; i < values.length; i++) {
|
|
1367
|
-
outStr += strings[i];
|
|
1253
|
+
outStr += strings[i];
|
|
1368
1254
|
|
|
1255
|
+
// Handle the different case of object, if it's an array we join them, if it's a binding expression (determined by _type) then we compile it.
|
|
1369
1256
|
var value = values[i];
|
|
1370
|
-
|
|
1371
1257
|
if (Array.isArray(value) && value.length > 0 && typeof value[0] === "string") {
|
|
1372
1258
|
outStr += value.flat(5).join("\n").trim();
|
|
1373
|
-
} else if (
|
|
1259
|
+
} else if (isFunctionArray(value)) {
|
|
1374
1260
|
outStr += value.map(function (valuefn) {
|
|
1375
1261
|
return valuefn();
|
|
1376
1262
|
}).join("\n");
|
|
1377
|
-
} else if (value
|
|
1263
|
+
} else if (isBindingToolkitExpression(value)) {
|
|
1378
1264
|
var compiledExpression = compileExpression(value);
|
|
1379
1265
|
outStr += escapeXMLAttributeValue(compiledExpression);
|
|
1380
|
-
} else if (value
|
|
1266
|
+
} else if (isBuildingBlockBase(value)) {
|
|
1381
1267
|
outStr += value.getTemplate();
|
|
1382
1268
|
} else if (typeof value === "undefined") {
|
|
1383
1269
|
outStr += "{this>undefinedValue}";
|
|
1384
1270
|
} else if (typeof value === "function") {
|
|
1385
1271
|
outStr += value();
|
|
1386
1272
|
} else if (typeof value === "object" && value !== null) {
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
if ((_value$isA = value.isA) !== null && _value$isA !== void 0 && _value$isA.call(value, "sap.ui.model.Context")) {
|
|
1273
|
+
if (isContext(value)) {
|
|
1390
1274
|
outStr += value.getPath();
|
|
1391
1275
|
} else {
|
|
1392
1276
|
var propertyUId = storeValue(value);
|
|
@@ -1398,18 +1282,14 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
1398
1282
|
outStr += value;
|
|
1399
1283
|
}
|
|
1400
1284
|
}
|
|
1401
|
-
|
|
1402
1285
|
outStr += strings[i];
|
|
1403
1286
|
outStr = outStr.trim();
|
|
1404
|
-
|
|
1405
1287
|
if (isTraceMode) {
|
|
1406
1288
|
return renderInTraceMode(outStr);
|
|
1407
1289
|
}
|
|
1408
|
-
|
|
1409
1290
|
return outStr;
|
|
1410
1291
|
};
|
|
1411
|
-
|
|
1412
1292
|
_exports.xml = xml;
|
|
1413
1293
|
return _exports;
|
|
1414
1294
|
}, false);
|
|
1415
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0YXJnZXQiLCJib2R5IiwiY2hlY2siLCJpdGVyYXRvciIsInN0ZXAiLCJwYWN0IiwicmVqZWN0IiwiX2N5Y2xlIiwicmVzdWx0IiwibmV4dCIsImRvbmUiLCJ2YWx1ZSIsInRoZW4iLCJ2IiwiYmluZCIsImUiLCJyZXR1cm4iLCJfZml4dXAiLCJUeXBlRXJyb3IiLCJ2YWx1ZXMiLCJpIiwibGVuZ3RoIiwicHVzaCIsImFycmF5IiwiU3ltYm9sIiwic3RhdGUiLCJzIiwibyIsIm9ic2VydmVyIiwicHJvdG90eXBlIiwib25GdWxmaWxsZWQiLCJvblJlamVjdGVkIiwiY2FsbGJhY2siLCJfdGhpcyIsInRoZW5hYmxlIiwidGVzdCIsInVwZGF0ZSIsInN0YWdlIiwic2hvdWxkQ29udGludWUiLCJ1cGRhdGVWYWx1ZSIsIl9yZXN1bWVBZnRlclRlc3QiLCJfcmVzdW1lQWZ0ZXJCb2R5IiwiX3Jlc3VtZUFmdGVyVXBkYXRlIiwicmVjb3ZlciIsInByb2Nlc3NCdWlsZGluZ0Jsb2NrIiwiYnVpbGRpbmdCbG9ja0RlZmluaXRpb24iLCJvTm9kZSIsIm9WaXNpdG9yIiwiaXNQdWJsaWMiLCJzRnJhZ21lbnROYW1lIiwiZnJhZ21lbnQiLCJuYW1lc3BhY2UiLCJuYW1lIiwic05hbWUiLCJtQ29udGV4dHMiLCJvTWV0YWRhdGFDb250ZXh0cyIsIm9TZXR0aW5ncyIsImdldFNldHRpbmdzIiwibW9kZWxzIiwiZ2V0UmVzb3VyY2VCdW5kbGUiLCJvUmVzb3VyY2VCdW5kbGUiLCJSZXNvdXJjZU1vZGVsIiwic2V0QXBwbGljYXRpb25JMThuQnVuZGxlIiwiY2F0Y2giLCJlcnJvciIsIkxvZyIsIm9NZXRhZGF0YSIsInByZXBhcmVNZXRhZGF0YSIsIm1ldGFkYXRhIiwiaXNPcGVuIiwicHJvY2Vzc1Byb3BlcnRpZXMiLCJhcGlWZXJzaW9uIiwicHJvcGVydHlWYWx1ZXMiLCJwcm9jZXNzQ29udGV4dHMiLCJtTWlzc2luZ0NvbnRleHQiLCJleHRyYVByb3BlcnR5VmFsdWVzIiwiT2JqZWN0IiwiYXNzaWduIiwiaW5pdGlhbEtleXMiLCJrZXlzIiwicHJvY2Vzc0NoaWxkcmVuIiwib0FnZ3JlZ2F0aW9ucyIsIm9QcmV2aW91c01hY3JvSW5mbyIsIm9JbnN0YW5jZSIsIm9Db250cm9sQ29uZmlnIiwidmlld0RhdGEiLCJnZXRQcm9wZXJ0eSIsInByb2Nlc3NlZFByb3BlcnR5VmFsdWVzIiwiaXNWMU1hY3JvRGVmIiwiY3JlYXRlIiwiY2FsbCIsIm1ldGFkYXRhQ29udGV4dHMiLCJmb3JFYWNoIiwic01ldGFkYXRhTmFtZSIsImNvbXB1dGVkIiwic0NvbnRleHROYW1lIiwiaGFzT3duUHJvcGVydHkiLCJwcm9wTmFtZSIsIm9EYXRhIiwiaXNBIiwiU0FQX1VJX01PREVMX0NPTlRFWFQiLCJnZXRNb2RlbCIsImdldE9iamVjdCIsIkJ1aWxkaW5nQmxvY2tDbGFzcyIsImdldFByb3BlcnRpZXMiLCJ0YXJnZXRPYmplY3QiLCJzQXR0cmlidXRlVmFsdWUiLCJzdG9yZVZhbHVlIiwic0NvbnRleHRQYXRoIiwiY29udmVydGVyQ29udGV4dCIsInNldFByb3BlcnR5IiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJteVN0b3JlIiwidW5kZWZpbmVkIiwib0F0dHJpYnV0ZXNNb2RlbCIsIkF0dHJpYnV0ZU1vZGVsIiwiVHJhY2VJbmZvIiwiaXNUcmFjZUluZm9BY3RpdmUiLCJvVHJhY2VJbmZvIiwidHJhY2VNYWNyb0NhbGxzIiwibWFjcm9JbmZvIiwidmFsaWRhdGVNYWNyb1NpZ25hdHVyZSIsIm9Db250ZXh0VmlzaXRvciIsIndpdGgiLCJvUGFyZW50IiwicGFyZW50Tm9kZSIsImlDaGlsZEluZGV4Iiwib1Byb21pc2UiLCJwcm9jZXNzQ3VzdG9tRGF0YSIsIkFycmF5IiwiZnJvbSIsImNoaWxkcmVuIiwiaW5kZXhPZiIsImdldFRlbXBsYXRlIiwib1RlbXBsYXRlIiwiYWRkRGVmYXVsdE5hbWVzcGFjZSIsImlzUnVudGltZSIsIm15U3RvcmVLZXkiLCJoYXNFcnJvciIsImZpcnN0RWxlbWVudENoaWxkIiwicGFyc2VYTUxTdHJpbmciLCJpdGVyIiwiZG9jdW1lbnQiLCJjcmVhdGVOb2RlSXRlcmF0b3IiLCJOb2RlRmlsdGVyIiwiU0hPV19URVhUIiwidGV4dG5vZGUiLCJuZXh0Tm9kZSIsInRleHRDb250ZW50IiwidHJpbSIsImxvY2FsTmFtZSIsImlzVHJhY2VNb2RlIiwib0Vycm9yVGV4dCIsImNyZWF0ZUVycm9yWE1MIiwib3V0ZXJIVE1MIiwicmVwbGFjZVdpdGgiLCJwcm9jZXNzU2xvdHMiLCJhZ2dyZWdhdGlvbnMiLCJ2aXNpdE5vZGUiLCJyZW1vdmUiLCJQcm9taXNlIiwicmVzb2x2ZSIsImluc2VydEZyYWdtZW50Iiwib01hY3JvRWxlbWVudCIsIm9SZW1haW5pbmdTbG90cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJvU2xvdEVsZW1lbnQiLCJ0cmFjZURldGFpbHMiLCJpbml0aWFsUHJvcGVydGllcyIsInJlc29sdmVkUHJvcGVydGllcyIsIm1pc3NpbmdDb250ZXh0cyIsInByb3BlcnR5TmFtZSIsInByb3BlcnR5VmFsdWUiLCJwYXRoIiwiZ2V0UGF0aCIsImluY2x1ZGVzIiwiZXJyb3JBbnkiLCJvRXJyb3IiLCJzdGFjayIsIm9GaXJzdEVsZW1lbnRDaGlsZCIsIm9OZXh0Q2hpbGQiLCJuZXh0RWxlbWVudFNpYmxpbmciLCJzQ2hpbGROYW1lIiwic0FnZ3JlZ2F0aW9uTmFtZSIsInRvVXBwZXJDYXNlIiwiZGVmYXVsdEFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25EZWZpbml0aW9uIiwic2xvdCIsImNoaWxkRGVmaW5pdGlvbiIsIm9OZXdDaGlsZCIsImNyZWF0ZUVsZW1lbnROUyIsIm5hbWVzcGFjZVVSSSIsImdldEF0dHJpYnV0ZSIsIm5leHRDaGlsZCIsImFwcGVuZENoaWxkIiwicmVtb3ZlQXR0cmlidXRlIiwicHJvcGVydGllcyIsInR5cGUiLCJhdHRyaWJ1dGVzIiwiYXR0cmlidXRlSW5kZXgiLCJvT3V0T2JqZWN0cyIsImNoaWxkSWR4IiwibXlDaGlsZCIsInBhcnNlZEFnZ3JlZ2F0aW9uIiwicGFyc2VBZ2dyZWdhdGlvbiIsInBhcnNlZEFnZ3JlZ2F0aW9uS2V5IiwidmlzaXRDaGlsZE5vZGVzIiwiY3VycmVudENvbnRleHRQYXRoIiwiYmluZGluZ0NvbnRleHRzIiwiY29udGV4dFBhdGgiLCJvRGVmaW5pdGlvbkNvbnRleHRzIiwiYURlZmluaXRpb25Db250ZXh0c0tleXMiLCJjb250ZXh0UGF0aEluZGV4IiwiY29udGV4dFBhdGhEZWZpbml0aW9uIiwic3BsaWNlIiwic0F0dHJpYnV0ZU5hbWUiLCJiRG9Ob3RSZXNvbHZlIiwiaGFzQXR0cmlidXRlIiwib01ldGFkYXRhQ29udGV4dCIsIl9nZXRNZXRhZGF0YUNvbnRleHQiLCJhZGRTaW5nbGVDb250ZXh0Iiwib0RlZmluaXRpb25Qcm9wZXJ0aWVzIiwiYURlZmluaXRpb25Qcm9wZXJ0aWVzS2V5cyIsInNLZXlWYWx1ZSIsImRlZXBDbG9uZSIsImRlZmF1bHRWYWx1ZSIsInZpc2l0QXR0cmlidXRlIiwiZ2V0TmFtZWRJdGVtIiwidlZhbHVlIiwic3RhcnRzV2l0aCIsIk51bWJlciIsIkxPR0dFUl9TQ09QRSIsIkRPTVBhcnNlckluc3RhbmNlIiwiRE9NUGFyc2VyIiwidmFsaWRhdGVNYWNyb01ldGFkYXRhQ29udGV4dCIsIm9Db250ZXh0U2V0dGluZ3MiLCJzS2V5Iiwib0NvbnRleHQiLCJvQ29udGV4dE9iamVjdCIsInJlcXVpcmVkIiwiRXJyb3IiLCIka2luZCIsIiRUeXBlIiwiYU1ldGFkYXRhQ29udGV4dEtleXMiLCJhUHJvcGVydGllcyIsIm9BdHRyaWJ1dGVOYW1lcyIsImlLZXkiLCJvUHJvcGVydHlTZXR0aW5ncyIsIndhcm5pbmciLCJTQVBfVUlfQ09SRV9FTEVNRU5UIiwiYnVpbGRpbmdCbG9ja01ldGFkYXRhIiwib1Byb3BlcnRpZXMiLCJmb3VuZERlZmF1bHRBZ2dyZWdhdGlvbiIsInNQcm9wZXJ0eU5hbWUiLCJldmVudHMiLCJzRXZlbnROYW1lIiwiaXNEZWZhdWx0IiwiX2NoZWNrQWJzb2x1dGVBbmRDb250ZXh0UGF0aHMiLCJzTWV0YVBhdGgiLCJlbmRzV2l0aCIsIm1vZGVsIiwiX2NyZWF0ZUluaXRpYWxNZXRhZGF0YUNvbnRleHQiLCJyZXR1cm5Db250ZXh0IiwiZW50aXR5U2V0IiwiQmluZGluZ1BhcnNlciIsImNvbXBsZXhQYXJzZXIiLCJnZXRDb250ZXh0Iiwib0FnZ3JlZ2F0aW9uIiwiY2hpbGRLZXkiLCJzZXRBdHRyaWJ1dGUiLCJrZXkiLCJwb3NpdGlvbiIsInBsYWNlbWVudCIsImFuY2hvciIsIm9NZXRhZGF0YUFnZ3JlZ2F0aW9ucyIsIm9BZ2dyZWdhdGlvbkVsZW1lbnQiLCJyZXBsYWNlIiwib0VsZW1lbnRDaGlsZCIsInNTbG90TmFtZSIsIm9UYXJnZXRFbGVtZW50IiwicXVlcnlTZWxlY3RvciIsIm9DdHgiLCJtU2V0dGluZyIsImV4IiwicmVnaXN0ZXJCdWlsZGluZ0Jsb2NrIiwiWE1MUHJlcHJvY2Vzc29yIiwicGx1Z0luIiwieG1sVGFnIiwicHVibGljTmFtZXNwYWNlIiwiZXJyb3JNZXNzYWdlcyIsInhtbEZyYWdtZW50IiwiYWRkaXRpb25hbERhdGEiLCJlcnJvckxhYmVscyIsIm1hcCIsImVycm9yTWVzc2FnZSIsInhtbCIsImVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlIiwiZXJyb3JTdGFjayIsInN0YWNrRm9ybWF0dGVkIiwiYnRvYSIsImFkZGl0aW9uYWxUZXh0IiwiSlNPTiIsInN0cmluZ2lmeSIsInJlcGxhY2VBbGwiLCJwcm9wZXJ0eVVJRCIsInVpZCIsInhtbFN0cmluZyIsImFkZERlZmF1bHROYW1lc3BhY2VzIiwieG1sRG9jdW1lbnQiLCJwYXJzZUZyb21TdHJpbmciLCJvdXRwdXQiLCJyZW5kZXJJblRyYWNlTW9kZSIsIm91dFN0ciIsInhtbFJlc3VsdCIsImlubmVyVGV4dCIsImlubmVySFRNTCIsInNwbGl0Iiwic3RyaW5ncyIsImlzQXJyYXkiLCJmbGF0Iiwiam9pbiIsInZhbHVlZm4iLCJfdHlwZSIsImNvbXBpbGVkRXhwcmVzc2lvbiIsImNvbXBpbGVFeHByZXNzaW9uIiwicHJvcGVydHlVSWQiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkJ1aWxkaW5nQmxvY2tSdW50aW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IGRlZXBDbG9uZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9kZWVwQ2xvbmVcIjtcbmltcG9ydCB1aWQgZnJvbSBcInNhcC9iYXNlL3V0aWwvdWlkXCI7XG5pbXBvcnQgQXR0cmlidXRlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL0F0dHJpYnV0ZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7XG5cdEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbkRlZmluaXRpb24sXG5cdEJ1aWxkaW5nQmxvY2tCYXNlLFxuXHRCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbixcblx0QnVpbGRpbmdCbG9ja0RlZmluaXRpb25WMSxcblx0QnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRCdWlsZGluZ0Jsb2NrTWV0YWRhdGFDb250ZXh0RGVmaW5pdGlvbixcblx0QnVpbGRpbmdCbG9ja1Byb3BlcnR5RGVmaW5pdGlvblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvQnVpbGRpbmdCbG9ja1wiO1xuaW1wb3J0IHsgY29tcGlsZUV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9tYWNyb3MvUmVzb3VyY2VNb2RlbFwiO1xuaW1wb3J0IEJpbmRpbmdQYXJzZXIgZnJvbSBcInNhcC91aS9iYXNlL0JpbmRpbmdQYXJzZXJcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBUcmFjZUluZm8gZnJvbSBcIi4vVHJhY2VJbmZvXCI7XG5cbmNvbnN0IExPR0dFUl9TQ09QRSA9IFwic2FwLmZlLmNvcmUuYnVpbGRpbmdCbG9ja3MuQnVpbGRpbmdCbG9ja1J1bnRpbWVcIjtcbmNvbnN0IERPTVBhcnNlckluc3RhbmNlID0gbmV3IERPTVBhcnNlcigpO1xubGV0IGlzVHJhY2VNb2RlID0gZmFsc2U7XG5cbnR5cGUgUmVzb2x2ZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEgPSB7XG5cdHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb24+O1xuXHRhZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbkRlZmluaXRpb24+O1xuXHRtZXRhZGF0YUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrTWV0YWRhdGFDb250ZXh0RGVmaW5pdGlvbj47XG5cdGlzT3BlbjogYm9vbGVhbjtcblx0ZGVmYXVsdEFnZ3JlZ2F0aW9uPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBEZWZpbml0aW9uIG9mIGEgbWV0YSBkYXRhIGNvbnRleHRcbiAqL1xudHlwZSBNZXRhRGF0YUNvbnRleHQgPSB7XG5cdG5hbWU/OiBzdHJpbmc7XG5cdG1vZGVsOiBzdHJpbmc7XG5cdHBhdGg6IHN0cmluZztcbn07XG5cbnR5cGUgSUNhbGxiYWNrID0ge1xuXHRnZXRTZXR0aW5ncygpOiBhbnk7XG5cdC8qKlxuXHQgKiBWaXNpdHMgdGhlIGdpdmVuIG5vZGUgYW5kIGVpdGhlciBwcm9jZXNzZXMgYSB0ZW1wbGF0ZSBpbnN0cnVjdGlvbiwgY2FsbHNcblx0ICogYSB2aXNpdG9yLCBvciBzaW1wbHkgY2FsbHMgYm90aCB7QGxpbmtcblx0ICogc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrLnZpc2l0QXR0cmlidXRlcyB2aXNpdEF0dHJpYnV0ZXN9XG5cdCAqIGFuZCB7QGxpbmsgc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrLnZpc2l0Q2hpbGROb2Rlc1xuXHQgKiB2aXNpdENoaWxkTm9kZXN9LlxuXHQgKlxuXHQgKiBAcGFyYW0ge05vZGV9IG9Ob2RlXG5cdCAqICAgVGhlIFhNTCBET00gbm9kZVxuXHQgKiBAcmV0dXJucyB7c2FwLnVpLmJhc2UuU3luY1Byb21pc2V9XG5cdCAqICAgQSB0aGVuYWJsZSB3aGljaCByZXNvbHZlcyB3aXRoIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gYXMgc29vbiBhcyB2aXNpdGluZ1xuXHQgKiAgIGlzIGRvbmUsIG9yIGlzIHJlamVjdGVkIHdpdGggYSBjb3JyZXNwb25kaW5nIGVycm9yIGlmIHZpc2l0aW5nIGZhaWxzXG5cdCAqL1xuXHR2aXNpdE5vZGUob05vZGU6IE5vZGUpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBJbnNlcnRzIHRoZSBmcmFnbWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHBsYWNlIG9mIHRoZSBnaXZlbiBlbGVtZW50LiBMb2FkcyB0aGVcblx0ICogZnJhZ21lbnQsIHRha2VzIGNhcmUgb2YgY2FjaGluZyAoZm9yIHRoZSBjdXJyZW50IHByZS1wcm9jZXNzb3IgcnVuKSBhbmQgdmlzaXRzIHRoZVxuXHQgKiBmcmFnbWVudCdzIGNvbnRlbnQgb25jZSBpdCBoYXMgYmVlbiBpbXBvcnRlZCBpbnRvIHRoZSBlbGVtZW50J3Mgb3duZXIgZG9jdW1lbnQgYW5kXG5cdCAqIHB1dCBpbnRvIHBsYWNlLiBMb2FkaW5nIG9mIGZyYWdtZW50cyBpcyBhc3luY2hyb25vdXMgaWYgdGhlIHRlbXBsYXRlIHZpZXcgaXNcblx0ICogYXN5bmNocm9ub3VzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0ZyYWdtZW50TmFtZVxuXHQgKiAgIHRoZSBmcmFnbWVudCdzIHJlc29sdmVkIG5hbWVcblx0ICogQHBhcmFtIHtFbGVtZW50fSBvRWxlbWVudFxuXHQgKiAgIHRoZSBYTUwgRE9NIGVsZW1lbnQsIGUuZy4gPHNhcC51aS5jb3JlOkZyYWdtZW50PiBvciA8Y29yZTpFeHRlbnNpb25Qb2ludD5cblx0ICogQHBhcmFtIHtzYXAudWkuY29yZS51dGlsLl93aXRofSBvV2l0aENvbnRyb2xcblx0ICogICB0aGUgcGFyZW50J3MgXCJ3aXRoXCIgY29udHJvbFxuXHQgKiBAcmV0dXJucyB7c2FwLnVpLmJhc2UuU3luY1Byb21pc2V9XG5cdCAqIEEgc3luYyBwcm9taXNlIHdoaWNoIHJlc29sdmVzIHdpdGggPGNvZGU+dW5kZWZpbmVkPC9jb2RlPiBhcyBzb29uIGFzIHRoZSBmcmFnbWVudFxuXHQgKiAgIGhhcyBiZWVuIGluc2VydGVkLCBvciBpcyByZWplY3RlZCB3aXRoIGEgY29ycmVzcG9uZGluZyBlcnJvciBpZiBsb2FkaW5nIG9yIHZpc2l0aW5nXG5cdCAqICAgZmFpbHMuXG5cdCAqL1xuXHRpbnNlcnRGcmFnbWVudChzRnJhZ21lbnQ6IHN0cmluZywgb0VsZW1lbnQ6IEVsZW1lbnQsIG9XaXRoPzogYW55KTogUHJvbWlzZTx2b2lkPjtcblx0dmlzaXRBdHRyaWJ1dGUob05vZGU6IEVsZW1lbnQsIG9BdHRyaWJ1dGU6IEF0dHIpOiBQcm9taXNlPHZvaWQ+O1xuXHR2aXNpdENoaWxkTm9kZXMob05vZGU6IE5vZGUpOiBQcm9taXNlPHZvaWQ+O1xuXHQvKipcblx0ICogSW50ZXJwcmV0cyB0aGUgZ2l2ZW4gWE1MIERPTSBhdHRyaWJ1dGUgdmFsdWUgYXMgYSBiaW5kaW5nIGFuZCByZXR1cm5zIHRoZVxuXHQgKiByZXN1bHRpbmcgdmFsdWUuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzVmFsdWVcblx0ICogICBBbiBYTUwgRE9NIGF0dHJpYnV0ZSB2YWx1ZVxuXHQgKiBAcGFyYW0ge0VsZW1lbnR9IFtvRWxlbWVudF1cblx0ICogICBUaGUgWE1MIERPTSBlbGVtZW50IHRoZSBhdHRyaWJ1dGUgdmFsdWUgYmVsb25ncyB0byAobmVlZGVkIG9ubHkgZm9yXG5cdCAqICAgd2FybmluZ3Mgd2hpY2ggYXJlIGxvZ2dlZCB0byB0aGUgY29uc29sZSlcblx0ICogQHJldHVybnMge3NhcC51aS5iYXNlLlN5bmNQcm9taXNlfG51bGx9XG5cdCAqICAgQSB0aGVuYWJsZSB3aGljaCByZXNvbHZlcyB3aXRoIHRoZSByZXN1bHRpbmcgdmFsdWUsIG9yIGlzIHJlamVjdGVkIHdpdGggYVxuXHQgKiAgIGNvcnJlc3BvbmRpbmcgZXJyb3IgKGZvciBleGFtcGxlLCBhbiBlcnJvciB0aHJvd24gYnkgYSBmb3JtYXR0ZXIpIG9yXG5cdCAqICAgPGNvZGU+bnVsbDwvY29kZT4gaW4gY2FzZSB0aGUgYmluZGluZyBpcyBub3QgcmVhZHkgKGJlY2F1c2UgaXQgcmVmZXJzIHRvIGFcblx0ICogICBtb2RlbCB3aGljaCBpcyBub3QgYXZhaWxhYmxlKSAoc2luY2UgMS41Ny4wKVxuXHQgKi9cblx0Z2V0UmVzdWx0KHNWYWx1ZTogc3RyaW5nLCBlbGVtZW50PzogRWxlbWVudCk6IFByb21pc2U8YW55PiB8IG51bGw7XG5cdGdldENvbnRleHQoc1BhdGg6IHN0cmluZyk6IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgaW50ZXJmYWNlIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gbWFwIG9mIHZhcmlhYmxlcyB3aGljaFxuXHQgKiBvdmVycmlkZSBjdXJyZW50bHkga25vd24gdmFyaWFibGVzIG9mIHRoZSBzYW1lIG5hbWUgaW4gPGNvZGU+dGhpczwvY29kZT5cblx0ICogcGFyZW50IGludGVyZmFjZSBvciByZXBsYWNlIHRoZW0gYWx0b2dldGhlci4gRWFjaCB2YXJpYWJsZSBuYW1lIGJlY29tZXMgYVxuXHQgKiBuYW1lZCBtb2RlbCB3aXRoIGEgY29ycmVzcG9uZGluZyBvYmplY3QgYmluZGluZyBhbmQgY2FuIGJlIHVzZWQgaW5zaWRlIHRoZVxuXHQgKiBYTUwgdGVtcGxhdGUgaW4gdGhlIHVzdWFsIHdheSwgdGhhdCBpcywgd2l0aCBhIGJpbmRpbmcgZXhwcmVzc2lvbiBsaWtlXG5cdCAqIDxjb2RlPlwie3Zhcj5zb21lL3JlbGF0aXZlL3BhdGh9XCI8L2NvZGU+IChzZWUgZXhhbXBsZSkuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbbVZhcmlhYmxlcz17fV1cblx0ICogICBNYXAgZnJvbSB2YXJpYWJsZSBuYW1lIChzdHJpbmcpIHRvIHZhbHVlICh7QGxpbmsgc2FwLnVpLm1vZGVsLkNvbnRleHR9KVxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtiUmVwbGFjZV1cblx0ICogICBXaGV0aGVyIG9ubHkgdGhlIGdpdmVuIHZhcmlhYmxlcyBhcmUga25vd24gaW4gdGhlIG5ldyBjYWxsYmFjayBpbnRlcmZhY2Vcblx0ICogICBpbnN0YW5jZSwgbm8gaW5oZXJpdGVkIG9uZXNcblx0ICogQHJldHVybnMge3NhcC51aS5jb3JlLnV0aWwuWE1MUHJlcHJvY2Vzc29yLklDYWxsYmFja31cblx0ICogICBBIGNhbGxiYWNrIGludGVyZmFjZSBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gbVZhcmlhYmxlc1xuXHQgKiBAcGFyYW0gYlJlcGxhY2Vcblx0ICovXG5cdFwid2l0aFwiKG1WYXJpYWJsZXM/OiBhbnksIGJSZXBsYWNlPzogYm9vbGVhbik6IElDYWxsYmFjaztcbn07XG5cbi8qKlxuICogVHlwZWd1YXJkIGZvciBjaGVja2luZyBpZiBhIGJ1aWxkaW5nIGJsb2NrIHVzZSBBUEkgMS5cbiAqXG4gKiBAcGFyYW0gYnVpbGRpbmdCbG9ja0RlZmluaXRpb25cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgYnVpbGRpbmcgYmxvY2sgaXMgdXNpbmcgQVBJIDEuXG4gKi9cbmZ1bmN0aW9uIGlzVjFNYWNyb0RlZihidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbjogQnVpbGRpbmdCbG9ja0RlZmluaXRpb24pOiBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiBpcyBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvblYxIHtcblx0cmV0dXJuIGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb24gPT09IHVuZGVmaW5lZCB8fCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uID09PSAxO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVNYWNyb01ldGFkYXRhQ29udGV4dChcblx0c05hbWU6IHN0cmluZyxcblx0bUNvbnRleHRzOiBhbnksXG5cdG9Db250ZXh0U2V0dGluZ3M6IEJ1aWxkaW5nQmxvY2tNZXRhZGF0YUNvbnRleHREZWZpbml0aW9uLFxuXHRzS2V5OiBzdHJpbmdcbikge1xuXHRjb25zdCBvQ29udGV4dCA9IG1Db250ZXh0c1tzS2V5XTtcblx0Y29uc3Qgb0NvbnRleHRPYmplY3QgPSBvQ29udGV4dD8uZ2V0T2JqZWN0KCk7XG5cblx0aWYgKG9Db250ZXh0U2V0dGluZ3MucmVxdWlyZWQgPT09IHRydWUgJiYgKCFvQ29udGV4dCB8fCBvQ29udGV4dE9iamVjdCA9PT0gbnVsbCkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYCR7c05hbWV9OiBSZXF1aXJlZCBtZXRhZGF0YUNvbnRleHQgJyR7c0tleX0nIGlzIG1pc3NpbmdgKTtcblx0fSBlbHNlIGlmIChvQ29udGV4dE9iamVjdCkge1xuXHRcdC8vIElmIGNvbnRleHQgb2JqZWN0IGhhcyAka2luZCBwcm9wZXJ0eSwgJFR5cGUgc2hvdWxkIG5vdCBiZSBjaGVja2VkXG5cdFx0Ly8gVGhlcmVmb3JlIHJlbW92ZSBmcm9tIGNvbnRleHQgc2V0dGluZ3Ncblx0XHRpZiAob0NvbnRleHRPYmplY3QuaGFzT3duUHJvcGVydHkoXCIka2luZFwiKSAmJiBvQ29udGV4dFNldHRpbmdzLiRraW5kKSB7XG5cdFx0XHQvLyBDaGVjayBpZiB0aGUgJGtpbmQgaXMgcGFydCBvZiB0aGUgYWxsb3dlZCBvbmVzXG5cdFx0XHRpZiAob0NvbnRleHRTZXR0aW5ncy4ka2luZC5pbmRleE9mKG9Db250ZXh0T2JqZWN0W1wiJGtpbmRcIl0pID09PSAtMSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdFx0YCR7c05hbWV9OiAnJHtzS2V5fScgbXVzdCBiZSAnJGtpbmQnICcke29Db250ZXh0U2V0dGluZ3NbXCIka2luZFwiXX0nIGJ1dCBpcyAnJHtcblx0XHRcdFx0XHRcdG9Db250ZXh0T2JqZWN0LiRraW5kXG5cdFx0XHRcdFx0fSc6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKG9Db250ZXh0T2JqZWN0Lmhhc093blByb3BlcnR5KFwiJFR5cGVcIikgJiYgb0NvbnRleHRTZXR0aW5ncy4kVHlwZSkge1xuXHRcdFx0Ly8gQ2hlY2sgb25seSAkVHlwZVxuXHRcdFx0aWYgKG9Db250ZXh0U2V0dGluZ3MuJFR5cGUuaW5kZXhPZihvQ29udGV4dE9iamVjdFtcIiRUeXBlXCJdKSA9PT0gLTEpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRcdGAke3NOYW1lfTogJyR7c0tleX0nIG11c3QgYmUgJyRUeXBlJyAnJHtvQ29udGV4dFNldHRpbmdzW1wiJFR5cGVcIl19JyBidXQgaXMgJyR7XG5cdFx0XHRcdFx0XHRvQ29udGV4dE9iamVjdC4kVHlwZVxuXHRcdFx0XHRcdH0nOiAke29Db250ZXh0LmdldFBhdGgoKX1gXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVNYWNyb1NpZ25hdHVyZShzTmFtZTogYW55LCBvTWV0YWRhdGE6IGFueSwgbUNvbnRleHRzOiBhbnksIG9Ob2RlOiBhbnkpIHtcblx0Y29uc3QgYU1ldGFkYXRhQ29udGV4dEtleXMgPSAob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHMgJiYgT2JqZWN0LmtleXMob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHMpKSB8fCBbXSxcblx0XHRhUHJvcGVydGllcyA9IChvTWV0YWRhdGEucHJvcGVydGllcyAmJiBPYmplY3Qua2V5cyhvTWV0YWRhdGEucHJvcGVydGllcykpIHx8IFtdLFxuXHRcdG9BdHRyaWJ1dGVOYW1lczogYW55ID0ge307XG5cblx0Ly8gY29sbGVjdCBhbGwgYXR0cmlidXRlcyB0byBmaW5kIHVuY2hlY2tlZCBwcm9wZXJ0aWVzXG5cdE9iamVjdC5rZXlzKG9Ob2RlLmF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKGlLZXk6IHN0cmluZykge1xuXHRcdGNvbnN0IHNLZXkgPSBvTm9kZS5hdHRyaWJ1dGVzW2lLZXldLm5hbWU7XG5cdFx0b0F0dHJpYnV0ZU5hbWVzW3NLZXldID0gdHJ1ZTtcblx0fSk7XG5cblx0Ly9DaGVjayBtZXRhZGF0YUNvbnRleHRzXG5cdGFNZXRhZGF0YUNvbnRleHRLZXlzLmZvckVhY2goZnVuY3Rpb24gKHNLZXk6IGFueSkge1xuXHRcdGNvbnN0IG9Db250ZXh0U2V0dGluZ3MgPSBvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0c1tzS2V5XTtcblxuXHRcdHZhbGlkYXRlTWFjcm9NZXRhZGF0YUNvbnRleHQoc05hbWUsIG1Db250ZXh0cywgb0NvbnRleHRTZXR0aW5ncywgc0tleSk7XG5cdFx0ZGVsZXRlIG9BdHRyaWJ1dGVOYW1lc1tzS2V5XTtcblx0fSk7XG5cdC8vQ2hlY2sgcHJvcGVydGllc1xuXHRhUHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5OiBhbnkpIHtcblx0XHRjb25zdCBvUHJvcGVydHlTZXR0aW5ncyA9IG9NZXRhZGF0YS5wcm9wZXJ0aWVzW3NLZXldO1xuXHRcdGlmICghb05vZGUuaGFzQXR0cmlidXRlKHNLZXkpKSB7XG5cdFx0XHRpZiAob1Byb3BlcnR5U2V0dGluZ3MucmVxdWlyZWQgJiYgIW9Qcm9wZXJ0eVNldHRpbmdzLmhhc093blByb3BlcnR5KFwiZGVmYXVsdFZhbHVlXCIpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgJHtzTmFtZX06IGAgKyBgUmVxdWlyZWQgcHJvcGVydHkgJyR7c0tleX0nIGlzIG1pc3NpbmdgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVsZXRlIG9BdHRyaWJ1dGVOYW1lc1tzS2V5XTtcblx0XHR9XG5cdH0pO1xuXG5cdC8vIFVuY2hlY2tlZCBwcm9wZXJ0aWVzXG5cdE9iamVjdC5rZXlzKG9BdHRyaWJ1dGVOYW1lcykuZm9yRWFjaChmdW5jdGlvbiAoc0tleTogc3RyaW5nKSB7XG5cdFx0Ly8gbm8gY2hlY2sgZm9yIHByb3BlcnRpZXMgd2hpY2ggc3RhcnQgd2l0aCB1bmRlcnNjb3JlIFwiX1wiIG9yIGNvbnRhaW4gYSBjb2xvbiBcIjpcIiAoZGlmZmVyZW50IG5hbWVzcGFjZSksIGUuZy4geG1sbnM6dHJhY2UsIHRyYWNlOm1hY3JvSUQsIHVuaXR0ZXN0OmlkXG5cdFx0aWYgKHNLZXkuaW5kZXhPZihcIjpcIikgPCAwICYmICFzS2V5LnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSkge1xuXHRcdFx0TG9nLndhcm5pbmcoYFVuY2hlY2tlZCBwYXJhbWV0ZXI6ICR7c05hbWV9OiAke3NLZXl9YCwgdW5kZWZpbmVkLCBMT0dHRVJfU0NPUEUpO1xuXHRcdH1cblx0fSk7XG59XG5cbmNvbnN0IFNBUF9VSV9DT1JFX0VMRU1FTlQgPSBcInNhcC51aS5jb3JlLkVsZW1lbnRcIjtcblxuY29uc3QgU0FQX1VJX01PREVMX0NPTlRFWFQgPSBcInNhcC51aS5tb2RlbC5Db250ZXh0XCI7XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IHRoZSBtZXRhZGF0YSBmb3IgdGhlIGJ1aWxkaW5nIGJsb2NrIGFyZSBwcm9wZXJseSBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEgVGhlIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGlucHV0XG4gKiBAcGFyYW0gaXNPcGVuIFdoZXRoZXIgdGhlIGJ1aWxkaW5nIGJsb2NrIGlzIG9wZW4gb3Igbm90XG4gKiBAcmV0dXJucyBBIHNldCBvZiBjb21wbGV0ZWQgbWV0YWRhdGEgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuICovXG5mdW5jdGlvbiBwcmVwYXJlTWV0YWRhdGEoYnVpbGRpbmdCbG9ja01ldGFkYXRhPzogQnVpbGRpbmdCbG9ja01ldGFkYXRhLCBpc09wZW4gPSBmYWxzZSk6IFJlc29sdmVkQnVpbGRpbmdCbG9ja01ldGFkYXRhIHtcblx0aWYgKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YSkge1xuXHRcdGNvbnN0IG9Qcm9wZXJ0aWVzOiBhbnkgPSB7fTtcblx0XHRjb25zdCBvQWdncmVnYXRpb25zOiBhbnkgPSB7XG5cdFx0XHRcImRlcGVuZGVudHNcIjoge1xuXHRcdFx0XHR0eXBlOiBTQVBfVUlfQ09SRV9FTEVNRU5UXG5cdFx0XHR9LFxuXHRcdFx0XCJjdXN0b21EYXRhXCI6IHtcblx0XHRcdFx0dHlwZTogU0FQX1VJX0NPUkVfRUxFTUVOVFxuXHRcdFx0fVxuXHRcdH07XG5cdFx0Y29uc3Qgb01ldGFkYXRhQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb24+ID0ge307XG5cdFx0bGV0IGZvdW5kRGVmYXVsdEFnZ3JlZ2F0aW9uO1xuXHRcdE9iamVjdC5rZXlzKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzKS5mb3JFYWNoKGZ1bmN0aW9uIChzUHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcblx0XHRcdGlmIChidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllc1tzUHJvcGVydHlOYW1lXS50eXBlICE9PSBTQVBfVUlfTU9ERUxfQ09OVEVYVCkge1xuXHRcdFx0XHRvUHJvcGVydGllc1tzUHJvcGVydHlOYW1lXSA9IGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzW3NQcm9wZXJ0eU5hbWVdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b01ldGFkYXRhQ29udGV4dHNbc1Byb3BlcnR5TmFtZV0gPSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllc1tzUHJvcGVydHlOYW1lXTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHQvLyBNZXJnZSBldmVudHMgaW50byBwcm9wZXJ0aWVzIGFzIHRoZXkgYXJlIGhhbmRsZWQgaWRlbnRpY2FsbHlcblx0XHRpZiAoYnVpbGRpbmdCbG9ja01ldGFkYXRhLmV2ZW50cyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRPYmplY3Qua2V5cyhidWlsZGluZ0Jsb2NrTWV0YWRhdGEuZXZlbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChzRXZlbnROYW1lOiBzdHJpbmcpIHtcblx0XHRcdFx0b1Byb3BlcnRpZXNbc0V2ZW50TmFtZV0gPSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEuZXZlbnRzW3NFdmVudE5hbWVdO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGlmIChidWlsZGluZ0Jsb2NrTWV0YWRhdGEuYWdncmVnYXRpb25zICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdE9iamVjdC5rZXlzKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5hZ2dyZWdhdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKHNQcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRvQWdncmVnYXRpb25zW3NQcm9wZXJ0eU5hbWVdID0gYnVpbGRpbmdCbG9ja01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1tzUHJvcGVydHlOYW1lXTtcblx0XHRcdFx0aWYgKG9BZ2dyZWdhdGlvbnNbc1Byb3BlcnR5TmFtZV0uaXNEZWZhdWx0KSB7XG5cdFx0XHRcdFx0Zm91bmREZWZhdWx0QWdncmVnYXRpb24gPSBzUHJvcGVydHlOYW1lO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdHByb3BlcnRpZXM6IG9Qcm9wZXJ0aWVzLFxuXHRcdFx0YWdncmVnYXRpb25zOiBvQWdncmVnYXRpb25zLFxuXHRcdFx0ZGVmYXVsdEFnZ3JlZ2F0aW9uOiBmb3VuZERlZmF1bHRBZ2dyZWdhdGlvbixcblx0XHRcdG1ldGFkYXRhQ29udGV4dHM6IG9NZXRhZGF0YUNvbnRleHRzLFxuXHRcdFx0aXNPcGVuOiBpc09wZW5cblx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB7XG5cdFx0XHRtZXRhZGF0YUNvbnRleHRzOiB7fSxcblx0XHRcdGFnZ3JlZ2F0aW9uczoge1xuXHRcdFx0XHRcImRlcGVuZGVudHNcIjoge1xuXHRcdFx0XHRcdHR5cGU6IFNBUF9VSV9DT1JFX0VMRU1FTlRcblx0XHRcdFx0fSxcblx0XHRcdFx0XCJjdXN0b21EYXRhXCI6IHtcblx0XHRcdFx0XHR0eXBlOiBTQVBfVUlfQ09SRV9FTEVNRU5UXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRwcm9wZXJ0aWVzOiB7fSxcblx0XHRcdGlzT3BlbjogaXNPcGVuXG5cdFx0fTtcblx0fVxufVxuXG4vKipcbiAqIENoZWNrcyB0aGUgYWJzb2x1dGUgb3IgY29udGV4dCBwYXRocyBhbmQgcmV0dXJucyBhbiBhcHByb3ByaWF0ZSBNZXRhQ29udGV4dC5cbiAqXG4gKiBAcGFyYW0gb1NldHRpbmdzIEFkZGl0aW9uYWwgc2V0dGluZ3NcbiAqIEBwYXJhbSBzQXR0cmlidXRlVmFsdWUgVGhlIGF0dHJpYnV0ZSB2YWx1ZVxuICogQHJldHVybnMge01ldGFEYXRhQ29udGV4dH0gVGhlIG1ldGEgZGF0YSBjb250ZXh0IG9iamVjdFxuICovXG5mdW5jdGlvbiBfY2hlY2tBYnNvbHV0ZUFuZENvbnRleHRQYXRocyhvU2V0dGluZ3M6IGFueSwgc0F0dHJpYnV0ZVZhbHVlOiBzdHJpbmcpOiBNZXRhRGF0YUNvbnRleHQge1xuXHRsZXQgc01ldGFQYXRoOiBzdHJpbmc7XG5cdGlmIChzQXR0cmlidXRlVmFsdWUgJiYgc0F0dHJpYnV0ZVZhbHVlLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG5cdFx0Ly8gYWJzb2x1dGUgcGF0aCAtIHdlIGp1c3QgdXNlIHRoaXMgb25lXG5cdFx0c01ldGFQYXRoID0gc0F0dHJpYnV0ZVZhbHVlO1xuXHR9IGVsc2Uge1xuXHRcdGxldCBzQ29udGV4dFBhdGggPSBvU2V0dGluZ3MuY3VycmVudENvbnRleHRQYXRoLmdldFBhdGgoKTtcblx0XHRpZiAoIXNDb250ZXh0UGF0aC5lbmRzV2l0aChcIi9cIikpIHtcblx0XHRcdHNDb250ZXh0UGF0aCArPSBcIi9cIjtcblx0XHR9XG5cdFx0c01ldGFQYXRoID0gc0NvbnRleHRQYXRoICsgc0F0dHJpYnV0ZVZhbHVlO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0bW9kZWw6IFwibWV0YU1vZGVsXCIsXG5cdFx0cGF0aDogc01ldGFQYXRoXG5cdH07XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaGVscHMgdG8gY3JlYXRlIHRoZSBtZXRhZGF0YSBjb250ZXh0IGluIGNhc2UgaXQgaXMgbm90IHlldCBhdmFpbGFibGUgaW4gdGhlIHN0b3JlLlxuICpcbiAqIEBwYXJhbSBvU2V0dGluZ3MgQWRkaXRpb25hbCBzZXR0aW5nc1xuICogQHBhcmFtIHNBdHRyaWJ1dGVOYW1lIFRoZSBhdHRyaWJ1dGUgbmFtZVxuICogQHBhcmFtIHNBdHRyaWJ1dGVWYWx1ZSBUaGUgYXR0cmlidXRlIHZhbHVlXG4gKiBAcmV0dXJucyB7TWV0YURhdGFDb250ZXh0fSBUaGUgbWV0YSBkYXRhIGNvbnRleHQgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIF9jcmVhdGVJbml0aWFsTWV0YWRhdGFDb250ZXh0KG9TZXR0aW5nczogYW55LCBzQXR0cmlidXRlTmFtZTogc3RyaW5nLCBzQXR0cmlidXRlVmFsdWU6IHN0cmluZyk6IE1ldGFEYXRhQ29udGV4dCB7XG5cdGxldCByZXR1cm5Db250ZXh0OiBNZXRhRGF0YUNvbnRleHQ7XG5cdGlmIChzQXR0cmlidXRlVmFsdWUuc3RhcnRzV2l0aChcIi91aWQtLVwiKSkge1xuXHRcdGNvbnN0IG9EYXRhID0gbXlTdG9yZVtzQXR0cmlidXRlVmFsdWVdO1xuXHRcdG9TZXR0aW5ncy5tb2RlbHMuY29udmVydGVyQ29udGV4dC5zZXRQcm9wZXJ0eShzQXR0cmlidXRlVmFsdWUsIG9EYXRhKTtcblx0XHRyZXR1cm5Db250ZXh0ID0ge1xuXHRcdFx0bW9kZWw6IFwiY29udmVydGVyQ29udGV4dFwiLFxuXHRcdFx0cGF0aDogc0F0dHJpYnV0ZVZhbHVlXG5cdFx0fTtcblx0XHRkZWxldGUgbXlTdG9yZVtzQXR0cmlidXRlVmFsdWVdO1xuXHR9IGVsc2UgaWYgKChzQXR0cmlidXRlTmFtZSA9PT0gXCJtZXRhUGF0aFwiICYmIG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGgpIHx8IHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIpIHtcblx0XHRyZXR1cm5Db250ZXh0ID0gX2NoZWNrQWJzb2x1dGVBbmRDb250ZXh0UGF0aHMob1NldHRpbmdzLCBzQXR0cmlidXRlVmFsdWUpO1xuXHR9IGVsc2UgaWYgKHNBdHRyaWJ1dGVWYWx1ZSAmJiBzQXR0cmlidXRlVmFsdWUuc3RhcnRzV2l0aChcIi9cIikpIHtcblx0XHQvLyBhYnNvbHV0ZSBwYXRoIC0gd2UganVzdCB1c2UgdGhpcyBvbmVcblx0XHRyZXR1cm5Db250ZXh0ID0ge1xuXHRcdFx0bW9kZWw6IFwibWV0YU1vZGVsXCIsXG5cdFx0XHRwYXRoOiBzQXR0cmlidXRlVmFsdWVcblx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybkNvbnRleHQgPSB7XG5cdFx0XHRtb2RlbDogXCJtZXRhTW9kZWxcIixcblx0XHRcdHBhdGg6IG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuZW50aXR5U2V0ID8gb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5lbnRpdHlTZXQuZ2V0UGF0aChzQXR0cmlidXRlVmFsdWUpIDogc0F0dHJpYnV0ZVZhbHVlXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gcmV0dXJuQ29udGV4dDtcbn1cblxuZnVuY3Rpb24gX2dldE1ldGFkYXRhQ29udGV4dChcblx0b1NldHRpbmdzOiBhbnksXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRzQXR0cmlidXRlTmFtZTogc3RyaW5nLFxuXHRvVmlzaXRvcjogSUNhbGxiYWNrLFxuXHRiRG9Ob3RSZXNvbHZlOiBib29sZWFuLFxuXHRpc09wZW46IGJvb2xlYW5cbikge1xuXHRsZXQgb01ldGFkYXRhQ29udGV4dDogTWV0YURhdGFDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRpZiAoIWJEb05vdFJlc29sdmUgJiYgb05vZGUuaGFzQXR0cmlidXRlKHNBdHRyaWJ1dGVOYW1lKSkge1xuXHRcdGNvbnN0IHNBdHRyaWJ1dGVWYWx1ZSA9IG9Ob2RlLmdldEF0dHJpYnV0ZShzQXR0cmlidXRlTmFtZSkgYXMgc3RyaW5nO1xuXHRcdG9NZXRhZGF0YUNvbnRleHQgPSBCaW5kaW5nUGFyc2VyLmNvbXBsZXhQYXJzZXIoc0F0dHJpYnV0ZVZhbHVlKTtcblx0XHRpZiAoIW9NZXRhZGF0YUNvbnRleHQpIHtcblx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSBfY3JlYXRlSW5pdGlhbE1ldGFkYXRhQ29udGV4dChvU2V0dGluZ3MsIHNBdHRyaWJ1dGVOYW1lLCBzQXR0cmlidXRlVmFsdWUpO1xuXHRcdH1cblx0fSBlbHNlIGlmIChvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmhhc093blByb3BlcnR5KHNBdHRyaWJ1dGVOYW1lKSkge1xuXHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRtb2RlbDogc0F0dHJpYnV0ZU5hbWUsXG5cdFx0XHRwYXRoOiBcIlwiXG5cdFx0fTtcblx0fSBlbHNlIGlmIChpc09wZW4pIHtcblx0XHR0cnkge1xuXHRcdFx0aWYgKG9WaXNpdG9yLmdldENvbnRleHQoYCR7c0F0dHJpYnV0ZU5hbWV9PmApKSB7XG5cdFx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRcdFx0bW9kZWw6IHNBdHRyaWJ1dGVOYW1lLFxuXHRcdFx0XHRcdHBhdGg6IFwiXCJcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb01ldGFkYXRhQ29udGV4dDtcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgaW5jb21pbmcgWE1MIG5vZGUgYW5kIHRyeSB0byByZXNvbHZlIHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgdGhlcmUuXG4gKlxuICogQHBhcmFtIG9NZXRhZGF0YSBUaGUgbWV0YWRhdGEgZm9yIHRoZSBidWlsZGluZyBibG9ja1xuICogQHBhcmFtIG9Ob2RlIFRoZSBYTUwgbm9kZSB0byBwYXJzZVxuICogQHBhcmFtIGlzUHVibGljIFdoZXRoZXIgdGhlIGJ1aWxkaW5nIGJsb2NrIGlzIHVzZWQgaW4gYSBwdWJsaWMgY29udGV4dCBvciBub3RcbiAqIEBwYXJhbSBvVmlzaXRvciBUaGUgdmlzaXRvciBpbnN0YW5jZVxuICogQHBhcmFtIGFwaVZlcnNpb24gVGhlIEFQSSB2ZXJzaW9uIG9mIHRoZSBidWlsZGluZyBibG9ja1xuICovXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzUHJvcGVydGllcyhcblx0b01ldGFkYXRhOiBSZXNvbHZlZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0b05vZGU6IEVsZW1lbnQsXG5cdGlzUHVibGljOiBib29sZWFuLFxuXHRvVmlzaXRvcjogSUNhbGxiYWNrLFxuXHRhcGlWZXJzaW9uPzogbnVtYmVyXG4pIHtcblx0Y29uc3Qgb0RlZmluaXRpb25Qcm9wZXJ0aWVzID0gb01ldGFkYXRhLnByb3BlcnRpZXM7XG5cblx0Ly8gUmV0cmlldmUgcHJvcGVydGllcyB2YWx1ZXNcblx0Y29uc3QgYURlZmluaXRpb25Qcm9wZXJ0aWVzS2V5cyA9IE9iamVjdC5rZXlzKG9EZWZpbml0aW9uUHJvcGVydGllcyk7XG5cblx0Y29uc3QgcHJvcGVydHlWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblx0Zm9yIChjb25zdCBzS2V5VmFsdWUgb2YgYURlZmluaXRpb25Qcm9wZXJ0aWVzS2V5cykge1xuXHRcdGlmIChvRGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS50eXBlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID0gZGVlcENsb25lKG9EZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLmRlZmF1bHRWYWx1ZSB8fCB7fSk7IC8vIFRvIGF2b2lkIHZhbHVlcyBiZWluZyByZXVzZWQgYWNyb3NzIG1hY3Jvc1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID0gb0RlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0uZGVmYXVsdFZhbHVlO1xuXHRcdH1cblx0XHRpZiAob05vZGUuaGFzQXR0cmlidXRlKHNLZXlWYWx1ZSkgJiYgaXNQdWJsaWMgJiYgb0RlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0uaXNQdWJsaWMgPT09IGZhbHNlKSB7XG5cdFx0XHRMb2cuZXJyb3IoYFByb3BlcnR5ICR7c0tleVZhbHVlfSB3YXMgaWdub3JlZCBhcyBpdCBpcyBub3QgaW50ZW5kZWQgZm9yIHB1YmxpYyB1c2FnZWApO1xuXHRcdH0gZWxzZSBpZiAob05vZGUuaGFzQXR0cmlidXRlKHNLZXlWYWx1ZSkpIHtcblx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0QXR0cmlidXRlKG9Ob2RlLCBvTm9kZS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShzS2V5VmFsdWUpIGFzIEF0dHIpO1xuXHRcdFx0bGV0IHZWYWx1ZTogYW55ID0gb05vZGUuZ2V0QXR0cmlidXRlKHNLZXlWYWx1ZSk7XG5cdFx0XHRpZiAodlZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0aWYgKGFwaVZlcnNpb24gPT09IDIgJiYgdHlwZW9mIHZWYWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAhdlZhbHVlLnN0YXJ0c1dpdGgoXCJ7XCIpKSB7XG5cdFx0XHRcdFx0c3dpdGNoIChvRGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS50eXBlKSB7XG5cdFx0XHRcdFx0XHRjYXNlIFwiYm9vbGVhblwiOlxuXHRcdFx0XHRcdFx0XHR2VmFsdWUgPSB2VmFsdWUgPT09IFwidHJ1ZVwiO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJudW1iZXJcIjpcblx0XHRcdFx0XHRcdFx0dlZhbHVlID0gTnVtYmVyKHZWYWx1ZSk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID0gdlZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gcHJvcGVydHlWYWx1ZXM7XG59XG5cbi8qKlxuICogUGFyc2UgdGhlIGluY29taW5nIFhNTCBub2RlIGFuZCB0cnkgdG8gcmVzb2x2ZSB0aGUgYmluZGluZyBjb250ZXh0cyBkZWZpbmVkIGluc2lkZS5cbiAqXG4gKiBAcGFyYW0gb01ldGFkYXRhIFRoZSBtZXRhZGF0YSBmb3IgdGhlIGJ1aWxkaW5nIGJsb2NrXG4gKiBAcGFyYW0gb1NldHRpbmdzIFRoZSBzZXR0aW5ncyBvYmplY3RcbiAqIEBwYXJhbSBvTm9kZSBUaGUgWE1MIG5vZGUgdG8gcGFyc2VcbiAqIEBwYXJhbSBpc1B1YmxpYyBXaGV0aGVyIHRoZSBidWlsZGluZyBibG9jayBpcyB1c2VkIGluIGEgcHVibGljIGNvbnRleHQgb3Igbm90XG4gKiBAcGFyYW0gb1Zpc2l0b3IgVGhlIHZpc2l0b3IgaW5zdGFuY2VcbiAqIEBwYXJhbSBtQ29udGV4dHMgVGhlIGNvbnRleHRzIHRvIGJlIHVzZWRcbiAqIEBwYXJhbSBvTWV0YWRhdGFDb250ZXh0c1x0VGhlIG1ldGFkYXRhIGNvbnRleHRzIHRvIGJlIHVzZWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0NvbnRleHRzKFxuXHRvTWV0YWRhdGE6IFJlc29sdmVkQnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRvU2V0dGluZ3M6IGFueSxcblx0b05vZGU6IEVsZW1lbnQsXG5cdGlzUHVibGljOiBib29sZWFuLFxuXHRvVmlzaXRvcjogSUNhbGxiYWNrLFxuXHRtQ29udGV4dHM6IGFueSxcblx0b01ldGFkYXRhQ29udGV4dHM6IGFueVxuKSB7XG5cdG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGggPSBvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmNvbnRleHRQYXRoO1xuXHRjb25zdCBtTWlzc2luZ0NvbnRleHQ6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG5cdGNvbnN0IHByb3BlcnR5VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cdGNvbnN0IG9EZWZpbml0aW9uQ29udGV4dHMgPSBvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cztcblx0Y29uc3QgYURlZmluaXRpb25Db250ZXh0c0tleXMgPSBPYmplY3Qua2V5cyhvRGVmaW5pdGlvbkNvbnRleHRzKTtcblx0Ly8gU2luY2UgdGhlIG1ldGFQYXRoIGFuZCBvdGhlciBwcm9wZXJ0eSBjYW4gYmUgcmVsYXRpdmUgdG8gdGhlIGNvbnRleHRQYXRoIHdlIG5lZWQgdG8gZXZhbHVhdGUgdGhlIGN1cnJlbnQgY29udGV4dFBhdGggZmlyc3Rcblx0Y29uc3QgY29udGV4dFBhdGhJbmRleCA9IGFEZWZpbml0aW9uQ29udGV4dHNLZXlzLmluZGV4T2YoXCJjb250ZXh0UGF0aFwiKTtcblx0aWYgKGNvbnRleHRQYXRoSW5kZXggIT09IC0xKSB7XG5cdFx0Ly8gSWYgaXQgaXMgZGVmaW5lZCB3ZSBleHRyYWN0IGl0IGFuZCByZWluc2VydCBpdCBpbiB0aGUgZmlyc3QgcG9zaXRpb24gb2YgdGhlIGFycmF5XG5cdFx0Y29uc3QgY29udGV4dFBhdGhEZWZpbml0aW9uID0gYURlZmluaXRpb25Db250ZXh0c0tleXMuc3BsaWNlKGNvbnRleHRQYXRoSW5kZXgsIDEpO1xuXHRcdGFEZWZpbml0aW9uQ29udGV4dHNLZXlzLnNwbGljZSgwLCAwLCBjb250ZXh0UGF0aERlZmluaXRpb25bMF0pO1xuXHR9XG5cdGZvciAoY29uc3Qgc0F0dHJpYnV0ZU5hbWUgb2YgYURlZmluaXRpb25Db250ZXh0c0tleXMpIHtcblx0XHRjb25zdCBiRG9Ob3RSZXNvbHZlID0gaXNQdWJsaWMgJiYgb0RlZmluaXRpb25Db250ZXh0c1tzQXR0cmlidXRlTmFtZV0uaXNQdWJsaWMgPT09IGZhbHNlICYmIG9Ob2RlLmhhc0F0dHJpYnV0ZShzQXR0cmlidXRlTmFtZSk7XG5cdFx0Y29uc3Qgb01ldGFkYXRhQ29udGV4dCA9IF9nZXRNZXRhZGF0YUNvbnRleHQob1NldHRpbmdzLCBvTm9kZSwgc0F0dHJpYnV0ZU5hbWUsIG9WaXNpdG9yLCBiRG9Ob3RSZXNvbHZlLCBvTWV0YWRhdGEuaXNPcGVuKTtcblx0XHRpZiAob01ldGFkYXRhQ29udGV4dCkge1xuXHRcdFx0b01ldGFkYXRhQ29udGV4dC5uYW1lID0gc0F0dHJpYnV0ZU5hbWU7XG5cdFx0XHRhZGRTaW5nbGVDb250ZXh0KG1Db250ZXh0cywgb1Zpc2l0b3IsIG9NZXRhZGF0YUNvbnRleHQsIG9NZXRhZGF0YUNvbnRleHRzKTtcblx0XHRcdGlmIChcblx0XHRcdFx0KHNBdHRyaWJ1dGVOYW1lID09PSBcImVudGl0eVNldFwiIHx8IHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIpICYmXG5cdFx0XHRcdCFvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmhhc093blByb3BlcnR5KHNBdHRyaWJ1dGVOYW1lKVxuXHRcdFx0KSB7XG5cdFx0XHRcdG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdID0gbUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXTtcblx0XHRcdH1cblx0XHRcdGlmIChzQXR0cmlidXRlTmFtZSA9PT0gXCJjb250ZXh0UGF0aFwiKSB7XG5cdFx0XHRcdG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGggPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fVxuXHRcdFx0cHJvcGVydHlWYWx1ZXNbc0F0dHJpYnV0ZU5hbWVdID0gbUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bU1pc3NpbmdDb250ZXh0W3NBdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7IG1NaXNzaW5nQ29udGV4dCwgcHJvcGVydHlWYWx1ZXM6IHByb3BlcnR5VmFsdWVzIH07XG59XG5mdW5jdGlvbiBwYXJzZUFnZ3JlZ2F0aW9uKG9BZ2dyZWdhdGlvbj86IEVsZW1lbnQpIHtcblx0Y29uc3Qgb091dE9iamVjdHM6IGFueSA9IHt9O1xuXHRpZiAob0FnZ3JlZ2F0aW9uICYmIG9BZ2dyZWdhdGlvbi5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgY2hpbGRyZW4gPSBvQWdncmVnYXRpb24uY2hpbGRyZW47XG5cdFx0Zm9yIChsZXQgY2hpbGRJZHggPSAwOyBjaGlsZElkeCA8IGNoaWxkcmVuLmxlbmd0aDsgY2hpbGRJZHgrKykge1xuXHRcdFx0Y29uc3QgY2hpbGREZWZpbml0aW9uID0gY2hpbGRyZW5bY2hpbGRJZHhdO1xuXHRcdFx0bGV0IGNoaWxkS2V5ID0gY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcImtleVwiKSB8fCBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwiaWRcIik7XG5cdFx0XHRpZiAoY2hpbGRLZXkpIHtcblx0XHRcdFx0Y2hpbGRLZXkgPSBgSW5saW5lWE1MXyR7Y2hpbGRLZXl9YDtcblx0XHRcdFx0Y2hpbGREZWZpbml0aW9uLnNldEF0dHJpYnV0ZShcImtleVwiLCBjaGlsZEtleSk7XG5cdFx0XHRcdG9PdXRPYmplY3RzW2NoaWxkS2V5XSA9IHtcblx0XHRcdFx0XHRrZXk6IGNoaWxkS2V5LFxuXHRcdFx0XHRcdHBvc2l0aW9uOiB7XG5cdFx0XHRcdFx0XHRwbGFjZW1lbnQ6IGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJwbGFjZW1lbnRcIiksXG5cdFx0XHRcdFx0XHRhbmNob3I6IGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJhbmNob3JcIilcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHR5cGU6IFwiU2xvdFwiXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvT3V0T2JqZWN0cztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0NoaWxkcmVuKFxuXHRvTm9kZTogRWxlbWVudCxcblx0b1Zpc2l0b3I6IElDYWxsYmFjayxcblx0b01ldGFkYXRhOiBSZXNvbHZlZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0aXNQdWJsaWM6IGJvb2xlYW4sXG5cdHByb3BlcnR5VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuXHRhcGlWZXJzaW9uPzogbnVtYmVyXG4pIHtcblx0Y29uc3Qgb0FnZ3JlZ2F0aW9uczogYW55ID0ge307XG5cdGlmIChvTm9kZS5maXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCkge1xuXHRcdGxldCBvRmlyc3RFbGVtZW50Q2hpbGQ6IEVsZW1lbnQgfCBudWxsID0gb05vZGUuZmlyc3RFbGVtZW50Q2hpbGQgYXMgRWxlbWVudCB8IG51bGw7XG5cdFx0aWYgKGFwaVZlcnNpb24gPT09IDIpIHtcblx0XHRcdHdoaWxlIChvRmlyc3RFbGVtZW50Q2hpbGQgIT09IG51bGwpIHtcblx0XHRcdFx0Y29uc3Qgc0NoaWxkTmFtZSA9IG9GaXJzdEVsZW1lbnRDaGlsZC5sb2NhbE5hbWU7XG5cdFx0XHRcdGxldCBzQWdncmVnYXRpb25OYW1lID0gc0NoaWxkTmFtZTtcblx0XHRcdFx0aWYgKHNBZ2dyZWdhdGlvbk5hbWVbMF0udG9VcHBlckNhc2UoKSA9PT0gc0FnZ3JlZ2F0aW9uTmFtZVswXSkge1xuXHRcdFx0XHRcdC8vIG5vdCBhIHN1YiBhZ2dyZWdhdGlvbiwgZ28gYmFjayB0byBkZWZhdWx0IEFnZ3JlZ2F0aW9uXG5cdFx0XHRcdFx0c0FnZ3JlZ2F0aW9uTmFtZSA9IG9NZXRhZGF0YS5kZWZhdWx0QWdncmVnYXRpb24gfHwgXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkRlZmluaXRpb24gPSBvTWV0YWRhdGEuYWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdO1xuXHRcdFx0XHRpZiAoYWdncmVnYXRpb25EZWZpbml0aW9uICE9PSB1bmRlZmluZWQgJiYgIWFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5zbG90KSB7XG5cdFx0XHRcdFx0Y29uc3QgcGFyc2VkQWdncmVnYXRpb24gPSBwYXJzZUFnZ3JlZ2F0aW9uKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXSA9IHBhcnNlZEFnZ3JlZ2F0aW9uO1xuXHRcdFx0XHRcdGZvciAoY29uc3QgcGFyc2VkQWdncmVnYXRpb25LZXkgaW4gcGFyc2VkQWdncmVnYXRpb24pIHtcblx0XHRcdFx0XHRcdG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnNbcGFyc2VkQWdncmVnYXRpb25LZXldID0gcGFyc2VkQWdncmVnYXRpb25bcGFyc2VkQWdncmVnYXRpb25LZXldO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRvRmlyc3RFbGVtZW50Q2hpbGQgPSBvRmlyc3RFbGVtZW50Q2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChhcGlWZXJzaW9uICE9PSAyKSB7XG5cdFx0XHQvLyBJZiB0aGVyZSBhcmUgYWdncmVnYXRpb24gd2UgbmVlZCB0byB2aXNpdCB0aGUgY2hpbGROb2RlcyB0byByZXNvbHZlIHRlbXBsYXRpbmcgaW5zdHJ1Y3Rpb25zXG5cdFx0XHRhd2FpdCBvVmlzaXRvci52aXNpdENoaWxkTm9kZXMob05vZGUpO1xuXHRcdH1cblx0XHRvRmlyc3RFbGVtZW50Q2hpbGQgPSBvTm9kZS5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHR3aGlsZSAob0ZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBvTmV4dENoaWxkOiBFbGVtZW50IHwgbnVsbCA9IG9GaXJzdEVsZW1lbnRDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHRjb25zdCBzQ2hpbGROYW1lID0gb0ZpcnN0RWxlbWVudENoaWxkLmxvY2FsTmFtZTtcblx0XHRcdGxldCBzQWdncmVnYXRpb25OYW1lID0gc0NoaWxkTmFtZTtcblx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lWzBdLnRvVXBwZXJDYXNlKCkgPT09IHNBZ2dyZWdhdGlvbk5hbWVbMF0pIHtcblx0XHRcdFx0Ly8gbm90IGEgc3ViIGFnZ3JlZ2F0aW9uLCBnbyBiYWNrIHRvIGRlZmF1bHQgQWdncmVnYXRpb25cblx0XHRcdFx0c0FnZ3JlZ2F0aW9uTmFtZSA9IG9NZXRhZGF0YS5kZWZhdWx0QWdncmVnYXRpb24gfHwgXCJcIjtcblx0XHRcdH1cblx0XHRcdGlmIChcblx0XHRcdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLmFnZ3JlZ2F0aW9ucykuaW5kZXhPZihzQWdncmVnYXRpb25OYW1lKSAhPT0gLTEgJiZcblx0XHRcdFx0KCFpc1B1YmxpYyB8fCBvTWV0YWRhdGEuYWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLmlzUHVibGljID09PSB0cnVlKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGlmIChhcGlWZXJzaW9uID09PSAyKSB7XG5cdFx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25EZWZpbml0aW9uID0gb01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXTtcblx0XHRcdFx0XHRpZiAoIWFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5zbG90ICYmIG9GaXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCAmJiBvRmlyc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXROb2RlKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0XHRsZXQgY2hpbGREZWZpbml0aW9uID0gb0ZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHRcdFx0d2hpbGUgKGNoaWxkRGVmaW5pdGlvbikge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvTmV3Q2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMob05vZGUubmFtZXNwYWNlVVJJLCBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwia2V5XCIpISk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5leHRDaGlsZCA9IGNoaWxkRGVmaW5pdGlvbi5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHRcdFx0XHRcdG9OZXdDaGlsZC5hcHBlbmRDaGlsZChjaGlsZERlZmluaXRpb24pO1xuXHRcdFx0XHRcdFx0XHRvQWdncmVnYXRpb25zW2NoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJrZXlcIikhXSA9IG9OZXdDaGlsZDtcblx0XHRcdFx0XHRcdFx0Y2hpbGREZWZpbml0aW9uLnJlbW92ZUF0dHJpYnV0ZShcImtleVwiKTtcblx0XHRcdFx0XHRcdFx0Y2hpbGREZWZpbml0aW9uID0gbmV4dENoaWxkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYWdncmVnYXRpb25EZWZpbml0aW9uLnNsb3QpIHtcblx0XHRcdFx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lICE9PSBzQ2hpbGROYW1lKSB7XG5cdFx0XHRcdFx0XHRcdGlmICghb0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9OZXdDaGlsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhvTm9kZS5uYW1lc3BhY2VVUkksIHNBZ2dyZWdhdGlvbk5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdG9BZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0gPSBvTmV3Q2hpbGQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXS5hcHBlbmRDaGlsZChvRmlyc3RFbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXSA9IG9GaXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXROb2RlKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tvRmlyc3RFbGVtZW50Q2hpbGQubG9jYWxOYW1lXSA9IG9GaXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChPYmplY3Qua2V5cyhvTWV0YWRhdGEucHJvcGVydGllcykuaW5kZXhPZihzQWdncmVnYXRpb25OYW1lKSAhPT0gLTEpIHtcblx0XHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXROb2RlKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdGlmIChvTWV0YWRhdGEucHJvcGVydGllc1tzQWdncmVnYXRpb25OYW1lXS50eXBlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0Ly8gT2JqZWN0IFR5cGUgcHJvcGVydGllc1xuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NBZ2dyZWdhdGlvbk5hbWVdID0ge307XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBhdHRyaWJ1dGVJbmRleCBvZiBPYmplY3Qua2V5cyhvRmlyc3RFbGVtZW50Q2hpbGQuYXR0cmlidXRlcykpIHtcblx0XHRcdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NBZ2dyZWdhdGlvbk5hbWVdW29GaXJzdEVsZW1lbnRDaGlsZC5hdHRyaWJ1dGVzW2F0dHJpYnV0ZUluZGV4IGFzIGFueV0ubG9jYWxOYW1lXSA9XG5cdFx0XHRcdFx0XHRcdG9GaXJzdEVsZW1lbnRDaGlsZC5hdHRyaWJ1dGVzW2F0dHJpYnV0ZUluZGV4IGFzIGFueV0udmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKG9NZXRhZGF0YS5wcm9wZXJ0aWVzW3NBZ2dyZWdhdGlvbk5hbWVdLnR5cGUgPT09IFwiYXJyYXlcIikge1xuXHRcdFx0XHRcdGlmIChvRmlyc3RFbGVtZW50Q2hpbGQgIT09IG51bGwgJiYgb0ZpcnN0RWxlbWVudENoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdGNvbnN0IGNoaWxkcmVuID0gb0ZpcnN0RWxlbWVudENoaWxkLmNoaWxkcmVuO1xuXHRcdFx0XHRcdFx0Y29uc3Qgb091dE9iamVjdHMgPSBbXTtcblx0XHRcdFx0XHRcdGZvciAobGV0IGNoaWxkSWR4ID0gMDsgY2hpbGRJZHggPCBjaGlsZHJlbi5sZW5ndGg7IGNoaWxkSWR4KyspIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY2hpbGREZWZpbml0aW9uID0gY2hpbGRyZW5bY2hpbGRJZHhdO1xuXHRcdFx0XHRcdFx0XHQvLyBub24ga2V5ZWQgY2hpbGQsIGp1c3QgYWRkIGl0IHRvIHRoZSBhZ2dyZWdhdGlvblxuXHRcdFx0XHRcdFx0XHRjb25zdCBteUNoaWxkOiBhbnkgPSB7fTtcblx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBhdHRyaWJ1dGVJbmRleCBvZiBPYmplY3Qua2V5cyhjaGlsZERlZmluaXRpb24uYXR0cmlidXRlcykpIHtcblx0XHRcdFx0XHRcdFx0XHRteUNoaWxkW2NoaWxkRGVmaW5pdGlvbi5hdHRyaWJ1dGVzW2F0dHJpYnV0ZUluZGV4IGFzIGFueV0ubG9jYWxOYW1lXSA9XG5cdFx0XHRcdFx0XHRcdFx0XHRjaGlsZERlZmluaXRpb24uYXR0cmlidXRlc1thdHRyaWJ1dGVJbmRleCBhcyBhbnldLnZhbHVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdG9PdXRPYmplY3RzLnB1c2gobXlDaGlsZCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQWdncmVnYXRpb25OYW1lXSA9IG9PdXRPYmplY3RzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRvRmlyc3RFbGVtZW50Q2hpbGQgPSBvTmV4dENoaWxkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb0FnZ3JlZ2F0aW9ucztcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1Nsb3RzKFxuXHRvQWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuXHRvTWV0YWRhdGFBZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbkRlZmluaXRpb24+LFxuXHRvTm9kZTogRWxlbWVudCxcblx0cHJvY2Vzc0N1c3RvbURhdGE6IGJvb2xlYW4gPSBmYWxzZVxuKSB7XG5cdGlmIChPYmplY3Qua2V5cyhvQWdncmVnYXRpb25zKS5sZW5ndGggPiAwKSB7XG5cdFx0T2JqZWN0LmtleXMob0FnZ3JlZ2F0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAoc0FnZ3JlZ2F0aW9uTmFtZTogc3RyaW5nKSB7XG5cdFx0XHRjb25zdCBvQWdncmVnYXRpb25FbGVtZW50ID0gb0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXTtcblx0XHRcdGlmIChvTm9kZSAhPT0gbnVsbCAmJiBvTm9kZSAhPT0gdW5kZWZpbmVkICYmIG9BZ2dyZWdhdGlvbkVsZW1lbnQpIHtcblx0XHRcdFx0Ly8gc2xvdHMgY2FuIGhhdmUgOjogYXMga2V5cyB3aGljaCBpcyBub3QgYSB2YWxpZCBhZ2dyZWdhdGlvbiBuYW1lIHRoZXJlZm9yZSByZXBsYWNpbmcgdGhlbVxuXHRcdFx0XHRjb25zdCBvTmV3Q2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMob05vZGUubmFtZXNwYWNlVVJJLCBzQWdncmVnYXRpb25OYW1lLnJlcGxhY2UoLzovZ2ksIFwiX1wiKSk7XG5cdFx0XHRcdGxldCBvRWxlbWVudENoaWxkID0gb0FnZ3JlZ2F0aW9uRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0d2hpbGUgKG9FbGVtZW50Q2hpbGQpIHtcblx0XHRcdFx0XHRjb25zdCBvTmV4dENoaWxkID0gb0VsZW1lbnRDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHRcdFx0b05ld0NoaWxkLmFwcGVuZENoaWxkKG9FbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdG9FbGVtZW50Q2hpbGQgPSBvTmV4dENoaWxkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lICE9PSBcImN1c3RvbURhdGFcIiAmJiBzQWdncmVnYXRpb25OYW1lICE9PSBcImRlcGVuZGVudHNcIikge1xuXHRcdFx0XHRcdGNvbnN0IHNTbG90TmFtZSA9XG5cdFx0XHRcdFx0XHQob01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdICE9PSB1bmRlZmluZWQgJiYgb01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLnNsb3QpIHx8XG5cdFx0XHRcdFx0XHRzQWdncmVnYXRpb25OYW1lO1xuXHRcdFx0XHRcdGNvbnN0IG9UYXJnZXRFbGVtZW50ID0gb05vZGUucXVlcnlTZWxlY3Rvcihgc2xvdFtuYW1lPScke3NTbG90TmFtZX0nXWApO1xuXHRcdFx0XHRcdGlmIChvVGFyZ2V0RWxlbWVudCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0b1RhcmdldEVsZW1lbnQucmVwbGFjZVdpdGgoLi4uKG9OZXdDaGlsZC5jaGlsZHJlbiBhcyBhbnkpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAocHJvY2Vzc0N1c3RvbURhdGEgJiYgb05ld0NoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRvTm9kZS5hcHBlbmRDaGlsZChvTmV3Q2hpbGQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0J1aWxkaW5nQmxvY2soXG5cdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uOiBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbixcblx0b05vZGU6IEVsZW1lbnQsXG5cdG9WaXNpdG9yOiBJQ2FsbGJhY2ssXG5cdGlzUHVibGljID0gZmFsc2Vcbikge1xuXHRjb25zdCBzRnJhZ21lbnROYW1lID0gYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uZnJhZ21lbnQgfHwgYCR7YnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZXNwYWNlfS4ke2J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWV9YDtcblxuXHRjb25zdCBzTmFtZSA9IFwidGhpc1wiO1xuXG5cdGNvbnN0IG1Db250ZXh0czogYW55ID0ge307XG5cdGNvbnN0IG9NZXRhZGF0YUNvbnRleHRzOiBhbnkgPSB7fTtcblx0Y29uc3Qgb1NldHRpbmdzID0gb1Zpc2l0b3IuZ2V0U2V0dGluZ3MoKTtcblx0Ly8gVE9ETyAwMDAxIE1vdmUgdGhpcyBlbHNld2hlcmUgdGhpcyBpcyB3ZWlyZCA6KVxuXHRpZiAob1NldHRpbmdzLm1vZGVsc1tcInNhcC5mZS5pMThuXCJdKSB7XG5cdFx0b1NldHRpbmdzLm1vZGVsc1tcInNhcC5mZS5pMThuXCJdXG5cdFx0XHQuZ2V0UmVzb3VyY2VCdW5kbGUoKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9SZXNvdXJjZUJ1bmRsZTogYW55KSB7XG5cdFx0XHRcdFJlc291cmNlTW9kZWwuc2V0QXBwbGljYXRpb25JMThuQnVuZGxlKG9SZXNvdXJjZUJ1bmRsZSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihlcnJvcik7XG5cdFx0XHR9KTtcblx0fVxuXHRjb25zdCBvTWV0YWRhdGEgPSBwcmVwYXJlTWV0YWRhdGEoYnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubWV0YWRhdGEsIGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmlzT3Blbik7XG5cblx0Ly9JbmplY3Qgc3RvcmFnZSBmb3IgbWFjcm9zXG5cdGlmICghb1NldHRpbmdzW3NGcmFnbWVudE5hbWVdKSB7XG5cdFx0b1NldHRpbmdzW3NGcmFnbWVudE5hbWVdID0ge307XG5cdH1cblxuXHQvLyBGaXJzdCBvZiBhbGwgd2UgbmVlZCB0byB2aXNpdCB0aGUgYXR0cmlidXRlcyB0byByZXNvbHZlIHRoZSBwcm9wZXJ0aWVzIGFuZCB0aGUgbWV0YWRhdGEgY29udGV4dHNcblx0bGV0IHByb3BlcnR5VmFsdWVzID0gYXdhaXQgcHJvY2Vzc1Byb3BlcnRpZXMob01ldGFkYXRhLCBvTm9kZSwgaXNQdWJsaWMsIG9WaXNpdG9yLCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uKTtcblxuXHRjb25zdCB7IG1NaXNzaW5nQ29udGV4dCwgcHJvcGVydHlWYWx1ZXM6IGV4dHJhUHJvcGVydHlWYWx1ZXMgfSA9IGF3YWl0IHByb2Nlc3NDb250ZXh0cyhcblx0XHRvTWV0YWRhdGEsXG5cdFx0b1NldHRpbmdzLFxuXHRcdG9Ob2RlLFxuXHRcdGlzUHVibGljLFxuXHRcdG9WaXNpdG9yLFxuXHRcdG1Db250ZXh0cyxcblx0XHRvTWV0YWRhdGFDb250ZXh0c1xuXHQpO1xuXHRwcm9wZXJ0eVZhbHVlcyA9IE9iamVjdC5hc3NpZ24ocHJvcGVydHlWYWx1ZXMsIGV4dHJhUHJvcGVydHlWYWx1ZXMpO1xuXHRjb25zdCBpbml0aWFsS2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnR5VmFsdWVzKTtcblx0dHJ5IHtcblx0XHQvLyBBZ2dyZWdhdGlvbiBhbmQgY29tcGxleCB0eXBlIHN1cHBvcnRcblx0XHRjb25zdCBvQWdncmVnYXRpb25zID0gYXdhaXQgcHJvY2Vzc0NoaWxkcmVuKFxuXHRcdFx0b05vZGUsXG5cdFx0XHRvVmlzaXRvcixcblx0XHRcdG9NZXRhZGF0YSxcblx0XHRcdGlzUHVibGljLFxuXHRcdFx0cHJvcGVydHlWYWx1ZXMsXG5cdFx0XHRidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uXG5cdFx0KTtcblx0XHRsZXQgb0luc3RhbmNlOiBhbnk7XG5cdFx0bGV0IG9Db250cm9sQ29uZmlnID0ge307XG5cblx0XHRpZiAob1NldHRpbmdzLm1vZGVscy52aWV3RGF0YSkge1xuXHRcdFx0Ly8gT25seSB1c2VkIGluIHRoZSBGaWVsZCBtYWNybyBhbmQgZXZlbiB0aGVuIG1heWJlIG5vdCByZWFsbHkgdXNlZnVsXG5cdFx0XHRvQ29udHJvbENvbmZpZyA9IG9TZXR0aW5ncy5tb2RlbHMudmlld0RhdGEuZ2V0UHJvcGVydHkoXCIvY29udHJvbENvbmZpZ3VyYXRpb25cIik7XG5cdFx0fVxuXHRcdGxldCBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyA9IHByb3BlcnR5VmFsdWVzO1xuXHRcdGlmIChpc1YxTWFjcm9EZWYoYnVpbGRpbmdCbG9ja0RlZmluaXRpb24pICYmIGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmNyZWF0ZSkge1xuXHRcdFx0cHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMgPSBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5jcmVhdGUuY2FsbChcblx0XHRcdFx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb24sXG5cdFx0XHRcdHByb3BlcnR5VmFsdWVzLFxuXHRcdFx0XHRvQ29udHJvbENvbmZpZyxcblx0XHRcdFx0b1NldHRpbmdzLFxuXHRcdFx0XHRvQWdncmVnYXRpb25zLFxuXHRcdFx0XHRpc1B1YmxpY1xuXHRcdFx0KTtcblx0XHRcdE9iamVjdC5rZXlzKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChzTWV0YWRhdGFOYW1lOiBzdHJpbmcpIHtcblx0XHRcdFx0aWYgKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzW3NNZXRhZGF0YU5hbWVdLmNvbXB1dGVkID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0bUNvbnRleHRzW3NNZXRhZGF0YU5hbWVdID0gcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXNbc01ldGFkYXRhTmFtZV07XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0T2JqZWN0LmtleXMobU1pc3NpbmdDb250ZXh0KS5mb3JFYWNoKGZ1bmN0aW9uIChzQ29udGV4dE5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRpZiAocHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMuaGFzT3duUHJvcGVydHkoc0NvbnRleHROYW1lKSkge1xuXHRcdFx0XHRcdG1Db250ZXh0c1tzQ29udGV4dE5hbWVdID0gcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXNbc0NvbnRleHROYW1lXTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIGlmIChidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uID09PSAyKSB7XG5cdFx0XHRPYmplY3Qua2V5cyhwcm9wZXJ0eVZhbHVlcykuZm9yRWFjaCgocHJvcE5hbWUpID0+IHtcblx0XHRcdFx0Y29uc3Qgb0RhdGEgPSBwcm9wZXJ0eVZhbHVlc1twcm9wTmFtZV07XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRvRGF0YSAmJlxuXHRcdFx0XHRcdG9EYXRhLmlzQSAmJlxuXHRcdFx0XHRcdG9EYXRhLmlzQShTQVBfVUlfTU9ERUxfQ09OVEVYVCkgJiZcblx0XHRcdFx0XHQhb0RhdGEuZ2V0TW9kZWwoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNZXRhTW9kZWxcIilcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbcHJvcE5hbWVdID0gb0RhdGEuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgQnVpbGRpbmdCbG9ja0NsYXNzID0gYnVpbGRpbmdCbG9ja0RlZmluaXRpb24gYXMgdHlwZW9mIEJ1aWxkaW5nQmxvY2tCYXNlO1xuXHRcdFx0cHJvcGVydHlWYWx1ZXMuaXNQdWJsaWMgPSBpc1B1YmxpYztcblxuXHRcdFx0b0luc3RhbmNlID0gbmV3IEJ1aWxkaW5nQmxvY2tDbGFzcyhcblx0XHRcdFx0eyAuLi5wcm9wZXJ0eVZhbHVlcywgLi4ub0FnZ3JlZ2F0aW9ucyB9LFxuXHRcdFx0XHRvQ29udHJvbENvbmZpZyxcblx0XHRcdFx0b1NldHRpbmdzXG5cdFx0XHRcdC8qLCBvQ29udHJvbENvbmZpZywgb1NldHRpbmdzLCBvQWdncmVnYXRpb25zLCBpc1B1YmxpYyovXG5cdFx0XHQpO1xuXHRcdFx0cHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMgPSBvSW5zdGFuY2UuZ2V0UHJvcGVydGllcygpO1xuXHRcdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHMpLmZvckVhY2goZnVuY3Rpb24gKHNDb250ZXh0TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdGlmIChwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcy5oYXNPd25Qcm9wZXJ0eShzQ29udGV4dE5hbWUpKSB7XG5cdFx0XHRcdFx0bGV0IHRhcmdldE9iamVjdCA9IHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzW3NDb250ZXh0TmFtZV07XG5cdFx0XHRcdFx0aWYgKHR5cGVvZiB0YXJnZXRPYmplY3QgPT09IFwib2JqZWN0XCIgJiYgIXRhcmdldE9iamVjdC5nZXRPYmplY3QpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHNBdHRyaWJ1dGVWYWx1ZSA9IHN0b3JlVmFsdWUodGFyZ2V0T2JqZWN0KTtcblx0XHRcdFx0XHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9IGAke3NBdHRyaWJ1dGVWYWx1ZX1gO1xuXHRcdFx0XHRcdFx0b1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LnNldFByb3BlcnR5KHNDb250ZXh0UGF0aCwgdGFyZ2V0T2JqZWN0KTtcblx0XHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IG9TZXR0aW5ncy5tb2RlbHMuY29udmVydGVyQ29udGV4dC5jcmVhdGVCaW5kaW5nQ29udGV4dChzQ29udGV4dFBhdGgpO1xuXHRcdFx0XHRcdFx0ZGVsZXRlIG15U3RvcmVbc0F0dHJpYnV0ZVZhbHVlXTtcblx0XHRcdFx0XHRcdG1Db250ZXh0c1tzQ29udGV4dE5hbWVdID0gdGFyZ2V0T2JqZWN0O1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIW1Db250ZXh0cy5oYXNPd25Qcm9wZXJ0eShzQ29udGV4dE5hbWUpICYmIHRhcmdldE9iamVjdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRtQ29udGV4dHNbc0NvbnRleHROYW1lXSA9IHRhcmdldE9iamVjdDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRjb25zdCBvQXR0cmlidXRlc01vZGVsOiBKU09OTW9kZWwgPSBuZXcgQXR0cmlidXRlTW9kZWwob05vZGUsIHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzLCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbik7XG5cdFx0bUNvbnRleHRzW3NOYW1lXSA9IG9BdHRyaWJ1dGVzTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpO1xuXHRcdGxldCBvUHJldmlvdXNNYWNyb0luZm86IGFueTtcblxuXHRcdC8vIEtlZXAgdHJhY2tcblx0XHRpZiAoVHJhY2VJbmZvLmlzVHJhY2VJbmZvQWN0aXZlKCkpIHtcblx0XHRcdGNvbnN0IG9UcmFjZUluZm8gPSBUcmFjZUluZm8udHJhY2VNYWNyb0NhbGxzKHNGcmFnbWVudE5hbWUsIG9NZXRhZGF0YSwgbUNvbnRleHRzLCBvTm9kZSwgb1Zpc2l0b3IpO1xuXHRcdFx0aWYgKG9UcmFjZUluZm8pIHtcblx0XHRcdFx0b1ByZXZpb3VzTWFjcm9JbmZvID0gb1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXTtcblx0XHRcdFx0b1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXSA9IG9UcmFjZUluZm8ubWFjcm9JbmZvO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR2YWxpZGF0ZU1hY3JvU2lnbmF0dXJlKHNGcmFnbWVudE5hbWUsIG9NZXRhZGF0YSwgbUNvbnRleHRzLCBvTm9kZSk7XG5cblx0XHRjb25zdCBvQ29udGV4dFZpc2l0b3IgPSBvVmlzaXRvci53aXRoKFxuXHRcdFx0bUNvbnRleHRzLFxuXHRcdFx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb24uaXNPcGVuICE9PSB1bmRlZmluZWQgPyAhYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uaXNPcGVuIDogdHJ1ZVxuXHRcdCk7XG5cdFx0Y29uc3Qgb1BhcmVudCA9IG9Ob2RlLnBhcmVudE5vZGU7XG5cblx0XHRsZXQgaUNoaWxkSW5kZXg6IG51bWJlcjtcblx0XHRsZXQgb1Byb21pc2U7XG5cdFx0bGV0IHByb2Nlc3NDdXN0b21EYXRhID0gdHJ1ZTtcblx0XHRpZiAob1BhcmVudCkge1xuXHRcdFx0aUNoaWxkSW5kZXggPSBBcnJheS5mcm9tKG9QYXJlbnQuY2hpbGRyZW4pLmluZGV4T2Yob05vZGUpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoaXNWMU1hY3JvRGVmKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uKSAmJiBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5nZXRUZW1wbGF0ZSkgfHxcblx0XHRcdFx0KGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb24gPT09IDIgJiYgIWJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmZyYWdtZW50KVxuXHRcdFx0KSB7XG5cdFx0XHRcdGxldCBvVGVtcGxhdGU7XG5cdFx0XHRcdGxldCBhZGREZWZhdWx0TmFtZXNwYWNlID0gZmFsc2U7XG5cdFx0XHRcdGlmIChidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uID09PSAyKSB7XG5cdFx0XHRcdFx0b1RlbXBsYXRlID0gb0luc3RhbmNlLmdldFRlbXBsYXRlKCk7XG5cdFx0XHRcdFx0aWYgKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmlzUnVudGltZSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBteVN0b3JlS2V5IGluIG15U3RvcmUpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0RhdGEgPSBteVN0b3JlW215U3RvcmVLZXldO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzQ29udGV4dFBhdGggPSBgJHtteVN0b3JlS2V5fWA7XG5cdFx0XHRcdFx0XHRcdG9TZXR0aW5ncy5tb2RlbHMuY29udmVydGVyQ29udGV4dC5zZXRQcm9wZXJ0eShzQ29udGV4dFBhdGgsIG9EYXRhKTtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIG15U3RvcmVbbXlTdG9yZUtleV07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGFkZERlZmF1bHROYW1lc3BhY2UgPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmdldFRlbXBsYXRlKSB7XG5cdFx0XHRcdFx0b1RlbXBsYXRlID0gYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uZ2V0VGVtcGxhdGUocHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IGhhc0Vycm9yID0gXCJcIjtcblx0XHRcdFx0aWYgKG9UZW1wbGF0ZSkge1xuXHRcdFx0XHRcdGlmICghb1RlbXBsYXRlLmZpcnN0RWxlbWVudENoaWxkKSB7XG5cdFx0XHRcdFx0XHRvVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyhvVGVtcGxhdGUsIGFkZERlZmF1bHROYW1lc3BhY2UpO1xuXHRcdFx0XHRcdFx0Ly8gRm9yIHNhZmV0eSBwdXJwb3NlIHdlIHRyeSB0byBkZXRlY3QgdHJhaWxpbmcgdGV4dCBpbiBiZXR3ZWVuIFhNTCBUYWdzXG5cdFx0XHRcdFx0XHRjb25zdCBpdGVyID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKG9UZW1wbGF0ZSwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xuXHRcdFx0XHRcdFx0bGV0IHRleHRub2RlID0gaXRlci5uZXh0Tm9kZSgpO1xuXHRcdFx0XHRcdFx0d2hpbGUgKHRleHRub2RlKSB7XG5cdFx0XHRcdFx0XHRcdGlmICh0ZXh0bm9kZS50ZXh0Q29udGVudCAmJiB0ZXh0bm9kZS50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdGhhc0Vycm9yID0gdGV4dG5vZGUudGV4dENvbnRlbnQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGV4dG5vZGUgPSBpdGVyLm5leHROb2RlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG9UZW1wbGF0ZS5sb2NhbE5hbWUgPT09IFwicGFyc2VyZXJyb3JcIikge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgYSBwYXJzZWVycm9yIHdoaWxlIHByb2Nlc3NpbmcgdGhlIFhNTCBpdCBtZWFucyB0aGUgWE1MIGl0c2VsZiBpcyBtYWxmb3JtZWQsIGFzIHN1Y2ggd2UgcmVydW4gdGhlIHRlbXBsYXRlIHByb2Nlc3Ncblx0XHRcdFx0XHRcdC8vIFNldHRpbmcgaXNUcmFjZU1vZGUgdHJ1ZSB3aWxsIG1ha2UgaXQgc28gdGhhdCBlYWNoIHhtbGAgZXhwcmVzc2lvbiBpcyBjaGVja2VkIGZvciB2YWxpZGl0eSBmcm9tIFhNTCBwZXJzcGVjdGl2ZVxuXHRcdFx0XHRcdFx0Ly8gSWYgYW4gZXJyb3IgaXMgZm91bmQgaXQncyByZXR1cm5lZCBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgZnJhZ21lbnRcblx0XHRcdFx0XHRcdExvZy5lcnJvcihgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke2J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWV9YCk7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRpc1RyYWNlTW9kZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdG9UZW1wbGF0ZSA9IG9JbnN0YW5jZT8uZ2V0VGVtcGxhdGVcblx0XHRcdFx0XHRcdFx0XHQ/IG9JbnN0YW5jZS5nZXRUZW1wbGF0ZSgpXG5cdFx0XHRcdFx0XHRcdFx0OiAoYnVpbGRpbmdCbG9ja0RlZmluaXRpb24gYXMgYW55KS5nZXRUZW1wbGF0ZShwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyk7XG5cdFx0XHRcdFx0XHRcdG9UZW1wbGF0ZSA9IHBhcnNlWE1MU3RyaW5nKG9UZW1wbGF0ZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0XHRpc1RyYWNlTW9kZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoaGFzRXJyb3IubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgdHJhaWxpbmcgdGV4dCB3ZSBjcmVhdGUgYSBzdGFuZGFyZCBlcnJvciBhbmQgZGlzcGxheSBpdC5cblx0XHRcdFx0XHRcdExvZy5lcnJvcihgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke2J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWV9YCk7XG5cdFx0XHRcdFx0XHRjb25zdCBvRXJyb3JUZXh0ID0gY3JlYXRlRXJyb3JYTUwoXG5cdFx0XHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdFx0XHRgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke2J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWV9YCxcblx0XHRcdFx0XHRcdFx0XHRgVHJhaWxpbmcgdGV4dCB3YXMgZm91bmQgaW4gdGhlIFhNTDogJHtoYXNFcnJvcn1gXG5cdFx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XHRcdG9UZW1wbGF0ZS5vdXRlckhUTUxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRvVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyhvRXJyb3JUZXh0LCB0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b05vZGUucmVwbGFjZVdpdGgob1RlbXBsYXRlKTtcblx0XHRcdFx0XHRvTm9kZSA9IG9QYXJlbnQuY2hpbGRyZW5baUNoaWxkSW5kZXhdO1xuXHRcdFx0XHRcdHByb2Nlc3NTbG90cyhvQWdncmVnYXRpb25zLCBvTWV0YWRhdGEuYWdncmVnYXRpb25zLCBvTm9kZSwgcHJvY2Vzc0N1c3RvbURhdGEpO1xuXHRcdFx0XHRcdHByb2Nlc3NDdXN0b21EYXRhID0gZmFsc2U7XG5cdFx0XHRcdFx0b1Byb21pc2UgPSBvQ29udGV4dFZpc2l0b3IudmlzaXROb2RlKG9Ob2RlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvTm9kZS5yZW1vdmUoKTtcblx0XHRcdFx0XHRvUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvUHJvbWlzZSA9IG9Db250ZXh0VmlzaXRvci5pbnNlcnRGcmFnbWVudChzRnJhZ21lbnROYW1lLCBvTm9kZSk7XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IG9Qcm9taXNlO1xuXHRcdFx0Y29uc3Qgb01hY3JvRWxlbWVudCA9IG9QYXJlbnQuY2hpbGRyZW5baUNoaWxkSW5kZXhdO1xuXHRcdFx0cHJvY2Vzc1Nsb3RzKG9BZ2dyZWdhdGlvbnMsIG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnMsIG9NYWNyb0VsZW1lbnQsIHByb2Nlc3NDdXN0b21EYXRhKTtcblx0XHRcdGlmIChvTWFjcm9FbGVtZW50ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29uc3Qgb1JlbWFpbmluZ1Nsb3RzID0gb01hY3JvRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwic2xvdFwiKTtcblx0XHRcdFx0b1JlbWFpbmluZ1Nsb3RzLmZvckVhY2goZnVuY3Rpb24gKG9TbG90RWxlbWVudDogYW55KSB7XG5cdFx0XHRcdFx0b1Nsb3RFbGVtZW50LnJlbW92ZSgpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKG9QcmV2aW91c01hY3JvSW5mbykge1xuXHRcdFx0Ly9yZXN0b3JlIG1hY3JvIGluZm8gaWYgYXZhaWxhYmxlXG5cdFx0XHRvU2V0dGluZ3NbXCJfbWFjcm9JbmZvXCJdID0gb1ByZXZpb3VzTWFjcm9JbmZvO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkZWxldGUgb1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXTtcblx0XHR9XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBJbiBjYXNlIHRoZXJlIGlzIGEgZ2VuZXJpYyBlcnJvciAodXN1YWxseSBjb2RlIGVycm9yKSwgd2UgcmV0cmlldmUgdGhlIGN1cnJlbnQgY29udGV4dCBpbmZvcm1hdGlvbiBhbmQgY3JlYXRlIGEgZGVkaWNhdGVkIGVycm9yIG1lc3NhZ2Vcblx0XHRjb25zdCB0cmFjZURldGFpbHMgPSB7XG5cdFx0XHRpbml0aWFsUHJvcGVydGllczoge30gYXMgYW55LFxuXHRcdFx0cmVzb2x2ZWRQcm9wZXJ0aWVzOiB7fSBhcyBhbnksXG5cdFx0XHRtaXNzaW5nQ29udGV4dHM6IG1NaXNzaW5nQ29udGV4dFxuXHRcdH07XG5cdFx0Zm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgaW5pdGlhbEtleXMpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eU5hbWVdO1xuXHRcdFx0aWYgKHByb3BlcnR5VmFsdWUgJiYgcHJvcGVydHlWYWx1ZS5pc0EgJiYgcHJvcGVydHlWYWx1ZS5pc0EoU0FQX1VJX01PREVMX0NPTlRFWFQpKSB7XG5cdFx0XHRcdHRyYWNlRGV0YWlscy5pbml0aWFsUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0ge1xuXHRcdFx0XHRcdHBhdGg6IHByb3BlcnR5VmFsdWUuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdHZhbHVlOiBwcm9wZXJ0eVZhbHVlLmdldE9iamVjdCgpXG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0cmFjZURldGFpbHMuaW5pdGlhbFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHByb3BlcnR5VmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgcHJvcGVydHlOYW1lIGluIHByb3BlcnR5VmFsdWVzKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZXNbcHJvcGVydHlOYW1lXTtcblx0XHRcdGlmICghaW5pdGlhbEtleXMuaW5jbHVkZXMocHJvcGVydHlOYW1lKSkge1xuXHRcdFx0XHRpZiAocHJvcGVydHlWYWx1ZSAmJiBwcm9wZXJ0eVZhbHVlLmlzQSAmJiBwcm9wZXJ0eVZhbHVlLmlzQShTQVBfVUlfTU9ERUxfQ09OVEVYVCkpIHtcblx0XHRcdFx0XHR0cmFjZURldGFpbHMucmVzb2x2ZWRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB7XG5cdFx0XHRcdFx0XHRwYXRoOiBwcm9wZXJ0eVZhbHVlLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdHZhbHVlOiBwcm9wZXJ0eVZhbHVlLmdldE9iamVjdCgpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0cmFjZURldGFpbHMucmVzb2x2ZWRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IGVycm9yQW55ID0gZSBhcyBhbnk7XG5cdFx0TG9nLmVycm9yKGVycm9yQW55LCBlcnJvckFueSk7XG5cdFx0Y29uc3Qgb0Vycm9yID0gY3JlYXRlRXJyb3JYTUwoXG5cdFx0XHRbYEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgYnVpbGRpbmcgYmxvY2sgJHtidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lfWBdLFxuXHRcdFx0b05vZGUub3V0ZXJIVE1MLFxuXHRcdFx0dHJhY2VEZXRhaWxzLFxuXHRcdFx0ZXJyb3JBbnkuc3RhY2tcblx0XHQpO1xuXHRcdGNvbnN0IG9UZW1wbGF0ZSA9IHBhcnNlWE1MU3RyaW5nKG9FcnJvciwgdHJ1ZSk7XG5cdFx0b05vZGUucmVwbGFjZVdpdGgob1RlbXBsYXRlIGFzIGFueSk7XG5cdH1cbn1cbmZ1bmN0aW9uIGFkZFNpbmdsZUNvbnRleHQobUNvbnRleHRzOiBhbnksIG9WaXNpdG9yOiBhbnksIG9DdHg6IGFueSwgb01ldGFkYXRhQ29udGV4dHM6IGFueSkge1xuXHRjb25zdCBzS2V5ID0gb0N0eC5uYW1lIHx8IG9DdHgubW9kZWwgfHwgdW5kZWZpbmVkO1xuXG5cdGlmIChvTWV0YWRhdGFDb250ZXh0c1tzS2V5XSkge1xuXHRcdHJldHVybjsgLy8gZG8gbm90IGFkZCB0d2ljZVxuXHR9XG5cdHRyeSB7XG5cdFx0bGV0IHNDb250ZXh0UGF0aCA9IG9DdHgucGF0aDtcblx0XHRpZiAob0N0eC5tb2RlbCAhPSBudWxsKSB7XG5cdFx0XHRzQ29udGV4dFBhdGggPSBgJHtvQ3R4Lm1vZGVsfT4ke3NDb250ZXh0UGF0aH1gO1xuXHRcdH1cblx0XHRjb25zdCBtU2V0dGluZyA9IG9WaXNpdG9yLmdldFNldHRpbmdzKCk7XG5cdFx0aWYgKG9DdHgubW9kZWwgPT09IFwiY29udmVydGVyQ29udGV4dFwiICYmIG9DdHgucGF0aC5sZW5ndGggPiAwKSB7XG5cdFx0XHRtQ29udGV4dHNbc0tleV0gPSBtU2V0dGluZy5tb2RlbHNbb0N0eC5tb2RlbF0uZ2V0Q29udGV4dChvQ3R4LnBhdGgsIG1TZXR0aW5nLmJpbmRpbmdDb250ZXh0c1tvQ3R4Lm1vZGVsXSk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH0gZWxzZSBpZiAoIW1TZXR0aW5nLmJpbmRpbmdDb250ZXh0c1tvQ3R4Lm1vZGVsXSAmJiBtU2V0dGluZy5tb2RlbHNbb0N0eC5tb2RlbF0pIHtcblx0XHRcdG1Db250ZXh0c1tzS2V5XSA9IG1TZXR0aW5nLm1vZGVsc1tvQ3R4Lm1vZGVsXS5nZXRDb250ZXh0KG9DdHgucGF0aCk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtQ29udGV4dHNbc0tleV0gPSBvVmlzaXRvci5nZXRDb250ZXh0KHNDb250ZXh0UGF0aCk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH1cblxuXHRcdG9NZXRhZGF0YUNvbnRleHRzW3NLZXldID0gbUNvbnRleHRzW3NLZXldOyAvLyBtYWtlIGl0IGF2YWlsYWJsZSBpbnNpZGUgbWV0YWRhdGFDb250ZXh0cyBKU09OIG9iamVjdFxuXHR9IGNhdGNoIChleCkge1xuXHRcdC8vY29uc29sZS5lcnJvcihleCk7XG5cdFx0Ly8gaWdub3JlIHRoZSBjb250ZXh0IGFzIHRoaXMgY2FuIG9ubHkgYmUgdGhlIGNhc2UgaWYgdGhlIG1vZGVsIGlzIG5vdCByZWFkeSwgaS5lLiBub3QgYSBwcmVwcm9jZXNzaW5nIG1vZGVsIGJ1dCBtYXliZSBhIG1vZGVsIGZvclxuXHRcdC8vIHByb3ZpZGluZyBhZnRlcndhcmRzXG5cdFx0Ly8gVE9ETyAwMDAyIG5vdCB5ZXQgaW1wbGVtZW50ZWRcblx0XHQvL21Db250ZXh0c1tcIl8kZXJyb3JcIl0ub01vZGVsLnNldFByb3BlcnR5KFwiL1wiICsgc0tleSwgZXgpO1xuXHR9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBidWlsZGluZyBibG9jayBkZWZpbml0aW9uIHRvIGJlIHVzZWQgaW5zaWRlIHRoZSB4bWwgdGVtcGxhdGUgcHJvY2Vzc29yLlxuICpcbiAqIEBwYXJhbSBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiBUaGUgYnVpbGRpbmcgYmxvY2sgZGVmaW5pdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJCdWlsZGluZ0Jsb2NrKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uOiBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbik6IHZvaWQge1xuXHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdChvTm9kZTogRWxlbWVudCwgb1Zpc2l0b3I6IElDYWxsYmFjaykgPT4gcHJvY2Vzc0J1aWxkaW5nQmxvY2soYnVpbGRpbmdCbG9ja0RlZmluaXRpb24sIG9Ob2RlLCBvVmlzaXRvciksXG5cdFx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZXNwYWNlLFxuXHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLnhtbFRhZyB8fCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lXG5cdCk7XG5cdGlmIChidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5wdWJsaWNOYW1lc3BhY2UpIHtcblx0XHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdFx0KG9Ob2RlOiBFbGVtZW50LCBvVmlzaXRvcjogSUNhbGxiYWNrKSA9PiBwcm9jZXNzQnVpbGRpbmdCbG9jayhidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiwgb05vZGUsIG9WaXNpdG9yLCB0cnVlKSxcblx0XHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLnB1YmxpY05hbWVzcGFjZSxcblx0XHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLnhtbFRhZyB8fCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lXG5cdFx0KTtcblx0fVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFcnJvclhNTChlcnJvck1lc3NhZ2VzOiBzdHJpbmdbXSwgeG1sRnJhZ21lbnQ6IHN0cmluZywgYWRkaXRpb25hbERhdGE/OiBvYmplY3QsIHN0YWNrPzogc3RyaW5nKTogc3RyaW5nIHtcblx0Y29uc3QgZXJyb3JMYWJlbHMgPSBlcnJvck1lc3NhZ2VzLm1hcCgoZXJyb3JNZXNzYWdlKSA9PiB4bWxgPG06TGFiZWwgdGV4dD1cIiR7ZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUoZXJyb3JNZXNzYWdlKX1cIi8+YCk7XG5cdGxldCBlcnJvclN0YWNrID0gXCJcIjtcblx0aWYgKHN0YWNrKSB7XG5cdFx0Y29uc3Qgc3RhY2tGb3JtYXR0ZWQgPSBidG9hKGA8cHJlPiR7c3RhY2t9PC9wcmU+YCk7XG5cdFx0ZXJyb3JTdGFjayA9IHhtbGA8bTpGb3JtYXR0ZWRUZXh0IGh0bWxUZXh0PVwiJHtgez0gQkJGLmJhc2U2NERlY29kZSgnJHtzdGFja0Zvcm1hdHRlZH0nKSB9YH1cIiAvPmA7XG5cdH1cblx0bGV0IGFkZGl0aW9uYWxUZXh0ID0gXCJcIjtcblx0aWYgKGFkZGl0aW9uYWxEYXRhKSB7XG5cdFx0YWRkaXRpb25hbFRleHQgPSB4bWxgPG06VkJveD5cblx0XHRcdFx0XHRcdDxtOkxhYmVsIHRleHQ9XCJUcmFjZSBJbmZvXCIvPlxuXHRcdFx0XHRcdFx0PGNvZGU6Q29kZUVkaXRvciB0eXBlPVwianNvblwiICB2YWx1ZT1cIiR7YHs9IEJCRi5iYXNlNjREZWNvZGUoJyR7YnRvYShKU09OLnN0cmluZ2lmeShhZGRpdGlvbmFsRGF0YSwgbnVsbCwgNCkpfScpIH1gfVwiIGhlaWdodD1cIjMwMHB4XCIgLz5cblx0XHRcdFx0XHQ8L206VkJveD5gO1xuXHR9XG5cdHJldHVybiB4bWxgPG06VkJveCB4bWxuczptPVwic2FwLm1cIiB4bWxuczpjb2RlPVwic2FwLnVpLmNvZGVlZGl0b3JcIiBjb3JlOnJlcXVpcmU9XCJ7QkJGOidzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy9CdWlsZGluZ0Jsb2NrRm9ybWF0dGVyJ31cIj5cblx0XHRcdFx0JHtlcnJvckxhYmVsc31cblx0XHRcdFx0JHtlcnJvclN0YWNrfVxuXHRcdFx0XHQ8Z3JpZDpDU1NHcmlkIGdyaWRUZW1wbGF0ZVJvd3M9XCJmclwiIGdyaWRUZW1wbGF0ZUNvbHVtbnM9XCJyZXBlYXQoMiwxZnIpXCIgZ3JpZEdhcD1cIjFyZW1cIiB4bWxuczpncmlkPVwic2FwLnVpLmxheW91dC5jc3NncmlkXCIgPlxuXHRcdFx0XHRcdDxtOlZCb3g+XG5cdFx0XHRcdFx0XHQ8bTpMYWJlbCB0ZXh0PVwiSG93IHRoZSBidWlsZGluZyBibG9jayB3YXMgY2FsbGVkXCIvPlxuXHRcdFx0XHRcdFx0PGNvZGU6Q29kZUVkaXRvciB0eXBlPVwieG1sXCIgdmFsdWU9XCIke2B7PSBCQkYuYmFzZTY0RGVjb2RlKCcke2J0b2EoeG1sRnJhZ21lbnQucmVwbGFjZUFsbChcIiZndDtcIiwgXCI+XCIpKX0nKSB9YH1cIiBoZWlnaHQ9XCIzMDBweFwiIC8+XG5cdFx0XHRcdFx0PC9tOlZCb3g+XG5cdFx0XHRcdFx0JHthZGRpdGlvbmFsVGV4dH1cblx0XHRcdFx0PC9ncmlkOkNTU0dyaWQ+XG5cdFx0XHQ8L206VkJveD5gO1xufVxuXG5jb25zdCBteVN0b3JlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5mdW5jdGlvbiBzdG9yZVZhbHVlKHZhbHVlczogYW55KSB7XG5cdGNvbnN0IHByb3BlcnR5VUlEID0gYC91aWQtLSR7dWlkKCl9YDtcblx0bXlTdG9yZVtwcm9wZXJ0eVVJRF0gPSB2YWx1ZXM7XG5cdHJldHVybiBwcm9wZXJ0eVVJRDtcbn1cblxuLyoqXG4gKiBQYXJzZSBhbiBYTUwgc3RyaW5nIGFuZCByZXR1cm4gdGhlIGFzc29jaWF0ZWQgZG9jdW1lbnQuXG4gKlxuICogQHBhcmFtIHhtbFN0cmluZyBUaGUgeG1sIHN0cmluZ1xuICogQHBhcmFtIGFkZERlZmF1bHROYW1lc3BhY2VzIFdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBhZGQgZGVmYXVsdCBuYW1lc3BhY2VcbiAqIEByZXR1cm5zIFRoZSBYTUwgZG9jdW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVhNTFN0cmluZyh4bWxTdHJpbmc6IHN0cmluZywgYWRkRGVmYXVsdE5hbWVzcGFjZXMgPSBmYWxzZSk6IEVsZW1lbnQge1xuXHRpZiAoYWRkRGVmYXVsdE5hbWVzcGFjZXMpIHtcblx0XHR4bWxTdHJpbmcgPSBgPHRlbXBsYXRlXG5cdFx0XHRcdFx0XHR4bWxuczp0ZW1wbGF0ZT1cImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS50ZW1wbGF0ZS8xXCJcblx0XHRcdFx0XHRcdHhtbG5zOm09XCJzYXAubVwiXG5cdFx0XHRcdFx0XHR4bWxuczptYWNyb3M9XCJzYXAuZmUubWFjcm9zXCJcblx0XHRcdFx0XHRcdHhtbG5zOmNvcmU9XCJzYXAudWkuY29yZVwiXG5cdFx0XHRcdFx0XHR4bWxuczptZGM9XCJzYXAudWkubWRjXCJcblx0XHRcdFx0XHRcdHhtbG5zOmN1c3RvbURhdGE9XCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUuQ3VzdG9tRGF0YS8xXCI+JHt4bWxTdHJpbmd9PC90ZW1wbGF0ZT5gO1xuXHR9XG5cdGNvbnN0IHhtbERvY3VtZW50ID0gRE9NUGFyc2VySW5zdGFuY2UucGFyc2VGcm9tU3RyaW5nKHhtbFN0cmluZywgXCJ0ZXh0L3htbFwiKTtcblx0bGV0IG91dHB1dCA9IHhtbERvY3VtZW50LmZpcnN0RWxlbWVudENoaWxkO1xuXHR3aGlsZSAob3V0cHV0Py5sb2NhbE5hbWUgPT09IFwidGVtcGxhdGVcIikge1xuXHRcdG91dHB1dCA9IG91dHB1dC5maXJzdEVsZW1lbnRDaGlsZDtcblx0fVxuXHRyZXR1cm4gb3V0cHV0IGFzIEVsZW1lbnQ7XG59XG5cbi8qKlxuICogRXNjYXBlIGFuIFhNTCBhdHRyaWJ1dGUgdmFsdWUuXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gZXNjYXBlLlxuICogQHJldHVybnMgVGhlIGVzY2FwZWQgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUodmFsdWU/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRyZXR1cm4gdmFsdWU/LnJlcGxhY2UoLyYvZywgXCImYW1wO1wiKS5yZXBsYWNlKC88L2csIFwiJmx0O1wiKS5yZXBsYWNlKC9cIi9nLCBcIiZxdW90O1wiKS5yZXBsYWNlKC8nL2csIFwiJmFwb3M7XCIpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJJblRyYWNlTW9kZShvdXRTdHI6IHN0cmluZykge1xuXHRjb25zdCB4bWxSZXN1bHQgPSBwYXJzZVhNTFN0cmluZyhvdXRTdHIsIHRydWUpO1xuXHRpZiAoeG1sUmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgeG1sUmVzdWx0Py5sb2NhbE5hbWUgPT09IFwicGFyc2VyZXJyb3JcIikge1xuXHRcdGNvbnN0IGVycm9yTWVzc2FnZSA9ICh4bWxSZXN1bHQgYXMgYW55KS5pbm5lclRleHQgfHwgKHhtbFJlc3VsdCBhcyBhbnkpLmlubmVySFRNTDtcblx0XHRyZXR1cm4gY3JlYXRlRXJyb3JYTUwoW2Vycm9yTWVzc2FnZS5zcGxpdChcIlxcblwiKVswXV0sIG91dFN0cik7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIG91dFN0cjtcblx0fVxufVxuLyoqXG4gKiBDcmVhdGUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRlbXBsYXRlIGxpdGVyYWwgd2hpbGUgaGFuZGxpbmcgc3BlY2lhbCBvYmplY3QgY2FzZS5cbiAqXG4gKiBAcGFyYW0gc3RyaW5ncyBUaGUgc3RyaW5nIHBhcnRzIG9mIHRoZSB0ZW1wbGF0ZSBsaXRlcmFsXG4gKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgcGFydCBvZiB0aGUgdGVtcGxhdGUgbGl0ZXJhbFxuICogQHJldHVybnMgVGhlIFhNTCBzdHJpbmcgZG9jdW1lbnQgcmVwcmVzZW50aW5nIHRoZSBzdHJpbmcgdGhhdCB3YXMgdXNlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IHhtbCA9IChzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSwgLi4udmFsdWVzOiBhbnlbXSkgPT4ge1xuXHRsZXQgb3V0U3RyID0gXCJcIjtcblx0bGV0IGk7XG5cdGZvciAoaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRvdXRTdHIgKz0gc3RyaW5nc1tpXTtcblxuXHRcdC8vIEhhbmRsZSB0aGUgZGlmZmVyZW50IGNhc2Ugb2Ygb2JqZWN0LCBpZiBpdCdzIGFuIGFycmF5IHdlIGpvaW4gdGhlbSwgaWYgaXQncyBhIGJpbmRpbmcgZXhwcmVzc2lvbiAoZGV0ZXJtaW5lZCBieSBfdHlwZSkgdGhlbiB3ZSBjb21waWxlIGl0LlxuXHRcdGNvbnN0IHZhbHVlID0gdmFsdWVzW2ldO1xuXG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA+IDAgJiYgdHlwZW9mIHZhbHVlWzBdID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRvdXRTdHIgKz0gdmFsdWUuZmxhdCg1KS5qb2luKFwiXFxuXCIpLnRyaW0oKTtcblx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA+IDAgJiYgdHlwZW9mIHZhbHVlWzBdID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdG91dFN0ciArPSB2YWx1ZS5tYXAoKHZhbHVlZm4pID0+IHZhbHVlZm4oKSkuam9pbihcIlxcblwiKTtcblx0XHR9IGVsc2UgaWYgKHZhbHVlPy5fdHlwZSkge1xuXHRcdFx0Y29uc3QgY29tcGlsZWRFeHByZXNzaW9uID0gY29tcGlsZUV4cHJlc3Npb24odmFsdWUpO1xuXHRcdFx0b3V0U3RyICs9IGVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKGNvbXBpbGVkRXhwcmVzc2lvbik7XG5cdFx0fSBlbHNlIGlmICh2YWx1ZT8uZ2V0VGVtcGxhdGUpIHtcblx0XHRcdG91dFN0ciArPSB2YWx1ZS5nZXRUZW1wbGF0ZSgpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0XHRvdXRTdHIgKz0gXCJ7dGhpcz51bmRlZmluZWRWYWx1ZX1cIjtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRvdXRTdHIgKz0gdmFsdWUoKTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuXHRcdFx0aWYgKHZhbHVlLmlzQT8uKFwic2FwLnVpLm1vZGVsLkNvbnRleHRcIikpIHtcblx0XHRcdFx0b3V0U3RyICs9IHZhbHVlLmdldFBhdGgoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5VUlkID0gc3RvcmVWYWx1ZSh2YWx1ZSk7XG5cdFx0XHRcdG91dFN0ciArPSBgJHtwcm9wZXJ0eVVJZH1gO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmICF2YWx1ZS5zdGFydHNXaXRoKFwiPFwiKSAmJiAhdmFsdWUuc3RhcnRzV2l0aChcIiZsdDtcIikpIHtcblx0XHRcdG91dFN0ciArPSBlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZSh2YWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG91dFN0ciArPSB2YWx1ZTtcblx0XHR9XG5cdH1cblx0b3V0U3RyICs9IHN0cmluZ3NbaV07XG5cdG91dFN0ciA9IG91dFN0ci50cmltKCk7XG5cdGlmIChpc1RyYWNlTW9kZSkge1xuXHRcdHJldHVybiByZW5kZXJJblRyYWNlTW9kZShvdXRTdHIpO1xuXHR9XG5cdHJldHVybiBvdXRTdHI7XG59O1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7O0VBd0tPLGdCQUFnQkEsTUFBaEIsRUFBd0JDLElBQXhCLEVBQThCQyxLQUE5QixFQUFxQztJQUMzQyxJQUFJLE9BQU9GLE1BQU0saUJBQWIsS0FBbUMsVUFBdkMsRUFBbUQ7TUFDbEQs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
|
|
1295
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0YXJnZXQiLCJib2R5IiwiY2hlY2siLCJpdGVyYXRvciIsInN0ZXAiLCJwYWN0IiwicmVqZWN0IiwiX2N5Y2xlIiwicmVzdWx0IiwibmV4dCIsImRvbmUiLCJ2YWx1ZSIsInRoZW4iLCJ2IiwiYmluZCIsImUiLCJyZXR1cm4iLCJfZml4dXAiLCJUeXBlRXJyb3IiLCJ2YWx1ZXMiLCJpIiwibGVuZ3RoIiwicHVzaCIsImFycmF5IiwiU3ltYm9sIiwic3RhdGUiLCJzIiwibyIsIm9ic2VydmVyIiwicHJvdG90eXBlIiwib25GdWxmaWxsZWQiLCJvblJlamVjdGVkIiwiY2FsbGJhY2siLCJfdGhpcyIsInRoZW5hYmxlIiwidGVzdCIsInVwZGF0ZSIsInN0YWdlIiwic2hvdWxkQ29udGludWUiLCJ1cGRhdGVWYWx1ZSIsIl9yZXN1bWVBZnRlclRlc3QiLCJfcmVzdW1lQWZ0ZXJCb2R5IiwiX3Jlc3VtZUFmdGVyVXBkYXRlIiwicmVjb3ZlciIsInByb2Nlc3NCdWlsZGluZ0Jsb2NrIiwiYnVpbGRpbmdCbG9ja0RlZmluaXRpb24iLCJvTm9kZSIsIm9WaXNpdG9yIiwiaXNQdWJsaWMiLCJzRnJhZ21lbnROYW1lIiwiZnJhZ21lbnQiLCJuYW1lc3BhY2UiLCJ4bWxUYWciLCJuYW1lIiwic05hbWUiLCJtQ29udGV4dHMiLCJvTWV0YWRhdGFDb250ZXh0cyIsIm9TZXR0aW5ncyIsImdldFNldHRpbmdzIiwibW9kZWxzIiwiZ2V0UmVzb3VyY2VCdW5kbGUiLCJvUmVzb3VyY2VCdW5kbGUiLCJSZXNvdXJjZU1vZGVsIiwic2V0QXBwbGljYXRpb25JMThuQnVuZGxlIiwiY2F0Y2giLCJlcnJvciIsIkxvZyIsIm9NZXRhZGF0YSIsInByZXBhcmVNZXRhZGF0YSIsIm1ldGFkYXRhIiwiaXNPcGVuIiwiYXBpVmVyc2lvbiIsInByb2Nlc3NQcm9wZXJ0aWVzIiwicHJvcGVydHlWYWx1ZXMiLCJwcm9jZXNzQ29udGV4dHMiLCJtTWlzc2luZ0NvbnRleHQiLCJleHRyYVByb3BlcnR5VmFsdWVzIiwiT2JqZWN0IiwiYXNzaWduIiwiaW5pdGlhbEtleXMiLCJrZXlzIiwicHJvY2Vzc0NoaWxkcmVuIiwib0FnZ3JlZ2F0aW9ucyIsIm9QcmV2aW91c01hY3JvSW5mbyIsIm9JbnN0YW5jZSIsIm9Db250cm9sQ29uZmlnIiwidmlld0RhdGEiLCJnZXRQcm9wZXJ0eSIsInByb2Nlc3NlZFByb3BlcnR5VmFsdWVzIiwiaXNWMU1hY3JvRGVmIiwiY3JlYXRlIiwiY2FsbCIsIm1ldGFkYXRhQ29udGV4dHMiLCJmb3JFYWNoIiwic01ldGFkYXRhTmFtZSIsImNvbXB1dGVkIiwic0NvbnRleHROYW1lIiwiaGFzT3duUHJvcGVydHkiLCJwcm9wTmFtZSIsIm9EYXRhIiwib3JpZ2luYWxEZWZpbml0aW9uIiwicHJvcGVydGllcyIsInZhbGlkYXRlIiwiaXNBIiwiU0FQX1VJX01PREVMX0NPTlRFWFQiLCJnZXRNb2RlbCIsImdldE9iamVjdCIsIkJ1aWxkaW5nQmxvY2tDbGFzcyIsImdldFByb3BlcnRpZXMiLCJ0YXJnZXRPYmplY3QiLCJpc0NvbnRleHQiLCJzQXR0cmlidXRlVmFsdWUiLCJzdG9yZVZhbHVlIiwic0NvbnRleHRQYXRoIiwiY29udmVydGVyQ29udGV4dCIsInNldFByb3BlcnR5IiwibmV3Q29udGV4dCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwibXlTdG9yZSIsInVuZGVmaW5lZCIsIm9BdHRyaWJ1dGVzTW9kZWwiLCJBdHRyaWJ1dGVNb2RlbCIsIlRyYWNlSW5mbyIsImlzVHJhY2VJbmZvQWN0aXZlIiwib1RyYWNlSW5mbyIsInRyYWNlTWFjcm9DYWxscyIsIm1hY3JvSW5mbyIsInZhbGlkYXRlTWFjcm9TaWduYXR1cmUiLCJvQ29udGV4dFZpc2l0b3IiLCJ3aXRoIiwib1BhcmVudCIsInBhcmVudE5vZGUiLCJpQ2hpbGRJbmRleCIsIm9Qcm9taXNlIiwicHJvY2Vzc0N1c3RvbURhdGEiLCJBcnJheSIsImZyb20iLCJjaGlsZHJlbiIsImluZGV4T2YiLCJnZXRUZW1wbGF0ZSIsInRlbXBsYXRlU3RyaW5nIiwiYWRkRGVmYXVsdE5hbWVzcGFjZSIsImlzUnVudGltZSIsIm15U3RvcmVLZXkiLCJoYXNFcnJvciIsImhhc1BhcnNlRXJyb3IiLCJwYXJzZWRUZW1wbGF0ZSIsInBhcnNlWE1MU3RyaW5nIiwiZWxlbWVudCIsIml0ZXIiLCJkb2N1bWVudCIsImNyZWF0ZU5vZGVJdGVyYXRvciIsIk5vZGVGaWx0ZXIiLCJTSE9XX1RFWFQiLCJ0ZXh0bm9kZSIsIm5leHROb2RlIiwibG9jYWxOYW1lIiwidGV4dENvbnRlbnQiLCJ0cmltIiwiaXNUcmFjZU1vZGUiLCJpbml0aWFsVGVtcGxhdGUiLCJvRXJyb3JUZXh0IiwiY3JlYXRlRXJyb3JYTUwiLCJtYXAiLCJ0ZW1wbGF0ZSIsIm91dGVySFRNTCIsImpvaW4iLCJyZXBsYWNlV2l0aCIsInByb2Nlc3NTbG90cyIsImFnZ3JlZ2F0aW9ucyIsInZpc2l0Tm9kZSIsInJlbW92ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwiaW5zZXJ0RnJhZ21lbnQiLCJvTWFjcm9FbGVtZW50Iiwib1JlbWFpbmluZ1Nsb3RzIiwicXVlcnlTZWxlY3RvckFsbCIsIm9TbG90RWxlbWVudCIsInRyYWNlRGV0YWlscyIsImluaXRpYWxQcm9wZXJ0aWVzIiwicmVzb2x2ZWRQcm9wZXJ0aWVzIiwibWlzc2luZ0NvbnRleHRzIiwicHJvcGVydHlOYW1lIiwicHJvcGVydHlWYWx1ZSIsInBhdGgiLCJnZXRQYXRoIiwiaW5jbHVkZXMiLCJvRXJyb3IiLCJzdGFjayIsIm9UZW1wbGF0ZSIsImZpcnN0RWxlbWVudENoaWxkIiwib0ZpcnN0RWxlbWVudENoaWxkIiwib05leHRDaGlsZCIsIm5leHRFbGVtZW50U2libGluZyIsInNDaGlsZE5hbWUiLCJzQWdncmVnYXRpb25OYW1lIiwidG9VcHBlckNhc2UiLCJkZWZhdWx0QWdncmVnYXRpb24iLCJhZ2dyZWdhdGlvbkRlZmluaXRpb24iLCJzbG90IiwiY2hpbGREZWZpbml0aW9uIiwibmV4dENoaWxkIiwiaGFzVmlydHVhbE5vZGUiLCJjaGlsZFdyYXBwZXIiLCJjcmVhdGVFbGVtZW50TlMiLCJuYW1lc3BhY2VVUkkiLCJnZXRBdHRyaWJ1dGUiLCJhcHBlbmRDaGlsZCIsInJlbW92ZUF0dHJpYnV0ZSIsIm9OZXdDaGlsZCIsInR5cGUiLCJhZ2dyZWdhdGlvblByb3BlcnR5VmFsdWVzIiwiYXR0cmlidXRlTmFtZXMiLCJnZXRBdHRyaWJ1dGVOYW1lcyIsImF0dHJpYnV0ZU5hbWUiLCJjaGlsZEluZGV4Iiwic3ViQ2hpbGQiLCJzdWJPYmplY3RLZXkiLCJzdWJPYmplY3QiLCJzdWJDaGlsZEF0dHJpYnV0ZU5hbWVzIiwic3ViQ2hpbGRBdHRyaWJ1dGVOYW1lIiwib091dE9iamVjdHMiLCJjaGlsZElkeCIsIm15Q2hpbGQiLCJwYXJzZWRBZ2dyZWdhdGlvbiIsInBhcnNlQWdncmVnYXRpb24iLCJwcm9jZXNzQWdncmVnYXRpb25zIiwicGFyc2VkQWdncmVnYXRpb25LZXkiLCJ2aXNpdENoaWxkTm9kZXMiLCJvRGVmaW5pdGlvblByb3BlcnRpZXMiLCJhRGVmaW5pdGlvblByb3BlcnRpZXNLZXlzIiwic0tleVZhbHVlIiwiZGVlcENsb25lIiwiZGVmYXVsdFZhbHVlIiwiaGFzQXR0cmlidXRlIiwidmlzaXRBdHRyaWJ1dGUiLCJhdHRyaWJ1dGVzIiwiZ2V0TmFtZWRJdGVtIiwidlZhbHVlIiwicmVzb2x2ZWRWYWx1ZSIsInN0YXJ0c1dpdGgiLCJOdW1iZXIiLCJMT0dHRVJfU0NPUEUiLCJET01QYXJzZXJJbnN0YW5jZSIsIkRPTVBhcnNlciIsInZhbGlkYXRlTWFjcm9NZXRhZGF0YUNvbnRleHQiLCJvQ29udGV4dFNldHRpbmdzIiwic0tleSIsIm9Db250ZXh0Iiwib0NvbnRleHRPYmplY3QiLCJyZXF1aXJlZCIsIkVycm9yIiwiJGtpbmQiLCIkVHlwZSIsImFNZXRhZGF0YUNvbnRleHRLZXlzIiwiYVByb3BlcnRpZXMiLCJvQXR0cmlidXRlTmFtZXMiLCJvUHJvcGVydHlTZXR0aW5ncyIsIndhcm5pbmciLCJTQVBfVUlfQ09SRV9FTEVNRU5UIiwiYnVpbGRpbmdCbG9ja01ldGFkYXRhIiwib1Byb3BlcnRpZXMiLCJkZXBlbmRlbnRzIiwiY3VzdG9tRGF0YSIsImZvdW5kRGVmYXVsdEFnZ3JlZ2F0aW9uIiwic1Byb3BlcnR5TmFtZSIsImV2ZW50cyIsInNFdmVudE5hbWUiLCJpc0RlZmF1bHQiLCJfY2hlY2tBYnNvbHV0ZUFuZENvbnRleHRQYXRocyIsInNNZXRhUGF0aCIsImN1cnJlbnRDb250ZXh0UGF0aCIsImVuZHNXaXRoIiwibW9kZWwiLCJfY3JlYXRlSW5pdGlhbE1ldGFkYXRhQ29udGV4dCIsInNBdHRyaWJ1dGVOYW1lIiwicmV0dXJuQ29udGV4dCIsImJpbmRpbmdDb250ZXh0cyIsImVudGl0eVNldCIsIl9nZXRNZXRhZGF0YUNvbnRleHQiLCJiRG9Ob3RSZXNvbHZlIiwib01ldGFkYXRhQ29udGV4dCIsIkJpbmRpbmdQYXJzZXIiLCJjb21wbGV4UGFyc2VyIiwiZ2V0Q29udGV4dCIsImNvbnRleHRQYXRoIiwib0RlZmluaXRpb25Db250ZXh0cyIsImFEZWZpbml0aW9uQ29udGV4dHNLZXlzIiwiY29udGV4dFBhdGhJbmRleCIsImNvbnRleHRQYXRoRGVmaW5pdGlvbiIsInNwbGljZSIsImFkZFNpbmdsZUNvbnRleHQiLCJvQWdncmVnYXRpb24iLCJjaGlsZEtleSIsInNldEF0dHJpYnV0ZSIsImFnZ3JlZ2F0aW9uT2JqZWN0Iiwia2V5IiwicG9zaXRpb24iLCJwbGFjZW1lbnQiLCJQbGFjZW1lbnQiLCJBZnRlciIsImFuY2hvciIsIm9NZXRhZGF0YUFnZ3JlZ2F0aW9ucyIsIm9BZ2dyZWdhdGlvbkVsZW1lbnQiLCJvRWxlbWVudENoaWxkIiwic1Nsb3ROYW1lIiwib1RhcmdldEVsZW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwicHJlcGFyZUFnZ3JlZ2F0aW9uRWxlbWVtbnQiLCJyZXBsYWNlIiwib0N0eCIsIm1TZXR0aW5nIiwiZXgiLCJyZWdpc3RlckJ1aWxkaW5nQmxvY2siLCJYTUxQcmVwcm9jZXNzb3IiLCJwbHVnSW4iLCJwdWJsaWNOYW1lc3BhY2UiLCJlcnJvck1lc3NhZ2VzIiwieG1sRnJhZ21lbnQiLCJhZGRpdGlvbmFsRGF0YSIsImVycm9yTGFiZWxzIiwiZXJyb3JNZXNzYWdlIiwieG1sIiwiZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUiLCJlcnJvclN0YWNrIiwic3RhY2tGb3JtYXR0ZWQiLCJidG9hIiwiYWRkaXRpb25hbFRleHQiLCJKU09OIiwic3RyaW5naWZ5IiwicmVwbGFjZUFsbCIsInByb3BlcnR5VUlEIiwidWlkIiwieG1sU3RyaW5nIiwiYWRkRGVmYXVsdE5hbWVzcGFjZXMiLCJ4bWxEb2N1bWVudCIsInBhcnNlRnJvbVN0cmluZyIsIm91dHB1dCIsInBhcmVudEVsZW1lbnQiLCJyZW5kZXJJblRyYWNlTW9kZSIsIm91dFN0ciIsInhtbFJlc3VsdCIsImlubmVyVGV4dCIsImlubmVySFRNTCIsInNwbGl0IiwiaXNCdWlsZGluZ0Jsb2NrQmFzZSIsImJiIiwic3RyaW5ncyIsImlzQXJyYXkiLCJmbGF0IiwiaXNGdW5jdGlvbkFycmF5IiwidmFsdWVmbiIsImlzQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIiwiY29tcGlsZWRFeHByZXNzaW9uIiwiY29tcGlsZUV4cHJlc3Npb24iLCJwcm9wZXJ0eVVJZCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQnVpbGRpbmdCbG9ja1J1bnRpbWUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgUmVzb3VyY2VCdW5kbGUgZnJvbSBcInNhcC9iYXNlL2kxOG4vUmVzb3VyY2VCdW5kbGVcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IGRlZXBDbG9uZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9kZWVwQ2xvbmVcIjtcbmltcG9ydCB1aWQgZnJvbSBcInNhcC9iYXNlL3V0aWwvdWlkXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IEF0dHJpYnV0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy9BdHRyaWJ1dGVNb2RlbFwiO1xuaW1wb3J0IHR5cGUge1xuXHRCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uLFxuXHRCdWlsZGluZ0Jsb2NrQmFzZSxcblx0QnVpbGRpbmdCbG9ja0RlZmluaXRpb24sXG5cdEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uVjEsXG5cdEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0QnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb24sXG5cdEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb24sXG5cdE9iamVjdFZhbHVlLFxuXHRPYmplY3RWYWx1ZTJcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL0J1aWxkaW5nQmxvY2tcIjtcbmltcG9ydCB0eXBlIHsgUG9zaXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0NvbmZpZ3VyYWJsZU9iamVjdFwiO1xuaW1wb3J0IHsgUGxhY2VtZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB0eXBlIHsgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB7IGNvbXBpbGVFeHByZXNzaW9uLCBpc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgeyBpc0NvbnRleHQsIGlzRnVuY3Rpb25BcnJheSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvbWFjcm9zL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCBCaW5kaW5nUGFyc2VyIGZyb20gXCJzYXAvdWkvYmFzZS9CaW5kaW5nUGFyc2VyXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBfUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL3Jlc291cmNlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgTWFjcm9JbmZvLCBUcmFjZU1ldGFkYXRhQ29udGV4dCB9IGZyb20gXCIuL1RyYWNlSW5mb1wiO1xuaW1wb3J0IFRyYWNlSW5mbyBmcm9tIFwiLi9UcmFjZUluZm9cIjtcblxuY29uc3QgTE9HR0VSX1NDT1BFID0gXCJzYXAuZmUuY29yZS5idWlsZGluZ0Jsb2Nrcy5CdWlsZGluZ0Jsb2NrUnVudGltZVwiO1xuY29uc3QgRE9NUGFyc2VySW5zdGFuY2UgPSBuZXcgRE9NUGFyc2VyKCk7XG5sZXQgaXNUcmFjZU1vZGUgPSBmYWxzZTtcblxuZXhwb3J0IHR5cGUgUmVzb2x2ZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEgPSB7XG5cdHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb24+O1xuXHRhZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbkRlZmluaXRpb24+O1xuXHRtZXRhZGF0YUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrTWV0YWRhdGFDb250ZXh0RGVmaW5pdGlvbj47XG5cdGlzT3BlbjogYm9vbGVhbjtcblx0ZGVmYXVsdEFnZ3JlZ2F0aW9uPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBEZWZpbml0aW9uIG9mIGEgbWV0YSBkYXRhIGNvbnRleHRcbiAqL1xudHlwZSBNZXRhRGF0YUNvbnRleHQgPSB7XG5cdG5hbWU/OiBzdHJpbmc7XG5cdG1vZGVsOiBzdHJpbmc7XG5cdHBhdGg6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3MgPSB7XG5cdGN1cnJlbnRDb250ZXh0UGF0aDogQ29udGV4dDtcblx0aXNQdWJsaWM6IGJvb2xlYW47XG5cdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50O1xuXHRtb2RlbHM6IFJlY29yZDxzdHJpbmcsIE1vZGVsPiAmIHtcblx0XHRjb252ZXJ0ZXJDb250ZXh0OiBKU09OTW9kZWw7XG5cdFx0dmlld0RhdGE6IEpTT05Nb2RlbDtcblx0XHRtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsO1xuXHRcdFwic2FwLmZlLmkxOG5cIj86IF9SZXNvdXJjZU1vZGVsO1xuXHR9O1xuXHRiaW5kaW5nQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+O1xuXHRfbWFjcm9JbmZvPzogTWFjcm9JbmZvO1xuXHRbazogc3RyaW5nXTogdW5rbm93bjtcbn07XG5cbmV4cG9ydCB0eXBlIElWaXNpdG9yQ2FsbGJhY2sgPSB7XG5cdGdldFNldHRpbmdzKCk6IFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3M7XG5cdC8qKlxuXHQgKiBWaXNpdHMgdGhlIGdpdmVuIG5vZGUgYW5kIGVpdGhlciBwcm9jZXNzZXMgYSB0ZW1wbGF0ZSBpbnN0cnVjdGlvbiwgY2FsbHNcblx0ICogYSB2aXNpdG9yLCBvciBzaW1wbHkgY2FsbHMgYm90aCB7QGxpbmtcblx0ICogc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrLnZpc2l0QXR0cmlidXRlcyB2aXNpdEF0dHJpYnV0ZXN9XG5cdCAqIGFuZCB7QGxpbmsgc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrLnZpc2l0Q2hpbGROb2Rlc1xuXHQgKiB2aXNpdENoaWxkTm9kZXN9LlxuXHQgKlxuXHQgKiBAcGFyYW0ge05vZGV9IG9Ob2RlXG5cdCAqICAgVGhlIFhNTCBET00gbm9kZVxuXHQgKiBAcmV0dXJucyB7c2FwLnVpLmJhc2UuU3luY1Byb21pc2V9XG5cdCAqICAgQSB0aGVuYWJsZSB3aGljaCByZXNvbHZlcyB3aXRoIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gYXMgc29vbiBhcyB2aXNpdGluZ1xuXHQgKiAgIGlzIGRvbmUsIG9yIGlzIHJlamVjdGVkIHdpdGggYSBjb3JyZXNwb25kaW5nIGVycm9yIGlmIHZpc2l0aW5nIGZhaWxzXG5cdCAqL1xuXHR2aXNpdE5vZGUob05vZGU6IE5vZGUpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBJbnNlcnRzIHRoZSBmcmFnbWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHBsYWNlIG9mIHRoZSBnaXZlbiBlbGVtZW50LiBMb2FkcyB0aGVcblx0ICogZnJhZ21lbnQsIHRha2VzIGNhcmUgb2YgY2FjaGluZyAoZm9yIHRoZSBjdXJyZW50IHByZS1wcm9jZXNzb3IgcnVuKSBhbmQgdmlzaXRzIHRoZVxuXHQgKiBmcmFnbWVudCdzIGNvbnRlbnQgb25jZSBpdCBoYXMgYmVlbiBpbXBvcnRlZCBpbnRvIHRoZSBlbGVtZW50J3Mgb3duZXIgZG9jdW1lbnQgYW5kXG5cdCAqIHB1dCBpbnRvIHBsYWNlLiBMb2FkaW5nIG9mIGZyYWdtZW50cyBpcyBhc3luY2hyb25vdXMgaWYgdGhlIHRlbXBsYXRlIHZpZXcgaXNcblx0ICogYXN5bmNocm9ub3VzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0ZyYWdtZW50TmFtZVxuXHQgKiAgIHRoZSBmcmFnbWVudCdzIHJlc29sdmVkIG5hbWVcblx0ICogQHBhcmFtIHtFbGVtZW50fSBvRWxlbWVudFxuXHQgKiAgIHRoZSBYTUwgRE9NIGVsZW1lbnQsIGUuZy4gPHNhcC51aS5jb3JlOkZyYWdtZW50PiBvciA8Y29yZTpFeHRlbnNpb25Qb2ludD5cblx0ICogQHBhcmFtIHtzYXAudWkuY29yZS51dGlsLl93aXRofSBvV2l0aENvbnRyb2xcblx0ICogICB0aGUgcGFyZW50J3MgXCJ3aXRoXCIgY29udHJvbFxuXHQgKiBAcmV0dXJucyB7c2FwLnVpLmJhc2UuU3luY1Byb21pc2V9XG5cdCAqIEEgc3luYyBwcm9taXNlIHdoaWNoIHJlc29sdmVzIHdpdGggPGNvZGU+dW5kZWZpbmVkPC9jb2RlPiBhcyBzb29uIGFzIHRoZSBmcmFnbWVudFxuXHQgKiAgIGhhcyBiZWVuIGluc2VydGVkLCBvciBpcyByZWplY3RlZCB3aXRoIGEgY29ycmVzcG9uZGluZyBlcnJvciBpZiBsb2FkaW5nIG9yIHZpc2l0aW5nXG5cdCAqICAgZmFpbHMuXG5cdCAqL1xuXHRpbnNlcnRGcmFnbWVudChzRnJhZ21lbnQ6IHN0cmluZywgb0VsZW1lbnQ6IEVsZW1lbnQsIG9XaXRoPzogQ29udHJvbCk6IFByb21pc2U8dm9pZD47XG5cdHZpc2l0QXR0cmlidXRlKG9Ob2RlOiBFbGVtZW50LCBvQXR0cmlidXRlOiBBdHRyKTogUHJvbWlzZTx2b2lkPjtcblx0dmlzaXRBdHRyaWJ1dGVzKG9Ob2RlOiBFbGVtZW50KTogUHJvbWlzZTx2b2lkPjtcblx0Z2V0Vmlld0luZm8oKTogUHJvbWlzZTx1bmtub3duPjtcblx0dmlzaXRDaGlsZE5vZGVzKG9Ob2RlOiBOb2RlKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEludGVycHJldHMgdGhlIGdpdmVuIFhNTCBET00gYXR0cmlidXRlIHZhbHVlIGFzIGEgYmluZGluZyBhbmQgcmV0dXJucyB0aGVcblx0ICogcmVzdWx0aW5nIHZhbHVlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1ZhbHVlXG5cdCAqICAgQW4gWE1MIERPTSBhdHRyaWJ1dGUgdmFsdWVcblx0ICogQHBhcmFtIHtFbGVtZW50fSBbb0VsZW1lbnRdXG5cdCAqICAgVGhlIFhNTCBET00gZWxlbWVudCB0aGUgYXR0cmlidXRlIHZhbHVlIGJlbG9uZ3MgdG8gKG5lZWRlZCBvbmx5IGZvclxuXHQgKiAgIHdhcm5pbmdzIHdoaWNoIGFyZSBsb2dnZWQgdG8gdGhlIGNvbnNvbGUpXG5cdCAqIEByZXR1cm5zIHtzYXAudWkuYmFzZS5TeW5jUHJvbWlzZXxudWxsfVxuXHQgKiAgIEEgdGhlbmFibGUgd2hpY2ggcmVzb2x2ZXMgd2l0aCB0aGUgcmVzdWx0aW5nIHZhbHVlLCBvciBpcyByZWplY3RlZCB3aXRoIGFcblx0ICogICBjb3JyZXNwb25kaW5nIGVycm9yIChmb3IgZXhhbXBsZSwgYW4gZXJyb3IgdGhyb3duIGJ5IGEgZm9ybWF0dGVyKSBvclxuXHQgKiAgIDxjb2RlPm51bGw8L2NvZGU+IGluIGNhc2UgdGhlIGJpbmRpbmcgaXMgbm90IHJlYWR5IChiZWNhdXNlIGl0IHJlZmVycyB0byBhXG5cdCAqICAgbW9kZWwgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSkgKHNpbmNlIDEuNTcuMClcblx0ICovXG5cdGdldFJlc3VsdChzVmFsdWU6IHN0cmluZywgZWxlbWVudD86IEVsZW1lbnQpOiBQcm9taXNlPENvbnRleHQ+IHwgbnVsbDtcblx0Z2V0Q29udGV4dChzUGF0aD86IHN0cmluZyk6IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgaW50ZXJmYWNlIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gbWFwIG9mIHZhcmlhYmxlcyB3aGljaFxuXHQgKiBvdmVycmlkZSBjdXJyZW50bHkga25vd24gdmFyaWFibGVzIG9mIHRoZSBzYW1lIG5hbWUgaW4gPGNvZGU+dGhpczwvY29kZT5cblx0ICogcGFyZW50IGludGVyZmFjZSBvciByZXBsYWNlIHRoZW0gYWx0b2dldGhlci4gRWFjaCB2YXJpYWJsZSBuYW1lIGJlY29tZXMgYVxuXHQgKiBuYW1lZCBtb2RlbCB3aXRoIGEgY29ycmVzcG9uZGluZyBvYmplY3QgYmluZGluZyBhbmQgY2FuIGJlIHVzZWQgaW5zaWRlIHRoZVxuXHQgKiBYTUwgdGVtcGxhdGUgaW4gdGhlIHVzdWFsIHdheSwgdGhhdCBpcywgd2l0aCBhIGJpbmRpbmcgZXhwcmVzc2lvbiBsaWtlXG5cdCAqIDxjb2RlPlwie3Zhcj5zb21lL3JlbGF0aXZlL3BhdGh9XCI8L2NvZGU+IChzZWUgZXhhbXBsZSkuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbbVZhcmlhYmxlcz17fV1cblx0ICogICBNYXAgZnJvbSB2YXJpYWJsZSBuYW1lIChzdHJpbmcpIHRvIHZhbHVlICh7QGxpbmsgc2FwLnVpLm1vZGVsLkNvbnRleHR9KVxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtiUmVwbGFjZV1cblx0ICogICBXaGV0aGVyIG9ubHkgdGhlIGdpdmVuIHZhcmlhYmxlcyBhcmUga25vd24gaW4gdGhlIG5ldyBjYWxsYmFjayBpbnRlcmZhY2Vcblx0ICogICBpbnN0YW5jZSwgbm8gaW5oZXJpdGVkIG9uZXNcblx0ICogQHJldHVybnMge3NhcC51aS5jb3JlLnV0aWwuWE1MUHJlcHJvY2Vzc29yLklDYWxsYmFja31cblx0ICogICBBIGNhbGxiYWNrIGludGVyZmFjZSBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gbVZhcmlhYmxlc1xuXHQgKiBAcGFyYW0gYlJlcGxhY2Vcblx0ICovXG5cdFwid2l0aFwiKG1WYXJpYWJsZXM/OiBSZWNvcmQ8c3RyaW5nLCBDb250ZXh0PiwgYlJlcGxhY2U/OiBib29sZWFuKTogSVZpc2l0b3JDYWxsYmFjaztcbn07XG5cbi8qKlxuICogVHlwZWd1YXJkIGZvciBjaGVja2luZyBpZiBhIGJ1aWxkaW5nIGJsb2NrIHVzZSBBUEkgMS5cbiAqXG4gKiBAcGFyYW0gYnVpbGRpbmdCbG9ja0RlZmluaXRpb25cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgYnVpbGRpbmcgYmxvY2sgaXMgdXNpbmcgQVBJIDEuXG4gKi9cbmZ1bmN0aW9uIGlzVjFNYWNyb0RlZihidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbjogQnVpbGRpbmdCbG9ja0RlZmluaXRpb24pOiBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiBpcyBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvblYxIHtcblx0cmV0dXJuIGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb24gPT09IHVuZGVmaW5lZCB8fCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uID09PSAxO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVNYWNyb01ldGFkYXRhQ29udGV4dChcblx0c05hbWU6IHN0cmluZyxcblx0bUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBDb250ZXh0Pixcblx0b0NvbnRleHRTZXR0aW5nczogQnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb24sXG5cdHNLZXk6IHN0cmluZ1xuKSB7XG5cdGNvbnN0IG9Db250ZXh0ID0gbUNvbnRleHRzW3NLZXldO1xuXHRjb25zdCBvQ29udGV4dE9iamVjdCA9IG9Db250ZXh0Py5nZXRPYmplY3QoKSBhcyB7XG5cdFx0JFR5cGU/OiBzdHJpbmc7XG5cdFx0JGtpbmQ/OiBzdHJpbmc7XG5cdH07XG5cblx0aWYgKG9Db250ZXh0U2V0dGluZ3MucmVxdWlyZWQgPT09IHRydWUgJiYgKCFvQ29udGV4dCB8fCBvQ29udGV4dE9iamVjdCA9PT0gbnVsbCkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYCR7c05hbWV9OiBSZXF1aXJlZCBtZXRhZGF0YUNvbnRleHQgJyR7c0tleX0nIGlzIG1pc3NpbmdgKTtcblx0fSBlbHNlIGlmIChvQ29udGV4dE9iamVjdCkge1xuXHRcdC8vIElmIGNvbnRleHQgb2JqZWN0IGhhcyAka2luZCBwcm9wZXJ0eSwgJFR5cGUgc2hvdWxkIG5vdCBiZSBjaGVja2VkXG5cdFx0Ly8gVGhlcmVmb3JlIHJlbW92ZSBmcm9tIGNvbnRleHQgc2V0dGluZ3Ncblx0XHRpZiAob0NvbnRleHRPYmplY3QuaGFzT3duUHJvcGVydHkoXCIka2luZFwiKSAmJiBvQ29udGV4dE9iamVjdC4ka2luZCAhPT0gdW5kZWZpbmVkICYmIG9Db250ZXh0U2V0dGluZ3MuJGtpbmQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlICRraW5kIGlzIHBhcnQgb2YgdGhlIGFsbG93ZWQgb25lc1xuXHRcdFx0aWYgKG9Db250ZXh0U2V0dGluZ3MuJGtpbmQuaW5kZXhPZihvQ29udGV4dE9iamVjdC4ka2luZCkgPT09IC0xKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0XHRgJHtzTmFtZX06ICcke3NLZXl9JyBtdXN0IGJlICcka2luZCcgJyR7b0NvbnRleHRTZXR0aW5nc1tcIiRraW5kXCJdfScgYnV0IGlzICcke1xuXHRcdFx0XHRcdFx0b0NvbnRleHRPYmplY3QuJGtpbmRcblx0XHRcdFx0XHR9JzogJHtvQ29udGV4dC5nZXRQYXRoKCl9YFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAob0NvbnRleHRPYmplY3QuaGFzT3duUHJvcGVydHkoXCIkVHlwZVwiKSAmJiBvQ29udGV4dE9iamVjdC4kVHlwZSAhPT0gdW5kZWZpbmVkICYmIG9Db250ZXh0U2V0dGluZ3MuJFR5cGUpIHtcblx0XHRcdC8vIENoZWNrIG9ubHkgJFR5cGVcblx0XHRcdGlmIChvQ29udGV4dFNldHRpbmdzLiRUeXBlLmluZGV4T2Yob0NvbnRleHRPYmplY3QuJFR5cGUpID09PSAtMSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdFx0YCR7c05hbWV9OiAnJHtzS2V5fScgbXVzdCBiZSAnJFR5cGUnICcke29Db250ZXh0U2V0dGluZ3NbXCIkVHlwZVwiXX0nIGJ1dCBpcyAnJHtcblx0XHRcdFx0XHRcdG9Db250ZXh0T2JqZWN0LiRUeXBlXG5cdFx0XHRcdFx0fSc6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU1hY3JvU2lnbmF0dXJlKFxuXHRzTmFtZTogc3RyaW5nLFxuXHRvTWV0YWRhdGE6IFJlc29sdmVkQnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+LFxuXHRvTm9kZTogRWxlbWVudFxuKSB7XG5cdGNvbnN0IGFNZXRhZGF0YUNvbnRleHRLZXlzID0gKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzICYmIE9iamVjdC5rZXlzKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzKSkgfHwgW10sXG5cdFx0YVByb3BlcnRpZXMgPSAob01ldGFkYXRhLnByb3BlcnRpZXMgJiYgT2JqZWN0LmtleXMob01ldGFkYXRhLnByb3BlcnRpZXMpKSB8fCBbXSxcblx0XHRvQXR0cmlidXRlTmFtZXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG5cblx0Ly8gY29sbGVjdCBhbGwgYXR0cmlidXRlcyB0byBmaW5kIHVuY2hlY2tlZCBwcm9wZXJ0aWVzXG5cdGNvbnN0IGF0dHJpYnV0ZU5hbWVzID0gb05vZGUuZ2V0QXR0cmlidXRlTmFtZXMoKTtcblx0Zm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIGF0dHJpYnV0ZU5hbWVzKSB7XG5cdFx0b0F0dHJpYnV0ZU5hbWVzW2F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcblx0fVxuXG5cdC8vQ2hlY2sgbWV0YWRhdGFDb250ZXh0c1xuXHRhTWV0YWRhdGFDb250ZXh0S2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5KSB7XG5cdFx0Y29uc3Qgb0NvbnRleHRTZXR0aW5ncyA9IG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzW3NLZXldO1xuXG5cdFx0dmFsaWRhdGVNYWNyb01ldGFkYXRhQ29udGV4dChzTmFtZSwgbUNvbnRleHRzLCBvQ29udGV4dFNldHRpbmdzLCBzS2V5KTtcblx0XHRkZWxldGUgb0F0dHJpYnV0ZU5hbWVzW3NLZXldO1xuXHR9KTtcblx0Ly9DaGVjayBwcm9wZXJ0aWVzXG5cdGFQcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKHNLZXkpIHtcblx0XHRjb25zdCBvUHJvcGVydHlTZXR0aW5ncyA9IG9NZXRhZGF0YS5wcm9wZXJ0aWVzW3NLZXldO1xuXHRcdGlmICghb05vZGUuaGFzQXR0cmlidXRlKHNLZXkpKSB7XG5cdFx0XHRpZiAob1Byb3BlcnR5U2V0dGluZ3MucmVxdWlyZWQgJiYgIW9Qcm9wZXJ0eVNldHRpbmdzLmhhc093blByb3BlcnR5KFwiZGVmYXVsdFZhbHVlXCIpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgJHtzTmFtZX06IGAgKyBgUmVxdWlyZWQgcHJvcGVydHkgJyR7c0tleX0nIGlzIG1pc3NpbmdgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVsZXRlIG9BdHRyaWJ1dGVOYW1lc1tzS2V5XTtcblx0XHR9XG5cdH0pO1xuXG5cdC8vIFVuY2hlY2tlZCBwcm9wZXJ0aWVzXG5cdE9iamVjdC5rZXlzKG9BdHRyaWJ1dGVOYW1lcykuZm9yRWFjaChmdW5jdGlvbiAoc0tleTogc3RyaW5nKSB7XG5cdFx0Ly8gbm8gY2hlY2sgZm9yIHByb3BlcnRpZXMgd2hpY2ggc3RhcnQgd2l0aCB1bmRlcnNjb3JlIFwiX1wiIG9yIGNvbnRhaW4gYSBjb2xvbiBcIjpcIiAoZGlmZmVyZW50IG5hbWVzcGFjZSksIGUuZy4geG1sbnM6dHJhY2UsIHRyYWNlOm1hY3JvSUQsIHVuaXR0ZXN0OmlkXG5cdFx0aWYgKHNLZXkuaW5kZXhPZihcIjpcIikgPCAwICYmICFzS2V5LnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSkge1xuXHRcdFx0TG9nLndhcm5pbmcoYFVuY2hlY2tlZCBwYXJhbWV0ZXI6ICR7c05hbWV9OiAke3NLZXl9YCwgdW5kZWZpbmVkLCBMT0dHRVJfU0NPUEUpO1xuXHRcdH1cblx0fSk7XG59XG5cbmNvbnN0IFNBUF9VSV9DT1JFX0VMRU1FTlQgPSBcInNhcC51aS5jb3JlLkVsZW1lbnRcIjtcblxuY29uc3QgU0FQX1VJX01PREVMX0NPTlRFWFQgPSBcInNhcC51aS5tb2RlbC5Db250ZXh0XCI7XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IHRoZSBtZXRhZGF0YSBmb3IgdGhlIGJ1aWxkaW5nIGJsb2NrIGFyZSBwcm9wZXJseSBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEgVGhlIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGlucHV0XG4gKiBAcGFyYW0gaXNPcGVuIFdoZXRoZXIgdGhlIGJ1aWxkaW5nIGJsb2NrIGlzIG9wZW4gb3Igbm90XG4gKiBAcGFyYW0gYXBpVmVyc2lvblxuICogQHJldHVybnMgQSBzZXQgb2YgY29tcGxldGVkIG1ldGFkYXRhIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmdcbiAqL1xuZnVuY3Rpb24gcHJlcGFyZU1ldGFkYXRhKFxuXHRidWlsZGluZ0Jsb2NrTWV0YWRhdGE/OiBCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdGlzT3BlbiA9IGZhbHNlLFxuXHRhcGlWZXJzaW9uPzogbnVtYmVyXG4pOiBSZXNvbHZlZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSB7XG5cdGlmIChidWlsZGluZ0Jsb2NrTWV0YWRhdGEpIHtcblx0XHRjb25zdCBvUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja1Byb3BlcnR5RGVmaW5pdGlvbj4gPSB7fTtcblx0XHRjb25zdCBvQWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uPiA9IHtcblx0XHRcdGRlcGVuZGVudHM6IHtcblx0XHRcdFx0dHlwZTogU0FQX1VJX0NPUkVfRUxFTUVOVFxuXHRcdFx0fSxcblx0XHRcdGN1c3RvbURhdGE6IHtcblx0XHRcdFx0dHlwZTogU0FQX1VJX0NPUkVfRUxFTUVOVFxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRpZiAoYXBpVmVyc2lvbiA9PT0gMikge1xuXHRcdFx0b0FnZ3JlZ2F0aW9ucy5kZXBlbmRlbnRzLnNsb3QgPSBcImRlcGVuZGVudHNcIjtcblx0XHR9XG5cblx0XHRjb25zdCBvTWV0YWRhdGFDb250ZXh0czogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja1Byb3BlcnR5RGVmaW5pdGlvbj4gPSB7fTtcblx0XHRsZXQgZm91bmREZWZhdWx0QWdncmVnYXRpb247XG5cdFx0T2JqZWN0LmtleXMoYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXMpLmZvckVhY2goZnVuY3Rpb24gKHNQcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuXHRcdFx0aWYgKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzW3NQcm9wZXJ0eU5hbWVdLnR5cGUgIT09IFNBUF9VSV9NT0RFTF9DT05URVhUKSB7XG5cdFx0XHRcdG9Qcm9wZXJ0aWVzW3NQcm9wZXJ0eU5hbWVdID0gYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXNbc1Byb3BlcnR5TmFtZV07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvTWV0YWRhdGFDb250ZXh0c1tzUHJvcGVydHlOYW1lXSA9IGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzW3NQcm9wZXJ0eU5hbWVdO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdC8vIE1lcmdlIGV2ZW50cyBpbnRvIHByb3BlcnRpZXMgYXMgdGhleSBhcmUgaGFuZGxlZCBpZGVudGljYWxseVxuXHRcdGlmIChidWlsZGluZ0Jsb2NrTWV0YWRhdGEuZXZlbnRzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdE9iamVjdC5rZXlzKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5ldmVudHMpLmZvckVhY2goZnVuY3Rpb24gKHNFdmVudE5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRvUHJvcGVydGllc1tzRXZlbnROYW1lXSA9IHsgdHlwZTogXCJGdW5jdGlvblwiLCAuLi5idWlsZGluZ0Jsb2NrTWV0YWRhdGEuZXZlbnRzW3NFdmVudE5hbWVdIH07XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0aWYgKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5hZ2dyZWdhdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0T2JqZWN0LmtleXMoYnVpbGRpbmdCbG9ja01ldGFkYXRhLmFnZ3JlZ2F0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAoc1Byb3BlcnR5TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdG9BZ2dyZWdhdGlvbnNbc1Byb3BlcnR5TmFtZV0gPSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEuYWdncmVnYXRpb25zW3NQcm9wZXJ0eU5hbWVdO1xuXHRcdFx0XHRpZiAob0FnZ3JlZ2F0aW9uc1tzUHJvcGVydHlOYW1lXS5pc0RlZmF1bHQpIHtcblx0XHRcdFx0XHRmb3VuZERlZmF1bHRBZ2dyZWdhdGlvbiA9IHNQcm9wZXJ0eU5hbWU7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0cHJvcGVydGllczogb1Byb3BlcnRpZXMsXG5cdFx0XHRhZ2dyZWdhdGlvbnM6IG9BZ2dyZWdhdGlvbnMsXG5cdFx0XHRkZWZhdWx0QWdncmVnYXRpb246IGZvdW5kRGVmYXVsdEFnZ3JlZ2F0aW9uLFxuXHRcdFx0bWV0YWRhdGFDb250ZXh0czogb01ldGFkYXRhQ29udGV4dHMsXG5cdFx0XHRpc09wZW46IGlzT3BlblxuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG1ldGFkYXRhQ29udGV4dHM6IHt9LFxuXHRcdFx0YWdncmVnYXRpb25zOiB7XG5cdFx0XHRcdGRlcGVuZGVudHM6IHtcblx0XHRcdFx0XHR0eXBlOiBTQVBfVUlfQ09SRV9FTEVNRU5UXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGN1c3RvbURhdGE6IHtcblx0XHRcdFx0XHR0eXBlOiBTQVBfVUlfQ09SRV9FTEVNRU5UXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRwcm9wZXJ0aWVzOiB7fSxcblx0XHRcdGlzT3BlbjogaXNPcGVuXG5cdFx0fTtcblx0fVxufVxuXG4vKipcbiAqIENoZWNrcyB0aGUgYWJzb2x1dGUgb3IgY29udGV4dCBwYXRocyBhbmQgcmV0dXJucyBhbiBhcHByb3ByaWF0ZSBNZXRhQ29udGV4dC5cbiAqXG4gKiBAcGFyYW0gb1NldHRpbmdzIEFkZGl0aW9uYWwgc2V0dGluZ3NcbiAqIEBwYXJhbSBzQXR0cmlidXRlVmFsdWUgVGhlIGF0dHJpYnV0ZSB2YWx1ZVxuICogQHJldHVybnMgVGhlIG1ldGEgZGF0YSBjb250ZXh0IG9iamVjdFxuICovXG5mdW5jdGlvbiBfY2hlY2tBYnNvbHV0ZUFuZENvbnRleHRQYXRocyhvU2V0dGluZ3M6IFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3MsIHNBdHRyaWJ1dGVWYWx1ZTogc3RyaW5nKTogTWV0YURhdGFDb250ZXh0IHtcblx0bGV0IHNNZXRhUGF0aDogc3RyaW5nO1xuXHRpZiAoc0F0dHJpYnV0ZVZhbHVlICYmIHNBdHRyaWJ1dGVWYWx1ZS5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdC8vIGFic29sdXRlIHBhdGggLSB3ZSBqdXN0IHVzZSB0aGlzIG9uZVxuXHRcdHNNZXRhUGF0aCA9IHNBdHRyaWJ1dGVWYWx1ZTtcblx0fSBlbHNlIHtcblx0XHRsZXQgc0NvbnRleHRQYXRoID0gb1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aC5nZXRQYXRoKCk7XG5cdFx0aWYgKCFzQ29udGV4dFBhdGguZW5kc1dpdGgoXCIvXCIpKSB7XG5cdFx0XHRzQ29udGV4dFBhdGggKz0gXCIvXCI7XG5cdFx0fVxuXHRcdHNNZXRhUGF0aCA9IHNDb250ZXh0UGF0aCArIHNBdHRyaWJ1dGVWYWx1ZTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdG1vZGVsOiBcIm1ldGFNb2RlbFwiLFxuXHRcdHBhdGg6IHNNZXRhUGF0aFxuXHR9O1xufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGhlbHBzIHRvIGNyZWF0ZSB0aGUgbWV0YWRhdGEgY29udGV4dCBpbiBjYXNlIGl0IGlzIG5vdCB5ZXQgYXZhaWxhYmxlIGluIHRoZSBzdG9yZS5cbiAqXG4gKiBAcGFyYW0gb1NldHRpbmdzIEFkZGl0aW9uYWwgc2V0dGluZ3NcbiAqIEBwYXJhbSBzQXR0cmlidXRlTmFtZSBUaGUgYXR0cmlidXRlIG5hbWVcbiAqIEBwYXJhbSBzQXR0cmlidXRlVmFsdWUgVGhlIGF0dHJpYnV0ZSB2YWx1ZVxuICogQHJldHVybnMgVGhlIG1ldGEgZGF0YSBjb250ZXh0IG9iamVjdFxuICovXG5mdW5jdGlvbiBfY3JlYXRlSW5pdGlhbE1ldGFkYXRhQ29udGV4dChcblx0b1NldHRpbmdzOiBUZW1wbGF0ZVByb2Nlc3NvclNldHRpbmdzLFxuXHRzQXR0cmlidXRlTmFtZTogc3RyaW5nLFxuXHRzQXR0cmlidXRlVmFsdWU6IHN0cmluZ1xuKTogTWV0YURhdGFDb250ZXh0IHtcblx0bGV0IHJldHVybkNvbnRleHQ6IE1ldGFEYXRhQ29udGV4dDtcblx0aWYgKHNBdHRyaWJ1dGVWYWx1ZS5zdGFydHNXaXRoKFwiL3VpZC0tXCIpKSB7XG5cdFx0Y29uc3Qgb0RhdGEgPSBteVN0b3JlW3NBdHRyaWJ1dGVWYWx1ZV07XG5cdFx0b1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LnNldFByb3BlcnR5KHNBdHRyaWJ1dGVWYWx1ZSwgb0RhdGEpO1xuXHRcdHJldHVybkNvbnRleHQgPSB7XG5cdFx0XHRtb2RlbDogXCJjb252ZXJ0ZXJDb250ZXh0XCIsXG5cdFx0XHRwYXRoOiBzQXR0cmlidXRlVmFsdWVcblx0XHR9O1xuXHRcdGRlbGV0ZSBteVN0b3JlW3NBdHRyaWJ1dGVWYWx1ZV07XG5cdH0gZWxzZSBpZiAoKHNBdHRyaWJ1dGVOYW1lID09PSBcIm1ldGFQYXRoXCIgJiYgb1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCkgfHwgc0F0dHJpYnV0ZU5hbWUgPT09IFwiY29udGV4dFBhdGhcIikge1xuXHRcdHJldHVybkNvbnRleHQgPSBfY2hlY2tBYnNvbHV0ZUFuZENvbnRleHRQYXRocyhvU2V0dGluZ3MsIHNBdHRyaWJ1dGVWYWx1ZSk7XG5cdH0gZWxzZSBpZiAoc0F0dHJpYnV0ZVZhbHVlICYmIHNBdHRyaWJ1dGVWYWx1ZS5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdC8vIGFic29sdXRlIHBhdGggLSB3ZSBqdXN0IHVzZSB0aGlzIG9uZVxuXHRcdHJldHVybkNvbnRleHQgPSB7XG5cdFx0XHRtb2RlbDogXCJtZXRhTW9kZWxcIixcblx0XHRcdHBhdGg6IHNBdHRyaWJ1dGVWYWx1ZVxuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuQ29udGV4dCA9IHtcblx0XHRcdG1vZGVsOiBcIm1ldGFNb2RlbFwiLFxuXHRcdFx0cGF0aDogb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5lbnRpdHlTZXQgPyBvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmVudGl0eVNldC5nZXRQYXRoKHNBdHRyaWJ1dGVWYWx1ZSkgOiBzQXR0cmlidXRlVmFsdWVcblx0XHR9O1xuXHR9XG5cdHJldHVybiByZXR1cm5Db250ZXh0O1xufVxuXG5mdW5jdGlvbiBfZ2V0TWV0YWRhdGFDb250ZXh0KFxuXHRvU2V0dGluZ3M6IFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3MsXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRzQXR0cmlidXRlTmFtZTogc3RyaW5nLFxuXHRvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjayxcblx0YkRvTm90UmVzb2x2ZTogYm9vbGVhbixcblx0aXNPcGVuOiBib29sZWFuXG4pIHtcblx0bGV0IG9NZXRhZGF0YUNvbnRleHQ6IE1ldGFEYXRhQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0aWYgKCFiRG9Ob3RSZXNvbHZlICYmIG9Ob2RlLmhhc0F0dHJpYnV0ZShzQXR0cmlidXRlTmFtZSkpIHtcblx0XHRjb25zdCBzQXR0cmlidXRlVmFsdWUgPSBvTm9kZS5nZXRBdHRyaWJ1dGUoc0F0dHJpYnV0ZU5hbWUpIGFzIHN0cmluZztcblx0XHRvTWV0YWRhdGFDb250ZXh0ID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKHNBdHRyaWJ1dGVWYWx1ZSk7XG5cdFx0aWYgKCFvTWV0YWRhdGFDb250ZXh0KSB7XG5cdFx0XHRvTWV0YWRhdGFDb250ZXh0ID0gX2NyZWF0ZUluaXRpYWxNZXRhZGF0YUNvbnRleHQob1NldHRpbmdzLCBzQXR0cmlidXRlTmFtZSwgc0F0dHJpYnV0ZVZhbHVlKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAob1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5oYXNPd25Qcm9wZXJ0eShzQXR0cmlidXRlTmFtZSkpIHtcblx0XHRvTWV0YWRhdGFDb250ZXh0ID0ge1xuXHRcdFx0bW9kZWw6IHNBdHRyaWJ1dGVOYW1lLFxuXHRcdFx0cGF0aDogXCJcIlxuXHRcdH07XG5cdH0gZWxzZSBpZiAoaXNPcGVuKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChvVmlzaXRvci5nZXRDb250ZXh0KGAke3NBdHRyaWJ1dGVOYW1lfT5gKSkge1xuXHRcdFx0XHRvTWV0YWRhdGFDb250ZXh0ID0ge1xuXHRcdFx0XHRcdG1vZGVsOiBzQXR0cmlidXRlTmFtZSxcblx0XHRcdFx0XHRwYXRoOiBcIlwiXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG9NZXRhZGF0YUNvbnRleHQ7XG59XG5cbi8qKlxuICogUGFyc2UgdGhlIGluY29taW5nIFhNTCBub2RlIGFuZCB0cnkgdG8gcmVzb2x2ZSB0aGUgcHJvcGVydGllcyBkZWZpbmVkIHRoZXJlLlxuICpcbiAqIEBwYXJhbSBvTWV0YWRhdGEgVGhlIG1ldGFkYXRhIGZvciB0aGUgYnVpbGRpbmcgYmxvY2tcbiAqIEBwYXJhbSBvTm9kZSBUaGUgWE1MIG5vZGUgdG8gcGFyc2VcbiAqIEBwYXJhbSBpc1B1YmxpYyBXaGV0aGVyIHRoZSBidWlsZGluZyBibG9jayBpcyB1c2VkIGluIGEgcHVibGljIGNvbnRleHQgb3Igbm90XG4gKiBAcGFyYW0gb1Zpc2l0b3IgVGhlIHZpc2l0b3IgaW5zdGFuY2VcbiAqIEBwYXJhbSBhcGlWZXJzaW9uIFRoZSBBUEkgdmVyc2lvbiBvZiB0aGUgYnVpbGRpbmcgYmxvY2tcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1Byb3BlcnRpZXMoXG5cdG9NZXRhZGF0YTogUmVzb2x2ZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRpc1B1YmxpYzogYm9vbGVhbixcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2ssXG5cdGFwaVZlcnNpb24/OiBudW1iZXJcbikge1xuXHRjb25zdCBvRGVmaW5pdGlvblByb3BlcnRpZXMgPSBvTWV0YWRhdGEucHJvcGVydGllcztcblxuXHQvLyBSZXRyaWV2ZSBwcm9wZXJ0aWVzIHZhbHVlc1xuXHRjb25zdCBhRGVmaW5pdGlvblByb3BlcnRpZXNLZXlzID0gT2JqZWN0LmtleXMob0RlZmluaXRpb25Qcm9wZXJ0aWVzKTtcblxuXHRjb25zdCBwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWU+ID0ge307XG5cdGZvciAoY29uc3Qgc0tleVZhbHVlIG9mIGFEZWZpbml0aW9uUHJvcGVydGllc0tleXMpIHtcblx0XHRpZiAob0RlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0udHlwZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0cHJvcGVydHlWYWx1ZXNbc0tleVZhbHVlXSA9IGRlZXBDbG9uZShvRGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS5kZWZhdWx0VmFsdWUgfHwge30pOyAvLyBUbyBhdm9pZCB2YWx1ZXMgYmVpbmcgcmV1c2VkIGFjcm9zcyBtYWNyb3Ncblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJvcGVydHlWYWx1ZXNbc0tleVZhbHVlXSA9IG9EZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLmRlZmF1bHRWYWx1ZSBhcyBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyO1xuXHRcdH1cblxuXHRcdGlmIChvTm9kZS5oYXNBdHRyaWJ1dGUoc0tleVZhbHVlKSAmJiBpc1B1YmxpYyAmJiBvRGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS5pc1B1YmxpYyA9PT0gZmFsc2UpIHtcblx0XHRcdExvZy5lcnJvcihgUHJvcGVydHkgJHtzS2V5VmFsdWV9IHdhcyBpZ25vcmVkIGFzIGl0IGlzIG5vdCBpbnRlbmRlZCBmb3IgcHVibGljIHVzYWdlYCk7XG5cdFx0fSBlbHNlIGlmIChvTm9kZS5oYXNBdHRyaWJ1dGUoc0tleVZhbHVlKSkge1xuXHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXRBdHRyaWJ1dGUob05vZGUsIG9Ob2RlLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKHNLZXlWYWx1ZSkgYXMgQXR0cik7XG5cdFx0XHRsZXQgdlZhbHVlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkID0gb05vZGUuZ2V0QXR0cmlidXRlKHNLZXlWYWx1ZSk7XG5cdFx0XHRpZiAodlZhbHVlICE9PSB1bmRlZmluZWQgJiYgdlZhbHVlICE9PSBudWxsKSB7XG5cdFx0XHRcdGxldCByZXNvbHZlZFZhbHVlOiBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyID0gdlZhbHVlO1xuXHRcdFx0XHRpZiAoYXBpVmVyc2lvbiA9PT0gMiAmJiB0eXBlb2YgdlZhbHVlID09PSBcInN0cmluZ1wiICYmICF2VmFsdWUuc3RhcnRzV2l0aChcIntcIikpIHtcblx0XHRcdFx0XHRzd2l0Y2ggKG9EZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLnR5cGUpIHtcblx0XHRcdFx0XHRcdGNhc2UgXCJib29sZWFuXCI6XG5cdFx0XHRcdFx0XHRcdHJlc29sdmVkVmFsdWUgPSB2VmFsdWUgPT09IFwidHJ1ZVwiO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJudW1iZXJcIjpcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZWRWYWx1ZSA9IE51bWJlcih2VmFsdWUpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dlZhbHVlID0gdlZhbHVlID09PSBudWxsID8gdW5kZWZpbmVkIDogdlZhbHVlO1xuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID0gcmVzb2x2ZWRWYWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHByb3BlcnR5VmFsdWVzO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBpbmNvbWluZyBYTUwgbm9kZSBhbmQgdHJ5IHRvIHJlc29sdmUgdGhlIGJpbmRpbmcgY29udGV4dHMgZGVmaW5lZCBpbnNpZGUuXG4gKlxuICogQHBhcmFtIG9NZXRhZGF0YSBUaGUgbWV0YWRhdGEgZm9yIHRoZSBidWlsZGluZyBibG9ja1xuICogQHBhcmFtIG9TZXR0aW5ncyBUaGUgc2V0dGluZ3Mgb2JqZWN0XG4gKiBAcGFyYW0gb05vZGUgVGhlIFhNTCBub2RlIHRvIHBhcnNlXG4gKiBAcGFyYW0gaXNQdWJsaWMgV2hldGhlciB0aGUgYnVpbGRpbmcgYmxvY2sgaXMgdXNlZCBpbiBhIHB1YmxpYyBjb250ZXh0IG9yIG5vdFxuICogQHBhcmFtIG9WaXNpdG9yIFRoZSB2aXNpdG9yIGluc3RhbmNlXG4gKiBAcGFyYW0gbUNvbnRleHRzIFRoZSBjb250ZXh0cyB0byBiZSB1c2VkXG4gKiBAcGFyYW0gb01ldGFkYXRhQ29udGV4dHNcdFRoZSBtZXRhZGF0YSBjb250ZXh0cyB0byBiZSB1c2VkXG4gKiBAcmV0dXJucyBUaGUgcHJvY2Vzc2VkIGFuZCBtaXNzaW5nIGNvbnRleHRzXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NDb250ZXh0cyhcblx0b01ldGFkYXRhOiBSZXNvbHZlZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0b1NldHRpbmdzOiBUZW1wbGF0ZVByb2Nlc3NvclNldHRpbmdzLFxuXHRvTm9kZTogRWxlbWVudCxcblx0aXNQdWJsaWM6IGJvb2xlYW4sXG5cdG9WaXNpdG9yOiBJVmlzaXRvckNhbGxiYWNrLFxuXHRtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+LFxuXHRvTWV0YWRhdGFDb250ZXh0czogUmVjb3JkPHN0cmluZywgQ29udGV4dD5cbikge1xuXHRvU2V0dGluZ3MuY3VycmVudENvbnRleHRQYXRoID0gb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5jb250ZXh0UGF0aDtcblx0Y29uc3QgbU1pc3NpbmdDb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuXHRjb25zdCBwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblx0Y29uc3Qgb0RlZmluaXRpb25Db250ZXh0cyA9IG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzO1xuXHRjb25zdCBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cyA9IE9iamVjdC5rZXlzKG9EZWZpbml0aW9uQ29udGV4dHMpO1xuXHQvLyBTaW5jZSB0aGUgbWV0YVBhdGggYW5kIG90aGVyIHByb3BlcnR5IGNhbiBiZSByZWxhdGl2ZSB0byB0aGUgY29udGV4dFBhdGggd2UgbmVlZCB0byBldmFsdWF0ZSB0aGUgY3VycmVudCBjb250ZXh0UGF0aCBmaXJzdFxuXHRjb25zdCBjb250ZXh0UGF0aEluZGV4ID0gYURlZmluaXRpb25Db250ZXh0c0tleXMuaW5kZXhPZihcImNvbnRleHRQYXRoXCIpO1xuXHRpZiAoY29udGV4dFBhdGhJbmRleCAhPT0gLTEpIHtcblx0XHQvLyBJZiBpdCBpcyBkZWZpbmVkIHdlIGV4dHJhY3QgaXQgYW5kIHJlaW5zZXJ0IGl0IGluIHRoZSBmaXJzdCBwb3NpdGlvbiBvZiB0aGUgYXJyYXlcblx0XHRjb25zdCBjb250ZXh0UGF0aERlZmluaXRpb24gPSBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cy5zcGxpY2UoY29udGV4dFBhdGhJbmRleCwgMSk7XG5cdFx0YURlZmluaXRpb25Db250ZXh0c0tleXMuc3BsaWNlKDAsIDAsIGNvbnRleHRQYXRoRGVmaW5pdGlvblswXSk7XG5cdH1cblx0Zm9yIChjb25zdCBzQXR0cmlidXRlTmFtZSBvZiBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cykge1xuXHRcdGNvbnN0IGJEb05vdFJlc29sdmUgPSBpc1B1YmxpYyAmJiBvRGVmaW5pdGlvbkNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXS5pc1B1YmxpYyA9PT0gZmFsc2UgJiYgb05vZGUuaGFzQXR0cmlidXRlKHNBdHRyaWJ1dGVOYW1lKTtcblx0XHRjb25zdCBvTWV0YWRhdGFDb250ZXh0ID0gX2dldE1ldGFkYXRhQ29udGV4dChvU2V0dGluZ3MsIG9Ob2RlLCBzQXR0cmlidXRlTmFtZSwgb1Zpc2l0b3IsIGJEb05vdFJlc29sdmUsIG9NZXRhZGF0YS5pc09wZW4pO1xuXHRcdGlmIChvTWV0YWRhdGFDb250ZXh0KSB7XG5cdFx0XHRvTWV0YWRhdGFDb250ZXh0Lm5hbWUgPSBzQXR0cmlidXRlTmFtZTtcblx0XHRcdGFkZFNpbmdsZUNvbnRleHQobUNvbnRleHRzLCBvVmlzaXRvciwgb01ldGFkYXRhQ29udGV4dCwgb01ldGFkYXRhQ29udGV4dHMpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoc0F0dHJpYnV0ZU5hbWUgPT09IFwiZW50aXR5U2V0XCIgfHwgc0F0dHJpYnV0ZU5hbWUgPT09IFwiY29udGV4dFBhdGhcIikgJiZcblx0XHRcdFx0IW9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuaGFzT3duUHJvcGVydHkoc0F0dHJpYnV0ZU5hbWUpXG5cdFx0XHQpIHtcblx0XHRcdFx0b1NldHRpbmdzLmJpbmRpbmdDb250ZXh0c1tzQXR0cmlidXRlTmFtZV0gPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIpIHtcblx0XHRcdFx0b1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCA9IG1Db250ZXh0c1tzQXR0cmlidXRlTmFtZV07XG5cdFx0XHR9XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQXR0cmlidXRlTmFtZV0gPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtTWlzc2luZ0NvbnRleHRbc0F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHsgbU1pc3NpbmdDb250ZXh0LCBwcm9wZXJ0eVZhbHVlczogcHJvcGVydHlWYWx1ZXMgfTtcbn1cblxuZXhwb3J0IHR5cGUgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uID0ge1xuXHRrZXk6IHN0cmluZztcblx0cG9zaXRpb246IFBvc2l0aW9uO1xuXHR0eXBlOiBcIlNsb3RcIjtcbn07XG5mdW5jdGlvbiBwYXJzZUFnZ3JlZ2F0aW9uKG9BZ2dyZWdhdGlvbj86IEVsZW1lbnQsIHByb2Nlc3NBZ2dyZWdhdGlvbnM/OiBGdW5jdGlvbikge1xuXHRjb25zdCBvT3V0T2JqZWN0czogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uPiA9IHt9O1xuXHRpZiAob0FnZ3JlZ2F0aW9uICYmIG9BZ2dyZWdhdGlvbi5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgY2hpbGRyZW4gPSBvQWdncmVnYXRpb24uY2hpbGRyZW47XG5cdFx0Zm9yIChsZXQgY2hpbGRJZHggPSAwOyBjaGlsZElkeCA8IGNoaWxkcmVuLmxlbmd0aDsgY2hpbGRJZHgrKykge1xuXHRcdFx0Y29uc3QgY2hpbGREZWZpbml0aW9uID0gY2hpbGRyZW5bY2hpbGRJZHhdO1xuXHRcdFx0bGV0IGNoaWxkS2V5ID0gY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcImtleVwiKSB8fCBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwiaWRcIik7XG5cdFx0XHRpZiAoY2hpbGRLZXkpIHtcblx0XHRcdFx0Y2hpbGRLZXkgPSBgSW5saW5lWE1MXyR7Y2hpbGRLZXl9YDtcblx0XHRcdFx0Y2hpbGREZWZpbml0aW9uLnNldEF0dHJpYnV0ZShcImtleVwiLCBjaGlsZEtleSk7XG5cdFx0XHRcdGxldCBhZ2dyZWdhdGlvbk9iamVjdDogQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uID0ge1xuXHRcdFx0XHRcdGtleTogY2hpbGRLZXksXG5cdFx0XHRcdFx0cG9zaXRpb246IHtcblx0XHRcdFx0XHRcdHBsYWNlbWVudDogKGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJwbGFjZW1lbnRcIikgYXMgUGxhY2VtZW50KSB8fCBQbGFjZW1lbnQuQWZ0ZXIsXG5cdFx0XHRcdFx0XHRhbmNob3I6IGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJhbmNob3JcIikgfHwgdW5kZWZpbmVkXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR0eXBlOiBcIlNsb3RcIlxuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAocHJvY2Vzc0FnZ3JlZ2F0aW9ucykge1xuXHRcdFx0XHRcdGFnZ3JlZ2F0aW9uT2JqZWN0ID0gcHJvY2Vzc0FnZ3JlZ2F0aW9ucyhjaGlsZERlZmluaXRpb24sIGFnZ3JlZ2F0aW9uT2JqZWN0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvT3V0T2JqZWN0c1thZ2dyZWdhdGlvbk9iamVjdC5rZXldID0gYWdncmVnYXRpb25PYmplY3Q7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvT3V0T2JqZWN0cztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0NoaWxkcmVuKFxuXHRvTm9kZTogRWxlbWVudCxcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2ssXG5cdG9NZXRhZGF0YTogUmVzb2x2ZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdGlzUHVibGljOiBib29sZWFuLFxuXHRwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWU+LFxuXHRhcGlWZXJzaW9uPzogbnVtYmVyXG4pIHtcblx0Y29uc3Qgb0FnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgRWxlbWVudD4gPSB7fTtcblx0aWYgKG9Ob2RlLmZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsKSB7XG5cdFx0bGV0IG9GaXJzdEVsZW1lbnRDaGlsZDogRWxlbWVudCB8IG51bGwgPSBvTm9kZS5maXJzdEVsZW1lbnRDaGlsZCBhcyBFbGVtZW50IHwgbnVsbDtcblx0XHRpZiAoYXBpVmVyc2lvbiA9PT0gMikge1xuXHRcdFx0d2hpbGUgKG9GaXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCkge1xuXHRcdFx0XHRjb25zdCBzQ2hpbGROYW1lID0gb0ZpcnN0RWxlbWVudENoaWxkLmxvY2FsTmFtZTtcblx0XHRcdFx0bGV0IHNBZ2dyZWdhdGlvbk5hbWUgPSBzQ2hpbGROYW1lO1xuXHRcdFx0XHRpZiAoc0FnZ3JlZ2F0aW9uTmFtZVswXS50b1VwcGVyQ2FzZSgpID09PSBzQWdncmVnYXRpb25OYW1lWzBdKSB7XG5cdFx0XHRcdFx0Ly8gbm90IGEgc3ViIGFnZ3JlZ2F0aW9uLCBnbyBiYWNrIHRvIGRlZmF1bHQgQWdncmVnYXRpb25cblx0XHRcdFx0XHRzQWdncmVnYXRpb25OYW1lID0gb01ldGFkYXRhLmRlZmF1bHRBZ2dyZWdhdGlvbiB8fCBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbiA9IG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV07XG5cdFx0XHRcdGlmIChhZ2dyZWdhdGlvbkRlZmluaXRpb24gIT09IHVuZGVmaW5lZCAmJiAhYWdncmVnYXRpb25EZWZpbml0aW9uLnNsb3QpIHtcblx0XHRcdFx0XHRjb25zdCBwYXJzZWRBZ2dyZWdhdGlvbiA9IHBhcnNlQWdncmVnYXRpb24ob0ZpcnN0RWxlbWVudENoaWxkLCBhZ2dyZWdhdGlvbkRlZmluaXRpb24ucHJvY2Vzc0FnZ3JlZ2F0aW9ucyk7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbc0FnZ3JlZ2F0aW9uTmFtZV0gPSBwYXJzZWRBZ2dyZWdhdGlvbjtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHBhcnNlZEFnZ3JlZ2F0aW9uS2V5IGluIHBhcnNlZEFnZ3JlZ2F0aW9uKSB7XG5cdFx0XHRcdFx0XHRvTWV0YWRhdGEuYWdncmVnYXRpb25zW3BhcnNlZEFnZ3JlZ2F0aW9uS2V5XSA9IHBhcnNlZEFnZ3JlZ2F0aW9uW3BhcnNlZEFnZ3JlZ2F0aW9uS2V5XTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0b0ZpcnN0RWxlbWVudENoaWxkID0gb0ZpcnN0RWxlbWVudENoaWxkLm5leHRFbGVtZW50U2libGluZztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoYXBpVmVyc2lvbiAhPT0gMikge1xuXHRcdFx0Ly8gSWYgdGhlcmUgYXJlIGFnZ3JlZ2F0aW9uIHdlIG5lZWQgdG8gdmlzaXQgdGhlIGNoaWxkTm9kZXMgdG8gcmVzb2x2ZSB0ZW1wbGF0aW5nIGluc3RydWN0aW9uc1xuXHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXRDaGlsZE5vZGVzKG9Ob2RlKTtcblx0XHR9XG5cdFx0b0ZpcnN0RWxlbWVudENoaWxkID0gb05vZGUuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0d2hpbGUgKG9GaXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCkge1xuXHRcdFx0Y29uc3Qgb05leHRDaGlsZDogRWxlbWVudCB8IG51bGwgPSBvRmlyc3RFbGVtZW50Q2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuXHRcdFx0Y29uc3Qgc0NoaWxkTmFtZSA9IG9GaXJzdEVsZW1lbnRDaGlsZC5sb2NhbE5hbWU7XG5cdFx0XHRsZXQgc0FnZ3JlZ2F0aW9uTmFtZSA9IHNDaGlsZE5hbWU7XG5cdFx0XHRpZiAoc0FnZ3JlZ2F0aW9uTmFtZVswXS50b1VwcGVyQ2FzZSgpID09PSBzQWdncmVnYXRpb25OYW1lWzBdKSB7XG5cdFx0XHRcdC8vIG5vdCBhIHN1YiBhZ2dyZWdhdGlvbiwgZ28gYmFjayB0byBkZWZhdWx0IEFnZ3JlZ2F0aW9uXG5cdFx0XHRcdHNBZ2dyZWdhdGlvbk5hbWUgPSBvTWV0YWRhdGEuZGVmYXVsdEFnZ3JlZ2F0aW9uIHx8IFwiXCI7XG5cdFx0XHR9XG5cdFx0XHRpZiAoXG5cdFx0XHRcdE9iamVjdC5rZXlzKG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnMpLmluZGV4T2Yoc0FnZ3JlZ2F0aW9uTmFtZSkgIT09IC0xICYmXG5cdFx0XHRcdCghaXNQdWJsaWMgfHwgb01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXS5pc1B1YmxpYyA9PT0gdHJ1ZSlcblx0XHRcdCkge1xuXHRcdFx0XHRpZiAoYXBpVmVyc2lvbiA9PT0gMikge1xuXHRcdFx0XHRcdGNvbnN0IGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbiA9IG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV07XG5cdFx0XHRcdFx0aWYgKCFhZ2dyZWdhdGlvbkRlZmluaXRpb24uc2xvdCAmJiBvRmlyc3RFbGVtZW50Q2hpbGQgIT09IG51bGwgJiYgb0ZpcnN0RWxlbWVudENoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0Tm9kZShvRmlyc3RFbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdFx0bGV0IGNoaWxkRGVmaW5pdGlvbiA9IG9GaXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0XHRcdHdoaWxlIChjaGlsZERlZmluaXRpb24pIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgbmV4dENoaWxkID0gY2hpbGREZWZpbml0aW9uLm5leHRFbGVtZW50U2libGluZztcblx0XHRcdFx0XHRcdFx0aWYgKCFhZ2dyZWdhdGlvbkRlZmluaXRpb24uaGFzVmlydHVhbE5vZGUpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBjaGlsZFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMob05vZGUubmFtZXNwYWNlVVJJLCBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwia2V5XCIpISk7XG5cdFx0XHRcdFx0XHRcdFx0Y2hpbGRXcmFwcGVyLmFwcGVuZENoaWxkKGNoaWxkRGVmaW5pdGlvbik7XG5cdFx0XHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwia2V5XCIpIV0gPSBjaGlsZFdyYXBwZXI7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwia2V5XCIpIV0gPSBjaGlsZERlZmluaXRpb247XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRjaGlsZERlZmluaXRpb24ucmVtb3ZlQXR0cmlidXRlKFwia2V5XCIpO1xuXHRcdFx0XHRcdFx0XHRjaGlsZERlZmluaXRpb24gPSBuZXh0Q2hpbGQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhZ2dyZWdhdGlvbkRlZmluaXRpb24uc2xvdCkge1xuXHRcdFx0XHRcdFx0aWYgKHNBZ2dyZWdhdGlvbk5hbWUgIT09IHNDaGlsZE5hbWUpIHtcblx0XHRcdFx0XHRcdFx0aWYgKCFvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb05ld0NoaWxkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG9Ob2RlLm5hbWVzcGFjZVVSSSwgc0FnZ3JlZ2F0aW9uTmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXSA9IG9OZXdDaGlsZDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLmFwcGVuZENoaWxkKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdID0gb0ZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhd2FpdCBvVmlzaXRvci52aXNpdE5vZGUob0ZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHRvQWdncmVnYXRpb25zW29GaXJzdEVsZW1lbnRDaGlsZC5sb2NhbE5hbWVdID0gb0ZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKE9iamVjdC5rZXlzKG9NZXRhZGF0YS5wcm9wZXJ0aWVzKS5pbmRleE9mKHNBZ2dyZWdhdGlvbk5hbWUpICE9PSAtMSkge1xuXHRcdFx0XHRhd2FpdCBvVmlzaXRvci52aXNpdE5vZGUob0ZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdFx0aWYgKG9NZXRhZGF0YS5wcm9wZXJ0aWVzW3NBZ2dyZWdhdGlvbk5hbWVdLnR5cGUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHQvLyBPYmplY3QgVHlwZSBwcm9wZXJ0aWVzXG5cdFx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25Qcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWUyIHwgUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWUyPj4gPSB7fTtcblx0XHRcdFx0XHRjb25zdCBhdHRyaWJ1dGVOYW1lcyA9IG9GaXJzdEVsZW1lbnRDaGlsZC5nZXRBdHRyaWJ1dGVOYW1lcygpO1xuXHRcdFx0XHRcdGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBhdHRyaWJ1dGVOYW1lcykge1xuXHRcdFx0XHRcdFx0YWdncmVnYXRpb25Qcm9wZXJ0eVZhbHVlc1thdHRyaWJ1dGVOYW1lXSA9IG9GaXJzdEVsZW1lbnRDaGlsZC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChvRmlyc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW4ubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHQvL3JldHJpZXZlIG9uZSBsZXZlbCBzdWJPYmplY3QgcHJvcGVydGllc1xuXHRcdFx0XHRcdFx0Zm9yIChsZXQgY2hpbGRJbmRleCA9IDA7IGNoaWxkSW5kZXggPCBvRmlyc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW4ubGVuZ3RoOyBjaGlsZEluZGV4KyspIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc3ViQ2hpbGQgPSBvRmlyc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW5bY2hpbGRJbmRleF07XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHN1Yk9iamVjdEtleSA9IHN1YkNoaWxkLmxvY2FsTmFtZTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc3ViT2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RWYWx1ZTI+ID0ge307XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHN1YkNoaWxkQXR0cmlidXRlTmFtZXMgPSBzdWJDaGlsZC5nZXRBdHRyaWJ1dGVOYW1lcygpO1xuXHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IHN1YkNoaWxkQXR0cmlidXRlTmFtZSBvZiBzdWJDaGlsZEF0dHJpYnV0ZU5hbWVzKSB7XG5cdFx0XHRcdFx0XHRcdFx0c3ViT2JqZWN0W3N1YkNoaWxkQXR0cmlidXRlTmFtZV0gPSBzdWJDaGlsZC5nZXRBdHRyaWJ1dGUoc3ViQ2hpbGRBdHRyaWJ1dGVOYW1lKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRhZ2dyZWdhdGlvblByb3BlcnR5VmFsdWVzW3N1Yk9iamVjdEtleV0gPSBzdWJPYmplY3Q7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NBZ2dyZWdhdGlvbk5hbWVdID0gYWdncmVnYXRpb25Qcm9wZXJ0eVZhbHVlcztcblx0XHRcdFx0fSBlbHNlIGlmIChvTWV0YWRhdGEucHJvcGVydGllc1tzQWdncmVnYXRpb25OYW1lXS50eXBlID09PSBcImFycmF5XCIpIHtcblx0XHRcdFx0XHRpZiAob0ZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsICYmIG9GaXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBjaGlsZHJlbiA9IG9GaXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbjtcblx0XHRcdFx0XHRcdGNvbnN0IG9PdXRPYmplY3RzOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RWYWx1ZTI+W10gPSBbXTtcblx0XHRcdFx0XHRcdGZvciAobGV0IGNoaWxkSWR4ID0gMDsgY2hpbGRJZHggPCBjaGlsZHJlbi5sZW5ndGg7IGNoaWxkSWR4KyspIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY2hpbGREZWZpbml0aW9uID0gY2hpbGRyZW5bY2hpbGRJZHhdO1xuXHRcdFx0XHRcdFx0XHQvLyBub24ga2V5ZWQgY2hpbGQsIGp1c3QgYWRkIGl0IHRvIHRoZSBhZ2dyZWdhdGlvblxuXHRcdFx0XHRcdFx0XHRjb25zdCBteUNoaWxkOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RWYWx1ZTI+ID0ge307XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZU5hbWVzID0gY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZU5hbWVzKCk7XG5cdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBhdHRyaWJ1dGVOYW1lcykge1xuXHRcdFx0XHRcdFx0XHRcdG15Q2hpbGRbYXR0cmlidXRlTmFtZV0gPSBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdG9PdXRPYmplY3RzLnB1c2gobXlDaGlsZCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQWdncmVnYXRpb25OYW1lXSA9IG9PdXRPYmplY3RzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRvRmlyc3RFbGVtZW50Q2hpbGQgPSBvTmV4dENoaWxkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb0FnZ3JlZ2F0aW9ucztcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1Nsb3RzKFxuXHRvQWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBFbGVtZW50Pixcblx0b01ldGFkYXRhQWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uPixcblx0b05vZGU6IEVsZW1lbnQsXG5cdHByb2Nlc3NDdXN0b21EYXRhID0gZmFsc2Vcbikge1xuXHRpZiAoT2JqZWN0LmtleXMob0FnZ3JlZ2F0aW9ucykubGVuZ3RoID4gMCkge1xuXHRcdE9iamVjdC5rZXlzKG9BZ2dyZWdhdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKHNBZ2dyZWdhdGlvbk5hbWU6IHN0cmluZykge1xuXHRcdFx0Y29uc3Qgb0FnZ3JlZ2F0aW9uRWxlbWVudCA9IG9BZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV07XG5cdFx0XHRpZiAob05vZGUgIT09IG51bGwgJiYgb05vZGUgIT09IHVuZGVmaW5lZCAmJiBvQWdncmVnYXRpb25FbGVtZW50KSB7XG5cdFx0XHRcdC8vIHNsb3RzIGNhbiBoYXZlIDo6IGFzIGtleXMgd2hpY2ggaXMgbm90IGEgdmFsaWQgYWdncmVnYXRpb24gbmFtZSB0aGVyZWZvcmUgcmVwbGFjaW5nIHRoZW1cblx0XHRcdFx0Y29uc3Qgb0VsZW1lbnRDaGlsZCA9IG9BZ2dyZWdhdGlvbkVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lICE9PSBcImN1c3RvbURhdGFcIiAmJiBzQWdncmVnYXRpb25OYW1lICE9PSBcImRlcGVuZGVudHNcIikge1xuXHRcdFx0XHRcdGNvbnN0IHNTbG90TmFtZSA9XG5cdFx0XHRcdFx0XHQob01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdICE9PSB1bmRlZmluZWQgJiYgb01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLnNsb3QpIHx8XG5cdFx0XHRcdFx0XHRzQWdncmVnYXRpb25OYW1lO1xuXHRcdFx0XHRcdGNvbnN0IG9UYXJnZXRFbGVtZW50ID0gb05vZGUucXVlcnlTZWxlY3Rvcihgc2xvdFtuYW1lPScke3NTbG90TmFtZX0nXWApO1xuXHRcdFx0XHRcdGlmIChvVGFyZ2V0RWxlbWVudCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb05ld0NoaWxkID0gcHJlcGFyZUFnZ3JlZ2F0aW9uRWxlbWVtbnQob05vZGUsIHNBZ2dyZWdhdGlvbk5hbWUsIG9FbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdFx0b1RhcmdldEVsZW1lbnQucmVwbGFjZVdpdGgoLi4uKG9OZXdDaGlsZC5jaGlsZHJlbiBhcyB1bmtub3duIGFzIE5vZGVbXSkpOyAvLyBTb21laG93IFRTIGRvZXNuJ3QgbGlrZSB0aGlzIGJ1dCB0aGUgZG9jdW1lbnRhdGlvbiBzYXlzIGlzIHNob3VsZCB3b3JrXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHByb2Nlc3NDdXN0b21EYXRhICYmIG9FbGVtZW50Q2hpbGQgIT09IG51bGwpIHtcblx0XHRcdFx0XHRjb25zdCBvTmV3Q2hpbGQgPSBwcmVwYXJlQWdncmVnYXRpb25FbGVtZW1udChvTm9kZSwgc0FnZ3JlZ2F0aW9uTmFtZSwgb0VsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0b05vZGUuYXBwZW5kQ2hpbGQob05ld0NoaWxkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVBZ2dyZWdhdGlvbkVsZW1lbW50KG9Ob2RlOiBFbGVtZW50LCBzQWdncmVnYXRpb25OYW1lOiBzdHJpbmcsIG9FbGVtZW50Q2hpbGQ6IEVsZW1lbnQgfCBudWxsKSB7XG5cdGNvbnN0IG9OZXdDaGlsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhvTm9kZS5uYW1lc3BhY2VVUkksIHNBZ2dyZWdhdGlvbk5hbWUucmVwbGFjZSgvOi9naSwgXCJfXCIpKTtcblx0d2hpbGUgKG9FbGVtZW50Q2hpbGQpIHtcblx0XHRjb25zdCBvTmV4dENoaWxkID0gb0VsZW1lbnRDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0b05ld0NoaWxkLmFwcGVuZENoaWxkKG9FbGVtZW50Q2hpbGQpO1xuXHRcdG9FbGVtZW50Q2hpbGQgPSBvTmV4dENoaWxkO1xuXHR9XG5cdHJldHVybiBvTmV3Q2hpbGQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NCdWlsZGluZ0Jsb2NrKFxuXHRidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbjogQnVpbGRpbmdCbG9ja0RlZmluaXRpb24sXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjayxcblx0aXNQdWJsaWMgPSBmYWxzZVxuKSB7XG5cdGNvbnN0IHNGcmFnbWVudE5hbWUgPVxuXHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmZyYWdtZW50IHx8XG5cdFx0YCR7YnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZXNwYWNlfS4ke2J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLnhtbFRhZyB8fCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lfWA7XG5cblx0Y29uc3Qgc05hbWUgPSBcInRoaXNcIjtcblxuXHRjb25zdCBtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+ID0ge307XG5cdGNvbnN0IG9NZXRhZGF0YUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBDb250ZXh0PiA9IHt9O1xuXHRjb25zdCBvU2V0dGluZ3MgPSBvVmlzaXRvci5nZXRTZXR0aW5ncygpO1xuXHQvLyBUT0RPIDAwMDEgTW92ZSB0aGlzIGVsc2V3aGVyZSB0aGlzIGlzIHdlaXJkIDopXG5cdGlmIChvU2V0dGluZ3MubW9kZWxzW1wic2FwLmZlLmkxOG5cIl0pIHtcblx0XHQob1NldHRpbmdzLm1vZGVsc1tcInNhcC5mZS5pMThuXCJdLmdldFJlc291cmNlQnVuZGxlKCkgYXMgUHJvbWlzZTxSZXNvdXJjZUJ1bmRsZT4pXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob1Jlc291cmNlQnVuZGxlOiBSZXNvdXJjZUJ1bmRsZSkge1xuXHRcdFx0XHRSZXNvdXJjZU1vZGVsLnNldEFwcGxpY2F0aW9uSTE4bkJ1bmRsZShvUmVzb3VyY2VCdW5kbGUpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9KTtcblx0fVxuXHRjb25zdCBvTWV0YWRhdGEgPSBwcmVwYXJlTWV0YWRhdGEoYnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubWV0YWRhdGEsIGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmlzT3BlbiwgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uYXBpVmVyc2lvbik7XG5cblx0Ly9JbmplY3Qgc3RvcmFnZSBmb3IgbWFjcm9zXG5cdGlmICghb1NldHRpbmdzW3NGcmFnbWVudE5hbWVdKSB7XG5cdFx0b1NldHRpbmdzW3NGcmFnbWVudE5hbWVdID0ge307XG5cdH1cblxuXHQvLyBGaXJzdCBvZiBhbGwgd2UgbmVlZCB0byB2aXNpdCB0aGUgYXR0cmlidXRlcyB0byByZXNvbHZlIHRoZSBwcm9wZXJ0aWVzIGFuZCB0aGUgbWV0YWRhdGEgY29udGV4dHNcblx0bGV0IHByb3BlcnR5VmFsdWVzID0gYXdhaXQgcHJvY2Vzc1Byb3BlcnRpZXMob01ldGFkYXRhLCBvTm9kZSwgaXNQdWJsaWMsIG9WaXNpdG9yLCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uKTtcblxuXHRjb25zdCB7IG1NaXNzaW5nQ29udGV4dCwgcHJvcGVydHlWYWx1ZXM6IGV4dHJhUHJvcGVydHlWYWx1ZXMgfSA9IHByb2Nlc3NDb250ZXh0cyhcblx0XHRvTWV0YWRhdGEsXG5cdFx0b1NldHRpbmdzLFxuXHRcdG9Ob2RlLFxuXHRcdGlzUHVibGljLFxuXHRcdG9WaXNpdG9yLFxuXHRcdG1Db250ZXh0cyxcblx0XHRvTWV0YWRhdGFDb250ZXh0c1xuXHQpO1xuXHRwcm9wZXJ0eVZhbHVlcyA9IE9iamVjdC5hc3NpZ24ocHJvcGVydHlWYWx1ZXMsIGV4dHJhUHJvcGVydHlWYWx1ZXMpO1xuXHRjb25zdCBpbml0aWFsS2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnR5VmFsdWVzKTtcblx0dHJ5IHtcblx0XHQvLyBBZ2dyZWdhdGlvbiBhbmQgY29tcGxleCB0eXBlIHN1cHBvcnRcblx0XHRjb25zdCBvQWdncmVnYXRpb25zID0gYXdhaXQgcHJvY2Vzc0NoaWxkcmVuKFxuXHRcdFx0b05vZGUsXG5cdFx0XHRvVmlzaXRvcixcblx0XHRcdG9NZXRhZGF0YSxcblx0XHRcdGlzUHVibGljLFxuXHRcdFx0cHJvcGVydHlWYWx1ZXMsXG5cdFx0XHRidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uXG5cdFx0KTtcblx0XHRsZXQgb0luc3RhbmNlOiBCdWlsZGluZ0Jsb2NrQmFzZSB8IHVuZGVmaW5lZDtcblx0XHRsZXQgb0NvbnRyb2xDb25maWcgPSB7fTtcblxuXHRcdGlmIChvU2V0dGluZ3MubW9kZWxzLnZpZXdEYXRhKSB7XG5cdFx0XHQvLyBPbmx5IHVzZWQgaW4gdGhlIEZpZWxkIG1hY3JvIGFuZCBldmVuIHRoZW4gbWF5YmUgbm90IHJlYWxseSB1c2VmdWxcblx0XHRcdG9Db250cm9sQ29uZmlnID0gb1NldHRpbmdzLm1vZGVscy52aWV3RGF0YS5nZXRQcm9wZXJ0eShcIi9jb250cm9sQ29uZmlndXJhdGlvblwiKTtcblx0XHR9XG5cdFx0bGV0IHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzID0gcHJvcGVydHlWYWx1ZXM7XG5cdFx0aWYgKGlzVjFNYWNyb0RlZihidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbikgJiYgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uY3JlYXRlKSB7XG5cdFx0XHRwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyA9IGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmNyZWF0ZS5jYWxsKFxuXHRcdFx0XHRidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbixcblx0XHRcdFx0cHJvcGVydHlWYWx1ZXMsXG5cdFx0XHRcdG9Db250cm9sQ29uZmlnLFxuXHRcdFx0XHRvU2V0dGluZ3MsXG5cdFx0XHRcdG9BZ2dyZWdhdGlvbnMsXG5cdFx0XHRcdGlzUHVibGljXG5cdFx0XHQpO1xuXHRcdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHMpLmZvckVhY2goZnVuY3Rpb24gKHNNZXRhZGF0YU5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRpZiAob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHNbc01ldGFkYXRhTmFtZV0uY29tcHV0ZWQgPT09IHRydWUpIHtcblx0XHRcdFx0XHRtQ29udGV4dHNbc01ldGFkYXRhTmFtZV0gPSBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlc1tzTWV0YWRhdGFOYW1lXSBhcyB1bmtub3duIGFzIENvbnRleHQ7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0T2JqZWN0LmtleXMobU1pc3NpbmdDb250ZXh0KS5mb3JFYWNoKGZ1bmN0aW9uIChzQ29udGV4dE5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRpZiAocHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMuaGFzT3duUHJvcGVydHkoc0NvbnRleHROYW1lKSkge1xuXHRcdFx0XHRcdG1Db250ZXh0c1tzQ29udGV4dE5hbWVdID0gcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXNbc0NvbnRleHROYW1lXSBhcyB1bmtub3duIGFzIENvbnRleHQ7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0gZWxzZSBpZiAoYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uYXBpVmVyc2lvbiA9PT0gMikge1xuXHRcdFx0T2JqZWN0LmtleXMocHJvcGVydHlWYWx1ZXMpLmZvckVhY2goKHByb3BOYW1lKSA9PiB7XG5cdFx0XHRcdGxldCBvRGF0YSA9IHByb3BlcnR5VmFsdWVzW3Byb3BOYW1lXSBhcyB1bmtub3duIGFzIENvbnRleHQ7XG5cdFx0XHRcdC8vY2hlY2sgZm9yIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyBmdW5jdGlvbiB0byB2YWxpZGF0ZSAvIG92ZXJ3cml0ZSBwYXJhbWV0ZXJzXG5cdFx0XHRcdGNvbnN0IG9yaWdpbmFsRGVmaW5pdGlvbiA9IGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uPy5tZXRhZGF0YT8ucHJvcGVydGllc1twcm9wTmFtZV07XG5cdFx0XHRcdGlmIChvcmlnaW5hbERlZmluaXRpb24/LnZhbGlkYXRlKSB7XG5cdFx0XHRcdFx0b0RhdGEgPSBvcmlnaW5hbERlZmluaXRpb24udmFsaWRhdGUob0RhdGEpIHx8IG9EYXRhO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRvRGF0YSAmJlxuXHRcdFx0XHRcdG9EYXRhLmlzQSAmJlxuXHRcdFx0XHRcdG9EYXRhLmlzQShTQVBfVUlfTU9ERUxfQ09OVEVYVCkgJiZcblx0XHRcdFx0XHQhb0RhdGEuZ2V0TW9kZWwoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNZXRhTW9kZWxcIilcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbcHJvcE5hbWVdID0gb0RhdGEuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgQnVpbGRpbmdCbG9ja0NsYXNzID0gYnVpbGRpbmdCbG9ja0RlZmluaXRpb24gYXMgdHlwZW9mIEJ1aWxkaW5nQmxvY2tCYXNlO1xuXHRcdFx0cHJvcGVydHlWYWx1ZXMuaXNQdWJsaWMgPSBpc1B1YmxpYztcblxuXHRcdFx0b0luc3RhbmNlID0gbmV3IEJ1aWxkaW5nQmxvY2tDbGFzcyhcblx0XHRcdFx0eyAuLi5wcm9wZXJ0eVZhbHVlcywgLi4ub0FnZ3JlZ2F0aW9ucyB9LFxuXHRcdFx0XHRvQ29udHJvbENvbmZpZyxcblx0XHRcdFx0b1NldHRpbmdzXG5cdFx0XHRcdC8qLCBvQ29udHJvbENvbmZpZywgb1NldHRpbmdzLCBvQWdncmVnYXRpb25zLCBpc1B1YmxpYyovXG5cdFx0XHQpO1xuXHRcdFx0cHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMgPSBvSW5zdGFuY2UuZ2V0UHJvcGVydGllcygpO1xuXHRcdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHMpLmZvckVhY2goZnVuY3Rpb24gKHNDb250ZXh0TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdGlmIChwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcy5oYXNPd25Qcm9wZXJ0eShzQ29udGV4dE5hbWUpKSB7XG5cdFx0XHRcdFx0Y29uc3QgdGFyZ2V0T2JqZWN0ID0gcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXNbc0NvbnRleHROYW1lXTtcblx0XHRcdFx0XHRpZiAodHlwZW9mIHRhcmdldE9iamVjdCA9PT0gXCJvYmplY3RcIiAmJiAhaXNDb250ZXh0KHRhcmdldE9iamVjdCkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHNBdHRyaWJ1dGVWYWx1ZSA9IHN0b3JlVmFsdWUodGFyZ2V0T2JqZWN0KTtcblx0XHRcdFx0XHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9IGAke3NBdHRyaWJ1dGVWYWx1ZX1gO1xuXHRcdFx0XHRcdFx0b1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LnNldFByb3BlcnR5KHNDb250ZXh0UGF0aCwgdGFyZ2V0T2JqZWN0KTtcblx0XHRcdFx0XHRcdGNvbnN0IG5ld0NvbnRleHQgPSBvU2V0dGluZ3MubW9kZWxzLmNvbnZlcnRlckNvbnRleHQuY3JlYXRlQmluZGluZ0NvbnRleHQoc0NvbnRleHRQYXRoKSE7XG5cdFx0XHRcdFx0XHRkZWxldGUgbXlTdG9yZVtzQXR0cmlidXRlVmFsdWVdO1xuXHRcdFx0XHRcdFx0bUNvbnRleHRzW3NDb250ZXh0TmFtZV0gPSBuZXdDb250ZXh0O1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIW1Db250ZXh0cy5oYXNPd25Qcm9wZXJ0eShzQ29udGV4dE5hbWUpICYmIHRhcmdldE9iamVjdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRtQ29udGV4dHNbc0NvbnRleHROYW1lXSA9IHRhcmdldE9iamVjdCBhcyBDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGNvbnN0IG9BdHRyaWJ1dGVzTW9kZWw6IEpTT05Nb2RlbCA9IG5ldyBBdHRyaWJ1dGVNb2RlbChvTm9kZSwgcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMsIGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uKTtcblx0XHRtQ29udGV4dHNbc05hbWVdID0gb0F0dHJpYnV0ZXNNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cdFx0bGV0IG9QcmV2aW91c01hY3JvSW5mbzogTWFjcm9JbmZvIHwgdW5kZWZpbmVkO1xuXG5cdFx0Ly8gS2VlcCB0cmFja1xuXHRcdGlmIChUcmFjZUluZm8uaXNUcmFjZUluZm9BY3RpdmUoKSkge1xuXHRcdFx0Y29uc3Qgb1RyYWNlSW5mbyA9IFRyYWNlSW5mby50cmFjZU1hY3JvQ2FsbHMoc0ZyYWdtZW50TmFtZSwgb01ldGFkYXRhLCBtQ29udGV4dHMsIG9Ob2RlLCBvVmlzaXRvcik7XG5cdFx0XHRpZiAob1RyYWNlSW5mbyAmJiAob1RyYWNlSW5mbyBhcyBUcmFjZU1ldGFkYXRhQ29udGV4dCkubWFjcm9JbmZvKSB7XG5cdFx0XHRcdG9QcmV2aW91c01hY3JvSW5mbyA9IG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl07XG5cdFx0XHRcdG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl0gPSAob1RyYWNlSW5mbyBhcyBUcmFjZU1ldGFkYXRhQ29udGV4dCkubWFjcm9JbmZvO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR2YWxpZGF0ZU1hY3JvU2lnbmF0dXJlKHNGcmFnbWVudE5hbWUsIG9NZXRhZGF0YSwgbUNvbnRleHRzLCBvTm9kZSk7XG5cblx0XHRjb25zdCBvQ29udGV4dFZpc2l0b3IgPSBvVmlzaXRvci53aXRoKFxuXHRcdFx0bUNvbnRleHRzLFxuXHRcdFx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb24uaXNPcGVuICE9PSB1bmRlZmluZWQgPyAhYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uaXNPcGVuIDogdHJ1ZVxuXHRcdCk7XG5cdFx0Y29uc3Qgb1BhcmVudCA9IG9Ob2RlLnBhcmVudE5vZGU7XG5cblx0XHRsZXQgaUNoaWxkSW5kZXg6IG51bWJlcjtcblx0XHRsZXQgb1Byb21pc2U7XG5cdFx0bGV0IHByb2Nlc3NDdXN0b21EYXRhID0gdHJ1ZTtcblx0XHRpZiAob1BhcmVudCkge1xuXHRcdFx0aUNoaWxkSW5kZXggPSBBcnJheS5mcm9tKG9QYXJlbnQuY2hpbGRyZW4pLmluZGV4T2Yob05vZGUpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoaXNWMU1hY3JvRGVmKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uKSAmJiBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5nZXRUZW1wbGF0ZSkgfHxcblx0XHRcdFx0KGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb24gPT09IDIgJiYgIWJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmZyYWdtZW50KVxuXHRcdFx0KSB7XG5cdFx0XHRcdGxldCB0ZW1wbGF0ZVN0cmluZzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRsZXQgYWRkRGVmYXVsdE5hbWVzcGFjZSA9IGZhbHNlO1xuXHRcdFx0XHRpZiAoYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uYXBpVmVyc2lvbiA9PT0gMiAmJiBvSW5zdGFuY2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHRlbXBsYXRlU3RyaW5nID0gb0luc3RhbmNlLmdldFRlbXBsYXRlIShvTm9kZSk7XG5cdFx0XHRcdFx0aWYgKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmlzUnVudGltZSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBteVN0b3JlS2V5IGluIG15U3RvcmUpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0RhdGEgPSBteVN0b3JlW215U3RvcmVLZXldO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzQ29udGV4dFBhdGggPSBgJHtteVN0b3JlS2V5fWA7XG5cdFx0XHRcdFx0XHRcdG9TZXR0aW5ncy5tb2RlbHMuY29udmVydGVyQ29udGV4dC5zZXRQcm9wZXJ0eShzQ29udGV4dFBhdGgsIG9EYXRhKTtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIG15U3RvcmVbbXlTdG9yZUtleV07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGFkZERlZmF1bHROYW1lc3BhY2UgPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmdldFRlbXBsYXRlKSB7XG5cdFx0XHRcdFx0dGVtcGxhdGVTdHJpbmcgPSBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5nZXRUZW1wbGF0ZShwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgaGFzRXJyb3IgPSBcIlwiO1xuXHRcdFx0XHRpZiAodGVtcGxhdGVTdHJpbmcpIHtcblx0XHRcdFx0XHRsZXQgaGFzUGFyc2VFcnJvciA9IGZhbHNlO1xuXHRcdFx0XHRcdGxldCBwYXJzZWRUZW1wbGF0ZSA9IHBhcnNlWE1MU3RyaW5nKHRlbXBsYXRlU3RyaW5nLCBhZGREZWZhdWx0TmFtZXNwYWNlKTtcblx0XHRcdFx0XHQvLyBGb3Igc2FmZXR5IHB1cnBvc2Ugd2UgdHJ5IHRvIGRldGVjdCB0cmFpbGluZyB0ZXh0IGluIGJldHdlZW4gWE1MIFRhZ3Ncblx0XHRcdFx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgcGFyc2VkVGVtcGxhdGUpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGl0ZXIgPSBkb2N1bWVudC5jcmVhdGVOb2RlSXRlcmF0b3IoZWxlbWVudCwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xuXHRcdFx0XHRcdFx0bGV0IHRleHRub2RlID0gaXRlci5uZXh0Tm9kZSgpO1xuXHRcdFx0XHRcdFx0aWYgKGVsZW1lbnQubG9jYWxOYW1lID09PSBcInBhcnNlcmVycm9yXCIpIHtcblx0XHRcdFx0XHRcdFx0aGFzUGFyc2VFcnJvciA9IHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR3aGlsZSAodGV4dG5vZGUpIHtcblx0XHRcdFx0XHRcdFx0aWYgKHRleHRub2RlLnRleHRDb250ZW50ICYmIHRleHRub2RlLnRleHRDb250ZW50LnRyaW0oKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0aGFzRXJyb3IgPSB0ZXh0bm9kZS50ZXh0Q29udGVudDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR0ZXh0bm9kZSA9IGl0ZXIubmV4dE5vZGUoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoaGFzUGFyc2VFcnJvcikge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgYSBwYXJzZWVycm9yIHdoaWxlIHByb2Nlc3NpbmcgdGhlIFhNTCBpdCBtZWFucyB0aGUgWE1MIGl0c2VsZiBpcyBtYWxmb3JtZWQsIGFzIHN1Y2ggd2UgcmVydW4gdGhlIHRlbXBsYXRlIHByb2Nlc3Ncblx0XHRcdFx0XHRcdC8vIFNldHRpbmcgaXNUcmFjZU1vZGUgdHJ1ZSB3aWxsIG1ha2UgaXQgc28gdGhhdCBlYWNoIHhtbGAgZXhwcmVzc2lvbiBpcyBjaGVja2VkIGZvciB2YWxpZGl0eSBmcm9tIFhNTCBwZXJzcGVjdGl2ZVxuXHRcdFx0XHRcdFx0Ly8gSWYgYW4gZXJyb3IgaXMgZm91bmQgaXQncyByZXR1cm5lZCBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgZnJhZ21lbnRcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcblx0XHRcdFx0XHRcdFx0YEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgYnVpbGRpbmcgYmxvY2sgJHtidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi54bWxUYWcgfHwgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZX1gXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0aXNUcmFjZU1vZGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBpbml0aWFsVGVtcGxhdGUgPSBvSW5zdGFuY2U/LmdldFRlbXBsYXRlXG5cdFx0XHRcdFx0XHRcdFx0PyBvSW5zdGFuY2UuZ2V0VGVtcGxhdGUob05vZGUpXG5cdFx0XHRcdFx0XHRcdFx0OiBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5nZXRUZW1wbGF0ZSEocHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMpO1xuXHRcdFx0XHRcdFx0XHRwYXJzZWRUZW1wbGF0ZSA9IHBhcnNlWE1MU3RyaW5nKGluaXRpYWxUZW1wbGF0ZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0XHRpc1RyYWNlTW9kZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoaGFzRXJyb3IubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgdHJhaWxpbmcgdGV4dCB3ZSBjcmVhdGUgYSBzdGFuZGFyZCBlcnJvciBhbmQgZGlzcGxheSBpdC5cblx0XHRcdFx0XHRcdExvZy5lcnJvcihcblx0XHRcdFx0XHRcdFx0YEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgYnVpbGRpbmcgYmxvY2sgJHtidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi54bWxUYWcgfHwgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZX1gXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0Vycm9yVGV4dCA9IGNyZWF0ZUVycm9yWE1MKFxuXHRcdFx0XHRcdFx0XHRbXG5cdFx0XHRcdFx0XHRcdFx0YEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgYnVpbGRpbmcgYmxvY2sgJHtidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi54bWxUYWcgfHwgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZX1gLFxuXHRcdFx0XHRcdFx0XHRcdGBUcmFpbGluZyB0ZXh0IHdhcyBmb3VuZCBpbiB0aGUgWE1MOiAke2hhc0Vycm9yfWBcblx0XHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdFx0cGFyc2VkVGVtcGxhdGUubWFwKCh0ZW1wbGF0ZSkgPT4gdGVtcGxhdGUub3V0ZXJIVE1MKS5qb2luKFwiXFxuXCIpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cGFyc2VkVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyhvRXJyb3JUZXh0LCB0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b05vZGUucmVwbGFjZVdpdGgoLi4ucGFyc2VkVGVtcGxhdGUpO1xuXHRcdFx0XHRcdG9Ob2RlID0gb1BhcmVudC5jaGlsZHJlbltpQ2hpbGRJbmRleF07XG5cdFx0XHRcdFx0cHJvY2Vzc1Nsb3RzKG9BZ2dyZWdhdGlvbnMsIG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnMsIG9Ob2RlLCBwcm9jZXNzQ3VzdG9tRGF0YSk7XG5cdFx0XHRcdFx0cHJvY2Vzc0N1c3RvbURhdGEgPSBmYWxzZTtcblx0XHRcdFx0XHRvUHJvbWlzZSA9IG9Db250ZXh0VmlzaXRvci52aXNpdE5vZGUob05vZGUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9Ob2RlLnJlbW92ZSgpO1xuXHRcdFx0XHRcdG9Qcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9Qcm9taXNlID0gb0NvbnRleHRWaXNpdG9yLmluc2VydEZyYWdtZW50KHNGcmFnbWVudE5hbWUsIG9Ob2RlKTtcblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgb1Byb21pc2U7XG5cdFx0XHRjb25zdCBvTWFjcm9FbGVtZW50ID0gb1BhcmVudC5jaGlsZHJlbltpQ2hpbGRJbmRleF07XG5cdFx0XHRwcm9jZXNzU2xvdHMob0FnZ3JlZ2F0aW9ucywgb01ldGFkYXRhLmFnZ3JlZ2F0aW9ucywgb01hY3JvRWxlbWVudCwgcHJvY2Vzc0N1c3RvbURhdGEpO1xuXHRcdFx0aWYgKG9NYWNyb0VsZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb25zdCBvUmVtYWluaW5nU2xvdHMgPSBvTWFjcm9FbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzbG90XCIpO1xuXHRcdFx0XHRvUmVtYWluaW5nU2xvdHMuZm9yRWFjaChmdW5jdGlvbiAob1Nsb3RFbGVtZW50KSB7XG5cdFx0XHRcdFx0b1Nsb3RFbGVtZW50LnJlbW92ZSgpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKG9QcmV2aW91c01hY3JvSW5mbykge1xuXHRcdFx0Ly9yZXN0b3JlIG1hY3JvIGluZm8gaWYgYXZhaWxhYmxlXG5cdFx0XHRvU2V0dGluZ3NbXCJfbWFjcm9JbmZvXCJdID0gb1ByZXZpb3VzTWFjcm9JbmZvO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkZWxldGUgb1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXTtcblx0XHR9XG5cdH0gY2F0Y2ggKGU6IHVua25vd24pIHtcblx0XHQvLyBJbiBjYXNlIHRoZXJlIGlzIGEgZ2VuZXJpYyBlcnJvciAodXN1YWxseSBjb2RlIGVycm9yKSwgd2UgcmV0cmlldmUgdGhlIGN1cnJlbnQgY29udGV4dCBpbmZvcm1hdGlvbiBhbmQgY3JlYXRlIGEgZGVkaWNhdGVkIGVycm9yIG1lc3NhZ2Vcblx0XHRjb25zdCB0cmFjZURldGFpbHMgPSB7XG5cdFx0XHRpbml0aWFsUHJvcGVydGllczoge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdFx0XHRyZXNvbHZlZFByb3BlcnRpZXM6IHt9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdFx0bWlzc2luZ0NvbnRleHRzOiBtTWlzc2luZ0NvbnRleHRcblx0XHR9O1xuXHRcdGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIGluaXRpYWxLZXlzKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZXNbcHJvcGVydHlOYW1lXTtcblx0XHRcdGlmIChpc0NvbnRleHQocHJvcGVydHlWYWx1ZSkpIHtcblx0XHRcdFx0dHJhY2VEZXRhaWxzLmluaXRpYWxQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB7XG5cdFx0XHRcdFx0cGF0aDogcHJvcGVydHlWYWx1ZS5nZXRQYXRoKCksXG5cdFx0XHRcdFx0dmFsdWU6IHByb3BlcnR5VmFsdWUuZ2V0T2JqZWN0KClcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRyYWNlRGV0YWlscy5pbml0aWFsUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gcHJvcGVydHlWYWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Zm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydHlWYWx1ZXMpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eU5hbWVdO1xuXHRcdFx0aWYgKCFpbml0aWFsS2V5cy5pbmNsdWRlcyhwcm9wZXJ0eU5hbWUpKSB7XG5cdFx0XHRcdGlmIChpc0NvbnRleHQocHJvcGVydHlWYWx1ZSkpIHtcblx0XHRcdFx0XHR0cmFjZURldGFpbHMucmVzb2x2ZWRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB7XG5cdFx0XHRcdFx0XHRwYXRoOiBwcm9wZXJ0eVZhbHVlLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdHZhbHVlOiBwcm9wZXJ0eVZhbHVlLmdldE9iamVjdCgpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0cmFjZURldGFpbHMucmVzb2x2ZWRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdExvZy5lcnJvcihlIGFzIHN0cmluZywgZSBhcyBzdHJpbmcpO1xuXHRcdGNvbnN0IG9FcnJvciA9IGNyZWF0ZUVycm9yWE1MKFxuXHRcdFx0W2BFcnJvciB3aGlsZSBwcm9jZXNzaW5nIGJ1aWxkaW5nIGJsb2NrICR7YnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZX1gXSxcblx0XHRcdG9Ob2RlLm91dGVySFRNTCxcblx0XHRcdHRyYWNlRGV0YWlscyxcblx0XHRcdChlIGFzIEVycm9yKS5zdGFja1xuXHRcdCk7XG5cdFx0Y29uc3Qgb1RlbXBsYXRlID0gcGFyc2VYTUxTdHJpbmcob0Vycm9yLCB0cnVlKTtcblx0XHRvTm9kZS5yZXBsYWNlV2l0aCguLi5vVGVtcGxhdGUpO1xuXHR9XG59XG5mdW5jdGlvbiBhZGRTaW5nbGVDb250ZXh0KFxuXHRtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQgfCB1bmRlZmluZWQ+LFxuXHRvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjayxcblx0b0N0eDoge1xuXHRcdG5hbWU/OiBzdHJpbmc7XG5cdFx0cGF0aDogc3RyaW5nO1xuXHRcdG1vZGVsPzogc3RyaW5nO1xuXHR9LFxuXHRvTWV0YWRhdGFDb250ZXh0czogUmVjb3JkPHN0cmluZywgQ29udGV4dCB8IHVuZGVmaW5lZD5cbikge1xuXHRjb25zdCBzS2V5ID0gKG9DdHgubmFtZSB8fCBvQ3R4Lm1vZGVsIHx8IHVuZGVmaW5lZCkgYXMgc3RyaW5nO1xuXHRpZiAob01ldGFkYXRhQ29udGV4dHNbc0tleV0pIHtcblx0XHRyZXR1cm47IC8vIGRvIG5vdCBhZGQgdHdpY2Vcblx0fVxuXHR0cnkge1xuXHRcdGxldCBzQ29udGV4dFBhdGggPSBvQ3R4LnBhdGg7XG5cdFx0aWYgKG9DdHgubW9kZWwgIT0gbnVsbCkge1xuXHRcdFx0c0NvbnRleHRQYXRoID0gYCR7b0N0eC5tb2RlbH0+JHtzQ29udGV4dFBhdGh9YDtcblx0XHR9XG5cdFx0Y29uc3QgbVNldHRpbmcgPSBvVmlzaXRvci5nZXRTZXR0aW5ncygpO1xuXHRcdGlmIChvQ3R4Lm1vZGVsID09PSBcImNvbnZlcnRlckNvbnRleHRcIiAmJiBvQ3R4LnBhdGgubGVuZ3RoID4gMCkge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWxdLmdldENvbnRleHQob0N0eC5wYXRoIC8qLCBtU2V0dGluZy5iaW5kaW5nQ29udGV4dHNbb0N0eC5tb2RlbF0qLyk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH0gZWxzZSBpZiAoIW1TZXR0aW5nLmJpbmRpbmdDb250ZXh0c1tvQ3R4Lm1vZGVsIV0gJiYgbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWwhXSkge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWwhXS5nZXRDb250ZXh0KG9DdHgucGF0aCk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtQ29udGV4dHNbc0tleV0gPSBvVmlzaXRvci5nZXRDb250ZXh0KHNDb250ZXh0UGF0aCk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH1cblxuXHRcdG9NZXRhZGF0YUNvbnRleHRzW3NLZXldID0gbUNvbnRleHRzW3NLZXldOyAvLyBtYWtlIGl0IGF2YWlsYWJsZSBpbnNpZGUgbWV0YWRhdGFDb250ZXh0cyBKU09OIG9iamVjdFxuXHR9IGNhdGNoIChleCkge1xuXHRcdC8vY29uc29sZS5lcnJvcihleCk7XG5cdFx0Ly8gaWdub3JlIHRoZSBjb250ZXh0IGFzIHRoaXMgY2FuIG9ubHkgYmUgdGhlIGNhc2UgaWYgdGhlIG1vZGVsIGlzIG5vdCByZWFkeSwgaS5lLiBub3QgYSBwcmVwcm9jZXNzaW5nIG1vZGVsIGJ1dCBtYXliZSBhIG1vZGVsIGZvclxuXHRcdC8vIHByb3ZpZGluZyBhZnRlcndhcmRzXG5cdFx0Ly8gVE9ETyAwMDAyIG5vdCB5ZXQgaW1wbGVtZW50ZWRcblx0XHQvL21Db250ZXh0c1tcIl8kZXJyb3JcIl0ub01vZGVsLnNldFByb3BlcnR5KFwiL1wiICsgc0tleSwgZXgpO1xuXHR9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBidWlsZGluZyBibG9jayBkZWZpbml0aW9uIHRvIGJlIHVzZWQgaW5zaWRlIHRoZSB4bWwgdGVtcGxhdGUgcHJvY2Vzc29yLlxuICpcbiAqIEBwYXJhbSBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiBUaGUgYnVpbGRpbmcgYmxvY2sgZGVmaW5pdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJCdWlsZGluZ0Jsb2NrKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uOiBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbik6IHZvaWQge1xuXHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdGFzeW5jIChvTm9kZTogRWxlbWVudCwgb1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2spID0+IHByb2Nlc3NCdWlsZGluZ0Jsb2NrKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLCBvTm9kZSwgb1Zpc2l0b3IpLFxuXHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWVzcGFjZSxcblx0XHRidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi54bWxUYWcgfHwgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZVxuXHQpO1xuXHRpZiAoYnVpbGRpbmdCbG9ja0RlZmluaXRpb24ucHVibGljTmFtZXNwYWNlKSB7XG5cdFx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihcblx0XHRcdGFzeW5jIChvTm9kZTogRWxlbWVudCwgb1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2spID0+IHByb2Nlc3NCdWlsZGluZ0Jsb2NrKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLCBvTm9kZSwgb1Zpc2l0b3IsIHRydWUpLFxuXHRcdFx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb24ucHVibGljTmFtZXNwYWNlLFxuXHRcdFx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb24ueG1sVGFnIHx8IGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWVcblx0XHQpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVycm9yWE1MKGVycm9yTWVzc2FnZXM6IHN0cmluZ1tdLCB4bWxGcmFnbWVudDogc3RyaW5nLCBhZGRpdGlvbmFsRGF0YT86IG9iamVjdCwgc3RhY2s/OiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCBlcnJvckxhYmVscyA9IGVycm9yTWVzc2FnZXMubWFwKChlcnJvck1lc3NhZ2UpID0+IHhtbGA8bTpMYWJlbCB0ZXh0PVwiJHtlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZShlcnJvck1lc3NhZ2UpfVwiLz5gKTtcblx0bGV0IGVycm9yU3RhY2sgPSBcIlwiO1xuXHRpZiAoc3RhY2spIHtcblx0XHRjb25zdCBzdGFja0Zvcm1hdHRlZCA9IGJ0b2EoYDxwcmU+JHtzdGFja308L3ByZT5gKTtcblx0XHRlcnJvclN0YWNrID0geG1sYDxtOkZvcm1hdHRlZFRleHQgaHRtbFRleHQ9XCIke2B7PSBCQkYuYmFzZTY0RGVjb2RlKCcke3N0YWNrRm9ybWF0dGVkfScpIH1gfVwiIC8+YDtcblx0fVxuXHRsZXQgYWRkaXRpb25hbFRleHQgPSBcIlwiO1xuXHRpZiAoYWRkaXRpb25hbERhdGEpIHtcblx0XHRhZGRpdGlvbmFsVGV4dCA9IHhtbGA8bTpWQm94PlxuXHRcdFx0XHRcdFx0PG06TGFiZWwgdGV4dD1cIlRyYWNlIEluZm9cIi8+XG5cdFx0XHRcdFx0XHQ8Y29kZTpDb2RlRWRpdG9yIHR5cGU9XCJqc29uXCIgIHZhbHVlPVwiJHtgez0gQkJGLmJhc2U2NERlY29kZSgnJHtidG9hKEpTT04uc3RyaW5naWZ5KGFkZGl0aW9uYWxEYXRhLCBudWxsLCA0KSl9JykgfWB9XCIgaGVpZ2h0PVwiMzAwcHhcIiAvPlxuXHRcdFx0XHRcdDwvbTpWQm94PmA7XG5cdH1cblx0cmV0dXJuIHhtbGA8bTpWQm94IHhtbG5zOm09XCJzYXAubVwiIHhtbG5zOmNvZGU9XCJzYXAudWkuY29kZWVkaXRvclwiIGNvcmU6cmVxdWlyZT1cIntCQkY6J3NhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL0J1aWxkaW5nQmxvY2tGb3JtYXR0ZXInfVwiPlxuXHRcdFx0XHQke2Vycm9yTGFiZWxzfVxuXHRcdFx0XHQke2Vycm9yU3RhY2t9XG5cdFx0XHRcdDxncmlkOkNTU0dyaWQgZ3JpZFRlbXBsYXRlUm93cz1cImZyXCIgZ3JpZFRlbXBsYXRlQ29sdW1ucz1cInJlcGVhdCgyLDFmcilcIiBncmlkR2FwPVwiMXJlbVwiIHhtbG5zOmdyaWQ9XCJzYXAudWkubGF5b3V0LmNzc2dyaWRcIiA+XG5cdFx0XHRcdFx0PG06VkJveD5cblx0XHRcdFx0XHRcdDxtOkxhYmVsIHRleHQ9XCJIb3cgdGhlIGJ1aWxkaW5nIGJsb2NrIHdhcyBjYWxsZWRcIi8+XG5cdFx0XHRcdFx0XHQ8Y29kZTpDb2RlRWRpdG9yIHR5cGU9XCJ4bWxcIiB2YWx1ZT1cIiR7YHs9IEJCRi5iYXNlNjREZWNvZGUoJyR7YnRvYSh4bWxGcmFnbWVudC5yZXBsYWNlQWxsKFwiJmd0O1wiLCBcIj5cIikpfScpIH1gfVwiIGhlaWdodD1cIjMwMHB4XCIgLz5cblx0XHRcdFx0XHQ8L206VkJveD5cblx0XHRcdFx0XHQke2FkZGl0aW9uYWxUZXh0fVxuXHRcdFx0XHQ8L2dyaWQ6Q1NTR3JpZD5cblx0XHRcdDwvbTpWQm94PmA7XG59XG5cbmNvbnN0IG15U3RvcmU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5mdW5jdGlvbiBzdG9yZVZhbHVlKHZhbHVlczogdW5rbm93bikge1xuXHRjb25zdCBwcm9wZXJ0eVVJRCA9IGAvdWlkLS0ke3VpZCgpfWA7XG5cdG15U3RvcmVbcHJvcGVydHlVSURdID0gdmFsdWVzO1xuXHRyZXR1cm4gcHJvcGVydHlVSUQ7XG59XG5cbi8qKlxuICogUGFyc2UgYW4gWE1MIHN0cmluZyBhbmQgcmV0dXJuIHRoZSBhc3NvY2lhdGVkIGRvY3VtZW50LlxuICpcbiAqIEBwYXJhbSB4bWxTdHJpbmcgVGhlIHhtbCBzdHJpbmdcbiAqIEBwYXJhbSBhZGREZWZhdWx0TmFtZXNwYWNlcyBXaGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgYWRkIGRlZmF1bHQgbmFtZXNwYWNlXG4gKiBAcmV0dXJucyBUaGUgWE1MIGRvY3VtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VYTUxTdHJpbmcoeG1sU3RyaW5nOiBzdHJpbmcsIGFkZERlZmF1bHROYW1lc3BhY2VzID0gZmFsc2UpOiBFbGVtZW50W10ge1xuXHRpZiAoYWRkRGVmYXVsdE5hbWVzcGFjZXMpIHtcblx0XHR4bWxTdHJpbmcgPSBgPHRlbXBsYXRlXG5cdFx0XHRcdFx0XHR4bWxuczp0ZW1wbGF0ZT1cImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS50ZW1wbGF0ZS8xXCJcblx0XHRcdFx0XHRcdHhtbG5zOm09XCJzYXAubVwiXG5cdFx0XHRcdFx0XHR4bWxuczptYWNyb3M9XCJzYXAuZmUubWFjcm9zXCJcblx0XHRcdFx0XHRcdHhtbG5zOmNvcmU9XCJzYXAudWkuY29yZVwiXG5cdFx0XHRcdFx0XHR4bWxuczptZGM9XCJzYXAudWkubWRjXCJcblx0XHRcdFx0XHRcdHhtbG5zOmN1c3RvbURhdGE9XCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUuQ3VzdG9tRGF0YS8xXCI+JHt4bWxTdHJpbmd9PC90ZW1wbGF0ZT5gO1xuXHR9XG5cdGNvbnN0IHhtbERvY3VtZW50ID0gRE9NUGFyc2VySW5zdGFuY2UucGFyc2VGcm9tU3RyaW5nKHhtbFN0cmluZywgXCJ0ZXh0L3htbFwiKTtcblx0bGV0IG91dHB1dCA9IHhtbERvY3VtZW50LmZpcnN0RWxlbWVudENoaWxkO1xuXHR3aGlsZSAob3V0cHV0Py5sb2NhbE5hbWUgPT09IFwidGVtcGxhdGVcIikge1xuXHRcdG91dHB1dCA9IG91dHB1dC5maXJzdEVsZW1lbnRDaGlsZDtcblx0fVxuXHRjb25zdCBjaGlsZHJlbiA9IG91dHB1dD8ucGFyZW50RWxlbWVudCA/IG91dHB1dD8ucGFyZW50RWxlbWVudC5jaGlsZHJlbiA6IFtvdXRwdXQgYXMgRWxlbWVudF07XG5cdHJldHVybiBBcnJheS5mcm9tKGNoaWxkcmVuKTtcbn1cblxuLyoqXG4gKiBFc2NhcGUgYW4gWE1MIGF0dHJpYnV0ZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBlc2NhcGUuXG4gKiBAcmV0dXJucyBUaGUgZXNjYXBlZCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZSh2YWx1ZT86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdHJldHVybiB2YWx1ZT8ucmVwbGFjZSgvJi9nLCBcIiZhbXA7XCIpLnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpLnJlcGxhY2UoL1wiL2csIFwiJnF1b3Q7XCIpLnJlcGxhY2UoLycvZywgXCImYXBvcztcIik7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckluVHJhY2VNb2RlKG91dFN0cjogc3RyaW5nKSB7XG5cdGNvbnN0IHhtbFJlc3VsdCA9IHBhcnNlWE1MU3RyaW5nKG91dFN0ciwgdHJ1ZSk7XG5cdGlmICh4bWxSZXN1bHQubGVuZ3RoID4gMCAhPT0gdW5kZWZpbmVkICYmIHhtbFJlc3VsdFswXT8ubG9jYWxOYW1lID09PSBcInBhcnNlcmVycm9yXCIpIHtcblx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSAoeG1sUmVzdWx0WzBdIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQgfHwgKHhtbFJlc3VsdFswXSBhcyBIVE1MRWxlbWVudCkuaW5uZXJIVE1MO1xuXHRcdHJldHVybiBjcmVhdGVFcnJvclhNTChbZXJyb3JNZXNzYWdlLnNwbGl0KFwiXFxuXCIpWzBdXSwgb3V0U3RyKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gb3V0U3RyO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGlzQnVpbGRpbmdCbG9ja0Jhc2UoYmI6IEJ1aWxkaW5nQmxvY2tCYXNlIHwgdW5rbm93bik6IGJiIGlzIEJ1aWxkaW5nQmxvY2tCYXNlIHtcblx0cmV0dXJuIChiYiBhcyBCdWlsZGluZ0Jsb2NrQmFzZSk/LmdldFRlbXBsYXRlICE9PSB1bmRlZmluZWQ7XG59XG5leHBvcnQgdHlwZSBYTUxQcm9jZXNzb3JUeXBlVmFsdWUgPVxuXHR8IHN0cmluZ1xuXHR8IGJvb2xlYW5cblx0fCBudW1iZXJcblx0fCB1bmRlZmluZWRcblx0fCBudWxsXG5cdHwgb2JqZWN0XG5cdHwgQnVpbGRpbmdCbG9ja0Jhc2Vcblx0fCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXHR8IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyPlxuXHR8IEFycmF5PHN0cmluZz5cblx0fCBBcnJheTxGdW5jdGlvbj5cblx0fCBGdW5jdGlvblxuXHR8IENvbnRleHQ7XG4vKipcbiAqIENyZWF0ZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGVtcGxhdGUgbGl0ZXJhbCB3aGlsZSBoYW5kbGluZyBzcGVjaWFsIG9iamVjdCBjYXNlLlxuICpcbiAqIEBwYXJhbSBzdHJpbmdzIFRoZSBzdHJpbmcgcGFydHMgb2YgdGhlIHRlbXBsYXRlIGxpdGVyYWxcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBwYXJ0IG9mIHRoZSB0ZW1wbGF0ZSBsaXRlcmFsXG4gKiBAcmV0dXJucyBUaGUgWE1MIHN0cmluZyBkb2N1bWVudCByZXByZXNlbnRpbmcgdGhlIHN0cmluZyB0aGF0IHdhcyB1c2VkLlxuICovXG5leHBvcnQgY29uc3QgeG1sID0gKHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5LCAuLi52YWx1ZXM6IFhNTFByb2Nlc3NvclR5cGVWYWx1ZVtdKSA9PiB7XG5cdGxldCBvdXRTdHIgPSBcIlwiO1xuXHRsZXQgaTtcblx0Zm9yIChpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuXHRcdG91dFN0ciArPSBzdHJpbmdzW2ldO1xuXG5cdFx0Ly8gSGFuZGxlIHRoZSBkaWZmZXJlbnQgY2FzZSBvZiBvYmplY3QsIGlmIGl0J3MgYW4gYXJyYXkgd2Ugam9pbiB0aGVtLCBpZiBpdCdzIGEgYmluZGluZyBleHByZXNzaW9uIChkZXRlcm1pbmVkIGJ5IF90eXBlKSB0aGVuIHdlIGNvbXBpbGUgaXQuXG5cdFx0Y29uc3QgdmFsdWUgPSB2YWx1ZXNbaV07XG5cblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMCAmJiB0eXBlb2YgdmFsdWVbMF0gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdG91dFN0ciArPSB2YWx1ZS5mbGF0KDUpLmpvaW4oXCJcXG5cIikudHJpbSgpO1xuXHRcdH0gZWxzZSBpZiAoaXNGdW5jdGlvbkFycmF5KHZhbHVlKSkge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlLm1hcCgodmFsdWVmbikgPT4gdmFsdWVmbigpKS5qb2luKFwiXFxuXCIpO1xuXHRcdH0gZWxzZSBpZiAoaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24odmFsdWUpKSB7XG5cdFx0XHRjb25zdCBjb21waWxlZEV4cHJlc3Npb24gPSBjb21waWxlRXhwcmVzc2lvbih2YWx1ZSk7XG5cdFx0XHRvdXRTdHIgKz0gZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUoY29tcGlsZWRFeHByZXNzaW9uKTtcblx0XHR9IGVsc2UgaWYgKGlzQnVpbGRpbmdCbG9ja0Jhc2UodmFsdWUpKSB7XG5cdFx0XHRvdXRTdHIgKz0gdmFsdWUuZ2V0VGVtcGxhdGUhKCk7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHRcdG91dFN0ciArPSBcInt0aGlzPnVuZGVmaW5lZFZhbHVlfVwiO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdG91dFN0ciArPSB2YWx1ZSgpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsKSB7XG5cdFx0XHRpZiAoaXNDb250ZXh0KHZhbHVlKSkge1xuXHRcdFx0XHRvdXRTdHIgKz0gdmFsdWUuZ2V0UGF0aCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlVSWQgPSBzdG9yZVZhbHVlKHZhbHVlKTtcblx0XHRcdFx0b3V0U3RyICs9IGAke3Byb3BlcnR5VUlkfWA7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgIXZhbHVlLnN0YXJ0c1dpdGgoXCI8XCIpICYmICF2YWx1ZS5zdGFydHNXaXRoKFwiJmx0O1wiKSkge1xuXHRcdFx0b3V0U3RyICs9IGVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKHZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlO1xuXHRcdH1cblx0fVxuXHRvdXRTdHIgKz0gc3RyaW5nc1tpXTtcblx0b3V0U3RyID0gb3V0U3RyLnRyaW0oKTtcblx0aWYgKGlzVHJhY2VNb2RlKSB7XG5cdFx0cmV0dXJuIHJlbmRlckluVHJhY2VNb2RlKG91dFN0cik7XG5cdH1cblx0cmV0dXJuIG91dFN0cjtcbn07XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7RUF3S08sZ0JBQWdCQSxNQUFNLEVBQUVDLElBQUksRUFBRUMsS0FBSyxFQUFFO0lBQzNDLElBQUksT0FBT0YsTUFBTSxpQkFBaUIsS0FBSyxVQUFVLEVBQUU7TUFDbEQsSUFBSUcsUUFBUSxHQUFHSCxNQUFNLGlCQUFpQixFQUFFO1FBQUVJLElBQUk7UUFBRUMsSUFBSTtRQUFFQyxNQUFNO01BQzVELFNBQVNDLE1BQU0sQ0FBQ0MsTUFBTSxFQUFFO1FBQ3ZCLElBQUk7VUFDSCxPQUFPLENBQUMsQ0FBQ0osSUFBSSxHQUFHRCxRQUFRLENBQUNNLElBQUksRUFBRSxFQUFFQyxJQUFJLEtBQUssQ0FBQ1IsS0FBSyxJQUFJLENBQUNBLEtBQUssRUFBRSxDQUFDLEVBQUU7WUFDOURNLE1BQU0sR0FBR1AsSUFBSSxDQUFDRyxJQUFJLENBQUNPLEtBQUssQ0FBQztZQUN6QixJQUFJSCxNQUFNLElBQUlBLE1BQU0sQ0FBQ0ksSUFBSSxFQUFFO2NBQzFCLElBQUksZUFBZUosTUFBTSxDQUFDLEVBQUU7Z0JBQzNCQSxNQUFNLEdBQUdBLE1BQU0sQ0FBQ0ssQ0FBQztjQUNsQixDQUFDLE1BQU07Z0JBQ05MLE1BQU0sQ0FBQ0ksSUFBSSxDQUFDTCxNQUFNLEVBQUVELE1BQU0sS0FBS0EsTUFBTSxHQUFHLFFBQVFRLElBQUksQ0FBQyxJQUFJLEVBQUVULElBQUksR0FBRyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkY7Y0FDRDtZQUNEO1VBQ0Q7VUFDQSxJQUFJQSxJQUFJLEVBQUU7WUFDVCxRQUFRQSxJQUFJ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
|